ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzhlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBlbXB0eSBmaWxlIGlzIGhlcmUgc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBvcHRpbWl6aW5nIHRoZSBBbmRyb2lkIGJ1aWxkCisjIFBsZWFzZSBrZWVwIGl0IHRoZXJlLCBhbmQgZW1wdHksIHRoYW5rcy4KZGlmZiAtLWdpdCBhL0NNYWtlTGlzdHMudHh0IGIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhMzEwYQotLS0gL2Rldi9udWxsCisrKyBiL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzc4IEBACitwcm9qZWN0KEVpZ2VuKQorCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42LjIpCisKKyMgZ3VhcmQgYWdhaW5zdCBpbi1zb3VyY2UgYnVpbGRzCisKK2lmKCR7Q01BS0VfU09VUkNFX0RJUn0gU1RSRVFVQUwgJHtDTUFLRV9CSU5BUllfRElSfSkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiSW4tc291cmNlIGJ1aWxkcyBub3QgYWxsb3dlZC4gUGxlYXNlIG1ha2UgYSBuZXcgZGlyZWN0b3J5IChjYWxsZWQgYSBidWlsZCBkaXJlY3RvcnkpIGFuZCBydW4gQ01ha2UgZnJvbSB0aGVyZS4gWW91IG1heSBuZWVkIHRvIHJlbW92ZSBDTWFrZUNhY2hlLnR4dC4gIikKK2VuZGlmKCkKKworIyBndWFyZCBhZ2FpbnN0IGJhZCBidWlsZC10eXBlIHN0cmluZ3MKKworaWYgKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorICBzZXQoQ01BS0VfQlVJTERfVFlQRSAiUmVsZWFzZSIpCitlbmRpZigpCisKK3N0cmluZyhUT0xPV0VSICIke0NNQUtFX0JVSUxEX1RZUEV9IiBjbWFrZV9idWlsZF90eXBlX3RvbG93ZXIpCitpZiggICAgTk9UIGNtYWtlX2J1aWxkX3R5cGVfdG9sb3dlciBTVFJFUVVBTCAiZGVidWciCisgICBBTkQgTk9UIGNtYWtlX2J1aWxkX3R5cGVfdG9sb3dlciBTVFJFUVVBTCAicmVsZWFzZSIKKyAgIEFORCBOT1QgY21ha2VfYnVpbGRfdHlwZV90b2xvd2VyIFNUUkVRVUFMICJyZWx3aXRoZGViaW5mbyIpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIlVua25vd24gYnVpbGQgdHlwZSBcIiR7Q01BS0VfQlVJTERfVFlQRX1cIi4gQWxsb3dlZCB2YWx1ZXMgYXJlIERlYnVnLCBSZWxlYXNlLCBSZWxXaXRoRGViSW5mbyAoY2FzZS1pbnNlbnNpdGl2ZSkuIikKK2VuZGlmKCkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyByZXRyaWV2ZSB2ZXJzaW9uIGluZm9tYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgYXV0b21hdGljYWxseSBwYXJzZSB0aGUgdmVyc2lvbiBudW1iZXIKK2ZpbGUoUkVBRCAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L0VpZ2VuL3NyYy9Db3JlL3V0aWwvTWFjcm9zLmgiIF9laWdlbl92ZXJzaW9uX2hlYWRlcikKK3N0cmluZyhSRUdFWCBNQVRDSCAiZGVmaW5lWyBcdF0rRUlHRU5fV09STERfVkVSU0lPTlsgXHRdKyhbMC05XSspIiBfZWlnZW5fd29ybGRfdmVyc2lvbl9tYXRjaCAiJHtfZWlnZW5fdmVyc2lvbl9oZWFkZXJ9IikKK3NldChFSUdFTl9XT1JMRF9WRVJTSU9OICIke0NNQUtFX01BVENIXzF9IikKK3N0cmluZyhSRUdFWCBNQVRDSCAiZGVmaW5lWyBcdF0rRUlHRU5fTUFKT1JfVkVSU0lPTlsgXHRdKyhbMC05XSspIiBfZWlnZW5fbWFqb3JfdmVyc2lvbl9tYXRjaCAiJHtfZWlnZW5fdmVyc2lvbl9oZWFkZXJ9IikKK3NldChFSUdFTl9NQUpPUl9WRVJTSU9OICIke0NNQUtFX01BVENIXzF9IikKK3N0cmluZyhSRUdFWCBNQVRDSCAiZGVmaW5lWyBcdF0rRUlHRU5fTUlOT1JfVkVSU0lPTlsgXHRdKyhbMC05XSspIiBfZWlnZW5fbWlub3JfdmVyc2lvbl9tYXRjaCAiJHtfZWlnZW5fdmVyc2lvbl9oZWFkZXJ9IikKK3NldChFSUdFTl9NSU5PUl9WRVJTSU9OICIke0NNQUtFX01BVENIXzF9IikKK3NldChFSUdFTl9WRVJTSU9OX05VTUJFUiAke0VJR0VOX1dPUkxEX1ZFUlNJT059LiR7RUlHRU5fTUFKT1JfVkVSU0lPTn0uJHtFSUdFTl9NSU5PUl9WRVJTSU9OfSkKKworIyBpZiB0aGUgbWVyY3VyaWFsIHByb2dyYW0gaXMgYWJzZW50LCB0aGlzIHdpbGwgbGVhdmUgdGhlIEVJR0VOX0hHX0NIQU5HRVNFVCBzdHJpbmcgZW1wdHksCisjIGJ1dCB3b24ndCBzdG9wIENNYWtlLgorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgaGcgdGlwIC1SICR7Q01BS0VfU09VUkNFX0RJUn0gT1VUUFVUX1ZBUklBQkxFIEVJR0VOX0hHVElQX09VVFBVVCkKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EIGhnIGJyYW5jaCAtUiAke0NNQUtFX1NPVVJDRV9ESVJ9IE9VVFBVVF9WQVJJQUJMRSBFSUdFTl9CUkFOQ0hfT1VUUFVUKQorCisjIGlmIHRoaXMgaXMgdGhlIGRlZmF1bHQgKGFrYSBkZXZlbG9wbWVudCkgYnJhbmNoLCBleHRyYWN0IHRoZSBtZXJjdXJpYWwgY2hhbmdlc2V0IG51bWJlciBmcm9tIHRoZSBoZyB0aXAgb3V0cHV0Li4uCitpZihFSUdFTl9CUkFOQ0hfT1VUUFVUIE1BVENIRVMgImRlZmF1bHQiKQorc3RyaW5nKFJFR0VYIE1BVENIICJeY2hhbmdlc2V0OiAqWzAtOV0qOihbMC05O2EtZl0rKS4qIiBFSUdFTl9IR19DSEFOR0VTRVRfTUFUQ0ggIiR7RUlHRU5fSEdUSVBfT1VUUFVUfSIpCitzZXQoRUlHRU5fSEdfQ0hBTkdFU0VUICIke0NNQUtFX01BVENIXzF9IikKK2VuZGlmKEVJR0VOX0JSQU5DSF9PVVRQVVQgTUFUQ0hFUyAiZGVmYXVsdCIpCisjLi4uYW5kIHNob3cgaXQgbmV4dCB0byB0aGUgdmVyc2lvbiBudW1iZXIKK2lmKEVJR0VOX0hHX0NIQU5HRVNFVCkKKyAgc2V0KEVJR0VOX1ZFUlNJT04gIiR7RUlHRU5fVkVSU0lPTl9OVU1CRVJ9IChtZXJjdXJpYWwgY2hhbmdlc2V0ICR7RUlHRU5fSEdfQ0hBTkdFU0VUfSkiKQorZWxzZShFSUdFTl9IR19DSEFOR0VTRVQpCisgIHNldChFSUdFTl9WRVJTSU9OICIke0VJR0VOX1ZFUlNJT05fTlVNQkVSfSIpCitlbmRpZihFSUdFTl9IR19DSEFOR0VTRVQpCisKKworaW5jbHVkZShDaGVja0NYWENvbXBpbGVyRmxhZykKKworc2V0KENNQUtFX01PRFVMRV9QQVRIICR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jbWFrZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmluZCBob3cgdG8gbGluayB0byB0aGUgc3RhbmRhcmQgbGlicmFyaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmaW5kX3BhY2thZ2UoU3RhbmRhcmRNYXRoTGlicmFyeSkKKworCitzZXQoRUlHRU5fVEVTVF9DVVNUT01fTElOS0VSX0ZMQUdTICAiIiBDQUNIRSBTVFJJTkcgIkFkZGl0aW9uYWwgbGlua2VyIGZsYWdzIHdoZW4gbGlua2luZyB1bml0IHRlc3RzLiIpCitzZXQoRUlHRU5fVEVTVF9DVVNUT01fQ1hYX0ZMQUdTICAgICAiIiBDQUNIRSBTVFJJTkcgIkFkZGl0aW9uYWwgY29tcGlsZXIgZmxhZ3Mgd2hlbiBjb21waWxpbmcgdW5pdCB0ZXN0cy4iKQorCitzZXQoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8gIiIpCisKK2lmKE5PVCBTVEFOREFSRF9NQVRIX0xJQlJBUllfRk9VTkQpCisKKyAgbWVzc2FnZShGQVRBTF9FUlJPUgorICAgICJDYW4ndCBsaW5rIHRvIHRoZSBzdGFuZGFyZCBtYXRoIGxpYnJhcnkuIFBsZWFzZSByZXBvcnQgdG8gdGhlIEVpZ2VuIGRldmVsb3BlcnMsIHRlbGxpbmcgdGhlbSBhYm91dCB5b3VyIHBsYXRmb3JtLiIpCisKK2Vsc2UoKQorCisgIGlmKEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPKQorICAgIHNldChFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UTyAiJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30gJHtTVEFOREFSRF9NQVRIX0xJQlJBUll9IikKKyAgZWxzZSgpCisgICAgc2V0KEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPICIke1NUQU5EQVJEX01BVEhfTElCUkFSWX0iKQorICBlbmRpZigpCisKK2VuZGlmKCkKKworaWYoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8pCisgIG1lc3NhZ2UoU1RBVFVTICJTdGFuZGFyZCBsaWJyYXJpZXMgdG8gbGluayB0byBleHBsaWNpdGx5OiAke0VJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPfSIpCitlbHNlKCkKKyAgbWVzc2FnZShTVEFUVVMgIlN0YW5kYXJkIGxpYnJhcmllcyB0byBsaW5rIHRvIGV4cGxpY2l0bHk6IG5vbmUiKQorZW5kaWYoKQorCitvcHRpb24oRUlHRU5fQlVJTERfQlRMICJCdWlsZCBiZW5jaG1hcmsgc3VpdGUiIE9GRikKK2lmKE5PVCBXSU4zMikKKyAgb3B0aW9uKEVJR0VOX0JVSUxEX1BLR0NPTkZJRyAiQnVpbGQgcGtnLWNvbmZpZyAucGMgZmlsZSBmb3IgRWlnZW4iIE9OKQorZW5kaWYoTk9UIFdJTjMyKQorCitzZXQoQ01BS0VfSU5DTFVERV9DVVJSRU5UX0RJUiBPTikKKworb3B0aW9uKEVJR0VOX1NQTElUX0xBUkdFX1RFU1RTICJTcGxpdCBsYXJnZSB0ZXN0cyBpbnRvIHNtYWxsZXIgZXhlY3V0YWJsZXMiIE9OKQorCitvcHRpb24oRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IgIlVzZSByb3ctbWFqb3IgYXMgZGVmYXVsdCBtYXRyaXggc3RvcmFnZSBvcmRlciIgT0ZGKQoraWYoRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUiIpCitlbmRpZigpCisKK2FkZF9kZWZpbml0aW9ucygiLURFSUdFTl9QRVJNQU5FTlRMWV9ESVNBQkxFX1NUVVBJRF9XQVJOSU5HUyIpCisKK3NldChFSUdFTl9URVNUX01BWF9TSVpFICIzMjAiIENBQ0hFIFNUUklORyAiTWF4aW1hbCBtYXRyaXgvdmVjdG9yIHNpemUsIGRlZmF1bHQgaXMgMzIwIikKKworaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLVdub24tdmlydHVhbC1kdG9yIC1Xbm8tbG9uZy1sb25nIC1hbnNpIC1XdW5kZWYgLVdjYXN0LWFsaWduIC1XY2hhci1zdWJzY3JpcHRzIC1XYWxsIC1XIC1XcG9pbnRlci1hcml0aCAtV3dyaXRlLXN0cmluZ3MgLVdmb3JtYXQtc2VjdXJpdHkgLWZleGNlcHRpb25zIC1mbm8tY2hlY2stbmV3IC1mbm8tY29tbW9uIC1mc3RyaWN0LWFsaWFzaW5nIikKKyAgc2V0KENNQUtFX0NYWF9GTEFHU19ERUJVRyAiLWczIikKKyAgc2V0KENNQUtFX0NYWF9GTEFHU19SRUxFQVNFICItZzAgLU8yIikKKworICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygiLVduby12YXJpYWRpYy1tYWNyb3MiIENPTVBJTEVSX1NVUFBPUlRfV05PVkFSSUFESUNNQUNSTykKKyAgaWYoQ09NUElMRVJfU1VQUE9SVF9XTk9WQVJJQURJQ01BQ1JPKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtV25vLXZhcmlhZGljLW1hY3JvcyIpCisgIGVuZGlmKCkKKworICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygiLVdleHRyYSIgQ09NUElMRVJfU1VQUE9SVF9XRVhUUkEpCisgIGlmKENPTVBJTEVSX1NVUFBPUlRfV0VYVFJBKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtV2V4dHJhIikKKyAgZW5kaWYoKQorCisgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtcGVkYW50aWMiKQorCisgIG9wdGlvbihFSUdFTl9URVNUX1NTRTIgIkVuYWJsZS9EaXNhYmxlIFNTRTIgaW4gdGVzdHMvZXhhbXBsZXMiIE9GRikKKyAgaWYoRUlHRU5fVEVTVF9TU0UyKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbXNzZTIiKQorICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBTU0UyIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZW5kaWYoKQorCisgIG9wdGlvbihFSUdFTl9URVNUX1NTRTMgIkVuYWJsZS9EaXNhYmxlIFNTRTMgaW4gdGVzdHMvZXhhbXBsZXMiIE9GRikKKyAgaWYoRUlHRU5fVEVTVF9TU0UzKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbXNzZTMiKQorICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBTU0UzIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZW5kaWYoKQorCisgIG9wdGlvbihFSUdFTl9URVNUX1NTU0UzICJFbmFibGUvRGlzYWJsZSBTU1NFMyBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorICBpZihFSUdFTl9URVNUX1NTU0UzKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbXNzc2UzIikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRW5hYmxpbmcgU1NTRTMgaW4gdGVzdHMvZXhhbXBsZXMiKQorICBlbmRpZigpCisKKyAgb3B0aW9uKEVJR0VOX1RFU1RfU1NFNF8xICJFbmFibGUvRGlzYWJsZSBTU0U0LjEgaW4gdGVzdHMvZXhhbXBsZXMiIE9GRikKKyAgaWYoRUlHRU5fVEVTVF9TU0U0XzEpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1tc3NlNC4xIikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRW5hYmxpbmcgU1NFNC4xIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZW5kaWYoKQorCisgIG9wdGlvbihFSUdFTl9URVNUX1NTRTRfMiAiRW5hYmxlL0Rpc2FibGUgU1NFNC4yIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCisgIGlmKEVJR0VOX1RFU1RfU1NFNF8yKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbXNzZTQuMiIpCisgICAgbWVzc2FnZShTVEFUVVMgIkVuYWJsaW5nIFNTRTQuMiBpbiB0ZXN0cy9leGFtcGxlcyIpCisgIGVuZGlmKCkKKworICBvcHRpb24oRUlHRU5fVEVTVF9BTFRJVkVDICJFbmFibGUvRGlzYWJsZSBBbHRpVmVjIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCisgIGlmKEVJR0VOX1RFU1RfQUxUSVZFQykKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLW1hbHRpdmVjIC1tYWJpPWFsdGl2ZWMiKQorICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBBbHRpVmVjIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZW5kaWYoKQorCisgIG9wdGlvbihFSUdFTl9URVNUX05FT04gIkVuYWJsZS9EaXNhYmxlIE5lb24gaW4gdGVzdHMvZXhhbXBsZXMiIE9GRikKKyAgaWYoRUlHRU5fVEVTVF9ORU9OKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbWZwdT1uZW9uIC1tY3B1PWNvcnRleC1hOCIpCisgICAgbWVzc2FnZShTVEFUVVMgIkVuYWJsaW5nIE5FT04gaW4gdGVzdHMvZXhhbXBsZXMiKQorICBlbmRpZigpCisKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoIi1mb3Blbm1wIiBDT01QSUxFUl9TVVBQT1JUX09QRU5NUCkKKyAgaWYoQ09NUElMRVJfU1VQUE9SVF9PUEVOTVApCisgICAgb3B0aW9uKEVJR0VOX1RFU1RfT1BFTk1QICJFbmFibGUvRGlzYWJsZSBPcGVuTVAgaW4gdGVzdHMvZXhhbXBsZXMiIE9GRikKKyAgICBpZihFSUdFTl9URVNUX09QRU5NUCkKKyAgICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtZm9wZW5tcCIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiRW5hYmxpbmcgT3Blbk1QIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorCitpZihNU1ZDKQorICAjIEM0MTI3IC0gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAorICAjIEM0NzE0IC0gbWFya2VkIGFzIF9fZm9yY2VpbmxpbmUgbm90IGlubGluZWQgKEkgZmFpbGVkIHRvIGRlYWN0aXZhdGUgaXQgc2VsZWN0aXZlbHkpCisgICMgICAgICAgICBXZSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgaW4gdGhlIHVuaXQgdGVzdHMgc2luY2UgaXQgaXMgY2xlYXIgdGhhdCBpdCBvY2N1cnMKKyAgIyAgICAgICAgIGJlY2F1c2Ugd2UgYXJlIG9mdGVudGltZXMgcmV0dXJuaW5nIG9iamVjdHMgdGhhdCBoYXZlIGEgZGVzdHJ1Y3RvciBvciBtYXkKKyAgIyAgICAgICAgIHRocm93IGV4Y2VwdGlvbnMgLSBpbiBwYXJ0aWN1bGFyIGluIHRoZSB1bml0IHRlc3RzIHdlIGFyZSB0aHJvd2luZyBleHRyYSBtYW55CisgICMgICAgICAgICBleGNlcHRpb25zIHRvIGNvdmVyIGluZGV4aW5nIGVycm9ycy4KKyAgIyBDNDUwNSAtIHVucmVmZXJlbmNlZCBsb2NhbCBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkIChpbXBvc3NpYmxlIHRvIGRlYWN0aXZlIHNlbGVjdGl2ZWx5KQorICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gL0VIc2MgL3dkNDEyNyAvd2Q0NTA1IC93ZDQ3MTQiKQorCisgICMgcmVwbGFjZSBhbGwgL1d4IGJ5IC9XNAorICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiL1dbMC05XSIgIi9XNCIgQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30iKQorCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKCIvb3Blbm1wIiBDT01QSUxFUl9TVVBQT1JUX09QRU5NUCkKKyAgaWYoQ09NUElMRVJfU1VQUE9SVF9PUEVOTVApCisgICAgb3B0aW9uKEVJR0VOX1RFU1RfT1BFTk1QICJFbmFibGUvRGlzYWJsZSBPcGVuTVAgaW4gdGVzdHMvZXhhbXBsZXMiIE9GRikKKyAgICBpZihFSUdFTl9URVNUX09QRU5NUCkKKyAgICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAvb3Blbm1wIikKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJFbmFibGluZyBPcGVuTVAgaW4gdGVzdHMvZXhhbXBsZXMiKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorCisgIG9wdGlvbihFSUdFTl9URVNUX1NTRTIgIkVuYWJsZS9EaXNhYmxlIFNTRTIgaW4gdGVzdHMvZXhhbXBsZXMiIE9GRikKKyAgaWYoRUlHRU5fVEVTVF9TU0UyKQorICAgIGlmKE5PVCBDTUFLRV9DTF82NCkKKyAgICAgICMgYXJjaCBpcyBub3Qgc3VwcG9ydGVkIG9uIDY0IGJpdCBzeXN0ZW1zLCBTU0UgaXMgZW5hYmxlZCBhdXRvbWF0aWNhbGx5LgorICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC9hcmNoOlNTRTIiKQorICAgIGVuZGlmKE5PVCBDTUFLRV9DTF82NCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiRW5hYmxpbmcgU1NFMiBpbiB0ZXN0cy9leGFtcGxlcyIpCisgIGVuZGlmKEVJR0VOX1RFU1RfU1NFMikKK2VuZGlmKE1TVkMpCisKK29wdGlvbihFSUdFTl9URVNUX05PX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04gIkRpc2FibGUgZXhwbGljaXQgdmVjdG9yaXphdGlvbiBpbiB0ZXN0cy9leGFtcGxlcyIgT0ZGKQorb3B0aW9uKEVJR0VOX1RFU1RfWDg3ICJGb3JjZSB1c2luZyBYODcgaW5zdHJ1Y3Rpb25zLiBJbXBsaWVzIG5vIHZlY3Rvcml6YXRpb24uIiBPRkYpCitvcHRpb24oRUlHRU5fVEVTVF8zMkJJVCAiRm9yY2UgZ2VuZXJhdGluZyAzMmJpdCBjb2RlLiIgT0ZGKQorCitpZihFSUdFTl9URVNUX1g4NykKKyAgc2V0KEVJR0VOX1RFU1RfTk9fRVhQTElDSVRfVkVDVE9SSVpBVElPTiBPTikKKyAgaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbWZwbWF0aD0zODciKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGb3JjaW5nIHVzZSBvZiB4ODcgaW5zdHJ1Y3Rpb25zIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZWxzZSgpCisgICAgbWVzc2FnZShTVEFUVVMgIkVJR0VOX1RFU1RfWDg3IGlnbm9yZWQgb24geW91ciBjb21waWxlciIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoRUlHRU5fVEVTVF8zMkJJVCkKKyAgaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtbTMyIikKKyAgICBtZXNzYWdlKFNUQVRVUyAiRm9yY2luZyBnZW5lcmF0aW9uIG9mIDMyLWJpdCBjb2RlIGluIHRlc3RzL2V4YW1wbGVzIikKKyAgZWxzZSgpCisgICAgbWVzc2FnZShTVEFUVVMgIkVJR0VOX1RFU1RfMzJCSVQgaWdub3JlZCBvbiB5b3VyIGNvbXBpbGVyIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCitpZihFSUdFTl9URVNUX05PX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04pCisgIGFkZF9kZWZpbml0aW9ucygtREVJR0VOX0RPTlRfVkVDVE9SSVpFPTEpCisgIG1lc3NhZ2UoU1RBVFVTICJEaXNhYmxpbmcgdmVjdG9yaXphdGlvbiBpbiB0ZXN0cy9leGFtcGxlcyIpCitlbmRpZigpCisKK29wdGlvbihFSUdFTl9URVNUX05PX0VYUExJQ0lUX0FMSUdOTUVOVCAiRGlzYWJsZSBleHBsaWNpdCBhbGlnbm1lbnQgKGhlbmNlIHZlY3Rvcml6YXRpb24pIGluIHRlc3RzL2V4YW1wbGVzIiBPRkYpCitpZihFSUdFTl9URVNUX05PX0VYUExJQ0lUX0FMSUdOTUVOVCkKKyAgYWRkX2RlZmluaXRpb25zKC1ERUlHRU5fRE9OVF9BTElHTj0xKQorICBtZXNzYWdlKFNUQVRVUyAiRGlzYWJsaW5nIGFsaWdubWVudCBpbiB0ZXN0cy9leGFtcGxlcyIpCitlbmRpZigpCisKK29wdGlvbihFSUdFTl9URVNUX0MrKzB4ICJFbmFibGVzIGFsbCBDKysweCBmZWF0dXJlcy4iIE9GRikKKworaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIHRoZSB1c2VyIG1vZGlmaWFibGUgaW5zdGFsbCBwYXRoIGZvciBoZWFkZXIgZmlsZXMKK3NldChFSUdFTl9JTkNMVURFX0lOU1RBTExfRElSICR7RUlHRU5fSU5DTFVERV9JTlNUQUxMX0RJUn0gQ0FDSEUgUEFUSCAiVGhlIGRpcmVjdG9yeSB3aGVyZSB3ZSBpbnN0YWxsIHRoZSBoZWFkZXIgZmlsZXMgKG9wdGlvbmFsKSIpCisKKyMgc2V0IHRoZSBpbnRlcm5hbCBpbnN0YWxsIHBhdGggZm9yIGhlYWRlciBmaWxlcyB3aGljaCBkZXBlbmRzIG9uIHdldGhlciB0aGUgdXNlciBtb2RpZmlhYmxlCisjIEVJR0VOX0lOQ0xVREVfSU5TVEFMTF9ESVIgaGFzIGJlZW4gc2V0IGJ5IHRoZSB1c2VyIG9yIG5vdC4KK2lmKEVJR0VOX0lOQ0xVREVfSU5TVEFMTF9ESVIpCisgIHNldChJTkNMVURFX0lOU1RBTExfRElSCisgICAgJHtFSUdFTl9JTkNMVURFX0lOU1RBTExfRElSfQorICAgIENBQ0hFIElOVEVSTkFMCisgICAgIlRoZSBkaXJlY3Rvcnkgd2hlcmUgd2UgaW5zdGFsbCB0aGUgaGVhZGVyIGZpbGVzIChpbnRlcm5hbCkiCisgICkKK2Vsc2UoKQorICBzZXQoSU5DTFVERV9JTlNUQUxMX0RJUgorICAgICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9pbmNsdWRlL2VpZ2VuMyIKKyAgICBDQUNIRSBJTlRFUk5BTAorICAgICJUaGUgZGlyZWN0b3J5IHdoZXJlIHdlIGluc3RhbGwgdGhlIGhlYWRlciBmaWxlcyAoaW50ZXJuYWwpIgorICApCitlbmRpZigpCisKKyMgc2ltaWxhciB0byBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMgYnV0IGFwcGVuZCB0aGUgcHJvcGVydHkgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdAorbWFjcm8oZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSB0YXJnZXQgcHJvcCB2YWx1ZSkKKworICBnZXRfdGFyZ2V0X3Byb3BlcnR5KHByZXZpb3VzICR7dGFyZ2V0fSAke3Byb3B9KQorICAjIGlmIHRoZSBwcm9wZXJ0eSB3YXNuJ3QgcHJldmlvdXNseSBzZXQsICR7cHJldmlvdXN9IGlzIG5vdyAicHJldmlvdXMtTk9URk9VTkQiIHdoaWNoIGNtYWtlIGFsbG93cyBjYXRjaGluZyB3aXRoIHBsYWluIGlmKCkKKyAgaWYoTk9UIHByZXZpb3VzKQorICAgIHNldChwcmV2aW91cyAiIikKKyAgZW5kaWYoTk9UIHByZXZpb3VzKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHt0YXJnZXR9IFBST1BFUlRJRVMgJHtwcm9wfSAiJHtwcmV2aW91c30gJHt2YWx1ZX0iKQorZW5kbWFjcm8oZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSkKKworaW5zdGFsbChGSUxFUworICBzaWduYXR1cmVfb2ZfZWlnZW4zX21hdHJpeF9saWJyYXJ5CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0gQ09NUE9ORU5UIERldmVsCisgICkKKworaWYoRUlHRU5fQlVJTERfUEtHQ09ORklHKQorICAgIFNFVChwYXRoX3NlcGFyYXRvciAiOiIpCisgICAgU1RSSU5HKFJFUExBQ0UgJHtwYXRoX3NlcGFyYXRvcn0gIjsiIHBrZ19jb25maWdfbGliZGlyX3NlYXJjaCAiJEVOVntQS0dfQ09ORklHX0xJQkRJUn0iKQorICAgIG1lc3NhZ2UoU1RBVFVTICJzZWFyY2hpbmcgZm9yICdwa2djb25maWcnIGRpcmVjdG9yeSBpbiBQS0dfQ09ORklHX0xJQkRJUiAoICRFTlZ7UEtHX0NPTkZJR19MSUJESVJ9ICksICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L3NoYXJlLCBhbmQgJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliIikKKyAgICBGSU5EX1BBVEgocGtnX2NvbmZpZ19saWJkaXIgcGtnY29uZmlnICR7cGtnX2NvbmZpZ19saWJkaXJfc2VhcmNofSAke0NNQUtFX0lOU1RBTExfUFJFRklYfS9zaGFyZSAke0NNQUtFX0lOU1RBTExfUFJFRklYfS9saWIgJHtwa2dfY29uZmlnX2xpYmRpcl9zZWFyY2h9KQorICAgIGlmKHBrZ19jb25maWdfbGliZGlyKQorICAgICAgICBTRVQocGtnX2NvbmZpZ19pbnN0YWxsX2RpciAke3BrZ19jb25maWdfbGliZGlyfSkKKyAgICAgICAgbWVzc2FnZShTVEFUVVMgImZvdW5kICR7cGtnX2NvbmZpZ19saWJkaXJ9L3BrZ2NvbmZpZyIgKQorICAgIGVsc2UocGtnX2NvbmZpZ19saWJkaXIpCisgICAgICAgIFNFVChwa2dfY29uZmlnX2luc3RhbGxfZGlyICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L3NoYXJlKQorICAgICAgICBtZXNzYWdlKFNUQVRVUyAicGtnY29uZmlnIG5vdCBmb3VuZDsgaW5zdGFsbGluZyBpbiAke3BrZ19jb25maWdfaW5zdGFsbF9kaXJ9IiApCisgICAgZW5kaWYocGtnX2NvbmZpZ19saWJkaXIpCisKKyAgICBjb25maWd1cmVfZmlsZShlaWdlbjMucGMuaW4gZWlnZW4zLnBjKQorICAgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2VpZ2VuMy5wYworICAgICAgICBERVNUSU5BVElPTiAke3BrZ19jb25maWdfaW5zdGFsbF9kaXJ9L3BrZ2NvbmZpZworICAgICAgICApCitlbmRpZihFSUdFTl9CVUlMRF9QS0dDT05GSUcpCisKK2FkZF9zdWJkaXJlY3RvcnkoRWlnZW4pCisKK2FkZF9zdWJkaXJlY3RvcnkoZG9jIEVYQ0xVREVfRlJPTV9BTEwpCisKK2luY2x1ZGUoRWlnZW5Db25maWd1cmVUZXN0aW5nKQorIyBmaXhtZSwgbm90IHN1cmUgdGhpcyBsaW5lIGlzIHN0aWxsIG5lZWRlZDoKK2VuYWJsZV90ZXN0aW5nKCkgIyBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSByb290IENNYWtlTGlzdHMsIHNlZSBtYW4gcGFnZQorCisKK2lmKEVJR0VOX0xFQVZFX1RFU1RfSU5fQUxMX1RBUkdFVCkKKyAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KSAjIGNhbid0IGRvIEVYQ0xVREVfRlJPTV9BTEwgaGVyZSwgYnJlYWtzIENUZXN0CitlbHNlKCkKKyAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0IEVYQ0xVREVfRlJPTV9BTEwpCitlbmRpZigpCisKK2lmKEVJR0VOX0xFQVZFX1RFU1RfSU5fQUxMX1RBUkdFVCkKKyAgYWRkX3N1YmRpcmVjdG9yeShibGFzKQorICBhZGRfc3ViZGlyZWN0b3J5KGxhcGFjaykKK2Vsc2UoKQorICBhZGRfc3ViZGlyZWN0b3J5KGJsYXMgRVhDTFVERV9GUk9NX0FMTCkKKyAgYWRkX3N1YmRpcmVjdG9yeShsYXBhY2sgRVhDTFVERV9GUk9NX0FMTCkKK2VuZGlmKCkKKworYWRkX3N1YmRpcmVjdG9yeSh1bnN1cHBvcnRlZCkKKworYWRkX3N1YmRpcmVjdG9yeShkZW1vcyBFWENMVURFX0ZST01fQUxMKQorCisjIG11c3QgYmUgYWZ0ZXIgdGVzdCBhbmQgdW5zdXBwb3J0ZWQsIGZvciBjb25maWd1cmluZyBidWlsZHRlc3RzLmluCithZGRfc3ViZGlyZWN0b3J5KHNjcmlwdHMgRVhDTFVERV9GUk9NX0FMTCkKKworIyBUT0RPOiBjb25zaWRlciBhbHNvIHJlcGxhY2luZyBFSUdFTl9CVUlMRF9CVEwgYnkgYSBjdXN0b20gdGFyZ2V0ICJtYWtlIGJ0bCI/CitpZihFSUdFTl9CVUlMRF9CVEwpCisgIGFkZF9zdWJkaXJlY3RvcnkoYmVuY2gvYnRsIEVYQ0xVREVfRlJPTV9BTEwpCitlbmRpZihFSUdFTl9CVUlMRF9CVEwpCisKK2lmKE5PVCBXSU4zMikKKyAgYWRkX3N1YmRpcmVjdG9yeShiZW5jaC9zcGJlbmNoIEVYQ0xVREVfRlJPTV9BTEwpCitlbmRpZihOT1QgV0lOMzIpCisKK2VpX3Rlc3RpbmdfcHJpbnRfc3VtbWFyeSgpCisKK21lc3NhZ2UoU1RBVFVTICIiKQorbWVzc2FnZShTVEFUVVMgIkNvbmZpZ3VyZWQgRWlnZW4gJHtFSUdFTl9WRVJTSU9OX05VTUJFUn0iKQorbWVzc2FnZShTVEFUVVMgIiIpCisKK29wdGlvbihFSUdFTl9GQUlMVEVTVCAiRW5hYmxlIGZhaWx0ZXN0cy4iIE9GRikKK2lmKEVJR0VOX0ZBSUxURVNUKQorICBhZGRfc3ViZGlyZWN0b3J5KGZhaWx0ZXN0KQorZW5kaWYoKQorCitzdHJpbmcoVE9MT1dFUiAiJHtDTUFLRV9HRU5FUkFUT1J9IiBjbWFrZV9nZW5lcmF0b3JfdG9sb3dlcikKK2lmKGNtYWtlX2dlbmVyYXRvcl90b2xvd2VyIE1BVENIRVMgIm1ha2VmaWxlIikKKyAgbWVzc2FnZShTVEFUVVMgIlNvbWUgdGhpbmdzIHlvdSBjYW4gZG8gbm93OiIpCisgIG1lc3NhZ2UoU1RBVFVTICItLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCisgIG1lc3NhZ2UoU1RBVFVTICJDb21tYW5kICAgICAgIHwgICBEZXNjcmlwdGlvbiIpCisgIG1lc3NhZ2UoU1RBVFVTICItLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCisgIG1lc3NhZ2UoU1RBVFVTICJtYWtlIGluc3RhbGwgIHwgSW5zdGFsbCB0byAke0NNQUtFX0lOU1RBTExfUFJFRklYfS4gVG8gY2hhbmdlIHRoYXQ6IikKKyAgbWVzc2FnZShTVEFUVVMgIiAgICAgICAgICAgICAgfCAgICAgY21ha2UgLiAtRENNQUtFX0lOU1RBTExfUFJFRklYPXlvdXJwYXRoIikKKyAgbWVzc2FnZShTVEFUVVMgIiAgICAgICAgICAgICAgfCAgIEVpZ2VuIGhlYWRlcnMgd2lsbCB0aGVuIGJlIGluc3RhbGxlZCB0bzoiKQorICBtZXNzYWdlKFNUQVRVUyAiICAgICAgICAgICAgICB8ICAgICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IikKKyAgbWVzc2FnZShTVEFUVVMgIiAgICAgICAgICAgICAgfCAgIFRvIGluc3RhbGwgRWlnZW4gaGVhZGVycyB0byBhIHNlcGFyYXRlIGxvY2F0aW9uLCBkbzoiKQorICBtZXNzYWdlKFNUQVRVUyAiICAgICAgICAgICAgICB8ICAgICBjbWFrZSAuIC1ERUlHRU5fSU5DTFVERV9JTlNUQUxMX0RJUj15b3VycGF0aCIpCisgIG1lc3NhZ2UoU1RBVFVTICJtYWtlIGRvYyAgICAgIHwgR2VuZXJhdGUgdGhlIEFQSSBkb2N1bWVudGF0aW9uLCByZXF1aXJlcyBEb3h5Z2VuICYgTGFUZVgiKQorICBtZXNzYWdlKFNUQVRVUyAibWFrZSBjaGVjayAgICB8IEJ1aWxkIGFuZCBydW4gdGhlIHVuaXQtdGVzdHMuIFJlYWQgdGhpcyBwYWdlOiIpCisgIG1lc3NhZ2UoU1RBVFVTICIgICAgICAgICAgICAgIHwgICBodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy9pbmRleC5waHA/dGl0bGU9VGVzdHMiKQorICBtZXNzYWdlKFNUQVRVUyAibWFrZSBibGFzICAgICB8IEJ1aWxkIEJMQVMgbGlicmFyeSAobm90IHRoZSBzYW1lIHRoaW5nIGFzIEVpZ2VuKSIpCisgIG1lc3NhZ2UoU1RBVFVTICItLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCitlbHNlKCkKKyAgbWVzc2FnZShTVEFUVVMgIlRvIGJ1aWxkL3J1biB0aGUgdW5pdCB0ZXN0cywgcmVhZCB0aGlzIHBhZ2U6IikKKyAgbWVzc2FnZShTVEFUVVMgIiAgaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvaW5kZXgucGhwP3RpdGxlPVRlc3RzIikKK2VuZGlmKCkKKworbWVzc2FnZShTVEFUVVMgIiIpCmRpZmYgLS1naXQgYS9DT1BZSU5HLkJTRCBiL0NPUFlJTkcuQlNECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTcxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLkJTRApAQCAtMCwwICsxLDI2IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0NPUFlJTkcuR1BMIGIvQ09QWUlORy5HUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhOWVkMAotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcuR1BMCkBAIC0wLDAgKzEsNjc0IEBACisgICAgICAgICAgICAgICAgICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMywgMjkgSnVuZSAyMDA3CisKKyBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIDxodHRwOi8vZnNmLm9yZy8+CisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQorCisgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBhIGZyZWUsIGNvcHlsZWZ0IGxpY2Vuc2UgZm9yCitzb2Z0d2FyZSBhbmQgb3RoZXIga2luZHMgb2Ygd29ya3MuCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFuZCBvdGhlciBwcmFjdGljYWwgd29ya3MgYXJlIGRlc2lnbmVkCit0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgdGhlIHdvcmtzLiAgQnkgY29udHJhc3QsCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0bworc2hhcmUgYW5kIGNoYW5nZSBhbGwgdmVyc2lvbnMgb2YgYSBwcm9ncmFtLS10byBtYWtlIHN1cmUgaXQgcmVtYWlucyBmcmVlCitzb2Z0d2FyZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFdlLCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB1c2UgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9zdCBvZiBvdXIgc29mdHdhcmU7IGl0IGFwcGxpZXMgYWxzbyB0bworYW55IG90aGVyIHdvcmsgcmVsZWFzZWQgdGhpcyB3YXkgYnkgaXRzIGF1dGhvcnMuICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhlbSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3UKK3dhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CitmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZGVueWluZyB5b3UKK3RoZXNlIHJpZ2h0cyBvciBhc2tpbmcgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiAgVGhlcmVmb3JlLCB5b3UgaGF2ZQorY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmCit5b3UgbW9kaWZ5IGl0OiByZXNwb25zaWJpbGl0aWVzIHRvIHJlc3BlY3QgdGhlIGZyZWVkb20gb2Ygb3RoZXJzLgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IHBhc3Mgb24gdG8gdGhlIHJlY2lwaWVudHMgdGhlIHNhbWUKK2ZyZWVkb21zIHRoYXQgeW91IHJlY2VpdmVkLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlCitvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleQora25vdyB0aGVpciByaWdodHMuCisKKyAgRGV2ZWxvcGVycyB0aGF0IHVzZSB0aGUgR05VIEdQTCBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOgorKDEpIGFzc2VydCBjb3B5cmlnaHQgb24gdGhlIHNvZnR3YXJlLCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIExpY2Vuc2UKK2dpdmluZyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgaXQuCisKKyAgRm9yIHRoZSBkZXZlbG9wZXJzJyBhbmQgYXV0aG9ycycgcHJvdGVjdGlvbiwgdGhlIEdQTCBjbGVhcmx5IGV4cGxhaW5zCit0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUgc29mdHdhcmUuICBGb3IgYm90aCB1c2VycycgYW5kCithdXRob3JzJyBzYWtlLCB0aGUgR1BMIHJlcXVpcmVzIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgYmUgbWFya2VkIGFzCitjaGFuZ2VkLCBzbyB0aGF0IHRoZWlyIHByb2JsZW1zIHdpbGwgbm90IGJlIGF0dHJpYnV0ZWQgZXJyb25lb3VzbHkgdG8KK2F1dGhvcnMgb2YgcHJldmlvdXMgdmVyc2lvbnMuCisKKyAgU29tZSBkZXZpY2VzIGFyZSBkZXNpZ25lZCB0byBkZW55IHVzZXJzIGFjY2VzcyB0byBpbnN0YWxsIG9yIHJ1bgorbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIHNvZnR3YXJlIGluc2lkZSB0aGVtLCBhbHRob3VnaCB0aGUgbWFudWZhY3R1cmVyCitjYW4gZG8gc28uICBUaGlzIGlzIGZ1bmRhbWVudGFsbHkgaW5jb21wYXRpYmxlIHdpdGggdGhlIGFpbSBvZgorcHJvdGVjdGluZyB1c2VycycgZnJlZWRvbSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlLiAgVGhlIHN5c3RlbWF0aWMKK3BhdHRlcm4gb2Ygc3VjaCBhYnVzZSBvY2N1cnMgaW4gdGhlIGFyZWEgb2YgcHJvZHVjdHMgZm9yIGluZGl2aWR1YWxzIHRvCit1c2UsIHdoaWNoIGlzIHByZWNpc2VseSB3aGVyZSBpdCBpcyBtb3N0IHVuYWNjZXB0YWJsZS4gIFRoZXJlZm9yZSwgd2UKK2hhdmUgZGVzaWduZWQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBHUEwgdG8gcHJvaGliaXQgdGhlIHByYWN0aWNlIGZvciB0aG9zZQorcHJvZHVjdHMuICBJZiBzdWNoIHByb2JsZW1zIGFyaXNlIHN1YnN0YW50aWFsbHkgaW4gb3RoZXIgZG9tYWlucywgd2UKK3N0YW5kIHJlYWR5IHRvIGV4dGVuZCB0aGlzIHByb3Zpc2lvbiB0byB0aG9zZSBkb21haW5zIGluIGZ1dHVyZSB2ZXJzaW9ucworb2YgdGhlIEdQTCwgYXMgbmVlZGVkIHRvIHByb3RlY3QgdGhlIGZyZWVkb20gb2YgdXNlcnMuCisKKyAgRmluYWxseSwgZXZlcnkgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4KK1N0YXRlcyBzaG91bGQgbm90IGFsbG93IHBhdGVudHMgdG8gcmVzdHJpY3QgZGV2ZWxvcG1lbnQgYW5kIHVzZSBvZgorc29mdHdhcmUgb24gZ2VuZXJhbC1wdXJwb3NlIGNvbXB1dGVycywgYnV0IGluIHRob3NlIHRoYXQgZG8sIHdlIHdpc2ggdG8KK2F2b2lkIHRoZSBzcGVjaWFsIGRhbmdlciB0aGF0IHBhdGVudHMgYXBwbGllZCB0byBhIGZyZWUgcHJvZ3JhbSBjb3VsZAorbWFrZSBpdCBlZmZlY3RpdmVseSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgdGhlIEdQTCBhc3N1cmVzIHRoYXQKK3BhdGVudHMgY2Fubm90IGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBwcm9ncmFtIG5vbi1mcmVlLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorCisgICAgICAgICAgICAgICAgICAgICAgIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgMC4gRGVmaW5pdGlvbnMuCisKKyAgIlRoaXMgTGljZW5zZSIgcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgIkNvcHlyaWdodCIgYWxzbyBtZWFucyBjb3B5cmlnaHQtbGlrZSBsYXdzIHRoYXQgYXBwbHkgdG8gb3RoZXIga2luZHMgb2YKK3dvcmtzLCBzdWNoIGFzIHNlbWljb25kdWN0b3IgbWFza3MuCisKKyAgIlRoZSBQcm9ncmFtIiByZWZlcnMgdG8gYW55IGNvcHlyaWdodGFibGUgd29yayBsaWNlbnNlZCB1bmRlciB0aGlzCitMaWNlbnNlLiAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuICAiTGljZW5zZWVzIiBhbmQKKyJyZWNpcGllbnRzIiBtYXkgYmUgaW5kaXZpZHVhbHMgb3Igb3JnYW5pemF0aW9ucy4KKworICBUbyAibW9kaWZ5IiBhIHdvcmsgbWVhbnMgdG8gY29weSBmcm9tIG9yIGFkYXB0IGFsbCBvciBwYXJ0IG9mIHRoZSB3b3JrCitpbiBhIGZhc2hpb24gcmVxdWlyaW5nIGNvcHlyaWdodCBwZXJtaXNzaW9uLCBvdGhlciB0aGFuIHRoZSBtYWtpbmcgb2YgYW4KK2V4YWN0IGNvcHkuICBUaGUgcmVzdWx0aW5nIHdvcmsgaXMgY2FsbGVkIGEgIm1vZGlmaWVkIHZlcnNpb24iIG9mIHRoZQorZWFybGllciB3b3JrIG9yIGEgd29yayAiYmFzZWQgb24iIHRoZSBlYXJsaWVyIHdvcmsuCisKKyAgQSAiY292ZXJlZCB3b3JrIiBtZWFucyBlaXRoZXIgdGhlIHVubW9kaWZpZWQgUHJvZ3JhbSBvciBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLgorCisgIFRvICJwcm9wYWdhdGUiIGEgd29yayBtZWFucyB0byBkbyBhbnl0aGluZyB3aXRoIGl0IHRoYXQsIHdpdGhvdXQKK3Blcm1pc3Npb24sIHdvdWxkIG1ha2UgeW91IGRpcmVjdGx5IG9yIHNlY29uZGFyaWx5IGxpYWJsZSBmb3IKK2luZnJpbmdlbWVudCB1bmRlciBhcHBsaWNhYmxlIGNvcHlyaWdodCBsYXcsIGV4Y2VwdCBleGVjdXRpbmcgaXQgb24gYQorY29tcHV0ZXIgb3IgbW9kaWZ5aW5nIGEgcHJpdmF0ZSBjb3B5LiAgUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywKK2Rpc3RyaWJ1dGlvbiAod2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiksIG1ha2luZyBhdmFpbGFibGUgdG8gdGhlCitwdWJsaWMsIGFuZCBpbiBzb21lIGNvdW50cmllcyBvdGhlciBhY3Rpdml0aWVzIGFzIHdlbGwuCisKKyAgVG8gImNvbnZleSIgYSB3b3JrIG1lYW5zIGFueSBraW5kIG9mIHByb3BhZ2F0aW9uIHRoYXQgZW5hYmxlcyBvdGhlcgorcGFydGllcyB0byBtYWtlIG9yIHJlY2VpdmUgY29waWVzLiAgTWVyZSBpbnRlcmFjdGlvbiB3aXRoIGEgdXNlciB0aHJvdWdoCithIGNvbXB1dGVyIG5ldHdvcmssIHdpdGggbm8gdHJhbnNmZXIgb2YgYSBjb3B5LCBpcyBub3QgY29udmV5aW5nLgorCisgIEFuIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlIGRpc3BsYXlzICJBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzIgordG8gdGhlIGV4dGVudCB0aGF0IGl0IGluY2x1ZGVzIGEgY29udmVuaWVudCBhbmQgcHJvbWluZW50bHkgdmlzaWJsZQorZmVhdHVyZSB0aGF0ICgxKSBkaXNwbGF5cyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlLCBhbmQgKDIpCit0ZWxscyB0aGUgdXNlciB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgd29yayAoZXhjZXB0IHRvIHRoZQorZXh0ZW50IHRoYXQgd2FycmFudGllcyBhcmUgcHJvdmlkZWQpLCB0aGF0IGxpY2Vuc2VlcyBtYXkgY29udmV5IHRoZQord29yayB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYKK3RoZSBpbnRlcmZhY2UgcHJlc2VudHMgYSBsaXN0IG9mIHVzZXIgY29tbWFuZHMgb3Igb3B0aW9ucywgc3VjaCBhcyBhCittZW51LCBhIHByb21pbmVudCBpdGVtIGluIHRoZSBsaXN0IG1lZXRzIHRoaXMgY3JpdGVyaW9uLgorCisgIDEuIFNvdXJjZSBDb2RlLgorCisgIFRoZSAic291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrCitmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICAiT2JqZWN0IGNvZGUiIG1lYW5zIGFueSBub24tc291cmNlCitmb3JtIG9mIGEgd29yay4KKworICBBICJTdGFuZGFyZCBJbnRlcmZhY2UiIG1lYW5zIGFuIGludGVyZmFjZSB0aGF0IGVpdGhlciBpcyBhbiBvZmZpY2lhbAorc3RhbmRhcmQgZGVmaW5lZCBieSBhIHJlY29nbml6ZWQgc3RhbmRhcmRzIGJvZHksIG9yLCBpbiB0aGUgY2FzZSBvZgoraW50ZXJmYWNlcyBzcGVjaWZpZWQgZm9yIGEgcGFydGljdWxhciBwcm9ncmFtbWluZyBsYW5ndWFnZSwgb25lIHRoYXQKK2lzIHdpZGVseSB1c2VkIGFtb25nIGRldmVsb3BlcnMgd29ya2luZyBpbiB0aGF0IGxhbmd1YWdlLgorCisgIFRoZSAiU3lzdGVtIExpYnJhcmllcyIgb2YgYW4gZXhlY3V0YWJsZSB3b3JrIGluY2x1ZGUgYW55dGhpbmcsIG90aGVyCit0aGFuIHRoZSB3b3JrIGFzIGEgd2hvbGUsIHRoYXQgKGEpIGlzIGluY2x1ZGVkIGluIHRoZSBub3JtYWwgZm9ybSBvZgorcGFja2FnaW5nIGEgTWFqb3IgQ29tcG9uZW50LCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhhdCBNYWpvcgorQ29tcG9uZW50LCBhbmQgKGIpIHNlcnZlcyBvbmx5IHRvIGVuYWJsZSB1c2Ugb2YgdGhlIHdvcmsgd2l0aCB0aGF0CitNYWpvciBDb21wb25lbnQsIG9yIHRvIGltcGxlbWVudCBhIFN0YW5kYXJkIEludGVyZmFjZSBmb3Igd2hpY2ggYW4KK2ltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluIHNvdXJjZSBjb2RlIGZvcm0uICBBCisiTWFqb3IgQ29tcG9uZW50IiwgaW4gdGhpcyBjb250ZXh0LCBtZWFucyBhIG1ham9yIGVzc2VudGlhbCBjb21wb25lbnQKKyhrZXJuZWwsIHdpbmRvdyBzeXN0ZW0sIGFuZCBzbyBvbikgb2YgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBzeXN0ZW0KKyhpZiBhbnkpIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHdvcmsgcnVucywgb3IgYSBjb21waWxlciB1c2VkIHRvCitwcm9kdWNlIHRoZSB3b3JrLCBvciBhbiBvYmplY3QgY29kZSBpbnRlcnByZXRlciB1c2VkIHRvIHJ1biBpdC4KKworICBUaGUgIkNvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsCit0aGUgc291cmNlIGNvZGUgbmVlZGVkIHRvIGdlbmVyYXRlLCBpbnN0YWxsLCBhbmQgKGZvciBhbiBleGVjdXRhYmxlCit3b3JrKSBydW4gdGhlIG9iamVjdCBjb2RlIGFuZCB0byBtb2RpZnkgdGhlIHdvcmssIGluY2x1ZGluZyBzY3JpcHRzIHRvCitjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuICBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MKK1N5c3RlbSBMaWJyYXJpZXMsIG9yIGdlbmVyYWwtcHVycG9zZSB0b29scyBvciBnZW5lcmFsbHkgYXZhaWxhYmxlIGZyZWUKK3Byb2dyYW1zIHdoaWNoIGFyZSB1c2VkIHVubW9kaWZpZWQgaW4gcGVyZm9ybWluZyB0aG9zZSBhY3Rpdml0aWVzIGJ1dAord2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiAgRm9yIGV4YW1wbGUsIENvcnJlc3BvbmRpbmcgU291cmNlCitpbmNsdWRlcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcyBhc3NvY2lhdGVkIHdpdGggc291cmNlIGZpbGVzIGZvcgordGhlIHdvcmssIGFuZCB0aGUgc291cmNlIGNvZGUgZm9yIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGR5bmFtaWNhbGx5CitsaW5rZWQgc3VicHJvZ3JhbXMgdGhhdCB0aGUgd29yayBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gcmVxdWlyZSwKK3N1Y2ggYXMgYnkgaW50aW1hdGUgZGF0YSBjb21tdW5pY2F0aW9uIG9yIGNvbnRyb2wgZmxvdyBiZXR3ZWVuIHRob3NlCitzdWJwcm9ncmFtcyBhbmQgb3RoZXIgcGFydHMgb2YgdGhlIHdvcmsuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCB1c2VycworY2FuIHJlZ2VuZXJhdGUgYXV0b21hdGljYWxseSBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZSBDb3JyZXNwb25kaW5nCitTb3VyY2UuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhIHdvcmsgaW4gc291cmNlIGNvZGUgZm9ybSBpcyB0aGF0CitzYW1lIHdvcmsuCisKKyAgMi4gQmFzaWMgUGVybWlzc2lvbnMuCisKKyAgQWxsIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSBhcmUgZ3JhbnRlZCBmb3IgdGhlIHRlcm0gb2YKK2NvcHlyaWdodCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGFyZSBpcnJldm9jYWJsZSBwcm92aWRlZCB0aGUgc3RhdGVkCitjb25kaXRpb25zIGFyZSBtZXQuICBUaGlzIExpY2Vuc2UgZXhwbGljaXRseSBhZmZpcm1zIHlvdXIgdW5saW1pdGVkCitwZXJtaXNzaW9uIHRvIHJ1biB0aGUgdW5tb2RpZmllZCBQcm9ncmFtLiAgVGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgYQorY292ZXJlZCB3b3JrIGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlIG9ubHkgaWYgdGhlIG91dHB1dCwgZ2l2ZW4gaXRzCitjb250ZW50LCBjb25zdGl0dXRlcyBhIGNvdmVyZWQgd29yay4gIFRoaXMgTGljZW5zZSBhY2tub3dsZWRnZXMgeW91cgorcmlnaHRzIG9mIGZhaXIgdXNlIG9yIG90aGVyIGVxdWl2YWxlbnQsIGFzIHByb3ZpZGVkIGJ5IGNvcHlyaWdodCBsYXcuCisKKyAgWW91IG1heSBtYWtlLCBydW4gYW5kIHByb3BhZ2F0ZSBjb3ZlcmVkIHdvcmtzIHRoYXQgeW91IGRvIG5vdAorY29udmV5LCB3aXRob3V0IGNvbmRpdGlvbnMgc28gbG9uZyBhcyB5b3VyIGxpY2Vuc2Ugb3RoZXJ3aXNlIHJlbWFpbnMKK2luIGZvcmNlLiAgWW91IG1heSBjb252ZXkgY292ZXJlZCB3b3JrcyB0byBvdGhlcnMgZm9yIHRoZSBzb2xlIHB1cnBvc2UKK29mIGhhdmluZyB0aGVtIG1ha2UgbW9kaWZpY2F0aW9ucyBleGNsdXNpdmVseSBmb3IgeW91LCBvciBwcm92aWRlIHlvdQord2l0aCBmYWNpbGl0aWVzIGZvciBydW5uaW5nIHRob3NlIHdvcmtzLCBwcm92aWRlZCB0aGF0IHlvdSBjb21wbHkgd2l0aAordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBpbiBjb252ZXlpbmcgYWxsIG1hdGVyaWFsIGZvciB3aGljaCB5b3UgZG8KK25vdCBjb250cm9sIGNvcHlyaWdodC4gIFRob3NlIHRodXMgbWFraW5nIG9yIHJ1bm5pbmcgdGhlIGNvdmVyZWQgd29ya3MKK2ZvciB5b3UgbXVzdCBkbyBzbyBleGNsdXNpdmVseSBvbiB5b3VyIGJlaGFsZiwgdW5kZXIgeW91ciBkaXJlY3Rpb24KK2FuZCBjb250cm9sLCBvbiB0ZXJtcyB0aGF0IHByb2hpYml0IHRoZW0gZnJvbSBtYWtpbmcgYW55IGNvcGllcyBvZgoreW91ciBjb3B5cmlnaHRlZCBtYXRlcmlhbCBvdXRzaWRlIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHlvdS4KKworICBDb252ZXlpbmcgdW5kZXIgYW55IG90aGVyIGNpcmN1bXN0YW5jZXMgaXMgcGVybWl0dGVkIHNvbGVseSB1bmRlcgordGhlIGNvbmRpdGlvbnMgc3RhdGVkIGJlbG93LiAgU3VibGljZW5zaW5nIGlzIG5vdCBhbGxvd2VkOyBzZWN0aW9uIDEwCittYWtlcyBpdCB1bm5lY2Vzc2FyeS4KKworICAzLiBQcm90ZWN0aW5nIFVzZXJzJyBMZWdhbCBSaWdodHMgRnJvbSBBbnRpLUNpcmN1bXZlbnRpb24gTGF3LgorCisgIE5vIGNvdmVyZWQgd29yayBzaGFsbCBiZSBkZWVtZWQgcGFydCBvZiBhbiBlZmZlY3RpdmUgdGVjaG5vbG9naWNhbAorbWVhc3VyZSB1bmRlciBhbnkgYXBwbGljYWJsZSBsYXcgZnVsZmlsbGluZyBvYmxpZ2F0aW9ucyB1bmRlciBhcnRpY2xlCisxMSBvZiB0aGUgV0lQTyBjb3B5cmlnaHQgdHJlYXR5IGFkb3B0ZWQgb24gMjAgRGVjZW1iZXIgMTk5Niwgb3IKK3NpbWlsYXIgbGF3cyBwcm9oaWJpdGluZyBvciByZXN0cmljdGluZyBjaXJjdW12ZW50aW9uIG9mIHN1Y2gKK21lYXN1cmVzLgorCisgIFdoZW4geW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgeW91IHdhaXZlIGFueSBsZWdhbCBwb3dlciB0byBmb3JiaWQKK2NpcmN1bXZlbnRpb24gb2YgdGVjaG5vbG9naWNhbCBtZWFzdXJlcyB0byB0aGUgZXh0ZW50IHN1Y2ggY2lyY3VtdmVudGlvbgoraXMgZWZmZWN0ZWQgYnkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIHdpdGggcmVzcGVjdCB0bwordGhlIGNvdmVyZWQgd29yaywgYW5kIHlvdSBkaXNjbGFpbSBhbnkgaW50ZW50aW9uIHRvIGxpbWl0IG9wZXJhdGlvbiBvcgorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGFzIGEgbWVhbnMgb2YgZW5mb3JjaW5nLCBhZ2FpbnN0IHRoZSB3b3JrJ3MKK3VzZXJzLCB5b3VyIG9yIHRoaXJkIHBhcnRpZXMnIGxlZ2FsIHJpZ2h0cyB0byBmb3JiaWQgY2lyY3VtdmVudGlvbiBvZgordGVjaG5vbG9naWNhbCBtZWFzdXJlcy4KKworICA0LiBDb252ZXlpbmcgVmVyYmF0aW0gQ29waWVzLgorCisgIFlvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQorcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQKK2FwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQorbm9uLXBlcm1pc3NpdmUgdGVybXMgYWRkZWQgaW4gYWNjb3JkIHdpdGggc2VjdGlvbiA3IGFwcGx5IHRvIHRoZSBjb2RlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgb2YgdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbGwKK3JlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCisgIFlvdSBtYXkgY2hhcmdlIGFueSBwcmljZSBvciBubyBwcmljZSBmb3IgZWFjaCBjb3B5IHRoYXQgeW91IGNvbnZleSwKK2FuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuCisKKyAgNS4gQ29udmV5aW5nIE1vZGlmaWVkIFNvdXJjZSBWZXJzaW9ucy4KKworICBZb3UgbWF5IGNvbnZleSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIG9yIHRoZSBtb2RpZmljYXRpb25zIHRvCitwcm9kdWNlIGl0IGZyb20gdGhlIFByb2dyYW0sIGluIHRoZSBmb3JtIG9mIHNvdXJjZSBjb2RlIHVuZGVyIHRoZQordGVybXMgb2Ygc2VjdGlvbiA0LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgbW9kaWZpZWQKKyAgICBpdCwgYW5kIGdpdmluZyBhIHJlbGV2YW50IGRhdGUuCisKKyAgICBiKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCBpdCBpcworICAgIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IGNvbmRpdGlvbnMgYWRkZWQgdW5kZXIgc2VjdGlvbgorICAgIDcuICBUaGlzIHJlcXVpcmVtZW50IG1vZGlmaWVzIHRoZSByZXF1aXJlbWVudCBpbiBzZWN0aW9uIDQgdG8KKyAgICAia2VlcCBpbnRhY3QgYWxsIG5vdGljZXMiLgorCisgICAgYykgWW91IG11c3QgbGljZW5zZSB0aGUgZW50aXJlIHdvcmssIGFzIGEgd2hvbGUsIHVuZGVyIHRoaXMKKyAgICBMaWNlbnNlIHRvIGFueW9uZSB3aG8gY29tZXMgaW50byBwb3NzZXNzaW9uIG9mIGEgY29weS4gIFRoaXMKKyAgICBMaWNlbnNlIHdpbGwgdGhlcmVmb3JlIGFwcGx5LCBhbG9uZyB3aXRoIGFueSBhcHBsaWNhYmxlIHNlY3Rpb24gNworICAgIGFkZGl0aW9uYWwgdGVybXMsIHRvIHRoZSB3aG9sZSBvZiB0aGUgd29yaywgYW5kIGFsbCBpdHMgcGFydHMsCisgICAgcmVnYXJkbGVzcyBvZiBob3cgdGhleSBhcmUgcGFja2FnZWQuICBUaGlzIExpY2Vuc2UgZ2l2ZXMgbm8KKyAgICBwZXJtaXNzaW9uIHRvIGxpY2Vuc2UgdGhlIHdvcmsgaW4gYW55IG90aGVyIHdheSwgYnV0IGl0IGRvZXMgbm90CisgICAgaW52YWxpZGF0ZSBzdWNoIHBlcm1pc3Npb24gaWYgeW91IGhhdmUgc2VwYXJhdGVseSByZWNlaXZlZCBpdC4KKworICAgIGQpIElmIHRoZSB3b3JrIGhhcyBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZXMsIGVhY2ggbXVzdCBkaXNwbGF5CisgICAgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlczsgaG93ZXZlciwgaWYgdGhlIFByb2dyYW0gaGFzIGludGVyYWN0aXZlCisgICAgaW50ZXJmYWNlcyB0aGF0IGRvIG5vdCBkaXNwbGF5IEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMsIHlvdXIKKyAgICB3b3JrIG5lZWQgbm90IG1ha2UgdGhlbSBkbyBzby4KKworICBBIGNvbXBpbGF0aW9uIG9mIGEgY292ZXJlZCB3b3JrIHdpdGggb3RoZXIgc2VwYXJhdGUgYW5kIGluZGVwZW5kZW50Cit3b3Jrcywgd2hpY2ggYXJlIG5vdCBieSB0aGVpciBuYXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgY292ZXJlZCB3b3JrLAorYW5kIHdoaWNoIGFyZSBub3QgY29tYmluZWQgd2l0aCBpdCBzdWNoIGFzIHRvIGZvcm0gYSBsYXJnZXIgcHJvZ3JhbSwKK2luIG9yIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtLCBpcyBjYWxsZWQgYW4KKyJhZ2dyZWdhdGUiIGlmIHRoZSBjb21waWxhdGlvbiBhbmQgaXRzIHJlc3VsdGluZyBjb3B5cmlnaHQgYXJlIG5vdAordXNlZCB0byBsaW1pdCB0aGUgYWNjZXNzIG9yIGxlZ2FsIHJpZ2h0cyBvZiB0aGUgY29tcGlsYXRpb24ncyB1c2VycworYmV5b25kIHdoYXQgdGhlIGluZGl2aWR1YWwgd29ya3MgcGVybWl0LiAgSW5jbHVzaW9uIG9mIGEgY292ZXJlZCB3b3JrCitpbiBhbiBhZ2dyZWdhdGUgZG9lcyBub3QgY2F1c2UgdGhpcyBMaWNlbnNlIHRvIGFwcGx5IHRvIHRoZSBvdGhlcgorcGFydHMgb2YgdGhlIGFnZ3JlZ2F0ZS4KKworICA2LiBDb252ZXlpbmcgTm9uLVNvdXJjZSBGb3Jtcy4KKworICBZb3UgbWF5IGNvbnZleSBhIGNvdmVyZWQgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcworb2Ygc2VjdGlvbnMgNCBhbmQgNSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBjb252ZXkgdGhlCittYWNoaW5lLXJlYWRhYmxlIENvcnJlc3BvbmRpbmcgU291cmNlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsCitpbiBvbmUgb2YgdGhlc2Ugd2F5czoKKworICAgIGEpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKKyAgICAoaW5jbHVkaW5nIGEgcGh5c2ljYWwgZGlzdHJpYnV0aW9uIG1lZGl1bSksIGFjY29tcGFuaWVkIGJ5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZpeGVkIG9uIGEgZHVyYWJsZSBwaHlzaWNhbCBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICAgIGIpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKKyAgICAoaW5jbHVkaW5nIGEgcGh5c2ljYWwgZGlzdHJpYnV0aW9uIG1lZGl1bSksIGFjY29tcGFuaWVkIGJ5IGEKKyAgICB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUgeWVhcnMgYW5kIHZhbGlkIGZvciBhcworICAgIGxvbmcgYXMgeW91IG9mZmVyIHNwYXJlIHBhcnRzIG9yIGN1c3RvbWVyIHN1cHBvcnQgZm9yIHRoYXQgcHJvZHVjdAorICAgIG1vZGVsLCB0byBnaXZlIGFueW9uZSB3aG8gcG9zc2Vzc2VzIHRoZSBvYmplY3QgY29kZSBlaXRoZXIgKDEpIGEKKyAgICBjb3B5IG9mIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYWxsIHRoZSBzb2Z0d2FyZSBpbiB0aGUKKyAgICBwcm9kdWN0IHRoYXQgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIG9uIGEgZHVyYWJsZSBwaHlzaWNhbAorICAgIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZSwgZm9yIGEgcHJpY2Ugbm8KKyAgICBtb3JlIHRoYW4geW91ciByZWFzb25hYmxlIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHRoaXMKKyAgICBjb252ZXlpbmcgb2Ygc291cmNlLCBvciAoMikgYWNjZXNzIHRvIGNvcHkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZnJvbSBhIG5ldHdvcmsgc2VydmVyIGF0IG5vIGNoYXJnZS4KKworICAgIGMpIENvbnZleSBpbmRpdmlkdWFsIGNvcGllcyBvZiB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlCisgICAgd3JpdHRlbiBvZmZlciB0byBwcm92aWRlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoaXMKKyAgICBhbHRlcm5hdGl2ZSBpcyBhbGxvd2VkIG9ubHkgb2NjYXNpb25hbGx5IGFuZCBub25jb21tZXJjaWFsbHksIGFuZAorICAgIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBvYmplY3QgY29kZSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZAorICAgIHdpdGggc3Vic2VjdGlvbiA2Yi4KKworICAgIGQpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIGZyb20gYSBkZXNpZ25hdGVkCisgICAgcGxhY2UgKGdyYXRpcyBvciBmb3IgYSBjaGFyZ2UpLCBhbmQgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgaW4gdGhlIHNhbWUgd2F5IHRocm91Z2ggdGhlIHNhbWUgcGxhY2UgYXQgbm8KKyAgICBmdXJ0aGVyIGNoYXJnZS4gIFlvdSBuZWVkIG5vdCByZXF1aXJlIHJlY2lwaWVudHMgdG8gY29weSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4gIElmIHRoZSBwbGFjZSB0bworICAgIGNvcHkgdGhlIG9iamVjdCBjb2RlIGlzIGEgbmV0d29yayBzZXJ2ZXIsIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZQorICAgIG1heSBiZSBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgKG9wZXJhdGVkIGJ5IHlvdSBvciBhIHRoaXJkIHBhcnR5KQorICAgIHRoYXQgc3VwcG9ydHMgZXF1aXZhbGVudCBjb3B5aW5nIGZhY2lsaXRpZXMsIHByb3ZpZGVkIHlvdSBtYWludGFpbgorICAgIGNsZWFyIGRpcmVjdGlvbnMgbmV4dCB0byB0aGUgb2JqZWN0IGNvZGUgc2F5aW5nIHdoZXJlIHRvIGZpbmQgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBSZWdhcmRsZXNzIG9mIHdoYXQgc2VydmVyIGhvc3RzIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLCB5b3UgcmVtYWluIG9ibGlnYXRlZCB0byBlbnN1cmUgdGhhdCBpdCBpcworICAgIGF2YWlsYWJsZSBmb3IgYXMgbG9uZyBhcyBuZWVkZWQgdG8gc2F0aXNmeSB0aGVzZSByZXF1aXJlbWVudHMuCisKKyAgICBlKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIHVzaW5nIHBlZXItdG8tcGVlciB0cmFuc21pc3Npb24sIHByb3ZpZGVkCisgICAgeW91IGluZm9ybSBvdGhlciBwZWVycyB3aGVyZSB0aGUgb2JqZWN0IGNvZGUgYW5kIENvcnJlc3BvbmRpbmcKKyAgICBTb3VyY2Ugb2YgdGhlIHdvcmsgYXJlIGJlaW5nIG9mZmVyZWQgdG8gdGhlIGdlbmVyYWwgcHVibGljIGF0IG5vCisgICAgY2hhcmdlIHVuZGVyIHN1YnNlY3Rpb24gNmQuCisKKyAgQSBzZXBhcmFibGUgcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGNvZGUsIHdob3NlIHNvdXJjZSBjb2RlIGlzIGV4Y2x1ZGVkCitmcm9tIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBhcyBhIFN5c3RlbSBMaWJyYXJ5LCBuZWVkIG5vdCBiZQoraW5jbHVkZWQgaW4gY29udmV5aW5nIHRoZSBvYmplY3QgY29kZSB3b3JrLgorCisgIEEgIlVzZXIgUHJvZHVjdCIgaXMgZWl0aGVyICgxKSBhICJjb25zdW1lciBwcm9kdWN0Iiwgd2hpY2ggbWVhbnMgYW55Cit0YW5naWJsZSBwZXJzb25hbCBwcm9wZXJ0eSB3aGljaCBpcyBub3JtYWxseSB1c2VkIGZvciBwZXJzb25hbCwgZmFtaWx5LAorb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IgaW5jb3Jwb3JhdGlvbgoraW50byBhIGR3ZWxsaW5nLiAgSW4gZGV0ZXJtaW5pbmcgd2hldGhlciBhIHByb2R1Y3QgaXMgYSBjb25zdW1lciBwcm9kdWN0LAorZG91YnRmdWwgY2FzZXMgc2hhbGwgYmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY292ZXJhZ2UuICBGb3IgYSBwYXJ0aWN1bGFyCitwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLCAibm9ybWFsbHkgdXNlZCIgcmVmZXJzIHRvIGEKK3R5cGljYWwgb3IgY29tbW9uIHVzZSBvZiB0aGF0IGNsYXNzIG9mIHByb2R1Y3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXR1cworb2YgdGhlIHBhcnRpY3VsYXIgdXNlciBvciBvZiB0aGUgd2F5IGluIHdoaWNoIHRoZSBwYXJ0aWN1bGFyIHVzZXIKK2FjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQgdG8gdXNlLCB0aGUgcHJvZHVjdC4gIEEgcHJvZHVjdAoraXMgYSBjb25zdW1lciBwcm9kdWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJvZHVjdCBoYXMgc3Vic3RhbnRpYWwKK2NvbW1lcmNpYWwsIGluZHVzdHJpYWwgb3Igbm9uLWNvbnN1bWVyIHVzZXMsIHVubGVzcyBzdWNoIHVzZXMgcmVwcmVzZW50Cit0aGUgb25seSBzaWduaWZpY2FudCBtb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4KKworICAiSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIiBmb3IgYSBVc2VyIFByb2R1Y3QgbWVhbnMgYW55IG1ldGhvZHMsCitwcm9jZWR1cmVzLCBhdXRob3JpemF0aW9uIGtleXMsIG9yIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbGwKK2FuZCBleGVjdXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIGEgY292ZXJlZCB3b3JrIGluIHRoYXQgVXNlciBQcm9kdWN0IGZyb20KK2EgbW9kaWZpZWQgdmVyc2lvbiBvZiBpdHMgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGUgaW5mb3JtYXRpb24gbXVzdAorc3VmZmljZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGludWVkIGZ1bmN0aW9uaW5nIG9mIHRoZSBtb2RpZmllZCBvYmplY3QKK2NvZGUgaXMgaW4gbm8gY2FzZSBwcmV2ZW50ZWQgb3IgaW50ZXJmZXJlZCB3aXRoIHNvbGVseSBiZWNhdXNlCittb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZS4KKworICBJZiB5b3UgY29udmV5IGFuIG9iamVjdCBjb2RlIHdvcmsgdW5kZXIgdGhpcyBzZWN0aW9uIGluLCBvciB3aXRoLCBvcgorc3BlY2lmaWNhbGx5IGZvciB1c2UgaW4sIGEgVXNlciBQcm9kdWN0LCBhbmQgdGhlIGNvbnZleWluZyBvY2N1cnMgYXMKK3BhcnQgb2YgYSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0aGUgcmlnaHQgb2YgcG9zc2Vzc2lvbiBhbmQgdXNlIG9mIHRoZQorVXNlciBQcm9kdWN0IGlzIHRyYW5zZmVycmVkIHRvIHRoZSByZWNpcGllbnQgaW4gcGVycGV0dWl0eSBvciBmb3IgYQorZml4ZWQgdGVybSAocmVnYXJkbGVzcyBvZiBob3cgdGhlIHRyYW5zYWN0aW9uIGlzIGNoYXJhY3Rlcml6ZWQpLCB0aGUKK0NvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkIHVuZGVyIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGFjY29tcGFuaWVkCitieSB0aGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uLiAgQnV0IHRoaXMgcmVxdWlyZW1lbnQgZG9lcyBub3QgYXBwbHkKK2lmIG5laXRoZXIgeW91IG5vciBhbnkgdGhpcmQgcGFydHkgcmV0YWlucyB0aGUgYWJpbGl0eSB0byBpbnN0YWxsCittb2RpZmllZCBvYmplY3QgY29kZSBvbiB0aGUgVXNlciBQcm9kdWN0IChmb3IgZXhhbXBsZSwgdGhlIHdvcmsgaGFzCitiZWVuIGluc3RhbGxlZCBpbiBST00pLgorCisgIFRoZSByZXF1aXJlbWVudCB0byBwcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGEKK3JlcXVpcmVtZW50IHRvIGNvbnRpbnVlIHRvIHByb3ZpZGUgc3VwcG9ydCBzZXJ2aWNlLCB3YXJyYW50eSwgb3IgdXBkYXRlcworZm9yIGEgd29yayB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZCBieSB0aGUgcmVjaXBpZW50LCBvciBmb3IKK3RoZSBVc2VyIFByb2R1Y3QgaW4gd2hpY2ggaXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkLiAgQWNjZXNzIHRvIGEKK25ldHdvcmsgbWF5IGJlIGRlbmllZCB3aGVuIHRoZSBtb2RpZmljYXRpb24gaXRzZWxmIG1hdGVyaWFsbHkgYW5kCithZHZlcnNlbHkgYWZmZWN0cyB0aGUgb3BlcmF0aW9uIG9mIHRoZSBuZXR3b3JrIG9yIHZpb2xhdGVzIHRoZSBydWxlcyBhbmQKK3Byb3RvY29scyBmb3IgY29tbXVuaWNhdGlvbiBhY3Jvc3MgdGhlIG5ldHdvcmsuCisKKyAgQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQsIGFuZCBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gcHJvdmlkZWQsCitpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24gbXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIHB1YmxpY2x5Citkb2N1bWVudGVkIChhbmQgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbgorc291cmNlIGNvZGUgZm9ybSksIGFuZCBtdXN0IHJlcXVpcmUgbm8gc3BlY2lhbCBwYXNzd29yZCBvciBrZXkgZm9yCit1bnBhY2tpbmcsIHJlYWRpbmcgb3IgY29weWluZy4KKworICA3LiBBZGRpdGlvbmFsIFRlcm1zLgorCisgICJBZGRpdGlvbmFsIHBlcm1pc3Npb25zIiBhcmUgdGVybXMgdGhhdCBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlIGJ5IG1ha2luZyBleGNlcHRpb25zIGZyb20gb25lIG9yIG1vcmUgb2YgaXRzIGNvbmRpdGlvbnMuCitBZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVudGlyZSBQcm9ncmFtIHNoYWxsCitiZSB0cmVhdGVkIGFzIHRob3VnaCB0aGV5IHdlcmUgaW5jbHVkZWQgaW4gdGhpcyBMaWNlbnNlLCB0byB0aGUgZXh0ZW50Cit0aGF0IHRoZXkgYXJlIHZhbGlkIHVuZGVyIGFwcGxpY2FibGUgbGF3LiAgSWYgYWRkaXRpb25hbCBwZXJtaXNzaW9ucworYXBwbHkgb25seSB0byBwYXJ0IG9mIHRoZSBQcm9ncmFtLCB0aGF0IHBhcnQgbWF5IGJlIHVzZWQgc2VwYXJhdGVseQordW5kZXIgdGhvc2UgcGVybWlzc2lvbnMsIGJ1dCB0aGUgZW50aXJlIFByb2dyYW0gcmVtYWlucyBnb3Zlcm5lZCBieQordGhpcyBMaWNlbnNlIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorCisgIFdoZW4geW91IGNvbnZleSBhIGNvcHkgb2YgYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgYXQgeW91ciBvcHRpb24KK3JlbW92ZSBhbnkgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBmcm9tIHRoYXQgY29weSwgb3IgZnJvbSBhbnkgcGFydCBvZgoraXQuICAoQWRkaXRpb25hbCBwZXJtaXNzaW9ucyBtYXkgYmUgd3JpdHRlbiB0byByZXF1aXJlIHRoZWlyIG93bgorcmVtb3ZhbCBpbiBjZXJ0YWluIGNhc2VzIHdoZW4geW91IG1vZGlmeSB0aGUgd29yay4pICBZb3UgbWF5IHBsYWNlCithZGRpdGlvbmFsIHBlcm1pc3Npb25zIG9uIG1hdGVyaWFsLCBhZGRlZCBieSB5b3UgdG8gYSBjb3ZlcmVkIHdvcmssCitmb3Igd2hpY2ggeW91IGhhdmUgb3IgY2FuIGdpdmUgYXBwcm9wcmlhdGUgY29weXJpZ2h0IHBlcm1pc3Npb24uCisKKyAgTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCBmb3IgbWF0ZXJpYWwgeW91CithZGQgdG8gYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgKGlmIGF1dGhvcml6ZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mCit0aGF0IG1hdGVyaWFsKSBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugd2l0aCB0ZXJtczoKKworICAgIGEpIERpc2NsYWltaW5nIHdhcnJhbnR5IG9yIGxpbWl0aW5nIGxpYWJpbGl0eSBkaWZmZXJlbnRseSBmcm9tIHRoZQorICAgIHRlcm1zIG9mIHNlY3Rpb25zIDE1IGFuZCAxNiBvZiB0aGlzIExpY2Vuc2U7IG9yCisKKyAgICBiKSBSZXF1aXJpbmcgcHJlc2VydmF0aW9uIG9mIHNwZWNpZmllZCByZWFzb25hYmxlIGxlZ2FsIG5vdGljZXMgb3IKKyAgICBhdXRob3IgYXR0cmlidXRpb25zIGluIHRoYXQgbWF0ZXJpYWwgb3IgaW4gdGhlIEFwcHJvcHJpYXRlIExlZ2FsCisgICAgTm90aWNlcyBkaXNwbGF5ZWQgYnkgd29ya3MgY29udGFpbmluZyBpdDsgb3IKKworICAgIGMpIFByb2hpYml0aW5nIG1pc3JlcHJlc2VudGF0aW9uIG9mIHRoZSBvcmlnaW4gb2YgdGhhdCBtYXRlcmlhbCwgb3IKKyAgICByZXF1aXJpbmcgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIG1hdGVyaWFsIGJlIG1hcmtlZCBpbgorICAgIHJlYXNvbmFibGUgd2F5cyBhcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbjsgb3IKKworICAgIGQpIExpbWl0aW5nIHRoZSB1c2UgZm9yIHB1YmxpY2l0eSBwdXJwb3NlcyBvZiBuYW1lcyBvZiBsaWNlbnNvcnMgb3IKKyAgICBhdXRob3JzIG9mIHRoZSBtYXRlcmlhbDsgb3IKKworICAgIGUpIERlY2xpbmluZyB0byBncmFudCByaWdodHMgdW5kZXIgdHJhZGVtYXJrIGxhdyBmb3IgdXNlIG9mIHNvbWUKKyAgICB0cmFkZSBuYW1lcywgdHJhZGVtYXJrcywgb3Igc2VydmljZSBtYXJrczsgb3IKKworICAgIGYpIFJlcXVpcmluZyBpbmRlbW5pZmljYXRpb24gb2YgbGljZW5zb3JzIGFuZCBhdXRob3JzIG9mIHRoYXQKKyAgICBtYXRlcmlhbCBieSBhbnlvbmUgd2hvIGNvbnZleXMgdGhlIG1hdGVyaWFsIChvciBtb2RpZmllZCB2ZXJzaW9ucyBvZgorICAgIGl0KSB3aXRoIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIG9mIGxpYWJpbGl0eSB0byB0aGUgcmVjaXBpZW50LCBmb3IKKyAgICBhbnkgbGlhYmlsaXR5IHRoYXQgdGhlc2UgY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgZGlyZWN0bHkgaW1wb3NlIG9uCisgICAgdGhvc2UgbGljZW5zb3JzIGFuZCBhdXRob3JzLgorCisgIEFsbCBvdGhlciBub24tcGVybWlzc2l2ZSBhZGRpdGlvbmFsIHRlcm1zIGFyZSBjb25zaWRlcmVkICJmdXJ0aGVyCityZXN0cmljdGlvbnMiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiBzZWN0aW9uIDEwLiAgSWYgdGhlIFByb2dyYW0gYXMgeW91CityZWNlaXZlZCBpdCwgb3IgYW55IHBhcnQgb2YgaXQsIGNvbnRhaW5zIGEgbm90aWNlIHN0YXRpbmcgdGhhdCBpdCBpcworZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggYSB0ZXJtIHRoYXQgaXMgYSBmdXJ0aGVyCityZXN0cmljdGlvbiwgeW91IG1heSByZW1vdmUgdGhhdCB0ZXJtLiAgSWYgYSBsaWNlbnNlIGRvY3VtZW50IGNvbnRhaW5zCithIGZ1cnRoZXIgcmVzdHJpY3Rpb24gYnV0IHBlcm1pdHMgcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nIHVuZGVyIHRoaXMKK0xpY2Vuc2UsIHlvdSBtYXkgYWRkIHRvIGEgY292ZXJlZCB3b3JrIG1hdGVyaWFsIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcworb2YgdGhhdCBsaWNlbnNlIGRvY3VtZW50LCBwcm92aWRlZCB0aGF0IHRoZSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGRvZXMKK25vdCBzdXJ2aXZlIHN1Y2ggcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nLgorCisgIElmIHlvdSBhZGQgdGVybXMgdG8gYSBjb3ZlcmVkIHdvcmsgaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uLCB5b3UKK211c3QgcGxhY2UsIGluIHRoZSByZWxldmFudCBzb3VyY2UgZmlsZXMsIGEgc3RhdGVtZW50IG9mIHRoZQorYWRkaXRpb25hbCB0ZXJtcyB0aGF0IGFwcGx5IHRvIHRob3NlIGZpbGVzLCBvciBhIG5vdGljZSBpbmRpY2F0aW5nCit3aGVyZSB0byBmaW5kIHRoZSBhcHBsaWNhYmxlIHRlcm1zLgorCisgIEFkZGl0aW9uYWwgdGVybXMsIHBlcm1pc3NpdmUgb3Igbm9uLXBlcm1pc3NpdmUsIG1heSBiZSBzdGF0ZWQgaW4gdGhlCitmb3JtIG9mIGEgc2VwYXJhdGVseSB3cml0dGVuIGxpY2Vuc2UsIG9yIHN0YXRlZCBhcyBleGNlcHRpb25zOwordGhlIGFib3ZlIHJlcXVpcmVtZW50cyBhcHBseSBlaXRoZXIgd2F5LgorCisgIDguIFRlcm1pbmF0aW9uLgorCisgIFlvdSBtYXkgbm90IHByb3BhZ2F0ZSBvciBtb2RpZnkgYSBjb3ZlcmVkIHdvcmsgZXhjZXB0IGFzIGV4cHJlc3NseQorcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGl0IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyCit0aGlzIExpY2Vuc2UgKGluY2x1ZGluZyBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgdW5kZXIgdGhlIHRoaXJkCitwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuCisKKyAgSG93ZXZlciwgaWYgeW91IGNlYXNlIGFsbCB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlLCB0aGVuIHlvdXIKK2xpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKQorcHJvdmlzaW9uYWxseSwgdW5sZXNzIGFuZCB1bnRpbCB0aGUgY29weXJpZ2h0IGhvbGRlciBleHBsaWNpdGx5IGFuZAorZmluYWxseSB0ZXJtaW5hdGVzIHlvdXIgbGljZW5zZSwgYW5kIChiKSBwZXJtYW5lbnRseSwgaWYgdGhlIGNvcHlyaWdodAoraG9sZGVyIGZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMKK3ByaW9yIHRvIDYwIGRheXMgYWZ0ZXIgdGhlIGNlc3NhdGlvbi4KKworICBNb3Jlb3ZlciwgeW91ciBsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMKK3JlaW5zdGF0ZWQgcGVybWFuZW50bHkgaWYgdGhlIGNvcHlyaWdodCBob2xkZXIgbm90aWZpZXMgeW91IG9mIHRoZQordmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucywgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaGF2ZQorcmVjZWl2ZWQgbm90aWNlIG9mIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UgKGZvciBhbnkgd29yaykgZnJvbSB0aGF0Citjb3B5cmlnaHQgaG9sZGVyLCBhbmQgeW91IGN1cmUgdGhlIHZpb2xhdGlvbiBwcmlvciB0byAzMCBkYXlzIGFmdGVyCit5b3VyIHJlY2VpcHQgb2YgdGhlIG5vdGljZS4KKworICBUZXJtaW5hdGlvbiBvZiB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIHNlY3Rpb24gZG9lcyBub3QgdGVybWluYXRlIHRoZQorbGljZW5zZXMgb2YgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMgb3IgcmlnaHRzIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2UuICBJZiB5b3VyIHJpZ2h0cyBoYXZlIGJlZW4gdGVybWluYXRlZCBhbmQgbm90IHBlcm1hbmVudGx5CityZWluc3RhdGVkLCB5b3UgZG8gbm90IHF1YWxpZnkgdG8gcmVjZWl2ZSBuZXcgbGljZW5zZXMgZm9yIHRoZSBzYW1lCittYXRlcmlhbCB1bmRlciBzZWN0aW9uIDEwLgorCisgIDkuIEFjY2VwdGFuY2UgTm90IFJlcXVpcmVkIGZvciBIYXZpbmcgQ29waWVzLgorCisgIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gcmVjZWl2ZSBvcgorcnVuIGEgY29weSBvZiB0aGUgUHJvZ3JhbS4gIEFuY2lsbGFyeSBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQgd29yaworb2NjdXJyaW5nIHNvbGVseSBhcyBhIGNvbnNlcXVlbmNlIG9mIHVzaW5nIHBlZXItdG8tcGVlciB0cmFuc21pc3Npb24KK3RvIHJlY2VpdmUgYSBjb3B5IGxpa2V3aXNlIGRvZXMgbm90IHJlcXVpcmUgYWNjZXB0YW5jZS4gIEhvd2V2ZXIsCitub3RoaW5nIG90aGVyIHRoYW4gdGhpcyBMaWNlbnNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBwcm9wYWdhdGUgb3IKK21vZGlmeSBhbnkgY292ZXJlZCB3b3JrLiAgVGhlc2UgYWN0aW9ucyBpbmZyaW5nZSBjb3B5cmlnaHQgaWYgeW91IGRvCitub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIHByb3BhZ2F0aW5nIGEKK2NvdmVyZWQgd29yaywgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28uCisKKyAgMTAuIEF1dG9tYXRpYyBMaWNlbnNpbmcgb2YgRG93bnN0cmVhbSBSZWNpcGllbnRzLgorCisgIEVhY2ggdGltZSB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkKK3JlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvcnMsIHRvIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoYXQgd29yaywgc3ViamVjdCB0byB0aGlzIExpY2Vuc2UuICBZb3UgYXJlIG5vdCByZXNwb25zaWJsZQorZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aCB0aGlzIExpY2Vuc2UuCisKKyAgQW4gImVudGl0eSB0cmFuc2FjdGlvbiIgaXMgYSB0cmFuc2FjdGlvbiB0cmFuc2ZlcnJpbmcgY29udHJvbCBvZiBhbgorb3JnYW5pemF0aW9uLCBvciBzdWJzdGFudGlhbGx5IGFsbCBhc3NldHMgb2Ygb25lLCBvciBzdWJkaXZpZGluZyBhbgorb3JnYW5pemF0aW9uLCBvciBtZXJnaW5nIG9yZ2FuaXphdGlvbnMuICBJZiBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQKK3dvcmsgcmVzdWx0cyBmcm9tIGFuIGVudGl0eSB0cmFuc2FjdGlvbiwgZWFjaCBwYXJ0eSB0byB0aGF0Cit0cmFuc2FjdGlvbiB3aG8gcmVjZWl2ZXMgYSBjb3B5IG9mIHRoZSB3b3JrIGFsc28gcmVjZWl2ZXMgd2hhdGV2ZXIKK2xpY2Vuc2VzIHRvIHRoZSB3b3JrIHRoZSBwYXJ0eSdzIHByZWRlY2Vzc29yIGluIGludGVyZXN0IGhhZCBvciBjb3VsZAorZ2l2ZSB1bmRlciB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLCBwbHVzIGEgcmlnaHQgdG8gcG9zc2Vzc2lvbiBvZiB0aGUKK0NvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGZyb20gdGhlIHByZWRlY2Vzc29yIGluIGludGVyZXN0LCBpZgordGhlIHByZWRlY2Vzc29yIGhhcyBpdCBvciBjYW4gZ2V0IGl0IHdpdGggcmVhc29uYWJsZSBlZmZvcnRzLgorCisgIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIGV4ZXJjaXNlIG9mIHRoZQorcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkKK25vdCBpbXBvc2UgYSBsaWNlbnNlIGZlZSwgcm95YWx0eSwgb3Igb3RoZXIgY2hhcmdlIGZvciBleGVyY2lzZSBvZgorcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgeW91IG1heSBub3QgaW5pdGlhdGUgbGl0aWdhdGlvbgorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKK2FueSBwYXRlbnQgY2xhaW0gaXMgaW5mcmluZ2VkIGJ5IG1ha2luZywgdXNpbmcsIHNlbGxpbmcsIG9mZmVyaW5nIGZvcgorc2FsZSwgb3IgaW1wb3J0aW5nIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mIGl0LgorCisgIDExLiBQYXRlbnRzLgorCisgIEEgImNvbnRyaWJ1dG9yIiBpcyBhIGNvcHlyaWdodCBob2xkZXIgd2hvIGF1dGhvcml6ZXMgdXNlIHVuZGVyIHRoaXMKK0xpY2Vuc2Ugb2YgdGhlIFByb2dyYW0gb3IgYSB3b3JrIG9uIHdoaWNoIHRoZSBQcm9ncmFtIGlzIGJhc2VkLiAgVGhlCit3b3JrIHRodXMgbGljZW5zZWQgaXMgY2FsbGVkIHRoZSBjb250cmlidXRvcidzICJjb250cmlidXRvciB2ZXJzaW9uIi4KKworICBBIGNvbnRyaWJ1dG9yJ3MgImVzc2VudGlhbCBwYXRlbnQgY2xhaW1zIiBhcmUgYWxsIHBhdGVudCBjbGFpbXMKK293bmVkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIGNvbnRyaWJ1dG9yLCB3aGV0aGVyIGFscmVhZHkgYWNxdWlyZWQgb3IKK2hlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZAorYnkgdGhpcyBMaWNlbnNlLCBvZiBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLAorYnV0IGRvIG5vdCBpbmNsdWRlIGNsYWltcyB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBvbmx5IGFzIGEKK2NvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiAgRm9yCitwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBpbmNsdWRlcyB0aGUgcmlnaHQgdG8gZ3JhbnQKK3BhdGVudCBzdWJsaWNlbnNlcyBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZgordGhpcyBMaWNlbnNlLgorCisgIEVhY2ggY29udHJpYnV0b3IgZ3JhbnRzIHlvdSBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8KK21ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoZSBjb250ZW50cyBvZiBpdHMgY29udHJpYnV0b3IgdmVyc2lvbi4KKworICBJbiB0aGUgZm9sbG93aW5nIHRocmVlIHBhcmFncmFwaHMsIGEgInBhdGVudCBsaWNlbnNlIiBpcyBhbnkgZXhwcmVzcworYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQsIGhvd2V2ZXIgZGVub21pbmF0ZWQsIG5vdCB0byBlbmZvcmNlIGEgcGF0ZW50Cisoc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvCitzdWUgZm9yIHBhdGVudCBpbmZyaW5nZW1lbnQpLiAgVG8gImdyYW50IiBzdWNoIGEgcGF0ZW50IGxpY2Vuc2UgdG8gYQorcGFydHkgbWVhbnMgdG8gbWFrZSBzdWNoIGFuIGFncmVlbWVudCBvciBjb21taXRtZW50IG5vdCB0byBlbmZvcmNlIGEKK3BhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4KKworICBJZiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCBrbm93aW5nbHkgcmVseWluZyBvbiBhIHBhdGVudCBsaWNlbnNlLAorYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUKK3RvIGNvcHksIGZyZWUgb2YgY2hhcmdlIGFuZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCB0aHJvdWdoIGEKK3B1YmxpY2x5IGF2YWlsYWJsZSBuZXR3b3JrIHNlcnZlciBvciBvdGhlciByZWFkaWx5IGFjY2Vzc2libGUgbWVhbnMsCit0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvCithdmFpbGFibGUsIG9yICgyKSBhcnJhbmdlIHRvIGRlcHJpdmUgeW91cnNlbGYgb2YgdGhlIGJlbmVmaXQgb2YgdGhlCitwYXRlbnQgbGljZW5zZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHdvcmssIG9yICgzKSBhcnJhbmdlLCBpbiBhIG1hbm5lcgorY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudAorbGljZW5zZSB0byBkb3duc3RyZWFtIHJlY2lwaWVudHMuICAiS25vd2luZ2x5IHJlbHlpbmciIG1lYW5zIHlvdSBoYXZlCithY3R1YWwga25vd2xlZGdlIHRoYXQsIGJ1dCBmb3IgdGhlIHBhdGVudCBsaWNlbnNlLCB5b3VyIGNvbnZleWluZyB0aGUKK2NvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsKK2luIGEgY291bnRyeSwgd291bGQgaW5mcmluZ2Ugb25lIG9yIG1vcmUgaWRlbnRpZmlhYmxlIHBhdGVudHMgaW4gdGhhdAorY291bnRyeSB0aGF0IHlvdSBoYXZlIHJlYXNvbiB0byBiZWxpZXZlIGFyZSB2YWxpZC4KKworICBJZiwgcHVyc3VhbnQgdG8gb3IgaW4gY29ubmVjdGlvbiB3aXRoIGEgc2luZ2xlIHRyYW5zYWN0aW9uIG9yCithcnJhbmdlbWVudCwgeW91IGNvbnZleSwgb3IgcHJvcGFnYXRlIGJ5IHByb2N1cmluZyBjb252ZXlhbmNlIG9mLCBhCitjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMKK3JlY2VpdmluZyB0aGUgY292ZXJlZCB3b3JrIGF1dGhvcml6aW5nIHRoZW0gdG8gdXNlLCBwcm9wYWdhdGUsIG1vZGlmeQorb3IgY29udmV5IGEgc3BlY2lmaWMgY29weSBvZiB0aGUgY292ZXJlZCB3b3JrLCB0aGVuIHRoZSBwYXRlbnQgbGljZW5zZQoreW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQKK3dvcmsgYW5kIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIEEgcGF0ZW50IGxpY2Vuc2UgaXMgImRpc2NyaW1pbmF0b3J5IiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHdpdGhpbgordGhlIHNjb3BlIG9mIGl0cyBjb3ZlcmFnZSwgcHJvaGliaXRzIHRoZSBleGVyY2lzZSBvZiwgb3IgaXMKK2NvbmRpdGlvbmVkIG9uIHRoZSBub24tZXhlcmNpc2Ugb2Ygb25lIG9yIG1vcmUgb2YgdGhlIHJpZ2h0cyB0aGF0IGFyZQorc3BlY2lmaWNhbGx5IGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZAord29yayBpZiB5b3UgYXJlIGEgcGFydHkgdG8gYW4gYXJyYW5nZW1lbnQgd2l0aCBhIHRoaXJkIHBhcnR5IHRoYXQgaXMKK2luIHRoZSBidXNpbmVzcyBvZiBkaXN0cmlidXRpbmcgc29mdHdhcmUsIHVuZGVyIHdoaWNoIHlvdSBtYWtlIHBheW1lbnQKK3RvIHRoZSB0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nCit0aGUgd29yaywgYW5kIHVuZGVyIHdoaWNoIHRoZSB0aGlyZCBwYXJ0eSBncmFudHMsIHRvIGFueSBvZiB0aGUKK3BhcnRpZXMgd2hvIHdvdWxkIHJlY2VpdmUgdGhlIGNvdmVyZWQgd29yayBmcm9tIHlvdSwgYSBkaXNjcmltaW5hdG9yeQorcGF0ZW50IGxpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yaworY29udmV5ZWQgYnkgeW91IChvciBjb3BpZXMgbWFkZSBmcm9tIHRob3NlIGNvcGllcyksIG9yIChiKSBwcmltYXJpbHkKK2ZvciBhbmQgaW4gY29ubmVjdGlvbiB3aXRoIHNwZWNpZmljIHByb2R1Y3RzIG9yIGNvbXBpbGF0aW9ucyB0aGF0Citjb250YWluIHRoZSBjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsCitvciB0aGF0IHBhdGVudCBsaWNlbnNlIHdhcyBncmFudGVkLCBwcmlvciB0byAyOCBNYXJjaCAyMDA3LgorCisgIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBleGNsdWRpbmcgb3IgbGltaXRpbmcKK2FueSBpbXBsaWVkIGxpY2Vuc2Ugb3Igb3RoZXIgZGVmZW5zZXMgdG8gaW5mcmluZ2VtZW50IHRoYXQgbWF5CitvdGhlcndpc2UgYmUgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhcHBsaWNhYmxlIHBhdGVudCBsYXcuCisKKyAgMTIuIE5vIFN1cnJlbmRlciBvZiBPdGhlcnMnIEZyZWVkb20uCisKKyAgSWYgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QgY29udmV5IGEKK2NvdmVyZWQgd29yayBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkKK25vdCBjb252ZXkgaXQgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhZ3JlZSB0byB0ZXJtcyB0aGF0IG9ibGlnYXRlIHlvdQordG8gY29sbGVjdCBhIHJveWFsdHkgZm9yIGZ1cnRoZXIgY29udmV5aW5nIGZyb20gdGhvc2UgdG8gd2hvbSB5b3UgY29udmV5Cit0aGUgUHJvZ3JhbSwgdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggdGhvc2UgdGVybXMgYW5kIHRoaXMKK0xpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tIGNvbnZleWluZyB0aGUgUHJvZ3JhbS4KKworICAxMy4gVXNlIHdpdGggdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIHlvdSBoYXZlCitwZXJtaXNzaW9uIHRvIGxpbmsgb3IgY29tYmluZSBhbnkgY292ZXJlZCB3b3JrIHdpdGggYSB3b3JrIGxpY2Vuc2VkCit1bmRlciB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnRvIGEgc2luZ2xlCitjb21iaW5lZCB3b3JrLCBhbmQgdG8gY29udmV5IHRoZSByZXN1bHRpbmcgd29yay4gIFRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlIHdpbGwgY29udGludWUgdG8gYXBwbHkgdG8gdGhlIHBhcnQgd2hpY2ggaXMgdGhlIGNvdmVyZWQgd29yaywKK2J1dCB0aGUgc3BlY2lhbCByZXF1aXJlbWVudHMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKK3NlY3Rpb24gMTMsIGNvbmNlcm5pbmcgaW50ZXJhY3Rpb24gdGhyb3VnaCBhIG5ldHdvcmsgd2lsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIGFzIHN1Y2guCisKKyAgMTQuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlLgorCisgIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCisgIEVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlCitQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgY2VydGFpbiBudW1iZXJlZCB2ZXJzaW9uIG9mIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIiBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUKK29wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IG51bWJlcmVkCit2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBJZiB0aGUgUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIHByb3h5IGNhbiBkZWNpZGUgd2hpY2ggZnV0dXJlCit2ZXJzaW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHVzZWQsIHRoYXQgcHJveHkncworcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGEgdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdQordG8gY2hvb3NlIHRoYXQgdmVyc2lvbiBmb3IgdGhlIFByb2dyYW0uCisKKyAgTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQKK3Blcm1pc3Npb25zLiAgSG93ZXZlciwgbm8gYWRkaXRpb25hbCBvYmxpZ2F0aW9ucyBhcmUgaW1wb3NlZCBvbiBhbnkKK2F1dGhvciBvciBjb3B5cmlnaHQgaG9sZGVyIGFzIGEgcmVzdWx0IG9mIHlvdXIgY2hvb3NpbmcgdG8gZm9sbG93IGEKK2xhdGVyIHZlcnNpb24uCisKKyAgMTUuIERpc2NsYWltZXIgb2YgV2FycmFudHkuCisKKyAgVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWQorQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVAorSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWQorT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTQorSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GCitBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LgorCisgIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNT0RJRklFUyBBTkQvT1IgQ09OVkVZUworVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZCitHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUKK1VTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YKK0RBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJECitQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwKK0VWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKK1NVQ0ggREFNQUdFUy4KKworICAxNy4gSW50ZXJwcmV0YXRpb24gb2YgU2VjdGlvbnMgMTUgYW5kIDE2LgorCisgIElmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZAorYWJvdmUgY2Fubm90IGJlIGdpdmVuIGxvY2FsIGxlZ2FsIGVmZmVjdCBhY2NvcmRpbmcgdG8gdGhlaXIgdGVybXMsCityZXZpZXdpbmcgY291cnRzIHNoYWxsIGFwcGx5IGxvY2FsIGxhdyB0aGF0IG1vc3QgY2xvc2VseSBhcHByb3hpbWF0ZXMKK2FuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKK1Byb2dyYW0sIHVubGVzcyBhIHdhcnJhbnR5IG9yIGFzc3VtcHRpb24gb2YgbGlhYmlsaXR5IGFjY29tcGFuaWVzIGEKK2NvcHkgb2YgdGhlIFByb2dyYW0gaW4gcmV0dXJuIGZvciBhIGZlZS4KKworICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5CitzdGF0ZSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKKyAgSWYgdGhlIHByb2dyYW0gZG9lcyB0ZXJtaW5hbCBpbnRlcmFjdGlvbiwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydAorbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgPHByb2dyYW0+ICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorICAgIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgeW91ciBwcm9ncmFtJ3MgY29tbWFuZHMKK21pZ2h0IGJlIGRpZmZlcmVudDsgZm9yIGEgR1VJIGludGVyZmFjZSwgeW91IHdvdWxkIHVzZSBhbiAiYWJvdXQgYm94Ii4KKworICBZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3Igc2Nob29sLAoraWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMsIGFuZCBob3cgdG8gYXBwbHkgYW5kIGZvbGxvdyB0aGUgR05VIEdQTCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbQoraW50byBwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91CittYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGgKK3RoZSBsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuICBCdXQgZmlyc3QsIHBsZWFzZSByZWFkCis8aHR0cDovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvd2h5LW5vdC1sZ3BsLmh0bWw+LgpkaWZmIC0tZ2l0IGEvQ09QWUlORy5MR1BMIGIvQ09QWUlORy5MR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNGZhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLkxHUEwKQEAgLTAsMCArMSwxNjUgQEAKKyAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNworCisgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisKKyAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UsIHN1cHBsZW1lbnRlZCBieSB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBsaXN0ZWQgYmVsb3cuCisKKyAgMC4gQWRkaXRpb25hbCBEZWZpbml0aW9ucy4gCisKKyAgQXMgdXNlZCBoZXJlaW4sICJ0aGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgIkdOVSBHUEwiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICAiVGhlIExpYnJhcnkiIHJlZmVycyB0byBhIGNvdmVyZWQgd29yayBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UsCitvdGhlciB0aGFuIGFuIEFwcGxpY2F0aW9uIG9yIGEgQ29tYmluZWQgV29yayBhcyBkZWZpbmVkIGJlbG93LgorCisgIEFuICJBcHBsaWNhdGlvbiIgaXMgYW55IHdvcmsgdGhhdCBtYWtlcyB1c2Ugb2YgYW4gaW50ZXJmYWNlIHByb3ZpZGVkCitieSB0aGUgTGlicmFyeSwgYnV0IHdoaWNoIGlzIG5vdCBvdGhlcndpc2UgYmFzZWQgb24gdGhlIExpYnJhcnkuCitEZWZpbmluZyBhIHN1YmNsYXNzIG9mIGEgY2xhc3MgZGVmaW5lZCBieSB0aGUgTGlicmFyeSBpcyBkZWVtZWQgYSBtb2RlCitvZiB1c2luZyBhbiBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlIExpYnJhcnkuCisKKyAgQSAiQ29tYmluZWQgV29yayIgaXMgYSB3b3JrIHByb2R1Y2VkIGJ5IGNvbWJpbmluZyBvciBsaW5raW5nIGFuCitBcHBsaWNhdGlvbiB3aXRoIHRoZSBMaWJyYXJ5LiAgVGhlIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUgTGlicmFyeQord2l0aCB3aGljaCB0aGUgQ29tYmluZWQgV29yayB3YXMgbWFkZSBpcyBhbHNvIGNhbGxlZCB0aGUgIkxpbmtlZAorVmVyc2lvbiIuCisKKyAgVGhlICJNaW5pbWFsIENvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSBDb21iaW5lZCBXb3JrIG1lYW5zIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIHRoZSBDb21iaW5lZCBXb3JrLCBleGNsdWRpbmcgYW55IHNvdXJjZSBjb2RlCitmb3IgcG9ydGlvbnMgb2YgdGhlIENvbWJpbmVkIFdvcmsgdGhhdCwgY29uc2lkZXJlZCBpbiBpc29sYXRpb24sIGFyZQorYmFzZWQgb24gdGhlIEFwcGxpY2F0aW9uLCBhbmQgbm90IG9uIHRoZSBMaW5rZWQgVmVyc2lvbi4KKworICBUaGUgIkNvcnJlc3BvbmRpbmcgQXBwbGljYXRpb24gQ29kZSIgZm9yIGEgQ29tYmluZWQgV29yayBtZWFucyB0aGUKK29iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSBmb3IgdGhlIEFwcGxpY2F0aW9uLCBpbmNsdWRpbmcgYW55IGRhdGEKK2FuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IgcmVwcm9kdWNpbmcgdGhlIENvbWJpbmVkIFdvcmsgZnJvbSB0aGUKK0FwcGxpY2F0aW9uLCBidXQgZXhjbHVkaW5nIHRoZSBTeXN0ZW0gTGlicmFyaWVzIG9mIHRoZSBDb21iaW5lZCBXb3JrLgorCisgIDEuIEV4Y2VwdGlvbiB0byBTZWN0aW9uIDMgb2YgdGhlIEdOVSBHUEwuCisKKyAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgdW5kZXIgc2VjdGlvbnMgMyBhbmQgNCBvZiB0aGlzIExpY2Vuc2UKK3dpdGhvdXQgYmVpbmcgYm91bmQgYnkgc2VjdGlvbiAzIG9mIHRoZSBHTlUgR1BMLgorCisgIDIuIENvbnZleWluZyBNb2RpZmllZCBWZXJzaW9ucy4KKworICBJZiB5b3UgbW9kaWZ5IGEgY29weSBvZiB0aGUgTGlicmFyeSwgYW5kLCBpbiB5b3VyIG1vZGlmaWNhdGlvbnMsIGEKK2ZhY2lsaXR5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gQXBwbGljYXRpb24KK3RoYXQgdXNlcyB0aGUgZmFjaWxpdHkgKG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlCitmYWNpbGl0eSBpcyBpbnZva2VkKSwgdGhlbiB5b3UgbWF5IGNvbnZleSBhIGNvcHkgb2YgdGhlIG1vZGlmaWVkCit2ZXJzaW9uOgorCisgICBhKSB1bmRlciB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgeW91IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0bworICAgZW5zdXJlIHRoYXQsIGluIHRoZSBldmVudCBhbiBBcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgdGhlCisgICBmdW5jdGlvbiBvciBkYXRhLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcworICAgd2hhdGV2ZXIgcGFydCBvZiBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwsIG9yCisKKyAgIGIpIHVuZGVyIHRoZSBHTlUgR1BMLCB3aXRoIG5vbmUgb2YgdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSBhcHBsaWNhYmxlIHRvIHRoYXQgY29weS4KKworICAzLiBPYmplY3QgQ29kZSBJbmNvcnBvcmF0aW5nIE1hdGVyaWFsIGZyb20gTGlicmFyeSBIZWFkZXIgRmlsZXMuCisKKyAgVGhlIG9iamVjdCBjb2RlIGZvcm0gb2YgYW4gQXBwbGljYXRpb24gbWF5IGluY29ycG9yYXRlIG1hdGVyaWFsIGZyb20KK2EgaGVhZGVyIGZpbGUgdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LiAgWW91IG1heSBjb252ZXkgc3VjaCBvYmplY3QKK2NvZGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQsIGlmIHRoZSBpbmNvcnBvcmF0ZWQKK21hdGVyaWFsIGlzIG5vdCBsaW1pdGVkIHRvIG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhIHN0cnVjdHVyZQorbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBvciBzbWFsbCBtYWNyb3MsIGlubGluZSBmdW5jdGlvbnMgYW5kIHRlbXBsYXRlcworKHRlbiBvciBmZXdlciBsaW5lcyBpbiBsZW5ndGgpLCB5b3UgZG8gYm90aCBvZiB0aGUgZm9sbG93aW5nOgorCisgICBhKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIG9iamVjdCBjb2RlIHRoYXQgdGhlCisgICBMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlCisgICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgYikgQWNjb21wYW55IHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUgR05VIEdQTCBhbmQgdGhpcyBsaWNlbnNlCisgICBkb2N1bWVudC4KKworICA0LiBDb21iaW5lZCBXb3Jrcy4KKworICBZb3UgbWF5IGNvbnZleSBhIENvbWJpbmVkIFdvcmsgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UgdGhhdCwKK3Rha2VuIHRvZ2V0aGVyLCBlZmZlY3RpdmVseSBkbyBub3QgcmVzdHJpY3QgbW9kaWZpY2F0aW9uIG9mIHRoZQorcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkgY29udGFpbmVkIGluIHRoZSBDb21iaW5lZCBXb3JrIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucywgaWYgeW91IGFsc28gZG8gZWFjaCBvZgordGhlIGZvbGxvd2luZzoKKworICAgYSkgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBDb21iaW5lZCBXb3JrIHRoYXQKKyAgIHRoZSBMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlCisgICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgYikgQWNjb21wYW55IHRoZSBDb21iaW5lZCBXb3JrIHdpdGggYSBjb3B5IG9mIHRoZSBHTlUgR1BMIGFuZCB0aGlzIGxpY2Vuc2UKKyAgIGRvY3VtZW50LgorCisgICBjKSBGb3IgYSBDb21iaW5lZCBXb3JrIHRoYXQgZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMgZHVyaW5nCisgICBleGVjdXRpb24sIGluY2x1ZGUgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nCisgICB0aGVzZSBub3RpY2VzLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlIGRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUKKyAgIGNvcGllcyBvZiB0aGUgR05VIEdQTCBhbmQgdGhpcyBsaWNlbnNlIGRvY3VtZW50LgorCisgICBkKSBEbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgIDApIENvbnZleSB0aGUgTWluaW1hbCBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcworICAgICAgIExpY2Vuc2UsIGFuZCB0aGUgQ29ycmVzcG9uZGluZyBBcHBsaWNhdGlvbiBDb2RlIGluIGEgZm9ybQorICAgICAgIHN1aXRhYmxlIGZvciwgYW5kIHVuZGVyIHRlcm1zIHRoYXQgcGVybWl0LCB0aGUgdXNlciB0bworICAgICAgIHJlY29tYmluZSBvciByZWxpbmsgdGhlIEFwcGxpY2F0aW9uIHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mCisgICAgICAgdGhlIExpbmtlZCBWZXJzaW9uIHRvIHByb2R1Y2UgYSBtb2RpZmllZCBDb21iaW5lZCBXb3JrLCBpbiB0aGUKKyAgICAgICBtYW5uZXIgc3BlY2lmaWVkIGJ5IHNlY3Rpb24gNiBvZiB0aGUgR05VIEdQTCBmb3IgY29udmV5aW5nCisgICAgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuCisKKyAgICAgICAxKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKKyAgICAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKGEpIHVzZXMgYXQgcnVuIHRpbWUKKyAgICAgICBhIGNvcHkgb2YgdGhlIExpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIKKyAgICAgICBzeXN0ZW0sIGFuZCAoYikgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uCisgICAgICAgb2YgdGhlIExpYnJhcnkgdGhhdCBpcyBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSBMaW5rZWQKKyAgICAgICBWZXJzaW9uLiAKKworICAgZSkgUHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24sIGJ1dCBvbmx5IGlmIHlvdSB3b3VsZCBvdGhlcndpc2UKKyAgIGJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbiB1bmRlciBzZWN0aW9uIDYgb2YgdGhlCisgICBHTlUgR1BMLCBhbmQgb25seSB0byB0aGUgZXh0ZW50IHRoYXQgc3VjaCBpbmZvcm1hdGlvbiBpcworICAgbmVjZXNzYXJ5IHRvIGluc3RhbGwgYW5kIGV4ZWN1dGUgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZQorICAgQ29tYmluZWQgV29yayBwcm9kdWNlZCBieSByZWNvbWJpbmluZyBvciByZWxpbmtpbmcgdGhlCisgICBBcHBsaWNhdGlvbiB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlua2VkIFZlcnNpb24uIChJZgorICAgeW91IHVzZSBvcHRpb24gNGQwLCB0aGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIG11c3QgYWNjb21wYW55CisgICB0aGUgTWluaW1hbCBDb3JyZXNwb25kaW5nIFNvdXJjZSBhbmQgQ29ycmVzcG9uZGluZyBBcHBsaWNhdGlvbgorICAgQ29kZS4gSWYgeW91IHVzZSBvcHRpb24gNGQxLCB5b3UgbXVzdCBwcm92aWRlIHRoZSBJbnN0YWxsYXRpb24KKyAgIEluZm9ybWF0aW9uIGluIHRoZSBtYW5uZXIgc3BlY2lmaWVkIGJ5IHNlY3Rpb24gNiBvZiB0aGUgR05VIEdQTAorICAgZm9yIGNvbnZleWluZyBDb3JyZXNwb25kaW5nIFNvdXJjZS4pCisKKyAgNS4gQ29tYmluZWQgTGlicmFyaWVzLgorCisgIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZSBieSBzaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIHRoYXQgYXJlIG5vdCBBcHBsaWNhdGlvbnMgYW5kIGFyZSBub3QgY292ZXJlZCBieSB0aGlzCitMaWNlbnNlLCBhbmQgY29udmV5IHN1Y2ggYSBjb21iaW5lZCBsaWJyYXJ5IHVuZGVyIHRlcm1zIG9mIHlvdXIKK2Nob2ljZSwgaWYgeW91IGRvIGJvdGggb2YgdGhlIGZvbGxvd2luZzoKKworICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsgYmFzZWQKKyAgIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcywKKyAgIGNvbnZleWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IHRoYXQgcGFydCBvZiBpdAorICAgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZyB3aGVyZSB0byBmaW5kIHRoZQorICAgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDYuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcKK3ZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heQorZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gSWYgdGhlCitMaWJyYXJ5IGFzIHlvdSByZWNlaXZlZCBpdCBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbgorb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iCithcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHB1Ymxpc2hlZCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlIExpYnJhcnkgYXMgeW91CityZWNlaXZlZCBpdCBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIG9mIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgSWYgdGhlIExpYnJhcnkgYXMgeW91IHJlY2VpdmVkIGl0IHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZQord2hldGhlciBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBzaGFsbAorYXBwbHksIHRoYXQgcHJveHkncyBwdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYW55IHZlcnNpb24gaXMKK3Blcm1hbmVudCBhdXRob3JpemF0aW9uIGZvciB5b3UgdG8gY2hvb3NlIHRoYXQgdmVyc2lvbiBmb3IgdGhlCitMaWJyYXJ5LgpkaWZmIC0tZ2l0IGEvQ09QWUlORy5NSU5QQUNLIGIvQ09QWUlORy5NSU5QQUNLCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDhhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLk1JTlBBQ0sKQEAgLTAsMCArMSw1MiBAQAorTWlucGFjayBDb3B5cmlnaHQgTm90aWNlICgxOTk5KSBVbml2ZXJzaXR5IG9mIENoaWNhZ28uICBBbGwgcmlnaHRzIHJlc2VydmVkDQorDQorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcg0KK3dpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlDQorZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCisNCisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlDQorY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcNCitkaXNjbGFpbWVyLg0KKw0KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCitjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZw0KK2Rpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscw0KK3Byb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisNCiszLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZQ0KK3JlZGlzdHJpYnV0aW9uLCBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nDQorYWNrbm93bGVkZ21lbnQ6DQorDQorICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlDQorICAgVW5pdmVyc2l0eSBvZiBDaGljYWdvLCBhcyBPcGVyYXRvciBvZiBBcmdvbm5lIE5hdGlvbmFsDQorICAgTGFib3JhdG9yeS4NCisNCitBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZQ0KK2l0c2VsZiwgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzDQorbm9ybWFsbHkgYXBwZWFyLg0KKw0KKzQuIFdBUlJBTlRZIERJU0NMQUlNRVIuIFRIRSBTT0ZUV0FSRSBJUyBTVVBQTElFRCAiQVMgSVMiDQorV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORC4gVEhFIENPUFlSSUdIVCBIT0xERVIsIFRIRQ0KK1VOSVRFRCBTVEFURVMsIFRIRSBVTklURUQgU1RBVEVTIERFUEFSVE1FTlQgT0YgRU5FUkdZLCBBTkQNCitUSEVJUiBFTVBMT1lFRVM6ICgxKSBESVNDTEFJTSBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUg0KK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIElNUExJRUQgV0FSUkFOVElFUw0KK09GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFDQorT1IgTk9OLUlORlJJTkdFTUVOVCwgKDIpIERPIE5PVCBBU1NVTUUgQU5ZIExFR0FMIExJQUJJTElUWQ0KK09SIFJFU1BPTlNJQklMSVRZIEZPUiBUSEUgQUNDVVJBQ1ksIENPTVBMRVRFTkVTUywgT1INCitVU0VGVUxORVNTIE9GIFRIRSBTT0ZUV0FSRSwgKDMpIERPIE5PVCBSRVBSRVNFTlQgVEhBVCBVU0UgT0YNCitUSEUgU09GVFdBUkUgV09VTEQgTk9UIElORlJJTkdFIFBSSVZBVEVMWSBPV05FRCBSSUdIVFMsICg0KQ0KK0RPIE5PVCBXQVJSQU5UIFRIQVQgVEhFIFNPRlRXQVJFIFdJTEwgRlVOQ1RJT04NCitVTklOVEVSUlVQVEVELCBUSEFUIElUIElTIEVSUk9SLUZSRUUgT1IgVEhBVCBBTlkgRVJST1JTIFdJTEwNCitCRSBDT1JSRUNURUQuDQorDQorNS4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuIElOIE5PIEVWRU5UIFdJTEwgVEhFIENPUFlSSUdIVA0KK0hPTERFUiwgVEhFIFVOSVRFRCBTVEFURVMsIFRIRSBVTklURUQgU1RBVEVTIERFUEFSVE1FTlQgT0YNCitFTkVSR1ksIE9SIFRIRUlSIEVNUExPWUVFUzogQkUgTElBQkxFIEZPUiBBTlkgSU5ESVJFQ1QsDQorSU5DSURFTlRBTCwgQ09OU0VRVUVOVElBTCwgU1BFQ0lBTCBPUiBQVU5JVElWRSBEQU1BR0VTIE9GDQorQU5ZIEtJTkQgT1IgTkFUVVJFLCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YNCitQUk9GSVRTIE9SIExPU1MgT0YgREFUQSwgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUiwgV0hFVEhFUg0KK1NVQ0ggTElBQklMSVRZIElTIEFTU0VSVEVEIE9OIFRIRSBCQVNJUyBPRiBDT05UUkFDVCwgVE9SVA0KKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBTVFJJQ1QgTElBQklMSVRZKSwgT1IgT1RIRVJXSVNFLA0KK0VWRU4gSUYgQU5ZIE9GIFNBSUQgUEFSVElFUyBIQVMgQkVFTiBXQVJORUQgT0YgVEhFDQorUE9TU0lCSUxJVFkgT0YgU1VDSCBMT1NTIE9SIERBTUFHRVMuDQorDQpkaWZmIC0tZ2l0IGEvQ09QWUlORy5NUEwyIGIvQ09QWUlORy5NUEwyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTJmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HLk1QTDIKQEAgLTAsMCArMSwzNzMgQEAKK01vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMS4gRGVmaW5pdGlvbnMKKy0tLS0tLS0tLS0tLS0tCisKKzEuMS4gIkNvbnRyaWJ1dG9yIgorICAgIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgdGhhdCBjcmVhdGVzLCBjb250cmlidXRlcyB0bworICAgIHRoZSBjcmVhdGlvbiBvZiwgb3Igb3ducyBDb3ZlcmVkIFNvZnR3YXJlLgorCisxLjIuICJDb250cmlidXRvciBWZXJzaW9uIgorICAgIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9ucyBvZiBvdGhlcnMgKGlmIGFueSkgdXNlZAorICAgIGJ5IGEgQ29udHJpYnV0b3IgYW5kIHRoYXQgcGFydGljdWxhciBDb250cmlidXRvcidzIENvbnRyaWJ1dGlvbi4KKworMS4zLiAiQ29udHJpYnV0aW9uIgorICAgIG1lYW5zIENvdmVyZWQgU29mdHdhcmUgb2YgYSBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorCisxLjQuICJDb3ZlcmVkIFNvZnR3YXJlIgorICAgIG1lYW5zIFNvdXJjZSBDb2RlIEZvcm0gdG8gd2hpY2ggdGhlIGluaXRpYWwgQ29udHJpYnV0b3IgaGFzIGF0dGFjaGVkCisgICAgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEsIHRoZSBFeGVjdXRhYmxlIEZvcm0gb2Ygc3VjaCBTb3VyY2UgQ29kZQorICAgIEZvcm0sIGFuZCBNb2RpZmljYXRpb25zIG9mIHN1Y2ggU291cmNlIENvZGUgRm9ybSwgaW4gZWFjaCBjYXNlCisgICAgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCisKKzEuNS4gIkluY29tcGF0aWJsZSBXaXRoIFNlY29uZGFyeSBMaWNlbnNlcyIKKyAgICBtZWFucworCisgICAgKGEpIHRoYXQgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IgaGFzIGF0dGFjaGVkIHRoZSBub3RpY2UgZGVzY3JpYmVkCisgICAgICAgIGluIEV4aGliaXQgQiB0byB0aGUgQ292ZXJlZCBTb2Z0d2FyZTsgb3IKKworICAgIChiKSB0aGF0IHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHdhcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAgICAgICAgdmVyc2lvbiAxLjEgb3IgZWFybGllciBvZiB0aGUgTGljZW5zZSwgYnV0IG5vdCBhbHNvIHVuZGVyIHRoZQorICAgICAgICB0ZXJtcyBvZiBhIFNlY29uZGFyeSBMaWNlbnNlLgorCisxLjYuICJFeGVjdXRhYmxlIEZvcm0iCisgICAgbWVhbnMgYW55IGZvcm0gb2YgdGhlIHdvcmsgb3RoZXIgdGhhbiBTb3VyY2UgQ29kZSBGb3JtLgorCisxLjcuICJMYXJnZXIgV29yayIKKyAgICBtZWFucyBhIHdvcmsgdGhhdCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIgbWF0ZXJpYWwsIGluIAorICAgIGEgc2VwYXJhdGUgZmlsZSBvciBmaWxlcywgdGhhdCBpcyBub3QgQ292ZXJlZCBTb2Z0d2FyZS4KKworMS44LiAiTGljZW5zZSIKKyAgICBtZWFucyB0aGlzIGRvY3VtZW50LgorCisxLjkuICJMaWNlbnNhYmxlIgorICAgIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwKKyAgICB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yIHN1YnNlcXVlbnRseSwgYW55IGFuZAorICAgIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KKworMS4xMC4gIk1vZGlmaWNhdGlvbnMiCisgICAgbWVhbnMgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICAoYSkgYW55IGZpbGUgaW4gU291cmNlIENvZGUgRm9ybSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywKKyAgICAgICAgZGVsZXRpb24gZnJvbSwgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBDb3ZlcmVkCisgICAgICAgIFNvZnR3YXJlOyBvcgorCisgICAgKGIpIGFueSBuZXcgZmlsZSBpbiBTb3VyY2UgQ29kZSBGb3JtIHRoYXQgY29udGFpbnMgYW55IENvdmVyZWQKKyAgICAgICAgU29mdHdhcmUuCisKKzEuMTEuICJQYXRlbnQgQ2xhaW1zIiBvZiBhIENvbnRyaWJ1dG9yCisgICAgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLAorICAgIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgc3VjaAorICAgIENvbnRyaWJ1dG9yIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkLCBidXQgZm9yIHRoZSBncmFudCBvZiB0aGUKKyAgICBMaWNlbnNlLCBieSB0aGUgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yIHNhbGUsIGhhdmluZworICAgIG1hZGUsIGltcG9ydCwgb3IgdHJhbnNmZXIgb2YgZWl0aGVyIGl0cyBDb250cmlidXRpb25zIG9yIGl0cworICAgIENvbnRyaWJ1dG9yIFZlcnNpb24uCisKKzEuMTIuICJTZWNvbmRhcnkgTGljZW5zZSIKKyAgICBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIuMCwgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIuMSwgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbAorICAgIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDMuMCwgb3IgYW55IGxhdGVyIHZlcnNpb25zIG9mIHRob3NlCisgICAgbGljZW5zZXMuCisKKzEuMTMuICJTb3VyY2UgQ29kZSBGb3JtIgorICAgIG1lYW5zIHRoZSBmb3JtIG9mIHRoZSB3b3JrIHByZWZlcnJlZCBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMuCisKKzEuMTQuICJZb3UiIChvciAiWW91ciIpCisgICAgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzCisgICAgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91IiBpbmNsdWRlcyBhbnkgZW50aXR5IHRoYXQKKyAgICBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvcgorICAgIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChhKSB0aGUgcG93ZXIsIGRpcmVjdAorICAgIG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksCisgICAgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgbW9yZSB0aGFuCisgICAgZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwKKyAgICBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKzIuIExpY2Vuc2UgR3JhbnRzIGFuZCBDb25kaXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisyLjEuIEdyYW50cworCitFYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLAorbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgorCisoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKQorICAgIExpY2Vuc2FibGUgYnkgc3VjaCBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbWFrZSBhdmFpbGFibGUsCisgICAgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBkaXN0cmlidXRlLCBhbmQgb3RoZXJ3aXNlIGV4cGxvaXQgaXRzCisgICAgQ29udHJpYnV0aW9ucywgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggTW9kaWZpY2F0aW9ucywgb3IKKyAgICBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAorCisoYikgdW5kZXIgUGF0ZW50IENsYWltcyBvZiBzdWNoIENvbnRyaWJ1dG9yIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIKKyAgICBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgZWl0aGVyIGl0cworICAgIENvbnRyaWJ1dGlvbnMgb3IgaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24uCisKKzIuMi4gRWZmZWN0aXZlIERhdGUKKworVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbiAyLjEgd2l0aCByZXNwZWN0IHRvIGFueSBDb250cmlidXRpb24KK2JlY29tZSBlZmZlY3RpdmUgZm9yIGVhY2ggQ29udHJpYnV0aW9uIG9uIHRoZSBkYXRlIHRoZSBDb250cmlidXRvciBmaXJzdAorZGlzdHJpYnV0ZXMgc3VjaCBDb250cmlidXRpb24uCisKKzIuMy4gTGltaXRhdGlvbnMgb24gR3JhbnQgU2NvcGUKKworVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gdGhpcyBTZWN0aW9uIDIgYXJlIHRoZSBvbmx5IHJpZ2h0cyBncmFudGVkIHVuZGVyCit0aGlzIExpY2Vuc2UuIE5vIGFkZGl0aW9uYWwgcmlnaHRzIG9yIGxpY2Vuc2VzIHdpbGwgYmUgaW1wbGllZCBmcm9tIHRoZQorZGlzdHJpYnV0aW9uIG9yIGxpY2Vuc2luZyBvZiBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KK05vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZCBieSBhCitDb250cmlidXRvcjoKKworKGEpIGZvciBhbnkgY29kZSB0aGF0IGEgQ29udHJpYnV0b3IgaGFzIHJlbW92ZWQgZnJvbSBDb3ZlcmVkIFNvZnR3YXJlOworICAgIG9yCisKKyhiKSBmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKSBZb3VyIGFuZCBhbnkgb3RoZXIgdGhpcmQgcGFydHkncworICAgIG1vZGlmaWNhdGlvbnMgb2YgQ292ZXJlZCBTb2Z0d2FyZSwgb3IgKGlpKSB0aGUgY29tYmluYXRpb24gb2YgaXRzCisgICAgQ29udHJpYnV0aW9ucyB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiBpdHMgQ29udHJpYnV0b3IKKyAgICBWZXJzaW9uKTsgb3IKKworKGMpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlIGFic2VuY2Ugb2YKKyAgICBpdHMgQ29udHJpYnV0aW9ucy4KKworVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IGFueSByaWdodHMgaW4gdGhlIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsCitvciBsb2dvcyBvZiBhbnkgQ29udHJpYnV0b3IgKGV4Y2VwdCBhcyBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNvbXBseSB3aXRoCit0aGUgbm90aWNlIHJlcXVpcmVtZW50cyBpbiBTZWN0aW9uIDMuNCkuCisKKzIuNC4gU3Vic2VxdWVudCBMaWNlbnNlcworCitObyBDb250cmlidXRvciBtYWtlcyBhZGRpdGlvbmFsIGdyYW50cyBhcyBhIHJlc3VsdCBvZiBZb3VyIGNob2ljZSB0bworZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciBhIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGlzCitMaWNlbnNlIChzZWUgU2VjdGlvbiAxMC4yKSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBTZWNvbmRhcnkgTGljZW5zZSAoaWYKK3Blcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAzLjMpLgorCisyLjUuIFJlcHJlc2VudGF0aW9uCisKK0VhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRoZSBDb250cmlidXRvciBiZWxpZXZlcyBpdHMKK0NvbnRyaWJ1dGlvbnMgYXJlIGl0cyBvcmlnaW5hbCBjcmVhdGlvbihzKSBvciBpdCBoYXMgc3VmZmljaWVudCByaWdodHMKK3RvIGdyYW50IHRoZSByaWdodHMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisyLjYuIEZhaXIgVXNlCisKK1RoaXMgTGljZW5zZSBpcyBub3QgaW50ZW5kZWQgdG8gbGltaXQgYW55IHJpZ2h0cyBZb3UgaGF2ZSB1bmRlcgorYXBwbGljYWJsZSBjb3B5cmlnaHQgZG9jdHJpbmVzIG9mIGZhaXIgdXNlLCBmYWlyIGRlYWxpbmcsIG9yIG90aGVyCitlcXVpdmFsZW50cy4KKworMi43LiBDb25kaXRpb25zCisKK1NlY3Rpb25zIDMuMSwgMy4yLCAzLjMsIGFuZCAzLjQgYXJlIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2VzIGdyYW50ZWQKK2luIFNlY3Rpb24gMi4xLgorCiszLiBSZXNwb25zaWJpbGl0aWVzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKzMuMS4gRGlzdHJpYnV0aW9uIG9mIFNvdXJjZSBGb3JtCisKK0FsbCBkaXN0cmlidXRpb24gb2YgQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBGb3JtLCBpbmNsdWRpbmcgYW55CitNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSwgbXVzdCBiZSB1bmRlcgordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgdGhhdCB0aGUgU291cmNlCitDb2RlIEZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2UsIGFuZCBob3cgdGhleSBjYW4gb2J0YWluIGEgY29weSBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtYXkgbm90CithdHRlbXB0IHRvIGFsdGVyIG9yIHJlc3RyaWN0IHRoZSByZWNpcGllbnRzJyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlCitGb3JtLgorCiszLjIuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIEZvcm0KKworSWYgWW91IGRpc3RyaWJ1dGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIEZvcm0gdGhlbjoKKworKGEpIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUKKyAgICBGb3JtLCBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjEsIGFuZCBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZgorICAgIHRoZSBFeGVjdXRhYmxlIEZvcm0gaG93IHRoZXkgY2FuIG9idGFpbiBhIGNvcHkgb2Ygc3VjaCBTb3VyY2UgQ29kZQorICAgIEZvcm0gYnkgcmVhc29uYWJsZSBtZWFucyBpbiBhIHRpbWVseSBtYW5uZXIsIGF0IGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIGRpc3RyaWJ1dGlvbiB0byB0aGUgcmVjaXBpZW50OyBhbmQKKworKGIpIFlvdSBtYXkgZGlzdHJpYnV0ZSBzdWNoIEV4ZWN1dGFibGUgRm9ybSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcworICAgIExpY2Vuc2UsIG9yIHN1YmxpY2Vuc2UgaXQgdW5kZXIgZGlmZmVyZW50IHRlcm1zLCBwcm92aWRlZCB0aGF0IHRoZQorICAgIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIEZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlcgorICAgIHRoZSByZWNpcGllbnRzJyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIEZvcm0gdW5kZXIgdGhpcyBMaWNlbnNlLgorCiszLjMuIERpc3RyaWJ1dGlvbiBvZiBhIExhcmdlciBXb3JrCisKK1lvdSBtYXkgY3JlYXRlIGFuZCBkaXN0cmlidXRlIGEgTGFyZ2VyIFdvcmsgdW5kZXIgdGVybXMgb2YgWW91ciBjaG9pY2UsCitwcm92aWRlZCB0aGF0IFlvdSBhbHNvIGNvbXBseSB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGZvcgordGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBMYXJnZXIgV29yayBpcyBhIGNvbWJpbmF0aW9uIG9mIENvdmVyZWQKK1NvZnR3YXJlIHdpdGggYSB3b3JrIGdvdmVybmVkIGJ5IG9uZSBvciBtb3JlIFNlY29uZGFyeSBMaWNlbnNlcywgYW5kIHRoZQorQ292ZXJlZCBTb2Z0d2FyZSBpcyBub3QgSW5jb21wYXRpYmxlIFdpdGggU2Vjb25kYXJ5IExpY2Vuc2VzLCB0aGlzCitMaWNlbnNlIHBlcm1pdHMgWW91IHRvIGFkZGl0aW9uYWxseSBkaXN0cmlidXRlIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZQordW5kZXIgdGhlIHRlcm1zIG9mIHN1Y2ggU2Vjb25kYXJ5IExpY2Vuc2UocyksIHNvIHRoYXQgdGhlIHJlY2lwaWVudCBvZgordGhlIExhcmdlciBXb3JrIG1heSwgYXQgdGhlaXIgb3B0aW9uLCBmdXJ0aGVyIGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQKK1NvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhpcyBMaWNlbnNlIG9yIHN1Y2ggU2Vjb25kYXJ5CitMaWNlbnNlKHMpLgorCiszLjQuIE5vdGljZXMKKworWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIHRoZSBzdWJzdGFuY2Ugb2YgYW55IGxpY2Vuc2Ugbm90aWNlcworKGluY2x1ZGluZyBjb3B5cmlnaHQgbm90aWNlcywgcGF0ZW50IG5vdGljZXMsIGRpc2NsYWltZXJzIG9mIHdhcnJhbnR5LAorb3IgbGltaXRhdGlvbnMgb2YgbGlhYmlsaXR5KSBjb250YWluZWQgd2l0aGluIHRoZSBTb3VyY2UgQ29kZSBGb3JtIG9mCit0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgZXhjZXB0IHRoYXQgWW91IG1heSBhbHRlciBhbnkgbGljZW5zZSBub3RpY2VzIHRvCit0aGUgZXh0ZW50IHJlcXVpcmVkIHRvIHJlbWVkeSBrbm93biBmYWN0dWFsIGluYWNjdXJhY2llcy4KKworMy41LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zCisKK1lvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsCitpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZAorU29mdHdhcmUuIEhvd2V2ZXIsIFlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24KK2JlaGFsZiBvZiBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueQorc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5LCBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5CitZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSBldmVyeSBDb250cmlidXRvciBmb3IgYW55CitsaWFiaWxpdHkgaW5jdXJyZWQgYnkgc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwKK2luZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLiBZb3UgbWF5IGluY2x1ZGUgYWRkaXRpb25hbAorZGlzY2xhaW1lcnMgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb25zIG9mIGxpYWJpbGl0eSBzcGVjaWZpYyB0byBhbnkKK2p1cmlzZGljdGlvbi4KKworNC4gSW5hYmlsaXR5IHRvIENvbXBseSBEdWUgdG8gU3RhdHV0ZSBvciBSZWd1bGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgaXQgaXMgaW1wb3NzaWJsZSBmb3IgWW91IHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8gc29tZSBvciBhbGwgb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgZHVlIHRvCitzdGF0dXRlLCBqdWRpY2lhbCBvcmRlciwgb3IgcmVndWxhdGlvbiB0aGVuIFlvdSBtdXN0OiAoYSkgY29tcGx5IHdpdGgKK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlOyBhbmQgKGIpCitkZXNjcmliZSB0aGUgbGltaXRhdGlvbnMgYW5kIHRoZSBjb2RlIHRoZXkgYWZmZWN0LiBTdWNoIGRlc2NyaXB0aW9uIG11c3QKK2JlIHBsYWNlZCBpbiBhIHRleHQgZmlsZSBpbmNsdWRlZCB3aXRoIGFsbCBkaXN0cmlidXRpb25zIG9mIHRoZSBDb3ZlcmVkCitTb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHByb2hpYml0ZWQgYnkgc3RhdHV0ZQorb3IgcmVndWxhdGlvbiwgc3VjaCBkZXNjcmlwdGlvbiBtdXN0IGJlIHN1ZmZpY2llbnRseSBkZXRhaWxlZCBmb3IgYQorcmVjaXBpZW50IG9mIG9yZGluYXJ5IHNraWxsIHRvIGJlIGFibGUgdG8gdW5kZXJzdGFuZCBpdC4KKworNS4gVGVybWluYXRpb24KKy0tLS0tLS0tLS0tLS0tCisKKzUuMS4gVGhlIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5CitpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCBhbnkgb2YgaXRzIHRlcm1zLiBIb3dldmVyLCBpZiBZb3UgYmVjb21lCitjb21wbGlhbnQsIHRoZW4gdGhlIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSBmcm9tIGEgcGFydGljdWxhcgorQ29udHJpYnV0b3IgYXJlIHJlaW5zdGF0ZWQgKGEpIHByb3Zpc2lvbmFsbHksIHVubGVzcyBhbmQgdW50aWwgc3VjaAorQ29udHJpYnV0b3IgZXhwbGljaXRseSBhbmQgZmluYWxseSB0ZXJtaW5hdGVzIFlvdXIgZ3JhbnRzLCBhbmQgKGIpIG9uIGFuCitvbmdvaW5nIGJhc2lzLCBpZiBzdWNoIENvbnRyaWJ1dG9yIGZhaWxzIHRvIG5vdGlmeSBZb3Ugb2YgdGhlCitub24tY29tcGxpYW5jZSBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMgcHJpb3IgdG8gNjAgZGF5cyBhZnRlciBZb3UgaGF2ZQorY29tZSBiYWNrIGludG8gY29tcGxpYW5jZS4gTW9yZW92ZXIsIFlvdXIgZ3JhbnRzIGZyb20gYSBwYXJ0aWN1bGFyCitDb250cmlidXRvciBhcmUgcmVpbnN0YXRlZCBvbiBhbiBvbmdvaW5nIGJhc2lzIGlmIHN1Y2ggQ29udHJpYnV0b3IKK25vdGlmaWVzIFlvdSBvZiB0aGUgbm9uLWNvbXBsaWFuY2UgYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZQorZmlyc3QgdGltZSBZb3UgaGF2ZSByZWNlaXZlZCBub3RpY2Ugb2Ygbm9uLWNvbXBsaWFuY2Ugd2l0aCB0aGlzIExpY2Vuc2UKK2Zyb20gc3VjaCBDb250cmlidXRvciwgYW5kIFlvdSBiZWNvbWUgY29tcGxpYW50IHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKK1lvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgorCis1LjIuIElmIFlvdSBpbml0aWF0ZSBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSBieSBhc3NlcnRpbmcgYSBwYXRlbnQKK2luZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMsCitjb3VudGVyLWNsYWltcywgYW5kIGNyb3NzLWNsYWltcykgYWxsZWdpbmcgdGhhdCBhIENvbnRyaWJ1dG9yIFZlcnNpb24KK2RpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gdGhlIHJpZ2h0cyBncmFudGVkIHRvCitZb3UgYnkgYW55IGFuZCBhbGwgQ29udHJpYnV0b3JzIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciBTZWN0aW9uCisyLjEgb2YgdGhpcyBMaWNlbnNlIHNoYWxsIHRlcm1pbmF0ZS4KKworNS4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNS4xIG9yIDUuMiBhYm92ZSwgYWxsCitlbmQgdXNlciBsaWNlbnNlIGFncmVlbWVudHMgKGV4Y2x1ZGluZyBkaXN0cmlidXRvcnMgYW5kIHJlc2VsbGVycykgd2hpY2gKK2hhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIFlvdXIgZGlzdHJpYnV0b3JzIHVuZGVyIHRoaXMgTGljZW5zZQorcHJpb3IgdG8gdGVybWluYXRpb24gc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIDYuIERpc2NsYWltZXIgb2YgV2FycmFudHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIENvdmVyZWQgU29mdHdhcmUgaXMgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlIG9uIGFuICJhcyBpcyIgICAgICAgKgorKiAgYmFzaXMsIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzZWQsIGltcGxpZWQsIG9yICAqCisqICBzdGF0dXRvcnksIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCB3YXJyYW50aWVzIHRoYXQgdGhlICAgICAgICoKKyogIENvdmVyZWQgU29mdHdhcmUgaXMgZnJlZSBvZiBkZWZlY3RzLCBtZXJjaGFudGFibGUsIGZpdCBmb3IgYSAgICAgICAgKgorKiAgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5naW5nLiBUaGUgZW50aXJlIHJpc2sgYXMgdG8gdGhlICAgICAqCisqICBxdWFsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyB3aXRoIFlvdS4gICAgICAgICoKKyogIFNob3VsZCBhbnkgQ292ZXJlZCBTb2Z0d2FyZSBwcm92ZSBkZWZlY3RpdmUgaW4gYW55IHJlc3BlY3QsIFlvdSAgICAgKgorKiAgKG5vdCBhbnkgQ29udHJpYnV0b3IpIGFzc3VtZSB0aGUgY29zdCBvZiBhbnkgbmVjZXNzYXJ5IHNlcnZpY2luZywgICAqCisqICByZXBhaXIsIG9yIGNvcnJlY3Rpb24uIFRoaXMgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBjb25zdGl0dXRlcyBhbiAgICoKKyogIGVzc2VudGlhbCBwYXJ0IG9mIHRoaXMgTGljZW5zZS4gTm8gdXNlIG9mIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGlzICAgKgorKiAgYXV0aG9yaXplZCB1bmRlciB0aGlzIExpY2Vuc2UgZXhjZXB0IHVuZGVyIHRoaXMgZGlzY2xhaW1lci4gICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgNy4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LCB3aGV0aGVyIHRvcnQgICAgICAqCisqICAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLCBzaGFsbCBhbnkgICAgICAgICAgICoKKyogIENvbnRyaWJ1dG9yLCBvciBhbnlvbmUgd2hvIGRpc3RyaWJ1dGVzIENvdmVyZWQgU29mdHdhcmUgYXMgICAgICAgICAgKgorKiAgcGVybWl0dGVkIGFib3ZlLCBiZSBsaWFibGUgdG8gWW91IGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgICAgICAgICAqCisqICBzcGVjaWFsLCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciAgICAgICoKKyogIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBkYW1hZ2VzIGZvciBsb3N0IHByb2ZpdHMsIGxvc3Mgb2YgICAgKgorKiAgZ29vZHdpbGwsIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSAgICAqCisqICBhbmQgYWxsIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMsIGV2ZW4gaWYgc3VjaCBwYXJ0eSAgICAgICoKKyogIHNoYWxsIGhhdmUgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLiBUaGlzICAgKgorKiAgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkgc2hhbGwgbm90IGFwcGx5IHRvIGxpYWJpbGl0eSBmb3IgZGVhdGggb3IgICAqCisqICBwZXJzb25hbCBpbmp1cnkgcmVzdWx0aW5nIGZyb20gc3VjaCBwYXJ0eSdzIG5lZ2xpZ2VuY2UgdG8gdGhlICAgICAgICoKKyogIGV4dGVudCBhcHBsaWNhYmxlIGxhdyBwcm9oaWJpdHMgc3VjaCBsaW1pdGF0aW9uLiBTb21lICAgICAgICAgICAgICAgKgorKiAganVyaXNkaWN0aW9ucyBkbyBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvciBsaW1pdGF0aW9uIG9mICAgICAgICAgICAqCisqICBpbmNpZGVudGFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc28gdGhpcyBleGNsdXNpb24gYW5kICAgICAgICAgICoKKyogIGxpbWl0YXRpb24gbWF5IG5vdCBhcHBseSB0byBZb3UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOC4gTGl0aWdhdGlvbgorLS0tLS0tLS0tLS0tLQorCitBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2UgbWF5IGJlIGJyb3VnaHQgb25seSBpbiB0aGUKK2NvdXJ0cyBvZiBhIGp1cmlzZGljdGlvbiB3aGVyZSB0aGUgZGVmZW5kYW50IG1haW50YWlucyBpdHMgcHJpbmNpcGFsCitwbGFjZSBvZiBidXNpbmVzcyBhbmQgc3VjaCBsaXRpZ2F0aW9uIHNoYWxsIGJlIGdvdmVybmVkIGJ5IGxhd3Mgb2YgdGhhdAoranVyaXNkaWN0aW9uLCB3aXRob3V0IHJlZmVyZW5jZSB0byBpdHMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuCitOb3RoaW5nIGluIHRoaXMgU2VjdGlvbiBzaGFsbCBwcmV2ZW50IGEgcGFydHkncyBhYmlsaXR5IHRvIGJyaW5nCitjcm9zcy1jbGFpbXMgb3IgY291bnRlci1jbGFpbXMuCisKKzkuIE1pc2NlbGxhbmVvdXMKKy0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHRoZSBzdWJqZWN0CittYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlCit1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQKK25lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMKK3RoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIKK3NoYWxsIG5vdCBiZSB1c2VkIHRvIGNvbnN0cnVlIHRoaXMgTGljZW5zZSBhZ2FpbnN0IGEgQ29udHJpYnV0b3IuCisKKzEwLiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEwLjEuIE5ldyBWZXJzaW9ucworCitNb3ppbGxhIEZvdW5kYXRpb24gaXMgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24KKzEwLjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgb3IKK3B1Ymxpc2ggbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQorZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuCisKKzEwLjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMKKworWW91IG1heSBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbgorb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUsCitvciB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2UKK3N0ZXdhcmQuCisKKzEwLjMuIE1vZGlmaWVkIFZlcnNpb25zCisKK0lmIHlvdSBjcmVhdGUgc29mdHdhcmUgbm90IGdvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIHlvdSB3YW50IHRvCitjcmVhdGUgYSBuZXcgbGljZW5zZSBmb3Igc3VjaCBzb2Z0d2FyZSwgeW91IG1heSBjcmVhdGUgYW5kIHVzZSBhCittb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiB5b3UgcmVuYW1lIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUKK2FueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQKK3N1Y2ggbW9kaWZpZWQgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKS4KKworMTAuNC4gRGlzdHJpYnV0aW5nIFNvdXJjZSBDb2RlIEZvcm0gdGhhdCBpcyBJbmNvbXBhdGlibGUgV2l0aCBTZWNvbmRhcnkKK0xpY2Vuc2VzCisKK0lmIFlvdSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSBTb3VyY2UgQ29kZSBGb3JtIHRoYXQgaXMgSW5jb21wYXRpYmxlIFdpdGgKK1NlY29uZGFyeSBMaWNlbnNlcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCB0aGUKK25vdGljZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBCIG9mIHRoaXMgTGljZW5zZSBtdXN0IGJlIGF0dGFjaGVkLgorCitFeGhpYml0IEEgLSBTb3VyY2UgQ29kZSBGb3JtIExpY2Vuc2UgTm90aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpYworICBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKK0lmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyCitmaWxlLCB0aGVuIFlvdSBtYXkgaW5jbHVkZSB0aGUgbm90aWNlIGluIGEgbG9jYXRpb24gKHN1Y2ggYXMgYSBMSUNFTlNFCitmaWxlIGluIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHJlY2lwaWVudCB3b3VsZCBiZSBsaWtlbHkgdG8gbG9vaworZm9yIHN1Y2ggYSBub3RpY2UuCisKK1lvdSBtYXkgYWRkIGFkZGl0aW9uYWwgYWNjdXJhdGUgbm90aWNlcyBvZiBjb3B5cmlnaHQgb3duZXJzaGlwLgorCitFeGhpYml0IEIgLSAiSW5jb21wYXRpYmxlIFdpdGggU2Vjb25kYXJ5IExpY2Vuc2VzIiBOb3RpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyAiSW5jb21wYXRpYmxlIFdpdGggU2Vjb25kYXJ5IExpY2Vuc2VzIiwgYXMKKyAgZGVmaW5lZCBieSB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSwgdi4gMi4wLgpkaWZmIC0tZ2l0IGEvQ09QWUlORy5SRUFETUUgYi9DT1BZSU5HLlJFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDcwNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORy5SRUFETUUKQEAgLTAsMCArMSwxNSBAQAorRWlnZW4gaXMgcHJpbWFyaWx5IE1QTDIgbGljZW5zZWQuIFNlZSBDT1BZSU5HLk1QTDIgYW5kIHRoZXNlIGxpbmtzOgorICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8yLjAvCisgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLzIuMC9GQVEuaHRtbAorCitTb21lIGZpbGVzIGNvbnRhaW4gdGhpcmQtcGFydHkgY29kZSB1bmRlciBCU0Qgb3IgTEdQTCBsaWNlbnNlcywgd2hlbmNlIHRoZSBvdGhlcgorQ09QWUlORy4qIGZpbGVzIGhlcmUuCisKK0lmIHlvdSB3YW50IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBFaWdlbiBjb2RlIHRoYXQgeW91IGFyZSAjaW5jbHVkaW5nIGlzIGxpY2Vuc2VkCit1bmRlciB0aGUgTVBMMiBhbmQgcG9zc2libHkgbW9yZSBwZXJtaXNzaXZlIGxpY2Vuc2VzIChsaWtlIEJTRCksICNkZWZpbmUgdGhpcworcHJlcHJvY2Vzc29yIHN5bWJvbDoKKyAgRUlHRU5fTVBMMl9PTkxZCitGb3IgZXhhbXBsZSwgd2l0aCBtb3N0IGNvbXBpbGVycywgeW91IGNvdWxkIGFkZCB0aGlzIHRvIHlvdXIgcHJvamVjdCBDWFhGTEFHUzoKKyAgLURFSUdFTl9NUEwyX09OTFkKK1RoaXMgd2lsbCBjYXVzZSBhIGNvbXBpbGF0aW9uIGVycm9yIHRvIGJlIGdlbmVyYXRlZCBpZiB5b3UgI2luY2x1ZGUgYW55IGNvZGUgdGhhdCBpcworTEdQTCBsaWNlbnNlZC4KZGlmZiAtLWdpdCBhL0NUZXN0Q29uZmlnLmNtYWtlIGIvQ1Rlc3RDb25maWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhNGViMAotLS0gL2Rldi9udWxsCisrKyBiL0NUZXN0Q29uZmlnLmNtYWtlCkBAIC0wLDAgKzEsMTMgQEAKKyMjIFRoaXMgZmlsZSBzaG91bGQgYmUgcGxhY2VkIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB5b3VyIHByb2plY3QuCisjIyBUaGVuIG1vZGlmeSB0aGUgQ01ha2VMaXN0cy50eHQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgeW91cgorIyMgcHJvamVjdCB0byBpbmNvcnBvcmF0ZSB0aGUgdGVzdGluZyBkYXNoYm9hcmQuCisjIyAjIFRoZSBmb2xsb3dpbmcgYXJlIHJlcXVpcmVkIHRvIHVzZXMgRGFydCBhbmQgdGhlIENkYXNoIGRhc2hib2FyZAorIyMgICBFTkFCTEVfVEVTVElORygpCisjIyAgIElOQ0xVREUoQ1Rlc3QpCitzZXQoQ1RFU1RfUFJPSkVDVF9OQU1FICJFaWdlbiIpCitzZXQoQ1RFU1RfTklHSFRMWV9TVEFSVF9USU1FICIwMDowMDowMCBVVEMiKQorCitzZXQoQ1RFU1RfRFJPUF9NRVRIT0QgImh0dHAiKQorc2V0KENURVNUX0RST1BfU0lURSAibWFuYW8uaW5yaWEuZnIiKQorc2V0KENURVNUX0RST1BfTE9DQVRJT04gIi9DRGFzaC9zdWJtaXQucGhwP3Byb2plY3Q9RWlnZW4iKQorc2V0KENURVNUX0RST1BfU0lURV9DREFTSCBUUlVFKQpkaWZmIC0tZ2l0IGEvQ1Rlc3RDdXN0b20uY21ha2UuaW4gYi9DVGVzdEN1c3RvbS5jbWFrZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjJiYWNhCi0tLSAvZGV2L251bGwKKysrIGIvQ1Rlc3RDdXN0b20uY21ha2UuaW4KQEAgLTAsMCArMSw0IEBACisKKyMjIEEgdHJpYnV0ZSB0byBEeW5hbWljIQorc2V0KENURVNUX0NVU1RPTV9NQVhJTVVNX05VTUJFUl9PRl9XQVJOSU5HUyAiMzMzMzEiKQorc2V0KENURVNUX0NVU1RPTV9NQVhJTVVNX05VTUJFUl9PRl9FUlJPUlMgIjMzMzMxIikKZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWJhZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC0wLDAgKzEsNTIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgSWYgeW91IGRvbid0IG5lZWQgdG8gZG8gYSBmdWxsIGNsZWFuIGJ1aWxkIGJ1dCB3b3VsZCBsaWtlIHRvIHRvdWNoCisjIGEgZmlsZSBvciBkZWxldGUgc29tZSBpbnRlcm1lZGlhdGUgZmlsZXMsIGFkZCBhIGNsZWFuIHN0ZXAgdG8gdGhlIGVuZAorIyBvZiB0aGUgbGlzdC4gIFRoZXNlIHN0ZXBzIHdpbGwgb25seSBiZSBydW4gb25jZSwgaWYgdGhleSBoYXZlbid0IGJlZW4KKyMgcnVuIGJlZm9yZS4KKyMKKyMgRS5nLjoKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgdG91Y2ggLWMgZXh0ZXJuYWwvc3FsaXRlL3NxbGl0ZTMuaCkKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TVEFUSUNfTElCUkFSSUVTL2xpYnpfaW50ZXJtZWRpYXRlcykKKyMKKyMgQWx3YXlzIHVzZSAidG91Y2ggLWMiIGFuZCAicm0gLWYiIG9yICJybSAtcmYiIHRvIGdyYWNlZnVsbHkgZGVhbCB3aXRoCisjIGZpbGVzIHRoYXQgYXJlIG1pc3Npbmcgb3IgaGF2ZSBiZWVuIG1vdmVkLgorIworIyBVc2UgJChQUk9EVUNUX09VVCkgdG8gZ2V0IHRvIHRoZSAib3V0L3RhcmdldC9wcm9kdWN0L2JsYWgvIiBkaXJlY3RvcnkuCisjIFVzZSAkKE9VVF9ESVIpIHRvIHJlZmVyIHRvIHRoZSAib3V0IiBkaXJlY3RvcnkuCisjCisjIElmIHlvdSBuZWVkIHRvIHJlLWRvIHNvbWV0aGluZyB0aGF0J3MgYWxyZWFkeSBtZW50aW9uZWQsIGp1c3QgY29weQorIyB0aGUgY29tbWFuZCBhbmQgYWRkIGl0IHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICBFLmcuLCBpZiBhIGNoYW5nZQorIyB0aGF0IHlvdSBtYWRlIGxhc3Qgd2VlayByZXF1aXJlZCB0b3VjaGluZyBhIGZpbGUgYW5kIGEgY2hhbmdlIHlvdQorIyBtYWRlIHRvZGF5IHJlcXVpcmVzIHRvdWNoaW5nIHRoZSBzYW1lIGZpbGUsIGp1c3QgY29weSB0aGUgb2xkCisjIHRvdWNoIHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorIworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjIEZvciBleGFtcGxlOgorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9BbmRyb2lkVGVzdHNfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICJJR1RhbGtTZXNzaW9uKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL2RhdGEvKikKKworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjIFRoaXMgZW1wdHkgZmlsZSBpcyBoZXJlIHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2Ygb3B0aW1pemluZyB0aGUgQW5kcm9pZCBidWlsZAorIyBQbGVhc2Uga2VlcCBpdCB0aGVyZSwgYW5kIGVtcHR5LCB0aGFua3MuCmRpZmYgLS1naXQgYS9FaWdlbi9BcnJheSBiL0VpZ2VuL0FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDA0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9BcnJheQpAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIEVJR0VOX0FSUkFZX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX0FSUkFZX01PRFVMRV9ICisKKy8vIGluY2x1ZGUgQ29yZSBmaXJzdCB0byBoYW5kbGUgRWlnZW4yIHN1cHBvcnQgbWFjcm9zCisjaW5jbHVkZSAiQ29yZSIKKworI2lmbmRlZiBFSUdFTjJfU1VQUE9SVAorICAjZXJyb3IgVGhlIEVpZ2VuL0FycmF5IGhlYWRlciBkb2VzIG5vIGxvbmdlciBleGlzdCBpbiBFaWdlbjMuIEFsbCB0aGF0IGZ1bmN0aW9uYWxpdHkgaGFzIG1vdmVkIHRvIEVpZ2VuL0NvcmUuCisjZW5kaWYKKworI2VuZGlmIC8vIEVJR0VOX0FSUkFZX01PRFVMRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MmRkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE5IEBACitpbmNsdWRlKFJlZ2V4VXRpbHMpCit0ZXN0X2VzY2FwZV9zdHJpbmdfYXNfcmVnZXgoKQorCitmaWxlKEdMT0IgRWlnZW5fZGlyZWN0b3J5X2ZpbGVzICIqIikKKworZXNjYXBlX3N0cmluZ19hc19yZWdleChFU0NBUEVEX0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUiAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKworZm9yZWFjaChmICR7RWlnZW5fZGlyZWN0b3J5X2ZpbGVzfSkKKyAgaWYoTk9UIGYgTUFUQ0hFUyAiXFwudHh0IiBBTkQgTk9UIGYgTUFUQ0hFUyAiJHtFU0NBUEVEX0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vWy5dLisiIEFORCBOT1QgZiBNQVRDSEVTICIke0VTQ0FQRURfQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMiKQorICAgIGxpc3QoQVBQRU5EIEVpZ2VuX2RpcmVjdG9yeV9maWxlc190b19pbnN0YWxsICR7Zn0pCisgIGVuZGlmKCkKK2VuZGZvcmVhY2goZiAke0VpZ2VuX2RpcmVjdG9yeV9maWxlc30pCisKK2luc3RhbGwoRklMRVMKKyAgJHtFaWdlbl9kaXJlY3RvcnlfZmlsZXNfdG9faW5zdGFsbH0KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS9FaWdlbiBDT01QT05FTlQgRGV2ZWwKKyAgKQorCithZGRfc3ViZGlyZWN0b3J5KHNyYykKZGlmZiAtLWdpdCBhL0VpZ2VuL0Nob2xlc2t5IGIvRWlnZW4vQ2hvbGVza3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyN2Y1ZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL0Nob2xlc2t5CkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgRUlHRU5fQ0hPTEVTS1lfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fQ0hPTEVTS1lfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisvKiogXGRlZmdyb3VwIENob2xlc2t5X01vZHVsZSBDaG9sZXNreSBtb2R1bGUKKyAgKgorICAqCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB0d28gdmFyaWFudHMgb2YgdGhlIENob2xlc2t5IGRlY29tcG9zaXRpb24gZm9yIHNlbGZhZGpvaW50IChoZXJtaXRpYW4pIG1hdHJpY2VzLgorICAqIFRob3NlIGRlY29tcG9zaXRpb25zIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgZm9sbG93aW5nIE1hdHJpeEJhc2UgbWV0aG9kczoKKyAgKiAgLSBNYXRyaXhCYXNlOjpsbHQoKSwKKyAgKiAgLSBNYXRyaXhCYXNlOjpsZGx0KCkKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvbWlzYy9Tb2x2ZS5oIgorI2luY2x1ZGUgInNyYy9DaG9sZXNreS9MTFQuaCIKKyNpbmNsdWRlICJzcmMvQ2hvbGVza3kvTERMVC5oIgorI2lmZGVmIEVJR0VOX1VTRV9MQVBBQ0tFCisjaW5jbHVkZSAic3JjL0Nob2xlc2t5L0xMVF9NS0wuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9DSE9MRVNLWV9NT0RVTEVfSAorLyogdmltOiBzZXQgZmlsZXR5cGU9Y3BwIGV0IHN3PTIgdHM9MiBhaTogKi8KZGlmZiAtLWdpdCBhL0VpZ2VuL0Nob2xtb2RTdXBwb3J0IGIvRWlnZW4vQ2hvbG1vZFN1cHBvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1Yjg4NAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL0Nob2xtb2RTdXBwb3J0CkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgRUlHRU5fQ0hPTE1PRFNVUFBPUlRfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fQ0hPTE1PRFNVUFBPUlRfTU9EVUxFX0gKKworI2luY2x1ZGUgIlNwYXJzZUNvcmUiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCitleHRlcm4gIkMiIHsKKyAgI2luY2x1ZGUgPGNob2xtb2QuaD4KK30KKworLyoqIFxpbmdyb3VwIFN1cHBvcnRfbW9kdWxlcworICAqIFxkZWZncm91cCBDaG9sbW9kU3VwcG9ydF9Nb2R1bGUgQ2hvbG1vZFN1cHBvcnQgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIENob2xtb2QgbGlicmFyeSB3aGljaCBpcyBwYXJ0IG9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmNpc2UudWZsLmVkdS9yZXNlYXJjaC9zcGFyc2UvU3VpdGVTcGFyc2UvIj5zdWl0ZXNwYXJzZTwvYT4gcGFja2FnZS4KKyAgKiBJdCBwcm92aWRlcyB0aGUgdHdvIGZvbGxvd2luZyBtYWluIGZhY3Rvcml6YXRpb24gY2xhc3NlczoKKyAgKiAtIGNsYXNzIENob2xtb2RTdXBlcm5vZGFsTExUOiBhIHN1cGVybm9kYWwgTExUIENob2xlc2t5IGZhY3Rvcml6YXRpb24uCisgICogLSBjbGFzcyBDaG9sbW9kRGVjb21wb3NpaXRvbjogYSBnZW5lcmFsIEwoRClMVCBDaG9sZXNreSBmYWN0b3JpemF0aW9uIHdpdGggYXV0b21hdGljIG9yIGV4cGxpY2l0IHJ1bnRpbWUgc2VsZWN0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIGZhY3Rvcml6YXRpb24gbWV0aG9kIChzdXBlcm5vZGFsIG9yIHNpbXBsaWNpYWwpLgorICAqCisgICogRm9yIHRoZSBzYWtlIG9mIGNvbXBsZXRlbmVzcywgdGhpcyBtb2R1bGUgYWxzbyBwcm9wb3NlIHRoZSB0d28gZm9sbG93aW5nIGNsYXNzZXM6CisgICogLSBjbGFzcyBDaG9sbW9kU2ltcGxpY2lhbExMVAorICAqIC0gY2xhc3MgQ2hvbG1vZFNpbXBsaWNpYWxMRExUCisgICogTm90ZSB0aGF0IHRoZXNlIGNsYXNzZXMgZG9lcyBub3QgYnJpbmcgYW55IHBhcnRpY3VsYXIgYWR2YW50YWdlIGNvbXBhcmVkIHRvIHRoZSBidWlsdC1pbgorICAqIFNpbXBsaWNpYWxMTFQgYW5kIFNpbXBsaWNpYWxMRExUIGZhY3Rvcml6YXRpb24gY2xhc3Nlcy4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0Nob2xtb2RTdXBwb3J0PgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBJbiBvcmRlciB0byB1c2UgdGhpcyBtb2R1bGUsIHRoZSBjaG9sbW9kIGhlYWRlcnMgbXVzdCBiZSBhY2Nlc3NpYmxlIGZyb20gdGhlIGluY2x1ZGUgcGF0aHMsIGFuZCB5b3VyIGJpbmFyeSBtdXN0IGJlIGxpbmtlZCB0byB0aGUgY2hvbG1vZCBsaWJyYXJ5IGFuZCBpdHMgZGVwZW5kZW5jaWVzLgorICAqIFRoZSBkZXBlbmRlbmNpZXMgZGVwZW5kIG9uIGhvdyBjaG9sbW9kIGhhcyBiZWVuIGNvbXBpbGVkLgorICAqIEZvciBhIGNtYWtlIGJhc2VkIHByb2plY3QsIHlvdSBjYW4gdXNlIG91ciBGaW5kQ2hvbG1vZC5jbWFrZSBtb2R1bGUgdG8gaGVscCB5b3UgaW4gdGhpcyB0YXNrLgorICAqCisgICovCisKKyNpbmNsdWRlICJzcmMvbWlzYy9Tb2x2ZS5oIgorI2luY2x1ZGUgInNyYy9taXNjL1NwYXJzZVNvbHZlLmgiCisKKyNpbmNsdWRlICJzcmMvQ2hvbG1vZFN1cHBvcnQvQ2hvbG1vZFN1cHBvcnQuaCIKKworCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9DSE9MTU9EU1VQUE9SVF9NT0RVTEVfSAorCmRpZmYgLS1naXQgYS9FaWdlbi9Db3JlIGIvRWlnZW4vQ29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDgwMTcwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vQ29yZQpAQCAtMCwwICsxLDM2NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09SRV9ICisjZGVmaW5lIEVJR0VOX0NPUkVfSAorCisvLyBmaXJzdCB0aGluZyBFaWdlbiBkb2VzOiBzdG9wIHRoZSBjb21waWxlciBmcm9tIGNvbW1pdHRpbmcgc3VpY2lkZQorI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKy8vIHRoZW4gaW5jbHVkZSB0aGlzIGZpbGUgd2hlcmUgYWxsIG91ciBtYWNyb3MgYXJlIGRlZmluZWQuIEl0J3MgcmVhbGx5IGltcG9ydGFudCB0byBkbyBpdCBmaXJzdCBiZWNhdXNlCisvLyBpdCdzIHdoZXJlIHdlIGRvIGFsbCB0aGUgYWxpZ25tZW50IHNldHRpbmdzIChwbGF0Zm9ybSBkZXRlY3Rpb24gYW5kIGhvbm9yaW5nIHRoZSB1c2VyJ3Mgd2lsbCBpZiBoZQorLy8gZGVmaW5lZCBlLmcuIEVJR0VOX0RPTlRfQUxJR04pIHNvIGl0IG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHdlIGRvIGFueXRoaW5nIHdpdGggdmVjdG9yaXphdGlvbi4KKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL01hY3Jvcy5oIgorCisjaW5jbHVkZSA8Y29tcGxleD4KKworLy8gdGhpcyBpbmNsdWRlIGZpbGUgbWFuYWdlcyBCTEFTIGFuZCBNS0wgcmVsYXRlZCBtYWNyb3MKKy8vIGFuZCBpbmNsdXNpb24gb2YgdGhlaXIgcmVzcGVjdGl2ZSBoZWFkZXIgZmlsZXMKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL01LTF9zdXBwb3J0LmgiCisKKy8vIGlmIGFsaWdubWVudCBpcyBkaXNhYmxlZCwgdGhlbiBkaXNhYmxlIHZlY3Rvcml6YXRpb24uIE5vdGU6IEVJR0VOX0FMSUdOIGlzIHRoZSBwcm9wZXIgY2hlY2ssIGl0IHRha2VzIGludG8KKy8vIGFjY291bnQgYm90aCB0aGUgdXNlcidzIHdpbGwgKEVJR0VOX0RPTlRfQUxJR04pIGFuZCBvdXIgb3duIHBsYXRmb3JtIGNoZWNrcworI2lmICFFSUdFTl9BTElHTgorICAjaWZuZGVmIEVJR0VOX0RPTlRfVkVDVE9SSVpFCisgICAgI2RlZmluZSBFSUdFTl9ET05UX1ZFQ1RPUklaRQorICAjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX01TQ19WRVIKKyAgI2luY2x1ZGUgPG1hbGxvYy5oPiAvLyBmb3IgX2FsaWduZWRfbWFsbG9jIC0tIG5lZWQgaXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHZlY3Rvcml6YXRpb24gaXMgZW5hYmxlZAorICAjaWYgKF9NU0NfVkVSID49IDE1MDApIC8vIDIwMDggb3IgbGF0ZXIKKyAgICAvLyBSZW1lbWJlciB0aGF0IHVzYWdlIG9mIGRlZmluZWQoKSBpbiBhICNkZWZpbmUgaXMgdW5kZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAvLyBhIHVzZXIgcmVwb3J0ZWQgdGhhdCBpbiA2NC1iaXQgbW9kZSwgTVNWQyBkb2Vzbid0IGNhcmUgdG8gZGVmaW5lIF9NX0lYODZfRlAuCisgICAgI2lmIChkZWZpbmVkKF9NX0lYODZfRlApICYmIChfTV9JWDg2X0ZQID49IDIpKSB8fCBkZWZpbmVkKF9NX1g2NCkKKyAgICAgICNkZWZpbmUgRUlHRU5fU1NFMl9PTl9NU1ZDXzIwMDhfT1JfTEFURVIKKyAgICAjZW5kaWYKKyAgI2VuZGlmCisjZWxzZQorICAvLyBSZW1lbWJlciB0aGF0IHVzYWdlIG9mIGRlZmluZWQoKSBpbiBhICNkZWZpbmUgaXMgdW5kZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZAorICAjaWYgKGRlZmluZWQgX19TU0UyX18pICYmICggKCFkZWZpbmVkIF9fR05VQ19fKSB8fCBFSUdFTl9HTlVDX0FUX0xFQVNUKDQsMikgKQorICAgICNkZWZpbmUgRUlHRU5fU1NFMl9PTl9OT05fTVNWQ19CVVRfTk9UX09MRF9HQ0MKKyAgI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9ET05UX1ZFQ1RPUklaRQorCisgICNpZiBkZWZpbmVkIChFSUdFTl9TU0UyX09OX05PTl9NU1ZDX0JVVF9OT1RfT0xEX0dDQykgfHwgZGVmaW5lZChFSUdFTl9TU0UyX09OX01TVkNfMjAwOF9PUl9MQVRFUikKKworICAgIC8vIERlZmluZXMgc3ltYm9scyBmb3IgY29tcGlsZS10aW1lIGRldGVjdGlvbiBvZiB3aGljaCBpbnN0cnVjdGlvbnMgYXJlCisgICAgLy8gdXNlZC4KKyAgICAvLyBFSUdFTl9WRUNUT1JJWkVfWVkgaXMgZGVmaW5lZCBpZiBhbmQgb25seSBpZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0IFlZIGlzIHVzZWQKKyAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRQorICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1NTRQorICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1NTRTIKKworICAgIC8vIERldGVjdCBzc2UzL3Nzc2UzL3NzZTQ6CisgICAgLy8gZ2NjIGFuZCBpY2MgZGVmaW5lcyBfX1NTRTNfXywgLi4uCisgICAgLy8gdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgYWJvdXQgdGhpcyBvbiBtc3ZjLiBZb3UgY2FuIGRlZmluZSBFSUdFTl9WRUNUT1JJWkVfU1NFKiBpZiB5b3UKKyAgICAvLyB3YW50IHRvIGZvcmNlIHRoZSB1c2Ugb2YgdGhvc2UgaW5zdHJ1Y3Rpb25zIHdpdGggbXN2Yy4KKyAgICAjaWZkZWYgX19TU0UzX18KKyAgICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX1NTRTMKKyAgICAjZW5kaWYKKyAgICAjaWZkZWYgX19TU1NFM19fCisgICAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9TU1NFMworICAgICNlbmRpZgorICAgICNpZmRlZiBfX1NTRTRfMV9fCisgICAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9TU0U0XzEKKyAgICAjZW5kaWYKKyAgICAjaWZkZWYgX19TU0U0XzJfXworICAgICAgI2RlZmluZSBFSUdFTl9WRUNUT1JJWkVfU1NFNF8yCisgICAgI2VuZGlmCisKKyAgICAvLyBpbmNsdWRlIGZpbGVzCisKKyAgICAvLyBUaGlzIGV4dGVybiAiQyIgd29ya3MgYXJvdW5kIGEgTUlOR1ctdzY0IGNvbXBpbGF0aW9uIGlzc3VlCisgICAgLy8gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci9pbmRleC5waHA/ZnVuYz1kZXRhaWwmYWlkPTMwMTgzOTQmZ3JvdXBfaWQ9MjAyODgwJmF0aWQ9OTgzMzU0CisgICAgLy8gSW4gZXNzZW5jZSwgaW50cmluLmggaXMgaW5jbHVkZWQgYnkgd2luZG93cy5oIGFuZCBhbHNvIGRlY2xhcmVzIGludHJpbnNpY3MgKGp1c3QgYXMgZW1taW50cmluLmggZXRjLiBiZWxvdyBkbykuCisgICAgLy8gSG93ZXZlciwgaW50cmluLmggdXNlcyBhbiBleHRlcm4gIkMiIGRlY2xhcmF0aW9uLCBhbmQgZysrIHRodXMgY29tcGxhaW5zIG9mIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMKKyAgICAvLyB3aXRoIGNvbmZsaWN0aW5nIGxpbmthZ2UuICBUaGUgbGlua2FnZSBmb3IgaW50cmluc2ljcyBkb2Vzbid0IG1hdHRlciwgYnV0IGF0IHRoYXQgc3RhZ2UgdGhlIGNvbXBpbGVyIGRvZXNuJ3Qga25vdzsKKyAgICAvLyBzbywgdG8gYXZvaWQgY29tcGlsZSBlcnJvcnMgd2hlbiB3aW5kb3dzLmggaXMgaW5jbHVkZWQgYWZ0ZXIgRWlnZW4vQ29yZSwgZW5zdXJlIGludHJpbnNpY3MgYXJlIGV4dGVybiAiQyIgaGVyZSB0b28uCisgICAgLy8gbm90aWNlIHRoYXQgc2luY2UgdGhlc2UgYXJlIEMgaGVhZGVycywgdGhlIGV4dGVybiAiQyIgaXMgdGhlb3JldGljYWxseSBuZWVkZWQgYW55d2F5cy4KKyAgICBleHRlcm4gIkMiIHsKKyAgICAgICNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyAgICAgICNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyAgICAgICNpZmRlZiAgRUlHRU5fVkVDVE9SSVpFX1NTRTMKKyAgICAgICNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKyAgICAgICNlbmRpZgorICAgICAgI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU1NFMworICAgICAgI2luY2x1ZGUgPHRtbWludHJpbi5oPgorICAgICAgI2VuZGlmCisgICAgICAjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMQorICAgICAgI2luY2x1ZGUgPHNtbWludHJpbi5oPgorICAgICAgI2VuZGlmCisgICAgICAjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTRfMgorICAgICAgI2luY2x1ZGUgPG5tbWludHJpbi5oPgorICAgICAgI2VuZGlmCisgICAgfSAvLyBlbmQgZXh0ZXJuICJDIgorICAjZWxpZiBkZWZpbmVkIF9fQUxUSVZFQ19fCisgICAgI2RlZmluZSBFSUdFTl9WRUNUT1JJWkUKKyAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRV9BTFRJVkVDCisgICAgI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyAgICAvLyBXZSBuZWVkIHRvICN1bmRlZiBhbGwgdGhlc2UgdWdseSB0b2tlbnMgZGVmaW5lZCBpbiA8YWx0aXZlYy5oPgorICAgIC8vID0+IHVzZSBfX3ZlY3RvciBpbnN0ZWFkIG9mIHZlY3RvcgorICAgICN1bmRlZiBib29sCisgICAgI3VuZGVmIHZlY3RvcgorICAgICN1bmRlZiBwaXhlbAorICAjZWxpZiBkZWZpbmVkICBfX0FSTV9ORU9OX18KKyAgICAjZGVmaW5lIEVJR0VOX1ZFQ1RPUklaRQorICAgICNkZWZpbmUgRUlHRU5fVkVDVE9SSVpFX05FT04KKyAgICAjaW5jbHVkZSA8YXJtX25lb24uaD4KKyAgI2VuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9PUEVOTVApICYmICghZGVmaW5lZCBFSUdFTl9ET05UX1BBUkFMTEVMSVpFKQorICAjZGVmaW5lIEVJR0VOX0hBU19PUEVOTVAKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fSEFTX09QRU5NUAorI2luY2x1ZGUgPG9tcC5oPgorI2VuZGlmCisKKy8vIE1TVkMgZm9yIHdpbmRvd3MgbW9iaWxlIGRvZXMgbm90IGhhdmUgdGhlIGVycm5vLmggZmlsZQorI2lmICEoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfV0lOMzJfV0NFKSkgJiYgIWRlZmluZWQoX19BUk1DQ19WRVJTSU9OKQorI2RlZmluZSBFSUdFTl9IQVNfRVJSTk8KKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fSEFTX0VSUk5PCisjaW5jbHVkZSA8Y2Vycm5vPgorI2VuZGlmCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGNsaW1pdHM+IC8vIGZvciBDSEFSX0JJVAorLy8gZm9yIG1pbi9tYXg6CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisvLyBmb3Igb3V0cHV0dGluZyBkZWJ1ZyBpbmZvCisjaWZkZWYgRUlHRU5fREVCVUdfQVNTSUdOCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKworLy8gcmVxdWlyZWQgZm9yIF9fY3B1aWQsIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGFmdGVyIGNtYXRoCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKGRlZmluZWQoX01fSVg4Nil8fGRlZmluZWQoX01fWDY0KSkKKyAgI2luY2x1ZGUgPGludHJpbi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9DUFBVTldJTkQpIHx8IGRlZmluZWQoX19FWENFUFRJT05TKQorICAjZGVmaW5lIEVJR0VOX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fRVhDRVBUSU9OUworICAjaW5jbHVkZSA8bmV3PgorI2VuZGlmCisKKy8qKiBcYnJpZWYgTmFtZXNwYWNlIGNvbnRhaW5pbmcgYWxsIHN5bWJvbHMgZnJvbSB0aGUgJUVpZ2VuIGxpYnJhcnkuICovCituYW1lc3BhY2UgRWlnZW4geworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKlNpbWRJbnN0cnVjdGlvblNldHNJblVzZSh2b2lkKSB7CisjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NFNF8yKQorICByZXR1cm4gIlNTRSwgU1NFMiwgU1NFMywgU1NTRTMsIFNTRTQuMSwgU1NFNC4yIjsKKyNlbGlmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX1NTRTRfMSkKKyAgcmV0dXJuICJTU0UsIFNTRTIsIFNTRTMsIFNTU0UzLCBTU0U0LjEiOworI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NTRTMpCisgIHJldHVybiAiU1NFLCBTU0UyLCBTU0UzLCBTU1NFMyI7CisjZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9TU0UzKQorICByZXR1cm4gIlNTRSwgU1NFMiwgU1NFMyI7CisjZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9TU0UyKQorICByZXR1cm4gIlNTRSwgU1NFMiI7CisjZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9BTFRJVkVDKQorICByZXR1cm4gIkFsdGlWZWMiOworI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfTkVPTikKKyAgcmV0dXJuICJBUk0gTkVPTiI7CisjZWxzZQorICByZXR1cm4gIk5vbmUiOworI2VuZGlmCit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZGVmaW5lIFNUQUdFMTBfRlVMTF9FSUdFTjJfQVBJICAgICAgICAgICAgIDEwCisjZGVmaW5lIFNUQUdFMjBfUkVTT0xWRV9BUElfQ09ORkxJQ1RTICAgICAgIDIwCisjZGVmaW5lIFNUQUdFMzBfRlVMTF9FSUdFTjNfQVBJICAgICAgICAgICAgIDMwCisjZGVmaW5lIFNUQUdFNDBfRlVMTF9FSUdFTjNfU1RSSUNUTkVTUyAgICAgIDQwCisjZGVmaW5lIFNUQUdFOTlfTk9fRUlHRU4yX1NVUFBPUlQgICAgICAgICAgIDk5CisKKyNpZiAgIGRlZmluZWQgRUlHRU4yX1NVUFBPUlRfU1RBR0U0MF9GVUxMX0VJR0VOM19TVFJJQ1RORVNTCisgICNkZWZpbmUgRUlHRU4yX1NVUFBPUlQKKyAgI2RlZmluZSBFSUdFTjJfU1VQUE9SVF9TVEFHRSBTVEFHRTQwX0ZVTExfRUlHRU4zX1NUUklDVE5FU1MKKyNlbGlmIGRlZmluZWQgRUlHRU4yX1NVUFBPUlRfU1RBR0UzMF9GVUxMX0VJR0VOM19BUEkKKyAgI2RlZmluZSBFSUdFTjJfU1VQUE9SVAorICAjZGVmaW5lIEVJR0VOMl9TVVBQT1JUX1NUQUdFIFNUQUdFMzBfRlVMTF9FSUdFTjNfQVBJCisjZWxpZiBkZWZpbmVkIEVJR0VOMl9TVVBQT1JUX1NUQUdFMjBfUkVTT0xWRV9BUElfQ09ORkxJQ1RTCisgICNkZWZpbmUgRUlHRU4yX1NVUFBPUlQKKyAgI2RlZmluZSBFSUdFTjJfU1VQUE9SVF9TVEFHRSBTVEFHRTIwX1JFU09MVkVfQVBJX0NPTkZMSUNUUworI2VsaWYgZGVmaW5lZCBFSUdFTjJfU1VQUE9SVF9TVEFHRTEwX0ZVTExfRUlHRU4yX0FQSQorICAjZGVmaW5lIEVJR0VOMl9TVVBQT1JUCisgICNkZWZpbmUgRUlHRU4yX1NVUFBPUlRfU1RBR0UgU1RBR0UxMF9GVUxMX0VJR0VOMl9BUEkKKyNlbGlmIGRlZmluZWQgRUlHRU4yX1NVUFBPUlQKKyAgLy8gZGVmYXVsdCB0byBzdGFnZSAzLCB0aGF0J3Mgd2hhdCBpdCdzIGFsd2F5cyBtZWFudAorICAjZGVmaW5lIEVJR0VOMl9TVVBQT1JUX1NUQUdFMzBfRlVMTF9FSUdFTjNfQVBJCisgICNkZWZpbmUgRUlHRU4yX1NVUFBPUlRfU1RBR0UgU1RBR0UzMF9GVUxMX0VJR0VOM19BUEkKKyNlbHNlCisgICNkZWZpbmUgRUlHRU4yX1NVUFBPUlRfU1RBR0UgU1RBR0U5OV9OT19FSUdFTjJfU1VQUE9SVAorI2VuZGlmCisKKyNpZmRlZiBFSUdFTjJfU1VQUE9SVAorI3VuZGVmIG1pbm9yCisjZW5kaWYKKworLy8gd2UgdXNlIHNpemVfdCBmcmVxdWVudGx5IGFuZCB3ZSdsbCBuZXZlciByZW1lbWJlciB0byBwcmVwZW5kIGl0IHdpdGggc3RkOjogZXZlcnl0aW1lIGp1c3QgdG8KKy8vIGVuc3VyZSBRTlgvUUNDIHN1cHBvcnQKK3VzaW5nIHN0ZDo6c2l6ZV90OworLy8gZ2NjIDQuNi4wIHdhbnRzIHN0ZDo6IGZvciBwdHJkaWZmX3QgCit1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKworLyoqIFxkZWZncm91cCBDb3JlX01vZHVsZSBDb3JlIG1vZHVsZQorICAqIFRoaXMgaXMgdGhlIG1haW4gbW9kdWxlIG9mIEVpZ2VuIHByb3ZpZGluZyBkZW5zZSBtYXRyaXggYW5kIHZlY3RvciBzdXBwb3J0CisgICogKGJvdGggZml4ZWQgYW5kIGR5bmFtaWMgc2l6ZSkgd2l0aCBhbGwgdGhlIGZlYXR1cmVzIGNvcnJlc3BvbmRpbmcgdG8gYSBCTEFTIGxpYnJhcnkKKyAgKiBhbmQgbXVjaCBtb3JlLi4uCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9Db3JlPgorICAqIFxlbmRjb2RlCisgICovCisKKy8qKiBcZGVmZ3JvdXAgU3VwcG9ydF9tb2R1bGVzIFN1cHBvcnQgbW9kdWxlcyBbY2F0ZWdvcnldCisgICogQ2F0ZWdvcnkgb2YgbW9kdWxlcyB3aGljaCBhZGQgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgbGlicmFyaWVzLgorICAqLworCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0ZvcndhcmREZWNsYXJhdGlvbnMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL01ldGEuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1hwckhlbHBlci5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvU3RhdGljQXNzZXJ0LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9NZW1vcnkuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL051bVRyYWl0cy5oIgorI2luY2x1ZGUgInNyYy9Db3JlL01hdGhGdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9HZW5lcmljUGFja2V0TWF0aC5oIgorCisjaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfU1NFCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9NYXRoRnVuY3Rpb25zLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL1NTRS9Db21wbGV4LmgiCisjZWxpZiBkZWZpbmVkIEVJR0VOX1ZFQ1RPUklaRV9BTFRJVkVDCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0FsdGlWZWMvUGFja2V0TWF0aC5oIgorICAjaW5jbHVkZSAic3JjL0NvcmUvYXJjaC9BbHRpVmVjL0NvbXBsZXguaCIKKyNlbGlmIGRlZmluZWQgRUlHRU5fVkVDVE9SSVpFX05FT04KKyAgI2luY2x1ZGUgInNyYy9Db3JlL2FyY2gvTkVPTi9QYWNrZXRNYXRoLmgiCisgICNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL05FT04vQ29tcGxleC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvQ29yZS9hcmNoL0RlZmF1bHQvU2V0dGluZ3MuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL0Z1bmN0b3JzLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvRGVuc2VDb2VmZnNCYXNlLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvRGVuc2VCYXNlLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvTWF0cml4QmFzZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0VpZ2VuQmFzZS5oIgorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOIC8vIHdvcmsgYXJvdW5kIERveHlnZW4gYnVnIHRyaWdnZXJlZCBieSBBc3NpZ24uaCByODE0ODc0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IGNvbmZpcm1lZCB3aXRoIERveHlnZW4gMS41LjUgYW5kIDEuNS42CisgICNpbmNsdWRlICJzcmMvQ29yZS9Bc3NpZ24uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9CbGFzVXRpbC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0RlbnNlU3RvcmFnZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL05lc3RCeVZhbHVlLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvRm9yY2VBbGlnbmVkQWNjZXNzLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvUmV0dXJuQnlWYWx1ZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL05vQWxpYXMuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9QbGFpbk9iamVjdEJhc2UuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9NYXRyaXguaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9BcnJheS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0N3aXNlQmluYXJ5T3AuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9Dd2lzZVVuYXJ5T3AuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9Dd2lzZU51bGxhcnlPcC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0N3aXNlVW5hcnlWaWV3LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvU2VsZkN3aXNlQmluYXJ5T3AuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9Eb3QuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9TdGFibGVOb3JtLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvTWFwQmFzZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1N0cmlkZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL01hcC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0Jsb2NrLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvVmVjdG9yQmxvY2suaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9UcmFuc3Bvc2UuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9EaWFnb25hbE1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0RpYWdvbmFsLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvRGlhZ29uYWxQcm9kdWN0LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvUGVybXV0YXRpb25NYXRyaXguaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9UcmFuc3Bvc2l0aW9ucy5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1JlZHV4LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvVmlzaXRvci5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0Z1enp5LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvSU8uaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9Td2FwLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvQ29tbWFJbml0aWFsaXplci5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0ZsYWdnZWQuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9Qcm9kdWN0QmFzZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0dlbmVyYWxQcm9kdWN0LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvVHJpYW5ndWxhck1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1NlbGZBZGpvaW50Vmlldy5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxCbG9ja1BhbmVsS2VybmVsLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvUGFyYWxsZWxpemVyLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvQ29lZmZCYXNlZFByb2R1Y3QuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4VmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL1NvbHZlVHJpYW5ndWxhci5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxNYXRyaXhNYXRyaXhUcmlhbmd1bGFyLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRNYXRyaXhWZWN0b3IuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeE1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50UHJvZHVjdC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50UmFuazJVcGRhdGUuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4VmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeE1hdHJpeC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJTb2x2ZXJNYXRyaXguaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyU29sdmVyVmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvQmFuZE1hdHJpeC5oIgorCisjaW5jbHVkZSAic3JjL0NvcmUvQm9vbGVhblJlZHV4LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvU2VsZWN0LmgiCisjaW5jbHVkZSAic3JjL0NvcmUvVmVjdG9yd2lzZU9wLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvUmFuZG9tLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvUmVwbGljYXRlLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvUmV2ZXJzZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0FycmF5QmFzZS5oIgorI2luY2x1ZGUgInNyYy9Db3JlL0FycmF5V3JhcHBlci5oIgorCisjaWZkZWYgRUlHRU5fVVNFX0JMQVMKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4X01LTC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxNYXRyaXhWZWN0b3JfTUtMLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeFRyaWFuZ3VsYXJfTUtMLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRNYXRyaXhNYXRyaXhfTUtMLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRNYXRyaXhWZWN0b3JfTUtMLmgiCisjaW5jbHVkZSAic3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeE1hdHJpeF9NS0wuaCIKKyNpbmNsdWRlICJzcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4VmVjdG9yX01LTC5oIgorI2luY2x1ZGUgInNyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJTb2x2ZXJNYXRyaXhfTUtMLmgiCisjZW5kaWYgLy8gRUlHRU5fVVNFX0JMQVMKKworI2lmZGVmIEVJR0VOX1VTRV9NS0xfVk1MCisjaW5jbHVkZSAic3JjL0NvcmUvQXNzaWduX01LTC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvQ29yZS9HbG9iYWxGdW5jdGlvbnMuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyNpbmNsdWRlICJFaWdlbjJTdXBwb3J0IgorI2VuZGlmCisKKyNlbmRpZiAvLyBFSUdFTl9DT1JFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL0RlbnNlIGIvRWlnZW4vRGVuc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2ODkxMAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL0RlbnNlCkBAIC0wLDAgKzEsNyBAQAorI2luY2x1ZGUgIkNvcmUiCisjaW5jbHVkZSAiTFUiCisjaW5jbHVkZSAiQ2hvbGVza3kiCisjaW5jbHVkZSAiUVIiCisjaW5jbHVkZSAiU1ZEIgorI2luY2x1ZGUgIkdlb21ldHJ5IgorI2luY2x1ZGUgIkVpZ2VudmFsdWVzIgpkaWZmIC0tZ2l0IGEvRWlnZW4vRWlnZW4gYi9FaWdlbi9FaWdlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWI0MGVhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vRWlnZW4KQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiRGVuc2UiCisvLyNpbmNsdWRlICJTcGFyc2UiCmRpZmYgLS1naXQgYS9FaWdlbi9FaWdlbjJTdXBwb3J0IGIvRWlnZW4vRWlnZW4yU3VwcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE1NmQyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vRWlnZW4yU3VwcG9ydApAQCAtMCwwICsxLDgyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU4yU1VQUE9SVF9ICisjZGVmaW5lIEVJR0VOMlNVUFBPUlRfSAorCisjaWYgKCFkZWZpbmVkKEVJR0VOMl9TVVBQT1JUKSkgfHwgKCFkZWZpbmVkKEVJR0VOX0NPUkVfSCkpCisjZXJyb3IgRWlnZW4yIHN1cHBvcnQgbXVzdCBiZSBlbmFibGVkIGJ5IGRlZmluaW5nIEVJR0VOMl9TVVBQT1JUIGJlZm9yZSBpbmNsdWRpbmcgYW55IEVpZ2VuIGhlYWRlcgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisvKiogXGluZ3JvdXAgU3VwcG9ydF9tb2R1bGVzCisgICogXGRlZmdyb3VwIEVpZ2VuMlN1cHBvcnRfTW9kdWxlIEVpZ2VuMiBzdXBwb3J0IG1vZHVsZQorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY291cGxlIG9mIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGltcHJvdmluZyB0aGUgY29tcGF0aWJpbGl0eSB3aXRoIEVpZ2VuMi4KKyAgKgorICAqIFRvIHVzZSBpdCwgZGVmaW5lIEVJR0VOMl9TVVBQT1JUIGJlZm9yZSBpbmNsdWRpbmcgYW55IEVpZ2VuIGhlYWRlcgorICAqIFxjb2RlCisgICogI2RlZmluZSBFSUdFTjJfU1VQUE9SVAorICAqIFxlbmRjb2RlCisgICoKKyAgKi8KKworI2luY2x1ZGUgInNyYy9FaWdlbjJTdXBwb3J0L01hY3Jvcy5oIgorI2luY2x1ZGUgInNyYy9FaWdlbjJTdXBwb3J0L01lbW9yeS5oIgorI2luY2x1ZGUgInNyYy9FaWdlbjJTdXBwb3J0L01ldGEuaCIKKyNpbmNsdWRlICJzcmMvRWlnZW4yU3VwcG9ydC9MYXp5LmgiCisjaW5jbHVkZSAic3JjL0VpZ2VuMlN1cHBvcnQvQ3dpc2UuaCIKKyNpbmNsdWRlICJzcmMvRWlnZW4yU3VwcG9ydC9Dd2lzZU9wZXJhdG9ycy5oIgorI2luY2x1ZGUgInNyYy9FaWdlbjJTdXBwb3J0L1RyaWFuZ3VsYXJTb2x2ZXIuaCIKKyNpbmNsdWRlICJzcmMvRWlnZW4yU3VwcG9ydC9CbG9jay5oIgorI2luY2x1ZGUgInNyYy9FaWdlbjJTdXBwb3J0L1ZlY3RvckJsb2NrLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VuMlN1cHBvcnQvTWlub3IuaCIKKyNpbmNsdWRlICJzcmMvRWlnZW4yU3VwcG9ydC9NYXRoRnVuY3Rpb25zLmgiCisKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisvLyBFaWdlbjIgdXNlZCB0byBpbmNsdWRlIGlvc3RyZWFtCisjaW5jbHVkZTxpb3N0cmVhbT4KKworI2RlZmluZSBFSUdFTl9VU0lOR19NQVRSSVhfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgU2l6ZVN1ZmZpeCkgXAordXNpbmcgRWlnZW46Ok1hdHJpeCMjU2l6ZVN1ZmZpeCMjVHlwZVN1ZmZpeDsgXAordXNpbmcgRWlnZW46OlZlY3RvciMjU2l6ZVN1ZmZpeCMjVHlwZVN1ZmZpeDsgXAordXNpbmcgRWlnZW46OlJvd1ZlY3RvciMjU2l6ZVN1ZmZpeCMjVHlwZVN1ZmZpeDsKKworI2RlZmluZSBFSUdFTl9VU0lOR19NQVRSSVhfVFlQRURFRlNfRk9SX1RZUEUoVHlwZVN1ZmZpeCkgXAorRUlHRU5fVVNJTkdfTUFUUklYX1RZUEVERUZTX0ZPUl9UWVBFX0FORF9TSVpFKFR5cGVTdWZmaXgsIDIpIFwKK0VJR0VOX1VTSU5HX01BVFJJWF9UWVBFREVGU19GT1JfVFlQRV9BTkRfU0laRShUeXBlU3VmZml4LCAzKSBcCitFSUdFTl9VU0lOR19NQVRSSVhfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgNCkgXAorRUlHRU5fVVNJTkdfTUFUUklYX1RZUEVERUZTX0ZPUl9UWVBFX0FORF9TSVpFKFR5cGVTdWZmaXgsIFgpIFwKKworI2RlZmluZSBFSUdFTl9VU0lOR19NQVRSSVhfVFlQRURFRlMgXAorRUlHRU5fVVNJTkdfTUFUUklYX1RZUEVERUZTX0ZPUl9UWVBFKGkpIFwKK0VJR0VOX1VTSU5HX01BVFJJWF9UWVBFREVGU19GT1JfVFlQRShmKSBcCitFSUdFTl9VU0lOR19NQVRSSVhfVFlQRURFRlNfRk9SX1RZUEUoZCkgXAorRUlHRU5fVVNJTkdfTUFUUklYX1RZUEVERUZTX0ZPUl9UWVBFKGNmKSBcCitFSUdFTl9VU0lOR19NQVRSSVhfVFlQRURFRlNfRk9SX1RZUEUoY2QpCisKKyNkZWZpbmUgVVNJTkdfUEFSVF9PRl9OQU1FU1BBQ0VfRUlHRU4gXAorRUlHRU5fVVNJTkdfTUFUUklYX1RZUEVERUZTIFwKK3VzaW5nIEVpZ2VuOjpNYXRyaXg7IFwKK3VzaW5nIEVpZ2VuOjpNYXRyaXhCYXNlOyBcCit1c2luZyBFaWdlbjo6ZWlfcmFuZG9tOyBcCit1c2luZyBFaWdlbjo6ZWlfcmVhbDsgXAordXNpbmcgRWlnZW46OmVpX2ltYWc7IFwKK3VzaW5nIEVpZ2VuOjplaV9jb25qOyBcCit1c2luZyBFaWdlbjo6ZWlfYWJzOyBcCit1c2luZyBFaWdlbjo6ZWlfYWJzMjsgXAordXNpbmcgRWlnZW46OmVpX3NxcnQ7IFwKK3VzaW5nIEVpZ2VuOjplaV9leHA7IFwKK3VzaW5nIEVpZ2VuOjplaV9sb2c7IFwKK3VzaW5nIEVpZ2VuOjplaV9zaW47IFwKK3VzaW5nIEVpZ2VuOjplaV9jb3M7CisKKyNlbmRpZiAvLyBFSUdFTjJTVVBQT1JUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL0VpZ2VudmFsdWVzIGIvRWlnZW4vRWlnZW52YWx1ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5OWNjZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL0VpZ2VudmFsdWVzCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgRUlHRU5fRUlHRU5WQUxVRVNfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fRUlHRU5WQUxVRVNfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjaW5jbHVkZSAiQ2hvbGVza3kiCisjaW5jbHVkZSAiSmFjb2JpIgorI2luY2x1ZGUgIkhvdXNlaG9sZGVyIgorI2luY2x1ZGUgIkxVIgorI2luY2x1ZGUgIkdlb21ldHJ5IgorCisvKiogXGRlZmdyb3VwIEVpZ2VudmFsdWVzX01vZHVsZSBFaWdlbnZhbHVlcyBtb2R1bGUKKyAgKgorICAqCisgICoKKyAgKiBUaGlzIG1vZHVsZSBtYWlubHkgcHJvdmlkZXMgdmFyaW91cyBlaWdlbnZhbHVlIHNvbHZlcnMuCisgICogVGhpcyBtb2R1bGUgYWxzbyBwcm92aWRlcyBzb21lIE1hdHJpeEJhc2UgbWV0aG9kcywgaW5jbHVkaW5nOgorICAqICAtIE1hdHJpeEJhc2U6OmVpZ2VudmFsdWVzKCksCisgICogIC0gTWF0cml4QmFzZTo6b3BlcmF0b3JOb3JtKCkKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvRWlnZW52YWx1ZXMvVHJpZGlhZ29uYWxpemF0aW9uLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL1JlYWxTY2h1ci5oIgorI2luY2x1ZGUgInNyYy9FaWdlbnZhbHVlcy9FaWdlblNvbHZlci5oIgorI2luY2x1ZGUgInNyYy9FaWdlbnZhbHVlcy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlci5oIgorI2luY2x1ZGUgInNyYy9FaWdlbnZhbHVlcy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbi5oIgorI2luY2x1ZGUgInNyYy9FaWdlbnZhbHVlcy9Db21wbGV4U2NodXIuaCIKKyNpbmNsdWRlICJzcmMvRWlnZW52YWx1ZXMvQ29tcGxleEVpZ2VuU29sdmVyLmgiCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL01hdHJpeEJhc2VFaWdlbnZhbHVlcy5oIgorI2lmZGVmIEVJR0VOX1VTRV9MQVBBQ0tFCisjaW5jbHVkZSAic3JjL0VpZ2VudmFsdWVzL1JlYWxTY2h1cl9NS0wuaCIKKyNpbmNsdWRlICJzcmMvRWlnZW52YWx1ZXMvQ29tcGxleFNjaHVyX01LTC5oIgorI2luY2x1ZGUgInNyYy9FaWdlbnZhbHVlcy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01LTC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX0VJR0VOVkFMVUVTX01PRFVMRV9ICisvKiB2aW06IHNldCBmaWxldHlwZT1jcHAgZXQgc3c9MiB0cz0yIGFpOiAqLwpkaWZmIC0tZ2l0IGEvRWlnZW4vR2VvbWV0cnkgYi9FaWdlbi9HZW9tZXRyeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ5ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vR2VvbWV0cnkKQEAgLTAsMCArMSw2MyBAQAorI2lmbmRlZiBFSUdFTl9HRU9NRVRSWV9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9HRU9NRVRSWV9NT0RVTEVfSAorCisjaW5jbHVkZSAiQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNpbmNsdWRlICJTVkQiCisjaW5jbHVkZSAiTFUiCisjaW5jbHVkZSA8bGltaXRzPgorCisjaWZuZGVmIE1fUEkKKyNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKworLyoqIFxkZWZncm91cCBHZW9tZXRyeV9Nb2R1bGUgR2VvbWV0cnkgbW9kdWxlCisgICoKKyAgKgorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3I6CisgICogIC0gZml4ZWQtc2l6ZSBob21vZ2VuZW91cyB0cmFuc2Zvcm1hdGlvbnMKKyAgKiAgLSB0cmFuc2xhdGlvbiwgc2NhbGluZywgMkQgYW5kIDNEIHJvdGF0aW9ucworICAqICAtIHF1YXRlcm5pb25zCisgICogIC0gXHJlZiBNYXRyaXhCYXNlOjpjcm9zcygpICJjcm9zcyBwcm9kdWN0IgorICAqICAtIFxyZWYgTWF0cml4QmFzZTo6dW5pdE9ydGhvZ29uYWwoKSAib3J0aG9nbmFsIHZlY3RvciBnZW5lcmF0aW9uIgorICAqICAtIHNvbWUgbGluZWFyIGNvbXBvbmVudHM6IHBhcmFtZXRyaXplZC1saW5lcyBhbmQgaHlwZXJwbGFuZXMKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvR2VvbWV0cnkvT3J0aG9NZXRob2RzLmgiCisjaW5jbHVkZSAic3JjL0dlb21ldHJ5L0V1bGVyQW5nbGVzLmgiCisKKyNpZiBFSUdFTjJfU1VQUE9SVF9TVEFHRSA+IFNUQUdFMjBfUkVTT0xWRV9BUElfQ09ORkxJQ1RTCisgICNpbmNsdWRlICJzcmMvR2VvbWV0cnkvSG9tb2dlbmVvdXMuaCIKKyAgI2luY2x1ZGUgInNyYy9HZW9tZXRyeS9Sb3RhdGlvbkJhc2UuaCIKKyAgI2luY2x1ZGUgInNyYy9HZW9tZXRyeS9Sb3RhdGlvbjJELmgiCisgICNpbmNsdWRlICJzcmMvR2VvbWV0cnkvUXVhdGVybmlvbi5oIgorICAjaW5jbHVkZSAic3JjL0dlb21ldHJ5L0FuZ2xlQXhpcy5oIgorICAjaW5jbHVkZSAic3JjL0dlb21ldHJ5L1RyYW5zZm9ybS5oIgorICAjaW5jbHVkZSAic3JjL0dlb21ldHJ5L1RyYW5zbGF0aW9uLmgiCisgICNpbmNsdWRlICJzcmMvR2VvbWV0cnkvU2NhbGluZy5oIgorICAjaW5jbHVkZSAic3JjL0dlb21ldHJ5L0h5cGVycGxhbmUuaCIKKyAgI2luY2x1ZGUgInNyYy9HZW9tZXRyeS9QYXJhbWV0cml6ZWRMaW5lLmgiCisgICNpbmNsdWRlICJzcmMvR2VvbWV0cnkvQWxpZ25lZEJveC5oIgorICAjaW5jbHVkZSAic3JjL0dlb21ldHJ5L1VtZXlhbWEuaCIKKworICAjaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfU1NFCisgICAgI2luY2x1ZGUgInNyYy9HZW9tZXRyeS9hcmNoL0dlb21ldHJ5X1NTRS5oIgorICAjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyNpbmNsdWRlICJzcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9BbGwuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9HRU9NRVRSWV9NT0RVTEVfSAorLyogdmltOiBzZXQgZmlsZXR5cGU9Y3BwIGV0IHN3PTIgdHM9MiBhaTogKi8KKwpkaWZmIC0tZ2l0IGEvRWlnZW4vSG91c2Vob2xkZXIgYi9FaWdlbi9Ib3VzZWhvbGRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTM0OGRiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vSG91c2Vob2xkZXIKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBFSUdFTl9IT1VTRUhPTERFUl9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9IT1VTRUhPTERFUl9NT0RVTEVfSAorCisjaW5jbHVkZSAiQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKy8qKiBcZGVmZ3JvdXAgSG91c2Vob2xkZXJfTW9kdWxlIEhvdXNlaG9sZGVyIG1vZHVsZQorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9ucy4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0hvdXNlaG9sZGVyPgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvSG91c2Vob2xkZXIvSG91c2Vob2xkZXIuaCIKKyNpbmNsdWRlICJzcmMvSG91c2Vob2xkZXIvSG91c2Vob2xkZXJTZXF1ZW5jZS5oIgorI2luY2x1ZGUgInNyYy9Ib3VzZWhvbGRlci9CbG9ja0hvdXNlaG9sZGVyLmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX0hPVVNFSE9MREVSX01PRFVMRV9ICisvKiB2aW06IHNldCBmaWxldHlwZT1jcHAgZXQgc3c9MiB0cz0yIGFpOiAqLwpkaWZmIC0tZ2l0IGEvRWlnZW4vSXRlcmF0aXZlTGluZWFyU29sdmVycyBiL0VpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1YzJkZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBFSUdFTl9JVEVSQVRJVkVMSU5FQVJTT0xWRVJTX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX0lURVJBVElWRUxJTkVBUlNPTFZFUlNfTU9EVUxFX0gKKworI2luY2x1ZGUgIlNwYXJzZUNvcmUiCisjaW5jbHVkZSAiT3JkZXJpbmdNZXRob2RzIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworLyoqIFxpbmdyb3VwIFNwYXJzZV9tb2R1bGVzCisgICogXGRlZmdyb3VwIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnMgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgcHJvdmlkZXMgaXRlcmF0aXZlIG1ldGhvZHMgdG8gc29sdmUgcHJvYmxlbXMgb2YgdGhlIGZvcm0gXGMgQSBcYyB4ID0gXGMgYiwgd2hlcmUgXGMgQSBpcyBhIHNxdWFyZWQgbWF0cml4LCB1c3VhbGx5IHZlcnkgbGFyZ2UgYW5kIHNwYXJzZS4KKyAgKiBUaG9zZSBzb2x2ZXJzIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CisgICogIC0gQ29uanVnYXRlR3JhZGllbnQgZm9yIHNlbGZhZGpvaW50IChoZXJtaXRpYW4pIG1hdHJpY2VzLAorICAqICAtIEJpQ0dTVEFCIGZvciBnZW5lcmFsIHNxdWFyZSBtYXRyaWNlcy4KKyAgKgorICAqIFRoZXNlIGl0ZXJhdGl2ZSBzb2x2ZXJzIGFyZSBhc3NvY2lhdGVkIHdpdGggc29tZSBwcmVjb25kaXRpb25lcnM6CisgICogIC0gSWRlbnRpdHlQcmVjb25kaXRpb25lciAtIG5vdCByZWFsbHkgdXNlZnVsCisgICogIC0gRGlhZ29uYWxQcmVjb25kaXRpb25lciAtIGFsc28gY2FsbGVkIEpBY29iaSBwcmVjb25kaXRpb25lciwgd29yayB2ZXJ5IHdlbGwgb24gZGlhZ29uYWwgZG9taW5hbnQgbWF0cmljZXMuCisgICogIC0gSW5jb21wbGV0ZUlMVVQgLSBpbmNvbXBsZXRlIExVIGZhY3Rvcml6YXRpb24gd2l0aCBkdWFsIHRocmVzaG9sZGluZworICAqCisgICogU3VjaCBwcm9ibGVtcyBjYW4gYWxzbyBiZSBzb2x2ZWQgdXNpbmcgdGhlIGRpcmVjdCBzcGFyc2UgZGVjb21wb3NpdGlvbiBtb2R1bGVzOiBTcGFyc2VDaG9sZXNreSwgQ2hvbG1vZFN1cHBvcnQsIFVtZlBhY2tTdXBwb3J0LCBTdXBlckxVU3VwcG9ydC4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CisgICogXGVuZGNvZGUKKyAgKi8KKworI2luY2x1ZGUgInNyYy9taXNjL1NvbHZlLmgiCisjaW5jbHVkZSAic3JjL21pc2MvU3BhcnNlU29sdmUuaCIKKworI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0l0ZXJhdGl2ZVNvbHZlckJhc2UuaCIKKyNpbmNsdWRlICJzcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9CYXNpY1ByZWNvbmRpdGlvbmVycy5oIgorI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0Nvbmp1Z2F0ZUdyYWRpZW50LmgiCisjaW5jbHVkZSAic3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvQmlDR1NUQUIuaCIKKyNpbmNsdWRlICJzcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9JbmNvbXBsZXRlTFVULmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX0lURVJBVElWRUxJTkVBUlNPTFZFUlNfTU9EVUxFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL0phY29iaSBiL0VpZ2VuL0phY29iaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYThhNGRjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vSmFjb2JpCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgRUlHRU5fSkFDT0JJX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX0pBQ09CSV9NT0RVTEVfSAorCisjaW5jbHVkZSAiQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKy8qKiBcZGVmZ3JvdXAgSmFjb2JpX01vZHVsZSBKYWNvYmkgbW9kdWxlCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgSmFjb2JpIGFuZCBHaXZlbnMgcm90YXRpb25zLgorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8RWlnZW4vSmFjb2JpPgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBJbiBhZGRpdGlvbiB0byBsaXN0ZWQgY2xhc3NlcywgaXQgZGVmaW5lcyB0aGUgdHdvIGZvbGxvd2luZyBNYXRyaXhCYXNlIG1ldGhvZHMgdG8gYXBwbHkgYSBKYWNvYmkgb3IgR2l2ZW5zIHJvdGF0aW9uOgorICAqICAtIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVMZWZ0KCkKKyAgKiAgLSBNYXRyaXhCYXNlOjphcHBseU9uVGhlUmlnaHQoKS4KKyAgKi8KKworI2luY2x1ZGUgInNyYy9KYWNvYmkvSmFjb2JpLmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX0pBQ09CSV9NT0RVTEVfSAorLyogdmltOiBzZXQgZmlsZXR5cGU9Y3BwIGV0IHN3PTIgdHM9MiBhaTogKi8KKwpkaWZmIC0tZ2l0IGEvRWlnZW4vTFUgYi9FaWdlbi9MVQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjU3OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vTFUKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBFSUdFTl9MVV9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9MVV9NT0RVTEVfSAorCisjaW5jbHVkZSAiQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKy8qKiBcZGVmZ3JvdXAgTFVfTW9kdWxlIExVIG1vZHVsZQorICAqIFRoaXMgbW9kdWxlIGluY2x1ZGVzICVMVSBkZWNvbXBvc2l0aW9uIGFuZCByZWxhdGVkIG5vdGlvbnMgc3VjaCBhcyBtYXRyaXggaW52ZXJzaW9uIGFuZCBkZXRlcm1pbmFudC4KKyAgKiBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgTWF0cml4QmFzZSBtZXRob2RzOgorICAqICAtIE1hdHJpeEJhc2U6OmludmVyc2UoKQorICAqICAtIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL0xVPgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvbWlzYy9Tb2x2ZS5oIgorI2luY2x1ZGUgInNyYy9taXNjL0tlcm5lbC5oIgorI2luY2x1ZGUgInNyYy9taXNjL0ltYWdlLmgiCisjaW5jbHVkZSAic3JjL0xVL0Z1bGxQaXZMVS5oIgorI2luY2x1ZGUgInNyYy9MVS9QYXJ0aWFsUGl2TFUuaCIKKyNpZmRlZiBFSUdFTl9VU0VfTEFQQUNLRQorI2luY2x1ZGUgInNyYy9MVS9QYXJ0aWFsUGl2TFVfTUtMLmgiCisjZW5kaWYKKyNpbmNsdWRlICJzcmMvTFUvRGV0ZXJtaW5hbnQuaCIKKyNpbmNsdWRlICJzcmMvTFUvSW52ZXJzZS5oIgorCisjaWYgZGVmaW5lZCBFSUdFTl9WRUNUT1JJWkVfU1NFCisgICNpbmNsdWRlICJzcmMvTFUvYXJjaC9JbnZlcnNlX1NTRS5oIgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTjJfU1VQUE9SVAorICAjaW5jbHVkZSAic3JjL0VpZ2VuMlN1cHBvcnQvTFUuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9MVV9NT0RVTEVfSAorLyogdmltOiBzZXQgZmlsZXR5cGU9Y3BwIGV0IHN3PTIgdHM9MiBhaTogKi8KZGlmZiAtLWdpdCBhL0VpZ2VuL0xlYXN0U3F1YXJlcyBiL0VpZ2VuL0xlYXN0U3F1YXJlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEzN2MyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vTGVhc3RTcXVhcmVzCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgRUlHRU5fUkVHUkVTU0lPTl9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9SRUdSRVNTSU9OX01PRFVMRV9ICisKKyNpZm5kZWYgRUlHRU4yX1NVUFBPUlQKKyNlcnJvciBMZWFzdFNxdWFyZXMgaXMgb25seSBhdmFpbGFibGUgaW4gRWlnZW4yIHN1cHBvcnQgbW9kZSAoZGVmaW5lIEVJR0VOMl9TVVBQT1JUKQorI2VuZGlmCisKKy8vIGV4Y2x1ZGUgZnJvbSBub3JtYWwgZWlnZW4zLW9ubHkgZG9jdW1lbnRhdGlvbgorI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisKKyNpbmNsdWRlICJDb3JlIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2luY2x1ZGUgIkVpZ2VudmFsdWVzIgorI2luY2x1ZGUgIkdlb21ldHJ5IgorCisvKiogXGRlZmdyb3VwIExlYXN0U3F1YXJlc19Nb2R1bGUgTGVhc3RTcXVhcmVzIG1vZHVsZQorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGxpbmVhciByZWdyZXNzaW9uIGFuZCByZWxhdGVkIGZlYXR1cmVzLgorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8RWlnZW4vTGVhc3RTcXVhcmVzPgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvRWlnZW4yU3VwcG9ydC9MZWFzdFNxdWFyZXMuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU4yX1NVUFBPUlQKKworI2VuZGlmIC8vIEVJR0VOX1JFR1JFU1NJT05fTU9EVUxFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL09yZGVyaW5nTWV0aG9kcyBiL0VpZ2VuL09yZGVyaW5nTWV0aG9kcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJkODc0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vT3JkZXJpbmdNZXRob2RzCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgRUlHRU5fT1JERVJJTkdNRVRIT0RTX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX09SREVSSU5HTUVUSE9EU19NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKy8qKiBcaW5ncm91cCBTcGFyc2VfbW9kdWxlcworICAqIFxkZWZncm91cCBPcmRlcmluZ01ldGhvZHNfTW9kdWxlIE9yZGVyaW5nTWV0aG9kcyBtb2R1bGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgICoKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL09yZGVyaW5nTWV0aG9kcz4KKyAgKiBcZW5kY29kZQorICAqLworCisjaW5jbHVkZSAic3JjL09yZGVyaW5nTWV0aG9kcy9BbWQuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fT1JERVJJTkdNRVRIT0RTX01PRFVMRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9QYVN0aVhTdXBwb3J0IGIvRWlnZW4vUGFTdGlYU3VwcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzYxNmVlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vUGFTdGlYU3VwcG9ydApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIEVJR0VOX1BBU1RJWFNVUFBPUlRfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fUEFTVElYU1VQUE9SVF9NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNpbmNsdWRlIDxjb21wbGV4Lmg+CitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxwYXN0aXhfbm9tcGkuaD4KKyNpbmNsdWRlIDxwYXN0aXguaD4KK30KKworI2lmZGVmIGNvbXBsZXgKKyN1bmRlZiBjb21wbGV4CisjZW5kaWYKKworLyoqIFxpbmdyb3VwIFN1cHBvcnRfbW9kdWxlcworICAqIFxkZWZncm91cCBQYVN0aVhTdXBwb3J0X01vZHVsZSBQYVN0aVhTdXBwb3J0IG1vZHVsZQorICAqIAorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgPGEgaHJlZj0iaHR0cDovL3Bhc3RpeC5nZm9yZ2UuaW5yaWEuZnIvIj5QYVNUaVg8L2E+IGxpYnJhcnkuCisgICogUGFTVGlYIGlzIGEgZ2VuZXJhbCBcYiBzdXBlcm5vZGFsLCBcYiBwYXJhbGxlbCBhbmQgXGIgb3BlbnNvdXJjZSBzcGFyc2Ugc29sdmVyLgorICAqIEl0IHByb3ZpZGVzIHRoZSB0d28gZm9sbG93aW5nIG1haW4gZmFjdG9yaXphdGlvbiBjbGFzc2VzOgorICAqIC0gY2xhc3MgUGFzdGl4TExUIDogYSBzdXBlcm5vZGFsLCBwYXJhbGxlbCBMTHQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbi4KKyAgKiAtIGNsYXNzIFBhc3RpeExETFQ6IGEgc3VwZXJub2RhbCwgcGFyYWxsZWwgTERMdCBDaG9sZXNreSBmYWN0b3JpemF0aW9uLgorICAqIC0gY2xhc3MgUGFzdGl4TFUgOiBhIHN1cGVybm9kYWwsIHBhcmFsbGVsIExVIGZhY3Rvcml6YXRpb24gKG9wdGltaXplZCBmb3IgYSBzeW1tZXRyaWMgcGF0dGVybikuCisgICogCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8RWlnZW4vUGFTdGlYU3VwcG9ydD4KKyAgKiBcZW5kY29kZQorICAqCisgICogSW4gb3JkZXIgdG8gdXNlIHRoaXMgbW9kdWxlLCB0aGUgUGFTVGlYIGhlYWRlcnMgbXVzdCBiZSBhY2Nlc3NpYmxlIGZyb20gdGhlIGluY2x1ZGUgcGF0aHMsIGFuZCB5b3VyIGJpbmFyeSBtdXN0IGJlIGxpbmtlZCB0byB0aGUgUGFTVGlYIGxpYnJhcnkgYW5kIGl0cyBkZXBlbmRlbmNpZXMuCisgICogVGhlIGRlcGVuZGVuY2llcyBkZXBlbmQgb24gaG93IFBhU1RpWCBoYXMgYmVlbiBjb21waWxlZC4KKyAgKiBGb3IgYSBjbWFrZSBiYXNlZCBwcm9qZWN0LCB5b3UgY2FuIHVzZSBvdXIgRmluZFBhU1RpWC5jbWFrZSBtb2R1bGUgdG8gaGVscCB5b3UgaW4gdGhpcyB0YXNrLgorICAqCisgICovCisKKyNpbmNsdWRlICJzcmMvbWlzYy9Tb2x2ZS5oIgorI2luY2x1ZGUgInNyYy9taXNjL1NwYXJzZVNvbHZlLmgiCisKKyNpbmNsdWRlICJzcmMvUGFTdGlYU3VwcG9ydC9QYVN0aVhTdXBwb3J0LmgiCisKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fUEFTVElYU1VQUE9SVF9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vUGFyZGlzb1N1cHBvcnQgYi9FaWdlbi9QYXJkaXNvU3VwcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTMzMGNlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vUGFyZGlzb1N1cHBvcnQKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBFSUdFTl9QQVJESVNPU1VQUE9SVF9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9QQVJESVNPU1VQUE9SVF9NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNpbmNsdWRlIDxta2xfcGFyZGlzby5oPgorCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BhcnNlRXh0cmE+CisKKy8qKiBcaW5ncm91cCBTdXBwb3J0X21vZHVsZXMKKyAgKiBcZGVmZ3JvdXAgUGFyZGlzb1N1cHBvcnRfTW9kdWxlIFBhcmRpc29TdXBwb3J0IG1vZHVsZQorICAqCisgICogVGhpcyBtb2R1bGUgYnJpbmdzIHN1cHBvcnQgZm9yIHRoZSBJbnRlbChSKSBNS0wgUEFSRElTTyBkaXJlY3Qgc3BhcnNlIHNvbHZlcnMuCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9QYXJkaXNvU3VwcG9ydD4KKyAgKiBcZW5kY29kZQorICAqCisgICogSW4gb3JkZXIgdG8gdXNlIHRoaXMgbW9kdWxlLCB0aGUgTUtMIGhlYWRlcnMgbXVzdCBiZSBhY2Nlc3NpYmxlIGZyb20gdGhlIGluY2x1ZGUgcGF0aHMsIGFuZCB5b3VyIGJpbmFyeSBtdXN0IGJlIGxpbmtlZCB0byB0aGUgTUtMIGxpYnJhcnkgYW5kIGl0cyBkZXBlbmRlbmNpZXMuCisgICogU2VlIHRoaXMgXHJlZiBUb3BpY1VzaW5nSW50ZWxNS0wgInBhZ2UiIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIE1LTC1FaWdlbiBpbnRlZ3JhdGlvbi4KKyAgKiAKKyAgKi8KKworI2luY2x1ZGUgInNyYy9QYXJkaXNvU3VwcG9ydC9QYXJkaXNvU3VwcG9ydC5oIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9QQVJESVNPU1VQUE9SVF9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vUVIgYi9FaWdlbi9RUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzViMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vUVIKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBFSUdFTl9RUl9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9RUl9NT0RVTEVfSAorCisjaW5jbHVkZSAiQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNpbmNsdWRlICJDaG9sZXNreSIKKyNpbmNsdWRlICJKYWNvYmkiCisjaW5jbHVkZSAiSG91c2Vob2xkZXIiCisKKy8qKiBcZGVmZ3JvdXAgUVJfTW9kdWxlIFFSIG1vZHVsZQorICAqCisgICoKKyAgKgorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHZhcmlvdXMgUVIgZGVjb21wb3NpdGlvbnMKKyAgKiBUaGlzIG1vZHVsZSBhbHNvIHByb3ZpZGVzIHNvbWUgTWF0cml4QmFzZSBtZXRob2RzLCBpbmNsdWRpbmc6CisgICogIC0gTWF0cml4QmFzZTo6cXIoKSwKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1FSPgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvbWlzYy9Tb2x2ZS5oIgorI2luY2x1ZGUgInNyYy9RUi9Ib3VzZWhvbGRlclFSLmgiCisjaW5jbHVkZSAic3JjL1FSL0Z1bGxQaXZIb3VzZWhvbGRlclFSLmgiCisjaW5jbHVkZSAic3JjL1FSL0NvbFBpdkhvdXNlaG9sZGVyUVIuaCIKKyNpZmRlZiBFSUdFTl9VU0VfTEFQQUNLRQorI2luY2x1ZGUgInNyYy9RUi9Ib3VzZWhvbGRlclFSX01LTC5oIgorI2luY2x1ZGUgInNyYy9RUi9Db2xQaXZIb3VzZWhvbGRlclFSX01LTC5oIgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTjJfU1VQUE9SVAorI2luY2x1ZGUgInNyYy9FaWdlbjJTdXBwb3J0L1FSLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyNpbmNsdWRlICJFaWdlbnZhbHVlcyIKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fUVJfTU9EVUxFX0gKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS9FaWdlbi9RdEFsaWduZWRNYWxsb2MgYi9FaWdlbi9RdEFsaWduZWRNYWxsb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmN2Q4MwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL1F0QWxpZ25lZE1hbGxvYwpAQCAtMCwwICsxLDM0IEBACisKKyNpZm5kZWYgRUlHRU5fUVRNQUxMT0NfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fUVRNQUxMT0NfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisKKyNpZiAoIUVJR0VOX01BTExPQ19BTFJFQURZX0FMSUdORUQpCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCit2b2lkICpxTWFsbG9jKHNpemVfdCBzaXplKQoreworICByZXR1cm4gRWlnZW46OmludGVybmFsOjphbGlnbmVkX21hbGxvYyhzaXplKTsKK30KKwordm9pZCBxRnJlZSh2b2lkICpwdHIpCit7CisgIEVpZ2VuOjppbnRlcm5hbDo6YWxpZ25lZF9mcmVlKHB0cik7Cit9CisKK3ZvaWQgKnFSZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgIHZvaWQqIG5ld1B0ciA9IEVpZ2VuOjppbnRlcm5hbDo6YWxpZ25lZF9tYWxsb2Moc2l6ZSk7CisgIG1lbWNweShuZXdQdHIsIHB0ciwgc2l6ZSk7CisgIEVpZ2VuOjppbnRlcm5hbDo6YWxpZ25lZF9mcmVlKHB0cik7CisgIHJldHVybiBuZXdQdHI7Cit9CisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmCisKKyNlbmRpZiAvLyBFSUdFTl9RVE1BTExPQ19NT0RVTEVfSAorLyogdmltOiBzZXQgZmlsZXR5cGU9Y3BwIGV0IHN3PTIgdHM9MiBhaTogKi8KZGlmZiAtLWdpdCBhL0VpZ2VuL1NWRCBiL0VpZ2VuL1NWRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDMxMDAxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vU1ZECkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgRUlHRU5fU1ZEX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX1NWRF9NT0RVTEVfSAorCisjaW5jbHVkZSAiUVIiCisjaW5jbHVkZSAiSG91c2Vob2xkZXIiCisjaW5jbHVkZSAiSmFjb2JpIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworLyoqIFxkZWZncm91cCBTVkRfTW9kdWxlIFNWRCBtb2R1bGUKKyAgKgorICAqCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBTVkQgZGVjb21wb3NpdGlvbiBmb3IgbWF0cmljZXMgKGJvdGggcmVhbCBhbmQgY29tcGxleCkuCisgICogVGhpcyBkZWNvbXBvc2l0aW9uIGlzIGFjY2Vzc2libGUgdmlhIHRoZSBmb2xsb3dpbmcgTWF0cml4QmFzZSBtZXRob2Q6CisgICogIC0gTWF0cml4QmFzZTo6amFjb2JpU3ZkKCkKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKyAgKiBcZW5kY29kZQorICAqLworCisjaW5jbHVkZSAic3JjL21pc2MvU29sdmUuaCIKKyNpbmNsdWRlICJzcmMvU1ZEL0phY29iaVNWRC5oIgorI2lmIGRlZmluZWQoRUlHRU5fVVNFX0xBUEFDS0UpICYmICFkZWZpbmVkKEVJR0VOX1VTRV9MQVBBQ0tFX1NUUklDVCkKKyNpbmNsdWRlICJzcmMvU1ZEL0phY29iaVNWRF9NS0wuaCIKKyNlbmRpZgorI2luY2x1ZGUgInNyYy9TVkQvVXBwZXJCaWRpYWdvbmFsaXphdGlvbi5oIgorCisjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyNpbmNsdWRlICJzcmMvRWlnZW4yU3VwcG9ydC9TVkQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9TVkRfTU9EVUxFX0gKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS9FaWdlbi9TcGFyc2UgYi9FaWdlbi9TcGFyc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxNzU3MQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL1NwYXJzZQpAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIEVJR0VOX1NQQVJTRV9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfTU9EVUxFX0gKKworLyoqIFxkZWZncm91cCBTcGFyc2VfbW9kdWxlcyBTcGFyc2UgbW9kdWxlcworICAqCisgICogTWV0YS1tb2R1bGUgaW5jbHVkaW5nIGFsbCByZWxhdGVkIG1vZHVsZXM6CisgICogLSBTcGFyc2VDb3JlCisgICogLSBPcmRlcmluZ01ldGhvZHMKKyAgKiAtIFNwYXJzZUNob2xlc2t5CisgICogLSBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+CisgICogXGVuZGNvZGUKKyAgKi8KKworI2luY2x1ZGUgIlNwYXJzZUNvcmUiCisjaW5jbHVkZSAiT3JkZXJpbmdNZXRob2RzIgorI2luY2x1ZGUgIlNwYXJzZUNob2xlc2t5IgorI2luY2x1ZGUgIkl0ZXJhdGl2ZUxpbmVhclNvbHZlcnMiCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfTU9EVUxFX0gKKwpkaWZmIC0tZ2l0IGEvRWlnZW4vU3BhcnNlQ2hvbGVza3kgYi9FaWdlbi9TcGFyc2VDaG9sZXNreQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjgyNzQyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vU3BhcnNlQ2hvbGVza3kKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBFSUdFTl9TUEFSU0VDSE9MRVNLWV9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VDSE9MRVNLWV9NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKy8qKiBcaW5ncm91cCBTcGFyc2VfbW9kdWxlcworICAqIFxkZWZncm91cCBTcGFyc2VDaG9sZXNreV9Nb2R1bGUgU3BhcnNlQ2hvbGVza3kgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgcHJvdmlkZXMgdHdvIHZhcmlhbnRzIG9mIHRoZSBkaXJlY3Qgc3BhcnNlIENob2xlc2t5IGRlY29tcG9zaXRpb24gZm9yIHNlbGZhZGpvaW50IChoZXJtaXRpYW4pIG1hdHJpY2VzLgorICAqIFRob3NlIGRlY29tcG9zaXRpb25zIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CisgICogIC0gU2ltcGxpY2lhbExMdCwKKyAgKiAgLSBTaW1wbGljaWFsTERMdAorICAqCisgICogU3VjaCBwcm9ibGVtcyBjYW4gYWxzbyBiZSBzb2x2ZWQgdXNpbmcgdGhlIENvbmp1Z2F0ZUdyYWRpZW50IHNvbHZlciBmcm9tIHRoZSBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzIG1vZHVsZS4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUNob2xlc2t5PgorICAqIFxlbmRjb2RlCisgICovCisKKyNpbmNsdWRlICJzcmMvbWlzYy9Tb2x2ZS5oIgorI2luY2x1ZGUgInNyYy9taXNjL1NwYXJzZVNvbHZlLmgiCisKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ2hvbGVza3kvU2ltcGxpY2lhbENob2xlc2t5LmgiCisKKyNpbmNsdWRlICJzcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRUNIT0xFU0tZX01PRFVMRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9TcGFyc2VDb3JlIGIvRWlnZW4vU3BhcnNlQ29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQyOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vU3BhcnNlQ29yZQpAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIEVJR0VOX1NQQVJTRUNPUkVfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFQ09SRV9NT0RVTEVfSAorCisjaW5jbHVkZSAiQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8qKiBcaW5ncm91cCBTcGFyc2VfbW9kdWxlcworICAqIFxkZWZncm91cCBTcGFyc2VDb3JlX01vZHVsZSBTcGFyc2VDb3JlIG1vZHVsZQorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzcGFyc2UgbWF0cml4IHJlcHJlc2VudGF0aW9uLCBhbmQgYmFzaWMgYXNzb2NpYXRkIG1hdHJpeCBtYW5pcHVsYXRpb25zCisgICogYW5kIG9wZXJhdGlvbnMuCisgICoKKyAgKiBTZWUgdGhlIFxyZWYgVHV0b3JpYWxTcGFyc2UgIlNwYXJzZSB0dXRvcmlhbCIKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUNvcmU+CisgICogXGVuZGNvZGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIGRlcGVuZHMgb246IENvcmUuCisgICovCisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBUaGUgdHlwZSB1c2VkIHRvIGlkZW50aWZ5IGEgZ2VuZXJhbCBzcGFyc2Ugc3RvcmFnZS4gKi8KK3N0cnVjdCBTcGFyc2Uge307CisKK30KKworI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZVV0aWwuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VNYXRyaXhCYXNlLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvQ29tcHJlc3NlZFN0b3JhZ2UuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9BbWJpVmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlTWF0cml4LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvTWFwcGVkU3BhcnNlTWF0cml4LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlVmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvQ29yZUl0ZXJhdG9ycy5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZUJsb2NrLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlVHJhbnNwb3NlLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlQ3dpc2VVbmFyeU9wLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlQ3dpc2VCaW5hcnlPcC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZURvdC5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL1NwYXJzZVBlcm11dGF0aW9uLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlQXNzaWduLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlUmVkdXguaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VGdXp6eS5oIgorI2luY2x1ZGUgInNyYy9TcGFyc2VDb3JlL0NvbnNlcnZhdGl2ZVNwYXJzZVNwYXJzZVByb2R1Y3QuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VTcGFyc2VQcm9kdWN0V2l0aFBydW5pbmcuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VQcm9kdWN0LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlRGVuc2VQcm9kdWN0LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlRGlhZ29uYWxQcm9kdWN0LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlVHJpYW5ndWxhclZpZXcuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9TcGFyc2VTZWxmQWRqb2ludFZpZXcuaCIKKyNpbmNsdWRlICJzcmMvU3BhcnNlQ29yZS9Ucmlhbmd1bGFyU29sdmVyLmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUNvcmUvU3BhcnNlVmlldy5oIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VDT1JFX01PRFVMRV9ICisKZGlmZiAtLWdpdCBhL0VpZ2VuL1N0ZERlcXVlIGIvRWlnZW4vU3RkRGVxdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3MjM0NwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL1N0ZERlcXVlCkBAIC0wLDAgKzEsMjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdvb2dsZW1haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TVERERVFVRV9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TVERERVFVRV9NT0RVTEVfSAorCisjaW5jbHVkZSAiQ29yZSIKKyNpbmNsdWRlIDxkZXF1ZT4KKworI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9XSU42NCkpIC8qIE1TVkMgYXV0byBhbGlnbnMgaW4gNjQgYml0IGJ1aWxkcyAqLworCisjZGVmaW5lIEVJR0VOX0RFRklORV9TVExfREVRVUVfU1BFQ0lBTElaQVRJT04oLi4uKQorCisjZWxzZQorCisjaW5jbHVkZSAic3JjL1N0bFN1cHBvcnQvU3RkRGVxdWUuaCIKKworI2VuZGlmCisKKyNlbmRpZiAvLyBFSUdFTl9TVERERVFVRV9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vU3RkTGlzdCBiL0VpZ2VuL1N0ZExpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1YzFlMQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL1N0ZExpc3QKQEAgLTAsMCArMSwyNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ29vZ2xlbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NURExJU1RfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1RETElTVF9NT0RVTEVfSAorCisjaW5jbHVkZSAiQ29yZSIKKyNpbmNsdWRlIDxsaXN0PgorCisjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX1dJTjY0KSkgLyogTVNWQyBhdXRvIGFsaWducyBpbiA2NCBiaXQgYnVpbGRzICovICAgIAorCisjZGVmaW5lIEVJR0VOX0RFRklORV9TVExfTElTVF9TUEVDSUFMSVpBVElPTiguLi4pCisKKyNlbHNlCisKKyNpbmNsdWRlICJzcmMvU3RsU3VwcG9ydC9TdGRMaXN0LmgiCisKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fU1RETElTVF9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vU3RkVmVjdG9yIGIvRWlnZW4vU3RkVmVjdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjI2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9TdGRWZWN0b3IKQEAgLTAsMCArMSwyNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ29vZ2xlbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NURFZFQ1RPUl9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9TVERWRUNUT1JfTU9EVUxFX0gKKworI2luY2x1ZGUgIkNvcmUiCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX1dJTjY0KSkgLyogTVNWQyBhdXRvIGFsaWducyBpbiA2NCBiaXQgYnVpbGRzICovCisKKyNkZWZpbmUgRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oLi4uKQorCisjZWxzZQorCisjaW5jbHVkZSAic3JjL1N0bFN1cHBvcnQvU3RkVmVjdG9yLmgiCisKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fU1REVkVDVE9SX01PRFVMRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9TdXBlckxVU3VwcG9ydCBiL0VpZ2VuL1N1cGVyTFVTdXBwb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NWUxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9TdXBlckxVU3VwcG9ydApAQCAtMCwwICsxLDU5IEBACisjaWZuZGVmIEVJR0VOX1NVUEVSTFVTVVBQT1JUX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX1NVUEVSTFVTVVBQT1JUX01PRFVMRV9ICisKKyNpbmNsdWRlICJTcGFyc2VDb3JlIgorCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCIKKworI2lmZGVmIEVNUFRZCisjZGVmaW5lIEVJR0VOX0VNUFRZX1dBU19BTFJFQURZX0RFRklORUQKKyNlbmRpZgorCit0eXBlZGVmIGludCBpbnRfdDsKKyNpbmNsdWRlIDxzbHVfQ25hbWVzLmg+CisjaW5jbHVkZSA8c3VwZXJtYXRyaXguaD4KKyNpbmNsdWRlIDxzbHVfdXRpbC5oPgorCisvLyBzbHVfdXRpbC5oIGRlZmluZXMgYSBwcmVwcm9jZXNzb3IgdG9rZW4gbmFtZWQgRU1QVFkgd2hpY2ggaXMgcmVhbGx5IHBvbGx1dGluZywKKy8vIHNvIHdlIHJlbW92ZSBpdCBpbiBmYXZvciBvZiBhIFNVUEVSTFVfRU1QVFkgdG9rZW4uCisvLyBJZiBFTVBUWSB3YXMgYWxyZWFkeSBkZWZpbmVkIHRoZW4gd2UgZG9uJ3QgdW5kZWYgaXQuCisKKyNpZiBkZWZpbmVkKEVJR0VOX0VNUFRZX1dBU19BTFJFQURZX0RFRklORUQpCisjIHVuZGVmIEVJR0VOX0VNUFRZX1dBU19BTFJFQURZX0RFRklORUQKKyNlbGlmIGRlZmluZWQoRU1QVFkpCisjIHVuZGVmIEVNUFRZCisjZW5kaWYKKworI2RlZmluZSBTVVBFUkxVX0VNUFRZICgtMSkKKworbmFtZXNwYWNlIEVpZ2VuIHsgc3RydWN0IFNsdU1hdHJpeDsgfQorCisvKiogXGluZ3JvdXAgU3VwcG9ydF9tb2R1bGVzCisgICogXGRlZmdyb3VwIFN1cGVyTFVTdXBwb3J0X01vZHVsZSBTdXBlckxVU3VwcG9ydCBtb2R1bGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgPGEgaHJlZj0iaHR0cDovL2NyZC1sZWdhY3kubGJsLmdvdi9+eGlhb3llL1N1cGVyTFUvIj5TdXBlckxVPC9hPiBsaWJyYXJ5LgorICAqIEl0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZmFjdG9yaXphdGlvbiBjbGFzczoKKyAgKiAtIGNsYXNzIFN1cGVyTFU6IGEgc3VwZXJub2RhbCBzZXF1ZW50aWFsIExVIGZhY3Rvcml6YXRpb24uCisgICogLSBjbGFzcyBTdXBlcklMVTogYSBzdXBlcm5vZGFsIHNlcXVlbnRpYWwgaW5jb21wbGV0ZSBMVSBmYWN0b3JpemF0aW9uICh0byBiZSB1c2VkIGFzIGEgcHJlY29uZGl0aW9uZXIgZm9yIGl0ZXJhdGl2ZSBtZXRob2RzKS4KKyAgKgorICAqIFx3YXJuaW5nIFdoZW4gaW5jbHVkaW5nIHRoaXMgbW9kdWxlLCB5b3UgaGF2ZSB0byB1c2UgU1VQRVJMVV9FTVBUWSBpbnN0ZWFkIG9mIEVNUFRZIHdoaWNoIGlzIG5vIGxvbmdlciBkZWZpbmVkIGJlY2F1c2UgaXQgaXMgdG9vIHBvbGx1dGluZy4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1N1cGVyTFVTdXBwb3J0PgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBJbiBvcmRlciB0byB1c2UgdGhpcyBtb2R1bGUsIHRoZSBzdXBlcmx1IGhlYWRlcnMgbXVzdCBiZSBhY2Nlc3NpYmxlIGZyb20gdGhlIGluY2x1ZGUgcGF0aHMsIGFuZCB5b3VyIGJpbmFyeSBtdXN0IGJlIGxpbmtlZCB0byB0aGUgc3VwZXJsdSBsaWJyYXJ5IGFuZCBpdHMgZGVwZW5kZW5jaWVzLgorICAqIFRoZSBkZXBlbmRlbmNpZXMgZGVwZW5kIG9uIGhvdyBzdXBlcmx1IGhhcyBiZWVuIGNvbXBpbGVkLgorICAqIEZvciBhIGNtYWtlIGJhc2VkIHByb2plY3QsIHlvdSBjYW4gdXNlIG91ciBGaW5kU3VwZXJMVS5jbWFrZSBtb2R1bGUgdG8gaGVscCB5b3UgaW4gdGhpcyB0YXNrLgorICAqCisgICovCisKKyNpbmNsdWRlICJzcmMvbWlzYy9Tb2x2ZS5oIgorI2luY2x1ZGUgInNyYy9taXNjL1NwYXJzZVNvbHZlLmgiCisKKyNpbmNsdWRlICJzcmMvU3VwZXJMVVN1cHBvcnQvU3VwZXJMVVN1cHBvcnQuaCIKKworCisjaW5jbHVkZSAic3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9TVVBFUkxVU1VQUE9SVF9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vVW1mUGFja1N1cHBvcnQgYi9FaWdlbi9VbWZQYWNrU3VwcG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODRmNjRhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vVW1mUGFja1N1cHBvcnQKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBFSUdFTl9VTUZQQUNLU1VQUE9SVF9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9VTUZQQUNLU1VQUE9SVF9NT0RVTEVfSAorCisjaW5jbHVkZSAiU3BhcnNlQ29yZSIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPHVtZnBhY2suaD4KK30KKworLyoqIFxpbmdyb3VwIFN1cHBvcnRfbW9kdWxlcworICAqIFxkZWZncm91cCBVbWZQYWNrU3VwcG9ydF9Nb2R1bGUgVW1mUGFja1N1cHBvcnQgbW9kdWxlCisgICoKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIFVtZlBhY2sgbGlicmFyeSB3aGljaCBpcyBwYXJ0IG9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmNpc2UudWZsLmVkdS9yZXNlYXJjaC9zcGFyc2UvU3VpdGVTcGFyc2UvIj5zdWl0ZXNwYXJzZTwvYT4gcGFja2FnZS4KKyAgKiBJdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGZhY3Rvcml6YXRpb24gY2xhc3M6CisgICogLSBjbGFzcyBVbWZQYWNrTFU6IGEgbXVsdGlmcm9udGFsIHNlcXVlbnRpYWwgTFUgZmFjdG9yaXphdGlvbi4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1VtZlBhY2tTdXBwb3J0PgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBJbiBvcmRlciB0byB1c2UgdGhpcyBtb2R1bGUsIHRoZSB1bWZwYWNrIGhlYWRlcnMgbXVzdCBiZSBhY2Nlc3NpYmxlIGZyb20gdGhlIGluY2x1ZGUgcGF0aHMsIGFuZCB5b3VyIGJpbmFyeSBtdXN0IGJlIGxpbmtlZCB0byB0aGUgdW1mcGFjayBsaWJyYXJ5IGFuZCBpdHMgZGVwZW5kZW5jaWVzLgorICAqIFRoZSBkZXBlbmRlbmNpZXMgZGVwZW5kIG9uIGhvdyB1bWZwYWNrIGhhcyBiZWVuIGNvbXBpbGVkLgorICAqIEZvciBhIGNtYWtlIGJhc2VkIHByb2plY3QsIHlvdSBjYW4gdXNlIG91ciBGaW5kVW1mUGFjay5jbWFrZSBtb2R1bGUgdG8gaGVscCB5b3UgaW4gdGhpcyB0YXNrLgorICAqCisgICovCisKKyNpbmNsdWRlICJzcmMvbWlzYy9Tb2x2ZS5oIgorI2luY2x1ZGUgInNyYy9taXNjL1NwYXJzZVNvbHZlLmgiCisKKyNpbmNsdWRlICJzcmMvVW1mUGFja1N1cHBvcnQvVW1mUGFja1N1cHBvcnQuaCIKKworI2luY2x1ZGUgInNyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fVU1GUEFDS1NVUFBPUlRfTU9EVUxFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzI2ZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAorZmlsZShHTE9CIEVpZ2VuX3NyY19zdWJkaXJlY3RvcmllcyAiKiIpCitlc2NhcGVfc3RyaW5nX2FzX3JlZ2V4KEVTQ0FQRURfQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iKQorZm9yZWFjaChmICR7RWlnZW5fc3JjX3N1YmRpcmVjdG9yaWVzfSkKKyAgaWYoTk9UIGYgTUFUQ0hFUyAiXFwudHh0IiBBTkQgTk9UIGYgTUFUQ0hFUyAiJHtFU0NBUEVEX0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vWy5dLisiICkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Zn0pCisgIGVuZGlmKCkKK2VuZGZvcmVhY2goKQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0Nob2xlc2t5L0NNYWtlTGlzdHMudHh0IGIvRWlnZW4vc3JjL0Nob2xlc2t5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTQ4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ2hvbGVza3kvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fQ2hvbGVza3lfU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUworICAke0VpZ2VuX0Nob2xlc2t5X1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL0Nob2xlc2t5IENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ2hvbGVza3kvTERMVC5oIGIvRWlnZW4vc3JjL0Nob2xlc2t5L0xETFQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGU1NGIxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0Nob2xlc2t5L0xETFQuaApAQCAtMCwwICsxLDU5MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBLZWlyIE1pZXJsZSA8bWllcmxlQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaW1vdGh5IEUuIEhvbHkgPHRpbS5ob2x5QGdtYWlsLmNvbSA+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0xETFRfSAorI2RlZmluZSBFSUdFTl9MRExUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgVXBMbz4gc3RydWN0IExETFRfVHJhaXRzOworfQorCisvKiogXGluZ3JvdXAgQ2hvbGVza3lfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgTERMVAorICAqCisgICogXGJyaWVmIFJvYnVzdCBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4IHdpdGggcGl2b3RpbmcKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggdG8gY29tcHV0ZSB0aGUgTERMXlQgQ2hvbGVza3kgZGVjb21wb3NpdGlvbgorICAqIFxwYXJhbSBVcExvIHRoZSB0cmlhbmd1bGFyIHBhcnQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkZWNvbXBvc2l0b246IExvd2VyIChkZWZhdWx0KSBvciBVcHBlci4KKyAgKiAgICAgICAgICAgICBUaGUgb3RoZXIgdHJpYW5ndWxhciBwYXJ0IHdvbid0IGJlIHJlYWQuCisgICoKKyAgKiBQZXJmb3JtIGEgcm9idXN0IENob2xlc2t5IGRlY29tcG9zaXRpb24gb2YgYSBwb3NpdGl2ZSBzZW1pZGVmaW5pdGUgb3IgbmVnYXRpdmUgc2VtaWRlZmluaXRlCisgICogbWF0cml4IFxmJCBBIFxmJCBzdWNoIHRoYXQgXGYkIEEgPSAgUF5UTERMXipQIFxmJCwgd2hlcmUgUCBpcyBhIHBlcm11dGF0aW9uIG1hdHJpeCwgTAorICAqIGlzIGxvd2VyIHRyaWFuZ3VsYXIgd2l0aCBhIHVuaXQgZGlhZ29uYWwgYW5kIEQgaXMgYSBkaWFnb25hbCBtYXRyaXguCisgICoKKyAgKiBUaGUgZGVjb21wb3NpdGlvbiB1c2VzIHBpdm90aW5nIHRvIGVuc3VyZSBzdGFiaWxpdHksIHNvIHRoYXQgTCB3aWxsIGhhdmUKKyAgKiB6ZXJvcyBpbiB0aGUgYm90dG9tIHJpZ2h0IHJhbmsoQSkgLSBuIHN1Ym1hdHJpeC4gQXZvaWRpbmcgdGhlIHNxdWFyZSByb290CisgICogb24gRCBhbHNvIHN0YWJpbGl6ZXMgdGhlIGNvbXB1dGF0aW9uLgorICAqCisgICogUmVtZW1iZXIgdGhhdCBDaG9sZXNreSBkZWNvbXBvc2l0aW9ucyBhcmUgbm90IHJhbmstcmV2ZWFsaW5nLiBBbHNvLCBkbyBub3QgdXNlIGEgQ2hvbGVza3kKKyAgKiBkZWNvbXBvc2l0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3lzdGVtIG9mIGVxdWF0aW9ucyBoYXMgYSBzb2x1dGlvbi4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpsZGx0KCksIGNsYXNzIExMVAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbz4gY2xhc3MgTERMVAoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucyAmIH5Sb3dNYWpvckJpdCwgLy8gdGhlc2UgYXJlIHRoZSBvcHRpb25zIGZvciB0aGUgVG1wTWF0cml4VHlwZSwgd2UgbmVlZCBhIENvbE1ham9yIG1hdHJpeCBoZXJlIQorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBVcExvID0gX1VwTG8KKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCAxLCBPcHRpb25zLCBNYXhSb3dzQXRDb21waWxlVGltZSwgMT4gVG1wTWF0cml4VHlwZTsKKworICAgIHR5cGVkZWYgVHJhbnNwb3NpdGlvbnM8Um93c0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPiBUcmFuc3Bvc2l0aW9uVHlwZTsKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PFJvd3NBdENvbXBpbGVUaW1lLCBNYXhSb3dzQXRDb21waWxlVGltZT4gUGVybXV0YXRpb25UeXBlOworCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6TERMVF9UcmFpdHM8TWF0cml4VHlwZSxVcExvPiBUcmFpdHM7CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIExETFQ6OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpLgorICAgICAgKi8KKyAgICBMRExUKCkgOiBtX21hdHJpeCgpLCBtX3RyYW5zcG9zaXRpb25zKCksIG1faXNJbml0aWFsaXplZChmYWxzZSkge30KKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAgICAqCisgICAgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIFxhIHNpemUuCisgICAgICAqIFxzYSBMRExUKCkKKyAgICAgICovCisgICAgTERMVChJbmRleCBzaXplKQorICAgICAgOiBtX21hdHJpeChzaXplLCBzaXplKSwKKyAgICAgICAgbV90cmFuc3Bvc2l0aW9ucyhzaXplKSwKKyAgICAgICAgbV90ZW1wb3Jhcnkoc2l6ZSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7fQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RvciB3aXRoIGRlY29tcG9zaXRpb24KKyAgICAgICoKKyAgICAgICogVGhpcyBjYWxjdWxhdGVzIHRoZSBkZWNvbXBvc2l0aW9uIGZvciB0aGUgaW5wdXQgXGEgbWF0cml4LgorICAgICAgKiBcc2EgTERMVChJbmRleCBzaXplKQorICAgICAgKi8KKyAgICBMRExUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fdHJhbnNwb3NpdGlvbnMobWF0cml4LnJvd3MoKSksCisgICAgICAgIG1fdGVtcG9yYXJ5KG1hdHJpeC5yb3dzKCkpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgY29tcHV0ZShtYXRyaXgpOworICAgIH0KKworICAgIC8qKiBDbGVhciBhbnkgZXhpc3RpbmcgZGVjb21wb3NpdGlvbgorICAgICAqIFxzYSByYW5rVXBkYXRlKHcsc2lnbWEpCisgICAgICovCisgICAgdm9pZCBzZXRaZXJvKCkKKyAgICB7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSB2aWV3IG9mIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBVICovCisgICAgaW5saW5lIHR5cGVuYW1lIFRyYWl0czo6TWF0cml4VSBtYXRyaXhVKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBUcmFpdHM6OmdldFUobV9tYXRyaXgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHZpZXcgb2YgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IEwgKi8KKyAgICBpbmxpbmUgdHlwZW5hbWUgVHJhaXRzOjpNYXRyaXhMIG1hdHJpeEwoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxETFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIFRyYWl0czo6Z2V0TChtX21hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwZXJtdXRhdGlvbiBtYXRyaXggUCBhcyBhIHRyYW5zcG9zaXRpb24gc2VxdWVuY2UuCisgICAgICAqLworICAgIGlubGluZSBjb25zdCBUcmFuc3Bvc2l0aW9uVHlwZSYgdHJhbnNwb3NpdGlvbnNQKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX3RyYW5zcG9zaXRpb25zOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBkaWFnb25hbCBtYXRyaXggRCAqLworICAgIGlubGluZSBEaWFnb25hbDxjb25zdCBNYXRyaXhUeXBlPiB2ZWN0b3JEKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX21hdHJpeC5kaWFnb25hbCgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggaXMgcG9zaXRpdmUgKHNlbWlkZWZpbml0ZSkgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1Bvc2l0aXZlKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX3NpZ24gPT0gMTsKKyAgICB9CisgICAgCisgICAgI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgaW5saW5lIGJvb2wgaXNQb3NpdGl2ZURlZmluaXRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gaXNQb3NpdGl2ZSgpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggaXMgbmVnYXRpdmUgKHNlbWlkZWZpbml0ZSkgKi8KKyAgICBpbmxpbmUgYm9vbCBpc05lZ2F0aXZlKHZvaWQpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTERMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9zaWduID09IC0xOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHNvbHV0aW9uIHggb2YgXGYkIEEgeCA9IGIgXGYkIHVzaW5nIHRoZSBjdXJyZW50IGRlY29tcG9zaXRpb24gb2YgQS4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIHN1cHBvcnRzIGluLXBsYWNlIHNvbHZlcyB1c2luZyB0aGUgc3ludGF4IDx0dD54ID0gZGVjb21wb3NpdGlvbk9iamVjdC5zb2x2ZSh4KTwvdHQ+IC4KKyAgICAgICoKKyAgICAgICogXG5vdGVfYWJvdXRfY2hlY2tpbmdfc29sdXRpb25zCisgICAgICAqCisgICAgICAqIE1vcmUgcHJlY2lzZWx5LCB0aGlzIG1ldGhvZCBzb2x2ZXMgXGYkIEEgeCA9IGIgXGYkIHVzaW5nIHRoZSBkZWNvbXBvc2l0aW9uIFxmJCBBID0gUF5UIEwgRCBMXiogUCBcZiQKKyAgICAgICogYnkgc29sdmluZyB0aGUgc3lzdGVtcyBcZiQgUF5UIHlfMSA9IGIgXGYkLCBcZiQgTCB5XzIgPSB5XzEgXGYkLCBcZiQgRCB5XzMgPSB5XzIgXGYkLCAKKyAgICAgICogXGYkIExeKiB5XzQgPSB5XzMgXGYkIGFuZCBcZiQgUCB4ID0geV80IFxmJCBpbiBzdWNjZXNzaW9uLiBJZiB0aGUgbWF0cml4IFxmJCBBIFxmJCBpcyBzaW5ndWxhciwgdGhlbgorICAgICAgKiBcZiQgRCBcZiQgd2lsbCBhbHNvIGJlIHNpbmd1bGFyIChhbGwgdGhlIG90aGVyIG1hdHJpY2VzIGFyZSBpbnZlcnRpYmxlKS4gSW4gdGhhdCBjYXNlLCB0aGUKKyAgICAgICogbGVhc3Qtc3F1YXJlIHNvbHV0aW9uIG9mIFxmJCBEIHlfMyA9IHlfMiBcZiQgaXMgY29tcHV0ZWQuIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoaXMgZnVuY3Rpb24KKyAgICAgICogY29tcHV0ZXMgdGhlIGxlYXN0LXNxdWFyZSBzb2x1dGlvbiBvZiBcZiQgQSB4ID0gYiBcZiQgaXMgXGYkIEEgXGYkIGlzIHNpbmd1bGFyLgorICAgICAgKgorICAgICAgKiBcc2EgTWF0cml4QmFzZTo6bGRsdCgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxMRExULCBSaHM+CisgICAgc29sdmUoY29uc3QgTWF0cml4QmFzZTxSaHM+JiBiKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxETFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fbWF0cml4LnJvd3MoKT09Yi5yb3dzKCkKKyAgICAgICAgICAgICAgICAmJiAiTERMVDo6c29sdmUoKTogaW52YWxpZCBudW1iZXIgb2Ygcm93cyBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCBiIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxMRExULCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIGJvb2wgc29sdmUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBiLCBSZXN1bHRUeXBlICpyZXN1bHQpIGNvbnN0CisgICAgeworICAgICAgKnJlc3VsdCA9IHRoaXMtPnNvbHZlKGIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgICNlbmRpZgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICBib29sIHNvbHZlSW5QbGFjZShNYXRyaXhCYXNlPERlcml2ZWQ+ICZiQW5kWCkgY29uc3Q7CisKKyAgICBMRExUJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KKyAgICBMRExUJiByYW5rVXBkYXRlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHcsUmVhbFNjYWxhciBhbHBoYT0xKTsKKworICAgIC8qKiBccmV0dXJucyB0aGUgaW50ZXJuYWwgTERMVCBkZWNvbXBvc2l0aW9uIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUT0RPOiBkb2N1bWVudCB0aGUgc3RvcmFnZSBsYXlvdXQKKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeExETFQoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxETFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fbWF0cml4OworICAgIH0KKworICAgIE1hdHJpeFR5cGUgcmVjb25zdHJ1Y3RlZE1hdHJpeCgpIGNvbnN0OworCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeC5hcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTERMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gU3VjY2VzczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBVc2VkIHRvIGNvbXB1dGUgYW5kIHN0b3JlIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIEEgPSBMIEQgTF4qID0gVV4qIEQgVS4KKyAgICAgICogVGhlIHN0cmljdCB1cHBlciBwYXJ0IGlzIHVzZWQgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLCB0aGUgc3RyaWN0IGxvd2VyCisgICAgICAqIHBhcnQgY29ycmVzcG9uZCB0byB0aGUgY29lZmZpY2llbnRzIG9mIEwgKGl0cyBkaWFnb25hbCBpcyBlcXVhbCB0byAxIGFuZAorICAgICAgKiBpcyBub3Qgc3RvcmVkKSwgYW5kIHRoZSBkaWFnb25hbCBlbnRyaWVzIGNvcnJlc3BvbmQgdG8gRC4KKyAgICAgICovCisgICAgTWF0cml4VHlwZSBtX21hdHJpeDsKKyAgICBUcmFuc3Bvc2l0aW9uVHlwZSBtX3RyYW5zcG9zaXRpb25zOworICAgIFRtcE1hdHJpeFR5cGUgbV90ZW1wb3Jhcnk7CisgICAgaW50IG1fc2lnbjsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPGludCBVcExvPiBzdHJ1Y3QgbGRsdF9pbnBsYWNlOworCit0ZW1wbGF0ZTw+IHN0cnVjdCBsZGx0X2lucGxhY2U8TG93ZXI+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBXb3Jrc3BhY2U+CisgIHN0YXRpYyBib29sIHVuYmxvY2tlZChNYXRyaXhUeXBlJiBtYXQsIFRyYW5zcG9zaXRpb25UeXBlJiB0cmFuc3Bvc2l0aW9ucywgV29ya3NwYWNlJiB0ZW1wLCBpbnQqIHNpZ249MCkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIGVpZ2VuX2Fzc2VydChtYXQucm93cygpPT1tYXQuY29scygpKTsKKyAgICBjb25zdCBJbmRleCBzaXplID0gbWF0LnJvd3MoKTsKKworICAgIGlmIChzaXplIDw9IDEpCisgICAgeworICAgICAgdHJhbnNwb3NpdGlvbnMuc2V0SWRlbnRpdHkoKTsKKyAgICAgIGlmKHNpZ24pCisgICAgICAgICpzaWduID0gcmVhbChtYXQuY29lZmYoMCwwKSk+MCA/IDE6LTE7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBSZWFsU2NhbGFyIGN1dG9mZigwKSwgYmlnZ2VzdF9pbl9jb3JuZXI7CisKKyAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgc2l6ZTsgKytrKQorICAgIHsKKyAgICAgIC8vIEZpbmQgbGFyZ2VzdCBkaWFnb25hbCBlbGVtZW50CisgICAgICBJbmRleCBpbmRleF9vZl9iaWdnZXN0X2luX2Nvcm5lcjsKKyAgICAgIGJpZ2dlc3RfaW5fY29ybmVyID0gbWF0LmRpYWdvbmFsKCkudGFpbChzaXplLWspLmN3aXNlQWJzKCkubWF4Q29lZmYoJmluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyKTsKKyAgICAgIGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyICs9IGs7CisKKyAgICAgIGlmKGsgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgLy8gVGhlIGJpZ2dlc3Qgb3ZlcmFsbCBpcyB0aGUgcG9pbnQgb2YgcmVmZXJlbmNlIHRvIHdoaWNoIGZ1cnRoZXIgZGlhZ29uYWxzCisgICAgICAgIC8vIGFyZSBjb21wYXJlZDsgaWYgYW55IGRpYWdvbmFsIGlzIG5lZ2xpZ2libGUgY29tcGFyZWQKKyAgICAgICAgLy8gdG8gdGhlIGxhcmdlc3Qgb3ZlcmFsbCwgdGhlIGFsZ29yaXRobSBiYWlscy4KKyAgICAgICAgY3V0b2ZmID0gYWJzKE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiBiaWdnZXN0X2luX2Nvcm5lcik7CisKKyAgICAgICAgaWYoc2lnbikKKyAgICAgICAgICAqc2lnbiA9IHJlYWwobWF0LmRpYWdvbmFsKCkuY29lZmYoaW5kZXhfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpKSA+IDAgPyAxIDogLTE7CisgICAgICB9CisKKyAgICAgIC8vIEZpbmlzaCBlYXJseSBpZiB0aGUgbWF0cml4IGlzIG5vdCBmdWxsIHJhbmsuCisgICAgICBpZihiaWdnZXN0X2luX2Nvcm5lciA8IGN1dG9mZikKKyAgICAgIHsKKyAgICAgICAgZm9yKEluZGV4IGkgPSBrOyBpIDwgc2l6ZTsgaSsrKSB0cmFuc3Bvc2l0aW9ucy5jb2VmZlJlZihpKSA9IGk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB0cmFuc3Bvc2l0aW9ucy5jb2VmZlJlZihrKSA9IGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyOworICAgICAgaWYoayAhPSBpbmRleF9vZl9iaWdnZXN0X2luX2Nvcm5lcikKKyAgICAgIHsKKyAgICAgICAgLy8gYXBwbHkgdGhlIHRyYW5zcG9zaXRpb24gd2hpbGUgdGFraW5nIGNhcmUgdG8gY29uc2lkZXIgb25seQorICAgICAgICAvLyB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0CisgICAgICAgIEluZGV4IHMgPSBzaXplLWluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyLTE7IC8vIHRyYWlsaW5nIHNpemUgYWZ0ZXIgdGhlIGJpZ2dlc3QgZWxlbWVudAorICAgICAgICBtYXQucm93KGspLmhlYWQoaykuc3dhcChtYXQucm93KGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyKS5oZWFkKGspKTsKKyAgICAgICAgbWF0LmNvbChrKS50YWlsKHMpLnN3YXAobWF0LmNvbChpbmRleF9vZl9iaWdnZXN0X2luX2Nvcm5lcikudGFpbChzKSk7CisgICAgICAgIHN0ZDo6c3dhcChtYXQuY29lZmZSZWYoayxrKSxtYXQuY29lZmZSZWYoaW5kZXhfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIsaW5kZXhfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpKTsKKyAgICAgICAgZm9yKGludCBpPWsrMTtpPGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyOysraSkKKyAgICAgICAgeworICAgICAgICAgIFNjYWxhciB0bXAgPSBtYXQuY29lZmZSZWYoaSxrKTsKKyAgICAgICAgICBtYXQuY29lZmZSZWYoaSxrKSA9IGNvbmoobWF0LmNvZWZmUmVmKGluZGV4X29mX2JpZ2dlc3RfaW5fY29ybmVyLGkpKTsKKyAgICAgICAgICBtYXQuY29lZmZSZWYoaW5kZXhfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIsaSkgPSBjb25qKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkKKyAgICAgICAgICBtYXQuY29lZmZSZWYoaW5kZXhfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIsaykgPSBjb25qKG1hdC5jb2VmZihpbmRleF9vZl9iaWdnZXN0X2luX2Nvcm5lcixrKSk7CisgICAgICB9CisKKyAgICAgIC8vIHBhcnRpdGlvbiB0aGUgbWF0cml4OgorICAgICAgLy8gICAgICAgQTAwIHwgIC0gIHwgIC0KKyAgICAgIC8vIGx1ICA9IEExMCB8IEExMSB8ICAtCisgICAgICAvLyAgICAgICBBMjAgfCBBMjEgfCBBMjIKKyAgICAgIEluZGV4IHJzID0gc2l6ZSAtIGsgLSAxOworICAgICAgQmxvY2s8TWF0cml4VHlwZSxEeW5hbWljLDE+IEEyMShtYXQsaysxLGsscnMsMSk7CisgICAgICBCbG9jazxNYXRyaXhUeXBlLDEsRHluYW1pYz4gQTEwKG1hdCxrLDAsMSxrKTsKKyAgICAgIEJsb2NrPE1hdHJpeFR5cGUsRHluYW1pYyxEeW5hbWljPiBBMjAobWF0LGsrMSwwLHJzLGspOworCisgICAgICBpZihrPjApCisgICAgICB7CisgICAgICAgIHRlbXAuaGVhZChrKSA9IG1hdC5kaWFnb25hbCgpLmhlYWQoaykuYXNEaWFnb25hbCgpICogQTEwLmFkam9pbnQoKTsKKyAgICAgICAgbWF0LmNvZWZmUmVmKGssaykgLT0gKEExMCAqIHRlbXAuaGVhZChrKSkudmFsdWUoKTsKKyAgICAgICAgaWYocnM+MCkKKyAgICAgICAgICBBMjEubm9hbGlhcygpIC09IEEyMCAqIHRlbXAuaGVhZChrKTsKKyAgICAgIH0KKyAgICAgIGlmKChycz4wKSAmJiAoYWJzKG1hdC5jb2VmZlJlZihrLGspKSA+IGN1dG9mZikpCisgICAgICAgIEEyMSAvPSBtYXQuY29lZmZSZWYoayxrKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFJlZmVyZW5jZSBmb3IgdGhlIGFsZ29yaXRobTogRGF2aXMgYW5kIEhhZ2VyLCAiTXVsdGlwbGUgUmFuaworICAvLyBNb2RpZmljYXRpb25zIG9mIGEgU3BhcnNlIENob2xlc2t5IEZhY3Rvcml6YXRpb24iIChBbGdvcml0aG0gMSkKKyAgLy8gVHJpdmlhbCByZWFycmFuZ2VtZW50cyBvZiB0aGVpciBjb21wdXRhdGlvbnMgKFRpbW90aHkgRS4gSG9seSkKKyAgLy8gYWxsb3cgdGhlaXIgYWxnb3JpdGhtIHRvIHdvcmsgZm9yIHJhbmstMSB1cGRhdGVzIGV2ZW4gaWYgdGhlCisgIC8vIG9yaWdpbmFsIG1hdHJpeCBpcyBub3Qgb2YgZnVsbCByYW5rLgorICAvLyBIZXJlIG9ubHkgcmFuay0xIHVwZGF0ZXMgYXJlIGltcGxlbWVudGVkLCB0byByZWR1Y2UgdGhlCisgIC8vIHJlcXVpcmVtZW50IGZvciBpbnRlcm1lZGlhdGUgc3RvcmFnZSBhbmQgaW1wcm92ZSBhY2N1cmFjeQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBXRGVyaXZlZD4KKyAgc3RhdGljIGJvb2wgdXBkYXRlSW5QbGFjZShNYXRyaXhUeXBlJiBtYXQsIE1hdHJpeEJhc2U8V0Rlcml2ZWQ+JiB3LCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIHNpZ21hPTEpCisgIHsKKyAgICB1c2luZyBpbnRlcm5hbDo6aXNmaW5pdGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgICBjb25zdCBJbmRleCBzaXplID0gbWF0LnJvd3MoKTsKKyAgICBlaWdlbl9hc3NlcnQobWF0LmNvbHMoKSA9PSBzaXplICYmIHcuc2l6ZSgpPT1zaXplKTsKKworICAgIFJlYWxTY2FsYXIgYWxwaGEgPSAxOworCisgICAgLy8gQXBwbHkgdGhlIHVwZGF0ZQorICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBzaXplOyBqKyspCisgICAgeworICAgICAgLy8gQ2hlY2sgZm9yIHRlcm1pbmF0aW9uIGR1ZSB0byBhbiBvcmlnaW5hbCBkZWNvbXBvc2l0aW9uIG9mIGxvdy1yYW5rCisgICAgICBpZiAoIShpc2Zpbml0ZSkoYWxwaGEpKQorICAgICAgICBicmVhazsKKworICAgICAgLy8gVXBkYXRlIHRoZSBkaWFnb25hbCB0ZXJtcworICAgICAgUmVhbFNjYWxhciBkaiA9IHJlYWwobWF0LmNvZWZmKGosaikpOworICAgICAgU2NhbGFyIHdqID0gdy5jb2VmZihqKTsKKyAgICAgIFJlYWxTY2FsYXIgc3dqMiA9IHNpZ21hKmFiczIod2opOworICAgICAgUmVhbFNjYWxhciBnYW1tYSA9IGRqKmFscGhhICsgc3dqMjsKKworICAgICAgbWF0LmNvZWZmUmVmKGosaikgKz0gc3dqMi9hbHBoYTsKKyAgICAgIGFscGhhICs9IHN3ajIvZGo7CisKKworICAgICAgLy8gVXBkYXRlIHRoZSB0ZXJtcyBvZiBMCisgICAgICBJbmRleCBycyA9IHNpemUtai0xOworICAgICAgdy50YWlsKHJzKSAtPSB3aiAqIG1hdC5jb2woaikudGFpbChycyk7CisgICAgICBpZihnYW1tYSAhPSAwKQorICAgICAgICBtYXQuY29sKGopLnRhaWwocnMpICs9IChzaWdtYSpjb25qKHdqKS9nYW1tYSkqdy50YWlsKHJzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uVHlwZSwgdHlwZW5hbWUgV29ya3NwYWNlLCB0eXBlbmFtZSBXVHlwZT4KKyAgc3RhdGljIGJvb2wgdXBkYXRlKE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgVHJhbnNwb3NpdGlvblR5cGUmIHRyYW5zcG9zaXRpb25zLCBXb3Jrc3BhY2UmIHRtcCwgY29uc3QgV1R5cGUmIHcsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgc2lnbWE9MSkKKyAgeworICAgIC8vIEFwcGx5IHRoZSBwZXJtdXRhdGlvbiB0byB0aGUgaW5wdXQgdworICAgIHRtcCA9IHRyYW5zcG9zaXRpb25zICogdzsKKworICAgIHJldHVybiBsZGx0X2lucGxhY2U8TG93ZXI+Ojp1cGRhdGVJblBsYWNlKG1hdCx0bXAsc2lnbWEpOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBsZGx0X2lucGxhY2U8VXBwZXI+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBXb3Jrc3BhY2U+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgdW5ibG9ja2VkKE1hdHJpeFR5cGUmIG1hdCwgVHJhbnNwb3NpdGlvblR5cGUmIHRyYW5zcG9zaXRpb25zLCBXb3Jrc3BhY2UmIHRlbXAsIGludCogc2lnbj0wKQorICB7CisgICAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IG1hdHQobWF0KTsKKyAgICByZXR1cm4gbGRsdF9pbnBsYWNlPExvd2VyPjo6dW5ibG9ja2VkKG1hdHQsIHRyYW5zcG9zaXRpb25zLCB0ZW1wLCBzaWduKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBXb3Jrc3BhY2UsIHR5cGVuYW1lIFdUeXBlPgorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBib29sIHVwZGF0ZShNYXRyaXhUeXBlJiBtYXQsIFRyYW5zcG9zaXRpb25UeXBlJiB0cmFuc3Bvc2l0aW9ucywgV29ya3NwYWNlJiB0bXAsIFdUeXBlJiB3LCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIHNpZ21hPTEpCisgIHsKKyAgICBUcmFuc3Bvc2U8TWF0cml4VHlwZT4gbWF0dChtYXQpOworICAgIHJldHVybiBsZGx0X2lucGxhY2U8TG93ZXI+Ojp1cGRhdGUobWF0dCwgdHJhbnNwb3NpdGlvbnMsIHRtcCwgdy5jb25qdWdhdGUoKSwgc2lnbWEpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBzdHJ1Y3QgTERMVF9UcmFpdHM8TWF0cml4VHlwZSxMb3dlcj4KK3sKKyAgdHlwZWRlZiBjb25zdCBUcmlhbmd1bGFyVmlldzxjb25zdCBNYXRyaXhUeXBlLCBVbml0TG93ZXI+IE1hdHJpeEw7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsIFVuaXRVcHBlcj4gTWF0cml4VTsKKyAgc3RhdGljIGlubGluZSBNYXRyaXhMIGdldEwoY29uc3QgTWF0cml4VHlwZSYgbSkgeyByZXR1cm4gbTsgfQorICBzdGF0aWMgaW5saW5lIE1hdHJpeFUgZ2V0VShjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBtLmFkam9pbnQoKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IExETFRfVHJhaXRzPE1hdHJpeFR5cGUsVXBwZXI+Cit7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsIFVuaXRMb3dlcj4gTWF0cml4TDsKKyAgdHlwZWRlZiBjb25zdCBUcmlhbmd1bGFyVmlldzxjb25zdCBNYXRyaXhUeXBlLCBVbml0VXBwZXI+IE1hdHJpeFU7CisgIHN0YXRpYyBpbmxpbmUgTWF0cml4TCBnZXRMKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIG0uYWRqb2ludCgpOyB9CisgIHN0YXRpYyBpbmxpbmUgTWF0cml4VSBnZXRVKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIG07IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogQ29tcHV0ZSAvIHJlY29tcHV0ZSB0aGUgTERMVCBkZWNvbXBvc2l0aW9uIEEgPSBMIEQgTF4qID0gVV4qIEQgVSBvZiBcYSBtYXRyaXgKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBfVXBMbz4KK0xETFQ8TWF0cml4VHlwZSxfVXBMbz4mIExETFQ8TWF0cml4VHlwZSxfVXBMbz46OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgYSkKK3sKKyAgZWlnZW5fYXNzZXJ0KGEucm93cygpPT1hLmNvbHMoKSk7CisgIGNvbnN0IEluZGV4IHNpemUgPSBhLnJvd3MoKTsKKworICBtX21hdHJpeCA9IGE7CisKKyAgbV90cmFuc3Bvc2l0aW9ucy5yZXNpemUoc2l6ZSk7CisgIG1faXNJbml0aWFsaXplZCA9IGZhbHNlOworICBtX3RlbXBvcmFyeS5yZXNpemUoc2l6ZSk7CisKKyAgaW50ZXJuYWw6OmxkbHRfaW5wbGFjZTxVcExvPjo6dW5ibG9ja2VkKG1fbWF0cml4LCBtX3RyYW5zcG9zaXRpb25zLCBtX3RlbXBvcmFyeSwgJm1fc2lnbik7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogVXBkYXRlIHRoZSBMRExUIGRlY29tcG9zaXRpb246ICBnaXZlbiBBID0gTCBEIExeVCwgZWZmaWNpZW50bHkgY29tcHV0ZSB0aGUgZGVjb21wb3NpdGlvbiBvZiBBICsgc2lnbWEgdyB3XlQuCisgKiBccGFyYW0gdyBhIHZlY3RvciB0byBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgZGVjb21wb3NpdGlvbi4KKyAqIFxwYXJhbSBzaWdtYSBhIHNjYWxhciwgKzEgZm9yIHVwZGF0ZXMgYW5kIC0xIGZvciAiZG93bmRhdGVzLCIgd2hpY2ggY29ycmVzcG9uZCB0byByZW1vdmluZyBwcmV2aW91c2x5LWFkZGVkIGNvbHVtbiB2ZWN0b3JzLiBPcHRpb25hbDsgZGVmYXVsdCB2YWx1ZSBpcyArMS4KKyAqIFxzYSBzZXRaZXJvKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBfVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitMRExUPE1hdHJpeFR5cGUsX1VwTG8+JiBMRExUPE1hdHJpeFR5cGUsX1VwTG8+OjpyYW5rVXBkYXRlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHcsdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWwgc2lnbWEpCit7CisgIGNvbnN0IEluZGV4IHNpemUgPSB3LnJvd3MoKTsKKyAgaWYgKG1faXNJbml0aWFsaXplZCkKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX21hdHJpeC5yb3dzKCk9PXNpemUpOworICB9CisgIGVsc2UKKyAgeyAgICAKKyAgICBtX21hdHJpeC5yZXNpemUoc2l6ZSxzaXplKTsKKyAgICBtX21hdHJpeC5zZXRaZXJvKCk7CisgICAgbV90cmFuc3Bvc2l0aW9ucy5yZXNpemUoc2l6ZSk7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgIG1fdHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaSkgPSBpOworICAgIG1fdGVtcG9yYXJ5LnJlc2l6ZShzaXplKTsKKyAgICBtX3NpZ24gPSBzaWdtYT49MCA/IDEgOiAtMTsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICB9CisKKyAgaW50ZXJuYWw6OmxkbHRfaW5wbGFjZTxVcExvPjo6dXBkYXRlKG1fbWF0cml4LCBtX3RyYW5zcG9zaXRpb25zLCBtX3RlbXBvcmFyeSwgdywgc2lnbWEpOworCisgIHJldHVybiAqdGhpczsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8sIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBzb2x2ZV9yZXR2YWw8TERMVDxfTWF0cml4VHlwZSxfVXBMbz4sIFJocz4KKyAgOiBzb2x2ZV9yZXR2YWxfYmFzZTxMRExUPF9NYXRyaXhUeXBlLF9VcExvPiwgUmhzPgoreworICB0eXBlZGVmIExETFQ8X01hdHJpeFR5cGUsX1VwTG8+IExETFRUeXBlOworICBFSUdFTl9NQUtFX1NPTFZFX0hFTFBFUlMoTERMVFR5cGUsUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChyaHMoKS5yb3dzKCkgPT0gZGVjKCkubWF0cml4TERMVCgpLnJvd3MoKSk7CisgICAgLy8gZHN0ID0gUCBiCisgICAgZHN0ID0gZGVjKCkudHJhbnNwb3NpdGlvbnNQKCkgKiByaHMoKTsKKworICAgIC8vIGRzdCA9IExeLTEgKFAgYikKKyAgICBkZWMoKS5tYXRyaXhMKCkuc29sdmVJblBsYWNlKGRzdCk7CisKKyAgICAvLyBkc3QgPSBEXi0xIChMXi0xIFAgYikKKyAgICAvLyBtb3JlIHByZWNpc2VseSwgdXNlIHBzZXVkby1pbnZlcnNlIG9mIEQgKHNlZSBidWcgMjQxKQorICAgIHVzaW5nIHN0ZDo6YWJzOworICAgIHVzaW5nIHN0ZDo6bWF4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTERMVFR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExETFRUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTERMVFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICBjb25zdCBEaWFnb25hbDxjb25zdCBNYXRyaXhUeXBlPiB2ZWN0b3JEID0gZGVjKCkudmVjdG9yRCgpOworICAgIFJlYWxTY2FsYXIgdG9sZXJhbmNlID0gKG1heCkodmVjdG9yRC5hcnJheSgpLmFicygpLm1heENvZWZmKCkgKiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpLAorCQkJCSBSZWFsU2NhbGFyKDEpIC8gTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpoaWdoZXN0KCkpOyAvLyBtb3RpdmF0ZWQgYnkgTEFQQUNLJ3MgeEdFTFNTCisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHZlY3RvckQuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmKGFicyh2ZWN0b3JEKGkpKSA+IHRvbGVyYW5jZSkKKwlkc3Qucm93KGkpIC89IHZlY3RvckQoaSk7CisgICAgICBlbHNlCisJZHN0LnJvdyhpKS5zZXRaZXJvKCk7CisgICAgfQorCisgICAgLy8gZHN0ID0gTF4tVCAoRF4tMSBMXi0xIFAgYikKKyAgICBkZWMoKS5tYXRyaXhVKCkuc29sdmVJblBsYWNlKGRzdCk7CisKKyAgICAvLyBkc3QgPSBQXi0xIChMXi1UIEReLTEgTF4tMSBQIGIpID0gQV4tMSBiCisgICAgZHN0ID0gZGVjKCkudHJhbnNwb3NpdGlvbnNQKCkudHJhbnNwb3NlKCkgKiBkc3Q7CisgIH0KK307Cit9CisKKy8qKiBcaW50ZXJuYWwgdXNlIHggPSBsZGx0X29iamVjdC5zb2x2ZSh4KTsKKyAgKgorICAqIFRoaXMgaXMgdGhlIFxlbSBpbi1wbGFjZSB2ZXJzaW9uIG9mIHNvbHZlKCkuCisgICoKKyAgKiBccGFyYW0gYkFuZFggcmVwcmVzZW50cyBib3RoIHRoZSByaWdodC1oYW5kIHNpZGUgbWF0cml4IGIgYW5kIHJlc3VsdCB4LgorICAqCisgICogXHJldHVybnMgdHJ1ZSBhbHdheXMhIElmIHlvdSBuZWVkIHRvIGNoZWNrIGZvciBleGlzdGVuY2Ugb2Ygc29sdXRpb25zLCB1c2UgYW5vdGhlciBkZWNvbXBvc2l0aW9uIGxpa2UgTFUsIFFSLCBvciBTVkQuCisgICoKKyAgKiBUaGlzIHZlcnNpb24gYXZvaWRzIGEgY29weSB3aGVuIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIgaXMgbm90CisgICogbmVlZGVkIGFueW1vcmUuCisgICoKKyAgKiBcc2EgTERMVDo6c29sdmUoKSwgTWF0cml4QmFzZTo6bGRsdCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLGludCBfVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIExETFQ8TWF0cml4VHlwZSxfVXBMbz46OnNvbHZlSW5QbGFjZShNYXRyaXhCYXNlPERlcml2ZWQ+ICZiQW5kWCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTERMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIGNvbnN0IEluZGV4IHNpemUgPSBtX21hdHJpeC5yb3dzKCk7CisgIGVpZ2VuX2Fzc2VydChzaXplID09IGJBbmRYLnJvd3MoKSk7CisKKyAgYkFuZFggPSB0aGlzLT5zb2x2ZShiQW5kWCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHJlcHJlc2VudGVkIGJ5IHRoZSBkZWNvbXBvc2l0aW9uLAorICogaS5lLiwgaXQgcmV0dXJucyB0aGUgcHJvZHVjdDogUF5UIEwgRCBMXiogUC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGRlYnVnIHB1cnBvc2UuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgX1VwTG8+CitNYXRyaXhUeXBlIExETFQ8TWF0cml4VHlwZSxfVXBMbz46OnJlY29uc3RydWN0ZWRNYXRyaXgoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fbWF0cml4LnJvd3MoKTsKKyAgTWF0cml4VHlwZSByZXMoc2l6ZSxzaXplKTsKKworICAvLyBQCisgIHJlcy5zZXRJZGVudGl0eSgpOworICByZXMgPSB0cmFuc3Bvc2l0aW9uc1AoKSAqIHJlczsKKyAgLy8gTF4qIFAKKyAgcmVzID0gbWF0cml4VSgpICogcmVzOworICAvLyBEKExeKlApCisgIHJlcyA9IHZlY3RvckQoKS5hc0RpYWdvbmFsKCkgKiByZXM7CisgIC8vIEwoRExeKlApCisgIHJlcyA9IG1hdHJpeEwoKSAqIHJlczsKKyAgLy8gUF5UIChMRExeKlApCisgIHJlcyA9IHRyYW5zcG9zaXRpb25zUCgpLnRyYW5zcG9zZSgpICogcmVzOworCisgIHJldHVybiByZXM7Cit9CisKKy8qKiBcY2hvbGVza3lfbW9kdWxlCisgICogXHJldHVybnMgdGhlIENob2xlc2t5IGRlY29tcG9zaXRpb24gd2l0aCBmdWxsIHBpdm90aW5nIHdpdGhvdXQgc3F1YXJlIHJvb3Qgb2YgXGMgKnRoaXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPgoraW5saW5lIGNvbnN0IExETFQ8dHlwZW5hbWUgU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsIFVwTG8+OjpQbGFpbk9iamVjdCwgVXBMbz4KK1NlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLCBVcExvPjo6bGRsdCgpIGNvbnN0Cit7CisgIHJldHVybiBMRExUPFBsYWluT2JqZWN0LFVwTG8+KG1fbWF0cml4KTsKK30KKworLyoqIFxjaG9sZXNreV9tb2R1bGUKKyAgKiBccmV0dXJucyB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiB3aXRoIGZ1bGwgcGl2b3Rpbmcgd2l0aG91dCBzcXVhcmUgcm9vdCBvZiBcYyAqdGhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBMRExUPHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6bGRsdCgpIGNvbnN0Cit7CisgIHJldHVybiBMRExUPFBsYWluT2JqZWN0PihkZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0xETFRfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0Nob2xlc2t5L0xMVC5oIGIvRWlnZW4vc3JjL0Nob2xlc2t5L0xMVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDE0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ2hvbGVza3kvTExULmgKQEAgLTAsMCArMSw0ODggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9MTFRfSAorI2RlZmluZSBFSUdFTl9MTFRfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsewordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFVwTG8+IHN0cnVjdCBMTFRfVHJhaXRzOworfQorCisvKiogXGluZ3JvdXAgQ2hvbGVza3lfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgTExUCisgICoKKyAgKiBcYnJpZWYgU3RhbmRhcmQgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiAoTExeVCkgb2YgYSBtYXRyaXggYW5kIGFzc29jaWF0ZWQgZmVhdHVyZXMKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUgTExeVCBDaG9sZXNreSBkZWNvbXBvc2l0aW9uCisgICogXHBhcmFtIFVwTG8gdGhlIHRyaWFuZ3VsYXIgcGFydCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRlY29tcG9zaXRvbjogTG93ZXIgKGRlZmF1bHQpIG9yIFVwcGVyLgorICAqICAgICAgICAgICAgIFRoZSBvdGhlciB0cmlhbmd1bGFyIHBhcnQgd29uJ3QgYmUgcmVhZC4KKyAgKgorICAqIFRoaXMgY2xhc3MgcGVyZm9ybXMgYSBMTF5UIENob2xlc2t5IGRlY29tcG9zaXRpb24gb2YgYSBzeW1tZXRyaWMsIHBvc2l0aXZlIGRlZmluaXRlCisgICogbWF0cml4IEEgc3VjaCB0aGF0IEEgPSBMTF4qID0gVV4qVSwgd2hlcmUgTCBpcyBsb3dlciB0cmlhbmd1bGFyLgorICAqCisgICogV2hpbGUgdGhlIENob2xlc2t5IGRlY29tcG9zaXRpb24gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB0byBzb2x2ZSBzZWxmYWRqb2ludCBwcm9ibGVtcyBsaWtlICBEXipEIHggPSBiLAorICAqIGZvciB0aGF0IHB1cnBvc2UsIHdlIHJlY29tbWVuZCB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiB3aXRob3V0IHNxdWFyZSByb290IHdoaWNoIGlzIG1vcmUgc3RhYmxlCisgICogYW5kIGV2ZW4gZmFzdGVyLiBOZXZlcnRoZWxlc3MsIHRoaXMgc3RhbmRhcmQgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiByZW1haW5zIHVzZWZ1bCBpbiBtYW55IG90aGVyCisgICogc2l0dWF0aW9ucyBsaWtlIGdlbmVyYWxpc2VkIGVpZ2VuIHByb2JsZW1zIHdpdGggaGVybWl0aWFuIG1hdHJpY2VzLgorICAqCisgICogUmVtZW1iZXIgdGhhdCBDaG9sZXNreSBkZWNvbXBvc2l0aW9ucyBhcmUgbm90IHJhbmstcmV2ZWFsaW5nLiBUaGlzIExMVCBkZWNvbXBvc2l0aW9uIGlzIG9ubHkgc3RhYmxlIG9uIHBvc2l0aXZlIGRlZmluaXRlIG1hdHJpY2VzLAorICAqIHVzZSBMRExUIGluc3RlYWQgZm9yIHRoZSBzZW1pZGVmaW5pdGUgY2FzZS4gQWxzbywgZG8gbm90IHVzZSBhIENob2xlc2t5IGRlY29tcG9zaXRpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzeXN0ZW0gb2YgZXF1YXRpb25zCisgICogaGFzIGEgc29sdXRpb24uCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBMTFRfZXhhbXBsZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBMTFRfZXhhbXBsZS5vdXQKKyAgKiAgICAKKyAgKiBcc2EgTWF0cml4QmFzZTo6bGx0KCksIGNsYXNzIExETFQKKyAgKi8KKyAvKiBIRVkgVEhJUyBET1ggSVMgRElTQUJMRUQgQkVDQVVTRSBUSEVSRSdzIEEgQlVHIEVJVEhFUiBIRVJFIE9SIElOIExETFQgQUJPVVQgVEhBVCAoT1IgQk9USCkKKyAgKiBOb3RlIHRoYXQgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLCBvbmx5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcyBjb25zaWRlcmVkLiBUaGVyZWZvcmUsCisgICogdGhlIHN0cmljdCBsb3dlciBwYXJ0IGRvZXMgbm90IGhhdmUgdG8gc3RvcmUgY29ycmVjdCB2YWx1ZXMuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvPiBjbGFzcyBMTFQKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICBlbnVtIHsKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgICBlbnVtIHsKKyAgICAgIFBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplLAorICAgICAgQWxpZ25tZW50TWFzayA9IGludChQYWNrZXRTaXplKS0xLAorICAgICAgVXBMbyA9IF9VcExvCisgICAgfTsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OkxMVF9UcmFpdHM8TWF0cml4VHlwZSxVcExvPiBUcmFpdHM7CisKKyAgICAvKioKKyAgICAgICogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIExMVDo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikuCisgICAgICAqLworICAgIExMVCgpIDogbV9tYXRyaXgoKSwgbV9pc0luaXRpYWxpemVkKGZhbHNlKSB7fQorCisgICAgLyoqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yIHdpdGggbWVtb3J5IHByZWFsbG9jYXRpb24KKyAgICAgICoKKyAgICAgICogTGlrZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBidXQgd2l0aCBwcmVhbGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBkYXRhCisgICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHByb2JsZW0gXGEgc2l6ZS4KKyAgICAgICogXHNhIExMVCgpCisgICAgICAqLworICAgIExMVChJbmRleCBzaXplKSA6IG1fbWF0cml4KHNpemUsIHNpemUpLAorICAgICAgICAgICAgICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKKyAgICBMTFQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBtX21hdHJpeChtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSB2aWV3IG9mIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBVICovCisgICAgaW5saW5lIHR5cGVuYW1lIFRyYWl0czo6TWF0cml4VSBtYXRyaXhVKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMTFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIFRyYWl0czo6Z2V0VShtX21hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgdmlldyBvZiB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggTCAqLworICAgIGlubGluZSB0eXBlbmFtZSBUcmFpdHM6Ok1hdHJpeEwgbWF0cml4TCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBUcmFpdHM6OmdldEwobV9tYXRyaXgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgc29sdXRpb24geCBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbiBvZiBBLgorICAgICAgKgorICAgICAgKiBTaW5jZSB0aGlzIExMVCBjbGFzcyBhc3N1bWVzIGFueXdheSB0aGF0IHRoZSBtYXRyaXggQSBpcyBpbnZlcnRpYmxlLCB0aGUgc29sdXRpb24KKyAgICAgICogdGhlb3JldGljYWxseSBleGlzdHMgYW5kIGlzIHVuaXF1ZSByZWdhcmRsZXNzIG9mIGIuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIExMVF9zb2x2ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTExUX3NvbHZlLm91dAorICAgICAgKgorICAgICAgKiBcc2Egc29sdmVJblBsYWNlKCksIE1hdHJpeEJhc2U6OmxsdCgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxMTFQsIFJocz4KKyAgICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX21hdHJpeC5yb3dzKCk9PWIucm93cygpCisgICAgICAgICAgICAgICAgJiYgIkxMVDo6c29sdmUoKTogaW52YWxpZCBudW1iZXIgb2Ygcm93cyBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCBiIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxMTFQsIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICAjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgYm9vbCBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIGIsIFJlc3VsdFR5cGUgKnJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICAqcmVzdWx0ID0gdGhpcy0+c29sdmUoYik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgYm9vbCBpc1Bvc2l0aXZlRGVmaW5pdGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgI2VuZGlmCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIHZvaWQgc29sdmVJblBsYWNlKE1hdHJpeEJhc2U8RGVyaXZlZD4gJmJBbmRYKSBjb25zdDsKKworICAgIExMVCYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpOworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBMTFQgZGVjb21wb3NpdGlvbiBtYXRyaXgKKyAgICAgICoKKyAgICAgICogVE9ETzogZG9jdW1lbnQgdGhlIHN0b3JhZ2UgbGF5b3V0CisgICAgICAqLworICAgIGlubGluZSBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXhMTFQoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9tYXRyaXg7CisgICAgfQorCisgICAgTWF0cml4VHlwZSByZWNvbnN0cnVjdGVkTWF0cml4KCkgY29uc3Q7CisKKworICAgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHByZXZpb3VzIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNmdWwsCisgICAgICAqICAgICAgICAgIFxjIE51bWVyaWNhbElzc3VlIGlmIHRoZSBtYXRyaXguYXBwZWFycyB0byBiZSBuZWdhdGl2ZS4KKyAgICAgICovCisgICAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+CisgICAgTExUIHJhbmtVcGRhdGUoY29uc3QgVmVjdG9yVHlwZSYgdmVjLCBjb25zdCBSZWFsU2NhbGFyJiBzaWdtYSA9IDEpOworCisgIHByb3RlY3RlZDoKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFVzZWQgdG8gY29tcHV0ZSBhbmQgc3RvcmUgTAorICAgICAgKiBUaGUgc3RyaWN0IHVwcGVyIHBhcnQgaXMgbm90IHVzZWQgYW5kIGV2ZW4gbm90IGluaXRpYWxpemVkLgorICAgICAgKi8KKyAgICBNYXRyaXhUeXBlIG1fbWF0cml4OworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgIENvbXB1dGF0aW9uSW5mbyBtX2luZm87Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBVcExvPiBzdHJ1Y3QgbGx0X2lucGxhY2U7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFZlY3RvclR5cGU+CitzdGF0aWMgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggbGx0X3JhbmtfdXBkYXRlX2xvd2VyKE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgVmVjdG9yVHlwZSYgdmVjLCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiBzaWdtYSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpDb2xYcHIgQ29sWHByOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPENvbFhwcj46OnR5cGUgQ29sWHByQ2xlYW5lZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb2xYcHJDbGVhbmVkOjpTZWdtZW50UmV0dXJuVHlwZSBDb2xYcHJTZWdtZW50OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBUZW1wVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wVmVjdG9yVHlwZTo6U2VnbWVudFJldHVyblR5cGUgVGVtcFZlY1NlZ21lbnQ7CisKKyAgaW50IG4gPSBtYXQuY29scygpOworICBlaWdlbl9hc3NlcnQobWF0LnJvd3MoKT09biAmJiB2ZWMuc2l6ZSgpPT1uKTsKKworICBUZW1wVmVjdG9yVHlwZSB0ZW1wOworCisgIGlmKHNpZ21hPjApCisgIHsKKyAgICAvLyBUaGlzIHZlcnNpb24gaXMgYmFzZWQgb24gR2l2ZW5zIHJvdGF0aW9ucy4KKyAgICAvLyBJdCBpcyBmYXN0ZXIgdGhhbiB0aGUgb3RoZXIgb25lIGJlbG93LCBidXQgb25seSB3b3JrcyBmb3IgdXBkYXRlcywKKyAgICAvLyBpLmUuLCBmb3Igc2lnbWEgPiAwCisgICAgdGVtcCA9IHNxcnQoc2lnbWEpICogdmVjOworCisgICAgZm9yKGludCBpPTA7IGk8bjsgKytpKQorICAgIHsKKyAgICAgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4gZzsKKyAgICAgIGcubWFrZUdpdmVucyhtYXQoaSxpKSwgLXRlbXAoaSksICZtYXQoaSxpKSk7CisKKyAgICAgIGludCBycyA9IG4taS0xOworICAgICAgaWYocnM+MCkKKyAgICAgIHsKKyAgICAgICAgQ29sWHByU2VnbWVudCB4KG1hdC5jb2woaSkudGFpbChycykpOworICAgICAgICBUZW1wVmVjU2VnbWVudCB5KHRlbXAudGFpbChycykpOworICAgICAgICBhcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUoeCwgeSwgZyk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHRlbXAgPSB2ZWM7CisgICAgUmVhbFNjYWxhciBiZXRhID0gMTsKKyAgICBmb3IoaW50IGo9MDsgajxuOyArK2opCisgICAgeworICAgICAgUmVhbFNjYWxhciBMamogPSByZWFsKG1hdC5jb2VmZihqLGopKTsKKyAgICAgIFJlYWxTY2FsYXIgZGogPSBhYnMyKExqaik7CisgICAgICBTY2FsYXIgd2ogPSB0ZW1wLmNvZWZmKGopOworICAgICAgUmVhbFNjYWxhciBzd2oyID0gc2lnbWEqYWJzMih3aik7CisgICAgICBSZWFsU2NhbGFyIGdhbW1hID0gZGoqYmV0YSArIHN3ajI7CisKKyAgICAgIFJlYWxTY2FsYXIgeCA9IGRqICsgc3dqMi9iZXRhOworICAgICAgaWYgKHg8PVJlYWxTY2FsYXIoMCkpCisgICAgICAgIHJldHVybiBqOworICAgICAgUmVhbFNjYWxhciBuTGpqID0gc3FydCh4KTsKKyAgICAgIG1hdC5jb2VmZlJlZihqLGopID0gbkxqajsKKyAgICAgIGJldGEgKz0gc3dqMi9kajsKKworICAgICAgLy8gVXBkYXRlIHRoZSB0ZXJtcyBvZiBMCisgICAgICBJbmRleCBycyA9IG4tai0xOworICAgICAgaWYocnMpCisgICAgICB7CisgICAgICAgIHRlbXAudGFpbChycykgLT0gKHdqL0xqaikgKiBtYXQuY29sKGopLnRhaWwocnMpOworICAgICAgICBpZihnYW1tYSAhPSAwKQorICAgICAgICAgIG1hdC5jb2woaikudGFpbChycykgPSAobkxqai9MamopICogbWF0LmNvbChqKS50YWlsKHJzKSArIChuTGpqICogc2lnbWEqY29uaih3aikvZ2FtbWEpKnRlbXAudGFpbChycyk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgbGx0X2lucGxhY2U8U2NhbGFyLCBMb3dlcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICBzdGF0aWMgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggdW5ibG9ja2VkKE1hdHJpeFR5cGUmIG1hdCkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgCisgICAgZWlnZW5fYXNzZXJ0KG1hdC5yb3dzKCk9PW1hdC5jb2xzKCkpOworICAgIGNvbnN0IEluZGV4IHNpemUgPSBtYXQucm93cygpOworICAgIGZvcihJbmRleCBrID0gMDsgayA8IHNpemU7ICsraykKKyAgICB7CisgICAgICBJbmRleCBycyA9IHNpemUtay0xOyAvLyByZW1haW5pbmcgc2l6ZQorCisgICAgICBCbG9jazxNYXRyaXhUeXBlLER5bmFtaWMsMT4gQTIxKG1hdCxrKzEsayxycywxKTsKKyAgICAgIEJsb2NrPE1hdHJpeFR5cGUsMSxEeW5hbWljPiBBMTAobWF0LGssMCwxLGspOworICAgICAgQmxvY2s8TWF0cml4VHlwZSxEeW5hbWljLER5bmFtaWM+IEEyMChtYXQsaysxLDAscnMsayk7CisKKyAgICAgIFJlYWxTY2FsYXIgeCA9IHJlYWwobWF0LmNvZWZmKGssaykpOworICAgICAgaWYgKGs+MCkgeCAtPSBBMTAuc3F1YXJlZE5vcm0oKTsKKyAgICAgIGlmICh4PD1SZWFsU2NhbGFyKDApKQorICAgICAgICByZXR1cm4gazsKKyAgICAgIG1hdC5jb2VmZlJlZihrLGspID0geCA9IHNxcnQoeCk7CisgICAgICBpZiAoaz4wICYmIHJzPjApIEEyMS5ub2FsaWFzKCkgLT0gQTIwICogQTEwLmFkam9pbnQoKTsKKyAgICAgIGlmIChycz4wKSBBMjEgKj0gUmVhbFNjYWxhcigxKS94OworICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICBzdGF0aWMgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggYmxvY2tlZChNYXRyaXhUeXBlJiBtKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICBlaWdlbl9hc3NlcnQobS5yb3dzKCk9PW0uY29scygpKTsKKyAgICBJbmRleCBzaXplID0gbS5yb3dzKCk7CisgICAgaWYoc2l6ZTwzMikKKyAgICAgIHJldHVybiB1bmJsb2NrZWQobSk7CisKKyAgICBJbmRleCBibG9ja1NpemUgPSBzaXplLzg7CisgICAgYmxvY2tTaXplID0gKGJsb2NrU2l6ZS8xNikqMTY7CisgICAgYmxvY2tTaXplID0gKHN0ZDo6bWluKSgoc3RkOjptYXgpKGJsb2NrU2l6ZSxJbmRleCg4KSksIEluZGV4KDEyOCkpOworCisgICAgZm9yIChJbmRleCBrPTA7IGs8c2l6ZTsgays9YmxvY2tTaXplKQorICAgIHsKKyAgICAgIC8vIHBhcnRpdGlvbiB0aGUgbWF0cml4OgorICAgICAgLy8gICAgICAgQTAwIHwgIC0gIHwgIC0KKyAgICAgIC8vIGx1ICA9IEExMCB8IEExMSB8ICAtCisgICAgICAvLyAgICAgICBBMjAgfCBBMjEgfCBBMjIKKyAgICAgIEluZGV4IGJzID0gKHN0ZDo6bWluKShibG9ja1NpemUsIHNpemUtayk7CisgICAgICBJbmRleCBycyA9IHNpemUgLSBrIC0gYnM7CisgICAgICBCbG9jazxNYXRyaXhUeXBlLER5bmFtaWMsRHluYW1pYz4gQTExKG0saywgICBrLCAgIGJzLGJzKTsKKyAgICAgIEJsb2NrPE1hdHJpeFR5cGUsRHluYW1pYyxEeW5hbWljPiBBMjEobSxrK2JzLGssICAgcnMsYnMpOworICAgICAgQmxvY2s8TWF0cml4VHlwZSxEeW5hbWljLER5bmFtaWM+IEEyMihtLGsrYnMsayticyxycyxycyk7CisKKyAgICAgIEluZGV4IHJldDsKKyAgICAgIGlmKChyZXQ9dW5ibG9ja2VkKEExMSkpPj0wKSByZXR1cm4gaytyZXQ7CisgICAgICBpZihycz4wKSBBMTEuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRlbXBsYXRlIHNvbHZlSW5QbGFjZTxPblRoZVJpZ2h0PihBMjEpOworICAgICAgaWYocnM+MCkgQTIyLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKEEyMSwtMSk7IC8vIGJvdHRsZW5lY2sKKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgVmVjdG9yVHlwZT4KKyAgc3RhdGljIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHJhbmtVcGRhdGUoTWF0cml4VHlwZSYgbWF0LCBjb25zdCBWZWN0b3JUeXBlJiB2ZWMsIGNvbnN0IFJlYWxTY2FsYXImIHNpZ21hKQorICB7CisgICAgcmV0dXJuIEVpZ2VuOjppbnRlcm5hbDo6bGx0X3JhbmtfdXBkYXRlX2xvd2VyKG1hdCwgdmVjLCBzaWdtYSk7CisgIH0KK307CisgIAordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgbGx0X2lucGxhY2U8U2NhbGFyLCBVcHBlcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHVuYmxvY2tlZChNYXRyaXhUeXBlJiBtYXQpCisgIHsKKyAgICBUcmFuc3Bvc2U8TWF0cml4VHlwZT4gbWF0dChtYXQpOworICAgIHJldHVybiBsbHRfaW5wbGFjZTxTY2FsYXIsIExvd2VyPjo6dW5ibG9ja2VkKG1hdHQpOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGJsb2NrZWQoTWF0cml4VHlwZSYgbWF0KQorICB7CisgICAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IG1hdHQobWF0KTsKKyAgICByZXR1cm4gbGx0X2lucGxhY2U8U2NhbGFyLCBMb3dlcj46OmJsb2NrZWQobWF0dCk7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgVmVjdG9yVHlwZT4KKyAgc3RhdGljIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHJhbmtVcGRhdGUoTWF0cml4VHlwZSYgbWF0LCBjb25zdCBWZWN0b3JUeXBlJiB2ZWMsIGNvbnN0IFJlYWxTY2FsYXImIHNpZ21hKQorICB7CisgICAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IG1hdHQobWF0KTsKKyAgICByZXR1cm4gbGx0X2lucGxhY2U8U2NhbGFyLCBMb3dlcj46OnJhbmtVcGRhdGUobWF0dCwgdmVjLmNvbmp1Z2F0ZSgpLCBzaWdtYSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHN0cnVjdCBMTFRfVHJhaXRzPE1hdHJpeFR5cGUsTG93ZXI+Cit7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgTWF0cml4VHlwZSwgTG93ZXI+IE1hdHJpeEw7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsIFVwcGVyPiBNYXRyaXhVOworICBzdGF0aWMgaW5saW5lIE1hdHJpeEwgZ2V0TChjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBtOyB9CisgIHN0YXRpYyBpbmxpbmUgTWF0cml4VSBnZXRVKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIG0uYWRqb2ludCgpOyB9CisgIHN0YXRpYyBib29sIGlucGxhY2VfZGVjb21wb3NpdGlvbihNYXRyaXhUeXBlJiBtKQorICB7IHJldHVybiBsbHRfaW5wbGFjZTx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIExvd2VyPjo6YmxvY2tlZChtKT09LTE7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHN0cnVjdCBMTFRfVHJhaXRzPE1hdHJpeFR5cGUsVXBwZXI+Cit7CisgIHR5cGVkZWYgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsIExvd2VyPiBNYXRyaXhMOworICB0eXBlZGVmIGNvbnN0IFRyaWFuZ3VsYXJWaWV3PGNvbnN0IE1hdHJpeFR5cGUsIFVwcGVyPiBNYXRyaXhVOworICBzdGF0aWMgaW5saW5lIE1hdHJpeEwgZ2V0TChjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBtLmFkam9pbnQoKTsgfQorICBzdGF0aWMgaW5saW5lIE1hdHJpeFUgZ2V0VShjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBtOyB9CisgIHN0YXRpYyBib29sIGlucGxhY2VfZGVjb21wb3NpdGlvbihNYXRyaXhUeXBlJiBtKQorICB7IHJldHVybiBsbHRfaW5wbGFjZTx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIFVwcGVyPjo6YmxvY2tlZChtKT09LTE7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogQ29tcHV0ZXMgLyByZWNvbXB1dGVzIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIEEgPSBMTF4qID0gVV4qVSBvZiBcYSBtYXRyaXgKKyAgKgorICAqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvICp0aGlzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBUdXRvcmlhbExpbkFsZ0NvbXB1dGVUd2ljZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBUdXRvcmlhbExpbkFsZ0NvbXB1dGVUd2ljZS5vdXQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBfVXBMbz4KK0xMVDxNYXRyaXhUeXBlLF9VcExvPiYgTExUPE1hdHJpeFR5cGUsX1VwTG8+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIGEpCit7CisgIGVpZ2VuX2Fzc2VydChhLnJvd3MoKT09YS5jb2xzKCkpOworICBjb25zdCBJbmRleCBzaXplID0gYS5yb3dzKCk7CisgIG1fbWF0cml4LnJlc2l6ZShzaXplLCBzaXplKTsKKyAgbV9tYXRyaXggPSBhOworCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIGJvb2wgb2sgPSBUcmFpdHM6OmlucGxhY2VfZGVjb21wb3NpdGlvbihtX21hdHJpeCk7CisgIG1faW5mbyA9IG9rID8gU3VjY2VzcyA6IE51bWVyaWNhbElzc3VlOworCisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFBlcmZvcm1zIGEgcmFuayBvbmUgdXBkYXRlIChvciBkb3dkYXRlKSBvZiB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uLgorICAqIElmIEEgPSBMTF4qIGJlZm9yZSB0aGUgcmFuayBvbmUgdXBkYXRlLAorICAqIHRoZW4gYWZ0ZXIgaXQgd2UgaGF2ZSBMTF4qID0gQSArIHNpZ21hICogdiB2Xiogd2hlcmUgXGEgdiBtdXN0IGJlIGEgdmVjdG9yCisgICogb2Ygc2FtZSBkaW1lbnNpb24uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvPgordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4KK0xMVDxfTWF0cml4VHlwZSxfVXBMbz4gTExUPF9NYXRyaXhUeXBlLF9VcExvPjo6cmFua1VwZGF0ZShjb25zdCBWZWN0b3JUeXBlJiB2LCBjb25zdCBSZWFsU2NhbGFyJiBzaWdtYSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShWZWN0b3JUeXBlKTsKKyAgZWlnZW5fYXNzZXJ0KHYuc2l6ZSgpPT1tX21hdHJpeC5jb2xzKCkpOworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkKTsKKyAgaWYoaW50ZXJuYWw6OmxsdF9pbnBsYWNlPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgVXBMbz46OnJhbmtVcGRhdGUobV9tYXRyaXgsdixzaWdtYSk+PTApCisgICAgbV9pbmZvID0gTnVtZXJpY2FsSXNzdWU7CisgIGVsc2UKKyAgICBtX2luZm8gPSBTdWNjZXNzOworCisgIHJldHVybiAqdGhpczsKK30KKyAgICAKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IFVwTG8sIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBzb2x2ZV9yZXR2YWw8TExUPF9NYXRyaXhUeXBlLCBVcExvPiwgUmhzPgorICA6IHNvbHZlX3JldHZhbF9iYXNlPExMVDxfTWF0cml4VHlwZSwgVXBMbz4sIFJocz4KK3sKKyAgdHlwZWRlZiBMTFQ8X01hdHJpeFR5cGUsVXBMbz4gTExUVHlwZTsKKyAgRUlHRU5fTUFLRV9TT0xWRV9IRUxQRVJTKExMVFR5cGUsUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGRzdCA9IHJocygpOworICAgIGRlYygpLnNvbHZlSW5QbGFjZShkc3QpOworICB9Cit9OworfQorCisvKiogXGludGVybmFsIHVzZSB4ID0gbGx0X29iamVjdC5zb2x2ZSh4KTsKKyAgKiAKKyAgKiBUaGlzIGlzIHRoZSBcZW0gaW4tcGxhY2UgdmVyc2lvbiBvZiBzb2x2ZSgpLgorICAqCisgICogXHBhcmFtIGJBbmRYIHJlcHJlc2VudHMgYm90aCB0aGUgcmlnaHQtaGFuZCBzaWRlIG1hdHJpeCBiIGFuZCByZXN1bHQgeC4KKyAgKgorICAqIFxyZXR1cm5zIHRydWUgYWx3YXlzISBJZiB5b3UgbmVlZCB0byBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIHNvbHV0aW9ucywgdXNlIGFub3RoZXIgZGVjb21wb3NpdGlvbiBsaWtlIExVLCBRUiwgb3IgU1ZELgorICAqCisgICogVGhpcyB2ZXJzaW9uIGF2b2lkcyBhIGNvcHkgd2hlbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCBiIGlzIG5vdAorICAqIG5lZWRlZCBhbnltb3JlLgorICAqCisgICogXHNhIExMVDo6c29sdmUoKSwgTWF0cml4QmFzZTo6bGx0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBfVXBMbz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIExMVDxNYXRyaXhUeXBlLF9VcExvPjo6c29sdmVJblBsYWNlKE1hdHJpeEJhc2U8RGVyaXZlZD4gJmJBbmRYKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMTFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9tYXRyaXgucm93cygpPT1iQW5kWC5yb3dzKCkpOworICBtYXRyaXhMKCkuc29sdmVJblBsYWNlKGJBbmRYKTsKKyAgbWF0cml4VSgpLnNvbHZlSW5QbGFjZShiQW5kWCk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHJlcHJlc2VudGVkIGJ5IHRoZSBkZWNvbXBvc2l0aW9uLAorICogaS5lLiwgaXQgcmV0dXJucyB0aGUgcHJvZHVjdDogTCBMXiouCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBkZWJ1ZyBwdXJwb3NlLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IF9VcExvPgorTWF0cml4VHlwZSBMTFQ8TWF0cml4VHlwZSxfVXBMbz46OnJlY29uc3RydWN0ZWRNYXRyaXgoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMTFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICByZXR1cm4gbWF0cml4TCgpICogbWF0cml4TCgpLmFkam9pbnQoKS50b0RlbnNlTWF0cml4KCk7Cit9CisKKy8qKiBcY2hvbGVza3lfbW9kdWxlCisgICogXHJldHVybnMgdGhlIExMVCBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IExMVDx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmxsdCgpIGNvbnN0Cit7CisgIHJldHVybiBMTFQ8UGxhaW5PYmplY3Q+KGRlcml2ZWQoKSk7Cit9CisKKy8qKiBcY2hvbGVza3lfbW9kdWxlCisgICogXHJldHVybnMgdGhlIExMVCBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgVXBMbz4KK2lubGluZSBjb25zdCBMTFQ8dHlwZW5hbWUgU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsIFVwTG8+OjpQbGFpbk9iamVjdCwgVXBMbz4KK1NlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLCBVcExvPjo6bGx0KCkgY29uc3QKK3sKKyAgcmV0dXJuIExMVDxQbGFpbk9iamVjdCxVcExvPihtX21hdHJpeCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTExUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9DaG9sZXNreS9MTFRfTUtMLmggYi9FaWdlbi9zcmMvQ2hvbGVza3kvTExUX01LTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZGFhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ2hvbGVza3kvTExUX01LTC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gSW50ZWwoUikgTUtMCisgKiAgICAgTEx0IGRlY29tcG9zaXRpb24gYmFzZWQgb24gTEFQQUNLRV8/cG90cmYgZnVuY3Rpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fTExUX01LTF9ICisjZGVmaW5lIEVJR0VOX0xMVF9NS0xfSAorCisjaW5jbHVkZSAiRWlnZW4vc3JjL0NvcmUvdXRpbC9NS0xfc3VwcG9ydC5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgbWtsX2xsdDsKKworI2RlZmluZSBFSUdFTl9NS0xfTExUKEVJR1RZUEUsIE1LTFRZUEUsIE1LTFBSRUZJWCkgXAordGVtcGxhdGU8PiBzdHJ1Y3QgbWtsX2xsdDxFSUdUWVBFPiBcCit7IFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gXAorICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHBvdHJmKE1hdHJpeFR5cGUmIG0sIGNoYXIgdXBsbykgXAorICB7IFwKKyAgICBsYXBhY2tfaW50IG1hdHJpeF9vcmRlcjsgXAorICAgIGxhcGFja19pbnQgc2l6ZSwgbGRhLCBpbmZvLCBTdG9yYWdlT3JkZXI7IFwKKyAgICBFSUdUWVBFKiBhOyBcCisgICAgZWlnZW5fYXNzZXJ0KG0ucm93cygpPT1tLmNvbHMoKSk7IFwKKyAgICAvKiBTZXQgdXAgcGFyYW1ldGVycyBmb3IgP3BvdHJmICovIFwKKyAgICBzaXplID0gbS5yb3dzKCk7IFwKKyAgICBTdG9yYWdlT3JkZXIgPSBNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdD9Sb3dNYWpvcjpDb2xNYWpvcjsgXAorICAgIG1hdHJpeF9vcmRlciA9IFN0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyBMQVBBQ0tfUk9XX01BSk9SIDogTEFQQUNLX0NPTF9NQUpPUjsgXAorICAgIGEgPSAmKG0uY29lZmZSZWYoMCwwKSk7IFwKKyAgICBsZGEgPSBtLm91dGVyU3RyaWRlKCk7IFwKK1wKKyAgICBpbmZvID0gTEFQQUNLRV8jI01LTFBSRUZJWCMjcG90cmYoIG1hdHJpeF9vcmRlciwgdXBsbywgc2l6ZSwgKE1LTFRZUEUqKWEsIGxkYSApOyBcCisgICAgaW5mbyA9IChpbmZvPT0wKSA/IFN1Y2Nlc3MgOiBOdW1lcmljYWxJc3N1ZTsgXAorICAgIHJldHVybiBpbmZvOyBcCisgIH0gXAorfTsgXAordGVtcGxhdGU8PiBzdHJ1Y3QgbGx0X2lucGxhY2U8RUlHVFlQRSwgTG93ZXI+IFwKK3sgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBcCisgIHN0YXRpYyB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBibG9ja2VkKE1hdHJpeFR5cGUmIG0pIFwKKyAgeyBcCisgICAgcmV0dXJuIG1rbF9sbHQ8RUlHVFlQRT46OnBvdHJmKG0sICdMJyk7IFwKKyAgfSBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFZlY3RvclR5cGU+IFwKKyAgc3RhdGljIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHJhbmtVcGRhdGUoTWF0cml4VHlwZSYgbWF0LCBjb25zdCBWZWN0b3JUeXBlJiB2ZWMsIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXImIHNpZ21hKSBcCisgIHsgcmV0dXJuIEVpZ2VuOjppbnRlcm5hbDo6bGx0X3JhbmtfdXBkYXRlX2xvd2VyKG1hdCwgdmVjLCBzaWdtYSk7IH0gXAorfTsgXAordGVtcGxhdGU8PiBzdHJ1Y3QgbGx0X2lucGxhY2U8RUlHVFlQRSwgVXBwZXI+IFwKK3sgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBcCisgIHN0YXRpYyB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBibG9ja2VkKE1hdHJpeFR5cGUmIG0pIFwKKyAgeyBcCisgICAgcmV0dXJuIG1rbF9sbHQ8RUlHVFlQRT46OnBvdHJmKG0sICdVJyk7IFwKKyAgfSBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFZlY3RvclR5cGU+IFwKKyAgc3RhdGljIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHJhbmtVcGRhdGUoTWF0cml4VHlwZSYgbWF0LCBjb25zdCBWZWN0b3JUeXBlJiB2ZWMsIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXImIHNpZ21hKSBcCisgIHsgXAorICAgIFRyYW5zcG9zZTxNYXRyaXhUeXBlPiBtYXR0KG1hdCk7IFwKKyAgICByZXR1cm4gbGx0X2lucGxhY2U8RUlHVFlQRSwgTG93ZXI+OjpyYW5rVXBkYXRlKG1hdHQsIHZlYy5jb25qdWdhdGUoKSwgc2lnbWEpOyBcCisgIH0gXAorfTsKKworRUlHRU5fTUtMX0xMVChkb3VibGUsIGRvdWJsZSwgZCkKK0VJR0VOX01LTF9MTFQoZmxvYXQsIGZsb2F0LCBzKQorRUlHRU5fTUtMX0xMVChkY29tcGxleCwgTUtMX0NvbXBsZXgxNiwgeikKK0VJR0VOX01LTF9MTFQoc2NvbXBsZXgsIE1LTF9Db21wbGV4OCwgYykKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTExUX01LTF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ2hvbG1vZFN1cHBvcnQvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvQ2hvbG1vZFN1cHBvcnQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0ZGZhNgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9DaG9sbW9kU3VwcG9ydC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9DaG9sbW9kU3VwcG9ydF9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTIAorICAke0VpZ2VuX0Nob2xtb2RTdXBwb3J0X1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL0Nob2xtb2RTdXBwb3J0IENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ2hvbG1vZFN1cHBvcnQvQ2hvbG1vZFN1cHBvcnQuaCBiL0VpZ2VuL3NyYy9DaG9sbW9kU3VwcG9ydC9DaG9sbW9kU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjE0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ2hvbG1vZFN1cHBvcnQvQ2hvbG1vZFN1cHBvcnQuaApAQCAtMCwwICsxLDU3OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ0hPTE1PRFNVUFBPUlRfSAorI2RlZmluZSBFSUdFTl9DSE9MTU9EU1VQUE9SVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIENob2xtb2RUeXBlPgordm9pZCBjaG9sbW9kX2NvbmZpZ3VyZV9tYXRyaXgoQ2hvbG1vZFR5cGUmIG1hdCkKK3sKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhcixmbG9hdD46OnZhbHVlKQorICB7CisgICAgbWF0Lnh0eXBlID0gQ0hPTE1PRF9SRUFMOworICAgIG1hdC5kdHlwZSA9IENIT0xNT0RfU0lOR0xFOworICB9CisgIGVsc2UgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhcixkb3VibGU+Ojp2YWx1ZSkKKyAgeworICAgIG1hdC54dHlwZSA9IENIT0xNT0RfUkVBTDsKKyAgICBtYXQuZHR5cGUgPSBDSE9MTU9EX0RPVUJMRTsKKyAgfQorICBlbHNlIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsc3RkOjpjb21wbGV4PGZsb2F0PiA+Ojp2YWx1ZSkKKyAgeworICAgIG1hdC54dHlwZSA9IENIT0xNT0RfQ09NUExFWDsKKyAgICBtYXQuZHR5cGUgPSBDSE9MTU9EX1NJTkdMRTsKKyAgfQorICBlbHNlIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsc3RkOjpjb21wbGV4PGRvdWJsZT4gPjo6dmFsdWUpCisgIHsKKyAgICBtYXQueHR5cGUgPSBDSE9MTU9EX0NPTVBMRVg7CisgICAgbWF0LmR0eXBlID0gQ0hPTE1PRF9ET1VCTEU7CisgIH0KKyAgZWxzZQorICB7CisgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJTY2FsYXIgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IENIT0xNT0QiKTsKKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogV3JhcHMgdGhlIEVpZ2VuIHNwYXJzZSBtYXRyaXggXGEgbWF0IGludG8gYSBDaG9sbW9kIHNwYXJzZSBtYXRyaXggb2JqZWN0LgorICAqIE5vdGUgdGhhdCB0aGUgZGF0YSBhcmUgc2hhcmVkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXg+CitjaG9sbW9kX3NwYXJzZSB2aWV3QXNDaG9sbW9kKFNwYXJzZU1hdHJpeDxfU2NhbGFyLF9PcHRpb25zLF9JbmRleD4mIG1hdCkKK3sKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfSW5kZXg+IE1hdHJpeFR5cGU7CisgIGNob2xtb2Rfc3BhcnNlIHJlczsKKyAgcmVzLm56bWF4ICAgPSBtYXQubm9uWmVyb3MoKTsKKyAgcmVzLm5yb3cgICAgPSBtYXQucm93cygpOzsKKyAgcmVzLm5jb2wgICAgPSBtYXQuY29scygpOworICByZXMucCAgICAgICA9IG1hdC5vdXRlckluZGV4UHRyKCk7CisgIHJlcy5pICAgICAgID0gbWF0LmlubmVySW5kZXhQdHIoKTsKKyAgcmVzLnggICAgICAgPSBtYXQudmFsdWVQdHIoKTsKKyAgcmVzLnNvcnRlZCAgPSAxOworICBpZihtYXQuaXNDb21wcmVzc2VkKCkpCisgIHsKKyAgICByZXMucGFja2VkICA9IDE7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVzLnBhY2tlZCAgPSAwOworICAgIHJlcy5ueiA9IG1hdC5pbm5lck5vblplcm9QdHIoKTsKKyAgfQorCisgIHJlcy5kdHlwZSAgID0gMDsKKyAgcmVzLnN0eXBlICAgPSAtMTsKKyAgCisgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxfSW5kZXgsaW50Pjo6dmFsdWUpCisgIHsKKyAgICByZXMuaXR5cGUgPSBDSE9MTU9EX0lOVDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgIkluZGV4IHR5cGUgZGlmZmVyZW50IHRoYW4gaW50IGlzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7CisgIH0KKworICAvLyBzZXR1cCByZXMueHR5cGUKKyAgaW50ZXJuYWw6OmNob2xtb2RfY29uZmlndXJlX21hdHJpeDxfU2NhbGFyPihyZXMpOworICAKKyAgcmVzLnN0eXBlID0gMDsKKyAgCisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4PgorY29uc3QgY2hvbG1vZF9zcGFyc2Ugdmlld0FzQ2hvbG1vZChjb25zdCBTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfSW5kZXg+JiBtYXQpCit7CisgIGNob2xtb2Rfc3BhcnNlIHJlcyA9IHZpZXdBc0Nob2xtb2QobWF0LmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqIFJldHVybnMgYSB2aWV3IG9mIHRoZSBFaWdlbiBzcGFyc2UgbWF0cml4IFxhIG1hdCBhcyBDaG9sbW9kIHNwYXJzZSBtYXRyaXguCisgICogVGhlIGRhdGEgYXJlIG5vdCBjb3BpZWQgYnV0IHNoYXJlZC4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4LCB1bnNpZ25lZCBpbnQgVXBMbz4KK2Nob2xtb2Rfc3BhcnNlIHZpZXdBc0Nob2xtb2QoY29uc3QgU3BhcnNlU2VsZkFkam9pbnRWaWV3PFNwYXJzZU1hdHJpeDxfU2NhbGFyLF9PcHRpb25zLF9JbmRleD4sIFVwTG8+JiBtYXQpCit7CisgIGNob2xtb2Rfc3BhcnNlIHJlcyA9IHZpZXdBc0Nob2xtb2QobWF0Lm1hdHJpeCgpLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKKyAgCisgIGlmKFVwTG89PVVwcGVyKSByZXMuc3R5cGUgPSAgMTsKKyAgaWYoVXBMbz09TG93ZXIpIHJlcy5zdHlwZSA9IC0xOworCisgIHJldHVybiByZXM7Cit9CisKKy8qKiBSZXR1cm5zIGEgdmlldyBvZiB0aGUgRWlnZW4gXGIgZGVuc2UgbWF0cml4IFxhIG1hdCBhcyBDaG9sbW9kIGRlbnNlIG1hdHJpeC4KKyAgKiBUaGUgZGF0YSBhcmUgbm90IGNvcGllZCBidXQgc2hhcmVkLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Nob2xtb2RfZGVuc2Ugdmlld0FzQ2hvbG1vZChNYXRyaXhCYXNlPERlcml2ZWQ+JiBtYXQpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkZsYWdzJlJvd01ham9yQml0KT09MCxUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9DT0xVTU5fTUFKT1JfTUFUUklDRVMpOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisKKyAgY2hvbG1vZF9kZW5zZSByZXM7CisgIHJlcy5ucm93ICAgPSBtYXQucm93cygpOworICByZXMubmNvbCAgID0gbWF0LmNvbHMoKTsKKyAgcmVzLm56bWF4ICA9IHJlcy5ucm93ICogcmVzLm5jb2w7CisgIHJlcy5kICAgICAgPSBEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPyBtYXQuZGVyaXZlZCgpLnNpemUoKSA6IG1hdC5kZXJpdmVkKCkub3V0ZXJTdHJpZGUoKTsKKyAgcmVzLnggICAgICA9IG1hdC5kZXJpdmVkKCkuZGF0YSgpOworICByZXMueiAgICAgID0gMDsKKworICBpbnRlcm5hbDo6Y2hvbG1vZF9jb25maWd1cmVfbWF0cml4PFNjYWxhcj4ocmVzKTsKKworICByZXR1cm4gcmVzOworfQorCisvKiogUmV0dXJucyBhIHZpZXcgb2YgdGhlIENob2xtb2Qgc3BhcnNlIG1hdHJpeCBcYSBjbSBhcyBhbiBFaWdlbiBzcGFyc2UgbWF0cml4LgorICAqIFRoZSBkYXRhIGFyZSBub3QgY29waWVkIGJ1dCBzaGFyZWQuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBGbGFncywgdHlwZW5hbWUgSW5kZXg+CitNYXBwZWRTcGFyc2VNYXRyaXg8U2NhbGFyLEZsYWdzLEluZGV4PiB2aWV3QXNFaWdlbihjaG9sbW9kX3NwYXJzZSYgY20pCit7CisgIHJldHVybiBNYXBwZWRTcGFyc2VNYXRyaXg8U2NhbGFyLEZsYWdzLEluZGV4PgorICAgICAgICAgKGNtLm5yb3csIGNtLm5jb2wsIHJlaW50ZXJwcmV0X2Nhc3Q8SW5kZXgqPihjbS5wKVtjbS5uY29sXSwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PEluZGV4Kj4oY20ucCksIHJlaW50ZXJwcmV0X2Nhc3Q8SW5kZXgqPihjbS5pKSxyZWludGVycHJldF9jYXN0PFNjYWxhcio+KGNtLngpICk7Cit9CisKK2VudW0gQ2hvbG1vZE1vZGUgeworICBDaG9sbW9kQXV0bywgQ2hvbG1vZFNpbXBsaWNpYWxMTHQsIENob2xtb2RTdXBlcm5vZGFsTEx0LCBDaG9sbW9kTERMdAorfTsKKworCisvKiogXGluZ3JvdXAgQ2hvbG1vZFN1cHBvcnRfTW9kdWxlCisgICogXGNsYXNzIENob2xtb2RCYXNlCisgICogXGJyaWVmIFRoZSBiYXNlIGNsYXNzIGZvciB0aGUgZGlyZWN0IENob2xlc2t5IGZhY3Rvcml6YXRpb24gb2YgQ2hvbG1vZAorICAqIFxzYSBjbGFzcyBDaG9sbW9kU3VwZXJub2RhbExMVCwgY2xhc3MgQ2hvbG1vZFNpbXBsaWNpYWxMRExULCBjbGFzcyBDaG9sbW9kU2ltcGxpY2lhbExMVAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbywgdHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIENob2xtb2RCYXNlIDogaW50ZXJuYWw6Om5vbmNvcHlhYmxlCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeFR5cGUgQ2hvbE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICBwdWJsaWM6CisKKyAgICBDaG9sbW9kQmFzZSgpCisgICAgICA6IG1fY2hvbG1vZEZhY3RvcigwKSwgbV9pbmZvKFN1Y2Nlc3MpLCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgY2hvbG1vZF9zdGFydCgmbV9jaG9sbW9kKTsKKyAgICB9CisKKyAgICBDaG9sbW9kQmFzZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICA6IG1fY2hvbG1vZEZhY3RvcigwKSwgbV9pbmZvKFN1Y2Nlc3MpLCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgY2hvbG1vZF9zdGFydCgmbV9jaG9sbW9kKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICB+Q2hvbG1vZEJhc2UoKQorICAgIHsKKyAgICAgIGlmKG1fY2hvbG1vZEZhY3RvcikKKyAgICAgICAgY2hvbG1vZF9mcmVlX2ZhY3RvcigmbV9jaG9sbW9kRmFjdG9yLCAmbV9jaG9sbW9kKTsKKyAgICAgIGNob2xtb2RfZmluaXNoKCZtX2Nob2xtb2QpOworICAgIH0KKyAgICAKKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY2hvbG1vZEZhY3Rvci0+bjsgfQorICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9jaG9sbW9kRmFjdG9yLT5uOyB9CisgICAgCisgICAgRGVyaXZlZCYgZGVyaXZlZCgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7IH0KKyAgICBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsgfQorICAgIAorICAgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHByZXZpb3VzIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNmdWwsCisgICAgICAqICAgICAgICAgIFxjIE51bWVyaWNhbElzc3VlIGlmIHRoZSBtYXRyaXguYXBwZWFycyB0byBiZSBuZWdhdGl2ZS4KKyAgICAgICovCisgICAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkRlY29tcG9zaXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1faW5mbzsKKyAgICB9CisKKyAgICAvKiogQ29tcHV0ZXMgdGhlIHNwYXJzZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeCAqLworICAgIERlcml2ZWQmIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIGFuYWx5emVQYXR0ZXJuKG1hdHJpeCk7CisgICAgICBmYWN0b3JpemUobWF0cml4KTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorICAgIAorICAgIC8qKiBccmV0dXJucyB0aGUgc29sdXRpb24geCBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbiBvZiBBLgorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxDaG9sbW9kQmFzZSwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMTFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KHJvd3MoKT09Yi5yb3dzKCkKKyAgICAgICAgICAgICAgICAmJiAiQ2hvbG1vZERlY29tcG9zaXRpb246OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8Q2hvbG1vZEJhc2UsIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKyAgICB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBzb2x1dGlvbiB4IG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6c3BhcnNlX3NvbHZlX3JldHZhbDxDaG9sbW9kQmFzZSwgUmhzPgorICAgIHNvbHZlKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMTFQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KHJvd3MoKT09Yi5yb3dzKCkKKyAgICAgICAgICAgICAgICAmJiAiQ2hvbG1vZERlY29tcG9zaXRpb246OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzcGFyc2Vfc29sdmVfcmV0dmFsPENob2xtb2RCYXNlLCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorICAgIAorICAgIC8qKiBQZXJmb3JtcyBhIHN5bWJvbGljIGRlY29tcG9zaXRpb24gb24gdGhlIHNwYXJjaXR5IG9mIFxhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gc29sdmluZyBmb3Igc2V2ZXJhbCBwcm9ibGVtcyBoYXZpbmcgdGhlIHNhbWUgc3RydWN0dXJlLgorICAgICAgKiAKKyAgICAgICogXHNhIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIGlmKG1fY2hvbG1vZEZhY3RvcikKKyAgICAgIHsKKyAgICAgICAgY2hvbG1vZF9mcmVlX2ZhY3RvcigmbV9jaG9sbW9kRmFjdG9yLCAmbV9jaG9sbW9kKTsKKyAgICAgICAgbV9jaG9sbW9kRmFjdG9yID0gMDsKKyAgICAgIH0KKyAgICAgIGNob2xtb2Rfc3BhcnNlIEEgPSB2aWV3QXNDaG9sbW9kKG1hdHJpeC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBMbz4oKSk7CisgICAgICBtX2Nob2xtb2RGYWN0b3IgPSBjaG9sbW9kX2FuYWx5emUoJkEsICZtX2Nob2xtb2QpOworICAgICAgCisgICAgICB0aGlzLT5tX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgdGhpcy0+bV9pbmZvID0gU3VjY2VzczsKKyAgICAgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgLyoqIFBlcmZvcm1zIGEgbnVtZXJpYyBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUaGUgZ2l2ZW4gbWF0cml4IG11c3QgaGFzIHRoZSBzYW1lIHNwYXJjaXR5IHRoYW4gdGhlIG1hdHJpeCBvbiB3aGljaCB0aGUgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICAgICAqCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpCisgICAgICAqLworICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIllvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOworICAgICAgY2hvbG1vZF9zcGFyc2UgQSA9IHZpZXdBc0Nob2xtb2QobWF0cml4LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcExvPigpKTsKKyAgICAgIGNob2xtb2RfZmFjdG9yaXplKCZBLCBtX2Nob2xtb2RGYWN0b3IsICZtX2Nob2xtb2QpOworICAgICAgCisgICAgICB0aGlzLT5tX2luZm8gPSBTdWNjZXNzOworICAgICAgbV9mYWN0b3JpemF0aW9uSXNPayA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBDaG9sbW9kJ3MgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgdG8gZ2V0IGEgZnVsbCBjb250cm9sIG92ZXIgdGhlIHBlcmZvcm1lZCBvcGVyYXRpb25zLgorICAgICAqICBTZWUgdGhlIENob2xtb2QgdXNlciBndWlkZSBmb3IgZGV0YWlscy4gKi8KKyAgICBjaG9sbW9kX2NvbW1vbiYgY2hvbG1vZCgpIHsgcmV0dXJuIG1fY2hvbG1vZDsgfQorICAgIAorICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgICAgdm9pZCBfc29sdmUoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZkZXN0KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgZGVjb21wb3NpdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc29sdmluZywgeW91IG11c3QgZmlyc3QgY2FsbCBlaXRoZXIgY29tcHV0ZSgpIG9yIHN5bWJvbGljKCkvbnVtZXJpYygpIik7CisgICAgICBjb25zdCBJbmRleCBzaXplID0gbV9jaG9sbW9kRmFjdG9yLT5uOworICAgICAgZWlnZW5fYXNzZXJ0KHNpemU9PWIucm93cygpKTsKKworICAgICAgLy8gbm90ZTogY2Qgc3RhbmRzIGZvciBDaG9sbW9kIERlbnNlCisgICAgICBjaG9sbW9kX2RlbnNlIGJfY2QgPSB2aWV3QXNDaG9sbW9kKGIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICAgICAgY2hvbG1vZF9kZW5zZSogeF9jZCA9IGNob2xtb2Rfc29sdmUoQ0hPTE1PRF9BLCBtX2Nob2xtb2RGYWN0b3IsICZiX2NkLCAmbV9jaG9sbW9kKTsKKyAgICAgIGlmKCF4X2NkKQorICAgICAgeworICAgICAgICB0aGlzLT5tX2luZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICAgIH0KKyAgICAgIC8vIFRPRE8gb3B0aW1pemUgdGhpcyBjb3B5IGJ5IHN3YXBwaW5nIHdoZW4gcG9zc2libGUgKGJlIGNhcnJlZnVsIHdpdGggYWxpZ25tZW50LCBldGMuKQorICAgICAgZGVzdCA9IE1hdHJpeDxTY2FsYXIsRGVzdDo6Um93c0F0Q29tcGlsZVRpbWUsRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWU+OjpNYXAocmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPih4X2NkLT54KSxiLnJvd3MoKSxiLmNvbHMoKSk7CisgICAgICBjaG9sbW9kX2ZyZWVfZGVuc2UoJnhfY2QsICZtX2Nob2xtb2QpOworICAgIH0KKyAgICAKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzU2NhbGFyLCBpbnQgUmhzT3B0aW9ucywgdHlwZW5hbWUgUmhzSW5kZXgsIHR5cGVuYW1lIERlc3RTY2FsYXIsIGludCBEZXN0T3B0aW9ucywgdHlwZW5hbWUgRGVzdEluZGV4PgorICAgIHZvaWQgX3NvbHZlKGNvbnN0IFNwYXJzZU1hdHJpeDxSaHNTY2FsYXIsUmhzT3B0aW9ucyxSaHNJbmRleD4gJmIsIFNwYXJzZU1hdHJpeDxEZXN0U2NhbGFyLERlc3RPcHRpb25zLERlc3RJbmRleD4gJmRlc3QpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlRoZSBkZWNvbXBvc2l0aW9uIGlzIG5vdCBpbiBhIHZhbGlkIHN0YXRlIGZvciBzb2x2aW5nLCB5b3UgbXVzdCBmaXJzdCBjYWxsIGVpdGhlciBjb21wdXRlKCkgb3Igc3ltYm9saWMoKS9udW1lcmljKCkiKTsKKyAgICAgIGNvbnN0IEluZGV4IHNpemUgPSBtX2Nob2xtb2RGYWN0b3ItPm47CisgICAgICBlaWdlbl9hc3NlcnQoc2l6ZT09Yi5yb3dzKCkpOworCisgICAgICAvLyBub3RlOiBjcyBzdGFuZHMgZm9yIENob2xtb2QgU3BhcnNlCisgICAgICBjaG9sbW9kX3NwYXJzZSBiX2NzID0gdmlld0FzQ2hvbG1vZChiKTsKKyAgICAgIGNob2xtb2Rfc3BhcnNlKiB4X2NzID0gY2hvbG1vZF9zcHNvbHZlKENIT0xNT0RfQSwgbV9jaG9sbW9kRmFjdG9yLCAmYl9jcywgJm1fY2hvbG1vZCk7CisgICAgICBpZigheF9jcykKKyAgICAgIHsKKyAgICAgICAgdGhpcy0+bV9pbmZvID0gTnVtZXJpY2FsSXNzdWU7CisgICAgICB9CisgICAgICAvLyBUT0RPIG9wdGltaXplIHRoaXMgY29weSBieSBzd2FwcGluZyB3aGVuIHBvc3NpYmxlIChiZSBjYXJyZWZ1bCB3aXRoIGFsaWdubWVudCwgZXRjLikKKyAgICAgIGRlc3QgPSB2aWV3QXNFaWdlbjxEZXN0U2NhbGFyLERlc3RPcHRpb25zLERlc3RJbmRleD4oKnhfY3MpOworICAgICAgY2hvbG1vZF9mcmVlX3NwYXJzZSgmeF9jcywgJm1fY2hvbG1vZCk7CisgICAgfQorICAgICNlbmRpZiAvLyBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmVhbT4KKyAgICB2b2lkIGR1bXBNZW1vcnkoU3RyZWFtJiBzKQorICAgIHt9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICBtdXRhYmxlIGNob2xtb2RfY29tbW9uIG1fY2hvbG1vZDsKKyAgICBjaG9sbW9kX2ZhY3RvciogbV9jaG9sbW9kRmFjdG9yOworICAgIG11dGFibGUgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKKyAgICBpbnQgbV9mYWN0b3JpemF0aW9uSXNPazsKKyAgICBpbnQgbV9hbmFseXNpc0lzT2s7Cit9OworCisvKiogXGluZ3JvdXAgQ2hvbG1vZFN1cHBvcnRfTW9kdWxlCisgICogXGNsYXNzIENob2xtb2RTaW1wbGljaWFsTExUCisgICogXGJyaWVmIEEgc2ltcGxpY2lhbCBkaXJlY3QgQ2hvbGVza3kgKExMVCkgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIENob2xtb2QKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgc2ltcGxpY2lhbCBMTF5UIENob2xlc2t5IGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgQ2hvbG1vZCBsaWJyYXJ5LgorICAqIFRoaXMgc2ltcGxpY2lhbCB2YXJpYW50IGlzIGVxdWl2YWxlbnQgdG8gRWlnZW4ncyBidWlsdC1pbiBTaW1wbGljaWFsTExUIGNsYXNzLiBUaGVmb3JlLCBpdCBoYXMgbGl0dGxlIHByYWN0aWNhbCBpbnRlcmVzdC4KKyAgKiBUaGUgc3BhcnNlIG1hdHJpeCBBIG11c3QgYmUgc2VsZmFqb2ludCBhbmQgcG9zaXRpdmUgZGVmaW5pdGUuIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzCisgICogWCBhbmQgQiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBfVXBMbyB0aGUgdHJpYW5ndWxhciBwYXJ0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY29tcHV0YXRpb25zLiBJdCBjYW4gYmUgTG93ZXIKKyAgKiAgICAgICAgICAgICAgIG9yIFVwcGVyLiBEZWZhdWx0IGlzIExvd2VyLgorICAqCisgICogVGhpcyBjbGFzcyBzdXBwb3J0cyBhbGwga2luZCBvZiBTcGFyc2VNYXRyaXg8Pjogcm93IG9yIGNvbHVtbiBtYWpvcjsgdXBwZXIsIGxvd2VyLCBvciBib3RoOyBjb21wcmVzc2VkIG9yIG5vbiBjb21wcmVzc2VkLgorICAqCisgICogXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VEaXJlY3RTb2x2ZXJzLCBjbGFzcyBDaG9sbW9kU3VwZXJub2RhbExMVCwgY2xhc3MgU2ltcGxpY2lhbExMVAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbyA9IExvd2VyPgorY2xhc3MgQ2hvbG1vZFNpbXBsaWNpYWxMTFQgOiBwdWJsaWMgQ2hvbG1vZEJhc2U8X01hdHJpeFR5cGUsIF9VcExvLCBDaG9sbW9kU2ltcGxpY2lhbExMVDxfTWF0cml4VHlwZSwgX1VwTG8+ID4KK3sKKyAgICB0eXBlZGVmIENob2xtb2RCYXNlPF9NYXRyaXhUeXBlLCBfVXBMbywgQ2hvbG1vZFNpbXBsaWNpYWxMTFQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6bV9jaG9sbW9kOworICAgIAorICBwdWJsaWM6CisgICAgCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIAorICAgIENob2xtb2RTaW1wbGljaWFsTExUKCkgOiBCYXNlKCkgeyBpbml0KCk7IH0KKworICAgIENob2xtb2RTaW1wbGljaWFsTExUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkgOiBCYXNlKCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorCisgICAgfkNob2xtb2RTaW1wbGljaWFsTExUKCkge30KKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9jaG9sbW9kLmZpbmFsX2FzaXMgPSAwOworICAgICAgbV9jaG9sbW9kLnN1cGVybm9kYWwgPSBDSE9MTU9EX1NJTVBMSUNJQUw7CisgICAgICBtX2Nob2xtb2QuZmluYWxfbGwgPSAxOworICAgIH0KK307CisKKworLyoqIFxpbmdyb3VwIENob2xtb2RTdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBDaG9sbW9kU2ltcGxpY2lhbExETFQKKyAgKiBcYnJpZWYgQSBzaW1wbGljaWFsIGRpcmVjdCBDaG9sZXNreSAoTERMVCkgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIENob2xtb2QKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgc2ltcGxpY2lhbCBMRExeVCBDaG9sZXNreSBmYWN0b3JpemF0aW9uCisgICogdXNpbmcgdGhlIENob2xtb2QgbGlicmFyeS4KKyAgKiBUaGlzIHNpbXBsaWNpYWwgdmFyaWFudCBpcyBlcXVpdmFsZW50IHRvIEVpZ2VuJ3MgYnVpbHQtaW4gU2ltcGxpY2lhbExETFQgY2xhc3MuIFRoZWZvcmUsIGl0IGhhcyBsaXR0bGUgcHJhY3RpY2FsIGludGVyZXN0LgorICAqIFRoZSBzcGFyc2UgbWF0cml4IEEgbXVzdCBiZSBzZWxmYWpvaW50IGFuZCBwb3NpdGl2ZSBkZWZpbml0ZS4gVGhlIHZlY3RvcnMgb3IgbWF0cmljZXMKKyAgKiBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKiBcdHBhcmFtIF9VcExvIHRoZSB0cmlhbmd1bGFyIHBhcnQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBjb21wdXRhdGlvbnMuIEl0IGNhbiBiZSBMb3dlcgorICAqICAgICAgICAgICAgICAgb3IgVXBwZXIuIERlZmF1bHQgaXMgTG93ZXIuCisgICoKKyAgKiBUaGlzIGNsYXNzIHN1cHBvcnRzIGFsbCBraW5kIG9mIFNwYXJzZU1hdHJpeDw+OiByb3cgb3IgY29sdW1uIG1ham9yOyB1cHBlciwgbG93ZXIsIG9yIGJvdGg7IGNvbXByZXNzZWQgb3Igbm9uIGNvbXByZXNzZWQuCisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZURpcmVjdFNvbHZlcnMsIGNsYXNzIENob2xtb2RTdXBlcm5vZGFsTExULCBjbGFzcyBTaW1wbGljaWFsTERMVAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbyA9IExvd2VyPgorY2xhc3MgQ2hvbG1vZFNpbXBsaWNpYWxMRExUIDogcHVibGljIENob2xtb2RCYXNlPF9NYXRyaXhUeXBlLCBfVXBMbywgQ2hvbG1vZFNpbXBsaWNpYWxMRExUPF9NYXRyaXhUeXBlLCBfVXBMbz4gPgoreworICAgIHR5cGVkZWYgQ2hvbG1vZEJhc2U8X01hdHJpeFR5cGUsIF9VcExvLCBDaG9sbW9kU2ltcGxpY2lhbExETFQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6bV9jaG9sbW9kOworICAgIAorICBwdWJsaWM6CisgICAgCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIAorICAgIENob2xtb2RTaW1wbGljaWFsTERMVCgpIDogQmFzZSgpIHsgaW5pdCgpOyB9CisKKyAgICBDaG9sbW9kU2ltcGxpY2lhbExETFQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KSA6IEJhc2UoKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICB+Q2hvbG1vZFNpbXBsaWNpYWxMRExUKCkge30KKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9jaG9sbW9kLmZpbmFsX2FzaXMgPSAxOworICAgICAgbV9jaG9sbW9kLnN1cGVybm9kYWwgPSBDSE9MTU9EX1NJTVBMSUNJQUw7CisgICAgfQorfTsKKworLyoqIFxpbmdyb3VwIENob2xtb2RTdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBDaG9sbW9kU3VwZXJub2RhbExMVAorICAqIFxicmllZiBBIHN1cGVybm9kYWwgQ2hvbGVza3kgKExMVCkgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIENob2xtb2QKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgc3VwZXJub2RhbCBMTF5UIENob2xlc2t5IGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgQ2hvbG1vZCBsaWJyYXJ5LgorICAqIFRoaXMgc3VwZXJub2RhbCB2YXJpYW50IHBlcmZvcm1zIGJlc3Qgb24gZGVuc2UgZW5vdWdoIHByb2JsZW1zLCBlLmcuLCAzRCBGRU0sIG9yIHZlcnkgaGlnaCBvcmRlciAyRCBGRU0uCisgICogVGhlIHNwYXJzZSBtYXRyaXggQSBtdXN0IGJlIHNlbGZham9pbnQgYW5kIHBvc2l0aXZlIGRlZmluaXRlLiBUaGUgdmVjdG9ycyBvciBtYXRyaWNlcworICAqIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIGl0IG11c3QgYmUgYSBTcGFyc2VNYXRyaXg8PgorICAqIFx0cGFyYW0gX1VwTG8gdGhlIHRyaWFuZ3VsYXIgcGFydCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGNvbXB1dGF0aW9ucy4gSXQgY2FuIGJlIExvd2VyCisgICogICAgICAgICAgICAgICBvciBVcHBlci4gRGVmYXVsdCBpcyBMb3dlci4KKyAgKgorICAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgYWxsIGtpbmQgb2YgU3BhcnNlTWF0cml4PD46IHJvdyBvciBjb2x1bW4gbWFqb3I7IHVwcGVyLCBsb3dlciwgb3IgYm90aDsgY29tcHJlc3NlZCBvciBub24gY29tcHJlc3NlZC4KKyAgKgorICAqIFxzYSBccmVmIFR1dG9yaWFsU3BhcnNlRGlyZWN0U29sdmVycworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbyA9IExvd2VyPgorY2xhc3MgQ2hvbG1vZFN1cGVybm9kYWxMTFQgOiBwdWJsaWMgQ2hvbG1vZEJhc2U8X01hdHJpeFR5cGUsIF9VcExvLCBDaG9sbW9kU3VwZXJub2RhbExMVDxfTWF0cml4VHlwZSwgX1VwTG8+ID4KK3sKKyAgICB0eXBlZGVmIENob2xtb2RCYXNlPF9NYXRyaXhUeXBlLCBfVXBMbywgQ2hvbG1vZFN1cGVybm9kYWxMTFQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6bV9jaG9sbW9kOworICAgIAorICBwdWJsaWM6CisgICAgCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIAorICAgIENob2xtb2RTdXBlcm5vZGFsTExUKCkgOiBCYXNlKCkgeyBpbml0KCk7IH0KKworICAgIENob2xtb2RTdXBlcm5vZGFsTExUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkgOiBCYXNlKCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorCisgICAgfkNob2xtb2RTdXBlcm5vZGFsTExUKCkge30KKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9jaG9sbW9kLmZpbmFsX2FzaXMgPSAxOworICAgICAgbV9jaG9sbW9kLnN1cGVybm9kYWwgPSBDSE9MTU9EX1NVUEVSTk9EQUw7CisgICAgfQorfTsKKworLyoqIFxpbmdyb3VwIENob2xtb2RTdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBDaG9sbW9kRGVjb21wb3NpdGlvbgorICAqIFxicmllZiBBIGdlbmVyYWwgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIENob2xtb2QKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgTExeVCBvciBMRExeVCBDaG9sZXNreSBmYWN0b3JpemF0aW9uCisgICogdXNpbmcgdGhlIENob2xtb2QgbGlicmFyeS4gVGhlIHNwYXJzZSBtYXRyaXggQSBtdXN0IGJlIHNlbGZham9pbnQgYW5kIHBvc2l0aXZlIGRlZmluaXRlLiBUaGUgdmVjdG9ycyBvciBtYXRyaWNlcworICAqIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgcGVybWl0cyB0byBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgQ2hvbGVza3kgbWV0aG9kIGF0IHJ1bnRpbWUuCisgICogT24gdGhlIG90aGVyIGhhbmQsIGl0IGRvZXMgbm90IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSByZXN1bHQgb2YgdGhlIGZhY3Rvcml6YXRpb24uCisgICogVGhlIGRlZmF1bHQgaXMgdG8gbGV0IENob2xtb2QgYXV0b21hdGljYWxseSBjaG9vc2UgYmV0d2VlbiBhIHNpbXBsaWNpYWwgYW5kIHN1cGVybm9kYWwgZmFjdG9yaXphdGlvbi4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICogXHRwYXJhbSBfVXBMbyB0aGUgdHJpYW5ndWxhciBwYXJ0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY29tcHV0YXRpb25zLiBJdCBjYW4gYmUgTG93ZXIKKyAgKiAgICAgICAgICAgICAgIG9yIFVwcGVyLiBEZWZhdWx0IGlzIExvd2VyLgorICAqCisgICogVGhpcyBjbGFzcyBzdXBwb3J0cyBhbGwga2luZCBvZiBTcGFyc2VNYXRyaXg8Pjogcm93IG9yIGNvbHVtbiBtYWpvcjsgdXBwZXIsIGxvd2VyLCBvciBib3RoOyBjb21wcmVzc2VkIG9yIG5vbiBjb21wcmVzc2VkLgorICAqCisgICogXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VEaXJlY3RTb2x2ZXJzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvID0gTG93ZXI+CitjbGFzcyBDaG9sbW9kRGVjb21wb3NpdGlvbiA6IHB1YmxpYyBDaG9sbW9kQmFzZTxfTWF0cml4VHlwZSwgX1VwTG8sIENob2xtb2REZWNvbXBvc2l0aW9uPF9NYXRyaXhUeXBlLCBfVXBMbz4gPgoreworICAgIHR5cGVkZWYgQ2hvbG1vZEJhc2U8X01hdHJpeFR5cGUsIF9VcExvLCBDaG9sbW9kRGVjb21wb3NpdGlvbj4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjptX2Nob2xtb2Q7CisgICAgCisgIHB1YmxpYzoKKyAgICAKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgCisgICAgQ2hvbG1vZERlY29tcG9zaXRpb24oKSA6IEJhc2UoKSB7IGluaXQoKTsgfQorCisgICAgQ2hvbG1vZERlY29tcG9zaXRpb24oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KSA6IEJhc2UoKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICB+Q2hvbG1vZERlY29tcG9zaXRpb24oKSB7fQorICAgIAorICAgIHZvaWQgc2V0TW9kZShDaG9sbW9kTW9kZSBtb2RlKQorICAgIHsKKyAgICAgIHN3aXRjaChtb2RlKQorICAgICAgeworICAgICAgICBjYXNlIENob2xtb2RBdXRvOgorICAgICAgICAgIG1fY2hvbG1vZC5maW5hbF9hc2lzID0gMTsKKyAgICAgICAgICBtX2Nob2xtb2Quc3VwZXJub2RhbCA9IENIT0xNT0RfQVVUTzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDaG9sbW9kU2ltcGxpY2lhbExMdDoKKyAgICAgICAgICBtX2Nob2xtb2QuZmluYWxfYXNpcyA9IDA7CisgICAgICAgICAgbV9jaG9sbW9kLnN1cGVybm9kYWwgPSBDSE9MTU9EX1NJTVBMSUNJQUw7CisgICAgICAgICAgbV9jaG9sbW9kLmZpbmFsX2xsID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDaG9sbW9kU3VwZXJub2RhbExMdDoKKyAgICAgICAgICBtX2Nob2xtb2QuZmluYWxfYXNpcyA9IDE7CisgICAgICAgICAgbV9jaG9sbW9kLnN1cGVybm9kYWwgPSBDSE9MTU9EX1NVUEVSTk9EQUw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2hvbG1vZExETHQ6CisgICAgICAgICAgbV9jaG9sbW9kLmZpbmFsX2FzaXMgPSAxOworICAgICAgICAgIG1fY2hvbG1vZC5zdXBlcm5vZGFsID0gQ0hPTE1PRF9TSU1QTElDSUFMOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9jaG9sbW9kLmZpbmFsX2FzaXMgPSAxOworICAgICAgbV9jaG9sbW9kLnN1cGVybm9kYWwgPSBDSE9MTU9EX0FVVE87CisgICAgfQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvLCB0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3Qgc29sdmVfcmV0dmFsPENob2xtb2RCYXNlPF9NYXRyaXhUeXBlLF9VcExvLERlcml2ZWQ+LCBSaHM+CisgIDogc29sdmVfcmV0dmFsX2Jhc2U8Q2hvbG1vZEJhc2U8X01hdHJpeFR5cGUsX1VwTG8sRGVyaXZlZD4sIFJocz4KK3sKKyAgdHlwZWRlZiBDaG9sbW9kQmFzZTxfTWF0cml4VHlwZSxfVXBMbyxEZXJpdmVkPiBEZWM7CisgIEVJR0VOX01BS0VfU09MVkVfSEVMUEVSUyhEZWMsUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGRlYygpLl9zb2x2ZShyaHMoKSxkc3QpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvLCB0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3JldHZhbDxDaG9sbW9kQmFzZTxfTWF0cml4VHlwZSxfVXBMbyxEZXJpdmVkPiwgUmhzPgorICA6IHNwYXJzZV9zb2x2ZV9yZXR2YWxfYmFzZTxDaG9sbW9kQmFzZTxfTWF0cml4VHlwZSxfVXBMbyxEZXJpdmVkPiwgUmhzPgoreworICB0eXBlZGVmIENob2xtb2RCYXNlPF9NYXRyaXhUeXBlLF9VcExvLERlcml2ZWQ+IERlYzsKKyAgRUlHRU5fTUFLRV9TUEFSU0VfU09MVkVfSEVMUEVSUyhEZWMsUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGRlYygpLl9zb2x2ZShyaHMoKSxkc3QpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DSE9MTU9EU1VQUE9SVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9BcnJheS5oIGIvRWlnZW4vc3JjL0NvcmUvQXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWEzODk5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQXJyYXkuaApAQCAtMCwwICsxLDMwOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FSUkFZX0gKKyNkZWZpbmUgRUlHRU5fQVJSQVlfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIEFycmF5IAorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgR2VuZXJhbC1wdXJwb3NlIGFycmF5cyB3aXRoIGVhc3kgQVBJIGZvciBjb2VmZmljaWVudC13aXNlIG9wZXJhdGlvbnMKKyAgKgorICAqIFRoZSAlQXJyYXkgY2xhc3MgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBNYXRyaXggY2xhc3MuIEl0IHByb3ZpZGVzCisgICogZ2VuZXJhbC1wdXJwb3NlIG9uZS0gYW5kIHR3by1kaW1lbnNpb25hbCBhcnJheXMuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCisgICogJUFycmF5IGFuZCB0aGUgJU1hdHJpeCBjbGFzcyBpcyBwcmltYXJpbHkgaW4gdGhlIEFQSTogdGhlIEFQSSBmb3IgdGhlCisgICogJUFycmF5IGNsYXNzIHByb3ZpZGVzIGVhc3kgYWNjZXNzIHRvIGNvZWZmaWNpZW50LXdpc2Ugb3BlcmF0aW9ucywgd2hpbGUgdGhlCisgICogQVBJIGZvciB0aGUgJU1hdHJpeCBjbGFzcyBwcm92aWRlcyBlYXN5IGFjY2VzcyB0byBsaW5lYXItYWxnZWJyYQorICAqIG9wZXJhdGlvbnMuCisgICoKKyAgKiBUaGlzIGNsYXNzIGNhbiBiZSBleHRlbmRlZCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBwbHVnaW4gbWVjaGFuaXNtIGRlc2NyaWJlZCBvbiB0aGUgcGFnZQorICAqIFxyZWYgVG9waWNDdXN0b21pemluZ0VpZ2VuIGJ5IGRlZmluaW5nIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxjIEVJR0VOX0FSUkFZX1BMVUdJTi4KKyAgKgorICAqIFxzYSBccmVmIFR1dG9yaWFsQXJyYXlDbGFzcywgXHJlZiBUb3BpY0NsYXNzSGllcmFyY2h5CisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucywgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+CitzdHJ1Y3QgdHJhaXRzPEFycmF5PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4gPiA6IHRyYWl0czxNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiA+Cit7CisgIHR5cGVkZWYgQXJyYXlYcHIgWHByS2luZDsKKyAgdHlwZWRlZiBBcnJheUJhc2U8QXJyYXk8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiA+IFhwckJhc2U7Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9PcHRpb25zLCBpbnQgX01heFJvd3MsIGludCBfTWF4Q29scz4KK2NsYXNzIEFycmF5CisgIDogcHVibGljIFBsYWluT2JqZWN0QmFzZTxBcnJheTxfU2NhbGFyLCBfUm93cywgX0NvbHMsIF9PcHRpb25zLCBfTWF4Um93cywgX01heENvbHM+ID4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBQbGFpbk9iamVjdEJhc2U8QXJyYXk+IEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShBcnJheSkKKworICAgIGVudW0geyBPcHRpb25zID0gX09wdGlvbnMgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworCisgIHByb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkLCBib29sIElzVmVjdG9yPgorICAgIGZyaWVuZCBzdHJ1Y3QgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9yZXNpemVfbGlrZV9pbXBsOworCisgICAgdXNpbmcgQmFzZTo6bV9zdG9yYWdlOworCisgIHB1YmxpYzoKKworICAgIHVzaW5nIEJhc2U6OmJhc2U7CisgICAgdXNpbmcgQmFzZTo6Y29lZmY7CisgICAgdXNpbmcgQmFzZTo6Y29lZmZSZWY7CisKKyAgICAvKioKKyAgICAgICogVGhlIHVzYWdlIG9mCisgICAgICAqICAgdXNpbmcgQmFzZTo6b3BlcmF0b3I9OworICAgICAgKiBmYWlscyBvbiBNU1ZDLiBTaW5jZSB0aGUgY29kZSBiZWxvdyBpcyB3b3JraW5nIHdpdGggR0NDIGFuZCBNU1ZDLCB3ZSBza2lwcGVkCisgICAgICAqIHRoZSB1c2FnZSBvZiAndXNpbmcnLiBUaGlzIHNob3VsZCBiZSBkb25lIG9ubHkgZm9yIG9wZXJhdG9yPS4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQXJyYXkmIG9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCisgICAgeworICAgICAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPShvdGhlcik7CisgICAgfQorCisgICAgLyoqIENvcGllcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gXGEgb3RoZXIgaW50byBcYyAqdGhpcyB3aXRoIGF1dG9tYXRpYyByZXNpemluZy4KKyAgICAgICoKKyAgICAgICogKnRoaXMgbWlnaHQgYmUgcmVzaXplZCB0byBtYXRjaCB0aGUgZGltZW5zaW9ucyBvZiBcYSBvdGhlci4gSWYgKnRoaXMgd2FzIGEgbnVsbCBtYXRyaXggKG5vdCBhbHJlYWR5IGluaXRpYWxpemVkKSwKKyAgICAgICogaXQgd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgICAgICoKKyAgICAgICogTm90ZSB0aGF0IGNvcHlpbmcgYSByb3ctdmVjdG9yIGludG8gYSB2ZWN0b3IgKGFuZCBjb252ZXJzZWx5KSBpcyBhbGxvd2VkLgorICAgICAgKiBUaGUgcmVzaXppbmcsIGlmIGFueSwgaXMgdGhlbiBkb25lIGluIHRoZSBhcHByb3ByaWF0ZSB3YXkgc28gdGhhdCByb3ctdmVjdG9ycworICAgICAgKiByZW1haW4gcm93LXZlY3RvcnMgYW5kIHZlY3RvcnMgcmVtYWluIHZlY3RvcnMuCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5JiBvcGVyYXRvcj0oY29uc3QgQXJyYXlCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjpfc2V0KG90aGVyKTsKKyAgICB9CisKKyAgICAvKiogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICogcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5JiBvcGVyYXRvcj0oY29uc3QgQXJyYXkmIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjpfc2V0KG90aGVyKTsKKyAgICB9CisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogRm9yIGZpeGVkLXNpemUgbWF0cmljZXMsIGRvZXMgbm90aGluZy4KKyAgICAgICoKKyAgICAgICogRm9yIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcywgY3JlYXRlcyBhbiBlbXB0eSBtYXRyaXggb2Ygc2l6ZSAwLiBEb2VzIG5vdCBhbGxvY2F0ZSBhbnkgYXJyYXkuIFN1Y2ggYSBtYXRyaXgKKyAgICAgICogaXMgY2FsbGVkIGEgbnVsbCBtYXRyaXguIFRoaXMgY29uc3RydWN0b3IgaXMgdGhlIHVuaXF1ZSB3YXkgdG8gY3JlYXRlIG51bGwgbWF0cmljZXM6IHJlc2l6aW5nCisgICAgICAqIGEgbWF0cml4IHRvIDAgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgICoKKyAgICAgICogXHNhIHJlc2l6ZShJbmRleCxJbmRleCkKKyAgICAgICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCBBcnJheSgpIDogQmFzZSgpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgRUlHRU5fSU5JVElBTElaRV9CWV9aRVJPX0lGX1RIQVRfT1BUSU9OX0lTX0VOQUJMRUQKKyAgICB9CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvLyBGSVhNRSBpcyBpdCBzdGlsbCBuZWVkZWQgPz8KKyAgICAvKiogXGludGVybmFsICovCisgICAgQXJyYXkoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgIDogQmFzZShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KCkpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgRUlHRU5fSU5JVElBTElaRV9CWV9aRVJPX0lGX1RIQVRfT1BUSU9OX0lTX0VOQUJMRUQKKyAgICB9CisjZW5kaWYKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgdmVjdG9yIG9yIHJvdy12ZWN0b3Igd2l0aCBnaXZlbiBkaW1lbnNpb24uIFxvbmx5X2Zvcl92ZWN0b3JzCisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZnVsIGZvciBkeW5hbWljLXNpemUgdmVjdG9ycy4gRm9yIGZpeGVkLXNpemUgdmVjdG9ycywKKyAgICAgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgdGhlIGRpbWVuc2lvbiBoZXJlLCBzbyBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIHVzZSB0aGUgZGVmYXVsdAorICAgICAgKiBjb25zdHJ1Y3RvciBNYXRyaXgoKSBpbnN0ZWFkLgorICAgICAgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IEFycmF5KEluZGV4IGRpbSkKKyAgICAgIDogQmFzZShkaW0sIFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyAxIDogZGltLCBDb2xzQXRDb21waWxlVGltZSA9PSAxID8gMSA6IGRpbSkKKyAgICB7CisgICAgICBCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKEFycmF5KQorICAgICAgZWlnZW5fYXNzZXJ0KGRpbSA+PSAwKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljIHx8IFNpemVBdENvbXBpbGVUaW1lID09IGRpbSk7CisgICAgICBFSUdFTl9JTklUSUFMSVpFX0JZX1pFUk9fSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBBcnJheShjb25zdCBUMCYgeCwgY29uc3QgVDEmIHkpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgdGhpcy0+dGVtcGxhdGUgX2luaXQyPFQwLFQxPih4LCB5KTsKKyAgICB9CisgICAgI2Vsc2UKKyAgICAvKiogY29uc3RydWN0cyBhbiB1bmluaXRpYWxpemVkIG1hdHJpeCB3aXRoIFxhIHJvd3Mgcm93cyBhbmQgXGEgY29scyBjb2x1bW5zLgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZHluYW1pYy1zaXplIG1hdHJpY2VzLiBGb3IgZml4ZWQtc2l6ZSBtYXRyaWNlcywKKyAgICAgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgdGhlc2UgcGFyYW1ldGVycywgc28gb25lIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICogTWF0cml4KCkgaW5zdGVhZC4gKi8KKyAgICBBcnJheShJbmRleCByb3dzLCBJbmRleCBjb2xzKTsKKyAgICAvKiogY29uc3RydWN0cyBhbiBpbml0aWFsaXplZCAyRCB2ZWN0b3Igd2l0aCBnaXZlbiBjb2VmZmljaWVudHMgKi8KKyAgICBBcnJheShjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSk7CisgICAgI2VuZGlmCisKKyAgICAvKiogY29uc3RydWN0cyBhbiBpbml0aWFsaXplZCAzRCB2ZWN0b3Igd2l0aCBnaXZlbiBjb2VmZmljaWVudHMgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBTY2FsYXImIHopCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShBcnJheSwgMykKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMF0gPSB4OworICAgICAgbV9zdG9yYWdlLmRhdGEoKVsxXSA9IHk7CisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzJdID0gejsKKyAgICB9CisgICAgLyoqIGNvbnN0cnVjdHMgYW4gaW5pdGlhbGl6ZWQgNEQgdmVjdG9yIHdpdGggZ2l2ZW4gY29lZmZpY2llbnRzICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBBcnJheShjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgU2NhbGFyJiB6LCBjb25zdCBTY2FsYXImIHcpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShBcnJheSwgNCkKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMF0gPSB4OworICAgICAgbV9zdG9yYWdlLmRhdGEoKVsxXSA9IHk7CisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzJdID0gejsKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbM10gPSB3OworICAgIH0KKworICAgIGV4cGxpY2l0IEFycmF5KGNvbnN0IFNjYWxhciAqZGF0YSk7CisKKyAgICAvKiogQ29uc3RydWN0b3IgY29weWluZyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gXGEgb3RoZXIgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBBcnJheShjb25zdCBBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICAgICAgICAgOiBCYXNlKG90aGVyLnJvd3MoKSAqIG90aGVyLmNvbHMoKSwgb3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgQmFzZTo6X3NldF9ub2FsaWFzKG90aGVyKTsKKyAgICB9CisgICAgLyoqIENvcHkgY29uc3RydWN0b3IgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5KGNvbnN0IEFycmF5JiBvdGhlcikKKyAgICAgICAgICAgIDogQmFzZShvdGhlci5yb3dzKCkgKiBvdGhlci5jb2xzKCksIG90aGVyLnJvd3MoKSwgb3RoZXIuY29scygpKQorICAgIHsKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEJhc2U6Ol9zZXRfbm9hbGlhcyhvdGhlcik7CisgICAgfQorICAgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggaW4tcGxhY2UgZXZhbHVhdGlvbiAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5KGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgQmFzZTo6cmVzaXplKG90aGVyLnJvd3MoKSwgb3RoZXIuY29scygpKTsKKyAgICAgIG90aGVyLmV2YWxUbygqdGhpcyk7CisgICAgfQorCisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mKSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEFycmF5KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKKyAgICAgIDogQmFzZShvdGhlci5kZXJpdmVkKCkucm93cygpICogb3RoZXIuZGVyaXZlZCgpLmNvbHMoKSwgb3RoZXIuZGVyaXZlZCgpLnJvd3MoKSwgb3RoZXIuZGVyaXZlZCgpLmNvbHMoKSkKKyAgICB7CisgICAgICBCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgICBCYXNlOjpyZXNpemUob3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpOworICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICB9CisKKyAgICAvKiogT3ZlcnJpZGUgTWF0cml4QmFzZTo6c3dhcCgpIHNpbmNlIGZvciBkeW5hbWljLXNpemVkIG1hdHJpY2VzIG9mIHNhbWUgdHlwZSBpdCBpcyBlbm91Z2ggdG8gc3dhcCB0aGUKKyAgICAgICogZGF0YSBwb2ludGVycy4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIHZvaWQgc3dhcChBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiBjb25zdCAmIG90aGVyKQorICAgIHsgdGhpcy0+X3N3YXAob3RoZXIuZGVyaXZlZCgpKTsgfQorCisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gMTsgfQorICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmlubmVyU2l6ZSgpOyB9CisKKyAgICAjaWZkZWYgRUlHRU5fQVJSQVlfUExVR0lOCisgICAgI2luY2x1ZGUgRUlHRU5fQVJSQVlfUExVR0lOCisgICAgI2VuZGlmCisKKyAgcHJpdmF0ZToKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgYm9vbCBTd2FwUG9pbnRlcnM+CisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6bWF0cml4X3N3YXBfaW1wbDsKK307CisKKy8qKiBcZGVmZ3JvdXAgYXJyYXl0eXBlZGVmcyBHbG9iYWwgYXJyYXkgdHlwZWRlZnMKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogRWlnZW4gZGVmaW5lcyBzZXZlcmFsIHR5cGVkZWYgc2hvcnRjdXRzIGZvciBtb3N0IGNvbW1vbiAxRCBhbmQgMkQgYXJyYXkgdHlwZXMuCisgICoKKyAgKiBUaGUgZ2VuZXJhbCBwYXR0ZXJucyBhcmUgdGhlIGZvbGxvd2luZzoKKyAgKgorICAqIFxjIEFycmF5Um93c0NvbHNUeXBlIHdoZXJlIFxjIFJvd3MgYW5kIFxjIENvbHMgY2FuIGJlIFxjIDIsXGMgMyxcYyA0IGZvciBmaXhlZCBzaXplIHNxdWFyZSBtYXRyaWNlcyBvciBcYyBYIGZvciBkeW5hbWljIHNpemUsCisgICogYW5kIHdoZXJlIFxjIFR5cGUgY2FuIGJlIFxjIGkgZm9yIGludGVnZXIsIFxjIGYgZm9yIGZsb2F0LCBcYyBkIGZvciBkb3VibGUsIFxjIGNmIGZvciBjb21wbGV4IGZsb2F0LCBcYyBjZAorICAqIGZvciBjb21wbGV4IGRvdWJsZS4KKyAgKgorICAqIEZvciBleGFtcGxlLCBcYyBBcnJheTMzZCBpcyBhIGZpeGVkLXNpemUgM3gzIGFycmF5IHR5cGUgb2YgZG91YmxlcywgYW5kIFxjIEFycmF5WFhmIGlzIGEgZHluYW1pYy1zaXplIG1hdHJpeCBvZiBmbG9hdHMuCisgICoKKyAgKiBUaGVyZSBhcmUgYWxzbyBcYyBBcnJheVNpemVUeXBlIHdoaWNoIGFyZSBzZWxmLWV4cGxhbmF0b3J5LiBGb3IgZXhhbXBsZSwgXGMgQXJyYXk0Y2YgaXMKKyAgKiBhIGZpeGVkLXNpemUgMUQgYXJyYXkgb2YgNCBjb21wbGV4IGZsb2F0cy4KKyAgKgorICAqIFxzYSBjbGFzcyBBcnJheQorICAqLworCisjZGVmaW5lIEVJR0VOX01BS0VfQVJSQVlfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgU2l6ZSwgU2l6ZVN1ZmZpeCkgICBcCisvKiogXGluZ3JvdXAgYXJyYXl0eXBlZGVmcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3R5cGVkZWYgQXJyYXk8VHlwZSwgU2l6ZSwgU2l6ZT4gQXJyYXkjI1NpemVTdWZmaXgjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7ICBcCisvKiogXGluZ3JvdXAgYXJyYXl0eXBlZGVmcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3R5cGVkZWYgQXJyYXk8VHlwZSwgU2l6ZSwgMT4gICAgQXJyYXkjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7CisKKyNkZWZpbmUgRUlHRU5fTUFLRV9BUlJBWV9GSVhFRF9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCBTaXplKSAgICAgICAgIFwKKy8qKiBcaW5ncm91cCBhcnJheXR5cGVkZWZzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordHlwZWRlZiBBcnJheTxUeXBlLCBTaXplLCBEeW5hbWljPiBBcnJheSMjU2l6ZSMjWCMjVHlwZVN1ZmZpeDsgIFwKKy8qKiBcaW5ncm91cCBhcnJheXR5cGVkZWZzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordHlwZWRlZiBBcnJheTxUeXBlLCBEeW5hbWljLCBTaXplPiBBcnJheSMjWCMjU2l6ZSMjVHlwZVN1ZmZpeDsKKworI2RlZmluZSBFSUdFTl9NQUtFX0FSUkFZX1RZUEVERUZTX0FMTF9TSVpFUyhUeXBlLCBUeXBlU3VmZml4KSBcCitFSUdFTl9NQUtFX0FSUkFZX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDIsIDIpIFwKK0VJR0VOX01BS0VfQVJSQVlfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgMywgMykgXAorRUlHRU5fTUFLRV9BUlJBWV9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCA0LCA0KSBcCitFSUdFTl9NQUtFX0FSUkFZX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIER5bmFtaWMsIFgpIFwKK0VJR0VOX01BS0VfQVJSQVlfRklYRURfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgMikgXAorRUlHRU5fTUFLRV9BUlJBWV9GSVhFRF9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCAzKSBcCitFSUdFTl9NQUtFX0FSUkFZX0ZJWEVEX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDQpCisKK0VJR0VOX01BS0VfQVJSQVlfVFlQRURFRlNfQUxMX1NJWkVTKGludCwgICAgICAgICAgICAgICAgICBpKQorRUlHRU5fTUFLRV9BUlJBWV9UWVBFREVGU19BTExfU0laRVMoZmxvYXQsICAgICAgICAgICAgICAgIGYpCitFSUdFTl9NQUtFX0FSUkFZX1RZUEVERUZTX0FMTF9TSVpFUyhkb3VibGUsICAgICAgICAgICAgICAgZCkKK0VJR0VOX01BS0VfQVJSQVlfVFlQRURFRlNfQUxMX1NJWkVTKHN0ZDo6Y29tcGxleDxmbG9hdD4sICBjZikKK0VJR0VOX01BS0VfQVJSQVlfVFlQRURFRlNfQUxMX1NJWkVTKHN0ZDo6Y29tcGxleDxkb3VibGU+LCBjZCkKKworI3VuZGVmIEVJR0VOX01BS0VfQVJSQVlfVFlQRURFRlNfQUxMX1NJWkVTCisjdW5kZWYgRUlHRU5fTUFLRV9BUlJBWV9UWVBFREVGUworCisjdW5kZWYgRUlHRU5fTUFLRV9BUlJBWV9UWVBFREVGU19MQVJHRQorCisjZGVmaW5lIEVJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFX0FORF9TSVpFKFR5cGVTdWZmaXgsIFNpemVTdWZmaXgpIFwKK3VzaW5nIEVpZ2VuOjpNYXRyaXgjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7IFwKK3VzaW5nIEVpZ2VuOjpWZWN0b3IjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7IFwKK3VzaW5nIEVpZ2VuOjpSb3dWZWN0b3IjI1NpemVTdWZmaXgjI1R5cGVTdWZmaXg7CisKKyNkZWZpbmUgRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEUoVHlwZVN1ZmZpeCkgXAorRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgMikgXAorRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgMykgXAorRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgNCkgXAorRUlHRU5fVVNJTkdfQVJSQVlfVFlQRURFRlNfRk9SX1RZUEVfQU5EX1NJWkUoVHlwZVN1ZmZpeCwgWCkgXAorCisjZGVmaW5lIEVJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTIFwKK0VJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFKGkpIFwKK0VJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFKGYpIFwKK0VJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFKGQpIFwKK0VJR0VOX1VTSU5HX0FSUkFZX1RZUEVERUZTX0ZPUl9UWVBFKGNmKSBcCitFSUdFTl9VU0lOR19BUlJBWV9UWVBFREVGU19GT1JfVFlQRShjZCkKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9BUlJBWV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9BcnJheUJhc2UuaCBiL0VpZ2VuL3NyYy9Db3JlL0FycmF5QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNGIxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9BcnJheUJhc2UuaApAQCAtMCwwICsxLDIyOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FSUkFZQkFTRV9ICisjZGVmaW5lIEVJR0VOX0FSUkFZQkFTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4gY2xhc3MgTWF0cml4V3JhcHBlcjsKKworLyoqIFxjbGFzcyBBcnJheUJhc2UKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEJhc2UgY2xhc3MgZm9yIGFsbCAxRCBhbmQgMkQgYXJyYXksIGFuZCByZWxhdGVkIGV4cHJlc3Npb25zCisgICoKKyAgKiBBbiBhcnJheSBpcyBzaW1pbGFyIHRvIGEgZGVuc2UgdmVjdG9yIG9yIG1hdHJpeC4gV2hpbGUgbWF0cmljZXMgYXJlIG1hdGhlbWF0aWNhbAorICAqIG9iamVjdHMgd2l0aCB3ZWxsIGRlZmluZWQgbGluZWFyIGFsZ2VicmEgb3BlcmF0b3JzLCBhbiBhcnJheSBpcyBqdXN0IGEgY29sbGVjdGlvbgorICAqIG9mIHNjYWxhciB2YWx1ZXMgYXJyYW5nZWQgaW4gYSBvbmUgb3IgdHdvIGRpbWVuc2lvbm5hbCBmYXNoaW9uLiBBcyB0aGUgbWFpbiBjb25zZXF1ZW5jZSwKKyAgKiBhbGwgb3BlcmF0aW9ucyBhcHBsaWVkIHRvIGFuIGFycmF5IGFyZSBwZXJmb3JtZWQgY29lZmZpY2llbnQgd2lzZS4gRnVydGhlcm1vcmUsCisgICogYXJyYXlzIHN1cHBvcnQgc2NhbGFyIG1hdGggZnVuY3Rpb25zIG9mIHRoZSBjKysgc3RhbmRhcmQgbGlicmFyeSAoZS5nLiwgc3RkOjpzaW4oeCkpLCBhbmQgY29udmVuaWVudAorICAqIGNvbnN0cnVjdG9ycyBhbGxvd2luZyB0byBlYXNpbHkgd3JpdGUgZ2VuZXJpYyBjb2RlIHdvcmtpbmcgZm9yIGJvdGggc2NhbGFyIHZhbHVlcworICAqIGFuZCBhcnJheXMuCisgICoKKyAgKiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIHRoYXQgaXMgaW5oZXJpdGVkIGJ5IGFsbCBhcnJheSBleHByZXNzaW9uIHR5cGVzLgorICAqCisgICogXHRwYXJhbSBEZXJpdmVkIGlzIHRoZSBkZXJpdmVkIHR5cGUsIGUuZy4sIGFuIGFycmF5IG9yIGFuIGV4cHJlc3Npb24gdHlwZS4KKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nRWlnZW4gYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fQVJSQVlCQVNFX1BMVUdJTi4KKyAgKgorICAqIFxzYSBjbGFzcyBNYXRyaXhCYXNlLCBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIEFycmF5QmFzZQorICA6IHB1YmxpYyBEZW5zZUJhc2U8RGVyaXZlZD4KK3sKKyAgcHVibGljOgorI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBUaGUgYmFzZSBjbGFzcyBmb3IgYSBnaXZlbiBzdG9yYWdlIHR5cGUuICovCisgICAgdHlwZWRlZiBBcnJheUJhc2UgU3RvcmFnZUJhc2VUeXBlOworCisgICAgdHlwZWRlZiBBcnJheUJhc2UgRWlnZW5fQmFzZUNsYXNzRm9yU3BlY2lhbGl6YXRpb25PZkdsb2JhbE1hdGhGdW5jSW1wbDsKKworICAgIHVzaW5nIGludGVybmFsOjpzcGVjaWFsX3NjYWxhcl9vcF9iYXNlPERlcml2ZWQsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsPjo6b3BlcmF0b3IqOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0U2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIHR5cGVkZWYgRGVuc2VCYXNlPERlcml2ZWQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6Um93c0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6Q29sc0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6TWF4Um93c0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6OkZsYWdzOworICAgIHVzaW5nIEJhc2U6OkNvZWZmUmVhZENvc3Q7CisKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworICAgIHVzaW5nIEJhc2U6OmNvbnN0X2Nhc3RfZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjpyb3dzOworICAgIHVzaW5nIEJhc2U6OmNvbHM7CisgICAgdXNpbmcgQmFzZTo6c2l6ZTsKKyAgICB1c2luZyBCYXNlOjpjb2VmZjsKKyAgICB1c2luZyBCYXNlOjpjb2VmZlJlZjsKKyAgICB1c2luZyBCYXNlOjpsYXp5QXNzaWduOworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yPTsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvcis9OworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yLT07CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IqPTsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvci89OworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisjZW5kaWYgLy8gbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogXGludGVybmFsIHRoZSBwbGFpbiBtYXRyaXggdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXhwcmVzc2lvbi4gTm90ZSB0aGF0IGlzIG5vdCBuZWNlc3NhcmlseQorICAgICAgKiBleGFjdGx5IHRoZSByZXR1cm4gdHlwZSBvZiBldmFsKCk6IGluIHRoZSBjYXNlIG9mIHBsYWluIG1hdHJpY2VzLCB0aGUgcmV0dXJuIHR5cGUgb2YgZXZhbCgpIGlzIGEgY29uc3QKKyAgICAgICogcmVmZXJlbmNlIHRvIGEgbWF0cml4LCBub3QgYSBtYXRyaXghIEl0IGlzIGhvd2V2ZXIgZ3VhcmFudGVlZCB0aGF0IHRoZSByZXR1cm4gdHlwZSBvZiBldmFsKCkgaXMgZWl0aGVyCisgICAgICAqIFBsYWluT2JqZWN0IG9yIGNvbnN0IFBsYWluT2JqZWN0Ji4KKyAgICAgICovCisgICAgdHlwZWRlZiBBcnJheTx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgQXV0b0FsaWduIHwgKGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkZsYWdzJlJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciksCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICA+IFBsYWluT2JqZWN0OworCisKKyAgICAvKiogXGludGVybmFsIFJlcHJlc2VudHMgYSBtYXRyaXggd2l0aCBhbGwgY29lZmZpY2llbnRzIGVxdWFsIHRvIG9uZSBhbm90aGVyKi8KKyAgICB0eXBlZGVmIEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPixEZXJpdmVkPiBDb25zdGFudFJldHVyblR5cGU7CisjZW5kaWYgLy8gbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyNkZWZpbmUgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1MgRWlnZW46OkFycmF5QmFzZQorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvQ29tbW9uQ3dpc2VVbmFyeU9wcy5oIgorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvTWF0cml4Q3dpc2VVbmFyeU9wcy5oIgorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvQXJyYXlDd2lzZVVuYXJ5T3BzLmgiCisjICAgaW5jbHVkZSAiLi4vcGx1Z2lucy9Db21tb25Dd2lzZUJpbmFyeU9wcy5oIgorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvTWF0cml4Q3dpc2VCaW5hcnlPcHMuaCIKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL0FycmF5Q3dpc2VCaW5hcnlPcHMuaCIKKyMgICBpZmRlZiBFSUdFTl9BUlJBWUJBU0VfUExVR0lOCisjICAgICBpbmNsdWRlIEVJR0VOX0FSUkFZQkFTRV9QTFVHSU4KKyMgICBlbmRpZgorI3VuZGVmIEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTCisKKyAgICAvKiogU3BlY2lhbCBjYXNlIG9mIHRoZSB0ZW1wbGF0ZSBvcGVyYXRvcj0sIGluIG9yZGVyIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCisgICAgICAqIGZyb20gZ2VuZXJhdGluZyBhIGRlZmF1bHQgb3BlcmF0b3I9IChpc3N1ZSBoaXQgd2l0aCBnKysgNC4xKQorICAgICAgKi8KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgQXJyYXlCYXNlJiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvcjxEZXJpdmVkLERlcml2ZWQ+OjpydW4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIERlcml2ZWQmIG9wZXJhdG9yKz0oY29uc3QgU2NhbGFyJiBzY2FsYXIpCisgICAgeyByZXR1cm4gKnRoaXMgPSBkZXJpdmVkKCkgKyBzY2FsYXI7IH0KKyAgICBEZXJpdmVkJiBvcGVyYXRvci09KGNvbnN0IFNjYWxhciYgc2NhbGFyKQorICAgIHsgcmV0dXJuICp0aGlzID0gZGVyaXZlZCgpIC0gc2NhbGFyOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3IrPShjb25zdCBBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvci09KGNvbnN0IEFycmF5QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3IqPShjb25zdCBBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yLz0oY29uc3QgQXJyYXlCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICBwdWJsaWM6CisgICAgQXJyYXlCYXNlPERlcml2ZWQ+JiBhcnJheSgpIHsgcmV0dXJuICp0aGlzOyB9CisgICAgY29uc3QgQXJyYXlCYXNlPERlcml2ZWQ+JiBhcnJheSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAvKiogXHJldHVybnMgYW4gXGxpbmsgTWF0cml4QmFzZSBNYXRyaXggXGVuZGxpbmsgZXhwcmVzc2lvbiBvZiB0aGlzIGFycmF5CisgICAgICAqIFxzYSBNYXRyaXhCYXNlOjphcnJheSgpICovCisgICAgTWF0cml4V3JhcHBlcjxEZXJpdmVkPiBtYXRyaXgoKSB7IHJldHVybiBkZXJpdmVkKCk7IH0KKyAgICBjb25zdCBNYXRyaXhXcmFwcGVyPGNvbnN0IERlcml2ZWQ+IG1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKTsgfQorCisvLyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKy8vICAgICBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdCB7IGRzdCA9IG1hdHJpeCgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIEFycmF5QmFzZSgpIDogQmFzZSgpIHt9CisKKyAgcHJpdmF0ZToKKyAgICBleHBsaWNpdCBBcnJheUJhc2UoSW5kZXgpOworICAgIEFycmF5QmFzZShJbmRleCxJbmRleCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBleHBsaWNpdCBBcnJheUJhc2UoY29uc3QgQXJyYXlCYXNlPE90aGVyRGVyaXZlZD4mKTsKKyAgcHJvdGVjdGVkOgorICAgIC8vIG1peGluZyBhcnJheXMgYW5kIG1hdHJpY2VzIGlzIG5vdCBsZWdhbAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRGVyaXZlZCYgb3BlcmF0b3IrPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mICkKKyAgICB7RUlHRU5fU1RBVElDX0FTU0VSVChzdGQ6OnB0cmRpZmZfdChzaXplb2YodHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXIpKT09LTEsWU9VX0NBTk5PVF9NSVhfQVJSQVlTX0FORF9NQVRSSUNFUyk7IHJldHVybiAqdGhpczt9CisgICAgLy8gbWl4aW5nIGFycmF5cyBhbmQgbWF0cmljZXMgaXMgbm90IGxlZ2FsCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBEZXJpdmVkJiBvcGVyYXRvci09KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgKQorICAgIHtFSUdFTl9TVEFUSUNfQVNTRVJUKHN0ZDo6cHRyZGlmZl90KHNpemVvZih0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcikpPT0tMSxZT1VfQ0FOTk9UX01JWF9BUlJBWVNfQU5EX01BVFJJQ0VTKTsgcmV0dXJuICp0aGlzO30KK307CisKKy8qKiByZXBsYWNlcyBcYyAqdGhpcyBieSBcYyAqdGhpcyAtIFxhIG90aGVyLgorICAqCisgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQgJgorQXJyYXlCYXNlPERlcml2ZWQ+OjpvcGVyYXRvci09KGNvbnN0IEFycmF5QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKK3sKKyAgU2VsZkN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9kaWZmZXJlbmNlX29wPFNjYWxhcj4sIERlcml2ZWQsIE90aGVyRGVyaXZlZD4gdG1wKGRlcml2ZWQoKSk7CisgIHRtcCA9IG90aGVyLmRlcml2ZWQoKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIHJlcGxhY2VzIFxjICp0aGlzIGJ5IFxjICp0aGlzICsgXGEgb3RoZXIuCisgICoKKyAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCAmCitBcnJheUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKz0oY29uc3QgQXJyYXlCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBTZWxmQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXI+LCBEZXJpdmVkLCBPdGhlckRlcml2ZWQ+IHRtcChkZXJpdmVkKCkpOworICB0bXAgPSBvdGhlci5kZXJpdmVkKCk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiByZXBsYWNlcyBcYyAqdGhpcyBieSBcYyAqdGhpcyAqIFxhIG90aGVyIGNvZWZmaWNpZW50IHdpc2UuCisgICoKKyAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCAmCitBcnJheUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKj0oY29uc3QgQXJyYXlCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBTZWxmQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPiwgRGVyaXZlZCwgT3RoZXJEZXJpdmVkPiB0bXAoZGVyaXZlZCgpKTsKKyAgdG1wID0gb3RoZXIuZGVyaXZlZCgpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogcmVwbGFjZXMgXGMgKnRoaXMgYnkgXGMgKnRoaXMgLyBcYSBvdGhlciBjb2VmZmljaWVudCB3aXNlLgorICAqCisgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQgJgorQXJyYXlCYXNlPERlcml2ZWQ+OjpvcGVyYXRvci89KGNvbnN0IEFycmF5QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgU2VsZkN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDxTY2FsYXI+LCBEZXJpdmVkLCBPdGhlckRlcml2ZWQ+IHRtcChkZXJpdmVkKCkpOworICB0bXAgPSBvdGhlci5kZXJpdmVkKCk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQVJSQVlCQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0FycmF5V3JhcHBlci5oIGIvRWlnZW4vc3JjL0NvcmUvQXJyYXlXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhZjdmZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0FycmF5V3JhcHBlci5oCkBAIC0wLDAgKzEsMjQwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9BUlJBWVdSQVBQRVJfSAorI2RlZmluZSBFSUdFTl9BUlJBWVdSQVBQRVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxjbGFzcyBBcnJheVdyYXBwZXIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSBtYXRoZW1hdGljYWwgdmVjdG9yIG9yIG1hdHJpeCBhcyBhbiBhcnJheSBvYmplY3QKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OmFycmF5KCksIGFuZCBtb3N0IG9mIHRoZSB0aW1lCisgICogdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmFycmF5KCksIGNsYXNzIE1hdHJpeFdyYXBwZXIKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgorc3RydWN0IHRyYWl0czxBcnJheVdyYXBwZXI8RXhwcmVzc2lvblR5cGU+ID4KKyAgOiBwdWJsaWMgdHJhaXRzPHR5cGVuYW1lIHJlbW92ZV9hbGw8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6Ok5lc3RlZD46OnR5cGUgPgoreworICB0eXBlZGVmIEFycmF5WHByIFhwcktpbmQ7Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK2NsYXNzIEFycmF5V3JhcHBlciA6IHB1YmxpYyBBcnJheUJhc2U8QXJyYXlXcmFwcGVyPEV4cHJlc3Npb25UeXBlPiA+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIEFycmF5QmFzZTxBcnJheVdyYXBwZXI+IEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShBcnJheVdyYXBwZXIpCisgICAgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhBcnJheVdyYXBwZXIpCisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmlzX2x2YWx1ZTxFeHByZXNzaW9uVHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhcgorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxFeHByZXNzaW9uVHlwZT46OnR5cGUgTmVzdGVkRXhwcmVzc2lvblR5cGU7CisKKyAgICBpbmxpbmUgQXJyYXlXcmFwcGVyKEV4cHJlc3Npb25UeXBlJiBtYXRyaXgpIDogbV9leHByZXNzaW9uKG1hdHJpeCkge30KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLmNvbHMoKTsgfQorICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5vdXRlclN0cmlkZSgpOyB9CisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLmlubmVyU3RyaWRlKCk7IH0KKworICAgIGlubGluZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZSogZGF0YSgpIHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5kYXRhKCk7IH0KKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLmRhdGEoKTsgfQorCisgICAgaW5saW5lIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvZWZmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29lZmYoaW5kZXgpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgY29uc3QgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4ocm93LCBjb2wpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQorICAgIHsKKyAgICAgIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS50ZW1wbGF0ZSB3cml0ZVBhY2tldDxMb2FkTW9kZT4ocm93LCBjb2wsIHgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgY29uc3QgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQorICAgIHsKKyAgICAgIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS50ZW1wbGF0ZSB3cml0ZVBhY2tldDxMb2FkTW9kZT4oaW5kZXgsIHgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QgeyBkc3QgPSBtX2V4cHJlc3Npb247IH0KKworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE5lc3RlZEV4cHJlc3Npb25UeXBlPjo6dHlwZSYgCisgICAgbmVzdGVkRXhwcmVzc2lvbigpIGNvbnN0IAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb247CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBOZXN0ZWRFeHByZXNzaW9uVHlwZSBtX2V4cHJlc3Npb247Cit9OworCisvKiogXGNsYXNzIE1hdHJpeFdyYXBwZXIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYW4gYXJyYXkgYXMgYSBtYXRoZW1hdGljYWwgdmVjdG9yIG9yIG1hdHJpeAorICAqCisgICogVGhpcyBjbGFzcyBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgQXJyYXlCYXNlOjptYXRyaXgoKSwgYW5kIG1vc3Qgb2YgdGhlIHRpbWUKKyAgKiB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2UuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6bWF0cml4KCksIGNsYXNzIEFycmF5V3JhcHBlcgorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitzdHJ1Y3QgdHJhaXRzPE1hdHJpeFdyYXBwZXI8RXhwcmVzc2lvblR5cGU+ID4KKyA6IHB1YmxpYyB0cmFpdHM8dHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6TmVzdGVkPjo6dHlwZSA+Cit7CisgIHR5cGVkZWYgTWF0cml4WHByIFhwcktpbmQ7Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK2NsYXNzIE1hdHJpeFdyYXBwZXIgOiBwdWJsaWMgTWF0cml4QmFzZTxNYXRyaXhXcmFwcGVyPEV4cHJlc3Npb25UeXBlPiA+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIE1hdHJpeEJhc2U8TWF0cml4V3JhcHBlcjxFeHByZXNzaW9uVHlwZT4gPiBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoTWF0cml4V3JhcHBlcikKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKE1hdHJpeFdyYXBwZXIpCisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmlzX2x2YWx1ZTxFeHByZXNzaW9uVHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhcgorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxFeHByZXNzaW9uVHlwZT46OnR5cGUgTmVzdGVkRXhwcmVzc2lvblR5cGU7CisKKyAgICBpbmxpbmUgTWF0cml4V3JhcHBlcihFeHByZXNzaW9uVHlwZSYgbWF0cml4KSA6IG1fZXhwcmVzc2lvbihtYXRyaXgpIHt9CisKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb2xzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24ub3V0ZXJTdHJpZGUoKTsgfQorICAgIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5pbm5lclN0cmlkZSgpOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyV2l0aENvbnN0SWZOb3RMdmFsdWUqIGRhdGEoKSB7IHJldHVybiBtX2V4cHJlc3Npb24uZGF0YSgpOyB9CisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5kYXRhKCk7IH0KKworICAgIGlubGluZSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb2VmZihyb3csIGNvbCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZihyb3csIGNvbCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5kZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworICAgIGlubGluZSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb2VmZihpbmRleCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24udGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihyb3csIGNvbCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihyb3csIGNvbCwgeCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24udGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihpbmRleCwgeCk7CisgICAgfQorCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TmVzdGVkRXhwcmVzc2lvblR5cGU+Ojp0eXBlJiAKKyAgICBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgCisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIE5lc3RlZEV4cHJlc3Npb25UeXBlIG1fZXhwcmVzc2lvbjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQVJSQVlXUkFQUEVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0Fzc2lnbi5oIGIvRWlnZW4vc3JjL0NvcmUvQXNzaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyOWE4OAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0Fzc2lnbi5oCkBAIC0wLDAgKzEsNTgzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIE9sYnJpY2ggPG1pY2hhZWwub2xicmljaEBnbXgubmV0PgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FTU0lHTl9ICisjZGVmaW5lIEVJR0VOX0FTU0lHTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUGFydCAxIDogdGhlIGxvZ2ljIGRlY2lkaW5nIGEgc3RyYXRlZ3kgZm9yIHRyYXZlcnNhbCBhbmQgdW5yb2xsaW5nICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3N0cnVjdCBhc3NpZ25fdHJhaXRzCit7CitwdWJsaWM6CisgIGVudW0geworICAgIERzdElzQWxpZ25lZCA9IERlcml2ZWQ6OkZsYWdzICYgQWxpZ25lZEJpdCwKKyAgICBEc3RIYXNEaXJlY3RBY2Nlc3MgPSBEZXJpdmVkOjpGbGFncyAmIERpcmVjdEFjY2Vzc0JpdCwKKyAgICBTcmNJc0FsaWduZWQgPSBPdGhlckRlcml2ZWQ6OkZsYWdzICYgQWxpZ25lZEJpdCwKKyAgICBKb2ludEFsaWdubWVudCA9IGJvb2woRHN0SXNBbGlnbmVkKSAmJiBib29sKFNyY0lzQWxpZ25lZCkgPyBBbGlnbmVkIDogVW5hbGlnbmVkCisgIH07CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIElubmVyU2l6ZSA9IGludChEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpID8gaW50KERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICA6IGludChEZXJpdmVkOjpGbGFncykmUm93TWFqb3JCaXQgPyBpbnQoRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgIDogaW50KERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICBJbm5lck1heFNpemUgPSBpbnQoRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lKSA/IGludChEZXJpdmVkOjpNYXhTaXplQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgOiBpbnQoRGVyaXZlZDo6RmxhZ3MpJlJvd01ham9yQml0ID8gaW50KERlcml2ZWQ6Ok1heENvbHNBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICA6IGludChEZXJpdmVkOjpNYXhSb3dzQXRDb21waWxlVGltZSksCisgICAgTWF4U2l6ZUF0Q29tcGlsZVRpbWUgPSBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSwKKyAgICBQYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXI+OjpzaXplCisgIH07CisKKyAgZW51bSB7CisgICAgU3RvcmFnZU9yZGVyc0FncmVlID0gKGludChEZXJpdmVkOjpJc1Jvd01ham9yKSA9PSBpbnQoT3RoZXJEZXJpdmVkOjpJc1Jvd01ham9yKSksCisgICAgTWlnaHRWZWN0b3JpemUgPSBTdG9yYWdlT3JkZXJzQWdyZWUKKyAgICAgICAgICAgICAgICAgICYmIChpbnQoRGVyaXZlZDo6RmxhZ3MpICYgaW50KE90aGVyRGVyaXZlZDo6RmxhZ3MpICYgQWN0dWFsUGFja2V0QWNjZXNzQml0KSwKKyAgICBNYXlJbm5lclZlY3Rvcml6ZSAgPSBNaWdodFZlY3Rvcml6ZSAmJiBpbnQoSW5uZXJTaXplKSE9RHluYW1pYyAmJiBpbnQoSW5uZXJTaXplKSVpbnQoUGFja2V0U2l6ZSk9PTAKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50KERzdElzQWxpZ25lZCkgJiYgaW50KFNyY0lzQWxpZ25lZCksCisgICAgTWF5TGluZWFyaXplID0gU3RvcmFnZU9yZGVyc0FncmVlICYmIChpbnQoRGVyaXZlZDo6RmxhZ3MpICYgaW50KE90aGVyRGVyaXZlZDo6RmxhZ3MpICYgTGluZWFyQWNjZXNzQml0KSwKKyAgICBNYXlMaW5lYXJWZWN0b3JpemUgPSBNaWdodFZlY3Rvcml6ZSAmJiBNYXlMaW5lYXJpemUgJiYgRHN0SGFzRGlyZWN0QWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICYmIChEc3RJc0FsaWduZWQgfHwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyksCisgICAgICAvKiBJZiB0aGUgZGVzdGluYXRpb24gaXNuJ3QgYWxpZ25lZCwgd2UgaGF2ZSB0byBkbyBydW50aW1lIGNoZWNrcyBhbmQgd2UgZG9uJ3QgdW5yb2xsLAorICAgICAgICAgc28gaXQncyBvbmx5IGdvb2QgZm9yIGxhcmdlIGVub3VnaCBzaXplcy4gKi8KKyAgICBNYXlTbGljZVZlY3Rvcml6ZSAgPSBNaWdodFZlY3Rvcml6ZSAmJiBEc3RIYXNEaXJlY3RBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgKGludChJbm5lck1heFNpemUpPT1EeW5hbWljIHx8IGludChJbm5lck1heFNpemUpPj0zKlBhY2tldFNpemUpCisgICAgICAvKiBzbGljZSB2ZWN0b3JpemF0aW9uIGNhbiBiZSBzbG93LCBzbyB3ZSBvbmx5IHdhbnQgaXQgaWYgdGhlIHNsaWNlcyBhcmUgYmlnLCB3aGljaCBpcworICAgICAgICAgaW5kaWNhdGVkIGJ5IElubmVyTWF4U2l6ZSByYXRoZXIgdGhhbiBJbm5lclNpemUsIHRoaW5rIG9mIHRoZSBjYXNlIG9mIGEgZHluYW1pYyBibG9jaworICAgICAgICAgaW4gYSBmaXhlZC1zaXplIG1hdHJpeCAqLworICB9OworCitwdWJsaWM6CisgIGVudW0geworICAgIFRyYXZlcnNhbCA9IGludChNYXlJbm5lclZlY3Rvcml6ZSkgID8gaW50KElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgOiBpbnQoTWF5TGluZWFyVmVjdG9yaXplKSA/IGludChMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKQorICAgICAgICAgICAgICA6IGludChNYXlTbGljZVZlY3Rvcml6ZSkgID8gaW50KFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgOiBpbnQoTWF5TGluZWFyaXplKSAgICAgICA/IGludChMaW5lYXJUcmF2ZXJzYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnQoRGVmYXVsdFRyYXZlcnNhbCksCisgICAgVmVjdG9yaXplZCA9IGludChUcmF2ZXJzYWwpID09IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbAorICAgICAgICAgICAgICB8fCBpbnQoVHJhdmVyc2FsKSA9PSBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsCisgICAgICAgICAgICAgIHx8IGludChUcmF2ZXJzYWwpID09IFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbAorICB9OworCitwcml2YXRlOgorICBlbnVtIHsKKyAgICBVbnJvbGxpbmdMaW1pdCAgICAgID0gRUlHRU5fVU5ST0xMSU5HX0xJTUlUICogKFZlY3Rvcml6ZWQgPyBpbnQoUGFja2V0U2l6ZSkgOiAxKSwKKyAgICBNYXlVbnJvbGxDb21wbGV0ZWx5ID0gaW50KERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lKSAhPSBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgICYmIGludChPdGhlckRlcml2ZWQ6OkNvZWZmUmVhZENvc3QpICE9IER5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50KERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lKSAqIGludChPdGhlckRlcml2ZWQ6OkNvZWZmUmVhZENvc3QpIDw9IGludChVbnJvbGxpbmdMaW1pdCksCisgICAgTWF5VW5yb2xsSW5uZXIgICAgICA9IGludChJbm5lclNpemUpICE9IER5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50KE90aGVyRGVyaXZlZDo6Q29lZmZSZWFkQ29zdCkgIT0gRHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAmJiBpbnQoSW5uZXJTaXplKSAqIGludChPdGhlckRlcml2ZWQ6OkNvZWZmUmVhZENvc3QpIDw9IGludChVbnJvbGxpbmdMaW1pdCkKKyAgfTsKKworcHVibGljOgorICBlbnVtIHsKKyAgICBVbnJvbGxpbmcgPSAoaW50KFRyYXZlcnNhbCkgPT0gaW50KElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCkgfHwgaW50KFRyYXZlcnNhbCkgPT0gaW50KERlZmF1bHRUcmF2ZXJzYWwpKQorICAgICAgICAgICAgICAgID8gKAorICAgICAgICAgICAgICAgICAgICBpbnQoTWF5VW5yb2xsQ29tcGxldGVseSkgPyBpbnQoQ29tcGxldGVVbnJvbGxpbmcpCisgICAgICAgICAgICAgICAgICA6IGludChNYXlVbnJvbGxJbm5lcikgICAgICA/IGludChJbm5lclVucm9sbGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KE5vVW5yb2xsaW5nKQorICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICA6IGludChUcmF2ZXJzYWwpID09IGludChMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKQorICAgICAgICAgICAgICAgID8gKCBib29sKE1heVVucm9sbENvbXBsZXRlbHkpICYmIGJvb2woRHN0SXNBbGlnbmVkKSA/IGludChDb21wbGV0ZVVucm9sbGluZykgOiBpbnQoTm9VbnJvbGxpbmcpICkKKyAgICAgICAgICAgICAgOiBpbnQoVHJhdmVyc2FsKSA9PSBpbnQoTGluZWFyVHJhdmVyc2FsKQorICAgICAgICAgICAgICAgID8gKCBib29sKE1heVVucm9sbENvbXBsZXRlbHkpID8gaW50KENvbXBsZXRlVW5yb2xsaW5nKSA6IGludChOb1Vucm9sbGluZykgKQorICAgICAgICAgICAgICA6IGludChOb1Vucm9sbGluZykKKyAgfTsKKworI2lmZGVmIEVJR0VOX0RFQlVHX0FTU0lHTgorICBzdGF0aWMgdm9pZCBkZWJ1ZygpCisgIHsKKyAgICBFSUdFTl9ERUJVR19WQVIoRHN0SXNBbGlnbmVkKQorICAgIEVJR0VOX0RFQlVHX1ZBUihTcmNJc0FsaWduZWQpCisgICAgRUlHRU5fREVCVUdfVkFSKEpvaW50QWxpZ25tZW50KQorICAgIEVJR0VOX0RFQlVHX1ZBUihJbm5lclNpemUpCisgICAgRUlHRU5fREVCVUdfVkFSKElubmVyTWF4U2l6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoUGFja2V0U2l6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoU3RvcmFnZU9yZGVyc0FncmVlKQorICAgIEVJR0VOX0RFQlVHX1ZBUihNaWdodFZlY3Rvcml6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWF5TGluZWFyaXplKQorICAgIEVJR0VOX0RFQlVHX1ZBUihNYXlJbm5lclZlY3Rvcml6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWF5TGluZWFyVmVjdG9yaXplKQorICAgIEVJR0VOX0RFQlVHX1ZBUihNYXlTbGljZVZlY3Rvcml6ZSkKKyAgICBFSUdFTl9ERUJVR19WQVIoVHJhdmVyc2FsKQorICAgIEVJR0VOX0RFQlVHX1ZBUihVbnJvbGxpbmdMaW1pdCkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWF5VW5yb2xsQ29tcGxldGVseSkKKyAgICBFSUdFTl9ERUJVR19WQVIoTWF5VW5yb2xsSW5uZXIpCisgICAgRUlHRU5fREVCVUdfVkFSKFVucm9sbGluZykKKyAgfQorI2VuZGlmCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFBhcnQgMiA6IG1ldGEtdW5yb2xsZXJzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBEZWZhdWx0IHRyYXZlcnNhbCAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgSW5kZXgsIGludCBTdG9wPgorc3RydWN0IGFzc2lnbl9EZWZhdWx0VHJhdmVyc2FsX0NvbXBsZXRlVW5yb2xsaW5nCit7CisgIGVudW0geworICAgIG91dGVyID0gSW5kZXggLyBEZXJpdmVkMTo6SW5uZXJTaXplQXRDb21waWxlVGltZSwKKyAgICBpbm5lciA9IEluZGV4ICUgRGVyaXZlZDE6OklubmVyU2l6ZUF0Q29tcGlsZVRpbWUKKyAgfTsKKworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihEZXJpdmVkMSAmZHN0LCBjb25zdCBEZXJpdmVkMiAmc3JjKQorICB7CisgICAgZHN0LmNvcHlDb2VmZkJ5T3V0ZXJJbm5lcihvdXRlciwgaW5uZXIsIHNyYyk7CisgICAgYXNzaWduX0RlZmF1bHRUcmF2ZXJzYWxfQ29tcGxldGVVbnJvbGxpbmc8RGVyaXZlZDEsIERlcml2ZWQyLCBJbmRleCsxLCBTdG9wPjo6cnVuKGRzdCwgc3JjKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgU3RvcD4KK3N0cnVjdCBhc3NpZ25fRGVmYXVsdFRyYXZlcnNhbF9Db21wbGV0ZVVucm9sbGluZzxEZXJpdmVkMSwgRGVyaXZlZDIsIFN0b3AsIFN0b3A+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKERlcml2ZWQxICYsIGNvbnN0IERlcml2ZWQyICYpIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDIsIGludCBJbmRleCwgaW50IFN0b3A+CitzdHJ1Y3QgYXNzaWduX0RlZmF1bHRUcmF2ZXJzYWxfSW5uZXJVbnJvbGxpbmcKK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYywgaW50IG91dGVyKQorICB7CisgICAgZHN0LmNvcHlDb2VmZkJ5T3V0ZXJJbm5lcihvdXRlciwgSW5kZXgsIHNyYyk7CisgICAgYXNzaWduX0RlZmF1bHRUcmF2ZXJzYWxfSW5uZXJVbnJvbGxpbmc8RGVyaXZlZDEsIERlcml2ZWQyLCBJbmRleCsxLCBTdG9wPjo6cnVuKGRzdCwgc3JjLCBvdXRlcik7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgaW50IFN0b3A+CitzdHJ1Y3QgYXNzaWduX0RlZmF1bHRUcmF2ZXJzYWxfSW5uZXJVbnJvbGxpbmc8RGVyaXZlZDEsIERlcml2ZWQyLCBTdG9wLCBTdG9wPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihEZXJpdmVkMSAmLCBjb25zdCBEZXJpdmVkMiAmLCBpbnQpIHt9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBMaW5lYXIgdHJhdmVyc2FsICoqKgorKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgaW50IEluZGV4LCBpbnQgU3RvcD4KK3N0cnVjdCBhc3NpZ25fTGluZWFyVHJhdmVyc2FsX0NvbXBsZXRlVW5yb2xsaW5nCit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKERlcml2ZWQxICZkc3QsIGNvbnN0IERlcml2ZWQyICZzcmMpCisgIHsKKyAgICBkc3QuY29weUNvZWZmKEluZGV4LCBzcmMpOworICAgIGFzc2lnbl9MaW5lYXJUcmF2ZXJzYWxfQ29tcGxldGVVbnJvbGxpbmc8RGVyaXZlZDEsIERlcml2ZWQyLCBJbmRleCsxLCBTdG9wPjo6cnVuKGRzdCwgc3JjKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgU3RvcD4KK3N0cnVjdCBhc3NpZ25fTGluZWFyVHJhdmVyc2FsX0NvbXBsZXRlVW5yb2xsaW5nPERlcml2ZWQxLCBEZXJpdmVkMiwgU3RvcCwgU3RvcD4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRGVyaXZlZDEgJiwgY29uc3QgRGVyaXZlZDIgJikge30KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIElubmVyIHZlY3Rvcml6YXRpb24gKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgSW5kZXgsIGludCBTdG9wPgorc3RydWN0IGFzc2lnbl9pbm5lcnZlY19Db21wbGV0ZVVucm9sbGluZworeworICBlbnVtIHsKKyAgICBvdXRlciA9IEluZGV4IC8gRGVyaXZlZDE6OklubmVyU2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgaW5uZXIgPSBJbmRleCAlIERlcml2ZWQxOjpJbm5lclNpemVBdENvbXBpbGVUaW1lLAorICAgIEpvaW50QWxpZ25tZW50ID0gYXNzaWduX3RyYWl0czxEZXJpdmVkMSxEZXJpdmVkMj46OkpvaW50QWxpZ25tZW50CisgIH07CisKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICAgIGRzdC50ZW1wbGF0ZSBjb3B5UGFja2V0QnlPdXRlcklubmVyPERlcml2ZWQyLCBBbGlnbmVkLCBKb2ludEFsaWdubWVudD4ob3V0ZXIsIGlubmVyLCBzcmMpOworICAgIGFzc2lnbl9pbm5lcnZlY19Db21wbGV0ZVVucm9sbGluZzxEZXJpdmVkMSwgRGVyaXZlZDIsCisgICAgICBJbmRleCtwYWNrZXRfdHJhaXRzPHR5cGVuYW1lIERlcml2ZWQxOjpTY2FsYXI+OjpzaXplLCBTdG9wPjo6cnVuKGRzdCwgc3JjKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgU3RvcD4KK3N0cnVjdCBhc3NpZ25faW5uZXJ2ZWNfQ29tcGxldGVVbnJvbGxpbmc8RGVyaXZlZDEsIERlcml2ZWQyLCBTdG9wLCBTdG9wPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihEZXJpdmVkMSAmLCBjb25zdCBEZXJpdmVkMiAmKSB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgSW5kZXgsIGludCBTdG9wPgorc3RydWN0IGFzc2lnbl9pbm5lcnZlY19Jbm5lclVucm9sbGluZworeworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihEZXJpdmVkMSAmZHN0LCBjb25zdCBEZXJpdmVkMiAmc3JjLCBpbnQgb3V0ZXIpCisgIHsKKyAgICBkc3QudGVtcGxhdGUgY29weVBhY2tldEJ5T3V0ZXJJbm5lcjxEZXJpdmVkMiwgQWxpZ25lZCwgQWxpZ25lZD4ob3V0ZXIsIEluZGV4LCBzcmMpOworICAgIGFzc2lnbl9pbm5lcnZlY19Jbm5lclVucm9sbGluZzxEZXJpdmVkMSwgRGVyaXZlZDIsCisgICAgICBJbmRleCtwYWNrZXRfdHJhaXRzPHR5cGVuYW1lIERlcml2ZWQxOjpTY2FsYXI+OjpzaXplLCBTdG9wPjo6cnVuKGRzdCwgc3JjLCBvdXRlcik7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgaW50IFN0b3A+CitzdHJ1Y3QgYXNzaWduX2lubmVydmVjX0lubmVyVW5yb2xsaW5nPERlcml2ZWQxLCBEZXJpdmVkMiwgU3RvcCwgU3RvcD4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRGVyaXZlZDEgJiwgY29uc3QgRGVyaXZlZDIgJiwgaW50KSB7fQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQYXJ0IDMgOiBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgY2FzZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLAorICAgICAgICAgaW50IFRyYXZlcnNhbCA9IGFzc2lnbl90cmFpdHM8RGVyaXZlZDEsIERlcml2ZWQyPjo6VHJhdmVyc2FsLAorICAgICAgICAgaW50IFVucm9sbGluZyA9IGFzc2lnbl90cmFpdHM8RGVyaXZlZDEsIERlcml2ZWQyPjo6VW5yb2xsaW5nLAorICAgICAgICAgaW50IFZlcnNpb24gPSBTcGVjaWFsaXplZD4KK3N0cnVjdCBhc3NpZ25faW1wbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorKioqIERlZmF1bHQgdHJhdmVyc2FsICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDIsIGludCBVbnJvbGxpbmcsIGludCBWZXJzaW9uPgorc3RydWN0IGFzc2lnbl9pbXBsPERlcml2ZWQxLCBEZXJpdmVkMiwgSW52YWxpZFRyYXZlcnNhbCwgVW5yb2xsaW5nLCBWZXJzaW9uPgoreworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKERlcml2ZWQxICYsIGNvbnN0IERlcml2ZWQyICYpIHsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBhc3NpZ25faW1wbDxEZXJpdmVkMSwgRGVyaXZlZDIsIERlZmF1bHRUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nLCBWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihEZXJpdmVkMSAmZHN0LCBjb25zdCBEZXJpdmVkMiAmc3JjKQorICB7CisgICAgY29uc3QgSW5kZXggaW5uZXJTaXplID0gZHN0LmlubmVyU2l6ZSgpOworICAgIGNvbnN0IEluZGV4IG91dGVyU2l6ZSA9IGRzdC5vdXRlclNpemUoKTsKKyAgICBmb3IoSW5kZXggb3V0ZXIgPSAwOyBvdXRlciA8IG91dGVyU2l6ZTsgKytvdXRlcikKKyAgICAgIGZvcihJbmRleCBpbm5lciA9IDA7IGlubmVyIDwgaW5uZXJTaXplOyArK2lubmVyKQorICAgICAgICBkc3QuY29weUNvZWZmQnlPdXRlcklubmVyKG91dGVyLCBpbm5lciwgc3JjKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBhc3NpZ25faW1wbDxEZXJpdmVkMSwgRGVyaXZlZDIsIERlZmF1bHRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nLCBWZXJzaW9uPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihEZXJpdmVkMSAmZHN0LCBjb25zdCBEZXJpdmVkMiAmc3JjKQorICB7CisgICAgYXNzaWduX0RlZmF1bHRUcmF2ZXJzYWxfQ29tcGxldGVVbnJvbGxpbmc8RGVyaXZlZDEsIERlcml2ZWQyLCAwLCBEZXJpdmVkMTo6U2l6ZUF0Q29tcGlsZVRpbWU+CisgICAgICA6OnJ1bihkc3QsIHNyYyk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgaW50IFZlcnNpb24+CitzdHJ1Y3QgYXNzaWduX2ltcGw8RGVyaXZlZDEsIERlcml2ZWQyLCBEZWZhdWx0VHJhdmVyc2FsLCBJbm5lclVucm9sbGluZywgVmVyc2lvbj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkMTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKERlcml2ZWQxICZkc3QsIGNvbnN0IERlcml2ZWQyICZzcmMpCisgIHsKKyAgICBjb25zdCBJbmRleCBvdXRlclNpemUgPSBkc3Qub3V0ZXJTaXplKCk7CisgICAgZm9yKEluZGV4IG91dGVyID0gMDsgb3V0ZXIgPCBvdXRlclNpemU7ICsrb3V0ZXIpCisgICAgICBhc3NpZ25fRGVmYXVsdFRyYXZlcnNhbF9Jbm5lclVucm9sbGluZzxEZXJpdmVkMSwgRGVyaXZlZDIsIDAsIERlcml2ZWQxOjpJbm5lclNpemVBdENvbXBpbGVUaW1lPgorICAgICAgICA6OnJ1bihkc3QsIHNyYywgb3V0ZXIpOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBMaW5lYXIgdHJhdmVyc2FsICoqKgorKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgaW50IFZlcnNpb24+CitzdHJ1Y3QgYXNzaWduX2ltcGw8RGVyaXZlZDEsIERlcml2ZWQyLCBMaW5lYXJUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nLCBWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihEZXJpdmVkMSAmZHN0LCBjb25zdCBEZXJpdmVkMiAmc3JjKQorICB7CisgICAgY29uc3QgSW5kZXggc2l6ZSA9IGRzdC5zaXplKCk7CisgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgZHN0LmNvcHlDb2VmZihpLCBzcmMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDIsIGludCBWZXJzaW9uPgorc3RydWN0IGFzc2lnbl9pbXBsPERlcml2ZWQxLCBEZXJpdmVkMiwgTGluZWFyVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZywgVmVyc2lvbj4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICAgIGFzc2lnbl9MaW5lYXJUcmF2ZXJzYWxfQ29tcGxldGVVbnJvbGxpbmc8RGVyaXZlZDEsIERlcml2ZWQyLCAwLCBEZXJpdmVkMTo6U2l6ZUF0Q29tcGlsZVRpbWU+CisgICAgICA6OnJ1bihkc3QsIHNyYyk7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIElubmVyIHZlY3Rvcml6YXRpb24gKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBhc3NpZ25faW1wbDxEZXJpdmVkMSwgRGVyaXZlZDIsIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgTm9VbnJvbGxpbmcsIFZlcnNpb24+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDE6OkluZGV4IEluZGV4OworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKERlcml2ZWQxICZkc3QsIGNvbnN0IERlcml2ZWQyICZzcmMpCisgIHsKKyAgICBjb25zdCBJbmRleCBpbm5lclNpemUgPSBkc3QuaW5uZXJTaXplKCk7CisgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0gZHN0Lm91dGVyU2l6ZSgpOworICAgIGNvbnN0IEluZGV4IHBhY2tldFNpemUgPSBwYWNrZXRfdHJhaXRzPHR5cGVuYW1lIERlcml2ZWQxOjpTY2FsYXI+OjpzaXplOworICAgIGZvcihJbmRleCBvdXRlciA9IDA7IG91dGVyIDwgb3V0ZXJTaXplOyArK291dGVyKQorICAgICAgZm9yKEluZGV4IGlubmVyID0gMDsgaW5uZXIgPCBpbm5lclNpemU7IGlubmVyKz1wYWNrZXRTaXplKQorICAgICAgICBkc3QudGVtcGxhdGUgY29weVBhY2tldEJ5T3V0ZXJJbm5lcjxEZXJpdmVkMiwgQWxpZ25lZCwgQWxpZ25lZD4ob3V0ZXIsIGlubmVyLCBzcmMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDIsIGludCBWZXJzaW9uPgorc3RydWN0IGFzc2lnbl9pbXBsPERlcml2ZWQxLCBEZXJpdmVkMiwgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZywgVmVyc2lvbj4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICAgIGFzc2lnbl9pbm5lcnZlY19Db21wbGV0ZVVucm9sbGluZzxEZXJpdmVkMSwgRGVyaXZlZDIsIDAsIERlcml2ZWQxOjpTaXplQXRDb21waWxlVGltZT4KKyAgICAgIDo6cnVuKGRzdCwgc3JjKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBhc3NpZ25faW1wbDxEZXJpdmVkMSwgRGVyaXZlZDIsIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgSW5uZXJVbnJvbGxpbmcsIFZlcnNpb24+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDE6OkluZGV4IEluZGV4OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihEZXJpdmVkMSAmZHN0LCBjb25zdCBEZXJpdmVkMiAmc3JjKQorICB7CisgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0gZHN0Lm91dGVyU2l6ZSgpOworICAgIGZvcihJbmRleCBvdXRlciA9IDA7IG91dGVyIDwgb3V0ZXJTaXplOyArK291dGVyKQorICAgICAgYXNzaWduX2lubmVydmVjX0lubmVyVW5yb2xsaW5nPERlcml2ZWQxLCBEZXJpdmVkMiwgMCwgRGVyaXZlZDE6OklubmVyU2l6ZUF0Q29tcGlsZVRpbWU+CisgICAgICAgIDo6cnVuKGRzdCwgc3JjLCBvdXRlcik7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBMaW5lYXIgdmVjdG9yaXphdGlvbiAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGUgPGJvb2wgSXNBbGlnbmVkID0gZmFsc2U+CitzdHJ1Y3QgdW5hbGlnbmVkX2Fzc2lnbl9pbXBsCit7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKGNvbnN0IERlcml2ZWQmLCBPdGhlckRlcml2ZWQmLCB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCwgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXgpIHt9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IHVuYWxpZ25lZF9hc3NpZ25faW1wbDxmYWxzZT4KK3sKKyAgLy8gTVNWQyBtdXN0IG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbnMuIElmIGl0IGRvZXMsIGl0IGZhaWxzIHRvIG9wdGltaXplIHRoZQorICAvLyBwYWNrZXQgYWNjZXNzIHBhdGguCisjaWZkZWYgX01TQ19WRVIKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKGNvbnN0IERlcml2ZWQmIHNyYywgT3RoZXJEZXJpdmVkJiBkc3QsIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IHN0YXJ0LCB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBlbmQpCisjZWxzZQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihjb25zdCBEZXJpdmVkJiBzcmMsIE90aGVyRGVyaXZlZCYgZHN0LCB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBzdGFydCwgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggZW5kKQorI2VuZGlmCisgIHsKKyAgICBmb3IgKHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IGluZGV4ID0gc3RhcnQ7IGluZGV4IDwgZW5kOyArK2luZGV4KQorICAgICAgZHN0LmNvcHlDb2VmZihpbmRleCwgc3JjKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBhc3NpZ25faW1wbDxEZXJpdmVkMSwgRGVyaXZlZDIsIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nLCBWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICAgIGNvbnN0IEluZGV4IHNpemUgPSBkc3Quc2l6ZSgpOworICAgIHR5cGVkZWYgcGFja2V0X3RyYWl0czx0eXBlbmFtZSBEZXJpdmVkMTo6U2NhbGFyPiBQYWNrZXRUcmFpdHM7CisgICAgZW51bSB7CisgICAgICBwYWNrZXRTaXplID0gUGFja2V0VHJhaXRzOjpzaXplLAorICAgICAgZHN0QWxpZ25tZW50ID0gUGFja2V0VHJhaXRzOjpBbGlnbmVkT25TY2FsYXIgPyBBbGlnbmVkIDogaW50KGFzc2lnbl90cmFpdHM8RGVyaXZlZDEsRGVyaXZlZDI+OjpEc3RJc0FsaWduZWQpICwKKyAgICAgIHNyY0FsaWdubWVudCA9IGFzc2lnbl90cmFpdHM8RGVyaXZlZDEsRGVyaXZlZDI+OjpKb2ludEFsaWdubWVudAorICAgIH07CisgICAgY29uc3QgSW5kZXggYWxpZ25lZFN0YXJ0ID0gYXNzaWduX3RyYWl0czxEZXJpdmVkMSxEZXJpdmVkMj46OkRzdElzQWxpZ25lZCA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZCgmZHN0LmNvZWZmUmVmKDApLCBzaXplKTsKKyAgICBjb25zdCBJbmRleCBhbGlnbmVkRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChzaXplLWFsaWduZWRTdGFydCkvcGFja2V0U2l6ZSkqcGFja2V0U2l6ZTsKKworICAgIHVuYWxpZ25lZF9hc3NpZ25faW1wbDxhc3NpZ25fdHJhaXRzPERlcml2ZWQxLERlcml2ZWQyPjo6RHN0SXNBbGlnbmVkIT0wPjo6cnVuKHNyYyxkc3QsMCxhbGlnbmVkU3RhcnQpOworCisgICAgZm9yKEluZGV4IGluZGV4ID0gYWxpZ25lZFN0YXJ0OyBpbmRleCA8IGFsaWduZWRFbmQ7IGluZGV4ICs9IHBhY2tldFNpemUpCisgICAgeworICAgICAgZHN0LnRlbXBsYXRlIGNvcHlQYWNrZXQ8RGVyaXZlZDIsIGRzdEFsaWdubWVudCwgc3JjQWxpZ25tZW50PihpbmRleCwgc3JjKTsKKyAgICB9CisKKyAgICB1bmFsaWduZWRfYXNzaWduX2ltcGw8Pjo6cnVuKHNyYyxkc3QsYWxpZ25lZEVuZCxzaXplKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBhc3NpZ25faW1wbDxEZXJpdmVkMSwgRGVyaXZlZDIsIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nLCBWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICAgIGVudW0geyBzaXplID0gRGVyaXZlZDE6OlNpemVBdENvbXBpbGVUaW1lLAorICAgICAgICAgICBwYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czx0eXBlbmFtZSBEZXJpdmVkMTo6U2NhbGFyPjo6c2l6ZSwKKyAgICAgICAgICAgYWxpZ25lZFNpemUgPSAoc2l6ZS9wYWNrZXRTaXplKSpwYWNrZXRTaXplIH07CisKKyAgICBhc3NpZ25faW5uZXJ2ZWNfQ29tcGxldGVVbnJvbGxpbmc8RGVyaXZlZDEsIERlcml2ZWQyLCAwLCBhbGlnbmVkU2l6ZT46OnJ1bihkc3QsIHNyYyk7CisgICAgYXNzaWduX0RlZmF1bHRUcmF2ZXJzYWxfQ29tcGxldGVVbnJvbGxpbmc8RGVyaXZlZDEsIERlcml2ZWQyLCBhbGlnbmVkU2l6ZSwgc2l6ZT46OnJ1bihkc3QsIHNyYyk7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNsaWNlIHZlY3Rvcml6YXRpb24gKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgaW50IFZlcnNpb24+CitzdHJ1Y3QgYXNzaWduX2ltcGw8RGVyaXZlZDEsIERlcml2ZWQyLCBTbGljZVZlY3Rvcml6ZWRUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nLCBWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihEZXJpdmVkMSAmZHN0LCBjb25zdCBEZXJpdmVkMiAmc3JjKQorICB7CisgICAgdHlwZWRlZiBwYWNrZXRfdHJhaXRzPHR5cGVuYW1lIERlcml2ZWQxOjpTY2FsYXI+IFBhY2tldFRyYWl0czsKKyAgICBlbnVtIHsKKyAgICAgIHBhY2tldFNpemUgPSBQYWNrZXRUcmFpdHM6OnNpemUsCisgICAgICBhbGlnbmFibGUgPSBQYWNrZXRUcmFpdHM6OkFsaWduZWRPblNjYWxhciwKKyAgICAgIGRzdEFsaWdubWVudCA9IGFsaWduYWJsZSA/IEFsaWduZWQgOiBpbnQoYXNzaWduX3RyYWl0czxEZXJpdmVkMSxEZXJpdmVkMj46OkRzdElzQWxpZ25lZCkgLAorICAgICAgc3JjQWxpZ25tZW50ID0gYXNzaWduX3RyYWl0czxEZXJpdmVkMSxEZXJpdmVkMj46OkpvaW50QWxpZ25tZW50CisgICAgfTsKKyAgICBjb25zdCBJbmRleCBwYWNrZXRBbGlnbmVkTWFzayA9IHBhY2tldFNpemUgLSAxOworICAgIGNvbnN0IEluZGV4IGlubmVyU2l6ZSA9IGRzdC5pbm5lclNpemUoKTsKKyAgICBjb25zdCBJbmRleCBvdXRlclNpemUgPSBkc3Qub3V0ZXJTaXplKCk7CisgICAgY29uc3QgSW5kZXggYWxpZ25lZFN0ZXAgPSBhbGlnbmFibGUgPyAocGFja2V0U2l6ZSAtIGRzdC5vdXRlclN0cmlkZSgpICUgcGFja2V0U2l6ZSkgJiBwYWNrZXRBbGlnbmVkTWFzayA6IDA7CisgICAgSW5kZXggYWxpZ25lZFN0YXJ0ID0gKCghYWxpZ25hYmxlKSB8fCBhc3NpZ25fdHJhaXRzPERlcml2ZWQxLERlcml2ZWQyPjo6RHN0SXNBbGlnbmVkKSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgOiBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZCgmZHN0LmNvZWZmUmVmKDAsMCksIGlubmVyU2l6ZSk7CisKKyAgICBmb3IoSW5kZXggb3V0ZXIgPSAwOyBvdXRlciA8IG91dGVyU2l6ZTsgKytvdXRlcikKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBhbGlnbmVkRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChpbm5lclNpemUtYWxpZ25lZFN0YXJ0KSAmIH5wYWNrZXRBbGlnbmVkTWFzayk7CisgICAgICAvLyBkbyB0aGUgbm9uLXZlY3Rvcml6YWJsZSBwYXJ0IG9mIHRoZSBhc3NpZ25tZW50CisgICAgICBmb3IoSW5kZXggaW5uZXIgPSAwOyBpbm5lcjxhbGlnbmVkU3RhcnQgOyArK2lubmVyKQorICAgICAgICBkc3QuY29weUNvZWZmQnlPdXRlcklubmVyKG91dGVyLCBpbm5lciwgc3JjKTsKKworICAgICAgLy8gZG8gdGhlIHZlY3Rvcml6YWJsZSBwYXJ0IG9mIHRoZSBhc3NpZ25tZW50CisgICAgICBmb3IoSW5kZXggaW5uZXIgPSBhbGlnbmVkU3RhcnQ7IGlubmVyPGFsaWduZWRFbmQ7IGlubmVyKz1wYWNrZXRTaXplKQorICAgICAgICBkc3QudGVtcGxhdGUgY29weVBhY2tldEJ5T3V0ZXJJbm5lcjxEZXJpdmVkMiwgZHN0QWxpZ25tZW50LCBVbmFsaWduZWQ+KG91dGVyLCBpbm5lciwgc3JjKTsKKworICAgICAgLy8gZG8gdGhlIG5vbi12ZWN0b3JpemFibGUgcGFydCBvZiB0aGUgYXNzaWdubWVudAorICAgICAgZm9yKEluZGV4IGlubmVyID0gYWxpZ25lZEVuZDsgaW5uZXI8aW5uZXJTaXplIDsgKytpbm5lcikKKyAgICAgICAgZHN0LmNvcHlDb2VmZkJ5T3V0ZXJJbm5lcihvdXRlciwgaW5uZXIsIHNyYyk7CisKKyAgICAgIGFsaWduZWRTdGFydCA9IHN0ZDo6bWluPEluZGV4PigoYWxpZ25lZFN0YXJ0K2FsaWduZWRTdGVwKSVwYWNrZXRTaXplLCBpbm5lclNpemUpOworICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUGFydCA0IDogaW1wbGVtZW50YXRpb24gb2YgRGVuc2VCYXNlIG1ldGhvZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+CisgIDo6bGF6eUFzc2lnbihjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIGVudW17CisgICAgU2FtZVR5cGUgPSBpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+Ojp2YWx1ZQorICB9OworCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTFZBTFVFKERlcml2ZWQpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9NQVRSSVhfU0laRShEZXJpdmVkLE90aGVyRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChTYW1lVHlwZSxZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKworI2lmZGVmIEVJR0VOX0RFQlVHX0FTU0lHTgorICBpbnRlcm5hbDo6YXNzaWduX3RyYWl0czxEZXJpdmVkLCBPdGhlckRlcml2ZWQ+OjpkZWJ1ZygpOworI2VuZGlmCisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gb3RoZXIucm93cygpICYmIGNvbHMoKSA9PSBvdGhlci5jb2xzKCkpOworICBpbnRlcm5hbDo6YXNzaWduX2ltcGw8RGVyaXZlZCwgT3RoZXJEZXJpdmVkLCBpbnQoU2FtZVR5cGUpID8gaW50KGludGVybmFsOjphc3NpZ25fdHJhaXRzPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OlRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChJbnZhbGlkVHJhdmVyc2FsKT46OnJ1bihkZXJpdmVkKCksb3RoZXIuZGVyaXZlZCgpKTsKKyNpZm5kZWYgRUlHRU5fTk9fREVCVUcKKyAgY2hlY2tUcmFuc3Bvc2VBbGlhc2luZyhvdGhlci5kZXJpdmVkKCkpOworI2VuZGlmCisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZCwKKyAgICAgICAgIGJvb2wgRXZhbEJlZm9yZUFzc2lnbmluZyA9IChpbnQoT3RoZXJEZXJpdmVkOjpGbGFncykgJiBFdmFsQmVmb3JlQXNzaWduaW5nQml0KSAhPSAwLAorICAgICAgICAgYm9vbCBOZWVkVG9UcmFuc3Bvc2UgPSBEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUKKyAgICAgICAgICAgICAgICAmJiBPdGhlckRlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZQorICAgICAgICAgICAgICAgICYmICgoaW50KERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSA9PSAxICYmIGludChPdGhlckRlcml2ZWQ6OkNvbHNBdENvbXBpbGVUaW1lKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgIHwgIC8vIEZJWE1FIHwgaW5zdGVhZCBvZiB8fCB0byBwbGVhc2UgR0NDIDQuNC4wIHN0dXBpZCB3YXJuaW5nICJzdWdnZXN0IHBhcmVudGhlc2VzIGFyb3VuZCAmJiIuCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJ0IHRvIHx8IGFzIHNvb24gYXMgbm90IG5lZWRlZCBhbnltb3JlLgorICAgICAgICAgICAgICAgICAgICAoaW50KERlcml2ZWQ6OkNvbHNBdENvbXBpbGVUaW1lKSA9PSAxICYmIGludChPdGhlckRlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSA9PSAxKSkKKyAgICAgICAgICAgICAgICAmJiBpbnQoRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUpICE9IDE+CitzdHJ1Y3QgYXNzaWduX3NlbGVjdG9yOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgYXNzaWduX3NlbGVjdG9yPERlcml2ZWQsT3RoZXJEZXJpdmVkLGZhbHNlLGZhbHNlPiB7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIHJ1bihEZXJpdmVkJiBkc3QsIGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpIHsgcmV0dXJuIGRzdC5sYXp5QXNzaWduKG90aGVyLmRlcml2ZWQoKSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgYXNzaWduX3NlbGVjdG9yPERlcml2ZWQsT3RoZXJEZXJpdmVkLHRydWUsZmFsc2U+IHsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgcnVuKERlcml2ZWQmIGRzdCwgY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgeyByZXR1cm4gZHN0LmxhenlBc3NpZ24ob3RoZXIuZXZhbCgpKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3N0cnVjdCBhc3NpZ25fc2VsZWN0b3I8RGVyaXZlZCxPdGhlckRlcml2ZWQsZmFsc2UsdHJ1ZT4geworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBydW4oRGVyaXZlZCYgZHN0LCBjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSB7IHJldHVybiBkc3QubGF6eUFzc2lnbihvdGhlci50cmFuc3Bvc2UoKSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgYXNzaWduX3NlbGVjdG9yPERlcml2ZWQsT3RoZXJEZXJpdmVkLHRydWUsdHJ1ZT4geworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBydW4oRGVyaXZlZCYgZHN0LCBjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKSB7IHJldHVybiBkc3QubGF6eUFzc2lnbihvdGhlci50cmFuc3Bvc2UoKS5ldmFsKCkpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcj0oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICByZXR1cm4gaW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvcjxEZXJpdmVkLE90aGVyRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3I9KGNvbnN0IERlbnNlQmFzZSYgb3RoZXIpCit7CisgIHJldHVybiBpbnRlcm5hbDo6YXNzaWduX3NlbGVjdG9yPERlcml2ZWQsRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIE1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlJiBvdGhlcikKK3sKKyAgcmV0dXJuIGludGVybmFsOjphc3NpZ25fc2VsZWN0b3I8RGVyaXZlZCxEZXJpdmVkPjo6cnVuKGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIE1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIHJldHVybiBpbnRlcm5hbDo6YXNzaWduX3NlbGVjdG9yPERlcml2ZWQsT3RoZXJEZXJpdmVkPjo6cnVuKGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIE1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIG90aGVyLmRlcml2ZWQoKS5ldmFsVG8oZGVyaXZlZCgpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3I9KGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIG90aGVyLmV2YWxUbyhkZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0FTU0lHTl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Bc3NpZ25fTUtMLmggYi9FaWdlbi9zcmMvQ29yZS9Bc3NpZ25fTUtMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4YzYzNgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0Fzc2lnbl9NS0wuaApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICBNS0wgVk1MIHN1cHBvcnQgZm9yIGNvZWZmaWNpZW50LXdpc2UgdW5hcnkgRWlnZW4gZXhwcmVzc2lvbnMgbGlrZSBhPWIuc2luKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9BU1NJR05fVk1MX0gKKyNkZWZpbmUgRUlHRU5fQVNTSUdOX1ZNTF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBPcD4gc3RydWN0IHZtbF9jYWxsCit7IGVudW0geyBJc1N1cHBvcnRlZCA9IDAgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBTcmMsIHR5cGVuYW1lIFVuYXJ5T3A+CitjbGFzcyB2bWxfYXNzaWduX3RyYWl0cworeworICBwcml2YXRlOgorICAgIGVudW0geworICAgICAgRHN0SGFzRGlyZWN0QWNjZXNzID0gRHN0OjpGbGFncyAmIERpcmVjdEFjY2Vzc0JpdCwKKyAgICAgIFNyY0hhc0RpcmVjdEFjY2VzcyA9IFNyYzo6RmxhZ3MgJiBEaXJlY3RBY2Nlc3NCaXQsCisKKyAgICAgIFN0b3JhZ2VPcmRlcnNBZ3JlZSA9IChpbnQoRHN0OjpJc1Jvd01ham9yKSA9PSBpbnQoU3JjOjpJc1Jvd01ham9yKSksCisgICAgICBJbm5lclNpemUgPSBpbnQoRHN0OjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpID8gaW50KERzdDo6U2l6ZUF0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgOiBpbnQoRHN0OjpGbGFncykmUm93TWFqb3JCaXQgPyBpbnQoRHN0OjpDb2xzQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgICA6IGludChEc3Q6OlJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICAgIElubmVyTWF4U2l6ZSAgPSBpbnQoRHN0OjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpID8gaW50KERzdDo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgIDogaW50KERzdDo6RmxhZ3MpJlJvd01ham9yQml0ID8gaW50KERzdDo6TWF4Q29sc0F0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgIDogaW50KERzdDo6TWF4Um93c0F0Q29tcGlsZVRpbWUpLAorICAgICAgTWF4U2l6ZUF0Q29tcGlsZVRpbWUgPSBEc3Q6OlNpemVBdENvbXBpbGVUaW1lLAorCisgICAgICBNaWdodEVuYWJsZVZtbCA9ICB2bWxfY2FsbDxVbmFyeU9wPjo6SXNTdXBwb3J0ZWQgJiYgU3RvcmFnZU9yZGVyc0FncmVlICYmIERzdEhhc0RpcmVjdEFjY2VzcyAmJiBTcmNIYXNEaXJlY3RBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICYmIFNyYzo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lPT0xICYmIERzdDo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lPT0xLAorICAgICAgTWlnaHRMaW5lYXJpemUgPSBNaWdodEVuYWJsZVZtbCAmJiAoaW50KERzdDo6RmxhZ3MpICYgaW50KFNyYzo6RmxhZ3MpICYgTGluZWFyQWNjZXNzQml0KSwKKyAgICAgIFZtbFNpemUgPSBNaWdodExpbmVhcml6ZSA/IE1heFNpemVBdENvbXBpbGVUaW1lIDogSW5uZXJNYXhTaXplLAorICAgICAgTGFyZ2VFbm91Z2ggPSBWbWxTaXplPT1EeW5hbWljIHx8IFZtbFNpemU+PUVJR0VOX01LTF9WTUxfVEhSRVNIT0xELAorICAgICAgTWF5RW5hYmxlVm1sID0gTWlnaHRFbmFibGVWbWwgJiYgTGFyZ2VFbm91Z2gsCisgICAgICBNYXlMaW5lYXJpemUgPSBNYXlFbmFibGVWbWwgJiYgTWlnaHRMaW5lYXJpemUKKyAgICB9OworICBwdWJsaWM6CisgICAgZW51bSB7CisgICAgICBUcmF2ZXJzYWwgPSBNYXlMaW5lYXJpemUgPyBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsCisgICAgICAgICAgICAgICAgOiBNYXlFbmFibGVWbWwgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwKKyAgICAgICAgICAgICAgICA6IERlZmF1bHRUcmF2ZXJzYWwKKyAgICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCB0eXBlbmFtZSBVbmFyeU9wLCBpbnQgVHJhdmVyc2FsLCBpbnQgVW5yb2xsaW5nLAorICAgICAgICAgaW50IFZtbFRyYXZlcnNhbCA9IHZtbF9hc3NpZ25fdHJhaXRzPERlcml2ZWQxLCBEZXJpdmVkMiwgVW5hcnlPcD46OlRyYXZlcnNhbCA+CitzdHJ1Y3Qgdm1sX2Fzc2lnbl9pbXBsCisgIDogYXNzaWduX2ltcGw8RGVyaXZlZDEsIEVpZ2VuOjpDd2lzZVVuYXJ5T3A8VW5hcnlPcCwgRGVyaXZlZDI+LFRyYXZlcnNhbCxVbnJvbGxpbmcsQnVpbHRJbj4KK3sKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgdHlwZW5hbWUgVW5hcnlPcCwgaW50IFRyYXZlcnNhbCwgaW50IFVucm9sbGluZz4KK3N0cnVjdCB2bWxfYXNzaWduX2ltcGw8RGVyaXZlZDEsIERlcml2ZWQyLCBVbmFyeU9wLCBUcmF2ZXJzYWwsIFVucm9sbGluZywgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihEZXJpdmVkMSYgZHN0LCBjb25zdCBDd2lzZVVuYXJ5T3A8VW5hcnlPcCwgRGVyaXZlZDI+JiBzcmMpCisgIHsKKyAgICAvLyBpbiBjYXNlIHdlIHdhbnQgdG8gKG9yIGhhdmUgdG8pIHNraXAgVk1MIGF0IHJ1bnRpbWUgd2UgY2FuIGNhbGw6CisgICAgLy8gYXNzaWduX2ltcGw8RGVyaXZlZDEsRWlnZW46OkN3aXNlVW5hcnlPcDxVbmFyeU9wLCBEZXJpdmVkMj4sVHJhdmVyc2FsLFVucm9sbGluZyxCdWlsdEluPjo6cnVuKGRzdCxzcmMpOworICAgIGNvbnN0IEluZGV4IGlubmVyU2l6ZSA9IGRzdC5pbm5lclNpemUoKTsKKyAgICBjb25zdCBJbmRleCBvdXRlclNpemUgPSBkc3Qub3V0ZXJTaXplKCk7CisgICAgZm9yKEluZGV4IG91dGVyID0gMDsgb3V0ZXIgPCBvdXRlclNpemU7ICsrb3V0ZXIpIHsKKyAgICAgIGNvbnN0IFNjYWxhciAqc3JjX3B0ciA9IHNyYy5Jc1Jvd01ham9yID8gICYoc3JjLm5lc3RlZEV4cHJlc3Npb24oKS5jb2VmZlJlZihvdXRlciwwKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzcmMubmVzdGVkRXhwcmVzc2lvbigpLmNvZWZmUmVmKDAsIG91dGVyKSk7CisgICAgICBTY2FsYXIgKmRzdF9wdHIgPSBkc3QuSXNSb3dNYWpvciA/ICYoZHN0LmNvZWZmUmVmKG91dGVyLDApKSA6ICYoZHN0LmNvZWZmUmVmKDAsIG91dGVyKSk7CisgICAgICB2bWxfY2FsbDxVbmFyeU9wPjo6cnVuKHNyYy5mdW5jdG9yKCksIGlubmVyU2l6ZSwgc3JjX3B0ciwgZHN0X3B0ciApOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCB0eXBlbmFtZSBVbmFyeU9wLCBpbnQgVHJhdmVyc2FsLCBpbnQgVW5yb2xsaW5nPgorc3RydWN0IHZtbF9hc3NpZ25faW1wbDxEZXJpdmVkMSwgRGVyaXZlZDIsIFVuYXJ5T3AsIFRyYXZlcnNhbCwgVW5yb2xsaW5nLCBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsPgoreworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKERlcml2ZWQxJiBkc3QsIGNvbnN0IEN3aXNlVW5hcnlPcDxVbmFyeU9wLCBEZXJpdmVkMj4mIHNyYykKKyAgeworICAgIC8vIGluIGNhc2Ugd2Ugd2FudCB0byAob3IgaGF2ZSB0bykgc2tpcCBWTUwgYXQgcnVudGltZSB3ZSBjYW4gY2FsbDoKKyAgICAvLyBhc3NpZ25faW1wbDxEZXJpdmVkMSxFaWdlbjo6Q3dpc2VVbmFyeU9wPFVuYXJ5T3AsIERlcml2ZWQyPixUcmF2ZXJzYWwsVW5yb2xsaW5nLEJ1aWx0SW4+OjpydW4oZHN0LHNyYyk7CisgICAgdm1sX2NhbGw8VW5hcnlPcD46OnJ1bihzcmMuZnVuY3RvcigpLCBkc3Quc2l6ZSgpLCBzcmMubmVzdGVkRXhwcmVzc2lvbigpLmRhdGEoKSwgZHN0LmRhdGEoKSApOworICB9Cit9OworCisvLyBNYWNyb3NlcworCisjZGVmaW5lIEVJR0VOX01LTF9WTUxfU1BFQ0lBTElaRV9BU1NJR04oVFJBVkVSU0FMLFVOUk9MTElORykgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDIsIHR5cGVuYW1lIFVuYXJ5T3A+IFwKKyAgc3RydWN0IGFzc2lnbl9pbXBsPERlcml2ZWQxLCBFaWdlbjo6Q3dpc2VVbmFyeU9wPFVuYXJ5T3AsIERlcml2ZWQyPiwgVFJBVkVSU0FMLCBVTlJPTExJTkcsIFNwZWNpYWxpemVkPiAgeyAgXAorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRWlnZW46OkN3aXNlVW5hcnlPcDxVbmFyeU9wLCBEZXJpdmVkMj4gJnNyYykgeyBcCisgICAgICB2bWxfYXNzaWduX2ltcGw8RGVyaXZlZDEsRGVyaXZlZDIsVW5hcnlPcCxUUkFWRVJTQUwsVU5ST0xMSU5HPjo6cnVuKGRzdCwgc3JjKTsgXAorICAgIH0gXAorICB9OworCitFSUdFTl9NS0xfVk1MX1NQRUNJQUxJWkVfQVNTSUdOKERlZmF1bHRUcmF2ZXJzYWwsTm9VbnJvbGxpbmcpCitFSUdFTl9NS0xfVk1MX1NQRUNJQUxJWkVfQVNTSUdOKERlZmF1bHRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpCitFSUdFTl9NS0xfVk1MX1NQRUNJQUxJWkVfQVNTSUdOKERlZmF1bHRUcmF2ZXJzYWwsSW5uZXJVbnJvbGxpbmcpCitFSUdFTl9NS0xfVk1MX1NQRUNJQUxJWkVfQVNTSUdOKExpbmVhclRyYXZlcnNhbCxOb1Vucm9sbGluZykKK0VJR0VOX01LTF9WTUxfU1BFQ0lBTElaRV9BU1NJR04oTGluZWFyVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKQorRUlHRU5fTUtMX1ZNTF9TUEVDSUFMSVpFX0FTU0lHTihJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsTm9VbnJvbGxpbmcpCitFSUdFTl9NS0xfVk1MX1NQRUNJQUxJWkVfQVNTSUdOKElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykKK0VJR0VOX01LTF9WTUxfU1BFQ0lBTElaRV9BU1NJR04oSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLElubmVyVW5yb2xsaW5nKQorRUlHRU5fTUtMX1ZNTF9TUEVDSUFMSVpFX0FTU0lHTihMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKQorRUlHRU5fTUtMX1ZNTF9TUEVDSUFMSVpFX0FTU0lHTihMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLE5vVW5yb2xsaW5nKQorRUlHRU5fTUtMX1ZNTF9TUEVDSUFMSVpFX0FTU0lHTihTbGljZVZlY3Rvcml6ZWRUcmF2ZXJzYWwsTm9VbnJvbGxpbmcpCisKKworI2lmICFkZWZpbmVkIChFSUdFTl9GQVNUX01BVEgpIHx8IChFSUdFTl9GQVNUX01BVEggIT0gMSkKKyNkZWZpbmUgIEVJR0VOX01LTF9WTUxfTU9ERSBWTUxfSEEKKyNlbHNlCisjZGVmaW5lICBFSUdFTl9NS0xfVk1MX01PREUgVk1MX0xBCisjZW5kaWYKKworI2RlZmluZSBFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTChFSUdFTk9QLCBWTUxPUCwgRUlHRU5UWVBFLCBWTUxUWVBFKSAgICAgXAorICB0ZW1wbGF0ZTw+IHN0cnVjdCB2bWxfY2FsbDwgc2NhbGFyXyMjRUlHRU5PUCMjX29wPEVJR0VOVFlQRT4gPiB7ICAgICAgICAgICAgICAgXAorICAgIGVudW0geyBJc1N1cHBvcnRlZCA9IDEgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oIGNvbnN0IHNjYWxhcl8jI0VJR0VOT1AjI19vcDxFSUdFTlRZUEU+JiAvKmZ1bmMqLywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgY29uc3QgRUlHRU5UWVBFKiBzcmMsIEVJR0VOVFlQRSogZHN0KSB7ICAgIFwKKyAgICAgIFZNTE9QKHNpemUsIChjb25zdCBWTUxUWVBFKilzcmMsIChWTUxUWVBFKilkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2RlZmluZSBFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTF9MQShFSUdFTk9QLCBWTUxPUCwgRUlHRU5UWVBFLCBWTUxUWVBFKSAgXAorICB0ZW1wbGF0ZTw+IHN0cnVjdCB2bWxfY2FsbDwgc2NhbGFyXyMjRUlHRU5PUCMjX29wPEVJR0VOVFlQRT4gPiB7ICAgICAgICAgICAgICAgXAorICAgIGVudW0geyBJc1N1cHBvcnRlZCA9IDEgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oIGNvbnN0IHNjYWxhcl8jI0VJR0VOT1AjI19vcDxFSUdFTlRZUEU+JiAvKmZ1bmMqLywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgY29uc3QgRUlHRU5UWVBFKiBzcmMsIEVJR0VOVFlQRSogZHN0KSB7ICAgIFwKKyAgICAgIE1LTF9JTlQ2NCB2bWxNb2RlID0gRUlHRU5fTUtMX1ZNTF9NT0RFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFZNTE9QKHNpemUsIChjb25zdCBWTUxUWVBFKilzcmMsIChWTUxUWVBFKilkc3QsIHZtbE1vZGUpOyAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2RlZmluZSBFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfUE9XX0NBTEwoRUlHRU5PUCwgVk1MT1AsIEVJR0VOVFlQRSwgVk1MVFlQRSkgICAgICAgXAorICB0ZW1wbGF0ZTw+IHN0cnVjdCB2bWxfY2FsbDwgc2NhbGFyXyMjRUlHRU5PUCMjX29wPEVJR0VOVFlQRT4gPiB7ICAgICAgICAgICAgICAgXAorICAgIGVudW0geyBJc1N1cHBvcnRlZCA9IDEgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oIGNvbnN0IHNjYWxhcl8jI0VJR0VOT1AjI19vcDxFSUdFTlRZUEU+JiBmdW5jLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgY29uc3QgRUlHRU5UWVBFKiBzcmMsIEVJR0VOVFlQRSogZHN0KSB7ICAgICAgXAorICAgICAgRUlHRU5UWVBFIGV4cG9uZW50ID0gZnVuYy5tX2V4cG9uZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTUtMX0lOVDY0IHZtbE1vZGUgPSBFSUdFTl9NS0xfVk1MX01PREU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVk1MT1AoJnNpemUsIChjb25zdCBWTUxUWVBFKilzcmMsIChjb25zdCBWTUxUWVBFKikmZXhwb25lbnQsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKFZNTFRZUEUqKWRzdCwgJnZtbE1vZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZGVmaW5lIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19SRUFMKEVJR0VOT1AsIFZNTE9QKSAgICAgICAgICAgICAgICAgICBcCisgIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMKEVJR0VOT1AsIHZzIyNWTUxPUCwgZmxvYXQsIGZsb2F0KSAgICAgICAgICAgICBcCisgIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMKEVJR0VOT1AsIHZkIyNWTUxPUCwgZG91YmxlLCBkb3VibGUpCisKKyNkZWZpbmUgRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTX0NPTVBMRVgoRUlHRU5PUCwgVk1MT1ApICAgICAgICAgICAgICAgIFwKKyAgRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTEwoRUlHRU5PUCwgdmMjI1ZNTE9QLCBzY29tcGxleCwgTUtMX0NvbXBsZXg4KSAgIFwKKyAgRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTEwoRUlHRU5PUCwgdnojI1ZNTE9QLCBkY29tcGxleCwgTUtMX0NvbXBsZXgxNikKKworI2RlZmluZSBFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFMoRUlHRU5PUCwgVk1MT1ApICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFNfUkVBTChFSUdFTk9QLCBWTUxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFNfQ09NUExFWChFSUdFTk9QLCBWTUxPUCkKKworCisjZGVmaW5lIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19SRUFMX0xBKEVJR0VOT1AsIFZNTE9QKSAgICAgICAgICAgICAgICBcCisgIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMX0xBKEVJR0VOT1AsIHZtcyMjVk1MT1AsIGZsb2F0LCBmbG9hdCkgICAgICAgICBcCisgIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMX0xBKEVJR0VOT1AsIHZtZCMjVk1MT1AsIGRvdWJsZSwgZG91YmxlKQorCisjZGVmaW5lIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19DT01QTEVYX0xBKEVJR0VOT1AsIFZNTE9QKSAgICAgICAgICAgICBcCisgIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMX0xBKEVJR0VOT1AsIHZtYyMjVk1MT1AsIHNjb21wbGV4LCBNS0xfQ29tcGxleDgpICBcCisgIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMX0xBKEVJR0VOT1AsIHZteiMjVk1MT1AsIGRjb21wbGV4LCBNS0xfQ29tcGxleDE2KQorCisjZGVmaW5lIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19MQShFSUdFTk9QLCBWTUxPUCkgICAgICAgICAgICAgICAgICAgICBcCisgIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19SRUFMX0xBKEVJR0VOT1AsIFZNTE9QKSAgICAgICAgICAgICAgICAgICAgICBcCisgIEVJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19DT01QTEVYX0xBKEVJR0VOT1AsIFZNTE9QKQorCisKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19MQShzaW4sICBTaW4pCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFNfTEEoYXNpbiwgQXNpbikKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19MQShjb3MsICBDb3MpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFNfTEEoYWNvcywgQWNvcykKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19MQSh0YW4sICBUYW4pCisvL0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMUyhhYnMsICBBYnMpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfVU5BUllfQ0FMTFNfTEEoZXhwLCAgRXhwKQorRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTX0xBKGxvZywgIExuKQorRUlHRU5fTUtMX1ZNTF9ERUNMQVJFX1VOQVJZX0NBTExTX0xBKHNxcnQsIFNxcnQpCisKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9VTkFSWV9DQUxMU19SRUFMKHNxdWFyZSwgU3FyKQorCisvLyBUaGUgdm0qcG93eCBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpYmFsZSBpbiB0aGUgd2luZG93cyB2ZXJzaW9uIG9mIE1LTC4KKyNpZmRlZiBfV0lOMzIKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9QT1dfQ0FMTChwb3csIHZtc3Bvd3hfLCBmbG9hdCwgZmxvYXQpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfUE9XX0NBTEwocG93LCB2bWRwb3d4XywgZG91YmxlLCBkb3VibGUpCitFSUdFTl9NS0xfVk1MX0RFQ0xBUkVfUE9XX0NBTEwocG93LCB2bWNwb3d4Xywgc2NvbXBsZXgsIE1LTF9Db21wbGV4OCkKK0VJR0VOX01LTF9WTUxfREVDTEFSRV9QT1dfQ0FMTChwb3csIHZtenBvd3hfLCBkY29tcGxleCwgTUtMX0NvbXBsZXgxNikKKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9BU1NJR05fVk1MX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0JhbmRNYXRyaXguaCBiL0VpZ2VuL3NyYy9Db3JlL0JhbmRNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQ3ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQmFuZE1hdHJpeC5oCkBAIC0wLDAgKzEsMzM0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQkFORE1BVFJJWF9ICisjZGVmaW5lIEVJR0VOX0JBTkRNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIEJhbmRNYXRyaXhCYXNlIDogcHVibGljIEVpZ2VuQmFzZTxEZXJpdmVkPgoreworICBwdWJsaWM6CisKKyAgICBlbnVtIHsKKyAgICAgIEZsYWdzID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MsCisgICAgICBDb2VmZlJlYWRDb3N0ID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29lZmZSZWFkQ29zdCwKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBTdXBlcnMgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdXBlcnMsCisgICAgICBTdWJzICAgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdWJzLAorICAgICAgT3B0aW9ucyA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok9wdGlvbnMKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsUm93c0F0Q29tcGlsZVRpbWUsQ29sc0F0Q29tcGlsZVRpbWU+IERlbnNlTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlbnNlTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2VmZmljaWVudHNUeXBlIENvZWZmaWNpZW50c1R5cGU7CisgICAgdHlwZWRlZiBFaWdlbkJhc2U8RGVyaXZlZD4gQmFzZTsKKworICBwcm90ZWN0ZWQ6CisgICAgZW51bSB7CisgICAgICBEYXRhUm93c0F0Q29tcGlsZVRpbWUgPSAoKFN1cGVycyE9RHluYW1pYykgJiYgKFN1YnMhPUR5bmFtaWMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMSArIFN1cGVycyArIFN1YnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IER5bmFtaWMsCisgICAgICBTaXplQXRDb21waWxlVGltZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDKFJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lKQorICAgIH07CisKKyAgcHVibGljOgorICAgIAorICAgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7CisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VwZXIgZGlhZ29uYWxzICovCisgICAgaW5saW5lIEluZGV4IHN1cGVycygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5zdXBlcnMoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViIGRpYWdvbmFscyAqLworICAgIGlubGluZSBJbmRleCBzdWJzKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLnN1YnMoKTsgfQorICAgIAorICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSB1bmRlcmx5aW5nIGNvZWZmaWNpZW50IG1hdHJpeCAqLworICAgIGlubGluZSBjb25zdCBDb2VmZmljaWVudHNUeXBlJiBjb2VmZnMoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkuY29lZmZzKCk7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgdW5kZXJseWluZyBjb2VmZmljaWVudCBtYXRyaXggKi8KKyAgICBpbmxpbmUgQ29lZmZpY2llbnRzVHlwZSYgY29lZmZzKCkgeyByZXR1cm4gZGVyaXZlZCgpLmNvZWZmcygpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgXGEgaSAtdGggY29sdW1uLAorICAgICAgKiBvbmx5IHRoZSBtZWFuaW5nZnVsIHBhcnQgaXMgcmV0dXJuZWQuCisgICAgICAqIFx3YXJuaW5nIHRoZSBpbnRlcm5hbCBzdG9yYWdlIG11c3QgYmUgY29sdW1uIG1ham9yLiAqLworICAgIGlubGluZSBCbG9jazxDb2VmZmljaWVudHNUeXBlLER5bmFtaWMsMT4gY29sKEluZGV4IGkpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoT3B0aW9ucyZSb3dNYWpvcik9PTAsVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfQ09MVU1OX01BSk9SX01BVFJJQ0VTKTsKKyAgICAgIEluZGV4IHN0YXJ0ID0gMDsKKyAgICAgIEluZGV4IGxlbiA9IGNvZWZmcygpLnJvd3MoKTsKKyAgICAgIGlmIChpPD1zdXBlcnMoKSkKKyAgICAgIHsKKyAgICAgICAgc3RhcnQgPSBzdXBlcnMoKS1pOworICAgICAgICBsZW4gPSAoc3RkOjptaW4pKHJvd3MoKSxzdGQ6Om1heDxJbmRleD4oMCxjb2VmZnMoKS5yb3dzKCkgLSAoc3VwZXJzKCktaSkpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGk+PXJvd3MoKS1zdWJzKCkpCisgICAgICAgIGxlbiA9IHN0ZDo6bWF4PEluZGV4PigwLGNvZWZmcygpLnJvd3MoKSAtIChpICsgMSAtIHJvd3MoKSArIHN1YnMoKSkpOworICAgICAgcmV0dXJuIEJsb2NrPENvZWZmaWNpZW50c1R5cGUsRHluYW1pYywxPihjb2VmZnMoKSwgc3RhcnQsIGksIGxlbiwgMSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIG1haW4gZGlhZ29uYWwgKi8KKyAgICBpbmxpbmUgQmxvY2s8Q29lZmZpY2llbnRzVHlwZSwxLFNpemVBdENvbXBpbGVUaW1lPiBkaWFnb25hbCgpCisgICAgeyByZXR1cm4gQmxvY2s8Q29lZmZpY2llbnRzVHlwZSwxLFNpemVBdENvbXBpbGVUaW1lPihjb2VmZnMoKSxzdXBlcnMoKSwwLDEsKHN0ZDo6bWluKShyb3dzKCksY29scygpKSk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBtYWluIGRpYWdvbmFsIChjb25zdCB2ZXJzaW9uKSAqLworICAgIGlubGluZSBjb25zdCBCbG9jazxjb25zdCBDb2VmZmljaWVudHNUeXBlLDEsU2l6ZUF0Q29tcGlsZVRpbWU+IGRpYWdvbmFsKCkgY29uc3QKKyAgICB7IHJldHVybiBCbG9jazxjb25zdCBDb2VmZmljaWVudHNUeXBlLDEsU2l6ZUF0Q29tcGlsZVRpbWU+KGNvZWZmcygpLHN1cGVycygpLDAsMSwoc3RkOjptaW4pKHJvd3MoKSxjb2xzKCkpKTsgfQorCisgICAgdGVtcGxhdGU8aW50IEluZGV4PiBzdHJ1Y3QgRGlhZ29uYWxJbnRSZXR1cm5UeXBlIHsKKyAgICAgIGVudW0geworICAgICAgICBSZXR1cm5PcHBvc2l0ZSA9IChPcHRpb25zJlNlbGZBZGpvaW50KSAmJiAoKChJbmRleCk+MCAmJiBTdXBlcnM9PTApIHx8ICgoSW5kZXgpPDAgJiYgU3Vicz09MCkpLAorICAgICAgICBDb25qdWdhdGUgPSBSZXR1cm5PcHBvc2l0ZSAmJiBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgICAgICBBY3R1YWxJbmRleCA9IFJldHVybk9wcG9zaXRlID8gLUluZGV4IDogSW5kZXgsCisgICAgICAgIERpYWdvbmFsU2l6ZSA9IChSb3dzQXRDb21waWxlVGltZT09RHluYW1pYyB8fCBDb2xzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgICAgICAgICAgICAgICAgICAgID8gRHluYW1pYworICAgICAgICAgICAgICAgICAgICAgOiAoQWN0dWFsSW5kZXg8MAorICAgICAgICAgICAgICAgICAgICAgPyBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQyhDb2xzQXRDb21waWxlVGltZSwgUm93c0F0Q29tcGlsZVRpbWUgKyBBY3R1YWxJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgIDogRUlHRU5fU0laRV9NSU5fUFJFRkVSX0RZTkFNSUMoUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lIC0gQWN0dWFsSW5kZXgpKQorICAgICAgfTsKKyAgICAgIHR5cGVkZWYgQmxvY2s8Q29lZmZpY2llbnRzVHlwZSwxLCBEaWFnb25hbFNpemU+IEJ1aWxkVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPENvbmp1Z2F0ZSwKKyAgICAgICAgICAgICAgICAgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uanVnYXRlX29wPFNjYWxhcj4sQnVpbGRUeXBlID4sCisgICAgICAgICAgICAgICAgIEJ1aWxkVHlwZT46OnR5cGUgVHlwZTsKKyAgICB9OworCisgICAgLyoqIFxyZXR1cm5zIGEgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIFxhIE4gLXRoIHN1YiBvciBzdXBlciBkaWFnb25hbCAqLworICAgIHRlbXBsYXRlPGludCBOPiBpbmxpbmUgdHlwZW5hbWUgRGlhZ29uYWxJbnRSZXR1cm5UeXBlPE4+OjpUeXBlIGRpYWdvbmFsKCkKKyAgICB7CisgICAgICByZXR1cm4gdHlwZW5hbWUgRGlhZ29uYWxJbnRSZXR1cm5UeXBlPE4+OjpCdWlsZFR5cGUoY29lZmZzKCksIHN1cGVycygpLU4sIChzdGQ6Om1heCkoMCxOKSwgMSwgZGlhZ29uYWxMZW5ndGgoTikpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBcYSBOIC10aCBzdWIgb3Igc3VwZXIgZGlhZ29uYWwgKi8KKyAgICB0ZW1wbGF0ZTxpbnQgTj4gaW5saW5lIGNvbnN0IHR5cGVuYW1lIERpYWdvbmFsSW50UmV0dXJuVHlwZTxOPjo6VHlwZSBkaWFnb25hbCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIHR5cGVuYW1lIERpYWdvbmFsSW50UmV0dXJuVHlwZTxOPjo6QnVpbGRUeXBlKGNvZWZmcygpLCBzdXBlcnMoKS1OLCAoc3RkOjptYXgpKDAsTiksIDEsIGRpYWdvbmFsTGVuZ3RoKE4pKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgXGEgaSAtdGggc3ViIG9yIHN1cGVyIGRpYWdvbmFsICovCisgICAgaW5saW5lIEJsb2NrPENvZWZmaWNpZW50c1R5cGUsMSxEeW5hbWljPiBkaWFnb25hbChJbmRleCBpKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCgoaTwwICYmIC1pPD1zdWJzKCkpIHx8IChpPj0wICYmIGk8PXN1cGVycygpKSk7CisgICAgICByZXR1cm4gQmxvY2s8Q29lZmZpY2llbnRzVHlwZSwxLER5bmFtaWM+KGNvZWZmcygpLCBzdXBlcnMoKS1pLCBzdGQ6Om1heDxJbmRleD4oMCxpKSwgMSwgZGlhZ29uYWxMZW5ndGgoaSkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBcYSBpIC10aCBzdWIgb3Igc3VwZXIgZGlhZ29uYWwgKi8KKyAgICBpbmxpbmUgY29uc3QgQmxvY2s8Y29uc3QgQ29lZmZpY2llbnRzVHlwZSwxLER5bmFtaWM+IGRpYWdvbmFsKEluZGV4IGkpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KChpPDAgJiYgLWk8PXN1YnMoKSkgfHwgKGk+PTAgJiYgaTw9c3VwZXJzKCkpKTsKKyAgICAgIHJldHVybiBCbG9jazxjb25zdCBDb2VmZmljaWVudHNUeXBlLDEsRHluYW1pYz4oY29lZmZzKCksIHN1cGVycygpLWksIHN0ZDo6bWF4PEluZGV4PigwLGkpLCAxLCBkaWFnb25hbExlbmd0aChpKSk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgICAgeworICAgICAgZHN0LnJlc2l6ZShyb3dzKCksY29scygpKTsKKyAgICAgIGRzdC5zZXRaZXJvKCk7CisgICAgICBkc3QuZGlhZ29uYWwoKSA9IGRpYWdvbmFsKCk7CisgICAgICBmb3IgKEluZGV4IGk9MTsgaTw9c3VwZXJzKCk7KytpKQorICAgICAgICBkc3QuZGlhZ29uYWwoaSkgPSBkaWFnb25hbChpKTsKKyAgICAgIGZvciAoSW5kZXggaT0xOyBpPD1zdWJzKCk7KytpKQorICAgICAgICBkc3QuZGlhZ29uYWwoLWkpID0gZGlhZ29uYWwoLWkpOworICAgIH0KKworICAgIERlbnNlTWF0cml4VHlwZSB0b0RlbnNlTWF0cml4KCkgY29uc3QKKyAgICB7CisgICAgICBEZW5zZU1hdHJpeFR5cGUgcmVzKHJvd3MoKSxjb2xzKCkpOworICAgICAgZXZhbFRvKHJlcyk7CisgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICBpbmxpbmUgSW5kZXggZGlhZ29uYWxMZW5ndGgoSW5kZXggaSkgY29uc3QKKyAgICB7IHJldHVybiBpPDAgPyAoc3RkOjptaW4pKGNvbHMoKSxyb3dzKCkraSkgOiAoc3RkOjptaW4pKHJvd3MoKSxjb2xzKCktaSk7IH0KK307CisKKy8qKgorICAqIFxjbGFzcyBCYW5kTWF0cml4CisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBSZXByZXNlbnRzIGEgcmVjdGFuZ3VsYXIgbWF0cml4IHdpdGggYSBiYW5kZWQgc3RvcmFnZQorICAqCisgICogXHBhcmFtIF9TY2FsYXIgTnVtZXJpYyB0eXBlLCBpLmUuIGZsb2F0LCBkb3VibGUsIGludAorICAqIFxwYXJhbSBSb3dzIE51bWJlciBvZiByb3dzLCBvciBcYiBEeW5hbWljCisgICogXHBhcmFtIENvbHMgTnVtYmVyIG9mIGNvbHVtbnMsIG9yIFxiIER5bmFtaWMKKyAgKiBccGFyYW0gU3VwZXJzIE51bWJlciBvZiBzdXBlciBkaWFnb25hbAorICAqIFxwYXJhbSBTdWJzIE51bWJlciBvZiBzdWIgZGlhZ29uYWwKKyAgKiBccGFyYW0gX09wdGlvbnMgQSBjb21iaW5hdGlvbiBvZiBlaXRoZXIgXGIgI1Jvd01ham9yIG9yIFxiICNDb2xNYWpvciwgYW5kIG9mIFxiICNTZWxmQWRqb2ludAorICAqICAgICAgICAgICAgICAgICBUaGUgZm9ybWVyIGNvbnRyb2xzIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzICJzdG9yYWdlIG9yZGVyIiwgYW5kIGRlZmF1bHRzIHRvCisgICogICAgICAgICAgICAgICAgIGNvbHVtbi1tYWpvci4gVGhlIGxhdHRlciBjb250cm9scyB3aGV0aGVyIHRoZSBtYXRyaXggcmVwcmVzZW50cyBhIHNlbGZhZGpvaW50IAorICAqICAgICAgICAgICAgICAgICBtYXRyaXggaW4gd2hpY2ggY2FzZSBlaXRoZXIgU3VwZXJzIG9mIFN1YnMgaGF2ZSB0byBiZSBudWxsLgorICAqCisgICogXHNhIGNsYXNzIFRyaWRpYWdvbmFsTWF0cml4CisgICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX1N1cGVycywgaW50IF9TdWJzLCBpbnQgX09wdGlvbnM+CitzdHJ1Y3QgdHJhaXRzPEJhbmRNYXRyaXg8X1NjYWxhcixfUm93cyxfQ29scyxfU3VwZXJzLF9TdWJzLF9PcHRpb25zPiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgRGVuc2UgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKyAgZW51bSB7CisgICAgQ29lZmZSZWFkQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpSZWFkQ29zdCwKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IF9Sb3dzLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gX0NvbHMsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBfUm93cywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IF9Db2xzLAorICAgIEZsYWdzID0gTHZhbHVlQml0LAorICAgIFN1cGVycyA9IF9TdXBlcnMsCisgICAgU3VicyA9IF9TdWJzLAorICAgIE9wdGlvbnMgPSBfT3B0aW9ucywKKyAgICBEYXRhUm93c0F0Q29tcGlsZVRpbWUgPSAoKFN1cGVycyE9RHluYW1pYykgJiYgKFN1YnMhPUR5bmFtaWMpKSA/IDEgKyBTdXBlcnMgKyBTdWJzIDogRHluYW1pYworICB9OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGF0YVJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lLE9wdGlvbnMmUm93TWFqb3I/Um93TWFqb3I6Q29sTWFqb3I+IENvZWZmaWNpZW50c1R5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgUm93cywgaW50IENvbHMsIGludCBTdXBlcnMsIGludCBTdWJzLCBpbnQgT3B0aW9ucz4KK2NsYXNzIEJhbmRNYXRyaXggOiBwdWJsaWMgQmFuZE1hdHJpeEJhc2U8QmFuZE1hdHJpeDxfU2NhbGFyLFJvd3MsQ29scyxTdXBlcnMsU3VicyxPcHRpb25zPiA+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxCYW5kTWF0cml4Pjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QmFuZE1hdHJpeD46OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxCYW5kTWF0cml4Pjo6Q29lZmZpY2llbnRzVHlwZSBDb2VmZmljaWVudHNUeXBlOworCisgICAgaW5saW5lIEJhbmRNYXRyaXgoSW5kZXggcm93cz1Sb3dzLCBJbmRleCBjb2xzPUNvbHMsIEluZGV4IHN1cGVycz1TdXBlcnMsIEluZGV4IHN1YnM9U3VicykKKyAgICAgIDogbV9jb2VmZnMoMStzdXBlcnMrc3Vicyxjb2xzKSwKKyAgICAgICAgbV9yb3dzKHJvd3MpLCBtX3N1cGVycyhzdXBlcnMpLCBtX3N1YnMoc3VicykKKyAgICB7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyAqLworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9yb3dzLnZhbHVlKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgKi8KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzLmNvbHMoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VwZXIgZGlhZ29uYWxzICovCisgICAgaW5saW5lIEluZGV4IHN1cGVycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VwZXJzLnZhbHVlKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1YiBkaWFnb25hbHMgKi8KKyAgICBpbmxpbmUgSW5kZXggc3VicygpIGNvbnN0IHsgcmV0dXJuIG1fc3Vicy52YWx1ZSgpOyB9CisKKyAgICBpbmxpbmUgY29uc3QgQ29lZmZpY2llbnRzVHlwZSYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7IH0KKyAgICBpbmxpbmUgQ29lZmZpY2llbnRzVHlwZSYgY29lZmZzKCkgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICBDb2VmZmljaWVudHNUeXBlIG1fY29lZmZzOworICAgIGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBSb3dzPiAgIG1fcm93czsKKyAgICBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgU3VwZXJzPiBtX3N1cGVyczsKKyAgICBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgU3Vicz4gICBtX3N1YnM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29lZmZpY2llbnRzVHlwZSxpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9TdXBlcnMsIGludCBfU3VicyxpbnQgX09wdGlvbnM+CitjbGFzcyBCYW5kTWF0cml4V3JhcHBlcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0NvZWZmaWNpZW50c1R5cGUsaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfU3VwZXJzLCBpbnQgX1N1YnMsaW50IF9PcHRpb25zPgorc3RydWN0IHRyYWl0czxCYW5kTWF0cml4V3JhcHBlcjxfQ29lZmZpY2llbnRzVHlwZSxfUm93cyxfQ29scyxfU3VwZXJzLF9TdWJzLF9PcHRpb25zPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvZWZmaWNpZW50c1R5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0NvZWZmaWNpZW50c1R5cGU6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIF9Db2VmZmljaWVudHNUeXBlOjpJbmRleCBJbmRleDsKKyAgZW51bSB7CisgICAgQ29lZmZSZWFkQ29zdCA9IGludGVybmFsOjp0cmFpdHM8X0NvZWZmaWNpZW50c1R5cGU+OjpDb2VmZlJlYWRDb3N0LAorICAgIFJvd3NBdENvbXBpbGVUaW1lID0gX1Jvd3MsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBfQ29scywKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IF9Sb3dzLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gX0NvbHMsCisgICAgRmxhZ3MgPSBMdmFsdWVCaXQsCisgICAgU3VwZXJzID0gX1N1cGVycywKKyAgICBTdWJzID0gX1N1YnMsCisgICAgT3B0aW9ucyA9IF9PcHRpb25zLAorICAgIERhdGFSb3dzQXRDb21waWxlVGltZSA9ICgoU3VwZXJzIT1EeW5hbWljKSAmJiAoU3VicyE9RHluYW1pYykpID8gMSArIFN1cGVycyArIFN1YnMgOiBEeW5hbWljCisgIH07CisgIHR5cGVkZWYgX0NvZWZmaWNpZW50c1R5cGUgQ29lZmZpY2llbnRzVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9Db2VmZmljaWVudHNUeXBlLGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX1N1cGVycywgaW50IF9TdWJzLGludCBfT3B0aW9ucz4KK2NsYXNzIEJhbmRNYXRyaXhXcmFwcGVyIDogcHVibGljIEJhbmRNYXRyaXhCYXNlPEJhbmRNYXRyaXhXcmFwcGVyPF9Db2VmZmljaWVudHNUeXBlLF9Sb3dzLF9Db2xzLF9TdXBlcnMsX1N1YnMsX09wdGlvbnM+ID4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEJhbmRNYXRyaXhXcmFwcGVyPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8QmFuZE1hdHJpeFdyYXBwZXI+OjpDb2VmZmljaWVudHNUeXBlIENvZWZmaWNpZW50c1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEJhbmRNYXRyaXhXcmFwcGVyPjo6SW5kZXggSW5kZXg7CisKKyAgICBpbmxpbmUgQmFuZE1hdHJpeFdyYXBwZXIoY29uc3QgQ29lZmZpY2llbnRzVHlwZSYgY29lZmZzLCBJbmRleCByb3dzPV9Sb3dzLCBJbmRleCBjb2xzPV9Db2xzLCBJbmRleCBzdXBlcnM9X1N1cGVycywgSW5kZXggc3Vicz1fU3VicykKKyAgICAgIDogbV9jb2VmZnMoY29lZmZzKSwKKyAgICAgICAgbV9yb3dzKHJvd3MpLCBtX3N1cGVycyhzdXBlcnMpLCBtX3N1YnMoc3VicykKKyAgICB7CisgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoY29scyk7CisgICAgICAvL2ludGVybmFsOjphc3NlcnQoY29lZmZzLmNvbHMoKT09Y29scygpICYmIChzdXBlcnMoKStzdWJzKCkrMSk9PWNvZWZmcy5yb3dzKCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgKi8KKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fcm93cy52YWx1ZSgpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiByb3dzICovCisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmcy5jb2xzKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1cGVyIGRpYWdvbmFscyAqLworICAgIGlubGluZSBJbmRleCBzdXBlcnMoKSBjb25zdCB7IHJldHVybiBtX3N1cGVycy52YWx1ZSgpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBzdWIgZGlhZ29uYWxzICovCisgICAgaW5saW5lIEluZGV4IHN1YnMoKSBjb25zdCB7IHJldHVybiBtX3N1YnMudmFsdWUoKTsgfQorCisgICAgaW5saW5lIGNvbnN0IENvZWZmaWNpZW50c1R5cGUmIGNvZWZmcygpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgY29uc3QgQ29lZmZpY2llbnRzVHlwZSYgbV9jb2VmZnM7CisgICAgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIF9Sb3dzPiAgIG1fcm93czsKKyAgICBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgX1N1cGVycz4gbV9zdXBlcnM7CisgICAgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIF9TdWJzPiAgIG1fc3ViczsKK307CisKKy8qKgorICAqIFxjbGFzcyBUcmlkaWFnb25hbE1hdHJpeAorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHRyaWRpYWdvbmFsIG1hdHJpeCB3aXRoIGEgY29tcGFjdCBiYW5kZWQgc3RvcmFnZQorICAqCisgICogXHBhcmFtIF9TY2FsYXIgTnVtZXJpYyB0eXBlLCBpLmUuIGZsb2F0LCBkb3VibGUsIGludAorICAqIFxwYXJhbSBTaXplIE51bWJlciBvZiByb3dzIGFuZCBjb2xzLCBvciBcYiBEeW5hbWljCisgICogXHBhcmFtIF9PcHRpb25zIENhbiBiZSAwIG9yIFxiIFNlbGZBZGpvaW50CisgICoKKyAgKiBcc2EgY2xhc3MgQmFuZE1hdHJpeAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgU2l6ZSwgaW50IE9wdGlvbnM+CitjbGFzcyBUcmlkaWFnb25hbE1hdHJpeCA6IHB1YmxpYyBCYW5kTWF0cml4PFNjYWxhcixTaXplLFNpemUsT3B0aW9ucyZTZWxmQWRqb2ludD8wOjEsMSxPcHRpb25zfFJvd01ham9yPgoreworICAgIHR5cGVkZWYgQmFuZE1hdHJpeDxTY2FsYXIsU2l6ZSxTaXplLE9wdGlvbnMmU2VsZkFkam9pbnQ/MDoxLDEsT3B0aW9uc3xSb3dNYWpvcj4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkluZGV4IEluZGV4OworICBwdWJsaWM6CisgICAgVHJpZGlhZ29uYWxNYXRyaXgoSW5kZXggc2l6ZSA9IFNpemUpIDogQmFzZShzaXplLHNpemUsT3B0aW9ucyZTZWxmQWRqb2ludD8wOjEsMSkge30KKworICAgIGlubGluZSB0eXBlbmFtZSBCYXNlOjp0ZW1wbGF0ZSBEaWFnb25hbEludFJldHVyblR5cGU8MT46OlR5cGUgc3VwZXIoKQorICAgIHsgcmV0dXJuIEJhc2U6OnRlbXBsYXRlIGRpYWdvbmFsPDE+KCk7IH0KKyAgICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgQmFzZTo6dGVtcGxhdGUgRGlhZ29uYWxJbnRSZXR1cm5UeXBlPDE+OjpUeXBlIHN1cGVyKCkgY29uc3QKKyAgICB7IHJldHVybiBCYXNlOjp0ZW1wbGF0ZSBkaWFnb25hbDwxPigpOyB9CisgICAgaW5saW5lIHR5cGVuYW1lIEJhc2U6OnRlbXBsYXRlIERpYWdvbmFsSW50UmV0dXJuVHlwZTwtMT46OlR5cGUgc3ViKCkKKyAgICB7IHJldHVybiBCYXNlOjp0ZW1wbGF0ZSBkaWFnb25hbDwtMT4oKTsgfQorICAgIGlubGluZSBjb25zdCB0eXBlbmFtZSBCYXNlOjp0ZW1wbGF0ZSBEaWFnb25hbEludFJldHVyblR5cGU8LTE+OjpUeXBlIHN1YigpIGNvbnN0CisgICAgeyByZXR1cm4gQmFzZTo6dGVtcGxhdGUgZGlhZ29uYWw8LTE+KCk7IH0KKyAgcHJvdGVjdGVkOgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQkFORE1BVFJJWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9CbG9jay5oIGIvRWlnZW4vc3JjL0NvcmUvQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI5Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQmxvY2suaApAQCAtMCwwICsxLDM1NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQkxPQ0tfSAorI2RlZmluZSBFSUdFTl9CTE9DS19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGNsYXNzIEJsb2NrCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIG9mIGEgZml4ZWQtc2l6ZSBvciBkeW5hbWljLXNpemUgYmxvY2sKKyAgKgorICAqIFxwYXJhbSBYcHJUeXBlIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGluIHdoaWNoIHdlIGFyZSB0YWtpbmcgYSBibG9jaworICAqIFxwYXJhbSBCbG9ja1Jvd3MgdGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSBibG9jayB3ZSBhcmUgdGFraW5nIGF0IGNvbXBpbGUgdGltZSAob3B0aW9uYWwpCisgICogXHBhcmFtIEJsb2NrQ29scyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIGJsb2NrIHdlIGFyZSB0YWtpbmcgYXQgY29tcGlsZSB0aW1lIChvcHRpb25hbCkKKyAgKiBccGFyYW0gX0RpcmVjdEFjY2Vzc1N0YXR1cyBcaW50ZXJuYWwgdXNlZCBmb3IgcGFydGlhbCBzcGVjaWFsaXphdGlvbgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2YgZWl0aGVyIGEgZml4ZWQtc2l6ZSBvciBkeW5hbWljLXNpemUgYmxvY2suIEl0IGlzIHRoZSByZXR1cm4KKyAgKiB0eXBlIG9mIERlbnNlQmFzZTo6YmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpIGFuZCBEZW5zZUJhc2U6OmJsb2NrPGludCxpbnQ+KEluZGV4LEluZGV4KSBhbmQKKyAgKiBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBIb3dldmVyLCBpZiB5b3Ugd2FudCB0byBkaXJlY3RseSBtYW5pcHV0YXRlIGJsb2NrIGV4cHJlc3Npb25zLAorICAqIGZvciBpbnN0YW5jZSBpZiB5b3Ugd2FudCB0byB3cml0ZSBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGV4cHJlc3Npb24sIHlvdQorICAqIHdpbGwgbmVlZCB0byB1c2UgdGhpcyBjbGFzcy4KKyAgKgorICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBpbGx1c3RyYXRpbmcgdGhlIGR5bmFtaWMgY2FzZToKKyAgKiBcaW5jbHVkZSBjbGFzc19CbG9jay5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBjbGFzc19CbG9jay5vdXQKKyAgKgorICAqIFxub3RlIEV2ZW4gdGhvdWdoIHRoaXMgZXhwcmVzc2lvbiBoYXMgZHluYW1pYyBzaXplLCBpbiB0aGUgY2FzZSB3aGVyZSBcYSBYcHJUeXBlCisgICogaGFzIGZpeGVkIHNpemUsIHRoaXMgZXhwcmVzc2lvbiBpbmhlcml0cyBhIGZpeGVkIG1heGltYWwgc2l6ZSB3aGljaCBtZWFucyB0aGF0IGV2YWx1YXRpbmcKKyAgKiBpdCBkb2VzIG5vdCBjYXVzZSBhIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgICoKKyAgKiBIZXJlIGlzIGFuIGV4YW1wbGUgaWxsdXN0cmF0aW5nIHRoZSBmaXhlZC1zaXplIGNhc2U6CisgICogXGluY2x1ZGUgY2xhc3NfRml4ZWRCbG9jay5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBjbGFzc19GaXhlZEJsb2NrLm91dAorICAqCisgICogXHNhIERlbnNlQmFzZTo6YmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpLCBEZW5zZUJhc2U6OmJsb2NrKEluZGV4LEluZGV4KSwgY2xhc3MgVmVjdG9yQmxvY2sKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHMsIGJvb2wgSW5uZXJQYW5lbCwgYm9vbCBIYXNEaXJlY3RBY2Nlc3M+CitzdHJ1Y3QgdHJhaXRzPEJsb2NrPFhwclR5cGUsIEJsb2NrUm93cywgQmxvY2tDb2xzLCBJbm5lclBhbmVsLCBIYXNEaXJlY3RBY2Nlc3M+ID4gOiB0cmFpdHM8WHByVHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8WHByVHlwZT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPFhwclR5cGU+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8WHByVHlwZT46OlhwcktpbmQgWHByS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWQ8WHByVHlwZT46OnR5cGUgWHByVHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPFhwclR5cGVOZXN0ZWQ+Ojp0eXBlIF9YcHJUeXBlTmVzdGVkOworICBlbnVteworICAgIE1hdHJpeFJvd3MgPSB0cmFpdHM8WHByVHlwZT46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1hdHJpeENvbHMgPSB0cmFpdHM8WHByVHlwZT46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4Um93cyA9PSAwID8gMCA6IEJsb2NrUm93cywKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeENvbHMgPT0gMCA/IDAgOiBCbG9ja0NvbHMsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBCbG9ja1Jvd3M9PTAgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBSb3dzQXRDb21waWxlVGltZSAhPSBEeW5hbWljID8gaW50KFJvd3NBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KHRyYWl0czxYcHJUeXBlPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUpLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gQmxvY2tDb2xzPT0wID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgIDogQ29sc0F0Q29tcGlsZVRpbWUgIT0gRHluYW1pYyA/IGludChDb2xzQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IGludCh0cmFpdHM8WHByVHlwZT46Ok1heENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICBYcHJUeXBlSXNSb3dNYWpvciA9IChpbnQodHJhaXRzPFhwclR5cGU+OjpGbGFncykmUm93TWFqb3JCaXQpICE9IDAsCisgICAgSXNSb3dNYWpvciA9IChNYXhSb3dzQXRDb21waWxlVGltZT09MSYmTWF4Q29sc0F0Q29tcGlsZVRpbWUhPTEpID8gMQorICAgICAgICAgICAgICAgOiAoTWF4Q29sc0F0Q29tcGlsZVRpbWU9PTEmJk1heFJvd3NBdENvbXBpbGVUaW1lIT0xKSA/IDAKKyAgICAgICAgICAgICAgIDogWHByVHlwZUlzUm93TWFqb3IsCisgICAgSGFzU2FtZVN0b3JhZ2VPcmRlckFzWHByVHlwZSA9IChJc1Jvd01ham9yID09IFhwclR5cGVJc1Jvd01ham9yKSwKKyAgICBJbm5lclNpemUgPSBJc1Jvd01ham9yID8gaW50KENvbHNBdENvbXBpbGVUaW1lKSA6IGludChSb3dzQXRDb21waWxlVGltZSksCisgICAgSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gSGFzU2FtZVN0b3JhZ2VPcmRlckFzWHByVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGludChpbm5lcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPFhwclR5cGU+OjpyZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KG91dGVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8WHByVHlwZT46OnJldCksCisgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gSGFzU2FtZVN0b3JhZ2VPcmRlckFzWHByVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGludChvdXRlcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPFhwclR5cGU+OjpyZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KGlubmVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8WHByVHlwZT46OnJldCksCisgICAgTWFza1BhY2tldEFjY2Vzc0JpdCA9IChJbm5lclNpemUgPT0gRHluYW1pYyB8fCAoSW5uZXJTaXplICUgcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAmJiAoSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICA/IFBhY2tldEFjY2Vzc0JpdCA6IDAsCisgICAgTWFza0FsaWduZWRCaXQgPSAoSW5uZXJQYW5lbCAmJiAoT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lIT1EeW5hbWljKSAmJiAoKChPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgKiBpbnQoc2l6ZW9mKFNjYWxhcikpKSAlIDE2KSA9PSAwKSkgPyBBbGlnbmVkQml0IDogMCwKKyAgICBGbGFnc0xpbmVhckFjY2Vzc0JpdCA9IChSb3dzQXRDb21waWxlVGltZSA9PSAxIHx8IENvbHNBdENvbXBpbGVUaW1lID09IDEpID8gTGluZWFyQWNjZXNzQml0IDogMCwKKyAgICBGbGFnc0x2YWx1ZUJpdCA9IGlzX2x2YWx1ZTxYcHJUeXBlPjo6dmFsdWUgPyBMdmFsdWVCaXQgOiAwLAorICAgIEZsYWdzUm93TWFqb3JCaXQgPSBJc1Jvd01ham9yID8gUm93TWFqb3JCaXQgOiAwLAorICAgIEZsYWdzMCA9IHRyYWl0czxYcHJUeXBlPjo6RmxhZ3MgJiAoIChIZXJlZGl0YXJ5Qml0cyAmIH5Sb3dNYWpvckJpdCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdEFjY2Vzc0JpdCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFza1BhY2tldEFjY2Vzc0JpdCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFza0FsaWduZWRCaXQpLAorICAgIEZsYWdzID0gRmxhZ3MwIHwgRmxhZ3NMaW5lYXJBY2Nlc3NCaXQgfCBGbGFnc0x2YWx1ZUJpdCB8IEZsYWdzUm93TWFqb3JCaXQKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHMsIGJvb2wgSW5uZXJQYW5lbCwgYm9vbCBIYXNEaXJlY3RBY2Nlc3M+IGNsYXNzIEJsb2NrCisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxCbG9jazxYcHJUeXBlLCBCbG9ja1Jvd3MsIEJsb2NrQ29scywgSW5uZXJQYW5lbCwgSGFzRGlyZWN0QWNjZXNzPiA+Ojp0eXBlCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPEJsb2NrPjo6dHlwZSBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoQmxvY2spCisKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yOworCisgICAgLyoqIENvbHVtbiBvciBSb3cgY29uc3RydWN0b3IKKyAgICAgICovCisgICAgaW5saW5lIEJsb2NrKFhwclR5cGUmIHhwciwgSW5kZXggaSkKKyAgICAgIDogbV94cHIoeHByKSwKKyAgICAgICAgLy8gSXQgaXMgYSByb3cgaWYgYW5kIG9ubHkgaWYgQmxvY2tSb3dzPT0xIGFuZCBCbG9ja0NvbHM9PVhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAvLyBhbmQgaXQgaXMgYSBjb2x1bW4gaWYgYW5kIG9ubHkgaWYgQmxvY2tSb3dzPT1YcHJUeXBlOjpSb3dzQXRDb21waWxlVGltZSBhbmQgQmxvY2tDb2xzPT0xLAorICAgICAgICAvLyBhbGwgb3RoZXIgY2FzZXMgYXJlIGludmFsaWQuCisgICAgICAgIC8vIFRoZSBjYXNlIGEgMXgxIG1hdHJpeCBzZWVtcyBhbWJpZ3VvdXMsIGJ1dCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFueXdheS4KKyAgICAgICAgbV9zdGFydFJvdyggKEJsb2NrUm93cz09MSkgJiYgKEJsb2NrQ29scz09WHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpID8gaSA6IDApLAorICAgICAgICBtX3N0YXJ0Q29sKCAoQmxvY2tSb3dzPT1YcHJUeXBlOjpSb3dzQXRDb21waWxlVGltZSkgJiYgKEJsb2NrQ29scz09MSkgPyBpIDogMCksCisgICAgICAgIG1fYmxvY2tSb3dzKEJsb2NrUm93cz09MSA/IDEgOiB4cHIucm93cygpKSwKKyAgICAgICAgbV9ibG9ja0NvbHMoQmxvY2tDb2xzPT0xID8gMSA6IHhwci5jb2xzKCkpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KCAoaT49MCkgJiYgKAorICAgICAgICAgICgoQmxvY2tSb3dzPT0xKSAmJiAoQmxvY2tDb2xzPT1YcHJUeXBlOjpDb2xzQXRDb21waWxlVGltZSkgJiYgaTx4cHIucm93cygpKQorICAgICAgICB8fCgoQmxvY2tSb3dzPT1YcHJUeXBlOjpSb3dzQXRDb21waWxlVGltZSkgJiYgKEJsb2NrQ29scz09MSkgJiYgaTx4cHIuY29scygpKSkpOworICAgIH0KKworICAgIC8qKiBGaXhlZC1zaXplIGNvbnN0cnVjdG9yCisgICAgICAqLworICAgIGlubGluZSBCbG9jayhYcHJUeXBlJiB4cHIsIEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCkKKyAgICAgIDogbV94cHIoeHByKSwgbV9zdGFydFJvdyhzdGFydFJvdyksIG1fc3RhcnRDb2woc3RhcnRDb2wpLAorICAgICAgICBtX2Jsb2NrUm93cyhCbG9ja1Jvd3MpLCBtX2Jsb2NrQ29scyhCbG9ja0NvbHMpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChSb3dzQXRDb21waWxlVGltZSE9RHluYW1pYyAmJiBDb2xzQXRDb21waWxlVGltZSE9RHluYW1pYyxUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9GSVhFRF9TSVpFKQorICAgICAgZWlnZW5fYXNzZXJ0KHN0YXJ0Um93ID49IDAgJiYgQmxvY2tSb3dzID49IDEgJiYgc3RhcnRSb3cgKyBCbG9ja1Jvd3MgPD0geHByLnJvd3MoKQorICAgICAgICAgICAgICYmIHN0YXJ0Q29sID49IDAgJiYgQmxvY2tDb2xzID49IDEgJiYgc3RhcnRDb2wgKyBCbG9ja0NvbHMgPD0geHByLmNvbHMoKSk7CisgICAgfQorCisgICAgLyoqIER5bmFtaWMtc2l6ZSBjb25zdHJ1Y3RvcgorICAgICAgKi8KKyAgICBpbmxpbmUgQmxvY2soWHByVHlwZSYgeHByLAorICAgICAgICAgIEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCwKKyAgICAgICAgICBJbmRleCBibG9ja1Jvd3MsIEluZGV4IGJsb2NrQ29scykKKyAgICAgIDogbV94cHIoeHByKSwgbV9zdGFydFJvdyhzdGFydFJvdyksIG1fc3RhcnRDb2woc3RhcnRDb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Jsb2NrUm93cyhibG9ja1Jvd3MpLCBtX2Jsb2NrQ29scyhibG9ja0NvbHMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KChSb3dzQXRDb21waWxlVGltZT09RHluYW1pYyB8fCBSb3dzQXRDb21waWxlVGltZT09YmxvY2tSb3dzKQorICAgICAgICAgICYmIChDb2xzQXRDb21waWxlVGltZT09RHluYW1pYyB8fCBDb2xzQXRDb21waWxlVGltZT09YmxvY2tDb2xzKSk7CisgICAgICBlaWdlbl9hc3NlcnQoc3RhcnRSb3cgPj0gMCAmJiBibG9ja1Jvd3MgPj0gMCAmJiBzdGFydFJvdyArIGJsb2NrUm93cyA8PSB4cHIucm93cygpCisgICAgICAgICAgJiYgc3RhcnRDb2wgPj0gMCAmJiBibG9ja0NvbHMgPj0gMCAmJiBzdGFydENvbCArIGJsb2NrQ29scyA8PSB4cHIuY29scygpKTsKKyAgICB9CisKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKEJsb2NrKQorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2Jsb2NrUm93cy52YWx1ZSgpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2Jsb2NrQ29scy52YWx1ZSgpOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShYcHJUeXBlKQorICAgICAgcmV0dXJuIG1feHByLmNvbnN0X2Nhc3RfZGVyaXZlZCgpCisgICAgICAgICAgICAgICAuY29lZmZSZWYocm93ICsgbV9zdGFydFJvdy52YWx1ZSgpLCBjb2wgKyBtX3N0YXJ0Q29sLnZhbHVlKCkpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX3hwci5kZXJpdmVkKCkKKyAgICAgICAgICAgICAgIC5jb2VmZlJlZihyb3cgKyBtX3N0YXJ0Um93LnZhbHVlKCksIGNvbCArIG1fc3RhcnRDb2wudmFsdWUoKSk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1feHByLmNvZWZmKHJvdyArIG1fc3RhcnRSb3cudmFsdWUoKSwgY29sICsgbV9zdGFydENvbC52YWx1ZSgpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShYcHJUeXBlKQorICAgICAgcmV0dXJuIG1feHByLmNvbnN0X2Nhc3RfZGVyaXZlZCgpCisgICAgICAgICAgICAgLmNvZWZmUmVmKG1fc3RhcnRSb3cudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gMCA6IGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbV9zdGFydENvbC52YWx1ZSgpICsgKFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyBpbmRleCA6IDApKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV94cHIuY29uc3RfY2FzdF9kZXJpdmVkKCkKKyAgICAgICAgICAgICAuY29lZmZSZWYobV9zdGFydFJvdy52YWx1ZSgpICsgKFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyAwIDogaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXJ0Q29sLnZhbHVlKCkgKyAoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSA/IGluZGV4IDogMCkpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1feHByCisgICAgICAgICAgICAgLmNvZWZmKG1fc3RhcnRSb3cudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gMCA6IGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgbV9zdGFydENvbC52YWx1ZSgpICsgKFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyBpbmRleCA6IDApKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgaW5saW5lIFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1feHByLnRlbXBsYXRlIHBhY2tldDxVbmFsaWduZWQ+CisgICAgICAgICAgICAgIChyb3cgKyBtX3N0YXJ0Um93LnZhbHVlKCksIGNvbCArIG1fc3RhcnRDb2wudmFsdWUoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV94cHIuY29uc3RfY2FzdF9kZXJpdmVkKCkudGVtcGxhdGUgd3JpdGVQYWNrZXQ8VW5hbGlnbmVkPgorICAgICAgICAgICAgICAocm93ICsgbV9zdGFydFJvdy52YWx1ZSgpLCBjb2wgKyBtX3N0YXJ0Q29sLnZhbHVlKCksIHgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV94cHIudGVtcGxhdGUgcGFja2V0PFVuYWxpZ25lZD4KKyAgICAgICAgICAgICAgKG1fc3RhcnRSb3cudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gMCA6IGluZGV4KSwKKyAgICAgICAgICAgICAgIG1fc3RhcnRDb2wudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gaW5kZXggOiAwKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV94cHIuY29uc3RfY2FzdF9kZXJpdmVkKCkudGVtcGxhdGUgd3JpdGVQYWNrZXQ8VW5hbGlnbmVkPgorICAgICAgICAgKG1fc3RhcnRSb3cudmFsdWUoKSArIChSb3dzQXRDb21waWxlVGltZSA9PSAxID8gMCA6IGluZGV4KSwKKyAgICAgICAgICBtX3N0YXJ0Q29sLnZhbHVlKCkgKyAoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSA/IGluZGV4IDogMCksIHgpOworICAgIH0KKworICAgICNpZmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBcc2EgTWFwQmFzZTo6ZGF0YSgpICovCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0OworICAgIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0OworICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0OworICAgICNlbmRpZgorCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYgbmVzdGVkRXhwcmVzc2lvbigpIGNvbnN0IAorICAgIHsgCisgICAgICByZXR1cm4gbV94cHI7IAorICAgIH0KKyAgICAgIAorICAgIEluZGV4IHN0YXJ0Um93KCkgY29uc3QgCisgICAgeyAKKyAgICAgIHJldHVybiBtX3N0YXJ0Um93LnZhbHVlKCk7IAorICAgIH0KKyAgICAgIAorICAgIEluZGV4IHN0YXJ0Q29sKCkgY29uc3QgCisgICAgeyAKKyAgICAgIHJldHVybiBtX3N0YXJ0Q29sLnZhbHVlKCk7IAorICAgIH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICBjb25zdCB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgbV94cHI7CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIFhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IDEgPyAwIDogRHluYW1pYz4gbV9zdGFydFJvdzsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgWHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gMSA/IDAgOiBEeW5hbWljPiBtX3N0YXJ0Q29sOworICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBSb3dzQXRDb21waWxlVGltZT4gbV9ibG9ja1Jvd3M7CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIENvbHNBdENvbXBpbGVUaW1lPiBtX2Jsb2NrQ29sczsKK307CisKKy8qKiBcaW50ZXJuYWwgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGUsIGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHMsIGJvb2wgSW5uZXJQYW5lbD4KK2NsYXNzIEJsb2NrPFhwclR5cGUsQmxvY2tSb3dzLEJsb2NrQ29scywgSW5uZXJQYW5lbCx0cnVlPgorICA6IHB1YmxpYyBNYXBCYXNlPEJsb2NrPFhwclR5cGUsIEJsb2NrUm93cywgQmxvY2tDb2xzLCBJbm5lclBhbmVsLCB0cnVlPiA+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgTWFwQmFzZTxCbG9jaz4gQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKEJsb2NrKQorCisgICAgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhCbG9jaykKKworICAgIC8qKiBDb2x1bW4gb3IgUm93IGNvbnN0cnVjdG9yCisgICAgICAqLworICAgIGlubGluZSBCbG9jayhYcHJUeXBlJiB4cHIsIEluZGV4IGkpCisgICAgICA6IEJhc2UoaW50ZXJuYWw6OmNvbnN0X2Nhc3RfcHRyKCZ4cHIuY29lZmZSZWYoCisgICAgICAgICAgICAgIChCbG9ja1Jvd3M9PTEpICYmIChCbG9ja0NvbHM9PVhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKSA/IGkgOiAwLAorICAgICAgICAgICAgICAoQmxvY2tSb3dzPT1YcHJUeXBlOjpSb3dzQXRDb21waWxlVGltZSkgJiYgKEJsb2NrQ29scz09MSkgPyBpIDogMCkpLAorICAgICAgICAgICAgIEJsb2NrUm93cz09MSA/IDEgOiB4cHIucm93cygpLAorICAgICAgICAgICAgIEJsb2NrQ29scz09MSA/IDEgOiB4cHIuY29scygpKSwKKyAgICAgICAgbV94cHIoeHByKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCggKGk+PTApICYmICgKKyAgICAgICAgICAoKEJsb2NrUm93cz09MSkgJiYgKEJsb2NrQ29scz09WHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpICYmIGk8eHByLnJvd3MoKSkKKyAgICAgICAgfHwoKEJsb2NrUm93cz09WHByVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUpICYmIChCbG9ja0NvbHM9PTEpICYmIGk8eHByLmNvbHMoKSkpKTsKKyAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICAvKiogRml4ZWQtc2l6ZSBjb25zdHJ1Y3RvcgorICAgICAgKi8KKyAgICBpbmxpbmUgQmxvY2soWHByVHlwZSYgeHByLCBJbmRleCBzdGFydFJvdywgSW5kZXggc3RhcnRDb2wpCisgICAgICA6IEJhc2UoaW50ZXJuYWw6OmNvbnN0X2Nhc3RfcHRyKCZ4cHIuY29lZmZSZWYoc3RhcnRSb3csc3RhcnRDb2wpKSksIG1feHByKHhwcikKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoc3RhcnRSb3cgPj0gMCAmJiBCbG9ja1Jvd3MgPj0gMSAmJiBzdGFydFJvdyArIEJsb2NrUm93cyA8PSB4cHIucm93cygpCisgICAgICAgICAgICAgJiYgc3RhcnRDb2wgPj0gMCAmJiBCbG9ja0NvbHMgPj0gMSAmJiBzdGFydENvbCArIEJsb2NrQ29scyA8PSB4cHIuY29scygpKTsKKyAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICAvKiogRHluYW1pYy1zaXplIGNvbnN0cnVjdG9yCisgICAgICAqLworICAgIGlubGluZSBCbG9jayhYcHJUeXBlJiB4cHIsCisgICAgICAgICAgSW5kZXggc3RhcnRSb3csIEluZGV4IHN0YXJ0Q29sLAorICAgICAgICAgIEluZGV4IGJsb2NrUm93cywgSW5kZXggYmxvY2tDb2xzKQorICAgICAgOiBCYXNlKGludGVybmFsOjpjb25zdF9jYXN0X3B0cigmeHByLmNvZWZmUmVmKHN0YXJ0Um93LHN0YXJ0Q29sKSksIGJsb2NrUm93cywgYmxvY2tDb2xzKSwKKyAgICAgICAgbV94cHIoeHByKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCgoUm93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMgfHwgUm93c0F0Q29tcGlsZVRpbWU9PWJsb2NrUm93cykKKyAgICAgICAgICAgICAmJiAoQ29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMgfHwgQ29sc0F0Q29tcGlsZVRpbWU9PWJsb2NrQ29scykpOworICAgICAgZWlnZW5fYXNzZXJ0KHN0YXJ0Um93ID49IDAgJiYgYmxvY2tSb3dzID49IDAgJiYgc3RhcnRSb3cgKyBibG9ja1Jvd3MgPD0geHByLnJvd3MoKQorICAgICAgICAgICAgICYmIHN0YXJ0Q29sID49IDAgJiYgYmxvY2tDb2xzID49IDAgJiYgc3RhcnRDb2wgKyBibG9ja0NvbHMgPD0geHByLmNvbHMoKSk7CisgICAgICBpbml0KCk7CisgICAgfQorCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYgbmVzdGVkRXhwcmVzc2lvbigpIGNvbnN0IAorICAgIHsgCisgICAgICByZXR1cm4gbV94cHI7IAorICAgIH0KKyAgICAgIAorICAgIC8qKiBcc2EgTWFwQmFzZTo6aW5uZXJTdHJpZGUoKSAqLworICAgIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGludGVybmFsOjp0cmFpdHM8QmxvY2s+OjpIYXNTYW1lU3RvcmFnZU9yZGVyQXNYcHJUeXBlCisgICAgICAgICAgICAgPyBtX3hwci5pbm5lclN0cmlkZSgpCisgICAgICAgICAgICAgOiBtX3hwci5vdXRlclN0cmlkZSgpOworICAgIH0KKworICAgIC8qKiBcc2EgTWFwQmFzZTo6b3V0ZXJTdHJpZGUoKSAqLworICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fb3V0ZXJTdHJpZGU7CisgICAgfQorCisgICNpZm5kZWYgX19TVU5QUk9fQ0MKKyAgLy8gRklYTUUgc3Vuc3R1ZGlvIGlzIG5vdCBmcmllbmRseSB3aXRoIHRoZSBhYm92ZSBmcmllbmQuLi4KKyAgLy8gTUVUQS1GSVhNRSB0aGVyZSBpcyBubyAnZnJpZW5kJyBrZXl3b3JkIGFyb3VuZCBoZXJlLiBJcyB0aGlzIG9ic29sZXRlPworICBwcm90ZWN0ZWQ6CisgICNlbmRpZgorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBcaW50ZXJuYWwgdXNlZCBieSBhbGxvd0FsaWduZWQoKSAqLworICAgIGlubGluZSBCbG9jayhYcHJUeXBlJiB4cHIsIGNvbnN0IFNjYWxhciogZGF0YSwgSW5kZXggYmxvY2tSb3dzLCBJbmRleCBibG9ja0NvbHMpCisgICAgICA6IEJhc2UoZGF0YSwgYmxvY2tSb3dzLCBibG9ja0NvbHMpLCBtX3hwcih4cHIpCisgICAgeworICAgICAgaW5pdCgpOworICAgIH0KKyAgICAjZW5kaWYKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBtX291dGVyU3RyaWRlID0gaW50ZXJuYWw6OnRyYWl0czxCbG9jaz46Okhhc1NhbWVTdG9yYWdlT3JkZXJBc1hwclR5cGUKKyAgICAgICAgICAgICAgICAgICAgPyBtX3hwci5vdXRlclN0cmlkZSgpCisgICAgICAgICAgICAgICAgICAgIDogbV94cHIuaW5uZXJTdHJpZGUoKTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgbV94cHI7CisgICAgSW5kZXggbV9vdXRlclN0cmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQkxPQ0tfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvQm9vbGVhblJlZHV4LmggYi9FaWdlbi9zcmMvQ29yZS9Cb29sZWFuUmVkdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VmZDhlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQm9vbGVhblJlZHV4LmgKQEAgLTAsMCArMSwxMzggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9BTExBTkRBTllfSAorI2RlZmluZSBFSUdFTl9BTExBTkRBTllfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgaW50IFVucm9sbENvdW50Pgorc3RydWN0IGFsbF91bnJvbGxlcgoreworICBlbnVtIHsKKyAgICBjb2wgPSAoVW5yb2xsQ291bnQtMSkgLyBEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICByb3cgPSAoVW5yb2xsQ291bnQtMSkgJSBEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZQorICB9OworCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBydW4oY29uc3QgRGVyaXZlZCAmbWF0KQorICB7CisgICAgcmV0dXJuIGFsbF91bnJvbGxlcjxEZXJpdmVkLCBVbnJvbGxDb3VudC0xPjo6cnVuKG1hdCkgJiYgbWF0LmNvZWZmKHJvdywgY29sKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBhbGxfdW5yb2xsZXI8RGVyaXZlZCwgMT4KK3sKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bihjb25zdCBEZXJpdmVkICZtYXQpIHsgcmV0dXJuIG1hdC5jb2VmZigwLCAwKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBhbGxfdW5yb2xsZXI8RGVyaXZlZCwgRHluYW1pYz4KK3sKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bihjb25zdCBEZXJpdmVkICYpIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCBpbnQgVW5yb2xsQ291bnQ+CitzdHJ1Y3QgYW55X3Vucm9sbGVyCit7CisgIGVudW0geworICAgIGNvbCA9IChVbnJvbGxDb3VudC0xKSAvIERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIHJvdyA9IChVbnJvbGxDb3VudC0xKSAlIERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lCisgIH07CisKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bihjb25zdCBEZXJpdmVkICZtYXQpCisgIHsKKyAgICByZXR1cm4gYW55X3Vucm9sbGVyPERlcml2ZWQsIFVucm9sbENvdW50LTE+OjpydW4obWF0KSB8fCBtYXQuY29lZmYocm93LCBjb2wpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGFueV91bnJvbGxlcjxEZXJpdmVkLCAxPgoreworICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKGNvbnN0IERlcml2ZWQgJm1hdCkgeyByZXR1cm4gbWF0LmNvZWZmKDAsIDApOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGFueV91bnJvbGxlcjxEZXJpdmVkLCBEeW5hbWljPgoreworICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKGNvbnN0IERlcml2ZWQgJikgeyByZXR1cm4gZmFsc2U7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXHJldHVybnMgdHJ1ZSBpZiBhbGwgY29lZmZpY2llbnRzIGFyZSB0cnVlCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2FsbC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2FsbC5vdXQKKyAgKgorICAqIFxzYSBhbnkoKSwgQ3dpc2U6Om9wZXJhdG9yPCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGJvb2wgRGVuc2VCYXNlPERlcml2ZWQ+OjphbGwoKSBjb25zdAoreworICBlbnVtIHsKKyAgICB1bnJvbGwgPSBTaXplQXRDb21waWxlVGltZSAhPSBEeW5hbWljCisgICAgICAgICAgJiYgQ29lZmZSZWFkQ29zdCAhPSBEeW5hbWljCisgICAgICAgICAgJiYgTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgIT0gRHluYW1pYworICAgICAgICAgICYmIFNpemVBdENvbXBpbGVUaW1lICogKENvZWZmUmVhZENvc3QgKyBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCkgPD0gRUlHRU5fVU5ST0xMSU5HX0xJTUlUCisgIH07CisgIGlmKHVucm9sbCkKKyAgICByZXR1cm4gaW50ZXJuYWw6OmFsbF91bnJvbGxlcjxEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yb2xsID8gaW50KFNpemVBdENvbXBpbGVUaW1lKSA6IER5bmFtaWMKKyAgICAgPjo6cnVuKGRlcml2ZWQoKSk7CisgIGVsc2UKKyAgeworICAgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgcm93cygpOyArK2kpCisgICAgICAgIGlmICghY29lZmYoaSwgaikpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCisvKiogXHJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgY29lZmZpY2llbnQgaXMgdHJ1ZQorICAqCisgICogXHNhIGFsbCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGJvb2wgRGVuc2VCYXNlPERlcml2ZWQ+OjphbnkoKSBjb25zdAoreworICBlbnVtIHsKKyAgICB1bnJvbGwgPSBTaXplQXRDb21waWxlVGltZSAhPSBEeW5hbWljCisgICAgICAgICAgJiYgQ29lZmZSZWFkQ29zdCAhPSBEeW5hbWljCisgICAgICAgICAgJiYgTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QgIT0gRHluYW1pYworICAgICAgICAgICYmIFNpemVBdENvbXBpbGVUaW1lICogKENvZWZmUmVhZENvc3QgKyBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCkgPD0gRUlHRU5fVU5ST0xMSU5HX0xJTUlUCisgIH07CisgIGlmKHVucm9sbCkKKyAgICByZXR1cm4gaW50ZXJuYWw6OmFueV91bnJvbGxlcjxEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yb2xsID8gaW50KFNpemVBdENvbXBpbGVUaW1lKSA6IER5bmFtaWMKKyAgICAgICAgICAgPjo6cnVuKGRlcml2ZWQoKSk7CisgIGVsc2UKKyAgeworICAgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgcm93cygpOyArK2kpCisgICAgICAgIGlmIChjb2VmZihpLCBqKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyB3aGljaCBldmFsdWF0ZSB0byB0cnVlCisgICoKKyAgKiBcc2EgYWxsKCksIGFueSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6SW5kZXggRGVuc2VCYXNlPERlcml2ZWQ+Ojpjb3VudCgpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCkudGVtcGxhdGUgY2FzdDxib29sPigpLnRlbXBsYXRlIGNhc3Q8SW5kZXg+KCkuc3VtKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQUxMQU5EQU5ZX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0NNYWtlTGlzdHMudHh0IGIvRWlnZW4vc3JjL0NvcmUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0NmZjMgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTAgQEAKK0ZJTEUoR0xPQiBFaWdlbl9Db3JlX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9Db3JlX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL0NvcmUgQ09NUE9ORU5UIERldmVsCisgICkKKworQUREX1NVQkRJUkVDVE9SWShwcm9kdWN0cykKK0FERF9TVUJESVJFQ1RPUlkodXRpbCkKK0FERF9TVUJESVJFQ1RPUlkoYXJjaCkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0NvbW1hSW5pdGlhbGl6ZXIuaCBiL0VpZ2VuL3NyYy9Db3JlL0NvbW1hSW5pdGlhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWRjZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQ29tbWFJbml0aWFsaXplci5oCkBAIC0wLDAgKzEsMTM5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT01NQUlOSVRJQUxJWkVSX0gKKyNkZWZpbmUgRUlHRU5fQ09NTUFJTklUSUFMSVpFUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGNsYXNzIENvbW1hSW5pdGlhbGl6ZXIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBjb21tYSBpbml0aWFsaXplciBvcGVyYXRvcgorICAqCisgICogVGhpcyBjbGFzcyBpcyBpbnRlcm5hbGx5IHVzZWQgdG8gaW1wbGVtZW50IHRoZSBjb21tYSBpbml0aWFsaXplciBmZWF0dXJlLiBJdCBpcworICAqIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpvcGVyYXRvcjw8LCBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5CisgICogd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBcc2EgXHJlZiBNYXRyaXhCYXNlQ29tbWFJbml0UmVmICJNYXRyaXhCYXNlOjpvcGVyYXRvcjw8IiwgQ29tbWFJbml0aWFsaXplcjo6ZmluaXNoZWQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4KK3N0cnVjdCBDb21tYUluaXRpYWxpemVyCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpJbmRleCBJbmRleDsKKworICBpbmxpbmUgQ29tbWFJbml0aWFsaXplcihYcHJUeXBlJiB4cHIsIGNvbnN0IFNjYWxhciYgcykKKyAgICA6IG1feHByKHhwciksIG1fcm93KDApLCBtX2NvbCgxKSwgbV9jdXJyZW50QmxvY2tSb3dzKDEpCisgIHsKKyAgICBtX3hwci5jb2VmZlJlZigwLDApID0gczsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgaW5saW5lIENvbW1hSW5pdGlhbGl6ZXIoWHByVHlwZSYgeHByLCBjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgOiBtX3hwcih4cHIpLCBtX3JvdygwKSwgbV9jb2wob3RoZXIuY29scygpKSwgbV9jdXJyZW50QmxvY2tSb3dzKG90aGVyLnJvd3MoKSkKKyAgeworICAgIG1feHByLmJsb2NrKDAsIDAsIG90aGVyLnJvd3MoKSwgb3RoZXIuY29scygpKSA9IG90aGVyOworICB9CisKKyAgLyogaW5zZXJ0cyBhIHNjYWxhciB2YWx1ZSBpbiB0aGUgdGFyZ2V0IG1hdHJpeCAqLworICBDb21tYUluaXRpYWxpemVyJiBvcGVyYXRvciwoY29uc3QgU2NhbGFyJiBzKQorICB7CisgICAgaWYgKG1fY29sPT1tX3hwci5jb2xzKCkpCisgICAgeworICAgICAgbV9yb3crPW1fY3VycmVudEJsb2NrUm93czsKKyAgICAgIG1fY29sID0gMDsKKyAgICAgIG1fY3VycmVudEJsb2NrUm93cyA9IDE7CisgICAgICBlaWdlbl9hc3NlcnQobV9yb3c8bV94cHIucm93cygpCisgICAgICAgICYmICJUb28gbWFueSByb3dzIHBhc3NlZCB0byBjb21tYSBpbml0aWFsaXplciAob3BlcmF0b3I8PCkiKTsKKyAgICB9CisgICAgZWlnZW5fYXNzZXJ0KG1fY29sPG1feHByLmNvbHMoKQorICAgICAgJiYgIlRvbyBtYW55IGNvZWZmaWNpZW50cyBwYXNzZWQgdG8gY29tbWEgaW5pdGlhbGl6ZXIgKG9wZXJhdG9yPDwpIik7CisgICAgZWlnZW5fYXNzZXJ0KG1fY3VycmVudEJsb2NrUm93cz09MSk7CisgICAgbV94cHIuY29lZmZSZWYobV9yb3csIG1fY29sKyspID0gczsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvKiBpbnNlcnRzIGEgbWF0cml4IGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBtYXRyaXggKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBDb21tYUluaXRpYWxpemVyJiBvcGVyYXRvciwoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICB7CisgICAgaWYgKG1fY29sPT1tX3hwci5jb2xzKCkpCisgICAgeworICAgICAgbV9yb3crPW1fY3VycmVudEJsb2NrUm93czsKKyAgICAgIG1fY29sID0gMDsKKyAgICAgIG1fY3VycmVudEJsb2NrUm93cyA9IG90aGVyLnJvd3MoKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX3JvdyttX2N1cnJlbnRCbG9ja1Jvd3M8PW1feHByLnJvd3MoKQorICAgICAgICAmJiAiVG9vIG1hbnkgcm93cyBwYXNzZWQgdG8gY29tbWEgaW5pdGlhbGl6ZXIgKG9wZXJhdG9yPDwpIik7CisgICAgfQorICAgIGVpZ2VuX2Fzc2VydChtX2NvbDxtX3hwci5jb2xzKCkKKyAgICAgICYmICJUb28gbWFueSBjb2VmZmljaWVudHMgcGFzc2VkIHRvIGNvbW1hIGluaXRpYWxpemVyIChvcGVyYXRvcjw8KSIpOworICAgIGVpZ2VuX2Fzc2VydChtX2N1cnJlbnRCbG9ja1Jvd3M9PW90aGVyLnJvd3MoKSk7CisgICAgaWYgKE90aGVyRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gRHluYW1pYykKKyAgICAgIG1feHByLnRlbXBsYXRlIGJsb2NrPE90aGVyRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUgIT0gRHluYW1pYyA/IE90aGVyRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUgOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZSAhPSBEeW5hbWljID8gT3RoZXJEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZSA6IDE+CisgICAgICAgICAgICAgICAgICAgIChtX3JvdywgbV9jb2wpID0gb3RoZXI7CisgICAgZWxzZQorICAgICAgbV94cHIuYmxvY2sobV9yb3csIG1fY29sLCBvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSkgPSBvdGhlcjsKKyAgICBtX2NvbCArPSBvdGhlci5jb2xzKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIH5Db21tYUluaXRpYWxpemVyKCkKKyAgeworICAgIGVpZ2VuX2Fzc2VydCgobV9yb3crbV9jdXJyZW50QmxvY2tSb3dzKSA9PSBtX3hwci5yb3dzKCkKKyAgICAgICAgICYmIG1fY29sID09IG1feHByLmNvbHMoKQorICAgICAgICAgJiYgIlRvbyBmZXcgY29lZmZpY2llbnRzIHBhc3NlZCB0byBjb21tYSBpbml0aWFsaXplciAob3BlcmF0b3I8PCkiKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgYnVpbHQgbWF0cml4IG9uY2UgYWxsIGl0cyBjb2VmZmljaWVudHMgaGF2ZSBiZWVuIHNldC4KKyAgICAqIENhbGxpbmcgZmluaXNoZWQgaXMgMTAwJSBvcHRpb25hbC4gSXRzIHB1cnBvc2UgaXMgdG8gd3JpdGUgZXhwcmVzc2lvbnMKKyAgICAqIGxpa2UgdGhpczoKKyAgICAqIFxjb2RlCisgICAgKiBxdWF0ZXJuaW9uLmZyb21Sb3RhdGlvbk1hdHJpeCgoTWF0cml4M2YoKSA8PCBheGlzMCwgYXhpczEsIGF4aXMyKS5maW5pc2hlZCgpKTsKKyAgICAqIFxlbmRjb2RlCisgICAgKi8KKyAgaW5saW5lIFhwclR5cGUmIGZpbmlzaGVkKCkgeyByZXR1cm4gbV94cHI7IH0KKworICBYcHJUeXBlJiBtX3hwcjsgICAvLyB0YXJnZXQgZXhwcmVzc2lvbgorICBJbmRleCBtX3JvdzsgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcm93IGlkCisgIEluZGV4IG1fY29sOyAgICAgICAgICAgICAgLy8gY3VycmVudCBjb2wgaWQKKyAgSW5kZXggbV9jdXJyZW50QmxvY2tSb3dzOyAvLyBjdXJyZW50IGJsb2NrIGhlaWdodAorfTsKKworLyoqIFxhbmNob3IgTWF0cml4QmFzZUNvbW1hSW5pdFJlZgorICAqIENvbnZlbmllbnQgb3BlcmF0b3IgdG8gc2V0IHRoZSBjb2VmZmljaWVudHMgb2YgYSBtYXRyaXguCisgICoKKyAgKiBUaGUgY29lZmZpY2llbnRzIG11c3QgYmUgcHJvdmlkZWQgaW4gYSByb3cgbWFqb3Igb3JkZXIgYW5kIGV4YWN0bHkgbWF0Y2gKKyAgKiB0aGUgc2l6ZSBvZiB0aGUgbWF0cml4LiBPdGhlcndpc2UgYW4gYXNzZXJ0aW9uIGlzIHJhaXNlZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfc2V0LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfc2V0Lm91dAorICAqCisgICogXHNhIENvbW1hSW5pdGlhbGl6ZXI6OmZpbmlzaGVkKCksIGNsYXNzIENvbW1hSW5pdGlhbGl6ZXIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgQ29tbWFJbml0aWFsaXplcjxEZXJpdmVkPiBEZW5zZUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPDwgKGNvbnN0IFNjYWxhciYgcykKK3sKKyAgcmV0dXJuIENvbW1hSW5pdGlhbGl6ZXI8RGVyaXZlZD4oKnN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKSwgcyk7Cit9CisKKy8qKiBcc2Egb3BlcmF0b3I8PChjb25zdCBTY2FsYXImKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBDb21tYUluaXRpYWxpemVyPERlcml2ZWQ+CitEZW5zZUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPDwoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICByZXR1cm4gQ29tbWFJbml0aWFsaXplcjxEZXJpdmVkPigqc3RhdGljX2Nhc3Q8RGVyaXZlZCAqPih0aGlzKSwgb3RoZXIpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTU1BSU5JVElBTElaRVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvQ3dpc2VCaW5hcnlPcC5oIGIvRWlnZW4vc3JjL0NvcmUvQ3dpc2VCaW5hcnlPcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTNhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Dd2lzZUJpbmFyeU9wLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1dJU0VfQklOQVJZX09QX0gKKyNkZWZpbmUgRUlHRU5fQ1dJU0VfQklOQVJZX09QX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBDd2lzZUJpbmFyeU9wCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBHZW5lcmljIGV4cHJlc3Npb24gd2hlcmUgYSBjb2VmZmljaWVudC13aXNlIGJpbmFyeSBvcGVyYXRvciBpcyBhcHBsaWVkIHRvIHR3byBleHByZXNzaW9ucworICAqCisgICogXHBhcmFtIEJpbmFyeU9wIHRlbXBsYXRlIGZ1bmN0b3IgaW1wbGVtZW50aW5nIHRoZSBvcGVyYXRvcgorICAqIFxwYXJhbSBMaHMgdGhlIHR5cGUgb2YgdGhlIGxlZnQtaGFuZCBzaWRlCisgICogXHBhcmFtIFJocyB0aGUgdHlwZSBvZiB0aGUgcmlnaHQtaGFuZCBzaWRlCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiAgd2hlcmUgYSBjb2VmZmljaWVudC13aXNlIGJpbmFyeSBvcGVyYXRvciBpcyBhcHBsaWVkIHRvIHR3byBleHByZXNzaW9ucy4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgYmluYXJ5IG9wZXJhdG9ycywgYnkgd2hpY2ggd2UgbWVhbiBvbmx5IHRob3NlIGJpbmFyeSBvcGVyYXRvcnMgd2hlcmUKKyAgKiBib3RoIHRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBhcmUgRWlnZW4gZXhwcmVzc2lvbnMuCisgICogRm9yIGV4YW1wbGUsIHRoZSByZXR1cm4gdHlwZSBvZiBtYXRyaXgxK21hdHJpeDIgaXMgYSBDd2lzZUJpbmFyeU9wLgorICAqCisgICogTW9zdCBvZiB0aGUgdGltZSwgdGhpcyBpcyB0aGUgb25seSB3YXkgdGhhdCBpdCBpcyB1c2VkLCBzbyB5b3UgdHlwaWNhbGx5IGRvbid0IGhhdmUgdG8gbmFtZQorICAqIEN3aXNlQmluYXJ5T3AgdHlwZXMgZXhwbGljaXRseS4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpiaW5hcnlFeHByKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmLGNvbnN0IEN1c3RvbUJpbmFyeU9wICYpIGNvbnN0LCBjbGFzcyBDd2lzZVVuYXJ5T3AsIGNsYXNzIEN3aXNlTnVsbGFyeU9wCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgdHJhaXRzPEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiA+Cit7CisgIC8vIHdlIG11c3Qgbm90IGluaGVyaXQgZnJvbSB0cmFpdHM8TGhzPiBzaW5jZSBpdCBoYXMKKyAgLy8gdGhlIHBvdGVudGlhbCB0byBjYXVzZSBwcm9ibGVtcyB3aXRoIE1TVkMKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGUgQW5jZXN0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPEFuY2VzdG9yPjo6WHByS2luZCBYcHJLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IHRyYWl0czxBbmNlc3Rvcj46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gdHJhaXRzPEFuY2VzdG9yPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSB0cmFpdHM8QW5jZXN0b3I+OjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IHRyYWl0czxBbmNlc3Rvcj46Ok1heENvbHNBdENvbXBpbGVUaW1lCisgIH07CisKKyAgLy8gZXZlbiB0aG91Z2ggd2UgcmVxdWlyZSBMaHMgYW5kIFJocyB0byBoYXZlIHRoZSBzYW1lIHNjYWxhciB0eXBlIChzZWUgQ3dpc2VCaW5hcnlPcCBjb25zdHJ1Y3RvciksCisgIC8vIHdlIHN0aWxsIHdhbnQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzIGRpZmZlcmVudC4KKyAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcCgKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTGhzOjpTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJoczo6U2NhbGFyCisgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9zdG9yYWdlX3R5cGU8dHlwZW5hbWUgdHJhaXRzPExocz46OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxSaHM+OjpTdG9yYWdlS2luZD46OnJldCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX2luZGV4X3R5cGU8dHlwZW5hbWUgdHJhaXRzPExocz46OkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8UmhzPjo6SW5kZXg+Ojp0eXBlIEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6TmVzdGVkIExoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6Ok5lc3RlZCBSaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxMaHNOZXN0ZWQ+Ojp0eXBlIF9MaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxSaHNOZXN0ZWQ+Ojp0eXBlIF9SaHNOZXN0ZWQ7CisgIGVudW0geworICAgIExoc0NvZWZmUmVhZENvc3QgPSBfTGhzTmVzdGVkOjpDb2VmZlJlYWRDb3N0LAorICAgIFJoc0NvZWZmUmVhZENvc3QgPSBfUmhzTmVzdGVkOjpDb2VmZlJlYWRDb3N0LAorICAgIExoc0ZsYWdzID0gX0xoc05lc3RlZDo6RmxhZ3MsCisgICAgUmhzRmxhZ3MgPSBfUmhzTmVzdGVkOjpGbGFncywKKyAgICBTYW1lVHlwZSA9IGlzX3NhbWU8dHlwZW5hbWUgX0xoc05lc3RlZDo6U2NhbGFyLHR5cGVuYW1lIF9SaHNOZXN0ZWQ6OlNjYWxhcj46OnZhbHVlLAorICAgIFN0b3JhZ2VPcmRlcnNBZ3JlZSA9IChpbnQoTGhzOjpGbGFncykmUm93TWFqb3JCaXQpPT0oaW50KFJoczo6RmxhZ3MpJlJvd01ham9yQml0KSwKKyAgICBGbGFnczAgPSAoaW50KExoc0ZsYWdzKSB8IGludChSaHNGbGFncykpICYgKAorICAgICAgICBIZXJlZGl0YXJ5Qml0cworICAgICAgfCAoaW50KExoc0ZsYWdzKSAmIGludChSaHNGbGFncykgJgorICAgICAgICAgICAoIEFsaWduZWRCaXQKKyAgICAgICAgICAgfCAoU3RvcmFnZU9yZGVyc0FncmVlID8gTGluZWFyQWNjZXNzQml0IDogMCkKKyAgICAgICAgICAgfCAoZnVuY3Rvcl90cmFpdHM8QmluYXJ5T3A+OjpQYWNrZXRBY2Nlc3MgJiYgU3RvcmFnZU9yZGVyc0FncmVlICYmIFNhbWVUeXBlID8gUGFja2V0QWNjZXNzQml0IDogMCkKKyAgICAgICAgICAgKQorICAgICAgICApCisgICAgICksCisgICAgRmxhZ3MgPSAoRmxhZ3MwICYgflJvd01ham9yQml0KSB8IChMaHNGbGFncyAmIFJvd01ham9yQml0KSwKKyAgICBDb2VmZlJlYWRDb3N0ID0gTGhzQ29lZmZSZWFkQ29zdCArIFJoc0NvZWZmUmVhZENvc3QgKyBmdW5jdG9yX3RyYWl0czxCaW5hcnlPcD46OkNvc3QKKyAgfTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gd2UgcmVxdWlyZSBMaHMgYW5kIFJocyB0byBoYXZlIHRoZSBzYW1lIHNjYWxhciB0eXBlLiBDdXJyZW50bHkgdGhlcmUgaXMgbm8gZXhhbXBsZSBvZiBhIGJpbmFyeSBmdW5jdG9yCisvLyB0aGF0IHdvdWxkIHRha2UgdHdvIG9wZXJhbmRzIG9mIGRpZmZlcmVudCB0eXBlcy4gSWYgdGhlcmUgd2VyZSBzdWNoIGFuIGV4YW1wbGUsIHRoZW4gdGhpcyBjaGVjayBzaG91bGQgYmUKKy8vIG1vdmVkIHRvIHRoZSBCaW5hcnlPcCBmdW5jdG9ycywgb24gYSBwZXItY2FzZSBiYXNpcy4gVGhpcyB3b3VsZCBob3dldmVyIHJlcXVpcmUgYSBjaGFuZ2UgaW4gdGhlIEJpbmFyeU9wIGZ1bmN0b3JzLCBhcworLy8gY3VycmVudGx5IHRoZXkgdGFrZSBvbmx5IG9uZSB0eXBlbmFtZSBTY2FsYXIgdGVtcGxhdGUgcGFyYW1ldGVyLgorLy8gSXQgaXMgdGVtcHRpbmcgdG8gYWx3YXlzIGFsbG93IG1peGluZyBkaWZmZXJlbnQgdHlwZXMgYnV0IHJlbWVtYmVyIHRoYXQgdGhpcyBpcyBvZnRlbiBpbXBvc3NpYmxlIGluIHRoZSB2ZWN0b3JpemVkIHBhdGhzLgorLy8gU28gYWxsb3dpbmcgbWl4aW5nIGRpZmZlcmVudCB0eXBlcyBnaXZlcyB2ZXJ5IHVuZXhwZWN0ZWQgZXJyb3JzIHdoZW4gZW5hYmxpbmcgdmVjdG9yaXphdGlvbiwgd2hlbiB0aGUgdXNlciB0cmllcyB0bworLy8gYWRkIHRvZ2V0aGVyIGEgZmxvYXQgbWF0cml4IGFuZCBhIGRvdWJsZSBtYXRyaXguCisjZGVmaW5lIEVJR0VOX0NIRUNLX0JJTkFSWV9DT01QQVRJQklMSVkoQklOT1AsTEhTLFJIUykgXAorICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6ZnVuY3Rvcl9hbGxvd3NfbWl4aW5nX3JlYWxfYW5kX2NvbXBsZXg8QklOT1A+OjpyZXQgXAorICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnQoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgTnVtVHJhaXRzPExIUz46OlJlYWwsIHR5cGVuYW1lIE51bVRyYWl0czxSSFM+OjpSZWFsPjo6dmFsdWUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KGludGVybmFsOjppc19zYW1lPExIUywgUkhTPjo6dmFsdWUpKSwgXAorICAgIFlPVV9NSVhFRF9ESUZGRVJFTlRfTlVNRVJJQ19UWVBFU19fWU9VX05FRURfVE9fVVNFX1RIRV9DQVNUX01FVEhPRF9PRl9NQVRSSVhCQVNFX1RPX0NBU1RfTlVNRVJJQ19UWVBFU19FWFBMSUNJVExZKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFN0b3JhZ2VLaW5kPgorY2xhc3MgQ3dpc2VCaW5hcnlPcEltcGw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK2NsYXNzIEN3aXNlQmluYXJ5T3AgOiBpbnRlcm5hbDo6bm9fYXNzaWdubWVudF9vcGVyYXRvciwKKyAgcHVibGljIEN3aXNlQmluYXJ5T3BJbXBsPAorICAgICAgICAgIEJpbmFyeU9wLCBMaHMsIFJocywKKyAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cHJvbW90ZV9zdG9yYWdlX3R5cGU8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxMaHM+OjpTdG9yYWdlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJocz46OlN0b3JhZ2VLaW5kPjo6cmV0PgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEN3aXNlQmluYXJ5T3BJbXBsPAorICAgICAgICBCaW5hcnlPcCwgTGhzLCBSaHMsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpwcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPExocz46OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJocz46OlN0b3JhZ2VLaW5kPjo6cmV0Pjo6QmFzZSBCYXNlOworICAgIEVJR0VOX0dFTkVSSUNfUFVCTElDX0lOVEVSRkFDRShDd2lzZUJpbmFyeU9wKQorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPExocz46OnR5cGUgTGhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxSaHM+Ojp0eXBlIFJoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfcmVmZXJlbmNlPExoc05lc3RlZD46OnR5cGUgX0xoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfcmVmZXJlbmNlPFJoc05lc3RlZD46OnR5cGUgX1Joc05lc3RlZDsKKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ3dpc2VCaW5hcnlPcChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIGNvbnN0IEJpbmFyeU9wJiBmdW5jID0gQmluYXJ5T3AoKSkKKyAgICAgIDogbV9saHMobGhzKSwgbV9yaHMocmhzKSwgbV9mdW5jdG9yKGZ1bmMpCisgICAgeworICAgICAgRUlHRU5fQ0hFQ0tfQklOQVJZX0NPTVBBVElCSUxJWShCaW5hcnlPcCx0eXBlbmFtZSBMaHM6OlNjYWxhcix0eXBlbmFtZSBSaHM6OlNjYWxhcik7CisgICAgICAvLyByZXF1aXJlIHRoZSBzaXplcyB0byBtYXRjaAorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFKExocywgUmhzKQorICAgICAgZWlnZW5fYXNzZXJ0KGxocy5yb3dzKCkgPT0gcmhzLnJvd3MoKSAmJiBsaHMuY29scygpID09IHJocy5jb2xzKCkpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93cygpIGNvbnN0IHsKKyAgICAgIC8vIHJldHVybiB0aGUgZml4ZWQgc2l6ZSB0eXBlIGlmIGF2YWlsYWJsZSB0byBlbmFibGUgY29tcGlsZSB0aW1lIG9wdGltaXphdGlvbnMKKyAgICAgIGlmIChpbnRlcm5hbDo6dHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPExoc05lc3RlZD46OnR5cGU+OjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgICAgICAgcmV0dXJuIG1fcmhzLnJvd3MoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1fbGhzLnJvd3MoKTsKKyAgICB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xzKCkgY29uc3QgeworICAgICAgLy8gcmV0dXJuIHRoZSBmaXhlZCBzaXplIHR5cGUgaWYgYXZhaWxhYmxlIHRvIGVuYWJsZSBjb21waWxlIHRpbWUgb3B0aW1pemF0aW9ucworICAgICAgaWYgKGludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TGhzTmVzdGVkPjo6dHlwZT46OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICAgICAgICByZXR1cm4gbV9yaHMuY29scygpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbV9saHMuY29scygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbGVmdCBoYW5kIHNpZGUgbmVzdGVkIGV4cHJlc3Npb24gKi8KKyAgICBjb25zdCBfTGhzTmVzdGVkJiBsaHMoKSBjb25zdCB7IHJldHVybiBtX2xoczsgfQorICAgIC8qKiBccmV0dXJucyB0aGUgcmlnaHQgaGFuZCBzaWRlIG5lc3RlZCBleHByZXNzaW9uICovCisgICAgY29uc3QgX1Joc05lc3RlZCYgcmhzKCkgY29uc3QgeyByZXR1cm4gbV9yaHM7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIGZ1bmN0b3IgcmVwcmVzZW50aW5nIHRoZSBiaW5hcnkgb3BlcmF0aW9uICovCisgICAgY29uc3QgQmluYXJ5T3AmIGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3I7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTGhzTmVzdGVkIG1fbGhzOworICAgIFJoc05lc3RlZCBtX3JoczsKKyAgICBjb25zdCBCaW5hcnlPcCBtX2Z1bmN0b3I7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitjbGFzcyBDd2lzZUJpbmFyeU9wSW1wbDxCaW5hcnlPcCwgTGhzLCBSaHMsIERlbnNlPgorICA6IHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8Q3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGhzLCBSaHM+ID46OnR5cGUKK3sKKyAgICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiBEZXJpdmVkOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gPjo6dHlwZSBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoIERlcml2ZWQgKQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5mdW5jdG9yKCkoZGVyaXZlZCgpLmxocygpLmNvZWZmKHJvdywgY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQoKS5yaHMoKS5jb2VmZihyb3csIGNvbCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5mdW5jdG9yKCkucGFja2V0T3AoZGVyaXZlZCgpLmxocygpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4ocm93LCBjb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZCgpLnJocygpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4ocm93LCBjb2wpKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmZ1bmN0b3IoKShkZXJpdmVkKCkubGhzKCkuY29lZmYoaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZCgpLnJocygpLmNvZWZmKGluZGV4KSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmZ1bmN0b3IoKS5wYWNrZXRPcChkZXJpdmVkKCkubGhzKCkudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJpdmVkKCkucmhzKCkudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCkpOworICAgIH0KK307CisKKy8qKiByZXBsYWNlcyBcYyAqdGhpcyBieSBcYyAqdGhpcyAtIFxhIG90aGVyLgorICAqCisgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQgJgorTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3ItPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBTZWxmQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyPiwgRGVyaXZlZCwgT3RoZXJEZXJpdmVkPiB0bXAoZGVyaXZlZCgpKTsKKyAgdG1wID0gb3RoZXIuZGVyaXZlZCgpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogcmVwbGFjZXMgXGMgKnRoaXMgYnkgXGMgKnRoaXMgKyBcYSBvdGhlci4KKyAgKgorICAqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkICYKK01hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKz0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgU2VsZkN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiwgRGVyaXZlZCwgT3RoZXJEZXJpdmVkPiB0bXAoZGVyaXZlZCgpKTsKKyAgdG1wID0gb3RoZXIuZGVyaXZlZCgpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NXSVNFX0JJTkFSWV9PUF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Dd2lzZU51bGxhcnlPcC5oIGIvRWlnZW4vc3JjL0NvcmUvQ3dpc2VOdWxsYXJ5T3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjM1YTYyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvQ3dpc2VOdWxsYXJ5T3AuaApAQCAtMCwwICsxLDg2NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ1dJU0VfTlVMTEFSWV9PUF9ICisjZGVmaW5lIEVJR0VOX0NXSVNFX05VTExBUllfT1BfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIEN3aXNlTnVsbGFyeU9wCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBHZW5lcmljIGV4cHJlc3Npb24gb2YgYSBtYXRyaXggd2hlcmUgYWxsIGNvZWZmaWNpZW50cyBhcmUgZGVmaW5lZCBieSBhIGZ1bmN0b3IKKyAgKgorICAqIFxwYXJhbSBOdWxsYXJ5T3AgdGVtcGxhdGUgZnVuY3RvciBpbXBsZW1lbnRpbmcgdGhlIG9wZXJhdG9yCisgICogXHBhcmFtIFBsYWluT2JqZWN0VHlwZSB0aGUgdW5kZXJseWluZyBwbGFpbiBtYXRyaXgvYXJyYXkgdHlwZQorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2YgYSBnZW5lcmljIG51bGxhcnkgb3BlcmF0b3IuCisgICogSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBPbmVzKCksIFplcm8oKSwgQ29uc3RhbnQoKSwgSWRlbnRpdHkoKSBhbmQgUmFuZG9tKCkgbWV0aG9kcywKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogSG93ZXZlciwgaWYgeW91IHdhbnQgdG8gd3JpdGUgYSBmdW5jdGlvbiByZXR1cm5pbmcgc3VjaCBhbiBleHByZXNzaW9uLCB5b3UKKyAgKiB3aWxsIG5lZWQgdG8gdXNlIHRoaXMgY2xhc3MuCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBjbGFzcyBDd2lzZUJpbmFyeU9wLCBEZW5zZUJhc2U6Ok51bGxhcnlFeHByKCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE51bGxhcnlPcCwgdHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPgorc3RydWN0IHRyYWl0czxDd2lzZU51bGxhcnlPcDxOdWxsYXJ5T3AsIFBsYWluT2JqZWN0VHlwZT4gPiA6IHRyYWl0czxQbGFpbk9iamVjdFR5cGU+Cit7CisgIGVudW0geworICAgIEZsYWdzID0gKHRyYWl0czxQbGFpbk9iamVjdFR5cGU+OjpGbGFncworICAgICAgJiAoICBIZXJlZGl0YXJ5Qml0cworICAgICAgICAgfCAoZnVuY3Rvcl9oYXNfbGluZWFyX2FjY2VzczxOdWxsYXJ5T3A+OjpyZXQgPyBMaW5lYXJBY2Nlc3NCaXQgOiAwKQorICAgICAgICAgfCAoZnVuY3Rvcl90cmFpdHM8TnVsbGFyeU9wPjo6UGFja2V0QWNjZXNzID8gUGFja2V0QWNjZXNzQml0IDogMCkpKQorICAgICAgfCAoZnVuY3Rvcl90cmFpdHM8TnVsbGFyeU9wPjo6SXNSZXBlYXRhYmxlID8gMCA6IEV2YWxCZWZvcmVOZXN0aW5nQml0KSwKKyAgICBDb2VmZlJlYWRDb3N0ID0gZnVuY3Rvcl90cmFpdHM8TnVsbGFyeU9wPjo6Q29zdAorICB9OworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTnVsbGFyeU9wLCB0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+CitjbGFzcyBDd2lzZU51bGxhcnlPcCA6IGludGVybmFsOjpub19hc3NpZ25tZW50X29wZXJhdG9yLAorICBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPCBDd2lzZU51bGxhcnlPcDxOdWxsYXJ5T3AsIFBsYWluT2JqZWN0VHlwZT4gPjo6dHlwZQoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxDd2lzZU51bGxhcnlPcD46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKEN3aXNlTnVsbGFyeU9wKQorCisgICAgQ3dpc2VOdWxsYXJ5T3AoSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgTnVsbGFyeU9wJiBmdW5jID0gTnVsbGFyeU9wKCkpCisgICAgICA6IG1fcm93cyhyb3dzKSwgbV9jb2xzKGNvbHMpLCBtX2Z1bmN0b3IoZnVuYykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQocm93cyA+PSAwCisgICAgICAgICAgICAmJiAoUm93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyB8fCBSb3dzQXRDb21waWxlVGltZSA9PSByb3dzKQorICAgICAgICAgICAgJiYgIGNvbHMgPj0gMAorICAgICAgICAgICAgJiYgKENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgQ29sc0F0Q29tcGlsZVRpbWUgPT0gY29scykpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fcm93cy52YWx1ZSgpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzLnZhbHVlKCk7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZnVuY3Rvcihyb3dzLCBjb2xzKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2Z1bmN0b3IucGFja2V0T3Aocm93LCBjb2wpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2Z1bmN0b3IoaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZnVuY3Rvci5wYWNrZXRPcChpbmRleCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBmdW5jdG9yIHJlcHJlc2VudGluZyB0aGUgbnVsbGFyeSBvcGVyYXRpb24gKi8KKyAgICBjb25zdCBOdWxsYXJ5T3AmIGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3I7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIFJvd3NBdENvbXBpbGVUaW1lPiBtX3Jvd3M7CisgICAgY29uc3QgaW50ZXJuYWw6OnZhcmlhYmxlX2lmX2R5bmFtaWM8SW5kZXgsIENvbHNBdENvbXBpbGVUaW1lPiBtX2NvbHM7CisgICAgY29uc3QgTnVsbGFyeU9wIG1fZnVuY3RvcjsKK307CisKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBtYXRyaXggZGVmaW5lZCBieSBhIGN1c3RvbSBmdW5jdG9yIFxhIGZ1bmMKKyAgKgorICAqIFRoZSBwYXJhbWV0ZXJzIFxhIHJvd3MgYW5kIFxhIGNvbHMgYXJlIHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgb2YgY29sdW1ucyBvZgorICAqIHRoZSByZXR1cm5lZCBtYXRyaXguIE11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgTWF0cml4QmFzZSB0eXBlLgorICAqCisgICogVGhpcyB2YXJpYW50IGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIGR5bmFtaWMtc2l6ZSBtYXRyaXggdHlwZXMuIEZvciBmaXhlZC1zaXplIHR5cGVzLAorICAqIGl0IGlzIHJlZHVuZGFudCB0byBwYXNzIFxhIHJvd3MgYW5kIFxhIGNvbHMgYXMgYXJndW1lbnRzLCBzbyBaZXJvKCkgc2hvdWxkIGJlIHVzZWQKKyAgKiBpbnN0ZWFkLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBDdXN0b21OdWxsYXJ5T3AgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0b3IuCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21OdWxsYXJ5T3A+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgRGVyaXZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgQ3VzdG9tTnVsbGFyeU9wJiBmdW5jKQoreworICByZXR1cm4gQ3dpc2VOdWxsYXJ5T3A8Q3VzdG9tTnVsbGFyeU9wLCBEZXJpdmVkPihyb3dzLCBjb2xzLCBmdW5jKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBtYXRyaXggZGVmaW5lZCBieSBhIGN1c3RvbSBmdW5jdG9yIFxhIGZ1bmMKKyAgKgorICAqIFRoZSBwYXJhbWV0ZXIgXGEgc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuZWQgdmVjdG9yLgorICAqIE11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgTWF0cml4QmFzZSB0eXBlLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBkeW5hbWljLXNpemUgdmVjdG9yIHR5cGVzLiBGb3IgZml4ZWQtc2l6ZSB0eXBlcywKKyAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyBcYSBzaXplIGFzIGFyZ3VtZW50LCBzbyBaZXJvKCkgc2hvdWxkIGJlIHVzZWQKKyAgKiBpbnN0ZWFkLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBDdXN0b21OdWxsYXJ5T3AgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0b3IuCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21OdWxsYXJ5T3A+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgRGVyaXZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoSW5kZXggc2l6ZSwgY29uc3QgQ3VzdG9tTnVsbGFyeU9wJiBmdW5jKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIGlmKFJvd3NBdENvbXBpbGVUaW1lID09IDEpIHJldHVybiBDd2lzZU51bGxhcnlPcDxDdXN0b21OdWxsYXJ5T3AsIERlcml2ZWQ+KDEsIHNpemUsIGZ1bmMpOworICBlbHNlIHJldHVybiBDd2lzZU51bGxhcnlPcDxDdXN0b21OdWxsYXJ5T3AsIERlcml2ZWQ+KHNpemUsIDEsIGZ1bmMpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIG1hdHJpeCBkZWZpbmVkIGJ5IGEgY3VzdG9tIGZ1bmN0b3IgXGEgZnVuYworICAqCisgICogVGhpcyB2YXJpYW50IGlzIG9ubHkgZm9yIGZpeGVkLXNpemUgRGVuc2VCYXNlIHR5cGVzLiBGb3IgZHluYW1pYy1zaXplIHR5cGVzLCB5b3UKKyAgKiBuZWVkIHRvIHVzZSB0aGUgdmFyaWFudHMgdGFraW5nIHNpemUgYXJndW1lbnRzLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBDdXN0b21OdWxsYXJ5T3AgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0b3IuCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21OdWxsYXJ5T3A+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgRGVyaXZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoY29uc3QgQ3VzdG9tTnVsbGFyeU9wJiBmdW5jKQoreworICByZXR1cm4gQ3dpc2VOdWxsYXJ5T3A8Q3VzdG9tTnVsbGFyeU9wLCBEZXJpdmVkPihSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIGZ1bmMpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIGNvbnN0YW50IG1hdHJpeCBvZiB2YWx1ZSBcYSB2YWx1ZQorICAqCisgICogVGhlIHBhcmFtZXRlcnMgXGEgcm93cyBhbmQgXGEgY29scyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGFuZCBvZiBjb2x1bW5zIG9mCisgICogdGhlIHJldHVybmVkIG1hdHJpeC4gTXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBEZW5zZUJhc2UgdHlwZS4KKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBkeW5hbWljLXNpemUgbWF0cml4IHR5cGVzLiBGb3IgZml4ZWQtc2l6ZSB0eXBlcywKKyAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyBcYSByb3dzIGFuZCBcYSBjb2xzIGFzIGFyZ3VtZW50cywgc28gWmVybygpIHNob3VsZCBiZSB1c2VkCisgICogaW5zdGVhZC4KKyAgKgorICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgQ3VzdG9tTnVsbGFyeU9wIGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdG9yLgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlTnVsbGFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdGFudChJbmRleCByb3dzLCBJbmRleCBjb2xzLCBjb25zdCBTY2FsYXImIHZhbHVlKQoreworICByZXR1cm4gRGVuc2VCYXNlPERlcml2ZWQ+OjpOdWxsYXJ5RXhwcihyb3dzLCBjb2xzLCBpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4odmFsdWUpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBjb25zdGFudCBtYXRyaXggb2YgdmFsdWUgXGEgdmFsdWUKKyAgKgorICAqIFRoZSBwYXJhbWV0ZXIgXGEgc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuZWQgdmVjdG9yLgorICAqIE11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgRGVuc2VCYXNlIHR5cGUuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogVGhpcyB2YXJpYW50IGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIGR5bmFtaWMtc2l6ZSB2ZWN0b3IgdHlwZXMuIEZvciBmaXhlZC1zaXplIHR5cGVzLAorICAqIGl0IGlzIHJlZHVuZGFudCB0byBwYXNzIFxhIHNpemUgYXMgYXJndW1lbnQsIHNvIFplcm8oKSBzaG91bGQgYmUgdXNlZAorICAqIGluc3RlYWQuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIEN1c3RvbU51bGxhcnlPcCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rvci4KKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdGFudFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6Q29uc3RhbnQoSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyJiB2YWx1ZSkKK3sKKyAgcmV0dXJuIERlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoc2l6ZSwgaW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+KHZhbHVlKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgY29uc3RhbnQgbWF0cml4IG9mIHZhbHVlIFxhIHZhbHVlCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgb25seSBmb3IgZml4ZWQtc2l6ZSBEZW5zZUJhc2UgdHlwZXMuIEZvciBkeW5hbWljLXNpemUgdHlwZXMsIHlvdQorICAqIG5lZWQgdG8gdXNlIHRoZSB2YXJpYW50cyB0YWtpbmcgc2l6ZSBhcmd1bWVudHMuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIEN1c3RvbU51bGxhcnlPcCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rvci4KKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdGFudFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6Q29uc3RhbnQoY29uc3QgU2NhbGFyJiB2YWx1ZSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9GSVhFRF9TSVpFKERlcml2ZWQpCisgIHJldHVybiBEZW5zZUJhc2U8RGVyaXZlZD46Ok51bGxhcnlFeHByKFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSwgaW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+KHZhbHVlKSk7Cit9CisKKy8qKgorICAqIFxicmllZiBTZXRzIGEgbGluZWFybHkgc3BhY2UgdmVjdG9yLgorICAqCisgICogVGhlIGZ1bmN0aW9uIGdlbmVyYXRlcyAnc2l6ZScgZXF1YWxseSBzcGFjZWQgdmFsdWVzIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgW2xvdyxoaWdoXS4KKyAgKiBUaGlzIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBMaW5TcGFjZWQoKSB1c2VzIHNlcXVlbnRpYWwgYWNjZXNzLCBpLmUuIHZlY3RvciBhY2Nlc3MgaXMKKyAgKiBhc3N1bWVkIHRvIGJlIGEoMCksIGEoMSksIC4uLiwgYShzaXplKS4gVGhpcyBhc3N1bXB0aW9uIGFsbG93cyBmb3IgYmV0dGVyIHZlY3Rvcml6YXRpb24KKyAgKiBhbmQgeWllbGRzIGZhc3RlciBjb2RlIHRoYW4gdGhlIHJhbmRvbSBhY2Nlc3MgdmVyc2lvbi4KKyAgKgorICAqIFdoZW4gc2l6ZSBpcyBzZXQgdG8gMSwgYSB2ZWN0b3Igb2YgbGVuZ3RoIDEgY29udGFpbmluZyAnaGlnaCcgaXMgcmV0dXJuZWQuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgRGVuc2VCYXNlX0xpblNwYWNlZF9zZXEuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRGVuc2VCYXNlX0xpblNwYWNlZF9zZXEub3V0CisgICoKKyAgKiBcc2Egc2V0TGluU3BhY2VkKEluZGV4LGNvbnN0IFNjYWxhciYsY29uc3QgU2NhbGFyJiksIExpblNwYWNlZChJbmRleCxTY2FsYXIsU2NhbGFyKSwgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6U2VxdWVudGlhbExpblNwYWNlZFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6TGluU3BhY2VkKFNlcXVlbnRpYWxfdCwgSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gRGVuc2VCYXNlPERlcml2ZWQ+OjpOdWxsYXJ5RXhwcihzaXplLCBpbnRlcm5hbDo6bGluc3BhY2VkX29wPFNjYWxhcixmYWxzZT4obG93LGhpZ2gsc2l6ZSkpOworfQorCisvKioKKyAgKiBcY29weWRvYyBEZW5zZUJhc2U6OkxpblNwYWNlZChTZXF1ZW50aWFsX3QsIEluZGV4LCBjb25zdCBTY2FsYXImLCBjb25zdCBTY2FsYXImKQorICAqIFNwZWNpYWwgdmVyc2lvbiBmb3IgZml4ZWQgc2l6ZSB0eXBlcyB3aGljaCBkb2VzIG5vdCByZXF1aXJlIHRoZSBzaXplIHBhcmFtZXRlci4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6U2VxdWVudGlhbExpblNwYWNlZFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6TGluU3BhY2VkKFNlcXVlbnRpYWxfdCwgY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUX0ZJWEVEX1NJWkUoRGVyaXZlZCkKKyAgcmV0dXJuIERlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUsIGludGVybmFsOjpsaW5zcGFjZWRfb3A8U2NhbGFyLGZhbHNlPihsb3csaGlnaCxEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSkpOworfQorCisvKioKKyAgKiBcYnJpZWYgU2V0cyBhIGxpbmVhcmx5IHNwYWNlIHZlY3Rvci4KKyAgKgorICAqIFRoZSBmdW5jdGlvbiBnZW5lcmF0ZXMgJ3NpemUnIGVxdWFsbHkgc3BhY2VkIHZhbHVlcyBpbiB0aGUgY2xvc2VkIGludGVydmFsIFtsb3csaGlnaF0uCisgICogV2hlbiBzaXplIGlzIHNldCB0byAxLCBhIHZlY3RvciBvZiBsZW5ndGggMSBjb250YWluaW5nICdoaWdoJyBpcyByZXR1cm5lZC4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBEZW5zZUJhc2VfTGluU3BhY2VkLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIERlbnNlQmFzZV9MaW5TcGFjZWQub3V0CisgICoKKyAgKiBcc2Egc2V0TGluU3BhY2VkKEluZGV4LGNvbnN0IFNjYWxhciYsY29uc3QgU2NhbGFyJiksIExpblNwYWNlZChTZXF1ZW50aWFsX3QsSW5kZXgsY29uc3QgU2NhbGFyJixjb25zdCBTY2FsYXImLEluZGV4KSwgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6UmFuZG9tQWNjZXNzTGluU3BhY2VkUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpMaW5TcGFjZWQoSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gRGVuc2VCYXNlPERlcml2ZWQ+OjpOdWxsYXJ5RXhwcihzaXplLCBpbnRlcm5hbDo6bGluc3BhY2VkX29wPFNjYWxhcix0cnVlPihsb3csaGlnaCxzaXplKSk7Cit9CisKKy8qKgorICAqIFxjb3B5ZG9jIERlbnNlQmFzZTo6TGluU3BhY2VkKEluZGV4LCBjb25zdCBTY2FsYXImLCBjb25zdCBTY2FsYXImKQorICAqIFNwZWNpYWwgdmVyc2lvbiBmb3IgZml4ZWQgc2l6ZSB0eXBlcyB3aGljaCBkb2VzIG5vdCByZXF1aXJlIHRoZSBzaXplIHBhcmFtZXRlci4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6UmFuZG9tQWNjZXNzTGluU3BhY2VkUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpMaW5TcGFjZWQoY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUX0ZJWEVEX1NJWkUoRGVyaXZlZCkKKyAgcmV0dXJuIERlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUsIGludGVybmFsOjpsaW5zcGFjZWRfb3A8U2NhbGFyLHRydWU+KGxvdyxoaWdoLERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lKSk7Cit9CisKKy8qKiBccmV0dXJucyB0cnVlIGlmIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBtYXRyaXggYXJlIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgdmFsdWUsIHRvIHdpdGhpbiBwcmVjaXNpb24gXGEgcHJlYyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGVuc2VCYXNlPERlcml2ZWQ+Ojppc0FwcHJveFRvQ29uc3RhbnQKKyhjb25zdCBTY2FsYXImIHZhbHVlLCBSZWFsU2NhbGFyIHByZWMpIGNvbnN0Cit7CisgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHJvd3MoKTsgKytpKQorICAgICAgaWYoIWludGVybmFsOjppc0FwcHJveCh0aGlzLT5jb2VmZihpLCBqKSwgdmFsdWUsIHByZWMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvKiogVGhpcyBpcyBqdXN0IGFuIGFsaWFzIGZvciBpc0FwcHJveFRvQ29uc3RhbnQoKS4KKyAgKgorICAqIFxyZXR1cm5zIHRydWUgaWYgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIG1hdHJpeCBhcmUgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSB2YWx1ZSwgdG8gd2l0aGluIHByZWNpc2lvbiBcYSBwcmVjICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEZW5zZUJhc2U8RGVyaXZlZD46OmlzQ29uc3RhbnQKKyhjb25zdCBTY2FsYXImIHZhbHVlLCBSZWFsU2NhbGFyIHByZWMpIGNvbnN0Cit7CisgIHJldHVybiBpc0FwcHJveFRvQ29uc3RhbnQodmFsdWUsIHByZWMpOworfQorCisvKiogQWxpYXMgZm9yIHNldENvbnN0YW50KCk6IHNldHMgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIGV4cHJlc3Npb24gdG8gXGEgdmFsdWUuCisgICoKKyAgKiBcc2Egc2V0Q29uc3RhbnQoKSwgQ29uc3RhbnQoKSwgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgRGVuc2VCYXNlPERlcml2ZWQ+OjpmaWxsKGNvbnN0IFNjYWxhciYgdmFsdWUpCit7CisgIHNldENvbnN0YW50KHZhbHVlKTsKK30KKworLyoqIFNldHMgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIGV4cHJlc3Npb24gdG8gXGEgdmFsdWUuCisgICoKKyAgKiBcc2EgZmlsbCgpLCBzZXRDb25zdGFudChJbmRleCxjb25zdCBTY2FsYXImKSwgc2V0Q29uc3RhbnQoSW5kZXgsSW5kZXgsY29uc3QgU2NhbGFyJiksIHNldFplcm8oKSwgc2V0T25lcygpLCBDb25zdGFudCgpLCBjbGFzcyBDd2lzZU51bGxhcnlPcCwgc2V0WmVybygpLCBzZXRPbmVzKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6c2V0Q29uc3RhbnQoY29uc3QgU2NhbGFyJiB2YWx1ZSkKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKSA9IENvbnN0YW50KHJvd3MoKSwgY29scygpLCB2YWx1ZSk7Cit9CisKKy8qKiBSZXNpemVzIHRvIHRoZSBnaXZlbiBcYSBzaXplLCBhbmQgc2V0cyBhbGwgY29lZmZpY2llbnRzIGluIHRoaXMgZXhwcmVzc2lvbiB0byB0aGUgZ2l2ZW4gXGEgdmFsdWUuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3NldENvbnN0YW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhfc2V0Q29uc3RhbnRfaW50Lm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnNldENvbnN0YW50KGNvbnN0IFNjYWxhciYpLCBzZXRDb25zdGFudChJbmRleCxJbmRleCxjb25zdCBTY2FsYXImKSwgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIE1hdHJpeEJhc2U6OkNvbnN0YW50KGNvbnN0IFNjYWxhciYpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJgorUGxhaW5PYmplY3RCYXNlPERlcml2ZWQ+OjpzZXRDb25zdGFudChJbmRleCBzaXplLCBjb25zdCBTY2FsYXImIHZhbHVlKQoreworICByZXNpemUoc2l6ZSk7CisgIHJldHVybiBzZXRDb25zdGFudCh2YWx1ZSk7Cit9CisKKy8qKiBSZXNpemVzIHRvIHRoZSBnaXZlbiBzaXplLCBhbmQgc2V0cyBhbGwgY29lZmZpY2llbnRzIGluIHRoaXMgZXhwcmVzc2lvbiB0byB0aGUgZ2l2ZW4gXGEgdmFsdWUuCisgICoKKyAgKiBccGFyYW0gcm93cyB0aGUgbmV3IG51bWJlciBvZiByb3dzCisgICogXHBhcmFtIGNvbHMgdGhlIG5ldyBudW1iZXIgb2YgY29sdW1ucworICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gd2hpY2ggYWxsIGNvZWZmaWNpZW50cyBhcmUgc2V0CisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhfc2V0Q29uc3RhbnRfaW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhfc2V0Q29uc3RhbnRfaW50X2ludC5vdXQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpzZXRDb25zdGFudChjb25zdCBTY2FsYXImKSwgc2V0Q29uc3RhbnQoSW5kZXgsY29uc3QgU2NhbGFyJiksIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBNYXRyaXhCYXNlOjpDb25zdGFudChjb25zdCBTY2FsYXImKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYKK1BsYWluT2JqZWN0QmFzZTxEZXJpdmVkPjo6c2V0Q29uc3RhbnQoSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgU2NhbGFyJiB2YWx1ZSkKK3sKKyAgcmVzaXplKHJvd3MsIGNvbHMpOworICByZXR1cm4gc2V0Q29uc3RhbnQodmFsdWUpOworfQorCisvKioKKyAgKiBcYnJpZWYgU2V0cyBhIGxpbmVhcmx5IHNwYWNlIHZlY3Rvci4KKyAgKgorICAqIFRoZSBmdW5jdGlvbiBnZW5lcmF0ZXMgJ3NpemUnIGVxdWFsbHkgc3BhY2VkIHZhbHVlcyBpbiB0aGUgY2xvc2VkIGludGVydmFsIFtsb3csaGlnaF0uCisgICogV2hlbiBzaXplIGlzIHNldCB0byAxLCBhIHZlY3RvciBvZiBsZW5ndGggMSBjb250YWluaW5nICdoaWdoJyBpcyByZXR1cm5lZC4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBEZW5zZUJhc2Vfc2V0TGluU3BhY2VkLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIERlbnNlQmFzZV9zZXRMaW5TcGFjZWQub3V0CisgICoKKyAgKiBcc2EgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6c2V0TGluU3BhY2VkKEluZGV4IHNpemUsIGNvbnN0IFNjYWxhciYgbG93LCBjb25zdCBTY2FsYXImIGhpZ2gpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIGRlcml2ZWQoKSA9IERlcml2ZWQ6Ok51bGxhcnlFeHByKHNpemUsIGludGVybmFsOjpsaW5zcGFjZWRfb3A8U2NhbGFyLGZhbHNlPihsb3csaGlnaCxzaXplKSk7Cit9CisKKy8qKgorICAqIFxicmllZiBTZXRzIGEgbGluZWFybHkgc3BhY2UgdmVjdG9yLgorICAqCisgICogVGhlIGZ1bmN0aW9uIGZpbGwgKnRoaXMgd2l0aCBlcXVhbGx5IHNwYWNlZCB2YWx1ZXMgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBbbG93LGhpZ2hdLgorICAqIFdoZW4gc2l6ZSBpcyBzZXQgdG8gMSwgYSB2ZWN0b3Igb2YgbGVuZ3RoIDEgY29udGFpbmluZyAnaGlnaCcgaXMgcmV0dXJuZWQuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogXHNhIHNldExpblNwYWNlZChJbmRleCwgY29uc3QgU2NhbGFyJiwgY29uc3QgU2NhbGFyJiksIEN3aXNlTnVsbGFyeU9wCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD46OnNldExpblNwYWNlZChjb25zdCBTY2FsYXImIGxvdywgY29uc3QgU2NhbGFyJiBoaWdoKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIHJldHVybiBzZXRMaW5TcGFjZWQoc2l6ZSgpLCBsb3csIGhpZ2gpOworfQorCisvLyB6ZXJvOgorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIHplcm8gbWF0cml4LgorICAqCisgICogVGhlIHBhcmFtZXRlcnMgXGEgcm93cyBhbmQgXGEgY29scyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGFuZCBvZiBjb2x1bW5zIG9mCisgICogdGhlIHJldHVybmVkIG1hdHJpeC4gTXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBNYXRyaXhCYXNlIHR5cGUuCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgZHluYW1pYy1zaXplIG1hdHJpeCB0eXBlcy4gRm9yIGZpeGVkLXNpemUgdHlwZXMsCisgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgXGEgcm93cyBhbmQgXGEgY29scyBhcyBhcmd1bWVudHMsIHNvIFplcm8oKSBzaG91bGQgYmUgdXNlZAorICAqIGluc3RlYWQuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3plcm9faW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3plcm9faW50X2ludC5vdXQKKyAgKgorICAqIFxzYSBaZXJvKCksIFplcm8oSW5kZXgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpaZXJvKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCit7CisgIHJldHVybiBDb25zdGFudChyb3dzLCBjb2xzLCBTY2FsYXIoMCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIHplcm8gdmVjdG9yLgorICAqCisgICogVGhlIHBhcmFtZXRlciBcYSBzaXplIGlzIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCB2ZWN0b3IuCisgICogTXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBNYXRyaXhCYXNlIHR5cGUuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogVGhpcyB2YXJpYW50IGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIGR5bmFtaWMtc2l6ZSB2ZWN0b3IgdHlwZXMuIEZvciBmaXhlZC1zaXplIHR5cGVzLAorICAqIGl0IGlzIHJlZHVuZGFudCB0byBwYXNzIFxhIHNpemUgYXMgYXJndW1lbnQsIHNvIFplcm8oKSBzaG91bGQgYmUgdXNlZAorICAqIGluc3RlYWQuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3plcm9faW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfemVyb19pbnQub3V0CisgICoKKyAgKiBcc2EgWmVybygpLCBaZXJvKEluZGV4LEluZGV4KQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdGFudFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6WmVybyhJbmRleCBzaXplKQoreworICByZXR1cm4gQ29uc3RhbnQoc2l6ZSwgU2NhbGFyKDApKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBmaXhlZC1zaXplIHplcm8gbWF0cml4IG9yIHZlY3Rvci4KKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBvbmx5IGZvciBmaXhlZC1zaXplIE1hdHJpeEJhc2UgdHlwZXMuIEZvciBkeW5hbWljLXNpemUgdHlwZXMsIHlvdQorICAqIG5lZWQgdG8gdXNlIHRoZSB2YXJpYW50cyB0YWtpbmcgc2l6ZSBhcmd1bWVudHMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3plcm8uY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV96ZXJvLm91dAorICAqCisgICogXHNhIFplcm8oSW5kZXgpLCBaZXJvKEluZGV4LEluZGV4KQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdGFudFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6WmVybygpCit7CisgIHJldHVybiBDb25zdGFudChTY2FsYXIoMCkpOworfQorCisvKiogXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIHRoZSB6ZXJvIG1hdHJpeCwKKyAgKiAgICAgICAgICB3aXRoaW4gdGhlIHByZWNpc2lvbiBnaXZlbiBieSBcYSBwcmVjLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9pc1plcm8uY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9pc1plcm8ub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIFplcm8oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGVuc2VCYXNlPERlcml2ZWQ+Ojppc1plcm8oUmVhbFNjYWxhciBwcmVjKSBjb25zdAoreworICBmb3IoSW5kZXggaiA9IDA7IGogPCBjb2xzKCk7ICsraikKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCByb3dzKCk7ICsraSkKKyAgICAgIGlmKCFpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4odGhpcy0+Y29lZmYoaSwgaiksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSksIHByZWMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvKiogU2V0cyBhbGwgY29lZmZpY2llbnRzIGluIHRoaXMgZXhwcmVzc2lvbiB0byB6ZXJvLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9zZXRaZXJvLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfc2V0WmVyby5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcCwgWmVybygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD46OnNldFplcm8oKQoreworICByZXR1cm4gc2V0Q29uc3RhbnQoU2NhbGFyKDApKTsKK30KKworLyoqIFJlc2l6ZXMgdG8gdGhlIGdpdmVuIFxhIHNpemUsIGFuZCBzZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIHplcm8uCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3NldFplcm9faW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9zZXRaZXJvX2ludC5vdXQKKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OnNldFplcm8oKSwgc2V0WmVybyhJbmRleCxJbmRleCksIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBEZW5zZUJhc2U6Olplcm8oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYKK1BsYWluT2JqZWN0QmFzZTxEZXJpdmVkPjo6c2V0WmVybyhJbmRleCBzaXplKQoreworICByZXNpemUoc2l6ZSk7CisgIHJldHVybiBzZXRDb25zdGFudChTY2FsYXIoMCkpOworfQorCisvKiogUmVzaXplcyB0byB0aGUgZ2l2ZW4gc2l6ZSwgYW5kIHNldHMgYWxsIGNvZWZmaWNpZW50cyBpbiB0aGlzIGV4cHJlc3Npb24gdG8gemVyby4KKyAgKgorICAqIFxwYXJhbSByb3dzIHRoZSBuZXcgbnVtYmVyIG9mIHJvd3MKKyAgKiBccGFyYW0gY29scyB0aGUgbmV3IG51bWJlciBvZiBjb2x1bW5zCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhfc2V0WmVyb19pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9zZXRaZXJvX2ludF9pbnQub3V0CisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpzZXRaZXJvKCksIHNldFplcm8oSW5kZXgpLCBjbGFzcyBDd2lzZU51bGxhcnlPcCwgRGVuc2VCYXNlOjpaZXJvKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmCitQbGFpbk9iamVjdEJhc2U8RGVyaXZlZD46OnNldFplcm8oSW5kZXggcm93cywgSW5kZXggY29scykKK3sKKyAgcmVzaXplKHJvd3MsIGNvbHMpOworICByZXR1cm4gc2V0Q29uc3RhbnQoU2NhbGFyKDApKTsKK30KKworLy8gb25lczoKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBtYXRyaXggd2hlcmUgYWxsIGNvZWZmaWNpZW50cyBlcXVhbCBvbmUuCisgICoKKyAgKiBUaGUgcGFyYW1ldGVycyBcYSByb3dzIGFuZCBcYSBjb2xzIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIG9mIGNvbHVtbnMgb2YKKyAgKiB0aGUgcmV0dXJuZWQgbWF0cml4LiBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIE1hdHJpeEJhc2UgdHlwZS4KKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBkeW5hbWljLXNpemUgbWF0cml4IHR5cGVzLiBGb3IgZml4ZWQtc2l6ZSB0eXBlcywKKyAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyBcYSByb3dzIGFuZCBcYSBjb2xzIGFzIGFyZ3VtZW50cywgc28gT25lcygpIHNob3VsZCBiZSB1c2VkCisgICogaW5zdGVhZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfb25lc19pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfb25lc19pbnRfaW50Lm91dAorICAqCisgICogXHNhIE9uZXMoKSwgT25lcyhJbmRleCksIGlzT25lcygpLCBjbGFzcyBPbmVzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpPbmVzKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCit7CisgIHJldHVybiBDb25zdGFudChyb3dzLCBjb2xzLCBTY2FsYXIoMSkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIHZlY3RvciB3aGVyZSBhbGwgY29lZmZpY2llbnRzIGVxdWFsIG9uZS4KKyAgKgorICAqIFRoZSBwYXJhbWV0ZXIgXGEgc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuZWQgdmVjdG9yLgorICAqIE11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgTWF0cml4QmFzZSB0eXBlLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBkeW5hbWljLXNpemUgdmVjdG9yIHR5cGVzLiBGb3IgZml4ZWQtc2l6ZSB0eXBlcywKKyAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyBcYSBzaXplIGFzIGFyZ3VtZW50LCBzbyBPbmVzKCkgc2hvdWxkIGJlIHVzZWQKKyAgKiBpbnN0ZWFkLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9vbmVzX2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX29uZXNfaW50Lm91dAorICAqCisgICogXHNhIE9uZXMoKSwgT25lcyhJbmRleCxJbmRleCksIGlzT25lcygpLCBjbGFzcyBPbmVzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0YW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpPbmVzKEluZGV4IHNpemUpCit7CisgIHJldHVybiBDb25zdGFudChzaXplLCBTY2FsYXIoMSkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIGZpeGVkLXNpemUgbWF0cml4IG9yIHZlY3RvciB3aGVyZSBhbGwgY29lZmZpY2llbnRzIGVxdWFsIG9uZS4KKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBvbmx5IGZvciBmaXhlZC1zaXplIE1hdHJpeEJhc2UgdHlwZXMuIEZvciBkeW5hbWljLXNpemUgdHlwZXMsIHlvdQorICAqIG5lZWQgdG8gdXNlIHRoZSB2YXJpYW50cyB0YWtpbmcgc2l6ZSBhcmd1bWVudHMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX29uZXMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9vbmVzLm91dAorICAqCisgICogXHNhIE9uZXMoSW5kZXgpLCBPbmVzKEluZGV4LEluZGV4KSwgaXNPbmVzKCksIGNsYXNzIE9uZXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6Q29uc3RhbnRSZXR1cm5UeXBlCitEZW5zZUJhc2U8RGVyaXZlZD46Ok9uZXMoKQoreworICByZXR1cm4gQ29uc3RhbnQoU2NhbGFyKDEpKTsKK30KKworLyoqIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byB0aGUgbWF0cml4IHdoZXJlIGFsbCBjb2VmZmljaWVudHMKKyAgKiAgICAgICAgICBhcmUgZXF1YWwgdG8gMSwgd2l0aGluIHRoZSBwcmVjaXNpb24gZ2l2ZW4gYnkgXGEgcHJlYy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfaXNPbmVzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfaXNPbmVzLm91dAorICAqCisgICogXHNhIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBPbmVzKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERlbnNlQmFzZTxEZXJpdmVkPjo6aXNPbmVzCisoUmVhbFNjYWxhciBwcmVjKSBjb25zdAoreworICByZXR1cm4gaXNBcHByb3hUb0NvbnN0YW50KFNjYWxhcigxKSwgcHJlYyk7Cit9CisKKy8qKiBTZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIG9uZS4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfc2V0T25lcy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3NldE9uZXMub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIE9uZXMoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+OjpzZXRPbmVzKCkKK3sKKyAgcmV0dXJuIHNldENvbnN0YW50KFNjYWxhcigxKSk7Cit9CisKKy8qKiBSZXNpemVzIHRvIHRoZSBnaXZlbiBcYSBzaXplLCBhbmQgc2V0cyBhbGwgY29lZmZpY2llbnRzIGluIHRoaXMgZXhwcmVzc2lvbiB0byBvbmUuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3NldE9uZXNfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9zZXRPbmVzX2ludC5vdXQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpzZXRPbmVzKCksIHNldE9uZXMoSW5kZXgsSW5kZXgpLCBjbGFzcyBDd2lzZU51bGxhcnlPcCwgTWF0cml4QmFzZTo6T25lcygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJgorUGxhaW5PYmplY3RCYXNlPERlcml2ZWQ+OjpzZXRPbmVzKEluZGV4IHNpemUpCit7CisgIHJlc2l6ZShzaXplKTsKKyAgcmV0dXJuIHNldENvbnN0YW50KFNjYWxhcigxKSk7Cit9CisKKy8qKiBSZXNpemVzIHRvIHRoZSBnaXZlbiBzaXplLCBhbmQgc2V0cyBhbGwgY29lZmZpY2llbnRzIGluIHRoaXMgZXhwcmVzc2lvbiB0byBvbmUuCisgICoKKyAgKiBccGFyYW0gcm93cyB0aGUgbmV3IG51bWJlciBvZiByb3dzCisgICogXHBhcmFtIGNvbHMgdGhlIG5ldyBudW1iZXIgb2YgY29sdW1ucworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3NldE9uZXNfaW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhfc2V0T25lc19pbnRfaW50Lm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnNldE9uZXMoKSwgc2V0T25lcyhJbmRleCksIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBNYXRyaXhCYXNlOjpPbmVzKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmCitQbGFpbk9iamVjdEJhc2U8RGVyaXZlZD46OnNldE9uZXMoSW5kZXggcm93cywgSW5kZXggY29scykKK3sKKyAgcmVzaXplKHJvd3MsIGNvbHMpOworICByZXR1cm4gc2V0Q29uc3RhbnQoU2NhbGFyKDEpKTsKK30KKworLy8gSWRlbnRpdHk6CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBpZGVudGl0eSBtYXRyaXggKG5vdCBuZWNlc3NhcmlseSBzcXVhcmUpLgorICAqCisgICogVGhlIHBhcmFtZXRlcnMgXGEgcm93cyBhbmQgXGEgY29scyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGFuZCBvZiBjb2x1bW5zIG9mCisgICogdGhlIHJldHVybmVkIG1hdHJpeC4gTXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBNYXRyaXhCYXNlIHR5cGUuCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgZHluYW1pYy1zaXplIG1hdHJpeCB0eXBlcy4gRm9yIGZpeGVkLXNpemUgdHlwZXMsCisgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgXGEgcm93cyBhbmQgXGEgY29scyBhcyBhcmd1bWVudHMsIHNvIElkZW50aXR5KCkgc2hvdWxkIGJlIHVzZWQKKyAgKiBpbnN0ZWFkLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9pZGVudGl0eV9pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfaWRlbnRpdHlfaW50X2ludC5vdXQKKyAgKgorICAqIFxzYSBJZGVudGl0eSgpLCBzZXRJZGVudGl0eSgpLCBpc0lkZW50aXR5KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OklkZW50aXR5UmV0dXJuVHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6SWRlbnRpdHkoSW5kZXggcm93cywgSW5kZXggY29scykKK3sKKyAgcmV0dXJuIERlbnNlQmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIocm93cywgY29scywgaW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+KCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgaWRlbnRpdHkgbWF0cml4IChub3QgbmVjZXNzYXJpbHkgc3F1YXJlKS4KKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBvbmx5IGZvciBmaXhlZC1zaXplIE1hdHJpeEJhc2UgdHlwZXMuIEZvciBkeW5hbWljLXNpemUgdHlwZXMsIHlvdQorICAqIG5lZWQgdG8gdXNlIHRoZSB2YXJpYW50IHRha2luZyBzaXplIGFyZ3VtZW50cy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfaWRlbnRpdHkuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9pZGVudGl0eS5vdXQKKyAgKgorICAqIFxzYSBJZGVudGl0eShJbmRleCxJbmRleCksIHNldElkZW50aXR5KCksIGlzSWRlbnRpdHkoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6SWRlbnRpdHlSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpJZGVudGl0eSgpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfRklYRURfU0laRShEZXJpdmVkKQorICByZXR1cm4gTWF0cml4QmFzZTxEZXJpdmVkPjo6TnVsbGFyeUV4cHIoUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lLCBpbnRlcm5hbDo6c2NhbGFyX2lkZW50aXR5X29wPFNjYWxhcj4oKSk7Cit9CisKKy8qKiBccmV0dXJucyB0cnVlIGlmICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gdGhlIGlkZW50aXR5IG1hdHJpeAorICAqICAgICAgICAgIChub3QgbmVjZXNzYXJpbHkgc3F1YXJlKSwKKyAgKiAgICAgICAgICB3aXRoaW4gdGhlIHByZWNpc2lvbiBnaXZlbiBieSBcYSBwcmVjLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9pc0lkZW50aXR5LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfaXNJZGVudGl0eS5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcCwgSWRlbnRpdHkoKSwgSWRlbnRpdHkoSW5kZXgsSW5kZXgpLCBzZXRJZGVudGl0eSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBNYXRyaXhCYXNlPERlcml2ZWQ+Ojppc0lkZW50aXR5CisoUmVhbFNjYWxhciBwcmVjKSBjb25zdAoreworICBmb3IoSW5kZXggaiA9IDA7IGogPCBjb2xzKCk7ICsraikKKyAgeworICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHJvd3MoKTsgKytpKQorICAgIHsKKyAgICAgIGlmKGkgPT0gaikKKyAgICAgIHsKKyAgICAgICAgaWYoIWludGVybmFsOjppc0FwcHJveCh0aGlzLT5jb2VmZihpLCBqKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigxKSwgcHJlYykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZighaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKHRoaXMtPmNvZWZmKGksIGopLCBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKSwgcHJlYykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgYm9vbCBCaWcgPSAoRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWU+PTE2KT4KK3N0cnVjdCBzZXRJZGVudGl0eV9pbXBsCit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIHJ1bihEZXJpdmVkJiBtKQorICB7CisgICAgcmV0dXJuIG0gPSBEZXJpdmVkOjpJZGVudGl0eShtLnJvd3MoKSwgbS5jb2xzKCkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHNldElkZW50aXR5X2ltcGw8RGVyaXZlZCwgdHJ1ZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgcnVuKERlcml2ZWQmIG0pCisgIHsKKyAgICBtLnNldFplcm8oKTsKKyAgICBjb25zdCBJbmRleCBzaXplID0gKHN0ZDo6bWluKShtLnJvd3MoKSwgbS5jb2xzKCkpOworICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHNpemU7ICsraSkgbS5jb2VmZlJlZihpLGkpID0gdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyKDEpOworICAgIHJldHVybiBtOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFdyaXRlcyB0aGUgaWRlbnRpdHkgZXhwcmVzc2lvbiAobm90IG5lY2Vzc2FyaWx5IHNxdWFyZSkgaW50byAqdGhpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfc2V0SWRlbnRpdHkuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9zZXRJZGVudGl0eS5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcCwgSWRlbnRpdHkoKSwgSWRlbnRpdHkoSW5kZXgsSW5kZXgpLCBpc0lkZW50aXR5KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIE1hdHJpeEJhc2U8RGVyaXZlZD46OnNldElkZW50aXR5KCkKK3sKKyAgcmV0dXJuIGludGVybmFsOjpzZXRJZGVudGl0eV9pbXBsPERlcml2ZWQ+OjpydW4oZGVyaXZlZCgpKTsKK30KKworLyoqIFxicmllZiBSZXNpemVzIHRvIHRoZSBnaXZlbiBzaXplLCBhbmQgd3JpdGVzIHRoZSBpZGVudGl0eSBleHByZXNzaW9uIChub3QgbmVjZXNzYXJpbHkgc3F1YXJlKSBpbnRvICp0aGlzLgorICAqCisgICogXHBhcmFtIHJvd3MgdGhlIG5ldyBudW1iZXIgb2Ygcm93cworICAqIFxwYXJhbSBjb2xzIHRoZSBuZXcgbnVtYmVyIG9mIGNvbHVtbnMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeF9zZXRJZGVudGl0eV9pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9zZXRJZGVudGl0eV9pbnRfaW50Lm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnNldElkZW50aXR5KCksIGNsYXNzIEN3aXNlTnVsbGFyeU9wLCBNYXRyaXhCYXNlOjpJZGVudGl0eSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpzZXRJZGVudGl0eShJbmRleCByb3dzLCBJbmRleCBjb2xzKQoreworICBkZXJpdmVkKCkucmVzaXplKHJvd3MsIGNvbHMpOworICByZXR1cm4gc2V0SWRlbnRpdHkoKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGktdGggdW5pdCAoYmFzaXMpIHZlY3Rvci4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6VW5pdChJbmRleCksIE1hdHJpeEJhc2U6OlVuaXRYKCksIE1hdHJpeEJhc2U6OlVuaXRZKCksIE1hdHJpeEJhc2U6OlVuaXRaKCksIE1hdHJpeEJhc2U6OlVuaXRXKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkJhc2lzUmV0dXJuVHlwZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpVbml0KEluZGV4IHNpemUsIEluZGV4IGkpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIEJhc2lzUmV0dXJuVHlwZShTcXVhcmVNYXRyaXhUeXBlOjpJZGVudGl0eShzaXplLHNpemUpLCBpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGktdGggdW5pdCAoYmFzaXMpIHZlY3Rvci4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgZm9yIGZpeGVkLXNpemUgdmVjdG9yIG9ubHkuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6VW5pdChJbmRleCxJbmRleCksIE1hdHJpeEJhc2U6OlVuaXRYKCksIE1hdHJpeEJhc2U6OlVuaXRZKCksIE1hdHJpeEJhc2U6OlVuaXRaKCksIE1hdHJpeEJhc2U6OlVuaXRXKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkJhc2lzUmV0dXJuVHlwZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpVbml0KEluZGV4IGkpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIEJhc2lzUmV0dXJuVHlwZShTcXVhcmVNYXRyaXhUeXBlOjpJZGVudGl0eSgpLGkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgWCBheGlzIHVuaXQgdmVjdG9yICgxeywwfV4qKQorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpVbml0KEluZGV4LEluZGV4KSwgTWF0cml4QmFzZTo6VW5pdChJbmRleCksIE1hdHJpeEJhc2U6OlVuaXRZKCksIE1hdHJpeEJhc2U6OlVuaXRaKCksIE1hdHJpeEJhc2U6OlVuaXRXKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkJhc2lzUmV0dXJuVHlwZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpVbml0WCgpCit7IHJldHVybiBEZXJpdmVkOjpVbml0KDApOyB9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBZIGF4aXMgdW5pdCB2ZWN0b3IgKDAsMXssMH1eKikKKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6VW5pdChJbmRleCxJbmRleCksIE1hdHJpeEJhc2U6OlVuaXQoSW5kZXgpLCBNYXRyaXhCYXNlOjpVbml0WSgpLCBNYXRyaXhCYXNlOjpVbml0WigpLCBNYXRyaXhCYXNlOjpVbml0VygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpCYXNpc1JldHVyblR5cGUgTWF0cml4QmFzZTxEZXJpdmVkPjo6VW5pdFkoKQoreyByZXR1cm4gRGVyaXZlZDo6VW5pdCgxKTsgfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgWiBheGlzIHVuaXQgdmVjdG9yICgwLDAsMXssMH1eKikKKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6VW5pdChJbmRleCxJbmRleCksIE1hdHJpeEJhc2U6OlVuaXQoSW5kZXgpLCBNYXRyaXhCYXNlOjpVbml0WSgpLCBNYXRyaXhCYXNlOjpVbml0WigpLCBNYXRyaXhCYXNlOjpVbml0VygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpCYXNpc1JldHVyblR5cGUgTWF0cml4QmFzZTxEZXJpdmVkPjo6VW5pdFooKQoreyByZXR1cm4gRGVyaXZlZDo6VW5pdCgyKTsgfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgVyBheGlzIHVuaXQgdmVjdG9yICgwLDAsMCwxKQorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpVbml0KEluZGV4LEluZGV4KSwgTWF0cml4QmFzZTo6VW5pdChJbmRleCksIE1hdHJpeEJhc2U6OlVuaXRZKCksIE1hdHJpeEJhc2U6OlVuaXRaKCksIE1hdHJpeEJhc2U6OlVuaXRXKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkJhc2lzUmV0dXJuVHlwZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpVbml0VygpCit7IHJldHVybiBEZXJpdmVkOjpVbml0KDMpOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ1dJU0VfTlVMTEFSWV9PUF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Dd2lzZVVuYXJ5T3AuaCBiL0VpZ2VuL3NyYy9Db3JlL0N3aXNlVW5hcnlPcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzM1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Dd2lzZVVuYXJ5T3AuaApAQCAtMCwwICsxLDEyNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DV0lTRV9VTkFSWV9PUF9ICisjZGVmaW5lIEVJR0VOX0NXSVNFX1VOQVJZX09QX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgQ3dpc2VVbmFyeU9wCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBHZW5lcmljIGV4cHJlc3Npb24gd2hlcmUgYSBjb2VmZmljaWVudC13aXNlIHVuYXJ5IG9wZXJhdG9yIGlzIGFwcGxpZWQgdG8gYW4gZXhwcmVzc2lvbgorICAqCisgICogXHBhcmFtIFVuYXJ5T3AgdGVtcGxhdGUgZnVuY3RvciBpbXBsZW1lbnRpbmcgdGhlIG9wZXJhdG9yCisgICogXHBhcmFtIFhwclR5cGUgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gdG8gd2hpY2ggd2UgYXJlIGFwcGx5aW5nIHRoZSB1bmFyeSBvcGVyYXRvcgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gd2hlcmUgYSB1bmFyeSBvcGVyYXRvciBpcyBhcHBsaWVkIHRvIGFuIGV4cHJlc3Npb24uCisgICogSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIGFsbCBvcGVyYXRpb25zIHRha2luZyBleGFjdGx5IDEgaW5wdXQgZXhwcmVzc2lvbiwgcmVnYXJkbGVzcyBvZiB0aGUKKyAgKiBwcmVzZW5jZSBvZiBvdGhlciBpbnB1dHMgc3VjaCBhcyBzY2FsYXJzLiBGb3IgZXhhbXBsZSwgdGhlIG9wZXJhdG9yKiBpbiB0aGUgZXhwcmVzc2lvbiAzKm1hdHJpeAorICAqIGlzIGNvbnNpZGVyZWQgdW5hcnksIGJlY2F1c2Ugb25seSB0aGUgcmlnaHQtaGFuZCBzaWRlIGlzIGFuIGV4cHJlc3Npb24sIGFuZCBpdHMKKyAgKiByZXR1cm4gdHlwZSBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIEN3aXNlVW5hcnlPcC4KKyAgKgorICAqIE1vc3Qgb2YgdGhlIHRpbWUsIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRoYXQgaXQgaXMgdXNlZCwgc28geW91IHR5cGljYWxseSBkb24ndCBoYXZlIHRvIG5hbWUKKyAgKiBDd2lzZVVuYXJ5T3AgdHlwZXMgZXhwbGljaXRseS4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjp1bmFyeUV4cHIoY29uc3QgQ3VzdG9tVW5hcnlPcCAmKSBjb25zdCwgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIFhwclR5cGU+CitzdHJ1Y3QgdHJhaXRzPEN3aXNlVW5hcnlPcDxVbmFyeU9wLCBYcHJUeXBlPiA+CisgOiB0cmFpdHM8WHByVHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgICBVbmFyeU9wKHR5cGVuYW1lIFhwclR5cGU6OlNjYWxhcikKKyAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgWHByVHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPFhwclR5cGVOZXN0ZWQ+Ojp0eXBlIF9YcHJUeXBlTmVzdGVkOworICBlbnVtIHsKKyAgICBGbGFncyA9IF9YcHJUeXBlTmVzdGVkOjpGbGFncyAmICgKKyAgICAgIEhlcmVkaXRhcnlCaXRzIHwgTGluZWFyQWNjZXNzQml0IHwgQWxpZ25lZEJpdAorICAgICAgfCAoZnVuY3Rvcl90cmFpdHM8VW5hcnlPcD46OlBhY2tldEFjY2VzcyA/IFBhY2tldEFjY2Vzc0JpdCA6IDApKSwKKyAgICBDb2VmZlJlYWRDb3N0ID0gX1hwclR5cGVOZXN0ZWQ6OkNvZWZmUmVhZENvc3QgKyBmdW5jdG9yX3RyYWl0czxVbmFyeU9wPjo6Q29zdAorICB9OworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVW5hcnlPcCwgdHlwZW5hbWUgWHByVHlwZSwgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+CitjbGFzcyBDd2lzZVVuYXJ5T3BJbXBsOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBVbmFyeU9wLCB0eXBlbmFtZSBYcHJUeXBlPgorY2xhc3MgQ3dpc2VVbmFyeU9wIDogaW50ZXJuYWw6Om5vX2Fzc2lnbm1lbnRfb3BlcmF0b3IsCisgIHB1YmxpYyBDd2lzZVVuYXJ5T3BJbXBsPFVuYXJ5T3AsIFhwclR5cGUsIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8WHByVHlwZT46OlN0b3JhZ2VLaW5kPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEN3aXNlVW5hcnlPcEltcGw8VW5hcnlPcCwgWHByVHlwZSx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFhwclR5cGU+OjpTdG9yYWdlS2luZD46OkJhc2UgQmFzZTsKKyAgICBFSUdFTl9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoQ3dpc2VVbmFyeU9wKQorCisgICAgaW5saW5lIEN3aXNlVW5hcnlPcChjb25zdCBYcHJUeXBlJiB4cHIsIGNvbnN0IFVuYXJ5T3AmIGZ1bmMgPSBVbmFyeU9wKCkpCisgICAgICA6IG1feHByKHhwciksIG1fZnVuY3RvcihmdW5jKSB7fQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV94cHIucm93cygpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV94cHIuY29scygpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGZ1bmN0b3IgcmVwcmVzZW50aW5nIHRoZSB1bmFyeSBvcGVyYXRpb24gKi8KKyAgICBjb25zdCBVbmFyeU9wJiBmdW5jdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdG9yOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5lc3RlZCBleHByZXNzaW9uICovCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgWHByVHlwZTo6TmVzdGVkPjo6dHlwZSYKKyAgICBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV94cHI7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbmVzdGVkIGV4cHJlc3Npb24gKi8KKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIG5lc3RlZEV4cHJlc3Npb24oKSB7IHJldHVybiBtX3hwci5jb25zdF9jYXN0X2Rlcml2ZWQoKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICB0eXBlbmFtZSBYcHJUeXBlOjpOZXN0ZWQgbV94cHI7CisgICAgY29uc3QgVW5hcnlPcCBtX2Z1bmN0b3I7Cit9OworCisvLyBUaGlzIGlzIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciBkZW5zZSBzdG9yYWdlLgorLy8gSXQgY2FuIGJlIHVzZWQgZm9yIGFueSBleHByZXNzaW9uIHR5cGVzIGltcGxlbWVudGluZyB0aGUgZGVuc2UgY29uY2VwdC4KK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIFhwclR5cGU+CitjbGFzcyBDd2lzZVVuYXJ5T3BJbXBsPFVuYXJ5T3AsWHByVHlwZSxEZW5zZT4KKyAgOiBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPEN3aXNlVW5hcnlPcDxVbmFyeU9wLCBYcHJUeXBlPiA+Ojp0eXBlCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgQ3dpc2VVbmFyeU9wPFVuYXJ5T3AsIFhwclR5cGU+IERlcml2ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8Q3dpc2VVbmFyeU9wPFVuYXJ5T3AsIFhwclR5cGU+ID46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQpCisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmZ1bmN0b3IoKShkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmNvZWZmKHJvdywgY29sKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmZ1bmN0b3IoKS5wYWNrZXRPcChkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4ocm93LCBjb2wpKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmZ1bmN0b3IoKShkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmNvZWZmKGluZGV4KSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmZ1bmN0b3IoKS5wYWNrZXRPcChkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpKTsKKyAgICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NXSVNFX1VOQVJZX09QX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0N3aXNlVW5hcnlWaWV3LmggYi9FaWdlbi9zcmMvQ29yZS9Dd2lzZVVuYXJ5Vmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjczYTkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Dd2lzZVVuYXJ5Vmlldy5oCkBAIC0wLDAgKzEsMTM1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DV0lTRV9VTkFSWV9WSUVXX0gKKyNkZWZpbmUgRUlHRU5fQ1dJU0VfVU5BUllfVklFV19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgQ3dpc2VVbmFyeVZpZXcKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEdlbmVyaWMgbHZhbHVlIGV4cHJlc3Npb24gb2YgYSBjb2VmZmljaWVudC13aXNlIHVuYXJ5IG9wZXJhdG9yIG9mIGEgbWF0cml4IG9yIGEgdmVjdG9yCisgICoKKyAgKiBccGFyYW0gVmlld09wIHRlbXBsYXRlIGZ1bmN0b3IgaW1wbGVtZW50aW5nIHRoZSB2aWV3CisgICogXHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCB3ZSBhcmUgYXBwbHlpbmcgdGhlIHVuYXJ5IG9wZXJhdG9yCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBsdmFsdWUgZXhwcmVzc2lvbiBvZiBhIGdlbmVyaWMgdW5hcnkgdmlldyBvcGVyYXRvciBvZiBhIG1hdHJpeCBvciBhIHZlY3Rvci4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgcmVhbCgpIGFuZCBpbWFnKCksIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6dW5hcnlWaWV3RXhwcihjb25zdCBDdXN0b21VbmFyeU9wICYpIGNvbnN0LCBjbGFzcyBDd2lzZVVuYXJ5T3AKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFZpZXdPcCwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCB0cmFpdHM8Q3dpc2VVbmFyeVZpZXc8Vmlld09wLCBNYXRyaXhUeXBlPiA+CisgOiB0cmFpdHM8TWF0cml4VHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgICBWaWV3T3AodHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIpCisgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIE1hdHJpeFR5cGVOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSBfTWF0cml4VHlwZU5lc3RlZDsKKyAgZW51bSB7CisgICAgRmxhZ3MgPSAodHJhaXRzPF9NYXRyaXhUeXBlTmVzdGVkPjo6RmxhZ3MgJiAoSGVyZWRpdGFyeUJpdHMgfCBMdmFsdWVCaXQgfCBMaW5lYXJBY2Nlc3NCaXQgfCBEaXJlY3RBY2Nlc3NCaXQpKSwKKyAgICBDb2VmZlJlYWRDb3N0ID0gdHJhaXRzPF9NYXRyaXhUeXBlTmVzdGVkPjo6Q29lZmZSZWFkQ29zdCArIGZ1bmN0b3JfdHJhaXRzPFZpZXdPcD46OkNvc3QsCisgICAgTWF0cml4VHlwZUlubmVyU3RyaWRlID0gIGlubmVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8TWF0cml4VHlwZT46OnJldCwKKyAgICAvLyBuZWVkIHRvIGNhc3QgdGhlIHNpemVvZidzIGZyb20gc2l6ZV90IHRvIGludCBleHBsaWNpdGx5LCBvdGhlcndpc2U6CisgICAgLy8gImVycm9yOiBubyBpbnRlZ3JhbCB0eXBlIGNhbiByZXByZXNlbnQgYWxsIG9mIHRoZSBlbnVtZXJhdG9yIHZhbHVlcworICAgIElubmVyU3RyaWRlQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGVJbm5lclN0cmlkZSA9PSBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW50KER5bmFtaWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KE1hdHJpeFR5cGVJbm5lclN0cmlkZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGludChzaXplb2YodHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIpIC8gc2l6ZW9mKFNjYWxhcikpLAorICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IG91dGVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8TWF0cml4VHlwZT46OnJldAorICB9OworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmlld09wLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBTdG9yYWdlS2luZD4KK2NsYXNzIEN3aXNlVW5hcnlWaWV3SW1wbDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmlld09wLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgQ3dpc2VVbmFyeVZpZXcgOiBpbnRlcm5hbDo6bm9fYXNzaWdubWVudF9vcGVyYXRvciwKKyAgcHVibGljIEN3aXNlVW5hcnlWaWV3SW1wbDxWaWV3T3AsIE1hdHJpeFR5cGUsIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlN0b3JhZ2VLaW5kPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEN3aXNlVW5hcnlWaWV3SW1wbDxWaWV3T3AsIE1hdHJpeFR5cGUsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U3RvcmFnZUtpbmQ+OjpCYXNlIEJhc2U7CisgICAgRUlHRU5fR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFKEN3aXNlVW5hcnlWaWV3KQorCisgICAgaW5saW5lIEN3aXNlVW5hcnlWaWV3KGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgVmlld09wJiBmdW5jID0gVmlld09wKCkpCisgICAgICA6IG1fbWF0cml4KG1hdCksIG1fZnVuY3RvcihmdW5jKSB7fQorCisgICAgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhDd2lzZVVuYXJ5VmlldykKKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBmdW5jdG9yIHJlcHJlc2VudGluZyB1bmFyeSBvcGVyYXRpb24gKi8KKyAgICBjb25zdCBWaWV3T3AmIGZ1bmN0b3IoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3I7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbmVzdGVkIGV4cHJlc3Npb24gKi8KKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX21hdHJpeDsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbiAqLworICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZD46OnR5cGUmCisgICAgbmVzdGVkRXhwcmVzc2lvbigpIHsgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIEZJWE1FIGNoYW5nZWQgZnJvbSBNYXRyaXhUeXBlOjpOZXN0ZWQgYmVjYXVzZSBvZiBhIHdlaXJkIGNvbXBpbGF0aW9uIGVycm9yIHdpdGggc3VuIENDCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxNYXRyaXhUeXBlPjo6dHlwZSBtX21hdHJpeDsKKyAgICBWaWV3T3AgbV9mdW5jdG9yOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmlld09wLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgQ3dpc2VVbmFyeVZpZXdJbXBsPFZpZXdPcCxNYXRyaXhUeXBlLERlbnNlPgorICA6IHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8IEN3aXNlVW5hcnlWaWV3PFZpZXdPcCwgTWF0cml4VHlwZT4gPjo6dHlwZQoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIEN3aXNlVW5hcnlWaWV3PFZpZXdPcCwgTWF0cml4VHlwZT4gRGVyaXZlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTwgQ3dpc2VVbmFyeVZpZXc8Vmlld09wLCBNYXRyaXhUeXBlPiA+Ojp0eXBlIEJhc2U7CisKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQpCisKKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmlubmVyU3RyaWRlKCkgKiBzaXplb2YodHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyKSAvIHNpemVvZihTY2FsYXIpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkub3V0ZXJTdHJpZGUoKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmZ1bmN0b3IoKShkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmNvZWZmKHJvdywgY29sKSk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5mdW5jdG9yKCkoZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKS5jb2VmZihpbmRleCkpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmZ1bmN0b3IoKShjb25zdF9jYXN0X2Rlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuY29lZmZSZWYocm93LCBjb2wpKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5mdW5jdG9yKCkoY29uc3RfY2FzdF9kZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmNvZWZmUmVmKGluZGV4KSk7CisgICAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DV0lTRV9VTkFSWV9WSUVXX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0RlbnNlQmFzZS5oIGIvRWlnZW4vc3JjL0NvcmUvRGVuc2VCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjMDMxNAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0RlbnNlQmFzZS5oCkBAIC0wLDAgKzEsNTMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0RFTlNFQkFTRV9ICisjZGVmaW5lIEVJR0VOX0RFTlNFQkFTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgRGVuc2VCYXNlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBCYXNlIGNsYXNzIGZvciBhbGwgZGVuc2UgbWF0cmljZXMsIHZlY3RvcnMsIGFuZCBhcnJheXMKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgdGhhdCBpcyBpbmhlcml0ZWQgYnkgYWxsIGRlbnNlIG9iamVjdHMgKG1hdHJpeCwgdmVjdG9yLCBhcnJheXMsCisgICogYW5kIHJlbGF0ZWQgZXhwcmVzc2lvbiB0eXBlcykuIFRoZSBjb21tb24gRWlnZW4gQVBJIGZvciBkZW5zZSBvYmplY3RzIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzLgorICAqCisgICogXHRwYXJhbSBEZXJpdmVkIGlzIHRoZSBkZXJpdmVkIHR5cGUsIGUuZy4sIGEgbWF0cml4IHR5cGUgb3IgYW4gZXhwcmVzc2lvbi4KKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nRWlnZW4gYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fREVOU0VCQVNFX1BMVUdJTi4KKyAgKgorICAqIFxzYSBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIERlbnNlQmFzZQorI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICA6IHB1YmxpYyBpbnRlcm5hbDo6c3BlY2lhbF9zY2FsYXJfb3BfYmFzZTxEZXJpdmVkLHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbD4KKyNlbHNlCisgIDogcHVibGljIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkPgorI2VuZGlmIC8vIG5vdCBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgoreworICBwdWJsaWM6CisgICAgdXNpbmcgaW50ZXJuYWw6OnNwZWNpYWxfc2NhbGFyX29wX2Jhc2U8RGVyaXZlZCx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj46OlJlYWw+OjpvcGVyYXRvcio7CisKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKworICAgIC8qKiBcYnJpZWYgVGhlIHR5cGUgb2YgaW5kaWNlcyAKKyAgICAgICogXGRldGFpbHMgVG8gY2hhbmdlIHRoaXMsIFxjIFwjZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxjIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRS4KKyAgICAgICogXHNhIFxyZWYgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzLgorICAgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkluZGV4IEluZGV4OyAKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0U2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIHR5cGVkZWYgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjpjb25zdF9jYXN0X2Rlcml2ZWQ7CisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworICAgIHVzaW5nIEJhc2U6OnNpemU7CisgICAgdXNpbmcgQmFzZTo6cm93SW5kZXhCeU91dGVySW5uZXI7CisgICAgdXNpbmcgQmFzZTo6Y29sSW5kZXhCeU91dGVySW5uZXI7CisgICAgdXNpbmcgQmFzZTo6Y29lZmY7CisgICAgdXNpbmcgQmFzZTo6Y29lZmZCeU91dGVySW5uZXI7CisgICAgdXNpbmcgQmFzZTo6cGFja2V0OworICAgIHVzaW5nIEJhc2U6OnBhY2tldEJ5T3V0ZXJJbm5lcjsKKyAgICB1c2luZyBCYXNlOjp3cml0ZVBhY2tldDsKKyAgICB1c2luZyBCYXNlOjp3cml0ZVBhY2tldEJ5T3V0ZXJJbm5lcjsKKyAgICB1c2luZyBCYXNlOjpjb2VmZlJlZjsKKyAgICB1c2luZyBCYXNlOjpjb2VmZlJlZkJ5T3V0ZXJJbm5lcjsKKyAgICB1c2luZyBCYXNlOjpjb3B5Q29lZmY7CisgICAgdXNpbmcgQmFzZTo6Y29weUNvZWZmQnlPdXRlcklubmVyOworICAgIHVzaW5nIEJhc2U6OmNvcHlQYWNrZXQ7CisgICAgdXNpbmcgQmFzZTo6Y29weVBhY2tldEJ5T3V0ZXJJbm5lcjsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvcigpOworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yW107CisgICAgdXNpbmcgQmFzZTo6eDsKKyAgICB1c2luZyBCYXNlOjp5OworICAgIHVzaW5nIEJhc2U6Ono7CisgICAgdXNpbmcgQmFzZTo6dzsKKyAgICB1c2luZyBCYXNlOjpzdHJpZGU7CisgICAgdXNpbmcgQmFzZTo6aW5uZXJTdHJpZGU7CisgICAgdXNpbmcgQmFzZTo6b3V0ZXJTdHJpZGU7CisgICAgdXNpbmcgQmFzZTo6cm93U3RyaWRlOworICAgIHVzaW5nIEJhc2U6OmNvbFN0cmlkZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgICBlbnVtIHsKKworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJvd3MgYXQgY29tcGlsZS10aW1lLiBUaGlzIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZAorICAgICAgICAgICogYnkgdGhlIFxhIERlcml2ZWQgdHlwZS4gSWYgYSB2YWx1ZSBpcyBub3Qga25vd24gYXQgY29tcGlsZS10aW1lLAorICAgICAgICAgICogaXQgaXMgc2V0IHRvIHRoZSBcYSBEeW5hbWljIGNvbnN0YW50LgorICAgICAgICAgICogXHNhIE1hdHJpeEJhc2U6OnJvd3MoKSwgTWF0cml4QmFzZTo6Y29scygpLCBDb2xzQXRDb21waWxlVGltZSwgU2l6ZUF0Q29tcGlsZVRpbWUgKi8KKworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgYXQgY29tcGlsZS10aW1lLiBUaGlzIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZAorICAgICAgICAgICogYnkgdGhlIFxhIERlcml2ZWQgdHlwZS4gSWYgYSB2YWx1ZSBpcyBub3Qga25vd24gYXQgY29tcGlsZS10aW1lLAorICAgICAgICAgICogaXQgaXMgc2V0IHRvIHRoZSBcYSBEeW5hbWljIGNvbnN0YW50LgorICAgICAgICAgICogXHNhIE1hdHJpeEJhc2U6OnJvd3MoKSwgTWF0cml4QmFzZTo6Y29scygpLCBSb3dzQXRDb21waWxlVGltZSwgU2l6ZUF0Q29tcGlsZVRpbWUgKi8KKworCisgICAgICBTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZT46OnJldCksCisgICAgICAgIC8qKjwgVGhpcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cywgaS5lLiB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgKiByb3dzIHRpbWVzIHRoZSBudW1iZXIgb2YgY29sdW1ucywgb3IgdG8gXGEgRHluYW1pYyBpZiB0aGlzIGlzIG5vdAorICAgICAgICAgICoga25vd24gYXQgY29tcGlsZS10aW1lLiBcc2EgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lICovCisKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIC8qKjwgVGhpcyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2Ygcm93cyB0aGF0IHRoaXMgZXhwcmVzc2lvbgorICAgICAgICAgICogbWlnaHQgaGF2ZS4gSWYgdGhpcyBleHByZXNzaW9uIG1pZ2h0IGhhdmUgYW4gYXJiaXRyYXJpbHkgaGlnaCBudW1iZXIgb2Ygcm93cywKKyAgICAgICAgICAqIHRoaXMgdmFsdWUgaXMgc2V0IHRvIFxhIER5bmFtaWMuCisgICAgICAgICAgKgorICAgICAgICAgICogVGhpcyB2YWx1ZSBpcyB1c2VmdWwgdG8ga25vdyB3aGVuIGV2YWx1YXRpbmcgYW4gZXhwcmVzc2lvbiwgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lCisgICAgICAgICAgKiB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIGF2b2lkIGRvaW5nIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBcc2EgUm93c0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lLCBNYXhTaXplQXRDb21waWxlVGltZQorICAgICAgICAgICovCisKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgIC8qKjwgVGhpcyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgbWF4aW11bSBwb3NzaWJsZSBudW1iZXIgb2YgY29sdW1ucyB0aGF0IHRoaXMgZXhwcmVzc2lvbgorICAgICAgICAgICogbWlnaHQgaGF2ZS4gSWYgdGhpcyBleHByZXNzaW9uIG1pZ2h0IGhhdmUgYW4gYXJiaXRyYXJpbHkgaGlnaCBudW1iZXIgb2YgY29sdW1ucywKKyAgICAgICAgICAqIHRoaXMgdmFsdWUgaXMgc2V0IHRvIFxhIER5bmFtaWMuCisgICAgICAgICAgKgorICAgICAgICAgICogVGhpcyB2YWx1ZSBpcyB1c2VmdWwgdG8ga25vdyB3aGVuIGV2YWx1YXRpbmcgYW4gZXhwcmVzc2lvbiwgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lCisgICAgICAgICAgKiB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIGF2b2lkIGRvaW5nIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBcc2EgQ29sc0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lLCBNYXhTaXplQXRDb21waWxlVGltZQorICAgICAgICAgICovCisKKyAgICAgIE1heFNpemVBdENvbXBpbGVUaW1lID0gKGludGVybmFsOjpzaXplX2F0X2NvbXBpbGVfdGltZTxpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heENvbHNBdENvbXBpbGVUaW1lPjo6cmV0KSwKKyAgICAgICAgLyoqPCBUaGlzIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBtYXhpbXVtIHBvc3NpYmxlIG51bWJlciBvZiBjb2VmZmljaWVudHMgdGhhdCB0aGlzIGV4cHJlc3Npb24KKyAgICAgICAgICAqIG1pZ2h0IGhhdmUuIElmIHRoaXMgZXhwcmVzc2lvbiBtaWdodCBoYXZlIGFuIGFyYml0cmFyaWx5IGhpZ2ggbnVtYmVyIG9mIGNvZWZmaWNpZW50cywKKyAgICAgICAgICAqIHRoaXMgdmFsdWUgaXMgc2V0IHRvIFxhIER5bmFtaWMuCisgICAgICAgICAgKgorICAgICAgICAgICogVGhpcyB2YWx1ZSBpcyB1c2VmdWwgdG8ga25vdyB3aGVuIGV2YWx1YXRpbmcgYW4gZXhwcmVzc2lvbiwgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lCisgICAgICAgICAgKiB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIGF2b2lkIGRvaW5nIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBcc2EgU2l6ZUF0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lLCBNYXhDb2xzQXRDb21waWxlVGltZQorICAgICAgICAgICovCisKKyAgICAgIElzVmVjdG9yQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heFJvd3NBdENvbXBpbGVUaW1lID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heENvbHNBdENvbXBpbGVUaW1lID09IDEsCisgICAgICAgIC8qKjwgVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiBlaXRoZXIgdGhlIG51bWJlciBvZiByb3dzIG9yIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAqIGNvbHVtbnMgaXMga25vd24gYXQgY29tcGlsZS10aW1lIHRvIGJlIGVxdWFsIHRvIDEuIEluZGVlZCwgaW4gdGhhdCBjYXNlLAorICAgICAgICAgICogd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGNvbHVtbi12ZWN0b3IgKGlmIHRoZXJlIGlzIG9ubHkgb25lIGNvbHVtbikgb3Igd2l0aAorICAgICAgICAgICogYSByb3ctdmVjdG9yIChpZiB0aGVyZSBpcyBvbmx5IG9uZSByb3cpLiAqLworCisgICAgICBGbGFncyA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkZsYWdzLAorICAgICAgICAvKio8IFRoaXMgc3RvcmVzIGV4cHJlc3Npb24gXHJlZiBmbGFncyBmbGFncyB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBpbmhlcml0ZWQgYnkgbmV3IGV4cHJlc3Npb25zCisgICAgICAgICAgKiBjb25zdHJ1Y3RlZCBmcm9tIHRoaXMgb25lLiBTZWUgdGhlIFxyZWYgZmxhZ3MgImxpc3Qgb2YgZmxhZ3MiLgorICAgICAgICAgICovCisKKyAgICAgIElzUm93TWFqb3IgPSBpbnQoRmxhZ3MpICYgUm93TWFqb3JCaXQsIC8qKjwgVHJ1ZSBpZiB0aGlzIGV4cHJlc3Npb24gaGFzIHJvdy1tYWpvciBzdG9yYWdlIG9yZGVyLiAqLworCisgICAgICBJbm5lclNpemVBdENvbXBpbGVUaW1lID0gaW50KElzVmVjdG9yQXRDb21waWxlVGltZSkgPyBpbnQoU2l6ZUF0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KElzUm93TWFqb3IpID8gaW50KENvbHNBdENvbXBpbGVUaW1lKSA6IGludChSb3dzQXRDb21waWxlVGltZSksCisKKyAgICAgIENvZWZmUmVhZENvc3QgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2VmZlJlYWRDb3N0LAorICAgICAgICAvKio8IFRoaXMgaXMgYSByb3VnaCBtZWFzdXJlIG9mIGhvdyBleHBlbnNpdmUgaXQgaXMgdG8gcmVhZCBvbmUgY29lZmZpY2llbnQgZnJvbQorICAgICAgICAgICogdGhpcyBleHByZXNzaW9uLgorICAgICAgICAgICovCisKKyAgICAgIElubmVyU3RyaWRlQXRDb21waWxlVGltZSA9IGludGVybmFsOjppbm5lcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPERlcml2ZWQ+OjpyZXQsCisgICAgICBPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6b3V0ZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxEZXJpdmVkPjo6cmV0CisgICAgfTsKKworICAgIGVudW0geyBUaGlzQ29uc3RhbnRJc1ByaXZhdGVJblBsYWluT2JqZWN0QmFzZSB9OworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgd2hpY2ggaXMgaW4gcHJhY3RpY2UgdGhlIG51bWJlcgorICAgICAgKiBvZiBzdG9yZWQgY29lZmZpY2llbnRzLiAqLworICAgIGlubGluZSBJbmRleCBub25aZXJvcygpIGNvbnN0IHsgcmV0dXJuIHNpemUoKTsgfQorICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIGVpdGhlciB0aGUgbnVtYmVyIG9mIHJvd3Mgb3IgdGhlIG51bWJlciBvZiBjb2x1bW5zIGlzIGVxdWFsIHRvIDEuCisgICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgICAgICogXGNvZGUgcm93cygpPT0xIHx8IGNvbHMoKT09MSBcZW5kY29kZQorICAgICAgKiBcc2Egcm93cygpLCBjb2xzKCksIElzVmVjdG9yQXRDb21waWxlVGltZS4gKi8KKworICAgIC8qKiBccmV0dXJucyB0aGUgb3V0ZXIgc2l6ZS4KKyAgICAgICoKKyAgICAgICogXG5vdGUgRm9yIGEgdmVjdG9yLCB0aGlzIHJldHVybnMganVzdCAxLiBGb3IgYSBtYXRyaXggKG5vbi12ZWN0b3IpLCB0aGlzIGlzIHRoZSBtYWpvciBkaW1lbnNpb24KKyAgICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSBccmVmIFRvcGljU3RvcmFnZU9yZGVycyAic3RvcmFnZSBvcmRlciIsIGkuZS4sIHRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgYQorICAgICAgKiBjb2x1bW4tbWFqb3IgbWF0cml4LCBhbmQgdGhlIG51bWJlciBvZiByb3dzIGZvciBhIHJvdy1tYWpvciBtYXRyaXguICovCisgICAgSW5kZXggb3V0ZXJTaXplKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gSXNWZWN0b3JBdENvbXBpbGVUaW1lID8gMQorICAgICAgICAgICA6IGludChJc1Jvd01ham9yKSA/IHRoaXMtPnJvd3MoKSA6IHRoaXMtPmNvbHMoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGlubmVyIHNpemUuCisgICAgICAqCisgICAgICAqIFxub3RlIEZvciBhIHZlY3RvciwgdGhpcyBpcyBqdXN0IHRoZSBzaXplLiBGb3IgYSBtYXRyaXggKG5vbi12ZWN0b3IpLCB0aGlzIGlzIHRoZSBtaW5vciBkaW1lbnNpb24KKyAgICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSBccmVmIFRvcGljU3RvcmFnZU9yZGVycyAic3RvcmFnZSBvcmRlciIsIGkuZS4sIHRoZSBudW1iZXIgb2Ygcm93cyBmb3IgYSAKKyAgICAgICogY29sdW1uLW1ham9yIG1hdHJpeCwgYW5kIHRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgYSByb3ctbWFqb3IgbWF0cml4LiAqLworICAgIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIElzVmVjdG9yQXRDb21waWxlVGltZSA/IHRoaXMtPnNpemUoKQorICAgICAgICAgICA6IGludChJc1Jvd01ham9yKSA/IHRoaXMtPmNvbHMoKSA6IHRoaXMtPnJvd3MoKTsKKyAgICB9CisKKyAgICAvKiogT25seSBwbGFpbiBtYXRyaWNlcy9hcnJheXMsIG5vdCBleHByZXNzaW9ucywgbWF5IGJlIHJlc2l6ZWQ7IHRoZXJlZm9yZSB0aGUgb25seSB1c2VmdWwgcmVzaXplIG1ldGhvZHMgYXJlCisgICAgICAqIE1hdHJpeDo6cmVzaXplKCkgYW5kIEFycmF5OjpyZXNpemUoKS4gVGhlIHByZXNlbnQgbWV0aG9kIG9ubHkgYXNzZXJ0cyB0aGF0IHRoZSBuZXcgc2l6ZSBlcXVhbHMgdGhlIG9sZCBzaXplLCBhbmQgZG9lcworICAgICAgKiBub3RoaW5nIGVsc2UuCisgICAgICAqLworICAgIHZvaWQgcmVzaXplKEluZGV4IHNpemUpCisgICAgeworICAgICAgRUlHRU5fT05MWV9VU0VEX0ZPUl9ERUJVRyhzaXplKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChzaXplID09IHRoaXMtPnNpemUoKQorICAgICAgICAgICAgICAgICYmICJEZW5zZUJhc2U6OnJlc2l6ZSgpIGRvZXMgbm90IGFjdHVhbGx5IGFsbG93IHRvIHJlc2l6ZS4iKTsKKyAgICB9CisgICAgLyoqIE9ubHkgcGxhaW4gbWF0cmljZXMvYXJyYXlzLCBub3QgZXhwcmVzc2lvbnMsIG1heSBiZSByZXNpemVkOyB0aGVyZWZvcmUgdGhlIG9ubHkgdXNlZnVsIHJlc2l6ZSBtZXRob2RzIGFyZQorICAgICAgKiBNYXRyaXg6OnJlc2l6ZSgpIGFuZCBBcnJheTo6cmVzaXplKCkuIFRoZSBwcmVzZW50IG1ldGhvZCBvbmx5IGFzc2VydHMgdGhhdCB0aGUgbmV3IHNpemUgZXF1YWxzIHRoZSBvbGQgc2l6ZSwgYW5kIGRvZXMKKyAgICAgICogbm90aGluZyBlbHNlLgorICAgICAgKi8KKyAgICB2b2lkIHJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgIHsKKyAgICAgIEVJR0VOX09OTFlfVVNFRF9GT1JfREVCVUcocm93cyk7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKGNvbHMpOworICAgICAgZWlnZW5fYXNzZXJ0KHJvd3MgPT0gdGhpcy0+cm93cygpICYmIGNvbHMgPT0gdGhpcy0+Y29scygpCisgICAgICAgICAgICAgICAgJiYgIkRlbnNlQmFzZTo6cmVzaXplKCkgZG9lcyBub3QgYWN0dWFsbHkgYWxsb3cgdG8gcmVzaXplLiIpOworICAgIH0KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisgICAgLyoqIFxpbnRlcm5hbCBSZXByZXNlbnRzIGEgbWF0cml4IHdpdGggYWxsIGNvZWZmaWNpZW50cyBlcXVhbCB0byBvbmUgYW5vdGhlciovCisgICAgdHlwZWRlZiBDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPFNjYWxhcj4sRGVyaXZlZD4gQ29uc3RhbnRSZXR1cm5UeXBlOworICAgIC8qKiBcaW50ZXJuYWwgUmVwcmVzZW50cyBhIHZlY3RvciB3aXRoIGxpbmVhcmx5IHNwYWNlZCBjb2VmZmljaWVudHMgdGhhdCBhbGxvd3Mgc2VxdWVudGlhbCBhY2Nlc3Mgb25seS4gKi8KKyAgICB0eXBlZGVmIEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpsaW5zcGFjZWRfb3A8U2NhbGFyLGZhbHNlPixEZXJpdmVkPiBTZXF1ZW50aWFsTGluU3BhY2VkUmV0dXJuVHlwZTsKKyAgICAvKiogXGludGVybmFsIFJlcHJlc2VudHMgYSB2ZWN0b3Igd2l0aCBsaW5lYXJseSBzcGFjZWQgY29lZmZpY2llbnRzIHRoYXQgYWxsb3dzIHJhbmRvbSBhY2Nlc3MuICovCisgICAgdHlwZWRlZiBDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6bGluc3BhY2VkX29wPFNjYWxhcix0cnVlPixEZXJpdmVkPiBSYW5kb21BY2Nlc3NMaW5TcGFjZWRSZXR1cm5UeXBlOworICAgIC8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OmVpZ2VudmFsdWVzKCkgKi8KKyAgICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbCwgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsIDE+IEVpZ2VudmFsdWVzUmV0dXJuVHlwZTsKKworI2VuZGlmIC8vIG5vdCBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisgICAgLyoqIENvcGllcyBcYSBvdGhlciBpbnRvICp0aGlzLiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byAqdGhpcy4gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKyAgICAvKiogU3BlY2lhbCBjYXNlIG9mIHRoZSB0ZW1wbGF0ZSBvcGVyYXRvcj0sIGluIG9yZGVyIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyCisgICAgICAqIGZyb20gZ2VuZXJhdGluZyBhIGRlZmF1bHQgb3BlcmF0b3I9IChpc3N1ZSBoaXQgd2l0aCBnKysgNC4xKQorICAgICAgKi8KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRGVuc2VCYXNlJiBvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3IrPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yLT0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgUmV0dXJuQnlWYWx1ZTxPdGhlckRlcml2ZWQ+JiBmdW5jKTsKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBDb3BpZXMgXGEgb3RoZXIgaW50byAqdGhpcyB3aXRob3V0IGV2YWx1YXRpbmcgb3RoZXIuIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvICp0aGlzLiAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBsYXp5QXNzaWduKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisjZW5kaWYgLy8gbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyAgICBDb21tYUluaXRpYWxpemVyPERlcml2ZWQ+IG9wZXJhdG9yPDwgKGNvbnN0IFNjYWxhciYgcyk7CisKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgQWRkZWQsdW5zaWduZWQgaW50IFJlbW92ZWQ+CisgICAgY29uc3QgRmxhZ2dlZDxEZXJpdmVkLCBBZGRlZCwgUmVtb3ZlZD4gZmxhZ2dlZCgpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIENvbW1hSW5pdGlhbGl6ZXI8RGVyaXZlZD4gb3BlcmF0b3I8PCAoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIEVpZ2VuOjpUcmFuc3Bvc2U8RGVyaXZlZD4gdHJhbnNwb3NlKCk7CisgICAgdHlwZWRlZiBjb25zdCBUcmFuc3Bvc2U8Y29uc3QgRGVyaXZlZD4gQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlOworICAgIENvbnN0VHJhbnNwb3NlUmV0dXJuVHlwZSB0cmFuc3Bvc2UoKSBjb25zdDsKKyAgICB2b2lkIHRyYW5zcG9zZUluUGxhY2UoKTsKKyNpZm5kZWYgRUlHRU5fTk9fREVCVUcKKyAgcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIGNoZWNrVHJhbnNwb3NlQWxpYXNpbmcoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgY29uc3Q7CisgIHB1YmxpYzoKKyNlbmRpZgorCisgICAgdHlwZWRlZiBWZWN0b3JCbG9jazxEZXJpdmVkPiBTZWdtZW50UmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQ+IENvbnN0U2VnbWVudFJldHVyblR5cGU7CisgICAgdGVtcGxhdGU8aW50IFNpemU+IHN0cnVjdCBGaXhlZFNlZ21lbnRSZXR1cm5UeXBlIHsgdHlwZWRlZiBWZWN0b3JCbG9jazxEZXJpdmVkLCBTaXplPiBUeXBlOyB9OworICAgIHRlbXBsYXRlPGludCBTaXplPiBzdHJ1Y3QgQ29uc3RGaXhlZFNlZ21lbnRSZXR1cm5UeXBlIHsgdHlwZWRlZiBjb25zdCBWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkLCBTaXplPiBUeXBlOyB9OworICAgIAorICAgIC8vIE5vdGU6IFRoZSAiRGVuc2VCYXNlOjoiIHByZWZpeGVzIGFyZSBhZGRlZCB0byBoZWxwIE1TVkM5IHRvIG1hdGNoIHRoZXNlIGRlY2xhcmF0aW9ucyB3aXRoIHRoZSBsYXRlciBpbXBsZW1lbnRhdGlvbnMuCisgICAgU2VnbWVudFJldHVyblR5cGUgc2VnbWVudChJbmRleCBzdGFydCwgSW5kZXggc2l6ZSk7CisgICAgdHlwZW5hbWUgRGVuc2VCYXNlOjpDb25zdFNlZ21lbnRSZXR1cm5UeXBlIHNlZ21lbnQoSW5kZXggc3RhcnQsIEluZGV4IHNpemUpIGNvbnN0OworCisgICAgU2VnbWVudFJldHVyblR5cGUgaGVhZChJbmRleCBzaXplKTsKKyAgICB0eXBlbmFtZSBEZW5zZUJhc2U6OkNvbnN0U2VnbWVudFJldHVyblR5cGUgaGVhZChJbmRleCBzaXplKSBjb25zdDsKKworICAgIFNlZ21lbnRSZXR1cm5UeXBlIHRhaWwoSW5kZXggc2l6ZSk7CisgICAgdHlwZW5hbWUgRGVuc2VCYXNlOjpDb25zdFNlZ21lbnRSZXR1cm5UeXBlIHRhaWwoSW5kZXggc2l6ZSkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTxpbnQgU2l6ZT4gdHlwZW5hbWUgRml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZSBoZWFkKCk7CisgICAgdGVtcGxhdGU8aW50IFNpemU+IHR5cGVuYW1lIENvbnN0Rml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZSBoZWFkKCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTxpbnQgU2l6ZT4gdHlwZW5hbWUgRml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZSB0YWlsKCk7CisgICAgdGVtcGxhdGU8aW50IFNpemU+IHR5cGVuYW1lIENvbnN0Rml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZSB0YWlsKCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTxpbnQgU2l6ZT4gdHlwZW5hbWUgRml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZSBzZWdtZW50KEluZGV4IHN0YXJ0KTsKKyAgICB0ZW1wbGF0ZTxpbnQgU2l6ZT4gdHlwZW5hbWUgQ29uc3RGaXhlZFNlZ21lbnRSZXR1cm5UeXBlPFNpemU+OjpUeXBlIHNlZ21lbnQoSW5kZXggc3RhcnQpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IENvbnN0YW50UmV0dXJuVHlwZQorICAgIENvbnN0YW50KEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIGNvbnN0IFNjYWxhciYgdmFsdWUpOworICAgIHN0YXRpYyBjb25zdCBDb25zdGFudFJldHVyblR5cGUKKyAgICBDb25zdGFudChJbmRleCBzaXplLCBjb25zdCBTY2FsYXImIHZhbHVlKTsKKyAgICBzdGF0aWMgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlCisgICAgQ29uc3RhbnQoY29uc3QgU2NhbGFyJiB2YWx1ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgU2VxdWVudGlhbExpblNwYWNlZFJldHVyblR5cGUKKyAgICBMaW5TcGFjZWQoU2VxdWVudGlhbF90LCBJbmRleCBzaXplLCBjb25zdCBTY2FsYXImIGxvdywgY29uc3QgU2NhbGFyJiBoaWdoKTsKKyAgICBzdGF0aWMgY29uc3QgUmFuZG9tQWNjZXNzTGluU3BhY2VkUmV0dXJuVHlwZQorICAgIExpblNwYWNlZChJbmRleCBzaXplLCBjb25zdCBTY2FsYXImIGxvdywgY29uc3QgU2NhbGFyJiBoaWdoKTsKKyAgICBzdGF0aWMgY29uc3QgU2VxdWVudGlhbExpblNwYWNlZFJldHVyblR5cGUKKyAgICBMaW5TcGFjZWQoU2VxdWVudGlhbF90LCBjb25zdCBTY2FsYXImIGxvdywgY29uc3QgU2NhbGFyJiBoaWdoKTsKKyAgICBzdGF0aWMgY29uc3QgUmFuZG9tQWNjZXNzTGluU3BhY2VkUmV0dXJuVHlwZQorICAgIExpblNwYWNlZChjb25zdCBTY2FsYXImIGxvdywgY29uc3QgU2NhbGFyJiBoaWdoKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbU51bGxhcnlPcD4KKyAgICBzdGF0aWMgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8Q3VzdG9tTnVsbGFyeU9wLCBEZXJpdmVkPgorICAgIE51bGxhcnlFeHByKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIGNvbnN0IEN1c3RvbU51bGxhcnlPcCYgZnVuYyk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tTnVsbGFyeU9wPgorICAgIHN0YXRpYyBjb25zdCBDd2lzZU51bGxhcnlPcDxDdXN0b21OdWxsYXJ5T3AsIERlcml2ZWQ+CisgICAgTnVsbGFyeUV4cHIoSW5kZXggc2l6ZSwgY29uc3QgQ3VzdG9tTnVsbGFyeU9wJiBmdW5jKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDdXN0b21OdWxsYXJ5T3A+CisgICAgc3RhdGljIGNvbnN0IEN3aXNlTnVsbGFyeU9wPEN1c3RvbU51bGxhcnlPcCwgRGVyaXZlZD4KKyAgICBOdWxsYXJ5RXhwcihjb25zdCBDdXN0b21OdWxsYXJ5T3AmIGZ1bmMpOworCisgICAgc3RhdGljIGNvbnN0IENvbnN0YW50UmV0dXJuVHlwZSBaZXJvKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpOworICAgIHN0YXRpYyBjb25zdCBDb25zdGFudFJldHVyblR5cGUgWmVybyhJbmRleCBzaXplKTsKKyAgICBzdGF0aWMgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlIFplcm8oKTsKKyAgICBzdGF0aWMgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlIE9uZXMoSW5kZXggcm93cywgSW5kZXggY29scyk7CisgICAgc3RhdGljIGNvbnN0IENvbnN0YW50UmV0dXJuVHlwZSBPbmVzKEluZGV4IHNpemUpOworICAgIHN0YXRpYyBjb25zdCBDb25zdGFudFJldHVyblR5cGUgT25lcygpOworCisgICAgdm9pZCBmaWxsKGNvbnN0IFNjYWxhciYgdmFsdWUpOworICAgIERlcml2ZWQmIHNldENvbnN0YW50KGNvbnN0IFNjYWxhciYgdmFsdWUpOworICAgIERlcml2ZWQmIHNldExpblNwYWNlZChJbmRleCBzaXplLCBjb25zdCBTY2FsYXImIGxvdywgY29uc3QgU2NhbGFyJiBoaWdoKTsKKyAgICBEZXJpdmVkJiBzZXRMaW5TcGFjZWQoY29uc3QgU2NhbGFyJiBsb3csIGNvbnN0IFNjYWxhciYgaGlnaCk7CisgICAgRGVyaXZlZCYgc2V0WmVybygpOworICAgIERlcml2ZWQmIHNldE9uZXMoKTsKKyAgICBEZXJpdmVkJiBzZXRSYW5kb20oKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBib29sIGlzQXBwcm94KGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlciwKKyAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgYm9vbCBpc011Y2hTbWFsbGVyVGhhbihjb25zdCBSZWFsU2NhbGFyJiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGJvb2wgaXNNdWNoU21hbGxlclRoYW4oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdDsKKworICAgIGJvb2wgaXNBcHByb3hUb0NvbnN0YW50KGNvbnN0IFNjYWxhciYgdmFsdWUsIFJlYWxTY2FsYXIgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgYm9vbCBpc0NvbnN0YW50KGNvbnN0IFNjYWxhciYgdmFsdWUsIFJlYWxTY2FsYXIgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgYm9vbCBpc1plcm8oUmVhbFNjYWxhciBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdDsKKyAgICBib29sIGlzT25lcyhSZWFsU2NhbGFyIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0OworCisgICAgaW5saW5lIERlcml2ZWQmIG9wZXJhdG9yKj0oY29uc3QgU2NhbGFyJiBvdGhlcik7CisgICAgaW5saW5lIERlcml2ZWQmIG9wZXJhdG9yLz0oY29uc3QgU2NhbGFyJiBvdGhlcik7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTx0eXBlbmFtZSBpbnRlcm5hbDo6ZXZhbDxEZXJpdmVkPjo6dHlwZT46OnR5cGUgRXZhbFJldHVyblR5cGU7CisgICAgLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggb3IgdmVjdG9yIG9idGFpbmVkIGJ5IGV2YWx1YXRpbmcgdGhpcyBleHByZXNzaW9uLgorICAgICAgKgorICAgICAgKiBOb3RpY2UgdGhhdCBpbiB0aGUgY2FzZSBvZiBhIHBsYWluIG1hdHJpeCBvciB2ZWN0b3IgKG5vdCBhbiBleHByZXNzaW9uKSB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucworICAgICAgKiBhIGNvbnN0IHJlZmVyZW5jZSwgaW4gb3JkZXIgdG8gYXZvaWQgYSB1c2VsZXNzIGNvcHkuCisgICAgICAqLworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgRXZhbFJldHVyblR5cGUgZXZhbCgpIGNvbnN0CisgICAgeworICAgICAgLy8gRXZlbiB0aG91Z2ggTVNWQyBkb2VzIG5vdCBob25vciBzdHJvbmcgaW5saW5pbmcgd2hlbiB0aGUgcmV0dXJuIHR5cGUKKyAgICAgIC8vIGlzIGEgZHluYW1pYyBtYXRyaXgsIHdlIGRlc3BlcmF0ZWx5IG5lZWQgc3Ryb25nIGlubGluaW5nIGZvciBmaXhlZAorICAgICAgLy8gc2l6ZSB0eXBlcyBvbiBNU1ZDLgorICAgICAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpldmFsPERlcml2ZWQ+Ojp0eXBlKGRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIHN3YXBzICp0aGlzIHdpdGggdGhlIGV4cHJlc3Npb24gXGEgb3RoZXIuCisgICAgICAqCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIHN3YXAoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLAorICAgICAgICAgICAgICBpbnQgPSBPdGhlckRlcml2ZWQ6OlRoaXNDb25zdGFudElzUHJpdmF0ZUluUGxhaW5PYmplY3RCYXNlKQorICAgIHsKKyAgICAgIFN3YXBXcmFwcGVyPERlcml2ZWQ+KGRlcml2ZWQoKSkubGF6eUFzc2lnbihvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBzd2FwcyAqdGhpcyB3aXRoIHRoZSBtYXRyaXggb3IgYXJyYXkgXGEgb3RoZXIuCisgICAgICAqCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIHN3YXAoUGxhaW5PYmplY3RCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIFN3YXBXcmFwcGVyPERlcml2ZWQ+KGRlcml2ZWQoKSkubGF6eUFzc2lnbihvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworCisgICAgaW5saW5lIGNvbnN0IE5lc3RCeVZhbHVlPERlcml2ZWQ+IG5lc3RCeVZhbHVlKCkgY29uc3Q7CisgICAgaW5saW5lIGNvbnN0IEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPiBmb3JjZUFsaWduZWRBY2Nlc3MoKSBjb25zdDsKKyAgICBpbmxpbmUgRm9yY2VBbGlnbmVkQWNjZXNzPERlcml2ZWQ+IGZvcmNlQWxpZ25lZEFjY2VzcygpOworICAgIHRlbXBsYXRlPGJvb2wgRW5hYmxlPiBpbmxpbmUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPEVuYWJsZSxGb3JjZUFsaWduZWRBY2Nlc3M8RGVyaXZlZD4sRGVyaXZlZCY+Ojp0eXBlIGZvcmNlQWxpZ25lZEFjY2Vzc0lmKCkgY29uc3Q7CisgICAgdGVtcGxhdGU8Ym9vbCBFbmFibGU+IGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8RW5hYmxlLEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPixEZXJpdmVkJj46OnR5cGUgZm9yY2VBbGlnbmVkQWNjZXNzSWYoKTsKKworICAgIFNjYWxhciBzdW0oKSBjb25zdDsKKyAgICBTY2FsYXIgbWVhbigpIGNvbnN0OworICAgIFNjYWxhciB0cmFjZSgpIGNvbnN0OworCisgICAgU2NhbGFyIHByb2QoKSBjb25zdDsKKworICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBtaW5Db2VmZigpIGNvbnN0OworICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBtYXhDb2VmZigpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgorICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBtaW5Db2VmZihJbmRleFR5cGUqIHJvdywgSW5kZXhUeXBlKiBjb2wpIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgbWF4Q29lZmYoSW5kZXhUeXBlKiByb3csIEluZGV4VHlwZSogY29sKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIG1pbkNvZWZmKEluZGV4VHlwZSogaW5kZXgpIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4VHlwZT4KKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgbWF4Q29lZmYoSW5kZXhUeXBlKiBpbmRleCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcD4KKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVzdWx0X29mPEJpbmFyeU9wKHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcik+Ojp0eXBlCisgICAgcmVkdXgoY29uc3QgQmluYXJ5T3AmIGZ1bmMpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmlzaXRvcj4KKyAgICB2b2lkIHZpc2l0KFZpc2l0b3ImIGZ1bmMpIGNvbnN0OworCisgICAgaW5saW5lIGNvbnN0IFdpdGhGb3JtYXQ8RGVyaXZlZD4gZm9ybWF0KGNvbnN0IElPRm9ybWF0JiBmbXQpIGNvbnN0OworCisgICAgLyoqIFxyZXR1cm5zIHRoZSB1bmlxdWUgY29lZmZpY2llbnQgb2YgYSAxeDEgZXhwcmVzc2lvbiAqLworICAgIENvZWZmUmV0dXJuVHlwZSB2YWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TSVpFXzF4MShEZXJpdmVkKQorICAgICAgZWlnZW5fYXNzZXJ0KHRoaXMtPnJvd3MoKSA9PSAxICYmIHRoaXMtPmNvbHMoKSA9PSAxKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkuY29lZmYoMCwwKTsKKyAgICB9CisKKy8vLy8vLy8vLy8vIEFycmF5IG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgYm9vbCBhbGwodm9pZCkgY29uc3Q7CisgICAgYm9vbCBhbnkodm9pZCkgY29uc3Q7CisgICAgSW5kZXggY291bnQoKSBjb25zdDsKKworICAgIHR5cGVkZWYgVmVjdG9yd2lzZU9wPERlcml2ZWQsIEhvcml6b250YWw+IFJvd3dpc2VSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgY29uc3QgVmVjdG9yd2lzZU9wPGNvbnN0IERlcml2ZWQsIEhvcml6b250YWw+IENvbnN0Um93d2lzZVJldHVyblR5cGU7CisgICAgdHlwZWRlZiBWZWN0b3J3aXNlT3A8RGVyaXZlZCwgVmVydGljYWw+IENvbHdpc2VSZXR1cm5UeXBlOworICAgIHR5cGVkZWYgY29uc3QgVmVjdG9yd2lzZU9wPGNvbnN0IERlcml2ZWQsIFZlcnRpY2FsPiBDb25zdENvbHdpc2VSZXR1cm5UeXBlOworCisgICAgQ29uc3RSb3d3aXNlUmV0dXJuVHlwZSByb3d3aXNlKCkgY29uc3Q7CisgICAgUm93d2lzZVJldHVyblR5cGUgcm93d2lzZSgpOworICAgIENvbnN0Q29sd2lzZVJldHVyblR5cGUgY29sd2lzZSgpIGNvbnN0OworICAgIENvbHdpc2VSZXR1cm5UeXBlIGNvbHdpc2UoKTsKKworICAgIHN0YXRpYyBjb25zdCBDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3JhbmRvbV9vcDxTY2FsYXI+LERlcml2ZWQ+IFJhbmRvbShJbmRleCByb3dzLCBJbmRleCBjb2xzKTsKKyAgICBzdGF0aWMgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9yYW5kb21fb3A8U2NhbGFyPixEZXJpdmVkPiBSYW5kb20oSW5kZXggc2l6ZSk7CisgICAgc3RhdGljIGNvbnN0IEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfcmFuZG9tX29wPFNjYWxhcj4sRGVyaXZlZD4gUmFuZG9tKCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVuRGVyaXZlZCx0eXBlbmFtZSBFbHNlRGVyaXZlZD4KKyAgICBjb25zdCBTZWxlY3Q8RGVyaXZlZCxUaGVuRGVyaXZlZCxFbHNlRGVyaXZlZD4KKyAgICBzZWxlY3QoY29uc3QgRGVuc2VCYXNlPFRoZW5EZXJpdmVkPiYgdGhlbk1hdHJpeCwKKyAgICAgICAgICAgY29uc3QgRGVuc2VCYXNlPEVsc2VEZXJpdmVkPiYgZWxzZU1hdHJpeCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVuRGVyaXZlZD4KKyAgICBpbmxpbmUgY29uc3QgU2VsZWN0PERlcml2ZWQsVGhlbkRlcml2ZWQsIHR5cGVuYW1lIFRoZW5EZXJpdmVkOjpDb25zdGFudFJldHVyblR5cGU+CisgICAgc2VsZWN0KGNvbnN0IERlbnNlQmFzZTxUaGVuRGVyaXZlZD4mIHRoZW5NYXRyaXgsIHR5cGVuYW1lIFRoZW5EZXJpdmVkOjpTY2FsYXIgZWxzZVNjYWxhcikgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFbHNlRGVyaXZlZD4KKyAgICBpbmxpbmUgY29uc3QgU2VsZWN0PERlcml2ZWQsIHR5cGVuYW1lIEVsc2VEZXJpdmVkOjpDb25zdGFudFJldHVyblR5cGUsIEVsc2VEZXJpdmVkID4KKyAgICBzZWxlY3QodHlwZW5hbWUgRWxzZURlcml2ZWQ6OlNjYWxhciB0aGVuU2NhbGFyLCBjb25zdCBEZW5zZUJhc2U8RWxzZURlcml2ZWQ+JiBlbHNlTWF0cml4KSBjb25zdDsKKworICAgIHRlbXBsYXRlPGludCBwPiBSZWFsU2NhbGFyIGxwTm9ybSgpIGNvbnN0OworCisgICAgdGVtcGxhdGU8aW50IFJvd0ZhY3RvciwgaW50IENvbEZhY3Rvcj4KKyAgICBjb25zdCBSZXBsaWNhdGU8RGVyaXZlZCxSb3dGYWN0b3IsQ29sRmFjdG9yPiByZXBsaWNhdGUoKSBjb25zdDsKKyAgICBjb25zdCBSZXBsaWNhdGU8RGVyaXZlZCxEeW5hbWljLER5bmFtaWM+IHJlcGxpY2F0ZShJbmRleCByb3dGYWNvcixJbmRleCBjb2xGYWN0b3IpIGNvbnN0OworCisgICAgdHlwZWRlZiBSZXZlcnNlPERlcml2ZWQsIEJvdGhEaXJlY3Rpb25zPiBSZXZlcnNlUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IFJldmVyc2U8Y29uc3QgRGVyaXZlZCwgQm90aERpcmVjdGlvbnM+IENvbnN0UmV2ZXJzZVJldHVyblR5cGU7CisgICAgUmV2ZXJzZVJldHVyblR5cGUgcmV2ZXJzZSgpOworICAgIENvbnN0UmV2ZXJzZVJldHVyblR5cGUgcmV2ZXJzZSgpIGNvbnN0OworICAgIHZvaWQgcmV2ZXJzZUluUGxhY2UoKTsKKworI2RlZmluZSBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUyBFaWdlbjo6RGVuc2VCYXNlCisjICAgaW5jbHVkZSAiLi4vcGx1Z2lucy9CbG9ja01ldGhvZHMuaCIKKyMgICBpZmRlZiBFSUdFTl9ERU5TRUJBU0VfUExVR0lOCisjICAgICBpbmNsdWRlIEVJR0VOX0RFTlNFQkFTRV9QTFVHSU4KKyMgICBlbmRpZgorI3VuZGVmIEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTCisKKyNpZmRlZiBFSUdFTjJfU1VQUE9SVAorCisgICAgQmxvY2s8RGVyaXZlZD4gY29ybmVyKENvcm5lclR5cGUgdHlwZSwgSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKTsKKyAgICBjb25zdCBCbG9jazxEZXJpdmVkPiBjb3JuZXIoQ29ybmVyVHlwZSB0eXBlLCBJbmRleCBjUm93cywgSW5kZXggY0NvbHMpIGNvbnN0OworICAgIHRlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgorICAgIEJsb2NrPERlcml2ZWQsIENSb3dzLCBDQ29scz4gY29ybmVyKENvcm5lclR5cGUgdHlwZSk7CisgICAgdGVtcGxhdGU8aW50IENSb3dzLCBpbnQgQ0NvbHM+CisgICAgY29uc3QgQmxvY2s8RGVyaXZlZCwgQ1Jvd3MsIENDb2xzPiBjb3JuZXIoQ29ybmVyVHlwZSB0eXBlKSBjb25zdDsKKworI2VuZGlmIC8vIEVJR0VOMl9TVVBQT1JUCisKKworICAgIC8vIGRpc2FibGUgdGhlIHVzZSBvZiBldmFsVG8gZm9yIGRlbnNlIG9iamVjdHMgd2l0aCBhIG5pY2UgY29tcGlsYXRpb24gZXJyb3IKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPERlc3Qsdm9pZD46OnZhbHVlKSxUSEVfRVZBTF9FVkFMVE9fRlVOQ1RJT05fU0hPVUxEX05FVkVSX0JFX0NBTExFRF9GT1JfREVOU0VfT0JKRUNUUyk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gRG8gbm90aGluZy4gKi8KKyAgICBEZW5zZUJhc2UoKQorICAgIHsKKyAgICAgIC8qIEp1c3QgY2hlY2tzIGZvciBzZWxmLWNvbnNpc3RlbmN5IG9mIHRoZSBmbGFncy4KKyAgICAgICAqIE9ubHkgZG8gaXQgd2hlbiBkZWJ1Z2dpbmcgRWlnZW4sIGFzIHRoaXMgYm9yZGVycyBvbiBwYXJhbm9pYWMgYW5kIGNvdWxkIHNsb3cgY29tcGlsYXRpb24gZG93bgorICAgICAgICovCisjaWZkZWYgRUlHRU5fSU5URVJOQUxfREVCVUdHSU5HCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFSUdFTl9JTVBMSUVTKE1heFJvd3NBdENvbXBpbGVUaW1lPT0xICYmIE1heENvbHNBdENvbXBpbGVUaW1lIT0xLCBpbnQoSXNSb3dNYWpvcikpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBFSUdFTl9JTVBMSUVTKE1heENvbHNBdENvbXBpbGVUaW1lPT0xICYmIE1heFJvd3NBdENvbXBpbGVUaW1lIT0xLCBpbnQoIUlzUm93TWFqb3IpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfU1RPUkFHRV9PUkRFUl9GT1JfVEhJU19WRUNUT1JfRVhQUkVTU0lPTikKKyNlbmRpZgorICAgIH0KKworICBwcml2YXRlOgorICAgIGV4cGxpY2l0IERlbnNlQmFzZShpbnQpOworICAgIERlbnNlQmFzZShpbnQsaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGV4cGxpY2l0IERlbnNlQmFzZShjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ERU5TRUJBU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRGVuc2VDb2VmZnNCYXNlLmggYi9FaWdlbi9zcmMvQ29yZS9EZW5zZUNvZWZmc0Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjcwNGMyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvRGVuc2VDb2VmZnNCYXNlLmgKQEAgLTAsMCArMSw3NTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0RFTlNFQ09FRkZTQkFTRV9ICisjZGVmaW5lIEVJR0VOX0RFTlNFQ09FRkZTQkFTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgYWRkX2NvbnN0X29uX3ZhbHVlX3R5cGVfaWZfYXJpdGhtZXRpYworeworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPGlzX2FyaXRobWV0aWM8VD46OnZhbHVlLCBULCB0eXBlbmFtZSBhZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxUPjo6dHlwZT46OnR5cGUgdHlwZTsKK307Cit9CisKKy8qKiBcYnJpZWYgQmFzZSBjbGFzcyBwcm92aWRpbmcgcmVhZC1vbmx5IGNvZWZmaWNpZW50IGFjY2VzcyB0byBtYXRyaWNlcyBhbmQgYXJyYXlzLgorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICogXHRwYXJhbSBEZXJpdmVkIFR5cGUgb2YgdGhlIGRlcml2ZWQgY2xhc3MKKyAgKiBcdHBhcmFtICNSZWFkT25seUFjY2Vzc29ycyBDb25zdGFudCBpbmRpY2F0aW5nIHJlYWQtb25seSBhY2Nlc3MKKyAgKgorICAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgXGMgb3BlcmF0b3IoKSBcYyBjb25zdCBmdW5jdGlvbiBhbmQgZnJpZW5kcywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVhZCBzcGVjaWZpYworICAqIGVudHJpZXMgb2YgYSBtYXRyaXggb3IgYXJyYXkuCisgICogCisgICogXHNhIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBXcml0ZUFjY2Vzc29ycz4sIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBEaXJlY3RBY2Nlc3NvcnM+LAorICAqICAgICBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCxSZWFkT25seUFjY2Vzc29ycz4gOiBwdWJsaWMgRWlnZW5CYXNlPERlcml2ZWQ+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisKKyAgICAvLyBFeHBsYW5hdGlvbiBmb3IgdGhpcyBDb2VmZlJldHVyblR5cGUgdHlwZWRlZi4KKyAgICAvLyAtIFRoaXMgaXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBjb2VmZigpIG1ldGhvZC4KKyAgICAvLyAtIFRoZSBMdmFsdWVCaXQgbWVhbnMgZXhhY3RseSB0aGF0IHdlIGNhbiBvZmZlciBhIGNvZWZmUmVmKCkgbWV0aG9kLCB3aGljaCBtZWFucyBleGFjdGx5IHRoYXQgd2UgY2FuIGdldCByZWZlcmVuY2VzCisgICAgLy8gdG8gY29lZmZzLCB3aGljaCBtZWFucyBleGFjdGx5IHRoYXQgd2UgY2FuIGhhdmUgY29lZmYoKSByZXR1cm4gYSBjb25zdCByZWZlcmVuY2UgKGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGEgdmFsdWUpLgorICAgIC8vIC0gVGhlIGlzX2FydGlobWV0aWMgY2hlY2sgaXMgcmVxdWlyZWQgc2luY2UgImNvbnN0IGludCIsICJjb25zdCBkb3VibGUiLCBldGMuIHdpbGwgY2F1c2Ugd2FybmluZ3Mgb24gc29tZSBzeXN0ZW1zCisgICAgLy8gd2hpbGUgdGhlIGRlY2xhcmF0aW9uIG9mICJjb25zdCBUIiwgd2hlcmUgVCBpcyBhIG5vbiBhcml0aG1ldGljIHR5cGUgZG9lcyBub3QuIEFsd2F5cyByZXR1cm5pbmcgImNvbnN0IFNjYWxhciYiIGlzCisgICAgLy8gbm90IHBvc3NpYmxlLCBzaW5jZSB0aGUgdW5kZXJseWluZyBleHByZXNzaW9ucyBtaWdodCBub3Qgb2ZmZXIgYSB2YWxpZCBhZGRyZXNzIHRoZSByZWZlcmVuY2UgY291bGQgYmUgcmVmZXJyaW5nIHRvLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPGJvb2woaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MmTHZhbHVlQml0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXImLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxpbnRlcm5hbDo6aXNfYXJpdGhtZXRpYzxTY2FsYXI+Ojp2YWx1ZSwgU2NhbGFyLCBjb25zdCBTY2FsYXI+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIENvZWZmUmV0dXJuVHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlX2lmX2FyaXRobWV0aWM8CisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSBQYWNrZXRSZXR1cm5UeXBlOworCisgICAgdHlwZWRlZiBFaWdlbkJhc2U8RGVyaXZlZD4gQmFzZTsKKyAgICB1c2luZyBCYXNlOjpyb3dzOworICAgIHVzaW5nIEJhc2U6OmNvbHM7CisgICAgdXNpbmcgQmFzZTo6c2l6ZTsKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3dJbmRleEJ5T3V0ZXJJbm5lcihJbmRleCBvdXRlciwgSW5kZXggaW5uZXIpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGludChEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZSkgPT0gMSA/IDAKKyAgICAgICAgICA6IGludChEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZSkgPT0gMSA/IGlubmVyCisgICAgICAgICAgOiBpbnQoRGVyaXZlZDo6RmxhZ3MpJlJvd01ham9yQml0ID8gb3V0ZXIKKyAgICAgICAgICA6IGlubmVyOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29sSW5kZXhCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpbnQoRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWUpID09IDEgPyAwCisgICAgICAgICAgOiBpbnQoRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUpID09IDEgPyBpbm5lcgorICAgICAgICAgIDogaW50KERlcml2ZWQ6OkZsYWdzKSZSb3dNYWpvckJpdCA/IGlubmVyCisgICAgICAgICAgOiBvdXRlcjsKKyAgICB9CisKKyAgICAvKiogU2hvcnQgdmVyc2lvbjogZG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24sIHVzZQorICAgICAgKiBcbGluayBvcGVyYXRvcigpKEluZGV4LEluZGV4KSBjb25zdCBcZW5kbGluayBpbnN0ZWFkLgorICAgICAgKgorICAgICAgKiBMb25nIHZlcnNpb246IHRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0bworICAgICAgKiBcbGluayBvcGVyYXRvcigpKEluZGV4LEluZGV4KSBjb25zdCBcZW5kbGluaywgYnV0IHdpdGhvdXQgdGhlIGFzc2VydGlvbi4KKyAgICAgICogVXNlIHRoaXMgZm9yIGxpbWl0aW5nIHRoZSBwZXJmb3JtYW5jZSBjb3N0IG9mIGRlYnVnZ2luZyBjb2RlIHdoZW4gZG9pbmcKKyAgICAgICogcmVwZWF0ZWQgY29lZmZpY2llbnQgYWNjZXNzLiBPbmx5IHVzZSB0aGlzIHdoZW4gaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZQorICAgICAgKiBwYXJhbWV0ZXJzIFxhIHJvdyBhbmQgXGEgY29sIGFyZSBpbiByYW5nZS4KKyAgICAgICoKKyAgICAgICogSWYgRUlHRU5fSU5URVJOQUxfREVCVUdHSU5HIGlzIGRlZmluZWQsIGFuIGFzc2VydGlvbiB3aWxsIGJlIG1hZGUsIG1ha2luZyB0aGlzCisgICAgICAqIGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG8gXGxpbmsgb3BlcmF0b3IoKShJbmRleCxJbmRleCkgY29uc3QgXGVuZGxpbmsuCisgICAgICAqCisgICAgICAqIFxzYSBvcGVyYXRvcigpKEluZGV4LEluZGV4KSBjb25zdCwgY29lZmZSZWYoSW5kZXgsSW5kZXgpLCBjb2VmZihJbmRleCkgY29uc3QKKyAgICAgICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHJvdyA+PSAwICYmIHJvdyA8IHJvd3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29sID49IDAgJiYgY29sIDwgY29scygpKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkuY29lZmYocm93LCBjb2wpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmQnlPdXRlcklubmVyKEluZGV4IG91dGVyLCBJbmRleCBpbm5lcikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gY29lZmYocm93SW5kZXhCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKSwKKyAgICAgICAgICAgICAgICAgICBjb2xJbmRleEJ5T3V0ZXJJbm5lcihvdXRlciwgaW5uZXIpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIHRoZSBnaXZlbiByb3cgYW5kIGNvbHVtbi4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpLCBvcGVyYXRvcltdKEluZGV4KQorICAgICAgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZSBvcGVyYXRvcigpKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3cgPj0gMCAmJiByb3cgPCByb3dzKCkKKyAgICAgICAgICAmJiBjb2wgPj0gMCAmJiBjb2wgPCBjb2xzKCkpOworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5jb2VmZihyb3csIGNvbCk7CisgICAgfQorCisgICAgLyoqIFNob3J0IHZlcnNpb246IGRvbid0IHVzZSB0aGlzIGZ1bmN0aW9uLCB1c2UKKyAgICAgICogXGxpbmsgb3BlcmF0b3JbXShJbmRleCkgY29uc3QgXGVuZGxpbmsgaW5zdGVhZC4KKyAgICAgICoKKyAgICAgICogTG9uZyB2ZXJzaW9uOiB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8KKyAgICAgICogXGxpbmsgb3BlcmF0b3JbXShJbmRleCkgY29uc3QgXGVuZGxpbmssIGJ1dCB3aXRob3V0IHRoZSBhc3NlcnRpb24uCisgICAgICAqIFVzZSB0aGlzIGZvciBsaW1pdGluZyB0aGUgcGVyZm9ybWFuY2UgY29zdCBvZiBkZWJ1Z2dpbmcgY29kZSB3aGVuIGRvaW5nCisgICAgICAqIHJlcGVhdGVkIGNvZWZmaWNpZW50IGFjY2Vzcy4gT25seSB1c2UgdGhpcyB3aGVuIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUKKyAgICAgICogcGFyYW1ldGVyIFxhIGluZGV4IGlzIGluIHJhbmdlLgorICAgICAgKgorICAgICAgKiBJZiBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcgaXMgZGVmaW5lZCwgYW4gYXNzZXJ0aW9uIHdpbGwgYmUgbWFkZSwgbWFraW5nIHRoaXMKKyAgICAgICogZnVuY3Rpb24gZXF1aXZhbGVudCB0byBcbGluayBvcGVyYXRvcltdKEluZGV4KSBjb25zdCBcZW5kbGluay4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yW10oSW5kZXgpIGNvbnN0LCBjb2VmZlJlZihJbmRleCksIGNvZWZmKEluZGV4LEluZGV4KSBjb25zdAorICAgICAgKi8KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlCisgICAgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKCkpOworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5jb2VmZihpbmRleCk7CisgICAgfQorCisKKyAgICAvKiogXHJldHVybnMgdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIGluZGV4LgorICAgICAgKgorICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhbGxvd2VkIG9ubHkgZm9yIHZlY3RvciBleHByZXNzaW9ucywgYW5kIGZvciBtYXRyaXggZXhwcmVzc2lvbnMgaGF2aW5nIHRoZSBMaW5lYXJBY2Nlc3NCaXQuCisgICAgICAqCisgICAgICAqIFxzYSBvcGVyYXRvcltdKEluZGV4KSwgb3BlcmF0b3IoKShJbmRleCxJbmRleCkgY29uc3QsIHgoKSBjb25zdCwgeSgpIGNvbnN0LAorICAgICAgKiB6KCkgY29uc3QsIHcoKSBjb25zdAorICAgICAgKi8KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlCisgICAgb3BlcmF0b3JbXShJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAjaWZuZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFX0JSQUNLRVRfT1BFUkFUT1JfSVNfT05MWV9GT1JfVkVDVE9SU19fVVNFX1RIRV9QQVJFTlRIRVNJU19PUEVSQVRPUl9JTlNURUFEKQorICAgICAgI2VuZGlmCisgICAgICBlaWdlbl9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmNvZWZmKGluZGV4KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIGluZGV4LgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIHN5bm9ueW1vdXMgdG8gb3BlcmF0b3JbXShJbmRleCkgY29uc3QuCisgICAgICAqCisgICAgICAqIFRoaXMgbWV0aG9kIGlzIGFsbG93ZWQgb25seSBmb3IgdmVjdG9yIGV4cHJlc3Npb25zLCBhbmQgZm9yIG1hdHJpeCBleHByZXNzaW9ucyBoYXZpbmcgdGhlIExpbmVhckFjY2Vzc0JpdC4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yW10oSW5kZXgpLCBvcGVyYXRvcigpKEluZGV4LEluZGV4KSBjb25zdCwgeCgpIGNvbnN0LCB5KCkgY29uc3QsCisgICAgICAqIHooKSBjb25zdCwgdygpIGNvbnN0CisgICAgICAqLworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUKKyAgICBvcGVyYXRvcigpKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkuY29lZmYoaW5kZXgpOworICAgIH0KKworICAgIC8qKiBlcXVpdmFsZW50IHRvIG9wZXJhdG9yW10oMCkuICAqLworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUKKyAgICB4KCkgY29uc3QgeyByZXR1cm4gKCp0aGlzKVswXTsgfQorCisgICAgLyoqIGVxdWl2YWxlbnQgdG8gb3BlcmF0b3JbXSgxKS4gICovCisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIENvZWZmUmV0dXJuVHlwZQorICAgIHkoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpWzFdOyB9CisKKyAgICAvKiogZXF1aXZhbGVudCB0byBvcGVyYXRvcltdKDIpLiAgKi8KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgQ29lZmZSZXR1cm5UeXBlCisgICAgeigpIGNvbnN0IHsgcmV0dXJuICgqdGhpcylbMl07IH0KKworICAgIC8qKiBlcXVpdmFsZW50IHRvIG9wZXJhdG9yW10oMykuICAqLworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBDb2VmZlJldHVyblR5cGUKKyAgICB3KCkgY29uc3QgeyByZXR1cm4gKCp0aGlzKVszXTsgfQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBccmV0dXJucyB0aGUgcGFja2V0IG9mIGNvZWZmaWNpZW50cyBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gcm93IGFuZCBjb2x1bW4uIEl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkKKyAgICAgICogdG8gZW5zdXJlIHRoYXQgYSBwYWNrZXQgcmVhbGx5IHN0YXJ0cyB0aGVyZS4gVGhpcyBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgb24gZXhwcmVzc2lvbnMgaGF2aW5nIHRoZQorICAgICAgKiBQYWNrZXRBY2Nlc3NCaXQuCisgICAgICAqCisgICAgICAqIFRoZSBcYSBMb2FkTW9kZSBwYXJhbWV0ZXIgbWF5IGhhdmUgdGhlIHZhbHVlIFxhICNBbGlnbmVkIG9yIFxhICNVbmFsaWduZWQuIEl0cyBlZmZlY3QgaXMgdG8gc2VsZWN0CisgICAgICAqIHRoZSBhcHByb3ByaWF0ZSB2ZWN0b3JpemF0aW9uIGluc3RydWN0aW9uLiBBbGlnbmVkIGFjY2VzcyBpcyBmYXN0ZXIsIGJ1dCBpcyBvbmx5IHBvc3NpYmxlIGZvciBwYWNrZXRzCisgICAgICAqIHN0YXJ0aW5nIGF0IGFuIGFkZHJlc3Mgd2hpY2ggaXMgYSBtdWx0aXBsZSBvZiB0aGUgcGFja2V0IHNpemUuCisgICAgICAqLworCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHJvdyA+PSAwICYmIHJvdyA8IHJvd3MoKQorICAgICAgICAgICAgICAgICAgICAgICYmIGNvbCA+PSAwICYmIGNvbCA8IGNvbHMoKSk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4ocm93LGNvbCk7CisgICAgfQorCisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0UmV0dXJuVHlwZSBwYWNrZXRCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBwYWNrZXQ8TG9hZE1vZGU+KHJvd0luZGV4QnlPdXRlcklubmVyKG91dGVyLCBpbm5lciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xJbmRleEJ5T3V0ZXJJbm5lcihvdXRlciwgaW5uZXIpKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxyZXR1cm5zIHRoZSBwYWNrZXQgb2YgY29lZmZpY2llbnRzIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBpbmRleC4gSXQgaXMgeW91ciByZXNwb25zaWJpbGl0eQorICAgICAgKiB0byBlbnN1cmUgdGhhdCBhIHBhY2tldCByZWFsbHkgc3RhcnRzIHRoZXJlLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBleHByZXNzaW9ucyBoYXZpbmcgdGhlCisgICAgICAqIFBhY2tldEFjY2Vzc0JpdCBhbmQgdGhlIExpbmVhckFjY2Vzc0JpdC4KKyAgICAgICoKKyAgICAgICogVGhlIFxhIExvYWRNb2RlIHBhcmFtZXRlciBtYXkgaGF2ZSB0aGUgdmFsdWUgXGEgI0FsaWduZWQgb3IgXGEgI1VuYWxpZ25lZC4gSXRzIGVmZmVjdCBpcyB0byBzZWxlY3QKKyAgICAgICogdGhlIGFwcHJvcHJpYXRlIHZlY3Rvcml6YXRpb24gaW5zdHJ1Y3Rpb24uIEFsaWduZWQgYWNjZXNzIGlzIGZhc3RlciwgYnV0IGlzIG9ubHkgcG9zc2libGUgZm9yIHBhY2tldHMKKyAgICAgICogc3RhcnRpbmcgYXQgYW4gYWRkcmVzcyB3aGljaCBpcyBhIG11bHRpcGxlIG9mIHRoZSBwYWNrZXQgc2l6ZS4KKyAgICAgICovCisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRSZXR1cm5UeXBlIHBhY2tldChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgLy8gZXhwbGFuYXRpb246IERlbnNlQmFzZSBpcyBkb2luZyAidXNpbmcgLi4uIiBvbiB0aGUgbWV0aG9kcyBmcm9tIERlbnNlQ29lZmZzQmFzZS4KKyAgICAvLyBCdXQgc29tZSBtZXRob2RzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgRGlyZWN0QWNjZXNzIGNhc2UuCisgICAgLy8gU28gd2UgYWRkIGR1bW15IG1ldGhvZHMgaGVyZSB3aXRoIHRoZXNlIG5hbWVzLCBzbyB0aGF0ICJ1c2luZy4uLiAiIGRvZXNuJ3QgZmFpbC4KKyAgICAvLyBJdCdzIG5vdCBwcml2YXRlIHNvIHRoYXQgdGhlIGNoaWxkIGNsYXNzIERlbnNlQmFzZSBjYW4gYWNjZXNzIHRoZW0sIGFuZCBpdCdzIG5vdCBwdWJsaWMKKyAgICAvLyBlaXRoZXIgc2luY2UgaXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHNvIGhhcyB0byBiZSBwcm90ZWN0ZWQuCisgICAgdm9pZCBjb2VmZlJlZigpOworICAgIHZvaWQgY29lZmZSZWZCeU91dGVySW5uZXIoKTsKKyAgICB2b2lkIHdyaXRlUGFja2V0KCk7CisgICAgdm9pZCB3cml0ZVBhY2tldEJ5T3V0ZXJJbm5lcigpOworICAgIHZvaWQgY29weUNvZWZmKCk7CisgICAgdm9pZCBjb3B5Q29lZmZCeU91dGVySW5uZXIoKTsKKyAgICB2b2lkIGNvcHlQYWNrZXQoKTsKKyAgICB2b2lkIGNvcHlQYWNrZXRCeU91dGVySW5uZXIoKTsKKyAgICB2b2lkIHN0cmlkZSgpOworICAgIHZvaWQgaW5uZXJTdHJpZGUoKTsKKyAgICB2b2lkIG91dGVyU3RyaWRlKCk7CisgICAgdm9pZCByb3dTdHJpZGUoKTsKKyAgICB2b2lkIGNvbFN0cmlkZSgpOworfTsKKworLyoqIFxicmllZiBCYXNlIGNsYXNzIHByb3ZpZGluZyByZWFkL3dyaXRlIGNvZWZmaWNpZW50IGFjY2VzcyB0byBtYXRyaWNlcyBhbmQgYXJyYXlzLgorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICogXHRwYXJhbSBEZXJpdmVkIFR5cGUgb2YgdGhlIGRlcml2ZWQgY2xhc3MKKyAgKiBcdHBhcmFtICNXcml0ZUFjY2Vzc29ycyBDb25zdGFudCBpbmRpY2F0aW5nIHJlYWQvd3JpdGUgYWNjZXNzCisgICoKKyAgKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIG5vbi1jb25zdCBcYyBvcGVyYXRvcigpIGZ1bmN0aW9uIGFuZCBmcmllbmRzLCB3aGljaCBjYW4gYmUgdXNlZCB0byB3cml0ZSBzcGVjaWZpYworICAqIGVudHJpZXMgb2YgYSBtYXRyaXggb3IgYXJyYXkuIFRoaXMgY2xhc3MgaW5oZXJpdHMgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPiB3aGljaAorICAqIGRlZmluZXMgdGhlIGNvbnN0IHZhcmlhbnQgZm9yIHJlYWRpbmcgc3BlY2lmaWMgZW50cmllcy4KKyAgKiAKKyAgKiBcc2EgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIERpcmVjdEFjY2Vzc29ycz4sIFxyZWYgVG9waWNDbGFzc0hpZXJhcmNoeQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBXcml0ZUFjY2Vzc29ycz4gOiBwdWJsaWMgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBSZWFkT25seUFjY2Vzc29ycz4gQmFzZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgICB1c2luZyBCYXNlOjpjb2VmZjsKKyAgICB1c2luZyBCYXNlOjpyb3dzOworICAgIHVzaW5nIEJhc2U6OmNvbHM7CisgICAgdXNpbmcgQmFzZTo6c2l6ZTsKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworICAgIHVzaW5nIEJhc2U6OnJvd0luZGV4QnlPdXRlcklubmVyOworICAgIHVzaW5nIEJhc2U6OmNvbEluZGV4QnlPdXRlcklubmVyOworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yW107CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IoKTsKKyAgICB1c2luZyBCYXNlOjp4OworICAgIHVzaW5nIEJhc2U6Onk7CisgICAgdXNpbmcgQmFzZTo6ejsKKyAgICB1c2luZyBCYXNlOjp3OworCisgICAgLyoqIFNob3J0IHZlcnNpb246IGRvbid0IHVzZSB0aGlzIGZ1bmN0aW9uLCB1c2UKKyAgICAgICogXGxpbmsgb3BlcmF0b3IoKShJbmRleCxJbmRleCkgXGVuZGxpbmsgaW5zdGVhZC4KKyAgICAgICoKKyAgICAgICogTG9uZyB2ZXJzaW9uOiB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8KKyAgICAgICogXGxpbmsgb3BlcmF0b3IoKShJbmRleCxJbmRleCkgXGVuZGxpbmssIGJ1dCB3aXRob3V0IHRoZSBhc3NlcnRpb24uCisgICAgICAqIFVzZSB0aGlzIGZvciBsaW1pdGluZyB0aGUgcGVyZm9ybWFuY2UgY29zdCBvZiBkZWJ1Z2dpbmcgY29kZSB3aGVuIGRvaW5nCisgICAgICAqIHJlcGVhdGVkIGNvZWZmaWNpZW50IGFjY2Vzcy4gT25seSB1c2UgdGhpcyB3aGVuIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUKKyAgICAgICogcGFyYW1ldGVycyBcYSByb3cgYW5kIFxhIGNvbCBhcmUgaW4gcmFuZ2UuCisgICAgICAqCisgICAgICAqIElmIEVJR0VOX0lOVEVSTkFMX0RFQlVHR0lORyBpcyBkZWZpbmVkLCBhbiBhc3NlcnRpb24gd2lsbCBiZSBtYWRlLCBtYWtpbmcgdGhpcworICAgICAgKiBmdW5jdGlvbiBlcXVpdmFsZW50IHRvIFxsaW5rIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpIFxlbmRsaW5rLgorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3IoKShJbmRleCxJbmRleCksIGNvZWZmKEluZGV4LCBJbmRleCkgY29uc3QsIGNvZWZmUmVmKEluZGV4KQorICAgICAgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHJvdyA+PSAwICYmIHJvdyA8IHJvd3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29sID49IDAgJiYgY29sIDwgY29scygpKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJgorICAgIGNvZWZmUmVmQnlPdXRlcklubmVyKEluZGV4IG91dGVyLCBJbmRleCBpbm5lcikKKyAgICB7CisgICAgICByZXR1cm4gY29lZmZSZWYocm93SW5kZXhCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICBjb2xJbmRleEJ5T3V0ZXJJbm5lcihvdXRlciwgaW5uZXIpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIHRoZSBnaXZlbiByb3cgYW5kIGNvbHVtbi4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yW10oSW5kZXgpCisgICAgICAqLworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImCisgICAgb3BlcmF0b3IoKShJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQocm93ID49IDAgJiYgcm93IDwgcm93cygpCisgICAgICAgICAgJiYgY29sID49IDAgJiYgY29sIDwgY29scygpKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworCisgICAgLyoqIFNob3J0IHZlcnNpb246IGRvbid0IHVzZSB0aGlzIGZ1bmN0aW9uLCB1c2UKKyAgICAgICogXGxpbmsgb3BlcmF0b3JbXShJbmRleCkgXGVuZGxpbmsgaW5zdGVhZC4KKyAgICAgICoKKyAgICAgICogTG9uZyB2ZXJzaW9uOiB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8KKyAgICAgICogXGxpbmsgb3BlcmF0b3JbXShJbmRleCkgXGVuZGxpbmssIGJ1dCB3aXRob3V0IHRoZSBhc3NlcnRpb24uCisgICAgICAqIFVzZSB0aGlzIGZvciBsaW1pdGluZyB0aGUgcGVyZm9ybWFuY2UgY29zdCBvZiBkZWJ1Z2dpbmcgY29kZSB3aGVuIGRvaW5nCisgICAgICAqIHJlcGVhdGVkIGNvZWZmaWNpZW50IGFjY2Vzcy4gT25seSB1c2UgdGhpcyB3aGVuIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUKKyAgICAgICogcGFyYW1ldGVycyBcYSByb3cgYW5kIFxhIGNvbCBhcmUgaW4gcmFuZ2UuCisgICAgICAqCisgICAgICAqIElmIEVJR0VOX0lOVEVSTkFMX0RFQlVHR0lORyBpcyBkZWZpbmVkLCBhbiBhc3NlcnRpb24gd2lsbCBiZSBtYWRlLCBtYWtpbmcgdGhpcworICAgICAgKiBmdW5jdGlvbiBlcXVpdmFsZW50IHRvIFxsaW5rIG9wZXJhdG9yW10oSW5kZXgpIFxlbmRsaW5rLgorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3JbXShJbmRleCksIGNvZWZmKEluZGV4KSBjb25zdCwgY29lZmZSZWYoSW5kZXgsSW5kZXgpCisgICAgICAqLworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImCisgICAgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKCkpOworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5jb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjb2VmZmljaWVudCBhdCBnaXZlbiBpbmRleC4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgaXMgYWxsb3dlZCBvbmx5IGZvciB2ZWN0b3IgZXhwcmVzc2lvbnMsIGFuZCBmb3IgbWF0cml4IGV4cHJlc3Npb25zIGhhdmluZyB0aGUgTGluZWFyQWNjZXNzQml0LgorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3JbXShJbmRleCkgY29uc3QsIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpLCB4KCksIHkoKSwgeigpLCB3KCkKKyAgICAgICovCisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYKKyAgICBvcGVyYXRvcltdKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgICNpZm5kZWYgRUlHRU4yX1NVUFBPUlQKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVfQlJBQ0tFVF9PUEVSQVRPUl9JU19PTkxZX0ZPUl9WRUNUT1JTX19VU0VfVEhFX1BBUkVOVEhFU0lTX09QRVJBVE9SX0lOU1RFQUQpCisgICAgICAjZW5kaWYKKyAgICAgIGVpZ2VuX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgY29lZmZpY2llbnQgYXQgZ2l2ZW4gaW5kZXguCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgc3lub255bW91cyB0byBvcGVyYXRvcltdKEluZGV4KS4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgaXMgYWxsb3dlZCBvbmx5IGZvciB2ZWN0b3IgZXhwcmVzc2lvbnMsIGFuZCBmb3IgbWF0cml4IGV4cHJlc3Npb25zIGhhdmluZyB0aGUgTGluZWFyQWNjZXNzQml0LgorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3JbXShJbmRleCkgY29uc3QsIG9wZXJhdG9yKCkoSW5kZXgsSW5kZXgpLCB4KCksIHkoKSwgeigpLCB3KCkKKyAgICAgICovCisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYKKyAgICBvcGVyYXRvcigpKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIC8qKiBlcXVpdmFsZW50IHRvIG9wZXJhdG9yW10oMCkuICAqLworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImCisgICAgeCgpIHsgcmV0dXJuICgqdGhpcylbMF07IH0KKworICAgIC8qKiBlcXVpdmFsZW50IHRvIG9wZXJhdG9yW10oMSkuICAqLworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImCisgICAgeSgpIHsgcmV0dXJuICgqdGhpcylbMV07IH0KKworICAgIC8qKiBlcXVpdmFsZW50IHRvIG9wZXJhdG9yW10oMikuICAqLworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImCisgICAgeigpIHsgcmV0dXJuICgqdGhpcylbMl07IH0KKworICAgIC8qKiBlcXVpdmFsZW50IHRvIG9wZXJhdG9yW10oMykuICAqLworCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXImCisgICAgdygpIHsgcmV0dXJuICgqdGhpcylbM107IH0KKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogU3RvcmVzIHRoZSBnaXZlbiBwYWNrZXQgb2YgY29lZmZpY2llbnRzLCBhdCB0aGUgZ2l2ZW4gcm93IGFuZCBjb2x1bW4gb2YgdGhpcyBleHByZXNzaW9uLiBJdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5CisgICAgICAqIHRvIGVuc3VyZSB0aGF0IGEgcGFja2V0IHJlYWxseSBzdGFydHMgdGhlcmUuIFRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGV4cHJlc3Npb25zIGhhdmluZyB0aGUKKyAgICAgICogUGFja2V0QWNjZXNzQml0LgorICAgICAgKgorICAgICAgKiBUaGUgXGEgTG9hZE1vZGUgcGFyYW1ldGVyIG1heSBoYXZlIHRoZSB2YWx1ZSBcYSAjQWxpZ25lZCBvciBcYSAjVW5hbGlnbmVkLiBJdHMgZWZmZWN0IGlzIHRvIHNlbGVjdAorICAgICAgKiB0aGUgYXBwcm9wcmlhdGUgdmVjdG9yaXphdGlvbiBpbnN0cnVjdGlvbi4gQWxpZ25lZCBhY2Nlc3MgaXMgZmFzdGVyLCBidXQgaXMgb25seSBwb3NzaWJsZSBmb3IgcGFja2V0cworICAgICAgKiBzdGFydGluZyBhdCBhbiBhZGRyZXNzIHdoaWNoIGlzIGEgbXVsdGlwbGUgb2YgdGhlIHBhY2tldCBzaXplLgorICAgICAgKi8KKworICAgIHRlbXBsYXRlPGludCBTdG9yZU1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHdyaXRlUGFja2V0CisgICAgKEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlJiB4KQorICAgIHsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChyb3cgPj0gMCAmJiByb3cgPCByb3dzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbCA+PSAwICYmIGNvbCA8IGNvbHMoKSk7CisgICAgICBkZXJpdmVkKCkudGVtcGxhdGUgd3JpdGVQYWNrZXQ8U3RvcmVNb2RlPihyb3csY29sLHgpOworICAgIH0KKworCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPGludCBTdG9yZU1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHdyaXRlUGFja2V0QnlPdXRlcklubmVyCisgICAgKEluZGV4IG91dGVyLCBJbmRleCBpbm5lciwgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSYgeCkKKyAgICB7CisgICAgICB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KHJvd0luZGV4QnlPdXRlcklubmVyKG91dGVyLCBpbm5lciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sSW5kZXhCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFN0b3JlcyB0aGUgZ2l2ZW4gcGFja2V0IG9mIGNvZWZmaWNpZW50cywgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoaXMgZXhwcmVzc2lvbi4gSXQgaXMgeW91ciByZXNwb25zaWJpbGl0eQorICAgICAgKiB0byBlbnN1cmUgdGhhdCBhIHBhY2tldCByZWFsbHkgc3RhcnRzIHRoZXJlLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBleHByZXNzaW9ucyBoYXZpbmcgdGhlCisgICAgICAqIFBhY2tldEFjY2Vzc0JpdCBhbmQgdGhlIExpbmVhckFjY2Vzc0JpdC4KKyAgICAgICoKKyAgICAgICogVGhlIFxhIExvYWRNb2RlIHBhcmFtZXRlciBtYXkgaGF2ZSB0aGUgdmFsdWUgXGEgQWxpZ25lZCBvciBcYSBVbmFsaWduZWQuIEl0cyBlZmZlY3QgaXMgdG8gc2VsZWN0CisgICAgICAqIHRoZSBhcHByb3ByaWF0ZSB2ZWN0b3JpemF0aW9uIGluc3RydWN0aW9uLiBBbGlnbmVkIGFjY2VzcyBpcyBmYXN0ZXIsIGJ1dCBpcyBvbmx5IHBvc3NpYmxlIGZvciBwYWNrZXRzCisgICAgICAqIHN0YXJ0aW5nIGF0IGFuIGFkZHJlc3Mgd2hpY2ggaXMgYSBtdWx0aXBsZSBvZiB0aGUgcGFja2V0IHNpemUuCisgICAgICAqLworICAgIHRlbXBsYXRlPGludCBTdG9yZU1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHdyaXRlUGFja2V0CisgICAgKEluZGV4IGluZGV4LCBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlJiB4KQorICAgIHsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgc2l6ZSgpKTsKKyAgICAgIGRlcml2ZWQoKS50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KGluZGV4LHgpOworICAgIH0KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisgICAgLyoqIFxpbnRlcm5hbCBDb3BpZXMgdGhlIGNvZWZmaWNpZW50IGF0IHBvc2l0aW9uIChyb3csY29sKSBvZiBvdGhlciBpbnRvICp0aGlzLgorICAgICAgKgorICAgICAgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGluIFN3YXBXcmFwcGVyLCBhbGxvd2luZyBzd2FwKCkgYXNzaWdubWVudHMgdG8gc2hhcmUgOTklIG9mIHRoZWlyIGNvZGUKKyAgICAgICogd2l0aCB1c3VhbCBhc3NpZ25tZW50cy4KKyAgICAgICoKKyAgICAgICogT3V0c2lkZSBvZiB0aGlzIGludGVybmFsIHVzYWdlLCB0aGlzIG1ldGhvZCBoYXMgcHJvYmFibHkgbm8gdXNlZnVsbmVzcy4gSXQgaXMgaGlkZGVuIGluIHRoZSBwdWJsaWMgQVBJIGRveC4KKyAgICAgICovCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNvcHlDb2VmZihJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChyb3cgPj0gMCAmJiByb3cgPCByb3dzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbCA+PSAwICYmIGNvbCA8IGNvbHMoKSk7CisgICAgICBkZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpID0gb3RoZXIuZGVyaXZlZCgpLmNvZWZmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsIENvcGllcyB0aGUgY29lZmZpY2llbnQgYXQgdGhlIGdpdmVuIGluZGV4IG9mIG90aGVyIGludG8gKnRoaXMuCisgICAgICAqCisgICAgICAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gaW4gU3dhcFdyYXBwZXIsIGFsbG93aW5nIHN3YXAoKSBhc3NpZ25tZW50cyB0byBzaGFyZSA5OSUgb2YgdGhlaXIgY29kZQorICAgICAgKiB3aXRoIHVzdWFsIGFzc2lnbm1lbnRzLgorICAgICAgKgorICAgICAgKiBPdXRzaWRlIG9mIHRoaXMgaW50ZXJuYWwgdXNhZ2UsIHRoaXMgbWV0aG9kIGhhcyBwcm9iYWJseSBubyB1c2VmdWxuZXNzLiBJdCBpcyBoaWRkZW4gaW4gdGhlIHB1YmxpYyBBUEkgZG94LgorICAgICAgKi8KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY29weUNvZWZmKEluZGV4IGluZGV4LCBjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplKCkpOworICAgICAgZGVyaXZlZCgpLmNvZWZmUmVmKGluZGV4KSA9IG90aGVyLmRlcml2ZWQoKS5jb2VmZihpbmRleCk7CisgICAgfQorCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNvcHlDb2VmZkJ5T3V0ZXJJbm5lcihJbmRleCBvdXRlciwgSW5kZXggaW5uZXIsIGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBjb25zdCBJbmRleCByb3cgPSByb3dJbmRleEJ5T3V0ZXJJbm5lcihvdXRlcixpbm5lcik7CisgICAgICBjb25zdCBJbmRleCBjb2wgPSBjb2xJbmRleEJ5T3V0ZXJJbm5lcihvdXRlcixpbm5lcik7CisgICAgICAvLyBkZXJpdmVkKCkgaXMgaW1wb3J0YW50IGhlcmU6IGNvcHlDb2VmZigpIG1heSBiZSByZWltcGxlbWVudGVkIGluIERlcml2ZWQhCisgICAgICBkZXJpdmVkKCkuY29weUNvZWZmKHJvdywgY29sLCBvdGhlcik7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCBDb3BpZXMgdGhlIHBhY2tldCBhdCBwb3NpdGlvbiAocm93LGNvbCkgb2Ygb3RoZXIgaW50byAqdGhpcy4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBpbiBTd2FwV3JhcHBlciwgYWxsb3dpbmcgc3dhcCgpIGFzc2lnbm1lbnRzIHRvIHNoYXJlIDk5JSBvZiB0aGVpciBjb2RlCisgICAgICAqIHdpdGggdXN1YWwgYXNzaWdubWVudHMuCisgICAgICAqCisgICAgICAqIE91dHNpZGUgb2YgdGhpcyBpbnRlcm5hbCB1c2FnZSwgdGhpcyBtZXRob2QgaGFzIHByb2JhYmx5IG5vIHVzZWZ1bG5lc3MuIEl0IGlzIGhpZGRlbiBpbiB0aGUgcHVibGljIEFQSSBkb3guCisgICAgICAqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCBpbnQgU3RvcmVNb2RlLCBpbnQgTG9hZE1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNvcHlQYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQocm93ID49IDAgJiYgcm93IDwgcm93cygpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2wgPj0gMCAmJiBjb2wgPCBjb2xzKCkpOworICAgICAgZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PFN0b3JlTW9kZT4ocm93LCBjb2wsCisgICAgICAgIG90aGVyLmRlcml2ZWQoKS50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KHJvdywgY29sKSk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCBDb3BpZXMgdGhlIHBhY2tldCBhdCB0aGUgZ2l2ZW4gaW5kZXggb2Ygb3RoZXIgaW50byAqdGhpcy4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBpbiBTd2FwV3JhcHBlciwgYWxsb3dpbmcgc3dhcCgpIGFzc2lnbm1lbnRzIHRvIHNoYXJlIDk5JSBvZiB0aGVpciBjb2RlCisgICAgICAqIHdpdGggdXN1YWwgYXNzaWdubWVudHMuCisgICAgICAqCisgICAgICAqIE91dHNpZGUgb2YgdGhpcyBpbnRlcm5hbCB1c2FnZSwgdGhpcyBtZXRob2QgaGFzIHByb2JhYmx5IG5vIHVzZWZ1bG5lc3MuIEl0IGlzIGhpZGRlbiBpbiB0aGUgcHVibGljIEFQSSBkb3guCisgICAgICAqLworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCBpbnQgU3RvcmVNb2RlLCBpbnQgTG9hZE1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNvcHlQYWNrZXQoSW5kZXggaW5kZXgsIGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgICAgICBkZXJpdmVkKCkudGVtcGxhdGUgd3JpdGVQYWNrZXQ8U3RvcmVNb2RlPihpbmRleCwKKyAgICAgICAgb3RoZXIuZGVyaXZlZCgpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCBpbnQgU3RvcmVNb2RlLCBpbnQgTG9hZE1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNvcHlQYWNrZXRCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyLCBjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgY29uc3QgSW5kZXggcm93ID0gcm93SW5kZXhCeU91dGVySW5uZXIob3V0ZXIsaW5uZXIpOworICAgICAgY29uc3QgSW5kZXggY29sID0gY29sSW5kZXhCeU91dGVySW5uZXIob3V0ZXIsaW5uZXIpOworICAgICAgLy8gZGVyaXZlZCgpIGlzIGltcG9ydGFudCBoZXJlOiBjb3B5Q29lZmYoKSBtYXkgYmUgcmVpbXBsZW1lbnRlZCBpbiBEZXJpdmVkIQorICAgICAgZGVyaXZlZCgpLnRlbXBsYXRlIGNvcHlQYWNrZXQ8IE90aGVyRGVyaXZlZCwgU3RvcmVNb2RlLCBMb2FkTW9kZT4ocm93LCBjb2wsIG90aGVyKTsKKyAgICB9CisjZW5kaWYKKworfTsKKworLyoqIFxicmllZiBCYXNlIGNsYXNzIHByb3ZpZGluZyBkaXJlY3QgcmVhZC1vbmx5IGNvZWZmaWNpZW50IGFjY2VzcyB0byBtYXRyaWNlcyBhbmQgYXJyYXlzLgorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICogXHRwYXJhbSBEZXJpdmVkIFR5cGUgb2YgdGhlIGRlcml2ZWQgY2xhc3MKKyAgKiBcdHBhcmFtICNEaXJlY3RBY2Nlc3NvcnMgQ29uc3RhbnQgaW5kaWNhdGluZyBkaXJlY3QgYWNjZXNzCisgICoKKyAgKiBUaGlzIGNsYXNzIGRlZmluZXMgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCBzdHJpZGVzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBlbnRyaWVzIGRpcmVjdGx5LiBUaGlzIGNsYXNzCisgICogaW5oZXJpdHMgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPiB3aGljaCBkZWZpbmVzIGZ1bmN0aW9ucyB0byBhY2Nlc3MgZW50cmllcyByZWFkLW9ubHkgdXNpbmcKKyAgKiBcYyBvcGVyYXRvcigpIC4KKyAgKgorICAqIFxzYSBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCwgRGlyZWN0QWNjZXNzb3JzPiA6IHB1YmxpYyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIHVzaW5nIEJhc2U6OnJvd3M7CisgICAgdXNpbmcgQmFzZTo6Y29sczsKKyAgICB1c2luZyBCYXNlOjpzaXplOworICAgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7CisKKyAgICAvKiogXHJldHVybnMgdGhlIHBvaW50ZXIgaW5jcmVtZW50IGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGVsZW1lbnRzIHdpdGhpbiBhIHNsaWNlIGluIHRoZSBpbm5lciBkaXJlY3Rpb24uCisgICAgICAqCisgICAgICAqIFxzYSBvdXRlclN0cmlkZSgpLCByb3dTdHJpZGUoKSwgY29sU3RyaWRlKCkKKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmlubmVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBpbm5lciBzbGljZXMgKGZvciBleGFtcGxlLCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjb2x1bW5zCisgICAgICAqICAgICAgICAgIGluIGEgY29sdW1uLW1ham9yIG1hdHJpeCkuCisgICAgICAqCisgICAgICAqIFxzYSBpbm5lclN0cmlkZSgpLCByb3dTdHJpZGUoKSwgY29sU3RyaWRlKCkKKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLm91dGVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLy8gRklYTUUgc2hhbGwgd2UgcmVtb3ZlIGl0ID8KKyAgICBpbmxpbmUgSW5kZXggc3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lID8gaW5uZXJTdHJpZGUoKSA6IG91dGVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSByb3dzLgorICAgICAgKgorICAgICAgKiBcc2EgaW5uZXJTdHJpZGUoKSwgb3V0ZXJTdHJpZGUoKSwgY29sU3RyaWRlKCkKKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IHJvd1N0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIERlcml2ZWQ6OklzUm93TWFqb3IgPyBvdXRlclN0cmlkZSgpIDogaW5uZXJTdHJpZGUoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHBvaW50ZXIgaW5jcmVtZW50IGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGNvbHVtbnMuCisgICAgICAqCisgICAgICAqIFxzYSBpbm5lclN0cmlkZSgpLCBvdXRlclN0cmlkZSgpLCByb3dTdHJpZGUoKQorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggY29sU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gRGVyaXZlZDo6SXNSb3dNYWpvciA/IGlubmVyU3RyaWRlKCkgOiBvdXRlclN0cmlkZSgpOworICAgIH0KK307CisKKy8qKiBcYnJpZWYgQmFzZSBjbGFzcyBwcm92aWRpbmcgZGlyZWN0IHJlYWQvd3JpdGUgY29lZmZpY2llbnQgYWNjZXNzIHRvIG1hdHJpY2VzIGFuZCBhcnJheXMuCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKiBcdHBhcmFtIERlcml2ZWQgVHlwZSBvZiB0aGUgZGVyaXZlZCBjbGFzcworICAqIFx0cGFyYW0gI0RpcmVjdFdyaXRlQWNjZXNzb3JzIENvbnN0YW50IGluZGljYXRpbmcgZGlyZWN0IGFjY2VzcworICAqCisgICogVGhpcyBjbGFzcyBkZWZpbmVzIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggc3RyaWRlcyB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgZW50cmllcyBkaXJlY3RseS4gVGhpcyBjbGFzcworICAqIGluaGVyaXRzIERlbnNlQ29lZmZzQmFzZTxEZXJpdmVkLCBXcml0ZUFjY2Vzc29ycz4gd2hpY2ggZGVmaW5lcyBmdW5jdGlvbnMgdG8gYWNjZXNzIGVudHJpZXMgcmVhZC93cml0ZSB1c2luZworICAqIFxjIG9wZXJhdG9yKCkuCisgICoKKyAgKiBcc2EgXHJlZiBUb3BpY0NsYXNzSGllcmFyY2h5CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIERpcmVjdFdyaXRlQWNjZXNzb3JzPgorICA6IHB1YmxpYyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZCwgV3JpdGVBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgRGVuc2VDb2VmZnNCYXNlPERlcml2ZWQsIFdyaXRlQWNjZXNzb3JzPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIHVzaW5nIEJhc2U6OnJvd3M7CisgICAgdXNpbmcgQmFzZTo6Y29sczsKKyAgICB1c2luZyBCYXNlOjpzaXplOworICAgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7CisKKyAgICAvKiogXHJldHVybnMgdGhlIHBvaW50ZXIgaW5jcmVtZW50IGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGVsZW1lbnRzIHdpdGhpbiBhIHNsaWNlIGluIHRoZSBpbm5lciBkaXJlY3Rpb24uCisgICAgICAqCisgICAgICAqIFxzYSBvdXRlclN0cmlkZSgpLCByb3dTdHJpZGUoKSwgY29sU3RyaWRlKCkKKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmlubmVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBpbm5lciBzbGljZXMgKGZvciBleGFtcGxlLCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjb2x1bW5zCisgICAgICAqICAgICAgICAgIGluIGEgY29sdW1uLW1ham9yIG1hdHJpeCkuCisgICAgICAqCisgICAgICAqIFxzYSBpbm5lclN0cmlkZSgpLCByb3dTdHJpZGUoKSwgY29sU3RyaWRlKCkKKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLm91dGVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLy8gRklYTUUgc2hhbGwgd2UgcmVtb3ZlIGl0ID8KKyAgICBpbmxpbmUgSW5kZXggc3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lID8gaW5uZXJTdHJpZGUoKSA6IG91dGVyU3RyaWRlKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSByb3dzLgorICAgICAgKgorICAgICAgKiBcc2EgaW5uZXJTdHJpZGUoKSwgb3V0ZXJTdHJpZGUoKSwgY29sU3RyaWRlKCkKKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IHJvd1N0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIERlcml2ZWQ6OklzUm93TWFqb3IgPyBvdXRlclN0cmlkZSgpIDogaW5uZXJTdHJpZGUoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHBvaW50ZXIgaW5jcmVtZW50IGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGNvbHVtbnMuCisgICAgICAqCisgICAgICAqIFxzYSBpbm5lclN0cmlkZSgpLCBvdXRlclN0cmlkZSgpLCByb3dTdHJpZGUoKQorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggY29sU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gRGVyaXZlZDo6SXNSb3dNYWpvciA/IGlubmVyU3RyaWRlKCkgOiBvdXRlclN0cmlkZSgpOworICAgIH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIGJvb2wgSnVzdFJldHVyblplcm8+CitzdHJ1Y3QgZmlyc3RfYWxpZ25lZF9pbXBsCit7CisgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggcnVuKGNvbnN0IERlcml2ZWQmKQorICB7IHJldHVybiAwOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGZpcnN0X2FsaWduZWRfaW1wbDxEZXJpdmVkLCBmYWxzZT4KK3sKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBydW4oY29uc3QgRGVyaXZlZCYgbSkKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZCgmbS5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZigwLDApLCBtLnNpemUoKSk7CisgIH0KK307CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheSB0aGF0IGlzIHdlbGwgYWxpZ25lZCBmb3IgdmVjdG9yaXphdGlvbi4KKyAgKgorICAqIFRoZXJlIGlzIGFsc28gdGhlIHZhcmlhbnQgZmlyc3RfYWxpZ25lZChjb25zdCBTY2FsYXIqLCBJbnRlZ2VyKSBkZWZpbmVkIGluIE1lbW9yeS5oLiBTZWUgaXQgZm9yIG1vcmUKKyAgKiBkb2N1bWVudGF0aW9uLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0YXRpYyBpbmxpbmUgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggZmlyc3RfYWxpZ25lZChjb25zdCBEZXJpdmVkJiBtKQoreworICByZXR1cm4gZmlyc3RfYWxpZ25lZF9pbXBsCisgICAgICAgICAgPERlcml2ZWQsIChEZXJpdmVkOjpGbGFncyAmIEFsaWduZWRCaXQpIHx8ICEoRGVyaXZlZDo6RmxhZ3MgJiBEaXJlY3RBY2Nlc3NCaXQpPgorICAgICAgICAgIDo6cnVuKG0pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCBib29sIEhhc0RpcmVjdEFjY2VzcyA9IGhhc19kaXJlY3RfYWNjZXNzPERlcml2ZWQ+OjpyZXQ+CitzdHJ1Y3QgaW5uZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZQoreworICBlbnVtIHsgcmV0ID0gdHJhaXRzPERlcml2ZWQ+OjpJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgaW5uZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxEZXJpdmVkLCBmYWxzZT4KK3sKKyAgZW51bSB7IHJldCA9IDAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIGJvb2wgSGFzRGlyZWN0QWNjZXNzID0gaGFzX2RpcmVjdF9hY2Nlc3M8RGVyaXZlZD46OnJldD4KK3N0cnVjdCBvdXRlcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lCit7CisgIGVudW0geyByZXQgPSB0cmFpdHM8RGVyaXZlZD46Ok91dGVyU3RyaWRlQXRDb21waWxlVGltZSB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBvdXRlcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPERlcml2ZWQsIGZhbHNlPgoreworICBlbnVtIHsgcmV0ID0gMCB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fREVOU0VDT0VGRlNCQVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0RlbnNlU3RvcmFnZS5oIGIvRWlnZW4vc3JjL0NvcmUvRGVuc2VTdG9yYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjMmRhZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0RlbnNlU3RvcmFnZS5oCkBAIC0wLDAgKzEsMzAzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUUklYU1RPUkFHRV9ICisjZGVmaW5lIEVJR0VOX01BVFJJWFNUT1JBR0VfSAorCisjaWZkZWYgRUlHRU5fREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTgorICAjZGVmaW5lIEVJR0VOX0lOVEVSTkFMX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4gRUlHRU5fREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTjsKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fSU5URVJOQUxfREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTgorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0cnVjdCBjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQge307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBTdGF0aWMgYXJyYXkuIElmIHRoZSBNYXRyaXhPckFycmF5T3B0aW9ucyByZXF1aXJlIGF1dG8tYWxpZ25tZW50LCB0aGUgYXJyYXkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFsaWduZWQ6CisgICogdG8gMTYgYnl0ZXMgYm91bmRhcnkgaWYgdGhlIHRvdGFsIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNiBieXRlcy4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgU2l6ZSwgaW50IE1hdHJpeE9yQXJyYXlPcHRpb25zLAorICAgICAgICAgIGludCBBbGlnbm1lbnQgPSAoTWF0cml4T3JBcnJheU9wdGlvbnMmRG9udEFsaWduKSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKCgoU2l6ZSpzaXplb2YoVCkpJTE2KT09MCkgPyAxNgorICAgICAgICAgICAgICAgICAgICAgICAgOiAwID4KK3N0cnVjdCBwbGFpbl9hcnJheQoreworICBUIGFycmF5W1NpemVdOworICBwbGFpbl9hcnJheSgpIHt9CisgIHBsYWluX2FycmF5KGNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkge30KK307CisKKyNpZmRlZiBFSUdFTl9ESVNBQkxFX1VOQUxJR05FRF9BUlJBWV9BU1NFUlQKKyAgI2RlZmluZSBFSUdFTl9NQUtFX1VOQUxJR05FRF9BUlJBWV9BU1NFUlQoc2l6ZW1hc2spCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX01BS0VfVU5BTElHTkVEX0FSUkFZX0FTU0VSVChzaXplbWFzaykgXAorICAgIGVpZ2VuX2Fzc2VydCgocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGFycmF5KSAmIHNpemVtYXNrKSA9PSAwIFwKKyAgICAgICAgICAgICAgJiYgInRoaXMgYXNzZXJ0aW9uIGlzIGV4cGxhaW5lZCBoZXJlOiAiIFwKKyAgICAgICAgICAgICAgImh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL2RveC1kZXZlbC9Ub3BpY1VuYWxpZ25lZEFycmF5QXNzZXJ0Lmh0bWwiIFwKKyAgICAgICAgICAgICAgIiAqKioqIFJFQUQgVEhJUyBXRUIgUEFHRSAhISEgKioqKiIpOworI2VuZGlmCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgU2l6ZSwgaW50IE1hdHJpeE9yQXJyYXlPcHRpb25zPgorc3RydWN0IHBsYWluX2FycmF5PFQsIFNpemUsIE1hdHJpeE9yQXJyYXlPcHRpb25zLCAxNj4KK3sKKyAgRUlHRU5fVVNFUl9BTElHTjE2IFQgYXJyYXlbU2l6ZV07CisgIHBsYWluX2FycmF5KCkgeyBFSUdFTl9NQUtFX1VOQUxJR05FRF9BUlJBWV9BU1NFUlQoMHhmKSB9CisgIHBsYWluX2FycmF5KGNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkge30KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTWF0cml4T3JBcnJheU9wdGlvbnMsIGludCBBbGlnbm1lbnQ+CitzdHJ1Y3QgcGxhaW5fYXJyYXk8VCwgMCwgTWF0cml4T3JBcnJheU9wdGlvbnMsIEFsaWdubWVudD4KK3sKKyAgRUlHRU5fVVNFUl9BTElHTjE2IFQgYXJyYXlbMV07CisgIHBsYWluX2FycmF5KCkge30KKyAgcGxhaW5fYXJyYXkoY29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KSB7fQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIFxjbGFzcyBEZW5zZVN0b3JhZ2UKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIFN0b3JlcyB0aGUgZGF0YSBvZiBhIG1hdHJpeAorICAqCisgICogVGhpcyBjbGFzcyBzdG9yZXMgdGhlIGRhdGEgb2YgZml4ZWQtc2l6ZSwgZHluYW1pYy1zaXplIG9yIG1peGVkIG1hdHJpY2VzCisgICogaW4gYSB3YXkgYXMgY29tcGFjdCBhcyBwb3NzaWJsZS4KKyAgKgorICAqIFxzYSBNYXRyaXgKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBTaXplLCBpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9PcHRpb25zPiBjbGFzcyBEZW5zZVN0b3JhZ2U7CisKKy8vIHB1cmVseSBmaXhlZC1zaXplIG1hdHJpeAordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFNpemUsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX09wdGlvbnM+IGNsYXNzIERlbnNlU3RvcmFnZQoreworICAgIGludGVybmFsOjpwbGFpbl9hcnJheTxULFNpemUsX09wdGlvbnM+IG1fZGF0YTsKKyAgcHVibGljOgorICAgIGlubGluZSBleHBsaWNpdCBEZW5zZVN0b3JhZ2UoKSB7fQorICAgIGlubGluZSBEZW5zZVN0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgIDogbV9kYXRhKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQoKSkge30KKyAgICBpbmxpbmUgRGVuc2VTdG9yYWdlKERlbnNlSW5kZXgsRGVuc2VJbmRleCxEZW5zZUluZGV4KSB7fQorICAgIGlubGluZSB2b2lkIHN3YXAoRGVuc2VTdG9yYWdlJiBvdGhlcikgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IH0KKyAgICBzdGF0aWMgaW5saW5lIERlbnNlSW5kZXggcm93cyh2b2lkKSB7cmV0dXJuIF9Sb3dzO30KKyAgICBzdGF0aWMgaW5saW5lIERlbnNlSW5kZXggY29scyh2b2lkKSB7cmV0dXJuIF9Db2xzO30KKyAgICBpbmxpbmUgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoRGVuc2VJbmRleCxEZW5zZUluZGV4LERlbnNlSW5kZXgpIHt9CisgICAgaW5saW5lIHZvaWQgcmVzaXplKERlbnNlSW5kZXgsRGVuc2VJbmRleCxEZW5zZUluZGV4KSB7fQorICAgIGlubGluZSBjb25zdCBUICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmFycmF5OyB9CisgICAgaW5saW5lIFQgKmRhdGEoKSB7IHJldHVybiBtX2RhdGEuYXJyYXk7IH0KK307CisKKy8vIG51bGwgbWF0cml4Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9PcHRpb25zPiBjbGFzcyBEZW5zZVN0b3JhZ2U8VCwgMCwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucz4KK3sKKyAgcHVibGljOgorICAgIGlubGluZSBleHBsaWNpdCBEZW5zZVN0b3JhZ2UoKSB7fQorICAgIGlubGluZSBEZW5zZVN0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkge30KKyAgICBpbmxpbmUgRGVuc2VTdG9yYWdlKERlbnNlSW5kZXgsRGVuc2VJbmRleCxEZW5zZUluZGV4KSB7fQorICAgIGlubGluZSB2b2lkIHN3YXAoRGVuc2VTdG9yYWdlJiApIHt9CisgICAgc3RhdGljIGlubGluZSBEZW5zZUluZGV4IHJvd3Modm9pZCkge3JldHVybiBfUm93czt9CisgICAgc3RhdGljIGlubGluZSBEZW5zZUluZGV4IGNvbHModm9pZCkge3JldHVybiBfQ29sczt9CisgICAgaW5saW5lIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKERlbnNlSW5kZXgsRGVuc2VJbmRleCxEZW5zZUluZGV4KSB7fQorICAgIGlubGluZSB2b2lkIHJlc2l6ZShEZW5zZUluZGV4LERlbnNlSW5kZXgsRGVuc2VJbmRleCkge30KKyAgICBpbmxpbmUgY29uc3QgVCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICBpbmxpbmUgVCAqZGF0YSgpIHsgcmV0dXJuIDA7IH0KK307CisKKy8vIG1vcmUgc3BlY2lhbGl6YXRpb25zIGZvciBudWxsIG1hdHJpY2VzOyB0aGVzZSBhcmUgbmVjZXNzYXJ5IHRvIHJlc29sdmUgYW1iaWd1aXRpZXMKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBfT3B0aW9ucz4gY2xhc3MgRGVuc2VTdG9yYWdlPFQsIDAsIER5bmFtaWMsIER5bmFtaWMsIF9PcHRpb25zPgorOiBwdWJsaWMgRGVuc2VTdG9yYWdlPFQsIDAsIDAsIDAsIF9PcHRpb25zPiB7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBfUm93cywgaW50IF9PcHRpb25zPiBjbGFzcyBEZW5zZVN0b3JhZ2U8VCwgMCwgX1Jvd3MsIER5bmFtaWMsIF9PcHRpb25zPgorOiBwdWJsaWMgRGVuc2VTdG9yYWdlPFQsIDAsIDAsIDAsIF9PcHRpb25zPiB7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBfQ29scywgaW50IF9PcHRpb25zPiBjbGFzcyBEZW5zZVN0b3JhZ2U8VCwgMCwgRHluYW1pYywgX0NvbHMsIF9PcHRpb25zPgorOiBwdWJsaWMgRGVuc2VTdG9yYWdlPFQsIDAsIDAsIDAsIF9PcHRpb25zPiB7IH07CisKKy8vIGR5bmFtaWMtc2l6ZSBtYXRyaXggd2l0aCBmaXhlZC1zaXplIHN0b3JhZ2UKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBTaXplLCBpbnQgX09wdGlvbnM+IGNsYXNzIERlbnNlU3RvcmFnZTxULCBTaXplLCBEeW5hbWljLCBEeW5hbWljLCBfT3B0aW9ucz4KK3sKKyAgICBpbnRlcm5hbDo6cGxhaW5fYXJyYXk8VCxTaXplLF9PcHRpb25zPiBtX2RhdGE7CisgICAgRGVuc2VJbmRleCBtX3Jvd3M7CisgICAgRGVuc2VJbmRleCBtX2NvbHM7CisgIHB1YmxpYzoKKyAgICBpbmxpbmUgZXhwbGljaXQgRGVuc2VTdG9yYWdlKCkgOiBtX3Jvd3MoMCksIG1fY29scygwKSB7fQorICAgIGlubGluZSBEZW5zZVN0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgIDogbV9kYXRhKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQoKSksIG1fcm93cygwKSwgbV9jb2xzKDApIHt9CisgICAgaW5saW5lIERlbnNlU3RvcmFnZShEZW5zZUluZGV4LCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scykgOiBtX3Jvd3Mocm93cyksIG1fY29scyhjb2xzKSB7fQorICAgIGlubGluZSB2b2lkIHN3YXAoRGVuc2VTdG9yYWdlJiBvdGhlcikKKyAgICB7IHN0ZDo6c3dhcChtX2RhdGEsb3RoZXIubV9kYXRhKTsgc3RkOjpzd2FwKG1fcm93cyxvdGhlci5tX3Jvd3MpOyBzdGQ6OnN3YXAobV9jb2xzLG90aGVyLm1fY29scyk7IH0KKyAgICBpbmxpbmUgRGVuc2VJbmRleCByb3dzKHZvaWQpIGNvbnN0IHtyZXR1cm4gbV9yb3dzO30KKyAgICBpbmxpbmUgRGVuc2VJbmRleCBjb2xzKHZvaWQpIGNvbnN0IHtyZXR1cm4gbV9jb2xzO30KKyAgICBpbmxpbmUgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoRGVuc2VJbmRleCwgRGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4IGNvbHMpIHsgbV9yb3dzID0gcm93czsgbV9jb2xzID0gY29sczsgfQorICAgIGlubGluZSB2b2lkIHJlc2l6ZShEZW5zZUluZGV4LCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scykgeyBtX3Jvd3MgPSByb3dzOyBtX2NvbHMgPSBjb2xzOyB9CisgICAgaW5saW5lIGNvbnN0IFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuYXJyYXk7IH0KKyAgICBpbmxpbmUgVCAqZGF0YSgpIHsgcmV0dXJuIG1fZGF0YS5hcnJheTsgfQorfTsKKworLy8gZHluYW1pYy1zaXplIG1hdHJpeCB3aXRoIGZpeGVkLXNpemUgc3RvcmFnZSBhbmQgZml4ZWQgd2lkdGgKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBTaXplLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucz4gY2xhc3MgRGVuc2VTdG9yYWdlPFQsIFNpemUsIER5bmFtaWMsIF9Db2xzLCBfT3B0aW9ucz4KK3sKKyAgICBpbnRlcm5hbDo6cGxhaW5fYXJyYXk8VCxTaXplLF9PcHRpb25zPiBtX2RhdGE7CisgICAgRGVuc2VJbmRleCBtX3Jvd3M7CisgIHB1YmxpYzoKKyAgICBpbmxpbmUgZXhwbGljaXQgRGVuc2VTdG9yYWdlKCkgOiBtX3Jvd3MoMCkge30KKyAgICBpbmxpbmUgRGVuc2VTdG9yYWdlKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpCisgICAgICA6IG1fZGF0YShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KCkpLCBtX3Jvd3MoMCkge30KKyAgICBpbmxpbmUgRGVuc2VTdG9yYWdlKERlbnNlSW5kZXgsIERlbnNlSW5kZXggcm93cywgRGVuc2VJbmRleCkgOiBtX3Jvd3Mocm93cykge30KKyAgICBpbmxpbmUgdm9pZCBzd2FwKERlbnNlU3RvcmFnZSYgb3RoZXIpIHsgc3RkOjpzd2FwKG1fZGF0YSxvdGhlci5tX2RhdGEpOyBzdGQ6OnN3YXAobV9yb3dzLG90aGVyLm1fcm93cyk7IH0KKyAgICBpbmxpbmUgRGVuc2VJbmRleCByb3dzKHZvaWQpIGNvbnN0IHtyZXR1cm4gbV9yb3dzO30KKyAgICBpbmxpbmUgRGVuc2VJbmRleCBjb2xzKHZvaWQpIGNvbnN0IHtyZXR1cm4gX0NvbHM7fQorICAgIGlubGluZSB2b2lkIGNvbnNlcnZhdGl2ZVJlc2l6ZShEZW5zZUluZGV4LCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXgpIHsgbV9yb3dzID0gcm93czsgfQorICAgIGlubGluZSB2b2lkIHJlc2l6ZShEZW5zZUluZGV4LCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXgpIHsgbV9yb3dzID0gcm93czsgfQorICAgIGlubGluZSBjb25zdCBUICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmFycmF5OyB9CisgICAgaW5saW5lIFQgKmRhdGEoKSB7IHJldHVybiBtX2RhdGEuYXJyYXk7IH0KK307CisKKy8vIGR5bmFtaWMtc2l6ZSBtYXRyaXggd2l0aCBmaXhlZC1zaXplIHN0b3JhZ2UgYW5kIGZpeGVkIGhlaWdodAordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFNpemUsIGludCBfUm93cywgaW50IF9PcHRpb25zPiBjbGFzcyBEZW5zZVN0b3JhZ2U8VCwgU2l6ZSwgX1Jvd3MsIER5bmFtaWMsIF9PcHRpb25zPgoreworICAgIGludGVybmFsOjpwbGFpbl9hcnJheTxULFNpemUsX09wdGlvbnM+IG1fZGF0YTsKKyAgICBEZW5zZUluZGV4IG1fY29sczsKKyAgcHVibGljOgorICAgIGlubGluZSBleHBsaWNpdCBEZW5zZVN0b3JhZ2UoKSA6IG1fY29scygwKSB7fQorICAgIGlubGluZSBEZW5zZVN0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgIDogbV9kYXRhKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQoKSksIG1fY29scygwKSB7fQorICAgIGlubGluZSBEZW5zZVN0b3JhZ2UoRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgRGVuc2VJbmRleCBjb2xzKSA6IG1fY29scyhjb2xzKSB7fQorICAgIGlubGluZSB2b2lkIHN3YXAoRGVuc2VTdG9yYWdlJiBvdGhlcikgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IHN0ZDo6c3dhcChtX2NvbHMsb3RoZXIubV9jb2xzKTsgfQorICAgIGlubGluZSBEZW5zZUluZGV4IHJvd3Modm9pZCkgY29uc3Qge3JldHVybiBfUm93czt9CisgICAgaW5saW5lIERlbnNlSW5kZXggY29scyh2b2lkKSBjb25zdCB7cmV0dXJuIG1fY29sczt9CisgICAgaW5saW5lIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIERlbnNlSW5kZXggY29scykgeyBtX2NvbHMgPSBjb2xzOyB9CisgICAgaW5saW5lIHZvaWQgcmVzaXplKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIERlbnNlSW5kZXggY29scykgeyBtX2NvbHMgPSBjb2xzOyB9CisgICAgaW5saW5lIGNvbnN0IFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuYXJyYXk7IH0KKyAgICBpbmxpbmUgVCAqZGF0YSgpIHsgcmV0dXJuIG1fZGF0YS5hcnJheTsgfQorfTsKKworLy8gcHVyZWx5IGR5bmFtaWMgbWF0cml4LgordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IF9PcHRpb25zPiBjbGFzcyBEZW5zZVN0b3JhZ2U8VCwgRHluYW1pYywgRHluYW1pYywgRHluYW1pYywgX09wdGlvbnM+Cit7CisgICAgVCAqbV9kYXRhOworICAgIERlbnNlSW5kZXggbV9yb3dzOworICAgIERlbnNlSW5kZXggbV9jb2xzOworICBwdWJsaWM6CisgICAgaW5saW5lIGV4cGxpY2l0IERlbnNlU3RvcmFnZSgpIDogbV9kYXRhKDApLCBtX3Jvd3MoMCksIG1fY29scygwKSB7fQorICAgIGlubGluZSBEZW5zZVN0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgICA6IG1fZGF0YSgwKSwgbV9yb3dzKDApLCBtX2NvbHMoMCkge30KKyAgICBpbmxpbmUgRGVuc2VTdG9yYWdlKERlbnNlSW5kZXggc2l6ZSwgRGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4IGNvbHMpCisgICAgICA6IG1fZGF0YShpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9uZXdfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihzaXplKSksIG1fcm93cyhyb3dzKSwgbV9jb2xzKGNvbHMpIAorICAgIHsgRUlHRU5fSU5URVJOQUxfREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTiB9CisgICAgaW5saW5lIH5EZW5zZVN0b3JhZ2UoKSB7IGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2RlbGV0ZV9hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgbV9yb3dzKm1fY29scyk7IH0KKyAgICBpbmxpbmUgdm9pZCBzd2FwKERlbnNlU3RvcmFnZSYgb3RoZXIpCisgICAgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IHN0ZDo6c3dhcChtX3Jvd3Msb3RoZXIubV9yb3dzKTsgc3RkOjpzd2FwKG1fY29scyxvdGhlci5tX2NvbHMpOyB9CisgICAgaW5saW5lIERlbnNlSW5kZXggcm93cyh2b2lkKSBjb25zdCB7cmV0dXJuIG1fcm93czt9CisgICAgaW5saW5lIERlbnNlSW5kZXggY29scyh2b2lkKSBjb25zdCB7cmV0dXJuIG1fY29sczt9CisgICAgaW5saW5lIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKERlbnNlSW5kZXggc2l6ZSwgRGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4IGNvbHMpCisgICAgeworICAgICAgbV9kYXRhID0gaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfcmVhbGxvY19uZXdfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihtX2RhdGEsIHNpemUsIG1fcm93cyptX2NvbHMpOworICAgICAgbV9yb3dzID0gcm93czsKKyAgICAgIG1fY29scyA9IGNvbHM7CisgICAgfQorICAgIHZvaWQgcmVzaXplKERlbnNlSW5kZXggc2l6ZSwgRGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4IGNvbHMpCisgICAgeworICAgICAgaWYoc2l6ZSAhPSBtX3Jvd3MqbV9jb2xzKQorICAgICAgeworICAgICAgICBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9kZWxldGVfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihtX2RhdGEsIG1fcm93cyptX2NvbHMpOworICAgICAgICBpZiAoc2l6ZSkKKyAgICAgICAgICBtX2RhdGEgPSBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9uZXdfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1fZGF0YSA9IDA7CisgICAgICAgIEVJR0VOX0lOVEVSTkFMX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgIH0KKyAgICAgIG1fcm93cyA9IHJvd3M7CisgICAgICBtX2NvbHMgPSBjb2xzOworICAgIH0KKyAgICBpbmxpbmUgY29uc3QgVCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIGlubGluZSBUICpkYXRhKCkgeyByZXR1cm4gbV9kYXRhOyB9Cit9OworCisvLyBtYXRyaXggd2l0aCBkeW5hbWljIHdpZHRoIGFuZCBmaXhlZCBoZWlnaHQgKHNvIHRoYXQgbWF0cml4IGhhcyBkeW5hbWljIHNpemUpLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IF9Sb3dzLCBpbnQgX09wdGlvbnM+IGNsYXNzIERlbnNlU3RvcmFnZTxULCBEeW5hbWljLCBfUm93cywgRHluYW1pYywgX09wdGlvbnM+Cit7CisgICAgVCAqbV9kYXRhOworICAgIERlbnNlSW5kZXggbV9jb2xzOworICBwdWJsaWM6CisgICAgaW5saW5lIGV4cGxpY2l0IERlbnNlU3RvcmFnZSgpIDogbV9kYXRhKDApLCBtX2NvbHMoMCkge30KKyAgICBpbmxpbmUgRGVuc2VTdG9yYWdlKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpIDogbV9kYXRhKDApLCBtX2NvbHMoMCkge30KKyAgICBpbmxpbmUgRGVuc2VTdG9yYWdlKERlbnNlSW5kZXggc2l6ZSwgRGVuc2VJbmRleCwgRGVuc2VJbmRleCBjb2xzKSA6IG1fZGF0YShpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9uZXdfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihzaXplKSksIG1fY29scyhjb2xzKQorICAgIHsgRUlHRU5fSU5URVJOQUxfREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTiB9CisgICAgaW5saW5lIH5EZW5zZVN0b3JhZ2UoKSB7IGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2RlbGV0ZV9hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgX1Jvd3MqbV9jb2xzKTsgfQorICAgIGlubGluZSB2b2lkIHN3YXAoRGVuc2VTdG9yYWdlJiBvdGhlcikgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IHN0ZDo6c3dhcChtX2NvbHMsb3RoZXIubV9jb2xzKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgRGVuc2VJbmRleCByb3dzKHZvaWQpIHtyZXR1cm4gX1Jvd3M7fQorICAgIGlubGluZSBEZW5zZUluZGV4IGNvbHModm9pZCkgY29uc3Qge3JldHVybiBtX2NvbHM7fQorICAgIGlubGluZSB2b2lkIGNvbnNlcnZhdGl2ZVJlc2l6ZShEZW5zZUluZGV4IHNpemUsIERlbnNlSW5kZXgsIERlbnNlSW5kZXggY29scykKKyAgICB7CisgICAgICBtX2RhdGEgPSBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9yZWFsbG9jX25ld19hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgc2l6ZSwgX1Jvd3MqbV9jb2xzKTsKKyAgICAgIG1fY29scyA9IGNvbHM7CisgICAgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZXNpemUoRGVuc2VJbmRleCBzaXplLCBEZW5zZUluZGV4LCBEZW5zZUluZGV4IGNvbHMpCisgICAgeworICAgICAgaWYoc2l6ZSAhPSBfUm93cyptX2NvbHMpCisgICAgICB7CisgICAgICAgIGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2RlbGV0ZV9hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgX1Jvd3MqbV9jb2xzKTsKKyAgICAgICAgaWYgKHNpemUpCisgICAgICAgICAgbV9kYXRhID0gaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG88VCwoX09wdGlvbnMmRG9udEFsaWduKT09MD4oc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtX2RhdGEgPSAwOworICAgICAgICBFSUdFTl9JTlRFUk5BTF9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICB9CisgICAgICBtX2NvbHMgPSBjb2xzOworICAgIH0KKyAgICBpbmxpbmUgY29uc3QgVCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIGlubGluZSBUICpkYXRhKCkgeyByZXR1cm4gbV9kYXRhOyB9Cit9OworCisvLyBtYXRyaXggd2l0aCBkeW5hbWljIGhlaWdodCBhbmQgZml4ZWQgd2lkdGggKHNvIHRoYXQgbWF0cml4IGhhcyBkeW5hbWljIHNpemUpLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IF9Db2xzLCBpbnQgX09wdGlvbnM+IGNsYXNzIERlbnNlU3RvcmFnZTxULCBEeW5hbWljLCBEeW5hbWljLCBfQ29scywgX09wdGlvbnM+Cit7CisgICAgVCAqbV9kYXRhOworICAgIERlbnNlSW5kZXggbV9yb3dzOworICBwdWJsaWM6CisgICAgaW5saW5lIGV4cGxpY2l0IERlbnNlU3RvcmFnZSgpIDogbV9kYXRhKDApLCBtX3Jvd3MoMCkge30KKyAgICBpbmxpbmUgRGVuc2VTdG9yYWdlKGludGVybmFsOjpjb25zdHJ1Y3Rvcl93aXRob3V0X3VuYWxpZ25lZF9hcnJheV9hc3NlcnQpIDogbV9kYXRhKDApLCBtX3Jvd3MoMCkge30KKyAgICBpbmxpbmUgRGVuc2VTdG9yYWdlKERlbnNlSW5kZXggc2l6ZSwgRGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4KSA6IG1fZGF0YShpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9uZXdfYXV0bzxULChfT3B0aW9ucyZEb250QWxpZ24pPT0wPihzaXplKSksIG1fcm93cyhyb3dzKQorICAgIHsgRUlHRU5fSU5URVJOQUxfREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTiB9CisgICAgaW5saW5lIH5EZW5zZVN0b3JhZ2UoKSB7IGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2RlbGV0ZV9hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgX0NvbHMqbV9yb3dzKTsgfQorICAgIGlubGluZSB2b2lkIHN3YXAoRGVuc2VTdG9yYWdlJiBvdGhlcikgeyBzdGQ6OnN3YXAobV9kYXRhLG90aGVyLm1fZGF0YSk7IHN0ZDo6c3dhcChtX3Jvd3Msb3RoZXIubV9yb3dzKTsgfQorICAgIGlubGluZSBEZW5zZUluZGV4IHJvd3Modm9pZCkgY29uc3Qge3JldHVybiBtX3Jvd3M7fQorICAgIHN0YXRpYyBpbmxpbmUgRGVuc2VJbmRleCBjb2xzKHZvaWQpIHtyZXR1cm4gX0NvbHM7fQorICAgIGlubGluZSB2b2lkIGNvbnNlcnZhdGl2ZVJlc2l6ZShEZW5zZUluZGV4IHNpemUsIERlbnNlSW5kZXggcm93cywgRGVuc2VJbmRleCkKKyAgICB7CisgICAgICBtX2RhdGEgPSBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9yZWFsbG9jX25ld19hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgc2l6ZSwgbV9yb3dzKl9Db2xzKTsKKyAgICAgIG1fcm93cyA9IHJvd3M7CisgICAgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZXNpemUoRGVuc2VJbmRleCBzaXplLCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXgpCisgICAgeworICAgICAgaWYoc2l6ZSAhPSBtX3Jvd3MqX0NvbHMpCisgICAgICB7CisgICAgICAgIGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX2RlbGV0ZV9hdXRvPFQsKF9PcHRpb25zJkRvbnRBbGlnbik9PTA+KG1fZGF0YSwgX0NvbHMqbV9yb3dzKTsKKyAgICAgICAgaWYgKHNpemUpCisgICAgICAgICAgbV9kYXRhID0gaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG88VCwoX09wdGlvbnMmRG9udEFsaWduKT09MD4oc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtX2RhdGEgPSAwOworICAgICAgICBFSUdFTl9JTlRFUk5BTF9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICB9CisgICAgICBtX3Jvd3MgPSByb3dzOworICAgIH0KKyAgICBpbmxpbmUgY29uc3QgVCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIGlubGluZSBUICpkYXRhKCkgeyByZXR1cm4gbV9kYXRhOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX01BVFJJWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9EaWFnb25hbC5oIGIvRWlnZW4vc3JjL0NvcmUvRGlhZ29uYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjI2MTk2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvRGlhZ29uYWwuaApAQCAtMCwwICsxLDIzNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9ESUFHT05BTF9ICisjZGVmaW5lIEVJR0VOX0RJQUdPTkFMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgRGlhZ29uYWwKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSBkaWFnb25hbC9zdWJkaWFnb25hbC9zdXBlcmRpYWdvbmFsIGluIGEgbWF0cml4CisgICoKKyAgKiBccGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGluIHdoaWNoIHdlIGFyZSB0YWtpbmcgYSBzdWIvbWFpbi9zdXBlciBkaWFnb25hbAorICAqIFxwYXJhbSBEaWFnSW5kZXggdGhlIGluZGV4IG9mIHRoZSBzdWIvc3VwZXIgZGlhZ29uYWwuIFRoZSBkZWZhdWx0IGlzIDAgYW5kIGl0IG1lYW5zIHRoZSBtYWluIGRpYWdvbmFsLgorICAqICAgICAgICAgICAgICBBIHBvc2l0aXZlIHZhbHVlIG1lYW5zIGEgc3VwZXJkaWFnb25hbCwgYSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyBhIHN1YmRpYWdvbmFsLgorICAqICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gdXNlIER5bmFtaWMgc28gdGhlIGluZGV4IGNhbiBiZSBzZXQgYXQgcnVudGltZS4KKyAgKgorICAqIFRoZSBtYXRyaXggaXMgbm90IHJlcXVpcmVkIHRvIGJlIHNxdWFyZS4KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIHRoZSBtYWluIGRpYWdvbmFsLCBvciBhbnkgc3ViL3N1cGVyIGRpYWdvbmFsCisgICogb2YgYSBzcXVhcmUgbWF0cml4LiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgTWF0cml4QmFzZTo6ZGlhZ29uYWwoKSBhbmQgTWF0cml4QmFzZTo6ZGlhZ29uYWwoSW5kZXgpIGFuZCBtb3N0IG9mIHRoZQorICAqIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpkaWFnb25hbCgpLCBNYXRyaXhCYXNlOjpkaWFnb25hbChJbmRleCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBEaWFnSW5kZXg+CitzdHJ1Y3QgdHJhaXRzPERpYWdvbmFsPE1hdHJpeFR5cGUsRGlhZ0luZGV4PiA+CisgOiB0cmFpdHM8TWF0cml4VHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWQ8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IChpbnQoRGlhZ0luZGV4KSA9PSBEeW5hbWljIHx8IGludChNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSkgPT0gRHluYW1pYykgPyBEeW5hbWljCisgICAgOiAoRUlHRU5fUExBSU5fRU5VTV9NSU4oTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgLSBFSUdFTl9QTEFJTl9FTlVNX01BWCgtRGlhZ0luZGV4LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSAtIEVJR0VOX1BMQUlOX0VOVU1fTUFYKCBEaWFnSW5kZXgsIDApKSksCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSAxLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gaW50KE1hdHJpeFR5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lKSA9PSBEeW5hbWljID8gRHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAgIDogRGlhZ0luZGV4ID09IER5bmFtaWMgPyBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQoTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IChFSUdFTl9QTEFJTl9FTlVNX01JTihNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSAtIEVJR0VOX1BMQUlOX0VOVU1fTUFYKC1EaWFnSW5kZXgsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lIC0gRUlHRU5fUExBSU5fRU5VTV9NQVgoIERpYWdJbmRleCwgMCkpKSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IDEsCisgICAgTWFza0x2YWx1ZUJpdCA9IGlzX2x2YWx1ZTxNYXRyaXhUeXBlPjo6dmFsdWUgPyBMdmFsdWVCaXQgOiAwLAorICAgIEZsYWdzID0gKHVuc2lnbmVkIGludClfTWF0cml4VHlwZU5lc3RlZDo6RmxhZ3MgJiAoSGVyZWRpdGFyeUJpdHMgfCBMaW5lYXJBY2Nlc3NCaXQgfCBNYXNrTHZhbHVlQml0IHwgRGlyZWN0QWNjZXNzQml0KSAmIH5Sb3dNYWpvckJpdCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gX01hdHJpeFR5cGVOZXN0ZWQ6OkNvZWZmUmVhZENvc3QsCisgICAgTWF0cml4VHlwZU91dGVyU3RyaWRlID0gb3V0ZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxNYXRyaXhUeXBlPjo6cmV0LAorICAgIElubmVyU3RyaWRlQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGVPdXRlclN0cmlkZSA9PSBEeW5hbWljID8gRHluYW1pYyA6IE1hdHJpeFR5cGVPdXRlclN0cmlkZSsxLAorICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IDAKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBEaWFnSW5kZXg+IGNsYXNzIERpYWdvbmFsCisgICA6IHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8IERpYWdvbmFsPE1hdHJpeFR5cGUsRGlhZ0luZGV4PiA+Ojp0eXBlCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPERpYWdvbmFsPjo6dHlwZSBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoRGlhZ29uYWwpCisKKyAgICBpbmxpbmUgRGlhZ29uYWwoTWF0cml4VHlwZSYgbWF0cml4LCBJbmRleCBpbmRleCA9IERpYWdJbmRleCkgOiBtX21hdHJpeChtYXRyaXgpLCBtX2luZGV4KGluZGV4KSB7fQorCisgICAgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhEaWFnb25hbCkKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QKKyAgICB7IHJldHVybiBtX2luZGV4LnZhbHVlKCk8MCA/IChzdGQ6Om1pbikobV9tYXRyaXguY29scygpLG1fbWF0cml4LnJvd3MoKSttX2luZGV4LnZhbHVlKCkpIDogKHN0ZDo6bWluKShtX21hdHJpeC5yb3dzKCksbV9tYXRyaXguY29scygpLW1faW5kZXgudmFsdWUoKSk7IH0KKworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXgub3V0ZXJTdHJpZGUoKSArIDE7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmlzX2x2YWx1ZTxNYXRyaXhUeXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyCisgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIFNjYWxhcldpdGhDb25zdElmTm90THZhbHVlOworCisgICAgaW5saW5lIFNjYWxhcldpdGhDb25zdElmTm90THZhbHVlKiBkYXRhKCkgeyByZXR1cm4gJihtX21hdHJpeC5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZihyb3dPZmZzZXQoKSwgY29sT2Zmc2V0KCkpKTsgfQorICAgIGlubGluZSBjb25zdCBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiAmKG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKHJvd09mZnNldCgpLCBjb2xPZmZzZXQoKSkpOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4KQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTFZBTFVFKE1hdHJpeFR5cGUpCisgICAgICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYocm93K3Jvd09mZnNldCgpLCByb3crY29sT2Zmc2V0KCkpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKHJvdytyb3dPZmZzZXQoKSwgcm93K2NvbE9mZnNldCgpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvZWZmKHJvdytyb3dPZmZzZXQoKSwgcm93K2NvbE9mZnNldCgpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShNYXRyaXhUeXBlKQorICAgICAgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKGluZGV4K3Jvd09mZnNldCgpLCBpbmRleCtjb2xPZmZzZXQoKSk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKGluZGV4K3Jvd09mZnNldCgpLCBpbmRleCtjb2xPZmZzZXQoKSk7CisgICAgfQorCisgICAgaW5saW5lIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmYoaW5kZXgrcm93T2Zmc2V0KCksIGluZGV4K2NvbE9mZnNldCgpKTsKKyAgICB9CisKKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlJiAKKyAgICBuZXN0ZWRFeHByZXNzaW9uKCkgY29uc3QgCisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4OworICAgIH0KKworICAgIGludCBpbmRleCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1faW5kZXgudmFsdWUoKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBtX21hdHJpeDsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgRGlhZ0luZGV4PiBtX2luZGV4OworCisgIHByaXZhdGU6CisgICAgLy8gc29tZSBjb21waWxlcnMgbWF5IGZhaWwgdG8gb3B0aW1pemUgc3RkOjptYXggZXRjIGluIGNhc2Ugb2YgY29tcGlsZS10aW1lIGNvbnN0YW50cy4uLgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggYWJzRGlhZ0luZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleC52YWx1ZSgpPjAgPyBtX2luZGV4LnZhbHVlKCkgOiAtbV9pbmRleC52YWx1ZSgpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3dPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX2luZGV4LnZhbHVlKCk+MCA/IDAgOiAtbV9pbmRleC52YWx1ZSgpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX2luZGV4LnZhbHVlKCk+MCA/IG1faW5kZXgudmFsdWUoKSA6IDA7IH0KKyAgICAvLyB0cmlnZXIgYSBjb21waWxlIHRpbWUgZXJyb3IgaXMgc29tZW9uZSB0cnkgdG8gY2FsbCBwYWNrZXQKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBhY2tldFJldHVyblR5cGUgcGFja2V0KEluZGV4KSBjb25zdDsKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBhY2tldFJldHVyblR5cGUgcGFja2V0KEluZGV4LEluZGV4KSBjb25zdDsKK307CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBtYWluIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMKKyAgKgorICAqIFxjICp0aGlzIGlzIG5vdCByZXF1aXJlZCB0byBiZSBzcXVhcmUuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2RpYWdvbmFsLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfZGlhZ29uYWwub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgRGlhZ29uYWwgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6RGlhZ29uYWxSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpkaWFnb25hbCgpCit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGRpYWdvbmFsKCkuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkNvbnN0RGlhZ29uYWxSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpkaWFnb25hbCgpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdERpYWdvbmFsUmV0dXJuVHlwZShkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgXGEgRGlhZ0luZGV4LXRoIHN1YiBvciBzdXBlciBkaWFnb25hbCBvZiB0aGUgbWF0cml4IFxjICp0aGlzCisgICoKKyAgKiBcYyAqdGhpcyBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3F1YXJlLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBEaWFnSW5kZXggcmVwcmVzZW50IGEgc3VwZXIgZGlhZ29uYWwgaWYgXGEgRGlhZ0luZGV4ID4gMAorICAqIGFuZCBhIHN1YiBkaWFnb25hbCBvdGhlcndpc2UuIFxhIERpYWdJbmRleCA9PSAwIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1haW4gZGlhZ29uYWwuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2RpYWdvbmFsX2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2RpYWdvbmFsX2ludC5vdXQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpkaWFnb25hbCgpLCBjbGFzcyBEaWFnb25hbCAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBEaWFnb25hbEluZGV4UmV0dXJuVHlwZTxEeW5hbWljPjo6VHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZGlhZ29uYWwoSW5kZXggaW5kZXgpCit7CisgIHJldHVybiB0eXBlbmFtZSBEaWFnb25hbEluZGV4UmV0dXJuVHlwZTxEeW5hbWljPjo6VHlwZShkZXJpdmVkKCksIGluZGV4KTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgZGlhZ29uYWwoSW5kZXgpLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBDb25zdERpYWdvbmFsSW5kZXhSZXR1cm5UeXBlPER5bmFtaWM+OjpUeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpkaWFnb25hbChJbmRleCBpbmRleCkgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0RGlhZ29uYWxJbmRleFJldHVyblR5cGU8RHluYW1pYz46OlR5cGUoZGVyaXZlZCgpLCBpbmRleCk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBcYSBEaWFnSW5kZXgtdGggc3ViIG9yIHN1cGVyIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMKKyAgKgorICAqIFxjICp0aGlzIGlzIG5vdCByZXF1aXJlZCB0byBiZSBzcXVhcmUuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIERpYWdJbmRleCByZXByZXNlbnQgYSBzdXBlciBkaWFnb25hbCBpZiBcYSBEaWFnSW5kZXggPiAwCisgICogYW5kIGEgc3ViIGRpYWdvbmFsIG90aGVyd2lzZS4gXGEgRGlhZ0luZGV4ID09IDAgaXMgZXF1aXZhbGVudCB0byB0aGUgbWFpbiBkaWFnb25hbC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfZGlhZ29uYWxfdGVtcGxhdGVfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfZGlhZ29uYWxfdGVtcGxhdGVfaW50Lm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmRpYWdvbmFsKCksIGNsYXNzIERpYWdvbmFsICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8aW50IEluZGV4PgoraW5saW5lIHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIERpYWdvbmFsSW5kZXhSZXR1cm5UeXBlPEluZGV4Pjo6VHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZGlhZ29uYWwoKQoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBkaWFnb25hbDxpbnQ+KCkuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8aW50IEluZGV4PgoraW5saW5lIHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIENvbnN0RGlhZ29uYWxJbmRleFJldHVyblR5cGU8SW5kZXg+OjpUeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpkaWFnb25hbCgpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRElBR09OQUxfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRGlhZ29uYWxNYXRyaXguaCBiL0VpZ2VuL3NyYy9Db3JlL0RpYWdvbmFsTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxOTBkYQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0RpYWdvbmFsTWF0cml4LmgKQEAgLTAsMCArMSwyOTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0RJQUdPTkFMTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fRElBR09OQUxNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIERpYWdvbmFsQmFzZSA6IHB1YmxpYyBFaWdlbkJhc2U8RGVyaXZlZD4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RGlhZ29uYWxWZWN0b3JUeXBlIERpYWdvbmFsVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERpYWdvbmFsVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6SW5kZXggSW5kZXg7CisKKyAgICBlbnVtIHsKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gRGlhZ29uYWxWZWN0b3JUeXBlOjpTaXplQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gRGlhZ29uYWxWZWN0b3JUeXBlOjpTaXplQXRDb21waWxlVGltZSwKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gRGlhZ29uYWxWZWN0b3JUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gRGlhZ29uYWxWZWN0b3JUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZSwKKyAgICAgIElzVmVjdG9yQXRDb21waWxlVGltZSA9IDAsCisgICAgICBGbGFncyA9IDAKKyAgICB9OworCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIDAsIE1heFJvd3NBdENvbXBpbGVUaW1lLCBNYXhDb2xzQXRDb21waWxlVGltZT4gRGVuc2VNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgRGVuc2VNYXRyaXhUeXBlIERlbnNlVHlwZTsKKyAgICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhcixEaWFnb25hbFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lLERpYWdvbmFsVmVjdG9yVHlwZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWU+IFBsYWluT2JqZWN0OworCisgICAgaW5saW5lIGNvbnN0IERlcml2ZWQmIGRlcml2ZWQoKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpOyB9CisgICAgaW5saW5lIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisKKyAgICBEZW5zZU1hdHJpeFR5cGUgdG9EZW5zZU1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlbnNlRGVyaXZlZD4KKyAgICB2b2lkIGV2YWxUbyhNYXRyaXhCYXNlPERlbnNlRGVyaXZlZD4gJm90aGVyKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZURlcml2ZWQ+CisgICAgdm9pZCBhZGRUbyhNYXRyaXhCYXNlPERlbnNlRGVyaXZlZD4gJm90aGVyKSBjb25zdAorICAgIHsgb3RoZXIuZGlhZ29uYWwoKSArPSBkaWFnb25hbCgpOyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VEZXJpdmVkPgorICAgIHZvaWQgc3ViVG8oTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+ICZvdGhlcikgY29uc3QKKyAgICB7IG90aGVyLmRpYWdvbmFsKCkgLT0gZGlhZ29uYWwoKTsgfQorCisgICAgaW5saW5lIGNvbnN0IERpYWdvbmFsVmVjdG9yVHlwZSYgZGlhZ29uYWwoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkuZGlhZ29uYWwoKTsgfQorICAgIGlubGluZSBEaWFnb25hbFZlY3RvclR5cGUmIGRpYWdvbmFsKCkgeyByZXR1cm4gZGVyaXZlZCgpLmRpYWdvbmFsKCk7IH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gZGlhZ29uYWwoKS5zaXplKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIGRpYWdvbmFsKCkuc2l6ZSgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhEZXJpdmVkPgorICAgIGNvbnN0IERpYWdvbmFsUHJvZHVjdDxNYXRyaXhEZXJpdmVkLCBEZXJpdmVkLCBPblRoZUxlZnQ+CisgICAgb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8TWF0cml4RGVyaXZlZD4gJm1hdHJpeCkgY29uc3Q7CisKKyAgICBpbmxpbmUgY29uc3QgRGlhZ29uYWxXcmFwcGVyPGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2ludmVyc2Vfb3A8U2NhbGFyPiwgY29uc3QgRGlhZ29uYWxWZWN0b3JUeXBlPiA+CisgICAgaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRpYWdvbmFsKCkuY3dpc2VJbnZlcnNlKCk7CisgICAgfQorICAgIAorICAgICNpZmRlZiBFSUdFTjJfU1VQUE9SVAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBib29sIGlzQXBwcm94KGNvbnN0IERpYWdvbmFsQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlciwgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcHJlY2lzaW9uID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBkaWFnb25hbCgpLmlzQXBwcm94KG90aGVyLmRpYWdvbmFsKCksIHByZWNpc2lvbik7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBib29sIGlzQXBwcm94KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIsIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHByZWNpc2lvbiA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gdG9EZW5zZU1hdHJpeCgpLmlzQXBwcm94KG90aGVyLCBwcmVjaXNpb24pOworICAgIH0KKyAgICAjZW5kaWYKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZURlcml2ZWQ+Cit2b2lkIERpYWdvbmFsQmFzZTxEZXJpdmVkPjo6ZXZhbFRvKE1hdHJpeEJhc2U8RGVuc2VEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIG90aGVyLnNldFplcm8oKTsKKyAgb3RoZXIuZGlhZ29uYWwoKSA9IGRpYWdvbmFsKCk7Cit9CisjZW5kaWYKKworLyoqIFxjbGFzcyBEaWFnb25hbE1hdHJpeAorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIGRpYWdvbmFsIG1hdHJpeCB3aXRoIGl0cyBzdG9yYWdlCisgICoKKyAgKiBccGFyYW0gX1NjYWxhciB0aGUgdHlwZSBvZiBjb2VmZmljaWVudHMKKyAgKiBccGFyYW0gU2l6ZUF0Q29tcGlsZVRpbWUgdGhlIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LCBvciBEeW5hbWljCisgICogXHBhcmFtIE1heFNpemVBdENvbXBpbGVUaW1lIHRoZSBkaW1lbnNpb24gb2YgdGhlIG1hdHJpeCwgb3IgRHluYW1pYy4gVGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzCisgICogICAgICAgIHRvIFNpemVBdENvbXBpbGVUaW1lLiBNb3N0IG9mIHRoZSB0aW1lLCB5b3UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSBpdC4KKyAgKgorICAqIFxzYSBjbGFzcyBEaWFnb25hbFdyYXBwZXIKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBTaXplQXRDb21waWxlVGltZSwgaW50IE1heFNpemVBdENvbXBpbGVUaW1lPgorc3RydWN0IHRyYWl0czxEaWFnb25hbE1hdHJpeDxfU2NhbGFyLFNpemVBdENvbXBpbGVUaW1lLE1heFNpemVBdENvbXBpbGVUaW1lPiA+CisgOiB0cmFpdHM8TWF0cml4PF9TY2FsYXIsU2l6ZUF0Q29tcGlsZVRpbWUsU2l6ZUF0Q29tcGlsZVRpbWUsMCxNYXhTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZT4gPgoreworICB0eXBlZGVmIE1hdHJpeDxfU2NhbGFyLFNpemVBdENvbXBpbGVUaW1lLDEsMCxNYXhTaXplQXRDb21waWxlVGltZSwxPiBEaWFnb25hbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgRGVuc2UgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKyAgZW51bSB7CisgICAgRmxhZ3MgPSBMdmFsdWVCaXQKKyAgfTsKK307Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgU2l6ZUF0Q29tcGlsZVRpbWUsIGludCBNYXhTaXplQXRDb21waWxlVGltZT4KK2NsYXNzIERpYWdvbmFsTWF0cml4CisgIDogcHVibGljIERpYWdvbmFsQmFzZTxEaWFnb25hbE1hdHJpeDxfU2NhbGFyLFNpemVBdENvbXBpbGVUaW1lLE1heFNpemVBdENvbXBpbGVUaW1lPiA+Cit7CisgIHB1YmxpYzoKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERpYWdvbmFsTWF0cml4Pjo6RGlhZ29uYWxWZWN0b3JUeXBlIERpYWdvbmFsVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIGNvbnN0IERpYWdvbmFsTWF0cml4JiBOZXN0ZWQ7CisgICAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGlhZ29uYWxNYXRyaXg+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGlhZ29uYWxNYXRyaXg+OjpJbmRleCBJbmRleDsKKyAgICAjZW5kaWYKKworICBwcm90ZWN0ZWQ6CisKKyAgICBEaWFnb25hbFZlY3RvclR5cGUgbV9kaWFnb25hbDsKKworICBwdWJsaWM6CisKKyAgICAvKiogY29uc3QgdmVyc2lvbiBvZiBkaWFnb25hbCgpLiAqLworICAgIGlubGluZSBjb25zdCBEaWFnb25hbFZlY3RvclR5cGUmIGRpYWdvbmFsKCkgY29uc3QgeyByZXR1cm4gbV9kaWFnb25hbDsgfQorICAgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgc3RvcmVkIHZlY3RvciBvZiBkaWFnb25hbCBjb2VmZmljaWVudHMuICovCisgICAgaW5saW5lIERpYWdvbmFsVmVjdG9yVHlwZSYgZGlhZ29uYWwoKSB7IHJldHVybiBtX2RpYWdvbmFsOyB9CisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRob3V0IGluaXRpYWxpemF0aW9uICovCisgICAgaW5saW5lIERpYWdvbmFsTWF0cml4KCkge30KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgZGlhZ29uYWwgbWF0cml4IHdpdGggZ2l2ZW4gZGltZW5zaW9uICAqLworICAgIGlubGluZSBEaWFnb25hbE1hdHJpeChJbmRleCBkaW0pIDogbV9kaWFnb25hbChkaW0pIHt9CisKKyAgICAvKiogMkQgY29uc3RydWN0b3IuICovCisgICAgaW5saW5lIERpYWdvbmFsTWF0cml4KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KSA6IG1fZGlhZ29uYWwoeCx5KSB7fQorCisgICAgLyoqIDNEIGNvbnN0cnVjdG9yLiAqLworICAgIGlubGluZSBEaWFnb25hbE1hdHJpeChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgU2NhbGFyJiB6KSA6IG1fZGlhZ29uYWwoeCx5LHopIHt9CisKKyAgICAvKiogQ29weSBjb25zdHJ1Y3Rvci4gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIERpYWdvbmFsTWF0cml4KGNvbnN0IERpYWdvbmFsQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgOiBtX2RpYWdvbmFsKG90aGVyLmRpYWdvbmFsKCkpIHt9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIGNvcHkgY29uc3RydWN0b3IuIHByZXZlbnQgYSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgZnJvbSBoaWRpbmcgdGhlIG90aGVyIHRlbXBsYXRlZCBjb25zdHJ1Y3RvciAqLworICAgIGlubGluZSBEaWFnb25hbE1hdHJpeChjb25zdCBEaWFnb25hbE1hdHJpeCYgb3RoZXIpIDogbV9kaWFnb25hbChvdGhlci5kaWFnb25hbCgpKSB7fQorICAgICNlbmRpZgorCisgICAgLyoqIGdlbmVyaWMgY29uc3RydWN0b3IgZnJvbSBleHByZXNzaW9uIG9mIHRoZSBkaWFnb25hbCBjb2VmZmljaWVudHMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgZXhwbGljaXQgaW5saW5lIERpYWdvbmFsTWF0cml4KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIDogbV9kaWFnb25hbChvdGhlcikKKyAgICB7fQorCisgICAgLyoqIENvcHkgb3BlcmF0b3IuICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERpYWdvbmFsTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgRGlhZ29uYWxCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIG1fZGlhZ29uYWwgPSBvdGhlci5kaWFnb25hbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICogcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICBEaWFnb25hbE1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IERpYWdvbmFsTWF0cml4JiBvdGhlcikKKyAgICB7CisgICAgICBtX2RpYWdvbmFsID0gb3RoZXIuZGlhZ29uYWwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvKiogUmVzaXplcyB0byBnaXZlbiBzaXplLiAqLworICAgIGlubGluZSB2b2lkIHJlc2l6ZShJbmRleCBzaXplKSB7IG1fZGlhZ29uYWwucmVzaXplKHNpemUpOyB9CisgICAgLyoqIFNldHMgYWxsIGNvZWZmaWNpZW50cyB0byB6ZXJvLiAqLworICAgIGlubGluZSB2b2lkIHNldFplcm8oKSB7IG1fZGlhZ29uYWwuc2V0WmVybygpOyB9CisgICAgLyoqIFJlc2l6ZXMgYW5kIHNldHMgYWxsIGNvZWZmaWNpZW50cyB0byB6ZXJvLiAqLworICAgIGlubGluZSB2b2lkIHNldFplcm8oSW5kZXggc2l6ZSkgeyBtX2RpYWdvbmFsLnNldFplcm8oc2l6ZSk7IH0KKyAgICAvKiogU2V0cyB0aGlzIG1hdHJpeCB0byBiZSB0aGUgaWRlbnRpdHkgbWF0cml4IG9mIHRoZSBjdXJyZW50IHNpemUuICovCisgICAgaW5saW5lIHZvaWQgc2V0SWRlbnRpdHkoKSB7IG1fZGlhZ29uYWwuc2V0T25lcygpOyB9CisgICAgLyoqIFNldHMgdGhpcyBtYXRyaXggdG8gYmUgdGhlIGlkZW50aXR5IG1hdHJpeCBvZiB0aGUgZ2l2ZW4gc2l6ZS4gKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRJZGVudGl0eShJbmRleCBzaXplKSB7IG1fZGlhZ29uYWwuc2V0T25lcyhzaXplKTsgfQorfTsKKworLyoqIFxjbGFzcyBEaWFnb25hbFdyYXBwZXIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSBkaWFnb25hbCBtYXRyaXgKKyAgKgorICAqIFxwYXJhbSBfRGlhZ29uYWxWZWN0b3JUeXBlIHRoZSB0eXBlIG9mIHRoZSB2ZWN0b3Igb2YgZGlhZ29uYWwgY29lZmZpY2llbnRzCisgICoKKyAgKiBUaGlzIGNsYXNzIGlzIGFuIGV4cHJlc3Npb24gb2YgYSBkaWFnb25hbCBtYXRyaXgsIGJ1dCBub3Qgc3RvcmluZyBpdHMgb3duIHZlY3RvciBvZiBkaWFnb25hbCBjb2VmZmljaWVudHMsCisgICogaW5zdGVhZCB3cmFwcGluZyBhbiBleGlzdGluZyB2ZWN0b3IgZXhwcmVzc2lvbi4gSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OmFzRGlhZ29uYWwoKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRoYXQgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBjbGFzcyBEaWFnb25hbE1hdHJpeCwgY2xhc3MgRGlhZ29uYWxCYXNlLCBNYXRyaXhCYXNlOjphc0RpYWdvbmFsKCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9EaWFnb25hbFZlY3RvclR5cGU+CitzdHJ1Y3QgdHJhaXRzPERpYWdvbmFsV3JhcHBlcjxfRGlhZ29uYWxWZWN0b3JUeXBlPiA+Cit7CisgIHR5cGVkZWYgX0RpYWdvbmFsVmVjdG9yVHlwZSBEaWFnb25hbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGlhZ29uYWxWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERpYWdvbmFsVmVjdG9yVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGlhZ29uYWxWZWN0b3JUeXBlOjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBEaWFnb25hbFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gRGlhZ29uYWxWZWN0b3JUeXBlOjpTaXplQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IERpYWdvbmFsVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBEaWFnb25hbFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lLAorICAgIEZsYWdzID0gIHRyYWl0czxEaWFnb25hbFZlY3RvclR5cGU+OjpGbGFncyAmIEx2YWx1ZUJpdAorICB9OworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX0RpYWdvbmFsVmVjdG9yVHlwZT4KK2NsYXNzIERpYWdvbmFsV3JhcHBlcgorICA6IHB1YmxpYyBEaWFnb25hbEJhc2U8RGlhZ29uYWxXcmFwcGVyPF9EaWFnb25hbFZlY3RvclR5cGU+ID4sIGludGVybmFsOjpub19hc3NpZ25tZW50X29wZXJhdG9yCit7CisgIHB1YmxpYzoKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdHlwZWRlZiBfRGlhZ29uYWxWZWN0b3JUeXBlIERpYWdvbmFsVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIERpYWdvbmFsV3JhcHBlciBOZXN0ZWQ7CisgICAgI2VuZGlmCisKKyAgICAvKiogQ29uc3RydWN0b3IgZnJvbSBleHByZXNzaW9uIG9mIGRpYWdvbmFsIGNvZWZmaWNpZW50cyB0byB3cmFwLiAqLworICAgIGlubGluZSBEaWFnb25hbFdyYXBwZXIoRGlhZ29uYWxWZWN0b3JUeXBlJiBkaWFnb25hbCkgOiBtX2RpYWdvbmFsKGRpYWdvbmFsKSB7fQorCisgICAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB3cmFwcGVkIGV4cHJlc3Npb24gb2YgZGlhZ29uYWwgY29lZmZpY2llbnRzLiAqLworICAgIGNvbnN0IERpYWdvbmFsVmVjdG9yVHlwZSYgZGlhZ29uYWwoKSBjb25zdCB7IHJldHVybiBtX2RpYWdvbmFsOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIERpYWdvbmFsVmVjdG9yVHlwZTo6TmVzdGVkIG1fZGlhZ29uYWw7Cit9OworCisvKiogXHJldHVybnMgYSBwc2V1ZG8tZXhwcmVzc2lvbiBvZiBhIGRpYWdvbmFsIG1hdHJpeCB3aXRoICp0aGlzIGFzIHZlY3RvciBvZiBkaWFnb25hbCBjb2VmZmljaWVudHMKKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2FzRGlhZ29uYWwuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9hc0RpYWdvbmFsLm91dAorICAqCisgICogXHNhIGNsYXNzIERpYWdvbmFsV3JhcHBlciwgY2xhc3MgRGlhZ29uYWxNYXRyaXgsIGRpYWdvbmFsKCksIGlzRGlhZ29uYWwoKQorICAqKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgRGlhZ29uYWxXcmFwcGVyPGNvbnN0IERlcml2ZWQ+CitNYXRyaXhCYXNlPERlcml2ZWQ+Ojphc0RpYWdvbmFsKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBhIGRpYWdvbmFsIG1hdHJpeCwKKyAgKiAgICAgICAgICB3aXRoaW4gdGhlIHByZWNpc2lvbiBnaXZlbiBieSBcYSBwcmVjLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9pc0RpYWdvbmFsLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfaXNEaWFnb25hbC5vdXQKKyAgKgorICAqIFxzYSBhc0RpYWdvbmFsKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIE1hdHJpeEJhc2U8RGVyaXZlZD46OmlzRGlhZ29uYWwoUmVhbFNjYWxhciBwcmVjKSBjb25zdAoreworICBpZihjb2xzKCkgIT0gcm93cygpKSByZXR1cm4gZmFsc2U7CisgIFJlYWxTY2FsYXIgbWF4QWJzT25EaWFnb25hbCA9IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KC0xKTsKKyAgZm9yKEluZGV4IGogPSAwOyBqIDwgY29scygpOyArK2opCisgIHsKKyAgICBSZWFsU2NhbGFyIGFic09uRGlhZ29uYWwgPSBpbnRlcm5hbDo6YWJzKGNvZWZmKGosaikpOworICAgIGlmKGFic09uRGlhZ29uYWwgPiBtYXhBYnNPbkRpYWdvbmFsKSBtYXhBYnNPbkRpYWdvbmFsID0gYWJzT25EaWFnb25hbDsKKyAgfQorICBmb3IoSW5kZXggaiA9IDA7IGogPCBjb2xzKCk7ICsraikKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBqOyArK2kpCisgICAgeworICAgICAgaWYoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihjb2VmZihpLCBqKSwgbWF4QWJzT25EaWFnb25hbCwgcHJlYykpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmKCFpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oY29lZmYoaiwgaSksIG1heEFic09uRGlhZ29uYWwsIHByZWMpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ESUFHT05BTE1BVFJJWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9EaWFnb25hbFByb2R1Y3QuaCBiL0VpZ2VuL3NyYy9Db3JlL0RpYWdvbmFsUHJvZHVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OGM2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9EaWFnb25hbFByb2R1Y3QuaApAQCAtMCwwICsxLDEyMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fRElBR09OQUxQUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fRElBR09OQUxQUk9EVUNUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBEaWFnb25hbFR5cGUsIGludCBQcm9kdWN0T3JkZXI+CitzdHJ1Y3QgdHJhaXRzPERpYWdvbmFsUHJvZHVjdDxNYXRyaXhUeXBlLCBEaWFnb25hbFR5cGUsIFByb2R1Y3RPcmRlcj4gPgorIDogdHJhaXRzPE1hdHJpeFR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgdHlwZW5hbWUgRGlhZ29uYWxUeXBlOjpTY2FsYXI+OjpSZXR1cm5UeXBlIFNjYWxhcjsKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKworICAgIF9TdG9yYWdlT3JkZXIgPSBNYXRyaXhUeXBlOjpGbGFncyAmIFJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciwKKyAgICBfUGFja2V0T25EaWFnID0gISgoaW50KF9TdG9yYWdlT3JkZXIpID09IFJvd01ham9yICYmIGludChQcm9kdWN0T3JkZXIpID09IE9uVGhlTGVmdCkKKyAgICAgICAgICAgICAgICAgICAgfHwoaW50KF9TdG9yYWdlT3JkZXIpID09IENvbE1ham9yICYmIGludChQcm9kdWN0T3JkZXIpID09IE9uVGhlUmlnaHQpKSwKKyAgICBfU2FtZVR5cGVzID0gaXNfc2FtZTx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIHR5cGVuYW1lIERpYWdvbmFsVHlwZTo6U2NhbGFyPjo6dmFsdWUsCisgICAgLy8gRklYTUUgY3VycmVudGx5IHdlIG5lZWQgc2FtZSB0eXBlcywgYnV0IGluIHRoZSBmdXR1cmUgdGhlIG5leHQgcnVsZSBzaG91bGQgYmUgdGhlIG9uZQorICAgIC8vX1ZlY3Rvcml6YWJsZSA9IGJvb2woaW50KE1hdHJpeFR5cGU6OkZsYWdzKSZQYWNrZXRBY2Nlc3NCaXQpICYmICgoIV9QYWNrZXRPbkRpYWcpIHx8IChfU2FtZVR5cGVzICYmIGJvb2woaW50KERpYWdvbmFsVHlwZTo6RmxhZ3MpJlBhY2tldEFjY2Vzc0JpdCkpKSwKKyAgICBfVmVjdG9yaXphYmxlID0gYm9vbChpbnQoTWF0cml4VHlwZTo6RmxhZ3MpJlBhY2tldEFjY2Vzc0JpdCkgJiYgX1NhbWVUeXBlcyAmJiAoKCFfUGFja2V0T25EaWFnKSB8fCAoYm9vbChpbnQoRGlhZ29uYWxUeXBlOjpGbGFncykmUGFja2V0QWNjZXNzQml0KSkpLAorCisgICAgRmxhZ3MgPSAoSGVyZWRpdGFyeUJpdHMgJiAodW5zaWduZWQgaW50KShNYXRyaXhUeXBlOjpGbGFncykpIHwgKF9WZWN0b3JpemFibGUgPyBQYWNrZXRBY2Nlc3NCaXQgOiAwKSwKKyAgICBDb2VmZlJlYWRDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QgKyBNYXRyaXhUeXBlOjpDb2VmZlJlYWRDb3N0ICsgRGlhZ29uYWxUeXBlOjpEaWFnb25hbFZlY3RvclR5cGU6OkNvZWZmUmVhZENvc3QKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIERpYWdvbmFsVHlwZSwgaW50IFByb2R1Y3RPcmRlcj4KK2NsYXNzIERpYWdvbmFsUHJvZHVjdCA6IGludGVybmFsOjpub19hc3NpZ25tZW50X29wZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1hdHJpeEJhc2U8RGlhZ29uYWxQcm9kdWN0PE1hdHJpeFR5cGUsIERpYWdvbmFsVHlwZSwgUHJvZHVjdE9yZGVyPiA+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgTWF0cml4QmFzZTxEaWFnb25hbFByb2R1Y3Q+IEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShEaWFnb25hbFByb2R1Y3QpCisKKyAgICBpbmxpbmUgRGlhZ29uYWxQcm9kdWN0KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgY29uc3QgRGlhZ29uYWxUeXBlJiBkaWFnb25hbCkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4KSwgbV9kaWFnb25hbChkaWFnb25hbCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoZGlhZ29uYWwuZGlhZ29uYWwoKS5zaXplKCkgPT0gKFByb2R1Y3RPcmRlciA9PSBPblRoZUxlZnQgPyBtYXRyaXgucm93cygpIDogbWF0cml4LmNvbHMoKSkpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICAgIGNvbnN0IFNjYWxhciBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9kaWFnb25hbC5kaWFnb25hbCgpLmNvZWZmKFByb2R1Y3RPcmRlciA9PSBPblRoZUxlZnQgPyByb3cgOiBjb2wpICogbV9tYXRyaXguY29lZmYocm93LCBjb2wpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgZW51bSB7CisgICAgICAgIFN0b3JhZ2VPcmRlciA9IEZsYWdzICYgUm93TWFqb3JCaXQgPyBSb3dNYWpvciA6IENvbE1ham9yCisgICAgICB9OworICAgICAgY29uc3QgSW5kZXggaW5kZXhJbkRpYWdvbmFsVmVjdG9yID0gUHJvZHVjdE9yZGVyID09IE9uVGhlTGVmdCA/IHJvdyA6IGNvbDsKKworICAgICAgcmV0dXJuIHBhY2tldF9pbXBsPExvYWRNb2RlPihyb3csY29sLGluZGV4SW5EaWFnb25hbFZlY3Rvcix0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8CisgICAgICAgICgoaW50KFN0b3JhZ2VPcmRlcikgPT0gUm93TWFqb3IgJiYgaW50KFByb2R1Y3RPcmRlcikgPT0gT25UaGVMZWZ0KQorICAgICAgIHx8KGludChTdG9yYWdlT3JkZXIpID09IENvbE1ham9yICYmIGludChQcm9kdWN0T3JkZXIpID09IE9uVGhlUmlnaHQpKSwgaW50ZXJuYWw6OnRydWVfdHlwZSwgaW50ZXJuYWw6OmZhbHNlX3R5cGU+Ojp0eXBlKCkpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0U2NhbGFyIHBhY2tldF9pbXBsKEluZGV4IHJvdywgSW5kZXggY29sLCBJbmRleCBpZCwgaW50ZXJuYWw6OnRydWVfdHlwZSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwobV9tYXRyaXgudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihyb3csIGNvbCksCisgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cHNldDE8UGFja2V0U2NhbGFyPihtX2RpYWdvbmFsLmRpYWdvbmFsKCkuY29lZmYoaWQpKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0U2NhbGFyIHBhY2tldF9pbXBsKEluZGV4IHJvdywgSW5kZXggY29sLCBJbmRleCBpZCwgaW50ZXJuYWw6OmZhbHNlX3R5cGUpIGNvbnN0CisgICAgeworICAgICAgZW51bSB7CisgICAgICAgIElubmVyU2l6ZSA9IChNYXRyaXhUeXBlOjpGbGFncyAmIFJvd01ham9yQml0KSA/IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIDogTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIERpYWdvbmFsVmVjdG9yUGFja2V0TG9hZE1vZGUgPSAoTG9hZE1vZGUgPT0gQWxpZ25lZCAmJiAoKElubmVyU2l6ZSUxNikgPT0gMCkpID8gQWxpZ25lZCA6IFVuYWxpZ25lZAorICAgICAgfTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChtX21hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KHJvdywgY29sKSwKKyAgICAgICAgICAgICAgICAgICAgIG1fZGlhZ29uYWwuZGlhZ29uYWwoKS50ZW1wbGF0ZSBwYWNrZXQ8RGlhZ29uYWxWZWN0b3JQYWNrZXRMb2FkTW9kZT4oaWQpKTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9tYXRyaXg7CisgICAgdHlwZW5hbWUgRGlhZ29uYWxUeXBlOjpOZXN0ZWQgbV9kaWFnb25hbDsKK307CisKKy8qKiBccmV0dXJucyB0aGUgZGlhZ29uYWwgbWF0cml4IHByb2R1Y3Qgb2YgXGMgKnRoaXMgYnkgdGhlIGRpYWdvbmFsIG1hdHJpeCBcYSBkaWFnb25hbC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEaWFnb25hbERlcml2ZWQ+CitpbmxpbmUgY29uc3QgRGlhZ29uYWxQcm9kdWN0PERlcml2ZWQsIERpYWdvbmFsRGVyaXZlZCwgT25UaGVSaWdodD4KK01hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKihjb25zdCBEaWFnb25hbEJhc2U8RGlhZ29uYWxEZXJpdmVkPiAmZGlhZ29uYWwpIGNvbnN0Cit7CisgIHJldHVybiBEaWFnb25hbFByb2R1Y3Q8RGVyaXZlZCwgRGlhZ29uYWxEZXJpdmVkLCBPblRoZVJpZ2h0PihkZXJpdmVkKCksIGRpYWdvbmFsLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgZGlhZ29uYWwgbWF0cml4IHByb2R1Y3Qgb2YgXGMgKnRoaXMgYnkgdGhlIG1hdHJpeCBcYSBtYXRyaXguCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEaWFnb25hbERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhEZXJpdmVkPgoraW5saW5lIGNvbnN0IERpYWdvbmFsUHJvZHVjdDxNYXRyaXhEZXJpdmVkLCBEaWFnb25hbERlcml2ZWQsIE9uVGhlTGVmdD4KK0RpYWdvbmFsQmFzZTxEaWFnb25hbERlcml2ZWQ+OjpvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxNYXRyaXhEZXJpdmVkPiAmbWF0cml4KSBjb25zdAoreworICByZXR1cm4gRGlhZ29uYWxQcm9kdWN0PE1hdHJpeERlcml2ZWQsIERpYWdvbmFsRGVyaXZlZCwgT25UaGVMZWZ0PihtYXRyaXguZGVyaXZlZCgpLCBkZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0RJQUdPTkFMUFJPRFVDVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Eb3QuaCBiL0VpZ2VuL3NyYy9Db3JlL0RvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTI3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Eb3QuaApAQCAtMCwwICsxLDI2MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCwgMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fRE9UX0gKKyNkZWZpbmUgRUlHRU5fRE9UX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIGhlbHBlciBmdW5jdGlvbiBmb3IgZG90KCkuIFRoZSBwcm9ibGVtIGlzIHRoYXQgaWYgd2UgcHV0IHRoYXQgaW4gdGhlIGJvZHkgb2YgZG90KCksIHRoZW4gdXBvbiBjYWxsaW5nIGRvdAorLy8gd2l0aCBtaXNtYXRjaGVkIHR5cGVzLCB0aGUgY29tcGlsZXIgZW1pdHMgZXJyb3JzIGFib3V0IGZhaWxpbmcgdG8gaW5zdGFudGlhdGUgY3dpc2VQcm9kdWN0IEJFRk9SRQorLy8gbG9va2luZyBhdCB0aGUgc3RhdGljIGFzc2VydGlvbnMuIFRodXMgdGhpcyBpcyBhIHRyaWNrIHRvIGdldCBiZXR0ZXIgY29tcGlsZSBlcnJvcnMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLAorLy8gdGhlIE5lZWRUb1RyYW5zcG9zZSBjb25kaXRpb24gaGVyZSBpcyB0YWtlbiBzdHJhaWdodCBmcm9tIEFzc2lnbi5oCisgICAgICAgICBib29sIE5lZWRUb1RyYW5zcG9zZSA9IFQ6OklzVmVjdG9yQXRDb21waWxlVGltZQorICAgICAgICAgICAgICAgICYmIFU6OklzVmVjdG9yQXRDb21waWxlVGltZQorICAgICAgICAgICAgICAgICYmICgoaW50KFQ6OlJvd3NBdENvbXBpbGVUaW1lKSA9PSAxICYmIGludChVOjpDb2xzQXRDb21waWxlVGltZSkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICB8ICAvLyBGSVhNRSB8IGluc3RlYWQgb2YgfHwgdG8gcGxlYXNlIEdDQyA0LjQuMCBzdHVwaWQgd2FybmluZyAic3VnZ2VzdCBwYXJlbnRoZXNlcyBhcm91bmQgJiYiLgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldmVydCB0byB8fCBhcyBzb29uIGFzIG5vdCBuZWVkZWQgYW55bW9yZS4KKyAgICAgICAgICAgICAgICAgICAgKGludChUOjpDb2xzQXRDb21waWxlVGltZSkgPT0gMSAmJiBpbnQoVTo6Um93c0F0Q29tcGlsZVRpbWUpID09IDEpKQorPgorc3RydWN0IGRvdF9ub2NoZWNrCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLHR5cGVuYW1lIHRyYWl0czxVPjo6U2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CisgIHN0YXRpYyBpbmxpbmUgUmVzU2NhbGFyIHJ1bihjb25zdCBNYXRyaXhCYXNlPFQ+JiBhLCBjb25zdCBNYXRyaXhCYXNlPFU+JiBiKQorICB7CisgICAgcmV0dXJuIGEudGVtcGxhdGUgYmluYXJ5RXhwcjxzY2FsYXJfY29ual9wcm9kdWN0X29wPHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLHR5cGVuYW1lIHRyYWl0czxVPjo6U2NhbGFyPiA+KGIpLnN1bSgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGRvdF9ub2NoZWNrPFQsIFUsIHRydWU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLHR5cGVuYW1lIHRyYWl0czxVPjo6U2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CisgIHN0YXRpYyBpbmxpbmUgUmVzU2NhbGFyIHJ1bihjb25zdCBNYXRyaXhCYXNlPFQ+JiBhLCBjb25zdCBNYXRyaXhCYXNlPFU+JiBiKQorICB7CisgICAgcmV0dXJuIGEudHJhbnNwb3NlKCkudGVtcGxhdGUgYmluYXJ5RXhwcjxzY2FsYXJfY29ual9wcm9kdWN0X29wPHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLHR5cGVuYW1lIHRyYWl0czxVPjo6U2NhbGFyPiA+KGIpLnN1bSgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxyZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBvZiAqdGhpcyB3aXRoIG90aGVyLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxub3RlIElmIHRoZSBzY2FsYXIgdHlwZSBpcyBjb21wbGV4IG51bWJlcnMsIHRoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBoZXJtaXRpYW4KKyAgKiAoc2VzcXVpbGluZWFyKSBkb3QgcHJvZHVjdCwgY29uanVnYXRlLWxpbmVhciBpbiB0aGUgZmlyc3QgdmFyaWFibGUgYW5kIGxpbmVhciBpbiB0aGUKKyAgKiBzZWNvbmQgdmFyaWFibGUuCisgICoKKyAgKiBcc2Egc3F1YXJlZE5vcm0oKSwgbm9ybSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordHlwZW5hbWUgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X3RyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxPdGhlckRlcml2ZWQ+OjpTY2FsYXI+OjpSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpkb3QoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1ZFQ1RPUl9TSVpFKERlcml2ZWQsT3RoZXJEZXJpdmVkKQorICB0eXBlZGVmIGludGVybmFsOjpzY2FsYXJfY29ual9wcm9kdWN0X29wPFNjYWxhcix0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj4gZnVuYzsKKyAgRUlHRU5fQ0hFQ0tfQklOQVJZX0NPTVBBVElCSUxJWShmdW5jLFNjYWxhcix0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcik7CisKKyAgZWlnZW5fYXNzZXJ0KHNpemUoKSA9PSBvdGhlci5zaXplKCkpOworCisgIHJldHVybiBpbnRlcm5hbDo6ZG90X25vY2hlY2s8RGVyaXZlZCxPdGhlckRlcml2ZWQ+OjpydW4oKnRoaXMsIG90aGVyKTsKK30KKworI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisvKiogXHJldHVybnMgdGhlIGRvdCBwcm9kdWN0IG9mICp0aGlzIHdpdGggb3RoZXIsIHdpdGggdGhlIEVpZ2VuMiBjb252ZW50aW9uIHRoYXQgdGhlIGRvdCBwcm9kdWN0IGlzIGxpbmVhciBpbiB0aGUgZmlyc3QgdmFyaWFibGUKKyAgKiAoY29uanVnYXRpbmcgdGhlIHNlY29uZCB2YXJpYWJsZSkuIE9mIGNvdXJzZSB0aGlzIG9ubHkgbWFrZXMgYSBkaWZmZXJlbmNlIGluIHRoZSBjb21wbGV4IGNhc2UuCisgICoKKyAgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBFSUdFTjJfU1VQUE9SVCBtb2RlLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxzYSBkb3QoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3R5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcgorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZWlnZW4yX2RvdChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoT3RoZXJEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfVkVDVE9SX1NJWkUoRGVyaXZlZCxPdGhlckRlcml2ZWQpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+Ojp2YWx1ZSksCisgICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFkpCisKKyAgZWlnZW5fYXNzZXJ0KHNpemUoKSA9PSBvdGhlci5zaXplKCkpOworCisgIHJldHVybiBpbnRlcm5hbDo6ZG90X25vY2hlY2s8T3RoZXJEZXJpdmVkLERlcml2ZWQ+OjpydW4ob3RoZXIsKnRoaXMpOworfQorI2VuZGlmCisKKworLy8tLS0tLS0tLS0tIGltcGxlbWVudGF0aW9uIG9mIEwyIG5vcm0gYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0KKworLyoqIFxyZXR1cm5zLCBmb3IgdmVjdG9ycywgdGhlIHNxdWFyZWQgXGVtIGwyIG5vcm0gb2YgXGMgKnRoaXMsIGFuZCBmb3IgbWF0cmljZXMgdGhlIEZyb2Jlbml1cyBub3JtLgorICAqIEluIGJvdGggY2FzZXMsIGl0IGNvbnNpc3RzIGluIHRoZSBzdW0gb2YgdGhlIHNxdWFyZSBvZiBhbGwgdGhlIG1hdHJpeCBlbnRyaWVzLgorICAqIEZvciB2ZWN0b3JzLCB0aGlzIGlzIGFsc28gZXF1YWxzIHRvIHRoZSBkb3QgcHJvZHVjdCBvZiBcYyAqdGhpcyB3aXRoIGl0c2VsZi4KKyAgKgorICAqIFxzYSBkb3QoKSwgbm9ybSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbCBNYXRyaXhCYXNlPERlcml2ZWQ+OjpzcXVhcmVkTm9ybSgpIGNvbnN0Cit7CisgIHJldHVybiBpbnRlcm5hbDo6cmVhbCgoKnRoaXMpLmN3aXNlQWJzMigpLnN1bSgpKTsKK30KKworLyoqIFxyZXR1cm5zLCBmb3IgdmVjdG9ycywgdGhlIFxlbSBsMiBub3JtIG9mIFxjICp0aGlzLCBhbmQgZm9yIG1hdHJpY2VzIHRoZSBGcm9iZW5pdXMgbm9ybS4KKyAgKiBJbiBib3RoIGNhc2VzLCBpdCBjb25zaXN0cyBpbiB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHN1bSBvZiB0aGUgc3F1YXJlIG9mIGFsbCB0aGUgbWF0cml4IGVudHJpZXMuCisgICogRm9yIHZlY3RvcnMsIHRoaXMgaXMgYWxzbyBlcXVhbHMgdG8gdGhlIHNxdWFyZSByb290IG9mIHRoZSBkb3QgcHJvZHVjdCBvZiBcYyAqdGhpcyB3aXRoIGl0c2VsZi4KKyAgKgorICAqIFxzYSBkb3QoKSwgc3F1YXJlZE5vcm0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbCBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpub3JtKCkgY29uc3QKK3sKKyAgcmV0dXJuIGludGVybmFsOjpzcXJ0KHNxdWFyZWROb3JtKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgcXVvdGllbnQgb2YgKnRoaXMgYnkgaXRzIG93biBub3JtLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxzYSBub3JtKCksIG5vcm1hbGl6ZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0CitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpub3JtYWxpemVkKCkgY29uc3QKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPERlcml2ZWQ+Ojp0eXBlIE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX3JlZmVyZW5jZTxOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWQ7CisgIF9OZXN0ZWQgbihkZXJpdmVkKCkpOworICByZXR1cm4gbiAvIG4ubm9ybSgpOworfQorCisvKiogTm9ybWFsaXplcyB0aGUgdmVjdG9yLCBpLmUuIGRpdmlkZXMgaXQgYnkgaXRzIG93biBub3JtLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxzYSBub3JtKCksIG5vcm1hbGl6ZWQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46Om5vcm1hbGl6ZSgpCit7CisgICp0aGlzIC89IG5vcm0oKTsKK30KKworLy8tLS0tLS0tLS0tIGltcGxlbWVudGF0aW9uIG9mIG90aGVyIG5vcm1zIC0tLS0tLS0tLS0KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgaW50IHA+CitzdHJ1Y3QgbHBOb3JtX3NlbGVjdG9yCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG0pCisgIHsKKyAgICByZXR1cm4gcG93KG0uY3dpc2VBYnMoKS5hcnJheSgpLnBvdyhwKS5zdW0oKSwgUmVhbFNjYWxhcigxKS9wKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBscE5vcm1fc2VsZWN0b3I8RGVyaXZlZCwgMT4KK3sKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsIHJ1bihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQorICB7CisgICAgcmV0dXJuIG0uY3dpc2VBYnMoKS5zdW0oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBscE5vcm1fc2VsZWN0b3I8RGVyaXZlZCwgMj4KK3sKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsIHJ1bihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQorICB7CisgICAgcmV0dXJuIG0ubm9ybSgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IGxwTm9ybV9zZWxlY3RvcjxEZXJpdmVkLCBJbmZpbml0eT4KK3sKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsIHJ1bihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQorICB7CisgICAgcmV0dXJuIG0uY3dpc2VBYnMoKS5tYXhDb2VmZigpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxyZXR1cm5zIHRoZSBcZiQgXGVsbF5wIFxmJCBub3JtIG9mICp0aGlzLCB0aGF0IGlzLCByZXR1cm5zIHRoZSBwLXRoIHJvb3Qgb2YgdGhlIHN1bSBvZiB0aGUgcC10aCBwb3dlcnMgb2YgdGhlIGFic29sdXRlIHZhbHVlcworICAqICAgICAgICAgIG9mIHRoZSBjb2VmZmljaWVudHMgb2YgKnRoaXMuIElmIFxhIHAgaXMgdGhlIHNwZWNpYWwgdmFsdWUgXGEgRWlnZW46OkluZmluaXR5LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFxmJCBcZWxsXlxpbmZ0eSBcZiQKKyAgKiAgICAgICAgICBub3JtLCB0aGF0IGlzIHRoZSBtYXhpbXVtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGNvZWZmaWNpZW50cyBvZiAqdGhpcy4KKyAgKgorICAqIFxzYSBub3JtKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgcD4KK2lubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbAorTWF0cml4QmFzZTxEZXJpdmVkPjo6bHBOb3JtKCkgY29uc3QKK3sKKyAgcmV0dXJuIGludGVybmFsOjpscE5vcm1fc2VsZWN0b3I8RGVyaXZlZCwgcD46OnJ1bigqdGhpcyk7Cit9CisKKy8vLS0tLS0tLS0tLSBpbXBsZW1lbnRhdGlvbiBvZiBpc09ydGhvZ29uYWwgLyBpc1VuaXRhcnkgLS0tLS0tLS0tLQorCisvKiogXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IG9ydGhvZ29uYWwgdG8gXGEgb3RoZXIsCisgICogICAgICAgICAgd2l0aGluIHRoZSBwcmVjaXNpb24gZ2l2ZW4gYnkgXGEgcHJlYy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfaXNPcnRob2dvbmFsLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfaXNPcnRob2dvbmFsLm91dAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2Jvb2wgTWF0cml4QmFzZTxEZXJpdmVkPjo6aXNPcnRob2dvbmFsCisoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlciwgUmVhbFNjYWxhciBwcmVjKSBjb25zdAoreworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPERlcml2ZWQsMj46OnR5cGUgbmVzdGVkKGRlcml2ZWQoKSk7CisgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8T3RoZXJEZXJpdmVkLDI+Ojp0eXBlIG90aGVyTmVzdGVkKG90aGVyLmRlcml2ZWQoKSk7CisgIHJldHVybiBpbnRlcm5hbDo6YWJzMihuZXN0ZWQuZG90KG90aGVyTmVzdGVkKSkgPD0gcHJlYyAqIHByZWMgKiBuZXN0ZWQuc3F1YXJlZE5vcm0oKSAqIG90aGVyTmVzdGVkLnNxdWFyZWROb3JtKCk7Cit9CisKKy8qKiBccmV0dXJucyB0cnVlIGlmICp0aGlzIGlzIGFwcHJveGltYXRlbHkgYW4gdW5pdGFyeSBtYXRyaXgsCisgICogICAgICAgICAgd2l0aGluIHRoZSBwcmVjaXNpb24gZ2l2ZW4gYnkgXGEgcHJlYy4gSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIFxhIFNjYWxhcgorICAqICAgICAgICAgIHR5cGUgaXMgcmVhbCBudW1iZXJzLCBhIHVuaXRhcnkgbWF0cml4IGlzIGFuIG9ydGhvZ29uYWwgbWF0cml4LCB3aGVuY2UgdGhlIG5hbWUuCisgICoKKyAgKiBcbm90ZSBUaGlzIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBmYW1pbHkgb2YgdmVjdG9ycyBmb3JtcyBhbiBvcnRob25vcm1hbCBiYXNpcy4KKyAgKiAgICAgICBJbmRlZWQsIFxjIG0uaXNVbml0YXJ5KCkgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBjb2x1bW5zIChlcXVpdmFsZW50bHksIHRoZSByb3dzKSBvZiBtIGZvcm0gYW4KKyAgKiAgICAgICBvcnRob25vcm1hbCBiYXNpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfaXNVbml0YXJ5LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfaXNVbml0YXJ5Lm91dAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgTWF0cml4QmFzZTxEZXJpdmVkPjo6aXNVbml0YXJ5KFJlYWxTY2FsYXIgcHJlYykgY29uc3QKK3sKKyAgdHlwZW5hbWUgRGVyaXZlZDo6TmVzdGVkIG5lc3RlZChkZXJpdmVkKCkpOworICBmb3IoSW5kZXggaSA9IDA7IGkgPCBjb2xzKCk7ICsraSkKKyAgeworICAgIGlmKCFpbnRlcm5hbDo6aXNBcHByb3gobmVzdGVkLmNvbChpKS5zcXVhcmVkTm9ybSgpLCBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKSwgcHJlYykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZm9yKEluZGV4IGogPSAwOyBqIDwgaTsgKytqKQorICAgICAgaWYoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihuZXN0ZWQuY29sKGkpLmRvdChuZXN0ZWQuY29sKGopKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigxKSwgcHJlYykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ET1RfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRWlnZW5CYXNlLmggYi9FaWdlbi9zcmMvQ29yZS9FaWdlbkJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmJkMjhiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvRWlnZW5CYXNlLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9FSUdFTkJBU0VfSAorI2RlZmluZSBFSUdFTl9FSUdFTkJBU0VfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBjbGFzc2VzIFQgc3VjaCB0aGF0IE1hdHJpeEJhc2UgaGFzIGFuIG9wZXJhdG9yPShUKSBhbmQgYSBjb25zdHJ1Y3RvciBNYXRyaXhCYXNlKFQpLgorICAqCisgICogSW4gb3RoZXIgd29yZHMsIGFuIEVpZ2VuQmFzZSBvYmplY3QgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGNvcGllZCBpbnRvIGEgTWF0cml4QmFzZS4KKyAgKgorICAqIEJlc2lkZXMgTWF0cml4QmFzZS1kZXJpdmVkIGNsYXNzZXMsIHRoaXMgYWxzbyBpbmNsdWRlcyBzcGVjaWFsIG1hdHJpeCBjbGFzc2VzIHN1Y2ggYXMgZGlhZ29uYWwgbWF0cmljZXMsIGV0Yy4KKyAgKgorICAqIE5vdGljZSB0aGF0IHRoaXMgY2xhc3MgaXMgdHJpdmlhbCwgaXQgaXMgb25seSB1c2VkIHRvIGRpc2FtYmlndWF0ZSBvdmVybG9hZGVkIGZ1bmN0aW9ucy4KKyAgKgorICAqIFxzYSBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBFaWdlbkJhc2UKK3sKKy8vICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fbWF0cml4X3R5cGU8RGVyaXZlZD46OnR5cGUgUGxhaW5PYmplY3Q7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpJbmRleCBJbmRleDsKKworICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGRlcml2ZWQgb2JqZWN0ICovCisgIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgIC8qKiBccmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZGVyaXZlZCBvYmplY3QgKi8KKyAgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKworICBpbmxpbmUgRGVyaXZlZCYgY29uc3RfY2FzdF9kZXJpdmVkKCkgY29uc3QKKyAgeyByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWQqPihjb25zdF9jYXN0PEVpZ2VuQmFzZSo+KHRoaXMpKTsgfQorICBpbmxpbmUgY29uc3QgRGVyaXZlZCYgY29uc3RfZGVyaXZlZCgpIGNvbnN0CisgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKworICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiByb3dzLiBcc2EgY29scygpLCBSb3dzQXRDb21waWxlVGltZSAqLworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5yb3dzKCk7IH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucy4gXHNhIHJvd3MoKSwgQ29sc0F0Q29tcGlsZVRpbWUqLworICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5jb2xzKCk7IH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzLCB3aGljaCBpcyByb3dzKCkqY29scygpLgorICAgICogXHNhIHJvd3MoKSwgY29scygpLCBTaXplQXRDb21waWxlVGltZS4gKi8KKyAgaW5saW5lIEluZGV4IHNpemUoKSBjb25zdCB7IHJldHVybiByb3dzKCkgKiBjb2xzKCk7IH0KKworICAvKiogXGludGVybmFsIERvbid0IHVzZSBpdCwgYnV0IGRvIHRoZSBlcXVpdmFsZW50OiBcY29kZSBkc3QgPSAqdGhpczsgXGVuZGNvZGUgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gaW5saW5lIHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeyBkZXJpdmVkKCkuZXZhbFRvKGRzdCk7IH0KKworICAvKiogXGludGVybmFsIERvbid0IHVzZSBpdCwgYnV0IGRvIHRoZSBlcXVpdmFsZW50OiBcY29kZSBkc3QgKz0gKnRoaXM7IFxlbmRjb2RlICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIGFkZFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sCisgICAgLy8gZGVyaXZlZCBjbGFzcyBjYW4gcmVpbXBsZW1lbnQgaXQgaW4gYSBtb3JlIG9wdGltaXplZCB3YXkuCisgICAgdHlwZW5hbWUgRGVzdDo6UGxhaW5PYmplY3QgcmVzKHJvd3MoKSxjb2xzKCkpOworICAgIGV2YWxUbyhyZXMpOworICAgIGRzdCArPSByZXM7CisgIH0KKworICAvKiogXGludGVybmFsIERvbid0IHVzZSBpdCwgYnV0IGRvIHRoZSBlcXVpdmFsZW50OiBcY29kZSBkc3QgLT0gKnRoaXM7IFxlbmRjb2RlICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIHN1YlRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sCisgICAgLy8gZGVyaXZlZCBjbGFzcyBjYW4gcmVpbXBsZW1lbnQgaXQgaW4gYSBtb3JlIG9wdGltaXplZCB3YXkuCisgICAgdHlwZW5hbWUgRGVzdDo6UGxhaW5PYmplY3QgcmVzKHJvd3MoKSxjb2xzKCkpOworICAgIGV2YWxUbyhyZXMpOworICAgIGRzdCAtPSByZXM7CisgIH0KKworICAvKiogXGludGVybmFsIERvbid0IHVzZSBpdCwgYnV0IGRvIHRoZSBlcXVpdmFsZW50OiBcY29kZSBkc3QuYXBwbHlPblRoZVJpZ2h0KCp0aGlzKTsgXGVuZGNvZGUgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gaW5saW5lIHZvaWQgYXBwbHlUaGlzT25UaGVSaWdodChEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLAorICAgIC8vIGRlcml2ZWQgY2xhc3MgY2FuIHJlaW1wbGVtZW50IGl0IGluIGEgbW9yZSBvcHRpbWl6ZWQgd2F5LgorICAgIGRzdCA9IGRzdCAqIHRoaXMtPmRlcml2ZWQoKTsKKyAgfQorCisgIC8qKiBcaW50ZXJuYWwgRG9uJ3QgdXNlIGl0LCBidXQgZG8gdGhlIGVxdWl2YWxlbnQ6IFxjb2RlIGRzdC5hcHBseU9uVGhlTGVmdCgqdGhpcyk7IFxlbmRjb2RlICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIGFwcGx5VGhpc09uVGhlTGVmdChEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLAorICAgIC8vIGRlcml2ZWQgY2xhc3MgY2FuIHJlaW1wbGVtZW50IGl0IGluIGEgbW9yZSBvcHRpbWl6ZWQgd2F5LgorICAgIGRzdCA9IHRoaXMtPmRlcml2ZWQoKSAqIGRzdDsKKyAgfQorCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIG1hdHJpeCBiYXNlIG1ldGhvZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxicmllZiBDb3BpZXMgdGhlIGdlbmVyaWMgZXhwcmVzc2lvbiBcYSBvdGhlciBpbnRvICp0aGlzLgorICAqCisgICogXGRldGFpbHMgVGhlIGV4cHJlc3Npb24gbXVzdCBwcm92aWRlIGEgKHRlbXBsYXRlZCkgZXZhbFRvKERlcml2ZWQmIGRzdCkgY29uc3QKKyAgKiBmdW5jdGlvbiB3aGljaCBkb2VzIHRoZSBhY3R1YWwgam9iLiBJbiBwcmFjdGljZSwgdGhpcyBhbGxvd3MgYW55IHVzZXIgdG8gd3JpdGUKKyAgKiBpdHMgb3duIHNwZWNpYWwgbWF0cml4IHdpdGhvdXQgaGF2aW5nIHRvIG1vZGlmeSBNYXRyaXhCYXNlCisgICoKKyAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byAqdGhpcy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIG90aGVyLmRlcml2ZWQoKS5ldmFsVG8oZGVyaXZlZCgpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0Rlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IrPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIG90aGVyLmRlcml2ZWQoKS5hZGRUbyhkZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+OjpvcGVyYXRvci09KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKK3sKKyAgb3RoZXIuZGVyaXZlZCgpLnN1YlRvKGRlcml2ZWQoKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiByZXBsYWNlcyBcYyAqdGhpcyBieSBcYyAqdGhpcyAqIFxhIG90aGVyLgorICAqCisgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgRGVyaXZlZCYKK01hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBvdGhlci5kZXJpdmVkKCkuYXBwbHlUaGlzT25UaGVSaWdodChkZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogcmVwbGFjZXMgXGMgKnRoaXMgYnkgXGMgKnRoaXMgKiBcYSBvdGhlci4gSXQgaXMgZXF1aXZhbGVudCB0byBNYXRyaXhCYXNlOjpvcGVyYXRvcio9KCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgdm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+OjphcHBseU9uVGhlUmlnaHQoY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBvdGhlci5kZXJpdmVkKCkuYXBwbHlUaGlzT25UaGVSaWdodChkZXJpdmVkKCkpOworfQorCisvKiogcmVwbGFjZXMgXGMgKnRoaXMgYnkgXGMgKnRoaXMgKiBcYSBvdGhlci4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgdm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+OjphcHBseU9uVGhlTGVmdChjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIG90aGVyLmRlcml2ZWQoKS5hcHBseVRoaXNPblRoZUxlZnQoZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9FSUdFTkJBU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvRmxhZ2dlZC5oIGIvRWlnZW4vc3JjL0NvcmUvRmxhZ2dlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjk1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9GbGFnZ2VkLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9GTEFHR0VEX0gKKyNkZWZpbmUgRUlHRU5fRkxBR0dFRF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGNsYXNzIEZsYWdnZWQKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gd2l0aCBtb2RpZmllZCBmbGFncworICAqCisgICogXHBhcmFtIEV4cHJlc3Npb25UeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgb2Ygd2hpY2ggd2UgYXJlIG1vZGlmeWluZyB0aGUgZmxhZ3MKKyAgKiBccGFyYW0gQWRkZWQgdGhlIGZsYWdzIGFkZGVkIHRvIHRoZSBleHByZXNzaW9uCisgICogXHBhcmFtIFJlbW92ZWQgdGhlIGZsYWdzIHJlbW92ZWQgZnJvbSB0aGUgZXhwcmVzc2lvbiAoaGFzIHByaW9yaXR5IG92ZXIgQWRkZWQpLgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gd2hvc2UgZmxhZ3MgaGF2ZSBiZWVuIG1vZGlmaWVkLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpmbGFnZ2VkKCkKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmZsYWdnZWQoKQorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsIHVuc2lnbmVkIGludCBBZGRlZCwgdW5zaWduZWQgaW50IFJlbW92ZWQ+CitzdHJ1Y3QgdHJhaXRzPEZsYWdnZWQ8RXhwcmVzc2lvblR5cGUsIEFkZGVkLCBSZW1vdmVkPiA+IDogdHJhaXRzPEV4cHJlc3Npb25UeXBlPgoreworICBlbnVtIHsgRmxhZ3MgPSAoRXhwcmVzc2lvblR5cGU6OkZsYWdzIHwgQWRkZWQpICYgflJlbW92ZWQgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB1bnNpZ25lZCBpbnQgQWRkZWQsIHVuc2lnbmVkIGludCBSZW1vdmVkPiBjbGFzcyBGbGFnZ2VkCisgIDogcHVibGljIE1hdHJpeEJhc2U8RmxhZ2dlZDxFeHByZXNzaW9uVHlwZSwgQWRkZWQsIFJlbW92ZWQ+ID4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBNYXRyaXhCYXNlPEZsYWdnZWQ+IEJhc2U7CisgICAgCisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShGbGFnZ2VkKQorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPGludGVybmFsOjptdXN0X25lc3RfYnlfdmFsdWU8RXhwcmVzc2lvblR5cGU+OjpyZXQsCisgICAgICAgIEV4cHJlc3Npb25UeXBlLCBjb25zdCBFeHByZXNzaW9uVHlwZSY+Ojp0eXBlIEV4cHJlc3Npb25UeXBlTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6OklubmVySXRlcmF0b3IgSW5uZXJJdGVyYXRvcjsKKworICAgIGlubGluZSBGbGFnZ2VkKGNvbnN0IEV4cHJlc3Npb25UeXBlJiBtYXRyaXgpIDogbV9tYXRyaXgobWF0cml4KSB7fQorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4Lm91dGVyU3RyaWRlKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5pbm5lclN0cmlkZSgpOyB9CisKKyAgICBpbmxpbmUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb2VmZihyb3csIGNvbCk7CisgICAgfQorCisgICAgaW5saW5lIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmYoaW5kZXgpOworICAgIH0KKyAgICAKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgY29uc3QgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXgudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihyb3csIGNvbCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkudGVtcGxhdGUgd3JpdGVQYWNrZXQ8TG9hZE1vZGU+KHJvdywgY29sLCB4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgaW5saW5lIGNvbnN0IFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQorICAgIHsKKyAgICAgIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihpbmRleCwgeCk7CisgICAgfQorCisgICAgY29uc3QgRXhwcmVzc2lvblR5cGUmIF9leHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6UGxhaW5PYmplY3Qgc29sdmVUcmlhbmd1bGFyKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIHZvaWQgc29sdmVUcmlhbmd1bGFySW5QbGFjZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisgICAgRXhwcmVzc2lvblR5cGVOZXN0ZWQgbV9tYXRyaXg7Cit9OworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiAqdGhpcyB3aXRoIGFkZGVkIGFuZCByZW1vdmVkIGZsYWdzCisgICoKKyAgKiBUaGlzIGlzIG1vc3RseSBmb3IgaW50ZXJuYWwgdXNlLgorICAqCisgICogXHNhIGNsYXNzIEZsYWdnZWQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgQWRkZWQsdW5zaWduZWQgaW50IFJlbW92ZWQ+CitpbmxpbmUgY29uc3QgRmxhZ2dlZDxEZXJpdmVkLCBBZGRlZCwgUmVtb3ZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6ZmxhZ2dlZCgpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRkxBR0dFRF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Gb3JjZUFsaWduZWRBY2Nlc3MuaCBiL0VpZ2VuL3NyYy9Db3JlL0ZvcmNlQWxpZ25lZEFjY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2M3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Gb3JjZUFsaWduZWRBY2Nlc3MuaApAQCAtMCwwICsxLDE0NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fRk9SQ0VBTElHTkVEQUNDRVNTX0gKKyNkZWZpbmUgRUlHRU5fRk9SQ0VBTElHTkVEQUNDRVNTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBGb3JjZUFsaWduZWRBY2Nlc3MKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEVuZm9yY2UgYWxpZ25lZCBwYWNrZXQgbG9hZHMgYW5kIHN0b3JlcyByZWdhcmRsZXNzIG9mIHdoYXQgaXMgcmVxdWVzdGVkCisgICoKKyAgKiBccGFyYW0gRXhwcmVzc2lvblR5cGUgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBvZiB3aGljaCB3ZSBhcmUgZm9yY2luZyBhbGlnbmVkIHBhY2tldCBhY2Nlc3MKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OmZvcmNlQWxpZ25lZEFjY2VzcygpCisgICogYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpmb3JjZUFsaWduZWRBY2Nlc3MoKQorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitzdHJ1Y3QgdHJhaXRzPEZvcmNlQWxpZ25lZEFjY2VzczxFeHByZXNzaW9uVHlwZT4gPiA6IHB1YmxpYyB0cmFpdHM8RXhwcmVzc2lvblR5cGU+Cit7fTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+IGNsYXNzIEZvcmNlQWxpZ25lZEFjY2VzcworICA6IHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8IEZvcmNlQWxpZ25lZEFjY2VzczxFeHByZXNzaW9uVHlwZT4gPjo6dHlwZQoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxGb3JjZUFsaWduZWRBY2Nlc3M+Ojp0eXBlIEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShGb3JjZUFsaWduZWRBY2Nlc3MpCisKKyAgICBpbmxpbmUgRm9yY2VBbGlnbmVkQWNjZXNzKGNvbnN0IEV4cHJlc3Npb25UeXBlJiBtYXRyaXgpIDogbV9leHByZXNzaW9uKG1hdHJpeCkge30KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLmNvbHMoKTsgfQorICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5vdXRlclN0cmlkZSgpOyB9CisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLmlubmVyU3RyaWRlKCk7IH0KKworICAgIGlubGluZSBjb25zdCBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb2VmZihyb3csIGNvbCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZihyb3csIGNvbCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvZWZmKGluZGV4KTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKGluZGV4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgaW5saW5lIGNvbnN0IFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi50ZW1wbGF0ZSBwYWNrZXQ8QWxpZ25lZD4ocm93LCBjb2wpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQorICAgIHsKKyAgICAgIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS50ZW1wbGF0ZSB3cml0ZVBhY2tldDxBbGlnbmVkPihyb3csIGNvbCwgeCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24udGVtcGxhdGUgcGFja2V0PEFsaWduZWQ+KGluZGV4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgaW5saW5lIHZvaWQgd3JpdGVQYWNrZXQoSW5kZXggaW5kZXgsIGNvbnN0IFBhY2tldFNjYWxhciYgeCkKKyAgICB7CisgICAgICBtX2V4cHJlc3Npb24uY29uc3RfY2FzdF9kZXJpdmVkKCkudGVtcGxhdGUgd3JpdGVQYWNrZXQ8QWxpZ25lZD4oaW5kZXgsIHgpOworICAgIH0KKworICAgIG9wZXJhdG9yIGNvbnN0IEV4cHJlc3Npb25UeXBlJigpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbjsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBFeHByZXNzaW9uVHlwZSYgbV9leHByZXNzaW9uOworCisgIHByaXZhdGU6CisgICAgRm9yY2VBbGlnbmVkQWNjZXNzJiBvcGVyYXRvcj0oY29uc3QgRm9yY2VBbGlnbmVkQWNjZXNzJik7Cit9OworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiAqdGhpcyB3aXRoIGZvcmNlZCBhbGlnbmVkIGFjY2VzcworICAqIFxzYSBmb3JjZUFsaWduZWRBY2Nlc3NJZigpLGNsYXNzIEZvcmNlQWxpZ25lZEFjY2VzcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBGb3JjZUFsaWduZWRBY2Nlc3M8RGVyaXZlZD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmZvcmNlQWxpZ25lZEFjY2VzcygpIGNvbnN0Cit7CisgIHJldHVybiBGb3JjZUFsaWduZWRBY2Nlc3M8RGVyaXZlZD4oZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgKnRoaXMgd2l0aCBmb3JjZWQgYWxpZ25lZCBhY2Nlc3MKKyAgKiBcc2EgZm9yY2VBbGlnbmVkQWNjZXNzSWYoKSwgY2xhc3MgRm9yY2VBbGlnbmVkQWNjZXNzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPgorTWF0cml4QmFzZTxEZXJpdmVkPjo6Zm9yY2VBbGlnbmVkQWNjZXNzKCkKK3sKKyAgcmV0dXJuIEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPihkZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiAqdGhpcyB3aXRoIGZvcmNlZCBhbGlnbmVkIGFjY2VzcyBpZiBcYSBFbmFibGUgaXMgdHJ1ZS4KKyAgKiBcc2EgZm9yY2VBbGlnbmVkQWNjZXNzKCksIGNsYXNzIEZvcmNlQWxpZ25lZEFjY2VzcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPGJvb2wgRW5hYmxlPgoraW5saW5lIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTx0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8RW5hYmxlLEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPixEZXJpdmVkJj46OnR5cGU+Ojp0eXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpmb3JjZUFsaWduZWRBY2Nlc3NJZigpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mICp0aGlzIHdpdGggZm9yY2VkIGFsaWduZWQgYWNjZXNzIGlmIFxhIEVuYWJsZSBpcyB0cnVlLgorICAqIFxzYSBmb3JjZUFsaWduZWRBY2Nlc3MoKSwgY2xhc3MgRm9yY2VBbGlnbmVkQWNjZXNzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8Ym9vbCBFbmFibGU+CitpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPEVuYWJsZSxGb3JjZUFsaWduZWRBY2Nlc3M8RGVyaXZlZD4sRGVyaXZlZCY+Ojp0eXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpmb3JjZUFsaWduZWRBY2Nlc3NJZigpCit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRk9SQ0VBTElHTkVEQUNDRVNTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0Z1bmN0b3JzLmggYi9FaWdlbi9zcmMvQ29yZS9GdW5jdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGM0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9GdW5jdG9ycy5oCkBAIC0wLDAgKzEsOTg5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9GVU5DVE9SU19ICisjZGVmaW5lIEVJR0VOX0ZVTkNUT1JTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gYXNzb2NpYXRpdmUgZnVuY3RvcnM6CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBzdW0gb2YgdHdvIHNjYWxhcnMKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZUJpbmFyeU9wLCBNYXRyaXhCYXNlOjpvcGVyYXRvcissIGNsYXNzIFZlY3Rvcndpc2VPcCwgTWF0cml4QmFzZTo6c3VtKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9zdW1fb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfc3VtX29wKQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYikgY29uc3QgeyByZXR1cm4gYSArIGI7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEsIGNvbnN0IFBhY2tldCYgYikgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBhZGQoYSxiKTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIHByZWR1eChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwcmVkdXgoYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3N1bV9vcDxTY2FsYXI+ID4geworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNBZGQKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBwcm9kdWN0IG9mIHR3byBzY2FsYXJzCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgQ3dpc2U6Om9wZXJhdG9yKigpLCBjbGFzcyBWZWN0b3J3aXNlT3AsIE1hdHJpeEJhc2U6OnJlZHV4KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI+IHN0cnVjdCBzY2FsYXJfcHJvZHVjdF9vcCB7CisgIGVudW0geworICAgIC8vIFRPRE8gdmVjdG9yaXplIG1peGVkIHByb2R1Y3QKKyAgICBWZWN0b3JpemFibGUgPSBpc19zYW1lPExoc1NjYWxhcixSaHNTY2FsYXI+Ojp2YWx1ZSAmJiBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46Okhhc011bCAmJiBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46Okhhc011bAorICB9OworICB0eXBlZGVmIHR5cGVuYW1lIHNjYWxhcl9wcm9kdWN0X3RyYWl0czxMaHNTY2FsYXIsUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSByZXN1bHRfdHlwZTsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3Byb2R1Y3Rfb3ApCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIGEgKiBiOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsYik7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHJlc3VsdF90eXBlIHByZWR1eChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwcmVkdXhfbXVsKGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLHR5cGVuYW1lIFJoc1NjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcHJvZHVjdF9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IChOdW1UcmFpdHM8TGhzU2NhbGFyPjo6TXVsQ29zdCArIE51bVRyYWl0czxSaHNTY2FsYXI+OjpNdWxDb3N0KS8yLCAvLyByb3VnaCBlc3RpbWF0ZSEKKyAgICBQYWNrZXRBY2Nlc3MgPSBzY2FsYXJfcHJvZHVjdF9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyPjo6VmVjdG9yaXphYmxlCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgY29uanVnYXRlIHByb2R1Y3Qgb2YgdHdvIHNjYWxhcnMKKyAgKgorICAqIFRoaXMgaXMgYSBzaG9ydCBjdXQgZm9yIGNvbmooeCkgKiB5IHdoaWNoIGlzIG5lZWRlZCBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2U7IGluIEVpZ2VuMiBzdXBwb3J0IG1vZGUsIHRoaXMgYmVjb21lcyB4ICogY29uaih5KQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLHR5cGVuYW1lIFJoc1NjYWxhcj4gc3RydWN0IHNjYWxhcl9jb25qX3Byb2R1Y3Rfb3AgeworCisgIGVudW0geworICAgIENvbmogPSBOdW1UcmFpdHM8TGhzU2NhbGFyPjo6SXNDb21wbGV4CisgIH07CisgIAorICB0eXBlZGVmIHR5cGVuYW1lIHNjYWxhcl9wcm9kdWN0X3RyYWl0czxMaHNTY2FsYXIsUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSByZXN1bHRfdHlwZTsKKyAgCisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9jb25qX3Byb2R1Y3Rfb3ApCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgTGhzU2NhbGFyJiBhLCBjb25zdCBSaHNTY2FsYXImIGIpIGNvbnN0CisgIHsgcmV0dXJuIGNvbmpfaGVscGVyPExoc1NjYWxhcixSaHNTY2FsYXIsQ29uaixmYWxzZT4oKS5wbXVsKGEsYik7IH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGNvbmpfaGVscGVyPFBhY2tldCxQYWNrZXQsQ29uaixmYWxzZT4oKS5wbXVsKGEsYik7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9jb25qX3Byb2R1Y3Rfb3A8TGhzU2NhbGFyLFJoc1NjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8TGhzU2NhbGFyPjo6TXVsQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBpbnRlcm5hbDo6aXNfc2FtZTxMaHNTY2FsYXIsIFJoc1NjYWxhcj46OnZhbHVlICYmIHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6SGFzTXVsCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgbWluIG9mIHR3byBzY2FsYXJzCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgTWF0cml4QmFzZTo6Y3dpc2VNaW4sIGNsYXNzIFZlY3Rvcndpc2VPcCwgTWF0cml4QmFzZTo6bWluQ29lZmYoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX21pbl9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9taW5fb3ApCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgU2NhbGFyJiBiKSBjb25zdCB7IHVzaW5nIHN0ZDo6bWluOyByZXR1cm4gKG1pbikoYSwgYik7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEsIGNvbnN0IFBhY2tldCYgYikgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBtaW4oYSxiKTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIHByZWR1eChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwcmVkdXhfbWluKGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9taW5fb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTWluCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgbWF4IG9mIHR3byBzY2FsYXJzCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgTWF0cml4QmFzZTo6Y3dpc2VNYXgsIGNsYXNzIFZlY3Rvcndpc2VPcCwgTWF0cml4QmFzZTo6bWF4Q29lZmYoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX21heF9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9tYXhfb3ApCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgU2NhbGFyJiBiKSBjb25zdCB7IHVzaW5nIHN0ZDo6bWF4OyByZXR1cm4gKG1heCkoYSwgYik7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEsIGNvbnN0IFBhY2tldCYgYikgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBtYXgoYSxiKTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIHByZWR1eChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwcmVkdXhfbWF4KGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9tYXhfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTWF4CisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgaHlwb3Qgb2YgdHdvIHNjYWxhcnMKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpzdGFibGVOb3JtKCksIGNsYXNzIFJlZHV4CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfaHlwb3Rfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfaHlwb3Rfb3ApCisvLyAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcmVzdWx0X3R5cGU7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgX3gsIGNvbnN0IFNjYWxhciYgX3kpIGNvbnN0CisgIHsKKyAgICB1c2luZyBzdGQ6Om1heDsKKyAgICB1c2luZyBzdGQ6Om1pbjsKKyAgICBTY2FsYXIgcCA9IChtYXgpKF94LCBfeSk7CisgICAgU2NhbGFyIHEgPSAobWluKShfeCwgX3kpOworICAgIFNjYWxhciBxcCA9IHEvcDsKKyAgICByZXR1cm4gcCAqIHNxcnQoU2NhbGFyKDEpICsgcXAqcXApOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9oeXBvdF9vcDxTY2FsYXI+ID4geworICBlbnVtIHsgQ29zdCA9IDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwgUGFja2V0QWNjZXNzPTAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBwb3cgb2YgdHdvIHNjYWxhcnMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgT3RoZXJTY2FsYXI+IHN0cnVjdCBzY2FsYXJfYmluYXJ5X3Bvd19vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9iaW5hcnlfcG93X29wKQorICBpbmxpbmUgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgT3RoZXJTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwb3coYSwgYik7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIE90aGVyU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9iaW5hcnlfcG93X29wPFNjYWxhcixPdGhlclNjYWxhcj4gPiB7CisgIGVudW0geyBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OworfTsKKworLy8gb3RoZXIgYmluYXJ5IGZ1bmN0b3JzOgorCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc2NhbGFycworICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIE1hdHJpeEJhc2U6Om9wZXJhdG9yLQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2RpZmZlcmVuY2Vfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfZGlmZmVyZW5jZV9vcCkKKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIGEgLSBiOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwc3ViKGEsYik7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyPiA+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzU3ViCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgcXVvdGllbnQgb2YgdHdvIHNjYWxhcnMKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZUJpbmFyeU9wLCBDd2lzZTo6b3BlcmF0b3IvKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9xdW90aWVudF9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9xdW90aWVudF9vcCkKKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIGEgLyBiOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwZGl2KGEsYik7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3F1b3RpZW50X29wPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSAyICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNEaXYKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBhbmQgb2YgdHdvIGJvb2xlYW5zCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgQXJyYXlCYXNlOjpvcGVyYXRvciYmCisgICovCitzdHJ1Y3Qgc2NhbGFyX2Jvb2xlYW5fYW5kX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2Jvb2xlYW5fYW5kX29wKQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgYm9vbCYgYSwgY29uc3QgYm9vbCYgYikgY29uc3QgeyByZXR1cm4gYSAmJiBiOyB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2Jvb2xlYW5fYW5kX29wPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8Ym9vbD46OkFkZENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gZmFsc2UKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBvciBvZiB0d28gYm9vbGVhbnMKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZUJpbmFyeU9wLCBBcnJheUJhc2U6Om9wZXJhdG9yfHwKKyAgKi8KK3N0cnVjdCBzY2FsYXJfYm9vbGVhbl9vcl9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9ib29sZWFuX29yX29wKQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgYm9vbCYgYSwgY29uc3QgYm9vbCYgYikgY29uc3QgeyByZXR1cm4gYSB8fCBiOyB9Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2Jvb2xlYW5fb3Jfb3A+IHsKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxib29sPjo6QWRkQ29zdCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBmYWxzZQorICB9OworfTsKKworLy8gdW5hcnkgZnVuY3RvcnM6CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBvcHBvc2l0ZSBvZiBhIHNjYWxhcgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgTWF0cml4QmFzZTo6b3BlcmF0b3ItCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfb3Bwb3NpdGVfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfb3Bwb3NpdGVfb3ApCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeyByZXR1cm4gLWE7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwbmVnYXRlKGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9vcHBvc2l0ZV9vcDxTY2FsYXI+ID4KK3sgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTmVnYXRlIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBzY2FsYXIKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjphYnMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9hYnNfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfYWJzX29wKQorICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJlc3VsdF90eXBlOworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHJlc3VsdF90eXBlIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OmFicyhhKTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBhYnMoYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2Fic19vcDxTY2FsYXI+ID4KK3sKKyAgZW51bSB7CisgICAgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQWJzCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgc3F1YXJlZCBhYnNvbHV0ZSB2YWx1ZSBvZiBhIHNjYWxhcgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OmFiczIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9hYnMyX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2FiczJfb3ApCisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcmVzdWx0X3R5cGU7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6YWJzMihhKTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSxhKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfYWJzMl9vcDxTY2FsYXI+ID4KK3sgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNBYnMyIH07IH07CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBjb25qdWdhdGUgb2YgYSBjb21wbGV4IHZhbHVlCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBNYXRyaXhCYXNlOjpjb25qdWdhdGUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2Nvbmp1Z2F0ZV9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9jb25qdWdhdGVfb3ApCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OmNvbmooYSk7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwY29uaihhKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfY29uanVnYXRlX29wPFNjYWxhcj4gPgoreworICBlbnVtIHsKKyAgICBDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCA/IE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0IDogMCwKKyAgICBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0NvbmoKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjYXN0IGEgc2NhbGFyIHRvIGFub3RoZXIgdHlwZQorICAqCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgTWF0cml4QmFzZTo6Y2FzdCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIE5ld1R5cGU+CitzdHJ1Y3Qgc2NhbGFyX2Nhc3Rfb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfY2FzdF9vcCkKKyAgdHlwZWRlZiBOZXdUeXBlIHJlc3VsdF90eXBlOworICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IE5ld1R5cGUgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBjYXN0PFNjYWxhciwgTmV3VHlwZT4oYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIE5ld1R5cGU+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2Nhc3Rfb3A8U2NhbGFyLE5ld1R5cGU+ID4KK3sgZW51bSB7IENvc3QgPSBpc19zYW1lPFNjYWxhciwgTmV3VHlwZT46OnZhbHVlID8gMCA6IE51bVRyYWl0czxOZXdUeXBlPjo6QWRkQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGV4dHJhY3QgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXgKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIE1hdHJpeEJhc2U6OnJlYWwoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9yZWFsX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3JlYWxfb3ApCisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcmVzdWx0X3R5cGU7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6cmVhbChhKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcmVhbF9vcDxTY2FsYXI+ID4KK3sgZW51bSB7IENvc3QgPSAwLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gZXh0cmFjdCB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBNYXRyaXhCYXNlOjppbWFnKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfaW1hZ19vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9pbWFnX29wKQorICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJlc3VsdF90eXBlOworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OmltYWcoYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2ltYWdfb3A8U2NhbGFyPiA+Cit7IGVudW0geyBDb3N0ID0gMCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGV4dHJhY3QgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggYXMgYSByZWZlcmVuY2UKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIE1hdHJpeEJhc2U6OnJlYWwoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9yZWFsX3JlZl9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9yZWFsX3JlZl9vcCkKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCByZXN1bHRfdHlwZTsKKyAgRUlHRU5fU1RST05HX0lOTElORSByZXN1bHRfdHlwZSYgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6cmVhbF9yZWYoKmNvbnN0X2Nhc3Q8U2NhbGFyKj4oJmEpKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcmVhbF9yZWZfb3A8U2NhbGFyPiA+Cit7IGVudW0geyBDb3N0ID0gMCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGV4dHJhY3QgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBhcyBhIHJlZmVyZW5jZQorICAqCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgTWF0cml4QmFzZTo6aW1hZygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX2ltYWdfcmVmX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2ltYWdfcmVmX29wKQorICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHJlc3VsdF90eXBlOworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHJlc3VsdF90eXBlJiBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjppbWFnX3JlZigqY29uc3RfY2FzdDxTY2FsYXIqPigmYSkpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9pbWFnX3JlZl9vcDxTY2FsYXI+ID4KK3sgZW51bSB7IENvc3QgPSAwLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCisvKiogXGludGVybmFsCisgICoKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBleHBvbmVudGlhbCBvZiBhIHNjYWxhcgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OmV4cCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfZXhwX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2V4cF9vcCkKKyAgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpleHAoYSk7IH0KKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBleHAoYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2V4cF9vcDxTY2FsYXI+ID4KK3sgZW51bSB7IENvc3QgPSA1ICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzRXhwIH07IH07CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGxvZ2FyaXRobSBvZiBhIHNjYWxhcgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OmxvZygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfbG9nX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2xvZ19vcCkKKyAgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpsb2coYSk7IH0KKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBsb2coYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2xvZ19vcDxTY2FsYXI+ID4KK3sgZW51bSB7IENvc3QgPSA1ICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTG9nIH07IH07CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBtdWx0aXBseSBhIHNjYWxhciBieSBhIGZpeGVkIG90aGVyIG9uZQorICAqCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgTWF0cml4QmFzZTo6b3BlcmF0b3IqLCBNYXRyaXhCYXNlOjpvcGVyYXRvci8KKyAgKi8KKy8qIE5PVEUgd2h5IGRvaW5nIHRoZSBwc2V0MSgpIGluIHBhY2tldE9wICppcyogYW4gb3B0aW1pemF0aW9uID8KKyAqIGluZGVlZCBpdCBzZWVtcyBiZXR0ZXIgdG8gZGVjbGFyZSBtX290aGVyIGFzIGEgUGFja2V0IGFuZCBkbyB0aGUgcHNldDEoKSBvbmNlCisgKiBpbiB0aGUgY29uc3RydWN0b3IuIEhvd2V2ZXIsIGluIHByYWN0aWNlOgorICogIC0gR0NDIGRvZXMgbm90IGxpa2UgbV9vdGhlciBhcyBhIFBhY2tldCBhbmQgZ2VuZXJhdGUgYSBsb2FkIGV2ZXJ5IHRpbWUgaXQgbmVlZHMgaXQKKyAqICAtIG9uIHRoZSBvdGhlciBoYW5kIEdDQyBpcyBhYmxlIHRvIG1vdmVzIHRoZSBwc2V0MSgpIGF3YXkgdGhlIGxvb3AgOikKKyAqICAtIHNpbXBsZXIgY29kZSA7KQorICogKElDQyBhbmQgZ2NjIDQuNCBzZWVtcyB0byBwZXJmb3JtIHdlbGwgaW4gYm90aCBjYXNlcywgdGhlIGlzc3VlIGlzIHZpc2libGUgd2l0aCB5ID0gYSp4ICsgYip5KQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX211bHRpcGxlX29wIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICAvLyBGSVhNRSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3JzIHNlZW1zIGJ1Z2dlZCB3aXRoIHN0ZDo6Y29tcGxleDw+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgc2NhbGFyX211bHRpcGxlX29wKGNvbnN0IHNjYWxhcl9tdWx0aXBsZV9vcCYgb3RoZXIpIDogbV9vdGhlcihvdGhlci5tX290aGVyKSB7IH0KKyAgRUlHRU5fU1RST05HX0lOTElORSBzY2FsYXJfbXVsdGlwbGVfb3AoY29uc3QgU2NhbGFyJiBvdGhlcikgOiBtX290aGVyKG90aGVyKSB7IH0KKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBhICogbV9vdGhlcjsgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsIHBzZXQxPFBhY2tldD4obV9vdGhlcikpOyB9CisgIHR5cGVuYW1lIGFkZF9jb25zdF9vbl92YWx1ZV90eXBlPHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpOZXN0ZWQ+Ojp0eXBlIG1fb3RoZXI7Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+ID4KK3sgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNNdWwgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyMSwgdHlwZW5hbWUgU2NhbGFyMj4KK3N0cnVjdCBzY2FsYXJfbXVsdGlwbGUyX29wIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzY2FsYXJfcHJvZHVjdF90cmFpdHM8U2NhbGFyMSxTY2FsYXIyPjo6UmV0dXJuVHlwZSByZXN1bHRfdHlwZTsKKyAgRUlHRU5fU1RST05HX0lOTElORSBzY2FsYXJfbXVsdGlwbGUyX29wKGNvbnN0IHNjYWxhcl9tdWx0aXBsZTJfb3AmIG90aGVyKSA6IG1fb3RoZXIob3RoZXIubV9vdGhlcikgeyB9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgc2NhbGFyX211bHRpcGxlMl9vcChjb25zdCBTY2FsYXIyJiBvdGhlcikgOiBtX290aGVyKG90aGVyKSB7IH0KKyAgRUlHRU5fU1RST05HX0lOTElORSByZXN1bHRfdHlwZSBvcGVyYXRvcigpIChjb25zdCBTY2FsYXIxJiBhKSBjb25zdCB7IHJldHVybiBhICogbV9vdGhlcjsgfQorICB0eXBlbmFtZSBhZGRfY29uc3Rfb25fdmFsdWVfdHlwZTx0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyMj46Ok5lc3RlZD46OnR5cGUgbV9vdGhlcjsKK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIxLHR5cGVuYW1lIFNjYWxhcjI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX211bHRpcGxlMl9vcDxTY2FsYXIxLFNjYWxhcjI+ID4KK3sgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyMT46Ok11bENvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBJc0ludGVnZXI+CitzdHJ1Y3Qgc2NhbGFyX3F1b3RpZW50MV9pbXBsIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICAvLyBGSVhNRSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3JzIHNlZW1zIGJ1Z2dlZCB3aXRoIHN0ZDo6Y29tcGxleDw+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgc2NhbGFyX3F1b3RpZW50MV9pbXBsKGNvbnN0IHNjYWxhcl9xdW90aWVudDFfaW1wbCYgb3RoZXIpIDogbV9vdGhlcihvdGhlci5tX290aGVyKSB7IH0KKyAgRUlHRU5fU1RST05HX0lOTElORSBzY2FsYXJfcXVvdGllbnQxX2ltcGwoY29uc3QgU2NhbGFyJiBvdGhlcikgOiBtX290aGVyKHN0YXRpY19jYXN0PFNjYWxhcj4oMSkgLyBvdGhlcikge30KKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBhICogbV9vdGhlcjsgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsIHBzZXQxPFBhY2tldD4obV9vdGhlcikpOyB9CisgIGNvbnN0IFNjYWxhciBtX290aGVyOworfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcXVvdGllbnQxX2ltcGw8U2NhbGFyLGZhbHNlPiA+Cit7IGVudW0geyBDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTXVsIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfcXVvdGllbnQxX2ltcGw8U2NhbGFyLHRydWU+IHsKKyAgLy8gRklYTUUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9ycyBzZWVtcyBidWdnZWQgd2l0aCBzdGQ6OmNvbXBsZXg8PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHNjYWxhcl9xdW90aWVudDFfaW1wbChjb25zdCBzY2FsYXJfcXVvdGllbnQxX2ltcGwmIG90aGVyKSA6IG1fb3RoZXIob3RoZXIubV9vdGhlcikgeyB9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgc2NhbGFyX3F1b3RpZW50MV9pbXBsKGNvbnN0IFNjYWxhciYgb3RoZXIpIDogbV9vdGhlcihvdGhlcikge30KKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBhIC8gbV9vdGhlcjsgfQorICB0eXBlbmFtZSBhZGRfY29uc3Rfb25fdmFsdWVfdHlwZTx0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6TmVzdGVkPjo6dHlwZSBtX290aGVyOworfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcXVvdGllbnQxX2ltcGw8U2NhbGFyLHRydWU+ID4KK3sgZW51bSB7IENvc3QgPSAyICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBkaXZpZGUgYSBzY2FsYXIgYnkgYSBmaXhlZCBvdGhlciBvbmUKKyAgKgorICAqIFRoaXMgZnVuY3RvciBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgcXVvdGllbnQgb2YgYSBtYXRyaXggYnkKKyAgKiBhIHNjYWxhciB3aGVyZSB0aGUgc2NhbGFyIHR5cGUgaXMgbm90IG5lY2Vzc2FyaWx5IGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4KKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIE1hdHJpeEJhc2U6Om9wZXJhdG9yLworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9xdW90aWVudDFfb3AgOiBzY2FsYXJfcXVvdGllbnQxX2ltcGw8U2NhbGFyLCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyID4geworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHNjYWxhcl9xdW90aWVudDFfb3AoY29uc3QgU2NhbGFyJiBvdGhlcikKKyAgICA6IHNjYWxhcl9xdW90aWVudDFfaW1wbDxTY2FsYXIsIE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgPihvdGhlcikge30KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3F1b3RpZW50MV9vcDxTY2FsYXI+ID4KKzogZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3F1b3RpZW50MV9pbXBsPFNjYWxhciwgTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcj4gPgore307CisKKy8vIG51bGxhcnkgZnVuY3RvcnMKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9jb25zdGFudF9vcCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgRUlHRU5fU1RST05HX0lOTElORSBzY2FsYXJfY29uc3RhbnRfb3AoY29uc3Qgc2NhbGFyX2NvbnN0YW50X29wJiBvdGhlcikgOiBtX290aGVyKG90aGVyLm1fb3RoZXIpIHsgfQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHNjYWxhcl9jb25zdGFudF9vcChjb25zdCBTY2FsYXImIG90aGVyKSA6IG1fb3RoZXIob3RoZXIpIHsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleD4KKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoSW5kZXgsIEluZGV4ID0gMCkgY29uc3QgeyByZXR1cm4gbV9vdGhlcjsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleD4KKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoSW5kZXgsIEluZGV4ID0gMCkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBzZXQxPFBhY2tldD4obV9vdGhlcik7IH0KKyAgY29uc3QgU2NhbGFyIG1fb3RoZXI7Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+ID4KKy8vIEZJWE1FIHJlcGxhY2UgdGhpcyBwYWNrZXQgdGVzdCBieSBhIHNhZmUgb25lCit7IGVudW0geyBDb3N0ID0gMSwgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpWZWN0b3JpemFibGUsIElzUmVwZWF0YWJsZSA9IHRydWUgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2lkZW50aXR5X29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2lkZW50aXR5X29wKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleD4KKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0IHsgcmV0dXJuIHJvdz09Y29sID8gU2NhbGFyKDEpIDogU2NhbGFyKDApOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+ID4KK3sgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UsIElzUmVwZWF0YWJsZSA9IHRydWUgfTsgfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBSYW5kb21BY2Nlc3M+IHN0cnVjdCBsaW5zcGFjZWRfb3BfaW1wbDsKKworLy8gbGluZWFyIGFjY2VzcyBmb3IgcGFja2V0IG9wczoKKy8vIDEpIGluaXRpYWxpemF0aW9uCisvLyAgIGJhc2UgPSBbbG93LCAuLi4sIGxvd10gKyAoW3N0ZXAsIC4uLiwgc3RlcF0gKiBbLXNpemUsIC4uLiwgMF0pCisvLyAyKSBlYWNoIHN0ZXAKKy8vICAgYmFzZSArPSBbc2l6ZSpzdGVwLCAuLi4sIHNpemUqc3RlcF0KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgbGluc3BhY2VkX29wX2ltcGw8U2NhbGFyLGZhbHNlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisKKyAgbGluc3BhY2VkX29wX2ltcGwoU2NhbGFyIGxvdywgU2NhbGFyIHN0ZXApIDoKKyAgbV9sb3cobG93KSwgbV9zdGVwKHN0ZXApLAorICBtX3BhY2tldFN0ZXAocHNldDE8UGFja2V0PihwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUqc3RlcCkpLAorICBtX2Jhc2UocGFkZChwc2V0MTxQYWNrZXQ+KGxvdykscG11bChwc2V0MTxQYWNrZXQ+KHN0ZXApLHBsc2V0PFNjYWxhcj4oLXBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSkpKSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleD4KKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoSW5kZXggaSkgY29uc3QgeyByZXR1cm4gbV9sb3craSptX3N0ZXA7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgUGFja2V0IHBhY2tldE9wKEluZGV4KSBjb25zdCB7IHJldHVybiBtX2Jhc2UgPSBwYWRkKG1fYmFzZSxtX3BhY2tldFN0ZXApOyB9CisKKyAgY29uc3QgU2NhbGFyIG1fbG93OworICBjb25zdCBTY2FsYXIgbV9zdGVwOworICBjb25zdCBQYWNrZXQgbV9wYWNrZXRTdGVwOworICBtdXRhYmxlIFBhY2tldCBtX2Jhc2U7Cit9OworCisvLyByYW5kb20gYWNjZXNzIGZvciBwYWNrZXQgb3BzOgorLy8gMSkgZWFjaCBzdGVwCisvLyAgIFtsb3csIC4uLiwgbG93XSArICggW3N0ZXAsIC4uLiwgc3RlcF0gKiAoIFtpLCAuLi4sIGldICsgWzAsIC4uLiwgc2l6ZV0gKSApCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGxpbnNwYWNlZF9vcF9pbXBsPFNjYWxhcix0cnVlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisKKyAgbGluc3BhY2VkX29wX2ltcGwoU2NhbGFyIGxvdywgU2NhbGFyIHN0ZXApIDoKKyAgbV9sb3cobG93KSwgbV9zdGVwKHN0ZXApLAorICBtX2xvd1BhY2tldChwc2V0MTxQYWNrZXQ+KG1fbG93KSksIG1fc3RlcFBhY2tldChwc2V0MTxQYWNrZXQ+KG1fc3RlcCkpLCBtX2ludGVyUGFja2V0KHBsc2V0PFNjYWxhcj4oMCkpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKEluZGV4IGkpIGNvbnN0IHsgcmV0dXJuIG1fbG93K2kqbV9zdGVwOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgUGFja2V0IHBhY2tldE9wKEluZGV4IGkpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwYWRkKG1fbG93UGFja2V0LCBwbXVsKG1fc3RlcFBhY2tldCwgcGFkZChwc2V0MTxQYWNrZXQ+KGkpLG1faW50ZXJQYWNrZXQpKSk7IH0KKworICBjb25zdCBTY2FsYXIgbV9sb3c7CisgIGNvbnN0IFNjYWxhciBtX3N0ZXA7CisgIGNvbnN0IFBhY2tldCBtX2xvd1BhY2tldDsKKyAgY29uc3QgUGFja2V0IG1fc3RlcFBhY2tldDsKKyAgY29uc3QgUGFja2V0IG1faW50ZXJQYWNrZXQ7Cit9OworCisvLyAtLS0tLSBMaW5zcGFjZSBmdW5jdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiAod2UgZGVmYXVsdCB0byByYW5kb20gYWNjZXNzIHdoaWNoIGRvZXMgbm90IHJlYWxseSBnaXZlCisvLyB1cyBhIHNwZWVkIGdhaW4gd2hlbiB1c2luZyBwYWNrZXQgYWNjZXNzIGJ1dCBpdCBhbGxvd3MgdG8gdXNlIHRoZSBmdW5jdG9yIGluCisvLyBuZXN0ZWQgZXhwcmVzc2lvbnMpLgordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBSYW5kb21BY2Nlc3MgPSB0cnVlPiBzdHJ1Y3QgbGluc3BhY2VkX29wOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBSYW5kb21BY2Nlc3M+IHN0cnVjdCBmdW5jdG9yX3RyYWl0czwgbGluc3BhY2VkX29wPFNjYWxhcixSYW5kb21BY2Nlc3M+ID4KK3sgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc1NldExpbmVhciwgSXNSZXBlYXRhYmxlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBSYW5kb21BY2Nlc3M+IHN0cnVjdCBsaW5zcGFjZWRfb3AKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICBsaW5zcGFjZWRfb3AoU2NhbGFyIGxvdywgU2NhbGFyIGhpZ2gsIGludCBudW1fc3RlcHMpIDogaW1wbCgobnVtX3N0ZXBzPT0xID8gaGlnaCA6IGxvdyksIChudW1fc3RlcHM9PTEgPyBTY2FsYXIoKSA6IChoaWdoLWxvdykvKG51bV9zdGVwcy0xKSkpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKEluZGV4IGkpIGNvbnN0IHsgcmV0dXJuIGltcGwoaSk7IH0KKworICAvLyBXZSBuZWVkIHRoaXMgZnVuY3Rpb24gd2hlbiBhc3NpZ25pbmcgZS5nLiBhIFJvd1ZlY3RvclhkIHRvIGEgTWF0cml4WGQgc2luY2UKKyAgLy8gdGhlcmUgcm93PT0wIGFuZCBjb2wgaXMgdXNlZCBmb3IgdGhlIGFjdHVhbCBpdGVyYXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QgCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoY29sPT0wIHx8IHJvdz09MCk7CisgICAgcmV0dXJuIGltcGwoY29sICsgcm93KTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEluZGV4PgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFBhY2tldCBwYWNrZXRPcChJbmRleCBpKSBjb25zdCB7IHJldHVybiBpbXBsLnBhY2tldE9wKGkpOyB9CisKKyAgLy8gV2UgbmVlZCB0aGlzIGZ1bmN0aW9uIHdoZW4gYXNzaWduaW5nIGUuZy4gYSBSb3dWZWN0b3JYZCB0byBhIE1hdHJpeFhkIHNpbmNlCisgIC8vIHRoZXJlIHJvdz09MCBhbmQgY29sIGlzIHVzZWQgZm9yIHRoZSBhY3R1YWwgaXRlcmF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleD4KKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBQYWNrZXQgcGFja2V0T3AoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQoY29sPT0wIHx8IHJvdz09MCk7CisgICAgcmV0dXJuIGltcGwucGFja2V0T3AoY29sICsgcm93KTsKKyAgfQorCisgIC8vIFRoaXMgcHJveHkgb2JqZWN0IGhhbmRsZXMgdGhlIGFjdHVhbCByZXF1aXJlZCB0ZW1wb3JhcmllcywgdGhlIGRpZmZlcmVudAorICAvLyBpbXBsZW1lbnRhdGlvbnMgKHJhbmRvbSB2cy4gc2VxdWVudGlhbCBhY2Nlc3MpIGFzIHdlbGwgYXMgdGhlCisgIC8vIGNvcnJlY3QgcGlwaW5nIHRvIHNpemUgMi80IHBhY2tldCBvcGVyYXRpb25zLgorICBjb25zdCBsaW5zcGFjZWRfb3BfaW1wbDxTY2FsYXIsUmFuZG9tQWNjZXNzPiBpbXBsOworfTsKKworLy8gYWxsIGZ1bmN0b3JzIGFsbG93IGxpbmVhciBhY2Nlc3MsIGV4Y2VwdCBzY2FsYXJfaWRlbnRpdHlfb3AuIFNvIHdlIGZpeCBoZXJlIGEgcXVpY2sgbWV0YQorLy8gdG8gaW5kaWNhdGUgd2hldGhlciBhIGZ1bmN0b3IgYWxsb3dzIGxpbmVhciBhY2Nlc3MsIGp1c3QgYWx3YXlzIGFuc3dlcmluZyAneWVzJyBleGNlcHQgZm9yCisvLyBzY2FsYXJfaWRlbnRpdHlfb3AuCisvLyBGSVhNRSBtb3ZlIHRoaXMgdG8gZnVuY3Rvcl90cmFpdHMgYWRkaW5nIGEgZnVuY3Rvcl9kZWZhdWx0Cit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPiBzdHJ1Y3QgZnVuY3Rvcl9oYXNfbGluZWFyX2FjY2VzcyB7IGVudW0geyByZXQgPSAxIH07IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBmdW5jdG9yX2hhc19saW5lYXJfYWNjZXNzPHNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+ID4geyBlbnVtIHsgcmV0ID0gMCB9OyB9OworCisvLyBpbiBDd2lzZUJpbmFyeU9wLCB3ZSByZXF1aXJlIHRoZSBMaHMgYW5kIFJocyB0byBoYXZlIHRoZSBzYW1lIHNjYWxhciB0eXBlLCBleGNlcHQgZm9yIG11bHRpcGxpY2F0aW9uCisvLyB3aGVyZSB3ZSBvbmx5IHJlcXVpcmUgdGhlbSB0byBoYXZlIHRoZSBzYW1lIF9yZWFsXyBzY2FsYXIgdHlwZSBzbyBvbmUgbWF5IG11bHRpcGx5LCBzYXksIGZsb2F0IGJ5IGNvbXBsZXg8ZmxvYXQ+LgorLy8gRklYTUUgbW92ZSB0aGlzIHRvIGZ1bmN0b3JfdHJhaXRzIGFkZGluZyBhIGZ1bmN0b3JfZGVmYXVsdAordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4gc3RydWN0IGZ1bmN0b3JfYWxsb3dzX21peGluZ19yZWFsX2FuZF9jb21wbGV4IHsgZW51bSB7IHJldCA9IDAgfTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI+IHN0cnVjdCBmdW5jdG9yX2FsbG93c19taXhpbmdfcmVhbF9hbmRfY29tcGxleDxzY2FsYXJfcHJvZHVjdF9vcDxMaHNTY2FsYXIsUmhzU2NhbGFyPiA+IHsgZW51bSB7IHJldCA9IDEgfTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI+IHN0cnVjdCBmdW5jdG9yX2FsbG93c19taXhpbmdfcmVhbF9hbmRfY29tcGxleDxzY2FsYXJfY29ual9wcm9kdWN0X29wPExoc1NjYWxhcixSaHNTY2FsYXI+ID4geyBlbnVtIHsgcmV0ID0gMSB9OyB9OworCisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBhZGQgYSBzY2FsYXIgdG8gYSBmaXhlZCBvdGhlciBvbmUKKyAgKiBcc2EgY2xhc3MgQ3dpc2VVbmFyeU9wLCBBcnJheTo6b3BlcmF0b3IrCisgICovCisvKiBJZiB5b3Ugd29uZGVyIHdoeSBkb2luZyB0aGUgcHNldDEoKSBpbiBwYWNrZXRPcCgpIGlzIGFuIG9wdGltaXphdGlvbiBjaGVjayBzY2FsYXJfbXVsdGlwbGVfb3AgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfYWRkX29wIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICAvLyBGSVhNRSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3JzIHNlZW1zIGJ1Z2dlZCB3aXRoIHN0ZDo6Y29tcGxleDw+CisgIGlubGluZSBzY2FsYXJfYWRkX29wKGNvbnN0IHNjYWxhcl9hZGRfb3AmIG90aGVyKSA6IG1fb3RoZXIob3RoZXIubV9vdGhlcikgeyB9CisgIGlubGluZSBzY2FsYXJfYWRkX29wKGNvbnN0IFNjYWxhciYgb3RoZXIpIDogbV9vdGhlcihvdGhlcikgeyB9CisgIGlubGluZSBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBhICsgbV9vdGhlcjsgfQorICBpbmxpbmUgY29uc3QgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBhZGQoYSwgcHNldDE8UGFja2V0PihtX290aGVyKSk7IH0KKyAgY29uc3QgU2NhbGFyIG1fb3RoZXI7Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9hZGRfb3A8U2NhbGFyPiA+Cit7IGVudW0geyBDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QsIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQWRkIH07IH07CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBzcXVhcmUgcm9vdCBvZiBhIHNjYWxhcgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjpzcXJ0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9zcXJ0X29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3NxcnRfb3ApCisgIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6c3FydChhKTsgfQorICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIGlubGluZSBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6cHNxcnQoYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX3NxcnRfb3A8U2NhbGFyPiA+Cit7IGVudW0geworICAgIENvc3QgPSA1ICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNTcXJ0CisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgY29zaW5lIG9mIGEgc2NhbGFyCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQXJyYXlCYXNlOjpjb3MoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2Nvc19vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9jb3Nfb3ApCisgIGlubGluZSBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6Y29zKGEpOyB9CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwY29zKGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9jb3Nfb3A8U2NhbGFyPiA+Cit7CisgIGVudW0geworICAgIENvc3QgPSA1ICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNDb3MKKyAgfTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgVGVtcGxhdGUgZnVuY3RvciB0byBjb21wdXRlIHRoZSBzaW5lIG9mIGEgc2NhbGFyCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQXJyYXlCYXNlOjpzaW4oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3Npbl9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9zaW5fb3ApCisgIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6c2luKGEpOyB9CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgaW5saW5lIFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwc2luKGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9zaW5fb3A8U2NhbGFyPiA+Cit7CisgIGVudW0geworICAgIENvc3QgPSA1ICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNTaW4KKyAgfTsKK307CisKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHRhbiBvZiBhIHNjYWxhcgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEFycmF5QmFzZTo6dGFuKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl90YW5fb3AgeworICBFSUdFTl9FTVBUWV9TVFJVQ1RfQ1RPUihzY2FsYXJfdGFuX29wKQorICBpbmxpbmUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnRhbihhKTsgfQorICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIGlubGluZSBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6cHRhbihhKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfdGFuX29wPFNjYWxhcj4gPgoreworICBlbnVtIHsKKyAgICBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzVGFuCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgYXJjIGNvc2luZSBvZiBhIHNjYWxhcgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEFycmF5QmFzZTo6YWNvcygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfYWNvc19vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9hY29zX29wKQorICBpbmxpbmUgY29uc3QgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OmFjb3MoYSk7IH0KKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICBpbmxpbmUgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBhY29zKGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9hY29zX29wPFNjYWxhcj4gPgoreworICBlbnVtIHsKKyAgICBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LAorICAgIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQUNvcworICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIGFyYyBzaW5lIG9mIGEgc2NhbGFyCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQXJyYXlCYXNlOjphc2luKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9hc2luX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX2FzaW5fb3ApCisgIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6YXNpbihhKTsgfQorICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIGlubGluZSBQYWNrZXQgcGFja2V0T3AoY29uc3QgUGFja2V0JiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6cGFzaW4oYSk7IH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX2FzaW5fb3A8U2NhbGFyPiA+Cit7CisgIGVudW0geworICAgIENvc3QgPSA1ICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsCisgICAgUGFja2V0QWNjZXNzID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNBU2luCisgIH07Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gcmFpc2UgYSBzY2FsYXIgdG8gYSBwb3dlcgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjpwb3cKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfcG93X29wIHsKKyAgLy8gRklYTUUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9ycyBzZWVtcyBidWdnZWQgd2l0aCBzdGQ6OmNvbXBsZXg8PgorICBpbmxpbmUgc2NhbGFyX3Bvd19vcChjb25zdCBzY2FsYXJfcG93X29wJiBvdGhlcikgOiBtX2V4cG9uZW50KG90aGVyLm1fZXhwb25lbnQpIHsgfQorICBpbmxpbmUgc2NhbGFyX3Bvd19vcChjb25zdCBTY2FsYXImIGV4cG9uZW50KSA6IG1fZXhwb25lbnQoZXhwb25lbnQpIHt9CisgIGlubGluZSBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6cG93KGEsIG1fZXhwb25lbnQpOyB9CisgIGNvbnN0IFNjYWxhciBtX2V4cG9uZW50OworfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfcG93X29wPFNjYWxhcj4gPgoreyBlbnVtIHsgQ29zdCA9IDUgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBUZW1wbGF0ZSBmdW5jdG9yIHRvIGNvbXB1dGUgdGhlIHF1b3RpZW50IGJldHdlZW4gYSBzY2FsYXIgYW5kIGFycmF5IGVudHJpZXMuCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OmludmVyc2UoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9pbnZlcnNlX211bHRfb3AgeworICBzY2FsYXJfaW52ZXJzZV9tdWx0X29wKGNvbnN0IFNjYWxhciYgb3RoZXIpIDogbV9vdGhlcihvdGhlcikge30KKyAgaW5saW5lIFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEpIGNvbnN0IHsgcmV0dXJuIG1fb3RoZXIgLyBhOyB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KKyAgaW5saW5lIGNvbnN0IFBhY2tldCBwYWNrZXRPcChjb25zdCBQYWNrZXQmIGEpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpwZGl2KHBzZXQxPFBhY2tldD4obV9vdGhlciksYSk7IH0KKyAgU2NhbGFyIG1fb3RoZXI7Cit9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgaW52ZXJzZSBvZiBhIHNjYWxhcgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjppbnZlcnNlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfaW52ZXJzZV9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9pbnZlcnNlX29wKQorICBpbmxpbmUgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeyByZXR1cm4gU2NhbGFyKDEpL2E7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBpbmxpbmUgY29uc3QgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBkaXYocHNldDE8UGFja2V0PihTY2FsYXIoMSkpLGEpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9pbnZlcnNlX29wPFNjYWxhcj4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LCBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0RpdiB9OyB9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgc3F1YXJlIG9mIGEgc2NhbGFyCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgQ3dpc2U6OnNxdWFyZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc2NhbGFyX3NxdWFyZV9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9zcXVhcmVfb3ApCisgIGlubGluZSBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBhKmE7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBpbmxpbmUgY29uc3QgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSxhKTsgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfc3F1YXJlX29wPFNjYWxhcj4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LCBQYWNrZXRBY2Nlc3MgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc011bCB9OyB9OworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFRlbXBsYXRlIGZ1bmN0b3IgdG8gY29tcHV0ZSB0aGUgY3ViZSBvZiBhIHNjYWxhcgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIEN3aXNlOjpjdWJlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfY3ViZV9vcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9jdWJlX29wKQorICBpbmxpbmUgU2NhbGFyIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgYSkgY29uc3QgeyByZXR1cm4gYSphKmE7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PgorICBpbmxpbmUgY29uc3QgUGFja2V0IHBhY2tldE9wKGNvbnN0IFBhY2tldCYgYSkgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSxwbXVsKGEsYSkpOyB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9jdWJlX29wPFNjYWxhcj4gPgoreyBlbnVtIHsgQ29zdCA9IDIqTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QsIFBhY2tldEFjY2VzcyA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTXVsIH07IH07CisKKy8vIGRlZmF1bHQgZnVuY3RvciB0cmFpdHMgZm9yIFNUTCBmdW5jdG9yczoKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6Om11bHRpcGxpZXM8VD4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxUPjo6TXVsQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmRpdmlkZXM8VD4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxUPjo6TXVsQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OnBsdXM8VD4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxUPjo6QWRkQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6Om1pbnVzPFQ+ID4KK3sgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8VD46OkFkZENvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjpuZWdhdGU8VD4gPgoreyBlbnVtIHsgQ29zdCA9IE51bVRyYWl0czxUPjo6QWRkQ29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmxvZ2ljYWxfb3I8VD4gPgoreyBlbnVtIHsgQ29zdCA9IDEsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjpsb2dpY2FsX2FuZDxUPiA+Cit7IGVudW0geyBDb3N0ID0gMSwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmxvZ2ljYWxfbm90PFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6Z3JlYXRlcjxUPiA+Cit7IGVudW0geyBDb3N0ID0gMSwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6Omxlc3M8VD4gPgoreyBlbnVtIHsgQ29zdCA9IDEsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjpncmVhdGVyX2VxdWFsPFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6bGVzc19lcXVhbDxUPiA+Cit7IGVudW0geyBDb3N0ID0gMSwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmVxdWFsX3RvPFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6bm90X2VxdWFsX3RvPFQ+ID4KK3sgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6YmluZGVyMm5kPFQ+ID4KK3sgZW51bSB7IENvc3QgPSBmdW5jdG9yX3RyYWl0czxUPjo6Q29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmJpbmRlcjFzdDxUPiA+Cit7IGVudW0geyBDb3N0ID0gZnVuY3Rvcl90cmFpdHM8VD46OkNvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjp1bmFyeV9uZWdhdGU8VD4gPgoreyBlbnVtIHsgQ29zdCA9IDEgKyBmdW5jdG9yX3RyYWl0czxUPjo6Q29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OmJpbmFyeV9uZWdhdGU8VD4gPgoreyBlbnVtIHsgQ29zdCA9IDEgKyBmdW5jdG9yX3RyYWl0czxUPjo6Q29zdCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKworI2lmZGVmIEVJR0VOX1NUREVYVF9TVVBQT1JUCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLHR5cGVuYW1lIFQxPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6cHJvamVjdDFzdDxUMCxUMT4gPgoreyBlbnVtIHsgQ29zdCA9IDAsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLHR5cGVuYW1lIFQxPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6cHJvamVjdDJuZDxUMCxUMT4gPgoreyBlbnVtIHsgQ29zdCA9IDAsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLHR5cGVuYW1lIFQxPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6c2VsZWN0Mm5kPHN0ZDo6cGFpcjxUMCxUMT4gPiA+Cit7IGVudW0geyBDb3N0ID0gMCwgUGFja2V0QWNjZXNzID0gZmFsc2UgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVDAsdHlwZW5hbWUgVDE+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c3RkOjpzZWxlY3Qxc3Q8c3RkOjpwYWlyPFQwLFQxPiA+ID4KK3sgZW51bSB7IENvc3QgPSAwLCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMCx0eXBlbmFtZSBUMT4KK3N0cnVjdCBmdW5jdG9yX3RyYWl0czxzdGQ6OnVuYXJ5X2NvbXBvc2U8VDAsVDE+ID4KK3sgZW51bSB7IENvc3QgPSBmdW5jdG9yX3RyYWl0czxUMD46OkNvc3QgKyBmdW5jdG9yX3RyYWl0czxUMT46OkNvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLHR5cGVuYW1lIFQxLHR5cGVuYW1lIFQyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHN0ZDo6YmluYXJ5X2NvbXBvc2U8VDAsVDEsVDI+ID4KK3sgZW51bSB7IENvc3QgPSBmdW5jdG9yX3RyYWl0czxUMD46OkNvc3QgKyBmdW5jdG9yX3RyYWl0czxUMT46OkNvc3QgKyBmdW5jdG9yX3RyYWl0czxUMj46OkNvc3QsIFBhY2tldEFjY2VzcyA9IGZhbHNlIH07IH07CisKKyNlbmRpZiAvLyBFSUdFTl9TVERFWFRfU1VQUE9SVAorCisvLyBhbGxvdyB0byBhZGQgbmV3IGZ1bmN0b3JzIGFuZCBzcGVjaWFsaXphdGlvbnMgb2YgZnVuY3Rvcl90cmFpdHMgZnJvbSBvdXRzaWRlIEVpZ2VuLgorLy8gdGhpcyBtYWNybyBpcyByZWFsbHkgbmVlZGVkIGJlY2F1c2UgZnVuY3Rvcl90cmFpdHMgbXVzdCBiZSBzcGVjaWFsaXplZCBhZnRlciBpdCBpcyBkZWNsYXJlZCBidXQgYmVmb3JlIGl0IGlzIHVzZWQuLi4KKyNpZmRlZiBFSUdFTl9GVU5DVE9SU19QTFVHSU4KKyNpbmNsdWRlIEVJR0VOX0ZVTkNUT1JTX1BMVUdJTgorI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0ZVTkNUT1JTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0Z1enp5LmggYi9FaWdlbi9zcmMvQ29yZS9GdXp6eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NGVkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9GdXp6eS5oCkBAIC0wLDAgKzEsMTUwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9GVVpaWV9ICisjZGVmaW5lIEVJR0VOX0ZVWlpZX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbAoreworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQsIGJvb2wgaXNfaW50ZWdlciA9IE51bVRyYWl0czx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXI+OjpJc0ludGVnZXI+CitzdHJ1Y3QgaXNBcHByb3hfc2VsZWN0b3IKK3sKKyAgc3RhdGljIGJvb2wgcnVuKGNvbnN0IERlcml2ZWQmIHgsIGNvbnN0IE90aGVyRGVyaXZlZCYgeSwgdHlwZW5hbWUgRGVyaXZlZDo6UmVhbFNjYWxhciBwcmVjKQorICB7CisgICAgdXNpbmcgc3RkOjptaW47CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxEZXJpdmVkLDI+Ojp0eXBlIG5lc3RlZCh4KTsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPE90aGVyRGVyaXZlZCwyPjo6dHlwZSBvdGhlck5lc3RlZCh5KTsKKyAgICByZXR1cm4gKG5lc3RlZCAtIG90aGVyTmVzdGVkKS5jd2lzZUFiczIoKS5zdW0oKSA8PSBwcmVjICogcHJlYyAqIChtaW4pKG5lc3RlZC5jd2lzZUFiczIoKS5zdW0oKSwgb3RoZXJOZXN0ZWQuY3dpc2VBYnMyKCkuc3VtKCkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgaXNBcHByb3hfc2VsZWN0b3I8RGVyaXZlZCwgT3RoZXJEZXJpdmVkLCB0cnVlPgoreworICBzdGF0aWMgYm9vbCBydW4oY29uc3QgRGVyaXZlZCYgeCwgY29uc3QgT3RoZXJEZXJpdmVkJiB5LCB0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyKQorICB7CisgICAgcmV0dXJuIHgubWF0cml4KCkgPT0geS5tYXRyaXgoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkLCBib29sIGlzX2ludGVnZXIgPSBOdW1UcmFpdHM8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyPjo6SXNJbnRlZ2VyPgorc3RydWN0IGlzTXVjaFNtYWxsZXJUaGFuX29iamVjdF9zZWxlY3RvcgoreworICBzdGF0aWMgYm9vbCBydW4oY29uc3QgRGVyaXZlZCYgeCwgY29uc3QgT3RoZXJEZXJpdmVkJiB5LCB0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyIHByZWMpCisgIHsKKyAgICByZXR1cm4geC5jd2lzZUFiczIoKS5zdW0oKSA8PSBhYnMyKHByZWMpICogeS5jd2lzZUFiczIoKS5zdW0oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorc3RydWN0IGlzTXVjaFNtYWxsZXJUaGFuX29iamVjdF9zZWxlY3RvcjxEZXJpdmVkLCBPdGhlckRlcml2ZWQsIHRydWU+Cit7CisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBEZXJpdmVkJiB4LCBjb25zdCBPdGhlckRlcml2ZWQmLCB0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyKQorICB7CisgICAgcmV0dXJuIHgubWF0cml4KCkgPT0gRGVyaXZlZDo6WmVybyh4LnJvd3MoKSwgeC5jb2xzKCkpLm1hdHJpeCgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCBib29sIGlzX2ludGVnZXIgPSBOdW1UcmFpdHM8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyPjo6SXNJbnRlZ2VyPgorc3RydWN0IGlzTXVjaFNtYWxsZXJUaGFuX3NjYWxhcl9zZWxlY3RvcgoreworICBzdGF0aWMgYm9vbCBydW4oY29uc3QgRGVyaXZlZCYgeCwgY29uc3QgdHlwZW5hbWUgRGVyaXZlZDo6UmVhbFNjYWxhciYgeSwgdHlwZW5hbWUgRGVyaXZlZDo6UmVhbFNjYWxhciBwcmVjKQorICB7CisgICAgcmV0dXJuIHguY3dpc2VBYnMyKCkuc3VtKCkgPD0gYWJzMihwcmVjICogeSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgaXNNdWNoU21hbGxlclRoYW5fc2NhbGFyX3NlbGVjdG9yPERlcml2ZWQsIHRydWU+Cit7CisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBEZXJpdmVkJiB4LCBjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyJiwgdHlwZW5hbWUgRGVyaXZlZDo6UmVhbFNjYWxhcikKKyAgeworICAgIHJldHVybiB4Lm1hdHJpeCgpID09IERlcml2ZWQ6Olplcm8oeC5yb3dzKCksIHguY29scygpKS5tYXRyaXgoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworLyoqIFxyZXR1cm5zIFxjIHRydWUgaWYgXGMgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSBvdGhlciwgd2l0aGluIHRoZSBwcmVjaXNpb24KKyAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICoKKyAgKiBcbm90ZSBUaGUgZnV6enkgY29tcGFyZXMgYXJlIGRvbmUgbXVsdGlwbGljYXRpdmVseS4gVHdvIHZlY3RvcnMgXGYkIHYgXGYkIGFuZCBcZiQgdyBcZiQKKyAgKiBhcmUgY29uc2lkZXJlZCB0byBiZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHdpdGhpbiBwcmVjaXNpb24gXGYkIHAgXGYkIGlmCisgICogXGZbIFxWZXJ0IHYgLSB3IFxWZXJ0IFxsZXFzbGFudCBwXCxcbWluKFxWZXJ0IHZcVmVydCwgXFZlcnQgd1xWZXJ0KS4gXGZdCisgICogRm9yIG1hdHJpY2VzLCB0aGUgY29tcGFyaXNvbiBpcyBkb25lIHVzaW5nIHRoZSBIaWxiZXJ0LVNjaG1pZHQgbm9ybSAoYWthIEZyb2Jlbml1cyBub3JtCisgICogTDIgbm9ybSkuCisgICoKKyAgKiBcbm90ZSBCZWNhdXNlIG9mIHRoZSBtdWx0aXBsaWNhdGl2ZW5lc3Mgb2YgdGhpcyBjb21wYXJpc29uLCBvbmUgY2FuJ3QgdXNlIHRoaXMgZnVuY3Rpb24KKyAgKiB0byBjaGVjayB3aGV0aGVyIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gdGhlIHplcm8gbWF0cml4IG9yIHZlY3Rvci4KKyAgKiBJbmRlZWQsIFxjIGlzQXBwcm94KHplcm8pIHJldHVybnMgZmFsc2UgdW5sZXNzIFxjICp0aGlzIGl0c2VsZiBpcyBleGFjdGx5IHRoZSB6ZXJvIG1hdHJpeAorICAqIG9yIHZlY3Rvci4gSWYgeW91IHdhbnQgdG8gdGVzdCB3aGV0aGVyIFxjICp0aGlzIGlzIHplcm8sIHVzZSBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oY29uc3QKKyAgKiBSZWFsU2NhbGFyJiwgUmVhbFNjYWxhcikgaW5zdGVhZC4KKyAgKgorICAqIFxzYSBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oY29uc3QgUmVhbFNjYWxhciYsIFJlYWxTY2FsYXIpIGNvbnN0CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorYm9vbCBEZW5zZUJhc2U8RGVyaXZlZD46OmlzQXBwcm94KAorICBjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIsCisgIFJlYWxTY2FsYXIgcHJlYworKSBjb25zdAoreworICByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94X3NlbGVjdG9yPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgcHJlYyk7Cit9CisKKy8qKiBccmV0dXJucyBcYyB0cnVlIGlmIHRoZSBub3JtIG9mIFxjICp0aGlzIGlzIG11Y2ggc21hbGxlciB0aGFuIFxhIG90aGVyLAorICAqIHdpdGhpbiB0aGUgcHJlY2lzaW9uIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgKgorICAqIFxub3RlIFRoZSBmdXp6eSBjb21wYXJlcyBhcmUgZG9uZSBtdWx0aXBsaWNhdGl2ZWx5LiBBIHZlY3RvciBcZiQgdiBcZiQgaXMKKyAgKiBjb25zaWRlcmVkIHRvIGJlIG11Y2ggc21hbGxlciB0aGFuIFxmJCB4IFxmJCB3aXRoaW4gcHJlY2lzaW9uIFxmJCBwIFxmJCBpZgorICAqIFxmWyBcVmVydCB2IFxWZXJ0IFxsZXFzbGFudCBwXCxcdmVydCB4XHZlcnQuIFxmXQorICAqCisgICogRm9yIG1hdHJpY2VzLCB0aGUgY29tcGFyaXNvbiBpcyBkb25lIHVzaW5nIHRoZSBIaWxiZXJ0LVNjaG1pZHQgbm9ybS4gRm9yIHRoaXMgcmVhc29uLAorICAqIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNjYWxhciBcYSBvdGhlciBzaG91bGQgY29tZSBmcm9tIHRoZSBIaWxiZXJ0LVNjaG1pZHQgbm9ybQorICAqIG9mIGEgcmVmZXJlbmNlIG1hdHJpeCBvZiBzYW1lIGRpbWVuc2lvbnMuCisgICoKKyAgKiBcc2EgaXNBcHByb3goKSwgaXNNdWNoU21hbGxlclRoYW4oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mLCBSZWFsU2NhbGFyKSBjb25zdAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGVuc2VCYXNlPERlcml2ZWQ+Ojppc011Y2hTbWFsbGVyVGhhbigKKyAgY29uc3QgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwmIG90aGVyLAorICBSZWFsU2NhbGFyIHByZWMKKykgY29uc3QKK3sKKyAgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbl9zY2FsYXJfc2VsZWN0b3I8RGVyaXZlZD46OnJ1bihkZXJpdmVkKCksIG90aGVyLCBwcmVjKTsKK30KKworLyoqIFxyZXR1cm5zIFxjIHRydWUgaWYgdGhlIG5vcm0gb2YgXGMgKnRoaXMgaXMgbXVjaCBzbWFsbGVyIHRoYW4gdGhlIG5vcm0gb2YgXGEgb3RoZXIsCisgICogd2l0aGluIHRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lZCBieSBcYSBwcmVjLgorICAqCisgICogXG5vdGUgVGhlIGZ1enp5IGNvbXBhcmVzIGFyZSBkb25lIG11bHRpcGxpY2F0aXZlbHkuIEEgdmVjdG9yIFxmJCB2IFxmJCBpcworICAqIGNvbnNpZGVyZWQgdG8gYmUgbXVjaCBzbWFsbGVyIHRoYW4gYSB2ZWN0b3IgXGYkIHcgXGYkIHdpdGhpbiBwcmVjaXNpb24gXGYkIHAgXGYkIGlmCisgICogXGZbIFxWZXJ0IHYgXFZlcnQgXGxlcXNsYW50IHBcLFxWZXJ0IHdcVmVydC4gXGZdCisgICogRm9yIG1hdHJpY2VzLCB0aGUgY29tcGFyaXNvbiBpcyBkb25lIHVzaW5nIHRoZSBIaWxiZXJ0LVNjaG1pZHQgbm9ybS4KKyAgKgorICAqIFxzYSBpc0FwcHJveCgpLCBpc011Y2hTbWFsbGVyVGhhbihjb25zdCBSZWFsU2NhbGFyJiwgUmVhbFNjYWxhcikgY29uc3QKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Citib29sIERlbnNlQmFzZTxEZXJpdmVkPjo6aXNNdWNoU21hbGxlclRoYW4oCisgIGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlciwKKyAgUmVhbFNjYWxhciBwcmVjCispIGNvbnN0Cit7CisgIHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW5fb2JqZWN0X3NlbGVjdG9yPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSwgcHJlYyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRlVaWllfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvR2VuZXJhbFByb2R1Y3QuaCBiL0VpZ2VuL3NyYy9Db3JlL0dlbmVyYWxQcm9kdWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjMmE2NwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL0dlbmVyYWxQcm9kdWN0LmgKQEAgLTAsMCArMSw2MTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fR0VORVJBTF9QUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fR0VORVJBTF9QUk9EVUNUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgR2VuZXJhbFByb2R1Y3QKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgdGhlIHByb2R1Y3Qgb2YgdHdvIGdlbmVyYWwgbWF0cmljZXMgb3IgdmVjdG9ycworICAqCisgICogXHBhcmFtIExoc05lc3RlZCB0aGUgdHlwZSB1c2VkIHRvIHN0b3JlIHRoZSBsZWZ0LWhhbmQgc2lkZQorICAqIFxwYXJhbSBSaHNOZXN0ZWQgdGhlIHR5cGUgdXNlZCB0byBzdG9yZSB0aGUgcmlnaHQtaGFuZCBzaWRlCisgICogXHBhcmFtIFByb2R1Y3RNb2RlIHRoZSB0eXBlIG9mIHRoZSBwcm9kdWN0CisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgcHJvZHVjdCBvZiB0d28gZ2VuZXJhbCBtYXRyaWNlcy4KKyAgKiBXZSBjYWxsIGEgZ2VuZXJhbCBtYXRyaXgsIGEgZGVuc2UgbWF0cml4IHdpdGggZnVsbCBzdG9yYWdlLiBGb3IgaW5zdGFuY2UsCisgICogVGhpcyBleGNsdWRlcyB0cmlhbmd1bGFyLCBzZWxmYWRqb2ludCwgYW5kIHNwYXJzZSBtYXRyaWNlcy4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG9wZXJhdG9yKiBiZXR3ZWVuIGdlbmVyYWwgbWF0cmljZXMuIEl0cyB0ZW1wbGF0ZQorICAqIGFyZ3VtZW50cyBhcmUgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IGJ5IFByb2R1Y3RSZXR1cm5UeXBlLiBUaGVyZWZvcmUsCisgICogR2VuZXJhbFByb2R1Y3Qgc2hvdWxkIG5ldmVyIGJlIHVzZWQgZGlyZWNsdHkuIFRvIGRldGVybWluZSB0aGUgcmVzdWx0IHR5cGUgb2YgYQorICAqIGZ1bmN0aW9uIHdoaWNoIGludm9sdmVzIGEgbWF0cml4IHByb2R1Y3QsIHVzZSBQcm9kdWN0UmV0dXJuVHlwZTo6VHlwZS4KKyAgKgorICAqIFxzYSBQcm9kdWN0UmV0dXJuVHlwZSwgTWF0cml4QmFzZTo6b3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUeXBlID0gaW50ZXJuYWw6OnByb2R1Y3RfdHlwZTxMaHMsUmhzPjo6dmFsdWU+CitjbGFzcyBHZW5lcmFsUHJvZHVjdDsKKworZW51bSB7CisgIExhcmdlID0gMiwKKyAgU21hbGwgPSAzCit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTxpbnQgUm93cywgaW50IENvbHMsIGludCBEZXB0aD4gc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjsKKwordGVtcGxhdGU8aW50IFNpemUsIGludCBNYXhTaXplPiBzdHJ1Y3QgcHJvZHVjdF9zaXplX2NhdGVnb3J5Cit7CisgIGVudW0geyBpc19sYXJnZSA9IE1heFNpemUgPT0gRHluYW1pYyB8fAorICAgICAgICAgICAgICAgICAgICBTaXplID49IEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQsCisgICAgICAgICB2YWx1ZSA9IGlzX2xhcmdlICA/IExhcmdlCisgICAgICAgICAgICAgICA6IFNpemUgPT0gMSA/IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU21hbGwKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiBzdHJ1Y3QgcHJvZHVjdF90eXBlCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHM+Ojp0eXBlIF9MaHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxSaHM+Ojp0eXBlIF9SaHM7CisgIGVudW0geworICAgIE1heFJvd3MgID0gX0xoczo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgUm93cyAgPSBfTGhzOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzICA9IF9SaHM6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgIENvbHMgID0gX1Joczo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4RGVwdGggPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQoX0xoczo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Joczo6TWF4Um93c0F0Q29tcGlsZVRpbWUpLAorICAgIERlcHRoID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKF9MaHM6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SaHM6OlJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICBMYXJnZVRocmVzaG9sZCA9IEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQKKyAgfTsKKworICAvLyB0aGUgc3BsaXR0aW5nIGludG8gZGlmZmVyZW50IGxpbmVzIG9mIGNvZGUgaGVyZSwgaW50cm9kdWNpbmcgdGhlIF9zZWxlY3QgZW51bXMgYW5kIHRoZSB0eXBlZGVmIGJlbG93LAorICAvLyBpcyB0byB3b3JrIGFyb3VuZCBhbiBpbnRlcm5hbCBjb21waWxlciBlcnJvciB3aXRoIGdjYyA0LjEgYW5kIDQuMi4KK3ByaXZhdGU6CisgIGVudW0geworICAgIHJvd3Nfc2VsZWN0ID0gcHJvZHVjdF9zaXplX2NhdGVnb3J5PFJvd3MsTWF4Um93cz46OnZhbHVlLAorICAgIGNvbHNfc2VsZWN0ID0gcHJvZHVjdF9zaXplX2NhdGVnb3J5PENvbHMsTWF4Q29scz46OnZhbHVlLAorICAgIGRlcHRoX3NlbGVjdCA9IHByb2R1Y3Rfc2l6ZV9jYXRlZ29yeTxEZXB0aCxNYXhEZXB0aD46OnZhbHVlCisgIH07CisgIHR5cGVkZWYgcHJvZHVjdF90eXBlX3NlbGVjdG9yPHJvd3Nfc2VsZWN0LCBjb2xzX3NlbGVjdCwgZGVwdGhfc2VsZWN0PiBzZWxlY3RvcjsKKworcHVibGljOgorICBlbnVtIHsKKyAgICB2YWx1ZSA9IHNlbGVjdG9yOjpyZXQKKyAgfTsKKyNpZmRlZiBFSUdFTl9ERUJVR19QUk9EVUNUCisgIHN0YXRpYyB2b2lkIGRlYnVnKCkKKyAgeworICAgICAgRUlHRU5fREVCVUdfVkFSKFJvd3MpOworICAgICAgRUlHRU5fREVCVUdfVkFSKENvbHMpOworICAgICAgRUlHRU5fREVCVUdfVkFSKERlcHRoKTsKKyAgICAgIEVJR0VOX0RFQlVHX1ZBUihyb3dzX3NlbGVjdCk7CisgICAgICBFSUdFTl9ERUJVR19WQVIoY29sc19zZWxlY3QpOworICAgICAgRUlHRU5fREVCVUdfVkFSKGRlcHRoX3NlbGVjdCk7CisgICAgICBFSUdFTl9ERUJVR19WQVIodmFsdWUpOworICB9CisjZW5kaWYKK307CisKKworLyogVGhlIGZvbGxvd2luZyBhbGxvd3MgdG8gc2VsZWN0IHRoZSBraW5kIG9mIHByb2R1Y3QgYXQgY29tcGlsZSB0aW1lCisgKiBiYXNlZCBvbiB0aGUgdGhyZWUgZGltZW5zaW9ucyBvZiB0aGUgcHJvZHVjdC4KKyAqIFRoaXMgaXMgYSBjb21waWxlIHRpbWUgbWFwcGluZyBmcm9tIHsxLFNtYWxsLExhcmdlfV4zIC0+IHtwcm9kdWN0IHR5cGVzfSAqLworLy8gRklYTUUgSSdtIG5vdCBzdXJlIHRoZSBjdXJyZW50IG1hcHBpbmcgaXMgdGhlIGlkZWFsIG9uZS4KK3RlbXBsYXRlPGludCBNLCBpbnQgTj4gIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8TSxOLDE+ICAgICAgICAgICAgICB7IGVudW0geyByZXQgPSBPdXRlclByb2R1Y3QgfTsgfTsKK3RlbXBsYXRlPGludCBEZXB0aD4gICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgMSwgICAgRGVwdGg+ICB7IGVudW0geyByZXQgPSBJbm5lclByb2R1Y3QgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgMSwgICAgMT4gICAgICB7IGVudW0geyByZXQgPSBJbm5lclByb2R1Y3QgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8U21hbGwsMSwgICAgU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgU21hbGwsU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8U21hbGwsU21hbGwsU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8U21hbGwsIFNtYWxsLCAxPiAgICB7IGVudW0geyByZXQgPSBMYXp5Q29lZmZCYXNlZFByb2R1Y3RNb2RlIH07IH07Cit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPFNtYWxsLCBMYXJnZSwgMT4gICAgeyBlbnVtIHsgcmV0ID0gTGF6eUNvZWZmQmFzZWRQcm9kdWN0TW9kZSB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjxMYXJnZSwgU21hbGwsIDE+ICAgIHsgZW51bSB7IHJldCA9IExhenlDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgTGFyZ2UsU21hbGw+ICB7IGVudW0geyByZXQgPSBDb2VmZkJhc2VkUHJvZHVjdE1vZGUgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8MSwgICAgTGFyZ2UsTGFyZ2U+ICB7IGVudW0geyByZXQgPSBHZW12UHJvZHVjdCB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjwxLCAgICBTbWFsbCxMYXJnZT4gIHsgZW51bSB7IHJldCA9IENvZWZmQmFzZWRQcm9kdWN0TW9kZSB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjxMYXJnZSwxLCAgICBTbWFsbD4gIHsgZW51bSB7IHJldCA9IENvZWZmQmFzZWRQcm9kdWN0TW9kZSB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjxMYXJnZSwxLCAgICBMYXJnZT4gIHsgZW51bSB7IHJldCA9IEdlbXZQcm9kdWN0IH07IH07Cit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPFNtYWxsLDEsICAgIExhcmdlPiAgeyBlbnVtIHsgcmV0ID0gQ29lZmZCYXNlZFByb2R1Y3RNb2RlIH07IH07Cit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPFNtYWxsLFNtYWxsLExhcmdlPiAgeyBlbnVtIHsgcmV0ID0gR2VtbVByb2R1Y3QgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8TGFyZ2UsU21hbGwsTGFyZ2U+ICB7IGVudW0geyByZXQgPSBHZW1tUHJvZHVjdCB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjxTbWFsbCxMYXJnZSxMYXJnZT4gIHsgZW51bSB7IHJldCA9IEdlbW1Qcm9kdWN0IH07IH07Cit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPExhcmdlLExhcmdlLExhcmdlPiAgeyBlbnVtIHsgcmV0ID0gR2VtbVByb2R1Y3QgfTsgfTsKK3RlbXBsYXRlPD4gICAgICAgICAgICAgIHN0cnVjdCBwcm9kdWN0X3R5cGVfc2VsZWN0b3I8TGFyZ2UsU21hbGwsU21hbGw+ICB7IGVudW0geyByZXQgPSBHZW1tUHJvZHVjdCB9OyB9OwordGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IHByb2R1Y3RfdHlwZV9zZWxlY3RvcjxTbWFsbCxMYXJnZSxTbWFsbD4gIHsgZW51bSB7IHJldCA9IEdlbW1Qcm9kdWN0IH07IH07Cit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgcHJvZHVjdF90eXBlX3NlbGVjdG9yPExhcmdlLExhcmdlLFNtYWxsPiAgeyBlbnVtIHsgcmV0ID0gR2VtbVByb2R1Y3QgfTsgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcY2xhc3MgUHJvZHVjdFJldHVyblR5cGUKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBnZXQgdGhlIGNvcnJlY3QgYW5kIG9wdGltaXplZCByZXR1cm5lZCB0eXBlIG9mIG9wZXJhdG9yKgorICAqCisgICogXHBhcmFtIExocyB0aGUgdHlwZSBvZiB0aGUgbGVmdC1oYW5kIHNpZGUKKyAgKiBccGFyYW0gUmhzIHRoZSB0eXBlIG9mIHRoZSByaWdodC1oYW5kIHNpZGUKKyAgKiBccGFyYW0gUHJvZHVjdE1vZGUgdGhlIHR5cGUgb2YgdGhlIHByb2R1Y3QgKGRldGVybWluZWQgYXV0b21hdGljYWxseSBieSBpbnRlcm5hbDo6cHJvZHVjdF9tb2RlKQorICAqCisgICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSB0eXBlbmFtZSBUeXBlIHJlcHJlc2VudGluZyB0aGUgb3B0aW1pemVkIHByb2R1Y3QgZXhwcmVzc2lvbgorICAqIGJldHdlZW4gdHdvIG1hdHJpeCBleHByZXNzaW9ucy4gSW4gcHJhY3RpY2UsIHVzaW5nIFByb2R1Y3RSZXR1cm5UeXBlPExocyxSaHM+OjpUeXBlCisgICogaXMgdGhlIHJlY29tbWVuZGVkIHdheSB0byBkZWZpbmUgdGhlIHJlc3VsdCB0eXBlIG9mIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGFuIGV4cHJlc3Npb24KKyAgKiB3aGljaCBpbnZvbHZlIGEgbWF0cml4IHByb2R1Y3QuIFRoZSBjbGFzcyBQcm9kdWN0IHNob3VsZCBuZXZlciBiZQorICAqIHVzZWQgZGlyZWN0bHkuCisgICoKKyAgKiBcc2EgY2xhc3MgUHJvZHVjdCwgTWF0cml4QmFzZTo6b3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RUeXBlPgorc3RydWN0IFByb2R1Y3RSZXR1cm5UeXBlCit7CisgIC8vIFRPRE8gdXNlIHRoZSBuZXN0ZWQgdHlwZSB0byByZWR1Y2UgaW5zdGFuY2lhdGlvbnMgPz8/PworLy8gICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8TGhzLFJoczo6Q29sc0F0Q29tcGlsZVRpbWU+Ojp0eXBlIExoc05lc3RlZDsKKy8vICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPFJocyxMaHM6OlJvd3NBdENvbXBpbGVUaW1lPjo6dHlwZSBSaHNOZXN0ZWQ7CisKKyAgdHlwZWRlZiBHZW5lcmFsUHJvZHVjdDxMaHMvKk5lc3RlZCovLCBSaHMvKk5lc3RlZCovLCBQcm9kdWN0VHlwZT4gVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IFByb2R1Y3RSZXR1cm5UeXBlPExocyxSaHMsQ29lZmZCYXNlZFByb2R1Y3RNb2RlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8TGhzLCBSaHM6OkNvbHNBdENvbXBpbGVUaW1lLCB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fbWF0cml4X3R5cGU8TGhzPjo6dHlwZSA+Ojp0eXBlIExoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPFJocywgTGhzOjpSb3dzQXRDb21waWxlVGltZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlPFJocz46OnR5cGUgPjo6dHlwZSBSaHNOZXN0ZWQ7CisgIHR5cGVkZWYgQ29lZmZCYXNlZFByb2R1Y3Q8TGhzTmVzdGVkLCBSaHNOZXN0ZWQsIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQgfCBFdmFsQmVmb3JlTmVzdGluZ0JpdD4gVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IFByb2R1Y3RSZXR1cm5UeXBlPExocyxSaHMsTGF6eUNvZWZmQmFzZWRQcm9kdWN0TW9kZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPExocywgUmhzOjpDb2xzQXRDb21waWxlVGltZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlPExocz46OnR5cGUgPjo6dHlwZSBMaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxSaHMsIExoczo6Um93c0F0Q29tcGlsZVRpbWUsIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZTxSaHM+Ojp0eXBlID46OnR5cGUgUmhzTmVzdGVkOworICB0eXBlZGVmIENvZWZmQmFzZWRQcm9kdWN0PExoc05lc3RlZCwgUmhzTmVzdGVkLCBOZXN0QnlSZWZCaXQ+IFR5cGU7Cit9OworCisvLyB0aGlzIGlzIGEgd29ya2Fyb3VuZCBmb3Igc3VuIENDCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBMYXp5UHJvZHVjdFJldHVyblR5cGUgOiBwdWJsaWMgUHJvZHVjdFJldHVyblR5cGU8TGhzLFJocyxMYXp5Q29lZmZCYXNlZFByb2R1Y3RNb2RlPgore307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSW1wbGVtZW50YXRpb24gb2YgSW5uZXIgVmVjdG9yIFZlY3RvciBQcm9kdWN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gRklYTUUgOiBtYXliZSB0aGUgImlubmVyIHByb2R1Y3QiIGNvdWxkIHJldHVybiBhIFNjYWxhcgorLy8gaW5zdGVhZCBvZiBhIDF4MSBtYXRyaXggPz8KKy8vIFBybzogbW9yZSBuYXR1cmFsIGZvciB0aGUgdXNlcgorLy8gQ29uczogdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0gaWYgaW4gYSBtZXRhIHVucm9sbGVkIGFsZ29yaXRobSBhIG1hdHJpeC1tYXRyaXgKKy8vIHByb2R1Y3QgZW5kcyB1cCB0byBhIHJvdy12ZWN0b3IgdGltZXMgY29sLXZlY3RvciBwcm9kdWN0Li4uIFRvIHRhY2tsZSB0aGlzIHVzZQorLy8gY2FzZSwgd2UgY291bGQgaGF2ZSBhIHNwZWNpYWxpemF0aW9uIGZvciBCbG9jazxNYXRyaXhUeXBlLDEsMT4gd2l0aDogb3BlcmF0b3I9KFNjYWxhciB4KTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgdHJhaXRzPEdlbmVyYWxQcm9kdWN0PExocyxSaHMsSW5uZXJQcm9kdWN0PiA+CisgOiB0cmFpdHM8TWF0cml4PHR5cGVuYW1lIHNjYWxhcl9wcm9kdWN0X3RyYWl0czx0eXBlbmFtZSBMaHM6OlNjYWxhciwgdHlwZW5hbWUgUmhzOjpTY2FsYXI+OjpSZXR1cm5UeXBlLDEsMT4gPgore307CisKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitjbGFzcyBHZW5lcmFsUHJvZHVjdDxMaHMsIFJocywgSW5uZXJQcm9kdWN0PgorICA6IGludGVybmFsOjpub19hc3NpZ25tZW50X29wZXJhdG9yLAorICAgIHB1YmxpYyBNYXRyaXg8dHlwZW5hbWUgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X3RyYWl0czx0eXBlbmFtZSBMaHM6OlNjYWxhciwgdHlwZW5hbWUgUmhzOjpTY2FsYXI+OjpSZXR1cm5UeXBlLDEsMT4KK3sKKyAgICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3RfdHJhaXRzPHR5cGVuYW1lIExoczo6U2NhbGFyLCB0eXBlbmFtZSBSaHM6OlNjYWxhcj46OlJldHVyblR5cGUsMSwxPiBCYXNlOworICBwdWJsaWM6CisgICAgR2VuZXJhbFByb2R1Y3QoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIExoczo6UmVhbFNjYWxhciwgdHlwZW5hbWUgUmhzOjpSZWFsU2NhbGFyPjo6dmFsdWUpLAorICAgICAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKworICAgICAgQmFzZTo6Y29lZmZSZWYoMCwwKSA9IChsaHMudHJhbnNwb3NlKCkuY3dpc2VQcm9kdWN0KHJocykpLnN1bSgpOworICAgIH0KKworICAgIC8qKiBDb252ZXJ0aW9uIHRvIHNjYWxhciAqLworICAgIG9wZXJhdG9yIGNvbnN0IHR5cGVuYW1lIEJhc2U6OlNjYWxhcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBCYXNlOjpjb2VmZigwLDApOworICAgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSW1wbGVtZW50YXRpb24gb2YgT3V0ZXIgVmVjdG9yIFZlY3RvciBQcm9kdWN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPGludCBTdG9yYWdlT3JkZXI+IHN0cnVjdCBvdXRlcl9wcm9kdWN0X3NlbGVjdG9yOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCB0cmFpdHM8R2VuZXJhbFByb2R1Y3Q8TGhzLFJocyxPdXRlclByb2R1Y3Q+ID4KKyA6IHRyYWl0czxQcm9kdWN0QmFzZTxHZW5lcmFsUHJvZHVjdDxMaHMsUmhzLE91dGVyUHJvZHVjdD4sIExocywgUmhzPiA+Cit7fTsKKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK2NsYXNzIEdlbmVyYWxQcm9kdWN0PExocywgUmhzLCBPdXRlclByb2R1Y3Q+CisgIDogcHVibGljIFByb2R1Y3RCYXNlPEdlbmVyYWxQcm9kdWN0PExocyxSaHMsT3V0ZXJQcm9kdWN0PiwgTGhzLCBSaHM+Cit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9QUk9EVUNUX1BVQkxJQ19JTlRFUkZBQ0UoR2VuZXJhbFByb2R1Y3QpCisKKyAgICBHZW5lcmFsUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpIDogQmFzZShsaHMscmhzKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIExoczo6UmVhbFNjYWxhciwgdHlwZW5hbWUgUmhzOjpSZWFsU2NhbGFyPjo6dmFsdWUpLAorICAgICAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIHNjYWxlQW5kQWRkVG8oRGVzdCYgZGVzdCwgU2NhbGFyIGFscGhhKSBjb25zdAorICAgIHsKKyAgICAgIGludGVybmFsOjpvdXRlcl9wcm9kdWN0X3NlbGVjdG9yPChpbnQoRGVzdDo6RmxhZ3MpJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3I+OjpydW4oKnRoaXMsIGRlc3QsIGFscGhhKTsKKyAgICB9Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTw+IHN0cnVjdCBvdXRlcl9wcm9kdWN0X3NlbGVjdG9yPENvbE1ham9yPiB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFByb2R1Y3RUeXBlLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oY29uc3QgUHJvZHVjdFR5cGUmIHByb2QsIERlc3QmIGRlc3QsIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpTY2FsYXIgYWxwaGEpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OkluZGV4IEluZGV4OworICAgIC8vIEZJWE1FIG1ha2Ugc3VyZSBsaHMgaXMgc2VxdWVudGlhbGx5IHN0b3JlZAorICAgIC8vIEZJWE1FIG5vdCB2ZXJ5IGdvb2QgaWYgcmhzIGlzIHJlYWwgYW5kIGxocyBjb21wbGV4IHdoaWxlIGFscGhhIGlzIHJlYWwgdG9vCisgICAgY29uc3QgSW5kZXggY29scyA9IGRlc3QuY29scygpOworICAgIGZvciAoSW5kZXggaj0wOyBqPGNvbHM7ICsraikKKyAgICAgIGRlc3QuY29sKGopICs9IChhbHBoYSAqIHByb2QucmhzKCkuY29lZmYoaikpICogcHJvZC5saHMoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3Qgb3V0ZXJfcHJvZHVjdF9zZWxlY3RvcjxSb3dNYWpvcj4geworICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0VHlwZSwgdHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKGNvbnN0IFByb2R1Y3RUeXBlJiBwcm9kLCBEZXN0JiBkZXN0LCB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6U2NhbGFyIGFscGhhKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpJbmRleCBJbmRleDsKKyAgICAvLyBGSVhNRSBtYWtlIHN1cmUgcmhzIGlzIHNlcXVlbnRpYWxseSBzdG9yZWQKKyAgICAvLyBGSVhNRSBub3QgdmVyeSBnb29kIGlmIGxocyBpcyByZWFsIGFuZCByaHMgY29tcGxleCB3aGlsZSBhbHBoYSBpcyByZWFsIHRvbworICAgIGNvbnN0IEluZGV4IHJvd3MgPSBkZXN0LnJvd3MoKTsKKyAgICBmb3IgKEluZGV4IGk9MDsgaTxyb3dzOyArK2kpCisgICAgICBkZXN0LnJvdyhpKSArPSAoYWxwaGEgKiBwcm9kLmxocygpLmNvZWZmKGkpKSAqIHByb2QucmhzKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEltcGxlbWVudGF0aW9uIG9mIEdlbmVyYWwgTWF0cml4IFZlY3RvciBQcm9kdWN0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogIEFjY29yZGluZyB0byB0aGUgc2hhcGUvZmxhZ3Mgb2YgdGhlIG1hdHJpeCB3ZSBoYXZlIHRvIGRpc3RpbmdoaXNoIDMgZGlmZmVyZW50IGNhc2VzOgorICogICAxIC0gdGhlIG1hdHJpeCBpcyBjb2wtbWFqb3IsIEJMQVMgY29tcGF0aWJsZSBhbmQgTSBpcyBsYXJnZSA9PiBjYWxsIGZhc3QgQkxBUy1saWtlIGNvbG1ham9yIHJvdXRpbmUKKyAqICAgMiAtIHRoZSBtYXRyaXggaXMgcm93LW1ham9yLCBCTEFTIGNvbXBhdGlibGUgYW5kIE4gaXMgbGFyZ2UgPT4gY2FsbCBmYXN0IEJMQVMtbGlrZSByb3dtYWpvciByb3V0aW5lCisgKiAgIDMgLSBhbGwgb3RoZXIgY2FzZXMgYXJlIGhhbmRsZWQgdXNpbmcgYSBzaW1wbGUgbG9vcCBhbG9uZyB0aGUgb3V0ZXItc3RvcmFnZSBkaXJlY3Rpb24uCisgKiAgVGhlcmVmb3JlIHdlIG5lZWQgYSBsb3dlciBsZXZlbCBtZXRhIHNlbGVjdG9yLgorICogIEZ1cnRoZXJtb3JlLCBpZiB0aGUgbWF0cml4IGlzIHRoZSByaHMsIHRoZW4gdGhlIHByb2R1Y3QgaGFzIHRvIGJlIHRyYW5zcG9zZWQuCisgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czxHZW5lcmFsUHJvZHVjdDxMaHMsUmhzLEdlbXZQcm9kdWN0PiA+CisgOiB0cmFpdHM8UHJvZHVjdEJhc2U8R2VuZXJhbFByb2R1Y3Q8TGhzLFJocyxHZW12UHJvZHVjdD4sIExocywgUmhzPiA+Cit7fTsKKwordGVtcGxhdGU8aW50IFNpZGUsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQmxhc0NvbXBhdGlibGU+CitzdHJ1Y3QgZ2Vtdl9zZWxlY3RvcjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorY2xhc3MgR2VuZXJhbFByb2R1Y3Q8TGhzLCBSaHMsIEdlbXZQcm9kdWN0PgorICA6IHB1YmxpYyBQcm9kdWN0QmFzZTxHZW5lcmFsUHJvZHVjdDxMaHMsUmhzLEdlbXZQcm9kdWN0PiwgTGhzLCBSaHM+Cit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9QUk9EVUNUX1BVQkxJQ19JTlRFUkZBQ0UoR2VuZXJhbFByb2R1Y3QpCisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExoczo6U2NhbGFyIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6U2NhbGFyIFJoc1NjYWxhcjsKKworICAgIEdlbmVyYWxQcm9kdWN0KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykgOiBCYXNlKGxocyxyaHMpCisgICAgeworLy8gICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgTGhzOjpTY2FsYXIsIHR5cGVuYW1lIFJoczo6U2NhbGFyPjo6dmFsdWUpLAorLy8gICAgICAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKyAgICB9CisKKyAgICBlbnVtIHsgU2lkZSA9IExoczo6SXNWZWN0b3JBdENvbXBpbGVUaW1lID8gT25UaGVMZWZ0IDogT25UaGVSaWdodCB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPGludChTaWRlKT09T25UaGVSaWdodCxfTGhzTmVzdGVkLF9SaHNOZXN0ZWQ+Ojp0eXBlIE1hdHJpeFR5cGU7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIHNjYWxlQW5kQWRkVG8oRGVzdCYgZHN0LCBTY2FsYXIgYWxwaGEpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fbGhzLnJvd3MoKSA9PSBkc3Qucm93cygpICYmIG1fcmhzLmNvbHMoKSA9PSBkc3QuY29scygpKTsKKyAgICAgIGludGVybmFsOjpnZW12X3NlbGVjdG9yPFNpZGUsKGludChNYXRyaXhUeXBlOjpGbGFncykmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbChpbnRlcm5hbDo6Ymxhc190cmFpdHM8TWF0cml4VHlwZT46Okhhc1VzYWJsZURpcmVjdEFjY2Vzcyk+OjpydW4oKnRoaXMsIGRzdCwgYWxwaGEpOworICAgIH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRoZSB2ZWN0b3IgaXMgb24gdGhlIGxlZnQgPT4gdHJhbnNwb3NpdGlvbgordGVtcGxhdGU8aW50IFN0b3JhZ2VPcmRlciwgYm9vbCBCbGFzQ29tcGF0aWJsZT4KK3N0cnVjdCBnZW12X3NlbGVjdG9yPE9uVGhlTGVmdCxTdG9yYWdlT3JkZXIsQmxhc0NvbXBhdGlibGU+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFByb2R1Y3RUeXBlLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgUHJvZHVjdFR5cGUmIHByb2QsIERlc3QmIGRlc3QsIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpTY2FsYXIgYWxwaGEpCisgIHsKKyAgICBUcmFuc3Bvc2U8RGVzdD4gZGVzdFQoZGVzdCk7CisgICAgZW51bSB7IE90aGVyU3RvcmFnZU9yZGVyID0gU3RvcmFnZU9yZGVyID09IFJvd01ham9yID8gQ29sTWFqb3IgOiBSb3dNYWpvciB9OworICAgIGdlbXZfc2VsZWN0b3I8T25UaGVSaWdodCxPdGhlclN0b3JhZ2VPcmRlcixCbGFzQ29tcGF0aWJsZT4KKyAgICAgIDo6cnVuKEdlbmVyYWxQcm9kdWN0PFRyYW5zcG9zZTxjb25zdCB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6X1Joc05lc3RlZD4sVHJhbnNwb3NlPGNvbnN0IHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpfTGhzTmVzdGVkPiwgR2VtdlByb2R1Y3Q+CisgICAgICAgIChwcm9kLnJocygpLnRyYW5zcG9zZSgpLCBwcm9kLmxocygpLnRyYW5zcG9zZSgpKSwgZGVzdFQsIGFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBTaXplLGludCBNYXhTaXplLGJvb2wgQ29uZD4gc3RydWN0IGdlbXZfc3RhdGljX3ZlY3Rvcl9pZjsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBTaXplLGludCBNYXhTaXplPgorc3RydWN0IGdlbXZfc3RhdGljX3ZlY3Rvcl9pZjxTY2FsYXIsU2l6ZSxNYXhTaXplLGZhbHNlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FICBTY2FsYXIqIGRhdGEoKSB7IGVpZ2VuX2ludGVybmFsX2Fzc2VydChmYWxzZSAmJiAic2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyByZXR1cm4gMDsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBTaXplPgorc3RydWN0IGdlbXZfc3RhdGljX3ZlY3Rvcl9pZjxTY2FsYXIsU2l6ZSxEeW5hbWljLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyKiBkYXRhKCkgeyByZXR1cm4gMDsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBTaXplLGludCBNYXhTaXplPgorc3RydWN0IGdlbXZfc3RhdGljX3ZlY3Rvcl9pZjxTY2FsYXIsU2l6ZSxNYXhTaXplLHRydWU+Cit7CisgICNpZiBFSUdFTl9BTElHTl9TVEFUSUNBTExZCisgIGludGVybmFsOjpwbGFpbl9hcnJheTxTY2FsYXIsRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKFNpemUsTWF4U2l6ZSksMD4gbV9kYXRhOworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciogZGF0YSgpIHsgcmV0dXJuIG1fZGF0YS5hcnJheTsgfQorICAjZWxzZQorICAvLyBTb21lIGFyY2hpdGVjdHVyZXMgY2Fubm90IGFsaWduIG9uIHRoZSBzdGFjaywKKyAgLy8gPT4gbGV0J3MgbWFudWFsbHkgZW5mb3JjZSBhbGlnbm1lbnQgYnkgYWxsb2NhdGluZyBtb3JlIGRhdGEgYW5kIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgYWxpZ25lZCBlbGVtZW50LgorICBlbnVtIHsKKyAgICBGb3JjZUFsaWdubWVudCAgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpWZWN0b3JpemFibGUsCisgICAgUGFja2V0U2l6ZSAgICAgID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZQorICB9OworICBpbnRlcm5hbDo6cGxhaW5fYXJyYXk8U2NhbGFyLEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChTaXplLE1heFNpemUpKyhGb3JjZUFsaWdubWVudD9QYWNrZXRTaXplOjApLDA+IG1fZGF0YTsKKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIqIGRhdGEoKSB7CisgICAgcmV0dXJuIEZvcmNlQWxpZ25tZW50CisgICAgICAgICAgICA/IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4oKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihtX2RhdGEuYXJyYXkpICYgfihzaXplX3QoMTUpKSkgKyAxNikKKyAgICAgICAgICAgIDogbV9kYXRhLmFycmF5OworICB9CisgICNlbmRpZgorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgZ2Vtdl9zZWxlY3RvcjxPblRoZVJpZ2h0LENvbE1ham9yLHRydWU+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFByb2R1Y3RUeXBlLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKGNvbnN0IFByb2R1Y3RUeXBlJiBwcm9kLCBEZXN0JiBkZXN0LCB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6U2NhbGFyIGFscGhhKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6TGhzU2NhbGFyICAgTGhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6OlJoc1NjYWxhciAgIFJoc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpTY2FsYXIgICAgICBSZXNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6UmVhbFNjYWxhciAgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpBY3R1YWxMaHNUeXBlIEFjdHVhbExoc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6QWN0dWFsUmhzVHlwZSBBY3R1YWxSaHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6Okxoc0JsYXNUcmFpdHMgTGhzQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpSaHNCbGFzVHJhaXRzIFJoc0JsYXNUcmFpdHM7CisgICAgdHlwZWRlZiBNYXA8TWF0cml4PFJlc1NjYWxhcixEeW5hbWljLDE+LCBBbGlnbmVkPiBNYXBwZWREZXN0OworCisgICAgQWN0dWFsTGhzVHlwZSBhY3R1YWxMaHMgPSBMaHNCbGFzVHJhaXRzOjpleHRyYWN0KHByb2QubGhzKCkpOworICAgIEFjdHVhbFJoc1R5cGUgYWN0dWFsUmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChwcm9kLnJocygpKTsKKworICAgIFJlc1NjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLmxocygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLnJocygpKTsKKworICAgIGVudW0geworICAgICAgLy8gRklYTUUgZmluZCBhIHdheSB0byBhbGxvdyBhbiBpbm5lciBzdHJpZGUgb24gdGhlIHJlc3VsdCBpZiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU9PTEKKyAgICAgIC8vIG9uLCB0aGUgb3RoZXIgaGFuZCBpdCBpcyBnb29kIGZvciB0aGUgY2FjaGUgdG8gcGFjayB0aGUgdmVjdG9yIGFueXdheXMuLi4KKyAgICAgIEV2YWxUb0Rlc3RBdENvbXBpbGVUaW1lID0gRGVzdDo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lPT0xLAorICAgICAgQ29tcGxleEJ5UmVhbCA9IChOdW1UcmFpdHM8TGhzU2NhbGFyPjo6SXNDb21wbGV4KSAmJiAoIU51bVRyYWl0czxSaHNTY2FsYXI+OjpJc0NvbXBsZXgpLAorICAgICAgTWlnaHRDYW5ub3RVc2VEZXN0ID0gKERlc3Q6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSE9MSkgfHwgQ29tcGxleEJ5UmVhbAorICAgIH07CisKKyAgICBnZW12X3N0YXRpY192ZWN0b3JfaWY8UmVzU2NhbGFyLERlc3Q6OlNpemVBdENvbXBpbGVUaW1lLERlc3Q6Ok1heFNpemVBdENvbXBpbGVUaW1lLE1pZ2h0Q2Fubm90VXNlRGVzdD4gc3RhdGljX2Rlc3Q7CisKKyAgICBib29sIGFscGhhSXNDb21wYXRpYmxlID0gKCFDb21wbGV4QnlSZWFsKSB8fCAoaW1hZyhhY3R1YWxBbHBoYSk9PVJlYWxTY2FsYXIoMCkpOworICAgIGJvb2wgZXZhbFRvRGVzdCA9IEV2YWxUb0Rlc3RBdENvbXBpbGVUaW1lICYmIGFscGhhSXNDb21wYXRpYmxlOworICAgIAorICAgIFJoc1NjYWxhciBjb21wYXRpYmxlQWxwaGEgPSBnZXRfZmFjdG9yPFJlc1NjYWxhcixSaHNTY2FsYXI+OjpydW4oYWN0dWFsQWxwaGEpOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFJlc1NjYWxhcixhY3R1YWxEZXN0UHRyLGRlc3Quc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsVG9EZXN0ID8gZGVzdC5kYXRhKCkgOiBzdGF0aWNfZGVzdC5kYXRhKCkpOworICAgIAorICAgIGlmKCFldmFsVG9EZXN0KQorICAgIHsKKyAgICAgICNpZmRlZiBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICBpbnQgc2l6ZSA9IGRlc3Quc2l6ZSgpOworICAgICAgRUlHRU5fREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTgorICAgICAgI2VuZGlmCisgICAgICBpZighYWxwaGFJc0NvbXBhdGlibGUpCisgICAgICB7CisgICAgICAgIE1hcHBlZERlc3QoYWN0dWFsRGVzdFB0ciwgZGVzdC5zaXplKCkpLnNldFplcm8oKTsKKyAgICAgICAgY29tcGF0aWJsZUFscGhhID0gUmhzU2NhbGFyKDEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBNYXBwZWREZXN0KGFjdHVhbERlc3RQdHIsIGRlc3Quc2l6ZSgpKSA9IGRlc3Q7CisgICAgfQorCisgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QKKyAgICAgIDxJbmRleCxMaHNTY2FsYXIsQ29sTWFqb3IsTGhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlLFJoc1NjYWxhcixSaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGU+OjpydW4oCisgICAgICAgIGFjdHVhbExocy5yb3dzKCksIGFjdHVhbExocy5jb2xzKCksCisgICAgICAgIGFjdHVhbExocy5kYXRhKCksIGFjdHVhbExocy5vdXRlclN0cmlkZSgpLAorICAgICAgICBhY3R1YWxSaHMuZGF0YSgpLCBhY3R1YWxSaHMuaW5uZXJTdHJpZGUoKSwKKyAgICAgICAgYWN0dWFsRGVzdFB0ciwgMSwKKyAgICAgICAgY29tcGF0aWJsZUFscGhhKTsKKworICAgIGlmICghZXZhbFRvRGVzdCkKKyAgICB7CisgICAgICBpZighYWxwaGFJc0NvbXBhdGlibGUpCisgICAgICAgIGRlc3QgKz0gYWN0dWFsQWxwaGEgKiBNYXBwZWREZXN0KGFjdHVhbERlc3RQdHIsIGRlc3Quc2l6ZSgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGVzdCA9IE1hcHBlZERlc3QoYWN0dWFsRGVzdFB0ciwgZGVzdC5zaXplKCkpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgZ2Vtdl9zZWxlY3RvcjxPblRoZVJpZ2h0LFJvd01ham9yLHRydWU+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFByb2R1Y3RUeXBlLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgUHJvZHVjdFR5cGUmIHByb2QsIERlc3QmIGRlc3QsIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpTY2FsYXIgYWxwaGEpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpMaHNTY2FsYXIgTGhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6OlJoc1NjYWxhciBSaHNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6U2NhbGFyICAgIFJlc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpBY3R1YWxMaHNUeXBlIEFjdHVhbExoc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6QWN0dWFsUmhzVHlwZSBBY3R1YWxSaHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6Ol9BY3R1YWxSaHNUeXBlIF9BY3R1YWxSaHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6Okxoc0JsYXNUcmFpdHMgTGhzQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpSaHNCbGFzVHJhaXRzIFJoc0JsYXNUcmFpdHM7CisKKyAgICB0eXBlbmFtZSBhZGRfY29uc3Q8QWN0dWFsTGhzVHlwZT46OnR5cGUgYWN0dWFsTGhzID0gTGhzQmxhc1RyYWl0czo6ZXh0cmFjdChwcm9kLmxocygpKTsKKyAgICB0eXBlbmFtZSBhZGRfY29uc3Q8QWN0dWFsUmhzVHlwZT46OnR5cGUgYWN0dWFsUmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChwcm9kLnJocygpKTsKKworICAgIFJlc1NjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLmxocygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLnJocygpKTsKKworICAgIGVudW0geworICAgICAgLy8gRklYTUUgZmluZCBhIHdheSB0byBhbGxvdyBhbiBpbm5lciBzdHJpZGUgb24gdGhlIHJlc3VsdCBpZiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU9PTEKKyAgICAgIC8vIG9uLCB0aGUgb3RoZXIgaGFuZCBpdCBpcyBnb29kIGZvciB0aGUgY2FjaGUgdG8gcGFjayB0aGUgdmVjdG9yIGFueXdheXMuLi4KKyAgICAgIERpcmVjdGx5VXNlUmhzID0gX0FjdHVhbFJoc1R5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MQorICAgIH07CisKKyAgICBnZW12X3N0YXRpY192ZWN0b3JfaWY8UmhzU2NhbGFyLF9BY3R1YWxSaHNUeXBlOjpTaXplQXRDb21waWxlVGltZSxfQWN0dWFsUmhzVHlwZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUsIURpcmVjdGx5VXNlUmhzPiBzdGF0aWNfcmhzOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFJoc1NjYWxhcixhY3R1YWxSaHNQdHIsYWN0dWFsUmhzLnNpemUoKSwKKyAgICAgICAgRGlyZWN0bHlVc2VSaHMgPyBjb25zdF9jYXN0PFJoc1NjYWxhcio+KGFjdHVhbFJocy5kYXRhKCkpIDogc3RhdGljX3Jocy5kYXRhKCkpOworCisgICAgaWYoIURpcmVjdGx5VXNlUmhzKQorICAgIHsKKyAgICAgICNpZmRlZiBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICBpbnQgc2l6ZSA9IGFjdHVhbFJocy5zaXplKCk7CisgICAgICBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICAjZW5kaWYKKyAgICAgIE1hcDx0eXBlbmFtZSBfQWN0dWFsUmhzVHlwZTo6UGxhaW5PYmplY3Q+KGFjdHVhbFJoc1B0ciwgYWN0dWFsUmhzLnNpemUoKSkgPSBhY3R1YWxSaHM7CisgICAgfQorCisgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QKKyAgICAgIDxJbmRleCxMaHNTY2FsYXIsUm93TWFqb3IsTGhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlLFJoc1NjYWxhcixSaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGU+OjpydW4oCisgICAgICAgIGFjdHVhbExocy5yb3dzKCksIGFjdHVhbExocy5jb2xzKCksCisgICAgICAgIGFjdHVhbExocy5kYXRhKCksIGFjdHVhbExocy5vdXRlclN0cmlkZSgpLAorICAgICAgICBhY3R1YWxSaHNQdHIsIDEsCisgICAgICAgIGRlc3QuZGF0YSgpLCBkZXN0LmlubmVyU3RyaWRlKCksCisgICAgICAgIGFjdHVhbEFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgZ2Vtdl9zZWxlY3RvcjxPblRoZVJpZ2h0LENvbE1ham9yLGZhbHNlPgoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0VHlwZSwgdHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFByb2R1Y3RUeXBlJiBwcm9kLCBEZXN0JiBkZXN0LCB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6U2NhbGFyIGFscGhhKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpJbmRleCBJbmRleDsKKyAgICAvLyBUT0RPIG1ha2VzIHN1cmUgZGVzdCBpcyBzZXF1ZW50aWFsbHkgc3RvcmVkIGluIG1lbW9yeSwgb3RoZXJ3aXNlIHVzZSBhIHRlbXAKKyAgICBjb25zdCBJbmRleCBzaXplID0gcHJvZC5yaHMoKS5yb3dzKCk7CisgICAgZm9yKEluZGV4IGs9MDsgazxzaXplOyArK2spCisgICAgICBkZXN0ICs9IChhbHBoYSpwcm9kLnJocygpLmNvZWZmKGspKSAqIHByb2QubGhzKCkuY29sKGspOworICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBnZW12X3NlbGVjdG9yPE9uVGhlUmlnaHQsUm93TWFqb3IsZmFsc2U+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFByb2R1Y3RUeXBlLCB0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgUHJvZHVjdFR5cGUmIHByb2QsIERlc3QmIGRlc3QsIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpTY2FsYXIgYWxwaGEpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OkluZGV4IEluZGV4OworICAgIC8vIFRPRE8gbWFrZXMgc3VyZSByaHMgaXMgc2VxdWVudGlhbGx5IHN0b3JlZCBpbiBtZW1vcnksIG90aGVyd2lzZSB1c2UgYSB0ZW1wCisgICAgY29uc3QgSW5kZXggcm93cyA9IHByb2Qucm93cygpOworICAgIGZvcihJbmRleCBpPTA7IGk8cm93czsgKytpKQorICAgICAgZGVzdC5jb2VmZlJlZihpKSArPSBhbHBoYSAqIChwcm9kLmxocygpLnJvdyhpKS5jd2lzZVByb2R1Y3QocHJvZC5yaHMoKS50cmFuc3Bvc2UoKSkpLnN1bSgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBtYXRyaXggYmFzZSBtZXRob2RzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHByb2R1Y3Qgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyLgorICAqCisgICogXG5vdGUgSWYgaW5zdGVhZCBvZiB0aGUgbWF0cml4IHByb2R1Y3QgeW91IHdhbnQgdGhlIGNvZWZmaWNpZW50LXdpc2UgcHJvZHVjdCwgc2VlIEN3aXNlOjpvcGVyYXRvciooKS4KKyAgKgorICAqIFxzYSBsYXp5UHJvZHVjdCgpLCBvcGVyYXRvcio9KGNvbnN0IE1hdHJpeEJhc2UmKSwgQ3dpc2U6Om9wZXJhdG9yKigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIFByb2R1Y3RSZXR1cm5UeXBlPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OlR5cGUKK01hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICAvLyBBIG5vdGUgcmVnYXJkaW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbjogSW4gTVNWQywgdGhpcyBmdW5jdGlvbiB3aWxsIHNvbWV0aW1lcworICAvLyBub3QgYmUgaW5saW5lZCBzaW5jZSBEZW5zZVN0b3JhZ2UgaXMgYW4gdW53aW5kYWJsZSBvYmplY3QgZm9yIGR5bmFtaWMKKyAgLy8gbWF0cmljZXMgYW5kIHByb2R1Y3QgdHlwZXMgYXJlIGhvbGRpbmcgYSBtZW1iZXIgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAgLy8gVGh1cyBpdCBkb2VzIG5vdCBoZWxwIHRhZ2dpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIEVJR0VOX1NUUk9OR19JTkxJTkUuCisgIGVudW0geworICAgIFByb2R1Y3RJc1ZhbGlkID0gIERlcml2ZWQ6OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljCisgICAgICAgICAgICAgICAgICAgfHwgT3RoZXJEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYworICAgICAgICAgICAgICAgICAgIHx8IGludChEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZSk9PWludChPdGhlckRlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICBBcmVWZWN0b3JzID0gRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lICYmIE90aGVyRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lLAorICAgIFNhbWVTaXplcyA9IEVJR0VOX1BSRURJQ0FURV9TQU1FX01BVFJJWF9TSVpFKERlcml2ZWQsT3RoZXJEZXJpdmVkKQorICB9OworICAvLyBub3RlIHRvIHRoZSBsb3N0IHVzZXI6CisgIC8vICAgICogZm9yIGEgZG90IHByb2R1Y3QgdXNlOiB2MS5kb3QodjIpCisgIC8vICAgICogZm9yIGEgY29lZmYtd2lzZSBwcm9kdWN0IHVzZTogdjEuY3dpc2VQcm9kdWN0KHYyKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKFByb2R1Y3RJc1ZhbGlkIHx8ICEoQXJlVmVjdG9ycyAmJiBTYW1lU2l6ZXMpLAorICAgIElOVkFMSURfVkVDVE9SX1ZFQ1RPUl9QUk9EVUNUX19JRl9ZT1VfV0FOVEVEX0FfRE9UX09SX0NPRUZGX1dJU0VfUFJPRFVDVF9ZT1VfTVVTVF9VU0VfVEhFX0VYUExJQ0lUX0ZVTkNUSU9OUykKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChQcm9kdWN0SXNWYWxpZCB8fCAhKFNhbWVTaXplcyAmJiAhQXJlVmVjdG9ycyksCisgICAgSU5WQUxJRF9NQVRSSVhfUFJPRFVDVF9fSUZfWU9VX1dBTlRFRF9BX0NPRUZGX1dJU0VfUFJPRFVDVF9ZT1VfTVVTVF9VU0VfVEhFX0VYUExJQ0lUX0ZVTkNUSU9OKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKFByb2R1Y3RJc1ZhbGlkIHx8IFNhbWVTaXplcywgSU5WQUxJRF9NQVRSSVhfUFJPRFVDVCkKKyNpZmRlZiBFSUdFTl9ERUJVR19QUk9EVUNUCisgIGludGVybmFsOjpwcm9kdWN0X3R5cGU8RGVyaXZlZCxPdGhlckRlcml2ZWQ+OjpkZWJ1ZygpOworI2VuZGlmCisgIHJldHVybiB0eXBlbmFtZSBQcm9kdWN0UmV0dXJuVHlwZTxEZXJpdmVkLE90aGVyRGVyaXZlZD46OlR5cGUoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgbWF0cml4IHByb2R1Y3Qgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyIHdpdGhvdXQgaW1wbGljaXQgZXZhbHVhdGlvbi4KKyAgKgorICAqIFRoZSByZXR1cm5lZCBwcm9kdWN0IHdpbGwgYmVoYXZlIGxpa2UgYW55IG90aGVyIGV4cHJlc3Npb25zOiB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBwcm9kdWN0IHdpbGwgYmUKKyAgKiBjb21wdXRlZCBvbmNlIGF0IGEgdGltZSBhcyByZXF1ZXN0ZWQuIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGluIHNvbWUgZXh0cmVtZWx5IHJhcmUgY2FzZXMgd2hlbiBvbmx5CisgICogYSBzbWFsbCBhbmQgbm8gY29oZXJlbnQgZnJhY3Rpb24gb2YgdGhlIHJlc3VsdCdzIGNvZWZmaWNpZW50cyBoYXZlIHRvIGJlIGNvbXB1dGVkLgorICAqCisgICogXHdhcm5pbmcgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYXRyaXggcHJvZHVjdCBjYW4gYmUgbXVjaCBtdWNoIHNsb3dlci4gU28gdXNlIGl0IG9ubHkgaWYgeW91IGtub3cKKyAgKiB3aGF0IHlvdSBhcmUgZG9pbmcgYW5kIHRoYXQgeW91IG1lYXN1cmVkIGEgdHJ1ZSBzcGVlZCBpbXByb3ZlbWVudC4KKyAgKgorICAqIFxzYSBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZSYpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorY29uc3QgdHlwZW5hbWUgTGF6eVByb2R1Y3RSZXR1cm5UeXBlPERlcml2ZWQsT3RoZXJEZXJpdmVkPjo6VHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6bGF6eVByb2R1Y3QoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgZW51bSB7CisgICAgUHJvZHVjdElzVmFsaWQgPSAgRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICB8fCBPdGhlckRlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljCisgICAgICAgICAgICAgICAgICAgfHwgaW50KERlcml2ZWQ6OkNvbHNBdENvbXBpbGVUaW1lKT09aW50KE90aGVyRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUpLAorICAgIEFyZVZlY3RvcnMgPSBEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgJiYgT3RoZXJEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsCisgICAgU2FtZVNpemVzID0gRUlHRU5fUFJFRElDQVRFX1NBTUVfTUFUUklYX1NJWkUoRGVyaXZlZCxPdGhlckRlcml2ZWQpCisgIH07CisgIC8vIG5vdGUgdG8gdGhlIGxvc3QgdXNlcjoKKyAgLy8gICAgKiBmb3IgYSBkb3QgcHJvZHVjdCB1c2U6IHYxLmRvdCh2MikKKyAgLy8gICAgKiBmb3IgYSBjb2VmZi13aXNlIHByb2R1Y3QgdXNlOiB2MS5jd2lzZVByb2R1Y3QodjIpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoUHJvZHVjdElzVmFsaWQgfHwgIShBcmVWZWN0b3JzICYmIFNhbWVTaXplcyksCisgICAgSU5WQUxJRF9WRUNUT1JfVkVDVE9SX1BST0RVQ1RfX0lGX1lPVV9XQU5URURfQV9ET1RfT1JfQ09FRkZfV0lTRV9QUk9EVUNUX1lPVV9NVVNUX1VTRV9USEVfRVhQTElDSVRfRlVOQ1RJT05TKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKFByb2R1Y3RJc1ZhbGlkIHx8ICEoU2FtZVNpemVzICYmICFBcmVWZWN0b3JzKSwKKyAgICBJTlZBTElEX01BVFJJWF9QUk9EVUNUX19JRl9ZT1VfV0FOVEVEX0FfQ09FRkZfV0lTRV9QUk9EVUNUX1lPVV9NVVNUX1VTRV9USEVfRVhQTElDSVRfRlVOQ1RJT04pCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoUHJvZHVjdElzVmFsaWQgfHwgU2FtZVNpemVzLCBJTlZBTElEX01BVFJJWF9QUk9EVUNUKQorCisgIHJldHVybiB0eXBlbmFtZSBMYXp5UHJvZHVjdFJldHVyblR5cGU8RGVyaXZlZCxPdGhlckRlcml2ZWQ+OjpUeXBlKGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QUk9EVUNUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL0dlbmVyaWNQYWNrZXRNYXRoLmggYi9FaWdlbi9zcmMvQ29yZS9HZW5lcmljUGFja2V0TWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OGZiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9HZW5lcmljUGFja2V0TWF0aC5oCkBAIC0wLDAgKzEsMzI4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HRU5FUklDX1BBQ0tFVF9NQVRIX0gKKyNkZWZpbmUgRUlHRU5fR0VORVJJQ19QQUNLRVRfTUFUSF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcZmlsZSBHZW5lcmljUGFja2V0TWF0aC5oCisgICoKKyAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0eXBlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZWN0b3JpemF0aW9uLgorICAqIEluIHByYWN0aWNlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gbWFrZSBlYXNpZXIgdGhlIHdyaXRpbmcKKyAgKiBvZiBnZW5lcmljIHZlY3Rvcml6ZWQgY29kZS4KKyAgKi8KKworI2lmbmRlZiBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQKKyNkZWZpbmUgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FECisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRAorI2RlZmluZSBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRAorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRQorI2RlZmluZSBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUKKyNkZWZpbmUgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFCisjZW5kaWYKKworc3RydWN0IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICBlbnVtIHsKKyAgICBIYXNBZGQgICAgPSAxLAorICAgIEhhc1N1YiAgICA9IDEsCisgICAgSGFzTXVsICAgID0gMSwKKyAgICBIYXNOZWdhdGUgPSAxLAorICAgIEhhc0FicyAgICA9IDEsCisgICAgSGFzQWJzMiAgID0gMSwKKyAgICBIYXNNaW4gICAgPSAxLAorICAgIEhhc01heCAgICA9IDEsCisgICAgSGFzQ29uaiAgID0gMSwKKyAgICBIYXNTZXRMaW5lYXIgPSAxLAorCisgICAgSGFzRGl2ICAgID0gMCwKKyAgICBIYXNTcXJ0ICAgPSAwLAorICAgIEhhc0V4cCAgICA9IDAsCisgICAgSGFzTG9nICAgID0gMCwKKyAgICBIYXNQb3cgICAgPSAwLAorCisgICAgSGFzU2luICAgID0gMCwKKyAgICBIYXNDb3MgICAgPSAwLAorICAgIEhhc1RhbiAgICA9IDAsCisgICAgSGFzQVNpbiAgID0gMCwKKyAgICBIYXNBQ29zICAgPSAwLAorICAgIEhhc0FUYW4gICA9IDAKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBwYWNrZXRfdHJhaXRzIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgVCB0eXBlOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAwLAorICAgIHNpemUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDAKKyAgfTsKKyAgZW51bSB7CisgICAgSGFzQWRkICAgID0gMCwKKyAgICBIYXNTdWIgICAgPSAwLAorICAgIEhhc011bCAgICA9IDAsCisgICAgSGFzTmVnYXRlID0gMCwKKyAgICBIYXNBYnMgICAgPSAwLAorICAgIEhhc0FiczIgICA9IDAsCisgICAgSGFzTWluICAgID0gMCwKKyAgICBIYXNNYXggICAgPSAwLAorICAgIEhhc0NvbmogICA9IDAsCisgICAgSGFzU2V0TGluZWFyID0gMAorICB9OworfTsKKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhICsgYiAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIFBhY2tldAorcGFkZChjb25zdCBQYWNrZXQmIGEsCisgICAgICAgIGNvbnN0IFBhY2tldCYgYikgeyByZXR1cm4gYStiOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSAtIGIgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQKK3BzdWIoY29uc3QgUGFja2V0JiBhLAorICAgICAgICBjb25zdCBQYWNrZXQmIGIpIHsgcmV0dXJuIGEtYjsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIC1hIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBpbmxpbmUgUGFja2V0CitwbmVnYXRlKGNvbnN0IFBhY2tldCYgYSkgeyByZXR1cm4gLWE7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBjb25qKGEpIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBpbmxpbmUgUGFja2V0CitwY29uaihjb25zdCBQYWNrZXQmIGEpIHsgcmV0dXJuIGNvbmooYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhICogYiAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIFBhY2tldAorcG11bChjb25zdCBQYWNrZXQmIGEsCisgICAgICAgIGNvbnN0IFBhY2tldCYgYikgeyByZXR1cm4gYSpiOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSAvIGIgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQKK3BkaXYoY29uc3QgUGFja2V0JiBhLAorICAgICAgICBjb25zdCBQYWNrZXQmIGIpIHsgcmV0dXJuIGEvYjsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBtaW4gb2YgXGEgYSBhbmQgXGEgYiAgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQKK3BtaW4oY29uc3QgUGFja2V0JiBhLAorICAgICAgICBjb25zdCBQYWNrZXQmIGIpIHsgdXNpbmcgc3RkOjptaW47IHJldHVybiAobWluKShhLCBiKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBtYXggb2YgXGEgYSBhbmQgXGEgYiAgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQKK3BtYXgoY29uc3QgUGFja2V0JiBhLAorICAgICAgICBjb25zdCBQYWNrZXQmIGIpIHsgdXNpbmcgc3RkOjptYXg7IHJldHVybiAobWF4KShhLCBiKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBcYSBhICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQKK3BhYnMoY29uc3QgUGFja2V0JiBhKSB7IHJldHVybiBhYnMoYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgYml0d2lzZSBhbmQgb2YgXGEgYSBhbmQgXGEgYiAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBpbmxpbmUgUGFja2V0CitwYW5kKGNvbnN0IFBhY2tldCYgYSwgY29uc3QgUGFja2V0JiBiKSB7IHJldHVybiBhICYgYjsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBiaXR3aXNlIG9yIG9mIFxhIGEgYW5kIFxhIGIgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIFBhY2tldAorcG9yKGNvbnN0IFBhY2tldCYgYSwgY29uc3QgUGFja2V0JiBiKSB7IHJldHVybiBhIHwgYjsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBiaXR3aXNlIHhvciBvZiBcYSBhIGFuZCBcYSBiICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQKK3B4b3IoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpIHsgcmV0dXJuIGEgXiBiOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGJpdHdpc2UgYW5kbm90IG9mIFxhIGEgYW5kIFxhIGIgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIFBhY2tldAorcGFuZG5vdChjb25zdCBQYWNrZXQmIGEsIGNvbnN0IFBhY2tldCYgYikgeyByZXR1cm4gYSAmICghYik7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhIHBhY2tldCB2ZXJzaW9uIG9mIFxhICpmcm9tLCBmcm9tIG11c3QgYmUgMTYgYnl0ZXMgYWxpZ25lZCAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBpbmxpbmUgUGFja2V0CitwbG9hZChjb25zdCB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSogZnJvbSkgeyByZXR1cm4gKmZyb207IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhIHBhY2tldCB2ZXJzaW9uIG9mIFxhICpmcm9tLCAodW4tYWxpZ25lZCBsb2FkKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBpbmxpbmUgUGFja2V0CitwbG9hZHUoY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUqIGZyb20pIHsgcmV0dXJuICpmcm9tOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSBwYWNrZXQgd2l0aCBlbGVtZW50cyBvZiBcYSAqZnJvbSBkdXBsaWNhdGVkLCBlLmcuOiAoZnJvbVswXSxmcm9tWzBdLGZyb21bMV0sZnJvbVsxXSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIFBhY2tldAorcGxvYWRkdXAoY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUqIGZyb20pIHsgcmV0dXJuICpmcm9tOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSBwYWNrZXQgd2l0aCBjb25zdGFudCBjb2VmZmljaWVudHMgXGEgYSwgZS5nLjogKGEsYSxhLGEpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQKK3BzZXQxKGNvbnN0IHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlJiBhKSB7IHJldHVybiBhOyB9CisKKy8qKiBcaW50ZXJuYWwgXGJyaWVmIFJldHVybnMgYSBwYWNrZXQgd2l0aCBjb2VmZmljaWVudHMgKGEsYSsxLC4uLixhK3BhY2tldF9zaXplLTEpLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBpbmxpbmUgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlCitwbHNldChjb25zdCBTY2FsYXImIGEpIHsgcmV0dXJuIGE7IH0KKworLyoqIFxpbnRlcm5hbCBjb3B5IHRoZSBwYWNrZXQgXGEgZnJvbSB0byBcYSAqdG8sIFxhIHRvIG11c3QgYmUgMTYgYnl0ZXMgYWxpZ25lZCAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSB2b2lkIHBzdG9yZShTY2FsYXIqIHRvLCBjb25zdCBQYWNrZXQmIGZyb20pCit7ICgqdG8pID0gZnJvbTsgfQorCisvKiogXGludGVybmFsIGNvcHkgdGhlIHBhY2tldCBcYSBmcm9tIHRvIFxhICp0bywgKHVuLWFsaWduZWQgc3RvcmUpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIHZvaWQgcHN0b3JldShTY2FsYXIqIHRvLCBjb25zdCBQYWNrZXQmIGZyb20pCit7ICgqdG8pID0gZnJvbTsgfQorCisvKiogXGludGVybmFsIHRyaWVzIHRvIGRvIGNhY2hlIHByZWZldGNoaW5nIG9mIFxhIGFkZHIgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gaW5saW5lIHZvaWQgcHJlZmV0Y2goY29uc3QgU2NhbGFyKiBhZGRyKQoreworI2lmICFkZWZpbmVkKF9NU0NfVkVSKQorX19idWlsdGluX3ByZWZldGNoKGFkZHIpOworI2VuZGlmCit9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBwYWNrZXQgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlIHBmaXJzdChjb25zdCBQYWNrZXQmIGEpCit7IHJldHVybiBhOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYSBwYWNrZXQgd2hlcmUgdGhlIGVsZW1lbnQgaSBjb250YWlucyB0aGUgc3VtIG9mIHRoZSBwYWNrZXQgb2YgXGEgdmVjW2ldICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQKK3ByZWR1eHAoY29uc3QgUGFja2V0KiB2ZWNzKSB7IHJldHVybiB2ZWNzWzBdOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIHN1bSBvZiB0aGUgZWxlbWVudHMgb2YgXGEgYSovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSBwcmVkdXgoY29uc3QgUGFja2V0JiBhKQoreyByZXR1cm4gYTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSBlbGVtZW50cyBvZiBcYSBhKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIHR5cGVuYW1lIHVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlIHByZWR1eF9tdWwoY29uc3QgUGFja2V0JiBhKQoreyByZXR1cm4gYTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBtaW4gb2YgdGhlIGVsZW1lbnRzIG9mIFxhIGEqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBpbmxpbmUgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUgcHJlZHV4X21pbihjb25zdCBQYWNrZXQmIGEpCit7IHJldHVybiBhOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIG1heCBvZiB0aGUgZWxlbWVudHMgb2YgXGEgYSovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSBwcmVkdXhfbWF4KGNvbnN0IFBhY2tldCYgYSkKK3sgcmV0dXJuIGE7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgcmV2ZXJzZWQgZWxlbWVudHMgb2YgXGEgYSovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQgcHJldmVyc2UoY29uc3QgUGFja2V0JiBhKQoreyByZXR1cm4gYTsgfQorCisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgXGEgYSB3aXRoIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0IGZsaXBwZWQgKGZvciBjb21wbGV4IHR5cGUgb25seSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gaW5saW5lIFBhY2tldCBwY3BseGZsaXAoY29uc3QgUGFja2V0JiBhKQoreyByZXR1cm4gUGFja2V0KGltYWcoYSkscmVhbChhKSk7IH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNwZWNpYWwgbWF0aCBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgc2luZSBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcHNpbihjb25zdCBQYWNrZXQmIGEpIHsgcmV0dXJuIHNpbihhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBjb3NpbmUgb2YgXGEgYSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHBjb3MoY29uc3QgUGFja2V0JiBhKSB7IHJldHVybiBjb3MoYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgdGFuIG9mIFxhIGEgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwdGFuKGNvbnN0IFBhY2tldCYgYSkgeyByZXR1cm4gdGFuKGEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGFyYyBzaW5lIG9mIFxhIGEgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IEVJR0VOX0RFQ0xBUkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMKK1BhY2tldCBwYXNpbihjb25zdCBQYWNrZXQmIGEpIHsgcmV0dXJuIGFzaW4oYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgYXJjIGNvc2luZSBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGFjb3MoY29uc3QgUGFja2V0JiBhKSB7IHJldHVybiBhY29zKGEpOyB9CisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgdGhlIGV4cCBvZiBcYSBhIChjb2VmZi13aXNlKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0PiBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCitQYWNrZXQgcGV4cChjb25zdCBQYWNrZXQmIGEpIHsgcmV0dXJuIGV4cChhKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIHRoZSBsb2cgb2YgXGEgYSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHBsb2coY29uc3QgUGFja2V0JiBhKSB7IHJldHVybiBsb2coYSk7IH0KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgc3F1YXJlLXJvb3Qgb2YgXGEgYSAoY29lZmYtd2lzZSkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4gRUlHRU5fREVDTEFSRV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUworUGFja2V0IHBzcXJ0KGNvbnN0IFBhY2tldCYgYSkgeyByZXR1cm4gc3FydChhKTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1pZ2h0IG5vdCBoYXZlIHRvIGJlIG92ZXJ3cml0dGVuIGZvciB2ZWN0b3JpemVkIHR5cGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBcaW50ZXJuYWwgY29weSBhIHBhY2tldCB3aXRoIGNvbnN0YW50IGNvZWZpY2llbnQgXGEgYSAoZS5nLiwgW2EsYSxhLGFdKSB0byBcYSAqdG8uIFxhIHRvIG11c3QgYmUgMTYgYnl0ZXMgYWxpZ25lZCAqLworLy8gTk9URTogdGhpcyBmdW5jdGlvbiBtdXN0IHJlYWxseSBiZSB0ZW1wbGF0ZWQgb24gdGhlIHBhY2tldCB0eXBlICh0aGluayBhYm91dCBkaWZmZXJlbnQgcGFja2V0IHR5cGVzIGZvciB0aGUgc2FtZSBzY2FsYXIgdHlwZSkKK3RlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KK2lubGluZSB2b2lkIHBzdG9yZTEodHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnR5cGUqIHRvLCBjb25zdCB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSYgYSkKK3sKKyAgcHN0b3JlKHRvLCBwc2V0MTxQYWNrZXQ+KGEpKTsKK30KKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhICogYiArIGMgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBQYWNrZXQKK3BtYWRkKGNvbnN0IFBhY2tldCYgIGEsCisgICAgICAgICBjb25zdCBQYWNrZXQmICBiLAorICAgICAgICAgY29uc3QgUGFja2V0JiAgYykKK3sgcmV0dXJuIHBhZGQocG11bChhLCBiKSxjKTsgfQorCisvKiogXGludGVybmFsIFxyZXR1cm5zIGEgcGFja2V0IHZlcnNpb24gb2YgXGEgKmZyb20uCisgICogSWYgTG9hZE1vZGUgZXF1YWxzICNBbGlnbmVkLCBcYSBmcm9tIG11c3QgYmUgMTYgYnl0ZXMgYWxpZ25lZCAqLwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0LCBpbnQgTG9hZE1vZGU+CitpbmxpbmUgUGFja2V0IHBsb2FkdChjb25zdCB0eXBlbmFtZSB1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSogZnJvbSkKK3sKKyAgaWYoTG9hZE1vZGUgPT0gQWxpZ25lZCkKKyAgICByZXR1cm4gcGxvYWQ8UGFja2V0Pihmcm9tKTsKKyAgZWxzZQorICAgIHJldHVybiBwbG9hZHU8UGFja2V0Pihmcm9tKTsKK30KKworLyoqIFxpbnRlcm5hbCBjb3B5IHRoZSBwYWNrZXQgXGEgZnJvbSB0byBcYSAqdG8uCisgICogSWYgU3RvcmVNb2RlIGVxdWFscyAjQWxpZ25lZCwgXGEgdG8gbXVzdCBiZSAxNiBieXRlcyBhbGlnbmVkICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldCwgaW50IExvYWRNb2RlPgoraW5saW5lIHZvaWQgcHN0b3JldChTY2FsYXIqIHRvLCBjb25zdCBQYWNrZXQmIGZyb20pCit7CisgIGlmKExvYWRNb2RlID09IEFsaWduZWQpCisgICAgcHN0b3JlKHRvLCBmcm9tKTsKKyAgZWxzZQorICAgIHBzdG9yZXUodG8sIGZyb20pOworfQorCisvKiogXGludGVybmFsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcGFsaWduKCkgYWxsb3dpbmcgcGFydGlhbCBzcGVjaWFsaXphdGlvbiAqLwordGVtcGxhdGU8aW50IE9mZnNldCx0eXBlbmFtZSBQYWNrZXRUeXBlPgorc3RydWN0IHBhbGlnbl9pbXBsCit7CisgIC8vIGJ5IGRlZmF1bHQgZGF0YSBhcmUgYWxpZ25lZCwgc28gdGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIDopCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oUGFja2V0VHlwZSYsIGNvbnN0IFBhY2tldFR5cGUmKSB7fQorfTsKKworLyoqIFxpbnRlcm5hbCB1cGRhdGUgXGEgZmlyc3QgdXNpbmcgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIFxhIE9mZnNldCBsYXN0IGVsZW1lbnRzCisgICogb2YgXGEgZmlyc3QgYW5kIHBhY2tldF9zaXplIG1pbnVzIFxhIE9mZnNldCBmaXJzdCBlbGVtZW50cyBvZiBcYSBzZWNvbmQgKi8KK3RlbXBsYXRlPGludCBPZmZzZXQsdHlwZW5hbWUgUGFja2V0VHlwZT4KK2lubGluZSB2b2lkIHBhbGlnbihQYWNrZXRUeXBlJiBmaXJzdCwgY29uc3QgUGFja2V0VHlwZSYgc2Vjb25kKQoreworICBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0VHlwZT46OnJ1bihmaXJzdCxzZWNvbmQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZhc3QgY29tcGxleCBwcm9kdWN0cyAoR0NDIGdlbmVyYXRlcyBhIGZ1bmN0aW9uIGNhbGwgd2hpY2ggaXMgdmVyeSBzbG93KQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTw+IGlubGluZSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHBtdWwoY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYikKK3sgcmV0dXJuIHN0ZDo6Y29tcGxleDxmbG9hdD4ocmVhbChhKSpyZWFsKGIpIC0gaW1hZyhhKSppbWFnKGIpLCBpbWFnKGEpKnJlYWwoYikgKyByZWFsKGEpKmltYWcoYikpOyB9CisKK3RlbXBsYXRlPD4gaW5saW5lIHN0ZDo6Y29tcGxleDxkb3VibGU+IHBtdWwoY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+JiBiKQoreyByZXR1cm4gc3RkOjpjb21wbGV4PGRvdWJsZT4ocmVhbChhKSpyZWFsKGIpIC0gaW1hZyhhKSppbWFnKGIpLCBpbWFnKGEpKnJlYWwoYikgKyByZWFsKGEpKmltYWcoYikpOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSSUNfUEFDS0VUX01BVEhfSAorCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9HbG9iYWxGdW5jdGlvbnMuaCBiL0VpZ2VuL3NyYy9Db3JlL0dsb2JhbEZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzcyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9HbG9iYWxGdW5jdGlvbnMuaApAQCAtMCwwICsxLDEwMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0dMT0JBTF9GVU5DVElPTlNfSAorI2RlZmluZSBFSUdFTl9HTE9CQUxfRlVOQ1RJT05TX0gKKworI2RlZmluZSBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9TVERfVU5BUlkoTkFNRSxGVU5DVE9SKSBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IFwKKyAgaW5saW5lIGNvbnN0IEVpZ2VuOjpDd2lzZVVuYXJ5T3A8RWlnZW46OmludGVybmFsOjpGVU5DVE9SPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IFwKKyAgTkFNRShjb25zdCBFaWdlbjo6QXJyYXlCYXNlPERlcml2ZWQ+JiB4KSB7IFwKKyAgICByZXR1cm4geC5kZXJpdmVkKCk7IFwKKyAgfQorCisjZGVmaW5lIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX0VJR0VOX1VOQVJZKE5BTUUsRlVOQ1RPUikgXAorICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IFwKKyAgc3RydWN0IE5BTUUjI19yZXR2YWw8QXJyYXlCYXNlPERlcml2ZWQ+ID4gXAorICB7IFwKKyAgICB0eXBlZGVmIGNvbnN0IEVpZ2VuOjpDd2lzZVVuYXJ5T3A8RWlnZW46OmludGVybmFsOjpGVU5DVE9SPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+IHR5cGU7IFwKKyAgfTsgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBcCisgIHN0cnVjdCBOQU1FIyNfaW1wbDxBcnJheUJhc2U8RGVyaXZlZD4gPiBcCisgIHsgXAorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgTkFNRSMjX3JldHZhbDxBcnJheUJhc2U8RGVyaXZlZD4gPjo6dHlwZSBydW4oY29uc3QgRWlnZW46OkFycmF5QmFzZTxEZXJpdmVkPiYgeCkgXAorICAgIHsgXAorICAgICAgcmV0dXJuIHguZGVyaXZlZCgpOyBcCisgICAgfSBcCisgIH07CisKKworbmFtZXNwYWNlIHN0ZAoreworICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9TVERfVU5BUlkocmVhbCxzY2FsYXJfcmVhbF9vcCkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfU1REX1VOQVJZKGltYWcsc2NhbGFyX2ltYWdfb3ApCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1NURF9VTkFSWShzaW4sc2NhbGFyX3Npbl9vcCkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfU1REX1VOQVJZKGNvcyxzY2FsYXJfY29zX29wKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9TVERfVU5BUlkoYXNpbixzY2FsYXJfYXNpbl9vcCkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfU1REX1VOQVJZKGFjb3Msc2NhbGFyX2Fjb3Nfb3ApCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1NURF9VTkFSWSh0YW4sc2NhbGFyX3Rhbl9vcCkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfU1REX1VOQVJZKGV4cCxzY2FsYXJfZXhwX29wKQorICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9TVERfVU5BUlkobG9nLHNjYWxhcl9sb2dfb3ApCisgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX1NURF9VTkFSWShhYnMsc2NhbGFyX2Fic19vcCkKKyAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfU1REX1VOQVJZKHNxcnQsc2NhbGFyX3NxcnRfb3ApCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgaW5saW5lIGNvbnN0IEVpZ2VuOjpDd2lzZVVuYXJ5T3A8RWlnZW46OmludGVybmFsOjpzY2FsYXJfcG93X29wPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgIHBvdyhjb25zdCBFaWdlbjo6QXJyYXlCYXNlPERlcml2ZWQ+JiB4LCBjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXImIGV4cG9uZW50KSB7CisgICAgcmV0dXJuIHguZGVyaXZlZCgpLnBvdyhleHBvbmVudCk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgY29uc3QgRWlnZW46OkN3aXNlQmluYXJ5T3A8RWlnZW46OmludGVybmFsOjpzY2FsYXJfYmluYXJ5X3Bvd19vcDx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IERlcml2ZWQ+CisgIHBvdyhjb25zdCBFaWdlbjo6QXJyYXlCYXNlPERlcml2ZWQ+JiB4LCBjb25zdCBFaWdlbjo6QXJyYXlCYXNlPERlcml2ZWQ+JiBleHBvbmVudHMpIAorICB7CisgICAgcmV0dXJuIEVpZ2VuOjpDd2lzZUJpbmFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2JpbmFyeV9wb3dfb3A8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyLCB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBEZXJpdmVkPigKKyAgICAgIHguZGVyaXZlZCgpLAorICAgICAgZXhwb25lbnRzLmRlcml2ZWQoKQorICAgICk7CisgIH0KK30KKworbmFtZXNwYWNlIEVpZ2VuCit7CisgIC8qKgorICAqIFxicmllZiBDb21wb25lbnQtd2lzZSBkaXZpc2lvbiBvZiBhIHNjYWxhciBieSBhcnJheSBlbGVtZW50cy4KKyAgKiovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgY29uc3QgRWlnZW46OkN3aXNlVW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pbnZlcnNlX211bHRfb3A8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KKyAgICBvcGVyYXRvci8odHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIHMsIGNvbnN0IEVpZ2VuOjpBcnJheUJhc2U8RGVyaXZlZD4mIGEpCisgIHsKKyAgICByZXR1cm4gRWlnZW46OkN3aXNlVW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pbnZlcnNlX211bHRfb3A8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4oCisgICAgICBhLmRlcml2ZWQoKSwKKyAgICAgIEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2ludmVyc2VfbXVsdF9vcDx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXI+KHMpICAKKyAgICApOworICB9CisKKyAgbmFtZXNwYWNlIGludGVybmFsCisgIHsKKyAgICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9FSUdFTl9VTkFSWShyZWFsLHNjYWxhcl9yZWFsX29wKQorICAgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX0VJR0VOX1VOQVJZKGltYWcsc2NhbGFyX2ltYWdfb3ApCisgICAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfRUlHRU5fVU5BUlkoc2luLHNjYWxhcl9zaW5fb3ApCisgICAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfRUlHRU5fVU5BUlkoY29zLHNjYWxhcl9jb3Nfb3ApCisgICAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfRUlHRU5fVU5BUlkoYXNpbixzY2FsYXJfYXNpbl9vcCkKKyAgICBFSUdFTl9BUlJBWV9ERUNMQVJFX0dMT0JBTF9FSUdFTl9VTkFSWShhY29zLHNjYWxhcl9hY29zX29wKQorICAgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX0VJR0VOX1VOQVJZKHRhbixzY2FsYXJfdGFuX29wKQorICAgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX0VJR0VOX1VOQVJZKGV4cCxzY2FsYXJfZXhwX29wKQorICAgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX0VJR0VOX1VOQVJZKGxvZyxzY2FsYXJfbG9nX29wKQorICAgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX0VJR0VOX1VOQVJZKGFicyxzY2FsYXJfYWJzX29wKQorICAgIEVJR0VOX0FSUkFZX0RFQ0xBUkVfR0xPQkFMX0VJR0VOX1VOQVJZKGFiczIsc2NhbGFyX2FiczJfb3ApCisgICAgRUlHRU5fQVJSQVlfREVDTEFSRV9HTE9CQUxfRUlHRU5fVU5BUlkoc3FydCxzY2FsYXJfc3FydF9vcCkKKyAgfQorfQorCisvLyBUT0RPOiBjbGVhbmx5IGRpc2FibGUgdGhvc2UgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgb24gQXJyYXkgKGludGVybmFsOjpyZWFsX3JlZiwgaW50ZXJuYWw6OnJhbmRvbSwgaW50ZXJuYWw6OmlzQXBwcm94Li4uKQorCisjZW5kaWYgLy8gRUlHRU5fR0xPQkFMX0ZVTkNUSU9OU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9JTy5oIGIvRWlnZW4vc3JjL0NvcmUvSU8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzhlMThhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvSU8uaApAQCAtMCwwICsxLDI0OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fSU9fSAorI2RlZmluZSBFSUdFTl9JT19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCitlbnVtIHsgRG9udEFsaWduQ29scyA9IDEgfTsKK2VudW0geyBTdHJlYW1QcmVjaXNpb24gPSAtMSwKKyAgICAgICBGdWxsUHJlY2lzaW9uID0gLTIgfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdGQ6Om9zdHJlYW0gJiBwcmludF9tYXRyaXgoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgRGVyaXZlZCYgX20sIGNvbnN0IElPRm9ybWF0JiBmbXQpOworfQorCisvKiogXGNsYXNzIElPRm9ybWF0CisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBTdG9yZXMgYSBzZXQgb2YgcGFyYW1ldGVycyBjb250cm9sbGluZyB0aGUgd2F5IG1hdHJpY2VzIGFyZSBwcmludGVkCisgICoKKyAgKiBMaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzOgorICAqICAtIFxiIHByZWNpc2lvbiBudW1iZXIgb2YgZGlnaXRzIGZvciBmbG9hdGluZyBwb2ludCB2YWx1ZXMsIG9yIG9uZSBvZiB0aGUgc3BlY2lhbCBjb25zdGFudHMgXGMgU3RyZWFtUHJlY2lzaW9uIGFuZCBcYyBGdWxsUHJlY2lzaW9uLgorICAqICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0aGUgc3BlY2lhbCB2YWx1ZSBcYyBTdHJlYW1QcmVjaXNpb24gd2hpY2ggbWVhbnMgdG8gdXNlIHRoZQorICAqICAgICAgICAgICAgICAgICBzdHJlYW0ncyBvd24gcHJlY2lzaW9uIHNldHRpbmcsIGFzIHNldCBmb3IgaW5zdGFuY2UgdXNpbmcgXGMgY291dC5wcmVjaXNpb24oMykuIFRoZSBvdGhlciBzcGVjaWFsIHZhbHVlCisgICogICAgICAgICAgICAgICAgIFxjIEZ1bGxQcmVjaXNpb24gbWVhbnMgdGhhdCB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB3aWxsIGJlIGNvbXB1dGVkIHRvIG1hdGNoIHRoZSBmdWxsIHByZWNpc2lvbiBvZiBlYWNoIGZsb2F0aW5nLXBvaW50CisgICogICAgICAgICAgICAgICAgIHR5cGUuCisgICogIC0gXGIgZmxhZ3MgYW4gT1ItZWQgY29tYmluYXRpb24gb2YgZmxhZ3MsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDAsIHRoZSBvbmx5IGN1cnJlbnRseSBhdmFpbGFibGUgZmxhZyBpcyBcYyBEb250QWxpZ25Db2xzIHdoaWNoCisgICogICAgICAgICAgICAgYWxsb3dzIHRvIGRpc2FibGUgdGhlIGFsaWdubWVudCBvZiBjb2x1bW5zLCByZXN1bHRpbmcgaW4gZmFzdGVyIGNvZGUuCisgICogIC0gXGIgY29lZmZTZXBhcmF0b3Igc3RyaW5nIHByaW50ZWQgYmV0d2VlbiB0d28gY29lZmZpY2llbnRzIG9mIHRoZSBzYW1lIHJvdworICAqICAtIFxiIHJvd1NlcGFyYXRvciBzdHJpbmcgcHJpbnRlZCBiZXR3ZWVuIHR3byByb3dzCisgICogIC0gXGIgcm93UHJlZml4IHN0cmluZyBwcmludGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCByb3cKKyAgKiAgLSBcYiByb3dTdWZmaXggc3RyaW5nIHByaW50ZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHJvdworICAqICAtIFxiIG1hdFByZWZpeCBzdHJpbmcgcHJpbnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYXRyaXgKKyAgKiAgLSBcYiBtYXRTdWZmaXggc3RyaW5nIHByaW50ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbWF0cml4CisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBJT0Zvcm1hdC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBJT0Zvcm1hdC5vdXQKKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OmZvcm1hdCgpLCBjbGFzcyBXaXRoRm9ybWF0CisgICovCitzdHJ1Y3QgSU9Gb3JtYXQKK3sKKyAgLyoqIERlZmF1bHQgY29udHJ1Y3Rvciwgc2VlIGNsYXNzIElPRm9ybWF0IGZvciB0aGUgbWVhbmluZyBvZiB0aGUgcGFyYW1ldGVycyAqLworICBJT0Zvcm1hdChpbnQgX3ByZWNpc2lvbiA9IFN0cmVhbVByZWNpc2lvbiwgaW50IF9mbGFncyA9IDAsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIF9jb2VmZlNlcGFyYXRvciA9ICIgIiwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgX3Jvd1NlcGFyYXRvciA9ICJcbiIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfcm93UHJlZml4PSIiLCBjb25zdCBzdGQ6OnN0cmluZyYgX3Jvd1N1ZmZpeD0iIiwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgX21hdFByZWZpeD0iIiwgY29uc3Qgc3RkOjpzdHJpbmcmIF9tYXRTdWZmaXg9IiIpCisgIDogbWF0UHJlZml4KF9tYXRQcmVmaXgpLCBtYXRTdWZmaXgoX21hdFN1ZmZpeCksIHJvd1ByZWZpeChfcm93UHJlZml4KSwgcm93U3VmZml4KF9yb3dTdWZmaXgpLCByb3dTZXBhcmF0b3IoX3Jvd1NlcGFyYXRvciksCisgICAgY29lZmZTZXBhcmF0b3IoX2NvZWZmU2VwYXJhdG9yKSwgcHJlY2lzaW9uKF9wcmVjaXNpb24pLCBmbGFncyhfZmxhZ3MpCisgIHsKKyAgICByb3dTcGFjZXIgPSAiIjsKKyAgICBpbnQgaSA9IGludChtYXRTdWZmaXgubGVuZ3RoKCkpLTE7CisgICAgd2hpbGUgKGk+PTAgJiYgbWF0U3VmZml4W2ldIT0nXG4nKQorICAgIHsKKyAgICAgIHJvd1NwYWNlciArPSAnICc7CisgICAgICBpLS07CisgICAgfQorICB9CisgIHN0ZDo6c3RyaW5nIG1hdFByZWZpeCwgbWF0U3VmZml4OworICBzdGQ6OnN0cmluZyByb3dQcmVmaXgsIHJvd1N1ZmZpeCwgcm93U2VwYXJhdG9yLCByb3dTcGFjZXI7CisgIHN0ZDo6c3RyaW5nIGNvZWZmU2VwYXJhdG9yOworICBpbnQgcHJlY2lzaW9uOworICBpbnQgZmxhZ3M7Cit9OworCisvKiogXGNsYXNzIFdpdGhGb3JtYXQKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIFBzZXVkbyBleHByZXNzaW9uIHByb3ZpZGluZyBtYXRyaXggb3V0cHV0IHdpdGggZ2l2ZW4gZm9ybWF0CisgICoKKyAgKiBccGFyYW0gRXhwcmVzc2lvblR5cGUgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBvbiB3aGljaCBJTyBzdHJlYW0gb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiB3aXRoIHN0cmVhbSBvcGVyYXRvcnMgY29udHJvbGxlZCBieSBhIGdpdmVuIElPRm9ybWF0LgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBEZW5zZUJhc2U6OmZvcm1hdCgpCisgICogYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFNlZSBjbGFzcyBJT0Zvcm1hdCBmb3Igc29tZSBleGFtcGxlcy4KKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OmZvcm1hdCgpLCBjbGFzcyBJT0Zvcm1hdAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitjbGFzcyBXaXRoRm9ybWF0Cit7CisgIHB1YmxpYzoKKworICAgIFdpdGhGb3JtYXQoY29uc3QgRXhwcmVzc2lvblR5cGUmIG1hdHJpeCwgY29uc3QgSU9Gb3JtYXQmIGZvcm1hdCkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4KSwgbV9mb3JtYXQoZm9ybWF0KQorICAgIHt9CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IFdpdGhGb3JtYXQmIHdmKQorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cHJpbnRfbWF0cml4KHMsIHdmLm1fbWF0cml4LmV2YWwoKSwgd2YubV9mb3JtYXQpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgdHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6Ok5lc3RlZCBtX21hdHJpeDsKKyAgICBJT0Zvcm1hdCBtX2Zvcm1hdDsKK307CisKKy8qKiBccmV0dXJucyBhIFdpdGhGb3JtYXQgcHJveHkgb2JqZWN0IGFsbG93aW5nIHRvIHByaW50IGEgbWF0cml4IHRoZSB3aXRoIGdpdmVuCisgICogZm9ybWF0IFxhIGZtdC4KKyAgKgorICAqIFNlZSBjbGFzcyBJT0Zvcm1hdCBmb3Igc29tZSBleGFtcGxlcy4KKyAgKgorICAqIFxzYSBjbGFzcyBJT0Zvcm1hdCwgY2xhc3MgV2l0aEZvcm1hdAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBXaXRoRm9ybWF0PERlcml2ZWQ+CitEZW5zZUJhc2U8RGVyaXZlZD46OmZvcm1hdChjb25zdCBJT0Zvcm1hdCYgZm10KSBjb25zdAoreworICByZXR1cm4gV2l0aEZvcm1hdDxEZXJpdmVkPihkZXJpdmVkKCksIGZtdCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBJc0ludGVnZXI+CitzdHJ1Y3Qgc2lnbmlmaWNhbnRfZGVjaW1hbHNfZGVmYXVsdF9pbXBsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgc3RhdGljIGlubGluZSBpbnQgcnVuKCkKKyAgeworICAgIHVzaW5nIHN0ZDo6Y2VpbDsKKyAgICByZXR1cm4gY2FzdDxSZWFsU2NhbGFyLGludD4oY2VpbCgtbG9nKE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpKS9sb2coUmVhbFNjYWxhcigxMCkpKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzaWduaWZpY2FudF9kZWNpbWFsc19kZWZhdWx0X2ltcGw8U2NhbGFyLCB0cnVlPgoreworICBzdGF0aWMgaW5saW5lIGludCBydW4oKQorICB7CisgICAgcmV0dXJuIDA7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzaWduaWZpY2FudF9kZWNpbWFsc19pbXBsCisgIDogc2lnbmlmaWNhbnRfZGVjaW1hbHNfZGVmYXVsdF9pbXBsPFNjYWxhciwgTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcj4KK3t9OworCisvKiogXGludGVybmFsCisgICogcHJpbnQgdGhlIG1hdHJpeCBcYSBfbSB0byB0aGUgb3V0cHV0IHN0cmVhbSBcYSBzIHVzaW5nIHRoZSBvdXRwdXQgZm9ybWF0IFxhIGZtdCAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0ZDo6b3N0cmVhbSAmIHByaW50X21hdHJpeChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBEZXJpdmVkJiBfbSwgY29uc3QgSU9Gb3JtYXQmIGZtdCkKK3sKKyAgaWYoX20uc2l6ZSgpID09IDApCisgIHsKKyAgICBzIDw8IGZtdC5tYXRQcmVmaXggPDwgZm10Lm1hdFN1ZmZpeDsKKyAgICByZXR1cm4gczsKKyAgfQorICAKKyAgdHlwZW5hbWUgRGVyaXZlZDo6TmVzdGVkIG0gPSBfbTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IEluZGV4OworCisgIEluZGV4IHdpZHRoID0gMDsKKworICBzdGQ6OnN0cmVhbXNpemUgZXhwbGljaXRfcHJlY2lzaW9uOworICBpZihmbXQucHJlY2lzaW9uID09IFN0cmVhbVByZWNpc2lvbikKKyAgeworICAgIGV4cGxpY2l0X3ByZWNpc2lvbiA9IDA7CisgIH0KKyAgZWxzZSBpZihmbXQucHJlY2lzaW9uID09IEZ1bGxQcmVjaXNpb24pCisgIHsKKyAgICBpZiAoTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikKKyAgICB7CisgICAgICBleHBsaWNpdF9wcmVjaXNpb24gPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZXhwbGljaXRfcHJlY2lzaW9uID0gc2lnbmlmaWNhbnRfZGVjaW1hbHNfaW1wbDxTY2FsYXI+OjpydW4oKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgZXhwbGljaXRfcHJlY2lzaW9uID0gZm10LnByZWNpc2lvbjsKKyAgfQorCisgIGJvb2wgYWxpZ25fY29scyA9ICEoZm10LmZsYWdzICYgRG9udEFsaWduQ29scyk7CisgIGlmKGFsaWduX2NvbHMpCisgIHsKKyAgICAvLyBjb21wdXRlIHRoZSBsYXJnZXN0IHdpZHRoCisgICAgZm9yKEluZGV4IGogPSAxOyBqIDwgbS5jb2xzKCk7ICsraikKKyAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG0ucm93cygpOyArK2kpCisgICAgICB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHI7CisgICAgICAgIGlmKGV4cGxpY2l0X3ByZWNpc2lvbikgc3N0ci5wcmVjaXNpb24oZXhwbGljaXRfcHJlY2lzaW9uKTsKKyAgICAgICAgc3N0ciA8PCBtLmNvZWZmKGksaik7CisgICAgICAgIHdpZHRoID0gc3RkOjptYXg8SW5kZXg+KHdpZHRoLCBJbmRleChzc3RyLnN0cigpLmxlbmd0aCgpKSk7CisgICAgICB9CisgIH0KKyAgc3RkOjpzdHJlYW1zaXplIG9sZF9wcmVjaXNpb24gPSAwOworICBpZihleHBsaWNpdF9wcmVjaXNpb24pIG9sZF9wcmVjaXNpb24gPSBzLnByZWNpc2lvbihleHBsaWNpdF9wcmVjaXNpb24pOworICBzIDw8IGZtdC5tYXRQcmVmaXg7CisgIGZvcihJbmRleCBpID0gMDsgaSA8IG0ucm93cygpOyArK2kpCisgIHsKKyAgICBpZiAoaSkKKyAgICAgIHMgPDwgZm10LnJvd1NwYWNlcjsKKyAgICBzIDw8IGZtdC5yb3dQcmVmaXg7CisgICAgaWYod2lkdGgpIHMud2lkdGgod2lkdGgpOworICAgIHMgPDwgbS5jb2VmZihpLCAwKTsKKyAgICBmb3IoSW5kZXggaiA9IDE7IGogPCBtLmNvbHMoKTsgKytqKQorICAgIHsKKyAgICAgIHMgPDwgZm10LmNvZWZmU2VwYXJhdG9yOworICAgICAgaWYgKHdpZHRoKSBzLndpZHRoKHdpZHRoKTsKKyAgICAgIHMgPDwgbS5jb2VmZihpLCBqKTsKKyAgICB9CisgICAgcyA8PCBmbXQucm93U3VmZml4OworICAgIGlmKCBpIDwgbS5yb3dzKCkgLSAxKQorICAgICAgcyA8PCBmbXQucm93U2VwYXJhdG9yOworICB9CisgIHMgPDwgZm10Lm1hdFN1ZmZpeDsKKyAgaWYoZXhwbGljaXRfcHJlY2lzaW9uKSBzLnByZWNpc2lvbihvbGRfcHJlY2lzaW9uKTsKKyAgcmV0dXJuIHM7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXHJlbGF0ZXMgRGVuc2VCYXNlCisgICoKKyAgKiBPdXRwdXRzIHRoZSBtYXRyaXgsIHRvIHRoZSBnaXZlbiBzdHJlYW0uCisgICoKKyAgKiBJZiB5b3Ugd2lzaCB0byBwcmludCB0aGUgbWF0cml4IHdpdGggYSBmb3JtYXQgZGlmZmVyZW50IHRoYW4gdGhlIGRlZmF1bHQsIHVzZSBEZW5zZUJhc2U6OmZvcm1hdCgpLgorICAqCisgICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgZm9ybWF0IGJ5IGRlZmluaW5nIEVJR0VOX0RFRkFVTFRfSU9fRk9STUFUIGJlZm9yZSBpbmNsdWRpbmcgRWlnZW4gaGVhZGVycy4KKyAgKiBJZiBub3QgZGVmaW5lZCwgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVmaW5lZCB0byBFaWdlbjo6SU9Gb3JtYXQoKSwgdGhhdCBpcyB0aGUgRWlnZW46OklPRm9ybWF0IHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzLgorICAqCisgICogXHNhIERlbnNlQmFzZTo6Zm9ybWF0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PAorKHN0ZDo6b3N0cmVhbSAmIHMsCisgY29uc3QgRGVuc2VCYXNlPERlcml2ZWQ+ICYgbSkKK3sKKyAgcmV0dXJuIGludGVybmFsOjpwcmludF9tYXRyaXgocywgbS5ldmFsKCksIEVJR0VOX0RFRkFVTFRfSU9fRk9STUFUKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9JT19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9NYXAuaCBiL0VpZ2VuL3NyYy9Db3JlL01hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTE5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9NYXAuaApAQCAtMCwwICsxLDE5MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFQX0gKKyNkZWZpbmUgRUlHRU5fTUFQX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgTWFwCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBBIG1hdHJpeCBvciB2ZWN0b3IgZXhwcmVzc2lvbiBtYXBwaW5nIGFuIGV4aXN0aW5nIGFycmF5IG9mIGRhdGEuCisgICoKKyAgKiBcdHBhcmFtIFBsYWluT2JqZWN0VHlwZSB0aGUgZXF1aXZhbGVudCBtYXRyaXggdHlwZSBvZiB0aGUgbWFwcGVkIGRhdGEKKyAgKiBcdHBhcmFtIE1hcE9wdGlvbnMgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHBvaW50ZXIgaXMgXGMgI0FsaWduZWQsIG9yIFxjICNVbmFsaWduZWQuCisgICogICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgXGMgI1VuYWxpZ25lZC4KKyAgKiBcdHBhcmFtIFN0cmlkZVR5cGUgb3B0aW9uYWxseSBzcGVjaWZpZXMgc3RyaWRlcy4gQnkgZGVmYXVsdCwgTWFwIGFzc3VtZXMgdGhlIG1lbW9yeSBsYXlvdXQKKyAgKiAgICAgICAgICAgICAgICAgICBvZiBhbiBvcmRpbmFyeSwgY29udGlndW91cyBhcnJheS4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzcGVjaWZ5aW5nIHN0cmlkZXMuCisgICogICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgcGFzc2VkIGhlcmUgbXVzdCBiZSBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZSBTdHJpZGUgdGVtcGxhdGUsIHNlZSBleGFtcGxlcyBiZWxvdy4KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG1hdHJpeCBvciB2ZWN0b3IgZXhwcmVzc2lvbiBtYXBwaW5nIGFuIGV4aXN0aW5nIGFycmF5IG9mIGRhdGEuCisgICogSXQgY2FuIGJlIHVzZWQgdG8gbGV0IEVpZ2VuIGludGVyZmFjZSB3aXRob3V0IGFueSBvdmVyaGVhZCB3aXRoIG5vbi1FaWdlbiBkYXRhIHN0cnVjdHVyZXMsCisgICogc3VjaCBhcyBwbGFpbiBDIGFycmF5cyBvciBzdHJ1Y3R1cmVzIGZyb20gb3RoZXIgbGlicmFyaWVzLiBCeSBkZWZhdWx0LCBpdCBhc3N1bWVzIHRoYXQgdGhlCisgICogZGF0YSBpcyBsYWlkIG91dCBjb250aWd1b3VzbHkgaW4gbWVtb3J5LiBZb3UgY2FuIGhvd2V2ZXIgb3ZlcnJpZGUgdGhpcyBieSBleHBsaWNpdGx5IHNwZWNpZnlpbmcKKyAgKiBpbm5lciBhbmQgb3V0ZXIgc3RyaWRlcy4KKyAgKgorICAqIEhlcmUncyBhbiBleGFtcGxlIG9mIHNpbXBseSBtYXBwaW5nIGEgY29udGlndW91cyBhcnJheSBhcyBhIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzICJjb2x1bW4tbWFqb3IiIG1hdHJpeDoKKyAgKiBcaW5jbHVkZSBNYXBfc2ltcGxlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hcF9zaW1wbGUub3V0CisgICoKKyAgKiBJZiB5b3UgbmVlZCB0byBtYXAgbm9uLWNvbnRpZ3VvdXMgYXJyYXlzLCB5b3UgY2FuIGRvIHNvIGJ5IHNwZWNpZnlpbmcgc3RyaWRlczoKKyAgKgorICAqIEhlcmUncyBhbiBleGFtcGxlIG9mIG1hcHBpbmcgYW4gYXJyYXkgYXMgYSB2ZWN0b3IsIHNwZWNpZnlpbmcgYW4gaW5uZXIgc3RyaWRlLCB0aGF0IGlzLCB0aGUgcG9pbnRlcgorICAqIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjb2VmZmljaWVudHMuIEhlcmUsIHdlJ3JlIHNwZWNpZnlpbmcgdGhlIGlubmVyIHN0cmlkZSBhcyBhIGNvbXBpbGUtdGltZQorICAqIGZpeGVkIHZhbHVlLgorICAqIFxpbmNsdWRlIE1hcF9pbm5lcl9zdHJpZGUuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWFwX2lubmVyX3N0cmlkZS5vdXQKKyAgKgorICAqIEhlcmUncyBhbiBleGFtcGxlIG9mIG1hcHBpbmcgYW4gYXJyYXkgd2hpbGUgc3BlY2lmeWluZyBhbiBvdXRlciBzdHJpZGUuIEhlcmUsIHNpbmNlIHdlJ3JlIG1hcHBpbmcKKyAgKiBhcyBhIGNvbHVtbi1tYWpvciBtYXRyaXgsICdvdXRlciBzdHJpZGUnIG1lYW5zIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjb2x1bW5zLgorICAqIEhlcmUsIHdlJ3JlIHNwZWNpZnlpbmcgdGhlIG91dGVyIHN0cmlkZSBhcyBhIHJ1bnRpbWUgcGFyYW1ldGVyLiBOb3RlIHRoYXQgaGVyZSBcYyBPdXRlclN0cmlkZTw+IGlzCisgICogYSBzaG9ydCB2ZXJzaW9uIG9mIFxjIE91dGVyU3RyaWRlPER5bmFtaWM+IGJlY2F1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVyIG9mIE91dGVyU3RyaWRlCisgICogaXMgIFxjIER5bmFtaWMKKyAgKiBcaW5jbHVkZSBNYXBfb3V0ZXJfc3RyaWRlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hcF9vdXRlcl9zdHJpZGUub3V0CisgICoKKyAgKiBGb3IgbW9yZSBkZXRhaWxzIGFuZCBmb3IgYW4gZXhhbXBsZSBvZiBzcGVjaWZ5aW5nIGJvdGggYW4gaW5uZXIgYW5kIGFuIG91dGVyIHN0cmlkZSwgc2VlIGNsYXNzIFN0cmlkZS4KKyAgKgorICAqIFxiIFRpcDogdG8gY2hhbmdlIHRoZSBhcnJheSBvZiBkYXRhIG1hcHBlZCBieSBhIE1hcCBvYmplY3QsIHlvdSBjYW4gdXNlIHRoZSBDKysKKyAgKiBwbGFjZW1lbnQgbmV3IHN5bnRheDoKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hcF9wbGFjZW1lbnRfbmV3LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hcF9wbGFjZW1lbnRfbmV3Lm91dAorICAqCisgICogVGhpcyBjbGFzcyBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgUGxhaW5PYmplY3RCYXNlOjpNYXAoKSBidXQgY2FuIGFsc28gYmUgdXNlZCBkaXJlY3RseS4KKyAgKgorICAqIFxzYSBQbGFpbk9iamVjdEJhc2U6Ok1hcCgpLCBccmVmIFRvcGljU3RvcmFnZU9yZGVycworICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLCBpbnQgTWFwT3B0aW9ucywgdHlwZW5hbWUgU3RyaWRlVHlwZT4KK3N0cnVjdCB0cmFpdHM8TWFwPFBsYWluT2JqZWN0VHlwZSwgTWFwT3B0aW9ucywgU3RyaWRlVHlwZT4gPgorICA6IHB1YmxpYyB0cmFpdHM8UGxhaW5PYmplY3RUeXBlPgoreworICB0eXBlZGVmIHRyYWl0czxQbGFpbk9iamVjdFR5cGU+IFRyYWl0c0Jhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGVudW0geworICAgIElubmVyU3RyaWRlQXRDb21waWxlVGltZSA9IFN0cmlkZVR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW50KFBsYWluT2JqZWN0VHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChTdHJpZGVUeXBlOjpJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUpLAorICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IFN0cmlkZVR5cGU6Ok91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW50KFBsYWluT2JqZWN0VHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChTdHJpZGVUeXBlOjpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpLAorICAgIEhhc05vSW5uZXJTdHJpZGUgPSBJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgPT0gMSwKKyAgICBIYXNOb091dGVyU3RyaWRlID0gU3RyaWRlVHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID09IDAsCisgICAgSGFzTm9TdHJpZGUgPSBIYXNOb0lubmVyU3RyaWRlICYmIEhhc05vT3V0ZXJTdHJpZGUsCisgICAgSXNBbGlnbmVkID0gYm9vbChFSUdFTl9BTElHTikgJiYgKChpbnQoTWFwT3B0aW9ucykmQWxpZ25lZCk9PUFsaWduZWQpLAorICAgIElzRHluYW1pY1NpemUgPSBQbGFpbk9iamVjdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lPT1EeW5hbWljLAorICAgIEtlZXBzUGFja2V0QWNjZXNzID0gYm9vbChIYXNOb0lubmVyU3RyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCBib29sKElzRHluYW1pY1NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBIYXNOb091dGVyU3RyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSE9RHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZihTY2FsYXIpKSpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpJTE2KT09MCApICksCisgICAgRmxhZ3MwID0gVHJhaXRzQmFzZTo6RmxhZ3MgJiAofk5lc3RCeVJlZkJpdCksCisgICAgRmxhZ3MxID0gSXNBbGlnbmVkID8gKGludChGbGFnczApIHwgQWxpZ25lZEJpdCkgOiAoaW50KEZsYWdzMCkgJiB+QWxpZ25lZEJpdCksCisgICAgRmxhZ3MyID0gKGJvb2woSGFzTm9TdHJpZGUpIHx8IGJvb2woUGxhaW5PYmplY3RUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpKQorICAgICAgICAgICA/IGludChGbGFnczEpIDogaW50KEZsYWdzMSAmIH5MaW5lYXJBY2Nlc3NCaXQpLAorICAgIEZsYWdzMyA9IGlzX2x2YWx1ZTxQbGFpbk9iamVjdFR5cGU+Ojp2YWx1ZSA/IGludChGbGFnczIpIDogKGludChGbGFnczIpICYgfkx2YWx1ZUJpdCksCisgICAgRmxhZ3MgPSBLZWVwc1BhY2tldEFjY2VzcyA/IGludChGbGFnczMpIDogKGludChGbGFnczMpICYgflBhY2tldEFjY2Vzc0JpdCkKKyAgfTsKK3ByaXZhdGU6CisgIGVudW0geyBPcHRpb25zIH07IC8vIEV4cHJlc3Npb25zIGRvbid0IGhhdmUgT3B0aW9ucworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLCBpbnQgTWFwT3B0aW9ucywgdHlwZW5hbWUgU3RyaWRlVHlwZT4gY2xhc3MgTWFwCisgIDogcHVibGljIE1hcEJhc2U8TWFwPFBsYWluT2JqZWN0VHlwZSwgTWFwT3B0aW9ucywgU3RyaWRlVHlwZT4gPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIE1hcEJhc2U8TWFwPiBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoTWFwKQorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpQb2ludGVyVHlwZSBQb2ludGVyVHlwZTsKKyNpZiBFSUdFTjJfU1VQUE9SVF9TVEFHRSA8PSBTVEFHRTMwX0ZVTExfRUlHRU4zX0FQSQorICAgIHR5cGVkZWYgY29uc3QgU2NhbGFyKiBQb2ludGVyQXJnVHlwZTsKKyAgICBpbmxpbmUgUG9pbnRlclR5cGUgY2FzdF90b19wb2ludGVyX3R5cGUoUG9pbnRlckFyZ1R5cGUgcHRyKSB7IHJldHVybiBjb25zdF9jYXN0PFBvaW50ZXJUeXBlPihwdHIpOyB9CisjZWxzZQorICAgIHR5cGVkZWYgUG9pbnRlclR5cGUgUG9pbnRlckFyZ1R5cGU7CisgICAgaW5saW5lIFBvaW50ZXJUeXBlIGNhc3RfdG9fcG9pbnRlcl90eXBlKFBvaW50ZXJBcmdUeXBlIHB0cikgeyByZXR1cm4gcHRyOyB9CisjZW5kaWYKKworICAgIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIFN0cmlkZVR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSAhPSAwID8gbV9zdHJpZGUuaW5uZXIoKSA6IDE7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gU3RyaWRlVHlwZTo6T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lICE9IDAgPyBtX3N0cmlkZS5vdXRlcigpCisgICAgICAgICAgIDogSXNWZWN0b3JBdENvbXBpbGVUaW1lID8gdGhpcy0+c2l6ZSgpCisgICAgICAgICAgIDogaW50KEZsYWdzKSZSb3dNYWpvckJpdCA/IHRoaXMtPmNvbHMoKQorICAgICAgICAgICA6IHRoaXMtPnJvd3MoKTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0b3IgaW4gdGhlIGZpeGVkLXNpemUgY2FzZS4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIGRhdGEgcG9pbnRlciB0byB0aGUgYXJyYXkgdG8gbWFwCisgICAgICAqIFxwYXJhbSBzdHJpZGUgb3B0aW9uYWwgU3RyaWRlIG9iamVjdCwgcGFzc2luZyB0aGUgc3RyaWRlcy4KKyAgICAgICovCisgICAgaW5saW5lIE1hcChQb2ludGVyQXJnVHlwZSBkYXRhLCBjb25zdCBTdHJpZGVUeXBlJiBzdHJpZGUgPSBTdHJpZGVUeXBlKCkpCisgICAgICA6IEJhc2UoY2FzdF90b19wb2ludGVyX3R5cGUoZGF0YSkpLCBtX3N0cmlkZShzdHJpZGUpCisgICAgeworICAgICAgUGxhaW5PYmplY3RUeXBlOjpCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdG9yIGluIHRoZSBkeW5hbWljLXNpemUgdmVjdG9yIGNhc2UuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBkYXRhIHBvaW50ZXIgdG8gdGhlIGFycmF5IHRvIG1hcAorICAgICAgKiBccGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yIGV4cHJlc3Npb24KKyAgICAgICogXHBhcmFtIHN0cmlkZSBvcHRpb25hbCBTdHJpZGUgb2JqZWN0LCBwYXNzaW5nIHRoZSBzdHJpZGVzLgorICAgICAgKi8KKyAgICBpbmxpbmUgTWFwKFBvaW50ZXJBcmdUeXBlIGRhdGEsIEluZGV4IHNpemUsIGNvbnN0IFN0cmlkZVR5cGUmIHN0cmlkZSA9IFN0cmlkZVR5cGUoKSkKKyAgICAgIDogQmFzZShjYXN0X3RvX3BvaW50ZXJfdHlwZShkYXRhKSwgc2l6ZSksIG1fc3RyaWRlKHN0cmlkZSkKKyAgICB7CisgICAgICBQbGFpbk9iamVjdFR5cGU6OkJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0b3IgaW4gdGhlIGR5bmFtaWMtc2l6ZSBtYXRyaXggY2FzZS4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIGRhdGEgcG9pbnRlciB0byB0aGUgYXJyYXkgdG8gbWFwCisgICAgICAqIFxwYXJhbSByb3dzIHRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4IGV4cHJlc3Npb24KKyAgICAgICogXHBhcmFtIGNvbHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBtYXRyaXggZXhwcmVzc2lvbgorICAgICAgKiBccGFyYW0gc3RyaWRlIG9wdGlvbmFsIFN0cmlkZSBvYmplY3QsIHBhc3NpbmcgdGhlIHN0cmlkZXMuCisgICAgICAqLworICAgIGlubGluZSBNYXAoUG9pbnRlckFyZ1R5cGUgZGF0YSwgSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgU3RyaWRlVHlwZSYgc3RyaWRlID0gU3RyaWRlVHlwZSgpKQorICAgICAgOiBCYXNlKGNhc3RfdG9fcG9pbnRlcl90eXBlKGRhdGEpLCByb3dzLCBjb2xzKSwgbV9zdHJpZGUoc3RyaWRlKQorICAgIHsKKyAgICAgIFBsYWluT2JqZWN0VHlwZTo6QmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgIH0KKworICAgIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoTWFwKQorCisgIHByb3RlY3RlZDoKKyAgICBTdHJpZGVUeXBlIG1fc3RyaWRlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucywgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+CitpbmxpbmUgQXJyYXk8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPgorICA6OkFycmF5KGNvbnN0IFNjYWxhciAqZGF0YSkKK3sKKyAgdGhpcy0+X3NldF9ub2FsaWFzKEVpZ2VuOjpNYXA8Y29uc3QgQXJyYXk+KGRhdGEpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucywgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+CitpbmxpbmUgTWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4KKyAgOjpNYXRyaXgoY29uc3QgU2NhbGFyICpkYXRhKQoreworICB0aGlzLT5fc2V0X25vYWxpYXMoRWlnZW46Ok1hcDxjb25zdCBNYXRyaXg+KGRhdGEpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVBfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvTWFwQmFzZS5oIGIvRWlnZW4vc3JjL0NvcmUvTWFwQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODhkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9NYXBCYXNlLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BUEJBU0VfSAorI2RlZmluZSBFSUdFTl9NQVBCQVNFX0gKKworI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX0lOREVYX0JBU0VEX0FDQ0VTUyhEZXJpdmVkKSBcCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnQoaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MpICYgTGluZWFyQWNjZXNzQml0KSB8fCBEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWU9VX0FSRV9UUllJTkdfVE9fVVNFX0FOX0lOREVYX0JBU0VEX0FDQ0VTU09SX09OX0FOX0VYUFJFU1NJT05fVEhBVF9ET0VTX05PVF9TVVBQT1JUX1RIQVQpCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGNsYXNzIE1hcEJhc2UKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEJhc2UgY2xhc3MgZm9yIE1hcCBhbmQgQmxvY2sgZXhwcmVzc2lvbiB3aXRoIGRpcmVjdCBhY2Nlc3MKKyAgKgorICAqIFxzYSBjbGFzcyBNYXAsIGNsYXNzIEJsb2NrCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBNYXBCYXNlPERlcml2ZWQsIFJlYWRPbmx5QWNjZXNzb3JzPgorICA6IHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8RGVyaXZlZD46OnR5cGUKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8RGVyaXZlZD46OnR5cGUgQmFzZTsKKyAgICBlbnVtIHsKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgU2l6ZUF0Q29tcGlsZVRpbWUgPSBCYXNlOjpTaXplQXRDb21waWxlVGltZQorICAgIH07CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2woaW50ZXJuYWw6OmlzX2x2YWx1ZTxEZXJpdmVkPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNjYWxhciAqPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclR5cGU7CisKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworLy8gICAgdXNpbmcgQmFzZTo6Um93c0F0Q29tcGlsZVRpbWU7CisvLyAgICB1c2luZyBCYXNlOjpDb2xzQXRDb21waWxlVGltZTsKKy8vICAgIHVzaW5nIEJhc2U6OlNpemVBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6Ok1heFJvd3NBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6Ok1heENvbHNBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6Ok1heFNpemVBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6OklzVmVjdG9yQXRDb21waWxlVGltZTsKKyAgICB1c2luZyBCYXNlOjpGbGFnczsKKyAgICB1c2luZyBCYXNlOjpJc1Jvd01ham9yOworCisgICAgdXNpbmcgQmFzZTo6cm93czsKKyAgICB1c2luZyBCYXNlOjpjb2xzOworICAgIHVzaW5nIEJhc2U6OnNpemU7CisgICAgdXNpbmcgQmFzZTo6Y29lZmY7CisgICAgdXNpbmcgQmFzZTo6Y29lZmZSZWY7CisgICAgdXNpbmcgQmFzZTo6bGF6eUFzc2lnbjsKKyAgICB1c2luZyBCYXNlOjpldmFsOworCisgICAgdXNpbmcgQmFzZTo6aW5uZXJTdHJpZGU7CisgICAgdXNpbmcgQmFzZTo6b3V0ZXJTdHJpZGU7CisgICAgdXNpbmcgQmFzZTo6cm93U3RyaWRlOworICAgIHVzaW5nIEJhc2U6OmNvbFN0cmlkZTsKKworICAgIC8vIGJ1ZyAyMTcgLSBjb21waWxlIGVycm9yIG9uIElDQyAxMS4xCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3I9OworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOworCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3MudmFsdWUoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9jb2xzLnZhbHVlKCk7IH0KKworICAgIC8qKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY29lZmZpY2llbnQgb2YgdGhlIG1hdHJpeCBvciB2ZWN0b3IuCisgICAgICAqCisgICAgICAqIFxub3RlIFdoZW4gYWRkcmVzc2luZyB0aGlzIGRhdGEsIG1ha2Ugc3VyZSB0byBob25vciB0aGUgc3RyaWRlcyByZXR1cm5lZCBieSBpbm5lclN0cmlkZSgpIGFuZCBvdXRlclN0cmlkZSgpLgorICAgICAgKgorICAgICAgKiBcc2EgaW5uZXJTdHJpZGUoKSwgb3V0ZXJTdHJpZGUoKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhOyB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9kYXRhW2NvbCAqIGNvbFN0cmlkZSgpICsgcm93ICogcm93U3RyaWRlKCldOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfSU5ERVhfQkFTRURfQUNDRVNTKERlcml2ZWQpCisgICAgICByZXR1cm4gbV9kYXRhW2luZGV4ICogaW5uZXJTdHJpZGUoKV07CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YVtjb2wgKiBjb2xTdHJpZGUoKSArIHJvdyAqIHJvd1N0cmlkZSgpXTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0lOREVYX0JBU0VEX0FDQ0VTUyhEZXJpdmVkKQorICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YVtpbmRleCAqIGlubmVyU3RyaWRlKCldOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkdDxQYWNrZXRTY2FsYXIsIExvYWRNb2RlPgorICAgICAgICAgICAgICAgKG1fZGF0YSArIChjb2wgKiBjb2xTdHJpZGUoKSArIHJvdyAqIHJvd1N0cmlkZSgpKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfSU5ERVhfQkFTRURfQUNDRVNTKERlcml2ZWQpCisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkdDxQYWNrZXRTY2FsYXIsIExvYWRNb2RlPihtX2RhdGEgKyBpbmRleCAqIGlubmVyU3RyaWRlKCkpOworICAgIH0KKworICAgIGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGEpIDogbV9kYXRhKGRhdGEpLCBtX3Jvd3MoUm93c0F0Q29tcGlsZVRpbWUpLCBtX2NvbHMoQ29sc0F0Q29tcGlsZVRpbWUpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9GSVhFRF9TSVpFKERlcml2ZWQpCisgICAgICBjaGVja1Nhbml0eSgpOworICAgIH0KKworICAgIGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGEsIEluZGV4IHNpemUpCisgICAgICAgICAgICA6IG1fZGF0YShkYXRhKSwKKyAgICAgICAgICAgICAgbV9yb3dzKFJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMgPyBzaXplIDogSW5kZXgoUm93c0F0Q29tcGlsZVRpbWUpKSwKKyAgICAgICAgICAgICAgbV9jb2xzKENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMgPyBzaXplIDogSW5kZXgoQ29sc0F0Q29tcGlsZVRpbWUpKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgICAgIGVpZ2VuX2Fzc2VydChzaXplID49IDApOworICAgICAgZWlnZW5fYXNzZXJ0KGRhdGEgPT0gMCB8fCBTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljIHx8IFNpemVBdENvbXBpbGVUaW1lID09IHNpemUpOworICAgICAgY2hlY2tTYW5pdHkoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgTWFwQmFzZShQb2ludGVyVHlwZSBkYXRhLCBJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgICAgICAgICAgOiBtX2RhdGEoZGF0YSksIG1fcm93cyhyb3dzKSwgbV9jb2xzKGNvbHMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KCAoZGF0YSA9PSAwKQorICAgICAgICAgICAgICB8fCAoICAgcm93cyA+PSAwICYmIChSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljIHx8IFJvd3NBdENvbXBpbGVUaW1lID09IHJvd3MpCisgICAgICAgICAgICAgICAgICAmJiBjb2xzID49IDAgJiYgKENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgQ29sc0F0Q29tcGlsZVRpbWUgPT0gY29scykpKTsKKyAgICAgIGNoZWNrU2FuaXR5KCk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKworICAgIHZvaWQgY2hlY2tTYW5pdHkoKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRUlHRU5fSU1QTElFUyhpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpGbGFncyZQYWNrZXRBY2Nlc3NCaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmlubmVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8RGVyaXZlZD46OnJldD09MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tFVF9BQ0NFU1NfUkVRVUlSRVNfVE9fSEFWRV9JTk5FUl9TVFJJREVfRklYRURfVE9fMSk7CisgICAgICBlaWdlbl9hc3NlcnQoRUlHRU5fSU1QTElFUyhpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpGbGFncyZBbGlnbmVkQml0LCAoc2l6ZV90KG1fZGF0YSkgJSAxNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAmJiAiZGF0YSBpcyBub3QgYWxpZ25lZCIpOworICAgIH0KKworICAgIFBvaW50ZXJUeXBlIG1fZGF0YTsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgUm93c0F0Q29tcGlsZVRpbWU+IG1fcm93czsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgQ29sc0F0Q29tcGlsZVRpbWU+IG1fY29sczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hcEJhc2U8RGVyaXZlZCwgV3JpdGVBY2Nlc3NvcnM+CisgIDogcHVibGljIE1hcEJhc2U8RGVyaXZlZCwgUmVhZE9ubHlBY2Nlc3NvcnM+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgTWFwQmFzZTxEZXJpdmVkLCBSZWFkT25seUFjY2Vzc29ycz4gQmFzZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlBhY2tldFNjYWxhciBQYWNrZXRTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlBvaW50ZXJUeXBlIFBvaW50ZXJUeXBlOworCisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjpyb3dzOworICAgIHVzaW5nIEJhc2U6OmNvbHM7CisgICAgdXNpbmcgQmFzZTo6c2l6ZTsKKyAgICB1c2luZyBCYXNlOjpjb2VmZjsKKyAgICB1c2luZyBCYXNlOjpjb2VmZlJlZjsKKworICAgIHVzaW5nIEJhc2U6OmlubmVyU3RyaWRlOworICAgIHVzaW5nIEJhc2U6Om91dGVyU3RyaWRlOworICAgIHVzaW5nIEJhc2U6OnJvd1N0cmlkZTsKKyAgICB1c2luZyBCYXNlOjpjb2xTdHJpZGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmlzX2x2YWx1ZTxEZXJpdmVkPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgIFNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyCisgICAgICAgICAgICAgICAgICA+Ojp0eXBlIFNjYWxhcldpdGhDb25zdElmTm90THZhbHVlOworCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPm1fZGF0YTsgfQorICAgIGlubGluZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZSogZGF0YSgpIHsgcmV0dXJuIHRoaXMtPm1fZGF0YTsgfSAvLyBubyBjb25zdC1jYXN0IGhlcmUgc28gbm9uLWNvbnN0LWNvcnJlY3QgY29kZSB3aWxsIGdpdmUgYSBjb21waWxlIGVycm9yCisKKyAgICBpbmxpbmUgU2NhbGFyV2l0aENvbnN0SWZOb3RMdmFsdWUmIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIHJldHVybiB0aGlzLT5tX2RhdGFbY29sICogY29sU3RyaWRlKCkgKyByb3cgKiByb3dTdHJpZGUoKV07CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhcldpdGhDb25zdElmTm90THZhbHVlJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0lOREVYX0JBU0VEX0FDQ0VTUyhEZXJpdmVkKQorICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YVtpbmRleCAqIGlubmVyU3RyaWRlKCldOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBTdG9yZU1vZGU+CisgICAgaW5saW5lIHZvaWQgd3JpdGVQYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IFBhY2tldFNjYWxhciYgeCkKKyAgICB7CisgICAgICBpbnRlcm5hbDo6cHN0b3JldDxTY2FsYXIsIFBhY2tldFNjYWxhciwgU3RvcmVNb2RlPgorICAgICAgICAgICAgICAgKHRoaXMtPm1fZGF0YSArIChjb2wgKiBjb2xTdHJpZGUoKSArIHJvdyAqIHJvd1N0cmlkZSgpKSwgeCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IFN0b3JlTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfSU5ERVhfQkFTRURfQUNDRVNTKERlcml2ZWQpCisgICAgICBpbnRlcm5hbDo6cHN0b3JldDxTY2FsYXIsIFBhY2tldFNjYWxhciwgU3RvcmVNb2RlPgorICAgICAgICAgICAgICAgICh0aGlzLT5tX2RhdGEgKyBpbmRleCAqIGlubmVyU3RyaWRlKCksIHgpOworICAgIH0KKworICAgIGV4cGxpY2l0IGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGEpIDogQmFzZShkYXRhKSB7fQorICAgIGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGEsIEluZGV4IHNpemUpIDogQmFzZShkYXRhLCBzaXplKSB7fQorICAgIGlubGluZSBNYXBCYXNlKFBvaW50ZXJUeXBlIGRhdGEsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMpIDogQmFzZShkYXRhLCByb3dzLCBjb2xzKSB7fQorCisgICAgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IE1hcEJhc2UmIG90aGVyKQorICAgIHsKKyAgICAgIEJhc2U6OkJhc2U6Om9wZXJhdG9yPShvdGhlcik7CisgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKworICAgIHVzaW5nIEJhc2U6OkJhc2U6Om9wZXJhdG9yPTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFQQkFTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9NYXRoRnVuY3Rpb25zLmggYi9FaWdlbi9zcmMvQ29yZS9NYXRoRnVuY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlOTEzZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL01hdGhGdW5jdGlvbnMuaApAQCAtMCwwICsxLDg0MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUSEZVTkNUSU9OU19ICisjZGVmaW5lIEVJR0VOX01BVEhGVU5DVElPTlNfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsIFxzdHJ1Y3QgZ2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlCisgICoKKyAgKiBXaGF0IGl0IGRvZXM6CisgICogRGVmaW5lcyBhIHR5cGVkZWYgJ3R5cGUnIGFzIGZvbGxvd3M6CisgICogLSBpZiB0eXBlIFQgaGFzIGEgbWVtYmVyIHR5cGVkZWYgRWlnZW5fQmFzZUNsYXNzRm9yU3BlY2lhbGl6YXRpb25PZkdsb2JhbE1hdGhGdW5jSW1wbCwgdGhlbgorICAqICAgZ2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPFQ+Ojp0eXBlIGlzIGEgdHlwZWRlZiBmb3IgaXQuCisgICogLSBvdGhlcndpc2UsIGdsb2JhbF9tYXRoX2Z1bmN0aW9uc19maWx0ZXJpbmdfYmFzZTxUPjo6dHlwZSBpcyBhIHR5cGVkZWYgZm9yIFQuCisgICoKKyAgKiBIb3cgaXQncyB1c2VkOgorICAqIFRvIGFsbG93IHRvIGRlZmluZWQgdGhlIGdsb2JhbCBtYXRoIGZ1bmN0aW9ucyAobGlrZSBzaW4uLi4pIGluIGNlcnRhaW4gY2FzZXMsIGxpa2UgdGhlIEFycmF5IGV4cHJlc3Npb25zLgorICAqIFdoZW4geW91IGRvIHNpbihhcnJheTErYXJyYXkyKSwgdGhlIG9iamVjdCBhcnJheTErYXJyYXkyIGhhcyBhIGNvbXBsaWNhdGVkIGV4cHJlc3Npb24gdHlwZSwgYWxsIHdoYXQgeW91IHdhbnQgdG8ga25vdworICAqIGlzIHRoYXQgaXQgaW5oZXJpdHMgQXJyYXlCYXNlLiBTbyB3ZSBpbXBsZW1lbnQgYSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIHNpbl9pbXBsIGZvciBBcnJheUJhc2U8RGVyaXZlZD4uCisgICogU28gd2UgbXVzdCBtYWtlIHN1cmUgdG8gdXNlIHNpbl9pbXBsPEFycmF5QmFzZTxEZXJpdmVkPiA+IGFuZCBub3Qgc2luX2ltcGw8RGVyaXZlZD4sIG90aGVyd2lzZSBvdXIgcGFydGlhbCBzcGVjaWFsaXphdGlvbgorICAqIHdvbid0IGJlIHVzZWQuIEhvdyBkb2VzIHNpbiBrbm93IHRoYXQ/IFRoYXQncyBleGFjdGx5IHdoYXQgZ2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlIHRlbGxzIGl0LgorICAqCisgICogSG93IGl0J3MgaW1wbGVtZW50ZWQ6CisgICogU0ZJTkFFIGluIHRoZSBzdHlsZSBvZiBlbmFibGVfaWYuIEhpZ2hseSBzdXNjZXB0aWJsZSBvZiBicmVha2luZyBjb21waWxlcnMuIFdpdGggR0NDLCBpdCBzdXJlIGRvZXMgd29yaywgYnV0IGlmIHlvdSByZXBsYWNlCisgICogdGhlIHR5cGVuYW1lIGR1bW15IGJ5IGFuIGludGVnZXIgdGVtcGxhdGUgcGFyYW1ldGVyLCBpdCBkb2Vzbid0IHdvcmsgYW55bW9yZSEKKyAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgZHVtbXkgPSB2b2lkPgorc3RydWN0IGdsb2JhbF9tYXRoX2Z1bmN0aW9uc19maWx0ZXJpbmdfYmFzZQoreworICB0eXBlZGVmIFQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBhbHdheXNfdm9pZCB7IHR5cGVkZWYgdm9pZCB0eXBlOyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGdsb2JhbF9tYXRoX2Z1bmN0aW9uc19maWx0ZXJpbmdfYmFzZQorICA8VCwKKyAgIHR5cGVuYW1lIGFsd2F5c192b2lkPHR5cGVuYW1lIFQ6OkVpZ2VuX0Jhc2VDbGFzc0ZvclNwZWNpYWxpemF0aW9uT2ZHbG9iYWxNYXRoRnVuY0ltcGw+Ojp0eXBlCisgID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUOjpFaWdlbl9CYXNlQ2xhc3NGb3JTcGVjaWFsaXphdGlvbk9mR2xvYmFsTWF0aEZ1bmNJbXBsIHR5cGU7Cit9OworCisjZGVmaW5lIEVJR0VOX01BVEhGVU5DX0lNUEwoZnVuYywgc2NhbGFyKSBmdW5jIyNfaW1wbDx0eXBlbmFtZSBnbG9iYWxfbWF0aF9mdW5jdGlvbnNfZmlsdGVyaW5nX2Jhc2U8c2NhbGFyPjo6dHlwZT4KKyNkZWZpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGZ1bmMsIHNjYWxhcikgdHlwZW5hbWUgZnVuYyMjX3JldHZhbDx0eXBlbmFtZSBnbG9iYWxfbWF0aF9mdW5jdGlvbnNfZmlsdGVyaW5nX2Jhc2U8c2NhbGFyPjo6dHlwZT46OnR5cGUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiByZWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCByZWFsX2ltcGwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgeworICAgIHJldHVybiB4OworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsU2NhbGFyPgorc3RydWN0IHJlYWxfaW1wbDxzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gPgoreworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiYgeCkKKyAgeworICAgIHVzaW5nIHN0ZDo6cmVhbDsKKyAgICByZXR1cm4gcmVhbCh4KTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJlYWxfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwocmVhbCwgU2NhbGFyKSByZWFsKGNvbnN0IFNjYWxhciYgeCkKK3sKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwocmVhbCwgU2NhbGFyKTo6cnVuKHgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBpbWFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBpbWFnX2ltcGwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYpCisgIHsKKyAgICByZXR1cm4gUmVhbFNjYWxhcigwKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbFNjYWxhcj4KK3N0cnVjdCBpbWFnX2ltcGw8c3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+ID4KK3sKKyAgc3RhdGljIGlubGluZSBSZWFsU2NhbGFyIHJ1bihjb25zdCBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4mIHgpCisgIHsKKyAgICB1c2luZyBzdGQ6OmltYWc7CisgICAgcmV0dXJuIGltYWcoeCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBpbWFnX3JldHZhbAoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGltYWcsIFNjYWxhcikgaW1hZyhjb25zdCBTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGltYWcsIFNjYWxhcik6OnJ1bih4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgcmVhbF9yZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgcmVhbF9yZWZfaW1wbAoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHN0YXRpYyBpbmxpbmUgUmVhbFNjYWxhciYgcnVuKFNjYWxhciYgeCkKKyAgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFJlYWxTY2FsYXIqPigmeClbMF07CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBSZWFsU2NhbGFyJiBydW4oY29uc3QgU2NhbGFyJiB4KQorICB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVhbFNjYWxhcio+KCZ4KVswXTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJlYWxfcmVmX3JldHZhbAoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsICYgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSB0eXBlbmFtZSBhZGRfY29uc3Rfb25fdmFsdWVfdHlwZTwgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKHJlYWxfcmVmLCBTY2FsYXIpID46OnR5cGUgcmVhbF9yZWYoY29uc3QgU2NhbGFyJiB4KQoreworICByZXR1cm4gcmVhbF9yZWZfaW1wbDxTY2FsYXI+OjpydW4oeCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwocmVhbF9yZWYsIFNjYWxhcikgcmVhbF9yZWYoU2NhbGFyJiB4KQoreworICByZXR1cm4gRUlHRU5fTUFUSEZVTkNfSU1QTChyZWFsX3JlZiwgU2NhbGFyKTo6cnVuKHgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBpbWFnX3JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBJc0NvbXBsZXg+CitzdHJ1Y3QgaW1hZ19yZWZfZGVmYXVsdF9pbXBsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgc3RhdGljIGlubGluZSBSZWFsU2NhbGFyJiBydW4oU2NhbGFyJiB4KQorICB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVhbFNjYWxhcio+KCZ4KVsxXTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFJlYWxTY2FsYXImIHJ1bihjb25zdCBTY2FsYXImIHgpCisgIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZWFsU2NhbGFyKj4oJngpWzFdOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgaW1hZ19yZWZfZGVmYXVsdF9pbXBsPFNjYWxhciwgZmFsc2U+Cit7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihTY2FsYXImKQorICB7CisgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFNjYWxhciBydW4oY29uc3QgU2NhbGFyJikKKyAgeworICAgIHJldHVybiBTY2FsYXIoMCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBpbWFnX3JlZl9pbXBsIDogaW1hZ19yZWZfZGVmYXVsdF9pbXBsPFNjYWxhciwgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleD4ge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBpbWFnX3JlZl9yZXR2YWwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCAmIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgdHlwZW5hbWUgYWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8IEVJR0VOX01BVEhGVU5DX1JFVFZBTChpbWFnX3JlZiwgU2NhbGFyKSA+Ojp0eXBlIGltYWdfcmVmKGNvbnN0IFNjYWxhciYgeCkKK3sKKyAgcmV0dXJuIGltYWdfcmVmX2ltcGw8U2NhbGFyPjo6cnVuKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGltYWdfcmVmLCBTY2FsYXIpIGltYWdfcmVmKFNjYWxhciYgeCkKK3sKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwoaW1hZ19yZWYsIFNjYWxhcik6OnJ1bih4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgY29uaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgY29ual9pbXBsCit7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpCisgIHsKKyAgICByZXR1cm4geDsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbFNjYWxhcj4KK3N0cnVjdCBjb25qX2ltcGw8c3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+ID4KK3sKKyAgc3RhdGljIGlubGluZSBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gcnVuKGNvbnN0IHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiYgeCkKKyAgeworICAgIHVzaW5nIHN0ZDo6Y29uajsKKyAgICByZXR1cm4gY29uaih4KTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGNvbmpfcmV0dmFsCit7CisgIHR5cGVkZWYgU2NhbGFyIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGNvbmosIFNjYWxhcikgY29uaihjb25zdCBTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGNvbmosIFNjYWxhcik6OnJ1bih4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgYWJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgYWJzX2ltcGwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgeworICAgIHVzaW5nIHN0ZDo6YWJzOworICAgIHJldHVybiBhYnMoeCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBhYnNfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwoYWJzLCBTY2FsYXIpIGFicyhjb25zdCBTY2FsYXImIHgpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKGFicywgU2NhbGFyKTo6cnVuKHgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBhYnMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBhYnMyX2ltcGwKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBzdGF0aWMgaW5saW5lIFJlYWxTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCkKKyAgeworICAgIHJldHVybiB4Kng7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlYWxTY2FsYXI+CitzdHJ1Y3QgYWJzMl9pbXBsPHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiA+Cit7CisgIHN0YXRpYyBpbmxpbmUgUmVhbFNjYWxhciBydW4oY29uc3Qgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+JiB4KQorICB7CisgICAgcmV0dXJuIHJlYWwoeCkqcmVhbCh4KSArIGltYWcoeCkqaW1hZyh4KTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGFiczJfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwoYWJzMiwgU2NhbGFyKSBhYnMyKGNvbnN0IFNjYWxhciYgeCkKK3sKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwoYWJzMiwgU2NhbGFyKTo6cnVuKHgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBub3JtMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBJc0NvbXBsZXg+CitzdHJ1Y3Qgbm9ybTFfZGVmYXVsdF9pbXBsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgc3RhdGljIGlubGluZSBSZWFsU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpCisgIHsKKyAgICByZXR1cm4gYWJzKHJlYWwoeCkpICsgYWJzKGltYWcoeCkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgbm9ybTFfZGVmYXVsdF9pbXBsPFNjYWxhciwgZmFsc2U+Cit7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpCisgIHsKKyAgICByZXR1cm4gYWJzKHgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgbm9ybTFfaW1wbCA6IG5vcm0xX2RlZmF1bHRfaW1wbDxTY2FsYXIsIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgbm9ybTFfcmV0dmFsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwobm9ybTEsIFNjYWxhcikgbm9ybTEoY29uc3QgU2NhbGFyJiB4KQoreworICByZXR1cm4gRUlHRU5fTUFUSEZVTkNfSU1QTChub3JtMSwgU2NhbGFyKTo6cnVuKHgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBoeXBvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBoeXBvdF9pbXBsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgc3RhdGljIGlubGluZSBSZWFsU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSkKKyAgeworICAgIHVzaW5nIHN0ZDo6bWF4OworICAgIHVzaW5nIHN0ZDo6bWluOworICAgIFJlYWxTY2FsYXIgX3ggPSBhYnMoeCk7CisgICAgUmVhbFNjYWxhciBfeSA9IGFicyh5KTsKKyAgICBSZWFsU2NhbGFyIHAgPSAobWF4KShfeCwgX3kpOworICAgIFJlYWxTY2FsYXIgcSA9IChtaW4pKF94LCBfeSk7CisgICAgUmVhbFNjYWxhciBxcCA9IHEvcDsKKyAgICByZXR1cm4gcCAqIHNxcnQoUmVhbFNjYWxhcigxKSArIHFwKnFwKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGh5cG90X3JldHZhbAoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKGh5cG90LCBTY2FsYXIpIGh5cG90KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KQoreworICByZXR1cm4gRUlHRU5fTUFUSEZVTkNfSU1QTChoeXBvdCwgU2NhbGFyKTo6cnVuKHgsIHkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBjYXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIE9sZFR5cGUsIHR5cGVuYW1lIE5ld1R5cGU+CitzdHJ1Y3QgY2FzdF9pbXBsCit7CisgIHN0YXRpYyBpbmxpbmUgTmV3VHlwZSBydW4oY29uc3QgT2xkVHlwZSYgeCkKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxOZXdUeXBlPih4KTsKKyAgfQorfTsKKworLy8gaGVyZSwgZm9yIG9uY2UsIHdlJ3JlIHBsYWlubHkgcmV0dXJuaW5nIE5ld1R5cGU6IHdlIGRvbid0IHdhbnQgY2FzdCB0byBkbyB3ZWlyZCB0aGluZ3MuCisKK3RlbXBsYXRlPHR5cGVuYW1lIE9sZFR5cGUsIHR5cGVuYW1lIE5ld1R5cGU+CitpbmxpbmUgTmV3VHlwZSBjYXN0KGNvbnN0IE9sZFR5cGUmIHgpCit7CisgIHJldHVybiBjYXN0X2ltcGw8T2xkVHlwZSwgTmV3VHlwZT46OnJ1bih4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2Ygc3FydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGJvb2wgSXNJbnRlZ2VyPgorc3RydWN0IHNxcnRfZGVmYXVsdF9pbXBsCit7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpCisgIHsKKyAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgcmV0dXJuIHNxcnQoeCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzcXJ0X2RlZmF1bHRfaW1wbDxTY2FsYXIsIHRydWU+Cit7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImKQorICB7CisjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyAgICBlaWdlbl9hc3NlcnQoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpOworI2Vsc2UKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX05PTl9JTlRFR0VSKFNjYWxhcikKKyNlbmRpZgorICAgIHJldHVybiBTY2FsYXIoMCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzcXJ0X2ltcGwgOiBzcXJ0X2RlZmF1bHRfaW1wbDxTY2FsYXIsIE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXI+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3Qgc3FydF9yZXR2YWwKK3sKKyAgdHlwZWRlZiBTY2FsYXIgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBFSUdFTl9NQVRIRlVOQ19SRVRWQUwoc3FydCwgU2NhbGFyKSBzcXJ0KGNvbnN0IFNjYWxhciYgeCkKK3sKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwoc3FydCwgU2NhbGFyKTo6cnVuKHgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBzdGFuZGFyZCB1bmFyeSByZWFsIGZ1bmN0aW9ucyAoZXhwLCBsb2csIHNpbiwgY29zLCAuLi4gICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIFRoaXMgbWFjcm8gaW5zdGFuY2lhdGUgYWxsIHRoZSBuZWNlc3NhcnkgdGVtcGxhdGUgbWVjaGFuaXNtIHdoaWNoIGlzIGNvbW1vbiB0byBhbGwgdW5hcnkgcmVhbCBmdW5jdGlvbnMuCisjZGVmaW5lIEVJR0VOX01BVEhGVU5DX1NUQU5EQVJEX1JFQUxfVU5BUlkoTkFNRSkgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGJvb2wgSXNJbnRlZ2VyPiBzdHJ1Y3QgTkFNRSMjX2RlZmF1bHRfaW1wbCB7ICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgpIHsgdXNpbmcgc3RkOjpOQU1FOyByZXR1cm4gTkFNRSh4KTsgfSAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBOQU1FIyNfZGVmYXVsdF9pbXBsPFNjYWxhciwgdHJ1ZT4geyAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9OT05fSU5URUdFUihTY2FsYXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFNjYWxhcigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBOQU1FIyNfaW1wbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogTkFNRSMjX2RlZmF1bHRfaW1wbDxTY2FsYXIsIE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXI+ICAgICAgICAgICAgICAgICAgICAgXAorICB7fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBOQU1FIyNfcmV0dmFsIHsgdHlwZWRlZiBTY2FsYXIgdHlwZTsgfTsgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKE5BTUUsIFNjYWxhcikgTkFNRShjb25zdCBTY2FsYXImIHgpIHsgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKE5BTUUsIFNjYWxhcik6OnJ1bih4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0VJR0VOX01BVEhGVU5DX1NUQU5EQVJEX1JFQUxfVU5BUlkoZXhwKQorRUlHRU5fTUFUSEZVTkNfU1RBTkRBUkRfUkVBTF9VTkFSWShsb2cpCitFSUdFTl9NQVRIRlVOQ19TVEFOREFSRF9SRUFMX1VOQVJZKHNpbikKK0VJR0VOX01BVEhGVU5DX1NUQU5EQVJEX1JFQUxfVU5BUlkoY29zKQorRUlHRU5fTUFUSEZVTkNfU1RBTkRBUkRfUkVBTF9VTkFSWSh0YW4pCitFSUdFTl9NQVRIRlVOQ19TVEFOREFSRF9SRUFMX1VOQVJZKGFzaW4pCitFSUdFTl9NQVRIRlVOQ19TVEFOREFSRF9SRUFMX1VOQVJZKGFjb3MpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIGF0YW4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBib29sIElzSW50ZWdlcj4KK3N0cnVjdCBhdGFuMl9kZWZhdWx0X2ltcGwKK3sKKyAgdHlwZWRlZiBTY2FsYXIgcmV0dmFsOworICBzdGF0aWMgaW5saW5lIFNjYWxhciBydW4oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpCisgIHsKKyAgICB1c2luZyBzdGQ6OmF0YW4yOworICAgIHJldHVybiBhdGFuMih4LCB5KTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGF0YW4yX2RlZmF1bHRfaW1wbDxTY2FsYXIsIHRydWU+Cit7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImLCBjb25zdCBTY2FsYXImKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9OT05fSU5URUdFUihTY2FsYXIpCisgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGF0YW4yX2ltcGwgOiBhdGFuMl9kZWZhdWx0X2ltcGw8U2NhbGFyLCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGF0YW4yX3JldHZhbAoreworICB0eXBlZGVmIFNjYWxhciB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChhdGFuMiwgU2NhbGFyKSBhdGFuMihjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSkKK3sKKyAgcmV0dXJuIEVJR0VOX01BVEhGVU5DX0lNUEwoYXRhbjIsIFNjYWxhcik6OnJ1bih4LCB5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgcG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGJvb2wgSXNJbnRlZ2VyPgorc3RydWN0IHBvd19kZWZhdWx0X2ltcGwKK3sKKyAgdHlwZWRlZiBTY2FsYXIgcmV0dmFsOworICBzdGF0aWMgaW5saW5lIFNjYWxhciBydW4oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpCisgIHsKKyAgICB1c2luZyBzdGQ6OnBvdzsKKyAgICByZXR1cm4gcG93KHgsIHkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgcG93X2RlZmF1bHRfaW1wbDxTY2FsYXIsIHRydWU+Cit7CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihTY2FsYXIgeCwgU2NhbGFyIHkpCisgIHsKKyAgICBTY2FsYXIgcmVzKDEpOworICAgIGVpZ2VuX2Fzc2VydCghTnVtVHJhaXRzPFNjYWxhcj46OklzU2lnbmVkIHx8IHkgPj0gMCk7CisgICAgaWYoeSAmIDEpIHJlcyAqPSB4OworICAgIHkgPj49IDE7CisgICAgd2hpbGUoeSkKKyAgICB7CisgICAgICB4ICo9IHg7CisgICAgICBpZih5JjEpIHJlcyAqPSB4OworICAgICAgeSA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHBvd19pbXBsIDogcG93X2RlZmF1bHRfaW1wbDxTY2FsYXIsIE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXI+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgcG93X3JldHZhbAoreworICB0eXBlZGVmIFNjYWxhciB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChwb3csIFNjYWxhcikgcG93KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KQoreworICByZXR1cm4gRUlHRU5fTUFUSEZVTkNfSU1QTChwb3csIFNjYWxhcik6OnJ1bih4LCB5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgcmFuZG9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsCisgICAgICAgICBib29sIElzQ29tcGxleCwKKyAgICAgICAgIGJvb2wgSXNJbnRlZ2VyPgorc3RydWN0IHJhbmRvbV9kZWZhdWx0X2ltcGwge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCByYW5kb21faW1wbCA6IHJhbmRvbV9kZWZhdWx0X2ltcGw8U2NhbGFyLCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJhbmRvbV9yZXR2YWwKK3sKKyAgdHlwZWRlZiBTY2FsYXIgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChyYW5kb20sIFNjYWxhcikgcmFuZG9tKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gaW5saW5lIEVJR0VOX01BVEhGVU5DX1JFVFZBTChyYW5kb20sIFNjYWxhcikgcmFuZG9tKCk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCByYW5kb21fZGVmYXVsdF9pbXBsPFNjYWxhciwgZmFsc2UsIGZhbHNlPgoreworICBzdGF0aWMgaW5saW5lIFNjYWxhciBydW4oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpCisgIHsKKyAgICByZXR1cm4geCArICh5LXgpICogU2NhbGFyKHN0ZDo6cmFuZCgpKSAvIFNjYWxhcihSQU5EX01BWCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBTY2FsYXIgcnVuKCkKKyAgeworICAgIHJldHVybiBydW4oU2NhbGFyKE51bVRyYWl0czxTY2FsYXI+OjpJc1NpZ25lZCA/IC0xIDogMCksIFNjYWxhcigxKSk7CisgIH0KK307CisKK2VudW0geworICBmbG9vcl9sb2cyX3Rlcm1pbmF0ZSwKKyAgZmxvb3JfbG9nMl9tb3ZlX3VwLAorICBmbG9vcl9sb2cyX21vdmVfZG93biwKKyAgZmxvb3JfbG9nMl9ib2d1cworfTsKKwordGVtcGxhdGU8dW5zaWduZWQgaW50IG4sIGludCBsb3dlciwgaW50IHVwcGVyPiBzdHJ1Y3QgZmxvb3JfbG9nMl9zZWxlY3RvcgoreworICBlbnVtIHsgbWlkZGxlID0gKGxvd2VyICsgdXBwZXIpIC8gMiwKKyAgICAgICAgIHZhbHVlID0gKHVwcGVyIDw9IGxvd2VyICsgMSkgPyBpbnQoZmxvb3JfbG9nMl90ZXJtaW5hdGUpCisgICAgICAgICAgICAgICA6IChuIDwgKDEgPDwgbWlkZGxlKSkgPyBpbnQoZmxvb3JfbG9nMl9tb3ZlX2Rvd24pCisgICAgICAgICAgICAgICA6IChuPT0wKSA/IGludChmbG9vcl9sb2cyX2JvZ3VzKQorICAgICAgICAgICAgICAgOiBpbnQoZmxvb3JfbG9nMl9tb3ZlX3VwKQorICB9OworfTsKKwordGVtcGxhdGU8dW5zaWduZWQgaW50IG4sCisgICAgICAgICBpbnQgbG93ZXIgPSAwLAorICAgICAgICAgaW50IHVwcGVyID0gc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBDSEFSX0JJVCAtIDEsCisgICAgICAgICBpbnQgc2VsZWN0b3IgPSBmbG9vcl9sb2cyX3NlbGVjdG9yPG4sIGxvd2VyLCB1cHBlcj46OnZhbHVlPgorc3RydWN0IGZsb29yX2xvZzIge307CisKK3RlbXBsYXRlPHVuc2lnbmVkIGludCBuLCBpbnQgbG93ZXIsIGludCB1cHBlcj4KK3N0cnVjdCBmbG9vcl9sb2cyPG4sIGxvd2VyLCB1cHBlciwgZmxvb3JfbG9nMl9tb3ZlX2Rvd24+Cit7CisgIGVudW0geyB2YWx1ZSA9IGZsb29yX2xvZzI8biwgbG93ZXIsIGZsb29yX2xvZzJfc2VsZWN0b3I8biwgbG93ZXIsIHVwcGVyPjo6bWlkZGxlPjo6dmFsdWUgfTsKK307CisKK3RlbXBsYXRlPHVuc2lnbmVkIGludCBuLCBpbnQgbG93ZXIsIGludCB1cHBlcj4KK3N0cnVjdCBmbG9vcl9sb2cyPG4sIGxvd2VyLCB1cHBlciwgZmxvb3JfbG9nMl9tb3ZlX3VwPgoreworICBlbnVtIHsgdmFsdWUgPSBmbG9vcl9sb2cyPG4sIGZsb29yX2xvZzJfc2VsZWN0b3I8biwgbG93ZXIsIHVwcGVyPjo6bWlkZGxlLCB1cHBlcj46OnZhbHVlIH07Cit9OworCit0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgbiwgaW50IGxvd2VyLCBpbnQgdXBwZXI+CitzdHJ1Y3QgZmxvb3JfbG9nMjxuLCBsb3dlciwgdXBwZXIsIGZsb29yX2xvZzJfdGVybWluYXRlPgoreworICBlbnVtIHsgdmFsdWUgPSAobiA+PSAoKHVuc2lnbmVkIGludCkoMSkgPDwgKGxvd2VyKzEpKSkgPyBsb3dlcisxIDogbG93ZXIgfTsKK307CisKK3RlbXBsYXRlPHVuc2lnbmVkIGludCBuLCBpbnQgbG93ZXIsIGludCB1cHBlcj4KK3N0cnVjdCBmbG9vcl9sb2cyPG4sIGxvd2VyLCB1cHBlciwgZmxvb3JfbG9nMl9ib2d1cz4KK3sKKyAgLy8gbm8gdmFsdWUsIGVycm9yIGF0IGNvbXBpbGUgdGltZQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJhbmRvbV9kZWZhdWx0X2ltcGw8U2NhbGFyLCBmYWxzZSwgdHJ1ZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6Tm9uSW50ZWdlciBOb25JbnRlZ2VyOworCisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bihjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSkKKyAgeworICAgIHJldHVybiB4ICsgU2NhbGFyKChOb25JbnRlZ2VyKHkpLXgrMSkgKiBzdGQ6OnJhbmQoKSAvIChSQU5EX01BWCArIE5vbkludGVnZXIoMSkpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bigpCisgIHsKKyNpZmRlZiBFSUdFTl9NQUtJTkdfRE9DUworICAgIHJldHVybiBydW4oU2NhbGFyKE51bVRyYWl0czxTY2FsYXI+OjpJc1NpZ25lZCA/IC0xMCA6IDApLCBTY2FsYXIoMTApKTsKKyNlbHNlCisgICAgZW51bSB7IHJhbmRfYml0cyA9IGZsb29yX2xvZzI8KHVuc2lnbmVkIGludCkoUkFORF9NQVgpKzE+Ojp2YWx1ZSwKKyAgICAgICAgICAgc2NhbGFyX2JpdHMgPSBzaXplb2YoU2NhbGFyKSAqIENIQVJfQklULAorICAgICAgICAgICBzaGlmdCA9IEVJR0VOX1BMQUlOX0VOVU1fTUFYKDAsIGludChyYW5kX2JpdHMpIC0gaW50KHNjYWxhcl9iaXRzKSkKKyAgICB9OworICAgIFNjYWxhciB4ID0gU2NhbGFyKHN0ZDo6cmFuZCgpID4+IHNoaWZ0KTsKKyAgICBTY2FsYXIgb2Zmc2V0ID0gTnVtVHJhaXRzPFNjYWxhcj46OklzU2lnbmVkID8gU2NhbGFyKDEgPDwgKHJhbmRfYml0cy0xKSkgOiBTY2FsYXIoMCk7CisgICAgcmV0dXJuIHggLSBvZmZzZXQ7CisjZW5kaWYKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHJhbmRvbV9kZWZhdWx0X2ltcGw8U2NhbGFyLCB0cnVlLCBmYWxzZT4KK3sKKyAgc3RhdGljIGlubGluZSBTY2FsYXIgcnVuKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KQorICB7CisgICAgcmV0dXJuIFNjYWxhcihyYW5kb20ocmVhbCh4KSwgcmVhbCh5KSksCisgICAgICAgICAgICAgICAgICByYW5kb20oaW1hZyh4KSwgaW1hZyh5KSkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIHJ1bigpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgcmV0dXJuIFNjYWxhcihyYW5kb208UmVhbFNjYWxhcj4oKSwgcmFuZG9tPFJlYWxTY2FsYXI+KCkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKHJhbmRvbSwgU2NhbGFyKSByYW5kb20oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpCit7CisgIHJldHVybiBFSUdFTl9NQVRIRlVOQ19JTVBMKHJhbmRvbSwgU2NhbGFyKTo6cnVuKHgsIHkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgRUlHRU5fTUFUSEZVTkNfUkVUVkFMKHJhbmRvbSwgU2NhbGFyKSByYW5kb20oKQoreworICByZXR1cm4gRUlHRU5fTUFUSEZVTkNfSU1QTChyYW5kb20sIFNjYWxhcik6OnJ1bigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBmdXp6eSBjb21wYXJpc29ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwKKyAgICAgICAgIGJvb2wgSXNDb21wbGV4LAorICAgICAgICAgYm9vbCBJc0ludGVnZXI+CitzdHJ1Y3Qgc2NhbGFyX2Z1enp5X2RlZmF1bHRfaW1wbCB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9mdXp6eV9kZWZhdWx0X2ltcGw8U2NhbGFyLCBmYWxzZSwgZmFsc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXI+CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc011Y2hTbWFsbGVyVGhhbihjb25zdCBTY2FsYXImIHgsIGNvbnN0IE90aGVyU2NhbGFyJiB5LCBjb25zdCBSZWFsU2NhbGFyJiBwcmVjKQorICB7CisgICAgcmV0dXJuIGFicyh4KSA8PSBhYnMoeSkgKiBwcmVjOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0FwcHJveChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgUmVhbFNjYWxhciYgcHJlYykKKyAgeworICAgIHVzaW5nIHN0ZDo6bWluOworICAgIHJldHVybiBhYnMoeCAtIHkpIDw9IChtaW4pKGFicyh4KSwgYWJzKHkpKSAqIHByZWM7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGlzQXBwcm94T3JMZXNzVGhhbihjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgUmVhbFNjYWxhciYgcHJlYykKKyAgeworICAgIHJldHVybiB4IDw9IHkgfHwgaXNBcHByb3goeCwgeSwgcHJlYyk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfZnV6enlfZGVmYXVsdF9pbXBsPFNjYWxhciwgZmFsc2UsIHRydWU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXI+CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc011Y2hTbWFsbGVyVGhhbihjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYsIGNvbnN0IFJlYWxTY2FsYXImKQorICB7CisgICAgcmV0dXJuIHggPT0gU2NhbGFyKDApOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0FwcHJveChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgUmVhbFNjYWxhciYpCisgIHsKKyAgICByZXR1cm4geCA9PSB5OworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFJlYWxTY2FsYXImKQorICB7CisgICAgcmV0dXJuIHggPD0geTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IHNjYWxhcl9mdXp6eV9kZWZhdWx0X2ltcGw8U2NhbGFyLCB0cnVlLCBmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhcj4KKyAgc3RhdGljIGlubGluZSBib29sIGlzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgT3RoZXJTY2FsYXImIHksIGNvbnN0IFJlYWxTY2FsYXImIHByZWMpCisgIHsKKyAgICByZXR1cm4gYWJzMih4KSA8PSBhYnMyKHkpICogcHJlYyAqIHByZWM7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGlzQXBwcm94KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBSZWFsU2NhbGFyJiBwcmVjKQorICB7CisgICAgdXNpbmcgc3RkOjptaW47CisgICAgcmV0dXJuIGFiczIoeCAtIHkpIDw9IChtaW4pKGFiczIoeCksIGFiczIoeSkpICogcHJlYyAqIHByZWM7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzY2FsYXJfZnV6enlfaW1wbCA6IHNjYWxhcl9mdXp6eV9kZWZhdWx0X2ltcGw8U2NhbGFyLCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBPdGhlclNjYWxhcj4KK2lubGluZSBib29sIGlzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgT3RoZXJTY2FsYXImIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHByZWNpc2lvbiA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkKK3sKKyAgcmV0dXJuIHNjYWxhcl9mdXp6eV9pbXBsPFNjYWxhcj46OnRlbXBsYXRlIGlzTXVjaFNtYWxsZXJUaGFuPE90aGVyU2NhbGFyPih4LCB5LCBwcmVjaXNpb24pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgYm9vbCBpc0FwcHJveChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcHJlY2lzaW9uID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKQoreworICByZXR1cm4gc2NhbGFyX2Z1enp5X2ltcGw8U2NhbGFyPjo6aXNBcHByb3goeCwgeSwgcHJlY2lzaW9uKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIGJvb2wgaXNBcHByb3hPckxlc3NUaGFuKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcHJlY2lzaW9uID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKQoreworICByZXR1cm4gc2NhbGFyX2Z1enp5X2ltcGw8U2NhbGFyPjo6aXNBcHByb3hPckxlc3NUaGFuKHgsIHksIHByZWNpc2lvbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiAgVGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgIGJvb2wgdHlwZSAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8PiBzdHJ1Y3QgcmFuZG9tX2ltcGw8Ym9vbD4KK3sKKyAgc3RhdGljIGlubGluZSBib29sIHJ1bigpCisgIHsKKyAgICByZXR1cm4gcmFuZG9tPGludD4oMCwxKT09MCA/IGZhbHNlIDogdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2NhbGFyX2Z1enp5X2ltcGw8Ym9vbD4KK3sKKyAgdHlwZWRlZiBib29sIFJlYWxTY2FsYXI7CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhcj4KKyAgc3RhdGljIGlubGluZSBib29sIGlzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IGJvb2wmIHgsIGNvbnN0IGJvb2wmLCBjb25zdCBib29sJikKKyAgeworICAgIHJldHVybiAheDsKKyAgfQorICAKKyAgc3RhdGljIGlubGluZSBib29sIGlzQXBwcm94KGJvb2wgeCwgYm9vbCB5LCBib29sKQorICB7CisgICAgcmV0dXJuIHggPT0geTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgYm9vbCYgeCwgY29uc3QgYm9vbCYgeSwgY29uc3QgYm9vbCYpCisgIHsKKyAgICByZXR1cm4gKCF4KSB8fCB5OworICB9CisgIAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU3BlY2lhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gc3RkOjppc2Zpbml0ZSBpcyBub24gc3RhbmRhcmQsIHNvIGxldCdzIGRlZmluZSBvdXIgb3duIHZlcnNpb24sCisvLyBldmVuIHRob3VnaCBpdCBpcyBub3QgdmVyeSBlZmZpY2llbnQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIChpc2Zpbml0ZSkoY29uc3QgVCYgeCkKK3sKKyAgcmV0dXJuIHg8TnVtVHJhaXRzPFQ+OjpoaWdoZXN0KCkgJiYgeD5OdW1UcmFpdHM8VD46Omxvd2VzdCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVRIRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL01hdHJpeC5oIGIvRWlnZW4vc3JjL0NvcmUvTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxNjBiNQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL01hdHJpeC5oCkBAIC0wLDAgKzEsNDA1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BVFJJWF9ICisjZGVmaW5lIEVJR0VOX01BVFJJWF9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgTWF0cml4CisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBUaGUgbWF0cml4IGNsYXNzLCBhbHNvIHVzZWQgZm9yIHZlY3RvcnMgYW5kIHJvdy12ZWN0b3JzCisgICoKKyAgKiBUaGUgJU1hdHJpeCBjbGFzcyBpcyB0aGUgd29yay1ob3JzZSBmb3IgYWxsIFxlbSBkZW5zZSAoXHJlZiBkZW5zZSAibm90ZSIpIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIHdpdGhpbiBFaWdlbi4KKyAgKiBWZWN0b3JzIGFyZSBtYXRyaWNlcyB3aXRoIG9uZSBjb2x1bW4sIGFuZCByb3ctdmVjdG9ycyBhcmUgbWF0cmljZXMgd2l0aCBvbmUgcm93LgorICAqCisgICogVGhlICVNYXRyaXggY2xhc3MgZW5jb21wYXNzZXMgXGVtIGJvdGggZml4ZWQtc2l6ZSBhbmQgZHluYW1pYy1zaXplIG9iamVjdHMgKFxyZWYgZml4ZWRzaXplICJub3RlIikuCisgICoKKyAgKiBUaGUgZmlyc3QgdGhyZWUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQ6CisgICogXHRwYXJhbSBfU2NhbGFyIFxhbmNob3IgbWF0cml4X3RwYXJhbV9zY2FsYXIgTnVtZXJpYyB0eXBlLCBlLmcuIGZsb2F0LCBkb3VibGUsIGludCBvciBzdGQ6OmNvbXBsZXg8ZmxvYXQ+LgorICAqICAgICAgICAgICAgICAgICBVc2VyIGRlZmluZWQgc2NsYXIgdHlwZXMgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsIChzZWUgXHJlZiB1c2VyX2RlZmluZWRfc2NhbGFycyAiaGVyZSIpLgorICAqIFx0cGFyYW0gX1Jvd3MgTnVtYmVyIG9mIHJvd3MsIG9yIFxiIER5bmFtaWMKKyAgKiBcdHBhcmFtIF9Db2xzIE51bWJlciBvZiBjb2x1bW5zLCBvciBcYiBEeW5hbWljCisgICoKKyAgKiBUaGUgcmVtYWluaW5nIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsIC0tIGluIG1vc3QgY2FzZXMgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlbS4KKyAgKiBcdHBhcmFtIF9PcHRpb25zIFxhbmNob3IgbWF0cml4X3RwYXJhbV9vcHRpb25zIEEgY29tYmluYXRpb24gb2YgZWl0aGVyIFxiICNSb3dNYWpvciBvciBcYiAjQ29sTWFqb3IsIGFuZCBvZiBlaXRoZXIKKyAgKiAgICAgICAgICAgICAgICAgXGIgI0F1dG9BbGlnbiBvciBcYiAjRG9udEFsaWduLgorICAqICAgICAgICAgICAgICAgICBUaGUgZm9ybWVyIGNvbnRyb2xzIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzICJzdG9yYWdlIG9yZGVyIiwgYW5kIGRlZmF1bHRzIHRvIGNvbHVtbi1tYWpvci4gVGhlIGxhdHRlciBjb250cm9scyBhbGlnbm1lbnQsIHdoaWNoIGlzIHJlcXVpcmVkCisgICogICAgICAgICAgICAgICAgIGZvciB2ZWN0b3JpemF0aW9uLiBJdCBkZWZhdWx0cyB0byBhbGlnbmluZyBtYXRyaWNlcyBleGNlcHQgZm9yIGZpeGVkIHNpemVzIHRoYXQgYXJlbid0IGEgbXVsdGlwbGUgb2YgdGhlIHBhY2tldCBzaXplLgorICAqIFx0cGFyYW0gX01heFJvd3MgTWF4aW11bSBudW1iZXIgb2Ygcm93cy4gRGVmYXVsdHMgdG8gXGEgX1Jvd3MgKFxyZWYgbWF4cm93cyAibm90ZSIpLgorICAqIFx0cGFyYW0gX01heENvbHMgTWF4aW11bSBudW1iZXIgb2YgY29sdW1ucy4gRGVmYXVsdHMgdG8gXGEgX0NvbHMgKFxyZWYgbWF4cm93cyAibm90ZSIpLgorICAqCisgICogRWlnZW4gcHJvdmlkZXMgYSBudW1iZXIgb2YgdHlwZWRlZnMgY292ZXJpbmcgdGhlIHVzdWFsIGNhc2VzLiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorICAqCisgICogXGxpIFxjIE1hdHJpeDJkIGlzIGEgMngyIHNxdWFyZSBtYXRyaXggb2YgZG91YmxlcyAoXGMgTWF0cml4PGRvdWJsZSwgMiwgMj4pCisgICogXGxpIFxjIFZlY3RvcjRmIGlzIGEgdmVjdG9yIG9mIDQgZmxvYXRzIChcYyBNYXRyaXg8ZmxvYXQsIDQsIDE+KQorICAqIFxsaSBcYyBSb3dWZWN0b3IzaSBpcyBhIHJvdy12ZWN0b3Igb2YgMyBpbnRzIChcYyBNYXRyaXg8aW50LCAxLCAzPikKKyAgKgorICAqIFxsaSBcYyBNYXRyaXhYZiBpcyBhIGR5bmFtaWMtc2l6ZSBtYXRyaXggb2YgZmxvYXRzIChcYyBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWM+KQorICAqIFxsaSBcYyBWZWN0b3JYZiBpcyBhIGR5bmFtaWMtc2l6ZSB2ZWN0b3Igb2YgZmxvYXRzIChcYyBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIDE+KQorICAqCisgICogXGxpIFxjIE1hdHJpeDJYZiBpcyBhIHBhcnRpYWxseSBmaXhlZC1zaXplIChkeW5hbWljLXNpemUpIG1hdHJpeCBvZiBmbG9hdHMgKFxjIE1hdHJpeDxmbG9hdCwgMiwgRHluYW1pYz4pCisgICogXGxpIFxjIE1hdHJpeFgzZCBpcyBhIHBhcnRpYWxseSBkeW5hbWljLXNpemUgKGZpeGVkLXNpemUpIG1hdHJpeCBvZiBkb3VibGUgKFxjIE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIDM+KQorICAqCisgICogU2VlIFxsaW5rIG1hdHJpeHR5cGVkZWZzIHRoaXMgcGFnZSBcZW5kbGluayBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHByZWRlZmluZWQgXGVtICVNYXRyaXggYW5kIFxlbSBWZWN0b3IgdHlwZWRlZnMuCisgICoKKyAgKiBZb3UgY2FuIGFjY2VzcyBlbGVtZW50cyBvZiB2ZWN0b3JzIGFuZCBtYXRyaWNlcyB1c2luZyBub3JtYWwgc3Vic2NyaXB0aW5nOgorICAqCisgICogXGNvZGUKKyAgKiBFaWdlbjo6VmVjdG9yWGQgdigxMCk7CisgICogdlswXSA9IDAuMTsKKyAgKiB2WzFdID0gMC4yOworICAqIHYoMCkgPSAwLjM7CisgICogdigxKSA9IDAuNDsKKyAgKgorICAqIEVpZ2VuOjpNYXRyaXhYaSBtKDEwLCAxMCk7CisgICogbSgwLCAxKSA9IDE7CisgICogbSgwLCAyKSA9IDI7CisgICogbSgwLCAzKSA9IDM7CisgICogXGVuZGNvZGUKKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nRWlnZW4gYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fTUFUUklYX1BMVUdJTi4KKyAgKgorICAqIDxpPjxiPlNvbWUgbm90ZXM6PC9iPjwvaT4KKyAgKgorICAqIDxkbD4KKyAgKiA8ZHQ+PGI+XGFuY2hvciBkZW5zZSBEZW5zZSB2ZXJzdXMgc3BhcnNlOjwvYj48L2R0PgorICAqIDxkZD5UaGlzICVNYXRyaXggY2xhc3MgaGFuZGxlcyBkZW5zZSwgbm90IHNwYXJzZSBtYXRyaWNlcyBhbmQgdmVjdG9ycy4gRm9yIHNwYXJzZSBtYXRyaWNlcyBhbmQgdmVjdG9ycywgc2VlIHRoZSBTcGFyc2UgbW9kdWxlLgorICAqCisgICogRGVuc2UgbWF0cmljZXMgYW5kIHZlY3RvcnMgYXJlIHBsYWluIHVzdWFsIGFycmF5cyBvZiBjb2VmZmljaWVudHMuIEFsbCB0aGUgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQsIGluIGFuIG9yZGluYXJ5IGNvbnRpZ3VvdXMgYXJyYXkuCisgICogVGhpcyBpcyB1bmxpa2UgU3BhcnNlIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIHdoZXJlIHRoZSBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyBhIGxpc3Qgb2Ygbm9uemVybyBjb2VmZmljaWVudHMuPC9kZD4KKyAgKgorICAqIDxkdD48Yj5cYW5jaG9yIGZpeGVkc2l6ZSBGaXhlZC1zaXplIHZlcnN1cyBkeW5hbWljLXNpemU6PC9iPjwvZHQ+CisgICogPGRkPkZpeGVkLXNpemUgbWVhbnMgdGhhdCB0aGUgbnVtYmVycyBvZiByb3dzIGFuZCBjb2x1bW5zIGFyZSBrbm93biBhcmUgY29tcGlsZS10aW1lLiBJbiB0aGlzIGNhc2UsIEVpZ2VuIGFsbG9jYXRlcyB0aGUgYXJyYXkKKyAgKiBvZiBjb2VmZmljaWVudHMgYXMgYSBmaXhlZC1zaXplIGFycmF5LCBhcyBhIGNsYXNzIG1lbWJlci4gVGhpcyBtYWtlcyBzZW5zZSBmb3IgdmVyeSBzbWFsbCBtYXRyaWNlcywgdHlwaWNhbGx5IHVwIHRvIDR4NCwgc29tZXRpbWVzIHVwCisgICogdG8gMTZ4MTYuIExhcmdlciBtYXRyaWNlcyBzaG91bGQgYmUgZGVjbGFyZWQgYXMgZHluYW1pYy1zaXplIGV2ZW4gaWYgb25lIGhhcHBlbnMgdG8ga25vdyB0aGVpciBzaXplIGF0IGNvbXBpbGUtdGltZS4KKyAgKgorICAqIER5bmFtaWMtc2l6ZSBtZWFucyB0aGF0IHRoZSBudW1iZXJzIG9mIHJvd3Mgb3IgY29sdW1ucyBhcmUgbm90IG5lY2Vzc2FyaWx5IGtub3duIGF0IGNvbXBpbGUtdGltZS4gSW4gdGhpcyBjYXNlIHRoZXkgYXJlIHJ1bnRpbWUKKyAgKiB2YXJpYWJsZXMsIGFuZCB0aGUgYXJyYXkgb2YgY29lZmZpY2llbnRzIGlzIGFsbG9jYXRlZCBkeW5hbWljYWxseSBvbiB0aGUgaGVhcC4KKyAgKgorICAqIE5vdGUgdGhhdCBcZW0gZGVuc2UgbWF0cmljZXMsIGJlIHRoZXkgRml4ZWQtc2l6ZSBvciBEeW5hbWljLXNpemUsIDxlbT5kbyBub3Q8L2VtPiBleHBhbmQgZHluYW1pY2FsbHkgaW4gdGhlIHNlbnNlIG9mIGEgc3RkOjptYXAuCisgICogSWYgeW91IHdhbnQgdGhpcyBiZWhhdmlvciwgc2VlIHRoZSBTcGFyc2UgbW9kdWxlLjwvZGQ+CisgICoKKyAgKiA8ZHQ+PGI+XGFuY2hvciBtYXhyb3dzIF9NYXhSb3dzIGFuZCBfTWF4Q29sczo8L2I+PC9kdD4KKyAgKiA8ZGQ+SW4gbW9zdCBjYXNlcywgb25lIGp1c3QgbGVhdmVzIHRoZXNlIHBhcmFtZXRlcnMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLgorICAqIFRoZXNlIHBhcmFtZXRlcnMgbWVhbiB0aGUgbWF4aW11bSBzaXplIG9mIHJvd3MgYW5kIGNvbHVtbnMgdGhhdCB0aGUgbWF0cml4IG1heSBoYXZlLiBUaGV5IGFyZSB1c2VmdWwgaW4gY2FzZXMKKyAgKiB3aGVuIHRoZSBleGFjdCBudW1iZXJzIG9mIHJvd3MgYW5kIGNvbHVtbnMgYXJlIG5vdCBrbm93biBhcmUgY29tcGlsZS10aW1lLCBidXQgaXQgaXMga25vd24gYXQgY29tcGlsZS10aW1lIHRoYXQgdGhleSBjYW5ub3QKKyAgKiBleGNlZWQgYSBjZXJ0YWluIHZhbHVlLiBUaGlzIGhhcHBlbnMgd2hlbiB0YWtpbmcgZHluYW1pYy1zaXplIGJsb2NrcyBpbnNpZGUgZml4ZWQtc2l6ZSBtYXRyaWNlczogaW4gdGhpcyBjYXNlIF9NYXhSb3dzIGFuZCBfTWF4Q29scworICAqIGFyZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4LCB3aGlsZSBfUm93cyBhbmQgX0NvbHMgYXJlIER5bmFtaWMuPC9kZD4KKyAgKiA8L2RsPgorICAqCisgICogXHNlZSBNYXRyaXhCYXNlIGZvciB0aGUgbWFqb3JpdHkgb2YgdGhlIEFQSSBtZXRob2RzIGZvciBtYXRyaWNlcywgXHJlZiBUb3BpY0NsYXNzSGllcmFyY2h5LCAKKyAgKiBccmVmIFRvcGljU3RvcmFnZU9yZGVycyAKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX09wdGlvbnMsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgorc3RydWN0IHRyYWl0czxNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgRGVuc2UgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKyAgdHlwZWRlZiBNYXRyaXhYcHIgWHByS2luZDsKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBfUm93cywKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IF9Db2xzLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gX01heFJvd3MsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBfTWF4Q29scywKKyAgICBGbGFncyA9IGNvbXB1dGVfbWF0cml4X2ZsYWdzPF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz46OnJldCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OlJlYWRDb3N0LAorICAgIE9wdGlvbnMgPSBfT3B0aW9ucywKKyAgICBJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgPSAxLAorICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IChPcHRpb25zJlJvd01ham9yKSA/IENvbHNBdENvbXBpbGVUaW1lIDogUm93c0F0Q29tcGlsZVRpbWUKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX09wdGlvbnMsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgorY2xhc3MgTWF0cml4CisgIDogcHVibGljIFBsYWluT2JqZWN0QmFzZTxNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiA+Cit7CisgIHB1YmxpYzoKKworICAgIC8qKiBcYnJpZWYgQmFzZSBjbGFzcyB0eXBlZGVmLgorICAgICAgKiBcc2EgUGxhaW5PYmplY3RCYXNlCisgICAgICAqLworICAgIHR5cGVkZWYgUGxhaW5PYmplY3RCYXNlPE1hdHJpeD4gQmFzZTsKKworICAgIGVudW0geyBPcHRpb25zID0gX09wdGlvbnMgfTsKKworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoTWF0cml4KQorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKworICAgIHVzaW5nIEJhc2U6OmJhc2U7CisgICAgdXNpbmcgQmFzZTo6Y29lZmZSZWY7CisKKyAgICAvKioKKyAgICAgICogXGJyaWVmIEFzc2lnbnMgbWF0cmljZXMgdG8gZWFjaCBvdGhlci4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMKKyAgICAgICogdG8gcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKgorICAgICAgKiBcY2FsbGdyYXBoCisgICAgICAqLworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgTWF0cml4JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6X3NldChvdGhlcik7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBcYnJpZWYgQ29waWVzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBcYSBvdGhlciBpbnRvIFxjICp0aGlzIHdpdGggYXV0b21hdGljIHJlc2l6aW5nLgorICAgICAgKgorICAgICAgKiAqdGhpcyBtaWdodCBiZSByZXNpemVkIHRvIG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mIFxhIG90aGVyLiBJZiAqdGhpcyB3YXMgYSBudWxsIG1hdHJpeCAobm90IGFscmVhZHkgaW5pdGlhbGl6ZWQpLAorICAgICAgKiBpdCB3aWxsIGJlIGluaXRpYWxpemVkLgorICAgICAgKgorICAgICAgKiBOb3RlIHRoYXQgY29weWluZyBhIHJvdy12ZWN0b3IgaW50byBhIHZlY3RvciAoYW5kIGNvbnZlcnNlbHkpIGlzIGFsbG93ZWQuCisgICAgICAqIFRoZSByZXNpemluZywgaWYgYW55LCBpcyB0aGVuIGRvbmUgaW4gdGhlIGFwcHJvcHJpYXRlIHdheSBzbyB0aGF0IHJvdy12ZWN0b3JzCisgICAgICAqIHJlbWFpbiByb3ctdmVjdG9ycyBhbmQgdmVjdG9ycyByZW1haW4gdmVjdG9ycy4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6X3NldChvdGhlcik7CisgICAgfQorCisgICAgLyogSGVyZSwgZG94eWdlbiBmYWlsZWQgdG8gY29weSB0aGUgYnJpZWYgaW5mb3JtYXRpb24gd2hlbiB1c2luZyBcY29weWRvYyAqLworCisgICAgLyoqCisgICAgICAqIFxicmllZiBDb3BpZXMgdGhlIGdlbmVyaWMgZXhwcmVzc2lvbiBcYSBvdGhlciBpbnRvICp0aGlzLgorICAgICAgKiBcY29weWRldGFpbHMgRGVuc2VCYXNlOjpvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCisgICAgeworICAgICAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPShvdGhlcik7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgUmV0dXJuQnlWYWx1ZTxPdGhlckRlcml2ZWQ+JiBmdW5jKQorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjpvcGVyYXRvcj0oZnVuYyk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBGb3IgZml4ZWQtc2l6ZSBtYXRyaWNlcywgZG9lcyBub3RoaW5nLgorICAgICAgKgorICAgICAgKiBGb3IgZHluYW1pYy1zaXplIG1hdHJpY2VzLCBjcmVhdGVzIGFuIGVtcHR5IG1hdHJpeCBvZiBzaXplIDAuIERvZXMgbm90IGFsbG9jYXRlIGFueSBhcnJheS4gU3VjaCBhIG1hdHJpeAorICAgICAgKiBpcyBjYWxsZWQgYSBudWxsIG1hdHJpeC4gVGhpcyBjb25zdHJ1Y3RvciBpcyB0aGUgdW5pcXVlIHdheSB0byBjcmVhdGUgbnVsbCBtYXRyaWNlczogcmVzaXppbmcKKyAgICAgICogYSBtYXRyaXggdG8gMCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAgKgorICAgICAgKiBcc2EgcmVzaXplKEluZGV4LEluZGV4KQorICAgICAgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IE1hdHJpeCgpIDogQmFzZSgpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgRUlHRU5fSU5JVElBTElaRV9CWV9aRVJPX0lGX1RIQVRfT1BUSU9OX0lTX0VOQUJMRUQKKyAgICB9CisKKyAgICAvLyBGSVhNRSBpcyBpdCBzdGlsbCBuZWVkZWQKKyAgICBNYXRyaXgoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCkKKyAgICAgIDogQmFzZShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KCkpCisgICAgeyBCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7IEVJR0VOX0lOSVRJQUxJWkVfQllfWkVST19JRl9USEFUX09QVElPTl9JU19FTkFCTEVEIH0KKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhIHZlY3RvciBvciByb3ctdmVjdG9yIHdpdGggZ2l2ZW4gZGltZW5zaW9uLiBcb25seV9mb3JfdmVjdG9ycworICAgICAgKgorICAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgZHluYW1pYy1zaXplIHZlY3RvcnMuIEZvciBmaXhlZC1zaXplIHZlY3RvcnMsCisgICAgICAqIGl0IGlzIHJlZHVuZGFudCB0byBwYXNzIHRoZSBkaW1lbnNpb24gaGVyZSwgc28gaXQgbWFrZXMgbW9yZSBzZW5zZSB0byB1c2UgdGhlIGRlZmF1bHQKKyAgICAgICogY29uc3RydWN0b3IgTWF0cml4KCkgaW5zdGVhZC4KKyAgICAgICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBleHBsaWNpdCBNYXRyaXgoSW5kZXggZGltKQorICAgICAgOiBCYXNlKGRpbSwgUm93c0F0Q29tcGlsZVRpbWUgPT0gMSA/IDEgOiBkaW0sIENvbHNBdENvbXBpbGVUaW1lID09IDEgPyAxIDogZGltKQorICAgIHsKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoTWF0cml4KQorICAgICAgZWlnZW5fYXNzZXJ0KGRpbSA+PSAwKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljIHx8IFNpemVBdENvbXBpbGVUaW1lID09IGRpbSk7CisgICAgICBFSUdFTl9JTklUSUFMSVpFX0JZX1pFUk9fSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBNYXRyaXgoY29uc3QgVDAmIHgsIGNvbnN0IFQxJiB5KQorICAgIHsKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEJhc2U6OnRlbXBsYXRlIF9pbml0MjxUMCxUMT4oeCwgeSk7CisgICAgfQorICAgICNlbHNlCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RzIGFuIHVuaW5pdGlhbGl6ZWQgbWF0cml4IHdpdGggXGEgcm93cyByb3dzIGFuZCBcYSBjb2xzIGNvbHVtbnMuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBkeW5hbWljLXNpemUgbWF0cmljZXMuIEZvciBmaXhlZC1zaXplIG1hdHJpY2VzLAorICAgICAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyB0aGVzZSBwYXJhbWV0ZXJzLCBzbyBvbmUgc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgKiBNYXRyaXgoKSBpbnN0ZWFkLiAqLworICAgIE1hdHJpeChJbmRleCByb3dzLCBJbmRleCBjb2xzKTsKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdHMgYW4gaW5pdGlhbGl6ZWQgMkQgdmVjdG9yIHdpdGggZ2l2ZW4gY29lZmZpY2llbnRzICovCisgICAgTWF0cml4KGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KTsKKyAgICAjZW5kaWYKKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyBhbiBpbml0aWFsaXplZCAzRCB2ZWN0b3Igd2l0aCBnaXZlbiBjb2VmZmljaWVudHMgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIE1hdHJpeChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSwgY29uc3QgU2NhbGFyJiB6KQorICAgIHsKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoTWF0cml4LCAzKQorICAgICAgbV9zdG9yYWdlLmRhdGEoKVswXSA9IHg7CisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzFdID0geTsKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMl0gPSB6OworICAgIH0KKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdHMgYW4gaW5pdGlhbGl6ZWQgNEQgdmVjdG9yIHdpdGggZ2l2ZW4gY29lZmZpY2llbnRzICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBNYXRyaXgoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFNjYWxhciYgeiwgY29uc3QgU2NhbGFyJiB3KQorICAgIHsKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoTWF0cml4LCA0KQorICAgICAgbV9zdG9yYWdlLmRhdGEoKVswXSA9IHg7CisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzFdID0geTsKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMl0gPSB6OworICAgICAgbV9zdG9yYWdlLmRhdGEoKVszXSA9IHc7CisgICAgfQorCisgICAgZXhwbGljaXQgTWF0cml4KGNvbnN0IFNjYWxhciAqZGF0YSk7CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yIGNvcHlpbmcgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIFxhIG90aGVyICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWF0cml4KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICAgICAgICAgOiBCYXNlKG90aGVyLnJvd3MoKSAqIG90aGVyLmNvbHMoKSwgb3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpCisgICAgeworICAgICAgLy8gVGhpcyB0ZXN0IHJlc2lkZXMgaGVyZSwgdG8gYnJpbmcgdGhlIGVycm9yIG1lc3NhZ2VzIGNsb3NlciB0byB0aGUgdXNlci4gTm9ybWFsbHksIHRoZXNlIGNoZWNrcworICAgICAgLy8gYXJlIHBlcmZvcm1lZCBkZWVwbHkgd2l0aGluIHRoZSBsaWJyYXJ5LCB0aHVzIGNhdXNpbmcgbG9uZyBhbmQgc2NhcnkgZXJyb3IgdHJhY2VzLgorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICAgICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFkpCisKKyAgICAgIEJhc2U6Ol9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAgIEJhc2U6Ol9zZXRfbm9hbGlhcyhvdGhlcik7CisgICAgfQorICAgIC8qKiBcYnJpZWYgQ29weSBjb25zdHJ1Y3RvciAqLworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWF0cml4KGNvbnN0IE1hdHJpeCYgb3RoZXIpCisgICAgICAgICAgICA6IEJhc2Uob3RoZXIucm93cygpICogb3RoZXIuY29scygpLCBvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSkKKyAgICB7CisgICAgICBCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgICBCYXNlOjpfc2V0X25vYWxpYXMob3RoZXIpOworICAgIH0KKyAgICAvKiogXGJyaWVmIENvcHkgY29uc3RydWN0b3Igd2l0aCBpbi1wbGFjZSBldmFsdWF0aW9uICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWF0cml4KGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgQmFzZTo6X2NoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgICAgQmFzZTo6cmVzaXplKG90aGVyLnJvd3MoKSwgb3RoZXIuY29scygpKTsKKyAgICAgIG90aGVyLmV2YWxUbygqdGhpcyk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb3B5IGNvbnN0cnVjdG9yIGZvciBnZW5lcmljIGV4cHJlc3Npb25zLgorICAgICAgKiBcc2EgTWF0cml4QmFzZTo6b3BlcmF0b3I9KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JikKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWF0cml4KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKKyAgICAgIDogQmFzZShvdGhlci5kZXJpdmVkKCkucm93cygpICogb3RoZXIuZGVyaXZlZCgpLmNvbHMoKSwgb3RoZXIuZGVyaXZlZCgpLnJvd3MoKSwgb3RoZXIuZGVyaXZlZCgpLmNvbHMoKSkKKyAgICB7CisgICAgICBCYXNlOjpfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgICBCYXNlOjpyZXNpemUob3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpOworICAgICAgLy8gRklYTUUvQ0hFQ0s6IGlzbid0ICp0aGlzID0gb3RoZXIuZGVyaXZlZCgpIG1vcmUgZWZmaWNpZW50LiBpdCBhbGxvd3MgdG8KKyAgICAgIC8vICAgICAgICAgICAgICBnbyBmb3IgcHVyZSBfc2V0KCkgaW1wbGVtZW50YXRpb25zLCByaWdodD8KKyAgICAgICp0aGlzID0gb3RoZXI7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBcYnJpZWYgT3ZlcnJpZGUgTWF0cml4QmFzZTo6c3dhcCgpIHNpbmNlIGZvciBkeW5hbWljLXNpemVkIG1hdHJpY2VzCisgICAgICAqIG9mIHNhbWUgdHlwZSBpdCBpcyBlbm91Z2ggdG8gc3dhcCB0aGUgZGF0YSBwb2ludGVycy4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIHZvaWQgc3dhcChNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gY29uc3QgJiBvdGhlcikKKyAgICB7IHRoaXMtPl9zd2FwKG90aGVyLmRlcml2ZWQoKSk7IH0KKworICAgIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIDE7IH0KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5pbm5lclNpemUoKTsgfQorCisgICAgLy8vLy8vLy8vLy8gR2VvbWV0cnkgbW9kdWxlIC8vLy8vLy8vLy8vCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgZXhwbGljaXQgTWF0cml4KGNvbnN0IFJvdGF0aW9uQmFzZTxPdGhlckRlcml2ZWQsQ29sc0F0Q29tcGlsZVRpbWU+JiByKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxDb2xzQXRDb21waWxlVGltZT4mIHIpOworCisgICAgI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGV4cGxpY2l0IE1hdHJpeChjb25zdCBlaWdlbjJfUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxDb2xzQXRDb21waWxlVGltZT4mIHIpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBlaWdlbjJfUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxDb2xzQXRDb21waWxlVGltZT4mIHIpOworICAgICNlbmRpZgorCisgICAgLy8gYWxsb3cgdG8gZXh0ZW5kIE1hdHJpeCBvdXRzaWRlIEVpZ2VuCisgICAgI2lmZGVmIEVJR0VOX01BVFJJWF9QTFVHSU4KKyAgICAjaW5jbHVkZSBFSUdFTl9NQVRSSVhfUExVR0lOCisgICAgI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQsIGJvb2wgSXNWZWN0b3I+CisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3Jlc2l6ZV9saWtlX2ltcGw7CisKKyAgICB1c2luZyBCYXNlOjptX3N0b3JhZ2U7Cit9OworCisvKiogXGRlZmdyb3VwIG1hdHJpeHR5cGVkZWZzIEdsb2JhbCBtYXRyaXggdHlwZWRlZnMKKyAgKgorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBFaWdlbiBkZWZpbmVzIHNldmVyYWwgdHlwZWRlZiBzaG9ydGN1dHMgZm9yIG1vc3QgY29tbW9uIG1hdHJpeCBhbmQgdmVjdG9yIHR5cGVzLgorICAqCisgICogVGhlIGdlbmVyYWwgcGF0dGVybnMgYXJlIHRoZSBmb2xsb3dpbmc6CisgICoKKyAgKiBcYyBNYXRyaXhTaXplVHlwZSB3aGVyZSBcYyBTaXplIGNhbiBiZSBcYyAyLFxjIDMsXGMgNCBmb3IgZml4ZWQgc2l6ZSBzcXVhcmUgbWF0cmljZXMgb3IgXGMgWCBmb3IgZHluYW1pYyBzaXplLAorICAqIGFuZCB3aGVyZSBcYyBUeXBlIGNhbiBiZSBcYyBpIGZvciBpbnRlZ2VyLCBcYyBmIGZvciBmbG9hdCwgXGMgZCBmb3IgZG91YmxlLCBcYyBjZiBmb3IgY29tcGxleCBmbG9hdCwgXGMgY2QKKyAgKiBmb3IgY29tcGxleCBkb3VibGUuCisgICoKKyAgKiBGb3IgZXhhbXBsZSwgXGMgTWF0cml4M2QgaXMgYSBmaXhlZC1zaXplIDN4MyBtYXRyaXggdHlwZSBvZiBkb3VibGVzLCBhbmQgXGMgTWF0cml4WGYgaXMgYSBkeW5hbWljLXNpemUgbWF0cml4IG9mIGZsb2F0cy4KKyAgKgorICAqIFRoZXJlIGFyZSBhbHNvIFxjIFZlY3RvclNpemVUeXBlIGFuZCBcYyBSb3dWZWN0b3JTaXplVHlwZSB3aGljaCBhcmUgc2VsZi1leHBsYW5hdG9yeS4gRm9yIGV4YW1wbGUsIFxjIFZlY3RvcjRjZiBpcworICAqIGEgZml4ZWQtc2l6ZSB2ZWN0b3Igb2YgNCBjb21wbGV4IGZsb2F0cy4KKyAgKgorICAqIFxzYSBjbGFzcyBNYXRyaXgKKyAgKi8KKworI2RlZmluZSBFSUdFTl9NQUtFX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIFNpemUsIFNpemVTdWZmaXgpICAgXAorLyoqIFxpbmdyb3VwIG1hdHJpeHR5cGVkZWZzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordHlwZWRlZiBNYXRyaXg8VHlwZSwgU2l6ZSwgU2l6ZT4gTWF0cml4IyNTaXplU3VmZml4IyNUeXBlU3VmZml4OyAgXAorLyoqIFxpbmdyb3VwIG1hdHJpeHR5cGVkZWZzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordHlwZWRlZiBNYXRyaXg8VHlwZSwgU2l6ZSwgMT4gICAgVmVjdG9yIyNTaXplU3VmZml4IyNUeXBlU3VmZml4OyAgXAorLyoqIFxpbmdyb3VwIG1hdHJpeHR5cGVkZWZzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordHlwZWRlZiBNYXRyaXg8VHlwZSwgMSwgU2l6ZT4gICAgUm93VmVjdG9yIyNTaXplU3VmZml4IyNUeXBlU3VmZml4OworCisjZGVmaW5lIEVJR0VOX01BS0VfRklYRURfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgU2l6ZSkgICAgICAgICBcCisvKiogXGluZ3JvdXAgbWF0cml4dHlwZWRlZnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlZGVmIE1hdHJpeDxUeXBlLCBTaXplLCBEeW5hbWljPiBNYXRyaXgjI1NpemUjI1gjI1R5cGVTdWZmaXg7ICBcCisvKiogXGluZ3JvdXAgbWF0cml4dHlwZWRlZnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlZGVmIE1hdHJpeDxUeXBlLCBEeW5hbWljLCBTaXplPiBNYXRyaXgjI1gjI1NpemUjI1R5cGVTdWZmaXg7CisKKyNkZWZpbmUgRUlHRU5fTUFLRV9UWVBFREVGU19BTExfU0laRVMoVHlwZSwgVHlwZVN1ZmZpeCkgXAorRUlHRU5fTUFLRV9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCAyLCAyKSBcCitFSUdFTl9NQUtFX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDMsIDMpIFwKK0VJR0VOX01BS0VfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgNCwgNCkgXAorRUlHRU5fTUFLRV9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCBEeW5hbWljLCBYKSBcCitFSUdFTl9NQUtFX0ZJWEVEX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDIpIFwKK0VJR0VOX01BS0VfRklYRURfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgMykgXAorRUlHRU5fTUFLRV9GSVhFRF9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCA0KQorCitFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUyhpbnQsICAgICAgICAgICAgICAgICAgaSkKK0VJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTKGZsb2F0LCAgICAgICAgICAgICAgICBmKQorRUlHRU5fTUFLRV9UWVBFREVGU19BTExfU0laRVMoZG91YmxlLCAgICAgICAgICAgICAgIGQpCitFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUyhzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAgY2YpCitFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUyhzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgY2QpCisKKyN1bmRlZiBFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUworI3VuZGVmIEVJR0VOX01BS0VfVFlQRURFRlMKKyN1bmRlZiBFSUdFTl9NQUtFX0ZJWEVEX1RZUEVERUZTCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL01hdHJpeEJhc2UuaCBiL0VpZ2VuL3NyYy9Db3JlL01hdHJpeEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWUwZWQxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvTWF0cml4QmFzZS5oCkBAIC0wLDAgKzEsNTExIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NQVRSSVhCQVNFX0gKKyNkZWZpbmUgRUlHRU5fTUFUUklYQkFTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgTWF0cml4QmFzZQorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgYWxsIGRlbnNlIG1hdHJpY2VzLCB2ZWN0b3JzLCBhbmQgZXhwcmVzc2lvbnMKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgdGhhdCBpcyBpbmhlcml0ZWQgYnkgYWxsIG1hdHJpeCwgdmVjdG9yLCBhbmQgcmVsYXRlZCBleHByZXNzaW9uCisgICogdHlwZXMuIE1vc3Qgb2YgdGhlIEVpZ2VuIEFQSSBpcyBjb250YWluZWQgaW4gdGhpcyBjbGFzcywgYW5kIGl0cyBiYXNlIGNsYXNzZXMuIE90aGVyIGltcG9ydGFudAorICAqIGNsYXNzZXMgZm9yIHRoZSBFaWdlbiBBUEkgYXJlIE1hdHJpeCwgYW5kIFZlY3Rvcndpc2VPcC4KKyAgKgorICAqIE5vdGUgdGhhdCBzb21lIG1ldGhvZHMgYXJlIGRlZmluZWQgaW4gb3RoZXIgbW9kdWxlcyBzdWNoIGFzIHRoZSBccmVmIExVX01vZHVsZSBMVSBtb2R1bGUKKyAgKiBmb3IgYWxsIGZ1bmN0aW9ucyByZWxhdGVkIHRvIG1hdHJpeCBpbnZlcnNpb25zLgorICAqCisgICogXHRwYXJhbSBEZXJpdmVkIGlzIHRoZSBkZXJpdmVkIHR5cGUsIGUuZy4gYSBtYXRyaXggdHlwZSwgb3IgYW4gZXhwcmVzc2lvbiwgZXRjLgorICAqCisgICogV2hlbiB3cml0aW5nIGEgZnVuY3Rpb24gdGFraW5nIEVpZ2VuIG9iamVjdHMgYXMgYXJndW1lbnQsIGlmIHlvdSB3YW50IHlvdXIgZnVuY3Rpb24KKyAgKiB0byB0YWtlIGFzIGFyZ3VtZW50IGFueSBtYXRyaXgsIHZlY3Rvciwgb3IgZXhwcmVzc2lvbiwganVzdCBsZXQgaXQgdGFrZSBhCisgICogTWF0cml4QmFzZSBhcmd1bWVudC4gQXMgYW4gZXhhbXBsZSwgaGVyZSBpcyBhIGZ1bmN0aW9uIHByaW50Rmlyc3RSb3cgd2hpY2gsIGdpdmVuCisgICogYSBtYXRyaXgsIHZlY3Rvciwgb3IgZXhwcmVzc2lvbiBcYSB4LCBwcmludHMgdGhlIGZpcnN0IHJvdyBvZiBcYSB4LgorICAqCisgICogXGNvZGUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIHZvaWQgcHJpbnRGaXJzdFJvdyhjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkPiYgeCkKKyAgICB7CisgICAgICBjb3V0IDw8IHgucm93KDApIDw8IGVuZGw7CisgICAgfQorICAqIFxlbmRjb2RlCisgICoKKyAgKiBUaGlzIGNsYXNzIGNhbiBiZSBleHRlbmRlZCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBwbHVnaW4gbWVjaGFuaXNtIGRlc2NyaWJlZCBvbiB0aGUgcGFnZQorICAqIFxyZWYgVG9waWNDdXN0b21pemluZ0VpZ2VuIGJ5IGRlZmluaW5nIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxjIEVJR0VOX01BVFJJWEJBU0VfUExVR0lOLgorICAqCisgICogXHNhIFxyZWYgVG9waWNDbGFzc0hpZXJhcmNoeQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgTWF0cml4QmFzZQorICA6IHB1YmxpYyBEZW5zZUJhc2U8RGVyaXZlZD4KK3sKKyAgcHVibGljOgorI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHR5cGVkZWYgTWF0cml4QmFzZSBTdG9yYWdlQmFzZVR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0U2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIHR5cGVkZWYgRGVuc2VCYXNlPERlcml2ZWQ+IEJhc2U7CisgICAgdXNpbmcgQmFzZTo6Um93c0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6Q29sc0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6TWF4Um93c0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6OkZsYWdzOworICAgIHVzaW5nIEJhc2U6OkNvZWZmUmVhZENvc3Q7CisKKyAgICB1c2luZyBCYXNlOjpkZXJpdmVkOworICAgIHVzaW5nIEJhc2U6OmNvbnN0X2Nhc3RfZGVyaXZlZDsKKyAgICB1c2luZyBCYXNlOjpyb3dzOworICAgIHVzaW5nIEJhc2U6OmNvbHM7CisgICAgdXNpbmcgQmFzZTo6c2l6ZTsKKyAgICB1c2luZyBCYXNlOjpjb2VmZjsKKyAgICB1c2luZyBCYXNlOjpjb2VmZlJlZjsKKyAgICB1c2luZyBCYXNlOjpsYXp5QXNzaWduOworICAgIHVzaW5nIEJhc2U6OmV2YWw7CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IrPTsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvci09OworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKj07CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IvPTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvbnN0VHJhbnNwb3NlUmV0dXJuVHlwZSBDb25zdFRyYW5zcG9zZVJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpSb3dYcHIgUm93WHByOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q29sWHByIENvbFhwcjsKKyNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogdHlwZSBvZiB0aGUgZXF1aXZhbGVudCBzcXVhcmUgbWF0cml4ICovCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEVJR0VOX1NJWkVfTUFYKFJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fU0laRV9NQVgoUm93c0F0Q29tcGlsZVRpbWUsQ29sc0F0Q29tcGlsZVRpbWUpPiBTcXVhcmVNYXRyaXhUeXBlOworI2VuZGlmIC8vIG5vdCBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBtYWluIGRpYWdvbmFsLCB3aGljaCBpcyBtaW4ocm93cygpLGNvbHMoKSkuCisgICAgICAqIFxzYSByb3dzKCksIGNvbHMoKSwgU2l6ZUF0Q29tcGlsZVRpbWUuICovCisgICAgaW5saW5lIEluZGV4IGRpYWdvbmFsU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIChzdGQ6Om1pbikocm93cygpLGNvbHMoKSk7IH0KKworICAgIC8qKiBcYnJpZWYgVGhlIHBsYWluIG1hdHJpeCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBleHByZXNzaW9uLgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSBleGFjdGx5IHRoZSByZXR1cm4gdHlwZSBvZiBldmFsKCkuIEluIHRoZSBjYXNlIG9mIHBsYWluIG1hdHJpY2VzLAorICAgICAgKiB0aGUgcmV0dXJuIHR5cGUgb2YgZXZhbCgpIGlzIGEgY29uc3QgcmVmZXJlbmNlIHRvIGEgbWF0cml4LCBub3QgYSBtYXRyaXghIEl0IGlzIGhvd2V2ZXIgZ3VhcmFudGVlZAorICAgICAgKiB0aGF0IHRoZSByZXR1cm4gdHlwZSBvZiBldmFsKCkgaXMgZWl0aGVyIFBsYWluT2JqZWN0IG9yIGNvbnN0IFBsYWluT2JqZWN0Ji4KKyAgICAgICovCisgICAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgIEF1dG9BbGlnbiB8IChpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpGbGFncyZSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3IpLAorICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgICAgICAgPiBQbGFpbk9iamVjdDsKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBcaW50ZXJuYWwgUmVwcmVzZW50cyBhIG1hdHJpeCB3aXRoIGFsbCBjb2VmZmljaWVudHMgZXF1YWwgdG8gb25lIGFub3RoZXIqLworICAgIHR5cGVkZWYgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxTY2FsYXI+LERlcml2ZWQ+IENvbnN0YW50UmV0dXJuVHlwZTsKKyAgICAvKiogXGludGVybmFsIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjphZGpvaW50KCkgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uanVnYXRlX29wPFNjYWxhcj4sIENvbnN0VHJhbnNwb3NlUmV0dXJuVHlwZT4sCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFRyYW5zcG9zZVJldHVyblR5cGUKKyAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgQWRqb2ludFJldHVyblR5cGU7CisgICAgLyoqIFxpbnRlcm5hbCBSZXR1cm4gdHlwZSBvZiBlaWdlbnZhbHVlcygpICovCisgICAgdHlwZWRlZiBNYXRyaXg8c3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZSwgMSwgQ29sTWFqb3I+IEVpZ2VudmFsdWVzUmV0dXJuVHlwZTsKKyAgICAvKiogXGludGVybmFsIHRoZSByZXR1cm4gdHlwZSBvZiBpZGVudGl0eSAqLworICAgIHR5cGVkZWYgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LERlcml2ZWQ+IElkZW50aXR5UmV0dXJuVHlwZTsKKyAgICAvKiogXGludGVybmFsIHRoZSByZXR1cm4gdHlwZSBvZiB1bml0IHZlY3RvcnMgKi8KKyAgICB0eXBlZGVmIEJsb2NrPGNvbnN0IEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8U2NhbGFyPiwgU3F1YXJlTWF0cml4VHlwZT4sCisgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lPiBCYXNpc1JldHVyblR5cGU7CisjZW5kaWYgLy8gbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyNkZWZpbmUgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1MgRWlnZW46Ok1hdHJpeEJhc2UKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL0NvbW1vbkN3aXNlVW5hcnlPcHMuaCIKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL0NvbW1vbkN3aXNlQmluYXJ5T3BzLmgiCisjICAgaW5jbHVkZSAiLi4vcGx1Z2lucy9NYXRyaXhDd2lzZVVuYXJ5T3BzLmgiCisjICAgaW5jbHVkZSAiLi4vcGx1Z2lucy9NYXRyaXhDd2lzZUJpbmFyeU9wcy5oIgorIyAgIGlmZGVmIEVJR0VOX01BVFJJWEJBU0VfUExVR0lOCisjICAgICBpbmNsdWRlIEVJR0VOX01BVFJJWEJBU0VfUExVR0lOCisjICAgZW5kaWYKKyN1bmRlZiBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUworCisgICAgLyoqIFNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGUgb3BlcmF0b3I9LCBpbiBvcmRlciB0byBwcmV2ZW50IHRoZSBjb21waWxlcgorICAgICAgKiBmcm9tIGdlbmVyYXRpbmcgYSBkZWZhdWx0IG9wZXJhdG9yPSAoaXNzdWUgaGl0IHdpdGggZysrIDQuMSkKKyAgICAgICovCisgICAgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2UmIG90aGVyKTsKKworICAgIC8vIFdlIGNhbm5vdCBpbmhlcml0IGhlcmUgdmlhIEJhc2U6Om9wZXJhdG9yPSBzaW5jZSBpdCBpcyBjYXVzaW5nCisgICAgLy8gdHJvdWJsZSB3aXRoIE1TVkMuCisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgUmV0dXJuQnlWYWx1ZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CisgICAgRGVyaXZlZCYgbGF6eUFzc2lnbihjb25zdCBQcm9kdWN0QmFzZTxQcm9kdWN0RGVyaXZlZCwgTGhzLFJocz4mIG90aGVyKTsKKyNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcis9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvci09KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGNvbnN0IHR5cGVuYW1lIFByb2R1Y3RSZXR1cm5UeXBlPERlcml2ZWQsT3RoZXJEZXJpdmVkPjo6VHlwZQorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCB0eXBlbmFtZSBMYXp5UHJvZHVjdFJldHVyblR5cGU8RGVyaXZlZCxPdGhlckRlcml2ZWQ+OjpUeXBlCisgICAgbGF6eVByb2R1Y3QoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3IqPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIHZvaWQgYXBwbHlPblRoZUxlZnQoY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIGFwcGx5T25UaGVSaWdodChjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGlhZ29uYWxEZXJpdmVkPgorICAgIGNvbnN0IERpYWdvbmFsUHJvZHVjdDxEZXJpdmVkLCBEaWFnb25hbERlcml2ZWQsIE9uVGhlUmlnaHQ+CisgICAgb3BlcmF0b3IqKGNvbnN0IERpYWdvbmFsQmFzZTxEaWFnb25hbERlcml2ZWQ+ICZkaWFnb25hbCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X3RyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxPdGhlckRlcml2ZWQ+OjpTY2FsYXI+OjpSZXR1cm5UeXBlCisgICAgZG90KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgICAgI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgICBTY2FsYXIgZWlnZW4yX2RvdChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKyAgICAjZW5kaWYKKworICAgIFJlYWxTY2FsYXIgc3F1YXJlZE5vcm0oKSBjb25zdDsKKyAgICBSZWFsU2NhbGFyIG5vcm0oKSBjb25zdDsKKyAgICBSZWFsU2NhbGFyIHN0YWJsZU5vcm0oKSBjb25zdDsKKyAgICBSZWFsU2NhbGFyIGJsdWVOb3JtKCkgY29uc3Q7CisgICAgUmVhbFNjYWxhciBoeXBvdE5vcm0oKSBjb25zdDsKKyAgICBjb25zdCBQbGFpbk9iamVjdCBub3JtYWxpemVkKCkgY29uc3Q7CisgICAgdm9pZCBub3JtYWxpemUoKTsKKworICAgIGNvbnN0IEFkam9pbnRSZXR1cm5UeXBlIGFkam9pbnQoKSBjb25zdDsKKyAgICB2b2lkIGFkam9pbnRJblBsYWNlKCk7CisKKyAgICB0eXBlZGVmIERpYWdvbmFsPERlcml2ZWQ+IERpYWdvbmFsUmV0dXJuVHlwZTsKKyAgICBEaWFnb25hbFJldHVyblR5cGUgZGlhZ29uYWwoKTsKKyAgICB0eXBlZGVmIGNvbnN0IERpYWdvbmFsPGNvbnN0IERlcml2ZWQ+IENvbnN0RGlhZ29uYWxSZXR1cm5UeXBlOworICAgIGNvbnN0IENvbnN0RGlhZ29uYWxSZXR1cm5UeXBlIGRpYWdvbmFsKCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTxpbnQgSW5kZXg+IHN0cnVjdCBEaWFnb25hbEluZGV4UmV0dXJuVHlwZSB7IHR5cGVkZWYgRGlhZ29uYWw8RGVyaXZlZCxJbmRleD4gVHlwZTsgfTsKKyAgICB0ZW1wbGF0ZTxpbnQgSW5kZXg+IHN0cnVjdCBDb25zdERpYWdvbmFsSW5kZXhSZXR1cm5UeXBlIHsgdHlwZWRlZiBjb25zdCBEaWFnb25hbDxjb25zdCBEZXJpdmVkLEluZGV4PiBUeXBlOyB9OworCisgICAgdGVtcGxhdGU8aW50IEluZGV4PiB0eXBlbmFtZSBEaWFnb25hbEluZGV4UmV0dXJuVHlwZTxJbmRleD46OlR5cGUgZGlhZ29uYWwoKTsKKyAgICB0ZW1wbGF0ZTxpbnQgSW5kZXg+IHR5cGVuYW1lIENvbnN0RGlhZ29uYWxJbmRleFJldHVyblR5cGU8SW5kZXg+OjpUeXBlIGRpYWdvbmFsKCkgY29uc3Q7CisKKyAgICAvLyBOb3RlOiBUaGUgIk1hdHJpeEJhc2U6OiIgcHJlZml4ZXMgYXJlIGFkZGVkIHRvIGhlbHAgTVNWQzkgdG8gbWF0Y2ggdGhlc2UgZGVjbGFyYXRpb25zIHdpdGggdGhlIGxhdGVyIGltcGxlbWVudGF0aW9ucy4KKyAgICAvLyBPbiB0aGUgb3RoZXIgaGFuZCB0aGV5IGNvbmZ1c2UgTVNWQzguLi4KKyAgICAjaWYgKGRlZmluZWQgX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxNTAwKSAvLyAyMDA4IG9yIGxhdGVyCisgICAgdHlwZW5hbWUgTWF0cml4QmFzZTo6dGVtcGxhdGUgRGlhZ29uYWxJbmRleFJldHVyblR5cGU8RHluYW1pYz46OlR5cGUgZGlhZ29uYWwoSW5kZXggaW5kZXgpOworICAgIHR5cGVuYW1lIE1hdHJpeEJhc2U6OnRlbXBsYXRlIENvbnN0RGlhZ29uYWxJbmRleFJldHVyblR5cGU8RHluYW1pYz46OlR5cGUgZGlhZ29uYWwoSW5kZXggaW5kZXgpIGNvbnN0OworICAgICNlbHNlCisgICAgdHlwZW5hbWUgRGlhZ29uYWxJbmRleFJldHVyblR5cGU8RHluYW1pYz46OlR5cGUgZGlhZ29uYWwoSW5kZXggaW5kZXgpOworICAgIHR5cGVuYW1lIENvbnN0RGlhZ29uYWxJbmRleFJldHVyblR5cGU8RHluYW1pYz46OlR5cGUgZGlhZ29uYWwoSW5kZXggaW5kZXgpIGNvbnN0OworICAgICNlbmRpZgorCisgICAgI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IE1vZGU+IHR5cGVuYW1lIGludGVybmFsOjplaWdlbjJfcGFydF9yZXR1cm5fdHlwZTxEZXJpdmVkLCBNb2RlPjo6dHlwZSBwYXJ0KCk7CisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IE1vZGU+IGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjplaWdlbjJfcGFydF9yZXR1cm5fdHlwZTxEZXJpdmVkLCBNb2RlPjo6dHlwZSBwYXJ0KCkgY29uc3Q7CisgICAgCisgICAgLy8gaHV1dWdlIGhhY2suIG1ha2UgRWlnZW4yJ3MgbWF0cml4LnBhcnQ8RGlhZ29uYWw+KCkgd29yayBpbiBlaWdlbjMuIFByb2JsZW06IERpYWdvbmFsIGlzIG5vdyBhIGNsYXNzIHRlbXBsYXRlIGluc3RlYWQKKyAgICAvLyBvZiBhbiBpbnRlZ2VyIGNvbnN0YW50LiBTb2x1dGlvbjogb3ZlcmxvYWQgdGhlIHBhcnQoKSBtZXRob2QgdGVtcGxhdGUgd3J0IHRlbXBsYXRlIHBhcmFtZXRlcnMgbGlzdC4KKyAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgbj4gY2xhc3MgVT4KKyAgICBjb25zdCBEaWFnb25hbFdyYXBwZXI8Q29uc3REaWFnb25hbFJldHVyblR5cGU+IHBhcnQoKSBjb25zdAorICAgIHsgcmV0dXJuIGRpYWdvbmFsKCkuYXNEaWFnb25hbCgpOyB9CisgICAgI2VuZGlmIC8vIEVJR0VOMl9TVVBQT1JUCisKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgTW9kZT4gc3RydWN0IFRyaWFuZ3VsYXJWaWV3UmV0dXJuVHlwZSB7IHR5cGVkZWYgVHJpYW5ndWxhclZpZXc8RGVyaXZlZCwgTW9kZT4gVHlwZTsgfTsKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgTW9kZT4gc3RydWN0IENvbnN0VHJpYW5ndWxhclZpZXdSZXR1cm5UeXBlIHsgdHlwZWRlZiBjb25zdCBUcmlhbmd1bGFyVmlldzxjb25zdCBEZXJpdmVkLCBNb2RlPiBUeXBlOyB9OworCisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IE1vZGU+IHR5cGVuYW1lIFRyaWFuZ3VsYXJWaWV3UmV0dXJuVHlwZTxNb2RlPjo6VHlwZSB0cmlhbmd1bGFyVmlldygpOworICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBNb2RlPiB0eXBlbmFtZSBDb25zdFRyaWFuZ3VsYXJWaWV3UmV0dXJuVHlwZTxNb2RlPjo6VHlwZSB0cmlhbmd1bGFyVmlldygpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+IHN0cnVjdCBTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlIHsgdHlwZWRlZiBTZWxmQWRqb2ludFZpZXc8RGVyaXZlZCwgVXBMbz4gVHlwZTsgfTsKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgVXBMbz4gc3RydWN0IENvbnN0U2VsZkFkam9pbnRWaWV3UmV0dXJuVHlwZSB7IHR5cGVkZWYgY29uc3QgU2VsZkFkam9pbnRWaWV3PGNvbnN0IERlcml2ZWQsIFVwTG8+IFR5cGU7IH07CisKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgVXBMbz4gdHlwZW5hbWUgU2VsZkFkam9pbnRWaWV3UmV0dXJuVHlwZTxVcExvPjo6VHlwZSBzZWxmYWRqb2ludFZpZXcoKTsKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgVXBMbz4gdHlwZW5hbWUgQ29uc3RTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlPFVwTG8+OjpUeXBlIHNlbGZhZGpvaW50VmlldygpIGNvbnN0OworCisgICAgY29uc3QgU3BhcnNlVmlldzxEZXJpdmVkPiBzcGFyc2VWaWV3KGNvbnN0IFNjYWxhciYgbV9yZWZlcmVuY2UgPSBTY2FsYXIoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIG1fZXBzaWxvbiA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgc3RhdGljIGNvbnN0IElkZW50aXR5UmV0dXJuVHlwZSBJZGVudGl0eSgpOworICAgIHN0YXRpYyBjb25zdCBJZGVudGl0eVJldHVyblR5cGUgSWRlbnRpdHkoSW5kZXggcm93cywgSW5kZXggY29scyk7CisgICAgc3RhdGljIGNvbnN0IEJhc2lzUmV0dXJuVHlwZSBVbml0KEluZGV4IHNpemUsIEluZGV4IGkpOworICAgIHN0YXRpYyBjb25zdCBCYXNpc1JldHVyblR5cGUgVW5pdChJbmRleCBpKTsKKyAgICBzdGF0aWMgY29uc3QgQmFzaXNSZXR1cm5UeXBlIFVuaXRYKCk7CisgICAgc3RhdGljIGNvbnN0IEJhc2lzUmV0dXJuVHlwZSBVbml0WSgpOworICAgIHN0YXRpYyBjb25zdCBCYXNpc1JldHVyblR5cGUgVW5pdFooKTsKKyAgICBzdGF0aWMgY29uc3QgQmFzaXNSZXR1cm5UeXBlIFVuaXRXKCk7CisKKyAgICBjb25zdCBEaWFnb25hbFdyYXBwZXI8Y29uc3QgRGVyaXZlZD4gYXNEaWFnb25hbCgpIGNvbnN0OworICAgIGNvbnN0IFBlcm11dGF0aW9uV3JhcHBlcjxjb25zdCBEZXJpdmVkPiBhc1Blcm11dGF0aW9uKCkgY29uc3Q7CisKKyAgICBEZXJpdmVkJiBzZXRJZGVudGl0eSgpOworICAgIERlcml2ZWQmIHNldElkZW50aXR5KEluZGV4IHJvd3MsIEluZGV4IGNvbHMpOworCisgICAgYm9vbCBpc0lkZW50aXR5KFJlYWxTY2FsYXIgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgYm9vbCBpc0RpYWdvbmFsKFJlYWxTY2FsYXIgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisKKyAgICBib29sIGlzVXBwZXJUcmlhbmd1bGFyKFJlYWxTY2FsYXIgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3Q7CisgICAgYm9vbCBpc0xvd2VyVHJpYW5ndWxhcihSZWFsU2NhbGFyIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGJvb2wgaXNPcnRob2dvbmFsKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdDsKKyAgICBib29sIGlzVW5pdGFyeShSZWFsU2NhbGFyIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0OworCisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgZWFjaCBjb2VmZmljaWVudHMgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyIGFyZSBhbGwgZXhhY3RseSBlcXVhbC4KKyAgICAgICogXHdhcm5pbmcgV2hlbiB1c2luZyBmbG9hdGluZyBwb2ludCBzY2FsYXIgdmFsdWVzIHlvdSBwcm9iYWJseSBzaG91bGQgcmF0aGVyIHVzZSBhCisgICAgICAqICAgICAgICAgIGZ1enp5IGNvbXBhcmlzb24gc3VjaCBhcyBpc0FwcHJveCgpCisgICAgICAqIFxzYSBpc0FwcHJveCgpLCBvcGVyYXRvciE9ICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBjd2lzZUVxdWFsKG90aGVyKS5hbGwoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIHBhaXIgb2YgY29lZmZpY2llbnRzIG9mIFxjICp0aGlzIGFuZCBcYSBvdGhlciBhcmUgbm90IGV4YWN0bHkgZXF1YWwgdG8gZWFjaCBvdGhlci4KKyAgICAgICogXHdhcm5pbmcgV2hlbiB1c2luZyBmbG9hdGluZyBwb2ludCBzY2FsYXIgdmFsdWVzIHlvdSBwcm9iYWJseSBzaG91bGQgcmF0aGVyIHVzZSBhCisgICAgICAqICAgICAgICAgIGZ1enp5IGNvbXBhcmlzb24gc3VjaCBhcyBpc0FwcHJveCgpCisgICAgICAqIFxzYSBpc0FwcHJveCgpLCBvcGVyYXRvcj09ICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBjd2lzZU5vdEVxdWFsKG90aGVyKS5hbnkoKTsgfQorCisgICAgTm9BbGlhczxEZXJpdmVkLEVpZ2VuOjpNYXRyaXhCYXNlID4gbm9hbGlhcygpOworCisgICAgaW5saW5lIGNvbnN0IEZvcmNlQWxpZ25lZEFjY2VzczxEZXJpdmVkPiBmb3JjZUFsaWduZWRBY2Nlc3MoKSBjb25zdDsKKyAgICBpbmxpbmUgRm9yY2VBbGlnbmVkQWNjZXNzPERlcml2ZWQ+IGZvcmNlQWxpZ25lZEFjY2VzcygpOworICAgIHRlbXBsYXRlPGJvb2wgRW5hYmxlPiBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxFbmFibGUsRm9yY2VBbGlnbmVkQWNjZXNzPERlcml2ZWQ+LERlcml2ZWQmPjo6dHlwZT46OnR5cGUgZm9yY2VBbGlnbmVkQWNjZXNzSWYoKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTxib29sIEVuYWJsZT4gaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxFbmFibGUsRm9yY2VBbGlnbmVkQWNjZXNzPERlcml2ZWQ+LERlcml2ZWQmPjo6dHlwZSBmb3JjZUFsaWduZWRBY2Nlc3NJZigpOworCisgICAgU2NhbGFyIHRyYWNlKCkgY29uc3Q7CisKKy8vLy8vLy8vLy8vIEFycmF5IG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgdGVtcGxhdGU8aW50IHA+IFJlYWxTY2FsYXIgbHBOb3JtKCkgY29uc3Q7CisKKyAgICBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtYXRyaXgoKSB7IHJldHVybiAqdGhpczsgfQorICAgIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAvKiogXHJldHVybnMgYW4gXGxpbmsgQXJyYXlCYXNlIEFycmF5IFxlbmRsaW5rIGV4cHJlc3Npb24gb2YgdGhpcyBtYXRyaXgKKyAgICAgICogXHNhIEFycmF5QmFzZTo6bWF0cml4KCkgKi8KKyAgICBBcnJheVdyYXBwZXI8RGVyaXZlZD4gYXJyYXkoKSB7IHJldHVybiBkZXJpdmVkKCk7IH0KKyAgICBjb25zdCBBcnJheVdyYXBwZXI8Y29uc3QgRGVyaXZlZD4gYXJyYXkoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCk7IH0KKworLy8vLy8vLy8vLy8gTFUgbW9kdWxlIC8vLy8vLy8vLy8vCisKKyAgICBjb25zdCBGdWxsUGl2TFU8UGxhaW5PYmplY3Q+IGZ1bGxQaXZMdSgpIGNvbnN0OworICAgIGNvbnN0IFBhcnRpYWxQaXZMVTxQbGFpbk9iamVjdD4gcGFydGlhbFBpdkx1KCkgY29uc3Q7CisKKyAgICAjaWYgRUlHRU4yX1NVUFBPUlRfU1RBR0UgPCBTVEFHRTIwX1JFU09MVkVfQVBJX0NPTkZMSUNUUworICAgIGNvbnN0IExVPFBsYWluT2JqZWN0PiBsdSgpIGNvbnN0OworICAgICNlbmRpZgorCisgICAgI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgY29uc3QgTFU8UGxhaW5PYmplY3Q+IGVpZ2VuMl9sdSgpIGNvbnN0OworICAgICNlbmRpZgorCisgICAgI2lmIEVJR0VOMl9TVVBQT1JUX1NUQUdFID4gU1RBR0UyMF9SRVNPTFZFX0FQSV9DT05GTElDVFMKKyAgICBjb25zdCBQYXJ0aWFsUGl2TFU8UGxhaW5PYmplY3Q+IGx1KCkgY29uc3Q7CisgICAgI2VuZGlmCisgICAgCisgICAgI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVzdWx0VHlwZT4KKyAgICB2b2lkIGNvbXB1dGVJbnZlcnNlKE1hdHJpeEJhc2U8UmVzdWx0VHlwZT4gKnJlc3VsdCkgY29uc3QgeworICAgICAgKnJlc3VsdCA9IHRoaXMtPmludmVyc2UoKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBjb25zdCBpbnRlcm5hbDo6aW52ZXJzZV9pbXBsPERlcml2ZWQ+IGludmVyc2UoKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIHZvaWQgY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2soCisgICAgICBSZXN1bHRUeXBlJiBpbnZlcnNlLAorICAgICAgdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyJiBkZXRlcm1pbmFudCwKKyAgICAgIGJvb2wmIGludmVydGlibGUsCisgICAgICBjb25zdCBSZWFsU2NhbGFyJiBhYnNEZXRlcm1pbmFudFRocmVzaG9sZCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKQorICAgICkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVzdWx0VHlwZT4KKyAgICB2b2lkIGNvbXB1dGVJbnZlcnNlV2l0aENoZWNrKAorICAgICAgUmVzdWx0VHlwZSYgaW52ZXJzZSwKKyAgICAgIGJvb2wmIGludmVydGlibGUsCisgICAgICBjb25zdCBSZWFsU2NhbGFyJiBhYnNEZXRlcm1pbmFudFRocmVzaG9sZCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKQorICAgICkgY29uc3Q7CisgICAgU2NhbGFyIGRldGVybWluYW50KCkgY29uc3Q7CisKKy8vLy8vLy8vLy8vIENob2xlc2t5IG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgY29uc3QgTExUPFBsYWluT2JqZWN0PiAgbGx0KCkgY29uc3Q7CisgICAgY29uc3QgTERMVDxQbGFpbk9iamVjdD4gbGRsdCgpIGNvbnN0OworCisvLy8vLy8vLy8vLyBRUiBtb2R1bGUgLy8vLy8vLy8vLy8KKworICAgIGNvbnN0IEhvdXNlaG9sZGVyUVI8UGxhaW5PYmplY3Q+IGhvdXNlaG9sZGVyUXIoKSBjb25zdDsKKyAgICBjb25zdCBDb2xQaXZIb3VzZWhvbGRlclFSPFBsYWluT2JqZWN0PiBjb2xQaXZIb3VzZWhvbGRlclFyKCkgY29uc3Q7CisgICAgY29uc3QgRnVsbFBpdkhvdXNlaG9sZGVyUVI8UGxhaW5PYmplY3Q+IGZ1bGxQaXZIb3VzZWhvbGRlclFyKCkgY29uc3Q7CisgICAgCisgICAgI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgY29uc3QgUVI8UGxhaW5PYmplY3Q+IHFyKCkgY29uc3Q7CisgICAgI2VuZGlmCisKKyAgICBFaWdlbnZhbHVlc1JldHVyblR5cGUgZWlnZW52YWx1ZXMoKSBjb25zdDsKKyAgICBSZWFsU2NhbGFyIG9wZXJhdG9yTm9ybSgpIGNvbnN0OworCisvLy8vLy8vLy8vLyBTVkQgbW9kdWxlIC8vLy8vLy8vLy8vCisKKyAgICBKYWNvYmlTVkQ8UGxhaW5PYmplY3Q+IGphY29iaVN2ZCh1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zID0gMCkgY29uc3Q7CisKKyAgICAjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyAgICBTVkQ8UGxhaW5PYmplY3Q+IHN2ZCgpIGNvbnN0OworICAgICNlbmRpZgorCisvLy8vLy8vLy8vLyBHZW9tZXRyeSBtb2R1bGUgLy8vLy8vLy8vLy8KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvLy8gXGludGVybmFsIGhlbHBlciBzdHJ1Y3QgdG8gZm9ybSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGNyb3NzIHByb2R1Y3QKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IHN0cnVjdCBjcm9zc19wcm9kdWN0X3JldHVybl90eXBlIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X3RyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxPdGhlckRlcml2ZWQ+OjpTY2FsYXI+OjpSZXR1cm5UeXBlIFNjYWxhcjsKKyAgICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixNYXRyaXhCYXNlOjpSb3dzQXRDb21waWxlVGltZSxNYXRyaXhCYXNlOjpDb2xzQXRDb21waWxlVGltZT4gdHlwZTsKKyAgICB9OworICAgICNlbmRpZiAvLyBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB0eXBlbmFtZSBjcm9zc19wcm9kdWN0X3JldHVybl90eXBlPE90aGVyRGVyaXZlZD46OnR5cGUKKyAgICBjcm9zcyhjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgUGxhaW5PYmplY3QgY3Jvc3MzKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworICAgIFBsYWluT2JqZWN0IHVuaXRPcnRob2dvbmFsKHZvaWQpIGNvbnN0OworICAgIE1hdHJpeDxTY2FsYXIsMywxPiBldWxlckFuZ2xlcyhJbmRleCBhMCwgSW5kZXggYTEsIEluZGV4IGEyKSBjb25zdDsKKyAgICAKKyAgICAjaWYgRUlHRU4yX1NVUFBPUlRfU1RBR0UgPiBTVEFHRTIwX1JFU09MVkVfQVBJX0NPTkZMSUNUUworICAgIFNjYWxhck11bHRpcGxlUmV0dXJuVHlwZSBvcGVyYXRvciooY29uc3QgVW5pZm9ybVNjYWxpbmc8U2NhbGFyPiYgcykgY29uc3Q7CisgICAgLy8gcHV0IHRoaXMgYXMgc2VwYXJhdGUgZW51bSB2YWx1ZSB0byB3b3JrIGFyb3VuZCBwb3NzaWJsZSBHQ0MgNC4zIGJ1ZyAoPykKKyAgICBlbnVtIHsgSG9tb2dlbmVvdXNSZXR1cm5UeXBlRGlyZWN0aW9uID0gQ29sc0F0Q29tcGlsZVRpbWU9PTE/VmVydGljYWw6SG9yaXpvbnRhbCB9OworICAgIHR5cGVkZWYgSG9tb2dlbmVvdXM8RGVyaXZlZCwgSG9tb2dlbmVvdXNSZXR1cm5UeXBlRGlyZWN0aW9uPiBIb21vZ2VuZW91c1JldHVyblR5cGU7CisgICAgSG9tb2dlbmVvdXNSZXR1cm5UeXBlIGhvbW9nZW5lb3VzKCkgY29uc3Q7CisgICAgI2VuZGlmCisgICAgCisgICAgZW51bSB7CisgICAgICBTaXplTWludXNPbmUgPSBTaXplQXRDb21waWxlVGltZT09RHluYW1pYyA/IER5bmFtaWMgOiBTaXplQXRDb21waWxlVGltZS0xCisgICAgfTsKKyAgICB0eXBlZGVmIEJsb2NrPGNvbnN0IERlcml2ZWQsCisgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZT09MSA/IFNpemVNaW51c09uZSA6IDEsCisgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZT09MSA/IDEgOiBTaXplTWludXNPbmU+IENvbnN0U3RhcnRNaW51c09uZTsKKyAgICB0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50MV9vcDx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+LAorICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0U3RhcnRNaW51c09uZSA+IEhOb3JtYWxpemVkUmV0dXJuVHlwZTsKKworICAgIGNvbnN0IEhOb3JtYWxpemVkUmV0dXJuVHlwZSBobm9ybWFsaXplZCgpIGNvbnN0OworCisvLy8vLy8vLy8vIEhvdXNlaG9sZGVyIG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgdm9pZCBtYWtlSG91c2Vob2xkZXJJblBsYWNlKFNjYWxhciYgdGF1LCBSZWFsU2NhbGFyJiBiZXRhKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFc3NlbnRpYWxQYXJ0PgorICAgIHZvaWQgbWFrZUhvdXNlaG9sZGVyKEVzc2VudGlhbFBhcnQmIGVzc2VudGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXImIHRhdSwgUmVhbFNjYWxhciYgYmV0YSkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRXNzZW50aWFsUGFydD4KKyAgICB2b2lkIGFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoY29uc3QgRXNzZW50aWFsUGFydCYgZXNzZW50aWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXImIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyKiB3b3Jrc3BhY2UpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEVzc2VudGlhbFBhcnQ+CisgICAgdm9pZCBhcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodChjb25zdCBFc3NlbnRpYWxQYXJ0JiBlc3NlbnRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXImIHRhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhciogd29ya3NwYWNlKTsKKworLy8vLy8vLy8vIEphY29iaSBtb2R1bGUgLy8vLy8vLy8vCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhcj4KKyAgICB2b2lkIGFwcGx5T25UaGVMZWZ0KEluZGV4IHAsIEluZGV4IHEsIGNvbnN0IEphY29iaVJvdGF0aW9uPE90aGVyU2NhbGFyPiYgaik7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXI+CisgICAgdm9pZCBhcHBseU9uVGhlUmlnaHQoSW5kZXggcCwgSW5kZXggcSwgY29uc3QgSmFjb2JpUm90YXRpb248T3RoZXJTY2FsYXI+JiBqKTsKKworLy8vLy8vLy8vIE1hdHJpeEZ1bmN0aW9ucyBtb2R1bGUgLy8vLy8vLy8vCisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpzdGVtX2Z1bmN0aW9uPFNjYWxhcj46OnR5cGUgU3RlbUZ1bmN0aW9uOworICAgIGNvbnN0IE1hdHJpeEV4cG9uZW50aWFsUmV0dXJuVmFsdWU8RGVyaXZlZD4gZXhwKCkgY29uc3Q7CisgICAgY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBtYXRyaXhGdW5jdGlvbihTdGVtRnVuY3Rpb24gZikgY29uc3Q7CisgICAgY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBjb3NoKCkgY29uc3Q7CisgICAgY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBzaW5oKCkgY29uc3Q7CisgICAgY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBjb3MoKSBjb25zdDsKKyAgICBjb25zdCBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+IHNpbigpIGNvbnN0OworICAgIGNvbnN0IE1hdHJpeFNxdWFyZVJvb3RSZXR1cm5WYWx1ZTxEZXJpdmVkPiBzcXJ0KCkgY29uc3Q7CisgICAgY29uc3QgTWF0cml4TG9nYXJpdGhtUmV0dXJuVmFsdWU8RGVyaXZlZD4gbG9nKCkgY29uc3Q7CisKKyNpZmRlZiBFSUdFTjJfU1VQUE9SVAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByb2R1Y3REZXJpdmVkLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcis9KGNvbnN0IEZsYWdnZWQ8UHJvZHVjdEJhc2U8UHJvZHVjdERlcml2ZWQsIExocyxSaHM+LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmFsQmVmb3JlQXNzaWduaW5nQml0PiYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvZHVjdERlcml2ZWQsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorICAgIERlcml2ZWQmIG9wZXJhdG9yLT0oY29uc3QgRmxhZ2dlZDxQcm9kdWN0QmFzZTxQcm9kdWN0RGVyaXZlZCwgTGhzLFJocz4sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQ+JiBvdGhlcik7CisKKyAgICAvKiogXGRlcHJlY2F0ZWQgYmVjYXVzZSAubGF6eSgpIGlzIGRlcHJlY2F0ZWQKKyAgICAgICogT3ZlcmxvYWRlZCBmb3IgY2FjaGUgZnJpZW5kbHkgcHJvZHVjdCBldmFsdWF0aW9uICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIGxhenlBc3NpZ24oY29uc3QgRmxhZ2dlZDxPdGhlckRlcml2ZWQsIDAsIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQ+JiBvdGhlcikKKyAgICB7IHJldHVybiBsYXp5QXNzaWduKG90aGVyLl9leHByZXNzaW9uKCkpOyB9CisKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgQWRkZWQ+CisgICAgY29uc3QgRmxhZ2dlZDxEZXJpdmVkLCBBZGRlZCwgMD4gbWFya2VkKCkgY29uc3Q7CisgICAgY29uc3QgRmxhZ2dlZDxEZXJpdmVkLCAwLCBFdmFsQmVmb3JlQXNzaWduaW5nQml0PiBsYXp5KCkgY29uc3Q7CisKKyAgICBpbmxpbmUgY29uc3QgQ3dpc2U8RGVyaXZlZD4gY3dpc2UoKSBjb25zdDsKKyAgICBpbmxpbmUgQ3dpc2U8RGVyaXZlZD4gY3dpc2UoKTsKKworICAgIFZlY3RvckJsb2NrPERlcml2ZWQ+IHN0YXJ0KEluZGV4IHNpemUpOworICAgIGNvbnN0IFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQ+IHN0YXJ0KEluZGV4IHNpemUpIGNvbnN0OworICAgIFZlY3RvckJsb2NrPERlcml2ZWQ+IGVuZChJbmRleCBzaXplKTsKKyAgICBjb25zdCBWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkPiBlbmQoSW5kZXggc2l6ZSkgY29uc3Q7CisgICAgdGVtcGxhdGU8aW50IFNpemU+IFZlY3RvckJsb2NrPERlcml2ZWQsU2l6ZT4gc3RhcnQoKTsKKyAgICB0ZW1wbGF0ZTxpbnQgU2l6ZT4gY29uc3QgVmVjdG9yQmxvY2s8Y29uc3QgRGVyaXZlZCxTaXplPiBzdGFydCgpIGNvbnN0OworICAgIHRlbXBsYXRlPGludCBTaXplPiBWZWN0b3JCbG9jazxEZXJpdmVkLFNpemU+IGVuZCgpOworICAgIHRlbXBsYXRlPGludCBTaXplPiBjb25zdCBWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkLFNpemU+IGVuZCgpIGNvbnN0OworCisgICAgTWlub3I8RGVyaXZlZD4gbWlub3IoSW5kZXggcm93LCBJbmRleCBjb2wpOworICAgIGNvbnN0IE1pbm9yPERlcml2ZWQ+IG1pbm9yKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdDsKKyNlbmRpZgorCisgIHByb3RlY3RlZDoKKyAgICBNYXRyaXhCYXNlKCkgOiBCYXNlKCkge30KKworICBwcml2YXRlOgorICAgIGV4cGxpY2l0IE1hdHJpeEJhc2UoaW50KTsKKyAgICBNYXRyaXhCYXNlKGludCxpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZXhwbGljaXQgTWF0cml4QmFzZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mKTsKKyAgcHJvdGVjdGVkOgorICAgIC8vIG1peGluZyBhcnJheXMgYW5kIG1hdHJpY2VzIGlzIG5vdCBsZWdhbAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gRGVyaXZlZCYgb3BlcmF0b3IrPShjb25zdCBBcnJheUJhc2U8T3RoZXJEZXJpdmVkPiYgKQorICAgIHtFSUdFTl9TVEFUSUNfQVNTRVJUKHN0ZDo6cHRyZGlmZl90KHNpemVvZih0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcikpPT0tMSxZT1VfQ0FOTk9UX01JWF9BUlJBWVNfQU5EX01BVFJJQ0VTKTsgcmV0dXJuICp0aGlzO30KKyAgICAvLyBtaXhpbmcgYXJyYXlzIGFuZCBtYXRyaWNlcyBpcyBub3QgbGVnYWwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IERlcml2ZWQmIG9wZXJhdG9yLT0oY29uc3QgQXJyYXlCYXNlPE90aGVyRGVyaXZlZD4mICkKKyAgICB7RUlHRU5fU1RBVElDX0FTU0VSVChzdGQ6OnB0cmRpZmZfdChzaXplb2YodHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXIpKT09LTEsWU9VX0NBTk5PVF9NSVhfQVJSQVlTX0FORF9NQVRSSUNFUyk7IHJldHVybiAqdGhpczt9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX01BVFJJWEJBU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvTmVzdEJ5VmFsdWUuaCBiL0VpZ2VuL3NyYy9Db3JlL05lc3RCeVZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5M2IxNwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL05lc3RCeVZhbHVlLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05FU1RCWVZBTFVFX0gKKyNkZWZpbmUgRUlHRU5fTkVTVEJZVkFMVUVfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGNsYXNzIE5lc3RCeVZhbHVlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIHdoaWNoIG11c3QgYmUgbmVzdGVkIGJ5IHZhbHVlCisgICoKKyAgKiBccGFyYW0gRXhwcmVzc2lvblR5cGUgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBvZiB3aGljaCB3ZSBhcmUgcmVxdWlyaW5nIG5lc3RpbmctYnktdmFsdWUKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6Om5lc3RCeVZhbHVlKCkKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6Om5lc3RCeVZhbHVlKCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgorc3RydWN0IHRyYWl0czxOZXN0QnlWYWx1ZTxFeHByZXNzaW9uVHlwZT4gPiA6IHB1YmxpYyB0cmFpdHM8RXhwcmVzc2lvblR5cGU+Cit7fTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+IGNsYXNzIE5lc3RCeVZhbHVlCisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTwgTmVzdEJ5VmFsdWU8RXhwcmVzc2lvblR5cGU+ID46OnR5cGUKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8TmVzdEJ5VmFsdWU+Ojp0eXBlIEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShOZXN0QnlWYWx1ZSkKKworICAgIGlubGluZSBOZXN0QnlWYWx1ZShjb25zdCBFeHByZXNzaW9uVHlwZSYgbWF0cml4KSA6IG1fZXhwcmVzc2lvbihtYXRyaXgpIHt9CisKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb2xzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24ub3V0ZXJTdHJpZGUoKTsgfQorICAgIGlubGluZSBJbmRleCBpbm5lclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwcmVzc2lvbi5pbm5lclN0cmlkZSgpOyB9CisKKyAgICBpbmxpbmUgY29uc3QgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29lZmYocm93LCBjb2wpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24uY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb2VmZihpbmRleCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbi5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24udGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihyb3csIGNvbCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihyb3csIGNvbCwgeCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb24udGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpbmRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihpbmRleCwgeCk7CisgICAgfQorCisgICAgb3BlcmF0b3IgY29uc3QgRXhwcmVzc2lvblR5cGUmKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IEV4cHJlc3Npb25UeXBlIG1fZXhwcmVzc2lvbjsKK307CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSB0ZW1wb3JhcnkgdmVyc2lvbiBvZiAqdGhpcy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgTmVzdEJ5VmFsdWU8RGVyaXZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6bmVzdEJ5VmFsdWUoKSBjb25zdAoreworICByZXR1cm4gTmVzdEJ5VmFsdWU8RGVyaXZlZD4oZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ORVNUQllWQUxVRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Ob0FsaWFzLmggYi9FaWdlbi9zcmMvQ29yZS9Ob0FsaWFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiM2ZhMgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL05vQWxpYXMuaApAQCAtMCwwICsxLDEyNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05PQUxJQVNfSAorI2RlZmluZSBFSUdFTl9OT0FMSUFTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBOb0FsaWFzCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQc2V1ZG8gZXhwcmVzc2lvbiBwcm92aWRpbmcgYW4gb3BlcmF0b3IgPSBhc3N1bWluZyBubyBhbGlhc2luZworICAqCisgICogXHBhcmFtIEV4cHJlc3Npb25UeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgb24gd2hpY2ggdG8gZG8gdGhlIGxhenkgYXNzaWdubWVudAorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gd2l0aCBzcGVjaWFsIGFzc2lnbm1lbnQgb3BlcmF0b3JzCisgICogYXNzdW1pbmcgbm8gYWxpYXNpbmcgYmV0d2VlbiB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gYW5kIHRoZSBzb3VyY2UgZXhwcmVzc2lvbi4KKyAgKiBNb3JlIHByZWNpc2VseSBpdCBhbGxvYXMgdG8gYnlwYXNzIHRoZSBFdmFsQmVmb3JlQXNzaWduQml0IGZsYWcgb2YgdGhlIHNvdXJjZSBleHByZXNzaW9uLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpub2FsaWFzKCkKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6Om5vYWxpYXMoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsIHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgU3RvcmFnZUJhc2U+CitjbGFzcyBOb0FsaWFzCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgcHVibGljOgorICAgIE5vQWxpYXMoRXhwcmVzc2lvblR5cGUmIGV4cHJlc3Npb24pIDogbV9leHByZXNzaW9uKGV4cHJlc3Npb24pIHt9CisKKyAgICAvKiogQmVoYXZlcyBsaWtlIE1hdHJpeEJhc2U6OmxhenlBc3NpZ24ob3RoZXIpCisgICAgICAqIFxzYSBNYXRyaXhCYXNlOjpsYXp5QXNzaWduKCkgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3I9KGNvbnN0IFN0b3JhZ2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsgcmV0dXJuIGludGVybmFsOjphc3NpZ25fc2VsZWN0b3I8RXhwcmVzc2lvblR5cGUsT3RoZXJEZXJpdmVkLGZhbHNlPjo6cnVuKG1fZXhwcmVzc2lvbixvdGhlci5kZXJpdmVkKCkpOyB9CisKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6Om9wZXJhdG9yKz0gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3IrPShjb25zdCBTdG9yYWdlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFNlbGZDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3VtX29wPFNjYWxhcj4sIEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQ+IFNlbGZBZGRlcjsKKyAgICAgIFNlbGZBZGRlciB0bXAobV9leHByZXNzaW9uKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxPdGhlckRlcml2ZWQ+Ojp0eXBlIE90aGVyRGVyaXZlZE5lc3RlZDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8T3RoZXJEZXJpdmVkTmVzdGVkPjo6dHlwZSBfT3RoZXJEZXJpdmVkTmVzdGVkOworICAgICAgaW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvcjxTZWxmQWRkZXIsX090aGVyRGVyaXZlZE5lc3RlZCxmYWxzZT46OnJ1bih0bXAsT3RoZXJEZXJpdmVkTmVzdGVkKG90aGVyLmRlcml2ZWQoKSkpOworICAgICAgcmV0dXJuIG1fZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6Om9wZXJhdG9yLT0gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3ItPShjb25zdCBTdG9yYWdlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICB0eXBlZGVmIFNlbGZDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+LCBFeHByZXNzaW9uVHlwZSwgT3RoZXJEZXJpdmVkPiBTZWxmQWRkZXI7CisgICAgICBTZWxmQWRkZXIgdG1wKG1fZXhwcmVzc2lvbik7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8T3RoZXJEZXJpdmVkPjo6dHlwZSBPdGhlckRlcml2ZWROZXN0ZWQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyaXZlZE5lc3RlZD46OnR5cGUgX090aGVyRGVyaXZlZE5lc3RlZDsKKyAgICAgIGludGVybmFsOjphc3NpZ25fc2VsZWN0b3I8U2VsZkFkZGVyLF9PdGhlckRlcml2ZWROZXN0ZWQsZmFsc2U+OjpydW4odG1wLE90aGVyRGVyaXZlZE5lc3RlZChvdGhlci5kZXJpdmVkKCkpKTsKKyAgICAgIHJldHVybiBtX2V4cHJlc3Npb247CisgICAgfQorCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvZHVjdERlcml2ZWQsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgRXhwcmVzc2lvblR5cGUmIG9wZXJhdG9yKz0oY29uc3QgUHJvZHVjdEJhc2U8UHJvZHVjdERlcml2ZWQsIExocyxSaHM+JiBvdGhlcikKKyAgICB7IG90aGVyLmRlcml2ZWQoKS5hZGRUbyhtX2V4cHJlc3Npb24pOyByZXR1cm4gbV9leHByZXNzaW9uOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3ItPShjb25zdCBQcm9kdWN0QmFzZTxQcm9kdWN0RGVyaXZlZCwgTGhzLFJocz4mIG90aGVyKQorICAgIHsgb3RoZXIuZGVyaXZlZCgpLnN1YlRvKG1fZXhwcmVzc2lvbik7IHJldHVybiBtX2V4cHJlc3Npb247IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTmVzdGluZ0ZsYWdzPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgRXhwcmVzc2lvblR5cGUmIG9wZXJhdG9yKz0oY29uc3QgQ29lZmZCYXNlZFByb2R1Y3Q8TGhzLFJocyxOZXN0aW5nRmxhZ3M+JiBvdGhlcikKKyAgICB7IHJldHVybiBtX2V4cHJlc3Npb24uZGVyaXZlZCgpICs9IENvZWZmQmFzZWRQcm9kdWN0PExocyxSaHMsTmVzdEJ5UmVmQml0PihvdGhlci5saHMoKSwgb3RoZXIucmhzKCkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE5lc3RpbmdGbGFncz4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEV4cHJlc3Npb25UeXBlJiBvcGVyYXRvci09KGNvbnN0IENvZWZmQmFzZWRQcm9kdWN0PExocyxSaHMsTmVzdGluZ0ZsYWdzPiYgb3RoZXIpCisgICAgeyByZXR1cm4gbV9leHByZXNzaW9uLmRlcml2ZWQoKSAtPSBDb2VmZkJhc2VkUHJvZHVjdDxMaHMsUmhzLE5lc3RCeVJlZkJpdD4ob3RoZXIubGhzKCksIG90aGVyLnJocygpKTsgfQorI2VuZGlmCisKKyAgcHJvdGVjdGVkOgorICAgIEV4cHJlc3Npb25UeXBlJiBtX2V4cHJlc3Npb247Cit9OworCisvKiogXHJldHVybnMgYSBwc2V1ZG8gZXhwcmVzc2lvbiBvZiBcYyAqdGhpcyB3aXRoIGFuIG9wZXJhdG9yPSBhc3N1bWluZworICAqIG5vIGFsaWFzaW5nIGJldHdlZW4gXGMgKnRoaXMgYW5kIHRoZSBzb3VyY2UgZXhwcmVzc2lvbi4KKyAgKgorICAqIE1vcmUgcHJlY2lzZWx5LCBub2FsaWFzKCkgYWxsb3dzIHRvIGJ5cGFzcyB0aGUgRXZhbEJlZm9yZUFzc2lnbkJpdCBmbGFnLgorICAqIEN1cnJlbnRseSwgZXZlbiB0aG91Z2ggc2V2ZXJhbCBleHByZXNzaW9ucyBtYXkgYWxpYXMsIG9ubHkgcHJvZHVjdAorICAqIGV4cHJlc3Npb25zIGhhdmUgdGhpcyBmbGFnLiBUaGVyZWZvcmUsIG5vYWxpYXMoKSBpcyBvbmx5IHVzZWZ1bGwgd2hlbgorICAqIHRoZSBzb3VyY2UgZXhwcmVzc2lvbiBjb250YWlucyBhIG1hdHJpeCBwcm9kdWN0LgorICAqCisgICogSGVyZSBhcmUgc29tZSBleGFtcGxlcyB3aGVyZSBub2FsaWFzIGlzIHVzZWZ1bGw6CisgICogXGNvZGUKKyAgKiBELm5vYWxpYXMoKSAgPSBBICogQjsKKyAgKiBELm5vYWxpYXMoKSArPSBBLnRyYW5zcG9zZSgpICogQjsKKyAgKiBELm5vYWxpYXMoKSAtPSAyICogQSAqIEIuYWRqb2ludCgpOworICAqIFxlbmRjb2RlCisgICoKKyAgKiBPbiB0aGUgb3RoZXIgaGFuZCB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2lsbCBsZWFkIHRvIGEgXGIgd3JvbmcgcmVzdWx0OgorICAqIFxjb2RlCisgICogQS5ub2FsaWFzKCkgPSBBICogQjsKKyAgKiBcZW5kY29kZQorICAqIGJlY2F1c2UgdGhlIHJlc3VsdCBtYXRyaXggQSBpcyBhbHNvIGFuIG9wZXJhbmQgb2YgdGhlIG1hdHJpeCBwcm9kdWN0LiBUaGVyZWZvcmUsCisgICogdGhlcmUgaXMgbm8gYWx0ZXJuYXRpdmUgdGhhbiBldmFsdWF0aW5nIEEgKiBCIGluIGEgdGVtcG9yYXJ5LCB0aGF0IGlzIHRoZSBkZWZhdWx0CisgICogYmVoYXZpb3Igd2hlbiB5b3Ugd3JpdGU6CisgICogXGNvZGUKKyAgKiBBID0gQSAqIEI7CisgICogXGVuZGNvZGUKKyAgKgorICAqIFxzYSBjbGFzcyBOb0FsaWFzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorTm9BbGlhczxEZXJpdmVkLE1hdHJpeEJhc2U+IE1hdHJpeEJhc2U8RGVyaXZlZD46Om5vYWxpYXMoKQoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX05PQUxJQVNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvTnVtVHJhaXRzLmggYi9FaWdlbi9zcmMvQ29yZS9OdW1UcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTRlZjAyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvTnVtVHJhaXRzLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05VTVRSQUlUU19ICisjZGVmaW5lIEVJR0VOX05VTVRSQUlUU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcY2xhc3MgTnVtVHJhaXRzCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBIb2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyBudW1lcmljIChpLmUuIHNjYWxhcikgdHlwZXMgYWxsb3dlZCBieSBFaWdlbi4KKyAgKgorICAqIFxwYXJhbSBUIHRoZSBudW1lcmljIHR5cGUgYXQgaGFuZAorICAqCisgICogVGhpcyBjbGFzcyBzdG9yZXMgZW51bXMsIHR5cGVkZWZzIGFuZCBzdGF0aWMgbWV0aG9kcyBnaXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBudW1lcmljIHR5cGUuCisgICoKKyAgKiBUaGUgcHJvdmlkZWQgZGF0YSBjb25zaXN0cyBvZjoKKyAgKiBcbGkgQSB0eXBlZGVmIFxhIFJlYWwsIGdpdmluZyB0aGUgInJlYWwgcGFydCIgdHlwZSBvZiBcYSBULiBJZiBcYSBUIGlzIGFscmVhZHkgcmVhbCwKKyAgKiAgICAgdGhlbiBcYSBSZWFsIGlzIGp1c3QgYSB0eXBlZGVmIHRvIFxhIFQuIElmIFxhIFQgaXMgXGMgc3RkOjpjb21wbGV4PFU+IHRoZW4gXGEgUmVhbAorICAqICAgICBpcyBhIHR5cGVkZWYgdG8gXGEgVS4KKyAgKiBcbGkgQSB0eXBlZGVmIFxhIE5vbkludGVnZXIsIGdpdmluZyB0aGUgdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBvcGVyYXRpb25zIHByb2R1Y2luZyBub24taW50ZWdyYWwgdmFsdWVzLAorICAqICAgICBzdWNoIGFzIHF1b3RpZW50cywgc3F1YXJlIHJvb3RzLCBldGMuIElmIFxhIFQgaXMgYSBmbG9hdGluZy1wb2ludCB0eXBlLCB0aGVuIHRoaXMgdHlwZWRlZiBqdXN0IGdpdmVzCisgICogICAgIFxhIFQgYWdhaW4uIE5vdGUgaG93ZXZlciB0aGF0IG1hbnkgRWlnZW4gZnVuY3Rpb25zIHN1Y2ggYXMgaW50ZXJuYWw6OnNxcnQgc2ltcGx5IHJlZnVzZSB0bworICAqICAgICB0YWtlIGludGVnZXJzLiBPdXRzaWRlIG9mIGEgZmV3IGNhc2VzLCBFaWdlbiBkb2Vzbid0IGRvIGF1dG9tYXRpYyB0eXBlIHByb21vdGlvbi4gVGh1cywgdGhpcyB0eXBlZGVmIGlzCisgICogICAgIG9ubHkgaW50ZW5kZWQgYXMgYSBoZWxwZXIgZm9yIGNvZGUgdGhhdCBuZWVkcyB0byBleHBsaWNpdGx5IHByb21vdGUgdHlwZXMuCisgICogXGxpIEEgdHlwZWRlZiBcYSBOZXN0ZWQgZ2l2aW5nIHRoZSB0eXBlIHRvIHVzZSB0byBuZXN0IGEgdmFsdWUgaW5zaWRlIG9mIHRoZSBleHByZXNzaW9uIHRyZWUuIElmIHlvdSBkb24ndCBrbm93IHdoYXQKKyAgKiAgICAgdGhpcyBtZWFucywganVzdCB1c2UgXGEgVCBoZXJlLgorICAqIFxsaSBBbiBlbnVtIHZhbHVlIFxhIElzQ29tcGxleC4gSXQgaXMgZXF1YWwgdG8gMSBpZiBcYSBUIGlzIGEgXGMgc3RkOjpjb21wbGV4CisgICogICAgIHR5cGUsIGFuZCB0byAwIG90aGVyd2lzZS4KKyAgKiBcbGkgQW4gZW51bSB2YWx1ZSBcYSBJc0ludGVnZXIuIEl0IGlzIGVxdWFsIHRvIFxjIDEgaWYgXGEgVCBpcyBhbiBpbnRlZ2VyIHR5cGUgc3VjaCBhcyBcYyBpbnQsCisgICogICAgIGFuZCB0byBcYyAwIG90aGVyd2lzZS4KKyAgKiBcbGkgRW51bSB2YWx1ZXMgUmVhZENvc3QsIEFkZENvc3QgYW5kIE11bENvc3QgcmVwcmVzZW50aW5nIGEgcm91Z2ggZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBDUFUgY3ljbGVzIG5lZWRlZAorICAqICAgICB0byBieSBtb3ZlIC8gYWRkIC8gbXVsIGluc3RydWN0aW9ucyByZXNwZWN0aXZlbHksIGFzc3VtaW5nIHRoZSBkYXRhIGlzIGFscmVhZHkgc3RvcmVkIGluIENQVSByZWdpc3RlcnMuCisgICogICAgIFN0YXkgdmFndWUgaGVyZS4gTm8gbmVlZCB0byBkbyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgc3R1ZmYuCisgICogXGxpIEFuIGVudW0gdmFsdWUgXGEgSXNTaWduZWQuIEl0IGlzIGVxdWFsIHRvIFxjIDEgaWYgXGEgVCBpcyBhIHNpZ25lZCB0eXBlIGFuZCB0byAwIGlmIFxhIFQgaXMgdW5zaWduZWQuCisgICogXGxpIEFuIGVudW0gdmFsdWUgXGEgUmVxdWlyZUluaXRpYWxpemF0aW9uLiBJdCBpcyBlcXVhbCB0byBcYyAxIGlmIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbnVtZXJpYyB0eXBlIFxhIFQgbXVzdAorICAqICAgICBiZSBjYWxsZWQsIGFuZCB0byAwIGlmIGl0IGlzIHNhZmUgbm90IHRvIGNhbGwgaXQuIERlZmF1bHQgaXMgMCBpZiBcYSBUIGlzIGFuIGFyaXRobWV0aWMgdHlwZSwgYW5kIDEgb3RoZXJ3aXNlLgorICAqIFxsaSBBbiBlcHNpbG9uKCkgZnVuY3Rpb24gd2hpY2gsIHVubGlrZSBzdGQ6Om51bWVyaWNfbGltaXRzOjplcHNpbG9uKCksIHJldHVybnMgYSBcYSBSZWFsIGluc3RlYWQgb2YgYSBcYSBULgorICAqIFxsaSBBIGR1bW15X3ByZWNpc2lvbigpIGZ1bmN0aW9uIHJldHVybmluZyBhIHdlYWsgZXBzaWxvbiB2YWx1ZS4gSXQgaXMgbWFpbmx5IHVzZWQgYXMgYSBkZWZhdWx0CisgICogICAgIHZhbHVlIGJ5IHRoZSBmdXp6eSBjb21wYXJpc29uIG9wZXJhdG9ycy4KKyAgKiBcbGkgaGlnaGVzdCgpIGFuZCBsb3dlc3QoKSBmdW5jdGlvbnMgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgcG9zc2libGUgdmFsdWVzIHJlc3BlY3RpdmVseS4KKyAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEdlbmVyaWNOdW1UcmFpdHMKK3sKKyAgZW51bSB7CisgICAgSXNJbnRlZ2VyID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciwKKyAgICBJc1NpZ25lZCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKKyAgICBJc0NvbXBsZXggPSAwLAorICAgIFJlcXVpcmVJbml0aWFsaXphdGlvbiA9IGludGVybmFsOjppc19hcml0aG1ldGljPFQ+Ojp2YWx1ZSA/IDAgOiAxLAorICAgIFJlYWRDb3N0ID0gMSwKKyAgICBBZGRDb3N0ID0gMSwKKyAgICBNdWxDb3N0ID0gMQorICB9OworCisgIHR5cGVkZWYgVCBSZWFsOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICAgICAgIElzSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxzaXplb2YoVCk8PTIsIGZsb2F0LCBkb3VibGU+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgVAorICAgICAgICAgICAgICAgICAgID46OnR5cGUgTm9uSW50ZWdlcjsKKyAgdHlwZWRlZiBUIE5lc3RlZDsKKworICBzdGF0aWMgaW5saW5lIFJlYWwgZXBzaWxvbigpIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmVwc2lsb24oKTsgfQorICBzdGF0aWMgaW5saW5lIFJlYWwgZHVtbXlfcHJlY2lzaW9uKCkKKyAgeworICAgIC8vIG1ha2Ugc3VyZSB0byBvdmVycmlkZSB0aGlzIGZvciBmbG9hdGluZy1wb2ludCB0eXBlcworICAgIHJldHVybiBSZWFsKDApOworICB9CisgIHN0YXRpYyBpbmxpbmUgVCBoaWdoZXN0KCkgeyByZXR1cm4gKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCkoKTsgfQorICBzdGF0aWMgaW5saW5lIFQgbG93ZXN0KCkgIHsgcmV0dXJuIElzSW50ZWdlciA/IChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4pKCkgOiAoLShzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgpKCkpOyB9CisgIAorI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgIGVudW0geworICAgIEhhc0Zsb2F0aW5nUG9pbnQgPSAhSXNJbnRlZ2VyCisgIH07CisgIHR5cGVkZWYgTm9uSW50ZWdlciBGbG9hdGluZ1BvaW50OworI2VuZGlmCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgTnVtVHJhaXRzIDogR2VuZXJpY051bVRyYWl0czxUPgore307CisKK3RlbXBsYXRlPD4gc3RydWN0IE51bVRyYWl0czxmbG9hdD4KKyAgOiBHZW5lcmljTnVtVHJhaXRzPGZsb2F0PgoreworICBzdGF0aWMgaW5saW5lIGZsb2F0IGR1bW15X3ByZWNpc2lvbigpIHsgcmV0dXJuIDFlLTVmOyB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBOdW1UcmFpdHM8ZG91YmxlPiA6IEdlbmVyaWNOdW1UcmFpdHM8ZG91YmxlPgoreworICBzdGF0aWMgaW5saW5lIGRvdWJsZSBkdW1teV9wcmVjaXNpb24oKSB7IHJldHVybiAxZS0xMjsgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgTnVtVHJhaXRzPGxvbmcgZG91YmxlPgorICA6IEdlbmVyaWNOdW1UcmFpdHM8bG9uZyBkb3VibGU+Cit7CisgIHN0YXRpYyBpbmxpbmUgbG9uZyBkb3VibGUgZHVtbXlfcHJlY2lzaW9uKCkgeyByZXR1cm4gMWUtMTVsOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbD4gc3RydWN0IE51bVRyYWl0czxzdGQ6OmNvbXBsZXg8X1JlYWw+ID4KKyAgOiBHZW5lcmljTnVtVHJhaXRzPHN0ZDo6Y29tcGxleDxfUmVhbD4gPgoreworICB0eXBlZGVmIF9SZWFsIFJlYWw7CisgIGVudW0geworICAgIElzQ29tcGxleCA9IDEsCisgICAgUmVxdWlyZUluaXRpYWxpemF0aW9uID0gTnVtVHJhaXRzPF9SZWFsPjo6UmVxdWlyZUluaXRpYWxpemF0aW9uLAorICAgIFJlYWRDb3N0ID0gMiAqIE51bVRyYWl0czxfUmVhbD46OlJlYWRDb3N0LAorICAgIEFkZENvc3QgPSAyICogTnVtVHJhaXRzPFJlYWw+OjpBZGRDb3N0LAorICAgIE11bENvc3QgPSA0ICogTnVtVHJhaXRzPFJlYWw+OjpNdWxDb3N0ICsgMiAqIE51bVRyYWl0czxSZWFsPjo6QWRkQ29zdAorICB9OworCisgIHN0YXRpYyBpbmxpbmUgUmVhbCBlcHNpbG9uKCkgeyByZXR1cm4gTnVtVHJhaXRzPFJlYWw+OjplcHNpbG9uKCk7IH0KKyAgc3RhdGljIGlubGluZSBSZWFsIGR1bW15X3ByZWNpc2lvbigpIHsgcmV0dXJuIE51bVRyYWl0czxSZWFsPjo6ZHVtbXlfcHJlY2lzaW9uKCk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFJvd3MsIGludCBDb2xzLCBpbnQgT3B0aW9ucywgaW50IE1heFJvd3MsIGludCBNYXhDb2xzPgorc3RydWN0IE51bVRyYWl0czxBcnJheTxTY2FsYXIsIFJvd3MsIENvbHMsIE9wdGlvbnMsIE1heFJvd3MsIE1heENvbHM+ID4KK3sKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIFJvd3MsIENvbHMsIE9wdGlvbnMsIE1heFJvd3MsIE1heENvbHM+IEFycmF5VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIEFycmF5PFJlYWxTY2FsYXIsIFJvd3MsIENvbHMsIE9wdGlvbnMsIE1heFJvd3MsIE1heENvbHM+IFJlYWw7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46Ok5vbkludGVnZXIgTm9uSW50ZWdlclNjYWxhcjsKKyAgdHlwZWRlZiBBcnJheTxOb25JbnRlZ2VyU2NhbGFyLCBSb3dzLCBDb2xzLCBPcHRpb25zLCBNYXhSb3dzLCBNYXhDb2xzPiBOb25JbnRlZ2VyOworICB0eXBlZGVmIEFycmF5VHlwZSAmIE5lc3RlZDsKKyAgCisgIGVudW0geworICAgIElzQ29tcGxleCA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgSXNJbnRlZ2VyID0gTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciwKKyAgICBJc1NpZ25lZCAgPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNTaWduZWQsCisgICAgUmVxdWlyZUluaXRpYWxpemF0aW9uID0gMSwKKyAgICBSZWFkQ29zdCA9IEFycmF5VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyBEeW5hbWljIDogQXJyYXlUeXBlOjpTaXplQXRDb21waWxlVGltZSAqIE51bVRyYWl0czxTY2FsYXI+OjpSZWFkQ29zdCwKKyAgICBBZGRDb3N0ICA9IEFycmF5VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyBEeW5hbWljIDogQXJyYXlUeXBlOjpTaXplQXRDb21waWxlVGltZSAqIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LAorICAgIE11bENvc3QgID0gQXJyYXlUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYyA/IER5bmFtaWMgOiBBcnJheVR5cGU6OlNpemVBdENvbXBpbGVUaW1lICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QKKyAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTlVNVFJBSVRTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1Blcm11dGF0aW9uTWF0cml4LmggYi9FaWdlbi9zcmMvQ29yZS9QZXJtdXRhdGlvbk1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjlmODEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9QZXJtdXRhdGlvbk1hdHJpeC5oCkBAIC0wLDAgKzEsNjg3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QRVJNVVRBVElPTk1BVFJJWF9ICisjZGVmaW5lIEVJR0VOX1BFUk1VVEFUSU9OTUFUUklYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK3RlbXBsYXRlPGludCBSb3dDb2wsdHlwZW5hbWUgSW5kaWNlc1R5cGUsdHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+IGNsYXNzIFBlcm11dGVkSW1wbDsKKworLyoqIFxjbGFzcyBQZXJtdXRhdGlvbkJhc2UKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEJhc2UgY2xhc3MgZm9yIHBlcm11dGF0aW9ucworICAqCisgICogXHBhcmFtIERlcml2ZWQgdGhlIGRlcml2ZWQgY2xhc3MKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBleHByZXNzaW9ucyByZXByZXNlbnRpbmcgYSBwZXJtdXRhdGlvbiBtYXRyaXgsCisgICogaW50ZXJuYWxseSBzdG9yZWQgYXMgYSB2ZWN0b3Igb2YgaW50ZWdlcnMuCisgICogVGhlIGNvbnZlbnRpb24gZm9sbG93ZWQgaGVyZSBpcyB0aGF0IGlmIFxmJCBcc2lnbWEgXGYkIGlzIGEgcGVybXV0YXRpb24sIHRoZSBjb3JyZXNwb25kaW5nIHBlcm11dGF0aW9uIG1hdHJpeAorICAqIFxmJCBQX1xzaWdtYSBcZiQgaXMgc3VjaCB0aGF0IGlmIFxmJCAoZV8xLFxsZG90cyxlX3ApIFxmJCBpcyB0aGUgY2Fub25pY2FsIGJhc2lzLCB3ZSBoYXZlOgorICAqICBcZlsgUF9cc2lnbWEoZV9pKSA9IGVfe1xzaWdtYShpKX0uIFxmXQorICAqIFRoaXMgY29udmVudGlvbiBlbnN1cmVzIHRoYXQgZm9yIGFueSB0d28gcGVybXV0YXRpb25zIFxmJCBcc2lnbWEsIFx0YXUgXGYkLCB3ZSBoYXZlOgorICAqICBcZlsgUF97XHNpZ21hXGNpcmNcdGF1fSA9IFBfXHNpZ21hIFBfXHRhdS4gXGZdCisgICoKKyAgKiBQZXJtdXRhdGlvbiBtYXRyaWNlcyBhcmUgc3F1YXJlIGFuZCBpbnZlcnRpYmxlLgorICAqCisgICogTm90aWNlIHRoYXQgaW4gYWRkaXRpb24gdG8gdGhlIG1lbWJlciBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycyBsaXN0ZWQgaGVyZSwgdGhlcmUgYWxzbyBhcmUgbm9uLW1lbWJlcgorICAqIG9wZXJhdG9yKiB0byBtdWx0aXBseSBhbnkga2luZCBvZiBwZXJtdXRhdGlvbiBvYmplY3Qgd2l0aCBhbnkga2luZCBvZiBtYXRyaXggZXhwcmVzc2lvbiAoTWF0cml4QmFzZSkKKyAgKiBvbiBlaXRoZXIgc2lkZS4KKyAgKgorICAqIFxzYSBjbGFzcyBQZXJtdXRhdGlvbk1hdHJpeCwgY2xhc3MgUGVybXV0YXRpb25XcmFwcGVyCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBlcm11dGF0aW9uVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFNpZGUsIGJvb2wgVHJhbnNwb3NlZD1mYWxzZT4KK3N0cnVjdCBwZXJtdXRfbWF0cml4X3Byb2R1Y3RfcmV0dmFsOwordGVtcGxhdGU8dHlwZW5hbWUgUGVybXV0YXRpb25UeXBlLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgU2lkZSwgYm9vbCBUcmFuc3Bvc2VkPWZhbHNlPgorc3RydWN0IHBlcm11dF9zcGFyc2VtYXRyaXhfcHJvZHVjdF9yZXR2YWw7CitlbnVtIFBlcm1QZXJtUHJvZHVjdF90IHtQZXJtUGVybVByb2R1Y3R9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFBlcm11dGF0aW9uQmFzZSA6IHB1YmxpYyBFaWdlbkJhc2U8RGVyaXZlZD4KK3sKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD4gVHJhaXRzOworICAgIHR5cGVkZWYgRWlnZW5CYXNlPERlcml2ZWQ+IEJhc2U7CisgIHB1YmxpYzoKKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6SW5kaWNlc1R5cGUgSW5kaWNlc1R5cGU7CisgICAgZW51bSB7CisgICAgICBGbGFncyA9IFRyYWl0czo6RmxhZ3MsCisgICAgICBDb2VmZlJlYWRDb3N0ID0gVHJhaXRzOjpDb2VmZlJlYWRDb3N0LAorICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lLDAsTWF4Um93c0F0Q29tcGlsZVRpbWUsTWF4Q29sc0F0Q29tcGlsZVRpbWU+CisgICAgICAgICAgICBEZW5zZU1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBQZXJtdXRhdGlvbk1hdHJpeDxJbmRpY2VzVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsSW5kaWNlc1R5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lLEluZGV4PgorICAgICAgICAgICAgUGxhaW5QZXJtdXRhdGlvblR5cGU7CisgICAgdXNpbmcgQmFzZTo6ZGVyaXZlZDsKKyAgICAjZW5kaWYKKworICAgIC8qKiBDb3BpZXMgdGhlIG90aGVyIHBlcm11dGF0aW9uIGludG8gKnRoaXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IFBlcm11dGF0aW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBpbmRpY2VzKCkgPSBvdGhlci5pbmRpY2VzKCk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKworICAgIC8qKiBBc3NpZ25tZW50IGZyb20gdGhlIFRyYW5zcG9zaXRpb25zIFxhIHRyICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBUcmFuc3Bvc2l0aW9uc0Jhc2U8T3RoZXJEZXJpdmVkPiYgdHIpCisgICAgeworICAgICAgc2V0SWRlbnRpdHkodHIuc2l6ZSgpKTsKKyAgICAgIGZvcihJbmRleCBrPXNpemUoKS0xOyBrPj0wOyAtLWspCisgICAgICAgIGFwcGx5VHJhbnNwb3NpdGlvbk9uVGhlUmlnaHQoayx0ci5jb2VmZihrKSk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICogcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgUGVybXV0YXRpb25CYXNlJiBvdGhlcikKKyAgICB7CisgICAgICBpbmRpY2VzKCkgPSBvdGhlci5pbmRpY2VzKCk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgKi8KKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIGluZGljZXMoKS5zaXplKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgKi8KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIGluZGljZXMoKS5zaXplKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgc2l6ZSBvZiBhIHNpZGUgb2YgdGhlIHJlc3BlY3RpdmUgc3F1YXJlIG1hdHJpeCwgaS5lLiwgdGhlIG51bWJlciBvZiBpbmRpY2VzICovCisgICAgaW5saW5lIEluZGV4IHNpemUoKSBjb25zdCB7IHJldHVybiBpbmRpY2VzKCkuc2l6ZSgpOyB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VEZXJpdmVkPgorICAgIHZvaWQgZXZhbFRvKE1hdHJpeEJhc2U8RGVuc2VEZXJpdmVkPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgb3RoZXIuc2V0WmVybygpOworICAgICAgZm9yIChpbnQgaT0wOyBpPHJvd3MoKTsrK2kpCisgICAgICAgIG90aGVyLmNvZWZmUmVmKGluZGljZXMoKS5jb2VmZihpKSxpKSA9IHR5cGVuYW1lIERlbnNlRGVyaXZlZDo6U2NhbGFyKDEpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBccmV0dXJucyBhIE1hdHJpeCBvYmplY3QgaW5pdGlhbGl6ZWQgZnJvbSB0aGlzIHBlcm11dGF0aW9uIG1hdHJpeC4gTm90aWNlIHRoYXQgaXQKKyAgICAgICogaXMgaW5lZmZpY2llbnQgdG8gcmV0dXJuIHRoaXMgTWF0cml4IG9iamVjdCBieSB2YWx1ZS4gRm9yIGVmZmljaWVuY3ksIGZhdm9yIHVzaW5nCisgICAgICAqIHRoZSBNYXRyaXggY29uc3RydWN0b3IgdGFraW5nIEVpZ2VuQmFzZSBvYmplY3RzLgorICAgICAgKi8KKyAgICBEZW5zZU1hdHJpeFR5cGUgdG9EZW5zZU1hdHJpeCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisKKyAgICAvKiogY29uc3QgdmVyc2lvbiBvZiBpbmRpY2VzKCkuICovCisgICAgY29uc3QgSW5kaWNlc1R5cGUmIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkuaW5kaWNlcygpOyB9CisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBwZXJtdXRhdGlvbi4gKi8KKyAgICBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIHsgcmV0dXJuIGRlcml2ZWQoKS5pbmRpY2VzKCk7IH0KKworICAgIC8qKiBSZXNpemVzIHRvIGdpdmVuIHNpemUuCisgICAgICAqLworICAgIGlubGluZSB2b2lkIHJlc2l6ZShJbmRleCBzaXplKQorICAgIHsKKyAgICAgIGluZGljZXMoKS5yZXNpemUoc2l6ZSk7CisgICAgfQorCisgICAgLyoqIFNldHMgKnRoaXMgdG8gYmUgdGhlIGlkZW50aXR5IHBlcm11dGF0aW9uIG1hdHJpeCAqLworICAgIHZvaWQgc2V0SWRlbnRpdHkoKQorICAgIHsKKyAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHNpemUoKTsgKytpKQorICAgICAgICBpbmRpY2VzKCkuY29lZmZSZWYoaSkgPSBpOworICAgIH0KKworICAgIC8qKiBTZXRzICp0aGlzIHRvIGJlIHRoZSBpZGVudGl0eSBwZXJtdXRhdGlvbiBtYXRyaXggb2YgZ2l2ZW4gc2l6ZS4KKyAgICAgICovCisgICAgdm9pZCBzZXRJZGVudGl0eShJbmRleCBzaXplKQorICAgIHsKKyAgICAgIHJlc2l6ZShzaXplKTsKKyAgICAgIHNldElkZW50aXR5KCk7CisgICAgfQorCisgICAgLyoqIE11bHRpcGxpZXMgKnRoaXMgYnkgdGhlIHRyYW5zcG9zaXRpb24gXGYkKGlqKVxmJCBvbiB0aGUgbGVmdC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gKnRoaXMuCisgICAgICAqCisgICAgICAqIFx3YXJuaW5nIFRoaXMgaXMgbXVjaCBzbG93ZXIgdGhhbiBhcHBseVRyYW5zcG9zaXRpb25PblRoZVJpZ2h0KGludCxpbnQpOgorICAgICAgKiB0aGlzIGhhcyBsaW5lYXIgY29tcGxleGl0eSBhbmQgcmVxdWlyZXMgYSBsb3Qgb2YgYnJhbmNoaW5nLgorICAgICAgKgorICAgICAgKiBcc2EgYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVSaWdodChpbnQsaW50KQorICAgICAgKi8KKyAgICBEZXJpdmVkJiBhcHBseVRyYW5zcG9zaXRpb25PblRoZUxlZnQoSW5kZXggaSwgSW5kZXggaikKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaT49MCAmJiBqPj0wICYmIGk8c2l6ZSgpICYmIGo8c2l6ZSgpKTsKKyAgICAgIGZvcihJbmRleCBrID0gMDsgayA8IHNpemUoKTsgKytrKQorICAgICAgeworICAgICAgICBpZihpbmRpY2VzKCkuY29lZmYoaykgPT0gaSkgaW5kaWNlcygpLmNvZWZmUmVmKGspID0gajsKKyAgICAgICAgZWxzZSBpZihpbmRpY2VzKCkuY29lZmYoaykgPT0gaikgaW5kaWNlcygpLmNvZWZmUmVmKGspID0gaTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorCisgICAgLyoqIE11bHRpcGxpZXMgKnRoaXMgYnkgdGhlIHRyYW5zcG9zaXRpb24gXGYkKGlqKVxmJCBvbiB0aGUgcmlnaHQuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvICp0aGlzLgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIGEgZmFzdCBvcGVyYXRpb24sIGl0IG9ubHkgY29uc2lzdHMgaW4gc3dhcHBpbmcgdHdvIGluZGljZXMuCisgICAgICAqCisgICAgICAqIFxzYSBhcHBseVRyYW5zcG9zaXRpb25PblRoZUxlZnQoaW50LGludCkKKyAgICAgICovCisgICAgRGVyaXZlZCYgYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVSaWdodChJbmRleCBpLCBJbmRleCBqKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpPj0wICYmIGo+PTAgJiYgaTxzaXplKCkgJiYgajxzaXplKCkpOworICAgICAgc3RkOjpzd2FwKGluZGljZXMoKS5jb2VmZlJlZihpKSwgaW5kaWNlcygpLmNvZWZmUmVmKGopKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIHBlcm11dGF0aW9uIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgXG5vdGVfdHJ5X3RvX2hlbHBfcnZvCisgICAgICAqLworICAgIGlubGluZSBUcmFuc3Bvc2U8UGVybXV0YXRpb25CYXNlPiBpbnZlcnNlKCkgY29uc3QKKyAgICB7IHJldHVybiBkZXJpdmVkKCk7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIHRyYW5wb3NlIHBlcm11dGF0aW9uIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgXG5vdGVfdHJ5X3RvX2hlbHBfcnZvCisgICAgICAqLworICAgIGlubGluZSBUcmFuc3Bvc2U8UGVybXV0YXRpb25CYXNlPiB0cmFuc3Bvc2UoKSBjb25zdAorICAgIHsgcmV0dXJuIGRlcml2ZWQoKTsgfQorCisgICAgLyoqKiogbXVsdGlwbGljYXRpb24gaGVscGVycyB0byBob3BlZnVsbHkgZ2V0IFJWTyAqKioqLworCisgIAorI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICBwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIHZvaWQgYXNzaWduVHJhbnNwb3NlKGNvbnN0IFBlcm11dGF0aW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBmb3IgKGludCBpPTA7IGk8cm93cygpOysraSkgaW5kaWNlcygpLmNvZWZmUmVmKG90aGVyLmluZGljZXMoKS5jb2VmZihpKSkgPSBpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsdHlwZW5hbWUgUmhzPgorICAgIHZvaWQgYXNzaWduUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGxocy5jb2xzKCkgPT0gcmhzLnJvd3MoKSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8cm93cygpOysraSkgaW5kaWNlcygpLmNvZWZmUmVmKGkpID0gbGhzLmluZGljZXMoKS5jb2VmZihyaHMuaW5kaWNlcygpLmNvZWZmKGkpKTsKKyAgICB9CisjZW5kaWYKKworICBwdWJsaWM6CisKKyAgICAvKiogXHJldHVybnMgdGhlIHByb2R1Y3QgcGVybXV0YXRpb24gbWF0cml4LgorICAgICAgKgorICAgICAgKiBcbm90ZSBcbm90ZV90cnlfdG9faGVscF9ydm8KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgaW5saW5lIFBsYWluUGVybXV0YXRpb25UeXBlIG9wZXJhdG9yKihjb25zdCBQZXJtdXRhdGlvbkJhc2U8T3RoZXI+JiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBQbGFpblBlcm11dGF0aW9uVHlwZShpbnRlcm5hbDo6UGVybVBlcm1Qcm9kdWN0LCBkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgcHJvZHVjdCBvZiBhIHBlcm11dGF0aW9uIHdpdGggYW5vdGhlciBpbnZlcnNlIHBlcm11dGF0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBcbm90ZV90cnlfdG9faGVscF9ydm8KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgaW5saW5lIFBsYWluUGVybXV0YXRpb25UeXBlIG9wZXJhdG9yKihjb25zdCBUcmFuc3Bvc2U8UGVybXV0YXRpb25CYXNlPE90aGVyPiA+JiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBQbGFpblBlcm11dGF0aW9uVHlwZShpbnRlcm5hbDo6UGVybVBlcm1Qcm9kdWN0LCAqdGhpcywgb3RoZXIuZXZhbCgpKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwcm9kdWN0IG9mIGFuIGludmVyc2UgcGVybXV0YXRpb24gd2l0aCBhbm90aGVyIHBlcm11dGF0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBcbm90ZV90cnlfdG9faGVscF9ydm8KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+IGZyaWVuZAorICAgIGlubGluZSBQbGFpblBlcm11dGF0aW9uVHlwZSBvcGVyYXRvciooY29uc3QgVHJhbnNwb3NlPFBlcm11dGF0aW9uQmFzZTxPdGhlcj4gPiYgb3RoZXIsIGNvbnN0IFBlcm11dGF0aW9uQmFzZSYgcGVybSkKKyAgICB7IHJldHVybiBQbGFpblBlcm11dGF0aW9uVHlwZShpbnRlcm5hbDo6UGVybVBlcm1Qcm9kdWN0LCBvdGhlci5ldmFsKCksIHBlcm0pOyB9CisKKyAgcHJvdGVjdGVkOgorCit9OworCisvKiogXGNsYXNzIFBlcm11dGF0aW9uTWF0cml4CisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQZXJtdXRhdGlvbiBtYXRyaXgKKyAgKgorICAqIFxwYXJhbSBTaXplQXRDb21waWxlVGltZSB0aGUgbnVtYmVyIG9mIHJvd3MvY29scywgb3IgRHluYW1pYworICAqIFxwYXJhbSBNYXhTaXplQXRDb21waWxlVGltZSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cy9jb2xzLCBvciBEeW5hbWljLiBUaGlzIG9wdGlvbmFsIHBhcmFtZXRlciBkZWZhdWx0cyB0byBTaXplQXRDb21waWxlVGltZS4gTW9zdCBvZiB0aGUgdGltZSwgeW91IHNob3VsZCBub3QgaGF2ZSB0byBzcGVjaWZ5IGl0LgorICAqIFxwYXJhbSBJbmRleFR5cGUgdGhlIGludGVyZ2VyIHR5cGUgb2YgdGhlIGluZGljZXMKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHBlcm11dGF0aW9uIG1hdHJpeCwgaW50ZXJuYWxseSBzdG9yZWQgYXMgYSB2ZWN0b3Igb2YgaW50ZWdlcnMuCisgICoKKyAgKiBcc2EgY2xhc3MgUGVybXV0YXRpb25CYXNlLCBjbGFzcyBQZXJtdXRhdGlvbldyYXBwZXIsIGNsYXNzIERpYWdvbmFsTWF0cml4CisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgU2l6ZUF0Q29tcGlsZVRpbWUsIGludCBNYXhTaXplQXRDb21waWxlVGltZSwgdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RydWN0IHRyYWl0czxQZXJtdXRhdGlvbk1hdHJpeDxTaXplQXRDb21waWxlVGltZSwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIEluZGV4VHlwZT4gPgorIDogdHJhaXRzPE1hdHJpeDxJbmRleFR5cGUsU2l6ZUF0Q29tcGlsZVRpbWUsU2l6ZUF0Q29tcGlsZVRpbWUsMCxNYXhTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZT4gPgoreworICB0eXBlZGVmIEluZGV4VHlwZSBJbmRleDsKKyAgdHlwZWRlZiBNYXRyaXg8SW5kZXhUeXBlLCBTaXplQXRDb21waWxlVGltZSwgMSwgMCwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIDE+IEluZGljZXNUeXBlOworfTsKK30KKwordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIHR5cGVuYW1lIEluZGV4VHlwZT4KK2NsYXNzIFBlcm11dGF0aW9uTWF0cml4IDogcHVibGljIFBlcm11dGF0aW9uQmFzZTxQZXJtdXRhdGlvbk1hdHJpeDxTaXplQXRDb21waWxlVGltZSwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIEluZGV4VHlwZT4gPgoreworICAgIHR5cGVkZWYgUGVybXV0YXRpb25CYXNlPFBlcm11dGF0aW9uTWF0cml4PiBCYXNlOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxQZXJtdXRhdGlvbk1hdHJpeD4gVHJhaXRzOworICBwdWJsaWM6CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICAgICNlbmRpZgorCisgICAgaW5saW5lIFBlcm11dGF0aW9uTWF0cml4KCkKKyAgICB7fQorCisgICAgLyoqIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBwZXJtdXRhdGlvbiBtYXRyaXggb2YgZ2l2ZW4gc2l6ZS4KKyAgICAgICovCisgICAgaW5saW5lIFBlcm11dGF0aW9uTWF0cml4KGludCBzaXplKSA6IG1faW5kaWNlcyhzaXplKQorICAgIHt9CisKKyAgICAvKiogQ29weSBjb25zdHJ1Y3Rvci4gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIFBlcm11dGF0aW9uTWF0cml4KGNvbnN0IFBlcm11dGF0aW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICAgIDogbV9pbmRpY2VzKG90aGVyLmluZGljZXMoKSkge30KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogU3RhbmRhcmQgY29weSBjb25zdHJ1Y3Rvci4gRGVmaW5lZCBvbmx5IHRvIHByZXZlbnQgYSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IKKyAgICAgICogZnJvbSBoaWRpbmcgdGhlIG90aGVyIHRlbXBsYXRlZCBjb25zdHJ1Y3RvciAqLworICAgIGlubGluZSBQZXJtdXRhdGlvbk1hdHJpeChjb25zdCBQZXJtdXRhdGlvbk1hdHJpeCYgb3RoZXIpIDogbV9pbmRpY2VzKG90aGVyLmluZGljZXMoKSkge30KKyAgICAjZW5kaWYKKworICAgIC8qKiBHZW5lcmljIGNvbnN0cnVjdG9yIGZyb20gZXhwcmVzc2lvbiBvZiB0aGUgaW5kaWNlcy4gVGhlIGluZGljZXMKKyAgICAgICogYXJyYXkgaGFzIHRoZSBtZWFuaW5nIHRoYXQgdGhlIHBlcm11dGF0aW9ucyBzZW5kcyBlYWNoIGludGVnZXIgaSB0byBpbmRpY2VzW2ldLgorICAgICAgKgorICAgICAgKiBcd2FybmluZyBJdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGNoZWNrIHRoYXQgdGhlIGluZGljZXMgYXJyYXkgdGhhdCB5b3UgcGFzc2VzIGFjdHVhbGx5CisgICAgICAqIGRlc2NyaWJlcyBhIHBlcm11dGF0aW9uLCBpLmUuLCBlYWNoIHZhbHVlIGJldHdlZW4gMCBhbmQgbi0xIG9jY3VycyBleGFjdGx5IG9uY2UsIHdoZXJlIG4gaXMgdGhlCisgICAgICAqIGFycmF5J3Mgc2l6ZS4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgZXhwbGljaXQgaW5saW5lIFBlcm11dGF0aW9uTWF0cml4KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXI+JiBpbmRpY2VzKSA6IG1faW5kaWNlcyhpbmRpY2VzKQorICAgIHt9CisKKyAgICAvKiogQ29udmVydCB0aGUgVHJhbnNwb3NpdGlvbnMgXGEgdHIgdG8gYSBwZXJtdXRhdGlvbiBtYXRyaXggKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KKyAgICBleHBsaWNpdCBQZXJtdXRhdGlvbk1hdHJpeChjb25zdCBUcmFuc3Bvc2l0aW9uc0Jhc2U8T3RoZXI+JiB0cikKKyAgICAgIDogbV9pbmRpY2VzKHRyLnNpemUoKSkKKyAgICB7CisgICAgICAqdGhpcyA9IHRyOworICAgIH0KKworICAgIC8qKiBDb3BpZXMgdGhlIG90aGVyIHBlcm11dGF0aW9uIGludG8gKnRoaXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KKyAgICBQZXJtdXRhdGlvbk1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IFBlcm11dGF0aW9uQmFzZTxPdGhlcj4mIG90aGVyKQorICAgIHsKKyAgICAgIG1faW5kaWNlcyA9IG90aGVyLmluZGljZXMoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogQXNzaWdubWVudCBmcm9tIHRoZSBUcmFuc3Bvc2l0aW9ucyBcYSB0ciAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorICAgIFBlcm11dGF0aW9uTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgVHJhbnNwb3NpdGlvbnNCYXNlPE90aGVyPiYgdHIpCisgICAgeworICAgICAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPSh0ci5kZXJpdmVkKCkpOworICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICogcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICBQZXJtdXRhdGlvbk1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IFBlcm11dGF0aW9uTWF0cml4JiBvdGhlcikKKyAgICB7CisgICAgICBtX2luZGljZXMgPSBvdGhlci5tX2luZGljZXM7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyoqIGNvbnN0IHZlcnNpb24gb2YgaW5kaWNlcygpLiAqLworICAgIGNvbnN0IEluZGljZXNUeXBlJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBwZXJtdXRhdGlvbi4gKi8KKyAgICBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIHsgcmV0dXJuIG1faW5kaWNlczsgfQorCisKKyAgICAvKioqKiBtdWx0aXBsaWNhdGlvbiBoZWxwZXJzIHRvIGhvcGVmdWxseSBnZXQgUlZPICoqKiovCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KKyAgICBQZXJtdXRhdGlvbk1hdHJpeChjb25zdCBUcmFuc3Bvc2U8UGVybXV0YXRpb25CYXNlPE90aGVyPiA+JiBvdGhlcikKKyAgICAgIDogbV9pbmRpY2VzKG90aGVyLm5lc3RlZFBlcm11dGF0aW9uKCkuc2l6ZSgpKQorICAgIHsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxtX2luZGljZXMuc2l6ZSgpOysraSkgbV9pbmRpY2VzLmNvZWZmUmVmKG90aGVyLm5lc3RlZFBlcm11dGF0aW9uKCkuaW5kaWNlcygpLmNvZWZmKGkpKSA9IGk7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIExocyx0eXBlbmFtZSBSaHM+CisgICAgUGVybXV0YXRpb25NYXRyaXgoaW50ZXJuYWw6OlBlcm1QZXJtUHJvZHVjdF90LCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgICAgICA6IG1faW5kaWNlcyhsaHMuaW5kaWNlcygpLnNpemUoKSkKKyAgICB7CisgICAgICBCYXNlOjphc3NpZ25Qcm9kdWN0KGxocyxyaHMpOworICAgIH0KKyNlbmRpZgorCisgIHByb3RlY3RlZDoKKworICAgIEluZGljZXNUeXBlIG1faW5kaWNlczsKK307CisKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPGludCBTaXplQXRDb21waWxlVGltZSwgaW50IE1heFNpemVBdENvbXBpbGVUaW1lLCB0eXBlbmFtZSBJbmRleFR5cGUsIGludCBfUGFja2V0QWNjZXNzPgorc3RydWN0IHRyYWl0czxNYXA8UGVybXV0YXRpb25NYXRyaXg8U2l6ZUF0Q29tcGlsZVRpbWUsIE1heFNpemVBdENvbXBpbGVUaW1lLCBJbmRleFR5cGU+LF9QYWNrZXRBY2Nlc3M+ID4KKyA6IHRyYWl0czxNYXRyaXg8SW5kZXhUeXBlLFNpemVBdENvbXBpbGVUaW1lLFNpemVBdENvbXBpbGVUaW1lLDAsTWF4U2l6ZUF0Q29tcGlsZVRpbWUsTWF4U2l6ZUF0Q29tcGlsZVRpbWU+ID4KK3sKKyAgdHlwZWRlZiBJbmRleFR5cGUgSW5kZXg7CisgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxJbmRleFR5cGUsIFNpemVBdENvbXBpbGVUaW1lLCAxLCAwLCBNYXhTaXplQXRDb21waWxlVGltZSwgMT4sIF9QYWNrZXRBY2Nlc3M+IEluZGljZXNUeXBlOworfTsKK30KKwordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIHR5cGVuYW1lIEluZGV4VHlwZSwgaW50IF9QYWNrZXRBY2Nlc3M+CitjbGFzcyBNYXA8UGVybXV0YXRpb25NYXRyaXg8U2l6ZUF0Q29tcGlsZVRpbWUsIE1heFNpemVBdENvbXBpbGVUaW1lLCBJbmRleFR5cGU+LF9QYWNrZXRBY2Nlc3M+CisgIDogcHVibGljIFBlcm11dGF0aW9uQmFzZTxNYXA8UGVybXV0YXRpb25NYXRyaXg8U2l6ZUF0Q29tcGlsZVRpbWUsIE1heFNpemVBdENvbXBpbGVUaW1lLCBJbmRleFR5cGU+LF9QYWNrZXRBY2Nlc3M+ID4KK3sKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uQmFzZTxNYXA+IEJhc2U7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPE1hcD4gVHJhaXRzOworICBwdWJsaWM6CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5kaWNlc1R5cGU6OlNjYWxhciBJbmRleDsKKyAgICAjZW5kaWYKKworICAgIGlubGluZSBNYXAoY29uc3QgSW5kZXgqIGluZGljZXMpCisgICAgICA6IG1faW5kaWNlcyhpbmRpY2VzKQorICAgIHt9CisKKyAgICBpbmxpbmUgTWFwKGNvbnN0IEluZGV4KiBpbmRpY2VzLCBJbmRleCBzaXplKQorICAgICAgOiBtX2luZGljZXMoaW5kaWNlcyxzaXplKQorICAgIHt9CisKKyAgICAvKiogQ29waWVzIHRoZSBvdGhlciBwZXJtdXRhdGlvbiBpbnRvICp0aGlzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgTWFwJiBvcGVyYXRvcj0oY29uc3QgUGVybXV0YXRpb25CYXNlPE90aGVyPiYgb3RoZXIpCisgICAgeyByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KG90aGVyLmRlcml2ZWQoKSk7IH0KKworICAgIC8qKiBBc3NpZ25tZW50IGZyb20gdGhlIFRyYW5zcG9zaXRpb25zIFxhIHRyICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgTWFwJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNwb3NpdGlvbnNCYXNlPE90aGVyPiYgdHIpCisgICAgeyByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KHRyLmRlcml2ZWQoKSk7IH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICogcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICBNYXAmIG9wZXJhdG9yPShjb25zdCBNYXAmIG90aGVyKQorICAgIHsKKyAgICAgIG1faW5kaWNlcyA9IG90aGVyLm1faW5kaWNlczsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvKiogY29uc3QgdmVyc2lvbiBvZiBpbmRpY2VzKCkuICovCisgICAgY29uc3QgSW5kaWNlc1R5cGUmIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX2luZGljZXM7IH0KKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHN0b3JlZCBhcnJheSByZXByZXNlbnRpbmcgdGhlIHBlcm11dGF0aW9uLiAqLworICAgIEluZGljZXNUeXBlJiBpbmRpY2VzKCkgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgSW5kaWNlc1R5cGUgbV9pbmRpY2VzOworfTsKKworLyoqIFxjbGFzcyBQZXJtdXRhdGlvbldyYXBwZXIKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIENsYXNzIHRvIHZpZXcgYSB2ZWN0b3Igb2YgaW50ZWdlcnMgYXMgYSBwZXJtdXRhdGlvbiBtYXRyaXgKKyAgKgorICAqIFxwYXJhbSBfSW5kaWNlc1R5cGUgdGhlIHR5cGUgb2YgdGhlIHZlY3RvciBvZiBpbnRlZ2VyIChjYW4gYmUgYW55IGNvbXBhdGlibGUgZXhwcmVzc2lvbikKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHZpZXcgYW55IHZlY3RvciBleHByZXNzaW9uIG9mIGludGVnZXJzIGFzIGEgcGVybXV0YXRpb24gbWF0cml4LgorICAqCisgICogXHNhIGNsYXNzIFBlcm11dGF0aW9uQmFzZSwgY2xhc3MgUGVybXV0YXRpb25NYXRyaXgKKyAgKi8KKworc3RydWN0IFBlcm11dGF0aW9uU3RvcmFnZSB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0luZGljZXNUeXBlPiBjbGFzcyBUcmFuc3Bvc2l0aW9uc1dyYXBwZXI7CituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX0luZGljZXNUeXBlPgorc3RydWN0IHRyYWl0czxQZXJtdXRhdGlvbldyYXBwZXI8X0luZGljZXNUeXBlPiA+Cit7CisgIHR5cGVkZWYgUGVybXV0YXRpb25TdG9yYWdlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIF9JbmRpY2VzVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSW5kaWNlc1R5cGU6OlNjYWxhciBJbmRleDsKKyAgdHlwZWRlZiBfSW5kaWNlc1R5cGUgSW5kaWNlc1R5cGU7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gX0luZGljZXNUeXBlOjpTaXplQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IF9JbmRpY2VzVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBJbmRpY2VzVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBJbmRpY2VzVHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgRmxhZ3MgPSAwLAorICAgIENvZWZmUmVhZENvc3QgPSBfSW5kaWNlc1R5cGU6OkNvZWZmUmVhZENvc3QKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9JbmRpY2VzVHlwZT4KK2NsYXNzIFBlcm11dGF0aW9uV3JhcHBlciA6IHB1YmxpYyBQZXJtdXRhdGlvbkJhc2U8UGVybXV0YXRpb25XcmFwcGVyPF9JbmRpY2VzVHlwZT4gPgoreworICAgIHR5cGVkZWYgUGVybXV0YXRpb25CYXNlPFBlcm11dGF0aW9uV3JhcHBlcj4gQmFzZTsKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8UGVybXV0YXRpb25XcmFwcGVyPiBUcmFpdHM7CisgIHB1YmxpYzoKKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6SW5kaWNlc1R5cGUgSW5kaWNlc1R5cGU7CisgICAgI2VuZGlmCisKKyAgICBpbmxpbmUgUGVybXV0YXRpb25XcmFwcGVyKGNvbnN0IEluZGljZXNUeXBlJiBpbmRpY2VzKQorICAgICAgOiBtX2luZGljZXMoaW5kaWNlcykKKyAgICB7fQorCisgICAgLyoqIGNvbnN0IHZlcnNpb24gb2YgaW5kaWNlcygpLiAqLworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIEluZGljZXNUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX2luZGljZXM7IH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICB0eXBlbmFtZSBJbmRpY2VzVHlwZTo6TmVzdGVkIG1faW5kaWNlczsKK307CisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHdpdGggdGhlIHBlcm11dGF0aW9uIGFwcGxpZWQgdG8gdGhlIGNvbHVtbnMuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBQZXJtdXRhdGlvbkRlcml2ZWQ+CitpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnBlcm11dF9tYXRyaXhfcHJvZHVjdF9yZXR2YWw8UGVybXV0YXRpb25EZXJpdmVkLCBEZXJpdmVkLCBPblRoZVJpZ2h0Pgorb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdHJpeCwKKyAgICAgICAgICBjb25zdCBQZXJtdXRhdGlvbkJhc2U8UGVybXV0YXRpb25EZXJpdmVkPiAmcGVybXV0YXRpb24pCit7CisgIHJldHVybiBpbnRlcm5hbDo6cGVybXV0X21hdHJpeF9wcm9kdWN0X3JldHZhbAorICAgICAgICAgICA8UGVybXV0YXRpb25EZXJpdmVkLCBEZXJpdmVkLCBPblRoZVJpZ2h0PgorICAgICAgICAgICAocGVybXV0YXRpb24uZGVyaXZlZCgpLCBtYXRyaXguZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggd2l0aCB0aGUgcGVybXV0YXRpb24gYXBwbGllZCB0byB0aGUgcm93cy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIFBlcm11dGF0aW9uRGVyaXZlZD4KK2lubGluZSBjb25zdCBpbnRlcm5hbDo6cGVybXV0X21hdHJpeF9wcm9kdWN0X3JldHZhbAorICAgICAgICAgICAgICAgPFBlcm11dGF0aW9uRGVyaXZlZCwgRGVyaXZlZCwgT25UaGVMZWZ0Pgorb3BlcmF0b3IqKGNvbnN0IFBlcm11dGF0aW9uQmFzZTxQZXJtdXRhdGlvbkRlcml2ZWQ+ICZwZXJtdXRhdGlvbiwKKyAgICAgICAgICBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtYXRyaXgpCit7CisgIHJldHVybiBpbnRlcm5hbDo6cGVybXV0X21hdHJpeF9wcm9kdWN0X3JldHZhbAorICAgICAgICAgICA8UGVybXV0YXRpb25EZXJpdmVkLCBEZXJpdmVkLCBPblRoZUxlZnQ+CisgICAgICAgICAgIChwZXJtdXRhdGlvbi5kZXJpdmVkKCksIG1hdHJpeC5kZXJpdmVkKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQZXJtdXRhdGlvblR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBTaWRlLCBib29sIFRyYW5zcG9zZWQ+CitzdHJ1Y3QgdHJhaXRzPHBlcm11dF9tYXRyaXhfcHJvZHVjdF9yZXR2YWw8UGVybXV0YXRpb25UeXBlLCBNYXRyaXhUeXBlLCBTaWRlLCBUcmFuc3Bvc2VkPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBlcm11dGF0aW9uVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFNpZGUsIGJvb2wgVHJhbnNwb3NlZD4KK3N0cnVjdCBwZXJtdXRfbWF0cml4X3Byb2R1Y3RfcmV0dmFsCisgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxwZXJtdXRfbWF0cml4X3Byb2R1Y3RfcmV0dmFsPFBlcm11dGF0aW9uVHlwZSwgTWF0cml4VHlwZSwgU2lkZSwgVHJhbnNwb3NlZD4gPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOworCisgICAgcGVybXV0X21hdHJpeF9wcm9kdWN0X3JldHZhbChjb25zdCBQZXJtdXRhdGlvblR5cGUmIHBlcm0sIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogbV9wZXJtdXRhdGlvbihwZXJtKSwgbV9tYXRyaXgobWF0cml4KQorICAgIHt9CisKKyAgICBpbmxpbmUgaW50IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgICBpbmxpbmUgaW50IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgaW50IG4gPSBTaWRlPT1PblRoZUxlZnQgPyByb3dzKCkgOiBjb2xzKCk7CisKKyAgICAgIGlmKGlzX3NhbWU8TWF0cml4VHlwZU5lc3RlZENsZWFuZWQsRGVzdD46OnZhbHVlICYmIGV4dHJhY3RfZGF0YShkc3QpID09IGV4dHJhY3RfZGF0YShtX21hdHJpeCkpCisgICAgICB7CisgICAgICAgIC8vIGFwcGx5IHRoZSBwZXJtdXRhdGlvbiBpbnBsYWNlCisgICAgICAgIE1hdHJpeDxib29sLFBlcm11dGF0aW9uVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsMSwwLFBlcm11dGF0aW9uVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWU+IG1hc2sobV9wZXJtdXRhdGlvbi5zaXplKCkpOworICAgICAgICBtYXNrLmZpbGwoZmFsc2UpOworICAgICAgICBpbnQgciA9IDA7CisgICAgICAgIHdoaWxlKHIgPCBtX3Blcm11dGF0aW9uLnNpemUoKSkKKyAgICAgICAgeworICAgICAgICAgIC8vIHNlYXJjaCBmb3IgdGhlIG5leHQgc2VlZAorICAgICAgICAgIHdoaWxlKHI8bV9wZXJtdXRhdGlvbi5zaXplKCkgJiYgbWFza1tyXSkgcisrOworICAgICAgICAgIGlmKHI+PW1fcGVybXV0YXRpb24uc2l6ZSgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgLy8gd2UgZ290IG9uZSwgbGV0J3MgZm9sbG93IGl0IHVudGlsIHdlIGFyZSBiYWNrIHRvIHRoZSBzZWVkCisgICAgICAgICAgaW50IGswID0gcisrOworICAgICAgICAgIGludCBrUHJldiA9IGswOworICAgICAgICAgIG1hc2suY29lZmZSZWYoazApID0gdHJ1ZTsKKyAgICAgICAgICBmb3IoaW50IGs9bV9wZXJtdXRhdGlvbi5pbmRpY2VzKCkuY29lZmYoazApOyBrIT1rMDsgaz1tX3Blcm11dGF0aW9uLmluZGljZXMoKS5jb2VmZihrKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBCbG9jazxEZXN0LCBTaWRlPT1PblRoZUxlZnQgPyAxIDogRGVzdDo6Um93c0F0Q29tcGlsZVRpbWUsIFNpZGU9PU9uVGhlUmlnaHQgPyAxIDogRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWU+KGRzdCwgaykKKyAgICAgICAgICAgIC5zd2FwKEJsb2NrPERlc3QsIFNpZGU9PU9uVGhlTGVmdCA/IDEgOiBEZXN0OjpSb3dzQXRDb21waWxlVGltZSwgU2lkZT09T25UaGVSaWdodCA/IDEgOiBEZXN0OjpDb2xzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgICAgKGRzdCwoKFNpZGU9PU9uVGhlTGVmdCkgXiBUcmFuc3Bvc2VkKSA/IGswIDoga1ByZXYpKTsKKworICAgICAgICAgICAgbWFzay5jb2VmZlJlZihrKSA9IHRydWU7CisgICAgICAgICAgICBrUHJldiA9IGs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICBCbG9jazxEZXN0LCBTaWRlPT1PblRoZUxlZnQgPyAxIDogRGVzdDo6Um93c0F0Q29tcGlsZVRpbWUsIFNpZGU9PU9uVGhlUmlnaHQgPyAxIDogRGVzdDo6Q29sc0F0Q29tcGlsZVRpbWU+CisgICAgICAgICAgICAgICAoZHN0LCAoKFNpZGU9PU9uVGhlTGVmdCkgXiBUcmFuc3Bvc2VkKSA/IG1fcGVybXV0YXRpb24uaW5kaWNlcygpLmNvZWZmKGkpIDogaSkKKworICAgICAgICAgID0KKworICAgICAgICAgIEJsb2NrPGNvbnN0IE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkLFNpZGU9PU9uVGhlTGVmdCA/IDEgOiBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSxTaWRlPT1PblRoZVJpZ2h0ID8gMSA6IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPgorICAgICAgICAgICAgICAgKG1fbWF0cml4LCAoKFNpZGU9PU9uVGhlUmlnaHQpIF4gVHJhbnNwb3NlZCkgPyBtX3Blcm11dGF0aW9uLmluZGljZXMoKS5jb2VmZihpKSA6IGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBQZXJtdXRhdGlvblR5cGUmIG1fcGVybXV0YXRpb247CisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fbWF0cml4OworfTsKKworLyogVGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgdHJhbnNwb3NlZC9pbnZlcnNlIHBlcm11dGF0aW9ucyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHRyYWl0czxUcmFuc3Bvc2U8UGVybXV0YXRpb25CYXNlPERlcml2ZWQ+ID4gPgorIDogdHJhaXRzPERlcml2ZWQ+Cit7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBUcmFuc3Bvc2U8UGVybXV0YXRpb25CYXNlPERlcml2ZWQ+ID4KKyAgOiBwdWJsaWMgRWlnZW5CYXNlPFRyYW5zcG9zZTxQZXJtdXRhdGlvbkJhc2U8RGVyaXZlZD4gPiA+Cit7CisgICAgdHlwZWRlZiBEZXJpdmVkIFBlcm11dGF0aW9uVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFBlcm11dGF0aW9uVHlwZTo6SW5kaWNlc1R5cGUgSW5kaWNlc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQZXJtdXRhdGlvblR5cGU6OlBsYWluUGVybXV0YXRpb25UeXBlIFBsYWluUGVybXV0YXRpb25UeXBlOworICBwdWJsaWM6CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFBlcm11dGF0aW9uVHlwZT4gVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6RGVuc2VNYXRyaXhUeXBlIERlbnNlTWF0cml4VHlwZTsKKyAgICBlbnVtIHsKKyAgICAgIEZsYWdzID0gVHJhaXRzOjpGbGFncywKKyAgICAgIENvZWZmUmVhZENvc3QgPSBUcmFpdHM6OkNvZWZmUmVhZENvc3QsCisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IFRyYWl0czo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IFRyYWl0czo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IFRyYWl0czo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IFRyYWl0czo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpTY2FsYXIgU2NhbGFyOworICAgICNlbmRpZgorCisgICAgVHJhbnNwb3NlKGNvbnN0IFBlcm11dGF0aW9uVHlwZSYgcCkgOiBtX3Blcm11dGF0aW9uKHApIHt9CisKKyAgICBpbmxpbmUgaW50IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Blcm11dGF0aW9uLnJvd3MoKTsgfQorICAgIGlubGluZSBpbnQgY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcGVybXV0YXRpb24uY29scygpOyB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VEZXJpdmVkPgorICAgIHZvaWQgZXZhbFRvKE1hdHJpeEJhc2U8RGVuc2VEZXJpdmVkPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgb3RoZXIuc2V0WmVybygpOworICAgICAgZm9yIChpbnQgaT0wOyBpPHJvd3MoKTsrK2kpCisgICAgICAgIG90aGVyLmNvZWZmUmVmKGksIG1fcGVybXV0YXRpb24uaW5kaWNlcygpLmNvZWZmKGkpKSA9IHR5cGVuYW1lIERlbnNlRGVyaXZlZDo6U2NhbGFyKDEpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBccmV0dXJuIHRoZSBlcXVpdmFsZW50IHBlcm11dGF0aW9uIG1hdHJpeCAqLworICAgIFBsYWluUGVybXV0YXRpb25UeXBlIGV2YWwoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgRGVuc2VNYXRyaXhUeXBlIHRvRGVuc2VNYXRyaXgoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggd2l0aCB0aGUgaW52ZXJzZSBwZXJtdXRhdGlvbiBhcHBsaWVkIHRvIHRoZSBjb2x1bW5zLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGZyaWVuZAorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6cGVybXV0X21hdHJpeF9wcm9kdWN0X3JldHZhbDxQZXJtdXRhdGlvblR5cGUsIE90aGVyRGVyaXZlZCwgT25UaGVSaWdodCwgdHJ1ZT4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBtYXRyaXgsIGNvbnN0IFRyYW5zcG9zZSYgdHJQZXJtKQorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cGVybXV0X21hdHJpeF9wcm9kdWN0X3JldHZhbDxQZXJtdXRhdGlvblR5cGUsIE90aGVyRGVyaXZlZCwgT25UaGVSaWdodCwgdHJ1ZT4odHJQZXJtLm1fcGVybXV0YXRpb24sIG1hdHJpeC5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbWF0cml4IHdpdGggdGhlIGludmVyc2UgcGVybXV0YXRpb24gYXBwbGllZCB0byB0aGUgcm93cy4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6cGVybXV0X21hdHJpeF9wcm9kdWN0X3JldHZhbDxQZXJtdXRhdGlvblR5cGUsIE90aGVyRGVyaXZlZCwgT25UaGVMZWZ0LCB0cnVlPgorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG1hdHJpeCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBlcm11dF9tYXRyaXhfcHJvZHVjdF9yZXR2YWw8UGVybXV0YXRpb25UeXBlLCBPdGhlckRlcml2ZWQsIE9uVGhlTGVmdCwgdHJ1ZT4obV9wZXJtdXRhdGlvbiwgbWF0cml4LmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgY29uc3QgUGVybXV0YXRpb25UeXBlJiBuZXN0ZWRQZXJtdXRhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fcGVybXV0YXRpb247IH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgUGVybXV0YXRpb25UeXBlJiBtX3Blcm11dGF0aW9uOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IFBlcm11dGF0aW9uV3JhcHBlcjxjb25zdCBEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+Ojphc1Blcm11dGF0aW9uKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QRVJNVVRBVElPTk1BVFJJWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9QbGFpbk9iamVjdEJhc2UuaCBiL0VpZ2VuL3NyYy9Db3JlL1BsYWluT2JqZWN0QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYzc0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9QbGFpbk9iamVjdEJhc2UuaApAQCAtMCwwICsxLDc2NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9ERU5TRVNUT1JBR0VCQVNFX0gKKyNkZWZpbmUgRUlHRU5fREVOU0VTVE9SQUdFQkFTRV9ICisKKyNpZmRlZiBFSUdFTl9JTklUSUFMSVpFX01BVFJJQ0VTX0JZX1pFUk8KKyMgZGVmaW5lIEVJR0VOX0lOSVRJQUxJWkVfQllfWkVST19JRl9USEFUX09QVElPTl9JU19FTkFCTEVEIGZvcihpbnQgaT0wO2k8YmFzZSgpLnNpemUoKTsrK2kpIGNvZWZmUmVmKGkpPVNjYWxhcigwKTsKKyNlbHNlCisjIGRlZmluZSBFSUdFTl9JTklUSUFMSVpFX0JZX1pFUk9fSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4PgorRUlHRU5fQUxXQVlTX0lOTElORSB2b2lkIGNoZWNrX3Jvd3NfY29sc19mb3Jfb3ZlcmZsb3coSW5kZXggcm93cywgSW5kZXggY29scykKK3sKKyAgLy8gaHR0cDovL2hnLm1vemlsbGEub3JnL21vemlsbGEtY2VudHJhbC9maWxlLzZjOGE5MDk5NzdkMy94cGNvbS9kcy9DaGVja2VkSW50LmgjbDI0MgorICAvLyB3ZSBhc3N1bWUgSW5kZXggaXMgc2lnbmVkCisgIEluZGV4IG1heF9pbmRleCA9IChzaXplX3QoMSkgPDwgKDggKiBzaXplb2YoSW5kZXgpIC0gMSkpIC0gMTsgLy8gYXNzdW1lIEluZGV4IGlzIHNpZ25lZAorICBib29sIGVycm9yID0gKHJvd3MgPCAwICB8fCBjb2xzIDwgMCkgID8gdHJ1ZQorICAgICAgICAgICAgIDogKHJvd3MgPT0gMCB8fCBjb2xzID09IDApID8gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChyb3dzID4gbWF4X2luZGV4IC8gY29scyk7CisgIGlmIChlcnJvcikKKyAgICB0aHJvd19zdGRfYmFkX2FsbG9jKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQgPSBEZXJpdmVkLCBib29sIElzVmVjdG9yID0gYm9vbChEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpPiBzdHJ1Y3QgY29uc2VydmF0aXZlX3Jlc2l6ZV9saWtlX2ltcGw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGVBLCB0eXBlbmFtZSBNYXRyaXhUeXBlQiwgYm9vbCBTd2FwUG9pbnRlcnM+IHN0cnVjdCBtYXRyaXhfc3dhcF9pbXBsOworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxjbGFzcyBQbGFpbk9iamVjdEJhc2UKKyAgKiBcYnJpZWYgJURlbnNlIHN0b3JhZ2UgYmFzZSBjbGFzcyBmb3IgbWF0cmljZXMgYW5kIGFycmF5cy4KKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nRWlnZW4gYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fUExBSU5PQkpFQ1RCQVNFX1BMVUdJTi4KKyAgKgorICAqIFxzYSBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgKi8KKyNpZmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gdGhpcyBpcyBhIHdhcmthcm91bmQgdG8gZG94eWdlbiBub3QgYmVpbmcgYWJsZSB0byB1bmRlcnN0YW5kIHRoZSBpbmhlcml0ZW5jZSBsb2dpYworLy8gd2hlbiBpdCBpcyBoaWRkZW4gYnkgdGhlIGRlbnNlX3hwcl9iYXNlIGhlbHBlciBzdHJ1Y3QuCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgZGVuc2VfeHByX2Jhc2VfZGlzcGF0Y2hlcl9mb3JfZG94eWdlbjsvLyA6IHB1YmxpYyBNYXRyaXhCYXNlPERlcml2ZWQ+IHt9OworLyoqIFRoaXMgY2xhc3MgaXMganVzdCBhIHdvcmthcm91bmQgZm9yIERveHlnZW4gYW5kIGl0IGRvZXMgbm90IG5vdCBhY3R1YWxseSBleGlzdC4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX09wdGlvbnMsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgorc3RydWN0IGRlbnNlX3hwcl9iYXNlX2Rpc3BhdGNoZXJfZm9yX2RveHlnZW48TWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4gPgorICAgIDogcHVibGljIE1hdHJpeEJhc2U8TWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4gPiB7fTsKKy8qKiBUaGlzIGNsYXNzIGlzIGp1c3QgYSB3b3JrYXJvdW5kIGZvciBEb3h5Z2VuIGFuZCBpdCBkb2VzIG5vdCBub3QgYWN0dWFsbHkgZXhpc3QuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9PcHRpb25zLCBpbnQgX01heFJvd3MsIGludCBfTWF4Q29scz4KK3N0cnVjdCBkZW5zZV94cHJfYmFzZV9kaXNwYXRjaGVyX2Zvcl9kb3h5Z2VuPEFycmF5PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4gPgorICAgIDogcHVibGljIEFycmF5QmFzZTxBcnJheTxfU2NhbGFyLCBfUm93cywgX0NvbHMsIF9PcHRpb25zLCBfTWF4Um93cywgX01heENvbHM+ID4ge307CisKK30gLy8gbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBQbGFpbk9iamVjdEJhc2UgOiBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlX2Rpc3BhdGNoZXJfZm9yX2RveHlnZW48RGVyaXZlZD4KKyNlbHNlCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3MgUGxhaW5PYmplY3RCYXNlIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxEZXJpdmVkPjo6dHlwZQorI2VuZGlmCit7CisgIHB1YmxpYzoKKyAgICBlbnVtIHsgT3B0aW9ucyA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok9wdGlvbnMgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxEZXJpdmVkPjo6dHlwZSBCYXNlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0U2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIERlcml2ZWQgRGVuc2VUeXBlOworCisgICAgdXNpbmcgQmFzZTo6Um93c0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6Q29sc0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6TWF4Um93c0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWU7CisgICAgdXNpbmcgQmFzZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lOworICAgIHVzaW5nIEJhc2U6OkZsYWdzOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLCBpbnQgTWFwT3B0aW9ucywgdHlwZW5hbWUgU3RyaWRlVHlwZT4gZnJpZW5kIGNsYXNzIEVpZ2VuOjpNYXA7CisgICAgZnJpZW5kICBjbGFzcyBFaWdlbjo6TWFwPERlcml2ZWQsIFVuYWxpZ25lZD47CisgICAgdHlwZWRlZiBFaWdlbjo6TWFwPERlcml2ZWQsIFVuYWxpZ25lZD4gIE1hcFR5cGU7CisgICAgZnJpZW5kICBjbGFzcyBFaWdlbjo6TWFwPGNvbnN0IERlcml2ZWQsIFVuYWxpZ25lZD47CisgICAgdHlwZWRlZiBjb25zdCBFaWdlbjo6TWFwPGNvbnN0IERlcml2ZWQsIFVuYWxpZ25lZD4gQ29uc3RNYXBUeXBlOworICAgIGZyaWVuZCAgY2xhc3MgRWlnZW46Ok1hcDxEZXJpdmVkLCBBbGlnbmVkPjsKKyAgICB0eXBlZGVmIEVpZ2VuOjpNYXA8RGVyaXZlZCwgQWxpZ25lZD4gQWxpZ25lZE1hcFR5cGU7CisgICAgZnJpZW5kICBjbGFzcyBFaWdlbjo6TWFwPGNvbnN0IERlcml2ZWQsIEFsaWduZWQ+OworICAgIHR5cGVkZWYgY29uc3QgRWlnZW46Ok1hcDxjb25zdCBEZXJpdmVkLCBBbGlnbmVkPiBDb25zdEFsaWduZWRNYXBUeXBlOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmlkZVR5cGU+IHN0cnVjdCBTdHJpZGVkTWFwVHlwZSB7IHR5cGVkZWYgRWlnZW46Ok1hcDxEZXJpdmVkLCBVbmFsaWduZWQsIFN0cmlkZVR5cGU+IHR5cGU7IH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RyaWRlVHlwZT4gc3RydWN0IFN0cmlkZWRDb25zdE1hcFR5cGUgeyB0eXBlZGVmIEVpZ2VuOjpNYXA8Y29uc3QgRGVyaXZlZCwgVW5hbGlnbmVkLCBTdHJpZGVUeXBlPiB0eXBlOyB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmlkZVR5cGU+IHN0cnVjdCBTdHJpZGVkQWxpZ25lZE1hcFR5cGUgeyB0eXBlZGVmIEVpZ2VuOjpNYXA8RGVyaXZlZCwgQWxpZ25lZCwgU3RyaWRlVHlwZT4gdHlwZTsgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJpZGVUeXBlPiBzdHJ1Y3QgU3RyaWRlZENvbnN0QWxpZ25lZE1hcFR5cGUgeyB0eXBlZGVmIEVpZ2VuOjpNYXA8Y29uc3QgRGVyaXZlZCwgQWxpZ25lZCwgU3RyaWRlVHlwZT4gdHlwZTsgfTsKKworICBwcm90ZWN0ZWQ6CisgICAgRGVuc2VTdG9yYWdlPFNjYWxhciwgQmFzZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUsIEJhc2U6OlJvd3NBdENvbXBpbGVUaW1lLCBCYXNlOjpDb2xzQXRDb21waWxlVGltZSwgT3B0aW9ucz4gbV9zdG9yYWdlOworCisgIHB1YmxpYzoKKyAgICBlbnVtIHsgTmVlZHNUb0FsaWduID0gU2l6ZUF0Q29tcGlsZVRpbWUgIT0gRHluYW1pYyAmJiAoaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MgJiBBbGlnbmVkQml0KSAhPSAwIH07CisgICAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRihOZWVkc1RvQWxpZ24pCisKKyAgICBCYXNlJiBiYXNlKCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PEJhc2UqPih0aGlzKTsgfQorICAgIGNvbnN0IEJhc2UmIGJhc2UoKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgQmFzZSo+KHRoaXMpOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3N0b3JhZ2Uucm93cygpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9zdG9yYWdlLmNvbHMoKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIGlmKEZsYWdzICYgUm93TWFqb3JCaXQpCisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2NvbCArIHJvdyAqIG1fc3RvcmFnZS5jb2xzKCldOworICAgICAgZWxzZSAvLyBjb2x1bW4tbWFqb3IKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbcm93ICsgY29sICogbV9zdG9yYWdlLnJvd3MoKV07CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW2luZGV4XTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgaWYoRmxhZ3MgJiBSb3dNYWpvckJpdCkKKyAgICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbY29sICsgcm93ICogbV9zdG9yYWdlLmNvbHMoKV07CisgICAgICBlbHNlIC8vIGNvbHVtbi1tYWpvcgorICAgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtyb3cgKyBjb2wgKiBtX3N0b3JhZ2Uucm93cygpXTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeworICAgICAgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKClbaW5kZXhdOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBpZihGbGFncyAmIFJvd01ham9yQml0KQorICAgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtjb2wgKyByb3cgKiBtX3N0b3JhZ2UuY29scygpXTsKKyAgICAgIGVsc2UgLy8gY29sdW1uLW1ham9yCisgICAgICAgIHJldHVybiBtX3N0b3JhZ2UuZGF0YSgpW3JvdyArIGNvbCAqIG1fc3RvcmFnZS5yb3dzKCldOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKVtpbmRleF07CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFNjYWxhciBwYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZHQ8UGFja2V0U2NhbGFyLCBMb2FkTW9kZT4KKyAgICAgICAgICAgICAgIChtX3N0b3JhZ2UuZGF0YSgpICsgKEZsYWdzICYgUm93TWFqb3JCaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2wgKyByb3cgKiBtX3N0b3JhZ2UuY29scygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcm93ICsgY29sICogbV9zdG9yYWdlLnJvd3MoKSkpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cGxvYWR0PFBhY2tldFNjYWxhciwgTG9hZE1vZGU+KG1fc3RvcmFnZS5kYXRhKCkgKyBpbmRleCk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPGludCBTdG9yZU1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgaW50ZXJuYWw6OnBzdG9yZXQ8U2NhbGFyLCBQYWNrZXRTY2FsYXIsIFN0b3JlTW9kZT4KKyAgICAgICAgICAgICAgKG1fc3RvcmFnZS5kYXRhKCkgKyAoRmxhZ3MgJiBSb3dNYWpvckJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbCArIHJvdyAqIG1fc3RvcmFnZS5jb2xzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByb3cgKyBjb2wgKiBtX3N0b3JhZ2Uucm93cygpKSwgeCk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPGludCBTdG9yZU1vZGU+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHdyaXRlUGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBQYWNrZXRTY2FsYXImIHgpCisgICAgeworICAgICAgaW50ZXJuYWw6OnBzdG9yZXQ8U2NhbGFyLCBQYWNrZXRTY2FsYXIsIFN0b3JlTW9kZT4obV9zdG9yYWdlLmRhdGEoKSArIGluZGV4LCB4KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBkYXRhIGFycmF5IG9mIHRoaXMgbWF0cml4ICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgKmRhdGEoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fc3RvcmFnZS5kYXRhKCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgYXJyYXkgb2YgdGhpcyBtYXRyaXggKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciAqZGF0YSgpCisgICAgeyByZXR1cm4gbV9zdG9yYWdlLmRhdGEoKTsgfQorCisgICAgLyoqIFJlc2l6ZXMgXGMgKnRoaXMgdG8gYSBcYSByb3dzIHggXGEgY29scyBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBkeW5hbWljLXNpemUgbWF0cmljZXMsIGFsdGhvdWdoIGl0IGlzIGxlZ2FsIHRvIGNhbGwgaXQgb24gYW55CisgICAgICAqIG1hdHJpeCBhcyBsb25nIGFzIGZpeGVkIGRpbWVuc2lvbnMgYXJlIGxlZnQgdW5jaGFuZ2VkLiBJZiB5b3Ugb25seSB3YW50IHRvIGNoYW5nZSB0aGUgbnVtYmVyCisgICAgICAqIG9mIHJvd3MgYW5kL29yIG9mIGNvbHVtbnMsIHlvdSBjYW4gdXNlIHJlc2l6ZShOb0NoYW5nZV90LCBJbmRleCksIHJlc2l6ZShJbmRleCwgTm9DaGFuZ2VfdCkuCisgICAgICAqCisgICAgICAqIElmIHRoZSBjdXJyZW50IG51bWJlciBvZiBjb2VmZmljaWVudHMgb2YgXGMgKnRoaXMgZXhhY3RseSBtYXRjaGVzIHRoZQorICAgICAgKiBwcm9kdWN0IFxhIHJvd3MgKiBcYSBjb2xzLCB0aGVuIG5vIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHBlcmZvcm1lZCBhbmQKKyAgICAgICogdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSBsZWZ0IHVuY2hhbmdlZC4gSW4gYWxsIG90aGVyIGNhc2VzLCBpbmNsdWRpbmcKKyAgICAgICogc2hyaW5raW5nLCB0aGUgZGF0YSBpcyByZWFsbG9jYXRlZCBhbmQgYWxsIHByZXZpb3VzIHZhbHVlcyBhcmUgbG9zdC4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3Jlc2l6ZV9pbnRfaW50LmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhfcmVzaXplX2ludF9pbnQub3V0CisgICAgICAqCisgICAgICAqIFxzYSByZXNpemUoSW5kZXgpIGZvciB2ZWN0b3JzLCByZXNpemUoTm9DaGFuZ2VfdCwgSW5kZXgpLCByZXNpemUoSW5kZXgsIE5vQ2hhbmdlX3QpCisgICAgICAqLworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZXNpemUoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICAjaWZkZWYgRUlHRU5fSU5JVElBTElaRV9NQVRSSUNFU19CWV9aRVJPCisgICAgICAgIGludGVybmFsOjpjaGVja19yb3dzX2NvbHNfZm9yX292ZXJmbG93KHJvd3MsIGNvbHMpOworICAgICAgICBJbmRleCBzaXplID0gcm93cypjb2xzOworICAgICAgICBib29sIHNpemVfY2hhbmdlZCA9IHNpemUgIT0gdGhpcy0+c2l6ZSgpOworICAgICAgICBtX3N0b3JhZ2UucmVzaXplKHNpemUsIHJvd3MsIGNvbHMpOworICAgICAgICBpZihzaXplX2NoYW5nZWQpIEVJR0VOX0lOSVRJQUxJWkVfQllfWkVST19JRl9USEFUX09QVElPTl9JU19FTkFCTEVECisgICAgICAjZWxzZQorICAgICAgICBpbnRlcm5hbDo6Y2hlY2tfcm93c19jb2xzX2Zvcl9vdmVyZmxvdyhyb3dzLCBjb2xzKTsKKyAgICAgICAgbV9zdG9yYWdlLnJlc2l6ZShyb3dzKmNvbHMsIHJvd3MsIGNvbHMpOworICAgICAgI2VuZGlmCisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgXGMgKnRoaXMgdG8gYSB2ZWN0b3Igb2YgbGVuZ3RoIFxhIHNpemUKKyAgICAgICoKKyAgICAgICogXG9ubHlfZm9yX3ZlY3RvcnMuIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgZm9yCisgICAgICAqIHBhcnRpYWxseSBkeW5hbWljIG1hdHJpY2VzIHdoZW4gdGhlIHN0YXRpYyBkaW1lbnNpb24gaXMgYW55dGhpbmcgb3RoZXIKKyAgICAgICogdGhhbiAxLiBGb3IgZXhhbXBsZSBpdCB3aWxsIG5vdCB3b3JrIHdpdGggTWF0cml4PGRvdWJsZSwgMiwgRHluYW1pYz4uCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeF9yZXNpemVfaW50LmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhfcmVzaXplX2ludC5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIHJlc2l6ZShJbmRleCxJbmRleCksIHJlc2l6ZShOb0NoYW5nZV90LCBJbmRleCksIHJlc2l6ZShJbmRleCwgTm9DaGFuZ2VfdCkKKyAgICAgICovCisgICAgaW5saW5lIHZvaWQgcmVzaXplKEluZGV4IHNpemUpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShQbGFpbk9iamVjdEJhc2UpCisgICAgICBlaWdlbl9hc3NlcnQoU2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyB8fCBTaXplQXRDb21waWxlVGltZSA9PSBzaXplKTsKKyAgICAgICNpZmRlZiBFSUdFTl9JTklUSUFMSVpFX01BVFJJQ0VTX0JZX1pFUk8KKyAgICAgICAgYm9vbCBzaXplX2NoYW5nZWQgPSBzaXplICE9IHRoaXMtPnNpemUoKTsKKyAgICAgICNlbmRpZgorICAgICAgaWYoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSkKKyAgICAgICAgbV9zdG9yYWdlLnJlc2l6ZShzaXplLCAxLCBzaXplKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9zdG9yYWdlLnJlc2l6ZShzaXplLCBzaXplLCAxKTsKKyAgICAgICNpZmRlZiBFSUdFTl9JTklUSUFMSVpFX01BVFJJQ0VTX0JZX1pFUk8KKyAgICAgICAgaWYoc2l6ZV9jaGFuZ2VkKSBFSUdFTl9JTklUSUFMSVpFX0JZX1pFUk9fSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorICAgICAgI2VuZGlmCisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIG1hdHJpeCwgY2hhbmdpbmcgb25seSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuIEZvciB0aGUgcGFyYW1ldGVyIG9mIHR5cGUgTm9DaGFuZ2VfdCwganVzdCBwYXNzIHRoZSBzcGVjaWFsIHZhbHVlIFxjIE5vQ2hhbmdlCisgICAgICAqIGFzIGluIHRoZSBleGFtcGxlIGJlbG93LgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhfcmVzaXplX05vQ2hhbmdlX2ludC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4X3Jlc2l6ZV9Ob0NoYW5nZV9pbnQub3V0CisgICAgICAqCisgICAgICAqIFxzYSByZXNpemUoSW5kZXgsSW5kZXgpCisgICAgICAqLworICAgIGlubGluZSB2b2lkIHJlc2l6ZShOb0NoYW5nZV90LCBJbmRleCBjb2xzKQorICAgIHsKKyAgICAgIHJlc2l6ZShyb3dzKCksIGNvbHMpOworICAgIH0KKworICAgIC8qKiBSZXNpemVzIHRoZSBtYXRyaXgsIGNoYW5naW5nIG9ubHkgdGhlIG51bWJlciBvZiByb3dzLiBGb3IgdGhlIHBhcmFtZXRlciBvZiB0eXBlIE5vQ2hhbmdlX3QsIGp1c3QgcGFzcyB0aGUgc3BlY2lhbCB2YWx1ZSBcYyBOb0NoYW5nZQorICAgICAgKiBhcyBpbiB0aGUgZXhhbXBsZSBiZWxvdy4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3Jlc2l6ZV9pbnRfTm9DaGFuZ2UuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9yZXNpemVfaW50X05vQ2hhbmdlLm91dAorICAgICAgKgorICAgICAgKiBcc2EgcmVzaXplKEluZGV4LEluZGV4KQorICAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCByZXNpemUoSW5kZXggcm93cywgTm9DaGFuZ2VfdCkKKyAgICB7CisgICAgICByZXNpemUocm93cywgY29scygpKTsKKyAgICB9CisKKyAgICAvKiogUmVzaXplcyBcYyAqdGhpcyB0byBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbnMgYXMgXGEgb3RoZXIuCisgICAgICAqIFRha2VzIGNhcmUgb2YgZG9pbmcgYWxsIHRoZSBjaGVja2luZyB0aGF0J3MgbmVlZGVkLgorICAgICAgKgorICAgICAgKiBOb3RlIHRoYXQgY29weWluZyBhIHJvdy12ZWN0b3IgaW50byBhIHZlY3RvciAoYW5kIGNvbnZlcnNlbHkpIGlzIGFsbG93ZWQuCisgICAgICAqIFRoZSByZXNpemluZywgaWYgYW55LCBpcyB0aGVuIGRvbmUgaW4gdGhlIGFwcHJvcHJpYXRlIHdheSBzbyB0aGF0IHJvdy12ZWN0b3JzCisgICAgICAqIHJlbWFpbiByb3ctdmVjdG9ycyBhbmQgdmVjdG9ycyByZW1haW4gdmVjdG9ycy4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZXNpemVMaWtlKGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBfb3RoZXIpCisgICAgeworICAgICAgY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlciA9IF9vdGhlci5kZXJpdmVkKCk7CisgICAgICBpbnRlcm5hbDo6Y2hlY2tfcm93c19jb2xzX2Zvcl9vdmVyZmxvdyhvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisgICAgICBjb25zdCBJbmRleCBvdGhlcnNpemUgPSBvdGhlci5yb3dzKCkqb3RoZXIuY29scygpOworICAgICAgaWYoUm93c0F0Q29tcGlsZVRpbWUgPT0gMSkKKyAgICAgIHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG90aGVyLnJvd3MoKSA9PSAxIHx8IG90aGVyLmNvbHMoKSA9PSAxKTsKKyAgICAgICAgcmVzaXplKDEsIG90aGVyc2l6ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKENvbHNBdENvbXBpbGVUaW1lID09IDEpCisgICAgICB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChvdGhlci5yb3dzKCkgPT0gMSB8fCBvdGhlci5jb2xzKCkgPT0gMSk7CisgICAgICAgIHJlc2l6ZShvdGhlcnNpemUsIDEpOworICAgICAgfQorICAgICAgZWxzZSByZXNpemUob3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpOworICAgIH0KKworICAgIC8qKiBSZXNpemVzIHRoZSBtYXRyaXggdG8gXGEgcm93cyB4IFxhIGNvbHMgd2hpbGUgbGVhdmluZyBvbGQgdmFsdWVzIHVudG91Y2hlZC4KKyAgICAgICoKKyAgICAgICogVGhlIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgbWF0cmljZXMgb2YgZHluYW1pYyBzaXplLiBJZiB5b3Ugb25seSB3YW50IHRvIGNoYW5nZSB0aGUgbnVtYmVyCisgICAgICAqIG9mIHJvd3MgYW5kL29yIG9mIGNvbHVtbnMsIHlvdSBjYW4gdXNlIGNvbnNlcnZhdGl2ZVJlc2l6ZShOb0NoYW5nZV90LCBJbmRleCkgb3IKKyAgICAgICogY29uc2VydmF0aXZlUmVzaXplKEluZGV4LCBOb0NoYW5nZV90KS4KKyAgICAgICoKKyAgICAgICogTWF0cmljZXMgYXJlIHJlc2l6ZWQgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZWZ0IGVsZW1lbnQuIEluIGNhc2UgdmFsdWVzIG5lZWQgdG8gYmUgCisgICAgICAqIGFwcGVuZGVkIHRvIHRoZSBtYXRyaXggdGhleSB3aWxsIGJlIHVuaW5pdGlhbGl6ZWQuCisgICAgICAqLworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3Jlc2l6ZV9saWtlX2ltcGw8RGVyaXZlZD46OnJ1bigqdGhpcywgcm93cywgY29scyk7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIG1hdHJpeCB0byBcYSByb3dzIHggXGEgY29scyB3aGlsZSBsZWF2aW5nIG9sZCB2YWx1ZXMgdW50b3VjaGVkLgorICAgICAgKgorICAgICAgKiBBcyBvcHBvc2VkIHRvIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCByb3dzLCBJbmRleCBjb2xzKSwgdGhpcyB2ZXJzaW9uIGxlYXZlcworICAgICAgKiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdW5jaGFuZ2VkLgorICAgICAgKgorICAgICAgKiBJbiBjYXNlIHRoZSBtYXRyaXggaXMgZ3Jvd2luZywgbmV3IHJvd3Mgd2lsbCBiZSB1bmluaXRpYWxpemVkLgorICAgICAgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKEluZGV4IHJvd3MsIE5vQ2hhbmdlX3QpCisgICAgeworICAgICAgLy8gTm90ZTogc2VlIHRoZSBjb21tZW50IGluIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCxJbmRleCkKKyAgICAgIGNvbnNlcnZhdGl2ZVJlc2l6ZShyb3dzLCBjb2xzKCkpOworICAgIH0KKworICAgIC8qKiBSZXNpemVzIHRoZSBtYXRyaXggdG8gXGEgcm93cyB4IFxhIGNvbHMgd2hpbGUgbGVhdmluZyBvbGQgdmFsdWVzIHVudG91Y2hlZC4KKyAgICAgICoKKyAgICAgICogQXMgb3Bwb3NlZCB0byBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXggcm93cywgSW5kZXggY29scyksIHRoaXMgdmVyc2lvbiBsZWF2ZXMKKyAgICAgICogdGhlIG51bWJlciBvZiByb3dzIHVuY2hhbmdlZC4KKyAgICAgICoKKyAgICAgICogSW4gY2FzZSB0aGUgbWF0cml4IGlzIGdyb3dpbmcsIG5ldyBjb2x1bW5zIHdpbGwgYmUgdW5pbml0aWFsaXplZC4KKyAgICAgICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNvbnNlcnZhdGl2ZVJlc2l6ZShOb0NoYW5nZV90LCBJbmRleCBjb2xzKQorICAgIHsKKyAgICAgIC8vIE5vdGU6IHNlZSB0aGUgY29tbWVudCBpbiBjb25zZXJ2YXRpdmVSZXNpemUoSW5kZXgsSW5kZXgpCisgICAgICBjb25zZXJ2YXRpdmVSZXNpemUocm93cygpLCBjb2xzKTsKKyAgICB9CisKKyAgICAvKiogUmVzaXplcyB0aGUgdmVjdG9yIHRvIFxhIHNpemUgd2hpbGUgcmV0YWluaW5nIG9sZCB2YWx1ZXMuCisgICAgICAqCisgICAgICAqIFxvbmx5X2Zvcl92ZWN0b3JzLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGZvcgorICAgICAgKiBwYXJ0aWFsbHkgZHluYW1pYyBtYXRyaWNlcyB3aGVuIHRoZSBzdGF0aWMgZGltZW5zaW9uIGlzIGFueXRoaW5nIG90aGVyCisgICAgICAqIHRoYW4gMS4gRm9yIGV4YW1wbGUgaXQgd2lsbCBub3Qgd29yayB3aXRoIE1hdHJpeDxkb3VibGUsIDIsIER5bmFtaWM+LgorICAgICAgKgorICAgICAgKiBXaGVuIHZhbHVlcyBhcmUgYXBwZW5kZWQsIHRoZXkgd2lsbCBiZSB1bmluaXRpYWxpemVkLgorICAgICAgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgY29uc2VydmF0aXZlUmVzaXplKEluZGV4IHNpemUpCisgICAgeworICAgICAgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9yZXNpemVfbGlrZV9pbXBsPERlcml2ZWQ+OjpydW4oKnRoaXMsIHNpemUpOworICAgIH0KKworICAgIC8qKiBSZXNpemVzIHRoZSBtYXRyaXggdG8gXGEgcm93cyB4IFxhIGNvbHMgb2YgXGMgb3RoZXIsIHdoaWxlIGxlYXZpbmcgb2xkIHZhbHVlcyB1bnRvdWNoZWQuCisgICAgICAqCisgICAgICAqIFRoZSBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIG1hdHJpY2VzIG9mIGR5bmFtaWMgc2l6ZS4gSWYgeW91IG9ubHkgd2FudCB0byBjaGFuZ2UgdGhlIG51bWJlcgorICAgICAgKiBvZiByb3dzIGFuZC9vciBvZiBjb2x1bW5zLCB5b3UgY2FuIHVzZSBjb25zZXJ2YXRpdmVSZXNpemUoTm9DaGFuZ2VfdCwgSW5kZXgpIG9yCisgICAgICAqIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCwgTm9DaGFuZ2VfdCkuCisgICAgICAqCisgICAgICAqIE1hdHJpY2VzIGFyZSByZXNpemVkIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBlbGVtZW50LiBJbiBjYXNlIHZhbHVlcyBuZWVkIHRvIGJlIAorICAgICAgKiBhcHBlbmRlZCB0byB0aGUgbWF0cml4IHRoZXkgd2lsbCBjb3BpZWQgZnJvbSBcYyBvdGhlci4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBjb25zZXJ2YXRpdmVSZXNpemVMaWtlKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3Jlc2l6ZV9saWtlX2ltcGw8RGVyaXZlZCxPdGhlckRlcml2ZWQ+OjpydW4oKnRoaXMsIG90aGVyKTsKKyAgICB9CisKKyAgICAvKiogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICogcHJldmVudCBhIGRlZmF1bHQgb3BlcmF0b3I9IGZyb20gaGlkaW5nIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LgorICAgICAgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBQbGFpbk9iamVjdEJhc2UmIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBfc2V0KG90aGVyKTsKKyAgICB9CisKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6OmxhenlBc3NpZ24oKSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIGxhenlBc3NpZ24oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIF9yZXNpemVfdG9fbWF0Y2gob3RoZXIpOworICAgICAgcmV0dXJuIEJhc2U6OmxhenlBc3NpZ24ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgUmV0dXJuQnlWYWx1ZTxPdGhlckRlcml2ZWQ+JiBmdW5jKQorICAgIHsKKyAgICAgIHJlc2l6ZShmdW5jLnJvd3MoKSwgZnVuYy5jb2xzKCkpOworICAgICAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPShmdW5jKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IFBsYWluT2JqZWN0QmFzZSgpIDogbV9zdG9yYWdlKCkKKyAgICB7CisvLyAgICAgICBfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisvLyAgICAgICBFSUdFTl9JTklUSUFMSVpFX0JZX1pFUk9fSUZfVEhBVF9PUFRJT05fSVNfRU5BQkxFRAorICAgIH0KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8vIEZJWE1FIGlzIGl0IHN0aWxsIG5lZWRlZCA/CisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIFBsYWluT2JqZWN0QmFzZShpbnRlcm5hbDo6Y29uc3RydWN0b3Jfd2l0aG91dF91bmFsaWduZWRfYXJyYXlfYXNzZXJ0KQorICAgICAgOiBtX3N0b3JhZ2UoaW50ZXJuYWw6OmNvbnN0cnVjdG9yX3dpdGhvdXRfdW5hbGlnbmVkX2FycmF5X2Fzc2VydCgpKQorICAgIHsKKy8vICAgICAgIF9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsgRUlHRU5fSU5JVElBTElaRV9CWV9aRVJPX0lGX1RIQVRfT1BUSU9OX0lTX0VOQUJMRUQKKyAgICB9CisjZW5kaWYKKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGxhaW5PYmplY3RCYXNlKEluZGV4IHNpemUsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCisgICAgICA6IG1fc3RvcmFnZShzaXplLCByb3dzLCBjb2xzKQorICAgIHsKKy8vICAgICAgIF9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKy8vICAgICAgIEVJR0VOX0lOSVRJQUxJWkVfQllfWkVST19JRl9USEFUX09QVElPTl9JU19FTkFCTEVECisgICAgfQorCisgICAgLyoqIFxjb3B5ZG9jIE1hdHJpeEJhc2U6Om9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCisgICAgeworICAgICAgX3Jlc2l6ZV90b19tYXRjaChvdGhlcik7CisgICAgICBCYXNlOjpvcGVyYXRvcj0ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICAgIHJldHVybiB0aGlzLT5kZXJpdmVkKCk7CisgICAgfQorCisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvcj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mKSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBsYWluT2JqZWN0QmFzZShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCisgICAgICA6IG1fc3RvcmFnZShvdGhlci5kZXJpdmVkKCkucm93cygpICogb3RoZXIuZGVyaXZlZCgpLmNvbHMoKSwgb3RoZXIuZGVyaXZlZCgpLnJvd3MoKSwgb3RoZXIuZGVyaXZlZCgpLmNvbHMoKSkKKyAgICB7CisgICAgICBfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgICBpbnRlcm5hbDo6Y2hlY2tfcm93c19jb2xzX2Zvcl9vdmVyZmxvdyhvdGhlci5kZXJpdmVkKCkucm93cygpLCBvdGhlci5kZXJpdmVkKCkuY29scygpKTsKKyAgICAgIEJhc2U6Om9wZXJhdG9yPShvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBcbmFtZSBNYXAKKyAgICAgICogVGhlc2UgYXJlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyByZXR1cm5pbmcgTWFwIG9iamVjdHMuIFRoZSBNYXAoKSBzdGF0aWMgZnVuY3Rpb25zIHJldHVybiB1bmFsaWduZWQgTWFwIG9iamVjdHMsCisgICAgICAqIHdoaWxlIHRoZSBBbGlnbmVkTWFwKCkgZnVuY3Rpb25zIHJldHVybiBhbGlnbmVkIE1hcCBvYmplY3RzIGFuZCB0aHVzIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aXRoIDE2LWJ5dGUtYWxpZ25lZAorICAgICAgKiBcYSBkYXRhIHBvaW50ZXJzLgorICAgICAgKgorICAgICAgKiBcc2VlIGNsYXNzIE1hcAorICAgICAgKi8KKyAgICAvL0B7CisgICAgc3RhdGljIGlubGluZSBDb25zdE1hcFR5cGUgTWFwKGNvbnN0IFNjYWxhciogZGF0YSkKKyAgICB7IHJldHVybiBDb25zdE1hcFR5cGUoZGF0YSk7IH0KKyAgICBzdGF0aWMgaW5saW5lIE1hcFR5cGUgTWFwKFNjYWxhciogZGF0YSkKKyAgICB7IHJldHVybiBNYXBUeXBlKGRhdGEpOyB9CisgICAgc3RhdGljIGlubGluZSBDb25zdE1hcFR5cGUgTWFwKGNvbnN0IFNjYWxhciogZGF0YSwgSW5kZXggc2l6ZSkKKyAgICB7IHJldHVybiBDb25zdE1hcFR5cGUoZGF0YSwgc2l6ZSk7IH0KKyAgICBzdGF0aWMgaW5saW5lIE1hcFR5cGUgTWFwKFNjYWxhciogZGF0YSwgSW5kZXggc2l6ZSkKKyAgICB7IHJldHVybiBNYXBUeXBlKGRhdGEsIHNpemUpOyB9CisgICAgc3RhdGljIGlubGluZSBDb25zdE1hcFR5cGUgTWFwKGNvbnN0IFNjYWxhciogZGF0YSwgSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7IHJldHVybiBDb25zdE1hcFR5cGUoZGF0YSwgcm93cywgY29scyk7IH0KKyAgICBzdGF0aWMgaW5saW5lIE1hcFR5cGUgTWFwKFNjYWxhciogZGF0YSwgSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7IHJldHVybiBNYXBUeXBlKGRhdGEsIHJvd3MsIGNvbHMpOyB9CisKKyAgICBzdGF0aWMgaW5saW5lIENvbnN0QWxpZ25lZE1hcFR5cGUgTWFwQWxpZ25lZChjb25zdCBTY2FsYXIqIGRhdGEpCisgICAgeyByZXR1cm4gQ29uc3RBbGlnbmVkTWFwVHlwZShkYXRhKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgQWxpZ25lZE1hcFR5cGUgTWFwQWxpZ25lZChTY2FsYXIqIGRhdGEpCisgICAgeyByZXR1cm4gQWxpZ25lZE1hcFR5cGUoZGF0YSk7IH0KKyAgICBzdGF0aWMgaW5saW5lIENvbnN0QWxpZ25lZE1hcFR5cGUgTWFwQWxpZ25lZChjb25zdCBTY2FsYXIqIGRhdGEsIEluZGV4IHNpemUpCisgICAgeyByZXR1cm4gQ29uc3RBbGlnbmVkTWFwVHlwZShkYXRhLCBzaXplKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgQWxpZ25lZE1hcFR5cGUgTWFwQWxpZ25lZChTY2FsYXIqIGRhdGEsIEluZGV4IHNpemUpCisgICAgeyByZXR1cm4gQWxpZ25lZE1hcFR5cGUoZGF0YSwgc2l6ZSk7IH0KKyAgICBzdGF0aWMgaW5saW5lIENvbnN0QWxpZ25lZE1hcFR5cGUgTWFwQWxpZ25lZChjb25zdCBTY2FsYXIqIGRhdGEsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCisgICAgeyByZXR1cm4gQ29uc3RBbGlnbmVkTWFwVHlwZShkYXRhLCByb3dzLCBjb2xzKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgQWxpZ25lZE1hcFR5cGUgTWFwQWxpZ25lZChTY2FsYXIqIGRhdGEsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCisgICAgeyByZXR1cm4gQWxpZ25lZE1hcFR5cGUoZGF0YSwgcm93cywgY29scyk7IH0KKworICAgIHRlbXBsYXRlPGludCBPdXRlciwgaW50IElubmVyPgorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgU3RyaWRlZENvbnN0TWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlIE1hcChjb25zdCBTY2FsYXIqIGRhdGEsIGNvbnN0IFN0cmlkZTxPdXRlciwgSW5uZXI+JiBzdHJpZGUpCisgICAgeyByZXR1cm4gdHlwZW5hbWUgU3RyaWRlZENvbnN0TWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlKGRhdGEsIHN0cmlkZSk7IH0KKyAgICB0ZW1wbGF0ZTxpbnQgT3V0ZXIsIGludCBJbm5lcj4KKyAgICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIFN0cmlkZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUgTWFwKFNjYWxhciogZGF0YSwgY29uc3QgU3RyaWRlPE91dGVyLCBJbm5lcj4mIHN0cmlkZSkKKyAgICB7IHJldHVybiB0eXBlbmFtZSBTdHJpZGVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlKGRhdGEsIHN0cmlkZSk7IH0KKyAgICB0ZW1wbGF0ZTxpbnQgT3V0ZXIsIGludCBJbm5lcj4KKyAgICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIFN0cmlkZWRDb25zdE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZSBNYXAoY29uc3QgU2NhbGFyKiBkYXRhLCBJbmRleCBzaXplLCBjb25zdCBTdHJpZGU8T3V0ZXIsIElubmVyPiYgc3RyaWRlKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIFN0cmlkZWRDb25zdE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZShkYXRhLCBzaXplLCBzdHJpZGUpOyB9CisgICAgdGVtcGxhdGU8aW50IE91dGVyLCBpbnQgSW5uZXI+CisgICAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBTdHJpZGVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlIE1hcChTY2FsYXIqIGRhdGEsIEluZGV4IHNpemUsIGNvbnN0IFN0cmlkZTxPdXRlciwgSW5uZXI+JiBzdHJpZGUpCisgICAgeyByZXR1cm4gdHlwZW5hbWUgU3RyaWRlZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZShkYXRhLCBzaXplLCBzdHJpZGUpOyB9CisgICAgdGVtcGxhdGU8aW50IE91dGVyLCBpbnQgSW5uZXI+CisgICAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBTdHJpZGVkQ29uc3RNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUgTWFwKGNvbnN0IFNjYWxhciogZGF0YSwgSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgU3RyaWRlPE91dGVyLCBJbm5lcj4mIHN0cmlkZSkKKyAgICB7IHJldHVybiB0eXBlbmFtZSBTdHJpZGVkQ29uc3RNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUoZGF0YSwgcm93cywgY29scywgc3RyaWRlKTsgfQorICAgIHRlbXBsYXRlPGludCBPdXRlciwgaW50IElubmVyPgorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgU3RyaWRlZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZSBNYXAoU2NhbGFyKiBkYXRhLCBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBjb25zdCBTdHJpZGU8T3V0ZXIsIElubmVyPiYgc3RyaWRlKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIFN0cmlkZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUoZGF0YSwgcm93cywgY29scywgc3RyaWRlKTsgfQorCisgICAgdGVtcGxhdGU8aW50IE91dGVyLCBpbnQgSW5uZXI+CisgICAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBTdHJpZGVkQ29uc3RBbGlnbmVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlIE1hcEFsaWduZWQoY29uc3QgU2NhbGFyKiBkYXRhLCBjb25zdCBTdHJpZGU8T3V0ZXIsIElubmVyPiYgc3RyaWRlKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIFN0cmlkZWRDb25zdEFsaWduZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUoZGF0YSwgc3RyaWRlKTsgfQorICAgIHRlbXBsYXRlPGludCBPdXRlciwgaW50IElubmVyPgorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgU3RyaWRlZEFsaWduZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUgTWFwQWxpZ25lZChTY2FsYXIqIGRhdGEsIGNvbnN0IFN0cmlkZTxPdXRlciwgSW5uZXI+JiBzdHJpZGUpCisgICAgeyByZXR1cm4gdHlwZW5hbWUgU3RyaWRlZEFsaWduZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUoZGF0YSwgc3RyaWRlKTsgfQorICAgIHRlbXBsYXRlPGludCBPdXRlciwgaW50IElubmVyPgorICAgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgU3RyaWRlZENvbnN0QWxpZ25lZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZSBNYXBBbGlnbmVkKGNvbnN0IFNjYWxhciogZGF0YSwgSW5kZXggc2l6ZSwgY29uc3QgU3RyaWRlPE91dGVyLCBJbm5lcj4mIHN0cmlkZSkKKyAgICB7IHJldHVybiB0eXBlbmFtZSBTdHJpZGVkQ29uc3RBbGlnbmVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlKGRhdGEsIHNpemUsIHN0cmlkZSk7IH0KKyAgICB0ZW1wbGF0ZTxpbnQgT3V0ZXIsIGludCBJbm5lcj4KKyAgICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIFN0cmlkZWRBbGlnbmVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlIE1hcEFsaWduZWQoU2NhbGFyKiBkYXRhLCBJbmRleCBzaXplLCBjb25zdCBTdHJpZGU8T3V0ZXIsIElubmVyPiYgc3RyaWRlKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIFN0cmlkZWRBbGlnbmVkTWFwVHlwZTxTdHJpZGU8T3V0ZXIsIElubmVyPiA+Ojp0eXBlKGRhdGEsIHNpemUsIHN0cmlkZSk7IH0KKyAgICB0ZW1wbGF0ZTxpbnQgT3V0ZXIsIGludCBJbm5lcj4KKyAgICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIFN0cmlkZWRDb25zdEFsaWduZWRNYXBUeXBlPFN0cmlkZTxPdXRlciwgSW5uZXI+ID46OnR5cGUgTWFwQWxpZ25lZChjb25zdCBTY2FsYXIqIGRhdGEsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIGNvbnN0IFN0cmlkZTxPdXRlciwgSW5uZXI+JiBzdHJpZGUpCisgICAgeyByZXR1cm4gdHlwZW5hbWUgU3RyaWRlZENvbnN0QWxpZ25lZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZShkYXRhLCByb3dzLCBjb2xzLCBzdHJpZGUpOyB9CisgICAgdGVtcGxhdGU8aW50IE91dGVyLCBpbnQgSW5uZXI+CisgICAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBTdHJpZGVkQWxpZ25lZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZSBNYXBBbGlnbmVkKFNjYWxhciogZGF0YSwgSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgU3RyaWRlPE91dGVyLCBJbm5lcj4mIHN0cmlkZSkKKyAgICB7IHJldHVybiB0eXBlbmFtZSBTdHJpZGVkQWxpZ25lZE1hcFR5cGU8U3RyaWRlPE91dGVyLCBJbm5lcj4gPjo6dHlwZShkYXRhLCByb3dzLCBjb2xzLCBzdHJpZGUpOyB9CisgICAgLy9AfQorCisgICAgdXNpbmcgQmFzZTo6c2V0Q29uc3RhbnQ7CisgICAgRGVyaXZlZCYgc2V0Q29uc3RhbnQoSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyJiB2YWx1ZSk7CisgICAgRGVyaXZlZCYgc2V0Q29uc3RhbnQoSW5kZXggcm93cywgSW5kZXggY29scywgY29uc3QgU2NhbGFyJiB2YWx1ZSk7CisKKyAgICB1c2luZyBCYXNlOjpzZXRaZXJvOworICAgIERlcml2ZWQmIHNldFplcm8oSW5kZXggc2l6ZSk7CisgICAgRGVyaXZlZCYgc2V0WmVybyhJbmRleCByb3dzLCBJbmRleCBjb2xzKTsKKworICAgIHVzaW5nIEJhc2U6OnNldE9uZXM7CisgICAgRGVyaXZlZCYgc2V0T25lcyhJbmRleCBzaXplKTsKKyAgICBEZXJpdmVkJiBzZXRPbmVzKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpOworCisgICAgdXNpbmcgQmFzZTo6c2V0UmFuZG9tOworICAgIERlcml2ZWQmIHNldFJhbmRvbShJbmRleCBzaXplKTsKKyAgICBEZXJpdmVkJiBzZXRSYW5kb20oSW5kZXggcm93cywgSW5kZXggY29scyk7CisKKyAgICAjaWZkZWYgRUlHRU5fUExBSU5PQkpFQ1RCQVNFX1BMVUdJTgorICAgICNpbmNsdWRlIEVJR0VOX1BMQUlOT0JKRUNUQkFTRV9QTFVHSU4KKyAgICAjZW5kaWYKKworICBwcm90ZWN0ZWQ6CisgICAgLyoqIFxpbnRlcm5hbCBSZXNpemVzICp0aGlzIGluIHByZXBhcmF0aW9uIGZvciBhc3NpZ25pbmcgXGEgb3RoZXIgdG8gaXQuCisgICAgICAqIFRha2VzIGNhcmUgb2YgZG9pbmcgYWxsIHRoZSBjaGVja2luZyB0aGF0J3MgbmVlZGVkLgorICAgICAgKgorICAgICAgKiBOb3RlIHRoYXQgY29weWluZyBhIHJvdy12ZWN0b3IgaW50byBhIHZlY3RvciAoYW5kIGNvbnZlcnNlbHkpIGlzIGFsbG93ZWQuCisgICAgICAqIFRoZSByZXNpemluZywgaWYgYW55LCBpcyB0aGVuIGRvbmUgaW4gdGhlIGFwcHJvcHJpYXRlIHdheSBzbyB0aGF0IHJvdy12ZWN0b3JzCisgICAgICAqIHJlbWFpbiByb3ctdmVjdG9ycyBhbmQgdmVjdG9ycyByZW1haW4gdmVjdG9ycy4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBfcmVzaXplX3RvX21hdGNoKGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICAjaWZkZWYgRUlHRU5fTk9fQVVUT01BVElDX1JFU0laSU5HCisgICAgICBlaWdlbl9hc3NlcnQoKHRoaXMtPnNpemUoKT09MCB8fCAoSXNWZWN0b3JBdENvbXBpbGVUaW1lID8gKHRoaXMtPnNpemUoKSA9PSBvdGhlci5zaXplKCkpCisgICAgICAgICAgICAgICAgIDogKHJvd3MoKSA9PSBvdGhlci5yb3dzKCkgJiYgY29scygpID09IG90aGVyLmNvbHMoKSkpKQorICAgICAgICAmJiAiU2l6ZSBtaXNtYXRjaC4gQXV0b21hdGljIHJlc2l6aW5nIGlzIGRpc2FibGVkIGJlY2F1c2UgRUlHRU5fTk9fQVVUT01BVElDX1JFU0laSU5HIGlzIGRlZmluZWQiKTsKKyAgICAgICNlbHNlCisgICAgICByZXNpemVMaWtlKG90aGVyKTsKKyAgICAgICNlbmRpZgorICAgIH0KKworICAgIC8qKgorICAgICAgKiBcYnJpZWYgQ29waWVzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBcYSBvdGhlciBpbnRvIFxjICp0aGlzIHdpdGggYXV0b21hdGljIHJlc2l6aW5nLgorICAgICAgKgorICAgICAgKiAqdGhpcyBtaWdodCBiZSByZXNpemVkIHRvIG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mIFxhIG90aGVyLiBJZiAqdGhpcyB3YXMgYSBudWxsIG1hdHJpeCAobm90IGFscmVhZHkgaW5pdGlhbGl6ZWQpLAorICAgICAgKiBpdCB3aWxsIGJlIGluaXRpYWxpemVkLgorICAgICAgKgorICAgICAgKiBOb3RlIHRoYXQgY29weWluZyBhIHJvdy12ZWN0b3IgaW50byBhIHZlY3RvciAoYW5kIGNvbnZlcnNlbHkpIGlzIGFsbG93ZWQuCisgICAgICAqIFRoZSByZXNpemluZywgaWYgYW55LCBpcyB0aGVuIGRvbmUgaW4gdGhlIGFwcHJvcHJpYXRlIHdheSBzbyB0aGF0IHJvdy12ZWN0b3JzCisgICAgICAqIHJlbWFpbiByb3ctdmVjdG9ycyBhbmQgdmVjdG9ycyByZW1haW4gdmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mKSwgX3NldF9ub2FsaWFzKCkKKyAgICAgICoKKyAgICAgICogXGludGVybmFsCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIF9zZXQoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIF9zZXRfc2VsZWN0b3Iob3RoZXIuZGVyaXZlZCgpLCB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8c3RhdGljX2Nhc3Q8Ym9vbD4oaW50KE90aGVyRGVyaXZlZDo6RmxhZ3MpICYgRXZhbEJlZm9yZUFzc2lnbmluZ0JpdCksIGludGVybmFsOjp0cnVlX3R5cGUsIGludGVybmFsOjpmYWxzZV90eXBlPjo6dHlwZSgpKTsKKyAgICAgIHJldHVybiB0aGlzLT5kZXJpdmVkKCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBfc2V0X3NlbGVjdG9yKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIsIGNvbnN0IGludGVybmFsOjp0cnVlX3R5cGUmKSB7IF9zZXRfbm9hbGlhcyhvdGhlci5ldmFsKCkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9zZXRfc2VsZWN0b3IoY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlciwgY29uc3QgaW50ZXJuYWw6OmZhbHNlX3R5cGUmKSB7IF9zZXRfbm9hbGlhcyhvdGhlcik7IH0KKworICAgIC8qKiBcaW50ZXJuYWwgTGlrZSBfc2V0KCkgYnV0IGFkZGl0aW9uYWxseSBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IG5vIGFsaWFzaW5nIGVmZmVjdCBjYW4gaGFwcGVuICh3aGljaAorICAgICAgKiBpcyB0aGUgY2FzZSB3aGVuIGNyZWF0aW5nIGEgbmV3IG1hdHJpeCkgc28gb25lIGNhbiBlbmZvcmNlIGxhenkgZXZhbHVhdGlvbi4KKyAgICAgICoKKyAgICAgICogXHNhIG9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mKSwgX3NldCgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIF9zZXRfbm9hbGlhcyhjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgLy8gSSBkb24ndCB0aGluayB3ZSBuZWVkIHRoaXMgcmVzaXplIGNhbGwgc2luY2UgdGhlIGxhenlBc3NpZ24gd2lsbCBhbnl3YXlzIHJlc2l6ZQorICAgICAgLy8gYW5kIGxhenlBc3NpZ24gd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGFzc2lnbiBzZWxlY3Rvci4KKyAgICAgIC8vX3Jlc2l6ZV90b19tYXRjaChvdGhlcik7CisgICAgICAvLyB0aGUgJ2ZhbHNlJyBiZWxvdyBtZWFucyB0byBlbmZvcmNlIGxhenkgZXZhbHVhdGlvbi4gV2UgZG9uJ3QgdXNlIGxhenlBc3NpZ24oKSBiZWNhdXNlCisgICAgICAvLyBpdCB3b3VsZG4ndCBhbGxvdyB0byBjb3B5IGEgcm93LXZlY3RvciBpbnRvIGEgY29sdW1uLXZlY3Rvci4KKyAgICAgIHJldHVybiBpbnRlcm5hbDo6YXNzaWduX3NlbGVjdG9yPERlcml2ZWQsT3RoZXJEZXJpdmVkLGZhbHNlPjo6cnVuKHRoaXMtPmRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9pbml0MihJbmRleCByb3dzLCBJbmRleCBjb2xzLCB0eXBlbmFtZSBpbnRlcm5hbDo6ZW5hYmxlX2lmPEJhc2U6OlNpemVBdENvbXBpbGVUaW1lIT0yLFQwPjo6dHlwZSogPSAwKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoYm9vbChOdW1UcmFpdHM8VDA+OjpJc0ludGVnZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2woTnVtVHJhaXRzPFQxPjo6SXNJbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVRJTkdfUE9JTlRfQVJHVU1FTlRfUEFTU0VEX19JTlRFR0VSX1dBU19FWFBFQ1RFRCkKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dzID49IDAgJiYgKFJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgUm93c0F0Q29tcGlsZVRpbWUgPT0gcm93cykKKyAgICAgICAgICAgICAmJiBjb2xzID49IDAgJiYgKENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgQ29sc0F0Q29tcGlsZVRpbWUgPT0gY29scykpOworICAgICAgaW50ZXJuYWw6OmNoZWNrX3Jvd3NfY29sc19mb3Jfb3ZlcmZsb3cocm93cywgY29scyk7ICAgICAgCisgICAgICBtX3N0b3JhZ2UucmVzaXplKHJvd3MqY29scyxyb3dzLGNvbHMpOworICAgICAgRUlHRU5fSU5JVElBTElaRV9CWV9aRVJPX0lGX1RIQVRfT1BUSU9OX0lTX0VOQUJMRUQKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBfaW5pdDIoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIHR5cGVuYW1lIGludGVybmFsOjplbmFibGVfaWY8QmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PTIsVDA+Ojp0eXBlKiA9IDApCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShQbGFpbk9iamVjdEJhc2UsIDIpCisgICAgICBtX3N0b3JhZ2UuZGF0YSgpWzBdID0geDsKKyAgICAgIG1fc3RvcmFnZS5kYXRhKClbMV0gPSB5OworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGVBLCB0eXBlbmFtZSBNYXRyaXhUeXBlQiwgYm9vbCBTd2FwUG9pbnRlcnM+CisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6bWF0cml4X3N3YXBfaW1wbDsKKworICAgIC8qKiBcaW50ZXJuYWwgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBzd2FwIGZvciBkZW5zZSBzdG9yYWdlIHNpbmNlIGZvciBkeW5hbWljLXNpemVkIG1hdHJpY2VzIG9mIHNhbWUgdHlwZSBpdCBpcyBlbm91Z2ggdG8gc3dhcCB0aGUKKyAgICAgICogZGF0YSBwb2ludGVycy4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIHZvaWQgX3N3YXAoRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4gY29uc3QgJiBvdGhlcikKKyAgICB7CisgICAgICBlbnVtIHsgU3dhcFBvaW50ZXJzID0gaW50ZXJuYWw6OmlzX3NhbWU8RGVyaXZlZCwgT3RoZXJEZXJpdmVkPjo6dmFsdWUgJiYgQmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgfTsKKyAgICAgIGludGVybmFsOjptYXRyaXhfc3dhcF9pbXBsPERlcml2ZWQsIE90aGVyRGVyaXZlZCwgYm9vbChTd2FwUG9pbnRlcnMpPjo6cnVuKHRoaXMtPmRlcml2ZWQoKSwgb3RoZXIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICAgIH0KKworICBwdWJsaWM6CisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBfY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFSUdFTl9JTVBMSUVTKE1heFJvd3NBdENvbXBpbGVUaW1lPT0xICYmIE1heENvbHNBdENvbXBpbGVUaW1lIT0xLCAoT3B0aW9ucyZSb3dNYWpvcik9PVJvd01ham9yKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgRUlHRU5fSU1QTElFUyhNYXhDb2xzQXRDb21waWxlVGltZT09MSAmJiBNYXhSb3dzQXRDb21waWxlVGltZSE9MSwgKE9wdGlvbnMmUm93TWFqb3IpPT0wKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB8fCAoUm93c0F0Q29tcGlsZVRpbWUgPj0gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMpIHx8IChDb2xzQXRDb21waWxlVGltZSA+PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICgoTWF4Um93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgfHwgKE1heFJvd3NBdENvbXBpbGVUaW1lID49IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChNYXhDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB8fCAoTWF4Q29sc0F0Q29tcGlsZVRpbWUgPj0gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoTWF4Um93c0F0Q29tcGlsZVRpbWUgPT0gUm93c0F0Q29tcGlsZVRpbWUgfHwgUm93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoTWF4Q29sc0F0Q29tcGlsZVRpbWUgPT0gQ29sc0F0Q29tcGlsZVRpbWUgfHwgQ29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoT3B0aW9ucyAmIChEb250QWxpZ258Um93TWFqb3IpKSA9PSBPcHRpb25zKSwKKyAgICAgICAgSU5WQUxJRF9NQVRSSVhfVEVNUExBVEVfUEFSQU1FVEVSUykKKyAgICB9CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBlbnVtIHsgVGhpc0NvbnN0YW50SXNQcml2YXRlSW5QbGFpbk9iamVjdEJhc2UgfTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQsIGJvb2wgSXNWZWN0b3I+CitzdHJ1Y3QgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9yZXNpemVfbGlrZV9pbXBsCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyB2b2lkIHJ1bihEZW5zZUJhc2U8RGVyaXZlZD4mIF90aGlzLCBJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICB7CisgICAgaWYgKF90aGlzLnJvd3MoKSA9PSByb3dzICYmIF90aGlzLmNvbHMoKSA9PSBjb2xzKSByZXR1cm47CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9EWU5BTUlDX1NJWkUoRGVyaXZlZCkKKworICAgIGlmICggKCBEZXJpdmVkOjpJc1Jvd01ham9yICYmIF90aGlzLmNvbHMoKSA9PSBjb2xzKSB8fCAvLyByb3ctbWFqb3IgYW5kIHdlIGNoYW5nZSBvbmx5IHRoZSBudW1iZXIgb2Ygcm93cworICAgICAgICAgKCFEZXJpdmVkOjpJc1Jvd01ham9yICYmIF90aGlzLnJvd3MoKSA9PSByb3dzKSApICAvLyBjb2x1bW4tbWFqb3IgYW5kIHdlIGNoYW5nZSBvbmx5IHRoZSBudW1iZXIgb2YgY29sdW1ucworICAgIHsKKyAgICAgIGludGVybmFsOjpjaGVja19yb3dzX2NvbHNfZm9yX292ZXJmbG93KHJvd3MsIGNvbHMpOworICAgICAgX3RoaXMuZGVyaXZlZCgpLm1fc3RvcmFnZS5jb25zZXJ2YXRpdmVSZXNpemUocm93cypjb2xzLHJvd3MsY29scyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBUaGUgc3RvcmFnZSBvcmRlciBkb2VzIG5vdCBhbGxvdyB1cyB0byB1c2UgcmVhbGxvY2F0aW9uLgorICAgICAgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3QgdG1wKHJvd3MsY29scyk7CisgICAgICBjb25zdCBJbmRleCBjb21tb25fcm93cyA9IChzdGQ6Om1pbikocm93cywgX3RoaXMucm93cygpKTsKKyAgICAgIGNvbnN0IEluZGV4IGNvbW1vbl9jb2xzID0gKHN0ZDo6bWluKShjb2xzLCBfdGhpcy5jb2xzKCkpOworICAgICAgdG1wLmJsb2NrKDAsMCxjb21tb25fcm93cyxjb21tb25fY29scykgPSBfdGhpcy5ibG9jaygwLDAsY29tbW9uX3Jvd3MsY29tbW9uX2NvbHMpOworICAgICAgX3RoaXMuZGVyaXZlZCgpLnN3YXAodG1wKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCBydW4oRGVuc2VCYXNlPERlcml2ZWQ+JiBfdGhpcywgY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICB7CisgICAgaWYgKF90aGlzLnJvd3MoKSA9PSBvdGhlci5yb3dzKCkgJiYgX3RoaXMuY29scygpID09IG90aGVyLmNvbHMoKSkgcmV0dXJuOworCisgICAgLy8gTm90ZTogSGVyZSBpcyBzcGFjZSBmb3IgaW1wcm92ZW1lbnQuIEJhc2ljYWxseSwgZm9yIGNvbnNlcnZhdGl2ZVJlc2l6ZShJbmRleCxJbmRleCksCisgICAgLy8gbmVpdGhlciBSb3dzQXRDb21waWxlVGltZSBvciBDb2xzQXRDb21waWxlVGltZSBtdXN0IGJlIER5bmFtaWMuIElmIG9ubHkgb25lIG9mIHRoZQorICAgIC8vIGRpbWVuc2lvbnMgaXMgZHluYW1pYywgb25lIGNvdWxkIHVzZSBlaXRoZXIgY29uc2VydmF0aXZlUmVzaXplKEluZGV4IHJvd3MsIE5vQ2hhbmdlX3QpIG9yCisgICAgLy8gY29uc2VydmF0aXZlUmVzaXplKE5vQ2hhbmdlX3QsIEluZGV4IGNvbHMpLiBGb3IgdGhlc2UgbWV0aG9kcyBuZXcgc3RhdGljIGFzc2VydHMgbGlrZQorICAgIC8vIEVJR0VOX1NUQVRJQ19BU1NFUlRfRFlOQU1JQ19ST1dTIGFuZCBFSUdFTl9TVEFUSUNfQVNTRVJUX0RZTkFNSUNfQ09MUyB3b3VsZCBiZSBnb29kLgorICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfRFlOQU1JQ19TSVpFKERlcml2ZWQpCisgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9EWU5BTUlDX1NJWkUoT3RoZXJEZXJpdmVkKQorCisgICAgaWYgKCAoIERlcml2ZWQ6OklzUm93TWFqb3IgJiYgX3RoaXMuY29scygpID09IG90aGVyLmNvbHMoKSkgfHwgLy8gcm93LW1ham9yIGFuZCB3ZSBjaGFuZ2Ugb25seSB0aGUgbnVtYmVyIG9mIHJvd3MKKyAgICAgICAgICghRGVyaXZlZDo6SXNSb3dNYWpvciAmJiBfdGhpcy5yb3dzKCkgPT0gb3RoZXIucm93cygpKSApICAvLyBjb2x1bW4tbWFqb3IgYW5kIHdlIGNoYW5nZSBvbmx5IHRoZSBudW1iZXIgb2YgY29sdW1ucworICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IG5ld19yb3dzID0gb3RoZXIucm93cygpIC0gX3RoaXMucm93cygpOworICAgICAgY29uc3QgSW5kZXggbmV3X2NvbHMgPSBvdGhlci5jb2xzKCkgLSBfdGhpcy5jb2xzKCk7CisgICAgICBfdGhpcy5kZXJpdmVkKCkubV9zdG9yYWdlLmNvbnNlcnZhdGl2ZVJlc2l6ZShvdGhlci5zaXplKCksb3RoZXIucm93cygpLG90aGVyLmNvbHMoKSk7CisgICAgICBpZiAobmV3X3Jvd3M+MCkKKyAgICAgICAgX3RoaXMuYm90dG9tUmlnaHRDb3JuZXIobmV3X3Jvd3MsIG90aGVyLmNvbHMoKSkgPSBvdGhlci5ib3R0b21Sb3dzKG5ld19yb3dzKTsKKyAgICAgIGVsc2UgaWYgKG5ld19jb2xzPjApCisgICAgICAgIF90aGlzLmJvdHRvbVJpZ2h0Q29ybmVyKG90aGVyLnJvd3MoKSwgbmV3X2NvbHMpID0gb3RoZXIucmlnaHRDb2xzKG5ld19jb2xzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIFRoZSBzdG9yYWdlIG9yZGVyIGRvZXMgbm90IGFsbG93IHVzIHRvIHVzZSByZWFsbG9jYXRpb24uCisgICAgICB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCB0bXAob3RoZXIpOworICAgICAgY29uc3QgSW5kZXggY29tbW9uX3Jvd3MgPSAoc3RkOjptaW4pKHRtcC5yb3dzKCksIF90aGlzLnJvd3MoKSk7CisgICAgICBjb25zdCBJbmRleCBjb21tb25fY29scyA9IChzdGQ6Om1pbikodG1wLmNvbHMoKSwgX3RoaXMuY29scygpKTsKKyAgICAgIHRtcC5ibG9jaygwLDAsY29tbW9uX3Jvd3MsY29tbW9uX2NvbHMpID0gX3RoaXMuYmxvY2soMCwwLGNvbW1vbl9yb3dzLGNvbW1vbl9jb2xzKTsKKyAgICAgIF90aGlzLmRlcml2ZWQoKS5zd2FwKHRtcCk7CisgICAgfQorICB9Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorc3RydWN0IGNvbnNlcnZhdGl2ZV9yZXNpemVfbGlrZV9pbXBsPERlcml2ZWQsT3RoZXJEZXJpdmVkLHRydWU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyB2b2lkIHJ1bihEZW5zZUJhc2U8RGVyaXZlZD4mIF90aGlzLCBJbmRleCBzaXplKQorICB7CisgICAgY29uc3QgSW5kZXggbmV3X3Jvd3MgPSBEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZT09MSA/IDEgOiBzaXplOworICAgIGNvbnN0IEluZGV4IG5ld19jb2xzID0gRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWU9PTEgPyBzaXplIDogMTsKKyAgICBfdGhpcy5kZXJpdmVkKCkubV9zdG9yYWdlLmNvbnNlcnZhdGl2ZVJlc2l6ZShzaXplLG5ld19yb3dzLG5ld19jb2xzKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHJ1bihEZW5zZUJhc2U8RGVyaXZlZD4mIF90aGlzLCBjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgIHsKKyAgICBpZiAoX3RoaXMucm93cygpID09IG90aGVyLnJvd3MoKSAmJiBfdGhpcy5jb2xzKCkgPT0gb3RoZXIuY29scygpKSByZXR1cm47CisKKyAgICBjb25zdCBJbmRleCBudW1fbmV3X2VsZW1lbnRzID0gb3RoZXIuc2l6ZSgpIC0gX3RoaXMuc2l6ZSgpOworCisgICAgY29uc3QgSW5kZXggbmV3X3Jvd3MgPSBEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZT09MSA/IDEgOiBvdGhlci5yb3dzKCk7CisgICAgY29uc3QgSW5kZXggbmV3X2NvbHMgPSBEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZT09MSA/IG90aGVyLmNvbHMoKSA6IDE7CisgICAgX3RoaXMuZGVyaXZlZCgpLm1fc3RvcmFnZS5jb25zZXJ2YXRpdmVSZXNpemUob3RoZXIuc2l6ZSgpLG5ld19yb3dzLG5ld19jb2xzKTsKKworICAgIGlmIChudW1fbmV3X2VsZW1lbnRzID4gMCkKKyAgICAgIF90aGlzLnRhaWwobnVtX25ld19lbGVtZW50cykgPSBvdGhlci50YWlsKG51bV9uZXdfZWxlbWVudHMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlQSwgdHlwZW5hbWUgTWF0cml4VHlwZUIsIGJvb2wgU3dhcFBvaW50ZXJzPgorc3RydWN0IG1hdHJpeF9zd2FwX2ltcGwKK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihNYXRyaXhUeXBlQSYgYSwgTWF0cml4VHlwZUImIGIpCisgIHsKKyAgICBhLmJhc2UoKS5zd2FwKGIpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlQSwgdHlwZW5hbWUgTWF0cml4VHlwZUI+CitzdHJ1Y3QgbWF0cml4X3N3YXBfaW1wbDxNYXRyaXhUeXBlQSwgTWF0cml4VHlwZUIsIHRydWU+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oTWF0cml4VHlwZUEmIGEsIE1hdHJpeFR5cGVCJiBiKQorICB7CisgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgTWF0cml4VHlwZUE6OkJhc2UmPihhKS5tX3N0b3JhZ2Uuc3dhcChzdGF0aWNfY2FzdDx0eXBlbmFtZSBNYXRyaXhUeXBlQjo6QmFzZSY+KGIpLm1fc3RvcmFnZSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0RFTlNFU1RPUkFHRUJBU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvUHJvZHVjdC5oIGIvRWlnZW4vc3JjL0NvcmUvUHJvZHVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWE4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Qcm9kdWN0LmgKQEAgLTAsMCArMSw5OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCisvLyBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisvLyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BST0RVQ1RfSAorI2RlZmluZSBFSUdFTl9QUk9EVUNUX0gKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+IGNsYXNzIFByb2R1Y3Q7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+IGNsYXNzIFByb2R1Y3RJbXBsOworCisvKiogXGNsYXNzIFByb2R1Y3QKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgdGhlIHByb2R1Y3Qgb2YgdHdvIGFyYml0cmFyeSBtYXRyaWNlcyBvciB2ZWN0b3JzCisgICoKKyAgKiBccGFyYW0gTGhzIHRoZSB0eXBlIG9mIHRoZSBsZWZ0LWhhbmQgc2lkZSBleHByZXNzaW9uCisgICogXHBhcmFtIFJocyB0aGUgdHlwZSBvZiB0aGUgcmlnaHQtaGFuZCBzaWRlIGV4cHJlc3Npb24KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIHRoZSBwcm9kdWN0IG9mIHR3byBhcmJpdHJhcnkgbWF0cmljZXMuCisgICoKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czxQcm9kdWN0PExocywgUmhzPiA+Cit7CisgIHR5cGVkZWYgTWF0cml4WHByIFhwcktpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHM+Ojp0eXBlIExoc0NsZWFuZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxSaHM+Ojp0eXBlIFJoc0NsZWFuZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPHR5cGVuYW1lIHRyYWl0czxMaHNDbGVhbmVkPjo6U2NhbGFyLCB0eXBlbmFtZSB0cmFpdHM8UmhzQ2xlYW5lZD46OlNjYWxhcj46OlJldHVyblR5cGUgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHByb21vdGVfc3RvcmFnZV90eXBlPHR5cGVuYW1lIHRyYWl0czxMaHNDbGVhbmVkPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPFJoc0NsZWFuZWQ+OjpTdG9yYWdlS2luZD46OnJldCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX2luZGV4X3R5cGU8dHlwZW5hbWUgdHJhaXRzPExoc0NsZWFuZWQ+OjpJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPFJoc0NsZWFuZWQ+OjpJbmRleD46OnR5cGUgSW5kZXg7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTGhzQ2xlYW5lZDo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBSaHNDbGVhbmVkOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IExoc0NsZWFuZWQ6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gUmhzQ2xlYW5lZDo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgRmxhZ3MgPSAoTWF4Um93c0F0Q29tcGlsZVRpbWU9PTEgPyBSb3dNYWpvckJpdCA6IDApLCAvLyBUT0RPIHNob3VsZCBiZSBubyBzdG9yYWdlIG9yZGVyCisgICAgQ29lZmZSZWFkQ29zdCA9IDAgLy8gVE9ETyBDb2VmZlJlYWRDb3N0IHNob3VsZCBub3QgYmUgcGFydCBvZiB0aGUgZXhwcmVzc2lvbiB0cmFpdHMKKyAgfTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK2NsYXNzIFByb2R1Y3QgOiBwdWJsaWMgUHJvZHVjdEltcGw8TGhzLFJocyx0eXBlbmFtZSBpbnRlcm5hbDo6cHJvbW90ZV9zdG9yYWdlX3R5cGU8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxMaHM+OjpTdG9yYWdlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJocz46OlN0b3JhZ2VLaW5kPjo6cmV0PgoreworICBwdWJsaWM6CisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0SW1wbDwKKyAgICAgICAgTGhzLCBSaHMsCisgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpwcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSBMaHM6OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmhzOjpTdG9yYWdlS2luZD46OnJldD46OkJhc2UgQmFzZTsKKyAgICBFSUdFTl9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoUHJvZHVjdCkKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpOZXN0ZWQgTGhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmhzOjpOZXN0ZWQgUmhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TGhzTmVzdGVkPjo6dHlwZSBMaHNOZXN0ZWRDbGVhbmVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8UmhzTmVzdGVkPjo6dHlwZSBSaHNOZXN0ZWRDbGVhbmVkOworCisgICAgUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpIDogbV9saHMobGhzKSwgbV9yaHMocmhzKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChsaHMuY29scygpID09IHJocy5yb3dzKCkKKyAgICAgICAgJiYgImludmFsaWQgbWF0cml4IHByb2R1Y3QiCisgICAgICAgICYmICJpZiB5b3Ugd2FudGVkIGEgY29lZmYtd2lzZSBvciBhIGRvdCBwcm9kdWN0IHVzZSB0aGUgcmVzcGVjdGl2ZSBleHBsaWNpdCBmdW5jdGlvbnMiKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbGhzLnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9yaHMuY29scygpOyB9CisKKyAgICBjb25zdCBMaHNOZXN0ZWRDbGVhbmVkJiBsaHMoKSBjb25zdCB7IHJldHVybiBtX2xoczsgfQorICAgIGNvbnN0IFJoc05lc3RlZENsZWFuZWQmIHJocygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgY29uc3QgTGhzTmVzdGVkIG1fbGhzOworICAgIGNvbnN0IFJoc05lc3RlZCBtX3JoczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorY2xhc3MgUHJvZHVjdEltcGw8TGhzLFJocyxEZW5zZT4gOiBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPFByb2R1Y3Q8TGhzLFJocz4gPjo6dHlwZQoreworICAgIHR5cGVkZWYgUHJvZHVjdDxMaHMsIFJocz4gRGVyaXZlZDsKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8UHJvZHVjdDxMaHMsIFJocz4gPjo6dHlwZSBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCkKK307CisKKyNlbmRpZiAvLyBFSUdFTl9QUk9EVUNUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1Byb2R1Y3RCYXNlLmggYi9FaWdlbi9zcmMvQ29yZS9Qcm9kdWN0QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTJlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Qcm9kdWN0QmFzZS5oCkBAIC0wLDAgKzEsMjc4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QUk9EVUNUQkFTRV9ICisjZGVmaW5lIEVJR0VOX1BST0RVQ1RCQVNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgUHJvZHVjdEJhc2UKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBfTGhzLCB0eXBlbmFtZSBfUmhzPgorc3RydWN0IHRyYWl0czxQcm9kdWN0QmFzZTxEZXJpdmVkLF9MaHMsX1Jocz4gPgoreworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8X0xocz46OnR5cGUgTGhzOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8X1Jocz46OnR5cGUgUmhzOworICB0eXBlZGVmIHR5cGVuYW1lIHNjYWxhcl9wcm9kdWN0X3RyYWl0czx0eXBlbmFtZSBMaHM6OlNjYWxhciwgdHlwZW5hbWUgUmhzOjpTY2FsYXI+OjpSZXR1cm5UeXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSB0cmFpdHM8TGhzPjo6U3RvcmFnZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPFJocz46OlN0b3JhZ2VLaW5kPjo6cmV0IFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHByb21vdGVfaW5kZXhfdHlwZTx0eXBlbmFtZSB0cmFpdHM8TGhzPjo6SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxSaHM+OjpJbmRleD46OnR5cGUgSW5kZXg7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gdHJhaXRzPExocz46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gdHJhaXRzPFJocz46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gdHJhaXRzPExocz46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gdHJhaXRzPFJocz46Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgIEZsYWdzID0gKE1heFJvd3NBdENvbXBpbGVUaW1lPT0xID8gUm93TWFqb3JCaXQgOiAwKQorICAgICAgICAgIHwgRXZhbEJlZm9yZU5lc3RpbmdCaXQgfCBFdmFsQmVmb3JlQXNzaWduaW5nQml0IHwgTmVzdEJ5UmVmQml0LAorICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IEV2YWxCZWZvcmVOZXN0aW5nQml0IGFuZCBOZXN0QnlSZWZCaXQKKyAgICAgICAgICAgICAgICAgIC8vIGFyZSBub3QgdXNlZCBpbiBwcmFjdGljZSBiZWNhdXNlIG5lc3RlZCBpcyBvdmVybG9hZGVkIGZvciBwcm9kdWN0cworICAgIENvZWZmUmVhZENvc3QgPSAwIC8vIEZJWE1FIHdoeSBpcyBpdCBuZWVkZWQgPworICB9OworfTsKK30KKworI2RlZmluZSBFSUdFTl9QUk9EVUNUX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCkgXAorICB0eXBlZGVmIFByb2R1Y3RCYXNlPERlcml2ZWQsIExocywgUmhzID4gQmFzZTsgXAorICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQpIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpMaHNOZXN0ZWQgTGhzTmVzdGVkOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6X0xoc05lc3RlZCBfTGhzTmVzdGVkOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6TGhzQmxhc1RyYWl0cyBMaHNCbGFzVHJhaXRzOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6QWN0dWFsTGhzVHlwZSBBY3R1YWxMaHNUeXBlOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6X0FjdHVhbExoc1R5cGUgX0FjdHVhbExoc1R5cGU7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpSaHNOZXN0ZWQgUmhzTmVzdGVkOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6X1Joc05lc3RlZCBfUmhzTmVzdGVkOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UmhzQmxhc1RyYWl0cyBSaHNCbGFzVHJhaXRzOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6QWN0dWFsUmhzVHlwZSBBY3R1YWxSaHNUeXBlOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6X0FjdHVhbFJoc1R5cGUgX0FjdHVhbFJoc1R5cGU7IFwKKyAgdXNpbmcgQmFzZTo6bV9saHM7IFwKKyAgdXNpbmcgQmFzZTo6bV9yaHM7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorY2xhc3MgUHJvZHVjdEJhc2UgOiBwdWJsaWMgTWF0cml4QmFzZTxEZXJpdmVkPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBNYXRyaXhCYXNlPERlcml2ZWQ+IEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShQcm9kdWN0QmFzZSkKKyAgICAKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExoczo6TmVzdGVkIExoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPExoc05lc3RlZD46OnR5cGUgX0xoc05lc3RlZDsKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxfTGhzTmVzdGVkPiBMaHNCbGFzVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxMaHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QWN0dWFsTGhzVHlwZT46OnR5cGUgX0FjdHVhbExoc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPExocz46OlNjYWxhciBMaHNTY2FsYXI7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6TmVzdGVkIFJoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPFJoc05lc3RlZD46OnR5cGUgX1Joc05lc3RlZDsKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxfUmhzTmVzdGVkPiBSaHNCbGFzVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxSaHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QWN0dWFsUmhzVHlwZT46OnR5cGUgX0FjdHVhbFJoc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJocz46OlNjYWxhciBSaHNTY2FsYXI7CisKKyAgICAvLyBEaWFnb25hbCBvZiBhIHByb2R1Y3Q6IG5vIG5lZWQgdG8gZXZhbHVhdGUgdGhlIGFyZ3VtZW50cyBiZWNhdXNlIHRoZXkgYXJlIGdvaW5nIHRvIGJlIGV2YWx1YXRlZCBvbmx5IG9uY2UKKyAgICB0eXBlZGVmIENvZWZmQmFzZWRQcm9kdWN0PExoc05lc3RlZCwgUmhzTmVzdGVkLCAwPiBGdWxseUxhenlDb2VmZkJhc2VQcm9kdWN0VHlwZTsKKworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworCisgICAgUHJvZHVjdEJhc2UoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICAgICAgOiBtX2xocyhsaHMpLCBtX3JocyhyaHMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGxocy5jb2xzKCkgPT0gcmhzLnJvd3MoKQorICAgICAgICAmJiAiaW52YWxpZCBtYXRyaXggcHJvZHVjdCIKKyAgICAgICAgJiYgImlmIHlvdSB3YW50ZWQgYSBjb2VmZi13aXNlIG9yIGEgZG90IHByb2R1Y3QgdXNlIHRoZSByZXNwZWN0aXZlIGV4cGxpY2l0IGZ1bmN0aW9ucyIpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9saHMucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3Jocy5jb2xzKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QgeyBkc3Quc2V0WmVybygpOyBzY2FsZUFuZEFkZFRvKGRzdCxTY2FsYXIoMSkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICAgIGlubGluZSB2b2lkIGFkZFRvKERlc3QmIGRzdCkgY29uc3QgeyBzY2FsZUFuZEFkZFRvKGRzdCxTY2FsYXIoMSkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICAgIGlubGluZSB2b2lkIHN1YlRvKERlc3QmIGRzdCkgY29uc3QgeyBzY2FsZUFuZEFkZFRvKGRzdCxTY2FsYXIoLTEpKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KKyAgICBpbmxpbmUgdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRzdCxTY2FsYXIgYWxwaGEpIGNvbnN0IHsgZGVyaXZlZCgpLnNjYWxlQW5kQWRkVG8oZHN0LGFscGhhKTsgfQorCisgICAgY29uc3QgX0xoc05lc3RlZCYgbGhzKCkgY29uc3QgeyByZXR1cm4gbV9saHM7IH0KKyAgICBjb25zdCBfUmhzTmVzdGVkJiByaHMoKSBjb25zdCB7IHJldHVybiBtX3JoczsgfQorCisgICAgLy8gSW1wbGljaXQgY29udmVyc2lvbiB0byB0aGUgbmVzdGVkIHR5cGUgKHRyaWdnZXIgdGhlIGV2YWx1YXRpb24gb2YgdGhlIHByb2R1Y3QpCisgICAgb3BlcmF0b3IgY29uc3QgUGxhaW5PYmplY3QmICgpIGNvbnN0CisgICAgeworICAgICAgbV9yZXN1bHQucmVzaXplKG1fbGhzLnJvd3MoKSwgbV9yaHMuY29scygpKTsKKyAgICAgIGRlcml2ZWQoKS5ldmFsVG8obV9yZXN1bHQpOworICAgICAgcmV0dXJuIG1fcmVzdWx0OworICAgIH0KKworICAgIGNvbnN0IERpYWdvbmFsPGNvbnN0IEZ1bGx5TGF6eUNvZWZmQmFzZVByb2R1Y3RUeXBlLDA+IGRpYWdvbmFsKCkgY29uc3QKKyAgICB7IHJldHVybiBGdWxseUxhenlDb2VmZkJhc2VQcm9kdWN0VHlwZShtX2xocywgbV9yaHMpOyB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgSW5kZXg+CisgICAgY29uc3QgRGlhZ29uYWw8RnVsbHlMYXp5Q29lZmZCYXNlUHJvZHVjdFR5cGUsSW5kZXg+IGRpYWdvbmFsKCkgY29uc3QKKyAgICB7IHJldHVybiBGdWxseUxhenlDb2VmZkJhc2VQcm9kdWN0VHlwZShtX2xocywgbV9yaHMpOyB9CisKKyAgICBjb25zdCBEaWFnb25hbDxGdWxseUxhenlDb2VmZkJhc2VQcm9kdWN0VHlwZSxEeW5hbWljPiBkaWFnb25hbChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7IHJldHVybiBGdWxseUxhenlDb2VmZkJhc2VQcm9kdWN0VHlwZShtX2xocywgbV9yaHMpLmRpYWdvbmFsKGluZGV4KTsgfQorCisgICAgLy8gcmVzdHJpY3QgY29lZmYgYWNjZXNzb3JzIHRvIDF4MSBleHByZXNzaW9ucy4gTm8gbmVlZCB0byBjYXJlIGFib3V0IG11dGF0b3JzIGhlcmUgc2luY2UgdGhpcyBpc250IGEgTHZhbHVlIGV4cHJlc3Npb24KKyAgICB0eXBlbmFtZSBCYXNlOjpDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworI2lmZGVmIEVJR0VOMl9TVVBQT1JUCisgICAgICByZXR1cm4gbGhzKCkucm93KHJvdykuY3dpc2VQcm9kdWN0KHJocygpLmNvbChjb2wpLnRyYW5zcG9zZSgpKS5zdW0oKTsKKyNlbHNlCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NJWkVfMXgxKERlcml2ZWQpCisgICAgICBlaWdlbl9hc3NlcnQodGhpcy0+cm93cygpID09IDEgJiYgdGhpcy0+Y29scygpID09IDEpOworICAgICAgTWF0cml4PFNjYWxhciwxLDE+IHJlc3VsdCA9ICp0aGlzOworICAgICAgcmV0dXJuIHJlc3VsdC5jb2VmZihyb3csY29sKTsKKyNlbmRpZgorICAgIH0KKworICAgIHR5cGVuYW1lIEJhc2U6OkNvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0laRV8xeDEoRGVyaXZlZCkKKyAgICAgIGVpZ2VuX2Fzc2VydCh0aGlzLT5yb3dzKCkgPT0gMSAmJiB0aGlzLT5jb2xzKCkgPT0gMSk7CisgICAgICBNYXRyaXg8U2NhbGFyLDEsMT4gcmVzdWx0ID0gKnRoaXM7CisgICAgICByZXR1cm4gcmVzdWx0LmNvZWZmKGkpOworICAgIH0KKworICAgIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TSVpFXzF4MShEZXJpdmVkKQorICAgICAgZWlnZW5fYXNzZXJ0KHRoaXMtPnJvd3MoKSA9PSAxICYmIHRoaXMtPmNvbHMoKSA9PSAxKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkuY29lZmZSZWYocm93LGNvbCk7CisgICAgfQorCisgICAgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0laRV8xeDEoRGVyaXZlZCkKKyAgICAgIGVpZ2VuX2Fzc2VydCh0aGlzLT5yb3dzKCkgPT0gMSAmJiB0aGlzLT5jb2xzKCkgPT0gMSk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLmNvZWZmUmVmKGkpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICBMaHNOZXN0ZWQgbV9saHM7CisgICAgUmhzTmVzdGVkIG1fcmhzOworCisgICAgbXV0YWJsZSBQbGFpbk9iamVjdCBtX3Jlc3VsdDsKK307CisKKy8vIGhlcmUgd2UgbmVlZCB0byBvdmVybG9hZCB0aGUgbmVzdGVkIHJ1bGUgZm9yIHByb2R1Y3RzCisvLyBzdWNoIHRoYXQgdGhlIG5lc3RlZCB0eXBlIGlzIGEgY29uc3QgcmVmZXJlbmNlIHRvIGEgcGxhaW4gbWF0cml4CituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlLCBpbnQgTiwgdHlwZW5hbWUgUGxhaW5PYmplY3Q+CitzdHJ1Y3QgbmVzdGVkPEdlbmVyYWxQcm9kdWN0PExocyxSaHMsTW9kZT4sIE4sIFBsYWluT2JqZWN0PgoreworICB0eXBlZGVmIFBsYWluT2JqZWN0IGNvbnN0JiB0eXBlOworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTmVzdGVkUHJvZHVjdD4KK2NsYXNzIFNjYWxlZFByb2R1Y3Q7CisKKy8vIE5vdGUgdGhhdCB0aGVzZSB0d28gb3BlcmF0b3IqIGZ1bmN0aW9ucyBhcmUgbm90IGRlZmluZWQgYXMgbWVtYmVyCisvLyBmdW5jdGlvbnMgb2YgUHJvZHVjdEJhc2UsIGJlY2F1c2UsIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvCisvLyBkZWZpbmUgYWxsIG92ZXJsb2FkcyBkZWZpbmVkIGluIE1hdHJpeEJhc2UuIEZ1cnRoZXJtb3JlLCBVc2luZworLy8gInVzaW5nIEJhc2U6Om9wZXJhdG9yKiIgd291bGQgbm90IHdvcmsgd2l0aCBNU1ZDLgorLy8KKy8vIEFsc28gbm90ZSB0aGF0IGhlcmUgd2UgYWNjZXB0IGFueSBjb21wYXRpYmxlIHNjYWxhciB0eXBlcwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCx0eXBlbmFtZSBMaHMsdHlwZW5hbWUgUmhzPgorY29uc3QgU2NhbGVkUHJvZHVjdDxEZXJpdmVkPgorb3BlcmF0b3IqKGNvbnN0IFByb2R1Y3RCYXNlPERlcml2ZWQsTGhzLFJocz4mIHByb2QsIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciB4KQoreyByZXR1cm4gU2NhbGVkUHJvZHVjdDxEZXJpdmVkPihwcm9kLmRlcml2ZWQoKSwgeCk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCx0eXBlbmFtZSBMaHMsdHlwZW5hbWUgUmhzPgordHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjwhaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyLHR5cGVuYW1lIERlcml2ZWQ6OlJlYWxTY2FsYXI+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsZWRQcm9kdWN0PERlcml2ZWQ+ID46OnR5cGUKK29wZXJhdG9yKihjb25zdCBQcm9kdWN0QmFzZTxEZXJpdmVkLExocyxSaHM+JiBwcm9kLCB0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyIHgpCit7IHJldHVybiBTY2FsZWRQcm9kdWN0PERlcml2ZWQ+KHByb2QuZGVyaXZlZCgpLCB4KTsgfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsdHlwZW5hbWUgTGhzLHR5cGVuYW1lIFJocz4KK2NvbnN0IFNjYWxlZFByb2R1Y3Q8RGVyaXZlZD4KK29wZXJhdG9yKih0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgeCxjb25zdCBQcm9kdWN0QmFzZTxEZXJpdmVkLExocyxSaHM+JiBwcm9kKQoreyByZXR1cm4gU2NhbGVkUHJvZHVjdDxEZXJpdmVkPihwcm9kLmRlcml2ZWQoKSwgeCk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCx0eXBlbmFtZSBMaHMsdHlwZW5hbWUgUmhzPgordHlwZW5hbWUgaW50ZXJuYWw6OmVuYWJsZV9pZjwhaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyLHR5cGVuYW1lIERlcml2ZWQ6OlJlYWxTY2FsYXI+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsZWRQcm9kdWN0PERlcml2ZWQ+ID46OnR5cGUKK29wZXJhdG9yKih0eXBlbmFtZSBEZXJpdmVkOjpSZWFsU2NhbGFyIHgsY29uc3QgUHJvZHVjdEJhc2U8RGVyaXZlZCxMaHMsUmhzPiYgcHJvZCkKK3sgcmV0dXJuIFNjYWxlZFByb2R1Y3Q8RGVyaXZlZD4ocHJvZC5kZXJpdmVkKCksIHgpOyB9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBOZXN0ZWRQcm9kdWN0Pgorc3RydWN0IHRyYWl0czxTY2FsZWRQcm9kdWN0PE5lc3RlZFByb2R1Y3Q+ID4KKyA6IHRyYWl0czxQcm9kdWN0QmFzZTxTY2FsZWRQcm9kdWN0PE5lc3RlZFByb2R1Y3Q+LAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIE5lc3RlZFByb2R1Y3Q6Ol9MaHNOZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTmVzdGVkUHJvZHVjdDo6X1Joc05lc3RlZD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxOZXN0ZWRQcm9kdWN0Pjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBOZXN0ZWRQcm9kdWN0PgorY2xhc3MgU2NhbGVkUHJvZHVjdAorICA6IHB1YmxpYyBQcm9kdWN0QmFzZTxTY2FsZWRQcm9kdWN0PE5lc3RlZFByb2R1Y3Q+LAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOZXN0ZWRQcm9kdWN0OjpfTGhzTmVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOZXN0ZWRQcm9kdWN0OjpfUmhzTmVzdGVkPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBQcm9kdWN0QmFzZTxTY2FsZWRQcm9kdWN0PE5lc3RlZFByb2R1Y3Q+LAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOZXN0ZWRQcm9kdWN0OjpfTGhzTmVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOZXN0ZWRQcm9kdWN0OjpfUmhzTmVzdGVkPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworLy8gICAgIEVJR0VOX1BST0RVQ1RfUFVCTElDX0lOVEVSRkFDRShTY2FsZWRQcm9kdWN0KQorCisgICAgU2NhbGVkUHJvZHVjdChjb25zdCBOZXN0ZWRQcm9kdWN0JiBwcm9kLCBTY2FsYXIgeCkKKyAgICA6IEJhc2UocHJvZC5saHMoKSxwcm9kLnJocygpKSwgbV9wcm9kKHByb2QpLCBtX2FscGhhKHgpIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICAgIGlubGluZSB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0IHsgZHN0LnNldFplcm8oKTsgc2NhbGVBbmRBZGRUbyhkc3QsIFNjYWxhcigxKSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgaW5saW5lIHZvaWQgYWRkVG8oRGVzdCYgZHN0KSBjb25zdCB7IHNjYWxlQW5kQWRkVG8oZHN0LCBTY2FsYXIoMSkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICAgIGlubGluZSB2b2lkIHN1YlRvKERlc3QmIGRzdCkgY29uc3QgeyBzY2FsZUFuZEFkZFRvKGRzdCwgU2NhbGFyKC0xKSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgaW5saW5lIHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkc3QsU2NhbGFyIGFscGhhKSBjb25zdCB7IG1fcHJvZC5kZXJpdmVkKCkuc2NhbGVBbmRBZGRUbyhkc3QsYWxwaGEgKiBtX2FscGhhKTsgfQorCisgICAgY29uc3QgU2NhbGFyJiBhbHBoYSgpIGNvbnN0IHsgcmV0dXJuIG1fYWxwaGE7IH0KKyAgICAKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IE5lc3RlZFByb2R1Y3QmIG1fcHJvZDsKKyAgICBTY2FsYXIgbV9hbHBoYTsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBPdmVybG9hZGVkIHRvIHBlcmZvcm0gYW4gZWZmaWNpZW50IEMgPSAoQSpCKS5sYXp5KCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitEZXJpdmVkJiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpsYXp5QXNzaWduKGNvbnN0IFByb2R1Y3RCYXNlPFByb2R1Y3REZXJpdmVkLCBMaHMsUmhzPiYgb3RoZXIpCit7CisgIG90aGVyLmRlcml2ZWQoKS5ldmFsVG8oZGVyaXZlZCgpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QUk9EVUNUQkFTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9SYW5kb20uaCBiL0VpZ2VuL3NyYy9Db3JlL1JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjdmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9SYW5kb20uaApAQCAtMCwwICsxLDE1MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1JBTkRPTV9ICisjZGVmaW5lIEVJR0VOX1JBTkRPTV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfcmFuZG9tX29wIHsKKyAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1Ioc2NhbGFyX3JhbmRvbV9vcCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+CisgIGlubGluZSBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoSW5kZXgsIEluZGV4ID0gMCkgY29uc3QgeyByZXR1cm4gcmFuZG9tPFNjYWxhcj4oKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9yYW5kb21fb3A8U2NhbGFyPiA+Cit7IGVudW0geyBDb3N0ID0gNSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0LCBQYWNrZXRBY2Nlc3MgPSBmYWxzZSwgSXNSZXBlYXRhYmxlID0gZmFsc2UgfTsgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBccmV0dXJucyBhIHJhbmRvbSBtYXRyaXggZXhwcmVzc2lvbgorICAqCisgICogVGhlIHBhcmFtZXRlcnMgXGEgcm93cyBhbmQgXGEgY29scyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGFuZCBvZiBjb2x1bW5zIG9mCisgICogdGhlIHJldHVybmVkIG1hdHJpeC4gTXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBNYXRyaXhCYXNlIHR5cGUuCisgICoKKyAgKiBUaGlzIHZhcmlhbnQgaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgZHluYW1pYy1zaXplIG1hdHJpeCB0eXBlcy4gRm9yIGZpeGVkLXNpemUgdHlwZXMsCisgICogaXQgaXMgcmVkdW5kYW50IHRvIHBhc3MgXGEgcm93cyBhbmQgXGEgY29scyBhcyBhcmd1bWVudHMsIHNvIFJhbmRvbSgpIHNob3VsZCBiZSB1c2VkCisgICogaW5zdGVhZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfcmFuZG9tX2ludF9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9yYW5kb21faW50X2ludC5vdXQKKyAgKgorICAqIFRoaXMgZXhwcmVzc2lvbiBoYXMgdGhlICJldmFsdWF0ZSBiZWZvcmUgbmVzdGluZyIgZmxhZyBzbyB0aGF0IGl0IHdpbGwgYmUgZXZhbHVhdGVkIGludG8KKyAgKiBhIHRlbXBvcmFyeSBtYXRyaXggd2hlbmV2ZXIgaXQgaXMgbmVzdGVkIGluIGEgbGFyZ2VyIGV4cHJlc3Npb24uIFRoaXMgcHJldmVudHMgdW5leHBlY3RlZAorICAqIGJlaGF2aW9yIHdpdGggZXhwcmVzc2lvbnMgaW52b2x2aW5nIHJhbmRvbSBtYXRyaWNlcy4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpzZXRSYW5kb20oKSwgTWF0cml4QmFzZTo6UmFuZG9tKEluZGV4KSwgTWF0cml4QmFzZTo6UmFuZG9tKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgQ3dpc2VOdWxsYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9yYW5kb21fb3A8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPiwgRGVyaXZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6UmFuZG9tKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCit7CisgIHJldHVybiBOdWxsYXJ5RXhwcihyb3dzLCBjb2xzLCBpbnRlcm5hbDo6c2NhbGFyX3JhbmRvbV9vcDxTY2FsYXI+KCkpOworfQorCisvKiogXHJldHVybnMgYSByYW5kb20gdmVjdG9yIGV4cHJlc3Npb24KKyAgKgorICAqIFRoZSBwYXJhbWV0ZXIgXGEgc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuZWQgdmVjdG9yLgorICAqIE11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgTWF0cml4QmFzZSB0eXBlLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFRoaXMgdmFyaWFudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBkeW5hbWljLXNpemUgdmVjdG9yIHR5cGVzLiBGb3IgZml4ZWQtc2l6ZSB0eXBlcywKKyAgKiBpdCBpcyByZWR1bmRhbnQgdG8gcGFzcyBcYSBzaXplIGFzIGFyZ3VtZW50LCBzbyBSYW5kb20oKSBzaG91bGQgYmUgdXNlZAorICAqIGluc3RlYWQuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3JhbmRvbV9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9yYW5kb21faW50Lm91dAorICAqCisgICogVGhpcyBleHByZXNzaW9uIGhhcyB0aGUgImV2YWx1YXRlIGJlZm9yZSBuZXN0aW5nIiBmbGFnIHNvIHRoYXQgaXQgd2lsbCBiZSBldmFsdWF0ZWQgaW50bworICAqIGEgdGVtcG9yYXJ5IHZlY3RvciB3aGVuZXZlciBpdCBpcyBuZXN0ZWQgaW4gYSBsYXJnZXIgZXhwcmVzc2lvbi4gVGhpcyBwcmV2ZW50cyB1bmV4cGVjdGVkCisgICogYmVoYXZpb3Igd2l0aCBleHByZXNzaW9ucyBpbnZvbHZpbmcgcmFuZG9tIG1hdHJpY2VzLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnNldFJhbmRvbSgpLCBNYXRyaXhCYXNlOjpSYW5kb20oSW5kZXgsSW5kZXgpLCBNYXRyaXhCYXNlOjpSYW5kb20oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBDd2lzZU51bGxhcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3JhbmRvbV9vcDx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+LCBEZXJpdmVkPgorRGVuc2VCYXNlPERlcml2ZWQ+OjpSYW5kb20oSW5kZXggc2l6ZSkKK3sKKyAgcmV0dXJuIE51bGxhcnlFeHByKHNpemUsIGludGVybmFsOjpzY2FsYXJfcmFuZG9tX29wPFNjYWxhcj4oKSk7Cit9CisKKy8qKiBccmV0dXJucyBhIGZpeGVkLXNpemUgcmFuZG9tIG1hdHJpeCBvciB2ZWN0b3IgZXhwcmVzc2lvbgorICAqCisgICogVGhpcyB2YXJpYW50IGlzIG9ubHkgZm9yIGZpeGVkLXNpemUgTWF0cml4QmFzZSB0eXBlcy4gRm9yIGR5bmFtaWMtc2l6ZSB0eXBlcywgeW91CisgICogbmVlZCB0byB1c2UgdGhlIHZhcmlhbnRzIHRha2luZyBzaXplIGFyZ3VtZW50cy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfcmFuZG9tLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcmFuZG9tLm91dAorICAqCisgICogVGhpcyBleHByZXNzaW9uIGhhcyB0aGUgImV2YWx1YXRlIGJlZm9yZSBuZXN0aW5nIiBmbGFnIHNvIHRoYXQgaXQgd2lsbCBiZSBldmFsdWF0ZWQgaW50bworICAqIGEgdGVtcG9yYXJ5IG1hdHJpeCB3aGVuZXZlciBpdCBpcyBuZXN0ZWQgaW4gYSBsYXJnZXIgZXhwcmVzc2lvbi4gVGhpcyBwcmV2ZW50cyB1bmV4cGVjdGVkCisgICogYmVoYXZpb3Igd2l0aCBleHByZXNzaW9ucyBpbnZvbHZpbmcgcmFuZG9tIG1hdHJpY2VzLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnNldFJhbmRvbSgpLCBNYXRyaXhCYXNlOjpSYW5kb20oSW5kZXgsSW5kZXgpLCBNYXRyaXhCYXNlOjpSYW5kb20oSW5kZXgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfcmFuZG9tX29wPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj4sIERlcml2ZWQ+CitEZW5zZUJhc2U8RGVyaXZlZD46OlJhbmRvbSgpCit7CisgIHJldHVybiBOdWxsYXJ5RXhwcihSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIGludGVybmFsOjpzY2FsYXJfcmFuZG9tX29wPFNjYWxhcj4oKSk7Cit9CisKKy8qKiBTZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIHJhbmRvbSB2YWx1ZXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3NldFJhbmRvbS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3NldFJhbmRvbS5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZU51bGxhcnlPcCwgc2V0UmFuZG9tKEluZGV4KSwgc2V0UmFuZG9tKEluZGV4LEluZGV4KQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD46OnNldFJhbmRvbSgpCit7CisgIHJldHVybiAqdGhpcyA9IFJhbmRvbShyb3dzKCksIGNvbHMoKSk7Cit9CisKKy8qKiBSZXNpemVzIHRvIHRoZSBnaXZlbiBcYSBzaXplLCBhbmQgc2V0cyBhbGwgY29lZmZpY2llbnRzIGluIHRoaXMgZXhwcmVzc2lvbiB0byByYW5kb20gdmFsdWVzLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeF9zZXRSYW5kb21faW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9zZXRSYW5kb21faW50Lm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnNldFJhbmRvbSgpLCBzZXRSYW5kb20oSW5kZXgsSW5kZXgpLCBjbGFzcyBDd2lzZU51bGxhcnlPcCwgTWF0cml4QmFzZTo6UmFuZG9tKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmCitQbGFpbk9iamVjdEJhc2U8RGVyaXZlZD46OnNldFJhbmRvbShJbmRleCBzaXplKQoreworICByZXNpemUoc2l6ZSk7CisgIHJldHVybiBzZXRSYW5kb20oKTsKK30KKworLyoqIFJlc2l6ZXMgdG8gdGhlIGdpdmVuIHNpemUsIGFuZCBzZXRzIGFsbCBjb2VmZmljaWVudHMgaW4gdGhpcyBleHByZXNzaW9uIHRvIHJhbmRvbSB2YWx1ZXMuCisgICoKKyAgKiBccGFyYW0gcm93cyB0aGUgbmV3IG51bWJlciBvZiByb3dzCisgICogXHBhcmFtIGNvbHMgdGhlIG5ldyBudW1iZXIgb2YgY29sdW1ucworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4X3NldFJhbmRvbV9pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeF9zZXRSYW5kb21faW50X2ludC5vdXQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpzZXRSYW5kb20oKSwgc2V0UmFuZG9tKEluZGV4KSwgY2xhc3MgQ3dpc2VOdWxsYXJ5T3AsIE1hdHJpeEJhc2U6OlJhbmRvbSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJgorUGxhaW5PYmplY3RCYXNlPERlcml2ZWQ+OjpzZXRSYW5kb20oSW5kZXggcm93cywgSW5kZXggY29scykKK3sKKyAgcmVzaXplKHJvd3MsIGNvbHMpOworICByZXR1cm4gc2V0UmFuZG9tKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUkFORE9NX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1JlZHV4LmggYi9FaWdlbi9zcmMvQ29yZS9SZWR1eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Y2U3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9SZWR1eC5oCkBAIC0wLDAgKzEsNDA2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9SRURVWF9ICisjZGVmaW5lIEVJR0VOX1JFRFVYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRPRE8KKy8vICAqIGltcGxlbWVudCBvdGhlciBraW5kIG9mIHZlY3Rvcml6YXRpb24KKy8vICAqIGZhY3Rvcml6ZSBjb2RlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUGFydCAxIDogdGhlIGxvZ2ljIGRlY2lkaW5nIGEgc3RyYXRlZ3kgZm9yIHZlY3Rvcml6YXRpb24gYW5kIHVucm9sbGluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHJlZHV4X3RyYWl0cworeworcHVibGljOgorICBlbnVtIHsKKyAgICBQYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXI+OjpzaXplLAorICAgIElubmVyTWF4U2l6ZSA9IGludChEZXJpdmVkOjpJc1Jvd01ham9yKQorICAgICAgICAgICAgICAgICA/IERlcml2ZWQ6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgICAgICAgICAgICAgIDogRGVyaXZlZDo6TWF4Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICBlbnVtIHsKKyAgICBNaWdodFZlY3Rvcml6ZSA9IChpbnQoRGVyaXZlZDo6RmxhZ3MpJkFjdHVhbFBhY2tldEFjY2Vzc0JpdCkKKyAgICAgICAgICAgICAgICAgICYmIChmdW5jdG9yX3RyYWl0czxGdW5jPjo6UGFja2V0QWNjZXNzKSwKKyAgICBNYXlMaW5lYXJWZWN0b3JpemUgPSBNaWdodFZlY3Rvcml6ZSAmJiAoaW50KERlcml2ZWQ6OkZsYWdzKSZMaW5lYXJBY2Nlc3NCaXQpLAorICAgIE1heVNsaWNlVmVjdG9yaXplICA9IE1pZ2h0VmVjdG9yaXplICYmIGludChJbm5lck1heFNpemUpPj0zKlBhY2tldFNpemUKKyAgfTsKKworcHVibGljOgorICBlbnVtIHsKKyAgICBUcmF2ZXJzYWwgPSBpbnQoTWF5TGluZWFyVmVjdG9yaXplKSA/IGludChMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKQorICAgICAgICAgICAgICA6IGludChNYXlTbGljZVZlY3Rvcml6ZSkgID8gaW50KFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChEZWZhdWx0VHJhdmVyc2FsKQorICB9OworCitwdWJsaWM6CisgIGVudW0geworICAgIENvc3QgPSAoICBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljCisgICAgICAgICAgIHx8IERlcml2ZWQ6OkNvZWZmUmVhZENvc3QgPT0gRHluYW1pYworICAgICAgICAgICB8fCAoRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUhPTEgJiYgZnVuY3Rvcl90cmFpdHM8RnVuYz46OkNvc3QgPT0gRHluYW1pYykKKyAgICAgICAgICAgKSA/IER5bmFtaWMKKyAgICAgICAgICAgOiBEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSAqIERlcml2ZWQ6OkNvZWZmUmVhZENvc3QKKyAgICAgICAgICAgICAgICsgKERlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lLTEpICogZnVuY3Rvcl90cmFpdHM8RnVuYz46OkNvc3QsCisgICAgVW5yb2xsaW5nTGltaXQgPSBFSUdFTl9VTlJPTExJTkdfTElNSVQgKiAoaW50KFRyYXZlcnNhbCkgPT0gaW50KERlZmF1bHRUcmF2ZXJzYWwpID8gMSA6IGludChQYWNrZXRTaXplKSkKKyAgfTsKKworcHVibGljOgorICBlbnVtIHsKKyAgICBVbnJvbGxpbmcgPSBDb3N0ICE9IER5bmFtaWMgJiYgQ29zdCA8PSBVbnJvbGxpbmdMaW1pdAorICAgICAgICAgICAgICA/IENvbXBsZXRlVW5yb2xsaW5nCisgICAgICAgICAgICAgIDogTm9VbnJvbGxpbmcKKyAgfTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUGFydCAyIDogdW5yb2xsZXJzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiogbm8gdmVjdG9yaXphdGlvbiAqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIERlcml2ZWQsIGludCBTdGFydCwgaW50IExlbmd0aD4KK3N0cnVjdCByZWR1eF9ub3ZlY191bnJvbGxlcgoreworICBlbnVtIHsKKyAgICBIYWxmTGVuZ3RoID0gTGVuZ3RoLzIKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHJ1bihjb25zdCBEZXJpdmVkICZtYXQsIGNvbnN0IEZ1bmMmIGZ1bmMpCisgIHsKKyAgICByZXR1cm4gZnVuYyhyZWR1eF9ub3ZlY191bnJvbGxlcjxGdW5jLCBEZXJpdmVkLCBTdGFydCwgSGFsZkxlbmd0aD46OnJ1bihtYXQsZnVuYyksCisgICAgICAgICAgICAgICAgcmVkdXhfbm92ZWNfdW5yb2xsZXI8RnVuYywgRGVyaXZlZCwgU3RhcnQrSGFsZkxlbmd0aCwgTGVuZ3RoLUhhbGZMZW5ndGg+OjpydW4obWF0LGZ1bmMpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZCwgaW50IFN0YXJ0Pgorc3RydWN0IHJlZHV4X25vdmVjX3Vucm9sbGVyPEZ1bmMsIERlcml2ZWQsIFN0YXJ0LCAxPgoreworICBlbnVtIHsKKyAgICBvdXRlciA9IFN0YXJ0IC8gRGVyaXZlZDo6SW5uZXJTaXplQXRDb21waWxlVGltZSwKKyAgICBpbm5lciA9IFN0YXJ0ICUgRGVyaXZlZDo6SW5uZXJTaXplQXRDb21waWxlVGltZQorICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQgJm1hdCwgY29uc3QgRnVuYyYpCisgIHsKKyAgICByZXR1cm4gbWF0LmNvZWZmQnlPdXRlcklubmVyKG91dGVyLCBpbm5lcik7CisgIH0KK307CisKKy8vIFRoaXMgaXMgYWN0dWFsbHkgZGVhZCBjb2RlIGFuZCB3aWxsIG5ldmVyIGJlIGNhbGxlZC4gSXQgaXMgcmVxdWlyZWQKKy8vIHRvIHByZXZlbnQgZmFsc2Ugd2FybmluZ3MgcmVnYXJkaW5nIGZhaWxlZCBpbmxpbmluZyB0aG91Z2gKKy8vIGZvciAwIGxlbmd0aCBydW4oKSB3aWxsIG5ldmVyIGJlIGNhbGxlZCBhdCBhbGwuCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBEZXJpdmVkLCBpbnQgU3RhcnQ+CitzdHJ1Y3QgcmVkdXhfbm92ZWNfdW5yb2xsZXI8RnVuYywgRGVyaXZlZCwgU3RhcnQsIDA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHJ1bihjb25zdCBEZXJpdmVkJiwgY29uc3QgRnVuYyYpIHsgcmV0dXJuIFNjYWxhcigpOyB9Cit9OworCisvKioqIHZlY3Rvcml6YXRpb24gKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBEZXJpdmVkLCBpbnQgU3RhcnQsIGludCBMZW5ndGg+CitzdHJ1Y3QgcmVkdXhfdmVjX3Vucm9sbGVyCit7CisgIGVudW0geworICAgIFBhY2tldFNpemUgPSBwYWNrZXRfdHJhaXRzPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj46OnNpemUsCisgICAgSGFsZkxlbmd0aCA9IExlbmd0aC8yCisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0U2NhbGFyIHJ1bihjb25zdCBEZXJpdmVkICZtYXQsIGNvbnN0IEZ1bmMmIGZ1bmMpCisgIHsKKyAgICByZXR1cm4gZnVuYy5wYWNrZXRPcCgKKyAgICAgICAgICAgIHJlZHV4X3ZlY191bnJvbGxlcjxGdW5jLCBEZXJpdmVkLCBTdGFydCwgSGFsZkxlbmd0aD46OnJ1bihtYXQsZnVuYyksCisgICAgICAgICAgICByZWR1eF92ZWNfdW5yb2xsZXI8RnVuYywgRGVyaXZlZCwgU3RhcnQrSGFsZkxlbmd0aCwgTGVuZ3RoLUhhbGZMZW5ndGg+OjpydW4obWF0LGZ1bmMpICk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIERlcml2ZWQsIGludCBTdGFydD4KK3N0cnVjdCByZWR1eF92ZWNfdW5yb2xsZXI8RnVuYywgRGVyaXZlZCwgU3RhcnQsIDE+Cit7CisgIGVudW0geworICAgIGluZGV4ID0gU3RhcnQgKiBwYWNrZXRfdHJhaXRzPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj46OnNpemUsCisgICAgb3V0ZXIgPSBpbmRleCAvIGludChEZXJpdmVkOjpJbm5lclNpemVBdENvbXBpbGVUaW1lKSwKKyAgICBpbm5lciA9IGluZGV4ICUgaW50KERlcml2ZWQ6OklubmVyU2l6ZUF0Q29tcGlsZVRpbWUpLAorICAgIGFsaWdubWVudCA9IChEZXJpdmVkOjpGbGFncyAmIEFsaWduZWRCaXQpID8gQWxpZ25lZCA6IFVuYWxpZ25lZAorICB9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0U2NhbGFyOworCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldFNjYWxhciBydW4oY29uc3QgRGVyaXZlZCAmbWF0LCBjb25zdCBGdW5jJikKKyAgeworICAgIHJldHVybiBtYXQudGVtcGxhdGUgcGFja2V0QnlPdXRlcklubmVyPGFsaWdubWVudD4ob3V0ZXIsIGlubmVyKTsKKyAgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQYXJ0IDMgOiBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgY2FzZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZCwKKyAgICAgICAgIGludCBUcmF2ZXJzYWwgPSByZWR1eF90cmFpdHM8RnVuYywgRGVyaXZlZD46OlRyYXZlcnNhbCwKKyAgICAgICAgIGludCBVbnJvbGxpbmcgPSByZWR1eF90cmFpdHM8RnVuYywgRGVyaXZlZD46OlVucm9sbGluZworPgorc3RydWN0IHJlZHV4X2ltcGw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgcmVkdXhfaW1wbDxGdW5jLCBEZXJpdmVkLCBEZWZhdWx0VHJhdmVyc2FsLCBOb1Vucm9sbGluZz4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IEluZGV4OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQmIG1hdCwgY29uc3QgRnVuYyYgZnVuYykKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtYXQucm93cygpPjAgJiYgbWF0LmNvbHMoKT4wICYmICJ5b3UgYXJlIHVzaW5nIGFuIGVtcHR5IG1hdHJpeCIpOworICAgIFNjYWxhciByZXM7CisgICAgcmVzID0gbWF0LmNvZWZmQnlPdXRlcklubmVyKDAsIDApOworICAgIGZvcihJbmRleCBpID0gMTsgaSA8IG1hdC5pbm5lclNpemUoKTsgKytpKQorICAgICAgcmVzID0gZnVuYyhyZXMsIG1hdC5jb2VmZkJ5T3V0ZXJJbm5lcigwLCBpKSk7CisgICAgZm9yKEluZGV4IGkgPSAxOyBpIDwgbWF0Lm91dGVyU2l6ZSgpOyArK2kpCisgICAgICBmb3IoSW5kZXggaiA9IDA7IGogPCBtYXQuaW5uZXJTaXplKCk7ICsraikKKyAgICAgICAgcmVzID0gZnVuYyhyZXMsIG1hdC5jb2VmZkJ5T3V0ZXJJbm5lcihpLCBqKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCByZWR1eF9pbXBsPEZ1bmMsRGVyaXZlZCwgRGVmYXVsdFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmc+CisgIDogcHVibGljIHJlZHV4X25vdmVjX3Vucm9sbGVyPEZ1bmMsRGVyaXZlZCwgMCwgRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWU+Cit7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCByZWR1eF9pbXBsPEZ1bmMsIERlcml2ZWQsIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKworICBzdGF0aWMgU2NhbGFyIHJ1bihjb25zdCBEZXJpdmVkJiBtYXQsIGNvbnN0IEZ1bmMmIGZ1bmMpCisgIHsKKyAgICBjb25zdCBJbmRleCBzaXplID0gbWF0LnNpemUoKTsKKyAgICBlaWdlbl9hc3NlcnQoc2l6ZSAmJiAieW91IGFyZSB1c2luZyBhbiBlbXB0eSBtYXRyaXgiKTsKKyAgICBjb25zdCBJbmRleCBwYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOworICAgIGNvbnN0IEluZGV4IGFsaWduZWRTdGFydCA9IGludGVybmFsOjpmaXJzdF9hbGlnbmVkKG1hdCk7CisgICAgZW51bSB7CisgICAgICBhbGlnbm1lbnQgPSBib29sKERlcml2ZWQ6OkZsYWdzICYgRGlyZWN0QWNjZXNzQml0KSB8fCBib29sKERlcml2ZWQ6OkZsYWdzICYgQWxpZ25lZEJpdCkKKyAgICAgICAgICAgICAgICA/IEFsaWduZWQgOiBVbmFsaWduZWQKKyAgICB9OworICAgIGNvbnN0IEluZGV4IGFsaWduZWRTaXplMiA9ICgoc2l6ZS1hbGlnbmVkU3RhcnQpLygyKnBhY2tldFNpemUpKSooMipwYWNrZXRTaXplKTsKKyAgICBjb25zdCBJbmRleCBhbGlnbmVkU2l6ZSA9ICgoc2l6ZS1hbGlnbmVkU3RhcnQpLyhwYWNrZXRTaXplKSkqKHBhY2tldFNpemUpOworICAgIGNvbnN0IEluZGV4IGFsaWduZWRFbmQyID0gYWxpZ25lZFN0YXJ0ICsgYWxpZ25lZFNpemUyOworICAgIGNvbnN0IEluZGV4IGFsaWduZWRFbmQgID0gYWxpZ25lZFN0YXJ0ICsgYWxpZ25lZFNpemU7CisgICAgU2NhbGFyIHJlczsKKyAgICBpZihhbGlnbmVkU2l6ZSkKKyAgICB7CisgICAgICBQYWNrZXRTY2FsYXIgcGFja2V0X3JlczAgPSBtYXQudGVtcGxhdGUgcGFja2V0PGFsaWdubWVudD4oYWxpZ25lZFN0YXJ0KTsKKyAgICAgIGlmKGFsaWduZWRTaXplPnBhY2tldFNpemUpIC8vIHdlIGhhdmUgYXQgbGVhc3QgdHdvIHBhY2tldHMgdG8gcGFydGx5IHVucm9sbCB0aGUgbG9vcAorICAgICAgeworICAgICAgICBQYWNrZXRTY2FsYXIgcGFja2V0X3JlczEgPSBtYXQudGVtcGxhdGUgcGFja2V0PGFsaWdubWVudD4oYWxpZ25lZFN0YXJ0K3BhY2tldFNpemUpOworICAgICAgICBmb3IoSW5kZXggaW5kZXggPSBhbGlnbmVkU3RhcnQgKyAyKnBhY2tldFNpemU7IGluZGV4IDwgYWxpZ25lZEVuZDI7IGluZGV4ICs9IDIqcGFja2V0U2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIHBhY2tldF9yZXMwID0gZnVuYy5wYWNrZXRPcChwYWNrZXRfcmVzMCwgbWF0LnRlbXBsYXRlIHBhY2tldDxhbGlnbm1lbnQ+KGluZGV4KSk7CisgICAgICAgICAgcGFja2V0X3JlczEgPSBmdW5jLnBhY2tldE9wKHBhY2tldF9yZXMxLCBtYXQudGVtcGxhdGUgcGFja2V0PGFsaWdubWVudD4oaW5kZXgrcGFja2V0U2l6ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcGFja2V0X3JlczAgPSBmdW5jLnBhY2tldE9wKHBhY2tldF9yZXMwLHBhY2tldF9yZXMxKTsKKyAgICAgICAgaWYoYWxpZ25lZEVuZD5hbGlnbmVkRW5kMikKKyAgICAgICAgICBwYWNrZXRfcmVzMCA9IGZ1bmMucGFja2V0T3AocGFja2V0X3JlczAsIG1hdC50ZW1wbGF0ZSBwYWNrZXQ8YWxpZ25tZW50PihhbGlnbmVkRW5kMikpOworICAgICAgfQorICAgICAgcmVzID0gZnVuYy5wcmVkdXgocGFja2V0X3JlczApOworCisgICAgICBmb3IoSW5kZXggaW5kZXggPSAwOyBpbmRleCA8IGFsaWduZWRTdGFydDsgKytpbmRleCkKKyAgICAgICAgcmVzID0gZnVuYyhyZXMsbWF0LmNvZWZmKGluZGV4KSk7CisKKyAgICAgIGZvcihJbmRleCBpbmRleCA9IGFsaWduZWRFbmQ7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkKKyAgICAgICAgcmVzID0gZnVuYyhyZXMsbWF0LmNvZWZmKGluZGV4KSk7CisgICAgfQorICAgIGVsc2UgLy8gdG9vIHNtYWxsIHRvIHZlY3Rvcml6ZSBhbnl0aGluZy4KKyAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgZHluYW1pYy1zaXplIGhlbmNlIGluZWZmaWNpZW50IGFueXdheSBmb3Igc3VjaCBzbWFsbCBzaXplcywgZG9uJ3QgdHJ5IHRvIG9wdGltaXplLgorICAgIHsKKyAgICAgIHJlcyA9IG1hdC5jb2VmZigwKTsKKyAgICAgIGZvcihJbmRleCBpbmRleCA9IDE7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkKKyAgICAgICAgcmVzID0gZnVuYyhyZXMsbWF0LmNvZWZmKGluZGV4KSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCByZWR1eF9pbXBsPEZ1bmMsIERlcml2ZWQsIFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCwgTm9VbnJvbGxpbmc+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0U2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IEluZGV4OworCisgIHN0YXRpYyBTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQmIG1hdCwgY29uc3QgRnVuYyYgZnVuYykKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtYXQucm93cygpPjAgJiYgbWF0LmNvbHMoKT4wICYmICJ5b3UgYXJlIHVzaW5nIGFuIGVtcHR5IG1hdHJpeCIpOworICAgIGNvbnN0IEluZGV4IGlubmVyU2l6ZSA9IG1hdC5pbm5lclNpemUoKTsKKyAgICBjb25zdCBJbmRleCBvdXRlclNpemUgPSBtYXQub3V0ZXJTaXplKCk7CisgICAgZW51bSB7CisgICAgICBwYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplCisgICAgfTsKKyAgICBjb25zdCBJbmRleCBwYWNrZXRlZElubmVyU2l6ZSA9ICgoaW5uZXJTaXplKS9wYWNrZXRTaXplKSpwYWNrZXRTaXplOworICAgIFNjYWxhciByZXM7CisgICAgaWYocGFja2V0ZWRJbm5lclNpemUpCisgICAgeworICAgICAgUGFja2V0U2NhbGFyIHBhY2tldF9yZXMgPSBtYXQudGVtcGxhdGUgcGFja2V0PFVuYWxpZ25lZD4oMCwwKTsKKyAgICAgIGZvcihJbmRleCBqPTA7IGo8b3V0ZXJTaXplOyArK2opCisgICAgICAgIGZvcihJbmRleCBpPShqPT0wP3BhY2tldFNpemU6MCk7IGk8cGFja2V0ZWRJbm5lclNpemU7IGkrPUluZGV4KHBhY2tldFNpemUpKQorICAgICAgICAgIHBhY2tldF9yZXMgPSBmdW5jLnBhY2tldE9wKHBhY2tldF9yZXMsIG1hdC50ZW1wbGF0ZSBwYWNrZXRCeU91dGVySW5uZXI8VW5hbGlnbmVkPihqLGkpKTsKKworICAgICAgcmVzID0gZnVuYy5wcmVkdXgocGFja2V0X3Jlcyk7CisgICAgICBmb3IoSW5kZXggaj0wOyBqPG91dGVyU2l6ZTsgKytqKQorICAgICAgICBmb3IoSW5kZXggaT1wYWNrZXRlZElubmVyU2l6ZTsgaTxpbm5lclNpemU7ICsraSkKKyAgICAgICAgICByZXMgPSBmdW5jKHJlcywgbWF0LmNvZWZmQnlPdXRlcklubmVyKGosaSkpOworICAgIH0KKyAgICBlbHNlIC8vIHRvbyBzbWFsbCB0byB2ZWN0b3JpemUgYW55dGhpbmcuCisgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGR5bmFtaWMtc2l6ZSBoZW5jZSBpbmVmZmljaWVudCBhbnl3YXkgZm9yIHN1Y2ggc21hbGwgc2l6ZXMsIGRvbid0IHRyeSB0byBvcHRpbWl6ZS4KKyAgICB7CisgICAgICByZXMgPSByZWR1eF9pbXBsPEZ1bmMsIERlcml2ZWQsIERlZmF1bHRUcmF2ZXJzYWwsIE5vVW5yb2xsaW5nPjo6cnVuKG1hdCwgZnVuYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCByZWR1eF9pbXBsPEZ1bmMsIERlcml2ZWQsIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldFNjYWxhcjsKKyAgZW51bSB7CisgICAgUGFja2V0U2l6ZSA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSwKKyAgICBTaXplID0gRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgVmVjdG9yaXplZFNpemUgPSAoU2l6ZSAvIFBhY2tldFNpemUpICogUGFja2V0U2l6ZQorICB9OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQmIG1hdCwgY29uc3QgRnVuYyYgZnVuYykKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtYXQucm93cygpPjAgJiYgbWF0LmNvbHMoKT4wICYmICJ5b3UgYXJlIHVzaW5nIGFuIGVtcHR5IG1hdHJpeCIpOworICAgIFNjYWxhciByZXMgPSBmdW5jLnByZWR1eChyZWR1eF92ZWNfdW5yb2xsZXI8RnVuYywgRGVyaXZlZCwgMCwgU2l6ZSAvIFBhY2tldFNpemU+OjpydW4obWF0LGZ1bmMpKTsKKyAgICBpZiAoVmVjdG9yaXplZFNpemUgIT0gU2l6ZSkKKyAgICAgIHJlcyA9IGZ1bmMocmVzLHJlZHV4X25vdmVjX3Vucm9sbGVyPEZ1bmMsIERlcml2ZWQsIFZlY3Rvcml6ZWRTaXplLCBTaXplLVZlY3Rvcml6ZWRTaXplPjo6cnVuKG1hdCxmdW5jKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUGFydCA0IDogcHVibGljIEFQSQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKiBccmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgZnVsbCByZWR1eCBvcGVyYXRpb24gb24gdGhlIHdob2xlIG1hdHJpeCBvciB2ZWN0b3IgdXNpbmcgXGEgZnVuYworICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBCaW5hcnlPcCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3RvciBcYSBmdW5jIHdoaWNoIG11c3QgYmUKKyAgKiBhbiBhc3NvY2lhdGl2ZSBvcGVyYXRvci4gQm90aCBjdXJyZW50IFNUTCBhbmQgVFIxIGZ1bmN0b3Igc3R5bGVzIGFyZSBoYW5kbGVkLgorICAqCisgICogXHNhIERlbnNlQmFzZTo6c3VtKCksIERlbnNlQmFzZTo6bWluQ29lZmYoKSwgRGVuc2VCYXNlOjptYXhDb2VmZigpLCBNYXRyaXhCYXNlOjpjb2x3aXNlKCksIE1hdHJpeEJhc2U6OnJvd3dpc2UoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+CitFSUdFTl9TVFJPTkdfSU5MSU5FIHR5cGVuYW1lIGludGVybmFsOjpyZXN1bHRfb2Y8RnVuYyh0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIpPjo6dHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpyZWR1eChjb25zdCBGdW5jJiBmdW5jKSBjb25zdAoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIERlcml2ZWQ6Ok5lc3RlZD46OnR5cGUgVGhpc05lc3RlZDsKKyAgcmV0dXJuIGludGVybmFsOjpyZWR1eF9pbXBsPEZ1bmMsIFRoaXNOZXN0ZWQ+CisgICAgICAgICAgICA6OnJ1bihkZXJpdmVkKCksIGZ1bmMpOworfQorCisvKiogXHJldHVybnMgdGhlIG1pbmltdW0gb2YgYWxsIGNvZWZmaWNpZW50cyBvZiAqdGhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitEZW5zZUJhc2U8RGVyaXZlZD46Om1pbkNvZWZmKCkgY29uc3QKK3sKKyAgcmV0dXJuIHRoaXMtPnJlZHV4KEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX21pbl9vcDxTY2FsYXI+KCkpOworfQorCisvKiogXHJldHVybnMgdGhlIG1heGltdW0gb2YgYWxsIGNvZWZmaWNpZW50cyBvZiAqdGhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitEZW5zZUJhc2U8RGVyaXZlZD46Om1heENvZWZmKCkgY29uc3QKK3sKKyAgcmV0dXJuIHRoaXMtPnJlZHV4KEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX21heF9vcDxTY2FsYXI+KCkpOworfQorCisvKiogXHJldHVybnMgdGhlIHN1bSBvZiBhbGwgY29lZmZpY2llbnRzIG9mICp0aGlzCisgICoKKyAgKiBcc2EgdHJhY2UoKSwgcHJvZCgpLCBtZWFuKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcgorRGVuc2VCYXNlPERlcml2ZWQ+OjpzdW0oKSBjb25zdAoreworICBpZihTaXplQXRDb21waWxlVGltZT09MCB8fCAoU2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgJiYgc2l6ZSgpPT0wKSkKKyAgICByZXR1cm4gU2NhbGFyKDApOworICByZXR1cm4gdGhpcy0+cmVkdXgoRWlnZW46OmludGVybmFsOjpzY2FsYXJfc3VtX29wPFNjYWxhcj4oKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWVhbiBvZiBhbGwgY29lZmZpY2llbnRzIG9mICp0aGlzCisqCisqIFxzYSB0cmFjZSgpLCBwcm9kKCksIHN1bSgpCisqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitEZW5zZUJhc2U8RGVyaXZlZD46Om1lYW4oKSBjb25zdAoreworICByZXR1cm4gU2NhbGFyKHRoaXMtPnJlZHV4KEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXI+KCkpKSAvIFNjYWxhcih0aGlzLT5zaXplKCkpOworfQorCisvKiogXHJldHVybnMgdGhlIHByb2R1Y3Qgb2YgYWxsIGNvZWZmaWNpZW50cyBvZiAqdGhpcworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9wcm9kLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcHJvZC5vdXQKKyAgKgorICAqIFxzYSBzdW0oKSwgbWVhbigpLCB0cmFjZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK0RlbnNlQmFzZTxEZXJpdmVkPjo6cHJvZCgpIGNvbnN0Cit7CisgIGlmKFNpemVBdENvbXBpbGVUaW1lPT0wIHx8IChTaXplQXRDb21waWxlVGltZT09RHluYW1pYyAmJiBzaXplKCk9PTApKQorICAgIHJldHVybiBTY2FsYXIoMSk7CisgIHJldHVybiB0aGlzLT5yZWR1eChFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPFNjYWxhcj4oKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgdHJhY2Ugb2YgXGMgKnRoaXMsIGkuZS4gdGhlIHN1bSBvZiB0aGUgY29lZmZpY2llbnRzIG9uIHRoZSBtYWluIGRpYWdvbmFsLgorICAqCisgICogXGMgKnRoaXMgY2FuIGJlIGFueSBtYXRyaXgsIG5vdCBuZWNlc3NhcmlseSBzcXVhcmUuCisgICoKKyAgKiBcc2EgZGlhZ29uYWwoKSwgc3VtKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcgorTWF0cml4QmFzZTxEZXJpdmVkPjo6dHJhY2UoKSBjb25zdAoreworICByZXR1cm4gZGVyaXZlZCgpLmRpYWdvbmFsKCkuc3VtKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUkVEVVhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvUmVwbGljYXRlLmggYi9FaWdlbi9zcmMvQ29yZS9SZXBsaWNhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFmZGMyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvUmVwbGljYXRlLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1JFUExJQ0FURV9ICisjZGVmaW5lIEVJR0VOX1JFUExJQ0FURV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKioKKyAgKiBcY2xhc3MgUmVwbGljYXRlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIG9mIHRoZSBtdWx0aXBsZSByZXBsaWNhdGlvbiBvZiBhIG1hdHJpeCBvciB2ZWN0b3IKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgd2UgYXJlIHJlcGxpY2F0aW5nCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgbXVsdGlwbGUgcmVwbGljYXRpb24gb2YgYSBtYXRyaXggb3IgdmVjdG9yLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBEZW5zZUJhc2U6OnJlcGxpY2F0ZSgpIGFuZCBtb3N0IG9mIHRoZSB0aW1lCisgICogdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OnJlcGxpY2F0ZSgpCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLGludCBSb3dGYWN0b3IsaW50IENvbEZhY3Rvcj4KK3N0cnVjdCB0cmFpdHM8UmVwbGljYXRlPE1hdHJpeFR5cGUsUm93RmFjdG9yLENvbEZhY3Rvcj4gPgorIDogdHJhaXRzPE1hdHJpeFR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6WHByS2luZCBYcHJLaW5kOworICBlbnVtIHsKKyAgICBGYWN0b3IgPSAoUm93RmFjdG9yPT1EeW5hbWljIHx8IENvbEZhY3Rvcj09RHluYW1pYykgPyBEeW5hbWljIDogUm93RmFjdG9yKkNvbEZhY3RvcgorICB9OworICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZDxNYXRyaXhUeXBlLEZhY3Rvcj46OnR5cGUgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IFJvd0ZhY3Rvcj09RHluYW1pYyB8fCBpbnQoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUpPT1EeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgPyBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgOiBSb3dGYWN0b3IgKiBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IENvbEZhY3Rvcj09RHluYW1pYyB8fCBpbnQoTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpPT1EeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgPyBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgOiBDb2xGYWN0b3IgKiBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgIC8vRklYTUUgd2UgZG9uJ3QgcHJvcGFnYXRlIHRoZSBtYXggc2l6ZXMgISEhCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IENvbHNBdENvbXBpbGVUaW1lLAorICAgIElzUm93TWFqb3IgPSBNYXhSb3dzQXRDb21waWxlVGltZT09MSAmJiBNYXhDb2xzQXRDb21waWxlVGltZSE9MSA/IDEKKyAgICAgICAgICAgICAgIDogTWF4Q29sc0F0Q29tcGlsZVRpbWU9PTEgJiYgTWF4Um93c0F0Q29tcGlsZVRpbWUhPTEgPyAwCisgICAgICAgICAgICAgICA6IChNYXRyaXhUeXBlOjpGbGFncyAmIFJvd01ham9yQml0KSA/IDEgOiAwLAorICAgIEZsYWdzID0gKF9NYXRyaXhUeXBlTmVzdGVkOjpGbGFncyAmIEhlcmVkaXRhcnlCaXRzICYgflJvd01ham9yQml0KSB8IChJc1Jvd01ham9yID8gUm93TWFqb3JCaXQgOiAwKSwKKyAgICBDb2VmZlJlYWRDb3N0ID0gX01hdHJpeFR5cGVOZXN0ZWQ6OkNvZWZmUmVhZENvc3QKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IFJvd0ZhY3RvcixpbnQgQ29sRmFjdG9yPiBjbGFzcyBSZXBsaWNhdGUKKyAgOiBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPCBSZXBsaWNhdGU8TWF0cml4VHlwZSxSb3dGYWN0b3IsQ29sRmFjdG9yPiA+Ojp0eXBlCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFJlcGxpY2F0ZT46Ok1hdHJpeFR5cGVOZXN0ZWQgTWF0cml4VHlwZU5lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8UmVwbGljYXRlPjo6X01hdHJpeFR5cGVOZXN0ZWQgX01hdHJpeFR5cGVOZXN0ZWQ7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPFJlcGxpY2F0ZT46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKFJlcGxpY2F0ZSkKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9yaWdpbmFsTWF0cml4VHlwZT4KKyAgICBpbmxpbmUgZXhwbGljaXQgUmVwbGljYXRlKGNvbnN0IE9yaWdpbmFsTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBtX21hdHJpeChtYXRyaXgpLCBtX3Jvd0ZhY3RvcihSb3dGYWN0b3IpLCBtX2NvbEZhY3RvcihDb2xGYWN0b3IpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxNYXRyaXhUeXBlPjo6dHlwZSxPcmlnaW5hbE1hdHJpeFR5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRV9NQVRSSVhfT1JfRVhQUkVTU0lPTl9USEFUX1lPVV9QQVNTRURfRE9FU19OT1RfSEFWRV9USEVfRVhQRUNURURfVFlQRSkKKyAgICAgIGVpZ2VuX2Fzc2VydChSb3dGYWN0b3IhPUR5bmFtaWMgJiYgQ29sRmFjdG9yIT1EeW5hbWljKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPcmlnaW5hbE1hdHJpeFR5cGU+CisgICAgaW5saW5lIFJlcGxpY2F0ZShjb25zdCBPcmlnaW5hbE1hdHJpeFR5cGUmIG1hdHJpeCwgSW5kZXggcm93RmFjdG9yLCBJbmRleCBjb2xGYWN0b3IpCisgICAgICA6IG1fbWF0cml4KG1hdHJpeCksIG1fcm93RmFjdG9yKHJvd0ZhY3RvciksIG1fY29sRmFjdG9yKGNvbEZhY3RvcikKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PE1hdHJpeFR5cGU+Ojp0eXBlLE9yaWdpbmFsTWF0cml4VHlwZT46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFX01BVFJJWF9PUl9FWFBSRVNTSU9OX1RIQVRfWU9VX1BBU1NFRF9ET0VTX05PVF9IQVZFX1RIRV9FWFBFQ1RFRF9UWVBFKQorICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpICogbV9yb3dGYWN0b3IudmFsdWUoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguY29scygpICogbV9jb2xGYWN0b3IudmFsdWUoKTsgfQorCisgICAgaW5saW5lIFNjYWxhciBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICAvLyB0cnkgdG8gYXZvaWQgdXNpbmcgbW9kdWxvOyB0aGlzIGlzIGEgcHVyZSBvcHRpbWl6YXRpb24gc3RyYXRlZ3kKKyAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9yb3cgID0gaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6Um93c0F0Q29tcGlsZVRpbWU9PTEgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSb3dGYWN0b3I9PTEgPyByb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJvdyVtX21hdHJpeC5yb3dzKCk7CisgICAgICBjb25zdCBJbmRleCBhY3R1YWxfY29sICA9IGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OkNvbHNBdENvbXBpbGVUaW1lPT0xID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ29sRmFjdG9yPT0xID8gY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2wlbV9tYXRyaXguY29scygpOworCisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmYoYWN0dWFsX3JvdywgYWN0dWFsX2NvbCk7CisgICAgfQorICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBhY3R1YWxfcm93ICA9IGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlJvd3NBdENvbXBpbGVUaW1lPT0xID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUm93RmFjdG9yPT0xID8gcm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByb3clbV9tYXRyaXgucm93cygpOworICAgICAgY29uc3QgSW5kZXggYWN0dWFsX2NvbCAgPSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpDb2xzQXRDb21waWxlVGltZT09MSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENvbEZhY3Rvcj09MSA/IGNvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sJW1fbWF0cml4LmNvbHMoKTsKKworICAgICAgcmV0dXJuIG1fbWF0cml4LnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oYWN0dWFsX3JvdywgYWN0dWFsX2NvbCk7CisgICAgfQorCisgICAgY29uc3QgX01hdHJpeFR5cGVOZXN0ZWQmIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdAorICAgIHsgCisgICAgICByZXR1cm4gbV9tYXRyaXg7IAorICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZU5lc3RlZCBtX21hdHJpeDsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgUm93RmFjdG9yPiBtX3Jvd0ZhY3RvcjsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgQ29sRmFjdG9yPiBtX2NvbEZhY3RvcjsKK307CisKKy8qKgorICAqIFxyZXR1cm4gYW4gZXhwcmVzc2lvbiBvZiB0aGUgcmVwbGljYXRpb24gb2YgXGMgKnRoaXMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfcmVwbGljYXRlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcmVwbGljYXRlLm91dAorICAqCisgICogXHNhIFZlY3Rvcndpc2VPcDo6cmVwbGljYXRlKCksIERlbnNlQmFzZTo6cmVwbGljYXRlKEluZGV4LEluZGV4KSwgY2xhc3MgUmVwbGljYXRlCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8aW50IFJvd0ZhY3RvciwgaW50IENvbEZhY3Rvcj4KK2lubGluZSBjb25zdCBSZXBsaWNhdGU8RGVyaXZlZCxSb3dGYWN0b3IsQ29sRmFjdG9yPgorRGVuc2VCYXNlPERlcml2ZWQ+OjpyZXBsaWNhdGUoKSBjb25zdAoreworICByZXR1cm4gUmVwbGljYXRlPERlcml2ZWQsUm93RmFjdG9yLENvbEZhY3Rvcj4oZGVyaXZlZCgpKTsKK30KKworLyoqCisgICogXHJldHVybiBhbiBleHByZXNzaW9uIG9mIHRoZSByZXBsaWNhdGlvbiBvZiBcYyAqdGhpcworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9yZXBsaWNhdGVfaW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3JlcGxpY2F0ZV9pbnRfaW50Lm91dAorICAqCisgICogXHNhIFZlY3Rvcndpc2VPcDo6cmVwbGljYXRlKCksIERlbnNlQmFzZTo6cmVwbGljYXRlPGludCxpbnQ+KCksIGNsYXNzIFJlcGxpY2F0ZQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBSZXBsaWNhdGU8RGVyaXZlZCxEeW5hbWljLER5bmFtaWM+CitEZW5zZUJhc2U8RGVyaXZlZD46OnJlcGxpY2F0ZShJbmRleCByb3dGYWN0b3IsSW5kZXggY29sRmFjdG9yKSBjb25zdAoreworICByZXR1cm4gUmVwbGljYXRlPERlcml2ZWQsRHluYW1pYyxEeW5hbWljPihkZXJpdmVkKCkscm93RmFjdG9yLGNvbEZhY3Rvcik7Cit9CisKKy8qKgorICAqIFxyZXR1cm4gYW4gZXhwcmVzc2lvbiBvZiB0aGUgcmVwbGljYXRpb24gb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgXGMgKnRoaXMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIERpcmVjdGlvbldpc2VfcmVwbGljYXRlX2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBEaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZV9pbnQub3V0CisgICoKKyAgKiBcc2EgVmVjdG9yd2lzZU9wOjpyZXBsaWNhdGUoKSwgRGVuc2VCYXNlOjpyZXBsaWNhdGUoKSwgY2xhc3MgUmVwbGljYXRlCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSwgaW50IERpcmVjdGlvbj4KK2NvbnN0IHR5cGVuYW1lIFZlY3Rvcndpc2VPcDxFeHByZXNzaW9uVHlwZSxEaXJlY3Rpb24+OjpSZXBsaWNhdGVSZXR1cm5UeXBlCitWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6cmVwbGljYXRlKEluZGV4IGZhY3RvcikgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIFZlY3Rvcndpc2VPcDxFeHByZXNzaW9uVHlwZSxEaXJlY3Rpb24+OjpSZXBsaWNhdGVSZXR1cm5UeXBlCisgICAgICAgICAgKF9leHByZXNzaW9uKCksRGlyZWN0aW9uPT1WZXJ0aWNhbD9mYWN0b3I6MSxEaXJlY3Rpb249PUhvcml6b250YWw/ZmFjdG9yOjEpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1JFUExJQ0FURV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9SZXR1cm5CeVZhbHVlLmggYi9FaWdlbi9zcmMvQ29yZS9SZXR1cm5CeVZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzOTEyZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1JldHVybkJ5VmFsdWUuaApAQCAtMCwwICsxLDg4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1JFVFVSTkJZVkFMVUVfSAorI2RlZmluZSBFSUdFTl9SRVRVUk5CWVZBTFVFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxjbGFzcyBSZXR1cm5CeVZhbHVlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHRyYWl0czxSZXR1cm5CeVZhbHVlPERlcml2ZWQ+ID4KKyAgOiBwdWJsaWMgdHJhaXRzPHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6UmV0dXJuVHlwZT4KK3sKKyAgZW51bSB7CisgICAgLy8gV2UncmUgZGlzYWJsaW5nIHRoZSBEaXJlY3RBY2Nlc3MgYmVjYXVzZSBlLmcuIHRoZSBjb25zdHJ1Y3RvciBvZgorICAgIC8vIHRoZSBCbG9jay13aXRoLURpcmVjdEFjY2VzcyBleHByZXNzaW9uIHJlcXVpcmVzIHRvIGhhdmUgYSBjb2VmZlJlZiBtZXRob2QuCisgICAgLy8gQWxzbywgd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvIGltcGxlbWVudCB0aGUgc3RyaWRlIHN0dWZmLgorICAgIEZsYWdzID0gKHRyYWl0czx0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlJldHVyblR5cGU+OjpGbGFncworICAgICAgICAgICAgIHwgRXZhbEJlZm9yZU5lc3RpbmdCaXQpICYgfkRpcmVjdEFjY2Vzc0JpdAorICB9OworfTsKKworLyogVGhlIFJldHVybkJ5VmFsdWUgb2JqZWN0IGRvZXNuJ3QgZXZlbiBoYXZlIGEgY29lZmYoKSBtZXRob2QuCisgKiBTbyB0aGUgb25seSB3YXkgdGhhdCBuZXN0aW5nIGl0IGluIGFuIGV4cHJlc3Npb24gY2FuIHdvcmssIGlzIGJ5IGV2YWx1YXRpbmcgaXQgaW50byBhIHBsYWluIG1hdHJpeC4KKyAqIFNvIGludGVybmFsOjpuZXN0ZWQgYWx3YXlzIGdpdmVzIHRoZSBwbGFpbiByZXR1cm4gbWF0cml4IHR5cGUuCisgKgorICogRklYTUU6IEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgd2UgbmVlZCB0aGlzIHNwZWNpYWxpemF0aW9uOiBpc24ndCB0aGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIEV2YWxCZWZvcmVOZXN0aW5nQml0ID8/CisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsaW50IG4sdHlwZW5hbWUgUGxhaW5PYmplY3Q+CitzdHJ1Y3QgbmVzdGVkPFJldHVybkJ5VmFsdWU8RGVyaXZlZD4sIG4sIFBsYWluT2JqZWN0PgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6UmV0dXJuVHlwZSB0eXBlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFJldHVybkJ5VmFsdWUKKyAgOiBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPCBSZXR1cm5CeVZhbHVlPERlcml2ZWQ+ID46OnR5cGUKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6UmV0dXJuVHlwZSBSZXR1cm5UeXBlOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8UmV0dXJuQnlWYWx1ZT46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKFJldHVybkJ5VmFsdWUpCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PgorICAgIGlubGluZSB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgICAgeyBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyktPmV2YWxUbyhkc3QpOyB9CisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyktPnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpLT5jb2xzKCk7IH0KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorI2RlZmluZSBVbnVzYWJsZSBZT1VfQVJFX1RSWUlOR19UT19BQ0NFU1NfQV9TSU5HTEVfQ09FRkZJQ0lFTlRfSU5fQV9TUEVDSUFMX0VYUFJFU1NJT05fV0hFUkVfVEhBVF9JU19OT1RfQUxMT1dFRF9CRUNBVVNFX1RIQVRfV09VTERfQkVfSU5FRkZJQ0lFTlQKKyAgICBjbGFzcyBVbnVzYWJsZXsKKyAgICAgIFVudXNhYmxlKGNvbnN0IFVudXNhYmxlJikge30KKyAgICAgIFVudXNhYmxlJiBvcGVyYXRvcj0oY29uc3QgVW51c2FibGUmKSB7cmV0dXJuICp0aGlzO30KKyAgICB9OworICAgIGNvbnN0IFVudXNhYmxlJiBjb2VmZihJbmRleCkgY29uc3QgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVW51c2FibGUqPih0aGlzKTsgfQorICAgIGNvbnN0IFVudXNhYmxlJiBjb2VmZihJbmRleCxJbmRleCkgY29uc3QgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVW51c2FibGUqPih0aGlzKTsgfQorICAgIFVudXNhYmxlJiBjb2VmZlJlZihJbmRleCkgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VW51c2FibGUqPih0aGlzKTsgfQorICAgIFVudXNhYmxlJiBjb2VmZlJlZihJbmRleCxJbmRleCkgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VW51c2FibGUqPih0aGlzKTsgfQorI2VuZGlmCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRGVyaXZlZCYgRGVuc2VCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcj0oY29uc3QgUmV0dXJuQnlWYWx1ZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgb3RoZXIuZXZhbFRvKGRlcml2ZWQoKSk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUkVUVVJOQllWQUxVRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9SZXZlcnNlLmggYi9FaWdlbi9zcmMvQ29yZS9SZXZlcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwYWUzZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1JldmVyc2UuaApAQCAtMCwwICsxLDIyNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBSaWNhcmQgTWFyeGVyIDxlbWFpbEByaWNhcmRtYXJ4ZXIuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1JFVkVSU0VfSAorI2RlZmluZSBFSUdFTl9SRVZFUlNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgUmV2ZXJzZQorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiBvZiB0aGUgcmV2ZXJzZSBvZiBhIHZlY3RvciBvciBtYXRyaXgKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgb2Ygd2hpY2ggd2UgYXJlIHRha2luZyB0aGUgcmV2ZXJzZQorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2YgdGhlIHJldmVyc2Ugb2YgYSB2ZWN0b3IuCisgICogSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OnJldmVyc2UoKSBhbmQgVmVjdG9yd2lzZU9wOjpyZXZlcnNlKCkKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnJldmVyc2UoKSwgVmVjdG9yd2lzZU9wOjpyZXZlcnNlKCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IERpcmVjdGlvbj4KK3N0cnVjdCB0cmFpdHM8UmV2ZXJzZTxNYXRyaXhUeXBlLCBEaXJlY3Rpb24+ID4KKyA6IHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlhwcktpbmQgWHByS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWQ8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorCisgICAgLy8gbGV0J3MgZW5hYmxlIExpbmVhckFjY2VzcyBvbmx5IHdpdGggdmVjdG9yaXphdGlvbiBiZWNhdXNlIG9mIHRoZSBwcm9kdWN0IG92ZXJoZWFkCisgICAgTGluZWFyQWNjZXNzID0gKCAoRGlyZWN0aW9uPT1Cb3RoRGlyZWN0aW9ucykgJiYgKGludChfTWF0cml4VHlwZU5lc3RlZDo6RmxhZ3MpJlBhY2tldEFjY2Vzc0JpdCkgKQorICAgICAgICAgICAgICAgICA/IExpbmVhckFjY2Vzc0JpdCA6IDAsCisKKyAgICBGbGFncyA9IGludChfTWF0cml4VHlwZU5lc3RlZDo6RmxhZ3MpICYgKEhlcmVkaXRhcnlCaXRzIHwgTHZhbHVlQml0IHwgUGFja2V0QWNjZXNzQml0IHwgTGluZWFyQWNjZXNzKSwKKworICAgIENvZWZmUmVhZENvc3QgPSBfTWF0cml4VHlwZU5lc3RlZDo6Q29lZmZSZWFkQ29zdAorICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0U2NhbGFyLCBib29sIFJldmVyc2VQYWNrZXQ+IHN0cnVjdCByZXZlcnNlX3BhY2tldF9jb25kCit7CisgIHN0YXRpYyBpbmxpbmUgUGFja2V0U2NhbGFyIHJ1bihjb25zdCBQYWNrZXRTY2FsYXImIHgpIHsgcmV0dXJuIHByZXZlcnNlKHgpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXRTY2FsYXI+IHN0cnVjdCByZXZlcnNlX3BhY2tldF9jb25kPFBhY2tldFNjYWxhcixmYWxzZT4KK3sKKyAgc3RhdGljIGlubGluZSBQYWNrZXRTY2FsYXIgcnVuKGNvbnN0IFBhY2tldFNjYWxhciYgeCkgeyByZXR1cm4geDsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsIAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgRGlyZWN0aW9uPiBjbGFzcyBSZXZlcnNlCisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTwgUmV2ZXJzZTxNYXRyaXhUeXBlLCBEaXJlY3Rpb24+ID46OnR5cGUKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8UmV2ZXJzZT46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKFJldmVyc2UpCisgICAgdXNpbmcgQmFzZTo6SXNSb3dNYWpvcjsKKworICAgIC8vIG5leHQgbGluZSBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdGhlcndpc2UgY29uc3QgdmVyc2lvbiBvZiBvcGVyYXRvcigpCisgICAgLy8gaXMgaGlkZGVuIGJ5IG5vbi1jb25zdCB2ZXJzaW9uIGRlZmluZWQgaW4gdGhpcyBmaWxlCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IoKTsgCisKKyAgcHJvdGVjdGVkOgorICAgIGVudW0geworICAgICAgUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUsCisgICAgICBJc0NvbE1ham9yID0gIUlzUm93TWFqb3IsCisgICAgICBSZXZlcnNlUm93ID0gKERpcmVjdGlvbiA9PSBWZXJ0aWNhbCkgICB8fCAoRGlyZWN0aW9uID09IEJvdGhEaXJlY3Rpb25zKSwKKyAgICAgIFJldmVyc2VDb2wgPSAoRGlyZWN0aW9uID09IEhvcml6b250YWwpIHx8IChEaXJlY3Rpb24gPT0gQm90aERpcmVjdGlvbnMpLAorICAgICAgT2Zmc2V0Um93ICA9IFJldmVyc2VSb3cgJiYgSXNDb2xNYWpvciA/IFBhY2tldFNpemUgOiAxLAorICAgICAgT2Zmc2V0Q29sICA9IFJldmVyc2VDb2wgJiYgSXNSb3dNYWpvciA/IFBhY2tldFNpemUgOiAxLAorICAgICAgUmV2ZXJzZVBhY2tldCA9IChEaXJlY3Rpb24gPT0gQm90aERpcmVjdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoRGlyZWN0aW9uID09IFZlcnRpY2FsKSAgICYmIElzQ29sTWFqb3IpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoRGlyZWN0aW9uID09IEhvcml6b250YWwpICYmIElzUm93TWFqb3IpCisgICAgfTsKKyAgICB0eXBlZGVmIGludGVybmFsOjpyZXZlcnNlX3BhY2tldF9jb25kPFBhY2tldFNjYWxhcixSZXZlcnNlUGFja2V0PiByZXZlcnNlX3BhY2tldDsKKyAgcHVibGljOgorCisgICAgaW5saW5lIFJldmVyc2UoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KSA6IG1fbWF0cml4KG1hdHJpeCkgeyB9CisKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKFJldmVyc2UpCisKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguY29scygpOyB9CisKKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiAtbV9tYXRyaXguaW5uZXJTdHJpZGUoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3cgPj0gMCAmJiByb3cgPCByb3dzKCkgJiYgY29sID49IDAgJiYgY29sIDwgY29scygpKTsKKyAgICAgIHJldHVybiBjb2VmZlJlZihyb3csIGNvbCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKFJldmVyc2VSb3cgPyBtX21hdHJpeC5yb3dzKCkgLSByb3cgLSAxIDogcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldmVyc2VDb2wgPyBtX21hdHJpeC5jb2xzKCkgLSBjb2wgLSAxIDogY29sKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb2VmZihSZXZlcnNlUm93ID8gbV9tYXRyaXgucm93cygpIC0gcm93IC0gMSA6IHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZlcnNlQ29sID8gbV9tYXRyaXguY29scygpIC0gY29sIC0gMSA6IGNvbCk7CisgICAgfQorCisgICAgaW5saW5lIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmYobV9tYXRyaXguc2l6ZSgpIC0gaW5kZXggLSAxKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYobV9tYXRyaXguc2l6ZSgpIC0gaW5kZXggLSAxKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGluZGV4KQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgbV9tYXRyaXguc2l6ZSgpKTsKKyAgICAgIHJldHVybiBjb2VmZlJlZihpbmRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiByZXZlcnNlX3BhY2tldDo6cnVuKG1fbWF0cml4LnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZlcnNlUm93ID8gbV9tYXRyaXgucm93cygpIC0gcm93IC0gT2Zmc2V0Um93IDogcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2ZXJzZUNvbCA/IG1fbWF0cml4LmNvbHMoKSAtIGNvbCAtIE9mZnNldENvbCA6IGNvbCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQorICAgIHsKKyAgICAgIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2ZXJzZVJvdyA/IG1fbWF0cml4LnJvd3MoKSAtIHJvdyAtIE9mZnNldFJvdyA6IHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2ZXJzZUNvbCA/IG1fbWF0cml4LmNvbHMoKSAtIGNvbCAtIE9mZnNldENvbCA6IGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZV9wYWNrZXQ6OnJ1bih4KSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6cHJldmVyc2UobV9tYXRyaXgudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPiggbV9tYXRyaXguc2l6ZSgpIC0gaW5kZXggLSBQYWNrZXRTaXplICkpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQorICAgIHsKKyAgICAgIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihtX21hdHJpeC5zaXplKCkgLSBpbmRleCAtIFBhY2tldFNpemUsIGludGVybmFsOjpwcmV2ZXJzZSh4KSk7CisgICAgfQorCisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkPjo6dHlwZSYgCisgICAgbmVzdGVkRXhwcmVzc2lvbigpIGNvbnN0IAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeDsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBtX21hdHJpeDsKK307CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSByZXZlcnNlIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9yZXZlcnNlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcmV2ZXJzZS5vdXQKKyAgKgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OlJldmVyc2VSZXR1cm5UeXBlCitEZW5zZUJhc2U8RGVyaXZlZD46OnJldmVyc2UoKQoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiByZXZlcnNlKCkuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6Q29uc3RSZXZlcnNlUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpyZXZlcnNlKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFRoaXMgaXMgdGhlICJpbiBwbGFjZSIgdmVyc2lvbiBvZiByZXZlcnNlOiBpdCByZXZlcnNlcyBcYyAqdGhpcy4KKyAgKgorICAqIEluIG1vc3QgY2FzZXMgaXQgaXMgcHJvYmFibHkgYmV0dGVyIHRvIHNpbXBseSB1c2UgdGhlIHJldmVyc2VkIGV4cHJlc3Npb24KKyAgKiBvZiBhIG1hdHJpeC4gSG93ZXZlciwgd2hlbiByZXZlcnNpbmcgdGhlIG1hdHJpeCBkYXRhIGl0c2VsZiBpcyByZWFsbHkgbmVlZGVkLAorICAqIHRoZW4gdGhpcyAiaW4tcGxhY2UiIHZlcnNpb24gaXMgcHJvYmFibHkgdGhlIHJpZ2h0IGNob2ljZSBiZWNhdXNlIGl0IHByb3ZpZGVzCisgICogdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZlYXR1cmVzOgorICAqICAtIGxlc3MgZXJyb3IgcHJvbmU6IGRvaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB3aXRoIC5yZXZlcnNlKCkgcmVxdWlyZXMgc3BlY2lhbCBjYXJlOgorICAqICAgIFxjb2RlIG0gPSBtLnJldmVyc2UoKS5ldmFsKCk7IFxlbmRjb2RlCisgICogIC0gdGhpcyBBUEkgYWxsb3dzIHRvIGF2b2lkIGNyZWF0aW5nIGEgdGVtcG9yYXJ5ICh0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBjcmVhdGVzIGEgdGVtcG9yYXJ5LCBidXQgdGhhdCBjb3VsZCBiZSBhdm9pZGVkIHVzaW5nIHN3YXApCisgICogIC0gaXQgYWxsb3dzIGZ1dHVyZSBvcHRpbWl6YXRpb25zIChjYWNoZSBmcmllbmRsaW5lc3MsIGV0Yy4pCisgICoKKyAgKiBcc2EgcmV2ZXJzZSgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHZvaWQgRGVuc2VCYXNlPERlcml2ZWQ+OjpyZXZlcnNlSW5QbGFjZSgpCit7CisgIGRlcml2ZWQoKSA9IGRlcml2ZWQoKS5yZXZlcnNlKCkuZXZhbCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1JFVkVSU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvU2VsZWN0LmggYi9FaWdlbi9zcmMvQ29yZS9TZWxlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmY2ZTkxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvU2VsZWN0LmgKQEAgLTAsMCArMSwxNjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NFTEVDVF9ICisjZGVmaW5lIEVJR0VOX1NFTEVDVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGNsYXNzIFNlbGVjdAorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiBvZiBhIGNvZWZmaWNpZW50IHdpc2UgdmVyc2lvbiBvZiB0aGUgQysrIHRlcm5hcnkgb3BlcmF0b3IgPzoKKyAgKgorICAqIFxwYXJhbSBDb25kaXRpb25NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBcZW0gY29uZGl0aW9uIGV4cHJlc3Npb24gd2hpY2ggbXVzdCBiZSBhIGJvb2xlYW4gbWF0cml4CisgICogXHBhcmFtIFRoZW5NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBcZW0gdGhlbiBleHByZXNzaW9uCisgICogXHBhcmFtIEVsc2VNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBcZW0gZWxzZSBleHByZXNzaW9uCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBvZiBhIGNvZWZmaWNpZW50IHdpc2UgdmVyc2lvbiBvZiB0aGUgQysrIHRlcm5hcnkgb3BlcmF0b3IgPzouCisgICogSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIERlbnNlQmFzZTo6c2VsZWN0KCkgYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OnNlbGVjdChjb25zdCBEZW5zZUJhc2U8VGhlbkRlcml2ZWQ+JiwgY29uc3QgRGVuc2VCYXNlPEVsc2VEZXJpdmVkPiYpIGNvbnN0CisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBDb25kaXRpb25NYXRyaXhUeXBlLCB0eXBlbmFtZSBUaGVuTWF0cml4VHlwZSwgdHlwZW5hbWUgRWxzZU1hdHJpeFR5cGU+CitzdHJ1Y3QgdHJhaXRzPFNlbGVjdDxDb25kaXRpb25NYXRyaXhUeXBlLCBUaGVuTWF0cml4VHlwZSwgRWxzZU1hdHJpeFR5cGU+ID4KKyA6IHRyYWl0czxUaGVuTWF0cml4VHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8VGhlbk1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIERlbnNlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUaGVuTWF0cml4VHlwZT46OlhwcktpbmQgWHByS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBDb25kaXRpb25NYXRyaXhUeXBlOjpOZXN0ZWQgQ29uZGl0aW9uTWF0cml4TmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIFRoZW5NYXRyaXhUeXBlOjpOZXN0ZWQgVGhlbk1hdHJpeE5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFbHNlTWF0cml4VHlwZTo6TmVzdGVkIEVsc2VNYXRyaXhOZXN0ZWQ7CisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gQ29uZGl0aW9uTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBDb25kaXRpb25NYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IENvbmRpdGlvbk1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gQ29uZGl0aW9uTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgRmxhZ3MgPSAodW5zaWduZWQgaW50KVRoZW5NYXRyaXhUeXBlOjpGbGFncyAmIEVsc2VNYXRyaXhUeXBlOjpGbGFncyAmIEhlcmVkaXRhcnlCaXRzLAorICAgIENvZWZmUmVhZENvc3QgPSB0cmFpdHM8dHlwZW5hbWUgcmVtb3ZlX2FsbDxDb25kaXRpb25NYXRyaXhOZXN0ZWQ+Ojp0eXBlPjo6Q29lZmZSZWFkQ29zdAorICAgICAgICAgICAgICAgICAgKyBFSUdFTl9TSVpFX01BWCh0cmFpdHM8dHlwZW5hbWUgcmVtb3ZlX2FsbDxUaGVuTWF0cml4TmVzdGVkPjo6dHlwZT46OkNvZWZmUmVhZENvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0czx0eXBlbmFtZSByZW1vdmVfYWxsPEVsc2VNYXRyaXhOZXN0ZWQ+Ojp0eXBlPjo6Q29lZmZSZWFkQ29zdCkKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIENvbmRpdGlvbk1hdHJpeFR5cGUsIHR5cGVuYW1lIFRoZW5NYXRyaXhUeXBlLCB0eXBlbmFtZSBFbHNlTWF0cml4VHlwZT4KK2NsYXNzIFNlbGVjdCA6IGludGVybmFsOjpub19hc3NpZ25tZW50X29wZXJhdG9yLAorICBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPCBTZWxlY3Q8Q29uZGl0aW9uTWF0cml4VHlwZSwgVGhlbk1hdHJpeFR5cGUsIEVsc2VNYXRyaXhUeXBlPiA+Ojp0eXBlCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPFNlbGVjdD46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKFNlbGVjdCkKKworICAgIFNlbGVjdChjb25zdCBDb25kaXRpb25NYXRyaXhUeXBlJiBjb25kaXRpb25NYXRyaXgsCisgICAgICAgICAgIGNvbnN0IFRoZW5NYXRyaXhUeXBlJiB0aGVuTWF0cml4LAorICAgICAgICAgICBjb25zdCBFbHNlTWF0cml4VHlwZSYgZWxzZU1hdHJpeCkKKyAgICAgIDogbV9jb25kaXRpb24oY29uZGl0aW9uTWF0cml4KSwgbV90aGVuKHRoZW5NYXRyaXgpLCBtX2Vsc2UoZWxzZU1hdHJpeCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9jb25kaXRpb24ucm93cygpID09IG1fdGhlbi5yb3dzKCkgJiYgbV9jb25kaXRpb24ucm93cygpID09IG1fZWxzZS5yb3dzKCkpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fY29uZGl0aW9uLmNvbHMoKSA9PSBtX3RoZW4uY29scygpICYmIG1fY29uZGl0aW9uLmNvbHMoKSA9PSBtX2Vsc2UuY29scygpKTsKKyAgICB9CisKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9jb25kaXRpb24ucm93cygpOyB9CisgICAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29uZGl0aW9uLmNvbHMoKTsgfQorCisgICAgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IGksIEluZGV4IGopIGNvbnN0CisgICAgeworICAgICAgaWYgKG1fY29uZGl0aW9uLmNvZWZmKGksaikpCisgICAgICAgIHJldHVybiBtX3RoZW4uY29lZmYoaSxqKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1fZWxzZS5jb2VmZihpLGopOworICAgIH0KKworICAgIGNvbnN0IFNjYWxhciBjb2VmZihJbmRleCBpKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChtX2NvbmRpdGlvbi5jb2VmZihpKSkKKyAgICAgICAgcmV0dXJuIG1fdGhlbi5jb2VmZihpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1fZWxzZS5jb2VmZihpKTsKKyAgICB9CisKKyAgICBjb25zdCBDb25kaXRpb25NYXRyaXhUeXBlJiBjb25kaXRpb25NYXRyaXgoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX2NvbmRpdGlvbjsKKyAgICB9CisKKyAgICBjb25zdCBUaGVuTWF0cml4VHlwZSYgdGhlbk1hdHJpeCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fdGhlbjsKKyAgICB9CisKKyAgICBjb25zdCBFbHNlTWF0cml4VHlwZSYgZWxzZU1hdHJpeCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZWxzZTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIENvbmRpdGlvbk1hdHJpeFR5cGU6Ok5lc3RlZCBtX2NvbmRpdGlvbjsKKyAgICB0eXBlbmFtZSBUaGVuTWF0cml4VHlwZTo6TmVzdGVkIG1fdGhlbjsKKyAgICB0eXBlbmFtZSBFbHNlTWF0cml4VHlwZTo6TmVzdGVkIG1fZWxzZTsKK307CisKKworLyoqIFxyZXR1cm5zIGEgbWF0cml4IHdoZXJlIGVhY2ggY29lZmZpY2llbnQgKGksaikgaXMgZXF1YWwgdG8gXGEgdGhlbk1hdHJpeChpLGopCisgICogaWYgXGMgKnRoaXMoaSxqKSwgYW5kIFxhIGVsc2VNYXRyaXgoaSxqKSBvdGhlcndpc2UuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3NlbGVjdC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3NlbGVjdC5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBTZWxlY3QKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVuRGVyaXZlZCx0eXBlbmFtZSBFbHNlRGVyaXZlZD4KK2lubGluZSBjb25zdCBTZWxlY3Q8RGVyaXZlZCxUaGVuRGVyaXZlZCxFbHNlRGVyaXZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6c2VsZWN0KGNvbnN0IERlbnNlQmFzZTxUaGVuRGVyaXZlZD4mIHRoZW5NYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVuc2VCYXNlPEVsc2VEZXJpdmVkPiYgZWxzZU1hdHJpeCkgY29uc3QKK3sKKyAgcmV0dXJuIFNlbGVjdDxEZXJpdmVkLFRoZW5EZXJpdmVkLEVsc2VEZXJpdmVkPihkZXJpdmVkKCksIHRoZW5NYXRyaXguZGVyaXZlZCgpLCBlbHNlTWF0cml4LmRlcml2ZWQoKSk7Cit9CisKKy8qKiBWZXJzaW9uIG9mIERlbnNlQmFzZTo6c2VsZWN0KGNvbnN0IERlbnNlQmFzZSYsIGNvbnN0IERlbnNlQmFzZSYpIHdpdGgKKyAgKiB0aGUgXGVtIGVsc2UgZXhwcmVzc2lvbiBiZWluZyBhIHNjYWxhciB2YWx1ZS4KKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OnNlbGVjdChjb25zdCBEZW5zZUJhc2U8VGhlbkRlcml2ZWQ+JiwgY29uc3QgRGVuc2VCYXNlPEVsc2VEZXJpdmVkPiYpIGNvbnN0LCBjbGFzcyBTZWxlY3QKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVuRGVyaXZlZD4KK2lubGluZSBjb25zdCBTZWxlY3Q8RGVyaXZlZCxUaGVuRGVyaXZlZCwgdHlwZW5hbWUgVGhlbkRlcml2ZWQ6OkNvbnN0YW50UmV0dXJuVHlwZT4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6c2VsZWN0KGNvbnN0IERlbnNlQmFzZTxUaGVuRGVyaXZlZD4mIHRoZW5NYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVGhlbkRlcml2ZWQ6OlNjYWxhciBlbHNlU2NhbGFyKSBjb25zdAoreworICByZXR1cm4gU2VsZWN0PERlcml2ZWQsVGhlbkRlcml2ZWQsdHlwZW5hbWUgVGhlbkRlcml2ZWQ6OkNvbnN0YW50UmV0dXJuVHlwZT4oCisgICAgZGVyaXZlZCgpLCB0aGVuTWF0cml4LmRlcml2ZWQoKSwgVGhlbkRlcml2ZWQ6OkNvbnN0YW50KHJvd3MoKSxjb2xzKCksZWxzZVNjYWxhcikpOworfQorCisvKiogVmVyc2lvbiBvZiBEZW5zZUJhc2U6OnNlbGVjdChjb25zdCBEZW5zZUJhc2UmLCBjb25zdCBEZW5zZUJhc2UmKSB3aXRoCisgICogdGhlIFxlbSB0aGVuIGV4cHJlc3Npb24gYmVpbmcgYSBzY2FsYXIgdmFsdWUuCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjpzZWxlY3QoY29uc3QgRGVuc2VCYXNlPFRoZW5EZXJpdmVkPiYsIGNvbnN0IERlbnNlQmFzZTxFbHNlRGVyaXZlZD4mKSBjb25zdCwgY2xhc3MgU2VsZWN0CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgRWxzZURlcml2ZWQ+CitpbmxpbmUgY29uc3QgU2VsZWN0PERlcml2ZWQsIHR5cGVuYW1lIEVsc2VEZXJpdmVkOjpDb25zdGFudFJldHVyblR5cGUsIEVsc2VEZXJpdmVkID4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6c2VsZWN0KHR5cGVuYW1lIEVsc2VEZXJpdmVkOjpTY2FsYXIgdGhlblNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW5zZUJhc2U8RWxzZURlcml2ZWQ+JiBlbHNlTWF0cml4KSBjb25zdAoreworICByZXR1cm4gU2VsZWN0PERlcml2ZWQsdHlwZW5hbWUgRWxzZURlcml2ZWQ6OkNvbnN0YW50UmV0dXJuVHlwZSxFbHNlRGVyaXZlZD4oCisgICAgZGVyaXZlZCgpLCBFbHNlRGVyaXZlZDo6Q29uc3RhbnQocm93cygpLGNvbHMoKSx0aGVuU2NhbGFyKSwgZWxzZU1hdHJpeC5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NFTEVDVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9TZWxmQWRqb2ludFZpZXcuaCBiL0VpZ2VuL3NyYy9Db3JlL1NlbGZBZGpvaW50Vmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyY2M0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9TZWxmQWRqb2ludFZpZXcuaApAQCAtMCwwICsxLDMxNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NFTEZBREpPSU5UTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxjbGFzcyBTZWxmQWRqb2ludFZpZXcKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiBvZiBhIHNlbGZhZGpvaW50IG1hdHJpeCBmcm9tIGEgdHJpYW5ndWxhciBwYXJ0IG9mIGEgZGVuc2UgbWF0cml4CisgICoKKyAgKiBccGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgZGVuc2UgbWF0cml4IHN0b3JpbmcgdGhlIGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBUcmlhbmd1bGFyUGFydCBjYW4gYmUgZWl0aGVyIFxjICNMb3dlciBvciBcYyAjVXBwZXIKKyAgKgorICAqIFRoaXMgY2xhc3MgaXMgYW4gZXhwcmVzc2lvbiBvZiBhIHNlZmxhZGpvaW50IG1hdHJpeCBmcm9tIGEgdHJpYW5ndWxhciBwYXJ0IG9mIGEgbWF0cml4CisgICogd2l0aCBnaXZlbiBkZW5zZSBzdG9yYWdlIG9mIHRoZSBjb2VmZmljaWVudHMuIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpzZWxmYWRqb2ludFZpZXcoKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRoYXQgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBjbGFzcyBUcmlhbmd1bGFyQmFzZSwgTWF0cml4QmFzZTo6c2VsZmFkam9pbnRWaWV3KCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPgorc3RydWN0IHRyYWl0czxTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSwgVXBMbz4gPiA6IHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZDxNYXRyaXhUeXBlPjo6dHlwZSBNYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQ7CisgIHR5cGVkZWYgTWF0cml4VHlwZSBFeHByZXNzaW9uVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpQbGFpbk9iamVjdCBEZW5zZU1hdHJpeFR5cGU7CisgIGVudW0geworICAgIE1vZGUgPSBVcExvIHwgU2VsZkFkam9pbnQsCisgICAgRmxhZ3MgPSAgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQ6OkZsYWdzICYgKEhlcmVkaXRhcnlCaXRzKQorICAgICAgICAgICAmICh+KFBhY2tldEFjY2Vzc0JpdCB8IERpcmVjdEFjY2Vzc0JpdCB8IExpbmVhckFjY2Vzc0JpdCkpLCAvLyBGSVhNRSB0aGVzZSBmbGFncyBzaG91bGQgYmUgcHJlc2VydmVkCisgICAgQ29lZmZSZWFkQ29zdCA9IE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOjpDb2VmZlJlYWRDb3N0CisgIH07Cit9OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzLCBpbnQgTGhzTW9kZSwgYm9vbCBMaHNJc1ZlY3RvciwKKyAgICAgICAgICB0eXBlbmFtZSBSaHMsIGludCBSaHNNb2RlLCBib29sIFJoc0lzVmVjdG9yPgorc3RydWN0IFNlbGZhZGpvaW50UHJvZHVjdE1hdHJpeDsKKworLy8gRklYTUUgY291bGQgYWxzbyBiZSBjYWxsZWQgU2VsZkFkam9pbnRXcmFwcGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBEaWFnb25hbFdyYXBwZXIgPz8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPiBjbGFzcyBTZWxmQWRqb2ludFZpZXcKKyAgOiBwdWJsaWMgVHJpYW5ndWxhckJhc2U8U2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsIFVwTG8+ID4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBUcmlhbmd1bGFyQmFzZTxTZWxmQWRqb2ludFZpZXc+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNlbGZBZGpvaW50Vmlldz46Ok1hdHJpeFR5cGVOZXN0ZWQgTWF0cml4VHlwZU5lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8U2VsZkFkam9pbnRWaWV3Pjo6TWF0cml4VHlwZU5lc3RlZENsZWFuZWQgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQ7CisKKyAgICAvKiogXGJyaWVmIFRoZSB0eXBlIG9mIGNvZWZmaWNpZW50cyBpbiB0aGlzIG1hdHJpeCAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxTZWxmQWRqb2ludFZpZXc+OjpTY2FsYXIgU2NhbGFyOyAKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgICBlbnVtIHsKKyAgICAgIE1vZGUgPSBpbnRlcm5hbDo6dHJhaXRzPFNlbGZBZGpvaW50Vmlldz46Ok1vZGUKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisKKyAgICBpbmxpbmUgU2VsZkFkam9pbnRWaWV3KE1hdHJpeFR5cGUmIG1hdHJpeCkgOiBtX21hdHJpeChtYXRyaXgpCisgICAge30KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5vdXRlclN0cmlkZSgpOyB9CisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguaW5uZXJTdHJpZGUoKTsgfQorCisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpjb2VmZigpCisgICAgICAqIFx3YXJuaW5nIHRoZSBjb29yZGluYXRlcyBtdXN0IGZpdCBpbnRvIHRoZSByZWZlcmVuY2VkIHRyaWFuZ3VsYXIgcGFydAorICAgICAgKi8KKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIEJhc2U6OmNoZWNrX2Nvb3JkaW5hdGVzX2ludGVybmFsKHJvdywgY29sKTsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb2VmZihyb3csIGNvbCk7CisgICAgfQorCisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpjb2VmZlJlZigpCisgICAgICAqIFx3YXJuaW5nIHRoZSBjb29yZGluYXRlcyBtdXN0IGZpdCBpbnRvIHRoZSByZWZlcmVuY2VkIHRyaWFuZ3VsYXIgcGFydAorICAgICAgKi8KKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBCYXNlOjpjaGVja19jb29yZGluYXRlc19pbnRlcm5hbChyb3csIGNvbCk7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBjb25zdCBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZCYgX2V4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX21hdHJpeDsgfQorCisgICAgY29uc3QgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQmIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX21hdHJpeDsgfQorICAgIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkJiBuZXN0ZWRFeHByZXNzaW9uKCkgeyByZXR1cm4gKmNvbnN0X2Nhc3Q8TWF0cml4VHlwZU5lc3RlZENsZWFuZWQqPigmbV9tYXRyaXgpOyB9CisKKyAgICAvKiogRWZmaWNpZW50IHNlbGYtYWRqb2ludCBtYXRyaXggdGltZXMgdmVjdG9yL21hdHJpeCBwcm9kdWN0ICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIFNlbGZhZGpvaW50UHJvZHVjdE1hdHJpeDxNYXRyaXhUeXBlLE1vZGUsZmFsc2UsT3RoZXJEZXJpdmVkLDAsT3RoZXJEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWU+CisgICAgb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgcmhzKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBTZWxmYWRqb2ludFByb2R1Y3RNYXRyaXgKKyAgICAgICAgICAgICAgPE1hdHJpeFR5cGUsTW9kZSxmYWxzZSxPdGhlckRlcml2ZWQsMCxPdGhlckRlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgKG1fbWF0cml4LCByaHMuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICAvKiogRWZmaWNpZW50IHZlY3Rvci9tYXRyaXggdGltZXMgc2VsZi1hZGpvaW50IG1hdHJpeCBwcm9kdWN0ICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBmcmllbmQKKyAgICBTZWxmYWRqb2ludFByb2R1Y3RNYXRyaXg8T3RoZXJEZXJpdmVkLDAsT3RoZXJEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsTWF0cml4VHlwZSxNb2RlLGZhbHNlPgorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIGxocywgY29uc3QgU2VsZkFkam9pbnRWaWV3JiByaHMpCisgICAgeworICAgICAgcmV0dXJuIFNlbGZhZGpvaW50UHJvZHVjdE1hdHJpeAorICAgICAgICAgICAgICA8T3RoZXJEZXJpdmVkLDAsT3RoZXJEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsTWF0cml4VHlwZSxNb2RlLGZhbHNlPgorICAgICAgICAgICAgICAobGhzLmRlcml2ZWQoKSxyaHMubV9tYXRyaXgpOworICAgIH0KKworICAgIC8qKiBQZXJmb3JtIGEgc3ltbWV0cmljIHJhbmsgMiB1cGRhdGUgb2YgdGhlIHNlbGZhZGpvaW50IG1hdHJpeCBcYyAqdGhpczoKKyAgICAgICogXGYkIHRoaXMgPSB0aGlzICsgXGFscGhhIHUgdl4qICsgY29uaihcYWxwaGEpIHYgdV4qIFxmJAorICAgICAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBUaGUgdmVjdG9ycyBcYSB1IGFuZCBcYyB2IFxiIG11c3QgYmUgY29sdW1uIHZlY3RvcnMsIGhvd2V2ZXIgdGhleSBjYW4gYmUKKyAgICAgICogYSBhZGpvaW50IGV4cHJlc3Npb24gd2l0aG91dCBhbnkgb3ZlcmhlYWQuIE9ubHkgdGhlIG1lYW5pbmdmdWwgdHJpYW5ndWxhcgorICAgICAgKiBwYXJ0IG9mIHRoZSBtYXRyaXggaXMgdXBkYXRlZCwgdGhlIHJlc3QgaXMgbGVmdCB1bmNoYW5nZWQuCisgICAgICAqCisgICAgICAqIFxzYSByYW5rVXBkYXRlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZFU+JiwgU2NhbGFyKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkVSwgdHlwZW5hbWUgRGVyaXZlZFY+CisgICAgU2VsZkFkam9pbnRWaWV3JiByYW5rVXBkYXRlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZFU+JiB1LCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWRWPiYgdiwgU2NhbGFyIGFscGhhID0gU2NhbGFyKDEpKTsKKworICAgIC8qKiBQZXJmb3JtIGEgc3ltbWV0cmljIHJhbmsgSyB1cGRhdGUgb2YgdGhlIHNlbGZhZGpvaW50IG1hdHJpeCBcYyAqdGhpczoKKyAgICAgICogXGYkIHRoaXMgPSB0aGlzICsgXGFscGhhICggdSB1XiogKSBcZiQgd2hlcmUgXGEgdSBpcyBhIHZlY3RvciBvciBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCB0byBwZXJmb3JtIFxmJCB0aGlzID0gdGhpcyArIFxhbHBoYSAoIHVeKiB1ICkgXGYkIHlvdSBjYW4gc2ltcGx5CisgICAgICAqIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHUuYWRqb2ludCgpLgorICAgICAgKgorICAgICAgKiBcc2EgcmFua1VwZGF0ZShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWRVPiYsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZFY+JiwgU2NhbGFyKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkVT4KKyAgICBTZWxmQWRqb2ludFZpZXcmIHJhbmtVcGRhdGUoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkVT4mIHUsIFNjYWxhciBhbHBoYSA9IFNjYWxhcigxKSk7CisKKy8vLy8vLy8vLy8vIENob2xlc2t5IG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgY29uc3QgTExUPFBsYWluT2JqZWN0LCBVcExvPiBsbHQoKSBjb25zdDsKKyAgICBjb25zdCBMRExUPFBsYWluT2JqZWN0LCBVcExvPiBsZGx0KCkgY29uc3Q7CisKKy8vLy8vLy8vLy8vIEVpZ2VudmFsdWUgbW9kdWxlIC8vLy8vLy8vLy8vCisKKyAgICAvKiogUmVhbCBwYXJ0IG9mICNTY2FsYXIgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgLyoqIFJldHVybiB0eXBlIG9mIGVpZ2VudmFsdWVzKCkgKi8KKyAgICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpDb2xzQXRDb21waWxlVGltZSwgMT4gRWlnZW52YWx1ZXNSZXR1cm5UeXBlOworCisgICAgRWlnZW52YWx1ZXNSZXR1cm5UeXBlIGVpZ2VudmFsdWVzKCkgY29uc3Q7CisgICAgUmVhbFNjYWxhciBvcGVyYXRvck5vcm0oKSBjb25zdDsKKyAgICAKKyAgICAjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgU2VsZkFkam9pbnRWaWV3JiBvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBlbnVtIHsKKyAgICAgICAgT3RoZXJQYXJ0ID0gVXBMbyA9PSBVcHBlciA/IFN0cmljdGx5TG93ZXIgOiBTdHJpY3RseVVwcGVyCisgICAgICB9OworICAgICAgbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBMbz4oKSA9IG90aGVyOworICAgICAgbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8T3RoZXJQYXJ0PigpID0gb3RoZXIuYWRqb2ludCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlck1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBPdGhlck1vZGU+CisgICAgU2VsZkFkam9pbnRWaWV3JiBvcGVyYXRvcj0oY29uc3QgVHJpYW5ndWxhclZpZXc8T3RoZXJNYXRyaXhUeXBlLCBPdGhlck1vZGU+JiBvdGhlcikKKyAgICB7CisgICAgICBlbnVtIHsKKyAgICAgICAgT3RoZXJQYXJ0ID0gVXBMbyA9PSBVcHBlciA/IFN0cmljdGx5TG93ZXIgOiBTdHJpY3RseVVwcGVyCisgICAgICB9OworICAgICAgbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBMbz4oKSA9IG90aGVyLnRvRGVuc2VNYXRyaXgoKTsKKyAgICAgIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE90aGVyUGFydD4oKSA9IG90aGVyLnRvRGVuc2VNYXRyaXgoKS5hZGpvaW50KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgICNlbmRpZgorCisgIHByb3RlY3RlZDoKKyAgICBNYXRyaXhUeXBlTmVzdGVkIG1fbWF0cml4OworfTsKKworCisvLyB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQsIHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPgorLy8gaW50ZXJuYWw6OnNlbGZhZGpvaW50X21hdHJpeF9wcm9kdWN0X3JldHVybnR5cGU8T3RoZXJEZXJpdmVkLFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLFVwTG8+ID4KKy8vIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIGxocywgY29uc3QgU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsVXBMbz4mIHJocykKKy8vIHsKKy8vICAgcmV0dXJuIGludGVybmFsOjptYXRyaXhfc2VsZmFkam9pbnRfcHJvZHVjdF9yZXR1cm50eXBlPE90aGVyRGVyaXZlZCxTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSxVcExvPiA+KGxocy5kZXJpdmVkKCkscmhzKTsKKy8vIH0KKworLy8gc2VsZmFkam9pbnQgdG8gZGVuc2UgbWF0cml4CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgaW50IFVucm9sbENvdW50LCBib29sIENsZWFyT3Bwb3NpdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9hc3NpZ25tZW50X3NlbGVjdG9yPERlcml2ZWQxLCBEZXJpdmVkMiwgKFNlbGZBZGpvaW50fFVwcGVyKSwgVW5yb2xsQ291bnQsIENsZWFyT3Bwb3NpdGU+Cit7CisgIGVudW0geworICAgIGNvbCA9IChVbnJvbGxDb3VudC0xKSAvIERlcml2ZWQxOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICByb3cgPSAoVW5yb2xsQ291bnQtMSkgJSBEZXJpdmVkMTo6Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKERlcml2ZWQxICZkc3QsIGNvbnN0IERlcml2ZWQyICZzcmMpCisgIHsKKyAgICB0cmlhbmd1bGFyX2Fzc2lnbm1lbnRfc2VsZWN0b3I8RGVyaXZlZDEsIERlcml2ZWQyLCAoU2VsZkFkam9pbnR8VXBwZXIpLCBVbnJvbGxDb3VudC0xLCBDbGVhck9wcG9zaXRlPjo6cnVuKGRzdCwgc3JjKTsKKworICAgIGlmKHJvdyA9PSBjb2wpCisgICAgICBkc3QuY29lZmZSZWYocm93LCBjb2wpID0gcmVhbChzcmMuY29lZmYocm93LCBjb2wpKTsKKyAgICBlbHNlIGlmKHJvdyA8IGNvbCkKKyAgICAgIGRzdC5jb2VmZlJlZihjb2wsIHJvdykgPSBjb25qKGRzdC5jb2VmZlJlZihyb3csIGNvbCkgPSBzcmMuY29lZmYocm93LCBjb2wpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBib29sIENsZWFyT3Bwb3NpdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9hc3NpZ25tZW50X3NlbGVjdG9yPERlcml2ZWQxLCBEZXJpdmVkMiwgU2VsZkFkam9pbnR8VXBwZXIsIDAsIENsZWFyT3Bwb3NpdGU+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oRGVyaXZlZDEgJiwgY29uc3QgRGVyaXZlZDIgJikge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgaW50IFVucm9sbENvdW50LCBib29sIENsZWFyT3Bwb3NpdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9hc3NpZ25tZW50X3NlbGVjdG9yPERlcml2ZWQxLCBEZXJpdmVkMiwgKFNlbGZBZGpvaW50fExvd2VyKSwgVW5yb2xsQ291bnQsIENsZWFyT3Bwb3NpdGU+Cit7CisgIGVudW0geworICAgIGNvbCA9IChVbnJvbGxDb3VudC0xKSAvIERlcml2ZWQxOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICByb3cgPSAoVW5yb2xsQ291bnQtMSkgJSBEZXJpdmVkMTo6Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKERlcml2ZWQxICZkc3QsIGNvbnN0IERlcml2ZWQyICZzcmMpCisgIHsKKyAgICB0cmlhbmd1bGFyX2Fzc2lnbm1lbnRfc2VsZWN0b3I8RGVyaXZlZDEsIERlcml2ZWQyLCAoU2VsZkFkam9pbnR8TG93ZXIpLCBVbnJvbGxDb3VudC0xLCBDbGVhck9wcG9zaXRlPjo6cnVuKGRzdCwgc3JjKTsKKworICAgIGlmKHJvdyA9PSBjb2wpCisgICAgICBkc3QuY29lZmZSZWYocm93LCBjb2wpID0gcmVhbChzcmMuY29lZmYocm93LCBjb2wpKTsKKyAgICBlbHNlIGlmKHJvdyA+IGNvbCkKKyAgICAgIGRzdC5jb2VmZlJlZihjb2wsIHJvdykgPSBjb25qKGRzdC5jb2VmZlJlZihyb3csIGNvbCkgPSBzcmMuY29lZmYocm93LCBjb2wpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBib29sIENsZWFyT3Bwb3NpdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9hc3NpZ25tZW50X3NlbGVjdG9yPERlcml2ZWQxLCBEZXJpdmVkMiwgU2VsZkFkam9pbnR8TG93ZXIsIDAsIENsZWFyT3Bwb3NpdGU+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oRGVyaXZlZDEgJiwgY29uc3QgRGVyaXZlZDIgJikge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgYm9vbCBDbGVhck9wcG9zaXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfYXNzaWdubWVudF9zZWxlY3RvcjxEZXJpdmVkMSwgRGVyaXZlZDIsIFNlbGZBZGpvaW50fFVwcGVyLCBEeW5hbWljLCBDbGVhck9wcG9zaXRlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihEZXJpdmVkMSAmZHN0LCBjb25zdCBEZXJpdmVkMiAmc3JjKQorICB7CisgICAgZm9yKEluZGV4IGogPSAwOyBqIDwgZHN0LmNvbHMoKTsgKytqKQorICAgIHsKKyAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IGo7ICsraSkKKyAgICAgIHsKKyAgICAgICAgZHN0LmNvcHlDb2VmZihpLCBqLCBzcmMpOworICAgICAgICBkc3QuY29lZmZSZWYoaixpKSA9IGNvbmooZHN0LmNvZWZmKGksaikpOworICAgICAgfQorICAgICAgZHN0LmNvcHlDb2VmZihqLCBqLCBzcmMpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBib29sIENsZWFyT3Bwb3NpdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9hc3NpZ25tZW50X3NlbGVjdG9yPERlcml2ZWQxLCBEZXJpdmVkMiwgU2VsZkFkam9pbnR8TG93ZXIsIER5bmFtaWMsIENsZWFyT3Bwb3NpdGU+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpJbmRleCBJbmRleDsKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBkc3Qucm93cygpOyArK2kpCisgICAgeworICAgICAgZm9yKEluZGV4IGogPSAwOyBqIDwgaTsgKytqKQorICAgICAgeworICAgICAgICBkc3QuY29weUNvZWZmKGksIGosIHNyYyk7CisgICAgICAgIGRzdC5jb2VmZlJlZihqLGkpID0gY29uaihkc3QuY29lZmYoaSxqKSk7CisgICAgICB9CisgICAgICBkc3QuY29weUNvZWZmKGksIGksIHNyYyk7CisgICAgfQorICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBNYXRyaXhCYXNlIG1ldGhvZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHVuc2lnbmVkIGludCBVcExvPgordHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6dGVtcGxhdGUgQ29uc3RTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlPFVwTG8+OjpUeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpzZWxmYWRqb2ludFZpZXcoKSBjb25zdAoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+Cit0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBTZWxmQWRqb2ludFZpZXdSZXR1cm5UeXBlPFVwTG8+OjpUeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpzZWxmYWRqb2ludFZpZXcoKQoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NFTEZBREpPSU5UTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1NlbGZDd2lzZUJpbmFyeU9wLmggYi9FaWdlbi9zcmMvQ29yZS9TZWxmQ3dpc2VCaW5hcnlPcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWYyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9TZWxmQ3dpc2VCaW5hcnlPcC5oCkBAIC0wLDAgKzEsMTk0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TRUxGQ1dJU0VCSU5BUllPUF9ICisjZGVmaW5lIEVJR0VOX1NFTEZDV0lTRUJJTkFSWU9QX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgU2VsZkN3aXNlQmluYXJ5T3AKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGludGVybmFsCisgICoKKyAgKiBcYnJpZWYgSW50ZXJuYWwgaGVscGVyIGNsYXNzIGZvciBvcHRpbWl6aW5nIG9wZXJhdG9ycyBsaWtlICs9LCAtPQorICAqCisgICogVGhpcyBpcyBhIHBzZXVkbyBleHByZXNzaW9uIGNsYXNzIHJlLWltcGxlbWVudGluZyB0aGUgY29weUNvZWZmL2NvcHlQYWNrZXQKKyAgKiBtZXRob2QgdG8gZGlyZWN0bHkgcGVyZm9ybXMgYSArPS8tPSBvcGVyYXRpb25zIGluIGFuIG9wdGltYWwgd2F5LiBJbiBwYXJ0aWN1bGFyLAorICAqIHRoaXMgYWxsb3dzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbnB1dC9vdXRwdXQgZGF0YSBhcmUgbG9hZGVkIG9ubHkgb25jZSB1c2luZworICAqIGFsaWduZWQgcGFja2V0IGxvYWRzLgorICAqCisgICogXHNhIGNsYXNzIFN3YXBXcmFwcGVyIGZvciBhIHNpbWlsYXIgdHJpY2suCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgdHJhaXRzPFNlbGZDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLExocyxSaHM+ID4KKyAgOiB0cmFpdHM8Q3dpc2VCaW5hcnlPcDxCaW5hcnlPcCxMaHMsUmhzPiA+Cit7CisgIGVudW0geworICAgIC8vIE5vdGUgdGhhdCBpdCBpcyBzdGlsbCBhIGdvb2QgaWRlYSB0byBwcmVzZXJ2ZSB0aGUgRGlyZWN0QWNjZXNzQml0CisgICAgLy8gc28gdGhhdCBhc3NpZ24gY2FuIGNvcnJlY3RseSBhbGlnbiB0aGUgZGF0YS4KKyAgICBGbGFncyA9IHRyYWl0czxDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLExocyxSaHM+ID46OkZsYWdzIHwgKExoczo6RmxhZ3MmRGlyZWN0QWNjZXNzQml0KSB8IChMaHM6OkZsYWdzJkx2YWx1ZUJpdCksCisgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gTGhzOjpPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUsCisgICAgSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gTGhzOjpJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4gY2xhc3MgU2VsZkN3aXNlQmluYXJ5T3AKKyAgOiBwdWJsaWMgaW50ZXJuYWw6OmRlbnNlX3hwcl9iYXNlPCBTZWxmQ3dpc2VCaW5hcnlPcDxCaW5hcnlPcCwgTGhzLCBSaHM+ID46OnR5cGUKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8U2VsZkN3aXNlQmluYXJ5T3A+Ojp0eXBlIEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShTZWxmQ3dpc2VCaW5hcnlPcCkKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisKKyAgICBpbmxpbmUgU2VsZkN3aXNlQmluYXJ5T3AoTGhzJiB4cHIsIGNvbnN0IEJpbmFyeU9wJiBmdW5jID0gQmluYXJ5T3AoKSkgOiBtX21hdHJpeCh4cHIpLCBtX2Z1bmN0b3IoZnVuYykge30KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5vdXRlclN0cmlkZSgpOyB9CisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguaW5uZXJTdHJpZGUoKTsgfQorICAgIGlubGluZSBjb25zdCBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5kYXRhKCk7IH0KKworICAgIC8vIG5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBieSBhc3NpZ24gdG8gY29ycmVjdGx5IGFsaWduIGxvYWRzL3N0b3JlcworICAgIC8vIFRPRE8gbWFrZSBBc3NpZ24gdXNlIC5kYXRhKCkKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShMaHMpCisgICAgICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmZSZWYocm93LCBjb2wpOworICAgIH0KKworICAgIC8vIG5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCBieSBhc3NpZ24gdG8gY29ycmVjdGx5IGFsaWduIGxvYWRzL3N0b3JlcworICAgIC8vIFRPRE8gbWFrZSBBc3NpZ24gdXNlIC5kYXRhKCkKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShMaHMpCisgICAgICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIGNvcHlDb2VmZihJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIE90aGVyRGVyaXZlZCYgX290aGVyID0gb3RoZXIuY29uc3RfY2FzdF9kZXJpdmVkKCk7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQocm93ID49IDAgJiYgcm93IDwgcm93cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29sID49IDAgJiYgY29sIDwgY29scygpKTsKKyAgICAgIFNjYWxhciYgdG1wID0gbV9tYXRyaXguY29lZmZSZWYocm93LGNvbCk7CisgICAgICB0bXAgPSBtX2Z1bmN0b3IodG1wLCBfb3RoZXIuY29lZmYocm93LGNvbCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIGNvcHlDb2VmZihJbmRleCBpbmRleCwgY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIE90aGVyRGVyaXZlZCYgX290aGVyID0gb3RoZXIuY29uc3RfY2FzdF9kZXJpdmVkKCk7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG1fbWF0cml4LnNpemUoKSk7CisgICAgICBTY2FsYXImIHRtcCA9IG1fbWF0cml4LmNvZWZmUmVmKGluZGV4KTsKKyAgICAgIHRtcCA9IG1fZnVuY3Rvcih0bXAsIF9vdGhlci5jb2VmZihpbmRleCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgaW50IFN0b3JlTW9kZSwgaW50IExvYWRNb2RlPgorICAgIHZvaWQgY29weVBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIE90aGVyRGVyaXZlZCYgX290aGVyID0gb3RoZXIuY29uc3RfY2FzdF9kZXJpdmVkKCk7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQocm93ID49IDAgJiYgcm93IDwgcm93cygpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2wgPj0gMCAmJiBjb2wgPCBjb2xzKCkpOworICAgICAgbV9tYXRyaXgudGVtcGxhdGUgd3JpdGVQYWNrZXQ8U3RvcmVNb2RlPihyb3csIGNvbCwKKyAgICAgICAgbV9mdW5jdG9yLnBhY2tldE9wKG1fbWF0cml4LnRlbXBsYXRlIHBhY2tldDxTdG9yZU1vZGU+KHJvdywgY29sKSxfb3RoZXIudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihyb3csIGNvbCkpICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCBpbnQgU3RvcmVNb2RlLCBpbnQgTG9hZE1vZGU+CisgICAgdm9pZCBjb3B5UGFja2V0KEluZGV4IGluZGV4LCBjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgT3RoZXJEZXJpdmVkJiBfb3RoZXIgPSBvdGhlci5jb25zdF9jYXN0X2Rlcml2ZWQoKTsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgbV9tYXRyaXguc2l6ZSgpKTsKKyAgICAgIG1fbWF0cml4LnRlbXBsYXRlIHdyaXRlUGFja2V0PFN0b3JlTW9kZT4oaW5kZXgsCisgICAgICAgIG1fZnVuY3Rvci5wYWNrZXRPcChtX21hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8U3RvcmVNb2RlPihpbmRleCksX290aGVyLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpKSApOworICAgIH0KKworICAgIC8vIHJlaW1wbGVtZW50IGxhenlBc3NpZ24gdG8gaGFuZGxlIGNvbXBsZXggKj0gcmVhbAorICAgIC8vIHNlZSBDd2lzZUJpbmFyeU9wIGN0b3IgZm9yIGRldGFpbHMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNEZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2VsZkN3aXNlQmluYXJ5T3AmIGxhenlBc3NpZ24oY29uc3QgRGVuc2VCYXNlPFJoc0Rlcml2ZWQ+JiByaHMpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFKExocyxSaHNEZXJpdmVkKQorICAgICAgRUlHRU5fQ0hFQ0tfQklOQVJZX0NPTVBBVElCSUxJWShCaW5hcnlPcCx0eXBlbmFtZSBMaHM6OlNjYWxhcix0eXBlbmFtZSBSaHNEZXJpdmVkOjpTY2FsYXIpOworICAgICAgCisgICAgI2lmZGVmIEVJR0VOX0RFQlVHX0FTU0lHTgorICAgICAgaW50ZXJuYWw6OmFzc2lnbl90cmFpdHM8U2VsZkN3aXNlQmluYXJ5T3AsIFJoc0Rlcml2ZWQ+OjpkZWJ1ZygpOworICAgICNlbmRpZgorICAgICAgZWlnZW5fYXNzZXJ0KHJvd3MoKSA9PSByaHMucm93cygpICYmIGNvbHMoKSA9PSByaHMuY29scygpKTsKKyAgICAgIGludGVybmFsOjphc3NpZ25faW1wbDxTZWxmQ3dpc2VCaW5hcnlPcCwgUmhzRGVyaXZlZD46OnJ1bigqdGhpcyxyaHMuZGVyaXZlZCgpKTsKKyAgICAjaWZuZGVmIEVJR0VOX05PX0RFQlVHCisgICAgICB0aGlzLT5jaGVja1RyYW5zcG9zZUFsaWFzaW5nKHJocy5kZXJpdmVkKCkpOworICAgICNlbmRpZgorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAKKyAgICAvLyBvdmVybG9hZGVkIHRvIGhvbm9yIGV2YWx1YXRpb24gb2Ygc3BlY2lhbCBtYXRyaWNlcworICAgIC8vIG1heWJlIGFub3RoZXIgc29sdXRpb24gd291bGQgYmUgdG8gbm90IHVzZSBTZWxmQ3dpc2VCaW5hcnlPcAorICAgIC8vIGF0IGZpcnN0Li4uCisgICAgU2VsZkN3aXNlQmluYXJ5T3AmIG9wZXJhdG9yPShjb25zdCBSaHMmIF9yaHMpCisgICAgeworICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxSaHM+Ojp0eXBlIHJocyhfcmhzKTsKKyAgICAgIHJldHVybiBCYXNlOjpvcGVyYXRvcj0ocmhzKTsKKyAgICB9CisKKyAgICBMaHMmIGV4cHJlc3Npb24oKSBjb25zdCAKKyAgICB7IAorICAgICAgcmV0dXJuIG1fbWF0cml4OworICAgIH0KKworICAgIGNvbnN0IEJpbmFyeU9wJiBmdW5jdG9yKCkgY29uc3QgCisgICAgeyAKKyAgICAgIHJldHVybiBtX2Z1bmN0b3I7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBMaHMmIG1fbWF0cml4OworICAgIGNvbnN0IEJpbmFyeU9wJiBtX2Z1bmN0b3I7CisKKyAgcHJpdmF0ZToKKyAgICBTZWxmQ3dpc2VCaW5hcnlPcCYgb3BlcmF0b3I9KGNvbnN0IFNlbGZDd2lzZUJpbmFyeU9wJik7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIERlcml2ZWQmIERlbnNlQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IqPShjb25zdCBTY2FsYXImIG90aGVyKQoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICBTZWxmQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPiwgRGVyaXZlZCwgdHlwZW5hbWUgUGxhaW5PYmplY3Q6OkNvbnN0YW50UmV0dXJuVHlwZT4gdG1wKGRlcml2ZWQoKSk7CisgIHRtcCA9IFBsYWluT2JqZWN0OjpDb25zdGFudChyb3dzKCksY29scygpLG90aGVyKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBEZXJpdmVkJiBEZW5zZUJhc2U8RGVyaXZlZD46Om9wZXJhdG9yLz0oY29uc3QgU2NhbGFyJiBvdGhlcikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8TnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50X29wPFNjYWxhcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPFNjYWxhcj4gPjo6dHlwZSBCaW5PcDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKyAgU2VsZkN3aXNlQmluYXJ5T3A8QmluT3AsIERlcml2ZWQsIHR5cGVuYW1lIFBsYWluT2JqZWN0OjpDb25zdGFudFJldHVyblR5cGU+IHRtcChkZXJpdmVkKCkpOworICB0bXAgPSBQbGFpbk9iamVjdDo6Q29uc3RhbnQocm93cygpLGNvbHMoKSwgTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciA/IG90aGVyIDogU2NhbGFyKDEpL290aGVyKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TRUxGQ1dJU0VCSU5BUllPUF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9Tb2x2ZVRyaWFuZ3VsYXIuaCBiL0VpZ2VuL3NyYy9Db3JlL1NvbHZlVHJpYW5ndWxhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTdmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Tb2x2ZVRyaWFuZ3VsYXIuaApAQCAtMCwwICsxLDI2MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU09MVkVUUklBTkdVTEFSX0gKKyNkZWZpbmUgRUlHRU5fU09MVkVUUklBTkdVTEFSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zOgorLy8gVGhlIGZvbGxvd2luZyB0d28gcm91dGluZXMgYXJlIGltcGxlbWVudGVkIGluIHRoZSBwcm9kdWN0cy9Ucmlhbmd1bGFyU29sdmVyKi5oIGZpbGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTaWRlLCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU2lkZSwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlLCBpbnQgVHJpU3RvcmFnZU9yZGVyLCBpbnQgT3RoZXJTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg7CisKKy8vIHNtYWxsIGhlbHBlciBzdHJ1Y3QgZXh0cmFjdGluZyBzb21lIHRyYWl0cyBvbiB0aGUgdW5kZXJseWluZyBzb2x2ZXIgb3BlcmF0aW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFNpZGU+CitjbGFzcyB0cnNvbHZlX3RyYWl0cworeworICBwcml2YXRlOgorICAgIGVudW0geworICAgICAgUmhzSXNWZWN0b3JBdENvbXBpbGVUaW1lID0gKFNpZGU9PU9uVGhlTGVmdCA/IFJoczo6Q29sc0F0Q29tcGlsZVRpbWUgOiBSaHM6OlJvd3NBdENvbXBpbGVUaW1lKT09MQorICAgIH07CisgIHB1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgIFVucm9sbGluZyAgID0gKFJoc0lzVmVjdG9yQXRDb21waWxlVGltZSAmJiBSaHM6OlNpemVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMgJiYgUmhzOjpTaXplQXRDb21waWxlVGltZSA8PSA4KQorICAgICAgICAgICAgICAgICAgPyBDb21wbGV0ZVVucm9sbGluZyA6IE5vVW5yb2xsaW5nLAorICAgICAgUmhzVmVjdG9ycyAgPSBSaHNJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPyAxIDogRHluYW1pYworICAgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywKKyAgaW50IFNpZGUsIC8vIGNhbiBiZSBPblRoZUxlZnQvT25UaGVSaWdodAorICBpbnQgTW9kZSwgLy8gY2FuIGJlIFVwcGVyL0xvd2VyIHwgVW5pdERpYWcKKyAgaW50IFVucm9sbGluZyA9IHRyc29sdmVfdHJhaXRzPExocyxSaHMsU2lkZT46OlVucm9sbGluZywKKyAgaW50IFJoc1ZlY3RvcnMgPSB0cnNvbHZlX3RyYWl0czxMaHMsUmhzLFNpZGU+OjpSaHNWZWN0b3JzCisgID4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlcl9zZWxlY3RvcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBTaWRlLCBpbnQgTW9kZT4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlcl9zZWxlY3RvcjxMaHMsUmhzLFNpZGUsTW9kZSxOb1Vucm9sbGluZywxPgoreworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6U2NhbGFyIExoc1NjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OlNjYWxhciBSaHNTY2FsYXI7CisgIHR5cGVkZWYgYmxhc190cmFpdHM8TGhzPiBMaHNQcm9kdWN0VHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIExoc1Byb2R1Y3RUcmFpdHM6OkV4dHJhY3RUeXBlIEFjdHVhbExoc1R5cGU7CisgIHR5cGVkZWYgTWFwPE1hdHJpeDxSaHNTY2FsYXIsRHluYW1pYywxPiwgQWxpZ25lZD4gTWFwcGVkUmhzOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIFJocyYgcmhzKQorICB7CisgICAgQWN0dWFsTGhzVHlwZSBhY3R1YWxMaHMgPSBMaHNQcm9kdWN0VHJhaXRzOjpleHRyYWN0KGxocyk7CisKKyAgICAvLyBGSVhNRSBmaW5kIGEgd2F5IHRvIGFsbG93IGFuIGlubmVyIHN0cmlkZSBpZiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU9PTEKKworICAgIGJvb2wgdXNlUmhzRGlyZWN0bHkgPSBSaHM6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MSB8fCByaHMuaW5uZXJTdHJpZGUoKT09MTsKKworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShSaHNTY2FsYXIsYWN0dWFsUmhzLHJocy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VSaHNEaXJlY3RseSA/IHJocy5kYXRhKCkgOiAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmKCF1c2VSaHNEaXJlY3RseSkKKyAgICAgIE1hcHBlZFJocyhhY3R1YWxSaHMscmhzLnNpemUoKSkgPSByaHM7CisKKyAgICB0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxMaHNTY2FsYXIsIFJoc1NjYWxhciwgdHlwZW5hbWUgTGhzOjpJbmRleCwgU2lkZSwgTW9kZSwgTGhzUHJvZHVjdFRyYWl0czo6TmVlZFRvQ29uanVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQoTGhzOjpGbGFncykgJiBSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yPgorICAgICAgOjpydW4oYWN0dWFsTGhzLmNvbHMoKSwgYWN0dWFsTGhzLmRhdGEoKSwgYWN0dWFsTGhzLm91dGVyU3RyaWRlKCksIGFjdHVhbFJocyk7CisKKyAgICBpZighdXNlUmhzRGlyZWN0bHkpCisgICAgICByaHMgPSBNYXBwZWRSaHMoYWN0dWFsUmhzLCByaHMuc2l6ZSgpKTsKKyAgfQorfTsKKworLy8gdGhlIHJocyBpcyBhIG1hdHJpeAordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBTaWRlLCBpbnQgTW9kZT4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlcl9zZWxlY3RvcjxMaHMsUmhzLFNpZGUsTW9kZSxOb1Vucm9sbGluZyxEeW5hbWljPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OkluZGV4IEluZGV4OworICB0eXBlZGVmIGJsYXNfdHJhaXRzPExocz4gTGhzUHJvZHVjdFRyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHNQcm9kdWN0VHJhaXRzOjpEaXJlY3RMaW5lYXJBY2Nlc3NUeXBlIEFjdHVhbExoc1R5cGU7CisKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBSaHMmIHJocykKKyAgeworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxMaHNUeXBlPjo6dHlwZSBhY3R1YWxMaHMgPSBMaHNQcm9kdWN0VHJhaXRzOjpleHRyYWN0KGxocyk7CisKKyAgICBjb25zdCBJbmRleCBzaXplID0gbGhzLnJvd3MoKTsKKyAgICBjb25zdCBJbmRleCBvdGhlcnNpemUgPSBTaWRlPT1PblRoZUxlZnQ/IHJocy5jb2xzKCkgOiByaHMucm93cygpOworCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTwoUmhzOjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLFNjYWxhcixTY2FsYXIsCisgICAgICAgICAgICAgIFJoczo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIFJoczo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsIExoczo6TWF4Um93c0F0Q29tcGlsZVRpbWUsND4gQmxvY2tpbmdUeXBlOworCisgICAgQmxvY2tpbmdUeXBlIGJsb2NraW5nKHJocy5yb3dzKCksIHJocy5jb2xzKCksIHNpemUpOworCisgICAgdHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLEluZGV4LFNpZGUsTW9kZSxMaHNQcm9kdWN0VHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsKGludChMaHM6OkZsYWdzKSAmIFJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJoczo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvcj4KKyAgICAgIDo6cnVuKHNpemUsIG90aGVyc2l6ZSwgJmFjdHVhbExocy5jb2VmZlJlZigwLDApLCBhY3R1YWxMaHMub3V0ZXJTdHJpZGUoKSwgJnJocy5jb2VmZlJlZigwLDApLCByaHMub3V0ZXJTdHJpZGUoKSwgYmxvY2tpbmcpOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1ldGEtdW5yb2xsaW5nIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTW9kZSwgaW50IEluZGV4LCBpbnQgU2l6ZSwKKyAgICAgICAgIGJvb2wgU3RvcCA9IEluZGV4PT1TaXplPgorc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVyX3Vucm9sbGVyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE1vZGUsIGludCBJbmRleCwgaW50IFNpemU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZXJfdW5yb2xsZXI8TGhzLFJocyxNb2RlLEluZGV4LFNpemUsZmFsc2U+IHsKKyAgZW51bSB7CisgICAgSXNMb3dlciA9ICgoTW9kZSZMb3dlcik9PUxvd2VyKSwKKyAgICBJID0gSXNMb3dlciA/IEluZGV4IDogU2l6ZSAtIEluZGV4IC0gMSwKKyAgICBTID0gSXNMb3dlciA/IDAgICAgIDogSSsxCisgIH07CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgUmhzJiByaHMpCisgIHsKKyAgICBpZiAoSW5kZXg+MCkKKyAgICAgIHJocy5jb2VmZlJlZihJKSAtPSBsaHMucm93KEkpLnRlbXBsYXRlIHNlZ21lbnQ8SW5kZXg+KFMpLnRyYW5zcG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmN3aXNlUHJvZHVjdChyaHMudGVtcGxhdGUgc2VnbWVudDxJbmRleD4oUykpLnN1bSgpOworCisgICAgaWYoIShNb2RlICYgVW5pdERpYWcpKQorICAgICAgcmhzLmNvZWZmUmVmKEkpIC89IGxocy5jb2VmZihJLEkpOworCisgICAgdHJpYW5ndWxhcl9zb2x2ZXJfdW5yb2xsZXI8TGhzLFJocyxNb2RlLEluZGV4KzEsU2l6ZT46OnJ1bihsaHMscmhzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlLCBpbnQgSW5kZXgsIGludCBTaXplPgorc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVyX3Vucm9sbGVyPExocyxSaHMsTW9kZSxJbmRleCxTaXplLHRydWU+IHsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYsIFJocyYpIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE1vZGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZXJfc2VsZWN0b3I8TGhzLFJocyxPblRoZUxlZnQsTW9kZSxDb21wbGV0ZVVucm9sbGluZywxPiB7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgUmhzJiByaHMpCisgIHsgdHJpYW5ndWxhcl9zb2x2ZXJfdW5yb2xsZXI8TGhzLFJocyxNb2RlLDAsUmhzOjpTaXplQXRDb21waWxlVGltZT46OnJ1bihsaHMscmhzKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlPgorc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVyX3NlbGVjdG9yPExocyxSaHMsT25UaGVSaWdodCxNb2RlLENvbXBsZXRlVW5yb2xsaW5nLDE+IHsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBSaHMmIHJocykKKyAgeworICAgIFRyYW5zcG9zZTxjb25zdCBMaHM+IHRyTGhzKGxocyk7CisgICAgVHJhbnNwb3NlPFJocz4gdHJSaHMocmhzKTsKKyAgICAKKyAgICB0cmlhbmd1bGFyX3NvbHZlcl91bnJvbGxlcjxUcmFuc3Bvc2U8Y29uc3QgTGhzPixUcmFuc3Bvc2U8UmhzPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTW9kZSZVcHBlcik9PVVwcGVyID8gTG93ZXIgOiBVcHBlcikgfCAoTW9kZSZVbml0RGlhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFJoczo6U2l6ZUF0Q29tcGlsZVRpbWU+OjpydW4odHJMaHMsdHJSaHMpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUcmlhbmd1bGFyVmlldyBtZXRob2RzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiAiaW4tcGxhY2UiIHZlcnNpb24gb2YgVHJpYW5ndWxhclZpZXc6OnNvbHZlKCkgd2hlcmUgdGhlIHJlc3VsdCBpcyB3cml0dGVuIGluIFxhIG90aGVyCisgICoKKyAgKiBcd2FybmluZyBUaGUgcGFyYW1ldGVyIGlzIG9ubHkgbWFya2VkICdjb25zdCcgdG8gbWFrZSB0aGUgQysrIGNvbXBpbGVyIGFjY2VwdCBhIHRlbXBvcmFyeSBleHByZXNzaW9uIGhlcmUuCisgICogVGhpcyBmdW5jdGlvbiB3aWxsIGNvbnN0X2Nhc3QgaXQsIHNvIGNvbnN0bmVzcyBpc24ndCBob25vcmVkIGhlcmUuCisgICoKKyAgKiBTZWUgVHJpYW5ndWxhclZpZXc6c29sdmUoKSBmb3IgdGhlIGRldGFpbHMuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgTW9kZT4KK3RlbXBsYXRlPGludCBTaWRlLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Cit2b2lkIFRyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsTW9kZT46OnNvbHZlSW5QbGFjZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIF9vdGhlcikgY29uc3QKK3sKKyAgT3RoZXJEZXJpdmVkJiBvdGhlciA9IF9vdGhlci5jb25zdF9jYXN0X2Rlcml2ZWQoKTsKKyAgZWlnZW5fYXNzZXJ0KCBjb2xzKCkgPT0gcm93cygpICYmICgoU2lkZT09T25UaGVMZWZ0ICYmIGNvbHMoKSA9PSBvdGhlci5yb3dzKCkpIHx8IChTaWRlPT1PblRoZVJpZ2h0ICYmIGNvbHMoKSA9PSBvdGhlci5jb2xzKCkpKSApOworICBlaWdlbl9hc3NlcnQoKCEoTW9kZSAmIFplcm9EaWFnKSkgJiYgYm9vbChNb2RlICYgKFVwcGVyfExvd2VyKSkpOworCisgIGVudW0geyBjb3B5ID0gaW50ZXJuYWw6OnRyYWl0czxPdGhlckRlcml2ZWQ+OjpGbGFncyAmIFJvd01ham9yQml0ICAmJiBPdGhlckRlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSB9OworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxjb3B5LAorICAgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZV9jb2x1bW5fbWFqb3I8T3RoZXJEZXJpdmVkPjo6dHlwZSwgT3RoZXJEZXJpdmVkJj46OnR5cGUgT3RoZXJDb3B5OworICBPdGhlckNvcHkgb3RoZXJDb3B5KG90aGVyKTsKKworICBpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZXJfc2VsZWN0b3I8TWF0cml4VHlwZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9yZWZlcmVuY2U8T3RoZXJDb3B5Pjo6dHlwZSwKKyAgICBTaWRlLCBNb2RlPjo6cnVuKG5lc3RlZEV4cHJlc3Npb24oKSwgb3RoZXJDb3B5KTsKKworICBpZiAoY29weSkKKyAgICBvdGhlciA9IG90aGVyQ29weTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSBpbnZlcnNlIG9mIFxjICp0aGlzIHdpdGggXGEgb3RoZXIsIFxhICp0aGlzIGJlaW5nIHRyaWFuZ3VsYXIuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBpbnZlcnNlLW1hdHJpeCBtYXRyaXggcHJvZHVjdCBpbnZlcnNlKFxjICp0aGlzKSAqIFxhIG90aGVyIGlmCisgICogXGEgU2lkZT09T25UaGVMZWZ0ICh0aGUgZGVmYXVsdCksIG9yIHRoZSByaWdodC1pbnZlcnNlLW11bHRpcGx5ICBcYSBvdGhlciAqIGludmVyc2UoXGMgKnRoaXMpIGlmCisgICogXGEgU2lkZT09T25UaGVSaWdodC4KKyAgKgorICAqIFRoZSBtYXRyaXggXGMgKnRoaXMgbXVzdCBiZSB0cmlhbmd1bGFyIGFuZCBpbnZlcnRpYmxlIChpLmUuLCBhbGwgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUKKyAgKiBkaWFnb25hbCBtdXN0IGJlIG5vbiB6ZXJvKS4gSXQgd29ya3MgYXMgYSBmb3J3YXJkIChyZXNwLiBiYWNrd2FyZCkgc3Vic3RpdHV0aW9uIGlmIFxjICp0aGlzCisgICogaXMgYW4gdXBwZXIgKHJlc3AuIGxvd2VyKSB0cmlhbmd1bGFyIG1hdHJpeC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfbWFya2VkLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfbWFya2VkLm91dAorICAqCisgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGludmVyc2UtbXVsdGlwbHkgYW5kIGNhbiB3b3JrcyBpbi1wbGFjZSBpZiBpdCBpcyBhc3NpZ25lZAorICAqIHRvIHRoZSBzYW1lIG1hdHJpeCBvciB2ZWN0b3IgXGEgb3RoZXIuCisgICoKKyAgKiBGb3IgdXNlcnMgY29taW5nIGZyb20gQkxBUywgdGhpcyBmdW5jdGlvbiAoYW5kIG1vcmUgc3BlY2lmaWNhbGx5IHNvbHZlSW5QbGFjZSgpKSBvZmZlcgorICAqIGFsbCB0aGUgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIFxjICpUUlNWIGFuZCBcYyAqVFJTTSBCTEFTIHJvdXRpbmVzLgorICAqCisgICogXHNhIFRyaWFuZ3VsYXJWaWV3Ojpzb2x2ZUluUGxhY2UoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdW5zaWduZWQgaW50IE1vZGU+Cit0ZW1wbGF0ZTxpbnQgU2lkZSwgdHlwZW5hbWUgT3RoZXI+Citjb25zdCBpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9yZXR2YWw8U2lkZSxUcmlhbmd1bGFyVmlldzxEZXJpdmVkLE1vZGU+LE90aGVyPgorVHJpYW5ndWxhclZpZXc8RGVyaXZlZCxNb2RlPjo6c29sdmUoY29uc3QgTWF0cml4QmFzZTxPdGhlcj4mIG90aGVyKSBjb25zdAoreworICByZXR1cm4gaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfcmV0dmFsPFNpZGUsVHJpYW5ndWxhclZpZXcsT3RoZXI+KCp0aGlzLCBvdGhlci5kZXJpdmVkKCkpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisKK3RlbXBsYXRlPGludCBTaWRlLCB0eXBlbmFtZSBUcmlhbmd1bGFyVHlwZSwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czx0cmlhbmd1bGFyX3NvbHZlX3JldHZhbDxTaWRlLCBUcmlhbmd1bGFyVHlwZSwgUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlX2NvbHVtbl9tYWpvcjxSaHM+Ojp0eXBlIFJldHVyblR5cGU7Cit9OworCit0ZW1wbGF0ZTxpbnQgU2lkZSwgdHlwZW5hbWUgVHJpYW5ndWxhclR5cGUsIHR5cGVuYW1lIFJocz4gc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVfcmV0dmFsCisgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTx0cmlhbmd1bGFyX3NvbHZlX3JldHZhbDxTaWRlLCBUcmlhbmd1bGFyVHlwZSwgUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBSaHM6Ok5lc3RlZD46OnR5cGUgUmhzTmVzdGVkQ2xlYW5lZDsKKyAgdHlwZWRlZiBSZXR1cm5CeVZhbHVlPHRyaWFuZ3VsYXJfc29sdmVfcmV0dmFsPiBCYXNlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkluZGV4IEluZGV4OworCisgIHRyaWFuZ3VsYXJfc29sdmVfcmV0dmFsKGNvbnN0IFRyaWFuZ3VsYXJUeXBlJiB0cmksIGNvbnN0IFJocyYgcmhzKQorICAgIDogbV90cmlhbmd1bGFyTWF0cml4KHRyaSksIG1fcmhzKHJocykKKyAge30KKworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzLnJvd3MoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzLmNvbHMoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBpZighKGlzX3NhbWU8UmhzTmVzdGVkQ2xlYW5lZCxEZXN0Pjo6dmFsdWUgJiYgZXh0cmFjdF9kYXRhKGRzdCkgPT0gZXh0cmFjdF9kYXRhKG1fcmhzKSkpCisgICAgICBkc3QgPSBtX3JoczsKKyAgICBtX3RyaWFuZ3VsYXJNYXRyaXgudGVtcGxhdGUgc29sdmVJblBsYWNlPFNpZGU+KGRzdCk7CisgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgVHJpYW5ndWxhclR5cGUmIG1fdHJpYW5ndWxhck1hdHJpeDsKKyAgICB0eXBlbmFtZSBSaHM6Ok5lc3RlZCBtX3JoczsKK307CisKK30gLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU09MVkVUUklBTkdVTEFSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1N0YWJsZU5vcm0uaCBiL0VpZ2VuL3NyYy9Db3JlL1N0YWJsZU5vcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJmN2RiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvU3RhYmxlTm9ybS5oCkBAIC0wLDAgKzEsMTc5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1RBQkxFTk9STV9ICisjZGVmaW5lIEVJR0VOX1NUQUJMRU5PUk1fSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgdm9pZCBzdGFibGVfbm9ybV9rZXJuZWwoY29uc3QgRXhwcmVzc2lvblR5cGUmIGJsLCBTY2FsYXImIHNzcSwgU2NhbGFyJiBzY2FsZSwgU2NhbGFyJiBpbnZTY2FsZSkKK3sKKyAgU2NhbGFyIG1heCA9IGJsLmN3aXNlQWJzKCkubWF4Q29lZmYoKTsKKyAgaWYgKG1heD5zY2FsZSkKKyAgeworICAgIHNzcSA9IHNzcSAqIGFiczIoc2NhbGUvbWF4KTsKKyAgICBzY2FsZSA9IG1heDsKKyAgICBpbnZTY2FsZSA9IFNjYWxhcigxKS9zY2FsZTsKKyAgfQorICAvLyBUT0RPIGlmIHRoZSBtYXggaXMgbXVjaCBtdWNoIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBzY2FsZSwKKyAgLy8gdGhlbiB3ZSBjYW4gbmVnbGVjdCB0aGlzIHN1YiB2ZWN0b3IKKyAgc3NxICs9IChibCppbnZTY2FsZSkuc3F1YXJlZE5vcm0oKTsKK30KK30KKworLyoqIFxyZXR1cm5zIHRoZSBcZW0gbDIgbm9ybSBvZiBcYyAqdGhpcyBhdm9pZGluZyB1bmRlcmZsb3cgYW5kIG92ZXJmbG93LgorICAqIFRoaXMgdmVyc2lvbiB1c2UgYSBibG9ja3dpc2UgdHdvIHBhc3NlcyBhbGdvcml0aG06CisgICogIDEgLSBmaW5kIHRoZSBhYnNvbHV0ZSBsYXJnZXN0IGNvZWZmaWNpZW50IFxjIHMKKyAgKiAgMiAtIGNvbXB1dGUgXGYkIHMgXFZlcnQgXGZyYWN7KnRoaXN9e3N9IFxWZXJ0IFxmJCBpbiBhIHN0YW5kYXJkIHdheQorICAqCisgICogRm9yIGFyY2hpdGVjdHVyZS9zY2FsYXIgdHlwZXMgc3VwcG9ydGluZyB2ZWN0b3JpemF0aW9uLCB0aGlzIHZlcnNpb24KKyAgKiBpcyBmYXN0ZXIgdGhhbiBibHVlTm9ybSgpLiBPdGhlcndpc2UgdGhlIGJsdWVOb3JtKCkgaXMgbXVjaCBmYXN0ZXIuCisgICoKKyAgKiBcc2Egbm9ybSgpLCBibHVlTm9ybSgpLCBoeXBvdE5vcm0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbAorTWF0cml4QmFzZTxEZXJpdmVkPjo6c3RhYmxlTm9ybSgpIGNvbnN0Cit7CisgIHVzaW5nIHN0ZDo6bWluOworICBjb25zdCBJbmRleCBibG9ja1NpemUgPSA0MDk2OworICBSZWFsU2NhbGFyIHNjYWxlKDApOworICBSZWFsU2NhbGFyIGludlNjYWxlKDEpOworICBSZWFsU2NhbGFyIHNzcSgwKTsgLy8gc3VtIG9mIHNxdWFyZQorICBlbnVtIHsKKyAgICBBbGlnbm1lbnQgPSAoaW50KEZsYWdzKSZEaXJlY3RBY2Nlc3NCaXQpIHx8IChpbnQoRmxhZ3MpJkFsaWduZWRCaXQpID8gMSA6IDAKKyAgfTsKKyAgSW5kZXggbiA9IHNpemUoKTsKKyAgSW5kZXggYmkgPSBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZChkZXJpdmVkKCkpOworICBpZiAoYmk+MCkKKyAgICBpbnRlcm5hbDo6c3RhYmxlX25vcm1fa2VybmVsKHRoaXMtPmhlYWQoYmkpLCBzc3EsIHNjYWxlLCBpbnZTY2FsZSk7CisgIGZvciAoOyBiaTxuOyBiaSs9YmxvY2tTaXplKQorICAgIGludGVybmFsOjpzdGFibGVfbm9ybV9rZXJuZWwodGhpcy0+c2VnbWVudChiaSwobWluKShibG9ja1NpemUsIG4gLSBiaSkpLnRlbXBsYXRlIGZvcmNlQWxpZ25lZEFjY2Vzc0lmPEFsaWdubWVudD4oKSwgc3NxLCBzY2FsZSwgaW52U2NhbGUpOworICByZXR1cm4gc2NhbGUgKiBpbnRlcm5hbDo6c3FydChzc3EpOworfQorCisvKiogXHJldHVybnMgdGhlIFxlbSBsMiBub3JtIG9mIFxjICp0aGlzIHVzaW5nIHRoZSBCbHVlJ3MgYWxnb3JpdGhtLgorICAqIEEgUG9ydGFibGUgRm9ydHJhbiBQcm9ncmFtIHRvIEZpbmQgdGhlIEV1Y2xpZGVhbiBOb3JtIG9mIGEgVmVjdG9yLAorICAqIEFDTSBUT01TLCBWb2wgNCwgSXNzdWUgMSwgMTk3OC4KKyAgKgorICAqIEZvciBhcmNoaXRlY3R1cmUvc2NhbGFyIHR5cGVzIHdpdGhvdXQgdmVjdG9yaXphdGlvbiwgdGhpcyB2ZXJzaW9uCisgICogaXMgbXVjaCBmYXN0ZXIgdGhhbiBzdGFibGVOb3JtKCkuIE90aGVyd2lzZSB0aGUgc3RhYmxlTm9ybSgpIGlzIGZhc3Rlci4KKyAgKgorICAqIFxzYSBub3JtKCksIHN0YWJsZU5vcm0oKSwgaHlwb3ROb3JtKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj46OlJlYWwKK01hdHJpeEJhc2U8RGVyaXZlZD46OmJsdWVOb3JtKCkgY29uc3QKK3sKKyAgdXNpbmcgc3RkOjpwb3c7CisgIHVzaW5nIHN0ZDo6bWluOworICB1c2luZyBzdGQ6Om1heDsKKyAgc3RhdGljIEluZGV4IG5tYXggPSAtMTsKKyAgc3RhdGljIFJlYWxTY2FsYXIgYjEsIGIyLCBzMW0sIHMybSwgb3ZlcmZsLCByYmlnLCByZWxlcnI7CisgIGlmKG5tYXggPD0gMCkKKyAgeworICAgIGludCBuYmlnLCBpYmV0YSwgaXQsIGllbWluLCBpZW1heCwgaWV4cDsKKyAgICBSZWFsU2NhbGFyIGFiaWcsIGVwczsKKyAgICAvLyBUaGlzIHByb2dyYW0gY2FsY3VsYXRlcyB0aGUgbWFjaGluZS1kZXBlbmRlbnQgY29uc3RhbnRzCisgICAgLy8gYmwsIGIyLCBzbG0sIHMybSwgcmVsZXJyIG92ZXJmbCwgbm1heAorICAgIC8vIGZyb20gdGhlICJiYXNpYyIgbWFjaGluZS1kZXBlbmRlbnQgbnVtYmVycworICAgIC8vIG5iaWcsIGliZXRhLCBpdCwgaWVtaW4sIGllbWF4LCByYmlnLgorICAgIC8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBiYXNpYyBtYWNoaW5lLWRlcGVuZGVudCBjb25zdGFudHMuCisgICAgLy8gRm9yIHBvcnRhYmlsaXR5LCB0aGUgUE9SVCBzdWJwcm9ncmFtcyAiaWxtYWVoIiBhbmQgInJsbWFjaCIKKyAgICAvLyBhcmUgdXNlZC4gRm9yIGFueSBzcGVjaWZpYyBjb21wdXRlciwgZWFjaCBvZiB0aGUgYXNzaWdubWVudAorICAgIC8vIHN0YXRlbWVudHMgY2FuIGJlIHJlcGxhY2VkCisgICAgbmJpZyAgPSAoc3RkOjpudW1lcmljX2xpbWl0czxJbmRleD46Om1heCkoKTsgICAgICAgICAgICAvLyBsYXJnZXN0IGludGVnZXIKKyAgICBpYmV0YSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OnJhZGl4OyAgICAgICAgIC8vIGJhc2UgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMKKyAgICBpdCAgICA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmRpZ2l0czsgICAgICAgIC8vIG51bWJlciBvZiBiYXNlLWJldGEgZGlnaXRzIGluIG1hbnRpc3NhCisgICAgaWVtaW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW5fZXhwb25lbnQ7ICAvLyBtaW5pbXVtIGV4cG9uZW50CisgICAgaWVtYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptYXhfZXhwb25lbnQ7ICAvLyBtYXhpbXVtIGV4cG9uZW50CisgICAgcmJpZyAgPSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWF4KSgpOyAgICAgICAgIC8vIGxhcmdlc3QgZmxvYXRpbmctcG9pbnQgbnVtYmVyCisKKyAgICBpZXhwICA9IC0oKDEtaWVtaW4pLzIpOworICAgIGIxICAgID0gUmVhbFNjYWxhcihwb3coUmVhbFNjYWxhcihpYmV0YSksUmVhbFNjYWxhcihpZXhwKSkpOyAgLy8gbG93ZXIgYm91bmRhcnkgb2YgbWlkcmFuZ2UKKyAgICBpZXhwICA9IChpZW1heCArIDEgLSBpdCkvMjsKKyAgICBiMiAgICA9IFJlYWxTY2FsYXIocG93KFJlYWxTY2FsYXIoaWJldGEpLFJlYWxTY2FsYXIoaWV4cCkpKTsgICAvLyB1cHBlciBib3VuZGFyeSBvZiBtaWRyYW5nZQorCisgICAgaWV4cCAgPSAoMi1pZW1pbikvMjsKKyAgICBzMW0gICA9IFJlYWxTY2FsYXIocG93KFJlYWxTY2FsYXIoaWJldGEpLFJlYWxTY2FsYXIoaWV4cCkpKTsgICAvLyBzY2FsaW5nIGZhY3RvciBmb3IgbG93ZXIgcmFuZ2UKKyAgICBpZXhwICA9IC0gKChpZW1heCtpdCkvMik7CisgICAgczJtICAgPSBSZWFsU2NhbGFyKHBvdyhSZWFsU2NhbGFyKGliZXRhKSxSZWFsU2NhbGFyKGlleHApKSk7ICAgLy8gc2NhbGluZyBmYWN0b3IgZm9yIHVwcGVyIHJhbmdlCisKKyAgICBvdmVyZmwgID0gcmJpZypzMm07ICAgICAgICAgICAgIC8vIG92ZXJmbG93IGJvdW5kYXJ5IGZvciBhYmlnCisgICAgZXBzICAgICA9IFJlYWxTY2FsYXIocG93KGRvdWJsZShpYmV0YSksIDEtaXQpKTsKKyAgICByZWxlcnIgID0gaW50ZXJuYWw6OnNxcnQoZXBzKTsgICAgICAgICAvLyB0b2xlcmFuY2UgZm9yIG5lZ2xlY3RpbmcgYXNtbAorICAgIGFiaWcgICAgPSBSZWFsU2NhbGFyKDEuMC9lcHMgLSAxLjApOworICAgIGlmIChSZWFsU2NhbGFyKG5iaWcpPmFiaWcpICBubWF4ID0gaW50KGFiaWcpOyAgLy8gbGFyZ2VzdCBzYWZlIG4KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgbm1heCA9IG5iaWc7CisgIH0KKyAgSW5kZXggbiA9IHNpemUoKTsKKyAgUmVhbFNjYWxhciBhYjIgPSBiMiAvIFJlYWxTY2FsYXIobik7CisgIFJlYWxTY2FsYXIgYXNtbCA9IFJlYWxTY2FsYXIoMCk7CisgIFJlYWxTY2FsYXIgYW1lZCA9IFJlYWxTY2FsYXIoMCk7CisgIFJlYWxTY2FsYXIgYWJpZyA9IFJlYWxTY2FsYXIoMCk7CisgIGZvcihJbmRleCBqPTA7IGo8bjsgKytqKQorICB7CisgICAgUmVhbFNjYWxhciBheCA9IGludGVybmFsOjphYnMoY29lZmYoaikpOworICAgIGlmKGF4ID4gYWIyKSAgICAgYWJpZyArPSBpbnRlcm5hbDo6YWJzMihheCpzMm0pOworICAgIGVsc2UgaWYoYXggPCBiMSkgYXNtbCArPSBpbnRlcm5hbDo6YWJzMihheCpzMW0pOworICAgIGVsc2UgICAgICAgICAgICAgYW1lZCArPSBpbnRlcm5hbDo6YWJzMihheCk7CisgIH0KKyAgaWYoYWJpZyA+IFJlYWxTY2FsYXIoMCkpCisgIHsKKyAgICBhYmlnID0gaW50ZXJuYWw6OnNxcnQoYWJpZyk7CisgICAgaWYoYWJpZyA+IG92ZXJmbCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgIm92ZXJmbG93Iik7CisgICAgICByZXR1cm4gcmJpZzsKKyAgICB9CisgICAgaWYoYW1lZCA+IFJlYWxTY2FsYXIoMCkpCisgICAgeworICAgICAgYWJpZyA9IGFiaWcvczJtOworICAgICAgYW1lZCA9IGludGVybmFsOjpzcXJ0KGFtZWQpOworICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gYWJpZy9zMm07CisgIH0KKyAgZWxzZSBpZihhc21sID4gUmVhbFNjYWxhcigwKSkKKyAgeworICAgIGlmIChhbWVkID4gUmVhbFNjYWxhcigwKSkKKyAgICB7CisgICAgICBhYmlnID0gaW50ZXJuYWw6OnNxcnQoYW1lZCk7CisgICAgICBhbWVkID0gaW50ZXJuYWw6OnNxcnQoYXNtbCkgLyBzMW07CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6c3FydChhc21sKS9zMW07CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBpbnRlcm5hbDo6c3FydChhbWVkKTsKKyAgYXNtbCA9IChtaW4pKGFiaWcsIGFtZWQpOworICBhYmlnID0gKG1heCkoYWJpZywgYW1lZCk7CisgIGlmKGFzbWwgPD0gYWJpZypyZWxlcnIpCisgICAgcmV0dXJuIGFiaWc7CisgIGVsc2UKKyAgICByZXR1cm4gYWJpZyAqIGludGVybmFsOjpzcXJ0KFJlYWxTY2FsYXIoMSkgKyBpbnRlcm5hbDo6YWJzMihhc21sL2FiaWcpKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBcZW0gbDIgbm9ybSBvZiBcYyAqdGhpcyBhdm9pZGluZyB1bmRlZmxvdyBhbmQgb3ZlcmZsb3cuCisgICogVGhpcyB2ZXJzaW9uIHVzZSBhIGNvbmNhdGVuYXRpb24gb2YgaHlwb3QoKSBjYWxscywgYW5kIGl0IGlzIHZlcnkgc2xvdy4KKyAgKgorICAqIFxzYSBub3JtKCksIHN0YWJsZU5vcm0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbAorTWF0cml4QmFzZTxEZXJpdmVkPjo6aHlwb3ROb3JtKCkgY29uc3QKK3sKKyAgcmV0dXJuIHRoaXMtPmN3aXNlQWJzKCkucmVkdXgoaW50ZXJuYWw6OnNjYWxhcl9oeXBvdF9vcDxSZWFsU2NhbGFyPigpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TVEFCTEVOT1JNX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1N0cmlkZS5oIGIvRWlnZW4vc3JjL0NvcmUvU3RyaWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzZjVmZQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1N0cmlkZS5oCkBAIC0wLDAgKzEsMTA4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1RSSURFX0gKKyNkZWZpbmUgRUlHRU5fU1RSSURFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcY2xhc3MgU3RyaWRlCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBIb2xkcyBzdHJpZGVzIGluZm9ybWF0aW9uIGZvciBNYXAKKyAgKgorICAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHN0cmlkZXMgaW5mb3JtYXRpb24gZm9yIG1hcHBpbmcgYXJyYXlzIHdpdGggc3RyaWRlcyB3aXRoIGNsYXNzIE1hcC4KKyAgKgorICAqIEl0IGhvbGRzIHR3byB2YWx1ZXM6IHRoZSBpbm5lciBzdHJpZGUgYW5kIHRoZSBvdXRlciBzdHJpZGUuCisgICoKKyAgKiBUaGUgaW5uZXIgc3RyaWRlIGlzIHRoZSBwb2ludGVyIGluY3JlbWVudCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBlbnRyaWVzIHdpdGhpbiBhIGdpdmVuIHJvdyBvZiBhCisgICogcm93LW1ham9yIG1hdHJpeCBvciB3aXRoaW4gYSBnaXZlbiBjb2x1bW4gb2YgYSBjb2x1bW4tbWFqb3IgbWF0cml4LgorICAqCisgICogVGhlIG91dGVyIHN0cmlkZSBpcyB0aGUgcG9pbnRlciBpbmNyZW1lbnQgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgcm93cyBvZiBhIHJvdy1tYWpvciBtYXRyaXggb3IKKyAgKiBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBjb2x1bW5zIG9mIGEgY29sdW1uLW1ham9yIG1hdHJpeC4KKyAgKgorICAqIFRoZXNlIHR3byB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBlaXRoZXIgYXQgY29tcGlsZS10aW1lIGFzIHRlbXBsYXRlIHBhcmFtZXRlcnMsIG9yIGF0IHJ1bnRpbWUgYXMKKyAgKiBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAqCisgICogSW5kZWVkLCB0aGlzIGNsYXNzIHRha2VzIHR3byB0ZW1wbGF0ZSBwYXJhbWV0ZXJzOgorICAqICBccGFyYW0gX091dGVyU3RyaWRlQXRDb21waWxlVGltZSB0aGUgb3V0ZXIgc3RyaWRlLCBvciBEeW5hbWljIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgaXQgYXQgcnVudGltZS4KKyAgKiAgXHBhcmFtIF9Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgdGhlIGlubmVyIHN0cmlkZSwgb3IgRHluYW1pYyBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGl0IGF0IHJ1bnRpbWUuCisgICoKKyAgKiBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICogXGluY2x1ZGUgTWFwX2dlbmVyYWxfc3RyaWRlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hcF9nZW5lcmFsX3N0cmlkZS5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBJbm5lclN0cmlkZSwgY2xhc3MgT3V0ZXJTdHJpZGUsIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzCisgICovCit0ZW1wbGF0ZTxpbnQgX091dGVyU3RyaWRlQXRDb21waWxlVGltZSwgaW50IF9Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWU+CitjbGFzcyBTdHJpZGUKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKyAgICBlbnVtIHsKKyAgICAgIElubmVyU3RyaWRlQXRDb21waWxlVGltZSA9IF9Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUsCisgICAgICBPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgPSBfT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lCisgICAgfTsKKworICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBmb3IgdXNlIHdoZW4gc3RyaWRlcyBhcmUgZml4ZWQgYXQgY29tcGlsZSB0aW1lICovCisgICAgU3RyaWRlKCkKKyAgICAgIDogbV9vdXRlcihPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpLCBtX2lubmVyKElubmVyU3RyaWRlQXRDb21waWxlVGltZSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMgJiYgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMpOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RvciBhbGxvd2luZyB0byBwYXNzIHRoZSBzdHJpZGVzIGF0IHJ1bnRpbWUgKi8KKyAgICBTdHJpZGUoSW5kZXggb3V0ZXJTdHJpZGUsIEluZGV4IGlubmVyU3RyaWRlKQorICAgICAgOiBtX291dGVyKG91dGVyU3RyaWRlKSwgbV9pbm5lcihpbm5lclN0cmlkZSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaW5uZXJTdHJpZGU+PTAgJiYgb3V0ZXJTdHJpZGU+PTApOworICAgIH0KKworICAgIC8qKiBDb3B5IGNvbnN0cnVjdG9yICovCisgICAgU3RyaWRlKGNvbnN0IFN0cmlkZSYgb3RoZXIpCisgICAgICA6IG1fb3V0ZXIob3RoZXIub3V0ZXIoKSksIG1faW5uZXIob3RoZXIuaW5uZXIoKSkKKyAgICB7fQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBvdXRlciBzdHJpZGUgKi8KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXIoKSBjb25zdCB7IHJldHVybiBtX291dGVyLnZhbHVlKCk7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIGlubmVyIHN0cmlkZSAqLworICAgIGlubGluZSBJbmRleCBpbm5lcigpIGNvbnN0IHsgcmV0dXJuIG1faW5uZXIudmFsdWUoKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lPiBtX291dGVyOworICAgIGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBJbm5lclN0cmlkZUF0Q29tcGlsZVRpbWU+IG1faW5uZXI7Cit9OworCisvKiogXGJyaWVmIENvbnZlbmllbmNlIHNwZWNpYWxpemF0aW9uIG9mIFN0cmlkZSB0byBzcGVjaWZ5IG9ubHkgYW4gaW5uZXIgc3RyaWRlCisgICogU2VlIGNsYXNzIE1hcCBmb3Igc29tZSBleGFtcGxlcyAqLwordGVtcGxhdGU8aW50IFZhbHVlID0gRHluYW1pYz4KK2NsYXNzIElubmVyU3RyaWRlIDogcHVibGljIFN0cmlkZTwwLCBWYWx1ZT4KK3sKKyAgICB0eXBlZGVmIFN0cmlkZTwwLCBWYWx1ZT4gQmFzZTsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKyAgICBJbm5lclN0cmlkZSgpIDogQmFzZSgpIHt9CisgICAgSW5uZXJTdHJpZGUoSW5kZXggdikgOiBCYXNlKDAsIHYpIHt9Cit9OworCisvKiogXGJyaWVmIENvbnZlbmllbmNlIHNwZWNpYWxpemF0aW9uIG9mIFN0cmlkZSB0byBzcGVjaWZ5IG9ubHkgYW4gb3V0ZXIgc3RyaWRlCisgICogU2VlIGNsYXNzIE1hcCBmb3Igc29tZSBleGFtcGxlcyAqLwordGVtcGxhdGU8aW50IFZhbHVlID0gRHluYW1pYz4KK2NsYXNzIE91dGVyU3RyaWRlIDogcHVibGljIFN0cmlkZTxWYWx1ZSwgMD4KK3sKKyAgICB0eXBlZGVmIFN0cmlkZTxWYWx1ZSwgMD4gQmFzZTsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKyAgICBPdXRlclN0cmlkZSgpIDogQmFzZSgpIHt9CisgICAgT3V0ZXJTdHJpZGUoSW5kZXggdikgOiBCYXNlKHYsMCkge30KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1RSSURFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1N3YXAuaCBiL0VpZ2VuL3NyYy9Db3JlL1N3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDczY2YzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvU3dhcC5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TV0FQX0gKKyNkZWZpbmUgRUlHRU5fU1dBUF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGNsYXNzIFN3YXBXcmFwcGVyCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxpbnRlcm5hbAorICAqCisgICogXGJyaWVmIEludGVybmFsIGhlbHBlciBjbGFzcyBmb3Igc3dhcHBpbmcgdHdvIGV4cHJlc3Npb25zCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitzdHJ1Y3QgdHJhaXRzPFN3YXBXcmFwcGVyPEV4cHJlc3Npb25UeXBlPiA+IDogdHJhaXRzPEV4cHJlc3Npb25UeXBlPiB7fTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+IGNsYXNzIFN3YXBXcmFwcGVyCisgIDogcHVibGljIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxTd2FwV3JhcHBlcjxFeHByZXNzaW9uVHlwZT4gPjo6dHlwZQoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxTd2FwV3JhcHBlcj46OnR5cGUgQmFzZTsKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKFN3YXBXcmFwcGVyKQorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisKKyAgICBpbmxpbmUgU3dhcFdyYXBwZXIoRXhwcmVzc2lvblR5cGUmIHhwcikgOiBtX2V4cHJlc3Npb24oeHByKSB7fQorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24ucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24uY29scygpOyB9CisgICAgaW5saW5lIEluZGV4IG91dGVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9leHByZXNzaW9uLm91dGVyU3RyaWRlKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24uaW5uZXJTdHJpZGUoKTsgfQorICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6aXNfbHZhbHVlPEV4cHJlc3Npb25UeXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyCisgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIFNjYWxhcldpdGhDb25zdElmTm90THZhbHVlOworICAgICAgICAgICAgICAgICAgICAgCisgICAgaW5saW5lIFNjYWxhcldpdGhDb25zdElmTm90THZhbHVlKiBkYXRhKCkgeyByZXR1cm4gbV9leHByZXNzaW9uLmRhdGEoKTsgfQorICAgIGlubGluZSBjb25zdCBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb24uZGF0YSgpOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKGluZGV4KTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvZWZmUmVmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9leHByZXNzaW9uLmNvZWZmUmVmKGluZGV4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgdm9pZCBjb3B5Q29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBPdGhlckRlcml2ZWQmIF9vdGhlciA9IG90aGVyLmNvbnN0X2Nhc3RfZGVyaXZlZCgpOworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHJvdyA+PSAwICYmIHJvdyA8IHJvd3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbCA+PSAwICYmIGNvbCA8IGNvbHMoKSk7CisgICAgICBTY2FsYXIgdG1wID0gbV9leHByZXNzaW9uLmNvZWZmKHJvdywgY29sKTsKKyAgICAgIG1fZXhwcmVzc2lvbi5jb2VmZlJlZihyb3csIGNvbCkgPSBfb3RoZXIuY29lZmYocm93LCBjb2wpOworICAgICAgX290aGVyLmNvZWZmUmVmKHJvdywgY29sKSA9IHRtcDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgdm9pZCBjb3B5Q29lZmYoSW5kZXggaW5kZXgsIGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBPdGhlckRlcml2ZWQmIF9vdGhlciA9IG90aGVyLmNvbnN0X2Nhc3RfZGVyaXZlZCgpOworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBtX2V4cHJlc3Npb24uc2l6ZSgpKTsKKyAgICAgIFNjYWxhciB0bXAgPSBtX2V4cHJlc3Npb24uY29lZmYoaW5kZXgpOworICAgICAgbV9leHByZXNzaW9uLmNvZWZmUmVmKGluZGV4KSA9IF9vdGhlci5jb2VmZihpbmRleCk7CisgICAgICBfb3RoZXIuY29lZmZSZWYoaW5kZXgpID0gdG1wOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgaW50IFN0b3JlTW9kZSwgaW50IExvYWRNb2RlPgorICAgIHZvaWQgY29weVBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIE90aGVyRGVyaXZlZCYgX290aGVyID0gb3RoZXIuY29uc3RfY2FzdF9kZXJpdmVkKCk7CisgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQocm93ID49IDAgJiYgcm93IDwgcm93cygpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2wgPj0gMCAmJiBjb2wgPCBjb2xzKCkpOworICAgICAgUGFja2V0IHRtcCA9IG1fZXhwcmVzc2lvbi50ZW1wbGF0ZSBwYWNrZXQ8U3RvcmVNb2RlPihyb3csIGNvbCk7CisgICAgICBtX2V4cHJlc3Npb24udGVtcGxhdGUgd3JpdGVQYWNrZXQ8U3RvcmVNb2RlPihyb3csIGNvbCwKKyAgICAgICAgX290aGVyLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4ocm93LCBjb2wpCisgICAgICApOworICAgICAgX290aGVyLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihyb3csIGNvbCwgdG1wKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQsIGludCBTdG9yZU1vZGUsIGludCBMb2FkTW9kZT4KKyAgICB2b2lkIGNvcHlQYWNrZXQoSW5kZXggaW5kZXgsIGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBPdGhlckRlcml2ZWQmIF9vdGhlciA9IG90aGVyLmNvbnN0X2Nhc3RfZGVyaXZlZCgpOworICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBtX2V4cHJlc3Npb24uc2l6ZSgpKTsKKyAgICAgIFBhY2tldCB0bXAgPSBtX2V4cHJlc3Npb24udGVtcGxhdGUgcGFja2V0PFN0b3JlTW9kZT4oaW5kZXgpOworICAgICAgbV9leHByZXNzaW9uLnRlbXBsYXRlIHdyaXRlUGFja2V0PFN0b3JlTW9kZT4oaW5kZXgsCisgICAgICAgIF9vdGhlci50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4KQorICAgICAgKTsKKyAgICAgIF9vdGhlci50ZW1wbGF0ZSB3cml0ZVBhY2tldDxMb2FkTW9kZT4oaW5kZXgsIHRtcCk7CisgICAgfQorCisgICAgRXhwcmVzc2lvblR5cGUmIGV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX2V4cHJlc3Npb247IH0KKworICBwcm90ZWN0ZWQ6CisgICAgRXhwcmVzc2lvblR5cGUmIG1fZXhwcmVzc2lvbjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1dBUF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9UcmFuc3Bvc2UuaCBiL0VpZ2VuL3NyYy9Db3JlL1RyYW5zcG9zZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWExY2MKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9UcmFuc3Bvc2UuaApAQCAtMCwwICsxLDQxNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UUkFOU1BPU0VfSAorI2RlZmluZSBFSUdFTl9UUkFOU1BPU0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxjbGFzcyBUcmFuc3Bvc2UKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gb2YgdGhlIHRyYW5zcG9zZSBvZiBhIG1hdHJpeAorICAqCisgICogXHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBvZiB3aGljaCB3ZSBhcmUgdGFraW5nIHRoZSB0cmFuc3Bvc2UKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIHRoZSB0cmFuc3Bvc2Ugb2YgYSBtYXRyaXguCisgICogSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OnRyYW5zcG9zZSgpIGFuZCBNYXRyaXhCYXNlOjphZGpvaW50KCkKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OnRyYW5zcG9zZSgpLCBNYXRyaXhCYXNlOjphZGpvaW50KCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgdHJhaXRzPFRyYW5zcG9zZTxNYXRyaXhUeXBlPiA+IDogdHJhaXRzPE1hdHJpeFR5cGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWQ8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWRQbGFpbjsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6WHByS2luZCBYcHJLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIEZsYWdzTHZhbHVlQml0ID0gaXNfbHZhbHVlPE1hdHJpeFR5cGU+Ojp2YWx1ZSA/IEx2YWx1ZUJpdCA6IDAsCisgICAgRmxhZ3MwID0gTWF0cml4VHlwZU5lc3RlZFBsYWluOjpGbGFncyAmIH4oTHZhbHVlQml0IHwgTmVzdEJ5UmVmQml0KSwKKyAgICBGbGFnczEgPSBGbGFnczAgfCBGbGFnc0x2YWx1ZUJpdCwKKyAgICBGbGFncyA9IEZsYWdzMSBeIFJvd01ham9yQml0LAorICAgIENvZWZmUmVhZENvc3QgPSBNYXRyaXhUeXBlTmVzdGVkUGxhaW46OkNvZWZmUmVhZENvc3QsCisgICAgSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gaW5uZXJfc3RyaWRlX2F0X2NvbXBpbGVfdGltZTxNYXRyaXhUeXBlPjo6cmV0LAorICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IG91dGVyX3N0cmlkZV9hdF9jb21waWxlX3RpbWU8TWF0cml4VHlwZT46OnJldAorICB9OworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgU3RvcmFnZUtpbmQ+IGNsYXNzIFRyYW5zcG9zZUltcGw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIFRyYW5zcG9zZQorICA6IHB1YmxpYyBUcmFuc3Bvc2VJbXBsPE1hdHJpeFR5cGUsdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U3RvcmFnZUtpbmQ+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNwb3NlSW1wbDxNYXRyaXhUeXBlLHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlN0b3JhZ2VLaW5kPjo6QmFzZSBCYXNlOworICAgIEVJR0VOX0dFTkVSSUNfUFVCTElDX0lOVEVSRkFDRShUcmFuc3Bvc2UpCisKKyAgICBpbmxpbmUgVHJhbnNwb3NlKE1hdHJpeFR5cGUmIG1hdHJpeCkgOiBtX21hdHJpeChtYXRyaXgpIHt9CisKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKFRyYW5zcG9zZSkKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguY29scygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbmVzdGVkIGV4cHJlc3Npb24gKi8KKyAgICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlJgorICAgIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX21hdHJpeDsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbiAqLworICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZD46OnR5cGUmCisgICAgbmVzdGVkRXhwcmVzc2lvbigpIHsgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBtX21hdHJpeDsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGJvb2wgSGFzRGlyZWN0QWNjZXNzID0gaGFzX2RpcmVjdF9hY2Nlc3M8TWF0cml4VHlwZT46OnJldD4KK3N0cnVjdCBUcmFuc3Bvc2VJbXBsX2Jhc2UKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBkZW5zZV94cHJfYmFzZTxUcmFuc3Bvc2U8TWF0cml4VHlwZT4gPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBUcmFuc3Bvc2VJbXBsX2Jhc2U8TWF0cml4VHlwZSwgZmFsc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgZGVuc2VfeHByX2Jhc2U8VHJhbnNwb3NlPE1hdHJpeFR5cGU+ID46OnR5cGUgdHlwZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBUcmFuc3Bvc2VJbXBsPE1hdHJpeFR5cGUsRGVuc2U+CisgIDogcHVibGljIGludGVybmFsOjpUcmFuc3Bvc2VJbXBsX2Jhc2U8TWF0cml4VHlwZT46OnR5cGUKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6VHJhbnNwb3NlSW1wbF9iYXNlPE1hdHJpeFR5cGU+Ojp0eXBlIEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShUcmFuc3Bvc2U8TWF0cml4VHlwZT4pCisKKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmlubmVyU3RyaWRlKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLm91dGVyU3RyaWRlKCk7IH0KKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6aXNfbHZhbHVlPE1hdHJpeFR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXIKKyAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgU2NhbGFyV2l0aENvbnN0SWZOb3RMdmFsdWU7CisKKyAgICBpbmxpbmUgU2NhbGFyV2l0aENvbnN0SWZOb3RMdmFsdWUqIGRhdGEoKSB7IHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmRhdGEoKTsgfQorICAgIGlubGluZSBjb25zdCBTY2FsYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmRhdGEoKTsgfQorCisgICAgaW5saW5lIFNjYWxhcldpdGhDb25zdElmTm90THZhbHVlJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShNYXRyaXhUeXBlKQorICAgICAgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYoY29sLCByb3cpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXJXaXRoQ29uc3RJZk5vdEx2YWx1ZSYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9MVkFMVUUoTWF0cml4VHlwZSkKKyAgICAgIHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKGluZGV4KTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKS5jb2VmZlJlZihjb2wsIHJvdyk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuY29lZmZSZWYoaW5kZXgpOworICAgIH0KKworICAgIGlubGluZSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuY29lZmYoY29sLCByb3cpOworICAgIH0KKworICAgIGlubGluZSBDb2VmZlJldHVyblR5cGUgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuY29lZmYoaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgY29uc3QgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKS50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGNvbCwgcm93KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxpbnQgTG9hZE1vZGU+CisgICAgaW5saW5lIHZvaWQgd3JpdGVQYWNrZXQoSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IFBhY2tldFNjYWxhciYgeCkKKyAgICB7CisgICAgICBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLnRlbXBsYXRlIHdyaXRlUGFja2V0PExvYWRNb2RlPihjb2wsIHJvdywgeCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBjb25zdCBQYWNrZXRTY2FsYXIgcGFja2V0KEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBkZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBMb2FkTW9kZT4KKyAgICBpbmxpbmUgdm9pZCB3cml0ZVBhY2tldChJbmRleCBpbmRleCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQorICAgIHsKKyAgICAgIGRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkuY29uc3RfY2FzdF9kZXJpdmVkKCkudGVtcGxhdGUgd3JpdGVQYWNrZXQ8TG9hZE1vZGU+KGluZGV4LCB4KTsKKyAgICB9Cit9OworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgdHJhbnNwb3NlIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90cmFuc3Bvc2UuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90cmFuc3Bvc2Uub3V0CisgICoKKyAgKiBcd2FybmluZyBJZiB5b3Ugd2FudCB0byByZXBsYWNlIGEgbWF0cml4IGJ5IGl0cyBvd24gdHJhbnNwb3NlLCBkbyBcYiBOT1QgZG8gdGhpczoKKyAgKiBcY29kZQorICAqIG0gPSBtLnRyYW5zcG9zZSgpOyAvLyBidWchISEgY2F1c2VkIGJ5IGFsaWFzaW5nIGVmZmVjdAorICAqIFxlbmRjb2RlCisgICogSW5zdGVhZCwgdXNlIHRoZSB0cmFuc3Bvc2VJblBsYWNlKCkgbWV0aG9kOgorICAqIFxjb2RlCisgICogbS50cmFuc3Bvc2VJblBsYWNlKCk7CisgICogXGVuZGNvZGUKKyAgKiB3aGljaCBnaXZlcyBFaWdlbiBnb29kIG9wcG9ydHVuaXRpZXMgZm9yIG9wdGltaXphdGlvbiwgb3IgYWx0ZXJuYXRpdmVseSB5b3UgY2FuIGFsc28gZG86CisgICogXGNvZGUKKyAgKiBtID0gbS50cmFuc3Bvc2UoKS5ldmFsKCk7CisgICogXGVuZGNvZGUKKyAgKgorICAqIFxzYSB0cmFuc3Bvc2VJblBsYWNlKCksIGFkam9pbnQoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBUcmFuc3Bvc2U8RGVyaXZlZD4KK0RlbnNlQmFzZTxEZXJpdmVkPjo6dHJhbnNwb3NlKCkKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgdHJhbnNwb3NlKCkuCisgICoKKyAgKiBNYWtlIHN1cmUgeW91IHJlYWQgdGhlIHdhcm5pbmcgZm9yIHRyYW5zcG9zZSgpICEKKyAgKgorICAqIFxzYSB0cmFuc3Bvc2VJblBsYWNlKCksIGFkam9pbnQoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0VHJhbnNwb3NlUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+Ojp0cmFuc3Bvc2UoKSBjb25zdAoreworICByZXR1cm4gQ29uc3RUcmFuc3Bvc2VSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBhZGpvaW50IChpLmUuIGNvbmp1Z2F0ZSB0cmFuc3Bvc2UpIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9hZGpvaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfYWRqb2ludC5vdXQKKyAgKgorICAqIFx3YXJuaW5nIElmIHlvdSB3YW50IHRvIHJlcGxhY2UgYSBtYXRyaXggYnkgaXRzIG93biBhZGpvaW50LCBkbyBcYiBOT1QgZG8gdGhpczoKKyAgKiBcY29kZQorICAqIG0gPSBtLmFkam9pbnQoKTsgLy8gYnVnISEhIGNhdXNlZCBieSBhbGlhc2luZyBlZmZlY3QKKyAgKiBcZW5kY29kZQorICAqIEluc3RlYWQsIHVzZSB0aGUgYWRqb2ludEluUGxhY2UoKSBtZXRob2Q6CisgICogXGNvZGUKKyAgKiBtLmFkam9pbnRJblBsYWNlKCk7CisgICogXGVuZGNvZGUKKyAgKiB3aGljaCBnaXZlcyBFaWdlbiBnb29kIG9wcG9ydHVuaXRpZXMgZm9yIG9wdGltaXphdGlvbiwgb3IgYWx0ZXJuYXRpdmVseSB5b3UgY2FuIGFsc28gZG86CisgICogXGNvZGUKKyAgKiBtID0gbS5hZGpvaW50KCkuZXZhbCgpOworICAqIFxlbmRjb2RlCisgICoKKyAgKiBcc2EgYWRqb2ludEluUGxhY2UoKSwgdHJhbnNwb3NlKCksIGNvbmp1Z2F0ZSgpLCBjbGFzcyBUcmFuc3Bvc2UsIGNsYXNzIGludGVybmFsOjpzY2FsYXJfY29uanVnYXRlX29wICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkFkam9pbnRSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjphZGpvaW50KCkgY29uc3QKK3sKKyAgcmV0dXJuIHRoaXMtPnRyYW5zcG9zZSgpOyAvLyBpbiB0aGUgY29tcGxleCBjYXNlLCB0aGUgLmNvbmp1Z2F0ZSgpIGlzIGJlIGltcGxpY2l0IGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdWUgdG8gaW1wbGljaXQgY29udmVyc2lvbiB0byByZXR1cm4gdHlwZQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICJpbiBwbGFjZSIgdHJhbnNwb3NlIGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsCisgIGJvb2wgSXNTcXVhcmUgPSAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpICYmIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lIT1EeW5hbWljPgorc3RydWN0IGlucGxhY2VfdHJhbnNwb3NlX3NlbGVjdG9yOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IGlucGxhY2VfdHJhbnNwb3NlX3NlbGVjdG9yPE1hdHJpeFR5cGUsdHJ1ZT4geyAvLyBzcXVhcmUgbWF0cml4CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtKSB7CisgICAgbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpLnN3YXAobS50cmFuc3Bvc2UoKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgaW5wbGFjZV90cmFuc3Bvc2Vfc2VsZWN0b3I8TWF0cml4VHlwZSxmYWxzZT4geyAvLyBub24gc3F1YXJlIG1hdHJpeAorICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgbSkgeworICAgIGlmIChtLnJvd3MoKT09bS5jb2xzKCkpCisgICAgICBtLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkuc3dhcChtLnRyYW5zcG9zZSgpKTsKKyAgICBlbHNlCisgICAgICBtID0gbS50cmFuc3Bvc2UoKS5ldmFsKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogVGhpcyBpcyB0aGUgImluIHBsYWNlIiB2ZXJzaW9uIG9mIHRyYW5zcG9zZSgpOiBpdCByZXBsYWNlcyBcYyAqdGhpcyBieSBpdHMgb3duIHRyYW5zcG9zZS4KKyAgKiBUaHVzLCBkb2luZworICAqIFxjb2RlCisgICogbS50cmFuc3Bvc2VJblBsYWNlKCk7CisgICogXGVuZGNvZGUKKyAgKiBoYXMgdGhlIHNhbWUgZWZmZWN0IG9uIG0gYXMgZG9pbmcKKyAgKiBcY29kZQorICAqIG0gPSBtLnRyYW5zcG9zZSgpLmV2YWwoKTsKKyAgKiBcZW5kY29kZQorICAqIGFuZCBpcyBmYXN0ZXIgYW5kIGFsc28gc2FmZXIgYmVjYXVzZSBpbiB0aGUgbGF0dGVyIGxpbmUgb2YgY29kZSwgZm9yZ2V0dGluZyB0aGUgZXZhbCgpIHJlc3VsdHMKKyAgKiBpbiBhIGJ1ZyBjYXVzZWQgYnkgYWxpYXNpbmcuCisgICoKKyAgKiBOb3RpY2UgaG93ZXZlciB0aGF0IHRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJlcGxhY2UgYSBtYXRyaXggYnkgaXRzIG93biB0cmFuc3Bvc2UuCisgICogSWYgeW91IGp1c3QgbmVlZCB0aGUgdHJhbnNwb3NlIG9mIGEgbWF0cml4LCB1c2UgdHJhbnNwb3NlKCkuCisgICoKKyAgKiBcbm90ZSBpZiB0aGUgbWF0cml4IGlzIG5vdCBzcXVhcmUsIHRoZW4gXGMgKnRoaXMgbXVzdCBiZSBhIHJlc2l6YWJsZSBtYXRyaXguCisgICoKKyAgKiBcc2EgdHJhbnNwb3NlKCksIGFkam9pbnQoKSwgYWRqb2ludEluUGxhY2UoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB2b2lkIERlbnNlQmFzZTxEZXJpdmVkPjo6dHJhbnNwb3NlSW5QbGFjZSgpCit7CisgIGludGVybmFsOjppbnBsYWNlX3RyYW5zcG9zZV9zZWxlY3RvcjxEZXJpdmVkPjo6cnVuKGRlcml2ZWQoKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogImluIHBsYWNlIiBhZGpvaW50IGltcGxlbWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBUaGlzIGlzIHRoZSAiaW4gcGxhY2UiIHZlcnNpb24gb2YgYWRqb2ludCgpOiBpdCByZXBsYWNlcyBcYyAqdGhpcyBieSBpdHMgb3duIHRyYW5zcG9zZS4KKyAgKiBUaHVzLCBkb2luZworICAqIFxjb2RlCisgICogbS5hZGpvaW50SW5QbGFjZSgpOworICAqIFxlbmRjb2RlCisgICogaGFzIHRoZSBzYW1lIGVmZmVjdCBvbiBtIGFzIGRvaW5nCisgICogXGNvZGUKKyAgKiBtID0gbS5hZGpvaW50KCkuZXZhbCgpOworICAqIFxlbmRjb2RlCisgICogYW5kIGlzIGZhc3RlciBhbmQgYWxzbyBzYWZlciBiZWNhdXNlIGluIHRoZSBsYXR0ZXIgbGluZSBvZiBjb2RlLCBmb3JnZXR0aW5nIHRoZSBldmFsKCkgcmVzdWx0cworICAqIGluIGEgYnVnIGNhdXNlZCBieSBhbGlhc2luZy4KKyAgKgorICAqIE5vdGljZSBob3dldmVyIHRoYXQgdGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmVwbGFjZSBhIG1hdHJpeCBieSBpdHMgb3duIGFkam9pbnQuCisgICogSWYgeW91IGp1c3QgbmVlZCB0aGUgYWRqb2ludCBvZiBhIG1hdHJpeCwgdXNlIGFkam9pbnQoKS4KKyAgKgorICAqIFxub3RlIGlmIHRoZSBtYXRyaXggaXMgbm90IHNxdWFyZSwgdGhlbiBcYyAqdGhpcyBtdXN0IGJlIGEgcmVzaXphYmxlIG1hdHJpeC4KKyAgKgorICAqIFxzYSB0cmFuc3Bvc2UoKSwgYWRqb2ludCgpLCB0cmFuc3Bvc2VJblBsYWNlKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+OjphZGpvaW50SW5QbGFjZSgpCit7CisgIGRlcml2ZWQoKSA9IGFkam9pbnQoKS5ldmFsKCk7Cit9CisKKyNpZm5kZWYgRUlHRU5fTk9fREVCVUcKKworLy8gVGhlIGZvbGxvd2luZyBpcyB0byBkZXRlY3QgYWxpYXNpbmcgcHJvYmxlbXMgaW4gbW9zdCBjb21tb24gY2FzZXMuCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbk9wLHR5cGVuYW1lIE5lc3RlZFhwcix0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgYmxhc190cmFpdHM8U2VsZkN3aXNlQmluYXJ5T3A8QmluT3AsTmVzdGVkWHByLFJocz4gPgorIDogYmxhc190cmFpdHM8TmVzdGVkWHByPgoreworICB0eXBlZGVmIFNlbGZDd2lzZUJpbmFyeU9wPEJpbk9wLE5lc3RlZFhwcixSaHM+IFhwclR5cGU7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgWHByVHlwZSBleHRyYWN0KGNvbnN0IFhwclR5cGUmIHgpIHsgcmV0dXJuIHg7IH0KK307CisKK3RlbXBsYXRlPGJvb2wgRGVzdElzVHJhbnNwb3NlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorc3RydWN0IGNoZWNrX3RyYW5zcG9zZV9hbGlhc2luZ19jb21waWxlX3RpbWVfc2VsZWN0b3IKK3sKKyAgZW51bSB7IHJldCA9IGJvb2woYmxhc190cmFpdHM8T3RoZXJEZXJpdmVkPjo6SXNUcmFuc3Bvc2VkKSAhPSBEZXN0SXNUcmFuc3Bvc2VkIH07Cit9OworCit0ZW1wbGF0ZTxib29sIERlc3RJc1RyYW5zcG9zZWQsIHR5cGVuYW1lIEJpbk9wLCB0eXBlbmFtZSBEZXJpdmVkQSwgdHlwZW5hbWUgRGVyaXZlZEI+CitzdHJ1Y3QgY2hlY2tfdHJhbnNwb3NlX2FsaWFzaW5nX2NvbXBpbGVfdGltZV9zZWxlY3RvcjxEZXN0SXNUcmFuc3Bvc2VkLEN3aXNlQmluYXJ5T3A8QmluT3AsRGVyaXZlZEEsRGVyaXZlZEI+ID4KK3sKKyAgZW51bSB7IHJldCA9ICAgIGJvb2woYmxhc190cmFpdHM8RGVyaXZlZEE+OjpJc1RyYW5zcG9zZWQpICE9IERlc3RJc1RyYW5zcG9zZWQKKyAgICAgICAgICAgICAgIHx8IGJvb2woYmxhc190cmFpdHM8RGVyaXZlZEI+OjpJc1RyYW5zcG9zZWQpICE9IERlc3RJc1RyYW5zcG9zZWQKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBEZXN0SXNUcmFuc3Bvc2VkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgY2hlY2tfdHJhbnNwb3NlX2FsaWFzaW5nX3J1bl90aW1lX3NlbGVjdG9yCit7CisgIHN0YXRpYyBib29sIHJ1bihjb25zdCBTY2FsYXIqIGRlc3QsIGNvbnN0IE90aGVyRGVyaXZlZCYgc3JjKQorICB7CisgICAgcmV0dXJuIChib29sKGJsYXNfdHJhaXRzPE90aGVyRGVyaXZlZD46OklzVHJhbnNwb3NlZCkgIT0gRGVzdElzVHJhbnNwb3NlZCkgJiYgKGRlc3QhPTAgJiYgZGVzdD09KFNjYWxhciopZXh0cmFjdF9kYXRhKHNyYykpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGJvb2wgRGVzdElzVHJhbnNwb3NlZCwgdHlwZW5hbWUgQmluT3AsIHR5cGVuYW1lIERlcml2ZWRBLCB0eXBlbmFtZSBEZXJpdmVkQj4KK3N0cnVjdCBjaGVja190cmFuc3Bvc2VfYWxpYXNpbmdfcnVuX3RpbWVfc2VsZWN0b3I8U2NhbGFyLERlc3RJc1RyYW5zcG9zZWQsQ3dpc2VCaW5hcnlPcDxCaW5PcCxEZXJpdmVkQSxEZXJpdmVkQj4gPgoreworICBzdGF0aWMgYm9vbCBydW4oY29uc3QgU2NhbGFyKiBkZXN0LCBjb25zdCBDd2lzZUJpbmFyeU9wPEJpbk9wLERlcml2ZWRBLERlcml2ZWRCPiYgc3JjKQorICB7CisgICAgcmV0dXJuICgoYmxhc190cmFpdHM8RGVyaXZlZEE+OjpJc1RyYW5zcG9zZWQgIT0gRGVzdElzVHJhbnNwb3NlZCkgJiYgKGRlc3QhPTAgJiYgZGVzdD09KFNjYWxhciopZXh0cmFjdF9kYXRhKHNyYy5saHMoKSkpKQorICAgICAgICB8fCAoKGJsYXNfdHJhaXRzPERlcml2ZWRCPjo6SXNUcmFuc3Bvc2VkICE9IERlc3RJc1RyYW5zcG9zZWQpICYmIChkZXN0IT0wICYmIGRlc3Q9PShTY2FsYXIqKWV4dHJhY3RfZGF0YShzcmMucmhzKCkpKSk7CisgIH0KK307CisKKy8vIHRoZSBmb2xsb3dpbmcgc2VsZWN0b3IsIGNoZWNrVHJhbnNwb3NlQWxpYXNpbmdfaW1wbCwgYmFzZWQgb24gTWlnaHRIYXZlVHJhbnNwb3NlQWxpYXNpbmcsCisvLyBpcyBiZWNhdXNlIHdoZW4gdGhlIGNvbmRpdGlvbiBjb250cm9sbGluZyB0aGUgYXNzZXJ0IGlzIGtub3duIGF0IGNvbXBpbGUgdGltZSwgSUNDIGVtaXRzIGEgd2FybmluZy4KKy8vIFRoaXMgaXMgYWN0dWFsbHkgYSBnb29kIHdhcm5pbmc6IGluIGV4cHJlc3Npb25zIHRoYXQgZG9uJ3QgaGF2ZSBhbnkgdHJhbnNwb3NpbmcsIHRoZSBjb25kaXRpb24gaXMKKy8vIGtub3duIGF0IGNvbXBpbGUgdGltZSB0byBiZSBmYWxzZSwgYW5kIHVzaW5nIHRoYXQsIHdlIGNhbiBhdm9pZCBnZW5lcmF0aW5nIHRoZSBjb2RlIG9mIHRoZSBhc3NlcnQgYWdhaW4KKy8vIGFuZCBhZ2FpbiBmb3IgYWxsIHRoZXNlIGV4cHJlc3Npb25zIHRoYXQgZG9uJ3QgbmVlZCBpdC4KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkLAorICAgICAgICAgYm9vbCBNaWdodEhhdmVUcmFuc3Bvc2VBbGlhc2luZworICAgICAgICAgICAgICAgICA9IGNoZWNrX3RyYW5zcG9zZV9hbGlhc2luZ19jb21waWxlX3RpbWVfc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgIDxibGFzX3RyYWl0czxEZXJpdmVkPjo6SXNUcmFuc3Bvc2VkLE90aGVyRGVyaXZlZD46OnJldAorICAgICAgICA+CitzdHJ1Y3QgY2hlY2tUcmFuc3Bvc2VBbGlhc2luZ19pbXBsCit7CisgICAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IERlcml2ZWQmIGRzdCwgY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikKKyAgICB7CisgICAgICAgIGVpZ2VuX2Fzc2VydCgoIWNoZWNrX3RyYW5zcG9zZV9hbGlhc2luZ19ydW5fdGltZV9zZWxlY3RvcgorICAgICAgICAgICAgICAgICAgICAgIDx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsYmxhc190cmFpdHM8RGVyaXZlZD46OklzVHJhbnNwb3NlZCxPdGhlckRlcml2ZWQ+CisgICAgICAgICAgICAgICAgICAgICAgOjpydW4oZXh0cmFjdF9kYXRhKGRzdCksIG90aGVyKSkKKyAgICAgICAgICAmJiAiYWxpYXNpbmcgZGV0ZWN0ZWQgZHVyaW5nIHRyYW5wb3NpdGlvbiwgdXNlIHRyYW5zcG9zZUluUGxhY2UoKSAiCisgICAgICAgICAgICAgIm9yIGV2YWx1YXRlIHRoZSByaHMgaW50byBhIHRlbXBvcmFyeSB1c2luZyAuZXZhbCgpIik7CisKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgY2hlY2tUcmFuc3Bvc2VBbGlhc2luZ19pbXBsPERlcml2ZWQsIE90aGVyRGVyaXZlZCwgZmFsc2U+Cit7CisgICAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IERlcml2ZWQmLCBjb25zdCBPdGhlckRlcml2ZWQmKQorICAgIHsKKyAgICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3ZvaWQgRGVuc2VCYXNlPERlcml2ZWQ+OjpjaGVja1RyYW5zcG9zZUFsaWFzaW5nKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpIGNvbnN0Cit7CisgICAgaW50ZXJuYWw6OmNoZWNrVHJhbnNwb3NlQWxpYXNpbmdfaW1wbDxEZXJpdmVkLCBPdGhlckRlcml2ZWQ+OjpydW4oZGVyaXZlZCgpLCBvdGhlcik7Cit9CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUkFOU1BPU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvVHJhbnNwb3NpdGlvbnMuaCBiL0VpZ2VuL3NyYy9Db3JlL1RyYW5zcG9zaXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkMjY4YQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL1RyYW5zcG9zaXRpb25zLmgKQEAgLTAsMCArMSw0MzYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSQU5TUE9TSVRJT05TX0gKKyNkZWZpbmUgRUlHRU5fVFJBTlNQT1NJVElPTlNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxjbGFzcyBUcmFuc3Bvc2l0aW9ucworICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHRyYW5zcG9zaXRpb25zIChyb3cvY29sdW1uIGludGVyY2hhbmdlKQorICAqCisgICogXHBhcmFtIFNpemVBdENvbXBpbGVUaW1lIHRoZSBudW1iZXIgb2YgdHJhbnNwb3NpdGlvbnMsIG9yIER5bmFtaWMKKyAgKiBccGFyYW0gTWF4U2l6ZUF0Q29tcGlsZVRpbWUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zcG9zaXRpb25zLCBvciBEeW5hbWljLiBUaGlzIG9wdGlvbmFsIHBhcmFtZXRlciBkZWZhdWx0cyB0byBTaXplQXRDb21waWxlVGltZS4gTW9zdCBvZiB0aGUgdGltZSwgeW91IHNob3VsZCBub3QgaGF2ZSB0byBzcGVjaWZ5IGl0LgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcGVybXV0YXRpb24gdHJhbnNmb3JtYXRpb24gYXMgYSBzZXF1ZW5jZSBvZiBcZW0gbiB0cmFuc3Bvc2l0aW9ucworICAqIFxmJFtUX3tuLTF9IFxsZG90cyBUX3tpfSBcbGRvdHMgVF97MH1dXGYkLiBJdCBpcyBpbnRlcm5hbGx5IHN0b3JlZCBhcyBhIHZlY3RvciBvZiBpbnRlZ2VycyBcYyBpbmRpY2VzLgorICAqIEVhY2ggdHJhbnNwb3NpdGlvbiBcZiQgVF97aX0gXGYkIGFwcGxpZWQgb24gdGhlIGxlZnQgb2YgYSBtYXRyaXggKFxmJCBUX3tpfSBNXGYkKSBpbnRlcmNoYW5nZXMKKyAgKiB0aGUgcm93cyBcYyBpIGFuZCBcYyBpbmRpY2VzW2ldIG9mIHRoZSBtYXRyaXggXGMgTS4KKyAgKiBBIHRyYW5zcG9zaXRpb24gYXBwbGllZCBvbiB0aGUgcmlnaHQgKGUuZy4sIFxmJCBNIFRfe2l9XGYkKSB5aWVsZHMgYSBjb2x1bW4gaW50ZXJjaGFuZ2UuCisgICoKKyAgKiBDb21wYXJlZCB0byB0aGUgY2xhc3MgUGVybXV0YXRpb25NYXRyaXgsIHN1Y2ggYSBzZXF1ZW5jZSBvZiB0cmFuc3Bvc2l0aW9ucyBpcyB3aGF0IGlzCisgICogY29tcHV0ZWQgZHVyaW5nIGEgZGVjb21wb3NpdGlvbiB3aXRoIHBpdm90aW5nLCBhbmQgaXQgaXMgZmFzdGVyIHdoZW4gYXBwbHlpbmcgdGhlIHBlcm11dGF0aW9uIGluLXBsYWNlLgorICAqIAorICAqIFRvIGFwcGx5IGEgc2VxdWVuY2Ugb2YgdHJhbnNwb3NpdGlvbnMgdG8gYSBtYXRyaXgsIHNpbXBseSB1c2UgdGhlIG9wZXJhdG9yICogYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAqIFxjb2RlCisgICogVHJhbnNwb3NpdGlvbnMgdHI7CisgICogTWF0cml4WGYgbWF0OworICAqIG1hdCA9IHRyICogbWF0OworICAqIFxlbmRjb2RlCisgICogSW4gdGhpcyBleGFtcGxlLCB3ZSBkZXRlY3QgdGhhdCB0aGUgbWF0cml4IGFwcGVhcnMgb24gYm90aCBzaWRlLCBhbmQgc28gdGhlIHRyYW5zcG9zaXRpb25zCisgICogYXJlIGFwcGxpZWQgaW4tcGxhY2Ugd2l0aG91dCBhbnkgdGVtcG9yYXJ5IG9yIGV4dHJhIGNvcHkuCisgICoKKyAgKiBcc2EgY2xhc3MgUGVybXV0YXRpb25NYXRyaXgKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgU2lkZSwgYm9vbCBUcmFuc3Bvc2VkPWZhbHNlPiBzdHJ1Y3QgdHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdF9yZXR2YWw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBUcmFuc3Bvc2l0aW9uc0Jhc2UKK3sKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD4gVHJhaXRzOworICAgIAorICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6SW5kaWNlc1R5cGUgSW5kaWNlc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBJbmRpY2VzVHlwZTo6U2NhbGFyIEluZGV4OworCisgICAgRGVyaXZlZCYgZGVyaXZlZCgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7IH0KKyAgICBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsgfQorCisgICAgLyoqIENvcGllcyB0aGUgXGEgb3RoZXIgdHJhbnNwb3NpdGlvbnMgaW50byBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNwb3NpdGlvbnNCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIGluZGljZXMoKSA9IG90aGVyLmluZGljZXMoKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LiBJdHMgcHVycG9zZSBpcyB0bworICAgICAgKiBwcmV2ZW50IGEgZGVmYXVsdCBvcGVyYXRvcj0gZnJvbSBoaWRpbmcgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uCisgICAgICAqLworICAgIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBUcmFuc3Bvc2l0aW9uc0Jhc2UmIG90aGVyKQorICAgIHsKKyAgICAgIGluZGljZXMoKSA9IG90aGVyLmluZGljZXMoKTsKKyAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJhbnNwb3NpdGlvbnMgKi8KKyAgICBpbmxpbmUgSW5kZXggc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGluZGljZXMoKS5zaXplKCk7IH0KKworICAgIC8qKiBEaXJlY3QgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGluZGV4IHZlY3RvciAqLworICAgIGlubGluZSBjb25zdCBJbmRleCYgY29lZmYoSW5kZXggaSkgY29uc3QgeyByZXR1cm4gaW5kaWNlcygpLmNvZWZmKGkpOyB9CisgICAgLyoqIERpcmVjdCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgaW5kZXggdmVjdG9yICovCisgICAgaW5saW5lIEluZGV4JiBjb2VmZlJlZihJbmRleCBpKSB7IHJldHVybiBpbmRpY2VzKCkuY29lZmZSZWYoaSk7IH0KKyAgICAvKiogRGlyZWN0IGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBpbmRleCB2ZWN0b3IgKi8KKyAgICBpbmxpbmUgY29uc3QgSW5kZXgmIG9wZXJhdG9yKCkoSW5kZXggaSkgY29uc3QgeyByZXR1cm4gaW5kaWNlcygpKGkpOyB9CisgICAgLyoqIERpcmVjdCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgaW5kZXggdmVjdG9yICovCisgICAgaW5saW5lIEluZGV4JiBvcGVyYXRvcigpKEluZGV4IGkpIHsgcmV0dXJuIGluZGljZXMoKShpKTsgfQorICAgIC8qKiBEaXJlY3QgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGluZGV4IHZlY3RvciAqLworICAgIGlubGluZSBjb25zdCBJbmRleCYgb3BlcmF0b3JbXShJbmRleCBpKSBjb25zdCB7IHJldHVybiBpbmRpY2VzKCkoaSk7IH0KKyAgICAvKiogRGlyZWN0IGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBpbmRleCB2ZWN0b3IgKi8KKyAgICBpbmxpbmUgSW5kZXgmIG9wZXJhdG9yW10oSW5kZXggaSkgeyByZXR1cm4gaW5kaWNlcygpKGkpOyB9CisKKyAgICAvKiogY29uc3QgdmVyc2lvbiBvZiBpbmRpY2VzKCkuICovCisgICAgY29uc3QgSW5kaWNlc1R5cGUmIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkuaW5kaWNlcygpOyB9CisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSB0cmFuc3Bvc2l0aW9ucy4gKi8KKyAgICBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIHsgcmV0dXJuIGRlcml2ZWQoKS5pbmRpY2VzKCk7IH0KKworICAgIC8qKiBSZXNpemVzIHRvIGdpdmVuIHNpemUuICovCisgICAgaW5saW5lIHZvaWQgcmVzaXplKGludCBzaXplKQorICAgIHsKKyAgICAgIGluZGljZXMoKS5yZXNpemUoc2l6ZSk7CisgICAgfQorCisgICAgLyoqIFNldHMgXGMgKnRoaXMgdG8gcmVwcmVzZW50cyBhbiBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiAqLworICAgIHZvaWQgc2V0SWRlbnRpdHkoKQorICAgIHsKKyAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbmRpY2VzKCkuc2l6ZSgpOyArK2kpCisgICAgICAgIGNvZWZmUmVmKGkpID0gaTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogZG8gd2Ugd2FudCBzdWNoIG1ldGhvZHMgPworICAgIC8vIG1pZ2h0IGJlIHVzZWZ1bGwgd2hlbiB0aGUgdGFyZ2V0IG1hdHJpeCBleHByZXNzaW9uIGlzIGNvbXBsZXgsIGUuZy46CisgICAgLy8gb2JqZWN0Lm1hdHJpeCgpLmJsb2NrKC4uLC4uLC4uLC4uKSA9IHRyYW5zICogb2JqZWN0Lm1hdHJpeCgpLmJsb2NrKC4uLC4uLC4uLC4uKTsKKyAgICAvKgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgdm9pZCBhcHBseUZvcndhcmRUb1Jvd3MoTWF0cml4VHlwZSYgbWF0KSBjb25zdAorICAgIHsKKyAgICAgIGZvcihJbmRleCBrPTAgOyBrPHNpemUoKSA7ICsraykKKyAgICAgICAgaWYobV9pbmRpY2VzKGspIT1rKQorICAgICAgICAgIG1hdC5yb3coaykuc3dhcChtYXQucm93KG1faW5kaWNlcyhrKSkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgdm9pZCBhcHBseUJhY2t3YXJkVG9Sb3dzKE1hdHJpeFR5cGUmIG1hdCkgY29uc3QKKyAgICB7CisgICAgICBmb3IoSW5kZXggaz1zaXplKCktMSA7IGs+PTAgOyAtLWspCisgICAgICAgIGlmKG1faW5kaWNlcyhrKSE9aykKKyAgICAgICAgICBtYXQucm93KGspLnN3YXAobWF0LnJvdyhtX2luZGljZXMoaykpKTsKKyAgICB9CisgICAgKi8KKworICAgIC8qKiBccmV0dXJucyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiAqLworICAgIGlubGluZSBUcmFuc3Bvc2U8VHJhbnNwb3NpdGlvbnNCYXNlPiBpbnZlcnNlKCkgY29uc3QKKyAgICB7IHJldHVybiBUcmFuc3Bvc2U8VHJhbnNwb3NpdGlvbnNCYXNlPihkZXJpdmVkKCkpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHRyYW5wb3NlIHRyYW5zZm9ybWF0aW9uICovCisgICAgaW5saW5lIFRyYW5zcG9zZTxUcmFuc3Bvc2l0aW9uc0Jhc2U+IHRyYW5zcG9zZSgpIGNvbnN0CisgICAgeyByZXR1cm4gVHJhbnNwb3NlPFRyYW5zcG9zaXRpb25zQmFzZT4oZGVyaXZlZCgpKTsgfQorCisgIHByb3RlY3RlZDoKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgU2l6ZUF0Q29tcGlsZVRpbWUsIGludCBNYXhTaXplQXRDb21waWxlVGltZSwgdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RydWN0IHRyYWl0czxUcmFuc3Bvc2l0aW9uczxTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZSxJbmRleFR5cGU+ID4KK3sKKyAgdHlwZWRlZiBJbmRleFR5cGUgSW5kZXg7CisgIHR5cGVkZWYgTWF0cml4PEluZGV4LCBTaXplQXRDb21waWxlVGltZSwgMSwgMCwgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIDE+IEluZGljZXNUeXBlOworfTsKK30KKwordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIHR5cGVuYW1lIEluZGV4VHlwZT4KK2NsYXNzIFRyYW5zcG9zaXRpb25zIDogcHVibGljIFRyYW5zcG9zaXRpb25zQmFzZTxUcmFuc3Bvc2l0aW9uczxTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZSxJbmRleFR5cGU+ID4KK3sKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8VHJhbnNwb3NpdGlvbnM+IFRyYWl0czsKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBUcmFuc3Bvc2l0aW9uc0Jhc2U8VHJhbnNwb3NpdGlvbnM+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5kaWNlc1R5cGU6OlNjYWxhciBJbmRleDsKKworICAgIGlubGluZSBUcmFuc3Bvc2l0aW9ucygpIHt9CisKKyAgICAvKiogQ29weSBjb25zdHJ1Y3Rvci4gKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIFRyYW5zcG9zaXRpb25zKGNvbnN0IFRyYW5zcG9zaXRpb25zQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICAgIDogbV9pbmRpY2VzKG90aGVyLmluZGljZXMoKSkge30KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogU3RhbmRhcmQgY29weSBjb25zdHJ1Y3Rvci4gRGVmaW5lZCBvbmx5IHRvIHByZXZlbnQgYSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IKKyAgICAgICogZnJvbSBoaWRpbmcgdGhlIG90aGVyIHRlbXBsYXRlZCBjb25zdHJ1Y3RvciAqLworICAgIGlubGluZSBUcmFuc3Bvc2l0aW9ucyhjb25zdCBUcmFuc3Bvc2l0aW9ucyYgb3RoZXIpIDogbV9pbmRpY2VzKG90aGVyLmluZGljZXMoKSkge30KKyAgICAjZW5kaWYKKworICAgIC8qKiBHZW5lcmljIGNvbnN0cnVjdG9yIGZyb20gZXhwcmVzc2lvbiBvZiB0aGUgdHJhbnNwb3NpdGlvbiBpbmRpY2VzLiAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorICAgIGV4cGxpY2l0IGlubGluZSBUcmFuc3Bvc2l0aW9ucyhjb25zdCBNYXRyaXhCYXNlPE90aGVyPiYgaW5kaWNlcykgOiBtX2luZGljZXMoaW5kaWNlcykKKyAgICB7fQorCisgICAgLyoqIENvcGllcyB0aGUgXGEgb3RoZXIgdHJhbnNwb3NpdGlvbnMgaW50byBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBUcmFuc3Bvc2l0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zcG9zaXRpb25zQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsKKyAgICB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uIEl0cyBwdXJwb3NlIGlzIHRvCisgICAgICAqIHByZXZlbnQgYSBkZWZhdWx0IG9wZXJhdG9yPSBmcm9tIGhpZGluZyB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4KKyAgICAgICovCisgICAgVHJhbnNwb3NpdGlvbnMmIG9wZXJhdG9yPShjb25zdCBUcmFuc3Bvc2l0aW9ucyYgb3RoZXIpCisgICAgeworICAgICAgbV9pbmRpY2VzID0gb3RoZXIubV9pbmRpY2VzOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBDb25zdHJ1Y3RzIGFuIHVuaW5pdGlhbGl6ZWQgcGVybXV0YXRpb24gbWF0cml4IG9mIGdpdmVuIHNpemUuCisgICAgICAqLworICAgIGlubGluZSBUcmFuc3Bvc2l0aW9ucyhJbmRleCBzaXplKSA6IG1faW5kaWNlcyhzaXplKQorICAgIHt9CisKKyAgICAvKiogY29uc3QgdmVyc2lvbiBvZiBpbmRpY2VzKCkuICovCisgICAgY29uc3QgSW5kaWNlc1R5cGUmIGluZGljZXMoKSBjb25zdCB7IHJldHVybiBtX2luZGljZXM7IH0KKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHN0b3JlZCBhcnJheSByZXByZXNlbnRpbmcgdGhlIHRyYW5zcG9zaXRpb25zLiAqLworICAgIEluZGljZXNUeXBlJiBpbmRpY2VzKCkgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgSW5kaWNlc1R5cGUgbV9pbmRpY2VzOworfTsKKworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIHR5cGVuYW1lIEluZGV4VHlwZSwgaW50IF9QYWNrZXRBY2Nlc3M+CitzdHJ1Y3QgdHJhaXRzPE1hcDxUcmFuc3Bvc2l0aW9uczxTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZSxJbmRleFR5cGU+LF9QYWNrZXRBY2Nlc3M+ID4KK3sKKyAgdHlwZWRlZiBJbmRleFR5cGUgSW5kZXg7CisgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxJbmRleCxTaXplQXRDb21waWxlVGltZSwxLDAsTWF4U2l6ZUF0Q29tcGlsZVRpbWUsMT4sIF9QYWNrZXRBY2Nlc3M+IEluZGljZXNUeXBlOworfTsKK30KKwordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWUsIHR5cGVuYW1lIEluZGV4VHlwZSwgaW50IFBhY2tldEFjY2Vzcz4KK2NsYXNzIE1hcDxUcmFuc3Bvc2l0aW9uczxTaXplQXRDb21waWxlVGltZSxNYXhTaXplQXRDb21waWxlVGltZSxJbmRleFR5cGU+LFBhY2tldEFjY2Vzcz4KKyA6IHB1YmxpYyBUcmFuc3Bvc2l0aW9uc0Jhc2U8TWFwPFRyYW5zcG9zaXRpb25zPFNpemVBdENvbXBpbGVUaW1lLE1heFNpemVBdENvbXBpbGVUaW1lLEluZGV4VHlwZT4sUGFja2V0QWNjZXNzPiA+Cit7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPE1hcD4gVHJhaXRzOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIFRyYW5zcG9zaXRpb25zQmFzZTxNYXA+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5kaWNlc1R5cGU6OlNjYWxhciBJbmRleDsKKworICAgIGlubGluZSBNYXAoY29uc3QgSW5kZXgqIGluZGljZXMpCisgICAgICA6IG1faW5kaWNlcyhpbmRpY2VzKQorICAgIHt9CisKKyAgICBpbmxpbmUgTWFwKGNvbnN0IEluZGV4KiBpbmRpY2VzLCBJbmRleCBzaXplKQorICAgICAgOiBtX2luZGljZXMoaW5kaWNlcyxzaXplKQorICAgIHt9CisKKyAgICAvKiogQ29waWVzIHRoZSBcYSBvdGhlciB0cmFuc3Bvc2l0aW9ucyBpbnRvIFxjICp0aGlzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIE1hcCYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zcG9zaXRpb25zQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsKKyAgICB9CisKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uIEl0cyBwdXJwb3NlIGlzIHRvCisgICAgICAqIHByZXZlbnQgYSBkZWZhdWx0IG9wZXJhdG9yPSBmcm9tIGhpZGluZyB0aGUgdGVtcGxhdGVkIG9wZXJhdG9yPS4KKyAgICAgICovCisgICAgTWFwJiBvcGVyYXRvcj0oY29uc3QgTWFwJiBvdGhlcikKKyAgICB7CisgICAgICBtX2luZGljZXMgPSBvdGhlci5tX2luZGljZXM7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLyoqIGNvbnN0IHZlcnNpb24gb2YgaW5kaWNlcygpLiAqLworICAgIGNvbnN0IEluZGljZXNUeXBlJiBpbmRpY2VzKCkgY29uc3QgeyByZXR1cm4gbV9pbmRpY2VzOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSB0cmFuc3Bvc2l0aW9ucy4gKi8KKyAgICBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIHsgcmV0dXJuIG1faW5kaWNlczsgfQorCisgIHByb3RlY3RlZDoKKworICAgIEluZGljZXNUeXBlIG1faW5kaWNlczsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5kaWNlc1R5cGU+CitzdHJ1Y3QgdHJhaXRzPFRyYW5zcG9zaXRpb25zV3JhcHBlcjxfSW5kaWNlc1R5cGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBfSW5kaWNlc1R5cGU6OlNjYWxhciBJbmRleDsKKyAgdHlwZWRlZiBfSW5kaWNlc1R5cGUgSW5kaWNlc1R5cGU7Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5kaWNlc1R5cGU+CitjbGFzcyBUcmFuc3Bvc2l0aW9uc1dyYXBwZXIKKyA6IHB1YmxpYyBUcmFuc3Bvc2l0aW9uc0Jhc2U8VHJhbnNwb3NpdGlvbnNXcmFwcGVyPF9JbmRpY2VzVHlwZT4gPgoreworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxUcmFuc3Bvc2l0aW9uc1dyYXBwZXI+IFRyYWl0czsKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBUcmFuc3Bvc2l0aW9uc0Jhc2U8VHJhbnNwb3NpdGlvbnNXcmFwcGVyPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpJbmRpY2VzVHlwZSBJbmRpY2VzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEluZGljZXNUeXBlOjpTY2FsYXIgSW5kZXg7CisKKyAgICBpbmxpbmUgVHJhbnNwb3NpdGlvbnNXcmFwcGVyKEluZGljZXNUeXBlJiBpbmRpY2VzKQorICAgICAgOiBtX2luZGljZXMoaW5kaWNlcykKKyAgICB7fQorCisgICAgLyoqIENvcGllcyB0aGUgXGEgb3RoZXIgdHJhbnNwb3NpdGlvbnMgaW50byBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBUcmFuc3Bvc2l0aW9uc1dyYXBwZXImIG9wZXJhdG9yPShjb25zdCBUcmFuc3Bvc2l0aW9uc0Jhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPShvdGhlcik7CisgICAgfQorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9LiBJdHMgcHVycG9zZSBpcyB0bworICAgICAgKiBwcmV2ZW50IGEgZGVmYXVsdCBvcGVyYXRvcj0gZnJvbSBoaWRpbmcgdGhlIHRlbXBsYXRlZCBvcGVyYXRvcj0uCisgICAgICAqLworICAgIFRyYW5zcG9zaXRpb25zV3JhcHBlciYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zcG9zaXRpb25zV3JhcHBlciYgb3RoZXIpCisgICAgeworICAgICAgbV9pbmRpY2VzID0gb3RoZXIubV9pbmRpY2VzOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qKiBjb25zdCB2ZXJzaW9uIG9mIGluZGljZXMoKS4gKi8KKyAgICBjb25zdCBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIGNvbnN0IHsgcmV0dXJuIG1faW5kaWNlczsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSB0cmFuc3Bvc2l0aW9ucy4gKi8KKyAgICBJbmRpY2VzVHlwZSYgaW5kaWNlcygpIHsgcmV0dXJuIG1faW5kaWNlczsgfQorCisgIHByb3RlY3RlZDoKKworICAgIGNvbnN0IHR5cGVuYW1lIEluZGljZXNUeXBlOjpOZXN0ZWQgbV9pbmRpY2VzOworfTsKKworLyoqIFxyZXR1cm5zIHRoZSBcYSBtYXRyaXggd2l0aCB0aGUgXGEgdHJhbnNwb3NpdGlvbnMgYXBwbGllZCB0byB0aGUgY29sdW1ucy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25zRGVyaXZlZD4KK2lubGluZSBjb25zdCBpbnRlcm5hbDo6dHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdF9yZXR2YWw8VHJhbnNwb3NpdGlvbnNEZXJpdmVkLCBEZXJpdmVkLCBPblRoZVJpZ2h0Pgorb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdHJpeCwKKyAgICAgICAgICBjb25zdCBUcmFuc3Bvc2l0aW9uc0Jhc2U8VHJhbnNwb3NpdGlvbnNEZXJpdmVkPiAmdHJhbnNwb3NpdGlvbnMpCit7CisgIHJldHVybiBpbnRlcm5hbDo6dHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdF9yZXR2YWwKKyAgICAgICAgICAgPFRyYW5zcG9zaXRpb25zRGVyaXZlZCwgRGVyaXZlZCwgT25UaGVSaWdodD4KKyAgICAgICAgICAgKHRyYW5zcG9zaXRpb25zLmRlcml2ZWQoKSwgbWF0cml4LmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgXGEgbWF0cml4IHdpdGggdGhlIFxhIHRyYW5zcG9zaXRpb25zIGFwcGxpZWQgdG8gdGhlIHJvd3MuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uRGVyaXZlZD4KK2lubGluZSBjb25zdCBpbnRlcm5hbDo6dHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdF9yZXR2YWwKKyAgICAgICAgICAgICAgIDxUcmFuc3Bvc2l0aW9uRGVyaXZlZCwgRGVyaXZlZCwgT25UaGVMZWZ0Pgorb3BlcmF0b3IqKGNvbnN0IFRyYW5zcG9zaXRpb25zQmFzZTxUcmFuc3Bvc2l0aW9uRGVyaXZlZD4gJnRyYW5zcG9zaXRpb25zLAorICAgICAgICAgIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdHJpeCkKK3sKKyAgcmV0dXJuIGludGVybmFsOjp0cmFuc3Bvc2l0aW9uX21hdHJpeF9wcm9kdWN0X3JldHZhbAorICAgICAgICAgICA8VHJhbnNwb3NpdGlvbkRlcml2ZWQsIERlcml2ZWQsIE9uVGhlTGVmdD4KKyAgICAgICAgICAgKHRyYW5zcG9zaXRpb25zLmRlcml2ZWQoKSwgbWF0cml4LmRlcml2ZWQoKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgU2lkZSwgYm9vbCBUcmFuc3Bvc2VkPgorc3RydWN0IHRyYWl0czx0cmFuc3Bvc2l0aW9uX21hdHJpeF9wcm9kdWN0X3JldHZhbDxUcmFuc3Bvc2l0aW9uVHlwZSwgTWF0cml4VHlwZSwgU2lkZSwgVHJhbnNwb3NlZD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0IFJldHVyblR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFNpZGUsIGJvb2wgVHJhbnNwb3NlZD4KK3N0cnVjdCB0cmFuc3Bvc2l0aW9uX21hdHJpeF9wcm9kdWN0X3JldHZhbAorIDogcHVibGljIFJldHVybkJ5VmFsdWU8dHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdF9yZXR2YWw8VHJhbnNwb3NpdGlvblR5cGUsIE1hdHJpeFR5cGUsIFNpZGUsIFRyYW5zcG9zZWQ+ID4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8dHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkPjo6dHlwZSBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlOjpJbmRleCBJbmRleDsKKworICAgIHRyYW5zcG9zaXRpb25fbWF0cml4X3Byb2R1Y3RfcmV0dmFsKGNvbnN0IFRyYW5zcG9zaXRpb25UeXBlJiB0ciwgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBtX3RyYW5zcG9zaXRpb25zKHRyKSwgbV9tYXRyaXgobWF0cml4KQorICAgIHt9CisKKyAgICBpbmxpbmUgaW50IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgICBpbmxpbmUgaW50IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgaW50IHNpemUgPSBtX3RyYW5zcG9zaXRpb25zLnNpemUoKTsKKyAgICAgIEluZGV4IGogPSAwOworCisgICAgICBpZighKGlzX3NhbWU8TWF0cml4VHlwZU5lc3RlZENsZWFuZWQsRGVzdD46OnZhbHVlICYmIGV4dHJhY3RfZGF0YShkc3QpID09IGV4dHJhY3RfZGF0YShtX21hdHJpeCkpKQorICAgICAgICBkc3QgPSBtX21hdHJpeDsKKworICAgICAgZm9yKGludCBrPShUcmFuc3Bvc2VkP3NpemUtMTowKSA7IFRyYW5zcG9zZWQ/az49MDprPHNpemUgOyBUcmFuc3Bvc2VkPy0tazorK2spCisgICAgICAgIGlmKChqPW1fdHJhbnNwb3NpdGlvbnMuY29lZmYoaykpIT1rKQorICAgICAgICB7CisgICAgICAgICAgaWYoU2lkZT09T25UaGVMZWZ0KQorICAgICAgICAgICAgZHN0LnJvdyhrKS5zd2FwKGRzdC5yb3coaikpOworICAgICAgICAgIGVsc2UgaWYoU2lkZT09T25UaGVSaWdodCkKKyAgICAgICAgICAgIGRzdC5jb2woaykuc3dhcChkc3QuY29sKGopKTsKKyAgICAgICAgfQorICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgVHJhbnNwb3NpdGlvblR5cGUmIG1fdHJhbnNwb3NpdGlvbnM7CisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fbWF0cml4OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qIFRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHRyYW5zcG9zZWQvaW52ZXJzZSB0cmFuc3Bvc2l0aW9ucyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uc0Rlcml2ZWQ+CitjbGFzcyBUcmFuc3Bvc2U8VHJhbnNwb3NpdGlvbnNCYXNlPFRyYW5zcG9zaXRpb25zRGVyaXZlZD4gPgoreworICAgIHR5cGVkZWYgVHJhbnNwb3NpdGlvbnNEZXJpdmVkIFRyYW5zcG9zaXRpb25UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNwb3NpdGlvblR5cGU6OkluZGljZXNUeXBlIEluZGljZXNUeXBlOworICBwdWJsaWM6CisKKyAgICBUcmFuc3Bvc2UoY29uc3QgVHJhbnNwb3NpdGlvblR5cGUmIHQpIDogbV90cmFuc3Bvc2l0aW9ucyh0KSB7fQorCisgICAgaW5saW5lIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3Bvc2l0aW9ucy5zaXplKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgXGEgbWF0cml4IHdpdGggdGhlIGludmVyc2UgdHJhbnNwb3NpdGlvbnMgYXBwbGllZCB0byB0aGUgY29sdW1ucy4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gZnJpZW5kCisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjp0cmFuc3Bvc2l0aW9uX21hdHJpeF9wcm9kdWN0X3JldHZhbDxUcmFuc3Bvc2l0aW9uVHlwZSwgRGVyaXZlZCwgT25UaGVSaWdodCwgdHJ1ZT4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbWF0cml4LCBjb25zdCBUcmFuc3Bvc2UmIHRydCkKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnRyYW5zcG9zaXRpb25fbWF0cml4X3Byb2R1Y3RfcmV0dmFsPFRyYW5zcG9zaXRpb25UeXBlLCBEZXJpdmVkLCBPblRoZVJpZ2h0LCB0cnVlPih0cnQubV90cmFuc3Bvc2l0aW9ucywgbWF0cml4LmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBcYSBtYXRyaXggd2l0aCB0aGUgaW52ZXJzZSB0cmFuc3Bvc2l0aW9ucyBhcHBsaWVkIHRvIHRoZSByb3dzLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6dHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdF9yZXR2YWw8VHJhbnNwb3NpdGlvblR5cGUsIERlcml2ZWQsIE9uVGhlTGVmdCwgdHJ1ZT4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbWF0cml4KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6dHJhbnNwb3NpdGlvbl9tYXRyaXhfcHJvZHVjdF9yZXR2YWw8VHJhbnNwb3NpdGlvblR5cGUsIERlcml2ZWQsIE9uVGhlTGVmdCwgdHJ1ZT4obV90cmFuc3Bvc2l0aW9ucywgbWF0cml4LmRlcml2ZWQoKSk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBUcmFuc3Bvc2l0aW9uVHlwZSYgbV90cmFuc3Bvc2l0aW9uczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJBTlNQT1NJVElPTlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvVHJpYW5ndWxhck1hdHJpeC5oIGIvRWlnZW4vc3JjL0NvcmUvVHJpYW5ndWxhck1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTU0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9Ucmlhbmd1bGFyTWF0cml4LmgKQEAgLTAsMCArMSw4MjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSSUFOR1VMQVJNQVRSSVhfSAorI2RlZmluZSBFSUdFTl9UUklBTkdVTEFSTUFUUklYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAordGVtcGxhdGU8aW50IFNpZGUsIHR5cGVuYW1lIFRyaWFuZ3VsYXJUeXBlLCB0eXBlbmFtZSBSaHM+IHN0cnVjdCB0cmlhbmd1bGFyX3NvbHZlX3JldHZhbDsKKyAgCit9CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIFxjbGFzcyBUcmlhbmd1bGFyQmFzZQorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgdHJpYW5ndWxhciBwYXJ0IGluIGEgbWF0cml4CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBUcmlhbmd1bGFyQmFzZSA6IHB1YmxpYyBFaWdlbkJhc2U8RGVyaXZlZD4KK3sKKyAgcHVibGljOgorCisgICAgZW51bSB7CisgICAgICBNb2RlID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6TW9kZSwKKyAgICAgIENvZWZmUmVhZENvc3QgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2VmZlJlYWRDb3N0LAorICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkRlbnNlTWF0cml4VHlwZSBEZW5zZU1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBEZW5zZU1hdHJpeFR5cGUgRGVuc2VUeXBlOworCisgICAgaW5saW5lIFRyaWFuZ3VsYXJCYXNlKCkgeyBlaWdlbl9hc3NlcnQoISgoTW9kZSZVbml0RGlhZykgJiYgKE1vZGUmWmVyb0RpYWcpKSk7IH0KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLmNvbHMoKTsgfQorICAgIGlubGluZSBJbmRleCBvdXRlclN0cmlkZSgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5vdXRlclN0cmlkZSgpOyB9CisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLmlubmVyU3RyaWRlKCk7IH0KKworICAgIGlubGluZSBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0ICB7IHJldHVybiBkZXJpdmVkKCkuY29lZmYocm93LGNvbCk7IH0KKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkgeyByZXR1cm4gZGVyaXZlZCgpLmNvZWZmUmVmKHJvdyxjb2wpOyB9CisKKyAgICAvKiogXHNlZSBNYXRyaXhCYXNlOjpjb3B5Q29lZmYocm93LGNvbCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNvcHlDb2VmZihJbmRleCByb3csIEluZGV4IGNvbCwgT3RoZXImIG90aGVyKQorICAgIHsKKyAgICAgIGRlcml2ZWQoKS5jb2VmZlJlZihyb3csIGNvbCkgPSBvdGhlci5jb2VmZihyb3csIGNvbCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciBvcGVyYXRvcigpKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIGNoZWNrX2Nvb3JkaW5hdGVzKHJvdywgY29sKTsKKyAgICAgIHJldHVybiBjb2VmZihyb3csY29sKTsKKyAgICB9CisgICAgaW5saW5lIFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBjaGVja19jb29yZGluYXRlcyhyb3csIGNvbCk7CisgICAgICByZXR1cm4gY29lZmZSZWYocm93LGNvbCk7CisgICAgfQorCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIGlubGluZSBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsgfQorICAgIGlubGluZSBEZXJpdmVkJiBkZXJpdmVkKCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKTsgfQorICAgICNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlbnNlRGVyaXZlZD4KKyAgICB2b2lkIGV2YWxUbyhNYXRyaXhCYXNlPERlbnNlRGVyaXZlZD4gJm90aGVyKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZURlcml2ZWQ+CisgICAgdm9pZCBldmFsVG9MYXp5KE1hdHJpeEJhc2U8RGVuc2VEZXJpdmVkPiAmb3RoZXIpIGNvbnN0OworCisgICAgRGVuc2VNYXRyaXhUeXBlIHRvRGVuc2VNYXRyaXgoKSBjb25zdAorICAgIHsKKyAgICAgIERlbnNlTWF0cml4VHlwZSByZXMocm93cygpLCBjb2xzKCkpOworICAgICAgZXZhbFRvTGF6eShyZXMpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgdm9pZCBjaGVja19jb29yZGluYXRlcyhJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKHJvdyk7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKGNvbCk7CisgICAgICBlaWdlbl9hc3NlcnQoY29sPj0wICYmIGNvbDxjb2xzKCkgJiYgcm93Pj0wICYmIHJvdzxyb3dzKCkpOworICAgICAgY29uc3QgaW50IG1vZGUgPSBpbnQoTW9kZSkgJiB+U2VsZkFkam9pbnQ7CisgICAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKG1vZGUpOworICAgICAgZWlnZW5fYXNzZXJ0KChtb2RlPT1VcHBlciAmJiBjb2w+PXJvdykKKyAgICAgICAgICAgICAgICB8fCAobW9kZT09TG93ZXIgJiYgY29sPD1yb3cpCisgICAgICAgICAgICAgICAgfHwgKChtb2RlPT1TdHJpY3RseVVwcGVyIHx8IG1vZGU9PVVuaXRVcHBlcikgJiYgY29sPnJvdykKKyAgICAgICAgICAgICAgICB8fCAoKG1vZGU9PVN0cmljdGx5TG93ZXIgfHwgbW9kZT09VW5pdExvd2VyKSAmJiBjb2w8cm93KSk7CisgICAgfQorCisgICAgI2lmZGVmIEVJR0VOX0lOVEVSTkFMX0RFQlVHR0lORworICAgIHZvaWQgY2hlY2tfY29vcmRpbmF0ZXNfaW50ZXJuYWwoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgY2hlY2tfY29vcmRpbmF0ZXMocm93LCBjb2wpOworICAgIH0KKyAgICAjZWxzZQorICAgIHZvaWQgY2hlY2tfY29vcmRpbmF0ZXNfaW50ZXJuYWwoSW5kZXggLCBJbmRleCApIGNvbnN0IHt9CisgICAgI2VuZGlmCisKK307CisKKy8qKiBcY2xhc3MgVHJpYW5ndWxhclZpZXcKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogXGJyaWVmIEJhc2UgY2xhc3MgZm9yIHRyaWFuZ3VsYXIgcGFydCBpbiBhIG1hdHJpeAorICAqCisgICogXHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBpbiB3aGljaCB3ZSBhcmUgdGFraW5nIHRoZSB0cmlhbmd1bGFyIHBhcnQKKyAgKiBccGFyYW0gTW9kZSB0aGUga2luZCBvZiB0cmlhbmd1bGFyIG1hdHJpeCBleHByZXNzaW9uIHRvIGNvbnN0cnVjdC4gQ2FuIGJlICNVcHBlciwKKyAgKiAgICAgICAgICAgICAjTG93ZXIsICNVbml0VXBwZXIsICNVbml0TG93ZXIsICNTdHJpY3RseVVwcGVyLCBvciAjU3RyaWN0bHlMb3dlci4KKyAgKiAgICAgICAgICAgICBUaGlzIGlzIGluIGZhY3QgYSBiaXQgZmllbGQ7IGl0IG11c3QgaGF2ZSBlaXRoZXIgI1VwcGVyIG9yICNMb3dlciwgCisgICogICAgICAgICAgICAgYW5kIGFkZGl0aW9ubmFseSBpdCBtYXkgaGF2ZSAjVW5pdERpYWcgb3IgI1plcm9EaWFnIG9yIG5laXRoZXIuCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB0cmlhbmd1bGFyIHBhcnQgb2YgYSBtYXRyaXgsIG5vdCBuZWNlc3NhcmlseSBzcXVhcmUuIFN0cmljdGx5IHNwZWFraW5nLCBmb3IgcmVjdGFuZ3VsYXIKKyAgKiBtYXRyaWNlcyBvbmUgc2hvdWxkIHNwZWFrIG9mICJ0cmFwZXpvaWQiIHBhcnRzLiBUaGlzIGNsYXNzIGlzIHRoZSByZXR1cm4gdHlwZQorICAqIG9mIE1hdHJpeEJhc2U6OnRyaWFuZ3VsYXJWaWV3KCkgYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjp0cmlhbmd1bGFyVmlldygpCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IF9Nb2RlPgorc3RydWN0IHRyYWl0czxUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLCBfTW9kZT4gPiA6IHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZDxNYXRyaXhUeXBlPjo6dHlwZSBNYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgTWF0cml4VHlwZU5lc3RlZE5vblJlZjsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOworICB0eXBlZGVmIE1hdHJpeFR5cGUgRXhwcmVzc2lvblR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgRGVuc2VNYXRyaXhUeXBlOworICBlbnVtIHsKKyAgICBNb2RlID0gX01vZGUsCisgICAgRmxhZ3MgPSAoTWF0cml4VHlwZU5lc3RlZENsZWFuZWQ6OkZsYWdzICYgKEhlcmVkaXRhcnlCaXRzKSAmICh+KFBhY2tldEFjY2Vzc0JpdCB8IERpcmVjdEFjY2Vzc0JpdCB8IExpbmVhckFjY2Vzc0JpdCkpKSB8IE1vZGUsCisgICAgQ29lZmZSZWFkQ29zdCA9IE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOjpDb2VmZlJlYWRDb3N0CisgIH07Cit9OworfQorCit0ZW1wbGF0ZTxpbnQgTW9kZSwgYm9vbCBMaHNJc1RyaWFuZ3VsYXIsCisgICAgICAgICB0eXBlbmFtZSBMaHMsIGJvb2wgTGhzSXNWZWN0b3IsCisgICAgICAgICB0eXBlbmFtZSBSaHMsIGJvb2wgUmhzSXNWZWN0b3I+CitzdHJ1Y3QgVHJpYW5ndWxhclByb2R1Y3Q7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgX01vZGU+IGNsYXNzIFRyaWFuZ3VsYXJWaWV3CisgIDogcHVibGljIFRyaWFuZ3VsYXJCYXNlPFRyaWFuZ3VsYXJWaWV3PF9NYXRyaXhUeXBlLCBfTW9kZT4gPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIFRyaWFuZ3VsYXJCYXNlPFRyaWFuZ3VsYXJWaWV3PiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUcmlhbmd1bGFyVmlldz46OlNjYWxhciBTY2FsYXI7CisKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRyaWFuZ3VsYXJWaWV3Pjo6RGVuc2VNYXRyaXhUeXBlIERlbnNlTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIERlbnNlTWF0cml4VHlwZSBQbGFpbk9iamVjdDsKKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRyaWFuZ3VsYXJWaWV3Pjo6TWF0cml4VHlwZU5lc3RlZCBNYXRyaXhUeXBlTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUcmlhbmd1bGFyVmlldz46Ok1hdHJpeFR5cGVOZXN0ZWROb25SZWYgTWF0cml4VHlwZU5lc3RlZE5vblJlZjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VHJpYW5ndWxhclZpZXc+OjpNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZCBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgTWF0cml4VHlwZTo6Q29uanVnYXRlUmV0dXJuVHlwZT46OnR5cGUgTWF0cml4Q29uanVnYXRlUmV0dXJuVHlwZTsKKyAgICAKKyAgcHVibGljOgorICAgIHVzaW5nIEJhc2U6OmV2YWxUb0xhenk7CisgIAorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRyaWFuZ3VsYXJWaWV3Pjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFRyaWFuZ3VsYXJWaWV3Pjo6SW5kZXggSW5kZXg7CisKKyAgICBlbnVtIHsKKyAgICAgIE1vZGUgPSBfTW9kZSwKKyAgICAgIFRyYW5zcG9zZU1vZGUgPSAoTW9kZSAmIFVwcGVyID8gTG93ZXIgOiAwKQorICAgICAgICAgICAgICAgICAgICB8IChNb2RlICYgTG93ZXIgPyBVcHBlciA6IDApCisgICAgICAgICAgICAgICAgICAgIHwgKE1vZGUgJiAoVW5pdERpYWcpKQorICAgICAgICAgICAgICAgICAgICB8IChNb2RlICYgKFplcm9EaWFnKSkKKyAgICB9OworCisgICAgaW5saW5lIFRyaWFuZ3VsYXJWaWV3KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkgOiBtX21hdHJpeChtYXRyaXgpCisgICAge30KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTdHJpZGUoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5vdXRlclN0cmlkZSgpOyB9CisgICAgaW5saW5lIEluZGV4IGlubmVyU3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguaW5uZXJTdHJpZGUoKTsgfQorCisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvcis9KCkgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4gVHJpYW5ndWxhclZpZXcmICBvcGVyYXRvcis9KGNvbnN0IERlbnNlQmFzZTxPdGhlcj4mIG90aGVyKSB7IHJldHVybiAqdGhpcyA9IG1fbWF0cml4ICsgb3RoZXIuZGVyaXZlZCgpOyB9CisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvci09KCkgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4gVHJpYW5ndWxhclZpZXcmICBvcGVyYXRvci09KGNvbnN0IERlbnNlQmFzZTxPdGhlcj4mIG90aGVyKSB7IHJldHVybiAqdGhpcyA9IG1fbWF0cml4IC0gb3RoZXIuZGVyaXZlZCgpOyB9CisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvcio9KCkgKi8KKyAgICBUcmlhbmd1bGFyVmlldyYgIG9wZXJhdG9yKj0oY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyJiBvdGhlcikgeyByZXR1cm4gKnRoaXMgPSBtX21hdHJpeCAqIG90aGVyOyB9CisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpvcGVyYXRvci89KCkgKi8KKyAgICBUcmlhbmd1bGFyVmlldyYgIG9wZXJhdG9yLz0oY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyJiBvdGhlcikgeyByZXR1cm4gKnRoaXMgPSBtX21hdHJpeCAvIG90aGVyOyB9CisKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6OmZpbGwoKSAqLworICAgIHZvaWQgZmlsbChjb25zdCBTY2FsYXImIHZhbHVlKSB7IHNldENvbnN0YW50KHZhbHVlKTsgfQorICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6c2V0Q29uc3RhbnQoKSAqLworICAgIFRyaWFuZ3VsYXJWaWV3JiBzZXRDb25zdGFudChjb25zdCBTY2FsYXImIHZhbHVlKQorICAgIHsgcmV0dXJuICp0aGlzID0gTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cygpLCBjb2xzKCksIHZhbHVlKTsgfQorICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6c2V0WmVybygpICovCisgICAgVHJpYW5ndWxhclZpZXcmIHNldFplcm8oKSB7IHJldHVybiBzZXRDb25zdGFudChTY2FsYXIoMCkpOyB9CisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjpzZXRPbmVzKCkgKi8KKyAgICBUcmlhbmd1bGFyVmlldyYgc2V0T25lcygpIHsgcmV0dXJuIHNldENvbnN0YW50KFNjYWxhcigxKSk7IH0KKworICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6Y29lZmYoKQorICAgICAgKiBcd2FybmluZyB0aGUgY29vcmRpbmF0ZXMgbXVzdCBmaXQgaW50byB0aGUgcmVmZXJlbmNlZCB0cmlhbmd1bGFyIHBhcnQKKyAgICAgICovCisgICAgaW5saW5lIFNjYWxhciBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBCYXNlOjpjaGVja19jb29yZGluYXRlc19pbnRlcm5hbChyb3csIGNvbCk7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29lZmYocm93LCBjb2wpOworICAgIH0KKworICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6Y29lZmZSZWYoKQorICAgICAgKiBcd2FybmluZyB0aGUgY29vcmRpbmF0ZXMgbXVzdCBmaXQgaW50byB0aGUgcmVmZXJlbmNlZCB0cmlhbmd1bGFyIHBhcnQKKyAgICAgICovCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgQmFzZTo6Y2hlY2tfY29vcmRpbmF0ZXNfaW50ZXJuYWwocm93LCBjb2wpOworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBjb25zdCBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZCYgbmVzdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4OyB9CisgICAgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQmIG5lc3RlZEV4cHJlc3Npb24oKSB7IHJldHVybiAqY29uc3RfY2FzdDxNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZCo+KCZtX21hdHJpeCk7IH0KKworICAgIC8qKiBBc3NpZ25zIGEgdHJpYW5ndWxhciBtYXRyaXggdG8gYSB0cmlhbmd1bGFyIHBhcnQgb2YgYSBkZW5zZSBtYXRyaXggKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgVHJpYW5ndWxhclZpZXcmIG9wZXJhdG9yPShjb25zdCBUcmlhbmd1bGFyQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgVHJpYW5ndWxhclZpZXcmIG9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIFRyaWFuZ3VsYXJWaWV3JiBvcGVyYXRvcj0oY29uc3QgVHJpYW5ndWxhclZpZXcmIG90aGVyKQorICAgIHsgcmV0dXJuICp0aGlzID0gb3RoZXIubmVzdGVkRXhwcmVzc2lvbigpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgdm9pZCBsYXp5QXNzaWduKGNvbnN0IFRyaWFuZ3VsYXJCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIGxhenlBc3NpZ24oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcik7CisKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6OmNvbmp1Z2F0ZSgpICovCisgICAgaW5saW5lIFRyaWFuZ3VsYXJWaWV3PE1hdHJpeENvbmp1Z2F0ZVJldHVyblR5cGUsTW9kZT4gY29uanVnYXRlKCkKKyAgICB7IHJldHVybiBtX21hdHJpeC5jb25qdWdhdGUoKTsgfQorICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6Y29uanVnYXRlKCkgY29uc3QgKi8KKyAgICBpbmxpbmUgY29uc3QgVHJpYW5ndWxhclZpZXc8TWF0cml4Q29uanVnYXRlUmV0dXJuVHlwZSxNb2RlPiBjb25qdWdhdGUoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fbWF0cml4LmNvbmp1Z2F0ZSgpOyB9CisKKyAgICAvKiogXHNhIE1hdHJpeEJhc2U6OmFkam9pbnQoKSBjb25zdCAqLworICAgIGlubGluZSBjb25zdCBUcmlhbmd1bGFyVmlldzxjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpBZGpvaW50UmV0dXJuVHlwZSxUcmFuc3Bvc2VNb2RlPiBhZGpvaW50KCkgY29uc3QKKyAgICB7IHJldHVybiBtX21hdHJpeC5hZGpvaW50KCk7IH0KKworICAgIC8qKiBcc2EgTWF0cml4QmFzZTo6dHJhbnNwb3NlKCkgKi8KKyAgICBpbmxpbmUgVHJpYW5ndWxhclZpZXc8VHJhbnNwb3NlPE1hdHJpeFR5cGU+LFRyYW5zcG9zZU1vZGU+IHRyYW5zcG9zZSgpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9MVkFMVUUoTWF0cml4VHlwZSkKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb25zdF9jYXN0X2Rlcml2ZWQoKS50cmFuc3Bvc2UoKTsKKyAgICB9CisgICAgLyoqIFxzYSBNYXRyaXhCYXNlOjp0cmFuc3Bvc2UoKSBjb25zdCAqLworICAgIGlubGluZSBjb25zdCBUcmlhbmd1bGFyVmlldzxUcmFuc3Bvc2U8TWF0cml4VHlwZT4sVHJhbnNwb3NlTW9kZT4gdHJhbnNwb3NlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXgudHJhbnNwb3NlKCk7CisgICAgfQorCisgICAgLyoqIEVmZmljaWVudCB0cmlhbmd1bGFyIG1hdHJpeCB0aW1lcyB2ZWN0b3IvbWF0cml4IHByb2R1Y3QgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgVHJpYW5ndWxhclByb2R1Y3Q8TW9kZSx0cnVlLE1hdHJpeFR5cGUsZmFsc2UsT3RoZXJEZXJpdmVkLCBPdGhlckRlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZT4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiByaHMpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIFRyaWFuZ3VsYXJQcm9kdWN0CisgICAgICAgICAgICAgIDxNb2RlLHRydWUsTWF0cml4VHlwZSxmYWxzZSxPdGhlckRlcml2ZWQsT3RoZXJEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWU+CisgICAgICAgICAgICAgIChtX21hdHJpeCwgcmhzLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIEVmZmljaWVudCB2ZWN0b3IvbWF0cml4IHRpbWVzIHRyaWFuZ3VsYXIgbWF0cml4IHByb2R1Y3QgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGZyaWVuZAorICAgIFRyaWFuZ3VsYXJQcm9kdWN0PE1vZGUsZmFsc2UsT3RoZXJEZXJpdmVkLE90aGVyRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lLE1hdHJpeFR5cGUsZmFsc2U+CisgICAgb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgbGhzLCBjb25zdCBUcmlhbmd1bGFyVmlldyYgcmhzKQorICAgIHsKKyAgICAgIHJldHVybiBUcmlhbmd1bGFyUHJvZHVjdAorICAgICAgICAgICAgICA8TW9kZSxmYWxzZSxPdGhlckRlcml2ZWQsT3RoZXJEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsTWF0cml4VHlwZSxmYWxzZT4KKyAgICAgICAgICAgICAgKGxocy5kZXJpdmVkKCkscmhzLm1fbWF0cml4KTsKKyAgICB9CisKKyAgICAjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgc3RydWN0IGVpZ2VuMl9wcm9kdWN0X3JldHVybl90eXBlCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLE1vZGU+OjpEZW5zZU1hdHJpeFR5cGUgRGVuc2VNYXRyaXhUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlBsYWluT2JqZWN0OjpEZW5zZVR5cGUgT3RoZXJQbGFpbk9iamVjdDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFJldHVyblR5cGU8RGVuc2VNYXRyaXhUeXBlLCBPdGhlclBsYWluT2JqZWN0Pjo6VHlwZSBQcm9kUmV0VHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZFJldFR5cGU6OlBsYWluT2JqZWN0IHR5cGU7CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgY29uc3QgdHlwZW5hbWUgZWlnZW4yX3Byb2R1Y3RfcmV0dXJuX3R5cGU8T3RoZXJEZXJpdmVkPjo6dHlwZQorICAgIG9wZXJhdG9yKihjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiYgcmhzKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6UGxhaW5PYmplY3Q6OkRlbnNlVHlwZSByaHNQbGFpbk9iamVjdDsKKyAgICAgIHJocy5ldmFsVG8ocmhzUGxhaW5PYmplY3QpOworICAgICAgcmV0dXJuIHRoaXMtPnRvRGVuc2VNYXRyaXgoKSAqIHJoc1BsYWluT2JqZWN0OworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlck1hdHJpeFR5cGU+CisgICAgYm9vbCBpc0FwcHJveChjb25zdCBUcmlhbmd1bGFyVmlldzxPdGhlck1hdHJpeFR5cGUsIE1vZGU+JiBvdGhlciwgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcHJlY2lzaW9uID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiB0aGlzLT50b0RlbnNlTWF0cml4KCkuaXNBcHByb3gob3RoZXIudG9EZW5zZU1hdHJpeCgpLCBwcmVjaXNpb24pOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgYm9vbCBpc0FwcHJveChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBwcmVjaXNpb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIHRoaXMtPnRvRGVuc2VNYXRyaXgoKS5pc0FwcHJveChvdGhlciwgcHJlY2lzaW9uKTsKKyAgICB9CisgICAgI2VuZGlmIC8vIEVJR0VOMl9TVVBQT1JUCisKKyAgICB0ZW1wbGF0ZTxpbnQgU2lkZSwgdHlwZW5hbWUgT3RoZXI+CisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3JldHZhbDxTaWRlLFRyaWFuZ3VsYXJWaWV3LCBPdGhlcj4KKyAgICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPE90aGVyPiYgb3RoZXIpIGNvbnN0OworCisgICAgdGVtcGxhdGU8aW50IFNpZGUsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIHNvbHZlSW5QbGFjZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9yZXR2YWw8T25UaGVMZWZ0LFRyaWFuZ3VsYXJWaWV3LCBPdGhlcj4gCisgICAgc29sdmUoY29uc3QgTWF0cml4QmFzZTxPdGhlcj4mIG90aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIHNvbHZlPE9uVGhlTGVmdD4ob3RoZXIpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgdm9pZCBzb2x2ZUluUGxhY2UoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBzb2x2ZUluUGxhY2U8T25UaGVMZWZ0PihvdGhlcik7IH0KKworICAgIGNvbnN0IFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlTmVzdGVkTm9uUmVmLE1vZGU+IHNlbGZhZGpvaW50VmlldygpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTW9kZSZVbml0RGlhZyk9PTAsUFJPR1JBTU1JTkdfRVJST1IpOworICAgICAgcmV0dXJuIFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlTmVzdGVkTm9uUmVmLE1vZGU+KG1fbWF0cml4KTsKKyAgICB9CisgICAgU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGVOZXN0ZWROb25SZWYsTW9kZT4gc2VsZmFkam9pbnRWaWV3KCkKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChNb2RlJlVuaXREaWFnKT09MCxQUk9HUkFNTUlOR19FUlJPUik7CisgICAgICByZXR1cm4gU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGVOZXN0ZWROb25SZWYsTW9kZT4obV9tYXRyaXgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIHN3YXAoVHJpYW5ndWxhckJhc2U8T3RoZXJEZXJpdmVkPiBjb25zdCAmIG90aGVyKQorICAgIHsKKyAgICAgIFRyaWFuZ3VsYXJWaWV3PFN3YXBXcmFwcGVyPE1hdHJpeFR5cGU+LE1vZGU+KGNvbnN0X2Nhc3Q8TWF0cml4VHlwZSY+KG1fbWF0cml4KSkubGF6eUFzc2lnbihvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIHN3YXAoTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+IGNvbnN0ICYgb3RoZXIpCisgICAgeworICAgICAgU3dhcFdyYXBwZXI8TWF0cml4VHlwZT4gc3dhcGVyKGNvbnN0X2Nhc3Q8TWF0cml4VHlwZSY+KG1fbWF0cml4KSk7CisgICAgICBUcmlhbmd1bGFyVmlldzxTd2FwV3JhcHBlcjxNYXRyaXhUeXBlPixNb2RlPihzd2FwZXIpLmxhenlBc3NpZ24ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICBTY2FsYXIgZGV0ZXJtaW5hbnQoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChNb2RlICYgVW5pdERpYWcpCisgICAgICAgIHJldHVybiAxOworICAgICAgZWxzZSBpZiAoTW9kZSAmIFplcm9EaWFnKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1fbWF0cml4LmRpYWdvbmFsKCkucHJvZCgpOworICAgIH0KKyAgICAKKyAgICAvLyBUT0RPIHNpbXBsaWZ5IHRoZSBmb2xsb3dpbmc6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvZHVjdERlcml2ZWQsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVHJpYW5ndWxhclZpZXcmIG9wZXJhdG9yPShjb25zdCBQcm9kdWN0QmFzZTxQcm9kdWN0RGVyaXZlZCwgTGhzLFJocz4mIG90aGVyKQorICAgIHsKKyAgICAgIHNldFplcm8oKTsKKyAgICAgIHJldHVybiBhc3NpZ25Qcm9kdWN0KG90aGVyLDEpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBUcmlhbmd1bGFyVmlldyYgb3BlcmF0b3IrPShjb25zdCBQcm9kdWN0QmFzZTxQcm9kdWN0RGVyaXZlZCwgTGhzLFJocz4mIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBhc3NpZ25Qcm9kdWN0KG90aGVyLDEpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBUcmlhbmd1bGFyVmlldyYgb3BlcmF0b3ItPShjb25zdCBQcm9kdWN0QmFzZTxQcm9kdWN0RGVyaXZlZCwgTGhzLFJocz4mIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBhc3NpZ25Qcm9kdWN0KG90aGVyLC0xKTsKKyAgICB9CisgICAgCisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvZHVjdERlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBUcmlhbmd1bGFyVmlldyYgb3BlcmF0b3I9KGNvbnN0IFNjYWxlZFByb2R1Y3Q8UHJvZHVjdERlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBzZXRaZXJvKCk7CisgICAgICByZXR1cm4gYXNzaWduUHJvZHVjdChvdGhlcixvdGhlci5hbHBoYSgpKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvZHVjdERlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBUcmlhbmd1bGFyVmlldyYgb3BlcmF0b3IrPShjb25zdCBTY2FsZWRQcm9kdWN0PFByb2R1Y3REZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgcmV0dXJuIGFzc2lnblByb2R1Y3Qob3RoZXIsb3RoZXIuYWxwaGEoKSk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByb2R1Y3REZXJpdmVkPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgVHJpYW5ndWxhclZpZXcmIG9wZXJhdG9yLT0oY29uc3QgU2NhbGVkUHJvZHVjdDxQcm9kdWN0RGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIHJldHVybiBhc3NpZ25Qcm9kdWN0KG90aGVyLC1vdGhlci5hbHBoYSgpKTsKKyAgICB9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBUcmlhbmd1bGFyVmlldyYgYXNzaWduUHJvZHVjdChjb25zdCBQcm9kdWN0QmFzZTxQcm9kdWN0RGVyaXZlZCwgTGhzLFJocz4mIHByb2QsIGNvbnN0IFNjYWxhciYgYWxwaGEpOworCisgICAgTWF0cml4VHlwZU5lc3RlZCBtX21hdHJpeDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgdHJpYW5ndWxhciBldmFsdWF0aW9uL2Fzc2lnbm1lbnQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCB1bnNpZ25lZCBpbnQgTW9kZSwgaW50IFVucm9sbENvdW50LCBib29sIENsZWFyT3Bwb3NpdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9hc3NpZ25tZW50X3NlbGVjdG9yCit7CisgIGVudW0geworICAgIGNvbCA9IChVbnJvbGxDb3VudC0xKSAvIERlcml2ZWQxOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICByb3cgPSAoVW5yb2xsQ291bnQtMSkgJSBEZXJpdmVkMTo6Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKyAgCisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDE6OlNjYWxhciBTY2FsYXI7CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihEZXJpdmVkMSAmZHN0LCBjb25zdCBEZXJpdmVkMiAmc3JjKQorICB7CisgICAgdHJpYW5ndWxhcl9hc3NpZ25tZW50X3NlbGVjdG9yPERlcml2ZWQxLCBEZXJpdmVkMiwgTW9kZSwgVW5yb2xsQ291bnQtMSwgQ2xlYXJPcHBvc2l0ZT46OnJ1bihkc3QsIHNyYyk7CisKKyAgICBlaWdlbl9hc3NlcnQoIE1vZGUgPT0gVXBwZXIgfHwgTW9kZSA9PSBMb3dlcgorICAgICAgICAgICAgfHwgTW9kZSA9PSBTdHJpY3RseVVwcGVyIHx8IE1vZGUgPT0gU3RyaWN0bHlMb3dlcgorICAgICAgICAgICAgfHwgTW9kZSA9PSBVbml0VXBwZXIgfHwgTW9kZSA9PSBVbml0TG93ZXIpOworICAgIGlmKChNb2RlID09IFVwcGVyICYmIHJvdyA8PSBjb2wpCisgICAgfHwgKE1vZGUgPT0gTG93ZXIgJiYgcm93ID49IGNvbCkKKyAgICB8fCAoTW9kZSA9PSBTdHJpY3RseVVwcGVyICYmIHJvdyA8IGNvbCkKKyAgICB8fCAoTW9kZSA9PSBTdHJpY3RseUxvd2VyICYmIHJvdyA+IGNvbCkKKyAgICB8fCAoTW9kZSA9PSBVbml0VXBwZXIgJiYgcm93IDwgY29sKQorICAgIHx8IChNb2RlID09IFVuaXRMb3dlciAmJiByb3cgPiBjb2wpKQorICAgICAgZHN0LmNvcHlDb2VmZihyb3csIGNvbCwgc3JjKTsKKyAgICBlbHNlIGlmKENsZWFyT3Bwb3NpdGUpCisgICAgeworICAgICAgaWYgKE1vZGUmVW5pdERpYWcgJiYgcm93PT1jb2wpCisgICAgICAgIGRzdC5jb2VmZlJlZihyb3csIGNvbCkgPSBTY2FsYXIoMSk7CisgICAgICBlbHNlCisgICAgICAgIGRzdC5jb2VmZlJlZihyb3csIGNvbCkgPSBTY2FsYXIoMCk7CisgICAgfQorICB9Cit9OworCisvLyBwcmV2ZW50IGJ1Z2d5IHVzZXIgY29kZSBmcm9tIGNhdXNpbmcgYW4gaW5maW5pdGUgcmVjdXJzaW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDIsIHVuc2lnbmVkIGludCBNb2RlLCBib29sIENsZWFyT3Bwb3NpdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9hc3NpZ25tZW50X3NlbGVjdG9yPERlcml2ZWQxLCBEZXJpdmVkMiwgTW9kZSwgMCwgQ2xlYXJPcHBvc2l0ZT4KK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihEZXJpdmVkMSAmLCBjb25zdCBEZXJpdmVkMiAmKSB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyLCBib29sIENsZWFyT3Bwb3NpdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9hc3NpZ25tZW50X3NlbGVjdG9yPERlcml2ZWQxLCBEZXJpdmVkMiwgVXBwZXIsIER5bmFtaWMsIENsZWFyT3Bwb3NpdGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDE6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQxOjpTY2FsYXIgU2NhbGFyOworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKERlcml2ZWQxICZkc3QsIGNvbnN0IERlcml2ZWQyICZzcmMpCisgIHsKKyAgICBmb3IoSW5kZXggaiA9IDA7IGogPCBkc3QuY29scygpOyArK2opCisgICAgeworICAgICAgSW5kZXggbWF4aSA9IChzdGQ6Om1pbikoaiwgZHN0LnJvd3MoKS0xKTsKKyAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8PSBtYXhpOyArK2kpCisgICAgICAgIGRzdC5jb3B5Q29lZmYoaSwgaiwgc3JjKTsKKyAgICAgIGlmIChDbGVhck9wcG9zaXRlKQorICAgICAgICBmb3IoSW5kZXggaSA9IG1heGkrMTsgaSA8IGRzdC5yb3dzKCk7ICsraSkKKyAgICAgICAgICBkc3QuY29lZmZSZWYoaSwgaikgPSBTY2FsYXIoMCk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDIsIGJvb2wgQ2xlYXJPcHBvc2l0ZT4KK3N0cnVjdCB0cmlhbmd1bGFyX2Fzc2lnbm1lbnRfc2VsZWN0b3I8RGVyaXZlZDEsIERlcml2ZWQyLCBMb3dlciwgRHluYW1pYywgQ2xlYXJPcHBvc2l0ZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkMTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICAgIGZvcihJbmRleCBqID0gMDsgaiA8IGRzdC5jb2xzKCk7ICsraikKKyAgICB7CisgICAgICBmb3IoSW5kZXggaSA9IGo7IGkgPCBkc3Qucm93cygpOyArK2kpCisgICAgICAgIGRzdC5jb3B5Q29lZmYoaSwgaiwgc3JjKTsKKyAgICAgIEluZGV4IG1heGkgPSAoc3RkOjptaW4pKGosIGRzdC5yb3dzKCkpOworICAgICAgaWYgKENsZWFyT3Bwb3NpdGUpCisgICAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG1heGk7ICsraSkKKyAgICAgICAgICBkc3QuY29lZmZSZWYoaSwgaikgPSBzdGF0aWNfY2FzdDx0eXBlbmFtZSBEZXJpdmVkMTo6U2NhbGFyPigwKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgYm9vbCBDbGVhck9wcG9zaXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfYXNzaWdubWVudF9zZWxlY3RvcjxEZXJpdmVkMSwgRGVyaXZlZDIsIFN0cmljdGx5VXBwZXIsIER5bmFtaWMsIENsZWFyT3Bwb3NpdGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDE6OkluZGV4IEluZGV4OworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKERlcml2ZWQxICZkc3QsIGNvbnN0IERlcml2ZWQyICZzcmMpCisgIHsKKyAgICBmb3IoSW5kZXggaiA9IDA7IGogPCBkc3QuY29scygpOyArK2opCisgICAgeworICAgICAgSW5kZXggbWF4aSA9IChzdGQ6Om1pbikoaiwgZHN0LnJvd3MoKSk7CisgICAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBtYXhpOyArK2kpCisgICAgICAgIGRzdC5jb3B5Q29lZmYoaSwgaiwgc3JjKTsKKyAgICAgIGlmIChDbGVhck9wcG9zaXRlKQorICAgICAgICBmb3IoSW5kZXggaSA9IG1heGk7IGkgPCBkc3Qucm93cygpOyArK2kpCisgICAgICAgICAgZHN0LmNvZWZmUmVmKGksIGopID0gMDsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgYm9vbCBDbGVhck9wcG9zaXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfYXNzaWdubWVudF9zZWxlY3RvcjxEZXJpdmVkMSwgRGVyaXZlZDIsIFN0cmljdGx5TG93ZXIsIER5bmFtaWMsIENsZWFyT3Bwb3NpdGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDE6OkluZGV4IEluZGV4OworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKERlcml2ZWQxICZkc3QsIGNvbnN0IERlcml2ZWQyICZzcmMpCisgIHsKKyAgICBmb3IoSW5kZXggaiA9IDA7IGogPCBkc3QuY29scygpOyArK2opCisgICAgeworICAgICAgZm9yKEluZGV4IGkgPSBqKzE7IGkgPCBkc3Qucm93cygpOyArK2kpCisgICAgICAgIGRzdC5jb3B5Q29lZmYoaSwgaiwgc3JjKTsKKyAgICAgIEluZGV4IG1heGkgPSAoc3RkOjptaW4pKGosIGRzdC5yb3dzKCktMSk7CisgICAgICBpZiAoQ2xlYXJPcHBvc2l0ZSkKKyAgICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDw9IG1heGk7ICsraSkKKyAgICAgICAgICBkc3QuY29lZmZSZWYoaSwgaikgPSBzdGF0aWNfY2FzdDx0eXBlbmFtZSBEZXJpdmVkMTo6U2NhbGFyPigwKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgYm9vbCBDbGVhck9wcG9zaXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfYXNzaWdubWVudF9zZWxlY3RvcjxEZXJpdmVkMSwgRGVyaXZlZDIsIFVuaXRVcHBlciwgRHluYW1pYywgQ2xlYXJPcHBvc2l0ZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkMTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICAgIGZvcihJbmRleCBqID0gMDsgaiA8IGRzdC5jb2xzKCk7ICsraikKKyAgICB7CisgICAgICBJbmRleCBtYXhpID0gKHN0ZDo6bWluKShqLCBkc3Qucm93cygpKTsKKyAgICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG1heGk7ICsraSkKKyAgICAgICAgZHN0LmNvcHlDb2VmZihpLCBqLCBzcmMpOworICAgICAgaWYgKENsZWFyT3Bwb3NpdGUpCisgICAgICB7CisgICAgICAgIGZvcihJbmRleCBpID0gbWF4aSsxOyBpIDwgZHN0LnJvd3MoKTsgKytpKQorICAgICAgICAgIGRzdC5jb2VmZlJlZihpLCBqKSA9IDA7CisgICAgICB9CisgICAgfQorICAgIGRzdC5kaWFnb25hbCgpLnNldE9uZXMoKTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMiwgYm9vbCBDbGVhck9wcG9zaXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfYXNzaWdubWVudF9zZWxlY3RvcjxEZXJpdmVkMSwgRGVyaXZlZDIsIFVuaXRMb3dlciwgRHluYW1pYywgQ2xlYXJPcHBvc2l0ZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkMTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICAgIGZvcihJbmRleCBqID0gMDsgaiA8IGRzdC5jb2xzKCk7ICsraikKKyAgICB7CisgICAgICBJbmRleCBtYXhpID0gKHN0ZDo6bWluKShqLCBkc3Qucm93cygpKTsKKyAgICAgIGZvcihJbmRleCBpID0gbWF4aSsxOyBpIDwgZHN0LnJvd3MoKTsgKytpKQorICAgICAgICBkc3QuY29weUNvZWZmKGksIGosIHNyYyk7CisgICAgICBpZiAoQ2xlYXJPcHBvc2l0ZSkKKyAgICAgIHsKKyAgICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbWF4aTsgKytpKQorICAgICAgICAgIGRzdC5jb2VmZlJlZihpLCBqKSA9IDA7CisgICAgICB9CisgICAgfQorICAgIGRzdC5kaWFnb25hbCgpLnNldE9uZXMoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEZJWE1FIHNob3VsZCB3ZSBrZWVwIHRoYXQgcG9zc2liaWxpdHkKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgoraW5saW5lIFRyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsIE1vZGU+JgorVHJpYW5ndWxhclZpZXc8TWF0cml4VHlwZSwgTW9kZT46Om9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBpZihPdGhlckRlcml2ZWQ6OkZsYWdzICYgRXZhbEJlZm9yZUFzc2lnbmluZ0JpdCkKKyAgeworICAgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZTxPdGhlckRlcml2ZWQ+Ojp0eXBlIG90aGVyX2V2YWx1YXRlZChvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisgICAgb3RoZXJfZXZhbHVhdGVkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkubGF6eUFzc2lnbihvdGhlci5kZXJpdmVkKCkpOworICAgIGxhenlBc3NpZ24ob3RoZXJfZXZhbHVhdGVkKTsKKyAgfQorICBlbHNlCisgICAgbGF6eUFzc2lnbihvdGhlci5kZXJpdmVkKCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIEZJWE1FIHNob3VsZCB3ZSBrZWVwIHRoYXQgcG9zc2liaWxpdHkKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLCBNb2RlPjo6bGF6eUFzc2lnbihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBlbnVtIHsKKyAgICB1bnJvbGwgPSBNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSAhPSBEeW5hbWljCisgICAgICAgICAgJiYgaW50ZXJuYWw6OnRyYWl0czxPdGhlckRlcml2ZWQ+OjpDb2VmZlJlYWRDb3N0ICE9IER5bmFtaWMKKyAgICAgICAgICAmJiBNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSppbnRlcm5hbDo6dHJhaXRzPE90aGVyRGVyaXZlZD46OkNvZWZmUmVhZENvc3QvMiA8PSBFSUdFTl9VTlJPTExJTkdfTElNSVQKKyAgfTsKKyAgZWlnZW5fYXNzZXJ0KG1fbWF0cml4LnJvd3MoKSA9PSBvdGhlci5yb3dzKCkgJiYgbV9tYXRyaXguY29scygpID09IG90aGVyLmNvbHMoKSk7CisKKyAgaW50ZXJuYWw6OnRyaWFuZ3VsYXJfYXNzaWdubWVudF9zZWxlY3RvcgorICAgIDxNYXRyaXhUeXBlLCBPdGhlckRlcml2ZWQsIGludChNb2RlKSwKKyAgICB1bnJvbGwgPyBpbnQoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUpIDogRHluYW1pYywKKyAgICBmYWxzZSAvLyBkbyBub3QgY2hhbmdlIHRoZSBvcHBvc2l0ZSB0cmlhbmd1bGFyIHBhcnQKKyAgICA+OjpydW4obV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgTW9kZT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLCBNb2RlPiYKK1RyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsIE1vZGU+OjpvcGVyYXRvcj0oY29uc3QgVHJpYW5ndWxhckJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIGVpZ2VuX2Fzc2VydChNb2RlID09IGludChPdGhlckRlcml2ZWQ6Ok1vZGUpKTsKKyAgaWYoaW50ZXJuYWw6OnRyYWl0czxPdGhlckRlcml2ZWQ+OjpGbGFncyAmIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQpCisgIHsKKyAgICB0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OkRlbnNlTWF0cml4VHlwZSBvdGhlcl9ldmFsdWF0ZWQob3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpOworICAgIG90aGVyX2V2YWx1YXRlZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLmxhenlBc3NpZ24ob3RoZXIuZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKSk7CisgICAgbGF6eUFzc2lnbihvdGhlcl9ldmFsdWF0ZWQpOworICB9CisgIGVsc2UKKyAgICBsYXp5QXNzaWduKG90aGVyLmRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLCBNb2RlPjo6bGF6eUFzc2lnbihjb25zdCBUcmlhbmd1bGFyQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgZW51bSB7CisgICAgdW5yb2xsID0gTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gRHluYW1pYworICAgICAgICAgICAgICAgICAgICYmIGludGVybmFsOjp0cmFpdHM8T3RoZXJEZXJpdmVkPjo6Q29lZmZSZWFkQ29zdCAhPSBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgJiYgTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgKiBpbnRlcm5hbDo6dHJhaXRzPE90aGVyRGVyaXZlZD46OkNvZWZmUmVhZENvc3QgLyAyCisgICAgICAgICAgICAgICAgICAgICAgICA8PSBFSUdFTl9VTlJPTExJTkdfTElNSVQKKyAgfTsKKyAgZWlnZW5fYXNzZXJ0KG1fbWF0cml4LnJvd3MoKSA9PSBvdGhlci5yb3dzKCkgJiYgbV9tYXRyaXguY29scygpID09IG90aGVyLmNvbHMoKSk7CisKKyAgaW50ZXJuYWw6OnRyaWFuZ3VsYXJfYXNzaWdubWVudF9zZWxlY3RvcgorICAgIDxNYXRyaXhUeXBlLCBPdGhlckRlcml2ZWQsIGludChNb2RlKSwKKyAgICB1bnJvbGwgPyBpbnQoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUpIDogRHluYW1pYywKKyAgICBmYWxzZSAvLyBwcmVzZXJ2ZSB0aGUgb3Bwb3NpdGUgdHJpYW5ndWxhciBwYXJ0CisgICAgPjo6cnVuKG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBUcmlhbmd1bGFyQmFzZSBtZXRob2RzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBBc3NpZ25zIGEgdHJpYW5ndWxhciBvciBzZWxmYWRqb2ludCBtYXRyaXggdG8gYSBkZW5zZSBtYXRyaXguCisgICogSWYgdGhlIG1hdHJpeCBpcyB0cmlhbmd1bGFyLCB0aGUgb3Bwb3NpdGUgcGFydCBpcyBzZXQgdG8gemVyby4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZURlcml2ZWQ+Cit2b2lkIFRyaWFuZ3VsYXJCYXNlPERlcml2ZWQ+OjpldmFsVG8oTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgaWYoaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MgJiBFdmFsQmVmb3JlQXNzaWduaW5nQml0KQorICB7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlPERlcml2ZWQ+Ojp0eXBlIG90aGVyX2V2YWx1YXRlZChyb3dzKCksIGNvbHMoKSk7CisgICAgZXZhbFRvTGF6eShvdGhlcl9ldmFsdWF0ZWQpOworICAgIG90aGVyLmRlcml2ZWQoKS5zd2FwKG90aGVyX2V2YWx1YXRlZCk7CisgIH0KKyAgZWxzZQorICAgIGV2YWxUb0xhenkob3RoZXIuZGVyaXZlZCgpKTsKK30KKworLyoqIEFzc2lnbnMgYSB0cmlhbmd1bGFyIG9yIHNlbGZhZGpvaW50IG1hdHJpeCB0byBhIGRlbnNlIG1hdHJpeC4KKyAgKiBJZiB0aGUgbWF0cml4IGlzIHRyaWFuZ3VsYXIsIHRoZSBvcHBvc2l0ZSBwYXJ0IGlzIHNldCB0byB6ZXJvLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIERlbnNlRGVyaXZlZD4KK3ZvaWQgVHJpYW5ndWxhckJhc2U8RGVyaXZlZD46OmV2YWxUb0xhenkoTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgZW51bSB7CisgICAgdW5yb2xsID0gRGVuc2VEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSAhPSBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgJiYgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29lZmZSZWFkQ29zdCAhPSBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgJiYgRGVuc2VEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSAqIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvZWZmUmVhZENvc3QgLyAyCisgICAgICAgICAgICAgICAgICAgICAgICA8PSBFSUdFTl9VTlJPTExJTkdfTElNSVQKKyAgfTsKKyAgb3RoZXIuZGVyaXZlZCgpLnJlc2l6ZSh0aGlzLT5yb3dzKCksIHRoaXMtPmNvbHMoKSk7CisKKyAgaW50ZXJuYWw6OnRyaWFuZ3VsYXJfYXNzaWdubWVudF9zZWxlY3RvcgorICAgIDxEZW5zZURlcml2ZWQsIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkLCBEZXJpdmVkOjpNb2RlLAorICAgIHVucm9sbCA/IGludChEZW5zZURlcml2ZWQ6OlNpemVBdENvbXBpbGVUaW1lKSA6IER5bmFtaWMsCisgICAgdHJ1ZSAvLyBjbGVhciB0aGUgb3Bwb3NpdGUgdHJpYW5ndWxhciBwYXJ0CisgICAgPjo6cnVuKG90aGVyLmRlcml2ZWQoKSwgZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgVHJpYW5ndWxhclZpZXcgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIE1hdHJpeEJhc2UgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKworLy8gaW1wbGVtZW50YXRpb24gb2YgcGFydDw+KCksIGluY2x1ZGluZyB0aGUgU2VsZkFkam9pbnQgY2FzZS4KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBNb2RlPgorc3RydWN0IGVpZ2VuMl9wYXJ0X3JldHVybl90eXBlCit7CisgIHR5cGVkZWYgVHJpYW5ndWxhclZpZXc8TWF0cml4VHlwZSwgTW9kZT4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgZWlnZW4yX3BhcnRfcmV0dXJuX3R5cGU8TWF0cml4VHlwZSwgU2VsZkFkam9pbnQ+Cit7CisgIHR5cGVkZWYgU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsIFVwcGVyPiB0eXBlOworfTsKK30KKworLyoqIFxkZXByZWNhdGVkIHVzZSBNYXRyaXhCYXNlOjp0cmlhbmd1bGFyVmlldygpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dW5zaWduZWQgaW50IE1vZGU+Citjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6ZWlnZW4yX3BhcnRfcmV0dXJuX3R5cGU8RGVyaXZlZCwgTW9kZT46OnR5cGUgTWF0cml4QmFzZTxEZXJpdmVkPjo6cGFydCgpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCB1c2UgTWF0cml4QmFzZTo6dHJpYW5ndWxhclZpZXcoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHVuc2lnbmVkIGludCBNb2RlPgordHlwZW5hbWUgaW50ZXJuYWw6OmVpZ2VuMl9wYXJ0X3JldHVybl90eXBlPERlcml2ZWQsIE1vZGU+Ojp0eXBlIE1hdHJpeEJhc2U8RGVyaXZlZD46OnBhcnQoKQoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorI2VuZGlmCisKKy8qKgorICAqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSB0cmlhbmd1bGFyIHZpZXcgZXh0cmFjdGVkIGZyb20gdGhlIGN1cnJlbnQgbWF0cml4CisgICoKKyAgKiBUaGUgcGFyYW1ldGVyIFxhIE1vZGUgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IFxjICNVcHBlciwgXGMgI1N0cmljdGx5VXBwZXIsIFxjICNVbml0VXBwZXIsCisgICogXGMgI0xvd2VyLCBcYyAjU3RyaWN0bHlMb3dlciwgXGMgI1VuaXRMb3dlci4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfZXh0cmFjdC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2V4dHJhY3Qub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgVHJpYW5ndWxhclZpZXcKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQgTW9kZT4KK3R5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIFRyaWFuZ3VsYXJWaWV3UmV0dXJuVHlwZTxNb2RlPjo6VHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6dHJpYW5ndWxhclZpZXcoKQoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBNYXRyaXhCYXNlOjp0cmlhbmd1bGFyVmlldygpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dW5zaWduZWQgaW50IE1vZGU+Cit0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+Ojp0ZW1wbGF0ZSBDb25zdFRyaWFuZ3VsYXJWaWV3UmV0dXJuVHlwZTxNb2RlPjo6VHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6dHJpYW5ndWxhclZpZXcoKSBjb25zdAoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LAorICAqICAgICAgICAgIHdpdGhpbiB0aGUgcHJlY2lzaW9uIGdpdmVuIGJ5IFxhIHByZWMuCisgICoKKyAgKiBcc2EgaXNMb3dlclRyaWFuZ3VsYXIoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgTWF0cml4QmFzZTxEZXJpdmVkPjo6aXNVcHBlclRyaWFuZ3VsYXIoUmVhbFNjYWxhciBwcmVjKSBjb25zdAoreworICBSZWFsU2NhbGFyIG1heEFic09uVXBwZXJQYXJ0ID0gc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oLTEpOworICBmb3IoSW5kZXggaiA9IDA7IGogPCBjb2xzKCk7ICsraikKKyAgeworICAgIEluZGV4IG1heGkgPSAoc3RkOjptaW4pKGosIHJvd3MoKS0xKTsKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPD0gbWF4aTsgKytpKQorICAgIHsKKyAgICAgIFJlYWxTY2FsYXIgYWJzVmFsdWUgPSBpbnRlcm5hbDo6YWJzKGNvZWZmKGksaikpOworICAgICAgaWYoYWJzVmFsdWUgPiBtYXhBYnNPblVwcGVyUGFydCkgbWF4QWJzT25VcHBlclBhcnQgPSBhYnNWYWx1ZTsKKyAgICB9CisgIH0KKyAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPSBtYXhBYnNPblVwcGVyUGFydCAqIHByZWM7CisgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHMoKTsgKytqKQorICAgIGZvcihJbmRleCBpID0gaisxOyBpIDwgcm93cygpOyArK2kpCisgICAgICBpZihpbnRlcm5hbDo6YWJzKGNvZWZmKGksIGopKSA+IHRocmVzaG9sZCkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LAorICAqICAgICAgICAgIHdpdGhpbiB0aGUgcHJlY2lzaW9uIGdpdmVuIGJ5IFxhIHByZWMuCisgICoKKyAgKiBcc2EgaXNVcHBlclRyaWFuZ3VsYXIoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgTWF0cml4QmFzZTxEZXJpdmVkPjo6aXNMb3dlclRyaWFuZ3VsYXIoUmVhbFNjYWxhciBwcmVjKSBjb25zdAoreworICBSZWFsU2NhbGFyIG1heEFic09uTG93ZXJQYXJ0ID0gc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oLTEpOworICBmb3IoSW5kZXggaiA9IDA7IGogPCBjb2xzKCk7ICsraikKKyAgICBmb3IoSW5kZXggaSA9IGo7IGkgPCByb3dzKCk7ICsraSkKKyAgICB7CisgICAgICBSZWFsU2NhbGFyIGFic1ZhbHVlID0gaW50ZXJuYWw6OmFicyhjb2VmZihpLGopKTsKKyAgICAgIGlmKGFic1ZhbHVlID4gbWF4QWJzT25Mb3dlclBhcnQpIG1heEFic09uTG93ZXJQYXJ0ID0gYWJzVmFsdWU7CisgICAgfQorICBSZWFsU2NhbGFyIHRocmVzaG9sZCA9IG1heEFic09uTG93ZXJQYXJ0ICogcHJlYzsKKyAgZm9yKEluZGV4IGogPSAxOyBqIDwgY29scygpOyArK2opCisgIHsKKyAgICBJbmRleCBtYXhpID0gKHN0ZDo6bWluKShqLCByb3dzKCktMSk7CisgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbWF4aTsgKytpKQorICAgICAgaWYoaW50ZXJuYWw6OmFicyhjb2VmZihpLCBqKSkgPiB0aHJlc2hvbGQpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUklBTkdVTEFSTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1ZlY3RvckJsb2NrLmggYi9FaWdlbi9zcmMvQ29yZS9WZWN0b3JCbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGVmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9WZWN0b3JCbG9jay5oCkBAIC0wLDAgKzEsMjg0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1ZFQ1RPUkJMT0NLX0gKKyNkZWZpbmUgRUlHRU5fVkVDVE9SQkxPQ0tfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxjbGFzcyBWZWN0b3JCbG9jaworICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiBvZiBhIGZpeGVkLXNpemUgb3IgZHluYW1pYy1zaXplIHN1Yi12ZWN0b3IKKyAgKgorICAqIFxwYXJhbSBWZWN0b3JUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaW4gd2hpY2ggd2UgYXJlIHRha2luZyBhIHN1Yi12ZWN0b3IKKyAgKiBccGFyYW0gU2l6ZSBzaXplIG9mIHRoZSBzdWItdmVjdG9yIHdlIGFyZSB0YWtpbmcgYXQgY29tcGlsZSB0aW1lIChvcHRpb25hbCkKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIG9mIGVpdGhlciBhIGZpeGVkLXNpemUgb3IgZHluYW1pYy1zaXplIHN1Yi12ZWN0b3IuCisgICogSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIERlbnNlQmFzZTo6c2VnbWVudChJbmRleCxJbmRleCkgYW5kIERlbnNlQmFzZTo6c2VnbWVudDxpbnQ+KEluZGV4KSBhbmQKKyAgKiBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBIb3dldmVyLCBpZiB5b3Ugd2FudCB0byBkaXJlY3RseSBtYW5pcHV0YXRlIHN1Yi12ZWN0b3IgZXhwcmVzc2lvbnMsCisgICogZm9yIGluc3RhbmNlIGlmIHlvdSB3YW50IHRvIHdyaXRlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHN1Y2ggYW4gZXhwcmVzc2lvbiwgeW91CisgICogd2lsbCBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLgorICAqCisgICogSGVyZSBpcyBhbiBleGFtcGxlIGlsbHVzdHJhdGluZyB0aGUgZHluYW1pYyBjYXNlOgorICAqIFxpbmNsdWRlIGNsYXNzX1ZlY3RvckJsb2NrLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX1ZlY3RvckJsb2NrLm91dAorICAqCisgICogXG5vdGUgRXZlbiB0aG91Z2ggdGhpcyBleHByZXNzaW9uIGhhcyBkeW5hbWljIHNpemUsIGluIHRoZSBjYXNlIHdoZXJlIFxhIFZlY3RvclR5cGUKKyAgKiBoYXMgZml4ZWQgc2l6ZSwgdGhpcyBleHByZXNzaW9uIGluaGVyaXRzIGEgZml4ZWQgbWF4aW1hbCBzaXplIHdoaWNoIG1lYW5zIHRoYXQgZXZhbHVhdGluZworICAqIGl0IGRvZXMgbm90IGNhdXNlIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgKgorICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBpbGx1c3RyYXRpbmcgdGhlIGZpeGVkLXNpemUgY2FzZToKKyAgKiBcaW5jbHVkZSBjbGFzc19GaXhlZFZlY3RvckJsb2NrLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX0ZpeGVkVmVjdG9yQmxvY2sub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2ssIERlbnNlQmFzZTo6c2VnbWVudChJbmRleCxJbmRleCxJbmRleCxJbmRleCksIERlbnNlQmFzZTo6c2VnbWVudChJbmRleCxJbmRleCkKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGUsIGludCBTaXplPgorc3RydWN0IHRyYWl0czxWZWN0b3JCbG9jazxWZWN0b3JUeXBlLCBTaXplPiA+CisgIDogcHVibGljIHRyYWl0czxCbG9jazxWZWN0b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgdHJhaXRzPFZlY3RvclR5cGU+OjpGbGFncyAmIFJvd01ham9yQml0ID8gMSA6IFNpemUsCisgICAgICAgICAgICAgICAgICAgICB0cmFpdHM8VmVjdG9yVHlwZT46OkZsYWdzICYgUm93TWFqb3JCaXQgPyBTaXplIDogMT4gPgoreworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZSwgaW50IFNpemU+IGNsYXNzIFZlY3RvckJsb2NrCisgIDogcHVibGljIEJsb2NrPFZlY3RvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPFZlY3RvclR5cGU+OjpGbGFncyAmIFJvd01ham9yQml0ID8gMSA6IFNpemUsCisgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPFZlY3RvclR5cGU+OjpGbGFncyAmIFJvd01ham9yQml0ID8gU2l6ZSA6IDE+Cit7CisgICAgdHlwZWRlZiBCbG9jazxWZWN0b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxWZWN0b3JUeXBlPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCA/IDEgOiBTaXplLAorICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxWZWN0b3JUeXBlPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCA/IFNpemUgOiAxPiBCYXNlOworICAgIGVudW0geworICAgICAgSXNDb2xWZWN0b3IgPSAhKGludGVybmFsOjp0cmFpdHM8VmVjdG9yVHlwZT46OkZsYWdzICYgUm93TWFqb3JCaXQpCisgICAgfTsKKyAgcHVibGljOgorICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoVmVjdG9yQmxvY2spCisKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvcj07CisKKyAgICAvKiogRHluYW1pYy1zaXplIGNvbnN0cnVjdG9yCisgICAgICAqLworICAgIGlubGluZSBWZWN0b3JCbG9jayhWZWN0b3JUeXBlJiB2ZWN0b3IsIEluZGV4IHN0YXJ0LCBJbmRleCBzaXplKQorICAgICAgOiBCYXNlKHZlY3RvciwKKyAgICAgICAgICAgICBJc0NvbFZlY3RvciA/IHN0YXJ0IDogMCwgSXNDb2xWZWN0b3IgPyAwIDogc3RhcnQsCisgICAgICAgICAgICAgSXNDb2xWZWN0b3IgPyBzaXplICA6IDEsIElzQ29sVmVjdG9yID8gMSA6IHNpemUpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShWZWN0b3JCbG9jayk7CisgICAgfQorCisgICAgLyoqIEZpeGVkLXNpemUgY29uc3RydWN0b3IKKyAgICAgICovCisgICAgaW5saW5lIFZlY3RvckJsb2NrKFZlY3RvclR5cGUmIHZlY3RvciwgSW5kZXggc3RhcnQpCisgICAgICA6IEJhc2UodmVjdG9yLCBJc0NvbFZlY3RvciA/IHN0YXJ0IDogMCwgSXNDb2xWZWN0b3IgPyAwIDogc3RhcnQpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShWZWN0b3JCbG9jayk7CisgICAgfQorfTsKKworCisvKiogXHJldHVybnMgYSBkeW5hbWljLXNpemUgZXhwcmVzc2lvbiBvZiBhIHNlZ21lbnQgKGkuZS4gYSB2ZWN0b3IgYmxvY2spIGluICp0aGlzLgorICAqCisgICogXG9ubHlfZm9yX3ZlY3RvcnMKKyAgKgorICAqIFxwYXJhbSBzdGFydCB0aGUgZmlyc3QgY29lZmZpY2llbnQgaW4gdGhlIHNlZ21lbnQKKyAgKiBccGFyYW0gc2l6ZSB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpbiB0aGUgc2VnbWVudAorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9zZWdtZW50X2ludF9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9zZWdtZW50X2ludF9pbnQub3V0CisgICoKKyAgKiBcbm90ZSBFdmVuIHRob3VnaCB0aGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBoYXMgZHluYW1pYyBzaXplLCBpbiB0aGUgY2FzZQorICAqIHdoZW4gaXQgaXMgYXBwbGllZCB0byBhIGZpeGVkLXNpemUgdmVjdG9yLCBpdCBpbmhlcml0cyBhIGZpeGVkIG1heGltYWwgc2l6ZSwKKyAgKiB3aGljaCBtZWFucyB0aGF0IGV2YWx1YXRpbmcgaXQgZG9lcyBub3QgY2F1c2UgYSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBzZWdtZW50KEluZGV4KQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OlNlZ21lbnRSZXR1cm5UeXBlCitEZW5zZUJhc2U8RGVyaXZlZD46OnNlZ21lbnQoSW5kZXggc3RhcnQsIEluZGV4IHNpemUpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIFNlZ21lbnRSZXR1cm5UeXBlKGRlcml2ZWQoKSwgc3RhcnQsIHNpemUpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBzZWdtZW50KEluZGV4LEluZGV4KS4qLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0U2VnbWVudFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6c2VnbWVudChJbmRleCBzdGFydCwgSW5kZXggc2l6ZSkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gQ29uc3RTZWdtZW50UmV0dXJuVHlwZShkZXJpdmVkKCksIHN0YXJ0LCBzaXplKTsKK30KKworLyoqIFxyZXR1cm5zIGEgZHluYW1pYy1zaXplIGV4cHJlc3Npb24gb2YgdGhlIGZpcnN0IGNvZWZmaWNpZW50cyBvZiAqdGhpcy4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBccGFyYW0gc2l6ZSB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpbiB0aGUgYmxvY2sKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfc3RhcnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfc3RhcnRfaW50Lm91dAorICAqCisgICogXG5vdGUgRXZlbiB0aG91Z2ggdGhlIHJldHVybmVkIGV4cHJlc3Npb24gaGFzIGR5bmFtaWMgc2l6ZSwgaW4gdGhlIGNhc2UKKyAgKiB3aGVuIGl0IGlzIGFwcGxpZWQgdG8gYSBmaXhlZC1zaXplIHZlY3RvciwgaXQgaW5oZXJpdHMgYSBmaXhlZCBtYXhpbWFsIHNpemUsCisgICogd2hpY2ggbWVhbnMgdGhhdCBldmFsdWF0aW5nIGl0IGRvZXMgbm90IGNhdXNlIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6U2VnbWVudFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6aGVhZChJbmRleCBzaXplKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIHJldHVybiBTZWdtZW50UmV0dXJuVHlwZShkZXJpdmVkKCksIDAsIHNpemUpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBoZWFkKEluZGV4KS4qLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OkNvbnN0U2VnbWVudFJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6aGVhZChJbmRleCBzaXplKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIHJldHVybiBDb25zdFNlZ21lbnRSZXR1cm5UeXBlKGRlcml2ZWQoKSwgMCwgc2l6ZSk7Cit9CisKKy8qKiBccmV0dXJucyBhIGR5bmFtaWMtc2l6ZSBleHByZXNzaW9uIG9mIHRoZSBsYXN0IGNvZWZmaWNpZW50cyBvZiAqdGhpcy4KKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBccGFyYW0gc2l6ZSB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpbiB0aGUgYmxvY2sKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfZW5kX2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2VuZF9pbnQub3V0CisgICoKKyAgKiBcbm90ZSBFdmVuIHRob3VnaCB0aGUgcmV0dXJuZWQgZXhwcmVzc2lvbiBoYXMgZHluYW1pYyBzaXplLCBpbiB0aGUgY2FzZQorICAqIHdoZW4gaXQgaXMgYXBwbGllZCB0byBhIGZpeGVkLXNpemUgdmVjdG9yLCBpdCBpbmhlcml0cyBhIGZpeGVkIG1heGltYWwgc2l6ZSwKKyAgKiB3aGljaCBtZWFucyB0aGF0IGV2YWx1YXRpbmcgaXQgZG9lcyBub3QgY2F1c2UgYSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpTZWdtZW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+Ojp0YWlsKEluZGV4IHNpemUpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIFNlZ21lbnRSZXR1cm5UeXBlKGRlcml2ZWQoKSwgdGhpcy0+c2l6ZSgpIC0gc2l6ZSwgc2l6ZSk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHRhaWwoSW5kZXgpLiovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6Q29uc3RTZWdtZW50UmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+Ojp0YWlsKEluZGV4IHNpemUpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIENvbnN0U2VnbWVudFJldHVyblR5cGUoZGVyaXZlZCgpLCB0aGlzLT5zaXplKCkgLSBzaXplLCBzaXplKTsKK30KKworLyoqIFxyZXR1cm5zIGEgZml4ZWQtc2l6ZSBleHByZXNzaW9uIG9mIGEgc2VnbWVudCAoaS5lLiBhIHZlY3RvciBibG9jaykgaW4gXGMgKnRoaXMKKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIFNpemUgaXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaW4gdGhlIGJsb2NrCisgICoKKyAgKiBccGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBzdWItdmVjdG9yCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9zZWdtZW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3NlZ21lbnQub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2sKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgU2l6ZT4KK2lubGluZSB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIEZpeGVkU2VnbWVudFJldHVyblR5cGU8U2l6ZT46OlR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6c2VnbWVudChJbmRleCBzdGFydCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gdHlwZW5hbWUgRml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZShkZXJpdmVkKCksIHN0YXJ0KTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2Ygc2VnbWVudDxpbnQ+KEluZGV4KS4qLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPGludCBTaXplPgoraW5saW5lIHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6dGVtcGxhdGUgQ29uc3RGaXhlZFNlZ21lbnRSZXR1cm5UeXBlPFNpemU+OjpUeXBlCitEZW5zZUJhc2U8RGVyaXZlZD46OnNlZ21lbnQoSW5kZXggc3RhcnQpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0Rml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZShkZXJpdmVkKCksIHN0YXJ0KTsKK30KKworLyoqIFxyZXR1cm5zIGEgZml4ZWQtc2l6ZSBleHByZXNzaW9uIG9mIHRoZSBmaXJzdCBjb2VmZmljaWVudHMgb2YgKnRoaXMuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBTaXplIGlzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGluIHRoZSBibG9jaworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc3RhcnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc3RhcnQub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2sKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgU2l6ZT4KK2lubGluZSB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIEZpeGVkU2VnbWVudFJldHVyblR5cGU8U2l6ZT46OlR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6aGVhZCgpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIHR5cGVuYW1lIEZpeGVkU2VnbWVudFJldHVyblR5cGU8U2l6ZT46OlR5cGUoZGVyaXZlZCgpLCAwKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgaGVhZDxpbnQ+KCkuKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgU2l6ZT4KK2lubGluZSB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIENvbnN0Rml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+OjpoZWFkKCkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gdHlwZW5hbWUgQ29uc3RGaXhlZFNlZ21lbnRSZXR1cm5UeXBlPFNpemU+OjpUeXBlKGRlcml2ZWQoKSwgMCk7Cit9CisKKy8qKiBccmV0dXJucyBhIGZpeGVkLXNpemUgZXhwcmVzc2lvbiBvZiB0aGUgbGFzdCBjb2VmZmljaWVudHMgb2YgKnRoaXMuCisgICoKKyAgKiBcb25seV9mb3JfdmVjdG9ycworICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBTaXplIGlzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGluIHRoZSBibG9jaworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfZW5kLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2VuZC5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPGludCBTaXplPgoraW5saW5lIHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6dGVtcGxhdGUgRml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+Ojp0YWlsKCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gdHlwZW5hbWUgRml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZShkZXJpdmVkKCksIHNpemUoKSAtIFNpemUpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiB0YWlsPGludD4uKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgU2l6ZT4KK2lubGluZSB0eXBlbmFtZSBEZW5zZUJhc2U8RGVyaXZlZD46OnRlbXBsYXRlIENvbnN0Rml4ZWRTZWdtZW50UmV0dXJuVHlwZTxTaXplPjo6VHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+Ojp0YWlsKCkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gdHlwZW5hbWUgQ29uc3RGaXhlZFNlZ21lbnRSZXR1cm5UeXBlPFNpemU+OjpUeXBlKGRlcml2ZWQoKSwgc2l6ZSgpIC0gU2l6ZSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVkVDVE9SQkxPQ0tfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvVmVjdG9yd2lzZU9wLmggYi9FaWdlbi9zcmMvQ29yZS9WZWN0b3J3aXNlT3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJjMGYzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvVmVjdG9yd2lzZU9wLmgKQEAgLTAsMCArMSw1OTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFSVElBTF9SRURVWF9ICisjZGVmaW5lIEVJR0VOX1BBUlRJQUxfUkVEVVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxjbGFzcyBQYXJ0aWFsUmVkdXhFeHByCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxicmllZiBHZW5lcmljIGV4cHJlc3Npb24gb2YgYSBwYXJ0aWFsbHkgcmVkdXhlZCBtYXRyaXgKKyAgKgorICAqIFx0cGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgbWF0cml4IHdlIGFyZSBhcHBseWluZyB0aGUgcmVkdXggb3BlcmF0aW9uCisgICogXHRwYXJhbSBNZW1iZXJPcCB0eXBlIG9mIHRoZSBtZW1iZXIgZnVuY3RvcgorICAqIFx0cGFyYW0gRGlyZWN0aW9uIGluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSByZWR1eCAoI1ZlcnRpY2FsIG9yICNIb3Jpem9udGFsKQorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2YgYSBwYXJ0aWFsIHJlZHV4IG9wZXJhdG9yIG9mIGEgbWF0cml4LgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBzb21lIFZlY3Rvcndpc2VPcCBmdW5jdGlvbnMsCisgICogYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBjbGFzcyBWZWN0b3J3aXNlT3AKKyAgKi8KKwordGVtcGxhdGU8IHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIE1lbWJlck9wLCBpbnQgRGlyZWN0aW9uPgorY2xhc3MgUGFydGlhbFJlZHV4RXhwcjsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIE1lbWJlck9wLCBpbnQgRGlyZWN0aW9uPgorc3RydWN0IHRyYWl0czxQYXJ0aWFsUmVkdXhFeHByPE1hdHJpeFR5cGUsIE1lbWJlck9wLCBEaXJlY3Rpb24+ID4KKyA6IHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1lbWJlck9wOjpyZXN1bHRfdHlwZSBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OlhwcktpbmQgWHByS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgSW5wdXRTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgbmVzdGVkPE1hdHJpeFR5cGU+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSBfTWF0cml4VHlwZU5lc3RlZDsKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PVZlcnRpY2FsICAgPyAxIDogTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PUhvcml6b250YWwgPyAxIDogTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PVZlcnRpY2FsICAgPyAxIDogTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PUhvcml6b250YWwgPyAxIDogTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgRmxhZ3MwID0gKHVuc2lnbmVkIGludClfTWF0cml4VHlwZU5lc3RlZDo6RmxhZ3MgJiBIZXJlZGl0YXJ5Qml0cywKKyAgICBGbGFncyA9IChGbGFnczAgJiB+Um93TWFqb3JCaXQpIHwgKFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyBSb3dNYWpvckJpdCA6IDApLAorICAgIFRyYXZlcnNhbFNpemUgPSBEaXJlY3Rpb249PVZlcnRpY2FsID8gUm93c0F0Q29tcGlsZVRpbWUgOiBDb2xzQXRDb21waWxlVGltZQorICB9OworICAjaWYgRUlHRU5fR05VQ19BVF9MRUFTVCgzLDQpCisgIHR5cGVkZWYgdHlwZW5hbWUgTWVtYmVyT3A6OnRlbXBsYXRlIENvc3Q8SW5wdXRTY2FsYXIsaW50KFRyYXZlcnNhbFNpemUpPiBDb3N0T3BUeXBlOworICAjZWxzZQorICB0eXBlZGVmIHR5cGVuYW1lIE1lbWJlck9wOjp0ZW1wbGF0ZSBDb3N0PElucHV0U2NhbGFyLFRyYXZlcnNhbFNpemU+IENvc3RPcFR5cGU7CisgICNlbmRpZgorICBlbnVtIHsKKyAgICBDb2VmZlJlYWRDb3N0ID0gVHJhdmVyc2FsU2l6ZSAqIHRyYWl0czxfTWF0cml4VHlwZU5lc3RlZD46OkNvZWZmUmVhZENvc3QgKyBpbnQoQ29zdE9wVHlwZTo6dmFsdWUpCisgIH07Cit9OworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgTWVtYmVyT3AsIGludCBEaXJlY3Rpb24+CitjbGFzcyBQYXJ0aWFsUmVkdXhFeHByIDogaW50ZXJuYWw6Om5vX2Fzc2lnbm1lbnRfb3BlcmF0b3IsCisgIHB1YmxpYyBpbnRlcm5hbDo6ZGVuc2VfeHByX2Jhc2U8IFBhcnRpYWxSZWR1eEV4cHI8TWF0cml4VHlwZSwgTWVtYmVyT3AsIERpcmVjdGlvbj4gPjo6dHlwZQoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpkZW5zZV94cHJfYmFzZTxQYXJ0aWFsUmVkdXhFeHByPjo6dHlwZSBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoUGFydGlhbFJlZHV4RXhwcikKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8UGFydGlhbFJlZHV4RXhwcj46Ok1hdHJpeFR5cGVOZXN0ZWQgTWF0cml4VHlwZU5lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8UGFydGlhbFJlZHV4RXhwcj46Ol9NYXRyaXhUeXBlTmVzdGVkIF9NYXRyaXhUeXBlTmVzdGVkOworCisgICAgUGFydGlhbFJlZHV4RXhwcihjb25zdCBNYXRyaXhUeXBlJiBtYXQsIGNvbnN0IE1lbWJlck9wJiBmdW5jID0gTWVtYmVyT3AoKSkKKyAgICAgIDogbV9tYXRyaXgobWF0KSwgbV9mdW5jdG9yKGZ1bmMpIHt9CisKKyAgICBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gKERpcmVjdGlvbj09VmVydGljYWwgICA/IDEgOiBtX21hdHJpeC5yb3dzKCkpOyB9CisgICAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIChEaXJlY3Rpb249PUhvcml6b250YWwgPyAxIDogbV9tYXRyaXguY29scygpKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgY29lZmYoSW5kZXggaSwgSW5kZXggaikgY29uc3QKKyAgICB7CisgICAgICBpZiAoRGlyZWN0aW9uPT1WZXJ0aWNhbCkKKyAgICAgICAgcmV0dXJuIG1fZnVuY3RvcihtX21hdHJpeC5jb2woaikpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbV9mdW5jdG9yKG1fbWF0cml4LnJvdyhpKSk7CisgICAgfQorCisgICAgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgIGlmIChEaXJlY3Rpb249PVZlcnRpY2FsKQorICAgICAgICByZXR1cm4gbV9mdW5jdG9yKG1fbWF0cml4LmNvbChpbmRleCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbV9mdW5jdG9yKG1fbWF0cml4LnJvdyhpbmRleCkpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZU5lc3RlZCBtX21hdHJpeDsKKyAgICBjb25zdCBNZW1iZXJPcCBtX2Z1bmN0b3I7Cit9OworCisjZGVmaW5lIEVJR0VOX01FTUJFUl9GVU5DVE9SKE1FTUJFUixDT1NUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBtZW1iZXJfIyNNRU1CRVIgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1IobWVtYmVyXyMjTUVNQkVSKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiBSZXN1bHRUeXBlIHJlc3VsdF90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgU2l6ZT4gc3RydWN0IENvc3QgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBlbnVtIHsgdmFsdWUgPSBDT1NUIH07IH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRUlHRU5fU1RST05HX0lOTElORSBSZXN1bHRUeXBlIG9wZXJhdG9yKCkoY29uc3QgWHByVHlwZSYgbWF0KSBjb25zdCBcCisgICAgeyByZXR1cm4gbWF0Lk1FTUJFUigpOyB9IFwKKyAgfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitFSUdFTl9NRU1CRVJfRlVOQ1RPUihzcXVhcmVkTm9ybSwgU2l6ZSAqIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0ICsgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QpOworRUlHRU5fTUVNQkVSX0ZVTkNUT1Iobm9ybSwgKFNpemUrNSkgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KTsKK0VJR0VOX01FTUJFUl9GVU5DVE9SKHN0YWJsZU5vcm0sIChTaXplKzUpICogTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QgKyAoU2l6ZS0xKSpOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCk7CitFSUdFTl9NRU1CRVJfRlVOQ1RPUihibHVlTm9ybSwgKFNpemUrNSkgKiBOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KTsKK0VJR0VOX01FTUJFUl9GVU5DVE9SKGh5cG90Tm9ybSwgKFNpemUtMSkgKiBmdW5jdG9yX3RyYWl0czxzY2FsYXJfaHlwb3Rfb3A8U2NhbGFyPiA+OjpDb3N0ICk7CitFSUdFTl9NRU1CRVJfRlVOQ1RPUihzdW0sIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KTsKK0VJR0VOX01FTUJFUl9GVU5DVE9SKG1lYW4sIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0ICsgTnVtVHJhaXRzPFNjYWxhcj46Ok11bENvc3QpOworRUlHRU5fTUVNQkVSX0ZVTkNUT1IobWluQ29lZmYsIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KTsKK0VJR0VOX01FTUJFUl9GVU5DVE9SKG1heENvZWZmLCAoU2l6ZS0xKSpOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCk7CitFSUdFTl9NRU1CRVJfRlVOQ1RPUihhbGwsIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KTsKK0VJR0VOX01FTUJFUl9GVU5DVE9SKGFueSwgKFNpemUtMSkqTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QpOworRUlHRU5fTUVNQkVSX0ZVTkNUT1IoY291bnQsIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0KTsKK0VJR0VOX01FTUJFUl9GVU5DVE9SKHByb2QsIChTaXplLTEpKk51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0KTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmluYXJ5T3AsIHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBtZW1iZXJfcmVkdXggeworICB0eXBlZGVmIHR5cGVuYW1lIHJlc3VsdF9vZjwKKyAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wKFNjYWxhcikKKyAgICAgICAgICAgICAgICAgICA+Ojp0eXBlICByZXN1bHRfdHlwZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IFNpemU+IHN0cnVjdCBDb3N0CisgIHsgZW51bSB7IHZhbHVlID0gKFNpemUtMSkgKiBmdW5jdG9yX3RyYWl0czxCaW5hcnlPcD46OkNvc3QgfTsgfTsKKyAgbWVtYmVyX3JlZHV4KGNvbnN0IEJpbmFyeU9wIGZ1bmMpIDogbV9mdW5jdG9yKGZ1bmMpIHt9CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSByZXN1bHRfdHlwZSBvcGVyYXRvcigpKGNvbnN0IERlbnNlQmFzZTxEZXJpdmVkPiYgbWF0KSBjb25zdAorICB7IHJldHVybiBtYXQucmVkdXgobV9mdW5jdG9yKTsgfQorICBjb25zdCBCaW5hcnlPcCBtX2Z1bmN0b3I7Cit9OworfQorCisvKiogXGNsYXNzIFZlY3Rvcndpc2VPcAorICAqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUHNldWRvIGV4cHJlc3Npb24gcHJvdmlkaW5nIHBhcnRpYWwgcmVkdWN0aW9uIG9wZXJhdGlvbnMKKyAgKgorICAqIFxwYXJhbSBFeHByZXNzaW9uVHlwZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IG9uIHdoaWNoIHRvIGRvIHBhcnRpYWwgcmVkdWN0aW9ucworICAqIFxwYXJhbSBEaXJlY3Rpb24gaW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHJlZHV4ICgjVmVydGljYWwgb3IgI0hvcml6b250YWwpCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwc2V1ZG8gZXhwcmVzc2lvbiB3aXRoIHBhcnRpYWwgcmVkdWN0aW9uIGZlYXR1cmVzLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBEZW5zZUJhc2U6OmNvbHdpc2UoKSBhbmQgRGVuc2VCYXNlOjpyb3d3aXNlKCkKKyAgKiBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHdheSBpdCBpcyB1c2VkLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jb2x3aXNlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfY29sd2lzZS5vdXQKKyAgKgorICAqIFxzYSBEZW5zZUJhc2U6OmNvbHdpc2UoKSwgRGVuc2VCYXNlOjpyb3d3aXNlKCksIGNsYXNzIFBhcnRpYWxSZWR1eEV4cHIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCBpbnQgRGlyZWN0aW9uPiBjbGFzcyBWZWN0b3J3aXNlT3AKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8aW50ZXJuYWw6Om11c3RfbmVzdF9ieV92YWx1ZTxFeHByZXNzaW9uVHlwZT46OnJldCwKKyAgICAgICAgRXhwcmVzc2lvblR5cGUsIEV4cHJlc3Npb25UeXBlJj46OnR5cGUgRXhwcmVzc2lvblR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxFeHByZXNzaW9uVHlwZU5lc3RlZD46OnR5cGUgRXhwcmVzc2lvblR5cGVOZXN0ZWRDbGVhbmVkOworCisgICAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4gY2xhc3MgRnVuY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBTY2FsYXI9dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxFeHByZXNzaW9uVHlwZT46OlNjYWxhcj4gc3RydWN0IFJldHVyblR5cGUKKyAgICB7CisgICAgICB0eXBlZGVmIFBhcnRpYWxSZWR1eEV4cHI8RXhwcmVzc2lvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3RvcjxTY2FsYXI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBUeXBlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcD4gc3RydWN0IFJlZHV4UmV0dXJuVHlwZQorICAgIHsKKyAgICAgIHR5cGVkZWYgUGFydGlhbFJlZHV4RXhwcjxFeHByZXNzaW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6bWVtYmVyX3JlZHV4PEJpbmFyeU9wLHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RXhwcmVzc2lvblR5cGU+OjpTY2FsYXI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBUeXBlOworICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgIElzVmVydGljYWwgICA9IChEaXJlY3Rpb249PVZlcnRpY2FsKSA/IDEgOiAwLAorICAgICAgSXNIb3Jpem9udGFsID0gKERpcmVjdGlvbj09SG9yaXpvbnRhbCkgPyAxIDogMAorICAgIH07CisKKyAgcHJvdGVjdGVkOgorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBccmV0dXJucyB0aGUgaS10aCBzdWJ2ZWN0b3IgYWNjb3JkaW5nIHRvIHRoZSBcYyBEaXJlY3Rpb24gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxEaXJlY3Rpb249PVZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpDb2xYcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6OlJvd1hwcj46OnR5cGUgU3ViVmVjdG9yOworICAgIFN1YlZlY3RvciBzdWJWZWN0b3IoSW5kZXggaSkKKyAgICB7CisgICAgICByZXR1cm4gU3ViVmVjdG9yKG1fbWF0cml4LmRlcml2ZWQoKSxpKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VidmVjdG9ycyBpbiB0aGUgZGlyZWN0aW9uIFxjIERpcmVjdGlvbiAqLworICAgIEluZGV4IHN1YlZlY3RvcnMoKSBjb25zdAorICAgIHsgcmV0dXJuIERpcmVjdGlvbj09VmVydGljYWw/bV9tYXRyaXguY29scygpOm1fbWF0cml4LnJvd3MoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBzdHJ1Y3QgRXh0ZW5kZWRUeXBlIHsKKyAgICAgIHR5cGVkZWYgUmVwbGljYXRlPE90aGVyRGVyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbj09VmVydGljYWwgICA/IDEgOiBFeHByZXNzaW9uVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb249PUhvcml6b250YWwgPyAxIDogRXhwcmVzc2lvblR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBUeXBlOworICAgIH07CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFJlcGxpY2F0ZXMgYSB2ZWN0b3IgdG8gbWF0Y2ggdGhlIHNpemUgb2YgXGMgKnRoaXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgdHlwZW5hbWUgRXh0ZW5kZWRUeXBlPE90aGVyRGVyaXZlZD46OlR5cGUKKyAgICBleHRlbmRlZFRvKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKEVJR0VOX0lNUExJRVMoRGlyZWN0aW9uPT1WZXJ0aWNhbCwgT3RoZXJEZXJpdmVkOjpNYXhDb2xzQXRDb21waWxlVGltZT09MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFlPVV9QQVNTRURfQV9ST1dfVkVDVE9SX0JVVF9BX0NPTFVNTl9WRUNUT1JfV0FTX0VYUEVDVEVEKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChFSUdFTl9JTVBMSUVTKERpcmVjdGlvbj09SG9yaXpvbnRhbCwgT3RoZXJEZXJpdmVkOjpNYXhSb3dzQXRDb21waWxlVGltZT09MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFlPVV9QQVNTRURfQV9DT0xVTU5fVkVDVE9SX0JVVF9BX1JPV19WRUNUT1JfV0FTX0VYUEVDVEVEKQorICAgICAgcmV0dXJuIHR5cGVuYW1lIEV4dGVuZGVkVHlwZTxPdGhlckRlcml2ZWQ+OjpUeXBlCisgICAgICAgICAgICAgICAgICAgICAgKG90aGVyLmRlcml2ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uPT1WZXJ0aWNhbCAgID8gMSA6IG1fbWF0cml4LnJvd3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uPT1Ib3Jpem9udGFsID8gMSA6IG1fbWF0cml4LmNvbHMoKSk7CisgICAgfQorCisgIHB1YmxpYzoKKworICAgIGlubGluZSBWZWN0b3J3aXNlT3AoRXhwcmVzc2lvblR5cGUmIG1hdHJpeCkgOiBtX21hdHJpeChtYXRyaXgpIHt9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgaW5saW5lIGNvbnN0IEV4cHJlc3Npb25UeXBlJiBfZXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4OyB9CisKKyAgICAvKiogXHJldHVybnMgYSByb3cgb3IgY29sdW1uIHZlY3RvciBleHByZXNzaW9uIG9mIFxjICp0aGlzIHJlZHV4ZWQgYnkgXGEgZnVuYworICAgICAgKgorICAgICAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIEJpbmFyeU9wIGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdG9yCisgICAgICAqIG9mIHRoZSBjdXN0b20gcmVkdXggb3BlcmF0b3IuIE5vdGUgdGhhdCBmdW5jIG11c3QgYmUgYW4gYXNzb2NpYXRpdmUgb3BlcmF0b3IuCisgICAgICAqCisgICAgICAqIFxzYSBjbGFzcyBWZWN0b3J3aXNlT3AsIERlbnNlQmFzZTo6Y29sd2lzZSgpLCBEZW5zZUJhc2U6OnJvd3dpc2UoKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcD4KKyAgICBjb25zdCB0eXBlbmFtZSBSZWR1eFJldHVyblR5cGU8QmluYXJ5T3A+OjpUeXBlCisgICAgcmVkdXgoY29uc3QgQmluYXJ5T3AmIGZ1bmMgPSBCaW5hcnlPcCgpKSBjb25zdAorICAgIHsgcmV0dXJuIHR5cGVuYW1lIFJlZHV4UmV0dXJuVHlwZTxCaW5hcnlPcD46OlR5cGUoX2V4cHJlc3Npb24oKSwgZnVuYyk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJvdyAob3IgY29sdW1uKSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgc21hbGxlc3QgY29lZmZpY2llbnQKKyAgICAgICogb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgZXhwcmVzc2lvbi4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgUGFydGlhbFJlZHV4X21pbkNvZWZmLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBQYXJ0aWFsUmVkdXhfbWluQ29lZmYub3V0CisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6Om1pbkNvZWZmKCkgKi8KKyAgICBjb25zdCB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfbWluQ29lZmY+OjpUeXBlIG1pbkNvZWZmKCkgY29uc3QKKyAgICB7IHJldHVybiBfZXhwcmVzc2lvbigpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSByb3cgKG9yIGNvbHVtbikgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIGxhcmdlc3QgY29lZmZpY2llbnQKKyAgICAgICogb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgZXhwcmVzc2lvbi4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgUGFydGlhbFJlZHV4X21heENvZWZmLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBQYXJ0aWFsUmVkdXhfbWF4Q29lZmYub3V0CisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6Om1heENvZWZmKCkgKi8KKyAgICBjb25zdCB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfbWF4Q29lZmY+OjpUeXBlIG1heENvZWZmKCkgY29uc3QKKyAgICB7IHJldHVybiBfZXhwcmVzc2lvbigpOyB9CisKKyAgICAvKiogXHJldHVybnMgYSByb3cgKG9yIGNvbHVtbikgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIHNxdWFyZWQgbm9ybQorICAgICAgKiBvZiBlYWNoIGNvbHVtbiAob3Igcm93KSBvZiB0aGUgcmVmZXJlbmNlZCBleHByZXNzaW9uLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBQYXJ0aWFsUmVkdXhfc3F1YXJlZE5vcm0uY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFBhcnRpYWxSZWR1eF9zcXVhcmVkTm9ybS5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6c3F1YXJlZE5vcm0oKSAqLworICAgIGNvbnN0IHR5cGVuYW1lIFJldHVyblR5cGU8aW50ZXJuYWw6Om1lbWJlcl9zcXVhcmVkTm9ybSxSZWFsU2NhbGFyPjo6VHlwZSBzcXVhcmVkTm9ybSgpIGNvbnN0CisgICAgeyByZXR1cm4gX2V4cHJlc3Npb24oKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBub3JtCisgICAgICAqIG9mIGVhY2ggY29sdW1uIChvciByb3cpIG9mIHRoZSByZWZlcmVuY2VkIGV4cHJlc3Npb24uCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFBhcnRpYWxSZWR1eF9ub3JtLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBQYXJ0aWFsUmVkdXhfbm9ybS5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6bm9ybSgpICovCisgICAgY29uc3QgdHlwZW5hbWUgUmV0dXJuVHlwZTxpbnRlcm5hbDo6bWVtYmVyX25vcm0sUmVhbFNjYWxhcj46OlR5cGUgbm9ybSgpIGNvbnN0CisgICAgeyByZXR1cm4gX2V4cHJlc3Npb24oKTsgfQorCisKKyAgICAvKiogXHJldHVybnMgYSByb3cgKG9yIGNvbHVtbikgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIG5vcm0KKyAgICAgICogb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgZXhwcmVzc2lvbiwgdXNpbmcKKyAgICAgICogYmx1ZSdzIGFsZ29yaXRobS4KKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6Ymx1ZU5vcm0oKSAqLworICAgIGNvbnN0IHR5cGVuYW1lIFJldHVyblR5cGU8aW50ZXJuYWw6Om1lbWJlcl9ibHVlTm9ybSxSZWFsU2NhbGFyPjo6VHlwZSBibHVlTm9ybSgpIGNvbnN0CisgICAgeyByZXR1cm4gX2V4cHJlc3Npb24oKTsgfQorCisKKyAgICAvKiogXHJldHVybnMgYSByb3cgKG9yIGNvbHVtbikgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIG5vcm0KKyAgICAgICogb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgZXhwcmVzc2lvbiwgYXZvaWRpbmcKKyAgICAgICogdW5kZXJmbG93IGFuZCBvdmVyZmxvdy4KKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6c3RhYmxlTm9ybSgpICovCisgICAgY29uc3QgdHlwZW5hbWUgUmV0dXJuVHlwZTxpbnRlcm5hbDo6bWVtYmVyX3N0YWJsZU5vcm0sUmVhbFNjYWxhcj46OlR5cGUgc3RhYmxlTm9ybSgpIGNvbnN0CisgICAgeyByZXR1cm4gX2V4cHJlc3Npb24oKTsgfQorCisKKyAgICAvKiogXHJldHVybnMgYSByb3cgKG9yIGNvbHVtbikgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIG5vcm0KKyAgICAgICogb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgZXhwcmVzc2lvbiwgYXZvaWRpbmcKKyAgICAgICogdW5kZXJmbG93IGFuZCBvdmVyZmxvdyB1c2luZyBhIGNvbmNhdGVuYXRpb24gb2YgaHlwb3QoKSBjYWxscy4KKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6aHlwb3ROb3JtKCkgKi8KKyAgICBjb25zdCB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfaHlwb3ROb3JtLFJlYWxTY2FsYXI+OjpUeXBlIGh5cG90Tm9ybSgpIGNvbnN0CisgICAgeyByZXR1cm4gX2V4cHJlc3Npb24oKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBzdW0KKyAgICAgICogb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgZXhwcmVzc2lvbi4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgUGFydGlhbFJlZHV4X3N1bS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgUGFydGlhbFJlZHV4X3N1bS5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6c3VtKCkgKi8KKyAgICBjb25zdCB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfc3VtPjo6VHlwZSBzdW0oKSBjb25zdAorICAgIHsgcmV0dXJuIF9leHByZXNzaW9uKCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJvdyAob3IgY29sdW1uKSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgbWVhbgorICAgICogb2YgZWFjaCBjb2x1bW4gKG9yIHJvdykgb2YgdGhlIHJlZmVyZW5jZWQgZXhwcmVzc2lvbi4KKyAgICAqCisgICAgKiBcc2EgRGVuc2VCYXNlOjptZWFuKCkgKi8KKyAgICBjb25zdCB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfbWVhbj46OlR5cGUgbWVhbigpIGNvbnN0CisgICAgeyByZXR1cm4gX2V4cHJlc3Npb24oKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIHJlcHJlc2VudGluZworICAgICAgKiB3aGV0aGVyIFxiIGFsbCBjb2VmZmljaWVudHMgb2YgZWFjaCByZXNwZWN0aXZlIGNvbHVtbiAob3Igcm93KSBhcmUgXGMgdHJ1ZS4KKyAgICAgICoKKyAgICAgICogXHNhIERlbnNlQmFzZTo6YWxsKCkgKi8KKyAgICBjb25zdCB0eXBlbmFtZSBSZXR1cm5UeXBlPGludGVybmFsOjptZW1iZXJfYWxsPjo6VHlwZSBhbGwoKSBjb25zdAorICAgIHsgcmV0dXJuIF9leHByZXNzaW9uKCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJvdyAob3IgY29sdW1uKSB2ZWN0b3IgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcKKyAgICAgICogd2hldGhlciBcYiBhdCBcYiBsZWFzdCBvbmUgY29lZmZpY2llbnQgb2YgZWFjaCByZXNwZWN0aXZlIGNvbHVtbiAob3Igcm93KSBpcyBcYyB0cnVlLgorICAgICAgKgorICAgICAgKiBcc2EgRGVuc2VCYXNlOjphbnkoKSAqLworICAgIGNvbnN0IHR5cGVuYW1lIFJldHVyblR5cGU8aW50ZXJuYWw6Om1lbWJlcl9hbnk+OjpUeXBlIGFueSgpIGNvbnN0CisgICAgeyByZXR1cm4gX2V4cHJlc3Npb24oKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgcm93IChvciBjb2x1bW4pIHZlY3RvciBleHByZXNzaW9uIHJlcHJlc2VudGluZworICAgICAgKiB0aGUgbnVtYmVyIG9mIFxjIHRydWUgY29lZmZpY2llbnRzIG9mIGVhY2ggcmVzcGVjdGl2ZSBjb2x1bW4gKG9yIHJvdykuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFBhcnRpYWxSZWR1eF9jb3VudC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgUGFydGlhbFJlZHV4X2NvdW50Lm91dAorICAgICAgKgorICAgICAgKiBcc2EgRGVuc2VCYXNlOjpjb3VudCgpICovCisgICAgY29uc3QgUGFydGlhbFJlZHV4RXhwcjxFeHByZXNzaW9uVHlwZSwgaW50ZXJuYWw6Om1lbWJlcl9jb3VudDxJbmRleD4sIERpcmVjdGlvbj4gY291bnQoKSBjb25zdAorICAgIHsgcmV0dXJuIF9leHByZXNzaW9uKCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIHJvdyAob3IgY29sdW1uKSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgcHJvZHVjdAorICAgICAgKiBvZiBlYWNoIGNvbHVtbiAob3Igcm93KSBvZiB0aGUgcmVmZXJlbmNlZCBleHByZXNzaW9uLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBQYXJ0aWFsUmVkdXhfcHJvZC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgUGFydGlhbFJlZHV4X3Byb2Qub3V0CisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6OnByb2QoKSAqLworICAgIGNvbnN0IHR5cGVuYW1lIFJldHVyblR5cGU8aW50ZXJuYWw6Om1lbWJlcl9wcm9kPjo6VHlwZSBwcm9kKCkgY29uc3QKKyAgICB7IHJldHVybiBfZXhwcmVzc2lvbigpOyB9CisKKworICAgIC8qKiBccmV0dXJucyBhIG1hdHJpeCBleHByZXNzaW9uCisgICAgICAqIHdoZXJlIGVhY2ggY29sdW1uIChvciByb3cpIGFyZSByZXZlcnNlZC4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgVmVjdG9yd2lzZV9yZXZlcnNlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBWZWN0b3J3aXNlX3JldmVyc2Uub3V0CisgICAgICAqCisgICAgICAqIFxzYSBEZW5zZUJhc2U6OnJldmVyc2UoKSAqLworICAgIGNvbnN0IFJldmVyc2U8RXhwcmVzc2lvblR5cGUsIERpcmVjdGlvbj4gcmV2ZXJzZSgpIGNvbnN0CisgICAgeyByZXR1cm4gUmV2ZXJzZTxFeHByZXNzaW9uVHlwZSwgRGlyZWN0aW9uPiggX2V4cHJlc3Npb24oKSApOyB9CisKKyAgICB0eXBlZGVmIFJlcGxpY2F0ZTxFeHByZXNzaW9uVHlwZSxEaXJlY3Rpb249PVZlcnRpY2FsP0R5bmFtaWM6MSxEaXJlY3Rpb249PUhvcml6b250YWw/RHluYW1pYzoxPiBSZXBsaWNhdGVSZXR1cm5UeXBlOworICAgIGNvbnN0IFJlcGxpY2F0ZVJldHVyblR5cGUgcmVwbGljYXRlKEluZGV4IGZhY3RvcikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgICogXHJldHVybiBhbiBleHByZXNzaW9uIG9mIHRoZSByZXBsaWNhdGlvbiBvZiBlYWNoIGNvbHVtbiAob3Igcm93KSBvZiBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBEaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRGlyZWN0aW9uV2lzZV9yZXBsaWNhdGUub3V0CisgICAgICAqCisgICAgICAqIFxzYSBWZWN0b3J3aXNlT3A6OnJlcGxpY2F0ZShJbmRleCksIERlbnNlQmFzZTo6cmVwbGljYXRlKCksIGNsYXNzIFJlcGxpY2F0ZQorICAgICAgKi8KKyAgICAvLyBOT1RFIGltcGxlbWVudGVkIGhlcmUgYmVjYXVzZSBvZiBzdW5zdHVkaW8ncyBjb21waWxhdGlvbiBlcnJvcnMKKyAgICB0ZW1wbGF0ZTxpbnQgRmFjdG9yPiBjb25zdCBSZXBsaWNhdGU8RXhwcmVzc2lvblR5cGUsKElzVmVydGljYWw/RmFjdG9yOjEpLChJc0hvcml6b250YWw/RmFjdG9yOjEpPgorICAgIHJlcGxpY2F0ZShJbmRleCBmYWN0b3IgPSBGYWN0b3IpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIFJlcGxpY2F0ZTxFeHByZXNzaW9uVHlwZSxEaXJlY3Rpb249PVZlcnRpY2FsP0ZhY3RvcjoxLERpcmVjdGlvbj09SG9yaXpvbnRhbD9GYWN0b3I6MT4KKyAgICAgICAgICAoX2V4cHJlc3Npb24oKSxEaXJlY3Rpb249PVZlcnRpY2FsP2ZhY3RvcjoxLERpcmVjdGlvbj09SG9yaXpvbnRhbD9mYWN0b3I6MSk7CisgICAgfQorCisvLy8vLy8vLy8vLyBBcnRpdGhtZXRpYyBvcGVyYXRvcnMgLy8vLy8vLy8vLy8KKworICAgIC8qKiBDb3BpZXMgdGhlIHZlY3RvciBcYSBvdGhlciB0byBlYWNoIHN1YnZlY3RvciBvZiBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3I9KGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9YUFJfS0lORChFeHByZXNzaW9uVHlwZSwgT3RoZXJEZXJpdmVkKQorICAgICAgLy9laWdlbl9hc3NlcnQoKG1fbWF0cml4LmlzTnVsbCgpKSA9PSAob3RoZXIuaXNOdWxsKCkpKTsgRklYTUUKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHJlc3Npb25UeXBlJj4obV9tYXRyaXggPSBleHRlbmRlZFRvKG90aGVyLmRlcml2ZWQoKSkpOworICAgIH0KKworICAgIC8qKiBBZGRzIHRoZSB2ZWN0b3IgXGEgb3RoZXIgdG8gZWFjaCBzdWJ2ZWN0b3Igb2YgXGMgKnRoaXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRXhwcmVzc2lvblR5cGUmIG9wZXJhdG9yKz0oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoT3RoZXJEZXJpdmVkKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1hQUl9LSU5EKEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQpCisgICAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByZXNzaW9uVHlwZSY+KG1fbWF0cml4ICs9IGV4dGVuZGVkVG8ob3RoZXIuZGVyaXZlZCgpKSk7CisgICAgfQorCisgICAgLyoqIFN1YnN0cmFjdHMgdGhlIHZlY3RvciBcYSBvdGhlciB0byBlYWNoIHN1YnZlY3RvciBvZiBcYyAqdGhpcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3ItPShjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShPdGhlckRlcml2ZWQpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfWFBSX0tJTkQoRXhwcmVzc2lvblR5cGUsIE90aGVyRGVyaXZlZCkKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PEV4cHJlc3Npb25UeXBlJj4obV9tYXRyaXggLT0gZXh0ZW5kZWRUbyhvdGhlci5kZXJpdmVkKCkpKTsKKyAgICB9CisKKyAgICAvKiogTXVsdGlwbGVzIGVhY2ggc3VidmVjdG9yIG9mIFxjICp0aGlzIGJ5IHRoZSB2ZWN0b3IgXGEgb3RoZXIgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRXhwcmVzc2lvblR5cGUmIG9wZXJhdG9yKj0oY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoT3RoZXJEZXJpdmVkKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9BUlJBWVhQUihFeHByZXNzaW9uVHlwZSkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9YUFJfS0lORChFeHByZXNzaW9uVHlwZSwgT3RoZXJEZXJpdmVkKQorICAgICAgbV9tYXRyaXggKj0gZXh0ZW5kZWRUbyhvdGhlci5kZXJpdmVkKCkpOworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXhwcmVzc2lvblR5cGUmPihtX21hdHJpeCk7CisgICAgfQorCisgICAgLyoqIERpdmlkZXMgZWFjaCBzdWJ2ZWN0b3Igb2YgXGMgKnRoaXMgYnkgdGhlIHZlY3RvciBcYSBvdGhlciAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3IvPShjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShPdGhlckRlcml2ZWQpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0FSUkFZWFBSKEV4cHJlc3Npb25UeXBlKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1hQUl9LSU5EKEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQpCisgICAgICBtX21hdHJpeCAvPSBleHRlbmRlZFRvKG90aGVyLmRlcml2ZWQoKSk7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxFeHByZXNzaW9uVHlwZSY+KG1fbWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgZXhwcmVzc2lvbiBvZiB0aGUgc3VtIG9mIHRoZSB2ZWN0b3IgXGEgb3RoZXIgdG8gZWFjaCBzdWJ2ZWN0b3Igb2YgXGMgKnRoaXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IEVJR0VOX1NUUk9OR19JTkxJTkUKKyAgICBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3VtX29wPFNjYWxhcj4sCisgICAgICAgICAgICAgICAgICBjb25zdCBFeHByZXNzaW9uVHlwZU5lc3RlZENsZWFuZWQsCisgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBFeHRlbmRlZFR5cGU8T3RoZXJEZXJpdmVkPjo6VHlwZT4KKyAgICBvcGVyYXRvcisoY29uc3QgRGVuc2VCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoT3RoZXJEZXJpdmVkKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1hQUl9LSU5EKEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQpCisgICAgICByZXR1cm4gbV9tYXRyaXggKyBleHRlbmRlZFRvKG90aGVyLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBlYWNoIHN1YnZlY3RvciBvZiBcYyAqdGhpcyBhbmQgdGhlIHZlY3RvciBcYSBvdGhlciAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+LAorICAgICAgICAgICAgICAgICAgY29uc3QgRXhwcmVzc2lvblR5cGVOZXN0ZWRDbGVhbmVkLAorICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgRXh0ZW5kZWRUeXBlPE90aGVyRGVyaXZlZD46OlR5cGU+CisgICAgb3BlcmF0b3ItKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0FNRV9YUFJfS0lORChFeHByZXNzaW9uVHlwZSwgT3RoZXJEZXJpdmVkKQorICAgICAgcmV0dXJuIG1fbWF0cml4IC0gZXh0ZW5kZWRUbyhvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBleHByZXNzaW9uIHdoZXJlIGVhY2ggc3VidmVjdG9yIGlzIHRoZSBwcm9kdWN0IG9mIHRoZSB2ZWN0b3IgXGEgb3RoZXIKKyAgICAgICogYnkgdGhlIGNvcnJlc3BvbmRpbmcgc3VidmVjdG9yIG9mIFxjICp0aGlzICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBFSUdFTl9TVFJPTkdfSU5MSU5FCisgICAgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8U2NhbGFyPiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHJlc3Npb25UeXBlTmVzdGVkQ2xlYW5lZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIEV4dGVuZGVkVHlwZTxPdGhlckRlcml2ZWQ+OjpUeXBlPgorICAgIG9wZXJhdG9yKihjb25zdCBEZW5zZUJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShPdGhlckRlcml2ZWQpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX0FSUkFZWFBSKEV4cHJlc3Npb25UeXBlKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1hQUl9LSU5EKEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQpCisgICAgICByZXR1cm4gbV9tYXRyaXggKiBleHRlbmRlZFRvKG90aGVyLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIGV4cHJlc3Npb24gd2hlcmUgZWFjaCBzdWJ2ZWN0b3IgaXMgdGhlIHF1b3RpZW50IG9mIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAqIHN1YnZlY3RvciBvZiBcYyAqdGhpcyBieSB0aGUgdmVjdG9yIFxhIG90aGVyICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDxTY2FsYXI+LAorICAgICAgICAgICAgICAgICAgY29uc3QgRXhwcmVzc2lvblR5cGVOZXN0ZWRDbGVhbmVkLAorICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgRXh0ZW5kZWRUeXBlPE90aGVyRGVyaXZlZD46OlR5cGU+CisgICAgb3BlcmF0b3IvKGNvbnN0IERlbnNlQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfQVJSQVlYUFIoRXhwcmVzc2lvblR5cGUpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfWFBSX0tJTkQoRXhwcmVzc2lvblR5cGUsIE90aGVyRGVyaXZlZCkKKyAgICAgIHJldHVybiBtX21hdHJpeCAvIGV4dGVuZGVkVG8ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICB9CisKKy8vLy8vLy8vLy8vIEdlb21ldHJ5IG1vZHVsZSAvLy8vLy8vLy8vLworCisgICAgI2lmIEVJR0VOMl9TVVBQT1JUX1NUQUdFID4gU1RBR0UyMF9SRVNPTFZFX0FQSV9DT05GTElDVFMKKyAgICBIb21vZ2VuZW91czxFeHByZXNzaW9uVHlwZSxEaXJlY3Rpb24+IGhvbW9nZW5lb3VzKCkgY29uc3Q7CisgICAgI2VuZGlmCisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpQbGFpbk9iamVjdCBDcm9zc1JldHVyblR5cGU7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGNvbnN0IENyb3NzUmV0dXJuVHlwZSBjcm9zcyhjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKworICAgIGVudW0geworICAgICAgSE5vcm1hbGl6ZWRfU2l6ZSA9IERpcmVjdGlvbj09VmVydGljYWwgPyBpbnRlcm5hbDo6dHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6Um93c0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50ZXJuYWw6OnRyYWl0czxFeHByZXNzaW9uVHlwZT46OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgSE5vcm1hbGl6ZWRfU2l6ZU1pbnVzT25lID0gSE5vcm1hbGl6ZWRfU2l6ZT09RHluYW1pYyA/IER5bmFtaWMgOiBITm9ybWFsaXplZF9TaXplLTEKKyAgICB9OworICAgIHR5cGVkZWYgQmxvY2s8Y29uc3QgRXhwcmVzc2lvblR5cGUsCisgICAgICAgICAgICAgICAgICBEaXJlY3Rpb249PVZlcnRpY2FsICAgPyBpbnQoSE5vcm1hbGl6ZWRfU2l6ZU1pbnVzT25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KGludGVybmFsOjp0cmFpdHM8RXhwcmVzc2lvblR5cGU+OjpSb3dzQXRDb21waWxlVGltZSksCisgICAgICAgICAgICAgICAgICBEaXJlY3Rpb249PUhvcml6b250YWwgPyBpbnQoSE5vcm1hbGl6ZWRfU2l6ZU1pbnVzT25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50KGludGVybmFsOjp0cmFpdHM8RXhwcmVzc2lvblR5cGU+OjpDb2xzQXRDb21waWxlVGltZSk+CisgICAgICAgICAgICBITm9ybWFsaXplZF9CbG9jazsKKyAgICB0eXBlZGVmIEJsb2NrPGNvbnN0IEV4cHJlc3Npb25UeXBlLAorICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uPT1WZXJ0aWNhbCAgID8gMSA6IGludChpbnRlcm5hbDo6dHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6Um93c0F0Q29tcGlsZVRpbWUpLAorICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uPT1Ib3Jpem9udGFsID8gMSA6IGludChpbnRlcm5hbDo6dHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6Q29sc0F0Q29tcGlsZVRpbWUpPgorICAgICAgICAgICAgSE5vcm1hbGl6ZWRfRmFjdG9yczsKKyAgICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6U2NhbGFyPiwKKyAgICAgICAgICAgICAgICBjb25zdCBITm9ybWFsaXplZF9CbG9jaywKKyAgICAgICAgICAgICAgICBjb25zdCBSZXBsaWNhdGU8SE5vcm1hbGl6ZWRfRmFjdG9ycywKKyAgICAgICAgICAgICAgICAgIERpcmVjdGlvbj09VmVydGljYWwgICA/IEhOb3JtYWxpemVkX1NpemVNaW51c09uZSA6IDEsCisgICAgICAgICAgICAgICAgICBEaXJlY3Rpb249PUhvcml6b250YWwgPyBITm9ybWFsaXplZF9TaXplTWludXNPbmUgOiAxPiA+CisgICAgICAgICAgICBITm9ybWFsaXplZFJldHVyblR5cGU7CisKKyAgICBjb25zdCBITm9ybWFsaXplZFJldHVyblR5cGUgaG5vcm1hbGl6ZWQoKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisgICAgRXhwcmVzc2lvblR5cGVOZXN0ZWQgbV9tYXRyaXg7Cit9OworCisvKiogXHJldHVybnMgYSBWZWN0b3J3aXNlT3Agd3JhcHBlciBvZiAqdGhpcyBwcm92aWRpbmcgYWRkaXRpb25hbCBwYXJ0aWFsIHJlZHVjdGlvbiBvcGVyYXRpb25zCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2NvbHdpc2UuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jb2x3aXNlLm91dAorICAqCisgICogXHNhIHJvd3dpc2UoKSwgY2xhc3MgVmVjdG9yd2lzZU9wLCBccmVmIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6Q29uc3RDb2x3aXNlUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+Ojpjb2x3aXNlKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxyZXR1cm5zIGEgd3JpdGFibGUgVmVjdG9yd2lzZU9wIHdyYXBwZXIgb2YgKnRoaXMgcHJvdmlkaW5nIGFkZGl0aW9uYWwgcGFydGlhbCByZWR1Y3Rpb24gb3BlcmF0aW9ucworICAqCisgICogXHNhIHJvd3dpc2UoKSwgY2xhc3MgVmVjdG9yd2lzZU9wLCBccmVmIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIERlbnNlQmFzZTxEZXJpdmVkPjo6Q29sd2lzZVJldHVyblR5cGUKK0RlbnNlQmFzZTxEZXJpdmVkPjo6Y29sd2lzZSgpCit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBccmV0dXJucyBhIFZlY3Rvcndpc2VPcCB3cmFwcGVyIG9mICp0aGlzIHByb3ZpZGluZyBhZGRpdGlvbmFsIHBhcnRpYWwgcmVkdWN0aW9uIG9wZXJhdGlvbnMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfcm93d2lzZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3Jvd3dpc2Uub3V0CisgICoKKyAgKiBcc2EgY29sd2lzZSgpLCBjbGFzcyBWZWN0b3J3aXNlT3AsIFxyZWYgVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmcKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpDb25zdFJvd3dpc2VSZXR1cm5UeXBlCitEZW5zZUJhc2U8RGVyaXZlZD46OnJvd3dpc2UoKSBjb25zdAoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogXHJldHVybnMgYSB3cml0YWJsZSBWZWN0b3J3aXNlT3Agd3JhcHBlciBvZiAqdGhpcyBwcm92aWRpbmcgYWRkaXRpb25hbCBwYXJ0aWFsIHJlZHVjdGlvbiBvcGVyYXRpb25zCisgICoKKyAgKiBcc2EgY29sd2lzZSgpLCBjbGFzcyBWZWN0b3J3aXNlT3AsIFxyZWYgVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmcKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgRGVuc2VCYXNlPERlcml2ZWQ+OjpSb3d3aXNlUmV0dXJuVHlwZQorRGVuc2VCYXNlPERlcml2ZWQ+Ojpyb3d3aXNlKCkKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QQVJUSUFMX1JFRFVYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL1Zpc2l0b3IuaCBiL0VpZ2VuL3NyYy9Db3JlL1Zpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTZiZmQwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvVmlzaXRvci5oCkBAIC0wLDAgKzEsMjM3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVklTSVRPUl9ICisjZGVmaW5lIEVJR0VOX1ZJU0lUT1JfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmlzaXRvciwgdHlwZW5hbWUgRGVyaXZlZCwgaW50IFVucm9sbENvdW50Pgorc3RydWN0IHZpc2l0b3JfaW1wbAoreworICBlbnVtIHsKKyAgICBjb2wgPSAoVW5yb2xsQ291bnQtMSkgLyBEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICByb3cgPSAoVW5yb2xsQ291bnQtMSkgJSBEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZQorICB9OworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgRGVyaXZlZCAmbWF0LCBWaXNpdG9yJiB2aXNpdG9yKQorICB7CisgICAgdmlzaXRvcl9pbXBsPFZpc2l0b3IsIERlcml2ZWQsIFVucm9sbENvdW50LTE+OjpydW4obWF0LCB2aXNpdG9yKTsKKyAgICB2aXNpdG9yKG1hdC5jb2VmZihyb3csIGNvbCksIHJvdywgY29sKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmlzaXRvciwgdHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCB2aXNpdG9yX2ltcGw8VmlzaXRvciwgRGVyaXZlZCwgMT4KK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihjb25zdCBEZXJpdmVkICZtYXQsIFZpc2l0b3ImIHZpc2l0b3IpCisgIHsKKyAgICByZXR1cm4gdmlzaXRvci5pbml0KG1hdC5jb2VmZigwLCAwKSwgMCwgMCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZpc2l0b3IsIHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgdmlzaXRvcl9pbXBsPFZpc2l0b3IsIERlcml2ZWQsIER5bmFtaWM+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgRGVyaXZlZCYgbWF0LCBWaXNpdG9yJiB2aXNpdG9yKQorICB7CisgICAgdmlzaXRvci5pbml0KG1hdC5jb2VmZigwLDApLCAwLCAwKTsKKyAgICBmb3IoSW5kZXggaSA9IDE7IGkgPCBtYXQucm93cygpOyArK2kpCisgICAgICB2aXNpdG9yKG1hdC5jb2VmZihpLCAwKSwgaSwgMCk7CisgICAgZm9yKEluZGV4IGogPSAxOyBqIDwgbWF0LmNvbHMoKTsgKytqKQorICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbWF0LnJvd3MoKTsgKytpKQorICAgICAgICB2aXNpdG9yKG1hdC5jb2VmZihpLCBqKSwgaSwgaik7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogQXBwbGllcyB0aGUgdmlzaXRvciBcYSB2aXNpdG9yIHRvIHRoZSB3aG9sZSBjb2VmZmljaWVudHMgb2YgdGhlIG1hdHJpeCBvciB2ZWN0b3IuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxhIFZpc2l0b3IgaXMgdGhlIHR5cGUgb2YgdGhlIHZpc2l0b3IgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgorICAqIFxjb2RlCisgICogc3RydWN0IE15VmlzaXRvciB7CisgICogICAvLyBjYWxsZWQgZm9yIHRoZSBmaXJzdCBjb2VmZmljaWVudAorICAqICAgdm9pZCBpbml0KGNvbnN0IFNjYWxhciYgdmFsdWUsIEluZGV4IGksIEluZGV4IGopOworICAqICAgLy8gY2FsbGVkIGZvciBhbGwgb3RoZXIgY29lZmZpY2llbnRzCisgICogICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgdmFsdWUsIEluZGV4IGksIEluZGV4IGopOworICAqIH07CisgICogXGVuZGNvZGUKKyAgKgorICAqIFxub3RlIGNvbXBhcmVkIHRvIG9uZSBvciB0d28gXGVtIGZvciBcZW0gbG9vcHMsIHZpc2l0b3JzIG9mZmVyIGF1dG9tYXRpYworICAqIHVucm9sbGluZyBmb3Igc21hbGwgZml4ZWQgc2l6ZSBtYXRyaXguCisgICoKKyAgKiBcc2EgbWluQ29lZmYoSW5kZXgqLEluZGV4KiksIG1heENvZWZmKEluZGV4KixJbmRleCopLCBEZW5zZUJhc2U6OnJlZHV4KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWaXNpdG9yPgordm9pZCBEZW5zZUJhc2U8RGVyaXZlZD46OnZpc2l0KFZpc2l0b3ImIHZpc2l0b3IpIGNvbnN0Cit7CisgIGVudW0geyB1bnJvbGwgPSBTaXplQXRDb21waWxlVGltZSAhPSBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgJiYgQ29lZmZSZWFkQ29zdCAhPSBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgJiYgKFNpemVBdENvbXBpbGVUaW1lID09IDEgfHwgaW50ZXJuYWw6OmZ1bmN0b3JfdHJhaXRzPFZpc2l0b3I+OjpDb3N0ICE9IER5bmFtaWMpCisgICAgICAgICAgICAgICAgICAgJiYgU2l6ZUF0Q29tcGlsZVRpbWUgKiBDb2VmZlJlYWRDb3N0ICsgKFNpemVBdENvbXBpbGVUaW1lLTEpICogaW50ZXJuYWw6OmZ1bmN0b3JfdHJhaXRzPFZpc2l0b3I+OjpDb3N0CisgICAgICAgICAgICAgICAgICAgICAgPD0gRUlHRU5fVU5ST0xMSU5HX0xJTUlUIH07CisgIHJldHVybiBpbnRlcm5hbDo6dmlzaXRvcl9pbXBsPFZpc2l0b3IsIERlcml2ZWQsCisgICAgICB1bnJvbGwgPyBpbnQoU2l6ZUF0Q29tcGlsZVRpbWUpIDogRHluYW1pYworICAgID46OnJ1bihkZXJpdmVkKCksIHZpc2l0b3IpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIEJhc2UgY2xhc3MgdG8gaW1wbGVtZW50IG1pbiBhbmQgbWF4IHZpc2l0b3JzCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBjb2VmZl92aXNpdG9yCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgSW5kZXggcm93LCBjb2w7CisgIFNjYWxhciByZXM7CisgIGlubGluZSB2b2lkIGluaXQoY29uc3QgU2NhbGFyJiB2YWx1ZSwgSW5kZXggaSwgSW5kZXggaikKKyAgeworICAgIHJlcyA9IHZhbHVlOworICAgIHJvdyA9IGk7CisgICAgY29sID0gajsKKyAgfQorfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBWaXNpdG9yIGNvbXB1dGluZyB0aGUgbWluIGNvZWZmaWNpZW50IHdpdGggaXRzIHZhbHVlIGFuZCBjb29yZGluYXRlcworICAqCisgICogXHNhIERlbnNlQmFzZTo6bWluQ29lZmYoSW5kZXgqLCBJbmRleCopCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBtaW5fY29lZmZfdmlzaXRvciA6IGNvZWZmX3Zpc2l0b3I8RGVyaXZlZD4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgdmFsdWUsIEluZGV4IGksIEluZGV4IGopCisgIHsKKyAgICBpZih2YWx1ZSA8IHRoaXMtPnJlcykKKyAgICB7CisgICAgICB0aGlzLT5yZXMgPSB2YWx1ZTsKKyAgICAgIHRoaXMtPnJvdyA9IGk7CisgICAgICB0aGlzLT5jb2wgPSBqOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPG1pbl9jb2VmZl92aXNpdG9yPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdAorICB9OworfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxicmllZiBWaXNpdG9yIGNvbXB1dGluZyB0aGUgbWF4IGNvZWZmaWNpZW50IHdpdGggaXRzIHZhbHVlIGFuZCBjb29yZGluYXRlcworICAqCisgICogXHNhIERlbnNlQmFzZTo6bWF4Q29lZmYoSW5kZXgqLCBJbmRleCopCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBtYXhfY29lZmZfdmlzaXRvciA6IGNvZWZmX3Zpc2l0b3I8RGVyaXZlZD4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IFNjYWxhciYgdmFsdWUsIEluZGV4IGksIEluZGV4IGopCisgIHsKKyAgICBpZih2YWx1ZSA+IHRoaXMtPnJlcykKKyAgICB7CisgICAgICB0aGlzLT5yZXMgPSB2YWx1ZTsKKyAgICAgIHRoaXMtPnJvdyA9IGk7CisgICAgICB0aGlzLT5jb2wgPSBqOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPG1heF9jb2VmZl92aXNpdG9yPFNjYWxhcj4gPiB7CisgIGVudW0geworICAgIENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdAorICB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBccmV0dXJucyB0aGUgbWluaW11bSBvZiBhbGwgY29lZmZpY2llbnRzIG9mICp0aGlzCisgICogYW5kIHB1dHMgaW4gKnJvdyBhbmQgKmNvbCBpdHMgbG9jYXRpb24uCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjptaW5Db2VmZihJbmRleCopLCBEZW5zZUJhc2U6Om1heENvZWZmKEluZGV4KixJbmRleCopLCBEZW5zZUJhc2U6OnZpc2l0b3IoKSwgRGVuc2VCYXNlOjptaW5Db2VmZigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgordHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitEZW5zZUJhc2U8RGVyaXZlZD46Om1pbkNvZWZmKEluZGV4VHlwZSogcm93LCBJbmRleFR5cGUqIGNvbCkgY29uc3QKK3sKKyAgaW50ZXJuYWw6Om1pbl9jb2VmZl92aXNpdG9yPERlcml2ZWQ+IG1pblZpc2l0b3I7CisgIHRoaXMtPnZpc2l0KG1pblZpc2l0b3IpOworICAqcm93ID0gbWluVmlzaXRvci5yb3c7CisgIGlmIChjb2wpICpjb2wgPSBtaW5WaXNpdG9yLmNvbDsKKyAgcmV0dXJuIG1pblZpc2l0b3IucmVzOworfQorCisvKiogXHJldHVybnMgdGhlIG1pbmltdW0gb2YgYWxsIGNvZWZmaWNpZW50cyBvZiAqdGhpcworICAqIGFuZCBwdXRzIGluICppbmRleCBpdHMgbG9jYXRpb24uCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjptaW5Db2VmZihJbmRleFR5cGUqLEluZGV4VHlwZSopLCBEZW5zZUJhc2U6Om1heENvZWZmKEluZGV4VHlwZSosSW5kZXhUeXBlKiksIERlbnNlQmFzZTo6dmlzaXRvcigpLCBEZW5zZUJhc2U6Om1pbkNvZWZmKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+Cit0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK0RlbnNlQmFzZTxEZXJpdmVkPjo6bWluQ29lZmYoSW5kZXhUeXBlKiBpbmRleCkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICBpbnRlcm5hbDo6bWluX2NvZWZmX3Zpc2l0b3I8RGVyaXZlZD4gbWluVmlzaXRvcjsKKyAgdGhpcy0+dmlzaXQobWluVmlzaXRvcik7CisgICppbmRleCA9IChSb3dzQXRDb21waWxlVGltZT09MSkgPyBtaW5WaXNpdG9yLmNvbCA6IG1pblZpc2l0b3Iucm93OworICByZXR1cm4gbWluVmlzaXRvci5yZXM7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF4aW11bSBvZiBhbGwgY29lZmZpY2llbnRzIG9mICp0aGlzCisgICogYW5kIHB1dHMgaW4gKnJvdyBhbmQgKmNvbCBpdHMgbG9jYXRpb24uCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjptaW5Db2VmZihJbmRleFR5cGUqLEluZGV4VHlwZSopLCBEZW5zZUJhc2U6OnZpc2l0b3IoKSwgRGVuc2VCYXNlOjptYXhDb2VmZigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXhUeXBlPgordHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitEZW5zZUJhc2U8RGVyaXZlZD46Om1heENvZWZmKEluZGV4VHlwZSogcm93LCBJbmRleFR5cGUqIGNvbCkgY29uc3QKK3sKKyAgaW50ZXJuYWw6Om1heF9jb2VmZl92aXNpdG9yPERlcml2ZWQ+IG1heFZpc2l0b3I7CisgIHRoaXMtPnZpc2l0KG1heFZpc2l0b3IpOworICAqcm93ID0gbWF4VmlzaXRvci5yb3c7CisgIGlmIChjb2wpICpjb2wgPSBtYXhWaXNpdG9yLmNvbDsKKyAgcmV0dXJuIG1heFZpc2l0b3IucmVzOworfQorCisvKiogXHJldHVybnMgdGhlIG1heGltdW0gb2YgYWxsIGNvZWZmaWNpZW50cyBvZiAqdGhpcworICAqIGFuZCBwdXRzIGluICppbmRleCBpdHMgbG9jYXRpb24uCisgICoKKyAgKiBcc2EgRGVuc2VCYXNlOjptYXhDb2VmZihJbmRleFR5cGUqLEluZGV4VHlwZSopLCBEZW5zZUJhc2U6Om1pbkNvZWZmKEluZGV4VHlwZSosSW5kZXhUeXBlKiksIERlbnNlQmFzZTo6dmlzaXRvcigpLCBEZW5zZUJhc2U6Om1heENvZWZmKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleFR5cGU+Cit0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK0RlbnNlQmFzZTxEZXJpdmVkPjo6bWF4Q29lZmYoSW5kZXhUeXBlKiBpbmRleCkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICBpbnRlcm5hbDo6bWF4X2NvZWZmX3Zpc2l0b3I8RGVyaXZlZD4gbWF4VmlzaXRvcjsKKyAgdGhpcy0+dmlzaXQobWF4VmlzaXRvcik7CisgICppbmRleCA9IChSb3dzQXRDb21waWxlVGltZT09MSkgPyBtYXhWaXNpdG9yLmNvbCA6IG1heFZpc2l0b3Iucm93OworICByZXR1cm4gbWF4VmlzaXRvci5yZXM7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVklTSVRPUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL0FsdGlWZWMvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0FsdGlWZWMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4ZDJlOQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQWx0aVZlYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9Db3JlX2FyY2hfQWx0aVZlY19TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fQ29yZV9hcmNoX0FsdGlWZWNfU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS9FaWdlbi9zcmMvQ29yZS9hcmNoL0FsdGlWZWMgQ09NUE9ORU5UIERldmVsCispCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL0FsdGlWZWMvQ29tcGxleC5oIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9BbHRpVmVjL0NvbXBsZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ5YTJiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9BbHRpVmVjL0NvbXBsZXguaApAQCAtMCwwICsxLDIxNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTVBMRVhfQUxUSVZFQ19ICisjZGVmaW5lIEVJR0VOX0NPTVBMRVhfQUxUSVZFQ19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0YXRpYyBQYWNrZXQ0dWkgIHA0dWlfQ09OSl9YT1IgPSB2ZWNfbWVyZ2VoKChQYWNrZXQ0dWkpcDRpX1pFUk8sIChQYWNrZXQ0dWkpcDRmX1pFUk9fKTsvL3sgMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCB9Oworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfQ09NUExFWF9SRSAgID0gdmVjX3NsZCgoUGFja2V0MTZ1YykgdmVjX3NwbGF0KChQYWNrZXQ0dWkpcDE2dWNfRk9SV0FSRCwgMCksIChQYWNrZXQxNnVjKSB2ZWNfc3BsYXQoKFBhY2tldDR1aSlwMTZ1Y19GT1JXQVJELCAyKSwgOCk7Ly97IDAsMSwyLDMsIDAsMSwyLDMsIDgsOSwxMCwxMSwgOCw5LDEwLDExIH07CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19DT01QTEVYX0lNICAgPSB2ZWNfc2xkKChQYWNrZXQxNnVjKSB2ZWNfc3BsYXQoKFBhY2tldDR1aSlwMTZ1Y19GT1JXQVJELCAxKSwgKFBhY2tldDE2dWMpIHZlY19zcGxhdCgoUGFja2V0NHVpKXAxNnVjX0ZPUldBUkQsIDMpLCA4KTsvL3sgNCw1LDYsNywgNCw1LDYsNywgMTIsMTMsMTQsMTUsIDEyLDEzLDE0LDE1IH07CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19DT01QTEVYX1JFViAgPSB2ZWNfc2xkKHAxNnVjX1JFVkVSU0UsIHAxNnVjX1JFVkVSU0UsIDgpOy8veyA0LDUsNiw3LCAwLDEsMiwzLCAxMiwxMywxNCwxNSwgOCw5LDEwLDExIH07CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19DT01QTEVYX1JFVjIgPSB2ZWNfc2xkKHAxNnVjX0ZPUldBUkQsIHAxNnVjX0ZPUldBUkQsIDgpOy8veyA4LDksMTAsMTEsIDEyLDEzLDE0LDE1LCAwLDEsMiwzLCA0LDUsNiw3IH07CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19QU0VUX0hJID0gKFBhY2tldDE2dWMpIHZlY19tZXJnZWgoKFBhY2tldDR1aSkgdmVjX3NwbGF0KChQYWNrZXQ0dWkpcDE2dWNfRk9SV0FSRCwgMCksIChQYWNrZXQ0dWkpIHZlY19zcGxhdCgoUGFja2V0NHVpKXAxNnVjX0ZPUldBUkQsIDEpKTsvL3sgMCwxLDIsMywgNCw1LDYsNywgMCwxLDIsMywgNCw1LDYsNyB9Oworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfUFNFVF9MTyA9IChQYWNrZXQxNnVjKSB2ZWNfbWVyZ2VoKChQYWNrZXQ0dWkpIHZlY19zcGxhdCgoUGFja2V0NHVpKXAxNnVjX0ZPUldBUkQsIDIpLCAoUGFja2V0NHVpKSB2ZWNfc3BsYXQoKFBhY2tldDR1aSlwMTZ1Y19GT1JXQVJELCAzKSk7Ly97IDgsOSwxMCwxMSwgMTIsMTMsMTQsMTUsIDgsOSwxMCwxMSwgMTIsMTMsMTQsMTUgfTsKKworLy8tLS0tLS0tLS0tIGZsb2F0IC0tLS0tLS0tLS0KK3N0cnVjdCBQYWNrZXQyY2YKK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YoKSB7fQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IFBhY2tldDJjZihjb25zdCBQYWNrZXQ0ZiYgYSkgOiB2KGEpIHt9CisgIFBhY2tldDRmICB2OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0MmNmIHR5cGU7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplID0gMiwKKworICAgIEhhc0FkZCAgICA9IDEsCisgICAgSGFzU3ViICAgID0gMSwKKyAgICBIYXNNdWwgICAgPSAxLAorICAgIEhhc0RpdiAgICA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNBYnMgICAgPSAwLAorICAgIEhhc0FiczIgICA9IDAsCisgICAgSGFzTWluICAgID0gMCwKKyAgICBIYXNNYXggICAgPSAwLAorICAgIEhhc1NldExpbmVhciA9IDAKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQyY2Y+IHsgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHR5cGU7IGVudW0ge3NpemU9Mn07IH07CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHNldDE8UGFja2V0MmNmPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiAgZnJvbSkKK3sKKyAgUGFja2V0MmNmIHJlczsKKyAgLyogT24gQWx0aVZlYyB3ZSBjYW5ub3QgbG9hZCA2NC1iaXQgcmVnaXN0ZXJzLCBzbyB3YSBoYXZlIHRvIHRha2UgY2FyZSBvZiBhbGlnbm1lbnQgKi8KKyAgaWYoKHB0cmRpZmZfdCgmZnJvbSkgJSAxNikgPT0gMCkKKyAgICByZXMudiA9IHBsb2FkPFBhY2tldDRmPigoY29uc3QgZmxvYXQgKikmZnJvbSk7CisgIGVsc2UKKyAgICByZXMudiA9IHBsb2FkdTxQYWNrZXQ0Zj4oKGNvbnN0IGZsb2F0ICopJmZyb20pOworICByZXMudiA9IHZlY19wZXJtKHJlcy52LCByZXMudiwgcDE2dWNfUFNFVF9ISSk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGFkZDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSB7IHJldHVybiBQYWNrZXQyY2YodmVjX2FkZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHN1YjxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSB7IHJldHVybiBQYWNrZXQyY2YodmVjX3N1YihhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG5lZ2F0ZShjb25zdCBQYWNrZXQyY2YmIGEpIHsgcmV0dXJuIFBhY2tldDJjZihwbmVnYXRlKGEudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBjb25qKGNvbnN0IFBhY2tldDJjZiYgYSkgeyByZXR1cm4gUGFja2V0MmNmKChQYWNrZXQ0Zil2ZWNfeG9yKChQYWNrZXQ0dWkpYS52LCBwNHVpX0NPTkpfWE9SKSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpCit7CisgIFBhY2tldDRmIHYxLCB2MjsKKworICAvLyBQZXJtdXRlIGFuZCBtdWx0aXBseSB0aGUgcmVhbCBwYXJ0cyBvZiBhIGFuZCBiCisgIHYxID0gdmVjX3Blcm0oYS52LCBhLnYsIHAxNnVjX0NPTVBMRVhfUkUpOworICAvLyBHZXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiBhCisgIHYyID0gdmVjX3Blcm0oYS52LCBhLnYsIHAxNnVjX0NPTVBMRVhfSU0pOworICAvLyBtdWx0aXBseSBhX3JlICogYiAKKyAgdjEgPSB2ZWNfbWFkZCh2MSwgYi52LCBwNGZfWkVSTyk7CisgIC8vIG11bHRpcGx5IGFfaW0gKiBiIGFuZCBnZXQgdGhlIGNvbmp1Z2F0ZSByZXN1bHQKKyAgdjIgPSB2ZWNfbWFkZCh2MiwgYi52LCBwNGZfWkVSTyk7CisgIHYyID0gKFBhY2tldDRmKSB2ZWNfeG9yKChQYWNrZXQ0dWkpdjIsIHA0dWlfQ09OSl9YT1IpOworICAvLyBwZXJtdXRlIGJhY2sgdG8gYSBwcm9wZXIgb3JkZXIKKyAgdjIgPSB2ZWNfcGVybSh2MiwgdjIsIHAxNnVjX0NPTVBMRVhfUkVWKTsKKyAgCisgIHJldHVybiBQYWNrZXQyY2YodmVjX2FkZCh2MSwgdjIpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwYW5kICAgPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZih2ZWNfYW5kKGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwb3IgICAgPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZih2ZWNfb3IoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHB4b3IgICA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHZlY194b3IoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhbmRub3Q8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKHZlY19hbmQoYS52LCB2ZWNfbm9yKGIudixiLnYpKSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbG9hZCA8UGFja2V0MmNmPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gUGFja2V0MmNmKHBsb2FkPFBhY2tldDRmPigoY29uc3QgZmxvYXQqKWZyb20pKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbG9hZHU8UGFja2V0MmNmPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FEIHJldHVybiBQYWNrZXQyY2YocGxvYWR1PFBhY2tldDRmPigoY29uc3QgZmxvYXQqKWZyb20pKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBsb2FkZHVwPFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogICAgIGZyb20pCit7CisgIHJldHVybiBwc2V0MTxQYWNrZXQyY2Y+KCpmcm9tKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlIDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oc3RkOjpjb21wbGV4PGZsb2F0PiAqICAgdG8sIGNvbnN0IFBhY2tldDJjZiYgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIHBzdG9yZSgoZmxvYXQqKXRvLCBmcm9tLnYpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PHN0ZDo6Y29tcGxleDxmbG9hdD4gPihzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICogICB0bywgY29uc3QgUGFja2V0MmNmJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBwc3RvcmV1KChmbG9hdCopdG8sIGZyb20udik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8c3RkOjpjb21wbGV4PGZsb2F0PiA+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4gKiAgIGFkZHIpIHsgdmVjX2RzdHQoKGZsb2F0ICopYWRkciwgRFNUX0NUUkwoMiwyLDMyKSwgRFNUX0NIQU4pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICBwZmlyc3Q8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEpCit7CisgIHN0ZDo6Y29tcGxleDxmbG9hdD4gRUlHRU5fQUxJR04xNiByZXNbMl07CisgIHBzdG9yZSgoZmxvYXQgKikmcmVzLCBhLnYpOworCisgIHJldHVybiByZXNbMF07Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHJldmVyc2UoY29uc3QgUGFja2V0MmNmJiBhKQoreworICBQYWNrZXQ0ZiByZXZfYTsKKyAgcmV2X2EgPSB2ZWNfcGVybShhLnYsIGEudiwgcDE2dWNfQ09NUExFWF9SRVYyKTsKKyAgcmV0dXJuIFBhY2tldDJjZihyZXZfYSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHByZWR1eDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgUGFja2V0NGYgYjsKKyAgYiA9IChQYWNrZXQ0ZikgdmVjX3NsZChhLnYsIGEudiwgOCk7CisgIGIgPSBwYWRkKGEudiwgYik7CisgIHJldHVybiBwZmlyc3QoUGFja2V0MmNmKGIpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwcmVkdXhwPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmKiB2ZWNzKQoreworICBQYWNrZXQ0ZiBiMSwgYjI7CisgIAorICBiMSA9IChQYWNrZXQ0ZikgdmVjX3NsZCh2ZWNzWzBdLnYsIHZlY3NbMV0udiwgOCk7CisgIGIyID0gKFBhY2tldDRmKSB2ZWNfc2xkKHZlY3NbMV0udiwgdmVjc1swXS52LCA4KTsKKyAgYjIgPSAoUGFja2V0NGYpIHZlY19zbGQoYjIsIGIyLCA4KTsKKyAgYjIgPSBwYWRkKGIxLCBiMik7CisKKyAgcmV0dXJuIFBhY2tldDJjZihiMik7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHByZWR1eF9tdWw8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEpCit7CisgIFBhY2tldDRmIGI7CisgIFBhY2tldDJjZiBwcm9kOworICBiID0gKFBhY2tldDRmKSB2ZWNfc2xkKGEudiwgYS52LCA4KTsKKyAgcHJvZCA9IHBtdWwoYSwgUGFja2V0MmNmKGIpKTsKKworICByZXR1cm4gcGZpcnN0KHByb2QpOworfQorCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQyY2Y+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKFBhY2tldDJjZiYgZmlyc3QsIGNvbnN0IFBhY2tldDJjZiYgc2Vjb25kKQorICB7CisgICAgaWYgKE9mZnNldD09MSkKKyAgICB7CisgICAgICBmaXJzdC52ID0gdmVjX3NsZChmaXJzdC52LCBzZWNvbmQudiwgOCk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQyY2YsIFBhY2tldDJjZiwgZmFsc2UsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG1hZGQoY29uc3QgUGFja2V0MmNmJiB4LCBjb25zdCBQYWNrZXQyY2YmIHksIGNvbnN0IFBhY2tldDJjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsKGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsIHBjb25qKGIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNmLCBQYWNrZXQyY2YsIHRydWUsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChwY29uaihhKSwgYik7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZiwgUGFja2V0MmNmLCB0cnVlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBwY29uaihpbnRlcm5hbDo6cG11bChhLCBiKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGRpdjxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKQoreworICAvLyBUT0RPIG9wdGltaXplIGl0IGZvciBBbHRpVmVjCisgIFBhY2tldDJjZiByZXMgPSBjb25qX2hlbHBlcjxQYWNrZXQyY2YsUGFja2V0MmNmLGZhbHNlLHRydWU+KCkucG11bChhLGIpOworICBQYWNrZXQ0ZiBzID0gdmVjX21hZGQoYi52LCBiLnYsIHA0Zl9aRVJPKTsKKyAgcmV0dXJuIFBhY2tldDJjZihwZGl2KHJlcy52LCB2ZWNfYWRkKHMsdmVjX3Blcm0ocywgcywgcDE2dWNfQ09NUExFWF9SRVYpKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBjcGx4ZmxpcDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgeCkKK3sKKyAgcmV0dXJuIFBhY2tldDJjZih2ZWNfcGVybSh4LnYsIHgudiwgcDE2dWNfQ09NUExFWF9SRVYpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09NUExFWF9BTFRJVkVDX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQWx0aVZlYy9QYWNrZXRNYXRoLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0FsdGlWZWMvUGFja2V0TWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZGUxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL0FsdGlWZWMvUGFja2V0TWF0aC5oCkBAIC0wLDAgKzEsNDk4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBLb25zdGFudGlub3MgTWFyZ2FyaXRpcyA8bWFya29zQGNvZGV4LmdyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QQUNLRVRfTUFUSF9BTFRJVkVDX0gKKyNkZWZpbmUgRUlHRU5fUEFDS0VUX01BVEhfQUxUSVZFQ19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZm5kZWYgRUlHRU5fQ0FDSEVGUklFTkRMWV9QUk9EVUNUX1RIUkVTSE9MRAorI2RlZmluZSBFSUdFTl9DQUNIRUZSSUVORExZX1BST0RVQ1RfVEhSRVNIT0xEIDQKKyNlbmRpZgorCisjaWZuZGVmIEVJR0VOX0hBU19GVVNFX0NKTUFERAorI2RlZmluZSBFSUdFTl9IQVNfRlVTRV9DSk1BREQgMQorI2VuZGlmCisKKy8vIE5PVEUgQWx0aXZlYyBoYXMgMzIgcmVnaXN0ZXJzLCBidXQgRWlnZW4gb25seSBhY2NlcHRzIGEgdmFsdWUgb2YgOCBvciAxNgorI2lmbmRlZiBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUworI2RlZmluZSBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUyAxNgorI2VuZGlmCisKK3R5cGVkZWYgX192ZWN0b3IgZmxvYXQgICAgICAgICAgUGFja2V0NGY7Cit0eXBlZGVmIF9fdmVjdG9yIGludCAgICAgICAgICAgIFBhY2tldDRpOwordHlwZWRlZiBfX3ZlY3RvciB1bnNpZ25lZCBpbnQgICBQYWNrZXQ0dWk7Cit0eXBlZGVmIF9fdmVjdG9yIF9fYm9vbCBpbnQgICAgIFBhY2tldDRiaTsKK3R5cGVkZWYgX192ZWN0b3Igc2hvcnQgaW50ICAgICAgUGFja2V0OGk7Cit0eXBlZGVmIF9fdmVjdG9yIHVuc2lnbmVkIGNoYXIgIFBhY2tldDE2dWM7CisKKy8vIFdlIGRvbid0IHdhbnQgdG8gd3JpdGUgdGhlIHNhbWUgY29kZSBhbGwgdGhlIHRpbWUsIGJ1dCB3ZSBuZWVkIHRvIHJldXNlIHRoZSBjb25zdGFudHMKKy8vIGFuZCBpdCBkb2Vzbid0IHJlYWxseSB3b3JrIHRvIGRlY2xhcmUgdGhlbSBnbG9iYWwsIHNvIHdlIGRlZmluZSBtYWNyb3MgaW5zdGVhZAorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX0ZBU1RfUGFja2V0NGYoTkFNRSxYKSBcCisgIFBhY2tldDRmIHA0Zl8jI05BTUUgPSAoUGFja2V0NGYpIHZlY19zcGxhdF9zMzIoWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9GQVNUX1BhY2tldDRpKE5BTUUsWCkgXAorICBQYWNrZXQ0aSBwNGlfIyNOQU1FID0gdmVjX3NwbGF0X3MzMihYKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKE5BTUUsWCkgXAorICBQYWNrZXQ0ZiBwNGZfIyNOQU1FID0gcHNldDE8UGFja2V0NGY+KFgpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGZfRlJPTV9JTlQoTkFNRSxYKSBcCisgIFBhY2tldDRmIHA0Zl8jI05BTUUgPSB2cmVpbnRlcnByZXRxX2YzMl91MzIocHNldDE8aW50PihYKSkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aShOQU1FLFgpIFwKKyAgUGFja2V0NGkgcDRpXyMjTkFNRSA9IHBzZXQxPFBhY2tldDRpPihYKQorCisjZGVmaW5lIERTVF9DSEFOIDEKKyNkZWZpbmUgRFNUX0NUUkwoc2l6ZSwgY291bnQsIHN0cmlkZSkgKCgoc2l6ZSkgPDwgMjQpIHwgKChjb3VudCkgPDwgMTYpIHwgKHN0cmlkZSkpCisKKy8vIERlZmluZSBnbG9iYWwgc3RhdGljIGNvbnN0YW50czoKK3N0YXRpYyBQYWNrZXQ0ZiBwNGZfQ09VTlRET1dOID0geyAzLjAsIDIuMCwgMS4wLCAwLjAgfTsKK3N0YXRpYyBQYWNrZXQ0aSBwNGlfQ09VTlRET1dOID0geyAzLCAyLCAxLCAwIH07CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19SRVZFUlNFID0gezEyLDEzLDE0LDE1LCA4LDksMTAsMTEsIDQsNSw2LDcsIDAsMSwyLDN9Oworc3RhdGljIFBhY2tldDE2dWMgcDE2dWNfRk9SV0FSRCA9IHZlY19sdnNsKDAsIChmbG9hdCopMCk7CitzdGF0aWMgUGFja2V0MTZ1YyBwMTZ1Y19EVVBMSUNBVEUgPSB7MCwxLDIsMywgMCwxLDIsMywgNCw1LDYsNywgNCw1LDYsN307CisKK3N0YXRpYyBfRUlHRU5fREVDTEFSRV9DT05TVF9GQVNUX1BhY2tldDRmKFpFUk8sIDApOworc3RhdGljIF9FSUdFTl9ERUNMQVJFX0NPTlNUX0ZBU1RfUGFja2V0NGkoWkVSTywgMCk7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQ0aShPTkUsMSk7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQ0aShNSU5VUzE2LC0xNik7CitzdGF0aWMgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfRkFTVF9QYWNrZXQ0aShNSU5VUzEsLTEpOworc3RhdGljIFBhY2tldDRmIHA0Zl9PTkUgPSB2ZWNfY3RmKHA0aV9PTkUsIDApOworc3RhdGljIFBhY2tldDRmIHA0Zl9aRVJPXyA9IChQYWNrZXQ0ZikgdmVjX3NsKChQYWNrZXQ0dWkpcDRpX01JTlVTMSwgKFBhY2tldDR1aSlwNGlfTUlOVVMxKTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxmbG9hdD4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0NGYgdHlwZTsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemU9NCwKKworICAgIC8vIEZJWE1FIGNoZWNrIHRoZSBIYXMqCisgICAgSGFzU2luICA9IDAsCisgICAgSGFzQ29zICA9IDAsCisgICAgSGFzTG9nICA9IDAsCisgICAgSGFzRXhwICA9IDAsCisgICAgSGFzU3FydCA9IDAKKyAgfTsKK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBwYWNrZXRfdHJhaXRzPGludD4gICAgOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQ0aSB0eXBlOworICBlbnVtIHsKKyAgICAvLyBGSVhNRSBjaGVjayB0aGUgSGFzKgorICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTQKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQ0Zj4geyB0eXBlZGVmIGZsb2F0ICB0eXBlOyBlbnVtIHtzaXplPTR9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDRpPiB7IHR5cGVkZWYgaW50ICAgIHR5cGU7IGVudW0ge3NpemU9NH07IH07CisvKgoraW5saW5lIHN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IFBhY2tldDRmICYgdikKK3sKKyAgdW5pb24geworICAgIFBhY2tldDRmICAgdjsKKyAgICBmbG9hdCBuWzRdOworICB9IHZ0OworICB2dC52ID0gdjsKKyAgcyA8PCB2dC5uWzBdIDw8ICIsICIgPDwgdnQublsxXSA8PCAiLCAiIDw8IHZ0Lm5bMl0gPDwgIiwgIiA8PCB2dC5uWzNdOworICByZXR1cm4gczsKK30KKworaW5saW5lIHN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IFBhY2tldDRpICYgdikKK3sKKyAgdW5pb24geworICAgIFBhY2tldDRpICAgdjsKKyAgICBpbnQgbls0XTsKKyAgfSB2dDsKKyAgdnQudiA9IHY7CisgIHMgPDwgdnQublswXSA8PCAiLCAiIDw8IHZ0Lm5bMV0gPDwgIiwgIiA8PCB2dC5uWzJdIDw8ICIsICIgPDwgdnQublszXTsKKyAgcmV0dXJuIHM7Cit9CisKK2lubGluZSBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBQYWNrZXQ0dWkgJiB2KQoreworICB1bmlvbiB7CisgICAgUGFja2V0NHVpICAgdjsKKyAgICB1bnNpZ25lZCBpbnQgbls0XTsKKyAgfSB2dDsKKyAgdnQudiA9IHY7CisgIHMgPDwgdnQublswXSA8PCAiLCAiIDw8IHZ0Lm5bMV0gPDwgIiwgIiA8PCB2dC5uWzJdIDw8ICIsICIgPDwgdnQublszXTsKKyAgcmV0dXJuIHM7Cit9CisKK2lubGluZSBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBQYWNrZXRiaSAmIHYpCit7CisgIHVuaW9uIHsKKyAgICBQYWNrZXQ0YmkgdjsKKyAgICB1bnNpZ25lZCBpbnQgbls0XTsKKyAgfSB2dDsKKyAgdnQudiA9IHY7CisgIHMgPDwgdnQublswXSA8PCAiLCAiIDw8IHZ0Lm5bMV0gPDwgIiwgIiA8PCB2dC5uWzJdIDw8ICIsICIgPDwgdnQublszXTsKKyAgcmV0dXJuIHM7Cit9CisqLwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBzZXQxPFBhY2tldDRmPihjb25zdCBmbG9hdCYgIGZyb20pIHsKKyAgLy8gVGFrZW4gZnJvbSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9oYXJkd2FyZWRyaXZlcnMvdmUvYWxpZ25tZW50Lmh0bWwKKyAgZmxvYXQgRUlHRU5fQUxJR04xNiBhZls0XTsKKyAgYWZbMF0gPSBmcm9tOworICBQYWNrZXQ0ZiB2YyA9IHZlY19sZCgwLCBhZik7CisgIHZjID0gdmVjX3NwbGF0KHZjLCAwKTsKKyAgcmV0dXJuIHZjOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHNldDE8UGFja2V0NGk+KGNvbnN0IGludCYgICAgZnJvbSkgICB7CisgIGludCBFSUdFTl9BTElHTjE2IGFpWzRdOworICBhaVswXSA9IGZyb207CisgIFBhY2tldDRpIHZjID0gdmVjX2xkKDAsIGFpKTsKKyAgdmMgPSB2ZWNfc3BsYXQodmMsIDApOworICByZXR1cm4gdmM7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbHNldDxmbG9hdD4oY29uc3QgZmxvYXQmIGEpIHsgcmV0dXJuIHZlY19hZGQocHNldDE8UGFja2V0NGY+KGEpLCBwNGZfQ09VTlRET1dOKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsc2V0PGludD4oY29uc3QgaW50JiBhKSAgICAgeyByZXR1cm4gdmVjX2FkZChwc2V0MTxQYWNrZXQ0aT4oYSksIHA0aV9DT1VOVERPV04pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYWRkPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZlY19hZGQoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhZGQ8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdmVjX2FkZChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwc3ViPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZlY19zdWIoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBzdWI8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdmVjX3N1YihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbmVnYXRlKGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiBwc3ViPFBhY2tldDRmPihwNGZfWkVSTywgYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbmVnYXRlKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiBwc3ViPFBhY2tldDRpPihwNGlfWkVSTywgYSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtdWw8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gdmVjX21hZGQoYSxiLHA0Zl9aRVJPKTsgfQorLyogQ29tbWVudGVkIG91dDogaXQncyBhY3R1YWxseSBzbG93ZXIgdGhhbiBwcm9jZXNzaW5nIGl0IHNjYWxhcgorICoKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbXVsPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpCit7CisgIC8vIERldGFpbGVkIGluOiBodHRwOi8vZnJlZXZlYy5vcmcvY29udGVudC8zMmJpdF9zaWduZWRfaW50ZWdlcl9tdWx0aXBsaWNhdGlvbl9hbHRpdmVjCisgIC8vU2V0IHVwIGNvbnN0YW50cywgdmFyaWFibGVzCisgIFBhY2tldDRpIGExLCBiMSwgYnN3YXAsIGxvd19wcm9kLCBoaWdoX3Byb2QsIHByb2QsIHByb2RfLCB2MXNlbDsKKworICAvLyBHZXQgdGhlIGFic29sdXRlIHZhbHVlcworICBhMSAgPSB2ZWNfYWJzKGEpOworICBiMSAgPSB2ZWNfYWJzKGIpOworCisgIC8vIEdldCB0aGUgc2lnbnMgdXNpbmcgeG9yCisgIFBhY2tldDRiaSBzZ24gPSAoUGFja2V0NGJpKSB2ZWNfY21wbHQodmVjX3hvcihhLCBiKSwgcDRpX1pFUk8pOworCisgIC8vIERvIHRoZSBtdWx0aXBsaWNhdGlvbiBmb3IgdGhlIGFzYm9sdXRlIHZhbHVlcy4KKyAgYnN3YXAgPSAoUGFja2V0NGkpIHZlY19ybCgoUGFja2V0NHVpKSBiMSwgKFBhY2tldDR1aSkgcDRpX01JTlVTMTYgKTsKKyAgbG93X3Byb2QgPSB2ZWNfbXVsbygoUGFja2V0OGkpIGExLCAoUGFja2V0OGkpYjEpOworICBoaWdoX3Byb2QgPSB2ZWNfbXN1bSgoUGFja2V0OGkpIGExLCAoUGFja2V0OGkpIGJzd2FwLCBwNGlfWkVSTyk7CisgIGhpZ2hfcHJvZCA9IChQYWNrZXQ0aSkgdmVjX3NsKChQYWNrZXQ0dWkpIGhpZ2hfcHJvZCwgKFBhY2tldDR1aSkgcDRpX01JTlVTMTYpOworICBwcm9kID0gdmVjX2FkZCggbG93X3Byb2QsIGhpZ2hfcHJvZCApOworCisgIC8vIE5PUiB0aGUgcHJvZHVjdCBhbmQgc2VsZWN0IG9ubHkgdGhlIG5lZ2F0aXZlIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgc2lnbiBtYXNrCisgIHByb2RfID0gdmVjX25vcihwcm9kLCBwcm9kKTsKKyAgcHJvZF8gPSB2ZWNfc2VsKHA0aV9aRVJPLCBwcm9kXywgc2duKTsKKworICAvLyBBZGQgMSB0byB0aGUgcmVzdWx0IHRvIGdldCB0aGUgbmVnYXRpdmUgbnVtYmVycworICB2MXNlbCA9IHZlY19zZWwocDRpX1pFUk8sIHA0aV9PTkUsIHNnbik7CisgIHByb2RfID0gdmVjX2FkZChwcm9kXywgdjFzZWwpOworCisgIC8vIE1lcmdlIHRoZSByZXN1bHRzIGJhY2sgdG8gdGhlIGZpbmFsIHZlY3Rvci4KKyAgcHJvZCA9IHZlY19zZWwocHJvZCwgcHJvZF8sIHNnbik7CisKKyAgcmV0dXJuIHByb2Q7Cit9CisqLwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBkaXY8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikKK3sKKyAgUGFja2V0NGYgdCwgeV8wLCB5XzEsIHJlczsKKworICAvLyBBbHRpdmVjIGRvZXMgbm90IG9mZmVyIGEgZGl2aWRlIGluc3RydWN0aW9uLCB3ZSBoYXZlIHRvIGRvIGEgcmVjaXByb2NhbCBhcHByb3hpbWF0aW9uCisgIHlfMCA9IHZlY19yZShiKTsKKworICAvLyBEbyBvbmUgTmV3dG9uLVJhcGhzb24gaXRlcmF0aW9uIHRvIGdldCB0aGUgbmVlZGVkIGFjY3VyYWN5CisgIHQgICA9IHZlY19ubXN1Yih5XzAsIGIsIHA0Zl9PTkUpOworICB5XzEgPSB2ZWNfbWFkZCh5XzAsIHQsIHlfMCk7CisKKyAgcmVzID0gdmVjX21hZGQoYSwgeV8xLCBwNGZfWkVSTyk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwZGl2PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgLyphKi8sIGNvbnN0IFBhY2tldDRpJiAvKmIqLykKK3sgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJwYWNrZXQgaW50ZWdlciBkaXZpc2lvbiBhcmUgbm90IHN1cHBvcnRlZCBieSBBbHRpVmVjIik7CisgIHJldHVybiBwc2V0MTxQYWNrZXQ0aT4oMCk7Cit9CisKKy8vIGZvciBzb21lIHdlaXJkIHJhaXNvbnMsIGl0IGhhcyB0byBiZSBvdmVybG9hZGVkIGZvciBwYWNrZXQgb2YgaW50ZWdlcnMKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbWFkZChjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIsIGNvbnN0IFBhY2tldDRmJiBjKSB7IHJldHVybiB2ZWNfbWFkZChhLCBiLCBjKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBtYWRkKGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYiwgY29uc3QgUGFja2V0NGkmIGMpIHsgcmV0dXJuIHBhZGQocG11bChhLGIpLCBjKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG1pbjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiB2ZWNfbWluKGEsIGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG1pbjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2ZWNfbWluKGEsIGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbWF4PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZlY19tYXgoYSwgYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbWF4PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZlY19tYXgoYSwgYik7IH0KKworLy8gTG9naWNhbCBPcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBmbG9hdCwgc28gd2UgaGF2ZSB0byByZWludGVycHJldCBjYXN0cyB1c2luZyBORU9OIGludHJpbnNpY3MKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYW5kPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZlY19hbmQoYSwgYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYW5kPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZlY19hbmQoYSwgYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBvcjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiB2ZWNfb3IoYSwgYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwb3I8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdmVjX29yKGEsIGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBweG9yPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZlY194b3IoYSwgYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBweG9yPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZlY194b3IoYSwgYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBhbmRub3Q8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gdmVjX2FuZChhLCB2ZWNfbm9yKGIsIGIpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhbmRub3Q8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdmVjX2FuZChhLCB2ZWNfbm9yKGIsIGIpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxvYWQ8UGFja2V0NGY+KGNvbnN0IGZsb2F0KiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gdmVjX2xkKDAsIGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGxvYWQ8UGFja2V0NGk+KGNvbnN0IGludCogICAgIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiB2ZWNfbGQoMCwgZnJvbSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBsb2FkdTxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqIGZyb20pCit7CisgIEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRAorICAvLyBUYWtlbiBmcm9tIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2hhcmR3YXJlZHJpdmVycy92ZS9hbGlnbm1lbnQuaHRtbAorICBQYWNrZXQxNnVjIE1TUSwgTFNROworICBQYWNrZXQxNnVjIG1hc2s7CisgIE1TUSA9IHZlY19sZCgwLCAodW5zaWduZWQgY2hhciAqKWZyb20pOyAgICAgICAgICAvLyBtb3N0IHNpZ25pZmljYW50IHF1YWR3b3JkCisgIExTUSA9IHZlY19sZCgxNSwgKHVuc2lnbmVkIGNoYXIgKilmcm9tKTsgICAgICAgICAvLyBsZWFzdCBzaWduaWZpY2FudCBxdWFkd29yZAorICBtYXNrID0gdmVjX2x2c2woMCwgZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBwZXJtdXRlIG1hc2sKKyAgcmV0dXJuIChQYWNrZXQ0ZikgdmVjX3Blcm0oTVNRLCBMU1EsIG1hc2spOyAgICAgICAgICAgLy8gYWxpZ24gdGhlIGRhdGEKKworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkdTxQYWNrZXQ0aT4oY29uc3QgaW50KiBmcm9tKQoreworICBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQKKyAgLy8gVGFrZW4gZnJvbSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9oYXJkd2FyZWRyaXZlcnMvdmUvYWxpZ25tZW50Lmh0bWwKKyAgUGFja2V0MTZ1YyBNU1EsIExTUTsKKyAgUGFja2V0MTZ1YyBtYXNrOworICBNU1EgPSB2ZWNfbGQoMCwgKHVuc2lnbmVkIGNoYXIgKilmcm9tKTsgICAgICAgICAgLy8gbW9zdCBzaWduaWZpY2FudCBxdWFkd29yZAorICBMU1EgPSB2ZWNfbGQoMTUsICh1bnNpZ25lZCBjaGFyICopZnJvbSk7ICAgICAgICAgLy8gbGVhc3Qgc2lnbmlmaWNhbnQgcXVhZHdvcmQKKyAgbWFzayA9IHZlY19sdnNsKDAsIGZyb20pOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcGVybXV0ZSBtYXNrCisgIHJldHVybiAoUGFja2V0NGkpIHZlY19wZXJtKE1TUSwgTFNRLCBtYXNrKTsgICAgLy8gYWxpZ24gdGhlIGRhdGEKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBsb2FkZHVwPFBhY2tldDRmPihjb25zdCBmbG9hdCogICBmcm9tKQoreworICBQYWNrZXQ0ZiBwOworICBpZigocHRyZGlmZl90KCZmcm9tKSAlIDE2KSA9PSAwKSAgcCA9IHBsb2FkPFBhY2tldDRmPihmcm9tKTsKKyAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwbG9hZHU8UGFja2V0NGY+KGZyb20pOworICByZXR1cm4gdmVjX3Blcm0ocCwgcCwgcDE2dWNfRFVQTElDQVRFKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbG9hZGR1cDxQYWNrZXQ0aT4oY29uc3QgaW50KiAgICAgZnJvbSkKK3sKKyAgUGFja2V0NGkgcDsKKyAgaWYoKHB0cmRpZmZfdCgmZnJvbSkgJSAxNikgPT0gMCkgIHAgPSBwbG9hZDxQYWNrZXQ0aT4oZnJvbSk7CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gcGxvYWR1PFBhY2tldDRpPihmcm9tKTsKKyAgcmV0dXJuIHZlY19wZXJtKHAsIHAsIHAxNnVjX0RVUExJQ0FURSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxmbG9hdD4oZmxvYXQqICAgdG8sIGNvbnN0IFBhY2tldDRmJiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgdmVjX3N0KGZyb20sIDAsIHRvKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPGludD4oaW50KiAgICAgICB0bywgY29uc3QgUGFja2V0NGkmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSB2ZWNfc3QoZnJvbSwgMCwgdG8pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8ZmxvYXQ+KGZsb2F0KiAgdG8sIGNvbnN0IFBhY2tldDRmJiBmcm9tKQoreworICBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUKKyAgLy8gVGFrZW4gZnJvbSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9oYXJkd2FyZWRyaXZlcnMvdmUvYWxpZ25tZW50Lmh0bWwKKyAgLy8gV2FybmluZzogbm90IHRocmVhZCBzYWZlIQorICBQYWNrZXQxNnVjIE1TUSwgTFNRLCBlZGdlczsKKyAgUGFja2V0MTZ1YyBlZGdlQWxpZ24sIGFsaWduOworCisgIE1TUSA9IHZlY19sZCgwLCAodW5zaWduZWQgY2hhciAqKXRvKTsgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHNpZ25pZmljYW50IHF1YWR3b3JkCisgIExTUSA9IHZlY19sZCgxNSwgKHVuc2lnbmVkIGNoYXIgKil0byk7ICAgICAgICAgICAgICAgICAgICAvLyBsZWFzdCBzaWduaWZpY2FudCBxdWFkd29yZAorICBlZGdlQWxpZ24gPSB2ZWNfbHZzbCgwLCB0byk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybXV0ZSBtYXAgdG8gZXh0cmFjdCBlZGdlcworICBlZGdlcz12ZWNfcGVybShMU1EsTVNRLGVkZ2VBbGlnbik7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCB0aGUgZWRnZXMKKyAgYWxpZ24gPSB2ZWNfbHZzciggMCwgdG8gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcm11dGUgbWFwIHRvIG1pc2FsaWduIGRhdGEKKyAgTVNRID0gdmVjX3Blcm0oZWRnZXMsKFBhY2tldDE2dWMpZnJvbSxhbGlnbik7ICAgICAgICAgICAgIC8vIG1pc2FsaWduIHRoZSBkYXRhIChNU1EpCisgIExTUSA9IHZlY19wZXJtKChQYWNrZXQxNnVjKWZyb20sZWRnZXMsYWxpZ24pOyAgICAgICAgICAgICAvLyBtaXNhbGlnbiB0aGUgZGF0YSAoTFNRKQorICB2ZWNfc3QoIExTUSwgMTUsICh1bnNpZ25lZCBjaGFyICopdG8gKTsgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIExTUSBwYXJ0IGZpcnN0CisgIHZlY19zdCggTVNRLCAwLCAodW5zaWduZWQgY2hhciAqKXRvICk7ICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgTVNRIHBhcnQKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8aW50PihpbnQqICAgICAgdG8sIGNvbnN0IFBhY2tldDRpJiBmcm9tKQoreworICBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUKKyAgLy8gVGFrZW4gZnJvbSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9oYXJkd2FyZWRyaXZlcnMvdmUvYWxpZ25tZW50Lmh0bWwKKyAgLy8gV2FybmluZzogbm90IHRocmVhZCBzYWZlIQorICBQYWNrZXQxNnVjIE1TUSwgTFNRLCBlZGdlczsKKyAgUGFja2V0MTZ1YyBlZGdlQWxpZ24sIGFsaWduOworCisgIE1TUSA9IHZlY19sZCgwLCAodW5zaWduZWQgY2hhciAqKXRvKTsgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHNpZ25pZmljYW50IHF1YWR3b3JkCisgIExTUSA9IHZlY19sZCgxNSwgKHVuc2lnbmVkIGNoYXIgKil0byk7ICAgICAgICAgICAgICAgICAgICAvLyBsZWFzdCBzaWduaWZpY2FudCBxdWFkd29yZAorICBlZGdlQWxpZ24gPSB2ZWNfbHZzbCgwLCB0byk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybXV0ZSBtYXAgdG8gZXh0cmFjdCBlZGdlcworICBlZGdlcz12ZWNfcGVybShMU1EsIE1TUSwgZWRnZUFsaWduKTsgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCB0aGUgZWRnZXMKKyAgYWxpZ24gPSB2ZWNfbHZzciggMCwgdG8gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcm11dGUgbWFwIHRvIG1pc2FsaWduIGRhdGEKKyAgTVNRID0gdmVjX3Blcm0oZWRnZXMsIChQYWNrZXQxNnVjKSBmcm9tLCBhbGlnbik7ICAgICAgICAgIC8vIG1pc2FsaWduIHRoZSBkYXRhIChNU1EpCisgIExTUSA9IHZlY19wZXJtKChQYWNrZXQxNnVjKSBmcm9tLCBlZGdlcywgYWxpZ24pOyAgICAgICAgICAvLyBtaXNhbGlnbiB0aGUgZGF0YSAoTFNRKQorICB2ZWNfc3QoIExTUSwgMTUsICh1bnNpZ25lZCBjaGFyICopdG8gKTsgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIExTUSBwYXJ0IGZpcnN0CisgIHZlY19zdCggTVNRLCAwLCAodW5zaWduZWQgY2hhciAqKXRvICk7ICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgTVNRIHBhcnQKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8ZmxvYXQ+KGNvbnN0IGZsb2F0KiBhZGRyKSB7IHZlY19kc3R0KGFkZHIsIERTVF9DVFJMKDIsMiwzMiksIERTVF9DSEFOKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8aW50Pihjb25zdCBpbnQqICAgICBhZGRyKSB7IHZlY19kc3R0KGFkZHIsIERTVF9DVFJMKDIsMiwzMiksIERTVF9DSEFOKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgIHBmaXJzdDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpIHsgZmxvYXQgRUlHRU5fQUxJR04xNiB4WzRdOyB2ZWNfc3QoYSwgMCwgeCk7IHJldHVybiB4WzBdOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50ICAgIHBmaXJzdDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpIHsgaW50ICAgRUlHRU5fQUxJR04xNiB4WzRdOyB2ZWNfc3QoYSwgMCwgeCk7IHJldHVybiB4WzBdOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwcmV2ZXJzZShjb25zdCBQYWNrZXQ0ZiYgYSkgeyByZXR1cm4gKFBhY2tldDRmKXZlY19wZXJtKChQYWNrZXQxNnVjKWEsKFBhY2tldDE2dWMpYSwgcDE2dWNfUkVWRVJTRSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwcmV2ZXJzZShjb25zdCBQYWNrZXQ0aSYgYSkgeyByZXR1cm4gKFBhY2tldDRpKXZlY19wZXJtKChQYWNrZXQxNnVjKWEsKFBhY2tldDE2dWMpYSwgcDE2dWNfUkVWRVJTRSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBhYnMoY29uc3QgUGFja2V0NGYmIGEpIHsgcmV0dXJuIHZlY19hYnMoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYWJzKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiB2ZWNfYWJzKGEpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXg8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiBiLCBzdW07CisgIGIgICA9IChQYWNrZXQ0ZikgdmVjX3NsZChhLCBhLCA4KTsKKyAgc3VtID0gdmVjX2FkZChhLCBiKTsKKyAgYiAgID0gKFBhY2tldDRmKSB2ZWNfc2xkKHN1bSwgc3VtLCA0KTsKKyAgc3VtID0gdmVjX2FkZChzdW0sIGIpOworICByZXR1cm4gcGZpcnN0KHN1bSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwcmVkdXhwPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiogdmVjcykKK3sKKyAgUGFja2V0NGYgdls0XSwgc3VtWzRdOworCisgIC8vIEl0J3MgZWFzaWVyIGFuZCBmYXN0ZXIgdG8gdHJhbnNwb3NlIHRoZW4gYWRkIGFzIGNvbHVtbnMKKyAgLy8gQ2hlY2s6IGh0dHA6Ly93d3cuZnJlZXZlYy5vcmcvZnVuY3Rpb24vbWF0cml4XzR4NF90cmFuc3Bvc2VfZmxvYXRzIGZvciBleHBsYW5hdGlvbgorICAvLyBEbyB0aGUgdHJhbnNwb3NlLCBmaXJzdCBzZXQgb2YgbW92ZXMKKyAgdlswXSA9IHZlY19tZXJnZWgodmVjc1swXSwgdmVjc1syXSk7CisgIHZbMV0gPSB2ZWNfbWVyZ2VsKHZlY3NbMF0sIHZlY3NbMl0pOworICB2WzJdID0gdmVjX21lcmdlaCh2ZWNzWzFdLCB2ZWNzWzNdKTsKKyAgdlszXSA9IHZlY19tZXJnZWwodmVjc1sxXSwgdmVjc1szXSk7CisgIC8vIEdldCB0aGUgcmVzdWx0aW5nIHZlY3RvcnMKKyAgc3VtWzBdID0gdmVjX21lcmdlaCh2WzBdLCB2WzJdKTsKKyAgc3VtWzFdID0gdmVjX21lcmdlbCh2WzBdLCB2WzJdKTsKKyAgc3VtWzJdID0gdmVjX21lcmdlaCh2WzFdLCB2WzNdKTsKKyAgc3VtWzNdID0gdmVjX21lcmdlbCh2WzFdLCB2WzNdKTsKKworICAvLyBOb3cgZG8gdGhlIHN1bW1hdGlvbjoKKyAgLy8gTGluZXMgMCsxCisgIHN1bVswXSA9IHZlY19hZGQoc3VtWzBdLCBzdW1bMV0pOworICAvLyBMaW5lcyAyKzMKKyAgc3VtWzFdID0gdmVjX2FkZChzdW1bMl0sIHN1bVszXSk7CisgIC8vIEFkZCB0aGUgcmVzdWx0cworICBzdW1bMF0gPSB2ZWNfYWRkKHN1bVswXSwgc3VtWzFdKTsKKworICByZXR1cm4gc3VtWzBdOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IHByZWR1eDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIFBhY2tldDRpIHN1bTsKKyAgc3VtID0gdmVjX3N1bXMoYSwgcDRpX1pFUk8pOworICBzdW0gPSB2ZWNfc2xkKHN1bSwgcDRpX1pFUk8sIDEyKTsKKyAgcmV0dXJuIHBmaXJzdChzdW0pOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHJlZHV4cDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkqIHZlY3MpCit7CisgIFBhY2tldDRpIHZbNF0sIHN1bVs0XTsKKworICAvLyBJdCdzIGVhc2llciBhbmQgZmFzdGVyIHRvIHRyYW5zcG9zZSB0aGVuIGFkZCBhcyBjb2x1bW5zCisgIC8vIENoZWNrOiBodHRwOi8vd3d3LmZyZWV2ZWMub3JnL2Z1bmN0aW9uL21hdHJpeF80eDRfdHJhbnNwb3NlX2Zsb2F0cyBmb3IgZXhwbGFuYXRpb24KKyAgLy8gRG8gdGhlIHRyYW5zcG9zZSwgZmlyc3Qgc2V0IG9mIG1vdmVzCisgIHZbMF0gPSB2ZWNfbWVyZ2VoKHZlY3NbMF0sIHZlY3NbMl0pOworICB2WzFdID0gdmVjX21lcmdlbCh2ZWNzWzBdLCB2ZWNzWzJdKTsKKyAgdlsyXSA9IHZlY19tZXJnZWgodmVjc1sxXSwgdmVjc1szXSk7CisgIHZbM10gPSB2ZWNfbWVyZ2VsKHZlY3NbMV0sIHZlY3NbM10pOworICAvLyBHZXQgdGhlIHJlc3VsdGluZyB2ZWN0b3JzCisgIHN1bVswXSA9IHZlY19tZXJnZWgodlswXSwgdlsyXSk7CisgIHN1bVsxXSA9IHZlY19tZXJnZWwodlswXSwgdlsyXSk7CisgIHN1bVsyXSA9IHZlY19tZXJnZWgodlsxXSwgdlszXSk7CisgIHN1bVszXSA9IHZlY19tZXJnZWwodlsxXSwgdlszXSk7CisKKyAgLy8gTm93IGRvIHRoZSBzdW1tYXRpb246CisgIC8vIExpbmVzIDArMQorICBzdW1bMF0gPSB2ZWNfYWRkKHN1bVswXSwgc3VtWzFdKTsKKyAgLy8gTGluZXMgMiszCisgIHN1bVsxXSA9IHZlY19hZGQoc3VtWzJdLCBzdW1bM10pOworICAvLyBBZGQgdGhlIHJlc3VsdHMKKyAgc3VtWzBdID0gdmVjX2FkZChzdW1bMF0sIHN1bVsxXSk7CisKKyAgcmV0dXJuIHN1bVswXTsKK30KKworLy8gT3RoZXIgcmVkdWN0aW9uIGZ1bmN0aW9uczoKKy8vIG11bAordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9tdWw8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiBwcm9kOworICBwcm9kID0gcG11bChhLCAoUGFja2V0NGYpdmVjX3NsZChhLCBhLCA4KSk7CisgIHJldHVybiBwZmlyc3QocG11bChwcm9kLCAoUGFja2V0NGYpdmVjX3NsZChwcm9kLCBwcm9kLCA0KSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IHByZWR1eF9tdWw8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBFSUdFTl9BTElHTjE2IGludCBhdXhbNF07CisgIHBzdG9yZShhdXgsIGEpOworICByZXR1cm4gYXV4WzBdICogYXV4WzFdICogYXV4WzJdICogYXV4WzNdOworfQorCisvLyBtaW4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXhfbWluPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgUGFja2V0NGYgYiwgcmVzOworICBiID0gdmVjX21pbihhLCB2ZWNfc2xkKGEsIGEsIDgpKTsKKyAgcmVzID0gdmVjX21pbihiLCB2ZWNfc2xkKGIsIGIsIDQpKTsKKyAgcmV0dXJuIHBmaXJzdChyZXMpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IHByZWR1eF9taW48UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBQYWNrZXQ0aSBiLCByZXM7CisgIGIgPSB2ZWNfbWluKGEsIHZlY19zbGQoYSwgYSwgOCkpOworICByZXMgPSB2ZWNfbWluKGIsIHZlY19zbGQoYiwgYiwgNCkpOworICByZXR1cm4gcGZpcnN0KHJlcyk7Cit9CisKKy8vIG1heAordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9tYXg8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiBiLCByZXM7CisgIGIgPSB2ZWNfbWF4KGEsIHZlY19zbGQoYSwgYSwgOCkpOworICByZXMgPSB2ZWNfbWF4KGIsIHZlY19zbGQoYiwgYiwgNCkpOworICByZXR1cm4gcGZpcnN0KHJlcyk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgcHJlZHV4X21heDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIFBhY2tldDRpIGIsIHJlczsKKyAgYiA9IHZlY19tYXgoYSwgdmVjX3NsZChhLCBhLCA4KSk7CisgIHJlcyA9IHZlY19tYXgoYiwgdmVjX3NsZChiLCBiLCA0KSk7CisgIHJldHVybiBwZmlyc3QocmVzKTsKK30KKwordGVtcGxhdGU8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0NGY+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKFBhY2tldDRmJiBmaXJzdCwgY29uc3QgUGFja2V0NGYmIHNlY29uZCkKKyAgeworICAgIGlmIChPZmZzZXQhPTApCisgICAgICBmaXJzdCA9IHZlY19zbGQoZmlyc3QsIHNlY29uZCwgT2Zmc2V0KjQpOworICB9Cit9OworCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQ0aT4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0NGkmIGZpcnN0LCBjb25zdCBQYWNrZXQ0aSYgc2Vjb25kKQorICB7CisgICAgaWYgKE9mZnNldCE9MCkKKyAgICAgIGZpcnN0ID0gdmVjX3NsZChmaXJzdCwgc2Vjb25kLCBPZmZzZXQqNCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1BBQ0tFVF9NQVRIX0FMVElWRUNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1NmRlYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0IEBACitBRERfU1VCRElSRUNUT1JZKFNTRSkKK0FERF9TVUJESVJFQ1RPUlkoQWx0aVZlYykKK0FERF9TVUJESVJFQ1RPUlkoTkVPTikKK0FERF9TVUJESVJFQ1RPUlkoRGVmYXVsdCkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvRGVmYXVsdC9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvRGVmYXVsdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzljMDkxCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9EZWZhdWx0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX0NvcmVfYXJjaF9EZWZhdWx0X1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9Db3JlX2FyY2hfRGVmYXVsdF9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9Db3JlL2FyY2gvRGVmYXVsdCBDT01QT05FTlQgRGV2ZWwKKykKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvRGVmYXVsdC9TZXR0aW5ncy5oIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9EZWZhdWx0L1NldHRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3MzczYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvRGVmYXVsdC9TZXR0aW5ncy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKworLyogQWxsIHRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gdGhpcyBmaWxlIGNhbiBiZSBzcGVjaWFsaXplZCBpbiB0aGUKKyAqIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBmaWxlcywgYW5kL29yIGJ5IHRoZSB1c2VyLgorICogTW9yZSB0byBjb21lLi4uICovCisKKyNpZm5kZWYgRUlHRU5fREVGQVVMVF9TRVRUSU5HU19ICisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfU0VUVElOR1NfSAorCisvKiogRGVmaW5lcyB0aGUgbWF4aW1hbCBsb29wIHNpemUgdG8gZW5hYmxlIG1ldGEgdW5yb2xsaW5nIG9mIGxvb3BzLgorICAqIE5vdGUgdGhhdCB0aGUgdmFsdWUgaGVyZSBpcyBleHByZXNzZWQgaW4gRWlnZW4ncyBvd24gbm90aW9uIG9mICJudW1iZXIgb2YgRkxPUFMiLAorICAqIGl0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG9yIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zCisgICovCisjaWZuZGVmIEVJR0VOX1VOUk9MTElOR19MSU1JVAorI2RlZmluZSBFSUdFTl9VTlJPTExJTkdfTElNSVQgMTAwCisjZW5kaWYKKworLyoqIERlZmluZXMgdGhlIHRocmVzaG9sZCBiZXR3ZWVuIGEgInNtYWxsIiBhbmQgYSAibGFyZ2UiIG1hdHJpeC4KKyAgKiBUaGlzIHRocmVzaG9sZCBpcyBtYWlubHkgdXNlZCB0byBzZWxlY3QgdGhlIHByb3BlciBwcm9kdWN0IGltcGxlbWVudGF0aW9uLgorICAqLworI2lmbmRlZiBFSUdFTl9DQUNIRUZSSUVORExZX1BST0RVQ1RfVEhSRVNIT0xECisjZGVmaW5lIEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQgOAorI2VuZGlmCisKKy8qKiBEZWZpbmVzIHRoZSBtYXhpbWFsIHdpZHRoIG9mIHRoZSBibG9ja3MgdXNlZCBpbiB0aGUgdHJpYW5ndWxhciBwcm9kdWN0IGFuZCBzb2x2ZXIKKyAgKiBmb3IgdmVjdG9ycyAobGV2ZWwgMiBibGFzIHhUUk1WIGFuZCB4VFJTVikuIFRoZSBkZWZhdWx0IGlzIDguCisgICovCisjaWZuZGVmIEVJR0VOX1RVTkVfVFJJQU5HVUxBUl9QQU5FTF9XSURUSAorI2RlZmluZSBFSUdFTl9UVU5FX1RSSUFOR1VMQVJfUEFORUxfV0lEVEggOAorI2VuZGlmCisKKworLyoqIERlZmluZXMgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIHJlZ2lzdGVycyBhdmFpbGFibGUgZm9yIHRoYXQgYXJjaGl0ZWN0dXJlLgorICAqIEN1cnJlbnRseSBpdCBtdXN0IGJlIDggb3IgMTYuIE90aGVyIHZhbHVlcyB3aWxsIGZhaWwuCisgICovCisjaWZuZGVmIEVJR0VOX0FSQ0hfREVGQVVMVF9OVU1CRVJfT0ZfUkVHSVNURVJTCisjZGVmaW5lIEVJR0VOX0FSQ0hfREVGQVVMVF9OVU1CRVJfT0ZfUkVHSVNURVJTIDgKKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fREVGQVVMVF9TRVRUSU5HU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0ZDRhZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvTkVPTi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9Db3JlX2FyY2hfTkVPTl9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fQ29yZV9hcmNoX05FT05fU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04gQ09NUE9ORU5UIERldmVsCispCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vQ29tcGxleC5oIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9ORU9OL0NvbXBsZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTViNGJlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9ORU9OL0NvbXBsZXguaApAQCAtMCwwICsxLDI1OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTVBMRVhfTkVPTl9ICisjZGVmaW5lIEVJR0VOX0NPTVBMRVhfTkVPTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3N0YXRpYyB1aW50MzJ4NF90IHA0dWlfQ09OSl9YT1IgPSBFSUdFTl9JTklUX05FT05fUEFDS0VUNCgweDAwMDAwMDAwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwKTsKK3N0YXRpYyB1aW50MzJ4Ml90IHAydWlfQ09OSl9YT1IgPSBFSUdFTl9JTklUX05FT05fUEFDS0VUMigweDAwMDAwMDAwLCAweDgwMDAwMDAwKTsKKworLy8tLS0tLS0tLS0tIGZsb2F0IC0tLS0tLS0tLS0KK3N0cnVjdCBQYWNrZXQyY2YKK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YoKSB7fQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IFBhY2tldDJjZihjb25zdCBQYWNrZXQ0ZiYgYSkgOiB2KGEpIHt9CisgIFBhY2tldDRmICB2OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0MmNmIHR5cGU7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplID0gMiwKKworICAgIEhhc0FkZCAgICA9IDEsCisgICAgSGFzU3ViICAgID0gMSwKKyAgICBIYXNNdWwgICAgPSAxLAorICAgIEhhc0RpdiAgICA9IDEsCisgICAgSGFzTmVnYXRlID0gMSwKKyAgICBIYXNBYnMgICAgPSAwLAorICAgIEhhc0FiczIgICA9IDAsCisgICAgSGFzTWluICAgID0gMCwKKyAgICBIYXNNYXggICAgPSAwLAorICAgIEhhc1NldExpbmVhciA9IDAKKyAgfTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQyY2Y+IHsgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHR5cGU7IGVudW0ge3NpemU9Mn07IH07CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHNldDE8UGFja2V0MmNmPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiAgZnJvbSkKK3sKKyAgZmxvYXQzMngyX3QgcjY0OworICByNjQgPSB2bGQxX2YzMigoZmxvYXQgKikmZnJvbSk7CisKKyAgcmV0dXJuIFBhY2tldDJjZih2Y29tYmluZV9mMzIocjY0LCByNjQpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwYWRkPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZihwYWRkPFBhY2tldDRmPihhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHN1YjxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSB7IHJldHVybiBQYWNrZXQyY2YocHN1YjxQYWNrZXQ0Zj4oYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBuZWdhdGUoY29uc3QgUGFja2V0MmNmJiBhKSB7IHJldHVybiBQYWNrZXQyY2YocG5lZ2F0ZTxQYWNrZXQ0Zj4oYS52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGNvbmooY29uc3QgUGFja2V0MmNmJiBhKQoreworICBQYWNrZXQ0dWkgYiA9IHZyZWludGVycHJldHFfdTMyX2YzMihhLnYpOworICByZXR1cm4gUGFja2V0MmNmKHZyZWludGVycHJldHFfZjMyX3UzMih2ZW9ycV91MzIoYiwgcDR1aV9DT05KX1hPUikpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpCit7CisgIFBhY2tldDRmIHYxLCB2MjsKKyAgZmxvYXQzMngyX3QgYV9sbywgYV9oaTsKKworICAvLyBHZXQgdGhlIHJlYWwgdmFsdWVzIG9mIGEgfCBhMV9yZSB8IGExX3JlIHwgYTJfcmUgfCBhMl9yZSB8CisgIHYxID0gdmNvbWJpbmVfZjMyKHZkdXBfbGFuZV9mMzIodmdldF9sb3dfZjMyKGEudiksIDApLCB2ZHVwX2xhbmVfZjMyKHZnZXRfaGlnaF9mMzIoYS52KSwgMCkpOworICAvLyBHZXQgdGhlIHJlYWwgdmFsdWVzIG9mIGEgfCBhMV9pbSB8IGExX2ltIHwgYTJfaW0gfCBhMl9pbSB8CisgIHYyID0gdmNvbWJpbmVfZjMyKHZkdXBfbGFuZV9mMzIodmdldF9sb3dfZjMyKGEudiksIDEpLCB2ZHVwX2xhbmVfZjMyKHZnZXRfaGlnaF9mMzIoYS52KSwgMSkpOworICAvLyBNdWx0aXBseSB0aGUgcmVhbCBhIHdpdGggYgorICB2MSA9IHZtdWxxX2YzMih2MSwgYi52KTsKKyAgLy8gTXVsdGlwbHkgdGhlIGltYWcgYSB3aXRoIGIKKyAgdjIgPSB2bXVscV9mMzIodjIsIGIudik7CisgIC8vIENvbmp1Z2F0ZSB2MiAKKyAgdjIgPSB2cmVpbnRlcnByZXRxX2YzMl91MzIodmVvcnFfdTMyKHZyZWludGVycHJldHFfdTMyX2YzMih2MiksIHA0dWlfQ09OSl9YT1IpKTsKKyAgLy8gU3dhcCByZWFsL2ltYWcgZWxlbWVudHMgaW4gdjIuCisgIGFfbG8gPSB2cmV2NjRfZjMyKHZnZXRfbG93X2YzMih2MikpOworICBhX2hpID0gdnJldjY0X2YzMih2Z2V0X2hpZ2hfZjMyKHYyKSk7CisgIHYyID0gdmNvbWJpbmVfZjMyKGFfbG8sIGFfaGkpOworICAvLyBBZGQgYW5kIHJldHVybiB0aGUgcmVzdWx0CisgIHJldHVybiBQYWNrZXQyY2YodmFkZHFfZjMyKHYxLCB2MikpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhbmQgICA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikKK3sKKyAgcmV0dXJuIFBhY2tldDJjZih2cmVpbnRlcnByZXRxX2YzMl91MzIodm9ycnFfdTMyKHZyZWludGVycHJldHFfdTMyX2YzMihhLnYpLHZyZWludGVycHJldHFfdTMyX2YzMihiLnYpKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwb3IgICAgPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpCit7CisgIHJldHVybiBQYWNrZXQyY2YodnJlaW50ZXJwcmV0cV9mMzJfdTMyKHZvcnJxX3UzMih2cmVpbnRlcnByZXRxX3UzMl9mMzIoYS52KSx2cmVpbnRlcnByZXRxX3UzMl9mMzIoYi52KSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHhvciAgIDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKQoreworICByZXR1cm4gUGFja2V0MmNmKHZyZWludGVycHJldHFfZjMyX3UzMih2ZW9ycV91MzIodnJlaW50ZXJwcmV0cV91MzJfZjMyKGEudiksdnJlaW50ZXJwcmV0cV91MzJfZjMyKGIudikpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhbmRub3Q8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikKK3sKKyAgcmV0dXJuIFBhY2tldDJjZih2cmVpbnRlcnByZXRxX2YzMl91MzIodmJpY3FfdTMyKHZyZWludGVycHJldHFfdTMyX2YzMihhLnYpLHZyZWludGVycHJldHFfdTMyX2YzMihiLnYpKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBsb2FkPFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDJjZihwbG9hZDxQYWNrZXQ0Zj4oKGNvbnN0IGZsb2F0Kilmcm9tKSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGxvYWR1PFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogZnJvbSkgeyBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRCByZXR1cm4gUGFja2V0MmNmKHBsb2FkdTxQYWNrZXQ0Zj4oKGNvbnN0IGZsb2F0Kilmcm9tKSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbG9hZGR1cDxQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20pIHsgcmV0dXJuIHBzZXQxPFBhY2tldDJjZj4oKmZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZSA8c3RkOjpjb21wbGV4PGZsb2F0PiA+KHN0ZDo6Y29tcGxleDxmbG9hdD4gKiAgIHRvLCBjb25zdCBQYWNrZXQyY2YmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSBwc3RvcmUoKGZsb2F0Kil0bywgZnJvbS52KTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oc3RkOjpjb21wbGV4PGZsb2F0PiAqICAgdG8sIGNvbnN0IFBhY2tldDJjZiYgZnJvbSkgeyBFSUdFTl9ERUJVR19VTkFMSUdORURfU1RPUkUgcHN0b3JldSgoZmxvYXQqKXRvLCBmcm9tLnYpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPHN0ZDo6Y29tcGxleDxmbG9hdD4gPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICogICBhZGRyKSB7IF9fcGxkKChmbG9hdCAqKWFkZHIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICBwZmlyc3Q8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEpCit7CisgIHN0ZDo6Y29tcGxleDxmbG9hdD4gRUlHRU5fQUxJR04xNiB4WzJdOworICB2c3QxcV9mMzIoKGZsb2F0ICopeCwgYS52KTsKKyAgcmV0dXJuIHhbMF07Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHJldmVyc2UoY29uc3QgUGFja2V0MmNmJiBhKQoreworICBmbG9hdDMyeDJfdCBhX2xvLCBhX2hpOworICBQYWNrZXQ0ZiBhX3IxMjg7CisKKyAgYV9sbyA9IHZnZXRfbG93X2YzMihhLnYpOworICBhX2hpID0gdmdldF9oaWdoX2YzMihhLnYpOworICBhX3IxMjggPSB2Y29tYmluZV9mMzIoYV9oaSwgYV9sbyk7CisKKyAgcmV0dXJuIFBhY2tldDJjZihhX3IxMjgpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBjcGx4ZmxpcDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgcmV0dXJuIFBhY2tldDJjZih2cmV2NjRxX2YzMihhLnYpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxmbG9hdD4gcHJlZHV4PFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhKQoreworICBmbG9hdDMyeDJfdCBhMSwgYTI7CisgIHN0ZDo6Y29tcGxleDxmbG9hdD4gczsKKworICBhMSA9IHZnZXRfbG93X2YzMihhLnYpOworICBhMiA9IHZnZXRfaGlnaF9mMzIoYS52KTsKKyAgYTIgPSB2YWRkX2YzMihhMSwgYTIpOworICB2c3QxX2YzMigoZmxvYXQgKikmcywgYTIpOworCisgIHJldHVybiBzOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHByZWR1eHA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YqIHZlY3MpCit7CisgIFBhY2tldDRmIHN1bTEsIHN1bTIsIHN1bTsKKworICAvLyBBZGQgdGhlIGZpcnN0IHR3byA2NC1iaXQgZmxvYXQzMngyX3Qgb2YgdmVjc1swXQorICBzdW0xID0gdmNvbWJpbmVfZjMyKHZnZXRfbG93X2YzMih2ZWNzWzBdLnYpLCB2Z2V0X2xvd19mMzIodmVjc1sxXS52KSk7CisgIHN1bTIgPSB2Y29tYmluZV9mMzIodmdldF9oaWdoX2YzMih2ZWNzWzBdLnYpLCB2Z2V0X2hpZ2hfZjMyKHZlY3NbMV0udikpOworICBzdW0gPSB2YWRkcV9mMzIoc3VtMSwgc3VtMik7CisKKyAgcmV0dXJuIFBhY2tldDJjZihzdW0pOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGZsb2F0PiBwcmVkdXhfbXVsPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhKQoreworICBmbG9hdDMyeDJfdCBhMSwgYTIsIHYxLCB2MiwgcHJvZDsKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiBzOworCisgIGExID0gdmdldF9sb3dfZjMyKGEudik7CisgIGEyID0gdmdldF9oaWdoX2YzMihhLnYpOworICAgLy8gR2V0IHRoZSByZWFsIHZhbHVlcyBvZiBhIHwgYTFfcmUgfCBhMV9yZSB8IGEyX3JlIHwgYTJfcmUgfAorICB2MSA9IHZkdXBfbGFuZV9mMzIoYTEsIDApOworICAvLyBHZXQgdGhlIHJlYWwgdmFsdWVzIG9mIGEgfCBhMV9pbSB8IGExX2ltIHwgYTJfaW0gfCBhMl9pbSB8CisgIHYyID0gdmR1cF9sYW5lX2YzMihhMSwgMSk7CisgIC8vIE11bHRpcGx5IHRoZSByZWFsIGEgd2l0aCBiCisgIHYxID0gdm11bF9mMzIodjEsIGEyKTsKKyAgLy8gTXVsdGlwbHkgdGhlIGltYWcgYSB3aXRoIGIKKyAgdjIgPSB2bXVsX2YzMih2MiwgYTIpOworICAvLyBDb25qdWdhdGUgdjIgCisgIHYyID0gdnJlaW50ZXJwcmV0X2YzMl91MzIodmVvcl91MzIodnJlaW50ZXJwcmV0X3UzMl9mMzIodjIpLCBwMnVpX0NPTkpfWE9SKSk7CisgIC8vIFN3YXAgcmVhbC9pbWFnIGVsZW1lbnRzIGluIHYyLgorICB2MiA9IHZyZXY2NF9mMzIodjIpOworICAvLyBBZGQgdjEsIHYyCisgIHByb2QgPSB2YWRkX2YzMih2MSwgdjIpOworCisgIHZzdDFfZjMyKChmbG9hdCAqKSZzLCBwcm9kKTsKKworICByZXR1cm4gczsKK30KKwordGVtcGxhdGU8aW50IE9mZnNldD4KK3N0cnVjdCBwYWxpZ25faW1wbDxPZmZzZXQsUGFja2V0MmNmPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0YXRpYyB2b2lkIHJ1bihQYWNrZXQyY2YmIGZpcnN0LCBjb25zdCBQYWNrZXQyY2YmIHNlY29uZCkKKyAgeworICAgIGlmIChPZmZzZXQ9PTEpCisgICAgeworICAgICAgZmlyc3QudiA9IHZleHRxX2YzMihmaXJzdC52LCBzZWNvbmQudiwgMik7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQyY2YsIFBhY2tldDJjZiwgZmFsc2UsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG1hZGQoY29uc3QgUGFja2V0MmNmJiB4LCBjb25zdCBQYWNrZXQyY2YmIHksIGNvbnN0IFBhY2tldDJjZiYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsKGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKGEsIHBjb25qKGIpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNmLCBQYWNrZXQyY2YsIHRydWUsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChwY29uaihhKSwgYik7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZiwgUGFja2V0MmNmLCB0cnVlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgY29uc3QKKyAgeworICAgIHJldHVybiBwY29uaihpbnRlcm5hbDo6cG11bChhLCBiKSk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGRpdjxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSwgY29uc3QgUGFja2V0MmNmJiBiKQoreworICAvLyBUT0RPIG9wdGltaXplIGl0IGZvciBBbHRpVmVjCisgIFBhY2tldDJjZiByZXMgPSBjb25qX2hlbHBlcjxQYWNrZXQyY2YsUGFja2V0MmNmLGZhbHNlLHRydWU+KCkucG11bChhLGIpOworICBQYWNrZXQ0ZiBzLCByZXZfczsKKyAgZmxvYXQzMngyX3QgYV9sbywgYV9oaTsKKworICAvLyB0aGlzIGNvbXB1dGVzIHRoZSBub3JtCisgIHMgPSB2bXVscV9mMzIoYi52LCBiLnYpOworICBhX2xvID0gdnJldjY0X2YzMih2Z2V0X2xvd19mMzIocykpOworICBhX2hpID0gdnJldjY0X2YzMih2Z2V0X2hpZ2hfZjMyKHMpKTsKKyAgcmV2X3MgPSB2Y29tYmluZV9mMzIoYV9sbywgYV9oaSk7CisKKyAgcmV0dXJuIFBhY2tldDJjZihwZGl2KHJlcy52LCB2YWRkcV9mMzIocyxyZXZfcykpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09NUExFWF9ORU9OX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL2FyY2gvTkVPTi9QYWNrZXRNYXRoLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vUGFja2V0TWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMDI1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL05FT04vUGFja2V0TWF0aC5oCkBAIC0wLDAgKzEsNDI0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEtvbnN0YW50aW5vcyBNYXJnYXJpdGlzIDxtYXJrb3NAY29kZXguZ3I+CisvLyBIZWF2aWx5IGJhc2VkIG9uIEdhZWwncyBTU0UgdmVyc2lvbi4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFDS0VUX01BVEhfTkVPTl9ICisjZGVmaW5lIEVJR0VOX1BBQ0tFVF9NQVRIX05FT05fSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWZuZGVmIEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQKKyNkZWZpbmUgRUlHRU5fQ0FDSEVGUklFTkRMWV9QUk9EVUNUX1RIUkVTSE9MRCA4CisjZW5kaWYKKworLy8gRklYTUUgTkVPTiBoYXMgMTYgcXVhZCByZWdpc3RlcnMsIGJ1dCBzaW5jZSB0aGUgY3VycmVudCByZWdpc3RlciBhbGxvY2F0b3IKKy8vIGlzIHNvIGJhZCwgaXQgaXMgbXVjaCBiZXR0ZXIgdG8gcmVkdWNlIGl0IHRvIDgKKyNpZm5kZWYgRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMKKyNkZWZpbmUgRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMgOAorI2VuZGlmCisKK3R5cGVkZWYgZmxvYXQzMng0X3QgUGFja2V0NGY7Cit0eXBlZGVmIGludDMyeDRfdCAgIFBhY2tldDRpOwordHlwZWRlZiB1aW50MzJ4NF90ICBQYWNrZXQ0dWk7CisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoTkFNRSxYKSBcCisgIGNvbnN0IFBhY2tldDRmIHA0Zl8jI05BTUUgPSBwc2V0MTxQYWNrZXQ0Zj4oWCkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zl9GUk9NX0lOVChOQU1FLFgpIFwKKyAgY29uc3QgUGFja2V0NGYgcDRmXyMjTkFNRSA9IHZyZWludGVycHJldHFfZjMyX3UzMihwc2V0MTxpbnQ+KFgpKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKE5BTUUsWCkgXAorICBjb25zdCBQYWNrZXQ0aSBwNGlfIyNOQU1FID0gcHNldDE8UGFja2V0NGk+KFgpCisKKyNpZiBkZWZpbmVkKF9fbGx2bV9fKSAmJiAhZGVmaW5lZChfX2NsYW5nX18pCisgIC8vU3BlY2lhbCB0cmVhdG1lbnQgZm9yIEFwcGxlJ3MgbGx2bS1nY2MsIGl0cyBORU9OIHBhY2tldCB0eXBlcyBhcmUgdW5pb25zCisgICNkZWZpbmUgRUlHRU5fSU5JVF9ORU9OX1BBQ0tFVDIoWCwgWSkgICAgICAge3tYLCBZfX0KKyAgI2RlZmluZSBFSUdFTl9JTklUX05FT05fUEFDS0VUNChYLCBZLCBaLCBXKSB7e1gsIFksIFosIFd9fQorI2Vsc2UKKyAgLy9EZWZhdWx0IGluaXRpYWxpemVyIGZvciBwYWNrZXRzCisgICNkZWZpbmUgRUlHRU5fSU5JVF9ORU9OX1BBQ0tFVDIoWCwgWSkgICAgICAge1gsIFl9CisgICNkZWZpbmUgRUlHRU5fSU5JVF9ORU9OX1BBQ0tFVDQoWCwgWSwgWiwgVykge1gsIFksIFosIFd9CisjZW5kaWYKKyAgICAKKyNpZm5kZWYgX19wbGQKKyNkZWZpbmUgX19wbGQoeCkgYXNtIHZvbGF0aWxlICggIiAgIHBsZCBbJVthZGRyXV1cbiIgOjogW2FkZHJdICJyIiAoeCkgOiAiY2MiICk7CisjZW5kaWYKKwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxmbG9hdD4gIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0NGYgdHlwZTsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAxLAorICAgIHNpemUgPSA0LAorICAgCisgICAgSGFzRGl2ICA9IDEsCisgICAgLy8gRklYTUUgY2hlY2sgdGhlIEhhcyoKKyAgICBIYXNTaW4gID0gMCwKKyAgICBIYXNDb3MgID0gMCwKKyAgICBIYXNMb2cgID0gMCwKKyAgICBIYXNFeHAgID0gMCwKKyAgICBIYXNTcXJ0ID0gMAorICB9OworfTsKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8aW50PiAgICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDRpIHR5cGU7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTQKKyAgICAvLyBGSVhNRSBjaGVjayB0aGUgSGFzKgorICB9OworfTsKKworI2lmIEVJR0VOX0dOVUNfQVRfTU9TVCg0LDQpICYmICFkZWZpbmVkKF9fbGx2bV9fKQorLy8gd29ya2Fyb3VuZCBnY2MgNC4yLCA0LjMgYW5kIDQuNCBjb21waWxhdGluIGlzc3VlCitFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0MzJ4NF90IHZsZDFxX2YzMihjb25zdCBmbG9hdCogeCkgeyByZXR1cm4gOjp2bGQxcV9mMzIoKGNvbnN0IGZsb2F0MzJfdCopeCk7IH0KK0VJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQzMngyX3QgdmxkMV9mMzIgKGNvbnN0IGZsb2F0KiB4KSB7IHJldHVybiA6OnZsZDFfZjMyICgoY29uc3QgZmxvYXQzMl90Kil4KTsgfQorRUlHRU5fU1RST05HX0lOTElORSB2b2lkICAgICAgICB2c3QxcV9mMzIoZmxvYXQqIHRvLCBmbG9hdDMyeDRfdCBmcm9tKSB7IDo6dnN0MXFfZjMyKChmbG9hdDMyX3QqKXRvLGZyb20pOyB9CitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgICAgICAgIHZzdDFfZjMyIChmbG9hdCogdG8sIGZsb2F0MzJ4Ml90IGZyb20pIHsgOjp2c3QxX2YzMiAoKGZsb2F0MzJfdCopdG8sZnJvbSk7IH0KKyNlbmRpZgorCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0NGY+IHsgdHlwZWRlZiBmbG9hdCAgdHlwZTsgZW51bSB7c2l6ZT00fTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQ0aT4geyB0eXBlZGVmIGludCAgICB0eXBlOyBlbnVtIHtzaXplPTR9OyB9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHNldDE8UGFja2V0NGY+KGNvbnN0IGZsb2F0JiAgZnJvbSkgeyByZXR1cm4gdmR1cHFfbl9mMzIoZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwc2V0MTxQYWNrZXQ0aT4oY29uc3QgaW50JiAgICBmcm9tKSAgIHsgcmV0dXJuIHZkdXBxX25fczMyKGZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbHNldDxmbG9hdD4oY29uc3QgZmxvYXQmIGEpCit7CisgIFBhY2tldDRmIGNvdW50ZG93biA9IEVJR0VOX0lOSVRfTkVPTl9QQUNLRVQ0KDAsIDEsIDIsIDMpOworICByZXR1cm4gdmFkZHFfZjMyKHBzZXQxPFBhY2tldDRmPihhKSwgY291bnRkb3duKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbHNldDxpbnQ+KGNvbnN0IGludCYgYSkKK3sKKyAgUGFja2V0NGkgY291bnRkb3duID0gRUlHRU5fSU5JVF9ORU9OX1BBQ0tFVDQoMCwgMSwgMiwgMyk7CisgIHJldHVybiB2YWRkcV9zMzIocHNldDE8UGFja2V0NGk+KGEpLCBjb3VudGRvd24pOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGFkZDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiB2YWRkcV9mMzIoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhZGQ8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdmFkZHFfczMyKGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBzdWI8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gdnN1YnFfZjMyKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwc3ViPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZzdWJxX3MzMihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbmVnYXRlKGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiB2bmVncV9mMzIoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbmVnYXRlKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiB2bmVncV9zMzIoYSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtdWw8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gdm11bHFfZjMyKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbXVsPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZtdWxxX3MzMihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwZGl2PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpCit7CisgIFBhY2tldDRmIGludiwgcmVzdGVwLCBkaXY7CisKKyAgLy8gTkVPTiBkb2VzIG5vdCBvZmZlciBhIGRpdmlkZSBpbnN0cnVjdGlvbiwgd2UgaGF2ZSB0byBkbyBhIHJlY2lwcm9jYWwgYXBwcm94aW1hdGlvbgorICAvLyBIb3dldmVyIE5FT04gaW4gY29udHJhc3QgdG8gb3RoZXIgU0lNRCBlbmdpbmVzIChBbHRpVmVjL1NTRSksIG9mZmVycworICAvLyBhIHJlY2lwcm9jYWwgZXN0aW1hdGUgQU5EIGEgcmVjaXByb2NhbCBzdGVwIC13aGljaCBzYXZlcyBhIGZldyBpbnN0cnVjdGlvbnMKKyAgLy8gdnJlY3BlcV9mMzIoKSByZXR1cm5zIGFuIGVzdGltYXRlIHRvIDEvYiwgd2hpY2ggd2Ugd2lsbCBmaW5ldHVuZSB3aXRoCisgIC8vIE5ld3Rvbi1SYXBoc29uIGFuZCB2cmVjcHNxX2YzMigpCisgIGludiA9IHZyZWNwZXFfZjMyKGIpOworCisgIC8vIFRoaXMgcmV0dXJucyBhIGRpZmZlcmVudGlhbCwgYnkgd2hpY2ggd2Ugd2lsbCBoYXZlIHRvIG11bHRpcGx5IGludiB0byBnZXQgYSBiZXR0ZXIKKyAgLy8gYXBwcm94aW1hdGlvbiBvZiAxL2IuCisgIHJlc3RlcCA9IHZyZWNwc3FfZjMyKGIsIGludik7CisgIGludiA9IHZtdWxxX2YzMihyZXN0ZXAsIGludik7CisKKyAgLy8gRmluYWxseSwgbXVsdGlwbHkgYSBieSAxL2IgYW5kIGdldCB0aGUgd2FudGVkIHJlc3VsdCBvZiB0aGUgZGl2aXNpb24uCisgIGRpdiA9IHZtdWxxX2YzMihhLCBpbnYpOworCisgIHJldHVybiBkaXY7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGRpdjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIC8qYSovLCBjb25zdCBQYWNrZXQ0aSYgLypiKi8pCit7IGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAicGFja2V0IGludGVnZXIgZGl2aXNpb24gYXJlIG5vdCBzdXBwb3J0ZWQgYnkgTkVPTiIpOworICByZXR1cm4gcHNldDE8UGFja2V0NGk+KDApOworfQorCisvLyBmb3Igc29tZSB3ZWlyZCByYWlzb25zLCBpdCBoYXMgdG8gYmUgb3ZlcmxvYWRlZCBmb3IgcGFja2V0IG9mIGludGVnZXJzCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG1hZGQoY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiLCBjb25zdCBQYWNrZXQ0ZiYgYykgeyByZXR1cm4gdm1sYXFfZjMyKGMsYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBtYWRkKGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYiwgY29uc3QgUGFja2V0NGkmIGMpIHsgcmV0dXJuIHZtbGFxX3MzMihjLGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtaW48UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gdm1pbnFfZjMyKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbWluPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZtaW5xX3MzMihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbWF4PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIHZtYXhxX2YzMihhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG1heDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiB2bWF4cV9zMzIoYSxiKTsgfQorCisvLyBMb2dpY2FsIE9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGZsb2F0LCBzbyB3ZSBoYXZlIHRvIHJlaW50ZXJwcmV0IGNhc3RzIHVzaW5nIE5FT04gaW50cmluc2ljcwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBhbmQ8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikKK3sKKyAgcmV0dXJuIHZyZWludGVycHJldHFfZjMyX3UzMih2YW5kcV91MzIodnJlaW50ZXJwcmV0cV91MzJfZjMyKGEpLHZyZWludGVycHJldHFfdTMyX2YzMihiKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhbmQ8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gdmFuZHFfczMyKGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBvcjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKQoreworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mMzJfdTMyKHZvcnJxX3UzMih2cmVpbnRlcnByZXRxX3UzMl9mMzIoYSksdnJlaW50ZXJwcmV0cV91MzJfZjMyKGIpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG9yPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZvcnJxX3MzMihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBweG9yPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpCit7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX2YzMl91MzIodmVvcnFfdTMyKHZyZWludGVycHJldHFfdTMyX2YzMihhKSx2cmVpbnRlcnByZXRxX3UzMl9mMzIoYikpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBweG9yPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZlb3JxX3MzMihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYW5kbm90PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpCit7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX2YzMl91MzIodmJpY3FfdTMyKHZyZWludGVycHJldHFfdTMyX2YzMihhKSx2cmVpbnRlcnByZXRxX3UzMl9mMzIoYikpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYW5kbm90PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIHZiaWNxX3MzMihhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbG9hZDxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiB2bGQxcV9mMzIoZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbG9hZDxQYWNrZXQ0aT4oY29uc3QgaW50KiAgIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiB2bGQxcV9zMzIoZnJvbSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBsb2FkdTxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIHZsZDFxX2YzMihmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkdTxQYWNrZXQ0aT4oY29uc3QgaW50KiBmcm9tKSAgIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIHZsZDFxX3MzMihmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxvYWRkdXA8UGFja2V0NGY+KGNvbnN0IGZsb2F0KiAgIGZyb20pCit7CisgIGZsb2F0MzJ4Ml90IGxvLCBoaTsKKyAgbG8gPSB2ZHVwX25fZjMyKCpmcm9tKTsKKyAgaGkgPSB2ZHVwX25fZjMyKCooZnJvbSsxKSk7CisgIHJldHVybiB2Y29tYmluZV9mMzIobG8sIGhpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbG9hZGR1cDxQYWNrZXQ0aT4oY29uc3QgaW50KiAgICAgZnJvbSkKK3sKKyAgaW50MzJ4Ml90IGxvLCBoaTsKKyAgbG8gPSB2ZHVwX25fczMyKCpmcm9tKTsKKyAgaGkgPSB2ZHVwX25fczMyKCooZnJvbSsxKSk7CisgIHJldHVybiB2Y29tYmluZV9zMzIobG8sIGhpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPGZsb2F0PihmbG9hdCogICB0bywgY29uc3QgUGFja2V0NGYmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSB2c3QxcV9mMzIodG8sIGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8aW50PihpbnQqICAgICAgIHRvLCBjb25zdCBQYWNrZXQ0aSYgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIHZzdDFxX3MzMih0bywgZnJvbSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxmbG9hdD4oZmxvYXQqICB0bywgY29uc3QgUGFja2V0NGYmIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIHZzdDFxX2YzMih0bywgZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8aW50PihpbnQqICAgICAgdG8sIGNvbnN0IFBhY2tldDRpJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSB2c3QxcV9zMzIodG8sIGZyb20pOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPGZsb2F0Pihjb25zdCBmbG9hdCogYWRkcikgeyBfX3BsZChhZGRyKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHJlZmV0Y2g8aW50Pihjb25zdCBpbnQqICAgICBhZGRyKSB7IF9fcGxkKGFkZHIpOyB9CisKKy8vIEZJWE1FIG9ubHkgc3RvcmUgdGhlIDIgZmlyc3QgZWxlbWVudHMgPwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0ICBwZmlyc3Q8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKSB7IGZsb2F0IEVJR0VOX0FMSUdOMTYgeFs0XTsgdnN0MXFfZjMyKHgsIGEpOyByZXR1cm4geFswXTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCAgICBwZmlyc3Q8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKSB7IGludCAgIEVJR0VOX0FMSUdOMTYgeFs0XTsgdnN0MXFfczMyKHgsIGEpOyByZXR1cm4geFswXTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHJldmVyc2UoY29uc3QgUGFja2V0NGYmIGEpIHsKKyAgZmxvYXQzMngyX3QgYV9sbywgYV9oaTsKKyAgUGFja2V0NGYgYV9yNjQ7CisKKyAgYV9yNjQgPSB2cmV2NjRxX2YzMihhKTsKKyAgYV9sbyA9IHZnZXRfbG93X2YzMihhX3I2NCk7CisgIGFfaGkgPSB2Z2V0X2hpZ2hfZjMyKGFfcjY0KTsKKyAgcmV0dXJuIHZjb21iaW5lX2YzMihhX2hpLCBhX2xvKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwcmV2ZXJzZShjb25zdCBQYWNrZXQ0aSYgYSkgeworICBpbnQzMngyX3QgYV9sbywgYV9oaTsKKyAgUGFja2V0NGkgYV9yNjQ7CisKKyAgYV9yNjQgPSB2cmV2NjRxX3MzMihhKTsKKyAgYV9sbyA9IHZnZXRfbG93X3MzMihhX3I2NCk7CisgIGFfaGkgPSB2Z2V0X2hpZ2hfczMyKGFfcjY0KTsKKyAgcmV0dXJuIHZjb21iaW5lX3MzMihhX2hpLCBhX2xvKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYWJzKGNvbnN0IFBhY2tldDRmJiBhKSB7IHJldHVybiB2YWJzcV9mMzIoYSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwYWJzKGNvbnN0IFBhY2tldDRpJiBhKSB7IHJldHVybiB2YWJzcV9zMzIoYSk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpCit7CisgIGZsb2F0MzJ4Ml90IGFfbG8sIGFfaGksIHN1bTsKKyAgZmxvYXQgc1syXTsKKworICBhX2xvID0gdmdldF9sb3dfZjMyKGEpOworICBhX2hpID0gdmdldF9oaWdoX2YzMihhKTsKKyAgc3VtID0gdnBhZGRfZjMyKGFfbG8sIGFfaGkpOworICBzdW0gPSB2cGFkZF9mMzIoc3VtLCBzdW0pOworICB2c3QxX2YzMihzLCBzdW0pOworCisgIHJldHVybiBzWzBdOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHJlZHV4cDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYqIHZlY3MpCit7CisgIGZsb2F0MzJ4NHgyX3QgdnRybjEsIHZ0cm4yLCByZXMxLCByZXMyOworICBQYWNrZXQ0ZiBzdW0xLCBzdW0yLCBzdW07CisKKyAgLy8gTkVPTiB6aXAgcGVyZm9ybXMgaW50ZXJsZWF2aW5nIG9mIHRoZSBzdXBwbGllZCB2ZWN0b3JzLgorICAvLyBXZSBwZXJmb3JtIHR3byBpbnRlcmxlYXZlcyBpbiBhIHJvdyB0byBhY3F1aXJlIHRoZSB0cmFuc3Bvc2VkIHZlY3RvcgorICB2dHJuMSA9IHZ6aXBxX2YzMih2ZWNzWzBdLCB2ZWNzWzJdKTsKKyAgdnRybjIgPSB2emlwcV9mMzIodmVjc1sxXSwgdmVjc1szXSk7CisgIHJlczEgPSB2emlwcV9mMzIodnRybjEudmFsWzBdLCB2dHJuMi52YWxbMF0pOworICByZXMyID0gdnppcHFfZjMyKHZ0cm4xLnZhbFsxXSwgdnRybjIudmFsWzFdKTsKKworICAvLyBEbyB0aGUgYWRkaXRpb24gb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3JzCisgIHN1bTEgPSB2YWRkcV9mMzIocmVzMS52YWxbMF0sIHJlczEudmFsWzFdKTsKKyAgc3VtMiA9IHZhZGRxX2YzMihyZXMyLnZhbFswXSwgcmVzMi52YWxbMV0pOworICBzdW0gPSB2YWRkcV9mMzIoc3VtMSwgc3VtMik7CisKKyAgcmV0dXJuIHN1bTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBwcmVkdXg8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBpbnQzMngyX3QgYV9sbywgYV9oaSwgc3VtOworICBpbnQzMl90IHNbMl07CisKKyAgYV9sbyA9IHZnZXRfbG93X3MzMihhKTsKKyAgYV9oaSA9IHZnZXRfaGlnaF9zMzIoYSk7CisgIHN1bSA9IHZwYWRkX3MzMihhX2xvLCBhX2hpKTsKKyAgc3VtID0gdnBhZGRfczMyKHN1bSwgc3VtKTsKKyAgdnN0MV9zMzIocywgc3VtKTsKKworICByZXR1cm4gc1swXTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHByZWR1eHA8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpKiB2ZWNzKQoreworICBpbnQzMng0eDJfdCB2dHJuMSwgdnRybjIsIHJlczEsIHJlczI7CisgIFBhY2tldDRpIHN1bTEsIHN1bTIsIHN1bTsKKworICAvLyBORU9OIHppcCBwZXJmb3JtcyBpbnRlcmxlYXZpbmcgb2YgdGhlIHN1cHBsaWVkIHZlY3RvcnMuCisgIC8vIFdlIHBlcmZvcm0gdHdvIGludGVybGVhdmVzIGluIGEgcm93IHRvIGFjcXVpcmUgdGhlIHRyYW5zcG9zZWQgdmVjdG9yCisgIHZ0cm4xID0gdnppcHFfczMyKHZlY3NbMF0sIHZlY3NbMl0pOworICB2dHJuMiA9IHZ6aXBxX3MzMih2ZWNzWzFdLCB2ZWNzWzNdKTsKKyAgcmVzMSA9IHZ6aXBxX3MzMih2dHJuMS52YWxbMF0sIHZ0cm4yLnZhbFswXSk7CisgIHJlczIgPSB2emlwcV9zMzIodnRybjEudmFsWzFdLCB2dHJuMi52YWxbMV0pOworCisgIC8vIERvIHRoZSBhZGRpdGlvbiBvZiB0aGUgcmVzdWx0aW5nIHZlY3RvcnMKKyAgc3VtMSA9IHZhZGRxX3MzMihyZXMxLnZhbFswXSwgcmVzMS52YWxbMV0pOworICBzdW0yID0gdmFkZHFfczMyKHJlczIudmFsWzBdLCByZXMyLnZhbFsxXSk7CisgIHN1bSA9IHZhZGRxX3MzMihzdW0xLCBzdW0yKTsKKworICByZXR1cm4gc3VtOworfQorCisvLyBPdGhlciByZWR1Y3Rpb24gZnVuY3Rpb25zOgorLy8gbXVsCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcHJlZHV4X211bDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpCit7CisgIGZsb2F0MzJ4Ml90IGFfbG8sIGFfaGksIHByb2Q7CisgIGZsb2F0IHNbMl07CisKKyAgLy8gR2V0IGFfbG8gPSB8YTF8YTJ8IGFuZCBhX2hpID0gfGEzfGE0fAorICBhX2xvID0gdmdldF9sb3dfZjMyKGEpOworICBhX2hpID0gdmdldF9oaWdoX2YzMihhKTsKKyAgLy8gR2V0IHRoZSBwcm9kdWN0IG9mIGFfbG8gKiBhX2hpIC0+IHxhMSphM3xhMiphNHwKKyAgcHJvZCA9IHZtdWxfZjMyKGFfbG8sIGFfaGkpOworICAvLyBNdWx0aXBseSBwcm9kIHdpdGggaXRzIHN3YXBwZWQgdmFsdWUgfGEyKmE0fGExKmEzfAorICBwcm9kID0gdm11bF9mMzIocHJvZCwgdnJldjY0X2YzMihwcm9kKSk7CisgIHZzdDFfZjMyKHMsIHByb2QpOworCisgIHJldHVybiBzWzBdOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBwcmVkdXhfbXVsPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSkKK3sKKyAgaW50MzJ4Ml90IGFfbG8sIGFfaGksIHByb2Q7CisgIGludDMyX3Qgc1syXTsKKworICAvLyBHZXQgYV9sbyA9IHxhMXxhMnwgYW5kIGFfaGkgPSB8YTN8YTR8CisgIGFfbG8gPSB2Z2V0X2xvd19zMzIoYSk7CisgIGFfaGkgPSB2Z2V0X2hpZ2hfczMyKGEpOworICAvLyBHZXQgdGhlIHByb2R1Y3Qgb2YgYV9sbyAqIGFfaGkgLT4gfGExKmEzfGEyKmE0fAorICBwcm9kID0gdm11bF9zMzIoYV9sbywgYV9oaSk7CisgIC8vIE11bHRpcGx5IHByb2Qgd2l0aCBpdHMgc3dhcHBlZCB2YWx1ZSB8YTIqYTR8YTEqYTN8CisgIHByb2QgPSB2bXVsX3MzMihwcm9kLCB2cmV2NjRfczMyKHByb2QpKTsKKyAgdnN0MV9zMzIocywgcHJvZCk7CisKKyAgcmV0dXJuIHNbMF07Cit9CisKKy8vIG1pbgordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9taW48UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBmbG9hdDMyeDJfdCBhX2xvLCBhX2hpLCBtaW47CisgIGZsb2F0IHNbMl07CisKKyAgYV9sbyA9IHZnZXRfbG93X2YzMihhKTsKKyAgYV9oaSA9IHZnZXRfaGlnaF9mMzIoYSk7CisgIG1pbiA9IHZwbWluX2YzMihhX2xvLCBhX2hpKTsKKyAgbWluID0gdnBtaW5fZjMyKG1pbiwgbWluKTsKKyAgdnN0MV9mMzIocywgbWluKTsKKworICByZXR1cm4gc1swXTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgcHJlZHV4X21pbjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIGludDMyeDJfdCBhX2xvLCBhX2hpLCBtaW47CisgIGludDMyX3Qgc1syXTsKKworICBhX2xvID0gdmdldF9sb3dfczMyKGEpOworICBhX2hpID0gdmdldF9oaWdoX3MzMihhKTsKKyAgbWluID0gdnBtaW5fczMyKGFfbG8sIGFfaGkpOworICBtaW4gPSB2cG1pbl9zMzIobWluLCBtaW4pOworICB2c3QxX3MzMihzLCBtaW4pOworCisgIHJldHVybiBzWzBdOworfQorCisvLyBtYXgKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXhfbWF4PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgZmxvYXQzMngyX3QgYV9sbywgYV9oaSwgbWF4OworICBmbG9hdCBzWzJdOworCisgIGFfbG8gPSB2Z2V0X2xvd19mMzIoYSk7CisgIGFfaGkgPSB2Z2V0X2hpZ2hfZjMyKGEpOworICBtYXggPSB2cG1heF9mMzIoYV9sbywgYV9oaSk7CisgIG1heCA9IHZwbWF4X2YzMihtYXgsIG1heCk7CisgIHZzdDFfZjMyKHMsIG1heCk7CisKKyAgcmV0dXJuIHNbMF07Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50IHByZWR1eF9tYXg8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBpbnQzMngyX3QgYV9sbywgYV9oaSwgbWF4OworICBpbnQzMl90IHNbMl07CisKKyAgYV9sbyA9IHZnZXRfbG93X3MzMihhKTsKKyAgYV9oaSA9IHZnZXRfaGlnaF9zMzIoYSk7CisgIG1heCA9IHZwbWF4X3MzMihhX2xvLCBhX2hpKTsKKyAgbWF4ID0gdnBtYXhfczMyKG1heCwgbWF4KTsKKyAgdnN0MV9zMzIocywgbWF4KTsKKworICByZXR1cm4gc1swXTsKK30KKworLy8gdGhpcyBQQUxJR05fTkVPTiBidXNpbmVzcyBpcyB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBMTFZNIENsYW5nIDMuMCBjYXVzaW5nIGluY29ycmVjdCBjb21waWxhdGlvbiBlcnJvcnMsCisvLyBzZWUgYnVnIDM0NyBhbmQgdGhpcyBMTFZNIGJ1ZzogaHR0cDovL2xsdm0ub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDc0CisjZGVmaW5lIFBBTElHTl9ORU9OKE9mZnNldCxUeXBlLENvbW1hbmQpIFwKK3RlbXBsYXRlPD5cCitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFR5cGU+XAore1wKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0YXRpYyB2b2lkIHJ1bihUeXBlJiBmaXJzdCwgY29uc3QgVHlwZSYgc2Vjb25kKVwKKyAgICB7XAorICAgICAgICBpZiAoT2Zmc2V0IT0wKVwKKyAgICAgICAgICAgIGZpcnN0ID0gQ29tbWFuZChmaXJzdCwgc2Vjb25kLCBPZmZzZXQpO1wKKyAgICB9XAorfTtcCisKK1BBTElHTl9ORU9OKDAsUGFja2V0NGYsdmV4dHFfZjMyKQorUEFMSUdOX05FT04oMSxQYWNrZXQ0Zix2ZXh0cV9mMzIpCitQQUxJR05fTkVPTigyLFBhY2tldDRmLHZleHRxX2YzMikKK1BBTElHTl9ORU9OKDMsUGFja2V0NGYsdmV4dHFfZjMyKQorUEFMSUdOX05FT04oMCxQYWNrZXQ0aSx2ZXh0cV9zMzIpCitQQUxJR05fTkVPTigxLFBhY2tldDRpLHZleHRxX3MzMikKK1BBTElHTl9ORU9OKDIsUGFja2V0NGksdmV4dHFfczMyKQorUEFMSUdOX05FT04oMyxQYWNrZXQ0aSx2ZXh0cV9zMzIpCisgICAgCisjdW5kZWYgUEFMSUdOX05FT04KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUEFDS0VUX01BVEhfTkVPTl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvU1NFL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWE3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9Db3JlX2FyY2hfU1NFX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9Db3JlX2FyY2hfU1NFX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL0NvcmUvYXJjaC9TU0UgQ09NUE9ORU5UIERldmVsCispCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9Db21wbGV4LmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9Db21wbGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkZjk4NwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvU1NFL0NvbXBsZXguaApAQCAtMCwwICsxLDQzNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTVBMRVhfU1NFX0gKKyNkZWZpbmUgRUlHRU5fQ09NUExFWF9TU0VfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLy0tLS0tLS0tLS0gZmxvYXQgLS0tLS0tLS0tLQorc3RydWN0IFBhY2tldDJjZgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZigpIHt9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgZXhwbGljaXQgUGFja2V0MmNmKGNvbnN0IF9fbTEyOCYgYSkgOiB2KGEpIHt9CisgIF9fbTEyOCAgdjsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8c3RkOjpjb21wbGV4PGZsb2F0PiA+ICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDJjZiB0eXBlOworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZSA9IDIsCisKKyAgICBIYXNBZGQgICAgPSAxLAorICAgIEhhc1N1YiAgICA9IDEsCisgICAgSGFzTXVsICAgID0gMSwKKyAgICBIYXNEaXYgICAgPSAxLAorICAgIEhhc05lZ2F0ZSA9IDEsCisgICAgSGFzQWJzICAgID0gMCwKKyAgICBIYXNBYnMyICAgPSAwLAorICAgIEhhc01pbiAgICA9IDAsCisgICAgSGFzTWF4ICAgID0gMCwKKyAgICBIYXNTZXRMaW5lYXIgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0MmNmPiB7IHR5cGVkZWYgc3RkOjpjb21wbGV4PGZsb2F0PiB0eXBlOyBlbnVtIHtzaXplPTJ9OyB9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhZGQ8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKF9tbV9hZGRfcHMoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBzdWI8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKF9tbV9zdWJfcHMoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBuZWdhdGUoY29uc3QgUGFja2V0MmNmJiBhKQoreworICBjb25zdCBfX20xMjggbWFzayA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NldHJfZXBpMzIoMHg4MDAwMDAwMCwweDgwMDAwMDAwLDB4ODAwMDAwMDAsMHg4MDAwMDAwMCkpOworICByZXR1cm4gUGFja2V0MmNmKF9tbV94b3JfcHMoYS52LG1hc2spKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGNvbmooY29uc3QgUGFja2V0MmNmJiBhKQoreworICBjb25zdCBfX20xMjggbWFzayA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NldHJfZXBpMzIoMHgwMDAwMDAwMCwweDgwMDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwMDAwMCkpOworICByZXR1cm4gUGFja2V0MmNmKF9tbV94b3JfcHMoYS52LG1hc2spKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpCit7CisgIC8vIFRPRE8gb3B0aW1pemUgaXQgZm9yIFNTRTMgYW5kIDQKKyAgI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0UzCisgIHJldHVybiBQYWNrZXQyY2YoX21tX2FkZHN1Yl9wcyhfbW1fbXVsX3BzKF9tbV9tb3ZlbGR1cF9wcyhhLnYpLCBiLnYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX211bF9wcyhfbW1fbW92ZWhkdXBfcHMoYS52KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNGZfc3dpenpsZTEoYi52LCAxLCAwLCAzLCAyKSkpKTsKKy8vICAgcmV0dXJuIFBhY2tldDJjZihfbW1fYWRkc3ViX3BzKF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYS52LCAwLCAwLCAyLCAyKSwgYi52KSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYS52LCAxLCAxLCAzLCAzKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNGZfc3dpenpsZTEoYi52LCAxLCAwLCAzLCAyKSkpKTsKKyAgI2Vsc2UKKyAgY29uc3QgX19tMTI4IG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9zZXRyX2VwaTMyKDB4ODAwMDAwMDAsMHgwMDAwMDAwMCwweDgwMDAwMDAwLDB4MDAwMDAwMDApKTsKKyAgcmV0dXJuIFBhY2tldDJjZihfbW1fYWRkX3BzKF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYS52LCAwLCAwLCAyLCAyKSwgYi52KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV94b3JfcHMoX21tX211bF9wcyh2ZWM0Zl9zd2l6emxlMShhLnYsIDEsIDEsIDMsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzRmX3N3aXp6bGUxKGIudiwgMSwgMCwgMywgMikpLCBtYXNrKSkpOworICAjZW5kaWYKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwYW5kICAgPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZihfbW1fYW5kX3BzKGEudixiLnYpKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwb3IgICAgPFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIHsgcmV0dXJuIFBhY2tldDJjZihfbW1fb3JfcHMoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHB4b3IgICA8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKF9tbV94b3JfcHMoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBhbmRub3Q8UGFja2V0MmNmPihjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgeyByZXR1cm4gUGFja2V0MmNmKF9tbV9hbmRub3RfcHMoYS52LGIudikpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGxvYWQgPFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDJjZihwbG9hZDxQYWNrZXQ0Zj4oJnJlYWxfcmVmKCpmcm9tKSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBsb2FkdTxQYWNrZXQyY2Y+KGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4qIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDJjZihwbG9hZHU8UGFja2V0NGY+KCZyZWFsX3JlZigqZnJvbSkpKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBzZXQxPFBhY2tldDJjZj4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgIGZyb20pCit7CisgIFBhY2tldDJjZiByZXM7CisgICNpZiBFSUdFTl9HTlVDX0FUX01PU1QoNCwyKQorICAvLyB3b3JrYXJvdW5kIGFubm95aW5nICJtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24iIHdhcm5pbmcgd2l0aCBnY2MgNC4yCisgIHJlcy52ID0gX21tX2xvYWRsX3BpKF9tbV9zZXQxX3BzKDAuMGYpLCByZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTY0Kj4oJmZyb20pKTsKKyAgI2Vsc2UKKyAgcmVzLnYgPSBfbW1fbG9hZGxfcGkocmVzLnYsIChjb25zdCBfX202NCopJmZyb20pOworICAjZW5kaWYKKyAgcmV0dXJuIFBhY2tldDJjZihfbW1fbW92ZWxoX3BzKHJlcy52LHJlcy52KSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGxvYWRkdXA8UGFja2V0MmNmPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiBmcm9tKSB7IHJldHVybiBwc2V0MTxQYWNrZXQyY2Y+KCpmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmUgPHN0ZDo6Y29tcGxleDxmbG9hdD4gPihzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICogICB0bywgY29uc3QgUGFja2V0MmNmJiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgcHN0b3JlKCZyZWFsX3JlZigqdG8pLCBmcm9tLnYpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PHN0ZDo6Y29tcGxleDxmbG9hdD4gPihzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICogICB0bywgY29uc3QgUGFja2V0MmNmJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBwc3RvcmV1KCZyZWFsX3JlZigqdG8pLCBmcm9tLnYpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPHN0ZDo6Y29tcGxleDxmbG9hdD4gPihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICogICBhZGRyKSB7IF9tbV9wcmVmZXRjaCgoY29uc3QgY2hhciopKGFkZHIpLCBfTU1fSElOVF9UMCk7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxmbG9hdD4gIHBmaXJzdDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgI2lmIEVJR0VOX0dOVUNfQVRfTU9TVCg0LDMpCisgIC8vIFdvcmthcm91bmQgZ2NjIDQuMiBJQ0UgLSB0aGlzIGlzIG5vdCBwZXJmb3JtYW5jZSB3aXNlIGlkZWFsLCBidXQgd2hvIGNhcmVzLi4uCisgIC8vIFRoaXMgd29ya2Fyb3VuZCBhbHNvIGZpeCBpbnZhbGlkIGNvZGUgZ2VuZXJhdGlvbiB3aXRoIGdjYyA0LjMKKyAgRUlHRU5fQUxJR04xNiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHJlc1syXTsKKyAgX21tX3N0b3JlX3BzKChmbG9hdCopcmVzLCBhLnYpOworICByZXR1cm4gcmVzWzBdOworICAjZWxzZQorICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHJlczsKKyAgX21tX3N0b3JlbF9waSgoX19tNjQqKSZyZXMsIGEudik7CisgIHJldHVybiByZXM7CisgICNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHByZXZlcnNlKGNvbnN0IFBhY2tldDJjZiYgYSkgeyByZXR1cm4gUGFja2V0MmNmKF9tbV9jYXN0cGRfcHMocHJldmVyc2UoX21tX2Nhc3Rwc19wZChhLnYpKSkpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHByZWR1eDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgcmV0dXJuIHBmaXJzdChQYWNrZXQyY2YoX21tX2FkZF9wcyhhLnYsIF9tbV9tb3ZlaGxfcHMoYS52LGEudikpKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcHJlZHV4cDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiogdmVjcykKK3sKKyAgcmV0dXJuIFBhY2tldDJjZihfbW1fYWRkX3BzKF9tbV9tb3ZlbGhfcHModmVjc1swXS52LHZlY3NbMV0udiksIF9tbV9tb3ZlaGxfcHModmVjc1sxXS52LHZlY3NbMF0udikpKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHN0ZDo6Y29tcGxleDxmbG9hdD4gcHJlZHV4X211bDxQYWNrZXQyY2Y+KGNvbnN0IFBhY2tldDJjZiYgYSkKK3sKKyAgcmV0dXJuIHBmaXJzdChwbXVsKGEsIFBhY2tldDJjZihfbW1fbW92ZWhsX3BzKGEudixhLnYpKSkpOworfQorCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQyY2Y+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKFBhY2tldDJjZiYgZmlyc3QsIGNvbnN0IFBhY2tldDJjZiYgc2Vjb25kKQorICB7CisgICAgaWYgKE9mZnNldD09MSkKKyAgICB7CisgICAgICBmaXJzdC52ID0gX21tX21vdmVobF9wcyhmaXJzdC52LCBmaXJzdC52KTsKKyAgICAgIGZpcnN0LnYgPSBfbW1fbW92ZWxoX3BzKGZpcnN0LnYsIHNlY29uZC52KTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZiwgUGFja2V0MmNmLCBmYWxzZSx0cnVlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbWFkZChjb25zdCBQYWNrZXQyY2YmIHgsIGNvbnN0IFBhY2tldDJjZiYgeSwgY29uc3QgUGFja2V0MmNmJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKHBtdWwoeCx5KSxjKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtdWwoY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpIGNvbnN0CisgIHsKKyAgICAjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRTMKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBtdWwoYSwgcGNvbmooYikpOworICAgICNlbHNlCisgICAgY29uc3QgX19tMTI4IG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9zZXRyX2VwaTMyKDB4MDAwMDAwMDAsMHg4MDAwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDAwMDApKTsKKyAgICByZXR1cm4gUGFja2V0MmNmKF9tbV9hZGRfcHMoX21tX3hvcl9wcyhfbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEudiwgMCwgMCwgMiwgMiksIGIudiksIG1hc2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEudiwgMSwgMSwgMywgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNGZfc3dpenpsZTEoYi52LCAxLCAwLCAzLCAyKSkpKTsKKyAgICAjZW5kaWYKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MmNmLCBQYWNrZXQyY2YsIHRydWUsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgY29uc3QKKyAgeworICAgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChwY29uaihhKSwgYik7CisgICAgI2Vsc2UKKyAgICBjb25zdCBfX20xMjggbWFzayA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NldHJfZXBpMzIoMHgwMDAwMDAwMCwweDgwMDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwMDAwMCkpOworICAgIHJldHVybiBQYWNrZXQyY2YoX21tX2FkZF9wcyhfbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEudiwgMCwgMCwgMiwgMiksIGIudiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV94b3JfcHMoX21tX211bF9wcyh2ZWM0Zl9zd2l6emxlMShhLnYsIDEsIDEsIDMsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNGZfc3dpenpsZTEoYi52LCAxLCAwLCAzLCAyKSksIG1hc2spKSk7CisgICAgI2VuZGlmCisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZiwgUGFja2V0MmNmLCB0cnVlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtYWRkKGNvbnN0IFBhY2tldDJjZiYgeCwgY29uc3QgUGFja2V0MmNmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG11bChjb25zdCBQYWNrZXQyY2YmIGEsIGNvbnN0IFBhY2tldDJjZiYgYikgY29uc3QKKyAgeworICAgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICAgIHJldHVybiBwY29uaihpbnRlcm5hbDo6cG11bChhLCBiKSk7CisgICAgI2Vsc2UKKyAgICBjb25zdCBfX20xMjggbWFzayA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NldHJfZXBpMzIoMHgwMDAwMDAwMCwweDgwMDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwMDAwMCkpOworICAgIHJldHVybiBQYWNrZXQyY2YoX21tX3N1Yl9wcyhfbW1feG9yX3BzKF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYS52LCAwLCAwLCAyLCAyKSwgYi52KSwgbWFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYS52LCAxLCAxLCAzLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0Zl9zd2l6emxlMShiLnYsIDEsIDAsIDMsIDIpKSkpOworICAgICNlbmRpZgorICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQ0ZiwgUGFja2V0MmNmLCBmYWxzZSxmYWxzZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcG1hZGQoY29uc3QgUGFja2V0NGYmIHgsIGNvbnN0IFBhY2tldDJjZiYgeSwgY29uc3QgUGFja2V0MmNmJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKGMsIHBtdWwoeCx5KSk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbXVsKGNvbnN0IFBhY2tldDRmJiB4LCBjb25zdCBQYWNrZXQyY2YmIHkpIGNvbnN0CisgIHsgcmV0dXJuIFBhY2tldDJjZihFaWdlbjo6aW50ZXJuYWw6OnBtdWwoeCwgeS52KSk7IH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJjZiwgUGFja2V0NGYsIGZhbHNlLGZhbHNlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwbWFkZChjb25zdCBQYWNrZXQyY2YmIHgsIGNvbnN0IFBhY2tldDRmJiB5LCBjb25zdCBQYWNrZXQyY2YmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQoYywgcG11bCh4LHkpKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmNmIHBtdWwoY29uc3QgUGFja2V0MmNmJiB4LCBjb25zdCBQYWNrZXQ0ZiYgeSkgY29uc3QKKyAgeyByZXR1cm4gUGFja2V0MmNmKEVpZ2VuOjppbnRlcm5hbDo6cG11bCh4LnYsIHkpKTsgfQorfTsKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJjZiBwZGl2PFBhY2tldDJjZj4oY29uc3QgUGFja2V0MmNmJiBhLCBjb25zdCBQYWNrZXQyY2YmIGIpCit7CisgIC8vIFRPRE8gb3B0aW1pemUgaXQgZm9yIFNTRTMgYW5kIDQKKyAgUGFja2V0MmNmIHJlcyA9IGNvbmpfaGVscGVyPFBhY2tldDJjZixQYWNrZXQyY2YsZmFsc2UsdHJ1ZT4oKS5wbXVsKGEsYik7CisgIF9fbTEyOCBzID0gX21tX211bF9wcyhiLnYsYi52KTsKKyAgcmV0dXJuIFBhY2tldDJjZihfbW1fZGl2X3BzKHJlcy52LF9tbV9hZGRfcHMocyxfbW1fY2FzdHNpMTI4X3BzKF9tbV9zaHVmZmxlX2VwaTMyKF9tbV9jYXN0cHNfc2kxMjgocyksIDB4YjEpKSkpKTsKK30KKworRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyY2YgcGNwbHhmbGlwLyo8UGFja2V0MmNmPiovKGNvbnN0IFBhY2tldDJjZiYgeCkKK3sKKyAgcmV0dXJuIFBhY2tldDJjZih2ZWM0Zl9zd2l6emxlMSh4LnYsIDEsIDAsIDMsIDIpKTsKK30KKworCisvLy0tLS0tLS0tLS0gZG91YmxlIC0tLS0tLS0tLS0KK3N0cnVjdCBQYWNrZXQxY2QKK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QoKSB7fQorICBFSUdFTl9TVFJPTkdfSU5MSU5FIGV4cGxpY2l0IFBhY2tldDFjZChjb25zdCBfX20xMjhkJiBhKSA6IHYoYSkge30KKyAgX19tMTI4ZCAgdjsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPiAgOiBkZWZhdWx0X3BhY2tldF90cmFpdHMKK3sKKyAgdHlwZWRlZiBQYWNrZXQxY2QgdHlwZTsKKyAgZW51bSB7CisgICAgVmVjdG9yaXphYmxlID0gMSwKKyAgICBBbGlnbmVkT25TY2FsYXIgPSAwLAorICAgIHNpemUgPSAxLAorCisgICAgSGFzQWRkICAgID0gMSwKKyAgICBIYXNTdWIgICAgPSAxLAorICAgIEhhc011bCAgICA9IDEsCisgICAgSGFzRGl2ICAgID0gMSwKKyAgICBIYXNOZWdhdGUgPSAxLAorICAgIEhhc0FicyAgICA9IDAsCisgICAgSGFzQWJzMiAgID0gMCwKKyAgICBIYXNNaW4gICAgPSAwLAorICAgIEhhc01heCAgICA9IDAsCisgICAgSGFzU2V0TGluZWFyID0gMAorICB9OworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDFjZD4geyB0eXBlZGVmIHN0ZDo6Y29tcGxleDxkb3VibGU+IHR5cGU7IGVudW0ge3NpemU9MX07IH07CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGFkZDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoX21tX2FkZF9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcHN1YjxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoX21tX3N1Yl9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG5lZ2F0ZShjb25zdCBQYWNrZXQxY2QmIGEpIHsgcmV0dXJuIFBhY2tldDFjZChwbmVnYXRlKGEudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBjb25qKGNvbnN0IFBhY2tldDFjZCYgYSkKK3sKKyAgY29uc3QgX19tMTI4ZCBtYXNrID0gX21tX2Nhc3RzaTEyOF9wZChfbW1fc2V0X2VwaTMyKDB4ODAwMDAwMDAsMHgwLDB4MCwweDApKTsKKyAgcmV0dXJuIFBhY2tldDFjZChfbW1feG9yX3BkKGEudixtYXNrKSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKQoreworICAvLyBUT0RPIG9wdGltaXplIGl0IGZvciBTU0UzIGFuZCA0CisgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICByZXR1cm4gUGFja2V0MWNkKF9tbV9hZGRzdWJfcGQoX21tX211bF9wZCh2ZWMyZF9zd2l6emxlMShhLnYsIDAsIDApLCBiLnYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX211bF9wZCh2ZWMyZF9zd2l6emxlMShhLnYsIDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyZF9zd2l6emxlMShiLnYsIDEsIDApKSkpOworICAjZWxzZQorICBjb25zdCBfX20xMjhkIG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BkKF9tbV9zZXRfZXBpMzIoMHgwLDB4MCwweDgwMDAwMDAwLDB4MCkpOworICByZXR1cm4gUGFja2V0MWNkKF9tbV9hZGRfcGQoX21tX211bF9wZCh2ZWMyZF9zd2l6emxlMShhLnYsIDAsIDApLCBiLnYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX3hvcl9wZChfbW1fbXVsX3BkKHZlYzJkX3N3aXp6bGUxKGEudiwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMmRfc3dpenpsZTEoYi52LCAxLCAwKSksIG1hc2spKSk7CisgICNlbmRpZgorfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBhbmQgICA8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgeyByZXR1cm4gUGFja2V0MWNkKF9tbV9hbmRfcGQoYS52LGIudikpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBvciAgICA8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgeyByZXR1cm4gUGFja2V0MWNkKF9tbV9vcl9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcHhvciAgIDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoX21tX3hvcl9wZChhLnYsYi52KSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGFuZG5vdDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSB7IHJldHVybiBQYWNrZXQxY2QoX21tX2FuZG5vdF9wZChhLnYsYi52KSk7IH0KKworLy8gRklYTUUgZm9yY2UgdW5hbGlnbmVkIGxvYWQsIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBsb2FkIDxQYWNrZXQxY2Q+KGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+KiBmcm9tKQoreyBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQgcmV0dXJuIFBhY2tldDFjZChwbG9hZDxQYWNrZXQyZD4oKGNvbnN0IGRvdWJsZSopZnJvbSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBsb2FkdTxQYWNrZXQxY2Q+KGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+KiBmcm9tKQoreyBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRCByZXR1cm4gUGFja2V0MWNkKHBsb2FkdTxQYWNrZXQyZD4oKGNvbnN0IGRvdWJsZSopZnJvbSkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBzZXQxPFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mICBmcm9tKQoreyAvKiBoZXJlIHdlIHJlYWxseSBoYXZlIHRvIHVzZSB1bmFsaWduZWQgbG9hZHMgOiggKi8gcmV0dXJuIHBsb2FkdTxQYWNrZXQxY2Q+KCZmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBsb2FkZHVwPFBhY2tldDFjZD4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4qIGZyb20pIHsgcmV0dXJuIHBzZXQxPFBhY2tldDFjZD4oKmZyb20pOyB9CisKKy8vIEZJWE1FIGZvcmNlIHVuYWxpZ25lZCBzdG9yZSwgdGhpcyBpcyBhIHRlbXBvcmFyeSBmaXgKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZSA8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihzdGQ6OmNvbXBsZXg8ZG91YmxlPiAqICAgdG8sIGNvbnN0IFBhY2tldDFjZCYgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIHBzdG9yZSgoZG91YmxlKil0bywgZnJvbS52KTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHN0ZDo6Y29tcGxleDxkb3VibGU+ICogICB0bywgY29uc3QgUGFja2V0MWNkJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBwc3RvcmV1KChkb3VibGUqKXRvLCBmcm9tLnYpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHByZWZldGNoPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4gKiAgIGFkZHIpIHsgX21tX3ByZWZldGNoKChjb25zdCBjaGFyKikoYWRkciksIF9NTV9ISU5UX1QwKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgc3RkOjpjb21wbGV4PGRvdWJsZT4gIHBmaXJzdDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCYgYSkKK3sKKyAgRUlHRU5fQUxJR04xNiBkb3VibGUgcmVzWzJdOworICBfbW1fc3RvcmVfcGQocmVzLCBhLnYpOworICByZXR1cm4gc3RkOjpjb21wbGV4PGRvdWJsZT4ocmVzWzBdLHJlc1sxXSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcHJldmVyc2UoY29uc3QgUGFja2V0MWNkJiBhKSB7IHJldHVybiBhOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBwcmVkdXg8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEpCit7CisgIHJldHVybiBwZmlyc3QoYSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcHJlZHV4cDxQYWNrZXQxY2Q+KGNvbnN0IFBhY2tldDFjZCogdmVjcykKK3sKKyAgcmV0dXJuIHZlY3NbMF07Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBwcmVkdXhfbXVsPFBhY2tldDFjZD4oY29uc3QgUGFja2V0MWNkJiBhKQoreworICByZXR1cm4gcGZpcnN0KGEpOworfQorCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQxY2Q+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKFBhY2tldDFjZCYgLypmaXJzdCovLCBjb25zdCBQYWNrZXQxY2QmIC8qc2Vjb25kKi8pCisgIHsKKyAgICAvLyBGSVhNRSBpcyBpdCBzdXJlIHdlIG5ldmVyIGhhdmUgdG8gYWxpZ24gYSBQYWNrZXQxY2Q/CisgICAgLy8gRXZlbiB0aG91Z2ggYSBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBoYXMgMTYgYnl0ZXMsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSBhbGlnbmVkIG9uIGEgMTYgYnl0ZXMgYm91bmRhcnkuLi4KKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MWNkLCBQYWNrZXQxY2QsIGZhbHNlLHRydWU+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtYWRkKGNvbnN0IFBhY2tldDFjZCYgeCwgY29uc3QgUGFja2V0MWNkJiB5LCBjb25zdCBQYWNrZXQxY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQocG11bCh4LHkpLGMpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bChjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikgY29uc3QKKyAgeworICAgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICAgIHJldHVybiBpbnRlcm5hbDo6cG11bChhLCBwY29uaihiKSk7CisgICAgI2Vsc2UKKyAgICBjb25zdCBfX20xMjhkIG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BkKF9tbV9zZXRfZXBpMzIoMHg4MDAwMDAwMCwweDAsMHgwLDB4MCkpOworICAgIHJldHVybiBQYWNrZXQxY2QoX21tX2FkZF9wZChfbW1feG9yX3BkKF9tbV9tdWxfcGQodmVjMmRfc3dpenpsZTEoYS52LCAwLCAwKSwgYi52KSwgbWFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9tdWxfcGQodmVjMmRfc3dpenpsZTEoYS52LCAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyZF9zd2l6emxlMShiLnYsIDEsIDApKSkpOworICAgICNlbmRpZgorICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2hlbHBlcjxQYWNrZXQxY2QsIFBhY2tldDFjZCwgdHJ1ZSxmYWxzZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG1hZGQoY29uc3QgUGFja2V0MWNkJiB4LCBjb25zdCBQYWNrZXQxY2QmIHksIGNvbnN0IFBhY2tldDFjZCYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbXVsKGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSBjb25zdAorICB7CisgICAgI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0UzCisgICAgcmV0dXJuIGludGVybmFsOjpwbXVsKHBjb25qKGEpLCBiKTsKKyAgICAjZWxzZQorICAgIGNvbnN0IF9fbTEyOGQgbWFzayA9IF9tbV9jYXN0c2kxMjhfcGQoX21tX3NldF9lcGkzMigweDgwMDAwMDAwLDB4MCwweDAsMHgwKSk7CisgICAgcmV0dXJuIFBhY2tldDFjZChfbW1fYWRkX3BkKF9tbV9tdWxfcGQodmVjMmRfc3dpenpsZTEoYS52LCAwLCAwKSwgYi52KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX3hvcl9wZChfbW1fbXVsX3BkKHZlYzJkX3N3aXp6bGUxKGEudiwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyZF9zd2l6emxlMShiLnYsIDEsIDApKSwgbWFzaykpKTsKKyAgICAjZW5kaWYKKyAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MWNkLCBQYWNrZXQxY2QsIHRydWUsdHJ1ZT4KK3sKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG1hZGQoY29uc3QgUGFja2V0MWNkJiB4LCBjb25zdCBQYWNrZXQxY2QmIHksIGNvbnN0IFBhY2tldDFjZCYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChwbXVsKHgseSksYyk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbXVsKGNvbnN0IFBhY2tldDFjZCYgYSwgY29uc3QgUGFja2V0MWNkJiBiKSBjb25zdAorICB7CisgICAgI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0UzCisgICAgcmV0dXJuIHBjb25qKGludGVybmFsOjpwbXVsKGEsIGIpKTsKKyAgICAjZWxzZQorICAgIGNvbnN0IF9fbTEyOGQgbWFzayA9IF9tbV9jYXN0c2kxMjhfcGQoX21tX3NldF9lcGkzMigweDgwMDAwMDAwLDB4MCwweDAsMHgwKSk7CisgICAgcmV0dXJuIFBhY2tldDFjZChfbW1fc3ViX3BkKF9tbV94b3JfcGQoX21tX211bF9wZCh2ZWMyZF9zd2l6emxlMShhLnYsIDAsIDApLCBiLnYpLCBtYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX211bF9wZCh2ZWMyZF9zd2l6emxlMShhLnYsIDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzJkX3N3aXp6bGUxKGIudiwgMSwgMCkpKSk7CisgICAgI2VuZGlmCisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaGVscGVyPFBhY2tldDJkLCBQYWNrZXQxY2QsIGZhbHNlLGZhbHNlPgoreworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDFjZCBwbWFkZChjb25zdCBQYWNrZXQyZCYgeCwgY29uc3QgUGFja2V0MWNkJiB5LCBjb25zdCBQYWNrZXQxY2QmIGMpIGNvbnN0CisgIHsgcmV0dXJuIHBhZGQoYywgcG11bCh4LHkpKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtdWwoY29uc3QgUGFja2V0MmQmIHgsIGNvbnN0IFBhY2tldDFjZCYgeSkgY29uc3QKKyAgeyByZXR1cm4gUGFja2V0MWNkKEVpZ2VuOjppbnRlcm5hbDo6cG11bCh4LCB5LnYpKTsgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgY29ual9oZWxwZXI8UGFja2V0MWNkLCBQYWNrZXQyZCwgZmFsc2UsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBtYWRkKGNvbnN0IFBhY2tldDFjZCYgeCwgY29uc3QgUGFja2V0MmQmIHksIGNvbnN0IFBhY2tldDFjZCYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChjLCBwbXVsKHgseSkpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcG11bChjb25zdCBQYWNrZXQxY2QmIHgsIGNvbnN0IFBhY2tldDJkJiB5KSBjb25zdAorICB7IHJldHVybiBQYWNrZXQxY2QoRWlnZW46OmludGVybmFsOjpwbXVsKHgudiwgeSkpOyB9Cit9OworCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MWNkIHBkaXY8UGFja2V0MWNkPihjb25zdCBQYWNrZXQxY2QmIGEsIGNvbnN0IFBhY2tldDFjZCYgYikKK3sKKyAgLy8gVE9ETyBvcHRpbWl6ZSBpdCBmb3IgU1NFMyBhbmQgNAorICBQYWNrZXQxY2QgcmVzID0gY29ual9oZWxwZXI8UGFja2V0MWNkLFBhY2tldDFjZCxmYWxzZSx0cnVlPigpLnBtdWwoYSxiKTsKKyAgX19tMTI4ZCBzID0gX21tX211bF9wZChiLnYsYi52KTsKKyAgcmV0dXJuIFBhY2tldDFjZChfbW1fZGl2X3BkKHJlcy52LCBfbW1fYWRkX3BkKHMsX21tX3NodWZmbGVfcGQocywgcywgMHgxKSkpKTsKK30KKworRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQxY2QgcGNwbHhmbGlwLyo8UGFja2V0MWNkPiovKGNvbnN0IFBhY2tldDFjZCYgeCkKK3sKKyAgcmV0dXJuIFBhY2tldDFjZChwcmV2ZXJzZSh4LnYpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09NUExFWF9TU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvYXJjaC9TU0UvTWF0aEZ1bmN0aW9ucy5oIGIvRWlnZW4vc3JjL0NvcmUvYXJjaC9TU0UvTWF0aEZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNDFhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9NYXRoRnVuY3Rpb25zLmgKQEAgLTAsMCArMSwzODQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA3IEp1bGllbiBQb21taWVyCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvKiBUaGUgc2luLCBjb3MsIGV4cCwgYW5kIGxvZyBmdW5jdGlvbnMgb2YgdGhpcyBmaWxlIGNvbWUgZnJvbQorICogSnVsaWVuIFBvbW1pZXIncyBzc2UgbWF0aCBsaWJyYXJ5OiBodHRwOi8vZ3J1bnR0aGVwZW9uLmZyZWUuZnIvc3NlbWF0aC8KKyAqLworCisjaWZuZGVmIEVJR0VOX01BVEhfRlVOQ1RJT05TX1NTRV9ICisjZGVmaW5lIEVJR0VOX01BVEhfRlVOQ1RJT05TX1NTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0NGYgcGxvZzxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIF94KQoreworICBQYWNrZXQ0ZiB4ID0gX3g7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKDEgLCAxLjBmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoaGFsZiwgMC41Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKDB4N2YsIDB4N2YpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmX0ZST01fSU5UKGludl9tYW50X21hc2ssIH4weDdmODAwMDAwKTsKKworICAvKiB0aGUgc21hbGxlc3Qgbm9uIGRlbm9ybWFsaXplZCBmbG9hdCBudW1iZXIgKi8KKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGZfRlJPTV9JTlQobWluX25vcm1fcG9zLCAgMHgwMDgwMDAwMCk7CisKKyAgLyogbmF0dXJhbCBsb2dhcml0aG0gY29tcHV0ZWQgZm9yIDQgc2ltdWx0YW5lb3VzIGZsb2F0CisgICAgcmV0dXJuIE5hTiBmb3IgeCA8PSAwCisgICovCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19TUVJUSEYsIDAuNzA3MTA2NzgxMTg2NTQ3NTI0Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19sb2dfcDAsIDcuMDM3NjgzNjI5MkUtMmYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfbG9nX3AxLCAtIDEuMTUxNDYxMDMxMEUtMWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfbG9nX3AyLCAxLjE2NzY5OTg3NDBFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wMywgLSAxLjI0MjAxNDA4NDZFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wNCwgKyAxLjQyNDkzMjI3ODdFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wNSwgLSAxLjY2NjgwNTc2NjVFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wNiwgKyAyLjAwMDA3MTQ3NjVFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wNywgLSAyLjQ5OTk5OTM5OTNFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19wOCwgKyAzLjMzMzMzMzExNzRFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19xMSwgLTIuMTIxOTQ0NDBlLTRmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2xvZ19xMiwgMC42OTMzNTkzNzVmKTsKKworCisgIFBhY2tldDRpIGVtbTA7CisKKyAgUGFja2V0NGYgaW52YWxpZF9tYXNrID0gX21tX2NtcGxlX3BzKHgsIF9tbV9zZXR6ZXJvX3BzKCkpOworCisgIHggPSBwbWF4KHgsIHA0Zl9taW5fbm9ybV9wb3MpOyAgLyogY3V0IG9mZiBkZW5vcm1hbGl6ZWQgc3R1ZmYgKi8KKyAgZW1tMCA9IF9tbV9zcmxpX2VwaTMyKF9tbV9jYXN0cHNfc2kxMjgoeCksIDIzKTsKKworICAvKiBrZWVwIG9ubHkgdGhlIGZyYWN0aW9uYWwgcGFydCAqLworICB4ID0gX21tX2FuZF9wcyh4LCBwNGZfaW52X21hbnRfbWFzayk7CisgIHggPSBfbW1fb3JfcHMoeCwgcDRmX2hhbGYpOworCisgIGVtbTAgPSBfbW1fc3ViX2VwaTMyKGVtbTAsIHA0aV8weDdmKTsKKyAgUGFja2V0NGYgZSA9IHBhZGQoX21tX2N2dGVwaTMyX3BzKGVtbTApLCBwNGZfMSk7CisKKyAgLyogcGFydDI6CisgICAgIGlmKCB4IDwgU1FSVEhGICkgeworICAgICAgIGUgLT0gMTsKKyAgICAgICB4ID0geCArIHggLSAxLjA7CisgICAgIH0gZWxzZSB7IHggPSB4IC0gMS4wOyB9CisgICovCisgIFBhY2tldDRmIG1hc2sgPSBfbW1fY21wbHRfcHMoeCwgcDRmX2NlcGhlc19TUVJUSEYpOworICBQYWNrZXQ0ZiB0bXAgPSBfbW1fYW5kX3BzKHgsIG1hc2spOworICB4ID0gcHN1Yih4LCBwNGZfMSk7CisgIGUgPSBwc3ViKGUsIF9tbV9hbmRfcHMocDRmXzEsIG1hc2spKTsKKyAgeCA9IHBhZGQoeCwgdG1wKTsKKworICBQYWNrZXQ0ZiB4MiA9IHBtdWwoeCx4KTsKKyAgUGFja2V0NGYgeDMgPSBwbXVsKHgyLHgpOworCisgIFBhY2tldDRmIHksIHkxLCB5MjsKKyAgeSAgPSBwbWFkZChwNGZfY2VwaGVzX2xvZ19wMCwgeCwgcDRmX2NlcGhlc19sb2dfcDEpOworICB5MSA9IHBtYWRkKHA0Zl9jZXBoZXNfbG9nX3AzLCB4LCBwNGZfY2VwaGVzX2xvZ19wNCk7CisgIHkyID0gcG1hZGQocDRmX2NlcGhlc19sb2dfcDYsIHgsIHA0Zl9jZXBoZXNfbG9nX3A3KTsKKyAgeSAgPSBwbWFkZCh5ICwgeCwgcDRmX2NlcGhlc19sb2dfcDIpOworICB5MSA9IHBtYWRkKHkxLCB4LCBwNGZfY2VwaGVzX2xvZ19wNSk7CisgIHkyID0gcG1hZGQoeTIsIHgsIHA0Zl9jZXBoZXNfbG9nX3A4KTsKKyAgeSA9IHBtYWRkKHksIHgzLCB5MSk7CisgIHkgPSBwbWFkZCh5LCB4MywgeTIpOworICB5ID0gcG11bCh5LCB4Myk7CisKKyAgeTEgPSBwbXVsKGUsIHA0Zl9jZXBoZXNfbG9nX3ExKTsKKyAgdG1wID0gcG11bCh4MiwgcDRmX2hhbGYpOworICB5ID0gcGFkZCh5LCB5MSk7CisgIHggPSBwc3ViKHgsIHRtcCk7CisgIHkyID0gcG11bChlLCBwNGZfY2VwaGVzX2xvZ19xMik7CisgIHggPSBwYWRkKHgsIHkpOworICB4ID0gcGFkZCh4LCB5Mik7CisgIHJldHVybiBfbW1fb3JfcHMoeCwgaW52YWxpZF9tYXNrKTsgLy8gbmVnYXRpdmUgYXJnIHdpbGwgYmUgTkFOCit9CisKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0NGYgcGV4cDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIF94KQoreworICBQYWNrZXQ0ZiB4ID0gX3g7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKDEgLCAxLjBmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoaGFsZiwgMC41Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKDB4N2YsIDB4N2YpOworCisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoZXhwX2hpLCAgODguMzc2MjYyNjY0Nzk1MGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihleHBfbG8sIC04OC4zNzYyNjI2NjQ3OTQ5Zik7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX0xPRzJFRiwgMS40NDI2OTUwNDA4ODg5NjM0MWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX0MxLCAwLjY5MzM1OTM3NWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX0MyLCAtMi4xMjE5NDQ0MGUtNGYpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDAsIDEuOTg3NTY5MTUwMEUtNGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX3AxLCAxLjM5ODE5OTk1MDdFLTNmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2V4cF9wMiwgOC4zMzM0NTE5MDczRS0zZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19leHBfcDMsIDQuMTY2NTc5NTg5NEUtMmYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihjZXBoZXNfZXhwX3A0LCAxLjY2NjY2NjU0NTlFLTFmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY2VwaGVzX2V4cF9wNSwgNS4wMDAwMDAxMjAxRS0xZik7CisKKyAgUGFja2V0NGYgdG1wID0gX21tX3NldHplcm9fcHMoKSwgZng7CisgIFBhY2tldDRpIGVtbTA7CisKKyAgLy8gY2xhbXAgeAorICB4ID0gcG1heChwbWluKHgsIHA0Zl9leHBfaGkpLCBwNGZfZXhwX2xvKTsKKworICAvKiBleHByZXNzIGV4cCh4KSBhcyBleHAoZyArIG4qbG9nKDIpKSAqLworICBmeCA9IHBtYWRkKHgsIHA0Zl9jZXBoZXNfTE9HMkVGLCBwNGZfaGFsZik7CisKKyAgLyogaG93IHRvIHBlcmZvcm0gYSBmbG9vcmYgd2l0aCBTU0U6IGp1c3QgYmVsb3cgKi8KKyAgZW1tMCA9IF9tbV9jdnR0cHNfZXBpMzIoZngpOworICB0bXAgID0gX21tX2N2dGVwaTMyX3BzKGVtbTApOworICAvKiBpZiBncmVhdGVyLCBzdWJzdHJhY3QgMSAqLworICBQYWNrZXQ0ZiBtYXNrID0gX21tX2NtcGd0X3BzKHRtcCwgZngpOworICBtYXNrID0gX21tX2FuZF9wcyhtYXNrLCBwNGZfMSk7CisgIGZ4ID0gcHN1Yih0bXAsIG1hc2spOworCisgIHRtcCA9IHBtdWwoZngsIHA0Zl9jZXBoZXNfZXhwX0MxKTsKKyAgUGFja2V0NGYgeiA9IHBtdWwoZngsIHA0Zl9jZXBoZXNfZXhwX0MyKTsKKyAgeCA9IHBzdWIoeCwgdG1wKTsKKyAgeCA9IHBzdWIoeCwgeik7CisKKyAgeiA9IHBtdWwoeCx4KTsKKworICBQYWNrZXQ0ZiB5ID0gcDRmX2NlcGhlc19leHBfcDA7CisgIHkgPSBwbWFkZCh5LCB4LCBwNGZfY2VwaGVzX2V4cF9wMSk7CisgIHkgPSBwbWFkZCh5LCB4LCBwNGZfY2VwaGVzX2V4cF9wMik7CisgIHkgPSBwbWFkZCh5LCB4LCBwNGZfY2VwaGVzX2V4cF9wMyk7CisgIHkgPSBwbWFkZCh5LCB4LCBwNGZfY2VwaGVzX2V4cF9wNCk7CisgIHkgPSBwbWFkZCh5LCB4LCBwNGZfY2VwaGVzX2V4cF9wNSk7CisgIHkgPSBwbWFkZCh5LCB6LCB4KTsKKyAgeSA9IHBhZGQoeSwgcDRmXzEpOworCisgIC8vIGJ1aWxkIDJebgorICBlbW0wID0gX21tX2N2dHRwc19lcGkzMihmeCk7CisgIGVtbTAgPSBfbW1fYWRkX2VwaTMyKGVtbTAsIHA0aV8weDdmKTsKKyAgZW1tMCA9IF9tbV9zbGxpX2VwaTMyKGVtbTAsIDIzKTsKKyAgcmV0dXJuIHBtdWwoeSwgX21tX2Nhc3RzaTEyOF9wcyhlbW0wKSk7Cit9CisKKy8qIGV2YWx1YXRpb24gb2YgNCBzaW5lcyBhdCBvbmNlcywgdXNpbmcgU1NFMiBpbnRyaW5zaWNzLgorCisgICBUaGUgY29kZSBpcyB0aGUgZXhhY3QgcmV3cml0aW5nIG9mIHRoZSBjZXBoZXMgc2luZiBmdW5jdGlvbi4KKyAgIFByZWNpc2lvbiBpcyBleGNlbGxlbnQgYXMgbG9uZyBhcyB4IDwgODE5MiAoSSBkaWQgbm90IGJvdGhlciB0bworICAgdGFrZSBpbnRvIGFjY291bnQgdGhlIHNwZWNpYWwgaGFuZGxpbmcgdGhleSBoYXZlIGZvciBncmVhdGVyIHZhbHVlcworICAgLS0gaXQgZG9lcyBub3QgcmV0dXJuIGdhcmJhZ2UgZm9yIGFyZ3VtZW50cyBvdmVyIDgxOTIsIHRob3VnaCwgYnV0CisgICB0aGUgZXh0cmEgcHJlY2lzaW9uIGlzIG1pc3NpbmcpLgorCisgICBOb3RlIHRoYXQgaXQgaXMgc3VjaCB0aGF0IHNpbmYoKGZsb2F0KU1fUEkpID0gOC43NGUtOCwgd2hpY2ggaXMgdGhlCisgICBzdXJwcmlzaW5nIGJ1dCBjb3JyZWN0IHJlc3VsdC4KKyovCisKK3RlbXBsYXRlPD4gRUlHRU5fREVGSU5FX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TIEVJR0VOX1VOVVNFRAorUGFja2V0NGYgcHNpbjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIF94KQoreworICBQYWNrZXQ0ZiB4ID0gX3g7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKDEgLCAxLjBmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoaGFsZiwgMC41Zik7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkoMSwgMSk7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKG5vdDEsIH4xKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkoMiwgMik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRpKDQsIDQpOworCisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmX0ZST01fSU5UKHNpZ25fbWFzaywgMHg4MDAwMDAwMCk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYobWludXNfY2VwaGVzX0RQMSwtMC43ODUxNTYyNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihtaW51c19jZXBoZXNfRFAyLCAtMi40MTg3NTY0ODQ5ODUzNTE1NjI1ZS00Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKG1pbnVzX2NlcGhlc19EUDMsIC0zLjc3NDg5NDk3NzQ0NTk0MTA4ZS04Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKHNpbmNvZl9wMCwgLTEuOTUxNTI5NTg5MUUtNGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihzaW5jb2ZfcDEsICA4LjMzMjE2MDg3MzZFLTNmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoc2luY29mX3AyLCAtMS42NjY2NjU0NjExRS0xZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNvc2NvZl9wMCwgIDIuNDQzMzE1NzExODA5OTQ4RS0wMDVmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY29zY29mX3AxLCAtMS4zODg3MzE2MjU0OTM3NjVFLTAwM2YpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zihjb3Njb2ZfcDIsICA0LjE2NjY2NDU2ODI5ODgyN0UtMDAyZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19GT1BJLCAxLjI3MzIzOTU0NDczNTE2Zik7IC8vIDQgLyBNX1BJCisKKyAgUGFja2V0NGYgeG1tMSwgeG1tMiA9IF9tbV9zZXR6ZXJvX3BzKCksIHhtbTMsIHNpZ25fYml0LCB5OworCisgIFBhY2tldDRpIGVtbTAsIGVtbTI7CisgIHNpZ25fYml0ID0geDsKKyAgLyogdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWUgKi8KKyAgeCA9IHBhYnMoeCk7CisKKyAgLyogdGFrZSB0aGUgbW9kdWxvICovCisKKyAgLyogZXh0cmFjdCB0aGUgc2lnbiBiaXQgKHVwcGVyIG9uZSkgKi8KKyAgc2lnbl9iaXQgPSBfbW1fYW5kX3BzKHNpZ25fYml0LCBwNGZfc2lnbl9tYXNrKTsKKworICAvKiBzY2FsZSBieSA0L1BpICovCisgIHkgPSBwbXVsKHgsIHA0Zl9jZXBoZXNfRk9QSSk7CisKKyAgLyogc3RvcmUgdGhlIGludGVnZXIgcGFydCBvZiB5IGluIG1tMCAqLworICBlbW0yID0gX21tX2N2dHRwc19lcGkzMih5KTsKKyAgLyogaj0oaisxKSAmICh+MSkgKHNlZSB0aGUgY2VwaGVzIHNvdXJjZXMpICovCisgIGVtbTIgPSBfbW1fYWRkX2VwaTMyKGVtbTIsIHA0aV8xKTsKKyAgZW1tMiA9IF9tbV9hbmRfc2kxMjgoZW1tMiwgcDRpX25vdDEpOworICB5ID0gX21tX2N2dGVwaTMyX3BzKGVtbTIpOworICAvKiBnZXQgdGhlIHN3YXAgc2lnbiBmbGFnICovCisgIGVtbTAgPSBfbW1fYW5kX3NpMTI4KGVtbTIsIHA0aV80KTsKKyAgZW1tMCA9IF9tbV9zbGxpX2VwaTMyKGVtbTAsIDI5KTsKKyAgLyogZ2V0IHRoZSBwb2x5bm9tIHNlbGVjdGlvbiBtYXNrCisgICAgIHRoZXJlIGlzIG9uZSBwb2x5bm9tIGZvciAwIDw9IHggPD0gUGkvNAorICAgICBhbmQgYW5vdGhlciBvbmUgZm9yIFBpLzQ8eDw9UGkvMgorCisgICAgIEJvdGggYnJhbmNoZXMgd2lsbCBiZSBjb21wdXRlZC4KKyAgKi8KKyAgZW1tMiA9IF9tbV9hbmRfc2kxMjgoZW1tMiwgcDRpXzIpOworICBlbW0yID0gX21tX2NtcGVxX2VwaTMyKGVtbTIsIF9tbV9zZXR6ZXJvX3NpMTI4KCkpOworCisgIFBhY2tldDRmIHN3YXBfc2lnbl9iaXQgPSBfbW1fY2FzdHNpMTI4X3BzKGVtbTApOworICBQYWNrZXQ0ZiBwb2x5X21hc2sgPSBfbW1fY2FzdHNpMTI4X3BzKGVtbTIpOworICBzaWduX2JpdCA9IF9tbV94b3JfcHMoc2lnbl9iaXQsIHN3YXBfc2lnbl9iaXQpOworCisgIC8qIFRoZSBtYWdpYyBwYXNzOiAiRXh0ZW5kZWQgcHJlY2lzaW9uIG1vZHVsYXIgYXJpdGhtZXRpYyIKKyAgICAgeCA9ICgoeCAtIHkgKiBEUDEpIC0geSAqIERQMikgLSB5ICogRFAzOyAqLworICB4bW0xID0gcG11bCh5LCBwNGZfbWludXNfY2VwaGVzX0RQMSk7CisgIHhtbTIgPSBwbXVsKHksIHA0Zl9taW51c19jZXBoZXNfRFAyKTsKKyAgeG1tMyA9IHBtdWwoeSwgcDRmX21pbnVzX2NlcGhlc19EUDMpOworICB4ID0gcGFkZCh4LCB4bW0xKTsKKyAgeCA9IHBhZGQoeCwgeG1tMik7CisgIHggPSBwYWRkKHgsIHhtbTMpOworCisgIC8qIEV2YWx1YXRlIHRoZSBmaXJzdCBwb2x5bm9tICAoMCA8PSB4IDw9IFBpLzQpICovCisgIHkgPSBwNGZfY29zY29mX3AwOworICBQYWNrZXQ0ZiB6ID0gX21tX211bF9wcyh4LHgpOworCisgIHkgPSBwbWFkZCh5LCB6LCBwNGZfY29zY29mX3AxKTsKKyAgeSA9IHBtYWRkKHksIHosIHA0Zl9jb3Njb2ZfcDIpOworICB5ID0gcG11bCh5LCB6KTsKKyAgeSA9IHBtdWwoeSwgeik7CisgIFBhY2tldDRmIHRtcCA9IHBtdWwoeiwgcDRmX2hhbGYpOworICB5ID0gcHN1Yih5LCB0bXApOworICB5ID0gcGFkZCh5LCBwNGZfMSk7CisKKyAgLyogRXZhbHVhdGUgdGhlIHNlY29uZCBwb2x5bm9tICAoUGkvNCA8PSB4IDw9IDApICovCisKKyAgUGFja2V0NGYgeTIgPSBwNGZfc2luY29mX3AwOworICB5MiA9IHBtYWRkKHkyLCB6LCBwNGZfc2luY29mX3AxKTsKKyAgeTIgPSBwbWFkZCh5MiwgeiwgcDRmX3NpbmNvZl9wMik7CisgIHkyID0gcG11bCh5Miwgeik7CisgIHkyID0gcG11bCh5MiwgeCk7CisgIHkyID0gcGFkZCh5MiwgeCk7CisKKyAgLyogc2VsZWN0IHRoZSBjb3JyZWN0IHJlc3VsdCBmcm9tIHRoZSB0d28gcG9seW5vbXMgKi8KKyAgeTIgPSBfbW1fYW5kX3BzKHBvbHlfbWFzaywgeTIpOworICB5ID0gX21tX2FuZG5vdF9wcyhwb2x5X21hc2ssIHkpOworICB5ID0gX21tX29yX3BzKHkseTIpOworICAvKiB1cGRhdGUgdGhlIHNpZ24gKi8KKyAgcmV0dXJuIF9tbV94b3JfcHMoeSwgc2lnbl9iaXQpOworfQorCisvKiBhbG1vc3QgdGhlIHNhbWUgYXMgcHNpbiAqLwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ0ZiBwY29zPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgX3gpCit7CisgIFBhY2tldDRmIHggPSBfeDsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoMSAsIDEuMGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihoYWxmLCAwLjVmKTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aSgxLCAxKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkobm90MSwgfjEpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aSgyLCAyKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGkoNCwgNCk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYobWludXNfY2VwaGVzX0RQMSwtMC43ODUxNTYyNWYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihtaW51c19jZXBoZXNfRFAyLCAtMi40MTg3NTY0ODQ5ODUzNTE1NjI1ZS00Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKG1pbnVzX2NlcGhlc19EUDMsIC0zLjc3NDg5NDk3NzQ0NTk0MTA4ZS04Zik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKHNpbmNvZl9wMCwgLTEuOTUxNTI5NTg5MUUtNGYpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihzaW5jb2ZfcDEsICA4LjMzMjE2MDg3MzZFLTNmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoc2luY29mX3AyLCAtMS42NjY2NjU0NjExRS0xZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNvc2NvZl9wMCwgIDIuNDQzMzE1NzExODA5OTQ4RS0wMDVmKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoY29zY29mX3AxLCAtMS4zODg3MzE2MjU0OTM3NjVFLTAwM2YpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zihjb3Njb2ZfcDIsICA0LjE2NjY2NDU2ODI5ODgyN0UtMDAyZik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGNlcGhlc19GT1BJLCAxLjI3MzIzOTU0NDczNTE2Zik7IC8vIDQgLyBNX1BJCisKKyAgUGFja2V0NGYgeG1tMSwgeG1tMiA9IF9tbV9zZXR6ZXJvX3BzKCksIHhtbTMsIHk7CisgIFBhY2tldDRpIGVtbTAsIGVtbTI7CisKKyAgeCA9IHBhYnMoeCk7CisKKyAgLyogc2NhbGUgYnkgNC9QaSAqLworICB5ID0gcG11bCh4LCBwNGZfY2VwaGVzX0ZPUEkpOworCisgIC8qIGdldCB0aGUgaW50ZWdlciBwYXJ0IG9mIHkgKi8KKyAgZW1tMiA9IF9tbV9jdnR0cHNfZXBpMzIoeSk7CisgIC8qIGo9KGorMSkgJiAofjEpIChzZWUgdGhlIGNlcGhlcyBzb3VyY2VzKSAqLworICBlbW0yID0gX21tX2FkZF9lcGkzMihlbW0yLCBwNGlfMSk7CisgIGVtbTIgPSBfbW1fYW5kX3NpMTI4KGVtbTIsIHA0aV9ub3QxKTsKKyAgeSA9IF9tbV9jdnRlcGkzMl9wcyhlbW0yKTsKKworICBlbW0yID0gX21tX3N1Yl9lcGkzMihlbW0yLCBwNGlfMik7CisKKyAgLyogZ2V0IHRoZSBzd2FwIHNpZ24gZmxhZyAqLworICBlbW0wID0gX21tX2FuZG5vdF9zaTEyOChlbW0yLCBwNGlfNCk7CisgIGVtbTAgPSBfbW1fc2xsaV9lcGkzMihlbW0wLCAyOSk7CisgIC8qIGdldCB0aGUgcG9seW5vbSBzZWxlY3Rpb24gbWFzayAqLworICBlbW0yID0gX21tX2FuZF9zaTEyOChlbW0yLCBwNGlfMik7CisgIGVtbTIgPSBfbW1fY21wZXFfZXBpMzIoZW1tMiwgX21tX3NldHplcm9fc2kxMjgoKSk7CisKKyAgUGFja2V0NGYgc2lnbl9iaXQgPSBfbW1fY2FzdHNpMTI4X3BzKGVtbTApOworICBQYWNrZXQ0ZiBwb2x5X21hc2sgPSBfbW1fY2FzdHNpMTI4X3BzKGVtbTIpOworCisgIC8qIFRoZSBtYWdpYyBwYXNzOiAiRXh0ZW5kZWQgcHJlY2lzaW9uIG1vZHVsYXIgYXJpdGhtZXRpYyIKKyAgICAgeCA9ICgoeCAtIHkgKiBEUDEpIC0geSAqIERQMikgLSB5ICogRFAzOyAqLworICB4bW0xID0gcG11bCh5LCBwNGZfbWludXNfY2VwaGVzX0RQMSk7CisgIHhtbTIgPSBwbXVsKHksIHA0Zl9taW51c19jZXBoZXNfRFAyKTsKKyAgeG1tMyA9IHBtdWwoeSwgcDRmX21pbnVzX2NlcGhlc19EUDMpOworICB4ID0gcGFkZCh4LCB4bW0xKTsKKyAgeCA9IHBhZGQoeCwgeG1tMik7CisgIHggPSBwYWRkKHgsIHhtbTMpOworCisgIC8qIEV2YWx1YXRlIHRoZSBmaXJzdCBwb2x5bm9tICAoMCA8PSB4IDw9IFBpLzQpICovCisgIHkgPSBwNGZfY29zY29mX3AwOworICBQYWNrZXQ0ZiB6ID0gcG11bCh4LHgpOworCisgIHkgPSBwbWFkZCh5LHoscDRmX2Nvc2NvZl9wMSk7CisgIHkgPSBwbWFkZCh5LHoscDRmX2Nvc2NvZl9wMik7CisgIHkgPSBwbXVsKHksIHopOworICB5ID0gcG11bCh5LCB6KTsKKyAgUGFja2V0NGYgdG1wID0gX21tX211bF9wcyh6LCBwNGZfaGFsZik7CisgIHkgPSBwc3ViKHksIHRtcCk7CisgIHkgPSBwYWRkKHksIHA0Zl8xKTsKKworICAvKiBFdmFsdWF0ZSB0aGUgc2Vjb25kIHBvbHlub20gIChQaS80IDw9IHggPD0gMCkgKi8KKyAgUGFja2V0NGYgeTIgPSBwNGZfc2luY29mX3AwOworICB5MiA9IHBtYWRkKHkyLCB6LCBwNGZfc2luY29mX3AxKTsKKyAgeTIgPSBwbWFkZCh5MiwgeiwgcDRmX3NpbmNvZl9wMik7CisgIHkyID0gcG11bCh5Miwgeik7CisgIHkyID0gcG1hZGQoeTIsIHgsIHgpOworCisgIC8qIHNlbGVjdCB0aGUgY29ycmVjdCByZXN1bHQgZnJvbSB0aGUgdHdvIHBvbHlub21zICovCisgIHkyID0gX21tX2FuZF9wcyhwb2x5X21hc2ssIHkyKTsKKyAgeSAgPSBfbW1fYW5kbm90X3BzKHBvbHlfbWFzaywgeSk7CisgIHkgID0gX21tX29yX3BzKHkseTIpOworCisgIC8qIHVwZGF0ZSB0aGUgc2lnbiAqLworICByZXR1cm4gX21tX3hvcl9wcyh5LCBzaWduX2JpdCk7Cit9CisKKy8vIFRoaXMgaXMgYmFzZWQgb24gUXVha2UzJ3MgZmFzdCBpbnZlcnNlIHNxdWFyZSByb290LgorLy8gRm9yIGRldGFpbCBzZWUgaGVyZTogaHR0cDovL3d3dy5iZXlvbmQzZC5jb20vY29udGVudC9hcnRpY2xlcy84LwordGVtcGxhdGU8PiBFSUdFTl9ERUZJTkVfRlVOQ1RJT05fQUxMT1dJTkdfTVVMVElQTEVfREVGSU5JVElPTlMgRUlHRU5fVU5VU0VECitQYWNrZXQ0ZiBwc3FydDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIF94KQoreworICBQYWNrZXQ0ZiBoYWxmID0gcG11bChfeCwgcHNldDE8UGFja2V0NGY+KC41ZikpOworCisgIC8qIHNlbGVjdCBvbmx5IHRoZSBpbnZlcnNlIHNxcnQgb2Ygbm9uLXplcm8gaW5wdXRzICovCisgIFBhY2tldDRmIG5vbl96ZXJvX21hc2sgPSBfbW1fY21wZ3RfcHMoX3gsIHBzZXQxPFBhY2tldDRmPihzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKSk7CisgIFBhY2tldDRmIHggPSBfbW1fYW5kX3BzKG5vbl96ZXJvX21hc2ssIF9tbV9yc3FydF9wcyhfeCkpOworCisgIHggPSBwbXVsKHgsIHBzdWIocHNldDE8UGFja2V0NGY+KDEuNWYpLCBwbXVsKGhhbGYsIHBtdWwoeCx4KSkpKTsKKyAgcmV0dXJuIHBtdWwoX3gseCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX01BVEhfRlVOQ1RJT05TX1NTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmggYi9FaWdlbi9zcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkOTE4MgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL2FyY2gvU1NFL1BhY2tldE1hdGguaApAQCAtMCwwICsxLDYzMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFDS0VUX01BVEhfU1NFX0gKKyNkZWZpbmUgRUlHRU5fUEFDS0VUX01BVEhfU1NFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmbmRlZiBFSUdFTl9DQUNIRUZSSUVORExZX1BST0RVQ1RfVEhSRVNIT0xECisjZGVmaW5lIEVJR0VOX0NBQ0hFRlJJRU5ETFlfUFJPRFVDVF9USFJFU0hPTEQgOAorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMKKyNkZWZpbmUgRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMgKDIqc2l6ZW9mKHZvaWQqKSkKKyNlbmRpZgorCit0eXBlZGVmIF9fbTEyOCAgUGFja2V0NGY7Cit0eXBlZGVmIF9fbTEyOGkgUGFja2V0NGk7Cit0eXBlZGVmIF9fbTEyOGQgUGFja2V0MmQ7CisKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8X19tMTI4PiAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPF9fbTEyOGk+IHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxfX20xMjhkPiB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKworI2RlZmluZSB2ZWM0Zl9zd2l6emxlMSh2LHAscSxyLHMpIFwKKyAgKF9tbV9jYXN0c2kxMjhfcHMoX21tX3NodWZmbGVfZXBpMzIoIF9tbV9jYXN0cHNfc2kxMjgodiksICgocyk8PDZ8KHIpPDw0fChxKTw8MnwocCkpKSkpCisKKyNkZWZpbmUgdmVjNGlfc3dpenpsZTEodixwLHEscixzKSBcCisgIChfbW1fc2h1ZmZsZV9lcGkzMiggdiwgKChzKTw8Nnwocik8PDR8KHEpPDwyfChwKSkpKQorCisjZGVmaW5lIHZlYzJkX3N3aXp6bGUxKHYscCxxKSBcCisgIChfbW1fY2FzdHNpMTI4X3BkKF9tbV9zaHVmZmxlX2VwaTMyKCBfbW1fY2FzdHBkX3NpMTI4KHYpLCAoKHEqMisxKTw8NnwocSoyKTw8NHwocCoyKzEpPDwyfChwKjIpKSkpKQorICAKKyNkZWZpbmUgdmVjNGZfc3dpenpsZTIoYSxiLHAscSxyLHMpIFwKKyAgKF9tbV9zaHVmZmxlX3BzKCAoYSksIChiKSwgKChzKTw8Nnwocik8PDR8KHEpPDwyfChwKSkpKQorCisjZGVmaW5lIHZlYzRpX3N3aXp6bGUyKGEsYixwLHEscixzKSBcCisgIChfbW1fY2FzdHBzX3NpMTI4KCAoX21tX3NodWZmbGVfcHMoIF9tbV9jYXN0c2kxMjhfcHMoYSksIF9tbV9jYXN0c2kxMjhfcHMoYiksICgocyk8PDZ8KHIpPDw0fChxKTw8MnwocCkpKSkpKQorCisjZGVmaW5lIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKE5BTUUsWCkgXAorICBjb25zdCBQYWNrZXQ0ZiBwNGZfIyNOQU1FID0gcHNldDE8UGFja2V0NGY+KFgpCisKKyNkZWZpbmUgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGZfRlJPTV9JTlQoTkFNRSxYKSBcCisgIGNvbnN0IFBhY2tldDRmIHA0Zl8jI05BTUUgPSBfbW1fY2FzdHNpMTI4X3BzKHBzZXQxPFBhY2tldDRpPihYKSkKKworI2RlZmluZSBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0aShOQU1FLFgpIFwKKyAgY29uc3QgUGFja2V0NGkgcDRpXyMjTkFNRSA9IHBzZXQxPFBhY2tldDRpPihYKQorCisKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8ZmxvYXQ+ICA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDRmIHR5cGU7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTQsCisKKyAgICBIYXNEaXYgICAgPSAxLAorICAgIEhhc1NpbiAgPSBFSUdFTl9GQVNUX01BVEgsCisgICAgSGFzQ29zICA9IEVJR0VOX0ZBU1RfTUFUSCwKKyAgICBIYXNMb2cgID0gMSwKKyAgICBIYXNFeHAgID0gMSwKKyAgICBIYXNTcXJ0ID0gMQorICB9OworfTsKK3RlbXBsYXRlPD4gc3RydWN0IHBhY2tldF90cmFpdHM8ZG91YmxlPiA6IGRlZmF1bHRfcGFja2V0X3RyYWl0cworeworICB0eXBlZGVmIFBhY2tldDJkIHR5cGU7CisgIGVudW0geworICAgIFZlY3Rvcml6YWJsZSA9IDEsCisgICAgQWxpZ25lZE9uU2NhbGFyID0gMSwKKyAgICBzaXplPTIsCisKKyAgICBIYXNEaXYgICAgPSAxCisgIH07Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgcGFja2V0X3RyYWl0czxpbnQ+ICAgIDogZGVmYXVsdF9wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgUGFja2V0NGkgdHlwZTsKKyAgZW51bSB7CisgICAgLy8gRklYTUUgY2hlY2sgdGhlIEhhcyoKKyAgICBWZWN0b3JpemFibGUgPSAxLAorICAgIEFsaWduZWRPblNjYWxhciA9IDEsCisgICAgc2l6ZT00CisgIH07Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCB1bnBhY2tldF90cmFpdHM8UGFja2V0NGY+IHsgdHlwZWRlZiBmbG9hdCAgdHlwZTsgZW51bSB7c2l6ZT00fTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IHVucGFja2V0X3RyYWl0czxQYWNrZXQyZD4geyB0eXBlZGVmIGRvdWJsZSB0eXBlOyBlbnVtIHtzaXplPTJ9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzPFBhY2tldDRpPiB7IHR5cGVkZWYgaW50ICAgIHR5cGU7IGVudW0ge3NpemU9NH07IH07CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVI9PTE1MDApCisvLyBXb3JrYXJvdW5kIE1TVkMgOSBpbnRlcm5hbCBjb21waWxlciBlcnJvci4KKy8vIFRPRE86IEl0IGhhcyBiZWVuIGRldGVjdGVkIHdpdGggd2luNjQgYnVpbGRzIChhbWQ2NCksIHNvIGxldCdzIGNoZWNrIHdoZXRoZXIgaXQgYWxzbyBoYXBwZW5zIGluIDMyYml0cytTU0UgbW9kZQorLy8gVE9ETzogbGV0J3MgY2hlY2sgd2hldGhlciB0aGVyZSBkb2VzIG5vdCBleGlzdCBhIGJldHRlciBmaXgsIGxpa2UgYWRkaW5nIGEgcHNldDAoKSBmdW5jdGlvbi4gKGl0IGNyYXNoZWQgb24gcHNldDEoMCkpLgordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBzZXQxPFBhY2tldDRmPihjb25zdCBmbG9hdCYgIGZyb20pIHsgcmV0dXJuIF9tbV9zZXRfcHMoZnJvbSxmcm9tLGZyb20sZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwc2V0MTxQYWNrZXQyZD4oY29uc3QgZG91YmxlJiBmcm9tKSB7IHJldHVybiBfbW1fc2V0X3BkKGZyb20sZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwc2V0MTxQYWNrZXQ0aT4oY29uc3QgaW50JiAgICBmcm9tKSB7IHJldHVybiBfbW1fc2V0X2VwaTMyKGZyb20sZnJvbSxmcm9tLGZyb20pOyB9CisjZWxzZQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBzZXQxPFBhY2tldDRmPihjb25zdCBmbG9hdCYgIGZyb20pIHsgcmV0dXJuIF9tbV9zZXQxX3BzKGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHNldDE8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSYgZnJvbSkgeyByZXR1cm4gX21tX3NldDFfcGQoZnJvbSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwc2V0MTxQYWNrZXQ0aT4oY29uc3QgaW50JiAgICBmcm9tKSB7IHJldHVybiBfbW1fc2V0MV9lcGkzMihmcm9tKTsgfQorI2VuZGlmCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbHNldDxmbG9hdD4oY29uc3QgZmxvYXQmIGEpIHsgcmV0dXJuIF9tbV9hZGRfcHMocHNldDE8UGFja2V0NGY+KGEpLCBfbW1fc2V0X3BzKDMsMiwxLDApKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBsc2V0PGRvdWJsZT4oY29uc3QgZG91YmxlJiBhKSB7IHJldHVybiBfbW1fYWRkX3BkKHBzZXQxPFBhY2tldDJkPihhKSxfbW1fc2V0X3BkKDEsMCkpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGxzZXQ8aW50Pihjb25zdCBpbnQmIGEpIHsgcmV0dXJuIF9tbV9hZGRfZXBpMzIocHNldDE8UGFja2V0NGk+KGEpLF9tbV9zZXRfZXBpMzIoMywyLDEsMCkpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYWRkPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSwgY29uc3QgUGFja2V0NGYmIGIpIHsgcmV0dXJuIF9tbV9hZGRfcHMoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBhZGQ8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gX21tX2FkZF9wZChhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcGFkZDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEsIGNvbnN0IFBhY2tldDRpJiBiKSB7IHJldHVybiBfbW1fYWRkX2VwaTMyKGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBzdWI8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX3N1Yl9wcyhhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHN1YjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiBfbW1fc3ViX3BkKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwc3ViPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIF9tbV9zdWJfZXBpMzIoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG5lZ2F0ZShjb25zdCBQYWNrZXQ0ZiYgYSkKK3sKKyAgY29uc3QgUGFja2V0NGYgbWFzayA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NldHJfZXBpMzIoMHg4MDAwMDAwMCwweDgwMDAwMDAwLDB4ODAwMDAwMDAsMHg4MDAwMDAwMCkpOworICByZXR1cm4gX21tX3hvcl9wcyhhLG1hc2spOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBuZWdhdGUoY29uc3QgUGFja2V0MmQmIGEpCit7CisgIGNvbnN0IFBhY2tldDJkIG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BkKF9tbV9zZXRyX2VwaTMyKDB4MCwweDgwMDAwMDAwLDB4MCwweDgwMDAwMDAwKSk7CisgIHJldHVybiBfbW1feG9yX3BkKGEsbWFzayk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcG5lZ2F0ZShjb25zdCBQYWNrZXQ0aSYgYSkKK3sKKyAgcmV0dXJuIHBzdWIoX21tX3NldHJfZXBpMzIoMCwwLDAsMCksIGEpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG11bDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fbXVsX3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbXVsPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9tdWxfcGQoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBtdWw8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikKK3sKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFNF8xCisgIHJldHVybiBfbW1fbXVsbG9fZXBpMzIoYSxiKTsKKyNlbHNlCisgIC8vIHRoaXMgdmVyc2lvbiBpcyBzbGlnaHRseSBmYXN0ZXIgdGhhbiA0IHNjYWxhciBwcm9kdWN0cworICByZXR1cm4gdmVjNGlfc3dpenpsZTEoCisgICAgICAgICAgICB2ZWM0aV9zd2l6emxlMigKKyAgICAgICAgICAgICAgX21tX211bF9lcHUzMihhLGIpLAorICAgICAgICAgICAgICBfbW1fbXVsX2VwdTMyKHZlYzRpX3N3aXp6bGUxKGEsMSwwLDMsMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNGlfc3dpenpsZTEoYiwxLDAsMywyKSksCisgICAgICAgICAgICAgIDAsMiwwLDIpLAorICAgICAgICAgICAgMCwyLDEsMyk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBkaXY8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX2Rpdl9wcyhhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGRpdjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiBfbW1fZGl2X3BkKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwZGl2PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgLyphKi8sIGNvbnN0IFBhY2tldDRpJiAvKmIqLykKK3sgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJwYWNrZXQgaW50ZWdlciBkaXZpc2lvbiBhcmUgbm90IHN1cHBvcnRlZCBieSBTU0UiKTsKKyAgcmV0dXJuIHBzZXQxPFBhY2tldDRpPigwKTsKK30KKworLy8gZm9yIHNvbWUgd2VpcmQgcmFpc29ucywgaXQgaGFzIHRvIGJlIG92ZXJsb2FkZWQgZm9yIHBhY2tldCBvZiBpbnRlZ2VycwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBtYWRkKGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYiwgY29uc3QgUGFja2V0NGkmIGMpIHsgcmV0dXJuIHBhZGQocG11bChhLGIpLCBjKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG1pbjxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fbWluX3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbWluPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9taW5fcGQoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBtaW48UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikKK3sKKyAgLy8gYWZ0ZXIgc29tZSBiZW5jaCwgdGhpcyB2ZXJzaW9uICppcyogZmFzdGVyIHRoYW4gYSBzY2FsYXIgaW1wbGVtZW50YXRpb24KKyAgUGFja2V0NGkgbWFzayA9IF9tbV9jbXBsdF9lcGkzMihhLGIpOworICByZXR1cm4gX21tX29yX3NpMTI4KF9tbV9hbmRfc2kxMjgobWFzayxhKSxfbW1fYW5kbm90X3NpMTI4KG1hc2ssYikpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcG1heDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fbWF4X3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwbWF4PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9tYXhfcGQoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBtYXg8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikKK3sKKyAgLy8gYWZ0ZXIgc29tZSBiZW5jaCwgdGhpcyB2ZXJzaW9uICppcyogZmFzdGVyIHRoYW4gYSBzY2FsYXIgaW1wbGVtZW50YXRpb24KKyAgUGFja2V0NGkgbWFzayA9IF9tbV9jbXBndF9lcGkzMihhLGIpOworICByZXR1cm4gX21tX29yX3NpMTI4KF9tbV9hbmRfc2kxMjgobWFzayxhKSxfbW1fYW5kbm90X3NpMTI4KG1hc2ssYikpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGFuZDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fYW5kX3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwYW5kPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9hbmRfcGQoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhbmQ8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gX21tX2FuZF9zaTEyOChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwb3I8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX29yX3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwb3I8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhLCBjb25zdCBQYWNrZXQyZCYgYikgeyByZXR1cm4gX21tX29yX3BkKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwb3I8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gX21tX29yX3NpMTI4KGEsYik7IH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHB4b3I8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhLCBjb25zdCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX3hvcl9wcyhhLGIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHhvcjxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEsIGNvbnN0IFBhY2tldDJkJiBiKSB7IHJldHVybiBfbW1feG9yX3BkKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBweG9yPFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSwgY29uc3QgUGFja2V0NGkmIGIpIHsgcmV0dXJuIF9tbV94b3Jfc2kxMjgoYSxiKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGFuZG5vdDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEsIGNvbnN0IFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fYW5kbm90X3BzKGEsYik7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwYW5kbm90PFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCYgYSwgY29uc3QgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9hbmRub3RfcGQoYSxiKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhbmRub3Q8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhLCBjb25zdCBQYWNrZXQ0aSYgYikgeyByZXR1cm4gX21tX2FuZG5vdF9zaTEyOChhLGIpOyB9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwbG9hZDxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqICAgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX0xPQUQgcmV0dXJuIF9tbV9sb2FkX3BzKGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxvYWQ8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSogIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEIHJldHVybiBfbW1fbG9hZF9wZChmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkPFBhY2tldDRpPihjb25zdCBpbnQqICAgICBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCByZXR1cm4gX21tX2xvYWRfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBQYWNrZXQ0aSo+KGZyb20pKTsgfQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgdGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBsb2FkdTxQYWNrZXQ0Zj4oY29uc3QgZmxvYXQqICBmcm9tKSB7CisgICAgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQKKyAgICAjaWYgKF9NU0NfVkVSPT0xNjAwKQorICAgIC8vIE5PVEUgU29tZSB2ZXJzaW9uIG9mIE1TVkMxMCBnZW5lcmF0ZXMgYmFkIGNvZGUgd2hlbiB1c2luZyBfbW1fbG9hZHVfcHMKKyAgICAvLyAoaS5lLiwgaXQgZG9lcyBub3QgZ2VuZXJhdGUgYW4gdW5hbGlnbmVkIGxvYWQhIQorICAgIC8vIFRPRE8gT24gbW9zdCBhcmNoaXRlY3R1cmVzIHRoaXMgdmVyc2lvbiBzaG91bGQgYWxzbyBiZSBmYXN0ZXIgdGhhbiBhIHNpbmdsZSBfbW1fbG9hZHVfcHMKKyAgICAvLyBzbyB3ZSBjb3VsZCBhbHNvIGVuYWJsZSBpdCBmb3IgTVNWQzA4IGJ1dCBmaXJzdCB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBsYXRlciBkb2VzIG5vdCBnZW5lcmF0ZSBjcmFwIHdoZW4gZG9pbmcgc28uLi4KKyAgICBfX20xMjggcmVzID0gX21tX2xvYWRsX3BpKF9tbV9zZXQxX3BzKDAuMGYpLCAoY29uc3QgX19tNjQqKShmcm9tKSk7CisgICAgcmVzID0gX21tX2xvYWRoX3BpKHJlcywgKGNvbnN0IF9fbTY0KikoZnJvbSsyKSk7CisgICAgcmV0dXJuIHJlczsKKyAgICAjZWxzZQorICAgIHJldHVybiBfbW1fbG9hZHVfcHMoZnJvbSk7CisgICAgI2VuZGlmCisgIH0KKyAgdGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBsb2FkdTxQYWNrZXQyZD4oY29uc3QgZG91YmxlKiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FEIHJldHVybiBfbW1fbG9hZHVfcGQoZnJvbSk7IH0KKyAgdGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkdTxQYWNrZXQ0aT4oY29uc3QgaW50KiAgICBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FEIHJldHVybiBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBQYWNrZXQ0aSo+KGZyb20pKTsgfQorI2Vsc2UKKy8vIEZhc3QgdW5hbGlnbmVkIGxvYWRzLiBOb3RlIHRoYXQgaGVyZSB3ZSBjYW5ub3QgZGlyZWN0bHkgdXNlIGludHJpbnNpY3M6IHRoaXMgd291bGQKKy8vIHJlcXVpcmUgcG9pbnRlciBjYXN0aW5nIHRvIGluY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIGFuZCBsZWFkcyB0byBpbnZhbGlkIGNvZGUKKy8vIGJlY2F1c2Ugb2YgdGhlIHN0cmljdCBhbGlhc2luZyBydWxlLiBUaGUgImR1bW15IiBzdHVmZiBhcmUgcmVxdWlyZWQgdG8gZW5mb3JjZQorLy8gYSBjb3JyZWN0IGluc3RydWN0aW9uIGRlcGVuZGVuY3kuCisvLyBUT0RPOiBkbyB0aGUgc2FtZSBmb3IgTVNWQyAoSUNDIGlzIGNvbXBhdGlibGUpCisvLyBOT1RFOiB3aXRoIHRoZSBjb2RlIGJlbG93LCBNU1ZDJ3MgY29tcGlsZXIgY3Jhc2hlcyEKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pCisgIC8vIGJ1ZyAxOTU6IGdjYy9pMzg2IGVtaXRzIHdlaXJkIHg4NyBmbGRsL2ZzdHBsIGluc3RydWN0aW9ucyBmb3IgX21tX2xvYWRfc2QKKyAgI2RlZmluZSBFSUdFTl9BVk9JRF9DVVNUT01fVU5BTElHTkVEX0xPQURTIDEKKyNlbGlmIGRlZmluZWQoX19jbGFuZ19fKQorICAvLyBidWcgMjAxOiBTZWdmYXVsdHMgaW4gX19tbV9sb2FkaF9wZCB3aXRoIGNsYW5nIDIuOAorICAjZGVmaW5lIEVJR0VOX0FWT0lEX0NVU1RPTV9VTkFMSUdORURfTE9BRFMgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9BVk9JRF9DVVNUT01fVU5BTElHTkVEX0xPQURTIDAKKyNlbmRpZgorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxvYWR1PFBhY2tldDRmPihjb25zdCBmbG9hdCogZnJvbSkKK3sKKyAgRUlHRU5fREVCVUdfVU5BTElHTkVEX0xPQUQKKyNpZiBFSUdFTl9BVk9JRF9DVVNUT01fVU5BTElHTkVEX0xPQURTCisgIHJldHVybiBfbW1fbG9hZHVfcHMoZnJvbSk7CisjZWxzZQorICBfX20xMjhkIHJlczsKKyAgcmVzID0gIF9tbV9sb2FkX3NkKChjb25zdCBkb3VibGUqKShmcm9tKSkgOworICByZXMgPSAgX21tX2xvYWRoX3BkKHJlcywgKGNvbnN0IGRvdWJsZSopKGZyb20rMikpIDsKKyAgcmV0dXJuIF9tbV9jYXN0cGRfcHMocmVzKTsKKyNlbmRpZgorfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHBsb2FkdTxQYWNrZXQyZD4oY29uc3QgZG91YmxlKiBmcm9tKQoreworICBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRAorI2lmIEVJR0VOX0FWT0lEX0NVU1RPTV9VTkFMSUdORURfTE9BRFMKKyAgcmV0dXJuIF9tbV9sb2FkdV9wZChmcm9tKTsKKyNlbHNlCisgIF9fbTEyOGQgcmVzOworICByZXMgPSBfbW1fbG9hZF9zZChmcm9tKSA7CisgIHJlcyA9IF9tbV9sb2FkaF9wZChyZXMsZnJvbSsxKTsKKyAgcmV0dXJuIHJlczsKKyNlbmRpZgorfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBsb2FkdTxQYWNrZXQ0aT4oY29uc3QgaW50KiBmcm9tKQoreworICBFSUdFTl9ERUJVR19VTkFMSUdORURfTE9BRAorI2lmIEVJR0VOX0FWT0lEX0NVU1RPTV9VTkFMSUdORURfTE9BRFMKKyAgcmV0dXJuIF9tbV9sb2FkdV9zaTEyOChyZWludGVycHJldF9jYXN0PGNvbnN0IFBhY2tldDRpKj4oZnJvbSkpOworI2Vsc2UKKyAgX19tMTI4ZCByZXM7CisgIHJlcyA9ICBfbW1fbG9hZF9zZCgoY29uc3QgZG91YmxlKikoZnJvbSkpIDsKKyAgcmVzID0gIF9tbV9sb2FkaF9wZChyZXMsIChjb25zdCBkb3VibGUqKShmcm9tKzIpKSA7CisgIHJldHVybiBfbW1fY2FzdHBkX3NpMTI4KHJlcyk7CisjZW5kaWYKK30KKyNlbmRpZgorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcGxvYWRkdXA8UGFja2V0NGY+KGNvbnN0IGZsb2F0KiAgIGZyb20pCit7CisgIHJldHVybiB2ZWM0Zl9zd2l6emxlMShfbW1fY2FzdHBkX3BzKF9tbV9sb2FkX3NkKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZG91YmxlKj4oZnJvbSkpKSwgMCwgMCwgMSwgMSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGxvYWRkdXA8UGFja2V0MmQ+KGNvbnN0IGRvdWJsZSogIGZyb20pCit7IHJldHVybiBwc2V0MTxQYWNrZXQyZD4oZnJvbVswXSk7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0aSBwbG9hZGR1cDxQYWNrZXQ0aT4oY29uc3QgaW50KiAgICAgZnJvbSkKK3sKKyAgUGFja2V0NGkgdG1wOworICB0bXAgPSBfbW1fbG9hZGxfZXBpNjQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBQYWNrZXQ0aSo+KGZyb20pKTsKKyAgcmV0dXJuIHZlYzRpX3N3aXp6bGUxKHRtcCwgMCwgMCwgMSwgMSk7Cit9CisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTxmbG9hdD4oZmxvYXQqICAgdG8sIGNvbnN0IFBhY2tldDRmJiBmcm9tKSB7IEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgX21tX3N0b3JlX3BzKHRvLCBmcm9tKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JlPGRvdWJsZT4oZG91YmxlKiB0bywgY29uc3QgUGFja2V0MmQmIGZyb20pIHsgRUlHRU5fREVCVUdfQUxJR05FRF9TVE9SRSBfbW1fc3RvcmVfcGQodG8sIGZyb20pOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmU8aW50PihpbnQqICAgICAgIHRvLCBjb25zdCBQYWNrZXQ0aSYgZnJvbSkgeyBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFIF9tbV9zdG9yZV9zaTEyOChyZWludGVycHJldF9jYXN0PFBhY2tldDRpKj4odG8pLCBmcm9tKTsgfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmV1PGRvdWJsZT4oZG91YmxlKiB0bywgY29uc3QgUGFja2V0MmQmIGZyb20pIHsKKyAgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFCisgIF9tbV9zdG9yZWxfcGQoKHRvKSwgZnJvbSk7CisgIF9tbV9zdG9yZWhfcGQoKHRvKzEpLCBmcm9tKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZXU8ZmxvYXQ+KGZsb2F0KiAgdG8sIGNvbnN0IFBhY2tldDRmJiBmcm9tKSB7IEVJR0VOX0RFQlVHX1VOQUxJR05FRF9TVE9SRSBwc3RvcmV1KHJlaW50ZXJwcmV0X2Nhc3Q8ZG91YmxlKj4odG8pLCBfbW1fY2FzdHBzX3BkKGZyb20pKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcHN0b3JldTxpbnQ+KGludCogICAgICB0bywgY29uc3QgUGFja2V0NGkmIGZyb20pIHsgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIHBzdG9yZXUocmVpbnRlcnByZXRfY2FzdDxkb3VibGUqPih0byksIF9tbV9jYXN0c2kxMjhfcGQoZnJvbSkpOyB9CisKKy8vIHNvbWUgY29tcGlsZXJzIG1pZ2h0IGJlIHRlbXB0ZWQgdG8gcGVyZm9ybSBtdWx0aXBsZSBtb3ZlcyBpbnN0ZWFkIG9mIHVzaW5nIGEgdmVjdG9yIHBhdGguCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwc3RvcmUxPFBhY2tldDRmPihmbG9hdCogdG8sIGNvbnN0IGZsb2F0JiBhKQoreworICBQYWNrZXQ0ZiBwYSA9IF9tbV9zZXRfc3MoYSk7CisgIHBzdG9yZSh0bywgdmVjNGZfc3dpenpsZTEocGEsMCwwLDAsMCkpOworfQorLy8gc29tZSBjb21waWxlcnMgbWlnaHQgYmUgdGVtcHRlZCB0byBwZXJmb3JtIG11bHRpcGxlIG1vdmVzIGluc3RlYWQgb2YgdXNpbmcgYSB2ZWN0b3IgcGF0aC4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHBzdG9yZTE8UGFja2V0MmQ+KGRvdWJsZSogdG8sIGNvbnN0IGRvdWJsZSYgYSkKK3sKKyAgUGFja2V0MmQgcGEgPSBfbW1fc2V0X3NkKGEpOworICBwc3RvcmUodG8sIHZlYzJkX3N3aXp6bGUxKHBhLDAsMCkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxmbG9hdD4oY29uc3QgZmxvYXQqICAgYWRkcikgeyBfbW1fcHJlZmV0Y2goKGNvbnN0IGNoYXIqKShhZGRyKSwgX01NX0hJTlRfVDApOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxkb3VibGU+KGNvbnN0IGRvdWJsZSogYWRkcikgeyBfbW1fcHJlZmV0Y2goKGNvbnN0IGNoYXIqKShhZGRyKSwgX01NX0hJTlRfVDApOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBwcmVmZXRjaDxpbnQ+KGNvbnN0IGludCogICAgICAgYWRkcikgeyBfbW1fcHJlZmV0Y2goKGNvbnN0IGNoYXIqKShhZGRyKSwgX01NX0hJTlRfVDApOyB9CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9XSU42NCkgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKy8vIFRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgZml4ZXMgYW4gaW50ZXJuYWwgY29tcGlsYXRpb24gZXJyb3IgaW4gdnMgPD0gMjAwOCBhbmQgYSB3cm9uZy1yZXN1bHQgYnVnIGluIHZzIDIwMTAKKy8vIERpcmVjdCBvZiB0aGUgc3RydWN0IG1lbWJlcnMgZml4ZWQgYnVnICM2Mi4KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCAgcGZpcnN0PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkgeyByZXR1cm4gYS5tMTI4X2YzMlswXTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwZmlyc3Q8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiBhLm0xMjhkX2Y2NFswXTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCAgICBwZmlyc3Q8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKSB7IGludCB4ID0gX21tX2N2dHNpMTI4X3NpMzIoYSk7IHJldHVybiB4OyB9CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorLy8gVGhlIHRlbXBvcmFyeSB2YXJpYWJsZSBmaXhlcyBhbiBpbnRlcm5hbCBjb21waWxhdGlvbiBlcnJvciBpbiB2cyA8PSAyMDA4IGFuZCBhIHdyb25nLXJlc3VsdCBidWcgaW4gdnMgMjAxMAordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0ICBwZmlyc3Q8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKSB7IGZsb2F0IHggPSBfbW1fY3Z0c3NfZjMyKGEpOyByZXR1cm4geDsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwZmlyc3Q8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IGRvdWJsZSB4ID0gX21tX2N2dHNkX2Y2NChhKTsgcmV0dXJuIHg7IH0KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgICAgcGZpcnN0PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSkgeyBpbnQgeCA9IF9tbV9jdnRzaTEyOF9zaTMyKGEpOyByZXR1cm4geDsgfQorI2Vsc2UKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCAgcGZpcnN0PFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiYgYSkgeyByZXR1cm4gX21tX2N2dHNzX2YzMihhKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwZmlyc3Q8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiBfbW1fY3Z0c2RfZjY0KGEpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgaW50ICAgIHBmaXJzdDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpIHsgcmV0dXJuIF9tbV9jdnRzaTEyOF9zaTMyKGEpOyB9CisjZW5kaWYKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHByZXZlcnNlKGNvbnN0IFBhY2tldDRmJiBhKQoreyByZXR1cm4gX21tX3NodWZmbGVfcHMoYSxhLDB4MUIpOyB9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcHJldmVyc2UoY29uc3QgUGFja2V0MmQmIGEpCit7IHJldHVybiBfbW1fc2h1ZmZsZV9wZChhLGEsMHgxKTsgfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHByZXZlcnNlKGNvbnN0IFBhY2tldDRpJiBhKQoreyByZXR1cm4gX21tX3NodWZmbGVfZXBpMzIoYSwweDFCKTsgfQorCisKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwYWJzKGNvbnN0IFBhY2tldDRmJiBhKQoreworICBjb25zdCBQYWNrZXQ0ZiBtYXNrID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2V0cl9lcGkzMigweDdGRkZGRkZGLDB4N0ZGRkZGRkYsMHg3RkZGRkZGRiwweDdGRkZGRkZGKSk7CisgIHJldHVybiBfbW1fYW5kX3BzKGEsbWFzayk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0MmQgcGFicyhjb25zdCBQYWNrZXQyZCYgYSkKK3sKKyAgY29uc3QgUGFja2V0MmQgbWFzayA9IF9tbV9jYXN0c2kxMjhfcGQoX21tX3NldHJfZXBpMzIoMHhGRkZGRkZGRiwweDdGRkZGRkZGLDB4RkZGRkZGRkYsMHg3RkZGRkZGRikpOworICByZXR1cm4gX21tX2FuZF9wZChhLG1hc2spOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIHBhYnMoY29uc3QgUGFja2V0NGkmIGEpCit7CisgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NTRTMKKyAgcmV0dXJuIF9tbV9hYnNfZXBpMzIoYSk7CisgICNlbHNlCisgIFBhY2tldDRpIGF1eCA9IF9tbV9zcmFpX2VwaTMyKGEsMzEpOworICByZXR1cm4gX21tX3N1Yl9lcGkzMihfbW1feG9yX3NpMTI4KGEsYXV4KSxhdXgpOworICAjZW5kaWYKK30KKworRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHB1bnBhY2twKFBhY2tldDRmKiB2ZWNzKQoreworICB2ZWNzWzFdID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KHZlY3NbMF0pLCAweDU1KSk7CisgIHZlY3NbMl0gPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9zaHVmZmxlX2VwaTMyKF9tbV9jYXN0cHNfc2kxMjgodmVjc1swXSksIDB4QUEpKTsKKyAgdmVjc1szXSA9IF9tbV9jYXN0c2kxMjhfcHMoX21tX3NodWZmbGVfZXBpMzIoX21tX2Nhc3Rwc19zaTEyOCh2ZWNzWzBdKSwgMHhGRikpOworICB2ZWNzWzBdID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KHZlY3NbMF0pLCAweDAwKSk7Cit9CisKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworLy8gVE9ETyBpbXBsZW1lbnQgU1NFMiB2ZXJzaW9ucyBhcyB3ZWxsIGFzIGludGVnZXIgdmVyc2lvbnMKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQ0ZiBwcmVkdXhwPFBhY2tldDRmPihjb25zdCBQYWNrZXQ0ZiogdmVjcykKK3sKKyAgcmV0dXJuIF9tbV9oYWRkX3BzKF9tbV9oYWRkX3BzKHZlY3NbMF0sIHZlY3NbMV0pLF9tbV9oYWRkX3BzKHZlY3NbMl0sIHZlY3NbM10pKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBQYWNrZXQyZCBwcmVkdXhwPFBhY2tldDJkPihjb25zdCBQYWNrZXQyZCogdmVjcykKK3sKKyAgcmV0dXJuIF9tbV9oYWRkX3BkKHZlY3NbMF0sIHZlY3NbMV0pOworfQorLy8gU1NTRTMgdmVyc2lvbjoKKy8vIEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHJlZHV4cChjb25zdCBQYWNrZXQ0aSogdmVjcykKKy8vIHsKKy8vICAgcmV0dXJuIF9tbV9oYWRkX2VwaTMyKF9tbV9oYWRkX2VwaTMyKHZlY3NbMF0sIHZlY3NbMV0pLF9tbV9oYWRkX2VwaTMyKHZlY3NbMl0sIHZlY3NbM10pKTsKKy8vIH0KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpCit7CisgIFBhY2tldDRmIHRtcDAgPSBfbW1faGFkZF9wcyhhLGEpOworICByZXR1cm4gcGZpcnN0KF9tbV9oYWRkX3BzKHRtcDAsIHRtcDApKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGRvdWJsZSBwcmVkdXg8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKSB7IHJldHVybiBwZmlyc3QoX21tX2hhZGRfcGQoYSwgYSkpOyB9CisKKy8vIFNTU0UzIHZlcnNpb246CisvLyBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eChjb25zdCBQYWNrZXQ0aSYgYSkKKy8vIHsKKy8vICAgUGFja2V0NGkgdG1wMCA9IF9tbV9oYWRkX2VwaTMyKGEsYSk7CisvLyAgIHJldHVybiBwZmlyc3QoX21tX2hhZGRfZXBpMzIodG1wMCwgdG1wMCkpOworLy8gfQorI2Vsc2UKKy8vIFNTRTIgdmVyc2lvbnMKK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCBwcmVkdXg8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiB0bXAgPSBfbW1fYWRkX3BzKGEsIF9tbV9tb3ZlaGxfcHMoYSxhKSk7CisgIHJldHVybiBwZmlyc3QoX21tX2FkZF9zcyh0bXAsIF9tbV9zaHVmZmxlX3BzKHRtcCx0bXAsIDEpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpCit7CisgIHJldHVybiBwZmlyc3QoX21tX2FkZF9zZChhLCBfbW1fdW5wYWNraGlfcGQoYSxhKSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGYgcHJlZHV4cDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYqIHZlY3MpCit7CisgIFBhY2tldDRmIHRtcDAsIHRtcDEsIHRtcDI7CisgIHRtcDAgPSBfbW1fdW5wYWNrbG9fcHModmVjc1swXSwgdmVjc1sxXSk7CisgIHRtcDEgPSBfbW1fdW5wYWNraGlfcHModmVjc1swXSwgdmVjc1sxXSk7CisgIHRtcDIgPSBfbW1fdW5wYWNraGlfcHModmVjc1syXSwgdmVjc1szXSk7CisgIHRtcDAgPSBfbW1fYWRkX3BzKHRtcDAsIHRtcDEpOworICB0bXAxID0gX21tX3VucGFja2xvX3BzKHZlY3NbMl0sIHZlY3NbM10pOworICB0bXAxID0gX21tX2FkZF9wcyh0bXAxLCB0bXAyKTsKKyAgdG1wMiA9IF9tbV9tb3ZlaGxfcHModG1wMSwgdG1wMCk7CisgIHRtcDAgPSBfbW1fbW92ZWxoX3BzKHRtcDAsIHRtcDEpOworICByZXR1cm4gX21tX2FkZF9wcyh0bXAwLCB0bXAyKTsKK30KKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDJkIHByZWR1eHA8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkKiB2ZWNzKQoreworICByZXR1cm4gX21tX2FkZF9wZChfbW1fdW5wYWNrbG9fcGQodmVjc1swXSwgdmVjc1sxXSksIF9tbV91bnBhY2toaV9wZCh2ZWNzWzBdLCB2ZWNzWzFdKSk7Cit9CisjZW5kaWYgIC8vIFNTRTMKKwordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBwcmVkdXg8UGFja2V0NGk+KGNvbnN0IFBhY2tldDRpJiBhKQoreworICBQYWNrZXQ0aSB0bXAgPSBfbW1fYWRkX2VwaTMyKGEsIF9tbV91bnBhY2toaV9lcGk2NChhLGEpKTsKKyAgcmV0dXJuIHBmaXJzdCh0bXApICsgcGZpcnN0KF9tbV9zaHVmZmxlX2VwaTMyKHRtcCwgMSkpOworfQorCit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgUGFja2V0NGkgcHJlZHV4cDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkqIHZlY3MpCit7CisgIFBhY2tldDRpIHRtcDAsIHRtcDEsIHRtcDI7CisgIHRtcDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIodmVjc1swXSwgdmVjc1sxXSk7CisgIHRtcDEgPSBfbW1fdW5wYWNraGlfZXBpMzIodmVjc1swXSwgdmVjc1sxXSk7CisgIHRtcDIgPSBfbW1fdW5wYWNraGlfZXBpMzIodmVjc1syXSwgdmVjc1szXSk7CisgIHRtcDAgPSBfbW1fYWRkX2VwaTMyKHRtcDAsIHRtcDEpOworICB0bXAxID0gX21tX3VucGFja2xvX2VwaTMyKHZlY3NbMl0sIHZlY3NbM10pOworICB0bXAxID0gX21tX2FkZF9lcGkzMih0bXAxLCB0bXAyKTsKKyAgdG1wMiA9IF9tbV91bnBhY2tsb19lcGk2NCh0bXAwLCB0bXAxKTsKKyAgdG1wMCA9IF9tbV91bnBhY2toaV9lcGk2NCh0bXAwLCB0bXAxKTsKKyAgcmV0dXJuIF9tbV9hZGRfZXBpMzIodG1wMCwgdG1wMik7Cit9CisKKy8vIE90aGVyIHJlZHVjdGlvbiBmdW5jdGlvbnM6CisKKy8vIG11bAordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9tdWw8UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiB0bXAgPSBfbW1fbXVsX3BzKGEsIF9tbV9tb3ZlaGxfcHMoYSxhKSk7CisgIHJldHVybiBwZmlyc3QoX21tX211bF9zcyh0bXAsIF9tbV9zaHVmZmxlX3BzKHRtcCx0bXAsIDEpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eF9tdWw8UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKQoreworICByZXR1cm4gcGZpcnN0KF9tbV9tdWxfc2QoYSwgX21tX3VucGFja2hpX3BkKGEsYSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgcHJlZHV4X211bDxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIC8vIGFmdGVyIHNvbWUgZXhwZXJpbWVudHMsIGl0IGlzIHNlZW1zIHRoaXMgaXMgdGhlIGZhc3Rlc3Qgd2F5IHRvIGltcGxlbWVudCBpdAorICAvLyBmb3IgR0NDIChlZy4sIHJldXNpbmcgcG11bCBpcyB2ZXJ5IHNsb3cgISkKKyAgLy8gVE9ETyB0cnkgdG8gY2FsbCBfbW1fbXVsX2VwdTMyIGRpcmVjdGx5CisgIEVJR0VOX0FMSUdOMTYgaW50IGF1eFs0XTsKKyAgcHN0b3JlKGF1eCwgYSk7CisgIHJldHVybiAgKGF1eFswXSAqIGF1eFsxXSkgKiAoYXV4WzJdICogYXV4WzNdKTs7Cit9CisKKy8vIG1pbgordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IHByZWR1eF9taW48UGFja2V0NGY+KGNvbnN0IFBhY2tldDRmJiBhKQoreworICBQYWNrZXQ0ZiB0bXAgPSBfbW1fbWluX3BzKGEsIF9tbV9tb3ZlaGxfcHMoYSxhKSk7CisgIHJldHVybiBwZmlyc3QoX21tX21pbl9zcyh0bXAsIF9tbV9zaHVmZmxlX3BzKHRtcCx0bXAsIDEpKSk7Cit9Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIHByZWR1eF9taW48UGFja2V0MmQ+KGNvbnN0IFBhY2tldDJkJiBhKQoreworICByZXR1cm4gcGZpcnN0KF9tbV9taW5fc2QoYSwgX21tX3VucGFja2hpX3BkKGEsYSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBpbnQgcHJlZHV4X21pbjxQYWNrZXQ0aT4oY29uc3QgUGFja2V0NGkmIGEpCit7CisgIC8vIGFmdGVyIHNvbWUgZXhwZXJpbWVudHMsIGl0IGlzIHNlZW1zIHRoaXMgaXMgdGhlIGZhc3Rlc3Qgd2F5IHRvIGltcGxlbWVudCBpdAorICAvLyBmb3IgR0NDIChlZy4sIGl0IGRvZXMgbm90IGxpa2UgdXNpbmcgc3RkOjptaW4gYWZ0ZXIgdGhlIHBzdG9yZSAhISkKKyAgRUlHRU5fQUxJR04xNiBpbnQgYXV4WzRdOworICBwc3RvcmUoYXV4LCBhKTsKKyAgcmVnaXN0ZXIgaW50IGF1eDAgPSBhdXhbMF08YXV4WzFdID8gYXV4WzBdIDogYXV4WzFdOworICByZWdpc3RlciBpbnQgYXV4MiA9IGF1eFsyXTxhdXhbM10gPyBhdXhbMl0gOiBhdXhbM107CisgIHJldHVybiBhdXgwPGF1eDIgPyBhdXgwIDogYXV4MjsKK30KKworLy8gbWF4Cit0ZW1wbGF0ZTw+IEVJR0VOX1NUUk9OR19JTkxJTkUgZmxvYXQgcHJlZHV4X21heDxQYWNrZXQ0Zj4oY29uc3QgUGFja2V0NGYmIGEpCit7CisgIFBhY2tldDRmIHRtcCA9IF9tbV9tYXhfcHMoYSwgX21tX21vdmVobF9wcyhhLGEpKTsKKyAgcmV0dXJuIHBmaXJzdChfbW1fbWF4X3NzKHRtcCwgX21tX3NodWZmbGVfcHModG1wLHRtcCwgMSkpKTsKK30KK3RlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgcHJlZHV4X21heDxQYWNrZXQyZD4oY29uc3QgUGFja2V0MmQmIGEpCit7CisgIHJldHVybiBwZmlyc3QoX21tX21heF9zZChhLCBfbW1fdW5wYWNraGlfcGQoYSxhKSkpOworfQordGVtcGxhdGU8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIGludCBwcmVkdXhfbWF4PFBhY2tldDRpPihjb25zdCBQYWNrZXQ0aSYgYSkKK3sKKyAgLy8gYWZ0ZXIgc29tZSBleHBlcmltZW50cywgaXQgaXMgc2VlbXMgdGhpcyBpcyB0aGUgZmFzdGVzdCB3YXkgdG8gaW1wbGVtZW50IGl0CisgIC8vIGZvciBHQ0MgKGVnLiwgaXQgZG9lcyBub3QgbGlrZSB1c2luZyBzdGQ6Om1pbiBhZnRlciB0aGUgcHN0b3JlICEhKQorICBFSUdFTl9BTElHTjE2IGludCBhdXhbNF07CisgIHBzdG9yZShhdXgsIGEpOworICByZWdpc3RlciBpbnQgYXV4MCA9IGF1eFswXT5hdXhbMV0gPyBhdXhbMF0gOiBhdXhbMV07CisgIHJlZ2lzdGVyIGludCBhdXgyID0gYXV4WzJdPmF1eFszXSA/IGF1eFsyXSA6IGF1eFszXTsKKyAgcmV0dXJuIGF1eDA+YXV4MiA/IGF1eDAgOiBhdXgyOworfQorCisjaWYgKGRlZmluZWQgX19HTlVDX18pCisvLyB0ZW1wbGF0ZSA8PiBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRmIHBtYWRkKGNvbnN0IFBhY2tldDRmJiAgYSwgY29uc3QgUGFja2V0NGYmICBiLCBjb25zdCBQYWNrZXQ0ZiYgIGMpCisvLyB7CisvLyAgIFBhY2tldDRmIHJlcyA9IGI7CisvLyAgIGFzbSgibXVscHMgJVthXSwgJVtiXSBcblx0YWRkcHMgJVtjXSwgJVtiXSIgOiBbYl0gIit4IiAocmVzKSA6IFthXSAieCIgKGEpLCBbY10gIngiIChjKSk7CisvLyAgIHJldHVybiByZXM7CisvLyB9CisvLyBFSUdFTl9TVFJPTkdfSU5MSU5FIFBhY2tldDRpIF9tbV9hbGlnbnJfZXBpOChjb25zdCBQYWNrZXQ0aSYgIGEsIGNvbnN0IFBhY2tldDRpJiAgYiwgY29uc3QgaW50IGkpCisvLyB7CisvLyAgIFBhY2tldDRpIHJlcyA9IGE7CisvLyAgIGFzbSgicGFsaWduciAlW2ldLCAlW2FdLCAlW2JdICIgOiBbYl0gIit4IiAocmVzKSA6IFthXSAieCIgKGEpLCBbaV0gImkiIChpKSk7CisvLyAgIHJldHVybiByZXM7CisvLyB9CisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU1NFMworLy8gU1NTRTMgdmVyc2lvbnMKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDRmPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQ0ZiYgZmlyc3QsIGNvbnN0IFBhY2tldDRmJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0IT0wKQorICAgICAgZmlyc3QgPSBfbW1fY2FzdHNpMTI4X3BzKF9tbV9hbGlnbnJfZXBpOChfbW1fY2FzdHBzX3NpMTI4KHNlY29uZCksIF9tbV9jYXN0cHNfc2kxMjgoZmlyc3QpLCBPZmZzZXQqNCkpOworICB9Cit9OworCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQ0aT4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0NGkmIGZpcnN0LCBjb25zdCBQYWNrZXQ0aSYgc2Vjb25kKQorICB7CisgICAgaWYgKE9mZnNldCE9MCkKKyAgICAgIGZpcnN0ID0gX21tX2FsaWducl9lcGk4KHNlY29uZCxmaXJzdCwgT2Zmc2V0KjQpOworICB9Cit9OworCit0ZW1wbGF0ZTxpbnQgT2Zmc2V0Pgorc3RydWN0IHBhbGlnbl9pbXBsPE9mZnNldCxQYWNrZXQyZD4KK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oUGFja2V0MmQmIGZpcnN0LCBjb25zdCBQYWNrZXQyZCYgc2Vjb25kKQorICB7CisgICAgaWYgKE9mZnNldD09MSkKKyAgICAgIGZpcnN0ID0gX21tX2Nhc3RzaTEyOF9wZChfbW1fYWxpZ25yX2VwaTgoX21tX2Nhc3RwZF9zaTEyOChzZWNvbmQpLCBfbW1fY2FzdHBkX3NpMTI4KGZpcnN0KSwgOCkpOworICB9Cit9OworI2Vsc2UKKy8vIFNTRTIgdmVyc2lvbnMKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDRmPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQ0ZiYgZmlyc3QsIGNvbnN0IFBhY2tldDRmJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0PT0xKQorICAgIHsKKyAgICAgIGZpcnN0ID0gX21tX21vdmVfc3MoZmlyc3Qsc2Vjb25kKTsKKyAgICAgIGZpcnN0ID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY2FzdHBzX3NpMTI4KGZpcnN0KSwweDM5KSk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09MikKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbV9tb3ZlaGxfcHMoZmlyc3QsZmlyc3QpOworICAgICAgZmlyc3QgPSBfbW1fbW92ZWxoX3BzKGZpcnN0LHNlY29uZCk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09MykKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbV9tb3ZlX3NzKGZpcnN0LHNlY29uZCk7CisgICAgICBmaXJzdCA9IF9tbV9zaHVmZmxlX3BzKGZpcnN0LHNlY29uZCwweDkzKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDRpPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQ0aSYgZmlyc3QsIGNvbnN0IFBhY2tldDRpJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0PT0xKQorICAgIHsKKyAgICAgIGZpcnN0ID0gX21tX2Nhc3Rwc19zaTEyOChfbW1fbW92ZV9zcyhfbW1fY2FzdHNpMTI4X3BzKGZpcnN0KSxfbW1fY2FzdHNpMTI4X3BzKHNlY29uZCkpKTsKKyAgICAgIGZpcnN0ID0gX21tX3NodWZmbGVfZXBpMzIoZmlyc3QsMHgzOSk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09MikKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbV9jYXN0cHNfc2kxMjgoX21tX21vdmVobF9wcyhfbW1fY2FzdHNpMTI4X3BzKGZpcnN0KSxfbW1fY2FzdHNpMTI4X3BzKGZpcnN0KSkpOworICAgICAgZmlyc3QgPSBfbW1fY2FzdHBzX3NpMTI4KF9tbV9tb3ZlbGhfcHMoX21tX2Nhc3RzaTEyOF9wcyhmaXJzdCksX21tX2Nhc3RzaTEyOF9wcyhzZWNvbmQpKSk7CisgICAgfQorICAgIGVsc2UgaWYgKE9mZnNldD09MykKKyAgICB7CisgICAgICBmaXJzdCA9IF9tbV9jYXN0cHNfc2kxMjgoX21tX21vdmVfc3MoX21tX2Nhc3RzaTEyOF9wcyhmaXJzdCksX21tX2Nhc3RzaTEyOF9wcyhzZWNvbmQpKSk7CisgICAgICBmaXJzdCA9IF9tbV9jYXN0cHNfc2kxMjgoX21tX3NodWZmbGVfcHMoX21tX2Nhc3RzaTEyOF9wcyhmaXJzdCksX21tX2Nhc3RzaTEyOF9wcyhzZWNvbmQpLDB4OTMpKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPGludCBPZmZzZXQ+CitzdHJ1Y3QgcGFsaWduX2ltcGw8T2Zmc2V0LFBhY2tldDJkPgoreworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihQYWNrZXQyZCYgZmlyc3QsIGNvbnN0IFBhY2tldDJkJiBzZWNvbmQpCisgIHsKKyAgICBpZiAoT2Zmc2V0PT0xKQorICAgIHsKKyAgICAgIGZpcnN0ID0gX21tX2Nhc3Rwc19wZChfbW1fbW92ZWhsX3BzKF9tbV9jYXN0cGRfcHMoZmlyc3QpLF9tbV9jYXN0cGRfcHMoZmlyc3QpKSk7CisgICAgICBmaXJzdCA9IF9tbV9jYXN0cHNfcGQoX21tX21vdmVsaF9wcyhfbW1fY2FzdHBkX3BzKGZpcnN0KSxfbW1fY2FzdHBkX3BzKHNlY29uZCkpKTsKKyAgICB9CisgIH0KK307CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUEFDS0VUX01BVEhfU1NFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL0NNYWtlTGlzdHMudHh0IGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmYzk0YQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX0NvcmVfUHJvZHVjdF9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fQ29yZV9Qcm9kdWN0X1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL0NvZWZmQmFzZWRQcm9kdWN0LmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Db2VmZkJhc2VkUHJvZHVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwM2QyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Db2VmZkJhc2VkUHJvZHVjdC5oCkBAIC0wLDAgKzEsNDQxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPRUZGQkFTRURfUFJPRFVDVF9ICisjZGVmaW5lIEVJR0VOX0NPRUZGQkFTRURfUFJPRFVDVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBDb2VmZmljaWVudCBiYXNlZCBwcm9kdWN0IGltcGxlbWVudGF0aW9uLgorKiAgSXQgaXMgZGVzaWduZWQgZm9yIHRoZSBmb2xsb3dpbmcgdXNlIGNhc2VzOgorKiAgLSBzbWFsbCBmaXhlZCBzaXplcworKiAgLSBsYXp5IHByb2R1Y3RzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNpbmNlIHRoZSBhbGwgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHByb2R1Y3QgYXJlIHNtYWxsLCBoZXJlIHdlIGNhbiByZWx5CisgKiBvbiB0aGUgZ2VuZXJpYyBBc3NpZ24gbWVjaGFuaXNtIHRvIGV2YWx1YXRlIHRoZSBwcm9kdWN0IHBlciBjb2VmZiAob3IgcGFja2V0KS4KKyAqCisgKiBOb3RlIHRoYXQgaGVyZSB0aGUgaW5uZXItbG9vcHMgc2hvdWxkIGFsd2F5cyBiZSB1bnJvbGxlZC4KKyAqLworCit0ZW1wbGF0ZTxpbnQgVHJhdmVyc2FsLCBpbnQgVW5yb2xsaW5nSW5kZXgsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXRTY2FsYXI+CitzdHJ1Y3QgcHJvZHVjdF9jb2VmZl9pbXBsOworCit0ZW1wbGF0ZTxpbnQgU3RvcmFnZU9yZGVyLCBpbnQgVW5yb2xsaW5nSW5kZXgsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBQYWNrZXQsIGludCBMb2FkTW9kZT4KK3N0cnVjdCBwcm9kdWN0X3BhY2tldF9pbXBsOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNOZXN0ZWQsIHR5cGVuYW1lIFJoc05lc3RlZCwgaW50IE5lc3RpbmdGbGFncz4KK3N0cnVjdCB0cmFpdHM8Q29lZmZCYXNlZFByb2R1Y3Q8TGhzTmVzdGVkLFJoc05lc3RlZCxOZXN0aW5nRmxhZ3M+ID4KK3sKKyAgdHlwZWRlZiBNYXRyaXhYcHIgWHByS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPExoc05lc3RlZD46OnR5cGUgX0xoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPFJoc05lc3RlZD46OnR5cGUgX1Joc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzY2FsYXJfcHJvZHVjdF90cmFpdHM8dHlwZW5hbWUgX0xoc05lc3RlZDo6U2NhbGFyLCB0eXBlbmFtZSBfUmhzTmVzdGVkOjpTY2FsYXI+OjpSZXR1cm5UeXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX3N0b3JhZ2VfdHlwZTx0eXBlbmFtZSB0cmFpdHM8X0xoc05lc3RlZD46OlN0b3JhZ2VLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxfUmhzTmVzdGVkPjo6U3RvcmFnZUtpbmQ+OjpyZXQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcHJvbW90ZV9pbmRleF90eXBlPHR5cGVuYW1lIHRyYWl0czxfTGhzTmVzdGVkPjo6SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxfUmhzTmVzdGVkPjo6SW5kZXg+Ojp0eXBlIEluZGV4OworCisgIGVudW0geworICAgICAgTGhzQ29lZmZSZWFkQ29zdCA9IF9MaHNOZXN0ZWQ6OkNvZWZmUmVhZENvc3QsCisgICAgICBSaHNDb2VmZlJlYWRDb3N0ID0gX1Joc05lc3RlZDo6Q29lZmZSZWFkQ29zdCwKKyAgICAgIExoc0ZsYWdzID0gX0xoc05lc3RlZDo6RmxhZ3MsCisgICAgICBSaHNGbGFncyA9IF9SaHNOZXN0ZWQ6OkZsYWdzLAorCisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IF9MaHNOZXN0ZWQ6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBfUmhzTmVzdGVkOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIElubmVyU2l6ZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChfTGhzTmVzdGVkOjpDb2xzQXRDb21waWxlVGltZSwgX1Joc05lc3RlZDo6Um93c0F0Q29tcGlsZVRpbWUpLAorCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IF9MaHNOZXN0ZWQ6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBfUmhzTmVzdGVkOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKworICAgICAgTGhzUm93TWFqb3IgPSBMaHNGbGFncyAmIFJvd01ham9yQml0LAorICAgICAgUmhzUm93TWFqb3IgPSBSaHNGbGFncyAmIFJvd01ham9yQml0LAorCisgICAgICBTYW1lVHlwZSA9IGlzX3NhbWU8dHlwZW5hbWUgX0xoc05lc3RlZDo6U2NhbGFyLHR5cGVuYW1lIF9SaHNOZXN0ZWQ6OlNjYWxhcj46OnZhbHVlLAorCisgICAgICBDYW5WZWN0b3JpemVSaHMgPSBSaHNSb3dNYWpvciAmJiAoUmhzRmxhZ3MgJiBQYWNrZXRBY2Nlc3NCaXQpCisgICAgICAgICAgICAgICAgICAgICAgJiYgKENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCAoQ29sc0F0Q29tcGlsZVRpbWUgJSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUpID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChSaHNGbGFncyZBbGlnbmVkQml0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgKSwKKworICAgICAgQ2FuVmVjdG9yaXplTGhzID0gKCFMaHNSb3dNYWpvcikgJiYgKExoc0ZsYWdzICYgUGFja2V0QWNjZXNzQml0KQorICAgICAgICAgICAgICAgICAgICAgICYmIChSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICggKFJvd3NBdENvbXBpbGVUaW1lICUgcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplKSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoTGhzRmxhZ3MmQWxpZ25lZEJpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICksCisKKyAgICAgIEV2YWxUb1Jvd01ham9yID0gKE1heFJvd3NBdENvbXBpbGVUaW1lPT0xJiZNYXhDb2xzQXRDb21waWxlVGltZSE9MSkgPyAxCisgICAgICAgICAgICAgICAgICAgICA6IChNYXhDb2xzQXRDb21waWxlVGltZT09MSYmTWF4Um93c0F0Q29tcGlsZVRpbWUhPTEpID8gMAorICAgICAgICAgICAgICAgICAgICAgOiAoUmhzUm93TWFqb3IgJiYgIUNhblZlY3Rvcml6ZUxocyksCisKKyAgICAgIEZsYWdzID0gKCh1bnNpZ25lZCBpbnQpKExoc0ZsYWdzIHwgUmhzRmxhZ3MpICYgSGVyZWRpdGFyeUJpdHMgJiB+Um93TWFqb3JCaXQpCisgICAgICAgICAgICB8IChFdmFsVG9Sb3dNYWpvciA/IFJvd01ham9yQml0IDogMCkKKyAgICAgICAgICAgIHwgTmVzdGluZ0ZsYWdzCisgICAgICAgICAgICB8IChMaHNGbGFncyAmIFJoc0ZsYWdzICYgQWxpZ25lZEJpdCkKKyAgICAgICAgICAgIC8vIFRPRE8gZW5hYmxlIHZlY3Rvcml6YXRpb24gZm9yIG1peGVkIHR5cGVzCisgICAgICAgICAgICB8IChTYW1lVHlwZSAmJiAoQ2FuVmVjdG9yaXplTGhzIHx8IENhblZlY3Rvcml6ZVJocykgPyBQYWNrZXRBY2Nlc3NCaXQgOiAwKSwKKworICAgICAgQ29lZmZSZWFkQ29zdCA9IElubmVyU2l6ZSA9PSBEeW5hbWljID8gRHluYW1pYworICAgICAgICAgICAgICAgICAgICA6IElubmVyU2l6ZSAqIChOdW1UcmFpdHM8U2NhbGFyPjo6TXVsQ29zdCArIExoc0NvZWZmUmVhZENvc3QgKyBSaHNDb2VmZlJlYWRDb3N0KQorICAgICAgICAgICAgICAgICAgICAgICsgKElubmVyU2l6ZSAtIDEpICogTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QsCisKKyAgICAgIC8qIENhblZlY3Rvcml6ZUlubmVyIGRlc2VydmVzIHNwZWNpYWwgZXhwbGFuYXRpb24uIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgcHJvZHVjdCBmbGFncy4gSXQgaXMgbm90IHVzZWQgb3V0c2lkZQorICAgICAgKiBvZiBQcm9kdWN0LiBJZiB0aGUgUHJvZHVjdCBpdHNlbGYgaXMgbm90IGEgcGFja2V0LWFjY2VzcyBleHByZXNzaW9uLCB0aGVyZSBpcyBzdGlsbCBhIGNoYW5jZSB0aGF0IHRoZSBpbm5lcgorICAgICAgKiBsb29wIG9mIHRoZSBwcm9kdWN0IG1pZ2h0IGJlIHZlY3Rvcml6ZWQuIFRoaXMgaXMgdGhlIG1lYW5pbmcgb2YgQ2FuVmVjdG9yaXplSW5uZXIuIFNpbmNlIGl0IGRvZXNuJ3QgYWZmZWN0CisgICAgICAqIHRoZSBGbGFncywgaXQgaXMgc2FmZSB0byBtYWtlIHRoaXMgdmFsdWUgZGVwZW5kIG9uIEFjdHVhbFBhY2tldEFjY2Vzc0JpdCwgdGhhdCBkb2Vzbid0IGFmZmVjdCB0aGUgQUJJLgorICAgICAgKi8KKyAgICAgIENhblZlY3Rvcml6ZUlubmVyID0gICAgU2FtZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgTGhzUm93TWFqb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFSaHNSb3dNYWpvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKExoc0ZsYWdzICYgUmhzRmxhZ3MgJiBBY3R1YWxQYWNrZXRBY2Nlc3NCaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChMaHNGbGFncyAmIFJoc0ZsYWdzICYgQWxpZ25lZEJpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKElubmVyU2l6ZSAlIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSA9PSAwKQorICAgIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzTmVzdGVkLCB0eXBlbmFtZSBSaHNOZXN0ZWQsIGludCBOZXN0aW5nRmxhZ3M+CitjbGFzcyBDb2VmZkJhc2VkUHJvZHVjdAorICA6IGludGVybmFsOjpub19hc3NpZ25tZW50X29wZXJhdG9yLAorICAgIHB1YmxpYyBNYXRyaXhCYXNlPENvZWZmQmFzZWRQcm9kdWN0PExoc05lc3RlZCwgUmhzTmVzdGVkLCBOZXN0aW5nRmxhZ3M+ID4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBNYXRyaXhCYXNlPENvZWZmQmFzZWRQcm9kdWN0PiBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoQ29lZmZCYXNlZFByb2R1Y3QpCisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKworICBwcml2YXRlOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPENvZWZmQmFzZWRQcm9kdWN0Pjo6X0xoc05lc3RlZCBfTGhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxDb2VmZkJhc2VkUHJvZHVjdD46Ol9SaHNOZXN0ZWQgX1Joc05lc3RlZDsKKworICAgIGVudW0geworICAgICAgUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUsCisgICAgICBJbm5lclNpemUgID0gaW50ZXJuYWw6OnRyYWl0czxDb2VmZkJhc2VkUHJvZHVjdD46OklubmVyU2l6ZSwKKyAgICAgIFVucm9sbCA9IENvZWZmUmVhZENvc3QgIT0gRHluYW1pYyAmJiBDb2VmZlJlYWRDb3N0IDw9IEVJR0VOX1VOUk9MTElOR19MSU1JVCwKKyAgICAgIENhblZlY3Rvcml6ZUlubmVyID0gaW50ZXJuYWw6OnRyYWl0czxDb2VmZkJhc2VkUHJvZHVjdD46OkNhblZlY3Rvcml6ZUlubmVyCisgICAgfTsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnByb2R1Y3RfY29lZmZfaW1wbDxDYW5WZWN0b3JpemVJbm5lciA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCA6IERlZmF1bHRUcmF2ZXJzYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucm9sbCA/IElubmVyU2l6ZS0xIDogRHluYW1pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xoc05lc3RlZCwgX1Joc05lc3RlZCwgU2NhbGFyPiBTY2FsYXJDb2VmZkltcGw7CisKKyAgICB0eXBlZGVmIENvZWZmQmFzZWRQcm9kdWN0PExoc05lc3RlZCxSaHNOZXN0ZWQsTmVzdEJ5UmVmQml0PiBMYXp5Q29lZmZCYXNlZFByb2R1Y3RUeXBlOworCisgIHB1YmxpYzoKKworICAgIGlubGluZSBDb2VmZkJhc2VkUHJvZHVjdChjb25zdCBDb2VmZkJhc2VkUHJvZHVjdCYgb3RoZXIpCisgICAgICA6IEJhc2UoKSwgbV9saHMob3RoZXIubV9saHMpLCBtX3JocyhvdGhlci5tX3JocykKKyAgICB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIENvZWZmQmFzZWRQcm9kdWN0KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgICAgIDogbV9saHMobGhzKSwgbV9yaHMocmhzKQorICAgIHsKKyAgICAgIC8vIHdlIGRvbid0IGFsbG93IHRha2luZyBwcm9kdWN0cyBvZiBtYXRyaWNlcyBvZiBkaWZmZXJlbnQgcmVhbCB0eXBlcywgYXMgdGhhdCB3b3VsZG4ndCBiZSB2ZWN0b3JpemFibGUuCisgICAgICAvLyBXZSBzdGlsbCBhbGxvdyB0byBtaXggVCBhbmQgY29tcGxleDxUPi4KKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIExoczo6UmVhbFNjYWxhciwgdHlwZW5hbWUgUmhzOjpSZWFsU2NhbGFyPjo6dmFsdWUpLAorICAgICAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKyAgICAgIGVpZ2VuX2Fzc2VydChsaHMuY29scygpID09IHJocy5yb3dzKCkKKyAgICAgICAgJiYgImludmFsaWQgbWF0cml4IHByb2R1Y3QiCisgICAgICAgICYmICJpZiB5b3Ugd2FudGVkIGEgY29lZmYtd2lzZSBvciBhIGRvdCBwcm9kdWN0IHVzZSB0aGUgcmVzcGVjdGl2ZSBleHBsaWNpdCBmdW5jdGlvbnMiKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2xocy5yb3dzKCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3Jocy5jb2xzKCk7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIFNjYWxhciByZXM7CisgICAgICBTY2FsYXJDb2VmZkltcGw6OnJ1bihyb3csIGNvbCwgbV9saHMsIG1fcmhzLCByZXMpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKiBBbGxvdyBpbmRleC1iYXNlZCBub24tcGFja2V0IGFjY2Vzcy4gSXQgaXMgaW1wb3NzaWJsZSB0aG91Z2ggdG8gYWxsb3cgaW5kZXgtYmFzZWQgcGFja2VkIGFjY2VzcywKKyAgICAgKiB3aGljaCBpcyB3aHkgd2UgZG9uJ3Qgc2V0IHRoZSBMaW5lYXJBY2Nlc3NCaXQuCisgICAgICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXIgY29lZmYoSW5kZXggaW5kZXgpIGNvbnN0CisgICAgeworICAgICAgU2NhbGFyIHJlczsKKyAgICAgIGNvbnN0IEluZGV4IHJvdyA9IFJvd3NBdENvbXBpbGVUaW1lID09IDEgPyAwIDogaW5kZXg7CisgICAgICBjb25zdCBJbmRleCBjb2wgPSBSb3dzQXRDb21waWxlVGltZSA9PSAxID8gaW5kZXggOiAwOworICAgICAgU2NhbGFyQ29lZmZJbXBsOjpydW4ocm93LCBjb2wsIG1fbGhzLCBtX3JocywgcmVzKTsKKyAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgUGFja2V0U2NhbGFyIHBhY2tldChJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBQYWNrZXRTY2FsYXIgcmVzOworICAgICAgaW50ZXJuYWw6OnByb2R1Y3RfcGFja2V0X2ltcGw8RmxhZ3MmUm93TWFqb3JCaXQgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yb2xsID8gSW5uZXJTaXplLTEgOiBEeW5hbWljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xoc05lc3RlZCwgX1Joc05lc3RlZCwgUGFja2V0U2NhbGFyLCBMb2FkTW9kZT4KKyAgICAgICAgOjpydW4ocm93LCBjb2wsIG1fbGhzLCBtX3JocywgcmVzKTsKKyAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gSW1wbGljaXQgY29udmVyc2lvbiB0byB0aGUgbmVzdGVkIHR5cGUgKHRyaWdnZXIgdGhlIGV2YWx1YXRpb24gb2YgdGhlIHByb2R1Y3QpCisgICAgRUlHRU5fU1RST05HX0lOTElORSBvcGVyYXRvciBjb25zdCBQbGFpbk9iamVjdCYgKCkgY29uc3QKKyAgICB7CisgICAgICBtX3Jlc3VsdC5sYXp5QXNzaWduKCp0aGlzKTsKKyAgICAgIHJldHVybiBtX3Jlc3VsdDsKKyAgICB9CisKKyAgICBjb25zdCBfTGhzTmVzdGVkJiBsaHMoKSBjb25zdCB7IHJldHVybiBtX2xoczsgfQorICAgIGNvbnN0IF9SaHNOZXN0ZWQmIHJocygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzOyB9CisKKyAgICBjb25zdCBEaWFnb25hbDxjb25zdCBMYXp5Q29lZmZCYXNlZFByb2R1Y3RUeXBlLDA+IGRpYWdvbmFsKCkgY29uc3QKKyAgICB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IExhenlDb2VmZkJhc2VkUHJvZHVjdFR5cGUmPigqdGhpcyk7IH0KKworICAgIHRlbXBsYXRlPGludCBEaWFnb25hbEluZGV4PgorICAgIGNvbnN0IERpYWdvbmFsPGNvbnN0IExhenlDb2VmZkJhc2VkUHJvZHVjdFR5cGUsRGlhZ29uYWxJbmRleD4gZGlhZ29uYWwoKSBjb25zdAorICAgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTGF6eUNvZWZmQmFzZWRQcm9kdWN0VHlwZSY+KCp0aGlzKTsgfQorCisgICAgY29uc3QgRGlhZ29uYWw8Y29uc3QgTGF6eUNvZWZmQmFzZWRQcm9kdWN0VHlwZSxEeW5hbWljPiBkaWFnb25hbChJbmRleCBpbmRleCkgY29uc3QKKyAgICB7IHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IExhenlDb2VmZkJhc2VkUHJvZHVjdFR5cGUmPigqdGhpcykuZGlhZ29uYWwoaW5kZXgpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxMaHNOZXN0ZWQ+Ojp0eXBlIG1fbGhzOworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxSaHNOZXN0ZWQ+Ojp0eXBlIG1fcmhzOworCisgICAgbXV0YWJsZSBQbGFpbk9iamVjdCBtX3Jlc3VsdDsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIGhlcmUgd2UgbmVlZCB0byBvdmVybG9hZCB0aGUgbmVzdGVkIHJ1bGUgZm9yIHByb2R1Y3RzCisvLyBzdWNoIHRoYXQgdGhlIG5lc3RlZCB0eXBlIGlzIGEgY29uc3QgcmVmZXJlbmNlIHRvIGEgcGxhaW4gbWF0cml4Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE4sIHR5cGVuYW1lIFBsYWluT2JqZWN0Pgorc3RydWN0IG5lc3RlZDxDb2VmZkJhc2VkUHJvZHVjdDxMaHMsUmhzLEV2YWxCZWZvcmVOZXN0aW5nQml0fEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQ+LCBOLCBQbGFpbk9iamVjdD4KK3sKKyAgdHlwZWRlZiBQbGFpbk9iamVjdCBjb25zdCYgdHlwZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTm9ybWFsIHByb2R1Y3QgLmNvZWZmKCkgaW1wbGVtZW50YXRpb24gKHdpdGggbWV0YS11bnJvbGxpbmcpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNjYWxhciBwYXRoICAtIG5vIHZlY3Rvcml6YXRpb24gKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8aW50IFVucm9sbGluZ0luZGV4LCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmV0U2NhbGFyPgorc3RydWN0IHByb2R1Y3RfY29lZmZfaW1wbDxEZWZhdWx0VHJhdmVyc2FsLCBVbnJvbGxpbmdJbmRleCwgTGhzLCBSaHMsIFJldFNjYWxhcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXRTY2FsYXIgJnJlcykKKyAgeworICAgIHByb2R1Y3RfY29lZmZfaW1wbDxEZWZhdWx0VHJhdmVyc2FsLCBVbnJvbGxpbmdJbmRleC0xLCBMaHMsIFJocywgUmV0U2NhbGFyPjo6cnVuKHJvdywgY29sLCBsaHMsIHJocywgcmVzKTsKKyAgICByZXMgKz0gbGhzLmNvZWZmKHJvdywgVW5yb2xsaW5nSW5kZXgpICogcmhzLmNvZWZmKFVucm9sbGluZ0luZGV4LCBjb2wpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmV0U2NhbGFyPgorc3RydWN0IHByb2R1Y3RfY29lZmZfaW1wbDxEZWZhdWx0VHJhdmVyc2FsLCAwLCBMaHMsIFJocywgUmV0U2NhbGFyPgoreworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJldFNjYWxhciAmcmVzKQorICB7CisgICAgcmVzID0gbGhzLmNvZWZmKHJvdywgMCkgKiByaHMuY29lZmYoMCwgY29sKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJldFNjYWxhcj4KK3N0cnVjdCBwcm9kdWN0X2NvZWZmX2ltcGw8RGVmYXVsdFRyYXZlcnNhbCwgRHluYW1pYywgTGhzLCBSaHMsIFJldFNjYWxhcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXRTY2FsYXImIHJlcykKKyAgeworICAgIGVpZ2VuX2Fzc2VydChsaHMuY29scygpPjAgJiYgInlvdSBhcmUgdXNpbmcgYSBub24gaW5pdGlhbGl6ZWQgbWF0cml4Iik7CisgICAgcmVzID0gbGhzLmNvZWZmKHJvdywgMCkgKiByaHMuY29lZmYoMCwgY29sKTsKKyAgICAgIGZvcihJbmRleCBpID0gMTsgaSA8IGxocy5jb2xzKCk7ICsraSkKKyAgICAgICAgcmVzICs9IGxocy5jb2VmZihyb3csIGkpICogcmhzLmNvZWZmKGksIGNvbCk7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2NhbGFyIHBhdGggd2l0aCBpbm5lciB2ZWN0b3JpemF0aW9uICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8aW50IFVucm9sbGluZ0luZGV4LCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUGFja2V0Pgorc3RydWN0IHByb2R1Y3RfY29lZmZfdmVjdG9yaXplZF91bnJvbGxlcgoreworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisgIGVudW0geyBQYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czx0eXBlbmFtZSBMaHM6OlNjYWxhcj46OnNpemUgfTsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgdHlwZW5hbWUgTGhzOjpQYWNrZXRTY2FsYXIgJnByZXMpCisgIHsKKyAgICBwcm9kdWN0X2NvZWZmX3ZlY3Rvcml6ZWRfdW5yb2xsZXI8VW5yb2xsaW5nSW5kZXgtUGFja2V0U2l6ZSwgTGhzLCBSaHMsIFBhY2tldD46OnJ1bihyb3csIGNvbCwgbGhzLCByaHMsIHByZXMpOworICAgIHByZXMgPSBwYWRkKHByZXMsIHBtdWwoIGxocy50ZW1wbGF0ZSBwYWNrZXQ8QWxpZ25lZD4ocm93LCBVbnJvbGxpbmdJbmRleCkgLCByaHMudGVtcGxhdGUgcGFja2V0PEFsaWduZWQ+KFVucm9sbGluZ0luZGV4LCBjb2wpICkpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUGFja2V0Pgorc3RydWN0IHByb2R1Y3RfY29lZmZfdmVjdG9yaXplZF91bnJvbGxlcjwwLCBMaHMsIFJocywgUGFja2V0PgoreworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIHR5cGVuYW1lIExoczo6UGFja2V0U2NhbGFyICZwcmVzKQorICB7CisgICAgcHJlcyA9IHBtdWwobGhzLnRlbXBsYXRlIHBhY2tldDxBbGlnbmVkPihyb3csIDApICwgcmhzLnRlbXBsYXRlIHBhY2tldDxBbGlnbmVkPigwLCBjb2wpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8aW50IFVucm9sbGluZ0luZGV4LCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmV0U2NhbGFyPgorc3RydWN0IHByb2R1Y3RfY29lZmZfaW1wbDxJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIFVucm9sbGluZ0luZGV4LCBMaHMsIFJocywgUmV0U2NhbGFyPgoreworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6UGFja2V0U2NhbGFyIFBhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBlbnVtIHsgUGFja2V0U2l6ZSA9IHBhY2tldF90cmFpdHM8dHlwZW5hbWUgTGhzOjpTY2FsYXI+OjpzaXplIH07CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJldFNjYWxhciAmcmVzKQorICB7CisgICAgUGFja2V0IHByZXM7CisgICAgcHJvZHVjdF9jb2VmZl92ZWN0b3JpemVkX3Vucm9sbGVyPFVucm9sbGluZ0luZGV4KzEtUGFja2V0U2l6ZSwgTGhzLCBSaHMsIFBhY2tldD46OnJ1bihyb3csIGNvbCwgbGhzLCByaHMsIHByZXMpOworICAgIHByb2R1Y3RfY29lZmZfaW1wbDxEZWZhdWx0VHJhdmVyc2FsLFVucm9sbGluZ0luZGV4LExocyxSaHMsUmV0U2NhbGFyPjo6cnVuKHJvdywgY29sLCBsaHMsIHJocywgcmVzKTsKKyAgICByZXMgPSBwcmVkdXgocHJlcyk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTGhzUm93cyA9IExoczo6Um93c0F0Q29tcGlsZVRpbWUsIGludCBSaHNDb2xzID0gUmhzOjpDb2xzQXRDb21waWxlVGltZT4KK3N0cnVjdCBwcm9kdWN0X2NvZWZmX3ZlY3Rvcml6ZWRfZHluX3NlbGVjdG9yCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgdHlwZW5hbWUgTGhzOjpTY2FsYXIgJnJlcykKKyAgeworICAgIHJlcyA9IGxocy5yb3cocm93KS50cmFuc3Bvc2UoKS5jd2lzZVByb2R1Y3QocmhzLmNvbChjb2wpKS5zdW0oKTsKKyAgfQorfTsKKworLy8gTk9URSB0aGUgMyBmb2xsb3dpbmcgc3BlY2lhbGl6YXRpb25zIGFyZSBiZWNhdXNlIHRha2luZyAuY29sKDApIG9uIGEgdmVjdG9yIGlzIGEgYml0IHNsb3dlcgorLy8gTk9URSBtYXliZSB0aGV5IGFyZSBub3cgdXNlbGVzcyBzaW5jZSB3ZSBoYXZlIGEgc3BlY2lhbGl6YXRpb24gZm9yIEJsb2NrPE1hdHJpeD4KK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUmhzQ29scz4KK3N0cnVjdCBwcm9kdWN0X2NvZWZmX3ZlY3Rvcml6ZWRfZHluX3NlbGVjdG9yPExocyxSaHMsMSxSaHNDb2xzPgoreworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEluZGV4IC8qcm93Ki8sIEluZGV4IGNvbCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCB0eXBlbmFtZSBMaHM6OlNjYWxhciAmcmVzKQorICB7CisgICAgcmVzID0gbGhzLnRyYW5zcG9zZSgpLmN3aXNlUHJvZHVjdChyaHMuY29sKGNvbCkpLnN1bSgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IExoc1Jvd3M+CitzdHJ1Y3QgcHJvZHVjdF9jb2VmZl92ZWN0b3JpemVkX2R5bl9zZWxlY3RvcjxMaHMsUmhzLExoc1Jvd3MsMT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCByb3csIEluZGV4IC8qY29sKi8sIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgdHlwZW5hbWUgTGhzOjpTY2FsYXIgJnJlcykKKyAgeworICAgIHJlcyA9IGxocy5yb3cocm93KS50cmFuc3Bvc2UoKS5jd2lzZVByb2R1Y3QocmhzKS5zdW0oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgcHJvZHVjdF9jb2VmZl92ZWN0b3JpemVkX2R5bl9zZWxlY3RvcjxMaHMsUmhzLDEsMT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCAvKnJvdyovLCBJbmRleCAvKmNvbCovLCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIHR5cGVuYW1lIExoczo6U2NhbGFyICZyZXMpCisgIHsKKyAgICByZXMgPSBsaHMudHJhbnNwb3NlKCkuY3dpc2VQcm9kdWN0KHJocykuc3VtKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXRTY2FsYXI+CitzdHJ1Y3QgcHJvZHVjdF9jb2VmZl9pbXBsPElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgRHluYW1pYywgTGhzLCBSaHMsIFJldFNjYWxhcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCB0eXBlbmFtZSBMaHM6OlNjYWxhciAmcmVzKQorICB7CisgICAgcHJvZHVjdF9jb2VmZl92ZWN0b3JpemVkX2R5bl9zZWxlY3RvcjxMaHMsUmhzPjo6cnVuKHJvdywgY29sLCBsaHMsIHJocywgcmVzKTsKKyAgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioKKyoqKiBQYWNrZXQgcGF0aCAgKioqCisqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTxpbnQgVW5yb2xsaW5nSW5kZXgsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBQYWNrZXQsIGludCBMb2FkTW9kZT4KK3N0cnVjdCBwcm9kdWN0X3BhY2tldF9pbXBsPFJvd01ham9yLCBVbnJvbGxpbmdJbmRleCwgTGhzLCBSaHMsIFBhY2tldCwgTG9hZE1vZGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUGFja2V0ICZyZXMpCisgIHsKKyAgICBwcm9kdWN0X3BhY2tldF9pbXBsPFJvd01ham9yLCBVbnJvbGxpbmdJbmRleC0xLCBMaHMsIFJocywgUGFja2V0LCBMb2FkTW9kZT46OnJ1bihyb3csIGNvbCwgbGhzLCByaHMsIHJlcyk7CisgICAgcmVzID0gIHBtYWRkKHBzZXQxPFBhY2tldD4obGhzLmNvZWZmKHJvdywgVW5yb2xsaW5nSW5kZXgpKSwgcmhzLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oVW5yb2xsaW5nSW5kZXgsIGNvbCksIHJlcyk7CisgIH0KK307CisKK3RlbXBsYXRlPGludCBVbnJvbGxpbmdJbmRleCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFBhY2tldCwgaW50IExvYWRNb2RlPgorc3RydWN0IHByb2R1Y3RfcGFja2V0X2ltcGw8Q29sTWFqb3IsIFVucm9sbGluZ0luZGV4LCBMaHMsIFJocywgUGFja2V0LCBMb2FkTW9kZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBQYWNrZXQgJnJlcykKKyAgeworICAgIHByb2R1Y3RfcGFja2V0X2ltcGw8Q29sTWFqb3IsIFVucm9sbGluZ0luZGV4LTEsIExocywgUmhzLCBQYWNrZXQsIExvYWRNb2RlPjo6cnVuKHJvdywgY29sLCBsaHMsIHJocywgcmVzKTsKKyAgICByZXMgPSAgcG1hZGQobGhzLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4ocm93LCBVbnJvbGxpbmdJbmRleCksIHBzZXQxPFBhY2tldD4ocmhzLmNvZWZmKFVucm9sbGluZ0luZGV4LCBjb2wpKSwgcmVzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFBhY2tldCwgaW50IExvYWRNb2RlPgorc3RydWN0IHByb2R1Y3RfcGFja2V0X2ltcGw8Um93TWFqb3IsIDAsIExocywgUmhzLCBQYWNrZXQsIExvYWRNb2RlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFBhY2tldCAmcmVzKQorICB7CisgICAgcmVzID0gcG11bChwc2V0MTxQYWNrZXQ+KGxocy5jb2VmZihyb3csIDApKSxyaHMudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPigwLCBjb2wpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFBhY2tldCwgaW50IExvYWRNb2RlPgorc3RydWN0IHByb2R1Y3RfcGFja2V0X2ltcGw8Q29sTWFqb3IsIDAsIExocywgUmhzLCBQYWNrZXQsIExvYWRNb2RlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKEluZGV4IHJvdywgSW5kZXggY29sLCBjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFBhY2tldCAmcmVzKQorICB7CisgICAgcmVzID0gcG11bChsaHMudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihyb3csIDApLCBwc2V0MTxQYWNrZXQ+KHJocy5jb2VmZigwLCBjb2wpKSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBQYWNrZXQsIGludCBMb2FkTW9kZT4KK3N0cnVjdCBwcm9kdWN0X3BhY2tldF9pbXBsPFJvd01ham9yLCBEeW5hbWljLCBMaHMsIFJocywgUGFja2V0LCBMb2FkTW9kZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCByb3csIEluZGV4IGNvbCwgY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBQYWNrZXQmIHJlcykKKyAgeworICAgIGVpZ2VuX2Fzc2VydChsaHMuY29scygpPjAgJiYgInlvdSBhcmUgdXNpbmcgYSBub24gaW5pdGlhbGl6ZWQgbWF0cml4Iik7CisgICAgcmVzID0gcG11bChwc2V0MTxQYWNrZXQ+KGxocy5jb2VmZihyb3csIDApKSxyaHMudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPigwLCBjb2wpKTsKKyAgICAgIGZvcihJbmRleCBpID0gMTsgaSA8IGxocy5jb2xzKCk7ICsraSkKKyAgICAgICAgcmVzID0gIHBtYWRkKHBzZXQxPFBhY2tldD4obGhzLmNvZWZmKHJvdywgaSkpLCByaHMudGVtcGxhdGUgcGFja2V0PExvYWRNb2RlPihpLCBjb2wpLCByZXMpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUGFja2V0LCBpbnQgTG9hZE1vZGU+CitzdHJ1Y3QgcHJvZHVjdF9wYWNrZXRfaW1wbDxDb2xNYWpvciwgRHluYW1pYywgTGhzLCBSaHMsIFBhY2tldCwgTG9hZE1vZGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggcm93LCBJbmRleCBjb2wsIGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUGFja2V0JiByZXMpCisgIHsKKyAgICBlaWdlbl9hc3NlcnQobGhzLmNvbHMoKT4wICYmICJ5b3UgYXJlIHVzaW5nIGEgbm9uIGluaXRpYWxpemVkIG1hdHJpeCIpOworICAgIHJlcyA9IHBtdWwobGhzLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4ocm93LCAwKSwgcHNldDE8UGFja2V0PihyaHMuY29lZmYoMCwgY29sKSkpOworICAgICAgZm9yKEluZGV4IGkgPSAxOyBpIDwgbGhzLmNvbHMoKTsgKytpKQorICAgICAgICByZXMgPSAgcG1hZGQobGhzLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4ocm93LCBpKSwgcHNldDE8UGFja2V0PihyaHMuY29lZmYoaSwgY29sKSksIHJlcyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPRUZGQkFTRURfUFJPRFVDVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsQmxvY2tQYW5lbEtlcm5lbC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbEJsb2NrUGFuZWxLZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWIwM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbEJsb2NrUGFuZWxLZXJuZWwuaApAQCAtMCwwICsxLDEzMTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfQkxPQ0tfUEFORUxfSAorI2RlZmluZSBFSUdFTl9HRU5FUkFMX0JMT0NLX1BBTkVMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisgIAorbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0xoc1NjYWxhciwgdHlwZW5hbWUgX1Joc1NjYWxhciwgYm9vbCBfQ29uakxocz1mYWxzZSwgYm9vbCBfQ29ualJocz1mYWxzZT4KK2NsYXNzIGdlYnBfdHJhaXRzOworCisKKy8qKiBcaW50ZXJuYWwgXHJldHVybnMgYiBpZiBhPD0wLCBhbmQgcmV0dXJucyBhIG90aGVyd2lzZS4gKi8KK2lubGluZSBzdGQ6OnB0cmRpZmZfdCBtYW5hZ2VfY2FjaGluZ19zaXplc19oZWxwZXIoc3RkOjpwdHJkaWZmX3QgYSwgc3RkOjpwdHJkaWZmX3QgYikKK3sKKyAgcmV0dXJuIGE8PTAgPyBiIDogYTsKK30KKworLyoqIFxpbnRlcm5hbCAqLworaW5saW5lIHZvaWQgbWFuYWdlX2NhY2hpbmdfc2l6ZXMoQWN0aW9uIGFjdGlvbiwgc3RkOjpwdHJkaWZmX3QqIGwxPTAsIHN0ZDo6cHRyZGlmZl90KiBsMj0wKQoreworICBzdGF0aWMgc3RkOjpwdHJkaWZmX3QgbV9sMUNhY2hlU2l6ZSA9IDA7CisgIHN0YXRpYyBzdGQ6OnB0cmRpZmZfdCBtX2wyQ2FjaGVTaXplID0gMDsKKyAgaWYobV9sMkNhY2hlU2l6ZT09MCkKKyAgeworICAgIG1fbDFDYWNoZVNpemUgPSBtYW5hZ2VfY2FjaGluZ19zaXplc19oZWxwZXIocXVlcnlMMUNhY2hlU2l6ZSgpLDggKiAxMDI0KTsKKyAgICBtX2wyQ2FjaGVTaXplID0gbWFuYWdlX2NhY2hpbmdfc2l6ZXNfaGVscGVyKHF1ZXJ5VG9wTGV2ZWxDYWNoZVNpemUoKSwxKjEwMjQqMTAyNCk7CisgIH0KKyAgCisgIGlmKGFjdGlvbj09U2V0QWN0aW9uKQorICB7CisgICAgLy8gc2V0IHRoZSBjcHUgY2FjaGUgc2l6ZSBhbmQgY2FjaGUgYWxsIGJsb2NrIHNpemVzIGZyb20gYSBnbG9iYWwgY2FjaGUgc2l6ZSBpbiBieXRlCisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KGwxIT0wICYmIGwyIT0wKTsKKyAgICBtX2wxQ2FjaGVTaXplID0gKmwxOworICAgIG1fbDJDYWNoZVNpemUgPSAqbDI7CisgIH0KKyAgZWxzZSBpZihhY3Rpb249PUdldEFjdGlvbikKKyAgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChsMSE9MCAmJiBsMiE9MCk7CisgICAgKmwxID0gbV9sMUNhY2hlU2l6ZTsKKyAgICAqbDIgPSBtX2wyQ2FjaGVTaXplOworICB9CisgIGVsc2UKKyAgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChmYWxzZSk7CisgIH0KK30KKworLyoqIFxicmllZiBDb21wdXRlcyB0aGUgYmxvY2tpbmcgcGFyYW1ldGVycyBmb3IgYSBtIHggayB0aW1lcyBrIHggbiBtYXRyaXggcHJvZHVjdAorICAqCisgICogXHBhcmFtW2luLG91dF0gayBJbnB1dDogdGhlIHRoaXJkIGRpbWVuc2lvbiBvZiB0aGUgcHJvZHVjdC4gT3V0cHV0OiB0aGUgYmxvY2tpbmcgc2l6ZSBhbG9uZyB0aGUgc2FtZSBkaW1lbnNpb24uCisgICogXHBhcmFtW2luLG91dF0gbSBJbnB1dDogdGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSBsZWZ0IGhhbmQgc2lkZS4gT3V0cHV0OiB0aGUgYmxvY2tpbmcgc2l6ZSBhbG9uZyB0aGUgc2FtZSBkaW1lbnNpb24uCisgICogXHBhcmFtW2luLG91dF0gbiBJbnB1dDogdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSByaWdodCBoYW5kIHNpZGUuIE91dHB1dDogdGhlIGJsb2NraW5nIHNpemUgYWxvbmcgdGhlIHNhbWUgZGltZW5zaW9uLgorICAqCisgICogR2l2ZW4gYSBtIHggayB0aW1lcyBrIHggbiBtYXRyaXggcHJvZHVjdCBvZiBzY2FsYXIgdHlwZXMgXGMgTGhzU2NhbGFyIGFuZCBcYyBSaHNTY2FsYXIsCisgICogdGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgYmxvY2tpbmcgc2l6ZSBwYXJhbWV0ZXJzIGFsb25nIHRoZSByZXNwZWN0aXZlIGRpbWVuc2lvbnMKKyAgKiBmb3IgbWF0cml4IHByb2R1Y3RzIGFuZCByZWxhdGVkIGFsZ29yaXRobXMuIFRoZSBibG9ja2luZyBzaXplcyBkZXBlbmRzIG9uIHZhcmlvdXMKKyAgKiBwYXJhbWV0ZXJzOgorICAqIC0gdGhlIEwxIGFuZCBMMiBjYWNoZSBzaXplcywKKyAgKiAtIHRoZSByZWdpc3RlciBsZXZlbCBibG9ja2luZyBzaXplcyBkZWZpbmVkIGJ5IGdlYnBfdHJhaXRzLAorICAqIC0gdGhlIG51bWJlciBvZiBzY2FsYXJzIHRoYXQgZml0IGludG8gYSBwYWNrZXQgKHdoZW4gdmVjdG9yaXphdGlvbiBpcyBlbmFibGVkKS4KKyAgKgorICAqIFxzYSBzZXRDcHVDYWNoZVNpemVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgaW50IEtjRmFjdG9yPgordm9pZCBjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXMoc3RkOjpwdHJkaWZmX3QmIGssIHN0ZDo6cHRyZGlmZl90JiBtLCBzdGQ6OnB0cmRpZmZfdCYgbikKK3sKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG4pOworICAvLyBFeHBsYW5hdGlvbnM6CisgIC8vIExldCdzIHJlY2FsbCB0aGUgcHJvZHVjdCBhbGdvcml0aG1zIGZvcm0ga2MgeCBuYyBob3Jpem9udGFsIHBhbmVscyBCJyBvbiB0aGUgcmhzIGFuZAorICAvLyBtYyB4IGtjIGJsb2NrcyBBJyBvbiB0aGUgbGhzLiBBJyBoYXMgdG8gZml0IGludG8gTDIgY2FjaGUuIE1vcmVvdmVyLCBCJyBpcyBwcm9jZXNzZWQKKyAgLy8gcGVyIGtjIHggbnIgdmVydGljYWwgc21hbGwgcGFuZWxzIHdoZXJlIG5yIGlzIHRoZSBibG9ja2luZyBzaXplIGFsb25nIHRoZSBuIGRpbWVuc2lvbgorICAvLyBhdCB0aGUgcmVnaXN0ZXIgbGV2ZWwuIEZvciB2ZWN0b3JpemF0aW9uIHB1cnBvc2UsIHRoZXNlIHNtYWxsIHZlcnRpY2FsIHBhbmVscyBhcmUgdW5wYWNrZWQsCisgIC8vIGUuZy4sIGVhY2ggY29lZmZpY2llbnQgaXMgcmVwbGljYXRlZCB0byBmaXQgYSBwYWNrZXQuIFRoaXMgc21hbGwgdmVydGljYWwgcGFuZWwgaGFzIHRvCisgIC8vIHN0YXkgaW4gTDEgY2FjaGUuCisgIHN0ZDo6cHRyZGlmZl90IGwxLCBsMjsKKworICB0eXBlZGVmIGdlYnBfdHJhaXRzPExoc1NjYWxhcixSaHNTY2FsYXI+IFRyYWl0czsKKyAgZW51bSB7CisgICAga2RpdiA9IEtjRmFjdG9yICogMiAqIFRyYWl0czo6bnIKKyAgICAgICAgICogVHJhaXRzOjpSaHNQcm9ncmVzcyAqIHNpemVvZihSaHNTY2FsYXIpLAorICAgIG1yID0gZ2VicF90cmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcj46Om1yLAorICAgIG1yX21hc2sgPSAoMHhmZmZmZmZmZi9tcikqbXIKKyAgfTsKKworICBtYW5hZ2VfY2FjaGluZ19zaXplcyhHZXRBY3Rpb24sICZsMSwgJmwyKTsKKyAgayA9IHN0ZDo6bWluPHN0ZDo6cHRyZGlmZl90PihrLCBsMS9rZGl2KTsKKyAgc3RkOjpwdHJkaWZmX3QgX20gPSBrPjAgPyBsMi8oNCAqIHNpemVvZihMaHNTY2FsYXIpICogaykgOiAwOworICBpZihfbTxtKSBtID0gX20gJiBtcl9tYXNrOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhcj4KK2lubGluZSB2b2lkIGNvbXB1dGVQcm9kdWN0QmxvY2tpbmdTaXplcyhzdGQ6OnB0cmRpZmZfdCYgaywgc3RkOjpwdHJkaWZmX3QmIG0sIHN0ZDo6cHRyZGlmZl90JiBuKQoreworICBjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8TGhzU2NhbGFyLFJoc1NjYWxhciwxPihrLCBtLCBuKTsKK30KKworI2lmZGVmIEVJR0VOX0hBU19GVVNFX0NKTUFERAorICAjZGVmaW5lIE1BREQoQ0osQSxCLEMsVCkgIEMgPSBDSi5wbWFkZChBLEIsQyk7CisjZWxzZQorCisgIC8vIEZJWE1FIChhIGJpdCBvdmVya2lsbCBtYXliZSA/KQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIENKLCB0eXBlbmFtZSBBLCB0eXBlbmFtZSBCLCB0eXBlbmFtZSBDLCB0eXBlbmFtZSBUPiBzdHJ1Y3QgZ2VicF9tYWRkX3NlbGVjdG9yIHsKKyAgICBFSUdFTl9BTFdBWVNfSU5MSU5FIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBDSiYgY2osIEEmIGEsIEImIGIsIEMmIGMsIFQmIC8qdCovKQorICAgIHsKKyAgICAgIGMgPSBjai5wbWFkZChhLGIsYyk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIENKLCB0eXBlbmFtZSBUPiBzdHJ1Y3QgZ2VicF9tYWRkX3NlbGVjdG9yPENKLFQsVCxULFQ+IHsKKyAgICBFSUdFTl9BTFdBWVNfSU5MSU5FIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBDSiYgY2osIFQmIGEsIFQmIGIsIFQmIGMsIFQmIHQpCisgICAgeworICAgICAgdCA9IGI7IHQgPSBjai5wbXVsKGEsdCk7IGMgPSBwYWRkKGMsdCk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIENKLCB0eXBlbmFtZSBBLCB0eXBlbmFtZSBCLCB0eXBlbmFtZSBDLCB0eXBlbmFtZSBUPgorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgZ2VicF9tYWRkKGNvbnN0IENKJiBjaiwgQSYgYSwgQiYgYiwgQyYgYywgVCYgdCkKKyAgeworICAgIGdlYnBfbWFkZF9zZWxlY3RvcjxDSixBLEIsQyxUPjo6cnVuKGNqLGEsYixjLHQpOworICB9CisKKyAgI2RlZmluZSBNQUREKENKLEEsQixDLFQpICBnZWJwX21hZGQoQ0osQSxCLEMsVCk7CisvLyAgICNkZWZpbmUgTUFERChDSixBLEIsQyxUKSAgVCA9IEI7IFQgPSBDSi5wbXVsKEEsVCk7IEMgPSBwYWRkKEMsVCk7CisjZW5kaWYKKworLyogVmVjdG9yaXphdGlvbiBsb2dpYworICogIHJlYWwqcmVhbDogdW5wYWNrIHJocyB0byBjb25zdGFudCBwYWNrZXRzLCAuLi4KKyAqIAorICogIGNkKmNkIDogdW5wYWNrIHJocyB0byAoYl9yLGJfciksIChiX2ksYl9pKSwgbXVsIHRvIGdldCAoYV9yIGJfcixhX2kgYl9yKSAoYV9yIGJfaSxhX2kgYl9pKSwKKyAqICAgICAgICAgIHN0b3JpbmcgZWFjaCByZXMgcGFja2V0IGludG8gdHdvIHBhY2tldHMgKDJ4MiksCisgKiAgICAgICAgICBhdCB0aGUgZW5kIGNvbWJpbmUgdGhlbTogc3dhcCB0aGUgc2Vjb25kIGFuZCBhZGRzdWIgdGhlbSAKKyAqICBjZipjZiA6IHNhbWUgYnV0IHdpdGggMng0IGJsb2NrcworICogIGNwbHgqcmVhbCA6IHVucGFjayByaHMgdG8gY29uc3RhbnQgcGFja2V0cywgLi4uCisgKiAgcmVhbCpjcGx4IDogbG9hZCBsaHMgYXMgKGEwLGEwLGExLGExKSwgYW5kIG11bCBhcyB1c3VhbAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTGhzU2NhbGFyLCB0eXBlbmFtZSBfUmhzU2NhbGFyLCBib29sIF9Db25qTGhzLCBib29sIF9Db25qUmhzPgorY2xhc3MgZ2VicF90cmFpdHMKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBfTGhzU2NhbGFyIExoc1NjYWxhcjsKKyAgdHlwZWRlZiBfUmhzU2NhbGFyIFJoc1NjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzY2FsYXJfcHJvZHVjdF90cmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+OjpSZXR1cm5UeXBlIFJlc1NjYWxhcjsKKworICBlbnVtIHsKKyAgICBDb25qTGhzID0gX0NvbmpMaHMsCisgICAgQ29ualJocyA9IF9Db25qUmhzLAorICAgIFZlY3Rvcml6YWJsZSA9IHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6VmVjdG9yaXphYmxlICYmIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6VmVjdG9yaXphYmxlLAorICAgIExoc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OnNpemUgOiAxLAorICAgIFJoc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OnNpemUgOiAxLAorICAgIFJlc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPFJlc1NjYWxhcj46OnNpemUgOiAxLAorICAgIAorICAgIE51bWJlck9mUmVnaXN0ZXJzID0gRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMsCisKKyAgICAvLyByZWdpc3RlciBibG9jayBzaXplIGFsb25nIHRoZSBOIGRpcmVjdGlvbiAobXVzdCBiZSBlaXRoZXIgMiBvciA0KQorICAgIG5yID0gTnVtYmVyT2ZSZWdpc3RlcnMvNCwKKworICAgIC8vIHJlZ2lzdGVyIGJsb2NrIHNpemUgYWxvbmcgdGhlIE0gZGlyZWN0aW9uIChjdXJyZW50bHksIHRoaXMgb25lIGNhbm5vdCBiZSBtb2RpZmllZCkKKyAgICBtciA9IDIgKiBMaHNQYWNrZXRTaXplLAorICAgIAorICAgIFdvcmtTcGFjZUZhY3RvciA9IG5yICogUmhzUGFja2V0U2l6ZSwKKworICAgIExoc1Byb2dyZXNzID0gTGhzUGFja2V0U2l6ZSwKKyAgICBSaHNQcm9ncmVzcyA9IFJoc1BhY2tldFNpemUKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6dHlwZSAgX0xoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OnR5cGUgIF9SaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+Ojp0eXBlICBfUmVzUGFja2V0OworCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9MaHNQYWNrZXQsTGhzU2NhbGFyPjo6dHlwZSBMaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9SaHNQYWNrZXQsUmhzU2NhbGFyPjo6dHlwZSBSaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9SZXNQYWNrZXQsUmVzU2NhbGFyPjo6dHlwZSBSZXNQYWNrZXQ7CisKKyAgdHlwZWRlZiBSZXNQYWNrZXQgQWNjUGFja2V0OworICAKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGluaXRBY2MoQWNjUGFja2V0JiBwKQorICB7CisgICAgcCA9IHBzZXQxPFJlc1BhY2tldD4oUmVzU2NhbGFyKDApKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCB1bnBhY2tSaHMoRGVuc2VJbmRleCBuLCBjb25zdCBSaHNTY2FsYXIqIHJocywgUmhzU2NhbGFyKiBiKQorICB7CisgICAgZm9yKERlbnNlSW5kZXggaz0wOyBrPG47IGsrKykKKyAgICAgIHBzdG9yZTE8UmhzUGFja2V0PigmYltrKlJoc1BhY2tldFNpemVdLCByaHNba10pOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGxvYWRSaHMoY29uc3QgUmhzU2NhbGFyKiBiLCBSaHNQYWNrZXQmIGRlc3QpIGNvbnN0CisgIHsKKyAgICBkZXN0ID0gcGxvYWQ8UmhzUGFja2V0PihiKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkTGhzKGNvbnN0IExoc1NjYWxhciogYSwgTGhzUGFja2V0JiBkZXN0KSBjb25zdAorICB7CisgICAgZGVzdCA9IHBsb2FkPExoc1BhY2tldD4oYSk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbWFkZChjb25zdCBMaHNQYWNrZXQmIGEsIGNvbnN0IFJoc1BhY2tldCYgYiwgQWNjUGFja2V0JiBjLCBBY2NQYWNrZXQmIHRtcCkgY29uc3QKKyAgeworICAgIHRtcCA9IGI7IHRtcCA9IHBtdWwoYSx0bXApOyBjID0gcGFkZChjLHRtcCk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgYWNjKGNvbnN0IEFjY1BhY2tldCYgYywgY29uc3QgUmVzUGFja2V0JiBhbHBoYSwgUmVzUGFja2V0JiByKSBjb25zdAorICB7CisgICAgciA9IHBtYWRkKGMsYWxwaGEscik7CisgIH0KKworcHJvdGVjdGVkOgorLy8gICBjb25qX2hlbHBlcjxMaHNTY2FsYXIsUmhzU2NhbGFyLENvbmpMaHMsQ29ualJocz4gY2o7CisvLyAgIGNvbmpfaGVscGVyPExoc1BhY2tldCxSaHNQYWNrZXQsQ29uakxocyxDb25qUmhzPiBwY2o7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsU2NhbGFyLCBib29sIF9Db25qTGhzPgorY2xhc3MgZ2VicF90cmFpdHM8c3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBSZWFsU2NhbGFyLCBfQ29uakxocywgZmFsc2U+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IExoc1NjYWxhcjsKKyAgdHlwZWRlZiBSZWFsU2NhbGFyIFJoc1NjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzY2FsYXJfcHJvZHVjdF90cmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+OjpSZXR1cm5UeXBlIFJlc1NjYWxhcjsKKworICBlbnVtIHsKKyAgICBDb25qTGhzID0gX0NvbmpMaHMsCisgICAgQ29ualJocyA9IGZhbHNlLAorICAgIFZlY3Rvcml6YWJsZSA9IHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6VmVjdG9yaXphYmxlICYmIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6VmVjdG9yaXphYmxlLAorICAgIExoc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OnNpemUgOiAxLAorICAgIFJoc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OnNpemUgOiAxLAorICAgIFJlc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPFJlc1NjYWxhcj46OnNpemUgOiAxLAorICAgIAorICAgIE51bWJlck9mUmVnaXN0ZXJzID0gRUlHRU5fQVJDSF9ERUZBVUxUX05VTUJFUl9PRl9SRUdJU1RFUlMsCisgICAgbnIgPSBOdW1iZXJPZlJlZ2lzdGVycy80LAorICAgIG1yID0gMiAqIExoc1BhY2tldFNpemUsCisgICAgV29ya1NwYWNlRmFjdG9yID0gbnIqUmhzUGFja2V0U2l6ZSwKKworICAgIExoc1Byb2dyZXNzID0gTGhzUGFja2V0U2l6ZSwKKyAgICBSaHNQcm9ncmVzcyA9IFJoc1BhY2tldFNpemUKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6dHlwZSAgX0xoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OnR5cGUgIF9SaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+Ojp0eXBlICBfUmVzUGFja2V0OworCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9MaHNQYWNrZXQsTGhzU2NhbGFyPjo6dHlwZSBMaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9SaHNQYWNrZXQsUmhzU2NhbGFyPjo6dHlwZSBSaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9SZXNQYWNrZXQsUmVzU2NhbGFyPjo6dHlwZSBSZXNQYWNrZXQ7CisKKyAgdHlwZWRlZiBSZXNQYWNrZXQgQWNjUGFja2V0OworCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBpbml0QWNjKEFjY1BhY2tldCYgcCkKKyAgeworICAgIHAgPSBwc2V0MTxSZXNQYWNrZXQ+KFJlc1NjYWxhcigwKSk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgdW5wYWNrUmhzKERlbnNlSW5kZXggbiwgY29uc3QgUmhzU2NhbGFyKiByaHMsIFJoc1NjYWxhciogYikKKyAgeworICAgIGZvcihEZW5zZUluZGV4IGs9MDsgazxuOyBrKyspCisgICAgICBwc3RvcmUxPFJoc1BhY2tldD4oJmJbaypSaHNQYWNrZXRTaXplXSwgcmhzW2tdKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzKGNvbnN0IFJoc1NjYWxhciogYiwgUmhzUGFja2V0JiBkZXN0KSBjb25zdAorICB7CisgICAgZGVzdCA9IHBsb2FkPFJoc1BhY2tldD4oYik7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbG9hZExocyhjb25zdCBMaHNTY2FsYXIqIGEsIExoc1BhY2tldCYgZGVzdCkgY29uc3QKKyAgeworICAgIGRlc3QgPSBwbG9hZDxMaHNQYWNrZXQ+KGEpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1hZGQoY29uc3QgTGhzUGFja2V0JiBhLCBjb25zdCBSaHNQYWNrZXQmIGIsIEFjY1BhY2tldCYgYywgUmhzUGFja2V0JiB0bXApIGNvbnN0CisgIHsKKyAgICBtYWRkX2ltcGwoYSwgYiwgYywgdG1wLCB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsdHJ1ZV90eXBlLGZhbHNlX3R5cGU+Ojp0eXBlKCkpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1hZGRfaW1wbChjb25zdCBMaHNQYWNrZXQmIGEsIGNvbnN0IFJoc1BhY2tldCYgYiwgQWNjUGFja2V0JiBjLCBSaHNQYWNrZXQmIHRtcCwgY29uc3QgdHJ1ZV90eXBlJikgY29uc3QKKyAgeworICAgIHRtcCA9IGI7IHRtcCA9IHBtdWwoYS52LHRtcCk7IGMudiA9IHBhZGQoYy52LHRtcCk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbWFkZF9pbXBsKGNvbnN0IExoc1NjYWxhciYgYSwgY29uc3QgUmhzU2NhbGFyJiBiLCBSZXNTY2FsYXImIGMsIFJoc1NjYWxhciYgLyp0bXAqLywgY29uc3QgZmFsc2VfdHlwZSYpIGNvbnN0CisgIHsKKyAgICBjICs9IGEgKiBiOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGFjYyhjb25zdCBBY2NQYWNrZXQmIGMsIGNvbnN0IFJlc1BhY2tldCYgYWxwaGEsIFJlc1BhY2tldCYgcikgY29uc3QKKyAgeworICAgIHIgPSBjai5wbWFkZChjLGFscGhhLHIpOworICB9CisKK3Byb3RlY3RlZDoKKyAgY29ual9oZWxwZXI8UmVzUGFja2V0LFJlc1BhY2tldCxDb25qTGhzLGZhbHNlPiBjajsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlYWxTY2FsYXIsIGJvb2wgX0NvbmpMaHMsIGJvb2wgX0NvbmpSaHM+CitjbGFzcyBnZWJwX3RyYWl0czxzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4sIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgX0NvbmpMaHMsIF9Db25qUmhzID4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gIFNjYWxhcjsKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gIExoc1NjYWxhcjsKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gIFJoc1NjYWxhcjsKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gIFJlc1NjYWxhcjsKKyAgCisgIGVudW0geworICAgIENvbmpMaHMgPSBfQ29uakxocywKKyAgICBDb25qUmhzID0gX0NvbmpSaHMsCisgICAgVmVjdG9yaXphYmxlID0gcGFja2V0X3RyYWl0czxSZWFsU2NhbGFyPjo6VmVjdG9yaXphYmxlCisgICAgICAgICAgICAgICAgJiYgcGFja2V0X3RyYWl0czxTY2FsYXI+OjpWZWN0b3JpemFibGUsCisgICAgUmVhbFBhY2tldFNpemUgID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxSZWFsU2NhbGFyPjo6c2l6ZSA6IDEsCisgICAgUmVzUGFja2V0U2l6ZSAgID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+OjpzaXplIDogMSwKKyAgICAKKyAgICBuciA9IDIsCisgICAgbXIgPSAyICogUmVzUGFja2V0U2l6ZSwKKyAgICBXb3JrU3BhY2VGYWN0b3IgPSBWZWN0b3JpemFibGUgPyAyKm5yKlJlYWxQYWNrZXRTaXplIDogbnIsCisKKyAgICBMaHNQcm9ncmVzcyA9IFJlc1BhY2tldFNpemUsCisgICAgUmhzUHJvZ3Jlc3MgPSBWZWN0b3JpemFibGUgPyAyKlJlc1BhY2tldFNpemUgOiAxCisgIH07CisgIAorICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8UmVhbFNjYWxhcj46OnR5cGUgUmVhbFBhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgICAgIFNjYWxhclBhY2tldDsKKyAgc3RydWN0IERvdWJsZVBhY2tldAorICB7CisgICAgUmVhbFBhY2tldCBmaXJzdDsKKyAgICBSZWFsUGFja2V0IHNlY29uZDsKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxSZWFsUGFja2V0LCAgU2NhbGFyPjo6dHlwZSBMaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLERvdWJsZVBhY2tldCxTY2FsYXI+Ojp0eXBlIFJoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsU2NhbGFyUGFja2V0LFNjYWxhcj46OnR5cGUgUmVzUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxEb3VibGVQYWNrZXQsU2NhbGFyPjo6dHlwZSBBY2NQYWNrZXQ7CisgIAorICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgaW5pdEFjYyhTY2FsYXImIHApIHsgcCA9IFNjYWxhcigwKTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBpbml0QWNjKERvdWJsZVBhY2tldCYgcCkKKyAgeworICAgIHAuZmlyc3QgICA9IHBzZXQxPFJlYWxQYWNrZXQ+KFJlYWxTY2FsYXIoMCkpOworICAgIHAuc2Vjb25kICA9IHBzZXQxPFJlYWxQYWNrZXQ+KFJlYWxTY2FsYXIoMCkpOworICB9CisKKyAgLyogVW5wYWNrIHRoZSByaHMgY29lZmYgc3VjaCB0aGF0IGVhY2ggY29tcGxleCBjb2VmZmljaWVudCBpcyBzcHJlYWQgaW50bworICAgKiB0d28gcGFja2VjdHMgY29udGFpbmluZyByZXNwZWN0aXZlbHkgdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBjb2VmZmljaWVudAorICAgKiBkdXBsaWNhdGVkIGFzIG1hbnkgdGltZSBhcyBuZWVkZWQ6ICh4K2l5KSA9PiBbeCwgLi4uLCB4XSBbeSwgLi4uLCB5XQorICAgKi8KKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHVucGFja1JocyhEZW5zZUluZGV4IG4sIGNvbnN0IFNjYWxhciogcmhzLCBTY2FsYXIqIGIpCisgIHsKKyAgICBmb3IoRGVuc2VJbmRleCBrPTA7IGs8bjsgaysrKQorICAgIHsKKyAgICAgIGlmKFZlY3Rvcml6YWJsZSkKKyAgICAgIHsKKyAgICAgICAgcHN0b3JlMTxSZWFsUGFja2V0PigoUmVhbFNjYWxhciopJmJbaypSZXNQYWNrZXRTaXplKjIrMF0sICAgICAgICAgICAgIHJlYWwocmhzW2tdKSk7CisgICAgICAgIHBzdG9yZTE8UmVhbFBhY2tldD4oKFJlYWxTY2FsYXIqKSZiW2sqUmVzUGFja2V0U2l6ZSoyK1Jlc1BhY2tldFNpemVdLCBpbWFnKHJoc1trXSkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBiW2tdID0gcmhzW2tdOworICAgIH0KKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzKGNvbnN0IFJoc1NjYWxhciogYiwgUmVzUGFja2V0JiBkZXN0KSBjb25zdCB7IGRlc3QgPSAqYjsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzKGNvbnN0IFJoc1NjYWxhciogYiwgRG91YmxlUGFja2V0JiBkZXN0KSBjb25zdAorICB7CisgICAgZGVzdC5maXJzdCAgPSBwbG9hZDxSZWFsUGFja2V0PigoY29uc3QgUmVhbFNjYWxhciopYik7CisgICAgZGVzdC5zZWNvbmQgPSBwbG9hZDxSZWFsUGFja2V0PigoY29uc3QgUmVhbFNjYWxhciopKGIrUmVzUGFja2V0U2l6ZSkpOworICB9CisKKyAgLy8gbm90aGluZyBzcGVjaWFsIGhlcmUKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGxvYWRMaHMoY29uc3QgTGhzU2NhbGFyKiBhLCBMaHNQYWNrZXQmIGRlc3QpIGNvbnN0CisgIHsKKyAgICBkZXN0ID0gcGxvYWQ8TGhzUGFja2V0PigoY29uc3QgdHlwZW5hbWUgdW5wYWNrZXRfdHJhaXRzPExoc1BhY2tldD46OnR5cGUqKShhKSk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbWFkZChjb25zdCBMaHNQYWNrZXQmIGEsIGNvbnN0IFJoc1BhY2tldCYgYiwgRG91YmxlUGFja2V0JiBjLCBSaHNQYWNrZXQmIC8qdG1wKi8pIGNvbnN0CisgIHsKKyAgICBjLmZpcnN0ICAgPSBwYWRkKHBtdWwoYSxiLmZpcnN0KSwgYy5maXJzdCk7CisgICAgYy5zZWNvbmQgID0gcGFkZChwbXVsKGEsYi5zZWNvbmQpLGMuc2Vjb25kKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBtYWRkKGNvbnN0IExoc1BhY2tldCYgYSwgY29uc3QgUmhzUGFja2V0JiBiLCBSZXNQYWNrZXQmIGMsIFJoc1BhY2tldCYgLyp0bXAqLykgY29uc3QKKyAgeworICAgIGMgPSBjai5wbWFkZChhLGIsYyk7CisgIH0KKyAgCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhY2MoY29uc3QgU2NhbGFyJiBjLCBjb25zdCBTY2FsYXImIGFscGhhLCBTY2FsYXImIHIpIGNvbnN0IHsgciArPSBhbHBoYSAqIGM7IH0KKyAgCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhY2MoY29uc3QgRG91YmxlUGFja2V0JiBjLCBjb25zdCBSZXNQYWNrZXQmIGFscGhhLCBSZXNQYWNrZXQmIHIpIGNvbnN0CisgIHsKKyAgICAvLyBhc3NlbWJsZSBjCisgICAgUmVzUGFja2V0IHRtcDsKKyAgICBpZigoIUNvbmpMaHMpJiYoIUNvbmpSaHMpKQorICAgIHsKKyAgICAgIHRtcCA9IHBjcGx4ZmxpcChwY29uaihSZXNQYWNrZXQoYy5zZWNvbmQpKSk7CisgICAgICB0bXAgPSBwYWRkKFJlc1BhY2tldChjLmZpcnN0KSx0bXApOworICAgIH0KKyAgICBlbHNlIGlmKCghQ29uakxocykmJihDb25qUmhzKSkKKyAgICB7CisgICAgICB0bXAgPSBwY29uaihwY3BseGZsaXAoUmVzUGFja2V0KGMuc2Vjb25kKSkpOworICAgICAgdG1wID0gcGFkZChSZXNQYWNrZXQoYy5maXJzdCksdG1wKTsKKyAgICB9CisgICAgZWxzZSBpZigoQ29uakxocykmJighQ29ualJocykpCisgICAgeworICAgICAgdG1wID0gcGNwbHhmbGlwKFJlc1BhY2tldChjLnNlY29uZCkpOworICAgICAgdG1wID0gcGFkZChwY29uaihSZXNQYWNrZXQoYy5maXJzdCkpLHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYoKENvbmpMaHMpJiYoQ29ualJocykpCisgICAgeworICAgICAgdG1wID0gcGNwbHhmbGlwKFJlc1BhY2tldChjLnNlY29uZCkpOworICAgICAgdG1wID0gcHN1YihwY29uaihSZXNQYWNrZXQoYy5maXJzdCkpLHRtcCk7CisgICAgfQorICAgIAorICAgIHIgPSBwbWFkZCh0bXAsYWxwaGEscik7CisgIH0KKworcHJvdGVjdGVkOgorICBjb25qX2hlbHBlcjxMaHNTY2FsYXIsUmhzU2NhbGFyLENvbmpMaHMsQ29ualJocz4gY2o7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsU2NhbGFyLCBib29sIF9Db25qUmhzPgorY2xhc3MgZ2VicF90cmFpdHM8UmVhbFNjYWxhciwgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBmYWxzZSwgX0NvbmpSaHMgPgoreworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiAgU2NhbGFyOworICB0eXBlZGVmIFJlYWxTY2FsYXIgIExoc1NjYWxhcjsKKyAgdHlwZWRlZiBTY2FsYXIgICAgICBSaHNTY2FsYXI7CisgIHR5cGVkZWYgU2NhbGFyICAgICAgUmVzU2NhbGFyOworCisgIGVudW0geworICAgIENvbmpMaHMgPSBmYWxzZSwKKyAgICBDb25qUmhzID0gX0NvbmpSaHMsCisgICAgVmVjdG9yaXphYmxlID0gcGFja2V0X3RyYWl0czxSZWFsU2NhbGFyPjo6VmVjdG9yaXphYmxlCisgICAgICAgICAgICAgICAgJiYgcGFja2V0X3RyYWl0czxTY2FsYXI+OjpWZWN0b3JpemFibGUsCisgICAgTGhzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6c2l6ZSA6IDEsCisgICAgUmhzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6c2l6ZSA6IDEsCisgICAgUmVzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8UmVzU2NhbGFyPjo6c2l6ZSA6IDEsCisgICAgCisgICAgTnVtYmVyT2ZSZWdpc3RlcnMgPSBFSUdFTl9BUkNIX0RFRkFVTFRfTlVNQkVSX09GX1JFR0lTVEVSUywKKyAgICBuciA9IDQsCisgICAgbXIgPSAyKlJlc1BhY2tldFNpemUsCisgICAgV29ya1NwYWNlRmFjdG9yID0gbnIqUmhzUGFja2V0U2l6ZSwKKworICAgIExoc1Byb2dyZXNzID0gUmVzUGFja2V0U2l6ZSwKKyAgICBSaHNQcm9ncmVzcyA9IFJlc1BhY2tldFNpemUKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6dHlwZSAgX0xoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OnR5cGUgIF9SaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+Ojp0eXBlICBfUmVzUGFja2V0OworCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9MaHNQYWNrZXQsTGhzU2NhbGFyPjo6dHlwZSBMaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9SaHNQYWNrZXQsUmhzU2NhbGFyPjo6dHlwZSBSaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9SZXNQYWNrZXQsUmVzU2NhbGFyPjo6dHlwZSBSZXNQYWNrZXQ7CisKKyAgdHlwZWRlZiBSZXNQYWNrZXQgQWNjUGFja2V0OworCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBpbml0QWNjKEFjY1BhY2tldCYgcCkKKyAgeworICAgIHAgPSBwc2V0MTxSZXNQYWNrZXQ+KFJlc1NjYWxhcigwKSk7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgdW5wYWNrUmhzKERlbnNlSW5kZXggbiwgY29uc3QgUmhzU2NhbGFyKiByaHMsIFJoc1NjYWxhciogYikKKyAgeworICAgIGZvcihEZW5zZUluZGV4IGs9MDsgazxuOyBrKyspCisgICAgICBwc3RvcmUxPFJoc1BhY2tldD4oJmJbaypSaHNQYWNrZXRTaXplXSwgcmhzW2tdKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBsb2FkUmhzKGNvbnN0IFJoc1NjYWxhciogYiwgUmhzUGFja2V0JiBkZXN0KSBjb25zdAorICB7CisgICAgZGVzdCA9IHBsb2FkPFJoc1BhY2tldD4oYik7CisgIH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgbG9hZExocyhjb25zdCBMaHNTY2FsYXIqIGEsIExoc1BhY2tldCYgZGVzdCkgY29uc3QKKyAgeworICAgIGRlc3QgPSBwbG9hZGR1cDxMaHNQYWNrZXQ+KGEpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1hZGQoY29uc3QgTGhzUGFja2V0JiBhLCBjb25zdCBSaHNQYWNrZXQmIGIsIEFjY1BhY2tldCYgYywgUmhzUGFja2V0JiB0bXApIGNvbnN0CisgIHsKKyAgICBtYWRkX2ltcGwoYSwgYiwgYywgdG1wLCB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsdHJ1ZV90eXBlLGZhbHNlX3R5cGU+Ojp0eXBlKCkpOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1hZGRfaW1wbChjb25zdCBMaHNQYWNrZXQmIGEsIGNvbnN0IFJoc1BhY2tldCYgYiwgQWNjUGFja2V0JiBjLCBSaHNQYWNrZXQmIHRtcCwgY29uc3QgdHJ1ZV90eXBlJikgY29uc3QKKyAgeworICAgIHRtcCA9IGI7IHRtcC52ID0gcG11bChhLHRtcC52KTsgYyA9IHBhZGQoYyx0bXApOworICB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIG1hZGRfaW1wbChjb25zdCBMaHNTY2FsYXImIGEsIGNvbnN0IFJoc1NjYWxhciYgYiwgUmVzU2NhbGFyJiBjLCBSaHNTY2FsYXImIC8qdG1wKi8sIGNvbnN0IGZhbHNlX3R5cGUmKSBjb25zdAorICB7CisgICAgYyArPSBhICogYjsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBhY2MoY29uc3QgQWNjUGFja2V0JiBjLCBjb25zdCBSZXNQYWNrZXQmIGFscGhhLCBSZXNQYWNrZXQmIHIpIGNvbnN0CisgIHsKKyAgICByID0gY2oucG1hZGQoYWxwaGEsYyxyKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGNvbmpfaGVscGVyPFJlc1BhY2tldCxSZXNQYWNrZXQsZmFsc2UsQ29ualJocz4gY2o7Cit9OworCisvKiBvcHRpbWl6ZWQgR0VuZXJhbCBwYWNrZWQgQmxvY2sgKiBwYWNrZWQgUGFuZWwgcHJvZHVjdCBrZXJuZWwKKyAqCisgKiBNaXhpbmcgdHlwZSBsb2dpYzogQyArPSBBICogQgorICogIHwgIEEgIHwgIEIgIHwgY29tbWVudHMKKyAqICB8cmVhbCB8Y3BseCB8IG5vIHZlY3Rvcml6YXRpb24geWV0LCB3b3VsZCByZXF1aXJlIHRvIHBhY2sgQSB3aXRoIGR1cGxpY2F0aW9uCisgKiAgfGNwbHggfHJlYWwgfCBlYXN5IHZlY3Rvcml6YXRpb24KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgbXIsIGludCBuciwgYm9vbCBDb25qdWdhdGVMaHMsIGJvb2wgQ29uanVnYXRlUmhzPgorc3RydWN0IGdlYnBfa2VybmVsCit7CisgIHR5cGVkZWYgZ2VicF90cmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcixDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzPiBUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpSZXNTY2FsYXIgUmVzU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6TGhzUGFja2V0IExoc1BhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlJoc1BhY2tldCBSaHNQYWNrZXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpSZXNQYWNrZXQgUmVzUGFja2V0OworICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6QWNjUGFja2V0IEFjY1BhY2tldDsKKworICBlbnVtIHsKKyAgICBWZWN0b3JpemFibGUgID0gVHJhaXRzOjpWZWN0b3JpemFibGUsCisgICAgTGhzUHJvZ3Jlc3MgICA9IFRyYWl0czo6TGhzUHJvZ3Jlc3MsCisgICAgUmhzUHJvZ3Jlc3MgICA9IFRyYWl0czo6UmhzUHJvZ3Jlc3MsCisgICAgUmVzUGFja2V0U2l6ZSA9IFRyYWl0czo6UmVzUGFja2V0U2l6ZQorICB9OworCisgIEVJR0VOX0RPTlRfSU5MSU5FIEVJR0VOX0ZMQVRURU5fQVRUUklCCisgIHZvaWQgb3BlcmF0b3IoKShSZXNTY2FsYXIqIHJlcywgSW5kZXggcmVzU3RyaWRlLCBjb25zdCBMaHNTY2FsYXIqIGJsb2NrQSwgY29uc3QgUmhzU2NhbGFyKiBibG9ja0IsIEluZGV4IHJvd3MsIEluZGV4IGRlcHRoLCBJbmRleCBjb2xzLCBSZXNTY2FsYXIgYWxwaGEsCisgICAgICAgICAgICAgICAgICBJbmRleCBzdHJpZGVBPS0xLCBJbmRleCBzdHJpZGVCPS0xLCBJbmRleCBvZmZzZXRBPTAsIEluZGV4IG9mZnNldEI9MCwgUmhzU2NhbGFyKiB1bnBhY2tlZEIgPSAwKQorICB7CisgICAgVHJhaXRzIHRyYWl0czsKKyAgICAKKyAgICBpZihzdHJpZGVBPT0tMSkgc3RyaWRlQSA9IGRlcHRoOworICAgIGlmKHN0cmlkZUI9PS0xKSBzdHJpZGVCID0gZGVwdGg7CisgICAgY29ual9oZWxwZXI8TGhzU2NhbGFyLFJoc1NjYWxhcixDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzPiBjajsKKy8vICAgICBjb25qX2hlbHBlcjxMaHNQYWNrZXQsUmhzUGFja2V0LENvbmp1Z2F0ZUxocyxDb25qdWdhdGVSaHM+IHBjajsKKyAgICBJbmRleCBwYWNrZXRfY29scyA9IChjb2xzL25yKSAqIG5yOworICAgIGNvbnN0IEluZGV4IHBlZWxlZF9tYyA9IChyb3dzL21yKSptcjsKKyAgICAvLyBGSVhNRToKKyAgICBjb25zdCBJbmRleCBwZWVsZWRfbWMyID0gcGVlbGVkX21jICsgKHJvd3MtcGVlbGVkX21jID49IExoc1Byb2dyZXNzID8gTGhzUHJvZ3Jlc3MgOiAwKTsKKyAgICBjb25zdCBJbmRleCBwZWVsZWRfa2MgPSAoZGVwdGgvNCkqNDsKKworICAgIGlmKHVucGFja2VkQj09MCkKKyAgICAgIHVucGFja2VkQiA9IGNvbnN0X2Nhc3Q8UmhzU2NhbGFyKj4oYmxvY2tCIC0gc3RyaWRlQiAqIG5yICogUmhzUHJvZ3Jlc3MpOworCisgICAgLy8gbG9vcHMgb24gZWFjaCBtaWNybyB2ZXJ0aWNhbCBwYW5lbCBvZiByaHMgKGRlcHRoIHggbnIpCisgICAgZm9yKEluZGV4IGoyPTA7IGoyPHBhY2tldF9jb2xzOyBqMis9bnIpCisgICAgeworICAgICAgdHJhaXRzLnVucGFja1JocyhkZXB0aCpuciwmYmxvY2tCW2oyKnN0cmlkZUIrb2Zmc2V0Qipucl0sdW5wYWNrZWRCKTsgCisKKyAgICAgIC8vIGxvb3BzIG9uIGVhY2ggbGFyZ2VzdCBtaWNybyBob3Jpem9udGFsIHBhbmVsIG9mIGxocyAobXIgeCBkZXB0aCkKKyAgICAgIC8vID0+IHdlIHNlbGVjdCBhIG1yIHggbnIgbWljcm8gYmxvY2sgb2YgcmVzIHdoaWNoIGlzIGVudGlyZWx5CisgICAgICAvLyAgICBzdG9yZWQgaW50byBtci9wYWNrZXRfc2l6ZSB4IG5yIHJlZ2lzdGVycy4KKyAgICAgIGZvcihJbmRleCBpPTA7IGk8cGVlbGVkX21jOyBpKz1tcikKKyAgICAgIHsKKyAgICAgICAgY29uc3QgTGhzU2NhbGFyKiBibEEgPSAmYmxvY2tBW2kqc3RyaWRlQStvZmZzZXRBKm1yXTsKKyAgICAgICAgcHJlZmV0Y2goJmJsQVswXSk7CisKKyAgICAgICAgLy8gZ2V0cyByZXMgYmxvY2sgYXMgcmVnaXN0ZXIKKyAgICAgICAgQWNjUGFja2V0IEMwLCBDMSwgQzIsIEMzLCBDNCwgQzUsIEM2LCBDNzsKKyAgICAgICAgICAgICAgICAgIHRyYWl0cy5pbml0QWNjKEMwKTsKKyAgICAgICAgICAgICAgICAgIHRyYWl0cy5pbml0QWNjKEMxKTsKKyAgICAgICAgaWYobnI9PTQpIHRyYWl0cy5pbml0QWNjKEMyKTsKKyAgICAgICAgaWYobnI9PTQpIHRyYWl0cy5pbml0QWNjKEMzKTsKKyAgICAgICAgICAgICAgICAgIHRyYWl0cy5pbml0QWNjKEM0KTsKKyAgICAgICAgICAgICAgICAgIHRyYWl0cy5pbml0QWNjKEM1KTsKKyAgICAgICAgaWYobnI9PTQpIHRyYWl0cy5pbml0QWNjKEM2KTsKKyAgICAgICAgaWYobnI9PTQpIHRyYWl0cy5pbml0QWNjKEM3KTsKKworICAgICAgICBSZXNTY2FsYXIqIHIwID0gJnJlc1soajIrMCkqcmVzU3RyaWRlICsgaV07CisgICAgICAgIFJlc1NjYWxhciogcjEgPSByMCArIHJlc1N0cmlkZTsKKyAgICAgICAgUmVzU2NhbGFyKiByMiA9IHIxICsgcmVzU3RyaWRlOworICAgICAgICBSZXNTY2FsYXIqIHIzID0gcjIgKyByZXNTdHJpZGU7CisKKyAgICAgICAgcHJlZmV0Y2gocjArMTYpOworICAgICAgICBwcmVmZXRjaChyMSsxNik7CisgICAgICAgIHByZWZldGNoKHIyKzE2KTsKKyAgICAgICAgcHJlZmV0Y2gocjMrMTYpOworCisgICAgICAgIC8vIHBlcmZvcm1zICJpbm5lciIgcHJvZHVjdAorICAgICAgICAvLyBUT0RPIGxldCdzIGNoZWNrIHdldGhlciB0aGUgZm9sb3dpbmcgcGVlbGVkIGxvb3AgY291bGQgbm90IGJlCisgICAgICAgIC8vICAgICAgb3B0aW1pemVkIHZpYSBvcHRpbWFsIHByZWZldGNoaW5nIGZyb20gb25lIGxvb3AgdG8gdGhlIG90aGVyCisgICAgICAgIGNvbnN0IFJoc1NjYWxhciogYmxCID0gdW5wYWNrZWRCOworICAgICAgICBmb3IoSW5kZXggaz0wOyBrPHBlZWxlZF9rYzsgays9NCkKKyAgICAgICAgeworICAgICAgICAgIGlmKG5yPT0yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExoc1BhY2tldCBBMCwgQTE7CisgICAgICAgICAgICBSaHNQYWNrZXQgQl8wOworICAgICAgICAgICAgUmhzUGFja2V0IFQwOworICAgICAgICAgICAgCitFSUdFTl9BU01fQ09NTUVOVCgibXliZWdpbjIiKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbMCpMaHNQcm9ncmVzc10sIEEwKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbMSpMaHNQcm9ncmVzc10sIEExKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbMCpSaHNQcm9ncmVzc10sIEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCXzAsQzAsVDApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQl8wLEM0LEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzEqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQl8wLEMxLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEJfMCxDNSxCXzApOworCisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzIqTGhzUHJvZ3Jlc3NdLCBBMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzMqTGhzUHJvZ3Jlc3NdLCBBMSk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzIqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQl8wLEMwLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEJfMCxDNCxCXzApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlszKlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMSxUMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMSxCXzAsQzUsQl8wKTsKKworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVs0Kkxoc1Byb2dyZXNzXSwgQTApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVs1Kkxoc1Byb2dyZXNzXSwgQTEpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls0KlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxUMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMSxCXzAsQzQsQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbNSpSaHNQcm9ncmVzc10sIEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCXzAsQzEsVDApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQl8wLEM1LEJfMCk7CisKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbNipMaHNQcm9ncmVzc10sIEEwKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbNypMaHNQcm9ncmVzc10sIEExKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbNipSaHNQcm9ncmVzc10sIEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCXzAsQzAsVDApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQl8wLEM0LEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzcqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQl8wLEMxLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEJfMCxDNSxCXzApOworRUlHRU5fQVNNX0NPTU1FTlQoIm15ZW5kIik7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CitFSUdFTl9BU01fQ09NTUVOVCgibXliZWdpbjQiKTsKKyAgICAgICAgICAgIExoc1BhY2tldCBBMCwgQTE7CisgICAgICAgICAgICBSaHNQYWNrZXQgQl8wLCBCMSwgQjIsIEIzOworICAgICAgICAgICAgUmhzUGFja2V0IFQwOworICAgICAgICAgICAgCisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzAqTGhzUHJvZ3Jlc3NdLCBBMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzEqTGhzUHJvZ3Jlc3NdLCBBMSk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzAqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsxKlJoc1Byb2dyZXNzXSwgQjEpOworCisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCXzAsQzAsVDApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsyKlJoc1Byb2dyZXNzXSwgQjIpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQl8wLEM0LEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzMqUmhzUHJvZ3Jlc3NdLCBCMyk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzQqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjEsQzEsVDApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQjEsQzUsQjEpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls1KlJoc1Byb2dyZXNzXSwgQjEpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjIsQzIsVDApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQjIsQzYsQjIpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls2KlJoc1Byb2dyZXNzXSwgQjIpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjMsQzMsVDApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVsyKkxoc1Byb2dyZXNzXSwgQTApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQjMsQzcsQjMpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVszKkxoc1Byb2dyZXNzXSwgQTEpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls3KlJoc1Byb2dyZXNzXSwgQjMpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQl8wLEMwLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEJfMCxDNCxCXzApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls4KlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIxLEMxLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEIxLEM1LEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbOSpSaHNQcm9ncmVzc10sIEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIyLEMyLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEIyLEM2LEIyKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbMTAqUmhzUHJvZ3Jlc3NdLCBCMik7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCMyxDMyxUMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzQqTGhzUHJvZ3Jlc3NdLCBBMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMSxCMyxDNyxCMyk7CisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzUqTGhzUHJvZ3Jlc3NdLCBBMSk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzExKlJoc1Byb2dyZXNzXSwgQjMpOworCisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCXzAsQzAsVDApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQl8wLEM0LEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzEyKlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIxLEMxLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEIxLEM1LEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbMTMqUmhzUHJvZ3Jlc3NdLCBCMSk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCMixDMixUMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMSxCMixDNixCMik7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzE0KlJoc1Byb2dyZXNzXSwgQjIpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjMsQzMsVDApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVs2Kkxoc1Byb2dyZXNzXSwgQTApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQjMsQzcsQjMpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVs3Kkxoc1Byb2dyZXNzXSwgQTEpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsxNSpSaHNQcm9ncmVzc10sIEIzKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxUMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMSxCXzAsQzQsQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIxLEMxLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEIxLEM1LEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIyLEMyLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEIyLEM2LEIyKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIzLEMzLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEIzLEM3LEIzKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBibEIgKz0gNCpucipSaHNQcm9ncmVzczsKKyAgICAgICAgICBibEEgKz0gNCptcjsKKyAgICAgICAgfQorICAgICAgICAvLyBwcm9jZXNzIHJlbWFpbmluZyBwZWVsZWQgbG9vcAorICAgICAgICBmb3IoSW5kZXggaz1wZWVsZWRfa2M7IGs8ZGVwdGg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgIGlmKG5yPT0yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExoc1BhY2tldCBBMCwgQTE7CisgICAgICAgICAgICBSaHNQYWNrZXQgQl8wOworICAgICAgICAgICAgUmhzUGFja2V0IFQwOworCisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzAqTGhzUHJvZ3Jlc3NdLCBBMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzEqTGhzUHJvZ3Jlc3NdLCBBMSk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzAqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQl8wLEMwLFQwKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEExLEJfMCxDNCxCXzApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsxKlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMSxUMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMSxCXzAsQzUsQl8wKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExoc1BhY2tldCBBMCwgQTE7CisgICAgICAgICAgICBSaHNQYWNrZXQgQl8wLCBCMSwgQjIsIEIzOworICAgICAgICAgICAgUmhzUGFja2V0IFQwOworCisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzAqTGhzUHJvZ3Jlc3NdLCBBMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZExocygmYmxBWzEqTGhzUHJvZ3Jlc3NdLCBBMSk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzAqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsxKlJoc1Byb2dyZXNzXSwgQjEpOworCisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCXzAsQzAsVDApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsyKlJoc1Byb2dyZXNzXSwgQjIpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQl8wLEM0LEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzMqUmhzUHJvZ3Jlc3NdLCBCMyk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCMSxDMSxUMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMSxCMSxDNSxCMSk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCMixDMixUMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMSxCMixDNixCMik7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCMyxDMyxUMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMSxCMyxDNyxCMyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYmxCICs9IG5yKlJoc1Byb2dyZXNzOworICAgICAgICAgIGJsQSArPSBtcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKG5yPT00KQorICAgICAgICB7CisgICAgICAgICAgUmVzUGFja2V0IFIwLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2OworICAgICAgICAgIFJlc1BhY2tldCBhbHBoYXYgPSBwc2V0MTxSZXNQYWNrZXQ+KGFscGhhKTsKKworICAgICAgICAgIFIwID0gcGxvYWR1PFJlc1BhY2tldD4ocjApOworICAgICAgICAgIFIxID0gcGxvYWR1PFJlc1BhY2tldD4ocjEpOworICAgICAgICAgIFIyID0gcGxvYWR1PFJlc1BhY2tldD4ocjIpOworICAgICAgICAgIFIzID0gcGxvYWR1PFJlc1BhY2tldD4ocjMpOworICAgICAgICAgIFI0ID0gcGxvYWR1PFJlc1BhY2tldD4ocjAgKyBSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICBSNSA9IHBsb2FkdTxSZXNQYWNrZXQ+KHIxICsgUmVzUGFja2V0U2l6ZSk7CisgICAgICAgICAgUjYgPSBwbG9hZHU8UmVzUGFja2V0PihyMiArIFJlc1BhY2tldFNpemUpOworICAgICAgICAgIHRyYWl0cy5hY2MoQzAsIGFscGhhdiwgUjApOworICAgICAgICAgIHBzdG9yZXUocjAsIFIwKTsKKyAgICAgICAgICBSMCA9IHBsb2FkdTxSZXNQYWNrZXQ+KHIzICsgUmVzUGFja2V0U2l6ZSk7CisKKyAgICAgICAgICB0cmFpdHMuYWNjKEMxLCBhbHBoYXYsIFIxKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEMyLCBhbHBoYXYsIFIyKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEMzLCBhbHBoYXYsIFIzKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEM0LCBhbHBoYXYsIFI0KTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEM1LCBhbHBoYXYsIFI1KTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEM2LCBhbHBoYXYsIFI2KTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEM3LCBhbHBoYXYsIFIwKTsKKyAgICAgICAgICAKKyAgICAgICAgICBwc3RvcmV1KHIxLCBSMSk7CisgICAgICAgICAgcHN0b3JldShyMiwgUjIpOworICAgICAgICAgIHBzdG9yZXUocjMsIFIzKTsKKyAgICAgICAgICBwc3RvcmV1KHIwICsgUmVzUGFja2V0U2l6ZSwgUjQpOworICAgICAgICAgIHBzdG9yZXUocjEgKyBSZXNQYWNrZXRTaXplLCBSNSk7CisgICAgICAgICAgcHN0b3JldShyMiArIFJlc1BhY2tldFNpemUsIFI2KTsKKyAgICAgICAgICBwc3RvcmV1KHIzICsgUmVzUGFja2V0U2l6ZSwgUjApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFJlc1BhY2tldCBSMCwgUjEsIFI0OworICAgICAgICAgIFJlc1BhY2tldCBhbHBoYXYgPSBwc2V0MTxSZXNQYWNrZXQ+KGFscGhhKTsKKworICAgICAgICAgIFIwID0gcGxvYWR1PFJlc1BhY2tldD4ocjApOworICAgICAgICAgIFIxID0gcGxvYWR1PFJlc1BhY2tldD4ocjEpOworICAgICAgICAgIFI0ID0gcGxvYWR1PFJlc1BhY2tldD4ocjAgKyBSZXNQYWNrZXRTaXplKTsKKyAgICAgICAgICB0cmFpdHMuYWNjKEMwLCBhbHBoYXYsIFIwKTsKKyAgICAgICAgICBwc3RvcmV1KHIwLCBSMCk7CisgICAgICAgICAgUjAgPSBwbG9hZHU8UmVzUGFja2V0PihyMSArIFJlc1BhY2tldFNpemUpOworICAgICAgICAgIHRyYWl0cy5hY2MoQzEsIGFscGhhdiwgUjEpOworICAgICAgICAgIHRyYWl0cy5hY2MoQzQsIGFscGhhdiwgUjQpOworICAgICAgICAgIHRyYWl0cy5hY2MoQzUsIGFscGhhdiwgUjApOworICAgICAgICAgIHBzdG9yZXUocjEsIFIxKTsKKyAgICAgICAgICBwc3RvcmV1KHIwICsgUmVzUGFja2V0U2l6ZSwgUjQpOworICAgICAgICAgIHBzdG9yZXUocjEgKyBSZXNQYWNrZXRTaXplLCBSMCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICB9CisgICAgICAKKyAgICAgIGlmKHJvd3MtcGVlbGVkX21jPj1MaHNQcm9ncmVzcykKKyAgICAgIHsKKyAgICAgICAgSW5kZXggaSA9IHBlZWxlZF9tYzsKKyAgICAgICAgY29uc3QgTGhzU2NhbGFyKiBibEEgPSAmYmxvY2tBW2kqc3RyaWRlQStvZmZzZXRBKkxoc1Byb2dyZXNzXTsKKyAgICAgICAgcHJlZmV0Y2goJmJsQVswXSk7CisKKyAgICAgICAgLy8gZ2V0cyByZXMgYmxvY2sgYXMgcmVnaXN0ZXIKKyAgICAgICAgQWNjUGFja2V0IEMwLCBDMSwgQzIsIEMzOworICAgICAgICAgICAgICAgICAgdHJhaXRzLmluaXRBY2MoQzApOworICAgICAgICAgICAgICAgICAgdHJhaXRzLmluaXRBY2MoQzEpOworICAgICAgICBpZihucj09NCkgdHJhaXRzLmluaXRBY2MoQzIpOworICAgICAgICBpZihucj09NCkgdHJhaXRzLmluaXRBY2MoQzMpOworCisgICAgICAgIC8vIHBlcmZvcm1zICJpbm5lciIgcHJvZHVjdAorICAgICAgICBjb25zdCBSaHNTY2FsYXIqIGJsQiA9IHVucGFja2VkQjsKKyAgICAgICAgZm9yKEluZGV4IGs9MDsgazxwZWVsZWRfa2M7IGsrPTQpCisgICAgICAgIHsKKyAgICAgICAgICBpZihucj09MikKKyAgICAgICAgICB7CisgICAgICAgICAgICBMaHNQYWNrZXQgQTA7CisgICAgICAgICAgICBSaHNQYWNrZXQgQl8wLCBCMTsKKworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVswKkxoc1Byb2dyZXNzXSwgQTApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlswKlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbMSpSaHNQcm9ncmVzc10sIEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxCXzApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsyKlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIxLEMxLEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbMSpMaHNQcm9ncmVzc10sIEEwKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbMypSaHNQcm9ncmVzc10sIEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxCXzApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls0KlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIxLEMxLEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbMipMaHNQcm9ncmVzc10sIEEwKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbNSpSaHNQcm9ncmVzc10sIEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxCXzApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls2KlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIxLEMxLEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbMypMaHNQcm9ncmVzc10sIEEwKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbNypSaHNQcm9ncmVzc10sIEIxKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjEsQzEsQjEpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgTGhzUGFja2V0IEEwOworICAgICAgICAgICAgUmhzUGFja2V0IEJfMCwgQjEsIEIyLCBCMzsKKworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVswKkxoc1Byb2dyZXNzXSwgQTApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlswKlJoc1Byb2dyZXNzXSwgQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbMSpSaHNQcm9ncmVzc10sIEIxKTsKKworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQl8wLEMwLEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzIqUmhzUHJvZ3Jlc3NdLCBCMik7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzMqUmhzUHJvZ3Jlc3NdLCBCMyk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzQqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjEsQzEsQjEpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls1KlJoc1Byb2dyZXNzXSwgQjEpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjIsQzIsQjIpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls2KlJoc1Byb2dyZXNzXSwgQjIpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjMsQzMsQjMpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVsxKkxoc1Byb2dyZXNzXSwgQTApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls3KlJoc1Byb2dyZXNzXSwgQjMpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQl8wLEMwLEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzgqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjEsQzEsQjEpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQls5KlJoc1Byb2dyZXNzXSwgQjEpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjIsQzIsQjIpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsxMCpSaHNQcm9ncmVzc10sIEIyKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIzLEMzLEIzKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbMipMaHNQcm9ncmVzc10sIEEwKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbMTEqUmhzUHJvZ3Jlc3NdLCBCMyk7CisKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxCXzApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsxMipSaHNQcm9ncmVzc10sIEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCMSxDMSxCMSk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzEzKlJoc1Byb2dyZXNzXSwgQjEpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjIsQzIsQjIpOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsxNCpSaHNQcm9ncmVzc10sIEIyKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIzLEMzLEIzKTsKKworICAgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVszKkxoc1Byb2dyZXNzXSwgQTApOworICAgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoJmJsQlsxNSpSaHNQcm9ncmVzc10sIEIzKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjEsQzEsQjEpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjIsQzIsQjIpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjMsQzMsQjMpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJsQiArPSBucio0KlJoc1Byb2dyZXNzOworICAgICAgICAgIGJsQSArPSA0Kkxoc1Byb2dyZXNzOworICAgICAgICB9CisgICAgICAgIC8vIHByb2Nlc3MgcmVtYWluaW5nIHBlZWxlZCBsb29wCisgICAgICAgIGZvcihJbmRleCBrPXBlZWxlZF9rYzsgazxkZXB0aDsgaysrKQorICAgICAgICB7CisgICAgICAgICAgaWYobnI9PTIpCisgICAgICAgICAgeworICAgICAgICAgICAgTGhzUGFja2V0IEEwOworICAgICAgICAgICAgUmhzUGFja2V0IEJfMCwgQjE7CisKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbMCpMaHNQcm9ncmVzc10sIEEwKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbMCpSaHNQcm9ncmVzc10sIEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzEqUmhzUHJvZ3Jlc3NdLCBCMSk7CisgICAgICAgICAgICB0cmFpdHMubWFkZChBMCxCXzAsQzAsQl8wKTsKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEIxLEMxLEIxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExoc1BhY2tldCBBMDsKKyAgICAgICAgICAgIFJoc1BhY2tldCBCXzAsIEIxLCBCMiwgQjM7CisKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbMCpMaHNQcm9ncmVzc10sIEEwKTsKKyAgICAgICAgICAgIHRyYWl0cy5sb2FkUmhzKCZibEJbMCpSaHNQcm9ncmVzc10sIEJfMCk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzEqUmhzUHJvZ3Jlc3NdLCBCMSk7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzIqUmhzUHJvZ3Jlc3NdLCBCMik7CisgICAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzMqUmhzUHJvZ3Jlc3NdLCBCMyk7CisKKyAgICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxCXzApOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjEsQzEsQjEpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjIsQzIsQjIpOworICAgICAgICAgICAgdHJhaXRzLm1hZGQoQTAsQjMsQzMsQjMpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJsQiArPSBucipSaHNQcm9ncmVzczsKKyAgICAgICAgICBibEEgKz0gTGhzUHJvZ3Jlc3M7CisgICAgICAgIH0KKworICAgICAgICBSZXNQYWNrZXQgUjAsIFIxLCBSMiwgUjM7CisgICAgICAgIFJlc1BhY2tldCBhbHBoYXYgPSBwc2V0MTxSZXNQYWNrZXQ+KGFscGhhKTsKKworICAgICAgICBSZXNTY2FsYXIqIHIwID0gJnJlc1soajIrMCkqcmVzU3RyaWRlICsgaV07CisgICAgICAgIFJlc1NjYWxhciogcjEgPSByMCArIHJlc1N0cmlkZTsKKyAgICAgICAgUmVzU2NhbGFyKiByMiA9IHIxICsgcmVzU3RyaWRlOworICAgICAgICBSZXNTY2FsYXIqIHIzID0gcjIgKyByZXNTdHJpZGU7CisKKyAgICAgICAgICAgICAgICAgIFIwID0gcGxvYWR1PFJlc1BhY2tldD4ocjApOworICAgICAgICAgICAgICAgICAgUjEgPSBwbG9hZHU8UmVzUGFja2V0PihyMSk7CisgICAgICAgIGlmKG5yPT00KSBSMiA9IHBsb2FkdTxSZXNQYWNrZXQ+KHIyKTsKKyAgICAgICAgaWYobnI9PTQpIFIzID0gcGxvYWR1PFJlc1BhY2tldD4ocjMpOworCisgICAgICAgICAgICAgICAgICB0cmFpdHMuYWNjKEMwLCBhbHBoYXYsIFIwKTsKKyAgICAgICAgICAgICAgICAgIHRyYWl0cy5hY2MoQzEsIGFscGhhdiwgUjEpOworICAgICAgICBpZihucj09NCkgdHJhaXRzLmFjYyhDMiwgYWxwaGF2LCBSMik7CisgICAgICAgIGlmKG5yPT00KSB0cmFpdHMuYWNjKEMzLCBhbHBoYXYsIFIzKTsKKworICAgICAgICAgICAgICAgICAgcHN0b3JldShyMCwgUjApOworICAgICAgICAgICAgICAgICAgcHN0b3JldShyMSwgUjEpOworICAgICAgICBpZihucj09NCkgcHN0b3JldShyMiwgUjIpOworICAgICAgICBpZihucj09NCkgcHN0b3JldShyMywgUjMpOworICAgICAgfQorICAgICAgZm9yKEluZGV4IGk9cGVlbGVkX21jMjsgaTxyb3dzOyBpKyspCisgICAgICB7CisgICAgICAgIGNvbnN0IExoc1NjYWxhciogYmxBID0gJmJsb2NrQVtpKnN0cmlkZUErb2Zmc2V0QV07CisgICAgICAgIHByZWZldGNoKCZibEFbMF0pOworCisgICAgICAgIC8vIGdldHMgYSAxIHggbnIgcmVzIGJsb2NrIGFzIHJlZ2lzdGVycworICAgICAgICBSZXNTY2FsYXIgQzAoMCksIEMxKDApLCBDMigwKSwgQzMoMCk7CisgICAgICAgIC8vIFRPRE8gZGlyZWN0bHkgdXNlIGJsb2NrQiA/Pz8KKyAgICAgICAgY29uc3QgUmhzU2NhbGFyKiBibEIgPSAmYmxvY2tCW2oyKnN0cmlkZUIrb2Zmc2V0Qipucl07CisgICAgICAgIGZvcihJbmRleCBrPTA7IGs8ZGVwdGg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgIGlmKG5yPT0yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExoc1NjYWxhciBBMDsKKyAgICAgICAgICAgIFJoc1NjYWxhciBCXzAsIEIxOworCisgICAgICAgICAgICBBMCA9IGJsQVtrXTsKKyAgICAgICAgICAgIEJfMCA9IGJsQlswXTsKKyAgICAgICAgICAgIEIxID0gYmxCWzFdOworICAgICAgICAgICAgTUFERChjaixBMCxCXzAsQzAsQl8wKTsKKyAgICAgICAgICAgIE1BREQoY2osQTAsQjEsQzEsQjEpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgTGhzU2NhbGFyIEEwOworICAgICAgICAgICAgUmhzU2NhbGFyIEJfMCwgQjEsIEIyLCBCMzsKKworICAgICAgICAgICAgQTAgPSBibEFba107CisgICAgICAgICAgICBCXzAgPSBibEJbMF07CisgICAgICAgICAgICBCMSA9IGJsQlsxXTsKKyAgICAgICAgICAgIEIyID0gYmxCWzJdOworICAgICAgICAgICAgQjMgPSBibEJbM107CisKKyAgICAgICAgICAgIE1BREQoY2osQTAsQl8wLEMwLEJfMCk7CisgICAgICAgICAgICBNQUREKGNqLEEwLEIxLEMxLEIxKTsKKyAgICAgICAgICAgIE1BREQoY2osQTAsQjIsQzIsQjIpOworICAgICAgICAgICAgTUFERChjaixBMCxCMyxDMyxCMyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYmxCICs9IG5yOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICByZXNbKGoyKzApKnJlc1N0cmlkZSArIGldICs9IGFscGhhKkMwOworICAgICAgICAgICAgICAgICAgcmVzWyhqMisxKSpyZXNTdHJpZGUgKyBpXSArPSBhbHBoYSpDMTsKKyAgICAgICAgaWYobnI9PTQpIHJlc1soajIrMikqcmVzU3RyaWRlICsgaV0gKz0gYWxwaGEqQzI7CisgICAgICAgIGlmKG5yPT00KSByZXNbKGoyKzMpKnJlc1N0cmlkZSArIGldICs9IGFscGhhKkMzOworICAgICAgfQorICAgIH0KKyAgICAvLyBwcm9jZXNzIHJlbWFpbmluZyByaHMvcmVzIGNvbHVtbnMgb25lIGF0IGEgdGltZQorICAgIC8vID0+IGRvIHRoZSBzYW1lIGJ1dCB3aXRoIG5yPT0xCisgICAgZm9yKEluZGV4IGoyPXBhY2tldF9jb2xzOyBqMjxjb2xzOyBqMisrKQorICAgIHsKKyAgICAgIC8vIHVucGFjayBCCisgICAgICB0cmFpdHMudW5wYWNrUmhzKGRlcHRoLCAmYmxvY2tCW2oyKnN0cmlkZUIrb2Zmc2V0Ql0sIHVucGFja2VkQik7CisKKyAgICAgIGZvcihJbmRleCBpPTA7IGk8cGVlbGVkX21jOyBpKz1tcikKKyAgICAgIHsKKyAgICAgICAgY29uc3QgTGhzU2NhbGFyKiBibEEgPSAmYmxvY2tBW2kqc3RyaWRlQStvZmZzZXRBKm1yXTsKKyAgICAgICAgcHJlZmV0Y2goJmJsQVswXSk7CisKKyAgICAgICAgLy8gVE9ETyBtb3ZlIHRoZSByZXMgbG9hZHMgdG8gdGhlIHN0b3JlcworCisgICAgICAgIC8vIGdldCByZXMgYmxvY2sgYXMgcmVnaXN0ZXJzCisgICAgICAgIEFjY1BhY2tldCBDMCwgQzQ7CisgICAgICAgIHRyYWl0cy5pbml0QWNjKEMwKTsKKyAgICAgICAgdHJhaXRzLmluaXRBY2MoQzQpOworCisgICAgICAgIGNvbnN0IFJoc1NjYWxhciogYmxCID0gdW5wYWNrZWRCOworICAgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICBMaHNQYWNrZXQgQTAsIEExOworICAgICAgICAgIFJoc1BhY2tldCBCXzA7CisgICAgICAgICAgUmhzUGFja2V0IFQwOworCisgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoJmJsQVswKkxoc1Byb2dyZXNzXSwgQTApOworICAgICAgICAgIHRyYWl0cy5sb2FkTGhzKCZibEFbMSpMaHNQcm9ncmVzc10sIEExKTsKKyAgICAgICAgICB0cmFpdHMubG9hZFJocygmYmxCWzAqUmhzUHJvZ3Jlc3NdLCBCXzApOworICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLEJfMCxDMCxUMCk7CisgICAgICAgICAgdHJhaXRzLm1hZGQoQTEsQl8wLEM0LEJfMCk7CisKKyAgICAgICAgICBibEIgKz0gUmhzUHJvZ3Jlc3M7CisgICAgICAgICAgYmxBICs9IDIqTGhzUHJvZ3Jlc3M7CisgICAgICAgIH0KKyAgICAgICAgUmVzUGFja2V0IFIwLCBSNDsKKyAgICAgICAgUmVzUGFja2V0IGFscGhhdiA9IHBzZXQxPFJlc1BhY2tldD4oYWxwaGEpOworCisgICAgICAgIFJlc1NjYWxhciogcjAgPSAmcmVzWyhqMiswKSpyZXNTdHJpZGUgKyBpXTsKKworICAgICAgICBSMCA9IHBsb2FkdTxSZXNQYWNrZXQ+KHIwKTsKKyAgICAgICAgUjQgPSBwbG9hZHU8UmVzUGFja2V0PihyMCtSZXNQYWNrZXRTaXplKTsKKworICAgICAgICB0cmFpdHMuYWNjKEMwLCBhbHBoYXYsIFIwKTsKKyAgICAgICAgdHJhaXRzLmFjYyhDNCwgYWxwaGF2LCBSNCk7CisKKyAgICAgICAgcHN0b3JldShyMCwgICAgICAgICAgICAgICBSMCk7CisgICAgICAgIHBzdG9yZXUocjArUmVzUGFja2V0U2l6ZSwgUjQpOworICAgICAgfQorICAgICAgaWYocm93cy1wZWVsZWRfbWM+PUxoc1Byb2dyZXNzKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gcGVlbGVkX21jOworICAgICAgICBjb25zdCBMaHNTY2FsYXIqIGJsQSA9ICZibG9ja0FbaSpzdHJpZGVBK29mZnNldEEqTGhzUHJvZ3Jlc3NdOworICAgICAgICBwcmVmZXRjaCgmYmxBWzBdKTsKKworICAgICAgICBBY2NQYWNrZXQgQzA7CisgICAgICAgIHRyYWl0cy5pbml0QWNjKEMwKTsKKworICAgICAgICBjb25zdCBSaHNTY2FsYXIqIGJsQiA9IHVucGFja2VkQjsKKyAgICAgICAgZm9yKEluZGV4IGs9MDsgazxkZXB0aDsgaysrKQorICAgICAgICB7CisgICAgICAgICAgTGhzUGFja2V0IEEwOworICAgICAgICAgIFJoc1BhY2tldCBCXzA7CisgICAgICAgICAgdHJhaXRzLmxvYWRMaHMoYmxBLCBBMCk7CisgICAgICAgICAgdHJhaXRzLmxvYWRSaHMoYmxCLCBCXzApOworICAgICAgICAgIHRyYWl0cy5tYWRkKEEwLCBCXzAsIEMwLCBCXzApOworICAgICAgICAgIGJsQiArPSBSaHNQcm9ncmVzczsKKyAgICAgICAgICBibEEgKz0gTGhzUHJvZ3Jlc3M7CisgICAgICAgIH0KKworICAgICAgICBSZXNQYWNrZXQgYWxwaGF2ID0gcHNldDE8UmVzUGFja2V0PihhbHBoYSk7CisgICAgICAgIFJlc1BhY2tldCBSMCA9IHBsb2FkdTxSZXNQYWNrZXQ+KCZyZXNbKGoyKzApKnJlc1N0cmlkZSArIGldKTsKKyAgICAgICAgdHJhaXRzLmFjYyhDMCwgYWxwaGF2LCBSMCk7CisgICAgICAgIHBzdG9yZXUoJnJlc1soajIrMCkqcmVzU3RyaWRlICsgaV0sIFIwKTsKKyAgICAgIH0KKyAgICAgIGZvcihJbmRleCBpPXBlZWxlZF9tYzI7IGk8cm93czsgaSsrKQorICAgICAgeworICAgICAgICBjb25zdCBMaHNTY2FsYXIqIGJsQSA9ICZibG9ja0FbaSpzdHJpZGVBK29mZnNldEFdOworICAgICAgICBwcmVmZXRjaCgmYmxBWzBdKTsKKworICAgICAgICAvLyBnZXRzIGEgMSB4IDEgcmVzIGJsb2NrIGFzIHJlZ2lzdGVycworICAgICAgICBSZXNTY2FsYXIgQzAoMCk7CisgICAgICAgIC8vIEZJWE1FIGRpcmVjdGx5IHVzZSBibG9ja0IgPz8KKyAgICAgICAgY29uc3QgUmhzU2NhbGFyKiBibEIgPSAmYmxvY2tCW2oyKnN0cmlkZUIrb2Zmc2V0Ql07CisgICAgICAgIGZvcihJbmRleCBrPTA7IGs8ZGVwdGg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgIExoc1NjYWxhciBBMCA9IGJsQVtrXTsKKyAgICAgICAgICBSaHNTY2FsYXIgQl8wID0gYmxCW2tdOworICAgICAgICAgIE1BREQoY2osIEEwLCBCXzAsIEMwLCBCXzApOworICAgICAgICB9CisgICAgICAgIHJlc1soajIrMCkqcmVzU3RyaWRlICsgaV0gKz0gYWxwaGEqQzA7CisgICAgICB9CisgICAgfQorICB9Cit9OworCisjdW5kZWYgQ0pNQURECisKKy8vIHBhY2sgYSBibG9jayBvZiB0aGUgbGhzCisvLyBUaGUgdHJhdmVyc2FsIGlzIGFzIGZvbGxvdyAobXI9PTQpOgorLy8gICAwICA0ICA4IDEyIC4uLgorLy8gICAxICA1ICA5IDEzIC4uLgorLy8gICAyICA2IDEwIDE0IC4uLgorLy8gICAzICA3IDExIDE1IC4uLgorLy8KKy8vICAxNiAyMCAyNCAyOCAuLi4KKy8vICAxNyAyMSAyNSAyOSAuLi4KKy8vICAxOCAyMiAyNiAzMCAuLi4KKy8vICAxOSAyMyAyNyAzMSAuLi4KKy8vCisvLyAgMzIgMzMgMzQgMzUgLi4uCisvLyAgMzYgMzYgMzggMzkgLi4uCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgUGFjazEsIGludCBQYWNrMiwgaW50IFN0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGUsIGJvb2wgUGFuZWxNb2RlPgorc3RydWN0IGdlbW1fcGFja19saHMKK3sKKyAgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBvcGVyYXRvcigpKFNjYWxhciogYmxvY2tBLCBjb25zdCBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgSW5kZXggZGVwdGgsIEluZGV4IHJvd3MsCisgICAgICAgICAgICAgICAgICBJbmRleCBzdHJpZGU9MCwgSW5kZXggb2Zmc2V0PTApCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgICAgZW51bSB7IFBhY2tldFNpemUgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUgfTsKKworICAgIEVJR0VOX0FTTV9DT01NRU5UKCJFSUdFTiBQUk9EVUNUIFBBQ0sgTEhTIik7CisgICAgZWlnZW5fYXNzZXJ0KCgoIVBhbmVsTW9kZSkgJiYgc3RyaWRlPT0wICYmIG9mZnNldD09MCkgfHwgKFBhbmVsTW9kZSAmJiBzdHJpZGU+PWRlcHRoICYmIG9mZnNldDw9c3RyaWRlKSk7CisgICAgZWlnZW5fYXNzZXJ0KCAoU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgfHwgKChQYWNrMSVQYWNrZXRTaXplKT09MCAmJiBQYWNrMTw9NCpQYWNrZXRTaXplKSApOworICAgIGNvbmpfaWY8TnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBDb25qdWdhdGU+IGNqOworICAgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgU3RvcmFnZU9yZGVyPiBsaHMoX2xocyxsaHNTdHJpZGUpOworICAgIEluZGV4IGNvdW50ID0gMDsKKyAgICBJbmRleCBwZWVsZWRfbWMgPSAocm93cy9QYWNrMSkqUGFjazE7CisgICAgZm9yKEluZGV4IGk9MDsgaTxwZWVsZWRfbWM7IGkrPVBhY2sxKQorICAgIHsKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gUGFjazEgKiBvZmZzZXQ7CisKKyAgICAgIGlmKFN0b3JhZ2VPcmRlcj09Q29sTWFqb3IpCisgICAgICB7CisgICAgICAgIGZvcihJbmRleCBrPTA7IGs8ZGVwdGg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgIFBhY2tldCBBLCBCLCBDLCBEOworICAgICAgICAgIGlmKFBhY2sxPj0xKlBhY2tldFNpemUpIEEgPSBwbG9hZHU8UGFja2V0PigmbGhzKGkrMCpQYWNrZXRTaXplLCBrKSk7CisgICAgICAgICAgaWYoUGFjazE+PTIqUGFja2V0U2l6ZSkgQiA9IHBsb2FkdTxQYWNrZXQ+KCZsaHMoaSsxKlBhY2tldFNpemUsIGspKTsKKyAgICAgICAgICBpZihQYWNrMT49MypQYWNrZXRTaXplKSBDID0gcGxvYWR1PFBhY2tldD4oJmxocyhpKzIqUGFja2V0U2l6ZSwgaykpOworICAgICAgICAgIGlmKFBhY2sxPj00KlBhY2tldFNpemUpIEQgPSBwbG9hZHU8UGFja2V0PigmbGhzKGkrMypQYWNrZXRTaXplLCBrKSk7CisgICAgICAgICAgaWYoUGFjazE+PTEqUGFja2V0U2l6ZSkgeyBwc3RvcmUoYmxvY2tBK2NvdW50LCBjai5wY29uaihBKSk7IGNvdW50Kz1QYWNrZXRTaXplOyB9CisgICAgICAgICAgaWYoUGFjazE+PTIqUGFja2V0U2l6ZSkgeyBwc3RvcmUoYmxvY2tBK2NvdW50LCBjai5wY29uaihCKSk7IGNvdW50Kz1QYWNrZXRTaXplOyB9CisgICAgICAgICAgaWYoUGFjazE+PTMqUGFja2V0U2l6ZSkgeyBwc3RvcmUoYmxvY2tBK2NvdW50LCBjai5wY29uaihDKSk7IGNvdW50Kz1QYWNrZXRTaXplOyB9CisgICAgICAgICAgaWYoUGFjazE+PTQqUGFja2V0U2l6ZSkgeyBwc3RvcmUoYmxvY2tBK2NvdW50LCBjai5wY29uaihEKSk7IGNvdW50Kz1QYWNrZXRTaXplOyB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yKEluZGV4IGs9MDsgazxkZXB0aDsgaysrKQorICAgICAgICB7CisgICAgICAgICAgLy8gVE9ETyBhZGQgYSB2ZWN0b3JpemVkIHRyYW5zcG9zZSBoZXJlCisgICAgICAgICAgSW5kZXggdz0wOworICAgICAgICAgIGZvcig7IHc8UGFjazEtMzsgdys9NCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTY2FsYXIgYShjaihsaHMoaSt3KzAsIGspKSksCisgICAgICAgICAgICAgICAgICAgYihjaihsaHMoaSt3KzEsIGspKSksCisgICAgICAgICAgICAgICAgICAgYyhjaihsaHMoaSt3KzIsIGspKSksCisgICAgICAgICAgICAgICAgICAgZChjaihsaHMoaSt3KzMsIGspKSk7CisgICAgICAgICAgICBibG9ja0FbY291bnQrK10gPSBhOworICAgICAgICAgICAgYmxvY2tBW2NvdW50KytdID0gYjsKKyAgICAgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGM7CisgICAgICAgICAgICBibG9ja0FbY291bnQrK10gPSBkOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihQYWNrMSU0KQorICAgICAgICAgICAgZm9yKDt3PFBhY2sxOysrdykKKyAgICAgICAgICAgICAgYmxvY2tBW2NvdW50KytdID0gY2oobGhzKGkrdywgaykpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IFBhY2sxICogKHN0cmlkZS1vZmZzZXQtZGVwdGgpOworICAgIH0KKyAgICBpZihyb3dzLXBlZWxlZF9tYz49UGFjazIpCisgICAgeworICAgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSBQYWNrMipvZmZzZXQ7CisgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICAgIGZvcihJbmRleCB3PTA7IHc8UGFjazI7IHcrKykKKyAgICAgICAgICBibG9ja0FbY291bnQrK10gPSBjaihsaHMocGVlbGVkX21jK3csIGspKTsKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gUGFjazIgKiAoc3RyaWRlLW9mZnNldC1kZXB0aCk7CisgICAgICBwZWVsZWRfbWMgKz0gUGFjazI7CisgICAgfQorICAgIGZvcihJbmRleCBpPXBlZWxlZF9tYzsgaTxyb3dzOyBpKyspCisgICAgeworICAgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSBvZmZzZXQ7CisgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGNqKGxocyhpLCBrKSk7CisgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IChzdHJpZGUtb2Zmc2V0LWRlcHRoKTsKKyAgICB9CisgIH0KK307CisKKy8vIGNvcHkgYSBjb21wbGV0ZSBwYW5lbCBvZiB0aGUgcmhzCisvLyB0aGlzIHZlcnNpb24gaXMgb3B0aW1pemVkIGZvciBjb2x1bW4gbWFqb3IgbWF0cmljZXMKKy8vIFRoZSB0cmF2ZXJzYWwgb3JkZXIgaXMgYXMgZm9sbG93OiAobnI9PTQpOgorLy8gIDAgIDEgIDIgIDMgICAxMiAxMyAxNCAxNSAgIDI0IDI3CisvLyAgNCAgNSAgNiAgNyAgIDE2IDE3IDE4IDE5ICAgMjUgMjgKKy8vICA4ICA5IDEwIDExICAgMjAgMjEgMjIgMjMgICAyNiAyOQorLy8gIC4gIC4gIC4gIC4gICAgLiAgLiAgLiAgLiAgICAuICAuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgbnIsIGJvb2wgQ29uanVnYXRlLCBib29sIFBhbmVsTW9kZT4KK3N0cnVjdCBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIG5yLCBDb2xNYWpvciwgQ29uanVnYXRlLCBQYW5lbE1vZGU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgZW51bSB7IFBhY2tldFNpemUgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUgfTsKKyAgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBvcGVyYXRvcigpKFNjYWxhciogYmxvY2tCLCBjb25zdCBTY2FsYXIqIHJocywgSW5kZXggcmhzU3RyaWRlLCBJbmRleCBkZXB0aCwgSW5kZXggY29scywKKyAgICAgICAgICAgICAgICAgIEluZGV4IHN0cmlkZT0wLCBJbmRleCBvZmZzZXQ9MCkKKyAgeworICAgIEVJR0VOX0FTTV9DT01NRU5UKCJFSUdFTiBQUk9EVUNUIFBBQ0sgUkhTIENPTE1BSk9SIik7CisgICAgZWlnZW5fYXNzZXJ0KCgoIVBhbmVsTW9kZSkgJiYgc3RyaWRlPT0wICYmIG9mZnNldD09MCkgfHwgKFBhbmVsTW9kZSAmJiBzdHJpZGU+PWRlcHRoICYmIG9mZnNldDw9c3RyaWRlKSk7CisgICAgY29ual9pZjxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIENvbmp1Z2F0ZT4gY2o7CisgICAgSW5kZXggcGFja2V0X2NvbHMgPSAoY29scy9ucikgKiBucjsKKyAgICBJbmRleCBjb3VudCA9IDA7CisgICAgZm9yKEluZGV4IGoyPTA7IGoyPHBhY2tldF9jb2xzOyBqMis9bnIpCisgICAgeworICAgICAgLy8gc2tpcCB3aGF0IHdlIGhhdmUgYmVmb3JlCisgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IG5yICogb2Zmc2V0OworICAgICAgY29uc3QgU2NhbGFyKiBiMCA9ICZyaHNbKGoyKzApKnJoc1N0cmlkZV07CisgICAgICBjb25zdCBTY2FsYXIqIGIxID0gJnJoc1soajIrMSkqcmhzU3RyaWRlXTsKKyAgICAgIGNvbnN0IFNjYWxhciogYjIgPSAmcmhzWyhqMisyKSpyaHNTdHJpZGVdOworICAgICAgY29uc3QgU2NhbGFyKiBiMyA9ICZyaHNbKGoyKzMpKnJoc1N0cmlkZV07CisgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICB7CisgICAgICAgICAgICAgICAgICBibG9ja0JbY291bnQrMF0gPSBjaihiMFtrXSk7CisgICAgICAgICAgICAgICAgICBibG9ja0JbY291bnQrMV0gPSBjaihiMVtrXSk7CisgICAgICAgIGlmKG5yPT00KSBibG9ja0JbY291bnQrMl0gPSBjaihiMltrXSk7CisgICAgICAgIGlmKG5yPT00KSBibG9ja0JbY291bnQrM10gPSBjaihiM1trXSk7CisgICAgICAgIGNvdW50ICs9IG5yOworICAgICAgfQorICAgICAgLy8gc2tpcCB3aGF0IHdlIGhhdmUgYWZ0ZXIKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gbnIgKiAoc3RyaWRlLW9mZnNldC1kZXB0aCk7CisgICAgfQorCisgICAgLy8gY29weSB0aGUgcmVtYWluaW5nIGNvbHVtbnMgb25lIGF0IGEgdGltZSAobnI9PTEpCisgICAgZm9yKEluZGV4IGoyPXBhY2tldF9jb2xzOyBqMjxjb2xzOyArK2oyKQorICAgIHsKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gb2Zmc2V0OworICAgICAgY29uc3QgU2NhbGFyKiBiMCA9ICZyaHNbKGoyKzApKnJoc1N0cmlkZV07CisgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICB7CisgICAgICAgIGJsb2NrQltjb3VudF0gPSBjaihiMFtrXSk7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgICB9CisgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IChzdHJpZGUtb2Zmc2V0LWRlcHRoKTsKKyAgICB9CisgIH0KK307CisKKy8vIHRoaXMgdmVyc2lvbiBpcyBvcHRpbWl6ZWQgZm9yIHJvdyBtYWpvciBtYXRyaWNlcwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IG5yLCBib29sIENvbmp1Z2F0ZSwgYm9vbCBQYW5lbE1vZGU+CitzdHJ1Y3QgZ2VtbV9wYWNrX3JoczxTY2FsYXIsIEluZGV4LCBuciwgUm93TWFqb3IsIENvbmp1Z2F0ZSwgUGFuZWxNb2RlPgoreworICBlbnVtIHsgUGFja2V0U2l6ZSA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSB9OworICBFSUdFTl9ET05UX0lOTElORSB2b2lkIG9wZXJhdG9yKCkoU2NhbGFyKiBibG9ja0IsIGNvbnN0IFNjYWxhciogcmhzLCBJbmRleCByaHNTdHJpZGUsIEluZGV4IGRlcHRoLCBJbmRleCBjb2xzLAorICAgICAgICAgICAgICAgICAgSW5kZXggc3RyaWRlPTAsIEluZGV4IG9mZnNldD0wKQorICB7CisgICAgRUlHRU5fQVNNX0NPTU1FTlQoIkVJR0VOIFBST0RVQ1QgUEFDSyBSSFMgUk9XTUFKT1IiKTsKKyAgICBlaWdlbl9hc3NlcnQoKCghUGFuZWxNb2RlKSAmJiBzdHJpZGU9PTAgJiYgb2Zmc2V0PT0wKSB8fCAoUGFuZWxNb2RlICYmIHN0cmlkZT49ZGVwdGggJiYgb2Zmc2V0PD1zdHJpZGUpKTsKKyAgICBjb25qX2lmPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgQ29uanVnYXRlPiBjajsKKyAgICBJbmRleCBwYWNrZXRfY29scyA9IChjb2xzL25yKSAqIG5yOworICAgIEluZGV4IGNvdW50ID0gMDsKKyAgICBmb3IoSW5kZXggajI9MDsgajI8cGFja2V0X2NvbHM7IGoyKz1ucikKKyAgICB7CisgICAgICAvLyBza2lwIHdoYXQgd2UgaGF2ZSBiZWZvcmUKKyAgICAgIGlmKFBhbmVsTW9kZSkgY291bnQgKz0gbnIgKiBvZmZzZXQ7CisgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICB7CisgICAgICAgIGNvbnN0IFNjYWxhciogYjAgPSAmcmhzW2sqcmhzU3RyaWRlICsgajJdOworICAgICAgICAgICAgICAgICAgYmxvY2tCW2NvdW50KzBdID0gY2ooYjBbMF0pOworICAgICAgICAgICAgICAgICAgYmxvY2tCW2NvdW50KzFdID0gY2ooYjBbMV0pOworICAgICAgICBpZihucj09NCkgYmxvY2tCW2NvdW50KzJdID0gY2ooYjBbMl0pOworICAgICAgICBpZihucj09NCkgYmxvY2tCW2NvdW50KzNdID0gY2ooYjBbM10pOworICAgICAgICBjb3VudCArPSBucjsKKyAgICAgIH0KKyAgICAgIC8vIHNraXAgd2hhdCB3ZSBoYXZlIGFmdGVyCisgICAgICBpZihQYW5lbE1vZGUpIGNvdW50ICs9IG5yICogKHN0cmlkZS1vZmZzZXQtZGVwdGgpOworICAgIH0KKyAgICAvLyBjb3B5IHRoZSByZW1haW5pbmcgY29sdW1ucyBvbmUgYXQgYSB0aW1lIChucj09MSkKKyAgICBmb3IoSW5kZXggajI9cGFja2V0X2NvbHM7IGoyPGNvbHM7ICsrajIpCisgICAgeworICAgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSBvZmZzZXQ7CisgICAgICBjb25zdCBTY2FsYXIqIGIwID0gJnJoc1tqMl07CisgICAgICBmb3IoSW5kZXggaz0wOyBrPGRlcHRoOyBrKyspCisgICAgICB7CisgICAgICAgIGJsb2NrQltjb3VudF0gPSBjaihiMFtrKnJoc1N0cmlkZV0pOworICAgICAgICBjb3VudCArPSAxOworICAgICAgfQorICAgICAgaWYoUGFuZWxNb2RlKSBjb3VudCArPSBzdHJpZGUtb2Zmc2V0LWRlcHRoOworICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBccmV0dXJucyB0aGUgY3VycmVudGx5IHNldCBsZXZlbCAxIGNwdSBjYWNoZSBzaXplIChpbiBieXRlcykgdXNlZCB0byBlc3RpbWF0ZSB0aGUgaWRlYWwgYmxvY2tpbmcgc2l6ZSBwYXJhbWV0ZXJzLgorICAqIFxzYSBzZXRDcHVDYWNoZVNpemUgKi8KK2lubGluZSBzdGQ6OnB0cmRpZmZfdCBsMUNhY2hlU2l6ZSgpCit7CisgIHN0ZDo6cHRyZGlmZl90IGwxLCBsMjsKKyAgaW50ZXJuYWw6Om1hbmFnZV9jYWNoaW5nX3NpemVzKEdldEFjdGlvbiwgJmwxLCAmbDIpOworICByZXR1cm4gbDE7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgY3VycmVudGx5IHNldCBsZXZlbCAyIGNwdSBjYWNoZSBzaXplIChpbiBieXRlcykgdXNlZCB0byBlc3RpbWF0ZSB0aGUgaWRlYWwgYmxvY2tpbmcgc2l6ZSBwYXJhbWV0ZXJzLgorICAqIFxzYSBzZXRDcHVDYWNoZVNpemUgKi8KK2lubGluZSBzdGQ6OnB0cmRpZmZfdCBsMkNhY2hlU2l6ZSgpCit7CisgIHN0ZDo6cHRyZGlmZl90IGwxLCBsMjsKKyAgaW50ZXJuYWw6Om1hbmFnZV9jYWNoaW5nX3NpemVzKEdldEFjdGlvbiwgJmwxLCAmbDIpOworICByZXR1cm4gbDI7Cit9CisKKy8qKiBTZXQgdGhlIGNwdSBMMSBhbmQgTDIgY2FjaGUgc2l6ZXMgKGluIGJ5dGVzKS4KKyAgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZSB0byBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGJsb2NrcworICAqIGZvciB0aGUgYWxnb3JpdGhtcyB3b3JraW5nIHBlciBibG9ja3MuCisgICoKKyAgKiBcc2EgY29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzICovCitpbmxpbmUgdm9pZCBzZXRDcHVDYWNoZVNpemVzKHN0ZDo6cHRyZGlmZl90IGwxLCBzdGQ6OnB0cmRpZmZfdCBsMikKK3sKKyAgaW50ZXJuYWw6Om1hbmFnZV9jYWNoaW5nX3NpemVzKFNldEFjdGlvbiwgJmwxLCAmbDIpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSQUxfQkxPQ0tfUEFORUxfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTQ2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4LmgKQEAgLTAsMCArMSw0MjggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9ICisjZGVmaW5lIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTGhzU2NhbGFyLCB0eXBlbmFtZSBfUmhzU2NhbGFyPiBjbGFzcyBsZXZlbDNfYmxvY2tpbmc7CisKKy8qIFNwZWNpYWxpemF0aW9uIGZvciBhIHJvdy1tYWpvciBkZXN0aW5hdGlvbiBtYXRyaXggPT4gc2ltcGxlIHRyYW5zcG9zaXRpb24gb2YgdGhlIHByb2R1Y3QgKi8KK3RlbXBsYXRlPAorICB0eXBlbmFtZSBJbmRleCwKKyAgdHlwZW5hbWUgTGhzU2NhbGFyLCBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgdHlwZW5hbWUgUmhzU2NhbGFyLCBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocz4KK3N0cnVjdCBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxJbmRleCxMaHNTY2FsYXIsTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxSaHNTY2FsYXIsUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxSb3dNYWpvcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBzY2FsYXJfcHJvZHVjdF90cmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+OjpSZXR1cm5UeXBlIFJlc1NjYWxhcjsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oCisgICAgSW5kZXggcm93cywgSW5kZXggY29scywgSW5kZXggZGVwdGgsCisgICAgY29uc3QgTGhzU2NhbGFyKiBsaHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgICBjb25zdCBSaHNTY2FsYXIqIHJocywgSW5kZXggcmhzU3RyaWRlLAorICAgIFJlc1NjYWxhciogcmVzLCBJbmRleCByZXNTdHJpZGUsCisgICAgUmVzU2NhbGFyIGFscGhhLAorICAgIGxldmVsM19ibG9ja2luZzxSaHNTY2FsYXIsTGhzU2NhbGFyPiYgYmxvY2tpbmcsCisgICAgR2VtbVBhcmFsbGVsSW5mbzxJbmRleD4qIGluZm8gPSAwKQorICB7CisgICAgLy8gdHJhbnNwb3NlIHRoZSBwcm9kdWN0IHN1Y2ggdGhhdCB0aGUgcmVzdWx0IGlzIGNvbHVtbiBtYWpvcgorICAgIGdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PEluZGV4LAorICAgICAgUmhzU2NhbGFyLCBSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gQ29sTWFqb3IgOiBSb3dNYWpvciwgQ29uanVnYXRlUmhzLAorICAgICAgTGhzU2NhbGFyLCBMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gQ29sTWFqb3IgOiBSb3dNYWpvciwgQ29uanVnYXRlTGhzLAorICAgICAgQ29sTWFqb3I+CisgICAgOjpydW4oY29scyxyb3dzLGRlcHRoLHJocyxyaHNTdHJpZGUsbGhzLGxoc1N0cmlkZSxyZXMscmVzU3RyaWRlLGFscGhhLGJsb2NraW5nLGluZm8pOworICB9Cit9OworCisvKiAgU3BlY2lhbGl6YXRpb24gZm9yIGEgY29sLW1ham9yIGRlc3RpbmF0aW9uIG1hdHJpeAorICogICAgPT4gQmxvY2tpbmcgYWxnb3JpdGhtIGZvbGxvd2luZyBHb3RvJ3MgcGFwZXIgKi8KK3RlbXBsYXRlPAorICB0eXBlbmFtZSBJbmRleCwKKyAgdHlwZW5hbWUgTGhzU2NhbGFyLCBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgdHlwZW5hbWUgUmhzU2NhbGFyLCBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocz4KK3N0cnVjdCBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxJbmRleCxMaHNTY2FsYXIsTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxSaHNTY2FsYXIsUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj4KK3sKK3R5cGVkZWYgdHlwZW5hbWUgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CitzdGF0aWMgdm9pZCBydW4oSW5kZXggcm93cywgSW5kZXggY29scywgSW5kZXggZGVwdGgsCisgIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICBjb25zdCBSaHNTY2FsYXIqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwKKyAgUmVzU2NhbGFyKiByZXMsIEluZGV4IHJlc1N0cmlkZSwKKyAgUmVzU2NhbGFyIGFscGhhLAorICBsZXZlbDNfYmxvY2tpbmc8TGhzU2NhbGFyLFJoc1NjYWxhcj4mIGJsb2NraW5nLAorICBHZW1tUGFyYWxsZWxJbmZvPEluZGV4PiogaW5mbyA9IDApCit7CisgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8TGhzU2NhbGFyLCBJbmRleCwgTGhzU3RvcmFnZU9yZGVyPiBsaHMoX2xocyxsaHNTdHJpZGUpOworICBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFJoc1NjYWxhciwgSW5kZXgsIFJoc1N0b3JhZ2VPcmRlcj4gcmhzKF9yaHMscmhzU3RyaWRlKTsKKworICB0eXBlZGVmIGdlYnBfdHJhaXRzPExoc1NjYWxhcixSaHNTY2FsYXI+IFRyYWl0czsKKworICBJbmRleCBrYyA9IGJsb2NraW5nLmtjKCk7ICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIEsgZGlyZWN0aW9uCisgIEluZGV4IG1jID0gKHN0ZDo6bWluKShyb3dzLGJsb2NraW5nLm1jKCkpOyAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTSBkaXJlY3Rpb24KKyAgLy9JbmRleCBuYyA9IGJsb2NraW5nLm5jKCk7IC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIE4gZGlyZWN0aW9uCisKKyAgZ2VtbV9wYWNrX2xoczxMaHNTY2FsYXIsIEluZGV4LCBUcmFpdHM6Om1yLCBUcmFpdHM6Okxoc1Byb2dyZXNzLCBMaHNTdG9yYWdlT3JkZXI+IHBhY2tfbGhzOworICBnZW1tX3BhY2tfcmhzPFJoc1NjYWxhciwgSW5kZXgsIFRyYWl0czo6bnIsIFJoc1N0b3JhZ2VPcmRlcj4gcGFja19yaHM7CisgIGdlYnBfa2VybmVsPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpuciwgQ29uanVnYXRlTGhzLCBDb25qdWdhdGVSaHM+IGdlYnA7CisKKyNpZmRlZiBFSUdFTl9IQVNfT1BFTk1QCisgIGlmKGluZm8pCisgIHsKKyAgICAvLyB0aGlzIGlzIHRoZSBwYXJhbGxlbCB2ZXJzaW9uIQorICAgIEluZGV4IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgIEluZGV4IHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgCisgICAgc3RkOjpzaXplX3Qgc2l6ZUEgPSBrYyptYzsKKyAgICBzdGQ6OnNpemVfdCBzaXplVyA9IGtjKlRyYWl0czo6V29ya1NwYWNlRmFjdG9yOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShMaHNTY2FsYXIsIGJsb2NrQSwgc2l6ZUEsIDApOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShSaHNTY2FsYXIsIHcsIHNpemVXLCAwKTsKKyAgICAKKyAgICBSaHNTY2FsYXIqIGJsb2NrQiA9IGJsb2NraW5nLmJsb2NrQigpOworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChibG9ja0IhPTApOworCisgICAgLy8gRm9yIGVhY2ggaG9yaXpvbnRhbCBwYW5lbCBvZiB0aGUgcmhzLCBhbmQgY29ycmVzcG9uZGluZyB2ZXJ0aWNhbCBwYW5lbCBvZiB0aGUgbGhzLi4uCisgICAgZm9yKEluZGV4IGs9MDsgazxkZXB0aDsgays9a2MpCisgICAgeworICAgICAgY29uc3QgSW5kZXggYWN0dWFsX2tjID0gKHN0ZDo6bWluKShrK2tjLGRlcHRoKS1rOyAvLyA9PiByb3dzIG9mIEInLCBhbmQgY29scyBvZiB0aGUgQScKKworICAgICAgLy8gSW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBjaGFuY2UgdGhhdCBhIHRocmVhZCBoYXMgdG8gd2FpdCBmb3IgdGhlIG90aGVyLAorICAgICAgLy8gbGV0J3Mgc3RhcnQgYnkgcGFja2luZyBBJy4KKyAgICAgIHBhY2tfbGhzKGJsb2NrQSwgJmxocygwLGspLCBsaHNTdHJpZGUsIGFjdHVhbF9rYywgbWMpOworCisgICAgICAvLyBQYWNrIEJfayB0byBCJyBpbiBhIHBhcmFsbGVsIGZhc2hpb246CisgICAgICAvLyBlYWNoIHRocmVhZCBwYWNrcyB0aGUgc3ViIGJsb2NrIEJfayxqIHRvIEInX2ogd2hlcmUgaiBpcyB0aGUgdGhyZWFkIGlkLgorCisgICAgICAvLyBIb3dldmVyLCBiZWZvcmUgY29weWluZyB0byBCJ19qLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIG90aGVyIHRocmVhZCBpcyBzdGlsbCB1c2luZyBpdCwKKyAgICAgIC8vIGkuZS4sIHdlIHRlc3QgdGhhdCBpbmZvW3RpZF0udXNlcnMgZXF1YWxzIDAuCisgICAgICAvLyBUaGVuLCB3ZSBzZXQgaW5mb1t0aWRdLnVzZXJzIHRvIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBtYXJrIHRoYXQgYWxsIG90aGVyIHRocmVhZHMgYXJlIGdvaW5nIHRvIHVzZSBpdC4KKyAgICAgIHdoaWxlKGluZm9bdGlkXS51c2VycyE9MCkge30KKyAgICAgIGluZm9bdGlkXS51c2VycyArPSB0aHJlYWRzOworCisgICAgICBwYWNrX3JocyhibG9ja0IraW5mb1t0aWRdLnJoc19zdGFydCphY3R1YWxfa2MsICZyaHMoayxpbmZvW3RpZF0ucmhzX3N0YXJ0KSwgcmhzU3RyaWRlLCBhY3R1YWxfa2MsIGluZm9bdGlkXS5yaHNfbGVuZ3RoKTsKKworICAgICAgLy8gTm90aWZ5IHRoZSBvdGhlciB0aHJlYWRzIHRoYXQgdGhlIHBhcnQgQidfaiBpcyByZWFkeSB0byBnby4KKyAgICAgIGluZm9bdGlkXS5zeW5jID0gazsKKworICAgICAgLy8gQ29tcHV0ZXMgQ19pICs9IEEnICogQicgcGVyIEInX2oKKyAgICAgIGZvcihJbmRleCBzaGlmdD0wOyBzaGlmdDx0aHJlYWRzOyArK3NoaWZ0KQorICAgICAgeworICAgICAgICBJbmRleCBqID0gKHRpZCtzaGlmdCkldGhyZWFkczsKKworICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgQidfaiBoYXMgYmVlbiB1cGRhdGVkIGJ5IHRoZSB0aHJlYWQgaiwKKyAgICAgICAgLy8gd2UgdXNlIHRlc3RBbmRTZXRPcmRlcmVkIHRvIG1pbWljIGEgdm9sYXRpbGUgYWNjZXNzLgorICAgICAgICAvLyBIb3dldmVyLCBubyBuZWVkIHRvIHdhaXQgZm9yIHRoZSBCJyBwYXJ0IHdoaWNoIGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkIQorICAgICAgICBpZihzaGlmdD4wKQorICAgICAgICAgIHdoaWxlKGluZm9bal0uc3luYyE9aykge30KKworICAgICAgICBnZWJwKHJlcytpbmZvW2pdLnJoc19zdGFydCpyZXNTdHJpZGUsIHJlc1N0cmlkZSwgYmxvY2tBLCBibG9ja0IraW5mb1tqXS5yaHNfc3RhcnQqYWN0dWFsX2tjLCBtYywgYWN0dWFsX2tjLCBpbmZvW2pdLnJoc19sZW5ndGgsIGFscGhhLCAtMSwtMSwwLDAsIHcpOworICAgICAgfQorCisgICAgICAvLyBUaGVuIGtlZXAgZ29pbmcgYXMgdXN1YWwgd2l0aCB0aGUgcmVtYWluaW5nIEEnCisgICAgICBmb3IoSW5kZXggaT1tYzsgaTxyb3dzOyBpKz1tYykKKyAgICAgIHsKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShpK21jLHJvd3MpLWk7CisKKyAgICAgICAgLy8gcGFjayBBX2ksayB0byBBJworICAgICAgICBwYWNrX2xocyhibG9ja0EsICZsaHMoaSxrKSwgbGhzU3RyaWRlLCBhY3R1YWxfa2MsIGFjdHVhbF9tYyk7CisKKyAgICAgICAgLy8gQ19pICs9IEEnICogQicKKyAgICAgICAgZ2VicChyZXMraSwgcmVzU3RyaWRlLCBibG9ja0EsIGJsb2NrQiwgYWN0dWFsX21jLCBhY3R1YWxfa2MsIGNvbHMsIGFscGhhLCAtMSwtMSwwLDAsIHcpOworICAgICAgfQorCisgICAgICAvLyBSZWxlYXNlIGFsbCB0aGUgc3ViIGJsb2NrcyBCJ19qIG9mIEInIGZvciB0aGUgY3VycmVudCB0aHJlYWQsCisgICAgICAvLyBpLmUuLCB3ZSBzaW1wbHkgZGVjcmVtZW50IHRoZSBudW1iZXIgb2YgdXNlcnMgYnkgMQorICAgICAgZm9yKEluZGV4IGo9MDsgajx0aHJlYWRzOyArK2opCisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICAtLShpbmZvW2pdLnVzZXJzKTsKKyAgICB9CisgIH0KKyAgZWxzZQorI2VuZGlmIC8vIEVJR0VOX0hBU19PUEVOTVAKKyAgeworICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKTsKKworICAgIC8vIHRoaXMgaXMgdGhlIHNlcXVlbnRpYWwgdmVyc2lvbiEKKyAgICBzdGQ6OnNpemVfdCBzaXplQSA9IGtjKm1jOworICAgIHN0ZDo6c2l6ZV90IHNpemVCID0ga2MqY29sczsKKyAgICBzdGQ6OnNpemVfdCBzaXplVyA9IGtjKlRyYWl0czo6V29ya1NwYWNlRmFjdG9yOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKExoc1NjYWxhciwgYmxvY2tBLCBzaXplQSwgYmxvY2tpbmcuYmxvY2tBKCkpOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShSaHNTY2FsYXIsIGJsb2NrQiwgc2l6ZUIsIGJsb2NraW5nLmJsb2NrQigpKTsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoUmhzU2NhbGFyLCBibG9ja1csIHNpemVXLCBibG9ja2luZy5ibG9ja1coKSk7CisKKyAgICAvLyBGb3IgZWFjaCBob3Jpem9udGFsIHBhbmVsIG9mIHRoZSByaHMsIGFuZCBjb3JyZXNwb25kaW5nIHBhbmVsIG9mIHRoZSBsaHMuLi4KKyAgICAvLyAoPT1HRU1NX1ZBUjEpCisgICAgZm9yKEluZGV4IGsyPTA7IGsyPGRlcHRoOyBrMis9a2MpCisgICAgeworICAgICAgY29uc3QgSW5kZXggYWN0dWFsX2tjID0gKHN0ZDo6bWluKShrMitrYyxkZXB0aCktazI7CisKKyAgICAgIC8vIE9LLCBoZXJlIHdlIGhhdmUgc2VsZWN0ZWQgb25lIGhvcml6b250YWwgcGFuZWwgb2YgcmhzIGFuZCBvbmUgdmVydGljYWwgcGFuZWwgb2YgbGhzLgorICAgICAgLy8gPT4gUGFjayByaHMncyBwYW5lbCBpbnRvIGEgc2VxdWVudGlhbCBjaHVuayBvZiBtZW1vcnkgKEwyIGNhY2hpbmcpCisgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBwYW5lbCB3aWxsIGJlIHJlYWQgYXMgbWFueSB0aW1lcyBhcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgbGhzJ3MKKyAgICAgIC8vIHZlcnRpY2FsIHBhbmVsIHdoaWNoIGlzLCBpbiBwcmFjdGljZSwgYSB2ZXJ5IGxvdyBudW1iZXIuCisgICAgICBwYWNrX3JocyhibG9ja0IsICZyaHMoazIsMCksIHJoc1N0cmlkZSwgYWN0dWFsX2tjLCBjb2xzKTsKKworCisgICAgICAvLyBGb3IgZWFjaCBtYyB4IGtjIGJsb2NrIG9mIHRoZSBsaHMncyB2ZXJ0aWNhbCBwYW5lbC4uLgorICAgICAgLy8gKD09R0VQUF9WQVIxKQorICAgICAgZm9yKEluZGV4IGkyPTA7IGkyPHJvd3M7IGkyKz1tYykKKyAgICAgIHsKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShpMittYyxyb3dzKS1pMjsKKworICAgICAgICAvLyBXZSBwYWNrIHRoZSBsaHMncyBibG9jayBpbnRvIGEgc2VxdWVudGlhbCBjaHVuayBvZiBtZW1vcnkgKEwxIGNhY2hpbmcpCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGJsb2NrIHdpbGwgYmUgcmVhZCBhIHZlcnkgaGlnaCBudW1iZXIgb2YgdGltZXMsIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKKyAgICAgICAgLy8gbWljcm8gdmVydGljYWwgcGFuZWwgb2YgdGhlIGxhcmdlIHJocydzIHBhbmVsIChlLmcuLCBjb2xzLzQgdGltZXMpLgorICAgICAgICBwYWNrX2xocyhibG9ja0EsICZsaHMoaTIsazIpLCBsaHNTdHJpZGUsIGFjdHVhbF9rYywgYWN0dWFsX21jKTsKKworICAgICAgICAvLyBFdmVyeXRoaW5nIGlzIHBhY2tlZCwgd2UgY2FuIG5vdyBjYWxsIHRoZSBibG9jayAqIHBhbmVsIGtlcm5lbDoKKyAgICAgICAgZ2VicChyZXMraTIsIHJlc1N0cmlkZSwgYmxvY2tBLCBibG9ja0IsIGFjdHVhbF9tYywgYWN0dWFsX2tjLCBjb2xzLCBhbHBoYSwgLTEsIC0xLCAwLCAwLCBibG9ja1cpOworCisgICAgICB9CisgICAgfQorICB9Cit9CisKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFNwZWNpYWxpemF0aW9uIG9mIEdlbmVyYWxQcm9kdWN0PD4gZm9yICJsYXJnZSIgR0VNTSwgaS5lLiwKKyogIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoaWdoIGxldmVsIHdyYXBwZXIgdG8gZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czxHZW5lcmFsUHJvZHVjdDxMaHMsUmhzLEdlbW1Qcm9kdWN0PiA+CisgOiB0cmFpdHM8UHJvZHVjdEJhc2U8R2VuZXJhbFByb2R1Y3Q8TGhzLFJocyxHZW1tUHJvZHVjdD4sIExocywgUmhzPiA+Cit7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgR2VtbSwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3QsIHR5cGVuYW1lIEJsb2NraW5nVHlwZT4KK3N0cnVjdCBnZW1tX2Z1bmN0b3IKK3sKKyAgZ2VtbV9mdW5jdG9yKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgRGVzdCYgZGVzdCwgU2NhbGFyIGFjdHVhbEFscGhhLAorICAgICAgICAgICAgICAgICAgQmxvY2tpbmdUeXBlJiBibG9ja2luZykKKyAgICA6IG1fbGhzKGxocyksIG1fcmhzKHJocyksIG1fZGVzdChkZXN0KSwgbV9hY3R1YWxBbHBoYShhY3R1YWxBbHBoYSksIG1fYmxvY2tpbmcoYmxvY2tpbmcpCisgIHt9CisKKyAgdm9pZCBpbml0UGFyYWxsZWxTZXNzaW9uKCkgY29uc3QKKyAgeworICAgIG1fYmxvY2tpbmcuYWxsb2NhdGVCKCk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yKCkgKEluZGV4IHJvdywgSW5kZXggcm93cywgSW5kZXggY29sPTAsIEluZGV4IGNvbHM9LTEsIEdlbW1QYXJhbGxlbEluZm88SW5kZXg+KiBpbmZvPTApIGNvbnN0CisgIHsKKyAgICBpZihjb2xzPT0tMSkKKyAgICAgIGNvbHMgPSBtX3Jocy5jb2xzKCk7CisKKyAgICBHZW1tOjpydW4ocm93cywgY29scywgbV9saHMuY29scygpLAorICAgICAgICAgICAgICAvKihjb25zdCBTY2FsYXIqKSovJm1fbGhzLmNvZWZmUmVmKHJvdywwKSwgbV9saHMub3V0ZXJTdHJpZGUoKSwKKyAgICAgICAgICAgICAgLyooY29uc3QgU2NhbGFyKikqLyZtX3Jocy5jb2VmZlJlZigwLGNvbCksIG1fcmhzLm91dGVyU3RyaWRlKCksCisgICAgICAgICAgICAgIChTY2FsYXIqKSYobV9kZXN0LmNvZWZmUmVmKHJvdyxjb2wpKSwgbV9kZXN0Lm91dGVyU3RyaWRlKCksCisgICAgICAgICAgICAgIG1fYWN0dWFsQWxwaGEsIG1fYmxvY2tpbmcsIGluZm8pOworICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IExocyYgbV9saHM7CisgICAgY29uc3QgUmhzJiBtX3JoczsKKyAgICBEZXN0JiBtX2Rlc3Q7CisgICAgU2NhbGFyIG1fYWN0dWFsQWxwaGE7CisgICAgQmxvY2tpbmdUeXBlJiBtX2Jsb2NraW5nOworfTsKKwordGVtcGxhdGU8aW50IFN0b3JhZ2VPcmRlciwgdHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGludCBNYXhSb3dzLCBpbnQgTWF4Q29scywgaW50IE1heERlcHRoLCBpbnQgS2NGYWN0b3I9MSwKK2Jvb2wgRmluaXRlQXRDb21waWxlVGltZSA9IE1heFJvd3MhPUR5bmFtaWMgJiYgTWF4Q29scyE9RHluYW1pYyAmJiBNYXhEZXB0aCAhPSBEeW5hbWljPiBjbGFzcyBnZW1tX2Jsb2NraW5nX3NwYWNlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTGhzU2NhbGFyLCB0eXBlbmFtZSBfUmhzU2NhbGFyPgorY2xhc3MgbGV2ZWwzX2Jsb2NraW5nCit7CisgICAgdHlwZWRlZiBfTGhzU2NhbGFyIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmIF9SaHNTY2FsYXIgUmhzU2NhbGFyOworCisgIHByb3RlY3RlZDoKKyAgICBMaHNTY2FsYXIqIG1fYmxvY2tBOworICAgIFJoc1NjYWxhciogbV9ibG9ja0I7CisgICAgUmhzU2NhbGFyKiBtX2Jsb2NrVzsKKworICAgIERlbnNlSW5kZXggbV9tYzsKKyAgICBEZW5zZUluZGV4IG1fbmM7CisgICAgRGVuc2VJbmRleCBtX2tjOworCisgIHB1YmxpYzoKKworICAgIGxldmVsM19ibG9ja2luZygpCisgICAgICA6IG1fYmxvY2tBKDApLCBtX2Jsb2NrQigwKSwgbV9ibG9ja1coMCksIG1fbWMoMCksIG1fbmMoMCksIG1fa2MoMCkKKyAgICB7fQorCisgICAgaW5saW5lIERlbnNlSW5kZXggbWMoKSBjb25zdCB7IHJldHVybiBtX21jOyB9CisgICAgaW5saW5lIERlbnNlSW5kZXggbmMoKSBjb25zdCB7IHJldHVybiBtX25jOyB9CisgICAgaW5saW5lIERlbnNlSW5kZXgga2MoKSBjb25zdCB7IHJldHVybiBtX2tjOyB9CisKKyAgICBpbmxpbmUgTGhzU2NhbGFyKiBibG9ja0EoKSB7IHJldHVybiBtX2Jsb2NrQTsgfQorICAgIGlubGluZSBSaHNTY2FsYXIqIGJsb2NrQigpIHsgcmV0dXJuIG1fYmxvY2tCOyB9CisgICAgaW5saW5lIFJoc1NjYWxhciogYmxvY2tXKCkgeyByZXR1cm4gbV9ibG9ja1c7IH0KK307CisKK3RlbXBsYXRlPGludCBTdG9yYWdlT3JkZXIsIHR5cGVuYW1lIF9MaHNTY2FsYXIsIHR5cGVuYW1lIF9SaHNTY2FsYXIsIGludCBNYXhSb3dzLCBpbnQgTWF4Q29scywgaW50IE1heERlcHRoLCBpbnQgS2NGYWN0b3I+CitjbGFzcyBnZW1tX2Jsb2NraW5nX3NwYWNlPFN0b3JhZ2VPcmRlcixfTGhzU2NhbGFyLF9SaHNTY2FsYXIsTWF4Um93cywgTWF4Q29scywgTWF4RGVwdGgsIEtjRmFjdG9yLCB0cnVlPgorICA6IHB1YmxpYyBsZXZlbDNfYmxvY2tpbmc8CisgICAgICB0eXBlbmFtZSBjb25kaXRpb25hbDxTdG9yYWdlT3JkZXI9PVJvd01ham9yLF9SaHNTY2FsYXIsX0xoc1NjYWxhcj46OnR5cGUsCisgICAgICB0eXBlbmFtZSBjb25kaXRpb25hbDxTdG9yYWdlT3JkZXI9PVJvd01ham9yLF9MaHNTY2FsYXIsX1Joc1NjYWxhcj46OnR5cGU+Cit7CisgICAgZW51bSB7CisgICAgICBUcmFuc3Bvc2UgPSBTdG9yYWdlT3JkZXI9PVJvd01ham9yLAorICAgICAgQWN0dWFsUm93cyA9IFRyYW5zcG9zZSA/IE1heENvbHMgOiBNYXhSb3dzLAorICAgICAgQWN0dWFsQ29scyA9IFRyYW5zcG9zZSA/IE1heFJvd3MgOiBNYXhDb2xzCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFRyYW5zcG9zZSxfUmhzU2NhbGFyLF9MaHNTY2FsYXI+Ojp0eXBlIExoc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFRyYW5zcG9zZSxfTGhzU2NhbGFyLF9SaHNTY2FsYXI+Ojp0eXBlIFJoc1NjYWxhcjsKKyAgICB0eXBlZGVmIGdlYnBfdHJhaXRzPExoc1NjYWxhcixSaHNTY2FsYXI+IFRyYWl0czsKKyAgICBlbnVtIHsKKyAgICAgIFNpemVBID0gQWN0dWFsUm93cyAqIE1heERlcHRoLAorICAgICAgU2l6ZUIgPSBBY3R1YWxDb2xzICogTWF4RGVwdGgsCisgICAgICBTaXplVyA9IE1heERlcHRoICogVHJhaXRzOjpXb3JrU3BhY2VGYWN0b3IKKyAgICB9OworCisgICAgRUlHRU5fQUxJR04xNiBMaHNTY2FsYXIgbV9zdGF0aWNBW1NpemVBXTsKKyAgICBFSUdFTl9BTElHTjE2IFJoc1NjYWxhciBtX3N0YXRpY0JbU2l6ZUJdOworICAgIEVJR0VOX0FMSUdOMTYgUmhzU2NhbGFyIG1fc3RhdGljV1tTaXplV107CisKKyAgcHVibGljOgorCisgICAgZ2VtbV9ibG9ja2luZ19zcGFjZShEZW5zZUluZGV4IC8qcm93cyovLCBEZW5zZUluZGV4IC8qY29scyovLCBEZW5zZUluZGV4IC8qZGVwdGgqLykKKyAgICB7CisgICAgICB0aGlzLT5tX21jID0gQWN0dWFsUm93czsKKyAgICAgIHRoaXMtPm1fbmMgPSBBY3R1YWxDb2xzOworICAgICAgdGhpcy0+bV9rYyA9IE1heERlcHRoOworICAgICAgdGhpcy0+bV9ibG9ja0EgPSBtX3N0YXRpY0E7CisgICAgICB0aGlzLT5tX2Jsb2NrQiA9IG1fc3RhdGljQjsKKyAgICAgIHRoaXMtPm1fYmxvY2tXID0gbV9zdGF0aWNXOworICAgIH0KKworICAgIGlubGluZSB2b2lkIGFsbG9jYXRlQSgpIHt9CisgICAgaW5saW5lIHZvaWQgYWxsb2NhdGVCKCkge30KKyAgICBpbmxpbmUgdm9pZCBhbGxvY2F0ZVcoKSB7fQorICAgIGlubGluZSB2b2lkIGFsbG9jYXRlQWxsKCkge30KK307CisKK3RlbXBsYXRlPGludCBTdG9yYWdlT3JkZXIsIHR5cGVuYW1lIF9MaHNTY2FsYXIsIHR5cGVuYW1lIF9SaHNTY2FsYXIsIGludCBNYXhSb3dzLCBpbnQgTWF4Q29scywgaW50IE1heERlcHRoLCBpbnQgS2NGYWN0b3I+CitjbGFzcyBnZW1tX2Jsb2NraW5nX3NwYWNlPFN0b3JhZ2VPcmRlcixfTGhzU2NhbGFyLF9SaHNTY2FsYXIsTWF4Um93cywgTWF4Q29scywgTWF4RGVwdGgsIEtjRmFjdG9yLCBmYWxzZT4KKyAgOiBwdWJsaWMgbGV2ZWwzX2Jsb2NraW5nPAorICAgICAgdHlwZW5hbWUgY29uZGl0aW9uYWw8U3RvcmFnZU9yZGVyPT1Sb3dNYWpvcixfUmhzU2NhbGFyLF9MaHNTY2FsYXI+Ojp0eXBlLAorICAgICAgdHlwZW5hbWUgY29uZGl0aW9uYWw8U3RvcmFnZU9yZGVyPT1Sb3dNYWpvcixfTGhzU2NhbGFyLF9SaHNTY2FsYXI+Ojp0eXBlPgoreworICAgIGVudW0geworICAgICAgVHJhbnNwb3NlID0gU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcgorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxUcmFuc3Bvc2UsX1Joc1NjYWxhcixfTGhzU2NhbGFyPjo6dHlwZSBMaHNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxUcmFuc3Bvc2UsX0xoc1NjYWxhcixfUmhzU2NhbGFyPjo6dHlwZSBSaHNTY2FsYXI7CisgICAgdHlwZWRlZiBnZWJwX3RyYWl0czxMaHNTY2FsYXIsUmhzU2NhbGFyPiBUcmFpdHM7CisKKyAgICBEZW5zZUluZGV4IG1fc2l6ZUE7CisgICAgRGVuc2VJbmRleCBtX3NpemVCOworICAgIERlbnNlSW5kZXggbV9zaXplVzsKKworICBwdWJsaWM6CisKKyAgICBnZW1tX2Jsb2NraW5nX3NwYWNlKERlbnNlSW5kZXggcm93cywgRGVuc2VJbmRleCBjb2xzLCBEZW5zZUluZGV4IGRlcHRoKQorICAgIHsKKyAgICAgIHRoaXMtPm1fbWMgPSBUcmFuc3Bvc2UgPyBjb2xzIDogcm93czsKKyAgICAgIHRoaXMtPm1fbmMgPSBUcmFuc3Bvc2UgPyByb3dzIDogY29sczsKKyAgICAgIHRoaXMtPm1fa2MgPSBkZXB0aDsKKworICAgICAgY29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPExoc1NjYWxhcixSaHNTY2FsYXIsS2NGYWN0b3I+KHRoaXMtPm1fa2MsIHRoaXMtPm1fbWMsIHRoaXMtPm1fbmMpOworICAgICAgbV9zaXplQSA9IHRoaXMtPm1fbWMgKiB0aGlzLT5tX2tjOworICAgICAgbV9zaXplQiA9IHRoaXMtPm1fa2MgKiB0aGlzLT5tX25jOworICAgICAgbV9zaXplVyA9IHRoaXMtPm1fa2MqVHJhaXRzOjpXb3JrU3BhY2VGYWN0b3I7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZUEoKQorICAgIHsKKyAgICAgIGlmKHRoaXMtPm1fYmxvY2tBPT0wKQorICAgICAgICB0aGlzLT5tX2Jsb2NrQSA9IGFsaWduZWRfbmV3PExoc1NjYWxhcj4obV9zaXplQSk7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZUIoKQorICAgIHsKKyAgICAgIGlmKHRoaXMtPm1fYmxvY2tCPT0wKQorICAgICAgICB0aGlzLT5tX2Jsb2NrQiA9IGFsaWduZWRfbmV3PFJoc1NjYWxhcj4obV9zaXplQik7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZVcoKQorICAgIHsKKyAgICAgIGlmKHRoaXMtPm1fYmxvY2tXPT0wKQorICAgICAgICB0aGlzLT5tX2Jsb2NrVyA9IGFsaWduZWRfbmV3PFJoc1NjYWxhcj4obV9zaXplVyk7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZUFsbCgpCisgICAgeworICAgICAgYWxsb2NhdGVBKCk7CisgICAgICBhbGxvY2F0ZUIoKTsKKyAgICAgIGFsbG9jYXRlVygpOworICAgIH0KKworICAgIH5nZW1tX2Jsb2NraW5nX3NwYWNlKCkKKyAgICB7CisgICAgICBhbGlnbmVkX2RlbGV0ZSh0aGlzLT5tX2Jsb2NrQSwgbV9zaXplQSk7CisgICAgICBhbGlnbmVkX2RlbGV0ZSh0aGlzLT5tX2Jsb2NrQiwgbV9zaXplQik7CisgICAgICBhbGlnbmVkX2RlbGV0ZSh0aGlzLT5tX2Jsb2NrVywgbV9zaXplVyk7CisgICAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorY2xhc3MgR2VuZXJhbFByb2R1Y3Q8TGhzLCBSaHMsIEdlbW1Qcm9kdWN0PgorICA6IHB1YmxpYyBQcm9kdWN0QmFzZTxHZW5lcmFsUHJvZHVjdDxMaHMsUmhzLEdlbW1Qcm9kdWN0PiwgTGhzLCBSaHM+Cit7CisgICAgZW51bSB7CisgICAgICBNYXhEZXB0aEF0Q29tcGlsZVRpbWUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQoTGhzOjpNYXhDb2xzQXRDb21waWxlVGltZSxSaHM6Ok1heFJvd3NBdENvbXBpbGVUaW1lKQorICAgIH07CisgIHB1YmxpYzoKKyAgICBFSUdFTl9QUk9EVUNUX1BVQkxJQ19JTlRFUkZBQ0UoR2VuZXJhbFByb2R1Y3QpCisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSAgTGhzOjpTY2FsYXIgTGhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgIFJoczo6U2NhbGFyIFJoc1NjYWxhcjsKKyAgICB0eXBlZGVmICAgICAgICAgICBTY2FsYXIgICAgICBSZXNTY2FsYXI7CisKKyAgICBHZW5lcmFsUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpIDogQmFzZShsaHMscmhzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wPExoc1NjYWxhcixSaHNTY2FsYXI+IEJpbk9wOworICAgICAgRUlHRU5fQ0hFQ0tfQklOQVJZX0NPTVBBVElCSUxJWShCaW5PcCxMaHNTY2FsYXIsUmhzU2NhbGFyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIHNjYWxlQW5kQWRkVG8oRGVzdCYgZHN0LCBTY2FsYXIgYWxwaGEpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGRzdC5yb3dzKCk9PW1fbGhzLnJvd3MoKSAmJiBkc3QuY29scygpPT1tX3Jocy5jb2xzKCkpOworCisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsTGhzVHlwZT46OnR5cGUgbGhzID0gTGhzQmxhc1RyYWl0czo6ZXh0cmFjdChtX2xocyk7CisgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsUmhzVHlwZT46OnR5cGUgcmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChtX3Jocyk7CisKKyAgICAgIFNjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihtX2xocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihtX3Jocyk7CisKKyAgICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8KERlc3Q6OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsTGhzU2NhbGFyLFJoc1NjYWxhciwKKyAgICAgICAgICAgICAgRGVzdDo6TWF4Um93c0F0Q29tcGlsZVRpbWUsRGVzdDo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsTWF4RGVwdGhBdENvbXBpbGVUaW1lPiBCbG9ja2luZ1R5cGU7CisKKyAgICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fZnVuY3RvcjwKKyAgICAgICAgU2NhbGFyLCBJbmRleCwKKyAgICAgICAgaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PAorICAgICAgICAgIEluZGV4LAorICAgICAgICAgIExoc1NjYWxhciwgKF9BY3R1YWxMaHNUeXBlOjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLCBib29sKExoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSksCisgICAgICAgICAgUmhzU2NhbGFyLCAoX0FjdHVhbFJoc1R5cGU6OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsIGJvb2woUmhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlKSwKKyAgICAgICAgICAoRGVzdDo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvcj4sCisgICAgICAgIF9BY3R1YWxMaHNUeXBlLCBfQWN0dWFsUmhzVHlwZSwgRGVzdCwgQmxvY2tpbmdUeXBlPiBHZW1tRnVuY3RvcjsKKworICAgICAgQmxvY2tpbmdUeXBlIGJsb2NraW5nKGRzdC5yb3dzKCksIGRzdC5jb2xzKCksIGxocy5jb2xzKCkpOworCisgICAgICBpbnRlcm5hbDo6cGFyYWxsZWxpemVfZ2VtbTwoRGVzdDo6TWF4Um93c0F0Q29tcGlsZVRpbWU+MzIgfHwgRGVzdDo6TWF4Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpPihHZW1tRnVuY3RvcihsaHMsIHJocywgZHN0LCBhY3R1YWxBbHBoYSwgYmxvY2tpbmcpLCB0aGlzLT5yb3dzKCksIHRoaXMtPmNvbHMoKSwgRGVzdDo6RmxhZ3MmUm93TWFqb3JCaXQpOworICAgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fR0VORVJBTF9NQVRSSVhfTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxNYXRyaXhNYXRyaXhUcmlhbmd1bGFyLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4VHJpYW5ndWxhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMmQzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4VHJpYW5ndWxhci5oCkBAIC0wLDAgKzEsMjE0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HRU5FUkFMX01BVFJJWF9NQVRSSVhfVFJJQU5HVUxBUl9ICisjZGVmaW5lIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9UUklBTkdVTEFSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgZ2VuZXJhbCBBICogQiBwcm9kdWN0IHdoaWxlCisqIGV2YWx1YXRpbmcgb25seSBvbmUgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBwcm9kdWN0LgorKiBUaGlzIGlzIG1vcmUgZ2VuZXJhbCB2ZXJzaW9uIG9mIHNlbGYgYWRqb2ludCBwcm9kdWN0IChDICs9IEEgQV5UKQorKiBhcyB0aGUgbGV2ZWwgMyBTWVJLIEJsYXMgcm91dGluZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb25zIChkZWZpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlKQordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgbXIsIGludCBuciwgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHMsIGludCBVcExvPgorc3RydWN0IHRyaWJiX2tlcm5lbDsKKyAgCisvKiBPcHRpbWl6ZWQgbWF0cml4LW1hdHJpeCBwcm9kdWN0IGV2YWx1YXRpbmcgb25seSBvbmUgdHJpYW5ndWxhciBoYWxmICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsCisgICAgICAgICAgdHlwZW5hbWUgTGhzU2NhbGFyLCBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICB0eXBlbmFtZSBSaHNTY2FsYXIsIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFJlc1N0b3JhZ2VPcmRlciwgaW50ICBVcExvLCBpbnQgVmVyc2lvbiA9IFNwZWNpYWxpemVkPgorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q7CisKKy8vIGFzIHVzdWFsIGlmIHRoZSByZXN1bHQgaXMgcm93IG1ham9yID0+IHdlIHRyYW5zcG9zZSB0aGUgcHJvZHVjdAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNTY2FsYXIsIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBSaHNTY2FsYXIsIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgIFVwTG8sIGludCBWZXJzaW9uPgorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsUmhzU2NhbGFyLFJoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVSaHMsUm93TWFqb3IsVXBMbyxWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHNjYWxhcl9wcm9kdWN0X3RyYWl0czxMaHNTY2FsYXIsIFJoc1NjYWxhcj46OlJldHVyblR5cGUgUmVzU2NhbGFyOworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCBzaXplLCBJbmRleCBkZXB0aCxjb25zdCBMaHNTY2FsYXIqIGxocywgSW5kZXggbGhzU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSaHNTY2FsYXIqIHJocywgSW5kZXggcmhzU3RyaWRlLCBSZXNTY2FsYXIqIHJlcywgSW5kZXggcmVzU3RyaWRlLCBSZXNTY2FsYXIgYWxwaGEpCisgIHsKKyAgICBnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PEluZGV4LAorICAgICAgICBSaHNTY2FsYXIsIFJoc1N0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyBDb2xNYWpvciA6IFJvd01ham9yLCBDb25qdWdhdGVSaHMsCisgICAgICAgIExoc1NjYWxhciwgTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvciA/IENvbE1ham9yIDogUm93TWFqb3IsIENvbmp1Z2F0ZUxocywKKyAgICAgICAgQ29sTWFqb3IsIFVwTG89PUxvd2VyP1VwcGVyOkxvd2VyPgorICAgICAgOjpydW4oc2l6ZSxkZXB0aCxyaHMscmhzU3RyaWRlLGxocyxsaHNTdHJpZGUscmVzLHJlc1N0cmlkZSxhbHBoYSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgTGhzU2NhbGFyLCBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmhzU2NhbGFyLCBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocywgaW50ICBVcExvLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PEluZGV4LExoc1NjYWxhcixMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLFJoc1NjYWxhcixSaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlUmhzLENvbE1ham9yLFVwTG8sVmVyc2lvbj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBzY2FsYXJfcHJvZHVjdF90cmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+OjpSZXR1cm5UeXBlIFJlc1NjYWxhcjsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggc2l6ZSwgSW5kZXggZGVwdGgsY29uc3QgTGhzU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJoc1NjYWxhciogX3JocywgSW5kZXggcmhzU3RyaWRlLCBSZXNTY2FsYXIqIHJlcywgSW5kZXggcmVzU3RyaWRlLCBSZXNTY2FsYXIgYWxwaGEpCisgIHsKKyAgICBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPExoc1NjYWxhciwgSW5kZXgsIExoc1N0b3JhZ2VPcmRlcj4gbGhzKF9saHMsbGhzU3RyaWRlKTsKKyAgICBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFJoc1NjYWxhciwgSW5kZXgsIFJoc1N0b3JhZ2VPcmRlcj4gcmhzKF9yaHMscmhzU3RyaWRlKTsKKworICAgIHR5cGVkZWYgZ2VicF90cmFpdHM8TGhzU2NhbGFyLFJoc1NjYWxhcj4gVHJhaXRzOworCisgICAgSW5kZXgga2MgPSBkZXB0aDsgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgSyBkaXJlY3Rpb24KKyAgICBJbmRleCBtYyA9IHNpemU7ICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBNIGRpcmVjdGlvbgorICAgIEluZGV4IG5jID0gc2l6ZTsgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIE4gZGlyZWN0aW9uCisgICAgY29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPExoc1NjYWxhcixSaHNTY2FsYXI+KGtjLCBtYywgbmMpOworICAgIC8vICEhISBtYyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgbnI6CisgICAgaWYobWMgPiBUcmFpdHM6Om5yKQorICAgICAgbWMgPSAobWMvVHJhaXRzOjpucikqVHJhaXRzOjpucjsKKworICAgIHN0ZDo6c2l6ZV90IHNpemVXID0ga2MqVHJhaXRzOjpXb3JrU3BhY2VGYWN0b3I7CisgICAgc3RkOjpzaXplX3Qgc2l6ZUIgPSBzaXplVyArIGtjKnNpemU7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKExoc1NjYWxhciwgYmxvY2tBLCBrYyptYywgMCk7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFJoc1NjYWxhciwgYWxsb2NhdGVkQmxvY2tCLCBzaXplQiwgMCk7CisgICAgUmhzU2NhbGFyKiBibG9ja0IgPSBhbGxvY2F0ZWRCbG9ja0IgKyBzaXplVzsKKyAgICAKKyAgICBnZW1tX3BhY2tfbGhzPExoc1NjYWxhciwgSW5kZXgsIFRyYWl0czo6bXIsIFRyYWl0czo6TGhzUHJvZ3Jlc3MsIExoc1N0b3JhZ2VPcmRlcj4gcGFja19saHM7CisgICAgZ2VtbV9wYWNrX3JoczxSaHNTY2FsYXIsIEluZGV4LCBUcmFpdHM6Om5yLCBSaHNTdG9yYWdlT3JkZXI+IHBhY2tfcmhzOworICAgIGdlYnBfa2VybmVsIDxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIFRyYWl0czo6bXIsIFRyYWl0czo6bnIsIENvbmp1Z2F0ZUxocywgQ29uanVnYXRlUmhzPiBnZWJwOworICAgIHRyaWJiX2tlcm5lbDxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIFRyYWl0czo6bXIsIFRyYWl0czo6bnIsIENvbmp1Z2F0ZUxocywgQ29uanVnYXRlUmhzLCBVcExvPiBzeWJiOworCisgICAgZm9yKEluZGV4IGsyPTA7IGsyPGRlcHRoOyBrMis9a2MpCisgICAgeworICAgICAgY29uc3QgSW5kZXggYWN0dWFsX2tjID0gKHN0ZDo6bWluKShrMitrYyxkZXB0aCktazI7CisKKyAgICAgIC8vIG5vdGUgdGhhdCB0aGUgYWN0dWFsIHJocyBpcyB0aGUgdHJhbnNwb3NlL2Fkam9pbnQgb2YgbWF0CisgICAgICBwYWNrX3JocyhibG9ja0IsICZyaHMoazIsMCksIHJoc1N0cmlkZSwgYWN0dWFsX2tjLCBzaXplKTsKKworICAgICAgZm9yKEluZGV4IGkyPTA7IGkyPHNpemU7IGkyKz1tYykKKyAgICAgIHsKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShpMittYyxzaXplKS1pMjsKKworICAgICAgICBwYWNrX2xocyhibG9ja0EsICZsaHMoaTIsIGsyKSwgbGhzU3RyaWRlLCBhY3R1YWxfa2MsIGFjdHVhbF9tYyk7CisKKyAgICAgICAgLy8gdGhlIHNlbGVjdGVkIGFjdHVhbF9tYyAqIHNpemUgcGFuZWwgb2YgcmVzIGlzIHNwbGl0IGludG8gdGhyZWUgZGlmZmVyZW50IHBhcnQ6CisgICAgICAgIC8vICAxIC0gYmVmb3JlIHRoZSBkaWFnb25hbCA9PiBwcm9jZXNzZWQgd2l0aCBnZWJwIG9yIHNraXBwZWQKKyAgICAgICAgLy8gIDIgLSB0aGUgYWN0dWFsX21jIHggYWN0dWFsX21jIHN5bW1ldHJpYyBibG9jayA9PiBwcm9jZXNzZWQgd2l0aCBhIHNwZWNpYWwga2VybmVsCisgICAgICAgIC8vICAzIC0gYWZ0ZXIgdGhlIGRpYWdvbmFsID0+IHByb2Nlc3NlZCB3aXRoIGdlYnAgb3Igc2tpcHBlZAorICAgICAgICBpZiAoVXBMbz09TG93ZXIpCisgICAgICAgICAgZ2VicChyZXMraTIsIHJlc1N0cmlkZSwgYmxvY2tBLCBibG9ja0IsIGFjdHVhbF9tYywgYWN0dWFsX2tjLCAoc3RkOjptaW4pKHNpemUsaTIpLCBhbHBoYSwKKyAgICAgICAgICAgICAgIC0xLCAtMSwgMCwgMCwgYWxsb2NhdGVkQmxvY2tCKTsKKworICAgICAgICBzeWJiKHJlcytyZXNTdHJpZGUqaTIgKyBpMiwgcmVzU3RyaWRlLCBibG9ja0EsIGJsb2NrQiArIGFjdHVhbF9rYyppMiwgYWN0dWFsX21jLCBhY3R1YWxfa2MsIGFscGhhLCBhbGxvY2F0ZWRCbG9ja0IpOworCisgICAgICAgIGlmIChVcExvPT1VcHBlcikKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGoyID0gaTIrYWN0dWFsX21jOworICAgICAgICAgIGdlYnAocmVzK3Jlc1N0cmlkZSpqMitpMiwgcmVzU3RyaWRlLCBibG9ja0EsIGJsb2NrQithY3R1YWxfa2MqajIsIGFjdHVhbF9tYywgYWN0dWFsX2tjLCAoc3RkOjptYXgpKEluZGV4KDApLCBzaXplLWoyKSwgYWxwaGEsCisgICAgICAgICAgICAgICAtMSwgLTEsIDAsIDAsIGFsbG9jYXRlZEJsb2NrQik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8vIE9wdGltaXplZCBwYWNrZWQgQmxvY2sgKiBwYWNrZWQgQmxvY2sgcHJvZHVjdCBrZXJuZWwgZXZhbHVhdGluZyBvbmx5IG9uZSBnaXZlbiB0cmlhbmd1bGFyIHBhcnQKKy8vIFRoaXMga2VybmVsIGlzIGJ1aWx0IG9uIHRvcCBvZiB0aGUgZ2VicCBrZXJuZWw6CisvLyAtIHRoZSBjdXJyZW50IGRlc3RpbmF0aW9uIGJsb2NrIGlzIHByb2Nlc3NlZCBwZXIgcGFuZWwgb2YgYWN0dWFsX21jIHggQmxvY2tTaXplCisvLyAgIHdoZXJlIEJsb2NrU2l6ZSBpcyBzZXQgdG8gdGhlIG1pbmltYWwgdmFsdWUgYWxsb3dpbmcgZ2VicCB0byBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlCisvLyAtIHRoZW4sIGFzIHVzdWFsLCBlYWNoIHBhbmVsIGlzIHNwbGl0IGludG8gdGhyZWUgcGFydHMgYWxvbmcgdGhlIGRpYWdvbmFsLAorLy8gICB0aGUgc3ViIGJsb2NrcyBhYm92ZSBhbmQgYmVsb3cgdGhlIGRpYWdvbmFsIGFyZSBwcm9jZXNzZWQgYXMgdXN1YWwsCisvLyAgIHdoaWxlIHRoZSB0cmlhbmd1bGFyIGJsb2NrIG92ZXJsYXBwaW5nIHRoZSBkaWFnb25hbCBpcyBldmFsdWF0ZWQgaW50byBhCisvLyAgIHNtYWxsIHRlbXBvcmFyeSBidWZmZXIgd2hpY2ggaXMgdGhlbiBhY2N1bXVsYXRlZCBpbnRvIHRoZSByZXN1bHQgdXNpbmcgYQorLy8gICB0cmlhbmd1bGFyIHRyYXZlcnNhbC4KK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IG1yLCBpbnQgbnIsIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzLCBpbnQgVXBMbz4KK3N0cnVjdCB0cmliYl9rZXJuZWwKK3sKKyAgdHlwZWRlZiBnZWJwX3RyYWl0czxMaHNTY2FsYXIsUmhzU2NhbGFyLENvbmpMaHMsQ29ualJocz4gVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6UmVzU2NhbGFyIFJlc1NjYWxhcjsKKyAgCisgIGVudW0geworICAgIEJsb2NrU2l6ZSAgPSBFSUdFTl9QTEFJTl9FTlVNX01BWChtcixucikKKyAgfTsKKyAgdm9pZCBvcGVyYXRvcigpKFJlc1NjYWxhciogcmVzLCBJbmRleCByZXNTdHJpZGUsIGNvbnN0IExoc1NjYWxhciogYmxvY2tBLCBjb25zdCBSaHNTY2FsYXIqIGJsb2NrQiwgSW5kZXggc2l6ZSwgSW5kZXggZGVwdGgsIFJlc1NjYWxhciBhbHBoYSwgUmhzU2NhbGFyKiB3b3Jrc3BhY2UpCisgIHsKKyAgICBnZWJwX2tlcm5lbDxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIG1yLCBuciwgQ29uakxocywgQ29ualJocz4gZ2VicF9rZXJuZWw7CisgICAgTWF0cml4PFJlc1NjYWxhcixCbG9ja1NpemUsQmxvY2tTaXplLENvbE1ham9yPiBidWZmZXI7CisKKyAgICAvLyBsZXQncyBwcm9jZXNzIHRoZSBibG9jayBwZXIgcGFuZWwgb2YgYWN0dWFsX21jIHggQmxvY2tTaXplLAorICAgIC8vIGFnYWluLCBlYWNoIGlzIHNwbGl0IGludG8gdGhyZWUgcGFydHMsIGV0Yy4KKyAgICBmb3IgKEluZGV4IGo9MDsgajxzaXplOyBqKz1CbG9ja1NpemUpCisgICAgeworICAgICAgSW5kZXggYWN0dWFsQmxvY2tTaXplID0gc3RkOjptaW48SW5kZXg+KEJsb2NrU2l6ZSxzaXplIC0gaik7CisgICAgICBjb25zdCBSaHNTY2FsYXIqIGFjdHVhbF9iID0gYmxvY2tCK2oqZGVwdGg7CisKKyAgICAgIGlmKFVwTG89PVVwcGVyKQorICAgICAgICBnZWJwX2tlcm5lbChyZXMraipyZXNTdHJpZGUsIHJlc1N0cmlkZSwgYmxvY2tBLCBhY3R1YWxfYiwgaiwgZGVwdGgsIGFjdHVhbEJsb2NrU2l6ZSwgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgMCwgMCwgd29ya3NwYWNlKTsKKworICAgICAgLy8gc2VsZmFkam9pbnQgbWljcm8gYmxvY2sKKyAgICAgIHsKKyAgICAgICAgSW5kZXggaSA9IGo7CisgICAgICAgIGJ1ZmZlci5zZXRaZXJvKCk7CisgICAgICAgIC8vIDEgLSBhcHBseSB0aGUga2VybmVsIG9uIHRoZSB0ZW1wb3JhcnkgYnVmZmVyCisgICAgICAgIGdlYnBfa2VybmVsKGJ1ZmZlci5kYXRhKCksIEJsb2NrU2l6ZSwgYmxvY2tBK2RlcHRoKmksIGFjdHVhbF9iLCBhY3R1YWxCbG9ja1NpemUsIGRlcHRoLCBhY3R1YWxCbG9ja1NpemUsIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIDAsIDAsIHdvcmtzcGFjZSk7CisgICAgICAgIC8vIDIgLSB0cmlhbmd1bGFyIGFjY3VtdWxhdGlvbgorICAgICAgICBmb3IoSW5kZXggajE9MDsgajE8YWN0dWFsQmxvY2tTaXplOyArK2oxKQorICAgICAgICB7CisgICAgICAgICAgUmVzU2NhbGFyKiByID0gcmVzICsgKGorajEpKnJlc1N0cmlkZSArIGk7CisgICAgICAgICAgZm9yKEluZGV4IGkxPVVwTG89PUxvd2VyID8gajEgOiAwOworICAgICAgICAgICAgICBVcExvPT1Mb3dlciA/IGkxPGFjdHVhbEJsb2NrU2l6ZSA6IGkxPD1qMTsgKytpMSkKKyAgICAgICAgICAgIHJbaTFdICs9IGJ1ZmZlcihpMSxqMSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYoVXBMbz09TG93ZXIpCisgICAgICB7CisgICAgICAgIEluZGV4IGkgPSBqK2FjdHVhbEJsb2NrU2l6ZTsKKyAgICAgICAgZ2VicF9rZXJuZWwocmVzK2oqcmVzU3RyaWRlK2ksIHJlc1N0cmlkZSwgYmxvY2tBK2RlcHRoKmksIGFjdHVhbF9iLCBzaXplLWksIGRlcHRoLCBhY3R1YWxCbG9ja1NpemUsIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIDAsIDAsIHdvcmtzcGFjZSk7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gaGlnaCBsZXZlbCBBUEkKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IFVwTG8+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZCwgdHlwZW5hbWUgX0xocywgdHlwZW5hbWUgX1Jocz4KK1RyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsVXBMbz4mIFRyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsVXBMbz46OmFzc2lnblByb2R1Y3QoY29uc3QgUHJvZHVjdEJhc2U8UHJvZHVjdERlcml2ZWQsIF9MaHMsX1Jocz4mIHByb2QsIGNvbnN0IFNjYWxhciYgYWxwaGEpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgUHJvZHVjdERlcml2ZWQ6Okxoc05lc3RlZD46OnR5cGUgTGhzOworICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxMaHM+IExoc0JsYXNUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxMaHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QWN0dWFsTGhzPjo6dHlwZSBfQWN0dWFsTGhzOworICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsTGhzPjo6dHlwZSBhY3R1YWxMaHMgPSBMaHNCbGFzVHJhaXRzOjpleHRyYWN0KHByb2QubGhzKCkpOworICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZDo6UmhzTmVzdGVkPjo6dHlwZSBSaHM7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmJsYXNfdHJhaXRzPFJocz4gUmhzQmxhc1RyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHNCbGFzVHJhaXRzOjpEaXJlY3RMaW5lYXJBY2Nlc3NUeXBlIEFjdHVhbFJoczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBY3R1YWxSaHM+Ojp0eXBlIF9BY3R1YWxSaHM7CisgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxSaHM+Ojp0eXBlIGFjdHVhbFJocyA9IFJoc0JsYXNUcmFpdHM6OmV4dHJhY3QocHJvZC5yaHMoKSk7CisKKyAgdHlwZW5hbWUgUHJvZHVjdERlcml2ZWQ6OlNjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLmxocygpLmRlcml2ZWQoKSkgKiBSaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKHByb2QucmhzKCkuZGVyaXZlZCgpKTsKKworICBpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxJbmRleCwKKyAgICB0eXBlbmFtZSBMaHM6OlNjYWxhciwgX0FjdHVhbExoczo6RmxhZ3MmUm93TWFqb3JCaXQgPyBSb3dNYWpvciA6IENvbE1ham9yLCBMaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsCisgICAgdHlwZW5hbWUgUmhzOjpTY2FsYXIsIF9BY3R1YWxSaHM6OkZsYWdzJlJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciwgUmhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlLAorICAgIE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciwgVXBMbz4KKyAgICA6OnJ1bihtX21hdHJpeC5jb2xzKCksIGFjdHVhbExocy5jb2xzKCksCisgICAgICAgICAgJmFjdHVhbExocy5jb2VmZlJlZigwLDApLCBhY3R1YWxMaHMub3V0ZXJTdHJpZGUoKSwgJmFjdHVhbFJocy5jb2VmZlJlZigwLDApLCBhY3R1YWxSaHMub3V0ZXJTdHJpZGUoKSwKKyAgICAgICAgICBjb25zdF9jYXN0PFNjYWxhcio+KG1fbWF0cml4LmRhdGEoKSksIG1fbWF0cml4Lm91dGVyU3RyaWRlKCksIGFjdHVhbEFscGhhKTsKKyAgCisgIHJldHVybiAqdGhpczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9HRU5FUkFMX01BVFJJWF9NQVRSSVhfVFJJQU5HVUxBUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4VHJpYW5ndWxhcl9NS0wuaCBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL0dlbmVyYWxNYXRyaXhNYXRyaXhUcmlhbmd1bGFyX01LTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZWVkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4VHJpYW5ndWxhcl9NS0wuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICBMZXZlbCAzIEJMQVMgU1lSSy9IRVJLIGltcGxlbWVudGF0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9UUklBTkdVTEFSX01LTF9ICisjZGVmaW5lIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9UUklBTkdVTEFSX01LTF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIFNjYWxhciwgaW50IEFTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlQSwgaW50IFJlc1N0b3JhZ2VPcmRlciwgaW50ICBVcExvPgorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF9yYW5rdXBkYXRlIDoKKyAgICAgICBnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PAorICAgICAgICAgSW5kZXgsU2NhbGFyLEFTdG9yYWdlT3JkZXIsQ29uanVnYXRlQSxTY2FsYXIsQVN0b3JhZ2VPcmRlcixDb25qdWdhdGVBLFJlc1N0b3JhZ2VPcmRlcixVcExvLEJ1aWx0SW4+IHt9OworCisKKy8vIHRyeSB0byBnbyB0byBCTEFTIHNwZWNpYWxpemF0aW9uCisjZGVmaW5lIEVJR0VOX01LTF9SQU5LVVBEQVRFX1NQRUNJQUxJWkUoU2NhbGFyKSBcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgIFVwTG8+IFwKK3N0cnVjdCBnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PEluZGV4LFNjYWxhcixMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLCBcCisgICAgICAgICAgICAgICBTY2FsYXIsUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcixVcExvLFNwZWNpYWxpemVkPiB7IFwKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggc2l6ZSwgSW5kZXggZGVwdGgsY29uc3QgU2NhbGFyKiBsaHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXIqIHJocywgSW5kZXggcmhzU3RyaWRlLCBTY2FsYXIqIHJlcywgSW5kZXggcmVzU3RyaWRlLCBTY2FsYXIgYWxwaGEpIFwKKyAgeyBcCisgICAgaWYgKGxocz09cmhzKSB7IFwKKyAgICAgIGdlbmVyYWxfbWF0cml4X21hdHJpeF9yYW5rdXBkYXRlPEluZGV4LFNjYWxhcixMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLENvbE1ham9yLFVwTG8+IFwKKyAgICAgIDo6cnVuKHNpemUsZGVwdGgsbGhzLGxoc1N0cmlkZSxyaHMscmhzU3RyaWRlLHJlcyxyZXNTdHJpZGUsYWxwaGEpOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxJbmRleCwgXAorICAgICAgICBTY2FsYXIsIExoc1N0b3JhZ2VPcmRlciwgQ29uanVnYXRlTGhzLCBcCisgICAgICAgIFNjYWxhciwgUmhzU3RvcmFnZU9yZGVyLCBDb25qdWdhdGVSaHMsIFwKKyAgICAgICAgQ29sTWFqb3IsIFVwTG8sIEJ1aWx0SW4+IFwKKyAgICAgIDo6cnVuKHNpemUsZGVwdGgsbGhzLGxoc1N0cmlkZSxyaHMscmhzU3RyaWRlLHJlcyxyZXNTdHJpZGUsYWxwaGEpOyBcCisgICAgfSBcCisgIH0gXAorfTsKKworRUlHRU5fTUtMX1JBTktVUERBVEVfU1BFQ0lBTElaRShkb3VibGUpCisvL0VJR0VOX01LTF9SQU5LVVBEQVRFX1NQRUNJQUxJWkUoZGNvbXBsZXgpCitFSUdFTl9NS0xfUkFOS1VQREFURV9TUEVDSUFMSVpFKGZsb2F0KQorLy9FSUdFTl9NS0xfUkFOS1VQREFURV9TUEVDSUFMSVpFKHNjb21wbGV4KQorCisvLyBTWVJLIGZvciBmbG9hdC9kb3VibGUKKyNkZWZpbmUgRUlHRU5fTUtMX1JBTktVUERBVEVfUihFSUdUWVBFLCBNS0xUWVBFLCBNS0xGVU5DKSBcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIGludCBBU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUEsIGludCAgVXBMbz4gXAorc3RydWN0IGdlbmVyYWxfbWF0cml4X21hdHJpeF9yYW5rdXBkYXRlPEluZGV4LEVJR1RZUEUsQVN0b3JhZ2VPcmRlcixDb25qdWdhdGVBLENvbE1ham9yLFVwTG8+IHsgXAorICBlbnVtIHsgXAorICAgIElzTG93ZXIgPSAoVXBMbyZMb3dlcikgPT0gTG93ZXIsIFwKKyAgICBMb3dVcCA9IElzTG93ZXIgPyBMb3dlciA6IFVwcGVyLCBcCisgICAgY29uakEgPSAoKEFTdG9yYWdlT3JkZXI9PUNvbE1ham9yKSAmJiBDb25qdWdhdGVBKSA/IDEgOiAwIFwKKyAgfTsgXAorICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bihJbmRleCBzaXplLCBJbmRleCBkZXB0aCxjb25zdCBFSUdUWVBFKiBsaHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFSUdUWVBFKiByaHMsIEluZGV4IHJoc1N0cmlkZSwgRUlHVFlQRSogcmVzLCBJbmRleCByZXNTdHJpZGUsIEVJR1RZUEUgYWxwaGEpIFwKKyAgeyBcCisgIC8qIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIFJoc1N0b3JhZ2VPcmRlcj4gTWF0cml4UmhzOyovIFwKK1wKKyAgIE1LTF9JTlQgbGRhPWxoc1N0cmlkZSwgbGRjPXJlc1N0cmlkZSwgbj1zaXplLCBrPWRlcHRoOyBcCisgICBjaGFyIHVwbG89KElzTG93ZXIpID8gJ0wnIDogJ1UnLCB0cmFucz0oQVN0b3JhZ2VPcmRlcj09Um93TWFqb3IpID8gJ1QnOidOJzsgXAorICAgTUtMVFlQRSBhbHBoYV8sIGJldGFfOyBcCitcCisvKiBTZXQgYWxwaGFfICYgYmV0YV8gKi8gXAorICAgYXNzaWduX3NjYWxhcl9laWcybWtsPE1LTFRZUEUsIEVJR1RZUEU+KGFscGhhXywgYWxwaGEpOyBcCisgICBhc3NpZ25fc2NhbGFyX2VpZzJta2w8TUtMVFlQRSwgRUlHVFlQRT4oYmV0YV8sIEVJR1RZUEUoMSkpOyBcCisgICBNS0xGVU5DKCZ1cGxvLCAmdHJhbnMsICZuLCAmaywgJmFscGhhXywgbGhzLCAmbGRhLCAmYmV0YV8sIHJlcywgJmxkYyk7IFwKKyAgfSBcCit9OworCisvLyBIRVJLIGZvciBjb21wbGV4IGRhdGEKKyNkZWZpbmUgRUlHRU5fTUtMX1JBTktVUERBVEVfQyhFSUdUWVBFLCBNS0xUWVBFLCBSVFlQRSwgTUtMRlVOQykgXAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBpbnQgQVN0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVBLCBpbnQgIFVwTG8+IFwKK3N0cnVjdCBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcmFua3VwZGF0ZTxJbmRleCxFSUdUWVBFLEFTdG9yYWdlT3JkZXIsQ29uanVnYXRlQSxDb2xNYWpvcixVcExvPiB7IFwKKyAgZW51bSB7IFwKKyAgICBJc0xvd2VyID0gKFVwTG8mTG93ZXIpID09IExvd2VyLCBcCisgICAgTG93VXAgPSBJc0xvd2VyID8gTG93ZXIgOiBVcHBlciwgXAorICAgIGNvbmpBID0gKCgoQVN0b3JhZ2VPcmRlcj09Q29sTWFqb3IpICYmIENvbmp1Z2F0ZUEpIHx8ICgoQVN0b3JhZ2VPcmRlcj09Um93TWFqb3IpICYmICFDb25qdWdhdGVBKSkgPyAxIDogMCBcCisgIH07IFwKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBydW4oSW5kZXggc2l6ZSwgSW5kZXggZGVwdGgsY29uc3QgRUlHVFlQRSogbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUlHVFlQRSogcmhzLCBJbmRleCByaHNTdHJpZGUsIEVJR1RZUEUqIHJlcywgSW5kZXggcmVzU3RyaWRlLCBFSUdUWVBFIGFscGhhKSBcCisgIHsgXAorICAgdHlwZWRlZiBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgQVN0b3JhZ2VPcmRlcj4gTWF0cml4VHlwZTsgXAorXAorICAgTUtMX0lOVCBsZGE9bGhzU3RyaWRlLCBsZGM9cmVzU3RyaWRlLCBuPXNpemUsIGs9ZGVwdGg7IFwKKyAgIGNoYXIgdXBsbz0oSXNMb3dlcikgPyAnTCcgOiAnVScsIHRyYW5zPShBU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgPyAnQyc6J04nOyBcCisgICBSVFlQRSBhbHBoYV8sIGJldGFfOyBcCisgICBjb25zdCBFSUdUWVBFKiBhX3B0cjsgXAorXAorLyogU2V0IGFscGhhXyAmIGJldGFfICovIFwKKy8qICAgYXNzaWduX3NjYWxhcl9laWcybWtsPE1LTFRZUEUsIEVJR1RZUEU+KGFscGhhXywgYWxwaGEpOyAqL1wKKy8qICAgYXNzaWduX3NjYWxhcl9laWcybWtsPE1LTFRZUEUsIEVJR1RZUEU+KGJldGFfLCBFSUdUWVBFKDEpKTsqLyBcCisgICBhbHBoYV8gPSBhbHBoYS5yZWFsKCk7IFwKKyAgIGJldGFfID0gMS4wOyBcCisvKiBDb3B5IHdpdGggY29uanVnYXRpb24gaW4gc29tZSBjYXNlcyovIFwKKyAgIE1hdHJpeFR5cGUgYTsgXAorICAgaWYgKGNvbmpBKSB7IFwKKyAgICAgTWFwPGNvbnN0IE1hdHJpeFR5cGUsIDAsIE91dGVyU3RyaWRlPD4gPiBtYXBBKGxocyxuLGssT3V0ZXJTdHJpZGU8PihsaHNTdHJpZGUpKTsgXAorICAgICBhID0gbWFwQS5jb25qdWdhdGUoKTsgXAorICAgICBsZGEgPSBhLm91dGVyU3RyaWRlKCk7IFwKKyAgICAgYV9wdHIgPSBhLmRhdGEoKTsgXAorICAgfSBlbHNlIGFfcHRyPWxoczsgXAorICAgTUtMRlVOQygmdXBsbywgJnRyYW5zLCAmbiwgJmssICZhbHBoYV8sIChNS0xUWVBFKilhX3B0ciwgJmxkYSwgJmJldGFfLCAoTUtMVFlQRSopcmVzLCAmbGRjKTsgXAorICB9IFwKK307CisKKworRUlHRU5fTUtMX1JBTktVUERBVEVfUihkb3VibGUsIGRvdWJsZSwgZHN5cmspCitFSUdFTl9NS0xfUkFOS1VQREFURV9SKGZsb2F0LCAgZmxvYXQsICBzc3lyaykKKworLy9FSUdFTl9NS0xfUkFOS1VQREFURV9DKGRjb21wbGV4LCBNS0xfQ29tcGxleDE2LCBkb3VibGUsIHpoZXJrKQorLy9FSUdFTl9NS0xfUkFOS1VQREFURV9DKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsICBkb3VibGUsIGNoZXJrKQorCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9UUklBTkdVTEFSX01LTF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4TWF0cml4X01LTC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeF9NS0wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjBhZjMyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeE1hdHJpeF9NS0wuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICBHZW5lcmFsIG1hdHJpeC1tYXRyaXggcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGJhc2VkIG9uID9HRU1NLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9NS0xfSAorI2RlZmluZSBFSUdFTl9HRU5FUkFMX01BVFJJWF9NQVRSSVhfTUtMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGdlbmVyYWwgbWF0cml4LW1hdHJpeCBtdWx0aXBsaWNhdGlvbiB1c2luZyBCTEFTCisqIGdlbW0gZnVuY3Rpb24gdmlhIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2YKKyogZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q6OnJ1biguLikgbWV0aG9kIGZvciBmbG9hdCwgZG91YmxlLAorKiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGFuZCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiB0eXBlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gZ2VtbSBzcGVjaWFsaXphdGlvbgorCisjZGVmaW5lIEdFTU1fU1BFQ0lBTElaQVRJT04oRUlHVFlQRSwgRUlHUFJFRklYLCBNS0xUWVBFLCBNS0xQUkVGSVgpIFwKK3RlbXBsYXRlPCBcCisgIHR5cGVuYW1lIEluZGV4LCBcCisgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCBcCisgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8SW5kZXgsRUlHVFlQRSxMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLEVJR1RZUEUsUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj4gXAoreyBcCitzdGF0aWMgdm9pZCBydW4oSW5kZXggcm93cywgSW5kZXggY29scywgSW5kZXggZGVwdGgsIFwKKyAgY29uc3QgRUlHVFlQRSogX2xocywgSW5kZXggbGhzU3RyaWRlLCBcCisgIGNvbnN0IEVJR1RZUEUqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwgXAorICBFSUdUWVBFKiByZXMsIEluZGV4IHJlc1N0cmlkZSwgXAorICBFSUdUWVBFIGFscGhhLCBcCisgIGxldmVsM19ibG9ja2luZzxFSUdUWVBFLCBFSUdUWVBFPiYgLypibG9ja2luZyovLCBcCisgIEdlbW1QYXJhbGxlbEluZm88SW5kZXg+KiAvKmluZm8gPSAwKi8pIFwKK3sgXAorICB1c2luZyBzdGQ6OmNvbmo7IFwKK1wKKyAgY2hhciB0cmFuc2EsIHRyYW5zYjsgXAorICBNS0xfSU5UIG0sIG4sIGssIGxkYSwgbGRiLCBsZGM7IFwKKyAgY29uc3QgRUlHVFlQRSAqYSwgKmI7IFwKKyAgTUtMVFlQRSBhbHBoYV8sIGJldGFfOyBcCisgIE1hdHJpeFgjI0VJR1BSRUZJWCBhX3RtcCwgYl90bXA7IFwKKyAgRUlHVFlQRSBteW9uZSgxKTtcCitcCisvKiBTZXQgdHJhbnNwb3NlIG9wdGlvbnMgKi8gXAorICB0cmFuc2EgPSAoTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgPyAoKENvbmp1Z2F0ZUxocykgPyAnQycgOiAnVCcpIDogJ04nOyBcCisgIHRyYW5zYiA9IChSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/ICgoQ29uanVnYXRlUmhzKSA/ICdDJyA6ICdUJykgOiAnTic7IFwKK1wKKy8qIFNldCBtLCBuLCBrICovIFwKKyAgbSA9IChNS0xfSU5UKXJvd3M7ICBcCisgIG4gPSAoTUtMX0lOVCljb2xzOyAgXAorICBrID0gKE1LTF9JTlQpZGVwdGg7IFwKK1wKKy8qIFNldCBhbHBoYV8gJiBiZXRhXyAqLyBcCisgIGFzc2lnbl9zY2FsYXJfZWlnMm1rbChhbHBoYV8sIGFscGhhKTsgXAorICBhc3NpZ25fc2NhbGFyX2VpZzJta2woYmV0YV8sIG15b25lKTsgXAorXAorLyogU2V0IGxkYSwgbGRiLCBsZGMgKi8gXAorICBsZGEgPSAoTUtMX0lOVClsaHNTdHJpZGU7IFwKKyAgbGRiID0gKE1LTF9JTlQpcmhzU3RyaWRlOyBcCisgIGxkYyA9IChNS0xfSU5UKXJlc1N0cmlkZTsgXAorXAorLyogU2V0IGEsIGIsIGMgKi8gXAorICBpZiAoKExoc1N0b3JhZ2VPcmRlcj09Q29sTWFqb3IpICYmIChDb25qdWdhdGVMaHMpKSB7IFwKKyAgICBNYXA8Y29uc3QgTWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gbGhzKF9saHMsbSxrLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7IFwKKyAgICBhX3RtcCA9IGxocy5jb25qdWdhdGUoKTsgXAorICAgIGEgPSBhX3RtcC5kYXRhKCk7IFwKKyAgICBsZGEgPSBhX3RtcC5vdXRlclN0cmlkZSgpOyBcCisgIH0gZWxzZSBhID0gX2xoczsgXAorXAorICBpZiAoKFJoc1N0b3JhZ2VPcmRlcj09Q29sTWFqb3IpICYmIChDb25qdWdhdGVSaHMpKSB7IFwKKyAgICBNYXA8Y29uc3QgTWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gcmhzKF9yaHMsayxuLE91dGVyU3RyaWRlPD4ocmhzU3RyaWRlKSk7IFwKKyAgICBiX3RtcCA9IHJocy5jb25qdWdhdGUoKTsgXAorICAgIGIgPSBiX3RtcC5kYXRhKCk7IFwKKyAgICBsZGIgPSBiX3RtcC5vdXRlclN0cmlkZSgpOyBcCisgIH0gZWxzZSBiID0gX3JoczsgXAorXAorICBNS0xQUkVGSVgjI2dlbW0oJnRyYW5zYSwgJnRyYW5zYiwgJm0sICZuLCAmaywgJmFscGhhXywgKGNvbnN0IE1LTFRZUEUqKWEsICZsZGEsIChjb25zdCBNS0xUWVBFKiliLCAmbGRiLCAmYmV0YV8sIChNS0xUWVBFKilyZXMsICZsZGMpOyBcCit9fTsKKworR0VNTV9TUEVDSUFMSVpBVElPTihkb3VibGUsICAgZCwgIGRvdWJsZSwgICAgICAgIGQpCitHRU1NX1NQRUNJQUxJWkFUSU9OKGZsb2F0LCAgICBmLCAgZmxvYXQsICAgICAgICAgcykKK0dFTU1fU1BFQ0lBTElaQVRJT04oZGNvbXBsZXgsIGNkLCBNS0xfQ29tcGxleDE2LCB6KQorR0VNTV9TUEVDSUFMSVpBVElPTihzY29tcGxleCwgY2YsIE1LTF9Db21wbGV4OCwgIGMpCisKK30gLy8gZW5kIG5hbWVzcGFzZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSQUxfTUFUUklYX01BVFJJWF9NS0xfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeFZlY3Rvci5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMWY3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4VmVjdG9yLmgKQEAgLTAsMCArMSw1NDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfTUFUUklYX1ZFQ1RPUl9ICisjZGVmaW5lIEVJR0VOX0dFTkVSQUxfTUFUUklYX1ZFQ1RPUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiBPcHRpbWl6ZWQgY29sLW1ham9yIG1hdHJpeCAqIHZlY3RvciBwcm9kdWN0OgorICogVGhpcyBhbGdvcml0aG0gcHJvY2Vzc2VzIDQgY29sdW1ucyBhdCBvbmNlcyB0aGF0IGFsbG93cyB0byBib3RoIHJlZHVjZQorICogdGhlIG51bWJlciBvZiBsb2FkL3N0b3JlcyBvZiB0aGUgcmVzdWx0IGJ5IGEgZmFjdG9yIDQgYW5kIHRvIHJlZHVjZQorICogdGhlIGluc3RydWN0aW9uIGRlcGVuZGVuY3kuIE1vcmVvdmVyLCB3ZSBrbm93IHRoYXQgYWxsIGJhbmRzIGhhdmUgdGhlCisgKiBzYW1lIGFsaWdubWVudCBwYXR0ZXJuLgorICoKKyAqIE1peGluZyB0eXBlIGxvZ2ljOiBDICs9IGFscGhhICogQSAqIEIKKyAqICB8ICBBICB8ICBCICB8YWxwaGF8IGNvbW1lbnRzCisgKiAgfHJlYWwgfGNwbHggfGNwbHggfCBubyB2ZWN0b3JpemF0aW9uCisgKiAgfHJlYWwgfGNwbHggfHJlYWwgfCBhbHBoYSBpcyBjb252ZXJ0ZWQgdG8gYSBjcGx4IHdoZW4gY2FsbGluZyB0aGUgcnVuIGZ1bmN0aW9uLCBubyB2ZWN0b3JpemF0aW9uCisgKiAgfGNwbHggfHJlYWwgfGNwbHggfCBpbnZhbGlkLCB0aGUgY2FsbGVyIGhhcyB0byBkbyB0bXA6ID0gQSAqIEI7IEMgKz0gYWxwaGEqdG1wCisgKiAgfGNwbHggfHJlYWwgfHJlYWwgfCBvcHRpbWFsIGNhc2UsIHZlY3Rvcml6YXRpb24gcG9zc2libGUgdmlhIHJlYWwtY3BseCBtdWwKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qdWdhdGVMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgYm9vbCBDb25qdWdhdGVSaHMsIGludCBWZXJzaW9uPgorc3RydWN0IGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LExoc1NjYWxhcixDb2xNYWpvcixDb25qdWdhdGVMaHMsUmhzU2NhbGFyLENvbmp1Z2F0ZVJocyxWZXJzaW9uPgorewordHlwZWRlZiB0eXBlbmFtZSBzY2FsYXJfcHJvZHVjdF90cmFpdHM8TGhzU2NhbGFyLCBSaHNTY2FsYXI+OjpSZXR1cm5UeXBlIFJlc1NjYWxhcjsKKworZW51bSB7CisgIFZlY3Rvcml6YWJsZSA9IHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6VmVjdG9yaXphYmxlICYmIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6VmVjdG9yaXphYmxlCisgICAgICAgICAgICAgICYmIGludChwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OnNpemUpPT1pbnQocGFja2V0X3RyYWl0czxSaHNTY2FsYXI+OjpzaXplKSwKKyAgTGhzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8TGhzU2NhbGFyPjo6c2l6ZSA6IDEsCisgIFJoc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OnNpemUgOiAxLAorICBSZXNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+OjpzaXplIDogMQorfTsKKwordHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OnR5cGUgIF9MaHNQYWNrZXQ7Cit0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6dHlwZSAgX1Joc1BhY2tldDsKK3R5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxSZXNTY2FsYXI+Ojp0eXBlICBfUmVzUGFja2V0OworCit0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxfTGhzUGFja2V0LExoc1NjYWxhcj46OnR5cGUgTGhzUGFja2V0OwordHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX1Joc1BhY2tldCxSaHNTY2FsYXI+Ojp0eXBlIFJoc1BhY2tldDsKK3R5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9SZXNQYWNrZXQsUmVzU2NhbGFyPjo6dHlwZSBSZXNQYWNrZXQ7CisKK0VJR0VOX0RPTlRfSU5MSU5FIHN0YXRpYyB2b2lkIHJ1bigKKyAgSW5kZXggcm93cywgSW5kZXggY29scywKKyAgY29uc3QgTGhzU2NhbGFyKiBsaHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgY29uc3QgUmhzU2NhbGFyKiByaHMsIEluZGV4IHJoc0luY3IsCisgIFJlc1NjYWxhciogcmVzLCBJbmRleAorICAjaWZkZWYgRUlHRU5fSU5URVJOQUxfREVCVUdHSU5HCisgICAgcmVzSW5jcgorICAjZW5kaWYKKyAgLCBSaHNTY2FsYXIgYWxwaGEpCit7CisgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChyZXNJbmNyPT0xKTsKKyAgI2lmZGVmIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMKKyAgI2Vycm9yIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCisgICNlbmRpZgorICAjZGVmaW5lIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMoQTAsQTEzLEEyKSBcCisgICAgcHN0b3JlKCZyZXNbal0sIFwKKyAgICAgIHBhZGQocGxvYWQ8UmVzUGFja2V0PigmcmVzW2pdKSwgXAorICAgICAgICBwYWRkKCBcCisgICAgICAgICAgcGFkZChwY2oucG11bChFSUdFTl9DQVQocGxvYSAsIEEwKTxMaHNQYWNrZXQ+KCZsaHMwW2pdKSwgICAgcHRtcDApLCBcCisgICAgICAgICAgICAgICAgICBwY2oucG11bChFSUdFTl9DQVQocGxvYSAsIEExMyk8TGhzUGFja2V0PigmbGhzMVtqXSksICAgcHRtcDEpKSwgXAorICAgICAgICAgIHBhZGQocGNqLnBtdWwoRUlHRU5fQ0FUKHBsb2EgLCBBMik8TGhzUGFja2V0PigmbGhzMltqXSksICAgIHB0bXAyKSwgXAorICAgICAgICAgICAgICAgICAgcGNqLnBtdWwoRUlHRU5fQ0FUKHBsb2EgLCBBMTMpPExoc1BhY2tldD4oJmxoczNbal0pLCAgIHB0bXAzKSkgKSkpCisKKyAgY29ual9oZWxwZXI8TGhzU2NhbGFyLFJoc1NjYWxhcixDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzPiBjajsKKyAgY29ual9oZWxwZXI8TGhzUGFja2V0LFJoc1BhY2tldCxDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzPiBwY2o7CisgIGlmKENvbmp1Z2F0ZVJocykKKyAgICBhbHBoYSA9IGNvbmooYWxwaGEpOworCisgIGVudW0geyBBbGxBbGlnbmVkID0gMCwgRXZlbkFsaWduZWQsIEZpcnN0QWxpZ25lZCwgTm9uZUFsaWduZWQgfTsKKyAgY29uc3QgSW5kZXggY29sdW1uc0F0T25jZSA9IDQ7CisgIGNvbnN0IEluZGV4IHBlZWxzID0gMjsKKyAgY29uc3QgSW5kZXggTGhzUGFja2V0QWxpZ25lZE1hc2sgPSBMaHNQYWNrZXRTaXplLTE7CisgIGNvbnN0IEluZGV4IFJlc1BhY2tldEFsaWduZWRNYXNrID0gUmVzUGFja2V0U2l6ZS0xOworICBjb25zdCBJbmRleCBQZWVsQWxpZ25lZE1hc2sgPSBSZXNQYWNrZXRTaXplKnBlZWxzLTE7CisgIGNvbnN0IEluZGV4IHNpemUgPSByb3dzOworICAKKyAgLy8gSG93IG1hbnkgY29lZmZzIG9mIHRoZSByZXN1bHQgZG8gd2UgaGF2ZSB0byBza2lwIHRvIGJlIGFsaWduZWQuCisgIC8vIEhlcmUgd2UgYXNzdW1lIGRhdGEgYXJlIGF0IGxlYXN0IGFsaWduZWQgb24gdGhlIGJhc2Ugc2NhbGFyIHR5cGUuCisgIEluZGV4IGFsaWduZWRTdGFydCA9IGludGVybmFsOjpmaXJzdF9hbGlnbmVkKHJlcyxzaXplKTsKKyAgSW5kZXggYWxpZ25lZFNpemUgPSBSZXNQYWNrZXRTaXplPjEgPyBhbGlnbmVkU3RhcnQgKyAoKHNpemUtYWxpZ25lZFN0YXJ0KSAmIH5SZXNQYWNrZXRBbGlnbmVkTWFzaykgOiAwOworICBjb25zdCBJbmRleCBwZWVsZWRTaXplICA9IHBlZWxzPjEgPyBhbGlnbmVkU3RhcnQgKyAoKGFsaWduZWRTaXplLWFsaWduZWRTdGFydCkgJiB+UGVlbEFsaWduZWRNYXNrKSA6IGFsaWduZWRTdGFydDsKKworICBjb25zdCBJbmRleCBhbGlnbm1lbnRTdGVwID0gTGhzUGFja2V0U2l6ZT4xID8gKExoc1BhY2tldFNpemUgLSBsaHNTdHJpZGUgJSBMaHNQYWNrZXRTaXplKSAmIExoc1BhY2tldEFsaWduZWRNYXNrIDogMDsKKyAgSW5kZXggYWxpZ25tZW50UGF0dGVybiA9IGFsaWdubWVudFN0ZXA9PTAgPyBBbGxBbGlnbmVkCisgICAgICAgICAgICAgICAgICAgICAgIDogYWxpZ25tZW50U3RlcD09KExoc1BhY2tldFNpemUvMikgPyBFdmVuQWxpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICA6IEZpcnN0QWxpZ25lZDsKKworICAvLyB3ZSBjYW5ub3QgYXNzdW1lIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFsaWduZWQgYmVjYXVzZSBvZiBzdWItbWF0cmljZXMKKyAgY29uc3QgSW5kZXggbGhzQWxpZ25tZW50T2Zmc2V0ID0gaW50ZXJuYWw6OmZpcnN0X2FsaWduZWQobGhzLHNpemUpOworCisgIC8vIGZpbmQgaG93IG1hbnkgY29sdW1ucyBkbyB3ZSBoYXZlIHRvIHNraXAgdG8gYmUgYWxpZ25lZCB3aXRoIHRoZSByZXN1bHQgKGlmIHBvc3NpYmxlKQorICBJbmRleCBza2lwQ29sdW1ucyA9IDA7CisgIC8vIGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBhbGlnbmVkIChUT0RPIGFkZCBzb21lIGNvbXBpbGUgdGltZSB0ZXN0cyB3aGVuIHBvc3NpYmxlLCBlLmcuIGZvciBmbG9hdHMpCisgIGlmKCAoc2l6ZV90KGxocyklc2l6ZW9mKExoc1NjYWxhcikpIHx8IChzaXplX3QocmVzKSVzaXplb2YoUmVzU2NhbGFyKSkgKQorICB7CisgICAgYWxpZ25lZFNpemUgPSAwOworICAgIGFsaWduZWRTdGFydCA9IDA7CisgIH0KKyAgZWxzZSBpZiAoTGhzUGFja2V0U2l6ZT4xKQorICB7CisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHNpemVfdChsaHMrbGhzQWxpZ25tZW50T2Zmc2V0KSVzaXplb2YoTGhzUGFja2V0KT09MCB8fCBzaXplPExoc1BhY2tldFNpemUpOworCisgICAgd2hpbGUgKHNraXBDb2x1bW5zPExoc1BhY2tldFNpemUgJiYKKyAgICAgICAgICBhbGlnbmVkU3RhcnQgIT0gKChsaHNBbGlnbm1lbnRPZmZzZXQgKyBhbGlnbm1lbnRTdGVwKnNraXBDb2x1bW5zKSVMaHNQYWNrZXRTaXplKSkKKyAgICAgICsrc2tpcENvbHVtbnM7CisgICAgaWYgKHNraXBDb2x1bW5zPT1MaHNQYWNrZXRTaXplKQorICAgIHsKKyAgICAgIC8vIG5vdGhpbmcgY2FuIGJlIGFsaWduZWQsIG5vIG5lZWQgdG8gc2tpcCBhbnkgY29sdW1uCisgICAgICBhbGlnbm1lbnRQYXR0ZXJuID0gTm9uZUFsaWduZWQ7CisgICAgICBza2lwQ29sdW1ucyA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBza2lwQ29sdW1ucyA9IChzdGQ6Om1pbikoc2tpcENvbHVtbnMsY29scyk7CisgICAgICAvLyBub3RlIHRoYXQgdGhlIHNraXBlZCBjb2x1bW5zIGFyZSBwcm9jZXNzZWQgbGF0ZXIuCisgICAgfQorCisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KCAgKGFsaWdubWVudFBhdHRlcm49PU5vbmVBbGlnbmVkKQorICAgICAgICAgICAgICAgICAgICAgIHx8IChza2lwQ29sdW1ucyArIGNvbHVtbnNBdE9uY2UgPj0gY29scykKKyAgICAgICAgICAgICAgICAgICAgICB8fCBMaHNQYWNrZXRTaXplID4gc2l6ZQorICAgICAgICAgICAgICAgICAgICAgIHx8IChzaXplX3QobGhzK2FsaWduZWRTdGFydCtsaHNTdHJpZGUqc2tpcENvbHVtbnMpJXNpemVvZihMaHNQYWNrZXQpKT09MCk7CisgIH0KKyAgZWxzZSBpZihWZWN0b3JpemFibGUpCisgIHsKKyAgICBhbGlnbmVkU3RhcnQgPSAwOworICAgIGFsaWduZWRTaXplID0gc2l6ZTsKKyAgICBhbGlnbm1lbnRQYXR0ZXJuID0gQWxsQWxpZ25lZDsKKyAgfQorCisgIEluZGV4IG9mZnNldDEgPSAoRmlyc3RBbGlnbmVkICYmIGFsaWdubWVudFN0ZXA9PTE/MzoxKTsKKyAgSW5kZXggb2Zmc2V0MyA9IChGaXJzdEFsaWduZWQgJiYgYWxpZ25tZW50U3RlcD09MT8xOjMpOworCisgIEluZGV4IGNvbHVtbkJvdW5kID0gKChjb2xzLXNraXBDb2x1bW5zKS9jb2x1bW5zQXRPbmNlKSpjb2x1bW5zQXRPbmNlICsgc2tpcENvbHVtbnM7CisgIGZvciAoSW5kZXggaT1za2lwQ29sdW1uczsgaTxjb2x1bW5Cb3VuZDsgaSs9Y29sdW1uc0F0T25jZSkKKyAgeworICAgIFJoc1BhY2tldCBwdG1wMCA9IHBzZXQxPFJoc1BhY2tldD4oYWxwaGEqcmhzW2kqcmhzSW5jcl0pLAorICAgICAgICAgICAgICBwdG1wMSA9IHBzZXQxPFJoc1BhY2tldD4oYWxwaGEqcmhzWyhpK29mZnNldDEpKnJoc0luY3JdKSwKKyAgICAgICAgICAgICAgcHRtcDIgPSBwc2V0MTxSaHNQYWNrZXQ+KGFscGhhKnJoc1soaSsyKSpyaHNJbmNyXSksCisgICAgICAgICAgICAgIHB0bXAzID0gcHNldDE8UmhzUGFja2V0PihhbHBoYSpyaHNbKGkrb2Zmc2V0MykqcmhzSW5jcl0pOworCisgICAgLy8gdGhpcyBoZWxwcyBhIGxvdCBnZW5lcmF0aW5nIGJldHRlciBiaW5hcnkgY29kZQorICAgIGNvbnN0IExoc1NjYWxhciAqbGhzMCA9IGxocyArIGkqbGhzU3RyaWRlLCAgICAgKmxoczEgPSBsaHMgKyAoaStvZmZzZXQxKSpsaHNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICpsaHMyID0gbGhzICsgKGkrMikqbGhzU3RyaWRlLCAqbGhzMyA9IGxocyArIChpK29mZnNldDMpKmxoc1N0cmlkZTsKKworICAgIGlmIChWZWN0b3JpemFibGUpCisgICAgeworICAgICAgLyogZXhwbGljaXQgdmVjdG9yaXphdGlvbiAqLworICAgICAgLy8gcHJvY2VzcyBpbml0aWFsIHVuYWxpZ25lZCBjb2VmZnMKKyAgICAgIGZvciAoSW5kZXggaj0wOyBqPGFsaWduZWRTdGFydDsgKytqKQorICAgICAgeworICAgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMwW2pdLCBwZmlyc3QocHRtcDApLCByZXNbal0pOworICAgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMxW2pdLCBwZmlyc3QocHRtcDEpLCByZXNbal0pOworICAgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMyW2pdLCBwZmlyc3QocHRtcDIpLCByZXNbal0pOworICAgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMzW2pdLCBwZmlyc3QocHRtcDMpLCByZXNbal0pOworICAgICAgfQorCisgICAgICBpZiAoYWxpZ25lZFNpemU+YWxpZ25lZFN0YXJ0KQorICAgICAgeworICAgICAgICBzd2l0Y2goYWxpZ25tZW50UGF0dGVybikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgQWxsQWxpZ25lZDoKKyAgICAgICAgICAgIGZvciAoSW5kZXggaiA9IGFsaWduZWRTdGFydDsgajxhbGlnbmVkU2l6ZTsgais9UmVzUGFja2V0U2l6ZSkKKyAgICAgICAgICAgICAgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUyhkLGQsZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEV2ZW5BbGlnbmVkOgorICAgICAgICAgICAgZm9yIChJbmRleCBqID0gYWxpZ25lZFN0YXJ0OyBqPGFsaWduZWRTaXplOyBqKz1SZXNQYWNrZXRTaXplKQorICAgICAgICAgICAgICBfRUlHRU5fQUNDVU1VTEFURV9QQUNLRVRTKGQsZHUsZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEZpcnN0QWxpZ25lZDoKKyAgICAgICAgICAgIGlmKHBlZWxzPjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIExoc1BhY2tldCBBMDAsIEEwMSwgQTAyLCBBMDMsIEExMCwgQTExLCBBMTIsIEExMzsKKyAgICAgICAgICAgICAgUmVzUGFja2V0IFQwLCBUMTsKKworICAgICAgICAgICAgICBBMDEgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMxW2FsaWduZWRTdGFydC0xXSk7CisgICAgICAgICAgICAgIEEwMiA9IHBsb2FkPExoc1BhY2tldD4oJmxoczJbYWxpZ25lZFN0YXJ0LTJdKTsKKyAgICAgICAgICAgICAgQTAzID0gcGxvYWQ8TGhzUGFja2V0PigmbGhzM1thbGlnbmVkU3RhcnQtM10pOworCisgICAgICAgICAgICAgIGZvciAoSW5kZXggaiA9IGFsaWduZWRTdGFydDsgajxwZWVsZWRTaXplOyBqKz1wZWVscypSZXNQYWNrZXRTaXplKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQTExID0gcGxvYWQ8TGhzUGFja2V0PigmbGhzMVtqLTErTGhzUGFja2V0U2l6ZV0pOyAgcGFsaWduPDE+KEEwMSxBMTEpOworICAgICAgICAgICAgICAgIEExMiA9IHBsb2FkPExoc1BhY2tldD4oJmxoczJbai0yK0xoc1BhY2tldFNpemVdKTsgIHBhbGlnbjwyPihBMDIsQTEyKTsKKyAgICAgICAgICAgICAgICBBMTMgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMzW2otMytMaHNQYWNrZXRTaXplXSk7ICBwYWxpZ248Mz4oQTAzLEExMyk7CisKKyAgICAgICAgICAgICAgICBBMDAgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMwW2pdKTsKKyAgICAgICAgICAgICAgICBBMTAgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMwW2orTGhzUGFja2V0U2l6ZV0pOworICAgICAgICAgICAgICAgIFQwICA9IHBjai5wbWFkZChBMDAsIHB0bXAwLCBwbG9hZDxSZXNQYWNrZXQ+KCZyZXNbal0pKTsKKyAgICAgICAgICAgICAgICBUMSAgPSBwY2oucG1hZGQoQTEwLCBwdG1wMCwgcGxvYWQ8UmVzUGFja2V0PigmcmVzW2orUmVzUGFja2V0U2l6ZV0pKTsKKworICAgICAgICAgICAgICAgIFQwICA9IHBjai5wbWFkZChBMDEsIHB0bXAxLCBUMCk7CisgICAgICAgICAgICAgICAgQTAxID0gcGxvYWQ8TGhzUGFja2V0PigmbGhzMVtqLTErMipMaHNQYWNrZXRTaXplXSk7ICBwYWxpZ248MT4oQTExLEEwMSk7CisgICAgICAgICAgICAgICAgVDAgID0gcGNqLnBtYWRkKEEwMiwgcHRtcDIsIFQwKTsKKyAgICAgICAgICAgICAgICBBMDIgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMyW2otMisyKkxoc1BhY2tldFNpemVdKTsgIHBhbGlnbjwyPihBMTIsQTAyKTsKKyAgICAgICAgICAgICAgICBUMCAgPSBwY2oucG1hZGQoQTAzLCBwdG1wMywgVDApOworICAgICAgICAgICAgICAgIHBzdG9yZSgmcmVzW2pdLFQwKTsKKyAgICAgICAgICAgICAgICBBMDMgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMzW2otMysyKkxoc1BhY2tldFNpemVdKTsgIHBhbGlnbjwzPihBMTMsQTAzKTsKKyAgICAgICAgICAgICAgICBUMSAgPSBwY2oucG1hZGQoQTExLCBwdG1wMSwgVDEpOworICAgICAgICAgICAgICAgIFQxICA9IHBjai5wbWFkZChBMTIsIHB0bXAyLCBUMSk7CisgICAgICAgICAgICAgICAgVDEgID0gcGNqLnBtYWRkKEExMywgcHRtcDMsIFQxKTsKKyAgICAgICAgICAgICAgICBwc3RvcmUoJnJlc1tqK1Jlc1BhY2tldFNpemVdLFQxKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJbmRleCBqID0gcGVlbGVkU2l6ZTsgajxhbGlnbmVkU2l6ZTsgais9UmVzUGFja2V0U2l6ZSkKKyAgICAgICAgICAgICAgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUyhkLGR1LGR1KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmb3IgKEluZGV4IGogPSBhbGlnbmVkU3RhcnQ7IGo8YWxpZ25lZFNpemU7IGorPVJlc1BhY2tldFNpemUpCisgICAgICAgICAgICAgIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMoZHUsZHUsZHUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IC8vIGVuZCBleHBsaWNpdCB2ZWN0b3JpemF0aW9uCisKKyAgICAvKiBwcm9jZXNzIHJlbWFpbmluZyBjb2VmZnMgKG9yIGFsbCBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCB2ZWN0b3JpemF0aW9uKSAqLworICAgIGZvciAoSW5kZXggaj1hbGlnbmVkU2l6ZTsgajxzaXplOyArK2opCisgICAgeworICAgICAgcmVzW2pdID0gY2oucG1hZGQobGhzMFtqXSwgcGZpcnN0KHB0bXAwKSwgcmVzW2pdKTsKKyAgICAgIHJlc1tqXSA9IGNqLnBtYWRkKGxoczFbal0sIHBmaXJzdChwdG1wMSksIHJlc1tqXSk7CisgICAgICByZXNbal0gPSBjai5wbWFkZChsaHMyW2pdLCBwZmlyc3QocHRtcDIpLCByZXNbal0pOworICAgICAgcmVzW2pdID0gY2oucG1hZGQobGhzM1tqXSwgcGZpcnN0KHB0bXAzKSwgcmVzW2pdKTsKKyAgICB9CisgIH0KKworICAvLyBwcm9jZXNzIHJlbWFpbmluZyBmaXJzdCBhbmQgbGFzdCBjb2x1bW5zIChhdCBtb3N0IGNvbHVtbnNBdE9uY2UtMSkKKyAgSW5kZXggZW5kID0gY29sczsKKyAgSW5kZXggc3RhcnQgPSBjb2x1bW5Cb3VuZDsKKyAgZG8KKyAgeworICAgIGZvciAoSW5kZXggaz1zdGFydDsgazxlbmQ7ICsraykKKyAgICB7CisgICAgICBSaHNQYWNrZXQgcHRtcDAgPSBwc2V0MTxSaHNQYWNrZXQ+KGFscGhhKnJoc1trKnJoc0luY3JdKTsKKyAgICAgIGNvbnN0IExoc1NjYWxhciogbGhzMCA9IGxocyArIGsqbGhzU3RyaWRlOworCisgICAgICBpZiAoVmVjdG9yaXphYmxlKQorICAgICAgeworICAgICAgICAvKiBleHBsaWNpdCB2ZWN0b3JpemF0aW9uICovCisgICAgICAgIC8vIHByb2Nlc3MgZmlyc3QgdW5hbGlnbmVkIHJlc3VsdCdzIGNvZWZmcworICAgICAgICBmb3IgKEluZGV4IGo9MDsgajxhbGlnbmVkU3RhcnQ7ICsraikKKyAgICAgICAgICByZXNbal0gKz0gY2oucG11bChsaHMwW2pdLCBwZmlyc3QocHRtcDApKTsKKyAgICAgICAgLy8gcHJvY2VzcyBhbGlnbmVkIHJlc3VsdCdzIGNvZWZmcworICAgICAgICBpZiAoKHNpemVfdChsaHMwK2FsaWduZWRTdGFydCklc2l6ZW9mKExoc1BhY2tldCkpPT0wKQorICAgICAgICAgIGZvciAoSW5kZXggaSA9IGFsaWduZWRTdGFydDtpPGFsaWduZWRTaXplO2krPVJlc1BhY2tldFNpemUpCisgICAgICAgICAgICBwc3RvcmUoJnJlc1tpXSwgcGNqLnBtYWRkKHBsb2FkdTxMaHNQYWNrZXQ+KCZsaHMwW2ldKSwgcHRtcDAsIHBsb2FkPFJlc1BhY2tldD4oJnJlc1tpXSkpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZvciAoSW5kZXggaSA9IGFsaWduZWRTdGFydDtpPGFsaWduZWRTaXplO2krPVJlc1BhY2tldFNpemUpCisgICAgICAgICAgICBwc3RvcmUoJnJlc1tpXSwgcGNqLnBtYWRkKHBsb2FkdTxMaHNQYWNrZXQ+KCZsaHMwW2ldKSwgcHRtcDAsIHBsb2FkPFJlc1BhY2tldD4oJnJlc1tpXSkpKTsKKyAgICAgIH0KKworICAgICAgLy8gcHJvY2VzcyByZW1haW5pbmcgc2NhbGFycyAob3IgYWxsIGlmIG5vIGV4cGxpY2l0IHZlY3Rvcml6YXRpb24pCisgICAgICBmb3IgKEluZGV4IGk9YWxpZ25lZFNpemU7IGk8c2l6ZTsgKytpKQorICAgICAgICByZXNbaV0gKz0gY2oucG11bChsaHMwW2ldLCBwZmlyc3QocHRtcDApKTsKKyAgICB9CisgICAgaWYgKHNraXBDb2x1bW5zKQorICAgIHsKKyAgICAgIHN0YXJ0ID0gMDsKKyAgICAgIGVuZCA9IHNraXBDb2x1bW5zOworICAgICAgc2tpcENvbHVtbnMgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfSB3aGlsZShWZWN0b3JpemFibGUpOworICAjdW5kZWYgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUworfQorfTsKKworLyogT3B0aW1pemVkIHJvdy1tYWpvciBtYXRyaXggKiB2ZWN0b3IgcHJvZHVjdDoKKyAqIFRoaXMgYWxnb3JpdGhtIHByb2Nlc3NlcyA0IHJvd3MgYXQgb25jZXMgdGhhdCBhbGxvd3MgdG8gYm90aCByZWR1Y2UKKyAqIHRoZSBudW1iZXIgb2YgbG9hZC9zdG9yZXMgb2YgdGhlIHJlc3VsdCBieSBhIGZhY3RvciA0IGFuZCB0byByZWR1Y2UKKyAqIHRoZSBpbnN0cnVjdGlvbiBkZXBlbmRlbmN5LiBNb3Jlb3Zlciwgd2Uga25vdyB0aGF0IGFsbCBiYW5kcyBoYXZlIHRoZQorICogc2FtZSBhbGlnbm1lbnQgcGF0dGVybi4KKyAqCisgKiBNaXhpbmcgdHlwZSBsb2dpYzoKKyAqICAtIGFscGhhIGlzIGFsd2F5cyBhIGNvbXBsZXggKG9yIGNvbnZlcnRlZCB0byBhIGNvbXBsZXgpCisgKiAgLSBubyB2ZWN0b3JpemF0aW9uCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uanVnYXRlTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxJbmRleCxMaHNTY2FsYXIsUm93TWFqb3IsQ29uanVnYXRlTGhzLFJoc1NjYWxhcixDb25qdWdhdGVSaHMsVmVyc2lvbj4KK3sKK3R5cGVkZWYgdHlwZW5hbWUgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CisKK2VudW0geworICBWZWN0b3JpemFibGUgPSBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OlZlY3Rvcml6YWJsZSAmJiBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OlZlY3Rvcml6YWJsZQorICAgICAgICAgICAgICAmJiBpbnQocGFja2V0X3RyYWl0czxMaHNTY2FsYXI+OjpzaXplKT09aW50KHBhY2tldF90cmFpdHM8UmhzU2NhbGFyPjo6c2l6ZSksCisgIExoc1BhY2tldFNpemUgPSBWZWN0b3JpemFibGUgPyBwYWNrZXRfdHJhaXRzPExoc1NjYWxhcj46OnNpemUgOiAxLAorICBSaHNQYWNrZXRTaXplID0gVmVjdG9yaXphYmxlID8gcGFja2V0X3RyYWl0czxSaHNTY2FsYXI+OjpzaXplIDogMSwKKyAgUmVzUGFja2V0U2l6ZSA9IFZlY3Rvcml6YWJsZSA/IHBhY2tldF90cmFpdHM8UmVzU2NhbGFyPjo6c2l6ZSA6IDEKK307CisKK3R5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxMaHNTY2FsYXI+Ojp0eXBlICBfTGhzUGFja2V0OwordHlwZWRlZiB0eXBlbmFtZSBwYWNrZXRfdHJhaXRzPFJoc1NjYWxhcj46OnR5cGUgIF9SaHNQYWNrZXQ7Cit0eXBlZGVmIHR5cGVuYW1lIHBhY2tldF90cmFpdHM8UmVzU2NhbGFyPjo6dHlwZSAgX1Jlc1BhY2tldDsKKwordHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxWZWN0b3JpemFibGUsX0xoc1BhY2tldCxMaHNTY2FsYXI+Ojp0eXBlIExoc1BhY2tldDsKK3R5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8VmVjdG9yaXphYmxlLF9SaHNQYWNrZXQsUmhzU2NhbGFyPjo6dHlwZSBSaHNQYWNrZXQ7Cit0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPFZlY3Rvcml6YWJsZSxfUmVzUGFja2V0LFJlc1NjYWxhcj46OnR5cGUgUmVzUGFja2V0OworICAKK0VJR0VOX0RPTlRfSU5MSU5FIHN0YXRpYyB2b2lkIHJ1bigKKyAgSW5kZXggcm93cywgSW5kZXggY29scywKKyAgY29uc3QgTGhzU2NhbGFyKiBsaHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgY29uc3QgUmhzU2NhbGFyKiByaHMsIEluZGV4IHJoc0luY3IsCisgIFJlc1NjYWxhciogcmVzLCBJbmRleCByZXNJbmNyLAorICBSZXNTY2FsYXIgYWxwaGEpCit7CisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShyaHNJbmNyKTsKKyAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHJoc0luY3I9PTEpOworICAjaWZkZWYgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUworICAjZXJyb3IgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQKKyAgI2VuZGlmCisKKyAgI2RlZmluZSBfRUlHRU5fQUNDVU1VTEFURV9QQUNLRVRTKEEwLEExMyxBMikge1wKKyAgICBSaHNQYWNrZXQgYiA9IHBsb2FkPFJoc1BhY2tldD4oJnJoc1tqXSk7IFwKKyAgICBwdG1wMCA9IHBjai5wbWFkZChFSUdFTl9DQVQocGxvYSxBMCkgPExoc1BhY2tldD4oJmxoczBbal0pLCBiLCBwdG1wMCk7IFwKKyAgICBwdG1wMSA9IHBjai5wbWFkZChFSUdFTl9DQVQocGxvYSxBMTMpPExoc1BhY2tldD4oJmxoczFbal0pLCBiLCBwdG1wMSk7IFwKKyAgICBwdG1wMiA9IHBjai5wbWFkZChFSUdFTl9DQVQocGxvYSxBMikgPExoc1BhY2tldD4oJmxoczJbal0pLCBiLCBwdG1wMik7IFwKKyAgICBwdG1wMyA9IHBjai5wbWFkZChFSUdFTl9DQVQocGxvYSxBMTMpPExoc1BhY2tldD4oJmxoczNbal0pLCBiLCBwdG1wMyk7IH0KKworICBjb25qX2hlbHBlcjxMaHNTY2FsYXIsUmhzU2NhbGFyLENvbmp1Z2F0ZUxocyxDb25qdWdhdGVSaHM+IGNqOworICBjb25qX2hlbHBlcjxMaHNQYWNrZXQsUmhzUGFja2V0LENvbmp1Z2F0ZUxocyxDb25qdWdhdGVSaHM+IHBjajsKKworICBlbnVtIHsgQWxsQWxpZ25lZD0wLCBFdmVuQWxpZ25lZD0xLCBGaXJzdEFsaWduZWQ9MiwgTm9uZUFsaWduZWQ9MyB9OworICBjb25zdCBJbmRleCByb3dzQXRPbmNlID0gNDsKKyAgY29uc3QgSW5kZXggcGVlbHMgPSAyOworICBjb25zdCBJbmRleCBSaHNQYWNrZXRBbGlnbmVkTWFzayA9IFJoc1BhY2tldFNpemUtMTsKKyAgY29uc3QgSW5kZXggTGhzUGFja2V0QWxpZ25lZE1hc2sgPSBMaHNQYWNrZXRTaXplLTE7CisgIGNvbnN0IEluZGV4IFBlZWxBbGlnbmVkTWFzayA9IFJoc1BhY2tldFNpemUqcGVlbHMtMTsKKyAgY29uc3QgSW5kZXggZGVwdGggPSBjb2xzOworCisgIC8vIEhvdyBtYW55IGNvZWZmcyBvZiB0aGUgcmVzdWx0IGRvIHdlIGhhdmUgdG8gc2tpcCB0byBiZSBhbGlnbmVkLgorICAvLyBIZXJlIHdlIGFzc3VtZSBkYXRhIGFyZSBhdCBsZWFzdCBhbGlnbmVkIG9uIHRoZSBiYXNlIHNjYWxhciB0eXBlCisgIC8vIGlmIHRoYXQncyBub3QgdGhlIGNhc2UgdGhlbiB2ZWN0b3JpemF0aW9uIGlzIGRpc2NhcmRlZCwgc2VlIGJlbG93LgorICBJbmRleCBhbGlnbmVkU3RhcnQgPSBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZChyaHMsIGRlcHRoKTsKKyAgSW5kZXggYWxpZ25lZFNpemUgPSBSaHNQYWNrZXRTaXplPjEgPyBhbGlnbmVkU3RhcnQgKyAoKGRlcHRoLWFsaWduZWRTdGFydCkgJiB+UmhzUGFja2V0QWxpZ25lZE1hc2spIDogMDsKKyAgY29uc3QgSW5kZXggcGVlbGVkU2l6ZSAgPSBwZWVscz4xID8gYWxpZ25lZFN0YXJ0ICsgKChhbGlnbmVkU2l6ZS1hbGlnbmVkU3RhcnQpICYgflBlZWxBbGlnbmVkTWFzaykgOiBhbGlnbmVkU3RhcnQ7CisKKyAgY29uc3QgSW5kZXggYWxpZ25tZW50U3RlcCA9IExoc1BhY2tldFNpemU+MSA/IChMaHNQYWNrZXRTaXplIC0gbGhzU3RyaWRlICUgTGhzUGFja2V0U2l6ZSkgJiBMaHNQYWNrZXRBbGlnbmVkTWFzayA6IDA7CisgIEluZGV4IGFsaWdubWVudFBhdHRlcm4gPSBhbGlnbm1lbnRTdGVwPT0wID8gQWxsQWxpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgIDogYWxpZ25tZW50U3RlcD09KExoc1BhY2tldFNpemUvMikgPyBFdmVuQWxpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgIDogRmlyc3RBbGlnbmVkOworCisgIC8vIHdlIGNhbm5vdCBhc3N1bWUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYWxpZ25lZCBiZWNhdXNlIG9mIHN1Yi1tYXRyaWNlcworICBjb25zdCBJbmRleCBsaHNBbGlnbm1lbnRPZmZzZXQgPSBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZChsaHMsZGVwdGgpOworCisgIC8vIGZpbmQgaG93IG1hbnkgcm93cyBkbyB3ZSBoYXZlIHRvIHNraXAgdG8gYmUgYWxpZ25lZCB3aXRoIHJocyAoaWYgcG9zc2libGUpCisgIEluZGV4IHNraXBSb3dzID0gMDsKKyAgLy8gaWYgdGhlIGRhdGEgY2Fubm90IGJlIGFsaWduZWQgKFRPRE8gYWRkIHNvbWUgY29tcGlsZSB0aW1lIHRlc3RzIHdoZW4gcG9zc2libGUsIGUuZy4gZm9yIGZsb2F0cykKKyAgaWYoIChzaXplb2YoTGhzU2NhbGFyKSE9c2l6ZW9mKFJoc1NjYWxhcikpIHx8IChzaXplX3QobGhzKSVzaXplb2YoTGhzU2NhbGFyKSkgfHwgKHNpemVfdChyaHMpJXNpemVvZihSaHNTY2FsYXIpKSApCisgIHsKKyAgICBhbGlnbmVkU2l6ZSA9IDA7CisgICAgYWxpZ25lZFN0YXJ0ID0gMDsKKyAgfQorICBlbHNlIGlmIChMaHNQYWNrZXRTaXplPjEpCisgIHsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoc2l6ZV90KGxocytsaHNBbGlnbm1lbnRPZmZzZXQpJXNpemVvZihMaHNQYWNrZXQpPT0wICB8fCBkZXB0aDxMaHNQYWNrZXRTaXplKTsKKworICAgIHdoaWxlIChza2lwUm93czxMaHNQYWNrZXRTaXplICYmCisgICAgICAgICAgIGFsaWduZWRTdGFydCAhPSAoKGxoc0FsaWdubWVudE9mZnNldCArIGFsaWdubWVudFN0ZXAqc2tpcFJvd3MpJUxoc1BhY2tldFNpemUpKQorICAgICAgKytza2lwUm93czsKKyAgICBpZiAoc2tpcFJvd3M9PUxoc1BhY2tldFNpemUpCisgICAgeworICAgICAgLy8gbm90aGluZyBjYW4gYmUgYWxpZ25lZCwgbm8gbmVlZCB0byBza2lwIGFueSBjb2x1bW4KKyAgICAgIGFsaWdubWVudFBhdHRlcm4gPSBOb25lQWxpZ25lZDsKKyAgICAgIHNraXBSb3dzID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNraXBSb3dzID0gKHN0ZDo6bWluKShza2lwUm93cyxJbmRleChyb3dzKSk7CisgICAgICAvLyBub3RlIHRoYXQgdGhlIHNraXBlZCBjb2x1bW5zIGFyZSBwcm9jZXNzZWQgbGF0ZXIuCisgICAgfQorICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydCggIGFsaWdubWVudFBhdHRlcm49PU5vbmVBbGlnbmVkCisgICAgICAgICAgICAgICAgICAgICAgfHwgTGhzUGFja2V0U2l6ZT09MQorICAgICAgICAgICAgICAgICAgICAgIHx8IChza2lwUm93cyArIHJvd3NBdE9uY2UgPj0gcm93cykKKyAgICAgICAgICAgICAgICAgICAgICB8fCBMaHNQYWNrZXRTaXplID4gZGVwdGgKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoc2l6ZV90KGxocythbGlnbmVkU3RhcnQrbGhzU3RyaWRlKnNraXBSb3dzKSVzaXplb2YoTGhzUGFja2V0KSk9PTApOworICB9CisgIGVsc2UgaWYoVmVjdG9yaXphYmxlKQorICB7CisgICAgYWxpZ25lZFN0YXJ0ID0gMDsKKyAgICBhbGlnbmVkU2l6ZSA9IGRlcHRoOworICAgIGFsaWdubWVudFBhdHRlcm4gPSBBbGxBbGlnbmVkOworICB9CisKKyAgSW5kZXggb2Zmc2V0MSA9IChGaXJzdEFsaWduZWQgJiYgYWxpZ25tZW50U3RlcD09MT8zOjEpOworICBJbmRleCBvZmZzZXQzID0gKEZpcnN0QWxpZ25lZCAmJiBhbGlnbm1lbnRTdGVwPT0xPzE6Myk7CisKKyAgSW5kZXggcm93Qm91bmQgPSAoKHJvd3Mtc2tpcFJvd3MpL3Jvd3NBdE9uY2UpKnJvd3NBdE9uY2UgKyBza2lwUm93czsKKyAgZm9yIChJbmRleCBpPXNraXBSb3dzOyBpPHJvd0JvdW5kOyBpKz1yb3dzQXRPbmNlKQorICB7CisgICAgRUlHRU5fQUxJR04xNiBSZXNTY2FsYXIgdG1wMCA9IFJlc1NjYWxhcigwKTsKKyAgICBSZXNTY2FsYXIgdG1wMSA9IFJlc1NjYWxhcigwKSwgdG1wMiA9IFJlc1NjYWxhcigwKSwgdG1wMyA9IFJlc1NjYWxhcigwKTsKKworICAgIC8vIHRoaXMgaGVscHMgdGhlIGNvbXBpbGVyIGdlbmVyYXRpbmcgZ29vZCBiaW5hcnkgY29kZQorICAgIGNvbnN0IExoc1NjYWxhciAqbGhzMCA9IGxocyArIGkqbGhzU3RyaWRlLCAgICAgKmxoczEgPSBsaHMgKyAoaStvZmZzZXQxKSpsaHNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICpsaHMyID0gbGhzICsgKGkrMikqbGhzU3RyaWRlLCAqbGhzMyA9IGxocyArIChpK29mZnNldDMpKmxoc1N0cmlkZTsKKworICAgIGlmIChWZWN0b3JpemFibGUpCisgICAgeworICAgICAgLyogZXhwbGljaXQgdmVjdG9yaXphdGlvbiAqLworICAgICAgUmVzUGFja2V0IHB0bXAwID0gcHNldDE8UmVzUGFja2V0PihSZXNTY2FsYXIoMCkpLCBwdG1wMSA9IHBzZXQxPFJlc1BhY2tldD4oUmVzU2NhbGFyKDApKSwKKyAgICAgICAgICAgICAgICBwdG1wMiA9IHBzZXQxPFJlc1BhY2tldD4oUmVzU2NhbGFyKDApKSwgcHRtcDMgPSBwc2V0MTxSZXNQYWNrZXQ+KFJlc1NjYWxhcigwKSk7CisKKyAgICAgIC8vIHByb2Nlc3MgaW5pdGlhbCB1bmFsaWduZWQgY29lZmZzCisgICAgICAvLyBGSVhNRSB0aGlzIGxvb3AgZ2V0IHZlY3Rvcml6ZWQgYnkgdGhlIGNvbXBpbGVyICEKKyAgICAgIGZvciAoSW5kZXggaj0wOyBqPGFsaWduZWRTdGFydDsgKytqKQorICAgICAgeworICAgICAgICBSaHNTY2FsYXIgYiA9IHJoc1tqXTsKKyAgICAgICAgdG1wMCArPSBjai5wbXVsKGxoczBbal0sYik7IHRtcDEgKz0gY2oucG11bChsaHMxW2pdLGIpOworICAgICAgICB0bXAyICs9IGNqLnBtdWwobGhzMltqXSxiKTsgdG1wMyArPSBjai5wbXVsKGxoczNbal0sYik7CisgICAgICB9CisKKyAgICAgIGlmIChhbGlnbmVkU2l6ZT5hbGlnbmVkU3RhcnQpCisgICAgICB7CisgICAgICAgIHN3aXRjaChhbGlnbm1lbnRQYXR0ZXJuKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBBbGxBbGlnbmVkOgorICAgICAgICAgICAgZm9yIChJbmRleCBqID0gYWxpZ25lZFN0YXJ0OyBqPGFsaWduZWRTaXplOyBqKz1SaHNQYWNrZXRTaXplKQorICAgICAgICAgICAgICBfRUlHRU5fQUNDVU1VTEFURV9QQUNLRVRTKGQsZCxkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRXZlbkFsaWduZWQ6CisgICAgICAgICAgICBmb3IgKEluZGV4IGogPSBhbGlnbmVkU3RhcnQ7IGo8YWxpZ25lZFNpemU7IGorPVJoc1BhY2tldFNpemUpCisgICAgICAgICAgICAgIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMoZCxkdSxkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRmlyc3RBbGlnbmVkOgorICAgICAgICAgICAgaWYgKHBlZWxzPjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEhlcmUgd2UgcHJvY2Nlc3MgNCByb3dzIHdpdGggd2l0aCB0d28gcGVlbGVkIGl0ZXJhdGlvbnMgdG8gaGlkZQorICAgICAgICAgICAgICAgKiB0Z2hlIG92ZXJoZWFkIG9mIHVuYWxpZ25lZCBsb2Fkcy4gTW9yZW92ZXIgdW5hbGlnbmVkIGxvYWRzIGFyZSBoYW5kbGVkCisgICAgICAgICAgICAgICAqIHVzaW5nIHNwZWNpYWwgc2hpZnQvbW92ZSBvcGVyYXRpb25zIGJldHdlZW4gdGhlIHR3byBhbGlnbmVkIHBhY2tldHMKKyAgICAgICAgICAgICAgICogb3ZlcmxhcGluZyB0aGUgZGVzaXJlZCB1bmFsaWduZWQgcGFja2V0LiBUaGlzIGlzICptdWNoKiBtb3JlIGVmZmljaWVudAorICAgICAgICAgICAgICAgKiB0aGFuIGJhc2ljIHVuYWxpZ25lZCBsb2Fkcy4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIExoc1BhY2tldCBBMDEsIEEwMiwgQTAzLCBBMTEsIEExMiwgQTEzOworICAgICAgICAgICAgICBBMDEgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMxW2FsaWduZWRTdGFydC0xXSk7CisgICAgICAgICAgICAgIEEwMiA9IHBsb2FkPExoc1BhY2tldD4oJmxoczJbYWxpZ25lZFN0YXJ0LTJdKTsKKyAgICAgICAgICAgICAgQTAzID0gcGxvYWQ8TGhzUGFja2V0PigmbGhzM1thbGlnbmVkU3RhcnQtM10pOworCisgICAgICAgICAgICAgIGZvciAoSW5kZXggaiA9IGFsaWduZWRTdGFydDsgajxwZWVsZWRTaXplOyBqKz1wZWVscypSaHNQYWNrZXRTaXplKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmhzUGFja2V0IGIgPSBwbG9hZDxSaHNQYWNrZXQ+KCZyaHNbal0pOworICAgICAgICAgICAgICAgIEExMSA9IHBsb2FkPExoc1BhY2tldD4oJmxoczFbai0xK0xoc1BhY2tldFNpemVdKTsgIHBhbGlnbjwxPihBMDEsQTExKTsKKyAgICAgICAgICAgICAgICBBMTIgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMyW2otMitMaHNQYWNrZXRTaXplXSk7ICBwYWxpZ248Mj4oQTAyLEExMik7CisgICAgICAgICAgICAgICAgQTEzID0gcGxvYWQ8TGhzUGFja2V0PigmbGhzM1tqLTMrTGhzUGFja2V0U2l6ZV0pOyAgcGFsaWduPDM+KEEwMyxBMTMpOworCisgICAgICAgICAgICAgICAgcHRtcDAgPSBwY2oucG1hZGQocGxvYWQ8TGhzUGFja2V0PigmbGhzMFtqXSksIGIsIHB0bXAwKTsKKyAgICAgICAgICAgICAgICBwdG1wMSA9IHBjai5wbWFkZChBMDEsIGIsIHB0bXAxKTsKKyAgICAgICAgICAgICAgICBBMDEgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMxW2otMSsyKkxoc1BhY2tldFNpemVdKTsgIHBhbGlnbjwxPihBMTEsQTAxKTsKKyAgICAgICAgICAgICAgICBwdG1wMiA9IHBjai5wbWFkZChBMDIsIGIsIHB0bXAyKTsKKyAgICAgICAgICAgICAgICBBMDIgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMyW2otMisyKkxoc1BhY2tldFNpemVdKTsgIHBhbGlnbjwyPihBMTIsQTAyKTsKKyAgICAgICAgICAgICAgICBwdG1wMyA9IHBjai5wbWFkZChBMDMsIGIsIHB0bXAzKTsKKyAgICAgICAgICAgICAgICBBMDMgPSBwbG9hZDxMaHNQYWNrZXQ+KCZsaHMzW2otMysyKkxoc1BhY2tldFNpemVdKTsgIHBhbGlnbjwzPihBMTMsQTAzKTsKKworICAgICAgICAgICAgICAgIGIgPSBwbG9hZDxSaHNQYWNrZXQ+KCZyaHNbaitSaHNQYWNrZXRTaXplXSk7CisgICAgICAgICAgICAgICAgcHRtcDAgPSBwY2oucG1hZGQocGxvYWQ8TGhzUGFja2V0PigmbGhzMFtqK0xoc1BhY2tldFNpemVdKSwgYiwgcHRtcDApOworICAgICAgICAgICAgICAgIHB0bXAxID0gcGNqLnBtYWRkKEExMSwgYiwgcHRtcDEpOworICAgICAgICAgICAgICAgIHB0bXAyID0gcGNqLnBtYWRkKEExMiwgYiwgcHRtcDIpOworICAgICAgICAgICAgICAgIHB0bXAzID0gcGNqLnBtYWRkKEExMywgYiwgcHRtcDMpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEluZGV4IGogPSBwZWVsZWRTaXplOyBqPGFsaWduZWRTaXplOyBqKz1SaHNQYWNrZXRTaXplKQorICAgICAgICAgICAgICBfRUlHRU5fQUNDVU1VTEFURV9QQUNLRVRTKGQsZHUsZHUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZvciAoSW5kZXggaiA9IGFsaWduZWRTdGFydDsgajxhbGlnbmVkU2l6ZTsgais9UmhzUGFja2V0U2l6ZSkKKyAgICAgICAgICAgICAgX0VJR0VOX0FDQ1VNVUxBVEVfUEFDS0VUUyhkdSxkdSxkdSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0bXAwICs9IHByZWR1eChwdG1wMCk7CisgICAgICAgIHRtcDEgKz0gcHJlZHV4KHB0bXAxKTsKKyAgICAgICAgdG1wMiArPSBwcmVkdXgocHRtcDIpOworICAgICAgICB0bXAzICs9IHByZWR1eChwdG1wMyk7CisgICAgICB9CisgICAgfSAvLyBlbmQgZXhwbGljaXQgdmVjdG9yaXphdGlvbgorCisgICAgLy8gcHJvY2VzcyByZW1haW5pbmcgY29lZmZzIChvciBhbGwgaWYgbm8gZXhwbGljaXQgdmVjdG9yaXphdGlvbikKKyAgICAvLyBGSVhNRSB0aGlzIGxvb3AgZ2V0IHZlY3Rvcml6ZWQgYnkgdGhlIGNvbXBpbGVyICEKKyAgICBmb3IgKEluZGV4IGo9YWxpZ25lZFNpemU7IGo8ZGVwdGg7ICsraikKKyAgICB7CisgICAgICBSaHNTY2FsYXIgYiA9IHJoc1tqXTsKKyAgICAgIHRtcDAgKz0gY2oucG11bChsaHMwW2pdLGIpOyB0bXAxICs9IGNqLnBtdWwobGhzMVtqXSxiKTsKKyAgICAgIHRtcDIgKz0gY2oucG11bChsaHMyW2pdLGIpOyB0bXAzICs9IGNqLnBtdWwobGhzM1tqXSxiKTsKKyAgICB9CisgICAgcmVzW2kqcmVzSW5jcl0gICAgICAgICAgICArPSBhbHBoYSp0bXAwOworICAgIHJlc1soaStvZmZzZXQxKSpyZXNJbmNyXSAgKz0gYWxwaGEqdG1wMTsKKyAgICByZXNbKGkrMikqcmVzSW5jcl0gICAgICAgICs9IGFscGhhKnRtcDI7CisgICAgcmVzWyhpK29mZnNldDMpKnJlc0luY3JdICArPSBhbHBoYSp0bXAzOworICB9CisKKyAgLy8gcHJvY2VzcyByZW1haW5pbmcgZmlyc3QgYW5kIGxhc3Qgcm93cyAoYXQgbW9zdCBjb2x1bW5zQXRPbmNlLTEpCisgIEluZGV4IGVuZCA9IHJvd3M7CisgIEluZGV4IHN0YXJ0ID0gcm93Qm91bmQ7CisgIGRvCisgIHsKKyAgICBmb3IgKEluZGV4IGk9c3RhcnQ7IGk8ZW5kOyArK2kpCisgICAgeworICAgICAgRUlHRU5fQUxJR04xNiBSZXNTY2FsYXIgdG1wMCA9IFJlc1NjYWxhcigwKTsKKyAgICAgIFJlc1BhY2tldCBwdG1wMCA9IHBzZXQxPFJlc1BhY2tldD4odG1wMCk7CisgICAgICBjb25zdCBMaHNTY2FsYXIqIGxoczAgPSBsaHMgKyBpKmxoc1N0cmlkZTsKKyAgICAgIC8vIHByb2Nlc3MgZmlyc3QgdW5hbGlnbmVkIHJlc3VsdCdzIGNvZWZmcworICAgICAgLy8gRklYTUUgdGhpcyBsb29wIGdldCB2ZWN0b3JpemVkIGJ5IHRoZSBjb21waWxlciAhCisgICAgICBmb3IgKEluZGV4IGo9MDsgajxhbGlnbmVkU3RhcnQ7ICsraikKKyAgICAgICAgdG1wMCArPSBjai5wbXVsKGxoczBbal0sIHJoc1tqXSk7CisKKyAgICAgIGlmIChhbGlnbmVkU2l6ZT5hbGlnbmVkU3RhcnQpCisgICAgICB7CisgICAgICAgIC8vIHByb2Nlc3MgYWxpZ25lZCByaHMgY29lZmZzCisgICAgICAgIGlmICgoc2l6ZV90KGxoczArYWxpZ25lZFN0YXJ0KSVzaXplb2YoTGhzUGFja2V0KSk9PTApCisgICAgICAgICAgZm9yIChJbmRleCBqID0gYWxpZ25lZFN0YXJ0O2o8YWxpZ25lZFNpemU7ais9UmhzUGFja2V0U2l6ZSkKKyAgICAgICAgICAgIHB0bXAwID0gcGNqLnBtYWRkKHBsb2FkPExoc1BhY2tldD4oJmxoczBbal0pLCBwbG9hZDxSaHNQYWNrZXQ+KCZyaHNbal0pLCBwdG1wMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmb3IgKEluZGV4IGogPSBhbGlnbmVkU3RhcnQ7ajxhbGlnbmVkU2l6ZTtqKz1SaHNQYWNrZXRTaXplKQorICAgICAgICAgICAgcHRtcDAgPSBwY2oucG1hZGQocGxvYWR1PExoc1BhY2tldD4oJmxoczBbal0pLCBwbG9hZDxSaHNQYWNrZXQ+KCZyaHNbal0pLCBwdG1wMCk7CisgICAgICAgIHRtcDAgKz0gcHJlZHV4KHB0bXAwKTsKKyAgICAgIH0KKworICAgICAgLy8gcHJvY2VzcyByZW1haW5pbmcgc2NhbGFycworICAgICAgLy8gRklYTUUgdGhpcyBsb29wIGdldCB2ZWN0b3JpemVkIGJ5IHRoZSBjb21waWxlciAhCisgICAgICBmb3IgKEluZGV4IGo9YWxpZ25lZFNpemU7IGo8ZGVwdGg7ICsraikKKyAgICAgICAgdG1wMCArPSBjai5wbXVsKGxoczBbal0sIHJoc1tqXSk7CisgICAgICByZXNbaSpyZXNJbmNyXSArPSBhbHBoYSp0bXAwOworICAgIH0KKyAgICBpZiAoc2tpcFJvd3MpCisgICAgeworICAgICAgc3RhcnQgPSAwOworICAgICAgZW5kID0gc2tpcFJvd3M7CisgICAgICBza2lwUm93cyA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9IHdoaWxlKFZlY3Rvcml6YWJsZSk7CisKKyAgI3VuZGVmIF9FSUdFTl9BQ0NVTVVMQVRFX1BBQ0tFVFMKK30KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSQUxfTUFUUklYX1ZFQ1RPUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9HZW5lcmFsTWF0cml4VmVjdG9yX01LTC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeFZlY3Rvcl9NS0wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWRlNmFmCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvR2VuZXJhbE1hdHJpeFZlY3Rvcl9NS0wuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICBHZW5lcmFsIG1hdHJpeC12ZWN0b3IgcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGJhc2VkIG9uID9HRU1WLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX0dFTkVSQUxfTUFUUklYX1ZFQ1RPUl9NS0xfSAorI2RlZmluZSBFSUdFTl9HRU5FUkFMX01BVFJJWF9WRUNUT1JfTUtMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGdlbmVyYWwgbWF0cml4LXZlY3RvciBtdWx0aXBsaWNhdGlvbiB1c2luZyBCTEFTCisqIGdlbXYgZnVuY3Rpb24gdmlhIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2YKKyogZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q6OnJ1biguLikgbWV0aG9kIGZvciBmbG9hdCwgZG91YmxlLAorKiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGFuZCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiB0eXBlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gZ2VtdiBzcGVjaWFsaXphdGlvbgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgTGhzU2NhbGFyLCBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCBib29sIENvbmp1Z2F0ZVJocz4KK3N0cnVjdCBnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdF9nZW12IDoKKyAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsUmhzU2NhbGFyLENvbmp1Z2F0ZVJocyxCdWlsdEluPiB7fTsKKworI2RlZmluZSBFSUdFTl9NS0xfR0VNVl9TUEVDSUFMSVpFKFNjYWxhcikgXAordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LFNjYWxhcixDb2xNYWpvcixDb25qdWdhdGVMaHMsU2NhbGFyLENvbmp1Z2F0ZVJocyxTcGVjaWFsaXplZD4geyBcCitzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oIFwKKyAgSW5kZXggcm93cywgSW5kZXggY29scywgXAorICBjb25zdCBTY2FsYXIqIGxocywgSW5kZXggbGhzU3RyaWRlLCBcCisgIGNvbnN0IFNjYWxhciogcmhzLCBJbmRleCByaHNJbmNyLCBcCisgIFNjYWxhciogcmVzLCBJbmRleCByZXNJbmNyLCBTY2FsYXIgYWxwaGEpIFwKK3sgXAorICBpZiAoQ29uanVnYXRlTGhzKSB7IFwKKyAgICBnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxJbmRleCxTY2FsYXIsQ29sTWFqb3IsQ29uanVnYXRlTGhzLFNjYWxhcixDb25qdWdhdGVSaHMsQnVpbHRJbj46OnJ1biggXAorICAgICAgcm93cywgY29scywgbGhzLCBsaHNTdHJpZGUsIHJocywgcmhzSW5jciwgcmVzLCByZXNJbmNyLCBhbHBoYSk7IFwKKyAgfSBlbHNlIHsgXAorICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X2dlbXY8SW5kZXgsU2NhbGFyLENvbE1ham9yLENvbmp1Z2F0ZUxocyxTY2FsYXIsQ29uanVnYXRlUmhzPjo6cnVuKCBcCisgICAgICByb3dzLCBjb2xzLCBsaHMsIGxoc1N0cmlkZSwgcmhzLCByaHNJbmNyLCByZXMsIHJlc0luY3IsIGFscGhhKTsgXAorICB9IFwKK30gXAorfTsgXAordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qdWdhdGVMaHMsU2NhbGFyLENvbmp1Z2F0ZVJocyxTcGVjaWFsaXplZD4geyBcCitzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oIFwKKyAgSW5kZXggcm93cywgSW5kZXggY29scywgXAorICBjb25zdCBTY2FsYXIqIGxocywgSW5kZXggbGhzU3RyaWRlLCBcCisgIGNvbnN0IFNjYWxhciogcmhzLCBJbmRleCByaHNJbmNyLCBcCisgIFNjYWxhciogcmVzLCBJbmRleCByZXNJbmNyLCBTY2FsYXIgYWxwaGEpIFwKK3sgXAorICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X2dlbXY8SW5kZXgsU2NhbGFyLFJvd01ham9yLENvbmp1Z2F0ZUxocyxTY2FsYXIsQ29uanVnYXRlUmhzPjo6cnVuKCBcCisgICAgICByb3dzLCBjb2xzLCBsaHMsIGxoc1N0cmlkZSwgcmhzLCByaHNJbmNyLCByZXMsIHJlc0luY3IsIGFscGhhKTsgXAorfSBcCit9OyBcCisKK0VJR0VOX01LTF9HRU1WX1NQRUNJQUxJWkUoZG91YmxlKQorRUlHRU5fTUtMX0dFTVZfU1BFQ0lBTElaRShmbG9hdCkKK0VJR0VOX01LTF9HRU1WX1NQRUNJQUxJWkUoZGNvbXBsZXgpCitFSUdFTl9NS0xfR0VNVl9TUEVDSUFMSVpFKHNjb21wbGV4KQorCisjZGVmaW5lIEVJR0VOX01LTF9HRU1WX1NQRUNJQUxJWkFUSU9OKEVJR1RZUEUsTUtMVFlQRSxNS0xQUkVGSVgpIFwKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgYm9vbCBDb25qdWdhdGVSaHM+IFwKK3N0cnVjdCBnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdF9nZW12PEluZGV4LEVJR1RZUEUsTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxFSUdUWVBFLENvbmp1Z2F0ZVJocz4gXAoreyBcCit0eXBlZGVmIE1hdHJpeDxFSUdUWVBFLER5bmFtaWMsMSxDb2xNYWpvcj4gR0VNVlZlY3RvcjtcCitcCitzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oIFwKKyAgSW5kZXggcm93cywgSW5kZXggY29scywgXAorICBjb25zdCBFSUdUWVBFKiBsaHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICBjb25zdCBFSUdUWVBFKiByaHMsIEluZGV4IHJoc0luY3IsIFwKKyAgRUlHVFlQRSogcmVzLCBJbmRleCByZXNJbmNyLCBFSUdUWVBFIGFscGhhKSBcCit7IFwKKyAgTUtMX0lOVCBtPXJvd3MsIG49Y29scywgbGRhPWxoc1N0cmlkZSwgaW5jeD1yaHNJbmNyLCBpbmN5PXJlc0luY3I7IFwKKyAgTUtMVFlQRSBhbHBoYV8sIGJldGFfOyBcCisgIGNvbnN0IEVJR1RZUEUgKnhfcHRyLCBteW9uZSgxKTsgXAorICBjaGFyIHRyYW5zPShMaHNTdG9yYWdlT3JkZXI9PUNvbE1ham9yKSA/ICdOJyA6IChDb25qdWdhdGVMaHMpID8gJ0MnIDogJ1QnOyBcCisgIGlmIChMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSB7IFwKKyAgICBtPWNvbHM7IFwKKyAgICBuPXJvd3M7IFwKKyAgfVwKKyAgYXNzaWduX3NjYWxhcl9laWcybWtsKGFscGhhXywgYWxwaGEpOyBcCisgIGFzc2lnbl9zY2FsYXJfZWlnMm1rbChiZXRhXywgbXlvbmUpOyBcCisgIEdFTVZWZWN0b3IgeF90bXA7IFwKKyAgaWYgKENvbmp1Z2F0ZVJocykgeyBcCisgICAgTWFwPGNvbnN0IEdFTVZWZWN0b3IsIDAsIElubmVyU3RyaWRlPD4gPiBtYXBfeChyaHMsY29scywxLElubmVyU3RyaWRlPD4oaW5jeCkpOyBcCisgICAgeF90bXA9bWFwX3guY29uanVnYXRlKCk7IFwKKyAgICB4X3B0cj14X3RtcC5kYXRhKCk7IFwKKyAgICBpbmN4PTE7IFwKKyAgfSBlbHNlIHhfcHRyPXJoczsgXAorICBNS0xQUkVGSVgjI2dlbXYoJnRyYW5zLCAmbSwgJm4sICZhbHBoYV8sIChjb25zdCBNS0xUWVBFKilsaHMsICZsZGEsIChjb25zdCBNS0xUWVBFKil4X3B0ciwgJmluY3gsICZiZXRhXywgKE1LTFRZUEUqKXJlcywgJmluY3kpOyBcCit9XAorfTsKKworRUlHRU5fTUtMX0dFTVZfU1BFQ0lBTElaQVRJT04oZG91YmxlLCAgIGRvdWJsZSwgICAgICAgIGQpCitFSUdFTl9NS0xfR0VNVl9TUEVDSUFMSVpBVElPTihmbG9hdCwgICAgZmxvYXQsICAgICAgICAgcykKK0VJR0VOX01LTF9HRU1WX1NQRUNJQUxJWkFUSU9OKGRjb21wbGV4LCBNS0xfQ29tcGxleDE2LCB6KQorRUlHRU5fTUtMX0dFTVZfU1BFQ0lBTElaQVRJT04oc2NvbXBsZXgsIE1LTF9Db21wbGV4OCwgIGMpCisKK30gLy8gZW5kIG5hbWVzcGFzZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSQUxfTUFUUklYX1ZFQ1RPUl9NS0xfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvUGFyYWxsZWxpemVyLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9QYXJhbGxlbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNlOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvUGFyYWxsZWxpemVyLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QQVJBTExFTElaRVJfSAorI2RlZmluZSBFSUdFTl9QQVJBTExFTElaRVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbCAqLworaW5saW5lIHZvaWQgbWFuYWdlX211bHRpX3RocmVhZGluZyhBY3Rpb24gYWN0aW9uLCBpbnQqIHYpCit7CisgIHN0YXRpYyBFSUdFTl9VTlVTRUQgaW50IG1fbWF4VGhyZWFkcyA9IC0xOworCisgIGlmKGFjdGlvbj09U2V0QWN0aW9uKQorICB7CisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHYhPTApOworICAgIG1fbWF4VGhyZWFkcyA9ICp2OworICB9CisgIGVsc2UgaWYoYWN0aW9uPT1HZXRBY3Rpb24pCisgIHsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQodiE9MCk7CisgICAgI2lmZGVmIEVJR0VOX0hBU19PUEVOTVAKKyAgICBpZihtX21heFRocmVhZHM+MCkKKyAgICAgICp2ID0gbV9tYXhUaHJlYWRzOworICAgIGVsc2UKKyAgICAgICp2ID0gb21wX2dldF9tYXhfdGhyZWFkcygpOworICAgICNlbHNlCisgICAgKnYgPSAxOworICAgICNlbmRpZgorICB9CisgIGVsc2UKKyAgeworICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChmYWxzZSk7CisgIH0KK30KKworfQorCisvKiogTXVzdCBiZSBjYWxsIGZpcnN0IHdoZW4gY2FsbGluZyBFaWdlbiBmcm9tIG11bHRpcGxlIHRocmVhZHMgKi8KK2lubGluZSB2b2lkIGluaXRQYXJhbGxlbCgpCit7CisgIGludCBuYnQ7CisgIGludGVybmFsOjptYW5hZ2VfbXVsdGlfdGhyZWFkaW5nKEdldEFjdGlvbiwgJm5idCk7CisgIHN0ZDo6cHRyZGlmZl90IGwxLCBsMjsKKyAgaW50ZXJuYWw6Om1hbmFnZV9jYWNoaW5nX3NpemVzKEdldEFjdGlvbiwgJmwxLCAmbDIpOworfQorCisvKiogXHJldHVybnMgdGhlIG1heCBudW1iZXIgb2YgdGhyZWFkcyByZXNlcnZlZCBmb3IgRWlnZW4KKyAgKiBcc2Egc2V0TmJUaHJlYWRzICovCitpbmxpbmUgaW50IG5iVGhyZWFkcygpCit7CisgIGludCByZXQ7CisgIGludGVybmFsOjptYW5hZ2VfbXVsdGlfdGhyZWFkaW5nKEdldEFjdGlvbiwgJnJldCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qKiBTZXRzIHRoZSBtYXggbnVtYmVyIG9mIHRocmVhZHMgcmVzZXJ2ZWQgZm9yIEVpZ2VuCisgICogXHNhIG5iVGhyZWFkcyAqLworaW5saW5lIHZvaWQgc2V0TmJUaHJlYWRzKGludCB2KQoreworICBpbnRlcm5hbDo6bWFuYWdlX211bHRpX3RocmVhZGluZyhTZXRBY3Rpb24sICZ2KTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+IHN0cnVjdCBHZW1tUGFyYWxsZWxJbmZvCit7CisgIEdlbW1QYXJhbGxlbEluZm8oKSA6IHN5bmMoLTEpLCB1c2VycygwKSwgcmhzX3N0YXJ0KDApLCByaHNfbGVuZ3RoKDApIHt9CisKKyAgaW50IHZvbGF0aWxlIHN5bmM7CisgIGludCB2b2xhdGlsZSB1c2VyczsKKworICBJbmRleCByaHNfc3RhcnQ7CisgIEluZGV4IHJoc19sZW5ndGg7Cit9OworCit0ZW1wbGF0ZTxib29sIENvbmRpdGlvbiwgdHlwZW5hbWUgRnVuY3RvciwgdHlwZW5hbWUgSW5kZXg+Cit2b2lkIHBhcmFsbGVsaXplX2dlbW0oY29uc3QgRnVuY3RvciYgZnVuYywgSW5kZXggcm93cywgSW5kZXggY29scywgYm9vbCB0cmFuc3Bvc2UpCit7CisgIC8vIFRPRE8gd2hlbiBFSUdFTl9VU0VfQkxBUyBpcyBkZWZpbmVkLAorICAvLyB3ZSBzaG91bGQgc3RpbGwgZW5hYmxlIE9NUCBmb3Igb3RoZXIgc2NhbGFyIHR5cGVzCisjaWYgIShkZWZpbmVkIChFSUdFTl9IQVNfT1BFTk1QKSkgfHwgZGVmaW5lZCAoRUlHRU5fVVNFX0JMQVMpCisgIC8vIEZJWE1FIHRoZSB0cmFuc3Bvc2UgdmFyaWFibGUgaXMgb25seSBuZWVkZWQgdG8gcHJvcGVybHkgc3BsaXQKKyAgLy8gdGhlIG1hdHJpeCBwcm9kdWN0IHdoZW4gbXVsdGl0aHJlYWRpbmcgaXMgZW5hYmxlZC4gVGhpcyBpcyBhIHRlbXBvcmFyeQorICAvLyBmaXggdG8gc3VwcG9ydCByb3ctbWFqb3IgZGVzdGluYXRpb24gbWF0cmljZXMuIFRoaXMgd2hvbGUKKyAgLy8gcGFyYWxsZWxpemVyIG1lY2hhbmlzbSBoYXMgdG8gYmUgcmVkaXNpZ25lZCBhbnl3YXkuCisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh0cmFuc3Bvc2UpOworICBmdW5jKDAscm93cywgMCxjb2xzKTsKKyNlbHNlCisKKyAgLy8gRHluYW1pY2FsbHkgY2hlY2sgd2hldGhlciB3ZSBzaG91bGQgZW5hYmxlIG9yIGRpc2FibGUgT3Blbk1QLgorICAvLyBUaGUgY29uZGl0aW9ucyBhcmU6CisgIC8vIC0gdGhlIG1heCBudW1iZXIgb2YgdGhyZWFkcyB3ZSBjYW4gY3JlYXRlIGlzIGdyZWF0ZXIgdGhhbiAxCisgIC8vIC0gd2UgYXJlIG5vdCBhbHJlYWR5IGluIGEgcGFyYWxsZWwgY29kZQorICAvLyAtIHRoZSBzaXplcyBhcmUgbGFyZ2UgZW5vdWdoCisKKyAgLy8gMS0gYXJlIHdlIGFscmVhZHkgaW4gYSBwYXJhbGxlbCBzZXNzaW9uPworICAvLyBGSVhNRSBvbXBfZ2V0X251bV90aHJlYWRzKCk+MSBvbmx5IHdvcmtzIGZvciBvcGVubXAsIHdoYXQgaWYgdGhlIHVzZXIgZG9lcyBub3QgdXNlIG9wZW5tcD8KKyAgaWYoKCFDb25kaXRpb24pIHx8IChvbXBfZ2V0X251bV90aHJlYWRzKCk+MSkpCisgICAgcmV0dXJuIGZ1bmMoMCxyb3dzLCAwLGNvbHMpOworCisgIEluZGV4IHNpemUgPSB0cmFuc3Bvc2UgPyBjb2xzIDogcm93czsKKworICAvLyAyLSBjb21wdXRlIHRoZSBtYXhpbWFsIG51bWJlciBvZiB0aHJlYWRzIGZyb20gdGhlIHNpemUgb2YgdGhlIHByb2R1Y3Q6CisgIC8vIEZJWE1FIHRoaXMgaGFzIHRvIGJlIGZpbmUgdHVuZWQKKyAgSW5kZXggbWF4X3RocmVhZHMgPSBzdGQ6Om1heDxJbmRleD4oMSxzaXplIC8gMzIpOworCisgIC8vIDMgLSBjb21wdXRlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB3ZSBhcmUgZ29pbmcgdG8gdXNlCisgIEluZGV4IHRocmVhZHMgPSBzdGQ6Om1pbjxJbmRleD4obmJUaHJlYWRzKCksIG1heF90aHJlYWRzKTsKKworICBpZih0aHJlYWRzPT0xKQorICAgIHJldHVybiBmdW5jKDAscm93cywgMCxjb2xzKTsKKworICBFaWdlbjo6aW5pdFBhcmFsbGVsKCk7CisgIGZ1bmMuaW5pdFBhcmFsbGVsU2Vzc2lvbigpOworCisgIGlmKHRyYW5zcG9zZSkKKyAgICBzdGQ6OnN3YXAocm93cyxjb2xzKTsKKworICBJbmRleCBibG9ja0NvbHMgPSAoY29scyAvIHRocmVhZHMpICYgfkluZGV4KDB4Myk7CisgIEluZGV4IGJsb2NrUm93cyA9IChyb3dzIC8gdGhyZWFkcykgJiB+SW5kZXgoMHg3KTsKKyAgCisgIEdlbW1QYXJhbGxlbEluZm88SW5kZXg+KiBpbmZvID0gbmV3IEdlbW1QYXJhbGxlbEluZm88SW5kZXg+W3RocmVhZHNdOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgbnVtX3RocmVhZHModGhyZWFkcykKKyAgZm9yKEluZGV4IGk9MDsgaTx0aHJlYWRzOyArK2kpCisgIHsKKyAgICBJbmRleCByMCA9IGkqYmxvY2tSb3dzOworICAgIEluZGV4IGFjdHVhbEJsb2NrUm93cyA9IChpKzE9PXRocmVhZHMpID8gcm93cy1yMCA6IGJsb2NrUm93czsKKworICAgIEluZGV4IGMwID0gaSpibG9ja0NvbHM7CisgICAgSW5kZXggYWN0dWFsQmxvY2tDb2xzID0gKGkrMT09dGhyZWFkcykgPyBjb2xzLWMwIDogYmxvY2tDb2xzOworCisgICAgaW5mb1tpXS5yaHNfc3RhcnQgPSBjMDsKKyAgICBpbmZvW2ldLnJoc19sZW5ndGggPSBhY3R1YWxCbG9ja0NvbHM7CisKKyAgICBpZih0cmFuc3Bvc2UpCisgICAgICBmdW5jKDAsIGNvbHMsIHIwLCBhY3R1YWxCbG9ja1Jvd3MsIGluZm8pOworICAgIGVsc2UKKyAgICAgIGZ1bmMocjAsIGFjdHVhbEJsb2NrUm93cywgMCxjb2xzLCBpbmZvKTsKKyAgfQorCisgIGRlbGV0ZVtdIGluZm87CisjZW5kaWYKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fUEFSQUxMRUxJWkVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4TWF0cml4LmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeE1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjA5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeE1hdHJpeC5oCkBAIC0wLDAgKzEsNDE2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX01BVFJJWF9ICisjZGVmaW5lIEVJR0VOX1NFTEZBREpPSU5UX01BVFJJWF9NQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gcGFjayBhIHNlbGZhZGpvaW50IGJsb2NrIGRpYWdvbmFsIGZvciB1c2Ugd2l0aCB0aGUgZ2VicF9rZXJuZWwKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBQYWNrMSwgaW50IFBhY2syLCBpbnQgU3RvcmFnZU9yZGVyPgorc3RydWN0IHN5bW1fcGFja19saHMKK3sKKyAgdGVtcGxhdGU8aW50IEJsb2NrUm93cz4gaW5saW5lCisgIHZvaWQgcGFjayhTY2FsYXIqIGJsb2NrQSwgY29uc3QgY29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyPiYgbGhzLCBJbmRleCBjb2xzLCBJbmRleCBpLCBJbmRleCYgY291bnQpCisgIHsKKyAgICAvLyBub3JtYWwgY29weQorICAgIGZvcihJbmRleCBrPTA7IGs8aTsgaysrKQorICAgICAgZm9yKEluZGV4IHc9MDsgdzxCbG9ja1Jvd3M7IHcrKykKKyAgICAgICAgYmxvY2tBW2NvdW50KytdID0gbGhzKGkrdyxrKTsgICAgICAgICAgIC8vIG5vcm1hbAorICAgIC8vIHN5bW1ldHJpYyBjb3B5CisgICAgSW5kZXggaCA9IDA7CisgICAgZm9yKEluZGV4IGs9aTsgazxpK0Jsb2NrUm93czsgaysrKQorICAgIHsKKyAgICAgIGZvcihJbmRleCB3PTA7IHc8aDsgdysrKQorICAgICAgICBibG9ja0FbY291bnQrK10gPSBjb25qKGxocyhrLCBpK3cpKTsgLy8gdHJhbnNwb3NlZAorCisgICAgICBibG9ja0FbY291bnQrK10gPSByZWFsKGxocyhrLGspKTsgICAvLyByZWFsIChkaWFnb25hbCkKKworICAgICAgZm9yKEluZGV4IHc9aCsxOyB3PEJsb2NrUm93czsgdysrKQorICAgICAgICBibG9ja0FbY291bnQrK10gPSBsaHMoaSt3LCBrKTsgICAgICAgICAgLy8gbm9ybWFsCisgICAgICArK2g7CisgICAgfQorICAgIC8vIHRyYW5zcG9zZWQgY29weQorICAgIGZvcihJbmRleCBrPWkrQmxvY2tSb3dzOyBrPGNvbHM7IGsrKykKKyAgICAgIGZvcihJbmRleCB3PTA7IHc8QmxvY2tSb3dzOyB3KyspCisgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGNvbmoobGhzKGssIGkrdykpOyAvLyB0cmFuc3Bvc2VkCisgIH0KKyAgdm9pZCBvcGVyYXRvcigpKFNjYWxhciogYmxvY2tBLCBjb25zdCBTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgSW5kZXggY29scywgSW5kZXggcm93cykKKyAgeworICAgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLEluZGV4LFN0b3JhZ2VPcmRlcj4gbGhzKF9saHMsbGhzU3RyaWRlKTsKKyAgICBJbmRleCBjb3VudCA9IDA7CisgICAgSW5kZXggcGVlbGVkX21jID0gKHJvd3MvUGFjazEpKlBhY2sxOworICAgIGZvcihJbmRleCBpPTA7IGk8cGVlbGVkX21jOyBpKz1QYWNrMSkKKyAgICB7CisgICAgICBwYWNrPFBhY2sxPihibG9ja0EsIGxocywgY29scywgaSwgY291bnQpOworICAgIH0KKworICAgIGlmKHJvd3MtcGVlbGVkX21jPj1QYWNrMikKKyAgICB7CisgICAgICBwYWNrPFBhY2syPihibG9ja0EsIGxocywgY29scywgcGVlbGVkX21jLCBjb3VudCk7CisgICAgICBwZWVsZWRfbWMgKz0gUGFjazI7CisgICAgfQorCisgICAgLy8gZG8gdGhlIHNhbWUgd2l0aCBtcj09MQorICAgIGZvcihJbmRleCBpPXBlZWxlZF9tYzsgaTxyb3dzOyBpKyspCisgICAgeworICAgICAgZm9yKEluZGV4IGs9MDsgazxpOyBrKyspCisgICAgICAgIGJsb2NrQVtjb3VudCsrXSA9IGxocyhpLCBrKTsgICAgICAgICAgICAgIC8vIG5vcm1hbAorCisgICAgICBibG9ja0FbY291bnQrK10gPSByZWFsKGxocyhpLCBpKSk7ICAgICAgIC8vIHJlYWwgKGRpYWdvbmFsKQorCisgICAgICBmb3IoSW5kZXggaz1pKzE7IGs8Y29sczsgaysrKQorICAgICAgICBibG9ja0FbY291bnQrK10gPSBjb25qKGxocyhrLCBpKSk7ICAgICAvLyB0cmFuc3Bvc2VkCisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgbnIsIGludCBTdG9yYWdlT3JkZXI+CitzdHJ1Y3Qgc3ltbV9wYWNrX3JocworeworICBlbnVtIHsgUGFja2V0U2l6ZSA9IHBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSB9OworICB2b2lkIG9wZXJhdG9yKCkoU2NhbGFyKiBibG9ja0IsIGNvbnN0IFNjYWxhciogX3JocywgSW5kZXggcmhzU3RyaWRlLCBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBJbmRleCBrMikKKyAgeworICAgIEluZGV4IGVuZF9rID0gazIgKyByb3dzOworICAgIEluZGV4IGNvdW50ID0gMDsKKyAgICBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhcixJbmRleCxTdG9yYWdlT3JkZXI+IHJocyhfcmhzLHJoc1N0cmlkZSk7CisgICAgSW5kZXggcGFja2V0X2NvbHMgPSAoY29scy9ucikqbnI7CisKKyAgICAvLyBmaXJzdCBwYXJ0OiBub3JtYWwgY2FzZQorICAgIGZvcihJbmRleCBqMj0wOyBqMjxrMjsgajIrPW5yKQorICAgIHsKKyAgICAgIGZvcihJbmRleCBrPWsyOyBrPGVuZF9rOyBrKyspCisgICAgICB7CisgICAgICAgIGJsb2NrQltjb3VudCswXSA9IHJocyhrLGoyKzApOworICAgICAgICBibG9ja0JbY291bnQrMV0gPSByaHMoayxqMisxKTsKKyAgICAgICAgaWYgKG5yPT00KQorICAgICAgICB7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzJdID0gcmhzKGssajIrMik7CisgICAgICAgICAgYmxvY2tCW2NvdW50KzNdID0gcmhzKGssajIrMyk7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgKz0gbnI7CisgICAgICB9CisgICAgfQorCisgICAgLy8gc2Vjb25kIHBhcnQ6IGRpYWdvbmFsIGJsb2NrCisgICAgZm9yKEluZGV4IGoyPWsyOyBqMjwoc3RkOjptaW4pKGsyK3Jvd3MscGFja2V0X2NvbHMpOyBqMis9bnIpCisgICAgeworICAgICAgLy8gYWdhaW4gd2UgY2FuIHNwbGl0IHZlcnRpY2FsbHkgaW4gdGhyZWUgZGlmZmVyZW50IHBhcnRzICh0cmFuc3Bvc2UsIHN5bW1ldHJpYywgbm9ybWFsKQorICAgICAgLy8gdHJhbnNwb3NlCisgICAgICBmb3IoSW5kZXggaz1rMjsgazxqMjsgaysrKQorICAgICAgeworICAgICAgICBibG9ja0JbY291bnQrMF0gPSBjb25qKHJocyhqMiswLGspKTsKKyAgICAgICAgYmxvY2tCW2NvdW50KzFdID0gY29uaihyaHMoajIrMSxrKSk7CisgICAgICAgIGlmIChucj09NCkKKyAgICAgICAgeworICAgICAgICAgIGJsb2NrQltjb3VudCsyXSA9IGNvbmoocmhzKGoyKzIsaykpOworICAgICAgICAgIGJsb2NrQltjb3VudCszXSA9IGNvbmoocmhzKGoyKzMsaykpOworICAgICAgICB9CisgICAgICAgIGNvdW50ICs9IG5yOworICAgICAgfQorICAgICAgLy8gc3ltbWV0cmljCisgICAgICBJbmRleCBoID0gMDsKKyAgICAgIGZvcihJbmRleCBrPWoyOyBrPGoyK25yOyBrKyspCisgICAgICB7CisgICAgICAgIC8vIG5vcm1hbAorICAgICAgICBmb3IgKEluZGV4IHc9MCA7IHc8aDsgKyt3KQorICAgICAgICAgIGJsb2NrQltjb3VudCt3XSA9IHJocyhrLGoyK3cpOworCisgICAgICAgIGJsb2NrQltjb3VudCtoXSA9IHJlYWwocmhzKGssaykpOworCisgICAgICAgIC8vIHRyYW5zcG9zZQorICAgICAgICBmb3IgKEluZGV4IHc9aCsxIDsgdzxucjsgKyt3KQorICAgICAgICAgIGJsb2NrQltjb3VudCt3XSA9IGNvbmoocmhzKGoyK3csaykpOworICAgICAgICBjb3VudCArPSBucjsKKyAgICAgICAgKytoOworICAgICAgfQorICAgICAgLy8gbm9ybWFsCisgICAgICBmb3IoSW5kZXggaz1qMitucjsgazxlbmRfazsgaysrKQorICAgICAgeworICAgICAgICBibG9ja0JbY291bnQrMF0gPSByaHMoayxqMiswKTsKKyAgICAgICAgYmxvY2tCW2NvdW50KzFdID0gcmhzKGssajIrMSk7CisgICAgICAgIGlmIChucj09NCkKKyAgICAgICAgeworICAgICAgICAgIGJsb2NrQltjb3VudCsyXSA9IHJocyhrLGoyKzIpOworICAgICAgICAgIGJsb2NrQltjb3VudCszXSA9IHJocyhrLGoyKzMpOworICAgICAgICB9CisgICAgICAgIGNvdW50ICs9IG5yOworICAgICAgfQorICAgIH0KKworICAgIC8vIHRoaXJkIHBhcnQ6IHRyYW5zcG9zZWQKKyAgICBmb3IoSW5kZXggajI9azIrcm93czsgajI8cGFja2V0X2NvbHM7IGoyKz1ucikKKyAgICB7CisgICAgICBmb3IoSW5kZXggaz1rMjsgazxlbmRfazsgaysrKQorICAgICAgeworICAgICAgICBibG9ja0JbY291bnQrMF0gPSBjb25qKHJocyhqMiswLGspKTsKKyAgICAgICAgYmxvY2tCW2NvdW50KzFdID0gY29uaihyaHMoajIrMSxrKSk7CisgICAgICAgIGlmIChucj09NCkKKyAgICAgICAgeworICAgICAgICAgIGJsb2NrQltjb3VudCsyXSA9IGNvbmoocmhzKGoyKzIsaykpOworICAgICAgICAgIGJsb2NrQltjb3VudCszXSA9IGNvbmoocmhzKGoyKzMsaykpOworICAgICAgICB9CisgICAgICAgIGNvdW50ICs9IG5yOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNvcHkgdGhlIHJlbWFpbmluZyBjb2x1bW5zIG9uZSBhdCBhIHRpbWUgKD0+IHRoZSBzYW1lIHdpdGggbnI9PTEpCisgICAgZm9yKEluZGV4IGoyPXBhY2tldF9jb2xzOyBqMjxjb2xzOyArK2oyKQorICAgIHsKKyAgICAgIC8vIHRyYW5zcG9zZQorICAgICAgSW5kZXggaGFsZiA9IChzdGQ6Om1pbikoZW5kX2ssajIpOworICAgICAgZm9yKEluZGV4IGs9azI7IGs8aGFsZjsgaysrKQorICAgICAgeworICAgICAgICBibG9ja0JbY291bnRdID0gY29uaihyaHMoajIsaykpOworICAgICAgICBjb3VudCArPSAxOworICAgICAgfQorCisgICAgICBpZihoYWxmPT1qMiAmJiBoYWxmPGsyK3Jvd3MpCisgICAgICB7CisgICAgICAgIGJsb2NrQltjb3VudF0gPSByZWFsKHJocyhqMixqMikpOworICAgICAgICBjb3VudCArPSAxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBoYWxmLS07CisKKyAgICAgIC8vIG5vcm1hbAorICAgICAgZm9yKEluZGV4IGs9aGFsZisxOyBrPGsyK3Jvd3M7IGsrKykKKyAgICAgIHsKKyAgICAgICAgYmxvY2tCW2NvdW50XSA9IHJocyhrLGoyKTsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8qIE9wdGltaXplZCBzZWxmYWRqb2ludCBtYXRyaXggKiBtYXRyaXggKF9TWU1NKSBwcm9kdWN0IGJ1aWx0IG9uIHRvcCBvZgorICogdGhlIGdlbmVyYWwgbWF0cml4IG1hdHJpeCBwcm9kdWN0LgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIExoc1NlbGZBZGpvaW50LCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIFJoc1NlbGZBZGpvaW50LCBib29sIENvbmp1Z2F0ZVJocywKKyAgICAgICAgICBpbnQgUmVzU3RvcmFnZU9yZGVyPgorc3RydWN0IHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIExoc1NlbGZBZGpvaW50LCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIFJoc1NlbGZBZGpvaW50LCBib29sIENvbmp1Z2F0ZVJocz4KK3N0cnVjdCBwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsSW5kZXgsTGhzU3RvcmFnZU9yZGVyLExoc1NlbGZBZGpvaW50LENvbmp1Z2F0ZUxocywgUmhzU3RvcmFnZU9yZGVyLFJoc1NlbGZBZGpvaW50LENvbmp1Z2F0ZVJocyxSb3dNYWpvcj4KK3sKKworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bigKKyAgICBJbmRleCByb3dzLCBJbmRleCBjb2xzLAorICAgIGNvbnN0IFNjYWxhciogbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyKiByaHMsIEluZGV4IHJoc1N0cmlkZSwKKyAgICBTY2FsYXIqIHJlcywgICAgICAgSW5kZXggcmVzU3RyaWRlLAorICAgIFNjYWxhciBhbHBoYSkKKyAgeworICAgIHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgSW5kZXgsCisgICAgICBFSUdFTl9MT0dJQ0FMX1hPUihSaHNTZWxmQWRqb2ludCxSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/IENvbE1ham9yIDogUm93TWFqb3IsCisgICAgICBSaHNTZWxmQWRqb2ludCwgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBFSUdFTl9MT0dJQ0FMX1hPUihSaHNTZWxmQWRqb2ludCxDb25qdWdhdGVSaHMpLAorICAgICAgRUlHRU5fTE9HSUNBTF9YT1IoTGhzU2VsZkFkam9pbnQsTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgPyBDb2xNYWpvciA6IFJvd01ham9yLAorICAgICAgTGhzU2VsZkFkam9pbnQsIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgRUlHRU5fTE9HSUNBTF9YT1IoTGhzU2VsZkFkam9pbnQsQ29uanVnYXRlTGhzKSwKKyAgICAgIENvbE1ham9yPgorICAgICAgOjpydW4oY29scywgcm93cywgIHJocywgcmhzU3RyaWRlLCAgbGhzLCBsaHNTdHJpZGUsICByZXMsIHJlc1N0cmlkZSwgIGFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsCisgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHM+CitzdHJ1Y3QgcHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8U2NhbGFyLEluZGV4LExoc1N0b3JhZ2VPcmRlcix0cnVlLENvbmp1Z2F0ZUxocywgUmhzU3RvcmFnZU9yZGVyLGZhbHNlLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj4KK3sKKworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oCisgICAgSW5kZXggcm93cywgSW5kZXggY29scywKKyAgICBjb25zdCBTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgICBjb25zdCBTY2FsYXIqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwKKyAgICBTY2FsYXIqIHJlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwKKyAgICBTY2FsYXIgYWxwaGEpCisgIHsKKyAgICBJbmRleCBzaXplID0gcm93czsKKworICAgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgTGhzU3RvcmFnZU9yZGVyPiBsaHMoX2xocyxsaHNTdHJpZGUpOworICAgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgUmhzU3RvcmFnZU9yZGVyPiByaHMoX3JocyxyaHNTdHJpZGUpOworCisgICAgdHlwZWRlZiBnZWJwX3RyYWl0czxTY2FsYXIsU2NhbGFyPiBUcmFpdHM7CisKKyAgICBJbmRleCBrYyA9IHNpemU7ICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBLIGRpcmVjdGlvbgorICAgIEluZGV4IG1jID0gcm93czsgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIE0gZGlyZWN0aW9uCisgICAgSW5kZXggbmMgPSBjb2xzOyAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTiBkaXJlY3Rpb24KKyAgICBjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8U2NhbGFyLFNjYWxhcj4oa2MsIG1jLCBuYyk7CisgICAgLy8ga2MgbXVzdCBzbWFsbGVyIHRoYW4gbWMKKyAgICBrYyA9IChzdGQ6Om1pbikoa2MsbWMpOworCisgICAgc3RkOjpzaXplX3Qgc2l6ZVcgPSBrYypUcmFpdHM6OldvcmtTcGFjZUZhY3RvcjsKKyAgICBzdGQ6OnNpemVfdCBzaXplQiA9IHNpemVXICsga2MqY29sczsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBibG9ja0EsIGtjKm1jLCAwKTsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBhbGxvY2F0ZWRCbG9ja0IsIHNpemVCLCAwKTsKKyAgICBTY2FsYXIqIGJsb2NrQiA9IGFsbG9jYXRlZEJsb2NrQiArIHNpemVXOworCisgICAgZ2VicF9rZXJuZWw8U2NhbGFyLCBTY2FsYXIsIEluZGV4LCBUcmFpdHM6Om1yLCBUcmFpdHM6Om5yLCBDb25qdWdhdGVMaHMsIENvbmp1Z2F0ZVJocz4gZ2VicF9rZXJuZWw7CisgICAgc3ltbV9wYWNrX2xoczxTY2FsYXIsIEluZGV4LCBUcmFpdHM6Om1yLCBUcmFpdHM6Okxoc1Byb2dyZXNzLCBMaHNTdG9yYWdlT3JkZXI+IHBhY2tfbGhzOworICAgIGdlbW1fcGFja19yaHM8U2NhbGFyLCBJbmRleCwgVHJhaXRzOjpucixSaHNTdG9yYWdlT3JkZXI+IHBhY2tfcmhzOworICAgIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcj9Db2xNYWpvcjpSb3dNYWpvciwgdHJ1ZT4gcGFja19saHNfdHJhbnNwb3NlZDsKKworICAgIGZvcihJbmRleCBrMj0wOyBrMjxzaXplOyBrMis9a2MpCisgICAgeworICAgICAgY29uc3QgSW5kZXggYWN0dWFsX2tjID0gKHN0ZDo6bWluKShrMitrYyxzaXplKS1rMjsKKworICAgICAgLy8gd2UgaGF2ZSBzZWxlY3RlZCBvbmUgcm93IHBhbmVsIG9mIHJocyBhbmQgb25lIGNvbHVtbiBwYW5lbCBvZiBsaHMKKyAgICAgIC8vIHBhY2sgcmhzJ3MgcGFuZWwgaW50byBhIHNlcXVlbnRpYWwgY2h1bmsgb2YgbWVtb3J5CisgICAgICAvLyBhbmQgZXhwYW5kIGVhY2ggY29lZmYgdG8gYSBjb25zdGFudCBwYWNrZXQgZm9yIGZ1cnRoZXIgcmV1c2UKKyAgICAgIHBhY2tfcmhzKGJsb2NrQiwgJnJocyhrMiwwKSwgcmhzU3RyaWRlLCBhY3R1YWxfa2MsIGNvbHMpOworCisgICAgICAvLyB0aGUgc2VsZWN0IGxocydzIHBhbmVsIGhhcyB0byBiZSBzcGxpdCBpbiB0aHJlZSBkaWZmZXJlbnQgcGFydHM6CisgICAgICAvLyAgMSAtIHRoZSB0cmFuc3Bvc2VkIHBhbmVsIGFib3ZlIHRoZSBkaWFnb25hbCBibG9jayA9PiB0cmFuc3Bvc2VkIHBhY2tlZCBjb3B5CisgICAgICAvLyAgMiAtIHRoZSBkaWFnb25hbCBibG9jayA9PiBzcGVjaWFsIHBhY2tlZCBjb3B5CisgICAgICAvLyAgMyAtIHRoZSBwYW5lbCBiZWxvdyB0aGUgZGlhZ29uYWwgYmxvY2sgPT4gZ2VuZXJpYyBwYWNrZWQgY29weQorICAgICAgZm9yKEluZGV4IGkyPTA7IGkyPGsyOyBpMis9bWMpCisgICAgICB7CisgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9tYyA9IChzdGQ6Om1pbikoaTIrbWMsazIpLWkyOworICAgICAgICAvLyB0cmFuc3Bvc2VkIHBhY2tlZCBjb3B5CisgICAgICAgIHBhY2tfbGhzX3RyYW5zcG9zZWQoYmxvY2tBLCAmbGhzKGsyLCBpMiksIGxoc1N0cmlkZSwgYWN0dWFsX2tjLCBhY3R1YWxfbWMpOworCisgICAgICAgIGdlYnBfa2VybmVsKHJlcytpMiwgcmVzU3RyaWRlLCBibG9ja0EsIGJsb2NrQiwgYWN0dWFsX21jLCBhY3R1YWxfa2MsIGNvbHMsIGFscGhhKTsKKyAgICAgIH0KKyAgICAgIC8vIHRoZSBibG9jayBkaWFnb25hbAorICAgICAgeworICAgICAgICBjb25zdCBJbmRleCBhY3R1YWxfbWMgPSAoc3RkOjptaW4pKGsyK2tjLHNpemUpLWsyOworICAgICAgICAvLyBzeW1tZXRyaWMgcGFja2VkIGNvcHkKKyAgICAgICAgcGFja19saHMoYmxvY2tBLCAmbGhzKGsyLGsyKSwgbGhzU3RyaWRlLCBhY3R1YWxfa2MsIGFjdHVhbF9tYyk7CisKKyAgICAgICAgZ2VicF9rZXJuZWwocmVzK2syLCByZXNTdHJpZGUsIGJsb2NrQSwgYmxvY2tCLCBhY3R1YWxfbWMsIGFjdHVhbF9rYywgY29scywgYWxwaGEpOworICAgICAgfQorCisgICAgICBmb3IoSW5kZXggaTI9azIra2M7IGkyPHNpemU7IGkyKz1tYykKKyAgICAgIHsKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShpMittYyxzaXplKS1pMjsKKyAgICAgICAgZ2VtbV9wYWNrX2xoczxTY2FsYXIsIEluZGV4LCBUcmFpdHM6Om1yLCBUcmFpdHM6Okxoc1Byb2dyZXNzLCBMaHNTdG9yYWdlT3JkZXIsZmFsc2U+KCkKKyAgICAgICAgICAoYmxvY2tBLCAmbGhzKGkyLCBrMiksIGxoc1N0cmlkZSwgYWN0dWFsX2tjLCBhY3R1YWxfbWMpOworCisgICAgICAgIGdlYnBfa2VybmVsKHJlcytpMiwgcmVzU3RyaWRlLCBibG9ja0EsIGJsb2NrQiwgYWN0dWFsX21jLCBhY3R1YWxfa2MsIGNvbHMsIGFscGhhKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8vIG1hdHJpeCAqIHNlbGZhZGpvaW50IHByb2R1Y3QKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPgorc3RydWN0IHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhcixJbmRleCxMaHNTdG9yYWdlT3JkZXIsZmFsc2UsQ29uanVnYXRlTGhzLCBSaHNTdG9yYWdlT3JkZXIsdHJ1ZSxDb25qdWdhdGVSaHMsQ29sTWFqb3I+Cit7CisKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKAorICAgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsCisgICAgY29uc3QgU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsCisgICAgU2NhbGFyKiByZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsCisgICAgU2NhbGFyIGFscGhhKQorICB7CisgICAgSW5kZXggc2l6ZSA9IGNvbHM7CisKKyAgICBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIExoc1N0b3JhZ2VPcmRlcj4gbGhzKF9saHMsbGhzU3RyaWRlKTsKKworICAgIHR5cGVkZWYgZ2VicF90cmFpdHM8U2NhbGFyLFNjYWxhcj4gVHJhaXRzOworCisgICAgSW5kZXgga2MgPSBzaXplOyAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBLIGRpcmVjdGlvbgorICAgIEluZGV4IG1jID0gcm93czsgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIE0gZGlyZWN0aW9uCisgICAgSW5kZXggbmMgPSBjb2xzOyAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTiBkaXJlY3Rpb24KKyAgICBjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8U2NhbGFyLFNjYWxhcj4oa2MsIG1jLCBuYyk7CisgICAgc3RkOjpzaXplX3Qgc2l6ZVcgPSBrYypUcmFpdHM6OldvcmtTcGFjZUZhY3RvcjsKKyAgICBzdGQ6OnNpemVfdCBzaXplQiA9IHNpemVXICsga2MqY29sczsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBibG9ja0EsIGtjKm1jLCAwKTsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBhbGxvY2F0ZWRCbG9ja0IsIHNpemVCLCAwKTsKKyAgICBTY2FsYXIqIGJsb2NrQiA9IGFsbG9jYXRlZEJsb2NrQiArIHNpemVXOworCisgICAgZ2VicF9rZXJuZWw8U2NhbGFyLCBTY2FsYXIsIEluZGV4LCBUcmFpdHM6Om1yLCBUcmFpdHM6Om5yLCBDb25qdWdhdGVMaHMsIENvbmp1Z2F0ZVJocz4gZ2VicF9rZXJuZWw7CisgICAgZ2VtbV9wYWNrX2xoczxTY2FsYXIsIEluZGV4LCBUcmFpdHM6Om1yLCBUcmFpdHM6Okxoc1Byb2dyZXNzLCBMaHNTdG9yYWdlT3JkZXI+IHBhY2tfbGhzOworICAgIHN5bW1fcGFja19yaHM8U2NhbGFyLCBJbmRleCwgVHJhaXRzOjpucixSaHNTdG9yYWdlT3JkZXI+IHBhY2tfcmhzOworCisgICAgZm9yKEluZGV4IGsyPTA7IGsyPHNpemU7IGsyKz1rYykKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBhY3R1YWxfa2MgPSAoc3RkOjptaW4pKGsyK2tjLHNpemUpLWsyOworCisgICAgICBwYWNrX3JocyhibG9ja0IsIF9yaHMsIHJoc1N0cmlkZSwgYWN0dWFsX2tjLCBjb2xzLCBrMik7CisKKyAgICAgIC8vID0+IEdFUFAKKyAgICAgIGZvcihJbmRleCBpMj0wOyBpMjxyb3dzOyBpMis9bWMpCisgICAgICB7CisgICAgICAgIGNvbnN0IEluZGV4IGFjdHVhbF9tYyA9IChzdGQ6Om1pbikoaTIrbWMscm93cyktaTI7CisgICAgICAgIHBhY2tfbGhzKGJsb2NrQSwgJmxocyhpMiwgazIpLCBsaHNTdHJpZGUsIGFjdHVhbF9rYywgYWN0dWFsX21jKTsKKworICAgICAgICBnZWJwX2tlcm5lbChyZXMraTIsIHJlc1N0cmlkZSwgYmxvY2tBLCBibG9ja0IsIGFjdHVhbF9tYywgYWN0dWFsX2tjLCBjb2xzLCBhbHBoYSk7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBXcmFwcGVyIHRvIHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIGludCBMaHNNb2RlLCB0eXBlbmFtZSBSaHMsIGludCBSaHNNb2RlPgorc3RydWN0IHRyYWl0czxTZWxmYWRqb2ludFByb2R1Y3RNYXRyaXg8TGhzLExoc01vZGUsZmFsc2UsUmhzLFJoc01vZGUsZmFsc2U+ID4KKyAgOiB0cmFpdHM8UHJvZHVjdEJhc2U8U2VsZmFkam9pbnRQcm9kdWN0TWF0cml4PExocyxMaHNNb2RlLGZhbHNlLFJocyxSaHNNb2RlLGZhbHNlPiwgTGhzLCBSaHM+ID4KK3t9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIGludCBMaHNNb2RlLCB0eXBlbmFtZSBSaHMsIGludCBSaHNNb2RlPgorc3RydWN0IFNlbGZhZGpvaW50UHJvZHVjdE1hdHJpeDxMaHMsTGhzTW9kZSxmYWxzZSxSaHMsUmhzTW9kZSxmYWxzZT4KKyAgOiBwdWJsaWMgUHJvZHVjdEJhc2U8U2VsZmFkam9pbnRQcm9kdWN0TWF0cml4PExocyxMaHNNb2RlLGZhbHNlLFJocyxSaHNNb2RlLGZhbHNlPiwgTGhzLCBSaHMgPgoreworICBFSUdFTl9QUk9EVUNUX1BVQkxJQ19JTlRFUkZBQ0UoU2VsZmFkam9pbnRQcm9kdWN0TWF0cml4KQorCisgIFNlbGZhZGpvaW50UHJvZHVjdE1hdHJpeChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpIDogQmFzZShsaHMscmhzKSB7fQorCisgIGVudW0geworICAgIExoc0lzVXBwZXIgPSAoTGhzTW9kZSYoVXBwZXJ8TG93ZXIpKT09VXBwZXIsCisgICAgTGhzSXNTZWxmQWRqb2ludCA9IChMaHNNb2RlJlNlbGZBZGpvaW50KT09U2VsZkFkam9pbnQsCisgICAgUmhzSXNVcHBlciA9IChSaHNNb2RlJihVcHBlcnxMb3dlcikpPT1VcHBlciwKKyAgICBSaHNJc1NlbGZBZGpvaW50ID0gKFJoc01vZGUmU2VsZkFkam9pbnQpPT1TZWxmQWRqb2ludAorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkc3QsIFNjYWxhciBhbHBoYSkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChkc3Qucm93cygpPT1tX2xocy5yb3dzKCkgJiYgZHN0LmNvbHMoKT09bV9yaHMuY29scygpKTsKKworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxMaHNUeXBlPjo6dHlwZSBsaHMgPSBMaHNCbGFzVHJhaXRzOjpleHRyYWN0KG1fbGhzKTsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsUmhzVHlwZT46OnR5cGUgcmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChtX3Jocyk7CisKKyAgICBTY2FsYXIgYWN0dWFsQWxwaGEgPSBhbHBoYSAqIExoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IobV9saHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKG1fcmhzKTsKKworICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIEluZGV4LAorICAgICAgRUlHRU5fTE9HSUNBTF9YT1IoTGhzSXNVcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjp0cmFpdHM8TGhzPjo6RmxhZ3MgJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsIExoc0lzU2VsZkFkam9pbnQsCisgICAgICBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIEVJR0VOX0xPR0lDQUxfWE9SKExoc0lzVXBwZXIsYm9vbChMaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUpKSwKKyAgICAgIEVJR0VOX0xPR0lDQUxfWE9SKFJoc0lzVXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPFJocz46OkZsYWdzICZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLCBSaHNJc1NlbGZBZGpvaW50LAorICAgICAgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBFSUdFTl9MT0dJQ0FMX1hPUihSaHNJc1VwcGVyLGJvb2woUmhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlKSksCisgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlc3Q+OjpGbGFncyZSb3dNYWpvckJpdCAgPyBSb3dNYWpvciA6IENvbE1ham9yPgorICAgICAgOjpydW4oCisgICAgICAgIGxocy5yb3dzKCksIHJocy5jb2xzKCksICAgICAgICAgICAgICAgICAvLyBzaXplcworICAgICAgICAmbGhzLmNvZWZmUmVmKDAsMCksICAgIGxocy5vdXRlclN0cmlkZSgpLCAgLy8gbGhzIGluZm8KKyAgICAgICAgJnJocy5jb2VmZlJlZigwLDApLCAgICByaHMub3V0ZXJTdHJpZGUoKSwgIC8vIHJocyBpbmZvCisgICAgICAgICZkc3QuY29lZmZSZWYoMCwwKSwgZHN0Lm91dGVyU3RyaWRlKCksICAvLyByZXN1bHQgaW5mbworICAgICAgICBhY3R1YWxBbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxwaGEKKyAgICAgICk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX01BVFJJWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeE1hdHJpeF9NS0wuaCBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4TWF0cml4X01LTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNWM0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeE1hdHJpeF9NS0wuaApAQCAtMCwwICsxLDI5NSBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICBTZWxmIGFkam9pbnQgbWF0cml4ICogbWF0cml4IHByb2R1Y3QgZnVuY3Rpb25hbGl0eSBiYXNlZCBvbiA/U1lNTS8/SEVNTS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9TRUxGQURKT0lOVF9NQVRSSVhfTUFUUklYX01LTF9ICisjZGVmaW5lIEVJR0VOX1NFTEZBREpPSU5UX01BVFJJWF9NQVRSSVhfTUtMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKworLyogT3B0aW1pemVkIHNlbGZhZGpvaW50IG1hdHJpeCAqIG1hdHJpeCAoP1NZTU0vP0hFTU0pIHByb2R1Y3QgKi8KKworI2RlZmluZSBFSUdFTl9NS0xfU1lNTV9MKEVJR1RZUEUsIE1LTFRZUEUsIEVJR1BSRUZJWCwgTUtMUFJFRklYKSBcCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIFwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgXAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3QgcHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8RUlHVFlQRSxJbmRleCxMaHNTdG9yYWdlT3JkZXIsdHJ1ZSxDb25qdWdhdGVMaHMsUmhzU3RvcmFnZU9yZGVyLGZhbHNlLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj4gXAore1wKK1wKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKCBcCisgICAgSW5kZXggcm93cywgSW5kZXggY29scywgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgIGNvbnN0IEVJR1RZUEUqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwgXAorICAgIEVJR1RZUEUqIHJlcywgICAgICAgIEluZGV4IHJlc1N0cmlkZSwgXAorICAgIEVJR1RZUEUgYWxwaGEpIFwKKyAgeyBcCisgICAgY2hhciBzaWRlPSdMJywgdXBsbz0nTCc7IFwKKyAgICBNS0xfSU5UIG0sIG4sIGxkYSwgbGRiLCBsZGM7IFwKKyAgICBjb25zdCBFSUdUWVBFICphLCAqYjsgXAorICAgIE1LTFRZUEUgYWxwaGFfLCBiZXRhXzsgXAorICAgIE1hdHJpeFgjI0VJR1BSRUZJWCBiX3RtcDsgXAorICAgIEVJR1RZUEUgbXlvbmUoMSk7XAorXAorLyogU2V0IHRyYW5zcG9zZSBvcHRpb25zICovIFwKKy8qIFNldCBtLCBuLCBrICovIFwKKyAgICBtID0gKE1LTF9JTlQpcm93czsgIFwKKyAgICBuID0gKE1LTF9JTlQpY29sczsgIFwKK1wKKy8qIFNldCBhbHBoYV8gJiBiZXRhXyAqLyBcCisgICAgYXNzaWduX3NjYWxhcl9laWcybWtsKGFscGhhXywgYWxwaGEpOyBcCisgICAgYXNzaWduX3NjYWxhcl9laWcybWtsKGJldGFfLCBteW9uZSk7IFwKK1wKKy8qIFNldCBsZGEsIGxkYiwgbGRjICovIFwKKyAgICBsZGEgPSAoTUtMX0lOVClsaHNTdHJpZGU7IFwKKyAgICBsZGIgPSAoTUtMX0lOVClyaHNTdHJpZGU7IFwKKyAgICBsZGMgPSAoTUtMX0lOVClyZXNTdHJpZGU7IFwKK1wKKy8qIFNldCBhLCBiLCBjICovIFwKKyAgICBpZiAoTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgdXBsbz0nVSc7IFwKKyAgICBhID0gX2xoczsgXAorXAorICAgIGlmIChSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSB7IFwKKyAgICAgIE1hcDxjb25zdCBNYXRyaXhYIyNFSUdQUkVGSVgsIDAsIE91dGVyU3RyaWRlPD4gPiByaHMoX3JocyxuLG0sT3V0ZXJTdHJpZGU8PihyaHNTdHJpZGUpKTsgXAorICAgICAgYl90bXAgPSByaHMuYWRqb2ludCgpOyBcCisgICAgICBiID0gYl90bXAuZGF0YSgpOyBcCisgICAgICBsZGIgPSBiX3RtcC5vdXRlclN0cmlkZSgpOyBcCisgICAgfSBlbHNlIGIgPSBfcmhzOyBcCitcCisgICAgTUtMUFJFRklYIyNzeW1tKCZzaWRlLCAmdXBsbywgJm0sICZuLCAmYWxwaGFfLCAoY29uc3QgTUtMVFlQRSopYSwgJmxkYSwgKGNvbnN0IE1LTFRZUEUqKWIsICZsZGIsICZiZXRhXywgKE1LTFRZUEUqKXJlcywgJmxkYyk7IFwKK1wKKyAgfSBcCit9OworCisKKyNkZWZpbmUgRUlHRU5fTUtMX0hFTU1fTChFSUdUWVBFLCBNS0xUWVBFLCBFSUdQUkVGSVgsIE1LTFBSRUZJWCkgXAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBcCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsIFwKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PEVJR1RZUEUsSW5kZXgsTGhzU3RvcmFnZU9yZGVyLHRydWUsQ29uanVnYXRlTGhzLFJoc1N0b3JhZ2VPcmRlcixmYWxzZSxDb25qdWdhdGVSaHMsQ29sTWFqb3I+IFwKK3tcCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1biggXAorICAgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIFwKKyAgICBjb25zdCBFSUdUWVBFKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgICBjb25zdCBFSUdUWVBFKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsIFwKKyAgICBFSUdUWVBFKiByZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsIFwKKyAgICBFSUdUWVBFIGFscGhhKSBcCisgIHsgXAorICAgIGNoYXIgc2lkZT0nTCcsIHVwbG89J0wnOyBcCisgICAgTUtMX0lOVCBtLCBuLCBsZGEsIGxkYiwgbGRjOyBcCisgICAgY29uc3QgRUlHVFlQRSAqYSwgKmI7IFwKKyAgICBNS0xUWVBFIGFscGhhXywgYmV0YV87IFwKKyAgICBNYXRyaXhYIyNFSUdQUkVGSVggYl90bXA7IFwKKyAgICBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgTGhzU3RvcmFnZU9yZGVyPiBhX3RtcDsgXAorICAgIEVJR1RZUEUgbXlvbmUoMSk7IFwKK1wKKy8qIFNldCB0cmFuc3Bvc2Ugb3B0aW9ucyAqLyBcCisvKiBTZXQgbSwgbiwgayAqLyBcCisgICAgbSA9IChNS0xfSU5UKXJvd3M7IFwKKyAgICBuID0gKE1LTF9JTlQpY29sczsgXAorXAorLyogU2V0IGFscGhhXyAmIGJldGFfICovIFwKKyAgICBhc3NpZ25fc2NhbGFyX2VpZzJta2woYWxwaGFfLCBhbHBoYSk7IFwKKyAgICBhc3NpZ25fc2NhbGFyX2VpZzJta2woYmV0YV8sIG15b25lKTsgXAorXAorLyogU2V0IGxkYSwgbGRiLCBsZGMgKi8gXAorICAgIGxkYSA9IChNS0xfSU5UKWxoc1N0cmlkZTsgXAorICAgIGxkYiA9IChNS0xfSU5UKXJoc1N0cmlkZTsgXAorICAgIGxkYyA9IChNS0xfSU5UKXJlc1N0cmlkZTsgXAorXAorLyogU2V0IGEsIGIsIGMgKi8gXAorICAgIGlmICgoKExoc1N0b3JhZ2VPcmRlcj09Q29sTWFqb3IpICYmIENvbmp1Z2F0ZUxocykgfHwgKChMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSAmJiAoIUNvbmp1Z2F0ZUxocykpKSB7IFwKKyAgICAgIE1hcDxjb25zdCBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgTGhzU3RvcmFnZU9yZGVyPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IGxocyhfbGhzLG0sbSxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOyBcCisgICAgICBhX3RtcCA9IGxocy5jb25qdWdhdGUoKTsgXAorICAgICAgYSA9IGFfdG1wLmRhdGEoKTsgXAorICAgICAgbGRhID0gYV90bXAub3V0ZXJTdHJpZGUoKTsgXAorICAgIH0gZWxzZSBhID0gX2xoczsgXAorICAgIGlmIChMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSB1cGxvPSdVJzsgXAorXAorICAgIGlmIChSaHNTdG9yYWdlT3JkZXI9PUNvbE1ham9yICYmICghQ29uanVnYXRlUmhzKSkgeyBcCisgICAgICAgYiA9IF9yaHM7IH0gXAorICAgIGVsc2UgeyBcCisgICAgICBpZiAoUmhzU3RvcmFnZU9yZGVyPT1Db2xNYWpvciAmJiBDb25qdWdhdGVSaHMpIHsgXAorICAgICAgICBNYXA8Y29uc3QgTWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gcmhzKF9yaHMsbSxuLE91dGVyU3RyaWRlPD4ocmhzU3RyaWRlKSk7IFwKKyAgICAgICAgYl90bXAgPSByaHMuY29uanVnYXRlKCk7IFwKKyAgICAgIH0gZWxzZSBcCisgICAgICBpZiAoQ29uanVnYXRlUmhzKSB7IFwKKyAgICAgICAgTWFwPGNvbnN0IE1hdHJpeFgjI0VJR1BSRUZJWCwgMCwgT3V0ZXJTdHJpZGU8PiA+IHJocyhfcmhzLG4sbSxPdXRlclN0cmlkZTw+KHJoc1N0cmlkZSkpOyBcCisgICAgICAgIGJfdG1wID0gcmhzLmFkam9pbnQoKTsgXAorICAgICAgfSBlbHNlIHsgXAorICAgICAgICBNYXA8Y29uc3QgTWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gcmhzKF9yaHMsbixtLE91dGVyU3RyaWRlPD4ocmhzU3RyaWRlKSk7IFwKKyAgICAgICAgYl90bXAgPSByaHMudHJhbnNwb3NlKCk7IFwKKyAgICAgIH0gXAorICAgICAgYiA9IGJfdG1wLmRhdGEoKTsgXAorICAgICAgbGRiID0gYl90bXAub3V0ZXJTdHJpZGUoKTsgXAorICAgIH0gXAorXAorICAgIE1LTFBSRUZJWCMjaGVtbSgmc2lkZSwgJnVwbG8sICZtLCAmbiwgJmFscGhhXywgKGNvbnN0IE1LTFRZUEUqKWEsICZsZGEsIChjb25zdCBNS0xUWVBFKiliLCAmbGRiLCAmYmV0YV8sIChNS0xUWVBFKilyZXMsICZsZGMpOyBcCitcCisgIH0gXAorfTsKKworRUlHRU5fTUtMX1NZTU1fTChkb3VibGUsIGRvdWJsZSwgZCwgZCkKK0VJR0VOX01LTF9TWU1NX0woZmxvYXQsIGZsb2F0LCBmLCBzKQorRUlHRU5fTUtMX0hFTU1fTChkY29tcGxleCwgTUtMX0NvbXBsZXgxNiwgY2QsIHopCitFSUdFTl9NS0xfSEVNTV9MKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsIGNmLCBjKQorCisKKy8qIE9wdGltaXplZCBtYXRyaXggKiBzZWxmYWRqb2ludCBtYXRyaXggKD9TWU1NLz9IRU1NKSBwcm9kdWN0ICovCisKKyNkZWZpbmUgRUlHRU5fTUtMX1NZTU1fUihFSUdUWVBFLCBNS0xUWVBFLCBFSUdQUkVGSVgsIE1LTFBSRUZJWCkgXAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBcCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsIFwKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PEVJR1RZUEUsSW5kZXgsTGhzU3RvcmFnZU9yZGVyLGZhbHNlLENvbmp1Z2F0ZUxocyxSaHNTdG9yYWdlT3JkZXIsdHJ1ZSxDb25qdWdhdGVSaHMsQ29sTWFqb3I+IFwKK3tcCitcCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1biggXAorICAgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIFwKKyAgICBjb25zdCBFSUdUWVBFKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgICBjb25zdCBFSUdUWVBFKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsIFwKKyAgICBFSUdUWVBFKiByZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsIFwKKyAgICBFSUdUWVBFIGFscGhhKSBcCisgIHsgXAorICAgIGNoYXIgc2lkZT0nUicsIHVwbG89J0wnOyBcCisgICAgTUtMX0lOVCBtLCBuLCBsZGEsIGxkYiwgbGRjOyBcCisgICAgY29uc3QgRUlHVFlQRSAqYSwgKmI7IFwKKyAgICBNS0xUWVBFIGFscGhhXywgYmV0YV87IFwKKyAgICBNYXRyaXhYIyNFSUdQUkVGSVggYl90bXA7IFwKKyAgICBFSUdUWVBFIG15b25lKDEpO1wKK1wKKy8qIFNldCBtLCBuLCBrICovIFwKKyAgICBtID0gKE1LTF9JTlQpcm93czsgIFwKKyAgICBuID0gKE1LTF9JTlQpY29sczsgIFwKK1wKKy8qIFNldCBhbHBoYV8gJiBiZXRhXyAqLyBcCisgICAgYXNzaWduX3NjYWxhcl9laWcybWtsKGFscGhhXywgYWxwaGEpOyBcCisgICAgYXNzaWduX3NjYWxhcl9laWcybWtsKGJldGFfLCBteW9uZSk7IFwKK1wKKy8qIFNldCBsZGEsIGxkYiwgbGRjICovIFwKKyAgICBsZGEgPSAoTUtMX0lOVClyaHNTdHJpZGU7IFwKKyAgICBsZGIgPSAoTUtMX0lOVClsaHNTdHJpZGU7IFwKKyAgICBsZGMgPSAoTUtMX0lOVClyZXNTdHJpZGU7IFwKK1wKKy8qIFNldCBhLCBiLCBjICovIFwKKyAgICBpZiAoUmhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgdXBsbz0nVSc7IFwKKyAgICBhID0gX3JoczsgXAorXAorICAgIGlmIChMaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSB7IFwKKyAgICAgIE1hcDxjb25zdCBNYXRyaXhYIyNFSUdQUkVGSVgsIDAsIE91dGVyU3RyaWRlPD4gPiBsaHMoX2xocyxuLG0sT3V0ZXJTdHJpZGU8PihyaHNTdHJpZGUpKTsgXAorICAgICAgYl90bXAgPSBsaHMuYWRqb2ludCgpOyBcCisgICAgICBiID0gYl90bXAuZGF0YSgpOyBcCisgICAgICBsZGIgPSBiX3RtcC5vdXRlclN0cmlkZSgpOyBcCisgICAgfSBlbHNlIGIgPSBfbGhzOyBcCitcCisgICAgTUtMUFJFRklYIyNzeW1tKCZzaWRlLCAmdXBsbywgJm0sICZuLCAmYWxwaGFfLCAoY29uc3QgTUtMVFlQRSopYSwgJmxkYSwgKGNvbnN0IE1LTFRZUEUqKWIsICZsZGIsICZiZXRhXywgKE1LTFRZUEUqKXJlcywgJmxkYyk7IFwKK1wKKyAgfSBcCit9OworCisKKyNkZWZpbmUgRUlHRU5fTUtMX0hFTU1fUihFSUdUWVBFLCBNS0xUWVBFLCBFSUdQUkVGSVgsIE1LTFBSRUZJWCkgXAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBcCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsIFwKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IHByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PEVJR1RZUEUsSW5kZXgsTGhzU3RvcmFnZU9yZGVyLGZhbHNlLENvbmp1Z2F0ZUxocyxSaHNTdG9yYWdlT3JkZXIsdHJ1ZSxDb25qdWdhdGVSaHMsQ29sTWFqb3I+IFwKK3tcCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1biggXAorICAgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIFwKKyAgICBjb25zdCBFSUdUWVBFKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgICBjb25zdCBFSUdUWVBFKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsIFwKKyAgICBFSUdUWVBFKiByZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsIFwKKyAgICBFSUdUWVBFIGFscGhhKSBcCisgIHsgXAorICAgIGNoYXIgc2lkZT0nUicsIHVwbG89J0wnOyBcCisgICAgTUtMX0lOVCBtLCBuLCBsZGEsIGxkYiwgbGRjOyBcCisgICAgY29uc3QgRUlHVFlQRSAqYSwgKmI7IFwKKyAgICBNS0xUWVBFIGFscGhhXywgYmV0YV87IFwKKyAgICBNYXRyaXhYIyNFSUdQUkVGSVggYl90bXA7IFwKKyAgICBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgUmhzU3RvcmFnZU9yZGVyPiBhX3RtcDsgXAorICAgIEVJR1RZUEUgbXlvbmUoMSk7IFwKK1wKKy8qIFNldCBtLCBuLCBrICovIFwKKyAgICBtID0gKE1LTF9JTlQpcm93czsgXAorICAgIG4gPSAoTUtMX0lOVCljb2xzOyBcCitcCisvKiBTZXQgYWxwaGFfICYgYmV0YV8gKi8gXAorICAgIGFzc2lnbl9zY2FsYXJfZWlnMm1rbChhbHBoYV8sIGFscGhhKTsgXAorICAgIGFzc2lnbl9zY2FsYXJfZWlnMm1rbChiZXRhXywgbXlvbmUpOyBcCitcCisvKiBTZXQgbGRhLCBsZGIsIGxkYyAqLyBcCisgICAgbGRhID0gKE1LTF9JTlQpcmhzU3RyaWRlOyBcCisgICAgbGRiID0gKE1LTF9JTlQpbGhzU3RyaWRlOyBcCisgICAgbGRjID0gKE1LTF9JTlQpcmVzU3RyaWRlOyBcCitcCisvKiBTZXQgYSwgYiwgYyAqLyBcCisgICAgaWYgKCgoUmhzU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgJiYgQ29uanVnYXRlUmhzKSB8fCAoKFJoc1N0b3JhZ2VPcmRlcj09Um93TWFqb3IpICYmICghQ29uanVnYXRlUmhzKSkpIHsgXAorICAgICAgTWFwPGNvbnN0IE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBSaHNTdG9yYWdlT3JkZXI+LCAwLCBPdXRlclN0cmlkZTw+ID4gcmhzKF9yaHMsbixuLE91dGVyU3RyaWRlPD4ocmhzU3RyaWRlKSk7IFwKKyAgICAgIGFfdG1wID0gcmhzLmNvbmp1Z2F0ZSgpOyBcCisgICAgICBhID0gYV90bXAuZGF0YSgpOyBcCisgICAgICBsZGEgPSBhX3RtcC5vdXRlclN0cmlkZSgpOyBcCisgICAgfSBlbHNlIGEgPSBfcmhzOyBcCisgICAgaWYgKFJoc1N0b3JhZ2VPcmRlcj09Um93TWFqb3IpIHVwbG89J1UnOyBcCitcCisgICAgaWYgKExoc1N0b3JhZ2VPcmRlcj09Q29sTWFqb3IgJiYgKCFDb25qdWdhdGVMaHMpKSB7IFwKKyAgICAgICBiID0gX2xoczsgfSBcCisgICAgZWxzZSB7IFwKKyAgICAgIGlmIChMaHNTdG9yYWdlT3JkZXI9PUNvbE1ham9yICYmIENvbmp1Z2F0ZUxocykgeyBcCisgICAgICAgIE1hcDxjb25zdCBNYXRyaXhYIyNFSUdQUkVGSVgsIDAsIE91dGVyU3RyaWRlPD4gPiBsaHMoX2xocyxtLG4sT3V0ZXJTdHJpZGU8PihsaHNTdHJpZGUpKTsgXAorICAgICAgICBiX3RtcCA9IGxocy5jb25qdWdhdGUoKTsgXAorICAgICAgfSBlbHNlIFwKKyAgICAgIGlmIChDb25qdWdhdGVMaHMpIHsgXAorICAgICAgICBNYXA8Y29uc3QgTWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gbGhzKF9saHMsbixtLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7IFwKKyAgICAgICAgYl90bXAgPSBsaHMuYWRqb2ludCgpOyBcCisgICAgICB9IGVsc2UgeyBcCisgICAgICAgIE1hcDxjb25zdCBNYXRyaXhYIyNFSUdQUkVGSVgsIDAsIE91dGVyU3RyaWRlPD4gPiBsaHMoX2xocyxuLG0sT3V0ZXJTdHJpZGU8PihsaHNTdHJpZGUpKTsgXAorICAgICAgICBiX3RtcCA9IGxocy50cmFuc3Bvc2UoKTsgXAorICAgICAgfSBcCisgICAgICBiID0gYl90bXAuZGF0YSgpOyBcCisgICAgICBsZGIgPSBiX3RtcC5vdXRlclN0cmlkZSgpOyBcCisgICAgfSBcCitcCisgICAgTUtMUFJFRklYIyNoZW1tKCZzaWRlLCAmdXBsbywgJm0sICZuLCAmYWxwaGFfLCAoY29uc3QgTUtMVFlQRSopYSwgJmxkYSwgKGNvbnN0IE1LTFRZUEUqKWIsICZsZGIsICZiZXRhXywgKE1LTFRZUEUqKXJlcywgJmxkYyk7IFwKKyAgfSBcCit9OworCitFSUdFTl9NS0xfU1lNTV9SKGRvdWJsZSwgZG91YmxlLCBkLCBkKQorRUlHRU5fTUtMX1NZTU1fUihmbG9hdCwgZmxvYXQsIGYsIHMpCitFSUdFTl9NS0xfSEVNTV9SKGRjb21wbGV4LCBNS0xfQ29tcGxleDE2LCBjZCwgeikKK0VJR0VOX01LTF9IRU1NX1Ioc2NvbXBsZXgsIE1LTF9Db21wbGV4OCwgY2YsIGMpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NFTEZBREpPSU5UX01BVFJJWF9NQVRSSVhfTUtMX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4VmVjdG9yLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTQ1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludE1hdHJpeFZlY3Rvci5oCkBAIC0wLDAgKzEsMjc0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TRUxGQURKT0lOVF9NQVRSSVhfVkVDVE9SX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX1ZFQ1RPUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiBPcHRpbWl6ZWQgc2VsZmFkam9pbnQgbWF0cml4ICogdmVjdG9yIHByb2R1Y3Q6CisgKiBUaGlzIGFsZ29yaXRobSBwcm9jZXNzZXMgMiBjb2x1bW5zIGF0IG9uY2VzIHRoYXQgYWxsb3dzIHRvIGJvdGggcmVkdWNlCisgKiB0aGUgbnVtYmVyIG9mIGxvYWQvc3RvcmVzIG9mIHRoZSByZXN1bHQgYnkgYSBmYWN0b3IgMiBhbmQgdG8gcmVkdWNlCisgKiB0aGUgaW5zdHJ1Y3Rpb24gZGVwZW5kZW5jeS4KKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU3RvcmFnZU9yZGVyLCBpbnQgVXBMbywgYm9vbCBDb25qdWdhdGVMaHMsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgVmVyc2lvbj1TcGVjaWFsaXplZD4KK3N0cnVjdCBzZWxmYWRqb2ludF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXIsIGludCBVcExvLCBib29sIENvbmp1Z2F0ZUxocywgYm9vbCBDb25qdWdhdGVSaHMsIGludCBWZXJzaW9uPgorc3RydWN0IHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdAorCit7CitzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oCisgIEluZGV4IHNpemUsCisgIGNvbnN0IFNjYWxhciogIGxocywgSW5kZXggbGhzU3RyaWRlLAorICBjb25zdCBTY2FsYXIqIF9yaHMsIEluZGV4IHJoc0luY3IsCisgIFNjYWxhciogcmVzLAorICBTY2FsYXIgYWxwaGEpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBjb25zdCBJbmRleCBQYWNrZXRTaXplID0gc2l6ZW9mKFBhY2tldCkvc2l6ZW9mKFNjYWxhcik7CisKKyAgZW51bSB7CisgICAgSXNSb3dNYWpvciA9IFN0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyAxIDogMCwKKyAgICBJc0xvd2VyID0gVXBMbyA9PSBMb3dlciA/IDEgOiAwLAorICAgIEZpcnN0VHJpYW5ndWxhciA9IElzUm93TWFqb3IgPT0gSXNMb3dlcgorICB9OworCisgIGNvbmpfaGVscGVyPFNjYWxhcixTY2FsYXIsTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBFSUdFTl9MT0dJQ0FMX1hPUihDb25qdWdhdGVMaHMsICBJc1Jvd01ham9yKSwgQ29uanVnYXRlUmhzPiBjajA7CisgIGNvbmpfaGVscGVyPFNjYWxhcixTY2FsYXIsTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBFSUdFTl9MT0dJQ0FMX1hPUihDb25qdWdhdGVMaHMsICFJc1Jvd01ham9yKSwgQ29uanVnYXRlUmhzPiBjajE7CisgIGNvbmpfaGVscGVyPFNjYWxhcixTY2FsYXIsTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwgQ29uanVnYXRlUmhzPiBjamQ7CisKKyAgY29ual9oZWxwZXI8UGFja2V0LFBhY2tldCxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIEVJR0VOX0xPR0lDQUxfWE9SKENvbmp1Z2F0ZUxocywgIElzUm93TWFqb3IpLCBDb25qdWdhdGVSaHM+IHBjajA7CisgIGNvbmpfaGVscGVyPFBhY2tldCxQYWNrZXQsTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBFSUdFTl9MT0dJQ0FMX1hPUihDb25qdWdhdGVMaHMsICFJc1Jvd01ham9yKSwgQ29uanVnYXRlUmhzPiBwY2oxOworCisgIFNjYWxhciBjakFscGhhID0gQ29uanVnYXRlUmhzID8gY29uaihhbHBoYSkgOiBhbHBoYTsKKworICAvLyBGSVhNRSB0aGlzIGNvcHkgaXMgbm93IGhhbmRsZWQgb3V0c2lkZSBwcm9kdWN0X3NlbGZhZGpvaW50X3ZlY3Rvciwgc28gaXQgY291bGQgcHJvYmFibHkgYmUgcmVtb3ZlZC4KKyAgLy8gaWYgdGhlIHJocyBpcyBub3Qgc2VxdWVudGlhbGx5IHN0b3JlZCBpbiBtZW1vcnkgd2UgY29weSBpdCB0byBhIHRlbXBvcmFyeSBidWZmZXIsCisgIC8vIHRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIHRvIGV4dHJhY3QgcGFja2V0cworICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLHJocyxzaXplLHJoc0luY3I9PTEgPyBjb25zdF9jYXN0PFNjYWxhcio+KF9yaHMpIDogMCk7ICAKKyAgaWYgKHJoc0luY3IhPTEpCisgIHsKKyAgICBjb25zdCBTY2FsYXIqIGl0ID0gX3JoczsKKyAgICBmb3IgKEluZGV4IGk9MDsgaTxzaXplOyArK2ksIGl0Kz1yaHNJbmNyKQorICAgICAgcmhzW2ldID0gKml0OworICB9CisKKyAgSW5kZXggYm91bmQgPSAoc3RkOjptYXgpKEluZGV4KDApLHNpemUtOCkgJiAweGZmZmZmZmZlOworICBpZiAoRmlyc3RUcmlhbmd1bGFyKQorICAgIGJvdW5kID0gc2l6ZSAtIGJvdW5kOworCisgIGZvciAoSW5kZXggaj1GaXJzdFRyaWFuZ3VsYXIgPyBib3VuZCA6IDA7CisgICAgICAgajwoRmlyc3RUcmlhbmd1bGFyID8gc2l6ZSA6IGJvdW5kKTtqKz0yKQorICB7CisgICAgcmVnaXN0ZXIgY29uc3QgU2NhbGFyKiBFSUdFTl9SRVNUUklDVCBBMCA9IGxocyArIGoqbGhzU3RyaWRlOworICAgIHJlZ2lzdGVyIGNvbnN0IFNjYWxhciogRUlHRU5fUkVTVFJJQ1QgQTEgPSBsaHMgKyAoaisxKSpsaHNTdHJpZGU7CisKKyAgICBTY2FsYXIgdDAgPSBjakFscGhhICogcmhzW2pdOworICAgIFBhY2tldCBwdG1wMCA9IHBzZXQxPFBhY2tldD4odDApOworICAgIFNjYWxhciB0MSA9IGNqQWxwaGEgKiByaHNbaisxXTsKKyAgICBQYWNrZXQgcHRtcDEgPSBwc2V0MTxQYWNrZXQ+KHQxKTsKKworICAgIFNjYWxhciB0MigwKTsKKyAgICBQYWNrZXQgcHRtcDIgPSBwc2V0MTxQYWNrZXQ+KHQyKTsKKyAgICBTY2FsYXIgdDMoMCk7CisgICAgUGFja2V0IHB0bXAzID0gcHNldDE8UGFja2V0Pih0Myk7CisKKyAgICBzaXplX3Qgc3RhcnRpID0gRmlyc3RUcmlhbmd1bGFyID8gMCA6IGorMjsKKyAgICBzaXplX3QgZW5kaSAgID0gRmlyc3RUcmlhbmd1bGFyID8gaiA6IHNpemU7CisgICAgc2l6ZV90IGFsaWduZWRTdGFydCA9IChzdGFydGkpICsgaW50ZXJuYWw6OmZpcnN0X2FsaWduZWQoJnJlc1tzdGFydGldLCBlbmRpLXN0YXJ0aSk7CisgICAgc2l6ZV90IGFsaWduZWRFbmQgPSBhbGlnbmVkU3RhcnQgKyAoKGVuZGktYWxpZ25lZFN0YXJ0KS8oUGFja2V0U2l6ZSkpKihQYWNrZXRTaXplKTsKKworICAgIC8vIFRPRE8gbWFrZSBzdXJlIHRoaXMgcHJvZHVjdCBpcyBhIHJlYWwgKiBjb21wbGV4IGFuZCB0aGF0IHRoZSByaHMgaXMgcHJvcGVybHkgY29uanVnYXRlZCBpZiBuZWVkZWQKKyAgICByZXNbal0gICArPSBjamQucG11bChpbnRlcm5hbDo6cmVhbChBMFtqXSksIHQwKTsKKyAgICByZXNbaisxXSArPSBjamQucG11bChpbnRlcm5hbDo6cmVhbChBMVtqKzFdKSwgdDEpOworICAgIGlmKEZpcnN0VHJpYW5ndWxhcikKKyAgICB7CisgICAgICByZXNbal0gICArPSBjajAucG11bChBMVtqXSwgICB0MSk7CisgICAgICB0MyAgICAgICArPSBjajEucG11bChBMVtqXSwgICByaHNbal0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmVzW2orMV0gKz0gY2owLnBtdWwoQTBbaisxXSx0MCk7CisgICAgICB0MiArPSBjajEucG11bChBMFtqKzFdLCByaHNbaisxXSk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaT1zdGFydGk7IGk8YWxpZ25lZFN0YXJ0OyArK2kpCisgICAgeworICAgICAgcmVzW2ldICs9IHQwICogQTBbaV0gKyB0MSAqIEExW2ldOworICAgICAgdDIgKz0gY29uaihBMFtpXSkgKiByaHNbaV07CisgICAgICB0MyArPSBjb25qKEExW2ldKSAqIHJoc1tpXTsKKyAgICB9CisgICAgLy8gWWVzIHRoaXMgYW4gb3B0aW1pemF0aW9uIGZvciBnY2MgNC4zIGFuZCA0LjQgKD0+IGh1Z2Ugc3BlZWQgdXApCisgICAgLy8gZ2NjIDQuMiBkb2VzIHRoaXMgb3B0aW1pemF0aW9uIGF1dG9tYXRpY2FsbHkuCisgICAgY29uc3QgU2NhbGFyKiBFSUdFTl9SRVNUUklDVCBhMEl0ICA9IEEwICArIGFsaWduZWRTdGFydDsKKyAgICBjb25zdCBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIGExSXQgID0gQTEgICsgYWxpZ25lZFN0YXJ0OworICAgIGNvbnN0IFNjYWxhciogRUlHRU5fUkVTVFJJQ1QgcmhzSXQgPSByaHMgKyBhbGlnbmVkU3RhcnQ7CisgICAgICAgICAgU2NhbGFyKiBFSUdFTl9SRVNUUklDVCByZXNJdCA9IHJlcyArIGFsaWduZWRTdGFydDsKKyAgICBmb3IgKHNpemVfdCBpPWFsaWduZWRTdGFydDsgaTxhbGlnbmVkRW5kOyBpKz1QYWNrZXRTaXplKQorICAgIHsKKyAgICAgIFBhY2tldCBBMGkgPSBwbG9hZHU8UGFja2V0PihhMEl0KTsgIGEwSXQgICs9IFBhY2tldFNpemU7CisgICAgICBQYWNrZXQgQTFpID0gcGxvYWR1PFBhY2tldD4oYTFJdCk7ICBhMUl0ICArPSBQYWNrZXRTaXplOworICAgICAgUGFja2V0IEJpICA9IHBsb2FkdTxQYWNrZXQ+KHJoc0l0KTsgcmhzSXQgKz0gUGFja2V0U2l6ZTsgLy8gRklYTUUgc2hvdWxkIGJlIGFsaWduZWQgaW4gbW9zdCBjYXNlcworICAgICAgUGFja2V0IFhpICA9IHBsb2FkIDxQYWNrZXQ+KHJlc0l0KTsKKworICAgICAgWGkgICAgPSBwY2owLnBtYWRkKEEwaSxwdG1wMCwgcGNqMC5wbWFkZChBMWkscHRtcDEsWGkpKTsKKyAgICAgIHB0bXAyID0gcGNqMS5wbWFkZChBMGksICBCaSwgcHRtcDIpOworICAgICAgcHRtcDMgPSBwY2oxLnBtYWRkKEExaSwgIEJpLCBwdG1wMyk7CisgICAgICBwc3RvcmUocmVzSXQsWGkpOyByZXNJdCArPSBQYWNrZXRTaXplOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpPWFsaWduZWRFbmQ7IGk8ZW5kaTsgaSsrKQorICAgIHsKKyAgICAgIHJlc1tpXSArPSBjajAucG11bChBMFtpXSwgdDApICsgY2owLnBtdWwoQTFbaV0sdDEpOworICAgICAgdDIgKz0gY2oxLnBtdWwoQTBbaV0sIHJoc1tpXSk7CisgICAgICB0MyArPSBjajEucG11bChBMVtpXSwgcmhzW2ldKTsKKyAgICB9CisKKyAgICByZXNbal0gICArPSBhbHBoYSAqICh0MiArIHByZWR1eChwdG1wMikpOworICAgIHJlc1tqKzFdICs9IGFscGhhICogKHQzICsgcHJlZHV4KHB0bXAzKSk7CisgIH0KKyAgZm9yIChJbmRleCBqPUZpcnN0VHJpYW5ndWxhciA/IDAgOiBib3VuZDtqPChGaXJzdFRyaWFuZ3VsYXIgPyBib3VuZCA6IHNpemUpO2orKykKKyAgeworICAgIHJlZ2lzdGVyIGNvbnN0IFNjYWxhciogRUlHRU5fUkVTVFJJQ1QgQTAgPSBsaHMgKyBqKmxoc1N0cmlkZTsKKworICAgIFNjYWxhciB0MSA9IGNqQWxwaGEgKiByaHNbal07CisgICAgU2NhbGFyIHQyKDApOworICAgIC8vIFRPRE8gbWFrZSBzdXJlIHRoaXMgcHJvZHVjdCBpcyBhIHJlYWwgKiBjb21wbGV4IGFuZCB0aGF0IHRoZSByaHMgaXMgcHJvcGVybHkgY29uanVnYXRlZCBpZiBuZWVkZWQKKyAgICByZXNbal0gKz0gY2pkLnBtdWwoaW50ZXJuYWw6OnJlYWwoQTBbal0pLCB0MSk7CisgICAgZm9yIChJbmRleCBpPUZpcnN0VHJpYW5ndWxhciA/IDAgOiBqKzE7IGk8KEZpcnN0VHJpYW5ndWxhciA/IGogOiBzaXplKTsgaSsrKQorICAgIHsKKyAgICAgIHJlc1tpXSArPSBjajAucG11bChBMFtpXSwgdDEpOworICAgICAgdDIgKz0gY2oxLnBtdWwoQTBbaV0sIHJoc1tpXSk7CisgICAgfQorICAgIHJlc1tqXSArPSBhbHBoYSAqIHQyOworICB9Cit9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogV3JhcHBlciB0byBwcm9kdWN0X3NlbGZhZGpvaW50X3ZlY3RvcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCBpbnQgTGhzTW9kZSwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czxTZWxmYWRqb2ludFByb2R1Y3RNYXRyaXg8TGhzLExoc01vZGUsZmFsc2UsUmhzLDAsdHJ1ZT4gPgorICA6IHRyYWl0czxQcm9kdWN0QmFzZTxTZWxmYWRqb2ludFByb2R1Y3RNYXRyaXg8TGhzLExoc01vZGUsZmFsc2UsUmhzLDAsdHJ1ZT4sIExocywgUmhzPiA+Cit7fTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCBpbnQgTGhzTW9kZSwgdHlwZW5hbWUgUmhzPgorc3RydWN0IFNlbGZhZGpvaW50UHJvZHVjdE1hdHJpeDxMaHMsTGhzTW9kZSxmYWxzZSxSaHMsMCx0cnVlPgorICA6IHB1YmxpYyBQcm9kdWN0QmFzZTxTZWxmYWRqb2ludFByb2R1Y3RNYXRyaXg8TGhzLExoc01vZGUsZmFsc2UsUmhzLDAsdHJ1ZT4sIExocywgUmhzID4KK3sKKyAgRUlHRU5fUFJPRFVDVF9QVUJMSUNfSU5URVJGQUNFKFNlbGZhZGpvaW50UHJvZHVjdE1hdHJpeCkKKworICBlbnVtIHsKKyAgICBMaHNVcExvID0gTGhzTW9kZSYoVXBwZXJ8TG93ZXIpCisgIH07CisKKyAgU2VsZmFkam9pbnRQcm9kdWN0TWF0cml4KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykgOiBCYXNlKGxocyxyaHMpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRlc3QsIFNjYWxhciBhbHBoYSkgY29uc3QKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6U2NhbGFyIFJlc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlJoc1NjYWxhciBSaHNTY2FsYXI7CisgICAgdHlwZWRlZiBNYXA8TWF0cml4PFJlc1NjYWxhcixEeW5hbWljLDE+LCBBbGlnbmVkPiBNYXBwZWREZXN0OworICAgIAorICAgIGVpZ2VuX2Fzc2VydChkZXN0LnJvd3MoKT09bV9saHMucm93cygpICYmIGRlc3QuY29scygpPT1tX3Jocy5jb2xzKCkpOworCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPEFjdHVhbExoc1R5cGU+Ojp0eXBlIGxocyA9IExoc0JsYXNUcmFpdHM6OmV4dHJhY3QobV9saHMpOworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxSaHNUeXBlPjo6dHlwZSByaHMgPSBSaHNCbGFzVHJhaXRzOjpleHRyYWN0KG1fcmhzKTsKKworICAgIFNjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihtX2xocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IobV9yaHMpOworCisgICAgZW51bSB7CisgICAgICBFdmFsVG9EZXN0ID0gKERlc3Q6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MSksCisgICAgICBVc2VSaHMgPSAoX0FjdHVhbFJoc1R5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MSkKKyAgICB9OworICAgIAorICAgIGludGVybmFsOjpnZW12X3N0YXRpY192ZWN0b3JfaWY8UmVzU2NhbGFyLERlc3Q6OlNpemVBdENvbXBpbGVUaW1lLERlc3Q6Ok1heFNpemVBdENvbXBpbGVUaW1lLCFFdmFsVG9EZXN0PiBzdGF0aWNfZGVzdDsKKyAgICBpbnRlcm5hbDo6Z2Vtdl9zdGF0aWNfdmVjdG9yX2lmPFJoc1NjYWxhcixfQWN0dWFsUmhzVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsX0FjdHVhbFJoc1R5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lLCFVc2VSaHM+IHN0YXRpY19yaHM7CisKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoUmVzU2NhbGFyLGFjdHVhbERlc3RQdHIsZGVzdC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWxUb0Rlc3QgPyBkZXN0LmRhdGEoKSA6IHN0YXRpY19kZXN0LmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShSaHNTY2FsYXIsYWN0dWFsUmhzUHRyLHJocy5zaXplKCksCisgICAgICAgIFVzZVJocyA/IGNvbnN0X2Nhc3Q8UmhzU2NhbGFyKj4ocmhzLmRhdGEoKSkgOiBzdGF0aWNfcmhzLmRhdGEoKSk7CisgICAgCisgICAgaWYoIUV2YWxUb0Rlc3QpCisgICAgeworICAgICAgI2lmZGVmIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgIGludCBzaXplID0gZGVzdC5zaXplKCk7CisgICAgICBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICAjZW5kaWYKKyAgICAgIE1hcHBlZERlc3QoYWN0dWFsRGVzdFB0ciwgZGVzdC5zaXplKCkpID0gZGVzdDsKKyAgICB9CisgICAgICAKKyAgICBpZighVXNlUmhzKQorICAgIHsKKyAgICAgICNpZmRlZiBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICBpbnQgc2l6ZSA9IHJocy5zaXplKCk7CisgICAgICBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICAjZW5kaWYKKyAgICAgIE1hcDx0eXBlbmFtZSBfQWN0dWFsUmhzVHlwZTo6UGxhaW5PYmplY3Q+KGFjdHVhbFJoc1B0ciwgcmhzLnNpemUoKSkgPSByaHM7CisgICAgfQorICAgICAgCisgICAgICAKKyAgICBpbnRlcm5hbDo6c2VsZmFkam9pbnRfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PFNjYWxhciwgSW5kZXgsIChpbnRlcm5hbDo6dHJhaXRzPF9BY3R1YWxMaHNUeXBlPjo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwgaW50KExoc1VwTG8pLCBib29sKExoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSksIGJvb2woUmhzQmxhc1RyYWl0czo6TmVlZFRvQ29uanVnYXRlKT46OnJ1bgorICAgICAgKAorICAgICAgICBsaHMucm93cygpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZQorICAgICAgICAmbGhzLmNvZWZmUmVmKDAsMCksICBsaHMub3V0ZXJTdHJpZGUoKSwgLy8gbGhzIGluZm8KKyAgICAgICAgYWN0dWFsUmhzUHRyLCAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJocyBpbmZvCisgICAgICAgIGFjdHVhbERlc3RQdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHQgaW5mbworICAgICAgICBhY3R1YWxBbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGUgZmFjdG9yCisgICAgICApOworICAgIAorICAgIGlmKCFFdmFsVG9EZXN0KQorICAgICAgZGVzdCA9IE1hcHBlZERlc3QoYWN0dWFsRGVzdFB0ciwgZGVzdC5zaXplKCkpOworICB9Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBSaHNNb2RlPgorc3RydWN0IHRyYWl0czxTZWxmYWRqb2ludFByb2R1Y3RNYXRyaXg8TGhzLDAsdHJ1ZSxSaHMsUmhzTW9kZSxmYWxzZT4gPgorICA6IHRyYWl0czxQcm9kdWN0QmFzZTxTZWxmYWRqb2ludFByb2R1Y3RNYXRyaXg8TGhzLDAsdHJ1ZSxSaHMsUmhzTW9kZSxmYWxzZT4sIExocywgUmhzPiA+Cit7fTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBSaHNNb2RlPgorc3RydWN0IFNlbGZhZGpvaW50UHJvZHVjdE1hdHJpeDxMaHMsMCx0cnVlLFJocyxSaHNNb2RlLGZhbHNlPgorICA6IHB1YmxpYyBQcm9kdWN0QmFzZTxTZWxmYWRqb2ludFByb2R1Y3RNYXRyaXg8TGhzLDAsdHJ1ZSxSaHMsUmhzTW9kZSxmYWxzZT4sIExocywgUmhzID4KK3sKKyAgRUlHRU5fUFJPRFVDVF9QVUJMSUNfSU5URVJGQUNFKFNlbGZhZGpvaW50UHJvZHVjdE1hdHJpeCkKKworICBlbnVtIHsKKyAgICBSaHNVcExvID0gUmhzTW9kZSYoVXBwZXJ8TG93ZXIpCisgIH07CisKKyAgU2VsZmFkam9pbnRQcm9kdWN0TWF0cml4KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykgOiBCYXNlKGxocyxyaHMpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRlc3QsIFNjYWxhciBhbHBoYSkgY29uc3QKKyAgeworICAgIC8vIGxldCdzIHNpbXBseSB0cmFuc3Bvc2UgdGhlIHByb2R1Y3QKKyAgICBUcmFuc3Bvc2U8RGVzdD4gZGVzdFQoZGVzdCk7CisgICAgU2VsZmFkam9pbnRQcm9kdWN0TWF0cml4PFRyYW5zcG9zZTxjb25zdCBSaHM+LCBpbnQoUmhzVXBMbyk9PVVwcGVyID8gTG93ZXIgOiBVcHBlciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9zZTxjb25zdCBMaHM+LCAwLCB0cnVlPihtX3Jocy50cmFuc3Bvc2UoKSwgbV9saHMudHJhbnNwb3NlKCkpLnNjYWxlQW5kQWRkVG8oZGVzdFQsIGFscGhhKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TRUxGQURKT0lOVF9NQVRSSVhfVkVDVE9SX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4VmVjdG9yX01LTC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRNYXRyaXhWZWN0b3JfTUtMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4ZDQ4MwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50TWF0cml4VmVjdG9yX01LTC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gSW50ZWwoUikgTUtMCisgKiAgIFNlbGZhZGpvaW50IG1hdHJpeC12ZWN0b3IgcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGJhc2VkIG9uID9TWU1WL0hFTVYuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX1ZFQ1RPUl9NS0xfSAorI2RlZmluZSBFSUdFTl9TRUxGQURKT0lOVF9NQVRSSVhfVkVDVE9SX01LTF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBzZWxmYWRqb2ludCBtYXRyaXgtdmVjdG9yIG11bHRpcGxpY2F0aW9uIHVzaW5nIEJMQVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIHN5bXYvaGVtdiBzcGVjaWFsaXphdGlvbgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU3RvcmFnZU9yZGVyLCBpbnQgVXBMbywgYm9vbCBDb25qdWdhdGVMaHMsIGJvb2wgQ29uanVnYXRlUmhzPgorc3RydWN0IHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdF9zeW12IDoKKyAgc2VsZmFkam9pbnRfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PFNjYWxhcixJbmRleCxTdG9yYWdlT3JkZXIsVXBMbyxDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzLEJ1aWx0SW4+IHt9OworCisjZGVmaW5lIEVJR0VOX01LTF9TWU1WX1NQRUNJQUxJWkUoU2NhbGFyKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IFN0b3JhZ2VPcmRlciwgaW50IFVwTG8sIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4gXAorc3RydWN0IHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyLFVwTG8sQ29uanVnYXRlTGhzLENvbmp1Z2F0ZVJocyxTcGVjaWFsaXplZD4geyBcCitzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oIFwKKyAgSW5kZXggc2l6ZSwgY29uc3QgU2NhbGFyKiAgbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgY29uc3QgU2NhbGFyKiBfcmhzLCBJbmRleCByaHNJbmNyLCBTY2FsYXIqIHJlcywgU2NhbGFyIGFscGhhKSB7IFwKKyAgICBlbnVtIHtcCisgICAgICBJc0NvbE1ham9yID0gU3RvcmFnZU9yZGVyPT1Db2xNYWpvciBcCisgICAgfTsgXAorICAgIGlmIChJc0NvbE1ham9yID09IENvbmp1Z2F0ZUxocykge1wKKyAgICAgIHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyLFVwTG8sQ29uanVnYXRlTGhzLENvbmp1Z2F0ZVJocyxCdWlsdEluPjo6cnVuKCBcCisgICAgICAgIHNpemUsIGxocywgbGhzU3RyaWRlLCBfcmhzLCByaHNJbmNyLCByZXMsIGFscGhhKTsgIFwKKyAgICB9IGVsc2Uge1wKKyAgICAgIHNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdF9zeW12PFNjYWxhcixJbmRleCxTdG9yYWdlT3JkZXIsVXBMbyxDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzPjo6cnVuKCBcCisgICAgICAgIHNpemUsIGxocywgbGhzU3RyaWRlLCBfcmhzLCByaHNJbmNyLCByZXMsIGFscGhhKTsgIFwKKyAgICB9XAorICB9IFwKK307IFwKKworRUlHRU5fTUtMX1NZTVZfU1BFQ0lBTElaRShkb3VibGUpCitFSUdFTl9NS0xfU1lNVl9TUEVDSUFMSVpFKGZsb2F0KQorRUlHRU5fTUtMX1NZTVZfU1BFQ0lBTElaRShkY29tcGxleCkKK0VJR0VOX01LTF9TWU1WX1NQRUNJQUxJWkUoc2NvbXBsZXgpCisKKyNkZWZpbmUgRUlHRU5fTUtMX1NZTVZfU1BFQ0lBTElaQVRJT04oRUlHVFlQRSxNS0xUWVBFLE1LTEZVTkMpIFwKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgU3RvcmFnZU9yZGVyLCBpbnQgVXBMbywgYm9vbCBDb25qdWdhdGVMaHMsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3Qgc2VsZmFkam9pbnRfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3N5bXY8RUlHVFlQRSxJbmRleCxTdG9yYWdlT3JkZXIsVXBMbyxDb25qdWdhdGVMaHMsQ29uanVnYXRlUmhzPiBcCit7IFwKK3R5cGVkZWYgTWF0cml4PEVJR1RZUEUsRHluYW1pYywxLENvbE1ham9yPiBTWU1WVmVjdG9yO1wKK1wKK3N0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1biggXAorSW5kZXggc2l6ZSwgY29uc3QgRUlHVFlQRSogIGxocywgSW5kZXggbGhzU3RyaWRlLCBcCitjb25zdCBFSUdUWVBFKiBfcmhzLCBJbmRleCByaHNJbmNyLCBFSUdUWVBFKiByZXMsIEVJR1RZUEUgYWxwaGEpIFwKK3sgXAorICBlbnVtIHtcCisgICAgSXNSb3dNYWpvciA9IFN0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyAxIDogMCwgXAorICAgIElzTG93ZXIgPSBVcExvID09IExvd2VyID8gMSA6IDAgXAorICB9OyBcCisgIE1LTF9JTlQgbj1zaXplLCBsZGE9bGhzU3RyaWRlLCBpbmN4PXJoc0luY3IsIGluY3k9MTsgXAorICBNS0xUWVBFIGFscGhhXywgYmV0YV87IFwKKyAgY29uc3QgRUlHVFlQRSAqeF9wdHIsIG15b25lKDEpOyBcCisgIGNoYXIgdXBsbz0oSXNSb3dNYWpvcikgPyAoSXNMb3dlciA/ICdVJyA6ICdMJykgOiAoSXNMb3dlciA/ICdMJyA6ICdVJyk7IFwKKyAgYXNzaWduX3NjYWxhcl9laWcybWtsKGFscGhhXywgYWxwaGEpOyBcCisgIGFzc2lnbl9zY2FsYXJfZWlnMm1rbChiZXRhXywgbXlvbmUpOyBcCisgIFNZTVZWZWN0b3IgeF90bXA7IFwKKyAgaWYgKENvbmp1Z2F0ZVJocykgeyBcCisgICAgTWFwPGNvbnN0IFNZTVZWZWN0b3IsIDAsIElubmVyU3RyaWRlPD4gPiBtYXBfeChfcmhzLHNpemUsMSxJbm5lclN0cmlkZTw+KGluY3gpKTsgXAorICAgIHhfdG1wPW1hcF94LmNvbmp1Z2F0ZSgpOyBcCisgICAgeF9wdHI9eF90bXAuZGF0YSgpOyBcCisgICAgaW5jeD0xOyBcCisgIH0gZWxzZSB4X3B0cj1fcmhzOyBcCisgIE1LTEZVTkMoJnVwbG8sICZuLCAmYWxwaGFfLCAoY29uc3QgTUtMVFlQRSopbGhzLCAmbGRhLCAoY29uc3QgTUtMVFlQRSopeF9wdHIsICZpbmN4LCAmYmV0YV8sIChNS0xUWVBFKilyZXMsICZpbmN5KTsgXAorfVwKK307CisKK0VJR0VOX01LTF9TWU1WX1NQRUNJQUxJWkFUSU9OKGRvdWJsZSwgICBkb3VibGUsICAgICAgICBkc3ltdikKK0VJR0VOX01LTF9TWU1WX1NQRUNJQUxJWkFUSU9OKGZsb2F0LCAgICBmbG9hdCwgICAgICAgICBzc3ltdikKK0VJR0VOX01LTF9TWU1WX1NQRUNJQUxJWkFUSU9OKGRjb21wbGV4LCBNS0xfQ29tcGxleDE2LCB6aGVtdikKK0VJR0VOX01LTF9TWU1WX1NQRUNJQUxJWkFUSU9OKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsICBjaGVtdikKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0VMRkFESk9JTlRfTUFUUklYX1ZFQ1RPUl9NS0xfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRQcm9kdWN0LmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9TZWxmYWRqb2ludFByb2R1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTU1ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRQcm9kdWN0LmgKQEAgLTAsMCArMSwxMjUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TRUxGQURKT0lOVF9QUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRfUFJPRFVDVF9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgc2VsZiBhZGpvaW50IHByb2R1Y3Q6IEMgKz0gQSBBXlQgdXBkYXRpbmcgb25seQorKiBoYWxmIG9mIHRoZSBzZWxmYWRqb2ludCBtYXRyaXggQy4KKyogSXQgY29ycmVzcG9uZHMgdG8gdGhlIGxldmVsIDMgU1lSSyBhbmQgbGV2ZWwgMiBTWVIgQmxhcyByb3V0aW5lcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU3RvcmFnZU9yZGVyLCBpbnQgVXBMbywgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+CitzdHJ1Y3Qgc2VsZmFkam9pbnRfcmFuazFfdXBkYXRlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgVXBMbywgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+CitzdHJ1Y3Qgc2VsZmFkam9pbnRfcmFuazFfdXBkYXRlPFNjYWxhcixJbmRleCxDb2xNYWpvcixVcExvLENvbmpMaHMsQ29ualJocz4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIFNjYWxhciogbWF0LCBJbmRleCBzdHJpZGUsIGNvbnN0IFNjYWxhciogdmVjLCBTY2FsYXIgYWxwaGEpCisgIHsKKyAgICBpbnRlcm5hbDo6Y29ual9pZjxDb25qUmhzPiBjajsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPiBPdGhlck1hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxDb25qTGhzLHR5cGVuYW1lIE90aGVyTWFwOjpDb25qdWdhdGVSZXR1cm5UeXBlLGNvbnN0IE90aGVyTWFwJj46OnR5cGUgQ29ualJoc1R5cGU7CisgICAgZm9yIChJbmRleCBpPTA7IGk8c2l6ZTsgKytpKQorICAgIHsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPihtYXQrc3RyaWRlKmkrKFVwTG89PUxvd2VyID8gaSA6IDApLCAoVXBMbz09TG93ZXIgPyBzaXplLWkgOiAoaSsxKSkpCisgICAgICAgICAgKz0gKGFscGhhICogY2oodmVjW2ldKSkgKiBDb25qUmhzVHlwZShPdGhlck1hcCh2ZWMrKFVwTG89PUxvd2VyID8gaSA6IDApLFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSkpKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBVcExvLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KK3N0cnVjdCBzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLEluZGV4LFJvd01ham9yLFVwTG8sQ29uakxocyxDb25qUmhzPgoreworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgU2NhbGFyKiBtYXQsIEluZGV4IHN0cmlkZSwgY29uc3QgU2NhbGFyKiB2ZWMsIFNjYWxhciBhbHBoYSkKKyAgeworICAgIHNlbGZhZGpvaW50X3JhbmsxX3VwZGF0ZTxTY2FsYXIsSW5kZXgsQ29sTWFqb3IsVXBMbz09TG93ZXI/VXBwZXI6TG93ZXIsQ29ualJocyxDb25qTGhzPjo6cnVuKHNpemUsbWF0LHN0cmlkZSx2ZWMsYWxwaGEpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBPdGhlclR5cGUsIGludCBVcExvLCBib29sIE90aGVySXNWZWN0b3IgPSBPdGhlclR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZT4KK3N0cnVjdCBzZWxmYWRqb2ludF9wcm9kdWN0X3NlbGVjdG9yOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBPdGhlclR5cGUsIGludCBVcExvPgorc3RydWN0IHNlbGZhZGpvaW50X3Byb2R1Y3Rfc2VsZWN0b3I8TWF0cml4VHlwZSxPdGhlclR5cGUsVXBMbyx0cnVlPgoreworICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgbWF0LCBjb25zdCBPdGhlclR5cGUmIG90aGVyLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgYWxwaGEpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIGludGVybmFsOjpibGFzX3RyYWl0czxPdGhlclR5cGU+IE90aGVyQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE90aGVyQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxPdGhlclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBY3R1YWxPdGhlclR5cGU+Ojp0eXBlIF9BY3R1YWxPdGhlclR5cGU7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPEFjdHVhbE90aGVyVHlwZT46OnR5cGUgYWN0dWFsT3RoZXIgPSBPdGhlckJsYXNUcmFpdHM6OmV4dHJhY3Qob3RoZXIuZGVyaXZlZCgpKTsKKworICAgIFNjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogT3RoZXJCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKG90aGVyLmRlcml2ZWQoKSk7CisKKyAgICBlbnVtIHsKKyAgICAgIFN0b3JhZ2VPcmRlciA9IChpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLAorICAgICAgVXNlT3RoZXJEaXJlY3RseSA9IF9BY3R1YWxPdGhlclR5cGU6OklubmVyU3RyaWRlQXRDb21waWxlVGltZT09MQorICAgIH07CisgICAgaW50ZXJuYWw6OmdlbXZfc3RhdGljX3ZlY3Rvcl9pZjxTY2FsYXIsT3RoZXJUeXBlOjpTaXplQXRDb21waWxlVGltZSxPdGhlclR5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lLCFVc2VPdGhlckRpcmVjdGx5PiBzdGF0aWNfb3RoZXI7CisKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBhY3R1YWxPdGhlclB0ciwgb3RoZXIuc2l6ZSgpLAorICAgICAgKFVzZU90aGVyRGlyZWN0bHkgPyBjb25zdF9jYXN0PFNjYWxhcio+KGFjdHVhbE90aGVyLmRhdGEoKSkgOiBzdGF0aWNfb3RoZXIuZGF0YSgpKSk7CisgICAgICAKKyAgICBpZighVXNlT3RoZXJEaXJlY3RseSkKKyAgICAgIE1hcDx0eXBlbmFtZSBfQWN0dWFsT3RoZXJUeXBlOjpQbGFpbk9iamVjdD4oYWN0dWFsT3RoZXJQdHIsIGFjdHVhbE90aGVyLnNpemUoKSkgPSBhY3R1YWxPdGhlcjsKKyAgICAKKyAgICBzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLEluZGV4LFN0b3JhZ2VPcmRlcixVcExvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUgICYmIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFPdGhlckJsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSkgJiYgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleD4KKyAgICAgICAgICA6OnJ1bihvdGhlci5zaXplKCksIG1hdC5kYXRhKCksIG1hdC5vdXRlclN0cmlkZSgpLCBhY3R1YWxPdGhlclB0ciwgYWN0dWFsQWxwaGEpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBPdGhlclR5cGUsIGludCBVcExvPgorc3RydWN0IHNlbGZhZGpvaW50X3Byb2R1Y3Rfc2VsZWN0b3I8TWF0cml4VHlwZSxPdGhlclR5cGUsVXBMbyxmYWxzZT4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgT3RoZXJUeXBlJiBvdGhlciwgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIGFscGhhKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8T3RoZXJUeXBlPiBPdGhlckJsYXNUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBPdGhlckJsYXNUcmFpdHM6OkRpcmVjdExpbmVhckFjY2Vzc1R5cGUgQWN0dWFsT3RoZXJUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8QWN0dWFsT3RoZXJUeXBlPjo6dHlwZSBfQWN0dWFsT3RoZXJUeXBlOworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxPdGhlclR5cGU+Ojp0eXBlIGFjdHVhbE90aGVyID0gT3RoZXJCbGFzVHJhaXRzOjpleHRyYWN0KG90aGVyLmRlcml2ZWQoKSk7CisKKyAgICBTY2FsYXIgYWN0dWFsQWxwaGEgPSBhbHBoYSAqIE90aGVyQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3RvcihvdGhlci5kZXJpdmVkKCkpOworCisgICAgZW51bSB7IElzUm93TWFqb3IgPSAoaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6RmxhZ3MmUm93TWFqb3JCaXQpID8gMSA6IDAgfTsKKworICAgIGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PEluZGV4LAorICAgICAgU2NhbGFyLCBfQWN0dWFsT3RoZXJUeXBlOjpGbGFncyZSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3IsICAgT3RoZXJCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUgICYmIE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICBTY2FsYXIsIF9BY3R1YWxPdGhlclR5cGU6OkZsYWdzJlJvd01ham9yQml0ID8gQ29sTWFqb3IgOiBSb3dNYWpvciwgKCFPdGhlckJsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSkgJiYgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwKKyAgICAgIE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciwgVXBMbz4KKyAgICAgIDo6cnVuKG1hdC5jb2xzKCksIGFjdHVhbE90aGVyLmNvbHMoKSwKKyAgICAgICAgICAgICZhY3R1YWxPdGhlci5jb2VmZlJlZigwLDApLCBhY3R1YWxPdGhlci5vdXRlclN0cmlkZSgpLCAmYWN0dWFsT3RoZXIuY29lZmZSZWYoMCwwKSwgYWN0dWFsT3RoZXIub3V0ZXJTdHJpZGUoKSwKKyAgICAgICAgICAgIG1hdC5kYXRhKCksIG1hdC5vdXRlclN0cmlkZSgpLCBhY3R1YWxBbHBoYSk7CisgIH0KK307CisKKy8vIGhpZ2ggbGV2ZWwgQVBJCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZFU+CitTZWxmQWRqb2ludFZpZXc8TWF0cml4VHlwZSxVcExvPiYgU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsVXBMbz4KKzo6cmFua1VwZGF0ZShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWRVPiYgdSwgU2NhbGFyIGFscGhhKQoreworICBzZWxmYWRqb2ludF9wcm9kdWN0X3NlbGVjdG9yPE1hdHJpeFR5cGUsRGVyaXZlZFUsVXBMbz46OnJ1bihfZXhwcmVzc2lvbigpLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCB1LmRlcml2ZWQoKSwgYWxwaGEpOworCisgIHJldHVybiAqdGhpczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TRUxGQURKT0lOVF9QUk9EVUNUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50UmFuazJVcGRhdGUuaCBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1NlbGZhZGpvaW50UmFuazJVcGRhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E5OGNjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvU2VsZmFkam9pbnRSYW5rMlVwZGF0ZS5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TRUxGQURKT0lOVFJBTksyVVBUQURFX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRSQU5LMlVQVEFERV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiBPcHRpbWl6ZWQgc2VsZmFkam9pbnQgbWF0cml4ICs9IGFscGhhICogdXYnICsgY29uaihhbHBoYSkqdnUnCisgKiBJdCBjb3JyZXNwb25kcyB0byB0aGUgTGV2ZWwyIHN5cjIgQkxBUyByb3V0aW5lCisgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgVVR5cGUsIHR5cGVuYW1lIFZUeXBlLCBpbnQgVXBMbz4KK3N0cnVjdCBzZWxmYWRqb2ludF9yYW5rMl91cGRhdGVfc2VsZWN0b3I7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIFVUeXBlLCB0eXBlbmFtZSBWVHlwZT4KK3N0cnVjdCBzZWxmYWRqb2ludF9yYW5rMl91cGRhdGVfc2VsZWN0b3I8U2NhbGFyLEluZGV4LFVUeXBlLFZUeXBlLExvd2VyPgoreworICBzdGF0aWMgdm9pZCBydW4oU2NhbGFyKiBtYXQsIEluZGV4IHN0cmlkZSwgY29uc3QgVVR5cGUmIHUsIGNvbnN0IFZUeXBlJiB2LCBTY2FsYXIgYWxwaGEpCisgIHsKKyAgICBjb25zdCBJbmRleCBzaXplID0gdS5zaXplKCk7CisgICAgZm9yIChJbmRleCBpPTA7IGk8c2l6ZTsgKytpKQorICAgIHsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPihtYXQrc3RyaWRlKmkraSwgc2l6ZS1pKSArPQorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmooYWxwaGEpICAqIGNvbmoodS5jb2VmZihpKSkpICogdi50YWlsKHNpemUtaSkKKyAgICAgICAgICAgICAgICAgICAgICArIChhbHBoYSAqIGNvbmoodi5jb2VmZihpKSkpICogdS50YWlsKHNpemUtaSk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBVVHlwZSwgdHlwZW5hbWUgVlR5cGU+CitzdHJ1Y3Qgc2VsZmFkam9pbnRfcmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixJbmRleCxVVHlwZSxWVHlwZSxVcHBlcj4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKFNjYWxhciogbWF0LCBJbmRleCBzdHJpZGUsIGNvbnN0IFVUeXBlJiB1LCBjb25zdCBWVHlwZSYgdiwgU2NhbGFyIGFscGhhKQorICB7CisgICAgY29uc3QgSW5kZXggc2l6ZSA9IHUuc2l6ZSgpOworICAgIGZvciAoSW5kZXggaT0wOyBpPHNpemU7ICsraSkKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPihtYXQrc3RyaWRlKmksIGkrMSkgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25qKGFscGhhKSAgKiBjb25qKHUuY29lZmYoaSkpKSAqIHYuaGVhZChpKzEpCisgICAgICAgICAgICAgICAgICAgICAgKyAoYWxwaGEgKiBjb25qKHYuY29lZmYoaSkpKSAqIHUuaGVhZChpKzEpOworICB9Cit9OworCit0ZW1wbGF0ZTxib29sIENvbmQsIHR5cGVuYW1lIFQ+IHN0cnVjdCBjb25qX2V4cHJfaWYKKyAgOiBjb25kaXRpb25hbDwhQ29uZCwgY29uc3QgVCYsCisgICAgICBDd2lzZVVuYXJ5T3A8c2NhbGFyX2Nvbmp1Z2F0ZV9vcDx0eXBlbmFtZSB0cmFpdHM8VD46OlNjYWxhcj4sVD4gPiB7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZFUsIHR5cGVuYW1lIERlcml2ZWRWPgorU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsVXBMbz4mIFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLFVwTG8+Cis6OnJhbmtVcGRhdGUoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkVT4mIHUsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZFY+JiB2LCBTY2FsYXIgYWxwaGEpCit7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmJsYXNfdHJhaXRzPERlcml2ZWRVPiBVQmxhc1RyYWl0czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBVQmxhc1RyYWl0czo6RGlyZWN0TGluZWFyQWNjZXNzVHlwZSBBY3R1YWxVVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxBY3R1YWxVVHlwZT46OnR5cGUgX0FjdHVhbFVUeXBlOworICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsVVR5cGU+Ojp0eXBlIGFjdHVhbFUgPSBVQmxhc1RyYWl0czo6ZXh0cmFjdCh1LmRlcml2ZWQoKSk7CisKKyAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc190cmFpdHM8RGVyaXZlZFY+IFZCbGFzVHJhaXRzOworICB0eXBlZGVmIHR5cGVuYW1lIFZCbGFzVHJhaXRzOjpEaXJlY3RMaW5lYXJBY2Nlc3NUeXBlIEFjdHVhbFZUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPEFjdHVhbFZUeXBlPjo6dHlwZSBfQWN0dWFsVlR5cGU7CisgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxWVHlwZT46OnR5cGUgYWN0dWFsViA9IFZCbGFzVHJhaXRzOjpleHRyYWN0KHYuZGVyaXZlZCgpKTsKKworICAvLyBJZiBNYXRyaXhUeXBlIGlzIHJvdyBtYWpvciwgdGhlbiB3ZSB1c2UgdGhlIHJvdXRpbmUgZm9yIGxvd2VyIHRyaWFuZ3VsYXIgaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgY2FzZSBhbmQKKyAgLy8gdmljZSB2ZXJzYSwgYW5kIHRha2UgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFsbCBjb2VmZmljaWVudHMgYW5kIHZlY3RvciBlbnRyaWVzLgorCisgIGVudW0geyBJc1Jvd01ham9yID0gKGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OkZsYWdzJlJvd01ham9yQml0KSA/IDEgOiAwIH07CisgIFNjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogVUJsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IodS5kZXJpdmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW50ZXJuYWw6OmNvbmooVkJsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3Iodi5kZXJpdmVkKCkpKTsKKyAgaWYgKElzUm93TWFqb3IpCisgICAgYWN0dWFsQWxwaGEgPSBpbnRlcm5hbDo6Y29uaihhY3R1YWxBbHBoYSk7CisKKyAgaW50ZXJuYWw6OnNlbGZhZGpvaW50X3JhbmsyX3VwZGF0ZV9zZWxlY3RvcjxTY2FsYXIsIEluZGV4LAorICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIGludGVybmFsOjpjb25qX2V4cHJfaWY8SXNSb3dNYWpvciBeIFVCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsX0FjdHVhbFVUeXBlPjo6dHlwZT46OnR5cGUsCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgaW50ZXJuYWw6OmNvbmpfZXhwcl9pZjxJc1Jvd01ham9yIF4gVkJsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSxfQWN0dWFsVlR5cGU+Ojp0eXBlPjo6dHlwZSwKKyAgICAoSXNSb3dNYWpvciA/IGludChVcExvPT1VcHBlciA/IExvd2VyIDogVXBwZXIpIDogVXBMbyk+CisgICAgOjpydW4oX2V4cHJlc3Npb24oKS5jb25zdF9jYXN0X2Rlcml2ZWQoKS5kYXRhKCksX2V4cHJlc3Npb24oKS5vdXRlclN0cmlkZSgpLGFjdHVhbFUsYWN0dWFsVixhY3R1YWxBbHBoYSk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NFTEZBREpPSU5UUkFOSzJVUFRBREVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeE1hdHJpeC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeE1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyY2JhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4TWF0cml4LmgKQEAgLTAsMCArMSw0MDMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9NQVRSSVhfSAorI2RlZmluZSBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9NQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgbXIsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlLCBpbnQgTW9kZT4KKy8vIHN0cnVjdCBnZW1tX3BhY2tfbGhzX3RyaWFuZ3VsYXIKKy8vIHsKKy8vICAgTWF0cml4PFNjYWxhcixtcixtciwKKy8vICAgdm9pZCBvcGVyYXRvcigpKFNjYWxhciogYmxvY2tBLCBjb25zdCBFSUdFTl9SRVNUUklDVCBTY2FsYXIqIF9saHMsIGludCBsaHNTdHJpZGUsIGludCBkZXB0aCwgaW50IHJvd3MpCisvLyAgIHsKKy8vICAgICBjb25qX2lmPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgQ29uanVnYXRlPiBjajsKKy8vICAgICBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgU3RvcmFnZU9yZGVyPiBsaHMoX2xocyxsaHNTdHJpZGUpOworLy8gICAgIGludCBjb3VudCA9IDA7CisvLyAgICAgY29uc3QgaW50IHBlZWxlZF9tYyA9IChyb3dzL21yKSptcjsKKy8vICAgICBmb3IoaW50IGk9MDsgaTxwZWVsZWRfbWM7IGkrPW1yKQorLy8gICAgIHsKKy8vICAgICAgIGZvcihpbnQgaz0wOyBrPGRlcHRoOyBrKyspCisvLyAgICAgICAgIGZvcihpbnQgdz0wOyB3PG1yOyB3KyspCisvLyAgICAgICAgICAgYmxvY2tBW2NvdW50KytdID0gY2oobGhzKGkrdywgaykpOworLy8gICAgIH0KKy8vICAgICBmb3IoaW50IGk9cGVlbGVkX21jOyBpPHJvd3M7IGkrKykKKy8vICAgICB7CisvLyAgICAgICBmb3IoaW50IGs9MDsgazxkZXB0aDsgaysrKQorLy8gICAgICAgICBibG9ja0FbY291bnQrK10gPSBjaihsaHMoaSwgaykpOworLy8gICAgIH0KKy8vICAgfQorLy8gfTsKKworLyogT3B0aW1pemVkIHRyaWFuZ3VsYXIgbWF0cml4ICogbWF0cml4IChfVFJNTSsrKSBwcm9kdWN0IGJ1aWx0IG9uIHRvcCBvZgorICogdGhlIGdlbmVyYWwgbWF0cml4IG1hdHJpeCBwcm9kdWN0LgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwKKyAgICAgICAgICBpbnQgTW9kZSwgYm9vbCBMaHNJc1RyaWFuZ3VsYXIsCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsCisgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHMsCisgICAgICAgICAgaW50IFJlc1N0b3JhZ2VPcmRlciwgaW50IFZlcnNpb24gPSBTcGVjaWFsaXplZD4KK3N0cnVjdCBwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsCisgICAgICAgICAgaW50IE1vZGUsIGJvb2wgTGhzSXNUcmlhbmd1bGFyLAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgVmVyc2lvbj4KK3N0cnVjdCBwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsSW5kZXgsTW9kZSxMaHNJc1RyaWFuZ3VsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlUmhzLFJvd01ham9yLFZlcnNpb24+Cit7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgcnVuKAorICAgIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IGRlcHRoLAorICAgIGNvbnN0IFNjYWxhciogbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyKiByaHMsIEluZGV4IHJoc1N0cmlkZSwKKyAgICBTY2FsYXIqIHJlcywgICAgICAgSW5kZXggcmVzU3RyaWRlLAorICAgIFNjYWxhciBhbHBoYSwgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZykKKyAgeworICAgIHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgSW5kZXgsCisgICAgICAoTW9kZSYoVW5pdERpYWd8WmVyb0RpYWcpKSB8ICgoTW9kZSZVcHBlcikgPyBMb3dlciA6IFVwcGVyKSwKKyAgICAgICghTGhzSXNUcmlhbmd1bGFyKSwKKyAgICAgIFJoc1N0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyBDb2xNYWpvciA6IFJvd01ham9yLAorICAgICAgQ29uanVnYXRlUmhzLAorICAgICAgTGhzU3RvcmFnZU9yZGVyPT1Sb3dNYWpvciA/IENvbE1ham9yIDogUm93TWFqb3IsCisgICAgICBDb25qdWdhdGVMaHMsCisgICAgICBDb2xNYWpvcj4KKyAgICAgIDo6cnVuKGNvbHMsIHJvd3MsIGRlcHRoLCByaHMsIHJoc1N0cmlkZSwgbGhzLCBsaHNTdHJpZGUsIHJlcywgcmVzU3RyaWRlLCBhbHBoYSwgYmxvY2tpbmcpOworICB9Cit9OworCisvLyBpbXBsZW1lbnRzIGNvbC1tYWpvciArPSBhbHBoYSAqIG9wKHRyaWFuZ3VsYXIpICogb3AoZ2VuZXJhbCkKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocywgaW50IFZlcnNpb24+CitzdHJ1Y3QgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLEluZGV4LE1vZGUsdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVSaHMsQ29sTWFqb3IsVmVyc2lvbj4KK3sKKyAgCisgIHR5cGVkZWYgZ2VicF90cmFpdHM8U2NhbGFyLFNjYWxhcj4gVHJhaXRzOworICBlbnVtIHsKKyAgICBTbWFsbFBhbmVsV2lkdGggICA9IDIgKiBFSUdFTl9QTEFJTl9FTlVNX01BWChUcmFpdHM6Om1yLFRyYWl0czo6bnIpLAorICAgIElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPT0gTG93ZXIsCisgICAgU2V0RGlhZyA9IChNb2RlJihaZXJvRGlhZ3xVbml0RGlhZykpID8gMCA6IDEKKyAgfTsKKworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oCisgICAgSW5kZXggX3Jvd3MsIEluZGV4IF9jb2xzLCBJbmRleCBfZGVwdGgsCisgICAgY29uc3QgU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsCisgICAgU2NhbGFyKiByZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsCisgICAgU2NhbGFyIGFscGhhLCBsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mIGJsb2NraW5nKQorICB7CisgICAgLy8gc3RyaXAgemVyb3MKKyAgICBJbmRleCBkaWFnU2l6ZSAgPSAoc3RkOjptaW4pKF9yb3dzLF9kZXB0aCk7CisgICAgSW5kZXggcm93cyAgICAgID0gSXNMb3dlciA/IF9yb3dzIDogZGlhZ1NpemU7CisgICAgSW5kZXggZGVwdGggICAgID0gSXNMb3dlciA/IGRpYWdTaXplIDogX2RlcHRoOworICAgIEluZGV4IGNvbHMgICAgICA9IF9jb2xzOworICAgIAorICAgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgTGhzU3RvcmFnZU9yZGVyPiBsaHMoX2xocyxsaHNTdHJpZGUpOworICAgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgUmhzU3RvcmFnZU9yZGVyPiByaHMoX3JocyxyaHNTdHJpZGUpOworCisgICAgSW5kZXgga2MgPSBibG9ja2luZy5rYygpOyAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBLIGRpcmVjdGlvbgorICAgIEluZGV4IG1jID0gKHN0ZDo6bWluKShyb3dzLGJsb2NraW5nLm1jKCkpOyAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTSBkaXJlY3Rpb24KKworICAgIHN0ZDo6c2l6ZV90IHNpemVBID0ga2MqbWM7CisgICAgc3RkOjpzaXplX3Qgc2l6ZUIgPSBrYypjb2xzOworICAgIHN0ZDo6c2l6ZV90IHNpemVXID0ga2MqVHJhaXRzOjpXb3JrU3BhY2VGYWN0b3I7CisKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBibG9ja0EsIHNpemVBLCBibG9ja2luZy5ibG9ja0EoKSk7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFNjYWxhciwgYmxvY2tCLCBzaXplQiwgYmxvY2tpbmcuYmxvY2tCKCkpOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGJsb2NrVywgc2l6ZVcsIGJsb2NraW5nLmJsb2NrVygpKTsKKworICAgIE1hdHJpeDxTY2FsYXIsU21hbGxQYW5lbFdpZHRoLFNtYWxsUGFuZWxXaWR0aCxMaHNTdG9yYWdlT3JkZXI+IHRyaWFuZ3VsYXJCdWZmZXI7CisgICAgdHJpYW5ndWxhckJ1ZmZlci5zZXRaZXJvKCk7CisgICAgaWYoKE1vZGUmWmVyb0RpYWcpPT1aZXJvRGlhZykKKyAgICAgIHRyaWFuZ3VsYXJCdWZmZXIuZGlhZ29uYWwoKS5zZXRaZXJvKCk7CisgICAgZWxzZQorICAgICAgdHJpYW5ndWxhckJ1ZmZlci5kaWFnb25hbCgpLnNldE9uZXMoKTsKKworICAgIGdlYnBfa2VybmVsPFNjYWxhciwgU2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpuciwgQ29uanVnYXRlTGhzLCBDb25qdWdhdGVSaHM+IGdlYnBfa2VybmVsOworICAgIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgTGhzU3RvcmFnZU9yZGVyPiBwYWNrX2xoczsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFRyYWl0czo6bnIsUmhzU3RvcmFnZU9yZGVyPiBwYWNrX3JoczsKKworICAgIGZvcihJbmRleCBrMj1Jc0xvd2VyID8gZGVwdGggOiAwOworICAgICAgICBJc0xvd2VyID8gazI+MCA6IGsyPGRlcHRoOworICAgICAgICBJc0xvd2VyID8gazItPWtjIDogazIrPWtjKQorICAgIHsKKyAgICAgIEluZGV4IGFjdHVhbF9rYyA9IChzdGQ6Om1pbikoSXNMb3dlciA/IGsyIDogZGVwdGgtazIsIGtjKTsKKyAgICAgIEluZGV4IGFjdHVhbF9rMiA9IElzTG93ZXIgPyBrMi1hY3R1YWxfa2MgOiBrMjsKKworICAgICAgLy8gYWxpZ24gYmxvY2tzIHdpdGggdGhlIGVuZCBvZiB0aGUgdHJpYW5ndWxhciBwYXJ0IGZvciB0cmFwZXpvaWRhbCBsaHMKKyAgICAgIGlmKCghSXNMb3dlcikmJihrMjxyb3dzKSYmKGsyK2FjdHVhbF9rYz5yb3dzKSkKKyAgICAgIHsKKyAgICAgICAgYWN0dWFsX2tjID0gcm93cy1rMjsKKyAgICAgICAgazIgPSBrMithY3R1YWxfa2Mta2M7CisgICAgICB9CisKKyAgICAgIHBhY2tfcmhzKGJsb2NrQiwgJnJocyhhY3R1YWxfazIsMCksIHJoc1N0cmlkZSwgYWN0dWFsX2tjLCBjb2xzKTsKKworICAgICAgLy8gdGhlIHNlbGVjdGVkIGxocydzIHBhbmVsIGhhcyB0byBiZSBzcGxpdCBpbiB0aHJlZSBkaWZmZXJlbnQgcGFydHM6CisgICAgICAvLyAgMSAtIHRoZSBwYXJ0IHdoaWNoIGlzIHplcm8gPT4gc2tpcCBpdAorICAgICAgLy8gIDIgLSB0aGUgZGlhZ29uYWwgYmxvY2sgPT4gc3BlY2lhbCBrZXJuZWwKKyAgICAgIC8vICAzIC0gdGhlIGRlbnNlIHBhbmVsIGJlbG93IChsb3dlciBjYXNlKSBvciBhYm92ZSAodXBwZXIgY2FzZSkgdGhlIGRpYWdvbmFsIGJsb2NrID0+IEdFUFAKKworICAgICAgLy8gdGhlIGJsb2NrIGRpYWdvbmFsLCBpZiBhbnk6CisgICAgICBpZihJc0xvd2VyIHx8IGFjdHVhbF9rMjxyb3dzKQorICAgICAgeworICAgICAgICAvLyBmb3IgZWFjaCBzbWFsbCB2ZXJ0aWNhbCBwYW5lbHMgb2YgbGhzCisgICAgICAgIGZvciAoSW5kZXggazE9MDsgazE8YWN0dWFsX2tjOyBrMSs9U21hbGxQYW5lbFdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgSW5kZXggYWN0dWFsUGFuZWxXaWR0aCA9IHN0ZDo6bWluPEluZGV4PihhY3R1YWxfa2MtazEsIFNtYWxsUGFuZWxXaWR0aCk7CisgICAgICAgICAgSW5kZXggbGVuZ3RoVGFyZ2V0ID0gSXNMb3dlciA/IGFjdHVhbF9rYy1rMS1hY3R1YWxQYW5lbFdpZHRoIDogazE7CisgICAgICAgICAgSW5kZXggc3RhcnRCbG9jayAgID0gYWN0dWFsX2syK2sxOworICAgICAgICAgIEluZGV4IGJsb2NrQk9mZnNldCA9IGsxOworCisgICAgICAgICAgLy8gPT4gR0VCUCB3aXRoIHRoZSBtaWNybyB0cmlhbmd1bGFyIGJsb2NrCisgICAgICAgICAgLy8gVGhlIHRyaWNrIGlzIHRvIHBhY2sgdGhpcyBtaWNybyBibG9jayB3aGlsZSBmaWxsaW5nIHRoZSBvcHBvc2l0ZSB0cmlhbmd1bGFyIHBhcnQgd2l0aCB6ZXJvcy4KKyAgICAgICAgICAvLyBUbyB0aGlzIGVuZCB3ZSBkbyBhbiBleHRyYSB0cmlhbmd1bGFyIGNvcHkgdG8gYSBzbWFsbCB0ZW1wb3JhcnkgYnVmZmVyCisgICAgICAgICAgZm9yIChJbmRleCBrPTA7azxhY3R1YWxQYW5lbFdpZHRoOysraykKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoU2V0RGlhZykKKyAgICAgICAgICAgICAgdHJpYW5ndWxhckJ1ZmZlci5jb2VmZlJlZihrLGspID0gbGhzKHN0YXJ0QmxvY2srayxzdGFydEJsb2NrK2spOworICAgICAgICAgICAgZm9yIChJbmRleCBpPUlzTG93ZXIgPyBrKzEgOiAwOyBJc0xvd2VyID8gaTxhY3R1YWxQYW5lbFdpZHRoIDogaTxrOyArK2kpCisgICAgICAgICAgICAgIHRyaWFuZ3VsYXJCdWZmZXIuY29lZmZSZWYoaSxrKSA9IGxocyhzdGFydEJsb2NrK2ksc3RhcnRCbG9jaytrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcGFja19saHMoYmxvY2tBLCB0cmlhbmd1bGFyQnVmZmVyLmRhdGEoKSwgdHJpYW5ndWxhckJ1ZmZlci5vdXRlclN0cmlkZSgpLCBhY3R1YWxQYW5lbFdpZHRoLCBhY3R1YWxQYW5lbFdpZHRoKTsKKworICAgICAgICAgIGdlYnBfa2VybmVsKHJlcytzdGFydEJsb2NrLCByZXNTdHJpZGUsIGJsb2NrQSwgYmxvY2tCLCBhY3R1YWxQYW5lbFdpZHRoLCBhY3R1YWxQYW5lbFdpZHRoLCBjb2xzLCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxQYW5lbFdpZHRoLCBhY3R1YWxfa2MsIDAsIGJsb2NrQk9mZnNldCwgYmxvY2tXKTsKKworICAgICAgICAgIC8vIEdFQlAgd2l0aCByZW1haW5pbmcgbWljcm8gcGFuZWwKKyAgICAgICAgICBpZiAobGVuZ3RoVGFyZ2V0PjApCisgICAgICAgICAgeworICAgICAgICAgICAgSW5kZXggc3RhcnRUYXJnZXQgID0gSXNMb3dlciA/IGFjdHVhbF9rMitrMSthY3R1YWxQYW5lbFdpZHRoIDogYWN0dWFsX2syOworCisgICAgICAgICAgICBwYWNrX2xocyhibG9ja0EsICZsaHMoc3RhcnRUYXJnZXQsc3RhcnRCbG9jayksIGxoc1N0cmlkZSwgYWN0dWFsUGFuZWxXaWR0aCwgbGVuZ3RoVGFyZ2V0KTsKKworICAgICAgICAgICAgZ2VicF9rZXJuZWwocmVzK3N0YXJ0VGFyZ2V0LCByZXNTdHJpZGUsIGJsb2NrQSwgYmxvY2tCLCBsZW5ndGhUYXJnZXQsIGFjdHVhbFBhbmVsV2lkdGgsIGNvbHMsIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUGFuZWxXaWR0aCwgYWN0dWFsX2tjLCAwLCBibG9ja0JPZmZzZXQsIGJsb2NrVyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvLyB0aGUgcGFydCBiZWxvdyAobG93ZXIgY2FzZSkgb3IgYWJvdmUgKHVwcGVyIGNhc2UpIHRoZSBkaWFnb25hbCA9PiBHRVBQCisgICAgICB7CisgICAgICAgIEluZGV4IHN0YXJ0ID0gSXNMb3dlciA/IGsyIDogMDsKKyAgICAgICAgSW5kZXggZW5kICAgPSBJc0xvd2VyID8gcm93cyA6IChzdGQ6Om1pbikoYWN0dWFsX2syLHJvd3MpOworICAgICAgICBmb3IoSW5kZXggaTI9c3RhcnQ7IGkyPGVuZDsgaTIrPW1jKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShpMittYyxlbmQpLWkyOworICAgICAgICAgIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgVHJhaXRzOjptcixUcmFpdHM6Okxoc1Byb2dyZXNzLCBMaHNTdG9yYWdlT3JkZXIsZmFsc2U+KCkKKyAgICAgICAgICAgIChibG9ja0EsICZsaHMoaTIsIGFjdHVhbF9rMiksIGxoc1N0cmlkZSwgYWN0dWFsX2tjLCBhY3R1YWxfbWMpOworCisgICAgICAgICAgZ2VicF9rZXJuZWwocmVzK2kyLCByZXNTdHJpZGUsIGJsb2NrQSwgYmxvY2tCLCBhY3R1YWxfbWMsIGFjdHVhbF9rYywgY29scywgYWxwaGEsIC0xLCAtMSwgMCwgMCwgYmxvY2tXKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfTsKKworLy8gaW1wbGVtZW50cyBjb2wtbWFqb3IgKz0gYWxwaGEgKiBvcChnZW5lcmFsKSAqIG9wKHRyaWFuZ3VsYXIpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsCisgICAgICAgICAgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsCisgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHMsIGludCBWZXJzaW9uPgorc3RydWN0IHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixJbmRleCxNb2RlLGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcixWZXJzaW9uPgoreworICB0eXBlZGVmIGdlYnBfdHJhaXRzPFNjYWxhcixTY2FsYXI+IFRyYWl0czsKKyAgZW51bSB7CisgICAgU21hbGxQYW5lbFdpZHRoICAgPSBFSUdFTl9QTEFJTl9FTlVNX01BWChUcmFpdHM6Om1yLFRyYWl0czo6bnIpLAorICAgIElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPT0gTG93ZXIsCisgICAgU2V0RGlhZyA9IChNb2RlJihaZXJvRGlhZ3xVbml0RGlhZykpID8gMCA6IDEKKyAgfTsKKworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oCisgICAgSW5kZXggX3Jvd3MsIEluZGV4IF9jb2xzLCBJbmRleCBfZGVwdGgsCisgICAgY29uc3QgU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsCisgICAgY29uc3QgU2NhbGFyKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsCisgICAgU2NhbGFyKiByZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsCisgICAgU2NhbGFyIGFscGhhLCBsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mIGJsb2NraW5nKQorICB7CisgICAgLy8gc3RyaXAgemVyb3MKKyAgICBJbmRleCBkaWFnU2l6ZSAgPSAoc3RkOjptaW4pKF9jb2xzLF9kZXB0aCk7CisgICAgSW5kZXggcm93cyAgICAgID0gX3Jvd3M7CisgICAgSW5kZXggZGVwdGggICAgID0gSXNMb3dlciA/IF9kZXB0aCA6IGRpYWdTaXplOworICAgIEluZGV4IGNvbHMgICAgICA9IElzTG93ZXIgPyBkaWFnU2l6ZSA6IF9jb2xzOworICAgIAorICAgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgTGhzU3RvcmFnZU9yZGVyPiBsaHMoX2xocyxsaHNTdHJpZGUpOworICAgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgUmhzU3RvcmFnZU9yZGVyPiByaHMoX3JocyxyaHNTdHJpZGUpOworCisgICAgSW5kZXgga2MgPSBibG9ja2luZy5rYygpOyAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBLIGRpcmVjdGlvbgorICAgIEluZGV4IG1jID0gKHN0ZDo6bWluKShyb3dzLGJsb2NraW5nLm1jKCkpOyAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTSBkaXJlY3Rpb24KKworICAgIHN0ZDo6c2l6ZV90IHNpemVBID0ga2MqbWM7CisgICAgc3RkOjpzaXplX3Qgc2l6ZUIgPSBrYypjb2xzOworICAgIHN0ZDo6c2l6ZV90IHNpemVXID0ga2MqVHJhaXRzOjpXb3JrU3BhY2VGYWN0b3I7CisKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBibG9ja0EsIHNpemVBLCBibG9ja2luZy5ibG9ja0EoKSk7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFNjYWxhciwgYmxvY2tCLCBzaXplQiwgYmxvY2tpbmcuYmxvY2tCKCkpOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGJsb2NrVywgc2l6ZVcsIGJsb2NraW5nLmJsb2NrVygpKTsKKworICAgIE1hdHJpeDxTY2FsYXIsU21hbGxQYW5lbFdpZHRoLFNtYWxsUGFuZWxXaWR0aCxSaHNTdG9yYWdlT3JkZXI+IHRyaWFuZ3VsYXJCdWZmZXI7CisgICAgdHJpYW5ndWxhckJ1ZmZlci5zZXRaZXJvKCk7CisgICAgaWYoKE1vZGUmWmVyb0RpYWcpPT1aZXJvRGlhZykKKyAgICAgIHRyaWFuZ3VsYXJCdWZmZXIuZGlhZ29uYWwoKS5zZXRaZXJvKCk7CisgICAgZWxzZQorICAgICAgdHJpYW5ndWxhckJ1ZmZlci5kaWFnb25hbCgpLnNldE9uZXMoKTsKKworICAgIGdlYnBfa2VybmVsPFNjYWxhciwgU2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpuciwgQ29uanVnYXRlTGhzLCBDb25qdWdhdGVSaHM+IGdlYnBfa2VybmVsOworICAgIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgTGhzU3RvcmFnZU9yZGVyPiBwYWNrX2xoczsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFRyYWl0czo6bnIsUmhzU3RvcmFnZU9yZGVyPiBwYWNrX3JoczsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFRyYWl0czo6bnIsUmhzU3RvcmFnZU9yZGVyLGZhbHNlLHRydWU+IHBhY2tfcmhzX3BhbmVsOworCisgICAgZm9yKEluZGV4IGsyPUlzTG93ZXIgPyAwIDogZGVwdGg7CisgICAgICAgIElzTG93ZXIgPyBrMjxkZXB0aCAgOiBrMj4wOworICAgICAgICBJc0xvd2VyID8gazIrPWtjICAgOiBrMi09a2MpCisgICAgeworICAgICAgSW5kZXggYWN0dWFsX2tjID0gKHN0ZDo6bWluKShJc0xvd2VyID8gZGVwdGgtazIgOiBrMiwga2MpOworICAgICAgSW5kZXggYWN0dWFsX2syID0gSXNMb3dlciA/IGsyIDogazItYWN0dWFsX2tjOworCisgICAgICAvLyBhbGlnbiBibG9ja3Mgd2l0aCB0aGUgZW5kIG9mIHRoZSB0cmlhbmd1bGFyIHBhcnQgZm9yIHRyYXBlem9pZGFsIHJocworICAgICAgaWYoSXNMb3dlciAmJiAoazI8Y29scykgJiYgKGFjdHVhbF9rMithY3R1YWxfa2M+Y29scykpCisgICAgICB7CisgICAgICAgIGFjdHVhbF9rYyA9IGNvbHMtazI7CisgICAgICAgIGsyID0gYWN0dWFsX2syICsgYWN0dWFsX2tjIC0ga2M7CisgICAgICB9CisKKyAgICAgIC8vIHJlbWFpbmluZyBzaXplCisgICAgICBJbmRleCBycyA9IElzTG93ZXIgPyAoc3RkOjptaW4pKGNvbHMsYWN0dWFsX2syKSA6IGNvbHMgLSBrMjsKKyAgICAgIC8vIHNpemUgb2YgdGhlIHRyaWFuZ3VsYXIgcGFydAorICAgICAgSW5kZXggdHMgPSAoSXNMb3dlciAmJiBhY3R1YWxfazI+PWNvbHMpID8gMCA6IGFjdHVhbF9rYzsKKworICAgICAgU2NhbGFyKiBnZWIgPSBibG9ja0IrdHMqdHM7CisKKyAgICAgIHBhY2tfcmhzKGdlYiwgJnJocyhhY3R1YWxfazIsSXNMb3dlciA/IDAgOiBrMiksIHJoc1N0cmlkZSwgYWN0dWFsX2tjLCBycyk7CisKKyAgICAgIC8vIHBhY2sgdGhlIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgcmhzIHBhZGRpbmcgdGhlIHVucm9sbGVkIGJsb2NrcyB3aXRoIHplcm9zCisgICAgICBpZih0cz4wKQorICAgICAgeworICAgICAgICBmb3IgKEluZGV4IGoyPTA7IGoyPGFjdHVhbF9rYzsgajIrPVNtYWxsUGFuZWxXaWR0aCkKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSBzdGQ6Om1pbjxJbmRleD4oYWN0dWFsX2tjLWoyLCBTbWFsbFBhbmVsV2lkdGgpOworICAgICAgICAgIEluZGV4IGFjdHVhbF9qMiA9IGFjdHVhbF9rMiArIGoyOworICAgICAgICAgIEluZGV4IHBhbmVsT2Zmc2V0ID0gSXNMb3dlciA/IGoyK2FjdHVhbFBhbmVsV2lkdGggOiAwOworICAgICAgICAgIEluZGV4IHBhbmVsTGVuZ3RoID0gSXNMb3dlciA/IGFjdHVhbF9rYy1qMi1hY3R1YWxQYW5lbFdpZHRoIDogajI7CisgICAgICAgICAgLy8gZ2VuZXJhbCBwYXJ0CisgICAgICAgICAgcGFja19yaHNfcGFuZWwoYmxvY2tCK2oyKmFjdHVhbF9rYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcmhzKGFjdHVhbF9rMitwYW5lbE9mZnNldCwgYWN0dWFsX2oyKSwgcmhzU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsTGVuZ3RoLCBhY3R1YWxQYW5lbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9rYywgcGFuZWxPZmZzZXQpOworCisgICAgICAgICAgLy8gYXBwZW5kIHRoZSB0cmlhbmd1bGFyIHBhcnQgdmlhIGEgdGVtcG9yYXJ5IGJ1ZmZlcgorICAgICAgICAgIGZvciAoSW5kZXggaj0wO2o8YWN0dWFsUGFuZWxXaWR0aDsrK2opCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKFNldERpYWcpCisgICAgICAgICAgICAgIHRyaWFuZ3VsYXJCdWZmZXIuY29lZmZSZWYoaixqKSA9IHJocyhhY3R1YWxfajIraixhY3R1YWxfajIraik7CisgICAgICAgICAgICBmb3IgKEluZGV4IGs9SXNMb3dlciA/IGorMSA6IDA7IElzTG93ZXIgPyBrPGFjdHVhbFBhbmVsV2lkdGggOiBrPGo7ICsraykKKyAgICAgICAgICAgICAgdHJpYW5ndWxhckJ1ZmZlci5jb2VmZlJlZihrLGopID0gcmhzKGFjdHVhbF9qMitrLGFjdHVhbF9qMitqKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwYWNrX3Joc19wYW5lbChibG9ja0IrajIqYWN0dWFsX2tjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ3VsYXJCdWZmZXIuZGF0YSgpLCB0cmlhbmd1bGFyQnVmZmVyLm91dGVyU3RyaWRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUGFuZWxXaWR0aCwgYWN0dWFsUGFuZWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfa2MsIGoyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKEluZGV4IGkyPTA7IGkyPHJvd3M7IGkyKz1tYykKKyAgICAgIHsKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShtYyxyb3dzLWkyKTsKKyAgICAgICAgcGFja19saHMoYmxvY2tBLCAmbGhzKGkyLCBhY3R1YWxfazIpLCBsaHNTdHJpZGUsIGFjdHVhbF9rYywgYWN0dWFsX21jKTsKKworICAgICAgICAvLyB0cmlhbmd1bGFyIGtlcm5lbAorICAgICAgICBpZih0cz4wKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChJbmRleCBqMj0wOyBqMjxhY3R1YWxfa2M7IGoyKz1TbWFsbFBhbmVsV2lkdGgpCisgICAgICAgICAgeworICAgICAgICAgICAgSW5kZXggYWN0dWFsUGFuZWxXaWR0aCA9IHN0ZDo6bWluPEluZGV4PihhY3R1YWxfa2MtajIsIFNtYWxsUGFuZWxXaWR0aCk7CisgICAgICAgICAgICBJbmRleCBwYW5lbExlbmd0aCA9IElzTG93ZXIgPyBhY3R1YWxfa2MtajIgOiBqMithY3R1YWxQYW5lbFdpZHRoOworICAgICAgICAgICAgSW5kZXggYmxvY2tPZmZzZXQgPSBJc0xvd2VyID8gajIgOiAwOworCisgICAgICAgICAgICBnZWJwX2tlcm5lbChyZXMraTIrKGFjdHVhbF9rMitqMikqcmVzU3RyaWRlLCByZXNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0EsIGJsb2NrQitqMiphY3R1YWxfa2MsCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfbWMsIHBhbmVsTGVuZ3RoLCBhY3R1YWxQYW5lbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfa2MsIGFjdHVhbF9rYywgIC8vIHN0cmlkZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrT2Zmc2V0LCBibG9ja09mZnNldCwvLyBvZmZzZXRzCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1cpOyAvLyB3b3Jrc3BhY2UKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ2VicF9rZXJuZWwocmVzK2kyKyhJc0xvd2VyID8gMCA6IGsyKSpyZXNTdHJpZGUsIHJlc1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tBLCBnZWIsIGFjdHVhbF9tYywgYWN0dWFsX2tjLCBycywKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgMCwgMCwgYmxvY2tXKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogV3JhcHBlciB0byBwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTxpbnQgTW9kZSwgYm9vbCBMaHNJc1RyaWFuZ3VsYXIsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czxUcmlhbmd1bGFyUHJvZHVjdDxNb2RlLExoc0lzVHJpYW5ndWxhcixMaHMsZmFsc2UsUmhzLGZhbHNlPiA+CisgIDogdHJhaXRzPFByb2R1Y3RCYXNlPFRyaWFuZ3VsYXJQcm9kdWN0PE1vZGUsTGhzSXNUcmlhbmd1bGFyLExocyxmYWxzZSxSaHMsZmFsc2U+LCBMaHMsIFJocz4gPgore307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTxpbnQgTW9kZSwgYm9vbCBMaHNJc1RyaWFuZ3VsYXIsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IFRyaWFuZ3VsYXJQcm9kdWN0PE1vZGUsTGhzSXNUcmlhbmd1bGFyLExocyxmYWxzZSxSaHMsZmFsc2U+CisgIDogcHVibGljIFByb2R1Y3RCYXNlPFRyaWFuZ3VsYXJQcm9kdWN0PE1vZGUsTGhzSXNUcmlhbmd1bGFyLExocyxmYWxzZSxSaHMsZmFsc2U+LCBMaHMsIFJocyA+Cit7CisgIEVJR0VOX1BST0RVQ1RfUFVCTElDX0lOVEVSRkFDRShUcmlhbmd1bGFyUHJvZHVjdCkKKworICBUcmlhbmd1bGFyUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpIDogQmFzZShsaHMscmhzKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkc3QsIFNjYWxhciBhbHBoYSkgY29uc3QKKyAgeworICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxBY3R1YWxMaHNUeXBlPjo6dHlwZSBsaHMgPSBMaHNCbGFzVHJhaXRzOjpleHRyYWN0KG1fbGhzKTsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsUmhzVHlwZT46OnR5cGUgcmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChtX3Jocyk7CisKKyAgICBTY2FsYXIgYWN0dWFsQWxwaGEgPSBhbHBoYSAqIExoc0JsYXNUcmFpdHM6OmV4dHJhY3RTY2FsYXJGYWN0b3IobV9saHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSaHNCbGFzVHJhaXRzOjpleHRyYWN0U2NhbGFyRmFjdG9yKG1fcmhzKTsKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8KERlc3Q6OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsU2NhbGFyLFNjYWxhciwKKyAgICAgICAgICAgICAgTGhzOjpNYXhSb3dzQXRDb21waWxlVGltZSwgUmhzOjpNYXhDb2xzQXRDb21waWxlVGltZSwgTGhzOjpNYXhDb2xzQXRDb21waWxlVGltZSw0PiBCbG9ja2luZ1R5cGU7CisKKyAgICBlbnVtIHsgSXNMb3dlciA9IChNb2RlJkxvd2VyKSA9PSBMb3dlciB9OworICAgIEluZGV4IHN0cmlwZWRSb3dzICA9ICgoIUxoc0lzVHJpYW5ndWxhcikgfHwgKElzTG93ZXIpKSAgPyBsaHMucm93cygpIDogKHN0ZDo6bWluKShsaHMucm93cygpLGxocy5jb2xzKCkpOworICAgIEluZGV4IHN0cmlwZWRDb2xzICA9ICgoTGhzSXNUcmlhbmd1bGFyKSAgfHwgKCFJc0xvd2VyKSkgPyByaHMuY29scygpIDogKHN0ZDo6bWluKShyaHMuY29scygpLHJocy5yb3dzKCkpOworICAgIEluZGV4IHN0cmlwZWREZXB0aCA9IExoc0lzVHJpYW5ndWxhciA/ICgoIUlzTG93ZXIpID8gbGhzLmNvbHMoKSA6IChzdGQ6Om1pbikobGhzLmNvbHMoKSxsaHMucm93cygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKElzTG93ZXIpICA/IHJocy5yb3dzKCkgOiAoc3RkOjptaW4pKHJocy5yb3dzKCkscmhzLmNvbHMoKSkpOworCisgICAgQmxvY2tpbmdUeXBlIGJsb2NraW5nKHN0cmlwZWRSb3dzLCBzdHJpcGVkQ29scywgc3RyaXBlZERlcHRoKTsKKworICAgIGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsIEluZGV4LAorICAgICAgTW9kZSwgTGhzSXNUcmlhbmd1bGFyLAorICAgICAgKGludGVybmFsOjp0cmFpdHM8X0FjdHVhbExoc1R5cGU+OjpGbGFncyZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yLCBMaHNCbGFzVHJhaXRzOjpOZWVkVG9Db25qdWdhdGUsCisgICAgICAoaW50ZXJuYWw6OnRyYWl0czxfQWN0dWFsUmhzVHlwZT46OkZsYWdzJlJvd01ham9yQml0KSA/IFJvd01ham9yIDogQ29sTWFqb3IsIFJoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSwKKyAgICAgIChpbnRlcm5hbDo6dHJhaXRzPERlc3QgICAgICAgICAgPjo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvcj4KKyAgICAgIDo6cnVuKAorICAgICAgICBzdHJpcGVkUm93cywgc3RyaXBlZENvbHMsIHN0cmlwZWREZXB0aCwgICAvLyBzaXplcworICAgICAgICAmbGhzLmNvZWZmUmVmKDAsMCksICAgIGxocy5vdXRlclN0cmlkZSgpLCAvLyBsaHMgaW5mbworICAgICAgICAmcmhzLmNvZWZmUmVmKDAsMCksICAgIHJocy5vdXRlclN0cmlkZSgpLCAvLyByaHMgaW5mbworICAgICAgICAmZHN0LmNvZWZmUmVmKDAsMCksIGRzdC5vdXRlclN0cmlkZSgpLCAgICAvLyByZXN1bHQgaW5mbworICAgICAgICBhY3R1YWxBbHBoYSwgYmxvY2tpbmcKKyAgICAgICk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJJQU5HVUxBUl9NQVRSSVhfTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJNYXRyaXhNYXRyaXhfTUtMLmggYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4TWF0cml4X01LTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzNkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4TWF0cml4X01LTC5oCkBAIC0wLDAgKzEsMzA5IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gSW50ZWwoUikgTUtMCisgKiAgIFRyaWFuZ3VsYXIgbWF0cml4ICogbWF0cml4IHByb2R1Y3QgZnVuY3Rpb25hbGl0eSBiYXNlZCBvbiA/VFJNTS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9NQVRSSVhfTUtMX0gKKyNkZWZpbmUgRUlHRU5fVFJJQU5HVUxBUl9NQVRSSVhfTUFUUklYX01LTF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LAorICAgICAgICAgIGludCBNb2RlLCBib29sIExoc0lzVHJpYW5ndWxhciwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywKKyAgICAgICAgICBpbnQgUmhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZVJocywKKyAgICAgICAgICBpbnQgUmVzU3RvcmFnZU9yZGVyPgorc3RydWN0IHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4X3RybW0gOgorICAgICAgIHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixJbmRleCxNb2RlLAorICAgICAgICAgIExoc0lzVHJpYW5ndWxhcixMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLAorICAgICAgICAgIFJoc1N0b3JhZ2VPcmRlciwgQ29uanVnYXRlUmhzLCBSZXNTdG9yYWdlT3JkZXIsIEJ1aWx0SW4+IHt9OworCisKKy8vIHRyeSB0byBnbyB0byBCTEFTIHNwZWNpYWxpemF0aW9uCisjZGVmaW5lIEVJR0VOX01LTF9UUk1NX1NQRUNJQUxJWkUoU2NhbGFyLCBMaHNJc1RyaWFuZ3VsYXIpIFwKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIFwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgXAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3QgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLEluZGV4LCBNb2RlLCBMaHNJc1RyaWFuZ3VsYXIsIFwKKyAgICAgICAgICAgTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocywgUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcixTcGVjaWFsaXplZD4geyBcCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oSW5kZXggX3Jvd3MsIEluZGV4IF9jb2xzLCBJbmRleCBfZGVwdGgsIGNvbnN0IFNjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLFwKKyAgICBjb25zdCBTY2FsYXIqIF9yaHMsIEluZGV4IHJoc1N0cmlkZSwgU2NhbGFyKiByZXMsIEluZGV4IHJlc1N0cmlkZSwgU2NhbGFyIGFscGhhKSB7IFwKKyAgICAgIHByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4X3RybW08U2NhbGFyLEluZGV4LE1vZGUsIFwKKyAgICAgICAgTGhzSXNUcmlhbmd1bGFyLExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsIFwKKyAgICAgICAgUmhzU3RvcmFnZU9yZGVyLCBDb25qdWdhdGVSaHMsIENvbE1ham9yPjo6cnVuKCBcCisgICAgICAgIF9yb3dzLCBfY29scywgX2RlcHRoLCBfbGhzLCBsaHNTdHJpZGUsIF9yaHMsIHJoc1N0cmlkZSwgcmVzLCByZXNTdHJpZGUsIGFscGhhKTsgXAorICB9IFwKK307CisKK0VJR0VOX01LTF9UUk1NX1NQRUNJQUxJWkUoZG91YmxlLCB0cnVlKQorRUlHRU5fTUtMX1RSTU1fU1BFQ0lBTElaRShkb3VibGUsIGZhbHNlKQorRUlHRU5fTUtMX1RSTU1fU1BFQ0lBTElaRShkY29tcGxleCwgdHJ1ZSkKK0VJR0VOX01LTF9UUk1NX1NQRUNJQUxJWkUoZGNvbXBsZXgsIGZhbHNlKQorRUlHRU5fTUtMX1RSTU1fU1BFQ0lBTElaRShmbG9hdCwgdHJ1ZSkKK0VJR0VOX01LTF9UUk1NX1NQRUNJQUxJWkUoZmxvYXQsIGZhbHNlKQorRUlHRU5fTUtMX1RSTU1fU1BFQ0lBTElaRShzY29tcGxleCwgdHJ1ZSkKK0VJR0VOX01LTF9UUk1NX1NQRUNJQUxJWkUoc2NvbXBsZXgsIGZhbHNlKQorCisvLyBpbXBsZW1lbnRzIGNvbC1tYWpvciArPSBhbHBoYSAqIG9wKHRyaWFuZ3VsYXIpICogb3AoZ2VuZXJhbCkKKyNkZWZpbmUgRUlHRU5fTUtMX1RSTU1fTChFSUdUWVBFLCBNS0xUWVBFLCBFSUdQUkVGSVgsIE1LTFBSRUZJWCkgXAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgXAorICAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCBcCisgICAgICAgICAgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHM+IFwKK3N0cnVjdCBwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeF90cm1tPEVJR1RZUEUsSW5kZXgsTW9kZSx0cnVlLCBcCisgICAgICAgICBMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLFJoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVSaHMsQ29sTWFqb3I+IFwKK3sgXAorICBlbnVtIHsgXAorICAgIElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPT0gTG93ZXIsIFwKKyAgICBTZXREaWFnID0gKE1vZGUmKFplcm9EaWFnfFVuaXREaWFnKSkgPyAwIDogMSwgXAorICAgIElzVW5pdERpYWcgID0gKE1vZGUmVW5pdERpYWcpID8gMSA6IDAsIFwKKyAgICBJc1plcm9EaWFnICA9IChNb2RlJlplcm9EaWFnKSA/IDEgOiAwLCBcCisgICAgTG93VXAgPSBJc0xvd2VyID8gTG93ZXIgOiBVcHBlciwgXAorICAgIGNvbmpBID0gKChMaHNTdG9yYWdlT3JkZXI9PUNvbE1ham9yKSAmJiBDb25qdWdhdGVMaHMpID8gMSA6IDAgXAorICB9OyBcCitcCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1biggXAorICAgIEluZGV4IF9yb3dzLCBJbmRleCBfY29scywgSW5kZXggX2RlcHRoLCBcCisgICAgY29uc3QgRUlHVFlQRSogX2xocywgSW5kZXggbGhzU3RyaWRlLCBcCisgICAgY29uc3QgRUlHVFlQRSogX3JocywgSW5kZXggcmhzU3RyaWRlLCBcCisgICAgRUlHVFlQRSogcmVzLCAgICAgICAgSW5kZXggcmVzU3RyaWRlLCBcCisgICAgRUlHVFlQRSBhbHBoYSkgXAorICB7IFwKKyAgIEluZGV4IGRpYWdTaXplICA9IChzdGQ6Om1pbikoX3Jvd3MsX2RlcHRoKTsgXAorICAgSW5kZXggcm93cyAgICAgID0gSXNMb3dlciA/IF9yb3dzIDogZGlhZ1NpemU7IFwKKyAgIEluZGV4IGRlcHRoICAgICA9IElzTG93ZXIgPyBkaWFnU2l6ZSA6IF9kZXB0aDsgXAorICAgSW5kZXggY29scyAgICAgID0gX2NvbHM7IFwKK1wKKyAgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIExoc1N0b3JhZ2VPcmRlcj4gTWF0cml4TGhzOyBcCisgICB0eXBlZGVmIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBSaHNTdG9yYWdlT3JkZXI+IE1hdHJpeFJoczsgXAorXAorLyogTm9uLXNxdWFyZSBjYXNlIC0gZG9lc24ndCBmaXQgdG8gTUtMID9UUk1NLiBGYWxsIHRvIGRlZmF1bHQgdHJpYW5ndWxhciBwcm9kdWN0IG9yIGNhbGwgTUtMID9HRU1NKi8gXAorICAgaWYgKHJvd3MgIT0gZGVwdGgpIHsgXAorXAorICAgICBpbnQgbnRociA9IG1rbF9kb21haW5fZ2V0X21heF90aHJlYWRzKE1LTF9CTEFTKTsgXAorXAorICAgICBpZiAoKChudGhyPT0xKSAmJiAoKChzdGQ6Om1heCkocm93cyxkZXB0aCktZGlhZ1NpemUpLyhkb3VibGUpZGlhZ1NpemUgPCAwLjUpKSkgeyBcCisgICAgIC8qIE1vc3QgbGlrZWx5IG5vIGJlbmVmaXQgdG8gY2FsbCBUUk1NIG9yIEdFTU0gZnJvbSBNS0wqLyBcCisgICAgICAgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8RUlHVFlQRSxJbmRleCxNb2RlLHRydWUsIFwKKyAgICAgICBMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLCBSaHNTdG9yYWdlT3JkZXIsIENvbmp1Z2F0ZVJocywgQ29sTWFqb3IsIEJ1aWx0SW4+OjpydW4oIFwKKyAgICAgICAgICAgX3Jvd3MsIF9jb2xzLCBfZGVwdGgsIF9saHMsIGxoc1N0cmlkZSwgX3JocywgcmhzU3RyaWRlLCByZXMsIHJlc1N0cmlkZSwgYWxwaGEpOyBcCisgICAgIC8qc3RkOjpjb3V0IDw8ICJUUk1NX0w6IEEgaXMgbm90IHNxdWFyZSEgR28gdG8gRWlnZW4gVFJNTSBpbXBsZW1lbnRhdGlvbiFcbiI7Ki8gXAorICAgICB9IGVsc2UgeyBcCisgICAgIC8qIE1ha2Ugc2Vuc2UgdG8gY2FsbCBHRU1NICovIFwKKyAgICAgICBNYXA8Y29uc3QgTWF0cml4TGhzLCAwLCBPdXRlclN0cmlkZTw+ID4gbGhzTWFwKF9saHMscm93cyxkZXB0aCxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOyBcCisgICAgICAgTWF0cml4TGhzIGFhX3RtcD1saHNNYXAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKTsgXAorICAgICAgIE1LTF9JTlQgYVN0cmlkZSA9IGFhX3RtcC5vdXRlclN0cmlkZSgpOyBcCisgICAgICAgZ2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixFSUdUWVBFLEVJR1RZUEUsRHluYW1pYyxEeW5hbWljLER5bmFtaWM+IGJsb2NraW5nKF9yb3dzLF9jb2xzLF9kZXB0aCk7IFwKKyAgICAgICBnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxJbmRleCxFSUdUWVBFLExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsRUlHVFlQRSxSaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlUmhzLENvbE1ham9yPjo6cnVuKCBcCisgICAgICAgcm93cywgY29scywgZGVwdGgsIGFhX3RtcC5kYXRhKCksIGFTdHJpZGUsIF9yaHMsIHJoc1N0cmlkZSwgcmVzLCByZXNTdHJpZGUsIGFscGhhLCBibG9ja2luZywgMCk7IFwKK1wKKyAgICAgLypzdGQ6OmNvdXQgPDwgIlRSTU1fTDogQSBpcyBub3Qgc3F1YXJlISBHbyB0byBNS0wgR0VNTSBpbXBsZW1lbnRhdGlvbiEgIiA8PCBudGhyPDwiIFxuIjsqLyBcCisgICAgIH0gXAorICAgICByZXR1cm47IFwKKyAgIH0gXAorICAgY2hhciBzaWRlID0gJ0wnLCB0cmFuc2EsIHVwbG8sIGRpYWcgPSAnTic7IFwKKyAgIEVJR1RZUEUgKmI7IFwKKyAgIGNvbnN0IEVJR1RZUEUgKmE7IFwKKyAgIE1LTF9JTlQgbSwgbiwgbGRhLCBsZGI7IFwKKyAgIE1LTFRZUEUgYWxwaGFfOyBcCitcCisvKiBTZXQgYWxwaGFfKi8gXAorICAgYXNzaWduX3NjYWxhcl9laWcybWtsPE1LTFRZUEUsIEVJR1RZUEU+KGFscGhhXywgYWxwaGEpOyBcCitcCisvKiBTZXQgbSwgbiAqLyBcCisgICBtID0gKE1LTF9JTlQpZGlhZ1NpemU7IFwKKyAgIG4gPSAoTUtMX0lOVCljb2xzOyBcCitcCisvKiBTZXQgdHJhbnMgKi8gXAorICAgdHJhbnNhID0gKExoc1N0b3JhZ2VPcmRlcj09Um93TWFqb3IpID8gKChDb25qdWdhdGVMaHMpID8gJ0MnIDogJ1QnKSA6ICdOJzsgXAorXAorLyogU2V0IGIsIGxkYiAqLyBcCisgICBNYXA8Y29uc3QgTWF0cml4UmhzLCAwLCBPdXRlclN0cmlkZTw+ID4gcmhzKF9yaHMsZGVwdGgsY29scyxPdXRlclN0cmlkZTw+KHJoc1N0cmlkZSkpOyBcCisgICBNYXRyaXhYIyNFSUdQUkVGSVggYl90bXA7IFwKK1wKKyAgIGlmIChDb25qdWdhdGVSaHMpIGJfdG1wID0gcmhzLmNvbmp1Z2F0ZSgpOyBlbHNlIGJfdG1wID0gcmhzOyBcCisgICBiID0gYl90bXAuZGF0YSgpOyBcCisgICBsZGIgPSBiX3RtcC5vdXRlclN0cmlkZSgpOyBcCitcCisvKiBTZXQgdXBsbyAqLyBcCisgICB1cGxvID0gSXNMb3dlciA/ICdMJyA6ICdVJzsgXAorICAgaWYgKExoc1N0b3JhZ2VPcmRlcj09Um93TWFqb3IpIHVwbG8gPSAodXBsbyA9PSAnTCcpID8gJ1UnIDogJ0wnOyBcCisvKiBTZXQgYSwgbGRhICovIFwKKyAgIE1hcDxjb25zdCBNYXRyaXhMaHMsIDAsIE91dGVyU3RyaWRlPD4gPiBsaHMoX2xocyxyb3dzLGRlcHRoLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7IFwKKyAgIE1hdHJpeExocyBhX3RtcDsgXAorXAorICAgaWYgKChjb25qQSE9MCkgfHwgKFNldERpYWc9PTApKSB7IFwKKyAgICAgaWYgKGNvbmpBKSBhX3RtcCA9IGxocy5jb25qdWdhdGUoKTsgZWxzZSBhX3RtcCA9IGxoczsgXAorICAgICBpZiAoSXNaZXJvRGlhZykgXAorICAgICAgIGFfdG1wLmRpYWdvbmFsKCkuc2V0WmVybygpOyBcCisgICAgIGVsc2UgaWYgKElzVW5pdERpYWcpIFwKKyAgICAgICBhX3RtcC5kaWFnb25hbCgpLnNldE9uZXMoKTtcCisgICAgIGEgPSBhX3RtcC5kYXRhKCk7IFwKKyAgICAgbGRhID0gYV90bXAub3V0ZXJTdHJpZGUoKTsgXAorICAgfSBlbHNlIHsgXAorICAgICBhID0gX2xoczsgXAorICAgICBsZGEgPSBsaHNTdHJpZGU7IFwKKyAgIH0gXAorICAgLypzdGQ6OmNvdXQgPDwgIlRSTU1fTDogQSBpcyBzcXVhcmUhIEdvIHRvIE1LTCBUUk1NIGltcGxlbWVudGF0aW9uISBcbiI7Ki8gXAorLyogY2FsbCA/dHJtbSovIFwKKyAgIE1LTFBSRUZJWCMjdHJtbSgmc2lkZSwgJnVwbG8sICZ0cmFuc2EsICZkaWFnLCAmbSwgJm4sICZhbHBoYV8sIChjb25zdCBNS0xUWVBFKilhLCAmbGRhLCAoTUtMVFlQRSopYiwgJmxkYik7IFwKK1wKKy8qIEFkZCBvcChhX3RyaWFuZ3VsYXIpKmIgaW50byByZXMqLyBcCisgICBNYXA8TWF0cml4WCMjRUlHUFJFRklYLCAwLCBPdXRlclN0cmlkZTw+ID4gcmVzX3RtcChyZXMscm93cyxjb2xzLE91dGVyU3RyaWRlPD4ocmVzU3RyaWRlKSk7IFwKKyAgIHJlc190bXA9cmVzX3RtcCtiX3RtcDsgXAorICB9IFwKK307CisKK0VJR0VOX01LTF9UUk1NX0woZG91YmxlLCBkb3VibGUsIGQsIGQpCitFSUdFTl9NS0xfVFJNTV9MKGRjb21wbGV4LCBNS0xfQ29tcGxleDE2LCBjZCwgeikKK0VJR0VOX01LTF9UUk1NX0woZmxvYXQsIGZsb2F0LCBmLCBzKQorRUlHRU5fTUtMX1RSTU1fTChzY29tcGxleCwgTUtMX0NvbXBsZXg4LCBjZiwgYykKKworLy8gaW1wbGVtZW50cyBjb2wtbWFqb3IgKz0gYWxwaGEgKiBvcChnZW5lcmFsKSAqIG9wKHRyaWFuZ3VsYXIpCisjZGVmaW5lIEVJR0VOX01LTF9UUk1NX1IoRUlHVFlQRSwgTUtMVFlQRSwgRUlHUFJFRklYLCBNS0xQUkVGSVgpIFwKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIFwKKyAgICAgICAgICBpbnQgTGhzU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZUxocywgXAorICAgICAgICAgIGludCBSaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlUmhzPiBcCitzdHJ1Y3QgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXhfdHJtbTxFSUdUWVBFLEluZGV4LE1vZGUsZmFsc2UsIFwKKyAgICAgICAgIExoc1N0b3JhZ2VPcmRlcixDb25qdWdhdGVMaHMsUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj4gXAoreyBcCisgIGVudW0geyBcCisgICAgSXNMb3dlciA9IChNb2RlJkxvd2VyKSA9PSBMb3dlciwgXAorICAgIFNldERpYWcgPSAoTW9kZSYoWmVyb0RpYWd8VW5pdERpYWcpKSA/IDAgOiAxLCBcCisgICAgSXNVbml0RGlhZyAgPSAoTW9kZSZVbml0RGlhZykgPyAxIDogMCwgXAorICAgIElzWmVyb0RpYWcgID0gKE1vZGUmWmVyb0RpYWcpID8gMSA6IDAsIFwKKyAgICBMb3dVcCA9IElzTG93ZXIgPyBMb3dlciA6IFVwcGVyLCBcCisgICAgY29uakEgPSAoKFJoc1N0b3JhZ2VPcmRlcj09Q29sTWFqb3IpICYmIENvbmp1Z2F0ZVJocykgPyAxIDogMCBcCisgIH07IFwKK1wKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKCBcCisgICAgSW5kZXggX3Jvd3MsIEluZGV4IF9jb2xzLCBJbmRleCBfZGVwdGgsIFwKKyAgICBjb25zdCBFSUdUWVBFKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgICBjb25zdCBFSUdUWVBFKiBfcmhzLCBJbmRleCByaHNTdHJpZGUsIFwKKyAgICBFSUdUWVBFKiByZXMsICAgICAgICBJbmRleCByZXNTdHJpZGUsIFwKKyAgICBFSUdUWVBFIGFscGhhKSBcCisgIHsgXAorICAgSW5kZXggZGlhZ1NpemUgID0gKHN0ZDo6bWluKShfY29scyxfZGVwdGgpOyBcCisgICBJbmRleCByb3dzICAgICAgPSBfcm93czsgXAorICAgSW5kZXggZGVwdGggICAgID0gSXNMb3dlciA/IF9kZXB0aCA6IGRpYWdTaXplOyBcCisgICBJbmRleCBjb2xzICAgICAgPSBJc0xvd2VyID8gZGlhZ1NpemUgOiBfY29sczsgXAorXAorICAgdHlwZWRlZiBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgTGhzU3RvcmFnZU9yZGVyPiBNYXRyaXhMaHM7IFwKKyAgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIFJoc1N0b3JhZ2VPcmRlcj4gTWF0cml4UmhzOyBcCitcCisvKiBOb24tc3F1YXJlIGNhc2UgLSBkb2Vzbid0IGZpdCB0byBNS0wgP1RSTU0uIEZhbGwgdG8gZGVmYXVsdCB0cmlhbmd1bGFyIHByb2R1Y3Qgb3IgY2FsbCBNS0wgP0dFTU0qLyBcCisgICBpZiAoY29scyAhPSBkZXB0aCkgeyBcCitcCisgICAgIGludCBudGhyID0gbWtsX2RvbWFpbl9nZXRfbWF4X3RocmVhZHMoTUtMX0JMQVMpOyBcCitcCisgICAgIGlmICgobnRocj09MSkgJiYgKCgoc3RkOjptYXgpKGNvbHMsZGVwdGgpLWRpYWdTaXplKS8oZG91YmxlKWRpYWdTaXplIDwgMC41KSkgeyBcCisgICAgIC8qIE1vc3QgbGlrZWx5IG5vIGJlbmVmaXQgdG8gY2FsbCBUUk1NIG9yIEdFTU0gZnJvbSBNS0wqLyBcCisgICAgICAgcHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8RUlHVFlQRSxJbmRleCxNb2RlLGZhbHNlLCBcCisgICAgICAgTGhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocywgUmhzU3RvcmFnZU9yZGVyLCBDb25qdWdhdGVSaHMsIENvbE1ham9yLCBCdWlsdEluPjo6cnVuKCBcCisgICAgICAgICAgIF9yb3dzLCBfY29scywgX2RlcHRoLCBfbGhzLCBsaHNTdHJpZGUsIF9yaHMsIHJoc1N0cmlkZSwgcmVzLCByZXNTdHJpZGUsIGFscGhhKTsgXAorICAgICAgIC8qc3RkOjpjb3V0IDw8ICJUUk1NX1I6IEEgaXMgbm90IHNxdWFyZSEgR28gdG8gRWlnZW4gVFJNTSBpbXBsZW1lbnRhdGlvbiFcbiI7Ki8gXAorICAgICB9IGVsc2UgeyBcCisgICAgIC8qIE1ha2Ugc2Vuc2UgdG8gY2FsbCBHRU1NICovIFwKKyAgICAgICBNYXA8Y29uc3QgTWF0cml4UmhzLCAwLCBPdXRlclN0cmlkZTw+ID4gcmhzTWFwKF9yaHMsZGVwdGgsY29scywgT3V0ZXJTdHJpZGU8PihyaHNTdHJpZGUpKTsgXAorICAgICAgIE1hdHJpeFJocyBhYV90bXA9cmhzTWFwLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCk7IFwKKyAgICAgICBNS0xfSU5UIGFTdHJpZGUgPSBhYV90bXAub3V0ZXJTdHJpZGUoKTsgXAorICAgICAgIGdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsRUlHVFlQRSxFSUdUWVBFLER5bmFtaWMsRHluYW1pYyxEeW5hbWljPiBibG9ja2luZyhfcm93cyxfY29scyxfZGVwdGgpOyBcCisgICAgICAgZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8SW5kZXgsRUlHVFlQRSxMaHNTdG9yYWdlT3JkZXIsQ29uanVnYXRlTGhzLEVJR1RZUEUsUmhzU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZVJocyxDb2xNYWpvcj46OnJ1biggXAorICAgICAgIHJvd3MsIGNvbHMsIGRlcHRoLCBfbGhzLCBsaHNTdHJpZGUsIGFhX3RtcC5kYXRhKCksIGFTdHJpZGUsIHJlcywgcmVzU3RyaWRlLCBhbHBoYSwgYmxvY2tpbmcsIDApOyBcCitcCisgICAgIC8qc3RkOjpjb3V0IDw8ICJUUk1NX1I6IEEgaXMgbm90IHNxdWFyZSEgR28gdG8gTUtMIEdFTU0gaW1wbGVtZW50YXRpb24hICIgPDwgbnRocjw8IiBcbiI7Ki8gXAorICAgICB9IFwKKyAgICAgcmV0dXJuOyBcCisgICB9IFwKKyAgIGNoYXIgc2lkZSA9ICdSJywgdHJhbnNhLCB1cGxvLCBkaWFnID0gJ04nOyBcCisgICBFSUdUWVBFICpiOyBcCisgICBjb25zdCBFSUdUWVBFICphOyBcCisgICBNS0xfSU5UIG0sIG4sIGxkYSwgbGRiOyBcCisgICBNS0xUWVBFIGFscGhhXzsgXAorXAorLyogU2V0IGFscGhhXyovIFwKKyAgIGFzc2lnbl9zY2FsYXJfZWlnMm1rbDxNS0xUWVBFLCBFSUdUWVBFPihhbHBoYV8sIGFscGhhKTsgXAorXAorLyogU2V0IG0sIG4gKi8gXAorICAgbSA9IChNS0xfSU5UKXJvd3M7IFwKKyAgIG4gPSAoTUtMX0lOVClkaWFnU2l6ZTsgXAorXAorLyogU2V0IHRyYW5zICovIFwKKyAgIHRyYW5zYSA9IChSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/ICgoQ29uanVnYXRlUmhzKSA/ICdDJyA6ICdUJykgOiAnTic7IFwKK1wKKy8qIFNldCBiLCBsZGIgKi8gXAorICAgTWFwPGNvbnN0IE1hdHJpeExocywgMCwgT3V0ZXJTdHJpZGU8PiA+IGxocyhfbGhzLHJvd3MsZGVwdGgsT3V0ZXJTdHJpZGU8PihsaHNTdHJpZGUpKTsgXAorICAgTWF0cml4WCMjRUlHUFJFRklYIGJfdG1wOyBcCitcCisgICBpZiAoQ29uanVnYXRlTGhzKSBiX3RtcCA9IGxocy5jb25qdWdhdGUoKTsgZWxzZSBiX3RtcCA9IGxoczsgXAorICAgYiA9IGJfdG1wLmRhdGEoKTsgXAorICAgbGRiID0gYl90bXAub3V0ZXJTdHJpZGUoKTsgXAorXAorLyogU2V0IHVwbG8gKi8gXAorICAgdXBsbyA9IElzTG93ZXIgPyAnTCcgOiAnVSc7IFwKKyAgIGlmIChSaHNTdG9yYWdlT3JkZXI9PVJvd01ham9yKSB1cGxvID0gKHVwbG8gPT0gJ0wnKSA/ICdVJyA6ICdMJzsgXAorLyogU2V0IGEsIGxkYSAqLyBcCisgICBNYXA8Y29uc3QgTWF0cml4UmhzLCAwLCBPdXRlclN0cmlkZTw+ID4gcmhzKF9yaHMsZGVwdGgsY29scywgT3V0ZXJTdHJpZGU8PihyaHNTdHJpZGUpKTsgXAorICAgTWF0cml4UmhzIGFfdG1wOyBcCitcCisgICBpZiAoKGNvbmpBIT0wKSB8fCAoU2V0RGlhZz09MCkpIHsgXAorICAgICBpZiAoY29uakEpIGFfdG1wID0gcmhzLmNvbmp1Z2F0ZSgpOyBlbHNlIGFfdG1wID0gcmhzOyBcCisgICAgIGlmIChJc1plcm9EaWFnKSBcCisgICAgICAgYV90bXAuZGlhZ29uYWwoKS5zZXRaZXJvKCk7IFwKKyAgICAgZWxzZSBpZiAoSXNVbml0RGlhZykgXAorICAgICAgIGFfdG1wLmRpYWdvbmFsKCkuc2V0T25lcygpO1wKKyAgICAgYSA9IGFfdG1wLmRhdGEoKTsgXAorICAgICBsZGEgPSBhX3RtcC5vdXRlclN0cmlkZSgpOyBcCisgICB9IGVsc2UgeyBcCisgICAgIGEgPSBfcmhzOyBcCisgICAgIGxkYSA9IHJoc1N0cmlkZTsgXAorICAgfSBcCisgICAvKnN0ZDo6Y291dCA8PCAiVFJNTV9SOiBBIGlzIHNxdWFyZSEgR28gdG8gTUtMIFRSTU0gaW1wbGVtZW50YXRpb24hIFxuIjsqLyBcCisvKiBjYWxsID90cm1tKi8gXAorICAgTUtMUFJFRklYIyN0cm1tKCZzaWRlLCAmdXBsbywgJnRyYW5zYSwgJmRpYWcsICZtLCAmbiwgJmFscGhhXywgKGNvbnN0IE1LTFRZUEUqKWEsICZsZGEsIChNS0xUWVBFKiliLCAmbGRiKTsgXAorXAorLyogQWRkIG9wKGFfdHJpYW5ndWxhcikqYiBpbnRvIHJlcyovIFwKKyAgIE1hcDxNYXRyaXhYIyNFSUdQUkVGSVgsIDAsIE91dGVyU3RyaWRlPD4gPiByZXNfdG1wKHJlcyxyb3dzLGNvbHMsT3V0ZXJTdHJpZGU8PihyZXNTdHJpZGUpKTsgXAorICAgcmVzX3RtcD1yZXNfdG1wK2JfdG1wOyBcCisgIH0gXAorfTsKKworRUlHRU5fTUtMX1RSTU1fUihkb3VibGUsIGRvdWJsZSwgZCwgZCkKK0VJR0VOX01LTF9UUk1NX1IoZGNvbXBsZXgsIE1LTF9Db21wbGV4MTYsIGNkLCB6KQorRUlHRU5fTUtMX1RSTU1fUihmbG9hdCwgZmxvYXQsIGYsIHMpCitFSUdFTl9NS0xfVFJNTV9SKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsIGNmLCBjKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9NQVRSSVhfTUtMX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJNYXRyaXhWZWN0b3IuaCBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJNYXRyaXhWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWMxMGMyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeFZlY3Rvci5oCkBAIC0wLDAgKzEsMzM4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVFJJQU5HVUxBUk1BVFJJWFZFQ1RPUl9ICisjZGVmaW5lIEVJR0VOX1RSSUFOR1VMQVJNQVRSSVhWRUNUT1JfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCBib29sIENvbmpSaHMsIGludCBTdG9yYWdlT3JkZXIsIGludCBWZXJzaW9uPVNwZWNpYWxpemVkPgorc3RydWN0IHRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29ualJocywgaW50IFZlcnNpb24+CitzdHJ1Y3QgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxMaHNTY2FsYXIsQ29uakxocyxSaHNTY2FsYXIsQ29ualJocyxDb2xNYWpvcixWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHNjYWxhcl9wcm9kdWN0X3RyYWl0czxMaHNTY2FsYXIsIFJoc1NjYWxhcj46OlJldHVyblR5cGUgUmVzU2NhbGFyOworICBlbnVtIHsKKyAgICBJc0xvd2VyID0gKChNb2RlJkxvd2VyKT09TG93ZXIpLAorICAgIEhhc1VuaXREaWFnID0gKE1vZGUgJiBVbml0RGlhZyk9PVVuaXREaWFnLAorICAgIEhhc1plcm9EaWFnID0gKE1vZGUgJiBaZXJvRGlhZyk9PVplcm9EaWFnCisgIH07CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSAgdm9pZCBydW4oSW5kZXggX3Jvd3MsIEluZGV4IF9jb2xzLCBjb25zdCBMaHNTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSaHNTY2FsYXIqIF9yaHMsIEluZGV4IHJoc0luY3IsIFJlc1NjYWxhciogX3JlcywgSW5kZXggcmVzSW5jciwgUmVzU2NhbGFyIGFscGhhKQorICB7CisgICAgc3RhdGljIGNvbnN0IEluZGV4IFBhbmVsV2lkdGggPSBFSUdFTl9UVU5FX1RSSUFOR1VMQVJfUEFORUxfV0lEVEg7CisgICAgSW5kZXggc2l6ZSA9IChzdGQ6Om1pbikoX3Jvd3MsX2NvbHMpOworICAgIEluZGV4IHJvd3MgPSBJc0xvd2VyID8gX3Jvd3MgOiAoc3RkOjptaW4pKF9yb3dzLF9jb2xzKTsKKyAgICBJbmRleCBjb2xzID0gSXNMb3dlciA/IChzdGQ6Om1pbikoX3Jvd3MsX2NvbHMpIDogX2NvbHM7CisKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBMaHNNYXA7CisgICAgY29uc3QgTGhzTWFwIGxocyhfbGhzLHJvd3MsY29scyxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOworICAgIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qTGhzLExoc01hcD46OnR5cGUgY2pMaHMobGhzKTsKKyAgICAKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8UmhzU2NhbGFyLER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPD4gPiBSaHNNYXA7CisgICAgY29uc3QgUmhzTWFwIHJocyhfcmhzLGNvbHMsSW5uZXJTdHJpZGU8PihyaHNJbmNyKSk7CisgICAgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmpSaHMsUmhzTWFwPjo6dHlwZSBjalJocyhyaHMpOworCisgICAgdHlwZWRlZiBNYXA8TWF0cml4PFJlc1NjYWxhcixEeW5hbWljLDE+ID4gUmVzTWFwOworICAgIFJlc01hcCByZXMoX3Jlcyxyb3dzKTsKKworICAgIGZvciAoSW5kZXggcGk9MDsgcGk8c2l6ZTsgcGkrPVBhbmVsV2lkdGgpCisgICAgeworICAgICAgSW5kZXggYWN0dWFsUGFuZWxXaWR0aCA9IChzdGQ6Om1pbikoUGFuZWxXaWR0aCwgc2l6ZS1waSk7CisgICAgICBmb3IgKEluZGV4IGs9MDsgazxhY3R1YWxQYW5lbFdpZHRoOyArK2spCisgICAgICB7CisgICAgICAgIEluZGV4IGkgPSBwaSArIGs7CisgICAgICAgIEluZGV4IHMgPSBJc0xvd2VyID8gKChIYXNVbml0RGlhZ3x8SGFzWmVyb0RpYWcpID8gaSsxIDogaSApIDogcGk7CisgICAgICAgIEluZGV4IHIgPSBJc0xvd2VyID8gYWN0dWFsUGFuZWxXaWR0aC1rIDogaysxOworICAgICAgICBpZiAoKCEoSGFzVW5pdERpYWd8fEhhc1plcm9EaWFnKSkgfHwgKC0tcik+MCkKKyAgICAgICAgICByZXMuc2VnbWVudChzLHIpICs9IChhbHBoYSAqIGNqUmhzLmNvZWZmKGkpKSAqIGNqTGhzLmNvbChpKS5zZWdtZW50KHMscik7CisgICAgICAgIGlmIChIYXNVbml0RGlhZykKKyAgICAgICAgICByZXMuY29lZmZSZWYoaSkgKz0gYWxwaGEgKiBjalJocy5jb2VmZihpKTsKKyAgICAgIH0KKyAgICAgIEluZGV4IHIgPSBJc0xvd2VyID8gcm93cyAtIHBpIC0gYWN0dWFsUGFuZWxXaWR0aCA6IHBpOworICAgICAgaWYgKHI+MCkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggcyA9IElzTG93ZXIgPyBwaSthY3R1YWxQYW5lbFdpZHRoIDogMDsKKyAgICAgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLENvbE1ham9yLENvbmpMaHMsUmhzU2NhbGFyLENvbmpSaHMsQnVpbHRJbj46OnJ1bigKKyAgICAgICAgICAgIHIsIGFjdHVhbFBhbmVsV2lkdGgsCisgICAgICAgICAgICAmbGhzLmNvZWZmUmVmKHMscGkpLCBsaHNTdHJpZGUsCisgICAgICAgICAgICAmcmhzLmNvZWZmUmVmKHBpKSwgcmhzSW5jciwKKyAgICAgICAgICAgICZyZXMuY29lZmZSZWYocyksIHJlc0luY3IsIGFscGhhKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoKCFJc0xvd2VyKSAmJiBjb2xzPnNpemUpCisgICAgeworICAgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLENvbE1ham9yLENvbmpMaHMsUmhzU2NhbGFyLENvbmpSaHM+OjpydW4oCisgICAgICAgICAgcm93cywgY29scy1zaXplLAorICAgICAgICAgICZsaHMuY29lZmZSZWYoMCxzaXplKSwgbGhzU3RyaWRlLAorICAgICAgICAgICZyaHMuY29lZmZSZWYoc2l6ZSksIHJoc0luY3IsCisgICAgICAgICAgX3JlcywgcmVzSW5jciwgYWxwaGEpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCBib29sIENvbmpSaHMsaW50IFZlcnNpb24+CitzdHJ1Y3QgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxMaHNTY2FsYXIsQ29uakxocyxSaHNTY2FsYXIsQ29ualJocyxSb3dNYWpvcixWZXJzaW9uPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHNjYWxhcl9wcm9kdWN0X3RyYWl0czxMaHNTY2FsYXIsIFJoc1NjYWxhcj46OlJldHVyblR5cGUgUmVzU2NhbGFyOworICBlbnVtIHsKKyAgICBJc0xvd2VyID0gKChNb2RlJkxvd2VyKT09TG93ZXIpLAorICAgIEhhc1VuaXREaWFnID0gKE1vZGUgJiBVbml0RGlhZyk9PVVuaXREaWFnLAorICAgIEhhc1plcm9EaWFnID0gKE1vZGUgJiBaZXJvRGlhZyk9PVplcm9EaWFnCisgIH07CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLAorICAgICAgICAgICAgICAgICAgY29uc3QgUmhzU2NhbGFyKiBfcmhzLCBJbmRleCByaHNJbmNyLCBSZXNTY2FsYXIqIF9yZXMsIEluZGV4IHJlc0luY3IsIFJlc1NjYWxhciBhbHBoYSkKKyAgeworICAgIHN0YXRpYyBjb25zdCBJbmRleCBQYW5lbFdpZHRoID0gRUlHRU5fVFVORV9UUklBTkdVTEFSX1BBTkVMX1dJRFRIOworICAgIEluZGV4IGRpYWdTaXplID0gKHN0ZDo6bWluKShfcm93cyxfY29scyk7CisgICAgSW5kZXggcm93cyA9IElzTG93ZXIgPyBfcm93cyA6IGRpYWdTaXplOworICAgIEluZGV4IGNvbHMgPSBJc0xvd2VyID8gZGlhZ1NpemUgOiBfY29sczsKKworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IExoc01hcDsKKyAgICBjb25zdCBMaHNNYXAgbGhzKF9saHMscm93cyxjb2xzLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7CisgICAgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmpMaHMsTGhzTWFwPjo6dHlwZSBjakxocyhsaHMpOworCisgICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PFJoc1NjYWxhcixEeW5hbWljLDE+ID4gUmhzTWFwOworICAgIGNvbnN0IFJoc01hcCByaHMoX3Jocyxjb2xzKTsKKyAgICB0eXBlbmFtZSBjb25qX2V4cHJfaWY8Q29ualJocyxSaHNNYXA+Ojp0eXBlIGNqUmhzKHJocyk7CisKKyAgICB0eXBlZGVmIE1hcDxNYXRyaXg8UmVzU2NhbGFyLER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPD4gPiBSZXNNYXA7CisgICAgUmVzTWFwIHJlcyhfcmVzLHJvd3MsSW5uZXJTdHJpZGU8PihyZXNJbmNyKSk7CisgICAgCisgICAgZm9yIChJbmRleCBwaT0wOyBwaTxkaWFnU2l6ZTsgcGkrPVBhbmVsV2lkdGgpCisgICAgeworICAgICAgSW5kZXggYWN0dWFsUGFuZWxXaWR0aCA9IChzdGQ6Om1pbikoUGFuZWxXaWR0aCwgZGlhZ1NpemUtcGkpOworICAgICAgZm9yIChJbmRleCBrPTA7IGs8YWN0dWFsUGFuZWxXaWR0aDsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gcGkgKyBrOworICAgICAgICBJbmRleCBzID0gSXNMb3dlciA/IHBpICA6ICgoSGFzVW5pdERpYWd8fEhhc1plcm9EaWFnKSA/IGkrMSA6IGkpOworICAgICAgICBJbmRleCByID0gSXNMb3dlciA/IGsrMSA6IGFjdHVhbFBhbmVsV2lkdGgtazsKKyAgICAgICAgaWYgKCghKEhhc1VuaXREaWFnfHxIYXNaZXJvRGlhZykpIHx8ICgtLXIpPjApCisgICAgICAgICAgcmVzLmNvZWZmUmVmKGkpICs9IGFscGhhICogKGNqTGhzLnJvdyhpKS5zZWdtZW50KHMscikuY3dpc2VQcm9kdWN0KGNqUmhzLnNlZ21lbnQocyxyKS50cmFuc3Bvc2UoKSkpLnN1bSgpOworICAgICAgICBpZiAoSGFzVW5pdERpYWcpCisgICAgICAgICAgcmVzLmNvZWZmUmVmKGkpICs9IGFscGhhICogY2pSaHMuY29lZmYoaSk7CisgICAgICB9CisgICAgICBJbmRleCByID0gSXNMb3dlciA/IHBpIDogY29scyAtIHBpIC0gYWN0dWFsUGFuZWxXaWR0aDsKKyAgICAgIGlmIChyPjApCisgICAgICB7CisgICAgICAgIEluZGV4IHMgPSBJc0xvd2VyID8gMCA6IHBpICsgYWN0dWFsUGFuZWxXaWR0aDsKKyAgICAgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLFJvd01ham9yLENvbmpMaHMsUmhzU2NhbGFyLENvbmpSaHMsQnVpbHRJbj46OnJ1bigKKyAgICAgICAgICAgIGFjdHVhbFBhbmVsV2lkdGgsIHIsCisgICAgICAgICAgICAmbGhzLmNvZWZmUmVmKHBpLHMpLCBsaHNTdHJpZGUsCisgICAgICAgICAgICAmcmhzLmNvZWZmUmVmKHMpLCByaHNJbmNyLAorICAgICAgICAgICAgJnJlcy5jb2VmZlJlZihwaSksIHJlc0luY3IsIGFscGhhKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoSXNMb3dlciAmJiByb3dzPmRpYWdTaXplKQorICAgIHsKKyAgICAgIGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LExoc1NjYWxhcixSb3dNYWpvcixDb25qTGhzLFJoc1NjYWxhcixDb25qUmhzPjo6cnVuKAorICAgICAgICAgICAgcm93cy1kaWFnU2l6ZSwgY29scywKKyAgICAgICAgICAgICZsaHMuY29lZmZSZWYoZGlhZ1NpemUsMCksIGxoc1N0cmlkZSwKKyAgICAgICAgICAgICZyaHMuY29lZmZSZWYoMCksIHJoc0luY3IsCisgICAgICAgICAgICAmcmVzLmNvZWZmUmVmKGRpYWdTaXplKSwgcmVzSW5jciwgYWxwaGEpOworICAgIH0KKyAgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBXcmFwcGVyIHRvIHByb2R1Y3RfdHJpYW5ndWxhcl92ZWN0b3IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8aW50IE1vZGUsIGJvb2wgTGhzSXNUcmlhbmd1bGFyLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCB0cmFpdHM8VHJpYW5ndWxhclByb2R1Y3Q8TW9kZSxMaHNJc1RyaWFuZ3VsYXIsTGhzLGZhbHNlLFJocyx0cnVlPiA+CisgOiB0cmFpdHM8UHJvZHVjdEJhc2U8VHJpYW5ndWxhclByb2R1Y3Q8TW9kZSxMaHNJc1RyaWFuZ3VsYXIsTGhzLGZhbHNlLFJocyx0cnVlPiwgTGhzLCBSaHM+ID4KK3t9OworCit0ZW1wbGF0ZTxpbnQgTW9kZSwgYm9vbCBMaHNJc1RyaWFuZ3VsYXIsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czxUcmlhbmd1bGFyUHJvZHVjdDxNb2RlLExoc0lzVHJpYW5ndWxhcixMaHMsdHJ1ZSxSaHMsZmFsc2U+ID4KKyA6IHRyYWl0czxQcm9kdWN0QmFzZTxUcmlhbmd1bGFyUHJvZHVjdDxNb2RlLExoc0lzVHJpYW5ndWxhcixMaHMsdHJ1ZSxSaHMsZmFsc2U+LCBMaHMsIFJocz4gPgore307CisKKwordGVtcGxhdGU8aW50IFN0b3JhZ2VPcmRlcj4KK3N0cnVjdCB0cm12X3NlbGVjdG9yOworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8aW50IE1vZGUsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IFRyaWFuZ3VsYXJQcm9kdWN0PE1vZGUsdHJ1ZSxMaHMsZmFsc2UsUmhzLHRydWU+CisgIDogcHVibGljIFByb2R1Y3RCYXNlPFRyaWFuZ3VsYXJQcm9kdWN0PE1vZGUsdHJ1ZSxMaHMsZmFsc2UsUmhzLHRydWU+LCBMaHMsIFJocyA+Cit7CisgIEVJR0VOX1BST0RVQ1RfUFVCTElDX0lOVEVSRkFDRShUcmlhbmd1bGFyUHJvZHVjdCkKKworICBUcmlhbmd1bGFyUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpIDogQmFzZShsaHMscmhzKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkc3QsIFNjYWxhciBhbHBoYSkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChkc3Qucm93cygpPT1tX2xocy5yb3dzKCkgJiYgZHN0LmNvbHMoKT09bV9yaHMuY29scygpKTsKKyAgCisgICAgaW50ZXJuYWw6OnRybXZfc2VsZWN0b3I8KGludChpbnRlcm5hbDo6dHJhaXRzPExocz46OkZsYWdzKSZSb3dNYWpvckJpdCkgPyBSb3dNYWpvciA6IENvbE1ham9yPjo6cnVuKCp0aGlzLCBkc3QsIGFscGhhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8aW50IE1vZGUsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorc3RydWN0IFRyaWFuZ3VsYXJQcm9kdWN0PE1vZGUsZmFsc2UsTGhzLHRydWUsUmhzLGZhbHNlPgorICA6IHB1YmxpYyBQcm9kdWN0QmFzZTxUcmlhbmd1bGFyUHJvZHVjdDxNb2RlLGZhbHNlLExocyx0cnVlLFJocyxmYWxzZT4sIExocywgUmhzID4KK3sKKyAgRUlHRU5fUFJPRFVDVF9QVUJMSUNfSU5URVJGQUNFKFRyaWFuZ3VsYXJQcm9kdWN0KQorCisgIFRyaWFuZ3VsYXJQcm9kdWN0KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykgOiBCYXNlKGxocyxyaHMpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRzdCwgU2NhbGFyIGFscGhhKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KGRzdC5yb3dzKCk9PW1fbGhzLnJvd3MoKSAmJiBkc3QuY29scygpPT1tX3Jocy5jb2xzKCkpOworCisgICAgdHlwZWRlZiBUcmlhbmd1bGFyUHJvZHVjdDwoTW9kZSAmIChVbml0RGlhZ3xaZXJvRGlhZykpIHwgKChNb2RlICYgTG93ZXIpID8gVXBwZXIgOiBMb3dlciksdHJ1ZSxUcmFuc3Bvc2U8Y29uc3QgUmhzPixmYWxzZSxUcmFuc3Bvc2U8Y29uc3QgTGhzPix0cnVlPiBUcmlhbmd1bGFyUHJvZHVjdFRyYW5zcG9zZTsKKyAgICBUcmFuc3Bvc2U8RGVzdD4gZHN0VChkc3QpOworICAgIGludGVybmFsOjp0cm12X3NlbGVjdG9yPChpbnQoaW50ZXJuYWw6OnRyYWl0czxSaHM+OjpGbGFncykmUm93TWFqb3JCaXQpID8gQ29sTWFqb3IgOiBSb3dNYWpvcj46OnJ1bigKKyAgICAgIFRyaWFuZ3VsYXJQcm9kdWN0VHJhbnNwb3NlKG1fcmhzLnRyYW5zcG9zZSgpLG1fbGhzLnRyYW5zcG9zZSgpKSwgZHN0VCwgYWxwaGEpOworICB9Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUT0RPOiBmaW5kIGEgd2F5IHRvIGZhY3Rvcml6ZSB0aGlzIHBpZWNlIG9mIGNvZGUgd2l0aCBnZW12X3NlbGVjdG9yIHNpbmNlIHRoZSBsb2dpYyBpcyBleGFjdGx5IHRoZSBzYW1lLgorICAKK3RlbXBsYXRlPD4gc3RydWN0IHRybXZfc2VsZWN0b3I8Q29sTWFqb3I+Cit7CisgIHRlbXBsYXRlPGludCBNb2RlLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFRyaWFuZ3VsYXJQcm9kdWN0PE1vZGUsdHJ1ZSxMaHMsZmFsc2UsUmhzLHRydWU+JiBwcm9kLCBEZXN0JiBkZXN0LCB0eXBlbmFtZSBUcmlhbmd1bGFyUHJvZHVjdDxNb2RlLHRydWUsTGhzLGZhbHNlLFJocyx0cnVlPjo6U2NhbGFyIGFscGhhKQorICB7CisgICAgdHlwZWRlZiBUcmlhbmd1bGFyUHJvZHVjdDxNb2RlLHRydWUsTGhzLGZhbHNlLFJocyx0cnVlPiBQcm9kdWN0VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpMaHNTY2FsYXIgICBMaHNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6UmhzU2NhbGFyICAgUmhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6OlNjYWxhciAgICAgIFJlc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpSZWFsU2NhbGFyICBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6OkFjdHVhbExoc1R5cGUgQWN0dWFsTGhzVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpBY3R1YWxSaHNUeXBlIEFjdHVhbFJoc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6TGhzQmxhc1RyYWl0cyBMaHNCbGFzVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6OlJoc0JsYXNUcmFpdHMgUmhzQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIE1hcDxNYXRyaXg8UmVzU2NhbGFyLER5bmFtaWMsMT4sIEFsaWduZWQ+IE1hcHBlZERlc3Q7CisKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsTGhzVHlwZT46OnR5cGUgYWN0dWFsTGhzID0gTGhzQmxhc1RyYWl0czo6ZXh0cmFjdChwcm9kLmxocygpKTsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8QWN0dWFsUmhzVHlwZT46OnR5cGUgYWN0dWFsUmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChwcm9kLnJocygpKTsKKworICAgIFJlc1NjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLmxocygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLnJocygpKTsKKworICAgIGVudW0geworICAgICAgLy8gRklYTUUgZmluZCBhIHdheSB0byBhbGxvdyBhbiBpbm5lciBzdHJpZGUgb24gdGhlIHJlc3VsdCBpZiBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU9PTEKKyAgICAgIC8vIG9uLCB0aGUgb3RoZXIgaGFuZCBpdCBpcyBnb29kIGZvciB0aGUgY2FjaGUgdG8gcGFjayB0aGUgdmVjdG9yIGFueXdheXMuLi4KKyAgICAgIEV2YWxUb0Rlc3RBdENvbXBpbGVUaW1lID0gRGVzdDo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lPT0xLAorICAgICAgQ29tcGxleEJ5UmVhbCA9IChOdW1UcmFpdHM8TGhzU2NhbGFyPjo6SXNDb21wbGV4KSAmJiAoIU51bVRyYWl0czxSaHNTY2FsYXI+OjpJc0NvbXBsZXgpLAorICAgICAgTWlnaHRDYW5ub3RVc2VEZXN0ID0gKERlc3Q6OklubmVyU3RyaWRlQXRDb21waWxlVGltZSE9MSkgfHwgQ29tcGxleEJ5UmVhbAorICAgIH07CisKKyAgICBnZW12X3N0YXRpY192ZWN0b3JfaWY8UmVzU2NhbGFyLERlc3Q6OlNpemVBdENvbXBpbGVUaW1lLERlc3Q6Ok1heFNpemVBdENvbXBpbGVUaW1lLE1pZ2h0Q2Fubm90VXNlRGVzdD4gc3RhdGljX2Rlc3Q7CisKKyAgICBib29sIGFscGhhSXNDb21wYXRpYmxlID0gKCFDb21wbGV4QnlSZWFsKSB8fCAoaW1hZyhhY3R1YWxBbHBoYSk9PVJlYWxTY2FsYXIoMCkpOworICAgIGJvb2wgZXZhbFRvRGVzdCA9IEV2YWxUb0Rlc3RBdENvbXBpbGVUaW1lICYmIGFscGhhSXNDb21wYXRpYmxlOworICAgIAorICAgIFJoc1NjYWxhciBjb21wYXRpYmxlQWxwaGEgPSBnZXRfZmFjdG9yPFJlc1NjYWxhcixSaHNTY2FsYXI+OjpydW4oYWN0dWFsQWxwaGEpOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFJlc1NjYWxhcixhY3R1YWxEZXN0UHRyLGRlc3Quc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsVG9EZXN0ID8gZGVzdC5kYXRhKCkgOiBzdGF0aWNfZGVzdC5kYXRhKCkpOworCisgICAgaWYoIWV2YWxUb0Rlc3QpCisgICAgeworICAgICAgI2lmZGVmIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgIGludCBzaXplID0gZGVzdC5zaXplKCk7CisgICAgICBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOCisgICAgICAjZW5kaWYKKyAgICAgIGlmKCFhbHBoYUlzQ29tcGF0aWJsZSkKKyAgICAgIHsKKyAgICAgICAgTWFwcGVkRGVzdChhY3R1YWxEZXN0UHRyLCBkZXN0LnNpemUoKSkuc2V0WmVybygpOworICAgICAgICBjb21wYXRpYmxlQWxwaGEgPSBSaHNTY2FsYXIoMSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIE1hcHBlZERlc3QoYWN0dWFsRGVzdFB0ciwgZGVzdC5zaXplKCkpID0gZGVzdDsKKyAgICB9CisgICAgCisgICAgaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0CisgICAgICA8SW5kZXgsTW9kZSwKKyAgICAgICBMaHNTY2FsYXIsIExoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSwKKyAgICAgICBSaHNTY2FsYXIsIFJoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSwKKyAgICAgICBDb2xNYWpvcj4KKyAgICAgIDo6cnVuKGFjdHVhbExocy5yb3dzKCksYWN0dWFsTGhzLmNvbHMoKSwKKyAgICAgICAgICAgIGFjdHVhbExocy5kYXRhKCksYWN0dWFsTGhzLm91dGVyU3RyaWRlKCksCisgICAgICAgICAgICBhY3R1YWxSaHMuZGF0YSgpLGFjdHVhbFJocy5pbm5lclN0cmlkZSgpLAorICAgICAgICAgICAgYWN0dWFsRGVzdFB0ciwxLGNvbXBhdGlibGVBbHBoYSk7CisKKyAgICBpZiAoIWV2YWxUb0Rlc3QpCisgICAgeworICAgICAgaWYoIWFscGhhSXNDb21wYXRpYmxlKQorICAgICAgICBkZXN0ICs9IGFjdHVhbEFscGhhICogTWFwcGVkRGVzdChhY3R1YWxEZXN0UHRyLCBkZXN0LnNpemUoKSk7CisgICAgICBlbHNlCisgICAgICAgIGRlc3QgPSBNYXBwZWREZXN0KGFjdHVhbERlc3RQdHIsIGRlc3Quc2l6ZSgpKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHRybXZfc2VsZWN0b3I8Um93TWFqb3I+Cit7CisgIHRlbXBsYXRlPGludCBNb2RlLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdD4KKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFRyaWFuZ3VsYXJQcm9kdWN0PE1vZGUsdHJ1ZSxMaHMsZmFsc2UsUmhzLHRydWU+JiBwcm9kLCBEZXN0JiBkZXN0LCB0eXBlbmFtZSBUcmlhbmd1bGFyUHJvZHVjdDxNb2RlLHRydWUsTGhzLGZhbHNlLFJocyx0cnVlPjo6U2NhbGFyIGFscGhhKQorICB7CisgICAgdHlwZWRlZiBUcmlhbmd1bGFyUHJvZHVjdDxNb2RlLHRydWUsTGhzLGZhbHNlLFJocyx0cnVlPiBQcm9kdWN0VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpMaHNTY2FsYXIgTGhzU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6OlJoc1NjYWxhciBSaHNTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6U2NhbGFyICAgIFJlc1NjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpBY3R1YWxMaHNUeXBlIEFjdHVhbExoc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6QWN0dWFsUmhzVHlwZSBBY3R1YWxSaHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6Ol9BY3R1YWxSaHNUeXBlIF9BY3R1YWxSaHNUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFR5cGU6Okxoc0JsYXNUcmFpdHMgTGhzQmxhc1RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3RUeXBlOjpSaHNCbGFzVHJhaXRzIFJoc0JsYXNUcmFpdHM7CisKKyAgICB0eXBlbmFtZSBhZGRfY29uc3Q8QWN0dWFsTGhzVHlwZT46OnR5cGUgYWN0dWFsTGhzID0gTGhzQmxhc1RyYWl0czo6ZXh0cmFjdChwcm9kLmxocygpKTsKKyAgICB0eXBlbmFtZSBhZGRfY29uc3Q8QWN0dWFsUmhzVHlwZT46OnR5cGUgYWN0dWFsUmhzID0gUmhzQmxhc1RyYWl0czo6ZXh0cmFjdChwcm9kLnJocygpKTsKKworICAgIFJlc1NjYWxhciBhY3R1YWxBbHBoYSA9IGFscGhhICogTGhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLmxocygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmhzQmxhc1RyYWl0czo6ZXh0cmFjdFNjYWxhckZhY3Rvcihwcm9kLnJocygpKTsKKworICAgIGVudW0geworICAgICAgRGlyZWN0bHlVc2VSaHMgPSBfQWN0dWFsUmhzVHlwZTo6SW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lPT0xCisgICAgfTsKKworICAgIGdlbXZfc3RhdGljX3ZlY3Rvcl9pZjxSaHNTY2FsYXIsX0FjdHVhbFJoc1R5cGU6OlNpemVBdENvbXBpbGVUaW1lLF9BY3R1YWxSaHNUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZSwhRGlyZWN0bHlVc2VSaHM+IHN0YXRpY19yaHM7CisKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoUmhzU2NhbGFyLGFjdHVhbFJoc1B0cixhY3R1YWxSaHMuc2l6ZSgpLAorICAgICAgICBEaXJlY3RseVVzZVJocyA/IGNvbnN0X2Nhc3Q8UmhzU2NhbGFyKj4oYWN0dWFsUmhzLmRhdGEoKSkgOiBzdGF0aWNfcmhzLmRhdGEoKSk7CisKKyAgICBpZighRGlyZWN0bHlVc2VSaHMpCisgICAgeworICAgICAgI2lmZGVmIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgIGludCBzaXplID0gYWN0dWFsUmhzLnNpemUoKTsKKyAgICAgIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4KKyAgICAgICNlbmRpZgorICAgICAgTWFwPHR5cGVuYW1lIF9BY3R1YWxSaHNUeXBlOjpQbGFpbk9iamVjdD4oYWN0dWFsUmhzUHRyLCBhY3R1YWxSaHMuc2l6ZSgpKSA9IGFjdHVhbFJoczsKKyAgICB9CisgICAgCisgICAgaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0CisgICAgICA8SW5kZXgsTW9kZSwKKyAgICAgICBMaHNTY2FsYXIsIExoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSwKKyAgICAgICBSaHNTY2FsYXIsIFJoc0JsYXNUcmFpdHM6Ok5lZWRUb0Nvbmp1Z2F0ZSwKKyAgICAgICBSb3dNYWpvcj4KKyAgICAgIDo6cnVuKGFjdHVhbExocy5yb3dzKCksYWN0dWFsTGhzLmNvbHMoKSwKKyAgICAgICAgICAgIGFjdHVhbExocy5kYXRhKCksYWN0dWFsTGhzLm91dGVyU3RyaWRlKCksCisgICAgICAgICAgICBhY3R1YWxSaHNQdHIsMSwKKyAgICAgICAgICAgIGRlc3QuZGF0YSgpLGRlc3QuaW5uZXJTdHJpZGUoKSwKKyAgICAgICAgICAgIGFjdHVhbEFscGhhKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJJQU5HVUxBUk1BVFJJWFZFQ1RPUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyTWF0cml4VmVjdG9yX01LTC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeFZlY3Rvcl9NS0wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTg5YjhjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhck1hdHJpeFZlY3Rvcl9NS0wuaApAQCAtMCwwICsxLDI0NyBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICBUcmlhbmd1bGFyIG1hdHJpeC12ZWN0b3IgcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGJhc2VkIG9uID9UUk1WLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX1RSSUFOR1VMQVJfTUFUUklYX1ZFQ1RPUl9NS0xfSAorI2RlZmluZSBFSUdFTl9UUklBTkdVTEFSX01BVFJJWF9WRUNUT1JfTUtMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRyaWFuZ3VsYXIgbWF0cml4LXZlY3RvciBtdWx0aXBsaWNhdGlvbiB1c2luZyBCTEFTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyB0cm12L2hlbXYgc3BlY2lhbGl6YXRpb24KKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCBib29sIENvbmpSaHMsIGludCBTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3RfdHJtdiA6CisgIHRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LE1vZGUsTGhzU2NhbGFyLENvbmpMaHMsUmhzU2NhbGFyLENvbmpSaHMsU3RvcmFnZU9yZGVyLEJ1aWx0SW4+IHt9OworCisjZGVmaW5lIEVJR0VOX01LTF9UUk1WX1NQRUNJQUxJWkUoU2NhbGFyKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzPiBcCitzdHJ1Y3QgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxTY2FsYXIsQ29uakxocyxTY2FsYXIsQ29ualJocyxDb2xNYWpvcixTcGVjaWFsaXplZD4geyBcCisgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKEluZGV4IF9yb3dzLCBJbmRleCBfY29scywgY29uc3QgU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXIqIF9yaHMsIEluZGV4IHJoc0luY3IsIFNjYWxhciogX3JlcywgSW5kZXggcmVzSW5jciwgU2NhbGFyIGFscGhhKSB7IFwKKyAgICAgIHRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3RybXY8SW5kZXgsTW9kZSxTY2FsYXIsQ29uakxocyxTY2FsYXIsQ29ualJocyxDb2xNYWpvcj46OnJ1biggXAorICAgICAgICBfcm93cywgX2NvbHMsIF9saHMsIGxoc1N0cmlkZSwgX3JocywgcmhzSW5jciwgX3JlcywgcmVzSW5jciwgYWxwaGEpOyBcCisgIH0gXAorfTsgXAordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4gXAorc3RydWN0IHRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LE1vZGUsU2NhbGFyLENvbmpMaHMsU2NhbGFyLENvbmpSaHMsUm93TWFqb3IsU3BlY2lhbGl6ZWQ+IHsgXAorIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bihJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIGNvbnN0IFNjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyKiBfcmhzLCBJbmRleCByaHNJbmNyLCBTY2FsYXIqIF9yZXMsIEluZGV4IHJlc0luY3IsIFNjYWxhciBhbHBoYSkgeyBcCisgICAgICB0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdF90cm12PEluZGV4LE1vZGUsU2NhbGFyLENvbmpMaHMsU2NhbGFyLENvbmpSaHMsUm93TWFqb3I+OjpydW4oIFwKKyAgICAgICAgX3Jvd3MsIF9jb2xzLCBfbGhzLCBsaHNTdHJpZGUsIF9yaHMsIHJoc0luY3IsIF9yZXMsIHJlc0luY3IsIGFscGhhKTsgXAorICB9IFwKK307CisKK0VJR0VOX01LTF9UUk1WX1NQRUNJQUxJWkUoZG91YmxlKQorRUlHRU5fTUtMX1RSTVZfU1BFQ0lBTElaRShmbG9hdCkKK0VJR0VOX01LTF9UUk1WX1NQRUNJQUxJWkUoZGNvbXBsZXgpCitFSUdFTl9NS0xfVFJNVl9TUEVDSUFMSVpFKHNjb21wbGV4KQorCisvLyBpbXBsZW1lbnRzIGNvbC1tYWpvcjogcmVzICs9IGFscGhhICogb3AodHJpYW5ndWxhcikgKiB2ZWN0b3IKKyNkZWZpbmUgRUlHRU5fTUtMX1RSTVZfQ00oRUlHVFlQRSwgTUtMVFlQRSwgRUlHUFJFRklYLCBNS0xQUkVGSVgpIFwKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+IFwKK3N0cnVjdCB0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdF90cm12PEluZGV4LE1vZGUsRUlHVFlQRSxDb25qTGhzLEVJR1RZUEUsQ29ualJocyxDb2xNYWpvcj4geyBcCisgIGVudW0geyBcCisgICAgSXNMb3dlciA9IChNb2RlJkxvd2VyKSA9PSBMb3dlciwgXAorICAgIFNldERpYWcgPSAoTW9kZSYoWmVyb0RpYWd8VW5pdERpYWcpKSA/IDAgOiAxLCBcCisgICAgSXNVbml0RGlhZyAgPSAoTW9kZSZVbml0RGlhZykgPyAxIDogMCwgXAorICAgIElzWmVyb0RpYWcgID0gKE1vZGUmWmVyb0RpYWcpID8gMSA6IDAsIFwKKyAgICBMb3dVcCA9IElzTG93ZXIgPyBMb3dlciA6IFVwcGVyIFwKKyAgfTsgXAorIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bihJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFSUdUWVBFKiBfcmhzLCBJbmRleCByaHNJbmNyLCBFSUdUWVBFKiBfcmVzLCBJbmRleCByZXNJbmNyLCBFSUdUWVBFIGFscGhhLCBsZXZlbDNfYmxvY2tpbmc8RUlHVFlQRSxFSUdUWVBFPiYgYmxvY2tpbmcpIFwKKyB7IFwKKyAgIGlmIChDb25qTGhzIHx8IElzWmVyb0RpYWcpIHsgXAorICAgICB0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxJbmRleCxNb2RlLEVJR1RZUEUsQ29uakxocyxFSUdUWVBFLENvbmpSaHMsQ29sTWFqb3IsQnVpbHRJbj46OnJ1biggXAorICAgICAgIF9yb3dzLCBfY29scywgX2xocywgbGhzU3RyaWRlLCBfcmhzLCByaHNJbmNyLCBfcmVzLCByZXNJbmNyLCBhbHBoYSwgYmxvY2tpbmcpOyBcCisgICAgIHJldHVybjsgXAorICAgfVwKKyAgIEluZGV4IHNpemUgPSAoc3RkOjptaW4pKF9yb3dzLF9jb2xzKTsgXAorICAgSW5kZXggcm93cyA9IElzTG93ZXIgPyBfcm93cyA6IHNpemU7IFwKKyAgIEluZGV4IGNvbHMgPSBJc0xvd2VyID8gc2l6ZSA6IF9jb2xzOyBcCitcCisgICB0eXBlZGVmIFZlY3RvclgjI0VJR1BSRUZJWCBWZWN0b3JSaHM7IFwKKyAgIEVJR1RZUEUgKngsICp5O1wKK1wKKy8qIFNldCB4Ki8gXAorICAgTWFwPGNvbnN0IFZlY3RvclJocywgMCwgSW5uZXJTdHJpZGU8PiA+IHJocyhfcmhzLGNvbHMsSW5uZXJTdHJpZGU8PihyaHNJbmNyKSk7IFwKKyAgIFZlY3RvclJocyB4X3RtcDsgXAorICAgaWYgKENvbmpSaHMpIHhfdG1wID0gcmhzLmNvbmp1Z2F0ZSgpOyBlbHNlIHhfdG1wID0gcmhzOyBcCisgICB4ID0geF90bXAuZGF0YSgpOyBcCitcCisvKiBTcXVhcmUgcGFydCBoYW5kbGluZyAqL1wKK1wKKyAgIGNoYXIgdHJhbnMsIHVwbG8sIGRpYWc7IFwKKyAgIE1LTF9JTlQgbSwgbiwgbGRhLCBpbmN4LCBpbmN5OyBcCisgICBFSUdUWVBFIGNvbnN0ICphOyBcCisgICBNS0xUWVBFIGFscGhhXywgYmV0YV87IFwKKyAgIGFzc2lnbl9zY2FsYXJfZWlnMm1rbDxNS0xUWVBFLCBFSUdUWVBFPihhbHBoYV8sIGFscGhhKTsgXAorICAgYXNzaWduX3NjYWxhcl9laWcybWtsPE1LTFRZUEUsIEVJR1RZUEU+KGJldGFfLCBFSUdUWVBFKDEpKTsgXAorXAorLyogU2V0IG0sIG4gKi8gXAorICAgbiA9IChNS0xfSU5UKXNpemU7IFwKKyAgIGxkYSA9IGxoc1N0cmlkZTsgXAorICAgaW5jeCA9IDE7IFwKKyAgIGluY3kgPSByZXNJbmNyOyBcCitcCisvKiBTZXQgdXBsbywgdHJhbnMgYW5kIGRpYWcqLyBcCisgICB0cmFucyA9ICdOJzsgXAorICAgdXBsbyA9IElzTG93ZXIgPyAnTCcgOiAnVSc7IFwKKyAgIGRpYWcgPSBJc1VuaXREaWFnID8gJ1UnIDogJ04nOyBcCitcCisvKiBjYWxsID9UUk1WKi8gXAorICAgTUtMUFJFRklYIyN0cm12KCZ1cGxvLCAmdHJhbnMsICZkaWFnLCAmbiwgKGNvbnN0IE1LTFRZUEUqKV9saHMsICZsZGEsIChNS0xUWVBFKil4LCAmaW5jeCk7IFwKK1wKKy8qIEFkZCBvcChhX3RyKXJocyBpbnRvIHJlcyovIFwKKyAgIE1LTFBSRUZJWCMjYXhweSgmbiwgJmFscGhhXywoY29uc3QgTUtMVFlQRSopeCwgJmluY3gsIChNS0xUWVBFKilfcmVzLCAmaW5jeSk7IFwKKy8qIE5vbi1zcXVhcmUgY2FzZSAtIGRvZXNuJ3QgZml0IHRvIE1LTCA/VFJNVi4gRmFsbCB0byBkZWZhdWx0IHRyaWFuZ3VsYXIgcHJvZHVjdCovIFwKKyAgIGlmIChzaXplPChzdGQ6Om1heCkocm93cyxjb2xzKSkgeyBcCisgICAgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeExoczsgXAorICAgICBpZiAoQ29ualJocykgeF90bXAgPSByaHMuY29uanVnYXRlKCk7IGVsc2UgeF90bXAgPSByaHM7IFwKKyAgICAgeCA9IHhfdG1wLmRhdGEoKTsgXAorICAgICBpZiAoc2l6ZTxyb3dzKSB7IFwKKyAgICAgICB5ID0gX3JlcyArIHNpemUqcmVzSW5jcjsgXAorICAgICAgIGEgPSBfbGhzICsgc2l6ZTsgXAorICAgICAgIG0gPSByb3dzLXNpemU7IFwKKyAgICAgICBuID0gc2l6ZTsgXAorICAgICB9IFwKKyAgICAgZWxzZSB7IFwKKyAgICAgICB4ICs9IHNpemU7IFwKKyAgICAgICB5ID0gX3JlczsgXAorICAgICAgIGEgPSBfbGhzICsgc2l6ZSpsZGE7IFwKKyAgICAgICBtID0gc2l6ZTsgXAorICAgICAgIG4gPSBjb2xzLXNpemU7IFwKKyAgICAgfSBcCisgICAgIE1LTFBSRUZJWCMjZ2VtdigmdHJhbnMsICZtLCAmbiwgJmFscGhhXywgKGNvbnN0IE1LTFRZUEUqKWEsICZsZGEsIChjb25zdCBNS0xUWVBFKil4LCAmaW5jeCwgJmJldGFfLCAoTUtMVFlQRSopeSwgJmluY3kpOyBcCisgICB9IFwKKyAgfSBcCit9OworCitFSUdFTl9NS0xfVFJNVl9DTShkb3VibGUsIGRvdWJsZSwgZCwgZCkKK0VJR0VOX01LTF9UUk1WX0NNKGRjb21wbGV4LCBNS0xfQ29tcGxleDE2LCBjZCwgeikKK0VJR0VOX01LTF9UUk1WX0NNKGZsb2F0LCBmbG9hdCwgZiwgcykKK0VJR0VOX01LTF9UUk1WX0NNKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsIGNmLCBjKQorCisvLyBpbXBsZW1lbnRzIHJvdy1tYWpvcjogcmVzICs9IGFscGhhICogb3AodHJpYW5ndWxhcikgKiB2ZWN0b3IKKyNkZWZpbmUgRUlHRU5fTUtMX1RSTVZfUk0oRUlHVFlQRSwgTUtMVFlQRSwgRUlHUFJFRklYLCBNS0xQUkVGSVgpIFwKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+IFwKK3N0cnVjdCB0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdF90cm12PEluZGV4LE1vZGUsRUlHVFlQRSxDb25qTGhzLEVJR1RZUEUsQ29ualJocyxSb3dNYWpvcj4geyBcCisgIGVudW0geyBcCisgICAgSXNMb3dlciA9IChNb2RlJkxvd2VyKSA9PSBMb3dlciwgXAorICAgIFNldERpYWcgPSAoTW9kZSYoWmVyb0RpYWd8VW5pdERpYWcpKSA/IDAgOiAxLCBcCisgICAgSXNVbml0RGlhZyAgPSAoTW9kZSZVbml0RGlhZykgPyAxIDogMCwgXAorICAgIElzWmVyb0RpYWcgID0gKE1vZGUmWmVyb0RpYWcpID8gMSA6IDAsIFwKKyAgICBMb3dVcCA9IElzTG93ZXIgPyBMb3dlciA6IFVwcGVyIFwKKyAgfTsgXAorIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bihJbmRleCBfcm93cywgSW5kZXggX2NvbHMsIGNvbnN0IEVJR1RZUEUqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFSUdUWVBFKiBfcmhzLCBJbmRleCByaHNJbmNyLCBFSUdUWVBFKiBfcmVzLCBJbmRleCByZXNJbmNyLCBFSUdUWVBFIGFscGhhLCBsZXZlbDNfYmxvY2tpbmc8RUlHVFlQRSxFSUdUWVBFPiYgYmxvY2tpbmcpIFwKKyB7IFwKKyAgIGlmIChJc1plcm9EaWFnKSB7IFwKKyAgICAgdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxFSUdUWVBFLENvbmpMaHMsRUlHVFlQRSxDb25qUmhzLFJvd01ham9yLEJ1aWx0SW4+OjpydW4oIFwKKyAgICAgICBfcm93cywgX2NvbHMsIF9saHMsIGxoc1N0cmlkZSwgX3JocywgcmhzSW5jciwgX3JlcywgcmVzSW5jciwgYWxwaGEsIGJsb2NraW5nKTsgXAorICAgICByZXR1cm47IFwKKyAgIH1cCisgICBJbmRleCBzaXplID0gKHN0ZDo6bWluKShfcm93cyxfY29scyk7IFwKKyAgIEluZGV4IHJvd3MgPSBJc0xvd2VyID8gX3Jvd3MgOiBzaXplOyBcCisgICBJbmRleCBjb2xzID0gSXNMb3dlciA/IHNpemUgOiBfY29sczsgXAorXAorICAgdHlwZWRlZiBWZWN0b3JYIyNFSUdQUkVGSVggVmVjdG9yUmhzOyBcCisgICBFSUdUWVBFICp4LCAqeTtcCitcCisvKiBTZXQgeCovIFwKKyAgIE1hcDxjb25zdCBWZWN0b3JSaHMsIDAsIElubmVyU3RyaWRlPD4gPiByaHMoX3Jocyxjb2xzLElubmVyU3RyaWRlPD4ocmhzSW5jcikpOyBcCisgICBWZWN0b3JSaHMgeF90bXA7IFwKKyAgIGlmIChDb25qUmhzKSB4X3RtcCA9IHJocy5jb25qdWdhdGUoKTsgZWxzZSB4X3RtcCA9IHJoczsgXAorICAgeCA9IHhfdG1wLmRhdGEoKTsgXAorXAorLyogU3F1YXJlIHBhcnQgaGFuZGxpbmcgKi9cCitcCisgICBjaGFyIHRyYW5zLCB1cGxvLCBkaWFnOyBcCisgICBNS0xfSU5UIG0sIG4sIGxkYSwgaW5jeCwgaW5jeTsgXAorICAgRUlHVFlQRSBjb25zdCAqYTsgXAorICAgTUtMVFlQRSBhbHBoYV8sIGJldGFfOyBcCisgICBhc3NpZ25fc2NhbGFyX2VpZzJta2w8TUtMVFlQRSwgRUlHVFlQRT4oYWxwaGFfLCBhbHBoYSk7IFwKKyAgIGFzc2lnbl9zY2FsYXJfZWlnMm1rbDxNS0xUWVBFLCBFSUdUWVBFPihiZXRhXywgRUlHVFlQRSgxKSk7IFwKK1wKKy8qIFNldCBtLCBuICovIFwKKyAgIG4gPSAoTUtMX0lOVClzaXplOyBcCisgICBsZGEgPSBsaHNTdHJpZGU7IFwKKyAgIGluY3ggPSAxOyBcCisgICBpbmN5ID0gcmVzSW5jcjsgXAorXAorLyogU2V0IHVwbG8sIHRyYW5zIGFuZCBkaWFnKi8gXAorICAgdHJhbnMgPSBDb25qTGhzID8gJ0MnIDogJ1QnOyBcCisgICB1cGxvID0gSXNMb3dlciA/ICdVJyA6ICdMJzsgXAorICAgZGlhZyA9IElzVW5pdERpYWcgPyAnVScgOiAnTic7IFwKK1wKKy8qIGNhbGwgP1RSTVYqLyBcCisgICBNS0xQUkVGSVgjI3RybXYoJnVwbG8sICZ0cmFucywgJmRpYWcsICZuLCAoY29uc3QgTUtMVFlQRSopX2xocywgJmxkYSwgKE1LTFRZUEUqKXgsICZpbmN4KTsgXAorXAorLyogQWRkIG9wKGFfdHIpcmhzIGludG8gcmVzKi8gXAorICAgTUtMUFJFRklYIyNheHB5KCZuLCAmYWxwaGFfLChjb25zdCBNS0xUWVBFKil4LCAmaW5jeCwgKE1LTFRZUEUqKV9yZXMsICZpbmN5KTsgXAorLyogTm9uLXNxdWFyZSBjYXNlIC0gZG9lc24ndCBmaXQgdG8gTUtMID9UUk1WLiBGYWxsIHRvIGRlZmF1bHQgdHJpYW5ndWxhciBwcm9kdWN0Ki8gXAorICAgaWYgKHNpemU8KHN0ZDo6bWF4KShyb3dzLGNvbHMpKSB7IFwKKyAgICAgdHlwZWRlZiBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYz4gTWF0cml4TGhzOyBcCisgICAgIGlmIChDb25qUmhzKSB4X3RtcCA9IHJocy5jb25qdWdhdGUoKTsgZWxzZSB4X3RtcCA9IHJoczsgXAorICAgICB4ID0geF90bXAuZGF0YSgpOyBcCisgICAgIGlmIChzaXplPHJvd3MpIHsgXAorICAgICAgIHkgPSBfcmVzICsgc2l6ZSpyZXNJbmNyOyBcCisgICAgICAgYSA9IF9saHMgKyBzaXplKmxkYTsgXAorICAgICAgIG0gPSByb3dzLXNpemU7IFwKKyAgICAgICBuID0gc2l6ZTsgXAorICAgICB9IFwKKyAgICAgZWxzZSB7IFwKKyAgICAgICB4ICs9IHNpemU7IFwKKyAgICAgICB5ID0gX3JlczsgXAorICAgICAgIGEgPSBfbGhzICsgc2l6ZTsgXAorICAgICAgIG0gPSBzaXplOyBcCisgICAgICAgbiA9IGNvbHMtc2l6ZTsgXAorICAgICB9IFwKKyAgICAgTUtMUFJFRklYIyNnZW12KCZ0cmFucywgJm4sICZtLCAmYWxwaGFfLCAoY29uc3QgTUtMVFlQRSopYSwgJmxkYSwgKGNvbnN0IE1LTFRZUEUqKXgsICZpbmN4LCAmYmV0YV8sIChNS0xUWVBFKil5LCAmaW5jeSk7IFwKKyAgIH0gXAorICB9IFwKK307CisKK0VJR0VOX01LTF9UUk1WX1JNKGRvdWJsZSwgZG91YmxlLCBkLCBkKQorRUlHRU5fTUtMX1RSTVZfUk0oZGNvbXBsZXgsIE1LTF9Db21wbGV4MTYsIGNkLCB6KQorRUlHRU5fTUtMX1RSTVZfUk0oZmxvYXQsIGZsb2F0LCBmLCBzKQorRUlHRU5fTUtMX1RSTVZfUk0oc2NvbXBsZXgsIE1LTF9Db21wbGV4OCwgY2YsIGMpCisKK30gLy8gZW5kIG5hbWVzcGFzZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1RSSUFOR1VMQVJfTUFUUklYX1ZFQ1RPUl9NS0xfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhclNvbHZlck1hdHJpeC5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhclNvbHZlck1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWVhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyU29sdmVyTWF0cml4LmgKQEAgLTAsMCArMSwzMTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UUklBTkdVTEFSX1NPTFZFUl9NQVRSSVhfSAorI2RlZmluZSBFSUdFTl9UUklBTkdVTEFSX1NPTFZFUl9NQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gaWYgdGhlIHJocyBpcyByb3cgbWFqb3IsIGxldCdzIHRyYW5zcG9zZSB0aGUgcHJvZHVjdAordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTaWRlLCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBUcmlTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLEluZGV4LFNpZGUsTW9kZSxDb25qdWdhdGUsVHJpU3RvcmFnZU9yZGVyLFJvd01ham9yPgoreworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oCisgICAgSW5kZXggc2l6ZSwgSW5kZXggY29scywKKyAgICBjb25zdCBTY2FsYXIqICB0cmksIEluZGV4IHRyaVN0cmlkZSwKKyAgICBTY2FsYXIqIF9vdGhlciwgSW5kZXggb3RoZXJTdHJpZGUsCisgICAgbGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiBibG9ja2luZykKKyAgeworICAgIHRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PAorICAgICAgU2NhbGFyLCBJbmRleCwgU2lkZT09T25UaGVMZWZ0P09uVGhlUmlnaHQ6T25UaGVMZWZ0LAorICAgICAgKE1vZGUmVW5pdERpYWcpIHwgKChNb2RlJlVwcGVyKSA/IExvd2VyIDogVXBwZXIpLAorICAgICAgTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCAmJiBDb25qdWdhdGUsCisgICAgICBUcmlTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gQ29sTWFqb3IgOiBSb3dNYWpvciwgQ29sTWFqb3I+CisgICAgICA6OnJ1bihzaXplLCBjb2xzLCB0cmksIHRyaVN0cmlkZSwgX290aGVyLCBvdGhlclN0cmlkZSwgYmxvY2tpbmcpOworICB9Cit9OworCisvKiBPcHRpbWl6ZWQgdHJpYW5ndWxhciBzb2x2ZXIgd2l0aCBtdWx0aXBsZSByaWdodCBoYW5kIHNpZGUgYW5kIHRoZSB0cmlhbmd1bGFyIG1hdHJpeCBvbiB0aGUgbGVmdAorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlLCBpbnQgVHJpU3RvcmFnZU9yZGVyPgorc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixJbmRleCxPblRoZUxlZnQsTW9kZSxDb25qdWdhdGUsVHJpU3RvcmFnZU9yZGVyLENvbE1ham9yPgoreworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oCisgICAgSW5kZXggc2l6ZSwgSW5kZXggb3RoZXJTaXplLAorICAgIGNvbnN0IFNjYWxhciogX3RyaSwgSW5kZXggdHJpU3RyaWRlLAorICAgIFNjYWxhciogX290aGVyLCBJbmRleCBvdGhlclN0cmlkZSwKKyAgICBsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mIGJsb2NraW5nKQorICB7CisgICAgSW5kZXggY29scyA9IG90aGVyU2l6ZTsKKyAgICBjb25zdF9ibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIFRyaVN0b3JhZ2VPcmRlcj4gdHJpKF90cmksdHJpU3RyaWRlKTsKKyAgICBibGFzX2RhdGFfbWFwcGVyPFNjYWxhciwgSW5kZXgsIENvbE1ham9yPiBvdGhlcihfb3RoZXIsb3RoZXJTdHJpZGUpOworCisgICAgdHlwZWRlZiBnZWJwX3RyYWl0czxTY2FsYXIsU2NhbGFyPiBUcmFpdHM7CisgICAgZW51bSB7CisgICAgICBTbWFsbFBhbmVsV2lkdGggICA9IEVJR0VOX1BMQUlOX0VOVU1fTUFYKFRyYWl0czo6bXIsVHJhaXRzOjpuciksCisgICAgICBJc0xvd2VyID0gKE1vZGUmTG93ZXIpID09IExvd2VyCisgICAgfTsKKworICAgIEluZGV4IGtjID0gYmxvY2tpbmcua2MoKTsgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgSyBkaXJlY3Rpb24KKyAgICBJbmRleCBtYyA9IChzdGQ6Om1pbikoc2l6ZSxibG9ja2luZy5tYygpKTsgIC8vIGNhY2hlIGJsb2NrIHNpemUgYWxvbmcgdGhlIE0gZGlyZWN0aW9uCisKKyAgICBzdGQ6OnNpemVfdCBzaXplQSA9IGtjKm1jOworICAgIHN0ZDo6c2l6ZV90IHNpemVCID0ga2MqY29sczsKKyAgICBzdGQ6OnNpemVfdCBzaXplVyA9IGtjKlRyYWl0czo6V29ya1NwYWNlRmFjdG9yOworCisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFNjYWxhciwgYmxvY2tBLCBzaXplQSwgYmxvY2tpbmcuYmxvY2tBKCkpOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGJsb2NrQiwgc2l6ZUIsIGJsb2NraW5nLmJsb2NrQigpKTsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBibG9ja1csIHNpemVXLCBibG9ja2luZy5ibG9ja1coKSk7CisKKyAgICBjb25qX2lmPENvbmp1Z2F0ZT4gY29uajsKKyAgICBnZWJwX2tlcm5lbDxTY2FsYXIsIFNjYWxhciwgSW5kZXgsIFRyYWl0czo6bXIsIFRyYWl0czo6bnIsIENvbmp1Z2F0ZSwgZmFsc2U+IGdlYnBfa2VybmVsOworICAgIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgVHJpU3RvcmFnZU9yZGVyPiBwYWNrX2xoczsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFRyYWl0czo6bnIsIENvbE1ham9yLCBmYWxzZSwgdHJ1ZT4gcGFja19yaHM7CisKKyAgICAvLyB0aGUgZ29hbCBoZXJlIGlzIHRvIHN1YmRpdmlzZSB0aGUgUmhzIHBhbmVscyBzdWNoIHRoYXQgd2Uga2VlcCBzb21lIGNhY2hlCisgICAgLy8gY29oZXJlbmNlIHdoZW4gYWNjZXNzaW5nIHRoZSByaHMgZWxlbWVudHMKKyAgICBzdGQ6OnB0cmRpZmZfdCBsMSwgbDI7CisgICAgbWFuYWdlX2NhY2hpbmdfc2l6ZXMoR2V0QWN0aW9uLCAmbDEsICZsMik7CisgICAgSW5kZXggc3ViY29scyA9IGNvbHM+MCA/IGwyLyg0ICogc2l6ZW9mKFNjYWxhcikgKiBvdGhlclN0cmlkZSkgOiAwOworICAgIHN1YmNvbHMgPSBzdGQ6Om1heDxJbmRleD4oKHN1YmNvbHMvVHJhaXRzOjpucikqVHJhaXRzOjpuciwgVHJhaXRzOjpucik7CisKKyAgICBmb3IoSW5kZXggazI9SXNMb3dlciA/IDAgOiBzaXplOworICAgICAgICBJc0xvd2VyID8gazI8c2l6ZSA6IGsyPjA7CisgICAgICAgIElzTG93ZXIgPyBrMis9a2MgOiBrMi09a2MpCisgICAgeworICAgICAgY29uc3QgSW5kZXggYWN0dWFsX2tjID0gKHN0ZDo6bWluKShJc0xvd2VyID8gc2l6ZS1rMiA6IGsyLCBrYyk7CisKKyAgICAgIC8vIFdlIGhhdmUgc2VsZWN0ZWQgYW5kIHBhY2tlZCBhIGJpZyBob3Jpem9udGFsIHBhbmVsIFIxIG9mIHJocy4gTGV0IEIgYmUgdGhlIHBhY2tlZCBjb3B5IG9mIHRoaXMgcGFuZWwsCisgICAgICAvLyBhbmQgUjIgdGhlIHJlbWFpbmluZyBwYXJ0IG9mIHJocy4gVGhlIGNvcnJlc3BvbmRpbmcgdmVydGljYWwgcGFuZWwgb2YgbGhzIGlzIHNwbGl0IGludG8KKyAgICAgIC8vIEExMSAodGhlIHRyaWFuZ3VsYXIgcGFydCkgYW5kIEEyMSB0aGUgcmVtYWluaW5nIHJlY3Rhbmd1bGFyIHBhcnQuCisgICAgICAvLyBUaGVuIHRoZSBoaWdoIGxldmVsIGFsZ29yaXRobSBpczoKKyAgICAgIC8vICAtIEIgPSBSMSAgICAgICAgICAgICAgICAgICAgPT4gZ2VuZXJhbCBibG9jayBjb3B5IChkb25lIGR1cmluZyB0aGUgbmV4dCBzdGVwKQorICAgICAgLy8gIC0gUjEgPSBBMTFeLTEgQiAgICAgICAgICAgICA9PiB0cmlja3kgcGFydAorICAgICAgLy8gIC0gdXBkYXRlIEIgZnJvbSB0aGUgbmV3IFIxICA9PiBhY3R1YWxseSB0aGlzIGhhcyB0byBiZSBwZXJmb3JtZWQgY29udGludW91c2x5IGR1cmluZyB0aGUgYWJvdmUgc3RlcAorICAgICAgLy8gIC0gUjIgLT0gQTIxICogQiAgICAgICAgICAgICA9PiBHRVBQCisKKyAgICAgIC8vIFRoZSB0cmlja3kgcGFydDogY29tcHV0ZSBSMSA9IEExMV4tMSBCIHdoaWxlIHVwZGF0aW5nIEIgZnJvbSBSMQorICAgICAgLy8gVGhlIGlkZWEgaXMgdG8gc3BsaXQgQTExIGludG8gbXVsdGlwbGUgc21hbGwgdmVydGljYWwgcGFuZWxzLgorICAgICAgLy8gRWFjaCBwYW5lbCBjYW4gYmUgc3BsaXQgaW50byBhIHNtYWxsIHRyaWFuZ3VsYXIgcGFydCBUMWsgd2hpY2ggaXMgcHJvY2Vzc2VkIHdpdGhvdXQgb3B0aW1pemF0aW9uLAorICAgICAgLy8gYW5kIHRoZSByZW1haW5pbmcgc21hbGwgcGFydCBUMmsgd2hpY2ggaXMgcHJvY2Vzc2VkIHVzaW5nIGdlYnAgd2l0aCBhcHByb3ByaWF0ZSBibG9jayBzdHJpZGVzCisgICAgICBmb3IoSW5kZXggajI9MDsgajI8Y29sczsgajIrPXN1YmNvbHMpCisgICAgICB7CisgICAgICAgIEluZGV4IGFjdHVhbF9jb2xzID0gKHN0ZDo6bWluKShjb2xzLWoyLHN1YmNvbHMpOworICAgICAgICAvLyBmb3IgZWFjaCBzbWFsbCB2ZXJ0aWNhbCBwYW5lbHMgW1Qxa15ULCBUMmteVF1eVCBvZiBsaHMKKyAgICAgICAgZm9yIChJbmRleCBrMT0wOyBrMTxhY3R1YWxfa2M7IGsxKz1TbWFsbFBhbmVsV2lkdGgpCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCBhY3R1YWxQYW5lbFdpZHRoID0gc3RkOjptaW48SW5kZXg+KGFjdHVhbF9rYy1rMSwgU21hbGxQYW5lbFdpZHRoKTsKKyAgICAgICAgICAvLyB0ciBzb2x2ZQorICAgICAgICAgIGZvciAoSW5kZXggaz0wOyBrPGFjdHVhbFBhbmVsV2lkdGg7ICsraykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIHdyaXRlIGEgc21hbGwga2VybmVsIGhhbmRsaW5nIHRoaXMgKGNhbiBiZSBzaGFyZWQgd2l0aCB0cnN2KQorICAgICAgICAgICAgSW5kZXggaSAgPSBJc0xvd2VyID8gazIrazErayA6IGsyLWsxLWstMTsKKyAgICAgICAgICAgIEluZGV4IHMgID0gSXNMb3dlciA/IGsyK2sxIDogaSsxOworICAgICAgICAgICAgSW5kZXggcnMgPSBhY3R1YWxQYW5lbFdpZHRoIC0gayAtIDE7IC8vIHJlbWFpbmluZyBzaXplCisKKyAgICAgICAgICAgIFNjYWxhciBhID0gKE1vZGUgJiBVbml0RGlhZykgPyBTY2FsYXIoMSkgOiBTY2FsYXIoMSkvY29uaih0cmkoaSxpKSk7CisgICAgICAgICAgICBmb3IgKEluZGV4IGo9ajI7IGo8ajIrYWN0dWFsX2NvbHM7ICsraikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKFRyaVN0b3JhZ2VPcmRlcj09Um93TWFqb3IpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2FsYXIgYigwKTsKKyAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXIqIGwgPSAmdHJpKGkscyk7CisgICAgICAgICAgICAgICAgU2NhbGFyKiByID0gJm90aGVyKHMsaik7CisgICAgICAgICAgICAgICAgZm9yIChJbmRleCBpMz0wOyBpMzxrOyArK2kzKQorICAgICAgICAgICAgICAgICAgYiArPSBjb25qKGxbaTNdKSAqIHJbaTNdOworCisgICAgICAgICAgICAgICAgb3RoZXIoaSxqKSA9IChvdGhlcihpLGopIC0gYikqYTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbmRleCBzID0gSXNMb3dlciA/IGkrMSA6IGktcnM7CisgICAgICAgICAgICAgICAgU2NhbGFyIGIgPSAob3RoZXIoaSxqKSAqPSBhKTsKKyAgICAgICAgICAgICAgICBTY2FsYXIqIHIgPSAmb3RoZXIocyxqKTsKKyAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXIqIGwgPSAmdHJpKHMsaSk7CisgICAgICAgICAgICAgICAgZm9yIChJbmRleCBpMz0wO2kzPHJzOysraTMpCisgICAgICAgICAgICAgICAgICByW2kzXSAtPSBiICogY29uaihsW2kzXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBJbmRleCBsZW5ndGhUYXJnZXQgPSBhY3R1YWxfa2MtazEtYWN0dWFsUGFuZWxXaWR0aDsKKyAgICAgICAgICBJbmRleCBzdGFydEJsb2NrICAgPSBJc0xvd2VyID8gazIrazEgOiBrMi1rMS1hY3R1YWxQYW5lbFdpZHRoOworICAgICAgICAgIEluZGV4IGJsb2NrQk9mZnNldCA9IElzTG93ZXIgPyBrMSA6IGxlbmd0aFRhcmdldDsKKworICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcmVzcGVjdGl2ZSByb3dzIG9mIEIgZnJvbSBvdGhlcgorICAgICAgICAgIHBhY2tfcmhzKGJsb2NrQithY3R1YWxfa2MqajIsICZvdGhlcihzdGFydEJsb2NrLGoyKSwgb3RoZXJTdHJpZGUsIGFjdHVhbFBhbmVsV2lkdGgsIGFjdHVhbF9jb2xzLCBhY3R1YWxfa2MsIGJsb2NrQk9mZnNldCk7CisKKyAgICAgICAgICAvLyBHRUJQCisgICAgICAgICAgaWYgKGxlbmd0aFRhcmdldD4wKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4IHN0YXJ0VGFyZ2V0ICA9IElzTG93ZXIgPyBrMitrMSthY3R1YWxQYW5lbFdpZHRoIDogazItYWN0dWFsX2tjOworCisgICAgICAgICAgICBwYWNrX2xocyhibG9ja0EsICZ0cmkoc3RhcnRUYXJnZXQsc3RhcnRCbG9jayksIHRyaVN0cmlkZSwgYWN0dWFsUGFuZWxXaWR0aCwgbGVuZ3RoVGFyZ2V0KTsKKworICAgICAgICAgICAgZ2VicF9rZXJuZWwoJm90aGVyKHN0YXJ0VGFyZ2V0LGoyKSwgb3RoZXJTdHJpZGUsIGJsb2NrQSwgYmxvY2tCK2FjdHVhbF9rYypqMiwgbGVuZ3RoVGFyZ2V0LCBhY3R1YWxQYW5lbFdpZHRoLCBhY3R1YWxfY29scywgU2NhbGFyKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFBhbmVsV2lkdGgsIGFjdHVhbF9rYywgMCwgYmxvY2tCT2Zmc2V0LCBibG9ja1cpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICAvLyBSMiAtPSBBMjEgKiBCID0+IEdFUFAKKyAgICAgIHsKKyAgICAgICAgSW5kZXggc3RhcnQgPSBJc0xvd2VyID8gazIra2MgOiAwOworICAgICAgICBJbmRleCBlbmQgICA9IElzTG93ZXIgPyBzaXplIDogazIta2M7CisgICAgICAgIGZvcihJbmRleCBpMj1zdGFydDsgaTI8ZW5kOyBpMis9bWMpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBJbmRleCBhY3R1YWxfbWMgPSAoc3RkOjptaW4pKG1jLGVuZC1pMik7CisgICAgICAgICAgaWYgKGFjdHVhbF9tYz4wKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBhY2tfbGhzKGJsb2NrQSwgJnRyaShpMiwgSXNMb3dlciA/IGsyIDogazIta2MpLCB0cmlTdHJpZGUsIGFjdHVhbF9rYywgYWN0dWFsX21jKTsKKworICAgICAgICAgICAgZ2VicF9rZXJuZWwoX290aGVyK2kyLCBvdGhlclN0cmlkZSwgYmxvY2tBLCBibG9ja0IsIGFjdHVhbF9tYywgYWN0dWFsX2tjLCBjb2xzLCBTY2FsYXIoLTEpLCAtMSwgLTEsIDAsIDAsIGJsb2NrVyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9OworCisvKiBPcHRpbWl6ZWQgdHJpYW5ndWxhciBzb2x2ZXIgd2l0aCBtdWx0aXBsZSBsZWZ0IGhhbmQgc2lkZXMgYW5kIHRoZSB0cmluYWd1bGFyIG1hdHJpeCBvbiB0aGUgcmlnaHQKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCBib29sIENvbmp1Z2F0ZSwgaW50IFRyaVN0b3JhZ2VPcmRlcj4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsSW5kZXgsT25UaGVSaWdodCxNb2RlLENvbmp1Z2F0ZSxUcmlTdG9yYWdlT3JkZXIsQ29sTWFqb3I+Cit7CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHJ1bigKKyAgICBJbmRleCBzaXplLCBJbmRleCBvdGhlclNpemUsCisgICAgY29uc3QgU2NhbGFyKiBfdHJpLCBJbmRleCB0cmlTdHJpZGUsCisgICAgU2NhbGFyKiBfb3RoZXIsIEluZGV4IG90aGVyU3RyaWRlLAorICAgIGxldmVsM19ibG9ja2luZzxTY2FsYXIsU2NhbGFyPiYgYmxvY2tpbmcpCisgIHsKKyAgICBJbmRleCByb3dzID0gb3RoZXJTaXplOworICAgIGNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgVHJpU3RvcmFnZU9yZGVyPiByaHMoX3RyaSx0cmlTdHJpZGUpOworICAgIGJsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgQ29sTWFqb3I+IGxocyhfb3RoZXIsb3RoZXJTdHJpZGUpOworCisgICAgdHlwZWRlZiBnZWJwX3RyYWl0czxTY2FsYXIsU2NhbGFyPiBUcmFpdHM7CisgICAgZW51bSB7CisgICAgICBSaHNTdG9yYWdlT3JkZXIgICA9IFRyaVN0b3JhZ2VPcmRlciwKKyAgICAgIFNtYWxsUGFuZWxXaWR0aCAgID0gRUlHRU5fUExBSU5fRU5VTV9NQVgoVHJhaXRzOjptcixUcmFpdHM6Om5yKSwKKyAgICAgIElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPT0gTG93ZXIKKyAgICB9OworCisgICAgSW5kZXgga2MgPSBibG9ja2luZy5rYygpOyAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBibG9jayBzaXplIGFsb25nIHRoZSBLIGRpcmVjdGlvbgorICAgIEluZGV4IG1jID0gKHN0ZDo6bWluKShyb3dzLGJsb2NraW5nLm1jKCkpOyAgLy8gY2FjaGUgYmxvY2sgc2l6ZSBhbG9uZyB0aGUgTSBkaXJlY3Rpb24KKworICAgIHN0ZDo6c2l6ZV90IHNpemVBID0ga2MqbWM7CisgICAgc3RkOjpzaXplX3Qgc2l6ZUIgPSBrYypzaXplOworICAgIHN0ZDo6c2l6ZV90IHNpemVXID0ga2MqVHJhaXRzOjpXb3JrU3BhY2VGYWN0b3I7CisKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoU2NhbGFyLCBibG9ja0EsIHNpemVBLCBibG9ja2luZy5ibG9ja0EoKSk7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFNjYWxhciwgYmxvY2tCLCBzaXplQiwgYmxvY2tpbmcuYmxvY2tCKCkpOworICAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShTY2FsYXIsIGJsb2NrVywgc2l6ZVcsIGJsb2NraW5nLmJsb2NrVygpKTsKKworICAgIGNvbmpfaWY8Q29uanVnYXRlPiBjb25qOworICAgIGdlYnBfa2VybmVsPFNjYWxhcixTY2FsYXIsIEluZGV4LCBUcmFpdHM6Om1yLCBUcmFpdHM6Om5yLCBmYWxzZSwgQ29uanVnYXRlPiBnZWJwX2tlcm5lbDsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFRyYWl0czo6bnIsUmhzU3RvcmFnZU9yZGVyPiBwYWNrX3JoczsKKyAgICBnZW1tX3BhY2tfcmhzPFNjYWxhciwgSW5kZXgsIFRyYWl0czo6bnIsUmhzU3RvcmFnZU9yZGVyLGZhbHNlLHRydWU+IHBhY2tfcmhzX3BhbmVsOworICAgIGdlbW1fcGFja19saHM8U2NhbGFyLCBJbmRleCwgVHJhaXRzOjptciwgVHJhaXRzOjpMaHNQcm9ncmVzcywgQ29sTWFqb3IsIGZhbHNlLCB0cnVlPiBwYWNrX2xoc19wYW5lbDsKKworICAgIGZvcihJbmRleCBrMj1Jc0xvd2VyID8gc2l6ZSA6IDA7CisgICAgICAgIElzTG93ZXIgPyBrMj4wIDogazI8c2l6ZTsKKyAgICAgICAgSXNMb3dlciA/IGsyLT1rYyA6IGsyKz1rYykKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBhY3R1YWxfa2MgPSAoc3RkOjptaW4pKElzTG93ZXIgPyBrMiA6IHNpemUtazIsIGtjKTsKKyAgICAgIEluZGV4IGFjdHVhbF9rMiA9IElzTG93ZXIgPyBrMi1hY3R1YWxfa2MgOiBrMiA7CisKKyAgICAgIEluZGV4IHN0YXJ0UGFuZWwgPSBJc0xvd2VyID8gMCA6IGsyK2FjdHVhbF9rYzsKKyAgICAgIEluZGV4IHJzID0gSXNMb3dlciA/IGFjdHVhbF9rMiA6IHNpemUgLSBhY3R1YWxfazIgLSBhY3R1YWxfa2M7CisgICAgICBTY2FsYXIqIGdlYiA9IGJsb2NrQithY3R1YWxfa2MqYWN0dWFsX2tjOworCisgICAgICBpZiAocnM+MCkgcGFja19yaHMoZ2ViLCAmcmhzKGFjdHVhbF9rMixzdGFydFBhbmVsKSwgdHJpU3RyaWRlLCBhY3R1YWxfa2MsIHJzKTsKKworICAgICAgLy8gdHJpYW5ndWxhciBwYWNraW5nICh3ZSBvbmx5IHBhY2sgdGhlIHBhbmVscyBvZmYgdGhlIGRpYWdvbmFsLAorICAgICAgLy8gbmVnbGVjdGluZyB0aGUgYmxvY2tzIG92ZXJsYXBwaW5nIHRoZSBkaWFnb25hbAorICAgICAgeworICAgICAgICBmb3IgKEluZGV4IGoyPTA7IGoyPGFjdHVhbF9rYzsgajIrPVNtYWxsUGFuZWxXaWR0aCkKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSBzdGQ6Om1pbjxJbmRleD4oYWN0dWFsX2tjLWoyLCBTbWFsbFBhbmVsV2lkdGgpOworICAgICAgICAgIEluZGV4IGFjdHVhbF9qMiA9IGFjdHVhbF9rMiArIGoyOworICAgICAgICAgIEluZGV4IHBhbmVsT2Zmc2V0ID0gSXNMb3dlciA/IGoyK2FjdHVhbFBhbmVsV2lkdGggOiAwOworICAgICAgICAgIEluZGV4IHBhbmVsTGVuZ3RoID0gSXNMb3dlciA/IGFjdHVhbF9rYy1qMi1hY3R1YWxQYW5lbFdpZHRoIDogajI7CisKKyAgICAgICAgICBpZiAocGFuZWxMZW5ndGg+MCkKKyAgICAgICAgICBwYWNrX3Joc19wYW5lbChibG9ja0IrajIqYWN0dWFsX2tjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyaHMoYWN0dWFsX2syK3BhbmVsT2Zmc2V0LCBhY3R1YWxfajIpLCB0cmlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxMZW5ndGgsIGFjdHVhbFBhbmVsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2tjLCBwYW5lbE9mZnNldCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yKEluZGV4IGkyPTA7IGkyPHJvd3M7IGkyKz1tYykKKyAgICAgIHsKKyAgICAgICAgY29uc3QgSW5kZXggYWN0dWFsX21jID0gKHN0ZDo6bWluKShtYyxyb3dzLWkyKTsKKworICAgICAgICAvLyB0cmlhbmd1bGFyIHNvbHZlciBrZXJuZWwKKyAgICAgICAgeworICAgICAgICAgIC8vIGZvciBlYWNoIHNtYWxsIGJsb2NrIG9mIHRoZSBkaWFnb25hbCAoPT4gdmVydGljYWwgcGFuZWxzIG9mIHJocykKKyAgICAgICAgICBmb3IgKEluZGV4IGoyID0gSXNMb3dlcgorICAgICAgICAgICAgICAgICAgICAgID8gKGFjdHVhbF9rYyAtICgoYWN0dWFsX2tjJVNtYWxsUGFuZWxXaWR0aCkgPyBJbmRleChhY3R1YWxfa2MlU21hbGxQYW5lbFdpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbmRleChTbWFsbFBhbmVsV2lkdGgpKSkKKyAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgICAgICAgICBJc0xvd2VyID8gajI+PTAgOiBqMjxhY3R1YWxfa2M7CisgICAgICAgICAgICAgICBJc0xvd2VyID8gajItPVNtYWxsUGFuZWxXaWR0aCA6IGoyKz1TbWFsbFBhbmVsV2lkdGgpCisgICAgICAgICAgeworICAgICAgICAgICAgSW5kZXggYWN0dWFsUGFuZWxXaWR0aCA9IHN0ZDo6bWluPEluZGV4PihhY3R1YWxfa2MtajIsIFNtYWxsUGFuZWxXaWR0aCk7CisgICAgICAgICAgICBJbmRleCBhYnNvbHV0ZV9qMiA9IGFjdHVhbF9rMiArIGoyOworICAgICAgICAgICAgSW5kZXggcGFuZWxPZmZzZXQgPSBJc0xvd2VyID8gajIrYWN0dWFsUGFuZWxXaWR0aCA6IDA7CisgICAgICAgICAgICBJbmRleCBwYW5lbExlbmd0aCA9IElzTG93ZXIgPyBhY3R1YWxfa2MgLSBqMiAtIGFjdHVhbFBhbmVsV2lkdGggOiBqMjsKKworICAgICAgICAgICAgLy8gR0VCUAorICAgICAgICAgICAgaWYocGFuZWxMZW5ndGg+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZ2VicF9rZXJuZWwoJmxocyhpMixhYnNvbHV0ZV9qMiksIG90aGVyU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0EsIGJsb2NrQitqMiphY3R1YWxfa2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9tYywgcGFuZWxMZW5ndGgsIGFjdHVhbFBhbmVsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhcigtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9rYywgYWN0dWFsX2tjLCAvLyBzdHJpZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsT2Zmc2V0LCBwYW5lbE9mZnNldCwgLy8gb2Zmc2V0cworICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1cpOyAgLy8gd29ya3NwYWNlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVuYmxvY2tlZCB0cmlhbmd1bGFyIHNvbHZlCisgICAgICAgICAgICBmb3IgKEluZGV4IGs9MDsgazxhY3R1YWxQYW5lbFdpZHRoOyArK2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEluZGV4IGogPSBJc0xvd2VyID8gYWJzb2x1dGVfajIrYWN0dWFsUGFuZWxXaWR0aC1rLTEgOiBhYnNvbHV0ZV9qMitrOworCisgICAgICAgICAgICAgIFNjYWxhciogciA9ICZsaHMoaTIsaik7CisgICAgICAgICAgICAgIGZvciAoSW5kZXggazM9MDsgazM8azsgKytrMykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjYWxhciBiID0gY29uaihyaHMoSXNMb3dlciA/IGorMStrMyA6IGFic29sdXRlX2oyK2szLGopKTsKKyAgICAgICAgICAgICAgICBTY2FsYXIqIGEgPSAmbGhzKGkyLElzTG93ZXIgPyBqKzErazMgOiBhYnNvbHV0ZV9qMitrMyk7CisgICAgICAgICAgICAgICAgZm9yIChJbmRleCBpPTA7IGk8YWN0dWFsX21jOyArK2kpCisgICAgICAgICAgICAgICAgICByW2ldIC09IGFbaV0gKiBiOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFNjYWxhciBiID0gKE1vZGUgJiBVbml0RGlhZykgPyBTY2FsYXIoMSkgOiBTY2FsYXIoMSkvY29uaihyaHMoaixqKSk7CisgICAgICAgICAgICAgIGZvciAoSW5kZXggaT0wOyBpPGFjdHVhbF9tYzsgKytpKQorICAgICAgICAgICAgICAgIHJbaV0gKj0gYjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcGFjayB0aGUganVzdCBjb21wdXRlZCBwYXJ0IG9mIGxocyB0byBBCisgICAgICAgICAgICBwYWNrX2xoc19wYW5lbChibG9ja0EsIF9vdGhlcithYnNvbHV0ZV9qMipvdGhlclN0cmlkZStpMiwgb3RoZXJTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxQYW5lbFdpZHRoLCBhY3R1YWxfbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfa2MsIGoyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocnM+MCkKKyAgICAgICAgICBnZWJwX2tlcm5lbChfb3RoZXIraTIrc3RhcnRQYW5lbCpvdGhlclN0cmlkZSwgb3RoZXJTdHJpZGUsIGJsb2NrQSwgZ2ViLAorICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF9tYywgYWN0dWFsX2tjLCBycywgU2NhbGFyKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIDAsIDAsIGJsb2NrVyk7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUklBTkdVTEFSX1NPTFZFUl9NQVRSSVhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhclNvbHZlck1hdHJpeF9NS0wuaCBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJTb2x2ZXJNYXRyaXhfTUtMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmNTA4YgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3Byb2R1Y3RzL1RyaWFuZ3VsYXJTb2x2ZXJNYXRyaXhfTUtMLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBJbnRlbChSKSBNS0wKKyAqICAgVHJpYW5ndWxhciBtYXRyaXggKiBtYXRyaXggcHJvZHVjdCBmdW5jdGlvbmFsaXR5IGJhc2VkIG9uID9UUk1NLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX1RSSUFOR1VMQVJfU09MVkVSX01BVFJJWF9NS0xfSAorI2RlZmluZSBFSUdFTl9UUklBTkdVTEFSX1NPTFZFUl9NQVRSSVhfTUtMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gaW1wbGVtZW50cyBMZWZ0U2lkZSBvcCh0cmlhbmd1bGFyKV4tMSAqIGdlbmVyYWwKKyNkZWZpbmUgRUlHRU5fTUtMX1RSU01fTChFSUdUWVBFLCBNS0xUWVBFLCBNS0xQUkVGSVgpIFwKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlLCBpbnQgVHJpU3RvcmFnZU9yZGVyPiBcCitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8RUlHVFlQRSxJbmRleCxPblRoZUxlZnQsTW9kZSxDb25qdWdhdGUsVHJpU3RvcmFnZU9yZGVyLENvbE1ham9yPiBcCit7IFwKKyAgZW51bSB7IFwKKyAgICBJc0xvd2VyID0gKE1vZGUmTG93ZXIpID09IExvd2VyLCBcCisgICAgSXNVbml0RGlhZyAgPSAoTW9kZSZVbml0RGlhZykgPyAxIDogMCwgXAorICAgIElzWmVyb0RpYWcgID0gKE1vZGUmWmVyb0RpYWcpID8gMSA6IDAsIFwKKyAgICBjb25qQSA9ICgoVHJpU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgJiYgQ29uanVnYXRlKSA/IDEgOiAwIFwKKyAgfTsgXAorICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oIFwKKyAgICAgIEluZGV4IHNpemUsIEluZGV4IG90aGVyU2l6ZSwgXAorICAgICAgY29uc3QgRUlHVFlQRSogX3RyaSwgSW5kZXggdHJpU3RyaWRlLCBcCisgICAgICBFSUdUWVBFKiBfb3RoZXIsIEluZGV4IG90aGVyU3RyaWRlLCBsZXZlbDNfYmxvY2tpbmc8RUlHVFlQRSxFSUdUWVBFPiYgLypibG9ja2luZyovKSBcCisgIHsgXAorICAgTUtMX0lOVCBtID0gc2l6ZSwgbiA9IG90aGVyU2l6ZSwgbGRhLCBsZGI7IFwKKyAgIGNoYXIgc2lkZSA9ICdMJywgdXBsbywgZGlhZz0nTicsIHRyYW5zYTsgXAorICAgLyogU2V0IGFscGhhXyAqLyBcCisgICBNS0xUWVBFIGFscGhhOyBcCisgICBFSUdUWVBFIG15b25lKDEpOyBcCisgICBhc3NpZ25fc2NhbGFyX2VpZzJta2woYWxwaGEsIG15b25lKTsgXAorICAgbGRiID0gb3RoZXJTdHJpZGU7XAorXAorICAgY29uc3QgRUlHVFlQRSAqYTsgXAorLyogU2V0IHRyYW5zICovIFwKKyAgIHRyYW5zYSA9IChUcmlTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/ICgoQ29uanVnYXRlKSA/ICdDJyA6ICdUJykgOiAnTic7IFwKKy8qIFNldCB1cGxvICovIFwKKyAgIHVwbG8gPSBJc0xvd2VyID8gJ0wnIDogJ1UnOyBcCisgICBpZiAoVHJpU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgdXBsbyA9ICh1cGxvID09ICdMJykgPyAnVScgOiAnTCc7IFwKKy8qIFNldCBhLCBsZGEgKi8gXAorICAgdHlwZWRlZiBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgVHJpU3RvcmFnZU9yZGVyPiBNYXRyaXhUcmk7IFwKKyAgIE1hcDxjb25zdCBNYXRyaXhUcmksIDAsIE91dGVyU3RyaWRlPD4gPiB0cmkoX3RyaSxzaXplLHNpemUsT3V0ZXJTdHJpZGU8Pih0cmlTdHJpZGUpKTsgXAorICAgTWF0cml4VHJpIGFfdG1wOyBcCitcCisgICBpZiAoY29uakEpIHsgXAorICAgICBhX3RtcCA9IHRyaS5jb25qdWdhdGUoKTsgXAorICAgICBhID0gYV90bXAuZGF0YSgpOyBcCisgICAgIGxkYSA9IGFfdG1wLm91dGVyU3RyaWRlKCk7IFwKKyAgIH0gZWxzZSB7IFwKKyAgICAgYSA9IF90cmk7IFwKKyAgICAgbGRhID0gdHJpU3RyaWRlOyBcCisgICB9IFwKKyAgIGlmIChJc1VuaXREaWFnKSBkaWFnPSdVJzsgXAorLyogY2FsbCA/dHJzbSovIFwKKyAgIE1LTFBSRUZJWCMjdHJzbSgmc2lkZSwgJnVwbG8sICZ0cmFuc2EsICZkaWFnLCAmbSwgJm4sICZhbHBoYSwgKGNvbnN0IE1LTFRZUEUqKWEsICZsZGEsIChNS0xUWVBFKilfb3RoZXIsICZsZGIpOyBcCisgfSBcCit9OworCitFSUdFTl9NS0xfVFJTTV9MKGRvdWJsZSwgZG91YmxlLCBkKQorRUlHRU5fTUtMX1RSU01fTChkY29tcGxleCwgTUtMX0NvbXBsZXgxNiwgeikKK0VJR0VOX01LTF9UUlNNX0woZmxvYXQsIGZsb2F0LCBzKQorRUlHRU5fTUtMX1RSU01fTChzY29tcGxleCwgTUtMX0NvbXBsZXg4LCBjKQorCisKKy8vIGltcGxlbWVudHMgUmlnaHRTaWRlIGdlbmVyYWwgKiBvcCh0cmlhbmd1bGFyKV4tMQorI2RlZmluZSBFSUdFTl9NS0xfVFJTTV9SKEVJR1RZUEUsIE1LTFRZUEUsIE1LTFBSRUZJWCkgXAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBUcmlTdG9yYWdlT3JkZXI+IFwKK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxFSUdUWVBFLEluZGV4LE9uVGhlUmlnaHQsTW9kZSxDb25qdWdhdGUsVHJpU3RvcmFnZU9yZGVyLENvbE1ham9yPiBcCit7IFwKKyAgZW51bSB7IFwKKyAgICBJc0xvd2VyID0gKE1vZGUmTG93ZXIpID09IExvd2VyLCBcCisgICAgSXNVbml0RGlhZyAgPSAoTW9kZSZVbml0RGlhZykgPyAxIDogMCwgXAorICAgIElzWmVyb0RpYWcgID0gKE1vZGUmWmVyb0RpYWcpID8gMSA6IDAsIFwKKyAgICBjb25qQSA9ICgoVHJpU3RvcmFnZU9yZGVyPT1Db2xNYWpvcikgJiYgQ29uanVnYXRlKSA/IDEgOiAwIFwKKyAgfTsgXAorICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBydW4oIFwKKyAgICAgIEluZGV4IHNpemUsIEluZGV4IG90aGVyU2l6ZSwgXAorICAgICAgY29uc3QgRUlHVFlQRSogX3RyaSwgSW5kZXggdHJpU3RyaWRlLCBcCisgICAgICBFSUdUWVBFKiBfb3RoZXIsIEluZGV4IG90aGVyU3RyaWRlLCBsZXZlbDNfYmxvY2tpbmc8RUlHVFlQRSxFSUdUWVBFPiYgLypibG9ja2luZyovKSBcCisgIHsgXAorICAgTUtMX0lOVCBtID0gb3RoZXJTaXplLCBuID0gc2l6ZSwgbGRhLCBsZGI7IFwKKyAgIGNoYXIgc2lkZSA9ICdSJywgdXBsbywgZGlhZz0nTicsIHRyYW5zYTsgXAorICAgLyogU2V0IGFscGhhXyAqLyBcCisgICBNS0xUWVBFIGFscGhhOyBcCisgICBFSUdUWVBFIG15b25lKDEpOyBcCisgICBhc3NpZ25fc2NhbGFyX2VpZzJta2woYWxwaGEsIG15b25lKTsgXAorICAgbGRiID0gb3RoZXJTdHJpZGU7XAorXAorICAgY29uc3QgRUlHVFlQRSAqYTsgXAorLyogU2V0IHRyYW5zICovIFwKKyAgIHRyYW5zYSA9IChUcmlTdG9yYWdlT3JkZXI9PVJvd01ham9yKSA/ICgoQ29uanVnYXRlKSA/ICdDJyA6ICdUJykgOiAnTic7IFwKKy8qIFNldCB1cGxvICovIFwKKyAgIHVwbG8gPSBJc0xvd2VyID8gJ0wnIDogJ1UnOyBcCisgICBpZiAoVHJpU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcikgdXBsbyA9ICh1cGxvID09ICdMJykgPyAnVScgOiAnTCc7IFwKKy8qIFNldCBhLCBsZGEgKi8gXAorICAgdHlwZWRlZiBNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgVHJpU3RvcmFnZU9yZGVyPiBNYXRyaXhUcmk7IFwKKyAgIE1hcDxjb25zdCBNYXRyaXhUcmksIDAsIE91dGVyU3RyaWRlPD4gPiB0cmkoX3RyaSxzaXplLHNpemUsT3V0ZXJTdHJpZGU8Pih0cmlTdHJpZGUpKTsgXAorICAgTWF0cml4VHJpIGFfdG1wOyBcCitcCisgICBpZiAoY29uakEpIHsgXAorICAgICBhX3RtcCA9IHRyaS5jb25qdWdhdGUoKTsgXAorICAgICBhID0gYV90bXAuZGF0YSgpOyBcCisgICAgIGxkYSA9IGFfdG1wLm91dGVyU3RyaWRlKCk7IFwKKyAgIH0gZWxzZSB7IFwKKyAgICAgYSA9IF90cmk7IFwKKyAgICAgbGRhID0gdHJpU3RyaWRlOyBcCisgICB9IFwKKyAgIGlmIChJc1VuaXREaWFnKSBkaWFnPSdVJzsgXAorLyogY2FsbCA/dHJzbSovIFwKKyAgIE1LTFBSRUZJWCMjdHJzbSgmc2lkZSwgJnVwbG8sICZ0cmFuc2EsICZkaWFnLCAmbSwgJm4sICZhbHBoYSwgKGNvbnN0IE1LTFRZUEUqKWEsICZsZGEsIChNS0xUWVBFKilfb3RoZXIsICZsZGIpOyBcCisgICAvKnN0ZDo6Y291dCA8PCAiVFJNU19MIHNwZWNpYWxpemF0aW9uIVxuIjsqLyBcCisgfSBcCit9OworCitFSUdFTl9NS0xfVFJTTV9SKGRvdWJsZSwgZG91YmxlLCBkKQorRUlHRU5fTUtMX1RSU01fUihkY29tcGxleCwgTUtMX0NvbXBsZXgxNiwgeikKK0VJR0VOX01LTF9UUlNNX1IoZmxvYXQsIGZsb2F0LCBzKQorRUlHRU5fTUtMX1RSU01fUihzY29tcGxleCwgTUtMX0NvbXBsZXg4LCBjKQorCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1RSSUFOR1VMQVJfU09MVkVSX01BVFJJWF9NS0xfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oIGIvRWlnZW4vc3JjL0NvcmUvcHJvZHVjdHMvVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNGQxMDAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS9wcm9kdWN0cy9Ucmlhbmd1bGFyU29sdmVyVmVjdG9yLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSSUFOR1VMQVJfU09MVkVSX1ZFQ1RPUl9ICisjZGVmaW5lIEVJR0VOX1RSSUFOR1VMQVJfU09MVkVSX1ZFQ1RPUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsIHR5cGVuYW1lIFJoc1NjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCBib29sIENvbmp1Z2F0ZSwgaW50IFN0b3JhZ2VPcmRlcj4KK3N0cnVjdCB0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIE9uVGhlUmlnaHQsIE1vZGUsIENvbmp1Z2F0ZSwgU3RvcmFnZU9yZGVyPgoreworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgY29uc3QgTGhzU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsIFJoc1NjYWxhciogcmhzKQorICB7CisgICAgdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8TGhzU2NhbGFyLFJoc1NjYWxhcixJbmRleCxPblRoZUxlZnQsCisgICAgICAgICgoTW9kZSZVcHBlcik9PVVwcGVyID8gTG93ZXIgOiBVcHBlcikgfCAoTW9kZSZVbml0RGlhZyksCisgICAgICAgIENvbmp1Z2F0ZSxTdG9yYWdlT3JkZXI9PVJvd01ham9yP0NvbE1ham9yOlJvd01ham9yCisgICAgICA+OjpydW4oc2l6ZSwgX2xocywgbGhzU3RyaWRlLCByaHMpOworICB9Cit9OworICAgIAorLy8gZm9yd2FyZCBhbmQgYmFja3dhcmQgc3Vic3RpdHV0aW9uLCByb3ctbWFqb3IsIHJocyBpcyBhIHZlY3RvcgordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGU+CitzdHJ1Y3QgdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8TGhzU2NhbGFyLCBSaHNTY2FsYXIsIEluZGV4LCBPblRoZUxlZnQsIE1vZGUsIENvbmp1Z2F0ZSwgUm93TWFqb3I+Cit7CisgIGVudW0geworICAgIElzTG93ZXIgPSAoKE1vZGUmTG93ZXIpPT1Mb3dlcikKKyAgfTsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLCBSaHNTY2FsYXIqIHJocykKKyAgeworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IExoc01hcDsKKyAgICBjb25zdCBMaHNNYXAgbGhzKF9saHMsc2l6ZSxzaXplLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25qdWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDx0eXBlbmFtZSBpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxMaHNTY2FsYXI+LExoc01hcD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExoc01hcCY+CisgICAgICAgICAgICAgICAgICAgICAgICA6OnR5cGUgY2pMaHMobGhzKTsKKyAgICBzdGF0aWMgY29uc3QgSW5kZXggUGFuZWxXaWR0aCA9IEVJR0VOX1RVTkVfVFJJQU5HVUxBUl9QQU5FTF9XSURUSDsKKyAgICBmb3IoSW5kZXggcGk9SXNMb3dlciA/IDAgOiBzaXplOworICAgICAgICBJc0xvd2VyID8gcGk8c2l6ZSA6IHBpPjA7CisgICAgICAgIElzTG93ZXIgPyBwaSs9UGFuZWxXaWR0aCA6IHBpLT1QYW5lbFdpZHRoKQorICAgIHsKKyAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSAoc3RkOjptaW4pKElzTG93ZXIgPyBzaXplIC0gcGkgOiBwaSwgUGFuZWxXaWR0aCk7CisKKyAgICAgIEluZGV4IHIgPSBJc0xvd2VyID8gcGkgOiBzaXplIC0gcGk7IC8vIHJlbWFpbmluZyBzaXplCisgICAgICBpZiAociA+IDApCisgICAgICB7CisgICAgICAgIC8vIGxldCdzIGRpcmVjdGx5IGNhbGwgdGhlIGxvdyBsZXZlbCBwcm9kdWN0IGZ1bmN0aW9uIGJlY2F1c2U6CisgICAgICAgIC8vIDEgLSBpdCBpcyBmYXN0ZXIgdG8gY29tcGlsZQorICAgICAgICAvLyAyIC0gaXQgaXMgc2xpZ2hsdHkgZmFzdGVyIGF0IHJ1bnRpbWUKKyAgICAgICAgSW5kZXggc3RhcnRSb3cgPSBJc0xvd2VyID8gcGkgOiBwaS1hY3R1YWxQYW5lbFdpZHRoOworICAgICAgICBJbmRleCBzdGFydENvbCA9IElzTG93ZXIgPyAwIDogcGk7CisKKyAgICAgICAgZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTGhzU2NhbGFyLFJvd01ham9yLENvbmp1Z2F0ZSxSaHNTY2FsYXIsZmFsc2U+OjpydW4oCisgICAgICAgICAgYWN0dWFsUGFuZWxXaWR0aCwgciwKKyAgICAgICAgICAmbGhzLmNvZWZmUmVmKHN0YXJ0Um93LHN0YXJ0Q29sKSwgbGhzU3RyaWRlLAorICAgICAgICAgIHJocyArIHN0YXJ0Q29sLCAxLAorICAgICAgICAgIHJocyArIHN0YXJ0Um93LCAxLAorICAgICAgICAgIFJoc1NjYWxhcigtMSkpOworICAgICAgfQorCisgICAgICBmb3IoSW5kZXggaz0wOyBrPGFjdHVhbFBhbmVsV2lkdGg7ICsraykKKyAgICAgIHsKKyAgICAgICAgSW5kZXggaSA9IElzTG93ZXIgPyBwaStrIDogcGktay0xOworICAgICAgICBJbmRleCBzID0gSXNMb3dlciA/IHBpICAgOiBpKzE7CisgICAgICAgIGlmIChrPjApCisgICAgICAgICAgcmhzW2ldIC09IChjakxocy5yb3coaSkuc2VnbWVudChzLGspLnRyYW5zcG9zZSgpLmN3aXNlUHJvZHVjdChNYXA8Y29uc3QgTWF0cml4PFJoc1NjYWxhcixEeW5hbWljLDE+ID4ocmhzK3MsaykpKS5zdW0oKTsKKyAgICAgICAgCisgICAgICAgIGlmKCEoTW9kZSAmIFVuaXREaWFnKSkKKyAgICAgICAgICByaHNbaV0gLz0gY2pMaHMoaSxpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8vIGZvcndhcmQgYW5kIGJhY2t3YXJkIHN1YnN0aXR1dGlvbiwgY29sdW1uLW1ham9yLCByaHMgaXMgYSB2ZWN0b3IKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlPgorc3RydWN0IHRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgT25UaGVMZWZ0LCBNb2RlLCBDb25qdWdhdGUsIENvbE1ham9yPgoreworICBlbnVtIHsKKyAgICBJc0xvd2VyID0gKChNb2RlJkxvd2VyKT09TG93ZXIpCisgIH07CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBjb25zdCBMaHNTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgUmhzU2NhbGFyKiByaHMpCisgIHsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBMaHNNYXA7CisgICAgY29uc3QgTGhzTWFwIGxocyhfbGhzLHNpemUsc2l6ZSxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOworICAgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxDb25qdWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDx0eXBlbmFtZSBpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxMaHNTY2FsYXI+LExoc01hcD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExoc01hcCYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIGNqTGhzKGxocyk7CisgICAgc3RhdGljIGNvbnN0IEluZGV4IFBhbmVsV2lkdGggPSBFSUdFTl9UVU5FX1RSSUFOR1VMQVJfUEFORUxfV0lEVEg7CisKKyAgICBmb3IoSW5kZXggcGk9SXNMb3dlciA/IDAgOiBzaXplOworICAgICAgICBJc0xvd2VyID8gcGk8c2l6ZSA6IHBpPjA7CisgICAgICAgIElzTG93ZXIgPyBwaSs9UGFuZWxXaWR0aCA6IHBpLT1QYW5lbFdpZHRoKQorICAgIHsKKyAgICAgIEluZGV4IGFjdHVhbFBhbmVsV2lkdGggPSAoc3RkOjptaW4pKElzTG93ZXIgPyBzaXplIC0gcGkgOiBwaSwgUGFuZWxXaWR0aCk7CisgICAgICBJbmRleCBzdGFydEJsb2NrID0gSXNMb3dlciA/IHBpIDogcGktYWN0dWFsUGFuZWxXaWR0aDsKKyAgICAgIEluZGV4IGVuZEJsb2NrID0gSXNMb3dlciA/IHBpICsgYWN0dWFsUGFuZWxXaWR0aCA6IDA7CisKKyAgICAgIGZvcihJbmRleCBrPTA7IGs8YWN0dWFsUGFuZWxXaWR0aDsgKytrKQorICAgICAgeworICAgICAgICBJbmRleCBpID0gSXNMb3dlciA/IHBpK2sgOiBwaS1rLTE7CisgICAgICAgIGlmKCEoTW9kZSAmIFVuaXREaWFnKSkKKyAgICAgICAgICByaHNbaV0gLz0gY2pMaHMuY29lZmYoaSxpKTsKKworICAgICAgICBJbmRleCByID0gYWN0dWFsUGFuZWxXaWR0aCAtIGsgLSAxOyAvLyByZW1haW5pbmcgc2l6ZQorICAgICAgICBJbmRleCBzID0gSXNMb3dlciA/IGkrMSA6IGktcjsKKyAgICAgICAgaWYgKHI+MCkKKyAgICAgICAgICBNYXA8TWF0cml4PFJoc1NjYWxhcixEeW5hbWljLDE+ID4ocmhzK3MscikgLT0gcmhzW2ldICogY2pMaHMuY29sKGkpLnNlZ21lbnQocyxyKTsKKyAgICAgIH0KKyAgICAgIEluZGV4IHIgPSBJc0xvd2VyID8gc2l6ZSAtIGVuZEJsb2NrIDogc3RhcnRCbG9jazsgLy8gcmVtYWluaW5nIHNpemUKKyAgICAgIGlmIChyID4gMCkKKyAgICAgIHsKKyAgICAgICAgLy8gbGV0J3MgZGlyZWN0bHkgY2FsbCB0aGUgbG93IGxldmVsIHByb2R1Y3QgZnVuY3Rpb24gYmVjYXVzZToKKyAgICAgICAgLy8gMSAtIGl0IGlzIGZhc3RlciB0byBjb21waWxlCisgICAgICAgIC8vIDIgLSBpdCBpcyBzbGlnaGx0eSBmYXN0ZXIgYXQgcnVudGltZQorICAgICAgICBnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxJbmRleCxMaHNTY2FsYXIsQ29sTWFqb3IsQ29uanVnYXRlLFJoc1NjYWxhcixmYWxzZT46OnJ1bigKKyAgICAgICAgICAgIHIsIGFjdHVhbFBhbmVsV2lkdGgsCisgICAgICAgICAgICAmbGhzLmNvZWZmUmVmKGVuZEJsb2NrLHN0YXJ0QmxvY2spLCBsaHNTdHJpZGUsCisgICAgICAgICAgICByaHMrc3RhcnRCbG9jaywgMSwKKyAgICAgICAgICAgIHJocytlbmRCbG9jaywgMSwgUmhzU2NhbGFyKC0xKSk7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUklBTkdVTEFSX1NPTFZFUl9WRUNUT1JfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9CbGFzVXRpbC5oIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9CbGFzVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDk2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS91dGlsL0JsYXNVdGlsLmgKQEAgLTAsMCArMSwyNjQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0JMQVNVVElMX0gKKyNkZWZpbmUgRUlHRU5fQkxBU1VUSUxfSAorCisvLyBUaGlzIGZpbGUgY29udGFpbnMgbWFueSBsaWdodHdlaWdodCBoZWxwZXIgY2xhc3NlcyB1c2VkIHRvCisvLyBpbXBsZW1lbnQgYW5kIGNvbnRyb2wgZmFzdCBsZXZlbCAyIGFuZCBsZXZlbCAzIEJMQVMtbGlrZSByb3V0aW5lcy4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbnMKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IG1yLCBpbnQgbnIsIGJvb2wgQ29uanVnYXRlTGhzPWZhbHNlLCBib29sIENvbmp1Z2F0ZVJocz1mYWxzZT4KK3N0cnVjdCBnZWJwX2tlcm5lbDsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IG5yLCBpbnQgU3RvcmFnZU9yZGVyLCBib29sIENvbmp1Z2F0ZSA9IGZhbHNlLCBib29sIFBhbmVsTW9kZT1mYWxzZT4KK3N0cnVjdCBnZW1tX3BhY2tfcmhzOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgUGFjazEsIGludCBQYWNrMiwgaW50IFN0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGUgPSBmYWxzZSwgYm9vbCBQYW5lbE1vZGUgPSBmYWxzZT4KK3N0cnVjdCBnZW1tX3BhY2tfbGhzOworCit0ZW1wbGF0ZTwKKyAgdHlwZW5hbWUgSW5kZXgsCisgIHR5cGVuYW1lIExoc1NjYWxhciwgaW50IExoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVMaHMsCisgIHR5cGVuYW1lIFJoc1NjYWxhciwgaW50IFJoc1N0b3JhZ2VPcmRlciwgYm9vbCBDb25qdWdhdGVSaHMsCisgIGludCBSZXNTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgZ2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBMaHNTY2FsYXIsIGludCBMaHNTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29uanVnYXRlUmhzLCBpbnQgVmVyc2lvbj1TcGVjaWFsaXplZD4KK3N0cnVjdCBnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdDsKKworCit0ZW1wbGF0ZTxib29sIENvbmp1Z2F0ZT4gc3RydWN0IGNvbmpfaWY7CisKK3RlbXBsYXRlPD4gc3RydWN0IGNvbmpfaWY8dHJ1ZT4geworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBpbmxpbmUgVCBvcGVyYXRvcigpKGNvbnN0IFQmIHgpIHsgcmV0dXJuIGNvbmooeCk7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIFQgcGNvbmooY29uc3QgVCYgeCkgeyByZXR1cm4gaW50ZXJuYWw6OnBjb25qKHgpOyB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBjb25qX2lmPGZhbHNlPiB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSBjb25zdCBUJiBvcGVyYXRvcigpKGNvbnN0IFQmIHgpIHsgcmV0dXJuIHg7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIGNvbnN0IFQmIHBjb25qKGNvbnN0IFQmIHgpIHsgcmV0dXJuIHg7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IGNvbmpfaGVscGVyPFNjYWxhcixTY2FsYXIsZmFsc2UsZmFsc2U+Cit7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtYWRkKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBTY2FsYXImIGMpIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwbWFkZCh4LHksYyk7IH0KKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcG11bChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OnBtdWwoeCx5KTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbFNjYWxhcj4gc3RydWN0IGNvbmpfaGVscGVyPHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBmYWxzZSx0cnVlPgoreworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBTY2FsYXI7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtYWRkKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBTY2FsYXImIGMpIGNvbnN0CisgIHsgcmV0dXJuIGMgKyBwbXVsKHgseSk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBwbXVsKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KSBjb25zdAorICB7IHJldHVybiBTY2FsYXIocmVhbCh4KSpyZWFsKHkpICsgaW1hZyh4KSppbWFnKHkpLCBpbWFnKHgpKnJlYWwoeSkgLSByZWFsKHgpKmltYWcoeSkpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsU2NhbGFyPiBzdHJ1Y3QgY29ual9oZWxwZXI8c3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4sIHRydWUsZmFsc2U+Cit7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IFNjYWxhcjsKKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcG1hZGQoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFNjYWxhciYgYykgY29uc3QKKyAgeyByZXR1cm4gYyArIHBtdWwoeCx5KTsgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtdWwoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpIGNvbnN0CisgIHsgcmV0dXJuIFNjYWxhcihyZWFsKHgpKnJlYWwoeSkgKyBpbWFnKHgpKmltYWcoeSksIHJlYWwoeCkqaW1hZyh5KSAtIGltYWcoeCkqcmVhbCh5KSk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlYWxTY2FsYXI+IHN0cnVjdCBjb25qX2hlbHBlcjxzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4sIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgdHJ1ZSx0cnVlPgoreworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBTY2FsYXI7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtYWRkKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBTY2FsYXImIGMpIGNvbnN0CisgIHsgcmV0dXJuIGMgKyBwbXVsKHgseSk7IH0KKworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBwbXVsKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KSBjb25zdAorICB7IHJldHVybiBTY2FsYXIocmVhbCh4KSpyZWFsKHkpIC0gaW1hZyh4KSppbWFnKHkpLCAtIHJlYWwoeCkqaW1hZyh5KSAtIGltYWcoeCkqcmVhbCh5KSk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlYWxTY2FsYXIsYm9vbCBDb25qPiBzdHJ1Y3QgY29ual9oZWxwZXI8c3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+LCBSZWFsU2NhbGFyLCBDb25qLGZhbHNlPgoreworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBTY2FsYXI7CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtYWRkKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgUmVhbFNjYWxhciYgeSwgY29uc3QgU2NhbGFyJiBjKSBjb25zdAorICB7IHJldHVybiBwYWRkKGMsIHBtdWwoeCx5KSk7IH0KKyAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgcG11bChjb25zdCBTY2FsYXImIHgsIGNvbnN0IFJlYWxTY2FsYXImIHkpIGNvbnN0CisgIHsgcmV0dXJuIGNvbmpfaWY8Q29uaj4oKSh4KSp5OyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSZWFsU2NhbGFyLGJvb2wgQ29uaj4gc3RydWN0IGNvbmpfaGVscGVyPFJlYWxTY2FsYXIsIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgZmFsc2UsQ29uaj4KK3sKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gU2NhbGFyOworICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciBwbWFkZChjb25zdCBSZWFsU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksIGNvbnN0IFNjYWxhciYgYykgY29uc3QKKyAgeyByZXR1cm4gcGFkZChjLCBwbXVsKHgseSkpOyB9CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHBtdWwoY29uc3QgUmVhbFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KSBjb25zdAorICB7IHJldHVybiB4KmNvbmpfaWY8Q29uaj4oKSh5KTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnJvbSx0eXBlbmFtZSBUbz4gc3RydWN0IGdldF9mYWN0b3IgeworICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSBUbyBydW4oY29uc3QgRnJvbSYgeCkgeyByZXR1cm4geDsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgZ2V0X2ZhY3RvcjxTY2FsYXIsdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWw+IHsKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcnVuKGNvbnN0IFNjYWxhciYgeCkgeyByZXR1cm4gcmVhbCh4KTsgfQorfTsKKworLy8gTGlnaHR3ZWlnaHQgaGVscGVyIGNsYXNzIHRvIGFjY2VzcyBtYXRyaXggY29lZmZpY2llbnRzLgorLy8gWWVzLCB0aGlzIGlzIHNvbWVob3cgcmVkdW5kYW50IHdpdGggTWFwPD4sIGJ1dCB0aGlzIHZlcnNpb24gaXMgbXVjaCBtdWNoIGxpZ2h0ZXIsCisvLyBhbmQgc28gSSBob3BlIGJldHRlciBjb21waWxhdGlvbiBwZXJmb3JtYW5jZSAodGltZSBhbmQgY29kZSBxdWFsaXR5KS4KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXI+CitjbGFzcyBibGFzX2RhdGFfbWFwcGVyCit7CisgIHB1YmxpYzoKKyAgICBibGFzX2RhdGFfbWFwcGVyKFNjYWxhciogZGF0YSwgSW5kZXggc3RyaWRlKSA6IG1fZGF0YShkYXRhKSwgbV9zdHJpZGUoc3RyaWRlKSB7fQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyJiBvcGVyYXRvcigpKEluZGV4IGksIEluZGV4IGopCisgICAgeyByZXR1cm4gbV9kYXRhW1N0b3JhZ2VPcmRlcj09Um93TWFqb3IgPyBqICsgaSptX3N0cmlkZSA6IGkgKyBqKm1fc3RyaWRlXTsgfQorICBwcm90ZWN0ZWQ6CisgICAgU2NhbGFyKiBFSUdFTl9SRVNUUklDVCBtX2RhdGE7CisgICAgSW5kZXggbV9zdHJpZGU7Cit9OworCisvLyBsaWdodHdlaWdodCBoZWxwZXIgY2xhc3MgdG8gYWNjZXNzIG1hdHJpeCBjb2VmZmljaWVudHMgKGNvbnN0IHZlcnNpb24pCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU3RvcmFnZU9yZGVyPgorY2xhc3MgY29uc3RfYmxhc19kYXRhX21hcHBlcgoreworICBwdWJsaWM6CisgICAgY29uc3RfYmxhc19kYXRhX21hcHBlcihjb25zdCBTY2FsYXIqIGRhdGEsIEluZGV4IHN0cmlkZSkgOiBtX2RhdGEoZGF0YSksIG1fc3RyaWRlKHN0cmlkZSkge30KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciYgb3BlcmF0b3IoKShJbmRleCBpLCBJbmRleCBqKSBjb25zdAorICAgIHsgcmV0dXJuIG1fZGF0YVtTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gaiArIGkqbV9zdHJpZGUgOiBpICsgaiptX3N0cmlkZV07IH0KKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFNjYWxhciogRUlHRU5fUkVTVFJJQ1QgbV9kYXRhOworICAgIEluZGV4IG1fc3RyaWRlOworfTsKKworCisvKiBIZWxwZXIgY2xhc3MgdG8gYW5hbHl6ZSB0aGUgZmFjdG9ycyBvZiBhIFByb2R1Y3QgZXhwcmVzc2lvbi4KKyAqIEluIHBhcnRpY3VsYXIgaXQgYWxsb3dzIHRvIHBvcCBvdXQgb3BlcmF0b3ItLCBzY2FsYXIgbXVsdGlwbGVzLAorICogYW5kIGNvbmp1Z2F0ZSAqLwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4gc3RydWN0IGJsYXNfdHJhaXRzCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPFhwclR5cGU+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIGNvbnN0IFhwclR5cGUmIEV4dHJhY3RUeXBlOworICB0eXBlZGVmIFhwclR5cGUgX0V4dHJhY3RUeXBlOworICBlbnVtIHsKKyAgICBJc0NvbXBsZXggPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgIElzVHJhbnNwb3NlZCA9IGZhbHNlLAorICAgIE5lZWRUb0Nvbmp1Z2F0ZSA9IGZhbHNlLAorICAgIEhhc1VzYWJsZURpcmVjdEFjY2VzcyA9ICggICAgKGludChYcHJUeXBlOjpGbGFncykmRGlyZWN0QWNjZXNzQml0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAgIGJvb2woWHByVHlwZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGludChpbm5lcl9zdHJpZGVfYXRfY29tcGlsZV90aW1lPFhwclR5cGU+OjpyZXQpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPyAgMSA6IDAKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxib29sKEhhc1VzYWJsZURpcmVjdEFjY2VzcyksCisgICAgRXh0cmFjdFR5cGUsCisgICAgdHlwZW5hbWUgX0V4dHJhY3RUeXBlOjpQbGFpbk9iamVjdAorICAgID46OnR5cGUgRGlyZWN0TGluZWFyQWNjZXNzVHlwZTsKKyAgc3RhdGljIGlubGluZSBFeHRyYWN0VHlwZSBleHRyYWN0KGNvbnN0IFhwclR5cGUmIHgpIHsgcmV0dXJuIHg7IH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBTY2FsYXIgZXh0cmFjdFNjYWxhckZhY3Rvcihjb25zdCBYcHJUeXBlJikgeyByZXR1cm4gU2NhbGFyKDEpOyB9Cit9OworCisvLyBwb3AgY29uanVnYXRlCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIE5lc3RlZFhwcj4KK3N0cnVjdCBibGFzX3RyYWl0czxDd2lzZVVuYXJ5T3A8c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxTY2FsYXI+LCBOZXN0ZWRYcHI+ID4KKyA6IGJsYXNfdHJhaXRzPE5lc3RlZFhwcj4KK3sKKyAgdHlwZWRlZiBibGFzX3RyYWl0czxOZXN0ZWRYcHI+IEJhc2U7CisgIHR5cGVkZWYgQ3dpc2VVbmFyeU9wPHNjYWxhcl9jb25qdWdhdGVfb3A8U2NhbGFyPiwgTmVzdGVkWHByPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkV4dHJhY3RUeXBlIEV4dHJhY3RUeXBlOworCisgIGVudW0geworICAgIElzQ29tcGxleCA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgTmVlZFRvQ29uanVnYXRlID0gQmFzZTo6TmVlZFRvQ29uanVnYXRlID8gMCA6IElzQ29tcGxleAorICB9OworICBzdGF0aWMgaW5saW5lIEV4dHJhY3RUeXBlIGV4dHJhY3QoY29uc3QgWHByVHlwZSYgeCkgeyByZXR1cm4gQmFzZTo6ZXh0cmFjdCh4Lm5lc3RlZEV4cHJlc3Npb24oKSk7IH0KKyAgc3RhdGljIGlubGluZSBTY2FsYXIgZXh0cmFjdFNjYWxhckZhY3Rvcihjb25zdCBYcHJUeXBlJiB4KSB7IHJldHVybiBjb25qKEJhc2U6OmV4dHJhY3RTY2FsYXJGYWN0b3IoeC5uZXN0ZWRFeHByZXNzaW9uKCkpKTsgfQorfTsKKworLy8gcG9wIHNjYWxhciBtdWx0aXBsZQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBOZXN0ZWRYcHI+CitzdHJ1Y3QgYmxhc190cmFpdHM8Q3dpc2VVbmFyeU9wPHNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBOZXN0ZWRYcHI+ID4KKyA6IGJsYXNfdHJhaXRzPE5lc3RlZFhwcj4KK3sKKyAgdHlwZWRlZiBibGFzX3RyYWl0czxOZXN0ZWRYcHI+IEJhc2U7CisgIHR5cGVkZWYgQ3dpc2VVbmFyeU9wPHNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBOZXN0ZWRYcHI+IFhwclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6RXh0cmFjdFR5cGUgRXh0cmFjdFR5cGU7CisgIHN0YXRpYyBpbmxpbmUgRXh0cmFjdFR5cGUgZXh0cmFjdChjb25zdCBYcHJUeXBlJiB4KSB7IHJldHVybiBCYXNlOjpleHRyYWN0KHgubmVzdGVkRXhwcmVzc2lvbigpKTsgfQorICBzdGF0aWMgaW5saW5lIFNjYWxhciBleHRyYWN0U2NhbGFyRmFjdG9yKGNvbnN0IFhwclR5cGUmIHgpCisgIHsgcmV0dXJuIHguZnVuY3RvcigpLm1fb3RoZXIgKiBCYXNlOjpleHRyYWN0U2NhbGFyRmFjdG9yKHgubmVzdGVkRXhwcmVzc2lvbigpKTsgfQorfTsKKworLy8gcG9wIG9wcG9zaXRlCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIE5lc3RlZFhwcj4KK3N0cnVjdCBibGFzX3RyYWl0czxDd2lzZVVuYXJ5T3A8c2NhbGFyX29wcG9zaXRlX29wPFNjYWxhcj4sIE5lc3RlZFhwcj4gPgorIDogYmxhc190cmFpdHM8TmVzdGVkWHByPgoreworICB0eXBlZGVmIGJsYXNfdHJhaXRzPE5lc3RlZFhwcj4gQmFzZTsKKyAgdHlwZWRlZiBDd2lzZVVuYXJ5T3A8c2NhbGFyX29wcG9zaXRlX29wPFNjYWxhcj4sIE5lc3RlZFhwcj4gWHByVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpFeHRyYWN0VHlwZSBFeHRyYWN0VHlwZTsKKyAgc3RhdGljIGlubGluZSBFeHRyYWN0VHlwZSBleHRyYWN0KGNvbnN0IFhwclR5cGUmIHgpIHsgcmV0dXJuIEJhc2U6OmV4dHJhY3QoeC5uZXN0ZWRFeHByZXNzaW9uKCkpOyB9CisgIHN0YXRpYyBpbmxpbmUgU2NhbGFyIGV4dHJhY3RTY2FsYXJGYWN0b3IoY29uc3QgWHByVHlwZSYgeCkKKyAgeyByZXR1cm4gLSBCYXNlOjpleHRyYWN0U2NhbGFyRmFjdG9yKHgubmVzdGVkRXhwcmVzc2lvbigpKTsgfQorfTsKKworLy8gcG9wL3B1c2ggdHJhbnNwb3NlCit0ZW1wbGF0ZTx0eXBlbmFtZSBOZXN0ZWRYcHI+CitzdHJ1Y3QgYmxhc190cmFpdHM8VHJhbnNwb3NlPE5lc3RlZFhwcj4gPgorIDogYmxhc190cmFpdHM8TmVzdGVkWHByPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE5lc3RlZFhwcjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBibGFzX3RyYWl0czxOZXN0ZWRYcHI+IEJhc2U7CisgIHR5cGVkZWYgVHJhbnNwb3NlPE5lc3RlZFhwcj4gWHByVHlwZTsKKyAgdHlwZWRlZiBUcmFuc3Bvc2U8Y29uc3QgdHlwZW5hbWUgQmFzZTo6X0V4dHJhY3RUeXBlPiAgRXh0cmFjdFR5cGU7IC8vIGNvbnN0IHRvIGdldCByaWQgb2YgYSBjb21waWxlIGVycm9yOyBhbnl3YXkgYmxhcyB0cmFpdHMgYXJlIG9ubHkgdXNlZCBvbiB0aGUgUkhTCisgIHR5cGVkZWYgVHJhbnNwb3NlPGNvbnN0IHR5cGVuYW1lIEJhc2U6Ol9FeHRyYWN0VHlwZT4gX0V4dHJhY3RUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPGJvb2woQmFzZTo6SGFzVXNhYmxlRGlyZWN0QWNjZXNzKSwKKyAgICBFeHRyYWN0VHlwZSwKKyAgICB0eXBlbmFtZSBFeHRyYWN0VHlwZTo6UGxhaW5PYmplY3QKKyAgICA+Ojp0eXBlIERpcmVjdExpbmVhckFjY2Vzc1R5cGU7CisgIGVudW0geworICAgIElzVHJhbnNwb3NlZCA9IEJhc2U6OklzVHJhbnNwb3NlZCA/IDAgOiAxCisgIH07CisgIHN0YXRpYyBpbmxpbmUgRXh0cmFjdFR5cGUgZXh0cmFjdChjb25zdCBYcHJUeXBlJiB4KSB7IHJldHVybiBCYXNlOjpleHRyYWN0KHgubmVzdGVkRXhwcmVzc2lvbigpKTsgfQorICBzdGF0aWMgaW5saW5lIFNjYWxhciBleHRyYWN0U2NhbGFyRmFjdG9yKGNvbnN0IFhwclR5cGUmIHgpIHsgcmV0dXJuIEJhc2U6OmV4dHJhY3RTY2FsYXJGYWN0b3IoeC5uZXN0ZWRFeHByZXNzaW9uKCkpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGJsYXNfdHJhaXRzPGNvbnN0IFQ+CisgICAgIDogYmxhc190cmFpdHM8VD4KK3t9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEhhc1VzYWJsZURpcmVjdEFjY2Vzcz1ibGFzX3RyYWl0czxUPjo6SGFzVXNhYmxlRGlyZWN0QWNjZXNzPgorc3RydWN0IGV4dHJhY3RfZGF0YV9zZWxlY3RvciB7CisgIHN0YXRpYyBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIHJ1bihjb25zdCBUJiBtKQorICB7CisgICAgcmV0dXJuIGJsYXNfdHJhaXRzPFQ+OjpleHRyYWN0KG0pLmRhdGEoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBleHRyYWN0X2RhdGFfc2VsZWN0b3I8VCxmYWxzZT4geworICBzdGF0aWMgdHlwZW5hbWUgVDo6U2NhbGFyKiBydW4oY29uc3QgVCYpIHsgcmV0dXJuIDA7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IHR5cGVuYW1lIFQ6OlNjYWxhciogZXh0cmFjdF9kYXRhKGNvbnN0IFQmIG0pCit7CisgIHJldHVybiBleHRyYWN0X2RhdGFfc2VsZWN0b3I8VD46OnJ1bihtKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQkxBU1VUSUxfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlMmU1MgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fQ29yZV91dGlsX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMgCisgICR7RWlnZW5fQ29yZV91dGlsX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL0NvcmUvdXRpbCBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9Db25zdGFudHMuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvQ29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkNDVlOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvQ29uc3RhbnRzLmgKQEAgLTAsMCArMSw0MzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09OU1RBTlRTX0gKKyNkZWZpbmUgRUlHRU5fQ09OU1RBTlRTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFRoaXMgdmFsdWUgbWVhbnMgdGhhdCBhIHF1YW50aXR5IGlzIG5vdCBrbm93biBhdCBjb21waWxlLXRpbWUsIGFuZCB0aGF0IGluc3RlYWQgdGhlIHZhbHVlIGlzCisgICogc3RvcmVkIGluIHNvbWUgcnVudGltZSB2YXJpYWJsZS4KKyAgKgorICAqIENoYW5naW5nIHRoZSB2YWx1ZSBvZiBEeW5hbWljIGJyZWFrcyB0aGUgQUJJLCBhcyBEeW5hbWljIGlzIG9mdGVuIHVzZWQgYXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZm9yIE1hdHJpeC4KKyAgKi8KK2NvbnN0IGludCBEeW5hbWljID0gLTE7CisKKy8qKiBUaGlzIHZhbHVlIG1lYW5zICtJbmZpbml0eTsgaXQgaXMgY3VycmVudGx5IHVzZWQgb25seSBhcyB0aGUgcCBwYXJhbWV0ZXIgdG8gTWF0cml4QmFzZTo6bHBOb3JtPGludD4oKS4KKyAgKiBUaGUgdmFsdWUgSW5maW5pdHkgdGhlcmUgbWVhbnMgdGhlIEwtaW5maW5pdHkgbm9ybS4KKyAgKi8KK2NvbnN0IGludCBJbmZpbml0eSA9IC0xOworCisvKiogXGRlZmdyb3VwIGZsYWdzIEZsYWdzCisgICogXGluZ3JvdXAgQ29yZV9Nb2R1bGUKKyAgKgorICAqIFRoZXNlIGFyZSB0aGUgcG9zc2libGUgYml0cyB3aGljaCBjYW4gYmUgT1InZWQgdG8gY29uc3RpdHV0ZSB0aGUgZmxhZ3Mgb2YgYSBtYXRyaXggb3IKKyAgKiBleHByZXNzaW9uLgorICAqCisgICogSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGVzZSBmbGFncyBhcmUgYSBwdXJlbHkgY29tcGlsZS10aW1lIG5vdGlvbi4gVGhleSBhcmUgYSBjb21waWxlLXRpbWUgcHJvcGVydHkgb2YKKyAgKiBhbiBleHByZXNzaW9uIHR5cGUsIGltcGxlbWVudGVkIGFzIGVudW0ncy4gVGhleSBhcmUgbm90IHN0b3JlZCBpbiBtZW1vcnkgYXQgcnVudGltZSwgYW5kIHRoZXkgZG8gbm90IGluY3VyIGFueQorICAqIHJ1bnRpbWUgb3ZlcmhlYWQuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6RmxhZ3MKKyAgKi8KKworLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBmb3IgYSBtYXRyaXgsIHRoaXMgbWVhbnMgdGhhdCB0aGUgc3RvcmFnZSBvcmRlciBpcyByb3ctbWFqb3IuCisgICogSWYgdGhpcyBiaXQgaXMgbm90IHNldCwgdGhlIHN0b3JhZ2Ugb3JkZXIgaXMgY29sdW1uLW1ham9yLgorICAqIEZvciBhbiBleHByZXNzaW9uLCB0aGlzIGRldGVybWluZXMgdGhlIHN0b3JhZ2Ugb3JkZXIgb2YKKyAgKiB0aGUgbWF0cml4IGNyZWF0ZWQgYnkgZXZhbHVhdGlvbiBvZiB0aGF0IGV4cHJlc3Npb24uIAorICAqIFxzYSBccmVmIFRvcGljU3RvcmFnZU9yZGVycyAqLworY29uc3QgdW5zaWduZWQgaW50IFJvd01ham9yQml0ID0gMHgxOworCisvKiogXGluZ3JvdXAgZmxhZ3MKKyAgKgorICAqIG1lYW5zIHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQgYnkgdGhlIGNhbGxpbmcgZXhwcmVzc2lvbiAqLworY29uc3QgdW5zaWduZWQgaW50IEV2YWxCZWZvcmVOZXN0aW5nQml0ID0gMHgyOworCisvKiogXGluZ3JvdXAgZmxhZ3MKKyAgKgorICAqIG1lYW5zIHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQgYmVmb3JlIGFueSBhc3NpZ25tZW50ICovCitjb25zdCB1bnNpZ25lZCBpbnQgRXZhbEJlZm9yZUFzc2lnbmluZ0JpdCA9IDB4NDsKKworLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBTaG9ydCB2ZXJzaW9uOiBtZWFucyB0aGUgZXhwcmVzc2lvbiBtaWdodCBiZSB2ZWN0b3JpemVkCisgICoKKyAgKiBMb25nIHZlcnNpb246IG1lYW5zIHRoYXQgdGhlIGNvZWZmaWNpZW50cyBjYW4gYmUgaGFuZGxlZCBieSBwYWNrZXRzCisgICogYW5kIHN0YXJ0IGF0IGEgbWVtb3J5IGxvY2F0aW9uIHdob3NlIGFsaWdubWVudCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzCisgICogb2YgdGhlIHByZXNlbnQgQ1BVIGFyY2hpdGVjdHVyZSBmb3Igb3B0aW1pemVkIHBhY2tldCBhY2Nlc3MuIEluIHRoZSBmaXhlZC1zaXplCisgICogY2FzZSwgdGhlcmUgaXMgdGhlIGFkZGl0aW9uYWwgY29uZGl0aW9uIHRoYXQgaXQgYmUgcG9zc2libGUgdG8gYWNjZXNzIGFsbCB0aGUKKyAgKiBjb2VmZmljaWVudHMgYnkgcGFja2V0cyAodGhpcyBpbXBsaWVzIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBzaXplIGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMsCisgICogYW5kIHRoYXQgYW55IG5vbnRyaXZpYWwgc3RyaWRlcyBkb24ndCBicmVhayB0aGUgYWxpZ25tZW50KS4gSW4gdGhlIGR5bmFtaWMtc2l6ZSBjYXNlLAorICAqIHRoZXJlIGlzIG5vIHN1Y2ggY29uZGl0aW9uIG9uIHRoZSB0b3RhbCBzaXplIGFuZCBzdHJpZGVzLCBzbyBpdCBtaWdodCBub3QgYmUgcG9zc2libGUgdG8gYWNjZXNzCisgICogYWxsIGNvZWZmcyBieSBwYWNrZXRzLgorICAqCisgICogXG5vdGUgVGhpcyBiaXQgY2FuIGJlIHNldCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdmVjdG9yaXphdGlvbiBpcyBhY3R1YWxseSBlbmFibGVkLgorICAqICAgICAgIFRvIGNoZWNrIGZvciBhY3R1YWwgdmVjdG9yaXphYmlsaXR5LCBzZWUgXGEgQWN0dWFsUGFja2V0QWNjZXNzQml0LgorICAqLworY29uc3QgdW5zaWduZWQgaW50IFBhY2tldEFjY2Vzc0JpdCA9IDB4ODsKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRQorLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBJZiB2ZWN0b3JpemF0aW9uIGlzIGVuYWJsZWQgKEVJR0VOX1ZFQ1RPUklaRSBpcyBkZWZpbmVkKSB0aGlzIGNvbnN0YW50CisgICogaXMgc2V0IHRvIHRoZSB2YWx1ZSBcYSBQYWNrZXRBY2Nlc3NCaXQuCisgICoKKyAgKiBJZiB2ZWN0b3JpemF0aW9uIGlzIG5vdCBlbmFibGVkIChFSUdFTl9WRUNUT1JJWkUgaXMgbm90IGRlZmluZWQpIHRoaXMgY29uc3RhbnQKKyAgKiBpcyBzZXQgdG8gdGhlIHZhbHVlIDAuCisgICovCitjb25zdCB1bnNpZ25lZCBpbnQgQWN0dWFsUGFja2V0QWNjZXNzQml0ID0gUGFja2V0QWNjZXNzQml0OworI2Vsc2UKK2NvbnN0IHVuc2lnbmVkIGludCBBY3R1YWxQYWNrZXRBY2Nlc3NCaXQgPSAweDA7CisjZW5kaWYKKworLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBTaG9ydCB2ZXJzaW9uOiBtZWFucyB0aGUgZXhwcmVzc2lvbiBjYW4gYmUgc2VlbiBhcyAxRCB2ZWN0b3IuCisgICoKKyAgKiBMb25nIHZlcnNpb246IG1lYW5zIHRoYXQgb25lIGNhbiBhY2Nlc3MgdGhlIGNvZWZmaWNpZW50cworICAqIG9mIHRoaXMgZXhwcmVzc2lvbiBieSBjb2VmZihpbnQpLCBhbmQgY29lZmZSZWYoaW50KSBpbiB0aGUgY2FzZSBvZiBhIGx2YWx1ZSBleHByZXNzaW9uLiBUaGVzZQorICAqIGluZGV4LWJhc2VkIGFjY2VzcyBtZXRob2RzIGFyZSBndWFyYW50ZWVkCisgICogdG8gbm90IGhhdmUgdG8gZG8gYW55IHJ1bnRpbWUgY29tcHV0YXRpb24gb2YgYSAocm93LCBjb2wpLXBhaXIgZnJvbSB0aGUgaW5kZXgsIHNvIHRoYXQgaXQKKyAgKiBpcyBndWFyYW50ZWVkIHRoYXQgd2hlbmV2ZXIgaXQgaXMgYXZhaWxhYmxlLCBpbmRleC1iYXNlZCBhY2Nlc3MgaXMgYXQgbGVhc3QgYXMgZmFzdCBhcworICAqIChyb3csY29sKS1iYXNlZCBhY2Nlc3MuIEV4cHJlc3Npb25zIGZvciB3aGljaCB0aGF0IGlzbid0IHBvc3NpYmxlIGRvbid0IGhhdmUgdGhlIExpbmVhckFjY2Vzc0JpdC4KKyAgKgorICAqIElmIGJvdGggUGFja2V0QWNjZXNzQml0IGFuZCBMaW5lYXJBY2Nlc3NCaXQgYXJlIHNldCwgdGhlbiB0aGUKKyAgKiBwYWNrZXRzIG9mIHRoaXMgZXhwcmVzc2lvbiBjYW4gYmUgYWNjZXNzZWQgYnkgcGFja2V0KGludCksIGFuZCB3cml0ZVBhY2tldChpbnQpIGluIHRoZSBjYXNlIG9mIGEKKyAgKiBsdmFsdWUgZXhwcmVzc2lvbi4KKyAgKgorICAqIFR5cGljYWxseSwgYWxsIHZlY3RvciBleHByZXNzaW9ucyBoYXZlIHRoZSBMaW5lYXJBY2Nlc3NCaXQsIGJ1dCB0aGVyZSBpcyBvbmUgZXhjZXB0aW9uOgorICAqIFByb2R1Y3QgZXhwcmVzc2lvbnMgZG9uJ3QgaGF2ZSBpdCwgYmVjYXVzZSBpdCB3b3VsZCBiZSB0cm91Ymxlc29tZSBmb3IgdmVjdG9yaXphdGlvbiwgZXZlbiB3aGVuIHRoZQorICAqIFByb2R1Y3QgaXMgYSB2ZWN0b3IgZXhwcmVzc2lvbi4gVGh1cywgdmVjdG9yIFByb2R1Y3QgZXhwcmVzc2lvbnMgYWxsb3cgaW5kZXgtYmFzZWQgY29lZmZpY2llbnQgYWNjZXNzIGJ1dAorICAqIG5vdCBpbmRleC1iYXNlZCBwYWNrZXQgYWNjZXNzLCBzbyB0aGV5IGRvbid0IGhhdmUgdGhlIExpbmVhckFjY2Vzc0JpdC4KKyAgKi8KK2NvbnN0IHVuc2lnbmVkIGludCBMaW5lYXJBY2Nlc3NCaXQgPSAweDEwOworCisvKiogXGluZ3JvdXAgZmxhZ3MKKyAgKgorICAqIE1lYW5zIHRoZSBleHByZXNzaW9uIGhhcyBhIGNvZWZmUmVmKCkgbWV0aG9kLCBpLmUuIGlzIHdyaXRhYmxlIGFzIGl0cyBpbmRpdmlkdWFsIGNvZWZmaWNpZW50cyBhcmUgZGlyZWN0bHkgYWRkcmVzc2FibGUuCisgICogVGhpcyBydWxlcyBvdXQgcmVhZC1vbmx5IGV4cHJlc3Npb25zLgorICAqCisgICogTm90ZSB0aGF0IERpcmVjdEFjY2Vzc0JpdCBhbmQgTHZhbHVlQml0IGFyZSBtdXR1YWxseSBvcnRob2dvbmFsLCBhcyB0aGVyZSBhcmUgZXhhbXBsZXMgb2YgZXhwcmVzc2lvbiBoYXZpbmcgb25lIGJ1dCBub3RlCisgICogdGhlIG90aGVyOgorICAqICAgXGxpIHdyaXRhYmxlIGV4cHJlc3Npb25zIHRoYXQgZG9uJ3QgaGF2ZSBhIHZlcnkgc2ltcGxlIG1lbW9yeSBsYXlvdXQgYXMgYSBzdHJpZGVkIGFycmF5LCBoYXZlIEx2YWx1ZUJpdCBidXQgbm90IERpcmVjdEFjY2Vzc0JpdAorICAqICAgXGxpIE1hcC10by1jb25zdCBleHByZXNzaW9ucywgZm9yIGV4YW1wbGUgTWFwPGNvbnN0IE1hdHJpeD4sIGhhdmUgRGlyZWN0QWNjZXNzQml0IGJ1dCBub3QgTHZhbHVlQml0CisgICoKKyAgKiBFeHByZXNzaW9ucyBoYXZpbmcgTHZhbHVlQml0IGFsc28gaGF2ZSB0aGVpciBjb2VmZigpIG1ldGhvZCByZXR1cm5pbmcgYSBjb25zdCByZWZlcmVuY2UgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBuZXcgdmFsdWUuCisgICovCitjb25zdCB1bnNpZ25lZCBpbnQgTHZhbHVlQml0ID0gMHgyMDsKKworLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBNZWFucyB0aGF0IHRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIGNvZWZmaWNpZW50cyBjYW4gYmUgZGlyZWN0bHkgYWNjZXNzZWQgYXMgYSBwbGFpbiBzdHJpZGVkIGFycmF5LiBUaGUgbWVtb3J5IGxheW91dAorICAqIG9mIHRoZSBhcnJheSBvZiBjb2VmZmljaWVudHMgbXVzdCBiZSBleGFjdGx5IHRoZSBuYXR1cmFsIG9uZSBzdWdnZXN0ZWQgYnkgcm93cygpLCBjb2xzKCksCisgICogb3V0ZXJTdHJpZGUoKSwgaW5uZXJTdHJpZGUoKSwgYW5kIHRoZSBSb3dNYWpvckJpdC4gVGhpcyBydWxlcyBvdXQgZXhwcmVzc2lvbnMgc3VjaCBhcyBEaWFnb25hbCwgd2hvc2UgY29lZmZpY2llbnRzLAorICAqIHRob3VnaCByZWZlcmVuY2FibGUsIGRvIG5vdCBoYXZlIHN1Y2ggYSByZWd1bGFyIG1lbW9yeSBsYXlvdXQuCisgICoKKyAgKiBTZWUgdGhlIGNvbW1lbnQgb24gTHZhbHVlQml0IGZvciBhbiBleHBsYW5hdGlvbiBvZiBob3cgTHZhbHVlQml0IGFuZCBEaXJlY3RBY2Nlc3NCaXQgYXJlIG11dHVhbGx5IG9ydGhvZ29uYWwuCisgICovCitjb25zdCB1bnNpZ25lZCBpbnQgRGlyZWN0QWNjZXNzQml0ID0gMHg0MDsKKworLyoqIFxpbmdyb3VwIGZsYWdzCisgICoKKyAgKiBtZWFucyB0aGUgZmlyc3QgY29lZmZpY2llbnQgcGFja2V0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYWxpZ25lZCAqLworY29uc3QgdW5zaWduZWQgaW50IEFsaWduZWRCaXQgPSAweDgwOworCitjb25zdCB1bnNpZ25lZCBpbnQgTmVzdEJ5UmVmQml0ID0gMHgxMDA7CisKKy8vIGxpc3Qgb2YgZmxhZ3MgdGhhdCBhcmUgaW5oZXJpdGVkIGJ5IGRlZmF1bHQKK2NvbnN0IHVuc2lnbmVkIGludCBIZXJlZGl0YXJ5Qml0cyA9IFJvd01ham9yQml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFdmFsQmVmb3JlTmVzdGluZ0JpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXZhbEJlZm9yZUFzc2lnbmluZ0JpdDsKKworLyoqIFxkZWZncm91cCBlbnVtcyBFbnVtZXJhdGlvbnMKKyAgKiBcaW5ncm91cCBDb3JlX01vZHVsZQorICAqCisgICogVmFyaW91cyBlbnVtZXJhdGlvbnMgdXNlZCBpbiAlRWlnZW4uIE1hbnkgb2YgdGhlc2UgYXJlIHVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVycy4KKyAgKi8KKworLyoqIFxpbmdyb3VwIGVudW1zCisgICogRW51bSBjb250YWluaW5nIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIFxwIE1vZGUgcGFyYW1ldGVyIG9mIAorICAqIE1hdHJpeEJhc2U6OnNlbGZhZGpvaW50VmlldygpIGFuZCBNYXRyaXhCYXNlOjp0cmlhbmd1bGFyVmlldygpLiAqLworZW51bSB7CisgIC8qKiBWaWV3IG1hdHJpeCBhcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LiAqLworICBMb3dlcj0weDEsICAgICAgICAgICAgICAgICAgICAgIAorICAvKiogVmlldyBtYXRyaXggYXMgYW4gdXBwZXIgdHJpYW5ndWxhciBtYXRyaXguICovCisgIFVwcGVyPTB4MiwgICAgICAgICAgICAgICAgICAgICAgCisgIC8qKiAlTWF0cml4IGhhcyBvbmVzIG9uIHRoZSBkaWFnb25hbDsgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoICNMb3dlciBvciAjVXBwZXIuICovCisgIFVuaXREaWFnPTB4NCwgCisgIC8qKiAlTWF0cml4IGhhcyB6ZXJvcyBvbiB0aGUgZGlhZ29uYWw7IHRvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCAjTG93ZXIgb3IgI1VwcGVyLiAqLworICBaZXJvRGlhZz0weDgsCisgIC8qKiBWaWV3IG1hdHJpeCBhcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IHdpdGggb25lcyBvbiB0aGUgZGlhZ29uYWwuICovCisgIFVuaXRMb3dlcj1Vbml0RGlhZ3xMb3dlciwgCisgIC8qKiBWaWV3IG1hdHJpeCBhcyBhbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCB3aXRoIG9uZXMgb24gdGhlIGRpYWdvbmFsLiAqLworICBVbml0VXBwZXI9VW5pdERpYWd8VXBwZXIsCisgIC8qKiBWaWV3IG1hdHJpeCBhcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IHdpdGggemVyb3Mgb24gdGhlIGRpYWdvbmFsLiAqLworICBTdHJpY3RseUxvd2VyPVplcm9EaWFnfExvd2VyLCAKKyAgLyoqIFZpZXcgbWF0cml4IGFzIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IHdpdGggemVyb3Mgb24gdGhlIGRpYWdvbmFsLiAqLworICBTdHJpY3RseVVwcGVyPVplcm9EaWFnfFVwcGVyLAorICAvKiogVXNlZCBpbiBCYW5kTWF0cml4IGFuZCBTZWxmQWRqb2ludFZpZXcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWF0cml4IGlzIHNlbGYtYWRqb2ludC4gKi8KKyAgU2VsZkFkam9pbnQ9MHgxMCwKKyAgLyoqIFVzZWQgdG8gc3VwcG9ydCBzeW1tZXRyaWMsIG5vbi1zZWxmYWRqb2ludCwgY29tcGxleCBtYXRyaWNlcy4gKi8KKyAgU3ltbWV0cmljPTB4MjAKK307CisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIEVudW0gZm9yIGluZGljYXRpbmcgd2hldGhlciBhbiBvYmplY3QgaXMgYWxpZ25lZCBvciBub3QuICovCitlbnVtIHsgCisgIC8qKiBPYmplY3QgaXMgbm90IGNvcnJlY3RseSBhbGlnbmVkIGZvciB2ZWN0b3JpemF0aW9uLiAqLworICBVbmFsaWduZWQ9MCwgCisgIC8qKiBPYmplY3QgaXMgYWxpZ25lZCBmb3IgdmVjdG9yaXphdGlvbi4gKi8KKyAgQWxpZ25lZD0xIAorfTsKKworLyoqIFxpbmdyb3VwIGVudW1zCisgKiBFbnVtIHVzZWQgYnkgRGVuc2VCYXNlOjpjb3JuZXIoKSBpbiBFaWdlbjIgY29tcGF0aWJpbGl0eSBtb2RlLiAqLworLy8gRklYTUUgYWZ0ZXIgdGhlIGNvcm5lcigpIEFQSSBjaGFuZ2UsIHRoaXMgd2FzIG5vdCBuZWVkZWQgYW55bW9yZSwgZXhjZXB0IGJ5IEFsaWduZWRCb3gKKy8vIFRPRE86IGZpbmQgb3V0IHdoYXQgdG8gZG8gd2l0aCB0aGF0LiBBZGFwdCB0aGUgQWxpZ25lZEJveCBBUEkgPworZW51bSBDb3JuZXJUeXBlIHsgVG9wTGVmdCwgVG9wUmlnaHQsIEJvdHRvbUxlZnQsIEJvdHRvbVJpZ2h0IH07CisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIEVudW0gY29udGFpbmluZyBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBccCBEaXJlY3Rpb24gcGFyYW1ldGVyIG9mCisgICogUmV2ZXJzZSwgUGFydGlhbFJlZHV4RXhwciBhbmQgVmVjdG9yd2lzZU9wLiAqLworZW51bSBEaXJlY3Rpb25UeXBlIHsgCisgIC8qKiBGb3IgUmV2ZXJzZSwgYWxsIGNvbHVtbnMgYXJlIHJldmVyc2VkOyAKKyAgICAqIGZvciBQYXJ0aWFsUmVkdXhFeHByIGFuZCBWZWN0b3J3aXNlT3AsIGFjdCBvbiBjb2x1bW5zLiAqLworICBWZXJ0aWNhbCwgCisgIC8qKiBGb3IgUmV2ZXJzZSwgYWxsIHJvd3MgYXJlIHJldmVyc2VkOyAKKyAgICAqIGZvciBQYXJ0aWFsUmVkdXhFeHByIGFuZCBWZWN0b3J3aXNlT3AsIGFjdCBvbiByb3dzLiAqLworICBIb3Jpem9udGFsLCAKKyAgLyoqIEZvciBSZXZlcnNlLCBib3RoIHJvd3MgYW5kIGNvbHVtbnMgYXJlIHJldmVyc2VkOyAKKyAgICAqIG5vdCB1c2VkIGZvciBQYXJ0aWFsUmVkdXhFeHByIGFuZCBWZWN0b3J3aXNlT3AuICovCisgIEJvdGhEaXJlY3Rpb25zIAorfTsKKworLyoqIFxpbnRlcm5hbCBcaW5ncm91cCBlbnVtcworICAqIEVudW0gdG8gc3BlY2lmeSBob3cgdG8gdHJhdmVyc2UgdGhlIGVudHJpZXMgb2YgYSBtYXRyaXguICovCitlbnVtIHsKKyAgLyoqIFxpbnRlcm5hbCBEZWZhdWx0IHRyYXZlcnNhbCwgbm8gdmVjdG9yaXphdGlvbiwgbm8gaW5kZXgtYmFzZWQgYWNjZXNzICovCisgIERlZmF1bHRUcmF2ZXJzYWwsCisgIC8qKiBcaW50ZXJuYWwgTm8gdmVjdG9yaXphdGlvbiwgdXNlIGluZGV4LWJhc2VkIGFjY2VzcyB0byBoYXZlIG9ubHkgb25lIGZvciBsb29wIGluc3RlYWQgb2YgMiBuZXN0ZWQgbG9vcHMgKi8KKyAgTGluZWFyVHJhdmVyc2FsLAorICAvKiogXGludGVybmFsIEVxdWl2YWxlbnQgdG8gYSBzbGljZSB2ZWN0b3JpemF0aW9uIGZvciBmaXhlZC1zaXplIG1hdHJpY2VzIGhhdmluZyBnb29kIGFsaWdubWVudAorICAgICogYW5kIGdvb2Qgc2l6ZSAqLworICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsCisgIC8qKiBcaW50ZXJuYWwgVmVjdG9yaXphdGlvbiBwYXRoIHVzaW5nIGEgc2luZ2xlIGxvb3AgcGx1cyBzY2FsYXIgbG9vcHMgZm9yIHRoZQorICAgICogdW5hbGlnbmVkIGJvdW5kYXJpZXMgKi8KKyAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCwKKyAgLyoqIFxpbnRlcm5hbCBHZW5lcmljIHZlY3Rvcml6YXRpb24gcGF0aCB1c2luZyBvbmUgdmVjdG9yaXplZCBsb29wIHBlciByb3cvY29sdW1uIHdpdGggc29tZQorICAgICogc2NhbGFyIGxvb3BzIHRvIGhhbmRsZSB0aGUgdW5hbGlnbmVkIGJvdW5kYXJpZXMgKi8KKyAgU2xpY2VWZWN0b3JpemVkVHJhdmVyc2FsLAorICAvKiogXGludGVybmFsIFNwZWNpYWwgY2FzZSB0byBwcm9wZXJseSBoYW5kbGUgaW5jb21wYXRpYmxlIHNjYWxhciB0eXBlcyBvciBvdGhlciBkZWZlY3RpbmcgY2FzZXMqLworICBJbnZhbGlkVHJhdmVyc2FsCit9OworCisvKiogXGludGVybmFsIFxpbmdyb3VwIGVudW1zCisgICogRW51bSB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gdW5yb2xsIGxvb3BzIHdoZW4gdHJhdmVyc2luZyBvdmVyIHRoZSBlbnRyaWVzIG9mIGEgbWF0cml4LiAqLworZW51bSB7CisgIC8qKiBcaW50ZXJuYWwgRG8gbm90IHVucm9sbCBsb29wcy4gKi8KKyAgTm9VbnJvbGxpbmcsCisgIC8qKiBcaW50ZXJuYWwgVW5yb2xsIG9ubHkgdGhlIGlubmVyIGxvb3AsIGJ1dCBub3QgdGhlIG91dGVyIGxvb3AuICovCisgIElubmVyVW5yb2xsaW5nLAorICAvKiogXGludGVybmFsIFVucm9sbCBib3RoIHRoZSBpbm5lciBhbmQgdGhlIG91dGVyIGxvb3AuIElmIHRoZXJlIGlzIG9ubHkgb25lIGxvb3AsIAorICAgICogYmVjYXVzZSBsaW5lYXIgdHJhdmVyc2FsIGlzIHVzZWQsIHRoZW4gdW5yb2xsIHRoYXQgbG9vcC4gKi8KKyAgQ29tcGxldGVVbnJvbGxpbmcKK307CisKKy8qKiBcaW50ZXJuYWwgXGluZ3JvdXAgZW51bXMKKyAgKiBFbnVtIHRvIHNwZWNpZnkgd2hldGhlciB0byB1c2UgdGhlIGRlZmF1bHQgKGJ1aWx0LWluKSBpbXBsZW1lbnRhdGlvbiBvciB0aGUgc3BlY2lhbGl6YXRpb24uICovCitlbnVtIHsKKyAgU3BlY2lhbGl6ZWQsCisgIEJ1aWx0SW4KK307CisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIEVudW0gY29udGFpbmluZyBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBccCBfT3B0aW9ucyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YKKyAgKiBNYXRyaXgsIEFycmF5IGFuZCBCYW5kTWF0cml4LiAqLworZW51bSB7CisgIC8qKiBTdG9yYWdlIG9yZGVyIGlzIGNvbHVtbiBtYWpvciAoc2VlIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzKS4gKi8KKyAgQ29sTWFqb3IgPSAwLAorICAvKiogU3RvcmFnZSBvcmRlciBpcyByb3cgbWFqb3IgKHNlZSBccmVmIFRvcGljU3RvcmFnZU9yZGVycykuICovCisgIFJvd01ham9yID0gMHgxLCAgLy8gaXQgaXMgb25seSBhIGNvaW5jaWRlbmNlIHRoYXQgdGhpcyBpcyBlcXVhbCB0byBSb3dNYWpvckJpdCAtLSBkb24ndCByZWx5IG9uIHRoYXQKKyAgLyoqIFxpbnRlcm5hbCBBbGlnbiB0aGUgbWF0cml4IGl0c2VsZiBpZiBpdCBpcyB2ZWN0b3JpemFibGUgZml4ZWQtc2l6ZSAqLworICBBdXRvQWxpZ24gPSAwLAorICAvKiogXGludGVybmFsIERvbid0IHJlcXVpcmUgYWxpZ25tZW50IGZvciB0aGUgbWF0cml4IGl0c2VsZiAodGhlIGFycmF5IG9mIGNvZWZmaWNpZW50cywgaWYgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBtYXkgc3RpbGwgYmUgcmVxdWVzdGVkIHRvIGJlIGFsaWduZWQpICovIC8vIEZJWE1FIC0tLSBjbGFyaWZ5IHRoZSBzaXR1YXRpb24KKyAgRG9udEFsaWduID0gMHgyCit9OworCisvKiogXGluZ3JvdXAgZW51bXMKKyAgKiBFbnVtIGZvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gYXBwbHkgb3Igc29sdmUgb24gdGhlIGxlZnQgb3IgcmlnaHQuICovCitlbnVtIHsKKyAgLyoqIEFwcGx5IHRyYW5zZm9ybWF0aW9uIG9uIHRoZSBsZWZ0LiAqLworICBPblRoZUxlZnQgPSAxLCAgCisgIC8qKiBBcHBseSB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUgcmlnaHQuICovCisgIE9uVGhlUmlnaHQgPSAyICAKK307CisKKy8qIHRoZSBmb2xsb3dpbmcgdXNlZCB0byBiZSB3cml0dGVuIGFzOgorICoKKyAqICAgc3RydWN0IE5vQ2hhbmdlX3Qge307CisgKiAgIG5hbWVzcGFjZSB7CisgKiAgICAgRUlHRU5fVU5VU0VEIE5vQ2hhbmdlX3QgTm9DaGFuZ2U7CisgKiAgIH0KKyAqCisgKiBvbiB0aGUgZ3JvdW5kIHRoYXQgaXQgZmVlbHMgZGFuZ2Vyb3VzIHRvIGRpc2FtYmlndWF0ZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBvbiBlbnVtL2ludGVnZXIgdHlwZXMuICAKKyAqIEhvd2V2ZXIsIHRoaXMgbGVhZHMgdG8gInZhcmlhYmxlIGRlY2xhcmVkIGJ1dCBuZXZlciByZWZlcmVuY2VkIiB3YXJuaW5ncyBvbiBJbnRlbCBDb21wb3NlciBYRSwKKyAqIGFuZCB3ZSBkbyBub3Qga25vdyBob3cgdG8gZ2V0IHJpZCBvZiB0aGVtIChidWcgNDUwKS4KKyAqLworCitlbnVtIE5vQ2hhbmdlX3QgICB7IE5vQ2hhbmdlIH07CitlbnVtIFNlcXVlbnRpYWxfdCB7IFNlcXVlbnRpYWwgfTsKK2VudW0gRGVmYXVsdF90ICAgIHsgRGVmYXVsdCB9OworCisvKiogXGludGVybmFsIFxpbmdyb3VwIGVudW1zCisgICogVXNlZCBpbiBBbWJpVmVjdG9yLiAqLworZW51bSB7CisgIElzRGVuc2UgICAgICAgICA9IDAsCisgIElzU3BhcnNlCit9OworCisvKiogXGluZ3JvdXAgZW51bXMKKyAgKiBVc2VkIGFzIHRlbXBsYXRlIHBhcmFtZXRlciBpbiBEZW5zZUNvZWZmQmFzZSBhbmQgTWFwQmFzZSB0byBpbmRpY2F0ZSAKKyAgKiB3aGljaCBhY2Nlc3NvcnMgc2hvdWxkIGJlIHByb3ZpZGVkLiAqLworZW51bSBBY2Nlc3NvckxldmVscyB7CisgIC8qKiBSZWFkLW9ubHkgYWNjZXNzIHZpYSBhIG1lbWJlciBmdW5jdGlvbi4gKi8KKyAgUmVhZE9ubHlBY2Nlc3NvcnMsIAorICAvKiogUmVhZC93cml0ZSBhY2Nlc3MgdmlhIG1lbWJlciBmdW5jdGlvbnMuICovCisgIFdyaXRlQWNjZXNzb3JzLCAKKyAgLyoqIERpcmVjdCByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBjb2VmZmljaWVudHMuICovCisgIERpcmVjdEFjY2Vzc29ycywgCisgIC8qKiBEaXJlY3QgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhlIGNvZWZmaWNpZW50cy4gKi8KKyAgRGlyZWN0V3JpdGVBY2Nlc3NvcnMKK307CisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIEVudW0gd2l0aCBvcHRpb25zIHRvIGdpdmUgdG8gdmFyaW91cyBkZWNvbXBvc2l0aW9ucy4gKi8KK2VudW0gRGVjb21wb3NpdGlvbk9wdGlvbnMgeworICAvKiogXGludGVybmFsIE5vdCB1c2VkIChtZWFudCBmb3IgTERMVD8pLiAqLworICBQaXZvdGluZyAgICAgICAgICAgID0gMHgwMSwgCisgIC8qKiBcaW50ZXJuYWwgTm90IHVzZWQgKG1lYW50IGZvciBMRExUPykuICovCisgIE5vUGl2b3RpbmcgICAgICAgICAgPSAweDAyLCAKKyAgLyoqIFVzZWQgaW4gSmFjb2JpU1ZEIHRvIGluZGljYXRlIHRoYXQgdGhlIHNxdWFyZSBtYXRyaXggVSBpcyB0byBiZSBjb21wdXRlZC4gKi8KKyAgQ29tcHV0ZUZ1bGxVICAgICAgICA9IDB4MDQsCisgIC8qKiBVc2VkIGluIEphY29iaVNWRCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0aGluIG1hdHJpeCBVIGlzIHRvIGJlIGNvbXB1dGVkLiAqLworICBDb21wdXRlVGhpblUgICAgICAgID0gMHgwOCwKKyAgLyoqIFVzZWQgaW4gSmFjb2JpU1ZEIHRvIGluZGljYXRlIHRoYXQgdGhlIHNxdWFyZSBtYXRyaXggViBpcyB0byBiZSBjb21wdXRlZC4gKi8KKyAgQ29tcHV0ZUZ1bGxWICAgICAgICA9IDB4MTAsCisgIC8qKiBVc2VkIGluIEphY29iaVNWRCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0aGluIG1hdHJpeCBWIGlzIHRvIGJlIGNvbXB1dGVkLiAqLworICBDb21wdXRlVGhpblYgICAgICAgID0gMHgyMCwKKyAgLyoqIFVzZWQgaW4gU2VsZkFkam9pbnRFaWdlblNvbHZlciBhbmQgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyIHRvIHNwZWNpZnkKKyAgICAqIHRoYXQgb25seSB0aGUgZWlnZW52YWx1ZXMgYXJlIHRvIGJlIGNvbXB1dGVkIGFuZCBub3QgdGhlIGVpZ2VudmVjdG9ycy4gKi8KKyAgRWlnZW52YWx1ZXNPbmx5ICAgICA9IDB4NDAsCisgIC8qKiBVc2VkIGluIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgYW5kIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlciB0byBzcGVjaWZ5CisgICAgKiB0aGF0IGJvdGggdGhlIGVpZ2VudmFsdWVzIGFuZCB0aGUgZWlnZW52ZWN0b3JzIGFyZSB0byBiZSBjb21wdXRlZC4gKi8KKyAgQ29tcHV0ZUVpZ2VudmVjdG9ycyA9IDB4ODAsCisgIC8qKiBcaW50ZXJuYWwgKi8KKyAgRWlnVmVjTWFzayA9IEVpZ2VudmFsdWVzT25seSB8IENvbXB1dGVFaWdlbnZlY3RvcnMsCisgIC8qKiBVc2VkIGluIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlciB0byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZAorICAgICogc29sdmUgdGhlIGdlbmVyYWxpemVkIGVpZ2VucHJvYmxlbSBcZiQgQXggPSBcbGFtYmRhIEIgeCBcZiQuICovCisgIEF4X2xCeCAgICAgICAgICAgICAgPSAweDEwMCwKKyAgLyoqIFVzZWQgaW4gR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyIHRvIGluZGljYXRlIHRoYXQgaXQgc2hvdWxkCisgICAgKiBzb2x2ZSB0aGUgZ2VuZXJhbGl6ZWQgZWlnZW5wcm9ibGVtIFxmJCBBQnggPSBcbGFtYmRhIHggXGYkLiAqLworICBBQnhfbHggICAgICAgICAgICAgID0gMHgyMDAsCisgIC8qKiBVc2VkIGluIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlciB0byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZAorICAgICogc29sdmUgdGhlIGdlbmVyYWxpemVkIGVpZ2VucHJvYmxlbSBcZiQgQkF4ID0gXGxhbWJkYSB4IFxmJC4gKi8KKyAgQkF4X2x4ICAgICAgICAgICAgICA9IDB4NDAwLAorICAvKiogXGludGVybmFsICovCisgIEdlbkVpZ01hc2sgPSBBeF9sQnggfCBBQnhfbHggfCBCQXhfbHgKK307CisKKy8qKiBcaW5ncm91cCBlbnVtcworICAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIFxwIFFSUHJlY29uZGl0aW9uZXIgdGVtcGxhdGUgcGFyYW1ldGVyIG9mIEphY29iaVNWRC4gKi8KK2VudW0gUVJQcmVjb25kaXRpb25lcnMgeworICAvKiogRG8gbm90IHNwZWNpZnkgd2hhdCBpcyB0byBiZSBkb25lIGlmIHRoZSBTVkQgb2YgYSBub24tc3F1YXJlIG1hdHJpeCBpcyBhc2tlZCBmb3IuICovCisgIE5vUVJQcmVjb25kaXRpb25lciwKKyAgLyoqIFVzZSBhIFFSIGRlY29tcG9zaXRpb24gd2l0aG91dCBwaXZvdGluZyBhcyB0aGUgZmlyc3Qgc3RlcC4gKi8KKyAgSG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyLAorICAvKiogVXNlIGEgUVIgZGVjb21wb3NpdGlvbiB3aXRoIGNvbHVtbiBwaXZvdGluZyBhcyB0aGUgZmlyc3Qgc3RlcC4gKi8KKyAgQ29sUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyLAorICAvKiogVXNlIGEgUVIgZGVjb21wb3NpdGlvbiB3aXRoIGZ1bGwgcGl2b3RpbmcgYXMgdGhlIGZpcnN0IHN0ZXAuICovCisgIEZ1bGxQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXIKK307CisKKyNpZmRlZiBTdWNjZXNzCisjZXJyb3IgVGhlIHByZXByb2Nlc3NvciBzeW1ib2wgJ1N1Y2Nlc3MnIGlzIGRlZmluZWQsIHBvc3NpYmx5IGJ5IHRoZSBYMTEgaGVhZGVyIGZpbGUgWC5oCisjZW5kaWYKKworLyoqIFxpbmdyb3VwIGVudW1zCisgICogRW51bSBmb3IgcmVwb3J0aW5nIHRoZSBzdGF0dXMgb2YgYSBjb21wdXRhdGlvbi4gKi8KK2VudW0gQ29tcHV0YXRpb25JbmZvIHsKKyAgLyoqIENvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLiAqLworICBTdWNjZXNzID0gMCwgICAgICAgIAorICAvKiogVGhlIHByb3ZpZGVkIGRhdGEgZGlkIG5vdCBzYXRpc2Z5IHRoZSBwcmVyZXF1aXNpdGVzLiAqLworICBOdW1lcmljYWxJc3N1ZSA9IDEsIAorICAvKiogSXRlcmF0aXZlIHByb2NlZHVyZSBkaWQgbm90IGNvbnZlcmdlLiAqLworICBOb0NvbnZlcmdlbmNlID0gMiwKKyAgLyoqIFRoZSBpbnB1dHMgYXJlIGludmFsaWQsIG9yIHRoZSBhbGdvcml0aG0gaGFzIGJlZW4gaW1wcm9wZXJseSBjYWxsZWQuCisgICAgKiBXaGVuIGFzc2VydGlvbnMgYXJlIGVuYWJsZWQsIHN1Y2ggZXJyb3JzIHRyaWdnZXIgYW4gYXNzZXJ0LiAqLworICBJbnZhbGlkSW5wdXQgPSAzCit9OworCisvKiogXGluZ3JvdXAgZW51bXMKKyAgKiBFbnVtIHVzZWQgdG8gc3BlY2lmeSBob3cgYSBwYXJ0aWN1bGFyIHRyYW5zZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhIG1hdHJpeC4KKyAgKiBcc2EgVHJhbnNmb3JtLCBIeXBlcnBsYW5lOjp0cmFuc2Zvcm0oKS4gKi8KK2VudW0gVHJhbnNmb3JtVHJhaXRzIHsKKyAgLyoqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIGlzb21ldHJ5LiAqLworICBJc29tZXRyeSAgICAgID0gMHgxLAorICAvKiogVHJhbnNmb3JtYXRpb24gaXMgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uIHN0b3JlZCBhcyBhIChEaW0rMSleMiBtYXRyaXggd2hvc2UgbGFzdCByb3cgaXMgCisgICAgKiBhc3N1bWVkIHRvIGJlIFswIC4uLiAwIDFdLiAqLworICBBZmZpbmUgICAgICAgID0gMHgyLAorICAvKiogVHJhbnNmb3JtYXRpb24gaXMgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uIHN0b3JlZCBhcyBhIChEaW0pIHggKERpbSsxKSBtYXRyaXguICovCisgIEFmZmluZUNvbXBhY3QgPSAweDEwIHwgQWZmaW5lLAorICAvKiogVHJhbnNmb3JtYXRpb24gaXMgYSBnZW5lcmFsIHByb2plY3RpdmUgdHJhbnNmb3JtYXRpb24gc3RvcmVkIGFzIGEgKERpbSsxKV4yIG1hdHJpeC4gKi8KKyAgUHJvamVjdGl2ZSAgICA9IDB4MjAKK307CisKKy8qKiBcaW50ZXJuYWwgXGluZ3JvdXAgZW51bXMKKyAgKiBFbnVtIHVzZWQgdG8gY2hvb3NlIGJldHdlZW4gaW1wbGVtZW50YXRpb24gZGVwZW5kaW5nIG9uIHRoZSBjb21wdXRlciBhcmNoaXRlY3R1cmUuICovCituYW1lc3BhY2UgQXJjaGl0ZWN0dXJlCit7CisgIGVudW0gVHlwZSB7CisgICAgR2VuZXJpYyA9IDB4MCwKKyAgICBTU0UgPSAweDEsCisgICAgQWx0aVZlYyA9IDB4MiwKKyNpZiBkZWZpbmVkIEVJR0VOX1ZFQ1RPUklaRV9TU0UKKyAgICBUYXJnZXQgPSBTU0UKKyNlbGlmIGRlZmluZWQgRUlHRU5fVkVDVE9SSVpFX0FMVElWRUMKKyAgICBUYXJnZXQgPSBBbHRpVmVjCisjZWxzZQorICAgIFRhcmdldCA9IEdlbmVyaWMKKyNlbmRpZgorICB9OworfQorCisvKiogXGludGVybmFsIFxpbmdyb3VwIGVudW1zCisgICogRW51bSB1c2VkIGFzIHRlbXBsYXRlIHBhcmFtZXRlciBpbiBHZW5lcmFsUHJvZHVjdC4gKi8KK2VudW0geyBDb2VmZkJhc2VkUHJvZHVjdE1vZGUsIExhenlDb2VmZkJhc2VkUHJvZHVjdE1vZGUsIE91dGVyUHJvZHVjdCwgSW5uZXJQcm9kdWN0LCBHZW12UHJvZHVjdCwgR2VtbVByb2R1Y3QgfTsKKworLyoqIFxpbnRlcm5hbCBcaW5ncm91cCBlbnVtcworICAqIEVudW0gdXNlZCBpbiBleHBlcmltZW50YWwgcGFyYWxsZWwgaW1wbGVtZW50YXRpb24uICovCitlbnVtIEFjdGlvbiB7R2V0QWN0aW9uLCBTZXRBY3Rpb259OworCisvKiogVGhlIHR5cGUgdXNlZCB0byBpZGVudGlmeSBhIGRlbnNlIHN0b3JhZ2UuICovCitzdHJ1Y3QgRGVuc2Uge307CisKKy8qKiBUaGUgdHlwZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWF0cml4IGV4cHJlc3Npb24gKi8KK3N0cnVjdCBNYXRyaXhYcHIge307CisKKy8qKiBUaGUgdHlwZSB1c2VkIHRvIGlkZW50aWZ5IGFuIGFycmF5IGV4cHJlc3Npb24gKi8KK3N0cnVjdCBBcnJheVhwciB7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DT05TVEFOVFNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwYmYwNgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBFSUdFTl9XQVJOSU5HU19ESVNBQkxFRAorI2RlZmluZSBFSUdFTl9XQVJOSU5HU19ESVNBQkxFRAorCisjaWZkZWYgX01TQ19WRVIKKyAgLy8gNDEwMCAtIHVucmVmZXJlbmNlZCBmb3JtYWwgcGFyYW1ldGVyIChvY2N1cnJlZCBlLmcuIGluIGFsaWduZWRfYWxsb2NhdG9yOjpkZXN0cm95KHBvaW50ZXIgcCkpCisgIC8vIDQxMDEgLSB1bnJlZmVyZW5jZWQgbG9jYWwgdmFyaWFibGUKKyAgLy8gNDEyNyAtIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKyAgLy8gNDE4MSAtIHF1YWxpZmllciBhcHBsaWVkIHRvIHJlZmVyZW5jZSB0eXBlIGlnbm9yZWQKKyAgLy8gNDIxMSAtIG5vbnN0YW5kYXJkIGV4dGVuc2lvbiB1c2VkIDogcmVkZWZpbmVkIGV4dGVybiB0byBzdGF0aWMKKyAgLy8gNDI0NCAtICdhcmd1bWVudCcgOiBjb252ZXJzaW9uIGZyb20gJ3R5cGUxJyB0byAndHlwZTInLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEKKyAgLy8gNDI3MyAtIFF0QWxpZ25lZE1hbGxvYywgaW5jb25zaXN0ZW50IERMTCBsaW5rYWdlCisgIC8vIDQzMjQgLSBzdHJ1Y3R1cmUgd2FzIHBhZGRlZCBkdWUgdG8gZGVjbHNwZWMoYWxpZ24oKSkKKyAgLy8gNDUxMiAtIGFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZAorICAvLyA0NTIyIC0gJ2NsYXNzJyA6IG11bHRpcGxlIGFzc2lnbm1lbnQgb3BlcmF0b3JzIHNwZWNpZmllZAorICAvLyA0NzAwIC0gdW5pbml0aWFsaXplZCBsb2NhbCB2YXJpYWJsZSAneHl6JyB1c2VkCisgIC8vIDQ3MTcgLSAnZnVuY3Rpb24nIDogcmVjdXJzaXZlIG9uIGFsbCBjb250cm9sIHBhdGhzLCBmdW5jdGlvbiB3aWxsIGNhdXNlIHJ1bnRpbWUgc3RhY2sgb3ZlcmZsb3cKKyAgI2lmbmRlZiBFSUdFTl9QRVJNQU5FTlRMWV9ESVNBQkxFX1NUVVBJRF9XQVJOSU5HUworICAgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICNlbmRpZgorICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAwIDQxMDEgNDEyNyA0MTgxIDQyMTEgNDI0NCA0MjczIDQzMjQgNDUxMiA0NTIyIDQ3MDAgNDcxNyApCisjZWxpZiBkZWZpbmVkIF9fSU5URUxfQ09NUElMRVIKKyAgLy8gMjE5NiAtIHJvdXRpbmUgaXMgYm90aCAiaW5saW5lIiBhbmQgIm5vaW5saW5lIiAoIm5vaW5saW5lIiBhc3N1bWVkKQorICAvLyAgICAgICAgSUNDIDEyIGdlbmVyYXRlcyB0aGlzIHdhcm5pbmcgZXZlbiB3aXRob3V0IGFueSBpbmxpbmUga2V5d29yZCwgd2hlbiBkZWZpbmluZyBjbGFzcyBtZXRob2RzICdpbmxpbmUnIGkuZS4gaW5zaWRlIG9mIGNsYXNzIGJvZHkKKyAgLy8gICAgICAgIHR5cGVkZWYgdGhhdCBtYXkgYmUgYSByZWZlcmVuY2UgdHlwZS4KKyAgLy8gMjc5ICAtIGNvbnRyb2xsaW5nIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKyAgLy8gICAgICAgIElDQyAxMiBnZW5lcmF0ZXMgdGhpcyB3YXJuaW5nIG9uIGFzc2VydChjb25zdGFudF9leHByZXNzaW9uX2RlcGVuZGluZ19vbl90ZW1wbGF0ZV9wYXJhbXMpIGFuZCBmcmFua2x5IHRoaXMgaXMgYSBsZWdpdGltYXRlIHVzZSBjYXNlLgorICAjaWZuZGVmIEVJR0VOX1BFUk1BTkVOVExZX0RJU0FCTEVfU1RVUElEX1dBUk5JTkdTCisgICAgI3ByYWdtYSB3YXJuaW5nIHB1c2gKKyAgI2VuZGlmCisgICNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDIxOTYgMjc5CisjZWxpZiBkZWZpbmVkIF9fY2xhbmdfXworICAvLyAtV2NvbnN0YW50LWxvZ2ljYWwtb3BlcmFuZCAtIHdhcm5pbmc6IHVzZSBvZiBsb2dpY2FsICYmIHdpdGggY29uc3RhbnQgb3BlcmFuZDsgc3dpdGNoIHRvIGJpdHdpc2UgJiBvciByZW1vdmUgY29uc3RhbnQKKyAgLy8gICAgIHRoaXMgaXMgcmVhbGx5IGEgc3R1cGlkIHdhcm5pbmcgYXMgaXQgd2FybnMgb24gY29tcGlsZS10aW1lIGV4cHJlc3Npb25zIGludm9sdmluZyBlbnVtcworICAjaWZuZGVmIEVJR0VOX1BFUk1BTkVOVExZX0RJU0FCTEVfU1RVUElEX1dBUk5JTkdTCisgICAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyAgI2VuZGlmCisgICNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2NvbnN0YW50LWxvZ2ljYWwtb3BlcmFuZCIKKyNlbmRpZgorCisjZW5kaWYgLy8gbm90IEVJR0VOX1dBUk5JTkdTX0RJU0FCTEVECmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS91dGlsL0ZvcndhcmREZWNsYXJhdGlvbnMuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvRm9yd2FyZERlY2xhcmF0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZGZlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS91dGlsL0ZvcndhcmREZWNsYXJhdGlvbnMuaApAQCAtMCwwICsxLDI5OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9GT1JXQVJEREVDTEFSQVRJT05TX0gKKyNkZWZpbmUgRUlHRU5fRk9SV0FSRERFQ0xBUkFUSU9OU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRzOworCisvLyBoZXJlIHdlIHNheSBvbmNlIGFuZCBmb3IgYWxsIHRoYXQgdHJhaXRzPGNvbnN0IFQ+ID09IHRyYWl0czxUPgorLy8gV2hlbiBjb25zdG5lc3MgbXVzdCBhZmZlY3QgdHJhaXRzLCBpdCBoYXMgdG8gYmUgY29uc3RuZXNzIG9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgb24gd2hpY2ggVCBpdHNlbGYgZGVwZW5kcy4KKy8vIEZvciBleGFtcGxlLCB0cmFpdHM8TWFwPGNvbnN0IFQ+ID4gIT0gdHJhaXRzPE1hcDxUPiA+LCBidXQKKy8vICAgICAgICAgICAgICB0cmFpdHM8Y29uc3QgTWFwPFQ+ID4gPT0gdHJhaXRzPE1hcDxUPiA+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRzPGNvbnN0IFQ+IDogdHJhaXRzPFQ+IHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgaGFzX2RpcmVjdF9hY2Nlc3MKK3sKKyAgZW51bSB7IHJldCA9ICh0cmFpdHM8RGVyaXZlZD46OkZsYWdzICYgRGlyZWN0QWNjZXNzQml0KSA/IDEgOiAwIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgYWNjZXNzb3JzX2xldmVsCit7CisgIGVudW0geyBoYXNfZGlyZWN0X2FjY2VzcyA9ICh0cmFpdHM8RGVyaXZlZD46OkZsYWdzICYgRGlyZWN0QWNjZXNzQml0KSA/IDEgOiAwLAorICAgICAgICAgaGFzX3dyaXRlX2FjY2VzcyA9ICh0cmFpdHM8RGVyaXZlZD46OkZsYWdzICYgTHZhbHVlQml0KSA/IDEgOiAwLAorICAgICAgICAgdmFsdWUgPSBoYXNfZGlyZWN0X2FjY2VzcyA/IChoYXNfd3JpdGVfYWNjZXNzID8gRGlyZWN0V3JpdGVBY2Nlc3NvcnMgOiBEaXJlY3RBY2Nlc3NvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGhhc193cml0ZV9hY2Nlc3MgPyBXcml0ZUFjY2Vzc29ycyAgICAgICA6IFJlYWRPbmx5QWNjZXNzb3JzKQorICB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBOdW1UcmFpdHM7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBFaWdlbkJhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBEZW5zZUJhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBQbGFpbk9iamVjdEJhc2U7CisKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwKKyAgICAgICAgIGludCBMZXZlbCA9IGludGVybmFsOjphY2Nlc3NvcnNfbGV2ZWw8RGVyaXZlZD46OnZhbHVlID4KK2NsYXNzIERlbnNlQ29lZmZzQmFzZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsCisgICAgICAgICBpbnQgX09wdGlvbnMgPSBBdXRvQWxpZ24gfAorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fPT0zICYmIF9fR05VQ19NSU5PUl9fPT00CisgICAgLy8gd29ya2Fyb3VuZCBhIGJ1ZyBpbiBhdCBsZWFzdCBnY2MgMy40LjYKKyAgICAvLyB0aGUgaW5uZXJtb3N0ID86IHRlcm5hcnkgb3BlcmF0b3IgaXMgbWlzcGFyc2VkLiBXZSB3cml0ZSBpdCBzbGlnaHRseQorICAgIC8vIGRpZmZlcmVudGx5IGFuZCB0aGlzIG1ha2VzIGdjYyAzLjQuNiBoYXBweSwgYnV0IGl0J3MgdWdseS4KKyAgICAvLyBUaGUgZXJyb3Igd291bGQgb25seSBzaG93IHVwIHdpdGggRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IgaXMgZGVmaW5lZAorICAgIC8vICh3aGVuIEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OIGlzIFJvd01ham9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoIChfUm93cz09MSAmJiBfQ29scyE9MSkgPyBSb3dNYWpvcgorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICEoX0NvbHM9PTEgJiYgX1Jvd3MhPTEpID8gIEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ29sTWFqb3IgKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICggKF9Sb3dzPT0xICYmIF9Db2xzIT0xKSA/IFJvd01ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9Db2xzPT0xICYmIF9Sb3dzIT0xKSA/IENvbE1ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogRUlHRU5fREVGQVVMVF9NQVRSSVhfU1RPUkFHRV9PUkRFUl9PUFRJT04gKSwKKyNlbmRpZgorICAgICAgICAgaW50IF9NYXhSb3dzID0gX1Jvd3MsCisgICAgICAgICBpbnQgX01heENvbHMgPSBfQ29scworPiBjbGFzcyBNYXRyaXg7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hdHJpeEJhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBBcnJheUJhc2U7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB1bnNpZ25lZCBpbnQgQWRkZWQsIHVuc2lnbmVkIGludCBSZW1vdmVkPiBjbGFzcyBGbGFnZ2VkOwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsIHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgU3RvcmFnZUJhc2UgPiBjbGFzcyBOb0FsaWFzOwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+IGNsYXNzIE5lc3RCeVZhbHVlOwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+IGNsYXNzIEZvcmNlQWxpZ25lZEFjY2VzczsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPiBjbGFzcyBTd2FwV3JhcHBlcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgaW50IEJsb2NrUm93cz1EeW5hbWljLCBpbnQgQmxvY2tDb2xzPUR5bmFtaWMsIGJvb2wgSW5uZXJQYW5lbCA9IGZhbHNlLAorICAgICAgICAgYm9vbCBIYXNEaXJlY3RBY2Nlc3MgPSBpbnRlcm5hbDo6aGFzX2RpcmVjdF9hY2Nlc3M8WHByVHlwZT46OnJldD4gY2xhc3MgQmxvY2s7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBTaXplPUR5bmFtaWM+IGNsYXNzIFZlY3RvckJsb2NrOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgVHJhbnNwb3NlOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgQ29uanVnYXRlOwordGVtcGxhdGU8dHlwZW5hbWUgTnVsbGFyeU9wLCB0eXBlbmFtZSBNYXRyaXhUeXBlPiAgICAgICAgIGNsYXNzIEN3aXNlTnVsbGFyeU9wOwordGVtcGxhdGU8dHlwZW5hbWUgVW5hcnlPcCwgICB0eXBlbmFtZSBNYXRyaXhUeXBlPiAgICAgICAgIGNsYXNzIEN3aXNlVW5hcnlPcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFZpZXdPcCwgICAgdHlwZW5hbWUgTWF0cml4VHlwZT4gICAgICAgICBjbGFzcyBDd2lzZVVuYXJ5VmlldzsKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCAgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+ICBjbGFzcyBDd2lzZUJpbmFyeU9wOwordGVtcGxhdGU8dHlwZW5hbWUgQmluT3AsICAgICB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4gIGNsYXNzIFNlbGZDd2lzZUJpbmFyeU9wOwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgICB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4gIGNsYXNzIFByb2R1Y3RCYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlPiAgICAgICAgICAgIGNsYXNzIEdlbmVyYWxQcm9kdWN0OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBOZXN0aW5nRmxhZ3M+ICAgIGNsYXNzIENvZWZmQmFzZWRQcm9kdWN0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBEaWFnb25hbEJhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfRGlhZ29uYWxWZWN0b3JUeXBlPiBjbGFzcyBEaWFnb25hbFdyYXBwZXI7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgU2l6ZUF0Q29tcGlsZVRpbWUsIGludCBNYXhTaXplQXRDb21waWxlVGltZT1TaXplQXRDb21waWxlVGltZT4gY2xhc3MgRGlhZ29uYWxNYXRyaXg7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBEaWFnb25hbFR5cGUsIGludCBQcm9kdWN0T3JkZXI+IGNsYXNzIERpYWdvbmFsUHJvZHVjdDsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBJbmRleCA9IDA+IGNsYXNzIERpYWdvbmFsOwordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUaW1lLCBpbnQgTWF4U2l6ZUF0Q29tcGlsZVRpbWUgPSBTaXplQXRDb21waWxlVGltZSwgdHlwZW5hbWUgSW5kZXhUeXBlPWludD4gY2xhc3MgUGVybXV0YXRpb25NYXRyaXg7Cit0ZW1wbGF0ZTxpbnQgU2l6ZUF0Q29tcGlsZVRpbWUsIGludCBNYXhTaXplQXRDb21waWxlVGltZSA9IFNpemVBdENvbXBpbGVUaW1lLCB0eXBlbmFtZSBJbmRleFR5cGU9aW50PiBjbGFzcyBUcmFuc3Bvc2l0aW9uczsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFBlcm11dGF0aW9uQmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFRyYW5zcG9zaXRpb25zQmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIF9JbmRpY2VzVHlwZT4gY2xhc3MgUGVybXV0YXRpb25XcmFwcGVyOwordGVtcGxhdGU8dHlwZW5hbWUgX0luZGljZXNUeXBlPiBjbGFzcyBUcmFuc3Bvc2l0aW9uc1dyYXBwZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsCisgICAgICAgICBpbnQgTGV2ZWwgPSBpbnRlcm5hbDo6YWNjZXNzb3JzX2xldmVsPERlcml2ZWQ+OjpoYXNfd3JpdGVfYWNjZXNzID8gV3JpdGVBY2Nlc3NvcnMgOiBSZWFkT25seUFjY2Vzc29ycworPiBjbGFzcyBNYXBCYXNlOwordGVtcGxhdGU8aW50IElubmVyU3RyaWRlQXRDb21waWxlVGltZSwgaW50IE91dGVyU3RyaWRlQXRDb21waWxlVGltZT4gY2xhc3MgU3RyaWRlOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IE1hcE9wdGlvbnM9VW5hbGlnbmVkLCB0eXBlbmFtZSBTdHJpZGVUeXBlID0gU3RyaWRlPDAsMD4gPiBjbGFzcyBNYXA7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFRyaWFuZ3VsYXJCYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IE1vZGU+IGNsYXNzIFRyaWFuZ3VsYXJWaWV3OwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IE1vZGU+IGNsYXNzIFNlbGZBZGpvaW50VmlldzsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIFNwYXJzZVZpZXc7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4gY2xhc3MgV2l0aEZvcm1hdDsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHN0cnVjdCBDb21tYUluaXRpYWxpemVyOwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgUmV0dXJuQnlWYWx1ZTsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPiBjbGFzcyBBcnJheVdyYXBwZXI7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4gY2xhc3MgTWF0cml4V3JhcHBlcjsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBSaHM+IHN0cnVjdCBzb2x2ZV9yZXR2YWxfYmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBSaHM+IHN0cnVjdCBzb2x2ZV9yZXR2YWw7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZT4gc3RydWN0IGtlcm5lbF9yZXR2YWxfYmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlPiBzdHJ1Y3Qga2VybmVsX3JldHZhbDsKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlPiBzdHJ1Y3QgaW1hZ2VfcmV0dmFsX2Jhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZT4gc3RydWN0IGltYWdlX3JldHZhbDsKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IFJvd3M9RHluYW1pYywgaW50IENvbHM9RHluYW1pYywgaW50IFN1cGVycz1EeW5hbWljLCBpbnQgU3Vicz1EeW5hbWljLCBpbnQgT3B0aW9ucz0wPiBjbGFzcyBCYW5kTWF0cml4OworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+IHN0cnVjdCBwcm9kdWN0X3R5cGU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLAorICAgICAgICAgaW50IFByb2R1Y3RUeXBlID0gaW50ZXJuYWw6OnByb2R1Y3RfdHlwZTxMaHMsUmhzPjo6dmFsdWU+CitzdHJ1Y3QgUHJvZHVjdFJldHVyblR5cGU7CisKKy8vIHRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBzdW4gQ0MKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiBzdHJ1Y3QgTGF6eVByb2R1Y3RSZXR1cm5UeXBlOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBQcm92aWRlcyBzY2FsYXIvcGFja2V0LXdpc2UgcHJvZHVjdCBhbmQgcHJvZHVjdCB3aXRoIGFjY3VtdWxhdGlvbgorLy8gd2l0aCBvcHRpb25hbCBjb25qdWdhdGlvbiBvZiB0aGUgYXJndW1lbnRzLgordGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29uakxocz1mYWxzZSwgYm9vbCBDb25qUmhzPWZhbHNlPiBzdHJ1Y3QgY29ual9oZWxwZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9zdW1fb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfZGlmZmVyZW5jZV9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI+IHN0cnVjdCBzY2FsYXJfY29ual9wcm9kdWN0X29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3F1b3RpZW50X29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX29wcG9zaXRlX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2Nvbmp1Z2F0ZV9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9yZWFsX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2ltYWdfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfYWJzX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2FiczJfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfc3FydF9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9leHBfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfbG9nX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX2Nvc19vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9zaW5fb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfYWNvc19vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9hc2luX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3Rhbl9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9wb3dfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfaW52ZXJzZV9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9zcXVhcmVfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfY3ViZV9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgTmV3VHlwZT4gc3RydWN0IHNjYWxhcl9jYXN0X29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX211bHRpcGxlX29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3F1b3RpZW50MV9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9taW5fb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfbWF4X29wOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3JhbmRvbV9vcDsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IHNjYWxhcl9hZGRfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfY29uc3RhbnRfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBzY2FsYXJfaWRlbnRpdHlfb3A7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhcix0eXBlbmFtZSBSaHNTY2FsYXI9TGhzU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX3Byb2R1Y3Rfb3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNTY2FsYXIsdHlwZW5hbWUgUmhzU2NhbGFyPiBzdHJ1Y3Qgc2NhbGFyX211bHRpcGxlMl9vcDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3N0cnVjdCBJT0Zvcm1hdDsKKworLy8gQXJyYXkgbW9kdWxlCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywKKyAgICAgICAgIGludCBfT3B0aW9ucyA9IEF1dG9BbGlnbiB8CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX189PTMgJiYgX19HTlVDX01JTk9SX189PTQKKyAgICAvLyB3b3JrYXJvdW5kIGEgYnVnIGluIGF0IGxlYXN0IGdjYyAzLjQuNgorICAgIC8vIHRoZSBpbm5lcm1vc3QgPzogdGVybmFyeSBvcGVyYXRvciBpcyBtaXNwYXJzZWQuIFdlIHdyaXRlIGl0IHNsaWdodGx5CisgICAgLy8gZGlmZmVyZW50bHkgYW5kIHRoaXMgbWFrZXMgZ2NjIDMuNC42IGhhcHB5LCBidXQgaXQncyB1Z2x5LgorICAgIC8vIFRoZSBlcnJvciB3b3VsZCBvbmx5IHNob3cgdXAgd2l0aCBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUiBpcyBkZWZpbmVkCisgICAgLy8gKHdoZW4gRUlHRU5fREVGQVVMVF9NQVRSSVhfU1RPUkFHRV9PUkRFUl9PUFRJT04gaXMgUm93TWFqb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICggKF9Sb3dzPT0xICYmIF9Db2xzIT0xKSA/IFJvd01ham9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIShfQ29scz09MSAmJiBfUm93cyE9MSkgPyAgRUlHRU5fREVGQVVMVF9NQVRSSVhfU1RPUkFHRV9PUkRFUl9PUFRJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb2xNYWpvciApLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoX1Jvd3M9PTEgJiYgX0NvbHMhPTEpID8gUm93TWFqb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoX0NvbHM9PTEgJiYgX1Jvd3MhPTEpID8gQ29sTWFqb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFSUdFTl9ERUZBVUxUX01BVFJJWF9TVE9SQUdFX09SREVSX09QVElPTiApLAorI2VuZGlmCisgICAgICAgICBpbnQgX01heFJvd3MgPSBfUm93cywgaW50IF9NYXhDb2xzID0gX0NvbHM+IGNsYXNzIEFycmF5OwordGVtcGxhdGU8dHlwZW5hbWUgQ29uZGl0aW9uTWF0cml4VHlwZSwgdHlwZW5hbWUgVGhlbk1hdHJpeFR5cGUsIHR5cGVuYW1lIEVsc2VNYXRyaXhUeXBlPiBjbGFzcyBTZWxlY3Q7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBCaW5hcnlPcCwgaW50IERpcmVjdGlvbj4gY2xhc3MgUGFydGlhbFJlZHV4RXhwcjsKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCBpbnQgRGlyZWN0aW9uPiBjbGFzcyBWZWN0b3J3aXNlT3A7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLGludCBSb3dGYWN0b3IsaW50IENvbEZhY3Rvcj4gY2xhc3MgUmVwbGljYXRlOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IERpcmVjdGlvbiA9IEJvdGhEaXJlY3Rpb25zPiBjbGFzcyBSZXZlcnNlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBGdWxsUGl2TFU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBQYXJ0aWFsUGl2TFU7CituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IGludmVyc2VfaW1wbDsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIEhvdXNlaG9sZGVyUVI7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBDb2xQaXZIb3VzZWhvbGRlclFSOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgRnVsbFBpdkhvdXNlaG9sZGVyUVI7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgUVJQcmVjb25kaXRpb25lciA9IENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4gY2xhc3MgSmFjb2JpU1ZEOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFVwTG8gPSBMb3dlcj4gY2xhc3MgTExUOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFVwTG8gPSBMb3dlcj4gY2xhc3MgTERMVDsKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvcnNUeXBlLCB0eXBlbmFtZSBDb2VmZnNUeXBlLCBpbnQgU2lkZT1PblRoZUxlZnQ+IGNsYXNzIEhvdXNlaG9sZGVyU2VxdWVuY2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+ICAgICBjbGFzcyBKYWNvYmlSb3RhdGlvbjsKKworLy8gR2VvbWV0cnkgbW9kdWxlOgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgaW50IF9EaW0+IGNsYXNzIFJvdGF0aW9uQmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiBjbGFzcyBDcm9zczsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFF1YXRlcm5pb25CYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBjbGFzcyBSb3RhdGlvbjJEOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBjbGFzcyBBbmdsZUF4aXM7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IERpbT4gY2xhc3MgVHJhbnNsYXRpb247CisKKyNpZmRlZiBFSUdFTjJfU1VQUE9SVAordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgaW50IF9EaW0+IGNsYXNzIGVpZ2VuMl9Sb3RhdGlvbkJhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4gY2xhc3MgZWlnZW4yX0Nyb3NzOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBjbGFzcyBlaWdlbjJfUXVhdGVybmlvbjsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gY2xhc3MgZWlnZW4yX1JvdGF0aW9uMkQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IGNsYXNzIGVpZ2VuMl9BbmdsZUF4aXM7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IERpbT4gY2xhc3MgZWlnZW4yX1RyYW5zZm9ybTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0+IGNsYXNzIGVpZ2VuMl9QYXJhbWV0cml6ZWRMaW5lOwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbT4gY2xhc3MgZWlnZW4yX0h5cGVycGxhbmU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IERpbT4gY2xhc3MgZWlnZW4yX1RyYW5zbGF0aW9uOwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBEaW0+IGNsYXNzIGVpZ2VuMl9TY2FsaW5nOworI2VuZGlmCisKKyNpZiBFSUdFTjJfU1VQUE9SVF9TVEFHRSA8IFNUQUdFMjBfUkVTT0xWRV9BUElfQ09ORkxJQ1RTCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IGNsYXNzIFF1YXRlcm5pb247Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IERpbT4gY2xhc3MgVHJhbnNmb3JtOwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbT4gY2xhc3MgUGFyYW1ldHJpemVkTGluZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0+IGNsYXNzIEh5cGVycGxhbmU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IERpbT4gY2xhc3MgU2NhbGluZzsKKyNlbmRpZgorCisjaWYgRUlHRU4yX1NVUFBPUlRfU1RBR0UgPiBTVEFHRTIwX1JFU09MVkVfQVBJX0NPTkZMSUNUUwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucyA9IEF1dG9BbGlnbj4gY2xhc3MgUXVhdGVybmlvbjsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgRGltLGludCBNb2RlLGludCBfT3B0aW9ucz1BdXRvQWxpZ24+IGNsYXNzIFRyYW5zZm9ybTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0sIGludCBPcHRpb25zPUF1dG9BbGlnbj4gY2xhc3MgUGFyYW1ldHJpemVkTGluZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0sIGludCBPcHRpb25zPUF1dG9BbGlnbj4gY2xhc3MgSHlwZXJwbGFuZTsKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gY2xhc3MgVW5pZm9ybVNjYWxpbmc7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLGludCBEaXJlY3Rpb24+IGNsYXNzIEhvbW9nZW5lb3VzOworI2VuZGlmCisKKy8vIE1hdHJpeEZ1bmN0aW9ucyBtb2R1bGUKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBNYXRyaXhFeHBvbmVudGlhbFJldHVyblZhbHVlOwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hdHJpeFNxdWFyZVJvb3RSZXR1cm5WYWx1ZTsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlOworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBzdGVtX2Z1bmN0aW9uCit7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsPiBDb21wbGV4U2NhbGFyOworICB0eXBlZGVmIENvbXBsZXhTY2FsYXIgdHlwZShDb21wbGV4U2NhbGFyLCBpbnQpOworfTsKK30KKworCisjaWZkZWYgRUlHRU4yX1NVUFBPUlQKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPiBjbGFzcyBDd2lzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIE1pbm9yOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgTFU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBRUjsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIFNWRDsKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgTW9kZT4gc3RydWN0IGVpZ2VuMl9wYXJ0X3JldHVybl90eXBlOworfQorI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRk9SV0FSRERFQ0xBUkFUSU9OU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS91dGlsL01LTF9zdXBwb3J0LmggYi9FaWdlbi9zcmMvQ29yZS91dGlsL01LTF9zdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2ZTM1NQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTUtMX3N1cHBvcnQuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICBJbmNsdWRlIGZpbGUgd2l0aCBjb21tb24gTUtMIGRlY2xhcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX01LTF9TVVBQT1JUX0gKKyNkZWZpbmUgRUlHRU5fTUtMX1NVUFBPUlRfSAorCisjaWZkZWYgRUlHRU5fVVNFX01LTF9BTEwKKyAgI2lmbmRlZiBFSUdFTl9VU0VfQkxBUworICAgICNkZWZpbmUgRUlHRU5fVVNFX0JMQVMKKyAgI2VuZGlmCisgICNpZm5kZWYgRUlHRU5fVVNFX0xBUEFDS0UKKyAgICAjZGVmaW5lIEVJR0VOX1VTRV9MQVBBQ0tFCisgICNlbmRpZgorICAjaWZuZGVmIEVJR0VOX1VTRV9NS0xfVk1MCisgICAgI2RlZmluZSBFSUdFTl9VU0VfTUtMX1ZNTAorICAjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVVNFX0xBUEFDS0VfU1RSSUNUCisgICNkZWZpbmUgRUlHRU5fVVNFX0xBUEFDS0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChFSUdFTl9VU0VfQkxBUykgfHwgZGVmaW5lZChFSUdFTl9VU0VfTEFQQUNLRSkgfHwgZGVmaW5lZChFSUdFTl9VU0VfTUtMX1ZNTCkKKyAgI2RlZmluZSBFSUdFTl9VU0VfTUtMCisjZW5kaWYKKworI2lmIGRlZmluZWQgRUlHRU5fVVNFX01LTAorCisjaW5jbHVkZSA8bWtsLmg+CisjaW5jbHVkZSA8bWtsX2xhcGFja2UuaD4KKyNkZWZpbmUgRUlHRU5fTUtMX1ZNTF9USFJFU0hPTEQgMTI4CisKK25hbWVzcGFjZSBFaWdlbiB7CisKK3R5cGVkZWYgc3RkOjpjb21wbGV4PGRvdWJsZT4gZGNvbXBsZXg7Cit0eXBlZGVmIHN0ZDo6Y29tcGxleDxmbG9hdD4gIHNjb21wbGV4OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNS0xUeXBlLCB0eXBlbmFtZSBFaWdlblR5cGU+CitzdGF0aWMgaW5saW5lIHZvaWQgYXNzaWduX3NjYWxhcl9laWcybWtsKE1LTFR5cGUmIG1rbFNjYWxhciwgY29uc3QgRWlnZW5UeXBlJiBlaWdlblNjYWxhcikgeworICBta2xTY2FsYXI9ZWlnZW5TY2FsYXI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1LTFR5cGUsIHR5cGVuYW1lIEVpZ2VuVHlwZT4KK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NpZ25fY29ual9zY2FsYXJfZWlnMm1rbChNS0xUeXBlJiBta2xTY2FsYXIsIGNvbnN0IEVpZ2VuVHlwZSYgZWlnZW5TY2FsYXIpIHsKKyAgbWtsU2NhbGFyPWVpZ2VuU2NhbGFyOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgYXNzaWduX3NjYWxhcl9laWcybWtsPE1LTF9Db21wbGV4MTYsZGNvbXBsZXg+KE1LTF9Db21wbGV4MTYmIG1rbFNjYWxhciwgY29uc3QgZGNvbXBsZXgmIGVpZ2VuU2NhbGFyKSB7CisgIG1rbFNjYWxhci5yZWFsPWVpZ2VuU2NhbGFyLnJlYWwoKTsKKyAgbWtsU2NhbGFyLmltYWc9ZWlnZW5TY2FsYXIuaW1hZygpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgYXNzaWduX3NjYWxhcl9laWcybWtsPE1LTF9Db21wbGV4OCxzY29tcGxleD4oTUtMX0NvbXBsZXg4JiBta2xTY2FsYXIsIGNvbnN0IHNjb21wbGV4JiBlaWdlblNjYWxhcikgeworICBta2xTY2FsYXIucmVhbD1laWdlblNjYWxhci5yZWFsKCk7CisgIG1rbFNjYWxhci5pbWFnPWVpZ2VuU2NhbGFyLmltYWcoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIGFzc2lnbl9jb25qX3NjYWxhcl9laWcybWtsPE1LTF9Db21wbGV4MTYsZGNvbXBsZXg+KE1LTF9Db21wbGV4MTYmIG1rbFNjYWxhciwgY29uc3QgZGNvbXBsZXgmIGVpZ2VuU2NhbGFyKSB7CisgIG1rbFNjYWxhci5yZWFsPWVpZ2VuU2NhbGFyLnJlYWwoKTsKKyAgbWtsU2NhbGFyLmltYWc9LWVpZ2VuU2NhbGFyLmltYWcoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIGFzc2lnbl9jb25qX3NjYWxhcl9laWcybWtsPE1LTF9Db21wbGV4OCxzY29tcGxleD4oTUtMX0NvbXBsZXg4JiBta2xTY2FsYXIsIGNvbnN0IHNjb21wbGV4JiBlaWdlblNjYWxhcikgeworICBta2xTY2FsYXIucmVhbD1laWdlblNjYWxhci5yZWFsKCk7CisgIG1rbFNjYWxhci5pbWFnPS1laWdlblNjYWxhci5pbWFnKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmCisKKyNlbmRpZiAvLyBFSUdFTl9NS0xfU1VQUE9SVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS91dGlsL01hY3Jvcy5oIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9NYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTczYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9NYWNyb3MuaApAQCAtMCwwICsxLDQxMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NQUNST1NfSAorI2RlZmluZSBFSUdFTl9NQUNST1NfSAorCisjZGVmaW5lIEVJR0VOX1dPUkxEX1ZFUlNJT04gMworI2RlZmluZSBFSUdFTl9NQUpPUl9WRVJTSU9OIDEKKyNkZWZpbmUgRUlHRU5fTUlOT1JfVkVSU0lPTiAxCisKKyNkZWZpbmUgRUlHRU5fVkVSU0lPTl9BVF9MRUFTVCh4LHkseikgKEVJR0VOX1dPUkxEX1ZFUlNJT04+eCB8fCAoRUlHRU5fV09STERfVkVSU0lPTj49eCAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFSUdFTl9NQUpPUl9WRVJTSU9OPnkgfHwgKEVJR0VOX01BSk9SX1ZFUlNJT04+PXkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9NSU5PUl9WRVJTSU9OPj16KSkpKQorI2lmZGVmIF9fR05VQ19fCisgICNkZWZpbmUgRUlHRU5fR05VQ19BVF9MRUFTVCh4LHkpICgoX19HTlVDX189PXggJiYgX19HTlVDX01JTk9SX18+PXkpIHx8IF9fR05VQ19fPngpCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0dOVUNfQVRfTEVBU1QoeCx5KSAwCisjZW5kaWYKKyAKKyNpZmRlZiBfX0dOVUNfXworICAjZGVmaW5lIEVJR0VOX0dOVUNfQVRfTU9TVCh4LHkpICgoX19HTlVDX189PXggJiYgX19HTlVDX01JTk9SX188PXkpIHx8IF9fR05VQ19fPHgpCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0dOVUNfQVRfTU9TVCh4LHkpIDAKKyNlbmRpZgorCisjaWYgRUlHRU5fR05VQ19BVF9NT1NUKDQsMykgJiYgIWRlZmluZWQoX19jbGFuZ19fKQorICAvLyBzZWUgYnVnIDg5CisgICNkZWZpbmUgRUlHRU5fU0FGRV9UT19VU0VfU1RBTkRBUkRfQVNTRVJUX01BQ1JPIDAKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fU0FGRV9UT19VU0VfU1RBTkRBUkRfQVNTRVJUX01BQ1JPIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fIDw9IDMpCisjZGVmaW5lIEVJR0VOX0dDQzNfT1JfT0xERVIgMQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fR0NDM19PUl9PTERFUiAwCisjZW5kaWYKKworLy8gMTYgYnl0ZSBhbGlnbm1lbnQgaXMgb25seSB1c2VmdWwgZm9yIHZlY3Rvcml6YXRpb24uIFNpbmNlIGl0IGFmZmVjdHMgdGhlIEFCSSwgd2UgbmVlZCB0byBlbmFibGUKKy8vIDE2IGJ5dGUgYWxpZ25tZW50IG9uIGFsbCBwbGF0Zm9ybXMgd2hlcmUgdmVjdG9yaXphdGlvbiBtaWdodCBiZSBlbmFibGVkLiBJbiB0aGVvcnkgd2UgY291bGQgYWx3YXlzCisvLyBlbmFibGUgYWxpZ25tZW50LCBidXQgaXQgY2FuIGJlIGEgY2F1c2Ugb2YgcHJvYmxlbXMgb24gc29tZSBwbGF0Zm9ybXMsIHNvIHdlIGp1c3QgZGlzYWJsZSBpdCBpbgorLy8gY2VydGFpbiBjb21tb24gcGxhdGZvcm0gKGNvbXBpbGVyK2FyY2hpdGVjdHVyZSBjb21iaW5hdGlvbnMpIHRvIGF2b2lkIHRoZXNlIHByb2JsZW1zLgorLy8gT25seSBzdGF0aWMgYWxpZ25tZW50IGlzIHJlYWxseSBwcm9ibGVtYXRpYyAocmVsaWVzIG9uIG5vbnN0YW5kYXJkIGNvbXBpbGVyIGV4dGVuc2lvbnMgdGhhdCBkb24ndAorLy8gd29yayBldmVyeXdoZXJlLCBmb3IgZXhhbXBsZSBkb24ndCB3b3JrIG9uIEdDQy9BUk0pLCB0cnkgdG8ga2VlcCBoZWFwIGFsaWdubWVudCBldmVuCisvLyB3aGVuIHdlIGhhdmUgdG8gZGlzYWJsZSBzdGF0aWMgYWxpZ25tZW50LgorI2lmIGRlZmluZWQoX19HTlVDX18pICYmICEoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fcHBjX18pIHx8IGRlZmluZWQoX19pYTY0X18pKQorI2RlZmluZSBFSUdFTl9HQ0NfQU5EX0FSQ0hfRE9FU05UX1dBTlRfU1RBQ0tfQUxJR05NRU5UIDEKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0dDQ19BTkRfQVJDSF9ET0VTTlRfV0FOVF9TVEFDS19BTElHTk1FTlQgMAorI2VuZGlmCisKKy8vIHN0YXRpYyBhbGlnbm1lbnQgaXMgY29tcGxldGVseSBkaXNhYmxlZCB3aXRoIEdDQyAzLCBTdW4gU3R1ZGlvLCBhbmQgUUNDL1FOWAorI2lmICFFSUdFTl9HQ0NfQU5EX0FSQ0hfRE9FU05UX1dBTlRfU1RBQ0tfQUxJR05NRU5UIFwKKyAmJiAhRUlHRU5fR0NDM19PUl9PTERFUiBcCisgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpIFwKKyAmJiAhZGVmaW5lZChfX1FOWE5UT19fKQorICAjZGVmaW5lIEVJR0VOX0FSQ0hfV0FOVFNfU1RBQ0tfQUxJR05NRU5UIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fQVJDSF9XQU5UU19TVEFDS19BTElHTk1FTlQgMAorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9ET05UX0FMSUdOCisgICNpZm5kZWYgRUlHRU5fRE9OVF9BTElHTl9TVEFUSUNBTExZCisgICAgI2RlZmluZSBFSUdFTl9ET05UX0FMSUdOX1NUQVRJQ0FMTFkKKyAgI2VuZGlmCisgICNkZWZpbmUgRUlHRU5fQUxJR04gMAorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9BTElHTiAxCisjZW5kaWYKKworLy8gRUlHRU5fQUxJR05fU1RBVElDQUxMWSBpcyB0aGUgdHJ1ZSB0ZXN0IHdoZXRoZXIgd2Ugd2FudCB0byBhbGlnbiBhcnJheXMgb24gdGhlIHN0YWNrIG9yIG5vdC4gSXQgdGFrZXMgaW50byBhY2NvdW50IGJvdGggdGhlIHVzZXIgY2hvaWNlIHRvIGV4cGxpY2l0bHkgZGlzYWJsZQorLy8gYWxpZ25tZW50IChFSUdFTl9ET05UX0FMSUdOX1NUQVRJQ0FMTFkpIGFuZCB0aGUgYXJjaGl0ZWN0dXJlIGNvbmZpZyAoRUlHRU5fQVJDSF9XQU5UU19TVEFDS19BTElHTk1FTlQpLiBIZW5jZWZvcnRoLCBvbmx5IEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkgc2hvdWxkIGJlIHVzZWQuCisjaWYgRUlHRU5fQVJDSF9XQU5UU19TVEFDS19BTElHTk1FTlQgJiYgIWRlZmluZWQoRUlHRU5fRE9OVF9BTElHTl9TVEFUSUNBTExZKQorICAjZGVmaW5lIEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9BTElHTl9TVEFUSUNBTExZIDAKKyAgI2lmbmRlZiBFSUdFTl9ESVNBQkxFX1VOQUxJR05FRF9BUlJBWV9BU1NFUlQKKyAgICAjZGVmaW5lIEVJR0VOX0RJU0FCTEVfVU5BTElHTkVEX0FSUkFZX0FTU0VSVAorICAjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9NQVRSSVhfU1RPUkFHRV9PUkRFUl9PUFRJT04gUm93TWFqb3IKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OIENvbE1ham9yCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9ERUZBVUxUX0RFTlNFX0lOREVYX1RZUEUKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9ERU5TRV9JTkRFWF9UWVBFIHN0ZDo6cHRyZGlmZl90CisjZW5kaWYKKworLyoqIEFsbG93cyB0byBkaXNhYmxlIHNvbWUgb3B0aW1pemF0aW9ucyB3aGljaCBtaWdodCBhZmZlY3QgdGhlIGFjY3VyYWN5IG9mIHRoZSByZXN1bHQuCisgICogU3VjaCBvcHRpbWl6YXRpb24gYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgYW5kIHNldCBFSUdFTl9GQVNUX01BVEggdG8gMCB0byBkaXNhYmxlIHRoZW0uCisgICogVGhleSBjdXJyZW50bHkgaW5jbHVkZToKKyAgKiAgIC0gc2luZ2xlIHByZWNpc2lvbiBDd2lzZTo6c2luKCkgYW5kIEN3aXNlOjpjb3MoKSB3aGVuIFNTRSB2ZWN0b3JpemF0aW9uIGlzIGVuYWJsZWQuCisgICovCisjaWZuZGVmIEVJR0VOX0ZBU1RfTUFUSAorI2RlZmluZSBFSUdFTl9GQVNUX01BVEggMQorI2VuZGlmCisKKyNkZWZpbmUgRUlHRU5fREVCVUdfVkFSKHgpIHN0ZDo6Y2VyciA8PCAjeCA8PCAiID0gIiA8PCB4IDw8IHN0ZDo6ZW5kbDsKKworLy8gY29uY2F0ZW5hdGUgdHdvIHRva2VucworI2RlZmluZSBFSUdFTl9DQVQyKGEsYikgYSAjIyBiCisjZGVmaW5lIEVJR0VOX0NBVChhLGIpIEVJR0VOX0NBVDIoYSxiKQorCisvLyBjb252ZXJ0IGEgdG9rZW4gdG8gYSBzdHJpbmcKKyNkZWZpbmUgRUlHRU5fTUFLRVNUUklORzIoYSkgI2EKKyNkZWZpbmUgRUlHRU5fTUFLRVNUUklORyhhKSBFSUdFTl9NQUtFU1RSSU5HMihhKQorCisjaWYgRUlHRU5fR05VQ19BVF9MRUFTVCg0LDEpICYmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyNkZWZpbmUgRUlHRU5fRkxBVFRFTl9BVFRSSUIgX19hdHRyaWJ1dGVfXygoZmxhdHRlbikpCisjZWxzZQorI2RlZmluZSBFSUdFTl9GTEFUVEVOX0FUVFJJQgorI2VuZGlmCisKKy8vIEVJR0VOX1NUUk9OR19JTkxJTkUgaXMgYSBzdHJvbmdlciB2ZXJzaW9uIG9mIHRoZSBpbmxpbmUsIHVzaW5nIF9fZm9yY2VpbmxpbmUgb24gTVNWQywKKy8vIGJ1dCBpdCBzdGlsbCBkb2Vzbid0IHVzZSBHQ0MncyBhbHdheXNfaW5saW5lLiBUaGlzIGlzIHVzZWZ1bCBpbiAoY29tbW9uKSBzaXR1YXRpb25zIHdoZXJlIE1TVkMgbmVlZHMgZm9yY2VpbmxpbmUKKy8vIGJ1dCBHQ0MgaXMgc3RpbGwgZG9pbmcgZmluZSB3aXRoIGp1c3QgaW5saW5lLgorI2lmIChkZWZpbmVkIF9NU0NfVkVSKSB8fCAoZGVmaW5lZCBfX0lOVEVMX0NPTVBJTEVSKQorI2RlZmluZSBFSUdFTl9TVFJPTkdfSU5MSU5FIF9fZm9yY2VpbmxpbmUKKyNlbHNlCisjZGVmaW5lIEVJR0VOX1NUUk9OR19JTkxJTkUgaW5saW5lCisjZW5kaWYKKworLy8gRUlHRU5fQUxXQVlTX0lOTElORSBpcyB0aGUgc3Ryb25nZXQsIGl0IGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyB0aGUgZnVuY3Rpb24gaW5saW5lIGFuZCBhZGRpbmcgZXZlcnkgcG9zc2libGUKKy8vIGF0dHJpYnV0ZSB0byBtYXhpbWl6ZSBpbmxpbmluZy4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gcmVhbGx5IG5lY2Vzc2FyeTogaW4gcGFydGljdWxhciwKKy8vIGl0IHVzZXMgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpIG9uIEdDQywgd2hpY2ggbW9zdCBvZiB0aGUgdGltZSBpcyB1c2VsZXNzIGFuZCBjYW4gc2V2ZXJlbHkgaGFybSBjb21waWxlIHRpbWVzLgorLy8gRklYTUUgd2l0aCB0aGUgYWx3YXlzX2lubGluZSBhdHRyaWJ1dGUsCisvLyBnY2MgMy40LnggcmVwb3J0cyB0aGUgZm9sbG93aW5nIGNvbXBpbGF0aW9uIGVycm9yOgorLy8gICBFdmFsLmg6OTE6IHNvcnJ5LCB1bmltcGxlbWVudGVkOiBpbmxpbmluZyBmYWlsZWQgaW4gY2FsbCB0byAnY29uc3QgRWlnZW46OkV2YWw8RGVyaXZlZD4gRWlnZW46Ok1hdHJpeEJhc2U8U2NhbGFyLCBEZXJpdmVkPjo6ZXZhbCgpIGNvbnN0JworLy8gICAgOiBmdW5jdGlvbiBib2R5IG5vdCBhdmFpbGFibGUKKyNpZiBFSUdFTl9HTlVDX0FUX0xFQVNUKDQsMCkKKyNkZWZpbmUgRUlHRU5fQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkgaW5saW5lCisjZWxzZQorI2RlZmluZSBFSUdFTl9BTFdBWVNfSU5MSU5FIEVJR0VOX1NUUk9OR19JTkxJTkUKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19HTlVDX18pCisjZGVmaW5lIEVJR0VOX0RPTlRfSU5MSU5FIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbGlmIChkZWZpbmVkIF9NU0NfVkVSKQorI2RlZmluZSBFSUdFTl9ET05UX0lOTElORSBfX2RlY2xzcGVjKG5vaW5saW5lKQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fRE9OVF9JTkxJTkUKKyNlbmRpZgorCisvLyB0aGlzIG1hY3JvIGFsbG93cyB0byBnZXQgcmlkIG9mIGxpbmtpbmcgZXJyb3JzIGFib3V0IG11bHRpcGx5IGRlZmluZWQgZnVuY3Rpb25zLgorLy8gIC0gc3RhdGljIGlzIG5vdCB2ZXJ5IGdvb2QgYmVjYXVzZSBpdCBwcmV2ZW50cyBkZWZpbml0aW9ucyBmcm9tIGRpZmZlcmVudCBvYmplY3QgZmlsZXMgdG8gYmUgbWVyZ2VkLgorLy8gICAgICAgICAgIFNvIHN0YXRpYyBjYXVzZXMgdGhlIHJlc3VsdGluZyBsaW5rZWQgZXhlY3V0YWJsZSB0byBiZSBibG9hdGVkIHdpdGggbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGZ1bmN0aW9uLgorLy8gIC0gaW5saW5lIGlzIG5vdCBwZXJmZWN0IGVpdGhlciBhcyBpdCB1bndhbnRlZGx5IGhpbnRzIHRoZSBjb21waWxlciB0b3dhcmQgaW5saW5pbmcgdGhlIGZ1bmN0aW9uLgorI2RlZmluZSBFSUdFTl9ERUNMQVJFX0ZVTkNUSU9OX0FMTE9XSU5HX01VTFRJUExFX0RFRklOSVRJT05TCisjZGVmaW5lIEVJR0VOX0RFRklORV9GVU5DVElPTl9BTExPV0lOR19NVUxUSVBMRV9ERUZJTklUSU9OUyBpbmxpbmUKKworI2lmZGVmIE5ERUJVRworIyBpZm5kZWYgRUlHRU5fTk9fREVCVUcKKyMgIGRlZmluZSBFSUdFTl9OT19ERUJVRworIyBlbmRpZgorI2VuZGlmCisKKy8vIGVpZ2VuX3BsYWluX2Fzc2VydCBpcyB3aGVyZSB3ZSBpbXBsZW1lbnQgdGhlIHdvcmthcm91bmQgZm9yIHRoZSBhc3NlcnQoKSBidWcgaW4gR0NDIDw9IDQuMywgc2VlIGJ1ZyA4OQorI2lmZGVmIEVJR0VOX05PX0RFQlVHCisgICNkZWZpbmUgZWlnZW5fcGxhaW5fYXNzZXJ0KHgpCisjZWxzZQorICAjaWYgRUlHRU5fU0FGRV9UT19VU0VfU1RBTkRBUkRfQVNTRVJUX01BQ1JPCisgICAgbmFtZXNwYWNlIEVpZ2VuIHsKKyAgICBuYW1lc3BhY2UgaW50ZXJuYWwgeworICAgIGlubGluZSBib29sIGNvcHlfYm9vbChib29sIGIpIHsgcmV0dXJuIGI7IH0KKyAgICB9CisgICAgfQorICAgICNkZWZpbmUgZWlnZW5fcGxhaW5fYXNzZXJ0KHgpIGFzc2VydCh4KQorICAjZWxzZQorICAgIC8vIHdvcmsgYXJvdW5kIGJ1ZyA4OQorICAgICNpbmNsdWRlIDxjc3RkbGliPiAgIC8vIGZvciBhYm9ydAorICAgICNpbmNsdWRlIDxpb3N0cmVhbT4gIC8vIGZvciBzdGQ6OmNlcnIKKworICAgIG5hbWVzcGFjZSBFaWdlbiB7CisgICAgbmFtZXNwYWNlIGludGVybmFsIHsKKyAgICAvLyB0cml2aWFsIGZ1bmN0aW9uIGNvcHlpbmcgYSBib29sLiBNdXN0IGJlIEVJR0VOX0RPTlRfSU5MSU5FLCBzbyB3ZSBpbXBsZW1lbnQgaXQgYWZ0ZXIgaW5jbHVkaW5nIEVpZ2VuIGhlYWRlcnMuCisgICAgLy8gc2VlIGJ1ZyA4OS4KKyAgICBuYW1lc3BhY2UgeworICAgIEVJR0VOX0RPTlRfSU5MSU5FIGJvb2wgY29weV9ib29sKGJvb2wgYikgeyByZXR1cm4gYjsgfQorICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhc3NlcnRfZmFpbChjb25zdCBjaGFyICpjb25kaXRpb24sIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgImFzc2VydGlvbiBmYWlsZWQ6ICIgPDwgY29uZGl0aW9uIDw8ICIgaW4gZnVuY3Rpb24gIiA8PCBmdW5jdGlvbiA8PCAiIGF0ICIgPDwgZmlsZSA8PCAiOiIgPDwgbGluZSA8PCBzdGQ6OmVuZGw7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgICB9CisgICAgfQorICAgICNkZWZpbmUgZWlnZW5fcGxhaW5fYXNzZXJ0KHgpIFwKKyAgICAgIGRvIHsgXAorICAgICAgICBpZighRWlnZW46OmludGVybmFsOjpjb3B5X2Jvb2woeCkpIFwKKyAgICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OmFzc2VydF9mYWlsKEVJR0VOX01BS0VTVFJJTkcoeCksIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICAgIH0gd2hpbGUoZmFsc2UpCisgICNlbmRpZgorI2VuZGlmCisKKy8vIGVpZ2VuX2Fzc2VydCBjYW4gYmUgb3ZlcnJpZGRlbgorI2lmbmRlZiBlaWdlbl9hc3NlcnQKKyNkZWZpbmUgZWlnZW5fYXNzZXJ0KHgpIGVpZ2VuX3BsYWluX2Fzc2VydCh4KQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcKKyNkZWZpbmUgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHgpIGVpZ2VuX2Fzc2VydCh4KQorI2Vsc2UKKyNkZWZpbmUgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHgpCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX05PX0RFQlVHCisjZGVmaW5lIEVJR0VOX09OTFlfVVNFRF9GT1JfREVCVUcoeCkgKHZvaWQpeAorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fT05MWV9VU0VEX0ZPUl9ERUJVRyh4KQorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fTk9fREVQUkVDQVRFRF9XQVJOSU5HCisgICNpZiAoZGVmaW5lZCBfX0dOVUNfXykKKyAgICAjZGVmaW5lIEVJR0VOX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCisgICNlbGlmIChkZWZpbmVkIF9NU0NfVkVSKQorICAgICNkZWZpbmUgRUlHRU5fREVQUkVDQVRFRCBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQpCisgICNlbHNlCisgICAgI2RlZmluZSBFSUdFTl9ERVBSRUNBVEVECisgICNlbmRpZgorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9ERVBSRUNBVEVECisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9fR05VQ19fKQorI2RlZmluZSBFSUdFTl9VTlVTRUQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIEVJR0VOX1VOVVNFRAorI2VuZGlmCisKKy8vIFN1cHByZXNzZXMgJ3VudXNlZCB2YXJpYWJsZScgd2FybmluZ3MuCisjZGVmaW5lIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh2YXIpICh2b2lkKXZhcjsKKworI2lmICFkZWZpbmVkKEVJR0VOX0FTTV9DT01NRU5UKSAmJiAoZGVmaW5lZCBfX0dOVUNfXykKKyNkZWZpbmUgRUlHRU5fQVNNX0NPTU1FTlQoWCkgIGFzbSgiIyIgWCkKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0FTTV9DT01NRU5UKFgpCisjZW5kaWYKKworLyogRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkobikgZm9yY2VzIGRhdGEgdG8gYmUgbi1ieXRlIGFsaWduZWQuIFRoaXMgaXMgdXNlZCB0byBzYXRpc2Z5IFNJTUQgcmVxdWlyZW1lbnRzLgorICogSG93ZXZlciwgd2UgZG8gdGhhdCBFVkVOIGlmIHZlY3Rvcml6YXRpb24gKEVJR0VOX1ZFQ1RPUklaRSkgaXMgZGlzYWJsZWQsCisgKiBzbyB0aGF0IHZlY3Rvcml6YXRpb24gZG9lc24ndCBhZmZlY3QgYmluYXJ5IGNvbXBhdGliaWxpdHkuCisgKgorICogSWYgd2UgbWFkZSBhbGlnbm1lbnQgZGVwZW5kIG9uIHdoZXRoZXIgb3Igbm90IEVJR0VOX1ZFQ1RPUklaRSBpcyBkZWZpbmVkLCBpdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIGxpbmsKKyAqIHZlY3Rvcml6ZWQgYW5kIG5vbi12ZWN0b3JpemVkIGNvZGUuCisgKi8KKyNpZiAoZGVmaW5lZCBfX0dOVUNfXykgfHwgKGRlZmluZWQgX19QR0kpIHx8IChkZWZpbmVkIF9fSUJNQ1BQX18pIHx8IChkZWZpbmVkIF9fQVJNQ0NfVkVSU0lPTikKKyAgI2RlZmluZSBFSUdFTl9BTElHTl9UT19CT1VOREFSWShuKSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKG4pKSkKKyNlbGlmIChkZWZpbmVkIF9NU0NfVkVSKQorICAjZGVmaW5lIEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKG4pIF9fZGVjbHNwZWMoYWxpZ24obikpCisjZWxpZiAoZGVmaW5lZCBfX1NVTlBST19DQykKKyAgLy8gRklYTUUgbm90IHN1cmUgYWJvdXQgdGhpcyBvbmU6CisgICNkZWZpbmUgRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkobikgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChuKSkpCisjZWxzZQorICAjZXJyb3IgUGxlYXNlIHRlbGwgbWUgd2hhdCBpcyB0aGUgZXF1aXZhbGVudCBvZiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKG4pKSkgZm9yIHlvdXIgY29tcGlsZXIKKyNlbmRpZgorCisjZGVmaW5lIEVJR0VOX0FMSUdOMTYgRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkoMTYpCisKKyNpZiBFSUdFTl9BTElHTl9TVEFUSUNBTExZCisjZGVmaW5lIEVJR0VOX1VTRVJfQUxJR05fVE9fQk9VTkRBUlkobikgRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkobikKKyNkZWZpbmUgRUlHRU5fVVNFUl9BTElHTjE2IEVJR0VOX0FMSUdOMTYKKyNlbHNlCisjZGVmaW5lIEVJR0VOX1VTRVJfQUxJR05fVE9fQk9VTkRBUlkobikKKyNkZWZpbmUgRUlHRU5fVVNFUl9BTElHTjE2CisjZW5kaWYKKworI2lmZGVmIEVJR0VOX0RPTlRfVVNFX1JFU1RSSUNUX0tFWVdPUkQKKyAgI2RlZmluZSBFSUdFTl9SRVNUUklDVAorI2VuZGlmCisjaWZuZGVmIEVJR0VOX1JFU1RSSUNUCisgICNkZWZpbmUgRUlHRU5fUkVTVFJJQ1QgX19yZXN0cmljdAorI2VuZGlmCisKKyNpZm5kZWYgRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVAorI2RlZmluZSBFSUdFTl9TVEFDS19BTExPQ0FUSU9OX0xJTUlUIDIwMDAwCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9ERUZBVUxUX0lPX0ZPUk1BVAorI2lmZGVmIEVJR0VOX01BS0lOR19ET0NTCisvLyBmb3JtYXQgdXNlZCBpbiBFaWdlbidzIGRvY3VtZW50YXRpb24KKy8vIG5lZWRlZCB0byBkZWZpbmUgaXQgaGVyZSBhcyBlc2NhcGluZyBjaGFyYWN0ZXJzIGluIENNYWtlIGFkZF9kZWZpbml0aW9uJ3MgYXJndW1lbnQgc2VlbXMgdmVyeSBwcm9ibGVtYXRpYy4KKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9JT19GT1JNQVQgRWlnZW46OklPRm9ybWF0KDMsIDAsICIgIiwgIlxuIiwgIiIsICIiKQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fREVGQVVMVF9JT19GT1JNQVQgRWlnZW46OklPRm9ybWF0KCkKKyNlbmRpZgorI2VuZGlmCisKKy8vIGp1c3QgYW4gZW1wdHkgbWFjcm8gIQorI2RlZmluZSBFSUdFTl9FTVBUWQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKCFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpKQorI2RlZmluZSBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfRVFVQUxfT1BFUkFUT1IoRGVyaXZlZCkgXAorICB1c2luZyBCYXNlOjpvcGVyYXRvciA9OworI2Vsc2UKKyNkZWZpbmUgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX0VRVUFMX09QRVJBVE9SKERlcml2ZWQpIFwKKyAgdXNpbmcgQmFzZTo6b3BlcmF0b3IgPTsgXAorICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBEZXJpdmVkJiBvdGhlcikgXAorICB7IFwKKyAgICBCYXNlOjpvcGVyYXRvcj0ob3RoZXIpOyBcCisgICAgcmV0dXJuICp0aGlzOyBcCisgIH0KKyNlbmRpZgorCisjZGVmaW5lIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoRGVyaXZlZCkgXAorICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfRVFVQUxfT1BFUkFUT1IoRGVyaXZlZCkKKworLyoqCisqIEp1c3QgYSBzaWRlIG5vdGUuIENvbW1lbnRpbmcgd2l0aGluIGRlZmluZXMgd29ya3Mgb25seSBieSBkb2N1bWVudGluZworKiBiZWhpbmQgdGhlIG9iamVjdCAodmlhICchPCcpLiBDb21tZW50cyBjYW5ub3QgYmUgbXVsdGktbGluZSBhbmQgdGh1cworKiB3ZSBoYXZlIHRoZXNlIGV4dHJhIGxvbmcgbGluZXMuIFdoYXQgaXMgY29uZnVzaW5nIGRveHlnZW4gb3ZlciBoZXJlIGlzCisqIHRoYXQgd2UgdXNlICdcJyBhbmQgYmFzaWNhbGx5IGhhdmUgYSBidW5jaCBvZiB0eXBlZGVmcyB3aXRoIHRoZWlyCisqIGRvY3VtZW50YXRpb24gaW4gYSBzaW5nbGUgbGluZS4KKyoqLworCisjZGVmaW5lIEVJR0VOX0dFTkVSSUNfUFVCTElDX0lOVEVSRkFDRShEZXJpdmVkKSBcCisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7IC8qITwgXGJyaWVmIE51bWVyaWMgdHlwZSwgZS5nLiBmbG9hdCwgZG91YmxlLCBpbnQgb3Igc3RkOjpjb21wbGV4PGZsb2F0Pi4gKi8gXAorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOyAvKiE8IFxicmllZiBUaGUgdW5kZXJseWluZyBudW1lcmljIHR5cGUgZm9yIGNvbXBvc2VkIHNjYWxhciB0eXBlcy4gXGRldGFpbHMgSW4gY2FzZXMgd2hlcmUgU2NhbGFyIGlzIGUuZy4gc3RkOjpjb21wbGV4PFQ+LCBUIHdlcmUgY29ycmVzcG9uZGluZyB0byBSZWFsU2NhbGFyLiAqLyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q29lZmZSZXR1cm5UeXBlIENvZWZmUmV0dXJuVHlwZTsgLyohPCBcYnJpZWYgVGhlIHJldHVybiB0eXBlIGZvciBjb2VmZmljaWVudCBhY2Nlc3MuIFxkZXRhaWxzIERlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBvYmplY3QgYWxsb3dzIGRpcmVjdCBjb2VmZmljaWVudCBhY2Nlc3MgKGUuZy4gZm9yIGEgTWF0cml4WGQpLCB0aGlzIHR5cGUgaXMgZWl0aGVyICdjb25zdCBTY2FsYXImJyBvciBzaW1wbHkgJ1NjYWxhcicgZm9yIG9iamVjdHMgdGhhdCBkbyBub3QgYWxsb3cgZGlyZWN0IGNvZWZmaWNpZW50IGFjY2Vzcy4gKi8gXAorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPERlcml2ZWQ+Ojp0eXBlIE5lc3RlZDsgXAorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsgXAorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpJbmRleCBJbmRleDsgXAorICBlbnVtIHsgUm93c0F0Q29tcGlsZVRpbWUgPSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsIFwKKyAgICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsIFwKKyAgICAgICAgRmxhZ3MgPSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MsIFwKKyAgICAgICAgQ29lZmZSZWFkQ29zdCA9IEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2VmZlJlYWRDb3N0LCBcCisgICAgICAgIFNpemVBdENvbXBpbGVUaW1lID0gQmFzZTo6U2l6ZUF0Q29tcGlsZVRpbWUsIFwKKyAgICAgICAgTWF4U2l6ZUF0Q29tcGlsZVRpbWUgPSBCYXNlOjpNYXhTaXplQXRDb21waWxlVGltZSwgXAorICAgICAgICBJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPSBCYXNlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgfTsKKworCisjZGVmaW5lIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCkgXAorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOyAvKiE8IFxicmllZiBOdW1lcmljIHR5cGUsIGUuZy4gZmxvYXQsIGRvdWJsZSwgaW50IG9yIHN0ZDo6Y29tcGxleDxmbG9hdD4uICovIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsgLyohPCBcYnJpZWYgVGhlIHVuZGVybHlpbmcgbnVtZXJpYyB0eXBlIGZvciBjb21wb3NlZCBzY2FsYXIgdHlwZXMuIFxkZXRhaWxzIEluIGNhc2VzIHdoZXJlIFNjYWxhciBpcyBlLmcuIHN0ZDo6Y29tcGxleDxUPiwgVCB3ZXJlIGNvcnJlc3BvbmRpbmcgdG8gUmVhbFNjYWxhci4gKi8gXAorICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlBhY2tldFNjYWxhciBQYWNrZXRTY2FsYXI7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOyAvKiE8IFxicmllZiBUaGUgcmV0dXJuIHR5cGUgZm9yIGNvZWZmaWNpZW50IGFjY2Vzcy4gXGRldGFpbHMgRGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG9iamVjdCBhbGxvd3MgZGlyZWN0IGNvZWZmaWNpZW50IGFjY2VzcyAoZS5nLiBmb3IgYSBNYXRyaXhYZCksIHRoaXMgdHlwZSBpcyBlaXRoZXIgJ2NvbnN0IFNjYWxhciYnIG9yIHNpbXBseSAnU2NhbGFyJyBmb3Igb2JqZWN0cyB0aGF0IGRvIG5vdCBhbGxvdyBkaXJlY3QgY29lZmZpY2llbnQgYWNjZXNzLiAqLyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpuZXN0ZWQ8RGVyaXZlZD46OnR5cGUgTmVzdGVkOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkluZGV4IEluZGV4OyBcCisgIGVudW0geyBSb3dzQXRDb21waWxlVGltZSA9IEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwgXAorICAgICAgICBDb2xzQXRDb21waWxlVGltZSA9IEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZSwgXAorICAgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSwgXAorICAgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXhDb2xzQXRDb21waWxlVGltZSwgXAorICAgICAgICBGbGFncyA9IEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpGbGFncywgXAorICAgICAgICBDb2VmZlJlYWRDb3N0ID0gRWlnZW46OmludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvZWZmUmVhZENvc3QsIFwKKyAgICAgICAgU2l6ZUF0Q29tcGlsZVRpbWUgPSBCYXNlOjpTaXplQXRDb21waWxlVGltZSwgXAorICAgICAgICBNYXhTaXplQXRDb21waWxlVGltZSA9IEJhc2U6Ok1heFNpemVBdENvbXBpbGVUaW1lLCBcCisgICAgICAgIElzVmVjdG9yQXRDb21waWxlVGltZSA9IEJhc2U6OklzVmVjdG9yQXRDb21waWxlVGltZSB9OyBcCisgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7IFwKKyAgdXNpbmcgQmFzZTo6Y29uc3RfY2FzdF9kZXJpdmVkOworCisKKyNkZWZpbmUgRUlHRU5fUExBSU5fRU5VTV9NSU4oYSxiKSAoKChpbnQpYSA8PSAoaW50KWIpID8gKGludClhIDogKGludCliKQorI2RlZmluZSBFSUdFTl9QTEFJTl9FTlVNX01BWChhLGIpICgoKGludClhID49IChpbnQpYikgPyAoaW50KWEgOiAoaW50KWIpCisKKy8vIEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDIGdpdmVzIHRoZSBtaW4gYmV0d2VlbiBjb21waWxlLXRpbWUgc2l6ZXMuIDAgaGFzIGFic29sdXRlIHByaW9yaXR5LCBmb2xsb3dlZCBieSAxLAorLy8gZm9sbG93ZWQgYnkgRHluYW1pYywgZm9sbG93ZWQgYnkgb3RoZXIgZmluaXRlIHZhbHVlcy4gVGhlIHJlYXNvbiBmb3IgZ2l2aW5nIER5bmFtaWMgdGhlIHByaW9yaXR5IG92ZXIKKy8vIGZpbml0ZSB2YWx1ZXMgaXMgdGhhdCBtaW4oMywgRHluYW1pYykgc2hvdWxkIGJlIER5bmFtaWMsIHNpbmNlIHRoYXQgY291bGQgYmUgYW55dGhpbmcgYmV0d2VlbiAwIGFuZCAzLgorI2RlZmluZSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQyhhLGIpICgoKGludClhID09IDAgfHwgKGludCliID09IDApID8gMCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoaW50KWEgPT0gMSB8fCAoaW50KWIgPT0gMSkgPyAxIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChpbnQpYSA9PSBEeW5hbWljIHx8IChpbnQpYiA9PSBEeW5hbWljKSA/IER5bmFtaWMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGludClhIDw9IChpbnQpYikgPyAoaW50KWEgOiAoaW50KWIpCisKKy8vIEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRCBpcyBhIHZhcmlhbnQgb2YgRUlHRU5fU0laRV9NSU5fUFJFRkVSX0RZTkFNSUMgY29tcGFyaW5nIE1heFNpemVzLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZpbml0ZSB2YWx1ZXMKKy8vIG5vdyBoYXZlIHByaW9yaXR5IG92ZXIgRHluYW1pYywgc28gdGhhdCBtaW4oMywgRHluYW1pYykgZ2l2ZXMgMy4gSW5kZWVkLCB3aGF0ZXZlciB0aGUgYWN0dWFsIHZhbHVlIGlzCisvLyAoYmV0d2VlbiAwIGFuZCAzKSwgaXQgaXMgbm90IG1vcmUgdGhhbiAzLgorI2RlZmluZSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQoYSxiKSAgKCgoaW50KWEgPT0gMCB8fCAoaW50KWIgPT0gMCkgPyAwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChpbnQpYSA9PSAxIHx8IChpbnQpYiA9PSAxKSA/IDEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGludClhID09IER5bmFtaWMgJiYgKGludCliID09IER5bmFtaWMpID8gRHluYW1pYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoaW50KWEgPT0gRHluYW1pYykgPyAoaW50KWIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGludCliID09IER5bmFtaWMpID8gKGludClhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChpbnQpYSA8PSAoaW50KWIpID8gKGludClhIDogKGludCliKQorCisvLyBzZWUgRUlHRU5fU0laRV9NSU5fUFJFRkVSX0RZTkFNSUMuIE5vIG5lZWQgZm9yIGEgc2VwYXJhdGUgdmFyaWFudCBmb3IgTWF4U2l6ZXMgaGVyZS4KKyNkZWZpbmUgRUlHRU5fU0laRV9NQVgoYSxiKSAoKChpbnQpYSA9PSBEeW5hbWljIHx8IChpbnQpYiA9PSBEeW5hbWljKSA/IER5bmFtaWMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGludClhID49IChpbnQpYikgPyAoaW50KWEgOiAoaW50KWIpCisKKyNkZWZpbmUgRUlHRU5fTE9HSUNBTF9YT1IoYSxiKSAoKChhKSB8fCAoYikpICYmICEoKGEpICYmIChiKSkpCisKKyNkZWZpbmUgRUlHRU5fSU1QTElFUyhhLGIpICghKGEpIHx8IChiKSkKKworI2RlZmluZSBFSUdFTl9NQUtFX0NXSVNFX0JJTkFSWV9PUChNRVRIT0QsRlVOQ1RPUikgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IFwKKyAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZUJpbmFyeU9wPEZVTkNUT1I8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPiBcCisgIChNRVRIT0QpKGNvbnN0IEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdCBcCisgIHsgXAorICAgIHJldHVybiBDd2lzZUJpbmFyeU9wPEZVTkNUT1I8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7IFwKKyAgfQorCisvLyB0aGUgZXhwcmVzc2lvbiB0eXBlIG9mIGEgY3dpc2UgcHJvZHVjdAorI2RlZmluZSBFSUdFTl9DV0lTRV9QUk9EVUNUX1JFVFVSTl9UWVBFKExIUyxSSFMpIFwKKyAgICBDd2lzZUJpbmFyeU9wPCBcCisgICAgICBpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8IFwKKyAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPExIUz46OlNjYWxhciwgXAorICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8UkhTPjo6U2NhbGFyIFwKKyAgICAgID4sIFwKKyAgICAgIGNvbnN0IExIUywgXAorICAgICAgY29uc3QgUkhTIFwKKyAgICA+CisKKyNlbmRpZiAvLyBFSUdFTl9NQUNST1NfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9NZW1vcnkuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwNmFjZQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTWVtb3J5LmgKQEAgLTAsMCArMSw5NTIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBLZW5uZXRoIFJpZGRpbGUgPGtmcmlkZGlsZUB5YWhvby5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRob21hcyBDYXByaWNlbGxpIDxvcnplbEBmcmVlaGFja2Vycy5vcmc+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFBsYXRmb3JtIGNoZWNrcyBmb3IgYWxpZ25lZCBtYWxsb2MgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBFSUdFTl9NRU1PUllfSAorI2RlZmluZSBFSUdFTl9NRU1PUllfSAorCisvLyBPbiA2NC1iaXQgc3lzdGVtcywgZ2xpYmMncyBtYWxsb2MgcmV0dXJucyAxNi1ieXRlLWFsaWduZWQgcG9pbnRlcnMsIHNlZToKKy8vICAgaHR0cDovL3d3dy5nbnUub3JnL3MvbGliYy9tYW51YWwvaHRtbF9ub2RlL0FsaWduZWQtTWVtb3J5LUJsb2Nrcy5odG1sCisvLyBUaGlzIGlzIHRydWUgYXQgbGVhc3Qgc2luY2UgZ2xpYmMgMi44LgorLy8gVGhpcyBsZWF2ZXMgdGhlIHF1ZXN0aW9uIGhvdyB0byBkZXRlY3QgNjQtYml0LiBBY2NvcmRpbmcgdG8gdGhpcyBkb2N1bWVudCwKKy8vICAgaHR0cDovL2djYy5meXhtLm5ldC9zdW1taXQvMjAwMy9Qb3J0aW5nJTIwdG8lMjA2NCUyMGJpdC5wZGYKKy8vIHBhZ2UgMTE0LCAiW1RoZV0gTFA2NCBtb2RlbCBbLi4uXSBpcyB1c2VkIGJ5IGFsbCA2NC1iaXQgVU5JWCBwb3J0cyIgc28gaXQncyBpbmRlZWQKKy8vIHF1aXRlIHNhZmUsIGF0IGxlYXN0IHdpdGhpbiB0aGUgY29udGV4dCBvZiBnbGliYywgdG8gZXF1YXRlIDY0LWJpdCB3aXRoIExQNjQuCisjaWYgZGVmaW5lZChfX0dMSUJDX18pICYmICgoX19HTElCQ19fPj0yICYmIF9fR0xJQkNfTUlOT1JfXyA+PSA4KSB8fCBfX0dMSUJDX18+MikgXAorICYmIGRlZmluZWQoX19MUDY0X18pCisgICNkZWZpbmUgRUlHRU5fR0xJQkNfTUFMTE9DX0FMUkVBRFlfQUxJR05FRCAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0dMSUJDX01BTExPQ19BTFJFQURZX0FMSUdORUQgMAorI2VuZGlmCisKKy8vIEZyZWVCU0QgNiBzZWVtcyB0byBoYXZlIDE2LWJ5dGUgYWxpZ25lZCBtYWxsb2MKKy8vICAgU2VlIGh0dHA6Ly9zdm4uZnJlZWJzZC5vcmcvdmlld3ZjL2Jhc2Uvc3RhYmxlLzYvbGliL2xpYmMvc3RkbGliL21hbGxvYy5jP3ZpZXc9bWFya3VwCisvLyBGcmVlQlNEIDcgc2VlbXMgdG8gaGF2ZSAxNi1ieXRlIGFsaWduZWQgbWFsbG9jIGV4Y2VwdCBvbiBBUk0gYW5kIE1JUFMgYXJjaGl0ZWN0dXJlcworLy8gICBTZWUgaHR0cDovL3N2bi5mcmVlYnNkLm9yZy92aWV3dmMvYmFzZS9zdGFibGUvNy9saWIvbGliYy9zdGRsaWIvbWFsbG9jLmM/dmlldz1tYXJrdXAKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiAhZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX21pcHNfXykKKyAgI2RlZmluZSBFSUdFTl9GUkVFQlNEX01BTExPQ19BTFJFQURZX0FMSUdORUQgMQorI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9GUkVFQlNEX01BTExPQ19BTFJFQURZX0FMSUdORUQgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgXAorIHx8IGRlZmluZWQoX1dJTjY0KSBcCisgfHwgRUlHRU5fR0xJQkNfTUFMTE9DX0FMUkVBRFlfQUxJR05FRCBcCisgfHwgRUlHRU5fRlJFRUJTRF9NQUxMT0NfQUxSRUFEWV9BTElHTkVECisgICNkZWZpbmUgRUlHRU5fTUFMTE9DX0FMUkVBRFlfQUxJR05FRCAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX01BTExPQ19BTFJFQURZX0FMSUdORUQgMAorI2VuZGlmCisKKyNpZiAoKGRlZmluZWQgX19RTlhOVE9fXykgfHwgKGRlZmluZWQgX0dOVV9TT1VSQ0UpIHx8ICgoZGVmaW5lZCBfWE9QRU5fU09VUkNFKSAmJiAoX1hPUEVOX1NPVVJDRSA+PSA2MDApKSkgXAorICYmIChkZWZpbmVkIF9QT1NJWF9BRFZJU09SWV9JTkZPKSAmJiAoX1BPU0lYX0FEVklTT1JZX0lORk8gPiAwKQorICAjZGVmaW5lIEVJR0VOX0hBU19QT1NJWF9NRU1BTElHTiAxCisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0hBU19QT1NJWF9NRU1BTElHTiAwCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0UKKyAgI2RlZmluZSBFSUdFTl9IQVNfTU1fTUFMTE9DIDEKKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fSEFTX01NX01BTExPQyAwCisjZW5kaWYKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworaW5saW5lIHZvaWQgdGhyb3dfc3RkX2JhZF9hbGxvYygpCit7CisgICNpZmRlZiBFSUdFTl9FWENFUFRJT05TCisgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgI2Vsc2UKKyAgICBzdGQ6OnNpemVfdCBodWdlID0gLTE7CisgICAgbmV3IGludFtodWdlXTsKKyAgI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIEltcGxlbWVudGF0aW9uIG9mIGhhbmRtYWRlIGFsaWduZWQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogLS0tLS0gSGFuZCBtYWRlIGltcGxlbWVudGF0aW9ucyBvZiBhbGlnbmVkIG1hbGxvYy9mcmVlIGFuZCByZWFsbG9jIC0tLS0tICovCisKKy8qKiBcaW50ZXJuYWwgTGlrZSBtYWxsb2MsIGJ1dCB0aGUgcmV0dXJuZWQgcG9pbnRlciBpcyBndWFyYW50ZWVkIHRvIGJlIDE2LWJ5dGUgYWxpZ25lZC4KKyAgKiBGYXN0LCBidXQgd2FzdGVzIDE2IGFkZGl0aW9uYWwgYnl0ZXMgb2YgbWVtb3J5LiBEb2VzIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9uLgorICAqLworaW5saW5lIHZvaWQqIGhhbmRtYWRlX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplKQoreworICB2b2lkICpvcmlnaW5hbCA9IHN0ZDo6bWFsbG9jKHNpemUrMTYpOworICBpZiAob3JpZ2luYWwgPT0gMCkgcmV0dXJuIDA7CisgIHZvaWQgKmFsaWduZWQgPSByZWludGVycHJldF9jYXN0PHZvaWQqPigocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KG9yaWdpbmFsKSAmIH4oc2l6ZV90KDE1KSkpICsgMTYpOworICAqKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPihhbGlnbmVkKSAtIDEpID0gb3JpZ2luYWw7CisgIHJldHVybiBhbGlnbmVkOworfQorCisvKiogXGludGVybmFsIEZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aCBoYW5kbWFkZV9hbGlnbmVkX21hbGxvYyAqLworaW5saW5lIHZvaWQgaGFuZG1hZGVfYWxpZ25lZF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgaWYgKHB0cikgc3RkOjpmcmVlKCoocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KHB0cikgLSAxKSk7Cit9CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBcYnJpZWYgUmVhbGxvY2F0ZXMgYWxpZ25lZCBtZW1vcnkuCisgICogU2luY2Ugd2Uga25vdyB0aGF0IG91ciBoYW5kbWFkZSB2ZXJzaW9uIGlzIGJhc2VkIG9uIHN0ZDo6cmVhbGxvYworICAqIHdlIGNhbiB1c2Ugc3RkOjpyZWFsbG9jIHRvIGltcGxlbWVudCBlZmZpY2llbnQgcmVhbGxvY2F0aW9uLgorICAqLworaW5saW5lIHZvaWQqIGhhbmRtYWRlX2FsaWduZWRfcmVhbGxvYyh2b2lkKiBwdHIsIHNpemVfdCBzaXplLCBzaXplX3QgPSAwKQoreworICBpZiAocHRyID09IDApIHJldHVybiBoYW5kbWFkZV9hbGlnbmVkX21hbGxvYyhzaXplKTsKKyAgdm9pZCAqb3JpZ2luYWwgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPihwdHIpIC0gMSk7CisgIG9yaWdpbmFsID0gc3RkOjpyZWFsbG9jKG9yaWdpbmFsLHNpemUrMTYpOworICBpZiAob3JpZ2luYWwgPT0gMCkgcmV0dXJuIDA7CisgIHZvaWQgKmFsaWduZWQgPSByZWludGVycHJldF9jYXN0PHZvaWQqPigocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KG9yaWdpbmFsKSAmIH4oc2l6ZV90KDE1KSkpICsgMTYpOworICAqKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPihhbGlnbmVkKSAtIDEpID0gb3JpZ2luYWw7CisgIHJldHVybiBhbGlnbmVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBJbXBsZW1lbnRhdGlvbiBvZiBnZW5lcmljIGFsaWduZWQgcmVhbGxvYyAod2hlbiBubyByZWFsbG9jIGNhbiBiZSB1c2VkKSoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQqIGFsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplKTsKK3ZvaWQgIGFsaWduZWRfZnJlZSh2b2lkICpwdHIpOworCisvKiogXGludGVybmFsCisgICogXGJyaWVmIFJlYWxsb2NhdGVzIGFsaWduZWQgbWVtb3J5LgorICAqIEFsbG93cyByZWFsbG9jYXRpb24gd2l0aCBhbGlnbmVkIHB0ciB0eXBlcy4gVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsCisgICogYWx3YXlzIGNyZWF0ZSBhIG5ldyBtZW1vcnkgY2h1bmsgYW5kIGNvcHkgdGhlIG9sZCBkYXRhLgorICAqLworaW5saW5lIHZvaWQqIGdlbmVyaWNfYWxpZ25lZF9yZWFsbG9jKHZvaWQqIHB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBvbGRfc2l6ZSkKK3sKKyAgaWYgKHB0cj09MCkKKyAgICByZXR1cm4gYWxpZ25lZF9tYWxsb2Moc2l6ZSk7CisKKyAgaWYgKHNpemU9PTApCisgIHsKKyAgICBhbGlnbmVkX2ZyZWUocHRyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZvaWQqIG5ld3B0ciA9IGFsaWduZWRfbWFsbG9jKHNpemUpOworICBpZiAobmV3cHRyID09IDApCisgIHsKKyAgICAjaWZkZWYgRUlHRU5fSEFTX0VSUk5PCisgICAgZXJybm8gPSBFTk9NRU07IC8vIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChwdHIgIT0gMCkKKyAgeworICAgIHN0ZDo6bWVtY3B5KG5ld3B0ciwgcHRyLCAoc3RkOjptaW4pKHNpemUsb2xkX3NpemUpKTsKKyAgICBhbGlnbmVkX2ZyZWUocHRyKTsKKyAgfQorCisgIHJldHVybiBuZXdwdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIEltcGxlbWVudGF0aW9uIG9mIHBvcnRhYmxlIGFsaWduZWQgdmVyc2lvbnMgb2YgbWFsbG9jL2ZyZWUvcmVhbGxvYyAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEVJR0VOX05PX01BTExPQworaW5saW5lIHZvaWQgY2hlY2tfdGhhdF9tYWxsb2NfaXNfYWxsb3dlZCgpCit7CisgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiaGVhcCBhbGxvY2F0aW9uIGlzIGZvcmJpZGRlbiAoRUlHRU5fTk9fTUFMTE9DIGlzIGRlZmluZWQpIik7Cit9CisjZWxpZiBkZWZpbmVkIEVJR0VOX1JVTlRJTUVfTk9fTUFMTE9DCitpbmxpbmUgYm9vbCBpc19tYWxsb2NfYWxsb3dlZF9pbXBsKGJvb2wgdXBkYXRlLCBib29sIG5ld192YWx1ZSA9IGZhbHNlKQoreworICBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7CisgIGlmICh1cGRhdGUgPT0gMSkKKyAgICB2YWx1ZSA9IG5ld192YWx1ZTsKKyAgcmV0dXJuIHZhbHVlOworfQoraW5saW5lIGJvb2wgaXNfbWFsbG9jX2FsbG93ZWQoKSB7IHJldHVybiBpc19tYWxsb2NfYWxsb3dlZF9pbXBsKGZhbHNlKTsgfQoraW5saW5lIGJvb2wgc2V0X2lzX21hbGxvY19hbGxvd2VkKGJvb2wgbmV3X3ZhbHVlKSB7IHJldHVybiBpc19tYWxsb2NfYWxsb3dlZF9pbXBsKHRydWUsIG5ld192YWx1ZSk7IH0KK2lubGluZSB2b2lkIGNoZWNrX3RoYXRfbWFsbG9jX2lzX2FsbG93ZWQoKQoreworICBlaWdlbl9hc3NlcnQoaXNfbWFsbG9jX2FsbG93ZWQoKSAmJiAiaGVhcCBhbGxvY2F0aW9uIGlzIGZvcmJpZGRlbiAoRUlHRU5fUlVOVElNRV9OT19NQUxMT0MgaXMgZGVmaW5lZCBhbmQgZ19pc19tYWxsb2NfYWxsb3dlZCBpcyBmYWxzZSkiKTsKK30KKyNlbHNlIAoraW5saW5lIHZvaWQgY2hlY2tfdGhhdF9tYWxsb2NfaXNfYWxsb3dlZCgpCit7fQorI2VuZGlmCisKKy8qKiBcaW50ZXJuYWwgQWxsb2NhdGVzIFxhIHNpemUgYnl0ZXMuIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSAxNiBieXRlcyBhbGlnbm1lbnQuCisgICogT24gYWxsb2NhdGlvbiBlcnJvciwgdGhlIHJldHVybmVkIHBvaW50ZXIgaXMgbnVsbCwgYW5kIHN0ZDo6YmFkX2FsbG9jIGlzIHRocm93bi4KKyAgKi8KK2lubGluZSB2b2lkKiBhbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgY2hlY2tfdGhhdF9tYWxsb2NfaXNfYWxsb3dlZCgpOworCisgIHZvaWQgKnJlc3VsdDsKKyAgI2lmICFFSUdFTl9BTElHTgorICAgIHJlc3VsdCA9IHN0ZDo6bWFsbG9jKHNpemUpOworICAjZWxpZiBFSUdFTl9NQUxMT0NfQUxSRUFEWV9BTElHTkVECisgICAgcmVzdWx0ID0gc3RkOjptYWxsb2Moc2l6ZSk7CisgICNlbGlmIEVJR0VOX0hBU19QT1NJWF9NRU1BTElHTgorICAgIGlmKHBvc2l4X21lbWFsaWduKCZyZXN1bHQsIDE2LCBzaXplKSkgcmVzdWx0ID0gMDsKKyAgI2VsaWYgRUlHRU5fSEFTX01NX01BTExPQworICAgIHJlc3VsdCA9IF9tbV9tYWxsb2Moc2l6ZSwgMTYpOworICAjZWxpZiAoZGVmaW5lZCBfTVNDX1ZFUikKKyAgICByZXN1bHQgPSBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgMTYpOworICAjZWxzZQorICAgIHJlc3VsdCA9IGhhbmRtYWRlX2FsaWduZWRfbWFsbG9jKHNpemUpOworICAjZW5kaWYKKworICBpZighcmVzdWx0ICYmIHNpemUpCisgICAgdGhyb3dfc3RkX2JhZF9hbGxvYygpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKiBcaW50ZXJuYWwgRnJlZXMgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIGFsaWduZWRfbWFsbG9jLiAqLworaW5saW5lIHZvaWQgYWxpZ25lZF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgI2lmICFFSUdFTl9BTElHTgorICAgIHN0ZDo6ZnJlZShwdHIpOworICAjZWxpZiBFSUdFTl9NQUxMT0NfQUxSRUFEWV9BTElHTkVECisgICAgc3RkOjpmcmVlKHB0cik7CisgICNlbGlmIEVJR0VOX0hBU19QT1NJWF9NRU1BTElHTgorICAgIHN0ZDo6ZnJlZShwdHIpOworICAjZWxpZiBFSUdFTl9IQVNfTU1fTUFMTE9DCisgICAgX21tX2ZyZWUocHRyKTsKKyAgI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBfYWxpZ25lZF9mcmVlKHB0cik7CisgICNlbHNlCisgICAgaGFuZG1hZGVfYWxpZ25lZF9mcmVlKHB0cik7CisgICNlbmRpZgorfQorCisvKioKKyogXGludGVybmFsCisqIFxicmllZiBSZWFsbG9jYXRlcyBhbiBhbGlnbmVkIGJsb2NrIG9mIG1lbW9yeS4KKyogXHRocm93cyBzdGQ6OmJhZF9hbGxvYyBvbiBhbGxvY2F0aW9uIGZhaWx1cmUKKyoqLworaW5saW5lIHZvaWQqIGFsaWduZWRfcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSwgc2l6ZV90IG9sZF9zaXplKQoreworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUob2xkX3NpemUpOworCisgIHZvaWQgKnJlc3VsdDsKKyNpZiAhRUlHRU5fQUxJR04KKyAgcmVzdWx0ID0gc3RkOjpyZWFsbG9jKHB0cixuZXdfc2l6ZSk7CisjZWxpZiBFSUdFTl9NQUxMT0NfQUxSRUFEWV9BTElHTkVECisgIHJlc3VsdCA9IHN0ZDo6cmVhbGxvYyhwdHIsbmV3X3NpemUpOworI2VsaWYgRUlHRU5fSEFTX1BPU0lYX01FTUFMSUdOCisgIHJlc3VsdCA9IGdlbmVyaWNfYWxpZ25lZF9yZWFsbG9jKHB0cixuZXdfc2l6ZSxvbGRfc2l6ZSk7CisjZWxpZiBFSUdFTl9IQVNfTU1fTUFMTE9DCisgIC8vIFRoZSBkZWZpbmVkKF9tbV9mcmVlKSBpcyBqdXN0IGhlcmUgdG8gdmVyaWZ5IHRoYXQgdGhpcyBNU1ZDIHZlcnNpb24KKyAgLy8gaW1wbGVtZW50cyBfbW1fbWFsbG9jL19tbV9mcmVlIGJhc2VkIG9uIHRoZSBjb3JyZXNwb25kaW5nIF9hbGlnbmVkXworICAvLyBmdW5jdGlvbnMuIFRoaXMgbWF5IG5vdCBhbHdheXMgYmUgdGhlIGNhc2UgYW5kIHdlIGp1c3QgdHJ5IHRvIGJlIHNhZmUuCisgICNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9tbV9mcmVlKQorICAgIHJlc3VsdCA9IF9hbGlnbmVkX3JlYWxsb2MocHRyLG5ld19zaXplLDE2KTsKKyAgI2Vsc2UKKyAgICByZXN1bHQgPSBnZW5lcmljX2FsaWduZWRfcmVhbGxvYyhwdHIsbmV3X3NpemUsb2xkX3NpemUpOworICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgIHJlc3VsdCA9IF9hbGlnbmVkX3JlYWxsb2MocHRyLG5ld19zaXplLDE2KTsKKyNlbHNlCisgIHJlc3VsdCA9IGhhbmRtYWRlX2FsaWduZWRfcmVhbGxvYyhwdHIsbmV3X3NpemUsb2xkX3NpemUpOworI2VuZGlmCisKKyAgaWYgKCFyZXN1bHQgJiYgbmV3X3NpemUpCisgICAgdGhyb3dfc3RkX2JhZF9hbGxvYygpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIEltcGxlbWVudGF0aW9uIG9mIGNvbmRpdGlvbmFsbHkgYWxpZ25lZCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFxpbnRlcm5hbCBBbGxvY2F0ZXMgXGEgc2l6ZSBieXRlcy4gSWYgQWxpZ24gaXMgdHJ1ZSwgdGhlbiB0aGUgcmV0dXJuZWQgcHRyIGlzIDE2LWJ5dGUtYWxpZ25lZC4KKyAgKiBPbiBhbGxvY2F0aW9uIGVycm9yLCB0aGUgcmV0dXJuZWQgcG9pbnRlciBpcyBudWxsLCBhbmQgYSBzdGQ6OmJhZF9hbGxvYyBpcyB0aHJvd24uCisgICovCit0ZW1wbGF0ZTxib29sIEFsaWduPiBpbmxpbmUgdm9pZCogY29uZGl0aW9uYWxfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUpCit7CisgIHJldHVybiBhbGlnbmVkX21hbGxvYyhzaXplKTsKK30KKwordGVtcGxhdGU8PiBpbmxpbmUgdm9pZCogY29uZGl0aW9uYWxfYWxpZ25lZF9tYWxsb2M8ZmFsc2U+KHNpemVfdCBzaXplKQoreworICBjaGVja190aGF0X21hbGxvY19pc19hbGxvd2VkKCk7CisKKyAgdm9pZCAqcmVzdWx0ID0gc3RkOjptYWxsb2Moc2l6ZSk7CisgIGlmKCFyZXN1bHQgJiYgc2l6ZSkKKyAgICB0aHJvd19zdGRfYmFkX2FsbG9jKCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKiBcaW50ZXJuYWwgRnJlZXMgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIGNvbmRpdGlvbmFsX2FsaWduZWRfbWFsbG9jICovCit0ZW1wbGF0ZTxib29sIEFsaWduPiBpbmxpbmUgdm9pZCBjb25kaXRpb25hbF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKQoreworICBhbGlnbmVkX2ZyZWUocHRyKTsKK30KKwordGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBjb25kaXRpb25hbF9hbGlnbmVkX2ZyZWU8ZmFsc2U+KHZvaWQgKnB0cikKK3sKKyAgc3RkOjpmcmVlKHB0cik7Cit9CisKK3RlbXBsYXRlPGJvb2wgQWxpZ24+IGlubGluZSB2b2lkKiBjb25kaXRpb25hbF9hbGlnbmVkX3JlYWxsb2Modm9pZCogcHRyLCBzaXplX3QgbmV3X3NpemUsIHNpemVfdCBvbGRfc2l6ZSkKK3sKKyAgcmV0dXJuIGFsaWduZWRfcmVhbGxvYyhwdHIsIG5ld19zaXplLCBvbGRfc2l6ZSk7Cit9CisKK3RlbXBsYXRlPD4gaW5saW5lIHZvaWQqIGNvbmRpdGlvbmFsX2FsaWduZWRfcmVhbGxvYzxmYWxzZT4odm9pZCogcHRyLCBzaXplX3QgbmV3X3NpemUsIHNpemVfdCkKK3sKKyAgcmV0dXJuIHN0ZDo6cmVhbGxvYyhwdHIsIG5ld19zaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogQ29uc3RydWN0aW9uL2Rlc3RydWN0aW9uIG9mIGFycmF5IGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGludGVybmFsIENvbnN0cnVjdHMgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5LgorICAqIFRoZSBcYSBzaXplIHBhcmFtZXRlciB0ZWxscyBvbiBob3cgbWFueSBvYmplY3RzIHRvIGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9mIFQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCogY29uc3RydWN0X2VsZW1lbnRzX29mX2FycmF5KFQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgIGZvciAoc2l6ZV90IGk9MDsgaSA8IHNpemU7ICsraSkgOjpuZXcgKHB0ciArIGkpIFQ7CisgIHJldHVybiBwdHI7Cit9CisKKy8qKiBcaW50ZXJuYWwgRGVzdHJ1Y3RzIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheS4KKyAgKiBUaGUgXGEgc2l6ZSBwYXJhbWV0ZXJzIHRlbGxzIG9uIGhvdyBtYW55IG9iamVjdHMgdG8gY2FsbCB0aGUgZGVzdHJ1Y3RvciBvZiBULgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHZvaWQgZGVzdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkoVCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgLy8gYWx3YXlzIGRlc3RydWN0IGFuIGFycmF5IHN0YXJ0aW5nIGZyb20gdGhlIGVuZC4KKyAgaWYocHRyKQorICAgIHdoaWxlKHNpemUpIHB0clstLXNpemVdLn5UKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIEltcGxlbWVudGF0aW9uIG9mIGFsaWduZWQgbmV3L2RlbGV0ZS1saWtlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0FMV0FZU19JTkxJTkUgdm9pZCBjaGVja19zaXplX2Zvcl9vdmVyZmxvdyhzaXplX3Qgc2l6ZSkKK3sKKyAgaWYoc2l6ZSA+IHNpemVfdCgtMSkgLyBzaXplb2YoVCkpCisgICAgdGhyb3dfc3RkX2JhZF9hbGxvYygpOworfQorCisvKiogXGludGVybmFsIEFsbG9jYXRlcyBcYSBzaXplIG9iamVjdHMgb2YgdHlwZSBULiBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyBndWFyYW50ZWVkIHRvIGhhdmUgMTYgYnl0ZXMgYWxpZ25tZW50LgorICAqIE9uIGFsbG9jYXRpb24gZXJyb3IsIHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHVuZGVmaW5lZCwgYnV0IGEgc3RkOjpiYWRfYWxsb2MgaXMgdGhyb3duLgorICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIFQgaXMgY2FsbGVkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQqIGFsaWduZWRfbmV3KHNpemVfdCBzaXplKQoreworICBjaGVja19zaXplX2Zvcl9vdmVyZmxvdzxUPihzaXplKTsKKyAgVCAqcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxUKj4oYWxpZ25lZF9tYWxsb2Moc2l6ZW9mKFQpKnNpemUpKTsKKyAgcmV0dXJuIGNvbnN0cnVjdF9lbGVtZW50c19vZl9hcnJheShyZXN1bHQsIHNpemUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEFsaWduPiBpbmxpbmUgVCogY29uZGl0aW9uYWxfYWxpZ25lZF9uZXcoc2l6ZV90IHNpemUpCit7CisgIGNoZWNrX3NpemVfZm9yX292ZXJmbG93PFQ+KHNpemUpOworICBUICpyZXN1bHQgPSByZWludGVycHJldF9jYXN0PFQqPihjb25kaXRpb25hbF9hbGlnbmVkX21hbGxvYzxBbGlnbj4oc2l6ZW9mKFQpKnNpemUpKTsKKyAgcmV0dXJuIGNvbnN0cnVjdF9lbGVtZW50c19vZl9hcnJheShyZXN1bHQsIHNpemUpOworfQorCisvKiogXGludGVybmFsIERlbGV0ZXMgb2JqZWN0cyBjb25zdHJ1Y3RlZCB3aXRoIGFsaWduZWRfbmV3CisgICogVGhlIFxhIHNpemUgcGFyYW1ldGVycyB0ZWxscyBvbiBob3cgbWFueSBvYmplY3RzIHRvIGNhbGwgdGhlIGRlc3RydWN0b3Igb2YgVC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSB2b2lkIGFsaWduZWRfZGVsZXRlKFQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgIGRlc3RydWN0X2VsZW1lbnRzX29mX2FycmF5PFQ+KHB0ciwgc2l6ZSk7CisgIGFsaWduZWRfZnJlZShwdHIpOworfQorCisvKiogXGludGVybmFsIERlbGV0ZXMgb2JqZWN0cyBjb25zdHJ1Y3RlZCB3aXRoIGNvbmRpdGlvbmFsX2FsaWduZWRfbmV3CisgICogVGhlIFxhIHNpemUgcGFyYW1ldGVycyB0ZWxscyBvbiBob3cgbWFueSBvYmplY3RzIHRvIGNhbGwgdGhlIGRlc3RydWN0b3Igb2YgVC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgQWxpZ24+IGlubGluZSB2b2lkIGNvbmRpdGlvbmFsX2FsaWduZWRfZGVsZXRlKFQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgIGRlc3RydWN0X2VsZW1lbnRzX29mX2FycmF5PFQ+KHB0ciwgc2l6ZSk7CisgIGNvbmRpdGlvbmFsX2FsaWduZWRfZnJlZTxBbGlnbj4ocHRyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBBbGlnbj4gaW5saW5lIFQqIGNvbmRpdGlvbmFsX2FsaWduZWRfcmVhbGxvY19uZXcoVCogcHRzLCBzaXplX3QgbmV3X3NpemUsIHNpemVfdCBvbGRfc2l6ZSkKK3sKKyAgY2hlY2tfc2l6ZV9mb3Jfb3ZlcmZsb3c8VD4obmV3X3NpemUpOworICBjaGVja19zaXplX2Zvcl9vdmVyZmxvdzxUPihvbGRfc2l6ZSk7CisgIGlmKG5ld19zaXplIDwgb2xkX3NpemUpCisgICAgZGVzdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkocHRzK25ld19zaXplLCBvbGRfc2l6ZS1uZXdfc2l6ZSk7CisgIFQgKnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGNvbmRpdGlvbmFsX2FsaWduZWRfcmVhbGxvYzxBbGlnbj4ocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocHRzKSwgc2l6ZW9mKFQpKm5ld19zaXplLCBzaXplb2YoVCkqb2xkX3NpemUpKTsKKyAgaWYobmV3X3NpemUgPiBvbGRfc2l6ZSkKKyAgICBjb25zdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkocmVzdWx0K29sZF9zaXplLCBuZXdfc2l6ZS1vbGRfc2l6ZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBBbGlnbj4gaW5saW5lIFQqIGNvbmRpdGlvbmFsX2FsaWduZWRfbmV3X2F1dG8oc2l6ZV90IHNpemUpCit7CisgIGNoZWNrX3NpemVfZm9yX292ZXJmbG93PFQ+KHNpemUpOworICBUICpyZXN1bHQgPSByZWludGVycHJldF9jYXN0PFQqPihjb25kaXRpb25hbF9hbGlnbmVkX21hbGxvYzxBbGlnbj4oc2l6ZW9mKFQpKnNpemUpKTsKKyAgaWYoTnVtVHJhaXRzPFQ+OjpSZXF1aXJlSW5pdGlhbGl6YXRpb24pCisgICAgY29uc3RydWN0X2VsZW1lbnRzX29mX2FycmF5KHJlc3VsdCwgc2l6ZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgQWxpZ24+IGlubGluZSBUKiBjb25kaXRpb25hbF9hbGlnbmVkX3JlYWxsb2NfbmV3X2F1dG8oVCogcHRzLCBzaXplX3QgbmV3X3NpemUsIHNpemVfdCBvbGRfc2l6ZSkKK3sKKyAgY2hlY2tfc2l6ZV9mb3Jfb3ZlcmZsb3c8VD4obmV3X3NpemUpOworICBjaGVja19zaXplX2Zvcl9vdmVyZmxvdzxUPihvbGRfc2l6ZSk7CisgIGlmKE51bVRyYWl0czxUPjo6UmVxdWlyZUluaXRpYWxpemF0aW9uICYmIChuZXdfc2l6ZSA8IG9sZF9zaXplKSkKKyAgICBkZXN0cnVjdF9lbGVtZW50c19vZl9hcnJheShwdHMrbmV3X3NpemUsIG9sZF9zaXplLW5ld19zaXplKTsKKyAgVCAqcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxUKj4oY29uZGl0aW9uYWxfYWxpZ25lZF9yZWFsbG9jPEFsaWduPihyZWludGVycHJldF9jYXN0PHZvaWQqPihwdHMpLCBzaXplb2YoVCkqbmV3X3NpemUsIHNpemVvZihUKSpvbGRfc2l6ZSkpOworICBpZihOdW1UcmFpdHM8VD46OlJlcXVpcmVJbml0aWFsaXphdGlvbiAmJiAobmV3X3NpemUgPiBvbGRfc2l6ZSkpCisgICAgY29uc3RydWN0X2VsZW1lbnRzX29mX2FycmF5KHJlc3VsdCtvbGRfc2l6ZSwgbmV3X3NpemUtb2xkX3NpemUpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEFsaWduPiBpbmxpbmUgdm9pZCBjb25kaXRpb25hbF9hbGlnbmVkX2RlbGV0ZV9hdXRvKFQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgIGlmKE51bVRyYWl0czxUPjo6UmVxdWlyZUluaXRpYWxpemF0aW9uKQorICAgIGRlc3RydWN0X2VsZW1lbnRzX29mX2FycmF5PFQ+KHB0ciwgc2l6ZSk7CisgIGNvbmRpdGlvbmFsX2FsaWduZWRfZnJlZTxBbGlnbj4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBcaW50ZXJuYWwgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IHRoYXQgaXMgd2VsbCBhbGlnbmVkIGZvciB2ZWN0b3JpemF0aW9uLgorICAqCisgICogXHBhcmFtIGFycmF5IHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgYXJyYXkKKyAgKiBccGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkKKyAgKgorICAqIFxub3RlIElmIG5vIGVsZW1lbnQgb2YgdGhlIGFycmF5IGlzIHdlbGwgYWxpZ25lZCwgdGhlIHNpemUgb2YgdGhlIGFycmF5IGlzIHJldHVybmVkLiBUeXBpY2FsbHksCisgICogZm9yIGV4YW1wbGUgd2l0aCBTU0UsICJ3ZWxsIGFsaWduZWQiIG1lYW5zIDE2LWJ5dGUtYWxpZ25lZC4gSWYgdmVjdG9yaXphdGlvbiBpcyBkaXNhYmxlZCBvciBpZiB0aGUKKyAgKiBwYWNrZXQgc2l6ZSBmb3IgdGhlIGdpdmVuIHNjYWxhciB0eXBlIGlzIDEsIHRoZW4gZXZlcnl0aGluZyBpcyBjb25zaWRlcmVkIHdlbGwtYWxpZ25lZC4KKyAgKgorICAqIFxub3RlIElmIHRoZSBzY2FsYXIgdHlwZSBpcyB2ZWN0b3JpemFibGUsIHdlIHJlbHkgb24gdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczogc2l6ZW9mKFNjYWxhcikgaXMgYQorICAqIHBvd2VyIG9mIDIsIHRoZSBwYWNrZXQgc2l6ZSBpbiBieXRlcyBpcyBhbHNvIGEgcG93ZXIgb2YgMiwgYW5kIGlzIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKFNjYWxhcikuIE9uIHRoZQorICAqIG90aGVyIGhhbmQsIHdlIGRvIG5vdCBhc3N1bWUgdGhhdCB0aGUgYXJyYXkgYWRkcmVzcyBpcyBhIG11bHRpcGxlIG9mIHNpemVvZihTY2FsYXIpLCBhcyB0aGF0IGZhaWxzIGZvcgorICAqIGV4YW1wbGUgd2l0aCBTY2FsYXI9ZG91YmxlIG9uIGNlcnRhaW4gMzItYml0IHBsYXRmb3Jtcywgc2VlIGJ1ZyAjNzkuCisgICoKKyAgKiBUaGVyZSBpcyBhbHNvIHRoZSB2YXJpYW50IGZpcnN0X2FsaWduZWQoY29uc3QgTWF0cml4QmFzZSYpIGRlZmluZWQgaW4gRGVuc2VDb2VmZnNCYXNlLmguCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4Pgorc3RhdGljIGlubGluZSBJbmRleCBmaXJzdF9hbGlnbmVkKGNvbnN0IFNjYWxhciogYXJyYXksIEluZGV4IHNpemUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgZW51bSB7IFBhY2tldFNpemUgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUsCisgICAgICAgICBQYWNrZXRBbGlnbmVkTWFzayA9IFBhY2tldFNpemUtMQorICB9OworCisgIGlmKFBhY2tldFNpemU9PTEpCisgIHsKKyAgICAvLyBFaXRoZXIgdGhlcmUgaXMgbm8gdmVjdG9yaXphdGlvbiwgb3IgYSBwYWNrZXQgY29uc2lzdHMgb2YgZXhhY3RseSAxIHNjYWxhciBzbyB0aGF0IGFsbCBlbGVtZW50cworICAgIC8vIG9mIHRoZSBhcnJheSBoYXZlIHRoZSBzYW1lIGFsaWdubWVudC4KKyAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmKHNpemVfdChhcnJheSkgJiAoc2l6ZW9mKFNjYWxhciktMSkpCisgIHsKKyAgICAvLyBUaGVyZSBpcyB2ZWN0b3JpemF0aW9uIGZvciB0aGlzIHNjYWxhciB0eXBlLCBidXQgdGhlIGFycmF5IGlzIG5vdCBhbGlnbmVkIHRvIHRoZSBzaXplIG9mIGEgc2luZ2xlIHNjYWxhci4KKyAgICAvLyBDb25zZXF1ZW50bHksIG5vIGVsZW1lbnQgb2YgdGhlIGFycmF5IGlzIHdlbGwgYWxpZ25lZC4KKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gc3RkOjptaW48SW5kZXg+KCAoUGFja2V0U2l6ZSAtIChJbmRleCgoc2l6ZV90KGFycmF5KS9zaXplb2YoU2NhbGFyKSkpICYgUGFja2V0QWxpZ25lZE1hc2spKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBQYWNrZXRBbGlnbmVkTWFzaywgc2l6ZSk7CisgIH0KK30KKworCisvLyBzdGQ6OmNvcHkgaXMgbXVjaCBzbG93ZXIgdGhhbiBtZW1jcHksIHNvIGxldCdzIGludHJvZHVjZSBhIHNtYXJ0X2NvcHkgd2hpY2gKKy8vIHVzZSBtZW1jcHkgb24gdHJpdmlhbCB0eXBlcywgaS5lLiwgb24gdHlwZXMgdGhhdCBkb2VzIG5vdCByZXF1aXJlIGFuIGluaXRpYWxpemF0aW9uIGN0b3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIFVzZU1lbWNweT4gc3RydWN0IHNtYXJ0X2NvcHlfaGVscGVyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHNtYXJ0X2NvcHkoY29uc3QgVCogc3RhcnQsIGNvbnN0IFQqIGVuZCwgVCogdGFyZ2V0KQoreworICBzbWFydF9jb3B5X2hlbHBlcjxULCFOdW1UcmFpdHM8VD46OlJlcXVpcmVJbml0aWFsaXphdGlvbj46OnJ1bihzdGFydCwgZW5kLCB0YXJnZXQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc21hcnRfY29weV9oZWxwZXI8VCx0cnVlPiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgVCogc3RhcnQsIGNvbnN0IFQqIGVuZCwgVCogdGFyZ2V0KQorICB7IG1lbWNweSh0YXJnZXQsIHN0YXJ0LCBzdGQ6OnB0cmRpZmZfdChlbmQpLXN0ZDo6cHRyZGlmZl90KHN0YXJ0KSk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBzbWFydF9jb3B5X2hlbHBlcjxULGZhbHNlPiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgVCogc3RhcnQsIGNvbnN0IFQqIGVuZCwgVCogdGFyZ2V0KQorICB7IHN0ZDo6Y29weShzdGFydCwgZW5kLCB0YXJnZXQpOyB9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIEltcGxlbWVudGF0aW9uIG9mIHJ1bnRpbWUgc3RhY2sgYWxsb2NhdGlvbiAoZmFsbGluZyBiYWNrIHRvIG1hbGxvYykgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8geW91IGNhbiBvdmVyd3JpdGUgRWlnZW4ncyBkZWZhdWx0IGJlaGF2aW9yIHJlZ2FyZGluZyBhbGxvY2EgYnkgZGVmaW5pbmcgRUlHRU5fQUxMT0NBCisvLyB0byB0aGUgYXBwcm9wcmlhdGUgc3RhY2sgYWxsb2NhdGlvbiBmdW5jdGlvbgorI2lmbmRlZiBFSUdFTl9BTExPQ0EKKyAgI2lmIChkZWZpbmVkIF9fbGludXhfXykKKyAgICAjZGVmaW5lIEVJR0VOX0FMTE9DQSBhbGxvY2EKKyAgI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICAjZGVmaW5lIEVJR0VOX0FMTE9DQSBfYWxsb2NhCisgICNlbmRpZgorI2VuZGlmCisKKy8vIFRoaXMgaGVscGVyIGNsYXNzIGNvbnN0cnVjdCB0aGUgYWxsb2NhdGVkIG1lbW9yeSwgYW5kIHRha2VzIGNhcmUgb2YgZGVzdHJ1Y3RpbmcgYW5kIGZyZWVpbmcgdGhlIGhhbmRsZWQgZGF0YQorLy8gYXQgZGVzdHJ1Y3Rpb24gdGltZS4gSW4gcHJhY3RpY2UgdGhpcyBoZWxwZXIgY2xhc3MgaXMgbWFpbmx5IHVzZWZ1bCB0byBhdm9pZCBtZW1vcnkgbGVhayBpbiBjYXNlIG9mIGV4Y2VwdGlvbnMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBhbGlnbmVkX3N0YWNrX21lbW9yeV9oYW5kbGVyCit7CisgIHB1YmxpYzoKKyAgICAvKiBDcmVhdGVzIGEgc3RhY2tfbWVtb3J5X2hhbmRsZXIgcmVzcG9uc2libGUgZm9yIHRoZSBidWZmZXIgXGEgcHRyIG9mIHNpemUgXGEgc2l6ZS4KKyAgICAgKiBOb3RlIHRoYXQgXGEgcHRyIGNhbiBiZSAwIHJlZ2FyZGxlc3Mgb2YgdGhlIG90aGVyIHBhcmFtZXRlcnMuCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBjYXJlIG9mIGNvbnN0cnVjdGluZy9pbml0aWFsaXppbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBidWZmZXIgaWYgcmVxdWlyZWQgYnkgdGhlIHNjYWxhciB0eXBlIFQgKHNlZSBOdW1UcmFpdHM8VD46OlJlcXVpcmVJbml0aWFsaXphdGlvbikuCisgICAgICogSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGVsZW1lbnRzIHdpbGwgYWxzbyBiZSBkZXN0cnVjdGVkIHdoZW4gdGhpcyBoYW5kbGVyIHdpbGwgYmUgZGVzdHJ1Y3RlZC4KKyAgICAgKiBGaW5hbGx5LCBpZiBcYSBkZWFsbG9jIGlzIHRydWUsIHRoZW4gdGhlIHBvaW50ZXIgXGEgcHRyIGlzIGZyZWVkLgorICAgICAqKi8KKyAgICBhbGlnbmVkX3N0YWNrX21lbW9yeV9oYW5kbGVyKFQqIHB0ciwgc2l6ZV90IHNpemUsIGJvb2wgZGVhbGxvYykKKyAgICAgIDogbV9wdHIocHRyKSwgbV9zaXplKHNpemUpLCBtX2RlYWxsb2NhdGUoZGVhbGxvYykKKyAgICB7CisgICAgICBpZihOdW1UcmFpdHM8VD46OlJlcXVpcmVJbml0aWFsaXphdGlvbiAmJiBtX3B0cikKKyAgICAgICAgRWlnZW46OmludGVybmFsOjpjb25zdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXkobV9wdHIsIHNpemUpOworICAgIH0KKyAgICB+YWxpZ25lZF9zdGFja19tZW1vcnlfaGFuZGxlcigpCisgICAgeworICAgICAgaWYoTnVtVHJhaXRzPFQ+OjpSZXF1aXJlSW5pdGlhbGl6YXRpb24gJiYgbV9wdHIpCisgICAgICAgIEVpZ2VuOjppbnRlcm5hbDo6ZGVzdHJ1Y3RfZWxlbWVudHNfb2ZfYXJyYXk8VD4obV9wdHIsIG1fc2l6ZSk7CisgICAgICBpZihtX2RlYWxsb2NhdGUpCisgICAgICAgIEVpZ2VuOjppbnRlcm5hbDo6YWxpZ25lZF9mcmVlKG1fcHRyKTsKKyAgICB9CisgIHByb3RlY3RlZDoKKyAgICBUKiBtX3B0cjsKKyAgICBzaXplX3QgbV9zaXplOworICAgIGJvb2wgbV9kZWFsbG9jYXRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcaW50ZXJuYWwKKyAgKiBEZWNsYXJlcywgYWxsb2NhdGVzIGFuZCBjb25zdHJ1Y3QgYW4gYWxpZ25lZCBidWZmZXIgbmFtZWQgTkFNRSBvZiBTSVpFIGVsZW1lbnRzIG9mIHR5cGUgVFlQRSBvbiB0aGUgc3RhY2sKKyAgKiBpZiBTSVpFIGlzIHNtYWxsZXIgdGhhbiBFSUdFTl9TVEFDS19BTExPQ0FUSU9OX0xJTUlULCBhbmQgaWYgc3RhY2sgYWxsb2NhdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtCisgICogKGN1cnJlbnRseSwgdGhpcyBpcyBMaW51eCBhbmQgVmlzdWFsIFN0dWRpbyBvbmx5KS4gT3RoZXJ3aXNlIHRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLgorICAqIFRoZSBhbGxvY2F0ZWQgYnVmZmVyIGlzIGF1dG9tYXRpY2FsbHkgZGVsZXRlZCB3aGVuIGV4aXRpbmcgdGhlIHNjb3BlIG9mIHRoaXMgZGVjbGFyYXRpb24uCisgICogSWYgQlVGRkVSIGlzIG5vbiBudWxsLCB0aGVuIHRoZSBkZWNsYXJlZCB2YXJpYWJsZSBpcyBzaW1wbHkgYW4gYWxpYXMgZm9yIEJVRkZFUiwgYW5kIG5vIGFsbG9jYXRpb24vZGVsZXRpb24gb2NjdXJzLgorICAqIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgKiBcY29kZQorICAqIHsKKyAgKiAgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShmbG9hdCxkYXRhLHNpemUsMCk7CisgICogICAvLyB1c2UgZGF0YVswXSB0byBkYXRhW3NpemUtMV0KKyAgKiB9CisgICogXGVuZGNvZGUKKyAgKiBUaGUgdW5kZXJseWluZyBzdGFjayBhbGxvY2F0aW9uIGZ1bmN0aW9uIGNhbiBjb250cm9sbGVkIHdpdGggdGhlIEVJR0VOX0FMTE9DQSBwcmVwcm9jZXNzb3IgdG9rZW4uCisgICovCisjaWZkZWYgRUlHRU5fQUxMT0NBCisKKyAgI2lmZGVmIF9fYXJtX18KKyAgICAjZGVmaW5lIEVJR0VOX0FMSUdORURfQUxMT0NBKFNJWkUpIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KChyZWludGVycHJldF9jYXN0PHNpemVfdD4oRUlHRU5fQUxMT0NBKFNJWkUrMTYpKSAmIH4oc2l6ZV90KDE1KSkpICsgMTYpCisgICNlbHNlCisgICAgI2RlZmluZSBFSUdFTl9BTElHTkVEX0FMTE9DQSBFSUdFTl9BTExPQ0EKKyAgI2VuZGlmCisKKyAgI2RlZmluZSBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoVFlQRSxOQU1FLFNJWkUsQlVGRkVSKSBcCisgICAgRWlnZW46OmludGVybmFsOjpjaGVja19zaXplX2Zvcl9vdmVyZmxvdzxUWVBFPihTSVpFKTsgXAorICAgIFRZUEUqIE5BTUUgPSAoQlVGRkVSKSE9MCA/IChCVUZGRVIpIFwKKyAgICAgICAgICAgICAgIDogcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oIFwKKyAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKFRZUEUpKlNJWkU8PUVJR0VOX1NUQUNLX0FMTE9DQVRJT05fTElNSVQpID8gRUlHRU5fQUxJR05FRF9BTExPQ0Eoc2l6ZW9mKFRZUEUpKlNJWkUpIFwKKyAgICAgICAgICAgICAgICAgICAgOiBFaWdlbjo6aW50ZXJuYWw6OmFsaWduZWRfbWFsbG9jKHNpemVvZihUWVBFKSpTSVpFKSApOyAgXAorICAgIEVpZ2VuOjppbnRlcm5hbDo6YWxpZ25lZF9zdGFja19tZW1vcnlfaGFuZGxlcjxUWVBFPiBFSUdFTl9DQVQoTkFNRSxfc3RhY2tfbWVtb3J5X2Rlc3RydWN0b3IpKChCVUZGRVIpPT0wID8gTkFNRSA6IDAsU0laRSxzaXplb2YoVFlQRSkqU0laRT5FSUdFTl9TVEFDS19BTExPQ0FUSU9OX0xJTUlUKQorCisjZWxzZQorCisgICNkZWZpbmUgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFRZUEUsTkFNRSxTSVpFLEJVRkZFUikgXAorICAgIEVpZ2VuOjppbnRlcm5hbDo6Y2hlY2tfc2l6ZV9mb3Jfb3ZlcmZsb3c8VFlQRT4oU0laRSk7IFwKKyAgICBUWVBFKiBOQU1FID0gKEJVRkZFUikhPTAgPyBCVUZGRVIgOiByZWludGVycHJldF9jYXN0PFRZUEUqPihFaWdlbjo6aW50ZXJuYWw6OmFsaWduZWRfbWFsbG9jKHNpemVvZihUWVBFKSpTSVpFKSk7ICAgIFwKKyAgICBFaWdlbjo6aW50ZXJuYWw6OmFsaWduZWRfc3RhY2tfbWVtb3J5X2hhbmRsZXI8VFlQRT4gRUlHRU5fQ0FUKE5BTUUsX3N0YWNrX21lbW9yeV9kZXN0cnVjdG9yKSgoQlVGRkVSKT09MCA/IE5BTUUgOiAwLFNJWkUsdHJ1ZSkKKyAgICAKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIEltcGxlbWVudGF0aW9uIG9mIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcgW19JRl0gICAgICAgICAgICAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIEVJR0VOX0FMSUdOCisgICNpZmRlZiBFSUdFTl9FWENFUFRJT05TCisgICAgI2RlZmluZSBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX05PVEhST1coTmVlZHNUb0FsaWduKSBcCisgICAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKSB7IFwKKyAgICAgICAgdHJ5IHsgcmV0dXJuIEVpZ2VuOjppbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9tYWxsb2M8TmVlZHNUb0FsaWduPihzaXplKTsgfSBcCisgICAgICAgIGNhdGNoICguLi4pIHsgcmV0dXJuIDA7IH0gXAorICAgICAgICByZXR1cm4gMDsgXAorICAgICAgfQorICAjZWxzZQorICAgICNkZWZpbmUgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19OT1RIUk9XKE5lZWRzVG9BbGlnbikgXAorICAgICAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCkgeyBcCisgICAgICAgIHJldHVybiBFaWdlbjo6aW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbWFsbG9jPE5lZWRzVG9BbGlnbj4oc2l6ZSk7IFwKKyAgICAgIH0KKyAgI2VuZGlmCisKKyAgI2RlZmluZSBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGKE5lZWRzVG9BbGlnbikgXAorICAgICAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKSB7IFwKKyAgICAgICAgcmV0dXJuIEVpZ2VuOjppbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9tYWxsb2M8TmVlZHNUb0FsaWduPihzaXplKTsgXAorICAgICAgfSBcCisgICAgICB2b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSkgeyBcCisgICAgICAgIHJldHVybiBFaWdlbjo6aW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfbWFsbG9jPE5lZWRzVG9BbGlnbj4oc2l6ZSk7IFwKKyAgICAgIH0gXAorICAgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqIHB0cikgdGhyb3coKSB7IEVpZ2VuOjppbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9mcmVlPE5lZWRzVG9BbGlnbj4ocHRyKTsgfSBcCisgICAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQgKiBwdHIpIHRocm93KCkgeyBFaWdlbjo6aW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfZnJlZTxOZWVkc1RvQWxpZ24+KHB0cik7IH0gXAorICAgICAgLyogaW4tcGxhY2UgbmV3IGFuZCBkZWxldGUuIHNpbmNlIChhdCBsZWFzdCBhZmFpaykgdGhlcmUgaXMgbm8gYWN0dWFsICAgKi8gXAorICAgICAgLyogbWVtb3J5IGFsbG9jYXRlZCB3ZSBjYW4gc2FmZWx5IGxldCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoYW5kbGUgKi8gXAorICAgICAgLyogdGhpcyBwYXJ0aWN1bGFyIGNhc2UuICovIFwKKyAgICAgIHN0YXRpYyB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIHZvaWQgKnB0cikgeyByZXR1cm4gOjpvcGVyYXRvciBuZXcoc2l6ZSxwdHIpOyB9IFwKKyAgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKiBtZW1vcnksIHZvaWQgKnB0cikgdGhyb3coKSB7IHJldHVybiA6Om9wZXJhdG9yIGRlbGV0ZShtZW1vcnkscHRyKTsgfSBcCisgICAgICAvKiBub3Rocm93LW5ldyAocmV0dXJucyB6ZXJvIGluc3RlYWQgb2Ygc3RkOjpiYWRfYWxsb2MpICovIFwKKyAgICAgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfTk9USFJPVyhOZWVkc1RvQWxpZ24pIFwKKyAgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0ciwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpIHsgXAorICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfZnJlZTxOZWVkc1RvQWxpZ24+KHB0cik7IFwKKyAgICAgIH0gXAorICAgICAgdHlwZWRlZiB2b2lkIGVpZ2VuX2FsaWduZWRfb3BlcmF0b3JfbmV3X21hcmtlcl90eXBlOworI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGKE5lZWRzVG9BbGlnbikKKyNlbmRpZgorCisjZGVmaW5lIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRih0cnVlKQorI2RlZmluZSBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKFNjYWxhcixTaXplKSBcCisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUYoYm9vbCgoKFNpemUpIT1FaWdlbjo6RHluYW1pYykgJiYgKChzaXplb2YoU2NhbGFyKSooU2l6ZSkpJTE2PT0wKSkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGNsYXNzIGFsaWduZWRfYWxsb2NhdG9yCisqIFxpbmdyb3VwIENvcmVfTW9kdWxlCisqCisqIFxicmllZiBTVEwgY29tcGF0aWJsZSBhbGxvY2F0b3IgdG8gdXNlIHdpdGggd2l0aCAxNiBieXRlIGFsaWduZWQgdHlwZXMKKyoKKyogRXhhbXBsZToKKyogXGNvZGUKKyogLy8gTWF0cml4NGYgcmVxdWlyZXMgMTYgYnl0ZXMgYWxpZ25tZW50OgorKiBzdGQ6Om1hcDwgaW50LCBNYXRyaXg0Ziwgc3RkOjpsZXNzPGludD4sIAorKiAgICAgICAgICAgYWxpZ25lZF9hbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IGludCwgTWF0cml4NGY+ID4gPiBteV9tYXBfbWF0NDsKKyogLy8gVmVjdG9yM2YgZG9lcyBub3QgcmVxdWlyZSAxNiBieXRlcyBhbGlnbm1lbnQsIG5vIG5lZWQgdG8gdXNlIEVpZ2VuJ3MgYWxsb2NhdG9yOgorKiBzdGQ6Om1hcDwgaW50LCBWZWN0b3IzZiA+IG15X21hcF92ZWMzOworKiBcZW5kY29kZQorKgorKiBcc2EgXHJlZiBUb3BpY1N0bENvbnRhaW5lcnMuCisqLwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIGFsaWduZWRfYWxsb2NhdG9yCit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBzaXplX3QgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgVCogICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBUKiAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIFQmICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCBUJiAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgVCAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPgorICAgIHN0cnVjdCByZWJpbmQKKyAgICB7CisgICAgICAgIHR5cGVkZWYgYWxpZ25lZF9hbGxvY2F0b3I8VT4gb3RoZXI7CisgICAgfTsKKworICAgIHBvaW50ZXIgYWRkcmVzcyggcmVmZXJlbmNlIHZhbHVlICkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAmdmFsdWU7CisgICAgfQorCisgICAgY29uc3RfcG9pbnRlciBhZGRyZXNzKCBjb25zdF9yZWZlcmVuY2UgdmFsdWUgKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICZ2YWx1ZTsKKyAgICB9CisKKyAgICBhbGlnbmVkX2FsbG9jYXRvcigpCisgICAgeworICAgIH0KKworICAgIGFsaWduZWRfYWxsb2NhdG9yKCBjb25zdCBhbGlnbmVkX2FsbG9jYXRvciYgKQorICAgIHsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPgorICAgIGFsaWduZWRfYWxsb2NhdG9yKCBjb25zdCBhbGlnbmVkX2FsbG9jYXRvcjxVPiYgKQorICAgIHsKKyAgICB9CisKKyAgICB+YWxpZ25lZF9hbGxvY2F0b3IoKQorICAgIHsKKyAgICB9CisKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdHlwZT46Om1heCkoKTsKKyAgICB9CisKKyAgICBwb2ludGVyIGFsbG9jYXRlKCBzaXplX3R5cGUgbnVtLCBjb25zdCB2b2lkKiBoaW50ID0gMCApCisgICAgeworICAgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaGludCk7CisgICAgICAgIGludGVybmFsOjpjaGVja19zaXplX2Zvcl9vdmVyZmxvdzxUPihudW0pOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cG9pbnRlcj4oIGludGVybmFsOjphbGlnbmVkX21hbGxvYyggbnVtICogc2l6ZW9mKFQpICkgKTsKKyAgICB9CisKKyAgICB2b2lkIGNvbnN0cnVjdCggcG9pbnRlciBwLCBjb25zdCBUJiB2YWx1ZSApCisgICAgeworICAgICAgICA6Om5ldyggcCApIFQoIHZhbHVlICk7CisgICAgfQorCisgICAgLy8gU3VwcG9ydCBmb3IgYysrMTEKKyNpZiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgorICAgIHZvaWQgIGNvbnN0cnVjdChwb2ludGVyIHAsIEFyZ3MmJi4uLiBhcmdzKQorICAgIHsKKyAgICAgIDo6bmV3KHApIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICB9CisjZW5kaWYKKworICAgIHZvaWQgZGVzdHJveSggcG9pbnRlciBwICkKKyAgICB7CisgICAgICAgIHAtPn5UKCk7CisgICAgfQorCisgICAgdm9pZCBkZWFsbG9jYXRlKCBwb2ludGVyIHAsIHNpemVfdHlwZSAvKm51bSovICkKKyAgICB7CisgICAgICAgIGludGVybmFsOjphbGlnbmVkX2ZyZWUoIHAgKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgYWxpZ25lZF9hbGxvY2F0b3I8VD4mICkgY29uc3QKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGFsaWduZWRfYWxsb2NhdG9yPFQ+JiApIGNvbnN0CisgICAgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8tLS0tLS0tLS0tIENhY2hlIHNpemVzIC0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKEVJR0VOX05PX0NQVUlEKQorIyAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pICkKKyMgICAgaWYgZGVmaW5lZChfX1BJQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQorICAgICAgIC8vIENhc2UgZm9yIHg4NiB3aXRoIFBJQworIyAgICAgIGRlZmluZSBFSUdFTl9DUFVJRChhYmNkLGZ1bmMsaWQpIFwKKyAgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgieGNoZ2wgJSVlYngsICUlZXNpO2NwdWlkOyB4Y2hnbCAlJWVieCwlJWVzaSI6ICI9YSIgKGFiY2RbMF0pLCAiPVMiIChhYmNkWzFdKSwgIj1jIiAoYWJjZFsyXSksICI9ZCIgKGFiY2RbM10pIDogImEiIChmdW5jKSwgImMiIChpZCkpOworIyAgICBlbHNlCisgICAgICAgLy8gQ2FzZSBmb3IgeDg2XzY0IG9yIHg4NiB3L28gUElDCisjICAgICAgZGVmaW5lIEVJR0VOX0NQVUlEKGFiY2QsZnVuYyxpZCkgXAorICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjcHVpZCI6ICI9YSIgKGFiY2RbMF0pLCAiPWIiIChhYmNkWzFdKSwgIj1jIiAoYWJjZFsyXSksICI9ZCIgKGFiY2RbM10pIDogImEiIChmdW5jKSwgImMiIChpZCkgKTsKKyMgICAgZW5kaWYKKyMgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgICAgaWYgKF9NU0NfVkVSID4gMTUwMCkKKyMgICAgICBkZWZpbmUgRUlHRU5fQ1BVSUQoYWJjZCxmdW5jLGlkKSBfX2NwdWlkZXgoKGludCopYWJjZCxmdW5jLGlkKQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWZkZWYgRUlHRU5fQ1BVSUQKKworaW5saW5lIGJvb2wgY3B1aWRfaXNfdmVuZG9yKGludCBhYmNkWzRdLCBjb25zdCBjaGFyKiB2ZW5kb3IpCit7CisgIHJldHVybiBhYmNkWzFdPT0ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQqPih2ZW5kb3IpKVswXSAmJiBhYmNkWzNdPT0ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQqPih2ZW5kb3IpKVsxXSAmJiBhYmNkWzJdPT0ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQqPih2ZW5kb3IpKVsyXTsKK30KKworaW5saW5lIHZvaWQgcXVlcnlDYWNoZVNpemVzX2ludGVsX2RpcmVjdChpbnQmIGwxLCBpbnQmIGwyLCBpbnQmIGwzKQoreworICBpbnQgYWJjZFs0XTsKKyAgbDEgPSBsMiA9IGwzID0gMDsKKyAgaW50IGNhY2hlX2lkID0gMDsKKyAgaW50IGNhY2hlX3R5cGUgPSAwOworICBkbyB7CisgICAgYWJjZFswXSA9IGFiY2RbMV0gPSBhYmNkWzJdID0gYWJjZFszXSA9IDA7CisgICAgRUlHRU5fQ1BVSUQoYWJjZCwweDQsY2FjaGVfaWQpOworICAgIGNhY2hlX3R5cGUgID0gKGFiY2RbMF0gJiAweDBGKSA+PiAwOworICAgIGlmKGNhY2hlX3R5cGU9PTF8fGNhY2hlX3R5cGU9PTMpIC8vIGRhdGEgb3IgdW5pZmllZCBjYWNoZQorICAgIHsKKyAgICAgIGludCBjYWNoZV9sZXZlbCA9IChhYmNkWzBdICYgMHhFMCkgPj4gNTsgIC8vIEFbNzo1XQorICAgICAgaW50IHdheXMgICAgICAgID0gKGFiY2RbMV0gJiAweEZGQzAwMDAwKSA+PiAyMjsgLy8gQlszMToyMl0KKyAgICAgIGludCBwYXJ0aXRpb25zICA9IChhYmNkWzFdICYgMHgwMDNGRjAwMCkgPj4gMTI7IC8vIEJbMjE6MTJdCisgICAgICBpbnQgbGluZV9zaXplICAgPSAoYWJjZFsxXSAmIDB4MDAwMDBGRkYpID4+ICAwOyAvLyBCWzExOjBdCisgICAgICBpbnQgc2V0cyAgICAgICAgPSAoYWJjZFsyXSk7ICAgICAgICAgICAgICAgICAgICAvLyBDWzMxOjBdCisKKyAgICAgIGludCBjYWNoZV9zaXplID0gKHdheXMrMSkgKiAocGFydGl0aW9ucysxKSAqIChsaW5lX3NpemUrMSkgKiAoc2V0cysxKTsKKworICAgICAgc3dpdGNoKGNhY2hlX2xldmVsKQorICAgICAgeworICAgICAgICBjYXNlIDE6IGwxID0gY2FjaGVfc2l6ZTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogbDIgPSBjYWNoZV9zaXplOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBsMyA9IGNhY2hlX3NpemU7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgY2FjaGVfaWQrKzsKKyAgfSB3aGlsZShjYWNoZV90eXBlPjAgJiYgY2FjaGVfaWQ8MTYpOworfQorCitpbmxpbmUgdm9pZCBxdWVyeUNhY2hlU2l6ZXNfaW50ZWxfY29kZXMoaW50JiBsMSwgaW50JiBsMiwgaW50JiBsMykKK3sKKyAgaW50IGFiY2RbNF07CisgIGFiY2RbMF0gPSBhYmNkWzFdID0gYWJjZFsyXSA9IGFiY2RbM10gPSAwOworICBsMSA9IGwyID0gbDMgPSAwOworICBFSUdFTl9DUFVJRChhYmNkLDB4MDAwMDAwMDIsMCk7CisgIHVuc2lnbmVkIGNoYXIgKiBieXRlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhciAqPihhYmNkKSsyOworICBib29sIGNoZWNrX2Zvcl9wMl9jb3JlMiA9IGZhbHNlOworICBmb3IoaW50IGk9MDsgaTwxNDsgKytpKQorICB7CisgICAgc3dpdGNoKGJ5dGVzW2ldKQorICAgIHsKKyAgICAgIGNhc2UgMHgwQTogbDEgPSA4OyBicmVhazsgICAvLyAwQWggICBkYXRhIEwxIGNhY2hlLCA4IEtCLCAyIHdheXMsIDMyIGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHgwQzogbDEgPSAxNjsgYnJlYWs7ICAvLyAwQ2ggICBkYXRhIEwxIGNhY2hlLCAxNiBLQiwgNCB3YXlzLCAzMiBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4MEU6IGwxID0gMjQ7IGJyZWFrOyAgLy8gMEVoICAgZGF0YSBMMSBjYWNoZSwgMjQgS0IsIDYgd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDEwOiBsMSA9IDE2OyBicmVhazsgIC8vIDEwaCAgIGRhdGEgTDEgY2FjaGUsIDE2IEtCLCA0IHdheXMsIDMyIGJ5dGUgbGluZXMgKElBLTY0KQorICAgICAgY2FzZSAweDE1OiBsMSA9IDE2OyBicmVhazsgIC8vIDE1aCAgIGNvZGUgTDEgY2FjaGUsIDE2IEtCLCA0IHdheXMsIDMyIGJ5dGUgbGluZXMgKElBLTY0KQorICAgICAgY2FzZSAweDJDOiBsMSA9IDMyOyBicmVhazsgIC8vIDJDaCAgIGRhdGEgTDEgY2FjaGUsIDMyIEtCLCA4IHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHgzMDogbDEgPSAzMjsgYnJlYWs7ICAvLyAzMGggICBjb2RlIEwxIGNhY2hlLCAzMiBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NjA6IGwxID0gMTY7IGJyZWFrOyAgLy8gNjBoICAgZGF0YSBMMSBjYWNoZSwgMTYgS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcywgc2VjdG9yZWQKKyAgICAgIGNhc2UgMHg2NjogbDEgPSA4OyBicmVhazsgICAvLyA2NmggICBkYXRhIEwxIGNhY2hlLCA4IEtCLCA0IHdheXMsIDY0IGJ5dGUgbGluZXMsIHNlY3RvcmVkCisgICAgICBjYXNlIDB4Njc6IGwxID0gMTY7IGJyZWFrOyAgLy8gNjdoICAgZGF0YSBMMSBjYWNoZSwgMTYgS0IsIDQgd2F5cywgNjQgYnl0ZSBsaW5lcywgc2VjdG9yZWQKKyAgICAgIGNhc2UgMHg2ODogbDEgPSAzMjsgYnJlYWs7ICAvLyA2OGggICBkYXRhIEwxIGNhY2hlLCAzMiBLQiwgNCB3YXlzLCA2NCBieXRlIGxpbmVzLCBzZWN0b3JlZAorICAgICAgY2FzZSAweDFBOiBsMiA9IDk2OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCA5NiBLQiwgNiB3YXlzLCA2NCBieXRlIGxpbmVzIChJQS02NCkKKyAgICAgIGNhc2UgMHgyMjogbDMgPSA1MTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDUxMiBLQiwgNCB3YXlzICghKSwgNjQgYnl0ZSBsaW5lcywgZHVhbC1zZWN0b3JlZAorICAgICAgY2FzZSAweDIzOiBsMyA9IDEwMjQ7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDEwMjQgS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcywgZHVhbC1zZWN0b3JlZAorICAgICAgY2FzZSAweDI1OiBsMyA9IDIwNDg7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDIwNDggS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcywgZHVhbC1zZWN0b3JlZAorICAgICAgY2FzZSAweDI5OiBsMyA9IDQwOTY7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDQwOTYgS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcywgZHVhbC1zZWN0b3JlZAorICAgICAgY2FzZSAweDM5OiBsMiA9IDEyODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMTI4IEtCLCA0IHdheXMsIDY0IGJ5dGUgbGluZXMsIHNlY3RvcmVkCisgICAgICBjYXNlIDB4M0E6IGwyID0gMTkyOyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAxOTIgS0IsIDYgd2F5cywgNjQgYnl0ZSBsaW5lcywgc2VjdG9yZWQKKyAgICAgIGNhc2UgMHgzQjogbDIgPSAxMjg7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDEyOCBLQiwgMiB3YXlzLCA2NCBieXRlIGxpbmVzLCBzZWN0b3JlZAorICAgICAgY2FzZSAweDNDOiBsMiA9IDI1NjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMjU2IEtCLCA0IHdheXMsIDY0IGJ5dGUgbGluZXMsIHNlY3RvcmVkCisgICAgICBjYXNlIDB4M0Q6IGwyID0gMzg0OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAzODQgS0IsIDYgd2F5cywgNjQgYnl0ZSBsaW5lcywgc2VjdG9yZWQKKyAgICAgIGNhc2UgMHgzRTogbDIgPSA1MTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDUxMiBLQiwgNCB3YXlzLCA2NCBieXRlIGxpbmVzLCBzZWN0b3JlZAorICAgICAgY2FzZSAweDQwOiBsMiA9IDA7IGJyZWFrOyAgIC8vIG5vIGludGVncmF0ZWQgTDIgY2FjaGUgKFA2IGNvcmUpIG9yIEwzIGNhY2hlIChQNCBjb3JlKQorICAgICAgY2FzZSAweDQxOiBsMiA9IDEyODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMTI4IEtCLCA0IHdheXMsIDMyIGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg0MjogbDIgPSAyNTY7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDI1NiBLQiwgNCB3YXlzLCAzMiBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NDM6IGwyID0gNTEyOyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCA1MTIgS0IsIDQgd2F5cywgMzIgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDQ0OiBsMiA9IDEwMjQ7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDEwMjQgS0IsIDQgd2F5cywgMzIgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDQ1OiBsMiA9IDIwNDg7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDIwNDggS0IsIDQgd2F5cywgMzIgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDQ2OiBsMyA9IDQwOTY7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDQwOTYgS0IsIDQgd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDQ3OiBsMyA9IDgxOTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDgxOTIgS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDQ4OiBsMiA9IDMwNzI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDMwNzIgS0IsIDEyIHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg0OTogaWYobDIhPTApIGwzID0gNDA5NjsgZWxzZSB7Y2hlY2tfZm9yX3AyX2NvcmUyPXRydWU7IGwzID0gbDIgPSA0MDk2O30gYnJlYWs7Ly8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgNDA5NiBLQiwgMTYgd2F5cywgNjQgYnl0ZSBsaW5lcyAoUDQpIG9yIEwyIGZvciBjb3JlMgorICAgICAgY2FzZSAweDRBOiBsMyA9IDYxNDQ7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDYxNDQgS0IsIDEyIHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg0QjogbDMgPSA4MTkyOyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwzIGNhY2hlLCA4MTkyIEtCLCAxNiB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NEM6IGwzID0gMTIyODg7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDEyMjg4IEtCLCAxMiB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NEQ6IGwzID0gMTYzODQ7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDE2Mzg0IEtCLCAxNiB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4NEU6IGwyID0gNjE0NDsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgNjE0NCBLQiwgMjQgd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDc4OiBsMiA9IDEwMjQ7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDEwMjQgS0IsIDQgd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDc5OiBsMiA9IDEyODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMTI4IEtCLCA4IHdheXMsIDY0IGJ5dGUgbGluZXMsIGR1YWwtc2VjdG9yZWQKKyAgICAgIGNhc2UgMHg3QTogbDIgPSAyNTY7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDI1NiBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzLCBkdWFsLXNlY3RvcmVkCisgICAgICBjYXNlIDB4N0I6IGwyID0gNTEyOyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCA1MTIgS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcywgZHVhbC1zZWN0b3JlZAorICAgICAgY2FzZSAweDdDOiBsMiA9IDEwMjQ7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDEwMjQgS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcywgZHVhbC1zZWN0b3JlZAorICAgICAgY2FzZSAweDdEOiBsMiA9IDIwNDg7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDIwNDggS0IsIDggd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDdFOiBsMiA9IDI1NjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMjU2IEtCLCA4IHdheXMsIDEyOCBieXRlIGxpbmVzLCBzZWN0LiAoSUEtNjQpCisgICAgICBjYXNlIDB4N0Y6IGwyID0gNTEyOyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCA1MTIgS0IsIDIgd2F5cywgNjQgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDgwOiBsMiA9IDUxMjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgNTEyIEtCLCA4IHdheXMsIDY0IGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg4MTogbDIgPSAxMjg7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDEyOCBLQiwgOCB3YXlzLCAzMiBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4ODI6IGwyID0gMjU2OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAyNTYgS0IsIDggd2F5cywgMzIgYnl0ZSBsaW5lcworICAgICAgY2FzZSAweDgzOiBsMiA9IDUxMjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgNTEyIEtCLCA4IHdheXMsIDMyIGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg4NDogbDIgPSAxMDI0OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAxMDI0IEtCLCA4IHdheXMsIDMyIGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg4NTogbDIgPSAyMDQ4OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwyIGNhY2hlLCAyMDQ4IEtCLCA4IHdheXMsIDMyIGJ5dGUgbGluZXMKKyAgICAgIGNhc2UgMHg4NjogbDIgPSA1MTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDIgY2FjaGUsIDUxMiBLQiwgNCB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4ODc6IGwyID0gMTAyNDsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMiBjYWNoZSwgMTAyNCBLQiwgOCB3YXlzLCA2NCBieXRlIGxpbmVzCisgICAgICBjYXNlIDB4ODg6IGwzID0gMjA0ODsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgMjA0OCBLQiwgNCB3YXlzLCA2NCBieXRlIGxpbmVzIChJQS02NCkKKyAgICAgIGNhc2UgMHg4OTogbDMgPSA0MDk2OyBicmVhazsgICAvLyBjb2RlIGFuZCBkYXRhIEwzIGNhY2hlLCA0MDk2IEtCLCA0IHdheXMsIDY0IGJ5dGUgbGluZXMgKElBLTY0KQorICAgICAgY2FzZSAweDhBOiBsMyA9IDgxOTI7IGJyZWFrOyAgIC8vIGNvZGUgYW5kIGRhdGEgTDMgY2FjaGUsIDgxOTIgS0IsIDQgd2F5cywgNjQgYnl0ZSBsaW5lcyAoSUEtNjQpCisgICAgICBjYXNlIDB4OEQ6IGwzID0gMzA3MjsgYnJlYWs7ICAgLy8gY29kZSBhbmQgZGF0YSBMMyBjYWNoZSwgMzA3MiBLQiwgMTIgd2F5cywgMTI4IGJ5dGUgbGluZXMgKElBLTY0KQorCisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgIH0KKyAgaWYoY2hlY2tfZm9yX3AyX2NvcmUyICYmIGwyID09IGwzKQorICAgIGwzID0gMDsKKyAgbDEgKj0gMTAyNDsKKyAgbDIgKj0gMTAyNDsKKyAgbDMgKj0gMTAyNDsKK30KKworaW5saW5lIHZvaWQgcXVlcnlDYWNoZVNpemVzX2ludGVsKGludCYgbDEsIGludCYgbDIsIGludCYgbDMsIGludCBtYXhfc3RkX2Z1bmNzKQoreworICBpZihtYXhfc3RkX2Z1bmNzPj00KQorICAgIHF1ZXJ5Q2FjaGVTaXplc19pbnRlbF9kaXJlY3QobDEsbDIsbDMpOworICBlbHNlCisgICAgcXVlcnlDYWNoZVNpemVzX2ludGVsX2NvZGVzKGwxLGwyLGwzKTsKK30KKworaW5saW5lIHZvaWQgcXVlcnlDYWNoZVNpemVzX2FtZChpbnQmIGwxLCBpbnQmIGwyLCBpbnQmIGwzKQoreworICBpbnQgYWJjZFs0XTsKKyAgYWJjZFswXSA9IGFiY2RbMV0gPSBhYmNkWzJdID0gYWJjZFszXSA9IDA7CisgIEVJR0VOX0NQVUlEKGFiY2QsMHg4MDAwMDAwNSwwKTsKKyAgbDEgPSAoYWJjZFsyXSA+PiAyNCkgKiAxMDI0OyAvLyBDWzMxOjI0XSA9IEwxIHNpemUgaW4gS0IKKyAgYWJjZFswXSA9IGFiY2RbMV0gPSBhYmNkWzJdID0gYWJjZFszXSA9IDA7CisgIEVJR0VOX0NQVUlEKGFiY2QsMHg4MDAwMDAwNiwwKTsKKyAgbDIgPSAoYWJjZFsyXSA+PiAxNikgKiAxMDI0OyAvLyBDWzMxOzE2XSA9IGwyIGNhY2hlIHNpemUgaW4gS0IKKyAgbDMgPSAoKGFiY2RbM10gJiAweEZGRkMwMDApID4+IDE4KSAqIDUxMiAqIDEwMjQ7IC8vIERbMzE7MThdID0gbDMgY2FjaGUgc2l6ZSBpbiA1MTJLQgorfQorI2VuZGlmCisKKy8qKiBcaW50ZXJuYWwKKyAqIFF1ZXJpZXMgYW5kIHJldHVybnMgdGhlIGNhY2hlIHNpemVzIGluIEJ5dGVzIG9mIHRoZSBMMSwgTDIsIGFuZCBMMyBkYXRhIGNhY2hlcyByZXNwZWN0aXZlbHkgKi8KK2lubGluZSB2b2lkIHF1ZXJ5Q2FjaGVTaXplcyhpbnQmIGwxLCBpbnQmIGwyLCBpbnQmIGwzKQoreworICAjaWZkZWYgRUlHRU5fQ1BVSUQKKyAgaW50IGFiY2RbNF07CisKKyAgLy8gaWRlbnRpZnkgdGhlIENQVSB2ZW5kb3IKKyAgRUlHRU5fQ1BVSUQoYWJjZCwweDAsMCk7CisgIGludCBtYXhfc3RkX2Z1bmNzID0gYWJjZFsxXTsKKyAgaWYoY3B1aWRfaXNfdmVuZG9yKGFiY2QsIkdlbnVpbmVJbnRlbCIpKQorICAgIHF1ZXJ5Q2FjaGVTaXplc19pbnRlbChsMSxsMixsMyxtYXhfc3RkX2Z1bmNzKTsKKyAgZWxzZSBpZihjcHVpZF9pc192ZW5kb3IoYWJjZCwiQXV0aGVudGljQU1EIikgfHwgY3B1aWRfaXNfdmVuZG9yKGFiY2QsIkFNRGlzYmV0dGVyISIpKQorICAgIHF1ZXJ5Q2FjaGVTaXplc19hbWQobDEsbDIsbDMpOworICBlbHNlCisgICAgLy8gYnkgZGVmYXVsdCBsZXQncyB1c2UgSW50ZWwncyBBUEkKKyAgICBxdWVyeUNhY2hlU2l6ZXNfaW50ZWwobDEsbDIsbDMsbWF4X3N0ZF9mdW5jcyk7CisKKyAgLy8gaGVyZSBpcyB0aGUgbGlzdCBvZiBvdGhlciB2ZW5kb3JzOgorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJWSUEgVklBIFZJQSAiKQorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJDeXJpeEluc3RlYWQiKQorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJDZW50YXVySGF1bHMiKQorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJHZW51aW5lVE14ODYiKQorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJUcmFuc21ldGFDUFUiKQorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJSaXNlUmlzZVJpc2UiKQorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJHZW9kZSBieSBOU0MiKQorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJTaVMgU2lTIFNpUyAiKQorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJVTUMgVU1DIFVNQyAiKQorLy8gICB8fGNwdWlkX2lzX3ZlbmRvcihhYmNkLCJOZXhHZW5Ecml2ZW4iKQorICAjZWxzZQorICBsMSA9IGwyID0gbDMgPSAtMTsKKyAgI2VuZGlmCit9CisKKy8qKiBcaW50ZXJuYWwKKyAqIFxyZXR1cm5zIHRoZSBzaXplIGluIEJ5dGVzIG9mIHRoZSBMMSBkYXRhIGNhY2hlICovCitpbmxpbmUgaW50IHF1ZXJ5TDFDYWNoZVNpemUoKQoreworICBpbnQgbDEoLTEpLCBsMiwgbDM7CisgIHF1ZXJ5Q2FjaGVTaXplcyhsMSxsMixsMyk7CisgIHJldHVybiBsMTsKK30KKworLyoqIFxpbnRlcm5hbAorICogXHJldHVybnMgdGhlIHNpemUgaW4gQnl0ZXMgb2YgdGhlIEwyIG9yIEwzIGNhY2hlIGlmIHRoaXMgbGF0ZXIgaXMgcHJlc2VudCAqLworaW5saW5lIGludCBxdWVyeVRvcExldmVsQ2FjaGVTaXplKCkKK3sKKyAgaW50IGwxLCBsMigtMSksIGwzKC0xKTsKKyAgcXVlcnlDYWNoZVNpemVzKGwxLGwyLGwzKTsKKyAgcmV0dXJuIChzdGQ6Om1heCkobDIsbDMpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NRU1PUllfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9NZXRhLmggYi9FaWdlbi9zcmMvQ29yZS91dGlsL01ldGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWYzMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9NZXRhLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUVUQV9ICisjZGVmaW5lIEVJR0VOX01FVEFfSAorCituYW1lc3BhY2UgRWlnZW4geworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsCisgICogXGZpbGUgTWV0YS5oCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIGdlbmVyaWMgbWV0YXByb2dyYW1taW5nIGNsYXNzZXMgd2hpY2ggYXJlIG5vdCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBFaWdlbi4KKyAgKiBcbm90ZSBJbiBjYXNlIHlvdSB3b25kZXIsIHllcyB3ZSdyZSBhd2FyZSB0aGF0IEJvb3N0IGFscmVhZHkgcHJvdmlkZXMgYWxsIHRoZXNlIGZlYXR1cmVzLAorICAqIHdlIGhvd2V2ZXIgZG9uJ3Qgd2FudCB0byBhZGQgYSBkZXBlbmRlbmN5IHRvIEJvb3N0LgorICAqLworCitzdHJ1Y3QgdHJ1ZV90eXBlIHsgIGVudW0geyB2YWx1ZSA9IDEgfTsgfTsKK3N0cnVjdCBmYWxzZV90eXBlIHsgZW51bSB7IHZhbHVlID0gMCB9OyB9OworCit0ZW1wbGF0ZTxib29sIENvbmRpdGlvbiwgdHlwZW5hbWUgVGhlbiwgdHlwZW5hbWUgRWxzZT4KK3N0cnVjdCBjb25kaXRpb25hbCB7IHR5cGVkZWYgVGhlbiB0eXBlOyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVuLCB0eXBlbmFtZSBFbHNlPgorc3RydWN0IGNvbmRpdGlvbmFsIDxmYWxzZSwgVGhlbiwgRWxzZT4geyB0eXBlZGVmIEVsc2UgdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gc3RydWN0IGlzX3NhbWUgeyBlbnVtIHsgdmFsdWUgPSAwIH07IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfc2FtZTxULFQ+IHsgZW51bSB7IHZhbHVlID0gMSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZSB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9yZWZlcmVuY2U8VCY+IHsgdHlwZWRlZiBUIHR5cGU7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcG9pbnRlciB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqY29uc3Q+IHsgdHlwZWRlZiBUIHR5cGU7IH07CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgcmVtb3ZlX2NvbnN0IHsgdHlwZWRlZiBUIHR5cGU7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHJlbW92ZV9jb25zdDxjb25zdCBUPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfY29uc3Q8Y29uc3QgVFtdPiB7IHR5cGVkZWYgVCB0eXBlW107IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgdW5zaWduZWQgaW50IFNpemU+IHN0cnVjdCByZW1vdmVfY29uc3Q8Y29uc3QgVFtTaXplXT4geyB0eXBlZGVmIFQgdHlwZVtTaXplXTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9hbGwgeyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfYWxsPGNvbnN0IFQ+ICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8VD46OnR5cGUgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfYWxsPFQgY29uc3QmPiAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8VD46OnR5cGUgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfYWxsPFQmPiAgICAgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8VD46OnR5cGUgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfYWxsPFQgY29uc3QqPiAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8VD46OnR5cGUgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfYWxsPFQqPiAgICAgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8VD46OnR5cGUgdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGlzX2FyaXRobWV0aWMgICAgICB7IGVudW0geyB2YWx1ZSA9IGZhbHNlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPGZsb2F0PiAgICAgICAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxkb3VibGU+ICAgICAgICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8bG9uZyBkb3VibGU+ICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPGJvb2w+ICAgICAgICAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxjaGFyPiAgICAgICAgICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8c2lnbmVkIGNoYXI+ICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPHVuc2lnbmVkIGNoYXI+IHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzxzaWduZWQgc2hvcnQ+ICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8dW5zaWduZWQgc2hvcnQ+eyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPHNpZ25lZCBpbnQ+ICAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgaXNfYXJpdGhtZXRpYzx1bnNpZ25lZCBpbnQ+ICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPD4gc3RydWN0IGlzX2FyaXRobWV0aWM8c2lnbmVkIGxvbmc+ICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpc19hcml0aG1ldGljPHVuc2lnbmVkIGxvbmc+IHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGFkZF9jb25zdCB7IHR5cGVkZWYgY29uc3QgVCB0eXBlOyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBhZGRfY29uc3Q8VCY+IHsgdHlwZWRlZiBUJiB0eXBlOyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzX2NvbnN0IHsgZW51bSB7IHZhbHVlID0gMCB9OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19jb25zdDxUIGNvbnN0PiB7IGVudW0geyB2YWx1ZSA9IDEgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGFkZF9jb25zdF9vbl92YWx1ZV90eXBlICAgICAgICAgICAgeyB0eXBlZGVmIGNvbnN0IFQgdHlwZTsgIH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgYWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8VCY+ICAgICAgICB7IHR5cGVkZWYgVCBjb25zdCYgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBhZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxUKj4gICAgICAgIHsgdHlwZWRlZiBUIGNvbnN0KiB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGFkZF9jb25zdF9vbl92YWx1ZV90eXBlPFQqIGNvbnN0PiAgeyB0eXBlZGVmIFQgY29uc3QqIGNvbnN0IHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgYWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8VCBjb25zdCogY29uc3Q+ICB7IHR5cGVkZWYgVCBjb25zdCogY29uc3QgdHlwZTsgfTsKKworLyoqIFxpbnRlcm5hbCBBbGxvd3MgdG8gZW5hYmxlL2Rpc2FibGUgYW4gb3ZlcmxvYWQKKyAgKiBhY2NvcmRpbmcgdG8gYSBjb21waWxlIHRpbWUgY29uZGl0aW9uLgorICAqLwordGVtcGxhdGU8Ym9vbCBDb25kaXRpb24sIHR5cGVuYW1lIFQ+IHN0cnVjdCBlbmFibGVfaWY7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBlbmFibGVfaWY8dHJ1ZSxUPgoreyB0eXBlZGVmIFQgdHlwZTsgfTsKKworCisKKy8qKiBcaW50ZXJuYWwKKyAgKiBBIGJhc2UgY2xhc3MgZG8gZGlzYWJsZSBkZWZhdWx0IGNvcHkgY3RvciBhbmQgY29weSBhc3NpZ25lbWVudCBvcGVyYXRvci4KKyAgKi8KK2NsYXNzIG5vbmNvcHlhYmxlCit7CisgIG5vbmNvcHlhYmxlKGNvbnN0IG5vbmNvcHlhYmxlJik7CisgIGNvbnN0IG5vbmNvcHlhYmxlJiBvcGVyYXRvcj0oY29uc3Qgbm9uY29weWFibGUmKTsKK3Byb3RlY3RlZDoKKyAgbm9uY29weWFibGUoKSB7fQorICB+bm9uY29weWFibGUoKSB7fQorfTsKKworCisvKiogXGludGVybmFsCisgICogQ29udmVuaWVudCBzdHJ1Y3QgdG8gZ2V0IHRoZSByZXN1bHQgdHlwZSBvZiBhIHVuYXJ5IG9yIGJpbmFyeSBmdW5jdG9yLgorICAqCisgICogSXQgc3VwcG9ydHMgYm90aCB0aGUgY3VycmVudCBTVEwgbWVjaGFuaXNtICh1c2luZyB0aGUgcmVzdWx0X3R5cGUgbWVtYmVyKSBhcyB3ZWxsIGFzCisgICogdXBjb21pbmcgbmV4dCBTVEwgZ2VuZXJhdGlvbiAodXNpbmcgYSB0ZW1wbGF0ZWQgcmVzdWx0IG1lbWJlcikuCisgICogSWYgbm9uZSBvZiB0aGVzZSBtZW1iZXJzIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudCBpcyByZXR1cm5lZC4gRklYTUUsIHRoYXQgYmVoYXZpb3IgaXMgYSBwcmV0dHkgYmFkIGhhY2suCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcmVzdWx0X29mIHt9OworCitzdHJ1Y3QgaGFzX25vbmUge2ludCBhWzFdO307CitzdHJ1Y3QgaGFzX3N0ZF9yZXN1bHRfdHlwZSB7aW50IGFbMl07fTsKK3N0cnVjdCBoYXNfdHIxX3Jlc3VsdCB7aW50IGFbM107fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQXJnVHlwZSwgaW50IFNpemVPZj1zaXplb2YoaGFzX25vbmUpPgorc3RydWN0IHVuYXJ5X3Jlc3VsdF9vZl9zZWxlY3Qge3R5cGVkZWYgQXJnVHlwZSB0eXBlO307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEFyZ1R5cGU+CitzdHJ1Y3QgdW5hcnlfcmVzdWx0X29mX3NlbGVjdDxGdW5jLCBBcmdUeXBlLCBzaXplb2YoaGFzX3N0ZF9yZXN1bHRfdHlwZSk+IHt0eXBlZGVmIHR5cGVuYW1lIEZ1bmM6OnJlc3VsdF90eXBlIHR5cGU7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQXJnVHlwZT4KK3N0cnVjdCB1bmFyeV9yZXN1bHRfb2Zfc2VsZWN0PEZ1bmMsIEFyZ1R5cGUsIHNpemVvZihoYXNfdHIxX3Jlc3VsdCk+IHt0eXBlZGVmIHR5cGVuYW1lIEZ1bmM6OnRlbXBsYXRlIHJlc3VsdDxGdW5jKEFyZ1R5cGUpPjo6dHlwZSB0eXBlO307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEFyZ1R5cGU+CitzdHJ1Y3QgcmVzdWx0X29mPEZ1bmMoQXJnVHlwZSk+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBoYXNfc3RkX3Jlc3VsdF90eXBlIHRlc3RGdW5jdG9yKFQgY29uc3QgKiwgdHlwZW5hbWUgVDo6cmVzdWx0X3R5cGUgY29uc3QgKiA9IDApOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIGhhc190cjFfcmVzdWx0ICAgICAgdGVzdEZ1bmN0b3IoVCBjb25zdCAqLCB0eXBlbmFtZSBUOjp0ZW1wbGF0ZSByZXN1bHQ8VChBcmdUeXBlKT46OnR5cGUgY29uc3QgKiA9IDApOworICAgIHN0YXRpYyBoYXNfbm9uZSAgICAgICAgICAgIHRlc3RGdW5jdG9yKC4uLik7CisKKyAgICAvLyBub3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpbmRpcmVjdGlvbiBpcyBuZWVkZWQgZm9yIGdjYy0zLjMKKyAgICBlbnVtIHtGdW5jdG9yVHlwZSA9IHNpemVvZih0ZXN0RnVuY3RvcihzdGF0aWNfY2FzdDxGdW5jKj4oMCkpKX07CisgICAgdHlwZWRlZiB0eXBlbmFtZSB1bmFyeV9yZXN1bHRfb2Zfc2VsZWN0PEZ1bmMsIEFyZ1R5cGUsIEZ1bmN0b3JUeXBlPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQXJnVHlwZTAsIHR5cGVuYW1lIEFyZ1R5cGUxLCBpbnQgU2l6ZU9mPXNpemVvZihoYXNfbm9uZSk+CitzdHJ1Y3QgYmluYXJ5X3Jlc3VsdF9vZl9zZWxlY3Qge3R5cGVkZWYgQXJnVHlwZTAgdHlwZTt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBBcmdUeXBlMCwgdHlwZW5hbWUgQXJnVHlwZTE+CitzdHJ1Y3QgYmluYXJ5X3Jlc3VsdF9vZl9zZWxlY3Q8RnVuYywgQXJnVHlwZTAsIEFyZ1R5cGUxLCBzaXplb2YoaGFzX3N0ZF9yZXN1bHRfdHlwZSk+Cit7dHlwZWRlZiB0eXBlbmFtZSBGdW5jOjpyZXN1bHRfdHlwZSB0eXBlO307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEFyZ1R5cGUwLCB0eXBlbmFtZSBBcmdUeXBlMT4KK3N0cnVjdCBiaW5hcnlfcmVzdWx0X29mX3NlbGVjdDxGdW5jLCBBcmdUeXBlMCwgQXJnVHlwZTEsIHNpemVvZihoYXNfdHIxX3Jlc3VsdCk+Cit7dHlwZWRlZiB0eXBlbmFtZSBGdW5jOjp0ZW1wbGF0ZSByZXN1bHQ8RnVuYyhBcmdUeXBlMCxBcmdUeXBlMSk+Ojp0eXBlIHR5cGU7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQXJnVHlwZTAsIHR5cGVuYW1lIEFyZ1R5cGUxPgorc3RydWN0IHJlc3VsdF9vZjxGdW5jKEFyZ1R5cGUwLEFyZ1R5cGUxKT4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIGhhc19zdGRfcmVzdWx0X3R5cGUgdGVzdEZ1bmN0b3IoVCBjb25zdCAqLCB0eXBlbmFtZSBUOjpyZXN1bHRfdHlwZSBjb25zdCAqID0gMCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgaGFzX3RyMV9yZXN1bHQgICAgICB0ZXN0RnVuY3RvcihUIGNvbnN0ICosIHR5cGVuYW1lIFQ6OnRlbXBsYXRlIHJlc3VsdDxUKEFyZ1R5cGUwLEFyZ1R5cGUxKT46OnR5cGUgY29uc3QgKiA9IDApOworICAgIHN0YXRpYyBoYXNfbm9uZSAgICAgICAgICAgIHRlc3RGdW5jdG9yKC4uLik7CisKKyAgICAvLyBub3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpbmRpcmVjdGlvbiBpcyBuZWVkZWQgZm9yIGdjYy0zLjMKKyAgICBlbnVtIHtGdW5jdG9yVHlwZSA9IHNpemVvZih0ZXN0RnVuY3RvcihzdGF0aWNfY2FzdDxGdW5jKj4oMCkpKX07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiaW5hcnlfcmVzdWx0X29mX3NlbGVjdDxGdW5jLCBBcmdUeXBlMCwgQXJnVHlwZTEsIEZ1bmN0b3JUeXBlPjo6dHlwZSB0eXBlOworfTsKKworLyoqIFxpbnRlcm5hbCBJbiBzaG9ydCwgaXQgY29tcHV0ZXMgaW50KHNxcnQoXGEgWSkpIHdpdGggXGEgWSBhbiBpbnRlZ2VyLgorICAqIFVzYWdlIGV4YW1wbGU6IFxjb2RlIG1ldGFfc3FydDwxMDIzPjo6cmV0IFxlbmRjb2RlCisgICovCit0ZW1wbGF0ZTxpbnQgWSwKKyAgICAgICAgIGludCBJbmZYID0gMCwKKyAgICAgICAgIGludCBTdXBYID0gKChZPT0xKSA/IDEgOiBZLzIpLAorICAgICAgICAgYm9vbCBEb25lID0gKChTdXBYLUluZlgpPD0xID8gdHJ1ZSA6ICgoU3VwWCpTdXBYIDw9IFkpICYmICgoU3VwWCsxKSooU3VwWCsxKSA+IFkpKSkgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgPzogaW5zdGVhZCBvZiB8fCBqdXN0IHRvIHNodXQgdXAgYSBzdHVwaWQgZ2NjIDQuMyB3YXJuaW5nCitjbGFzcyBtZXRhX3NxcnQKK3sKKyAgICBlbnVtIHsKKyAgICAgIE1pZFggPSAoSW5mWCtTdXBYKS8yLAorICAgICAgVGFrZUluZiA9IE1pZFgqTWlkWCA+IFkgPyAxIDogMCwKKyAgICAgIE5ld0luZiA9IGludChUYWtlSW5mKSA/IEluZlggOiBpbnQoTWlkWCksCisgICAgICBOZXdTdXAgPSBpbnQoVGFrZUluZikgPyBpbnQoTWlkWCkgOiBTdXBYCisgICAgfTsKKyAgcHVibGljOgorICAgIGVudW0geyByZXQgPSBtZXRhX3NxcnQ8WSxOZXdJbmYsTmV3U3VwPjo6cmV0IH07Cit9OworCit0ZW1wbGF0ZTxpbnQgWSwgaW50IEluZlgsIGludCBTdXBYPgorY2xhc3MgbWV0YV9zcXJ0PFksIEluZlgsIFN1cFgsIHRydWU+IHsgcHVibGljOiAgZW51bSB7IHJldCA9IChTdXBYKlN1cFggPD0gWSkgPyBTdXBYIDogSW5mWCB9OyB9OworCisvKiogXGludGVybmFsIGRldGVybWluZXMgd2hldGhlciB0aGUgcHJvZHVjdCBvZiB0d28gbnVtZXJpYyB0eXBlcyBpcyBhbGxvd2VkIGFuZCB3aGF0IHRoZSByZXR1cm4gdHlwZSBpcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gc3RydWN0IHNjYWxhcl9wcm9kdWN0X3RyYWl0czsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHNjYWxhcl9wcm9kdWN0X3RyYWl0czxULFQ+Cit7CisgIC8vZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8VD46Ok11bENvc3QgfTsKKyAgdHlwZWRlZiBUIFJldHVyblR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPFQsc3RkOjpjb21wbGV4PFQ+ID4KK3sKKyAgLy9lbnVtIHsgQ29zdCA9IDIqTnVtVHJhaXRzPFQ+OjpNdWxDb3N0IH07CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFQ+IFJldHVyblR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPHN0ZDo6Y29tcGxleDxUPiwgVD4KK3sKKyAgLy9lbnVtIHsgQ29zdCA9IDIqTnVtVHJhaXRzPFQ+OjpNdWxDb3N0ICB9OworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxUPiBSZXR1cm5UeXBlOworfTsKKworLy8gRklYTUUgcXVpY2sgd29ya2Fyb3VuZCBhcm91bmQgY3VycmVudCBsaW1pdGF0aW9uIG9mIHJlc3VsdF9vZgorLy8gdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBBcmdUeXBlMCwgdHlwZW5hbWUgQXJnVHlwZTE+CisvLyBzdHJ1Y3QgcmVzdWx0X29mPHNjYWxhcl9wcm9kdWN0X29wPFNjYWxhcj4oQXJnVHlwZTAsQXJnVHlwZTEpPiB7CisvLyB0eXBlZGVmIHR5cGVuYW1lIHNjYWxhcl9wcm9kdWN0X3RyYWl0czx0eXBlbmFtZSByZW1vdmVfYWxsPEFyZ1R5cGUwPjo6dHlwZSwgdHlwZW5hbWUgcmVtb3ZlX2FsbDxBcmdUeXBlMT46OnR5cGU+OjpSZXR1cm5UeXBlIHR5cGU7CisvLyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfZGlhZ29uYWwKK3sgZW51bSB7IHJldCA9IGZhbHNlIH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc19kaWFnb25hbDxEaWFnb25hbEJhc2U8VD4gPgoreyBlbnVtIHsgcmV0ID0gdHJ1ZSB9OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfZGlhZ29uYWw8RGlhZ29uYWxXcmFwcGVyPFQ+ID4KK3sgZW51bSB7IHJldCA9IHRydWUgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFM+IHN0cnVjdCBpc19kaWFnb25hbDxEaWFnb25hbE1hdHJpeDxULFM+ID4KK3sgZW51bSB7IHJldCA9IHRydWUgfTsgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUVUQV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvQ29yZS91dGlsL05vbk1QTDIuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTm9uTVBMMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTUzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvQ29yZS91dGlsL05vbk1QTDIuaApAQCAtMCwwICsxLDYgQEAKKy8vIEZvcmNlIGVycm9yIGlmIGluY2x1ZGluZyBub24gTVBMMiBsaWNlbnNlIGNvZGUgcmVnYXJkbGVzcworLy8gRUlHRU5fTVBMMl9PTkxZIGZsYWcuCisKKy8vI2lmZGVmIEVJR0VOX01QTDJfT05MWQorI2Vycm9yIEluY2x1ZGluZyBub24tTVBMMiBjb2RlIGluIEVJR0VOX01QTDJfT05MWSBtb2RlCisvLyNlbmRpZgpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmggYi9FaWdlbi9zcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGRmYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmZGVmIEVJR0VOX1dBUk5JTkdTX0RJU0FCTEVECisjdW5kZWYgRUlHRU5fV0FSTklOR1NfRElTQUJMRUQKKworI2lmbmRlZiBFSUdFTl9QRVJNQU5FTlRMWV9ESVNBQkxFX1NUVVBJRF9XQVJOSU5HUworICAjaWZkZWYgX01TQ19WRVIKKyAgICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisgICNlbGlmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorICAgICNwcmFnbWEgd2FybmluZyBwb3AKKyAgI2VsaWYgZGVmaW5lZCBfX2NsYW5nX18KKyAgICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisgICNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvLyBFSUdFTl9XQVJOSU5HU19ESVNBQkxFRApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9TdGF0aWNBc3NlcnQuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvU3RhdGljQXNzZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2YTc1YgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvU3RhdGljQXNzZXJ0LmgKQEAgLTAsMCArMSwyMDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TVEFUSUNfQVNTRVJUX0gKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9ICisKKy8qIFNvbWUgbm90ZXMgb24gRWlnZW4ncyBzdGF0aWMgYXNzZXJ0aW9uIG1lY2hhbmlzbToKKyAqCisgKiAgLSBpbiBFSUdFTl9TVEFUSUNfQVNTRVJUKENPTkRJVElPTixNU0cpIHRoZSBwYXJhbWV0ZXIgQ09ORElUSU9OIG11c3QgYmUgYSBjb21waWxlIHRpbWUgYm9vbGVhbgorICogICAgZXhwcmVzc2lvbiwgYW5kIE1TRyBhbiBlbnVtIGxpc3RlZCBpbiBzdHJ1Y3QgaW50ZXJuYWw6OnN0YXRpY19hc3NlcnRpb248dHJ1ZT4KKyAqCisgKiAgLSBkZWZpbmUgRUlHRU5fTk9fU1RBVElDX0FTU0VSVCB0byBkaXNhYmxlIHRoZW0gKGFuZCBzYXZlIGNvbXBpbGF0aW9uIHRpbWUpCisgKiAgICBpbiB0aGF0IGNhc2UsIHRoZSBzdGF0aWMgYXNzZXJ0aW9uIGlzIGNvbnZlcnRlZCB0byB0aGUgZm9sbG93aW5nIHJ1bnRpbWUgYXNzZXJ0OgorICogICAgICBlaWdlbl9hc3NlcnQoQ09ORElUSU9OICYmICJNU0ciKQorICoKKyAqICAtIGN1cnJlbnRseSBFSUdFTl9TVEFUSUNfQVNTRVJUIGNhbiBvbmx5IGJlIHVzZWQgaW4gZnVuY3Rpb24gc2NvcGUKKyAqCisgKi8KKworI2lmbmRlZiBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisKKyAgI2lmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pIHx8IChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTYwMCkpCisKKyAgICAvLyBpZiBuYXRpdmUgc3RhdGljX2Fzc2VydCBpcyBlbmFibGVkLCBsZXQncyB1c2UgaXQKKyAgICAjZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlQoWCxNU0cpIHN0YXRpY19hc3NlcnQoWCwjTVNHKTsKKworICAjZWxzZSAvLyBub3QgQ1hYMFgKKworICAgIG5hbWVzcGFjZSBFaWdlbiB7CisKKyAgICBuYW1lc3BhY2UgaW50ZXJuYWwgeworCisgICAgdGVtcGxhdGU8Ym9vbCBjb25kaXRpb24+CisgICAgc3RydWN0IHN0YXRpY19hc3NlcnRpb24ge307CisKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHN0YXRpY19hc3NlcnRpb248dHJ1ZT4KKyAgICB7CisgICAgICBlbnVtIHsKKyAgICAgICAgWU9VX1RSSUVEX0NBTExJTkdfQV9WRUNUT1JfTUVUSE9EX09OX0FfTUFUUklYLAorICAgICAgICBZT1VfTUlYRURfVkVDVE9SU19PRl9ESUZGRVJFTlRfU0laRVMsCisgICAgICAgIFlPVV9NSVhFRF9NQVRSSUNFU19PRl9ESUZGRVJFTlRfU0laRVMsCisgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX1ZFQ1RPUlNfT0ZfQV9TUEVDSUZJQ19TSVpFLAorICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9NQVRSSUNFU19PRl9BX1NQRUNJRklDX1NJWkUsCisgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX09CSkVDVFNfT0ZfQV9TUEVDSUZJQ19TSVpFLAorICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UsCisgICAgICAgIEVJR0VOX0lOVEVSTkFMX0VSUk9SX1BMRUFTRV9GSUxFX0FfQlVHX1JFUE9SVCwKKyAgICAgICAgRUlHRU5fSU5URVJOQUxfQ09NUElMQVRJT05fRVJST1JfT1JfWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFLAorICAgICAgICBZT1VfQ0FMTEVEX0FfRklYRURfU0laRV9NRVRIT0RfT05fQV9EWU5BTUlDX1NJWkVfTUFUUklYX09SX1ZFQ1RPUiwKKyAgICAgICAgWU9VX0NBTExFRF9BX0RZTkFNSUNfU0laRV9NRVRIT0RfT05fQV9GSVhFRF9TSVpFX01BVFJJWF9PUl9WRUNUT1IsCisgICAgICAgIFVOQUxJR05FRF9MT0FEX0FORF9TVE9SRV9PUEVSQVRJT05TX1VOSU1QTEVNRU5URURfT05fQUxUSVZFQywKKyAgICAgICAgVEhJU19GVU5DVElPTl9JU19OT1RfRk9SX0lOVEVHRVJfTlVNRVJJQ19UWVBFUywKKyAgICAgICAgRkxPQVRJTkdfUE9JTlRfQVJHVU1FTlRfUEFTU0VEX19JTlRFR0VSX1dBU19FWFBFQ1RFRCwKKyAgICAgICAgTlVNRVJJQ19UWVBFX01VU1RfQkVfUkVBTCwKKyAgICAgICAgQ09FRkZJQ0lFTlRfV1JJVEVfQUNDRVNTX1RPX1NFTEZBREpPSU5UX05PVF9TVVBQT1JURUQsCisgICAgICAgIFdSSVRJTkdfVE9fVFJJQU5HVUxBUl9QQVJUX1dJVEhfVU5JVF9ESUFHT05BTF9JU19OT1RfU1VQUE9SVEVELAorICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9GSVhFRF9TSVpFLAorICAgICAgICBJTlZBTElEX01BVFJJWF9QUk9EVUNULAorICAgICAgICBJTlZBTElEX1ZFQ1RPUl9WRUNUT1JfUFJPRFVDVF9fSUZfWU9VX1dBTlRFRF9BX0RPVF9PUl9DT0VGRl9XSVNFX1BST0RVQ1RfWU9VX01VU1RfVVNFX1RIRV9FWFBMSUNJVF9GVU5DVElPTlMsCisgICAgICAgIElOVkFMSURfTUFUUklYX1BST0RVQ1RfX0lGX1lPVV9XQU5URURfQV9DT0VGRl9XSVNFX1BST0RVQ1RfWU9VX01VU1RfVVNFX1RIRV9FWFBMSUNJVF9GVU5DVElPTiwKKyAgICAgICAgWU9VX01JWEVEX0RJRkZFUkVOVF9OVU1FUklDX1RZUEVTX19ZT1VfTkVFRF9UT19VU0VfVEhFX0NBU1RfTUVUSE9EX09GX01BVFJJWEJBU0VfVE9fQ0FTVF9OVU1FUklDX1RZUEVTX0VYUExJQ0lUTFksCisgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0NPTFVNTl9NQUpPUl9NQVRSSUNFUywKKyAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfUk9XX01BSk9SX01BVFJJQ0VTLAorICAgICAgICBJTlZBTElEX01BVFJJWF9URU1QTEFURV9QQVJBTUVURVJTLAorICAgICAgICBJTlZBTElEX01BVFJJWEJBU0VfVEVNUExBVEVfUEFSQU1FVEVSUywKKyAgICAgICAgQk9USF9NQVRSSUNFU19NVVNUX0hBVkVfVEhFX1NBTUVfU1RPUkFHRV9PUkRFUiwKKyAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfRElBR09OQUxfTUFUUklYLAorICAgICAgICBUSEVfTUFUUklYX09SX0VYUFJFU1NJT05fVEhBVF9ZT1VfUEFTU0VEX0RPRVNfTk9UX0hBVkVfVEhFX0VYUEVDVEVEX1RZUEUsCisgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0VYUFJFU1NJT05TX1dJVEhfRElSRUNUX01FTU9SWV9BQ0NFU1NfU1VDSF9BU19NQVBfT1JfUExBSU5fTUFUUklDRVMsCisgICAgICAgIFlPVV9BTFJFQURZX1NQRUNJRklFRF9USElTX1NUUklERSwKKyAgICAgICAgSU5WQUxJRF9TVE9SQUdFX09SREVSX0ZPUl9USElTX1ZFQ1RPUl9FWFBSRVNTSU9OLAorICAgICAgICBUSEVfQlJBQ0tFVF9PUEVSQVRPUl9JU19PTkxZX0ZPUl9WRUNUT1JTX19VU0VfVEhFX1BBUkVOVEhFU0lTX09QRVJBVE9SX0lOU1RFQUQsCisgICAgICAgIFBBQ0tFVF9BQ0NFU1NfUkVRVUlSRVNfVE9fSEFWRV9JTk5FUl9TVFJJREVfRklYRURfVE9fMSwKKyAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfU1BFQ0lGSUNfVFJBTlNGT1JNQVRJT05TLAorICAgICAgICBZT1VfQ0FOTk9UX01JWF9BUlJBWVNfQU5EX01BVFJJQ0VTLAorICAgICAgICBZT1VfUEVSRk9STUVEX0FOX0lOVkFMSURfVFJBTlNGT1JNQVRJT05fQ09OVkVSU0lPTiwKKyAgICAgICAgVEhJU19FWFBSRVNTSU9OX0lTX05PVF9BX0xWQUxVRV9fSVRfSVNfUkVBRF9PTkxZLAorICAgICAgICBZT1VfQVJFX1RSWUlOR19UT19VU0VfQU5fSU5ERVhfQkFTRURfQUNDRVNTT1JfT05fQU5fRVhQUkVTU0lPTl9USEFUX0RPRVNfTk9UX1NVUFBPUlRfVEhBVCwKKyAgICAgICAgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfMXgxX0VYUFJFU1NJT05TLAorICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9FWFBSRVNTSU9OU19PRl9CT09MLAorICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9BUlJBWVNfTk9UX01BVFJJQ0VTLAorICAgICAgICBZT1VfUEFTU0VEX0FfUk9XX1ZFQ1RPUl9CVVRfQV9DT0xVTU5fVkVDVE9SX1dBU19FWFBFQ1RFRCwKKyAgICAgICAgWU9VX1BBU1NFRF9BX0NPTFVNTl9WRUNUT1JfQlVUX0FfUk9XX1ZFQ1RPUl9XQVNfRVhQRUNURUQsCisgICAgICAgIFRIRV9JTkRFWF9UWVBFX01VU1RfQkVfQV9TSUdORURfVFlQRSwKKyAgICAgICAgVEhFX1NUT1JBR0VfT1JERVJfT0ZfQk9USF9TSURFU19NVVNUX01BVENICisgICAgICB9OworICAgIH07CisKKyAgICB9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworICAgIH0gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisgICAgLy8gU3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIE1TVkMgdG8gYXZvaWQgImNvbmRpdGlvbmFsCisgICAgLy8gZXhwcmVzc2lvbiBpcyBjb25zdGFudCIgd2FybmluZ3MuICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QKKyAgICAvLyBhcHBlYXIgdG8gd29yayB1bmRlciBHQ0MsIGhlbmNlIHRoZSBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMuCisgICAgI2lmZGVmIF9NU0NfVkVSCisKKyAgICAgICNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVChDT05ESVRJT04sTVNHKSBcCisgICAgICAgIHtFaWdlbjo6aW50ZXJuYWw6OnN0YXRpY19hc3NlcnRpb248Ym9vbChDT05ESVRJT04pPjo6TVNHO30KKworICAgICNlbHNlCisKKyAgICAgICNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVChDT05ESVRJT04sTVNHKSBcCisgICAgICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OnN0YXRpY19hc3NlcnRpb248Ym9vbChDT05ESVRJT04pPjo6TVNHKSB7fQorCisgICAgI2VuZGlmCisKKyAgI2VuZGlmIC8vIG5vdCBDWFgwWAorCisjZWxzZSAvLyBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisKKyAgI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUKENPTkRJVElPTixNU0cpIGVpZ2VuX2Fzc2VydCgoQ09ORElUSU9OKSAmJiAjTVNHKTsKKworI2VuZGlmIC8vIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQKKworCisvLyBzdGF0aWMgYXNzZXJ0aW9uIGZhaWxpbmcgaWYgdGhlIHR5cGUgXGEgVFlQRSBpcyBub3QgYSB2ZWN0b3IgdHlwZQorI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKFRZUEUpIFwKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChUWVBFOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfVFJJRURfQ0FMTElOR19BX1ZFQ1RPUl9NRVRIT0RfT05fQV9NQVRSSVgpCisKKy8vIHN0YXRpYyBhc3NlcnRpb24gZmFpbGluZyBpZiB0aGUgdHlwZSBcYSBUWVBFIGlzIG5vdCBmaXhlZC1zaXplCisjZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlRfRklYRURfU0laRShUWVBFKSBcCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoVFlQRTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUVpZ2VuOjpEeW5hbWljLCBcCisgICAgICAgICAgICAgICAgICAgICAgWU9VX0NBTExFRF9BX0ZJWEVEX1NJWkVfTUVUSE9EX09OX0FfRFlOQU1JQ19TSVpFX01BVFJJWF9PUl9WRUNUT1IpCisKKy8vIHN0YXRpYyBhc3NlcnRpb24gZmFpbGluZyBpZiB0aGUgdHlwZSBcYSBUWVBFIGlzIG5vdCBkeW5hbWljLXNpemUKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9EWU5BTUlDX1NJWkUoVFlQRSkgXAorICBFSUdFTl9TVEFUSUNfQVNTRVJUKFRZUEU6OlNpemVBdENvbXBpbGVUaW1lPT1FaWdlbjo6RHluYW1pYywgXAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9DQUxMRURfQV9EWU5BTUlDX1NJWkVfTUVUSE9EX09OX0FfRklYRURfU0laRV9NQVRSSVhfT1JfVkVDVE9SKQorCisvLyBzdGF0aWMgYXNzZXJ0aW9uIGZhaWxpbmcgaWYgdGhlIHR5cGUgXGEgVFlQRSBpcyBub3QgYSB2ZWN0b3IgdHlwZSBvZiB0aGUgZ2l2ZW4gc2l6ZQorI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKFRZUEUsIFNJWkUpIFwKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChUWVBFOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgJiYgVFlQRTo6U2l6ZUF0Q29tcGlsZVRpbWU9PVNJWkUsIFwKKyAgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9WRUNUT1JTX09GX0FfU1BFQ0lGSUNfU0laRSkKKworLy8gc3RhdGljIGFzc2VydGlvbiBmYWlsaW5nIGlmIHRoZSB0eXBlIFxhIFRZUEUgaXMgbm90IGEgdmVjdG9yIHR5cGUgb2YgdGhlIGdpdmVuIHNpemUKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9NQVRSSVhfU1BFQ0lGSUNfU0laRShUWVBFLCBST1dTLCBDT0xTKSBcCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoVFlQRTo6Um93c0F0Q29tcGlsZVRpbWU9PVJPV1MgJiYgVFlQRTo6Q29sc0F0Q29tcGlsZVRpbWU9PUNPTFMsIFwKKyAgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9NQVRSSUNFU19PRl9BX1NQRUNJRklDX1NJWkUpCisKKy8vIHN0YXRpYyBhc3NlcnRpb24gZmFpbGluZyBpZiB0aGUgdHdvIHZlY3RvciBleHByZXNzaW9uIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZSAoc2FtZSBmaXhlZC1zaXplIG9yIGR5bmFtaWMgc2l6ZSkKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1ZFQ1RPUl9TSVpFKFRZUEUwLFRZUEUxKSBcCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoIFwKKyAgICAgIChpbnQoVFlQRTA6OlNpemVBdENvbXBpbGVUaW1lKT09RWlnZW46OkR5bmFtaWMgXAorICAgIHx8IGludChUWVBFMTo6U2l6ZUF0Q29tcGlsZVRpbWUpPT1FaWdlbjo6RHluYW1pYyBcCisgICAgfHwgaW50KFRZUEUwOjpTaXplQXRDb21waWxlVGltZSk9PWludChUWVBFMTo6U2l6ZUF0Q29tcGlsZVRpbWUpKSxcCisgICAgWU9VX01JWEVEX1ZFQ1RPUlNfT0ZfRElGRkVSRU5UX1NJWkVTKQorCisjZGVmaW5lIEVJR0VOX1BSRURJQ0FURV9TQU1FX01BVFJJWF9TSVpFKFRZUEUwLFRZUEUxKSBcCisgICAgICggXAorICAgICAgICAoaW50KFRZUEUwOjpTaXplQXRDb21waWxlVGltZSk9PTAgJiYgaW50KFRZUEUxOjpTaXplQXRDb21waWxlVGltZSk9PTApIFwKKyAgICB8fCAoXAorICAgICAgICAgIChpbnQoVFlQRTA6OlJvd3NBdENvbXBpbGVUaW1lKT09RWlnZW46OkR5bmFtaWMgXAorICAgICAgICB8fCBpbnQoVFlQRTE6OlJvd3NBdENvbXBpbGVUaW1lKT09RWlnZW46OkR5bmFtaWMgXAorICAgICAgICB8fCBpbnQoVFlQRTA6OlJvd3NBdENvbXBpbGVUaW1lKT09aW50KFRZUEUxOjpSb3dzQXRDb21waWxlVGltZSkpIFwKKyAgICAgICYmICAoaW50KFRZUEUwOjpDb2xzQXRDb21waWxlVGltZSk9PUVpZ2VuOjpEeW5hbWljIFwKKyAgICAgICAgfHwgaW50KFRZUEUxOjpDb2xzQXRDb21waWxlVGltZSk9PUVpZ2VuOjpEeW5hbWljIFwKKyAgICAgICAgfHwgaW50KFRZUEUwOjpDb2xzQXRDb21waWxlVGltZSk9PWludChUWVBFMTo6Q29sc0F0Q29tcGlsZVRpbWUpKVwKKyAgICAgICApIFwKKyAgICAgKQorCisjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKyAgI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX05PTl9JTlRFR0VSKFRZUEUpIFwKKyAgICBlaWdlbl9hc3NlcnQoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpOworI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX05PTl9JTlRFR0VSKFRZUEUpIFwKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKCFOdW1UcmFpdHM8VFlQRT46OklzSW50ZWdlciwgVEhJU19GVU5DVElPTl9JU19OT1RfRk9SX0lOVEVHRVJfTlVNRVJJQ19UWVBFUykKKyNlbmRpZgorCisKKy8vIHN0YXRpYyBhc3NlcnRpb24gZmFpbGluZyBpZiBpdCBpcyBndWFyYW50ZWVkIGF0IGNvbXBpbGUtdGltZSB0aGF0IHRoZSB0d28gbWF0cml4IGV4cHJlc3Npb24gdHlwZXMgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFKFRZUEUwLFRZUEUxKSBcCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoIFwKKyAgICAgRUlHRU5fUFJFRElDQVRFX1NBTUVfTUFUUklYX1NJWkUoVFlQRTAsVFlQRTEpLFwKKyAgICBZT1VfTUlYRURfTUFUUklDRVNfT0ZfRElGRkVSRU5UX1NJWkVTKQorCisjZGVmaW5lIEVJR0VOX1NUQVRJQ19BU1NFUlRfU0laRV8xeDEoVFlQRSkgXAorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoVFlQRTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gMSB8fCBUWVBFOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChUWVBFOjpDb2xzQXRDb21waWxlVGltZSA9PSAxIHx8IFRZUEU6OkNvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SXzF4MV9FWFBSRVNTSU9OUykKKworI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX0xWQUxVRShEZXJpdmVkKSBcCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKGludGVybmFsOjppc19sdmFsdWU8RGVyaXZlZD46OnZhbHVlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRISVNfRVhQUkVTU0lPTl9JU19OT1RfQV9MVkFMVUVfX0lUX0lTX1JFQURfT05MWSkKKworI2RlZmluZSBFSUdFTl9TVEFUSUNfQVNTRVJUX0FSUkFZWFBSKERlcml2ZWQpIFwKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlhwcktpbmQsIEFycmF5WHByPjo6dmFsdWUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0FSUkFZU19OT1RfTUFUUklDRVMpCisKKyNkZWZpbmUgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1hQUl9LSU5EKERlcml2ZWQxLCBEZXJpdmVkMikgXAorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkMT46OlhwcktpbmQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZDI+OjpYcHJLaW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dmFsdWUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFlPVV9DQU5OT1RfTUlYX0FSUkFZU19BTkRfTUFUUklDRVMpCisKKworI2VuZGlmIC8vIEVJR0VOX1NUQVRJQ19BU1NFUlRfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0NvcmUvdXRpbC9YcHJIZWxwZXIuaCBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvWHBySGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2NWM3YwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9Db3JlL3V0aWwvWHBySGVscGVyLmgKQEAgLTAsMCArMSw0NDcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1hQUkhFTFBFUl9ICisjZGVmaW5lIEVJR0VOX1hQUkhFTFBFUl9ICisKKy8vIGp1c3QgYSB3b3JrYXJvdW5kIGJlY2F1c2UgR0NDIHNlZW1zIHRvIG5vdCByZWFsbHkgbGlrZSBlbXB0eSBzdHJ1Y3RzCisvLyBGSVhNRTogZ2NjIDQuMyBnZW5lcmF0ZXMgYmFkIGNvZGUgd2hlbiBzdHJpY3QtYWxpYXNpbmcgaXMgZW5hYmxlZAorLy8gc28gY3VycmVudGx5IHdlIHNpbXBseSBkaXNhYmxlIHRoaXMgb3B0aW1pemF0aW9uIGZvciBnY2MgNC4zCisjaWYgKGRlZmluZWQgX19HTlVHX18pICYmICEoKF9fR05VQ19fPT00KSAmJiAoX19HTlVDX01JTk9SX189PTMpKQorICAjZGVmaW5lIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKFgpIFwKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFgoKSB7fSBcCisgICAgRUlHRU5fU1RST05HX0lOTElORSBYKGNvbnN0IFgmICkge30KKyNlbHNlCisgICNkZWZpbmUgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1IoWCkKKyNlbmRpZgorCituYW1lc3BhY2UgRWlnZW4geworCit0eXBlZGVmIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBEZW5zZUluZGV4OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvL2NsYXNzZXMgaW5oZXJpdGluZyBub19hc3NpZ25tZW50X29wZXJhdG9yIGRvbid0IGdlbmVyYXRlIGEgZGVmYXVsdCBvcGVyYXRvcj0uCitjbGFzcyBub19hc3NpZ25tZW50X29wZXJhdG9yCit7CisgIHByaXZhdGU6CisgICAgbm9fYXNzaWdubWVudF9vcGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IG5vX2Fzc2lnbm1lbnRfb3BlcmF0b3ImKTsKK307CisKKy8qKiBcaW50ZXJuYWwgcmV0dXJuIHRoZSBpbmRleCB0eXBlIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyIG9mIGJpdHMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEkxLCB0eXBlbmFtZSBJMj4KK3N0cnVjdCBwcm9tb3RlX2luZGV4X3R5cGUKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwoc2l6ZW9mKEkxKTxzaXplb2YoSTIpKSwgSTIsIEkxPjo6dHlwZSB0eXBlOworfTsKKworLyoqIFxpbnRlcm5hbCBJZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFZhbHVlIGlzIER5bmFtaWMsIHRoaXMgY2xhc3MgaXMganVzdCBhIHdyYXBwZXIgYXJvdW5kIGEgVCB2YXJpYWJsZSB0aGF0CisgICogY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIHZhbHVlKCkgYW5kIHNldFZhbHVlKCkuCisgICogT3RoZXJ3aXNlLCB0aGlzIGNsYXNzIGlzIGFuIGVtcHR5IHN0cnVjdHVyZSBhbmQgdmFsdWUoKSBqdXN0IHJldHVybnMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBWYWx1ZS4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBWYWx1ZT4gY2xhc3MgdmFyaWFibGVfaWZfZHluYW1pYworeworICBwdWJsaWM6CisgICAgRUlHRU5fRU1QVFlfU1RSVUNUX0NUT1IodmFyaWFibGVfaWZfZHluYW1pYykKKyAgICBleHBsaWNpdCB2YXJpYWJsZV9pZl9keW5hbWljKFQgdikgeyBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKHYpOyBhc3NlcnQodiA9PSBUKFZhbHVlKSk7IH0KKyAgICBzdGF0aWMgVCB2YWx1ZSgpIHsgcmV0dXJuIFQoVmFsdWUpOyB9CisgICAgdm9pZCBzZXRWYWx1ZShUKSB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgdmFyaWFibGVfaWZfZHluYW1pYzxULCBEeW5hbWljPgoreworICAgIFQgbV92YWx1ZTsKKyAgICB2YXJpYWJsZV9pZl9keW5hbWljKCkgeyBhc3NlcnQoZmFsc2UpOyB9CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCB2YXJpYWJsZV9pZl9keW5hbWljKFQgdmFsdWUpIDogbV92YWx1ZSh2YWx1ZSkge30KKyAgICBUIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorICAgIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgeyBtX3ZhbHVlID0gdmFsdWU7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBmdW5jdG9yX3RyYWl0cworeworICBlbnVtCisgIHsKKyAgICBDb3N0ID0gMTAsCisgICAgUGFja2V0QWNjZXNzID0gZmFsc2UKKyAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBwYWNrZXRfdHJhaXRzOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgdW5wYWNrZXRfdHJhaXRzCit7CisgIHR5cGVkZWYgVCB0eXBlOworICBlbnVtIHtzaXplPTF9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsCisgICAgICAgICBpbnQgX09wdGlvbnMgPSBBdXRvQWxpZ24gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoIChfUm93cz09MSAmJiBfQ29scyE9MSkgPyBSb3dNYWpvcgorICAgICAgICAgICAgICAgICAgICAgICAgICA6IChfQ29scz09MSAmJiBfUm93cyE9MSkgPyBDb2xNYWpvcgorICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OICksCisgICAgICAgICBpbnQgX01heFJvd3MgPSBfUm93cywKKyAgICAgICAgIGludCBfTWF4Q29scyA9IF9Db2xzCis+IGNsYXNzIG1ha2VfcHJvcGVyX21hdHJpeF90eXBlCit7CisgICAgZW51bSB7CisgICAgICBJc0NvbFZlY3RvciA9IF9Db2xzPT0xICYmIF9Sb3dzIT0xLAorICAgICAgSXNSb3dWZWN0b3IgPSBfUm93cz09MSAmJiBfQ29scyE9MSwKKyAgICAgIE9wdGlvbnMgPSBJc0NvbFZlY3RvciA/IChfT3B0aW9ucyB8IENvbE1ham9yKSAmIH5Sb3dNYWpvcgorICAgICAgICAgICAgICA6IElzUm93VmVjdG9yID8gKF9PcHRpb25zIHwgUm93TWFqb3IpICYgfkNvbE1ham9yCisgICAgICAgICAgICAgIDogX09wdGlvbnMKKyAgICB9OworICBwdWJsaWM6CisgICAgdHlwZWRlZiBNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBPcHRpb25zLCBfTWF4Um93cywgX01heENvbHM+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBSb3dzLCBpbnQgQ29scywgaW50IE9wdGlvbnMsIGludCBNYXhSb3dzLCBpbnQgTWF4Q29scz4KK2NsYXNzIGNvbXB1dGVfbWF0cml4X2ZsYWdzCit7CisgICAgZW51bSB7CisgICAgICByb3dfbWFqb3JfYml0ID0gT3B0aW9ucyZSb3dNYWpvciA/IFJvd01ham9yQml0IDogMCwKKyAgICAgIGlzX2R5bmFtaWNfc2l6ZV9zdG9yYWdlID0gTWF4Um93cz09RHluYW1pYyB8fCBNYXhDb2xzPT1EeW5hbWljLAorCisgICAgICBhbGlnbmVkX2JpdCA9CisgICAgICAoCisgICAgICAgICAgICAoKE9wdGlvbnMmRG9udEFsaWduKT09MCkKKyAgICAgICAgJiYgKAorI2lmIEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkKKyAgICAgICAgICAgICAoKCFpc19keW5hbWljX3NpemVfc3RvcmFnZSkgJiYgKCgoTWF4Q29scypNYXhSb3dzKmludChzaXplb2YoU2NhbGFyKSkpICUgMTYpID09IDApKQorI2Vsc2UKKyAgICAgICAgICAgICAwCisjZW5kaWYKKworICAgICAgICAgIHx8CisKKyNpZiBFSUdFTl9BTElHTgorICAgICAgICAgICAgIGlzX2R5bmFtaWNfc2l6ZV9zdG9yYWdlCisjZWxzZQorICAgICAgICAgICAgIDAKKyNlbmRpZgorCisgICAgICAgICAgKQorICAgICAgKSA/IEFsaWduZWRCaXQgOiAwLAorICAgICAgcGFja2V0X2FjY2Vzc19iaXQgPSBwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZSAmJiBhbGlnbmVkX2JpdCA/IFBhY2tldEFjY2Vzc0JpdCA6IDAKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICBlbnVtIHsgcmV0ID0gTGluZWFyQWNjZXNzQml0IHwgTHZhbHVlQml0IHwgRGlyZWN0QWNjZXNzQml0IHwgTmVzdEJ5UmVmQml0IHwgcGFja2V0X2FjY2Vzc19iaXQgfCByb3dfbWFqb3JfYml0IHwgYWxpZ25lZF9iaXQgfTsKK307CisKK3RlbXBsYXRlPGludCBfUm93cywgaW50IF9Db2xzPiBzdHJ1Y3Qgc2l6ZV9hdF9jb21waWxlX3RpbWUKK3sKKyAgZW51bSB7IHJldCA9IChfUm93cz09RHluYW1pYyB8fCBfQ29scz09RHluYW1pYykgPyBEeW5hbWljIDogX1Jvd3MgKiBfQ29scyB9OworfTsKKworLyogcGxhaW5fbWF0cml4X3R5cGUgOiB0aGUgZGlmZmVyZW5jZSBmcm9tIGV2YWwgaXMgdGhhdCBwbGFpbl9tYXRyaXhfdHlwZSBpcyBhbHdheXMgYSBwbGFpbiBtYXRyaXggdHlwZSwKKyAqIHdoZXJlYXMgZXZhbCBpcyBhIGNvbnN0IHJlZmVyZW5jZSBpbiB0aGUgY2FzZSBvZiBhIG1hdHJpeAorICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFN0b3JhZ2VLaW5kID0gdHlwZW5hbWUgdHJhaXRzPFQ+OjpTdG9yYWdlS2luZD4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlOwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQmFzZUNsYXNzVHlwZT4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlX2RlbnNlOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlPFQsRGVuc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGxhaW5fbWF0cml4X3R5cGVfZGVuc2U8VCx0eXBlbmFtZSB0cmFpdHM8VD46OlhwcktpbmQ+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgcGxhaW5fbWF0cml4X3R5cGVfZGVuc2U8VCxNYXRyaXhYcHI+Cit7CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICBBdXRvQWxpZ24gfCAodHJhaXRzPFQ+OjpGbGFncyZSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3IpLAorICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgICAgICAgID4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBwbGFpbl9tYXRyaXhfdHlwZV9kZW5zZTxULEFycmF5WHByPgoreworICB0eXBlZGVmIEFycmF5PHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICBBdXRvQWxpZ24gfCAodHJhaXRzPFQ+OjpGbGFncyZSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3IpLAorICAgICAgICAgICAgICAgIHRyYWl0czxUPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgICAgICAgID4gdHlwZTsKK307CisKKy8qIGV2YWwgOiB0aGUgcmV0dXJuIHR5cGUgb2YgZXZhbCgpLiBGb3IgbWF0cmljZXMsIHRoaXMgaXMganVzdCBhIGNvbnN0IHJlZmVyZW5jZQorICogaW4gb3JkZXIgdG8gYXZvaWQgYSB1c2VsZXNzIGNvcHkKKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTdG9yYWdlS2luZCA9IHR5cGVuYW1lIHRyYWl0czxUPjo6U3RvcmFnZUtpbmQ+IHN0cnVjdCBldmFsOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgZXZhbDxULERlbnNlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHBsYWluX21hdHJpeF90eXBlPFQ+Ojp0eXBlIHR5cGU7CisvLyAgIHR5cGVkZWYgdHlwZW5hbWUgVDo6UGxhaW5PYmplY3QgdHlwZTsKKy8vICAgdHlwZWRlZiBUOjpNYXRyaXg8dHlwZW5hbWUgdHJhaXRzPFQ+OjpTY2FsYXIsCisvLyAgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpSb3dzQXRDb21waWxlVGltZSwKKy8vICAgICAgICAgICAgICAgICB0cmFpdHM8VD46OkNvbHNBdENvbXBpbGVUaW1lLAorLy8gICAgICAgICAgICAgICAgIEF1dG9BbGlnbiB8ICh0cmFpdHM8VD46OkZsYWdzJlJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvciksCisvLyAgICAgICAgICAgICAgICAgdHJhaXRzPFQ+OjpNYXhSb3dzQXRDb21waWxlVGltZSwKKy8vICAgICAgICAgICAgICAgICB0cmFpdHM8VD46Ok1heENvbHNBdENvbXBpbGVUaW1lCisvLyAgICAgICAgICAgPiB0eXBlOworfTsKKworLy8gZm9yIG1hdHJpY2VzLCBubyBuZWVkIHRvIGV2YWx1YXRlLCBqdXN0IHVzZSBhIGNvbnN0IHJlZmVyZW5jZSB0byBhdm9pZCBhIHVzZWxlc3MgY29weQordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucywgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+CitzdHJ1Y3QgZXZhbDxNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfT3B0aW9ucywgX01heFJvd3MsIF9NYXhDb2xzPiwgRGVuc2U+Cit7CisgIHR5cGVkZWYgY29uc3QgTWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4mIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX1Jvd3MsIGludCBfQ29scywgaW50IF9PcHRpb25zLCBpbnQgX01heFJvd3MsIGludCBfTWF4Q29scz4KK3N0cnVjdCBldmFsPEFycmF5PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4sIERlbnNlPgoreworICB0eXBlZGVmIGNvbnN0IEFycmF5PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4mIHR5cGU7Cit9OworCisKKworLyogcGxhaW5fbWF0cml4X3R5cGVfY29sdW1uX21ham9yIDogc2FtZSBhcyBwbGFpbl9tYXRyaXhfdHlwZSBidXQgZ3VhcmFudGVlZCB0byBiZSBjb2x1bW4tbWFqb3IKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlX2NvbHVtbl9tYWpvcgoreworICBlbnVtIHsgUm93cyA9IHRyYWl0czxUPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICBDb2xzID0gdHJhaXRzPFQ+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgIE1heFJvd3MgPSB0cmFpdHM8VD46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgTWF4Q29scyA9IHRyYWl0czxUPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgdHJhaXRzPFQ+OjpTY2FsYXIsCisgICAgICAgICAgICAgICAgUm93cywKKyAgICAgICAgICAgICAgICBDb2xzLAorICAgICAgICAgICAgICAgIChNYXhSb3dzPT0xJiZNYXhDb2xzIT0xKSA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgTWF4Um93cywKKyAgICAgICAgICAgICAgICBNYXhDb2xzCisgICAgICAgICAgPiB0eXBlOworfTsKKworLyogcGxhaW5fbWF0cml4X3R5cGVfcm93X21ham9yIDogc2FtZSBhcyBwbGFpbl9tYXRyaXhfdHlwZSBidXQgZ3VhcmFudGVlZCB0byBiZSByb3ctbWFqb3IKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlX3Jvd19tYWpvcgoreworICBlbnVtIHsgUm93cyA9IHRyYWl0czxUPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICBDb2xzID0gdHJhaXRzPFQ+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgIE1heFJvd3MgPSB0cmFpdHM8VD46Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgTWF4Q29scyA9IHRyYWl0czxUPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgdHJhaXRzPFQ+OjpTY2FsYXIsCisgICAgICAgICAgICAgICAgUm93cywKKyAgICAgICAgICAgICAgICBDb2xzLAorICAgICAgICAgICAgICAgIChNYXhDb2xzPT0xJiZNYXhSb3dzIT0xKSA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgTWF4Um93cywKKyAgICAgICAgICAgICAgICBNYXhDb2xzCisgICAgICAgICAgPiB0eXBlOworfTsKKworLy8gd2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGlzIG9uZSB0b28KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBtdXN0X25lc3RfYnlfdmFsdWUgeyBlbnVtIHsgcmV0ID0gZmFsc2UgfTsgfTsKKworLyoqIFxpbnRlcm5hbCBUaGUgcmVmZXJlbmNlIHNlbGVjdG9yIGZvciB0ZW1wbGF0ZSBleHByZXNzaW9ucy4gVGhlIGlkZWEgaXMgdGhhdCB3ZSBkb24ndAorICAqIG5lZWQgdG8gdXNlIHJlZmVyZW5jZXMgZm9yIGV4cHJlc3Npb25zIHNpbmNlIHRoZXkgYXJlIGxpZ2h0IHdlaWdodCBwcm94eQorICAqIG9iamVjdHMgd2hpY2ggc2hvdWxkIGdlbmVyYXRlIG5vIGNvcHlpbmcgb3ZlcmhlYWQuICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCByZWZfc2VsZWN0b3IKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICBib29sKHRyYWl0czxUPjo6RmxhZ3MgJiBOZXN0QnlSZWZCaXQpLAorICAgIFQgY29uc3QmLAorICAgIGNvbnN0IFQKKyAgPjo6dHlwZSB0eXBlOworfTsKKworLyoqIFxpbnRlcm5hbCBBZGRzIHRoZSBjb25zdCBxdWFsaWZpZXIgb24gdGhlIHZhbHVlLXR5cGUgb2YgVDIgaWYgYW5kIG9ubHkgaWYgVDEgaXMgYSBjb25zdCB0eXBlICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdHJ1Y3QgdHJhbnNmZXJfY29uc3RuZXNzCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgYm9vbChpbnRlcm5hbDo6aXNfY29uc3Q8VDE+Ojp2YWx1ZSksCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlPFQyPjo6dHlwZSwKKyAgICBUMgorICA+Ojp0eXBlIHR5cGU7Cit9OworCisvKiogXGludGVybmFsIERldGVybWluZXMgaG93IGEgZ2l2ZW4gZXhwcmVzc2lvbiBzaG91bGQgYmUgbmVzdGVkIGludG8gYW5vdGhlciBvbmUuCisgICogRm9yIGV4YW1wbGUsIHdoZW4geW91IGRvIGEgKiAoYitjKSwgRWlnZW4gd2lsbCBkZXRlcm1pbmUgaG93IHRoZSBleHByZXNzaW9uIGIrYyBzaG91bGQgYmUKKyAgKiBuZXN0ZWQgaW50byB0aGUgYmlnZ2VyIHByb2R1Y3QgZXhwcmVzc2lvbi4gVGhlIGNob2ljZSBpcyBiZXR3ZWVuIG5lc3RpbmcgdGhlIGV4cHJlc3Npb24gYitjIGFzLWlzLCBvcgorICAqIGV2YWx1YXRpbmcgdGhhdCBleHByZXNzaW9uIGIrYyBpbnRvIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGQsIGFuZCBuZXN0IGQgc28gdGhhdCB0aGUgcmVzdWx0aW5nIGV4cHJlc3Npb24gaXMKKyAgKiBhKmQuIEV2YWx1YXRpbmcgY2FuIGJlIGJlbmVmaWNpYWwgZm9yIGV4YW1wbGUgaWYgZXZlcnkgY29lZmZpY2llbnQgYWNjZXNzIGluIHRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiBjYXVzZXMKKyAgKiBtYW55IGNvZWZmaWNpZW50IGFjY2Vzc2VzIGluIHRoZSBuZXN0ZWQgZXhwcmVzc2lvbnMgLS0gYXMgaXMgdGhlIGNhc2Ugd2l0aCBtYXRyaXggcHJvZHVjdCBmb3IgZXhhbXBsZS4KKyAgKgorICAqIFxwYXJhbSBUIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGJlaW5nIG5lc3RlZAorICAqIFxwYXJhbSBuIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnQgYWNjZXNzZXMgaW4gdGhlIG5lc3RlZCBleHByZXNzaW9uIGZvciBlYWNoIGNvZWZmaWNpZW50IGFjY2VzcyBpbiB0aGUgYmlnZ2VyIGV4cHJlc3Npb24uCisgICoKKyAgKiBOb3RlIHRoYXQgaWYgbm8gZXZhbHVhdGlvbiBvY2N1ciwgdGhlbiB0aGUgY29uc3RuZXNzIG9mIFQgaXMgcHJlc2VydmVkLgorICAqCisgICogRXhhbXBsZS4gU3VwcG9zZSB0aGF0IGEsIGIsIGFuZCBjIGFyZSBvZiB0eXBlIE1hdHJpeDNkLiBUaGUgdXNlciBmb3JtcyB0aGUgZXhwcmVzc2lvbiBhKihiK2MpLgorICAqIGIrYyBpcyBhbiBleHByZXNzaW9uICJzdW0gb2YgbWF0cmljZXMiLCB3aGljaCB3ZSB3aWxsIGRlbm90ZSBieSBTLiBJbiBvcmRlciB0byBkZXRlcm1pbmUgaG93IHRvIG5lc3QgaXQsCisgICogdGhlIFByb2R1Y3QgZXhwcmVzc2lvbiB1c2VzOiBuZXN0ZWQ8UywgMz46OnJldCwgd2hpY2ggdHVybnMgb3V0IHRvIGJlIE1hdHJpeDNkIGJlY2F1c2UgdGhlIGludGVybmFsIGxvZ2ljIG9mCisgICogbmVzdGVkIGRldGVybWluZWQgdGhhdCBpbiB0aGlzIGNhc2UgaXQgd2FzIGJldHRlciB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBiK2MgaW50byBhIHRlbXBvcmFyeS4gT24gdGhlIG90aGVyIGhhbmQsCisgICogc2luY2UgYSBpcyBvZiB0eXBlIE1hdHJpeDNkLCB0aGUgUHJvZHVjdCBleHByZXNzaW9uIG5lc3RzIGl0IGFzIG5lc3RlZDxNYXRyaXgzZCwgMz46OnJldCwgd2hpY2ggdHVybnMgb3V0IHRvIGJlCisgICogY29uc3QgTWF0cml4M2QmLCBiZWNhdXNlIHRoZSBpbnRlcm5hbCBsb2dpYyBvZiBuZXN0ZWQgZGV0ZXJtaW5lZCB0aGF0IHNpbmNlIGEgd2FzIGFscmVhZHkgYSBtYXRyaXgsIHRoZXJlIHdhcyBubyBwb2ludAorICAqIGluIGNvcHlpbmcgaXQgaW50byBhbm90aGVyIG1hdHJpeC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBuPTEsIHR5cGVuYW1lIFBsYWluT2JqZWN0ID0gdHlwZW5hbWUgZXZhbDxUPjo6dHlwZT4gc3RydWN0IG5lc3RlZAoreworICBlbnVtIHsKKyAgICAvLyBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyB0ZXN0LCB0byBrZWVwIGl0IHJlYXNvbmFibHkgc2ltcGxlLCB3ZSBhcmJpdHJhcmlseSBjaG9vc2UgYSB2YWx1ZSBvZiBEeW5hbWljIHZhbHVlcy4KKyAgICAvLyB0aGUgY2hvaWNlIG9mIDEwMDAwIG1ha2VzIGl0IGxhcmdlciB0aGFuIGFueSBwcmFjdGljYWwgZml4ZWQgdmFsdWUgYW5kIGV2ZW4gbW9zdCBkeW5hbWljIHZhbHVlcy4KKyAgICAvLyBpbiBleHRyZW1lIGNhc2VzIHdoZXJlIHRoZXNlIGFzc3VtcHRpb25zIHdvdWxkIGJlIHdyb25nLCB3ZSB3b3VsZCBzdGlsbCBhdCB3b3JzdCBzdWZmZXIgcGVyZm9ybWFuY2UgaXNzdWVzCisgICAgLy8gKHBvb3IgY2hvaWNlIG9mIHRlbXBvcmFyaWVzKS4KKyAgICAvLyBpdCdzIGltcG9ydGFudCB0aGF0IHRoaXMgdmFsdWUgY2FuIHN0aWxsIGJlIHNxdWFyZWQgd2l0aG91dCBpbnRlZ2VyIG92ZXJmbG93aW5nLgorICAgIER5bmFtaWNBc0ludGVnZXIgPSAxMDAwMCwKKyAgICBTY2FsYXJSZWFkQ29zdCA9IE51bVRyYWl0czx0eXBlbmFtZSB0cmFpdHM8VD46OlNjYWxhcj46OlJlYWRDb3N0LAorICAgIFNjYWxhclJlYWRDb3N0QXNJbnRlZ2VyID0gU2NhbGFyUmVhZENvc3QgPT0gRHluYW1pYyA/IER5bmFtaWNBc0ludGVnZXIgOiBTY2FsYXJSZWFkQ29zdCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gdHJhaXRzPFQ+OjpDb2VmZlJlYWRDb3N0LAorICAgIENvZWZmUmVhZENvc3RBc0ludGVnZXIgPSBDb2VmZlJlYWRDb3N0ID09IER5bmFtaWMgPyBEeW5hbWljQXNJbnRlZ2VyIDogQ29lZmZSZWFkQ29zdCwKKyAgICBOQXNJbnRlZ2VyID0gbiA9PSBEeW5hbWljID8gaW50KER5bmFtaWNBc0ludGVnZXIpIDogbiwKKyAgICBDb3N0RXZhbEFzSW50ZWdlciAgID0gKE5Bc0ludGVnZXIrMSkgKiBTY2FsYXJSZWFkQ29zdEFzSW50ZWdlciArIENvZWZmUmVhZENvc3RBc0ludGVnZXIsCisgICAgQ29zdE5vRXZhbEFzSW50ZWdlciA9IE5Bc0ludGVnZXIgKiBDb2VmZlJlYWRDb3N0QXNJbnRlZ2VyCisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICAgICggKGludCh0cmFpdHM8VD46OkZsYWdzKSAmIEV2YWxCZWZvcmVOZXN0aW5nQml0KSB8fAorICAgICAgICBpbnQoQ29zdEV2YWxBc0ludGVnZXIpIDwgaW50KENvc3ROb0V2YWxBc0ludGVnZXIpCisgICAgICApLAorICAgICAgUGxhaW5PYmplY3QsCisgICAgICB0eXBlbmFtZSByZWZfc2VsZWN0b3I8VD46OnR5cGUKKyAgPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QqIGNvbnN0X2Nhc3RfcHRyKGNvbnN0IFQqIHB0cikKK3sKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8VCo+KHB0cik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIFhwcktpbmQgPSB0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlhwcktpbmQ+CitzdHJ1Y3QgZGVuc2VfeHByX2Jhc2UKK3sKKyAgLyogZGVuc2VfeHByX2Jhc2Ugc2hvdWxkIG9ubHkgZXZlciBiZSB1c2VkIG9uIGRlbnNlIGV4cHJlc3Npb25zLCB0aHVzIGZhbGxpbmcgZWl0aGVyIGludG8gdGhlIE1hdHJpeFhwciBvciBpbnRvIHRoZSBBcnJheVhwciBjYXNlcyAqLworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBkZW5zZV94cHJfYmFzZTxEZXJpdmVkLCBNYXRyaXhYcHI+Cit7CisgIHR5cGVkZWYgTWF0cml4QmFzZTxEZXJpdmVkPiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBkZW5zZV94cHJfYmFzZTxEZXJpdmVkLCBBcnJheVhwcj4KK3sKKyAgdHlwZWRlZiBBcnJheUJhc2U8RGVyaXZlZD4gdHlwZTsKK307CisKKy8qKiBcaW50ZXJuYWwgSGVscGVyIGJhc2UgY2xhc3MgdG8gYWRkIGEgc2NhbGFyIG11bHRpcGxlIG9wZXJhdG9yCisgICogb3ZlcmxvYWRzIGZvciBjb21wbGV4IHR5cGVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBPdGhlclNjYWxhciwKKyAgICAgICAgIGJvb2wgRW5hYmxlSXQgPSAhaXNfc2FtZTxTY2FsYXIsT3RoZXJTY2FsYXI+Ojp2YWx1ZSA+CitzdHJ1Y3Qgc3BlY2lhbF9zY2FsYXJfb3BfYmFzZSA6IHB1YmxpYyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZD4KK3sKKyAgLy8gZHVtbXkgb3BlcmF0b3IqIHNvIHRoYXQgdGhlCisgIC8vICJ1c2luZyBzcGVjaWFsX3NjYWxhcl9vcF9iYXNlOjpvcGVyYXRvcioiIGNvbXBpbGVzCisgIHZvaWQgb3BlcmF0b3IqKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBPdGhlclNjYWxhcj4KK3N0cnVjdCBzcGVjaWFsX3NjYWxhcl9vcF9iYXNlPERlcml2ZWQsU2NhbGFyLE90aGVyU2NhbGFyLHRydWU+ICA6IHB1YmxpYyBEZW5zZUNvZWZmc0Jhc2U8RGVyaXZlZD4KK3sKKyAgY29uc3QgQ3dpc2VVbmFyeU9wPHNjYWxhcl9tdWx0aXBsZTJfb3A8U2NhbGFyLE90aGVyU2NhbGFyPiwgRGVyaXZlZD4KKyAgb3BlcmF0b3IqKGNvbnN0IE90aGVyU2NhbGFyJiBzY2FsYXIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gQ3dpc2VVbmFyeU9wPHNjYWxhcl9tdWx0aXBsZTJfb3A8U2NhbGFyLE90aGVyU2NhbGFyPiwgRGVyaXZlZD4KKyAgICAgICgqc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpLCBzY2FsYXJfbXVsdGlwbGUyX29wPFNjYWxhcixPdGhlclNjYWxhcj4oc2NhbGFyKSk7CisgIH0KKworICBpbmxpbmUgZnJpZW5kIGNvbnN0IEN3aXNlVW5hcnlPcDxzY2FsYXJfbXVsdGlwbGUyX29wPFNjYWxhcixPdGhlclNjYWxhcj4sIERlcml2ZWQ+CisgIG9wZXJhdG9yKihjb25zdCBPdGhlclNjYWxhciYgc2NhbGFyLCBjb25zdCBEZXJpdmVkJiBtYXRyaXgpCisgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IHNwZWNpYWxfc2NhbGFyX29wX2Jhc2UmPihtYXRyaXgpLm9wZXJhdG9yKihzY2FsYXIpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlLCB0eXBlbmFtZSBDYXN0VHlwZT4gc3RydWN0IGNhc3RfcmV0dXJuX3R5cGUKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpTY2FsYXIgQ3VycmVudFNjYWxhclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxDYXN0VHlwZT46OnR5cGUgX0Nhc3RUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIF9DYXN0VHlwZTo6U2NhbGFyIE5ld1NjYWxhclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8aXNfc2FtZTxDdXJyZW50U2NhbGFyVHlwZSxOZXdTY2FsYXJUeXBlPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYcHJUeXBlJixDYXN0VHlwZT46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBzdHJ1Y3QgcHJvbW90ZV9zdG9yYWdlX3R5cGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBPiBzdHJ1Y3QgcHJvbW90ZV9zdG9yYWdlX3R5cGU8QSxBPgoreworICB0eXBlZGVmIEEgcmV0OworfTsKKworLyoqIFxpbnRlcm5hbCBnaXZlcyB0aGUgcGxhaW4gbWF0cml4IG9yIGFycmF5IHR5cGUgdG8gc3RvcmUgYSByb3cvY29sdW1uL2RpYWdvbmFsIG9mIGEgbWF0cml4IHR5cGUuCisgICogXHBhcmFtIFNjYWxhciBvcHRpb25hbCBwYXJhbWV0ZXIgYWxsb3dpbmcgdG8gcGFzcyBhIGRpZmZlcmVudCBzY2FsYXIgdHlwZSB0aGFuIHRoZSBvbmUgb2YgdGhlIE1hdHJpeFR5cGUuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSwgdHlwZW5hbWUgU2NhbGFyID0gdHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6OlNjYWxhcj4KK3N0cnVjdCBwbGFpbl9yb3dfdHlwZQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIEV4cHJlc3Npb25UeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgRXhwcmVzc2lvblR5cGU6OlBsYWluT2JqZWN0OjpPcHRpb25zIHwgUm93TWFqb3IsIDEsIEV4cHJlc3Npb25UeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZT4gTWF0cml4Um93VHlwZTsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIDEsIEV4cHJlc3Npb25UeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgRXhwcmVzc2lvblR5cGU6OlBsYWluT2JqZWN0OjpPcHRpb25zIHwgUm93TWFqb3IsIDEsIEV4cHJlc3Npb25UeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZT4gQXJyYXlSb3dUeXBlOworCisgIHR5cGVkZWYgdHlwZW5hbWUgY29uZGl0aW9uYWw8CisgICAgaXNfc2FtZTwgdHlwZW5hbWUgdHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6WHByS2luZCwgTWF0cml4WHByID46OnZhbHVlLAorICAgIE1hdHJpeFJvd1R5cGUsCisgICAgQXJyYXlSb3dUeXBlIAorICA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSwgdHlwZW5hbWUgU2NhbGFyID0gdHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6OlNjYWxhcj4KK3N0cnVjdCBwbGFpbl9jb2xfdHlwZQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIEV4cHJlc3Npb25UeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMSwKKyAgICAgICAgICAgICAgICAgRXhwcmVzc2lvblR5cGU6OlBsYWluT2JqZWN0OjpPcHRpb25zICYgflJvd01ham9yLCBFeHByZXNzaW9uVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIDE+IE1hdHJpeENvbFR5cGU7CisgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLCBFeHByZXNzaW9uVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDEsCisgICAgICAgICAgICAgICAgIEV4cHJlc3Npb25UeXBlOjpQbGFpbk9iamVjdDo6T3B0aW9ucyAmIH5Sb3dNYWpvciwgRXhwcmVzc2lvblR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLCAxPiBBcnJheUNvbFR5cGU7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDwKKyAgICBpc19zYW1lPCB0eXBlbmFtZSB0cmFpdHM8RXhwcmVzc2lvblR5cGU+OjpYcHJLaW5kLCBNYXRyaXhYcHIgPjo6dmFsdWUsCisgICAgTWF0cml4Q29sVHlwZSwKKyAgICBBcnJheUNvbFR5cGUgCisgID46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB0eXBlbmFtZSBTY2FsYXIgPSB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6U2NhbGFyPgorc3RydWN0IHBsYWluX2RpYWdfdHlwZQoreworICBlbnVtIHsgZGlhZ19zaXplID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0RZTkFNSUMoRXhwcmVzc2lvblR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBFeHByZXNzaW9uVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpLAorICAgICAgICAgbWF4X2RpYWdfc2l6ZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChFeHByZXNzaW9uVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIEV4cHJlc3Npb25UeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSkKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBkaWFnX3NpemUsIDEsIEV4cHJlc3Npb25UeXBlOjpQbGFpbk9iamVjdDo6T3B0aW9ucyAmIH5Sb3dNYWpvciwgbWF4X2RpYWdfc2l6ZSwgMT4gTWF0cml4RGlhZ1R5cGU7CisgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLCBkaWFnX3NpemUsIDEsIEV4cHJlc3Npb25UeXBlOjpQbGFpbk9iamVjdDo6T3B0aW9ucyAmIH5Sb3dNYWpvciwgbWF4X2RpYWdfc2l6ZSwgMT4gQXJyYXlEaWFnVHlwZTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAorICAgIGlzX3NhbWU8IHR5cGVuYW1lIHRyYWl0czxFeHByZXNzaW9uVHlwZT46OlhwcktpbmQsIE1hdHJpeFhwciA+Ojp2YWx1ZSwKKyAgICBNYXRyaXhEaWFnVHlwZSwKKyAgICBBcnJheURpYWdUeXBlIAorICA+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK3N0cnVjdCBpc19sdmFsdWUKK3sKKyAgZW51bSB7IHZhbHVlID0gIWJvb2woaXNfY29uc3Q8RXhwcmVzc2lvblR5cGU+Ojp2YWx1ZSkgJiYKKyAgICAgICAgICAgICAgICAgYm9vbCh0cmFpdHM8RXhwcmVzc2lvblR5cGU+OjpGbGFncyAmIEx2YWx1ZUJpdCkgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1hQUkhFTFBFUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9CbG9jay5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ0NTZmCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvQmxvY2suaApAQCAtMCwwICsxLDEyNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CTE9DSzJfSAorI2RlZmluZSBFSUdFTl9CTE9DSzJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxyZXR1cm5zIGEgZHluYW1pYy1zaXplIGV4cHJlc3Npb24gb2YgYSBjb3JuZXIgb2YgKnRoaXMuCisgICoKKyAgKiBccGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBjb3JuZXIuIENhbiBiZSBcYSBFaWdlbjo6VG9wTGVmdCwgXGEgRWlnZW46OlRvcFJpZ2h0LAorICAqIFxhIEVpZ2VuOjpCb3R0b21MZWZ0LCBcYSBFaWdlbjo6Qm90dG9tUmlnaHQuCisgICogXHBhcmFtIGNSb3dzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29ybmVyCisgICogXHBhcmFtIGNDb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgY29ybmVyCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2Nvcm5lcl9lbnVtX2ludF9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jb3JuZXJfZW51bV9pbnRfaW50Lm91dAorICAqCisgICogXG5vdGUgRXZlbiB0aG91Z2ggdGhlIHJldHVybmVkIGV4cHJlc3Npb24gaGFzIGR5bmFtaWMgc2l6ZSwgaW4gdGhlIGNhc2UKKyAgKiB3aGVuIGl0IGlzIGFwcGxpZWQgdG8gYSBmaXhlZC1zaXplIG1hdHJpeCwgaXQgaW5oZXJpdHMgYSBmaXhlZCBtYXhpbWFsIHNpemUsCisgICogd2hpY2ggbWVhbnMgdGhhdCBldmFsdWF0aW5nIGl0IGRvZXMgbm90IGNhdXNlIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIEJsb2NrPERlcml2ZWQ+IERlbnNlQmFzZTxEZXJpdmVkPgorICA6OmNvcm5lcihDb3JuZXJUeXBlIHR5cGUsIEluZGV4IGNSb3dzLCBJbmRleCBjQ29scykKK3sKKyAgc3dpdGNoKHR5cGUpCisgIHsKKyAgICBkZWZhdWx0OgorICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJCYWQgY29ybmVyIHR5cGUuIik7CisgICAgY2FzZSBUb3BMZWZ0OgorICAgICAgcmV0dXJuIEJsb2NrPERlcml2ZWQ+KGRlcml2ZWQoKSwgMCwgMCwgY1Jvd3MsIGNDb2xzKTsKKyAgICBjYXNlIFRvcFJpZ2h0OgorICAgICAgcmV0dXJuIEJsb2NrPERlcml2ZWQ+KGRlcml2ZWQoKSwgMCwgY29scygpIC0gY0NvbHMsIGNSb3dzLCBjQ29scyk7CisgICAgY2FzZSBCb3R0b21MZWZ0OgorICAgICAgcmV0dXJuIEJsb2NrPERlcml2ZWQ+KGRlcml2ZWQoKSwgcm93cygpIC0gY1Jvd3MsIDAsIGNSb3dzLCBjQ29scyk7CisgICAgY2FzZSBCb3R0b21SaWdodDoKKyAgICAgIHJldHVybiBCbG9jazxEZXJpdmVkPihkZXJpdmVkKCksIHJvd3MoKSAtIGNSb3dzLCBjb2xzKCkgLSBjQ29scywgY1Jvd3MsIGNDb2xzKTsKKyAgfQorfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBjb3JuZXIoQ29ybmVyVHlwZSwgSW5kZXgsIEluZGV4KS4qLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBCbG9jazxEZXJpdmVkPgorRGVuc2VCYXNlPERlcml2ZWQ+Ojpjb3JuZXIoQ29ybmVyVHlwZSB0eXBlLCBJbmRleCBjUm93cywgSW5kZXggY0NvbHMpIGNvbnN0Cit7CisgIHN3aXRjaCh0eXBlKQorICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiQmFkIGNvcm5lciB0eXBlLiIpOworICAgIGNhc2UgVG9wTGVmdDoKKyAgICAgIHJldHVybiBCbG9jazxEZXJpdmVkPihkZXJpdmVkKCksIDAsIDAsIGNSb3dzLCBjQ29scyk7CisgICAgY2FzZSBUb3BSaWdodDoKKyAgICAgIHJldHVybiBCbG9jazxEZXJpdmVkPihkZXJpdmVkKCksIDAsIGNvbHMoKSAtIGNDb2xzLCBjUm93cywgY0NvbHMpOworICAgIGNhc2UgQm90dG9tTGVmdDoKKyAgICAgIHJldHVybiBCbG9jazxEZXJpdmVkPihkZXJpdmVkKCksIHJvd3MoKSAtIGNSb3dzLCAwLCBjUm93cywgY0NvbHMpOworICAgIGNhc2UgQm90dG9tUmlnaHQ6CisgICAgICByZXR1cm4gQmxvY2s8RGVyaXZlZD4oZGVyaXZlZCgpLCByb3dzKCkgLSBjUm93cywgY29scygpIC0gY0NvbHMsIGNSb3dzLCBjQ29scyk7CisgIH0KK30KKworLyoqIFxyZXR1cm5zIGEgZml4ZWQtc2l6ZSBleHByZXNzaW9uIG9mIGEgY29ybmVyIG9mICp0aGlzLgorICAqCisgICogXHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgY29ybmVyLiBDYW4gYmUgXGEgRWlnZW46OlRvcExlZnQsIFxhIEVpZ2VuOjpUb3BSaWdodCwKKyAgKiBcYSBFaWdlbjo6Qm90dG9tTGVmdCwgXGEgRWlnZW46OkJvdHRvbVJpZ2h0LgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgQ1Jvd3MgYW5kIENDb2xzIGFyZXRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBpbiB0aGUgY29ybmVyLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2Nvcm5lcl9lbnVtLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9jb3JuZXJfZW51bS5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8aW50IENSb3dzLCBpbnQgQ0NvbHM+CitpbmxpbmUgQmxvY2s8RGVyaXZlZCwgQ1Jvd3MsIENDb2xzPgorRGVuc2VCYXNlPERlcml2ZWQ+Ojpjb3JuZXIoQ29ybmVyVHlwZSB0eXBlKQoreworICBzd2l0Y2godHlwZSkKKyAgeworICAgIGRlZmF1bHQ6CisgICAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgIkJhZCBjb3JuZXIgdHlwZS4iKTsKKyAgICBjYXNlIFRvcExlZnQ6CisgICAgICByZXR1cm4gQmxvY2s8RGVyaXZlZCwgQ1Jvd3MsIENDb2xzPihkZXJpdmVkKCksIDAsIDApOworICAgIGNhc2UgVG9wUmlnaHQ6CisgICAgICByZXR1cm4gQmxvY2s8RGVyaXZlZCwgQ1Jvd3MsIENDb2xzPihkZXJpdmVkKCksIDAsIGNvbHMoKSAtIENDb2xzKTsKKyAgICBjYXNlIEJvdHRvbUxlZnQ6CisgICAgICByZXR1cm4gQmxvY2s8RGVyaXZlZCwgQ1Jvd3MsIENDb2xzPihkZXJpdmVkKCksIHJvd3MoKSAtIENSb3dzLCAwKTsKKyAgICBjYXNlIEJvdHRvbVJpZ2h0OgorICAgICAgcmV0dXJuIEJsb2NrPERlcml2ZWQsIENSb3dzLCBDQ29scz4oZGVyaXZlZCgpLCByb3dzKCkgLSBDUm93cywgY29scygpIC0gQ0NvbHMpOworICB9Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGNvcm5lcjxpbnQsIGludD4oQ29ybmVyVHlwZSkuKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgQ1Jvd3MsIGludCBDQ29scz4KK2lubGluZSBjb25zdCBCbG9jazxEZXJpdmVkLCBDUm93cywgQ0NvbHM+CitEZW5zZUJhc2U8RGVyaXZlZD46OmNvcm5lcihDb3JuZXJUeXBlIHR5cGUpIGNvbnN0Cit7CisgIHN3aXRjaCh0eXBlKQorICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiQmFkIGNvcm5lciB0eXBlLiIpOworICAgIGNhc2UgVG9wTGVmdDoKKyAgICAgIHJldHVybiBCbG9jazxEZXJpdmVkLCBDUm93cywgQ0NvbHM+KGRlcml2ZWQoKSwgMCwgMCk7CisgICAgY2FzZSBUb3BSaWdodDoKKyAgICAgIHJldHVybiBCbG9jazxEZXJpdmVkLCBDUm93cywgQ0NvbHM+KGRlcml2ZWQoKSwgMCwgY29scygpIC0gQ0NvbHMpOworICAgIGNhc2UgQm90dG9tTGVmdDoKKyAgICAgIHJldHVybiBCbG9jazxEZXJpdmVkLCBDUm93cywgQ0NvbHM+KGRlcml2ZWQoKSwgcm93cygpIC0gQ1Jvd3MsIDApOworICAgIGNhc2UgQm90dG9tUmlnaHQ6CisgICAgICByZXR1cm4gQmxvY2s8RGVyaXZlZCwgQ1Jvd3MsIENDb2xzPihkZXJpdmVkKCksIHJvd3MoKSAtIENSb3dzLCBjb2xzKCkgLSBDQ29scyk7CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9CTE9DSzJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWU0MWIzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4IEBACitGSUxFKEdMT0IgRWlnZW5fRWlnZW4yU3VwcG9ydF9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fRWlnZW4yU3VwcG9ydF9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0IENPTVBPTkVOVCBEZXZlbAorICApCisKK0FERF9TVUJESVJFQ1RPUlkoR2VvbWV0cnkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvQ3dpc2UuaCBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0N3aXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1MDA5YgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0N3aXNlLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DV0lTRV9ICisjZGVmaW5lIEVJR0VOX0NXSVNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW50ZXJuYWwKKyAgKiBjb252ZW5pZW50IG1hY3JvIHRvIGRlZmluZWQgdGhlIHJldHVybiB0eXBlIG9mIGEgY3dpc2UgYmluYXJ5IG9wZXJhdGlvbiAqLworI2RlZmluZSBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShPUCkgXAorICAgIEN3aXNlQmluYXJ5T3A8T1A8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxFeHByZXNzaW9uVHlwZT46OlNjYWxhcj4sIEV4cHJlc3Npb25UeXBlLCBPdGhlckRlcml2ZWQ+CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBjb252ZW5pZW50IG1hY3JvIHRvIGRlZmluZWQgdGhlIHJldHVybiB0eXBlIG9mIGEgY3dpc2UgdW5hcnkgb3BlcmF0aW9uICovCisjZGVmaW5lIEVJR0VOX0NXSVNFX1VOT1BfUkVUVVJOX1RZUEUoT1ApIFwKKyAgICBDd2lzZVVuYXJ5T3A8T1A8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxFeHByZXNzaW9uVHlwZT46OlNjYWxhcj4sIEV4cHJlc3Npb25UeXBlPgorCisvKiogXGludGVybmFsCisgICogY29udmVuaWVudCBtYWNybyB0byBkZWZpbmVkIHRoZSByZXR1cm4gdHlwZSBvZiBhIGN3aXNlIGNvbXBhcmlzb24gdG8gYSBzY2FsYXIgKi8KKyNkZWZpbmUgRUlHRU5fQ1dJU0VfQ09NUF9UT19TQ0FMQVJfUkVUVVJOX1RZUEUoT1ApIFwKKyAgICBDd2lzZUJpbmFyeU9wPE9QPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RXhwcmVzc2lvblR5cGU+OjpTY2FsYXI+LCBFeHByZXNzaW9uVHlwZSwgXAorICAgICAgICB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6Q29uc3RhbnRSZXR1cm5UeXBlID4KKworLyoqIFxjbGFzcyBDd2lzZQorICAqCisgICogXGJyaWVmIFBzZXVkbyBleHByZXNzaW9uIHByb3ZpZGluZyBhZGRpdGlvbmFsIGNvZWZmaWNpZW50LXdpc2Ugb3BlcmF0aW9ucworICAqCisgICogXHBhcmFtIEV4cHJlc3Npb25UeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgb24gd2hpY2ggdG8gZG8gY29lZmZpY2llbnQtd2lzZSBvcGVyYXRpb25zCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiB3aXRoIGFkZGl0aW9uYWwgY29lZmZpY2llbnQtd2lzZSBmZWF0dXJlcy4KKyAgKiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgTWF0cml4QmFzZTo6Y3dpc2UoKQorICAqIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlX2NvbnN0LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfY3dpc2VfY29uc3Qub3V0CisgICoKKyAgKiBUaGlzIGNsYXNzIGNhbiBiZSBleHRlbmRlZCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBwbHVnaW4gbWVjaGFuaXNtIGRlc2NyaWJlZCBvbiB0aGUgcGFnZQorICAqIFxyZWYgVG9waWNDdXN0b21pemluZ0VpZ2VuIGJ5IGRlZmluaW5nIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxjIEVJR0VOX0NXSVNFX1BMVUdJTi4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpjd2lzZSgpIGNvbnN0LCBNYXRyaXhCYXNlOjpjd2lzZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4gY2xhc3MgQ3dpc2UKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPEV4cHJlc3Npb25UeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxpbnRlcm5hbDo6bXVzdF9uZXN0X2J5X3ZhbHVlPEV4cHJlc3Npb25UeXBlPjo6cmV0LAorICAgICAgICBFeHByZXNzaW9uVHlwZSwgY29uc3QgRXhwcmVzc2lvblR5cGUmPjo6dHlwZSBFeHByZXNzaW9uVHlwZU5lc3RlZDsKKyAgICB0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2FkZF9vcDxTY2FsYXI+LCBFeHByZXNzaW9uVHlwZT4gU2NhbGFyQWRkUmV0dXJuVHlwZTsKKworICAgIGlubGluZSBDd2lzZShjb25zdCBFeHByZXNzaW9uVHlwZSYgbWF0cml4KSA6IG1fbWF0cml4KG1hdHJpeCkge30KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBpbmxpbmUgY29uc3QgRXhwcmVzc2lvblR5cGUmIF9leHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCBFSUdFTl9DV0lTRV9QUk9EVUNUX1JFVFVSTl9UWVBFKEV4cHJlc3Npb25UeXBlLE90aGVyRGVyaXZlZCkKKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgY29uc3QgRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUoaW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcCkKKyAgICBvcGVyYXRvci8oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisKKyAgICAvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjptaW4oKSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX21pbl9vcCkKKyAgICAobWluKShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIEVJR0VOX0NXSVNFX0JJTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfbWluX29wKShfZXhwcmVzc2lvbigpLCBvdGhlci5kZXJpdmVkKCkpOyB9CisKKyAgICAvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjptYXgoKSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX21heF9vcCkKKyAgICAobWF4KShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIEVJR0VOX0NXSVNFX0JJTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfbWF4X29wKShfZXhwcmVzc2lvbigpLCBvdGhlci5kZXJpdmVkKCkpOyB9CisKKyAgICBjb25zdCBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfYWJzX29wKSAgICAgIGFicygpIGNvbnN0OworICAgIGNvbnN0IEVJR0VOX0NXSVNFX1VOT1BfUkVUVVJOX1RZUEUoaW50ZXJuYWw6OnNjYWxhcl9hYnMyX29wKSAgICAgYWJzMigpIGNvbnN0OworICAgIGNvbnN0IEVJR0VOX0NXSVNFX1VOT1BfUkVUVVJOX1RZUEUoaW50ZXJuYWw6OnNjYWxhcl9zcXVhcmVfb3ApICAgc3F1YXJlKCkgY29uc3Q7CisgICAgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX2N1YmVfb3ApICAgICBjdWJlKCkgY29uc3Q7CisgICAgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX2ludmVyc2Vfb3ApICBpbnZlcnNlKCkgY29uc3Q7CisgICAgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX3NxcnRfb3ApICAgICBzcXJ0KCkgY29uc3Q7CisgICAgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX2V4cF9vcCkgICAgICBleHAoKSBjb25zdDsKKyAgICBjb25zdCBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfbG9nX29wKSAgICAgIGxvZygpIGNvbnN0OworICAgIGNvbnN0IEVJR0VOX0NXSVNFX1VOT1BfUkVUVVJOX1RZUEUoaW50ZXJuYWw6OnNjYWxhcl9jb3Nfb3ApICAgICAgY29zKCkgY29uc3Q7CisgICAgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX3Npbl9vcCkgICAgICBzaW4oKSBjb25zdDsKKyAgICBjb25zdCBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfcG93X29wKSAgICAgIHBvdyhjb25zdCBTY2FsYXImIGV4cG9uZW50KSBjb25zdDsKKworICAgIGNvbnN0IFNjYWxhckFkZFJldHVyblR5cGUKKyAgICBvcGVyYXRvcisoY29uc3QgU2NhbGFyJiBzY2FsYXIpIGNvbnN0OworCisgICAgLyoqIFxyZWxhdGVzIEN3aXNlICovCisgICAgZnJpZW5kIGNvbnN0IFNjYWxhckFkZFJldHVyblR5cGUKKyAgICBvcGVyYXRvcisoY29uc3QgU2NhbGFyJiBzY2FsYXIsIGNvbnN0IEN3aXNlJiBtYXQpCisgICAgeyByZXR1cm4gbWF0ICsgc2NhbGFyOyB9CisKKyAgICBFeHByZXNzaW9uVHlwZSYgb3BlcmF0b3IrPShjb25zdCBTY2FsYXImIHNjYWxhcik7CisKKyAgICBjb25zdCBTY2FsYXJBZGRSZXR1cm5UeXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IFNjYWxhciYgc2NhbGFyKSBjb25zdDsKKworICAgIEV4cHJlc3Npb25UeXBlJiBvcGVyYXRvci09KGNvbnN0IFNjYWxhciYgc2NhbGFyKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBpbmxpbmUgRXhwcmVzc2lvblR5cGUmIG9wZXJhdG9yKj0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIEV4cHJlc3Npb25UeXBlJiBvcGVyYXRvci89KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBjb25zdCBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShzdGQ6Omxlc3MpCisgICAgb3BlcmF0b3I8KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBjb25zdCBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShzdGQ6Omxlc3NfZXF1YWwpCisgICAgb3BlcmF0b3I8PShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gY29uc3QgRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUoc3RkOjpncmVhdGVyKQorICAgIG9wZXJhdG9yPihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gY29uc3QgRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUoc3RkOjpncmVhdGVyX2VxdWFsKQorICAgIG9wZXJhdG9yPj0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGNvbnN0IEVJR0VOX0NXSVNFX0JJTk9QX1JFVFVSTl9UWVBFKHN0ZDo6ZXF1YWxfdG8pCisgICAgb3BlcmF0b3I9PShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gY29uc3QgRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUoc3RkOjpub3RfZXF1YWxfdG8pCisgICAgb3BlcmF0b3IhPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKworICAgIC8vIGNvbXBhcmlzb25zIHRvIGEgc2NhbGFyIHZhbHVlCisgICAgY29uc3QgRUlHRU5fQ1dJU0VfQ09NUF9UT19TQ0FMQVJfUkVUVVJOX1RZUEUoc3RkOjpsZXNzKQorICAgIG9wZXJhdG9yPChTY2FsYXIgcykgY29uc3Q7CisKKyAgICBjb25zdCBFSUdFTl9DV0lTRV9DT01QX1RPX1NDQUxBUl9SRVRVUk5fVFlQRShzdGQ6Omxlc3NfZXF1YWwpCisgICAgb3BlcmF0b3I8PShTY2FsYXIgcykgY29uc3Q7CisKKyAgICBjb25zdCBFSUdFTl9DV0lTRV9DT01QX1RPX1NDQUxBUl9SRVRVUk5fVFlQRShzdGQ6OmdyZWF0ZXIpCisgICAgb3BlcmF0b3I+KFNjYWxhciBzKSBjb25zdDsKKworICAgIGNvbnN0IEVJR0VOX0NXSVNFX0NPTVBfVE9fU0NBTEFSX1JFVFVSTl9UWVBFKHN0ZDo6Z3JlYXRlcl9lcXVhbCkKKyAgICBvcGVyYXRvcj49KFNjYWxhciBzKSBjb25zdDsKKworICAgIGNvbnN0IEVJR0VOX0NXSVNFX0NPTVBfVE9fU0NBTEFSX1JFVFVSTl9UWVBFKHN0ZDo6ZXF1YWxfdG8pCisgICAgb3BlcmF0b3I9PShTY2FsYXIgcykgY29uc3Q7CisKKyAgICBjb25zdCBFSUdFTl9DV0lTRV9DT01QX1RPX1NDQUxBUl9SRVRVUk5fVFlQRShzdGQ6Om5vdF9lcXVhbF90bykKKyAgICBvcGVyYXRvciE9KFNjYWxhciBzKSBjb25zdDsKKworICAgIC8vIGFsbG93IHRvIGV4dGVuZCBDd2lzZSBvdXRzaWRlIEVpZ2VuCisgICAgI2lmZGVmIEVJR0VOX0NXSVNFX1BMVUdJTgorICAgICNpbmNsdWRlIEVJR0VOX0NXSVNFX1BMVUdJTgorICAgICNlbmRpZgorCisgIHByb3RlY3RlZDoKKyAgICBFeHByZXNzaW9uVHlwZU5lc3RlZCBtX21hdHJpeDsKK307CisKKworLyoqIFxyZXR1cm5zIGEgQ3dpc2Ugd3JhcHBlciBvZiAqdGhpcyBwcm92aWRpbmcgYWRkaXRpb25hbCBjb2VmZmljaWVudC13aXNlIG9wZXJhdGlvbnMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfY3dpc2VfY29uc3QuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZV9jb25zdC5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZSwgY3dpc2UoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBDd2lzZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjd2lzZSgpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBccmV0dXJucyBhIEN3aXNlIHdyYXBwZXIgb2YgKnRoaXMgcHJvdmlkaW5nIGFkZGl0aW9uYWwgY29lZmZpY2llbnQtd2lzZSBvcGVyYXRpb25zCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfY3dpc2Uub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2UsIGN3aXNlKCkgY29uc3QKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgQ3dpc2U8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6Y3dpc2UoKQoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NXSVNFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0N3aXNlT3BlcmF0b3JzLmggYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9Dd2lzZU9wZXJhdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmYzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9Dd2lzZU9wZXJhdG9ycy5oCkBAIC0wLDAgKzEsMjk4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQVJSQVlfQ1dJU0VfT1BFUkFUT1JTX0gKKyNkZWZpbmUgRUlHRU5fQVJSQVlfQ1dJU0VfT1BFUkFUT1JTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2VyZSBkZWZpbmVkIGluIENvcmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjphYnMoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEVJR0VOX0NXSVNFX1VOT1BfUkVUVVJOX1RZUEUoaW50ZXJuYWw6OnNjYWxhcl9hYnNfb3ApCitDd2lzZTxFeHByZXNzaW9uVHlwZT46OmFicygpIGNvbnN0Cit7CisgIHJldHVybiBfZXhwcmVzc2lvbigpOworfQorCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjphYnMyKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfYWJzMl9vcCkKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6YWJzMigpIGNvbnN0Cit7CisgIHJldHVybiBfZXhwcmVzc2lvbigpOworfQorCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjpleHAoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX2V4cF9vcCkKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6ZXhwKCkgY29uc3QKK3sKKyAgcmV0dXJuIF9leHByZXNzaW9uKCk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6OmxvZygpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK2lubGluZSBjb25zdCBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfbG9nX29wKQorQ3dpc2U8RXhwcmVzc2lvblR5cGU+Ojpsb2coKSBjb25zdAoreworICByZXR1cm4gX2V4cHJlc3Npb24oKTsKK30KKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6b3BlcmF0b3IqKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBFSUdFTl9DV0lTRV9QUk9EVUNUX1JFVFVSTl9UWVBFKEV4cHJlc3Npb25UeXBlLE90aGVyRGVyaXZlZCkKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6b3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBFSUdFTl9DV0lTRV9QUk9EVUNUX1JFVFVSTl9UWVBFKEV4cHJlc3Npb25UeXBlLE90aGVyRGVyaXZlZCkoX2V4cHJlc3Npb24oKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6b3BlcmF0b3IvKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50X29wKQorQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpvcGVyYXRvci8oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIEVJR0VOX0NXSVNFX0JJTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfcXVvdGllbnRfb3ApKF9leHByZXNzaW9uKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6Om9wZXJhdG9yKj0oKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgRXhwcmVzc2lvblR5cGUmIEN3aXNlPEV4cHJlc3Npb25UeXBlPjo6b3BlcmF0b3IqPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkgPSAqdGhpcyAqIG90aGVyOworfQorCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjpvcGVyYXRvci89KCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgoraW5saW5lIEV4cHJlc3Npb25UeXBlJiBDd2lzZTxFeHByZXNzaW9uVHlwZT46Om9wZXJhdG9yLz0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKK3sKKyAgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpID0gKnRoaXMgLyBvdGhlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3ZXJlIGRlZmluZWQgaW4gQXJyYXkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gLS0gdW5hcnkgb3BlcmF0b3JzIC0tCisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6OnNxcnQoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX3NxcnRfb3ApCitDd2lzZTxFeHByZXNzaW9uVHlwZT46OnNxcnQoKSBjb25zdAoreworICByZXR1cm4gX2V4cHJlc3Npb24oKTsKK30KKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6Y29zKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgoraW5saW5lIGNvbnN0IEVJR0VOX0NXSVNFX1VOT1BfUkVUVVJOX1RZUEUoaW50ZXJuYWw6OnNjYWxhcl9jb3Nfb3ApCitDd2lzZTxFeHByZXNzaW9uVHlwZT46OmNvcygpIGNvbnN0Cit7CisgIHJldHVybiBfZXhwcmVzc2lvbigpOworfQorCisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6OnNpbigpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK2lubGluZSBjb25zdCBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfc2luX29wKQorQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpzaW4oKSBjb25zdAoreworICByZXR1cm4gX2V4cHJlc3Npb24oKTsKK30KKworCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjpsb2coKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX3Bvd19vcCkKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6cG93KGNvbnN0IFNjYWxhciYgZXhwb25lbnQpIGNvbnN0Cit7CisgIHJldHVybiBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfcG93X29wKShfZXhwcmVzc2lvbigpLCBpbnRlcm5hbDo6c2NhbGFyX3Bvd19vcDxTY2FsYXI+KGV4cG9uZW50KSk7Cit9CisKKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6aW52ZXJzZSgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK2lubGluZSBjb25zdCBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFKGludGVybmFsOjpzY2FsYXJfaW52ZXJzZV9vcCkKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6aW52ZXJzZSgpIGNvbnN0Cit7CisgIHJldHVybiBfZXhwcmVzc2lvbigpOworfQorCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjpzcXVhcmUoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX3NxdWFyZV9vcCkKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6c3F1YXJlKCkgY29uc3QKK3sKKyAgcmV0dXJuIF9leHByZXNzaW9uKCk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6OmN1YmUoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRShpbnRlcm5hbDo6c2NhbGFyX2N1YmVfb3ApCitDd2lzZTxFeHByZXNzaW9uVHlwZT46OmN1YmUoKSBjb25zdAoreworICByZXR1cm4gX2V4cHJlc3Npb24oKTsKK30KKworCisvLyAtLSBiaW5hcnkgb3BlcmF0b3JzIC0tCisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6Om9wZXJhdG9yPCgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBjb25zdCBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShzdGQ6Omxlc3MpCitDd2lzZTxFeHByZXNzaW9uVHlwZT46Om9wZXJhdG9yPChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUoc3RkOjpsZXNzKShfZXhwcmVzc2lvbigpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjo8PSgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBjb25zdCBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShzdGQ6Omxlc3NfZXF1YWwpCitDd2lzZTxFeHByZXNzaW9uVHlwZT46Om9wZXJhdG9yPD0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIEVJR0VOX0NXSVNFX0JJTk9QX1JFVFVSTl9UWVBFKHN0ZDo6bGVzc19lcXVhbCkoX2V4cHJlc3Npb24oKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6b3BlcmF0b3I+KCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgoraW5saW5lIGNvbnN0IEVJR0VOX0NXSVNFX0JJTk9QX1JFVFVSTl9UWVBFKHN0ZDo6Z3JlYXRlcikKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6b3BlcmF0b3I+KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShzdGQ6OmdyZWF0ZXIpKF9leHByZXNzaW9uKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6Om9wZXJhdG9yPj0oKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUoc3RkOjpncmVhdGVyX2VxdWFsKQorQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpvcGVyYXRvcj49KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShzdGQ6OmdyZWF0ZXJfZXF1YWwpKF9leHByZXNzaW9uKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6Om9wZXJhdG9yPT0oKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUoc3RkOjplcXVhbF90bykKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6b3BlcmF0b3I9PShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUoc3RkOjplcXVhbF90bykoX2V4cHJlc3Npb24oKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6b3BlcmF0b3IhPSgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBjb25zdCBFSUdFTl9DV0lTRV9CSU5PUF9SRVRVUk5fVFlQRShzdGQ6Om5vdF9lcXVhbF90bykKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6b3BlcmF0b3IhPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUoc3RkOjpub3RfZXF1YWxfdG8pKF9leHByZXNzaW9uKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8vIGNvbXBhcmlzb25zIHRvIHNjYWxhciB2YWx1ZQorCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjpvcGVyYXRvcjwoU2NhbGFyKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfQ09NUF9UT19TQ0FMQVJfUkVUVVJOX1RZUEUoc3RkOjpsZXNzKQorQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpvcGVyYXRvcjwoU2NhbGFyIHMpIGNvbnN0Cit7CisgIHJldHVybiBFSUdFTl9DV0lTRV9DT01QX1RPX1NDQUxBUl9SRVRVUk5fVFlQRShzdGQ6Omxlc3MpKF9leHByZXNzaW9uKCksCisgICAgICAgICAgICB0eXBlbmFtZSBFeHByZXNzaW9uVHlwZTo6Q29uc3RhbnRSZXR1cm5UeXBlKF9leHByZXNzaW9uKCkucm93cygpLCBfZXhwcmVzc2lvbigpLmNvbHMoKSwgcykpOworfQorCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjpvcGVyYXRvcjw9KFNjYWxhcikgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgoraW5saW5lIGNvbnN0IEVJR0VOX0NXSVNFX0NPTVBfVE9fU0NBTEFSX1JFVFVSTl9UWVBFKHN0ZDo6bGVzc19lcXVhbCkKK0N3aXNlPEV4cHJlc3Npb25UeXBlPjo6b3BlcmF0b3I8PShTY2FsYXIgcykgY29uc3QKK3sKKyAgcmV0dXJuIEVJR0VOX0NXSVNFX0NPTVBfVE9fU0NBTEFSX1JFVFVSTl9UWVBFKHN0ZDo6bGVzc19lcXVhbCkoX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpDb25zdGFudFJldHVyblR5cGUoX2V4cHJlc3Npb24oKS5yb3dzKCksIF9leHByZXNzaW9uKCkuY29scygpLCBzKSk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6Om9wZXJhdG9yPihTY2FsYXIpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK2lubGluZSBjb25zdCBFSUdFTl9DV0lTRV9DT01QX1RPX1NDQUxBUl9SRVRVUk5fVFlQRShzdGQ6OmdyZWF0ZXIpCitDd2lzZTxFeHByZXNzaW9uVHlwZT46Om9wZXJhdG9yPihTY2FsYXIgcykgY29uc3QKK3sKKyAgcmV0dXJuIEVJR0VOX0NXSVNFX0NPTVBfVE9fU0NBTEFSX1JFVFVSTl9UWVBFKHN0ZDo6Z3JlYXRlcikoX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpDb25zdGFudFJldHVyblR5cGUoX2V4cHJlc3Npb24oKS5yb3dzKCksIF9leHByZXNzaW9uKCkuY29scygpLCBzKSk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6Om9wZXJhdG9yPj0oU2NhbGFyKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfQ09NUF9UT19TQ0FMQVJfUkVUVVJOX1RZUEUoc3RkOjpncmVhdGVyX2VxdWFsKQorQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpvcGVyYXRvcj49KFNjYWxhciBzKSBjb25zdAoreworICByZXR1cm4gRUlHRU5fQ1dJU0VfQ09NUF9UT19TQ0FMQVJfUkVUVVJOX1RZUEUoc3RkOjpncmVhdGVyX2VxdWFsKShfZXhwcmVzc2lvbigpLAorICAgICAgICAgICAgdHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6OkNvbnN0YW50UmV0dXJuVHlwZShfZXhwcmVzc2lvbigpLnJvd3MoKSwgX2V4cHJlc3Npb24oKS5jb2xzKCksIHMpKTsKK30KKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6b3BlcmF0b3I9PShTY2FsYXIpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK2lubGluZSBjb25zdCBFSUdFTl9DV0lTRV9DT01QX1RPX1NDQUxBUl9SRVRVUk5fVFlQRShzdGQ6OmVxdWFsX3RvKQorQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpvcGVyYXRvcj09KFNjYWxhciBzKSBjb25zdAoreworICByZXR1cm4gRUlHRU5fQ1dJU0VfQ09NUF9UT19TQ0FMQVJfUkVUVVJOX1RZUEUoc3RkOjplcXVhbF90bykoX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpDb25zdGFudFJldHVyblR5cGUoX2V4cHJlc3Npb24oKS5yb3dzKCksIF9leHByZXNzaW9uKCkuY29scygpLCBzKSk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCBBcnJheUJhc2U6Om9wZXJhdG9yIT0oU2NhbGFyKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitpbmxpbmUgY29uc3QgRUlHRU5fQ1dJU0VfQ09NUF9UT19TQ0FMQVJfUkVUVVJOX1RZUEUoc3RkOjpub3RfZXF1YWxfdG8pCitDd2lzZTxFeHByZXNzaW9uVHlwZT46Om9wZXJhdG9yIT0oU2NhbGFyIHMpIGNvbnN0Cit7CisgIHJldHVybiBFSUdFTl9DV0lTRV9DT01QX1RPX1NDQUxBUl9SRVRVUk5fVFlQRShzdGQ6Om5vdF9lcXVhbF90bykoX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgIHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlOjpDb25zdGFudFJldHVyblR5cGUoX2V4cHJlc3Npb24oKS5yb3dzKCksIF9leHByZXNzaW9uKCkuY29scygpLCBzKSk7Cit9CisKKy8vIHNjYWxhciBhZGRpdGlvbgorCisvKiogXGRlcHJlY2F0ZWQgQXJyYXlCYXNlOjpvcGVyYXRvcisoU2NhbGFyKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGU+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpTY2FsYXJBZGRSZXR1cm5UeXBlCitDd2lzZTxFeHByZXNzaW9uVHlwZT46Om9wZXJhdG9yKyhjb25zdCBTY2FsYXImIHNjYWxhcikgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIEN3aXNlPEV4cHJlc3Npb25UeXBlPjo6U2NhbGFyQWRkUmV0dXJuVHlwZShtX21hdHJpeCwgaW50ZXJuYWw6OnNjYWxhcl9hZGRfb3A8U2NhbGFyPihzY2FsYXIpKTsKK30KKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6b3BlcmF0b3IrPShTY2FsYXIpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK2lubGluZSBFeHByZXNzaW9uVHlwZSYgQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpvcGVyYXRvcis9KGNvbnN0IFNjYWxhciYgc2NhbGFyKQoreworICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkgPSAqdGhpcyArIHNjYWxhcjsKK30KKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6b3BlcmF0b3ItKFNjYWxhcikgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIEN3aXNlPEV4cHJlc3Npb25UeXBlPjo6U2NhbGFyQWRkUmV0dXJuVHlwZQorQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpvcGVyYXRvci0oY29uc3QgU2NhbGFyJiBzY2FsYXIpIGNvbnN0Cit7CisgIHJldHVybiAqdGhpcyArICgtc2NhbGFyKTsKK30KKworLyoqIFxkZXByZWNhdGVkIEFycmF5QmFzZTo6b3BlcmF0b3ItPShTY2FsYXIpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZT4KK2lubGluZSBFeHByZXNzaW9uVHlwZSYgQ3dpc2U8RXhwcmVzc2lvblR5cGU+OjpvcGVyYXRvci09KGNvbnN0IFNjYWxhciYgc2NhbGFyKQoreworICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkgPSAqdGhpcyAtIHNjYWxhcjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9BUlJBWV9DV0lTRV9PUEVSQVRPUlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvQWxpZ25lZEJveC5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvQWxpZ25lZEJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTI4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9BbGlnbmVkQm94LmgKQEAgLTAsMCArMSwxNTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIG5vIGluY2x1ZGUgZ3VhcmQsIHdlJ2xsIGluY2x1ZGUgdGhpcyB0d2ljZSBmcm9tIEFsbC5oIGZyb20gRWlnZW4yU3VwcG9ydCwgYW5kIGl0J3MgaW50ZXJuYWwgYW55d2F5CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBcbm9uc3RhYmxleWV0CisgICoKKyAgKiBcY2xhc3MgQWxpZ25lZEJveAorICAqCisgICogXGJyaWVmIEFuIGF4aXMgYWxpZ25lZCBib3gKKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSB0eXBlIG9mIHRoZSBzY2FsYXIgY29lZmZpY2llbnRzCisgICogXHBhcmFtIF9BbWJpZW50RGltIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFtYmllbnQgc3BhY2UsIGNhbiBiZSBhIGNvbXBpbGUgdGltZSB2YWx1ZSBvciBEeW5hbWljLgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGF4aXMgYWxpZ25lZCBib3ggYXMgYSBwYWlyIG9mIHRoZSBtaW5pbWFsIGFuZCBtYXhpbWFsIGNvcm5lcnMuCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9BbWJpZW50RGltPgorY2xhc3MgQWxpZ25lZEJveAoreworcHVibGljOgorRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRl9WRUNUT1JJWkFCTEVfRklYRURfU0laRShfU2NhbGFyLF9BbWJpZW50RGltPT1EeW5hbWljID8gRHluYW1pYyA6IF9BbWJpZW50RGltKzEpCisgIGVudW0geyBBbWJpZW50RGltQXRDb21waWxlVGltZSA9IF9BbWJpZW50RGltIH07CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLDE+IFZlY3RvclR5cGU7CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgaW5pdGlhbGl6aW5nIGEgbnVsbCBib3guICovCisgIGlubGluZSBleHBsaWNpdCBBbGlnbmVkQm94KCkKKyAgeyBpZiAoQW1iaWVudERpbUF0Q29tcGlsZVRpbWUhPUR5bmFtaWMpIHNldE51bGwoKTsgfQorCisgIC8qKiBDb25zdHJ1Y3RzIGEgbnVsbCBib3ggd2l0aCBcYSBfZGltIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFtYmllbnQgc3BhY2UuICovCisgIGlubGluZSBleHBsaWNpdCBBbGlnbmVkQm94KGludCBfZGltKSA6IG1fbWluKF9kaW0pLCBtX21heChfZGltKQorICB7IHNldE51bGwoKTsgfQorCisgIC8qKiBDb25zdHJ1Y3RzIGEgYm94IHdpdGggZXh0cmVtaXRpZXMgXGEgX21pbiBhbmQgXGEgX21heC4gKi8KKyAgaW5saW5lIEFsaWduZWRCb3goY29uc3QgVmVjdG9yVHlwZSYgX21pbiwgY29uc3QgVmVjdG9yVHlwZSYgX21heCkgOiBtX21pbihfbWluKSwgbV9tYXgoX21heCkge30KKworICAvKiogQ29uc3RydWN0cyBhIGJveCBjb250YWluaW5nIGEgc2luZ2xlIHBvaW50IFxhIHAuICovCisgIGlubGluZSBleHBsaWNpdCBBbGlnbmVkQm94KGNvbnN0IFZlY3RvclR5cGUmIHApIDogbV9taW4ocCksIG1fbWF4KHApIHt9CisKKyAgfkFsaWduZWRCb3goKSB7fQorCisgIC8qKiBccmV0dXJucyB0aGUgZGltZW5zaW9uIGluIHdoaWNoIHRoZSBib3ggaG9sZHMgKi8KKyAgaW5saW5lIGludCBkaW0oKSBjb25zdCB7IHJldHVybiBBbWJpZW50RGltQXRDb21waWxlVGltZT09RHluYW1pYyA/IG1fbWluLnNpemUoKS0xIDogQW1iaWVudERpbUF0Q29tcGlsZVRpbWU7IH0KKworICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgYm94IGlzIG51bGwsIGkuZSwgZW1wdHkuICovCisgIGlubGluZSBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIChtX21pbi5jd2lzZSgpID4gbV9tYXgpLmFueSgpOyB9CisKKyAgLyoqIE1ha2VzIFxjICp0aGlzIGEgbnVsbC9lbXB0eSBib3guICovCisgIGlubGluZSB2b2lkIHNldE51bGwoKQorICB7CisgICAgbV9taW4uc2V0Q29uc3RhbnQoIChzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1heCkoKSk7CisgICAgbV9tYXguc2V0Q29uc3RhbnQoLShzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1heCkoKSk7CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIG1pbmltYWwgY29ybmVyICovCisgIGlubGluZSBjb25zdCBWZWN0b3JUeXBlJiAobWluKSgpIGNvbnN0IHsgcmV0dXJuIG1fbWluOyB9CisgIC8qKiBccmV0dXJucyBhIG5vbiBjb25zdCByZWZlcmVuY2UgdG8gdGhlIG1pbmltYWwgY29ybmVyICovCisgIGlubGluZSBWZWN0b3JUeXBlJiAobWluKSgpIHsgcmV0dXJuIG1fbWluOyB9CisgIC8qKiBccmV0dXJucyB0aGUgbWF4aW1hbCBjb3JuZXIgKi8KKyAgaW5saW5lIGNvbnN0IFZlY3RvclR5cGUmIChtYXgpKCkgY29uc3QgeyByZXR1cm4gbV9tYXg7IH0KKyAgLyoqIFxyZXR1cm5zIGEgbm9uIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF4aW1hbCBjb3JuZXIgKi8KKyAgaW5saW5lIFZlY3RvclR5cGUmIChtYXgpKCkgeyByZXR1cm4gbV9tYXg7IH0KKworICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgcG9pbnQgXGEgcCBpcyBpbnNpZGUgdGhlIGJveCBcYyAqdGhpcy4gKi8KKyAgaW5saW5lIGJvb2wgY29udGFpbnMoY29uc3QgVmVjdG9yVHlwZSYgcCkgY29uc3QKKyAgeyByZXR1cm4gKG1fbWluLmN3aXNlKCk8PXApLmFsbCgpICYmIChwLmN3aXNlKCk8PW1fbWF4KS5hbGwoKTsgfQorCisgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBib3ggXGEgYiBpcyBlbnRpcmVseSBpbnNpZGUgdGhlIGJveCBcYyAqdGhpcy4gKi8KKyAgaW5saW5lIGJvb2wgY29udGFpbnMoY29uc3QgQWxpZ25lZEJveCYgYikgY29uc3QKKyAgeyByZXR1cm4gKG1fbWluLmN3aXNlKCk8PShiLm1pbikoKSkuYWxsKCkgJiYgKChiLm1heCkoKS5jd2lzZSgpPD1tX21heCkuYWxsKCk7IH0KKworICAvKiogRXh0ZW5kcyBcYyAqdGhpcyBzdWNoIHRoYXQgaXQgY29udGFpbnMgdGhlIHBvaW50IFxhIHAgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuICovCisgIGlubGluZSBBbGlnbmVkQm94JiBleHRlbmQoY29uc3QgVmVjdG9yVHlwZSYgcCkKKyAgeyBtX21pbiA9IChtX21pbi5jd2lzZSgpLm1pbikocCk7IG1fbWF4ID0gKG1fbWF4LmN3aXNlKCkubWF4KShwKTsgcmV0dXJuICp0aGlzOyB9CisKKyAgLyoqIEV4dGVuZHMgXGMgKnRoaXMgc3VjaCB0aGF0IGl0IGNvbnRhaW5zIHRoZSBib3ggXGEgYiBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4gKi8KKyAgaW5saW5lIEFsaWduZWRCb3gmIGV4dGVuZChjb25zdCBBbGlnbmVkQm94JiBiKQorICB7IG1fbWluID0gKG1fbWluLmN3aXNlKCkubWluKShiLm1fbWluKTsgbV9tYXggPSAobV9tYXguY3dpc2UoKS5tYXgpKGIubV9tYXgpOyByZXR1cm4gKnRoaXM7IH0KKworICAvKiogQ2xhbXBzIFxjICp0aGlzIGJ5IHRoZSBib3ggXGEgYiBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4gKi8KKyAgaW5saW5lIEFsaWduZWRCb3gmIGNsYW1wKGNvbnN0IEFsaWduZWRCb3gmIGIpCisgIHsgbV9taW4gPSAobV9taW4uY3dpc2UoKS5tYXgpKGIubV9taW4pOyBtX21heCA9IChtX21heC5jd2lzZSgpLm1pbikoYi5tX21heCk7IHJldHVybiAqdGhpczsgfQorCisgIC8qKiBUcmFuc2xhdGUgXGMgKnRoaXMgYnkgdGhlIHZlY3RvciBcYSB0IGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLiAqLworICBpbmxpbmUgQWxpZ25lZEJveCYgdHJhbnNsYXRlKGNvbnN0IFZlY3RvclR5cGUmIHQpCisgIHsgbV9taW4gKz0gdDsgbV9tYXggKz0gdDsgcmV0dXJuICp0aGlzOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IFxhIHAgYW5kIHRoZSBib3ggXGMgKnRoaXMsCisgICAgKiBhbmQgemVybyBpZiBcYSBwIGlzIGluc2lkZSB0aGUgYm94LgorICAgICogXHNhIGV4dGVyaW9yRGlzdGFuY2UoKQorICAgICovCisgIGlubGluZSBTY2FsYXIgc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UoY29uc3QgVmVjdG9yVHlwZSYgcCkgY29uc3Q7CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBcYSBwIGFuZCB0aGUgYm94IFxjICp0aGlzLAorICAgICogYW5kIHplcm8gaWYgXGEgcCBpcyBpbnNpZGUgdGhlIGJveC4KKyAgICAqIFxzYSBzcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZSgpCisgICAgKi8KKyAgaW5saW5lIFNjYWxhciBleHRlcmlvckRpc3RhbmNlKGNvbnN0IFZlY3RvclR5cGUmIHApIGNvbnN0CisgIHsgcmV0dXJuIGVpX3NxcnQoc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UocCkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIFxjICp0aGlzIHdpdGggc2NhbGFyIHR5cGUgY2FzdGVkIHRvIFxhIE5ld1NjYWxhclR5cGUKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgaWYgXGEgTmV3U2NhbGFyVHlwZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzY2FsYXIgdHlwZSBvZiBcYyAqdGhpcworICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHNtYXJ0bHkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdTY2FsYXJUeXBlPgorICBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8QWxpZ25lZEJveCwKKyAgICAgICAgICAgQWxpZ25lZEJveDxOZXdTY2FsYXJUeXBlLEFtYmllbnREaW1BdENvbXBpbGVUaW1lPiA+Ojp0eXBlIGNhc3QoKSBjb25zdAorICB7CisgICAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPEFsaWduZWRCb3gsCisgICAgICAgICAgICAgICAgICAgIEFsaWduZWRCb3g8TmV3U2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZT4gPjo6dHlwZSgqdGhpcyk7CisgIH0KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciB3aXRoIHNjYWxhciB0eXBlIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXJUeXBlPgorICBpbmxpbmUgZXhwbGljaXQgQWxpZ25lZEJveChjb25zdCBBbGlnbmVkQm94PE90aGVyU2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZT4mIG90aGVyKQorICB7CisgICAgbV9taW4gPSAob3RoZXIubWluKSgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICAgIG1fbWF4ID0gKG90aGVyLm1heCkoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgYm9vbCBpc0FwcHJveChjb25zdCBBbGlnbmVkQm94JiBvdGhlciwgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcHJlYyA9IHByZWNpc2lvbjxTY2FsYXI+KCkpIGNvbnN0CisgIHsgcmV0dXJuIG1fbWluLmlzQXBwcm94KG90aGVyLm1fbWluLCBwcmVjKSAmJiBtX21heC5pc0FwcHJveChvdGhlci5tX21heCwgcHJlYyk7IH0KKworcHJvdGVjdGVkOgorCisgIFZlY3RvclR5cGUgbV9taW4sIG1fbWF4OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBBbWJpYW50RGltPgoraW5saW5lIFNjYWxhciBBbGlnbmVkQm94PFNjYWxhcixBbWJpYW50RGltPjo6c3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UoY29uc3QgVmVjdG9yVHlwZSYgcCkgY29uc3QKK3sKKyAgU2NhbGFyIGRpc3QyKDApOworICBTY2FsYXIgYXV4OworICBmb3IgKGludCBrPTA7IGs8ZGltKCk7ICsraykKKyAgeworICAgIGlmICgoYXV4ID0gKHBba10tbV9taW5ba10pKTxTY2FsYXIoMCkpCisgICAgICBkaXN0MiArPSBhdXgqYXV4OworICAgIGVsc2UgaWYgKCAoYXV4ID0gKG1fbWF4W2tdLXBba10pKTxTY2FsYXIoMCkpCisgICAgICBkaXN0MiArPSBhdXgqYXV4OworICB9CisgIHJldHVybiBkaXN0MjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9BbGwuaCBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0dlb21ldHJ5L0FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjAwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9BbGwuaApAQCAtMCwwICsxLDExNSBAQAorI2lmbmRlZiBFSUdFTjJfR0VPTUVUUllfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU4yX0dFT01FVFJZX01PRFVMRV9ICisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpZm5kZWYgTV9QSQorI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCisjaWYgRUlHRU4yX1NVUFBPUlRfU1RBR0UgPCBTVEFHRTIwX1JFU09MVkVfQVBJX0NPTkZMSUNUUworI2luY2x1ZGUgIlJvdGF0aW9uQmFzZS5oIgorI2luY2x1ZGUgIlJvdGF0aW9uMkQuaCIKKyNpbmNsdWRlICJRdWF0ZXJuaW9uLmgiCisjaW5jbHVkZSAiQW5nbGVBeGlzLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiVHJhbnNsYXRpb24uaCIKKyNpbmNsdWRlICJTY2FsaW5nLmgiCisjaW5jbHVkZSAiQWxpZ25lZEJveC5oIgorI2luY2x1ZGUgIkh5cGVycGxhbmUuaCIKKyNpbmNsdWRlICJQYXJhbWV0cml6ZWRMaW5lLmgiCisjZW5kaWYKKworCisjZGVmaW5lIFJvdGF0aW9uQmFzZSBlaWdlbjJfUm90YXRpb25CYXNlCisjZGVmaW5lIFJvdGF0aW9uMkQgZWlnZW4yX1JvdGF0aW9uMkQKKyNkZWZpbmUgUm90YXRpb24yRGYgZWlnZW4yX1JvdGF0aW9uMkRmCisjZGVmaW5lIFJvdGF0aW9uMkRkIGVpZ2VuMl9Sb3RhdGlvbjJEZAorCisjZGVmaW5lIFF1YXRlcm5pb24gIGVpZ2VuMl9RdWF0ZXJuaW9uCisjZGVmaW5lIFF1YXRlcm5pb25mIGVpZ2VuMl9RdWF0ZXJuaW9uZgorI2RlZmluZSBRdWF0ZXJuaW9uZCBlaWdlbjJfUXVhdGVybmlvbmQKKworI2RlZmluZSBBbmdsZUF4aXMgZWlnZW4yX0FuZ2xlQXhpcworI2RlZmluZSBBbmdsZUF4aXNmIGVpZ2VuMl9BbmdsZUF4aXNmCisjZGVmaW5lIEFuZ2xlQXhpc2QgZWlnZW4yX0FuZ2xlQXhpc2QKKworI2RlZmluZSBUcmFuc2Zvcm0gICBlaWdlbjJfVHJhbnNmb3JtCisjZGVmaW5lIFRyYW5zZm9ybTJmIGVpZ2VuMl9UcmFuc2Zvcm0yZgorI2RlZmluZSBUcmFuc2Zvcm0yZCBlaWdlbjJfVHJhbnNmb3JtMmQKKyNkZWZpbmUgVHJhbnNmb3JtM2YgZWlnZW4yX1RyYW5zZm9ybTNmCisjZGVmaW5lIFRyYW5zZm9ybTNkIGVpZ2VuMl9UcmFuc2Zvcm0zZAorCisjZGVmaW5lIFRyYW5zbGF0aW9uIGVpZ2VuMl9UcmFuc2xhdGlvbgorI2RlZmluZSBUcmFuc2xhdGlvbjJmIGVpZ2VuMl9UcmFuc2xhdGlvbjJmCisjZGVmaW5lIFRyYW5zbGF0aW9uMmQgZWlnZW4yX1RyYW5zbGF0aW9uMmQKKyNkZWZpbmUgVHJhbnNsYXRpb24zZiBlaWdlbjJfVHJhbnNsYXRpb24zZgorI2RlZmluZSBUcmFuc2xhdGlvbjNkIGVpZ2VuMl9UcmFuc2xhdGlvbjNkCisKKyNkZWZpbmUgU2NhbGluZyBlaWdlbjJfU2NhbGluZworI2RlZmluZSBTY2FsaW5nMmYgZWlnZW4yX1NjYWxpbmcyZgorI2RlZmluZSBTY2FsaW5nMmQgZWlnZW4yX1NjYWxpbmcyZAorI2RlZmluZSBTY2FsaW5nM2YgZWlnZW4yX1NjYWxpbmczZgorI2RlZmluZSBTY2FsaW5nM2QgZWlnZW4yX1NjYWxpbmczZAorCisjZGVmaW5lIEFsaWduZWRCb3ggZWlnZW4yX0FsaWduZWRCb3gKKworI2RlZmluZSBIeXBlcnBsYW5lIGVpZ2VuMl9IeXBlcnBsYW5lCisjZGVmaW5lIFBhcmFtZXRyaXplZExpbmUgZWlnZW4yX1BhcmFtZXRyaXplZExpbmUKKworI2RlZmluZSBlaV90b1JvdGF0aW9uTWF0cml4IGVpZ2VuMl9laV90b1JvdGF0aW9uTWF0cml4CisjZGVmaW5lIGVpX3F1YXRlcm5pb25fYXNzaWduX2ltcGwgZWlnZW4yX2VpX3F1YXRlcm5pb25fYXNzaWduX2ltcGwKKyNkZWZpbmUgZWlfdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbCBlaWdlbjJfZWlfdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbAorCisjaW5jbHVkZSAiUm90YXRpb25CYXNlLmgiCisjaW5jbHVkZSAiUm90YXRpb24yRC5oIgorI2luY2x1ZGUgIlF1YXRlcm5pb24uaCIKKyNpbmNsdWRlICJBbmdsZUF4aXMuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJUcmFuc2xhdGlvbi5oIgorI2luY2x1ZGUgIlNjYWxpbmcuaCIKKyNpbmNsdWRlICJBbGlnbmVkQm94LmgiCisjaW5jbHVkZSAiSHlwZXJwbGFuZS5oIgorI2luY2x1ZGUgIlBhcmFtZXRyaXplZExpbmUuaCIKKworI3VuZGVmIGVpX3RvUm90YXRpb25NYXRyaXgKKyN1bmRlZiBlaV9xdWF0ZXJuaW9uX2Fzc2lnbl9pbXBsCisjdW5kZWYgZWlfdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbAorCisjdW5kZWYgUm90YXRpb25CYXNlCisjdW5kZWYgUm90YXRpb24yRAorI3VuZGVmIFJvdGF0aW9uMkRmCisjdW5kZWYgUm90YXRpb24yRGQKKworI3VuZGVmIFF1YXRlcm5pb24KKyN1bmRlZiBRdWF0ZXJuaW9uZgorI3VuZGVmIFF1YXRlcm5pb25kCisKKyN1bmRlZiBBbmdsZUF4aXMKKyN1bmRlZiBBbmdsZUF4aXNmCisjdW5kZWYgQW5nbGVBeGlzZAorCisjdW5kZWYgVHJhbnNmb3JtCisjdW5kZWYgVHJhbnNmb3JtMmYKKyN1bmRlZiBUcmFuc2Zvcm0yZAorI3VuZGVmIFRyYW5zZm9ybTNmCisjdW5kZWYgVHJhbnNmb3JtM2QKKworI3VuZGVmIFRyYW5zbGF0aW9uCisjdW5kZWYgVHJhbnNsYXRpb24yZgorI3VuZGVmIFRyYW5zbGF0aW9uMmQKKyN1bmRlZiBUcmFuc2xhdGlvbjNmCisjdW5kZWYgVHJhbnNsYXRpb24zZAorCisjdW5kZWYgU2NhbGluZworI3VuZGVmIFNjYWxpbmcyZgorI3VuZGVmIFNjYWxpbmcyZAorI3VuZGVmIFNjYWxpbmczZgorI3VuZGVmIFNjYWxpbmczZAorCisjdW5kZWYgQWxpZ25lZEJveAorCisjdW5kZWYgSHlwZXJwbGFuZQorI3VuZGVmIFBhcmFtZXRyaXplZExpbmUKKworI2VuZGlmIC8vIEVJR0VOMl9HRU9NRVRSWV9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvQW5nbGVBeGlzLmggYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9BbmdsZUF4aXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGYxZmNlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvQW5nbGVBeGlzLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIG5vIGluY2x1ZGUgZ3VhcmQsIHdlJ2xsIGluY2x1ZGUgdGhpcyB0d2ljZSBmcm9tIEFsbC5oIGZyb20gRWlnZW4yU3VwcG9ydCwgYW5kIGl0J3MgaW50ZXJuYWwgYW55d2F5CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBBbmdsZUF4aXMKKyAgKgorICAqIFxicmllZiBSZXByZXNlbnRzIGEgM0Qgcm90YXRpb24gYXMgYSByb3RhdGlvbiBhbmdsZSBhcm91bmQgYW4gYXJiaXRyYXJ5IDNEIGF4aXMKKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cy4KKyAgKgorICAqIFRoZSBmb2xsb3dpbmcgdHdvIHR5cGVkZWZzIGFyZSBwcm92aWRlZCBmb3IgY29udmVuaWVuY2U6CisgICogXGxpIFxjIEFuZ2xlQXhpc2YgZm9yIFxjIGZsb2F0CisgICogXGxpIFxjIEFuZ2xlQXhpc2QgZm9yIFxjIGRvdWJsZQorICAqCisgICogXGFkZGV4YW1wbGUgQW5nbGVBeGlzRm9yRXVsZXIgXGxhYmVsIEhvdyB0byBkZWZpbmUgYSByb3RhdGlvbiBmcm9tIEV1bGVyLWFuZ2xlcworICAqCisgICogQ29tYmluZWQgd2l0aCBNYXRyaXhCYXNlOjpVbml0e1gsWSxafSwgQW5nbGVBeGlzIGNhbiBiZSB1c2VkIHRvIGVhc2lseQorICAqIG1pbWljIEV1bGVyLWFuZ2xlcy4gSGVyZSBpcyBhbiBleGFtcGxlOgorICAqIFxpbmNsdWRlIEFuZ2xlQXhpc19taW1pY19ldWxlci5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBBbmdsZUF4aXNfbWltaWNfZXVsZXIub3V0CisgICoKKyAgKiBcbm90ZSBUaGlzIGNsYXNzIGlzIG5vdCBhaW1lZCB0byBiZSB1c2VkIHRvIHN0b3JlIGEgcm90YXRpb24gdHJhbnNmb3JtYXRpb24sCisgICogYnV0IHJhdGhlciB0byBtYWtlIGVhc2llciB0aGUgY3JlYXRpb24gb2Ygb3RoZXIgcm90YXRpb24gKFF1YXRlcm5pb24sIHJvdGF0aW9uIE1hdHJpeCkKKyAgKiBhbmQgdHJhbnNmb3JtYXRpb24gb2JqZWN0cy4KKyAgKgorICAqIFxzYSBjbGFzcyBRdWF0ZXJuaW9uLCBjbGFzcyBUcmFuc2Zvcm0sIE1hdHJpeEJhc2U6OlVuaXRYKCkKKyAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4gc3RydWN0IGVpX3RyYWl0czxBbmdsZUF4aXM8X1NjYWxhcj4gPgoreworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4KK2NsYXNzIEFuZ2xlQXhpcyA6IHB1YmxpYyBSb3RhdGlvbkJhc2U8QW5nbGVBeGlzPF9TY2FsYXI+LDM+Cit7CisgIHR5cGVkZWYgUm90YXRpb25CYXNlPEFuZ2xlQXhpczxfU2NhbGFyPiwzPiBCYXNlOworCitwdWJsaWM6CisKKyAgdXNpbmcgQmFzZTo6b3BlcmF0b3IqOworCisgIGVudW0geyBEaW0gPSAzIH07CisgIC8qKiB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cyAqLworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9uVHlwZTsKKworcHJvdGVjdGVkOgorCisgIFZlY3RvcjMgbV9heGlzOworICBTY2FsYXIgbV9hbmdsZTsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uICovCisgIEFuZ2xlQXhpcygpIHt9CisgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplIHRoZSBhbmdsZS1heGlzIHJvdGF0aW9uIGZyb20gYW4gXGEgYW5nbGUgaW4gcmFkaWFuCisgICAgKiBhbmQgYW4gXGEgYXhpcyB3aGljaCBtdXN0IGJlIG5vcm1hbGl6ZWQuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBBbmdsZUF4aXMoU2NhbGFyIGFuZ2xlLCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBheGlzKSA6IG1fYXhpcyhheGlzKSwgbV9hbmdsZShhbmdsZSkge30KKyAgLyoqIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemUgdGhlIGFuZ2xlLWF4aXMgcm90YXRpb24gZnJvbSBhIHF1YXRlcm5pb24gXGEgcS4gKi8KKyAgaW5saW5lIEFuZ2xlQXhpcyhjb25zdCBRdWF0ZXJuaW9uVHlwZSYgcSkgeyAqdGhpcyA9IHE7IH0KKyAgLyoqIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemUgdGhlIGFuZ2xlLWF4aXMgcm90YXRpb24gZnJvbSBhIDN4MyByb3RhdGlvbiBtYXRyaXguICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBleHBsaWNpdCBBbmdsZUF4aXMoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkgeyAqdGhpcyA9IG07IH0KKworICBTY2FsYXIgYW5nbGUoKSBjb25zdCB7IHJldHVybiBtX2FuZ2xlOyB9CisgIFNjYWxhciYgYW5nbGUoKSB7IHJldHVybiBtX2FuZ2xlOyB9CisKKyAgY29uc3QgVmVjdG9yMyYgYXhpcygpIGNvbnN0IHsgcmV0dXJuIG1fYXhpczsgfQorICBWZWN0b3IzJiBheGlzKCkgeyByZXR1cm4gbV9heGlzOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gcm90YXRpb25zICovCisgIGlubGluZSBRdWF0ZXJuaW9uVHlwZSBvcGVyYXRvciogKGNvbnN0IEFuZ2xlQXhpcyYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIFF1YXRlcm5pb25UeXBlKCp0aGlzKSAqIFF1YXRlcm5pb25UeXBlKG90aGVyKTsgfQorCisgIC8qKiBDb25jYXRlbmF0ZXMgdHdvIHJvdGF0aW9ucyAqLworICBpbmxpbmUgUXVhdGVybmlvblR5cGUgb3BlcmF0b3IqIChjb25zdCBRdWF0ZXJuaW9uVHlwZSYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIFF1YXRlcm5pb25UeXBlKCp0aGlzKSAqIG90aGVyOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gcm90YXRpb25zICovCisgIGZyaWVuZCBpbmxpbmUgUXVhdGVybmlvblR5cGUgb3BlcmF0b3IqIChjb25zdCBRdWF0ZXJuaW9uVHlwZSYgYSwgY29uc3QgQW5nbGVBeGlzJiBiKQorICB7IHJldHVybiBhICogUXVhdGVybmlvblR5cGUoYik7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIHR3byByb3RhdGlvbnMgKi8KKyAgaW5saW5lIE1hdHJpeDMgb3BlcmF0b3IqIChjb25zdCBNYXRyaXgzJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gdG9Sb3RhdGlvbk1hdHJpeCgpICogb3RoZXI7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIHR3byByb3RhdGlvbnMgKi8KKyAgaW5saW5lIGZyaWVuZCBNYXRyaXgzIG9wZXJhdG9yKiAoY29uc3QgTWF0cml4MyYgYSwgY29uc3QgQW5nbGVBeGlzJiBiKQorICB7IHJldHVybiBhICogYi50b1JvdGF0aW9uTWF0cml4KCk7IH0KKworICAvKiogQXBwbGllcyByb3RhdGlvbiB0byB2ZWN0b3IgKi8KKyAgaW5saW5lIFZlY3RvcjMgb3BlcmF0b3IqIChjb25zdCBWZWN0b3IzJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gdG9Sb3RhdGlvbk1hdHJpeCgpICogb3RoZXI7IH0KKworICAvKiogXHJldHVybnMgdGhlIGludmVyc2Ugcm90YXRpb24sIGkuZS4sIGFuIGFuZ2xlLWF4aXMgd2l0aCBvcHBvc2l0ZSByb3RhdGlvbiBhbmdsZSAqLworICBBbmdsZUF4aXMgaW52ZXJzZSgpIGNvbnN0CisgIHsgcmV0dXJuIEFuZ2xlQXhpcygtbV9hbmdsZSwgbV9heGlzKTsgfQorCisgIEFuZ2xlQXhpcyYgb3BlcmF0b3I9KGNvbnN0IFF1YXRlcm5pb25UeXBlJiBxKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgQW5nbGVBeGlzJiBvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgQW5nbGVBeGlzJiBmcm9tUm90YXRpb25NYXRyaXgoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSk7CisgIE1hdHJpeDMgdG9Sb3RhdGlvbk1hdHJpeCh2b2lkKSBjb25zdDsKKworICAvKiogXHJldHVybnMgXGMgKnRoaXMgd2l0aCBzY2FsYXIgdHlwZSBjYXN0ZWQgdG8gXGEgTmV3U2NhbGFyVHlwZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBpZiBcYSBOZXdTY2FsYXJUeXBlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHNjYWxhciB0eXBlIG9mIFxjICp0aGlzCisgICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc21hcnRseSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1NjYWxhclR5cGU+CisgIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxBbmdsZUF4aXMsQW5nbGVBeGlzPE5ld1NjYWxhclR5cGU+ID46OnR5cGUgY2FzdCgpIGNvbnN0CisgIHsgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPEFuZ2xlQXhpcyxBbmdsZUF4aXM8TmV3U2NhbGFyVHlwZT4gPjo6dHlwZSgqdGhpcyk7IH0KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciB3aXRoIHNjYWxhciB0eXBlIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXJUeXBlPgorICBpbmxpbmUgZXhwbGljaXQgQW5nbGVBeGlzKGNvbnN0IEFuZ2xlQXhpczxPdGhlclNjYWxhclR5cGU+JiBvdGhlcikKKyAgeworICAgIG1fYXhpcyA9IG90aGVyLmF4aXMoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgICBtX2FuZ2xlID0gU2NhbGFyKG90aGVyLmFuZ2xlKCkpOworICB9CisKKyAgLyoqIFxyZXR1cm5zIFxjIHRydWUgaWYgXGMgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSBvdGhlciwgd2l0aGluIHRoZSBwcmVjaXNpb24KKyAgICAqIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgICAqCisgICAgKiBcc2EgTWF0cml4QmFzZTo6aXNBcHByb3goKSAqLworICBib29sIGlzQXBwcm94KGNvbnN0IEFuZ2xlQXhpcyYgb3RoZXIsIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHByZWMgPSBwcmVjaXNpb248U2NhbGFyPigpKSBjb25zdAorICB7IHJldHVybiBtX2F4aXMuaXNBcHByb3gob3RoZXIubV9heGlzLCBwcmVjKSAmJiBlaV9pc0FwcHJveChtX2FuZ2xlLG90aGVyLm1fYW5nbGUsIHByZWMpOyB9Cit9OworCisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICogc2luZ2xlIHByZWNpc2lvbiBhbmdsZS1heGlzIHR5cGUgKi8KK3R5cGVkZWYgQW5nbGVBeGlzPGZsb2F0PiBBbmdsZUF4aXNmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIGRvdWJsZSBwcmVjaXNpb24gYW5nbGUtYXhpcyB0eXBlICovCit0eXBlZGVmIEFuZ2xlQXhpczxkb3VibGU+IEFuZ2xlQXhpc2Q7CisKKy8qKiBTZXQgXGMgKnRoaXMgZnJvbSBhIHF1YXRlcm5pb24uCisgICogVGhlIGF4aXMgaXMgbm9ybWFsaXplZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK0FuZ2xlQXhpczxTY2FsYXI+JiBBbmdsZUF4aXM8U2NhbGFyPjo6b3BlcmF0b3I9KGNvbnN0IFF1YXRlcm5pb25UeXBlJiBxKQoreworICBTY2FsYXIgbjIgPSBxLnZlYygpLnNxdWFyZWROb3JtKCk7CisgIGlmIChuMiA8IHByZWNpc2lvbjxTY2FsYXI+KCkqcHJlY2lzaW9uPFNjYWxhcj4oKSkKKyAgeworICAgIG1fYW5nbGUgPSAwOworICAgIG1fYXhpcyA8PCAxLCAwLCAwOworICB9CisgIGVsc2UKKyAgeworICAgIG1fYW5nbGUgPSAyKnN0ZDo6YWNvcyhxLncoKSk7CisgICAgbV9heGlzID0gcS52ZWMoKSAvIGVpX3NxcnQobjIpOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFNldCBcYyAqdGhpcyBmcm9tIGEgM3gzIHJvdGF0aW9uIG1hdHJpeCBcYSBtYXQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorQW5nbGVBeGlzPFNjYWxhcj4mIEFuZ2xlQXhpczxTY2FsYXI+OjpvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbWF0KQoreworICAvLyBTaW5jZSBhIGRpcmVjdCBjb252ZXJzaW9uIHdvdWxkIG5vdCBiZSByZWFsbHkgZmFzdGVyLAorICAvLyBsZXQncyB1c2UgdGhlIHJvYnVzdCBRdWF0ZXJuaW9uIGltcGxlbWVudGF0aW9uOgorICByZXR1cm4gKnRoaXMgPSBRdWF0ZXJuaW9uVHlwZShtYXQpOworfQorCisvKiogQ29uc3RydWN0cyBhbmQgXHJldHVybnMgYW4gZXF1aXZhbGVudCAzeDMgcm90YXRpb24gbWF0cml4LgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordHlwZW5hbWUgQW5nbGVBeGlzPFNjYWxhcj46Ok1hdHJpeDMKK0FuZ2xlQXhpczxTY2FsYXI+Ojp0b1JvdGF0aW9uTWF0cml4KHZvaWQpIGNvbnN0Cit7CisgIE1hdHJpeDMgcmVzOworICBWZWN0b3IzIHNpbl9heGlzICA9IGVpX3NpbihtX2FuZ2xlKSAqIG1fYXhpczsKKyAgU2NhbGFyIGMgPSBlaV9jb3MobV9hbmdsZSk7CisgIFZlY3RvcjMgY29zMV9heGlzID0gKFNjYWxhcigxKS1jKSAqIG1fYXhpczsKKworICBTY2FsYXIgdG1wOworICB0bXAgPSBjb3MxX2F4aXMueCgpICogbV9heGlzLnkoKTsKKyAgcmVzLmNvZWZmUmVmKDAsMSkgPSB0bXAgLSBzaW5fYXhpcy56KCk7CisgIHJlcy5jb2VmZlJlZigxLDApID0gdG1wICsgc2luX2F4aXMueigpOworCisgIHRtcCA9IGNvczFfYXhpcy54KCkgKiBtX2F4aXMueigpOworICByZXMuY29lZmZSZWYoMCwyKSA9IHRtcCArIHNpbl9heGlzLnkoKTsKKyAgcmVzLmNvZWZmUmVmKDIsMCkgPSB0bXAgLSBzaW5fYXhpcy55KCk7CisKKyAgdG1wID0gY29zMV9heGlzLnkoKSAqIG1fYXhpcy56KCk7CisgIHJlcy5jb2VmZlJlZigxLDIpID0gdG1wIC0gc2luX2F4aXMueCgpOworICByZXMuY29lZmZSZWYoMiwxKSA9IHRtcCArIHNpbl9heGlzLngoKTsKKworICByZXMuZGlhZ29uYWwoKSA9IChjb3MxX2F4aXMuY3dpc2UoKSAqIG1fYXhpcykuY3dpc2UoKSArIGM7CisKKyAgcmV0dXJuIHJlczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0dlb21ldHJ5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDdhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9FaWdlbjJTdXBwb3J0X0dlb21ldHJ5X1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9FaWdlbjJTdXBwb3J0X0dlb21ldHJ5X1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkKKyAgKQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvSHlwZXJwbGFuZS5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvSHlwZXJwbGFuZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2MxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9IeXBlcnBsYW5lLmgKQEAgLTAsMCArMSwyNTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIG5vIGluY2x1ZGUgZ3VhcmQsIHdlJ2xsIGluY2x1ZGUgdGhpcyB0d2ljZSBmcm9tIEFsbC5oIGZyb20gRWlnZW4yU3VwcG9ydCwgYW5kIGl0J3MgaW50ZXJuYWwgYW55d2F5CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBIeXBlcnBsYW5lCisgICoKKyAgKiBcYnJpZWYgQSBoeXBlcnBsYW5lCisgICoKKyAgKiBBIGh5cGVycGxhbmUgaXMgYW4gYWZmaW5lIHN1YnNwYWNlIG9mIGRpbWVuc2lvbiBuLTEgaW4gYSBzcGFjZSBvZiBkaW1lbnNpb24gbi4KKyAgKiBGb3IgZXhhbXBsZSwgYSBoeXBlcnBsYW5lIGluIGEgcGxhbmUgaXMgYSBsaW5lOyBhIGh5cGVycGxhbmUgaW4gMy1zcGFjZSBpcyBhIHBsYW5lLgorICAqCisgICogXHBhcmFtIF9TY2FsYXIgdGhlIHNjYWxhciB0eXBlLCBpLmUuLCB0aGUgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzCisgICogXHBhcmFtIF9BbWJpZW50RGltIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFtYmllbnQgc3BhY2UsIGNhbiBiZSBhIGNvbXBpbGUgdGltZSB2YWx1ZSBvciBEeW5hbWljLgorICAqICAgICAgICAgICAgIE5vdGljZSB0aGF0IHRoZSBkaW1lbnNpb24gb2YgdGhlIGh5cGVycGxhbmUgaXMgX0FtYmllbnREaW0tMS4KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBoeXBlcnBsYW5lIGFzIHRoZSB6ZXJvIHNldCBvZiB0aGUgaW1wbGljaXQgZXF1YXRpb24KKyAgKiBcZiQgbiBcY2RvdCB4ICsgZCA9IDAgXGYkIHdoZXJlIFxmJCBuIFxmJCBpcyBhIHVuaXQgbm9ybWFsIHZlY3RvciBvZiB0aGUgcGxhbmUgKGxpbmVhciBwYXJ0KQorICAqIGFuZCBcZiQgZCBcZiQgaXMgdGhlIGRpc3RhbmNlIChvZmZzZXQpIHRvIHRoZSBvcmlnaW4uCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9BbWJpZW50RGltPgorY2xhc3MgSHlwZXJwbGFuZQoreworcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0FtYmllbnREaW09PUR5bmFtaWMgPyBEeW5hbWljIDogX0FtYmllbnREaW0rMSkKKyAgZW51bSB7IEFtYmllbnREaW1BdENvbXBpbGVUaW1lID0gX0FtYmllbnREaW0gfTsKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsQW1iaWVudERpbUF0Q29tcGlsZVRpbWUsMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLGludChBbWJpZW50RGltQXRDb21waWxlVGltZSk9PUR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgID8gRHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnQoQW1iaWVudERpbUF0Q29tcGlsZVRpbWUpKzEsMT4gQ29lZmZpY2llbnRzOworICB0eXBlZGVmIEJsb2NrPENvZWZmaWNpZW50cyxBbWJpZW50RGltQXRDb21waWxlVGltZSwxPiBOb3JtYWxSZXR1cm5UeXBlOworCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24gKi8KKyAgaW5saW5lIGV4cGxpY2l0IEh5cGVycGxhbmUoKSB7fQorCisgIC8qKiBDb25zdHJ1Y3RzIGEgZHluYW1pYy1zaXplIGh5cGVycGxhbmUgd2l0aCBcYSBfZGltIHRoZSBkaW1lbnNpb24KKyAgICAqIG9mIHRoZSBhbWJpZW50IHNwYWNlICovCisgIGlubGluZSBleHBsaWNpdCBIeXBlcnBsYW5lKGludCBfZGltKSA6IG1fY29lZmZzKF9kaW0rMSkge30KKworICAvKiogQ29uc3RydWN0IGEgcGxhbmUgZnJvbSBpdHMgbm9ybWFsIFxhIG4gYW5kIGEgcG9pbnQgXGEgZSBvbnRvIHRoZSBwbGFuZS4KKyAgICAqIFx3YXJuaW5nIHRoZSB2ZWN0b3Igbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAqLworICBpbmxpbmUgSHlwZXJwbGFuZShjb25zdCBWZWN0b3JUeXBlJiBuLCBjb25zdCBWZWN0b3JUeXBlJiBlKQorICAgIDogbV9jb2VmZnMobi5zaXplKCkrMSkKKyAgeworICAgIG5vcm1hbCgpID0gbjsKKyAgICBvZmZzZXQoKSA9IC1lLmVpZ2VuMl9kb3Qobik7CisgIH0KKworICAvKiogQ29uc3RydWN0cyBhIHBsYW5lIGZyb20gaXRzIG5vcm1hbCBcYSBuIGFuZCBkaXN0YW5jZSB0byB0aGUgb3JpZ2luIFxhIGQKKyAgICAqIHN1Y2ggdGhhdCB0aGUgYWxnZWJyYWljIGVxdWF0aW9uIG9mIHRoZSBwbGFuZSBpcyBcZiQgbiBcY2RvdCB4ICsgZCA9IDAgXGYkLgorICAgICogXHdhcm5pbmcgdGhlIHZlY3RvciBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkLgorICAgICovCisgIGlubGluZSBIeXBlcnBsYW5lKGNvbnN0IFZlY3RvclR5cGUmIG4sIFNjYWxhciBkKQorICAgIDogbV9jb2VmZnMobi5zaXplKCkrMSkKKyAgeworICAgIG5vcm1hbCgpID0gbjsKKyAgICBvZmZzZXQoKSA9IGQ7CisgIH0KKworICAvKiogQ29uc3RydWN0cyBhIGh5cGVycGxhbmUgcGFzc2luZyB0aHJvdWdoIHRoZSB0d28gcG9pbnRzLiBJZiB0aGUgZGltZW5zaW9uIG9mIHRoZSBhbWJpZW50IHNwYWNlCisgICAgKiBpcyBncmVhdGVyIHRoYW4gMiwgdGhlbiB0aGVyZSBpc24ndCB1bmlxdWVuZXNzLCBzbyBhbiBhcmJpdHJhcnkgY2hvaWNlIGlzIG1hZGUuCisgICAgKi8KKyAgc3RhdGljIGlubGluZSBIeXBlcnBsYW5lIFRocm91Z2goY29uc3QgVmVjdG9yVHlwZSYgcDAsIGNvbnN0IFZlY3RvclR5cGUmIHAxKQorICB7CisgICAgSHlwZXJwbGFuZSByZXN1bHQocDAuc2l6ZSgpKTsKKyAgICByZXN1bHQubm9ybWFsKCkgPSAocDEgLSBwMCkudW5pdE9ydGhvZ29uYWwoKTsKKyAgICByZXN1bHQub2Zmc2V0KCkgPSAtcmVzdWx0Lm5vcm1hbCgpLmVpZ2VuMl9kb3QocDApOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKiogQ29uc3RydWN0cyBhIGh5cGVycGxhbmUgcGFzc2luZyB0aHJvdWdoIHRoZSB0aHJlZSBwb2ludHMuIFRoZSBkaW1lbnNpb24gb2YgdGhlIGFtYmllbnQgc3BhY2UKKyAgICAqIGlzIHJlcXVpcmVkIHRvIGJlIGV4YWN0bHkgMy4KKyAgICAqLworICBzdGF0aWMgaW5saW5lIEh5cGVycGxhbmUgVGhyb3VnaChjb25zdCBWZWN0b3JUeXBlJiBwMCwgY29uc3QgVmVjdG9yVHlwZSYgcDEsIGNvbnN0IFZlY3RvclR5cGUmIHAyKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShWZWN0b3JUeXBlLCAzKQorICAgIEh5cGVycGxhbmUgcmVzdWx0KHAwLnNpemUoKSk7CisgICAgcmVzdWx0Lm5vcm1hbCgpID0gKHAyIC0gcDApLmNyb3NzKHAxIC0gcDApLm5vcm1hbGl6ZWQoKTsKKyAgICByZXN1bHQub2Zmc2V0KCkgPSAtcmVzdWx0Lm5vcm1hbCgpLmVpZ2VuMl9kb3QocDApOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKiogQ29uc3RydWN0cyBhIGh5cGVycGxhbmUgcGFzc2luZyB0aHJvdWdoIHRoZSBwYXJhbWV0cml6ZWQgbGluZSBcYSBwYXJhbWV0cml6ZWQuCisgICAgKiBJZiB0aGUgZGltZW5zaW9uIG9mIHRoZSBhbWJpZW50IHNwYWNlIGlzIGdyZWF0ZXIgdGhhbiAyLCB0aGVuIHRoZXJlIGlzbid0IHVuaXF1ZW5lc3MsCisgICAgKiBzbyBhbiBhcmJpdHJhcnkgY2hvaWNlIGlzIG1hZGUuCisgICAgKi8KKyAgLy8gRklYTUUgdG8gYmUgY29uc2l0ZW50IHdpdGggdGhlIHJlc3QgdGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIHN0YXRpYyBUaHJvdWdoIGZ1bmN0aW9uID8/CisgIGV4cGxpY2l0IEh5cGVycGxhbmUoY29uc3QgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsIEFtYmllbnREaW1BdENvbXBpbGVUaW1lPiYgcGFyYW1ldHJpemVkKQorICB7CisgICAgbm9ybWFsKCkgPSBwYXJhbWV0cml6ZWQuZGlyZWN0aW9uKCkudW5pdE9ydGhvZ29uYWwoKTsKKyAgICBvZmZzZXQoKSA9IC1ub3JtYWwoKS5laWdlbjJfZG90KHBhcmFtZXRyaXplZC5vcmlnaW4oKSk7CisgIH0KKworICB+SHlwZXJwbGFuZSgpIHt9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBkaW1lbnNpb24gaW4gd2hpY2ggdGhlIHBsYW5lIGhvbGRzICovCisgIGlubGluZSBpbnQgZGltKCkgY29uc3QgeyByZXR1cm4gaW50KEFtYmllbnREaW1BdENvbXBpbGVUaW1lKT09RHluYW1pYyA/IG1fY29lZmZzLnNpemUoKS0xIDogaW50KEFtYmllbnREaW1BdENvbXBpbGVUaW1lKTsgfQorCisgIC8qKiBub3JtYWxpemVzIFxjICp0aGlzICovCisgIHZvaWQgbm9ybWFsaXplKHZvaWQpCisgIHsKKyAgICBtX2NvZWZmcyAvPSBub3JtYWwoKS5ub3JtKCk7CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIHNpZ25lZCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwbGFuZSBcYyAqdGhpcyBhbmQgYSBwb2ludCBcYSBwLgorICAgICogXHNhIGFic0Rpc3RhbmNlKCkKKyAgICAqLworICBpbmxpbmUgU2NhbGFyIHNpZ25lZERpc3RhbmNlKGNvbnN0IFZlY3RvclR5cGUmIHApIGNvbnN0IHsgcmV0dXJuIHAuZWlnZW4yX2RvdChub3JtYWwoKSkgKyBvZmZzZXQoKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgYWJzb2x1dGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxhbmUgXGMgKnRoaXMgYW5kIGEgcG9pbnQgXGEgcC4KKyAgICAqIFxzYSBzaWduZWREaXN0YW5jZSgpCisgICAgKi8KKyAgaW5saW5lIFNjYWxhciBhYnNEaXN0YW5jZShjb25zdCBWZWN0b3JUeXBlJiBwKSBjb25zdCB7IHJldHVybiBlaV9hYnMoc2lnbmVkRGlzdGFuY2UocCkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBwcm9qZWN0aW9uIG9mIGEgcG9pbnQgXGEgcCBvbnRvIHRoZSBwbGFuZSBcYyAqdGhpcy4KKyAgICAqLworICBpbmxpbmUgVmVjdG9yVHlwZSBwcm9qZWN0aW9uKGNvbnN0IFZlY3RvclR5cGUmIHApIGNvbnN0IHsgcmV0dXJuIHAgLSBzaWduZWREaXN0YW5jZShwKSAqIG5vcm1hbCgpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgY29uc3RhbnQgcmVmZXJlbmNlIHRvIHRoZSB1bml0IG5vcm1hbCB2ZWN0b3Igb2YgdGhlIHBsYW5lLCB3aGljaCBjb3JyZXNwb25kcworICAgICogdG8gdGhlIGxpbmVhciBwYXJ0IG9mIHRoZSBpbXBsaWNpdCBlcXVhdGlvbi4KKyAgICAqLworICBpbmxpbmUgY29uc3QgTm9ybWFsUmV0dXJuVHlwZSBub3JtYWwoKSBjb25zdCB7IHJldHVybiBOb3JtYWxSZXR1cm5UeXBlKCpjb25zdF9jYXN0PENvZWZmaWNpZW50cyo+KCZtX2NvZWZmcyksMCwwLGRpbSgpLDEpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgbm9uLWNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgdW5pdCBub3JtYWwgdmVjdG9yIG9mIHRoZSBwbGFuZSwgd2hpY2ggY29ycmVzcG9uZHMKKyAgICAqIHRvIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgaW1wbGljaXQgZXF1YXRpb24uCisgICAgKi8KKyAgaW5saW5lIE5vcm1hbFJldHVyblR5cGUgbm9ybWFsKCkgeyByZXR1cm4gTm9ybWFsUmV0dXJuVHlwZShtX2NvZWZmcywwLDAsZGltKCksMSk7IH0KKworICAvKiogXHJldHVybnMgdGhlIGRpc3RhbmNlIHRvIHRoZSBvcmlnaW4sIHdoaWNoIGlzIGFsc28gdGhlICJjb25zdGFudCB0ZXJtIiBvZiB0aGUgaW1wbGljaXQgZXF1YXRpb24KKyAgICAqIFx3YXJuaW5nIHRoZSB2ZWN0b3Igbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAqLworICBpbmxpbmUgY29uc3QgU2NhbGFyJiBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmcy5jb2VmZihkaW0oKSk7IH0KKworICAvKiogXHJldHVybnMgYSBub24tY29uc3RhbnQgcmVmZXJlbmNlIHRvIHRoZSBkaXN0YW5jZSB0byB0aGUgb3JpZ2luLCB3aGljaCBpcyBhbHNvIHRoZSBjb25zdGFudCBwYXJ0CisgICAgKiBvZiB0aGUgaW1wbGljaXQgZXF1YXRpb24gKi8KKyAgaW5saW5lIFNjYWxhciYgb2Zmc2V0KCkgeyByZXR1cm4gbV9jb2VmZnMoZGltKCkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgY29uc3RhbnQgcmVmZXJlbmNlIHRvIHRoZSBjb2VmZmljaWVudHMgY19pIG9mIHRoZSBwbGFuZSBlcXVhdGlvbjoKKyAgICAqIFxmJCBjXzAqeF8wICsgLi4uICsgY197ZC0xfSp4X3tkLTF9ICsgY19kID0gMCBcZiQKKyAgICAqLworICBpbmxpbmUgY29uc3QgQ29lZmZpY2llbnRzJiBjb2VmZnMoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmczsgfQorCisgIC8qKiBccmV0dXJucyBhIG5vbi1jb25zdGFudCByZWZlcmVuY2UgdG8gdGhlIGNvZWZmaWNpZW50cyBjX2kgb2YgdGhlIHBsYW5lIGVxdWF0aW9uOgorICAgICogXGYkIGNfMCp4XzAgKyAuLi4gKyBjX3tkLTF9Knhfe2QtMX0gKyBjX2QgPSAwIFxmJAorICAgICovCisgIGlubGluZSBDb2VmZmljaWVudHMmIGNvZWZmcygpIHsgcmV0dXJuIG1fY29lZmZzOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gb2YgKnRoaXMgd2l0aCBcYSBvdGhlci4KKyAgICAqCisgICAgKiBcd2FybmluZyBUaGUgYW1iaWVudCBzcGFjZSBtdXN0IGJlIGEgcGxhbmUsIGkuZS4gaGF2ZSBkaW1lbnNpb24gMiwgc28gdGhhdCBcYyAqdGhpcyBhbmQgXGEgb3RoZXIgYXJlIGxpbmVzLgorICAgICoKKyAgICAqIFxub3RlIElmIFxhIG90aGVyIGlzIGFwcHJveGltYXRlbHkgcGFyYWxsZWwgdG8gKnRoaXMsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFueSBwb2ludCBvbiAqdGhpcy4KKyAgICAqLworICBWZWN0b3JUeXBlIGludGVyc2VjdGlvbihjb25zdCBIeXBlcnBsYW5lJiBvdGhlcikKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoVmVjdG9yVHlwZSwgMikKKyAgICBTY2FsYXIgZGV0ID0gY29lZmZzKCkuY29lZmYoMCkgKiBvdGhlci5jb2VmZnMoKS5jb2VmZigxKSAtIGNvZWZmcygpLmNvZWZmKDEpICogb3RoZXIuY29lZmZzKCkuY29lZmYoMCk7CisgICAgLy8gc2luY2UgdGhlIGxpbmUgZXF1YXRpb25zIGF4K2J5PWMgYXJlIG5vcm1hbGl6ZWQgd2l0aCBhXjIrYl4yPTEsIHRoZSBmb2xsb3dpbmcgdGVzdHMKKyAgICAvLyB3aGV0aGVyIHRoZSB0d28gbGluZXMgYXJlIGFwcHJveGltYXRlbHkgcGFyYWxsZWwuCisgICAgaWYoZWlfaXNNdWNoU21hbGxlclRoYW4oZGV0LCBTY2FsYXIoMSkpKQorICAgIHsgICAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIHR3byBsaW5lcyBhcmUgYXBwcm94aW1hdGVseSBwYXJhbGxlbC4gUGljayBhbnkgcG9pbnQgb24gdGhlIGZpcnN0IGxpbmUuCisgICAgICAgIGlmKGVpX2Ficyhjb2VmZnMoKS5jb2VmZigxKSk+ZWlfYWJzKGNvZWZmcygpLmNvZWZmKDApKSkKKyAgICAgICAgICAgIHJldHVybiBWZWN0b3JUeXBlKGNvZWZmcygpLmNvZWZmKDEpLCAtY29lZmZzKCkuY29lZmYoMikvY29lZmZzKCkuY29lZmYoMSktY29lZmZzKCkuY29lZmYoMCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gVmVjdG9yVHlwZSgtY29lZmZzKCkuY29lZmYoMikvY29lZmZzKCkuY29lZmYoMCktY29lZmZzKCkuY29lZmYoMSksIGNvZWZmcygpLmNvZWZmKDApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvLyBnZW5lcmFsIGNhc2UKKyAgICAgICAgU2NhbGFyIGludmRldCA9IFNjYWxhcigxKSAvIGRldDsKKyAgICAgICAgcmV0dXJuIFZlY3RvclR5cGUoaW52ZGV0Kihjb2VmZnMoKS5jb2VmZigxKSpvdGhlci5jb2VmZnMoKS5jb2VmZigyKS1vdGhlci5jb2VmZnMoKS5jb2VmZigxKSpjb2VmZnMoKS5jb2VmZigyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludmRldCoob3RoZXIuY29lZmZzKCkuY29lZmYoMCkqY29lZmZzKCkuY29lZmYoMiktY29lZmZzKCkuY29lZmYoMCkqb3RoZXIuY29lZmZzKCkuY29lZmYoMikpKTsKKyAgICB9CisgIH0KKworICAvKiogQXBwbGllcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IFxhIG1hdCB0byBcYyAqdGhpcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqCisgICAgKiBccGFyYW0gbWF0IHRoZSBEaW0geCBEaW0gdHJhbnNmb3JtYXRpb24gbWF0cml4CisgICAgKiBccGFyYW0gdHJhaXRzIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggXGEgbWF0IHJlcHJlc2VudHMgYW4gSXNvbWV0cnkKKyAgICAqICAgICAgICAgICAgICAgb3IgYSBtb3JlIGdlbmVyaWMgQWZmaW5lIHRyYW5zZm9ybWF0aW9uLiBUaGUgZGVmYXVsdCBpcyBBZmZpbmUuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4KKyAgaW5saW5lIEh5cGVycGxhbmUmIHRyYW5zZm9ybShjb25zdCBNYXRyaXhCYXNlPFhwclR5cGU+JiBtYXQsIFRyYW5zZm9ybVRyYWl0cyB0cmFpdHMgPSBBZmZpbmUpCisgIHsKKyAgICBpZiAodHJhaXRzPT1BZmZpbmUpCisgICAgICBub3JtYWwoKSA9IG1hdC5pbnZlcnNlKCkudHJhbnNwb3NlKCkgKiBub3JtYWwoKTsKKyAgICBlbHNlIGlmICh0cmFpdHM9PUlzb21ldHJ5KQorICAgICAgbm9ybWFsKCkgPSBtYXQgKiBub3JtYWwoKTsKKyAgICBlbHNlCisgICAgeworICAgICAgZWlfYXNzZXJ0KCJpbnZhbGlkIHRyYWl0cyB2YWx1ZSBpbiBIeXBlcnBsYW5lOjp0cmFuc2Zvcm0oKSIpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvKiogQXBwbGllcyB0aGUgdHJhbnNmb3JtYXRpb24gXGEgdCB0byBcYyAqdGhpcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqCisgICAgKiBccGFyYW0gdCB0aGUgdHJhbnNmb3JtYXRpb24gb2YgZGltZW5zaW9uIERpbQorICAgICogXHBhcmFtIHRyYWl0cyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdHJhbnNmb3JtYXRpb24gXGEgdCByZXByZXNlbnRzIGFuIElzb21ldHJ5CisgICAgKiAgICAgICAgICAgICAgIG9yIGEgbW9yZSBnZW5lcmljIEFmZmluZSB0cmFuc2Zvcm1hdGlvbi4gVGhlIGRlZmF1bHQgaXMgQWZmaW5lLgorICAgICogICAgICAgICAgICAgICBPdGhlciBraW5kIG9mIHRyYW5zZm9ybWF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAqLworICBpbmxpbmUgSHlwZXJwbGFuZSYgdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsQW1iaWVudERpbUF0Q29tcGlsZVRpbWU+JiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1UcmFpdHMgdHJhaXRzID0gQWZmaW5lKQorICB7CisgICAgdHJhbnNmb3JtKHQubGluZWFyKCksIHRyYWl0cyk7CisgICAgb2Zmc2V0KCkgLT0gdC50cmFuc2xhdGlvbigpLmVpZ2VuMl9kb3Qobm9ybWFsKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8qKiBccmV0dXJucyBcYyAqdGhpcyB3aXRoIHNjYWxhciB0eXBlIGNhc3RlZCB0byBcYSBOZXdTY2FsYXJUeXBlCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIFxhIE5ld1NjYWxhclR5cGUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2NhbGFyIHR5cGUgb2YgXGMgKnRoaXMKKyAgICAqIHRoZW4gdGhpcyBmdW5jdGlvbiBzbWFydGx5IHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3U2NhbGFyVHlwZT4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPEh5cGVycGxhbmUsCisgICAgICAgICAgIEh5cGVycGxhbmU8TmV3U2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZT4gPjo6dHlwZSBjYXN0KCkgY29uc3QKKyAgeworICAgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxIeXBlcnBsYW5lLAorICAgICAgICAgICAgICAgICAgICBIeXBlcnBsYW5lPE5ld1NjYWxhclR5cGUsQW1iaWVudERpbUF0Q29tcGlsZVRpbWU+ID46OnR5cGUoKnRoaXMpOworICB9CisKKyAgLyoqIENvcHkgY29uc3RydWN0b3Igd2l0aCBzY2FsYXIgdHlwZSBjb252ZXJzaW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZT4KKyAgaW5saW5lIGV4cGxpY2l0IEh5cGVycGxhbmUoY29uc3QgSHlwZXJwbGFuZTxPdGhlclNjYWxhclR5cGUsQW1iaWVudERpbUF0Q29tcGlsZVRpbWU+JiBvdGhlcikKKyAgeyBtX2NvZWZmcyA9IG90aGVyLmNvZWZmcygpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOyB9CisKKyAgLyoqIFxyZXR1cm5zIFxjIHRydWUgaWYgXGMgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSBvdGhlciwgd2l0aGluIHRoZSBwcmVjaXNpb24KKyAgICAqIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgICAqCisgICAgKiBcc2EgTWF0cml4QmFzZTo6aXNBcHByb3goKSAqLworICBib29sIGlzQXBwcm94KGNvbnN0IEh5cGVycGxhbmUmIG90aGVyLCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBwcmVjID0gcHJlY2lzaW9uPFNjYWxhcj4oKSkgY29uc3QKKyAgeyByZXR1cm4gbV9jb2VmZnMuaXNBcHByb3gob3RoZXIubV9jb2VmZnMsIHByZWMpOyB9CisKK3Byb3RlY3RlZDoKKworICBDb2VmZmljaWVudHMgbV9jb2VmZnM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0dlb21ldHJ5L1BhcmFtZXRyaXplZExpbmUuaCBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0dlb21ldHJ5L1BhcmFtZXRyaXplZExpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTRhMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvUGFyYW1ldHJpemVkTGluZS5oCkBAIC0wLDAgKzEsMTQxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBubyBpbmNsdWRlIGd1YXJkLCB3ZSdsbCBpbmNsdWRlIHRoaXMgdHdpY2UgZnJvbSBBbGwuaCBmcm9tIEVpZ2VuMlN1cHBvcnQsIGFuZCBpdCdzIGludGVybmFsIGFueXdheQorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgUGFyYW1ldHJpemVkTGluZQorICAqCisgICogXGJyaWVmIEEgcGFyYW1ldHJpemVkIGxpbmUKKyAgKgorICAqIEEgcGFyYW1ldHJpemVkIGxpbmUgaXMgZGVmaW5lZCBieSBhbiBvcmlnaW4gcG9pbnQgXGYkIFxtYXRoYmZ7b30gXGYkIGFuZCBhIHVuaXQKKyAgKiBkaXJlY3Rpb24gdmVjdG9yIFxmJCBcbWF0aGJme2R9IFxmJCBzdWNoIHRoYXQgdGhlIGxpbmUgY29ycmVzcG9uZHMgdG8KKyAgKiB0aGUgc2V0IFxmJCBsKHQpID0gXG1hdGhiZntvfSArIHQgXG1hdGhiZntkfSBcZiQsIFxmJCBsIFxpbiBcbWF0aGJme1J9IFxmJC4KKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBfQW1iaWVudERpbSB0aGUgZGltZW5zaW9uIG9mIHRoZSBhbWJpZW50IHNwYWNlLCBjYW4gYmUgYSBjb21waWxlIHRpbWUgdmFsdWUgb3IgRHluYW1pYy4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0+CitjbGFzcyBQYXJhbWV0cml6ZWRMaW5lCit7CitwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoX1NjYWxhcixfQW1iaWVudERpbSkKKyAgZW51bSB7IEFtYmllbnREaW1BdENvbXBpbGVUaW1lID0gX0FtYmllbnREaW0gfTsKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsQW1iaWVudERpbUF0Q29tcGlsZVRpbWUsMT4gVmVjdG9yVHlwZTsKKworICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRob3V0IGluaXRpYWxpemF0aW9uICovCisgIGlubGluZSBleHBsaWNpdCBQYXJhbWV0cml6ZWRMaW5lKCkge30KKworICAvKiogQ29uc3RydWN0cyBhIGR5bmFtaWMtc2l6ZSBsaW5lIHdpdGggXGEgX2RpbSB0aGUgZGltZW5zaW9uCisgICAgKiBvZiB0aGUgYW1iaWVudCBzcGFjZSAqLworICBpbmxpbmUgZXhwbGljaXQgUGFyYW1ldHJpemVkTGluZShpbnQgX2RpbSkgOiBtX29yaWdpbihfZGltKSwgbV9kaXJlY3Rpb24oX2RpbSkge30KKworICAvKiogSW5pdGlhbGl6ZXMgYSBwYXJhbWV0cml6ZWQgbGluZSBvZiBkaXJlY3Rpb24gXGEgZGlyZWN0aW9uIGFuZCBvcmlnaW4gXGEgb3JpZ2luLgorICAgICogXHdhcm5pbmcgdGhlIHZlY3RvciBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkLgorICAgICovCisgIFBhcmFtZXRyaXplZExpbmUoY29uc3QgVmVjdG9yVHlwZSYgb3JpZ2luLCBjb25zdCBWZWN0b3JUeXBlJiBkaXJlY3Rpb24pCisgICAgOiBtX29yaWdpbihvcmlnaW4pLCBtX2RpcmVjdGlvbihkaXJlY3Rpb24pIHt9CisKKyAgZXhwbGljaXQgUGFyYW1ldHJpemVkTGluZShjb25zdCBIeXBlcnBsYW5lPF9TY2FsYXIsIF9BbWJpZW50RGltPiYgaHlwZXJwbGFuZSk7CisKKyAgLyoqIENvbnN0cnVjdHMgYSBwYXJhbWV0cml6ZWQgbGluZSBnb2luZyBmcm9tIFxhIHAwIHRvIFxhIHAxLiAqLworICBzdGF0aWMgaW5saW5lIFBhcmFtZXRyaXplZExpbmUgVGhyb3VnaChjb25zdCBWZWN0b3JUeXBlJiBwMCwgY29uc3QgVmVjdG9yVHlwZSYgcDEpCisgIHsgcmV0dXJuIFBhcmFtZXRyaXplZExpbmUocDAsIChwMS1wMCkubm9ybWFsaXplZCgpKTsgfQorCisgIH5QYXJhbWV0cml6ZWRMaW5lKCkge30KKworICAvKiogXHJldHVybnMgdGhlIGRpbWVuc2lvbiBpbiB3aGljaCB0aGUgbGluZSBob2xkcyAqLworICBpbmxpbmUgaW50IGRpbSgpIGNvbnN0IHsgcmV0dXJuIG1fZGlyZWN0aW9uLnNpemUoKTsgfQorCisgIGNvbnN0IFZlY3RvclR5cGUmIG9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2luOyB9CisgIFZlY3RvclR5cGUmIG9yaWdpbigpIHsgcmV0dXJuIG1fb3JpZ2luOyB9CisKKyAgY29uc3QgVmVjdG9yVHlwZSYgZGlyZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9kaXJlY3Rpb247IH0KKyAgVmVjdG9yVHlwZSYgZGlyZWN0aW9uKCkgeyByZXR1cm4gbV9kaXJlY3Rpb247IH0KKworICAvKiogXHJldHVybnMgdGhlIHNxdWFyZWQgZGlzdGFuY2Ugb2YgYSBwb2ludCBcYSBwIHRvIGl0cyBwcm9qZWN0aW9uIG9udG8gdGhlIGxpbmUgXGMgKnRoaXMuCisgICAgKiBcc2EgZGlzdGFuY2UoKQorICAgICovCisgIFJlYWxTY2FsYXIgc3F1YXJlZERpc3RhbmNlKGNvbnN0IFZlY3RvclR5cGUmIHApIGNvbnN0CisgIHsKKyAgICBWZWN0b3JUeXBlIGRpZmYgPSBwLW9yaWdpbigpOworICAgIHJldHVybiAoZGlmZiAtIGRpZmYuZWlnZW4yX2RvdChkaXJlY3Rpb24oKSkqIGRpcmVjdGlvbigpKS5zcXVhcmVkTm9ybSgpOworICB9CisgIC8qKiBccmV0dXJucyB0aGUgZGlzdGFuY2Ugb2YgYSBwb2ludCBcYSBwIHRvIGl0cyBwcm9qZWN0aW9uIG9udG8gdGhlIGxpbmUgXGMgKnRoaXMuCisgICAgKiBcc2Egc3F1YXJlZERpc3RhbmNlKCkKKyAgICAqLworICBSZWFsU2NhbGFyIGRpc3RhbmNlKGNvbnN0IFZlY3RvclR5cGUmIHApIGNvbnN0IHsgcmV0dXJuIGVpX3NxcnQoc3F1YXJlZERpc3RhbmNlKHApKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgcHJvamVjdGlvbiBvZiBhIHBvaW50IFxhIHAgb250byB0aGUgbGluZSBcYyAqdGhpcy4gKi8KKyAgVmVjdG9yVHlwZSBwcm9qZWN0aW9uKGNvbnN0IFZlY3RvclR5cGUmIHApIGNvbnN0CisgIHsgcmV0dXJuIG9yaWdpbigpICsgKHAtb3JpZ2luKCkpLmVpZ2VuMl9kb3QoZGlyZWN0aW9uKCkpICogZGlyZWN0aW9uKCk7IH0KKworICBTY2FsYXIgaW50ZXJzZWN0aW9uKGNvbnN0IEh5cGVycGxhbmU8X1NjYWxhciwgX0FtYmllbnREaW0+JiBoeXBlcnBsYW5lKTsKKworICAvKiogXHJldHVybnMgXGMgKnRoaXMgd2l0aCBzY2FsYXIgdHlwZSBjYXN0ZWQgdG8gXGEgTmV3U2NhbGFyVHlwZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBpZiBcYSBOZXdTY2FsYXJUeXBlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHNjYWxhciB0eXBlIG9mIFxjICp0aGlzCisgICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc21hcnRseSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1NjYWxhclR5cGU+CisgIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxQYXJhbWV0cml6ZWRMaW5lLAorICAgICAgICAgICBQYXJhbWV0cml6ZWRMaW5lPE5ld1NjYWxhclR5cGUsQW1iaWVudERpbUF0Q29tcGlsZVRpbWU+ID46OnR5cGUgY2FzdCgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8UGFyYW1ldHJpemVkTGluZSwKKyAgICAgICAgICAgICAgICAgICAgUGFyYW1ldHJpemVkTGluZTxOZXdTY2FsYXJUeXBlLEFtYmllbnREaW1BdENvbXBpbGVUaW1lPiA+Ojp0eXBlKCp0aGlzKTsKKyAgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIHR5cGUgY29udmVyc2lvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhclR5cGU+CisgIGlubGluZSBleHBsaWNpdCBQYXJhbWV0cml6ZWRMaW5lKGNvbnN0IFBhcmFtZXRyaXplZExpbmU8T3RoZXJTY2FsYXJUeXBlLEFtYmllbnREaW1BdENvbXBpbGVUaW1lPiYgb3RoZXIpCisgIHsKKyAgICBtX29yaWdpbiA9IG90aGVyLm9yaWdpbigpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICAgIG1fZGlyZWN0aW9uID0gb3RoZXIuZGlyZWN0aW9uKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgIH0KKworICAvKiogXHJldHVybnMgXGMgdHJ1ZSBpZiBcYyAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIFxhIG90aGVyLCB3aXRoaW4gdGhlIHByZWNpc2lvbgorICAgICogZGV0ZXJtaW5lZCBieSBcYSBwcmVjLgorICAgICoKKyAgICAqIFxzYSBNYXRyaXhCYXNlOjppc0FwcHJveCgpICovCisgIGJvb2wgaXNBcHByb3goY29uc3QgUGFyYW1ldHJpemVkTGluZSYgb3RoZXIsIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHByZWMgPSBwcmVjaXNpb248U2NhbGFyPigpKSBjb25zdAorICB7IHJldHVybiBtX29yaWdpbi5pc0FwcHJveChvdGhlci5tX29yaWdpbiwgcHJlYykgJiYgbV9kaXJlY3Rpb24uaXNBcHByb3gob3RoZXIubV9kaXJlY3Rpb24sIHByZWMpOyB9CisKK3Byb3RlY3RlZDoKKworICBWZWN0b3JUeXBlIG1fb3JpZ2luLCBtX2RpcmVjdGlvbjsKK307CisKKy8qKiBDb25zdHJ1Y3RzIGEgcGFyYW1ldHJpemVkIGxpbmUgZnJvbSBhIDJEIGh5cGVycGxhbmUKKyAgKgorICAqIFx3YXJuaW5nIHRoZSBhbWJpZW50IHNwYWNlIG11c3QgaGF2ZSBkaW1lbnNpb24gMiBzdWNoIHRoYXQgdGhlIGh5cGVycGxhbmUgYWN0dWFsbHkgZGVzY3JpYmVzIGEgbGluZQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbT4KK2lubGluZSBQYXJhbWV0cml6ZWRMaW5lPF9TY2FsYXIsIF9BbWJpZW50RGltPjo6UGFyYW1ldHJpemVkTGluZShjb25zdCBIeXBlcnBsYW5lPF9TY2FsYXIsIF9BbWJpZW50RGltPiYgaHlwZXJwbGFuZSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShWZWN0b3JUeXBlLCAyKQorICBkaXJlY3Rpb24oKSA9IGh5cGVycGxhbmUubm9ybWFsKCkudW5pdE9ydGhvZ29uYWwoKTsKKyAgb3JpZ2luKCkgPSAtaHlwZXJwbGFuZS5ub3JtYWwoKSpoeXBlcnBsYW5lLm9mZnNldCgpOworfQorCisvKiogXHJldHVybnMgdGhlIHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gXGMgKnRoaXMgYW5kIHRoZSBnaXZlbiBoeXBlcnBsYW5lCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9BbWJpZW50RGltPgoraW5saW5lIF9TY2FsYXIgUGFyYW1ldHJpemVkTGluZTxfU2NhbGFyLCBfQW1iaWVudERpbT46OmludGVyc2VjdGlvbihjb25zdCBIeXBlcnBsYW5lPF9TY2FsYXIsIF9BbWJpZW50RGltPiYgaHlwZXJwbGFuZSkKK3sKKyAgcmV0dXJuIC0oaHlwZXJwbGFuZS5vZmZzZXQoKStvcmlnaW4oKS5laWdlbjJfZG90KGh5cGVycGxhbmUubm9ybWFsKCkpKQorICAgICAgICAgIC8oZGlyZWN0aW9uKCkuZWlnZW4yX2RvdChoeXBlcnBsYW5lLm5vcm1hbCgpKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvUXVhdGVybmlvbi5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvUXVhdGVybmlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODdkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9RdWF0ZXJuaW9uLmgKQEAgLTAsMCArMSw0OTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIG5vIGluY2x1ZGUgZ3VhcmQsIHdlJ2xsIGluY2x1ZGUgdGhpcyB0d2ljZSBmcm9tIEFsbC5oIGZyb20gRWlnZW4yU3VwcG9ydCwgYW5kIGl0J3MgaW50ZXJuYWwgYW55d2F5CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwKKyAgICAgICAgIGludCBPdGhlclJvd3M9T3RoZXI6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgaW50IE90aGVyQ29scz1PdGhlcjo6Q29sc0F0Q29tcGlsZVRpbWU+CitzdHJ1Y3QgZWlfcXVhdGVybmlvbl9hc3NpZ25faW1wbDsKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgUXVhdGVybmlvbgorICAqCisgICogXGJyaWVmIFRoZSBxdWF0ZXJuaW9uIGNsYXNzIHVzZWQgdG8gcmVwcmVzZW50IDNEIG9yaWVudGF0aW9ucyBhbmQgcm90YXRpb25zCisgICoKKyAgKiBccGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4sIHRoZSB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHF1YXRlcm5pb24gXGYkIHcreGkreWoremsgXGYkIHRoYXQgaXMgYSBjb252ZW5pZW50IHJlcHJlc2VudGF0aW9uIG9mCisgICogb3JpZW50YXRpb25zIGFuZCByb3RhdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aHJlZSBkaW1lbnNpb25zLiBDb21wYXJlZCB0byBvdGhlciByZXByZXNlbnRhdGlvbnMKKyAgKiBsaWtlIEV1bGVyIGFuZ2xlcyBvciAzeDMgbWF0cmljZXMsIHF1YXRlcnRpb25zIG9mZmVyIHRoZSBmb2xsb3dpbmcgYWR2YW50YWdlczoKKyAgKiBcbGkgXGIgY29tcGFjdCBzdG9yYWdlICg0IHNjYWxhcnMpCisgICogXGxpIFxiIGVmZmljaWVudCB0byBjb21wb3NlICgyOCBmbG9wcyksCisgICogXGxpIFxiIHN0YWJsZSBzcGhlcmljYWwgaW50ZXJwb2xhdGlvbgorICAqCisgICogVGhlIGZvbGxvd2luZyB0d28gdHlwZWRlZnMgYXJlIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZToKKyAgKiBcbGkgXGMgUXVhdGVybmlvbmYgZm9yIFxjIGZsb2F0CisgICogXGxpIFxjIFF1YXRlcm5pb25kIGZvciBcYyBkb3VibGUKKyAgKgorICAqIFxzYSAgY2xhc3MgQW5nbGVBeGlzLCBjbGFzcyBUcmFuc2Zvcm0KKyAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4gc3RydWN0IGVpX3RyYWl0czxRdWF0ZXJuaW9uPF9TY2FsYXI+ID4KK3sKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+CitjbGFzcyBRdWF0ZXJuaW9uIDogcHVibGljIFJvdGF0aW9uQmFzZTxRdWF0ZXJuaW9uPF9TY2FsYXI+LDM+Cit7CisgIHR5cGVkZWYgUm90YXRpb25CYXNlPFF1YXRlcm5pb248X1NjYWxhcj4sMz4gQmFzZTsKKworcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsNCkKKworICB1c2luZyBCYXNlOjpvcGVyYXRvcio7CisKKyAgLyoqIHRoZSBzY2FsYXIgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzICovCisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisKKyAgLyoqIHRoZSB0eXBlIG9mIHRoZSBDb2VmZmljaWVudHMgNC12ZWN0b3IgKi8KKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCA0LCAxPiBDb2VmZmljaWVudHM7CisgIC8qKiB0aGUgdHlwZSBvZiBhIDNEIHZlY3RvciAqLworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICAvKiogdGhlIGVxdWl2YWxlbnQgcm90YXRpb24gbWF0cml4IHR5cGUgKi8KKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsKKyAgLyoqIHRoZSBlcXVpdmFsZW50IGFuZ2xlLWF4aXMgdHlwZSAqLworICB0eXBlZGVmIEFuZ2xlQXhpczxTY2FsYXI+IEFuZ2xlQXhpc1R5cGU7CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBcYyB4IGNvZWZmaWNpZW50ICovCisgIGlubGluZSBTY2FsYXIgeCgpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzLmNvZWZmKDApOyB9CisgIC8qKiBccmV0dXJucyB0aGUgXGMgeSBjb2VmZmljaWVudCAqLworICBpbmxpbmUgU2NhbGFyIHkoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmcy5jb2VmZigxKTsgfQorICAvKiogXHJldHVybnMgdGhlIFxjIHogY29lZmZpY2llbnQgKi8KKyAgaW5saW5lIFNjYWxhciB6KCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnMuY29lZmYoMik7IH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBcYyB3IGNvZWZmaWNpZW50ICovCisgIGlubGluZSBTY2FsYXIgdygpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzLmNvZWZmKDMpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBcYyB4IGNvZWZmaWNpZW50ICovCisgIGlubGluZSBTY2FsYXImIHgoKSB7IHJldHVybiBtX2NvZWZmcy5jb2VmZlJlZigwKTsgfQorICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIFxjIHkgY29lZmZpY2llbnQgKi8KKyAgaW5saW5lIFNjYWxhciYgeSgpIHsgcmV0dXJuIG1fY29lZmZzLmNvZWZmUmVmKDEpOyB9CisgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgXGMgeiBjb2VmZmljaWVudCAqLworICBpbmxpbmUgU2NhbGFyJiB6KCkgeyByZXR1cm4gbV9jb2VmZnMuY29lZmZSZWYoMik7IH0KKyAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBcYyB3IGNvZWZmaWNpZW50ICovCisgIGlubGluZSBTY2FsYXImIHcoKSB7IHJldHVybiBtX2NvZWZmcy5jb2VmZlJlZigzKTsgfQorCisgIC8qKiBccmV0dXJucyBhIHJlYWQtb25seSB2ZWN0b3IgZXhwcmVzc2lvbiBvZiB0aGUgaW1hZ2luYXJ5IHBhcnQgKHgseSx6KSAqLworICBpbmxpbmUgY29uc3QgQmxvY2s8Y29uc3QgQ29lZmZpY2llbnRzLDMsMT4gdmVjKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnMudGVtcGxhdGUgc3RhcnQ8Mz4oKTsgfQorCisgIC8qKiBccmV0dXJucyBhIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBpbWFnaW5hcnkgcGFydCAoeCx5LHopICovCisgIGlubGluZSBCbG9jazxDb2VmZmljaWVudHMsMywxPiB2ZWMoKSB7IHJldHVybiBtX2NvZWZmcy50ZW1wbGF0ZSBzdGFydDwzPigpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVhZC1vbmx5IHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudHMgKHgseSx6LHcpICovCisgIGlubGluZSBjb25zdCBDb2VmZmljaWVudHMmIGNvZWZmcygpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50cyAoeCx5LHosdykgKi8KKyAgaW5saW5lIENvZWZmaWNpZW50cyYgY29lZmZzKCkgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciBsZWF2aW5nIHRoZSBxdWF0ZXJuaW9uIHVuaW5pdGlhbGl6ZWQuICovCisgIGlubGluZSBRdWF0ZXJuaW9uKCkge30KKworICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZXMgdGhlIHF1YXRlcm5pb24gXGYkIHcreGkreWoremsgXGYkIGZyb20KKyAgICAqIGl0cyBmb3VyIGNvZWZmaWNpZW50cyBcYSB3LCBcYSB4LCBcYSB5IGFuZCBcYSB6LgorICAgICoKKyAgICAqIFx3YXJuaW5nIE5vdGUgdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHM6IHRoZSByZWFsIFxhIHcgY29lZmZpY2llbnQgZmlyc3QsCisgICAgKiB3aGlsZSBpbnRlcm5hbGx5IHRoZSBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgICogW1xjIHgsIFxjIHksIFxjIHosIFxjIHddCisgICAgKi8KKyAgaW5saW5lIFF1YXRlcm5pb24oU2NhbGFyIHcsIFNjYWxhciB4LCBTY2FsYXIgeSwgU2NhbGFyIHopCisgIHsgbV9jb2VmZnMgPDwgeCwgeSwgeiwgdzsgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yICovCisgIGlubGluZSBRdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb24mIG90aGVyKSB7IG1fY29lZmZzID0gb3RoZXIubV9jb2VmZnM7IH0KKworICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGFuZ2xlLWF4aXMgXGEgYWEgKi8KKyAgZXhwbGljaXQgaW5saW5lIFF1YXRlcm5pb24oY29uc3QgQW5nbGVBeGlzVHlwZSYgYWEpIHsgKnRoaXMgPSBhYTsgfQorCisgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplcyBhIHF1YXRlcm5pb24gZnJvbSBlaXRoZXI6CisgICAgKiAgLSBhIHJvdGF0aW9uIG1hdHJpeCBleHByZXNzaW9uLAorICAgICogIC0gYSA0RCB2ZWN0b3IgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgcXVhdGVybmlvbiBjb2VmZmljaWVudHMuCisgICAgKiBcc2Egb3BlcmF0b3I9KE1hdHJpeEJhc2U8RGVyaXZlZD4pCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgZXhwbGljaXQgaW5saW5lIFF1YXRlcm5pb24oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgb3RoZXIpIHsgKnRoaXMgPSBvdGhlcjsgfQorCisgIFF1YXRlcm5pb24mIG9wZXJhdG9yPShjb25zdCBRdWF0ZXJuaW9uJiBvdGhlcik7CisgIFF1YXRlcm5pb24mIG9wZXJhdG9yPShjb25zdCBBbmdsZUF4aXNUeXBlJiBhYSk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIFF1YXRlcm5pb24mIG9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKTsKKworICAvKiogXHJldHVybnMgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyBhbiBpZGVudGl0eSByb3RhdGlvbgorICAgICogXHNhIE1hdHJpeEJhc2U6OklkZW50aXR5KCkKKyAgICAqLworICBzdGF0aWMgaW5saW5lIFF1YXRlcm5pb24gSWRlbnRpdHkoKSB7IHJldHVybiBRdWF0ZXJuaW9uKDEsIDAsIDAsIDApOyB9CisKKyAgLyoqIFxzYSBRdWF0ZXJuaW9uOjpJZGVudGl0eSgpLCBNYXRyaXhCYXNlOjpzZXRJZGVudGl0eSgpCisgICAgKi8KKyAgaW5saW5lIFF1YXRlcm5pb24mIHNldElkZW50aXR5KCkgeyBtX2NvZWZmcyA8PCAwLCAwLCAwLCAxOyByZXR1cm4gKnRoaXM7IH0KKworICAvKiogXHJldHVybnMgdGhlIHNxdWFyZWQgbm9ybSBvZiB0aGUgcXVhdGVybmlvbidzIGNvZWZmaWNpZW50cworICAgICogXHNhIFF1YXRlcm5pb246Om5vcm0oKSwgTWF0cml4QmFzZTo6c3F1YXJlZE5vcm0oKQorICAgICovCisgIGlubGluZSBTY2FsYXIgc3F1YXJlZE5vcm0oKSBjb25zdCB7IHJldHVybiBtX2NvZWZmcy5zcXVhcmVkTm9ybSgpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBub3JtIG9mIHRoZSBxdWF0ZXJuaW9uJ3MgY29lZmZpY2llbnRzCisgICAgKiBcc2EgUXVhdGVybmlvbjo6c3F1YXJlZE5vcm0oKSwgTWF0cml4QmFzZTo6bm9ybSgpCisgICAgKi8KKyAgaW5saW5lIFNjYWxhciBub3JtKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnMubm9ybSgpOyB9CisKKyAgLyoqIE5vcm1hbGl6ZXMgdGhlIHF1YXRlcm5pb24gXGMgKnRoaXMKKyAgICAqIFxzYSBub3JtYWxpemVkKCksIE1hdHJpeEJhc2U6Om5vcm1hbGl6ZSgpICovCisgIGlubGluZSB2b2lkIG5vcm1hbGl6ZSgpIHsgbV9jb2VmZnMubm9ybWFsaXplKCk7IH0KKyAgLyoqIFxyZXR1cm5zIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIFxjICp0aGlzCisgICAgKiBcc2Egbm9ybWFsaXplKCksIE1hdHJpeEJhc2U6Om5vcm1hbGl6ZWQoKSAqLworICBpbmxpbmUgUXVhdGVybmlvbiBub3JtYWxpemVkKCkgY29uc3QgeyByZXR1cm4gUXVhdGVybmlvbihtX2NvZWZmcy5ub3JtYWxpemVkKCkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgICAqIEdlb21ldHJpY2FsbHkgc3BlYWtpbmcsIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdW5pdCBxdWF0ZXJuaW9ucworICAgICogY29ycmVzcG9uZHMgdG8gdGhlIGNvc2luZSBvZiBoYWxmIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSB0d28gcm90YXRpb25zLgorICAgICogXHNhIGFuZ3VsYXJEaXN0YW5jZSgpCisgICAgKi8KKyAgaW5saW5lIFNjYWxhciBlaWdlbjJfZG90KGNvbnN0IFF1YXRlcm5pb24mIG90aGVyKSBjb25zdCB7IHJldHVybiBtX2NvZWZmcy5laWdlbjJfZG90KG90aGVyLm1fY29lZmZzKTsgfQorCisgIGlubGluZSBTY2FsYXIgYW5ndWxhckRpc3RhbmNlKGNvbnN0IFF1YXRlcm5pb24mIG90aGVyKSBjb25zdDsKKworICBNYXRyaXgzIHRvUm90YXRpb25NYXRyaXgodm9pZCkgY29uc3Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgorICBRdWF0ZXJuaW9uJiBzZXRGcm9tVHdvVmVjdG9ycyhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgYSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIGIpOworCisgIGlubGluZSBRdWF0ZXJuaW9uIG9wZXJhdG9yKiAoY29uc3QgUXVhdGVybmlvbiYgcSkgY29uc3Q7CisgIGlubGluZSBRdWF0ZXJuaW9uJiBvcGVyYXRvcio9IChjb25zdCBRdWF0ZXJuaW9uJiBxKTsKKworICBRdWF0ZXJuaW9uIGludmVyc2Uodm9pZCkgY29uc3Q7CisgIFF1YXRlcm5pb24gY29uanVnYXRlKHZvaWQpIGNvbnN0OworCisgIFF1YXRlcm5pb24gc2xlcnAoU2NhbGFyIHQsIGNvbnN0IFF1YXRlcm5pb24mIG90aGVyKSBjb25zdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBWZWN0b3IzIG9wZXJhdG9yKiAoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgdmVjKSBjb25zdDsKKworICAvKiogXHJldHVybnMgXGMgKnRoaXMgd2l0aCBzY2FsYXIgdHlwZSBjYXN0ZWQgdG8gXGEgTmV3U2NhbGFyVHlwZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBpZiBcYSBOZXdTY2FsYXJUeXBlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHNjYWxhciB0eXBlIG9mIFxjICp0aGlzCisgICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc21hcnRseSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1NjYWxhclR5cGU+CisgIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxRdWF0ZXJuaW9uLFF1YXRlcm5pb248TmV3U2NhbGFyVHlwZT4gPjo6dHlwZSBjYXN0KCkgY29uc3QKKyAgeyByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8UXVhdGVybmlvbixRdWF0ZXJuaW9uPE5ld1NjYWxhclR5cGU+ID46OnR5cGUoKnRoaXMpOyB9CisKKyAgLyoqIENvcHkgY29uc3RydWN0b3Igd2l0aCBzY2FsYXIgdHlwZSBjb252ZXJzaW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZT4KKyAgaW5saW5lIGV4cGxpY2l0IFF1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvbjxPdGhlclNjYWxhclR5cGU+JiBvdGhlcikKKyAgeyBtX2NvZWZmcyA9IG90aGVyLmNvZWZmcygpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOyB9CisKKyAgLyoqIFxyZXR1cm5zIFxjIHRydWUgaWYgXGMgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSBvdGhlciwgd2l0aGluIHRoZSBwcmVjaXNpb24KKyAgICAqIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgICAqCisgICAgKiBcc2EgTWF0cml4QmFzZTo6aXNBcHByb3goKSAqLworICBib29sIGlzQXBwcm94KGNvbnN0IFF1YXRlcm5pb24mIG90aGVyLCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBwcmVjID0gcHJlY2lzaW9uPFNjYWxhcj4oKSkgY29uc3QKKyAgeyByZXR1cm4gbV9jb2VmZnMuaXNBcHByb3gob3RoZXIubV9jb2VmZnMsIHByZWMpOyB9CisKK3Byb3RlY3RlZDoKKyAgQ29lZmZpY2llbnRzIG1fY29lZmZzOworfTsKKworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIHNpbmdsZSBwcmVjaXNpb24gcXVhdGVybmlvbiB0eXBlICovCit0eXBlZGVmIFF1YXRlcm5pb248ZmxvYXQ+IFF1YXRlcm5pb25mOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIGRvdWJsZSBwcmVjaXNpb24gcXVhdGVybmlvbiB0eXBlICovCit0eXBlZGVmIFF1YXRlcm5pb248ZG91YmxlPiBRdWF0ZXJuaW9uZDsKKworLy8gR2VuZXJpYyBRdWF0ZXJuaW9uICogUXVhdGVybmlvbiBwcm9kdWN0Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IGlubGluZSBRdWF0ZXJuaW9uPFNjYWxhcj4KK2VpX3F1YXRlcm5pb25fcHJvZHVjdChjb25zdCBRdWF0ZXJuaW9uPFNjYWxhcj4mIGEsIGNvbnN0IFF1YXRlcm5pb248U2NhbGFyPiYgYikKK3sKKyAgcmV0dXJuIFF1YXRlcm5pb248U2NhbGFyPgorICAoCisgICAgYS53KCkgKiBiLncoKSAtIGEueCgpICogYi54KCkgLSBhLnkoKSAqIGIueSgpIC0gYS56KCkgKiBiLnooKSwKKyAgICBhLncoKSAqIGIueCgpICsgYS54KCkgKiBiLncoKSArIGEueSgpICogYi56KCkgLSBhLnooKSAqIGIueSgpLAorICAgIGEudygpICogYi55KCkgKyBhLnkoKSAqIGIudygpICsgYS56KCkgKiBiLngoKSAtIGEueCgpICogYi56KCksCisgICAgYS53KCkgKiBiLnooKSArIGEueigpICogYi53KCkgKyBhLngoKSAqIGIueSgpIC0gYS55KCkgKiBiLngoKQorICApOworfQorCisvKiogXHJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdHdvIHJvdGF0aW9ucyBhcyBhIHF1YXRlcm5pb24tcXVhdGVybmlvbiBwcm9kdWN0ICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9uPFNjYWxhcj46Om9wZXJhdG9yKiAoY29uc3QgUXVhdGVybmlvbiYgb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBlaV9xdWF0ZXJuaW9uX3Byb2R1Y3QoKnRoaXMsb3RoZXIpOworfQorCisvKiogXHNhIG9wZXJhdG9yKihRdWF0ZXJuaW9uKSAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBRdWF0ZXJuaW9uPFNjYWxhcj4mIFF1YXRlcm5pb248U2NhbGFyPjo6b3BlcmF0b3IqPSAoY29uc3QgUXVhdGVybmlvbiYgb3RoZXIpCit7CisgIHJldHVybiAoKnRoaXMgPSAqdGhpcyAqIG90aGVyKTsKK30KKworLyoqIFJvdGF0aW9uIG9mIGEgdmVjdG9yIGJ5IGEgcXVhdGVybmlvbi4KKyAgKiBccmVtYXJrcyBJZiB0aGUgcXVhdGVybmlvbiBpcyB1c2VkIHRvIHJvdGF0ZSBzZXZlcmFsIHBvaW50cyAoPjEpCisgICogdGhlbiBpdCBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRvIGZpcnN0IGNvbnZlcnQgaXQgdG8gYSAzeDMgTWF0cml4LgorICAqIENvbXBhcmlzb24gb2YgdGhlIG9wZXJhdGlvbiBjb3N0IGZvciBuIHRyYW5zZm9ybWF0aW9uczoKKyAgKiAgIC0gUXVhdGVybmlvbjogICAgMzBuCisgICogICAtIFZpYSBhIE1hdHJpeDM6IDI0ICsgMTVuCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBRdWF0ZXJuaW9uPFNjYWxhcj46OlZlY3RvcjMKK1F1YXRlcm5pb248U2NhbGFyPjo6b3BlcmF0b3IqIChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiB2KSBjb25zdAoreworICAgIC8vIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjb21lcyBmcm9tIHRoZSBvcHRpbWl6YXRpb24gYnkgaGFuZAorICAgIC8vIG9mIHRoZSBjb252ZXJzaW9uIHRvIGEgTWF0cml4IGZvbGxvd2VkIGJ5IGEgTWF0cml4L1ZlY3RvciBwcm9kdWN0LgorICAgIC8vIEl0IGFwcGVhcnMgdG8gYmUgbXVjaCBmYXN0ZXIgdGhhbiB0aGUgY29tbW9uIGFsZ29yaXRobSBmb3VuZAorICAgIC8vIGluIHRoZSBsaXR0ZXJhdHVyZSAoMzAgdmVyc3VzIDM5IGZsb3BzKS4gSXQgYWxzbyByZXF1aXJlcyB0d28KKyAgICAvLyBWZWN0b3IzIGFzIHRlbXBvcmFyaWVzLgorICAgIFZlY3RvcjMgdXY7CisgICAgdXYgPSAyICogdGhpcy0+dmVjKCkuY3Jvc3Modik7CisgICAgcmV0dXJuIHYgKyB0aGlzLT53KCkgKiB1diArIHRoaXMtPnZlYygpLmNyb3NzKHV2KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIFF1YXRlcm5pb248U2NhbGFyPiYgUXVhdGVybmlvbjxTY2FsYXI+OjpvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvbiYgb3RoZXIpCit7CisgIG1fY29lZmZzID0gb3RoZXIubV9jb2VmZnM7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFNldCBcYyAqdGhpcyBmcm9tIGFuIGFuZ2xlLWF4aXMgXGEgYWEgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBRdWF0ZXJuaW9uPFNjYWxhcj4mIFF1YXRlcm5pb248U2NhbGFyPjo6b3BlcmF0b3I9KGNvbnN0IEFuZ2xlQXhpc1R5cGUmIGFhKQoreworICBTY2FsYXIgaGEgPSBTY2FsYXIoMC41KSphYS5hbmdsZSgpOyAvLyBTY2FsYXIoMC41KSB0byBzdXBwcmVzcyBwcmVjaXNpb24gbG9zcyB3YXJuaW5ncworICB0aGlzLT53KCkgPSBlaV9jb3MoaGEpOworICB0aGlzLT52ZWMoKSA9IGVpX3NpbihoYSkgKiBhYS5heGlzKCk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFNldCBcYyAqdGhpcyBmcm9tIHRoZSBleHByZXNzaW9uIFxhIHhwcjoKKyAgKiAgIC0gaWYgXGEgeHByIGlzIGEgNHgxIHZlY3RvciwgdGhlbiBcYSB4cHIgaXMgYXNzdW1lZCB0byBiZSBhIHF1YXRlcm5pb24KKyAgKiAgIC0gaWYgXGEgeHByIGlzIGEgM3gzIG1hdHJpeCwgdGhlbiBcYSB4cHIgaXMgYXNzdW1lZCB0byBiZSByb3RhdGlvbiBtYXRyaXgKKyAgKiAgICAgYW5kIFxhIHhwciBpcyBjb252ZXJ0ZWQgdG8gYSBxdWF0ZXJuaW9uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIFF1YXRlcm5pb248U2NhbGFyPiYgUXVhdGVybmlvbjxTY2FsYXI+OjpvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgeHByKQoreworICBlaV9xdWF0ZXJuaW9uX2Fzc2lnbl9pbXBsPERlcml2ZWQ+OjpydW4oKnRoaXMsIHhwci5kZXJpdmVkKCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBDb252ZXJ0IHRoZSBxdWF0ZXJuaW9uIHRvIGEgM3gzIHJvdGF0aW9uIG1hdHJpeCAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIHR5cGVuYW1lIFF1YXRlcm5pb248U2NhbGFyPjo6TWF0cml4MworUXVhdGVybmlvbjxTY2FsYXI+Ojp0b1JvdGF0aW9uTWF0cml4KHZvaWQpIGNvbnN0Cit7CisgIC8vIE5PVEUgaWYgaW5saW5lZCwgdGhlbiBnY2MgNC4yIGFuZCA0LjQgZ2V0IHJpZCBvZiB0aGUgdGVtcG9yYXJ5IChub3QgZ2NjIDQuMyAhISkKKyAgLy8gaWYgbm90IGlubGluZWQgdGhlbiB0aGUgY29zdCBvZiB0aGUgcmV0dXJuIGJ5IHZhbHVlIGlzIGh1Z2UgfiArMzUlLAorICAvLyBob3dldmVyLCBub3QgaW5saW5pbmcgdGhpcyBmdW5jdGlvbiBpcyBhbiBvcmRlciBvZiBtYWduaXR1ZGUgc2xvd2VyLCBzbworICAvLyBpdCBoYXMgdG8gYmUgaW5saW5lZCwgYW5kIHNvIHRoZSByZXR1cm4gYnkgdmFsdWUgaXMgbm90IGFuIGlzc3VlCisgIE1hdHJpeDMgcmVzOworCisgIGNvbnN0IFNjYWxhciB0eCAgPSBTY2FsYXIoMikqdGhpcy0+eCgpOworICBjb25zdCBTY2FsYXIgdHkgID0gU2NhbGFyKDIpKnRoaXMtPnkoKTsKKyAgY29uc3QgU2NhbGFyIHR6ICA9IFNjYWxhcigyKSp0aGlzLT56KCk7CisgIGNvbnN0IFNjYWxhciB0d3ggPSB0eCp0aGlzLT53KCk7CisgIGNvbnN0IFNjYWxhciB0d3kgPSB0eSp0aGlzLT53KCk7CisgIGNvbnN0IFNjYWxhciB0d3ogPSB0eip0aGlzLT53KCk7CisgIGNvbnN0IFNjYWxhciB0eHggPSB0eCp0aGlzLT54KCk7CisgIGNvbnN0IFNjYWxhciB0eHkgPSB0eSp0aGlzLT54KCk7CisgIGNvbnN0IFNjYWxhciB0eHogPSB0eip0aGlzLT54KCk7CisgIGNvbnN0IFNjYWxhciB0eXkgPSB0eSp0aGlzLT55KCk7CisgIGNvbnN0IFNjYWxhciB0eXogPSB0eip0aGlzLT55KCk7CisgIGNvbnN0IFNjYWxhciB0enogPSB0eip0aGlzLT56KCk7CisKKyAgcmVzLmNvZWZmUmVmKDAsMCkgPSBTY2FsYXIoMSktKHR5eSt0enopOworICByZXMuY29lZmZSZWYoMCwxKSA9IHR4eS10d3o7CisgIHJlcy5jb2VmZlJlZigwLDIpID0gdHh6K3R3eTsKKyAgcmVzLmNvZWZmUmVmKDEsMCkgPSB0eHkrdHd6OworICByZXMuY29lZmZSZWYoMSwxKSA9IFNjYWxhcigxKS0odHh4K3R6eik7CisgIHJlcy5jb2VmZlJlZigxLDIpID0gdHl6LXR3eDsKKyAgcmVzLmNvZWZmUmVmKDIsMCkgPSB0eHotdHd5OworICByZXMuY29lZmZSZWYoMiwxKSA9IHR5eit0d3g7CisgIHJlcy5jb2VmZlJlZigyLDIpID0gU2NhbGFyKDEpLSh0eHgrdHl5KTsKKworICByZXR1cm4gcmVzOworfQorCisvKiogU2V0cyAqdGhpcyB0byBiZSBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIGEgcm90YXRpb24gc2VuZGluZyB0aGUgdmVjdG9yIFxhIGEgdG8gdGhlIHZlY3RvciBcYSBiLgorICAqCisgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gKnRoaXMuCisgICoKKyAgKiBOb3RlIHRoYXQgdGhlIHR3byBpbnB1dCB2ZWN0b3JzIGRvIFxiIG5vdCBoYXZlIHRvIGJlIG5vcm1hbGl6ZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDI+CitpbmxpbmUgUXVhdGVybmlvbjxTY2FsYXI+JiBRdWF0ZXJuaW9uPFNjYWxhcj46OnNldEZyb21Ud29WZWN0b3JzKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZDE+JiBhLCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQyPiYgYikKK3sKKyAgVmVjdG9yMyB2MCA9IGEubm9ybWFsaXplZCgpOworICBWZWN0b3IzIHYxID0gYi5ub3JtYWxpemVkKCk7CisgIFNjYWxhciBjID0gdjAuZWlnZW4yX2RvdCh2MSk7CisKKyAgLy8gaWYgZG90ID09IDEsIHZlY3RvcnMgYXJlIHRoZSBzYW1lCisgIGlmIChlaV9pc0FwcHJveChjLFNjYWxhcigxKSkpCisgIHsKKyAgICAvLyBzZXQgdG8gaWRlbnRpdHkKKyAgICB0aGlzLT53KCkgPSAxOyB0aGlzLT52ZWMoKS5zZXRaZXJvKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIC8vIGlmIGRvdCA9PSAtMSwgdmVjdG9ycyBhcmUgb3Bwb3NpdGVzCisgIGlmIChlaV9pc0FwcHJveChjLFNjYWxhcigtMSkpKQorICB7CisgICAgdGhpcy0+dmVjKCkgPSB2MC51bml0T3J0aG9nb25hbCgpOworICAgIHRoaXMtPncoKSA9IDA7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVmVjdG9yMyBheGlzID0gdjAuY3Jvc3ModjEpOworICBTY2FsYXIgcyA9IGVpX3NxcnQoKFNjYWxhcigxKStjKSpTY2FsYXIoMikpOworICBTY2FsYXIgaW52cyA9IFNjYWxhcigxKS9zOworICB0aGlzLT52ZWMoKSA9IGF4aXMgKiBpbnZzOworICB0aGlzLT53KCkgPSBzICogU2NhbGFyKDAuNSk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogXHJldHVybnMgdGhlIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YgXGMgKnRoaXMKKyAgKiBOb3RlIHRoYXQgaW4gbW9zdCBjYXNlcywgaS5lLiwgaWYgeW91IHNpbXBseSB3YW50IHRoZSBvcHBvc2l0ZSByb3RhdGlvbiwKKyAgKiBhbmQvb3IgdGhlIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCwgdGhlbiBpdCBpcyBlbm91Z2ggdG8gdXNlIHRoZSBjb25qdWdhdGUuCisgICoKKyAgKiBcc2EgUXVhdGVybmlvbjo6Y29uanVnYXRlKCkKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgUXVhdGVybmlvbjxTY2FsYXI+IFF1YXRlcm5pb248U2NhbGFyPjo6aW52ZXJzZSgpIGNvbnN0Cit7CisgIC8vIEZJWE1FIHNob3VsZCB0aGlzIGZ1bmN0aW9uIGJlIGNhbGxlZCBtdWx0aXBsaWNhdGl2ZUludmVyc2UgYW5kIGNvbmp1Z2F0ZSgpIGJlIGNhbGxlZCBpbnZlcnNlKCkgb3Igb3Bwb3NpdGUoKSAgPz8KKyAgU2NhbGFyIG4yID0gdGhpcy0+c3F1YXJlZE5vcm0oKTsKKyAgaWYgKG4yID4gMCkKKyAgICByZXR1cm4gUXVhdGVybmlvbihjb25qdWdhdGUoKS5jb2VmZnMoKSAvIG4yKTsKKyAgZWxzZQorICB7CisgICAgLy8gcmV0dXJuIGFuIGludmFsaWQgcmVzdWx0IHRvIGZsYWcgdGhlIGVycm9yCisgICAgcmV0dXJuIFF1YXRlcm5pb24oQ29lZmZpY2llbnRzOjpaZXJvKCkpOworICB9Cit9CisKKy8qKiBccmV0dXJucyB0aGUgY29uanVnYXRlIG9mIHRoZSBcYyAqdGhpcyB3aGljaCBpcyBlcXVhbCB0byB0aGUgbXVsdGlwbGljYXRpdmUgaW52ZXJzZQorICAqIGlmIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQuCisgICogVGhlIGNvbmp1Z2F0ZSBvZiBhIHF1YXRlcm5pb24gcmVwcmVzZW50cyB0aGUgb3Bwb3NpdGUgcm90YXRpb24uCisgICoKKyAgKiBcc2EgUXVhdGVybmlvbjo6aW52ZXJzZSgpCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9uPFNjYWxhcj46OmNvbmp1Z2F0ZSgpIGNvbnN0Cit7CisgIHJldHVybiBRdWF0ZXJuaW9uKHRoaXMtPncoKSwtdGhpcy0+eCgpLC10aGlzLT55KCksLXRoaXMtPnooKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgYW5nbGUgKGluIHJhZGlhbikgYmV0d2VlbiB0d28gcm90YXRpb25zCisgICogXHNhIGVpZ2VuMl9kb3QoKQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBTY2FsYXIgUXVhdGVybmlvbjxTY2FsYXI+Ojphbmd1bGFyRGlzdGFuY2UoY29uc3QgUXVhdGVybmlvbiYgb3RoZXIpIGNvbnN0Cit7CisgIGRvdWJsZSBkID0gZWlfYWJzKHRoaXMtPmVpZ2VuMl9kb3Qob3RoZXIpKTsKKyAgaWYgKGQ+PTEuMCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIFNjYWxhcigyKSAqIHN0ZDo6YWNvcyhkKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdHdvIHF1YXRlcm5pb25zCisgICogXGMgKnRoaXMgYW5kIFxhIG90aGVyIGF0IHRoZSBwYXJhbWV0ZXIgXGEgdAorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK1F1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9uPFNjYWxhcj46OnNsZXJwKFNjYWxhciB0LCBjb25zdCBRdWF0ZXJuaW9uJiBvdGhlcikgY29uc3QKK3sKKyAgc3RhdGljIGNvbnN0IFNjYWxhciBvbmUgPSBTY2FsYXIoMSkgLSBtYWNoaW5lX2Vwc2lsb248U2NhbGFyPigpOworICBTY2FsYXIgZCA9IHRoaXMtPmVpZ2VuMl9kb3Qob3RoZXIpOworICBTY2FsYXIgYWJzRCA9IGVpX2FicyhkKTsKKworICBTY2FsYXIgc2NhbGUwOworICBTY2FsYXIgc2NhbGUxOworCisgIGlmIChhYnNEPj1vbmUpCisgIHsKKyAgICBzY2FsZTAgPSBTY2FsYXIoMSkgLSB0OworICAgIHNjYWxlMSA9IHQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gdGhldGEgaXMgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIDIgcXVhdGVybmlvbnMKKyAgICBTY2FsYXIgdGhldGEgPSBzdGQ6OmFjb3MoYWJzRCk7CisgICAgU2NhbGFyIHNpblRoZXRhID0gZWlfc2luKHRoZXRhKTsKKworICAgIHNjYWxlMCA9IGVpX3NpbiggKCBTY2FsYXIoMSkgLSB0ICkgKiB0aGV0YSkgLyBzaW5UaGV0YTsKKyAgICBzY2FsZTEgPSBlaV9zaW4oICggdCAqIHRoZXRhKSApIC8gc2luVGhldGE7CisgICAgaWYgKGQ8MCkKKyAgICAgIHNjYWxlMSA9IC1zY2FsZTE7CisgIH0KKworICByZXR1cm4gUXVhdGVybmlvbjxTY2FsYXI+KHNjYWxlMCAqIGNvZWZmcygpICsgc2NhbGUxICogb3RoZXIuY29lZmZzKCkpOworfQorCisvLyBzZXQgZnJvbSBhIHJvdGF0aW9uIG1hdHJpeAordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXI+CitzdHJ1Y3QgZWlfcXVhdGVybmlvbl9hc3NpZ25faW1wbDxPdGhlciwzLDM+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgT3RoZXI6OlNjYWxhciBTY2FsYXI7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oUXVhdGVybmlvbjxTY2FsYXI+JiBxLCBjb25zdCBPdGhlciYgbWF0KQorICB7CisgICAgLy8gVGhpcyBhbGdvcml0aG0gY29tZXMgZnJvbSAgIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uIiwKKyAgICAvLyBLZW4gU2hvZW1ha2UsIDE5ODcgU0lHR1JBUEggY291cnNlIG5vdGVzCisgICAgU2NhbGFyIHQgPSBtYXQudHJhY2UoKTsKKyAgICBpZiAodCA+IDApCisgICAgeworICAgICAgdCA9IGVpX3NxcnQodCArIFNjYWxhcigxLjApKTsKKyAgICAgIHEudygpID0gU2NhbGFyKDAuNSkqdDsKKyAgICAgIHQgPSBTY2FsYXIoMC41KS90OworICAgICAgcS54KCkgPSAobWF0LmNvZWZmKDIsMSkgLSBtYXQuY29lZmYoMSwyKSkgKiB0OworICAgICAgcS55KCkgPSAobWF0LmNvZWZmKDAsMikgLSBtYXQuY29lZmYoMiwwKSkgKiB0OworICAgICAgcS56KCkgPSAobWF0LmNvZWZmKDEsMCkgLSBtYXQuY29lZmYoMCwxKSkgKiB0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaW50IGkgPSAwOworICAgICAgaWYgKG1hdC5jb2VmZigxLDEpID4gbWF0LmNvZWZmKDAsMCkpCisgICAgICAgIGkgPSAxOworICAgICAgaWYgKG1hdC5jb2VmZigyLDIpID4gbWF0LmNvZWZmKGksaSkpCisgICAgICAgIGkgPSAyOworICAgICAgaW50IGogPSAoaSsxKSUzOworICAgICAgaW50IGsgPSAoaisxKSUzOworCisgICAgICB0ID0gZWlfc3FydChtYXQuY29lZmYoaSxpKS1tYXQuY29lZmYoaixqKS1tYXQuY29lZmYoayxrKSArIFNjYWxhcigxLjApKTsKKyAgICAgIHEuY29lZmZzKCkuY29lZmZSZWYoaSkgPSBTY2FsYXIoMC41KSAqIHQ7CisgICAgICB0ID0gU2NhbGFyKDAuNSkvdDsKKyAgICAgIHEudygpID0gKG1hdC5jb2VmZihrLGopLW1hdC5jb2VmZihqLGspKSp0OworICAgICAgcS5jb2VmZnMoKS5jb2VmZlJlZihqKSA9IChtYXQuY29lZmYoaixpKSttYXQuY29lZmYoaSxqKSkqdDsKKyAgICAgIHEuY29lZmZzKCkuY29lZmZSZWYoaykgPSAobWF0LmNvZWZmKGssaSkrbWF0LmNvZWZmKGksaykpKnQ7CisgICAgfQorICB9Cit9OworCisvLyBzZXQgZnJvbSBhIHZlY3RvciBvZiBjb2VmZmljaWVudHMgYXNzdW1lZCB0byBiZSBhIHF1YXRlcm5pb24KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorc3RydWN0IGVpX3F1YXRlcm5pb25fYXNzaWduX2ltcGw8T3RoZXIsNCwxPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE90aGVyOjpTY2FsYXIgU2NhbGFyOworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKFF1YXRlcm5pb248U2NhbGFyPiYgcSwgY29uc3QgT3RoZXImIHZlYykKKyAgeworICAgIHEuY29lZmZzKCkgPSB2ZWM7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvUm90YXRpb24yRC5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvUm90YXRpb24yRC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDJiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9Sb3RhdGlvbjJELmgKQEAgLTAsMCArMSwxNDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIG5vIGluY2x1ZGUgZ3VhcmQsIHdlJ2xsIGluY2x1ZGUgdGhpcyB0d2ljZSBmcm9tIEFsbC5oIGZyb20gRWlnZW4yU3VwcG9ydCwgYW5kIGl0J3MgaW50ZXJuYWwgYW55d2F5CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBSb3RhdGlvbjJECisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHJvdGF0aW9uL29yaWVudGF0aW9uIGluIGEgMiBkaW1lbnNpb25hbCBzcGFjZS4KKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqCisgICogVGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIHNjYWxhciByZXByZXNlbnRpbmcgYSBjb3VudGVyIGNsb2NrIHdpc2Ugcm90YXRpb24KKyAgKiBhcyBhIHNpbmdsZSBhbmdsZSBpbiByYWRpYW4uIEl0IHByb3ZpZGVzIHNvbWUgYWRkaXRpb25hbCBmZWF0dXJlcyBzdWNoIGFzIHRoZSBhdXRvbWF0aWMKKyAgKiBjb252ZXJzaW9uIGZyb20vdG8gYSAyeDIgcm90YXRpb24gbWF0cml4LiBNb3Jlb3ZlciB0aGlzIGNsYXNzIGFpbXMgdG8gcHJvdmlkZSBhIHNpbWlsYXIKKyAgKiBpbnRlcmZhY2UgdG8gUXVhdGVybmlvbiBpbiBvcmRlciB0byBmYWNpbGl0YXRlIHRoZSB3cml0aW5nIG9mIGdlbmVyaWMgYWxnb3JpdGhtcworICAqIGRlYWxpbmcgd2l0aCByb3RhdGlvbnMuCisgICoKKyAgKiBcc2EgY2xhc3MgUXVhdGVybmlvbiwgY2xhc3MgVHJhbnNmb3JtCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyPiBzdHJ1Y3QgZWlfdHJhaXRzPFJvdGF0aW9uMkQ8X1NjYWxhcj4gPgoreworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4KK2NsYXNzIFJvdGF0aW9uMkQgOiBwdWJsaWMgUm90YXRpb25CYXNlPFJvdGF0aW9uMkQ8X1NjYWxhcj4sMj4KK3sKKyAgdHlwZWRlZiBSb3RhdGlvbkJhc2U8Um90YXRpb24yRDxfU2NhbGFyPiwyPiBCYXNlOworCitwdWJsaWM6CisKKyAgdXNpbmcgQmFzZTo6b3BlcmF0b3IqOworCisgIGVudW0geyBEaW0gPSAyIH07CisgIC8qKiB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cyAqLworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwxPiBWZWN0b3IyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwyPiBNYXRyaXgyOworCitwcm90ZWN0ZWQ6CisKKyAgU2NhbGFyIG1fYW5nbGU7CisKK3B1YmxpYzoKKworICAvKiogQ29uc3RydWN0IGEgMkQgY291bnRlciBjbG9jayB3aXNlIHJvdGF0aW9uIGZyb20gdGhlIGFuZ2xlIFxhIGEgaW4gcmFkaWFuLiAqLworICBpbmxpbmUgUm90YXRpb24yRChTY2FsYXIgYSkgOiBtX2FuZ2xlKGEpIHt9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSByb3RhdGlvbiBhbmdsZSAqLworICBpbmxpbmUgU2NhbGFyIGFuZ2xlKCkgY29uc3QgeyByZXR1cm4gbV9hbmdsZTsgfQorCisgIC8qKiBccmV0dXJucyBhIHJlYWQtd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSByb3RhdGlvbiBhbmdsZSAqLworICBpbmxpbmUgU2NhbGFyJiBhbmdsZSgpIHsgcmV0dXJuIG1fYW5nbGU7IH0KKworICAvKiogXHJldHVybnMgdGhlIGludmVyc2Ugcm90YXRpb24gKi8KKyAgaW5saW5lIFJvdGF0aW9uMkQgaW52ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIC1tX2FuZ2xlOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gcm90YXRpb25zICovCisgIGlubGluZSBSb3RhdGlvbjJEIG9wZXJhdG9yKihjb25zdCBSb3RhdGlvbjJEJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gbV9hbmdsZSArIG90aGVyLm1fYW5nbGU7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIHR3byByb3RhdGlvbnMgKi8KKyAgaW5saW5lIFJvdGF0aW9uMkQmIG9wZXJhdG9yKj0oY29uc3QgUm90YXRpb24yRCYgb3RoZXIpCisgIHsgcmV0dXJuIG1fYW5nbGUgKz0gb3RoZXIubV9hbmdsZTsgcmV0dXJuICp0aGlzOyB9CisKKyAgLyoqIEFwcGxpZXMgdGhlIHJvdGF0aW9uIHRvIGEgMkQgdmVjdG9yICovCisgIFZlY3RvcjIgb3BlcmF0b3IqIChjb25zdCBWZWN0b3IyJiB2ZWMpIGNvbnN0CisgIHsgcmV0dXJuIHRvUm90YXRpb25NYXRyaXgoKSAqIHZlYzsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIFJvdGF0aW9uMkQmIGZyb21Sb3RhdGlvbk1hdHJpeChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKTsKKyAgTWF0cml4MiB0b1JvdGF0aW9uTWF0cml4KHZvaWQpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyB0aGUgc3BoZXJpY2FsIGludGVycG9sYXRpb24gYmV0d2VlbiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIgdXNpbmcKKyAgICAqIHBhcmFtZXRlciBcYSB0LiBJdCBpcyBpbiBmYWN0IGVxdWl2YWxlbnQgdG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAqLworICBpbmxpbmUgUm90YXRpb24yRCBzbGVycChTY2FsYXIgdCwgY29uc3QgUm90YXRpb24yRCYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fYW5nbGUgKiAoMS10KSArIG90aGVyLmFuZ2xlKCkgKiB0OyB9CisKKyAgLyoqIFxyZXR1cm5zIFxjICp0aGlzIHdpdGggc2NhbGFyIHR5cGUgY2FzdGVkIHRvIFxhIE5ld1NjYWxhclR5cGUKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgaWYgXGEgTmV3U2NhbGFyVHlwZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzY2FsYXIgdHlwZSBvZiBcYyAqdGhpcworICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHNtYXJ0bHkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdTY2FsYXJUeXBlPgorICBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8Um90YXRpb24yRCxSb3RhdGlvbjJEPE5ld1NjYWxhclR5cGU+ID46OnR5cGUgY2FzdCgpIGNvbnN0CisgIHsgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPFJvdGF0aW9uMkQsUm90YXRpb24yRDxOZXdTY2FsYXJUeXBlPiA+Ojp0eXBlKCp0aGlzKTsgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIHR5cGUgY29udmVyc2lvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhclR5cGU+CisgIGlubGluZSBleHBsaWNpdCBSb3RhdGlvbjJEKGNvbnN0IFJvdGF0aW9uMkQ8T3RoZXJTY2FsYXJUeXBlPiYgb3RoZXIpCisgIHsKKyAgICBtX2FuZ2xlID0gU2NhbGFyKG90aGVyLmFuZ2xlKCkpOworICB9CisKKyAgLyoqIFxyZXR1cm5zIFxjIHRydWUgaWYgXGMgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSBvdGhlciwgd2l0aGluIHRoZSBwcmVjaXNpb24KKyAgICAqIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgICAqCisgICAgKiBcc2EgTWF0cml4QmFzZTo6aXNBcHByb3goKSAqLworICBib29sIGlzQXBwcm94KGNvbnN0IFJvdGF0aW9uMkQmIG90aGVyLCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBwcmVjID0gcHJlY2lzaW9uPFNjYWxhcj4oKSkgY29uc3QKKyAgeyByZXR1cm4gZWlfaXNBcHByb3gobV9hbmdsZSxvdGhlci5tX2FuZ2xlLCBwcmVjKTsgfQorfTsKKworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIHNpbmdsZSBwcmVjaXNpb24gMkQgcm90YXRpb24gdHlwZSAqLwordHlwZWRlZiBSb3RhdGlvbjJEPGZsb2F0PiBSb3RhdGlvbjJEZjsKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBkb3VibGUgcHJlY2lzaW9uIDJEIHJvdGF0aW9uIHR5cGUgKi8KK3R5cGVkZWYgUm90YXRpb24yRDxkb3VibGU+IFJvdGF0aW9uMkRkOworCisvKiogU2V0IFxjICp0aGlzIGZyb20gYSAyeDIgcm90YXRpb24gbWF0cml4IFxhIG1hdC4KKyAgKiBJbiBvdGhlciB3b3JkcywgdGhpcyBmdW5jdGlvbiBleHRyYWN0IHRoZSByb3RhdGlvbiBhbmdsZQorICAqIGZyb20gdGhlIHJvdGF0aW9uIG1hdHJpeC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitSb3RhdGlvbjJEPFNjYWxhcj4mIFJvdGF0aW9uMkQ8U2NhbGFyPjo6ZnJvbVJvdGF0aW9uTWF0cml4KGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZT09MiAmJiBEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZT09MixZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgIG1fYW5nbGUgPSBlaV9hdGFuMihtYXQuY29lZmYoMSwwKSwgbWF0LmNvZWZmKDAsMCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBDb25zdHJ1Y3RzIGFuZCBccmV0dXJucyBhbiBlcXVpdmFsZW50IDJ4MiByb3RhdGlvbiBtYXRyaXguCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0eXBlbmFtZSBSb3RhdGlvbjJEPFNjYWxhcj46Ok1hdHJpeDIKK1JvdGF0aW9uMkQ8U2NhbGFyPjo6dG9Sb3RhdGlvbk1hdHJpeCh2b2lkKSBjb25zdAoreworICBTY2FsYXIgc2luQSA9IGVpX3NpbihtX2FuZ2xlKTsKKyAgU2NhbGFyIGNvc0EgPSBlaV9jb3MobV9hbmdsZSk7CisgIHJldHVybiAoTWF0cml4MigpIDw8IGNvc0EsIC1zaW5BLCBzaW5BLCBjb3NBKS5maW5pc2hlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0dlb21ldHJ5L1JvdGF0aW9uQmFzZS5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvUm90YXRpb25CYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhZDczYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0dlb21ldHJ5L1JvdGF0aW9uQmFzZS5oCkBAIC0wLDAgKzEsMTIzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBubyBpbmNsdWRlIGd1YXJkLCB3ZSdsbCBpbmNsdWRlIHRoaXMgdHdpY2UgZnJvbSBBbGwuaCBmcm9tIEVpZ2VuMlN1cHBvcnQsIGFuZCBpdCdzIGludGVybmFsIGFueXdheQorCituYW1lc3BhY2UgRWlnZW4geyAKKworLy8gdGhpcyBmaWxlIGFpbXMgdG8gY29udGFpbnMgdGhlIHZhcmlvdXMgcmVwcmVzZW50YXRpb25zIG9mIHJvdGF0aW9uL29yaWVudGF0aW9uCisvLyBpbiAyRCBhbmQgM0Qgc3BhY2UgZXhjZXB0ZWQgTWF0cml4IGFuZCBRdWF0ZXJuaW9uLgorCisvKiogXGNsYXNzIFJvdGF0aW9uQmFzZQorICAqCisgICogXGJyaWVmIENvbW1vbiBiYXNlIGNsYXNzIGZvciBjb21wYWN0IHJvdGF0aW9uIHJlcHJlc2VudGF0aW9ucworICAqCisgICogXHBhcmFtIERlcml2ZWQgaXMgdGhlIGRlcml2ZWQgdHlwZSwgaS5lLiwgYSByb3RhdGlvbiB0eXBlCisgICogXHBhcmFtIF9EaW0gdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3BhY2UKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIGludCBfRGltPgorY2xhc3MgUm90YXRpb25CYXNlCit7CisgIHB1YmxpYzoKKyAgICBlbnVtIHsgRGltID0gX0RpbSB9OworICAgIC8qKiB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cyAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgZWlfdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICAgIAorICAgIC8qKiBjb3JyZXNwb25kaW5nIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdHlwZSAqLworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sRGltPiBSb3RhdGlvbk1hdHJpeFR5cGU7CisKKyAgICBpbmxpbmUgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKyAgICBpbmxpbmUgRGVyaXZlZCYgZGVyaXZlZCgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7IH0KKworICAgIC8qKiBccmV0dXJucyBhbiBlcXVpdmFsZW50IHJvdGF0aW9uIG1hdHJpeCAqLworICAgIGlubGluZSBSb3RhdGlvbk1hdHJpeFR5cGUgdG9Sb3RhdGlvbk1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS50b1JvdGF0aW9uTWF0cml4KCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgaW52ZXJzZSByb3RhdGlvbiAqLworICAgIGlubGluZSBEZXJpdmVkIGludmVyc2UoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkuaW52ZXJzZSgpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHJvdGF0aW9uIFxjICp0aGlzIHdpdGggYSB0cmFuc2xhdGlvbiBcYSB0ICovCisgICAgaW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltPiBvcGVyYXRvciooY29uc3QgVHJhbnNsYXRpb248U2NhbGFyLERpbT4mIHQpIGNvbnN0CisgICAgeyByZXR1cm4gdG9Sb3RhdGlvbk1hdHJpeCgpICogdDsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSByb3RhdGlvbiBcYyAqdGhpcyB3aXRoIGEgc2NhbGluZyBcYSBzICovCisgICAgaW5saW5lIFJvdGF0aW9uTWF0cml4VHlwZSBvcGVyYXRvciooY29uc3QgU2NhbGluZzxTY2FsYXIsRGltPiYgcykgY29uc3QKKyAgICB7IHJldHVybiB0b1JvdGF0aW9uTWF0cml4KCkgKiBzOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHJvdGF0aW9uIFxjICp0aGlzIHdpdGggYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uIFxhIHQgKi8KKyAgICBpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0+IG9wZXJhdG9yKihjb25zdCBUcmFuc2Zvcm08U2NhbGFyLERpbT4mIHQpIGNvbnN0CisgICAgeyByZXR1cm4gdG9Sb3RhdGlvbk1hdHJpeCgpICogdDsgfQorfTsKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUKKyAgKgorICAqIENvbnN0cnVjdHMgYSBEaW0geCBEaW0gcm90YXRpb24gbWF0cml4IGZyb20gdGhlIHJvdGF0aW9uIFxhIHIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX1N0b3JhZ2UsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorTWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX1N0b3JhZ2UsIF9NYXhSb3dzLCBfTWF4Q29scz4KKzo6TWF0cml4KGNvbnN0IFJvdGF0aW9uQmFzZTxPdGhlckRlcml2ZWQsQ29sc0F0Q29tcGlsZVRpbWU+JiByKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX01BVFJJWF9TUEVDSUZJQ19TSVpFKE1hdHJpeCxpbnQoT3RoZXJEZXJpdmVkOjpEaW0pLGludChPdGhlckRlcml2ZWQ6OkRpbSkpCisgICp0aGlzID0gci50b1JvdGF0aW9uTWF0cml4KCk7Cit9CisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlCisgICoKKyAgKiBTZXQgYSBEaW0geCBEaW0gcm90YXRpb24gbWF0cml4IGZyb20gdGhlIHJvdGF0aW9uIFxhIHIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX1N0b3JhZ2UsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorTWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX1N0b3JhZ2UsIF9NYXhSb3dzLCBfTWF4Q29scz4mCitNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfU3RvcmFnZSwgX01heFJvd3MsIF9NYXhDb2xzPgorOjpvcGVyYXRvcj0oY29uc3QgUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxDb2xzQXRDb21waWxlVGltZT4mIHIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTUFUUklYX1NQRUNJRklDX1NJWkUoTWF0cml4LGludChPdGhlckRlcml2ZWQ6OkRpbSksaW50KE90aGVyRGVyaXZlZDo6RGltKSkKKyAgcmV0dXJuICp0aGlzID0gci50b1JvdGF0aW9uTWF0cml4KCk7Cit9CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXR1cm4gYW4gYXJiaXRyYXJ5IHJvdGF0aW9uIG9iamVjdCB0byBhIHJvdGF0aW9uIG1hdHJpeC4KKyAgKgorICAqIFxwYXJhbSBTY2FsYXIgdGhlIG51bWVyaWMgdHlwZSBvZiB0aGUgbWF0cml4IGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBEaW0gdGhlIGRpbWVuc2lvbiBvZiB0aGUgY3VycmVudCBzcGFjZQorICAqCisgICogSXQgcmV0dXJucyBhIERpbSB4IERpbSBmaXhlZCBzaXplIG1hdHJpeC4KKyAgKgorICAqIERlZmF1bHQgc3BlY2lhbGl6YXRpb25zIGFyZSBwcm92aWRlZCBmb3I6CisgICogICAtIGFueSBzY2FsYXIgdHlwZSAoMkQpLAorICAqICAgLSBhbnkgbWF0cml4IGV4cHJlc3Npb24sCisgICogICAtIGFueSB0eXBlIGJhc2VkIG9uIFJvdGF0aW9uQmFzZSAoZS5nLiwgUXVhdGVybmlvbiwgQW5nbGVBeGlzLCBSb3RhdGlvbjJEKQorICAqCisgICogQ3VycmVudGx5IGVpX3RvUm90YXRpb25NYXRyaXggaXMgb25seSB1c2VkIGJ5IFRyYW5zZm9ybS4KKyAgKgorICAqIFxzYSBjbGFzcyBUcmFuc2Zvcm0sIGNsYXNzIFJvdGF0aW9uMkQsIGNsYXNzIFF1YXRlcm5pb24sIGNsYXNzIEFuZ2xlQXhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgorc3RhdGljIGlubGluZSBNYXRyaXg8U2NhbGFyLDIsMj4gZWlfdG9Sb3RhdGlvbk1hdHJpeChjb25zdCBTY2FsYXImIHMpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRGltPT0yLFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgcmV0dXJuIFJvdGF0aW9uMkQ8U2NhbGFyPihzKS50b1JvdGF0aW9uTWF0cml4KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorc3RhdGljIGlubGluZSBNYXRyaXg8U2NhbGFyLERpbSxEaW0+IGVpX3RvUm90YXRpb25NYXRyaXgoY29uc3QgUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxEaW0+JiByKQoreworICByZXR1cm4gci50b1JvdGF0aW9uTWF0cml4KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorc3RhdGljIGlubGluZSBjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIGVpX3RvUm90YXRpb25NYXRyaXgoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBtYXQpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoT3RoZXJEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZT09RGltICYmIE90aGVyRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWU9PURpbSwKKyAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgIHJldHVybiBtYXQ7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvU2NhbGluZy5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvU2NhbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2MxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9TY2FsaW5nLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIG5vIGluY2x1ZGUgZ3VhcmQsIHdlJ2xsIGluY2x1ZGUgdGhpcyB0d2ljZSBmcm9tIEFsbC5oIGZyb20gRWlnZW4yU3VwcG9ydCwgYW5kIGl0J3MgaW50ZXJuYWwgYW55d2F5CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBTY2FsaW5nCisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHBvc3NpYmx5IG5vbiB1bmlmb3JtIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24KKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cy4KKyAgKiBccGFyYW0gX0RpbSB0aGUgIGRpbWVuc2lvbiBvZiB0aGUgc3BhY2UsIGNhbiBiZSBhIGNvbXBpbGUgdGltZSB2YWx1ZSBvciBEeW5hbWljCisgICoKKyAgKiBcbm90ZSBUaGlzIGNsYXNzIGlzIG5vdCBhaW1lZCB0byBiZSB1c2VkIHRvIHN0b3JlIGEgc2NhbGluZyB0cmFuc2Zvcm1hdGlvbiwKKyAgKiBidXQgcmF0aGVyIHRvIG1ha2UgZWFzaWVyIHRoZSBjb25zdHJ1Y3Rpb25zIGFuZCB1cGRhdGVzIG9mIFRyYW5zZm9ybSBvYmplY3RzLgorICAqCisgICogXHNhIGNsYXNzIFRyYW5zbGF0aW9uLCBjbGFzcyBUcmFuc2Zvcm0KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltPgorY2xhc3MgU2NhbGluZworeworcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0RpbSkKKyAgLyoqIGRpbWVuc2lvbiBvZiB0aGUgc3BhY2UgKi8KKyAgZW51bSB7IERpbSA9IF9EaW0gfTsKKyAgLyoqIHRoZSBzY2FsYXIgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzICovCisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIC8qKiBjb3JyZXNwb25kaW5nIHZlY3RvciB0eXBlICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sMT4gVmVjdG9yVHlwZTsKKyAgLyoqIGNvcnJlc3BvbmRpbmcgbGluZWFyIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0eXBlICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sRGltPiBMaW5lYXJNYXRyaXhUeXBlOworICAvKiogY29ycmVzcG9uZGluZyB0cmFuc2xhdGlvbiB0eXBlICovCisgIHR5cGVkZWYgVHJhbnNsYXRpb248U2NhbGFyLERpbT4gVHJhbnNsYXRpb25UeXBlOworICAvKiogY29ycmVzcG9uZGluZyBhZmZpbmUgdHJhbnNmb3JtYXRpb24gdHlwZSAqLworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltPiBUcmFuc2Zvcm1UeXBlOworCitwcm90ZWN0ZWQ6CisKKyAgVmVjdG9yVHlwZSBtX2NvZWZmczsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uICovCisgIFNjYWxpbmcoKSB7fQorICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSBhIHVuaWZvcm0gc2NhbGluZyB0cmFuc2Zvcm1hdGlvbiAqLworICBleHBsaWNpdCBpbmxpbmUgU2NhbGluZyhjb25zdCBTY2FsYXImIHMpIHsgbV9jb2VmZnMuc2V0Q29uc3RhbnQocyk7IH0KKyAgLyoqIDJEIG9ubHkgKi8KKyAgaW5saW5lIFNjYWxpbmcoY29uc3QgU2NhbGFyJiBzeCwgY29uc3QgU2NhbGFyJiBzeSkKKyAgeworICAgIGVpX2Fzc2VydChEaW09PTIpOworICAgIG1fY29lZmZzLngoKSA9IHN4OworICAgIG1fY29lZmZzLnkoKSA9IHN5OworICB9CisgIC8qKiAzRCBvbmx5ICovCisgIGlubGluZSBTY2FsaW5nKGNvbnN0IFNjYWxhciYgc3gsIGNvbnN0IFNjYWxhciYgc3ksIGNvbnN0IFNjYWxhciYgc3opCisgIHsKKyAgICBlaV9hc3NlcnQoRGltPT0zKTsKKyAgICBtX2NvZWZmcy54KCkgPSBzeDsKKyAgICBtX2NvZWZmcy55KCkgPSBzeTsKKyAgICBtX2NvZWZmcy56KCkgPSBzejsKKyAgfQorICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSB0aGUgc2NhbGluZyB0cmFuc2Zvcm1hdGlvbiBmcm9tIGEgdmVjdG9yIG9mIHNjYWxpbmcgY29lZmZpY2llbnRzICovCisgIGV4cGxpY2l0IGlubGluZSBTY2FsaW5nKGNvbnN0IFZlY3RvclR5cGUmIGNvZWZmcykgOiBtX2NvZWZmcyhjb2VmZnMpIHt9CisKKyAgY29uc3QgVmVjdG9yVHlwZSYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7IH0KKyAgVmVjdG9yVHlwZSYgY29lZmZzKCkgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIHR3byBzY2FsaW5nICovCisgIGlubGluZSBTY2FsaW5nIG9wZXJhdG9yKiAoY29uc3QgU2NhbGluZyYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIFNjYWxpbmcoY29lZmZzKCkuY3dpc2UoKSAqIG90aGVyLmNvZWZmcygpKTsgfQorCisgIC8qKiBDb25jYXRlbmF0ZXMgYSBzY2FsaW5nIGFuZCBhIHRyYW5zbGF0aW9uICovCisgIGlubGluZSBUcmFuc2Zvcm1UeXBlIG9wZXJhdG9yKiAoY29uc3QgVHJhbnNsYXRpb25UeXBlJiB0KSBjb25zdDsKKworICAvKiogQ29uY2F0ZW5hdGVzIGEgc2NhbGluZyBhbmQgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uICovCisgIGlubGluZSBUcmFuc2Zvcm1UeXBlIG9wZXJhdG9yKiAoY29uc3QgVHJhbnNmb3JtVHlwZSYgdCkgY29uc3Q7CisKKyAgLyoqIENvbmNhdGVuYXRlcyBhIHNjYWxpbmcgYW5kIGEgbGluZWFyIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAqLworICAvLyBUT0RPIHJldHVybnMgYW4gZXhwcmVzc2lvbgorICBpbmxpbmUgTGluZWFyTWF0cml4VHlwZSBvcGVyYXRvciogKGNvbnN0IExpbmVhck1hdHJpeFR5cGUmIG90aGVyKSBjb25zdAorICB7IHJldHVybiBjb2VmZnMoKS5hc0RpYWdvbmFsKCkgKiBvdGhlcjsgfQorCisgIC8qKiBDb25jYXRlbmF0ZXMgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gbWF0cml4IGFuZCBhIHNjYWxpbmcgKi8KKyAgLy8gVE9ETyByZXR1cm5zIGFuIGV4cHJlc3Npb24KKyAgZnJpZW5kIGlubGluZSBMaW5lYXJNYXRyaXhUeXBlIG9wZXJhdG9yKiAoY29uc3QgTGluZWFyTWF0cml4VHlwZSYgb3RoZXIsIGNvbnN0IFNjYWxpbmcmIHMpCisgIHsgcmV0dXJuIG90aGVyICogcy5jb2VmZnMoKS5hc0RpYWdvbmFsKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgTGluZWFyTWF0cml4VHlwZSBvcGVyYXRvciooY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikgY29uc3QKKyAgeyByZXR1cm4gKnRoaXMgKiByLnRvUm90YXRpb25NYXRyaXgoKTsgfQorCisgIC8qKiBBcHBsaWVzIHNjYWxpbmcgdG8gdmVjdG9yICovCisgIGlubGluZSBWZWN0b3JUeXBlIG9wZXJhdG9yKiAoY29uc3QgVmVjdG9yVHlwZSYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIGNvZWZmcygpLmFzRGlhZ29uYWwoKSAqIG90aGVyOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIHNjYWxpbmcgKi8KKyAgaW5saW5lIFNjYWxpbmcgaW52ZXJzZSgpIGNvbnN0CisgIHsgcmV0dXJuIFNjYWxpbmcoY29lZmZzKCkuY3dpc2UoKS5pbnZlcnNlKCkpOyB9CisKKyAgaW5saW5lIFNjYWxpbmcmIG9wZXJhdG9yPShjb25zdCBTY2FsaW5nJiBvdGhlcikKKyAgeworICAgIG1fY29lZmZzID0gb3RoZXIubV9jb2VmZnM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIFxyZXR1cm5zIFxjICp0aGlzIHdpdGggc2NhbGFyIHR5cGUgY2FzdGVkIHRvIFxhIE5ld1NjYWxhclR5cGUKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgaWYgXGEgTmV3U2NhbGFyVHlwZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzY2FsYXIgdHlwZSBvZiBcYyAqdGhpcworICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHNtYXJ0bHkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdTY2FsYXJUeXBlPgorICBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8U2NhbGluZyxTY2FsaW5nPE5ld1NjYWxhclR5cGUsRGltPiA+Ojp0eXBlIGNhc3QoKSBjb25zdAorICB7IHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxTY2FsaW5nLFNjYWxpbmc8TmV3U2NhbGFyVHlwZSxEaW0+ID46OnR5cGUoKnRoaXMpOyB9CisKKyAgLyoqIENvcHkgY29uc3RydWN0b3Igd2l0aCBzY2FsYXIgdHlwZSBjb252ZXJzaW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZT4KKyAgaW5saW5lIGV4cGxpY2l0IFNjYWxpbmcoY29uc3QgU2NhbGluZzxPdGhlclNjYWxhclR5cGUsRGltPiYgb3RoZXIpCisgIHsgbV9jb2VmZnMgPSBvdGhlci5jb2VmZnMoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgYm9vbCBpc0FwcHJveChjb25zdCBTY2FsaW5nJiBvdGhlciwgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcHJlYyA9IHByZWNpc2lvbjxTY2FsYXI+KCkpIGNvbnN0CisgIHsgcmV0dXJuIG1fY29lZmZzLmlzQXBwcm94KG90aGVyLm1fY29lZmZzLCBwcmVjKTsgfQorCit9OworCisvKiogXGFkZHRvZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCisvL0B7Cit0eXBlZGVmIFNjYWxpbmc8ZmxvYXQsIDI+IFNjYWxpbmcyZjsKK3R5cGVkZWYgU2NhbGluZzxkb3VibGUsMj4gU2NhbGluZzJkOwordHlwZWRlZiBTY2FsaW5nPGZsb2F0LCAzPiBTY2FsaW5nM2Y7Cit0eXBlZGVmIFNjYWxpbmc8ZG91YmxlLDM+IFNjYWxpbmczZDsKKy8vQH0KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgoraW5saW5lIHR5cGVuYW1lIFNjYWxpbmc8U2NhbGFyLERpbT46OlRyYW5zZm9ybVR5cGUKK1NjYWxpbmc8U2NhbGFyLERpbT46Om9wZXJhdG9yKiAoY29uc3QgVHJhbnNsYXRpb25UeXBlJiB0KSBjb25zdAoreworICBUcmFuc2Zvcm1UeXBlIHJlczsKKyAgcmVzLm1hdHJpeCgpLnNldFplcm8oKTsKKyAgcmVzLmxpbmVhcigpLmRpYWdvbmFsKCkgPSBjb2VmZnMoKTsKKyAgcmVzLnRyYW5zbGF0aW9uKCkgPSBtX2NvZWZmcy5jd2lzZSgpICogdC52ZWN0b3IoKTsKKyAgcmVzKERpbSxEaW0pID0gU2NhbGFyKDEpOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitpbmxpbmUgdHlwZW5hbWUgU2NhbGluZzxTY2FsYXIsRGltPjo6VHJhbnNmb3JtVHlwZQorU2NhbGluZzxTY2FsYXIsRGltPjo6b3BlcmF0b3IqIChjb25zdCBUcmFuc2Zvcm1UeXBlJiB0KSBjb25zdAoreworICBUcmFuc2Zvcm1UeXBlIHJlcyA9IHQ7CisgIHJlcy5wcmVzY2FsZShtX2NvZWZmcyk7CisgIHJldHVybiByZXM7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvVHJhbnNmb3JtLmggYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9UcmFuc2Zvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2ViODAyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvVHJhbnNmb3JtLmgKQEAgLTAsMCArMSw3ODYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIG5vIGluY2x1ZGUgZ3VhcmQsIHdlJ2xsIGluY2x1ZGUgdGhpcyB0d2ljZSBmcm9tIEFsbC5oIGZyb20gRWlnZW4yU3VwcG9ydCwgYW5kIGl0J3MgaW50ZXJuYWwgYW55d2F5CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvLyBOb3RlIHRoYXQgd2UgaGF2ZSB0byBwYXNzIERpbSBhbmQgSERpbSBiZWNhdXNlIGl0IGlzIG5vdCBhbGxvd2VkIHRvIHVzZSBhIHRlbXBsYXRlCisvLyBwYXJhbWV0ZXIgdG8gZGVmaW5lIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uIFRvIGJlIG1vcmUgcHJlY2lzZSwgaW4gdGhlIGZvbGxvd2luZworLy8gc3BlY2lhbGl6YXRpb25zLCBpdCBpcyBub3QgYWxsb3dlZCB0byB1c2UgRGltKzEgaW5zdGVhZCBvZiBIRGltLgordGVtcGxhdGU8IHR5cGVuYW1lIE90aGVyLAorICAgICAgICAgIGludCBEaW0sCisgICAgICAgICAgaW50IEhEaW0sCisgICAgICAgICAgaW50IE90aGVyUm93cz1PdGhlcjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgaW50IE90aGVyQ29scz1PdGhlcjo6Q29sc0F0Q29tcGlsZVRpbWU+CitzdHJ1Y3QgZWlfdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDsKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgVHJhbnNmb3JtCisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhbiBob21vZ2VuZW91cyB0cmFuc2Zvcm1hdGlvbiBpbiBhIE4gZGltZW5zaW9uYWwgc3BhY2UKKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBfRGltIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNwYWNlCisgICoKKyAgKiBUaGUgaG9tb2dyYXBoeSBpcyBpbnRlcm5hbGx5IHJlcHJlc2VudGVkIGFuZCBzdG9yZWQgYXMgYSAoRGltKzEpXjIgbWF0cml4IHdoaWNoCisgICogaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIG1hdHJpeCgpIG1ldGhvZC4KKyAgKgorICAqIENvbnZlcnNpb24gbWV0aG9kcyBmcm9tL3RvIFF0J3MgUU1hdHJpeCBhbmQgUVRyYW5zZm9ybSBhcmUgYXZhaWxhYmxlIGlmIHRoZQorICAqIHByZXByb2Nlc3NvciB0b2tlbiBFSUdFTl9RVF9TVVBQT1JUIGlzIGRlZmluZWQuCisgICoKKyAgKiBcc2EgY2xhc3MgTWF0cml4LCBjbGFzcyBRdWF0ZXJuaW9uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbT4KK2NsYXNzIFRyYW5zZm9ybQoreworcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0RpbT09RHluYW1pYyA/IER5bmFtaWMgOiAoX0RpbSsxKSooX0RpbSsxKSkKKyAgZW51bSB7CisgICAgRGltID0gX0RpbSwgICAgIC8vLzwgc3BhY2UgZGltZW5zaW9uIGluIHdoaWNoIHRoZSB0cmFuc2Zvcm1hdGlvbiBob2xkcworICAgIEhEaW0gPSBfRGltKzEgICAvLy88IHNpemUgb2YgYSByZXNwZWN0aXZlIGhvbW9nZW5lb3VzIHZlY3RvcgorICB9OworICAvKiogdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgLyoqIHR5cGUgb2YgdGhlIG1hdHJpeCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEhEaW0sSERpbT4gTWF0cml4VHlwZTsKKyAgLyoqIHR5cGUgb2YgdGhlIG1hdHJpeCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sRGltPiBMaW5lYXJNYXRyaXhUeXBlOworICAvKiogdHlwZSBvZiByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIHR5cGVkZWYgQmxvY2s8TWF0cml4VHlwZSxEaW0sRGltPiBMaW5lYXJQYXJ0OworICAvKiogdHlwZSBvZiByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIHR5cGVkZWYgY29uc3QgQmxvY2s8Y29uc3QgTWF0cml4VHlwZSxEaW0sRGltPiBDb25zdExpbmVhclBhcnQ7CisgIC8qKiB0eXBlIG9mIGEgdmVjdG9yICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sMT4gVmVjdG9yVHlwZTsKKyAgLyoqIHR5cGUgb2YgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgdHJhbnNsYXRpb24gcGFydCBvZiB0aGUgcm90YXRpb24gKi8KKyAgdHlwZWRlZiBCbG9jazxNYXRyaXhUeXBlLERpbSwxPiBUcmFuc2xhdGlvblBhcnQ7CisgIC8qKiB0eXBlIG9mIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIHRyYW5zbGF0aW9uIHBhcnQgb2YgdGhlIHJvdGF0aW9uICovCisgIHR5cGVkZWYgY29uc3QgQmxvY2s8Y29uc3QgTWF0cml4VHlwZSxEaW0sMT4gQ29uc3RUcmFuc2xhdGlvblBhcnQ7CisgIC8qKiBjb3JyZXNwb25kaW5nIHRyYW5zbGF0aW9uIHR5cGUgKi8KKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsRGltPiBUcmFuc2xhdGlvblR5cGU7CisgIC8qKiBjb3JyZXNwb25kaW5nIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gdHlwZSAqLworICB0eXBlZGVmIFNjYWxpbmc8U2NhbGFyLERpbT4gU2NhbGluZ1R5cGU7CisKK3Byb3RlY3RlZDoKKworICBNYXRyaXhUeXBlIG1fbWF0cml4OworCitwdWJsaWM6CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aG91dCBpbml0aWFsaXphdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzLiAqLworICBpbmxpbmUgVHJhbnNmb3JtKCkgeyB9CisKKyAgaW5saW5lIFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm0mIG90aGVyKQorICB7CisgICAgbV9tYXRyaXggPSBvdGhlci5tX21hdHJpeDsKKyAgfQorCisgIGlubGluZSBleHBsaWNpdCBUcmFuc2Zvcm0oY29uc3QgVHJhbnNsYXRpb25UeXBlJiB0KSB7ICp0aGlzID0gdDsgfQorICBpbmxpbmUgZXhwbGljaXQgVHJhbnNmb3JtKGNvbnN0IFNjYWxpbmdUeXBlJiBzKSB7ICp0aGlzID0gczsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgZXhwbGljaXQgVHJhbnNmb3JtKGNvbnN0IFJvdGF0aW9uQmFzZTxEZXJpdmVkLCBEaW0+JiByKSB7ICp0aGlzID0gcjsgfQorCisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yPShjb25zdCBUcmFuc2Zvcm0mIG90aGVyKQorICB7IG1fbWF0cml4ID0gb3RoZXIubV9tYXRyaXg7IHJldHVybiAqdGhpczsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgYm9vbCBCaWdNYXRyaXg+IC8vIE1TVkMgMjAwNSB3aWxsIGNvbW1pdCBzdWljaWRlIGlmIEJpZ01hdHJpeCBoYXMgYSBkZWZhdWx0IHZhbHVlCisgIHN0cnVjdCBjb25zdHJ1Y3RfZnJvbV9tYXRyaXgKKyAgeworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oVHJhbnNmb3JtICp0cmFuc2Zvcm0sIGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgdHJhbnNmb3JtLT5tYXRyaXgoKSA9IG90aGVyOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IHN0cnVjdCBjb25zdHJ1Y3RfZnJvbV9tYXRyaXg8T3RoZXJEZXJpdmVkLCB0cnVlPgorICB7CisgICAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihUcmFuc2Zvcm0gKnRyYW5zZm9ybSwgY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICB0cmFuc2Zvcm0tPmxpbmVhcigpID0gb3RoZXI7CisgICAgICB0cmFuc2Zvcm0tPnRyYW5zbGF0aW9uKCkuc2V0WmVybygpOworICAgICAgdHJhbnNmb3JtLT5tYXRyaXgoKShEaW0sRGltKSA9IFNjYWxhcigxKTsKKyAgICAgIHRyYW5zZm9ybS0+bWF0cml4KCkudGVtcGxhdGUgYmxvY2s8MSxEaW0+KERpbSwwKS5zZXRaZXJvKCk7CisgICAgfQorICB9OworCisgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplcyBhIHRyYW5zZm9ybWF0aW9uIGZyb20gYSBEaW1eMiBvciBhIChEaW0rMSleMiBtYXRyaXguICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgaW5saW5lIGV4cGxpY2l0IFRyYW5zZm9ybShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICB7CisgICAgY29uc3RydWN0X2Zyb21fbWF0cml4PE90aGVyRGVyaXZlZCwgaW50KE90aGVyRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUpID09IERpbT46OnJ1bih0aGlzLCBvdGhlcik7CisgIH0KKworICAvKiogU2V0IFxjICp0aGlzIGZyb20gYSAoRGltKzEpXjIgbWF0cml4LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICB7IG1fbWF0cml4ID0gb3RoZXI7IHJldHVybiAqdGhpczsgfQorCisgICNpZmRlZiBFSUdFTl9RVF9TVVBQT1JUCisgIGlubGluZSBUcmFuc2Zvcm0oY29uc3QgUU1hdHJpeCYgb3RoZXIpOworICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgUU1hdHJpeCYgb3RoZXIpOworICBpbmxpbmUgUU1hdHJpeCB0b1FNYXRyaXgodm9pZCkgY29uc3Q7CisgIGlubGluZSBUcmFuc2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYgb3RoZXIpOworICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgUVRyYW5zZm9ybSYgb3RoZXIpOworICBpbmxpbmUgUVRyYW5zZm9ybSB0b1FUcmFuc2Zvcm0odm9pZCkgY29uc3Q7CisgICNlbmRpZgorCisgIC8qKiBzaG9ydGN1dCBmb3IgbV9tYXRyaXgocm93LGNvbCk7CisgICAgKiBcc2EgTWF0cml4QmFzZTo6b3BlcmFyb3IoaW50LGludCkgY29uc3QgKi8KKyAgaW5saW5lIFNjYWxhciBvcGVyYXRvcigpIChpbnQgcm93LCBpbnQgY29sKSBjb25zdCB7IHJldHVybiBtX21hdHJpeChyb3csY29sKTsgfQorICAvKiogc2hvcnRjdXQgZm9yIG1fbWF0cml4KHJvdyxjb2wpOworICAgICogXHNhIE1hdHJpeEJhc2U6Om9wZXJhcm9yKGludCxpbnQpICovCisgIGlubGluZSBTY2FsYXImIG9wZXJhdG9yKCkgKGludCByb3csIGludCBjb2wpIHsgcmV0dXJuIG1fbWF0cml4KHJvdyxjb2wpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVhZC1vbmx5IGV4cHJlc3Npb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAqLworICBpbmxpbmUgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXg7IH0KKyAgLyoqIFxyZXR1cm5zIGEgd3JpdGFibGUgZXhwcmVzc2lvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4ICovCisgIGlubGluZSBNYXRyaXhUeXBlJiBtYXRyaXgoKSB7IHJldHVybiBtX21hdHJpeDsgfQorCisgIC8qKiBccmV0dXJucyBhIHJlYWQtb25seSBleHByZXNzaW9uIG9mIHRoZSBsaW5lYXIgKGxpbmVhcikgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgaW5saW5lIENvbnN0TGluZWFyUGFydCBsaW5lYXIoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sRGltPigwLDApOyB9CisgIC8qKiBccmV0dXJucyBhIHdyaXRhYmxlIGV4cHJlc3Npb24gb2YgdGhlIGxpbmVhciAobGluZWFyKSBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiAqLworICBpbmxpbmUgTGluZWFyUGFydCBsaW5lYXIoKSB7IHJldHVybiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sRGltPigwLDApOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVhZC1vbmx5IGV4cHJlc3Npb24gb2YgdGhlIHRyYW5zbGF0aW9uIHZlY3RvciBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgaW5saW5lIENvbnN0VHJhbnNsYXRpb25QYXJ0IHRyYW5zbGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgudGVtcGxhdGUgYmxvY2s8RGltLDE+KDAsRGltKTsgfQorICAvKiogXHJldHVybnMgYSB3cml0YWJsZSBleHByZXNzaW9uIG9mIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3Igb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIGlubGluZSBUcmFuc2xhdGlvblBhcnQgdHJhbnNsYXRpb24oKSB7IHJldHVybiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sMT4oMCxEaW0pOyB9CisKKyAgLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIHByb2R1Y3QgYmV0d2VlbiB0aGUgdHJhbnNmb3JtIFxjICp0aGlzIGFuZCBhIG1hdHJpeCBleHByZXNzaW9uIFxhIG90aGVyCisgICoKKyAgKiBUaGUgcmlnaHQgaGFuZCBzaWRlIFxhIG90aGVyIG1pZ2h0IGJlIGVpdGhlcjoKKyAgKiBcbGkgYSB2ZWN0b3Igb2Ygc2l6ZSBEaW0sCisgICogXGxpIGFuIGhvbW9nZW5lb3VzIHZlY3RvciBvZiBzaXplIERpbSsxLAorICAqIFxsaSBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBvZiBzaXplIERpbSsxIHggRGltKzEuCisgICovCisgIC8vIG5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBoZXJlIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY2Fubm90IGZpbmQgdGhlIHJlc3BlY3RpdmUgZGVjbGFyYXRpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgZWlfdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDxPdGhlckRlcml2ZWQsX0RpbSxfRGltKzE+OjpSZXN1bHRUeXBlCisgIG9wZXJhdG9yICogKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIGVpX3RyYW5zZm9ybV9wcm9kdWN0X2ltcGw8T3RoZXJEZXJpdmVkLERpbSxIRGltPjo6cnVuKCp0aGlzLG90aGVyLmRlcml2ZWQoKSk7IH0KKworICAvKiogXHJldHVybnMgdGhlIHByb2R1Y3QgZXhwcmVzc2lvbiBvZiBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBcYSBhIHRpbWVzIGEgdHJhbnNmb3JtIFxhIGIKKyAgICAqIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggXGEgYSBtdXN0IGhhdmUgYSBEaW0rMSB4IERpbSsxIHNpemVzLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIGZyaWVuZCBpbmxpbmUgY29uc3QgdHlwZW5hbWUgUHJvZHVjdFJldHVyblR5cGU8T3RoZXJEZXJpdmVkLE1hdHJpeFR5cGU+OjpUeXBlCisgIG9wZXJhdG9yICogKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmYSwgY29uc3QgVHJhbnNmb3JtICZiKQorICB7IHJldHVybiBhLmRlcml2ZWQoKSAqIGIubWF0cml4KCk7IH0KKworICAvKiogQ29udGF0ZW5hdGVzIHR3byB0cmFuc2Zvcm1hdGlvbnMgKi8KKyAgaW5saW5lIGNvbnN0IFRyYW5zZm9ybQorICBvcGVyYXRvciAqIChjb25zdCBUcmFuc2Zvcm0mIG90aGVyKSBjb25zdAorICB7IHJldHVybiBUcmFuc2Zvcm0obV9tYXRyaXggKiBvdGhlci5tYXRyaXgoKSk7IH0KKworICAvKiogXHNhIE1hdHJpeEJhc2U6OnNldElkZW50aXR5KCkgKi8KKyAgdm9pZCBzZXRJZGVudGl0eSgpIHsgbV9tYXRyaXguc2V0SWRlbnRpdHkoKTsgfQorICBzdGF0aWMgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6SWRlbnRpdHlSZXR1cm5UeXBlIElkZW50aXR5KCkKKyAgeworICAgIHJldHVybiBNYXRyaXhUeXBlOjpJZGVudGl0eSgpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBpbmxpbmUgVHJhbnNmb3JtJiBzY2FsZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIGlubGluZSBUcmFuc2Zvcm0mIHByZXNjYWxlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpOworCisgIGlubGluZSBUcmFuc2Zvcm0mIHNjYWxlKFNjYWxhciBzKTsKKyAgaW5saW5lIFRyYW5zZm9ybSYgcHJlc2NhbGUoU2NhbGFyIHMpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgaW5saW5lIFRyYW5zZm9ybSYgdHJhbnNsYXRlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgaW5saW5lIFRyYW5zZm9ybSYgcHJldHJhbnNsYXRlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uVHlwZT4KKyAgaW5saW5lIFRyYW5zZm9ybSYgcm90YXRlKGNvbnN0IFJvdGF0aW9uVHlwZSYgcm90YXRpb24pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uVHlwZT4KKyAgaW5saW5lIFRyYW5zZm9ybSYgcHJlcm90YXRlKGNvbnN0IFJvdGF0aW9uVHlwZSYgcm90YXRpb24pOworCisgIFRyYW5zZm9ybSYgc2hlYXIoU2NhbGFyIHN4LCBTY2FsYXIgc3kpOworICBUcmFuc2Zvcm0mIHByZXNoZWFyKFNjYWxhciBzeCwgU2NhbGFyIHN5KTsKKworICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNsYXRpb25UeXBlJiB0KTsKKyAgaW5saW5lIFRyYW5zZm9ybSYgb3BlcmF0b3IqPShjb25zdCBUcmFuc2xhdGlvblR5cGUmIHQpIHsgcmV0dXJuIHRyYW5zbGF0ZSh0LnZlY3RvcigpKTsgfQorICBpbmxpbmUgVHJhbnNmb3JtIG9wZXJhdG9yKihjb25zdCBUcmFuc2xhdGlvblR5cGUmIHQpIGNvbnN0OworCisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yPShjb25zdCBTY2FsaW5nVHlwZSYgdCk7CisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yKj0oY29uc3QgU2NhbGluZ1R5cGUmIHMpIHsgcmV0dXJuIHNjYWxlKHMuY29lZmZzKCkpOyB9CisgIGlubGluZSBUcmFuc2Zvcm0gb3BlcmF0b3IqKGNvbnN0IFNjYWxpbmdUeXBlJiBzKSBjb25zdDsKKyAgZnJpZW5kIGlubGluZSBUcmFuc2Zvcm0gb3BlcmF0b3IqKGNvbnN0IExpbmVhck1hdHJpeFR5cGUmIG1hdCwgY29uc3QgVHJhbnNmb3JtJiB0KQorICB7CisgICAgVHJhbnNmb3JtIHJlcyA9IHQ7CisgICAgcmVzLm1hdHJpeCgpLnJvdyhEaW0pID0gdC5tYXRyaXgoKS5yb3coRGltKTsKKyAgICByZXMubWF0cml4KCkudGVtcGxhdGUgYmxvY2s8RGltLEhEaW0+KDAsMCkgPSAobWF0ICogdC5tYXRyaXgoKS50ZW1wbGF0ZSBibG9jazxEaW0sSERpbT4oMCwwKSkubGF6eSgpOworICAgIHJldHVybiByZXM7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yKj0oY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikgeyByZXR1cm4gcm90YXRlKHIudG9Sb3RhdGlvbk1hdHJpeCgpKTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgVHJhbnNmb3JtIG9wZXJhdG9yKihjb25zdCBSb3RhdGlvbkJhc2U8RGVyaXZlZCxEaW0+JiByKSBjb25zdDsKKworICBMaW5lYXJNYXRyaXhUeXBlIHJvdGF0aW9uKCkgY29uc3Q7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uTWF0cml4VHlwZSwgdHlwZW5hbWUgU2NhbGluZ01hdHJpeFR5cGU+CisgIHZvaWQgY29tcHV0ZVJvdGF0aW9uU2NhbGluZyhSb3RhdGlvbk1hdHJpeFR5cGUgKnJvdGF0aW9uLCBTY2FsaW5nTWF0cml4VHlwZSAqc2NhbGluZykgY29uc3Q7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxpbmdNYXRyaXhUeXBlLCB0eXBlbmFtZSBSb3RhdGlvbk1hdHJpeFR5cGU+CisgIHZvaWQgY29tcHV0ZVNjYWxpbmdSb3RhdGlvbihTY2FsaW5nTWF0cml4VHlwZSAqc2NhbGluZywgUm90YXRpb25NYXRyaXhUeXBlICpyb3RhdGlvbikgY29uc3Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUG9zaXRpb25EZXJpdmVkLCB0eXBlbmFtZSBPcmllbnRhdGlvblR5cGUsIHR5cGVuYW1lIFNjYWxlRGVyaXZlZD4KKyAgVHJhbnNmb3JtJiBmcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKGNvbnN0IE1hdHJpeEJhc2U8UG9zaXRpb25EZXJpdmVkPiAmcG9zaXRpb24sCisgICAgY29uc3QgT3JpZW50YXRpb25UeXBlJiBvcmllbnRhdGlvbiwgY29uc3QgTWF0cml4QmFzZTxTY2FsZURlcml2ZWQ+ICZzY2FsZSk7CisKKyAgaW5saW5lIGNvbnN0IE1hdHJpeFR5cGUgaW52ZXJzZShUcmFuc2Zvcm1UcmFpdHMgdHJhaXRzID0gQWZmaW5lKSBjb25zdDsKKworICAvKiogXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBjb2x1bW4gbWFqb3IgaW50ZXJuYWwgbWF0cml4ICovCisgIGNvbnN0IFNjYWxhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmRhdGEoKTsgfQorICAvKiogXHJldHVybnMgYSBub24tY29uc3QgcG9pbnRlciB0byB0aGUgY29sdW1uIG1ham9yIGludGVybmFsIG1hdHJpeCAqLworICBTY2FsYXIqIGRhdGEoKSB7IHJldHVybiBtX21hdHJpeC5kYXRhKCk7IH0KKworICAvKiogXHJldHVybnMgXGMgKnRoaXMgd2l0aCBzY2FsYXIgdHlwZSBjYXN0ZWQgdG8gXGEgTmV3U2NhbGFyVHlwZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBpZiBcYSBOZXdTY2FsYXJUeXBlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHNjYWxhciB0eXBlIG9mIFxjICp0aGlzCisgICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc21hcnRseSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1NjYWxhclR5cGU+CisgIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxUcmFuc2Zvcm0sVHJhbnNmb3JtPE5ld1NjYWxhclR5cGUsRGltPiA+Ojp0eXBlIGNhc3QoKSBjb25zdAorICB7IHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxUcmFuc2Zvcm0sVHJhbnNmb3JtPE5ld1NjYWxhclR5cGUsRGltPiA+Ojp0eXBlKCp0aGlzKTsgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIHR5cGUgY29udmVyc2lvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhclR5cGU+CisgIGlubGluZSBleHBsaWNpdCBUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtPE90aGVyU2NhbGFyVHlwZSxEaW0+JiBvdGhlcikKKyAgeyBtX21hdHJpeCA9IG90aGVyLm1hdHJpeCgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOyB9CisKKyAgLyoqIFxyZXR1cm5zIFxjIHRydWUgaWYgXGMgKnRoaXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBcYSBvdGhlciwgd2l0aGluIHRoZSBwcmVjaXNpb24KKyAgICAqIGRldGVybWluZWQgYnkgXGEgcHJlYy4KKyAgICAqCisgICAgKiBcc2EgTWF0cml4QmFzZTo6aXNBcHByb3goKSAqLworICBib29sIGlzQXBwcm94KGNvbnN0IFRyYW5zZm9ybSYgb3RoZXIsIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHByZWMgPSBwcmVjaXNpb248U2NhbGFyPigpKSBjb25zdAorICB7IHJldHVybiBtX21hdHJpeC5pc0FwcHJveChvdGhlci5tX21hdHJpeCwgcHJlYyk7IH0KKworICAjaWZkZWYgRUlHRU5fVFJBTlNGT1JNX1BMVUdJTgorICAjaW5jbHVkZSBFSUdFTl9UUkFOU0ZPUk1fUExVR0lOCisgICNlbmRpZgorCitwcm90ZWN0ZWQ6CisKK307CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KK3R5cGVkZWYgVHJhbnNmb3JtPGZsb2F0LDI+IFRyYW5zZm9ybTJmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZmxvYXQsMz4gVHJhbnNmb3JtM2Y7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMj4gVHJhbnNmb3JtMmQ7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMz4gVHJhbnNmb3JtM2Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIE9wdGlvbmFsIFFUIHN1cHBvcnQgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEVJR0VOX1FUX1NVUFBPUlQKKy8qKiBJbml0aWFsaXNlcyBcYyAqdGhpcyBmcm9tIGEgUU1hdHJpeCBhc3N1bWluZyB0aGUgZGltZW5zaW9uIGlzIDIuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRoZSB0b2tlbiBFSUdFTl9RVF9TVVBQT1JUIGlzIGRlZmluZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitUcmFuc2Zvcm08U2NhbGFyLERpbT46OlRyYW5zZm9ybShjb25zdCBRTWF0cml4JiBvdGhlcikKK3sKKyAgKnRoaXMgPSBvdGhlcjsKK30KKworLyoqIFNldCBcYyAqdGhpcyBmcm9tIGEgUU1hdHJpeCBhc3N1bWluZyB0aGUgZGltZW5zaW9uIGlzIDIuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRoZSB0b2tlbiBFSUdFTl9RVF9TVVBQT1JUIGlzIGRlZmluZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitUcmFuc2Zvcm08U2NhbGFyLERpbT4mIFRyYW5zZm9ybTxTY2FsYXIsRGltPjo6b3BlcmF0b3I9KGNvbnN0IFFNYXRyaXgmIG90aGVyKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKERpbT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICBtX21hdHJpeCA8PCBvdGhlci5tMTEoKSwgb3RoZXIubTIxKCksIG90aGVyLmR4KCksCisgICAgICAgICAgICAgIG90aGVyLm0xMigpLCBvdGhlci5tMjIoKSwgb3RoZXIuZHkoKSwKKyAgICAgICAgICAgICAgMCwgMCwgMTsKKyAgIHJldHVybiAqdGhpczsKK30KKworLyoqIFxyZXR1cm5zIGEgUU1hdHJpeCBmcm9tIFxjICp0aGlzIGFzc3VtaW5nIHRoZSBkaW1lbnNpb24gaXMgMi4KKyAgKgorICAqIFx3YXJuaW5nIHRoaXMgY29udmVydGlvbiBtaWdodCBsb3NzIGRhdGEgaWYgXGMgKnRoaXMgaXMgbm90IGFmZmluZQorICAqCisgICogVGhpcyBmdW5jdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiB0aGUgdG9rZW4gRUlHRU5fUVRfU1VQUE9SVCBpcyBkZWZpbmVkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgorUU1hdHJpeCBUcmFuc2Zvcm08U2NhbGFyLERpbT46OnRvUU1hdHJpeCh2b2lkKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKERpbT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICByZXR1cm4gUU1hdHJpeChtX21hdHJpeC5jb2VmZigwLDApLCBtX21hdHJpeC5jb2VmZigxLDApLAorICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDEpLCBtX21hdHJpeC5jb2VmZigxLDEpLAorICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDIpLCBtX21hdHJpeC5jb2VmZigxLDIpKTsKK30KKworLyoqIEluaXRpYWxpc2VzIFxjICp0aGlzIGZyb20gYSBRVHJhbnNmb3JtIGFzc3VtaW5nIHRoZSBkaW1lbnNpb24gaXMgMi4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIHRva2VuIEVJR0VOX1FUX1NVUFBPUlQgaXMgZGVmaW5lZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK1RyYW5zZm9ybTxTY2FsYXIsRGltPjo6VHJhbnNmb3JtKGNvbnN0IFFUcmFuc2Zvcm0mIG90aGVyKQoreworICAqdGhpcyA9IG90aGVyOworfQorCisvKiogU2V0IFxjICp0aGlzIGZyb20gYSBRVHJhbnNmb3JtIGFzc3VtaW5nIHRoZSBkaW1lbnNpb24gaXMgMi4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIHRva2VuIEVJR0VOX1FUX1NVUFBPUlQgaXMgZGVmaW5lZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK1RyYW5zZm9ybTxTY2FsYXIsRGltPiYgVHJhbnNmb3JtPFNjYWxhcixEaW0+OjpvcGVyYXRvcj0oY29uc3QgUVRyYW5zZm9ybSYgb3RoZXIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRGltPT0yLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgIG1fbWF0cml4IDw8IG90aGVyLm0xMSgpLCBvdGhlci5tMjEoKSwgb3RoZXIuZHgoKSwKKyAgICAgICAgICAgICAgb3RoZXIubTEyKCksIG90aGVyLm0yMigpLCBvdGhlci5keSgpLAorICAgICAgICAgICAgICBvdGhlci5tMTMoKSwgb3RoZXIubTIzKCksIG90aGVyLm0zMygpOworICAgcmV0dXJuICp0aGlzOworfQorCisvKiogXHJldHVybnMgYSBRVHJhbnNmb3JtIGZyb20gXGMgKnRoaXMgYXNzdW1pbmcgdGhlIGRpbWVuc2lvbiBpcyAyLgorICAqCisgICogVGhpcyBmdW5jdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiB0aGUgdG9rZW4gRUlHRU5fUVRfU1VQUE9SVCBpcyBkZWZpbmVkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgorUVRyYW5zZm9ybSBUcmFuc2Zvcm08U2NhbGFyLERpbT46OnRvUVRyYW5zZm9ybSh2b2lkKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKERpbT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICByZXR1cm4gUVRyYW5zZm9ybShtX21hdHJpeC5jb2VmZigwLDApLCBtX21hdHJpeC5jb2VmZigxLDApLCBtX21hdHJpeC5jb2VmZigyLDApLAorICAgICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDEpLCBtX21hdHJpeC5jb2VmZigxLDEpLCBtX21hdHJpeC5jb2VmZigyLDEpLAorICAgICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDIpLCBtX21hdHJpeC5jb2VmZigxLDIpLCBtX21hdHJpeC5jb2VmZigyLDIpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqCisqKiogUHJvY2VkdXJhbCBBUEkgKioqCisqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBBcHBsaWVzIG9uIHRoZSByaWdodCB0aGUgbm9uIHVuaWZvcm0gc2NhbGUgdHJhbnNmb3JtYXRpb24gcmVwcmVzZW50ZWQKKyAgKiBieSB0aGUgdmVjdG9yIFxhIG90aGVyIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqIFxzYSBwcmVzY2FsZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitUcmFuc2Zvcm08U2NhbGFyLERpbT4mCitUcmFuc2Zvcm08U2NhbGFyLERpbT46OnNjYWxlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoT3RoZXJEZXJpdmVkLGludChEaW0pKQorICBsaW5lYXIoKSA9IChsaW5lYXIoKSAqIG90aGVyLmFzRGlhZ29uYWwoKSkubGF6eSgpOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBBcHBsaWVzIG9uIHRoZSByaWdodCBhIHVuaWZvcm0gc2NhbGUgb2YgYSBmYWN0b3IgXGEgYyB0byBcYyAqdGhpcworICAqIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqIFxzYSBwcmVzY2FsZShTY2FsYXIpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0+JiBUcmFuc2Zvcm08U2NhbGFyLERpbT46OnNjYWxlKFNjYWxhciBzKQoreworICBsaW5lYXIoKSAqPSBzOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBBcHBsaWVzIG9uIHRoZSBsZWZ0IHRoZSBub24gdW5pZm9ybSBzY2FsZSB0cmFuc2Zvcm1hdGlvbiByZXByZXNlbnRlZAorICAqIGJ5IHRoZSB2ZWN0b3IgXGEgb3RoZXIgdG8gXGMgKnRoaXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICogXHNhIHNjYWxlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK1RyYW5zZm9ybTxTY2FsYXIsRGltPiYKK1RyYW5zZm9ybTxTY2FsYXIsRGltPjo6cHJlc2NhbGUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShPdGhlckRlcml2ZWQsaW50KERpbSkpCisgIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPERpbSxIRGltPigwLDApID0gKG90aGVyLmFzRGlhZ29uYWwoKSAqIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPERpbSxIRGltPigwLDApKS5sYXp5KCk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIGxlZnQgYSB1bmlmb3JtIHNjYWxlIG9mIGEgZmFjdG9yIFxhIGMgdG8gXGMgKnRoaXMKKyAgKiBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgKiBcc2Egc2NhbGUoU2NhbGFyKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgoraW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltPiYgVHJhbnNmb3JtPFNjYWxhcixEaW0+OjpwcmVzY2FsZShTY2FsYXIgcykKK3sKKyAgbV9tYXRyaXgudGVtcGxhdGUgY29ybmVyPERpbSxIRGltPihUb3BMZWZ0KSAqPSBzOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBBcHBsaWVzIG9uIHRoZSByaWdodCB0aGUgdHJhbnNsYXRpb24gbWF0cml4IHJlcHJlc2VudGVkIGJ5IHRoZSB2ZWN0b3IgXGEgb3RoZXIKKyAgKiB0byBcYyAqdGhpcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgKiBcc2EgcHJldHJhbnNsYXRlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK1RyYW5zZm9ybTxTY2FsYXIsRGltPiYKK1RyYW5zZm9ybTxTY2FsYXIsRGltPjo6dHJhbnNsYXRlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoT3RoZXJEZXJpdmVkLGludChEaW0pKQorICB0cmFuc2xhdGlvbigpICs9IGxpbmVhcigpICogb3RoZXI7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIGxlZnQgdGhlIHRyYW5zbGF0aW9uIG1hdHJpeCByZXByZXNlbnRlZCBieSB0aGUgdmVjdG9yIFxhIG90aGVyCisgICogdG8gXGMgKnRoaXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICogXHNhIHRyYW5zbGF0ZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitUcmFuc2Zvcm08U2NhbGFyLERpbT4mCitUcmFuc2Zvcm08U2NhbGFyLERpbT46OnByZXRyYW5zbGF0ZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKE90aGVyRGVyaXZlZCxpbnQoRGltKSkKKyAgdHJhbnNsYXRpb24oKSArPSBvdGhlcjsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogQXBwbGllcyBvbiB0aGUgcmlnaHQgdGhlIHJvdGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3RhdGlvbiBcYSByb3RhdGlvbgorICAqIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBSb3RhdGlvblR5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIHJvdGF0aW9uIHdoaWNoCisgICogbXVzdCBiZSBrbm93biBieSBlaV90b1JvdGF0aW9uTWF0cml4PD4uCisgICoKKyAgKiBOYXRpdmVseSBzdXBwb3J0ZWQgdHlwZXMgaW5jbHVkZXM6CisgICogICAtIGFueSBzY2FsYXIgKDJEKSwKKyAgKiAgIC0gYSBEaW0geCBEaW0gbWF0cml4IGV4cHJlc3Npb24sCisgICogICAtIGEgUXVhdGVybmlvbiAoM0QpLAorICAqICAgLSBhIEFuZ2xlQXhpcyAoM0QpCisgICoKKyAgKiBUaGlzIG1lY2hhbmlzbSBpcyBlYXNpbHkgZXh0ZW5kYWJsZSB0byBzdXBwb3J0IHVzZXIgdHlwZXMgc3VjaCBhcyBFdWxlciBhbmdsZXMsCisgICogb3IgYSBwYWlyIG9mIFF1YXRlcm5pb24gZm9yIDREIHJvdGF0aW9ucy4KKyAgKgorICAqIFxzYSByb3RhdGUoU2NhbGFyKSwgY2xhc3MgUXVhdGVybmlvbiwgY2xhc3MgQW5nbGVBeGlzLCBwcmVyb3RhdGUoUm90YXRpb25UeXBlKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgordGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25UeXBlPgorVHJhbnNmb3JtPFNjYWxhcixEaW0+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0+Ojpyb3RhdGUoY29uc3QgUm90YXRpb25UeXBlJiByb3RhdGlvbikKK3sKKyAgbGluZWFyKCkgKj0gZWlfdG9Sb3RhdGlvbk1hdHJpeDxTY2FsYXIsRGltPihyb3RhdGlvbik7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIGxlZnQgdGhlIHJvdGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3RhdGlvbiBcYSByb3RhdGlvbgorICAqIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqCisgICogU2VlIHJvdGF0ZSgpIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgICoKKyAgKiBcc2Egcm90YXRlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK3RlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uVHlwZT4KK1RyYW5zZm9ybTxTY2FsYXIsRGltPiYKK1RyYW5zZm9ybTxTY2FsYXIsRGltPjo6cHJlcm90YXRlKGNvbnN0IFJvdGF0aW9uVHlwZSYgcm90YXRpb24pCit7CisgIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPERpbSxIRGltPigwLDApID0gZWlfdG9Sb3RhdGlvbk1hdHJpeDxTY2FsYXIsRGltPihyb3RhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sSERpbT4oMCwwKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogQXBwbGllcyBvbiB0aGUgcmlnaHQgdGhlIHNoZWFyIHRyYW5zZm9ybWF0aW9uIHJlcHJlc2VudGVkCisgICogYnkgdGhlIHZlY3RvciBcYSBvdGhlciB0byBcYyAqdGhpcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgKiBcd2FybmluZyAyRCBvbmx5LgorICAqIFxzYSBwcmVzaGVhcigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitUcmFuc2Zvcm08U2NhbGFyLERpbT4mCitUcmFuc2Zvcm08U2NhbGFyLERpbT46OnNoZWFyKFNjYWxhciBzeCwgU2NhbGFyIHN5KQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKGludChEaW0pPT0yLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgIFZlY3RvclR5cGUgdG1wID0gbGluZWFyKCkuY29sKDApKnN5ICsgbGluZWFyKCkuY29sKDEpOworICBsaW5lYXIoKSA8PCBsaW5lYXIoKS5jb2woMCkgKyBsaW5lYXIoKS5jb2woMSkqc3gsIHRtcDsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogQXBwbGllcyBvbiB0aGUgbGVmdCB0aGUgc2hlYXIgdHJhbnNmb3JtYXRpb24gcmVwcmVzZW50ZWQKKyAgKiBieSB0aGUgdmVjdG9yIFxhIG90aGVyIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqIFx3YXJuaW5nIDJEIG9ubHkuCisgICogXHNhIHNoZWFyKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK1RyYW5zZm9ybTxTY2FsYXIsRGltPiYKK1RyYW5zZm9ybTxTY2FsYXIsRGltPjo6cHJlc2hlYXIoU2NhbGFyIHN4LCBTY2FsYXIgc3kpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoaW50KERpbSk9PTIsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgbV9tYXRyaXgudGVtcGxhdGUgYmxvY2s8RGltLEhEaW0+KDAsMCkgPSBMaW5lYXJNYXRyaXhUeXBlKDEsIHN4LCBzeSwgMSkgKiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sSERpbT4oMCwwKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2NhbGluZywgVHJhbnNsYXRpb24gYW5kIFJvdGF0aW9uIGNvbXBhdGliaWxpdHkgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK2lubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbT4mIFRyYW5zZm9ybTxTY2FsYXIsRGltPjo6b3BlcmF0b3I9KGNvbnN0IFRyYW5zbGF0aW9uVHlwZSYgdCkKK3sKKyAgbGluZWFyKCkuc2V0SWRlbnRpdHkoKTsKKyAgdHJhbnNsYXRpb24oKSA9IHQudmVjdG9yKCk7CisgIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPDEsRGltPihEaW0sMCkuc2V0WmVybygpOworICBtX21hdHJpeChEaW0sRGltKSA9IFNjYWxhcigxKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0+IFRyYW5zZm9ybTxTY2FsYXIsRGltPjo6b3BlcmF0b3IqKGNvbnN0IFRyYW5zbGF0aW9uVHlwZSYgdCkgY29uc3QKK3sKKyAgVHJhbnNmb3JtIHJlcyA9ICp0aGlzOworICByZXMudHJhbnNsYXRlKHQudmVjdG9yKCkpOworICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0+JiBUcmFuc2Zvcm08U2NhbGFyLERpbT46Om9wZXJhdG9yPShjb25zdCBTY2FsaW5nVHlwZSYgcykKK3sKKyAgbV9tYXRyaXguc2V0WmVybygpOworICBsaW5lYXIoKS5kaWFnb25hbCgpID0gcy5jb2VmZnMoKTsKKyAgbV9tYXRyaXguY29lZmZSZWYoRGltLERpbSkgPSBTY2FsYXIoMSk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgoraW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltPiBUcmFuc2Zvcm08U2NhbGFyLERpbT46Om9wZXJhdG9yKihjb25zdCBTY2FsaW5nVHlwZSYgcykgY29uc3QKK3sKKyAgVHJhbnNmb3JtIHJlcyA9ICp0aGlzOworICByZXMuc2NhbGUocy5jb2VmZnMoKSk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0+JiBUcmFuc2Zvcm08U2NhbGFyLERpbT46Om9wZXJhdG9yPShjb25zdCBSb3RhdGlvbkJhc2U8RGVyaXZlZCxEaW0+JiByKQoreworICBsaW5lYXIoKSA9IGVpX3RvUm90YXRpb25NYXRyaXg8U2NhbGFyLERpbT4ocik7CisgIHRyYW5zbGF0aW9uKCkuc2V0WmVybygpOworICBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazwxLERpbT4oRGltLDApLnNldFplcm8oKTsKKyAgbV9tYXRyaXguY29lZmZSZWYoRGltLERpbSkgPSBTY2FsYXIoMSk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbT4gVHJhbnNmb3JtPFNjYWxhcixEaW0+OjpvcGVyYXRvciooY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikgY29uc3QKK3sKKyAgVHJhbnNmb3JtIHJlcyA9ICp0aGlzOworICByZXMucm90YXRlKHIuZGVyaXZlZCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNwZWNpYWwgZnVuY3Rpb25zICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXHJldHVybnMgdGhlIHJvdGF0aW9uIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uCisgICogXG5vbnN0YWJsZXlldAorICAqCisgICogXHN2ZF9tb2R1bGUKKyAgKgorICAqIFxzYSBjb21wdXRlUm90YXRpb25TY2FsaW5nKCksIGNvbXB1dGVTY2FsaW5nUm90YXRpb24oKSwgY2xhc3MgU1ZECisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+Cit0eXBlbmFtZSBUcmFuc2Zvcm08U2NhbGFyLERpbT46OkxpbmVhck1hdHJpeFR5cGUKK1RyYW5zZm9ybTxTY2FsYXIsRGltPjo6cm90YXRpb24oKSBjb25zdAoreworICBMaW5lYXJNYXRyaXhUeXBlIHJlc3VsdDsKKyAgY29tcHV0ZVJvdGF0aW9uU2NhbGluZygmcmVzdWx0LCAoTGluZWFyTWF0cml4VHlwZSopMCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoqIGRlY29tcG9zZXMgdGhlIGxpbmVhciBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBhcyBhIHByb2R1Y3Qgcm90YXRpb24geCBzY2FsaW5nLCB0aGUgc2NhbGluZyBiZWluZworICAqIG5vdCBuZWNlc3NhcmlseSBwb3NpdGl2ZS4KKyAgKgorICAqIElmIGVpdGhlciBwb2ludGVyIGlzIHplcm8sIHRoZSBjb3JyZXNwb25kaW5nIGNvbXB1dGF0aW9uIGlzIHNraXBwZWQuCisgICoKKyAgKiBcbm9uc3RhYmxleWV0CisgICoKKyAgKiBcc3ZkX21vZHVsZQorICAqCisgICogXHNhIGNvbXB1dGVTY2FsaW5nUm90YXRpb24oKSwgcm90YXRpb24oKSwgY2xhc3MgU1ZECisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSb3RhdGlvbk1hdHJpeFR5cGUsIHR5cGVuYW1lIFNjYWxpbmdNYXRyaXhUeXBlPgordm9pZCBUcmFuc2Zvcm08U2NhbGFyLERpbT46OmNvbXB1dGVSb3RhdGlvblNjYWxpbmcoUm90YXRpb25NYXRyaXhUeXBlICpyb3RhdGlvbiwgU2NhbGluZ01hdHJpeFR5cGUgKnNjYWxpbmcpIGNvbnN0Cit7CisgIEphY29iaVNWRDxMaW5lYXJNYXRyaXhUeXBlPiBzdmQobGluZWFyKCksIENvbXB1dGVGdWxsVXxDb21wdXRlRnVsbFYpOworICBTY2FsYXIgeCA9IChzdmQubWF0cml4VSgpICogc3ZkLm1hdHJpeFYoKS5hZGpvaW50KCkpLmRldGVybWluYW50KCk7IC8vIHNvIHggaGFzIGFic29sdXRlIHZhbHVlIDEKKyAgTWF0cml4PFNjYWxhciwgRGltLCAxPiBzdihzdmQuc2luZ3VsYXJWYWx1ZXMoKSk7CisgIHN2LmNvZWZmUmVmKDApICo9IHg7CisgIGlmKHNjYWxpbmcpCisgIHsKKyAgICBzY2FsaW5nLT5ub2FsaWFzKCkgPSBzdmQubWF0cml4VigpICogc3YuYXNEaWFnb25hbCgpICogc3ZkLm1hdHJpeFYoKS5hZGpvaW50KCk7CisgIH0KKyAgaWYocm90YXRpb24pCisgIHsKKyAgICBMaW5lYXJNYXRyaXhUeXBlIG0oc3ZkLm1hdHJpeFUoKSk7CisgICAgbS5jb2woMCkgLz0geDsKKyAgICByb3RhdGlvbi0+bm9hbGlhcygpID0gbSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpOworICB9Cit9CisKKy8qKiBkZWNvbXBvc2VzIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gYXMgYSBwcm9kdWN0IHJvdGF0aW9uIHggc2NhbGluZywgdGhlIHNjYWxpbmcgYmVpbmcKKyAgKiBub3QgbmVjZXNzYXJpbHkgcG9zaXRpdmUuCisgICoKKyAgKiBJZiBlaXRoZXIgcG9pbnRlciBpcyB6ZXJvLCB0aGUgY29ycmVzcG9uZGluZyBjb21wdXRhdGlvbiBpcyBza2lwcGVkLgorICAqCisgICogXG5vbnN0YWJsZXlldAorICAqCisgICogXHN2ZF9tb2R1bGUKKyAgKgorICAqIFxzYSBjb21wdXRlUm90YXRpb25TY2FsaW5nKCksIHJvdGF0aW9uKCksIGNsYXNzIFNWRAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGluZ01hdHJpeFR5cGUsIHR5cGVuYW1lIFJvdGF0aW9uTWF0cml4VHlwZT4KK3ZvaWQgVHJhbnNmb3JtPFNjYWxhcixEaW0+Ojpjb21wdXRlU2NhbGluZ1JvdGF0aW9uKFNjYWxpbmdNYXRyaXhUeXBlICpzY2FsaW5nLCBSb3RhdGlvbk1hdHJpeFR5cGUgKnJvdGF0aW9uKSBjb25zdAoreworICBKYWNvYmlTVkQ8TGluZWFyTWF0cml4VHlwZT4gc3ZkKGxpbmVhcigpLCBDb21wdXRlRnVsbFV8Q29tcHV0ZUZ1bGxWKTsKKyAgU2NhbGFyIHggPSAoc3ZkLm1hdHJpeFUoKSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKS5kZXRlcm1pbmFudCgpOyAvLyBzbyB4IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxCisgIE1hdHJpeDxTY2FsYXIsIERpbSwgMT4gc3Yoc3ZkLnNpbmd1bGFyVmFsdWVzKCkpOworICBzdi5jb2VmZlJlZigwKSAqPSB4OworICBpZihzY2FsaW5nKQorICB7CisgICAgc2NhbGluZy0+bm9hbGlhcygpID0gc3ZkLm1hdHJpeFUoKSAqIHN2LmFzRGlhZ29uYWwoKSAqIHN2ZC5tYXRyaXhVKCkuYWRqb2ludCgpOworICB9CisgIGlmKHJvdGF0aW9uKQorICB7CisgICAgTGluZWFyTWF0cml4VHlwZSBtKHN2ZC5tYXRyaXhVKCkpOworICAgIG0uY29sKDApIC89IHg7CisgICAgcm90YXRpb24tPm5vYWxpYXMoKSA9IG0gKiBzdmQubWF0cml4VigpLmFkam9pbnQoKTsKKyAgfQorfQorCisvKiogQ29udmVuaWVudCBtZXRob2QgdG8gc2V0IFxjICp0aGlzIGZyb20gYSBwb3NpdGlvbiwgb3JpZW50YXRpb24gYW5kIHNjYWxlCisgICogb2YgYSAzRCBvYmplY3QuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBQb3NpdGlvbkRlcml2ZWQsIHR5cGVuYW1lIE9yaWVudGF0aW9uVHlwZSwgdHlwZW5hbWUgU2NhbGVEZXJpdmVkPgorVHJhbnNmb3JtPFNjYWxhcixEaW0+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0+Ojpmcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKGNvbnN0IE1hdHJpeEJhc2U8UG9zaXRpb25EZXJpdmVkPiAmcG9zaXRpb24sCisgIGNvbnN0IE9yaWVudGF0aW9uVHlwZSYgb3JpZW50YXRpb24sIGNvbnN0IE1hdHJpeEJhc2U8U2NhbGVEZXJpdmVkPiAmc2NhbGUpCit7CisgIGxpbmVhcigpID0gZWlfdG9Sb3RhdGlvbk1hdHJpeDxTY2FsYXIsRGltPihvcmllbnRhdGlvbik7CisgIGxpbmVhcigpICo9IHNjYWxlLmFzRGlhZ29uYWwoKTsKKyAgdHJhbnNsYXRpb24oKSA9IHBvc2l0aW9uOworICBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazwxLERpbT4oRGltLDApLnNldFplcm8oKTsKKyAgbV9tYXRyaXgoRGltLERpbSkgPSBTY2FsYXIoMSk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFxub25zdGFibGV5ZXQKKyAgKgorICAqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhY2NvcmRpbmcgdG8gc29tZSBnaXZlbiBrbm93bGVkZ2UKKyAgKiBvbiBcYyAqdGhpcy4KKyAgKgorICAqIFxwYXJhbSB0cmFpdHMgYWxsb3dzIHRvIG9wdGltaXplIHRoZSBpbnZlcnNpb24gcHJvY2VzcyB3aGVuIHRoZSB0cmFuc2Zvcm1pb24KKyAgKiBpcyBrbm93biB0byBiZSBub3QgYSBnZW5lcmFsIHRyYW5zZm9ybWF0aW9uLiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZToKKyAgKiAgLSBQcm9qZWN0aXZlIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBub3QgbmVjZXNzYXJpbHkgYWZmaW5lLCBpLmUuLCBpZiB0aGUKKyAgKiAgICBsYXN0IHJvdyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBbMCAuLi4gMCAxXQorICAqICAtIEFmZmluZSBpcyB0aGUgZGVmYXVsdCwgdGhlIGxhc3Qgcm93IGlzIGFzc3VtZWQgdG8gYmUgWzAgLi4uIDAgMV0KKyAgKiAgLSBJc29tZXRyeSBpZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb25seSBhIGNvbmNhdGVuYXRpb25zIG9mIHRyYW5zbGF0aW9ucworICAqICAgIGFuZCByb3RhdGlvbnMuCisgICoKKyAgKiBcd2FybmluZyB1bmxlc3MgXGEgdHJhaXRzIGlzIGFsd2F5cyBzZXQgdG8gTm9TaGVhciBvciBOb1NjYWxpbmcsIHRoaXMgZnVuY3Rpb24KKyAgKiByZXF1aXJlcyB0aGUgZ2VuZXJpYyBpbnZlcnNlIG1ldGhvZCBvZiBNYXRyaXhCYXNlIGRlZmluZWQgaW4gdGhlIExVIG1vZHVsZS4gSWYKKyAgKiB5b3UgZm9yZ2V0IHRvIGluY2x1ZGUgdGhpcyBtb2R1bGUsIHRoZW4geW91IHdpbGwgZ2V0IGhhcmQgdG8gZGVidWcgbGlua2luZyBlcnJvcnMuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6aW52ZXJzZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgVHJhbnNmb3JtPFNjYWxhcixEaW0+OjpNYXRyaXhUeXBlCitUcmFuc2Zvcm08U2NhbGFyLERpbT46OmludmVyc2UoVHJhbnNmb3JtVHJhaXRzIHRyYWl0cykgY29uc3QKK3sKKyAgaWYgKHRyYWl0cyA9PSBQcm9qZWN0aXZlKQorICB7CisgICAgcmV0dXJuIG1fbWF0cml4LmludmVyc2UoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBNYXRyaXhUeXBlIHJlczsKKyAgICBpZiAodHJhaXRzID09IEFmZmluZSkKKyAgICB7CisgICAgICByZXMudGVtcGxhdGUgY29ybmVyPERpbSxEaW0+KFRvcExlZnQpID0gbGluZWFyKCkuaW52ZXJzZSgpOworICAgIH0KKyAgICBlbHNlIGlmICh0cmFpdHMgPT0gSXNvbWV0cnkpCisgICAgeworICAgICAgcmVzLnRlbXBsYXRlIGNvcm5lcjxEaW0sRGltPihUb3BMZWZ0KSA9IGxpbmVhcigpLnRyYW5zcG9zZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZWlfYXNzZXJ0KCJpbnZhbGlkIHRyYWl0cyB2YWx1ZSBpbiBUcmFuc2Zvcm06OmludmVyc2UoKSIpOworICAgIH0KKyAgICAvLyB0cmFuc2xhdGlvbiBhbmQgcmVtYWluaW5nIHBhcnRzCisgICAgcmVzLnRlbXBsYXRlIGNvcm5lcjxEaW0sMT4oVG9wUmlnaHQpID0gLSByZXMudGVtcGxhdGUgY29ybmVyPERpbSxEaW0+KFRvcExlZnQpICogdHJhbnNsYXRpb24oKTsKKyAgICByZXMudGVtcGxhdGUgY29ybmVyPDEsRGltPihCb3R0b21MZWZ0KS5zZXRaZXJvKCk7CisgICAgcmVzLmNvZWZmUmVmKERpbSxEaW0pID0gU2NhbGFyKDEpOworICAgIHJldHVybiByZXM7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU3BlY2lhbGl6YXRpb25zIG9mIG9wZXJhdG9yKiB3aXRoIGEgTWF0cml4QmFzZSAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwgaW50IERpbSwgaW50IEhEaW0+CitzdHJ1Y3QgZWlfdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDxPdGhlcixEaW0sSERpbSwgSERpbSxIRGltPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbT4gVHJhbnNmb3JtVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgUHJvZHVjdFJldHVyblR5cGU8TWF0cml4VHlwZSxPdGhlcj46OlR5cGUgUmVzdWx0VHlwZTsKKyAgc3RhdGljIFJlc3VsdFR5cGUgcnVuKGNvbnN0IFRyYW5zZm9ybVR5cGUmIHRyLCBjb25zdCBPdGhlciYgb3RoZXIpCisgIHsgcmV0dXJuIHRyLm1hdHJpeCgpICogb3RoZXI7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyLCBpbnQgRGltLCBpbnQgSERpbT4KK3N0cnVjdCBlaV90cmFuc2Zvcm1fcHJvZHVjdF9pbXBsPE90aGVyLERpbSxIRGltLCBEaW0sRGltPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbT4gVHJhbnNmb3JtVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgVHJhbnNmb3JtVHlwZSBSZXN1bHRUeXBlOworICBzdGF0aWMgUmVzdWx0VHlwZSBydW4oY29uc3QgVHJhbnNmb3JtVHlwZSYgdHIsIGNvbnN0IE90aGVyJiBvdGhlcikKKyAgeworICAgIFRyYW5zZm9ybVR5cGUgcmVzOworICAgIHJlcy50cmFuc2xhdGlvbigpID0gdHIudHJhbnNsYXRpb24oKTsKKyAgICByZXMubWF0cml4KCkucm93KERpbSkgPSB0ci5tYXRyaXgoKS5yb3coRGltKTsKKyAgICByZXMubGluZWFyKCkgPSAodHIubGluZWFyKCkgKiBvdGhlcikubGF6eSgpOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyLCBpbnQgRGltLCBpbnQgSERpbT4KK3N0cnVjdCBlaV90cmFuc2Zvcm1fcHJvZHVjdF9pbXBsPE90aGVyLERpbSxIRGltLCBIRGltLDE+Cit7CisgIHR5cGVkZWYgVHJhbnNmb3JtPHR5cGVuYW1lIE90aGVyOjpTY2FsYXIsRGltPiBUcmFuc2Zvcm1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0UmV0dXJuVHlwZTxNYXRyaXhUeXBlLE90aGVyPjo6VHlwZSBSZXN1bHRUeXBlOworICBzdGF0aWMgUmVzdWx0VHlwZSBydW4oY29uc3QgVHJhbnNmb3JtVHlwZSYgdHIsIGNvbnN0IE90aGVyJiBvdGhlcikKKyAgeyByZXR1cm4gdHIubWF0cml4KCkgKiBvdGhlcjsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXIsIGludCBEaW0sIGludCBIRGltPgorc3RydWN0IGVpX3RyYW5zZm9ybV9wcm9kdWN0X2ltcGw8T3RoZXIsRGltLEhEaW0sIERpbSwxPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE90aGVyOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltPiBUcmFuc2Zvcm1UeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGltLDE+IFJlc3VsdFR5cGU7CisgIHN0YXRpYyBSZXN1bHRUeXBlIHJ1bihjb25zdCBUcmFuc2Zvcm1UeXBlJiB0ciwgY29uc3QgT3RoZXImIG90aGVyKQorICB7IHJldHVybiAoKHRyLmxpbmVhcigpICogb3RoZXIpICsgdHIudHJhbnNsYXRpb24oKSkKKyAgICAgICAgICAqIChTY2FsYXIoMSkgLyAoICh0ci5tYXRyaXgoKS50ZW1wbGF0ZSBibG9jazwxLERpbT4oRGltLDApICogb3RoZXIpLmNvZWZmKDApICsgdHIubWF0cml4KCkuY29lZmYoRGltLERpbSkpKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9HZW9tZXRyeS9UcmFuc2xhdGlvbi5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvVHJhbnNsYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmI5YTlmCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvR2VvbWV0cnkvVHJhbnNsYXRpb24uaApAQCAtMCwwICsxLDE4NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gbm8gaW5jbHVkZSBndWFyZCwgd2UnbGwgaW5jbHVkZSB0aGlzIHR3aWNlIGZyb20gQWxsLmggZnJvbSBFaWdlbjJTdXBwb3J0LCBhbmQgaXQncyBpbnRlcm5hbCBhbnl3YXkKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXGNsYXNzIFRyYW5zbGF0aW9uCisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHRyYW5zbGF0aW9uIHRyYW5zZm9ybWF0aW9uCisgICoKKyAgKiBccGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4sIHRoZSB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMuCisgICogXHBhcmFtIF9EaW0gdGhlICBkaW1lbnNpb24gb2YgdGhlIHNwYWNlLCBjYW4gYmUgYSBjb21waWxlIHRpbWUgdmFsdWUgb3IgRHluYW1pYworICAqCisgICogXG5vdGUgVGhpcyBjbGFzcyBpcyBub3QgYWltZWQgdG8gYmUgdXNlZCB0byBzdG9yZSBhIHRyYW5zbGF0aW9uIHRyYW5zZm9ybWF0aW9uLAorICAqIGJ1dCByYXRoZXIgdG8gbWFrZSBlYXNpZXIgdGhlIGNvbnN0cnVjdGlvbnMgYW5kIHVwZGF0ZXMgb2YgVHJhbnNmb3JtIG9iamVjdHMuCisgICoKKyAgKiBcc2EgY2xhc3MgU2NhbGluZywgY2xhc3MgVHJhbnNmb3JtCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbT4KK2NsYXNzIFRyYW5zbGF0aW9uCit7CitwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoX1NjYWxhcixfRGltKQorICAvKiogZGltZW5zaW9uIG9mIHRoZSBzcGFjZSAqLworICBlbnVtIHsgRGltID0gX0RpbSB9OworICAvKiogdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgLyoqIGNvcnJlc3BvbmRpbmcgdmVjdG9yIHR5cGUgKi8KKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERpbSwxPiBWZWN0b3JUeXBlOworICAvKiogY29ycmVzcG9uZGluZyBsaW5lYXIgdHJhbnNmb3JtYXRpb24gbWF0cml4IHR5cGUgKi8KKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERpbSxEaW0+IExpbmVhck1hdHJpeFR5cGU7CisgIC8qKiBjb3JyZXNwb25kaW5nIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gdHlwZSAqLworICB0eXBlZGVmIFNjYWxpbmc8U2NhbGFyLERpbT4gU2NhbGluZ1R5cGU7CisgIC8qKiBjb3JyZXNwb25kaW5nIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiB0eXBlICovCisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0+IFRyYW5zZm9ybVR5cGU7CisKK3Byb3RlY3RlZDoKKworICBWZWN0b3JUeXBlIG1fY29lZmZzOworCitwdWJsaWM6CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aG91dCBpbml0aWFsaXphdGlvbi4gKi8KKyAgVHJhbnNsYXRpb24oKSB7fQorICAvKiogICovCisgIGlubGluZSBUcmFuc2xhdGlvbihjb25zdCBTY2FsYXImIHN4LCBjb25zdCBTY2FsYXImIHN5KQorICB7CisgICAgZWlfYXNzZXJ0KERpbT09Mik7CisgICAgbV9jb2VmZnMueCgpID0gc3g7CisgICAgbV9jb2VmZnMueSgpID0gc3k7CisgIH0KKyAgLyoqICAqLworICBpbmxpbmUgVHJhbnNsYXRpb24oY29uc3QgU2NhbGFyJiBzeCwgY29uc3QgU2NhbGFyJiBzeSwgY29uc3QgU2NhbGFyJiBzeikKKyAgeworICAgIGVpX2Fzc2VydChEaW09PTMpOworICAgIG1fY29lZmZzLngoKSA9IHN4OworICAgIG1fY29lZmZzLnkoKSA9IHN5OworICAgIG1fY29lZmZzLnooKSA9IHN6OworICB9CisgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplIHRoZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIGZyb20gYSB2ZWN0b3Igb2Ygc2NhbGluZyBjb2VmZmljaWVudHMgKi8KKyAgZXhwbGljaXQgaW5saW5lIFRyYW5zbGF0aW9uKGNvbnN0IFZlY3RvclR5cGUmIHZlY3RvcikgOiBtX2NvZWZmcyh2ZWN0b3IpIHt9CisKKyAgY29uc3QgVmVjdG9yVHlwZSYgdmVjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7IH0KKyAgVmVjdG9yVHlwZSYgdmVjdG9yKCkgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIHR3byB0cmFuc2xhdGlvbiAqLworICBpbmxpbmUgVHJhbnNsYXRpb24gb3BlcmF0b3IqIChjb25zdCBUcmFuc2xhdGlvbiYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIFRyYW5zbGF0aW9uKG1fY29lZmZzICsgb3RoZXIubV9jb2VmZnMpOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyBhIHRyYW5zbGF0aW9uIGFuZCBhIHNjYWxpbmcgKi8KKyAgaW5saW5lIFRyYW5zZm9ybVR5cGUgb3BlcmF0b3IqIChjb25zdCBTY2FsaW5nVHlwZSYgb3RoZXIpIGNvbnN0OworCisgIC8qKiBDb25jYXRlbmF0ZXMgYSB0cmFuc2xhdGlvbiBhbmQgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gKi8KKyAgaW5saW5lIFRyYW5zZm9ybVR5cGUgb3BlcmF0b3IqIChjb25zdCBMaW5lYXJNYXRyaXhUeXBlJiBsaW5lYXIpIGNvbnN0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBUcmFuc2Zvcm1UeXBlIG9wZXJhdG9yKihjb25zdCBSb3RhdGlvbkJhc2U8RGVyaXZlZCxEaW0+JiByKSBjb25zdAorICB7IHJldHVybiAqdGhpcyAqIHIudG9Sb3RhdGlvbk1hdHJpeCgpOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyBhIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBhbmQgYSB0cmFuc2xhdGlvbiAqLworICAvLyBpdHMgYSBuaWdodG1hcmUgdG8gZGVmaW5lIGEgdGVtcGxhdGVkIGZyaWVuZCBmdW5jdGlvbiBvdXRzaWRlIGl0cyBkZWNsYXJhdGlvbgorICBmcmllbmQgaW5saW5lIFRyYW5zZm9ybVR5cGUgb3BlcmF0b3IqIChjb25zdCBMaW5lYXJNYXRyaXhUeXBlJiBsaW5lYXIsIGNvbnN0IFRyYW5zbGF0aW9uJiB0KQorICB7CisgICAgVHJhbnNmb3JtVHlwZSByZXM7CisgICAgcmVzLm1hdHJpeCgpLnNldFplcm8oKTsKKyAgICByZXMubGluZWFyKCkgPSBsaW5lYXI7CisgICAgcmVzLnRyYW5zbGF0aW9uKCkgPSBsaW5lYXIgKiB0Lm1fY29lZmZzOworICAgIHJlcy5tYXRyaXgoKS5yb3coRGltKS5zZXRaZXJvKCk7CisgICAgcmVzKERpbSxEaW0pID0gU2NhbGFyKDEpOworICAgIHJldHVybiByZXM7CisgIH0KKworICAvKiogQ29uY2F0ZW5hdGVzIGEgdHJhbnNsYXRpb24gYW5kIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiAqLworICBpbmxpbmUgVHJhbnNmb3JtVHlwZSBvcGVyYXRvciogKGNvbnN0IFRyYW5zZm9ybVR5cGUmIHQpIGNvbnN0OworCisgIC8qKiBBcHBsaWVzIHRyYW5zbGF0aW9uIHRvIHZlY3RvciAqLworICBpbmxpbmUgVmVjdG9yVHlwZSBvcGVyYXRvciogKGNvbnN0IFZlY3RvclR5cGUmIG90aGVyKSBjb25zdAorICB7IHJldHVybiBtX2NvZWZmcyArIG90aGVyOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIHRyYW5zbGF0aW9uIChvcHBvc2l0ZSkgKi8KKyAgVHJhbnNsYXRpb24gaW52ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIFRyYW5zbGF0aW9uKC1tX2NvZWZmcyk7IH0KKworICBUcmFuc2xhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zbGF0aW9uJiBvdGhlcikKKyAgeworICAgIG1fY29lZmZzID0gb3RoZXIubV9jb2VmZnM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIFxyZXR1cm5zIFxjICp0aGlzIHdpdGggc2NhbGFyIHR5cGUgY2FzdGVkIHRvIFxhIE5ld1NjYWxhclR5cGUKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgaWYgXGEgTmV3U2NhbGFyVHlwZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzY2FsYXIgdHlwZSBvZiBcYyAqdGhpcworICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHNtYXJ0bHkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdTY2FsYXJUeXBlPgorICBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8VHJhbnNsYXRpb24sVHJhbnNsYXRpb248TmV3U2NhbGFyVHlwZSxEaW0+ID46OnR5cGUgY2FzdCgpIGNvbnN0CisgIHsgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPFRyYW5zbGF0aW9uLFRyYW5zbGF0aW9uPE5ld1NjYWxhclR5cGUsRGltPiA+Ojp0eXBlKCp0aGlzKTsgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIHR5cGUgY29udmVyc2lvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhclR5cGU+CisgIGlubGluZSBleHBsaWNpdCBUcmFuc2xhdGlvbihjb25zdCBUcmFuc2xhdGlvbjxPdGhlclNjYWxhclR5cGUsRGltPiYgb3RoZXIpCisgIHsgbV9jb2VmZnMgPSBvdGhlci52ZWN0b3IoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgYm9vbCBpc0FwcHJveChjb25zdCBUcmFuc2xhdGlvbiYgb3RoZXIsIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHByZWMgPSBwcmVjaXNpb248U2NhbGFyPigpKSBjb25zdAorICB7IHJldHVybiBtX2NvZWZmcy5pc0FwcHJveChvdGhlci5tX2NvZWZmcywgcHJlYyk7IH0KKworfTsKKworLyoqIFxhZGR0b2dyb3VwIEdlb21ldHJ5X01vZHVsZSAqLworLy9AewordHlwZWRlZiBUcmFuc2xhdGlvbjxmbG9hdCwgMj4gVHJhbnNsYXRpb24yZjsKK3R5cGVkZWYgVHJhbnNsYXRpb248ZG91YmxlLDI+IFRyYW5zbGF0aW9uMmQ7Cit0eXBlZGVmIFRyYW5zbGF0aW9uPGZsb2F0LCAzPiBUcmFuc2xhdGlvbjNmOwordHlwZWRlZiBUcmFuc2xhdGlvbjxkb3VibGUsMz4gVHJhbnNsYXRpb24zZDsKKy8vQH0KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+CitpbmxpbmUgdHlwZW5hbWUgVHJhbnNsYXRpb248U2NhbGFyLERpbT46OlRyYW5zZm9ybVR5cGUKK1RyYW5zbGF0aW9uPFNjYWxhcixEaW0+OjpvcGVyYXRvciogKGNvbnN0IFNjYWxpbmdUeXBlJiBvdGhlcikgY29uc3QKK3sKKyAgVHJhbnNmb3JtVHlwZSByZXM7CisgIHJlcy5tYXRyaXgoKS5zZXRaZXJvKCk7CisgIHJlcy5saW5lYXIoKS5kaWFnb25hbCgpID0gb3RoZXIuY29lZmZzKCk7CisgIHJlcy50cmFuc2xhdGlvbigpID0gbV9jb2VmZnM7CisgIHJlcyhEaW0sRGltKSA9IFNjYWxhcigxKTsKKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgoraW5saW5lIHR5cGVuYW1lIFRyYW5zbGF0aW9uPFNjYWxhcixEaW0+OjpUcmFuc2Zvcm1UeXBlCitUcmFuc2xhdGlvbjxTY2FsYXIsRGltPjo6b3BlcmF0b3IqIChjb25zdCBMaW5lYXJNYXRyaXhUeXBlJiBsaW5lYXIpIGNvbnN0Cit7CisgIFRyYW5zZm9ybVR5cGUgcmVzOworICByZXMubWF0cml4KCkuc2V0WmVybygpOworICByZXMubGluZWFyKCkgPSBsaW5lYXI7CisgIHJlcy50cmFuc2xhdGlvbigpID0gbV9jb2VmZnM7CisgIHJlcy5tYXRyaXgoKS5yb3coRGltKS5zZXRaZXJvKCk7CisgIHJlcyhEaW0sRGltKSA9IFNjYWxhcigxKTsKKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgoraW5saW5lIHR5cGVuYW1lIFRyYW5zbGF0aW9uPFNjYWxhcixEaW0+OjpUcmFuc2Zvcm1UeXBlCitUcmFuc2xhdGlvbjxTY2FsYXIsRGltPjo6b3BlcmF0b3IqIChjb25zdCBUcmFuc2Zvcm1UeXBlJiB0KSBjb25zdAoreworICBUcmFuc2Zvcm1UeXBlIHJlcyA9IHQ7CisgIHJlcy5wcmV0cmFuc2xhdGUobV9jb2VmZnMpOworICByZXR1cm4gcmVzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0xVLmggYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9MVS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjE5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9MVS5oCkBAIC0wLDAgKzEsMTIwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU4yX0xVX0gKKyNkZWZpbmUgRUlHRU4yX0xVX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBMVSA6IHB1YmxpYyBGdWxsUGl2TFU8TWF0cml4VHlwZT4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxpbnQsIDEsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpPcHRpb25zLCAxLCBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZT4gSW50Um93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxpbnQsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxLCBNYXRyaXhUeXBlOjpPcHRpb25zLCBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwgMT4gSW50Q29sVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpPcHRpb25zLCAxLCBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxLCBNYXRyaXhUeXBlOjpPcHRpb25zLCBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwgMT4gQ29sVmVjdG9yVHlwZTsKKworICAgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwKKyAgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAvLyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlICJrZXJuZWwgbWF0cml4IiBpcyB0aGUgbnVtYmVyIG9mIGNvbHMgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIHByb2R1Y3QgIm1hdHJpeCAqIGtlcm5lbCA9IHplcm8iIG1ha2VzIHNlbnNlCisgICAgICAgICAgICAgICAgICBEeW5hbWljLCAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBhdCBjb21waWxlLXRpbWUgdGhlIGRpbWVuc2lvbiBvZiB0aGUga2VybmVsCisgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsIC8vIHNlZSBleHBsYW5hdGlvbiBmb3IgMm5kIHRlbXBsYXRlIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUgLy8gdGhlIGtlcm5lbCBpcyBhIHN1YnNwYWNlIG9mIHRoZSBkb21haW4gc3BhY2UsIHdob3NlIGRpbWVuc2lvbiBpcyB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBjb2x1bW5zIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgKKyAgICA+IEtlcm5lbFJlc3VsdFR5cGU7CisKKyAgICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIC8vIHRoZSBpbWFnZSBpcyBhIHN1YnNwYWNlIG9mIHRoZSBkZXN0aW5hdGlvbiBzcGFjZSwgd2hvc2UgZGltZW5zaW9uIGlzIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Ygcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4CisgICAgICAgICAgICAgICAgICAgRHluYW1pYywgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGtub3cgYXQgY29tcGlsZSB0aW1lIHRoZSBkaW1lbnNpb24gb2YgdGhlIGltYWdlICh0aGUgcmFuaykKKyAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLCAvLyB0aGUgaW1hZ2UgbWF0cml4IHdpbGwgY29uc2lzdCBvZiBjb2x1bW5zIGZyb20gdGhlIG9yaWdpbmFsIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSAgLy8gc28gaXQgaGFzIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFuZCBhdCBtb3N0IGFzIG1hbnkgY29sdW1ucy4KKyAgICA+IEltYWdlUmVzdWx0VHlwZTsKKworICAgIHR5cGVkZWYgRnVsbFBpdkxVPE1hdHJpeFR5cGU+IEJhc2U7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGV4cGxpY2l0IExVKGNvbnN0IFQmIHQpIDogQmFzZSh0KSwgbV9vcmlnaW5hbE1hdHJpeCh0KSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIGJvb2wgc29sdmUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBiLCBSZXN1bHRUeXBlICpyZXN1bHQpIGNvbnN0CisgICAgeworICAgICAgKnJlc3VsdCA9IHN0YXRpY19jYXN0PGNvbnN0IEJhc2UqPih0aGlzKS0+c29sdmUoYik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIGlubGluZSB2b2lkIGNvbXB1dGVJbnZlcnNlKFJlc3VsdFR5cGUgKnJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICBzb2x2ZShNYXRyaXhUeXBlOjpJZGVudGl0eSh0aGlzLT5yb3dzKCksIHRoaXMtPmNvbHMoKSksIHJlc3VsdCk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbE1hdHJpeFR5cGU+CisgICAgdm9pZCBjb21wdXRlS2VybmVsKEtlcm5lbE1hdHJpeFR5cGUgKnJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICAqcmVzdWx0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgQmFzZSo+KHRoaXMpLT5rZXJuZWwoKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW1hZ2VNYXRyaXhUeXBlPgorICAgIHZvaWQgY29tcHV0ZUltYWdlKEltYWdlTWF0cml4VHlwZSAqcmVzdWx0KSBjb25zdAorICAgIHsKKyAgICAgICpyZXN1bHQgPSBzdGF0aWNfY2FzdDxjb25zdCBCYXNlKj4odGhpcyktPmltYWdlKG1fb3JpZ2luYWxNYXRyaXgpOworICAgIH0KKyAgICAKKyAgICBjb25zdCBJbWFnZVJlc3VsdFR5cGUgaW1hZ2UoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBCYXNlKj4odGhpcyktPmltYWdlKG1fb3JpZ2luYWxNYXRyaXgpOworICAgIH0KKyAgICAKKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtX29yaWdpbmFsTWF0cml4OworfTsKKworI2lmIEVJR0VOMl9TVVBQT1JUX1NUQUdFIDwgU1RBR0UyMF9SRVNPTFZFX0FQSV9DT05GTElDVFMKKy8qKiBcbHVfbW9kdWxlCisgICoKKyAgKiBTeW5vbnltIG9mIHBhcnRpYWxQaXZMdSgpLgorICAqCisgICogXHJldHVybiB0aGUgcGFydGlhbC1waXZvdGluZyBMVSBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGNsYXNzIFBhcnRpYWxQaXZMVQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBMVTx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46Omx1KCkgY29uc3QKK3sKKyAgcmV0dXJuIExVPFBsYWluT2JqZWN0PihldmFsKCkpOworfQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTjJfU1VQUE9SVAorLyoqIFxsdV9tb2R1bGUKKyAgKgorICAqIFN5bm9ueW0gb2YgcGFydGlhbFBpdkx1KCkuCisgICoKKyAgKiBccmV0dXJuIHRoZSBwYXJ0aWFsLXBpdm90aW5nIExVIGRlY29tcG9zaXRpb24gb2YgXGMgKnRoaXMuCisgICoKKyAgKiBcc2EgY2xhc3MgUGFydGlhbFBpdkxVCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IExVPHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZWlnZW4yX2x1KCkgY29uc3QKK3sKKyAgcmV0dXJuIExVPFBsYWluT2JqZWN0PihldmFsKCkpOworfQorI2VuZGlmCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU4yX0xVX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0xhenkuaCBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0xhenkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNmYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvTGF6eS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9MQVpZX0gKKyNkZWZpbmUgRUlHRU5fTEFaWV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGRlcHJlY2F0ZWQgaXQgaXMgb25seSB1c2VkIGJ5IGxhenkoKSB3aGljaCBpcyBkZXByZWNhdGVkCisgICoKKyAgKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mICp0aGlzIHdpdGggYWRkZWQgZmxhZ3MKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfbWFya2VkLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfbWFya2VkLm91dAorICAqCisgICogXHNhIGNsYXNzIEZsYWdnZWQsIGV4dHJhY3QoKSwgcGFydCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dW5zaWduZWQgaW50IEFkZGVkPgoraW5saW5lIGNvbnN0IEZsYWdnZWQ8RGVyaXZlZCwgQWRkZWQsIDA+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjptYXJrZWQoKSBjb25zdAoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogXGRlcHJlY2F0ZWQgdXNlIE1hdHJpeEJhc2U6Om5vYWxpYXMoKQorICAqCisgICogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiAqdGhpcyB3aXRoIHRoZSBFdmFsQmVmb3JlQXNzaWduaW5nQml0IGZsYWcgcmVtb3ZlZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfbGF6eS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2xhenkub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgRmxhZ2dlZCwgbWFya2VkKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgRmxhZ2dlZDxEZXJpdmVkLCAwLCBFdmFsQmVmb3JlQXNzaWduaW5nQml0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6bGF6eSgpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKworLyoqIFxpbnRlcm5hbAorICAqIE92ZXJsb2FkZWQgdG8gcGVyZm9ybSBhbiBlZmZpY2llbnQgQyArPSAoQSpCKS5sYXp5KCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitEZXJpdmVkJiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcis9KGNvbnN0IEZsYWdnZWQ8UHJvZHVjdEJhc2U8UHJvZHVjdERlcml2ZWQsIExocyxSaHM+LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQ+JiBvdGhlcikKK3sKKyAgb3RoZXIuX2V4cHJlc3Npb24oKS5kZXJpdmVkKCkuYWRkVG8oZGVyaXZlZCgpKTsgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxpbnRlcm5hbAorICAqIE92ZXJsb2FkZWQgdG8gcGVyZm9ybSBhbiBlZmZpY2llbnQgQyAtPSAoQSpCKS5sYXp5KCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0RGVyaXZlZCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitEZXJpdmVkJiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvci09KGNvbnN0IEZsYWdnZWQ8UHJvZHVjdEJhc2U8UHJvZHVjdERlcml2ZWQsIExocyxSaHM+LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQ+JiBvdGhlcikKK3sKKyAgb3RoZXIuX2V4cHJlc3Npb24oKS5kZXJpdmVkKCkuc3ViVG8oZGVyaXZlZCgpKTsgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9MQVpZX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0xlYXN0U3F1YXJlcy5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvTGVhc3RTcXVhcmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmZjQyOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L0xlYXN0U3F1YXJlcy5oCkBAIC0wLDAgKzEsMTcwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOMl9MRUFTVFNRVUFSRVNfSAorI2RlZmluZSBFSUdFTjJfTEVBU1RTUVVBUkVTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBMZWFzdFNxdWFyZXNfTW9kdWxlCisgICoKKyAgKiBcbGVhc3RzcXVhcmVzX21vZHVsZQorICAqCisgICogRm9yIGEgc2V0IG9mIHBvaW50cywgdGhpcyBmdW5jdGlvbiB0cmllcyB0byBleHByZXNzCisgICogb25lIG9mIHRoZSBjb29yZHMgYXMgYSBsaW5lYXIgKGFmZmluZSkgZnVuY3Rpb24gb2YgdGhlIG90aGVyIGNvb3Jkcy4KKyAgKgorICAqIFRoaXMgaXMgYmVzdCBleHBsYWluZWQgYnkgYW4gZXhhbXBsZS4gVGhpcyBmdW5jdGlvbiB3b3JrcyBpbiBmdWxsCisgICogZ2VuZXJhbGl0eSwgZm9yIHBvaW50cyBpbiBhIHNwYWNlIG9mIGFyYml0cmFyeSBkaW1lbnNpb24sIGFuZCBhbHNvIG92ZXIKKyAgKiB0aGUgY29tcGxleCBudW1iZXJzLCBidXQgZm9yIHRoaXMgZXhhbXBsZSB3ZSB3aWxsIHdvcmsgaW4gZGltZW5zaW9uIDMKKyAgKiBvdmVyIHRoZSByZWFsIG51bWJlcnMgKGRvdWJsZXMpLgorICAqCisgICogU28gbGV0IHVzIHdvcmsgd2l0aCB0aGUgZm9sbG93aW5nIHNldCBvZiA1IHBvaW50cyBnaXZlbiBieSB0aGVpcgorICAqIFxmJCh4LHkseilcZiQgY29vcmRpbmF0ZXM6CisgICogQGNvZGUKKyAgICBWZWN0b3IzZCBwb2ludHNbNV07CisgICAgcG9pbnRzWzBdID0gVmVjdG9yM2QoIDMuMDIsIDYuODksIC00LjMyICk7CisgICAgcG9pbnRzWzFdID0gVmVjdG9yM2QoIDIuMDEsIDUuMzksIC0zLjc5ICk7CisgICAgcG9pbnRzWzJdID0gVmVjdG9yM2QoIDIuNDEsIDYuMDEsIC00LjAxICk7CisgICAgcG9pbnRzWzNdID0gVmVjdG9yM2QoIDIuMDksIDUuNTUsIC0zLjg2ICk7CisgICAgcG9pbnRzWzRdID0gVmVjdG9yM2QoIDIuNTgsIDYuMzIsIC00LjEwICk7CisgICogQGVuZGNvZGUKKyAgKiBTdXBwb3NlIHRoYXQgd2Ugd2FudCB0byBleHByZXNzIHRoZSBzZWNvbmQgY29vcmRpbmF0ZSAoXGYkeVxmJCkgYXMgYSBsaW5lYXIKKyAgKiBleHByZXNzaW9uIGluIFxmJHhcZiQgYW5kIFxmJHpcZiQsIHRoYXQgaXMsCisgICogXGZbIHk9YXgrYnorYyBcZl0KKyAgKiBmb3Igc29tZSBjb25zdGFudHMgXGYkYSxiLGNcZiQuIFRodXMsIHdlIHdhbnQgdG8gZmluZCB0aGUgYmVzdCBwb3NzaWJsZQorICAqIGNvbnN0YW50cyBcZiRhLGIsY1xmJCBzbyB0aGF0IHRoZSBwbGFuZSBvZiBlcXVhdGlvbiBcZiR5PWF4K2J6K2NcZiQgZml0cworICAqIGJlc3QgdGhlIGZpdmUgYWJvdmUgcG9pbnRzLiBUbyBkbyB0aGF0LCBjYWxsIHRoaXMgZnVuY3Rpb24gYXMgZm9sbG93czoKKyAgKiBAY29kZQorICAgIFZlY3RvcjNkIGNvZWZmczsgLy8gd2lsbCBzdG9yZSB0aGUgY29lZmZpY2llbnRzIGEsIGIsIGMKKyAgICBsaW5lYXJSZWdyZXNzaW9uKAorICAgICAgNSwKKyAgICAgICZwb2ludHMsCisgICAgICAmY29lZmZzLAorICAgICAgMSAvLyB0aGUgY29vcmQgdG8gZXhwcmVzcyBhcyBhIGZ1bmN0aW9uIG9mCisgICAgICAgIC8vIHRoZSBvdGhlciBvbmVzLiAwIG1lYW5zIHgsIDEgbWVhbnMgeSwgMiBtZWFucyB6LgorICAgICk7CisgICogQGVuZGNvZGUKKyAgKiBOb3cgdGhlIHZlY3RvciBcYSBjb2VmZnMgaXMgYXBwcm94aW1hdGVseQorICAqIFxmJCggMC40OTUgLCAgLTEuOTI3ICwgIC0yLjkwNiApXGYkLgorICAqIFRodXMsIHdlIGdldCBcZiRhPTAuNDk1LCBiID0gLTEuOTI3LCBjID0gLTIuOTA2XGYkLiBMZXQgdXMgY2hlY2sgZm9yCisgICogaW5zdGFuY2UgaG93IG5lYXIgcG9pbnRzWzBdIGlzIGZyb20gdGhlIHBsYW5lIG9mIGVxdWF0aW9uIFxmJHk9YXgrYnorY1xmJC4KKyAgKiBMb29raW5nIGF0IHRoZSBjb29yZHMgb2YgcG9pbnRzWzBdLCB3ZSBzZWUgdGhhdDoKKyAgKiBcZltheCtieitjID0gMC40OTUgKiAzLjAyICsgKC0xLjkyNykgKiAoLTQuMzIpICsgKC0yLjkwNikgPSA2LjkxLlxmXQorICAqIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBoYXZlIFxmJHk9Ni44OVxmJC4gV2Ugc2VlIHRoYXQgdGhlIHZhbHVlcworICAqIFxmJDYuOTFcZiQgYW5kIFxmJDYuODlcZiQKKyAgKiBhcmUgbmVhciwgc28gcG9pbnRzWzBdIGlzIHZlcnkgbmVhciB0aGUgcGxhbmUgb2YgZXF1YXRpb24gXGYkeT1heCtieitjXGYkLgorICAqCisgICogTGV0J3Mgbm93IGRlc2NyaWJlIHByZWNpc2VseSB0aGUgcGFyYW1ldGVyczoKKyAgKiBAcGFyYW0gbnVtUG9pbnRzIHRoZSBudW1iZXIgb2YgcG9pbnRzCisgICogQHBhcmFtIHBvaW50cyB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHBvaW50cyBvbiB3aGljaCB0byBwZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbgorICAqIEBwYXJhbSByZXN1bHQgcG9pbnRlciB0byB0aGUgdmVjdG9yIGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHQuCisgICAgICAgICAgICAgICAgICBUaGlzIHZlY3RvciBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUgYW5kIHNpemUgYXMgdGhlCisgICAgICAgICAgICAgICAgICBkYXRhIHBvaW50cy4gVGhlIG1lYW5pbmcgb2YgaXRzIGNvb3JkcyBpcyBhcyBmb2xsb3dzLgorICAgICAgICAgICAgICAgICAgRm9yIGJyZXZpdHksIGxldCBcZiRuPVNpemVcZiQsCisgICAgICAgICAgICAgICAgICBcZiRyX2k9cmVzdWx0W2ldXGYkLAorICAgICAgICAgICAgICAgICAgYW5kIFxmJGY9ZnVuY09mT3RoZXJzXGYkLiBEZW5vdGUgYnkKKyAgICAgICAgICAgICAgICAgIFxmJHhfMCxcbGRvdHMseF97bi0xfVxmJAorICAgICAgICAgICAgICAgICAgdGhlIG4gY29vcmRpbmF0ZXMgaW4gdGhlIG4tZGltZW5zaW9uYWwgc3BhY2UuCisgICAgICAgICAgICAgICAgICBUaGVuIHRoZSByZXN1bHRpbmcgZXF1YXRpb24gaXM6CisgICAgICAgICAgICAgICAgICBcZlsgeF9mID0gcl8wIHhfMCArIFxjZG90cyArIHJfe2YtMX14X3tmLTF9CisgICAgICAgICAgICAgICAgICAgKyByX3tmKzF9eF97ZisxfSArIFxjZG90cyArIHJfe24tMX14X3tuLTF9ICsgcl9uLiBcZl0KKyAgKiBAcGFyYW0gZnVuY09mT3RoZXJzIERldGVybWluZXMgd2hpY2ggY29vcmQgdG8gZXhwcmVzcyBhcyBhIGZ1bmN0aW9uIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJzLiBDb29yZHMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGZyb20gMCwgc28gdGhhdCBhCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiAwIG1lYW5zIFxmJHhcZiQsIDEgbWVhbnMgXGYkeVxmJCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIgbWVhbnMgXGYkelxmJCwgLi4uCisgICoKKyAgKiBcc2EgZml0SHlwZXJwbGFuZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCBsaW5lYXJSZWdyZXNzaW9uKGludCBudW1Qb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqKnBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICpyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZ1bmNPZk90aGVycyApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBIeXBlcnBsYW5lPFNjYWxhciwgVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU+IEh5cGVycGxhbmVUeXBlOworICBjb25zdCBpbnQgc2l6ZSA9IHBvaW50c1swXS0+c2l6ZSgpOworICByZXN1bHQtPnJlc2l6ZShzaXplKTsKKyAgSHlwZXJwbGFuZVR5cGUgaChzaXplKTsKKyAgZml0SHlwZXJwbGFuZShudW1Qb2ludHMsIHBvaW50cywgJmgpOworICBmb3IoaW50IGkgPSAwOyBpIDwgZnVuY09mT3RoZXJzOyBpKyspCisgICAgcmVzdWx0LT5jb2VmZlJlZihpKSA9IC0gaC5jb2VmZnMoKVtpXSAvIGguY29lZmZzKClbZnVuY09mT3RoZXJzXTsKKyAgZm9yKGludCBpID0gZnVuY09mT3RoZXJzOyBpIDwgc2l6ZTsgaSsrKQorICAgIHJlc3VsdC0+Y29lZmZSZWYoaSkgPSAtIGguY29lZmZzKClbaSsxXSAvIGguY29lZmZzKClbZnVuY09mT3RoZXJzXTsKK30KKworLyoqIFxpbmdyb3VwIExlYXN0U3F1YXJlc19Nb2R1bGUKKyAgKgorICAqIFxsZWFzdHNxdWFyZXNfbW9kdWxlCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIHF1aXRlIHNpbWlsYXIgdG8gbGluZWFyUmVncmVzc2lvbigpLCBzbyB3ZSByZWZlciB0byB0aGUKKyAgKiBkb2N1bWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYW5kIG9ubHkgbGlzdCBoZXJlIHRoZSBkaWZmZXJlbmNlcy4KKyAgKgorICAqIFRoZSBtYWluIGRpZmZlcmVuY2UgZnJvbSBsaW5lYXJSZWdyZXNzaW9uKCkgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QKKyAgKiB0YWtlIGEgXGEgZnVuY09mT3RoZXJzIGFyZ3VtZW50LiBJbnN0ZWFkLCBpdCBmaW5kcyBhIGdlbmVyYWwgZXF1YXRpb24KKyAgKiBvZiB0aGUgZm9ybQorICAqIFxmWyByXzAgeF8wICsgXGNkb3RzICsgcl97bi0xfXhfe24tMX0gKyByX24gPSAwLCBcZl0KKyAgKiB3aGVyZSBcZiRuPVNpemVcZiQsIFxmJHJfaT1yZXRDb2VmZmljaWVudHNbaV1cZiQsIGFuZCB3ZSBkZW5vdGUgYnkKKyAgKiBcZiR4XzAsXGxkb3RzLHhfe24tMX1cZiQgdGhlIG4gY29vcmRpbmF0ZXMgaW4gdGhlIG4tZGltZW5zaW9uYWwgc3BhY2UuCisgICoKKyAgKiBUaHVzLCB0aGUgdmVjdG9yIFxhIHJldENvZWZmaWNpZW50cyBoYXMgc2l6ZSBcZiRuKzFcZiQsIHdoaWNoIGlzIGFub3RoZXIKKyAgKiBkaWZmZXJlbmNlIGZyb20gbGluZWFyUmVncmVzc2lvbigpLgorICAqCisgICogSW4gcHJhY3RpY2UsIHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYW4gaHlwZXItcGxhbmUgZml0IGluIGEgdG90YWwgbGVhc3Qgc3F1YXJlIHNlbnNlCisgICogdmlhIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICogIDEgLSBjZW50ZXIgdGhlIGRhdGEgdG8gdGhlIG1lYW4KKyAgKiAgMiAtIGNvbXB1dGUgdGhlIGNvdmFyaWFuY2UgbWF0cml4CisgICogIDMgLSBwaWNrIHRoZSBlaWdlbnZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzbWFsbGVzdCBlaWdlbnZhbHVlIG9mIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeAorICAqIFRoZSByYXRpbyBvZiB0aGUgc21hbGxlc3QgZWlnZW52YWx1ZSBhbmQgdGhlIHNlY29uZCBvbmUgZ2l2ZXMgdXMgYSBoaW50IGFib3V0IHRoZSByZWxldmFuY2UKKyAgKiBvZiB0aGUgc29sdXRpb24uIFRoaXMgdmFsdWUgaXMgb3B0aW9uYWxseSByZXR1cm5lZCBpbiBcYSBzb3VuZG5lc3MuCisgICoKKyAgKiBcc2EgbGluZWFyUmVncmVzc2lvbigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlLCB0eXBlbmFtZSBIeXBlcnBsYW5lVHlwZT4KK3ZvaWQgZml0SHlwZXJwbGFuZShpbnQgbnVtUG9pbnRzLAorICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUgKipwb2ludHMsCisgICAgICAgICAgICAgICAgICAgSHlwZXJwbGFuZVR5cGUgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyPjo6UmVhbCogc291bmRuZXNzID0gMCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU+IENvdk1hdHJpeFR5cGU7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoVmVjdG9yVHlwZSkKKyAgZWlfYXNzZXJ0KG51bVBvaW50cyA+PSAxKTsKKyAgaW50IHNpemUgPSBwb2ludHNbMF0tPnNpemUoKTsKKyAgZWlfYXNzZXJ0KHNpemUrMSA9PSByZXN1bHQtPmNvZWZmcygpLnNpemUoKSk7CisKKyAgLy8gY29tcHV0ZSB0aGUgbWVhbiBvZiB0aGUgZGF0YQorICBWZWN0b3JUeXBlIG1lYW4gPSBWZWN0b3JUeXBlOjpaZXJvKHNpemUpOworICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyArK2kpCisgICAgbWVhbiArPSAqKHBvaW50c1tpXSk7CisgIG1lYW4gLz0gbnVtUG9pbnRzOworCisgIC8vIGNvbXB1dGUgdGhlIGNvdmFyaWFuY2UgbWF0cml4CisgIENvdk1hdHJpeFR5cGUgY292TWF0ID0gQ292TWF0cml4VHlwZTo6WmVybyhzaXplLCBzaXplKTsKKyAgVmVjdG9yVHlwZSByZW1lYW4gPSBWZWN0b3JUeXBlOjpaZXJvKHNpemUpOworICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyArK2kpCisgIHsKKyAgICBWZWN0b3JUeXBlIGRpZmYgPSAoKihwb2ludHNbaV0pIC0gbWVhbikuY29uanVnYXRlKCk7CisgICAgY292TWF0ICs9IGRpZmYgKiBkaWZmLmFkam9pbnQoKTsKKyAgfQorCisgIC8vIG5vdyB3ZSBqdXN0IGhhdmUgdG8gcGljayB0aGUgZWlnZW4gdmVjdG9yIHdpdGggc21hbGxlc3QgZWlnZW4gdmFsdWUKKyAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxDb3ZNYXRyaXhUeXBlPiBlaWcoY292TWF0KTsKKyAgcmVzdWx0LT5ub3JtYWwoKSA9IGVpZy5laWdlbnZlY3RvcnMoKS5jb2woMCk7CisgIGlmIChzb3VuZG5lc3MpCisgICAgKnNvdW5kbmVzcyA9IGVpZy5laWdlbnZhbHVlcygpLmNvZWZmKDApL2VpZy5laWdlbnZhbHVlcygpLmNvZWZmKDEpOworCisgIC8vIGxldCdzIGNvbXB1dGUgdGhlIGNvbnN0YW50IGNvZWZmaWNpZW50IHN1Y2ggdGhhdCB0aGUKKyAgLy8gcGxhbmUgcGFzcyB0cm91Z2ggdGhlIG1lYW4gcG9pbnQ6CisgIHJlc3VsdC0+b2Zmc2V0KCkgPSAtIChyZXN1bHQtPm5vcm1hbCgpLmN3aXNlKCkqIG1lYW4pLnN1bSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOMl9MRUFTVFNRVUFSRVNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvTWFjcm9zLmggYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9NYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTFjMzJhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvTWFjcm9zLmgKQEAgLTAsMCArMSwyMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOMl9NQUNST1NfSAorI2RlZmluZSBFSUdFTjJfTUFDUk9TX0gKKworI2RlZmluZSBlaV9hc3NlcnQgZWlnZW5fYXNzZXJ0CisjZGVmaW5lIGVpX2ludGVybmFsX2Fzc2VydCBlaWdlbl9pbnRlcm5hbF9hc3NlcnQKKworI2RlZmluZSBFSUdFTl9BTElHTl8xMjggRUlHRU5fQUxJR04xNgorCisjZGVmaW5lIEVJR0VOX0FSQ0hfV0FOVFNfQUxJR05NRU5UIEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkKKworI2VuZGlmIC8vIEVJR0VOMl9NQUNST1NfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvTWF0aEZ1bmN0aW9ucy5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvTWF0aEZ1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOGE5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9NYXRoRnVuY3Rpb25zLmgKQEAgLTAsMCArMSw1NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOMl9NQVRIX0ZVTkNUSU9OU19ICisjZGVmaW5lIEVJR0VOMl9NQVRIX0ZVTkNUSU9OU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgdHlwZW5hbWUgTnVtVHJhaXRzPFQ+OjpSZWFsIGVpX3JlYWwoY29uc3QgVCYgeCkgeyByZXR1cm4gaW50ZXJuYWw6OnJlYWwoeCk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWwgZWlfaW1hZyhjb25zdCBUJiB4KSB7IHJldHVybiBpbnRlcm5hbDo6aW1hZyh4KTsgfQordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgZWlfY29uaihjb25zdCBUJiB4KSB7IHJldHVybiBpbnRlcm5hbDo6Y29uaih4KTsgfQordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCBlaV9hYnMgKGNvbnN0IFQmIHgpIHsgcmV0dXJuIGludGVybmFsOjphYnMoeCk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWwgZWlfYWJzMihjb25zdCBUJiB4KSB7IHJldHVybiBpbnRlcm5hbDo6YWJzMih4KTsgfQordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgZWlfc3FydChjb25zdCBUJiB4KSB7IHJldHVybiBpbnRlcm5hbDo6c3FydCh4KTsgfQordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgZWlfZXhwIChjb25zdCBUJiB4KSB7IHJldHVybiBpbnRlcm5hbDo6ZXhwKHgpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCBlaV9sb2cgKGNvbnN0IFQmIHgpIHsgcmV0dXJuIGludGVybmFsOjpsb2coeCk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSBUIGVpX3NpbiAoY29uc3QgVCYgeCkgeyByZXR1cm4gaW50ZXJuYWw6OnNpbih4KTsgfQordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgZWlfY29zIChjb25zdCBUJiB4KSB7IHJldHVybiBpbnRlcm5hbDo6Y29zKHgpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCBlaV9hdGFuMihjb25zdCBUJiB4LGNvbnN0IFQmIHkpIHsgcmV0dXJuIGludGVybmFsOjphdGFuMih4LHkpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCBlaV9wb3cgKGNvbnN0IFQmIHgsY29uc3QgVCYgeSkgeyByZXR1cm4gaW50ZXJuYWw6OnBvdyh4LHkpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCBlaV9yYW5kb20gKCkgeyByZXR1cm4gaW50ZXJuYWw6OnJhbmRvbTxUPigpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCBlaV9yYW5kb20gKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIHsgcmV0dXJuIGludGVybmFsOjpyYW5kb20oeCwgeSk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFQgcHJlY2lzaW9uICgpIHsgcmV0dXJuIE51bVRyYWl0czxUPjo6ZHVtbXlfcHJlY2lzaW9uKCk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGlubGluZSBUIG1hY2hpbmVfZXBzaWxvbiAoKSB7IHJldHVybiBOdW1UcmFpdHM8VD46OmVwc2lsb24oKTsgfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgT3RoZXJTY2FsYXI+CitpbmxpbmUgYm9vbCBlaV9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBTY2FsYXImIHgsIGNvbnN0IE90aGVyU2NhbGFyJiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBwcmVjaXNpb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCit7CisgIHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oeCwgeSwgcHJlY2lzaW9uKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIGJvb2wgZWlfaXNBcHByb3goY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHByZWNpc2lvbiA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkKK3sKKyAgcmV0dXJuIGludGVybmFsOjppc0FwcHJveCh4LCB5LCBwcmVjaXNpb24pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitpbmxpbmUgYm9vbCBlaV9pc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBwcmVjaXNpb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCit7CisgIHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3hPckxlc3NUaGFuKHgsIHksIHByZWNpc2lvbik7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU4yX01BVEhfRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L01lbW9yeS5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvTWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2MzcyYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L01lbW9yeS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTjJfTUVNT1JZX0gKKyNkZWZpbmUgRUlHRU4yX01FTU9SWV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCitpbmxpbmUgdm9pZCogZWlfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUpIHsgcmV0dXJuIGludGVybmFsOjphbGlnbmVkX21hbGxvYyhzaXplKTsgfQoraW5saW5lIHZvaWQgIGVpX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpIHsgaW50ZXJuYWw6OmFsaWduZWRfZnJlZShwdHIpOyB9CitpbmxpbmUgdm9pZCogZWlfYWxpZ25lZF9yZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IG5ld19zaXplLCBzaXplX3Qgb2xkX3NpemUpIHsgcmV0dXJuIGludGVybmFsOjphbGlnbmVkX3JlYWxsb2MocHRyLCBuZXdfc2l6ZSwgb2xkX3NpemUpOyB9CitpbmxpbmUgdm9pZCogZWlfaGFuZG1hZGVfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUpIHsgcmV0dXJuIGludGVybmFsOjpoYW5kbWFkZV9hbGlnbmVkX21hbGxvYyhzaXplKTsgfQoraW5saW5lIHZvaWQgIGVpX2hhbmRtYWRlX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpIHsgaW50ZXJuYWw6OmhhbmRtYWRlX2FsaWduZWRfZnJlZShwdHIpOyB9CisKK3RlbXBsYXRlPGJvb2wgQWxpZ24+IGlubGluZSB2b2lkKiBlaV9jb25kaXRpb25hbF9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIGludGVybmFsOjpjb25kaXRpb25hbF9hbGlnbmVkX21hbGxvYzxBbGlnbj4oc2l6ZSk7Cit9Cit0ZW1wbGF0ZTxib29sIEFsaWduPiBpbmxpbmUgdm9pZCBlaV9jb25kaXRpb25hbF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKQoreworICBpbnRlcm5hbDo6Y29uZGl0aW9uYWxfYWxpZ25lZF9mcmVlPEFsaWduPihwdHIpOworfQordGVtcGxhdGU8Ym9vbCBBbGlnbj4gaW5saW5lIHZvaWQqIGVpX2NvbmRpdGlvbmFsX2FsaWduZWRfcmVhbGxvYyh2b2lkKiBwdHIsIHNpemVfdCBuZXdfc2l6ZSwgc2l6ZV90IG9sZF9zaXplKQoreworICByZXR1cm4gaW50ZXJuYWw6OmNvbmRpdGlvbmFsX2FsaWduZWRfcmVhbGxvYzxBbGlnbj4ocHRyLCBuZXdfc2l6ZSwgb2xkX3NpemUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCogZWlfYWxpZ25lZF9uZXcoc2l6ZV90IHNpemUpCit7CisgIHJldHVybiBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8VD4oc2l6ZSk7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCBlaV9hbGlnbmVkX2RlbGV0ZShUICpwdHIsIHNpemVfdCBzaXplKQoreworICByZXR1cm4gaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKHB0ciwgc2l6ZSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU4yX01BQ1JPU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9NZXRhLmggYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9NZXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzN2NmYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L01ldGEuaApAQCAtMCwwICsxLDc1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU4yX01FVEFfSAorI2RlZmluZSBFSUdFTjJfTUVUQV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGVpX3RyYWl0cyA6IGludGVybmFsOjp0cmFpdHM8VD4KK3t9OworCitzdHJ1Y3QgZWlfbWV0YV90cnVlIHsgIGVudW0geyByZXQgPSAxIH07IH07CitzdHJ1Y3QgZWlfbWV0YV9mYWxzZSB7IGVudW0geyByZXQgPSAwIH07IH07CisKK3RlbXBsYXRlPGJvb2wgQ29uZGl0aW9uLCB0eXBlbmFtZSBUaGVuLCB0eXBlbmFtZSBFbHNlPgorc3RydWN0IGVpX21ldGFfaWYgeyB0eXBlZGVmIFRoZW4gcmV0OyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVuLCB0eXBlbmFtZSBFbHNlPgorc3RydWN0IGVpX21ldGFfaWYgPGZhbHNlLCBUaGVuLCBFbHNlPiB7IHR5cGVkZWYgRWxzZSByZXQ7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBlaV9pc19zYW1lX3R5cGUgeyBlbnVtIHsgcmV0ID0gMCB9OyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGVpX2lzX3NhbWVfdHlwZTxULFQ+IHsgZW51bSB7IHJldCA9IDEgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGVpX3VucmVmIHsgdHlwZWRlZiBUIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgZWlfdW5yZWY8VCY+IHsgdHlwZWRlZiBUIHR5cGU7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBlaV91bnBvaW50ZXIgeyB0eXBlZGVmIFQgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBlaV91bnBvaW50ZXI8VCo+IHsgdHlwZWRlZiBUIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgZWlfdW5wb2ludGVyPFQqY29uc3Q+IHsgdHlwZWRlZiBUIHR5cGU7IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBlaV91bmNvbnN0IHsgdHlwZWRlZiBUIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgZWlfdW5jb25zdDxjb25zdCBUPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGVpX3VuY29uc3Q8VCBjb25zdCAmPiB7IHR5cGVkZWYgVCAmIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgZWlfdW5jb25zdDxUIGNvbnN0ICo+IHsgdHlwZWRlZiBUICogdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGVpX2NsZWFudHlwZSB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGVpX2NsZWFudHlwZTxjb25zdCBUPiAgIHsgdHlwZWRlZiB0eXBlbmFtZSBlaV9jbGVhbnR5cGU8VD46OnR5cGUgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBlaV9jbGVhbnR5cGU8Y29uc3QgVCY+ICB7IHR5cGVkZWYgdHlwZW5hbWUgZWlfY2xlYW50eXBlPFQ+Ojp0eXBlIHR5cGU7IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgZWlfY2xlYW50eXBlPFQmPiAgICAgICAgeyB0eXBlZGVmIHR5cGVuYW1lIGVpX2NsZWFudHlwZTxUPjo6dHlwZSB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGVpX2NsZWFudHlwZTxjb25zdCBUKj4gIHsgdHlwZWRlZiB0eXBlbmFtZSBlaV9jbGVhbnR5cGU8VD46OnR5cGUgdHlwZTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBlaV9jbGVhbnR5cGU8VCo+ICAgICAgICB7IHR5cGVkZWYgdHlwZW5hbWUgZWlfY2xlYW50eXBlPFQ+Ojp0eXBlIHR5cGU7IH07CisKKy8qKiBcaW50ZXJuYWwgSW4gc2hvcnQsIGl0IGNvbXB1dGVzIGludChzcXJ0KFxhIFkpKSB3aXRoIFxhIFkgYW4gaW50ZWdlci4KKyAgKiBVc2FnZSBleGFtcGxlOiBcY29kZSBlaV9tZXRhX3NxcnQ8MTAyMz46OnJldCBcZW5kY29kZQorICAqLwordGVtcGxhdGU8aW50IFksCisgICAgICAgICBpbnQgSW5mWCA9IDAsCisgICAgICAgICBpbnQgU3VwWCA9ICgoWT09MSkgPyAxIDogWS8yKSwKKyAgICAgICAgIGJvb2wgRG9uZSA9ICgoU3VwWC1JbmZYKTw9MSA/IHRydWUgOiAoKFN1cFgqU3VwWCA8PSBZKSAmJiAoKFN1cFgrMSkqKFN1cFgrMSkgPiBZKSkpID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlID86IGluc3RlYWQgb2YgfHwganVzdCB0byBzaHV0IHVwIGEgc3R1cGlkIGdjYyA0LjMgd2FybmluZworY2xhc3MgZWlfbWV0YV9zcXJ0Cit7CisgICAgZW51bSB7CisgICAgICBNaWRYID0gKEluZlgrU3VwWCkvMiwKKyAgICAgIFRha2VJbmYgPSBNaWRYKk1pZFggPiBZID8gMSA6IDAsCisgICAgICBOZXdJbmYgPSBpbnQoVGFrZUluZikgPyBJbmZYIDogaW50KE1pZFgpLAorICAgICAgTmV3U3VwID0gaW50KFRha2VJbmYpID8gaW50KE1pZFgpIDogU3VwWAorICAgIH07CisgIHB1YmxpYzoKKyAgICBlbnVtIHsgcmV0ID0gZWlfbWV0YV9zcXJ0PFksTmV3SW5mLE5ld1N1cD46OnJldCB9OworfTsKKwordGVtcGxhdGU8aW50IFksIGludCBJbmZYLCBpbnQgU3VwWD4KK2NsYXNzIGVpX21ldGFfc3FydDxZLCBJbmZYLCBTdXBYLCB0cnVlPiB7IHB1YmxpYzogIGVudW0geyByZXQgPSAoU3VwWCpTdXBYIDw9IFkpID8gU3VwWCA6IEluZlggfTsgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTjJfTUVUQV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9NaW5vci5oIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvTWlub3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2RlZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvTWlub3IuaApAQCAtMCwwICsxLDExNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUlOT1JfSAorI2RlZmluZSBFSUdFTl9NSU5PUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKioKKyAgKiBcY2xhc3MgTWlub3IKKyAgKgorICAqIFxicmllZiBFeHByZXNzaW9uIG9mIGEgbWlub3IKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaW4gd2hpY2ggd2UgYXJlIHRha2luZyBhIG1pbm9yCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBvZiBhIG1pbm9yLiBJdCBpcyB0aGUgcmV0dXJuCisgICogdHlwZSBvZiBNYXRyaXhCYXNlOjptaW5vcigpIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0CisgICogaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjptaW5vcigpCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IHRyYWl0czxNaW5vcjxNYXRyaXhUeXBlPiA+CisgOiB0cmFpdHM8TWF0cml4VHlwZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWQ8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSAhPSBEeW5hbWljKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSkgLSAxIDogRHluYW1pYywKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IChNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSAhPSBEeW5hbWljKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludChNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSkgLSAxIDogRHluYW1pYywKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IChNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSAhPSBEeW5hbWljKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSkgLSAxIDogRHluYW1pYywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IChNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSAhPSBEeW5hbWljKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSkgLSAxIDogRHluYW1pYywKKyAgICBGbGFncyA9IF9NYXRyaXhUeXBlTmVzdGVkOjpGbGFncyAmIChIZXJlZGl0YXJ5Qml0cyB8IEx2YWx1ZUJpdCksCisgICAgQ29lZmZSZWFkQ29zdCA9IF9NYXRyaXhUeXBlTmVzdGVkOjpDb2VmZlJlYWRDb3N0IC8vIG1pbm9yIGlzIHVzZWQgdHlwaWNhbGx5IG9uIHRpbnkgbWF0cmljZXMsCisgICAgICAvLyB3aGVyZSBsb29wcyBhcmUgdW5yb2xsZWQgYW5kIHRoZSAnaWYnIGV2YWx1YXRlcyBhdCBjb21waWxlIHRpbWUKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIE1pbm9yCisgIDogcHVibGljIE1hdHJpeEJhc2U8TWlub3I8TWF0cml4VHlwZT4gPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIE1hdHJpeEJhc2U8TWlub3I+IEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShNaW5vcikKKworICAgIGlubGluZSBNaW5vcihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IHJvdywgSW5kZXggY29sKQorICAgICAgOiBtX21hdHJpeChtYXRyaXgpLCBtX3Jvdyhyb3cpLCBtX2NvbChjb2wpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KHJvdyA+PSAwICYmIHJvdyA8IG1hdHJpeC5yb3dzKCkKKyAgICAgICAgICAmJiBjb2wgPj0gMCAmJiBjb2wgPCBtYXRyaXguY29scygpKTsKKyAgICB9CisKKyAgICBFSUdFTl9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1JTKE1pbm9yKQorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCkgLSAxOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCkgLSAxOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkuY29lZmZSZWYocm93ICsgKHJvdyA+PSBtX3JvdyksIGNvbCArIChjb2wgPj0gbV9jb2wpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBtX21hdHJpeC5jb2VmZihyb3cgKyAocm93ID49IG1fcm93KSwgY29sICsgKGNvbCA+PSBtX2NvbCkpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fbWF0cml4OworICAgIGNvbnN0IEluZGV4IG1fcm93LCBtX2NvbDsKK307CisKKy8qKgorICAqIFxyZXR1cm4gYW4gZXhwcmVzc2lvbiBvZiB0aGUgKFxhIHJvdywgXGEgY29sKS1taW5vciBvZiAqdGhpcywKKyAgKiBpLmUuIGFuIGV4cHJlc3Npb24gY29uc3RydWN0ZWQgZnJvbSAqdGhpcyBieSByZW1vdmluZyB0aGUgc3BlY2lmaWVkCisgICogcm93IGFuZCBjb2x1bW4uCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX21pbm9yLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfbWlub3Iub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgTWlub3IKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgTWlub3I8RGVyaXZlZD4KK01hdHJpeEJhc2U8RGVyaXZlZD46Om1pbm9yKEluZGV4IHJvdywgSW5kZXggY29sKQoreworICByZXR1cm4gTWlub3I8RGVyaXZlZD4oZGVyaXZlZCgpLCByb3csIGNvbCk7Cit9CisKKy8qKgorICAqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgbWlub3IoKS4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgTWlub3I8RGVyaXZlZD4KK01hdHJpeEJhc2U8RGVyaXZlZD46Om1pbm9yKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAoreworICByZXR1cm4gTWlub3I8RGVyaXZlZD4oZGVyaXZlZCgpLCByb3csIGNvbCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUlOT1JfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvUVIuaCBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L1FSLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0MmM5OAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L1FSLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU4yX1FSX0gKKyNkZWZpbmUgRUlHRU4yX1FSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBRUiA6IHB1YmxpYyBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBCYXNlOworICAgIHR5cGVkZWYgQmxvY2s8Y29uc3QgTWF0cml4VHlwZSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBNYXRyaXhSQmxvY2tUeXBlOworCisgICAgUVIoKSA6IEJhc2UoKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBleHBsaWNpdCBRUihjb25zdCBUJiB0KSA6IEJhc2UodCkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KKyAgICBib29sIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgYiwgUmVzdWx0VHlwZSAqcmVzdWx0KSBjb25zdAorICAgIHsKKyAgICAgICpyZXN1bHQgPSBzdGF0aWNfY2FzdDxjb25zdCBCYXNlKj4odGhpcyktPnNvbHZlKGIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgTWF0cml4VHlwZSBtYXRyaXhRKHZvaWQpIGNvbnN0IHsKKyAgICAgIE1hdHJpeFR5cGUgcmV0ID0gTWF0cml4VHlwZTo6SWRlbnRpdHkodGhpcy0+cm93cygpLCB0aGlzLT5jb2xzKCkpOworICAgICAgcmV0ID0gdGhpcy0+aG91c2Vob2xkZXJRKCkgKiByZXQ7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGJvb2wgaXNGdWxsUmFuaygpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBjb25zdCBUcmlhbmd1bGFyVmlldzxNYXRyaXhSQmxvY2tUeXBlLCBVcHBlclRyaWFuZ3VsYXI+CisgICAgbWF0cml4Uih2b2lkKSBjb25zdAorICAgIHsKKyAgICAgIGludCBjb2xzID0gdGhpcy0+Y29scygpOworICAgICAgcmV0dXJuIE1hdHJpeFJCbG9ja1R5cGUodGhpcy0+bWF0cml4UVIoKSwgMCwgMCwgY29scywgY29scykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXJUcmlhbmd1bGFyPigpOworICAgIH0KK307CisKKy8qKiBccmV0dXJuIHRoZSBRUiBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGNsYXNzIFFSCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgUVI8dHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3Q+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpxcigpIGNvbnN0Cit7CisgIHJldHVybiBRUjxQbGFpbk9iamVjdD4oZXZhbCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTjJfUVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvU1ZELmggYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9TVkQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDJlZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvU1ZELmgKQEAgLTAsMCArMSw2MzggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU4yX1NWRF9ICisjZGVmaW5lIEVJR0VOMl9TVkRfSAorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGluZ3JvdXAgU1ZEX01vZHVsZQorICAqIFxub25zdGFibGV5ZXQKKyAgKgorICAqIFxjbGFzcyBTVkQKKyAgKgorICAqIFxicmllZiBTdGFuZGFyZCBTVkQgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCBhbmQgYXNzb2NpYXRlZCBmZWF0dXJlcworICAqCisgICogXHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBTVkQgZGVjb21wb3NpdGlvbgorICAqCisgICogVGhpcyBjbGFzcyBwZXJmb3JtcyBhIHN0YW5kYXJkIFNWRCBkZWNvbXBvc2l0aW9uIG9mIGEgcmVhbCBtYXRyaXggQSBvZiBzaXplIFxjIE0geCBcYyBOCisgICogd2l0aCBcYyBNIFw+PSBcYyBOLgorICAqCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6U1ZEKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIFNWRAoreworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgICBlbnVtIHsKKyAgICAgIFBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplLAorICAgICAgQWxpZ25tZW50TWFzayA9IGludChQYWNrZXRTaXplKS0xLAorICAgICAgTWluU2l6ZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSkKKyAgICB9OworCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gQ29sVmVjdG9yOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIDE+IFJvd1ZlY3RvcjsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1pblNpemU+IE1hdHJpeFVUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBNYXRyaXhWVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1pblNpemUsIDE+IFNpbmd1bGFyVmFsdWVzVHlwZTsKKworICBwdWJsaWM6CisKKyAgICBTVkQoKSB7fSAvLyBhIHVzZXIgd2hvIHJlbGllZCBvbiBjb21waWxlci1nZW5lcmF0ZWQgZGVmYXVsdCBjb21waWxlciByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIE1TVkMgaW4gMi4wLjcKKyAgICAKKyAgICBTVkQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBtX21hdFUobWF0cml4LnJvd3MoKSwgKHN0ZDo6bWluKShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSksCisgICAgICAgIG1fbWF0VihtYXRyaXguY29scygpLG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX3NpZ21hKChzdGQ6Om1pbikobWF0cml4LnJvd3MoKSxtYXRyaXguY29scygpKSkKKyAgICB7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIGJvb2wgc29sdmUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZiLCBSZXN1bHRUeXBlKiByZXN1bHQpIGNvbnN0OworCisgICAgY29uc3QgTWF0cml4VVR5cGUmIG1hdHJpeFUoKSBjb25zdCB7IHJldHVybiBtX21hdFU7IH0KKyAgICBjb25zdCBTaW5ndWxhclZhbHVlc1R5cGUmIHNpbmd1bGFyVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV9zaWdtYTsgfQorICAgIGNvbnN0IE1hdHJpeFZUeXBlJiBtYXRyaXhWKCkgY29uc3QgeyByZXR1cm4gbV9tYXRWOyB9CisKKyAgICB2b2lkIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTsKKyAgICBTVkQmIHNvcnQoKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFVuaXRhcnlUeXBlLCB0eXBlbmFtZSBQb3NpdGl2ZVR5cGU+CisgICAgdm9pZCBjb21wdXRlVW5pdGFyeVBvc2l0aXZlKFVuaXRhcnlUeXBlICp1bml0YXJ5LCBQb3NpdGl2ZVR5cGUgKnBvc2l0aXZlKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQb3NpdGl2ZVR5cGUsIHR5cGVuYW1lIFVuaXRhcnlUeXBlPgorICAgIHZvaWQgY29tcHV0ZVBvc2l0aXZlVW5pdGFyeShQb3NpdGl2ZVR5cGUgKnBvc2l0aXZlLCBVbml0YXJ5VHlwZSAqdW5pdGFyeSkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25UeXBlLCB0eXBlbmFtZSBTY2FsaW5nVHlwZT4KKyAgICB2b2lkIGNvbXB1dGVSb3RhdGlvblNjYWxpbmcoUm90YXRpb25UeXBlICp1bml0YXJ5LCBTY2FsaW5nVHlwZSAqcG9zaXRpdmUpIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxpbmdUeXBlLCB0eXBlbmFtZSBSb3RhdGlvblR5cGU+CisgICAgdm9pZCBjb21wdXRlU2NhbGluZ1JvdGF0aW9uKFNjYWxpbmdUeXBlICpwb3NpdGl2ZSwgUm90YXRpb25UeXBlICp1bml0YXJ5KSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIE1hdHJpeFVUeXBlIG1fbWF0VTsKKyAgICAvKiogXGludGVybmFsICovCisgICAgTWF0cml4VlR5cGUgbV9tYXRWOworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBTaW5ndWxhclZhbHVlc1R5cGUgbV9zaWdtYTsKK307CisKKy8qKiBDb21wdXRlcyAvIHJlY29tcHV0ZXMgdGhlIFNWRCBkZWNvbXBvc2l0aW9uIEEgPSBVIFMgVl4qIG9mIFxhIG1hdHJpeAorICAqCisgICogXG5vdGUgdGhpcyBjb2RlIGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSBKQU1BIChwdWJsaWMgZG9tYWluKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgU1ZEPE1hdHJpeFR5cGU+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKK3sKKyAgY29uc3QgaW50IG0gPSBtYXRyaXgucm93cygpOworICBjb25zdCBpbnQgbiA9IG1hdHJpeC5jb2xzKCk7CisgIGNvbnN0IGludCBudSA9IChzdGQ6Om1pbikobSxuKTsKKyAgZWlfYXNzZXJ0KG0+PW4gJiYgIkluIEVpZ2VuIDIuMCwgU1ZEIG9ubHkgd29ya3MgZm9yIE14TiBtYXRyaWNlcyB3aXRoIE0+PU4uIFNvcnJ5ISIpOworICBlaV9hc3NlcnQobT4xICYmICJJbiBFaWdlbiAyLjAsIFNWRCBkb2Vzbid0IHdvcmsgb24gMXgxIG1hdHJpY2VzIik7CisKKyAgbV9tYXRVLnJlc2l6ZShtLCBudSk7CisgIG1fbWF0VS5zZXRaZXJvKCk7CisgIG1fc2lnbWEucmVzaXplKChzdGQ6Om1pbikobSxuKSk7CisgIG1fbWF0Vi5yZXNpemUobixuKTsKKworICBSb3dWZWN0b3IgZShuKTsKKyAgQ29sVmVjdG9yIHdvcmsobSk7CisgIE1hdHJpeFR5cGUgbWF0QShtYXRyaXgpOworICBjb25zdCBib29sIHdhbnR1ID0gdHJ1ZTsKKyAgY29uc3QgYm9vbCB3YW50diA9IHRydWU7CisgIGludCBpPTAsIGo9MCwgaz0wOworCisgIC8vIFJlZHVjZSBBIHRvIGJpZGlhZ29uYWwgZm9ybSwgc3RvcmluZyB0aGUgZGlhZ29uYWwgZWxlbWVudHMKKyAgLy8gaW4gcyBhbmQgdGhlIHN1cGVyLWRpYWdvbmFsIGVsZW1lbnRzIGluIGUuCisgIGludCBuY3QgPSAoc3RkOjptaW4pKG0tMSxuKTsKKyAgaW50IG5ydCA9IChzdGQ6Om1heCkoMCwoc3RkOjptaW4pKG4tMixtKSk7CisgIGZvciAoayA9IDA7IGsgPCAoc3RkOjptYXgpKG5jdCxucnQpOyArK2spCisgIHsKKyAgICBpZiAoayA8IG5jdCkKKyAgICB7CisgICAgICAvLyBDb21wdXRlIHRoZSB0cmFuc2Zvcm1hdGlvbiBmb3IgdGhlIGstdGggY29sdW1uIGFuZAorICAgICAgLy8gcGxhY2UgdGhlIGstdGggZGlhZ29uYWwgaW4gbV9zaWdtYVtrXS4KKyAgICAgIG1fc2lnbWFba10gPSBtYXRBLmNvbChrKS5lbmQobS1rKS5ub3JtKCk7CisgICAgICBpZiAobV9zaWdtYVtrXSAhPSAwLjApIC8vIEZJWE1FCisgICAgICB7CisgICAgICAgIGlmIChtYXRBKGssaykgPCAwLjApCisgICAgICAgICAgbV9zaWdtYVtrXSA9IC1tX3NpZ21hW2tdOworICAgICAgICBtYXRBLmNvbChrKS5lbmQobS1rKSAvPSBtX3NpZ21hW2tdOworICAgICAgICBtYXRBKGssaykgKz0gMS4wOworICAgICAgfQorICAgICAgbV9zaWdtYVtrXSA9IC1tX3NpZ21hW2tdOworICAgIH0KKworICAgIGZvciAoaiA9IGsrMTsgaiA8IG47ICsraikKKyAgICB7CisgICAgICBpZiAoKGsgPCBuY3QpICYmIChtX3NpZ21hW2tdICE9IDAuMCkpCisgICAgICB7CisgICAgICAgIC8vIEFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgU2NhbGFyIHQgPSBtYXRBLmNvbChrKS5lbmQobS1rKS5laWdlbjJfZG90KG1hdEEuY29sKGopLmVuZChtLWspKTsgLy8gRklYTUUgZG90IHByb2R1Y3Qgb3IgY3dpc2UgcHJvZCArIC5zdW0oKSA/PworICAgICAgICB0ID0gLXQvbWF0QShrLGspOworICAgICAgICBtYXRBLmNvbChqKS5lbmQobS1rKSArPSB0ICogbWF0QS5jb2woaykuZW5kKG0tayk7CisgICAgICB9CisKKyAgICAgIC8vIFBsYWNlIHRoZSBrLXRoIHJvdyBvZiBBIGludG8gZSBmb3IgdGhlCisgICAgICAvLyBzdWJzZXF1ZW50IGNhbGN1bGF0aW9uIG9mIHRoZSByb3cgdHJhbnNmb3JtYXRpb24uCisgICAgICBlW2pdID0gbWF0QShrLGopOworICAgIH0KKworICAgIC8vIFBsYWNlIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbiBVIGZvciBzdWJzZXF1ZW50IGJhY2sgbXVsdGlwbGljYXRpb24uCisgICAgaWYgKHdhbnR1ICYgKGsgPCBuY3QpKQorICAgICAgbV9tYXRVLmNvbChrKS5lbmQobS1rKSA9IG1hdEEuY29sKGspLmVuZChtLWspOworCisgICAgaWYgKGsgPCBucnQpCisgICAgeworICAgICAgLy8gQ29tcHV0ZSB0aGUgay10aCByb3cgdHJhbnNmb3JtYXRpb24gYW5kIHBsYWNlIHRoZQorICAgICAgLy8gay10aCBzdXBlci1kaWFnb25hbCBpbiBlW2tdLgorICAgICAgZVtrXSA9IGUuZW5kKG4tay0xKS5ub3JtKCk7CisgICAgICBpZiAoZVtrXSAhPSAwLjApCisgICAgICB7CisgICAgICAgICAgaWYgKGVbaysxXSA8IDAuMCkKKyAgICAgICAgICAgIGVba10gPSAtZVtrXTsKKyAgICAgICAgICBlLmVuZChuLWstMSkgLz0gZVtrXTsKKyAgICAgICAgICBlW2srMV0gKz0gMS4wOworICAgICAgfQorICAgICAgZVtrXSA9IC1lW2tdOworICAgICAgaWYgKChrKzEgPCBtKSAmIChlW2tdICE9IDAuMCkpCisgICAgICB7CisgICAgICAgIC8vIEFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgd29yay5lbmQobS1rLTEpID0gbWF0QS5jb3JuZXIoQm90dG9tUmlnaHQsbS1rLTEsbi1rLTEpICogZS5lbmQobi1rLTEpOworICAgICAgICBmb3IgKGogPSBrKzE7IGogPCBuOyArK2opCisgICAgICAgICAgbWF0QS5jb2woaikuZW5kKG0tay0xKSArPSAoLWVbal0vZVtrKzFdKSAqIHdvcmsuZW5kKG0tay0xKTsKKyAgICAgIH0KKworICAgICAgLy8gUGxhY2UgdGhlIHRyYW5zZm9ybWF0aW9uIGluIFYgZm9yIHN1YnNlcXVlbnQgYmFjayBtdWx0aXBsaWNhdGlvbi4KKyAgICAgIGlmICh3YW50dikKKyAgICAgICAgbV9tYXRWLmNvbChrKS5lbmQobi1rLTEpID0gZS5lbmQobi1rLTEpOworICAgIH0KKyAgfQorCisKKyAgLy8gU2V0IHVwIHRoZSBmaW5hbCBiaWRpYWdvbmFsIG1hdHJpeCBvciBvcmRlciBwLgorICBpbnQgcCA9IChzdGQ6Om1pbikobixtKzEpOworICBpZiAobmN0IDwgbikKKyAgICBtX3NpZ21hW25jdF0gPSBtYXRBKG5jdCxuY3QpOworICBpZiAobSA8IHApCisgICAgbV9zaWdtYVtwLTFdID0gMC4wOworICBpZiAobnJ0KzEgPCBwKQorICAgIGVbbnJ0XSA9IG1hdEEobnJ0LHAtMSk7CisgIGVbcC0xXSA9IDAuMDsKKworICAvLyBJZiByZXF1aXJlZCwgZ2VuZXJhdGUgVS4KKyAgaWYgKHdhbnR1KQorICB7CisgICAgZm9yIChqID0gbmN0OyBqIDwgbnU7ICsraikKKyAgICB7CisgICAgICBtX21hdFUuY29sKGopLnNldFplcm8oKTsKKyAgICAgIG1fbWF0VShqLGopID0gMS4wOworICAgIH0KKyAgICBmb3IgKGsgPSBuY3QtMTsgayA+PSAwOyBrLS0pCisgICAgeworICAgICAgaWYgKG1fc2lnbWFba10gIT0gMC4wKQorICAgICAgeworICAgICAgICBmb3IgKGogPSBrKzE7IGogPCBudTsgKytqKQorICAgICAgICB7CisgICAgICAgICAgU2NhbGFyIHQgPSBtX21hdFUuY29sKGspLmVuZChtLWspLmVpZ2VuMl9kb3QobV9tYXRVLmNvbChqKS5lbmQobS1rKSk7IC8vIEZJWE1FIGlzIGl0IHJlYWxseSBhIGRvdCBwcm9kdWN0IHdlIHdhbnQgPworICAgICAgICAgIHQgPSAtdC9tX21hdFUoayxrKTsKKyAgICAgICAgICBtX21hdFUuY29sKGopLmVuZChtLWspICs9IHQgKiBtX21hdFUuY29sKGspLmVuZChtLWspOworICAgICAgICB9CisgICAgICAgIG1fbWF0VS5jb2woaykuZW5kKG0taykgPSAtIG1fbWF0VS5jb2woaykuZW5kKG0tayk7CisgICAgICAgIG1fbWF0VShrLGspID0gU2NhbGFyKDEpICsgbV9tYXRVKGssayk7CisgICAgICAgIGlmIChrLTE+MCkKKyAgICAgICAgICBtX21hdFUuY29sKGspLnN0YXJ0KGstMSkuc2V0WmVybygpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtX21hdFUuY29sKGspLnNldFplcm8oKTsKKyAgICAgICAgbV9tYXRVKGssaykgPSAxLjA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gSWYgcmVxdWlyZWQsIGdlbmVyYXRlIFYuCisgIGlmICh3YW50dikKKyAgeworICAgIGZvciAoayA9IG4tMTsgayA+PSAwOyBrLS0pCisgICAgeworICAgICAgaWYgKChrIDwgbnJ0KSAmIChlW2tdICE9IDAuMCkpCisgICAgICB7CisgICAgICAgIGZvciAoaiA9IGsrMTsgaiA8IG51OyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBTY2FsYXIgdCA9IG1fbWF0Vi5jb2woaykuZW5kKG4tay0xKS5laWdlbjJfZG90KG1fbWF0Vi5jb2woaikuZW5kKG4tay0xKSk7IC8vIEZJWE1FIGlzIGl0IHJlYWxseSBhIGRvdCBwcm9kdWN0IHdlIHdhbnQgPworICAgICAgICAgIHQgPSAtdC9tX21hdFYoaysxLGspOworICAgICAgICAgIG1fbWF0Vi5jb2woaikuZW5kKG4tay0xKSArPSB0ICogbV9tYXRWLmNvbChrKS5lbmQobi1rLTEpOworICAgICAgICB9CisgICAgICB9CisgICAgICBtX21hdFYuY29sKGspLnNldFplcm8oKTsKKyAgICAgIG1fbWF0VihrLGspID0gMS4wOworICAgIH0KKyAgfQorCisgIC8vIE1haW4gaXRlcmF0aW9uIGxvb3AgZm9yIHRoZSBzaW5ndWxhciB2YWx1ZXMuCisgIGludCBwcCA9IHAtMTsKKyAgaW50IGl0ZXIgPSAwOworICBTY2FsYXIgZXBzID0gZWlfcG93KFNjYWxhcigyKSxlaV9pc19zYW1lX3R5cGU8U2NhbGFyLGZsb2F0Pjo6cmV0ID8gU2NhbGFyKC0yMykgOiBTY2FsYXIoLTUyKSk7CisgIHdoaWxlIChwID4gMCkKKyAgeworICAgIGludCBrPTA7CisgICAgaW50IGthc2U9MDsKKworICAgIC8vIEhlcmUgaXMgd2hlcmUgYSB0ZXN0IGZvciB0b28gbWFueSBpdGVyYXRpb25zIHdvdWxkIGdvLgorCisgICAgLy8gVGhpcyBzZWN0aW9uIG9mIHRoZSBwcm9ncmFtIGluc3BlY3RzIGZvcgorICAgIC8vIG5lZ2xpZ2libGUgZWxlbWVudHMgaW4gdGhlIHMgYW5kIGUgYXJyYXlzLiAgT24KKyAgICAvLyBjb21wbGV0aW9uIHRoZSB2YXJpYWJsZXMga2FzZSBhbmQgayBhcmUgc2V0IGFzIGZvbGxvd3MuCisKKyAgICAvLyBrYXNlID0gMSAgICAgaWYgcyhwKSBhbmQgZVtrLTFdIGFyZSBuZWdsaWdpYmxlIGFuZCBrPHAKKyAgICAvLyBrYXNlID0gMiAgICAgaWYgcyhrKSBpcyBuZWdsaWdpYmxlIGFuZCBrPHAKKyAgICAvLyBrYXNlID0gMyAgICAgaWYgZVtrLTFdIGlzIG5lZ2xpZ2libGUsIGs8cCwgYW5kCisgICAgLy8gICAgICAgICAgICAgIHMoayksIC4uLiwgcyhwKSBhcmUgbm90IG5lZ2xpZ2libGUgKHFyIHN0ZXApLgorICAgIC8vIGthc2UgPSA0ICAgICBpZiBlKHAtMSkgaXMgbmVnbGlnaWJsZSAoY29udmVyZ2VuY2UpLgorCisgICAgZm9yIChrID0gcC0yOyBrID49IC0xOyAtLWspCisgICAgeworICAgICAgaWYgKGsgPT0gLTEpCisgICAgICAgICAgYnJlYWs7CisgICAgICBpZiAoZWlfYWJzKGVba10pIDw9IGVwcyooZWlfYWJzKG1fc2lnbWFba10pICsgZWlfYWJzKG1fc2lnbWFbaysxXSkpKQorICAgICAgeworICAgICAgICAgIGVba10gPSAwLjA7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChrID09IHAtMikKKyAgICB7CisgICAgICBrYXNlID0gNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGludCBrczsKKyAgICAgIGZvciAoa3MgPSBwLTE7IGtzID49IGs7IC0ta3MpCisgICAgICB7CisgICAgICAgIGlmIChrcyA9PSBrKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBTY2FsYXIgdCA9IChrcyAhPSBwID8gZWlfYWJzKGVba3NdKSA6IFNjYWxhcigwKSkgKyAoa3MgIT0gaysxID8gZWlfYWJzKGVba3MtMV0pIDogU2NhbGFyKDApKTsKKyAgICAgICAgaWYgKGVpX2FicyhtX3NpZ21hW2tzXSkgPD0gZXBzKnQpCisgICAgICAgIHsKKyAgICAgICAgICBtX3NpZ21hW2tzXSA9IDAuMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGtzID09IGspCisgICAgICB7CisgICAgICAgIGthc2UgPSAzOworICAgICAgfQorICAgICAgZWxzZSBpZiAoa3MgPT0gcC0xKQorICAgICAgeworICAgICAgICBrYXNlID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAga2FzZSA9IDI7CisgICAgICAgIGsgPSBrczsKKyAgICAgIH0KKyAgICB9CisgICAgKytrOworCisgICAgLy8gUGVyZm9ybSB0aGUgdGFzayBpbmRpY2F0ZWQgYnkga2FzZS4KKyAgICBzd2l0Y2ggKGthc2UpCisgICAgeworCisgICAgICAvLyBEZWZsYXRlIG5lZ2xpZ2libGUgcyhwKS4KKyAgICAgIGNhc2UgMToKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyIGYoZVtwLTJdKTsKKyAgICAgICAgZVtwLTJdID0gMC4wOworICAgICAgICBmb3IgKGogPSBwLTI7IGogPj0gazsgLS1qKQorICAgICAgICB7CisgICAgICAgICAgU2NhbGFyIHQoaW50ZXJuYWw6Omh5cG90KG1fc2lnbWFbal0sZikpOworICAgICAgICAgIFNjYWxhciBjcyhtX3NpZ21hW2pdL3QpOworICAgICAgICAgIFNjYWxhciBzbihmL3QpOworICAgICAgICAgIG1fc2lnbWFbal0gPSB0OworICAgICAgICAgIGlmIChqICE9IGspCisgICAgICAgICAgeworICAgICAgICAgICAgZiA9IC1zbiplW2otMV07CisgICAgICAgICAgICBlW2otMV0gPSBjcyplW2otMV07CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh3YW50dikKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0ID0gY3MqbV9tYXRWKGksaikgKyBzbiptX21hdFYoaSxwLTEpOworICAgICAgICAgICAgICBtX21hdFYoaSxwLTEpID0gLXNuKm1fbWF0VihpLGopICsgY3MqbV9tYXRWKGkscC0xKTsKKyAgICAgICAgICAgICAgbV9tYXRWKGksaikgPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8vIFNwbGl0IGF0IG5lZ2xpZ2libGUgcyhrKS4KKyAgICAgIGNhc2UgMjoKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyIGYoZVtrLTFdKTsKKyAgICAgICAgZVtrLTFdID0gMC4wOworICAgICAgICBmb3IgKGogPSBrOyBqIDwgcDsgKytqKQorICAgICAgICB7CisgICAgICAgICAgU2NhbGFyIHQoaW50ZXJuYWw6Omh5cG90KG1fc2lnbWFbal0sZikpOworICAgICAgICAgIFNjYWxhciBjcyggbV9zaWdtYVtqXS90KTsKKyAgICAgICAgICBTY2FsYXIgc24oZi90KTsKKyAgICAgICAgICBtX3NpZ21hW2pdID0gdDsKKyAgICAgICAgICBmID0gLXNuKmVbal07CisgICAgICAgICAgZVtqXSA9IGNzKmVbal07CisgICAgICAgICAgaWYgKHdhbnR1KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHQgPSBjcyptX21hdFUoaSxqKSArIHNuKm1fbWF0VShpLGstMSk7CisgICAgICAgICAgICAgIG1fbWF0VShpLGstMSkgPSAtc24qbV9tYXRVKGksaikgKyBjcyptX21hdFUoaSxrLTEpOworICAgICAgICAgICAgICBtX21hdFUoaSxqKSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgICAgLy8gUGVyZm9ybSBvbmUgcXIgc3RlcC4KKyAgICAgIGNhc2UgMzoKKyAgICAgIHsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzaGlmdC4KKyAgICAgICAgU2NhbGFyIHNjYWxlID0gKHN0ZDo6bWF4KSgoc3RkOjptYXgpKChzdGQ6Om1heCkoKHN0ZDo6bWF4KSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGVpX2FicyhtX3NpZ21hW3AtMV0pLGVpX2FicyhtX3NpZ21hW3AtMl0pKSxlaV9hYnMoZVtwLTJdKSksCisgICAgICAgICAgICAgICAgICAgICAgICBlaV9hYnMobV9zaWdtYVtrXSkpLGVpX2FicyhlW2tdKSk7CisgICAgICAgIFNjYWxhciBzcCA9IG1fc2lnbWFbcC0xXS9zY2FsZTsKKyAgICAgICAgU2NhbGFyIHNwbTEgPSBtX3NpZ21hW3AtMl0vc2NhbGU7CisgICAgICAgIFNjYWxhciBlcG0xID0gZVtwLTJdL3NjYWxlOworICAgICAgICBTY2FsYXIgc2sgPSBtX3NpZ21hW2tdL3NjYWxlOworICAgICAgICBTY2FsYXIgZWsgPSBlW2tdL3NjYWxlOworICAgICAgICBTY2FsYXIgYiA9ICgoc3BtMSArIHNwKSooc3BtMSAtIHNwKSArIGVwbTEqZXBtMSkvU2NhbGFyKDIpOworICAgICAgICBTY2FsYXIgYyA9IChzcCplcG0xKSooc3AqZXBtMSk7CisgICAgICAgIFNjYWxhciBzaGlmdCgwKTsKKyAgICAgICAgaWYgKChiICE9IDAuMCkgfHwgKGMgIT0gMC4wKSkKKyAgICAgICAgeworICAgICAgICAgIHNoaWZ0ID0gZWlfc3FydChiKmIgKyBjKTsKKyAgICAgICAgICBpZiAoYiA8IDAuMCkKKyAgICAgICAgICAgIHNoaWZ0ID0gLXNoaWZ0OworICAgICAgICAgIHNoaWZ0ID0gYy8oYiArIHNoaWZ0KTsKKyAgICAgICAgfQorICAgICAgICBTY2FsYXIgZiA9IChzayArIHNwKSooc2sgLSBzcCkgKyBzaGlmdDsKKyAgICAgICAgU2NhbGFyIGcgPSBzayplazsKKworICAgICAgICAvLyBDaGFzZSB6ZXJvcy4KKworICAgICAgICBmb3IgKGogPSBrOyBqIDwgcC0xOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBTY2FsYXIgdCA9IGludGVybmFsOjpoeXBvdChmLGcpOworICAgICAgICAgIFNjYWxhciBjcyA9IGYvdDsKKyAgICAgICAgICBTY2FsYXIgc24gPSBnL3Q7CisgICAgICAgICAgaWYgKGogIT0gaykKKyAgICAgICAgICAgIGVbai0xXSA9IHQ7CisgICAgICAgICAgZiA9IGNzKm1fc2lnbWFbal0gKyBzbiplW2pdOworICAgICAgICAgIGVbal0gPSBjcyplW2pdIC0gc24qbV9zaWdtYVtqXTsKKyAgICAgICAgICBnID0gc24qbV9zaWdtYVtqKzFdOworICAgICAgICAgIG1fc2lnbWFbaisxXSA9IGNzKm1fc2lnbWFbaisxXTsKKyAgICAgICAgICBpZiAod2FudHYpCisgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdCA9IGNzKm1fbWF0VihpLGopICsgc24qbV9tYXRWKGksaisxKTsKKyAgICAgICAgICAgICAgbV9tYXRWKGksaisxKSA9IC1zbiptX21hdFYoaSxqKSArIGNzKm1fbWF0VihpLGorMSk7CisgICAgICAgICAgICAgIG1fbWF0VihpLGopID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgdCA9IGludGVybmFsOjpoeXBvdChmLGcpOworICAgICAgICAgIGNzID0gZi90OworICAgICAgICAgIHNuID0gZy90OworICAgICAgICAgIG1fc2lnbWFbal0gPSB0OworICAgICAgICAgIGYgPSBjcyplW2pdICsgc24qbV9zaWdtYVtqKzFdOworICAgICAgICAgIG1fc2lnbWFbaisxXSA9IC1zbiplW2pdICsgY3MqbV9zaWdtYVtqKzFdOworICAgICAgICAgIGcgPSBzbiplW2orMV07CisgICAgICAgICAgZVtqKzFdID0gY3MqZVtqKzFdOworICAgICAgICAgIGlmICh3YW50dSAmJiAoaiA8IG0tMSkpCisgICAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdCA9IGNzKm1fbWF0VShpLGopICsgc24qbV9tYXRVKGksaisxKTsKKyAgICAgICAgICAgICAgbV9tYXRVKGksaisxKSA9IC1zbiptX21hdFUoaSxqKSArIGNzKm1fbWF0VShpLGorMSk7CisgICAgICAgICAgICAgIG1fbWF0VShpLGopID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZVtwLTJdID0gZjsKKyAgICAgICAgaXRlciA9IGl0ZXIgKyAxOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8vIENvbnZlcmdlbmNlLgorICAgICAgY2FzZSA0OgorICAgICAgeworICAgICAgICAvLyBNYWtlIHRoZSBzaW5ndWxhciB2YWx1ZXMgcG9zaXRpdmUuCisgICAgICAgIGlmIChtX3NpZ21hW2tdIDw9IDAuMCkKKyAgICAgICAgeworICAgICAgICAgIG1fc2lnbWFba10gPSBtX3NpZ21hW2tdIDwgU2NhbGFyKDApID8gLW1fc2lnbWFba10gOiBTY2FsYXIoMCk7CisgICAgICAgICAgaWYgKHdhbnR2KQorICAgICAgICAgICAgbV9tYXRWLmNvbChrKS5zdGFydChwcCsxKSA9IC1tX21hdFYuY29sKGspLnN0YXJ0KHBwKzEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3JkZXIgdGhlIHNpbmd1bGFyIHZhbHVlcy4KKyAgICAgICAgd2hpbGUgKGsgPCBwcCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChtX3NpZ21hW2tdID49IG1fc2lnbWFbaysxXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIFNjYWxhciB0ID0gbV9zaWdtYVtrXTsKKyAgICAgICAgICBtX3NpZ21hW2tdID0gbV9zaWdtYVtrKzFdOworICAgICAgICAgIG1fc2lnbWFbaysxXSA9IHQ7CisgICAgICAgICAgaWYgKHdhbnR2ICYmIChrIDwgbi0xKSkKKyAgICAgICAgICAgIG1fbWF0Vi5jb2woaykuc3dhcChtX21hdFYuY29sKGsrMSkpOworICAgICAgICAgIGlmICh3YW50dSAmJiAoayA8IG0tMSkpCisgICAgICAgICAgICBtX21hdFUuY29sKGspLnN3YXAobV9tYXRVLmNvbChrKzEpKTsKKyAgICAgICAgICArK2s7CisgICAgICAgIH0KKyAgICAgICAgaXRlciA9IDA7CisgICAgICAgIHAtLTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0gLy8gZW5kIGJpZyBzd2l0Y2gKKyAgfSAvLyBlbmQgaXRlcmF0aW9ucworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorU1ZEPE1hdHJpeFR5cGU+JiBTVkQ8TWF0cml4VHlwZT46OnNvcnQoKQoreworICBpbnQgbXUgPSBtX21hdFUucm93cygpOworICBpbnQgbXYgPSBtX21hdFYucm93cygpOworICBpbnQgbiAgPSBtX21hdFUuY29scygpOworCisgIGZvciAoaW50IGk9MDsgaTxuOyArK2kpCisgIHsKKyAgICBpbnQgIGsgPSBpOworICAgIFNjYWxhciBwID0gbV9zaWdtYS5jb2VmZihpKTsKKworICAgIGZvciAoaW50IGo9aSsxOyBqPG47ICsraikKKyAgICB7CisgICAgICBpZiAobV9zaWdtYS5jb2VmZihqKSA+IHApCisgICAgICB7CisgICAgICAgIGsgPSBqOworICAgICAgICBwID0gbV9zaWdtYS5jb2VmZihqKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGsgIT0gaSkKKyAgICB7CisgICAgICBtX3NpZ21hLmNvZWZmUmVmKGspID0gbV9zaWdtYS5jb2VmZihpKTsgIC8vIGkuZS4KKyAgICAgIG1fc2lnbWEuY29lZmZSZWYoaSkgPSBwOyAgICAgICAgICAgICAgICAgLy8gc3dhcHMgdGhlIGktdGggYW5kIHRoZSBrLXRoIGVsZW1lbnRzCisKKyAgICAgIGludCBqID0gbXU7CisgICAgICBmb3IoaW50IHM9MDsgaiE9MDsgKytzLCAtLWopCisgICAgICAgIHN0ZDo6c3dhcChtX21hdFUuY29lZmZSZWYocyxpKSwgbV9tYXRVLmNvZWZmUmVmKHMsaykpOworCisgICAgICBqID0gbXY7CisgICAgICBmb3IgKGludCBzPTA7IGohPTA7ICsrcywgLS1qKQorICAgICAgICBzdGQ6OnN3YXAobV9tYXRWLmNvZWZmUmVmKHMsaSksIG1fbWF0Vi5jb2VmZlJlZihzLGspKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogXHJldHVybnMgdGhlIHNvbHV0aW9uIG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBTVkQgZGVjb21wb3NpdGlvbiBvZiBBLgorICAqIFRoZSBwYXJ0cyBvZiB0aGUgc29sdXRpb24gY29ycmVzcG9uZGluZyB0byB6ZXJvIHNpbmd1bGFyIHZhbHVlcyBhcmUgaWdub3JlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpzdmQoKSwgTFU6OnNvbHZlKCksIExMVDo6c29sdmUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK2Jvb2wgU1ZEPE1hdHJpeFR5cGU+Ojpzb2x2ZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJmIsIFJlc3VsdFR5cGUqIHJlc3VsdCkgY29uc3QKK3sKKyAgY29uc3QgaW50IHJvd3MgPSBtX21hdFUucm93cygpOworICBlaV9hc3NlcnQoYi5yb3dzKCkgPT0gcm93cyk7CisKKyAgU2NhbGFyIG1heFZhbCA9IG1fc2lnbWEuY3dpc2UoKS5hYnMoKS5tYXhDb2VmZigpOworICBmb3IgKGludCBqPTA7IGo8Yi5jb2xzKCk7ICsraikKKyAgeworICAgIE1hdHJpeDxTY2FsYXIsTWF0cml4VVR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLDE+IGF1eCA9IG1fbWF0VS50cmFuc3Bvc2UoKSAqIGIuY29sKGopOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPG1fbWF0VS5jb2xzKCk7ICsraSkKKyAgICB7CisgICAgICBTY2FsYXIgc2kgPSBtX3NpZ21hLmNvZWZmKGkpOworICAgICAgaWYgKGVpX2lzTXVjaFNtYWxsZXJUaGFuKGVpX2FicyhzaSksbWF4VmFsKSkKKyAgICAgICAgYXV4LmNvZWZmUmVmKGkpID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgYXV4LmNvZWZmUmVmKGkpIC89IHNpOworICAgIH0KKworICAgIHJlc3VsdC0+Y29sKGopID0gbV9tYXRWICogYXV4OworICB9CisgIHJldHVybiB0cnVlOworfQorCisvKiogQ29tcHV0ZXMgdGhlIHBvbGFyIGRlY29tcG9zaXRpb24gb2YgdGhlIG1hdHJpeCwgYXMgYSBwcm9kdWN0IHVuaXRhcnkgeCBwb3NpdGl2ZS4KKyAgKgorICAqIElmIGVpdGhlciBwb2ludGVyIGlzIHplcm8sIHRoZSBjb3JyZXNwb25kaW5nIGNvbXB1dGF0aW9uIGlzIHNraXBwZWQuCisgICoKKyAgKiBPbmx5IGZvciBzcXVhcmUgbWF0cmljZXMuCisgICoKKyAgKiBcc2EgY29tcHV0ZVBvc2l0aXZlVW5pdGFyeSgpLCBjb21wdXRlUm90YXRpb25TY2FsaW5nKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBVbml0YXJ5VHlwZSwgdHlwZW5hbWUgUG9zaXRpdmVUeXBlPgordm9pZCBTVkQ8TWF0cml4VHlwZT46OmNvbXB1dGVVbml0YXJ5UG9zaXRpdmUoVW5pdGFyeVR5cGUgKnVuaXRhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGl2ZVR5cGUgKnBvc2l0aXZlKSBjb25zdAoreworICBlaV9hc3NlcnQobV9tYXRVLmNvbHMoKSA9PSBtX21hdFYuY29scygpICYmICJQb2xhciBkZWNvbXBvc2l0aW9uIGlzIG9ubHkgZm9yIHNxdWFyZSBtYXRyaWNlcyIpOworICBpZih1bml0YXJ5KSAqdW5pdGFyeSA9IG1fbWF0VSAqIG1fbWF0Vi5hZGpvaW50KCk7CisgIGlmKHBvc2l0aXZlKSAqcG9zaXRpdmUgPSBtX21hdFYgKiBtX3NpZ21hLmFzRGlhZ29uYWwoKSAqIG1fbWF0Vi5hZGpvaW50KCk7Cit9CisKKy8qKiBDb21wdXRlcyB0aGUgcG9sYXIgZGVjb21wb3NpdGlvbiBvZiB0aGUgbWF0cml4LCBhcyBhIHByb2R1Y3QgcG9zaXRpdmUgeCB1bml0YXJ5LgorICAqCisgICogSWYgZWl0aGVyIHBvaW50ZXIgaXMgemVybywgdGhlIGNvcnJlc3BvbmRpbmcgY29tcHV0YXRpb24gaXMgc2tpcHBlZC4KKyAgKgorICAqIE9ubHkgZm9yIHNxdWFyZSBtYXRyaWNlcy4KKyAgKgorICAqIFxzYSBjb21wdXRlVW5pdGFyeVBvc2l0aXZlKCksIGNvbXB1dGVSb3RhdGlvblNjYWxpbmcoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlPHR5cGVuYW1lIFVuaXRhcnlUeXBlLCB0eXBlbmFtZSBQb3NpdGl2ZVR5cGU+Cit2b2lkIFNWRDxNYXRyaXhUeXBlPjo6Y29tcHV0ZVBvc2l0aXZlVW5pdGFyeShVbml0YXJ5VHlwZSAqcG9zaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGl2ZVR5cGUgKnVuaXRhcnkpIGNvbnN0Cit7CisgIGVpX2Fzc2VydChtX21hdFUucm93cygpID09IG1fbWF0Vi5yb3dzKCkgJiYgIlBvbGFyIGRlY29tcG9zaXRpb24gaXMgb25seSBmb3Igc3F1YXJlIG1hdHJpY2VzIik7CisgIGlmKHVuaXRhcnkpICp1bml0YXJ5ID0gbV9tYXRVICogbV9tYXRWLmFkam9pbnQoKTsKKyAgaWYocG9zaXRpdmUpICpwb3NpdGl2ZSA9IG1fbWF0VSAqIG1fc2lnbWEuYXNEaWFnb25hbCgpICogbV9tYXRVLmFkam9pbnQoKTsKK30KKworLyoqIGRlY29tcG9zZXMgdGhlIG1hdHJpeCBhcyBhIHByb2R1Y3Qgcm90YXRpb24geCBzY2FsaW5nLCB0aGUgc2NhbGluZyBiZWluZworICAqIG5vdCBuZWNlc3NhcmlseSBwb3NpdGl2ZS4KKyAgKgorICAqIElmIGVpdGhlciBwb2ludGVyIGlzIHplcm8sIHRoZSBjb3JyZXNwb25kaW5nIGNvbXB1dGF0aW9uIGlzIHNraXBwZWQuCisgICoKKyAgKiBUaGlzIG1ldGhvZCByZXF1aXJlcyB0aGUgR2VvbWV0cnkgbW9kdWxlLgorICAqCisgICogXHNhIGNvbXB1dGVTY2FsaW5nUm90YXRpb24oKSwgY29tcHV0ZVVuaXRhcnlQb3NpdGl2ZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25UeXBlLCB0eXBlbmFtZSBTY2FsaW5nVHlwZT4KK3ZvaWQgU1ZEPE1hdHJpeFR5cGU+Ojpjb21wdXRlUm90YXRpb25TY2FsaW5nKFJvdGF0aW9uVHlwZSAqcm90YXRpb24sIFNjYWxpbmdUeXBlICpzY2FsaW5nKSBjb25zdAoreworICBlaV9hc3NlcnQobV9tYXRVLnJvd3MoKSA9PSBtX21hdFYucm93cygpICYmICJQb2xhciBkZWNvbXBvc2l0aW9uIGlzIG9ubHkgZm9yIHNxdWFyZSBtYXRyaWNlcyIpOworICBTY2FsYXIgeCA9IChtX21hdFUgKiBtX21hdFYuYWRqb2ludCgpKS5kZXRlcm1pbmFudCgpOyAvLyBzbyB4IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxCisgIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBzdihtX3NpZ21hKTsKKyAgc3YuY29lZmZSZWYoMCkgKj0geDsKKyAgaWYoc2NhbGluZykgc2NhbGluZy0+bGF6eUFzc2lnbihtX21hdFYgKiBzdi5hc0RpYWdvbmFsKCkgKiBtX21hdFYuYWRqb2ludCgpKTsKKyAgaWYocm90YXRpb24pCisgIHsKKyAgICBNYXRyaXhUeXBlIG0obV9tYXRVKTsKKyAgICBtLmNvbCgwKSAvPSB4OworICAgIHJvdGF0aW9uLT5sYXp5QXNzaWduKG0gKiBtX21hdFYuYWRqb2ludCgpKTsKKyAgfQorfQorCisvKiogZGVjb21wb3NlcyB0aGUgbWF0cml4IGFzIGEgcHJvZHVjdCBzY2FsaW5nIHggcm90YXRpb24sIHRoZSBzY2FsaW5nIGJlaW5nCisgICogbm90IG5lY2Vzc2FyaWx5IHBvc2l0aXZlLgorICAqCisgICogSWYgZWl0aGVyIHBvaW50ZXIgaXMgemVybywgdGhlIGNvcnJlc3BvbmRpbmcgY29tcHV0YXRpb24gaXMgc2tpcHBlZC4KKyAgKgorICAqIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoZSBHZW9tZXRyeSBtb2R1bGUuCisgICoKKyAgKiBcc2EgY29tcHV0ZVJvdGF0aW9uU2NhbGluZygpLCBjb21wdXRlVW5pdGFyeVBvc2l0aXZlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsaW5nVHlwZSwgdHlwZW5hbWUgUm90YXRpb25UeXBlPgordm9pZCBTVkQ8TWF0cml4VHlwZT46OmNvbXB1dGVTY2FsaW5nUm90YXRpb24oU2NhbGluZ1R5cGUgKnNjYWxpbmcsIFJvdGF0aW9uVHlwZSAqcm90YXRpb24pIGNvbnN0Cit7CisgIGVpX2Fzc2VydChtX21hdFUucm93cygpID09IG1fbWF0Vi5yb3dzKCkgJiYgIlBvbGFyIGRlY29tcG9zaXRpb24gaXMgb25seSBmb3Igc3F1YXJlIG1hdHJpY2VzIik7CisgIFNjYWxhciB4ID0gKG1fbWF0VSAqIG1fbWF0Vi5hZGpvaW50KCkpLmRldGVybWluYW50KCk7IC8vIHNvIHggaGFzIGFic29sdXRlIHZhbHVlIDEKKyAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IHN2KG1fc2lnbWEpOworICBzdi5jb2VmZlJlZigwKSAqPSB4OworICBpZihzY2FsaW5nKSBzY2FsaW5nLT5sYXp5QXNzaWduKG1fbWF0VSAqIHN2LmFzRGlhZ29uYWwoKSAqIG1fbWF0VS5hZGpvaW50KCkpOworICBpZihyb3RhdGlvbikKKyAgeworICAgIE1hdHJpeFR5cGUgbShtX21hdFUpOworICAgIG0uY29sKDApIC89IHg7CisgICAgcm90YXRpb24tPmxhenlBc3NpZ24obSAqIG1fbWF0Vi5hZGpvaW50KCkpOworICB9Cit9CisKKworLyoqIFxzdmRfbW9kdWxlCisgICogXHJldHVybnMgdGhlIFNWRCBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIFNWRDx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OnN2ZCgpIGNvbnN0Cit7CisgIHJldHVybiBTVkQ8UGxhaW5PYmplY3Q+KGRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU4yX1NWRF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9Ucmlhbmd1bGFyU29sdmVyLmggYi9FaWdlbi9zcmMvRWlnZW4yU3VwcG9ydC9Ucmlhbmd1bGFyU29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiZWIzYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L1RyaWFuZ3VsYXJTb2x2ZXIuaApAQCAtMCwwICsxLDQyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVFJJQU5HVUxBUl9TT0xWRVIyX0gKKyNkZWZpbmUgRUlHRU5fVFJJQU5HVUxBUl9TT0xWRVIyX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK2NvbnN0IHVuc2lnbmVkIGludCBVbml0RGlhZ0JpdCA9IFVuaXREaWFnOworY29uc3QgdW5zaWduZWQgaW50IFNlbGZBZGpvaW50Qml0ID0gU2VsZkFkam9pbnQ7Citjb25zdCB1bnNpZ25lZCBpbnQgVXBwZXJUcmlhbmd1bGFyQml0ID0gVXBwZXI7Citjb25zdCB1bnNpZ25lZCBpbnQgTG93ZXJUcmlhbmd1bGFyQml0ID0gTG93ZXI7CisKK2NvbnN0IHVuc2lnbmVkIGludCBVcHBlclRyaWFuZ3VsYXIgPSBVcHBlcjsKK2NvbnN0IHVuc2lnbmVkIGludCBMb3dlclRyaWFuZ3VsYXIgPSBMb3dlcjsKK2NvbnN0IHVuc2lnbmVkIGludCBVbml0VXBwZXJUcmlhbmd1bGFyID0gVW5pdFVwcGVyOworY29uc3QgdW5zaWduZWQgaW50IFVuaXRMb3dlclRyaWFuZ3VsYXIgPSBVbml0TG93ZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB1bnNpZ25lZCBpbnQgQWRkZWQsIHVuc2lnbmVkIGludCBSZW1vdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordHlwZW5hbWUgRXhwcmVzc2lvblR5cGU6OlBsYWluT2JqZWN0CitGbGFnZ2VkPEV4cHJlc3Npb25UeXBlLEFkZGVkLFJlbW92ZWQ+Ojpzb2x2ZVRyaWFuZ3VsYXIoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIG1fbWF0cml4LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEFkZGVkPigpLnNvbHZlKG90aGVyLmRlcml2ZWQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCB1bnNpZ25lZCBpbnQgQWRkZWQsIHVuc2lnbmVkIGludCBSZW1vdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBGbGFnZ2VkPEV4cHJlc3Npb25UeXBlLEFkZGVkLFJlbW92ZWQ+Ojpzb2x2ZVRyaWFuZ3VsYXJJblBsYWNlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIG1fbWF0cml4LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEFkZGVkPigpLnNvbHZlSW5QbGFjZShvdGhlci5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKyAgICAKKyNlbmRpZiAvLyBFSUdFTl9UUklBTkdVTEFSX1NPTFZFUjJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VuMlN1cHBvcnQvVmVjdG9yQmxvY2suaCBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L1ZlY3RvckJsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhODA4MAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0L1ZlY3RvckJsb2NrLmgKQEAgLTAsMCArMSw5NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTjJfVkVDVE9SQkxPQ0tfSAorI2RlZmluZSBFSUdFTjJfVkVDVE9SQkxPQ0tfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxkZXByZWNhdGVkIHVzZSBEZW5zZU1hc2U6OmhlYWQoSW5kZXgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIFZlY3RvckJsb2NrPERlcml2ZWQ+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpzdGFydChJbmRleCBzaXplKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKERlcml2ZWQpCisgIHJldHVybiBWZWN0b3JCbG9jazxEZXJpdmVkPihkZXJpdmVkKCksIDAsIHNpemUpOworfQorCisvKiogXGRlcHJlY2F0ZWQgdXNlIERlbnNlTWFzZTo6aGVhZChJbmRleCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgVmVjdG9yQmxvY2s8Y29uc3QgRGVyaXZlZD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OnN0YXJ0KEluZGV4IHNpemUpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgMCwgc2l6ZSk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCB1c2UgRGVuc2VNYXNlOjp0YWlsKEluZGV4KSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBWZWN0b3JCbG9jazxEZXJpdmVkPgorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZW5kKEluZGV4IHNpemUpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIFZlY3RvckJsb2NrPERlcml2ZWQ+KGRlcml2ZWQoKSwgdGhpcy0+c2l6ZSgpIC0gc2l6ZSwgc2l6ZSk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCB1c2UgRGVuc2VNYXNlOjp0YWlsKEluZGV4KSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkPgorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZW5kKEluZGV4IHNpemUpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgdGhpcy0+c2l6ZSgpIC0gc2l6ZSwgc2l6ZSk7Cit9CisKKy8qKiBcZGVwcmVjYXRlZCB1c2UgRGVuc2VNYXNlOjpoZWFkKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgU2l6ZT4KK2lubGluZSBWZWN0b3JCbG9jazxEZXJpdmVkLFNpemU+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpzdGFydCgpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIFZlY3RvckJsb2NrPERlcml2ZWQsU2l6ZT4oZGVyaXZlZCgpLCAwKTsKK30KKworLyoqIFxkZXByZWNhdGVkIHVzZSBEZW5zZU1hc2U6OmhlYWQoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPGludCBTaXplPgoraW5saW5lIGNvbnN0IFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQsU2l6ZT4KK01hdHJpeEJhc2U8RGVyaXZlZD46OnN0YXJ0KCkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gVmVjdG9yQmxvY2s8Y29uc3QgRGVyaXZlZCxTaXplPihkZXJpdmVkKCksIDApOworfQorCisvKiogXGRlcHJlY2F0ZWQgdXNlIERlbnNlTWFzZTo6dGFpbCgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8aW50IFNpemU+CitpbmxpbmUgVmVjdG9yQmxvY2s8RGVyaXZlZCxTaXplPgorTWF0cml4QmFzZTxEZXJpdmVkPjo6ZW5kKCkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICByZXR1cm4gVmVjdG9yQmxvY2s8RGVyaXZlZCwgU2l6ZT4oZGVyaXZlZCgpLCBzaXplKCkgLSBTaXplKTsKK30KKworLyoqIFxkZXByZWNhdGVkIHVzZSBEZW5zZU1hc2U6OnRhaWwoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPGludCBTaXplPgoraW5saW5lIGNvbnN0IFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQsU2l6ZT4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmVuZCgpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQsIFNpemU+KGRlcml2ZWQoKSwgc2l6ZSgpIC0gU2l6ZSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU4yX1ZFQ1RPUkJMT0NLX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNlMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX0VJR0VOVkFMVUVTX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9FSUdFTlZBTFVFU19TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9FaWdlbnZhbHVlcyBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0NvbXBsZXhFaWdlblNvbHZlci5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0NvbXBsZXhFaWdlblNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YjhhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvQ29tcGxleEVpZ2VuU29sdmVyLmgKQEAgLTAsMCArMSwzMTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IENsYWlyZSBNYXVyaWNlCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09NUExFWF9FSUdFTl9TT0xWRVJfSAorI2RlZmluZSBFSUdFTl9DT01QTEVYX0VJR0VOX1NPTFZFUl9ICisKKyNpbmNsdWRlICIuL0NvbXBsZXhTY2h1ci5oIgorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxlaWdlbnZhbHVlc19tb2R1bGUgXGluZ3JvdXAgRWlnZW52YWx1ZXNfTW9kdWxlCisgICoKKyAgKgorICAqIFxjbGFzcyBDb21wbGV4RWlnZW5Tb2x2ZXIKKyAgKgorICAqIFxicmllZiBDb21wdXRlcyBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGdlbmVyYWwgY29tcGxleCBtYXRyaWNlcworICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoIHdlIGFyZQorICAqIGNvbXB1dGluZyB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uOyB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuCisgICogaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4IGNsYXNzIHRlbXBsYXRlLgorICAqCisgICogVGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgYSBtYXRyaXggXGYkIEEgXGYkIGFyZSBzY2FsYXJzCisgICogXGYkIFxsYW1iZGEgXGYkIGFuZCB2ZWN0b3JzIFxmJCB2IFxmJCBzdWNoIHRoYXQgXGYkIEF2ID0gXGxhbWJkYSB2CisgICogXGYkLiAgSWYgXGYkIEQgXGYkIGlzIGEgZGlhZ29uYWwgbWF0cml4IHdpdGggdGhlIGVpZ2VudmFsdWVzIG9uCisgICogdGhlIGRpYWdvbmFsLCBhbmQgXGYkIFYgXGYkIGlzIGEgbWF0cml4IHdpdGggdGhlIGVpZ2VudmVjdG9ycyBhcworICAqIGl0cyBjb2x1bW5zLCB0aGVuIFxmJCBBIFYgPSBWIEQgXGYkLiBUaGUgbWF0cml4IFxmJCBWIFxmJCBpcworICAqIGFsbW9zdCBhbHdheXMgaW52ZXJ0aWJsZSwgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIFxmJCBBID0gViBEIFZeey0xfQorICAqIFxmJC4gVGhpcyBpcyBjYWxsZWQgdGhlIGVpZ2VuZGVjb21wb3NpdGlvbi4KKyAgKgorICAqIFRoZSBtYWluIGZ1bmN0aW9uIGluIHRoaXMgY2xhc3MgaXMgY29tcHV0ZSgpLCB3aGljaCBjb21wdXRlcyB0aGUKKyAgKiBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGEgZ2l2ZW4gZnVuY3Rpb24uIFRoZQorICAqIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgZnVuY3Rpb24gY29udGFpbnMgYW4gZXhhbXBsZSBzaG93aW5nIHRoZQorICAqIG1haW4gZmVhdHVyZXMgb2YgdGhlIGNsYXNzLgorICAqCisgICogXHNhIGNsYXNzIEVpZ2VuU29sdmVyLCBjbGFzcyBTZWxmQWRqb2ludEVpZ2VuU29sdmVyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgQ29tcGxleEVpZ2VuU29sdmVyCit7CisgIHB1YmxpYzoKKworICAgIC8qKiBcYnJpZWYgU3lub255bSBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBccCBfTWF0cml4VHlwZS4gKi8KKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisKKyAgICBlbnVtIHsKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisKKyAgICAvKiogXGJyaWVmIFNjYWxhciB0eXBlIGZvciBtYXRyaWNlcyBvZiB0eXBlICNNYXRyaXhUeXBlLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICAgIC8qKiBcYnJpZWYgQ29tcGxleCBzY2FsYXIgdHlwZSBmb3IgI01hdHJpeFR5cGUuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgXGMgc3RkOjpjb21wbGV4PFNjYWxhcj4gaWYgI1NjYWxhciBpcyByZWFsIChlLmcuLAorICAgICAgKiBcYyBmbG9hdCBvciBcYyBkb3VibGUpIGFuZCBqdXN0IFxjIFNjYWxhciBpZiAjU2NhbGFyIGlzCisgICAgICAqIGNvbXBsZXguCisgICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisKKyAgICAvKiogXGJyaWVmIFR5cGUgZm9yIHZlY3RvciBvZiBlaWdlbnZhbHVlcyBhcyByZXR1cm5lZCBieSBlaWdlbnZhbHVlcygpLgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIGEgY29sdW1uIHZlY3RvciB3aXRoIGVudHJpZXMgb2YgdHlwZSAjQ29tcGxleFNjYWxhci4KKyAgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yIGlzIHRoZSBzaXplIG9mICNNYXRyaXhUeXBlLgorICAgICAgKi8KKyAgICB0eXBlZGVmIE1hdHJpeDxDb21wbGV4U2NhbGFyLCBDb2xzQXRDb21waWxlVGltZSwgMSwgT3B0aW9ucyYoflJvd01ham9yKSwgTWF4Q29sc0F0Q29tcGlsZVRpbWUsIDE+IEVpZ2VudmFsdWVUeXBlOworCisgICAgLyoqIFxicmllZiBUeXBlIGZvciBtYXRyaXggb2YgZWlnZW52ZWN0b3JzIGFzIHJldHVybmVkIGJ5IGVpZ2VudmVjdG9ycygpLgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIGEgc3F1YXJlIG1hdHJpeCB3aXRoIGVudHJpZXMgb2YgdHlwZSAjQ29tcGxleFNjYWxhci4KKyAgICAgICogVGhlIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgI01hdHJpeFR5cGUuCisgICAgICAqLworICAgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSwgT3B0aW9ucywgTWF4Um93c0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBFaWdlbnZlY3RvclR5cGU7CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIGNvbXB1dGUoKS4KKyAgICAgICovCisgICAgQ29tcGxleEVpZ2VuU29sdmVyKCkKKyAgICAgICAgICAgIDogbV9laXZlYygpLAorICAgICAgICAgICAgICBtX2VpdmFsdWVzKCksCisgICAgICAgICAgICAgIG1fc2NodXIoKSwKKyAgICAgICAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgICAgICAgbV9laWdlbnZlY3RvcnNPayhmYWxzZSksCisgICAgICAgICAgICAgIG1fbWF0WCgpCisgICAge30KKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAgICAqCisgICAgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIFxhIHNpemUuCisgICAgICAqIFxzYSBDb21wbGV4RWlnZW5Tb2x2ZXIoKQorICAgICAgKi8KKyAgICBDb21wbGV4RWlnZW5Tb2x2ZXIoSW5kZXggc2l6ZSkKKyAgICAgICAgICAgIDogbV9laXZlYyhzaXplLCBzaXplKSwKKyAgICAgICAgICAgICAgbV9laXZhbHVlcyhzaXplKSwKKyAgICAgICAgICAgICAgbV9zY2h1cihzaXplKSwKKyAgICAgICAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgICAgICAgbV9laWdlbnZlY3RvcnNPayhmYWxzZSksCisgICAgICAgICAgICAgIG1fbWF0WChzaXplLCBzaXplKQorICAgIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yOyBjb21wdXRlcyBlaWdlbmRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LgorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggIFNxdWFyZSBtYXRyaXggd2hvc2UgZWlnZW5kZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlRWlnZW52ZWN0b3JzICBJZiB0cnVlLCBib3RoIHRoZSBlaWdlbnZlY3RvcnMgYW5kIHRoZQorICAgICAgKiAgICBlaWdlbnZhbHVlcyBhcmUgY29tcHV0ZWQ7IGlmIGZhbHNlLCBvbmx5IHRoZSBlaWdlbnZhbHVlcyBhcmUKKyAgICAgICogICAgY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgY29tcHV0ZSgpIHRvIGNvbXB1dGUgdGhlIGVpZ2VuZGVjb21wb3NpdGlvbi4KKyAgICAgICovCisgICAgICBDb21wbGV4RWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSB0cnVlKQorICAgICAgICAgICAgOiBtX2VpdmVjKG1hdHJpeC5yb3dzKCksbWF0cml4LmNvbHMoKSksCisgICAgICAgICAgICAgIG1fZWl2YWx1ZXMobWF0cml4LmNvbHMoKSksCisgICAgICAgICAgICAgIG1fc2NodXIobWF0cml4LnJvd3MoKSksCisgICAgICAgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgICAgICAgIG1fZWlnZW52ZWN0b3JzT2soZmFsc2UpLAorICAgICAgICAgICAgICBtX21hdFgobWF0cml4LnJvd3MoKSxtYXRyaXguY29scygpKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4LCBjb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGVpZ2VudmVjdG9ycyBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zICBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IHdob3NlIGNvbHVtbnMgYXJlIHRoZSBlaWdlbnZlY3RvcnMuCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgKiBDb21wbGV4RWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sKSBvciB0aGUgbWVtYmVyCisgICAgICAqIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlCisgICAgICAqIHRvIGNvbXB1dGUgdGhlIGVpZ2VuZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCwgYW5kCisgICAgICAqIFxwIGNvbXB1dGVFaWdlbnZlY3RvcnMgd2FzIHNldCB0byB0cnVlICh0aGUgZGVmYXVsdCkuCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGFyZSB0aGUgZWlnZW52ZWN0b3JzLiBDb2x1bW4KKyAgICAgICogXGYkIGsgXGYkIGlzIGFuIGVpZ2VudmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gZWlnZW52YWx1ZSBudW1iZXIgXGYkIGsKKyAgICAgICogXGYkIGFzIHJldHVybmVkIGJ5IGVpZ2VudmFsdWVzKCkuICBUaGUgZWlnZW52ZWN0b3JzIGFyZSBub3JtYWxpemVkIHRvCisgICAgICAqIGhhdmUgKEV1Y2xpZGVhbikgbm9ybSBlcXVhbCB0byBvbmUuIFRoZSBtYXRyaXggcmV0dXJuZWQgYnkgdGhpcworICAgICAgKiBmdW5jdGlvbiBpcyB0aGUgbWF0cml4IFxmJCBWIFxmJCBpbiB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uIFxmJCBBID0gViBECisgICAgICAqIFZeey0xfSBcZiQsIGlmIGl0IGV4aXN0cy4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5vdXQKKyAgICAgICovCisgICAgY29uc3QgRWlnZW52ZWN0b3JUeXBlJiBlaWdlbnZlY3RvcnMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbXBsZXhFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9laWdlbnZlY3RvcnNPayAmJiAiVGhlIGVpZ2VudmVjdG9ycyBoYXZlIG5vdCBiZWVuIGNvbXB1dGVkIHRvZ2V0aGVyIHdpdGggdGhlIGVpZ2VudmFsdWVzLiIpOworICAgICAgcmV0dXJuIG1fZWl2ZWM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBlaWdlbnZhbHVlcyBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBjb2x1bW4gdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGVpZ2VudmFsdWVzLgorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IKKyAgICAgICogQ29tcGxleEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCkgb3IgdGhlIG1lbWJlcgorICAgICAgKiBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZQorICAgICAgKiB0byBjb21wdXRlIHRoZSBlaWdlbmRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNvbHVtbiB2ZWN0b3IgY29udGFpbmluZyB0aGUKKyAgICAgICogZWlnZW52YWx1ZXMuIEVpZ2VudmFsdWVzIGFyZSByZXBlYXRlZCBhY2NvcmRpbmcgdG8gdGhlaXIKKyAgICAgICogYWxnZWJyYWljIG11bHRpcGxpY2l0eSwgc28gdGhlcmUgYXJlIGFzIG1hbnkgZWlnZW52YWx1ZXMgYXMKKyAgICAgICogcm93cyBpbiB0aGUgbWF0cml4LiBUaGUgZWlnZW52YWx1ZXMgYXJlIG5vdCBzb3J0ZWQgaW4gYW55IHBhcnRpY3VsYXIKKyAgICAgICogb3JkZXIuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIENvbXBsZXhFaWdlblNvbHZlcl9laWdlbnZhbHVlcy5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLm91dAorICAgICAgKi8KKyAgICBjb25zdCBFaWdlbnZhbHVlVHlwZSYgZWlnZW52YWx1ZXMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbXBsZXhFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9laXZhbHVlczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIGVpZ2VuZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdHJpeCAgU3F1YXJlIG1hdHJpeCB3aG9zZSBlaWdlbmRlY29tcG9zaXRpb24gaXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIGNvbXB1dGVFaWdlbnZlY3RvcnMgIElmIHRydWUsIGJvdGggdGhlIGVpZ2VudmVjdG9ycyBhbmQgdGhlCisgICAgICAqICAgIGVpZ2VudmFsdWVzIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgdGhlIGVpZ2VudmFsdWVzIGFyZQorICAgICAgKiAgICBjb21wdXRlZC4KKyAgICAgICogXHJldHVybnMgICAgUmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSBjb21wbGV4IG1hdHJpeCBccCBtYXRyaXguCisgICAgICAqIFRoZSBlaWdlbnZhbHVlcygpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZW0uICBJZgorICAgICAgKiBccCBjb21wdXRlRWlnZW52ZWN0b3JzIGlzIHRydWUsIHRoZW4gdGhlIGVpZ2VudmVjdG9ycyBhcmUgYWxzbyBjb21wdXRlZAorICAgICAgKiBhbmQgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGVpZ2VudmVjdG9ycygpLgorICAgICAgKgorICAgICAgKiBUaGUgbWF0cml4IGlzIGZpcnN0IHJlZHVjZWQgdG8gU2NodXIgZm9ybSB1c2luZyB0aGUKKyAgICAgICogQ29tcGxleFNjaHVyIGNsYXNzLiBUaGUgU2NodXIgZGVjb21wb3NpdGlvbiBpcyB0aGVuIHVzZWQgdG8KKyAgICAgICogY29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogVGhlIGNvc3Qgb2YgdGhlIGNvbXB1dGF0aW9uIGlzIGRvbWluYXRlZCBieSB0aGUgY29zdCBvZiB0aGUKKyAgICAgICogU2NodXIgZGVjb21wb3NpdGlvbiwgd2hpY2ggaXMgXGYkIE8obl4zKSBcZiQgd2hlcmUgXGYkIG4gXGYkCisgICAgICAqIGlzIHRoZSBzaXplIG9mIHRoZSBtYXRyaXguCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIENvbXBsZXhFaWdlblNvbHZlcl9jb21wdXRlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDb21wbGV4RWlnZW5Tb2x2ZXJfY29tcHV0ZS5vdXQKKyAgICAgICovCisgICAgQ29tcGxleEVpZ2VuU29sdmVyJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlRWlnZW52ZWN0b3JzID0gdHJ1ZSk7CisKKyAgICAvKiogXGJyaWVmIFJlcG9ydHMgd2hldGhlciBwcmV2aW91cyBjb21wdXRhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgXGMgU3VjY2VzcyBpZiBjb21wdXRhdGlvbiB3YXMgc3VjY2VzZnVsLCBcYyBOb0NvbnZlcmdlbmNlIG90aGVyd2lzZS4KKyAgICAgICovCisgICAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbXBsZXhFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9zY2h1ci5pbmZvKCk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBFaWdlbnZlY3RvclR5cGUgbV9laXZlYzsKKyAgICBFaWdlbnZhbHVlVHlwZSBtX2VpdmFsdWVzOworICAgIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBtX3NjaHVyOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgIGJvb2wgbV9laWdlbnZlY3RvcnNPazsKKyAgICBFaWdlbnZlY3RvclR5cGUgbV9tYXRYOworCisgIHByaXZhdGU6CisgICAgdm9pZCBkb0NvbXB1dGVFaWdlbnZlY3RvcnMoUmVhbFNjYWxhciBtYXRyaXhub3JtKTsKKyAgICB2b2lkIHNvcnRFaWdlbnZhbHVlcyhib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMpOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+JiBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT46OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMpCit7CisgIC8vIHRoaXMgY29kZSBpcyBpbnNwaXJlZCBmcm9tIEphbXBhY2sKKyAgYXNzZXJ0KG1hdHJpeC5jb2xzKCkgPT0gbWF0cml4LnJvd3MoKSk7CisKKyAgLy8gRG8gYSBjb21wbGV4IFNjaHVyIGRlY29tcG9zaXRpb24sIEEgPSBVIFQgVV4qCisgIC8vIFRoZSBlaWdlbnZhbHVlcyBhcmUgb24gdGhlIGRpYWdvbmFsIG9mIFQuCisgIG1fc2NodXIuY29tcHV0ZShtYXRyaXgsIGNvbXB1dGVFaWdlbnZlY3RvcnMpOworCisgIGlmKG1fc2NodXIuaW5mbygpID09IFN1Y2Nlc3MpCisgIHsKKyAgICBtX2VpdmFsdWVzID0gbV9zY2h1ci5tYXRyaXhUKCkuZGlhZ29uYWwoKTsKKyAgICBpZihjb21wdXRlRWlnZW52ZWN0b3JzKQorICAgICAgZG9Db21wdXRlRWlnZW52ZWN0b3JzKG1hdHJpeC5ub3JtKCkpOworICAgIHNvcnRFaWdlbnZhbHVlcyhjb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgfQorCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIG1fZWlnZW52ZWN0b3JzT2sgPSBjb21wdXRlRWlnZW52ZWN0b3JzOworICByZXR1cm4gKnRoaXM7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+Ojpkb0NvbXB1dGVFaWdlbnZlY3RvcnMoUmVhbFNjYWxhciBtYXRyaXhub3JtKQoreworICBjb25zdCBJbmRleCBuID0gbV9laXZhbHVlcy5zaXplKCk7CisKKyAgLy8gQ29tcHV0ZSBYIHN1Y2ggdGhhdCBUID0gWCBEIFheKC0xKSwgd2hlcmUgRCBpcyB0aGUgZGlhZ29uYWwgb2YgVC4KKyAgLy8gVGhlIG1hdHJpeCBYIGlzIHVuaXQgdHJpYW5ndWxhci4KKyAgbV9tYXRYID0gRWlnZW52ZWN0b3JUeXBlOjpaZXJvKG4sIG4pOworICBmb3IoSW5kZXggaz1uLTEgOyBrPj0wIDsgay0tKQorICB7CisgICAgbV9tYXRYLmNvZWZmUmVmKGssaykgPSBDb21wbGV4U2NhbGFyKDEuMCwwLjApOworICAgIC8vIENvbXB1dGUgWChpLGspIHVzaW5nIHRoZSAoaSxrKSBlbnRyeSBvZiB0aGUgZXF1YXRpb24gWCBUID0gRCBYCisgICAgZm9yKEluZGV4IGk9ay0xIDsgaT49MCA7IGktLSkKKyAgICB7CisgICAgICBtX21hdFguY29lZmZSZWYoaSxrKSA9IC1tX3NjaHVyLm1hdHJpeFQoKS5jb2VmZihpLGspOworICAgICAgaWYoay1pLTE+MCkKKyAgICAgICAgbV9tYXRYLmNvZWZmUmVmKGksaykgLT0gKG1fc2NodXIubWF0cml4VCgpLnJvdyhpKS5zZWdtZW50KGkrMSxrLWktMSkgKiBtX21hdFguY29sKGspLnNlZ21lbnQoaSsxLGstaS0xKSkudmFsdWUoKTsKKyAgICAgIENvbXBsZXhTY2FsYXIgeiA9IG1fc2NodXIubWF0cml4VCgpLmNvZWZmKGksaSkgLSBtX3NjaHVyLm1hdHJpeFQoKS5jb2VmZihrLGspOworICAgICAgaWYoej09Q29tcGxleFNjYWxhcigwKSkKKyAgICAgIHsKKyAgICAgICAgLy8gSWYgdGhlIGktdGggYW5kIGstdGggZWlnZW52YWx1ZSBhcmUgZXF1YWwsIHRoZW4geiBlcXVhbHMgMC4KKyAgICAgICAgLy8gVXNlIGEgc21hbGwgdmFsdWUgaW5zdGVhZCwgdG8gcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvLgorICAgICAgICBpbnRlcm5hbDo6cmVhbF9yZWYoeikgPSBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSAqIG1hdHJpeG5vcm07CisgICAgICB9CisgICAgICBtX21hdFguY29lZmZSZWYoaSxrKSA9IG1fbWF0WC5jb2VmZihpLGspIC8gejsKKyAgICB9CisgIH0KKworICAvLyBDb21wdXRlIFYgYXMgViA9IFUgWDsgbm93IEEgPSBVIFQgVV4qID0gVSBYIEQgWF4oLTEpIFVeKiA9IFYgRCBWXigtMSkKKyAgbV9laXZlYy5ub2FsaWFzKCkgPSBtX3NjaHVyLm1hdHJpeFUoKSAqIG1fbWF0WDsKKyAgLy8gLi4gYW5kIG5vcm1hbGl6ZSB0aGUgZWlnZW52ZWN0b3JzCisgIGZvcihJbmRleCBrPTAgOyBrPG4gOyBrKyspCisgIHsKKyAgICBtX2VpdmVjLmNvbChrKS5ub3JtYWxpemUoKTsKKyAgfQorfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIENvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhUeXBlPjo6c29ydEVpZ2VudmFsdWVzKGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycykKK3sKKyAgY29uc3QgSW5kZXggbiA9ICBtX2VpdmFsdWVzLnNpemUoKTsKKyAgZm9yIChJbmRleCBpPTA7IGk8bjsgaSsrKQorICB7CisgICAgSW5kZXggazsKKyAgICBtX2VpdmFsdWVzLmN3aXNlQWJzKCkudGFpbChuLWkpLm1pbkNvZWZmKCZrKTsKKyAgICBpZiAoayAhPSAwKQorICAgIHsKKyAgICAgIGsgKz0gaTsKKyAgICAgIHN0ZDo6c3dhcChtX2VpdmFsdWVzW2tdLG1fZWl2YWx1ZXNbaV0pOworICAgICAgaWYoY29tcHV0ZUVpZ2VudmVjdG9ycykKKwltX2VpdmVjLmNvbChpKS5zd2FwKG1fZWl2ZWMuY29sKGspKTsKKyAgICB9CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DT01QTEVYX0VJR0VOX1NPTFZFUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvQ29tcGxleFNjaHVyLmggYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvQ29tcGxleFNjaHVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhOWEwMwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9Db21wbGV4U2NodXIuaApAQCAtMCwwICsxLDM5NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQ2xhaXJlIE1hdXJpY2UKKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT01QTEVYX1NDSFVSX0gKKyNkZWZpbmUgRUlHRU5fQ09NUExFWF9TQ0hVUl9ICisKKyNpbmNsdWRlICIuL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uLmgiCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgYm9vbCBJc0NvbXBsZXg+IHN0cnVjdCBjb21wbGV4X3NjaHVyX3JlZHVjZV90b19oZXNzZW5iZXJnOworfQorCisvKiogXGVpZ2VudmFsdWVzX21vZHVsZSBcaW5ncm91cCBFaWdlbnZhbHVlc19Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIENvbXBsZXhTY2h1cgorICAqCisgICogXGJyaWVmIFBlcmZvcm1zIGEgY29tcGxleCBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGEgcmVhbCBvciBjb21wbGV4IHNxdWFyZSBtYXRyaXgKKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUKKyAgKiBjb21wdXRpbmcgdGhlIFNjaHVyIGRlY29tcG9zaXRpb247IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4KKyAgKiBpbnN0YW50aWF0aW9uIG9mIHRoZSBNYXRyaXggY2xhc3MgdGVtcGxhdGUuCisgICoKKyAgKiBHaXZlbiBhIHJlYWwgb3IgY29tcGxleCBzcXVhcmUgbWF0cml4IEEsIHRoaXMgY2xhc3MgY29tcHV0ZXMgdGhlCisgICogU2NodXIgZGVjb21wb3NpdGlvbjogXGYkIEEgPSBVIFQgVV4qXGYkIHdoZXJlIFUgaXMgYSB1bml0YXJ5CisgICogY29tcGxleCBtYXRyaXgsIGFuZCBUIGlzIGEgY29tcGxleCB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeC4gIFRoZQorICAqIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggVCBjb3JyZXNwb25kcyB0byB0aGUgZWlnZW52YWx1ZXMgb2YgdGhlCisgICogbWF0cml4IEEuCisgICoKKyAgKiBDYWxsIHRoZSBmdW5jdGlvbiBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgU2NodXIgZGVjb21wb3NpdGlvbiBvZgorICAqIGEgZ2l2ZW4gbWF0cml4LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgCisgICogQ29tcGxleFNjaHVyKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBjb25zdHJ1Y3RvciB3aGljaCBjb21wdXRlcworICAqIHRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBPbmNlIHRoZQorICAqIGRlY29tcG9zaXRpb24gaXMgY29tcHV0ZWQsIHlvdSBjYW4gdXNlIHRoZSBtYXRyaXhVKCkgYW5kIG1hdHJpeFQoKQorICAqIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSB0aGUgbWF0cmljZXMgVSBhbmQgViBpbiB0aGUgZGVjb21wb3NpdGlvbi4KKyAgKgorICAqIFxub3RlIFRoaXMgY29kZSBpcyBpbnNwaXJlZCBmcm9tIEphbXBhY2sKKyAgKgorICAqIFxzYSBjbGFzcyBSZWFsU2NodXIsIGNsYXNzIEVpZ2VuU29sdmVyLCBjbGFzcyBDb21wbGV4RWlnZW5Tb2x2ZXIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBDb21wbGV4U2NodXIKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICBlbnVtIHsKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisKKyAgICAvKiogXGJyaWVmIFNjYWxhciB0eXBlIGZvciBtYXRyaWNlcyBvZiB0eXBlIFxwIF9NYXRyaXhUeXBlLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICAgIC8qKiBcYnJpZWYgQ29tcGxleCBzY2FsYXIgdHlwZSBmb3IgXHAgX01hdHJpeFR5cGUuIAorICAgICAgKgorICAgICAgKiBUaGlzIGlzIFxjIHN0ZDo6Y29tcGxleDxTY2FsYXI+IGlmICNTY2FsYXIgaXMgcmVhbCAoZS5nLiwKKyAgICAgICogXGMgZmxvYXQgb3IgXGMgZG91YmxlKSBhbmQganVzdCBcYyBTY2FsYXIgaWYgI1NjYWxhciBpcworICAgICAgKiBjb21wbGV4LgorICAgICAgKi8KKyAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBDb21wbGV4U2NhbGFyOworCisgICAgLyoqIFxicmllZiBUeXBlIGZvciB0aGUgbWF0cmljZXMgaW4gdGhlIFNjaHVyIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSBzcXVhcmUgbWF0cml4IHdpdGggZW50cmllcyBvZiB0eXBlICNDb21wbGV4U2NhbGFyLiAKKyAgICAgICogVGhlIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgXHAgX01hdHJpeFR5cGUuCisgICAgICAqLworICAgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSwgT3B0aW9ucywgTWF4Um93c0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBDb21wbGV4TWF0cml4VHlwZTsKKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIFtpbl0gc2l6ZSAgUG9zaXRpdmUgaW50ZWdlciwgc2l6ZSBvZiB0aGUgbWF0cml4IHdob3NlIFNjaHVyIGRlY29tcG9zaXRpb24gd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgdXNlZnVsIGluIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyCisgICAgICAqIGludGVuZHMgdG8gcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgY29tcHV0ZSgpLiAgVGhlIFxwIHNpemUKKyAgICAgICogcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBhcyBhIGhpbnQuIEl0IGlzIG5vdCBhbiBlcnJvciB0byBnaXZlIGEKKyAgICAgICogd3JvbmcgXHAgc2l6ZSwgYnV0IGl0IG1heSBpbXBhaXIgcGVyZm9ybWFuY2UuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkgZm9yIGFuIGV4YW1wbGUuCisgICAgICAqLworICAgIENvbXBsZXhTY2h1cihJbmRleCBzaXplID0gUm93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyAxIDogUm93c0F0Q29tcGlsZVRpbWUpCisgICAgICA6IG1fbWF0VChzaXplLHNpemUpLAorICAgICAgICBtX21hdFUoc2l6ZSxzaXplKSwKKyAgICAgICAgbV9oZXNzKHNpemUpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgICBtX21hdFVpc1VwdG9kYXRlKGZhbHNlKQorICAgIHt9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yOyBjb21wdXRlcyBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4gCisgICAgICAqIAorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggICAgU3F1YXJlIG1hdHJpeCB3aG9zZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlVSAgSWYgdHJ1ZSwgYm90aCBUIGFuZCBVIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgVCBpcyBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgU2NodXIgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXHNhIG1hdHJpeFQoKSBhbmQgbWF0cml4VSgpIGZvciBleGFtcGxlcy4KKyAgICAgICovCisgICAgQ29tcGxleFNjaHVyKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlVSA9IHRydWUpCisgICAgICAgICAgICA6IG1fbWF0VChtYXRyaXgucm93cygpLG1hdHJpeC5jb2xzKCkpLAorICAgICAgICAgICAgICBtX21hdFUobWF0cml4LnJvd3MoKSxtYXRyaXguY29scygpKSwKKyAgICAgICAgICAgICAgbV9oZXNzKG1hdHJpeC5yb3dzKCkpLAorICAgICAgICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgICAgICAgICBtX21hdFVpc1VwdG9kYXRlKGZhbHNlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4LCBjb21wdXRlVSk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSB1bml0YXJ5IG1hdHJpeCBpbiB0aGUgU2NodXIgZGVjb21wb3NpdGlvbi4gCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggVS4KKyAgICAgICoKKyAgICAgICogSXQgaXMgYXNzdW1lZCB0aGF0IGVpdGhlciB0aGUgY29uc3RydWN0b3IKKyAgICAgICogQ29tcGxleFNjaHVyKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlVSkgb3IgdGhlCisgICAgICAqIG1lbWJlciBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlVSkKKyAgICAgICogaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSB0byBjb21wdXRlIHRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGEKKyAgICAgICogbWF0cml4LCBhbmQgdGhhdCBccCBjb21wdXRlVSB3YXMgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0CisgICAgICAqIHZhbHVlKS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgQ29tcGxleFNjaHVyX21hdHJpeFUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIENvbXBsZXhTY2h1cl9tYXRyaXhVLm91dAorICAgICAgKi8KKyAgICBjb25zdCBDb21wbGV4TWF0cml4VHlwZSYgbWF0cml4VSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29tcGxleFNjaHVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX21hdFVpc1VwdG9kYXRlICYmICJUaGUgbWF0cml4IFUgaGFzIG5vdCBiZWVuIGNvbXB1dGVkIGR1cmluZyB0aGUgQ29tcGxleFNjaHVyIGRlY29tcG9zaXRpb24uIik7CisgICAgICByZXR1cm4gbV9tYXRVOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgdHJpYW5ndWxhciBtYXRyaXggaW4gdGhlIFNjaHVyIGRlY29tcG9zaXRpb24uIAorICAgICAgKgorICAgICAgKiBccmV0dXJucyBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IFQuCisgICAgICAqCisgICAgICAqIEl0IGlzIGFzc3VtZWQgdGhhdCBlaXRoZXIgdGhlIGNvbnN0cnVjdG9yCisgICAgICAqIENvbXBsZXhTY2h1cihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGJvb2wgY29tcHV0ZVUpIG9yIHRoZQorICAgICAgKiBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGJvb2wgY29tcHV0ZVUpCisgICAgICAqIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgdG8gY29tcHV0ZSB0aGUgU2NodXIgZGVjb21wb3NpdGlvbiBvZiBhCisgICAgICAqIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBsYWluIHNxdWFyZSBtYXRyaXguIElmIHlvdSB3YW50IHRvIHJlZmVyZW5jZQorICAgICAgKiBvbmx5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQsIHVzZToKKyAgICAgICogXGNvZGUgc2NodXIubWF0cml4VCgpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpIFxlbmRjb2RlIAorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDb21wbGV4U2NodXJfbWF0cml4VC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ29tcGxleFNjaHVyX21hdHJpeFQub3V0CisgICAgICAqLworICAgIGNvbnN0IENvbXBsZXhNYXRyaXhUeXBlJiBtYXRyaXhUKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb21wbGV4U2NodXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fbWF0VDsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIFNjaHVyIGRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LiAKKyAgICAgICogCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdHJpeCAgU3F1YXJlIG1hdHJpeCB3aG9zZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlVSAgSWYgdHJ1ZSwgYm90aCBUIGFuZCBVIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgVCBpcyBjb21wdXRlZC4KKyAgICAgICogXHJldHVybnMgICAgUmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIFRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIGNvbXB1dGVkIGJ5IGZpcnN0IHJlZHVjaW5nIHRoZQorICAgICAgKiBtYXRyaXggdG8gSGVzc2VuYmVyZyBmb3JtIHVzaW5nIHRoZSBjbGFzcworICAgICAgKiBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbi4gVGhlIEhlc3NlbmJlcmcgbWF0cml4IGlzIHRoZW4gcmVkdWNlZAorICAgICAgKiB0byB0cmlhbmd1bGFyIGZvcm0gYnkgcGVyZm9ybWluZyBRUiBpdGVyYXRpb25zIHdpdGggYSBzaW5nbGUKKyAgICAgICogc2hpZnQuIFRoZSBjb3N0IG9mIGNvbXB1dGluZyB0aGUgU2NodXIgZGVjb21wb3NpdGlvbiBkZXBlbmRzCisgICAgICAqIG9uIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgYXMgYSByb3VnaCBndWlkZSwgaXQgbWF5IGJlIHRha2VuCisgICAgICAqIG9uIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgYXMgYSByb3VnaCBndWlkZSwgaXQgbWF5IGJlIHRha2VuCisgICAgICAqIHRvIGJlIFxmJDI1bl4zXGYkIGNvbXBsZXggZmxvcHMsIG9yIFxmJDEwbl4zXGYkIGNvbXBsZXggZmxvcHMKKyAgICAgICogaWYgXGEgY29tcHV0ZVUgaXMgZmFsc2UuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIENvbXBsZXhTY2h1cl9jb21wdXRlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDb21wbGV4U2NodXJfY29tcHV0ZS5vdXQKKyAgICAgICovCisgICAgQ29tcGxleFNjaHVyJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlVSA9IHRydWUpOworCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwgXGMgTm9Db252ZXJnZW5jZSBvdGhlcndpc2UuCisgICAgICAqLworICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJSZWFsU2NodXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1faW5mbzsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMuCisgICAgICAqCisgICAgICAqIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYWxsb3dlZCBmb3IgYW4gZWlnZW52YWx1ZSB0byBjb252ZXJnZS4gCisgICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgbV9tYXhJdGVyYXRpb25zID0gMzA7CisKKyAgcHJvdGVjdGVkOgorICAgIENvbXBsZXhNYXRyaXhUeXBlIG1fbWF0VCwgbV9tYXRVOworICAgIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+IG1faGVzczsKKyAgICBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgIGJvb2wgbV9tYXRVaXNVcHRvZGF0ZTsKKworICBwcml2YXRlOiAgCisgICAgYm9vbCBzdWJkaWFnb25hbEVudHJ5SXNOZWdsZWdpYmxlKEluZGV4IGkpOworICAgIENvbXBsZXhTY2FsYXIgY29tcHV0ZVNoaWZ0KEluZGV4IGl1LCBJbmRleCBpdGVyKTsKKyAgICB2b2lkIHJlZHVjZVRvVHJpYW5ndWxhckZvcm0oYm9vbCBjb21wdXRlVSk7CisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6Y29tcGxleF9zY2h1cl9yZWR1Y2VfdG9faGVzc2VuYmVyZzxNYXRyaXhUeXBlLCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4PjsKK307CisKKy8qKiBJZiBtX21hdFQoaSsxLGkpIGlzIG5lZ2xlZ2libGUgaW4gZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYworICAqIGNvbXBhcmVkIHRvIG1fbWF0VChpLGkpIGFuZCBtX21hdFQoaixqKSwgdGhlbiBzZXQgaXQgdG8gemVybyBhbmQKKyAgKiByZXR1cm4gdHJ1ZSwgZWxzZSByZXR1cm4gZmFsc2UuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIGJvb2wgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjpzdWJkaWFnb25hbEVudHJ5SXNOZWdsZWdpYmxlKEluZGV4IGkpCit7CisgIFJlYWxTY2FsYXIgZCA9IGludGVybmFsOjpub3JtMShtX21hdFQuY29lZmYoaSxpKSkgKyBpbnRlcm5hbDo6bm9ybTEobV9tYXRULmNvZWZmKGkrMSxpKzEpKTsKKyAgUmVhbFNjYWxhciBzZCA9IGludGVybmFsOjpub3JtMShtX21hdFQuY29lZmYoaSsxLGkpKTsKKyAgaWYgKGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihzZCwgZCwgTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkpKQorICB7CisgICAgbV9tYXRULmNvZWZmUmVmKGkrMSxpKSA9IENvbXBsZXhTY2FsYXIoMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qKiBDb21wdXRlIHRoZSBzaGlmdCBpbiB0aGUgY3VycmVudCBRUiBpdGVyYXRpb24uICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjpDb21wbGV4U2NhbGFyIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPjo6Y29tcHV0ZVNoaWZ0KEluZGV4IGl1LCBJbmRleCBpdGVyKQoreworICBpZiAoaXRlciA9PSAxMCB8fCBpdGVyID09IDIwKSAKKyAgeworICAgIC8vIGV4Y2VwdGlvbmFsIHNoaWZ0LCB0YWtlbiBmcm9tIGh0dHA6Ly93d3cubmV0bGliLm9yZy9laXNwYWNrL2NvbXFyLmYKKyAgICByZXR1cm4gaW50ZXJuYWw6OmFicyhpbnRlcm5hbDo6cmVhbChtX21hdFQuY29lZmYoaXUsaXUtMSkpKSArIGludGVybmFsOjphYnMoaW50ZXJuYWw6OnJlYWwobV9tYXRULmNvZWZmKGl1LTEsaXUtMikpKTsKKyAgfQorCisgIC8vIGNvbXB1dGUgdGhlIHNoaWZ0IGFzIG9uZSBvZiB0aGUgZWlnZW52YWx1ZXMgb2YgdCwgdGhlIDJ4MgorICAvLyBkaWFnb25hbCBibG9jayBvbiB0aGUgYm90dG9tIG9mIHRoZSBhY3RpdmUgc3VibWF0cml4CisgIE1hdHJpeDxDb21wbGV4U2NhbGFyLDIsMj4gdCA9IG1fbWF0VC50ZW1wbGF0ZSBibG9jazwyLDI+KGl1LTEsaXUtMSk7CisgIFJlYWxTY2FsYXIgbm9ybXQgPSB0LmN3aXNlQWJzKCkuc3VtKCk7CisgIHQgLz0gbm9ybXQ7ICAgICAvLyB0aGUgbm9ybWFsaXphdGlvbiBieSBzZiBpcyB0byBhdm9pZCB1bmRlci9vdmVyZmxvdworCisgIENvbXBsZXhTY2FsYXIgYiA9IHQuY29lZmYoMCwxKSAqIHQuY29lZmYoMSwwKTsKKyAgQ29tcGxleFNjYWxhciBjID0gdC5jb2VmZigwLDApIC0gdC5jb2VmZigxLDEpOworICBDb21wbGV4U2NhbGFyIGRpc2MgPSBzcXJ0KGMqYyArIFJlYWxTY2FsYXIoNCkqYik7CisgIENvbXBsZXhTY2FsYXIgZGV0ID0gdC5jb2VmZigwLDApICogdC5jb2VmZigxLDEpIC0gYjsKKyAgQ29tcGxleFNjYWxhciB0cmFjZSA9IHQuY29lZmYoMCwwKSArIHQuY29lZmYoMSwxKTsKKyAgQ29tcGxleFNjYWxhciBlaXZhbDEgPSAodHJhY2UgKyBkaXNjKSAvIFJlYWxTY2FsYXIoMik7CisgIENvbXBsZXhTY2FsYXIgZWl2YWwyID0gKHRyYWNlIC0gZGlzYykgLyBSZWFsU2NhbGFyKDIpOworCisgIGlmKGludGVybmFsOjpub3JtMShlaXZhbDEpID4gaW50ZXJuYWw6Om5vcm0xKGVpdmFsMikpCisgICAgZWl2YWwyID0gZGV0IC8gZWl2YWwxOworICBlbHNlCisgICAgZWl2YWwxID0gZGV0IC8gZWl2YWwyOworCisgIC8vIGNob29zZSB0aGUgZWlnZW52YWx1ZSBjbG9zZXN0IHRvIHRoZSBib3R0b20gZW50cnkgb2YgdGhlIGRpYWdvbmFsCisgIGlmKGludGVybmFsOjpub3JtMShlaXZhbDEtdC5jb2VmZigxLDEpKSA8IGludGVybmFsOjpub3JtMShlaXZhbDItdC5jb2VmZigxLDEpKSkKKyAgICByZXR1cm4gbm9ybXQgKiBlaXZhbDE7CisgIGVsc2UKKyAgICByZXR1cm4gbm9ybXQgKiBlaXZhbDI7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0NvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiYgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlVSkKK3sKKyAgbV9tYXRVaXNVcHRvZGF0ZSA9IGZhbHNlOworICBlaWdlbl9hc3NlcnQobWF0cml4LmNvbHMoKSA9PSBtYXRyaXgucm93cygpKTsKKworICBpZihtYXRyaXguY29scygpID09IDEpCisgIHsKKyAgICBtX21hdFQgPSBtYXRyaXgudGVtcGxhdGUgY2FzdDxDb21wbGV4U2NhbGFyPigpOworICAgIGlmKGNvbXB1dGVVKSAgbV9tYXRVID0gQ29tcGxleE1hdHJpeFR5cGU6OklkZW50aXR5KDEsMSk7CisgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIG1fbWF0VWlzVXB0b2RhdGUgPSBjb21wdXRlVTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbnRlcm5hbDo6Y29tcGxleF9zY2h1cl9yZWR1Y2VfdG9faGVzc2VuYmVyZzxNYXRyaXhUeXBlLCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4Pjo6cnVuKCp0aGlzLCBtYXRyaXgsIGNvbXB1dGVVKTsKKyAgcmVkdWNlVG9Ucmlhbmd1bGFyRm9ybShjb21wdXRlVSk7CisgIHJldHVybiAqdGhpczsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyogUmVkdWNlIGdpdmVuIG1hdHJpeCB0byBIZXNzZW5iZXJnIGZvcm0gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGJvb2wgSXNDb21wbGV4Pgorc3RydWN0IGNvbXBsZXhfc2NodXJfcmVkdWNlX3RvX2hlc3NlbmJlcmcKK3sKKyAgLy8gdGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjYXNlIElzQ29tcGxleCA9IHRydWUKKyAgc3RhdGljIHZvaWQgcnVuKENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiYgX3RoaXMsIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlVSkKKyAgeworICAgIF90aGlzLm1faGVzcy5jb21wdXRlKG1hdHJpeCk7CisgICAgX3RoaXMubV9tYXRUID0gX3RoaXMubV9oZXNzLm1hdHJpeEgoKTsKKyAgICBpZihjb21wdXRlVSkgIF90aGlzLm1fbWF0VSA9IF90aGlzLm1faGVzcy5tYXRyaXhRKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgY29tcGxleF9zY2h1cl9yZWR1Y2VfdG9faGVzc2VuYmVyZzxNYXRyaXhUeXBlLCBmYWxzZT4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiYgX3RoaXMsIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlVSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjpDb21wbGV4U2NhbGFyIENvbXBsZXhTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDb21wbGV4U2NodXI8TWF0cml4VHlwZT46OkNvbXBsZXhNYXRyaXhUeXBlIENvbXBsZXhNYXRyaXhUeXBlOworCisgICAgLy8gTm90ZTogbV9oZXNzIGlzIG92ZXIgUmVhbFNjYWxhcjsgbV9tYXRUIGFuZCBtX21hdFUgaXMgb3ZlciBDb21wbGV4U2NhbGFyCisgICAgX3RoaXMubV9oZXNzLmNvbXB1dGUobWF0cml4KTsKKyAgICBfdGhpcy5tX21hdFQgPSBfdGhpcy5tX2hlc3MubWF0cml4SCgpLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKTsKKyAgICBpZihjb21wdXRlVSkgIAorICAgIHsKKyAgICAgIC8vIFRoaXMgbWF5IGNhdXNlIGFuIGFsbG9jYXRpb24gd2hpY2ggc2VlbXMgdG8gYmUgYXZvaWRhYmxlCisgICAgICBNYXRyaXhUeXBlIFEgPSBfdGhpcy5tX2hlc3MubWF0cml4USgpOyAKKyAgICAgIF90aGlzLm1fbWF0VSA9IFEudGVtcGxhdGUgY2FzdDxDb21wbGV4U2NhbGFyPigpOworICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFJlZHVjZSB0aGUgSGVzc2VuYmVyZyBtYXRyaXggbV9tYXRUIHRvIHRyaWFuZ3VsYXIgZm9ybSBieSBRUiBpdGVyYXRpb24uCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBDb21wbGV4U2NodXI8TWF0cml4VHlwZT46OnJlZHVjZVRvVHJpYW5ndWxhckZvcm0oYm9vbCBjb21wdXRlVSkKK3sgIAorICAvLyBUaGUgbWF0cml4IG1fbWF0VCBpcyBkaXZpZGVkIGluIHRocmVlIHBhcnRzLiAKKyAgLy8gUm93cyAwLC4uLixpbC0xIGFyZSBkZWNvdXBsZWQgZnJvbSB0aGUgcmVzdCBiZWNhdXNlIG1fbWF0VChpbCxpbC0xKSBpcyB6ZXJvLiAKKyAgLy8gUm93cyBpbCwuLi4saXUgaXMgdGhlIHBhcnQgd2UgYXJlIHdvcmtpbmcgb24gKHRoZSBhY3RpdmUgc3VibWF0cml4KS4KKyAgLy8gUm93cyBpdSsxLC4uLixlbmQgYXJlIGFscmVhZHkgYnJvdWdodCBpbiB0cmlhbmd1bGFyIGZvcm0uCisgIEluZGV4IGl1ID0gbV9tYXRULmNvbHMoKSAtIDE7CisgIEluZGV4IGlsOworICBJbmRleCBpdGVyID0gMDsgLy8gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgd2UgYXJlIHdvcmtpbmcgb24gdGhlIChpdSxpdSkgZWxlbWVudAorCisgIHdoaWxlKHRydWUpCisgIHsKKyAgICAvLyBmaW5kIGl1LCB0aGUgYm90dG9tIHJvdyBvZiB0aGUgYWN0aXZlIHN1Ym1hdHJpeAorICAgIHdoaWxlKGl1ID4gMCkKKyAgICB7CisgICAgICBpZighc3ViZGlhZ29uYWxFbnRyeUlzTmVnbGVnaWJsZShpdS0xKSkgYnJlYWs7CisgICAgICBpdGVyID0gMDsKKyAgICAgIC0taXU7CisgICAgfQorCisgICAgLy8gaWYgaXUgaXMgemVybyB0aGVuIHdlIGFyZSBkb25lOyB0aGUgd2hvbGUgbWF0cml4IGlzIHRyaWFuZ3VsYXJpemVkCisgICAgaWYoaXU9PTApIGJyZWFrOworCisgICAgLy8gaWYgd2Ugc3BlbnQgdG9vIG1hbnkgaXRlcmF0aW9ucyBvbiB0aGUgY3VycmVudCBlbGVtZW50LCB3ZSBnaXZlIHVwCisgICAgaXRlcisrOworICAgIGlmKGl0ZXIgPiBtX21heEl0ZXJhdGlvbnMgKiBtX21hdFQuY29scygpKSBicmVhazsKKworICAgIC8vIGZpbmQgaWwsIHRoZSB0b3Agcm93IG9mIHRoZSBhY3RpdmUgc3VibWF0cml4CisgICAgaWwgPSBpdS0xOworICAgIHdoaWxlKGlsID4gMCAmJiAhc3ViZGlhZ29uYWxFbnRyeUlzTmVnbGVnaWJsZShpbC0xKSkKKyAgICB7CisgICAgICAtLWlsOworICAgIH0KKworICAgIC8qIHBlcmZvcm0gdGhlIFFSIHN0ZXAgdXNpbmcgR2l2ZW5zIHJvdGF0aW9ucy4gVGhlIGZpcnN0IHJvdGF0aW9uCisgICAgICAgY3JlYXRlcyBhIGJ1bGdlOyB0aGUgKGlsKzIsaWwpIGVsZW1lbnQgYmVjb21lcyBub256ZXJvLiBUaGlzCisgICAgICAgYnVsZ2UgaXMgY2hhc2VkIGRvd24gdG8gdGhlIGJvdHRvbSBvZiB0aGUgYWN0aXZlIHN1Ym1hdHJpeC4gKi8KKworICAgIENvbXBsZXhTY2FsYXIgc2hpZnQgPSBjb21wdXRlU2hpZnQoaXUsIGl0ZXIpOworICAgIEphY29iaVJvdGF0aW9uPENvbXBsZXhTY2FsYXI+IHJvdDsKKyAgICByb3QubWFrZUdpdmVucyhtX21hdFQuY29lZmYoaWwsaWwpIC0gc2hpZnQsIG1fbWF0VC5jb2VmZihpbCsxLGlsKSk7CisgICAgbV9tYXRULnJpZ2h0Q29scyhtX21hdFQuY29scygpLWlsKS5hcHBseU9uVGhlTGVmdChpbCwgaWwrMSwgcm90LmFkam9pbnQoKSk7CisgICAgbV9tYXRULnRvcFJvd3MoKHN0ZDo6bWluKShpbCsyLGl1KSsxKS5hcHBseU9uVGhlUmlnaHQoaWwsIGlsKzEsIHJvdCk7CisgICAgaWYoY29tcHV0ZVUpIG1fbWF0VS5hcHBseU9uVGhlUmlnaHQoaWwsIGlsKzEsIHJvdCk7CisKKyAgICBmb3IoSW5kZXggaT1pbCsxIDsgaTxpdSA7IGkrKykKKyAgICB7CisgICAgICByb3QubWFrZUdpdmVucyhtX21hdFQuY29lZmZSZWYoaSxpLTEpLCBtX21hdFQuY29lZmZSZWYoaSsxLGktMSksICZtX21hdFQuY29lZmZSZWYoaSxpLTEpKTsKKyAgICAgIG1fbWF0VC5jb2VmZlJlZihpKzEsaS0xKSA9IENvbXBsZXhTY2FsYXIoMCk7CisgICAgICBtX21hdFQucmlnaHRDb2xzKG1fbWF0VC5jb2xzKCktaSkuYXBwbHlPblRoZUxlZnQoaSwgaSsxLCByb3QuYWRqb2ludCgpKTsKKyAgICAgIG1fbWF0VC50b3BSb3dzKChzdGQ6Om1pbikoaSsyLGl1KSsxKS5hcHBseU9uVGhlUmlnaHQoaSwgaSsxLCByb3QpOworICAgICAgaWYoY29tcHV0ZVUpIG1fbWF0VS5hcHBseU9uVGhlUmlnaHQoaSwgaSsxLCByb3QpOworICAgIH0KKyAgfQorCisgIGlmKGl0ZXIgPD0gbV9tYXhJdGVyYXRpb25zICogbV9tYXRULmNvbHMoKSkgCisgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgZWxzZQorICAgIG1faW5mbyA9IE5vQ29udmVyZ2VuY2U7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgbV9tYXRVaXNVcHRvZGF0ZSA9IGNvbXB1dGVVOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTVBMRVhfU0NIVVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0NvbXBsZXhTY2h1cl9NS0wuaCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9Db21wbGV4U2NodXJfTUtMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExOGU2OQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9Db21wbGV4U2NodXJfTUtMLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICAgQ29tcGxleCBTY2h1ciBuZWVkZWQgdG8gY29tcGxleCB1bnN5bW1ldHJpY2FsIGVpZ2VudmFsdWVzL2VpZ2VudmVjdG9ycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9DT01QTEVYX1NDSFVSX01LTF9ICisjZGVmaW5lIEVJR0VOX0NPTVBMRVhfU0NIVVJfTUtMX0gKKworI2luY2x1ZGUgIkVpZ2VuL3NyYy9Db3JlL3V0aWwvTUtMX3N1cHBvcnQuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW50ZXJuYWwgU3BlY2lhbGl6YXRpb24gZm9yIHRoZSBkYXRhIHR5cGVzIHN1cHBvcnRlZCBieSBNS0wgKi8KKworI2RlZmluZSBFSUdFTl9NS0xfU0NIVVJfQ09NUExFWChFSUdUWVBFLCBNS0xUWVBFLCBNS0xQUkVGSVgsIE1LTFBSRUZJWF9VLCBFSUdDT0xST1csIE1LTENPTFJPVykgXAordGVtcGxhdGU8PiBpbmxpbmVcCitDb21wbGV4U2NodXI8TWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVz4gPiYgXAorQ29tcGxleFNjaHVyPE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1c+ID46OmNvbXB1dGUoY29uc3QgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVz4mIG1hdHJpeCwgYm9vbCBjb21wdXRlVSkgXAoreyBcCisgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVz4gTWF0cml4VHlwZTsgXAorICB0eXBlZGVmIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7IFwKKyAgdHlwZWRlZiBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7IFwKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gQ29tcGxleFNjYWxhcjsgXAorXAorICBhc3NlcnQobWF0cml4LmNvbHMoKSA9PSBtYXRyaXgucm93cygpKTsgXAorXAorICBtX21hdFVpc1VwdG9kYXRlID0gZmFsc2U7IFwKKyAgaWYobWF0cml4LmNvbHMoKSA9PSAxKSBcCisgIHsgXAorICAgIG1fbWF0VCA9IG1hdHJpeC5jYXN0PENvbXBsZXhTY2FsYXI+KCk7IFwKKyAgICBpZihjb21wdXRlVSkgIG1fbWF0VSA9IENvbXBsZXhNYXRyaXhUeXBlOjpJZGVudGl0eSgxLDEpOyBcCisgICAgICBtX2luZm8gPSBTdWNjZXNzOyBcCisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOyBcCisgICAgICBtX21hdFVpc1VwdG9kYXRlID0gY29tcHV0ZVU7IFwKKyAgICAgIHJldHVybiAqdGhpczsgXAorICB9IFwKKyAgbGFwYWNrX2ludCBuID0gbWF0cml4LmNvbHMoKSwgc2RpbSwgaW5mbzsgXAorICBsYXBhY2tfaW50IGxkYSA9IG1hdHJpeC5vdXRlclN0cmlkZSgpOyBcCisgIGxhcGFja19pbnQgbWF0cml4X29yZGVyID0gTUtMQ09MUk9XOyBcCisgIGNoYXIgam9idnMsIHNvcnQ9J04nOyBcCisgIExBUEFDS18jI01LTFBSRUZJWF9VIyNfU0VMRUNUMSBzZWxlY3QgPSAwOyBcCisgIGpvYnZzID0gKGNvbXB1dGVVKSA/ICdWJyA6ICdOJzsgXAorICBtX21hdFUucmVzaXplKG4sIG4pOyBcCisgIGxhcGFja19pbnQgbGR2cyAgPSBtX21hdFUub3V0ZXJTdHJpZGUoKTsgXAorICBtX21hdFQgPSBtYXRyaXg7IFwKKyAgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWM+IHc7IFwKKyAgdy5yZXNpemUobiwgMSk7XAorICBpbmZvID0gTEFQQUNLRV8jI01LTFBSRUZJWCMjZ2VlcyggbWF0cml4X29yZGVyLCBqb2J2cywgc29ydCwgc2VsZWN0LCBuLCAoTUtMVFlQRSopbV9tYXRULmRhdGEoKSwgbGRhLCAmc2RpbSwgKE1LTFRZUEUqKXcuZGF0YSgpLCAoTUtMVFlQRSopbV9tYXRVLmRhdGEoKSwgbGR2cyApOyBcCisgIGlmKGluZm8gPT0gMCkgXAorICAgIG1faW5mbyA9IFN1Y2Nlc3M7IFwKKyAgZWxzZSBcCisgICAgbV9pbmZvID0gTm9Db252ZXJnZW5jZTsgXAorXAorICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOyBcCisgIG1fbWF0VWlzVXB0b2RhdGUgPSBjb21wdXRlVTsgXAorICByZXR1cm4gKnRoaXM7IFwKK1wKK30KKworRUlHRU5fTUtMX1NDSFVSX0NPTVBMRVgoZGNvbXBsZXgsIE1LTF9Db21wbGV4MTYsIHosIFosIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTUtMX1NDSFVSX0NPTVBMRVgoc2NvbXBsZXgsIE1LTF9Db21wbGV4OCwgIGMsIEMsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTUtMX1NDSFVSX0NPTVBMRVgoZGNvbXBsZXgsIE1LTF9Db21wbGV4MTYsIHosIFosIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorRUlHRU5fTUtMX1NDSFVSX0NPTVBMRVgoc2NvbXBsZXgsIE1LTF9Db21wbGV4OCwgIGMsIEMsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTVBMRVhfU0NIVVJfTUtMX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9FaWdlblNvbHZlci5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0VpZ2VuU29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2ZmYyYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9FaWdlblNvbHZlci5oCkBAIC0wLDAgKzEsNTc5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9FSUdFTlNPTFZFUl9ICisjZGVmaW5lIEVJR0VOX0VJR0VOU09MVkVSX0gKKworI2luY2x1ZGUgIi4vUmVhbFNjaHVyLmgiCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGVpZ2VudmFsdWVzX21vZHVsZSBcaW5ncm91cCBFaWdlbnZhbHVlc19Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIEVpZ2VuU29sdmVyCisgICoKKyAgKiBcYnJpZWYgQ29tcHV0ZXMgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBnZW5lcmFsIG1hdHJpY2VzCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUKKyAgKiBlaWdlbmRlY29tcG9zaXRpb247IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4CisgICogY2xhc3MgdGVtcGxhdGUuIEN1cnJlbnRseSwgb25seSByZWFsIG1hdHJpY2VzIGFyZSBzdXBwb3J0ZWQuCisgICoKKyAgKiBUaGUgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBhIG1hdHJpeCBcZiQgQSBcZiQgYXJlIHNjYWxhcnMKKyAgKiBcZiQgXGxhbWJkYSBcZiQgYW5kIHZlY3RvcnMgXGYkIHYgXGYkIHN1Y2ggdGhhdCBcZiQgQXYgPSBcbGFtYmRhIHYgXGYkLiAgSWYKKyAgKiBcZiQgRCBcZiQgaXMgYSBkaWFnb25hbCBtYXRyaXggd2l0aCB0aGUgZWlnZW52YWx1ZXMgb24gdGhlIGRpYWdvbmFsLCBhbmQKKyAgKiBcZiQgViBcZiQgaXMgYSBtYXRyaXggd2l0aCB0aGUgZWlnZW52ZWN0b3JzIGFzIGl0cyBjb2x1bW5zLCB0aGVuIFxmJCBBIFYgPQorICAqIFYgRCBcZiQuIFRoZSBtYXRyaXggXGYkIFYgXGYkIGlzIGFsbW9zdCBhbHdheXMgaW52ZXJ0aWJsZSwgaW4gd2hpY2ggY2FzZSB3ZQorICAqIGhhdmUgXGYkIEEgPSBWIEQgVl57LTF9IFxmJC4gVGhpcyBpcyBjYWxsZWQgdGhlIGVpZ2VuZGVjb21wb3NpdGlvbi4KKyAgKgorICAqIFRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGEgbWF0cml4IG1heSBiZSBjb21wbGV4LCBldmVuIHdoZW4gdGhlCisgICogbWF0cml4IGlzIHJlYWwuIEhvd2V2ZXIsIHdlIGNhbiBjaG9vc2UgcmVhbCBtYXRyaWNlcyBcZiQgViBcZiQgYW5kIFxmJCBECisgICogXGYkIHNhdGlzZnlpbmcgXGYkIEEgViA9IFYgRCBcZiQsIGp1c3QgbGlrZSB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uLCBpZiB0aGUKKyAgKiBtYXRyaXggXGYkIEQgXGYkIGlzIG5vdCByZXF1aXJlZCB0byBiZSBkaWFnb25hbCwgYnV0IGlmIGl0IGlzIGFsbG93ZWQgdG8KKyAgKiBoYXZlIGJsb2NrcyBvZiB0aGUgZm9ybQorICAqIFxmWyBcYmVnaW57Ym1hdHJpeH0gdSAmIHYgXFwgLXYgJiB1IFxlbmR7Ym1hdHJpeH0gXGZdCisgICogKHdoZXJlIFxmJCB1IFxmJCBhbmQgXGYkIHYgXGYkIGFyZSByZWFsIG51bWJlcnMpIG9uIHRoZSBkaWFnb25hbC4gIFRoZXNlCisgICogYmxvY2tzIGNvcnJlc3BvbmQgdG8gY29tcGxleCBlaWdlbnZhbHVlIHBhaXJzIFxmJCB1IFxwbSBpdiBcZiQuIFdlIGNhbGwKKyAgKiB0aGlzIHZhcmlhbnQgb2YgdGhlIGVpZ2VuZGVjb21wb3NpdGlvbiB0aGUgcHNldWRvLWVpZ2VuZGVjb21wb3NpdGlvbi4KKyAgKgorICAqIENhbGwgdGhlIGZ1bmN0aW9uIGNvbXB1dGUoKSB0byBjb21wdXRlIHRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mCisgICogYSBnaXZlbiBtYXRyaXguIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSAKKyAgKiBFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgY29uc3RydWN0b3Igd2hpY2ggY29tcHV0ZXMgdGhlCisgICogZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gT25jZSB0aGUgZWlnZW52YWx1ZSBhbmQKKyAgKiBlaWdlbnZlY3RvcnMgYXJlIGNvbXB1dGVkLCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgd2l0aCB0aGUgZWlnZW52YWx1ZXMoKSBhbmQKKyAgKiBlaWdlbnZlY3RvcnMoKSBmdW5jdGlvbnMuIFRoZSBwc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkgYW5kCisgICogcHNldWRvRWlnZW52ZWN0b3JzKCkgbWV0aG9kcyBhbGxvdyB0aGUgY29uc3RydWN0aW9uIG9mIHRoZQorICAqIHBzZXVkby1laWdlbmRlY29tcG9zaXRpb24uCisgICoKKyAgKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgRWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wpIGNvbnRhaW5zIGFuCisgICogZXhhbXBsZSBvZiB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBjbGFzcy4KKyAgKgorICAqIFxub3RlIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhZGFwdGVkIGZyb20KKyAgKiA8YSBocmVmPSJodHRwOi8vbWF0aC5uaXN0Lmdvdi9qYXZhbnVtZXJpY3MvamFtYS8iPkpBTUE8L2E+IChwdWJsaWMgZG9tYWluKS4KKyAgKiBUaGVpciBjb2RlIGlzIGJhc2VkIG9uIEVJU1BBQ0suCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6ZWlnZW52YWx1ZXMoKSwgY2xhc3MgQ29tcGxleEVpZ2VuU29sdmVyLCBjbGFzcyBTZWxmQWRqb2ludEVpZ2VuU29sdmVyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgRWlnZW5Tb2x2ZXIKK3sKKyAgcHVibGljOgorCisgICAgLyoqIFxicmllZiBTeW5vbnltIGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxwIF9NYXRyaXhUeXBlLiAqLworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKworICAgIGVudW0geworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICBPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucywKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgfTsKKworICAgIC8qKiBcYnJpZWYgU2NhbGFyIHR5cGUgZm9yIG1hdHJpY2VzIG9mIHR5cGUgI01hdHJpeFR5cGUuICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgICAgLyoqIFxicmllZiBDb21wbGV4IHNjYWxhciB0eXBlIGZvciAjTWF0cml4VHlwZS4gCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgXGMgc3RkOjpjb21wbGV4PFNjYWxhcj4gaWYgI1NjYWxhciBpcyByZWFsIChlLmcuLAorICAgICAgKiBcYyBmbG9hdCBvciBcYyBkb3VibGUpIGFuZCBqdXN0IFxjIFNjYWxhciBpZiAjU2NhbGFyIGlzCisgICAgICAqIGNvbXBsZXguCisgICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisKKyAgICAvKiogXGJyaWVmIFR5cGUgZm9yIHZlY3RvciBvZiBlaWdlbnZhbHVlcyBhcyByZXR1cm5lZCBieSBlaWdlbnZhbHVlcygpLiAKKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBhIGNvbHVtbiB2ZWN0b3Igd2l0aCBlbnRyaWVzIG9mIHR5cGUgI0NvbXBsZXhTY2FsYXIuCisgICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIHZlY3RvciBpcyB0aGUgc2l6ZSBvZiAjTWF0cml4VHlwZS4KKyAgICAgICovCisgICAgdHlwZWRlZiBNYXRyaXg8Q29tcGxleFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heENvbHNBdENvbXBpbGVUaW1lLCAxPiBFaWdlbnZhbHVlVHlwZTsKKworICAgIC8qKiBcYnJpZWYgVHlwZSBmb3IgbWF0cml4IG9mIGVpZ2VudmVjdG9ycyBhcyByZXR1cm5lZCBieSBlaWdlbnZlY3RvcnMoKS4gCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSBzcXVhcmUgbWF0cml4IHdpdGggZW50cmllcyBvZiB0eXBlICNDb21wbGV4U2NhbGFyLiAKKyAgICAgICogVGhlIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgI01hdHJpeFR5cGUuCisgICAgICAqLworICAgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSwgT3B0aW9ucywgTWF4Um93c0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBFaWdlbnZlY3RvcnNUeXBlOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBFaWdlblNvbHZlcjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkgZm9yIGFuIGV4YW1wbGUuCisgICAgICAqLworIEVpZ2VuU29sdmVyKCkgOiBtX2VpdmVjKCksIG1fZWl2YWx1ZXMoKSwgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwgbV9yZWFsU2NodXIoKSwgbV9tYXRUKCksIG1fdG1wKCkge30KKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAgICAqCisgICAgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIFxhIHNpemUuCisgICAgICAqIFxzYSBFaWdlblNvbHZlcigpCisgICAgICAqLworICAgIEVpZ2VuU29sdmVyKEluZGV4IHNpemUpCisgICAgICA6IG1fZWl2ZWMoc2l6ZSwgc2l6ZSksCisgICAgICAgIG1fZWl2YWx1ZXMoc2l6ZSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1fZWlnZW52ZWN0b3JzT2soZmFsc2UpLAorICAgICAgICBtX3JlYWxTY2h1cihzaXplKSwKKyAgICAgICAgbV9tYXRUKHNpemUsIHNpemUpLCAKKyAgICAgICAgbV90bXAoc2l6ZSkKKyAgICB7fQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RvcjsgY29tcHV0ZXMgZWlnZW5kZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4gCisgICAgICAqIAorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggIFNxdWFyZSBtYXRyaXggd2hvc2UgZWlnZW5kZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlRWlnZW52ZWN0b3JzICBJZiB0cnVlLCBib3RoIHRoZSBlaWdlbnZlY3RvcnMgYW5kIHRoZQorICAgICAgKiAgICBlaWdlbnZhbHVlcyBhcmUgY29tcHV0ZWQ7IGlmIGZhbHNlLCBvbmx5IHRoZSBlaWdlbnZhbHVlcyBhcmUKKyAgICAgICogICAgY29tcHV0ZWQuIAorICAgICAgKgorICAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGNvbXB1dGUoKSB0byBjb21wdXRlIHRoZSBlaWdlbnZhbHVlcworICAgICAgKiBhbmQgZWlnZW52ZWN0b3JzLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBFaWdlblNvbHZlcl9FaWdlblNvbHZlcl9NYXRyaXhUeXBlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBFaWdlblNvbHZlcl9FaWdlblNvbHZlcl9NYXRyaXhUeXBlLm91dAorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgICAqLworICAgIEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlRWlnZW52ZWN0b3JzID0gdHJ1ZSkKKyAgICAgIDogbV9laXZlYyhtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9laXZhbHVlcyhtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV9laWdlbnZlY3RvcnNPayhmYWxzZSksCisgICAgICAgIG1fcmVhbFNjaHVyKG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX21hdFQobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSksIAorICAgICAgICBtX3RtcChtYXRyaXguY29scygpKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4LCBjb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGVpZ2VudmVjdG9ycyBvZiBnaXZlbiBtYXRyaXguIAorICAgICAgKgorICAgICAgKiBccmV0dXJucyAgJU1hdHJpeCB3aG9zZSBjb2x1bW5zIGFyZSB0aGUgKHBvc3NpYmx5IGNvbXBsZXgpIGVpZ2VudmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIAorICAgICAgKiBFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJixib29sKSBvciB0aGUgbWVtYmVyIGZ1bmN0aW9uCisgICAgICAqIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIGFuZAorICAgICAgKiBccCBjb21wdXRlRWlnZW52ZWN0b3JzIHdhcyBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQpLgorICAgICAgKgorICAgICAgKiBDb2x1bW4gXGYkIGsgXGYkIG9mIHRoZSByZXR1cm5lZCBtYXRyaXggaXMgYW4gZWlnZW52ZWN0b3IgY29ycmVzcG9uZGluZworICAgICAgKiB0byBlaWdlbnZhbHVlIG51bWJlciBcZiQgayBcZiQgYXMgcmV0dXJuZWQgYnkgZWlnZW52YWx1ZXMoKS4gIFRoZQorICAgICAgKiBlaWdlbnZlY3RvcnMgYXJlIG5vcm1hbGl6ZWQgdG8gaGF2ZSAoRXVjbGlkZWFuKSBub3JtIGVxdWFsIHRvIG9uZS4gVGhlCisgICAgICAqIG1hdHJpeCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBtYXRyaXggXGYkIFYgXGYkIGluIHRoZQorICAgICAgKiBlaWdlbmRlY29tcG9zaXRpb24gXGYkIEEgPSBWIEQgVl57LTF9IFxmJCwgaWYgaXQgZXhpc3RzLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIGVpZ2VudmFsdWVzKCksIHBzZXVkb0VpZ2VudmVjdG9ycygpCisgICAgICAqLworICAgIEVpZ2VudmVjdG9yc1R5cGUgZWlnZW52ZWN0b3JzKCkgY29uc3Q7CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIHBzZXVkby1laWdlbnZlY3RvcnMgb2YgZ2l2ZW4gbWF0cml4LiAKKyAgICAgICoKKyAgICAgICogXHJldHVybnMgIENvbnN0IHJlZmVyZW5jZSB0byBtYXRyaXggd2hvc2UgY29sdW1ucyBhcmUgdGhlIHBzZXVkby1laWdlbnZlY3RvcnMuCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciAKKyAgICAgICogRWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYsYm9vbCkgb3IgdGhlIG1lbWJlciBmdW5jdGlvbgorICAgICAgKiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCBhbmQKKyAgICAgICogXHAgY29tcHV0ZUVpZ2VudmVjdG9ycyB3YXMgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0KS4KKyAgICAgICoKKyAgICAgICogVGhlIHJlYWwgbWF0cml4IFxmJCBWIFxmJCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUKKyAgICAgICogYmxvY2stZGlhZ29uYWwgbWF0cml4IFxmJCBEIFxmJCByZXR1cm5lZCBieSBwc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkKKyAgICAgICogc2F0aXNmeSBcZiQgQVYgPSBWRCBcZiQuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEVpZ2VuU29sdmVyX3BzZXVkb0VpZ2VudmVjdG9ycy5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRWlnZW5Tb2x2ZXJfcHNldWRvRWlnZW52ZWN0b3JzLm91dAorICAgICAgKgorICAgICAgKiBcc2EgcHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpLCBlaWdlbnZlY3RvcnMoKQorICAgICAgKi8KKyAgICBjb25zdCBNYXRyaXhUeXBlJiBwc2V1ZG9FaWdlbnZlY3RvcnMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2VpZ2VudmVjdG9yc09rICYmICJUaGUgZWlnZW52ZWN0b3JzIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgdG9nZXRoZXIgd2l0aCB0aGUgZWlnZW52YWx1ZXMuIik7CisgICAgICByZXR1cm4gbV9laXZlYzsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGJsb2NrLWRpYWdvbmFsIG1hdHJpeCBpbiB0aGUgcHNldWRvLWVpZ2VuZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgIEEgYmxvY2stZGlhZ29uYWwgbWF0cml4LgorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgCisgICAgICAqIEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmLGJvb2wpIG9yIHRoZSBtZW1iZXIgZnVuY3Rpb24KKyAgICAgICogY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZS4KKyAgICAgICoKKyAgICAgICogVGhlIG1hdHJpeCBcZiQgRCBcZiQgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyByZWFsIGFuZAorICAgICAgKiBibG9jay1kaWFnb25hbC4gVGhlIGJsb2NrcyBvbiB0aGUgZGlhZ29uYWwgYXJlIGVpdGhlciAxLWJ5LTEgb3IgMi1ieS0yCisgICAgICAqIGJsb2NrcyBvZiB0aGUgZm9ybQorICAgICAgKiBcZiQgXGJlZ2lue2JtYXRyaXh9IHUgJiB2IFxcIC12ICYgdSBcZW5ke2JtYXRyaXh9IFxmJC4KKyAgICAgICogVGhlc2UgYmxvY2tzIGFyZSBub3Qgc29ydGVkIGluIGFueSBwYXJ0aWN1bGFyIG9yZGVyLgorICAgICAgKiBUaGUgbWF0cml4IFxmJCBEIFxmJCBhbmQgdGhlIG1hdHJpeCBcZiQgViBcZiQgcmV0dXJuZWQgYnkKKyAgICAgICogcHNldWRvRWlnZW52ZWN0b3JzKCkgc2F0aXNmeSBcZiQgQVYgPSBWRCBcZiQuCisgICAgICAqCisgICAgICAqIFxzYSBwc2V1ZG9FaWdlbnZlY3RvcnMoKSBmb3IgYW4gZXhhbXBsZSwgZWlnZW52YWx1ZXMoKQorICAgICAgKi8KKyAgICBNYXRyaXhUeXBlIHBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSBjb25zdDsKKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgZWlnZW52YWx1ZXMgb2YgZ2l2ZW4gbWF0cml4LiAKKyAgICAgICoKKyAgICAgICogXHJldHVybnMgQSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGNvbHVtbiB2ZWN0b3IgY29udGFpbmluZyB0aGUgZWlnZW52YWx1ZXMuCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciAKKyAgICAgICogRWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYsYm9vbCkgb3IgdGhlIG1lbWJlciBmdW5jdGlvbgorICAgICAgKiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLgorICAgICAgKgorICAgICAgKiBUaGUgZWlnZW52YWx1ZXMgYXJlIHJlcGVhdGVkIGFjY29yZGluZyB0byB0aGVpciBhbGdlYnJhaWMgbXVsdGlwbGljaXR5LAorICAgICAgKiBzbyB0aGVyZSBhcmUgYXMgbWFueSBlaWdlbnZhbHVlcyBhcyByb3dzIGluIHRoZSBtYXRyaXguIFRoZSBlaWdlbnZhbHVlcyAKKyAgICAgICogYXJlIG5vdCBzb3J0ZWQgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXIuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBFaWdlblNvbHZlcl9laWdlbnZhbHVlcy5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIGVpZ2VudmVjdG9ycygpLCBwc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCksCisgICAgICAqICAgICBNYXRyaXhCYXNlOjplaWdlbnZhbHVlcygpCisgICAgICAqLworICAgIGNvbnN0IEVpZ2VudmFsdWVUeXBlJiBlaWdlbnZhbHVlcygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRWlnZW5Tb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fZWl2YWx1ZXM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlcyBlaWdlbmRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LiAKKyAgICAgICogCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdHJpeCAgU3F1YXJlIG1hdHJpeCB3aG9zZSBlaWdlbmRlY29tcG9zaXRpb24gaXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIGNvbXB1dGVFaWdlbnZlY3RvcnMgIElmIHRydWUsIGJvdGggdGhlIGVpZ2VudmVjdG9ycyBhbmQgdGhlCisgICAgICAqICAgIGVpZ2VudmFsdWVzIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgdGhlIGVpZ2VudmFsdWVzIGFyZQorICAgICAgKiAgICBjb21wdXRlZC4gCisgICAgICAqIFxyZXR1cm5zICAgIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgcmVhbCBtYXRyaXggXHAgbWF0cml4LgorICAgICAgKiBUaGUgZWlnZW52YWx1ZXMoKSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGVtLiAgSWYgCisgICAgICAqIFxwIGNvbXB1dGVFaWdlbnZlY3RvcnMgaXMgdHJ1ZSwgdGhlbiB0aGUgZWlnZW52ZWN0b3JzIGFyZSBhbHNvIGNvbXB1dGVkCisgICAgICAqIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgZWlnZW52ZWN0b3JzKCkuCisgICAgICAqCisgICAgICAqIFRoZSBtYXRyaXggaXMgZmlyc3QgcmVkdWNlZCB0byByZWFsIFNjaHVyIGZvcm0gdXNpbmcgdGhlIFJlYWxTY2h1cgorICAgICAgKiBjbGFzcy4gVGhlIFNjaHVyIGRlY29tcG9zaXRpb24gaXMgdGhlbiB1c2VkIHRvIGNvbXB1dGUgdGhlIGVpZ2VudmFsdWVzCisgICAgICAqIGFuZCBlaWdlbnZlY3RvcnMuCisgICAgICAqCisgICAgICAqIFRoZSBjb3N0IG9mIHRoZSBjb21wdXRhdGlvbiBpcyBkb21pbmF0ZWQgYnkgdGhlIGNvc3Qgb2YgdGhlCisgICAgICAqIFNjaHVyIGRlY29tcG9zaXRpb24sIHdoaWNoIGlzIHZlcnkgYXBwcm94aW1hdGVseSBcZiQgMjVuXjMgXGYkCisgICAgICAqICh3aGVyZSBcZiQgbiBcZiQgaXMgdGhlIHNpemUgb2YgdGhlIG1hdHJpeCkgaWYgXHAgY29tcHV0ZUVpZ2VudmVjdG9ycyAKKyAgICAgICogaXMgdHJ1ZSwgYW5kIFxmJCAxMG5eMyBcZiQgaWYgXHAgY29tcHV0ZUVpZ2VudmVjdG9ycyBpcyBmYWxzZS4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgcmV1c2VzIG9mIHRoZSBhbGxvY2F0ZWQgZGF0YSBpbiB0aGUgRWlnZW5Tb2x2ZXIgb2JqZWN0LgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBFaWdlblNvbHZlcl9jb21wdXRlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBFaWdlblNvbHZlcl9jb21wdXRlLm91dAorICAgICAgKi8KKyAgICBFaWdlblNvbHZlciYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycyA9IHRydWUpOworCisgICAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX3JlYWxTY2h1ci5pbmZvKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBkb0NvbXB1dGVFaWdlbnZlY3RvcnMoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZSBtX2VpdmVjOworICAgIEVpZ2VudmFsdWVUeXBlIG1fZWl2YWx1ZXM7CisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtX2VpZ2VudmVjdG9yc09rOworICAgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiBtX3JlYWxTY2h1cjsKKyAgICBNYXRyaXhUeXBlIG1fbWF0VDsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heENvbHNBdENvbXBpbGVUaW1lLCAxPiBDb2x1bW5WZWN0b3JUeXBlOworICAgIENvbHVtblZlY3RvclR5cGUgbV90bXA7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorTWF0cml4VHlwZSBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPjo6cHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgSW5kZXggbiA9IG1fZWl2YWx1ZXMucm93cygpOworICBNYXRyaXhUeXBlIG1hdEQgPSBNYXRyaXhUeXBlOjpaZXJvKG4sbik7CisgIGZvciAoSW5kZXggaT0wOyBpPG47ICsraSkKKyAgeworICAgIGlmIChpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oaW50ZXJuYWw6OmltYWcobV9laXZhbHVlcy5jb2VmZihpKSksIGludGVybmFsOjpyZWFsKG1fZWl2YWx1ZXMuY29lZmYoaSkpKSkKKyAgICAgIG1hdEQuY29lZmZSZWYoaSxpKSA9IGludGVybmFsOjpyZWFsKG1fZWl2YWx1ZXMuY29lZmYoaSkpOworICAgIGVsc2UKKyAgICB7CisgICAgICBtYXRELnRlbXBsYXRlIGJsb2NrPDIsMj4oaSxpKSA8PCAgaW50ZXJuYWw6OnJlYWwobV9laXZhbHVlcy5jb2VmZihpKSksIGludGVybmFsOjppbWFnKG1fZWl2YWx1ZXMuY29lZmYoaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWludGVybmFsOjppbWFnKG1fZWl2YWx1ZXMuY29lZmYoaSkpLCBpbnRlcm5hbDo6cmVhbChtX2VpdmFsdWVzLmNvZWZmKGkpKTsKKyAgICAgICsraTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1hdEQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPjo6RWlnZW52ZWN0b3JzVHlwZSBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPjo6ZWlnZW52ZWN0b3JzKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRWlnZW5Tb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9laWdlbnZlY3RvcnNPayAmJiAiVGhlIGVpZ2VudmVjdG9ycyBoYXZlIG5vdCBiZWVuIGNvbXB1dGVkIHRvZ2V0aGVyIHdpdGggdGhlIGVpZ2VudmFsdWVzLiIpOworICBJbmRleCBuID0gbV9laXZlYy5jb2xzKCk7CisgIEVpZ2VudmVjdG9yc1R5cGUgbWF0VihuLG4pOworICBmb3IgKEluZGV4IGo9MDsgajxuOyArK2opCisgIHsKKyAgICBpZiAoaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGludGVybmFsOjppbWFnKG1fZWl2YWx1ZXMuY29lZmYoaikpLCBpbnRlcm5hbDo6cmVhbChtX2VpdmFsdWVzLmNvZWZmKGopKSkgfHwgaisxPT1uKQorICAgIHsKKyAgICAgIC8vIHdlIGhhdmUgYSByZWFsIGVpZ2VuIHZhbHVlCisgICAgICBtYXRWLmNvbChqKSA9IG1fZWl2ZWMuY29sKGopLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKTsKKyAgICAgIG1hdFYuY29sKGopLm5vcm1hbGl6ZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gd2UgaGF2ZSBhIHBhaXIgb2YgY29tcGxleCBlaWdlbiB2YWx1ZXMKKyAgICAgIGZvciAoSW5kZXggaT0wOyBpPG47ICsraSkKKyAgICAgIHsKKyAgICAgICAgbWF0Vi5jb2VmZlJlZihpLGopICAgPSBDb21wbGV4U2NhbGFyKG1fZWl2ZWMuY29lZmYoaSxqKSwgIG1fZWl2ZWMuY29lZmYoaSxqKzEpKTsKKyAgICAgICAgbWF0Vi5jb2VmZlJlZihpLGorMSkgPSBDb21wbGV4U2NhbGFyKG1fZWl2ZWMuY29lZmYoaSxqKSwgLW1fZWl2ZWMuY29lZmYoaSxqKzEpKTsKKyAgICAgIH0KKyAgICAgIG1hdFYuY29sKGopLm5vcm1hbGl6ZSgpOworICAgICAgbWF0Vi5jb2woaisxKS5ub3JtYWxpemUoKTsKKyAgICAgICsrajsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1hdFY7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiYgRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT46OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMpCit7CisgIGFzc2VydChtYXRyaXguY29scygpID09IG1hdHJpeC5yb3dzKCkpOworCisgIC8vIFJlZHVjZSB0byByZWFsIFNjaHVyIGZvcm0uCisgIG1fcmVhbFNjaHVyLmNvbXB1dGUobWF0cml4LCBjb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgaWYgKG1fcmVhbFNjaHVyLmluZm8oKSA9PSBTdWNjZXNzKQorICB7CisgICAgbV9tYXRUID0gbV9yZWFsU2NodXIubWF0cml4VCgpOworICAgIGlmIChjb21wdXRlRWlnZW52ZWN0b3JzKQorICAgICAgbV9laXZlYyA9IG1fcmVhbFNjaHVyLm1hdHJpeFUoKTsKKyAgCisgICAgLy8gQ29tcHV0ZSBlaWdlbnZhbHVlcyBmcm9tIG1hdFQKKyAgICBtX2VpdmFsdWVzLnJlc2l6ZShtYXRyaXguY29scygpKTsKKyAgICBJbmRleCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IG1hdHJpeC5jb2xzKCkpIAorICAgIHsKKyAgICAgIGlmIChpID09IG1hdHJpeC5jb2xzKCkgLSAxIHx8IG1fbWF0VC5jb2VmZihpKzEsIGkpID09IFNjYWxhcigwKSkgCisgICAgICB7CisgICAgICAgIG1fZWl2YWx1ZXMuY29lZmZSZWYoaSkgPSBtX21hdFQuY29lZmYoaSwgaSk7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyIHAgPSBTY2FsYXIoMC41KSAqIChtX21hdFQuY29lZmYoaSwgaSkgLSBtX21hdFQuY29lZmYoaSsxLCBpKzEpKTsKKyAgICAgICAgU2NhbGFyIHogPSBpbnRlcm5hbDo6c3FydChpbnRlcm5hbDo6YWJzKHAgKiBwICsgbV9tYXRULmNvZWZmKGkrMSwgaSkgKiBtX21hdFQuY29lZmYoaSwgaSsxKSkpOworICAgICAgICBtX2VpdmFsdWVzLmNvZWZmUmVmKGkpICAgPSBDb21wbGV4U2NhbGFyKG1fbWF0VC5jb2VmZihpKzEsIGkrMSkgKyBwLCB6KTsKKyAgICAgICAgbV9laXZhbHVlcy5jb2VmZlJlZihpKzEpID0gQ29tcGxleFNjYWxhcihtX21hdFQuY29lZmYoaSsxLCBpKzEpICsgcCwgLXopOworICAgICAgICBpICs9IDI7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIENvbXB1dGUgZWlnZW52ZWN0b3JzLgorICAgIGlmIChjb21wdXRlRWlnZW52ZWN0b3JzKQorICAgICAgZG9Db21wdXRlRWlnZW52ZWN0b3JzKCk7CisgIH0KKworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICBtX2VpZ2VudmVjdG9yc09rID0gY29tcHV0ZUVpZ2VudmVjdG9yczsKKworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIENvbXBsZXggc2NhbGFyIGRpdmlzaW9uLgordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RkOjpjb21wbGV4PFNjYWxhcj4gY2RpdihTY2FsYXIgeHIsIFNjYWxhciB4aSwgU2NhbGFyIHlyLCBTY2FsYXIgeWkpCit7CisgIFNjYWxhciByLGQ7CisgIGlmIChpbnRlcm5hbDo6YWJzKHlyKSA+IGludGVybmFsOjphYnMoeWkpKQorICB7CisgICAgICByID0geWkveXI7CisgICAgICBkID0geXIgKyByKnlpOworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxTY2FsYXI+KCh4ciArIHIqeGkpL2QsICh4aSAtIHIqeHIpL2QpOworICB9CisgIGVsc2UKKyAgeworICAgICAgciA9IHlyL3lpOworICAgICAgZCA9IHlpICsgcip5cjsKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8U2NhbGFyPigocip4ciArIHhpKS9kLCAocip4aSAtIHhyKS9kKTsKKyAgfQorfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+Ojpkb0NvbXB1dGVFaWdlbnZlY3RvcnMoKQoreworICBjb25zdCBJbmRleCBzaXplID0gbV9laXZlYy5jb2xzKCk7CisgIGNvbnN0IFNjYWxhciBlcHMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworCisgIC8vIGluZWZmaWNpZW50ISB0aGlzIGlzIGFscmVhZHkgY29tcHV0ZWQgaW4gUmVhbFNjaHVyCisgIFNjYWxhciBub3JtKDApOworICBmb3IgKEluZGV4IGogPSAwOyBqIDwgc2l6ZTsgKytqKQorICB7CisgICAgbm9ybSArPSBtX21hdFQucm93KGopLnNlZ21lbnQoKHN0ZDo6bWF4KShqLTEsSW5kZXgoMCkpLCBzaXplLShzdGQ6Om1heCkoai0xLEluZGV4KDApKSkuY3dpc2VBYnMoKS5zdW0oKTsKKyAgfQorICAKKyAgLy8gQmFja3N1YnN0aXR1dGUgdG8gZmluZCB2ZWN0b3JzIG9mIHVwcGVyIHRyaWFuZ3VsYXIgZm9ybQorICBpZiAobm9ybSA9PSAwLjApCisgIHsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKEluZGV4IG4gPSBzaXplLTE7IG4gPj0gMDsgbi0tKQorICB7CisgICAgU2NhbGFyIHAgPSBtX2VpdmFsdWVzLmNvZWZmKG4pLnJlYWwoKTsKKyAgICBTY2FsYXIgcSA9IG1fZWl2YWx1ZXMuY29lZmYobikuaW1hZygpOworCisgICAgLy8gU2NhbGFyIHZlY3RvcgorICAgIGlmIChxID09IFNjYWxhcigwKSkKKyAgICB7CisgICAgICBTY2FsYXIgbGFzdHIoMCksIGxhc3R3KDApOworICAgICAgSW5kZXggbCA9IG47CisKKyAgICAgIG1fbWF0VC5jb2VmZlJlZihuLG4pID0gMS4wOworICAgICAgZm9yIChJbmRleCBpID0gbi0xOyBpID49IDA7IGktLSkKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyIHcgPSBtX21hdFQuY29lZmYoaSxpKSAtIHA7CisgICAgICAgIFNjYWxhciByID0gbV9tYXRULnJvdyhpKS5zZWdtZW50KGwsbi1sKzEpLmRvdChtX21hdFQuY29sKG4pLnNlZ21lbnQobCwgbi1sKzEpKTsKKworICAgICAgICBpZiAobV9laXZhbHVlcy5jb2VmZihpKS5pbWFnKCkgPCAwLjApCisgICAgICAgIHsKKyAgICAgICAgICBsYXN0dyA9IHc7CisgICAgICAgICAgbGFzdHIgPSByOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGwgPSBpOworICAgICAgICAgIGlmIChtX2VpdmFsdWVzLmNvZWZmKGkpLmltYWcoKSA9PSAwLjApCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKHcgIT0gMC4wKQorICAgICAgICAgICAgICBtX21hdFQuY29lZmZSZWYoaSxuKSA9IC1yIC8gdzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbV9tYXRULmNvZWZmUmVmKGksbikgPSAtciAvIChlcHMgKiBub3JtKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSAvLyBTb2x2ZSByZWFsIGVxdWF0aW9ucworICAgICAgICAgIHsKKyAgICAgICAgICAgIFNjYWxhciB4ID0gbV9tYXRULmNvZWZmKGksaSsxKTsKKyAgICAgICAgICAgIFNjYWxhciB5ID0gbV9tYXRULmNvZWZmKGkrMSxpKTsKKyAgICAgICAgICAgIFNjYWxhciBkZW5vbSA9IChtX2VpdmFsdWVzLmNvZWZmKGkpLnJlYWwoKSAtIHApICogKG1fZWl2YWx1ZXMuY29lZmYoaSkucmVhbCgpIC0gcCkgKyBtX2VpdmFsdWVzLmNvZWZmKGkpLmltYWcoKSAqIG1fZWl2YWx1ZXMuY29lZmYoaSkuaW1hZygpOworICAgICAgICAgICAgU2NhbGFyIHQgPSAoeCAqIGxhc3RyIC0gbGFzdHcgKiByKSAvIGRlbm9tOworICAgICAgICAgICAgbV9tYXRULmNvZWZmUmVmKGksbikgPSB0OworICAgICAgICAgICAgaWYgKGludGVybmFsOjphYnMoeCkgPiBpbnRlcm5hbDo6YWJzKGxhc3R3KSkKKyAgICAgICAgICAgICAgbV9tYXRULmNvZWZmUmVmKGkrMSxuKSA9ICgtciAtIHcgKiB0KSAvIHg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpKzEsbikgPSAoLWxhc3RyIC0geSAqIHQpIC8gbGFzdHc7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gT3ZlcmZsb3cgY29udHJvbAorICAgICAgICAgIFNjYWxhciB0ID0gaW50ZXJuYWw6OmFicyhtX21hdFQuY29lZmYoaSxuKSk7CisgICAgICAgICAgaWYgKChlcHMgKiB0KSAqIHQgPiBTY2FsYXIoMSkpCisgICAgICAgICAgICBtX21hdFQuY29sKG4pLnRhaWwoc2l6ZS1pKSAvPSB0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHEgPCBTY2FsYXIoMCkgJiYgbiA+IDApIC8vIENvbXBsZXggdmVjdG9yCisgICAgeworICAgICAgU2NhbGFyIGxhc3RyYSgwKSwgbGFzdHNhKDApLCBsYXN0dygwKTsKKyAgICAgIEluZGV4IGwgPSBuLTE7CisKKyAgICAgIC8vIExhc3QgdmVjdG9yIGNvbXBvbmVudCBpbWFnaW5hcnkgc28gbWF0cml4IGlzIHRyaWFuZ3VsYXIKKyAgICAgIGlmIChpbnRlcm5hbDo6YWJzKG1fbWF0VC5jb2VmZihuLG4tMSkpID4gaW50ZXJuYWw6OmFicyhtX21hdFQuY29lZmYobi0xLG4pKSkKKyAgICAgIHsKKyAgICAgICAgbV9tYXRULmNvZWZmUmVmKG4tMSxuLTEpID0gcSAvIG1fbWF0VC5jb2VmZihuLG4tMSk7CisgICAgICAgIG1fbWF0VC5jb2VmZlJlZihuLTEsbikgPSAtKG1fbWF0VC5jb2VmZihuLG4pIC0gcCkgLyBtX21hdFQuY29lZmYobixuLTEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzdGQ6OmNvbXBsZXg8U2NhbGFyPiBjYyA9IGNkaXY8U2NhbGFyPigwLjAsLW1fbWF0VC5jb2VmZihuLTEsbiksbV9tYXRULmNvZWZmKG4tMSxuLTEpLXAscSk7CisgICAgICAgIG1fbWF0VC5jb2VmZlJlZihuLTEsbi0xKSA9IGludGVybmFsOjpyZWFsKGNjKTsKKyAgICAgICAgbV9tYXRULmNvZWZmUmVmKG4tMSxuKSA9IGludGVybmFsOjppbWFnKGNjKTsKKyAgICAgIH0KKyAgICAgIG1fbWF0VC5jb2VmZlJlZihuLG4tMSkgPSAwLjA7CisgICAgICBtX21hdFQuY29lZmZSZWYobixuKSA9IDEuMDsKKyAgICAgIGZvciAoSW5kZXggaSA9IG4tMjsgaSA+PSAwOyBpLS0pCisgICAgICB7CisgICAgICAgIFNjYWxhciByYSA9IG1fbWF0VC5yb3coaSkuc2VnbWVudChsLCBuLWwrMSkuZG90KG1fbWF0VC5jb2wobi0xKS5zZWdtZW50KGwsIG4tbCsxKSk7CisgICAgICAgIFNjYWxhciBzYSA9IG1fbWF0VC5yb3coaSkuc2VnbWVudChsLCBuLWwrMSkuZG90KG1fbWF0VC5jb2wobikuc2VnbWVudChsLCBuLWwrMSkpOworICAgICAgICBTY2FsYXIgdyA9IG1fbWF0VC5jb2VmZihpLGkpIC0gcDsKKworICAgICAgICBpZiAobV9laXZhbHVlcy5jb2VmZihpKS5pbWFnKCkgPCAwLjApCisgICAgICAgIHsKKyAgICAgICAgICBsYXN0dyA9IHc7CisgICAgICAgICAgbGFzdHJhID0gcmE7CisgICAgICAgICAgbGFzdHNhID0gc2E7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbCA9IGk7CisgICAgICAgICAgaWYgKG1fZWl2YWx1ZXMuY29lZmYoaSkuaW1hZygpID09IFJlYWxTY2FsYXIoMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgc3RkOjpjb21wbGV4PFNjYWxhcj4gY2MgPSBjZGl2KC1yYSwtc2EsdyxxKTsKKyAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpLG4tMSkgPSBpbnRlcm5hbDo6cmVhbChjYyk7CisgICAgICAgICAgICBtX21hdFQuY29lZmZSZWYoaSxuKSA9IGludGVybmFsOjppbWFnKGNjKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNvbHZlIGNvbXBsZXggZXF1YXRpb25zCisgICAgICAgICAgICBTY2FsYXIgeCA9IG1fbWF0VC5jb2VmZihpLGkrMSk7CisgICAgICAgICAgICBTY2FsYXIgeSA9IG1fbWF0VC5jb2VmZihpKzEsaSk7CisgICAgICAgICAgICBTY2FsYXIgdnIgPSAobV9laXZhbHVlcy5jb2VmZihpKS5yZWFsKCkgLSBwKSAqIChtX2VpdmFsdWVzLmNvZWZmKGkpLnJlYWwoKSAtIHApICsgbV9laXZhbHVlcy5jb2VmZihpKS5pbWFnKCkgKiBtX2VpdmFsdWVzLmNvZWZmKGkpLmltYWcoKSAtIHEgKiBxOworICAgICAgICAgICAgU2NhbGFyIHZpID0gKG1fZWl2YWx1ZXMuY29lZmYoaSkucmVhbCgpIC0gcCkgKiBTY2FsYXIoMikgKiBxOworICAgICAgICAgICAgaWYgKCh2ciA9PSAwLjApICYmICh2aSA9PSAwLjApKQorICAgICAgICAgICAgICB2ciA9IGVwcyAqIG5vcm0gKiAoaW50ZXJuYWw6OmFicyh3KSArIGludGVybmFsOjphYnMocSkgKyBpbnRlcm5hbDo6YWJzKHgpICsgaW50ZXJuYWw6OmFicyh5KSArIGludGVybmFsOjphYnMobGFzdHcpKTsKKworCSAgICBzdGQ6OmNvbXBsZXg8U2NhbGFyPiBjYyA9IGNkaXYoeCpsYXN0cmEtbGFzdHcqcmErcSpzYSx4Kmxhc3RzYS1sYXN0dypzYS1xKnJhLHZyLHZpKTsKKyAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpLG4tMSkgPSBpbnRlcm5hbDo6cmVhbChjYyk7CisgICAgICAgICAgICBtX21hdFQuY29lZmZSZWYoaSxuKSA9IGludGVybmFsOjppbWFnKGNjKTsKKyAgICAgICAgICAgIGlmIChpbnRlcm5hbDo6YWJzKHgpID4gKGludGVybmFsOjphYnMobGFzdHcpICsgaW50ZXJuYWw6OmFicyhxKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpKzEsbi0xKSA9ICgtcmEgLSB3ICogbV9tYXRULmNvZWZmKGksbi0xKSArIHEgKiBtX21hdFQuY29lZmYoaSxuKSkgLyB4OworICAgICAgICAgICAgICBtX21hdFQuY29lZmZSZWYoaSsxLG4pID0gKC1zYSAtIHcgKiBtX21hdFQuY29lZmYoaSxuKSAtIHEgKiBtX21hdFQuY29lZmYoaSxuLTEpKSAvIHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNjID0gY2RpdigtbGFzdHJhLXkqbV9tYXRULmNvZWZmKGksbi0xKSwtbGFzdHNhLXkqbV9tYXRULmNvZWZmKGksbiksbGFzdHcscSk7CisgICAgICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpKzEsbi0xKSA9IGludGVybmFsOjpyZWFsKGNjKTsKKyAgICAgICAgICAgICAgbV9tYXRULmNvZWZmUmVmKGkrMSxuKSA9IGludGVybmFsOjppbWFnKGNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBPdmVyZmxvdyBjb250cm9sCisgICAgICAgICAgdXNpbmcgc3RkOjptYXg7CisgICAgICAgICAgU2NhbGFyIHQgPSAobWF4KShpbnRlcm5hbDo6YWJzKG1fbWF0VC5jb2VmZihpLG4tMSkpLGludGVybmFsOjphYnMobV9tYXRULmNvZWZmKGksbikpKTsKKyAgICAgICAgICBpZiAoKGVwcyAqIHQpICogdCA+IFNjYWxhcigxKSkKKyAgICAgICAgICAgIG1fbWF0VC5ibG9jayhpLCBuLTEsIHNpemUtaSwgMikgLz0gdDsKKworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFdlIGhhbmRsZWQgYSBwYWlyIG9mIGNvbXBsZXggY29uanVnYXRlIGVpZ2VudmFsdWVzLCBzbyBuZWVkIHRvIHNraXAgdGhlbSBib3RoCisgICAgICBuLS07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoMCAmJiAiSW50ZXJuYWwgYnVnIGluIEVpZ2VuU29sdmVyIik7IC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKyAgICB9CisgIH0KKworICAvLyBCYWNrIHRyYW5zZm9ybWF0aW9uIHRvIGdldCBlaWdlbnZlY3RvcnMgb2Ygb3JpZ2luYWwgbWF0cml4CisgIGZvciAoSW5kZXggaiA9IHNpemUtMTsgaiA+PSAwOyBqLS0pCisgIHsKKyAgICBtX3RtcC5ub2FsaWFzKCkgPSBtX2VpdmVjLmxlZnRDb2xzKGorMSkgKiBtX21hdFQuY29sKGopLnNlZ21lbnQoMCwgaisxKTsKKyAgICBtX2VpdmVjLmNvbChqKSA9IG1fdG1wOworICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fRUlHRU5TT0xWRVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlci5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YmYxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmgKQEAgLTAsMCArMSwyMjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fR0VORVJBTElaRURTRUxGQURKT0lOVEVJR0VOU09MVkVSX0gKKyNkZWZpbmUgRUlHRU5fR0VORVJBTElaRURTRUxGQURKT0lOVEVJR0VOU09MVkVSX0gKKworI2luY2x1ZGUgIi4vVHJpZGlhZ29uYWxpemF0aW9uLmgiCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGVpZ2VudmFsdWVzX21vZHVsZSBcaW5ncm91cCBFaWdlbnZhbHVlc19Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcgorICAqCisgICogXGJyaWVmIENvbXB1dGVzIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgdGhlIGdlbmVyYWxpemVkIHNlbGZhZGpvaW50IGVpZ2VuIHByb2JsZW0KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZQorICAqIGVpZ2VuZGVjb21wb3NpdGlvbjsgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBpbnN0YW50aWF0aW9uIG9mIHRoZSBNYXRyaXgKKyAgKiBjbGFzcyB0ZW1wbGF0ZS4KKyAgKgorICAqIFRoaXMgY2xhc3Mgc29sdmVzIHRoZSBnZW5lcmFsaXplZCBlaWdlbnZhbHVlIHByb2JsZW0KKyAgKiBcZiQgQXYgPSBcbGFtYmRhIEJ2IFxmJC4gSW4gdGhpcyBjYXNlLCB0aGUgbWF0cml4IFxmJCBBIFxmJCBzaG91bGQgYmUKKyAgKiBzZWxmYWRqb2ludCBhbmQgdGhlIG1hdHJpeCBcZiQgQiBcZiQgc2hvdWxkIGJlIHBvc2l0aXZlIGRlZmluaXRlLgorICAqCisgICogT25seSB0aGUgXGIgbG93ZXIgXGIgdHJpYW5ndWxhciBcYiBwYXJ0IG9mIHRoZSBpbnB1dCBtYXRyaXggaXMgcmVmZXJlbmNlZC4KKyAgKgorICAqIENhbGwgdGhlIGZ1bmN0aW9uIGNvbXB1dGUoKSB0byBjb21wdXRlIHRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mCisgICogYSBnaXZlbiBtYXRyaXguIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZQorICAqIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiwgY29uc3QgTWF0cml4VHlwZSYsIGludCkKKyAgKiBjb25zdHJ1Y3RvciB3aGljaCBjb21wdXRlcyB0aGUgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBhdCBjb25zdHJ1Y3Rpb24gdGltZS4KKyAgKiBPbmNlIHRoZSBlaWdlbnZhbHVlIGFuZCBlaWdlbnZlY3RvcnMgYXJlIGNvbXB1dGVkLCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgd2l0aCB0aGUgZWlnZW52YWx1ZXMoKQorICAqIGFuZCBlaWdlbnZlY3RvcnMoKSBmdW5jdGlvbnMuCisgICoKKyAgKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmLCBjb25zdCBNYXRyaXhUeXBlJiwgaW50KQorICAqIGNvbnRhaW5zIGFuIGV4YW1wbGUgb2YgdGhlIHR5cGljYWwgdXNlIG9mIHRoaXMgY2xhc3MuCisgICoKKyAgKiBcc2EgY2xhc3MgU2VsZkFkam9pbnRFaWdlblNvbHZlciwgY2xhc3MgRWlnZW5Tb2x2ZXIsIGNsYXNzIENvbXBsZXhFaWdlblNvbHZlcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitjbGFzcyBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgOiBwdWJsaWMgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxfTWF0cml4VHlwZT4KK3sKKyAgICB0eXBlZGVmIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8X01hdHJpeFR5cGU+IEJhc2U7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBmaXhlZC1zaXplIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBjb21wdXRlKCkuIFRoaXMgY29uc3RydWN0b3IKKyAgICAgICogY2FuIG9ubHkgYmUgdXNlZCBpZiBccCBfTWF0cml4VHlwZSBpcyBhIGZpeGVkLXNpemUgbWF0cml4OyB1c2UKKyAgICAgICogR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyKEluZGV4KSBmb3IgZHluYW1pYy1zaXplIG1hdHJpY2VzLgorICAgICAgKi8KKyAgICBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIoKSA6IEJhc2UoKSB7fQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RvciwgcHJlLWFsbG9jYXRlcyBtZW1vcnkgZm9yIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcy4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIFtpbl0gIHNpemUgIFBvc2l0aXZlIGludGVnZXIsIHNpemUgb2YgdGhlIG1hdHJpeCB3aG9zZQorICAgICAgKiBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIHdpbGwgYmUgY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIGZvciBkeW5hbWljLXNpemUgbWF0cmljZXMsIHdoZW4gdGhlIHVzZXIKKyAgICAgICogaW50ZW5kcyB0byBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBjb21wdXRlKCkuIFRoZSBccCBzaXplCisgICAgICAqIHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgYXMgYSBoaW50LiBJdCBpcyBub3QgYW4gZXJyb3IgdG8gZ2l2ZSBhIHdyb25nCisgICAgICAqIFxwIHNpemUsIGJ1dCBpdCBtYXkgaW1wYWlyIHBlcmZvcm1hbmNlLgorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpIGZvciBhbiBleGFtcGxlCisgICAgICAqLworICAgIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcihJbmRleCBzaXplKQorICAgICAgICA6IEJhc2Uoc2l6ZSkKKyAgICB7fQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RvcjsgY29tcHV0ZXMgZ2VuZXJhbGl6ZWQgZWlnZW5kZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeCBwZW5jaWwuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdEEgIFNlbGZhZGpvaW50IG1hdHJpeCBpbiBtYXRyaXggcGVuY2lsLgorICAgICAgKiAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBpcyByZWZlcmVuY2VkLgorICAgICAgKiBccGFyYW1baW5dICBtYXRCICBQb3NpdGl2ZS1kZWZpbml0ZSBtYXRyaXggaW4gbWF0cml4IHBlbmNpbC4KKyAgICAgICogICAgICAgICAgICAgICAgICAgT25seSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBtYXRyaXggaXMgcmVmZXJlbmNlZC4KKyAgICAgICogXHBhcmFtW2luXSAgb3B0aW9ucyBBIG9yLWVkIHNldCBvZiBmbGFncyB7I0NvbXB1dGVFaWdlbnZlY3RvcnMsI0VpZ2VudmFsdWVzT25seX0gfCB7I0F4X2xCeCwjQUJ4X2x4LCNCQXhfbHh9LgorICAgICAgKiAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgI0NvbXB1dGVFaWdlbnZlY3RvcnN8I0F4X2xCeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBjb25zdCBNYXRyaXhUeXBlJiwgaW50KQorICAgICAgKiB0byBjb21wdXRlIHRoZSBlaWdlbnZhbHVlcyBhbmQgKGlmIHJlcXVlc3RlZCkgdGhlIGVpZ2VudmVjdG9ycyBvZiB0aGUKKyAgICAgICogZ2VuZXJhbGl6ZWQgZWlnZW5wcm9ibGVtIFxmJCBBeCA9IFxsYW1iZGEgQiB4IFxmJCB3aXRoIFxhIG1hdEEgdGhlCisgICAgICAqIHNlbGZhZGpvaW50IG1hdHJpeCBcZiQgQSBcZiQgYW5kIFxhIG1hdEIgdGhlIHBvc2l0aXZlIGRlZmluaXRlIG1hdHJpeAorICAgICAgKiBcZiQgQiBcZiQuIEVhY2ggZWlnZW52ZWN0b3IgXGYkIHggXGYkIHNhdGlzZmllcyB0aGUgcHJvcGVydHkKKyAgICAgICogXGYkIHheKiBCIHggPSAxIFxmJC4gVGhlIGVpZ2VudmVjdG9ycyBhcmUgY29tcHV0ZWQgaWYKKyAgICAgICogXGEgb3B0aW9ucyBjb250YWlucyBDb21wdXRlRWlnZW52ZWN0b3JzLgorICAgICAgKgorICAgICAgKiBJbiBhZGRpdGlvbiwgdGhlIHR3byBmb2xsb3dpbmcgdmFyaWFudHMgY2FuIGJlIHNvbHZlZCB2aWEgXHAgb3B0aW9uczoKKyAgICAgICogLSBcYyBBQnhfbHg6IFxmJCBBQnggPSBcbGFtYmRhIHggXGYkCisgICAgICAqIC0gXGMgQkF4X2x4OiBcZiQgQkF4ID0gXGxhbWJkYSB4IFxmJAorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfTWF0cml4VHlwZTIuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlMi5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQpCisgICAgICAqLworICAgIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBtYXRBLCBjb25zdCBNYXRyaXhUeXBlJiBtYXRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW9ucyA9IENvbXB1dGVFaWdlbnZlY3RvcnN8QXhfbEJ4KQorICAgICAgOiBCYXNlKG1hdEEuY29scygpKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0QSwgbWF0Qiwgb3B0aW9ucyk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlcyBnZW5lcmFsaXplZCBlaWdlbmRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4IHBlbmNpbC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSAgbWF0QSAgU2VsZmFkam9pbnQgbWF0cml4IGluIG1hdHJpeCBwZW5jaWwuCisgICAgICAqICAgICAgICAgICAgICAgICAgIE9ubHkgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4IGlzIHJlZmVyZW5jZWQuCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdEIgIFBvc2l0aXZlLWRlZmluaXRlIG1hdHJpeCBpbiBtYXRyaXggcGVuY2lsLgorICAgICAgKiAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBpcyByZWZlcmVuY2VkLgorICAgICAgKiBccGFyYW1baW5dICBvcHRpb25zIEEgb3ItZWQgc2V0IG9mIGZsYWdzIHsjQ29tcHV0ZUVpZ2VudmVjdG9ycywjRWlnZW52YWx1ZXNPbmx5fSB8IHsjQXhfbEJ4LCNBQnhfbHgsI0JBeF9seH0uCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyAjQ29tcHV0ZUVpZ2VudmVjdG9yc3wjQXhfbEJ4LgorICAgICAgKgorICAgICAgKiBccmV0dXJucyAgICBSZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgICAgICoKKyAgICAgICogQWNjb3JpbmcgdG8gXHAgb3B0aW9ucywgdGhpcyBmdW5jdGlvbiBjb21wdXRlcyBlaWdlbnZhbHVlcyBhbmQgKGlmIHJlcXVlc3RlZCkKKyAgICAgICogdGhlIGVpZ2VudmVjdG9ycyBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyB0aHJlZSBnZW5lcmFsaXplZCBlaWdlbnByb2JsZW1zOgorICAgICAgKiAtIFxjIEF4X2xCeDogXGYkIEF4ID0gXGxhbWJkYSBCIHggXGYkCisgICAgICAqIC0gXGMgQUJ4X2x4OiBcZiQgQUJ4ID0gXGxhbWJkYSB4IFxmJAorICAgICAgKiAtIFxjIEJBeF9seDogXGYkIEJBeCA9IFxsYW1iZGEgeCBcZiQKKyAgICAgICogd2l0aCBcYSBtYXRBIHRoZSBzZWxmYWRqb2ludCBtYXRyaXggXGYkIEEgXGYkIGFuZCBcYSBtYXRCIHRoZSBwb3NpdGl2ZSBkZWZpbml0ZQorICAgICAgKiBtYXRyaXggXGYkIEIgXGYkLgorICAgICAgKiBJbiBhZGRpdGlvbiwgZWFjaCBlaWdlbnZlY3RvciBcZiQgeCBcZiQgc2F0aXNmaWVzIHRoZSBwcm9wZXJ0eSBcZiQgeF4qIEIgeCA9IDEgXGYkLgorICAgICAgKgorICAgICAgKiBUaGUgZWlnZW52YWx1ZXMoKSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZQorICAgICAgKiB0aGUgZWlnZW52YWx1ZXMuIElmIFxwIG9wdGlvbnMgY29udGFpbnMgQ29tcHV0ZUVpZ2VudmVjdG9ycywgdGhlbiB0aGUKKyAgICAgICogZWlnZW52ZWN0b3JzIGFyZSBhbHNvIGNvbXB1dGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcKKyAgICAgICogZWlnZW52ZWN0b3JzKCkuCisgICAgICAqCisgICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIExMVCB0byBjb21wdXRlIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uCisgICAgICAqIFxmJCBCID0gTExeKiBcZiQgYW5kIGNvbXB1dGVzIHRoZSBjbGFzc2ljYWwgZWlnZW5kZWNvbXBvc2l0aW9uCisgICAgICAqIG9mIHRoZSBzZWxmYWRqb2ludCBtYXRyaXggXGYkIExeey0xfSBBIChMXiopXnstMX0gXGYkIGlmIFxwIG9wdGlvbnMgY29udGFpbnMgQXhfbEJ4CisgICAgICAqIGFuZCBvZiBcZiQgTF57Kn0gQSBMIFxmJCBvdGhlcndpc2UuIFRoaXMgc29sdmVzIHRoZQorICAgICAgKiBnZW5lcmFsaXplZCBlaWdlbnByb2JsZW0sIGJlY2F1c2UgYW55IHNvbHV0aW9uIG9mIHRoZSBnZW5lcmFsaXplZAorICAgICAgKiBlaWdlbnByb2JsZW0gXGYkIEF4ID0gXGxhbWJkYSBCIHggXGYkIGNvcnJlc3BvbmRzIHRvIGEgc29sdXRpb24KKyAgICAgICogXGYkIExeey0xfSBBIChMXiopXnstMX0gKExeKiB4KSA9IFxsYW1iZGEgKExeKiB4KSBcZiQgb2YgdGhlCisgICAgICAqIGVpZ2VucHJvYmxlbSBmb3IgXGYkIExeey0xfSBBIChMXiopXnstMX0gXGYkLiBTaW1pbGFyIHN0YXRlbWVudHMKKyAgICAgICogY2FuIGJlIG1hZGUgZm9yIHRoZSB0d28gb3RoZXIgdmFyaWFudHMuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfY29tcHV0ZV9NYXRyaXhUeXBlMi5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUyLm91dAorICAgICAgKgorICAgICAgKiBcc2EgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmLCBjb25zdCBNYXRyaXhUeXBlJiwgaW50KQorICAgICAgKi8KKyAgICBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXImIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0QSwgY29uc3QgTWF0cml4VHlwZSYgbWF0QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wdGlvbnMgPSBDb21wdXRlRWlnZW52ZWN0b3JzfEF4X2xCeCk7CisKKyAgcHJvdGVjdGVkOgorCit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4mIEdlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPjo6Citjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdEEsIGNvbnN0IE1hdHJpeFR5cGUmIG1hdEIsIGludCBvcHRpb25zKQoreworICBlaWdlbl9hc3NlcnQobWF0QS5jb2xzKCk9PW1hdEEucm93cygpICYmIG1hdEIucm93cygpPT1tYXRBLnJvd3MoKSAmJiBtYXRCLmNvbHMoKT09bWF0Qi5yb3dzKCkpOworICBlaWdlbl9hc3NlcnQoKG9wdGlvbnMmfihFaWdWZWNNYXNrfEdlbkVpZ01hc2spKT09MAorICAgICAgICAgICYmIChvcHRpb25zJkVpZ1ZlY01hc2spIT1FaWdWZWNNYXNrCisgICAgICAgICAgJiYgKChvcHRpb25zJkdlbkVpZ01hc2spPT0wIHx8IChvcHRpb25zJkdlbkVpZ01hc2spPT1BeF9sQngKKyAgICAgICAgICAgfHwgKG9wdGlvbnMmR2VuRWlnTWFzayk9PUFCeF9seCB8fCAob3B0aW9ucyZHZW5FaWdNYXNrKT09QkF4X2x4KQorICAgICAgICAgICYmICJpbnZhbGlkIG9wdGlvbiBwYXJhbWV0ZXIiKTsKKworICBib29sIGNvbXB1dGVFaWdWZWNzID0gKChvcHRpb25zJkVpZ1ZlY01hc2spPT0wKSB8fCAoKG9wdGlvbnMmRWlnVmVjTWFzayk9PUNvbXB1dGVFaWdlbnZlY3RvcnMpOworCisgIC8vIENvbXB1dGUgdGhlIGNob2xlc2t5IGRlY29tcG9zaXRpb24gb2YgbWF0QiA9IEwgTCcgPSBVJ1UKKyAgTExUPE1hdHJpeFR5cGU+IGNob2xCKG1hdEIpOworCisgIGludCB0eXBlID0gKG9wdGlvbnMmR2VuRWlnTWFzayk7CisgIGlmKHR5cGU9PTApCisgICAgdHlwZSA9IEF4X2xCeDsKKworICBpZih0eXBlPT1BeF9sQngpCisgIHsKKyAgICAvLyBjb21wdXRlIEMgPSBpbnYoTCkgQSBpbnYoTCcpCisgICAgTWF0cml4VHlwZSBtYXRDID0gbWF0QS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgICAgY2hvbEIubWF0cml4TCgpLnRlbXBsYXRlIHNvbHZlSW5QbGFjZTxPblRoZUxlZnQ+KG1hdEMpOworICAgIGNob2xCLm1hdHJpeFUoKS50ZW1wbGF0ZSBzb2x2ZUluUGxhY2U8T25UaGVSaWdodD4obWF0Qyk7CisKKyAgICBCYXNlOjpjb21wdXRlKG1hdEMsIGNvbXB1dGVFaWdWZWNzID8gQ29tcHV0ZUVpZ2VudmVjdG9ycyA6IEVpZ2VudmFsdWVzT25seSApOworCisgICAgLy8gdHJhbnNmb3JtIGJhY2sgdGhlIGVpZ2VuIHZlY3RvcnM6IGV2ZWNzID0gaW52KFUpICogZXZlY3MKKyAgICBpZihjb21wdXRlRWlnVmVjcykKKyAgICAgIGNob2xCLm1hdHJpeFUoKS5zb2x2ZUluUGxhY2UoQmFzZTo6bV9laXZlYyk7CisgIH0KKyAgZWxzZSBpZih0eXBlPT1BQnhfbHgpCisgIHsKKyAgICAvLyBjb21wdXRlIEMgPSBMJyBBIEwKKyAgICBNYXRyaXhUeXBlIG1hdEMgPSBtYXRBLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgICBtYXRDID0gbWF0QyAqIGNob2xCLm1hdHJpeEwoKTsKKyAgICBtYXRDID0gY2hvbEIubWF0cml4VSgpICogbWF0QzsKKworICAgIEJhc2U6OmNvbXB1dGUobWF0QywgY29tcHV0ZUVpZ1ZlY3MgPyBDb21wdXRlRWlnZW52ZWN0b3JzIDogRWlnZW52YWx1ZXNPbmx5KTsKKworICAgIC8vIHRyYW5zZm9ybSBiYWNrIHRoZSBlaWdlbiB2ZWN0b3JzOiBldmVjcyA9IGludihVKSAqIGV2ZWNzCisgICAgaWYoY29tcHV0ZUVpZ1ZlY3MpCisgICAgICBjaG9sQi5tYXRyaXhVKCkuc29sdmVJblBsYWNlKEJhc2U6Om1fZWl2ZWMpOworICB9CisgIGVsc2UgaWYodHlwZT09QkF4X2x4KQorICB7CisgICAgLy8gY29tcHV0ZSBDID0gTCcgQSBMCisgICAgTWF0cml4VHlwZSBtYXRDID0gbWF0QS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgICAgbWF0QyA9IG1hdEMgKiBjaG9sQi5tYXRyaXhMKCk7CisgICAgbWF0QyA9IGNob2xCLm1hdHJpeFUoKSAqIG1hdEM7CisKKyAgICBCYXNlOjpjb21wdXRlKG1hdEMsIGNvbXB1dGVFaWdWZWNzID8gQ29tcHV0ZUVpZ2VudmVjdG9ycyA6IEVpZ2VudmFsdWVzT25seSk7CisKKyAgICAvLyB0cmFuc2Zvcm0gYmFjayB0aGUgZWlnZW4gdmVjdG9yczogZXZlY3MgPSBMICogZXZlY3MKKyAgICBpZihjb21wdXRlRWlnVmVjcykKKyAgICAgIEJhc2U6Om1fZWl2ZWMgPSBjaG9sQi5tYXRyaXhMKCkgKiBCYXNlOjptX2VpdmVjOworICB9CisKKyAgcmV0dXJuICp0aGlzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0dFTkVSQUxJWkVEU0VMRkFESk9JTlRFSUdFTlNPTFZFUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24uaCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Mzc4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24uaApAQCAtMCwwICsxLDM3MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9IRVNTRU5CRVJHREVDT01QT1NJVElPTl9ICisjZGVmaW5lIEVJR0VOX0hFU1NFTkJFUkdERUNPTVBPU0lUSU9OX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uTWF0cml4SFJldHVyblR5cGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IHRyYWl0czxIZXNzZW5iZXJnRGVjb21wb3NpdGlvbk1hdHJpeEhSZXR1cm5UeXBlPE1hdHJpeFR5cGU+ID4KK3sKKyAgdHlwZWRlZiBNYXRyaXhUeXBlIFJldHVyblR5cGU7Cit9OworCit9CisKKy8qKiBcZWlnZW52YWx1ZXNfbW9kdWxlIFxpbmdyb3VwIEVpZ2VudmFsdWVzX01vZHVsZQorICAqCisgICoKKyAgKiBcY2xhc3MgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24KKyAgKgorICAqIFxicmllZiBSZWR1Y2VzIGEgc3F1YXJlIG1hdHJpeCB0byBIZXNzZW5iZXJnIGZvcm0gYnkgYW4gb3J0aG9nb25hbCBzaW1pbGFyaXR5IHRyYW5zZm9ybWF0aW9uCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uCisgICoKKyAgKiBUaGlzIGNsYXNzIHBlcmZvcm1zIGFuIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCBcZiQgQSBcZiQuIEluCisgICogdGhlIHJlYWwgY2FzZSwgdGhlIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiBjb25zaXN0cyBvZiBhbiBvcnRob2dvbmFsCisgICogbWF0cml4IFxmJCBRIFxmJCBhbmQgYSBIZXNzZW5iZXJnIG1hdHJpeCBcZiQgSCBcZiQgc3VjaCB0aGF0IFxmJCBBID0gUSBICisgICogUV5UIFxmJC4gQW4gb3J0aG9nb25hbCBtYXRyaXggaXMgYSBtYXRyaXggd2hvc2UgaW52ZXJzZSBlcXVhbHMgaXRzCisgICogdHJhbnNwb3NlIChcZiQgUV57LTF9ID0gUV5UIFxmJCkuIEEgSGVzc2VuYmVyZyBtYXRyaXggaGFzIHplcm9zIGJlbG93IHRoZQorICAqIHN1YmRpYWdvbmFsLCBzbyBpdCBpcyBhbG1vc3QgdXBwZXIgdHJpYW5ndWxhci4gVGhlIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbgorICAqIG9mIGEgY29tcGxleCBtYXRyaXggaXMgXGYkIEEgPSBRIEggUV4qIFxmJCB3aXRoIFxmJCBRIFxmJCB1bml0YXJ5ICh0aGF0IGlzLAorICAqIFxmJCBRXnstMX0gPSBRXiogXGYkKS4KKyAgKgorICAqIENhbGwgdGhlIGZ1bmN0aW9uIGNvbXB1dGUoKSB0byBjb21wdXRlIHRoZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24gb2YgYQorICAqIGdpdmVuIG1hdHJpeC4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlCisgICogSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24oY29uc3QgTWF0cml4VHlwZSYpIGNvbnN0cnVjdG9yIHdoaWNoIGNvbXB1dGVzIHRoZQorICAqIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gT25jZSB0aGUgZGVjb21wb3NpdGlvbiBpcworICAqIGNvbXB1dGVkLCB5b3UgY2FuIHVzZSB0aGUgbWF0cml4SCgpIGFuZCBtYXRyaXhRKCkgZnVuY3Rpb25zIHRvIGNvbnN0cnVjdAorICAqIHRoZSBtYXRyaWNlcyBIIGFuZCBRIGluIHRoZSBkZWNvbXBvc2l0aW9uLgorICAqCisgICogVGhlIGRvY3VtZW50YXRpb24gZm9yIG1hdHJpeEgoKSBjb250YWlucyBhbiBleGFtcGxlIG9mIHRoZSB0eXBpY2FsIHVzZSBvZgorICAqIHRoaXMgY2xhc3MuCisgICoKKyAgKiBcc2EgY2xhc3MgQ29tcGxleFNjaHVyLCBjbGFzcyBUcmlkaWFnb25hbGl6YXRpb24sIFxyZWYgUVJfTW9kdWxlICJRUiBNb2R1bGUiCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24KK3sKKyAgcHVibGljOgorCisgICAgLyoqIFxicmllZiBTeW5vbnltIGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxwIF9NYXRyaXhUeXBlLiAqLworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKworICAgIGVudW0geworICAgICAgU2l6ZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgU2l6ZU1pbnVzT25lID0gU2l6ZSA9PSBEeW5hbWljID8gRHluYW1pYyA6IFNpemUgLSAxLAorICAgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMsCisgICAgICBNYXhTaXplID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhTaXplTWludXNPbmUgPSBNYXhTaXplID09IER5bmFtaWMgPyBEeW5hbWljIDogTWF4U2l6ZSAtIDEKKyAgICB9OworCisgICAgLyoqIFxicmllZiBTY2FsYXIgdHlwZSBmb3IgbWF0cmljZXMgb2YgdHlwZSAjTWF0cml4VHlwZS4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICAgIC8qKiBcYnJpZWYgVHlwZSBmb3IgdmVjdG9yIG9mIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cy4KKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBjb2x1bW4gdmVjdG9yIHdpdGggZW50cmllcyBvZiB0eXBlICNTY2FsYXIuIFRoZSBsZW5ndGggb2YgdGhlCisgICAgICAqIHZlY3RvciBpcyBvbmUgbGVzcyB0aGFuIHRoZSBzaXplIG9mICNNYXRyaXhUeXBlLCBpZiBpdCBpcyBhIGZpeGVkLXNpZGUKKyAgICAgICogdHlwZS4KKyAgICAgICovCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplTWludXNPbmUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heFNpemVNaW51c09uZSwgMT4gQ29lZmZWZWN0b3JUeXBlOworCisgICAgLyoqIFxicmllZiBSZXR1cm4gdHlwZSBvZiBtYXRyaXhRKCkgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIEhvdXNlaG9sZGVyU2VxdWVuY2U8TWF0cml4VHlwZSxDb2VmZlZlY3RvclR5cGU+OjpDb25qdWdhdGVSZXR1cm5UeXBlIEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlOworICAgIAorICAgIHR5cGVkZWYgaW50ZXJuYWw6Okhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uTWF0cml4SFJldHVyblR5cGU8TWF0cml4VHlwZT4gTWF0cml4SFJldHVyblR5cGU7CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3I7IHRoZSBkZWNvbXBvc2l0aW9uIHdpbGwgYmUgY29tcHV0ZWQgbGF0ZXIuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBbaW5dIHNpemUgIFRoZSBzaXplIG9mIHRoZSBtYXRyaXggd2hvc2UgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIHdpbGwgYmUgY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIGNvbXB1dGUoKS4gIFRoZSBccCBzaXplIHBhcmFtZXRlciBpcyBvbmx5CisgICAgICAqIHVzZWQgYXMgYSBoaW50LiBJdCBpcyBub3QgYW4gZXJyb3IgdG8gZ2l2ZSBhIHdyb25nIFxwIHNpemUsIGJ1dCBpdCBtYXkKKyAgICAgICogaW1wYWlyIHBlcmZvcm1hbmNlLgorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpIGZvciBhbiBleGFtcGxlLgorICAgICAgKi8KKyAgICBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbihJbmRleCBzaXplID0gU2l6ZT09RHluYW1pYyA/IDIgOiBTaXplKQorICAgICAgOiBtX21hdHJpeChzaXplLHNpemUpLAorICAgICAgICBtX3RlbXAoc2l6ZSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBpZihzaXplPjEpCisgICAgICAgIG1faENvZWZmcy5yZXNpemUoc2l6ZS0xKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yOyBjb21wdXRlcyBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LgorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggIFNxdWFyZSBtYXRyaXggd2hvc2UgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGNvbXB1dGUoKSB0byBjb21wdXRlIHRoZSBIZXNzZW5iZXJnCisgICAgICAqIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxzYSBtYXRyaXhIKCkgZm9yIGFuIGV4YW1wbGUuCisgICAgICAqLworICAgIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4KSwKKyAgICAgICAgbV90ZW1wKG1hdHJpeC5yb3dzKCkpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgaWYobWF0cml4LnJvd3MoKTwyKQorICAgICAgeworICAgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBtX2hDb2VmZnMucmVzaXplKG1hdHJpeC5yb3dzKCktMSwxKTsKKyAgICAgIF9jb21wdXRlKG1fbWF0cml4LCBtX2hDb2VmZnMsIG1fdGVtcCk7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSAgbWF0cml4ICBTcXVhcmUgbWF0cml4IHdob3NlIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiBpcyB0byBiZSBjb21wdXRlZC4KKyAgICAgICogXHJldHVybnMgICAgUmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIFRoZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24gaXMgY29tcHV0ZWQgYnkgYnJpbmdpbmcgdGhlIGNvbHVtbnMgb2YgdGhlCisgICAgICAqIG1hdHJpeCBzdWNjZXNzaXZlbHkgaW4gdGhlIHJlcXVpcmVkIGZvcm0gdXNpbmcgSG91c2Vob2xkZXIgcmVmbGVjdGlvbnMKKyAgICAgICogKHNlZSwgZS5nLiwgQWxnb3JpdGhtIDcuNC4yIGluIEdvbHViIFwmIFZhbiBMb2FuLCA8aT4lTWF0cml4CisgICAgICAqIENvbXB1dGF0aW9uczwvaT4pLiBUaGUgY29zdCBpcyBcZiQgMTBuXjMvMyBcZiQgZmxvcHMsIHdoZXJlIFxmJCBuIFxmJAorICAgICAgKiBkZW5vdGVzIHRoZSBzaXplIG9mIHRoZSBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgbWV0aG9kIHJldXNlcyBvZiB0aGUgYWxsb2NhdGVkIGRhdGEgaW4gdGhlIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uCisgICAgICAqIG9iamVjdC4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fY29tcHV0ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fY29tcHV0ZS5vdXQKKyAgICAgICovCisgICAgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24mIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIG1fbWF0cml4ID0gbWF0cml4OworICAgICAgaWYobWF0cml4LnJvd3MoKTwyKQorICAgICAgeworICAgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICBtX2hDb2VmZnMucmVzaXplKG1hdHJpeC5yb3dzKCktMSwxKTsKKyAgICAgIF9jb21wdXRlKG1fbWF0cml4LCBtX2hDb2VmZnMsIG1fdGVtcCk7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdmVjdG9yIG9mIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cworICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24oY29uc3QgTWF0cml4VHlwZSYpCisgICAgICAqIG9yIHRoZSBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikgaGFzIGJlZW4gY2FsbGVkCisgICAgICAqIGJlZm9yZSB0byBjb21wdXRlIHRoZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoZSBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMgYWxsb3cgdGhlIHJlY29uc3RydWN0aW9uIG9mIHRoZSBtYXRyaXgKKyAgICAgICogXGYkIFEgXGYkIGluIHRoZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24gZnJvbSB0aGUgcGFja2VkIGRhdGEuCisgICAgICAqCisgICAgICAqIFxzYSBwYWNrZWRNYXRyaXgoKSwgXHJlZiBIb3VzZWhvbGRlcl9Nb2R1bGUgIkhvdXNlaG9sZGVyIG1vZHVsZSIKKyAgICAgICovCisgICAgY29uc3QgQ29lZmZWZWN0b3JUeXBlJiBob3VzZWhvbGRlckNvZWZmaWNpZW50cygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1faENvZWZmczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZWNvbXBvc2l0aW9uCisgICAgICAqCisgICAgICAqCVxyZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIGEgbWF0cml4IHdpdGggdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uCisgICAgICAqCSAgICAgICAgIG9mIHRoZSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24oY29uc3QgTWF0cml4VHlwZSYpCisgICAgICAqIG9yIHRoZSBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikgaGFzIGJlZW4gY2FsbGVkCisgICAgICAqIGJlZm9yZSB0byBjb21wdXRlIHRoZSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoZSByZXR1cm5lZCBtYXRyaXggY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKyAgICAgICogIC0gdGhlIHVwcGVyIHBhcnQgYW5kIGxvd2VyIHN1Yi1kaWFnb25hbCByZXByZXNlbnQgdGhlIEhlc3NlbmJlcmcgbWF0cml4IEgKKyAgICAgICogIC0gdGhlIHJlc3Qgb2YgdGhlIGxvd2VyIHBhcnQgY29udGFpbnMgdGhlIEhvdXNlaG9sZGVyIHZlY3RvcnMgdGhhdCwgY29tYmluZWQgd2l0aAorICAgICAgKiAgICBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMgcmV0dXJuZWQgYnkgaG91c2Vob2xkZXJDb2VmZmljaWVudHMoKSwKKyAgICAgICogICAgYWxsb3dzIHRvIHJlY29uc3RydWN0IHRoZSBtYXRyaXggUSBhcworICAgICAgKiAgICAgICBcZiQgUSA9IEhfe04tMX0gXGxkb3RzIEhfMSBIXzAgXGYkLgorICAgICAgKiAgICBIZXJlLCB0aGUgbWF0cmljZXMgXGYkIEhfaSBcZiQgYXJlIHRoZSBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnMKKyAgICAgICogICAgICAgXGYkIEhfaSA9IChJIC0gaF9pIHZfaSB2X2leVCkgXGYkCisgICAgICAqICAgIHdoZXJlIFxmJCBoX2kgXGYkIGlzIHRoZSBcZiQgaSBcZiR0aCBIb3VzZWhvbGRlciBjb2VmZmljaWVudCBhbmQKKyAgICAgICogICAgXGYkIHZfaSBcZiQgaXMgdGhlIEhvdXNlaG9sZGVyIHZlY3RvciBkZWZpbmVkIGJ5CisgICAgICAqICAgICAgIFxmJCB2X2kgPSBbIDAsIFxsZG90cywgMCwgMSwgTShpKzIsaSksIFxsZG90cywgTShOLTEsaSkgXV5UIFxmJAorICAgICAgKiAgICB3aXRoIE0gdGhlIG1hdHJpeCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLgorICAgICAgKgorICAgICAgKiBTZWUgTEFQQUNLIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gdGhpcyBwYWNrZWQgc3RvcmFnZS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fcGFja2VkTWF0cml4LmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbl9wYWNrZWRNYXRyaXgub3V0CisgICAgICAqCisgICAgICAqIFxzYSBob3VzZWhvbGRlckNvZWZmaWNpZW50cygpCisgICAgICAqLworICAgIGNvbnN0IE1hdHJpeFR5cGUmIHBhY2tlZE1hdHJpeCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fbWF0cml4OworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmVjb25zdHJ1Y3RzIHRoZSBvcnRob2dvbmFsIG1hdHJpeCBRIGluIHRoZSBkZWNvbXBvc2l0aW9uCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG1hdHJpeCBRCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbihjb25zdCBNYXRyaXhUeXBlJikKKyAgICAgICogb3IgdGhlIG1lbWJlciBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKSBoYXMgYmVlbiBjYWxsZWQKKyAgICAgICogYmVmb3JlIHRvIGNvbXB1dGUgdGhlIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbGlnaHQtd2VpZ2h0IG9iamVjdCBvZiB0ZW1wbGF0ZSBjbGFzcworICAgICAgKiBIb3VzZWhvbGRlclNlcXVlbmNlLiBZb3UgY2FuIGVpdGhlciBhcHBseSBpdCBkaXJlY3RseSB0byBhIG1hdHJpeCBvcgorICAgICAgKiB5b3UgY2FuIGNvbnZlcnQgaXQgdG8gYSBtYXRyaXggb2YgdHlwZSAjTWF0cml4VHlwZS4KKyAgICAgICoKKyAgICAgICogXHNhIG1hdHJpeEgoKSBmb3IgYW4gZXhhbXBsZSwgY2xhc3MgSG91c2Vob2xkZXJTZXF1ZW5jZQorICAgICAgKi8KKyAgICBIb3VzZWhvbGRlclNlcXVlbmNlVHlwZSBtYXRyaXhRKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJIZXNzZW5iZXJnRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUobV9tYXRyaXgsIG1faENvZWZmcy5jb25qdWdhdGUoKSkKKyAgICAgICAgICAgICAuc2V0TGVuZ3RoKG1fbWF0cml4LnJvd3MoKSAtIDEpCisgICAgICAgICAgICAgLnNldFNoaWZ0KDEpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0cyB0aGUgSGVzc2VuYmVyZyBtYXRyaXggSCBpbiB0aGUgZGVjb21wb3NpdGlvbgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBleHByZXNzaW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG1hdHJpeCBICisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbihjb25zdCBNYXRyaXhUeXBlJikKKyAgICAgICogb3IgdGhlIG1lbWJlciBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKSBoYXMgYmVlbiBjYWxsZWQKKyAgICAgICogYmVmb3JlIHRvIGNvbXB1dGUgdGhlIEhlc3NlbmJlcmcgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgdGhlIEhlc3NlbmJlcmcgbWF0cml4IEgKKyAgICAgICogd2hlbiBpdCBpcyBhc3NpZ25lZCB0byBhIG1hdHJpeCBvciBvdGhlcndpc2UgZXZhbHVhdGVkLiBUaGUgbWF0cml4IEggaXMKKyAgICAgICogY29uc3RydWN0ZWQgZnJvbSB0aGUgcGFja2VkIG1hdHJpeCBhcyByZXR1cm5lZCBieSBwYWNrZWRNYXRyaXgoKTogVGhlCisgICAgICAqIHVwcGVyIHBhcnQgKGluY2x1ZGluZyB0aGUgc3ViZGlhZ29uYWwpIG9mIHRoZSBwYWNrZWQgbWF0cml4IGNvbnRhaW5zCisgICAgICAqIHRoZSBtYXRyaXggSC4gSXQgbWF5IHNvbWV0aW1lcyBiZSBiZXR0ZXIgdG8gZGlyZWN0bHkgdXNlIHRoZSBwYWNrZWQKKyAgICAgICogbWF0cml4IGluc3RlYWQgb2YgY29uc3RydWN0aW5nIHRoZSBtYXRyaXggSC4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fbWF0cml4SC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fbWF0cml4SC5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIG1hdHJpeFEoKSwgcGFja2VkTWF0cml4KCkKKyAgICAgICovCisgICAgTWF0cml4SFJldHVyblR5cGUgbWF0cml4SCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIE1hdHJpeEhSZXR1cm5UeXBlKCp0aGlzKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgU2l6ZSwgT3B0aW9ucyB8IFJvd01ham9yLCAxLCBNYXhTaXplPiBWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICBzdGF0aWMgdm9pZCBfY29tcHV0ZShNYXRyaXhUeXBlJiBtYXRBLCBDb2VmZlZlY3RvclR5cGUmIGhDb2VmZnMsIFZlY3RvclR5cGUmIHRlbXApOworCisgIHByb3RlY3RlZDoKKyAgICBNYXRyaXhUeXBlIG1fbWF0cml4OworICAgIENvZWZmVmVjdG9yVHlwZSBtX2hDb2VmZnM7CisgICAgVmVjdG9yVHlwZSBtX3RlbXA7CisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQ7Cit9OworCisvKiogXGludGVybmFsCisgICogUGVyZm9ybXMgYSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdEEgaW4gcGxhY2UuCisgICoKKyAgKiBccGFyYW0gbWF0QSB0aGUgaW5wdXQgc2VsZmFkam9pbnQgbWF0cml4CisgICogXHBhcmFtIGhDb2VmZnMgcmV0dXJuZWQgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzCisgICoKKyAgKiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiBcYSBtYXRBLgorICAqCisgICogSW1wbGVtZW50ZWQgZnJvbSBHb2x1YidzICIlTWF0cml4IENvbXB1dGF0aW9ucyIsIGFsZ29yaXRobSA4LjMuMS4KKyAgKgorICAqIFxzYSBwYWNrZWRNYXRyaXgoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248TWF0cml4VHlwZT46Ol9jb21wdXRlKE1hdHJpeFR5cGUmIG1hdEEsIENvZWZmVmVjdG9yVHlwZSYgaENvZWZmcywgVmVjdG9yVHlwZSYgdGVtcCkKK3sKKyAgYXNzZXJ0KG1hdEEucm93cygpPT1tYXRBLmNvbHMoKSk7CisgIEluZGV4IG4gPSBtYXRBLnJvd3MoKTsKKyAgdGVtcC5yZXNpemUobik7CisgIGZvciAoSW5kZXggaSA9IDA7IGk8bi0xOyArK2kpCisgIHsKKyAgICAvLyBsZXQncyBjb25zaWRlciB0aGUgdmVjdG9yIHYgPSBpLXRoIGNvbHVtbiBzdGFydGluZyBhdCBwb3NpdGlvbiBpKzEKKyAgICBJbmRleCByZW1haW5pbmdTaXplID0gbi1pLTE7CisgICAgUmVhbFNjYWxhciBiZXRhOworICAgIFNjYWxhciBoOworICAgIG1hdEEuY29sKGkpLnRhaWwocmVtYWluaW5nU2l6ZSkubWFrZUhvdXNlaG9sZGVySW5QbGFjZShoLCBiZXRhKTsKKyAgICBtYXRBLmNvbChpKS5jb2VmZlJlZihpKzEpID0gYmV0YTsKKyAgICBoQ29lZmZzLmNvZWZmUmVmKGkpID0gaDsKKworICAgIC8vIEFwcGx5IHNpbWlsYXJpdHkgdHJhbnNmb3JtYXRpb24gdG8gcmVtYWluaW5nIGNvbHVtbnMsCisgICAgLy8gaS5lLiwgY29tcHV0ZSBBID0gSCBBIEgnCisKKyAgICAvLyBBID0gSCBBCisgICAgbWF0QS5ib3R0b21SaWdodENvcm5lcihyZW1haW5pbmdTaXplLCByZW1haW5pbmdTaXplKQorICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChtYXRBLmNvbChpKS50YWlsKHJlbWFpbmluZ1NpemUtMSksIGgsICZ0ZW1wLmNvZWZmUmVmKDApKTsKKworICAgIC8vIEEgPSBBIEgnCisgICAgbWF0QS5yaWdodENvbHMocmVtYWluaW5nU2l6ZSkKKyAgICAgICAgLmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KG1hdEEuY29sKGkpLnRhaWwocmVtYWluaW5nU2l6ZS0xKS5jb25qdWdhdGUoKSwgaW50ZXJuYWw6OmNvbmooaCksICZ0ZW1wLmNvZWZmUmVmKDApKTsKKyAgfQorfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGVpZ2VudmFsdWVzX21vZHVsZSBcaW5ncm91cCBFaWdlbnZhbHVlc19Nb2R1bGUKKyAgKgorICAqCisgICogXGJyaWVmIEV4cHJlc3Npb24gdHlwZSBmb3IgcmV0dXJuIHZhbHVlIG9mIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uOjptYXRyaXhIKCkKKyAgKgorICAqIFx0cGFyYW0gTWF0cml4VHlwZSB0eXBlIG9mIG1hdHJpeCBpbiB0aGUgSGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uCisgICoKKyAgKiBPYmplY3RzIG9mIHRoaXMgdHlwZSByZXByZXNlbnQgdGhlIEhlc3NlbmJlcmcgbWF0cml4IGluIHRoZSBIZXNzZW5iZXJnCisgICogZGVjb21wb3NpdGlvbiBvZiBzb21lIG1hdHJpeC4gVGhlIG9iamVjdCBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUKKyAgKiBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbiBjbGFzcyB1bnRpbCB0aGUgaXQgaXMgYXNzaWduZWQgb3IgZXZhbHVhdGVkIGZvcgorICAqIHNvbWUgb3RoZXIgcmVhc29uICh0aGUgcmVmZXJlbmNlIHNob3VsZCByZW1haW4gdmFsaWQgZHVyaW5nIHRoZSBsaWZlIHRpbWUKKyAgKiBvZiB0aGlzIG9iamVjdCkuIFRoaXMgY2xhc3MgaXMgdGhlIHJldHVybiB0eXBlIG9mCisgICogSGVzc2VuYmVyZ0RlY29tcG9zaXRpb246Om1hdHJpeEgoKTsgdGhlcmUgaXMgcHJvYmFibHkgbm8gb3RoZXIgdXNlIGZvciB0aGlzCisgICogY2xhc3MuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBzdHJ1Y3QgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25NYXRyaXhIUmV0dXJuVHlwZQorOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxIZXNzZW5iZXJnRGVjb21wb3NpdGlvbk1hdHJpeEhSZXR1cm5UeXBlPE1hdHJpeFR5cGU+ID4KK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICBwdWJsaWM6CisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSBoZXNzICBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb24KKyAgICAgICovCisgICAgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25NYXRyaXhIUmV0dXJuVHlwZShjb25zdCBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiYgaGVzcykgOiBtX2hlc3MoaGVzcykgeyB9CisKKyAgICAvKiogXGJyaWVmIEhlc3NlbmJlcmcgbWF0cml4IGluIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxwYXJhbVtvdXRdIHJlc3VsdCAgSGVzc2VuYmVyZyBtYXRyaXggaW4gZGVjb21wb3NpdGlvbiBccCBoZXNzIHdoaWNoCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgd2FzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IKKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICByZXN1bHQgPSBtX2hlc3MucGFja2VkTWF0cml4KCk7CisgICAgICBJbmRleCBuID0gcmVzdWx0LnJvd3MoKTsKKyAgICAgIGlmIChuPjIpCisgICAgICAgIHJlc3VsdC5ib3R0b21MZWZ0Q29ybmVyKG4tMiwgbi0yKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgICAgfQorCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1faGVzcy5wYWNrZWRNYXRyaXgoKS5yb3dzKCk7IH0KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9oZXNzLnBhY2tlZE1hdHJpeCgpLmNvbHMoKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiYgbV9oZXNzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSEVTU0VOQkVSR0RFQ09NUE9TSVRJT05fSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL01hdHJpeEJhc2VFaWdlbnZhbHVlcy5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL01hdHJpeEJhc2VFaWdlbnZhbHVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjQ4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvTWF0cml4QmFzZUVpZ2VudmFsdWVzLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BVFJJWEJBU0VFSUdFTlZBTFVFU19ICisjZGVmaW5lIEVJR0VOX01BVFJJWEJBU0VFSUdFTlZBTFVFU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCBib29sIElzQ29tcGxleD4KK3N0cnVjdCBlaWdlbnZhbHVlc19zZWxlY3RvcgoreworICAvLyB0aGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGNhc2UgSXNDb21wbGV4ID0gdHJ1ZQorICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OkVpZ2VudmFsdWVzUmV0dXJuVHlwZSBjb25zdAorICBydW4oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgICAgUGxhaW5PYmplY3QgbV9ldmFsKG0pOworICAgIHJldHVybiBDb21wbGV4RWlnZW5Tb2x2ZXI8UGxhaW5PYmplY3Q+KG1fZXZhbCwgZmFsc2UpLmVpZ2VudmFsdWVzKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgZWlnZW52YWx1ZXNfc2VsZWN0b3I8RGVyaXZlZCwgZmFsc2U+Cit7CisgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6RWlnZW52YWx1ZXNSZXR1cm5UeXBlIGNvbnN0CisgIHJ1bihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBQbGFpbk9iamVjdDsKKyAgICBQbGFpbk9iamVjdCBtX2V2YWwobSk7CisgICAgcmV0dXJuIEVpZ2VuU29sdmVyPFBsYWluT2JqZWN0PihtX2V2YWwsIGZhbHNlKS5laWdlbnZhbHVlcygpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxicmllZiBDb21wdXRlcyB0aGUgZWlnZW52YWx1ZXMgb2YgYSBtYXRyaXggCisgICogXHJldHVybnMgQ29sdW1uIHZlY3RvciBjb250YWluaW5nIHRoZSBlaWdlbnZhbHVlcy4KKyAgKgorICAqIFxlaWdlbnZhbHVlc19tb2R1bGUKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBlaWdlbnZhbHVlcyB3aXRoIHRoZSBoZWxwIG9mIHRoZSBFaWdlblNvbHZlcgorICAqIGNsYXNzIChmb3IgcmVhbCBtYXRyaWNlcykgb3IgdGhlIENvbXBsZXhFaWdlblNvbHZlciBjbGFzcyAoZm9yIGNvbXBsZXgKKyAgKiBtYXRyaWNlcykuIAorICAqCisgICogVGhlIGVpZ2VudmFsdWVzIGFyZSByZXBlYXRlZCBhY2NvcmRpbmcgdG8gdGhlaXIgYWxnZWJyYWljIG11bHRpcGxpY2l0eSwKKyAgKiBzbyB0aGVyZSBhcmUgYXMgbWFueSBlaWdlbnZhbHVlcyBhcyByb3dzIGluIHRoZSBtYXRyaXguCisgICoKKyAgKiBUaGUgU2VsZkFkam9pbnRWaWV3IGNsYXNzIHByb3ZpZGVzIGEgYmV0dGVyIGFsZ29yaXRobSBmb3Igc2VsZmFkam9pbnQKKyAgKiBtYXRyaWNlcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfZWlnZW52YWx1ZXMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9laWdlbnZhbHVlcy5vdXQKKyAgKgorICAqIFxzYSBFaWdlblNvbHZlcjo6ZWlnZW52YWx1ZXMoKSwgQ29tcGxleEVpZ2VuU29sdmVyOjplaWdlbnZhbHVlcygpLAorICAqICAgICBTZWxmQWRqb2ludFZpZXc6OmVpZ2VudmFsdWVzKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6RWlnZW52YWx1ZXNSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+OjplaWdlbnZhbHVlcygpIGNvbnN0Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgcmV0dXJuIGludGVybmFsOjplaWdlbnZhbHVlc19zZWxlY3RvcjxEZXJpdmVkLCBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4Pjo6cnVuKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIG9mIGEgbWF0cml4CisgICogXHJldHVybnMgQ29sdW1uIHZlY3RvciBjb250YWluaW5nIHRoZSBlaWdlbnZhbHVlcy4KKyAgKgorICAqIFxlaWdlbnZhbHVlc19tb2R1bGUKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBlaWdlbnZhbHVlcyB3aXRoIHRoZSBoZWxwIG9mIHRoZQorICAqIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgY2xhc3MuICBUaGUgZWlnZW52YWx1ZXMgYXJlIHJlcGVhdGVkIGFjY29yZGluZyB0bworICAqIHRoZWlyIGFsZ2VicmFpYyBtdWx0aXBsaWNpdHksIHNvIHRoZXJlIGFyZSBhcyBtYW55IGVpZ2VudmFsdWVzIGFzIHJvd3MgaW4KKyAgKiB0aGUgbWF0cml4LgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRWaWV3X2VpZ2VudmFsdWVzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50Vmlld19laWdlbnZhbHVlcy5vdXQKKyAgKgorICAqIFxzYSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyOjplaWdlbnZhbHVlcygpLCBNYXRyaXhCYXNlOjplaWdlbnZhbHVlcygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgVXBMbz4gCitpbmxpbmUgdHlwZW5hbWUgU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsIFVwTG8+OjpFaWdlbnZhbHVlc1JldHVyblR5cGUKK1NlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLCBVcExvPjo6ZWlnZW52YWx1ZXMoKSBjb25zdAoreworICB0eXBlZGVmIHR5cGVuYW1lIFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLCBVcExvPjo6UGxhaW5PYmplY3QgUGxhaW5PYmplY3Q7CisgIFBsYWluT2JqZWN0IHRoaXNBc01hdHJpeCgqdGhpcyk7CisgIHJldHVybiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPFBsYWluT2JqZWN0Pih0aGlzQXNNYXRyaXgsIGZhbHNlKS5laWdlbnZhbHVlcygpOworfQorCisKKworLyoqIFxicmllZiBDb21wdXRlcyB0aGUgTDIgb3BlcmF0b3Igbm9ybQorICAqIFxyZXR1cm5zIE9wZXJhdG9yIG5vcm0gb2YgdGhlIG1hdHJpeC4KKyAgKgorICAqIFxlaWdlbnZhbHVlc19tb2R1bGUKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBMMiBvcGVyYXRvciBub3JtIG9mIGEgbWF0cml4LCB3aGljaCBpcyBhbHNvCisgICoga25vd24gYXMgdGhlIHNwZWN0cmFsIG5vcm0uIFRoZSBub3JtIG9mIGEgbWF0cml4IFxmJCBBIFxmJCBpcyBkZWZpbmVkIHRvIGJlCisgICogXGZbIFx8QVx8XzIgPSBcbWF4X3ggXGZyYWN7XHxBeFx8XzJ9e1x8eFx8XzJ9IFxmXQorICAqIHdoZXJlIHRoZSBtYXhpbXVtIGlzIG92ZXIgYWxsIHZlY3RvcnMgYW5kIHRoZSBub3JtIG9uIHRoZSByaWdodCBpcyB0aGUKKyAgKiBFdWNsaWRlYW4gdmVjdG9yIG5vcm0uIFRoZSBub3JtIGVxdWFscyB0aGUgbGFyZ2VzdCBzaW5ndWxhciB2YWx1ZSwgd2hpY2ggaXMKKyAgKiB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGxhcmdlc3QgZWlnZW52YWx1ZSBvZiB0aGUgcG9zaXRpdmUgc2VtaS1kZWZpbml0ZQorICAqIG1hdHJpeCBcZiQgQV4qQSBcZiQuCisgICoKKyAgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBlaWdlbnZhbHVlcyBvZiBcZiQgQV4qQSBcZiQsIGFzIGNvbXB1dGVkCisgICogYnkgU2VsZkFkam9pbnRWaWV3OjplaWdlbnZhbHVlcygpLCB0byBjb21wdXRlIHRoZSBvcGVyYXRvciBub3JtIG9mIGEKKyAgKiBtYXRyaXguICBUaGUgU2VsZkFkam9pbnRWaWV3IGNsYXNzIHByb3ZpZGVzIGEgYmV0dGVyIGFsZ29yaXRobSBmb3IKKyAgKiBzZWxmYWRqb2ludCBtYXRyaWNlcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2Vfb3BlcmF0b3JOb3JtLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2Vfb3BlcmF0b3JOb3JtLm91dAorICAqCisgICogXHNhIFNlbGZBZGpvaW50Vmlldzo6ZWlnZW52YWx1ZXMoKSwgU2VsZkFkam9pbnRWaWV3OjpvcGVyYXRvck5vcm0oKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpSZWFsU2NhbGFyCitNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvck5vcm0oKSBjb25zdAoreworICB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBtX2V2YWwoZGVyaXZlZCgpKTsKKyAgLy8gRklYTUUgaWYgaXQgaXMgcmVhbGx5IGd1YXJhbnRlZWQgdGhhdCB0aGUgZWlnZW52YWx1ZXMgYXJlIGFscmVhZHkgc29ydGVkLAorICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gY29tcHV0ZSBhIG1heENvZWZmKCkgaGVyZSwgY29tcGFyaW5nIHRoZSAxc3QgYW5kIGxhc3Qgb25lcyBpcyBlbm91Z2guCisgIHJldHVybiBpbnRlcm5hbDo6c3FydCgobV9ldmFsKm1fZXZhbC5hZGpvaW50KCkpCisgICAgICAgICAgICAgICAgIC5ldmFsKCkKKwkJIC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkKKwkJIC5laWdlbnZhbHVlcygpCisJCSAubWF4Q29lZmYoKQorCQkgKTsKK30KKworLyoqIFxicmllZiBDb21wdXRlcyB0aGUgTDIgb3BlcmF0b3Igbm9ybQorICAqIFxyZXR1cm5zIE9wZXJhdG9yIG5vcm0gb2YgdGhlIG1hdHJpeC4KKyAgKgorICAqIFxlaWdlbnZhbHVlc19tb2R1bGUKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBMMiBvcGVyYXRvciBub3JtIG9mIGEgc2VsZi1hZGpvaW50IG1hdHJpeC4gRm9yIGEKKyAgKiBzZWxmLWFkam9pbnQgbWF0cml4LCB0aGUgb3BlcmF0b3Igbm9ybSBpcyB0aGUgbGFyZ2VzdCBlaWdlbnZhbHVlLgorICAqCisgICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgZWlnZW52YWx1ZXMgb2YgdGhlIG1hdHJpeCwgYXMgY29tcHV0ZWQKKyAgKiBieSBlaWdlbnZhbHVlcygpLCB0byBjb21wdXRlIHRoZSBvcGVyYXRvciBub3JtIG9mIHRoZSBtYXRyaXguCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBTZWxmQWRqb2ludFZpZXdfb3BlcmF0b3JOb3JtLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50Vmlld19vcGVyYXRvck5vcm0ub3V0CisgICoKKyAgKiBcc2EgZWlnZW52YWx1ZXMoKSwgTWF0cml4QmFzZTo6b3BlcmF0b3JOb3JtKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPgoraW5saW5lIHR5cGVuYW1lIFNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLCBVcExvPjo6UmVhbFNjYWxhcgorU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsIFVwTG8+OjpvcGVyYXRvck5vcm0oKSBjb25zdAoreworICByZXR1cm4gZWlnZW52YWx1ZXMoKS5jd2lzZUFicygpLm1heENvZWZmKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9SZWFsU2NodXIuaCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9SZWFsU2NodXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODE2OTJlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1JlYWxTY2h1ci5oCkBAIC0wLDAgKzEsNDY0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9SRUFMX1NDSFVSX0gKKyNkZWZpbmUgRUlHRU5fUkVBTF9TQ0hVUl9ICisKKyNpbmNsdWRlICIuL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uLmgiCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGVpZ2VudmFsdWVzX21vZHVsZSBcaW5ncm91cCBFaWdlbnZhbHVlc19Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIFJlYWxTY2h1cgorICAqCisgICogXGJyaWVmIFBlcmZvcm1zIGEgcmVhbCBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGEgc3F1YXJlIG1hdHJpeAorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoIHdlIGFyZSBjb21wdXRpbmcgdGhlCisgICogcmVhbCBTY2h1ciBkZWNvbXBvc2l0aW9uOyB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlCisgICogTWF0cml4IGNsYXNzIHRlbXBsYXRlLgorICAqCisgICogR2l2ZW4gYSByZWFsIHNxdWFyZSBtYXRyaXggQSwgdGhpcyBjbGFzcyBjb21wdXRlcyB0aGUgcmVhbCBTY2h1cgorICAqIGRlY29tcG9zaXRpb246IFxmJCBBID0gVSBUIFVeVCBcZiQgd2hlcmUgVSBpcyBhIHJlYWwgb3J0aG9nb25hbCBtYXRyaXggYW5kCisgICogVCBpcyBhIHJlYWwgcXVhc2ktdHJpYW5ndWxhciBtYXRyaXguIEFuIG9ydGhvZ29uYWwgbWF0cml4IGlzIGEgbWF0cml4IHdob3NlCisgICogaW52ZXJzZSBpcyBlcXVhbCB0byBpdHMgdHJhbnNwb3NlLCBcZiQgVV57LTF9ID0gVV5UIFxmJC4gQSBxdWFzaS10cmlhbmd1bGFyCisgICogbWF0cml4IGlzIGEgYmxvY2stdHJpYW5ndWxhciBtYXRyaXggd2hvc2UgZGlhZ29uYWwgY29uc2lzdHMgb2YgMS1ieS0xCisgICogYmxvY2tzIGFuZCAyLWJ5LTIgYmxvY2tzIHdpdGggY29tcGxleCBlaWdlbnZhbHVlcy4gVGhlIGVpZ2VudmFsdWVzIG9mIHRoZQorICAqIGJsb2NrcyBvbiB0aGUgZGlhZ29uYWwgb2YgVCBhcmUgdGhlIHNhbWUgYXMgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSBtYXRyaXgKKyAgKiBBLCBhbmQgdGh1cyB0aGUgcmVhbCBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIHVzZWQgaW4gRWlnZW5Tb2x2ZXIgdG8gY29tcHV0ZQorICAqIHRoZSBlaWdlbmRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICoKKyAgKiBDYWxsIHRoZSBmdW5jdGlvbiBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgcmVhbCBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGEKKyAgKiBnaXZlbiBtYXRyaXguIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBSZWFsU2NodXIoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wpCisgICogY29uc3RydWN0b3Igd2hpY2ggY29tcHV0ZXMgdGhlIHJlYWwgU2NodXIgZGVjb21wb3NpdGlvbiBhdCBjb25zdHJ1Y3Rpb24KKyAgKiB0aW1lLiBPbmNlIHRoZSBkZWNvbXBvc2l0aW9uIGlzIGNvbXB1dGVkLCB5b3UgY2FuIHVzZSB0aGUgbWF0cml4VSgpIGFuZAorICAqIG1hdHJpeFQoKSBmdW5jdGlvbnMgdG8gcmV0cmlldmUgdGhlIG1hdHJpY2VzIFUgYW5kIFQgaW4gdGhlIGRlY29tcG9zaXRpb24uCisgICoKKyAgKiBUaGUgZG9jdW1lbnRhdGlvbiBvZiBSZWFsU2NodXIoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wpIGNvbnRhaW5zIGFuIGV4YW1wbGUKKyAgKiBvZiB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBjbGFzcy4KKyAgKgorICAqIFxub3RlIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhZGFwdGVkIGZyb20KKyAgKiA8YSBocmVmPSJodHRwOi8vbWF0aC5uaXN0Lmdvdi9qYXZhbnVtZXJpY3MvamFtYS8iPkpBTUE8L2E+IChwdWJsaWMgZG9tYWluKS4KKyAgKiBUaGVpciBjb2RlIGlzIGJhc2VkIG9uIEVJU1BBQ0suCisgICoKKyAgKiBcc2EgY2xhc3MgQ29tcGxleFNjaHVyLCBjbGFzcyBFaWdlblNvbHZlciwgY2xhc3MgQ29tcGxleEVpZ2VuU29sdmVyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgUmVhbFNjaHVyCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbD4gQ29tcGxleFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgICAgdHlwZWRlZiBNYXRyaXg8Q29tcGxleFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIE9wdGlvbnMgJiB+Um93TWFqb3IsIE1heENvbHNBdENvbXBpbGVUaW1lLCAxPiBFaWdlbnZhbHVlVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCAxLCBPcHRpb25zICYgflJvd01ham9yLCBNYXhDb2xzQXRDb21waWxlVGltZSwgMT4gQ29sdW1uVmVjdG9yVHlwZTsKKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIFtpbl0gc2l6ZSAgUG9zaXRpdmUgaW50ZWdlciwgc2l6ZSBvZiB0aGUgbWF0cml4IHdob3NlIFNjaHVyIGRlY29tcG9zaXRpb24gd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgdXNlZnVsIGluIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyIGludGVuZHMgdG8KKyAgICAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgY29tcHV0ZSgpLiAgVGhlIFxwIHNpemUgcGFyYW1ldGVyIGlzIG9ubHkKKyAgICAgICogdXNlZCBhcyBhIGhpbnQuIEl0IGlzIG5vdCBhbiBlcnJvciB0byBnaXZlIGEgd3JvbmcgXHAgc2l6ZSwgYnV0IGl0IG1heQorICAgICAgKiBpbXBhaXIgcGVyZm9ybWFuY2UuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkgZm9yIGFuIGV4YW1wbGUuCisgICAgICAqLworICAgIFJlYWxTY2h1cihJbmRleCBzaXplID0gUm93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyAxIDogUm93c0F0Q29tcGlsZVRpbWUpCisgICAgICAgICAgICA6IG1fbWF0VChzaXplLCBzaXplKSwKKyAgICAgICAgICAgICAgbV9tYXRVKHNpemUsIHNpemUpLAorICAgICAgICAgICAgICBtX3dvcmtzcGFjZVZlY3RvcihzaXplKSwKKyAgICAgICAgICAgICAgbV9oZXNzKHNpemUpLAorICAgICAgICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgICAgICAgICBtX21hdFVpc1VwdG9kYXRlKGZhbHNlKQorICAgIHsgfQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RvcjsgY29tcHV0ZXMgcmVhbCBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4gCisgICAgICAqIAorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggICAgU3F1YXJlIG1hdHJpeCB3aG9zZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlVSAgSWYgdHJ1ZSwgYm90aCBUIGFuZCBVIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgVCBpcyBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgU2NodXIgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgUmVhbFNjaHVyX1JlYWxTY2h1cl9NYXRyaXhUeXBlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBSZWFsU2NodXJfUmVhbFNjaHVyX01hdHJpeFR5cGUub3V0CisgICAgICAqLworICAgIFJlYWxTY2h1cihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGJvb2wgY29tcHV0ZVUgPSB0cnVlKQorICAgICAgICAgICAgOiBtX21hdFQobWF0cml4LnJvd3MoKSxtYXRyaXguY29scygpKSwKKyAgICAgICAgICAgICAgbV9tYXRVKG1hdHJpeC5yb3dzKCksbWF0cml4LmNvbHMoKSksCisgICAgICAgICAgICAgIG1fd29ya3NwYWNlVmVjdG9yKG1hdHJpeC5yb3dzKCkpLAorICAgICAgICAgICAgICBtX2hlc3MobWF0cml4LnJvd3MoKSksCisgICAgICAgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgICAgICAgIG1fbWF0VWlzVXB0b2RhdGUoZmFsc2UpCisgICAgeworICAgICAgY29tcHV0ZShtYXRyaXgsIGNvbXB1dGVVKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIG9ydGhvZ29uYWwgbWF0cml4IGluIHRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uLiAKKyAgICAgICoKKyAgICAgICogXHJldHVybnMgQSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBVLgorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgUmVhbFNjaHVyKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBvciB0aGUKKyAgICAgICogbWVtYmVyIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUKKyAgICAgICogdG8gY29tcHV0ZSB0aGUgU2NodXIgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCwgYW5kIFxwIGNvbXB1dGVVIHdhcyBzZXQKKyAgICAgICogdG8gdHJ1ZSAodGhlIGRlZmF1bHQgdmFsdWUpLgorICAgICAgKgorICAgICAgKiBcc2EgUmVhbFNjaHVyKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBmb3IgYW4gZXhhbXBsZQorICAgICAgKi8KKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXhVKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJSZWFsU2NodXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fbWF0VWlzVXB0b2RhdGUgJiYgIlRoZSBtYXRyaXggVSBoYXMgbm90IGJlZW4gY29tcHV0ZWQgZHVyaW5nIHRoZSBSZWFsU2NodXIgZGVjb21wb3NpdGlvbi4iKTsKKyAgICAgIHJldHVybiBtX21hdFU7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBxdWFzaS10cmlhbmd1bGFyIG1hdHJpeCBpbiB0aGUgU2NodXIgZGVjb21wb3NpdGlvbi4gCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggVC4KKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIFJlYWxTY2h1cihjb25zdCBNYXRyaXhUeXBlJiwgYm9vbCkgb3IgdGhlCisgICAgICAqIG1lbWJlciBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBib29sKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlCisgICAgICAqIHRvIGNvbXB1dGUgdGhlIFNjaHVyIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxzYSBSZWFsU2NodXIoY29uc3QgTWF0cml4VHlwZSYsIGJvb2wpIGZvciBhbiBleGFtcGxlCisgICAgICAqLworICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFQoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlJlYWxTY2h1ciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9tYXRUOworICAgIH0KKyAgCisgICAgLyoqIFxicmllZiBDb21wdXRlcyBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4gCisgICAgICAqIAorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggICAgU3F1YXJlIG1hdHJpeCB3aG9zZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKiBccGFyYW1baW5dICBjb21wdXRlVSAgSWYgdHJ1ZSwgYm90aCBUIGFuZCBVIGFyZSBjb21wdXRlZDsgaWYgZmFsc2UsIG9ubHkgVCBpcyBjb21wdXRlZC4KKyAgICAgICogXHJldHVybnMgICAgUmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIFRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIGNvbXB1dGVkIGJ5IGZpcnN0IHJlZHVjaW5nIHRoZSBtYXRyaXggdG8KKyAgICAgICogSGVzc2VuYmVyZyBmb3JtIHVzaW5nIHRoZSBjbGFzcyBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbi4gVGhlIEhlc3NlbmJlcmcKKyAgICAgICogbWF0cml4IGlzIHRoZW4gcmVkdWNlZCB0byB0cmlhbmd1bGFyIGZvcm0gYnkgcGVyZm9ybWluZyBGcmFuY2lzIFFSCisgICAgICAqIGl0ZXJhdGlvbnMgd2l0aCBpbXBsaWNpdCBkb3VibGUgc2hpZnQuIFRoZSBjb3N0IG9mIGNvbXB1dGluZyB0aGUgU2NodXIKKyAgICAgICogZGVjb21wb3NpdGlvbiBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgYXMgYSByb3VnaCBndWlkZSwgaXQKKyAgICAgICogbWF5IGJlIHRha2VuIHRvIGJlIFxmJDI1bl4zXGYkIGZsb3BzIGlmIFxhIGNvbXB1dGVVIGlzIHRydWUgYW5kCisgICAgICAqIFxmJDEwbl4zXGYkIGZsb3BzIGlmIFxhIGNvbXB1dGVVIGlzIGZhbHNlLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBSZWFsU2NodXJfY29tcHV0ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgUmVhbFNjaHVyX2NvbXB1dGUub3V0CisgICAgICAqLworICAgIFJlYWxTY2h1ciYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGJvb2wgY29tcHV0ZVUgPSB0cnVlKTsKKworICAgIC8qKiBcYnJpZWYgUmVwb3J0cyB3aGV0aGVyIHByZXZpb3VzIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBcYyBTdWNjZXNzIGlmIGNvbXB1dGF0aW9uIHdhcyBzdWNjZXNmdWwsIFxjIE5vQ29udmVyZ2VuY2Ugb3RoZXJ3aXNlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiUmVhbFNjaHVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2luZm87CisgICAgfQorCisgICAgLyoqIFxicmllZiBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zLgorICAgICAgKgorICAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGFsbG93ZWQgZm9yIGFuIGVpZ2VudmFsdWUgdG8gY29udmVyZ2UuIAorICAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IG1fbWF4SXRlcmF0aW9ucyA9IDQwOworCisgIHByaXZhdGU6CisgICAgCisgICAgTWF0cml4VHlwZSBtX21hdFQ7CisgICAgTWF0cml4VHlwZSBtX21hdFU7CisgICAgQ29sdW1uVmVjdG9yVHlwZSBtX3dvcmtzcGFjZVZlY3RvcjsKKyAgICBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiBtX2hlc3M7CisgICAgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKKyAgICBib29sIG1fbWF0VWlzVXB0b2RhdGU7CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzczsKKworICAgIFNjYWxhciBjb21wdXRlTm9ybU9mVCgpOworICAgIEluZGV4IGZpbmRTbWFsbFN1YmRpYWdFbnRyeShJbmRleCBpdSwgU2NhbGFyIG5vcm0pOworICAgIHZvaWQgc3BsaXRPZmZUd29Sb3dzKEluZGV4IGl1LCBib29sIGNvbXB1dGVVLCBTY2FsYXIgZXhzaGlmdCk7CisgICAgdm9pZCBjb21wdXRlU2hpZnQoSW5kZXggaXUsIEluZGV4IGl0ZXIsIFNjYWxhciYgZXhzaGlmdCwgVmVjdG9yM3MmIHNoaWZ0SW5mbyk7CisgICAgdm9pZCBpbml0RnJhbmNpc1FSU3RlcChJbmRleCBpbCwgSW5kZXggaXUsIGNvbnN0IFZlY3RvcjNzJiBzaGlmdEluZm8sIEluZGV4JiBpbSwgVmVjdG9yM3MmIGZpcnN0SG91c2Vob2xkZXJWZWN0b3IpOworICAgIHZvaWQgcGVyZm9ybUZyYW5jaXNRUlN0ZXAoSW5kZXggaWwsIEluZGV4IGltLCBJbmRleCBpdSwgYm9vbCBjb21wdXRlVSwgY29uc3QgVmVjdG9yM3MmIGZpcnN0SG91c2Vob2xkZXJWZWN0b3IsIFNjYWxhciogd29ya3NwYWNlKTsKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK1JlYWxTY2h1cjxNYXRyaXhUeXBlPiYgUmVhbFNjaHVyPE1hdHJpeFR5cGU+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgYm9vbCBjb21wdXRlVSkKK3sKKyAgYXNzZXJ0KG1hdHJpeC5jb2xzKCkgPT0gbWF0cml4LnJvd3MoKSk7CisKKyAgLy8gU3RlcCAxLiBSZWR1Y2UgdG8gSGVzc2VuYmVyZyBmb3JtCisgIG1faGVzcy5jb21wdXRlKG1hdHJpeCk7CisgIG1fbWF0VCA9IG1faGVzcy5tYXRyaXhIKCk7CisgIGlmIChjb21wdXRlVSkKKyAgICBtX21hdFUgPSBtX2hlc3MubWF0cml4USgpOworCisgIC8vIFN0ZXAgMi4gUmVkdWNlIHRvIHJlYWwgU2NodXIgZm9ybSAgCisgIG1fd29ya3NwYWNlVmVjdG9yLnJlc2l6ZShtX21hdFQuY29scygpKTsKKyAgU2NhbGFyKiB3b3Jrc3BhY2UgPSAmbV93b3Jrc3BhY2VWZWN0b3IuY29lZmZSZWYoMCk7CisKKyAgLy8gVGhlIG1hdHJpeCBtX21hdFQgaXMgZGl2aWRlZCBpbiB0aHJlZSBwYXJ0cy4gCisgIC8vIFJvd3MgMCwuLi4saWwtMSBhcmUgZGVjb3VwbGVkIGZyb20gdGhlIHJlc3QgYmVjYXVzZSBtX21hdFQoaWwsaWwtMSkgaXMgemVyby4gCisgIC8vIFJvd3MgaWwsLi4uLGl1IGlzIHRoZSBwYXJ0IHdlIGFyZSB3b3JraW5nIG9uICh0aGUgYWN0aXZlIHdpbmRvdykuCisgIC8vIFJvd3MgaXUrMSwuLi4sZW5kIGFyZSBhbHJlYWR5IGJyb3VnaHQgaW4gdHJpYW5ndWxhciBmb3JtLgorICBJbmRleCBpdSA9IG1fbWF0VC5jb2xzKCkgLSAxOworICBJbmRleCBpdGVyID0gMDsgLy8gaXRlcmF0aW9uIGNvdW50CisgIFNjYWxhciBleHNoaWZ0KDApOyAvLyBzdW0gb2YgZXhjZXB0aW9uYWwgc2hpZnRzCisgIFNjYWxhciBub3JtID0gY29tcHV0ZU5vcm1PZlQoKTsKKworICBpZihub3JtIT0wKQorICB7CisgICAgd2hpbGUgKGl1ID49IDApCisgICAgeworICAgICAgSW5kZXggaWwgPSBmaW5kU21hbGxTdWJkaWFnRW50cnkoaXUsIG5vcm0pOworCisgICAgICAvLyBDaGVjayBmb3IgY29udmVyZ2VuY2UKKyAgICAgIGlmIChpbCA9PSBpdSkgLy8gT25lIHJvb3QgZm91bmQKKyAgICAgIHsKKyAgICAgICAgbV9tYXRULmNvZWZmUmVmKGl1LGl1KSA9IG1fbWF0VC5jb2VmZihpdSxpdSkgKyBleHNoaWZ0OworICAgICAgICBpZiAoaXUgPiAwKQorICAgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpdSwgaXUtMSkgPSBTY2FsYXIoMCk7CisgICAgICAgIGl1LS07CisgICAgICAgIGl0ZXIgPSAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaWwgPT0gaXUtMSkgLy8gVHdvIHJvb3RzIGZvdW5kCisgICAgICB7CisgICAgICAgIHNwbGl0T2ZmVHdvUm93cyhpdSwgY29tcHV0ZVUsIGV4c2hpZnQpOworICAgICAgICBpdSAtPSAyOworICAgICAgICBpdGVyID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgLy8gTm8gY29udmVyZ2VuY2UgeWV0CisgICAgICB7CisgICAgICAgIC8vIFRoZSBmaXJzdEhvdXNlaG9sZGVyVmVjdG9yIHZlY3RvciBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gc29tZXRoaW5nIHRvIGdldCByaWQgb2YgYSBzaWxseSBHQ0Mgd2FybmluZyAoLU8xIC1XYWxsIC1ETkRFQlVHICkKKyAgICAgICAgVmVjdG9yM3MgZmlyc3RIb3VzZWhvbGRlclZlY3RvcigwLDAsMCksIHNoaWZ0SW5mbzsKKyAgICAgICAgY29tcHV0ZVNoaWZ0KGl1LCBpdGVyLCBleHNoaWZ0LCBzaGlmdEluZm8pOworICAgICAgICBpdGVyID0gaXRlciArIDE7CisgICAgICAgIGlmIChpdGVyID4gbV9tYXhJdGVyYXRpb25zICogbV9tYXRULmNvbHMoKSkgYnJlYWs7CisgICAgICAgIEluZGV4IGltOworICAgICAgICBpbml0RnJhbmNpc1FSU3RlcChpbCwgaXUsIHNoaWZ0SW5mbywgaW0sIGZpcnN0SG91c2Vob2xkZXJWZWN0b3IpOworICAgICAgICBwZXJmb3JtRnJhbmNpc1FSU3RlcChpbCwgaW0sIGl1LCBjb21wdXRlVSwgZmlyc3RIb3VzZWhvbGRlclZlY3Rvciwgd29ya3NwYWNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoaXRlciA8PSBtX21heEl0ZXJhdGlvbnMgKiBtX21hdFQuY29scygpKSAKKyAgICBtX2luZm8gPSBTdWNjZXNzOworICBlbHNlCisgICAgbV9pbmZvID0gTm9Db252ZXJnZW5jZTsKKworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICBtX21hdFVpc1VwdG9kYXRlID0gY29tcHV0ZVU7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFxpbnRlcm5hbCBDb21wdXRlcyBhbmQgcmV0dXJucyB2ZWN0b3IgTDEgbm9ybSBvZiBUICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBSZWFsU2NodXI8TWF0cml4VHlwZT46OmNvbXB1dGVOb3JtT2ZUKCkKK3sKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fbWF0VC5jb2xzKCk7CisgIC8vIEZJWE1FIHRvIGJlIGVmZmljaWVudCB0aGUgZm9sbG93aW5nIHdvdWxkIHJlcXVpcmVzIGEgdHJpYW5ndWxhciByZWR1eGlvbiBjb2RlCisgIC8vIFNjYWxhciBub3JtID0gbV9tYXRULnVwcGVyKCkuY3dpc2VBYnMoKS5zdW0oKSAKKyAgLy8gICAgICAgICAgICAgICArIG1fbWF0VC5ib3R0b21MZWZ0Q29ybmVyKHNpemUtMSxzaXplLTEpLmRpYWdvbmFsKCkuY3dpc2VBYnMoKS5zdW0oKTsKKyAgU2NhbGFyIG5vcm0oMCk7CisgIGZvciAoSW5kZXggaiA9IDA7IGogPCBzaXplOyArK2opCisgICAgbm9ybSArPSBtX21hdFQucm93KGopLnNlZ21lbnQoKHN0ZDo6bWF4KShqLTEsSW5kZXgoMCkpLCBzaXplLShzdGQ6Om1heCkoai0xLEluZGV4KDApKSkuY3dpc2VBYnMoKS5zdW0oKTsKKyAgcmV0dXJuIG5vcm07Cit9CisKKy8qKiBcaW50ZXJuYWwgTG9vayBmb3Igc2luZ2xlIHNtYWxsIHN1Yi1kaWFnb25hbCBlbGVtZW50IGFuZCByZXR1cm5zIGl0cyBpbmRleCAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2lubGluZSB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBSZWFsU2NodXI8TWF0cml4VHlwZT46OmZpbmRTbWFsbFN1YmRpYWdFbnRyeShJbmRleCBpdSwgU2NhbGFyIG5vcm0pCit7CisgIEluZGV4IHJlcyA9IGl1OworICB3aGlsZSAocmVzID4gMCkKKyAgeworICAgIFNjYWxhciBzID0gaW50ZXJuYWw6OmFicyhtX21hdFQuY29lZmYocmVzLTEscmVzLTEpKSArIGludGVybmFsOjphYnMobV9tYXRULmNvZWZmKHJlcyxyZXMpKTsKKyAgICBpZiAocyA9PSAwLjApCisgICAgICBzID0gbm9ybTsKKyAgICBpZiAoaW50ZXJuYWw6OmFicyhtX21hdFQuY29lZmYocmVzLHJlcy0xKSkgPCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICogcykKKyAgICAgIGJyZWFrOworICAgIHJlcy0tOworICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qKiBcaW50ZXJuYWwgVXBkYXRlIFQgZ2l2ZW4gdGhhdCByb3dzIGl1LTEgYW5kIGl1IGRlY291cGxlIGZyb20gdGhlIHJlc3QuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIHZvaWQgUmVhbFNjaHVyPE1hdHJpeFR5cGU+OjpzcGxpdE9mZlR3b1Jvd3MoSW5kZXggaXUsIGJvb2wgY29tcHV0ZVUsIFNjYWxhciBleHNoaWZ0KQoreworICBjb25zdCBJbmRleCBzaXplID0gbV9tYXRULmNvbHMoKTsKKworICAvLyBUaGUgZWlnZW52YWx1ZXMgb2YgdGhlIDJ4MiBtYXRyaXggW2EgYjsgYyBkXSBhcmUgCisgIC8vIHRyYWNlICsvLSBzcXJ0KGRpc2NyLzQpIHdoZXJlIGRpc2NyID0gdHJeMiAtIDQqZGV0LCB0ciA9IGEgKyBkLCBkZXQgPSBhZCAtIGJjCisgIFNjYWxhciBwID0gU2NhbGFyKDAuNSkgKiAobV9tYXRULmNvZWZmKGl1LTEsaXUtMSkgLSBtX21hdFQuY29lZmYoaXUsaXUpKTsKKyAgU2NhbGFyIHEgPSBwICogcCArIG1fbWF0VC5jb2VmZihpdSxpdS0xKSAqIG1fbWF0VC5jb2VmZihpdS0xLGl1KTsgICAvLyBxID0gdHJeMiAvIDQgLSBkZXQgPSBkaXNjci80CisgIG1fbWF0VC5jb2VmZlJlZihpdSxpdSkgKz0gZXhzaGlmdDsKKyAgbV9tYXRULmNvZWZmUmVmKGl1LTEsaXUtMSkgKz0gZXhzaGlmdDsKKworICBpZiAocSA+PSBTY2FsYXIoMCkpIC8vIFR3byByZWFsIGVpZ2VudmFsdWVzCisgIHsKKyAgICBTY2FsYXIgeiA9IGludGVybmFsOjpzcXJ0KGludGVybmFsOjphYnMocSkpOworICAgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4gcm90OworICAgIGlmIChwID49IFNjYWxhcigwKSkKKyAgICAgIHJvdC5tYWtlR2l2ZW5zKHAgKyB6LCBtX21hdFQuY29lZmYoaXUsIGl1LTEpKTsKKyAgICBlbHNlCisgICAgICByb3QubWFrZUdpdmVucyhwIC0geiwgbV9tYXRULmNvZWZmKGl1LCBpdS0xKSk7CisKKyAgICBtX21hdFQucmlnaHRDb2xzKHNpemUtaXUrMSkuYXBwbHlPblRoZUxlZnQoaXUtMSwgaXUsIHJvdC5hZGpvaW50KCkpOworICAgIG1fbWF0VC50b3BSb3dzKGl1KzEpLmFwcGx5T25UaGVSaWdodChpdS0xLCBpdSwgcm90KTsKKyAgICBtX21hdFQuY29lZmZSZWYoaXUsIGl1LTEpID0gU2NhbGFyKDApOyAKKyAgICBpZiAoY29tcHV0ZVUpCisgICAgICBtX21hdFUuYXBwbHlPblRoZVJpZ2h0KGl1LTEsIGl1LCByb3QpOworICB9CisKKyAgaWYgKGl1ID4gMSkgCisgICAgbV9tYXRULmNvZWZmUmVmKGl1LTEsIGl1LTIpID0gU2NhbGFyKDApOworfQorCisvKiogXGludGVybmFsIEZvcm0gc2hpZnQgaW4gc2hpZnRJbmZvLCBhbmQgdXBkYXRlIGV4c2hpZnQgaWYgYW4gZXhjZXB0aW9uYWwgc2hpZnQgaXMgcGVyZm9ybWVkLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2lubGluZSB2b2lkIFJlYWxTY2h1cjxNYXRyaXhUeXBlPjo6Y29tcHV0ZVNoaWZ0KEluZGV4IGl1LCBJbmRleCBpdGVyLCBTY2FsYXImIGV4c2hpZnQsIFZlY3RvcjNzJiBzaGlmdEluZm8pCit7CisgIHNoaWZ0SW5mby5jb2VmZlJlZigwKSA9IG1fbWF0VC5jb2VmZihpdSxpdSk7CisgIHNoaWZ0SW5mby5jb2VmZlJlZigxKSA9IG1fbWF0VC5jb2VmZihpdS0xLGl1LTEpOworICBzaGlmdEluZm8uY29lZmZSZWYoMikgPSBtX21hdFQuY29lZmYoaXUsaXUtMSkgKiBtX21hdFQuY29lZmYoaXUtMSxpdSk7CisKKyAgLy8gV2lsa2luc29uJ3Mgb3JpZ2luYWwgYWQgaG9jIHNoaWZ0CisgIGlmIChpdGVyID09IDEwKQorICB7CisgICAgZXhzaGlmdCArPSBzaGlmdEluZm8uY29lZmYoMCk7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8PSBpdTsgKytpKQorICAgICAgbV9tYXRULmNvZWZmUmVmKGksaSkgLT0gc2hpZnRJbmZvLmNvZWZmKDApOworICAgIFNjYWxhciBzID0gaW50ZXJuYWw6OmFicyhtX21hdFQuY29lZmYoaXUsaXUtMSkpICsgaW50ZXJuYWw6OmFicyhtX21hdFQuY29lZmYoaXUtMSxpdS0yKSk7CisgICAgc2hpZnRJbmZvLmNvZWZmUmVmKDApID0gU2NhbGFyKDAuNzUpICogczsKKyAgICBzaGlmdEluZm8uY29lZmZSZWYoMSkgPSBTY2FsYXIoMC43NSkgKiBzOworICAgIHNoaWZ0SW5mby5jb2VmZlJlZigyKSA9IFNjYWxhcigtMC40Mzc1KSAqIHMgKiBzOworICB9CisKKyAgLy8gTUFUTEFCJ3MgbmV3IGFkIGhvYyBzaGlmdAorICBpZiAoaXRlciA9PSAzMCkKKyAgeworICAgIFNjYWxhciBzID0gKHNoaWZ0SW5mby5jb2VmZigxKSAtIHNoaWZ0SW5mby5jb2VmZigwKSkgLyBTY2FsYXIoMi4wKTsKKyAgICBzID0gcyAqIHMgKyBzaGlmdEluZm8uY29lZmYoMik7CisgICAgaWYgKHMgPiBTY2FsYXIoMCkpCisgICAgeworICAgICAgcyA9IGludGVybmFsOjpzcXJ0KHMpOworICAgICAgaWYgKHNoaWZ0SW5mby5jb2VmZigxKSA8IHNoaWZ0SW5mby5jb2VmZigwKSkKKyAgICAgICAgcyA9IC1zOworICAgICAgcyA9IHMgKyAoc2hpZnRJbmZvLmNvZWZmKDEpIC0gc2hpZnRJbmZvLmNvZWZmKDApKSAvIFNjYWxhcigyLjApOworICAgICAgcyA9IHNoaWZ0SW5mby5jb2VmZigwKSAtIHNoaWZ0SW5mby5jb2VmZigyKSAvIHM7CisgICAgICBleHNoaWZ0ICs9IHM7CisgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDw9IGl1OyArK2kpCisgICAgICAgIG1fbWF0VC5jb2VmZlJlZihpLGkpIC09IHM7CisgICAgICBzaGlmdEluZm8uc2V0Q29uc3RhbnQoU2NhbGFyKDAuOTY0KSk7CisgICAgfQorICB9Cit9CisKKy8qKiBcaW50ZXJuYWwgQ29tcHV0ZSBpbmRleCBpbSBhdCB3aGljaCBGcmFuY2lzIFFSIHN0ZXAgc3RhcnRzIGFuZCB0aGUgZmlyc3QgSG91c2Vob2xkZXIgdmVjdG9yLiAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2lubGluZSB2b2lkIFJlYWxTY2h1cjxNYXRyaXhUeXBlPjo6aW5pdEZyYW5jaXNRUlN0ZXAoSW5kZXggaWwsIEluZGV4IGl1LCBjb25zdCBWZWN0b3IzcyYgc2hpZnRJbmZvLCBJbmRleCYgaW0sIFZlY3RvcjNzJiBmaXJzdEhvdXNlaG9sZGVyVmVjdG9yKQoreworICBWZWN0b3IzcyYgdiA9IGZpcnN0SG91c2Vob2xkZXJWZWN0b3I7IC8vIGFsaWFzIHRvIHNhdmUgdHlwaW5nCisKKyAgZm9yIChpbSA9IGl1LTI7IGltID49IGlsOyAtLWltKQorICB7CisgICAgY29uc3QgU2NhbGFyIFRtbSA9IG1fbWF0VC5jb2VmZihpbSxpbSk7CisgICAgY29uc3QgU2NhbGFyIHIgPSBzaGlmdEluZm8uY29lZmYoMCkgLSBUbW07CisgICAgY29uc3QgU2NhbGFyIHMgPSBzaGlmdEluZm8uY29lZmYoMSkgLSBUbW07CisgICAgdi5jb2VmZlJlZigwKSA9IChyICogcyAtIHNoaWZ0SW5mby5jb2VmZigyKSkgLyBtX21hdFQuY29lZmYoaW0rMSxpbSkgKyBtX21hdFQuY29lZmYoaW0saW0rMSk7CisgICAgdi5jb2VmZlJlZigxKSA9IG1fbWF0VC5jb2VmZihpbSsxLGltKzEpIC0gVG1tIC0gciAtIHM7CisgICAgdi5jb2VmZlJlZigyKSA9IG1fbWF0VC5jb2VmZihpbSsyLGltKzEpOworICAgIGlmIChpbSA9PSBpbCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNvbnN0IFNjYWxhciBsaHMgPSBtX21hdFQuY29lZmYoaW0saW0tMSkgKiAoaW50ZXJuYWw6OmFicyh2LmNvZWZmKDEpKSArIGludGVybmFsOjphYnModi5jb2VmZigyKSkpOworICAgIGNvbnN0IFNjYWxhciByaHMgPSB2LmNvZWZmKDApICogKGludGVybmFsOjphYnMobV9tYXRULmNvZWZmKGltLTEsaW0tMSkpICsgaW50ZXJuYWw6OmFicyhUbW0pICsgaW50ZXJuYWw6OmFicyhtX21hdFQuY29lZmYoaW0rMSxpbSsxKSkpOworICAgIGlmIChpbnRlcm5hbDo6YWJzKGxocykgPCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICogcmhzKQorICAgIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvKiogXGludGVybmFsIFBlcmZvcm0gYSBGcmFuY2lzIFFSIHN0ZXAgaW52b2x2aW5nIHJvd3MgaWw6aXUgYW5kIGNvbHVtbnMgaW06aXUuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW5saW5lIHZvaWQgUmVhbFNjaHVyPE1hdHJpeFR5cGU+OjpwZXJmb3JtRnJhbmNpc1FSU3RlcChJbmRleCBpbCwgSW5kZXggaW0sIEluZGV4IGl1LCBib29sIGNvbXB1dGVVLCBjb25zdCBWZWN0b3IzcyYgZmlyc3RIb3VzZWhvbGRlclZlY3RvciwgU2NhbGFyKiB3b3Jrc3BhY2UpCit7CisgIGFzc2VydChpbSA+PSBpbCk7CisgIGFzc2VydChpbSA8PSBpdS0yKTsKKworICBjb25zdCBJbmRleCBzaXplID0gbV9tYXRULmNvbHMoKTsKKworICBmb3IgKEluZGV4IGsgPSBpbTsgayA8PSBpdS0yOyArK2spCisgIHsKKyAgICBib29sIGZpcnN0SXRlcmF0aW9uID0gKGsgPT0gaW0pOworCisgICAgVmVjdG9yM3MgdjsKKyAgICBpZiAoZmlyc3RJdGVyYXRpb24pCisgICAgICB2ID0gZmlyc3RIb3VzZWhvbGRlclZlY3RvcjsKKyAgICBlbHNlCisgICAgICB2ID0gbV9tYXRULnRlbXBsYXRlIGJsb2NrPDMsMT4oayxrLTEpOworCisgICAgU2NhbGFyIHRhdSwgYmV0YTsKKyAgICBNYXRyaXg8U2NhbGFyLCAyLCAxPiBlc3M7CisgICAgdi5tYWtlSG91c2Vob2xkZXIoZXNzLCB0YXUsIGJldGEpOworICAgIAorICAgIGlmIChiZXRhICE9IFNjYWxhcigwKSkgLy8gaWYgdiBpcyBub3QgemVybworICAgIHsKKyAgICAgIGlmIChmaXJzdEl0ZXJhdGlvbiAmJiBrID4gaWwpCisgICAgICAgIG1fbWF0VC5jb2VmZlJlZihrLGstMSkgPSAtbV9tYXRULmNvZWZmKGssay0xKTsKKyAgICAgIGVsc2UgaWYgKCFmaXJzdEl0ZXJhdGlvbikKKyAgICAgICAgbV9tYXRULmNvZWZmUmVmKGssay0xKSA9IGJldGE7CisKKyAgICAgIC8vIFRoZXNlIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9ucyBmb3JtIHRoZSBPKG5eMykgcGFydCBvZiB0aGUgYWxnb3JpdGhtCisgICAgICBtX21hdFQuYmxvY2soaywgaywgMywgc2l6ZS1rKS5hcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KGVzcywgdGF1LCB3b3Jrc3BhY2UpOworICAgICAgbV9tYXRULmJsb2NrKDAsIGssIChzdGQ6Om1pbikoaXUsayszKSArIDEsIDMpLmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KGVzcywgdGF1LCB3b3Jrc3BhY2UpOworICAgICAgaWYgKGNvbXB1dGVVKQorICAgICAgICBtX21hdFUuYmxvY2soMCwgaywgc2l6ZSwgMykuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoZXNzLCB0YXUsIHdvcmtzcGFjZSk7CisgICAgfQorICB9CisKKyAgTWF0cml4PFNjYWxhciwgMiwgMT4gdiA9IG1fbWF0VC50ZW1wbGF0ZSBibG9jazwyLDE+KGl1LTEsIGl1LTIpOworICBTY2FsYXIgdGF1LCBiZXRhOworICBNYXRyaXg8U2NhbGFyLCAxLCAxPiBlc3M7CisgIHYubWFrZUhvdXNlaG9sZGVyKGVzcywgdGF1LCBiZXRhKTsKKworICBpZiAoYmV0YSAhPSBTY2FsYXIoMCkpIC8vIGlmIHYgaXMgbm90IHplcm8KKyAgeworICAgIG1fbWF0VC5jb2VmZlJlZihpdS0xLCBpdS0yKSA9IGJldGE7CisgICAgbV9tYXRULmJsb2NrKGl1LTEsIGl1LTEsIDIsIHNpemUtaXUrMSkuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3MsIHRhdSwgd29ya3NwYWNlKTsKKyAgICBtX21hdFQuYmxvY2soMCwgaXUtMSwgaXUrMSwgMikuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoZXNzLCB0YXUsIHdvcmtzcGFjZSk7CisgICAgaWYgKGNvbXB1dGVVKQorICAgICAgbV9tYXRVLmJsb2NrKDAsIGl1LTEsIHNpemUsIDIpLmFwcGx5SG91c2Vob2xkZXJPblRoZVJpZ2h0KGVzcywgdGF1LCB3b3Jrc3BhY2UpOworICB9CisKKyAgLy8gY2xlYW4gdXAgcG9sbHV0aW9uIGR1ZSB0byByb3VuZC1vZmYgZXJyb3JzCisgIGZvciAoSW5kZXggaSA9IGltKzI7IGkgPD0gaXU7ICsraSkKKyAgeworICAgIG1fbWF0VC5jb2VmZlJlZihpLGktMikgPSBTY2FsYXIoMCk7CisgICAgaWYgKGkgPiBpbSsyKQorICAgICAgbV9tYXRULmNvZWZmUmVmKGksaS0zKSA9IFNjYWxhcigwKTsKKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1JFQUxfU0NIVVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1JlYWxTY2h1cl9NS0wuaCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9SZWFsU2NodXJfTUtMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwZWMzYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9SZWFsU2NodXJfTUtMLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICAgUmVhbCBTY2h1ciBuZWVkZWQgdG8gcmVhbCB1bnN5bW1ldHJpY2FsIGVpZ2VudmFsdWVzL2VpZ2VudmVjdG9ycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9SRUFMX1NDSFVSX01LTF9ICisjZGVmaW5lIEVJR0VOX1JFQUxfU0NIVVJfTUtMX0gKKworI2luY2x1ZGUgIkVpZ2VuL3NyYy9Db3JlL3V0aWwvTUtMX3N1cHBvcnQuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW50ZXJuYWwgU3BlY2lhbGl6YXRpb24gZm9yIHRoZSBkYXRhIHR5cGVzIHN1cHBvcnRlZCBieSBNS0wgKi8KKworI2RlZmluZSBFSUdFTl9NS0xfU0NIVVJfUkVBTChFSUdUWVBFLCBNS0xUWVBFLCBNS0xQUkVGSVgsIE1LTFBSRUZJWF9VLCBFSUdDT0xST1csIE1LTENPTFJPVykgXAordGVtcGxhdGU8PiBpbmxpbmUgXAorUmVhbFNjaHVyPE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1c+ID4mIFwKK1JlYWxTY2h1cjxNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgRUlHQ09MUk9XPiA+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1c+JiBtYXRyaXgsIGJvb2wgY29tcHV0ZVUpIFwKK3sgXAorICB0eXBlZGVmIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1c+IE1hdHJpeFR5cGU7IFwKKyAgdHlwZWRlZiBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOyBcCisgIHR5cGVkZWYgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOyBcCitcCisgIGFzc2VydChtYXRyaXguY29scygpID09IG1hdHJpeC5yb3dzKCkpOyBcCitcCisgIGxhcGFja19pbnQgbiA9IG1hdHJpeC5jb2xzKCksIHNkaW0sIGluZm87IFwKKyAgbGFwYWNrX2ludCBsZGEgPSBtYXRyaXgub3V0ZXJTdHJpZGUoKTsgXAorICBsYXBhY2tfaW50IG1hdHJpeF9vcmRlciA9IE1LTENPTFJPVzsgXAorICBjaGFyIGpvYnZzLCBzb3J0PSdOJzsgXAorICBMQVBBQ0tfIyNNS0xQUkVGSVhfVSMjX1NFTEVDVDIgc2VsZWN0ID0gMDsgXAorICBqb2J2cyA9IChjb21wdXRlVSkgPyAnVicgOiAnTic7IFwKKyAgbV9tYXRVLnJlc2l6ZShuLCBuKTsgXAorICBsYXBhY2tfaW50IGxkdnMgID0gbV9tYXRVLm91dGVyU3RyaWRlKCk7IFwKKyAgbV9tYXRUID0gbWF0cml4OyBcCisgIE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljPiB3ciwgd2k7IFwKKyAgd3IucmVzaXplKG4sIDEpOyB3aS5yZXNpemUobiwgMSk7IFwKKyAgaW5mbyA9IExBUEFDS0VfIyNNS0xQUkVGSVgjI2dlZXMoIG1hdHJpeF9vcmRlciwgam9idnMsIHNvcnQsIHNlbGVjdCwgbiwgKE1LTFRZUEUqKW1fbWF0VC5kYXRhKCksIGxkYSwgJnNkaW0sIChNS0xUWVBFKil3ci5kYXRhKCksIChNS0xUWVBFKil3aS5kYXRhKCksIChNS0xUWVBFKiltX21hdFUuZGF0YSgpLCBsZHZzICk7IFwKKyAgaWYoaW5mbyA9PSAwKSBcCisgICAgbV9pbmZvID0gU3VjY2VzczsgXAorICBlbHNlIFwKKyAgICBtX2luZm8gPSBOb0NvbnZlcmdlbmNlOyBcCitcCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7IFwKKyAgbV9tYXRVaXNVcHRvZGF0ZSA9IGNvbXB1dGVVOyBcCisgIHJldHVybiAqdGhpczsgXAorXAorfQorCitFSUdFTl9NS0xfU0NIVVJfUkVBTChkb3VibGUsICAgZG91YmxlLCBkLCBELCBDb2xNYWpvciwgTEFQQUNLX0NPTF9NQUpPUikKK0VJR0VOX01LTF9TQ0hVUl9SRUFMKGZsb2F0LCAgICBmbG9hdCwgIHMsIFMsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTUtMX1NDSFVSX1JFQUwoZG91YmxlLCAgIGRvdWJsZSwgZCwgRCwgUm93TWFqb3IsIExBUEFDS19ST1dfTUFKT1IpCitFSUdFTl9NS0xfU0NIVVJfUkVBTChmbG9hdCwgICAgZmxvYXQsICBzLCBTLCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9SRUFMX1NDSFVSX01LTF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvU2VsZkFkam9pbnRFaWdlblNvbHZlci5oIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2M1NTc2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuaApAQCAtMCwwICsxLDc4OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TRUxGQURKT0lOVEVJR0VOU09MVkVSX0gKKyNkZWZpbmUgRUlHRU5fU0VMRkFESk9JTlRFSUdFTlNPTFZFUl9ICisKKyNpbmNsdWRlICIuL1RyaWRpYWdvbmFsaXphdGlvbi5oIgorCituYW1lc3BhY2UgRWlnZW4geyAKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitjbGFzcyBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXJUeXBlLGludCBTaXplLGJvb2wgSXNDb21wbGV4PiBzdHJ1Y3QgZGlyZWN0X3NlbGZhZGpvaW50X2VpZ2VudmFsdWVzOworfQorCisvKiogXGVpZ2VudmFsdWVzX21vZHVsZSBcaW5ncm91cCBFaWdlbnZhbHVlc19Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKKyAgKgorICAqIFxicmllZiBDb21wdXRlcyBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIHNlbGZhZGpvaW50IG1hdHJpY2VzCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUKKyAgKiBlaWdlbmRlY29tcG9zaXRpb247IHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4CisgICogY2xhc3MgdGVtcGxhdGUuCisgICoKKyAgKiBBIG1hdHJpeCBcZiQgQSBcZiQgaXMgc2VsZmFkam9pbnQgaWYgaXQgZXF1YWxzIGl0cyBhZGpvaW50LiBGb3IgcmVhbAorICAqIG1hdHJpY2VzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIG1hdHJpeCBpcyBzeW1tZXRyaWM6IGl0IGVxdWFscyBpdHMKKyAgKiB0cmFuc3Bvc2UuIFRoaXMgY2xhc3MgY29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgYQorICAqIHNlbGZhZGpvaW50IG1hdHJpeC4gVGhlc2UgYXJlIHRoZSBzY2FsYXJzIFxmJCBcbGFtYmRhIFxmJCBhbmQgdmVjdG9ycworICAqIFxmJCB2IFxmJCBzdWNoIHRoYXQgXGYkIEF2ID0gXGxhbWJkYSB2IFxmJC4gIFRoZSBlaWdlbnZhbHVlcyBvZiBhCisgICogc2VsZmFkam9pbnQgbWF0cml4IGFyZSBhbHdheXMgcmVhbC4gSWYgXGYkIEQgXGYkIGlzIGEgZGlhZ29uYWwgbWF0cml4IHdpdGgKKyAgKiB0aGUgZWlnZW52YWx1ZXMgb24gdGhlIGRpYWdvbmFsLCBhbmQgXGYkIFYgXGYkIGlzIGEgbWF0cml4IHdpdGggdGhlCisgICogZWlnZW52ZWN0b3JzIGFzIGl0cyBjb2x1bW5zLCB0aGVuIFxmJCBBID0gViBEIFZeey0xfSBcZiQgKGZvciBzZWxmYWRqb2ludAorICAqIG1hdHJpY2VzLCB0aGUgbWF0cml4IFxmJCBWIFxmJCBpcyBhbHdheXMgaW52ZXJ0aWJsZSkuIFRoaXMgaXMgY2FsbGVkIHRoZQorICAqIGVpZ2VuZGVjb21wb3NpdGlvbi4KKyAgKgorICAqIFRoZSBhbGdvcml0aG0gZXhwbG9pdHMgdGhlIGZhY3QgdGhhdCB0aGUgbWF0cml4IGlzIHNlbGZhZGpvaW50LCBtYWtpbmcgaXQKKyAgKiBmYXN0ZXIgYW5kIG1vcmUgYWNjdXJhdGUgdGhhbiB0aGUgZ2VuZXJhbCBwdXJwb3NlIGVpZ2VudmFsdWUgYWxnb3JpdGhtcworICAqIGltcGxlbWVudGVkIGluIEVpZ2VuU29sdmVyIGFuZCBDb21wbGV4RWlnZW5Tb2x2ZXIuCisgICoKKyAgKiBPbmx5IHRoZSBcYiBsb3dlciBcYiB0cmlhbmd1bGFyIFxiIHBhcnQgb2YgdGhlIGlucHV0IG1hdHJpeCBpcyByZWZlcmVuY2VkLgorICAqCisgICogQ2FsbCB0aGUgZnVuY3Rpb24gY29tcHV0ZSgpIHRvIGNvbXB1dGUgdGhlIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YKKyAgKiBhIGdpdmVuIG1hdHJpeC4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlCisgICogU2VsZkFkam9pbnRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiwgaW50KSBjb25zdHJ1Y3RvciB3aGljaCBjb21wdXRlcworICAqIHRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBPbmNlIHRoZSBlaWdlbnZhbHVlCisgICogYW5kIGVpZ2VudmVjdG9ycyBhcmUgY29tcHV0ZWQsIHRoZXkgY2FuIGJlIHJldHJpZXZlZCB3aXRoIHRoZSBlaWdlbnZhbHVlcygpCisgICogYW5kIGVpZ2VudmVjdG9ycygpIGZ1bmN0aW9ucy4KKyAgKgorICAqIFRoZSBkb2N1bWVudGF0aW9uIGZvciBTZWxmQWRqb2ludEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQpCisgICogY29udGFpbnMgYW4gZXhhbXBsZSBvZiB0aGUgdHlwaWNhbCB1c2Ugb2YgdGhpcyBjbGFzcy4KKyAgKgorICAqIFRvIHNvbHZlIHRoZSBcZW0gZ2VuZXJhbGl6ZWQgZWlnZW52YWx1ZSBwcm9ibGVtIFxmJCBBdiA9IFxsYW1iZGEgQnYgXGYkIGFuZAorICAqIHRoZSBsaWtlcywgc2VlIHRoZSBjbGFzcyBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6ZWlnZW52YWx1ZXMoKSwgY2xhc3MgRWlnZW5Tb2x2ZXIsIGNsYXNzIENvbXBsZXhFaWdlblNvbHZlcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+IGNsYXNzIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIGVudW0geworICAgICAgU2l6ZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisgICAgCisgICAgLyoqIFxicmllZiBTY2FsYXIgdHlwZSBmb3IgbWF0cmljZXMgb2YgdHlwZSBccCBfTWF0cml4VHlwZS4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICAgIC8qKiBcYnJpZWYgUmVhbCBzY2FsYXIgdHlwZSBmb3IgXHAgX01hdHJpeFR5cGUuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMganVzdCBcYyBTY2FsYXIgaWYgI1NjYWxhciBpcyByZWFsIChlLmcuLCBcYyBmbG9hdCBvcgorICAgICAgKiBcYyBkb3VibGUpLCBhbmQgdGhlIHR5cGUgb2YgdGhlIHJlYWwgcGFydCBvZiBcYyBTY2FsYXIgaWYgI1NjYWxhciBpcworICAgICAgKiBjb21wbGV4LgorICAgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgCisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6ZGlyZWN0X3NlbGZhZGpvaW50X2VpZ2VudmFsdWVzPFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIsU2l6ZSxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4PjsKKworICAgIC8qKiBcYnJpZWYgVHlwZSBmb3IgdmVjdG9yIG9mIGVpZ2VudmFsdWVzIGFzIHJldHVybmVkIGJ5IGVpZ2VudmFsdWVzKCkuCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSBjb2x1bW4gdmVjdG9yIHdpdGggZW50cmllcyBvZiB0eXBlICNSZWFsU2NhbGFyLgorICAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgaXMgdGhlIHNpemUgb2YgXHAgX01hdHJpeFR5cGUuCisgICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbF90eXBlPE1hdHJpeFR5cGUsIFJlYWxTY2FsYXI+Ojp0eXBlIFJlYWxWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFR5cGU+IFRyaWRpYWdvbmFsaXphdGlvblR5cGU7CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIGZpeGVkLXNpemUgbWF0cmljZXMuCisgICAgICAqCisgICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIGNvbXB1dGUoKS4gVGhpcyBjb25zdHJ1Y3RvcgorICAgICAgKiBjYW4gb25seSBiZSB1c2VkIGlmIFxwIF9NYXRyaXhUeXBlIGlzIGEgZml4ZWQtc2l6ZSBtYXRyaXg7IHVzZQorICAgICAgKiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyKEluZGV4KSBmb3IgZHluYW1pYy1zaXplIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlci5vdXQKKyAgICAgICovCisgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcigpCisgICAgICAgIDogbV9laXZlYygpLAorICAgICAgICAgIG1fZWl2YWx1ZXMoKSwKKyAgICAgICAgICBtX3N1YmRpYWcoKSwKKyAgICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeyB9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yLCBwcmUtYWxsb2NhdGVzIG1lbW9yeSBmb3IgZHluYW1pYy1zaXplIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBccGFyYW0gW2luXSAgc2l6ZSAgUG9zaXRpdmUgaW50ZWdlciwgc2l6ZSBvZiB0aGUgbWF0cml4IHdob3NlCisgICAgICAqIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgZm9yIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcywgd2hlbiB0aGUgdXNlcgorICAgICAgKiBpbnRlbmRzIHRvIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIGNvbXB1dGUoKS4gVGhlIFxwIHNpemUKKyAgICAgICogcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBhcyBhIGhpbnQuIEl0IGlzIG5vdCBhbiBlcnJvciB0byBnaXZlIGEgd3JvbmcKKyAgICAgICogXHAgc2l6ZSwgYnV0IGl0IG1heSBpbXBhaXIgcGVyZm9ybWFuY2UuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkgZm9yIGFuIGV4YW1wbGUKKyAgICAgICovCisgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcihJbmRleCBzaXplKQorICAgICAgICA6IG1fZWl2ZWMoc2l6ZSwgc2l6ZSksCisgICAgICAgICAgbV9laXZhbHVlcyhzaXplKSwKKyAgICAgICAgICBtX3N1YmRpYWcoc2l6ZSA+IDEgPyBzaXplIC0gMSA6IDEpLAorICAgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7fQorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3RvcjsgY29tcHV0ZXMgZWlnZW5kZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSAgbWF0cml4ICBTZWxmYWRqb2ludCBtYXRyaXggd2hvc2UgZWlnZW5kZWNvbXBvc2l0aW9uIGlzIHRvCisgICAgICAqICAgIGJlIGNvbXB1dGVkLiBPbmx5IHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBpcyByZWZlcmVuY2VkLgorICAgICAgKiBccGFyYW1baW5dICBvcHRpb25zIENhbiBiZSAjQ29tcHV0ZUVpZ2VudmVjdG9ycyAoZGVmYXVsdCkgb3IgI0VpZ2VudmFsdWVzT25seS4KKyAgICAgICoKKyAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmLCBpbnQpIHRvIGNvbXB1dGUgdGhlCisgICAgICAqIGVpZ2VudmFsdWVzIG9mIHRoZSBtYXRyaXggXHAgbWF0cml4LiBUaGUgZWlnZW52ZWN0b3JzIGFyZSBjb21wdXRlZCBpZgorICAgICAgKiBccCBvcHRpb25zIGVxdWFscyAjQ29tcHV0ZUVpZ2VudmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlLm91dAorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiwgaW50KQorICAgICAgKi8KKyAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgaW50IG9wdGlvbnMgPSBDb21wdXRlRWlnZW52ZWN0b3JzKQorICAgICAgOiBtX2VpdmVjKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2VpdmFsdWVzKG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX3N1YmRpYWcobWF0cml4LnJvd3MoKSA+IDEgPyBtYXRyaXgucm93cygpIC0gMSA6IDEpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgY29tcHV0ZShtYXRyaXgsIG9wdGlvbnMpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgZWlnZW5kZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW2luXSAgbWF0cml4ICBTZWxmYWRqb2ludCBtYXRyaXggd2hvc2UgZWlnZW5kZWNvbXBvc2l0aW9uIGlzIHRvCisgICAgICAqICAgIGJlIGNvbXB1dGVkLiBPbmx5IHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBpcyByZWZlcmVuY2VkLgorICAgICAgKiBccGFyYW1baW5dICBvcHRpb25zIENhbiBiZSAjQ29tcHV0ZUVpZ2VudmVjdG9ycyAoZGVmYXVsdCkgb3IgI0VpZ2VudmFsdWVzT25seS4KKyAgICAgICogXHJldHVybnMgICAgUmVmZXJlbmNlIHRvIFxjICp0aGlzCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGVpZ2VudmFsdWVzIG9mIFxwIG1hdHJpeC4gIFRoZSBlaWdlbnZhbHVlcygpCisgICAgICAqIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZW0uICBJZiBccCBvcHRpb25zIGVxdWFscyAjQ29tcHV0ZUVpZ2VudmVjdG9ycywKKyAgICAgICogdGhlbiB0aGUgZWlnZW52ZWN0b3JzIGFyZSBhbHNvIGNvbXB1dGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5CisgICAgICAqIGNhbGxpbmcgZWlnZW52ZWN0b3JzKCkuCisgICAgICAqCisgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBhIHN5bW1ldHJpYyBRUiBhbGdvcml0aG0uIFRoZSBtYXRyaXggaXMgZmlyc3QKKyAgICAgICogcmVkdWNlZCB0byB0cmlkaWFnb25hbCBmb3JtIHVzaW5nIHRoZSBUcmlkaWFnb25hbGl6YXRpb24gY2xhc3MuIFRoZQorICAgICAgKiB0cmlkaWFnb25hbCBtYXRyaXggaXMgdGhlbiBicm91Z2h0IHRvIGRpYWdvbmFsIGZvcm0gd2l0aCBpbXBsaWNpdAorICAgICAgKiBzeW1tZXRyaWMgUVIgc3RlcHMgd2l0aCBXaWxraW5zb24gc2hpZnQuIERldGFpbHMgY2FuIGJlIGZvdW5kIGluCisgICAgICAqIFNlY3Rpb24gOC4zIG9mIEdvbHViIFwmIFZhbiBMb2FuLCA8aT4lTWF0cml4IENvbXB1dGF0aW9uczwvaT4uCisgICAgICAqCisgICAgICAqIFRoZSBjb3N0IG9mIHRoZSBjb21wdXRhdGlvbiBpcyBhYm91dCBcZiQgOW5eMyBcZiQgaWYgdGhlIGVpZ2VudmVjdG9ycworICAgICAgKiBhcmUgcmVxdWlyZWQgYW5kIFxmJCA0bl4zLzMgXGYkIGlmIHRoZXkgYXJlIG5vdCByZXF1aXJlZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBtZXRob2QgcmV1c2VzIHRoZSBtZW1vcnkgaW4gdGhlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgb2JqZWN0IHRoYXQKKyAgICAgICogd2FzIGFsbG9jYXRlZCB3aGVuIHRoZSBvYmplY3Qgd2FzIGNvbnN0cnVjdGVkLCBpZiB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICogbWF0cml4IGRvZXMgbm90IGNoYW5nZS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfY29tcHV0ZV9NYXRyaXhUeXBlLm91dAorICAgICAgKgorICAgICAgKiBcc2EgU2VsZkFkam9pbnRFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiwgaW50KQorICAgICAgKi8KKyAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgaW50IG9wdGlvbnMgPSBDb21wdXRlRWlnZW52ZWN0b3JzKTsKKyAgICAKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIGVpZ2VuZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXggdXNpbmcgYSBkaXJlY3QgYWxnb3JpdGhtCisgICAgICAqCisgICAgICAqIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGludCBvcHRpb25zKSB3aGljaAorICAgICAgKiBkaXJlY3RseSBzb2x2ZXMgdGhlIHVuZGVybHlpbmcgcG9seW5vbWlhbCBlcXVhdGlvbi4KKyAgICAgICogCisgICAgICAqIEN1cnJlbnRseSBvbmx5IDN4MyBtYXRyaWNlcyBmb3Igd2hpY2ggdGhlIHNpemVzIGFyZSBrbm93biBhdCBjb21waWxlIHRpbWUgYXJlIHN1cHBvcnRlZCAoZS5nLiwgTWF0cml4M2QpLgorICAgICAgKiAKKyAgICAgICogVGhpcyBtZXRob2QgaXMgdXN1YWxseSBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIHRoZSBRUiBhbGdvcml0aG0KKyAgICAgICogYnV0IGl0IG1pZ2h0IGFsc28gYmUgbGVzcyBhY2N1cmF0ZS4gSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdAorICAgICAgKiBmb3IgM3gzIG1hdHJpY2VzIGl0IGludm9sdmVzIHRyaWdvbm9tZXRyaWMgb3BlcmF0aW9ucyB3aGljaCBhcmUKKyAgICAgICogbm90IG5lY2Vzc2FyaWx5IGF2YWlsYWJsZSBmb3IgYWxsIHNjYWxhciB0eXBlcy4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIGludCBvcHRpb25zKQorICAgICAgKi8KKyAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyJiBjb21wdXRlRGlyZWN0KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgaW50IG9wdGlvbnMgPSBDb21wdXRlRWlnZW52ZWN0b3JzKTsKKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgZWlnZW52ZWN0b3JzIG9mIGdpdmVuIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggd2hvc2UgY29sdW1ucyBhcmUgdGhlIGVpZ2VudmVjdG9ycy4KKyAgICAgICoKKyAgICAgICogXHByZSBUaGUgZWlnZW52ZWN0b3JzIGhhdmUgYmVlbiBjb21wdXRlZCBiZWZvcmUuCisgICAgICAqCisgICAgICAqIENvbHVtbiBcZiQgayBcZiQgb2YgdGhlIHJldHVybmVkIG1hdHJpeCBpcyBhbiBlaWdlbnZlY3RvciBjb3JyZXNwb25kaW5nCisgICAgICAqIHRvIGVpZ2VudmFsdWUgbnVtYmVyIFxmJCBrIFxmJCBhcyByZXR1cm5lZCBieSBlaWdlbnZhbHVlcygpLiAgVGhlCisgICAgICAqIGVpZ2VudmVjdG9ycyBhcmUgbm9ybWFsaXplZCB0byBoYXZlIChFdWNsaWRlYW4pIG5vcm0gZXF1YWwgdG8gb25lLiBJZgorICAgICAgKiB0aGlzIG9iamVjdCB3YXMgdXNlZCB0byBzb2x2ZSB0aGUgZWlnZW5wcm9ibGVtIGZvciB0aGUgc2VsZmFkam9pbnQKKyAgICAgICogbWF0cml4IFxmJCBBIFxmJCwgdGhlbiB0aGUgbWF0cml4IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgdGhlCisgICAgICAqIG1hdHJpeCBcZiQgViBcZiQgaW4gdGhlIGVpZ2VuZGVjb21wb3NpdGlvbiBcZiQgQSA9IFYgRCBWXnstMX0gXGYkLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBTZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMub3V0CisgICAgICAqCisgICAgICAqIFxzYSBlaWdlbnZhbHVlcygpCisgICAgICAqLworICAgIGNvbnN0IE1hdHJpeFR5cGUmIGVpZ2VudmVjdG9ycygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiU2VsZkFkam9pbnRFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9laWdlbnZlY3RvcnNPayAmJiAiVGhlIGVpZ2VudmVjdG9ycyBoYXZlIG5vdCBiZWVuIGNvbXB1dGVkIHRvZ2V0aGVyIHdpdGggdGhlIGVpZ2VudmFsdWVzLiIpOworICAgICAgcmV0dXJuIG1fZWl2ZWM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXR1cm5zIHRoZSBlaWdlbnZhbHVlcyBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBjb2x1bW4gdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGVpZ2VudmFsdWVzLgorICAgICAgKgorICAgICAgKiBccHJlIFRoZSBlaWdlbnZhbHVlcyBoYXZlIGJlZW4gY29tcHV0ZWQgYmVmb3JlLgorICAgICAgKgorICAgICAgKiBUaGUgZWlnZW52YWx1ZXMgYXJlIHJlcGVhdGVkIGFjY29yZGluZyB0byB0aGVpciBhbGdlYnJhaWMgbXVsdGlwbGljaXR5LAorICAgICAgKiBzbyB0aGVyZSBhcmUgYXMgbWFueSBlaWdlbnZhbHVlcyBhcyByb3dzIGluIHRoZSBtYXRyaXguIFRoZSBlaWdlbnZhbHVlcworICAgICAgKiBhcmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMub3V0CisgICAgICAqCisgICAgICAqIFxzYSBlaWdlbnZlY3RvcnMoKSwgTWF0cml4QmFzZTo6ZWlnZW52YWx1ZXMoKQorICAgICAgKi8KKyAgICBjb25zdCBSZWFsVmVjdG9yVHlwZSYgZWlnZW52YWx1ZXMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fZWl2YWx1ZXM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlcyB0aGUgcG9zaXRpdmUtZGVmaW5pdGUgc3F1YXJlIHJvb3Qgb2YgdGhlIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgdGhlIHBvc2l0aXZlLWRlZmluaXRlIHNxdWFyZSByb290IG9mIHRoZSBtYXRyaXgKKyAgICAgICoKKyAgICAgICogXHByZSBUaGUgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyBvZiBhIHBvc2l0aXZlLWRlZmluaXRlIG1hdHJpeAorICAgICAgKiBoYXZlIGJlZW4gY29tcHV0ZWQgYmVmb3JlLgorICAgICAgKgorICAgICAgKiBUaGUgc3F1YXJlIHJvb3Qgb2YgYSBwb3NpdGl2ZS1kZWZpbml0ZSBtYXRyaXggXGYkIEEgXGYkIGlzIHRoZQorICAgICAgKiBwb3NpdGl2ZS1kZWZpbml0ZSBtYXRyaXggd2hvc2Ugc3F1YXJlIGVxdWFscyBcZiQgQSBcZiQuIFRoaXMgZnVuY3Rpb24KKyAgICAgICogdXNlcyB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uIFxmJCBBID0gViBEIFZeey0xfSBcZiQgdG8gY29tcHV0ZSB0aGUKKyAgICAgICogc3F1YXJlIHJvb3QgYXMgXGYkIEFeezEvMn0gPSBWIEReezEvMn0gVl57LTF9IFxmJC4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvclNxcnQuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfb3BlcmF0b3JTcXJ0Lm91dAorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3JJbnZlcnNlU3FydCgpLAorICAgICAgKiAgICAgXHJlZiBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlICJNYXRyaXhGdW5jdGlvbnMgTW9kdWxlIgorICAgICAgKi8KKyAgICBNYXRyaXhUeXBlIG9wZXJhdG9yU3FydCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiU2VsZkFkam9pbnRFaWdlblNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9laWdlbnZlY3RvcnNPayAmJiAiVGhlIGVpZ2VudmVjdG9ycyBoYXZlIG5vdCBiZWVuIGNvbXB1dGVkIHRvZ2V0aGVyIHdpdGggdGhlIGVpZ2VudmFsdWVzLiIpOworICAgICAgcmV0dXJuIG1fZWl2ZWMgKiBtX2VpdmFsdWVzLmN3aXNlU3FydCgpLmFzRGlhZ29uYWwoKSAqIG1fZWl2ZWMuYWRqb2ludCgpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIGludmVyc2Ugc3F1YXJlIHJvb3Qgb2YgdGhlIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgdGhlIGludmVyc2UgcG9zaXRpdmUtZGVmaW5pdGUgc3F1YXJlIHJvb3Qgb2YgdGhlIG1hdHJpeAorICAgICAgKgorICAgICAgKiBccHJlIFRoZSBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG9mIGEgcG9zaXRpdmUtZGVmaW5pdGUgbWF0cml4CisgICAgICAqIGhhdmUgYmVlbiBjb21wdXRlZCBiZWZvcmUuCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZWlnZW5kZWNvbXBvc2l0aW9uIFxmJCBBID0gViBEIFZeey0xfSBcZiQgdG8KKyAgICAgICogY29tcHV0ZSB0aGUgaW52ZXJzZSBzcXVhcmUgcm9vdCBhcyBcZiQgViBEXnstMS8yfSBWXnstMX0gXGYkLiBUaGlzIGlzCisgICAgICAqIGNoZWFwZXIgdGhhbiBmaXJzdCBjb21wdXRpbmcgdGhlIHNxdWFyZSByb290IHdpdGggb3BlcmF0b3JTcXJ0KCkgYW5kCisgICAgICAqIHRoZW4gaXRzIGludmVyc2Ugd2l0aCBNYXRyaXhCYXNlOjppbnZlcnNlKCkuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfb3BlcmF0b3JJbnZlcnNlU3FydC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvckludmVyc2VTcXJ0Lm91dAorICAgICAgKgorICAgICAgKiBcc2Egb3BlcmF0b3JTcXJ0KCksIE1hdHJpeEJhc2U6OmludmVyc2UoKSwKKyAgICAgICogICAgIFxyZWYgTWF0cml4RnVuY3Rpb25zX01vZHVsZSAiTWF0cml4RnVuY3Rpb25zIE1vZHVsZSIKKyAgICAgICovCisgICAgTWF0cml4VHlwZSBvcGVyYXRvckludmVyc2VTcXJ0KCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTZWxmQWRqb2ludEVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2VpZ2VudmVjdG9yc09rICYmICJUaGUgZWlnZW52ZWN0b3JzIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgdG9nZXRoZXIgd2l0aCB0aGUgZWlnZW52YWx1ZXMuIik7CisgICAgICByZXR1cm4gbV9laXZlYyAqIG1fZWl2YWx1ZXMuY3dpc2VJbnZlcnNlKCkuY3dpc2VTcXJ0KCkuYXNEaWFnb25hbCgpICogbV9laXZlYy5hZGpvaW50KCk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwgXGMgTm9Db252ZXJnZW5jZSBvdGhlcndpc2UuCisgICAgICAqLworICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTZWxmQWRqb2ludEVpZ2VuU29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2luZm87CisgICAgfQorCisgICAgLyoqIFxicmllZiBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zLgorICAgICAgKgorICAgICAgKiBUaGUgYWxnb3JpdGhtIHRlcm1pbmF0ZXMgaWYgaXQgZG9lcyBub3QgY29udmVyZ2Ugd2l0aGluIG1fbWF4SXRlcmF0aW9ucyAqIG4gaXRlcmF0aW9ucywgd2hlcmUgbgorICAgICAgKiBkZW5vdGVzIHRoZSBzaXplIG9mIHRoZSBtYXRyaXguIFRoaXMgdmFsdWUgaXMgY3VycmVudGx5IHNldCB0byAzMCAoY29waWVkIGZyb20gTEFQQUNLKS4KKyAgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBtX21heEl0ZXJhdGlvbnMgPSAzMDsKKworICAgICNpZmRlZiBFSUdFTjJfU1VQUE9SVAorICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMpCisgICAgICA6IG1fZWl2ZWMobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fZWl2YWx1ZXMobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fc3ViZGlhZyhtYXRyaXgucm93cygpID4gMSA/IG1hdHJpeC5yb3dzKCkgLSAxIDogMSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBjb21wdXRlKG1hdHJpeCwgY29tcHV0ZUVpZ2VudmVjdG9ycyk7CisgICAgfQorICAgIAorICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbWF0QSwgY29uc3QgTWF0cml4VHlwZSYgbWF0QiwgYm9vbCBjb21wdXRlRWlnZW52ZWN0b3JzID0gdHJ1ZSkKKyAgICAgICAgOiBtX2VpdmVjKG1hdEEuY29scygpLCBtYXRBLmNvbHMoKSksCisgICAgICAgICAgbV9laXZhbHVlcyhtYXRBLmNvbHMoKSksCisgICAgICAgICAgbV9zdWJkaWFnKG1hdEEuY29scygpID4gMSA/IG1hdEEuY29scygpIC0gMSA6IDEpLAorICAgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBzdGF0aWNfY2FzdDxHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4qPih0aGlzKS0+Y29tcHV0ZShtYXRBLCBtYXRCLCBjb21wdXRlRWlnZW52ZWN0b3JzID8gQ29tcHV0ZUVpZ2VudmVjdG9ycyA6IEVpZ2VudmFsdWVzT25seSk7CisgICAgfQorICAgIAorICAgIHZvaWQgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycykKKyAgICB7CisgICAgICBjb21wdXRlKG1hdHJpeCwgY29tcHV0ZUVpZ2VudmVjdG9ycyA/IENvbXB1dGVFaWdlbnZlY3RvcnMgOiBFaWdlbnZhbHVlc09ubHkpOworICAgIH0KKworICAgIHZvaWQgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRBLCBjb25zdCBNYXRyaXhUeXBlJiBtYXRCLCBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSB0cnVlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0QSwgbWF0QiwgY29tcHV0ZUVpZ2VudmVjdG9ycyA/IENvbXB1dGVFaWdlbnZlY3RvcnMgOiBFaWdlbnZhbHVlc09ubHkpOworICAgIH0KKyAgICAjZW5kaWYgLy8gRUlHRU4yX1NVUFBPUlQKKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZSBtX2VpdmVjOworICAgIFJlYWxWZWN0b3JUeXBlIG1fZWl2YWx1ZXM7CisgICAgdHlwZW5hbWUgVHJpZGlhZ29uYWxpemF0aW9uVHlwZTo6U3ViRGlhZ29uYWxUeXBlIG1fc3ViZGlhZzsKKyAgICBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgIGJvb2wgbV9laWdlbnZlY3RvcnNPazsKK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIFxlaWdlbnZhbHVlc19tb2R1bGUgXGluZ3JvdXAgRWlnZW52YWx1ZXNfTW9kdWxlCisgICoKKyAgKiBQZXJmb3JtcyBhIFFSIHN0ZXAgb24gYSB0cmlkaWFnb25hbCBzeW1tZXRyaWMgbWF0cml4IHJlcHJlc2VudGVkIGFzIGEKKyAgKiBwYWlyIG9mIHR3byB2ZWN0b3JzIFxhIGRpYWcgYW5kIFxhIHN1YmRpYWcuCisgICoKKyAgKiBccGFyYW0gbWF0QSB0aGUgaW5wdXQgc2VsZmFkam9pbnQgbWF0cml4CisgICogXHBhcmFtIGhDb2VmZnMgcmV0dXJuZWQgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzCisgICoKKyAgKiBGb3IgY29tcGlsYXRpb24gZWZmaWNpZW5jeSByZWFzb25zLCB0aGlzIHByb2NlZHVyZSBkb2VzIG5vdCB1c2UgZWlnZW4gZXhwcmVzc2lvbgorICAqIGZvciBpdHMgYXJndW1lbnRzLgorICAqCisgICogSW1wbGVtZW50ZWQgZnJvbSBHb2x1YidzICJNYXRyaXggQ29tcHV0YXRpb25zIiwgYWxnb3JpdGhtIDguMy4yOgorICAqICJpbXBsaWNpdCBzeW1tZXRyaWMgUVIgc3RlcCB3aXRoIFdpbGtpbnNvbiBzaGlmdCIKKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgU3RvcmFnZU9yZGVyLHR5cGVuYW1lIFJlYWxTY2FsYXIsIHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXg+CitzdGF0aWMgdm9pZCB0cmlkaWFnb25hbF9xcl9zdGVwKFJlYWxTY2FsYXIqIGRpYWcsIFJlYWxTY2FsYXIqIHN1YmRpYWcsIEluZGV4IHN0YXJ0LCBJbmRleCBlbmQsIFNjYWxhciogbWF0cml4USwgSW5kZXggbik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+JiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+Cis6OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBpbnQgb3B0aW9ucykKK3sKKyAgZWlnZW5fYXNzZXJ0KG1hdHJpeC5jb2xzKCkgPT0gbWF0cml4LnJvd3MoKSk7CisgIGVpZ2VuX2Fzc2VydCgob3B0aW9ucyZ+KEVpZ1ZlY01hc2t8R2VuRWlnTWFzaykpPT0wCisgICAgICAgICAgJiYgKG9wdGlvbnMmRWlnVmVjTWFzaykhPUVpZ1ZlY01hc2sKKyAgICAgICAgICAmJiAiaW52YWxpZCBvcHRpb24gcGFyYW1ldGVyIik7CisgIGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycyA9IChvcHRpb25zJkNvbXB1dGVFaWdlbnZlY3RvcnMpPT1Db21wdXRlRWlnZW52ZWN0b3JzOworICBJbmRleCBuID0gbWF0cml4LmNvbHMoKTsKKyAgbV9laXZhbHVlcy5yZXNpemUobiwxKTsKKworICBpZihuPT0xKQorICB7CisgICAgbV9laXZhbHVlcy5jb2VmZlJlZigwLDApID0gaW50ZXJuYWw6OnJlYWwobWF0cml4LmNvZWZmKDAsMCkpOworICAgIGlmKGNvbXB1dGVFaWdlbnZlY3RvcnMpCisgICAgICBtX2VpdmVjLnNldE9uZXMobixuKTsKKyAgICBtX2luZm8gPSBTdWNjZXNzOworICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgbV9laWdlbnZlY3RvcnNPayA9IGNvbXB1dGVFaWdlbnZlY3RvcnM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gZGVjbGFyZSBzb21lIGFsaWFzZXMKKyAgUmVhbFZlY3RvclR5cGUmIGRpYWcgPSBtX2VpdmFsdWVzOworICBNYXRyaXhUeXBlJiBtYXQgPSBtX2VpdmVjOworCisgIC8vIG1hcCB0aGUgbWF0cml4IGNvZWZmaWNpZW50cyB0byBbLTE6MV0gdG8gYXZvaWQgb3Zlci0gYW5kIHVuZGVyZmxvdy4KKyAgUmVhbFNjYWxhciBzY2FsZSA9IG1hdHJpeC5jd2lzZUFicygpLm1heENvZWZmKCk7CisgIGlmKHNjYWxlPT1SZWFsU2NhbGFyKDApKSBzY2FsZSA9IFJlYWxTY2FsYXIoMSk7CisgIG1hdCA9IG1hdHJpeCAvIHNjYWxlOworICBtX3N1YmRpYWcucmVzaXplKG4tMSk7CisgIGludGVybmFsOjp0cmlkaWFnb25hbGl6YXRpb25faW5wbGFjZShtYXQsIGRpYWcsIG1fc3ViZGlhZywgY29tcHV0ZUVpZ2VudmVjdG9ycyk7CisgIAorICBJbmRleCBlbmQgPSBuLTE7CisgIEluZGV4IHN0YXJ0ID0gMDsKKyAgSW5kZXggaXRlciA9IDA7IC8vIHRvdGFsIG51bWJlciBvZiBpdGVyYXRpb25zCisKKyAgd2hpbGUgKGVuZD4wKQorICB7CisgICAgZm9yIChJbmRleCBpID0gc3RhcnQ7IGk8ZW5kOyArK2kpCisgICAgICBpZiAoaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGludGVybmFsOjphYnMobV9zdWJkaWFnW2ldKSwoaW50ZXJuYWw6OmFicyhkaWFnW2ldKStpbnRlcm5hbDo6YWJzKGRpYWdbaSsxXSkpKSkKKyAgICAgICAgbV9zdWJkaWFnW2ldID0gMDsKKworICAgIC8vIGZpbmQgdGhlIGxhcmdlc3QgdW5yZWR1Y2VkIGJsb2NrCisgICAgd2hpbGUgKGVuZD4wICYmIG1fc3ViZGlhZ1tlbmQtMV09PTApCisgICAgeworICAgICAgZW5kLS07CisgICAgfQorICAgIGlmIChlbmQ8PTApCisgICAgICBicmVhazsKKworICAgIC8vIGlmIHdlIHNwZW50IHRvbyBtYW55IGl0ZXJhdGlvbnMsIHdlIGdpdmUgdXAKKyAgICBpdGVyKys7CisgICAgaWYoaXRlciA+IG1fbWF4SXRlcmF0aW9ucyAqIG4pIGJyZWFrOworCisgICAgc3RhcnQgPSBlbmQgLSAxOworICAgIHdoaWxlIChzdGFydD4wICYmIG1fc3ViZGlhZ1tzdGFydC0xXSE9MCkKKyAgICAgIHN0YXJ0LS07CisKKyAgICBpbnRlcm5hbDo6dHJpZGlhZ29uYWxfcXJfc3RlcDxNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3I+KGRpYWcuZGF0YSgpLCBtX3N1YmRpYWcuZGF0YSgpLCBzdGFydCwgZW5kLCBjb21wdXRlRWlnZW52ZWN0b3JzID8gbV9laXZlYy5kYXRhKCkgOiAoU2NhbGFyKikwLCBuKTsKKyAgfQorCisgIGlmIChpdGVyIDw9IG1fbWF4SXRlcmF0aW9ucyAqIG4pCisgICAgbV9pbmZvID0gU3VjY2VzczsKKyAgZWxzZQorICAgIG1faW5mbyA9IE5vQ29udmVyZ2VuY2U7CisKKyAgLy8gU29ydCBlaWdlbnZhbHVlcyBhbmQgY29ycmVzcG9uZGluZyB2ZWN0b3JzLgorICAvLyBUT0RPIG1ha2UgdGhlIHNvcnQgb3B0aW9uYWwgPworICAvLyBUT0RPIHVzZSBhIGJldHRlciBzb3J0IGFsZ29yaXRobSAhIQorICBpZiAobV9pbmZvID09IFN1Y2Nlc3MpCisgIHsKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbi0xOyArK2kpCisgICAgeworICAgICAgSW5kZXggazsKKyAgICAgIG1fZWl2YWx1ZXMuc2VnbWVudChpLG4taSkubWluQ29lZmYoJmspOworICAgICAgaWYgKGsgPiAwKQorICAgICAgeworICAgICAgICBzdGQ6OnN3YXAobV9laXZhbHVlc1tpXSwgbV9laXZhbHVlc1trK2ldKTsKKyAgICAgICAgaWYoY29tcHV0ZUVpZ2VudmVjdG9ycykKKyAgICAgICAgICBtX2VpdmVjLmNvbChpKS5zd2FwKG1fZWl2ZWMuY29sKGsraSkpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLy8gc2NhbGUgYmFjayB0aGUgZWlnZW4gdmFsdWVzCisgIG1fZWl2YWx1ZXMgKj0gc2NhbGU7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgbV9laWdlbnZlY3RvcnNPayA9IGNvbXB1dGVFaWdlbnZlY3RvcnM7CisgIHJldHVybiAqdGhpczsKK30KKworCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlclR5cGUsaW50IFNpemUsYm9vbCBJc0NvbXBsZXg+IHN0cnVjdCBkaXJlY3Rfc2VsZmFkam9pbnRfZWlnZW52YWx1ZXMKK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihTb2x2ZXJUeXBlJiBlaWcsIGNvbnN0IHR5cGVuYW1lIFNvbHZlclR5cGU6Ok1hdHJpeFR5cGUmIEEsIGludCBvcHRpb25zKQorICB7IGVpZy5jb21wdXRlKEEsb3B0aW9ucyk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlclR5cGU+IHN0cnVjdCBkaXJlY3Rfc2VsZmFkam9pbnRfZWlnZW52YWx1ZXM8U29sdmVyVHlwZSwzLGZhbHNlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlclR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXJUeXBlOjpSZWFsVmVjdG9yVHlwZSBWZWN0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIAorICBzdGF0aWMgaW5saW5lIHZvaWQgY29tcHV0ZVJvb3RzKGNvbnN0IE1hdHJpeFR5cGUmIG0sIFZlY3RvclR5cGUmIHJvb3RzKQorICB7CisgICAgdXNpbmcgc3RkOjpzcXJ0OworICAgIHVzaW5nIHN0ZDo6YXRhbjI7CisgICAgdXNpbmcgc3RkOjpjb3M7CisgICAgdXNpbmcgc3RkOjpzaW47CisgICAgY29uc3QgU2NhbGFyIHNfaW52MyA9IFNjYWxhcigxLjApL1NjYWxhcigzLjApOworICAgIGNvbnN0IFNjYWxhciBzX3NxcnQzID0gc3FydChTY2FsYXIoMy4wKSk7CisKKyAgICAvLyBUaGUgY2hhcmFjdGVyaXN0aWMgZXF1YXRpb24gaXMgeF4zIC0gYzIqeF4yICsgYzEqeCAtIGMwID0gMC4gIFRoZQorICAgIC8vIGVpZ2VudmFsdWVzIGFyZSB0aGUgcm9vdHMgdG8gdGhpcyBlcXVhdGlvbiwgYWxsIGd1YXJhbnRlZWQgdG8gYmUKKyAgICAvLyByZWFsLXZhbHVlZCwgYmVjYXVzZSB0aGUgbWF0cml4IGlzIHN5bW1ldHJpYy4KKyAgICBTY2FsYXIgYzAgPSBtKDAsMCkqbSgxLDEpKm0oMiwyKSArIFNjYWxhcigyKSptKDEsMCkqbSgyLDApKm0oMiwxKSAtIG0oMCwwKSptKDIsMSkqbSgyLDEpIC0gbSgxLDEpKm0oMiwwKSptKDIsMCkgLSBtKDIsMikqbSgxLDApKm0oMSwwKTsKKyAgICBTY2FsYXIgYzEgPSBtKDAsMCkqbSgxLDEpIC0gbSgxLDApKm0oMSwwKSArIG0oMCwwKSptKDIsMikgLSBtKDIsMCkqbSgyLDApICsgbSgxLDEpKm0oMiwyKSAtIG0oMiwxKSptKDIsMSk7CisgICAgU2NhbGFyIGMyID0gbSgwLDApICsgbSgxLDEpICsgbSgyLDIpOworCisgICAgLy8gQ29uc3RydWN0IHRoZSBwYXJhbWV0ZXJzIHVzZWQgaW4gY2xhc3NpZnlpbmcgdGhlIHJvb3RzIG9mIHRoZSBlcXVhdGlvbgorICAgIC8vIGFuZCBpbiBzb2x2aW5nIHRoZSBlcXVhdGlvbiBmb3IgdGhlIHJvb3RzIGluIGNsb3NlZCBmb3JtLgorICAgIFNjYWxhciBjMl9vdmVyXzMgPSBjMipzX2ludjM7CisgICAgU2NhbGFyIGFfb3Zlcl8zID0gKGMxIC0gYzIqYzJfb3Zlcl8zKSpzX2ludjM7CisgICAgaWYgKGFfb3Zlcl8zID4gU2NhbGFyKDApKQorICAgICAgYV9vdmVyXzMgPSBTY2FsYXIoMCk7CisKKyAgICBTY2FsYXIgaGFsZl9iID0gU2NhbGFyKDAuNSkqKGMwICsgYzJfb3Zlcl8zKihTY2FsYXIoMikqYzJfb3Zlcl8zKmMyX292ZXJfMyAtIGMxKSk7CisKKyAgICBTY2FsYXIgcSA9IGhhbGZfYipoYWxmX2IgKyBhX292ZXJfMyphX292ZXJfMyphX292ZXJfMzsKKyAgICBpZiAocSA+IFNjYWxhcigwKSkKKyAgICAgIHEgPSBTY2FsYXIoMCk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBlaWdlbnZhbHVlcyBieSBzb2x2aW5nIGZvciB0aGUgcm9vdHMgb2YgdGhlIHBvbHlub21pYWwuCisgICAgU2NhbGFyIHJobyA9IHNxcnQoLWFfb3Zlcl8zKTsKKyAgICBTY2FsYXIgdGhldGEgPSBhdGFuMihzcXJ0KC1xKSxoYWxmX2IpKnNfaW52MzsKKyAgICBTY2FsYXIgY29zX3RoZXRhID0gY29zKHRoZXRhKTsKKyAgICBTY2FsYXIgc2luX3RoZXRhID0gc2luKHRoZXRhKTsKKyAgICByb290cygwKSA9IGMyX292ZXJfMyArIFNjYWxhcigyKSpyaG8qY29zX3RoZXRhOworICAgIHJvb3RzKDEpID0gYzJfb3Zlcl8zIC0gcmhvKihjb3NfdGhldGEgKyBzX3NxcnQzKnNpbl90aGV0YSk7CisgICAgcm9vdHMoMikgPSBjMl9vdmVyXzMgLSByaG8qKGNvc190aGV0YSAtIHNfc3FydDMqc2luX3RoZXRhKTsKKworICAgIC8vIFNvcnQgaW4gaW5jcmVhc2luZyBvcmRlci4KKyAgICBpZiAocm9vdHMoMCkgPj0gcm9vdHMoMSkpCisgICAgICBzdGQ6OnN3YXAocm9vdHMoMCkscm9vdHMoMSkpOworICAgIGlmIChyb290cygxKSA+PSByb290cygyKSkKKyAgICB7CisgICAgICBzdGQ6OnN3YXAocm9vdHMoMSkscm9vdHMoMikpOworICAgICAgaWYgKHJvb3RzKDApID49IHJvb3RzKDEpKQorICAgICAgICBzdGQ6OnN3YXAocm9vdHMoMCkscm9vdHMoMSkpOworICAgIH0KKyAgfQorICAKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihTb2x2ZXJUeXBlJiBzb2x2ZXIsIGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgaW50IG9wdGlvbnMpCisgIHsKKyAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgZWlnZW5fYXNzZXJ0KG1hdC5jb2xzKCkgPT0gMyAmJiBtYXQuY29scygpID09IG1hdC5yb3dzKCkpOworICAgIGVpZ2VuX2Fzc2VydCgob3B0aW9ucyZ+KEVpZ1ZlY01hc2t8R2VuRWlnTWFzaykpPT0wCisgICAgICAgICAgICAmJiAob3B0aW9ucyZFaWdWZWNNYXNrKSE9RWlnVmVjTWFzaworICAgICAgICAgICAgJiYgImludmFsaWQgb3B0aW9uIHBhcmFtZXRlciIpOworICAgIGJvb2wgY29tcHV0ZUVpZ2VudmVjdG9ycyA9IChvcHRpb25zJkNvbXB1dGVFaWdlbnZlY3RvcnMpPT1Db21wdXRlRWlnZW52ZWN0b3JzOworICAgIAorICAgIE1hdHJpeFR5cGUmIGVpdmVjcyA9IHNvbHZlci5tX2VpdmVjOworICAgIFZlY3RvclR5cGUmIGVpdmFscyA9IHNvbHZlci5tX2VpdmFsdWVzOworICAKKyAgICAvLyBtYXAgdGhlIG1hdHJpeCBjb2VmZmljaWVudHMgdG8gWy0xOjFdIHRvIGF2b2lkIG92ZXItIGFuZCB1bmRlcmZsb3cuCisgICAgU2NhbGFyIHNjYWxlID0gbWF0LmN3aXNlQWJzKCkubWF4Q29lZmYoKTsKKyAgICBNYXRyaXhUeXBlIHNjYWxlZE1hdCA9IG1hdCAvIHNjYWxlOworCisgICAgLy8gY29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMKKyAgICBjb21wdXRlUm9vdHMoc2NhbGVkTWF0LGVpdmFscyk7CisKKyAgICAvLyBjb21wdXRlIHRoZSBlaWdlbiB2ZWN0b3JzCisgICAgaWYoY29tcHV0ZUVpZ2VudmVjdG9ycykKKyAgICB7CisgICAgICBTY2FsYXIgc2FmZU5vcm0yID0gRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCk7CisgICAgICBzYWZlTm9ybTIgKj0gc2FmZU5vcm0yOworICAgICAgaWYoKGVpdmFscygyKS1laXZhbHMoMCkpPD1FaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkKKyAgICAgIHsKKyAgICAgICAgZWl2ZWNzLnNldElkZW50aXR5KCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNjYWxlZE1hdCA9IHNjYWxlZE1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgICAgICAgIE1hdHJpeFR5cGUgdG1wOworICAgICAgICB0bXAgPSBzY2FsZWRNYXQ7CisKKyAgICAgICAgU2NhbGFyIGQwID0gZWl2YWxzKDIpIC0gZWl2YWxzKDEpOworICAgICAgICBTY2FsYXIgZDEgPSBlaXZhbHMoMSkgLSBlaXZhbHMoMCk7CisgICAgICAgIGludCBrID0gIGQwID4gZDEgPyAyIDogMDsKKyAgICAgICAgZDAgPSBkMCA+IGQxID8gZDEgOiBkMDsKKworICAgICAgICB0bXAuZGlhZ29uYWwoKS5hcnJheSAoKSAtPSBlaXZhbHMoayk7CisgICAgICAgIFZlY3RvclR5cGUgY3Jvc3M7CisgICAgICAgIFNjYWxhciBuOworICAgICAgICBuID0gKGNyb3NzID0gdG1wLnJvdygwKS5jcm9zcyh0bXAucm93KDEpKSkuc3F1YXJlZE5vcm0oKTsKKworICAgICAgICBpZihuPnNhZmVOb3JtMikKKyAgICAgICAgICBlaXZlY3MuY29sKGspID0gY3Jvc3MgLyBzcXJ0KG4pOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBuID0gKGNyb3NzID0gdG1wLnJvdygwKS5jcm9zcyh0bXAucm93KDIpKSkuc3F1YXJlZE5vcm0oKTsKKworICAgICAgICAgIGlmKG4+c2FmZU5vcm0yKQorICAgICAgICAgICAgZWl2ZWNzLmNvbChrKSA9IGNyb3NzIC8gc3FydChuKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgbiA9IChjcm9zcyA9IHRtcC5yb3coMSkuY3Jvc3ModG1wLnJvdygyKSkpLnNxdWFyZWROb3JtKCk7CisKKyAgICAgICAgICAgIGlmKG4+c2FmZU5vcm0yKQorICAgICAgICAgICAgICBlaXZlY3MuY29sKGspID0gY3Jvc3MgLyBzcXJ0KG4pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgbWF0cml4IGFuZC9vciB0aGUgZWlnZW52YXVlcyBwcm9iYWJseSBjb250YWlucyBzb21lIGluZi9OYU4sCisgICAgICAgICAgICAgIC8vID0+IGV4aXQKKyAgICAgICAgICAgICAgLy8gc2NhbGUgYmFjayB0byB0aGUgb3JpZ2luYWwgc2l6ZS4KKyAgICAgICAgICAgICAgZWl2YWxzICo9IHNjYWxlOworCisgICAgICAgICAgICAgIHNvbHZlci5tX2luZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICAgICAgICAgICAgc29sdmVyLm1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICAgIHNvbHZlci5tX2VpZ2VudmVjdG9yc09rID0gY29tcHV0ZUVpZ2VudmVjdG9yczsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRtcCA9IHNjYWxlZE1hdDsKKyAgICAgICAgdG1wLmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBlaXZhbHMoMSk7CisKKyAgICAgICAgaWYoZDA8PUVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgICAgIGVpdmVjcy5jb2woMSkgPSBlaXZlY3MuY29sKGspLnVuaXRPcnRob2dvbmFsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG4gPSAoY3Jvc3MgPSBlaXZlY3MuY29sKGspLmNyb3NzKHRtcC5yb3coMCkubm9ybWFsaXplZCgpKSkuc3F1YXJlZE5vcm0oKTsKKyAgICAgICAgICBpZihuPnNhZmVOb3JtMikKKyAgICAgICAgICAgIGVpdmVjcy5jb2woMSkgPSBjcm9zcyAvIHNxcnQobik7CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG4gPSAoY3Jvc3MgPSBlaXZlY3MuY29sKGspLmNyb3NzKHRtcC5yb3coMSkpKS5zcXVhcmVkTm9ybSgpOworICAgICAgICAgICAgaWYobj5zYWZlTm9ybTIpCisgICAgICAgICAgICAgIGVpdmVjcy5jb2woMSkgPSBjcm9zcyAvIHNxcnQobik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG4gPSAoY3Jvc3MgPSBlaXZlY3MuY29sKGspLmNyb3NzKHRtcC5yb3coMikpKS5zcXVhcmVkTm9ybSgpOworICAgICAgICAgICAgICBpZihuPnNhZmVOb3JtMikKKyAgICAgICAgICAgICAgICBlaXZlY3MuY29sKDEpID0gY3Jvc3MgLyBzcXJ0KG4pOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludCwKKyAgICAgICAgICAgICAgICAvLyBpZiBzbyB0aGUgbGFzdCB0d28gZWlnZW52YWx1ZXMgYXJlIGxpa2VseSB0byB2ZSB2ZXJ5IGNsb3NlZCB0byBlYWNoIG90aGVyCisgICAgICAgICAgICAgICAgZWl2ZWNzLmNvbCgxKSA9IGVpdmVjcy5jb2woaykudW5pdE9ydGhvZ29uYWwoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGVpdmVjc1sxXSBpcyBvcnRob2dvbmFsIHRvIGVpdmVjc1syXQorICAgICAgICAgIFNjYWxhciBkID0gZWl2ZWNzLmNvbCgxKS5kb3QoZWl2ZWNzLmNvbChrKSk7CisgICAgICAgICAgZWl2ZWNzLmNvbCgxKSA9IChlaXZlY3MuY29sKDEpIC0gZCAqIGVpdmVjcy5jb2woaykpLm5vcm1hbGl6ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGVpdmVjcy5jb2woaz09MiA/IDAgOiAyKSA9IGVpdmVjcy5jb2woaykuY3Jvc3MoZWl2ZWNzLmNvbCgxKSkubm9ybWFsaXplZCgpOworICAgICAgfQorICAgIH0KKyAgICAvLyBSZXNjYWxlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNpemUuCisgICAgZWl2YWxzICo9IHNjYWxlOworICAgIAorICAgIHNvbHZlci5tX2luZm8gPSBTdWNjZXNzOworICAgIHNvbHZlci5tX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHNvbHZlci5tX2VpZ2VudmVjdG9yc09rID0gY29tcHV0ZUVpZ2VudmVjdG9yczsKKyAgfQorfTsKKworLy8gMngyIGRpcmVjdCBlaWdlbnZhbHVlcyBkZWNvbXBvc2l0aW9uLCBjb2RlIGZyb20gSGF1a2UgSGVpYmVsCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXJUeXBlPiBzdHJ1Y3QgZGlyZWN0X3NlbGZhZGpvaW50X2VpZ2VudmFsdWVzPFNvbHZlclR5cGUsMixmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXJUeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyVHlwZTo6UmVhbFZlY3RvclR5cGUgVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXJUeXBlOjpTY2FsYXIgU2NhbGFyOworICAKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvbXB1dGVSb290cyhjb25zdCBNYXRyaXhUeXBlJiBtLCBWZWN0b3JUeXBlJiByb290cykKKyAgeworICAgIHVzaW5nIHN0ZDo6c3FydDsKKyAgICBjb25zdCBTY2FsYXIgdDAgPSBTY2FsYXIoMC41KSAqIHNxcnQoIGFiczIobSgwLDApLW0oMSwxKSkgKyBTY2FsYXIoNCkqbSgxLDApKm0oMSwwKSk7CisgICAgY29uc3QgU2NhbGFyIHQxID0gU2NhbGFyKDAuNSkgKiAobSgwLDApICsgbSgxLDEpKTsKKyAgICByb290cygwKSA9IHQxIC0gdDA7CisgICAgcm9vdHMoMSkgPSB0MSArIHQwOworICB9CisgIAorICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKFNvbHZlclR5cGUmIHNvbHZlciwgY29uc3QgTWF0cml4VHlwZSYgbWF0LCBpbnQgb3B0aW9ucykKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtYXQuY29scygpID09IDIgJiYgbWF0LmNvbHMoKSA9PSBtYXQucm93cygpKTsKKyAgICBlaWdlbl9hc3NlcnQoKG9wdGlvbnMmfihFaWdWZWNNYXNrfEdlbkVpZ01hc2spKT09MAorICAgICAgICAgICAgJiYgKG9wdGlvbnMmRWlnVmVjTWFzaykhPUVpZ1ZlY01hc2sKKyAgICAgICAgICAgICYmICJpbnZhbGlkIG9wdGlvbiBwYXJhbWV0ZXIiKTsKKyAgICBib29sIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSAob3B0aW9ucyZDb21wdXRlRWlnZW52ZWN0b3JzKT09Q29tcHV0ZUVpZ2VudmVjdG9yczsKKyAgICAKKyAgICBNYXRyaXhUeXBlJiBlaXZlY3MgPSBzb2x2ZXIubV9laXZlYzsKKyAgICBWZWN0b3JUeXBlJiBlaXZhbHMgPSBzb2x2ZXIubV9laXZhbHVlczsKKyAgCisgICAgLy8gbWFwIHRoZSBtYXRyaXggY29lZmZpY2llbnRzIHRvIFstMToxXSB0byBhdm9pZCBvdmVyLSBhbmQgdW5kZXJmbG93LgorICAgIFNjYWxhciBzY2FsZSA9IG1hdC5jd2lzZUFicygpLm1heENvZWZmKCk7CisgICAgc2NhbGUgPSAoc3RkOjptYXgpKHNjYWxlLFNjYWxhcigxKSk7CisgICAgTWF0cml4VHlwZSBzY2FsZWRNYXQgPSBtYXQgLyBzY2FsZTsKKyAgICAKKyAgICAvLyBDb21wdXRlIHRoZSBlaWdlbnZhbHVlcworICAgIGNvbXB1dGVSb290cyhzY2FsZWRNYXQsZWl2YWxzKTsKKyAgICAKKyAgICAvLyBjb21wdXRlIHRoZSBlaWdlbiB2ZWN0b3JzCisgICAgaWYoY29tcHV0ZUVpZ2VudmVjdG9ycykKKyAgICB7CisgICAgICBzY2FsZWRNYXQuZGlhZ29uYWwoKS5hcnJheSAoKSAtPSBlaXZhbHMoMSk7CisgICAgICBTY2FsYXIgYTIgPSBhYnMyKHNjYWxlZE1hdCgwLDApKTsKKyAgICAgIFNjYWxhciBjMiA9IGFiczIoc2NhbGVkTWF0KDEsMSkpOworICAgICAgU2NhbGFyIGIyID0gYWJzMihzY2FsZWRNYXQoMSwwKSk7CisgICAgICBpZihhMj5jMikKKyAgICAgIHsKKyAgICAgICAgZWl2ZWNzLmNvbCgxKSA8PCAtc2NhbGVkTWF0KDEsMCksIHNjYWxlZE1hdCgwLDApOworICAgICAgICBlaXZlY3MuY29sKDEpIC89IHNxcnQoYTIrYjIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBlaXZlY3MuY29sKDEpIDw8IC1zY2FsZWRNYXQoMSwxKSwgc2NhbGVkTWF0KDEsMCk7CisgICAgICAgIGVpdmVjcy5jb2woMSkgLz0gc3FydChjMitiMik7CisgICAgICB9CisKKyAgICAgIGVpdmVjcy5jb2woMCkgPDwgZWl2ZWNzLmNvbCgxKS51bml0T3J0aG9nb25hbCgpOworICAgIH0KKyAgICAKKyAgICAvLyBSZXNjYWxlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNpemUuCisgICAgZWl2YWxzICo9IHNjYWxlOworICAgIAorICAgIHNvbHZlci5tX2luZm8gPSBTdWNjZXNzOworICAgIHNvbHZlci5tX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHNvbHZlci5tX2VpZ2VudmVjdG9yc09rID0gY29tcHV0ZUVpZ2VudmVjdG9yczsKKyAgfQorfTsKKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiYgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPgorOjpjb21wdXRlRGlyZWN0KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgaW50IG9wdGlvbnMpCit7CisgIGludGVybmFsOjpkaXJlY3Rfc2VsZmFkam9pbnRfZWlnZW52YWx1ZXM8U2VsZkFkam9pbnRFaWdlblNvbHZlcixTaXplLE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+OjpydW4oKnRoaXMsbWF0cml4LG9wdGlvbnMpOworICByZXR1cm4gKnRoaXM7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgU3RvcmFnZU9yZGVyLHR5cGVuYW1lIFJlYWxTY2FsYXIsIHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXg+CitzdGF0aWMgdm9pZCB0cmlkaWFnb25hbF9xcl9zdGVwKFJlYWxTY2FsYXIqIGRpYWcsIFJlYWxTY2FsYXIqIHN1YmRpYWcsIEluZGV4IHN0YXJ0LCBJbmRleCBlbmQsIFNjYWxhciogbWF0cml4USwgSW5kZXggbikKK3sKKyAgUmVhbFNjYWxhciB0ZCA9IChkaWFnW2VuZC0xXSAtIGRpYWdbZW5kXSkqUmVhbFNjYWxhcigwLjUpOworICBSZWFsU2NhbGFyIGUgPSBzdWJkaWFnW2VuZC0xXTsKKyAgLy8gTm90ZSB0aGF0IHRoYW5rcyB0byBzY2FsaW5nLCBlXjIgb3IgdGReMiBjYW5ub3Qgb3ZlcmZsb3csIGhvd2V2ZXIgdGhleSBjYW4gc3RpbGwKKyAgLy8gdW5kZXJmbG93IHRodXMgbGVhZGluZyB0byBpbmYvTmFOIHZhbHVlcyB3aGVuIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWVudGVkIGNvZGU6CisvLyAgIFJlYWxTY2FsYXIgZTIgPSBhYnMyKHN1YmRpYWdbZW5kLTFdKTsKKy8vICAgUmVhbFNjYWxhciBtdSA9IGRpYWdbZW5kXSAtIGUyIC8gKHRkICsgKHRkPjAgPyAxIDogLTEpICogc3FydCh0ZCp0ZCArIGUyKSk7CisgIC8vIFRoaXMgZXhwbGFpbiB0aGUgZm9sbG93aW5nLCBzb21ld2hhdCBtb3JlIGNvbXBsaWNhdGVkLCB2ZXJzaW9uOgorICBSZWFsU2NhbGFyIG11ID0gZGlhZ1tlbmRdIC0gKGUgLyAodGQgKyAodGQ+MCA/IDEgOiAtMSkpKSAqIChlIC8gaHlwb3QodGQsZSkpOworICAKKyAgUmVhbFNjYWxhciB4ID0gZGlhZ1tzdGFydF0gLSBtdTsKKyAgUmVhbFNjYWxhciB6ID0gc3ViZGlhZ1tzdGFydF07CisgIGZvciAoSW5kZXggayA9IHN0YXJ0OyBrIDwgZW5kOyArK2spCisgIHsKKyAgICBKYWNvYmlSb3RhdGlvbjxSZWFsU2NhbGFyPiByb3Q7CisgICAgcm90Lm1ha2VHaXZlbnMoeCwgeik7CisKKyAgICAvLyBkbyBUID0gRycgVCBHCisgICAgUmVhbFNjYWxhciBzZGsgPSByb3QucygpICogZGlhZ1trXSArIHJvdC5jKCkgKiBzdWJkaWFnW2tdOworICAgIFJlYWxTY2FsYXIgZGtwMSA9IHJvdC5zKCkgKiBzdWJkaWFnW2tdICsgcm90LmMoKSAqIGRpYWdbaysxXTsKKworICAgIGRpYWdba10gPSByb3QuYygpICogKHJvdC5jKCkgKiBkaWFnW2tdIC0gcm90LnMoKSAqIHN1YmRpYWdba10pIC0gcm90LnMoKSAqIChyb3QuYygpICogc3ViZGlhZ1trXSAtIHJvdC5zKCkgKiBkaWFnW2srMV0pOworICAgIGRpYWdbaysxXSA9IHJvdC5zKCkgKiBzZGsgKyByb3QuYygpICogZGtwMTsKKyAgICBzdWJkaWFnW2tdID0gcm90LmMoKSAqIHNkayAtIHJvdC5zKCkgKiBka3AxOworICAgIAorCisgICAgaWYgKGsgPiBzdGFydCkKKyAgICAgIHN1YmRpYWdbayAtIDFdID0gcm90LmMoKSAqIHN1YmRpYWdbay0xXSAtIHJvdC5zKCkgKiB6OworCisgICAgeCA9IHN1YmRpYWdba107CisKKyAgICBpZiAoayA8IGVuZCAtIDEpCisgICAgeworICAgICAgeiA9IC1yb3QucygpICogc3ViZGlhZ1trKzFdOworICAgICAgc3ViZGlhZ1trICsgMV0gPSByb3QuYygpICogc3ViZGlhZ1trKzFdOworICAgIH0KKyAgICAKKyAgICAvLyBhcHBseSB0aGUgZ2l2ZW5zIHJvdGF0aW9uIHRvIHRoZSB1bml0IG1hdHJpeCBRID0gUSAqIEcKKyAgICBpZiAobWF0cml4USkKKyAgICB7CisgICAgICAvLyBGSVhNRSBpZiBTdG9yYWdlT3JkZXIgPT0gUm93TWFqb3IgdGhpcyBvcGVyYXRpb24gaXMgbm90IHZlcnkgZWZmaWNpZW50CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsU3RvcmFnZU9yZGVyPiA+IHEobWF0cml4USxuLG4pOworICAgICAgcS5hcHBseU9uVGhlUmlnaHQoayxrKzEscm90KTsKKyAgICB9CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0VMRkFESk9JTlRFSUdFTlNPTFZFUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NS0wuaCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01LTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzODA5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvRWlnZW52YWx1ZXMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NS0wuaApAQCAtMCwwICsxLDkyIEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gSW50ZWwoUikgTUtMCisgKiAgICBTZWxmLWFkam9pbnQgZWlnZW52YWx1ZXMvZWlnZW52ZWN0b3JzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX1NBRUlHRU5TT0xWRVJfTUtMX0gKKyNkZWZpbmUgRUlHRU5fU0FFSUdFTlNPTFZFUl9NS0xfSAorCisjaW5jbHVkZSAiRWlnZW4vc3JjL0NvcmUvdXRpbC9NS0xfc3VwcG9ydC5oIgorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbnRlcm5hbCBTcGVjaWFsaXphdGlvbiBmb3IgdGhlIGRhdGEgdHlwZXMgc3VwcG9ydGVkIGJ5IE1LTCAqLworCisjZGVmaW5lIEVJR0VOX01LTF9FSUdfU0VMRkFESihFSUdUWVBFLCBNS0xUWVBFLCBNS0xSVFlQRSwgTUtMTkFNRSwgRUlHQ09MUk9XLCBNS0xDT0xST1cgKSBcCit0ZW1wbGF0ZTw+IGlubGluZVwKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVz4gPiYgXAorU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgRUlHQ09MUk9XPiA+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1c+JiBtYXRyaXgsIGludCBvcHRpb25zKSBcCit7IFwKKyAgZWlnZW5fYXNzZXJ0KG1hdHJpeC5jb2xzKCkgPT0gbWF0cml4LnJvd3MoKSk7IFwKKyAgZWlnZW5fYXNzZXJ0KChvcHRpb25zJn4oRWlnVmVjTWFza3xHZW5FaWdNYXNrKSk9PTAgXAorICAgICAgICAgICYmIChvcHRpb25zJkVpZ1ZlY01hc2spIT1FaWdWZWNNYXNrIFwKKyAgICAgICAgICAmJiAiaW52YWxpZCBvcHRpb24gcGFyYW1ldGVyIik7IFwKKyAgYm9vbCBjb21wdXRlRWlnZW52ZWN0b3JzID0gKG9wdGlvbnMmQ29tcHV0ZUVpZ2VudmVjdG9ycyk9PUNvbXB1dGVFaWdlbnZlY3RvcnM7IFwKKyAgbGFwYWNrX2ludCBuID0gbWF0cml4LmNvbHMoKSwgbGRhLCBtYXRyaXhfb3JkZXIsIGluZm87IFwKKyAgbV9laXZhbHVlcy5yZXNpemUobiwxKTsgXAorICBtX3N1YmRpYWcucmVzaXplKG4tMSk7IFwKKyAgbV9laXZlYyA9IG1hdHJpeDsgXAorXAorICBpZihuPT0xKSBcCisgIHsgXAorICAgIG1fZWl2YWx1ZXMuY29lZmZSZWYoMCwwKSA9IGludGVybmFsOjpyZWFsKG1hdHJpeC5jb2VmZigwLDApKTsgXAorICAgIGlmKGNvbXB1dGVFaWdlbnZlY3RvcnMpIG1fZWl2ZWMuc2V0T25lcyhuLG4pOyBcCisgICAgbV9pbmZvID0gU3VjY2VzczsgXAorICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7IFwKKyAgICBtX2VpZ2VudmVjdG9yc09rID0gY29tcHV0ZUVpZ2VudmVjdG9yczsgXAorICAgIHJldHVybiAqdGhpczsgXAorICB9IFwKK1wKKyAgbGRhID0gbWF0cml4Lm91dGVyU3RyaWRlKCk7IFwKKyAgbWF0cml4X29yZGVyPU1LTENPTFJPVzsgXAorICBjaGFyIGpvYnosIHVwbG89J0wnLyosIHJhbmdlPSdBJyovOyBcCisgIGpvYnogPSBjb21wdXRlRWlnZW52ZWN0b3JzID8gJ1YnIDogJ04nOyBcCitcCisgIGluZm8gPSBMQVBBQ0tFXyMjTUtMTkFNRSggbWF0cml4X29yZGVyLCBqb2J6LCB1cGxvLCBuLCAoTUtMVFlQRSopbV9laXZlYy5kYXRhKCksIGxkYSwgKE1LTFJUWVBFKiltX2VpdmFsdWVzLmRhdGEoKSApOyBcCisgIG1faW5mbyA9IChpbmZvPT0wKSA/IFN1Y2Nlc3MgOiBOb0NvbnZlcmdlbmNlOyBcCisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7IFwKKyAgbV9laWdlbnZlY3RvcnNPayA9IGNvbXB1dGVFaWdlbnZlY3RvcnM7IFwKKyAgcmV0dXJuICp0aGlzOyBcCit9CisKKworRUlHRU5fTUtMX0VJR19TRUxGQURKKGRvdWJsZSwgICBkb3VibGUsICAgICAgICBkb3VibGUsIGRzeWV2LCBDb2xNYWpvciwgTEFQQUNLX0NPTF9NQUpPUikKK0VJR0VOX01LTF9FSUdfU0VMRkFESihmbG9hdCwgICAgZmxvYXQsICAgICAgICAgZmxvYXQsICBzc3lldiwgQ29sTWFqb3IsIExBUEFDS19DT0xfTUFKT1IpCitFSUdFTl9NS0xfRUlHX1NFTEZBREooZGNvbXBsZXgsIE1LTF9Db21wbGV4MTYsIGRvdWJsZSwgemhlZXYsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTUtMX0VJR19TRUxGQURKKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsICBmbG9hdCwgIGNoZWV2LCBDb2xNYWpvciwgTEFQQUNLX0NPTF9NQUpPUikKKworRUlHRU5fTUtMX0VJR19TRUxGQURKKGRvdWJsZSwgICBkb3VibGUsICAgICAgICBkb3VibGUsIGRzeWV2LCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKK0VJR0VOX01LTF9FSUdfU0VMRkFESihmbG9hdCwgICAgZmxvYXQsICAgICAgICAgZmxvYXQsICBzc3lldiwgUm93TWFqb3IsIExBUEFDS19ST1dfTUFKT1IpCitFSUdFTl9NS0xfRUlHX1NFTEZBREooZGNvbXBsZXgsIE1LTF9Db21wbGV4MTYsIGRvdWJsZSwgemhlZXYsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorRUlHRU5fTUtMX0VJR19TRUxGQURKKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsICBmbG9hdCwgIGNoZWV2LCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TQUVJR0VOU09MVkVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9UcmlkaWFnb25hbGl6YXRpb24uaCBiL0VpZ2VuL3NyYy9FaWdlbnZhbHVlcy9UcmlkaWFnb25hbGl6YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzRiN2IzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0VpZ2VudmFsdWVzL1RyaWRpYWdvbmFsaXphdGlvbi5oCkBAIC0wLDAgKzEsNTU3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UUklESUFHT05BTElaQVRJT05fSAorI2RlZmluZSBFSUdFTl9UUklESUFHT05BTElaQVRJT05fSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBzdHJ1Y3QgVHJpZGlhZ29uYWxpemF0aW9uTWF0cml4VFJldHVyblR5cGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IHRyYWl0czxUcmlkaWFnb25hbGl6YXRpb25NYXRyaXhUUmV0dXJuVHlwZTxNYXRyaXhUeXBlPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIENvZWZmVmVjdG9yVHlwZT4KK3ZvaWQgdHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2UoTWF0cml4VHlwZSYgbWF0QSwgQ29lZmZWZWN0b3JUeXBlJiBoQ29lZmZzKTsKK30KKworLyoqIFxlaWdlbnZhbHVlc19tb2R1bGUgXGluZ3JvdXAgRWlnZW52YWx1ZXNfTW9kdWxlCisgICoKKyAgKgorICAqIFxjbGFzcyBUcmlkaWFnb25hbGl6YXRpb24KKyAgKgorICAqIFxicmllZiBUcmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIGEgc2VsZmFkam9pbnQgbWF0cml4CisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUKKyAgKiB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uOyB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlCisgICogTWF0cml4IGNsYXNzIHRlbXBsYXRlLgorICAqCisgICogVGhpcyBjbGFzcyBwZXJmb3JtcyBhIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgYSBzZWxmYWRqb2ludCBtYXRyaXggXGYkIEEgXGYkIHN1Y2ggdGhhdDoKKyAgKiBcZiQgQSA9IFEgVCBRXiogXGYkIHdoZXJlIFxmJCBRIFxmJCBpcyB1bml0YXJ5IGFuZCBcZiQgVCBcZiQgYSByZWFsIHN5bW1ldHJpYyB0cmlkaWFnb25hbCBtYXRyaXguCisgICoKKyAgKiBBIHRyaWRpYWdvbmFsIG1hdHJpeCBpcyBhIG1hdHJpeCB3aGljaCBoYXMgbm9uemVybyBlbGVtZW50cyBvbmx5IG9uIHRoZQorICAqIG1haW4gZGlhZ29uYWwgYW5kIHRoZSBmaXJzdCBkaWFnb25hbCBiZWxvdyBhbmQgYWJvdmUgaXQuIFRoZSBIZXNzZW5iZXJnCisgICogZGVjb21wb3NpdGlvbiBvZiBhIHNlbGZhZGpvaW50IG1hdHJpeCBpcyBpbiBmYWN0IGEgdHJpZGlhZ29uYWwKKyAgKiBkZWNvbXBvc2l0aW9uLiBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gU2VsZkFkam9pbnRFaWdlblNvbHZlciB0byBjb21wdXRlIHRoZQorICAqIGVpZ2VudmFsdWVzIGFuZCBlaWdlbnZlY3RvcnMgb2YgYSBzZWxmYWRqb2ludCBtYXRyaXguCisgICoKKyAgKiBDYWxsIHRoZSBmdW5jdGlvbiBjb21wdXRlKCkgdG8gY29tcHV0ZSB0aGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBhCisgICogZ2l2ZW4gbWF0cml4LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgVHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKQorICAqIGNvbnN0cnVjdG9yIHdoaWNoIGNvbXB1dGVzIHRoZSB0cmlkaWFnb25hbCBTY2h1ciBkZWNvbXBvc2l0aW9uIGF0CisgICogY29uc3RydWN0aW9uIHRpbWUuIE9uY2UgdGhlIGRlY29tcG9zaXRpb24gaXMgY29tcHV0ZWQsIHlvdSBjYW4gdXNlIHRoZQorICAqIG1hdHJpeFEoKSBhbmQgbWF0cml4VCgpIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSB0aGUgbWF0cmljZXMgUSBhbmQgVCBpbiB0aGUKKyAgKiBkZWNvbXBvc2l0aW9uLgorICAqCisgICogVGhlIGRvY3VtZW50YXRpb24gb2YgVHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKSBjb250YWlucyBhbgorICAqIGV4YW1wbGUgb2YgdGhlIHR5cGljYWwgdXNlIG9mIHRoaXMgY2xhc3MuCisgICoKKyAgKiBcc2EgY2xhc3MgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24sIGNsYXNzIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBUcmlkaWFnb25hbGl6YXRpb24KK3sKKyAgcHVibGljOgorCisgICAgLyoqIFxicmllZiBTeW5vbnltIGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFxwIF9NYXRyaXhUeXBlLiAqLworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICAgIGVudW0geworICAgICAgU2l6ZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgU2l6ZU1pbnVzT25lID0gU2l6ZSA9PSBEeW5hbWljID8gRHluYW1pYyA6IChTaXplID4gMSA/IFNpemUgLSAxIDogMSksCisgICAgICBPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucywKKyAgICAgIE1heFNpemUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heFNpemVNaW51c09uZSA9IE1heFNpemUgPT0gRHluYW1pYyA/IER5bmFtaWMgOiAoTWF4U2l6ZSA+IDEgPyBNYXhTaXplIC0gMSA6IDEpCisgICAgfTsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgU2l6ZU1pbnVzT25lLCAxLCBPcHRpb25zICYgflJvd01ham9yLCBNYXhTaXplTWludXNPbmUsIDE+IENvZWZmVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9jb2xfdHlwZTxNYXRyaXhUeXBlLCBSZWFsU2NhbGFyPjo6dHlwZSBEaWFnb25hbFR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgU2l6ZU1pbnVzT25lLCAxLCBPcHRpb25zICYgflJvd01ham9yLCBNYXhTaXplTWludXNPbmUsIDE+IFN1YkRpYWdvbmFsVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxSZXR1cm5UeXBlPjo6dHlwZSBNYXRyaXhUeXBlUmVhbFZpZXc7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6VHJpZGlhZ29uYWxpemF0aW9uTWF0cml4VFJldHVyblR5cGU8TWF0cml4VHlwZVJlYWxWaWV3PiBNYXRyaXhUUmV0dXJuVHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTx0eXBlbmFtZSBEaWFnb25hbDxjb25zdCBNYXRyaXhUeXBlPjo6UmVhbFJldHVyblR5cGU+Ojp0eXBlLAorICAgICAgICAgICAgICBjb25zdCBEaWFnb25hbDxjb25zdCBNYXRyaXhUeXBlPgorICAgICAgICAgICAgPjo6dHlwZSBEaWFnb25hbFJldHVyblR5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8dHlwZW5hbWUgRGlhZ29uYWw8CisgICAgICAgICAgICAgICAgQmxvY2s8Y29uc3QgTWF0cml4VHlwZSxTaXplTWludXNPbmUsU2l6ZU1pbnVzT25lPiA+OjpSZWFsUmV0dXJuVHlwZT46OnR5cGUsCisgICAgICAgICAgICAgIGNvbnN0IERpYWdvbmFsPAorICAgICAgICAgICAgICAgIEJsb2NrPGNvbnN0IE1hdHJpeFR5cGUsU2l6ZU1pbnVzT25lLFNpemVNaW51c09uZT4gPgorICAgICAgICAgICAgPjo6dHlwZSBTdWJEaWFnb25hbFJldHVyblR5cGU7CisKKyAgICAvKiogXGJyaWVmIFJldHVybiB0eXBlIG9mIG1hdHJpeFEoKSAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgSG91c2Vob2xkZXJTZXF1ZW5jZTxNYXRyaXhUeXBlLENvZWZmVmVjdG9yVHlwZT46OkNvbmp1Z2F0ZVJldHVyblR5cGUgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGU7CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBbaW5dICBzaXplICBQb3NpdGl2ZSBpbnRlZ2VyLCBzaXplIG9mIHRoZSBtYXRyaXggd2hvc2UgdHJpZGlhZ29uYWwKKyAgICAgICogZGVjb21wb3NpdGlvbiB3aWxsIGJlIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBjb21wdXRlKCkuICBUaGUgXHAgc2l6ZSBwYXJhbWV0ZXIgaXMgb25seQorICAgICAgKiB1c2VkIGFzIGEgaGludC4gSXQgaXMgbm90IGFuIGVycm9yIHRvIGdpdmUgYSB3cm9uZyBccCBzaXplLCBidXQgaXQgbWF5CisgICAgICAqIGltcGFpciBwZXJmb3JtYW5jZS4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoKSBmb3IgYW4gZXhhbXBsZS4KKyAgICAgICovCisgICAgVHJpZGlhZ29uYWxpemF0aW9uKEluZGV4IHNpemUgPSBTaXplPT1EeW5hbWljID8gMiA6IFNpemUpCisgICAgICA6IG1fbWF0cml4KHNpemUsc2l6ZSksCisgICAgICAgIG1faENvZWZmcyhzaXplID4gMSA/IHNpemUtMSA6IDEpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAge30KKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3I7IGNvbXB1dGVzIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LgorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dICBtYXRyaXggIFNlbGZhZGpvaW50IG1hdHJpeCB3aG9zZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uCisgICAgICAqIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGNvbXB1dGUoKSB0byBjb21wdXRlIHRoZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBUcmlkaWFnb25hbGl6YXRpb25fVHJpZGlhZ29uYWxpemF0aW9uX01hdHJpeFR5cGUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIFRyaWRpYWdvbmFsaXphdGlvbl9UcmlkaWFnb25hbGl6YXRpb25fTWF0cml4VHlwZS5vdXQKKyAgICAgICovCisgICAgVHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4KSwKKyAgICAgICAgbV9oQ29lZmZzKG1hdHJpeC5jb2xzKCkgPiAxID8gbWF0cml4LmNvbHMoKS0xIDogMSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBpbnRlcm5hbDo6dHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2UobV9tYXRyaXgsIG1faENvZWZmcyk7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIG1hdHJpeCAgU2VsZmFkam9pbnQgbWF0cml4IHdob3NlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24KKyAgICAgICogaXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICAqIFxyZXR1cm5zICAgIFJlZmVyZW5jZSB0byBcYyAqdGhpcworICAgICAgKgorICAgICAgKiBUaGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBpcyBjb21wdXRlZCBieSBicmluZ2luZyB0aGUgY29sdW1ucyBvZgorICAgICAgKiB0aGUgbWF0cml4IHN1Y2Nlc3NpdmVseSBpbiB0aGUgcmVxdWlyZWQgZm9ybSB1c2luZyBIb3VzZWhvbGRlcgorICAgICAgKiByZWZsZWN0aW9ucy4gVGhlIGNvc3QgaXMgXGYkIDRuXjMvMyBcZiQgZmxvcHMsIHdoZXJlIFxmJCBuIFxmJCBkZW5vdGVzCisgICAgICAqIHRoZSBzaXplIG9mIHRoZSBnaXZlbiBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgbWV0aG9kIHJldXNlcyBvZiB0aGUgYWxsb2NhdGVkIGRhdGEgaW4gdGhlIFRyaWRpYWdvbmFsaXphdGlvbgorICAgICAgKiBvYmplY3QsIGlmIHRoZSBzaXplIG9mIHRoZSBtYXRyaXggZG9lcyBub3QgY2hhbmdlLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBUcmlkaWFnb25hbGl6YXRpb25fY29tcHV0ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX2NvbXB1dGUub3V0CisgICAgICAqLworICAgIFRyaWRpYWdvbmFsaXphdGlvbiYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgbV9tYXRyaXggPSBtYXRyaXg7CisgICAgICBtX2hDb2VmZnMucmVzaXplKG1hdHJpeC5yb3dzKCktMSwgMSk7CisgICAgICBpbnRlcm5hbDo6dHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2UobV9tYXRyaXgsIG1faENvZWZmcyk7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdmVjdG9yIG9mIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cworICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgVHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKSBvcgorICAgICAgKiB0aGUgbWVtYmVyIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUKKyAgICAgICogdG8gY29tcHV0ZSB0aGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhlIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cyBhbGxvdyB0aGUgcmVjb25zdHJ1Y3Rpb24gb2YgdGhlIG1hdHJpeAorICAgICAgKiBcZiQgUSBcZiQgaW4gdGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gZnJvbSB0aGUgcGFja2VkIGRhdGEuCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFRyaWRpYWdvbmFsaXphdGlvbl9ob3VzZWhvbGRlckNvZWZmaWNpZW50cy5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX2hvdXNlaG9sZGVyQ29lZmZpY2llbnRzLm91dAorICAgICAgKgorICAgICAgKiBcc2EgcGFja2VkTWF0cml4KCksIFxyZWYgSG91c2Vob2xkZXJfTW9kdWxlICJIb3VzZWhvbGRlciBtb2R1bGUiCisgICAgICAqLworICAgIGlubGluZSBDb2VmZlZlY3RvclR5cGUgaG91c2Vob2xkZXJDb2VmZmljaWVudHMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlRyaWRpYWdvbmFsaXphdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9oQ29lZmZzOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlY29tcG9zaXRpb24KKyAgICAgICoKKyAgICAgICoJXHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gYSBtYXRyaXggd2l0aCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KKyAgICAgICoJICAgICAgICAgb2YgdGhlIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciBUcmlkaWFnb25hbGl6YXRpb24oY29uc3QgTWF0cml4VHlwZSYpIG9yCisgICAgICAqIHRoZSBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZQorICAgICAgKiB0byBjb21wdXRlIHRoZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGUgcmV0dXJuZWQgbWF0cml4IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisgICAgICAqICAtIHRoZSBzdHJpY3QgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IGlzIGVxdWFsIHRvIHRoZSBpbnB1dCBtYXRyaXggQS4KKyAgICAgICogIC0gdGhlIGRpYWdvbmFsIGFuZCBsb3dlciBzdWItZGlhZ29uYWwgcmVwcmVzZW50IHRoZSByZWFsIHRyaWRpYWdvbmFsCisgICAgICAqICAgIHN5bW1ldHJpYyBtYXRyaXggVC4KKyAgICAgICogIC0gdGhlIHJlc3Qgb2YgdGhlIGxvd2VyIHBhcnQgY29udGFpbnMgdGhlIEhvdXNlaG9sZGVyIHZlY3RvcnMgdGhhdCwKKyAgICAgICogICAgY29tYmluZWQgd2l0aCBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMgcmV0dXJuZWQgYnkKKyAgICAgICogICAgaG91c2Vob2xkZXJDb2VmZmljaWVudHMoKSwgYWxsb3dzIHRvIHJlY29uc3RydWN0IHRoZSBtYXRyaXggUSBhcworICAgICAgKiAgICAgICBcZiQgUSA9IEhfe04tMX0gXGxkb3RzIEhfMSBIXzAgXGYkLgorICAgICAgKiAgICBIZXJlLCB0aGUgbWF0cmljZXMgXGYkIEhfaSBcZiQgYXJlIHRoZSBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnMKKyAgICAgICogICAgICAgXGYkIEhfaSA9IChJIC0gaF9pIHZfaSB2X2leVCkgXGYkCisgICAgICAqICAgIHdoZXJlIFxmJCBoX2kgXGYkIGlzIHRoZSBcZiQgaSBcZiR0aCBIb3VzZWhvbGRlciBjb2VmZmljaWVudCBhbmQKKyAgICAgICogICAgXGYkIHZfaSBcZiQgaXMgdGhlIEhvdXNlaG9sZGVyIHZlY3RvciBkZWZpbmVkIGJ5CisgICAgICAqICAgICAgIFxmJCB2X2kgPSBbIDAsIFxsZG90cywgMCwgMSwgTShpKzIsaSksIFxsZG90cywgTShOLTEsaSkgXV5UIFxmJAorICAgICAgKiAgICB3aXRoIE0gdGhlIG1hdHJpeCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLgorICAgICAgKgorICAgICAgKiBTZWUgTEFQQUNLIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gdGhpcyBwYWNrZWQgc3RvcmFnZS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX3BhY2tlZE1hdHJpeC5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX3BhY2tlZE1hdHJpeC5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIGhvdXNlaG9sZGVyQ29lZmZpY2llbnRzKCkKKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IE1hdHJpeFR5cGUmIHBhY2tlZE1hdHJpeCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiVHJpZGlhZ29uYWxpemF0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX21hdHJpeDsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIHVuaXRhcnkgbWF0cml4IFEgaW4gdGhlIGRlY29tcG9zaXRpb24KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbWF0cml4IFEKKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIFRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBNYXRyaXhUeXBlJikgb3IKKyAgICAgICogdGhlIG1lbWJlciBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlCisgICAgICAqIHRvIGNvbXB1dGUgdGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGxpZ2h0LXdlaWdodCBvYmplY3Qgb2YgdGVtcGxhdGUgY2xhc3MKKyAgICAgICogSG91c2Vob2xkZXJTZXF1ZW5jZS4gWW91IGNhbiBlaXRoZXIgYXBwbHkgaXQgZGlyZWN0bHkgdG8gYSBtYXRyaXggb3IKKyAgICAgICogeW91IGNhbiBjb252ZXJ0IGl0IHRvIGEgbWF0cml4IG9mIHR5cGUgI01hdHJpeFR5cGUuCisgICAgICAqCisgICAgICAqIFxzYSBUcmlkaWFnb25hbGl6YXRpb24oY29uc3QgTWF0cml4VHlwZSYpIGZvciBhbiBleGFtcGxlLAorICAgICAgKiAgICAgbWF0cml4VCgpLCBjbGFzcyBIb3VzZWhvbGRlclNlcXVlbmNlCisgICAgICAqLworICAgIEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlIG1hdHJpeFEoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlRyaWRpYWdvbmFsaXphdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUobV9tYXRyaXgsIG1faENvZWZmcy5jb25qdWdhdGUoKSkKKyAgICAgICAgICAgICAuc2V0TGVuZ3RoKG1fbWF0cml4LnJvd3MoKSAtIDEpCisgICAgICAgICAgICAgLnNldFNoaWZ0KDEpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpbiB0aGUgZGVjb21wb3NpdGlvbgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBleHByZXNzaW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG1hdHJpeCBUCisgICAgICAqCisgICAgICAqIFxwcmUgRWl0aGVyIHRoZSBjb25zdHJ1Y3RvciBUcmlkaWFnb25hbGl6YXRpb24oY29uc3QgTWF0cml4VHlwZSYpIG9yCisgICAgICAqIHRoZSBtZW1iZXIgZnVuY3Rpb24gY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZQorICAgICAgKiB0byBjb21wdXRlIHRoZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgbWF0cml4IFQgZnJvbSBpbnRlcm5hbAorICAgICAgKiBkYXRhIGFuZCBjb3B5IGl0IHRvIGEgZGVuc2UgbWF0cml4IG9iamVjdC4gSW4gbW9zdCBjYXNlcywgaXQgbWF5IGJlCisgICAgICAqIHN1ZmZpY2llbnQgdG8gZGlyZWN0bHkgdXNlIHRoZSBwYWNrZWQgbWF0cml4IG9yIHRoZSB2ZWN0b3IgZXhwcmVzc2lvbnMKKyAgICAgICogcmV0dXJuZWQgYnkgZGlhZ29uYWwoKSBhbmQgc3ViRGlhZ29uYWwoKSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3CisgICAgICAqIGRlbnNlIGNvcHkgbWF0cml4IHdpdGggdGhpcyBmdW5jdGlvbi4KKyAgICAgICoKKyAgICAgICogXHNhIFRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBNYXRyaXhUeXBlJikgZm9yIGFuIGV4YW1wbGUsCisgICAgICAqIG1hdHJpeFEoKSwgcGFja2VkTWF0cml4KCksIGRpYWdvbmFsKCksIHN1YkRpYWdvbmFsKCkKKyAgICAgICovCisgICAgTWF0cml4VFJldHVyblR5cGUgbWF0cml4VCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiVHJpZGlhZ29uYWxpemF0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBNYXRyaXhUUmV0dXJuVHlwZShtX21hdHJpeC5yZWFsKCkpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgUmV0dXJucyB0aGUgZGlhZ29uYWwgb2YgdGhlIHRyaWRpYWdvbmFsIG1hdHJpeCBUIGluIHRoZSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZGlhZ29uYWwgb2YgVAorICAgICAgKgorICAgICAgKiBccHJlIEVpdGhlciB0aGUgY29uc3RydWN0b3IgVHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKSBvcgorICAgICAgKiB0aGUgbWVtYmVyIGZ1bmN0aW9uIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUKKyAgICAgICogdG8gY29tcHV0ZSB0aGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX2RpYWdvbmFsLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBUcmlkaWFnb25hbGl6YXRpb25fZGlhZ29uYWwub3V0CisgICAgICAqCisgICAgICAqIFxzYSBtYXRyaXhUKCksIHN1YkRpYWdvbmFsKCkKKyAgICAgICovCisgICAgRGlhZ29uYWxSZXR1cm5UeXBlIGRpYWdvbmFsKCkgY29uc3Q7CisKKyAgICAvKiogXGJyaWVmIFJldHVybnMgdGhlIHN1YmRpYWdvbmFsIG9mIHRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpbiB0aGUgZGVjb21wb3NpdGlvbi4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIHN1YmRpYWdvbmFsIG9mIFQKKyAgICAgICoKKyAgICAgICogXHByZSBFaXRoZXIgdGhlIGNvbnN0cnVjdG9yIFRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBNYXRyaXhUeXBlJikgb3IKKyAgICAgICogdGhlIG1lbWJlciBmdW5jdGlvbiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlCisgICAgICAqIHRvIGNvbXB1dGUgdGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXguCisgICAgICAqCisgICAgICAqIFxzYSBkaWFnb25hbCgpIGZvciBhbiBleGFtcGxlLCBtYXRyaXhUKCkKKyAgICAgICovCisgICAgU3ViRGlhZ29uYWxSZXR1cm5UeXBlIHN1YkRpYWdvbmFsKCkgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorCisgICAgTWF0cml4VHlwZSBtX21hdHJpeDsKKyAgICBDb2VmZlZlY3RvclR5cGUgbV9oQ29lZmZzOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIFRyaWRpYWdvbmFsaXphdGlvbjxNYXRyaXhUeXBlPjo6RGlhZ29uYWxSZXR1cm5UeXBlCitUcmlkaWFnb25hbGl6YXRpb248TWF0cml4VHlwZT46OmRpYWdvbmFsKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiVHJpZGlhZ29uYWxpemF0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgcmV0dXJuIG1fbWF0cml4LmRpYWdvbmFsKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBUcmlkaWFnb25hbGl6YXRpb248TWF0cml4VHlwZT46OlN1YkRpYWdvbmFsUmV0dXJuVHlwZQorVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFR5cGU+OjpzdWJEaWFnb25hbCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlRyaWRpYWdvbmFsaXphdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIEluZGV4IG4gPSBtX21hdHJpeC5yb3dzKCk7CisgIHJldHVybiBCbG9jazxjb25zdCBNYXRyaXhUeXBlLFNpemVNaW51c09uZSxTaXplTWludXNPbmU+KG1fbWF0cml4LCAxLCAwLCBuLTEsbi0xKS5kaWFnb25hbCgpOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsCisgICogUGVyZm9ybXMgYSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIHRoZSBzZWxmYWRqb2ludCBtYXRyaXggXGEgbWF0QSBpbi1wbGFjZS4KKyAgKgorICAqIFxwYXJhbVtpbixvdXRdIG1hdEEgT24gaW5wdXQgdGhlIHNlbGZhZGpvaW50IG1hdHJpeC4gT25seSB0aGUgXGIgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IGlzIHJlZmVyZW5jZWQuCisgICogICAgICAgICAgICAgICAgICAgICBPbiBvdXRwdXQsIHRoZSBzdHJpY3QgdXBwZXIgcGFydCBpcyBsZWZ0IHVuY2hhbmdlZCwgYW5kIHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQKKyAgKiAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIFQgYW5kIFEgbWF0cmljZXMgaW4gcGFja2VkIGZvcm1hdCBoYXMgZGV0YWlsZWQgYmVsb3cuCisgICogXHBhcmFtW291dF0gICAgaENvZWZmcyByZXR1cm5lZCBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMgKHNlZSBiZWxvdykKKyAgKgorICAqIE9uIG91dHB1dCwgdGhlIHRyaWRpYWdvbmFsIHNlbGZhZGpvaW50IG1hdHJpeCBUIGlzIHN0b3JlZCBpbiB0aGUgZGlhZ29uYWwKKyAgKiBhbmQgbG93ZXIgc3ViLWRpYWdvbmFsIG9mIHRoZSBtYXRyaXggXGEgbWF0QS4KKyAgKiBUaGUgdW5pdGFyeSBtYXRyaXggUSBpcyByZXByZXNlbnRlZCBpbiBhIGNvbXBhY3Qgd2F5IGFzIGEgcHJvZHVjdCBvZgorICAqIEhvdXNlaG9sZGVyIHJlZmxlY3RvcnMgXGYkIEhfaSBcZiQgc3VjaCB0aGF0OgorICAqICAgICAgIFxmJCBRID0gSF97Ti0xfSBcbGRvdHMgSF8xIEhfMCBcZiQuCisgICogVGhlIEhvdXNlaG9sZGVyIHJlZmxlY3RvcnMgYXJlIGRlZmluZWQgYXMKKyAgKiAgICAgICBcZiQgSF9pID0gKEkgLSBoX2kgdl9pIHZfaV5UKSBcZiQKKyAgKiB3aGVyZSBcZiQgaF9pID0gaENvZWZmc1tpXVxmJCBpcyB0aGUgXGYkIGkgXGYkdGggSG91c2Vob2xkZXIgY29lZmZpY2llbnQgYW5kCisgICogXGYkIHZfaSBcZiQgaXMgdGhlIEhvdXNlaG9sZGVyIHZlY3RvciBkZWZpbmVkIGJ5CisgICogICAgICAgXGYkIHZfaSA9IFsgMCwgXGxkb3RzLCAwLCAxLCBtYXRBKGkrMixpKSwgXGxkb3RzLCBtYXRBKE4tMSxpKSBdXlQgXGYkLgorICAqCisgICogSW1wbGVtZW50ZWQgZnJvbSBHb2x1YidzICJNYXRyaXggQ29tcHV0YXRpb25zIiwgYWxnb3JpdGhtIDguMy4xLgorICAqCisgICogXHNhIFRyaWRpYWdvbmFsaXphdGlvbjo6cGFja2VkTWF0cml4KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIENvZWZmVmVjdG9yVHlwZT4KK3ZvaWQgdHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2UoTWF0cml4VHlwZSYgbWF0QSwgQ29lZmZWZWN0b3JUeXBlJiBoQ29lZmZzKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBJbmRleCBuID0gbWF0QS5yb3dzKCk7CisgIGVpZ2VuX2Fzc2VydChuPT1tYXRBLmNvbHMoKSk7CisgIGVpZ2VuX2Fzc2VydChuPT1oQ29lZmZzLnNpemUoKSsxIHx8IG49PTEpOworICAKKyAgZm9yIChJbmRleCBpID0gMDsgaTxuLTE7ICsraSkKKyAgeworICAgIEluZGV4IHJlbWFpbmluZ1NpemUgPSBuLWktMTsKKyAgICBSZWFsU2NhbGFyIGJldGE7CisgICAgU2NhbGFyIGg7CisgICAgbWF0QS5jb2woaSkudGFpbChyZW1haW5pbmdTaXplKS5tYWtlSG91c2Vob2xkZXJJblBsYWNlKGgsIGJldGEpOworCisgICAgLy8gQXBwbHkgc2ltaWxhcml0eSB0cmFuc2Zvcm1hdGlvbiB0byByZW1haW5pbmcgY29sdW1ucywKKyAgICAvLyBpLmUuLCBBID0gSCBBIEgnIHdoZXJlIEggPSBJIC0gaCB2IHYnIGFuZCB2ID0gbWF0QS5jb2woaSkudGFpbChuLWktMSkKKyAgICBtYXRBLmNvbChpKS5jb2VmZlJlZihpKzEpID0gMTsKKworICAgIGhDb2VmZnMudGFpbChuLWktMSkubm9hbGlhcygpID0gKG1hdEEuYm90dG9tUmlnaHRDb3JuZXIocmVtYWluaW5nU2l6ZSxyZW1haW5pbmdTaXplKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChjb25qKGgpICogbWF0QS5jb2woaSkudGFpbChyZW1haW5pbmdTaXplKSkpOworCisgICAgaENvZWZmcy50YWlsKG4taS0xKSArPSAoY29uaihoKSpTY2FsYXIoLTAuNSkqKGhDb2VmZnMudGFpbChyZW1haW5pbmdTaXplKS5kb3QobWF0QS5jb2woaSkudGFpbChyZW1haW5pbmdTaXplKSkpKSAqIG1hdEEuY29sKGkpLnRhaWwobi1pLTEpOworCisgICAgbWF0QS5ib3R0b21SaWdodENvcm5lcihyZW1haW5pbmdTaXplLCByZW1haW5pbmdTaXplKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkKKyAgICAgIC5yYW5rVXBkYXRlKG1hdEEuY29sKGkpLnRhaWwocmVtYWluaW5nU2l6ZSksIGhDb2VmZnMudGFpbChyZW1haW5pbmdTaXplKSwgLTEpOworCisgICAgbWF0QS5jb2woaSkuY29lZmZSZWYoaSsxKSA9IGJldGE7CisgICAgaENvZWZmcy5jb2VmZlJlZihpKSA9IGg7CisgIH0KK30KKworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbiwgaW1wbGVtZW50YXRpb24gYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsCisgICAgICAgICBpbnQgU2l6ZT1NYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgIGJvb2wgSXNDb21wbGV4PU51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpJc0NvbXBsZXg+CitzdHJ1Y3QgdHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2Vfc2VsZWN0b3I7CisKKy8qKiBcYnJpZWYgUGVyZm9ybXMgYSBmdWxsIHRyaWRpYWdvbmFsaXphdGlvbiBpbiBwbGFjZQorICAqCisgICogXHBhcmFtW2luLG91dF0gIG1hdCAgT24gaW5wdXQsIHRoZSBzZWxmYWRqb2ludCBtYXRyaXggd2hvc2UgdHJpZGlhZ29uYWwKKyAgKiAgICBkZWNvbXBvc2l0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiBPbmx5IHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgcmVmZXJlbmNlZC4KKyAgKiAgICBUaGUgcmVzdCBpcyBsZWZ0IHVuY2hhbmdlZC4gT24gb3V0cHV0LCB0aGUgb3J0aG9nb25hbCBtYXRyaXggUQorICAqICAgIGluIHRoZSBkZWNvbXBvc2l0aW9uIGlmIFxwIGV4dHJhY3RRIGlzIHRydWUuCisgICogXHBhcmFtW291dF0gIGRpYWcgIFRoZSBkaWFnb25hbCBvZiB0aGUgdHJpZGlhZ29uYWwgbWF0cml4IFQgaW4gdGhlCisgICogICAgZGVjb21wb3NpdGlvbi4KKyAgKiBccGFyYW1bb3V0XSAgc3ViZGlhZyAgVGhlIHN1YmRpYWdvbmFsIG9mIHRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpbgorICAqICAgIHRoZSBkZWNvbXBvc2l0aW9uLgorICAqIFxwYXJhbVtpbl0gIGV4dHJhY3RRICBJZiB0cnVlLCB0aGUgb3J0aG9nb25hbCBtYXRyaXggUSBpbiB0aGUKKyAgKiAgICBkZWNvbXBvc2l0aW9uIGlzIGNvbXB1dGVkIGFuZCBzdG9yZWQgaW4gXHAgbWF0LgorICAqCisgICogQ29tcHV0ZXMgdGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgdGhlIHNlbGZhZGpvaW50IG1hdHJpeCBccCBtYXQgaW4gcGxhY2UKKyAgKiBzdWNoIHRoYXQgXGYkIG1hdCA9IFEgVCBRXiogXGYkIHdoZXJlIFxmJCBRIFxmJCBpcyB1bml0YXJ5IGFuZCBcZiQgVCBcZiQgYSByZWFsCisgICogc3ltbWV0cmljIHRyaWRpYWdvbmFsIG1hdHJpeC4KKyAgKgorICAqIFRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpcyBwYXNzZWQgdG8gdGhlIG91dHB1dCBwYXJhbWV0ZXJzIFxwIGRpYWcgYW5kIFxwIHN1YmRpYWcuIElmCisgICogXHAgZXh0cmFjdFEgaXMgdHJ1ZSwgdGhlbiB0aGUgb3J0aG9nb25hbCBtYXRyaXggUSBpcyBwYXNzZWQgdG8gXHAgbWF0LiBPdGhlcndpc2UgdGhlIGxvd2VyCisgICogcGFydCBvZiB0aGUgbWF0cml4IFxwIG1hdCBpcyBkZXN0cm95ZWQuCisgICoKKyAgKiBUaGUgdmVjdG9ycyBccCBkaWFnIGFuZCBccCBzdWJkaWFnIGFyZSBub3QgcmVzaXplZC4gVGhlIGZ1bmN0aW9uCisgICogYXNzdW1lcyB0aGF0IHRoZXkgYXJlIGFscmVhZHkgb2YgdGhlIGNvcnJlY3Qgc2l6ZS4gVGhlIGxlbmd0aCBvZiB0aGUKKyAgKiB2ZWN0b3IgXHAgZGlhZyBzaG91bGQgZXF1YWwgdGhlIG51bWJlciBvZiByb3dzIGluIFxwIG1hdCwgYW5kIHRoZQorICAqIGxlbmd0aCBvZiB0aGUgdmVjdG9yIFxwIHN1YmRpYWcgc2hvdWxkIGJlIG9uZSBsZWZ0LgorICAqCisgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjb250YWlucyBhbiBvcHRpbWl6ZWQgcGF0aCBmb3IgMy1ieS0zIG1hdHJpY2VzCisgICogd2hpY2ggaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIHBsYW5lIGZpdHRpbmcuCisgICoKKyAgKiBcbm90ZSBDdXJyZW50bHksIGl0IHJlcXVpcmVzIHR3byB0ZW1wb3JhcnkgdmVjdG9ycyB0byBob2xkIHRoZSBpbnRlcm1lZGlhdGUKKyAgKiBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMsIGFuZCB0byByZWNvbnN0cnVjdCB0aGUgbWF0cml4IFEgZnJvbSB0aGUgSG91c2Vob2xkZXIKKyAgKiByZWZsZWN0b3JzLgorICAqCisgICogRXhhbXBsZSAodGhpcyB1c2VzIHRoZSBzYW1lIG1hdHJpeCBhcyB0aGUgZXhhbXBsZSBpbgorICAqICAgIFRyaWRpYWdvbmFsaXphdGlvbjo6VHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IE1hdHJpeFR5cGUmKSk6CisgICogICAgXGluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX2RlY29tcG9zZUluUGxhY2UuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgVHJpZGlhZ29uYWxpemF0aW9uX2RlY29tcG9zZUluUGxhY2Uub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgVHJpZGlhZ29uYWxpemF0aW9uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBEaWFnb25hbFR5cGUsIHR5cGVuYW1lIFN1YkRpYWdvbmFsVHlwZT4KK3ZvaWQgdHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2UoTWF0cml4VHlwZSYgbWF0LCBEaWFnb25hbFR5cGUmIGRpYWcsIFN1YkRpYWdvbmFsVHlwZSYgc3ViZGlhZywgYm9vbCBleHRyYWN0USkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgLy9JbmRleCBuID0gbWF0LnJvd3MoKTsKKyAgZWlnZW5fYXNzZXJ0KG1hdC5jb2xzKCk9PW1hdC5yb3dzKCkgJiYgZGlhZy5zaXplKCk9PW1hdC5yb3dzKCkgJiYgc3ViZGlhZy5zaXplKCk9PW1hdC5yb3dzKCktMSk7CisgIHRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlX3NlbGVjdG9yPE1hdHJpeFR5cGU+OjpydW4obWF0LCBkaWFnLCBzdWJkaWFnLCBleHRyYWN0USk7Cit9CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBHZW5lcmFsIGZ1bGwgdHJpZGlhZ29uYWxpemF0aW9uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgU2l6ZSwgYm9vbCBJc0NvbXBsZXg+CitzdHJ1Y3QgdHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2Vfc2VsZWN0b3IKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmlkaWFnb25hbGl6YXRpb248TWF0cml4VHlwZT46OkNvZWZmVmVjdG9yVHlwZSBDb2VmZlZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFR5cGU+OjpIb3VzZWhvbGRlclNlcXVlbmNlVHlwZSBIb3VzZWhvbGRlclNlcXVlbmNlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGlhZ29uYWxUeXBlLCB0eXBlbmFtZSBTdWJEaWFnb25hbFR5cGU+CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtYXQsIERpYWdvbmFsVHlwZSYgZGlhZywgU3ViRGlhZ29uYWxUeXBlJiBzdWJkaWFnLCBib29sIGV4dHJhY3RRKQorICB7CisgICAgQ29lZmZWZWN0b3JUeXBlIGhDb2VmZnMobWF0LmNvbHMoKS0xKTsKKyAgICB0cmlkaWFnb25hbGl6YXRpb25faW5wbGFjZShtYXQsaENvZWZmcyk7CisgICAgZGlhZyA9IG1hdC5kaWFnb25hbCgpLnJlYWwoKTsKKyAgICBzdWJkaWFnID0gbWF0LnRlbXBsYXRlIGRpYWdvbmFsPC0xPigpLnJlYWwoKTsKKyAgICBpZihleHRyYWN0USkKKyAgICAgIG1hdCA9IEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlKG1hdCwgaENvZWZmcy5jb25qdWdhdGUoKSkKKyAgICAgICAgICAgIC5zZXRMZW5ndGgobWF0LnJvd3MoKSAtIDEpCisgICAgICAgICAgICAuc2V0U2hpZnQoMSk7CisgIH0KK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBTcGVjaWFsaXphdGlvbiBmb3IgM3gzIHJlYWwgbWF0cmljZXMuCisgICogRXNwZWNpYWxseSB1c2VmdWwgZm9yIHBsYW5lIGZpdHRpbmcuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IHRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlX3NlbGVjdG9yPE1hdHJpeFR5cGUsMyxmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaWFnb25hbFR5cGUsIHR5cGVuYW1lIFN1YkRpYWdvbmFsVHlwZT4KKyAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmIG1hdCwgRGlhZ29uYWxUeXBlJiBkaWFnLCBTdWJEaWFnb25hbFR5cGUmIHN1YmRpYWcsIGJvb2wgZXh0cmFjdFEpCisgIHsKKyAgICBkaWFnWzBdID0gbWF0KDAsMCk7CisgICAgUmVhbFNjYWxhciB2MW5vcm0yID0gYWJzMihtYXQoMiwwKSk7CisgICAgaWYodjFub3JtMiA9PSBSZWFsU2NhbGFyKDApKQorICAgIHsKKyAgICAgIGRpYWdbMV0gPSBtYXQoMSwxKTsKKyAgICAgIGRpYWdbMl0gPSBtYXQoMiwyKTsKKyAgICAgIHN1YmRpYWdbMF0gPSBtYXQoMSwwKTsKKyAgICAgIHN1YmRpYWdbMV0gPSBtYXQoMiwxKTsKKyAgICAgIGlmIChleHRyYWN0USkKKyAgICAgICAgbWF0LnNldElkZW50aXR5KCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBSZWFsU2NhbGFyIGJldGEgPSBzcXJ0KGFiczIobWF0KDEsMCkpICsgdjFub3JtMik7CisgICAgICBSZWFsU2NhbGFyIGludkJldGEgPSBSZWFsU2NhbGFyKDEpL2JldGE7CisgICAgICBTY2FsYXIgbTAxID0gbWF0KDEsMCkgKiBpbnZCZXRhOworICAgICAgU2NhbGFyIG0wMiA9IG1hdCgyLDApICogaW52QmV0YTsKKyAgICAgIFNjYWxhciBxID0gUmVhbFNjYWxhcigyKSptMDEqbWF0KDIsMSkgKyBtMDIqKG1hdCgyLDIpIC0gbWF0KDEsMSkpOworICAgICAgZGlhZ1sxXSA9IG1hdCgxLDEpICsgbTAyKnE7CisgICAgICBkaWFnWzJdID0gbWF0KDIsMikgLSBtMDIqcTsKKyAgICAgIHN1YmRpYWdbMF0gPSBiZXRhOworICAgICAgc3ViZGlhZ1sxXSA9IG1hdCgyLDEpIC0gbTAxICogcTsKKyAgICAgIGlmIChleHRyYWN0USkKKyAgICAgIHsKKyAgICAgICAgbWF0IDw8IDEsICAgMCwgICAgMCwKKyAgICAgICAgICAgICAgIDAsIG0wMSwgIG0wMiwKKyAgICAgICAgICAgICAgIDAsIG0wMiwgLW0wMTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBUcml2aWFsIHNwZWNpYWxpemF0aW9uIGZvciAxeDEgbWF0cmljZXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGJvb2wgSXNDb21wbGV4Pgorc3RydWN0IHRyaWRpYWdvbmFsaXphdGlvbl9pbnBsYWNlX3NlbGVjdG9yPE1hdHJpeFR5cGUsMSxJc0NvbXBsZXg+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaWFnb25hbFR5cGUsIHR5cGVuYW1lIFN1YkRpYWdvbmFsVHlwZT4KKyAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmIG1hdCwgRGlhZ29uYWxUeXBlJiBkaWFnLCBTdWJEaWFnb25hbFR5cGUmLCBib29sIGV4dHJhY3RRKQorICB7CisgICAgZGlhZygwLDApID0gcmVhbChtYXQoMCwwKSk7CisgICAgaWYoZXh0cmFjdFEpCisgICAgICBtYXQoMCwwKSA9IFNjYWxhcigxKTsKKyAgfQorfTsKKworLyoqIFxpbnRlcm5hbAorICAqIFxlaWdlbnZhbHVlc19tb2R1bGUgXGluZ3JvdXAgRWlnZW52YWx1ZXNfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiB0eXBlIGZvciByZXR1cm4gdmFsdWUgb2YgVHJpZGlhZ29uYWxpemF0aW9uOjptYXRyaXhUKCkKKyAgKgorICAqIFx0cGFyYW0gTWF0cml4VHlwZSB0eXBlIG9mIHVuZGVybHlpbmcgZGVuc2UgbWF0cml4CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBzdHJ1Y3QgVHJpZGlhZ29uYWxpemF0aW9uTWF0cml4VFJldHVyblR5cGUKKzogcHVibGljIFJldHVybkJ5VmFsdWU8VHJpZGlhZ29uYWxpemF0aW9uTWF0cml4VFJldHVyblR5cGU8TWF0cml4VHlwZT4gPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHB1YmxpYzoKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dIG1hdCBUaGUgdW5kZXJseWluZyBkZW5zZSBtYXRyaXgKKyAgICAgICovCisgICAgVHJpZGlhZ29uYWxpemF0aW9uTWF0cml4VFJldHVyblR5cGUoY29uc3QgTWF0cml4VHlwZSYgbWF0KSA6IG1fbWF0cml4KG1hdCkgeyB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VHlwZT4KKyAgICBpbmxpbmUgdm9pZCBldmFsVG8oUmVzdWx0VHlwZSYgcmVzdWx0KSBjb25zdAorICAgIHsKKyAgICAgIHJlc3VsdC5zZXRaZXJvKCk7CisgICAgICByZXN1bHQudGVtcGxhdGUgZGlhZ29uYWw8MT4oKSA9IG1fbWF0cml4LnRlbXBsYXRlIGRpYWdvbmFsPC0xPigpLmNvbmp1Z2F0ZSgpOworICAgICAgcmVzdWx0LmRpYWdvbmFsKCkgPSBtX21hdHJpeC5kaWFnb25hbCgpOworICAgICAgcmVzdWx0LnRlbXBsYXRlIGRpYWdvbmFsPC0xPigpID0gbV9tYXRyaXgudGVtcGxhdGUgZGlhZ29uYWw8LTE+KCk7CisgICAgfQorCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fbWF0cml4OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJJRElBR09OQUxJWkFUSU9OX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9BbGlnbmVkQm94LmggYi9FaWdlbi9zcmMvR2VvbWV0cnkvQWxpZ25lZEJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzBmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvR2VvbWV0cnkvQWxpZ25lZEJveC5oCkBAIC0wLDAgKzEsMzc1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQUxJR05FREJPWF9ICisjZGVmaW5lIEVJR0VOX0FMSUdORURCT1hfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKgorICAqIFxjbGFzcyBBbGlnbmVkQm94CisgICoKKyAgKiBcYnJpZWYgQW4gYXhpcyBhbGlnbmVkIGJveAorICAqCisgICogXHBhcmFtIF9TY2FsYXIgdGhlIHR5cGUgb2YgdGhlIHNjYWxhciBjb2VmZmljaWVudHMKKyAgKiBccGFyYW0gX0FtYmllbnREaW0gdGhlIGRpbWVuc2lvbiBvZiB0aGUgYW1iaWVudCBzcGFjZSwgY2FuIGJlIGEgY29tcGlsZSB0aW1lIHZhbHVlIG9yIER5bmFtaWMuCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYXhpcyBhbGlnbmVkIGJveCBhcyBhIHBhaXIgb2YgdGhlIG1pbmltYWwgYW5kIG1heGltYWwgY29ybmVycy4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0+CitjbGFzcyBBbGlnbmVkQm94Cit7CitwdWJsaWM6CitFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0FtYmllbnREaW0pCisgIGVudW0geyBBbWJpZW50RGltQXRDb21waWxlVGltZSA9IF9BbWJpZW50RGltIH07CisgIHR5cGVkZWYgX1NjYWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyOworICB0eXBlZGVmIE51bVRyYWl0czxTY2FsYXI+ICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhclRyYWl0czsKKyAgdHlwZWRlZiBEZW5zZUluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTY2FsYXJUcmFpdHM6OlJlYWwgICAgICAgICAgICAgICBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhclRyYWl0czo6Tm9uSW50ZWdlciAgICAgIE5vbkludGVnZXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixBbWJpZW50RGltQXRDb21waWxlVGltZSwxPiAgVmVjdG9yVHlwZTsKKworICAvKiogRGVmaW5lIGNvbnN0YW50cyB0byBuYW1lIHRoZSBjb3JuZXJzIG9mIGEgMUQsIDJEIG9yIDNEIGF4aXMgYWxpZ25lZCBib3VuZGluZyBib3ggKi8KKyAgZW51bSBDb3JuZXJUeXBlCisgIHsKKyAgICAvKiogMUQgbmFtZXMgKi8KKyAgICBNaW49MCwgTWF4PTEsCisKKyAgICAvKiogQWRkZWQgbmFtZXMgZm9yIDJEICovCisgICAgQm90dG9tTGVmdD0wLCBCb3R0b21SaWdodD0xLAorICAgIFRvcExlZnQ9MiwgVG9wUmlnaHQ9MywKKworICAgIC8qKiBBZGRlZCBuYW1lcyBmb3IgM0QgKi8KKyAgICBCb3R0b21MZWZ0Rmxvb3I9MCwgQm90dG9tUmlnaHRGbG9vcj0xLAorICAgIFRvcExlZnRGbG9vcj0yLCBUb3BSaWdodEZsb29yPTMsCisgICAgQm90dG9tTGVmdENlaWw9NCwgQm90dG9tUmlnaHRDZWlsPTUsCisgICAgVG9wTGVmdENlaWw9NiwgVG9wUmlnaHRDZWlsPTcKKyAgfTsKKworCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGluaXRpYWxpemluZyBhIG51bGwgYm94LiAqLworICBpbmxpbmUgZXhwbGljaXQgQWxpZ25lZEJveCgpCisgIHsgaWYgKEFtYmllbnREaW1BdENvbXBpbGVUaW1lIT1EeW5hbWljKSBzZXRFbXB0eSgpOyB9CisKKyAgLyoqIENvbnN0cnVjdHMgYSBudWxsIGJveCB3aXRoIFxhIF9kaW0gdGhlIGRpbWVuc2lvbiBvZiB0aGUgYW1iaWVudCBzcGFjZS4gKi8KKyAgaW5saW5lIGV4cGxpY2l0IEFsaWduZWRCb3goSW5kZXggX2RpbSkgOiBtX21pbihfZGltKSwgbV9tYXgoX2RpbSkKKyAgeyBzZXRFbXB0eSgpOyB9CisKKyAgLyoqIENvbnN0cnVjdHMgYSBib3ggd2l0aCBleHRyZW1pdGllcyBcYSBfbWluIGFuZCBcYSBfbWF4LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclZlY3RvclR5cGUxLCB0eXBlbmFtZSBPdGhlclZlY3RvclR5cGUyPgorICBpbmxpbmUgQWxpZ25lZEJveChjb25zdCBPdGhlclZlY3RvclR5cGUxJiBfbWluLCBjb25zdCBPdGhlclZlY3RvclR5cGUyJiBfbWF4KSA6IG1fbWluKF9taW4pLCBtX21heChfbWF4KSB7fQorCisgIC8qKiBDb25zdHJ1Y3RzIGEgYm94IGNvbnRhaW5pbmcgYSBzaW5nbGUgcG9pbnQgXGEgcC4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgaW5saW5lIGV4cGxpY2l0IEFsaWduZWRCb3goY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgYV9wKQorICB7CisgICAgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxEZXJpdmVkLDI+Ojp0eXBlIHAoYV9wLmRlcml2ZWQoKSk7CisgICAgbV9taW4gPSBwOworICAgIG1fbWF4ID0gcDsKKyAgfQorCisgIH5BbGlnbmVkQm94KCkge30KKworICAvKiogXHJldHVybnMgdGhlIGRpbWVuc2lvbiBpbiB3aGljaCB0aGUgYm94IGhvbGRzICovCisgIGlubGluZSBJbmRleCBkaW0oKSBjb25zdCB7IHJldHVybiBBbWJpZW50RGltQXRDb21waWxlVGltZT09RHluYW1pYyA/IG1fbWluLnNpemUoKS0xIDogSW5kZXgoQW1iaWVudERpbUF0Q29tcGlsZVRpbWUpOyB9CisKKyAgLyoqIFxkZXByZWNhdGVkIHVzZSBpc0VtcHR5ICovCisgIGlubGluZSBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIGlzRW1wdHkoKTsgfQorCisgIC8qKiBcZGVwcmVjYXRlZCB1c2Ugc2V0RW1wdHkgKi8KKyAgaW5saW5lIHZvaWQgc2V0TnVsbCgpIHsgc2V0RW1wdHkoKTsgfQorCisgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBib3ggaXMgZW1wdHkuICovCisgIGlubGluZSBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAobV9taW4uYXJyYXkoKSA+IG1fbWF4LmFycmF5KCkpLmFueSgpOyB9CisKKyAgLyoqIE1ha2VzIFxjICp0aGlzIGFuIGVtcHR5IGJveC4gKi8KKyAgaW5saW5lIHZvaWQgc2V0RW1wdHkoKQorICB7CisgICAgbV9taW4uc2V0Q29uc3RhbnQoIFNjYWxhclRyYWl0czo6aGlnaGVzdCgpICk7CisgICAgbV9tYXguc2V0Q29uc3RhbnQoIFNjYWxhclRyYWl0czo6bG93ZXN0KCkgKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgbWluaW1hbCBjb3JuZXIgKi8KKyAgaW5saW5lIGNvbnN0IFZlY3RvclR5cGUmIChtaW4pKCkgY29uc3QgeyByZXR1cm4gbV9taW47IH0KKyAgLyoqIFxyZXR1cm5zIGEgbm9uIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWluaW1hbCBjb3JuZXIgKi8KKyAgaW5saW5lIFZlY3RvclR5cGUmIChtaW4pKCkgeyByZXR1cm4gbV9taW47IH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBtYXhpbWFsIGNvcm5lciAqLworICBpbmxpbmUgY29uc3QgVmVjdG9yVHlwZSYgKG1heCkoKSBjb25zdCB7IHJldHVybiBtX21heDsgfQorICAvKiogXHJldHVybnMgYSBub24gY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBtYXhpbWFsIGNvcm5lciAqLworICBpbmxpbmUgVmVjdG9yVHlwZSYgKG1heCkoKSB7IHJldHVybiBtX21heDsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgY2VudGVyIG9mIHRoZSBib3ggKi8KKyAgaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50MV9vcDxTY2FsYXI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiwgY29uc3QgVmVjdG9yVHlwZSwgY29uc3QgVmVjdG9yVHlwZT4gPgorICBjZW50ZXIoKSBjb25zdAorICB7IHJldHVybiAobV9taW4rbV9tYXgpLzI7IH0KKworICAvKiogXHJldHVybnMgdGhlIGxlbmd0aHMgb2YgdGhlIHNpZGVzIG9mIHRoZSBib3VuZGluZyBib3guCisgICAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBnZXQgdGhlIHNhbWUKKyAgICAqIHJlc3VsdCBmb3IgaW50ZWdyYWwgb3IgZmxvYXRpbmcgc2NhbGFyIHR5cGVzOiBzZWUKKyAgICAqLworICBpbmxpbmUgY29uc3QgQ3dpc2VCaW5hcnlPcDwgaW50ZXJuYWw6OnNjYWxhcl9kaWZmZXJlbmNlX29wPFNjYWxhcj4sIGNvbnN0IFZlY3RvclR5cGUsIGNvbnN0IFZlY3RvclR5cGU+IHNpemVzKCkgY29uc3QKKyAgeyByZXR1cm4gbV9tYXggLSBtX21pbjsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgdm9sdW1lIG9mIHRoZSBib3VuZGluZyBib3ggKi8KKyAgaW5saW5lIFNjYWxhciB2b2x1bWUoKSBjb25zdAorICB7IHJldHVybiBzaXplcygpLnByb2QoKTsgfQorCisgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIGZvciB0aGUgYm91bmRpbmcgYm94IGRpYWdvbmFsIHZlY3RvcgorICAgICogaWYgdGhlIGxlbmd0aCBvZiB0aGUgZGlhZ29uYWwgaXMgbmVlZGVkOiBkaWFnb25hbCgpLm5vcm0oKQorICAgICogd2lsbCBwcm92aWRlIGl0LgorICAgICovCisgIGlubGluZSBDd2lzZUJpbmFyeU9wPCBpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyPiwgY29uc3QgVmVjdG9yVHlwZSwgY29uc3QgVmVjdG9yVHlwZT4gZGlhZ29uYWwoKSBjb25zdAorICB7IHJldHVybiBzaXplcygpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSB2ZXJ0ZXggb2YgdGhlIGJvdW5kaW5nIGJveCBhdCB0aGUgY29ybmVyIGRlZmluZWQgYnkKKyAgICAqIHRoZSBjb3JuZXItaWQgY29ybmVyLiBJdCB3b3JrcyBvbmx5IGZvciBhIDFELCAyRCBvciAzRCBib3VuZGluZyBib3guCisgICAgKiBGb3IgMUQgYm91bmRpbmcgYm94ZXMgY29ybmVycyBhcmUgbmFtZWQgYnkgMiBlbnVtIGNvbnN0YW50czoKKyAgICAqIEJvdHRvbUxlZnQgYW5kIEJvdHRvbVJpZ2h0LgorICAgICogRm9yIDJEIGJvdW5kaW5nIGJveGVzLCBjb3JuZXJzIGFyZSBuYW1lZCBieSA0IGVudW0gY29uc3RhbnRzOgorICAgICogQm90dG9tTGVmdCwgQm90dG9tUmlnaHQsIFRvcExlZnQsIFRvcFJpZ2h0LgorICAgICogRm9yIDNEIGJvdW5kaW5nIGJveGVzLCB0aGUgZm9sbG93aW5nIG5hbWVzIGFyZSBhZGRlZDoKKyAgICAqIEJvdHRvbUxlZnRDZWlsLCBCb3R0b21SaWdodENlaWwsIFRvcExlZnRDZWlsLCBUb3BSaWdodENlaWwuCisgICAgKi8KKyAgaW5saW5lIFZlY3RvclR5cGUgY29ybmVyKENvcm5lclR5cGUgY29ybmVyKSBjb25zdAorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChfQW1iaWVudERpbSA8PSAzLCBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9WRUNUT1JTX09GX0FfU1BFQ0lGSUNfU0laRSk7CisKKyAgICBWZWN0b3JUeXBlIHJlczsKKworICAgIEluZGV4IG11bHQgPSAxOworICAgIGZvcihJbmRleCBkPTA7IGQ8ZGltKCk7ICsrZCkKKyAgICB7CisgICAgICBpZiggbXVsdCAmIGNvcm5lciApIHJlc1tkXSA9IG1fbWF4W2RdOworICAgICAgZWxzZSAgICAgICAgICAgICAgICByZXNbZF0gPSBtX21pbltkXTsKKyAgICAgIG11bHQgKj0gMjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIC8qKiBccmV0dXJucyBhIHJhbmRvbSBwb2ludCBpbnNpZGUgdGhlIGJvdW5kaW5nIGJveCBzYW1wbGVkIHdpdGgKKyAgICogYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiAqLworICBpbmxpbmUgVmVjdG9yVHlwZSBzYW1wbGUoKSBjb25zdAorICB7CisgICAgVmVjdG9yVHlwZSByOworICAgIGZvcihJbmRleCBkPTA7IGQ8ZGltKCk7ICsrZCkKKyAgICB7CisgICAgICBpZighU2NhbGFyVHJhaXRzOjpJc0ludGVnZXIpCisgICAgICB7CisgICAgICAgIHJbZF0gPSBtX21pbltkXSArIChtX21heFtkXS1tX21pbltkXSkKKyAgICAgICAgICAgICAqIGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoMCksIFNjYWxhcigxKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJbZF0gPSBpbnRlcm5hbDo6cmFuZG9tKG1fbWluW2RdLCBtX21heFtkXSk7CisgICAgfQorICAgIHJldHVybiByOworICB9CisKKyAgLyoqIFxyZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50IFxhIHAgaXMgaW5zaWRlIHRoZSBib3ggXGMgKnRoaXMuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBib29sIGNvbnRhaW5zKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIGFfcCkgY29uc3QKKyAgeworICAgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8RGVyaXZlZCwyPjo6dHlwZSBwKGFfcC5kZXJpdmVkKCkpOworICAgIHJldHVybiAobV9taW4uYXJyYXkoKTw9cC5hcnJheSgpKS5hbGwoKSAmJiAocC5hcnJheSgpPD1tX21heC5hcnJheSgpKS5hbGwoKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBib3ggXGEgYiBpcyBlbnRpcmVseSBpbnNpZGUgdGhlIGJveCBcYyAqdGhpcy4gKi8KKyAgaW5saW5lIGJvb2wgY29udGFpbnMoY29uc3QgQWxpZ25lZEJveCYgYikgY29uc3QKKyAgeyByZXR1cm4gKG1fbWluLmFycmF5KCk8PShiLm1pbikoKS5hcnJheSgpKS5hbGwoKSAmJiAoKGIubWF4KSgpLmFycmF5KCk8PW1fbWF4LmFycmF5KCkpLmFsbCgpOyB9CisKKyAgLyoqIEV4dGVuZHMgXGMgKnRoaXMgc3VjaCB0aGF0IGl0IGNvbnRhaW5zIHRoZSBwb2ludCBcYSBwIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgQWxpZ25lZEJveCYgZXh0ZW5kKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIGFfcCkKKyAgeworICAgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8RGVyaXZlZCwyPjo6dHlwZSBwKGFfcC5kZXJpdmVkKCkpOworICAgIG1fbWluID0gbV9taW4uY3dpc2VNaW4ocCk7CisgICAgbV9tYXggPSBtX21heC5jd2lzZU1heChwKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvKiogRXh0ZW5kcyBcYyAqdGhpcyBzdWNoIHRoYXQgaXQgY29udGFpbnMgdGhlIGJveCBcYSBiIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLiAqLworICBpbmxpbmUgQWxpZ25lZEJveCYgZXh0ZW5kKGNvbnN0IEFsaWduZWRCb3gmIGIpCisgIHsKKyAgICBtX21pbiA9IG1fbWluLmN3aXNlTWluKGIubV9taW4pOworICAgIG1fbWF4ID0gbV9tYXguY3dpc2VNYXgoYi5tX21heCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLyoqIENsYW1wcyBcYyAqdGhpcyBieSB0aGUgYm94IFxhIGIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuICovCisgIGlubGluZSBBbGlnbmVkQm94JiBjbGFtcChjb25zdCBBbGlnbmVkQm94JiBiKQorICB7CisgICAgbV9taW4gPSBtX21pbi5jd2lzZU1heChiLm1fbWluKTsKKyAgICBtX21heCA9IG1fbWF4LmN3aXNlTWluKGIubV9tYXgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8qKiBSZXR1cm5zIGFuIEFsaWduZWRCb3ggdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIFxhIGIgYW5kIFxjICp0aGlzICovCisgIGlubGluZSBBbGlnbmVkQm94IGludGVyc2VjdGlvbihjb25zdCBBbGlnbmVkQm94JiBiKSBjb25zdAorICB7cmV0dXJuIEFsaWduZWRCb3gobV9taW4uY3dpc2VNYXgoYi5tX21pbiksIG1fbWF4LmN3aXNlTWluKGIubV9tYXgpKTsgfQorCisgIC8qKiBSZXR1cm5zIGFuIEFsaWduZWRCb3ggdGhhdCBpcyB0aGUgdW5pb24gb2YgXGEgYiBhbmQgXGMgKnRoaXMgKi8KKyAgaW5saW5lIEFsaWduZWRCb3ggbWVyZ2VkKGNvbnN0IEFsaWduZWRCb3gmIGIpIGNvbnN0CisgIHsgcmV0dXJuIEFsaWduZWRCb3gobV9taW4uY3dpc2VNaW4oYi5tX21pbiksIG1fbWF4LmN3aXNlTWF4KGIubV9tYXgpKTsgfQorCisgIC8qKiBUcmFuc2xhdGUgXGMgKnRoaXMgYnkgdGhlIHZlY3RvciBcYSB0IGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgQWxpZ25lZEJveCYgdHJhbnNsYXRlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIGFfdCkKKyAgeworICAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8RGVyaXZlZCwyPjo6dHlwZSB0KGFfdC5kZXJpdmVkKCkpOworICAgIG1fbWluICs9IHQ7CisgICAgbV9tYXggKz0gdDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgXGEgcCBhbmQgdGhlIGJveCBcYyAqdGhpcywKKyAgICAqIGFuZCB6ZXJvIGlmIFxhIHAgaXMgaW5zaWRlIHRoZSBib3guCisgICAgKiBcc2EgZXh0ZXJpb3JEaXN0YW5jZSgpCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgaW5saW5lIFNjYWxhciBzcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBhX3ApIGNvbnN0OworCisgIC8qKiBccmV0dXJucyB0aGUgc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3hlcyBcYSBiIGFuZCBcYyAqdGhpcywKKyAgICAqIGFuZCB6ZXJvIGlmIHRoZSBib3hlcyBpbnRlcnNlY3QuCisgICAgKiBcc2EgZXh0ZXJpb3JEaXN0YW5jZSgpCisgICAgKi8KKyAgaW5saW5lIFNjYWxhciBzcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShjb25zdCBBbGlnbmVkQm94JiBiKSBjb25zdDsKKworICAvKiogXHJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IFxhIHAgYW5kIHRoZSBib3ggXGMgKnRoaXMsCisgICAgKiBhbmQgemVybyBpZiBcYSBwIGlzIGluc2lkZSB0aGUgYm94LgorICAgICogXHNhIHNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKCkKKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgTm9uSW50ZWdlciBleHRlcmlvckRpc3RhbmNlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHApIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpzcXJ0KE5vbkludGVnZXIoc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UocCkpKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm94ZXMgXGEgYiBhbmQgXGMgKnRoaXMsCisgICAgKiBhbmQgemVybyBpZiB0aGUgYm94ZXMgaW50ZXJzZWN0LgorICAgICogXHNhIHNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKCkKKyAgICAqLworICBpbmxpbmUgTm9uSW50ZWdlciBleHRlcmlvckRpc3RhbmNlKGNvbnN0IEFsaWduZWRCb3gmIGIpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjpzcXJ0KE5vbkludGVnZXIoc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UoYikpKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyAqdGhpcyB3aXRoIHNjYWxhciB0eXBlIGNhc3RlZCB0byBcYSBOZXdTY2FsYXJUeXBlCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIFxhIE5ld1NjYWxhclR5cGUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2NhbGFyIHR5cGUgb2YgXGMgKnRoaXMKKyAgICAqIHRoZW4gdGhpcyBmdW5jdGlvbiBzbWFydGx5IHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3U2NhbGFyVHlwZT4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPEFsaWduZWRCb3gsCisgICAgICAgICAgIEFsaWduZWRCb3g8TmV3U2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZT4gPjo6dHlwZSBjYXN0KCkgY29uc3QKKyAgeworICAgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxBbGlnbmVkQm94LAorICAgICAgICAgICAgICAgICAgICBBbGlnbmVkQm94PE5ld1NjYWxhclR5cGUsQW1iaWVudERpbUF0Q29tcGlsZVRpbWU+ID46OnR5cGUoKnRoaXMpOworICB9CisKKyAgLyoqIENvcHkgY29uc3RydWN0b3Igd2l0aCBzY2FsYXIgdHlwZSBjb252ZXJzaW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZT4KKyAgaW5saW5lIGV4cGxpY2l0IEFsaWduZWRCb3goY29uc3QgQWxpZ25lZEJveDxPdGhlclNjYWxhclR5cGUsQW1iaWVudERpbUF0Q29tcGlsZVRpbWU+JiBvdGhlcikKKyAgeworICAgIG1fbWluID0gKG90aGVyLm1pbikoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgICBtX21heCA9IChvdGhlci5tYXgpKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgIH0KKworICAvKiogXHJldHVybnMgXGMgdHJ1ZSBpZiBcYyAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIFxhIG90aGVyLCB3aXRoaW4gdGhlIHByZWNpc2lvbgorICAgICogZGV0ZXJtaW5lZCBieSBcYSBwcmVjLgorICAgICoKKyAgICAqIFxzYSBNYXRyaXhCYXNlOjppc0FwcHJveCgpICovCisgIGJvb2wgaXNBcHByb3goY29uc3QgQWxpZ25lZEJveCYgb3RoZXIsIFJlYWxTY2FsYXIgcHJlYyA9IFNjYWxhclRyYWl0czo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgIHsgcmV0dXJuIG1fbWluLmlzQXBwcm94KG90aGVyLm1fbWluLCBwcmVjKSAmJiBtX21heC5pc0FwcHJveChvdGhlci5tX21heCwgcHJlYyk7IH0KKworcHJvdGVjdGVkOgorCisgIFZlY3RvclR5cGUgbV9taW4sIG1fbWF4OworfTsKKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgQW1iaWVudERpbT4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgU2NhbGFyIEFsaWduZWRCb3g8U2NhbGFyLEFtYmllbnREaW0+OjpzcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBhX3ApIGNvbnN0Cit7CisgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8RGVyaXZlZCwyKkFtYmllbnREaW0+Ojp0eXBlIHAoYV9wLmRlcml2ZWQoKSk7CisgIFNjYWxhciBkaXN0MigwKTsKKyAgU2NhbGFyIGF1eDsKKyAgZm9yIChJbmRleCBrPTA7IGs8ZGltKCk7ICsraykKKyAgeworICAgIGlmKCBtX21pbltrXSA+IHBba10gKQorICAgIHsKKyAgICAgIGF1eCA9IG1fbWluW2tdIC0gcFtrXTsKKyAgICAgIGRpc3QyICs9IGF1eCphdXg7CisgICAgfQorICAgIGVsc2UgaWYoIHBba10gPiBtX21heFtrXSApCisgICAgeworICAgICAgYXV4ID0gcFtrXSAtIG1fbWF4W2tdOworICAgICAgZGlzdDIgKz0gYXV4KmF1eDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGRpc3QyOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IEFtYmllbnREaW0+CitpbmxpbmUgU2NhbGFyIEFsaWduZWRCb3g8U2NhbGFyLEFtYmllbnREaW0+OjpzcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShjb25zdCBBbGlnbmVkQm94JiBiKSBjb25zdAoreworICBTY2FsYXIgZGlzdDIoMCk7CisgIFNjYWxhciBhdXg7CisgIGZvciAoSW5kZXggaz0wOyBrPGRpbSgpOyArK2spCisgIHsKKyAgICBpZiggbV9taW5ba10gPiBiLm1fbWF4W2tdICkKKyAgICB7CisgICAgICBhdXggPSBtX21pbltrXSAtIGIubV9tYXhba107CisgICAgICBkaXN0MiArPSBhdXgqYXV4OworICAgIH0KKyAgICBlbHNlIGlmKCBiLm1fbWluW2tdID4gbV9tYXhba10gKQorICAgIHsKKyAgICAgIGF1eCA9IGIubV9taW5ba10gLSBtX21heFtrXTsKKyAgICAgIGRpc3QyICs9IGF1eCphdXg7CisgICAgfQorICB9CisgIHJldHVybiBkaXN0MjsKK30KKworLyoqIFxkZWZncm91cCBhbGlnbmVkYm94dHlwZWRlZnMgR2xvYmFsIGFsaWduZWQgYm94IHR5cGVkZWZzCisgICoKKyAgKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIEVpZ2VuIGRlZmluZXMgc2V2ZXJhbCB0eXBlZGVmIHNob3J0Y3V0cyBmb3IgbW9zdCBjb21tb24gYWxpZ25lZCBib3ggdHlwZXMuCisgICoKKyAgKiBUaGUgZ2VuZXJhbCBwYXR0ZXJucyBhcmUgdGhlIGZvbGxvd2luZzoKKyAgKgorICAqIFxjIEFsaWduZWRCb3hTaXplVHlwZSB3aGVyZSBcYyBTaXplIGNhbiBiZSBcYyAxLCBcYyAyLFxjIDMsXGMgNCBmb3IgZml4ZWQgc2l6ZSBib3hlcyBvciBcYyBYIGZvciBkeW5hbWljIHNpemUsCisgICogYW5kIHdoZXJlIFxjIFR5cGUgY2FuIGJlIFxjIGkgZm9yIGludGVnZXIsIFxjIGYgZm9yIGZsb2F0LCBcYyBkIGZvciBkb3VibGUuCisgICoKKyAgKiBGb3IgZXhhbXBsZSwgXGMgQWxpZ25lZEJveDNkIGlzIGEgZml4ZWQtc2l6ZSAzeDMgYWxpZ25lZCBib3ggdHlwZSBvZiBkb3VibGVzLCBhbmQgXGMgQWxpZ25lZEJveFhmIGlzIGEgZHluYW1pYy1zaXplIGFsaWduZWQgYm94IG9mIGZsb2F0cy4KKyAgKgorICAqIFxzYSBjbGFzcyBBbGlnbmVkQm94CisgICovCisKKyNkZWZpbmUgRUlHRU5fTUFLRV9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCBTaXplLCBTaXplU3VmZml4KSAgICBcCisvKiogXGluZ3JvdXAgYWxpZ25lZGJveHR5cGVkZWZzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordHlwZWRlZiBBbGlnbmVkQm94PFR5cGUsIFNpemU+ICAgQWxpZ25lZEJveCMjU2l6ZVN1ZmZpeCMjVHlwZVN1ZmZpeDsKKworI2RlZmluZSBFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUyhUeXBlLCBUeXBlU3VmZml4KSBcCitFSUdFTl9NQUtFX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDEsIDEpIFwKK0VJR0VOX01BS0VfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgMiwgMikgXAorRUlHRU5fTUFLRV9UWVBFREVGUyhUeXBlLCBUeXBlU3VmZml4LCAzLCAzKSBcCitFSUdFTl9NQUtFX1RZUEVERUZTKFR5cGUsIFR5cGVTdWZmaXgsIDQsIDQpIFwKK0VJR0VOX01BS0VfVFlQRURFRlMoVHlwZSwgVHlwZVN1ZmZpeCwgRHluYW1pYywgWCkKKworRUlHRU5fTUFLRV9UWVBFREVGU19BTExfU0laRVMoaW50LCAgICAgICAgICAgICAgICAgIGkpCitFSUdFTl9NQUtFX1RZUEVERUZTX0FMTF9TSVpFUyhmbG9hdCwgICAgICAgICAgICAgICAgZikKK0VJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTKGRvdWJsZSwgICAgICAgICAgICAgICBkKQorCisjdW5kZWYgRUlHRU5fTUFLRV9UWVBFREVGU19BTExfU0laRVMKKyN1bmRlZiBFSUdFTl9NQUtFX1RZUEVERUZTCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQUxJR05FREJPWF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvR2VvbWV0cnkvQW5nbGVBeGlzLmggYi9FaWdlbi9zcmMvR2VvbWV0cnkvQW5nbGVBeGlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxOTdhYwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9BbmdsZUF4aXMuaApAQCAtMCwwICsxLDIzMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FOR0xFQVhJU19ICisjZGVmaW5lIEVJR0VOX0FOR0xFQVhJU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBBbmdsZUF4aXMKKyAgKgorICAqIFxicmllZiBSZXByZXNlbnRzIGEgM0Qgcm90YXRpb24gYXMgYSByb3RhdGlvbiBhbmdsZSBhcm91bmQgYW4gYXJiaXRyYXJ5IDNEIGF4aXMKKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cy4KKyAgKgorICAqIFx3YXJuaW5nIFdoZW4gc2V0dGluZyB1cCBhbiBBbmdsZUF4aXMgb2JqZWN0LCB0aGUgYXhpcyB2ZWN0b3IgXGIgbXVzdCBcYiBiZSBcYiBub3JtYWxpemVkLgorICAqCisgICogVGhlIGZvbGxvd2luZyB0d28gdHlwZWRlZnMgYXJlIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZToKKyAgKiBcbGkgXGMgQW5nbGVBeGlzZiBmb3IgXGMgZmxvYXQKKyAgKiBcbGkgXGMgQW5nbGVBeGlzZCBmb3IgXGMgZG91YmxlCisgICoKKyAgKiBDb21iaW5lZCB3aXRoIE1hdHJpeEJhc2U6OlVuaXR7WCxZLFp9LCBBbmdsZUF4aXMgY2FuIGJlIHVzZWQgdG8gZWFzaWx5CisgICogbWltaWMgRXVsZXItYW5nbGVzLiBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICogXGluY2x1ZGUgQW5nbGVBeGlzX21pbWljX2V1bGVyLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEFuZ2xlQXhpc19taW1pY19ldWxlci5vdXQKKyAgKgorICAqIFxub3RlIFRoaXMgY2xhc3MgaXMgbm90IGFpbWVkIHRvIGJlIHVzZWQgdG8gc3RvcmUgYSByb3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiwKKyAgKiBidXQgcmF0aGVyIHRvIG1ha2UgZWFzaWVyIHRoZSBjcmVhdGlvbiBvZiBvdGhlciByb3RhdGlvbiAoUXVhdGVybmlvbiwgcm90YXRpb24gTWF0cml4KQorICAqIGFuZCB0cmFuc2Zvcm1hdGlvbiBvYmplY3RzLgorICAqCisgICogXHNhIGNsYXNzIFF1YXRlcm5pb24sIGNsYXNzIFRyYW5zZm9ybSwgTWF0cml4QmFzZTo6VW5pdFgoKQorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4gc3RydWN0IHRyYWl0czxBbmdsZUF4aXM8X1NjYWxhcj4gPgoreworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4KK2NsYXNzIEFuZ2xlQXhpcyA6IHB1YmxpYyBSb3RhdGlvbkJhc2U8QW5nbGVBeGlzPF9TY2FsYXI+LDM+Cit7CisgIHR5cGVkZWYgUm90YXRpb25CYXNlPEFuZ2xlQXhpczxfU2NhbGFyPiwzPiBCYXNlOworCitwdWJsaWM6CisKKyAgdXNpbmcgQmFzZTo6b3BlcmF0b3IqOworCisgIGVudW0geyBEaW0gPSAzIH07CisgIC8qKiB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cyAqLworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9uVHlwZTsKKworcHJvdGVjdGVkOgorCisgIFZlY3RvcjMgbV9heGlzOworICBTY2FsYXIgbV9hbmdsZTsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uICovCisgIEFuZ2xlQXhpcygpIHt9CisgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplIHRoZSBhbmdsZS1heGlzIHJvdGF0aW9uIGZyb20gYW4gXGEgYW5nbGUgaW4gcmFkaWFuCisgICAgKiBhbmQgYW4gXGEgYXhpcyB3aGljaCBcYiBtdXN0IFxiIGJlIFxiIG5vcm1hbGl6ZWQuCisgICAgKgorICAgICogXHdhcm5pbmcgSWYgdGhlIFxhIGF4aXMgdmVjdG9yIGlzIG5vdCBub3JtYWxpemVkLCB0aGVuIHRoZSBhbmdsZS1heGlzIG9iamVjdAorICAgICogICAgICAgICAgcmVwcmVzZW50cyBhbiBpbnZhbGlkIHJvdGF0aW9uLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgQW5nbGVBeGlzKFNjYWxhciBhbmdsZSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgYXhpcykgOiBtX2F4aXMoYXhpcyksIG1fYW5nbGUoYW5nbGUpIHt9CisgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplIHRoZSBhbmdsZS1heGlzIHJvdGF0aW9uIGZyb20gYSBxdWF0ZXJuaW9uIFxhIHEuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFF1YXREZXJpdmVkPiBpbmxpbmUgZXhwbGljaXQgQW5nbGVBeGlzKGNvbnN0IFF1YXRlcm5pb25CYXNlPFF1YXREZXJpdmVkPiYgcSkgeyAqdGhpcyA9IHE7IH0KKyAgLyoqIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemUgdGhlIGFuZ2xlLWF4aXMgcm90YXRpb24gZnJvbSBhIDN4MyByb3RhdGlvbiBtYXRyaXguICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBleHBsaWNpdCBBbmdsZUF4aXMoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkgeyAqdGhpcyA9IG07IH0KKworICBTY2FsYXIgYW5nbGUoKSBjb25zdCB7IHJldHVybiBtX2FuZ2xlOyB9CisgIFNjYWxhciYgYW5nbGUoKSB7IHJldHVybiBtX2FuZ2xlOyB9CisKKyAgY29uc3QgVmVjdG9yMyYgYXhpcygpIGNvbnN0IHsgcmV0dXJuIG1fYXhpczsgfQorICBWZWN0b3IzJiBheGlzKCkgeyByZXR1cm4gbV9heGlzOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gcm90YXRpb25zICovCisgIGlubGluZSBRdWF0ZXJuaW9uVHlwZSBvcGVyYXRvciogKGNvbnN0IEFuZ2xlQXhpcyYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIFF1YXRlcm5pb25UeXBlKCp0aGlzKSAqIFF1YXRlcm5pb25UeXBlKG90aGVyKTsgfQorCisgIC8qKiBDb25jYXRlbmF0ZXMgdHdvIHJvdGF0aW9ucyAqLworICBpbmxpbmUgUXVhdGVybmlvblR5cGUgb3BlcmF0b3IqIChjb25zdCBRdWF0ZXJuaW9uVHlwZSYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIFF1YXRlcm5pb25UeXBlKCp0aGlzKSAqIG90aGVyOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gcm90YXRpb25zICovCisgIGZyaWVuZCBpbmxpbmUgUXVhdGVybmlvblR5cGUgb3BlcmF0b3IqIChjb25zdCBRdWF0ZXJuaW9uVHlwZSYgYSwgY29uc3QgQW5nbGVBeGlzJiBiKQorICB7IHJldHVybiBhICogUXVhdGVybmlvblR5cGUoYik7IH0KKworICAvKiogXHJldHVybnMgdGhlIGludmVyc2Ugcm90YXRpb24sIGkuZS4sIGFuIGFuZ2xlLWF4aXMgd2l0aCBvcHBvc2l0ZSByb3RhdGlvbiBhbmdsZSAqLworICBBbmdsZUF4aXMgaW52ZXJzZSgpIGNvbnN0CisgIHsgcmV0dXJuIEFuZ2xlQXhpcygtbV9hbmdsZSwgbV9heGlzKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIFF1YXREZXJpdmVkPgorICBBbmdsZUF4aXMmIG9wZXJhdG9yPShjb25zdCBRdWF0ZXJuaW9uQmFzZTxRdWF0RGVyaXZlZD4mIHEpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBBbmdsZUF4aXMmIG9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBBbmdsZUF4aXMmIGZyb21Sb3RhdGlvbk1hdHJpeChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKTsKKyAgTWF0cml4MyB0b1JvdGF0aW9uTWF0cml4KHZvaWQpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyBcYyAqdGhpcyB3aXRoIHNjYWxhciB0eXBlIGNhc3RlZCB0byBcYSBOZXdTY2FsYXJUeXBlCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIFxhIE5ld1NjYWxhclR5cGUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2NhbGFyIHR5cGUgb2YgXGMgKnRoaXMKKyAgICAqIHRoZW4gdGhpcyBmdW5jdGlvbiBzbWFydGx5IHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3U2NhbGFyVHlwZT4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPEFuZ2xlQXhpcyxBbmdsZUF4aXM8TmV3U2NhbGFyVHlwZT4gPjo6dHlwZSBjYXN0KCkgY29uc3QKKyAgeyByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8QW5nbGVBeGlzLEFuZ2xlQXhpczxOZXdTY2FsYXJUeXBlPiA+Ojp0eXBlKCp0aGlzKTsgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIHR5cGUgY29udmVyc2lvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhclR5cGU+CisgIGlubGluZSBleHBsaWNpdCBBbmdsZUF4aXMoY29uc3QgQW5nbGVBeGlzPE90aGVyU2NhbGFyVHlwZT4mIG90aGVyKQorICB7CisgICAgbV9heGlzID0gb3RoZXIuYXhpcygpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICAgIG1fYW5nbGUgPSBTY2FsYXIob3RoZXIuYW5nbGUoKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGNvbnN0IEFuZ2xlQXhpcyBJZGVudGl0eSgpIHsgcmV0dXJuIEFuZ2xlQXhpcygwLCBWZWN0b3IzOjpVbml0WCgpKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgYm9vbCBpc0FwcHJveChjb25zdCBBbmdsZUF4aXMmIG90aGVyLCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdAorICB7IHJldHVybiBtX2F4aXMuaXNBcHByb3gob3RoZXIubV9heGlzLCBwcmVjKSAmJiBpbnRlcm5hbDo6aXNBcHByb3gobV9hbmdsZSxvdGhlci5tX2FuZ2xlLCBwcmVjKTsgfQorfTsKKworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIHNpbmdsZSBwcmVjaXNpb24gYW5nbGUtYXhpcyB0eXBlICovCit0eXBlZGVmIEFuZ2xlQXhpczxmbG9hdD4gQW5nbGVBeGlzZjsKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBkb3VibGUgcHJlY2lzaW9uIGFuZ2xlLWF4aXMgdHlwZSAqLwordHlwZWRlZiBBbmdsZUF4aXM8ZG91YmxlPiBBbmdsZUF4aXNkOworCisvKiogU2V0IFxjICp0aGlzIGZyb20gYSBcYiB1bml0IHF1YXRlcm5pb24uCisgICogVGhlIGF4aXMgaXMgbm9ybWFsaXplZC4KKyAgKiAKKyAgKiBcd2FybmluZyBBcyBhbnkgb3RoZXIgbWV0aG9kIGRlYWxpbmcgd2l0aCBxdWF0ZXJuaW9uLCBpZiB0aGUgaW5wdXQgcXVhdGVybmlvbgorICAqICAgICAgICAgIGlzIG5vdCBub3JtYWxpemVkIHRoZW4gdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0RGVyaXZlZD4KK0FuZ2xlQXhpczxTY2FsYXI+JiBBbmdsZUF4aXM8U2NhbGFyPjo6b3BlcmF0b3I9KGNvbnN0IFF1YXRlcm5pb25CYXNlPFF1YXREZXJpdmVkPiYgcSkKK3sKKyAgdXNpbmcgc3RkOjphY29zOworICB1c2luZyBzdGQ6Om1pbjsKKyAgdXNpbmcgc3RkOjptYXg7CisgIFNjYWxhciBuMiA9IHEudmVjKCkuc3F1YXJlZE5vcm0oKTsKKyAgaWYgKG4yIDwgTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKk51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkKKyAgeworICAgIG1fYW5nbGUgPSAwOworICAgIG1fYXhpcyA8PCAxLCAwLCAwOworICB9CisgIGVsc2UKKyAgeworICAgIG1fYW5nbGUgPSBTY2FsYXIoMikqYWNvcygobWluKSgobWF4KShTY2FsYXIoLTEpLHEudygpKSxTY2FsYXIoMSkpKTsKKyAgICBtX2F4aXMgPSBxLnZlYygpIC8gaW50ZXJuYWw6OnNxcnQobjIpOworICB9CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFNldCBcYyAqdGhpcyBmcm9tIGEgM3gzIHJvdGF0aW9uIG1hdHJpeCBcYSBtYXQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorQW5nbGVBeGlzPFNjYWxhcj4mIEFuZ2xlQXhpczxTY2FsYXI+OjpvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbWF0KQoreworICAvLyBTaW5jZSBhIGRpcmVjdCBjb252ZXJzaW9uIHdvdWxkIG5vdCBiZSByZWFsbHkgZmFzdGVyLAorICAvLyBsZXQncyB1c2UgdGhlIHJvYnVzdCBRdWF0ZXJuaW9uIGltcGxlbWVudGF0aW9uOgorICByZXR1cm4gKnRoaXMgPSBRdWF0ZXJuaW9uVHlwZShtYXQpOworfQorCisvKioKKyogXGJyaWVmIFNldHMgXGMgKnRoaXMgZnJvbSBhIDN4MyByb3RhdGlvbiBtYXRyaXguCisqKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitBbmdsZUF4aXM8U2NhbGFyPiYgQW5nbGVBeGlzPFNjYWxhcj46OmZyb21Sb3RhdGlvbk1hdHJpeChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtYXQpCit7CisgIHJldHVybiAqdGhpcyA9IFF1YXRlcm5pb25UeXBlKG1hdCk7Cit9CisKKy8qKiBDb25zdHJ1Y3RzIGFuZCBccmV0dXJucyBhbiBlcXVpdmFsZW50IDN4MyByb3RhdGlvbiBtYXRyaXguCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0eXBlbmFtZSBBbmdsZUF4aXM8U2NhbGFyPjo6TWF0cml4MworQW5nbGVBeGlzPFNjYWxhcj46OnRvUm90YXRpb25NYXRyaXgodm9pZCkgY29uc3QKK3sKKyAgTWF0cml4MyByZXM7CisgIFZlY3RvcjMgc2luX2F4aXMgID0gaW50ZXJuYWw6OnNpbihtX2FuZ2xlKSAqIG1fYXhpczsKKyAgU2NhbGFyIGMgPSBpbnRlcm5hbDo6Y29zKG1fYW5nbGUpOworICBWZWN0b3IzIGNvczFfYXhpcyA9IChTY2FsYXIoMSktYykgKiBtX2F4aXM7CisKKyAgU2NhbGFyIHRtcDsKKyAgdG1wID0gY29zMV9heGlzLngoKSAqIG1fYXhpcy55KCk7CisgIHJlcy5jb2VmZlJlZigwLDEpID0gdG1wIC0gc2luX2F4aXMueigpOworICByZXMuY29lZmZSZWYoMSwwKSA9IHRtcCArIHNpbl9heGlzLnooKTsKKworICB0bXAgPSBjb3MxX2F4aXMueCgpICogbV9heGlzLnooKTsKKyAgcmVzLmNvZWZmUmVmKDAsMikgPSB0bXAgKyBzaW5fYXhpcy55KCk7CisgIHJlcy5jb2VmZlJlZigyLDApID0gdG1wIC0gc2luX2F4aXMueSgpOworCisgIHRtcCA9IGNvczFfYXhpcy55KCkgKiBtX2F4aXMueigpOworICByZXMuY29lZmZSZWYoMSwyKSA9IHRtcCAtIHNpbl9heGlzLngoKTsKKyAgcmVzLmNvZWZmUmVmKDIsMSkgPSB0bXAgKyBzaW5fYXhpcy54KCk7CisKKyAgcmVzLmRpYWdvbmFsKCkgPSAoY29zMV9heGlzLmN3aXNlUHJvZHVjdChtX2F4aXMpKS5hcnJheSgpICsgYzsKKworICByZXR1cm4gcmVzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0FOR0xFQVhJU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvR2VvbWV0cnkvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvR2VvbWV0cnkvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmNzI4YgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDggQEAKK0ZJTEUoR0xPQiBFaWdlbl9HZW9tZXRyeV9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fR2VvbWV0cnlfU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS9FaWdlbi9zcmMvR2VvbWV0cnkgQ09NUE9ORU5UIERldmVsCisgICkKKworQUREX1NVQkRJUkVDVE9SWShhcmNoKQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0dlb21ldHJ5L0V1bGVyQW5nbGVzLmggYi9FaWdlbi9zcmMvR2VvbWV0cnkvRXVsZXJBbmdsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI0ZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L0V1bGVyQW5nbGVzLmgKQEAgLTAsMCArMSw4NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0VVTEVSQU5HTEVTX0gKKyNkZWZpbmUgRUlHRU5fRVVMRVJBTkdMRVNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKgorICAqIFxyZXR1cm5zIHRoZSBFdWxlci1hbmdsZXMgb2YgdGhlIHJvdGF0aW9uIG1hdHJpeCBcYyAqdGhpcyB1c2luZyB0aGUgY29udmVudGlvbiBkZWZpbmVkIGJ5IHRoZSB0cmlwbGV0IChcYSBhMCxcYSBhMSxcYSBhMikKKyAgKgorICAqIEVhY2ggb2YgdGhlIHRocmVlIHBhcmFtZXRlcnMgXGEgYTAsXGEgYTEsXGEgYTIgcmVwcmVzZW50cyB0aGUgcmVzcGVjdGl2ZSByb3RhdGlvbiBheGlzIGFzIGFuIGludGVnZXIgaW4gezAsMSwyfS4KKyAgKiBGb3IgaW5zdGFuY2UsIGluOgorICAqIFxjb2RlIFZlY3RvcjNmIGVhID0gbWF0LmV1bGVyQW5nbGVzKDIsIDAsIDIpOyBcZW5kY29kZQorICAqICIyIiByZXByZXNlbnRzIHRoZSB6IGF4aXMgYW5kICIwIiB0aGUgeCBheGlzLCBldGMuIFRoZSByZXR1cm5lZCBhbmdsZXMgYXJlIHN1Y2ggdGhhdAorICAqIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBlcXVhbGl0eToKKyAgKiBcY29kZQorICAqIG1hdCA9PSBBbmdsZUF4aXNmKGVhWzBdLCBWZWN0b3IzZjo6VW5pdFooKSkKKyAgKiAgICAgICogQW5nbGVBeGlzZihlYVsxXSwgVmVjdG9yM2Y6OlVuaXRYKCkpCisgICogICAgICAqIEFuZ2xlQXhpc2YoZWFbMl0sIFZlY3RvcjNmOjpVbml0WigpKTsgXGVuZGNvZGUKKyAgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSByaWdodC1tdWx0aXBseSBjb252ZW50aW9ucyAod2l0aCByaWdodCBoYW5kIHNpZGUgZnJhbWVzKS4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgTWF0cml4PHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlNjYWxhciwzLDE+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpldWxlckFuZ2xlcyhJbmRleCBhMCwgSW5kZXggYTEsIEluZGV4IGEyKSBjb25zdAoreworICAvKiBJbXBsZW1lbnRlZCBmcm9tIEdyYXBoaWNzIEdlbXMgSVYgKi8KKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9NQVRSSVhfU1BFQ0lGSUNfU0laRShEZXJpdmVkLDMsMykKKworICBNYXRyaXg8U2NhbGFyLDMsMT4gcmVzOworICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsMiwxPiBWZWN0b3IyOworICBjb25zdCBTY2FsYXIgZXBzaWxvbiA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKTsKKworICBjb25zdCBJbmRleCBvZGQgPSAoKGEwKzEpJTMgPT0gYTEpID8gMCA6IDE7CisgIGNvbnN0IEluZGV4IGkgPSBhMDsKKyAgY29uc3QgSW5kZXggaiA9IChhMCArIDEgKyBvZGQpJTM7CisgIGNvbnN0IEluZGV4IGsgPSAoYTAgKyAyIC0gb2RkKSUzOworCisgIGlmIChhMD09YTIpCisgIHsKKyAgICBTY2FsYXIgcyA9IFZlY3RvcjIoY29lZmYoaixpKSAsIGNvZWZmKGssaSkpLm5vcm0oKTsKKyAgICByZXNbMV0gPSBpbnRlcm5hbDo6YXRhbjIocywgY29lZmYoaSxpKSk7CisgICAgaWYgKHMgPiBlcHNpbG9uKQorICAgIHsKKyAgICAgIHJlc1swXSA9IGludGVybmFsOjphdGFuMihjb2VmZihqLGkpLCBjb2VmZihrLGkpKTsKKyAgICAgIHJlc1syXSA9IGludGVybmFsOjphdGFuMihjb2VmZihpLGopLC1jb2VmZihpLGspKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJlc1swXSA9IFNjYWxhcigwKTsKKyAgICAgIHJlc1syXSA9IChjb2VmZihpLGkpPjA/MTotMSkqaW50ZXJuYWw6OmF0YW4yKC1jb2VmZihrLGopLCBjb2VmZihqLGopKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgU2NhbGFyIGMgPSBWZWN0b3IyKGNvZWZmKGksaSkgLCBjb2VmZihpLGopKS5ub3JtKCk7CisgICAgcmVzWzFdID0gaW50ZXJuYWw6OmF0YW4yKC1jb2VmZihpLGspLCBjKTsKKyAgICBpZiAoYyA+IGVwc2lsb24pCisgICAgeworICAgICAgcmVzWzBdID0gaW50ZXJuYWw6OmF0YW4yKGNvZWZmKGosayksIGNvZWZmKGssaykpOworICAgICAgcmVzWzJdID0gaW50ZXJuYWw6OmF0YW4yKGNvZWZmKGksaiksIGNvZWZmKGksaSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmVzWzBdID0gU2NhbGFyKDApOworICAgICAgcmVzWzJdID0gKGNvZWZmKGksayk+MD8xOi0xKSppbnRlcm5hbDo6YXRhbjIoLWNvZWZmKGssaiksIGNvZWZmKGosaikpOworICAgIH0KKyAgfQorICBpZiAoIW9kZCkKKyAgICByZXMgPSAtcmVzOworICByZXR1cm4gcmVzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0VVTEVSQU5HTEVTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9Ib21vZ2VuZW91cy5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L0hvbW9nZW5lb3VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwM2ZlYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9Ib21vZ2VuZW91cy5oCkBAIC0wLDAgKzEsMzA3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9IT01PR0VORU9VU19ICisjZGVmaW5lIEVJR0VOX0hPTU9HRU5FT1VTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXGNsYXNzIEhvbW9nZW5lb3VzCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiBvZiBvbmUgKG9yIGEgc2V0IG9mKSBob21vZ2VuZW91cyB2ZWN0b3IocykKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaW4gd2hpY2ggd2UgYXJlIG1ha2luZyBob21vZ2VuZW91cworICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gb2Ygb25lIChvciBhIHNldCBvZikgaG9tb2dlbmVvdXMgdmVjdG9yKHMpLgorICAqIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiBNYXRyaXhCYXNlOjpob21vZ2VuZW91cygpIGFuZCBtb3N0IG9mIHRoZSB0aW1lCisgICogdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpob21vZ2VuZW91cygpCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsaW50IERpcmVjdGlvbj4KK3N0cnVjdCB0cmFpdHM8SG9tb2dlbmVvdXM8TWF0cml4VHlwZSxEaXJlY3Rpb24+ID4KKyA6IHRyYWl0czxNYXRyaXhUeXBlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgbmVzdGVkPE1hdHJpeFR5cGU+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSBfTWF0cml4VHlwZU5lc3RlZDsKKyAgZW51bSB7CisgICAgUm93c1BsdXNPbmUgPSAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgIT0gRHluYW1pYykgPworICAgICAgICAgICAgICAgICAgaW50KE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKSArIDEgOiBEeW5hbWljLAorICAgIENvbHNQbHVzT25lID0gKE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lICE9IER5bmFtaWMpID8KKyAgICAgICAgICAgICAgICAgIGludChNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSkgKyAxIDogRHluYW1pYywKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IERpcmVjdGlvbj09VmVydGljYWwgID8gIFJvd3NQbHVzT25lIDogTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEaXJlY3Rpb249PUhvcml6b250YWwgPyBDb2xzUGx1c09uZSA6IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gUm93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBDb2xzQXRDb21waWxlVGltZSwKKyAgICBUbXBGbGFncyA9IF9NYXRyaXhUeXBlTmVzdGVkOjpGbGFncyAmIEhlcmVkaXRhcnlCaXRzLAorICAgIEZsYWdzID0gQ29sc0F0Q29tcGlsZVRpbWU9PTEgPyAoVG1wRmxhZ3MgJiB+Um93TWFqb3JCaXQpCisgICAgICAgICAgOiBSb3dzQXRDb21waWxlVGltZT09MSA/IChUbXBGbGFncyB8IFJvd01ham9yQml0KQorICAgICAgICAgIDogVG1wRmxhZ3MsCisgICAgQ29lZmZSZWFkQ29zdCA9IF9NYXRyaXhUeXBlTmVzdGVkOjpDb2VmZlJlYWRDb3N0CisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIExocz4gc3RydWN0IGhvbW9nZW5lb3VzX2xlZnRfcHJvZHVjdF9pbXBsOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSx0eXBlbmFtZSBSaHM+IHN0cnVjdCBob21vZ2VuZW91c19yaWdodF9wcm9kdWN0X2ltcGw7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLGludCBfRGlyZWN0aW9uPiBjbGFzcyBIb21vZ2VuZW91cworICA6IHB1YmxpYyBNYXRyaXhCYXNlPEhvbW9nZW5lb3VzPE1hdHJpeFR5cGUsX0RpcmVjdGlvbj4gPgoreworICBwdWJsaWM6CisKKyAgICBlbnVtIHsgRGlyZWN0aW9uID0gX0RpcmVjdGlvbiB9OworCisgICAgdHlwZWRlZiBNYXRyaXhCYXNlPEhvbW9nZW5lb3VzPiBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoSG9tb2dlbmVvdXMpCisKKyAgICBpbmxpbmUgSG9tb2dlbmVvdXMoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBtX21hdHJpeChtYXRyaXgpCisgICAge30KKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpICsgKGludChEaXJlY3Rpb24pPT1WZXJ0aWNhbCAgID8gMSA6IDApOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCkgKyAoaW50KERpcmVjdGlvbik9PUhvcml6b250YWwgPyAxIDogMCk7IH0KKworICAgIGlubGluZSBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgaWYoICAoaW50KERpcmVjdGlvbik9PVZlcnRpY2FsICAgJiYgcm93PT1tX21hdHJpeC5yb3dzKCkpCisgICAgICAgIHx8IChpbnQoRGlyZWN0aW9uKT09SG9yaXpvbnRhbCAmJiBjb2w9PW1fbWF0cml4LmNvbHMoKSkpCisgICAgICAgIHJldHVybiAxOworICAgICAgcmV0dXJuIG1fbWF0cml4LmNvZWZmKHJvdywgY29sKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjpob21vZ2VuZW91c19yaWdodF9wcm9kdWN0X2ltcGw8SG9tb2dlbmVvdXMsUmhzPgorICAgIG9wZXJhdG9yKiAoY29uc3QgTWF0cml4QmFzZTxSaHM+JiByaHMpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGludChEaXJlY3Rpb24pPT1Ib3Jpem9udGFsKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6aG9tb2dlbmVvdXNfcmlnaHRfcHJvZHVjdF9pbXBsPEhvbW9nZW5lb3VzLFJocz4obV9tYXRyaXgscmhzLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTGhzPiBmcmllbmQKKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OmhvbW9nZW5lb3VzX2xlZnRfcHJvZHVjdF9pbXBsPEhvbW9nZW5lb3VzLExocz4KKyAgICBvcGVyYXRvciogKGNvbnN0IE1hdHJpeEJhc2U8TGhzPiYgbGhzLCBjb25zdCBIb21vZ2VuZW91cyYgcmhzKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpbnQoRGlyZWN0aW9uKT09VmVydGljYWwpOworICAgICAgcmV0dXJuIGludGVybmFsOjpob21vZ2VuZW91c19sZWZ0X3Byb2R1Y3RfaW1wbDxIb21vZ2VuZW91cyxMaHM+KGxocy5kZXJpdmVkKCkscmhzLm1fbWF0cml4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4gZnJpZW5kCisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjpob21vZ2VuZW91c19sZWZ0X3Byb2R1Y3RfaW1wbDxIb21vZ2VuZW91cyxUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+ID4KKyAgICBvcGVyYXRvciogKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIGxocywgY29uc3QgSG9tb2dlbmVvdXMmIHJocykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaW50KERpcmVjdGlvbik9PVZlcnRpY2FsKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6aG9tb2dlbmVvdXNfbGVmdF9wcm9kdWN0X2ltcGw8SG9tb2dlbmVvdXMsVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiA+KGxocyxyaHMubV9tYXRyaXgpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fbWF0cml4OworfTsKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUKKyAgKgorICAqIFxyZXR1cm4gYW4gZXhwcmVzc2lvbiBvZiB0aGUgZXF1aXZhbGVudCBob21vZ2VuZW91cyB2ZWN0b3IKKyAgKgorICAqIFxvbmx5X2Zvcl92ZWN0b3JzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2hvbW9nZW5lb3VzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfaG9tb2dlbmVvdXMub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgSG9tb2dlbmVvdXMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6SG9tb2dlbmVvdXNSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpob21vZ2VuZW91cygpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlCisgICoKKyAgKiBccmV0dXJucyBhIG1hdHJpeCBleHByZXNzaW9uIG9mIGhvbW9nZW5lb3VzIGNvbHVtbiAob3Igcm93KSB2ZWN0b3JzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBWZWN0b3J3aXNlT3BfaG9tb2dlbmVvdXMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgVmVjdG9yd2lzZU9wX2hvbW9nZW5lb3VzLm91dAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmhvbW9nZW5lb3VzKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLCBpbnQgRGlyZWN0aW9uPgoraW5saW5lIEhvbW9nZW5lb3VzPEV4cHJlc3Npb25UeXBlLERpcmVjdGlvbj4KK1ZlY3Rvcndpc2VPcDxFeHByZXNzaW9uVHlwZSxEaXJlY3Rpb24+Ojpob21vZ2VuZW91cygpIGNvbnN0Cit7CisgIHJldHVybiBfZXhwcmVzc2lvbigpOworfQorCisvKiogXGdlb21ldHJ5X21vZHVsZQorICAqCisgICogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgaG9tb2dlbmVvdXMgbm9ybWFsaXplZCB2ZWN0b3Igb2YgXGMgKnRoaXMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfaG5vcm1hbGl6ZWQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9obm9ybWFsaXplZC5vdXQKKyAgKgorICAqIFxzYSBWZWN0b3J3aXNlT3A6Omhub3JtYWxpemVkKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6SE5vcm1hbGl6ZWRSZXR1cm5UeXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpobm9ybWFsaXplZCgpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCk7CisgIHJldHVybiBDb25zdFN0YXJ0TWludXNPbmUoZGVyaXZlZCgpLDAsMCwKKyAgICBDb2xzQXRDb21waWxlVGltZT09MT9zaXplKCktMToxLAorICAgIENvbHNBdENvbXBpbGVUaW1lPT0xPzE6c2l6ZSgpLTEpIC8gY29lZmYoc2l6ZSgpLTEpOworfQorCisvKiogXGdlb21ldHJ5X21vZHVsZQorICAqCisgICogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgaG9tb2dlbmVvdXMgbm9ybWFsaXplZCB2ZWN0b3Igb2YgXGMgKnRoaXMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIERpcmVjdGlvbldpc2VfaG5vcm1hbGl6ZWQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRGlyZWN0aW9uV2lzZV9obm9ybWFsaXplZC5vdXQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpobm9ybWFsaXplZCgpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSwgaW50IERpcmVjdGlvbj4KK2lubGluZSBjb25zdCB0eXBlbmFtZSBWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6SE5vcm1hbGl6ZWRSZXR1cm5UeXBlCitWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6aG5vcm1hbGl6ZWQoKSBjb25zdAoreworICByZXR1cm4gSE5vcm1hbGl6ZWRfQmxvY2soX2V4cHJlc3Npb24oKSwwLDAsCisgICAgICBEaXJlY3Rpb249PVZlcnRpY2FsICAgPyBfZXhwcmVzc2lvbigpLnJvd3MoKS0xIDogX2V4cHJlc3Npb24oKS5yb3dzKCksCisgICAgICBEaXJlY3Rpb249PUhvcml6b250YWwgPyBfZXhwcmVzc2lvbigpLmNvbHMoKS0xIDogX2V4cHJlc3Npb24oKS5jb2xzKCkpLmN3aXNlUXVvdGllbnQoCisgICAgICBSZXBsaWNhdGU8SE5vcm1hbGl6ZWRfRmFjdG9ycywKKyAgICAgICAgICAgICAgICBEaXJlY3Rpb249PVZlcnRpY2FsICAgPyBITm9ybWFsaXplZF9TaXplTWludXNPbmUgOiAxLAorICAgICAgICAgICAgICAgIERpcmVjdGlvbj09SG9yaXpvbnRhbCA/IEhOb3JtYWxpemVkX1NpemVNaW51c09uZSA6IDE+CisgICAgICAgIChITm9ybWFsaXplZF9GYWN0b3JzKF9leHByZXNzaW9uKCksCisgICAgICAgICAgRGlyZWN0aW9uPT1WZXJ0aWNhbCAgICA/IF9leHByZXNzaW9uKCkucm93cygpLTE6MCwKKyAgICAgICAgICBEaXJlY3Rpb249PUhvcml6b250YWwgID8gX2V4cHJlc3Npb24oKS5jb2xzKCktMTowLAorICAgICAgICAgIERpcmVjdGlvbj09VmVydGljYWwgICAgPyAxIDogX2V4cHJlc3Npb24oKS5yb3dzKCksCisgICAgICAgICAgRGlyZWN0aW9uPT1Ib3Jpem9udGFsICA/IDEgOiBfZXhwcmVzc2lvbigpLmNvbHMoKSksCisgICAgICAgICBEaXJlY3Rpb249PVZlcnRpY2FsICAgPyBfZXhwcmVzc2lvbigpLnJvd3MoKS0xIDogMSwKKyAgICAgICAgIERpcmVjdGlvbj09SG9yaXpvbnRhbCA/IF9leHByZXNzaW9uKCkuY29scygpLTEgOiAxKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeE9yVHJhbnNmb3JtVHlwZT4KK3N0cnVjdCB0YWtlX21hdHJpeF9mb3JfcHJvZHVjdAoreworICB0eXBlZGVmIE1hdHJpeE9yVHJhbnNmb3JtVHlwZSB0eXBlOworICBzdGF0aWMgY29uc3QgdHlwZSYgcnVuKGNvbnN0IHR5cGUgJngpIHsgcmV0dXJuIHg7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsaW50IE9wdGlvbnM+CitzdHJ1Y3QgdGFrZV9tYXRyaXhfZm9yX3Byb2R1Y3Q8VHJhbnNmb3JtPFNjYWxhciwgRGltLCBNb2RlLCBPcHRpb25zPiA+Cit7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwgRGltLCBNb2RlLCBPcHRpb25zPiBUcmFuc2Zvcm1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Q8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6Q29uc3RBZmZpbmVQYXJ0Pjo6dHlwZSB0eXBlOworICBzdGF0aWMgdHlwZSBydW4gKGNvbnN0IFRyYW5zZm9ybVR5cGUmIHgpIHsgcmV0dXJuIHguYWZmaW5lKCk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE9wdGlvbnM+CitzdHJ1Y3QgdGFrZV9tYXRyaXhfZm9yX3Byb2R1Y3Q8VHJhbnNmb3JtPFNjYWxhciwgRGltLCBQcm9qZWN0aXZlLCBPcHRpb25zPiA+Cit7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwgRGltLCBQcm9qZWN0aXZlLCBPcHRpb25zPiBUcmFuc2Zvcm1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgdHlwZTsKKyAgc3RhdGljIGNvbnN0IHR5cGUmIHJ1biAoY29uc3QgVHJhbnNmb3JtVHlwZSYgeCkgeyByZXR1cm4geC5tYXRyaXgoKTsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSx0eXBlbmFtZSBMaHM+CitzdHJ1Y3QgdHJhaXRzPGhvbW9nZW5lb3VzX2xlZnRfcHJvZHVjdF9pbXBsPEhvbW9nZW5lb3VzPE1hdHJpeFR5cGUsVmVydGljYWw+LExocz4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRha2VfbWF0cml4X2Zvcl9wcm9kdWN0PExocz46OnR5cGUgTGhzTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPE1hdHJpeFR5cGU+Ojp0eXBlIE1hdHJpeFR5cGVDbGVhbmVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzTWF0cml4VHlwZT46OnR5cGUgTGhzTWF0cml4VHlwZUNsZWFuZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgbWFrZV9wcm9wZXJfbWF0cml4X3R5cGU8CisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlQ2xlYW5lZD46OlNjYWxhciwKKyAgICAgICAgICAgICAgICAgTGhzTWF0cml4VHlwZUNsZWFuZWQ6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlQ2xlYW5lZDo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGVDbGVhbmVkOjpQbGFpbk9iamVjdDo6T3B0aW9ucywKKyAgICAgICAgICAgICAgICAgTGhzTWF0cml4VHlwZUNsZWFuZWQ6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlQ2xlYW5lZDo6TWF4Q29sc0F0Q29tcGlsZVRpbWU+Ojp0eXBlIFJldHVyblR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIExocz4KK3N0cnVjdCBob21vZ2VuZW91c19sZWZ0X3Byb2R1Y3RfaW1wbDxIb21vZ2VuZW91czxNYXRyaXhUeXBlLFZlcnRpY2FsPixMaHM+CisgIDogcHVibGljIFJldHVybkJ5VmFsdWU8aG9tb2dlbmVvdXNfbGVmdF9wcm9kdWN0X2ltcGw8SG9tb2dlbmVvdXM8TWF0cml4VHlwZSxWZXJ0aWNhbD4sTGhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPGhvbW9nZW5lb3VzX2xlZnRfcHJvZHVjdF9pbXBsPjo6TGhzTWF0cml4VHlwZSBMaHNNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzTWF0cml4VHlwZT46OnR5cGUgTGhzTWF0cml4VHlwZUNsZWFuZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBMaHNNYXRyaXhUeXBlQ2xlYW5lZDo6TmVzdGVkPjo6dHlwZSBMaHNNYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICBob21vZ2VuZW91c19sZWZ0X3Byb2R1Y3RfaW1wbChjb25zdCBMaHMmIGxocywgY29uc3QgTWF0cml4VHlwZSYgcmhzKQorICAgIDogbV9saHModGFrZV9tYXRyaXhfZm9yX3Byb2R1Y3Q8TGhzPjo6cnVuKGxocykpLAorICAgICAgbV9yaHMocmhzKQorICB7fQorCisgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9saHMucm93cygpOyB9CisgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9yaHMuY29scygpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgLy8gRklYTUUgaW52ZXN0aWdhdGUgaG93IHRvIGFsbG93IGxhenkgZXZhbHVhdGlvbiBvZiB0aGlzIHByb2R1Y3Qgd2hlbiBwb3NzaWJsZQorICAgIGRzdCA9IEJsb2NrPGNvbnN0IExoc01hdHJpeFR5cGVOZXN0ZWQsCisgICAgICAgICAgICAgIExoc01hdHJpeFR5cGVOZXN0ZWQ6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICBMaHNNYXRyaXhUeXBlTmVzdGVkOjpDb2xzQXRDb21waWxlVGltZT09RHluYW1pYz9EeW5hbWljOkxoc01hdHJpeFR5cGVOZXN0ZWQ6OkNvbHNBdENvbXBpbGVUaW1lLTE+CisgICAgICAgICAgICAobV9saHMsMCwwLG1fbGhzLnJvd3MoKSxtX2xocy5jb2xzKCktMSkgKiBtX3JoczsKKyAgICBkc3QgKz0gbV9saHMuY29sKG1fbGhzLmNvbHMoKS0xKS5yb3d3aXNlKCkKKyAgICAgICAgICAgIC50ZW1wbGF0ZSByZXBsaWNhdGU8TWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+KG1fcmhzLmNvbHMoKSk7CisgIH0KKworICB0eXBlbmFtZSBMaHNNYXRyaXhUeXBlQ2xlYW5lZDo6TmVzdGVkIG1fbGhzOworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9yaHM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIFJocz4KK3N0cnVjdCB0cmFpdHM8aG9tb2dlbmVvdXNfcmlnaHRfcHJvZHVjdF9pbXBsPEhvbW9nZW5lb3VzPE1hdHJpeFR5cGUsSG9yaXpvbnRhbD4sUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgbWFrZV9wcm9wZXJfbWF0cml4X3R5cGU8dHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIsCisgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBSaHM6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpQbGFpbk9iamVjdDo6T3B0aW9ucywKKyAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIFJoczo6TWF4Q29sc0F0Q29tcGlsZVRpbWU+Ojp0eXBlIFJldHVyblR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIFJocz4KK3N0cnVjdCBob21vZ2VuZW91c19yaWdodF9wcm9kdWN0X2ltcGw8SG9tb2dlbmVvdXM8TWF0cml4VHlwZSxIb3Jpem9udGFsPixSaHM+CisgIDogcHVibGljIFJldHVybkJ5VmFsdWU8aG9tb2dlbmVvdXNfcmlnaHRfcHJvZHVjdF9pbXBsPEhvbW9nZW5lb3VzPE1hdHJpeFR5cGUsSG9yaXpvbnRhbD4sUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBSaHM6Ok5lc3RlZD46OnR5cGUgUmhzTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICBob21vZ2VuZW91c19yaWdodF9wcm9kdWN0X2ltcGwoY29uc3QgTWF0cml4VHlwZSYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgICA6IG1fbGhzKGxocyksIG1fcmhzKHJocykKKyAge30KKworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbGhzLnJvd3MoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzLmNvbHMoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIC8vIEZJWE1FIGludmVzdGlnYXRlIGhvdyB0byBhbGxvdyBsYXp5IGV2YWx1YXRpb24gb2YgdGhpcyBwcm9kdWN0IHdoZW4gcG9zc2libGUKKyAgICBkc3QgPSBtX2xocyAqIEJsb2NrPGNvbnN0IFJoc05lc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJoc05lc3RlZDo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWM/RHluYW1pYzpSaHNOZXN0ZWQ6OlJvd3NBdENvbXBpbGVUaW1lLTEsCisgICAgICAgICAgICAgICAgICAgICAgICBSaHNOZXN0ZWQ6OkNvbHNBdENvbXBpbGVUaW1lPgorICAgICAgICAgICAgKG1fcmhzLDAsMCxtX3Jocy5yb3dzKCktMSxtX3Jocy5jb2xzKCkpOworICAgIGRzdCArPSBtX3Jocy5yb3cobV9yaHMucm93cygpLTEpLmNvbHdpc2UoKQorICAgICAgICAgICAgLnRlbXBsYXRlIHJlcGxpY2F0ZTxNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4obV9saHMucm93cygpKTsKKyAgfQorCisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBtX2xoczsKKyAgdHlwZW5hbWUgUmhzOjpOZXN0ZWQgbV9yaHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9IT01PR0VORU9VU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvR2VvbWV0cnkvSHlwZXJwbGFuZS5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L0h5cGVycGxhbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjdjN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L0h5cGVycGxhbmUuaApAQCAtMCwwICsxLDI2OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0hZUEVSUExBTkVfSAorI2RlZmluZSBFSUdFTl9IWVBFUlBMQU5FX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXGNsYXNzIEh5cGVycGxhbmUKKyAgKgorICAqIFxicmllZiBBIGh5cGVycGxhbmUKKyAgKgorICAqIEEgaHlwZXJwbGFuZSBpcyBhbiBhZmZpbmUgc3Vic3BhY2Ugb2YgZGltZW5zaW9uIG4tMSBpbiBhIHNwYWNlIG9mIGRpbWVuc2lvbiBuLgorICAqIEZvciBleGFtcGxlLCBhIGh5cGVycGxhbmUgaW4gYSBwbGFuZSBpcyBhIGxpbmU7IGEgaHlwZXJwbGFuZSBpbiAzLXNwYWNlIGlzIGEgcGxhbmUuCisgICoKKyAgKiBccGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4sIHRoZSB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMKKyAgKiBccGFyYW0gX0FtYmllbnREaW0gdGhlIGRpbWVuc2lvbiBvZiB0aGUgYW1iaWVudCBzcGFjZSwgY2FuIGJlIGEgY29tcGlsZSB0aW1lIHZhbHVlIG9yIER5bmFtaWMuCisgICogICAgICAgICAgICAgTm90aWNlIHRoYXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgaHlwZXJwbGFuZSBpcyBfQW1iaWVudERpbS0xLgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGh5cGVycGxhbmUgYXMgdGhlIHplcm8gc2V0IG9mIHRoZSBpbXBsaWNpdCBlcXVhdGlvbgorICAqIFxmJCBuIFxjZG90IHggKyBkID0gMCBcZiQgd2hlcmUgXGYkIG4gXGYkIGlzIGEgdW5pdCBub3JtYWwgdmVjdG9yIG9mIHRoZSBwbGFuZSAobGluZWFyIHBhcnQpCisgICogYW5kIFxmJCBkIFxmJCBpcyB0aGUgZGlzdGFuY2UgKG9mZnNldCkgdG8gdGhlIG9yaWdpbi4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0sIGludCBfT3B0aW9ucz4KK2NsYXNzIEh5cGVycGxhbmUKK3sKK3B1YmxpYzoKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRl9WRUNUT1JJWkFCTEVfRklYRURfU0laRShfU2NhbGFyLF9BbWJpZW50RGltPT1EeW5hbWljID8gRHluYW1pYyA6IF9BbWJpZW50RGltKzEpCisgIGVudW0geworICAgIEFtYmllbnREaW1BdENvbXBpbGVUaW1lID0gX0FtYmllbnREaW0sCisgICAgT3B0aW9ucyA9IF9PcHRpb25zCisgIH07CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsQW1iaWVudERpbUF0Q29tcGlsZVRpbWUsMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEluZGV4KEFtYmllbnREaW1BdENvbXBpbGVUaW1lKT09RHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAgPyBEeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgICA6IEluZGV4KEFtYmllbnREaW1BdENvbXBpbGVUaW1lKSsxLDEsT3B0aW9ucz4gQ29lZmZpY2llbnRzOworICB0eXBlZGVmIEJsb2NrPENvZWZmaWNpZW50cyxBbWJpZW50RGltQXRDb21waWxlVGltZSwxPiBOb3JtYWxSZXR1cm5UeXBlOworICB0eXBlZGVmIGNvbnN0IEJsb2NrPGNvbnN0IENvZWZmaWNpZW50cyxBbWJpZW50RGltQXRDb21waWxlVGltZSwxPiBDb25zdE5vcm1hbFJldHVyblR5cGU7CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aG91dCBpbml0aWFsaXphdGlvbiAqLworICBpbmxpbmUgZXhwbGljaXQgSHlwZXJwbGFuZSgpIHt9CisgIAorICB0ZW1wbGF0ZTxpbnQgT3RoZXJPcHRpb25zPgorICBIeXBlcnBsYW5lKGNvbnN0IEh5cGVycGxhbmU8U2NhbGFyLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLE90aGVyT3B0aW9ucz4mIG90aGVyKQorICAgOiBtX2NvZWZmcyhvdGhlci5jb2VmZnMoKSkKKyAge30KKworICAvKiogQ29uc3RydWN0cyBhIGR5bmFtaWMtc2l6ZSBoeXBlcnBsYW5lIHdpdGggXGEgX2RpbSB0aGUgZGltZW5zaW9uCisgICAgKiBvZiB0aGUgYW1iaWVudCBzcGFjZSAqLworICBpbmxpbmUgZXhwbGljaXQgSHlwZXJwbGFuZShJbmRleCBfZGltKSA6IG1fY29lZmZzKF9kaW0rMSkge30KKworICAvKiogQ29uc3RydWN0IGEgcGxhbmUgZnJvbSBpdHMgbm9ybWFsIFxhIG4gYW5kIGEgcG9pbnQgXGEgZSBvbnRvIHRoZSBwbGFuZS4KKyAgICAqIFx3YXJuaW5nIHRoZSB2ZWN0b3Igbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAqLworICBpbmxpbmUgSHlwZXJwbGFuZShjb25zdCBWZWN0b3JUeXBlJiBuLCBjb25zdCBWZWN0b3JUeXBlJiBlKQorICAgIDogbV9jb2VmZnMobi5zaXplKCkrMSkKKyAgeworICAgIG5vcm1hbCgpID0gbjsKKyAgICBvZmZzZXQoKSA9IC1uLmRvdChlKTsKKyAgfQorCisgIC8qKiBDb25zdHJ1Y3RzIGEgcGxhbmUgZnJvbSBpdHMgbm9ybWFsIFxhIG4gYW5kIGRpc3RhbmNlIHRvIHRoZSBvcmlnaW4gXGEgZAorICAgICogc3VjaCB0aGF0IHRoZSBhbGdlYnJhaWMgZXF1YXRpb24gb2YgdGhlIHBsYW5lIGlzIFxmJCBuIFxjZG90IHggKyBkID0gMCBcZiQuCisgICAgKiBcd2FybmluZyB0aGUgdmVjdG9yIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgKi8KKyAgaW5saW5lIEh5cGVycGxhbmUoY29uc3QgVmVjdG9yVHlwZSYgbiwgU2NhbGFyIGQpCisgICAgOiBtX2NvZWZmcyhuLnNpemUoKSsxKQorICB7CisgICAgbm9ybWFsKCkgPSBuOworICAgIG9mZnNldCgpID0gZDsKKyAgfQorCisgIC8qKiBDb25zdHJ1Y3RzIGEgaHlwZXJwbGFuZSBwYXNzaW5nIHRocm91Z2ggdGhlIHR3byBwb2ludHMuIElmIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFtYmllbnQgc3BhY2UKKyAgICAqIGlzIGdyZWF0ZXIgdGhhbiAyLCB0aGVuIHRoZXJlIGlzbid0IHVuaXF1ZW5lc3MsIHNvIGFuIGFyYml0cmFyeSBjaG9pY2UgaXMgbWFkZS4KKyAgICAqLworICBzdGF0aWMgaW5saW5lIEh5cGVycGxhbmUgVGhyb3VnaChjb25zdCBWZWN0b3JUeXBlJiBwMCwgY29uc3QgVmVjdG9yVHlwZSYgcDEpCisgIHsKKyAgICBIeXBlcnBsYW5lIHJlc3VsdChwMC5zaXplKCkpOworICAgIHJlc3VsdC5ub3JtYWwoKSA9IChwMSAtIHAwKS51bml0T3J0aG9nb25hbCgpOworICAgIHJlc3VsdC5vZmZzZXQoKSA9IC1wMC5kb3QocmVzdWx0Lm5vcm1hbCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqIENvbnN0cnVjdHMgYSBoeXBlcnBsYW5lIHBhc3NpbmcgdGhyb3VnaCB0aGUgdGhyZWUgcG9pbnRzLiBUaGUgZGltZW5zaW9uIG9mIHRoZSBhbWJpZW50IHNwYWNlCisgICAgKiBpcyByZXF1aXJlZCB0byBiZSBleGFjdGx5IDMuCisgICAgKi8KKyAgc3RhdGljIGlubGluZSBIeXBlcnBsYW5lIFRocm91Z2goY29uc3QgVmVjdG9yVHlwZSYgcDAsIGNvbnN0IFZlY3RvclR5cGUmIHAxLCBjb25zdCBWZWN0b3JUeXBlJiBwMikKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoVmVjdG9yVHlwZSwgMykKKyAgICBIeXBlcnBsYW5lIHJlc3VsdChwMC5zaXplKCkpOworICAgIHJlc3VsdC5ub3JtYWwoKSA9IChwMiAtIHAwKS5jcm9zcyhwMSAtIHAwKS5ub3JtYWxpemVkKCk7CisgICAgcmVzdWx0Lm9mZnNldCgpID0gLXAwLmRvdChyZXN1bHQubm9ybWFsKCkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKiogQ29uc3RydWN0cyBhIGh5cGVycGxhbmUgcGFzc2luZyB0aHJvdWdoIHRoZSBwYXJhbWV0cml6ZWQgbGluZSBcYSBwYXJhbWV0cml6ZWQuCisgICAgKiBJZiB0aGUgZGltZW5zaW9uIG9mIHRoZSBhbWJpZW50IHNwYWNlIGlzIGdyZWF0ZXIgdGhhbiAyLCB0aGVuIHRoZXJlIGlzbid0IHVuaXF1ZW5lc3MsCisgICAgKiBzbyBhbiBhcmJpdHJhcnkgY2hvaWNlIGlzIG1hZGUuCisgICAgKi8KKyAgLy8gRklYTUUgdG8gYmUgY29uc2l0ZW50IHdpdGggdGhlIHJlc3QgdGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIHN0YXRpYyBUaHJvdWdoIGZ1bmN0aW9uID8/CisgIGV4cGxpY2l0IEh5cGVycGxhbmUoY29uc3QgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsIEFtYmllbnREaW1BdENvbXBpbGVUaW1lPiYgcGFyYW1ldHJpemVkKQorICB7CisgICAgbm9ybWFsKCkgPSBwYXJhbWV0cml6ZWQuZGlyZWN0aW9uKCkudW5pdE9ydGhvZ29uYWwoKTsKKyAgICBvZmZzZXQoKSA9IC1wYXJhbWV0cml6ZWQub3JpZ2luKCkuZG90KG5vcm1hbCgpKTsKKyAgfQorCisgIH5IeXBlcnBsYW5lKCkge30KKworICAvKiogXHJldHVybnMgdGhlIGRpbWVuc2lvbiBpbiB3aGljaCB0aGUgcGxhbmUgaG9sZHMgKi8KKyAgaW5saW5lIEluZGV4IGRpbSgpIGNvbnN0IHsgcmV0dXJuIEFtYmllbnREaW1BdENvbXBpbGVUaW1lPT1EeW5hbWljID8gbV9jb2VmZnMuc2l6ZSgpLTEgOiBJbmRleChBbWJpZW50RGltQXRDb21waWxlVGltZSk7IH0KKworICAvKiogbm9ybWFsaXplcyBcYyAqdGhpcyAqLworICB2b2lkIG5vcm1hbGl6ZSh2b2lkKQorICB7CisgICAgbV9jb2VmZnMgLz0gbm9ybWFsKCkubm9ybSgpOworICB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBzaWduZWQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxhbmUgXGMgKnRoaXMgYW5kIGEgcG9pbnQgXGEgcC4KKyAgICAqIFxzYSBhYnNEaXN0YW5jZSgpCisgICAgKi8KKyAgaW5saW5lIFNjYWxhciBzaWduZWREaXN0YW5jZShjb25zdCBWZWN0b3JUeXBlJiBwKSBjb25zdCB7IHJldHVybiBub3JtYWwoKS5kb3QocCkgKyBvZmZzZXQoKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgYWJzb2x1dGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxhbmUgXGMgKnRoaXMgYW5kIGEgcG9pbnQgXGEgcC4KKyAgICAqIFxzYSBzaWduZWREaXN0YW5jZSgpCisgICAgKi8KKyAgaW5saW5lIFNjYWxhciBhYnNEaXN0YW5jZShjb25zdCBWZWN0b3JUeXBlJiBwKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6YWJzKHNpZ25lZERpc3RhbmNlKHApKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgcHJvamVjdGlvbiBvZiBhIHBvaW50IFxhIHAgb250byB0aGUgcGxhbmUgXGMgKnRoaXMuCisgICAgKi8KKyAgaW5saW5lIFZlY3RvclR5cGUgcHJvamVjdGlvbihjb25zdCBWZWN0b3JUeXBlJiBwKSBjb25zdCB7IHJldHVybiBwIC0gc2lnbmVkRGlzdGFuY2UocCkgKiBub3JtYWwoKTsgfQorCisgIC8qKiBccmV0dXJucyBhIGNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgdW5pdCBub3JtYWwgdmVjdG9yIG9mIHRoZSBwbGFuZSwgd2hpY2ggY29ycmVzcG9uZHMKKyAgICAqIHRvIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgaW1wbGljaXQgZXF1YXRpb24uCisgICAgKi8KKyAgaW5saW5lIENvbnN0Tm9ybWFsUmV0dXJuVHlwZSBub3JtYWwoKSBjb25zdCB7IHJldHVybiBDb25zdE5vcm1hbFJldHVyblR5cGUobV9jb2VmZnMsMCwwLGRpbSgpLDEpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgbm9uLWNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgdW5pdCBub3JtYWwgdmVjdG9yIG9mIHRoZSBwbGFuZSwgd2hpY2ggY29ycmVzcG9uZHMKKyAgICAqIHRvIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgaW1wbGljaXQgZXF1YXRpb24uCisgICAgKi8KKyAgaW5saW5lIE5vcm1hbFJldHVyblR5cGUgbm9ybWFsKCkgeyByZXR1cm4gTm9ybWFsUmV0dXJuVHlwZShtX2NvZWZmcywwLDAsZGltKCksMSk7IH0KKworICAvKiogXHJldHVybnMgdGhlIGRpc3RhbmNlIHRvIHRoZSBvcmlnaW4sIHdoaWNoIGlzIGFsc28gdGhlICJjb25zdGFudCB0ZXJtIiBvZiB0aGUgaW1wbGljaXQgZXF1YXRpb24KKyAgICAqIFx3YXJuaW5nIHRoZSB2ZWN0b3Igbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAqLworICBpbmxpbmUgY29uc3QgU2NhbGFyJiBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmcy5jb2VmZihkaW0oKSk7IH0KKworICAvKiogXHJldHVybnMgYSBub24tY29uc3RhbnQgcmVmZXJlbmNlIHRvIHRoZSBkaXN0YW5jZSB0byB0aGUgb3JpZ2luLCB3aGljaCBpcyBhbHNvIHRoZSBjb25zdGFudCBwYXJ0CisgICAgKiBvZiB0aGUgaW1wbGljaXQgZXF1YXRpb24gKi8KKyAgaW5saW5lIFNjYWxhciYgb2Zmc2V0KCkgeyByZXR1cm4gbV9jb2VmZnMoZGltKCkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgY29uc3RhbnQgcmVmZXJlbmNlIHRvIHRoZSBjb2VmZmljaWVudHMgY19pIG9mIHRoZSBwbGFuZSBlcXVhdGlvbjoKKyAgICAqIFxmJCBjXzAqeF8wICsgLi4uICsgY197ZC0xfSp4X3tkLTF9ICsgY19kID0gMCBcZiQKKyAgICAqLworICBpbmxpbmUgY29uc3QgQ29lZmZpY2llbnRzJiBjb2VmZnMoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmczsgfQorCisgIC8qKiBccmV0dXJucyBhIG5vbi1jb25zdGFudCByZWZlcmVuY2UgdG8gdGhlIGNvZWZmaWNpZW50cyBjX2kgb2YgdGhlIHBsYW5lIGVxdWF0aW9uOgorICAgICogXGYkIGNfMCp4XzAgKyAuLi4gKyBjX3tkLTF9Knhfe2QtMX0gKyBjX2QgPSAwIFxmJAorICAgICovCisgIGlubGluZSBDb2VmZmljaWVudHMmIGNvZWZmcygpIHsgcmV0dXJuIG1fY29lZmZzOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gb2YgKnRoaXMgd2l0aCBcYSBvdGhlci4KKyAgICAqCisgICAgKiBcd2FybmluZyBUaGUgYW1iaWVudCBzcGFjZSBtdXN0IGJlIGEgcGxhbmUsIGkuZS4gaGF2ZSBkaW1lbnNpb24gMiwgc28gdGhhdCBcYyAqdGhpcyBhbmQgXGEgb3RoZXIgYXJlIGxpbmVzLgorICAgICoKKyAgICAqIFxub3RlIElmIFxhIG90aGVyIGlzIGFwcHJveGltYXRlbHkgcGFyYWxsZWwgdG8gKnRoaXMsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFueSBwb2ludCBvbiAqdGhpcy4KKyAgICAqLworICBWZWN0b3JUeXBlIGludGVyc2VjdGlvbihjb25zdCBIeXBlcnBsYW5lJiBvdGhlcikgY29uc3QKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoVmVjdG9yVHlwZSwgMikKKyAgICBTY2FsYXIgZGV0ID0gY29lZmZzKCkuY29lZmYoMCkgKiBvdGhlci5jb2VmZnMoKS5jb2VmZigxKSAtIGNvZWZmcygpLmNvZWZmKDEpICogb3RoZXIuY29lZmZzKCkuY29lZmYoMCk7CisgICAgLy8gc2luY2UgdGhlIGxpbmUgZXF1YXRpb25zIGF4K2J5PWMgYXJlIG5vcm1hbGl6ZWQgd2l0aCBhXjIrYl4yPTEsIHRoZSBmb2xsb3dpbmcgdGVzdHMKKyAgICAvLyB3aGV0aGVyIHRoZSB0d28gbGluZXMgYXJlIGFwcHJveGltYXRlbHkgcGFyYWxsZWwuCisgICAgaWYoaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGRldCwgU2NhbGFyKDEpKSkKKyAgICB7ICAgLy8gc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSB0d28gbGluZXMgYXJlIGFwcHJveGltYXRlbHkgcGFyYWxsZWwuIFBpY2sgYW55IHBvaW50IG9uIHRoZSBmaXJzdCBsaW5lLgorICAgICAgICBpZihpbnRlcm5hbDo6YWJzKGNvZWZmcygpLmNvZWZmKDEpKT5pbnRlcm5hbDo6YWJzKGNvZWZmcygpLmNvZWZmKDApKSkKKyAgICAgICAgICAgIHJldHVybiBWZWN0b3JUeXBlKGNvZWZmcygpLmNvZWZmKDEpLCAtY29lZmZzKCkuY29lZmYoMikvY29lZmZzKCkuY29lZmYoMSktY29lZmZzKCkuY29lZmYoMCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gVmVjdG9yVHlwZSgtY29lZmZzKCkuY29lZmYoMikvY29lZmZzKCkuY29lZmYoMCktY29lZmZzKCkuY29lZmYoMSksIGNvZWZmcygpLmNvZWZmKDApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvLyBnZW5lcmFsIGNhc2UKKyAgICAgICAgU2NhbGFyIGludmRldCA9IFNjYWxhcigxKSAvIGRldDsKKyAgICAgICAgcmV0dXJuIFZlY3RvclR5cGUoaW52ZGV0Kihjb2VmZnMoKS5jb2VmZigxKSpvdGhlci5jb2VmZnMoKS5jb2VmZigyKS1vdGhlci5jb2VmZnMoKS5jb2VmZigxKSpjb2VmZnMoKS5jb2VmZigyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludmRldCoob3RoZXIuY29lZmZzKCkuY29lZmYoMCkqY29lZmZzKCkuY29lZmYoMiktY29lZmZzKCkuY29lZmYoMCkqb3RoZXIuY29lZmZzKCkuY29lZmYoMikpKTsKKyAgICB9CisgIH0KKworICAvKiogQXBwbGllcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IFxhIG1hdCB0byBcYyAqdGhpcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqCisgICAgKiBccGFyYW0gbWF0IHRoZSBEaW0geCBEaW0gdHJhbnNmb3JtYXRpb24gbWF0cml4CisgICAgKiBccGFyYW0gdHJhaXRzIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggXGEgbWF0IHJlcHJlc2VudHMgYW4gI0lzb21ldHJ5CisgICAgKiAgICAgICAgICAgICAgIG9yIGEgbW9yZSBnZW5lcmljICNBZmZpbmUgdHJhbnNmb3JtYXRpb24uIFRoZSBkZWZhdWx0IGlzICNBZmZpbmUuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4KKyAgaW5saW5lIEh5cGVycGxhbmUmIHRyYW5zZm9ybShjb25zdCBNYXRyaXhCYXNlPFhwclR5cGU+JiBtYXQsIFRyYW5zZm9ybVRyYWl0cyB0cmFpdHMgPSBBZmZpbmUpCisgIHsKKyAgICBpZiAodHJhaXRzPT1BZmZpbmUpCisgICAgICBub3JtYWwoKSA9IG1hdC5pbnZlcnNlKCkudHJhbnNwb3NlKCkgKiBub3JtYWwoKTsKKyAgICBlbHNlIGlmICh0cmFpdHM9PUlzb21ldHJ5KQorICAgICAgbm9ybWFsKCkgPSBtYXQgKiBub3JtYWwoKTsKKyAgICBlbHNlCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KDAgJiYgImludmFsaWQgdHJhaXRzIHZhbHVlIGluIEh5cGVycGxhbmU6OnRyYW5zZm9ybSgpIik7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8qKiBBcHBsaWVzIHRoZSB0cmFuc2Zvcm1hdGlvbiBcYSB0IHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICoKKyAgICAqIFxwYXJhbSB0IHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBkaW1lbnNpb24gRGltCisgICAgKiBccGFyYW0gdHJhaXRzIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB0cmFuc2Zvcm1hdGlvbiBcYSB0IHJlcHJlc2VudHMgYW4gI0lzb21ldHJ5CisgICAgKiAgICAgICAgICAgICAgIG9yIGEgbW9yZSBnZW5lcmljICNBZmZpbmUgdHJhbnNmb3JtYXRpb24uIFRoZSBkZWZhdWx0IGlzICNBZmZpbmUuCisgICAgKiAgICAgICAgICAgICAgIE90aGVyIGtpbmQgb2YgdHJhbnNmb3JtYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICovCisgIHRlbXBsYXRlPGludCBUck9wdGlvbnM+CisgIGlubGluZSBIeXBlcnBsYW5lJiB0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtPFNjYWxhcixBbWJpZW50RGltQXRDb21waWxlVGltZSxBZmZpbmUsVHJPcHRpb25zPiYgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtVHJhaXRzIHRyYWl0cyA9IEFmZmluZSkKKyAgeworICAgIHRyYW5zZm9ybSh0LmxpbmVhcigpLCB0cmFpdHMpOworICAgIG9mZnNldCgpIC09IG5vcm1hbCgpLmRvdCh0LnRyYW5zbGF0aW9uKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8qKiBccmV0dXJucyBcYyAqdGhpcyB3aXRoIHNjYWxhciB0eXBlIGNhc3RlZCB0byBcYSBOZXdTY2FsYXJUeXBlCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIFxhIE5ld1NjYWxhclR5cGUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2NhbGFyIHR5cGUgb2YgXGMgKnRoaXMKKyAgICAqIHRoZW4gdGhpcyBmdW5jdGlvbiBzbWFydGx5IHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3U2NhbGFyVHlwZT4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPEh5cGVycGxhbmUsCisgICAgICAgICAgIEh5cGVycGxhbmU8TmV3U2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZSxPcHRpb25zPiA+Ojp0eXBlIGNhc3QoKSBjb25zdAorICB7CisgICAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPEh5cGVycGxhbmUsCisgICAgICAgICAgICAgICAgICAgIEh5cGVycGxhbmU8TmV3U2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZSxPcHRpb25zPiA+Ojp0eXBlKCp0aGlzKTsKKyAgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIHR5cGUgY29udmVyc2lvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhclR5cGUsaW50IE90aGVyT3B0aW9ucz4KKyAgaW5saW5lIGV4cGxpY2l0IEh5cGVycGxhbmUoY29uc3QgSHlwZXJwbGFuZTxPdGhlclNjYWxhclR5cGUsQW1iaWVudERpbUF0Q29tcGlsZVRpbWUsT3RoZXJPcHRpb25zPiYgb3RoZXIpCisgIHsgbV9jb2VmZnMgPSBvdGhlci5jb2VmZnMoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgdGVtcGxhdGU8aW50IE90aGVyT3B0aW9ucz4KKyAgYm9vbCBpc0FwcHJveChjb25zdCBIeXBlcnBsYW5lPFNjYWxhcixBbWJpZW50RGltQXRDb21waWxlVGltZSxPdGhlck9wdGlvbnM+JiBvdGhlciwgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3QKKyAgeyByZXR1cm4gbV9jb2VmZnMuaXNBcHByb3gob3RoZXIubV9jb2VmZnMsIHByZWMpOyB9CisKK3Byb3RlY3RlZDoKKworICBDb2VmZmljaWVudHMgbV9jb2VmZnM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0hZUEVSUExBTkVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0dlb21ldHJ5L09ydGhvTWV0aG9kcy5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L09ydGhvTWV0aG9kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYWQ1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvR2VvbWV0cnkvT3J0aG9NZXRob2RzLmgKQEAgLTAsMCArMSwyMTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fT1JUSE9NRVRIT0RTX0gKKyNkZWZpbmUgRUlHRU5fT1JUSE9NRVRIT0RTX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlCisgICoKKyAgKiBccmV0dXJucyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIEhlcmUgaXMgYSB2ZXJ5IGdvb2QgZXhwbGFuYXRpb24gb2YgY3Jvc3MtcHJvZHVjdDogaHR0cDovL3hrY2QuY29tLzE5OS8KKyAgKiBcc2EgTWF0cml4QmFzZTo6Y3Jvc3MzKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6dGVtcGxhdGUgY3Jvc3NfcHJvZHVjdF9yZXR1cm5fdHlwZTxPdGhlckRlcml2ZWQ+Ojp0eXBlCitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjcm9zcyhjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKERlcml2ZWQsMykKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShPdGhlckRlcml2ZWQsMykKKworICAvLyBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW4gZXhwcmVzc2lvbiBoZXJlIHNpbmNlIHRoZSBjb21waWxlcgorICAvLyBvcHRpbWl6ZSBzdWNoIGEgc21hbGwgdGVtcG9yYXJ5IHZlcnkgd2VsbCAoZXZlbiB3aXRoaW4gYSBjb21wbGV4IGV4cHJlc3Npb24pCisgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8RGVyaXZlZCwyPjo6dHlwZSBsaHMoZGVyaXZlZCgpKTsKKyAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxPdGhlckRlcml2ZWQsMj46OnR5cGUgcmhzKG90aGVyLmRlcml2ZWQoKSk7CisgIHJldHVybiB0eXBlbmFtZSBjcm9zc19wcm9kdWN0X3JldHVybl90eXBlPE90aGVyRGVyaXZlZD46OnR5cGUoCisgICAgaW50ZXJuYWw6OmNvbmoobGhzLmNvZWZmKDEpICogcmhzLmNvZWZmKDIpIC0gbGhzLmNvZWZmKDIpICogcmhzLmNvZWZmKDEpKSwKKyAgICBpbnRlcm5hbDo6Y29uaihsaHMuY29lZmYoMikgKiByaHMuY29lZmYoMCkgLSBsaHMuY29lZmYoMCkgKiByaHMuY29lZmYoMikpLAorICAgIGludGVybmFsOjpjb25qKGxocy5jb2VmZigwKSAqIHJocy5jb2VmZigxKSAtIGxocy5jb2VmZigxKSAqIHJocy5jb2VmZigwKSkKKyAgKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8IGludCBBcmNoLHR5cGVuYW1lIFZlY3Rvckxocyx0eXBlbmFtZSBWZWN0b3JSaHMsCisgICAgICAgICAgdHlwZW5hbWUgU2NhbGFyID0gdHlwZW5hbWUgVmVjdG9yTGhzOjpTY2FsYXIsCisgICAgICAgICAgYm9vbCBWZWN0b3JpemFibGUgPSBib29sKChWZWN0b3JMaHM6OkZsYWdzJlZlY3RvclJoczo6RmxhZ3MpJlBhY2tldEFjY2Vzc0JpdCk+CitzdHJ1Y3QgY3Jvc3MzX2ltcGwgeworICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZTxWZWN0b3JMaHM+Ojp0eXBlCisgIHJ1bihjb25zdCBWZWN0b3JMaHMmIGxocywgY29uc3QgVmVjdG9yUmhzJiByaHMpCisgIHsKKyAgICByZXR1cm4gdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlPFZlY3Rvckxocz46OnR5cGUoCisgICAgICBpbnRlcm5hbDo6Y29uaihsaHMuY29lZmYoMSkgKiByaHMuY29lZmYoMikgLSBsaHMuY29lZmYoMikgKiByaHMuY29lZmYoMSkpLAorICAgICAgaW50ZXJuYWw6OmNvbmoobGhzLmNvZWZmKDIpICogcmhzLmNvZWZmKDApIC0gbGhzLmNvZWZmKDApICogcmhzLmNvZWZmKDIpKSwKKyAgICAgIGludGVybmFsOjpjb25qKGxocy5jb2VmZigwKSAqIHJocy5jb2VmZigxKSAtIGxocy5jb2VmZigxKSAqIHJocy5jb2VmZigwKSksCisgICAgICAwCisgICAgKTsKKyAgfQorfTsKKworfQorCisvKiogXGdlb21ldHJ5X21vZHVsZQorICAqCisgICogXHJldHVybnMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyIHVzaW5nIG9ubHkgdGhlIHgsIHksIGFuZCB6IGNvZWZmaWNpZW50cworICAqCisgICogVGhlIHNpemUgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyIG11c3QgYmUgZm91ci4gVGhpcyBmdW5jdGlvbiBpcyBlc3BlY2lhbGx5IHVzZWZ1bAorICAqIHdoZW4gdXNpbmcgNEQgdmVjdG9ycyBpbnN0ZWFkIG9mIDNEIG9uZXMgdG8gZ2V0IGFkdmFudGFnZSBvZiBTU0UvQWx0aVZlYyB2ZWN0b3JpemF0aW9uLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmNyb3NzKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3QKK01hdHJpeEJhc2U8RGVyaXZlZD46OmNyb3NzMyhjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKERlcml2ZWQsNCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShPdGhlckRlcml2ZWQsNCkKKworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8RGVyaXZlZCwyPjo6dHlwZSBEZXJpdmVkTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8T3RoZXJEZXJpdmVkLDI+Ojp0eXBlIE90aGVyRGVyaXZlZE5lc3RlZDsKKyAgY29uc3QgRGVyaXZlZE5lc3RlZCBsaHMoZGVyaXZlZCgpKTsKKyAgY29uc3QgT3RoZXJEZXJpdmVkTmVzdGVkIHJocyhvdGhlci5kZXJpdmVkKCkpOworCisgIHJldHVybiBpbnRlcm5hbDo6Y3Jvc3MzX2ltcGw8QXJjaGl0ZWN0dXJlOjpUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJpdmVkTmVzdGVkPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyaXZlZE5lc3RlZD46OnR5cGU+OjpydW4obGhzLHJocyk7Cit9CisKKy8qKiBccmV0dXJucyBhIG1hdHJpeCBleHByZXNzaW9uIG9mIHRoZSBjcm9zcyBwcm9kdWN0IG9mIGVhY2ggY29sdW1uIG9yIHJvdworICAqIG9mIHRoZSByZWZlcmVuY2VkIGV4cHJlc3Npb24gd2l0aCB0aGUgXGEgb3RoZXIgdmVjdG9yLgorICAqCisgICogVGhlIHJlZmVyZW5jZWQgbWF0cml4IG11c3QgaGF2ZSBvbmUgZGltZW5zaW9uIGVxdWFsIHRvIDMuCisgICogVGhlIHJlc3VsdCBtYXRyaXggaGFzIHRoZSBzYW1lIGRpbWVuc2lvbnMgdGhhbiB0aGUgcmVmZXJlbmNlZCBvbmUuCisgICoKKyAgKiBcZ2VvbWV0cnlfbW9kdWxlCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6Y3Jvc3MoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsIGludCBEaXJlY3Rpb24+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Citjb25zdCB0eXBlbmFtZSBWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6Q3Jvc3NSZXR1cm5UeXBlCitWZWN0b3J3aXNlT3A8RXhwcmVzc2lvblR5cGUsRGlyZWN0aW9uPjo6Y3Jvc3MoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfU1BFQ0lGSUNfU0laRShPdGhlckRlcml2ZWQsMykKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKworICBDcm9zc1JldHVyblR5cGUgcmVzKF9leHByZXNzaW9uKCkucm93cygpLF9leHByZXNzaW9uKCkuY29scygpKTsKKyAgaWYoRGlyZWN0aW9uPT1WZXJ0aWNhbCkKKyAgeworICAgIGVpZ2VuX2Fzc2VydChDcm9zc1JldHVyblR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT0zICYmICJ0aGUgbWF0cml4IG11c3QgaGF2ZSBleGFjdGx5IDMgcm93cyIpOworICAgIHJlcy5yb3coMCkgPSAoX2V4cHJlc3Npb24oKS5yb3coMSkgKiBvdGhlci5jb2VmZigyKSAtIF9leHByZXNzaW9uKCkucm93KDIpICogb3RoZXIuY29lZmYoMSkpLmNvbmp1Z2F0ZSgpOworICAgIHJlcy5yb3coMSkgPSAoX2V4cHJlc3Npb24oKS5yb3coMikgKiBvdGhlci5jb2VmZigwKSAtIF9leHByZXNzaW9uKCkucm93KDApICogb3RoZXIuY29lZmYoMikpLmNvbmp1Z2F0ZSgpOworICAgIHJlcy5yb3coMikgPSAoX2V4cHJlc3Npb24oKS5yb3coMCkgKiBvdGhlci5jb2VmZigxKSAtIF9leHByZXNzaW9uKCkucm93KDEpICogb3RoZXIuY29lZmYoMCkpLmNvbmp1Z2F0ZSgpOworICB9CisgIGVsc2UKKyAgeworICAgIGVpZ2VuX2Fzc2VydChDcm9zc1JldHVyblR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT0zICYmICJ0aGUgbWF0cml4IG11c3QgaGF2ZSBleGFjdGx5IDMgY29sdW1ucyIpOworICAgIHJlcy5jb2woMCkgPSAoX2V4cHJlc3Npb24oKS5jb2woMSkgKiBvdGhlci5jb2VmZigyKSAtIF9leHByZXNzaW9uKCkuY29sKDIpICogb3RoZXIuY29lZmYoMSkpLmNvbmp1Z2F0ZSgpOworICAgIHJlcy5jb2woMSkgPSAoX2V4cHJlc3Npb24oKS5jb2woMikgKiBvdGhlci5jb2VmZigwKSAtIF9leHByZXNzaW9uKCkuY29sKDApICogb3RoZXIuY29lZmYoMikpLmNvbmp1Z2F0ZSgpOworICAgIHJlcy5jb2woMikgPSAoX2V4cHJlc3Npb24oKS5jb2woMCkgKiBvdGhlci5jb2VmZigxKSAtIF9leHByZXNzaW9uKCkuY29sKDEpICogb3RoZXIuY29lZmYoMCkpLmNvbmp1Z2F0ZSgpOworICB9CisgIHJldHVybiByZXM7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIGludCBTaXplID0gRGVyaXZlZDo6U2l6ZUF0Q29tcGlsZVRpbWU+CitzdHJ1Y3QgdW5pdE9ydGhvZ29uYWxfc2VsZWN0b3IKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBwbGFpbl9tYXRyaXhfdHlwZTxEZXJpdmVkPjo6dHlwZSBWZWN0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IEluZGV4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwxPiBWZWN0b3IyOworICBzdGF0aWMgaW5saW5lIFZlY3RvclR5cGUgcnVuKGNvbnN0IERlcml2ZWQmIHNyYykKKyAgeworICAgIFZlY3RvclR5cGUgcGVycCA9IFZlY3RvclR5cGU6Olplcm8oc3JjLnNpemUoKSk7CisgICAgSW5kZXggbWF4aSA9IDA7CisgICAgSW5kZXggc25kaSA9IDA7CisgICAgc3JjLmN3aXNlQWJzKCkubWF4Q29lZmYoJm1heGkpOworICAgIGlmIChtYXhpPT0wKQorICAgICAgc25kaSA9IDE7CisgICAgUmVhbFNjYWxhciBpbnZubSA9IFJlYWxTY2FsYXIoMSkvKFZlY3RvcjIoKSA8PCBzcmMuY29lZmYoc25kaSksc3JjLmNvZWZmKG1heGkpKS5maW5pc2hlZCgpLm5vcm0oKTsKKyAgICBwZXJwLmNvZWZmUmVmKG1heGkpID0gLWNvbmooc3JjLmNvZWZmKHNuZGkpKSAqIGludm5tOworICAgIHBlcnAuY29lZmZSZWYoc25kaSkgPSAgY29uaihzcmMuY29lZmYobWF4aSkpICogaW52bm07CisKKyAgICByZXR1cm4gcGVycDsKKyAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgdW5pdE9ydGhvZ29uYWxfc2VsZWN0b3I8RGVyaXZlZCwzPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHBsYWluX21hdHJpeF90eXBlPERlcml2ZWQ+Ojp0eXBlIFZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHN0YXRpYyBpbmxpbmUgVmVjdG9yVHlwZSBydW4oY29uc3QgRGVyaXZlZCYgc3JjKQorICB7CisgICAgVmVjdG9yVHlwZSBwZXJwOworICAgIC8qIExldCB1cyBjb21wdXRlIHRoZSBjcm9zc2VkIHByb2R1Y3Qgb2YgKnRoaXMgd2l0aCBhIHZlY3RvcgorICAgICAqIHRoYXQgaXMgbm90IHRvbyBjbG9zZSB0byBiZWluZyBjb2xpbmVhciB0byAqdGhpcy4KKyAgICAgKi8KKworICAgIC8qIHVubGVzcyB0aGUgeCBhbmQgeSBjb29yZHMgYXJlIGJvdGggY2xvc2UgdG8gemVybywgd2UgY2FuCisgICAgICogc2ltcGx5IHRha2UgKCAteSwgeCwgMCApIGFuZCBub3JtYWxpemUgaXQuCisgICAgICovCisgICAgaWYoKCFpc011Y2hTbWFsbGVyVGhhbihzcmMueCgpLCBzcmMueigpKSkKKyAgICB8fCAoIWlzTXVjaFNtYWxsZXJUaGFuKHNyYy55KCksIHNyYy56KCkpKSkKKyAgICB7CisgICAgICBSZWFsU2NhbGFyIGludm5tID0gUmVhbFNjYWxhcigxKS9zcmMudGVtcGxhdGUgaGVhZDwyPigpLm5vcm0oKTsKKyAgICAgIHBlcnAuY29lZmZSZWYoMCkgPSAtY29uaihzcmMueSgpKSppbnZubTsKKyAgICAgIHBlcnAuY29lZmZSZWYoMSkgPSBjb25qKHNyYy54KCkpKmludm5tOworICAgICAgcGVycC5jb2VmZlJlZigyKSA9IDA7CisgICAgfQorICAgIC8qIGlmIGJvdGggeCBhbmQgeSBhcmUgY2xvc2UgdG8gemVybywgdGhlbiB0aGUgdmVjdG9yIGlzIGNsb3NlCisgICAgICogdG8gdGhlIHotYXhpcywgc28gaXQncyBmYXIgZnJvbSBjb2xpbmVhciB0byB0aGUgeC1heGlzIGZvciBpbnN0YW5jZS4KKyAgICAgKiBTbyB3ZSB0YWtlIHRoZSBjcm9zc2VkIHByb2R1Y3Qgd2l0aCAoMSwwLDApIGFuZCBub3JtYWxpemUgaXQuCisgICAgICovCisgICAgZWxzZQorICAgIHsKKyAgICAgIFJlYWxTY2FsYXIgaW52bm0gPSBSZWFsU2NhbGFyKDEpL3NyYy50ZW1wbGF0ZSB0YWlsPDI+KCkubm9ybSgpOworICAgICAgcGVycC5jb2VmZlJlZigwKSA9IDA7CisgICAgICBwZXJwLmNvZWZmUmVmKDEpID0gLWNvbmooc3JjLnooKSkqaW52bm07CisgICAgICBwZXJwLmNvZWZmUmVmKDIpID0gY29uaihzcmMueSgpKSppbnZubTsKKyAgICB9CisKKyAgICByZXR1cm4gcGVycDsKKyAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgdW5pdE9ydGhvZ29uYWxfc2VsZWN0b3I8RGVyaXZlZCwyPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHBsYWluX21hdHJpeF90eXBlPERlcml2ZWQ+Ojp0eXBlIFZlY3RvclR5cGU7CisgIHN0YXRpYyBpbmxpbmUgVmVjdG9yVHlwZSBydW4oY29uc3QgRGVyaXZlZCYgc3JjKQorICB7IHJldHVybiBWZWN0b3JUeXBlKC1jb25qKHNyYy55KCkpLCBjb25qKHNyYy54KCkpKS5ub3JtYWxpemVkKCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXHJldHVybnMgYSB1bml0IHZlY3RvciB3aGljaCBpcyBvcnRob2dvbmFsIHRvIFxjICp0aGlzCisgICoKKyAgKiBUaGUgc2l6ZSBvZiBcYyAqdGhpcyBtdXN0IGJlIGF0IGxlYXN0IDIuIElmIHRoZSBzaXplIGlzIGV4YWN0bHkgMiwKKyAgKiB0aGVuIHRoZSByZXR1cm5lZCB2ZWN0b3IgaXMgYSBjb3VudGVyIGNsb2NrIHdpc2Ugcm90YXRpb24gb2YgXGMgKnRoaXMsIGkuZS4sICgteSx4KS5ub3JtYWxpemVkKCkuCisgICoKKyAgKiBcc2EgY3Jvc3MoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3R5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0CitNYXRyaXhCYXNlPERlcml2ZWQ+Ojp1bml0T3J0aG9nb25hbCgpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoRGVyaXZlZCkKKyAgcmV0dXJuIGludGVybmFsOjp1bml0T3J0aG9nb25hbF9zZWxlY3RvcjxEZXJpdmVkPjo6cnVuKGRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fT1JUSE9NRVRIT0RTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9QYXJhbWV0cml6ZWRMaW5lLmggYi9FaWdlbi9zcmMvR2VvbWV0cnkvUGFyYW1ldHJpemVkTGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOWE5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvR2VvbWV0cnkvUGFyYW1ldHJpemVkTGluZS5oCkBAIC0wLDAgKzEsMTk1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUEFSQU1FVFJJWkVETElORV9ICisjZGVmaW5lIEVJR0VOX1BBUkFNRVRSSVpFRExJTkVfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxnZW9tZXRyeV9tb2R1bGUgXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgUGFyYW1ldHJpemVkTGluZQorICAqCisgICogXGJyaWVmIEEgcGFyYW1ldHJpemVkIGxpbmUKKyAgKgorICAqIEEgcGFyYW1ldHJpemVkIGxpbmUgaXMgZGVmaW5lZCBieSBhbiBvcmlnaW4gcG9pbnQgXGYkIFxtYXRoYmZ7b30gXGYkIGFuZCBhIHVuaXQKKyAgKiBkaXJlY3Rpb24gdmVjdG9yIFxmJCBcbWF0aGJme2R9IFxmJCBzdWNoIHRoYXQgdGhlIGxpbmUgY29ycmVzcG9uZHMgdG8KKyAgKiB0aGUgc2V0IFxmJCBsKHQpID0gXG1hdGhiZntvfSArIHQgXG1hdGhiZntkfSBcZiQsIFxmJCB0IFxpbiBcbWF0aGJme1J9IFxmJC4KKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBfQW1iaWVudERpbSB0aGUgZGltZW5zaW9uIG9mIHRoZSBhbWJpZW50IHNwYWNlLCBjYW4gYmUgYSBjb21waWxlIHRpbWUgdmFsdWUgb3IgRHluYW1pYy4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0sIGludCBfT3B0aW9ucz4KK2NsYXNzIFBhcmFtZXRyaXplZExpbmUKK3sKK3B1YmxpYzoKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRl9WRUNUT1JJWkFCTEVfRklYRURfU0laRShfU2NhbGFyLF9BbWJpZW50RGltKQorICBlbnVtIHsKKyAgICBBbWJpZW50RGltQXRDb21waWxlVGltZSA9IF9BbWJpZW50RGltLAorICAgIE9wdGlvbnMgPSBfT3B0aW9ucworICB9OworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEFtYmllbnREaW1BdENvbXBpbGVUaW1lLDEsT3B0aW9ucz4gVmVjdG9yVHlwZTsKKworICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRob3V0IGluaXRpYWxpemF0aW9uICovCisgIGlubGluZSBleHBsaWNpdCBQYXJhbWV0cml6ZWRMaW5lKCkge30KKyAgCisgIHRlbXBsYXRlPGludCBPdGhlck9wdGlvbnM+CisgIFBhcmFtZXRyaXplZExpbmUoY29uc3QgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsQW1iaWVudERpbUF0Q29tcGlsZVRpbWUsT3RoZXJPcHRpb25zPiYgb3RoZXIpCisgICA6IG1fb3JpZ2luKG90aGVyLm9yaWdpbigpKSwgbV9kaXJlY3Rpb24ob3RoZXIuZGlyZWN0aW9uKCkpCisgIHt9CisKKyAgLyoqIENvbnN0cnVjdHMgYSBkeW5hbWljLXNpemUgbGluZSB3aXRoIFxhIF9kaW0gdGhlIGRpbWVuc2lvbgorICAgICogb2YgdGhlIGFtYmllbnQgc3BhY2UgKi8KKyAgaW5saW5lIGV4cGxpY2l0IFBhcmFtZXRyaXplZExpbmUoSW5kZXggX2RpbSkgOiBtX29yaWdpbihfZGltKSwgbV9kaXJlY3Rpb24oX2RpbSkge30KKworICAvKiogSW5pdGlhbGl6ZXMgYSBwYXJhbWV0cml6ZWQgbGluZSBvZiBkaXJlY3Rpb24gXGEgZGlyZWN0aW9uIGFuZCBvcmlnaW4gXGEgb3JpZ2luLgorICAgICogXHdhcm5pbmcgdGhlIHZlY3RvciBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkLgorICAgICovCisgIFBhcmFtZXRyaXplZExpbmUoY29uc3QgVmVjdG9yVHlwZSYgb3JpZ2luLCBjb25zdCBWZWN0b3JUeXBlJiBkaXJlY3Rpb24pCisgICAgOiBtX29yaWdpbihvcmlnaW4pLCBtX2RpcmVjdGlvbihkaXJlY3Rpb24pIHt9CisKKyAgdGVtcGxhdGUgPGludCBPdGhlck9wdGlvbnM+CisgIGV4cGxpY2l0IFBhcmFtZXRyaXplZExpbmUoY29uc3QgSHlwZXJwbGFuZTxfU2NhbGFyLCBfQW1iaWVudERpbSwgT3RoZXJPcHRpb25zPiYgaHlwZXJwbGFuZSk7CisKKyAgLyoqIENvbnN0cnVjdHMgYSBwYXJhbWV0cml6ZWQgbGluZSBnb2luZyBmcm9tIFxhIHAwIHRvIFxhIHAxLiAqLworICBzdGF0aWMgaW5saW5lIFBhcmFtZXRyaXplZExpbmUgVGhyb3VnaChjb25zdCBWZWN0b3JUeXBlJiBwMCwgY29uc3QgVmVjdG9yVHlwZSYgcDEpCisgIHsgcmV0dXJuIFBhcmFtZXRyaXplZExpbmUocDAsIChwMS1wMCkubm9ybWFsaXplZCgpKTsgfQorCisgIH5QYXJhbWV0cml6ZWRMaW5lKCkge30KKworICAvKiogXHJldHVybnMgdGhlIGRpbWVuc2lvbiBpbiB3aGljaCB0aGUgbGluZSBob2xkcyAqLworICBpbmxpbmUgSW5kZXggZGltKCkgY29uc3QgeyByZXR1cm4gbV9kaXJlY3Rpb24uc2l6ZSgpOyB9CisKKyAgY29uc3QgVmVjdG9yVHlwZSYgb3JpZ2luKCkgY29uc3QgeyByZXR1cm4gbV9vcmlnaW47IH0KKyAgVmVjdG9yVHlwZSYgb3JpZ2luKCkgeyByZXR1cm4gbV9vcmlnaW47IH0KKworICBjb25zdCBWZWN0b3JUeXBlJiBkaXJlY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX2RpcmVjdGlvbjsgfQorICBWZWN0b3JUeXBlJiBkaXJlY3Rpb24oKSB7IHJldHVybiBtX2RpcmVjdGlvbjsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgc3F1YXJlZCBkaXN0YW5jZSBvZiBhIHBvaW50IFxhIHAgdG8gaXRzIHByb2plY3Rpb24gb250byB0aGUgbGluZSBcYyAqdGhpcy4KKyAgICAqIFxzYSBkaXN0YW5jZSgpCisgICAgKi8KKyAgUmVhbFNjYWxhciBzcXVhcmVkRGlzdGFuY2UoY29uc3QgVmVjdG9yVHlwZSYgcCkgY29uc3QKKyAgeworICAgIFZlY3RvclR5cGUgZGlmZiA9IHAgLSBvcmlnaW4oKTsKKyAgICByZXR1cm4gKGRpZmYgLSBkaXJlY3Rpb24oKS5kb3QoZGlmZikgKiBkaXJlY3Rpb24oKSkuc3F1YXJlZE5vcm0oKTsKKyAgfQorICAvKiogXHJldHVybnMgdGhlIGRpc3RhbmNlIG9mIGEgcG9pbnQgXGEgcCB0byBpdHMgcHJvamVjdGlvbiBvbnRvIHRoZSBsaW5lIFxjICp0aGlzLgorICAgICogXHNhIHNxdWFyZWREaXN0YW5jZSgpCisgICAgKi8KKyAgUmVhbFNjYWxhciBkaXN0YW5jZShjb25zdCBWZWN0b3JUeXBlJiBwKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6c3FydChzcXVhcmVkRGlzdGFuY2UocCkpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBwcm9qZWN0aW9uIG9mIGEgcG9pbnQgXGEgcCBvbnRvIHRoZSBsaW5lIFxjICp0aGlzLiAqLworICBWZWN0b3JUeXBlIHByb2plY3Rpb24oY29uc3QgVmVjdG9yVHlwZSYgcCkgY29uc3QKKyAgeyByZXR1cm4gb3JpZ2luKCkgKyBkaXJlY3Rpb24oKS5kb3QocC1vcmlnaW4oKSkgKiBkaXJlY3Rpb24oKTsgfQorCisgIFZlY3RvclR5cGUgcG9pbnRBdCggU2NhbGFyIHQgKSBjb25zdDsKKyAgCisgIHRlbXBsYXRlIDxpbnQgT3RoZXJPcHRpb25zPgorICBTY2FsYXIgaW50ZXJzZWN0aW9uUGFyYW1ldGVyKGNvbnN0IEh5cGVycGxhbmU8X1NjYWxhciwgX0FtYmllbnREaW0sIE90aGVyT3B0aW9ucz4mIGh5cGVycGxhbmUpIGNvbnN0OworIAorICB0ZW1wbGF0ZSA8aW50IE90aGVyT3B0aW9ucz4KKyAgU2NhbGFyIGludGVyc2VjdGlvbihjb25zdCBIeXBlcnBsYW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLCBPdGhlck9wdGlvbnM+JiBoeXBlcnBsYW5lKSBjb25zdDsKKyAgCisgIHRlbXBsYXRlIDxpbnQgT3RoZXJPcHRpb25zPgorICBWZWN0b3JUeXBlIGludGVyc2VjdGlvblBvaW50KGNvbnN0IEh5cGVycGxhbmU8X1NjYWxhciwgX0FtYmllbnREaW0sIE90aGVyT3B0aW9ucz4mIGh5cGVycGxhbmUpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyBcYyAqdGhpcyB3aXRoIHNjYWxhciB0eXBlIGNhc3RlZCB0byBcYSBOZXdTY2FsYXJUeXBlCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIFxhIE5ld1NjYWxhclR5cGUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2NhbGFyIHR5cGUgb2YgXGMgKnRoaXMKKyAgICAqIHRoZW4gdGhpcyBmdW5jdGlvbiBzbWFydGx5IHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3U2NhbGFyVHlwZT4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPFBhcmFtZXRyaXplZExpbmUsCisgICAgICAgICAgIFBhcmFtZXRyaXplZExpbmU8TmV3U2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZSxPcHRpb25zPiA+Ojp0eXBlIGNhc3QoKSBjb25zdAorICB7CisgICAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPFBhcmFtZXRyaXplZExpbmUsCisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRyaXplZExpbmU8TmV3U2NhbGFyVHlwZSxBbWJpZW50RGltQXRDb21waWxlVGltZSxPcHRpb25zPiA+Ojp0eXBlKCp0aGlzKTsKKyAgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIHR5cGUgY29udmVyc2lvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhclR5cGUsaW50IE90aGVyT3B0aW9ucz4KKyAgaW5saW5lIGV4cGxpY2l0IFBhcmFtZXRyaXplZExpbmUoY29uc3QgUGFyYW1ldHJpemVkTGluZTxPdGhlclNjYWxhclR5cGUsQW1iaWVudERpbUF0Q29tcGlsZVRpbWUsT3RoZXJPcHRpb25zPiYgb3RoZXIpCisgIHsKKyAgICBtX29yaWdpbiA9IG90aGVyLm9yaWdpbigpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICAgIG1fZGlyZWN0aW9uID0gb3RoZXIuZGlyZWN0aW9uKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgIH0KKworICAvKiogXHJldHVybnMgXGMgdHJ1ZSBpZiBcYyAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIFxhIG90aGVyLCB3aXRoaW4gdGhlIHByZWNpc2lvbgorICAgICogZGV0ZXJtaW5lZCBieSBcYSBwcmVjLgorICAgICoKKyAgICAqIFxzYSBNYXRyaXhCYXNlOjppc0FwcHJveCgpICovCisgIGJvb2wgaXNBcHByb3goY29uc3QgUGFyYW1ldHJpemVkTGluZSYgb3RoZXIsIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgIHsgcmV0dXJuIG1fb3JpZ2luLmlzQXBwcm94KG90aGVyLm1fb3JpZ2luLCBwcmVjKSAmJiBtX2RpcmVjdGlvbi5pc0FwcHJveChvdGhlci5tX2RpcmVjdGlvbiwgcHJlYyk7IH0KKworcHJvdGVjdGVkOgorCisgIFZlY3RvclR5cGUgbV9vcmlnaW4sIG1fZGlyZWN0aW9uOworfTsKKworLyoqIENvbnN0cnVjdHMgYSBwYXJhbWV0cml6ZWQgbGluZSBmcm9tIGEgMkQgaHlwZXJwbGFuZQorICAqCisgICogXHdhcm5pbmcgdGhlIGFtYmllbnQgc3BhY2UgbXVzdCBoYXZlIGRpbWVuc2lvbiAyIHN1Y2ggdGhhdCB0aGUgaHlwZXJwbGFuZSBhY3R1YWxseSBkZXNjcmliZXMgYSBsaW5lCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9BbWJpZW50RGltLCBpbnQgX09wdGlvbnM+Cit0ZW1wbGF0ZSA8aW50IE90aGVyT3B0aW9ucz4KK2lubGluZSBQYXJhbWV0cml6ZWRMaW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLF9PcHRpb25zPjo6UGFyYW1ldHJpemVkTGluZShjb25zdCBIeXBlcnBsYW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLE90aGVyT3B0aW9ucz4mIGh5cGVycGxhbmUpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoVmVjdG9yVHlwZSwgMikKKyAgZGlyZWN0aW9uKCkgPSBoeXBlcnBsYW5lLm5vcm1hbCgpLnVuaXRPcnRob2dvbmFsKCk7CisgIG9yaWdpbigpID0gLWh5cGVycGxhbmUubm9ybWFsKCkqaHlwZXJwbGFuZS5vZmZzZXQoKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBwb2ludCBhdCBcYSB0IGFsb25nIHRoaXMgbGluZQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbSwgaW50IF9PcHRpb25zPgoraW5saW5lIHR5cGVuYW1lIFBhcmFtZXRyaXplZExpbmU8X1NjYWxhciwgX0FtYmllbnREaW0sX09wdGlvbnM+OjpWZWN0b3JUeXBlCitQYXJhbWV0cml6ZWRMaW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLF9PcHRpb25zPjo6cG9pbnRBdCggX1NjYWxhciB0ICkgY29uc3QKK3sKKyAgcmV0dXJuIG9yaWdpbigpICsgKGRpcmVjdGlvbigpKnQpOyAKK30KKworLyoqIFxyZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIFxjICp0aGlzIGFuZCB0aGUgZ2l2ZW4gXGEgaHlwZXJwbGFuZQorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfQW1iaWVudERpbSwgaW50IF9PcHRpb25zPgordGVtcGxhdGUgPGludCBPdGhlck9wdGlvbnM+CitpbmxpbmUgX1NjYWxhciBQYXJhbWV0cml6ZWRMaW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLF9PcHRpb25zPjo6aW50ZXJzZWN0aW9uUGFyYW1ldGVyKGNvbnN0IEh5cGVycGxhbmU8X1NjYWxhciwgX0FtYmllbnREaW0sIE90aGVyT3B0aW9ucz4mIGh5cGVycGxhbmUpIGNvbnN0Cit7CisgIHJldHVybiAtKGh5cGVycGxhbmUub2Zmc2V0KCkraHlwZXJwbGFuZS5ub3JtYWwoKS5kb3Qob3JpZ2luKCkpKQorICAgICAgICAgIC8gaHlwZXJwbGFuZS5ub3JtYWwoKS5kb3QoZGlyZWN0aW9uKCkpOworfQorCisKKy8qKiBcZGVwcmVjYXRlZCB1c2UgaW50ZXJzZWN0aW9uUGFyYW1ldGVyKCkKKyAgKiBccmV0dXJucyB0aGUgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiBcYyAqdGhpcyBhbmQgdGhlIGdpdmVuIFxhIGh5cGVycGxhbmUKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0sIGludCBfT3B0aW9ucz4KK3RlbXBsYXRlIDxpbnQgT3RoZXJPcHRpb25zPgoraW5saW5lIF9TY2FsYXIgUGFyYW1ldHJpemVkTGluZTxfU2NhbGFyLCBfQW1iaWVudERpbSxfT3B0aW9ucz46OmludGVyc2VjdGlvbihjb25zdCBIeXBlcnBsYW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLCBPdGhlck9wdGlvbnM+JiBoeXBlcnBsYW5lKSBjb25zdAoreworICByZXR1cm4gaW50ZXJzZWN0aW9uUGFyYW1ldGVyKGh5cGVycGxhbmUpOworfQorCisvKiogXHJldHVybnMgdGhlIHBvaW50IG9mIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiBcYyAqdGhpcyBhbmQgdGhlIGdpdmVuIGh5cGVycGxhbmUKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0FtYmllbnREaW0sIGludCBfT3B0aW9ucz4KK3RlbXBsYXRlIDxpbnQgT3RoZXJPcHRpb25zPgoraW5saW5lIHR5cGVuYW1lIFBhcmFtZXRyaXplZExpbmU8X1NjYWxhciwgX0FtYmllbnREaW0sX09wdGlvbnM+OjpWZWN0b3JUeXBlCitQYXJhbWV0cml6ZWRMaW5lPF9TY2FsYXIsIF9BbWJpZW50RGltLF9PcHRpb25zPjo6aW50ZXJzZWN0aW9uUG9pbnQoY29uc3QgSHlwZXJwbGFuZTxfU2NhbGFyLCBfQW1iaWVudERpbSwgT3RoZXJPcHRpb25zPiYgaHlwZXJwbGFuZSkgY29uc3QKK3sKKyAgcmV0dXJuIHBvaW50QXQoaW50ZXJzZWN0aW9uUGFyYW1ldGVyKGh5cGVycGxhbmUpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QQVJBTUVUUklaRURMSU5FX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9RdWF0ZXJuaW9uLmggYi9FaWdlbi9zcmMvR2VvbWV0cnkvUXVhdGVybmlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OTJlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvR2VvbWV0cnkvUXVhdGVybmlvbi5oCkBAIC0wLDAgKzEsNzc4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IE1hdGhpZXUgR2F1dGllciA8bWF0aGlldS5nYXV0aWVyQGNlYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUVVBVEVSTklPTl9ICisjZGVmaW5lIEVJR0VOX1FVQVRFUk5JT05fSAorbmFtZXNwYWNlIEVpZ2VuIHsgCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEZWZpbml0aW9uIG9mIFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+CisqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwKKyAgICAgICAgIGludCBPdGhlclJvd3M9T3RoZXI6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgaW50IE90aGVyQ29scz1PdGhlcjo6Q29sc0F0Q29tcGlsZVRpbWU+CitzdHJ1Y3QgcXVhdGVybmlvbmJhc2VfYXNzaWduX2ltcGw7Cit9CisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIFxjbGFzcyBRdWF0ZXJuaW9uQmFzZQorICAqIFxicmllZiBCYXNlIGNsYXNzIGZvciBxdWF0ZXJuaW9uIGV4cHJlc3Npb25zCisgICogXHRwYXJhbSBEZXJpdmVkIGRlcml2ZWQgdHlwZSAoQ1JUUCkKKyAgKiBcc2EgY2xhc3MgUXVhdGVybmlvbgorICAqLwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4KK2NsYXNzIFF1YXRlcm5pb25CYXNlIDogcHVibGljIFJvdGF0aW9uQmFzZTxEZXJpdmVkLCAzPgoreworICB0eXBlZGVmIFJvdGF0aW9uQmFzZTxEZXJpdmVkLCAzPiBCYXNlOworcHVibGljOgorICB1c2luZyBCYXNlOjpvcGVyYXRvcio7CisgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKKyAgZW51bSB7CisgICAgRmxhZ3MgPSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MKKyAgfTsKKworIC8vIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4PFNjYWxhciw0LDE+IENvZWZmaWNpZW50czsKKyAgLyoqIHRoZSB0eXBlIG9mIGEgM0QgdmVjdG9yICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7CisgIC8qKiB0aGUgZXF1aXZhbGVudCByb3RhdGlvbiBtYXRyaXggdHlwZSAqLworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICAvKiogdGhlIGVxdWl2YWxlbnQgYW5nbGUtYXhpcyB0eXBlICovCisgIHR5cGVkZWYgQW5nbGVBeGlzPFNjYWxhcj4gQW5nbGVBeGlzVHlwZTsKKworCisKKyAgLyoqIFxyZXR1cm5zIHRoZSBcYyB4IGNvZWZmaWNpZW50ICovCisgIGlubGluZSBTY2FsYXIgeCgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmRlcml2ZWQoKS5jb2VmZnMoKS5jb2VmZigwKTsgfQorICAvKiogXHJldHVybnMgdGhlIFxjIHkgY29lZmZpY2llbnQgKi8KKyAgaW5saW5lIFNjYWxhciB5KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+ZGVyaXZlZCgpLmNvZWZmcygpLmNvZWZmKDEpOyB9CisgIC8qKiBccmV0dXJucyB0aGUgXGMgeiBjb2VmZmljaWVudCAqLworICBpbmxpbmUgU2NhbGFyIHooKSBjb25zdCB7IHJldHVybiB0aGlzLT5kZXJpdmVkKCkuY29lZmZzKCkuY29lZmYoMik7IH0KKyAgLyoqIFxyZXR1cm5zIHRoZSBcYyB3IGNvZWZmaWNpZW50ICovCisgIGlubGluZSBTY2FsYXIgdygpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmRlcml2ZWQoKS5jb2VmZnMoKS5jb2VmZigzKTsgfQorCisgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgXGMgeCBjb2VmZmljaWVudCAqLworICBpbmxpbmUgU2NhbGFyJiB4KCkgeyByZXR1cm4gdGhpcy0+ZGVyaXZlZCgpLmNvZWZmcygpLmNvZWZmUmVmKDApOyB9CisgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgXGMgeSBjb2VmZmljaWVudCAqLworICBpbmxpbmUgU2NhbGFyJiB5KCkgeyByZXR1cm4gdGhpcy0+ZGVyaXZlZCgpLmNvZWZmcygpLmNvZWZmUmVmKDEpOyB9CisgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgXGMgeiBjb2VmZmljaWVudCAqLworICBpbmxpbmUgU2NhbGFyJiB6KCkgeyByZXR1cm4gdGhpcy0+ZGVyaXZlZCgpLmNvZWZmcygpLmNvZWZmUmVmKDIpOyB9CisgIC8qKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgXGMgdyBjb2VmZmljaWVudCAqLworICBpbmxpbmUgU2NhbGFyJiB3KCkgeyByZXR1cm4gdGhpcy0+ZGVyaXZlZCgpLmNvZWZmcygpLmNvZWZmUmVmKDMpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVhZC1vbmx5IHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBpbWFnaW5hcnkgcGFydCAoeCx5LHopICovCisgIGlubGluZSBjb25zdCBWZWN0b3JCbG9jazxjb25zdCBDb2VmZmljaWVudHMsMz4gdmVjKCkgY29uc3QgeyByZXR1cm4gY29lZmZzKCkudGVtcGxhdGUgaGVhZDwzPigpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIGltYWdpbmFyeSBwYXJ0ICh4LHkseikgKi8KKyAgaW5saW5lIFZlY3RvckJsb2NrPENvZWZmaWNpZW50cywzPiB2ZWMoKSB7IHJldHVybiBjb2VmZnMoKS50ZW1wbGF0ZSBoZWFkPDM+KCk7IH0KKworICAvKiogXHJldHVybnMgYSByZWFkLW9ubHkgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50cyAoeCx5LHosdykgKi8KKyAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvZWZmaWNpZW50cyYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLmNvZWZmcygpOyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgdmVjdG9yIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50cyAoeCx5LHosdykgKi8KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvZWZmaWNpZW50cyYgY29lZmZzKCkgeyByZXR1cm4gZGVyaXZlZCgpLmNvZWZmcygpOyB9CisKKyAgRUlHRU5fU1RST05HX0lOTElORSBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPiYgb3BlcmF0b3I9KGNvbnN0IFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+JiBvdGhlcik7CisgIHRlbXBsYXRlPGNsYXNzIE90aGVyRGVyaXZlZD4gRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpOworCisvLyBkaXNhYmxlZCB0aGlzIGNvcHkgb3BlcmF0b3IgYXMgaXQgaXMgZ2l2aW5nIHZlcnkgc3RyYW5nZSBjb21waWxhdGlvbiBlcnJvcnMgd2hlbiBjb21waWxpbmcKKy8vIHRlc3Rfc3RkdmVjdG9yIHdpdGggR0NDIDQuNC4yLiBUaGlzIGxvb2tzIGxpa2UgYSBHQ0MgYnVnIHRob3VnaCwgc28gZmVlbCBmcmVlIHRvIHJlLWVuYWJsZSBpdCBpZiBpdCdzCisvLyB1c2VmdWw7IGhvd2V2ZXIgbm90aWNlIHRoYXQgd2UgYWxyZWFkeSBoYXZlIHRoZSB0ZW1wbGF0ZWQgb3BlcmF0b3I9IGFib3ZlIGFuZCBlLmcuIGluIE1hdHJpeEJhc2UKKy8vIHdlIGRpZG4ndCBoYXZlIHRvIGFkZCwgaW4gYWRkaXRpb24gdG8gdGVtcGxhdGVkIG9wZXJhdG9yPSwgc3VjaCBhIG5vbi10ZW1wbGF0ZWQgY29weSBvcGVyYXRvci4KKy8vICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvbkJhc2UmIG90aGVyKQorLy8gIHsgcmV0dXJuIG9wZXJhdG9yPTxEZXJpdmVkPihvdGhlcik7IH0KKworICBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgQW5nbGVBeGlzVHlwZSYgYWEpOworICB0ZW1wbGF0ZTxjbGFzcyBPdGhlckRlcml2ZWQ+IERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG0pOworCisgIC8qKiBccmV0dXJucyBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIGFuIGlkZW50aXR5IHJvdGF0aW9uCisgICAgKiBcc2EgTWF0cml4QmFzZTo6SWRlbnRpdHkoKQorICAgICovCisgIHN0YXRpYyBpbmxpbmUgUXVhdGVybmlvbjxTY2FsYXI+IElkZW50aXR5KCkgeyByZXR1cm4gUXVhdGVybmlvbjxTY2FsYXI+KDEsIDAsIDAsIDApOyB9CisKKyAgLyoqIFxzYSBRdWF0ZXJuaW9uQmFzZTo6SWRlbnRpdHkoKSwgTWF0cml4QmFzZTo6c2V0SWRlbnRpdHkoKQorICAgICovCisgIGlubGluZSBRdWF0ZXJuaW9uQmFzZSYgc2V0SWRlbnRpdHkoKSB7IGNvZWZmcygpIDw8IDAsIDAsIDAsIDE7IHJldHVybiAqdGhpczsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgc3F1YXJlZCBub3JtIG9mIHRoZSBxdWF0ZXJuaW9uJ3MgY29lZmZpY2llbnRzCisgICAgKiBcc2EgUXVhdGVybmlvbkJhc2U6Om5vcm0oKSwgTWF0cml4QmFzZTo6c3F1YXJlZE5vcm0oKQorICAgICovCisgIGlubGluZSBTY2FsYXIgc3F1YXJlZE5vcm0oKSBjb25zdCB7IHJldHVybiBjb2VmZnMoKS5zcXVhcmVkTm9ybSgpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBub3JtIG9mIHRoZSBxdWF0ZXJuaW9uJ3MgY29lZmZpY2llbnRzCisgICAgKiBcc2EgUXVhdGVybmlvbkJhc2U6OnNxdWFyZWROb3JtKCksIE1hdHJpeEJhc2U6Om5vcm0oKQorICAgICovCisgIGlubGluZSBTY2FsYXIgbm9ybSgpIGNvbnN0IHsgcmV0dXJuIGNvZWZmcygpLm5vcm0oKTsgfQorCisgIC8qKiBOb3JtYWxpemVzIHRoZSBxdWF0ZXJuaW9uIFxjICp0aGlzCisgICAgKiBcc2Egbm9ybWFsaXplZCgpLCBNYXRyaXhCYXNlOjpub3JtYWxpemUoKSAqLworICBpbmxpbmUgdm9pZCBub3JtYWxpemUoKSB7IGNvZWZmcygpLm5vcm1hbGl6ZSgpOyB9CisgIC8qKiBccmV0dXJucyBhIG5vcm1hbGl6ZWQgY29weSBvZiBcYyAqdGhpcworICAgICogXHNhIG5vcm1hbGl6ZSgpLCBNYXRyaXhCYXNlOjpub3JtYWxpemVkKCkgKi8KKyAgaW5saW5lIFF1YXRlcm5pb248U2NhbGFyPiBub3JtYWxpemVkKCkgY29uc3QgeyByZXR1cm4gUXVhdGVybmlvbjxTY2FsYXI+KGNvZWZmcygpLm5vcm1hbGl6ZWQoKSk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgZG90IHByb2R1Y3Qgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyCisgICAgKiBHZW9tZXRyaWNhbGx5IHNwZWFraW5nLCB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHVuaXQgcXVhdGVybmlvbnMKKyAgICAqIGNvcnJlc3BvbmRzIHRvIHRoZSBjb3NpbmUgb2YgaGFsZiB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgdHdvIHJvdGF0aW9ucy4KKyAgICAqIFxzYSBhbmd1bGFyRGlzdGFuY2UoKQorICAgICovCisgIHRlbXBsYXRlPGNsYXNzIE90aGVyRGVyaXZlZD4gaW5saW5lIFNjYWxhciBkb3QoY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIGNvZWZmcygpLmRvdChvdGhlci5jb2VmZnMoKSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBPdGhlckRlcml2ZWQ+IFNjYWxhciBhbmd1bGFyRGlzdGFuY2UoY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyBhbiBlcXVpdmFsZW50IDN4MyByb3RhdGlvbiBtYXRyaXggKi8KKyAgTWF0cml4MyB0b1JvdGF0aW9uTWF0cml4KCkgY29uc3Q7CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBxdWF0ZXJuaW9uIHdoaWNoIHRyYW5zZm9ybSBcYSBhIGludG8gXGEgYiB0aHJvdWdoIGEgcm90YXRpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgorICBEZXJpdmVkJiBzZXRGcm9tVHdvVmVjdG9ycyhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgYSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIGIpOworCisgIHRlbXBsYXRlPGNsYXNzIE90aGVyRGVyaXZlZD4gRUlHRU5fU1RST05HX0lOTElORSBRdWF0ZXJuaW9uPFNjYWxhcj4gb3BlcmF0b3IqIChjb25zdCBRdWF0ZXJuaW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBxKSBjb25zdDsKKyAgdGVtcGxhdGU8Y2xhc3MgT3RoZXJEZXJpdmVkPiBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yKj0gKGNvbnN0IFF1YXRlcm5pb25CYXNlPE90aGVyRGVyaXZlZD4mIHEpOworCisgIC8qKiBccmV0dXJucyB0aGUgcXVhdGVybmlvbiBkZXNjcmliaW5nIHRoZSBpbnZlcnNlIHJvdGF0aW9uICovCisgIFF1YXRlcm5pb248U2NhbGFyPiBpbnZlcnNlKCkgY29uc3Q7CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBjb25qdWdhdGVkIHF1YXRlcm5pb24gKi8KKyAgUXVhdGVybmlvbjxTY2FsYXI+IGNvbmp1Z2F0ZSgpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyBhbiBpbnRlcnBvbGF0aW9uIGZvciBhIGNvbnN0YW50IG1vdGlvbiBiZXR3ZWVuIFxhIG90aGVyIGFuZCBcYyAqdGhpcworICAgICogXGEgdCBpbiBbMDsxXQorICAgICogc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2xlcnAKKyAgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBPdGhlckRlcml2ZWQ+IFF1YXRlcm5pb248U2NhbGFyPiBzbGVycChTY2FsYXIgdCwgY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgT3RoZXJEZXJpdmVkPgorICBib29sIGlzQXBwcm94KGNvbnN0IFF1YXRlcm5pb25CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLCBSZWFsU2NhbGFyIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgIHsgcmV0dXJuIGNvZWZmcygpLmlzQXBwcm94KG90aGVyLmNvZWZmcygpLCBwcmVjKTsgfQorCisJLyoqIHJldHVybiB0aGUgcmVzdWx0IHZlY3RvciBvZiBcYSB2IHRocm91Z2ggdGhlIHJvdGF0aW9uKi8KKyAgRUlHRU5fU1RST05HX0lOTElORSBWZWN0b3IzIF90cmFuc2Zvcm1WZWN0b3IoVmVjdG9yMyB2KSBjb25zdDsKKworICAvKiogXHJldHVybnMgXGMgKnRoaXMgd2l0aCBzY2FsYXIgdHlwZSBjYXN0ZWQgdG8gXGEgTmV3U2NhbGFyVHlwZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBpZiBcYSBOZXdTY2FsYXJUeXBlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHNjYWxhciB0eXBlIG9mIFxjICp0aGlzCisgICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc21hcnRseSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1NjYWxhclR5cGU+CisgIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxEZXJpdmVkLFF1YXRlcm5pb248TmV3U2NhbGFyVHlwZT4gPjo6dHlwZSBjYXN0KCkgY29uc3QKKyAgeworICAgIHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxEZXJpdmVkLFF1YXRlcm5pb248TmV3U2NhbGFyVHlwZT4gPjo6dHlwZShkZXJpdmVkKCkpOworICB9CisKKyNpZmRlZiBFSUdFTl9RVUFURVJOSU9OQkFTRV9QTFVHSU4KKyMgaW5jbHVkZSBFSUdFTl9RVUFURVJOSU9OQkFTRV9QTFVHSU4KKyNlbmRpZgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEZWZpbml0aW9uL2ltcGxlbWVudGF0aW9uIG9mIFF1YXRlcm5pb248U2NhbGFyPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBRdWF0ZXJuaW9uCisgICoKKyAgKiBcYnJpZWYgVGhlIHF1YXRlcm5pb24gY2xhc3MgdXNlZCB0byByZXByZXNlbnQgM0Qgb3JpZW50YXRpb25zIGFuZCByb3RhdGlvbnMKKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcXVhdGVybmlvbiBcZiQgdyt4aSt5ait6ayBcZiQgdGhhdCBpcyBhIGNvbnZlbmllbnQgcmVwcmVzZW50YXRpb24gb2YKKyAgKiBvcmllbnRhdGlvbnMgYW5kIHJvdGF0aW9ucyBvZiBvYmplY3RzIGluIHRocmVlIGRpbWVuc2lvbnMuIENvbXBhcmVkIHRvIG90aGVyIHJlcHJlc2VudGF0aW9ucworICAqIGxpa2UgRXVsZXIgYW5nbGVzIG9yIDN4MyBtYXRyaWNlcywgcXVhdGVydGlvbnMgb2ZmZXIgdGhlIGZvbGxvd2luZyBhZHZhbnRhZ2VzOgorICAqIFxsaSBcYiBjb21wYWN0IHN0b3JhZ2UgKDQgc2NhbGFycykKKyAgKiBcbGkgXGIgZWZmaWNpZW50IHRvIGNvbXBvc2UgKDI4IGZsb3BzKSwKKyAgKiBcbGkgXGIgc3RhYmxlIHNwaGVyaWNhbCBpbnRlcnBvbGF0aW9uCisgICoKKyAgKiBUaGUgZm9sbG93aW5nIHR3byB0eXBlZGVmcyBhcmUgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlOgorICAqIFxsaSBcYyBRdWF0ZXJuaW9uZiBmb3IgXGMgZmxvYXQKKyAgKiBcbGkgXGMgUXVhdGVybmlvbmQgZm9yIFxjIGRvdWJsZQorICAqCisgICogXHNhICBjbGFzcyBBbmdsZUF4aXMsIGNsYXNzIFRyYW5zZm9ybQorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcixpbnQgX09wdGlvbnM+CitzdHJ1Y3QgdHJhaXRzPFF1YXRlcm5pb248X1NjYWxhcixfT3B0aW9ucz4gPgoreworICB0eXBlZGVmIFF1YXRlcm5pb248X1NjYWxhcixfT3B0aW9ucz4gUGxhaW5PYmplY3Q7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsNCwxLF9PcHRpb25zPiBDb2VmZmljaWVudHM7CisgIGVudW17CisgICAgSXNBbGlnbmVkID0gaW50ZXJuYWw6OnRyYWl0czxDb2VmZmljaWVudHM+OjpGbGFncyAmIEFsaWduZWRCaXQsCisgICAgRmxhZ3MgPSBJc0FsaWduZWQgPyAoQWxpZ25lZEJpdCB8IEx2YWx1ZUJpdCkgOiBMdmFsdWVCaXQKKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucz4KK2NsYXNzIFF1YXRlcm5pb24gOiBwdWJsaWMgUXVhdGVybmlvbkJhc2U8UXVhdGVybmlvbjxfU2NhbGFyLF9PcHRpb25zPiA+Cit7CisgIHR5cGVkZWYgUXVhdGVybmlvbkJhc2U8UXVhdGVybmlvbjxfU2NhbGFyLF9PcHRpb25zPiA+IEJhc2U7CisgIGVudW0geyBJc0FsaWduZWQgPSBpbnRlcm5hbDo6dHJhaXRzPFF1YXRlcm5pb24+OjpJc0FsaWduZWQgfTsKKworcHVibGljOgorICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworCisgIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9FUVVBTF9PUEVSQVRPUihRdWF0ZXJuaW9uKQorICB1c2luZyBCYXNlOjpvcGVyYXRvcio9OworCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxRdWF0ZXJuaW9uPjo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpBbmdsZUF4aXNUeXBlIEFuZ2xlQXhpc1R5cGU7CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgbGVhdmluZyB0aGUgcXVhdGVybmlvbiB1bmluaXRpYWxpemVkLiAqLworICBpbmxpbmUgUXVhdGVybmlvbigpIHt9CisKKyAgLyoqIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemVzIHRoZSBxdWF0ZXJuaW9uIFxmJCB3K3hpK3lqK3prIFxmJCBmcm9tCisgICAgKiBpdHMgZm91ciBjb2VmZmljaWVudHMgXGEgdywgXGEgeCwgXGEgeSBhbmQgXGEgei4KKyAgICAqCisgICAgKiBcd2FybmluZyBOb3RlIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzOiB0aGUgcmVhbCBcYSB3IGNvZWZmaWNpZW50IGZpcnN0LAorICAgICogd2hpbGUgaW50ZXJuYWxseSB0aGUgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAgICAqIFtcYyB4LCBcYyB5LCBcYyB6LCBcYyB3XQorICAgICovCisgIGlubGluZSBRdWF0ZXJuaW9uKFNjYWxhciB3LCBTY2FsYXIgeCwgU2NhbGFyIHksIFNjYWxhciB6KSA6IG1fY29lZmZzKHgsIHksIHosIHcpe30KKworICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSBhIHF1YXRlcm5pb24gZnJvbSB0aGUgYXJyYXkgZGF0YSAqLworICBpbmxpbmUgUXVhdGVybmlvbihjb25zdCBTY2FsYXIqIGRhdGEpIDogbV9jb2VmZnMoZGF0YSkge30KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciAqLworICB0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPiBFSUdFTl9TVFJPTkdfSU5MSU5FIFF1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIG90aGVyKSB7IHRoaXMtPkJhc2U6Om9wZXJhdG9yPShvdGhlcik7IH0KKworICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGFuZ2xlLWF4aXMgXGEgYWEgKi8KKyAgZXhwbGljaXQgaW5saW5lIFF1YXRlcm5pb24oY29uc3QgQW5nbGVBeGlzVHlwZSYgYWEpIHsgKnRoaXMgPSBhYTsgfQorCisgIC8qKiBDb25zdHJ1Y3RzIGFuZCBpbml0aWFsaXplcyBhIHF1YXRlcm5pb24gZnJvbSBlaXRoZXI6CisgICAgKiAgLSBhIHJvdGF0aW9uIG1hdHJpeCBleHByZXNzaW9uLAorICAgICogIC0gYSA0RCB2ZWN0b3IgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgcXVhdGVybmlvbiBjb2VmZmljaWVudHMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKyAgZXhwbGljaXQgaW5saW5lIFF1YXRlcm5pb24oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgb3RoZXIpIHsgKnRoaXMgPSBvdGhlcjsgfQorCisgIC8qKiBFeHBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXIsIGludCBPdGhlck9wdGlvbnM+CisgIGV4cGxpY2l0IGlubGluZSBRdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb248T3RoZXJTY2FsYXIsIE90aGVyT3B0aW9ucz4mIG90aGVyKQorICB7IG1fY29lZmZzID0gb3RoZXIuY29lZmZzKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDI+CisgIHN0YXRpYyBRdWF0ZXJuaW9uIEZyb21Ud29WZWN0b3JzKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZDE+JiBhLCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQyPiYgYik7CisKKyAgaW5saW5lIENvZWZmaWNpZW50cyYgY29lZmZzKCkgeyByZXR1cm4gbV9jb2VmZnM7fQorICBpbmxpbmUgY29uc3QgQ29lZmZpY2llbnRzJiBjb2VmZnMoKSBjb25zdCB7IHJldHVybiBtX2NvZWZmczt9CisKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRihJc0FsaWduZWQpCisKK3Byb3RlY3RlZDoKKyAgQ29lZmZpY2llbnRzIG1fY29lZmZzOworICAKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIF9jaGVja190ZW1wbGF0ZV9wYXJhbXMoKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoIChfT3B0aW9ucyAmIERvbnRBbGlnbikgPT0gX09wdGlvbnMsCisgICAgICAgIElOVkFMSURfTUFUUklYX1RFTVBMQVRFX1BBUkFNRVRFUlMpCisgICAgfQorI2VuZGlmCit9OworCisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICogc2luZ2xlIHByZWNpc2lvbiBxdWF0ZXJuaW9uIHR5cGUgKi8KK3R5cGVkZWYgUXVhdGVybmlvbjxmbG9hdD4gUXVhdGVybmlvbmY7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICogZG91YmxlIHByZWNpc2lvbiBxdWF0ZXJuaW9uIHR5cGUgKi8KK3R5cGVkZWYgUXVhdGVybmlvbjxkb3VibGU+IFF1YXRlcm5pb25kOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNwZWNpYWxpemF0aW9uIG9mIE1hcDxRdWF0ZXJuaW9uPFNjYWxhcj4+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucz4KKyAgc3RydWN0IHRyYWl0czxNYXA8UXVhdGVybmlvbjxfU2NhbGFyPiwgX09wdGlvbnM+ID46CisgIHRyYWl0czxRdWF0ZXJuaW9uPF9TY2FsYXIsIF9PcHRpb25zPiA+CisgIHsKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgTWFwPE1hdHJpeDxfU2NhbGFyLDQsMT4sIF9PcHRpb25zPiBDb2VmZmljaWVudHM7CisKKyAgICB0eXBlZGVmIHRyYWl0czxRdWF0ZXJuaW9uPF9TY2FsYXIsIF9PcHRpb25zPiA+IFRyYWl0c0Jhc2U7CisgICAgZW51bSB7CisgICAgICBJc0FsaWduZWQgPSBUcmFpdHNCYXNlOjpJc0FsaWduZWQsCisKKyAgICAgIEZsYWdzID0gVHJhaXRzQmFzZTo6RmxhZ3MKKyAgICB9OworICB9OworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnM+CisgIHN0cnVjdCB0cmFpdHM8TWFwPGNvbnN0IFF1YXRlcm5pb248X1NjYWxhcj4sIF9PcHRpb25zPiA+OgorICB0cmFpdHM8UXVhdGVybmlvbjxfU2NhbGFyPiA+CisgIHsKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxfU2NhbGFyLDQsMT4sIF9PcHRpb25zPiBDb2VmZmljaWVudHM7CisKKyAgICB0eXBlZGVmIHRyYWl0czxRdWF0ZXJuaW9uPF9TY2FsYXIsIF9PcHRpb25zPiA+IFRyYWl0c0Jhc2U7CisgICAgZW51bSB7CisgICAgICBJc0FsaWduZWQgPSBUcmFpdHNCYXNlOjpJc0FsaWduZWQsCisgICAgICBGbGFncyA9IFRyYWl0c0Jhc2U6OkZsYWdzICYgfkx2YWx1ZUJpdAorICAgIH07CisgIH07Cit9CisKKy8qKiBcYnJpZWYgUXVhdGVybmlvbiBleHByZXNzaW9uIG1hcHBpbmcgYSBjb25zdGFudCBtZW1vcnkgYnVmZmVyCisgICoKKyAgKiBccGFyYW0gX1NjYWxhciB0aGUgdHlwZSBvZiB0aGUgUXVhdGVybmlvbiBjb2VmZmljaWVudHMKKyAgKiBccGFyYW0gX09wdGlvbnMgc2VlIGNsYXNzIE1hcAorICAqCisgICogVGhpcyBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIGNsYXNzIE1hcCBmb3IgUXVhdGVybmlvbi4gVGhpcyBjbGFzcyBhbGxvd3MgdG8gdmlldworICAqIGEgNCBzY2FsYXIgbWVtb3J5IGJ1ZmZlciBhcyBhbiBFaWdlbidzIFF1YXRlcm5pb24gb2JqZWN0LgorICAqCisgICogXHNhIGNsYXNzIE1hcCwgY2xhc3MgUXVhdGVybmlvbiwgY2xhc3MgUXVhdGVybmlvbkJhc2UKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucz4KK2NsYXNzIE1hcDxjb25zdCBRdWF0ZXJuaW9uPF9TY2FsYXI+LCBfT3B0aW9ucyA+CisgIDogcHVibGljIFF1YXRlcm5pb25CYXNlPE1hcDxjb25zdCBRdWF0ZXJuaW9uPF9TY2FsYXI+LCBfT3B0aW9ucz4gPgoreworICAgIHR5cGVkZWYgUXVhdGVybmlvbkJhc2U8TWFwPGNvbnN0IFF1YXRlcm5pb248X1NjYWxhcj4sIF9PcHRpb25zPiA+IEJhc2U7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hcD46OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7CisgICAgRUlHRU5fSU5IRVJJVF9BU1NJR05NRU5UX0VRVUFMX09QRVJBVE9SKE1hcCkKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvcio9OworCisgICAgLyoqIENvbnN0cnVjdHMgYSBNYXBwZWQgUXVhdGVybmlvbiBvYmplY3QgZnJvbSB0aGUgcG9pbnRlciBcYSBjb2VmZnMKKyAgICAgICoKKyAgICAgICogVGhlIHBvaW50ZXIgXGEgY29lZmZzIG11c3QgcmVmZXJlbmNlIHRoZSBmb3VyIGNvZWZmZWNpZW50cyBvZiBRdWF0ZXJuaW9uIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgICAqIFxjb2RlICpjb2VmZnMgPT0ge3gsIHksIHosIHd9IFxlbmRjb2RlCisgICAgICAqCisgICAgICAqIElmIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgX09wdGlvbnMgaXMgc2V0IHRvICNBbGlnbmVkLCB0aGVuIHRoZSBwb2ludGVyIGNvZWZmcyBtdXN0IGJlIGFsaWduZWQuICovCisgICAgRUlHRU5fU1RST05HX0lOTElORSBNYXAoY29uc3QgU2NhbGFyKiBjb2VmZnMpIDogbV9jb2VmZnMoY29lZmZzKSB7fQorCisgICAgaW5saW5lIGNvbnN0IENvZWZmaWNpZW50cyYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7fQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBDb2VmZmljaWVudHMgbV9jb2VmZnM7Cit9OworCisvKiogXGJyaWVmIEV4cHJlc3Npb24gb2YgYSBxdWF0ZXJuaW9uIGZyb20gYSBtZW1vcnkgYnVmZmVyCisgICoKKyAgKiBccGFyYW0gX1NjYWxhciB0aGUgdHlwZSBvZiB0aGUgUXVhdGVybmlvbiBjb2VmZmljaWVudHMKKyAgKiBccGFyYW0gX09wdGlvbnMgc2VlIGNsYXNzIE1hcAorICAqCisgICogVGhpcyBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIGNsYXNzIE1hcCBmb3IgUXVhdGVybmlvbi4gVGhpcyBjbGFzcyBhbGxvd3MgdG8gdmlldworICAqIGEgNCBzY2FsYXIgbWVtb3J5IGJ1ZmZlciBhcyBhbiBFaWdlbidzICBRdWF0ZXJuaW9uIG9iamVjdC4KKyAgKgorICAqIFxzYSBjbGFzcyBNYXAsIGNsYXNzIFF1YXRlcm5pb24sIGNsYXNzIFF1YXRlcm5pb25CYXNlCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnM+CitjbGFzcyBNYXA8UXVhdGVybmlvbjxfU2NhbGFyPiwgX09wdGlvbnMgPgorICA6IHB1YmxpYyBRdWF0ZXJuaW9uQmFzZTxNYXA8UXVhdGVybmlvbjxfU2NhbGFyPiwgX09wdGlvbnM+ID4KK3sKKyAgICB0eXBlZGVmIFF1YXRlcm5pb25CYXNlPE1hcDxRdWF0ZXJuaW9uPF9TY2FsYXI+LCBfT3B0aW9ucz4gPiBCYXNlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXA+OjpDb2VmZmljaWVudHMgQ29lZmZpY2llbnRzOworICAgIEVJR0VOX0lOSEVSSVRfQVNTSUdOTUVOVF9FUVVBTF9PUEVSQVRPUihNYXApCisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IqPTsKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgTWFwcGVkIFF1YXRlcm5pb24gb2JqZWN0IGZyb20gdGhlIHBvaW50ZXIgXGEgY29lZmZzCisgICAgICAqCisgICAgICAqIFRoZSBwb2ludGVyIFxhIGNvZWZmcyBtdXN0IHJlZmVyZW5jZSB0aGUgZm91ciBjb2VmZmVjaWVudHMgb2YgUXVhdGVybmlvbiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgICAgKiBcY29kZSAqY29lZmZzID09IHt4LCB5LCB6LCB3fSBcZW5kY29kZQorICAgICAgKgorICAgICAgKiBJZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIF9PcHRpb25zIGlzIHNldCB0byAjQWxpZ25lZCwgdGhlbiB0aGUgcG9pbnRlciBjb2VmZnMgbXVzdCBiZSBhbGlnbmVkLiAqLworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgTWFwKFNjYWxhciogY29lZmZzKSA6IG1fY29lZmZzKGNvZWZmcykge30KKworICAgIGlubGluZSBDb2VmZmljaWVudHMmIGNvZWZmcygpIHsgcmV0dXJuIG1fY29lZmZzOyB9CisgICAgaW5saW5lIGNvbnN0IENvZWZmaWNpZW50cyYgY29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnM7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgQ29lZmZpY2llbnRzIG1fY29lZmZzOworfTsKKworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqIE1hcCBhbiB1bmFsaWduZWQgYXJyYXkgb2Ygc2luZ2xlIHByZWNpc2lvbiBzY2FsYXIgYXMgYSBxdWF0ZXJuaW9uICovCit0eXBlZGVmIE1hcDxRdWF0ZXJuaW9uPGZsb2F0PiwgMD4gICAgICAgICBRdWF0ZXJuaW9uTWFwZjsKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBNYXAgYW4gdW5hbGlnbmVkIGFycmF5IG9mIGRvdWJsZSBwcmVjaXNpb24gc2NhbGFyIGFzIGEgcXVhdGVybmlvbiAqLwordHlwZWRlZiBNYXA8UXVhdGVybmlvbjxkb3VibGU+LCAwPiAgICAgICAgUXVhdGVybmlvbk1hcGQ7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICogTWFwIGEgMTYtYml0cyBhbGlnbmVkIGFycmF5IG9mIGRvdWJsZSBwcmVjaXNpb24gc2NhbGFycyBhcyBhIHF1YXRlcm5pb24gKi8KK3R5cGVkZWYgTWFwPFF1YXRlcm5pb248ZmxvYXQ+LCBBbGlnbmVkPiAgIFF1YXRlcm5pb25NYXBBbGlnbmVkZjsKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBNYXAgYSAxNi1iaXRzIGFsaWduZWQgYXJyYXkgb2YgZG91YmxlIHByZWNpc2lvbiBzY2FsYXJzIGFzIGEgcXVhdGVybmlvbiAqLwordHlwZWRlZiBNYXA8UXVhdGVybmlvbjxkb3VibGU+LCBBbGlnbmVkPiAgUXVhdGVybmlvbk1hcEFsaWduZWRkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIFF1YXRlcm5pb25CYXNlIG1ldGhvZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gR2VuZXJpYyBRdWF0ZXJuaW9uICogUXVhdGVybmlvbiBwcm9kdWN0CisvLyBUaGlzIHByb2R1Y3QgY2FuIGJlIHNwZWNpYWxpemVkIGZvciBhIGdpdmVuIGFyY2hpdGVjdHVyZSB2aWEgdGhlIEFyY2ggdGVtcGxhdGUgYXJndW1lbnQuCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8aW50IEFyY2gsIGNsYXNzIERlcml2ZWQxLCBjbGFzcyBEZXJpdmVkMiwgdHlwZW5hbWUgU2NhbGFyLCBpbnQgX09wdGlvbnM+IHN0cnVjdCBxdWF0X3Byb2R1Y3QKK3sKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgUXVhdGVybmlvbjxTY2FsYXI+IHJ1bihjb25zdCBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkMT4mIGEsIGNvbnN0IFF1YXRlcm5pb25CYXNlPERlcml2ZWQyPiYgYil7CisgICAgcmV0dXJuIFF1YXRlcm5pb248U2NhbGFyPgorICAgICgKKyAgICAgIGEudygpICogYi53KCkgLSBhLngoKSAqIGIueCgpIC0gYS55KCkgKiBiLnkoKSAtIGEueigpICogYi56KCksCisgICAgICBhLncoKSAqIGIueCgpICsgYS54KCkgKiBiLncoKSArIGEueSgpICogYi56KCkgLSBhLnooKSAqIGIueSgpLAorICAgICAgYS53KCkgKiBiLnkoKSArIGEueSgpICogYi53KCkgKyBhLnooKSAqIGIueCgpIC0gYS54KCkgKiBiLnooKSwKKyAgICAgIGEudygpICogYi56KCkgKyBhLnooKSAqIGIudygpICsgYS54KCkgKiBiLnkoKSAtIGEueSgpICogYi54KCkKKyAgICApOworICB9Cit9OworfQorCisvKiogXHJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdHdvIHJvdGF0aW9ucyBhcyBhIHF1YXRlcm5pb24tcXVhdGVybmlvbiBwcm9kdWN0ICovCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KK3RlbXBsYXRlIDxjbGFzcyBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIFF1YXRlcm5pb248dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPgorUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKiAoY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpTY2FsYXI+Ojp2YWx1ZSksCisgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKyAgcmV0dXJuIGludGVybmFsOjpxdWF0X3Byb2R1Y3Q8QXJjaGl0ZWN0dXJlOjpUYXJnZXQsIERlcml2ZWQsIE90aGVyRGVyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6SXNBbGlnbmVkICYmIGludGVybmFsOjp0cmFpdHM8T3RoZXJEZXJpdmVkPjo6SXNBbGlnbmVkPjo6cnVuKCp0aGlzLCBvdGhlcik7Cit9CisKKy8qKiBcc2Egb3BlcmF0b3IqKFF1YXRlcm5pb24pICovCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KK3RlbXBsYXRlIDxjbGFzcyBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+OjpvcGVyYXRvcio9IChjb25zdCBRdWF0ZXJuaW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKK3sKKyAgZGVyaXZlZCgpID0gZGVyaXZlZCgpICogb3RoZXIuZGVyaXZlZCgpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogUm90YXRpb24gb2YgYSB2ZWN0b3IgYnkgYSBxdWF0ZXJuaW9uLgorICAqIFxyZW1hcmtzIElmIHRoZSBxdWF0ZXJuaW9uIGlzIHVzZWQgdG8gcm90YXRlIHNldmVyYWwgcG9pbnRzICg+MSkKKyAgKiB0aGVuIGl0IGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdG8gZmlyc3QgY29udmVydCBpdCB0byBhIDN4MyBNYXRyaXguCisgICogQ29tcGFyaXNvbiBvZiB0aGUgb3BlcmF0aW9uIGNvc3QgZm9yIG4gdHJhbnNmb3JtYXRpb25zOgorICAqICAgLSBRdWF0ZXJuaW9uMjogICAgMzBuCisgICogICAtIFZpYSBhIE1hdHJpeDM6IDI0ICsgMTVuCisgICovCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46OlZlY3RvcjMKK1F1YXRlcm5pb25CYXNlPERlcml2ZWQ+OjpfdHJhbnNmb3JtVmVjdG9yKFZlY3RvcjMgdikgY29uc3QKK3sKKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY29tZXMgZnJvbSB0aGUgb3B0aW1pemF0aW9uIGJ5IGhhbmQKKyAgICAvLyBvZiB0aGUgY29udmVyc2lvbiB0byBhIE1hdHJpeCBmb2xsb3dlZCBieSBhIE1hdHJpeC9WZWN0b3IgcHJvZHVjdC4KKyAgICAvLyBJdCBhcHBlYXJzIHRvIGJlIG11Y2ggZmFzdGVyIHRoYW4gdGhlIGNvbW1vbiBhbGdvcml0aG0gZm91bmQKKyAgICAvLyBpbiB0aGUgbGl0dGVyYXR1cmUgKDMwIHZlcnN1cyAzOSBmbG9wcykuIEl0IGFsc28gcmVxdWlyZXMgdHdvCisgICAgLy8gVmVjdG9yMyBhcyB0ZW1wb3Jhcmllcy4KKyAgICBWZWN0b3IzIHV2ID0gdGhpcy0+dmVjKCkuY3Jvc3Modik7CisgICAgdXYgKz0gdXY7CisgICAgcmV0dXJuIHYgKyB0aGlzLT53KCkgKiB1diArIHRoaXMtPnZlYygpLmNyb3NzKHV2KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+OjpvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIG90aGVyKQoreworICBjb2VmZnMoKSA9IG90aGVyLmNvZWZmcygpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgordGVtcGxhdGU8Y2xhc3MgT3RoZXJEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3I9KGNvbnN0IFF1YXRlcm5pb25CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBjb2VmZnMoKSA9IG90aGVyLmNvZWZmcygpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogU2V0IFxjICp0aGlzIGZyb20gYW4gYW5nbGUtYXhpcyBcYSBhYSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcworICAqLwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46Om9wZXJhdG9yPShjb25zdCBBbmdsZUF4aXNUeXBlJiBhYSkKK3sKKyAgU2NhbGFyIGhhID0gU2NhbGFyKDAuNSkqYWEuYW5nbGUoKTsgLy8gU2NhbGFyKDAuNSkgdG8gc3VwcHJlc3MgcHJlY2lzaW9uIGxvc3Mgd2FybmluZ3MKKyAgdGhpcy0+dygpID0gaW50ZXJuYWw6OmNvcyhoYSk7CisgIHRoaXMtPnZlYygpID0gaW50ZXJuYWw6OnNpbihoYSkgKiBhYS5heGlzKCk7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBTZXQgXGMgKnRoaXMgZnJvbSB0aGUgZXhwcmVzc2lvbiBcYSB4cHI6CisgICogICAtIGlmIFxhIHhwciBpcyBhIDR4MSB2ZWN0b3IsIHRoZW4gXGEgeHByIGlzIGFzc3VtZWQgdG8gYmUgYSBxdWF0ZXJuaW9uCisgICogICAtIGlmIFxhIHhwciBpcyBhIDN4MyBtYXRyaXgsIHRoZW4gXGEgeHByIGlzIGFzc3VtZWQgdG8gYmUgcm90YXRpb24gbWF0cml4CisgICogICAgIGFuZCBcYSB4cHIgaXMgY29udmVydGVkIHRvIGEgcXVhdGVybmlvbgorICAqLworCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgordGVtcGxhdGU8Y2xhc3MgTWF0cml4RGVyaXZlZD4KK2lubGluZSBEZXJpdmVkJiBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPjo6b3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2U8TWF0cml4RGVyaXZlZD4mIHhwcikKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyLCB0eXBlbmFtZSBNYXRyaXhEZXJpdmVkOjpTY2FsYXI+Ojp2YWx1ZSksCisgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKyAgaW50ZXJuYWw6OnF1YXRlcm5pb25iYXNlX2Fzc2lnbl9pbXBsPE1hdHJpeERlcml2ZWQ+OjpydW4oKnRoaXMsIHhwci5kZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogQ29udmVydCB0aGUgcXVhdGVybmlvbiB0byBhIDN4MyByb3RhdGlvbiBtYXRyaXguIFRoZSBxdWF0ZXJuaW9uIGlzIHJlcXVpcmVkIHRvCisgICogYmUgbm9ybWFsaXplZCwgb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgorICAqLwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPjo6TWF0cml4MworUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46OnRvUm90YXRpb25NYXRyaXgodm9pZCkgY29uc3QKK3sKKyAgLy8gTk9URSBpZiBpbmxpbmVkLCB0aGVuIGdjYyA0LjIgYW5kIDQuNCBnZXQgcmlkIG9mIHRoZSB0ZW1wb3JhcnkgKG5vdCBnY2MgNC4zICEhKQorICAvLyBpZiBub3QgaW5saW5lZCB0aGVuIHRoZSBjb3N0IG9mIHRoZSByZXR1cm4gYnkgdmFsdWUgaXMgaHVnZSB+ICszNSUsCisgIC8vIGhvd2V2ZXIsIG5vdCBpbmxpbmluZyB0aGlzIGZ1bmN0aW9uIGlzIGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBzbG93ZXIsIHNvCisgIC8vIGl0IGhhcyB0byBiZSBpbmxpbmVkLCBhbmQgc28gdGhlIHJldHVybiBieSB2YWx1ZSBpcyBub3QgYW4gaXNzdWUKKyAgTWF0cml4MyByZXM7CisKKyAgY29uc3QgU2NhbGFyIHR4ICA9IFNjYWxhcigyKSp0aGlzLT54KCk7CisgIGNvbnN0IFNjYWxhciB0eSAgPSBTY2FsYXIoMikqdGhpcy0+eSgpOworICBjb25zdCBTY2FsYXIgdHogID0gU2NhbGFyKDIpKnRoaXMtPnooKTsKKyAgY29uc3QgU2NhbGFyIHR3eCA9IHR4KnRoaXMtPncoKTsKKyAgY29uc3QgU2NhbGFyIHR3eSA9IHR5KnRoaXMtPncoKTsKKyAgY29uc3QgU2NhbGFyIHR3eiA9IHR6KnRoaXMtPncoKTsKKyAgY29uc3QgU2NhbGFyIHR4eCA9IHR4KnRoaXMtPngoKTsKKyAgY29uc3QgU2NhbGFyIHR4eSA9IHR5KnRoaXMtPngoKTsKKyAgY29uc3QgU2NhbGFyIHR4eiA9IHR6KnRoaXMtPngoKTsKKyAgY29uc3QgU2NhbGFyIHR5eSA9IHR5KnRoaXMtPnkoKTsKKyAgY29uc3QgU2NhbGFyIHR5eiA9IHR6KnRoaXMtPnkoKTsKKyAgY29uc3QgU2NhbGFyIHR6eiA9IHR6KnRoaXMtPnooKTsKKworICByZXMuY29lZmZSZWYoMCwwKSA9IFNjYWxhcigxKS0odHl5K3R6eik7CisgIHJlcy5jb2VmZlJlZigwLDEpID0gdHh5LXR3ejsKKyAgcmVzLmNvZWZmUmVmKDAsMikgPSB0eHordHd5OworICByZXMuY29lZmZSZWYoMSwwKSA9IHR4eSt0d3o7CisgIHJlcy5jb2VmZlJlZigxLDEpID0gU2NhbGFyKDEpLSh0eHgrdHp6KTsKKyAgcmVzLmNvZWZmUmVmKDEsMikgPSB0eXotdHd4OworICByZXMuY29lZmZSZWYoMiwwKSA9IHR4ei10d3k7CisgIHJlcy5jb2VmZlJlZigyLDEpID0gdHl6K3R3eDsKKyAgcmVzLmNvZWZmUmVmKDIsMikgPSBTY2FsYXIoMSktKHR4eCt0eXkpOworCisgIHJldHVybiByZXM7Cit9CisKKy8qKiBTZXRzIFxjICp0aGlzIHRvIGJlIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgYSByb3RhdGlvbiBiZXR3ZWVuCisgICogdGhlIHR3byBhcmJpdHJhcnkgdmVjdG9ycyBcYSBhIGFuZCBcYSBiLiBJbiBvdGhlciB3b3JkcywgdGhlIGJ1aWx0CisgICogcm90YXRpb24gcmVwcmVzZW50IGEgcm90YXRpb24gc2VuZGluZyB0aGUgbGluZSBvZiBkaXJlY3Rpb24gXGEgYQorICAqIHRvIHRoZSBsaW5lIG9mIGRpcmVjdGlvbiBcYSBiLCBib3RoIGxpbmVzIHBhc3NpbmcgdGhyb3VnaCB0aGUgb3JpZ2luLgorICAqCisgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICoKKyAgKiBOb3RlIHRoYXQgdGhlIHR3byBpbnB1dCB2ZWN0b3JzIGRvIFxiIG5vdCBoYXZlIHRvIGJlIG5vcm1hbGl6ZWQsIGFuZAorICAqIGRvIG5vdCBuZWVkIHRvIGhhdmUgdGhlIHNhbWUgbm9ybS4KKyAgKi8KK3RlbXBsYXRlPGNsYXNzIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDI+CitpbmxpbmUgRGVyaXZlZCYgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46OnNldEZyb21Ud29WZWN0b3JzKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZDE+JiBhLCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQyPiYgYikKK3sKKyAgdXNpbmcgc3RkOjptYXg7CisgIFZlY3RvcjMgdjAgPSBhLm5vcm1hbGl6ZWQoKTsKKyAgVmVjdG9yMyB2MSA9IGIubm9ybWFsaXplZCgpOworICBTY2FsYXIgYyA9IHYxLmRvdCh2MCk7CisKKyAgLy8gaWYgZG90ID09IC0xLCB2ZWN0b3JzIGFyZSBuZWFybHkgb3Bwb3NpdGVzCisgIC8vID0+IGFjY3VyYWxldGx5IGNvbXB1dGUgdGhlIHJvdGF0aW9uIGF4aXMgYnkgY29tcHV0aW5nIHRoZQorICAvLyAgICBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBwbGFuZXMuIFRoaXMgaXMgZG9uZSBieSBzb2x2aW5nOgorICAvLyAgICAgICB4XlQgdjAgPSAwCisgIC8vICAgICAgIHheVCB2MSA9IDAKKyAgLy8gICAgdW5kZXIgdGhlIGNvbnN0cmFpbnQ6CisgIC8vICAgICAgIHx8eHx8ID0gMQorICAvLyAgICB3aGljaCB5aWVsZHMgYSBzaW5ndWxhciB2YWx1ZSBwcm9ibGVtCisgIGlmIChjIDwgU2NhbGFyKC0xKStOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCisgIHsKKyAgICBjID0gbWF4PFNjYWxhcj4oYywtMSk7CisgICAgTWF0cml4PFNjYWxhciwyLDM+IG07IG0gPDwgdjAudHJhbnNwb3NlKCksIHYxLnRyYW5zcG9zZSgpOworICAgIEphY29iaVNWRDxNYXRyaXg8U2NhbGFyLDIsMz4gPiBzdmQobSwgQ29tcHV0ZUZ1bGxWKTsKKyAgICBWZWN0b3IzIGF4aXMgPSBzdmQubWF0cml4VigpLmNvbCgyKTsKKworICAgIFNjYWxhciB3MiA9IChTY2FsYXIoMSkrYykqU2NhbGFyKDAuNSk7CisgICAgdGhpcy0+dygpID0gaW50ZXJuYWw6OnNxcnQodzIpOworICAgIHRoaXMtPnZlYygpID0gYXhpcyAqIGludGVybmFsOjpzcXJ0KFNjYWxhcigxKSAtIHcyKTsKKyAgICByZXR1cm4gZGVyaXZlZCgpOworICB9CisgIFZlY3RvcjMgYXhpcyA9IHYwLmNyb3NzKHYxKTsKKyAgU2NhbGFyIHMgPSBpbnRlcm5hbDo6c3FydCgoU2NhbGFyKDEpK2MpKlNjYWxhcigyKSk7CisgIFNjYWxhciBpbnZzID0gU2NhbGFyKDEpL3M7CisgIHRoaXMtPnZlYygpID0gYXhpcyAqIGludnM7CisgIHRoaXMtPncoKSA9IHMgKiBTY2FsYXIoMC41KTsKKworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisKKy8qKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgYSByb3RhdGlvbiBiZXR3ZWVuCisgICogdGhlIHR3byBhcmJpdHJhcnkgdmVjdG9ycyBcYSBhIGFuZCBcYSBiLiBJbiBvdGhlciB3b3JkcywgdGhlIGJ1aWx0CisgICogcm90YXRpb24gcmVwcmVzZW50IGEgcm90YXRpb24gc2VuZGluZyB0aGUgbGluZSBvZiBkaXJlY3Rpb24gXGEgYQorICAqIHRvIHRoZSBsaW5lIG9mIGRpcmVjdGlvbiBcYSBiLCBib3RoIGxpbmVzIHBhc3NpbmcgdGhyb3VnaCB0aGUgb3JpZ2luLgorICAqCisgICogXHJldHVybnMgcmVzdWx0aW5nIHF1YXRlcm5pb24KKyAgKgorICAqIE5vdGUgdGhhdCB0aGUgdHdvIGlucHV0IHZlY3RvcnMgZG8gXGIgbm90IGhhdmUgdG8gYmUgbm9ybWFsaXplZCwgYW5kCisgICogZG8gbm90IG5lZWQgdG8gaGF2ZSB0aGUgc2FtZSBub3JtLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMj4KK1F1YXRlcm5pb248U2NhbGFyLE9wdGlvbnM+IFF1YXRlcm5pb248U2NhbGFyLE9wdGlvbnM+OjpGcm9tVHdvVmVjdG9ycyhjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgYSwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIGIpCit7CisgICAgUXVhdGVybmlvbiBxdWF0OworICAgIHF1YXQuc2V0RnJvbVR3b1ZlY3RvcnMoYSwgYik7CisgICAgcmV0dXJuIHF1YXQ7Cit9CisKKworLyoqIFxyZXR1cm5zIHRoZSBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIFxjICp0aGlzCisgICogTm90ZSB0aGF0IGluIG1vc3QgY2FzZXMsIGkuZS4sIGlmIHlvdSBzaW1wbHkgd2FudCB0aGUgb3Bwb3NpdGUgcm90YXRpb24sCisgICogYW5kL29yIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoZW4gaXQgaXMgZW5vdWdoIHRvIHVzZSB0aGUgY29uanVnYXRlLgorICAqCisgICogXHNhIFF1YXRlcm5pb25CYXNlOjpjb25qdWdhdGUoKQorICAqLwordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+CitpbmxpbmUgUXVhdGVybmlvbjx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+IFF1YXRlcm5pb25CYXNlPERlcml2ZWQ+OjppbnZlcnNlKCkgY29uc3QKK3sKKyAgLy8gRklYTUUgc2hvdWxkIHRoaXMgZnVuY3Rpb24gYmUgY2FsbGVkIG11bHRpcGxpY2F0aXZlSW52ZXJzZSBhbmQgY29uanVnYXRlKCkgYmUgY2FsbGVkIGludmVyc2UoKSBvciBvcHBvc2l0ZSgpICA/PworICBTY2FsYXIgbjIgPSB0aGlzLT5zcXVhcmVkTm9ybSgpOworICBpZiAobjIgPiAwKQorICAgIHJldHVybiBRdWF0ZXJuaW9uPFNjYWxhcj4oY29uanVnYXRlKCkuY29lZmZzKCkgLyBuMik7CisgIGVsc2UKKyAgeworICAgIC8vIHJldHVybiBhbiBpbnZhbGlkIHJlc3VsdCB0byBmbGFnIHRoZSBlcnJvcgorICAgIHJldHVybiBRdWF0ZXJuaW9uPFNjYWxhcj4oQ29lZmZpY2llbnRzOjpaZXJvKCkpOworICB9Cit9CisKKy8qKiBccmV0dXJucyB0aGUgY29uanVnYXRlIG9mIHRoZSBcYyAqdGhpcyB3aGljaCBpcyBlcXVhbCB0byB0aGUgbXVsdGlwbGljYXRpdmUgaW52ZXJzZQorICAqIGlmIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQuCisgICogVGhlIGNvbmp1Z2F0ZSBvZiBhIHF1YXRlcm5pb24gcmVwcmVzZW50cyB0aGUgb3Bwb3NpdGUgcm90YXRpb24uCisgICoKKyAgKiBcc2EgUXVhdGVybmlvbjI6OmludmVyc2UoKQorICAqLwordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+CitpbmxpbmUgUXVhdGVybmlvbjx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+CitRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPjo6Y29uanVnYXRlKCkgY29uc3QKK3sKKyAgcmV0dXJuIFF1YXRlcm5pb248U2NhbGFyPih0aGlzLT53KCksLXRoaXMtPngoKSwtdGhpcy0+eSgpLC10aGlzLT56KCkpOworfQorCisvKiogXHJldHVybnMgdGhlIGFuZ2xlIChpbiByYWRpYW4pIGJldHdlZW4gdHdvIHJvdGF0aW9ucworICAqIFxzYSBkb3QoKQorICAqLwordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcgorUXVhdGVybmlvbkJhc2U8RGVyaXZlZD46OmFuZ3VsYXJEaXN0YW5jZShjb25zdCBRdWF0ZXJuaW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKK3sKKyAgdXNpbmcgc3RkOjphY29zOworICBkb3VibGUgZCA9IGludGVybmFsOjphYnModGhpcy0+ZG90KG90aGVyKSk7CisgIGlmIChkPj0xLjApCisgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFNjYWxhcj4oMiAqIGFjb3MoZCkpOworfQorCisvKiogXHJldHVybnMgdGhlIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB0d28gcXVhdGVybmlvbnMKKyAgKiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIgYXQgdGhlIHBhcmFtZXRlciBcYSB0CisgICovCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KK3RlbXBsYXRlIDxjbGFzcyBPdGhlckRlcml2ZWQ+CitRdWF0ZXJuaW9uPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj4KK1F1YXRlcm5pb25CYXNlPERlcml2ZWQ+OjpzbGVycChTY2FsYXIgdCwgY29uc3QgUXVhdGVybmlvbkJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIHVzaW5nIHN0ZDo6YWNvczsKKyAgc3RhdGljIGNvbnN0IFNjYWxhciBvbmUgPSBTY2FsYXIoMSkgLSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICBTY2FsYXIgZCA9IHRoaXMtPmRvdChvdGhlcik7CisgIFNjYWxhciBhYnNEID0gaW50ZXJuYWw6OmFicyhkKTsKKworICBTY2FsYXIgc2NhbGUwOworICBTY2FsYXIgc2NhbGUxOworCisgIGlmKGFic0Q+PW9uZSkKKyAgeworICAgIHNjYWxlMCA9IFNjYWxhcigxKSAtIHQ7CisgICAgc2NhbGUxID0gdDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyB0aGV0YSBpcyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgMiBxdWF0ZXJuaW9ucworICAgIFNjYWxhciB0aGV0YSA9IGFjb3MoYWJzRCk7CisgICAgU2NhbGFyIHNpblRoZXRhID0gaW50ZXJuYWw6OnNpbih0aGV0YSk7CisKKyAgICBzY2FsZTAgPSBpbnRlcm5hbDo6c2luKCAoIFNjYWxhcigxKSAtIHQgKSAqIHRoZXRhKSAvIHNpblRoZXRhOworICAgIHNjYWxlMSA9IGludGVybmFsOjpzaW4oICggdCAqIHRoZXRhKSApIC8gc2luVGhldGE7CisgIH0KKyAgaWYoZDwwKSBzY2FsZTEgPSAtc2NhbGUxOworCisgIHJldHVybiBRdWF0ZXJuaW9uPFNjYWxhcj4oc2NhbGUwICogY29lZmZzKCkgKyBzY2FsZTEgKiBvdGhlci5jb2VmZnMoKSk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIHNldCBmcm9tIGEgcm90YXRpb24gbWF0cml4Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4KK3N0cnVjdCBxdWF0ZXJuaW9uYmFzZV9hc3NpZ25faW1wbDxPdGhlciwzLDM+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgT3RoZXI6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKyAgdGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4gc3RhdGljIGlubGluZSB2b2lkIHJ1bihRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPiYgcSwgY29uc3QgT3RoZXImIG1hdCkKKyAgeworICAgIC8vIFRoaXMgYWxnb3JpdGhtIGNvbWVzIGZyb20gICJRdWF0ZXJuaW9uIENhbGN1bHVzIGFuZCBGYXN0IEFuaW1hdGlvbiIsCisgICAgLy8gS2VuIFNob2VtYWtlLCAxOTg3IFNJR0dSQVBIIGNvdXJzZSBub3RlcworICAgIFNjYWxhciB0ID0gbWF0LnRyYWNlKCk7CisgICAgaWYgKHQgPiBTY2FsYXIoMCkpCisgICAgeworICAgICAgdCA9IHNxcnQodCArIFNjYWxhcigxLjApKTsKKyAgICAgIHEudygpID0gU2NhbGFyKDAuNSkqdDsKKyAgICAgIHQgPSBTY2FsYXIoMC41KS90OworICAgICAgcS54KCkgPSAobWF0LmNvZWZmKDIsMSkgLSBtYXQuY29lZmYoMSwyKSkgKiB0OworICAgICAgcS55KCkgPSAobWF0LmNvZWZmKDAsMikgLSBtYXQuY29lZmYoMiwwKSkgKiB0OworICAgICAgcS56KCkgPSAobWF0LmNvZWZmKDEsMCkgLSBtYXQuY29lZmYoMCwxKSkgKiB0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgRGVuc2VJbmRleCBpID0gMDsKKyAgICAgIGlmIChtYXQuY29lZmYoMSwxKSA+IG1hdC5jb2VmZigwLDApKQorICAgICAgICBpID0gMTsKKyAgICAgIGlmIChtYXQuY29lZmYoMiwyKSA+IG1hdC5jb2VmZihpLGkpKQorICAgICAgICBpID0gMjsKKyAgICAgIERlbnNlSW5kZXggaiA9IChpKzEpJTM7CisgICAgICBEZW5zZUluZGV4IGsgPSAoaisxKSUzOworCisgICAgICB0ID0gc3FydChtYXQuY29lZmYoaSxpKS1tYXQuY29lZmYoaixqKS1tYXQuY29lZmYoayxrKSArIFNjYWxhcigxLjApKTsKKyAgICAgIHEuY29lZmZzKCkuY29lZmZSZWYoaSkgPSBTY2FsYXIoMC41KSAqIHQ7CisgICAgICB0ID0gU2NhbGFyKDAuNSkvdDsKKyAgICAgIHEudygpID0gKG1hdC5jb2VmZihrLGopLW1hdC5jb2VmZihqLGspKSp0OworICAgICAgcS5jb2VmZnMoKS5jb2VmZlJlZihqKSA9IChtYXQuY29lZmYoaixpKSttYXQuY29lZmYoaSxqKSkqdDsKKyAgICAgIHEuY29lZmZzKCkuY29lZmZSZWYoaykgPSAobWF0LmNvZWZmKGssaSkrbWF0LmNvZWZmKGksaykpKnQ7CisgICAgfQorICB9Cit9OworCisvLyBzZXQgZnJvbSBhIHZlY3RvciBvZiBjb2VmZmljaWVudHMgYXNzdW1lZCB0byBiZSBhIHF1YXRlcm5pb24KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorc3RydWN0IHF1YXRlcm5pb25iYXNlX2Fzc2lnbl9pbXBsPE90aGVyLDQsMT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBPdGhlcjo6U2NhbGFyIFNjYWxhcjsKKyAgdGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4gc3RhdGljIGlubGluZSB2b2lkIHJ1bihRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPiYgcSwgY29uc3QgT3RoZXImIHZlYykKKyAgeworICAgIHEuY29lZmZzKCkgPSB2ZWM7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1FVQVRFUk5JT05fSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0dlb21ldHJ5L1JvdGF0aW9uMkQuaCBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9Sb3RhdGlvbjJELmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4ZTJlZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9Sb3RhdGlvbjJELmgKQEAgLTAsMCArMSwxNTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9ST1RBVElPTjJEX0gKKyNkZWZpbmUgRUlHRU5fUk9UQVRJT04yRF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBSb3RhdGlvbjJECisgICoKKyAgKiBcYnJpZWYgUmVwcmVzZW50cyBhIHJvdGF0aW9uL29yaWVudGF0aW9uIGluIGEgMiBkaW1lbnNpb25hbCBzcGFjZS4KKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqCisgICogVGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIHNjYWxhciByZXByZXNlbnRpbmcgYSBjb3VudGVyIGNsb2NrIHdpc2Ugcm90YXRpb24KKyAgKiBhcyBhIHNpbmdsZSBhbmdsZSBpbiByYWRpYW4uIEl0IHByb3ZpZGVzIHNvbWUgYWRkaXRpb25hbCBmZWF0dXJlcyBzdWNoIGFzIHRoZSBhdXRvbWF0aWMKKyAgKiBjb252ZXJzaW9uIGZyb20vdG8gYSAyeDIgcm90YXRpb24gbWF0cml4LiBNb3Jlb3ZlciB0aGlzIGNsYXNzIGFpbXMgdG8gcHJvdmlkZSBhIHNpbWlsYXIKKyAgKiBpbnRlcmZhY2UgdG8gUXVhdGVybmlvbiBpbiBvcmRlciB0byBmYWNpbGl0YXRlIHRoZSB3cml0aW5nIG9mIGdlbmVyaWMgYWxnb3JpdGhtcworICAqIGRlYWxpbmcgd2l0aCByb3RhdGlvbnMuCisgICoKKyAgKiBcc2EgY2xhc3MgUXVhdGVybmlvbiwgY2xhc3MgVHJhbnNmb3JtCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+IHN0cnVjdCB0cmFpdHM8Um90YXRpb24yRDxfU2NhbGFyPiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+CitjbGFzcyBSb3RhdGlvbjJEIDogcHVibGljIFJvdGF0aW9uQmFzZTxSb3RhdGlvbjJEPF9TY2FsYXI+LDI+Cit7CisgIHR5cGVkZWYgUm90YXRpb25CYXNlPFJvdGF0aW9uMkQ8X1NjYWxhcj4sMj4gQmFzZTsKKworcHVibGljOgorCisgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKjsKKworICBlbnVtIHsgRGltID0gMiB9OworICAvKiogdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMT4gVmVjdG9yMjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMj4gTWF0cml4MjsKKworcHJvdGVjdGVkOgorCisgIFNjYWxhciBtX2FuZ2xlOworCitwdWJsaWM6CisKKyAgLyoqIENvbnN0cnVjdCBhIDJEIGNvdW50ZXIgY2xvY2sgd2lzZSByb3RhdGlvbiBmcm9tIHRoZSBhbmdsZSBcYSBhIGluIHJhZGlhbi4gKi8KKyAgaW5saW5lIFJvdGF0aW9uMkQoU2NhbGFyIGEpIDogbV9hbmdsZShhKSB7fQorCisgIC8qKiBccmV0dXJucyB0aGUgcm90YXRpb24gYW5nbGUgKi8KKyAgaW5saW5lIFNjYWxhciBhbmdsZSgpIGNvbnN0IHsgcmV0dXJuIG1fYW5nbGU7IH0KKworICAvKiogXHJldHVybnMgYSByZWFkLXdyaXRlIHJlZmVyZW5jZSB0byB0aGUgcm90YXRpb24gYW5nbGUgKi8KKyAgaW5saW5lIFNjYWxhciYgYW5nbGUoKSB7IHJldHVybiBtX2FuZ2xlOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIHJvdGF0aW9uICovCisgIGlubGluZSBSb3RhdGlvbjJEIGludmVyc2UoKSBjb25zdCB7IHJldHVybiAtbV9hbmdsZTsgfQorCisgIC8qKiBDb25jYXRlbmF0ZXMgdHdvIHJvdGF0aW9ucyAqLworICBpbmxpbmUgUm90YXRpb24yRCBvcGVyYXRvciooY29uc3QgUm90YXRpb24yRCYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fYW5nbGUgKyBvdGhlci5tX2FuZ2xlOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gcm90YXRpb25zICovCisgIGlubGluZSBSb3RhdGlvbjJEJiBvcGVyYXRvcio9KGNvbnN0IFJvdGF0aW9uMkQmIG90aGVyKQorICB7IG1fYW5nbGUgKz0gb3RoZXIubV9hbmdsZTsgcmV0dXJuICp0aGlzOyB9CisKKyAgLyoqIEFwcGxpZXMgdGhlIHJvdGF0aW9uIHRvIGEgMkQgdmVjdG9yICovCisgIFZlY3RvcjIgb3BlcmF0b3IqIChjb25zdCBWZWN0b3IyJiB2ZWMpIGNvbnN0CisgIHsgcmV0dXJuIHRvUm90YXRpb25NYXRyaXgoKSAqIHZlYzsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIFJvdGF0aW9uMkQmIGZyb21Sb3RhdGlvbk1hdHJpeChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKTsKKyAgTWF0cml4MiB0b1JvdGF0aW9uTWF0cml4KHZvaWQpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyB0aGUgc3BoZXJpY2FsIGludGVycG9sYXRpb24gYmV0d2VlbiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIgdXNpbmcKKyAgICAqIHBhcmFtZXRlciBcYSB0LiBJdCBpcyBpbiBmYWN0IGVxdWl2YWxlbnQgdG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAqLworICBpbmxpbmUgUm90YXRpb24yRCBzbGVycChTY2FsYXIgdCwgY29uc3QgUm90YXRpb24yRCYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fYW5nbGUgKiAoMS10KSArIG90aGVyLmFuZ2xlKCkgKiB0OyB9CisKKyAgLyoqIFxyZXR1cm5zIFxjICp0aGlzIHdpdGggc2NhbGFyIHR5cGUgY2FzdGVkIHRvIFxhIE5ld1NjYWxhclR5cGUKKyAgICAqCisgICAgKiBOb3RlIHRoYXQgaWYgXGEgTmV3U2NhbGFyVHlwZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzY2FsYXIgdHlwZSBvZiBcYyAqdGhpcworICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHNtYXJ0bHkgcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBOZXdTY2FsYXJUeXBlPgorICBpbmxpbmUgdHlwZW5hbWUgaW50ZXJuYWw6OmNhc3RfcmV0dXJuX3R5cGU8Um90YXRpb24yRCxSb3RhdGlvbjJEPE5ld1NjYWxhclR5cGU+ID46OnR5cGUgY2FzdCgpIGNvbnN0CisgIHsgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPFJvdGF0aW9uMkQsUm90YXRpb24yRDxOZXdTY2FsYXJUeXBlPiA+Ojp0eXBlKCp0aGlzKTsgfQorCisgIC8qKiBDb3B5IGNvbnN0cnVjdG9yIHdpdGggc2NhbGFyIHR5cGUgY29udmVyc2lvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhclR5cGU+CisgIGlubGluZSBleHBsaWNpdCBSb3RhdGlvbjJEKGNvbnN0IFJvdGF0aW9uMkQ8T3RoZXJTY2FsYXJUeXBlPiYgb3RoZXIpCisgIHsKKyAgICBtX2FuZ2xlID0gU2NhbGFyKG90aGVyLmFuZ2xlKCkpOworICB9CisKKyAgc3RhdGljIGlubGluZSBSb3RhdGlvbjJEIElkZW50aXR5KCkgeyByZXR1cm4gUm90YXRpb24yRCgwKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgYm9vbCBpc0FwcHJveChjb25zdCBSb3RhdGlvbjJEJiBvdGhlciwgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcHJlYyA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KG1fYW5nbGUsb3RoZXIubV9hbmdsZSwgcHJlYyk7IH0KK307CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKiBzaW5nbGUgcHJlY2lzaW9uIDJEIHJvdGF0aW9uIHR5cGUgKi8KK3R5cGVkZWYgUm90YXRpb24yRDxmbG9hdD4gUm90YXRpb24yRGY7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlCisgICogZG91YmxlIHByZWNpc2lvbiAyRCByb3RhdGlvbiB0eXBlICovCit0eXBlZGVmIFJvdGF0aW9uMkQ8ZG91YmxlPiBSb3RhdGlvbjJEZDsKKworLyoqIFNldCBcYyAqdGhpcyBmcm9tIGEgMngyIHJvdGF0aW9uIG1hdHJpeCBcYSBtYXQuCisgICogSW4gb3RoZXIgd29yZHMsIHRoaXMgZnVuY3Rpb24gZXh0cmFjdCB0aGUgcm90YXRpb24gYW5nbGUKKyAgKiBmcm9tIHRoZSByb3RhdGlvbiBtYXRyaXguCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorUm90YXRpb24yRDxTY2FsYXI+JiBSb3RhdGlvbjJEPFNjYWxhcj46OmZyb21Sb3RhdGlvbk1hdHJpeChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtYXQpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWU9PTIgJiYgRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWU9PTIsWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICBtX2FuZ2xlID0gaW50ZXJuYWw6OmF0YW4yKG1hdC5jb2VmZigxLDApLCBtYXQuY29lZmYoMCwwKSk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIENvbnN0cnVjdHMgYW5kIFxyZXR1cm5zIGFuIGVxdWl2YWxlbnQgMngyIHJvdGF0aW9uIG1hdHJpeC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3R5cGVuYW1lIFJvdGF0aW9uMkQ8U2NhbGFyPjo6TWF0cml4MgorUm90YXRpb24yRDxTY2FsYXI+Ojp0b1JvdGF0aW9uTWF0cml4KHZvaWQpIGNvbnN0Cit7CisgIFNjYWxhciBzaW5BID0gaW50ZXJuYWw6OnNpbihtX2FuZ2xlKTsKKyAgU2NhbGFyIGNvc0EgPSBpbnRlcm5hbDo6Y29zKG1fYW5nbGUpOworICByZXR1cm4gKE1hdHJpeDIoKSA8PCBjb3NBLCAtc2luQSwgc2luQSwgY29zQSkuZmluaXNoZWQoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ST1RBVElPTjJEX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9Sb3RhdGlvbkJhc2UuaCBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9Sb3RhdGlvbkJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg2NjFkCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1JvdGF0aW9uQmFzZS5oCkBAIC0wLDAgKzEsMjA2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fUk9UQVRJT05CQVNFX0gKKyNkZWZpbmUgRUlHRU5fUk9UQVRJT05CQVNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb24KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSb3RhdGlvbkRlcml2ZWQsIHR5cGVuYW1lIE1hdHJpeFR5cGUsIGJvb2wgSXNWZWN0b3I9TWF0cml4VHlwZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lPgorc3RydWN0IHJvdGF0aW9uX2Jhc2VfZ2VuZXJpY19wcm9kdWN0X3NlbGVjdG9yOworfQorCisvKiogXGNsYXNzIFJvdGF0aW9uQmFzZQorICAqCisgICogXGJyaWVmIENvbW1vbiBiYXNlIGNsYXNzIGZvciBjb21wYWN0IHJvdGF0aW9uIHJlcHJlc2VudGF0aW9ucworICAqCisgICogXHBhcmFtIERlcml2ZWQgaXMgdGhlIGRlcml2ZWQgdHlwZSwgaS5lLiwgYSByb3RhdGlvbiB0eXBlCisgICogXHBhcmFtIF9EaW0gdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3BhY2UKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIGludCBfRGltPgorY2xhc3MgUm90YXRpb25CYXNlCit7CisgIHB1YmxpYzoKKyAgICBlbnVtIHsgRGltID0gX0RpbSB9OworICAgIC8qKiB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cyAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKworICAgIC8qKiBjb3JyZXNwb25kaW5nIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdHlwZSAqLworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sRGltPiBSb3RhdGlvbk1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERpbSwxPiBWZWN0b3JUeXBlOworCisgIHB1YmxpYzoKKyAgICBpbmxpbmUgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKyAgICBpbmxpbmUgRGVyaXZlZCYgZGVyaXZlZCgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7IH0KKworICAgIC8qKiBccmV0dXJucyBhbiBlcXVpdmFsZW50IHJvdGF0aW9uIG1hdHJpeCAqLworICAgIGlubGluZSBSb3RhdGlvbk1hdHJpeFR5cGUgdG9Sb3RhdGlvbk1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS50b1JvdGF0aW9uTWF0cml4KCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhbiBlcXVpdmFsZW50IHJvdGF0aW9uIG1hdHJpeCAKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCB0byBiZSBjb25mb3JtIHdpdGggdGhlIFRyYW5zZm9ybSBjbGFzcycgbmFtaW5nIHNjaGVtZS4KKyAgICAgICovCisgICAgaW5saW5lIFJvdGF0aW9uTWF0cml4VHlwZSBtYXRyaXgoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkudG9Sb3RhdGlvbk1hdHJpeCgpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGludmVyc2Ugcm90YXRpb24gKi8KKyAgICBpbmxpbmUgRGVyaXZlZCBpbnZlcnNlKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLmludmVyc2UoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSByb3RhdGlvbiBcYyAqdGhpcyB3aXRoIGEgdHJhbnNsYXRpb24gXGEgdCAqLworICAgIGlubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxJc29tZXRyeT4gb3BlcmF0b3IqKGNvbnN0IFRyYW5zbGF0aW9uPFNjYWxhcixEaW0+JiB0KSBjb25zdAorICAgIHsgcmV0dXJuIFRyYW5zZm9ybTxTY2FsYXIsRGltLElzb21ldHJ5PigqdGhpcykgKiB0OyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHJvdGF0aW9uIFxjICp0aGlzIHdpdGggYSB1bmlmb3JtIHNjYWxpbmcgXGEgcyAqLworICAgIGlubGluZSBSb3RhdGlvbk1hdHJpeFR5cGUgb3BlcmF0b3IqKGNvbnN0IFVuaWZvcm1TY2FsaW5nPFNjYWxhcj4mIHMpIGNvbnN0CisgICAgeyByZXR1cm4gdG9Sb3RhdGlvbk1hdHJpeCgpICogcy5mYWN0b3IoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSByb3RhdGlvbiBcYyAqdGhpcyB3aXRoIGEgZ2VuZXJpYyBleHByZXNzaW9uIFxhIGUKKyAgICAgICogXGEgZSBjYW4gYmU6CisgICAgICAqICAtIGEgRGlteERpbSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gbWF0cml4CisgICAgICAqICAtIGEgRGlteERpbSBkaWFnb25hbCBtYXRyaXggKGF4aXMgYWxpZ25lZCBzY2FsaW5nKQorICAgICAgKiAgLSBhIHZlY3RvciBvZiBzaXplIERpbQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBpbnRlcm5hbDo6cm90YXRpb25fYmFzZV9nZW5lcmljX3Byb2R1Y3Rfc2VsZWN0b3I8RGVyaXZlZCxPdGhlckRlcml2ZWQsT3RoZXJEZXJpdmVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWU+OjpSZXR1cm5UeXBlCisgICAgb3BlcmF0b3IqKGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBlKSBjb25zdAorICAgIHsgcmV0dXJuIGludGVybmFsOjpyb3RhdGlvbl9iYXNlX2dlbmVyaWNfcHJvZHVjdF9zZWxlY3RvcjxEZXJpdmVkLE90aGVyRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksIGUuZGVyaXZlZCgpKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgbGluZWFyIHRyYW5zZm9ybWF0aW9uIFxhIGwgd2l0aCB0aGUgcm90YXRpb24gXGEgciAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZnJpZW5kCisgICAgaW5saW5lIFJvdGF0aW9uTWF0cml4VHlwZSBvcGVyYXRvciooY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIGwsIGNvbnN0IERlcml2ZWQmIHIpCisgICAgeyByZXR1cm4gbC5kZXJpdmVkKCkgKiByLnRvUm90YXRpb25NYXRyaXgoKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgc2NhbGluZyBcYSBsIHdpdGggdGhlIHJvdGF0aW9uIFxhIHIgKi8KKyAgICBmcmllbmQgaW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZT4gb3BlcmF0b3IqKGNvbnN0IERpYWdvbmFsTWF0cml4PFNjYWxhcixEaW0+JiBsLCBjb25zdCBEZXJpdmVkJiByKQorICAgIHsgCisgICAgICBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmU+IHJlcyhyKTsKKyAgICAgIHJlcy5saW5lYXIoKS5hcHBseU9uVGhlTGVmdChsKTsKKyAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSByb3RhdGlvbiBcYyAqdGhpcyB3aXRoIGEgdHJhbnNmb3JtYXRpb24gXGEgdCAqLworICAgIHRlbXBsYXRlPGludCBNb2RlLCBpbnQgT3B0aW9ucz4KKyAgICBpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZT4gb3BlcmF0b3IqKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIHQpIGNvbnN0CisgICAgeyByZXR1cm4gdG9Sb3RhdGlvbk1hdHJpeCgpICogdDsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJWZWN0b3JUeXBlPgorICAgIGlubGluZSBWZWN0b3JUeXBlIF90cmFuc2Zvcm1WZWN0b3IoY29uc3QgT3RoZXJWZWN0b3JUeXBlJiB2KSBjb25zdAorICAgIHsgcmV0dXJuIHRvUm90YXRpb25NYXRyaXgoKSAqIHY7IH0KK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBnZW5lcmljIHByb2R1Y3Qgcm90YXRpb24gKiBtYXRyaXgKK3RlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uRGVyaXZlZCwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCByb3RhdGlvbl9iYXNlX2dlbmVyaWNfcHJvZHVjdF9zZWxlY3RvcjxSb3RhdGlvbkRlcml2ZWQsTWF0cml4VHlwZSxmYWxzZT4KK3sKKyAgZW51bSB7IERpbSA9IFJvdGF0aW9uRGVyaXZlZDo6RGltIH07CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIFJvdGF0aW9uRGVyaXZlZDo6U2NhbGFyLERpbSxEaW0+IFJldHVyblR5cGU7CisgIHN0YXRpYyBpbmxpbmUgUmV0dXJuVHlwZSBydW4oY29uc3QgUm90YXRpb25EZXJpdmVkJiByLCBjb25zdCBNYXRyaXhUeXBlJiBtKQorICB7IHJldHVybiByLnRvUm90YXRpb25NYXRyaXgoKSAqIG07IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uRGVyaXZlZCwgdHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTWF4RGltPgorc3RydWN0IHJvdGF0aW9uX2Jhc2VfZ2VuZXJpY19wcm9kdWN0X3NlbGVjdG9yPCBSb3RhdGlvbkRlcml2ZWQsIERpYWdvbmFsTWF0cml4PFNjYWxhcixEaW0sTWF4RGltPiwgZmFsc2UgPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZT4gUmV0dXJuVHlwZTsKKyAgc3RhdGljIGlubGluZSBSZXR1cm5UeXBlIHJ1bihjb25zdCBSb3RhdGlvbkRlcml2ZWQmIHIsIGNvbnN0IERpYWdvbmFsTWF0cml4PFNjYWxhcixEaW0sTWF4RGltPiYgbSkKKyAgeworICAgIFJldHVyblR5cGUgcmVzKHIpOworICAgIHJlcy5saW5lYXIoKSAqPSBtOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uRGVyaXZlZCx0eXBlbmFtZSBPdGhlclZlY3RvclR5cGU+CitzdHJ1Y3Qgcm90YXRpb25fYmFzZV9nZW5lcmljX3Byb2R1Y3Rfc2VsZWN0b3I8Um90YXRpb25EZXJpdmVkLE90aGVyVmVjdG9yVHlwZSx0cnVlPgoreworICBlbnVtIHsgRGltID0gUm90YXRpb25EZXJpdmVkOjpEaW0gfTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgUm90YXRpb25EZXJpdmVkOjpTY2FsYXIsRGltLDE+IFJldHVyblR5cGU7CisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFJldHVyblR5cGUgcnVuKGNvbnN0IFJvdGF0aW9uRGVyaXZlZCYgciwgY29uc3QgT3RoZXJWZWN0b3JUeXBlJiB2KQorICB7CisgICAgcmV0dXJuIHIuX3RyYW5zZm9ybVZlY3Rvcih2KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlCisgICoKKyAgKiBcYnJpZWYgQ29uc3RydWN0cyBhIERpbSB4IERpbSByb3RhdGlvbiBtYXRyaXggZnJvbSB0aGUgcm90YXRpb24gXGEgcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfU3RvcmFnZSwgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfU3RvcmFnZSwgX01heFJvd3MsIF9NYXhDb2xzPgorOjpNYXRyaXgoY29uc3QgUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxDb2xzQXRDb21waWxlVGltZT4mIHIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTUFUUklYX1NQRUNJRklDX1NJWkUoTWF0cml4LGludChPdGhlckRlcml2ZWQ6OkRpbSksaW50KE90aGVyRGVyaXZlZDo6RGltKSkKKyAgKnRoaXMgPSByLnRvUm90YXRpb25NYXRyaXgoKTsKK30KKworLyoqIFxnZW9tZXRyeV9tb2R1bGUKKyAgKgorICAqIFxicmllZiBTZXQgYSBEaW0geCBEaW0gcm90YXRpb24gbWF0cml4IGZyb20gdGhlIHJvdGF0aW9uIFxhIHIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzLCBpbnQgX1N0b3JhZ2UsIGludCBfTWF4Um93cywgaW50IF9NYXhDb2xzPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorTWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX1N0b3JhZ2UsIF9NYXhSb3dzLCBfTWF4Q29scz4mCitNYXRyaXg8X1NjYWxhciwgX1Jvd3MsIF9Db2xzLCBfU3RvcmFnZSwgX01heFJvd3MsIF9NYXhDb2xzPgorOjpvcGVyYXRvcj0oY29uc3QgUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxDb2xzQXRDb21waWxlVGltZT4mIHIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfTUFUUklYX1NQRUNJRklDX1NJWkUoTWF0cml4LGludChPdGhlckRlcml2ZWQ6OkRpbSksaW50KE90aGVyRGVyaXZlZDo6RGltKSkKKyAgcmV0dXJuICp0aGlzID0gci50b1JvdGF0aW9uTWF0cml4KCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwKKyAgKgorICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXR1cm4gYW4gYXJiaXRyYXJ5IHJvdGF0aW9uIG9iamVjdCB0byBhIHJvdGF0aW9uIG1hdHJpeC4KKyAgKgorICAqIFxwYXJhbSBTY2FsYXIgdGhlIG51bWVyaWMgdHlwZSBvZiB0aGUgbWF0cml4IGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBEaW0gdGhlIGRpbWVuc2lvbiBvZiB0aGUgY3VycmVudCBzcGFjZQorICAqCisgICogSXQgcmV0dXJucyBhIERpbSB4IERpbSBmaXhlZCBzaXplIG1hdHJpeC4KKyAgKgorICAqIERlZmF1bHQgc3BlY2lhbGl6YXRpb25zIGFyZSBwcm92aWRlZCBmb3I6CisgICogICAtIGFueSBzY2FsYXIgdHlwZSAoMkQpLAorICAqICAgLSBhbnkgbWF0cml4IGV4cHJlc3Npb24sCisgICogICAtIGFueSB0eXBlIGJhc2VkIG9uIFJvdGF0aW9uQmFzZSAoZS5nLiwgUXVhdGVybmlvbiwgQW5nbGVBeGlzLCBSb3RhdGlvbjJEKQorICAqCisgICogQ3VycmVudGx5IHRvUm90YXRpb25NYXRyaXggaXMgb25seSB1c2VkIGJ5IFRyYW5zZm9ybS4KKyAgKgorICAqIFxzYSBjbGFzcyBUcmFuc2Zvcm0sIGNsYXNzIFJvdGF0aW9uMkQsIGNsYXNzIFF1YXRlcm5pb24sIGNsYXNzIEFuZ2xlQXhpcworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgorc3RhdGljIGlubGluZSBNYXRyaXg8U2NhbGFyLDIsMj4gdG9Sb3RhdGlvbk1hdHJpeChjb25zdCBTY2FsYXImIHMpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRGltPT0yLFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgcmV0dXJuIFJvdGF0aW9uMkQ8U2NhbGFyPihzKS50b1JvdGF0aW9uTWF0cml4KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorc3RhdGljIGlubGluZSBNYXRyaXg8U2NhbGFyLERpbSxEaW0+IHRvUm90YXRpb25NYXRyaXgoY29uc3QgUm90YXRpb25CYXNlPE90aGVyRGVyaXZlZCxEaW0+JiByKQoreworICByZXR1cm4gci50b1JvdGF0aW9uTWF0cml4KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorc3RhdGljIGlubGluZSBjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIHRvUm90YXRpb25NYXRyaXgoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBtYXQpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoT3RoZXJEZXJpdmVkOjpSb3dzQXRDb21waWxlVGltZT09RGltICYmIE90aGVyRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWU9PURpbSwKKyAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgIHJldHVybiBtYXQ7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1JPVEFUSU9OQkFTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvR2VvbWV0cnkvU2NhbGluZy5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1NjYWxpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRjYWMzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1NjYWxpbmcuaApAQCAtMCwwICsxLDE2NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NDQUxJTkdfSAorI2RlZmluZSBFSUdFTl9TQ0FMSU5HX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorICAqCisgICogXGNsYXNzIFNjYWxpbmcKKyAgKgorICAqIFxicmllZiBSZXByZXNlbnRzIGEgZ2VuZXJpYyB1bmlmb3JtIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24KKyAgKgorICAqIFxwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cy4KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdW5pZm9ybSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uLiBJdCBpcyB0aGUgcmV0dXJuCisgICogdHlwZSBvZiBTY2FsaW5nKFNjYWxhciksIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0CisgICogaXMgdXNlZC4gSW4gcGFydGljdWxhciwgdGhpcyBjbGFzcyBpcyBub3QgYWltZWQgdG8gYmUgdXNlZCB0byBzdG9yZSBhIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24sCisgICogYnV0IHJhdGhlciB0byBtYWtlIGVhc2llciB0aGUgY29uc3RydWN0aW9ucyBhbmQgdXBkYXRlcyBvZiBUcmFuc2Zvcm0gb2JqZWN0cy4KKyAgKgorICAqIFRvIHJlcHJlc2VudCBhbiBheGlzIGFsaWduZWQgc2NhbGluZywgdXNlIHRoZSBEaWFnb25hbE1hdHJpeCBjbGFzcy4KKyAgKgorICAqIFxzYSBTY2FsaW5nKCksIGNsYXNzIERpYWdvbmFsTWF0cml4LCBNYXRyaXhCYXNlOjphc0RpYWdvbmFsKCksIGNsYXNzIFRyYW5zbGF0aW9uLCBjbGFzcyBUcmFuc2Zvcm0KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+CitjbGFzcyBVbmlmb3JtU2NhbGluZworeworcHVibGljOgorICAvKiogdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKworcHJvdGVjdGVkOgorCisgIFNjYWxhciBtX2ZhY3RvcjsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uICovCisgIFVuaWZvcm1TY2FsaW5nKCkge30KKyAgLyoqIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemUgYSB1bmlmb3JtIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gKi8KKyAgZXhwbGljaXQgaW5saW5lIFVuaWZvcm1TY2FsaW5nKGNvbnN0IFNjYWxhciYgcykgOiBtX2ZhY3RvcihzKSB7fQorCisgIGlubGluZSBjb25zdCBTY2FsYXImIGZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fZmFjdG9yOyB9CisgIGlubGluZSBTY2FsYXImIGZhY3RvcigpIHsgcmV0dXJuIG1fZmFjdG9yOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gdW5pZm9ybSBzY2FsaW5nICovCisgIGlubGluZSBVbmlmb3JtU2NhbGluZyBvcGVyYXRvciogKGNvbnN0IFVuaWZvcm1TY2FsaW5nJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gVW5pZm9ybVNjYWxpbmcobV9mYWN0b3IgKiBvdGhlci5mYWN0b3IoKSk7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIGEgdW5pZm9ybSBzY2FsaW5nIGFuZCBhIHRyYW5zbGF0aW9uICovCisgIHRlbXBsYXRlPGludCBEaW0+CisgIGlubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmU+IG9wZXJhdG9yKiAoY29uc3QgVHJhbnNsYXRpb248U2NhbGFyLERpbT4mIHQpIGNvbnN0OworCisgIC8qKiBDb25jYXRlbmF0ZXMgYSB1bmlmb3JtIHNjYWxpbmcgYW5kIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiAqLworICB0ZW1wbGF0ZTxpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+CisgIGlubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbSwoaW50KE1vZGUpPT1pbnQoSXNvbWV0cnkpP0FmZmluZTpNb2RlKT4gb3BlcmF0b3IqIChjb25zdCBUcmFuc2Zvcm08U2NhbGFyLERpbSwgTW9kZSwgT3B0aW9ucz4mIHQpIGNvbnN0CisgIHsKKyAgIFRyYW5zZm9ybTxTY2FsYXIsRGltLChpbnQoTW9kZSk9PWludChJc29tZXRyeSk/QWZmaW5lOk1vZGUpPiByZXMgPSB0OworICAgcmVzLnByZXNjYWxlKGZhY3RvcigpKTsKKyAgIHJldHVybiByZXM7Cit9CisKKyAgLyoqIENvbmNhdGVuYXRlcyBhIHVuaWZvcm0gc2NhbGluZyBhbmQgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gbWF0cml4ICovCisgIC8vIFRPRE8gcmV0dXJucyBhbiBleHByZXNzaW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fbWF0cml4X3R5cGU8RGVyaXZlZD46OnR5cGUgb3BlcmF0b3IqIChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gb3RoZXIgKiBtX2ZhY3RvcjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsaW50IERpbT4KKyAgaW5saW5lIE1hdHJpeDxTY2FsYXIsRGltLERpbT4gb3BlcmF0b3IqKGNvbnN0IFJvdGF0aW9uQmFzZTxEZXJpdmVkLERpbT4mIHIpIGNvbnN0CisgIHsgcmV0dXJuIHIudG9Sb3RhdGlvbk1hdHJpeCgpICogbV9mYWN0b3I7IH0KKworICAvKiogXHJldHVybnMgdGhlIGludmVyc2Ugc2NhbGluZyAqLworICBpbmxpbmUgVW5pZm9ybVNjYWxpbmcgaW52ZXJzZSgpIGNvbnN0CisgIHsgcmV0dXJuIFVuaWZvcm1TY2FsaW5nKFNjYWxhcigxKS9tX2ZhY3Rvcik7IH0KKworICAvKiogXHJldHVybnMgXGMgKnRoaXMgd2l0aCBzY2FsYXIgdHlwZSBjYXN0ZWQgdG8gXGEgTmV3U2NhbGFyVHlwZQorICAgICoKKyAgICAqIE5vdGUgdGhhdCBpZiBcYSBOZXdTY2FsYXJUeXBlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHNjYWxhciB0eXBlIG9mIFxjICp0aGlzCisgICAgKiB0aGVuIHRoaXMgZnVuY3Rpb24gc21hcnRseSByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1NjYWxhclR5cGU+CisgIGlubGluZSBVbmlmb3JtU2NhbGluZzxOZXdTY2FsYXJUeXBlPiBjYXN0KCkgY29uc3QKKyAgeyByZXR1cm4gVW5pZm9ybVNjYWxpbmc8TmV3U2NhbGFyVHlwZT4oTmV3U2NhbGFyVHlwZShtX2ZhY3RvcikpOyB9CisKKyAgLyoqIENvcHkgY29uc3RydWN0b3Igd2l0aCBzY2FsYXIgdHlwZSBjb252ZXJzaW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZT4KKyAgaW5saW5lIGV4cGxpY2l0IFVuaWZvcm1TY2FsaW5nKGNvbnN0IFVuaWZvcm1TY2FsaW5nPE90aGVyU2NhbGFyVHlwZT4mIG90aGVyKQorICB7IG1fZmFjdG9yID0gU2NhbGFyKG90aGVyLmZhY3RvcigpKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgYm9vbCBpc0FwcHJveChjb25zdCBVbmlmb3JtU2NhbGluZyYgb3RoZXIsIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgIHsgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChtX2ZhY3Rvciwgb3RoZXIuZmFjdG9yKCksIHByZWMpOyB9CisKK307CisKKy8qKiBDb25jYXRlbmF0ZXMgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gbWF0cml4IGFuZCBhIHVuaWZvcm0gc2NhbGluZyAqLworLy8gTk9URSB0aGlzIG9wZXJhdG9yIGlzIGRlZmllbmQgaW4gTWF0cml4QmFzZSBhbmQgbm90IGFzIGEgZnJpZW5kIGZ1bmN0aW9uCisvLyBvZiBVbmlmb3JtU2NhbGluZyB0byBmaXggYW4gaW50ZXJuYWwgY3Jhc2ggb2YgSW50ZWwncyBJQ0MKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlNjYWxhck11bHRpcGxlUmV0dXJuVHlwZQorTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IqKGNvbnN0IFVuaWZvcm1TY2FsaW5nPFNjYWxhcj4mIHMpIGNvbnN0Cit7IHJldHVybiBkZXJpdmVkKCkgKiBzLmZhY3RvcigpOyB9CisKKy8qKiBDb25zdHJ1Y3RzIGEgdW5pZm9ybSBzY2FsaW5nIGZyb20gc2NhbGUgZmFjdG9yIFxhIHMgKi8KK3N0YXRpYyBpbmxpbmUgVW5pZm9ybVNjYWxpbmc8ZmxvYXQ+IFNjYWxpbmcoZmxvYXQgcykgeyByZXR1cm4gVW5pZm9ybVNjYWxpbmc8ZmxvYXQ+KHMpOyB9CisvKiogQ29uc3RydWN0cyBhIHVuaWZvcm0gc2NhbGluZyBmcm9tIHNjYWxlIGZhY3RvciBcYSBzICovCitzdGF0aWMgaW5saW5lIFVuaWZvcm1TY2FsaW5nPGRvdWJsZT4gU2NhbGluZyhkb3VibGUgcykgeyByZXR1cm4gVW5pZm9ybVNjYWxpbmc8ZG91YmxlPihzKTsgfQorLyoqIENvbnN0cnVjdHMgYSB1bmlmb3JtIHNjYWxpbmcgZnJvbSBzY2FsZSBmYWN0b3IgXGEgcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgUmVhbFNjYWxhcj4KK3N0YXRpYyBpbmxpbmUgVW5pZm9ybVNjYWxpbmc8c3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+ID4gU2NhbGluZyhjb25zdCBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4mIHMpCit7IHJldHVybiBVbmlmb3JtU2NhbGluZzxzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gPihzKTsgfQorCisvKiogQ29uc3RydWN0cyBhIDJEIGF4aXMgYWxpZ25lZCBzY2FsaW5nICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CitzdGF0aWMgaW5saW5lIERpYWdvbmFsTWF0cml4PFNjYWxhciwyPiBTY2FsaW5nKFNjYWxhciBzeCwgU2NhbGFyIHN5KQoreyByZXR1cm4gRGlhZ29uYWxNYXRyaXg8U2NhbGFyLDI+KHN4LCBzeSk7IH0KKy8qKiBDb25zdHJ1Y3RzIGEgM0QgYXhpcyBhbGlnbmVkIHNjYWxpbmcgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3N0YXRpYyBpbmxpbmUgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLDM+IFNjYWxpbmcoU2NhbGFyIHN4LCBTY2FsYXIgc3ksIFNjYWxhciBzeikKK3sgcmV0dXJuIERpYWdvbmFsTWF0cml4PFNjYWxhciwzPihzeCwgc3ksIHN6KTsgfQorCisvKiogQ29uc3RydWN0cyBhbiBheGlzIGFsaWduZWQgc2NhbGluZyBleHByZXNzaW9uIGZyb20gdmVjdG9yIGV4cHJlc3Npb24gXGEgY29lZmZzCisgICogVGhpcyBpcyBhbiBhbGlhcyBmb3IgY29lZmZzLmFzRGlhZ29uYWwoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0YXRpYyBpbmxpbmUgY29uc3QgRGlhZ29uYWxXcmFwcGVyPGNvbnN0IERlcml2ZWQ+IFNjYWxpbmcoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgY29lZmZzKQoreyByZXR1cm4gY29lZmZzLmFzRGlhZ29uYWwoKTsgfQorCisvKiogXGFkZHRvZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCisvL0B7CisvKiogXGRlcHJlY2F0ZWQgKi8KK3R5cGVkZWYgRGlhZ29uYWxNYXRyaXg8ZmxvYXQsIDI+IEFsaWduZWRTY2FsaW5nMmY7CisvKiogXGRlcHJlY2F0ZWQgKi8KK3R5cGVkZWYgRGlhZ29uYWxNYXRyaXg8ZG91YmxlLDI+IEFsaWduZWRTY2FsaW5nMmQ7CisvKiogXGRlcHJlY2F0ZWQgKi8KK3R5cGVkZWYgRGlhZ29uYWxNYXRyaXg8ZmxvYXQsIDM+IEFsaWduZWRTY2FsaW5nM2Y7CisvKiogXGRlcHJlY2F0ZWQgKi8KK3R5cGVkZWYgRGlhZ29uYWxNYXRyaXg8ZG91YmxlLDM+IEFsaWduZWRTY2FsaW5nM2Q7CisvL0B9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3RlbXBsYXRlPGludCBEaW0+CitpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lPgorVW5pZm9ybVNjYWxpbmc8U2NhbGFyPjo6b3BlcmF0b3IqIChjb25zdCBUcmFuc2xhdGlvbjxTY2FsYXIsRGltPiYgdCkgY29uc3QKK3sKKyAgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lPiByZXM7CisgIHJlcy5tYXRyaXgoKS5zZXRaZXJvKCk7CisgIHJlcy5saW5lYXIoKS5kaWFnb25hbCgpLmZpbGwoZmFjdG9yKCkpOworICByZXMudHJhbnNsYXRpb24oKSA9IGZhY3RvcigpICogdC52ZWN0b3IoKTsKKyAgcmVzKERpbSxEaW0pID0gU2NhbGFyKDEpOworICByZXR1cm4gcmVzOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NDQUxJTkdfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0dlb21ldHJ5L1RyYW5zZm9ybS5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1RyYW5zZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWVmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvR2VvbWV0cnkvVHJhbnNmb3JtLmgKQEAgLTAsMCArMSwxNDQwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RSQU5TRk9STV9ICisjZGVmaW5lIEVJR0VOX1RSQU5TRk9STV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm0+CitzdHJ1Y3QgdHJhbnNmb3JtX3RyYWl0cworeworICBlbnVtCisgIHsKKyAgICBEaW0gPSBUcmFuc2Zvcm06OkRpbSwKKyAgICBIRGltID0gVHJhbnNmb3JtOjpIRGltLAorICAgIE1vZGUgPSBUcmFuc2Zvcm06Ok1vZGUsCisgICAgSXNQcm9qZWN0aXZlID0gKGludChNb2RlKT09aW50KFByb2plY3RpdmUpKQorICB9OworfTsKKwordGVtcGxhdGU8IHR5cGVuYW1lIFRyYW5zZm9ybVR5cGUsCisgICAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZSwKKyAgICAgICAgICBpbnQgQ2FzZSA9IHRyYW5zZm9ybV90cmFpdHM8VHJhbnNmb3JtVHlwZT46OklzUHJvamVjdGl2ZSA/IDAKKyAgICAgICAgICAgICAgICAgICA6IGludChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSkgPT0gaW50KHRyYW5zZm9ybV90cmFpdHM8VHJhbnNmb3JtVHlwZT46OkhEaW0pID8gMQorICAgICAgICAgICAgICAgICAgIDogMj4KK3N0cnVjdCB0cmFuc2Zvcm1fcmlnaHRfcHJvZHVjdF9pbXBsOworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXIsCisgICAgICAgICAgaW50IE1vZGUsCisgICAgICAgICAgaW50IE9wdGlvbnMsCisgICAgICAgICAgaW50IERpbSwKKyAgICAgICAgICBpbnQgSERpbSwKKyAgICAgICAgICBpbnQgT3RoZXJSb3dzPU90aGVyOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICBpbnQgT3RoZXJDb2xzPU90aGVyOjpDb2xzQXRDb21waWxlVGltZT4KK3N0cnVjdCB0cmFuc2Zvcm1fbGVmdF9wcm9kdWN0X2ltcGw7CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBMaHMsCisgICAgICAgICAgdHlwZW5hbWUgUmhzLAorICAgICAgICAgIGJvb2wgQW55UHJvamVjdGl2ZSA9IAorICAgICAgICAgICAgdHJhbnNmb3JtX3RyYWl0czxMaHM+OjpJc1Byb2plY3RpdmUgfHwKKyAgICAgICAgICAgIHRyYW5zZm9ybV90cmFpdHM8UmhzPjo6SXNQcm9qZWN0aXZlPgorc3RydWN0IHRyYW5zZm9ybV90cmFuc2Zvcm1fcHJvZHVjdF9pbXBsOworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXIsCisgICAgICAgICAgaW50IE1vZGUsCisgICAgICAgICAgaW50IE9wdGlvbnMsCisgICAgICAgICAgaW50IERpbSwKKyAgICAgICAgICBpbnQgSERpbSwKKyAgICAgICAgICBpbnQgT3RoZXJSb3dzPU90aGVyOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgICBpbnQgT3RoZXJDb2xzPU90aGVyOjpDb2xzQXRDb21waWxlVGltZT4KK3N0cnVjdCB0cmFuc2Zvcm1fY29uc3RydWN0X2Zyb21fbWF0cml4OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPiBzdHJ1Y3QgdHJhbnNmb3JtX3Rha2VfYWZmaW5lX3BhcnQ7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBUcmFuc2Zvcm0KKyAgKgorICAqIFxicmllZiBSZXByZXNlbnRzIGFuIGhvbW9nZW5lb3VzIHRyYW5zZm9ybWF0aW9uIGluIGEgTiBkaW1lbnNpb25hbCBzcGFjZQorICAqCisgICogXHRwYXJhbSBfU2NhbGFyIHRoZSBzY2FsYXIgdHlwZSwgaS5lLiwgdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqIFx0cGFyYW0gX0RpbSB0aGUgZGltZW5zaW9uIG9mIHRoZSBzcGFjZQorICAqIFx0cGFyYW0gX01vZGUgdGhlIHR5cGUgb2YgdGhlIHRyYW5zZm9ybWF0aW9uLiBDYW4gYmU6CisgICogICAgICAgICAgICAgIC0gI0FmZmluZTogdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHN0b3JlZCBhcyBhIChEaW0rMSleMiBtYXRyaXgsCisgICogICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdGhlIGxhc3Qgcm93IGlzIGFzc3VtZWQgdG8gYmUgWzAgLi4uIDAgMV0uCisgICogICAgICAgICAgICAgIC0gI0FmZmluZUNvbXBhY3Q6IHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBzdG9yZWQgYXMgYSAoRGltKXgoRGltKzEpIG1hdHJpeC4KKyAgKiAgICAgICAgICAgICAgLSAjUHJvamVjdGl2ZTogdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHN0b3JlZCBhcyBhIChEaW0rMSleMiBtYXRyaXgKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBhbnkgYXNzdW1wdGlvbi4KKyAgKiBcdHBhcmFtIF9PcHRpb25zIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGNsYXNzIE1hdHJpeC4gSXQgYWxsb3dzIHRvIHNwZWNpZnkgRG9udEFsaWduIGFuZC9vciBSb3dNYWpvci4KKyAgKiAgICAgICAgICAgICAgICAgIFRoZXNlIE9wdGlvbnMgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgdW5kZXJseWluZyBtYXRyaXggdHlwZS4KKyAgKgorICAqIFRoZSBob21vZ3JhcGh5IGlzIGludGVybmFsbHkgcmVwcmVzZW50ZWQgYW5kIHN0b3JlZCBieSBhIG1hdHJpeCB3aGljaAorICAqIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBtYXRyaXgoKSBtZXRob2QuIFRvIHVuZGVyc3RhbmQgdGhlIGJlaGF2aW9yIG9mCisgICogdGhpcyBjbGFzcyB5b3UgaGF2ZSB0byB0aGluayBhIFRyYW5zZm9ybSBvYmplY3QgYXMgaXRzIGludGVybmFsCisgICogbWF0cml4IHJlcHJlc2VudGF0aW9uLiBUaGUgY2hvc2VuIGNvbnZlbnRpb24gaXMgcmlnaHQgbXVsdGlwbHk6CisgICoKKyAgKiBcY29kZSB2JyA9IFQgKiB2IFxlbmRjb2RlCisgICoKKyAgKiBUaGVyZWZvcmUsIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggTSBpcyBzaGFwZWQgbGlrZSB0aGlzOgorICAqCisgICogXGYkIFxsZWZ0KCBcYmVnaW57YXJyYXl9e2NjfQorICAqIGxpbmVhciAmIHRyYW5zbGF0aW9uXFwKKyAgKiAwIC4uLiAwICYgMQorICAqIFxlbmR7YXJyYXl9IFxyaWdodCkgXGYkCisgICoKKyAgKiBOb3RlIHRoYXQgZm9yIGEgcHJvamVjdGl2ZSB0cmFuc2Zvcm1hdGlvbiB0aGUgbGFzdCByb3cgY2FuIGJlIGFueXRoaW5nLAorICAqIGFuZCB0aGVuIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBkaWZmZXJlbnQgcGFydHMgbWlnaHQgYmUgc2lnaHRseSBkaWZmZXJlbnQuCisgICoKKyAgKiBIb3dldmVyLCB1bmxpa2UgYSBwbGFpbiBtYXRyaXgsIHRoZSBUcmFuc2Zvcm0gY2xhc3MgcHJvdmlkZXMgbWFueSBmZWF0dXJlcworICAqIHNpbXBsaWZ5aW5nIGJvdGggaXRzIGFzc2VtYmx5IGFuZCB1c2FnZS4gSW4gcGFydGljdWxhciwgaXQgY2FuIGJlIGNvbXBvc2VkCisgICogd2l0aCBhbnkgb3RoZXIgdHJhbnNmb3JtYXRpb25zIChUcmFuc2Zvcm0sVHJhbnNsYXRpb24sUm90YXRpb25CYXNlLE1hdHJpeCkKKyAgKiBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgdG8gdHJhbnNmb3JtIGltcGxpY2l0IGhvbW9nZW5lb3VzIHZlY3RvcnMuIEFsbCB0aGVzZQorICAqIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgdmlhIHRoZSBvcGVyYXRvciouIEZvciB0aGUgY29tcG9zaXRpb24gb2YgdHJhbnNmb3JtYXRpb25zLAorICAqIGl0cyBwcmluY2lwbGUgY29uc2lzdHMgdG8gZmlyc3QgY29udmVydCB0aGUgcmlnaHQvbGVmdCBoYW5kIHNpZGVzIG9mIHRoZSBwcm9kdWN0CisgICogdG8gYSBjb21wYXRpYmxlIChEaW0rMSleMiBtYXRyaXggYW5kIHRoZW4gcGVyZm9ybSBhIHB1cmUgbWF0cml4IHByb2R1Y3QuCisgICogT2YgY291cnNlLCBpbnRlcm5hbGx5LCBvcGVyYXRvciogdHJpZXMgdG8gcGVyZm9ybSB0aGUgbWluaW1hbCBudW1iZXIgb2Ygb3BlcmF0aW9ucworICAqIGFjY29yZGluZyB0byB0aGUgbmF0dXJlIG9mIGVhY2ggdGVybXMuIExpa2V3aXNlLCB3aGVuIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm0KKyAgKiB0byBub24gaG9tb2dlbmVvdXMgdmVjdG9ycywgdGhlIGxhdHRlcnMgYXJlIGF1dG9tYXRpY2FsbHkgcHJvbW90ZWQgdG8gaG9tb2dlbmVvdXMKKyAgKiBvbmUgYmVmb3JlIGRvaW5nIHRoZSBtYXRyaXggcHJvZHVjdC4gVGhlIGNvbnZlcnRpb25zIHRvIGhvbW9nZW5lb3VzIHJlcHJlc2VudGF0aW9ucworICAqIGFyZSBwZXJmb3JtZWQgYXMgZm9sbG93OgorICAqCisgICogXGIgVHJhbnNsYXRpb24gdCAoRGltKXgoMSk6CisgICogXGYkIFxsZWZ0KCBcYmVnaW57YXJyYXl9e2NjfQorICAqIEkgJiB0IFxcCisgICogMFwsLi4uXCwwICYgMQorICAqIFxlbmR7YXJyYXl9IFxyaWdodCkgXGYkCisgICoKKyAgKiBcYiBSb3RhdGlvbiBSIChEaW0peChEaW0pOgorICAqIFxmJCBcbGVmdCggXGJlZ2lue2FycmF5fXtjY30KKyAgKiBSICYgMFxcCisgICogMFwsLi4uXCwwICYgMQorICAqIFxlbmR7YXJyYXl9IFxyaWdodCkgXGYkCisgICoKKyAgKiBcYiBMaW5lYXIgXGIgTWF0cml4IEwgKERpbSl4KERpbSk6CisgICogXGYkIFxsZWZ0KCBcYmVnaW57YXJyYXl9e2NjfQorICAqIEwgJiAwXFwKKyAgKiAwXCwuLi5cLDAgJiAxCisgICogXGVuZHthcnJheX0gXHJpZ2h0KSBcZiQKKyAgKgorICAqIFxiIEFmZmluZSBcYiBNYXRyaXggQSAoRGltKXgoRGltKzEpOgorICAqIFxmJCBcbGVmdCggXGJlZ2lue2FycmF5fXtjfQorICAqIEFcXAorICAqIDBcLC4uLlwsMFwsMQorICAqIFxlbmR7YXJyYXl9IFxyaWdodCkgXGYkCisgICoKKyAgKiBcYiBDb2x1bW4gXGIgdmVjdG9yIHYgKERpbSl4KDEpOgorICAqIFxmJCBcbGVmdCggXGJlZ2lue2FycmF5fXtjfQorICAqIHZcXAorICAqIDEKKyAgKiBcZW5ke2FycmF5fSBccmlnaHQpIFxmJAorICAqCisgICogXGIgU2V0IFxiIG9mIFxiIGNvbHVtbiBcYiB2ZWN0b3JzIFYxLi4uVm4gKERpbSl4KG4pOgorICAqIFxmJCBcbGVmdCggXGJlZ2lue2FycmF5fXtjY2N9CisgICogdl8xICYgLi4uICYgdl9uXFwKKyAgKiAxICYgLi4uICYgMQorICAqIFxlbmR7YXJyYXl9IFxyaWdodCkgXGYkCisgICoKKyAgKiBUaGUgY29uY2F0ZW5hdGlvbiBvZiBhIFRyYW5zZm9ybSBvYmplY3Qgd2l0aCBhbnkga2luZCBvZiBvdGhlciB0cmFuc2Zvcm1hdGlvbgorICAqIGFsd2F5cyByZXR1cm5zIGEgVHJhbnNmb3JtIG9iamVjdC4KKyAgKgorICAqIEEgbGl0dGxlIGV4Y2VwdGlvbiB0byB0aGUgImFzIHB1cmUgbWF0cml4IHByb2R1Y3QiIHJ1bGUgaXMgdGhlIGNhc2Ugb2YgdGhlCisgICogdHJhbnNmb3JtYXRpb24gb2Ygbm9uIGhvbW9nZW5lb3VzIHZlY3RvcnMgYnkgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uLiBJbgorICAqIHRoYXQgY2FzZSB0aGUgbGFzdCBtYXRyaXggcm93IGNhbiBiZSBpZ25vcmVkLCBhbmQgdGhlIHByb2R1Y3QgcmV0dXJucyBub24KKyAgKiBob21vZ2VuZW91cyB2ZWN0b3JzLgorICAqCisgICogU2luY2UsIGZvciBpbnN0YW5jZSwgYSBEaW0geCBEaW0gbWF0cml4IGlzIGludGVycHJldGVkIGFzIGEgbGluZWFyIHRyYW5zZm9ybWF0aW9uLAorICAqIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkaXJlY3RseSB0cmFuc2Zvcm0gRGltIHZlY3RvcnMgc3RvcmVkIGluIGEgRGltIHggRGltIG1hdHJpeC4KKyAgKiBUaGUgc29sdXRpb24gaXMgZWl0aGVyIHRvIHVzZSBhIERpbSB4IER5bmFtaWMgbWF0cml4IG9yIGV4cGxpY2l0bHkgcmVxdWVzdCBhCisgICogdmVjdG9yIHRyYW5zZm9ybWF0aW9uIGJ5IG1ha2luZyB0aGUgdmVjdG9yIGhvbW9nZW5lb3VzOgorICAqIFxjb2RlCisgICogbScgPSBUICogbS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKTsKKyAgKiBcZW5kY29kZQorICAqIE5vdGUgdGhhdCB0aGVyZSBpcyB6ZXJvIG92ZXJoZWFkLgorICAqCisgICogQ29udmVyc2lvbiBtZXRob2RzIGZyb20vdG8gUXQncyBRTWF0cml4IGFuZCBRVHJhbnNmb3JtIGFyZSBhdmFpbGFibGUgaWYgdGhlCisgICogcHJlcHJvY2Vzc29yIHRva2VuIEVJR0VOX1FUX1NVUFBPUlQgaXMgZGVmaW5lZC4KKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nRWlnZW4gYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fVFJBTlNGT1JNX1BMVUdJTi4KKyAgKgorICAqIFxzYSBjbGFzcyBNYXRyaXgsIGNsYXNzIFF1YXRlcm5pb24KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltLCBpbnQgX01vZGUsIGludCBfT3B0aW9ucz4KK2NsYXNzIFRyYW5zZm9ybQoreworcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0RpbT09RHluYW1pYyA/IER5bmFtaWMgOiAoX0RpbSsxKSooX0RpbSsxKSkKKyAgZW51bSB7CisgICAgTW9kZSA9IF9Nb2RlLAorICAgIE9wdGlvbnMgPSBfT3B0aW9ucywKKyAgICBEaW0gPSBfRGltLCAgICAgLy8vPCBzcGFjZSBkaW1lbnNpb24gaW4gd2hpY2ggdGhlIHRyYW5zZm9ybWF0aW9uIGhvbGRzCisgICAgSERpbSA9IF9EaW0rMSwgIC8vLzwgc2l6ZSBvZiBhIHJlc3BlY3RpdmUgaG9tb2dlbmVvdXMgdmVjdG9yCisgICAgUm93cyA9IGludChNb2RlKT09KEFmZmluZUNvbXBhY3QpID8gRGltIDogSERpbQorICB9OworICAvKiogdGhlIHNjYWxhciB0eXBlIG9mIHRoZSBjb2VmZmljaWVudHMgKi8KKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworICAvKiogdHlwZSBvZiB0aGUgbWF0cml4IHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0cmFuc2Zvcm1hdGlvbiAqLworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjptYWtlX3Byb3Blcl9tYXRyaXhfdHlwZTxTY2FsYXIsUm93cyxIRGltLE9wdGlvbnM+Ojp0eXBlIE1hdHJpeFR5cGU7CisgIC8qKiBjb25zdGlmaWVkIE1hdHJpeFR5cGUgKi8KKyAgdHlwZWRlZiBjb25zdCBNYXRyaXhUeXBlIENvbnN0TWF0cml4VHlwZTsKKyAgLyoqIHR5cGUgb2YgdGhlIG1hdHJpeCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sRGltLE9wdGlvbnM+IExpbmVhck1hdHJpeFR5cGU7CisgIC8qKiB0eXBlIG9mIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgdHlwZWRlZiBCbG9jazxNYXRyaXhUeXBlLERpbSxEaW0saW50KE1vZGUpPT0oQWZmaW5lQ29tcGFjdCk+IExpbmVhclBhcnQ7CisgIC8qKiB0eXBlIG9mIHJlYWQgcmVmZXJlbmNlIHRvIHRoZSBsaW5lYXIgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgdHlwZWRlZiBjb25zdCBCbG9jazxDb25zdE1hdHJpeFR5cGUsRGltLERpbSxpbnQoTW9kZSk9PShBZmZpbmVDb21wYWN0KT4gQ29uc3RMaW5lYXJQYXJ0OworICAvKiogdHlwZSBvZiByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgYWZmaW5lIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPGludChNb2RlKT09aW50KEFmZmluZUNvbXBhY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4VHlwZSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9jazxNYXRyaXhUeXBlLERpbSxIRGltPiA+Ojp0eXBlIEFmZmluZVBhcnQ7CisgIC8qKiB0eXBlIG9mIHJlYWQgcmVmZXJlbmNlIHRvIHRoZSBhZmZpbmUgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8aW50KE1vZGUpPT1pbnQoQWZmaW5lQ29tcGFjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXRyaXhUeXBlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrPGNvbnN0IE1hdHJpeFR5cGUsRGltLEhEaW0+ID46OnR5cGUgQ29uc3RBZmZpbmVQYXJ0OworICAvKiogdHlwZSBvZiBhIHZlY3RvciAqLworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGltLDE+IFZlY3RvclR5cGU7CisgIC8qKiB0eXBlIG9mIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIHRyYW5zbGF0aW9uIHBhcnQgb2YgdGhlIHJvdGF0aW9uICovCisgIHR5cGVkZWYgQmxvY2s8TWF0cml4VHlwZSxEaW0sMSxpbnQoTW9kZSk9PShBZmZpbmVDb21wYWN0KT4gVHJhbnNsYXRpb25QYXJ0OworICAvKiogdHlwZSBvZiBhIHJlYWQgcmVmZXJlbmNlIHRvIHRoZSB0cmFuc2xhdGlvbiBwYXJ0IG9mIHRoZSByb3RhdGlvbiAqLworICB0eXBlZGVmIGNvbnN0IEJsb2NrPENvbnN0TWF0cml4VHlwZSxEaW0sMSxpbnQoTW9kZSk9PShBZmZpbmVDb21wYWN0KT4gQ29uc3RUcmFuc2xhdGlvblBhcnQ7CisgIC8qKiBjb3JyZXNwb25kaW5nIHRyYW5zbGF0aW9uIHR5cGUgKi8KKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsRGltPiBUcmFuc2xhdGlvblR5cGU7CisgIAorICAvLyB0aGlzIGludGVybWVkaWF0ZSBlbnVtIGlzIG5lZWRlZCB0byBhdm9pZCBhbiBJQ0Ugd2l0aCBnY2MgMy40IGFuZCA0LjAKKyAgZW51bSB7IFRyYW5zZm9ybVRpbWVEaWFnb25hbE1vZGUgPSAoKE1vZGU9PWludChJc29tZXRyeSkpP0FmZmluZTppbnQoTW9kZSkpIH07CisgIC8qKiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHByb2R1Y3QgYmV0d2VlbiBhIGRpYWdvbmFsIG1hdHJpeCBhbmQgYSB0cmFuc2Zvcm0gKi8KKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxUcmFuc2Zvcm1UaW1lRGlhZ29uYWxNb2RlPiBUcmFuc2Zvcm1UaW1lRGlhZ29uYWxSZXR1cm5UeXBlOworCitwcm90ZWN0ZWQ6CisKKyAgTWF0cml4VHlwZSBtX21hdHJpeDsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG1lYW5pbmdmdWwgY29lZmZpY2llbnRzLgorICAgICogSWYgTW9kZT09QWZmaW5lLCB0aGVuIHRoZSBsYXN0IHJvdyBpcyBzZXQgdG8gWzAgLi4uIDAgMV0gKi8KKyAgaW5saW5lIFRyYW5zZm9ybSgpCisgIHsKKyAgICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICBpZiAoaW50KE1vZGUpPT1BZmZpbmUpCisgICAgICBtYWtlQWZmaW5lKCk7CisgIH0KKworICBpbmxpbmUgVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybSYgb3RoZXIpCisgIHsKKyAgICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICBtX21hdHJpeCA9IG90aGVyLm1fbWF0cml4OworICB9CisKKyAgaW5saW5lIGV4cGxpY2l0IFRyYW5zZm9ybShjb25zdCBUcmFuc2xhdGlvblR5cGUmIHQpCisgIHsKKyAgICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAqdGhpcyA9IHQ7CisgIH0KKyAgaW5saW5lIGV4cGxpY2l0IFRyYW5zZm9ybShjb25zdCBVbmlmb3JtU2NhbGluZzxTY2FsYXI+JiBzKQorICB7CisgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgKnRoaXMgPSBzOworICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBleHBsaWNpdCBUcmFuc2Zvcm0oY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsIERpbT4mIHIpCisgIHsKKyAgICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICAqdGhpcyA9IHI7CisgIH0KKworICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNmb3JtJiBvdGhlcikKKyAgeyBtX21hdHJpeCA9IG90aGVyLm1fbWF0cml4OyByZXR1cm4gKnRoaXM7IH0KKworICB0eXBlZGVmIGludGVybmFsOjp0cmFuc2Zvcm1fdGFrZV9hZmZpbmVfcGFydDxUcmFuc2Zvcm0+IHRha2VfYWZmaW5lX3BhcnQ7CisKKyAgLyoqIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemVzIGEgdHJhbnNmb3JtYXRpb24gZnJvbSBhIERpbV4yIG9yIGEgKERpbSsxKV4yIG1hdHJpeC4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBpbmxpbmUgZXhwbGljaXQgVHJhbnNmb3JtKGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPFNjYWxhcix0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICAgIFlPVV9NSVhFRF9ESUZGRVJFTlRfTlVNRVJJQ19UWVBFU19fWU9VX05FRURfVE9fVVNFX1RIRV9DQVNUX01FVEhPRF9PRl9NQVRSSVhCQVNFX1RPX0NBU1RfTlVNRVJJQ19UWVBFU19FWFBMSUNJVExZKTsKKworICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgIGludGVybmFsOjp0cmFuc2Zvcm1fY29uc3RydWN0X2Zyb21fbWF0cml4PE90aGVyRGVyaXZlZCxNb2RlLE9wdGlvbnMsRGltLEhEaW0+OjpydW4odGhpcywgb3RoZXIuZGVyaXZlZCgpKTsKKyAgfQorCisgIC8qKiBTZXQgXGMgKnRoaXMgZnJvbSBhIERpbV4yIG9yIChEaW0rMSleMiBtYXRyaXguICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgaW5saW5lIFRyYW5zZm9ybSYgb3BlcmF0b3I9KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjppc19zYW1lPFNjYWxhcix0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OlNjYWxhcj46OnZhbHVlKSwKKyAgICAgIFlPVV9NSVhFRF9ESUZGRVJFTlRfTlVNRVJJQ19UWVBFU19fWU9VX05FRURfVE9fVVNFX1RIRV9DQVNUX01FVEhPRF9PRl9NQVRSSVhCQVNFX1RPX0NBU1RfTlVNRVJJQ19UWVBFU19FWFBMSUNJVExZKTsKKworICAgIGludGVybmFsOjp0cmFuc2Zvcm1fY29uc3RydWN0X2Zyb21fbWF0cml4PE90aGVyRGVyaXZlZCxNb2RlLE9wdGlvbnMsRGltLEhEaW0+OjpydW4odGhpcywgb3RoZXIuZGVyaXZlZCgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIHRlbXBsYXRlPGludCBPdGhlck9wdGlvbnM+CisgIGlubGluZSBUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPdGhlck9wdGlvbnM+JiBvdGhlcikKKyAgeworICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgIC8vIG9ubHkgdGhlIG9wdGlvbnMgY2hhbmdlLCB3ZSBjYW4gZGlyZWN0bHkgY29weSB0aGUgbWF0cmljZXMKKyAgICBtX21hdHJpeCA9IG90aGVyLm1hdHJpeCgpOworICB9CisKKyAgdGVtcGxhdGU8aW50IE90aGVyTW9kZSxpbnQgT3RoZXJPcHRpb25zPgorICBpbmxpbmUgVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsRGltLE90aGVyTW9kZSxPdGhlck9wdGlvbnM+JiBvdGhlcikKKyAgeworICAgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAgIC8vIHByZXZlbnQgY29udmVyc2lvbnMgYXM6CisgICAgLy8gQWZmaW5lIHwgQWZmaW5lQ29tcGFjdCB8IElzb21ldHJ5ID0gUHJvamVjdGl2ZQorICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRUlHRU5fSU1QTElFUyhPdGhlck1vZGU9PWludChQcm9qZWN0aXZlKSwgTW9kZT09aW50KFByb2plY3RpdmUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFlPVV9QRVJGT1JNRURfQU5fSU5WQUxJRF9UUkFOU0ZPUk1BVElPTl9DT05WRVJTSU9OKQorCisgICAgLy8gcHJldmVudCBjb252ZXJzaW9ucyBhczoKKyAgICAvLyBJc29tZXRyeSA9IEFmZmluZSB8IEFmZmluZUNvbXBhY3QKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKEVJR0VOX0lNUExJRVMoT3RoZXJNb2RlPT1pbnQoQWZmaW5lKXx8T3RoZXJNb2RlPT1pbnQoQWZmaW5lQ29tcGFjdCksIE1vZGUhPWludChJc29tZXRyeSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgWU9VX1BFUkZPUk1FRF9BTl9JTlZBTElEX1RSQU5TRk9STUFUSU9OX0NPTlZFUlNJT04pCisKKyAgICBlbnVtIHsgTW9kZUlzQWZmaW5lQ29tcGFjdCA9IE1vZGUgPT0gaW50KEFmZmluZUNvbXBhY3QpLAorICAgICAgICAgICBPdGhlck1vZGVJc0FmZmluZUNvbXBhY3QgPSBPdGhlck1vZGUgPT0gaW50KEFmZmluZUNvbXBhY3QpCisgICAgfTsKKworICAgIGlmKE1vZGVJc0FmZmluZUNvbXBhY3QgPT0gT3RoZXJNb2RlSXNBZmZpbmVDb21wYWN0KQorICAgIHsKKyAgICAgIC8vIFdlIG5lZWQgdGhlIGJsb2NrIGV4cHJlc3Npb24gYmVjYXVzZSB0aGUgY29kZSBpcyBjb21waWxlZCBmb3IgYWxsCisgICAgICAvLyBjb21iaW5hdGlvbnMgb2YgdHJhbnNmb3JtYXRpb25zIGFuZCB3aWxsIHRyaWdnZXIgYSBjb21waWxlIHRpbWUgZXJyb3IKKyAgICAgIC8vIGlmIG9uZSB0cmllcyB0byBhc3NpZ24gdGhlIG1hdHJpY2VzIGRpcmVjdGx5CisgICAgICBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sRGltKzE+KDAsMCkgPSBvdGhlci5tYXRyaXgoKS50ZW1wbGF0ZSBibG9jazxEaW0sRGltKzE+KDAsMCk7CisgICAgICBtYWtlQWZmaW5lKCk7CisgICAgfQorICAgIGVsc2UgaWYoT3RoZXJNb2RlSXNBZmZpbmVDb21wYWN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtPFNjYWxhcixEaW0sT3RoZXJNb2RlLE90aGVyT3B0aW9ucz46Ok1hdHJpeFR5cGUgT3RoZXJNYXRyaXhUeXBlOworICAgICAgaW50ZXJuYWw6OnRyYW5zZm9ybV9jb25zdHJ1Y3RfZnJvbV9tYXRyaXg8T3RoZXJNYXRyaXhUeXBlLE1vZGUsT3B0aW9ucyxEaW0sSERpbT46OnJ1bih0aGlzLCBvdGhlci5tYXRyaXgoKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBoZXJlIHdlIGtub3cgdGhhdCBNb2RlID09IEFmZmluZUNvbXBhY3QgYW5kIE90aGVyTW9kZSAhPSBBZmZpbmVDb21wYWN0LgorICAgICAgLy8gaWYgT3RoZXJNb2RlIHdlcmUgUHJvamVjdGl2ZSwgdGhlIHN0YXRpYyBhc3NlcnQgYWJvdmUgd291bGQgYWxyZWFkeSBoYXZlIGNhdWdodCBpdC4KKyAgICAgIC8vIFNvIHRoZSBvbmx5IHBvc3NpYmlsaXR5IGlzIHRoYXQgT3RoZXJNb2RlID09IEFmZmluZQorICAgICAgbGluZWFyKCkgPSBvdGhlci5saW5lYXIoKTsKKyAgICAgIHRyYW5zbGF0aW9uKCkgPSBvdGhlci50cmFuc2xhdGlvbigpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgVHJhbnNmb3JtKGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgIHsKKyAgICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgICBvdGhlci5ldmFsVG8oKnRoaXMpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBUcmFuc2Zvcm0mIG9wZXJhdG9yPShjb25zdCBSZXR1cm5CeVZhbHVlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICB7CisgICAgb3RoZXIuZXZhbFRvKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAjaWZkZWYgRUlHRU5fUVRfU1VQUE9SVAorICBpbmxpbmUgVHJhbnNmb3JtKGNvbnN0IFFNYXRyaXgmIG90aGVyKTsKKyAgaW5saW5lIFRyYW5zZm9ybSYgb3BlcmF0b3I9KGNvbnN0IFFNYXRyaXgmIG90aGVyKTsKKyAgaW5saW5lIFFNYXRyaXggdG9RTWF0cml4KHZvaWQpIGNvbnN0OworICBpbmxpbmUgVHJhbnNmb3JtKGNvbnN0IFFUcmFuc2Zvcm0mIG90aGVyKTsKKyAgaW5saW5lIFRyYW5zZm9ybSYgb3BlcmF0b3I9KGNvbnN0IFFUcmFuc2Zvcm0mIG90aGVyKTsKKyAgaW5saW5lIFFUcmFuc2Zvcm0gdG9RVHJhbnNmb3JtKHZvaWQpIGNvbnN0OworICAjZW5kaWYKKworICAvKiogc2hvcnRjdXQgZm9yIG1fbWF0cml4KHJvdyxjb2wpOworICAgICogXHNhIE1hdHJpeEJhc2U6Om9wZXJhdG9yKEluZGV4LEluZGV4KSBjb25zdCAqLworICBpbmxpbmUgU2NhbGFyIG9wZXJhdG9yKCkgKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdCB7IHJldHVybiBtX21hdHJpeChyb3csY29sKTsgfQorICAvKiogc2hvcnRjdXQgZm9yIG1fbWF0cml4KHJvdyxjb2wpOworICAgICogXHNhIE1hdHJpeEJhc2U6Om9wZXJhdG9yKEluZGV4LEluZGV4KSAqLworICBpbmxpbmUgU2NhbGFyJiBvcGVyYXRvcigpIChJbmRleCByb3csIEluZGV4IGNvbCkgeyByZXR1cm4gbV9tYXRyaXgocm93LGNvbCk7IH0KKworICAvKiogXHJldHVybnMgYSByZWFkLW9ubHkgZXhwcmVzc2lvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4ICovCisgIGlubGluZSBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeDsgfQorICAvKiogXHJldHVybnMgYSB3cml0YWJsZSBleHByZXNzaW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKi8KKyAgaW5saW5lIE1hdHJpeFR5cGUmIG1hdHJpeCgpIHsgcmV0dXJuIG1fbWF0cml4OyB9CisKKyAgLyoqIFxyZXR1cm5zIGEgcmVhZC1vbmx5IGV4cHJlc3Npb24gb2YgdGhlIGxpbmVhciBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiAqLworICBpbmxpbmUgQ29uc3RMaW5lYXJQYXJ0IGxpbmVhcigpIGNvbnN0IHsgcmV0dXJuIENvbnN0TGluZWFyUGFydChtX21hdHJpeCwwLDApOyB9CisgIC8qKiBccmV0dXJucyBhIHdyaXRhYmxlIGV4cHJlc3Npb24gb2YgdGhlIGxpbmVhciBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiAqLworICBpbmxpbmUgTGluZWFyUGFydCBsaW5lYXIoKSB7IHJldHVybiBMaW5lYXJQYXJ0KG1fbWF0cml4LDAsMCk7IH0KKworICAvKiogXHJldHVybnMgYSByZWFkLW9ubHkgZXhwcmVzc2lvbiBvZiB0aGUgRGltIHggSERpbSBhZmZpbmUgcGFydCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gKi8KKyAgaW5saW5lIENvbnN0QWZmaW5lUGFydCBhZmZpbmUoKSBjb25zdCB7IHJldHVybiB0YWtlX2FmZmluZV9wYXJ0OjpydW4obV9tYXRyaXgpOyB9CisgIC8qKiBccmV0dXJucyBhIHdyaXRhYmxlIGV4cHJlc3Npb24gb2YgdGhlIERpbSB4IEhEaW0gYWZmaW5lIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uICovCisgIGlubGluZSBBZmZpbmVQYXJ0IGFmZmluZSgpIHsgcmV0dXJuIHRha2VfYWZmaW5lX3BhcnQ6OnJ1bihtX21hdHJpeCk7IH0KKworICAvKiogXHJldHVybnMgYSByZWFkLW9ubHkgZXhwcmVzc2lvbiBvZiB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiAqLworICBpbmxpbmUgQ29uc3RUcmFuc2xhdGlvblBhcnQgdHJhbnNsYXRpb24oKSBjb25zdCB7IHJldHVybiBDb25zdFRyYW5zbGF0aW9uUGFydChtX21hdHJpeCwwLERpbSk7IH0KKyAgLyoqIFxyZXR1cm5zIGEgd3JpdGFibGUgZXhwcmVzc2lvbiBvZiB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiAqLworICBpbmxpbmUgVHJhbnNsYXRpb25QYXJ0IHRyYW5zbGF0aW9uKCkgeyByZXR1cm4gVHJhbnNsYXRpb25QYXJ0KG1fbWF0cml4LDAsRGltKTsgfQorCisgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBwcm9kdWN0IGJldHdlZW4gdGhlIHRyYW5zZm9ybSBcYyAqdGhpcyBhbmQgYSBtYXRyaXggZXhwcmVzc2lvbiBcYSBvdGhlcgorICAgICoKKyAgICAqIFRoZSByaWdodCBoYW5kIHNpZGUgXGEgb3RoZXIgbWlnaHQgYmUgZWl0aGVyOgorICAgICogXGxpIGEgdmVjdG9yIG9mIHNpemUgRGltLAorICAgICogXGxpIGFuIGhvbW9nZW5lb3VzIHZlY3RvciBvZiBzaXplIERpbSsxLAorICAgICogXGxpIGEgc2V0IG9mIHZlY3RvcnMgb2Ygc2l6ZSBEaW0geCBEeW5hbWljLAorICAgICogXGxpIGEgc2V0IG9mIGhvbW9nZW5lb3VzIHZlY3RvcnMgb2Ygc2l6ZSBEaW0rMSB4IER5bmFtaWMsCisgICAgKiBcbGkgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gbWF0cml4IG9mIHNpemUgRGltIHggRGltLAorICAgICogXGxpIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2Ygc2l6ZSBEaW0geCBEaW0rMSwKKyAgICAqIFxsaSBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBvZiBzaXplIERpbSsxIHggRGltKzEuCisgICAgKi8KKyAgLy8gbm90ZTogdGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBzb21lIGNvbXBpbGVycyBjYW5ub3QgZmluZCB0aGUgcmVzcGVjdGl2ZSBkZWNsYXJhdGlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYW5zZm9ybV9yaWdodF9wcm9kdWN0X2ltcGw8VHJhbnNmb3JtLCBPdGhlckRlcml2ZWQ+OjpSZXN1bHRUeXBlCisgIG9wZXJhdG9yICogKGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gaW50ZXJuYWw6OnRyYW5zZm9ybV9yaWdodF9wcm9kdWN0X2ltcGw8VHJhbnNmb3JtLCBPdGhlckRlcml2ZWQ+OjpydW4oKnRoaXMsb3RoZXIuZGVyaXZlZCgpKTsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgcHJvZHVjdCBleHByZXNzaW9uIG9mIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4IFxhIGEgdGltZXMgYSB0cmFuc2Zvcm0gXGEgYgorICAgICoKKyAgICAqIFRoZSBsZWZ0IGhhbmQgc2lkZSBcYSBvdGhlciBtaWdodCBiZSBlaXRoZXI6CisgICAgKiBcbGkgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gbWF0cml4IG9mIHNpemUgRGltIHggRGltLAorICAgICogXGxpIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2Ygc2l6ZSBEaW0geCBEaW0rMSwKKyAgICAqIFxsaSBhIGdlbmVyYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4IG9mIHNpemUgRGltKzEgeCBEaW0rMS4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGZyaWVuZAorICBpbmxpbmUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYW5zZm9ybV9sZWZ0X3Byb2R1Y3RfaW1wbDxPdGhlckRlcml2ZWQsTW9kZSxPcHRpb25zLF9EaW0sX0RpbSsxPjo6UmVzdWx0VHlwZQorICAgIG9wZXJhdG9yICogKGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+ICZhLCBjb25zdCBUcmFuc2Zvcm0gJmIpCisgIHsgcmV0dXJuIGludGVybmFsOjp0cmFuc2Zvcm1fbGVmdF9wcm9kdWN0X2ltcGw8T3RoZXJEZXJpdmVkLE1vZGUsT3B0aW9ucyxEaW0sSERpbT46OnJ1bihhLmRlcml2ZWQoKSxiKTsgfQorCisgIC8qKiBccmV0dXJucyBUaGUgcHJvZHVjdCBleHByZXNzaW9uIG9mIGEgdHJhbnNmb3JtIFxhIGEgdGltZXMgYSBkaWFnb25hbCBtYXRyaXggXGEgYgorICAgICoKKyAgICAqIFRoZSByaHMgZGlhZ29uYWwgbWF0cml4IGlzIGludGVycHJldGVkIGFzIGFuIGFmZmluZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uLiBUaGUKKyAgICAqIHByb2R1Y3QgcmVzdWx0cyBpbiBhIFRyYW5zZm9ybSBvZiB0aGUgc2FtZSB0eXBlIChtb2RlKSBhcyB0aGUgbGhzIG9ubHkgaWYgdGhlIGxocyAKKyAgICAqIG1vZGUgaXMgbm8gaXNvbWV0cnkuIEluIHRoYXQgY2FzZSwgdGhlIHJldHVybmVkIHRyYW5zZm9ybSBpcyBhbiBhZmZpbml0eS4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaWFnb25hbERlcml2ZWQ+CisgIGlubGluZSBjb25zdCBUcmFuc2Zvcm1UaW1lRGlhZ29uYWxSZXR1cm5UeXBlCisgICAgb3BlcmF0b3IgKiAoY29uc3QgRGlhZ29uYWxCYXNlPERpYWdvbmFsRGVyaXZlZD4gJmIpIGNvbnN0CisgIHsKKyAgICBUcmFuc2Zvcm1UaW1lRGlhZ29uYWxSZXR1cm5UeXBlIHJlcygqdGhpcyk7CisgICAgcmVzLmxpbmVhcigpICo9IGI7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIC8qKiBccmV0dXJucyBUaGUgcHJvZHVjdCBleHByZXNzaW9uIG9mIGEgZGlhZ29uYWwgbWF0cml4IFxhIGEgdGltZXMgYSB0cmFuc2Zvcm0gXGEgYgorICAgICoKKyAgICAqIFRoZSBsaHMgZGlhZ29uYWwgbWF0cml4IGlzIGludGVycHJldGVkIGFzIGFuIGFmZmluZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uLiBUaGUKKyAgICAqIHByb2R1Y3QgcmVzdWx0cyBpbiBhIFRyYW5zZm9ybSBvZiB0aGUgc2FtZSB0eXBlIChtb2RlKSBhcyB0aGUgbGhzIG9ubHkgaWYgdGhlIGxocyAKKyAgICAqIG1vZGUgaXMgbm8gaXNvbWV0cnkuIEluIHRoYXQgY2FzZSwgdGhlIHJldHVybmVkIHRyYW5zZm9ybSBpcyBhbiBhZmZpbml0eS4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEaWFnb25hbERlcml2ZWQ+CisgIGZyaWVuZCBpbmxpbmUgVHJhbnNmb3JtVGltZURpYWdvbmFsUmV0dXJuVHlwZQorICAgIG9wZXJhdG9yICogKGNvbnN0IERpYWdvbmFsQmFzZTxEaWFnb25hbERlcml2ZWQ+ICZhLCBjb25zdCBUcmFuc2Zvcm0gJmIpCisgIHsKKyAgICBUcmFuc2Zvcm1UaW1lRGlhZ29uYWxSZXR1cm5UeXBlIHJlczsKKyAgICByZXMubGluZWFyKCkubm9hbGlhcygpID0gYSpiLmxpbmVhcigpOworICAgIHJlcy50cmFuc2xhdGlvbigpLm5vYWxpYXMoKSA9IGEqYi50cmFuc2xhdGlvbigpOworICAgIGlmIChNb2RlIT1pbnQoQWZmaW5lQ29tcGFjdCkpCisgICAgICByZXMubWF0cml4KCkucm93KERpbSkgPSBiLm1hdHJpeCgpLnJvdyhEaW0pOworICAgIHJldHVybiByZXM7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yKj0oY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSB7IHJldHVybiAqdGhpcyA9ICp0aGlzICogb3RoZXI7IH0KKworICAvKiogQ29uY2F0ZW5hdGVzIHR3byB0cmFuc2Zvcm1hdGlvbnMgKi8KKyAgaW5saW5lIGNvbnN0IFRyYW5zZm9ybSBvcGVyYXRvciAqIChjb25zdCBUcmFuc2Zvcm0mIG90aGVyKSBjb25zdAorICB7CisgICAgcmV0dXJuIGludGVybmFsOjp0cmFuc2Zvcm1fdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDxUcmFuc2Zvcm0sVHJhbnNmb3JtPjo6cnVuKCp0aGlzLG90aGVyKTsKKyAgfQorICAKKyAgI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKK3ByaXZhdGU6CisgIC8vIHRoaXMgaW50ZXJtZWRpYXRlIHN0cnVjdHVyZSBwZXJtaXRzIHRvIHdvcmthcm91bmQgYSBidWcgaW4gSUNDIDExOgorICAvLyAgIGVycm9yOiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHJlc3VsdGVkIGluIHVuZXhwZWN0ZWQgZnVuY3Rpb24gdHlwZSBvZiAiRWlnZW46OlRyYW5zZm9ybTxkb3VibGUsIDMsIDMyLCAwPgorICAvLyAgICAgICAgICAgICAoY29uc3QgRWlnZW46OlRyYW5zZm9ybTxkb3VibGUsIDMsIDIsIDA+ICYpIGNvbnN0IgorICAvLyAgKHRoZSBtZWFuaW5nIG9mIGEgbmFtZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiAtLSB0aGUgdHlwZSBvZiB0aGUgdGVtcGxhdGUgaXM6CisgIC8vICJFaWdlbjo6aW50ZXJuYWw6OnRyYW5zZm9ybV90cmFuc2Zvcm1fcHJvZHVjdF9pbXBsPEVpZ2VuOjpUcmFuc2Zvcm08ZG91YmxlLCAzLCAzMiwgMD4sCisgIC8vICAgICBFaWdlbjo6VHJhbnNmb3JtPGRvdWJsZSwgMywgTW9kZSwgT3B0aW9ucz4sIDxleHByZXNzaW9uPj46OlJlc3VsdFR5cGUgKGNvbnN0IEVpZ2VuOjpUcmFuc2Zvcm08ZG91YmxlLCAzLCBNb2RlLCBPcHRpb25zPiAmKSBjb25zdCIpCisgIC8vIAorICB0ZW1wbGF0ZTxpbnQgT3RoZXJNb2RlLGludCBPdGhlck9wdGlvbnM+IHN0cnVjdCBpY2NfMTFfd29ya2Fyb3VuZAorICB7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhbnNmb3JtX3RyYW5zZm9ybV9wcm9kdWN0X2ltcGw8VHJhbnNmb3JtLFRyYW5zZm9ybTxTY2FsYXIsRGltLE90aGVyTW9kZSxPdGhlck9wdGlvbnM+ID4gUHJvZHVjdFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0VHlwZTo6UmVzdWx0VHlwZSBSZXN1bHRUeXBlOworICB9OworICAKK3B1YmxpYzoKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gZGlmZmVyZW50IHRyYW5zZm9ybWF0aW9ucyAqLworICB0ZW1wbGF0ZTxpbnQgT3RoZXJNb2RlLGludCBPdGhlck9wdGlvbnM+CisgIGlubGluZSB0eXBlbmFtZSBpY2NfMTFfd29ya2Fyb3VuZDxPdGhlck1vZGUsT3RoZXJPcHRpb25zPjo6UmVzdWx0VHlwZQorICAgIG9wZXJhdG9yICogKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsRGltLE90aGVyTW9kZSxPdGhlck9wdGlvbnM+JiBvdGhlcikgY29uc3QKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgaWNjXzExX3dvcmthcm91bmQ8T3RoZXJNb2RlLE90aGVyT3B0aW9ucz46OlByb2R1Y3RUeXBlIFByb2R1Y3RUeXBlOworICAgIHJldHVybiBQcm9kdWN0VHlwZTo6cnVuKCp0aGlzLG90aGVyKTsKKyAgfQorICAjZWxzZQorICAvKiogQ29uY2F0ZW5hdGVzIHR3byBkaWZmZXJlbnQgdHJhbnNmb3JtYXRpb25zICovCisgIHRlbXBsYXRlPGludCBPdGhlck1vZGUsaW50IE90aGVyT3B0aW9ucz4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjp0cmFuc2Zvcm1fdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDxUcmFuc2Zvcm0sVHJhbnNmb3JtPFNjYWxhcixEaW0sT3RoZXJNb2RlLE90aGVyT3B0aW9ucz4gPjo6UmVzdWx0VHlwZQorICAgIG9wZXJhdG9yICogKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsRGltLE90aGVyTW9kZSxPdGhlck9wdGlvbnM+JiBvdGhlcikgY29uc3QKKyAgeworICAgIHJldHVybiBpbnRlcm5hbDo6dHJhbnNmb3JtX3RyYW5zZm9ybV9wcm9kdWN0X2ltcGw8VHJhbnNmb3JtLFRyYW5zZm9ybTxTY2FsYXIsRGltLE90aGVyTW9kZSxPdGhlck9wdGlvbnM+ID46OnJ1bigqdGhpcyxvdGhlcik7CisgIH0KKyAgI2VuZGlmCisKKyAgLyoqIFxzYSBNYXRyaXhCYXNlOjpzZXRJZGVudGl0eSgpICovCisgIHZvaWQgc2V0SWRlbnRpdHkoKSB7IG1fbWF0cml4LnNldElkZW50aXR5KCk7IH0KKworICAvKioKKyAgICogXGJyaWVmIFJldHVybnMgYW4gaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24uCisgICAqIFx0b2RvIEluIHRoZSBmdXR1cmUgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmV0dXJuaW5nIGEgVHJhbnNmb3JtIGV4cHJlc3Npb24uCisgICAqLworICBzdGF0aWMgY29uc3QgVHJhbnNmb3JtIElkZW50aXR5KCkKKyAgeworICAgIHJldHVybiBUcmFuc2Zvcm0oTWF0cml4VHlwZTo6SWRlbnRpdHkoKSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIGlubGluZSBUcmFuc2Zvcm0mIHNjYWxlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgaW5saW5lIFRyYW5zZm9ybSYgcHJlc2NhbGUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcik7CisKKyAgaW5saW5lIFRyYW5zZm9ybSYgc2NhbGUoU2NhbGFyIHMpOworICBpbmxpbmUgVHJhbnNmb3JtJiBwcmVzY2FsZShTY2FsYXIgcyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBpbmxpbmUgVHJhbnNmb3JtJiB0cmFuc2xhdGUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBpbmxpbmUgVHJhbnNmb3JtJiBwcmV0cmFuc2xhdGUoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25UeXBlPgorICBpbmxpbmUgVHJhbnNmb3JtJiByb3RhdGUoY29uc3QgUm90YXRpb25UeXBlJiByb3RhdGlvbik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25UeXBlPgorICBpbmxpbmUgVHJhbnNmb3JtJiBwcmVyb3RhdGUoY29uc3QgUm90YXRpb25UeXBlJiByb3RhdGlvbik7CisKKyAgVHJhbnNmb3JtJiBzaGVhcihTY2FsYXIgc3gsIFNjYWxhciBzeSk7CisgIFRyYW5zZm9ybSYgcHJlc2hlYXIoU2NhbGFyIHN4LCBTY2FsYXIgc3kpOworCisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yPShjb25zdCBUcmFuc2xhdGlvblR5cGUmIHQpOworICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcio9KGNvbnN0IFRyYW5zbGF0aW9uVHlwZSYgdCkgeyByZXR1cm4gdHJhbnNsYXRlKHQudmVjdG9yKCkpOyB9CisgIGlubGluZSBUcmFuc2Zvcm0gb3BlcmF0b3IqKGNvbnN0IFRyYW5zbGF0aW9uVHlwZSYgdCkgY29uc3Q7CisKKyAgaW5saW5lIFRyYW5zZm9ybSYgb3BlcmF0b3I9KGNvbnN0IFVuaWZvcm1TY2FsaW5nPFNjYWxhcj4mIHQpOworICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcio9KGNvbnN0IFVuaWZvcm1TY2FsaW5nPFNjYWxhcj4mIHMpIHsgcmV0dXJuIHNjYWxlKHMuZmFjdG9yKCkpOyB9CisgIGlubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbSwoaW50KE1vZGUpPT1pbnQoSXNvbWV0cnkpP0FmZmluZTpJc29tZXRyeSk+IG9wZXJhdG9yKihjb25zdCBVbmlmb3JtU2NhbGluZzxTY2FsYXI+JiBzKSBjb25zdAorICB7CisgICAgVHJhbnNmb3JtPFNjYWxhcixEaW0sKGludChNb2RlKT09aW50KElzb21ldHJ5KT9BZmZpbmU6SXNvbWV0cnkpLE9wdGlvbnM+IHJlcyA9ICp0aGlzOworICAgIHJlcy5zY2FsZShzLmZhY3RvcigpKTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgaW5saW5lIFRyYW5zZm9ybSYgb3BlcmF0b3IqPShjb25zdCBEaWFnb25hbE1hdHJpeDxTY2FsYXIsRGltPiYgcykgeyBsaW5lYXIoKSAqPSBzOyByZXR1cm4gKnRoaXM7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgVHJhbnNmb3JtJiBvcGVyYXRvcj0oY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBUcmFuc2Zvcm0mIG9wZXJhdG9yKj0oY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikgeyByZXR1cm4gcm90YXRlKHIudG9Sb3RhdGlvbk1hdHJpeCgpKTsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBpbmxpbmUgVHJhbnNmb3JtIG9wZXJhdG9yKihjb25zdCBSb3RhdGlvbkJhc2U8RGVyaXZlZCxEaW0+JiByKSBjb25zdDsKKworICBjb25zdCBMaW5lYXJNYXRyaXhUeXBlIHJvdGF0aW9uKCkgY29uc3Q7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uTWF0cml4VHlwZSwgdHlwZW5hbWUgU2NhbGluZ01hdHJpeFR5cGU+CisgIHZvaWQgY29tcHV0ZVJvdGF0aW9uU2NhbGluZyhSb3RhdGlvbk1hdHJpeFR5cGUgKnJvdGF0aW9uLCBTY2FsaW5nTWF0cml4VHlwZSAqc2NhbGluZykgY29uc3Q7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxpbmdNYXRyaXhUeXBlLCB0eXBlbmFtZSBSb3RhdGlvbk1hdHJpeFR5cGU+CisgIHZvaWQgY29tcHV0ZVNjYWxpbmdSb3RhdGlvbihTY2FsaW5nTWF0cml4VHlwZSAqc2NhbGluZywgUm90YXRpb25NYXRyaXhUeXBlICpyb3RhdGlvbikgY29uc3Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgUG9zaXRpb25EZXJpdmVkLCB0eXBlbmFtZSBPcmllbnRhdGlvblR5cGUsIHR5cGVuYW1lIFNjYWxlRGVyaXZlZD4KKyAgVHJhbnNmb3JtJiBmcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKGNvbnN0IE1hdHJpeEJhc2U8UG9zaXRpb25EZXJpdmVkPiAmcG9zaXRpb24sCisgICAgY29uc3QgT3JpZW50YXRpb25UeXBlJiBvcmllbnRhdGlvbiwgY29uc3QgTWF0cml4QmFzZTxTY2FsZURlcml2ZWQ+ICZzY2FsZSk7CisKKyAgaW5saW5lIFRyYW5zZm9ybSBpbnZlcnNlKFRyYW5zZm9ybVRyYWl0cyB0cmFpdHMgPSAoVHJhbnNmb3JtVHJhaXRzKU1vZGUpIGNvbnN0OworCisgIC8qKiBccmV0dXJucyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIGNvbHVtbiBtYWpvciBpbnRlcm5hbCBtYXRyaXggKi8KKyAgY29uc3QgU2NhbGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguZGF0YSgpOyB9CisgIC8qKiBccmV0dXJucyBhIG5vbi1jb25zdCBwb2ludGVyIHRvIHRoZSBjb2x1bW4gbWFqb3IgaW50ZXJuYWwgbWF0cml4ICovCisgIFNjYWxhciogZGF0YSgpIHsgcmV0dXJuIG1fbWF0cml4LmRhdGEoKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyAqdGhpcyB3aXRoIHNjYWxhciB0eXBlIGNhc3RlZCB0byBcYSBOZXdTY2FsYXJUeXBlCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIFxhIE5ld1NjYWxhclR5cGUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2NhbGFyIHR5cGUgb2YgXGMgKnRoaXMKKyAgICAqIHRoZW4gdGhpcyBmdW5jdGlvbiBzbWFydGx5IHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3U2NhbGFyVHlwZT4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPFRyYW5zZm9ybSxUcmFuc2Zvcm08TmV3U2NhbGFyVHlwZSxEaW0sTW9kZSxPcHRpb25zPiA+Ojp0eXBlIGNhc3QoKSBjb25zdAorICB7IHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxUcmFuc2Zvcm0sVHJhbnNmb3JtPE5ld1NjYWxhclR5cGUsRGltLE1vZGUsT3B0aW9ucz4gPjo6dHlwZSgqdGhpcyk7IH0KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciB3aXRoIHNjYWxhciB0eXBlIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXJUeXBlPgorICBpbmxpbmUgZXhwbGljaXQgVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybTxPdGhlclNjYWxhclR5cGUsRGltLE1vZGUsT3B0aW9ucz4mIG90aGVyKQorICB7CisgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1zKCk7CisgICAgbV9tYXRyaXggPSBvdGhlci5tYXRyaXgoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyBcYyB0cnVlIGlmIFxjICp0aGlzIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gXGEgb3RoZXIsIHdpdGhpbiB0aGUgcHJlY2lzaW9uCisgICAgKiBkZXRlcm1pbmVkIGJ5IFxhIHByZWMuCisgICAgKgorICAgICogXHNhIE1hdHJpeEJhc2U6OmlzQXBwcm94KCkgKi8KKyAgYm9vbCBpc0FwcHJveChjb25zdCBUcmFuc2Zvcm0mIG90aGVyLCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdAorICB7IHJldHVybiBtX21hdHJpeC5pc0FwcHJveChvdGhlci5tX21hdHJpeCwgcHJlYyk7IH0KKworICAvKiogU2V0cyB0aGUgbGFzdCByb3cgdG8gWzAgLi4uIDAgMV0KKyAgICAqLworICB2b2lkIG1ha2VBZmZpbmUoKQorICB7CisgICAgaWYoaW50KE1vZGUpIT1pbnQoQWZmaW5lQ29tcGFjdCkpCisgICAgeworICAgICAgbWF0cml4KCkudGVtcGxhdGUgYmxvY2s8MSxEaW0+KERpbSwwKS5zZXRaZXJvKCk7CisgICAgICBtYXRyaXgoKS5jb2VmZlJlZihEaW0sRGltKSA9IFNjYWxhcigxKTsKKyAgICB9CisgIH0KKworICAvKiogXGludGVybmFsCisgICAgKiBccmV0dXJucyB0aGUgRGltIHggRGltIGxpbmVhciBwYXJ0IGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBhZmZpbmUsCisgICAgKiAgICAgICAgICBhbmQgdGhlIEhEaW0geCBEaW0gcGFydCBmb3IgcHJvamVjdGl2ZSB0cmFuc2Zvcm1hdGlvbnMuCisgICAgKi8KKyAgaW5saW5lIEJsb2NrPE1hdHJpeFR5cGUsaW50KE1vZGUpPT1pbnQoUHJvamVjdGl2ZSk/SERpbTpEaW0sRGltPiBsaW5lYXJFeHQoKQorICB7IHJldHVybiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxpbnQoTW9kZSk9PWludChQcm9qZWN0aXZlKT9IRGltOkRpbSxEaW0+KDAsMCk7IH0KKyAgLyoqIFxpbnRlcm5hbAorICAgICogXHJldHVybnMgdGhlIERpbSB4IERpbSBsaW5lYXIgcGFydCBpZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgYWZmaW5lLAorICAgICogICAgICAgICAgYW5kIHRoZSBIRGltIHggRGltIHBhcnQgZm9yIHByb2plY3RpdmUgdHJhbnNmb3JtYXRpb25zLgorICAgICovCisgIGlubGluZSBjb25zdCBCbG9jazxNYXRyaXhUeXBlLGludChNb2RlKT09aW50KFByb2plY3RpdmUpP0hEaW06RGltLERpbT4gbGluZWFyRXh0KCkgY29uc3QKKyAgeyByZXR1cm4gbV9tYXRyaXgudGVtcGxhdGUgYmxvY2s8aW50KE1vZGUpPT1pbnQoUHJvamVjdGl2ZSk/SERpbTpEaW0sRGltPigwLDApOyB9CisKKyAgLyoqIFxpbnRlcm5hbAorICAgICogXHJldHVybnMgdGhlIHRyYW5zbGF0aW9uIHBhcnQgaWYgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIGFmZmluZSwKKyAgICAqICAgICAgICAgIGFuZCB0aGUgbGFzdCBjb2x1bW4gZm9yIHByb2plY3RpdmUgdHJhbnNmb3JtYXRpb25zLgorICAgICovCisgIGlubGluZSBCbG9jazxNYXRyaXhUeXBlLGludChNb2RlKT09aW50KFByb2plY3RpdmUpP0hEaW06RGltLDE+IHRyYW5zbGF0aW9uRXh0KCkKKyAgeyByZXR1cm4gbV9tYXRyaXgudGVtcGxhdGUgYmxvY2s8aW50KE1vZGUpPT1pbnQoUHJvamVjdGl2ZSk/SERpbTpEaW0sMT4oMCxEaW0pOyB9CisgIC8qKiBcaW50ZXJuYWwKKyAgICAqIFxyZXR1cm5zIHRoZSB0cmFuc2xhdGlvbiBwYXJ0IGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBhZmZpbmUsCisgICAgKiAgICAgICAgICBhbmQgdGhlIGxhc3QgY29sdW1uIGZvciBwcm9qZWN0aXZlIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAqLworICBpbmxpbmUgY29uc3QgQmxvY2s8TWF0cml4VHlwZSxpbnQoTW9kZSk9PWludChQcm9qZWN0aXZlKT9IRGltOkRpbSwxPiB0cmFuc2xhdGlvbkV4dCgpIGNvbnN0CisgIHsgcmV0dXJuIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPGludChNb2RlKT09aW50KFByb2plY3RpdmUpP0hEaW06RGltLDE+KDAsRGltKTsgfQorCisKKyAgI2lmZGVmIEVJR0VOX1RSQU5TRk9STV9QTFVHSU4KKyAgI2luY2x1ZGUgRUlHRU5fVFJBTlNGT1JNX1BMVUdJTgorICAjZW5kaWYKKyAgCitwcm90ZWN0ZWQ6CisgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICBzdGF0aWMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpCisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoT3B0aW9ucyAmIChEb250QWxpZ258Um93TWFqb3IpKSA9PSBPcHRpb25zLCBJTlZBTElEX01BVFJJWF9URU1QTEFURV9QQVJBTUVURVJTKQorICAgIH0KKyAgI2VuZGlmCisKK307CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KK3R5cGVkZWYgVHJhbnNmb3JtPGZsb2F0LDIsSXNvbWV0cnk+IElzb21ldHJ5MmY7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxmbG9hdCwzLElzb21ldHJ5PiBJc29tZXRyeTNmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZG91YmxlLDIsSXNvbWV0cnk+IElzb21ldHJ5MmQ7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMyxJc29tZXRyeT4gSXNvbWV0cnkzZDsKKworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZmxvYXQsMixBZmZpbmU+IEFmZmluZTJmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZmxvYXQsMyxBZmZpbmU+IEFmZmluZTNmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZG91YmxlLDIsQWZmaW5lPiBBZmZpbmUyZDsKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KK3R5cGVkZWYgVHJhbnNmb3JtPGRvdWJsZSwzLEFmZmluZT4gQWZmaW5lM2Q7CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KK3R5cGVkZWYgVHJhbnNmb3JtPGZsb2F0LDIsQWZmaW5lQ29tcGFjdD4gQWZmaW5lQ29tcGFjdDJmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZmxvYXQsMyxBZmZpbmVDb21wYWN0PiBBZmZpbmVDb21wYWN0M2Y7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMixBZmZpbmVDb21wYWN0PiBBZmZpbmVDb21wYWN0MmQ7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMyxBZmZpbmVDb21wYWN0PiBBZmZpbmVDb21wYWN0M2Q7CisKKy8qKiBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUgKi8KK3R5cGVkZWYgVHJhbnNmb3JtPGZsb2F0LDIsUHJvamVjdGl2ZT4gUHJvamVjdGl2ZTJmOworLyoqIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZSAqLwordHlwZWRlZiBUcmFuc2Zvcm08ZmxvYXQsMyxQcm9qZWN0aXZlPiBQcm9qZWN0aXZlM2Y7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMixQcm9qZWN0aXZlPiBQcm9qZWN0aXZlMmQ7CisvKiogXGluZ3JvdXAgR2VvbWV0cnlfTW9kdWxlICovCit0eXBlZGVmIFRyYW5zZm9ybTxkb3VibGUsMyxQcm9qZWN0aXZlPiBQcm9qZWN0aXZlM2Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIE9wdGlvbmFsIFFUIHN1cHBvcnQgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEVJR0VOX1FUX1NVUFBPUlQKKy8qKiBJbml0aWFsaXplcyBcYyAqdGhpcyBmcm9tIGEgUU1hdHJpeCBhc3N1bWluZyB0aGUgZGltZW5zaW9uIGlzIDIuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRoZSB0b2tlbiBFSUdFTl9RVF9TVVBQT1JUIGlzIGRlZmluZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLGludCBPcHRpb25zPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6VHJhbnNmb3JtKGNvbnN0IFFNYXRyaXgmIG90aGVyKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgKnRoaXMgPSBvdGhlcjsKK30KKworLyoqIFNldCBcYyAqdGhpcyBmcm9tIGEgUU1hdHJpeCBhc3N1bWluZyB0aGUgZGltZW5zaW9uIGlzIDIuCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRoZSB0b2tlbiBFSUdFTl9RVF9TVVBQT1JUIGlzIGRlZmluZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLGludCBPcHRpb25zPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6b3BlcmF0b3I9KGNvbnN0IFFNYXRyaXgmIG90aGVyKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKERpbT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICBtX21hdHJpeCA8PCBvdGhlci5tMTEoKSwgb3RoZXIubTIxKCksIG90aGVyLmR4KCksCisgICAgICAgICAgICAgIG90aGVyLm0xMigpLCBvdGhlci5tMjIoKSwgb3RoZXIuZHkoKSwKKyAgICAgICAgICAgICAgMCwgMCwgMTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogXHJldHVybnMgYSBRTWF0cml4IGZyb20gXGMgKnRoaXMgYXNzdW1pbmcgdGhlIGRpbWVuc2lvbiBpcyAyLgorICAqCisgICogXHdhcm5pbmcgdGhpcyBjb252ZXJzaW9uIG1pZ2h0IGxvc3MgZGF0YSBpZiBcYyAqdGhpcyBpcyBub3QgYWZmaW5lCisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRoZSB0b2tlbiBFSUdFTl9RVF9TVVBQT1JUIGlzIGRlZmluZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK1FNYXRyaXggVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6dG9RTWF0cml4KHZvaWQpIGNvbnN0Cit7CisgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKERpbT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICByZXR1cm4gUU1hdHJpeChtX21hdHJpeC5jb2VmZigwLDApLCBtX21hdHJpeC5jb2VmZigxLDApLAorICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDEpLCBtX21hdHJpeC5jb2VmZigxLDEpLAorICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDIpLCBtX21hdHJpeC5jb2VmZigxLDIpKTsKK30KKworLyoqIEluaXRpYWxpemVzIFxjICp0aGlzIGZyb20gYSBRVHJhbnNmb3JtIGFzc3VtaW5nIHRoZSBkaW1lbnNpb24gaXMgMi4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIHRva2VuIEVJR0VOX1FUX1NVUFBPUlQgaXMgZGVmaW5lZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsaW50IE9wdGlvbnM+CitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpUcmFuc2Zvcm0oY29uc3QgUVRyYW5zZm9ybSYgb3RoZXIpCit7CisgIGNoZWNrX3RlbXBsYXRlX3BhcmFtcygpOworICAqdGhpcyA9IG90aGVyOworfQorCisvKiogU2V0IFxjICp0aGlzIGZyb20gYSBRVHJhbnNmb3JtIGFzc3VtaW5nIHRoZSBkaW1lbnNpb24gaXMgMi4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIHRva2VuIEVJR0VOX1FUX1NVUFBPUlQgaXMgZGVmaW5lZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6b3BlcmF0b3I9KGNvbnN0IFFUcmFuc2Zvcm0mIG90aGVyKQoreworICBjaGVja190ZW1wbGF0ZV9wYXJhbXMoKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChEaW09PTIsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgaWYgKE1vZGUgPT0gaW50KEFmZmluZUNvbXBhY3QpKQorICAgIG1fbWF0cml4IDw8IG90aGVyLm0xMSgpLCBvdGhlci5tMjEoKSwgb3RoZXIuZHgoKSwKKyAgICAgICAgICAgICAgICBvdGhlci5tMTIoKSwgb3RoZXIubTIyKCksIG90aGVyLmR5KCk7CisgIGVsc2UKKyAgICBtX21hdHJpeCA8PCBvdGhlci5tMTEoKSwgb3RoZXIubTIxKCksIG90aGVyLmR4KCksCisgICAgICAgICAgICAgICAgb3RoZXIubTEyKCksIG90aGVyLm0yMigpLCBvdGhlci5keSgpLAorICAgICAgICAgICAgICAgIG90aGVyLm0xMygpLCBvdGhlci5tMjMoKSwgb3RoZXIubTMzKCk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIFxyZXR1cm5zIGEgUVRyYW5zZm9ybSBmcm9tIFxjICp0aGlzIGFzc3VtaW5nIHRoZSBkaW1lbnNpb24gaXMgMi4KKyAgKgorICAqIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9ubHkgaWYgdGhlIHRva2VuIEVJR0VOX1FUX1NVUFBPUlQgaXMgZGVmaW5lZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorUVRyYW5zZm9ybSBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+Ojp0b1FUcmFuc2Zvcm0odm9pZCkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChEaW09PTIsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSkKKyAgaWYgKE1vZGUgPT0gaW50KEFmZmluZUNvbXBhY3QpKQorICAgIHJldHVybiBRVHJhbnNmb3JtKG1fbWF0cml4LmNvZWZmKDAsMCksIG1fbWF0cml4LmNvZWZmKDEsMCksCisgICAgICAgICAgICAgICAgICAgICAgbV9tYXRyaXguY29lZmYoMCwxKSwgbV9tYXRyaXguY29lZmYoMSwxKSwKKyAgICAgICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDIpLCBtX21hdHJpeC5jb2VmZigxLDIpKTsKKyAgZWxzZQorICAgIHJldHVybiBRVHJhbnNmb3JtKG1fbWF0cml4LmNvZWZmKDAsMCksIG1fbWF0cml4LmNvZWZmKDEsMCksIG1fbWF0cml4LmNvZWZmKDIsMCksCisgICAgICAgICAgICAgICAgICAgICAgbV9tYXRyaXguY29lZmYoMCwxKSwgbV9tYXRyaXguY29lZmYoMSwxKSwgbV9tYXRyaXguY29lZmYoMiwxKSwKKyAgICAgICAgICAgICAgICAgICAgICBtX21hdHJpeC5jb2VmZigwLDIpLCBtX21hdHJpeC5jb2VmZigxLDIpLCBtX21hdHJpeC5jb2VmZigyLDIpKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqCisqKiogUHJvY2VkdXJhbCBBUEkgKioqCisqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBBcHBsaWVzIG9uIHRoZSByaWdodCB0aGUgbm9uIHVuaWZvcm0gc2NhbGUgdHJhbnNmb3JtYXRpb24gcmVwcmVzZW50ZWQKKyAgKiBieSB0aGUgdmVjdG9yIFxhIG90aGVyIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqIFxzYSBwcmVzY2FsZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK1RyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mCitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpzY2FsZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKE90aGVyRGVyaXZlZCxpbnQoRGltKSkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChNb2RlIT1pbnQoSXNvbWV0cnkpLCBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9TUEVDSUZJQ19UUkFOU0ZPUk1BVElPTlMpCisgIGxpbmVhckV4dCgpLm5vYWxpYXMoKSA9IChsaW5lYXJFeHQoKSAqIG90aGVyLmFzRGlhZ29uYWwoKSk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIHJpZ2h0IGEgdW5pZm9ybSBzY2FsZSBvZiBhIGZhY3RvciBcYSBjIHRvIFxjICp0aGlzCisgICogYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICogXHNhIHByZXNjYWxlKFNjYWxhcikKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgoraW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OnNjYWxlKFNjYWxhciBzKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKE1vZGUhPWludChJc29tZXRyeSksIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX1NQRUNJRklDX1RSQU5TRk9STUFUSU9OUykKKyAgbGluZWFyRXh0KCkgKj0gczsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogQXBwbGllcyBvbiB0aGUgbGVmdCB0aGUgbm9uIHVuaWZvcm0gc2NhbGUgdHJhbnNmb3JtYXRpb24gcmVwcmVzZW50ZWQKKyAgKiBieSB0aGUgdmVjdG9yIFxhIG90aGVyIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqIFxzYSBzY2FsZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK1RyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mCitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpwcmVzY2FsZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKE90aGVyRGVyaXZlZCxpbnQoRGltKSkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChNb2RlIT1pbnQoSXNvbWV0cnkpLCBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9TUEVDSUZJQ19UUkFOU0ZPUk1BVElPTlMpCisgIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPERpbSxIRGltPigwLDApLm5vYWxpYXMoKSA9IChvdGhlci5hc0RpYWdvbmFsKCkgKiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sSERpbT4oMCwwKSk7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIGxlZnQgYSB1bmlmb3JtIHNjYWxlIG9mIGEgZmFjdG9yIFxhIGMgdG8gXGMgKnRoaXMKKyAgKiBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgKiBcc2Egc2NhbGUoU2NhbGFyKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+CitpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6cHJlc2NhbGUoU2NhbGFyIHMpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTW9kZSE9aW50KElzb21ldHJ5KSwgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfU1BFQ0lGSUNfVFJBTlNGT1JNQVRJT05TKQorICBtX21hdHJpeC50ZW1wbGF0ZSB0b3BSb3dzPERpbT4oKSAqPSBzOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBBcHBsaWVzIG9uIHRoZSByaWdodCB0aGUgdHJhbnNsYXRpb24gbWF0cml4IHJlcHJlc2VudGVkIGJ5IHRoZSB2ZWN0b3IgXGEgb3RoZXIKKyAgKiB0byBcYyAqdGhpcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgKiBcc2EgcHJldHJhbnNsYXRlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYKK1RyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OnRyYW5zbGF0ZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9TUEVDSUZJQ19TSVpFKE90aGVyRGVyaXZlZCxpbnQoRGltKSkKKyAgdHJhbnNsYXRpb25FeHQoKSArPSBsaW5lYXJFeHQoKSAqIG90aGVyOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBBcHBsaWVzIG9uIHRoZSBsZWZ0IHRoZSB0cmFuc2xhdGlvbiBtYXRyaXggcmVwcmVzZW50ZWQgYnkgdGhlIHZlY3RvciBcYSBvdGhlcgorICAqIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqIFxzYSB0cmFuc2xhdGUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6cHJldHJhbnNsYXRlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX1NQRUNJRklDX1NJWkUoT3RoZXJEZXJpdmVkLGludChEaW0pKQorICBpZihpbnQoTW9kZSk9PWludChQcm9qZWN0aXZlKSkKKyAgICBhZmZpbmUoKSArPSBvdGhlciAqIG1fbWF0cml4LnJvdyhEaW0pOworICBlbHNlCisgICAgdHJhbnNsYXRpb24oKSArPSBvdGhlcjsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogQXBwbGllcyBvbiB0aGUgcmlnaHQgdGhlIHJvdGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3RhdGlvbiBcYSByb3RhdGlvbgorICAqIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBSb3RhdGlvblR5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIHJvdGF0aW9uIHdoaWNoCisgICogbXVzdCBiZSBrbm93biBieSBpbnRlcm5hbDo6dG9Sb3RhdGlvbk1hdHJpeDw+LgorICAqCisgICogTmF0aXZlbHkgc3VwcG9ydGVkIHR5cGVzIGluY2x1ZGVzOgorICAqICAgLSBhbnkgc2NhbGFyICgyRCksCisgICogICAtIGEgRGltIHggRGltIG1hdHJpeCBleHByZXNzaW9uLAorICAqICAgLSBhIFF1YXRlcm5pb24gKDNEKSwKKyAgKiAgIC0gYSBBbmdsZUF4aXMgKDNEKQorICAqCisgICogVGhpcyBtZWNoYW5pc20gaXMgZWFzaWx5IGV4dGVuZGFibGUgdG8gc3VwcG9ydCB1c2VyIHR5cGVzIHN1Y2ggYXMgRXVsZXIgYW5nbGVzLAorICAqIG9yIGEgcGFpciBvZiBRdWF0ZXJuaW9uIGZvciA0RCByb3RhdGlvbnMuCisgICoKKyAgKiBcc2Egcm90YXRlKFNjYWxhciksIGNsYXNzIFF1YXRlcm5pb24sIGNsYXNzIEFuZ2xlQXhpcywgcHJlcm90YXRlKFJvdGF0aW9uVHlwZSkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgordGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25UeXBlPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYKK1RyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OnJvdGF0ZShjb25zdCBSb3RhdGlvblR5cGUmIHJvdGF0aW9uKQoreworICBsaW5lYXJFeHQoKSAqPSBpbnRlcm5hbDo6dG9Sb3RhdGlvbk1hdHJpeDxTY2FsYXIsRGltPihyb3RhdGlvbik7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIGxlZnQgdGhlIHJvdGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3RhdGlvbiBcYSByb3RhdGlvbgorICAqIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqCisgICogU2VlIHJvdGF0ZSgpIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgICoKKyAgKiBcc2Egcm90YXRlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgordGVtcGxhdGU8dHlwZW5hbWUgUm90YXRpb25UeXBlPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYKK1RyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OnByZXJvdGF0ZShjb25zdCBSb3RhdGlvblR5cGUmIHJvdGF0aW9uKQoreworICBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sSERpbT4oMCwwKSA9IGludGVybmFsOjp0b1JvdGF0aW9uTWF0cml4PFNjYWxhcixEaW0+KHJvdGF0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1fbWF0cml4LnRlbXBsYXRlIGJsb2NrPERpbSxIRGltPigwLDApOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8qKiBBcHBsaWVzIG9uIHRoZSByaWdodCB0aGUgc2hlYXIgdHJhbnNmb3JtYXRpb24gcmVwcmVzZW50ZWQKKyAgKiBieSB0aGUgdmVjdG9yIFxhIG90aGVyIHRvIFxjICp0aGlzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIFxjICp0aGlzLgorICAqIFx3YXJuaW5nIDJEIG9ubHkuCisgICogXHNhIHByZXNoZWFyKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYKK1RyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OnNoZWFyKFNjYWxhciBzeCwgU2NhbGFyIHN5KQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKGludChEaW0pPT0yLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpCisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTW9kZSE9aW50KElzb21ldHJ5KSwgVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfU1BFQ0lGSUNfVFJBTlNGT1JNQVRJT05TKQorICBWZWN0b3JUeXBlIHRtcCA9IGxpbmVhcigpLmNvbCgwKSpzeSArIGxpbmVhcigpLmNvbCgxKTsKKyAgbGluZWFyKCkgPDwgbGluZWFyKCkuY29sKDApICsgbGluZWFyKCkuY29sKDEpKnN4LCB0bXA7CisgIHJldHVybiAqdGhpczsKK30KKworLyoqIEFwcGxpZXMgb24gdGhlIGxlZnQgdGhlIHNoZWFyIHRyYW5zZm9ybWF0aW9uIHJlcHJlc2VudGVkCisgICogYnkgdGhlIHZlY3RvciBcYSBvdGhlciB0byBcYyAqdGhpcyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgKiBcd2FybmluZyAyRCBvbmx5LgorICAqIFxzYSBzaGVhcigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK1RyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mCitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpwcmVzaGVhcihTY2FsYXIgc3gsIFNjYWxhciBzeSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChpbnQoRGltKT09MiwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKE1vZGUhPWludChJc29tZXRyeSksIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX1NQRUNJRklDX1RSQU5TRk9STUFUSU9OUykKKyAgbV9tYXRyaXgudGVtcGxhdGUgYmxvY2s8RGltLEhEaW0+KDAsMCkgPSBMaW5lYXJNYXRyaXhUeXBlKDEsIHN4LCBzeSwgMSkgKiBtX21hdHJpeC50ZW1wbGF0ZSBibG9jazxEaW0sSERpbT4oMCwwKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2NhbGluZywgVHJhbnNsYXRpb24gYW5kIFJvdGF0aW9uIGNvbXBhdGliaWxpdHkgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgoraW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46Om9wZXJhdG9yPShjb25zdCBUcmFuc2xhdGlvblR5cGUmIHQpCit7CisgIGxpbmVhcigpLnNldElkZW50aXR5KCk7CisgIHRyYW5zbGF0aW9uKCkgPSB0LnZlY3RvcigpOworICBtYWtlQWZmaW5lKCk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+CitpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpvcGVyYXRvciooY29uc3QgVHJhbnNsYXRpb25UeXBlJiB0KSBjb25zdAoreworICBUcmFuc2Zvcm0gcmVzID0gKnRoaXM7CisgIHJlcy50cmFuc2xhdGUodC52ZWN0b3IoKSk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgoraW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4mIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46Om9wZXJhdG9yPShjb25zdCBVbmlmb3JtU2NhbGluZzxTY2FsYXI+JiBzKQoreworICBtX21hdHJpeC5zZXRaZXJvKCk7CisgIGxpbmVhcigpLmRpYWdvbmFsKCkuZmlsbChzLmZhY3RvcigpKTsKKyAgbWFrZUFmZmluZSgpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JiBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpvcGVyYXRvcj0oY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikKK3sKKyAgbGluZWFyKCkgPSBpbnRlcm5hbDo6dG9Sb3RhdGlvbk1hdHJpeDxTY2FsYXIsRGltPihyKTsKKyAgdHJhbnNsYXRpb24oKS5zZXRaZXJvKCk7CisgIG1ha2VBZmZpbmUoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpvcGVyYXRvciooY29uc3QgUm90YXRpb25CYXNlPERlcml2ZWQsRGltPiYgcikgY29uc3QKK3sKKyAgVHJhbnNmb3JtIHJlcyA9ICp0aGlzOworICByZXMucm90YXRlKHIuZGVyaXZlZCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNwZWNpYWwgZnVuY3Rpb25zICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXHJldHVybnMgdGhlIHJvdGF0aW9uIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uCisgICoKKyAgKgorICAqIFxzdmRfbW9kdWxlCisgICoKKyAgKiBcc2EgY29tcHV0ZVJvdGF0aW9uU2NhbGluZygpLCBjb21wdXRlU2NhbGluZ1JvdGF0aW9uKCksIGNsYXNzIFNWRAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+Citjb25zdCB0eXBlbmFtZSBUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+OjpMaW5lYXJNYXRyaXhUeXBlCitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+Ojpyb3RhdGlvbigpIGNvbnN0Cit7CisgIExpbmVhck1hdHJpeFR5cGUgcmVzdWx0OworICBjb21wdXRlUm90YXRpb25TY2FsaW5nKCZyZXN1bHQsIChMaW5lYXJNYXRyaXhUeXBlKikwKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiogZGVjb21wb3NlcyB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGFzIGEgcHJvZHVjdCByb3RhdGlvbiB4IHNjYWxpbmcsIHRoZSBzY2FsaW5nIGJlaW5nCisgICogbm90IG5lY2Vzc2FyaWx5IHBvc2l0aXZlLgorICAqCisgICogSWYgZWl0aGVyIHBvaW50ZXIgaXMgemVybywgdGhlIGNvcnJlc3BvbmRpbmcgY29tcHV0YXRpb24gaXMgc2tpcHBlZC4KKyAgKgorICAqCisgICoKKyAgKiBcc3ZkX21vZHVsZQorICAqCisgICogXHNhIGNvbXB1dGVTY2FsaW5nUm90YXRpb24oKSwgcm90YXRpb24oKSwgY2xhc3MgU1ZECisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIFJvdGF0aW9uTWF0cml4VHlwZSwgdHlwZW5hbWUgU2NhbGluZ01hdHJpeFR5cGU+Cit2b2lkIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OmNvbXB1dGVSb3RhdGlvblNjYWxpbmcoUm90YXRpb25NYXRyaXhUeXBlICpyb3RhdGlvbiwgU2NhbGluZ01hdHJpeFR5cGUgKnNjYWxpbmcpIGNvbnN0Cit7CisgIEphY29iaVNWRDxMaW5lYXJNYXRyaXhUeXBlPiBzdmQobGluZWFyKCksIENvbXB1dGVGdWxsVSB8IENvbXB1dGVGdWxsVik7CisKKyAgU2NhbGFyIHggPSAoc3ZkLm1hdHJpeFUoKSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKS5kZXRlcm1pbmFudCgpOyAvLyBzbyB4IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxCisgIFZlY3RvclR5cGUgc3Yoc3ZkLnNpbmd1bGFyVmFsdWVzKCkpOworICBzdi5jb2VmZlJlZigwKSAqPSB4OworICBpZihzY2FsaW5nKSBzY2FsaW5nLT5sYXp5QXNzaWduKHN2ZC5tYXRyaXhWKCkgKiBzdi5hc0RpYWdvbmFsKCkgKiBzdmQubWF0cml4VigpLmFkam9pbnQoKSk7CisgIGlmKHJvdGF0aW9uKQorICB7CisgICAgTGluZWFyTWF0cml4VHlwZSBtKHN2ZC5tYXRyaXhVKCkpOworICAgIG0uY29sKDApIC89IHg7CisgICAgcm90YXRpb24tPmxhenlBc3NpZ24obSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKTsKKyAgfQorfQorCisvKiogZGVjb21wb3NlcyB0aGUgbGluZWFyIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGFzIGEgcHJvZHVjdCByb3RhdGlvbiB4IHNjYWxpbmcsIHRoZSBzY2FsaW5nIGJlaW5nCisgICogbm90IG5lY2Vzc2FyaWx5IHBvc2l0aXZlLgorICAqCisgICogSWYgZWl0aGVyIHBvaW50ZXIgaXMgemVybywgdGhlIGNvcnJlc3BvbmRpbmcgY29tcHV0YXRpb24gaXMgc2tpcHBlZC4KKyAgKgorICAqCisgICoKKyAgKiBcc3ZkX21vZHVsZQorICAqCisgICogXHNhIGNvbXB1dGVSb3RhdGlvblNjYWxpbmcoKSwgcm90YXRpb24oKSwgY2xhc3MgU1ZECisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxpbmdNYXRyaXhUeXBlLCB0eXBlbmFtZSBSb3RhdGlvbk1hdHJpeFR5cGU+Cit2b2lkIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz46OmNvbXB1dGVTY2FsaW5nUm90YXRpb24oU2NhbGluZ01hdHJpeFR5cGUgKnNjYWxpbmcsIFJvdGF0aW9uTWF0cml4VHlwZSAqcm90YXRpb24pIGNvbnN0Cit7CisgIEphY29iaVNWRDxMaW5lYXJNYXRyaXhUeXBlPiBzdmQobGluZWFyKCksIENvbXB1dGVGdWxsVSB8IENvbXB1dGVGdWxsVik7CisKKyAgU2NhbGFyIHggPSAoc3ZkLm1hdHJpeFUoKSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKS5kZXRlcm1pbmFudCgpOyAvLyBzbyB4IGhhcyBhYnNvbHV0ZSB2YWx1ZSAxCisgIFZlY3RvclR5cGUgc3Yoc3ZkLnNpbmd1bGFyVmFsdWVzKCkpOworICBzdi5jb2VmZlJlZigwKSAqPSB4OworICBpZihzY2FsaW5nKSBzY2FsaW5nLT5sYXp5QXNzaWduKHN2ZC5tYXRyaXhVKCkgKiBzdi5hc0RpYWdvbmFsKCkgKiBzdmQubWF0cml4VSgpLmFkam9pbnQoKSk7CisgIGlmKHJvdGF0aW9uKQorICB7CisgICAgTGluZWFyTWF0cml4VHlwZSBtKHN2ZC5tYXRyaXhVKCkpOworICAgIG0uY29sKDApIC89IHg7CisgICAgcm90YXRpb24tPmxhenlBc3NpZ24obSAqIHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpKTsKKyAgfQorfQorCisvKiogQ29udmVuaWVudCBtZXRob2QgdG8gc2V0IFxjICp0aGlzIGZyb20gYSBwb3NpdGlvbiwgb3JpZW50YXRpb24gYW5kIHNjYWxlCisgICogb2YgYSAzRCBvYmplY3QuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3RlbXBsYXRlPHR5cGVuYW1lIFBvc2l0aW9uRGVyaXZlZCwgdHlwZW5hbWUgT3JpZW50YXRpb25UeXBlLCB0eXBlbmFtZSBTY2FsZURlcml2ZWQ+CitUcmFuc2Zvcm08U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+JgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6ZnJvbVBvc2l0aW9uT3JpZW50YXRpb25TY2FsZShjb25zdCBNYXRyaXhCYXNlPFBvc2l0aW9uRGVyaXZlZD4gJnBvc2l0aW9uLAorICBjb25zdCBPcmllbnRhdGlvblR5cGUmIG9yaWVudGF0aW9uLCBjb25zdCBNYXRyaXhCYXNlPFNjYWxlRGVyaXZlZD4gJnNjYWxlKQoreworICBsaW5lYXIoKSA9IGludGVybmFsOjp0b1JvdGF0aW9uTWF0cml4PFNjYWxhcixEaW0+KG9yaWVudGF0aW9uKTsKKyAgbGluZWFyKCkgKj0gc2NhbGUuYXNEaWFnb25hbCgpOworICB0cmFuc2xhdGlvbigpID0gcG9zaXRpb247CisgIG1ha2VBZmZpbmUoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBzZWxlY3RvciBuZWVkZWQgdG8gYXZvaWQgdGFraW5nIHRoZSBpbnZlcnNlIG9mIGEgM3g0IG1hdHJpeAordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZSwgaW50IE1vZGU9VHJhbnNmb3JtVHlwZTo6TW9kZT4KK3N0cnVjdCBwcm9qZWN0aXZlX3RyYW5zZm9ybV9pbnZlcnNlCit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgVHJhbnNmb3JtVHlwZSYsIFRyYW5zZm9ybVR5cGUmKQorICB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3N0cnVjdCBwcm9qZWN0aXZlX3RyYW5zZm9ybV9pbnZlcnNlPFRyYW5zZm9ybVR5cGUsIFByb2plY3RpdmU+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgVHJhbnNmb3JtVHlwZSYgbSwgVHJhbnNmb3JtVHlwZSYgcmVzKQorICB7CisgICAgcmVzLm1hdHJpeCgpID0gbS5tYXRyaXgoKS5pbnZlcnNlKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKKy8qKgorICAqCisgICogXHJldHVybnMgdGhlIGludmVyc2UgdHJhbnNmb3JtYXRpb24gYWNjb3JkaW5nIHRvIHNvbWUgZ2l2ZW4ga25vd2xlZGdlCisgICogb24gXGMgKnRoaXMuCisgICoKKyAgKiBccGFyYW0gaGludCBhbGxvd3MgdG8gb3B0aW1pemUgdGhlIGludmVyc2lvbiBwcm9jZXNzIHdoZW4gdGhlIHRyYW5zZm9ybWF0aW9uCisgICogaXMga25vd24gdG8gYmUgbm90IGEgZ2VuZXJhbCB0cmFuc2Zvcm1hdGlvbiAob3B0aW9uYWwpLiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZToKKyAgKiAgLSAjUHJvamVjdGl2ZSBpZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGFmZmluZSwgaS5lLiwgaWYgdGhlCisgICogICAgbGFzdCByb3cgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgWzAgLi4uIDAgMV0KKyAgKiAgLSAjQWZmaW5lIGlmIHRoZSBsYXN0IHJvdyBjYW4gYmUgYXNzdW1lZCB0byBiZSBbMCAuLi4gMCAxXQorICAqICAtICNJc29tZXRyeSBpZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgb25seSBhIGNvbmNhdGVuYXRpb25zIG9mIHRyYW5zbGF0aW9ucworICAqICAgIGFuZCByb3RhdGlvbnMuCisgICogIFRoZSBkZWZhdWx0IGlzIHRoZSB0ZW1wbGF0ZSBjbGFzcyBwYXJhbWV0ZXIgXGMgTW9kZS4KKyAgKgorICAqIFx3YXJuaW5nIHVubGVzcyBcYSB0cmFpdHMgaXMgYWx3YXlzIHNldCB0byBOb1NoZWFyIG9yIE5vU2NhbGluZywgdGhpcyBmdW5jdGlvbgorICAqIHJlcXVpcmVzIHRoZSBnZW5lcmljIGludmVyc2UgbWV0aG9kIG9mIE1hdHJpeEJhc2UgZGVmaW5lZCBpbiB0aGUgTFUgbW9kdWxlLiBJZgorICAqIHlvdSBmb3JnZXQgdG8gaW5jbHVkZSB0aGlzIG1vZHVsZSwgdGhlbiB5b3Ugd2lsbCBnZXQgaGFyZCB0byBkZWJ1ZyBsaW5raW5nIGVycm9ycy4KKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjppbnZlcnNlKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE1vZGUsIGludCBPcHRpb25zPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPgorVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPjo6aW52ZXJzZShUcmFuc2Zvcm1UcmFpdHMgaGludCkgY29uc3QKK3sKKyAgVHJhbnNmb3JtIHJlczsKKyAgaWYgKGhpbnQgPT0gUHJvamVjdGl2ZSkKKyAgeworICAgIGludGVybmFsOjpwcm9qZWN0aXZlX3RyYW5zZm9ybV9pbnZlcnNlPFRyYW5zZm9ybT46OnJ1bigqdGhpcywgcmVzKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoaGludCA9PSBJc29tZXRyeSkKKyAgICB7CisgICAgICByZXMubWF0cml4KCkudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxEaW0sRGltPigpID0gbGluZWFyKCkudHJhbnNwb3NlKCk7CisgICAgfQorICAgIGVsc2UgaWYoaGludCZBZmZpbmUpCisgICAgeworICAgICAgcmVzLm1hdHJpeCgpLnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8RGltLERpbT4oKSA9IGxpbmVhcigpLmludmVyc2UoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAiSW52YWxpZCB0cmFuc2Zvcm0gdHJhaXRzIGluIFRyYW5zZm9ybTo6SW52ZXJzZSIpOworICAgIH0KKyAgICAvLyB0cmFuc2xhdGlvbiBhbmQgcmVtYWluaW5nIHBhcnRzCisgICAgcmVzLm1hdHJpeCgpLnRlbXBsYXRlIHRvcFJpZ2h0Q29ybmVyPERpbSwxPigpCisgICAgICA9IC0gcmVzLm1hdHJpeCgpLnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8RGltLERpbT4oKSAqIHRyYW5zbGF0aW9uKCk7CisgICAgcmVzLm1ha2VBZmZpbmUoKTsgLy8gd2UgZG8gbmVlZCB0aGlzLCBiZWNhdXNlIGluIHRoZSBiZWdpbm5pbmcgcmVzIGlzIHVuaW5pdGlhbGl6ZWQKKyAgfQorICByZXR1cm4gcmVzOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiBTcGVjaWFsaXphdGlvbnMgb2YgdGFrZSBhZmZpbmUgcGFydCAgICAgICAgICAgICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU+IHN0cnVjdCB0cmFuc2Zvcm1fdGFrZV9hZmZpbmVfcGFydCB7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6OkFmZmluZVBhcnQgQWZmaW5lUGFydDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpDb25zdEFmZmluZVBhcnQgQ29uc3RBZmZpbmVQYXJ0OworICBzdGF0aWMgaW5saW5lIEFmZmluZVBhcnQgcnVuKE1hdHJpeFR5cGUmIG0pCisgIHsgcmV0dXJuIG0udGVtcGxhdGUgYmxvY2s8VHJhbnNmb3JtVHlwZTo6RGltLFRyYW5zZm9ybVR5cGU6OkhEaW0+KDAsMCk7IH0KKyAgc3RhdGljIGlubGluZSBDb25zdEFmZmluZVBhcnQgcnVuKGNvbnN0IE1hdHJpeFR5cGUmIG0pCisgIHsgcmV0dXJuIG0udGVtcGxhdGUgYmxvY2s8VHJhbnNmb3JtVHlwZTo6RGltLFRyYW5zZm9ybVR5cGU6OkhEaW0+KDAsMCk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE9wdGlvbnM+CitzdHJ1Y3QgdHJhbnNmb3JtX3Rha2VfYWZmaW5lX3BhcnQ8VHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lQ29tcGFjdCwgT3B0aW9ucz4gPiB7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lQ29tcGFjdCxPcHRpb25zPjo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICBzdGF0aWMgaW5saW5lIE1hdHJpeFR5cGUmIHJ1bihNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBtOyB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgTWF0cml4VHlwZSYgcnVuKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIG07IH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNwZWNpYWxpemF0aW9ucyBvZiBjb25zdHJ1Y3QgZnJvbSBtYXRyaXggICAgICAgKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXIsIGludCBNb2RlLCBpbnQgT3B0aW9ucywgaW50IERpbSwgaW50IEhEaW0+CitzdHJ1Y3QgdHJhbnNmb3JtX2NvbnN0cnVjdF9mcm9tX21hdHJpeDxPdGhlciwgTW9kZSxPcHRpb25zLERpbSxIRGltLCBEaW0sRGltPgoreworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+ICp0cmFuc2Zvcm0sIGNvbnN0IE90aGVyJiBvdGhlcikKKyAgeworICAgIHRyYW5zZm9ybS0+bGluZWFyKCkgPSBvdGhlcjsKKyAgICB0cmFuc2Zvcm0tPnRyYW5zbGF0aW9uKCkuc2V0WmVybygpOworICAgIHRyYW5zZm9ybS0+bWFrZUFmZmluZSgpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwgaW50IE1vZGUsIGludCBPcHRpb25zLCBpbnQgRGltLCBpbnQgSERpbT4KK3N0cnVjdCB0cmFuc2Zvcm1fY29uc3RydWN0X2Zyb21fbWF0cml4PE90aGVyLCBNb2RlLE9wdGlvbnMsRGltLEhEaW0sIERpbSxIRGltPgoreworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+ICp0cmFuc2Zvcm0sIGNvbnN0IE90aGVyJiBvdGhlcikKKyAgeworICAgIHRyYW5zZm9ybS0+YWZmaW5lKCkgPSBvdGhlcjsKKyAgICB0cmFuc2Zvcm0tPm1ha2VBZmZpbmUoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXIsIGludCBNb2RlLCBpbnQgT3B0aW9ucywgaW50IERpbSwgaW50IEhEaW0+CitzdHJ1Y3QgdHJhbnNmb3JtX2NvbnN0cnVjdF9mcm9tX21hdHJpeDxPdGhlciwgTW9kZSxPcHRpb25zLERpbSxIRGltLCBIRGltLEhEaW0+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oVHJhbnNmb3JtPHR5cGVuYW1lIE90aGVyOjpTY2FsYXIsRGltLE1vZGUsT3B0aW9ucz4gKnRyYW5zZm9ybSwgY29uc3QgT3RoZXImIG90aGVyKQorICB7IHRyYW5zZm9ybS0+bWF0cml4KCkgPSBvdGhlcjsgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXIsIGludCBPcHRpb25zLCBpbnQgRGltLCBpbnQgSERpbT4KK3N0cnVjdCB0cmFuc2Zvcm1fY29uc3RydWN0X2Zyb21fbWF0cml4PE90aGVyLCBBZmZpbmVDb21wYWN0LE9wdGlvbnMsRGltLEhEaW0sIEhEaW0sSERpbT4KK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihUcmFuc2Zvcm08dHlwZW5hbWUgT3RoZXI6OlNjYWxhcixEaW0sQWZmaW5lQ29tcGFjdCxPcHRpb25zPiAqdHJhbnNmb3JtLCBjb25zdCBPdGhlciYgb3RoZXIpCisgIHsgdHJhbnNmb3JtLT5tYXRyaXgoKSA9IG90aGVyLnRlbXBsYXRlIGJsb2NrPERpbSxIRGltPigwLDApOyB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqICAgU3BlY2lhbGl6YXRpb25zIG9mIG9wZXJhdG9yKiB3aXRoIHJocyBFaWdlbkJhc2UgICAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPGludCBMaHNNb2RlLGludCBSaHNNb2RlPgorc3RydWN0IHRyYW5zZm9ybV9wcm9kdWN0X3Jlc3VsdAoreworICBlbnVtIAorICB7IAorICAgIE1vZGUgPQorICAgICAgKExoc01vZGUgPT0gKGludClQcm9qZWN0aXZlICAgIHx8IFJoc01vZGUgPT0gKGludClQcm9qZWN0aXZlICAgICkgPyBQcm9qZWN0aXZlIDoKKyAgICAgIChMaHNNb2RlID09IChpbnQpQWZmaW5lICAgICAgICB8fCBSaHNNb2RlID09IChpbnQpQWZmaW5lICAgICAgICApID8gQWZmaW5lIDoKKyAgICAgIChMaHNNb2RlID09IChpbnQpQWZmaW5lQ29tcGFjdCB8fCBSaHNNb2RlID09IChpbnQpQWZmaW5lQ29tcGFjdCApID8gQWZmaW5lQ29tcGFjdCA6CisgICAgICAoTGhzTW9kZSA9PSAoaW50KUlzb21ldHJ5ICAgICAgfHwgUmhzTW9kZSA9PSAoaW50KUlzb21ldHJ5ICAgICAgKSA/IElzb21ldHJ5IDogUHJvamVjdGl2ZQorICB9OworfTsKKwordGVtcGxhdGU8IHR5cGVuYW1lIFRyYW5zZm9ybVR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGUgPgorc3RydWN0IHRyYW5zZm9ybV9yaWdodF9wcm9kdWN0X2ltcGw8IFRyYW5zZm9ybVR5cGUsIE1hdHJpeFR5cGUsIDAgPgoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0IFJlc3VsdFR5cGU7CisKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgUmVzdWx0VHlwZSBydW4oY29uc3QgVHJhbnNmb3JtVHlwZSYgVCwgY29uc3QgTWF0cml4VHlwZSYgb3RoZXIpCisgIHsKKyAgICByZXR1cm4gVC5tYXRyaXgoKSAqIG90aGVyOworICB9Cit9OworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZSA+CitzdHJ1Y3QgdHJhbnNmb3JtX3JpZ2h0X3Byb2R1Y3RfaW1wbDwgVHJhbnNmb3JtVHlwZSwgTWF0cml4VHlwZSwgMSA+Cit7CisgIGVudW0geyAKKyAgICBEaW0gPSBUcmFuc2Zvcm1UeXBlOjpEaW0sIAorICAgIEhEaW0gPSBUcmFuc2Zvcm1UeXBlOjpIRGltLAorICAgIE90aGVyUm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIE90aGVyQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lCisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpQbGFpbk9iamVjdCBSZXN1bHRUeXBlOworCisgIHN0YXRpYyBFSUdFTl9TVFJPTkdfSU5MSU5FIFJlc3VsdFR5cGUgcnVuKGNvbnN0IFRyYW5zZm9ybVR5cGUmIFQsIGNvbnN0IE1hdHJpeFR5cGUmIG90aGVyKQorICB7CisgICAgRUlHRU5fU1RBVElDX0FTU0VSVChPdGhlclJvd3M9PUhEaW0sIFlPVV9NSVhFRF9NQVRSSUNFU19PRl9ESUZGRVJFTlRfU0laRVMpOworCisgICAgdHlwZWRlZiBCbG9jazxSZXN1bHRUeXBlLCBEaW0sIE90aGVyQ29scywgaW50KE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lKT09RGltPiBUb3BMZWZ0TGhzOworCisgICAgUmVzdWx0VHlwZSByZXMob3RoZXIucm93cygpLG90aGVyLmNvbHMoKSk7CisgICAgVG9wTGVmdExocyhyZXMsIDAsIDAsIERpbSwgb3RoZXIuY29scygpKS5ub2FsaWFzKCkgPSBULmFmZmluZSgpICogb3RoZXI7CisgICAgcmVzLnJvdyhPdGhlclJvd3MtMSkgPSBvdGhlci5yb3coT3RoZXJSb3dzLTEpOworICAgIAorICAgIHJldHVybiByZXM7CisgIH0KK307CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlLCB0eXBlbmFtZSBNYXRyaXhUeXBlID4KK3N0cnVjdCB0cmFuc2Zvcm1fcmlnaHRfcHJvZHVjdF9pbXBsPCBUcmFuc2Zvcm1UeXBlLCBNYXRyaXhUeXBlLCAyID4KK3sKKyAgZW51bSB7IAorICAgIERpbSA9IFRyYW5zZm9ybVR5cGU6OkRpbSwgCisgICAgSERpbSA9IFRyYW5zZm9ybVR5cGU6OkhEaW0sCisgICAgT3RoZXJSb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgT3RoZXJDb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlBsYWluT2JqZWN0IFJlc3VsdFR5cGU7CisKKyAgc3RhdGljIEVJR0VOX1NUUk9OR19JTkxJTkUgUmVzdWx0VHlwZSBydW4oY29uc3QgVHJhbnNmb3JtVHlwZSYgVCwgY29uc3QgTWF0cml4VHlwZSYgb3RoZXIpCisgIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKE90aGVyUm93cz09RGltLCBZT1VfTUlYRURfTUFUUklDRVNfT0ZfRElGRkVSRU5UX1NJWkVTKTsKKworICAgIHR5cGVkZWYgQmxvY2s8UmVzdWx0VHlwZSwgRGltLCBPdGhlckNvbHMsIHRydWU+IFRvcExlZnRMaHM7CisgICAgUmVzdWx0VHlwZSByZXMoUmVwbGljYXRlPHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6OkNvbnN0VHJhbnNsYXRpb25QYXJ0LCAxLCBPdGhlckNvbHM+KFQudHJhbnNsYXRpb24oKSwxLG90aGVyLmNvbHMoKSkpOworICAgIFRvcExlZnRMaHMocmVzLCAwLCAwLCBEaW0sIG90aGVyLmNvbHMoKSkubm9hbGlhcygpICs9IFQubGluZWFyKCkgKiBvdGhlcjsKKworICAgIHJldHVybiByZXM7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogICBTcGVjaWFsaXphdGlvbnMgb2Ygb3BlcmF0b3IqIHdpdGggbGhzIEVpZ2VuQmFzZSAgICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gZ2VuZXJpYyBIRGltIHggSERpbSBtYXRyaXggKiBUID0+IFByb2plY3RpdmUKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyLGludCBNb2RlLCBpbnQgT3B0aW9ucywgaW50IERpbSwgaW50IEhEaW0+CitzdHJ1Y3QgdHJhbnNmb3JtX2xlZnRfcHJvZHVjdF9pbXBsPE90aGVyLE1vZGUsT3B0aW9ucyxEaW0sSERpbSwgSERpbSxIRGltPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxQcm9qZWN0aXZlLE9wdGlvbnM+IFJlc3VsdFR5cGU7CisgIHN0YXRpYyBSZXN1bHRUeXBlIHJ1bihjb25zdCBPdGhlciYgb3RoZXIsY29uc3QgVHJhbnNmb3JtVHlwZSYgdHIpCisgIHsgcmV0dXJuIFJlc3VsdFR5cGUob3RoZXIgKiB0ci5tYXRyaXgoKSk7IH0KK307CisKKy8vIGdlbmVyaWMgSERpbSB4IEhEaW0gbWF0cml4ICogQWZmaW5lQ29tcGFjdCA9PiBQcm9qZWN0aXZlCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwgaW50IE9wdGlvbnMsIGludCBEaW0sIGludCBIRGltPgorc3RydWN0IHRyYW5zZm9ybV9sZWZ0X3Byb2R1Y3RfaW1wbDxPdGhlcixBZmZpbmVDb21wYWN0LE9wdGlvbnMsRGltLEhEaW0sIEhEaW0sSERpbT4KK3sKKyAgdHlwZWRlZiBUcmFuc2Zvcm08dHlwZW5hbWUgT3RoZXI6OlNjYWxhcixEaW0sQWZmaW5lQ29tcGFjdCxPcHRpb25zPiBUcmFuc2Zvcm1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08dHlwZW5hbWUgT3RoZXI6OlNjYWxhcixEaW0sUHJvamVjdGl2ZSxPcHRpb25zPiBSZXN1bHRUeXBlOworICBzdGF0aWMgUmVzdWx0VHlwZSBydW4oY29uc3QgT3RoZXImIG90aGVyLGNvbnN0IFRyYW5zZm9ybVR5cGUmIHRyKQorICB7CisgICAgUmVzdWx0VHlwZSByZXM7CisgICAgcmVzLm1hdHJpeCgpLm5vYWxpYXMoKSA9IG90aGVyLnRlbXBsYXRlIGJsb2NrPEhEaW0sRGltPigwLDApICogdHIubWF0cml4KCk7CisgICAgcmVzLm1hdHJpeCgpLmNvbChEaW0pICs9IG90aGVyLmNvbChEaW0pOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKKy8vIGFmZmluZSBtYXRyaXggKiBUCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcixpbnQgTW9kZSwgaW50IE9wdGlvbnMsIGludCBEaW0sIGludCBIRGltPgorc3RydWN0IHRyYW5zZm9ybV9sZWZ0X3Byb2R1Y3RfaW1wbDxPdGhlcixNb2RlLE9wdGlvbnMsRGltLEhEaW0sIERpbSxIRGltPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIFRyYW5zZm9ybVR5cGUgUmVzdWx0VHlwZTsKKyAgc3RhdGljIFJlc3VsdFR5cGUgcnVuKGNvbnN0IE90aGVyJiBvdGhlcixjb25zdCBUcmFuc2Zvcm1UeXBlJiB0cikKKyAgeworICAgIFJlc3VsdFR5cGUgcmVzOworICAgIHJlcy5hZmZpbmUoKS5ub2FsaWFzKCkgPSBvdGhlciAqIHRyLm1hdHJpeCgpOworICAgIHJlcy5tYXRyaXgoKS5yb3coRGltKSA9IHRyLm1hdHJpeCgpLnJvdyhEaW0pOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKKy8vIGFmZmluZSBtYXRyaXggKiBBZmZpbmVDb21wYWN0Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlciwgaW50IE9wdGlvbnMsIGludCBEaW0sIGludCBIRGltPgorc3RydWN0IHRyYW5zZm9ybV9sZWZ0X3Byb2R1Y3RfaW1wbDxPdGhlcixBZmZpbmVDb21wYWN0LE9wdGlvbnMsRGltLEhEaW0sIERpbSxIRGltPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTx0eXBlbmFtZSBPdGhlcjo6U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LE9wdGlvbnM+IFRyYW5zZm9ybVR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIFRyYW5zZm9ybVR5cGUgUmVzdWx0VHlwZTsKKyAgc3RhdGljIFJlc3VsdFR5cGUgcnVuKGNvbnN0IE90aGVyJiBvdGhlcixjb25zdCBUcmFuc2Zvcm1UeXBlJiB0cikKKyAgeworICAgIFJlc3VsdFR5cGUgcmVzOworICAgIHJlcy5tYXRyaXgoKS5ub2FsaWFzKCkgPSBvdGhlci50ZW1wbGF0ZSBibG9jazxEaW0sRGltPigwLDApICogdHIubWF0cml4KCk7CisgICAgcmVzLnRyYW5zbGF0aW9uKCkgKz0gb3RoZXIuY29sKERpbSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKworLy8gbGluZWFyIG1hdHJpeCAqIFQKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyLGludCBNb2RlLCBpbnQgT3B0aW9ucywgaW50IERpbSwgaW50IEhEaW0+CitzdHJ1Y3QgdHJhbnNmb3JtX2xlZnRfcHJvZHVjdF9pbXBsPE90aGVyLE1vZGUsT3B0aW9ucyxEaW0sSERpbSwgRGltLERpbT4KK3sKKyAgdHlwZWRlZiBUcmFuc2Zvcm08dHlwZW5hbWUgT3RoZXI6OlNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiBUcmFuc2Zvcm1UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBUcmFuc2Zvcm1UeXBlIFJlc3VsdFR5cGU7CisgIHN0YXRpYyBSZXN1bHRUeXBlIHJ1bihjb25zdCBPdGhlciYgb3RoZXIsIGNvbnN0IFRyYW5zZm9ybVR5cGUmIHRyKQorICB7CisgICAgVHJhbnNmb3JtVHlwZSByZXM7CisgICAgaWYoTW9kZSE9aW50KEFmZmluZUNvbXBhY3QpKQorICAgICAgcmVzLm1hdHJpeCgpLnJvdyhEaW0pID0gdHIubWF0cml4KCkucm93KERpbSk7CisgICAgcmVzLm1hdHJpeCgpLnRlbXBsYXRlIHRvcFJvd3M8RGltPigpLm5vYWxpYXMoKQorICAgICAgPSBvdGhlciAqIHRyLm1hdHJpeCgpLnRlbXBsYXRlIHRvcFJvd3M8RGltPigpOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU3BlY2lhbGl6YXRpb25zIG9mIG9wZXJhdG9yKiB3aXRoIGFub3RoZXIgVHJhbnNmb3JtICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgTGhzTW9kZSwgaW50IExoc09wdGlvbnMsIGludCBSaHNNb2RlLCBpbnQgUmhzT3B0aW9ucz4KK3N0cnVjdCB0cmFuc2Zvcm1fdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDxUcmFuc2Zvcm08U2NhbGFyLERpbSxMaHNNb2RlLExoc09wdGlvbnM+LFRyYW5zZm9ybTxTY2FsYXIsRGltLFJoc01vZGUsUmhzT3B0aW9ucz4sZmFsc2UgPgoreworICBlbnVtIHsgUmVzdWx0TW9kZSA9IHRyYW5zZm9ybV9wcm9kdWN0X3Jlc3VsdDxMaHNNb2RlLFJoc01vZGU+OjpNb2RlIH07CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sTGhzTW9kZSxMaHNPcHRpb25zPiBMaHM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sUmhzTW9kZSxSaHNPcHRpb25zPiBSaHM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sUmVzdWx0TW9kZSxMaHNPcHRpb25zPiBSZXN1bHRUeXBlOworICBzdGF0aWMgUmVzdWx0VHlwZSBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgUmVzdWx0VHlwZSByZXM7CisgICAgcmVzLmxpbmVhcigpID0gbGhzLmxpbmVhcigpICogcmhzLmxpbmVhcigpOworICAgIHJlcy50cmFuc2xhdGlvbigpID0gbGhzLmxpbmVhcigpICogcmhzLnRyYW5zbGF0aW9uKCkgKyBsaHMudHJhbnNsYXRpb24oKTsKKyAgICByZXMubWFrZUFmZmluZSgpOworICAgIHJldHVybiByZXM7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IExoc01vZGUsIGludCBMaHNPcHRpb25zLCBpbnQgUmhzTW9kZSwgaW50IFJoc09wdGlvbnM+CitzdHJ1Y3QgdHJhbnNmb3JtX3RyYW5zZm9ybV9wcm9kdWN0X2ltcGw8VHJhbnNmb3JtPFNjYWxhcixEaW0sTGhzTW9kZSxMaHNPcHRpb25zPixUcmFuc2Zvcm08U2NhbGFyLERpbSxSaHNNb2RlLFJoc09wdGlvbnM+LHRydWUgPgoreworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLExoc01vZGUsTGhzT3B0aW9ucz4gTGhzOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLFJoc01vZGUsUmhzT3B0aW9ucz4gUmhzOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLFByb2plY3RpdmU+IFJlc3VsdFR5cGU7CisgIHN0YXRpYyBSZXN1bHRUeXBlIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgIHsKKyAgICByZXR1cm4gUmVzdWx0VHlwZSggbGhzLm1hdHJpeCgpICogcmhzLm1hdHJpeCgpICk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IExoc09wdGlvbnMsIGludCBSaHNPcHRpb25zPgorc3RydWN0IHRyYW5zZm9ybV90cmFuc2Zvcm1fcHJvZHVjdF9pbXBsPFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZUNvbXBhY3QsTGhzT3B0aW9ucz4sVHJhbnNmb3JtPFNjYWxhcixEaW0sUHJvamVjdGl2ZSxSaHNPcHRpb25zPix0cnVlID4KK3sKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LExoc09wdGlvbnM+IExoczsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlLFJoc09wdGlvbnM+IFJoczsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlPiBSZXN1bHRUeXBlOworICBzdGF0aWMgUmVzdWx0VHlwZSBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICB7CisgICAgUmVzdWx0VHlwZSByZXM7CisgICAgcmVzLm1hdHJpeCgpLnRlbXBsYXRlIHRvcFJvd3M8RGltPigpID0gbGhzLm1hdHJpeCgpICogcmhzLm1hdHJpeCgpOworICAgIHJlcy5tYXRyaXgoKS5yb3coRGltKSA9IHJocy5tYXRyaXgoKS5yb3coRGltKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBMaHNPcHRpb25zLCBpbnQgUmhzT3B0aW9ucz4KK3N0cnVjdCB0cmFuc2Zvcm1fdHJhbnNmb3JtX3Byb2R1Y3RfaW1wbDxUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlLExoc09wdGlvbnM+LFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZUNvbXBhY3QsUmhzT3B0aW9ucz4sdHJ1ZSA+Cit7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sUHJvamVjdGl2ZSxMaHNPcHRpb25zPiBMaHM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lQ29tcGFjdCxSaHNPcHRpb25zPiBSaHM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sUHJvamVjdGl2ZT4gUmVzdWx0VHlwZTsKKyAgc3RhdGljIFJlc3VsdFR5cGUgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgeworICAgIFJlc3VsdFR5cGUgcmVzKGxocy5tYXRyaXgoKS50ZW1wbGF0ZSBsZWZ0Q29sczxEaW0+KCkgKiByaHMubWF0cml4KCkpOworICAgIHJlcy5tYXRyaXgoKS5jb2woRGltKSArPSBsaHMubWF0cml4KCkuY29sKERpbSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVFJBTlNGT1JNX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9UcmFuc2xhdGlvbi5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1RyYW5zbGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkYTE3OQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9UcmFuc2xhdGlvbi5oCkBAIC0wLDAgKzEsMjA2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVFJBTlNMQVRJT05fSAorI2RlZmluZSBFSUdFTl9UUkFOU0xBVElPTl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGdlb21ldHJ5X21vZHVsZSBcaW5ncm91cCBHZW9tZXRyeV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBUcmFuc2xhdGlvbgorICAqCisgICogXGJyaWVmIFJlcHJlc2VudHMgYSB0cmFuc2xhdGlvbiB0cmFuc2Zvcm1hdGlvbgorICAqCisgICogXHBhcmFtIF9TY2FsYXIgdGhlIHNjYWxhciB0eXBlLCBpLmUuLCB0aGUgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzLgorICAqIFxwYXJhbSBfRGltIHRoZSAgZGltZW5zaW9uIG9mIHRoZSBzcGFjZSwgY2FuIGJlIGEgY29tcGlsZSB0aW1lIHZhbHVlIG9yIER5bmFtaWMKKyAgKgorICAqIFxub3RlIFRoaXMgY2xhc3MgaXMgbm90IGFpbWVkIHRvIGJlIHVzZWQgdG8gc3RvcmUgYSB0cmFuc2xhdGlvbiB0cmFuc2Zvcm1hdGlvbiwKKyAgKiBidXQgcmF0aGVyIHRvIG1ha2UgZWFzaWVyIHRoZSBjb25zdHJ1Y3Rpb25zIGFuZCB1cGRhdGVzIG9mIFRyYW5zZm9ybSBvYmplY3RzLgorICAqCisgICogXHNhIGNsYXNzIFNjYWxpbmcsIGNsYXNzIFRyYW5zZm9ybQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0+CitjbGFzcyBUcmFuc2xhdGlvbgoreworcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0RpbSkKKyAgLyoqIGRpbWVuc2lvbiBvZiB0aGUgc3BhY2UgKi8KKyAgZW51bSB7IERpbSA9IF9EaW0gfTsKKyAgLyoqIHRoZSBzY2FsYXIgdHlwZSBvZiB0aGUgY29lZmZpY2llbnRzICovCisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIC8qKiBjb3JyZXNwb25kaW5nIHZlY3RvciB0eXBlICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sMT4gVmVjdG9yVHlwZTsKKyAgLyoqIGNvcnJlc3BvbmRpbmcgbGluZWFyIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0eXBlICovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0sRGltPiBMaW5lYXJNYXRyaXhUeXBlOworICAvKiogY29ycmVzcG9uZGluZyBhZmZpbmUgdHJhbnNmb3JtYXRpb24gdHlwZSAqLworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZT4gQWZmaW5lVHJhbnNmb3JtVHlwZTsKKyAgLyoqIGNvcnJlc3BvbmRpbmcgaXNvbWV0cmljIHRyYW5zZm9ybWF0aW9uIHR5cGUgKi8KKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxJc29tZXRyeT4gSXNvbWV0cnlUcmFuc2Zvcm1UeXBlOworCitwcm90ZWN0ZWQ6CisKKyAgVmVjdG9yVHlwZSBtX2NvZWZmczsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uICovCisgIFRyYW5zbGF0aW9uKCkge30KKyAgLyoqICAqLworICBpbmxpbmUgVHJhbnNsYXRpb24oY29uc3QgU2NhbGFyJiBzeCwgY29uc3QgU2NhbGFyJiBzeSkKKyAgeworICAgIGVpZ2VuX2Fzc2VydChEaW09PTIpOworICAgIG1fY29lZmZzLngoKSA9IHN4OworICAgIG1fY29lZmZzLnkoKSA9IHN5OworICB9CisgIC8qKiAgKi8KKyAgaW5saW5lIFRyYW5zbGF0aW9uKGNvbnN0IFNjYWxhciYgc3gsIGNvbnN0IFNjYWxhciYgc3ksIGNvbnN0IFNjYWxhciYgc3opCisgIHsKKyAgICBlaWdlbl9hc3NlcnQoRGltPT0zKTsKKyAgICBtX2NvZWZmcy54KCkgPSBzeDsKKyAgICBtX2NvZWZmcy55KCkgPSBzeTsKKyAgICBtX2NvZWZmcy56KCkgPSBzejsKKyAgfQorICAvKiogQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZSB0aGUgdHJhbnNsYXRpb24gdHJhbnNmb3JtYXRpb24gZnJvbSBhIHZlY3RvciBvZiB0cmFuc2xhdGlvbiBjb2VmZmljaWVudHMgKi8KKyAgZXhwbGljaXQgaW5saW5lIFRyYW5zbGF0aW9uKGNvbnN0IFZlY3RvclR5cGUmIHZlY3RvcikgOiBtX2NvZWZmcyh2ZWN0b3IpIHt9CisKKyAgLyoqIFxicmllZiBSZXRydW5zIHRoZSB4LXRyYW5zbGF0aW9uIGJ5IHZhbHVlLiAqKi8KKyAgaW5saW5lIFNjYWxhciB4KCkgY29uc3QgeyByZXR1cm4gbV9jb2VmZnMueCgpOyB9CisgIC8qKiBcYnJpZWYgUmV0cnVucyB0aGUgeS10cmFuc2xhdGlvbiBieSB2YWx1ZS4gKiovCisgIGlubGluZSBTY2FsYXIgeSgpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzLnkoKTsgfQorICAvKiogXGJyaWVmIFJldHJ1bnMgdGhlIHotdHJhbnNsYXRpb24gYnkgdmFsdWUuICoqLworICBpbmxpbmUgU2NhbGFyIHooKSBjb25zdCB7IHJldHVybiBtX2NvZWZmcy56KCk7IH0KKworICAvKiogXGJyaWVmIFJldHJ1bnMgdGhlIHgtdHJhbnNsYXRpb24gYXMgYSByZWZlcmVuY2UuICoqLworICBpbmxpbmUgU2NhbGFyJiB4KCkgeyByZXR1cm4gbV9jb2VmZnMueCgpOyB9CisgIC8qKiBcYnJpZWYgUmV0cnVucyB0aGUgeS10cmFuc2xhdGlvbiBhcyBhIHJlZmVyZW5jZS4gKiovCisgIGlubGluZSBTY2FsYXImIHkoKSB7IHJldHVybiBtX2NvZWZmcy55KCk7IH0KKyAgLyoqIFxicmllZiBSZXRydW5zIHRoZSB6LXRyYW5zbGF0aW9uIGFzIGEgcmVmZXJlbmNlLiAqKi8KKyAgaW5saW5lIFNjYWxhciYgeigpIHsgcmV0dXJuIG1fY29lZmZzLnooKTsgfQorCisgIGNvbnN0IFZlY3RvclR5cGUmIHZlY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fY29lZmZzOyB9CisgIFZlY3RvclR5cGUmIHZlY3RvcigpIHsgcmV0dXJuIG1fY29lZmZzOyB9CisKKyAgY29uc3QgVmVjdG9yVHlwZSYgdHJhbnNsYXRpb24oKSBjb25zdCB7IHJldHVybiBtX2NvZWZmczsgfQorICBWZWN0b3JUeXBlJiB0cmFuc2xhdGlvbigpIHsgcmV0dXJuIG1fY29lZmZzOyB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyB0d28gdHJhbnNsYXRpb24gKi8KKyAgaW5saW5lIFRyYW5zbGF0aW9uIG9wZXJhdG9yKiAoY29uc3QgVHJhbnNsYXRpb24mIG90aGVyKSBjb25zdAorICB7IHJldHVybiBUcmFuc2xhdGlvbihtX2NvZWZmcyArIG90aGVyLm1fY29lZmZzKTsgfQorCisgIC8qKiBDb25jYXRlbmF0ZXMgYSB0cmFuc2xhdGlvbiBhbmQgYSB1bmlmb3JtIHNjYWxpbmcgKi8KKyAgaW5saW5lIEFmZmluZVRyYW5zZm9ybVR5cGUgb3BlcmF0b3IqIChjb25zdCBVbmlmb3JtU2NhbGluZzxTY2FsYXI+JiBvdGhlcikgY29uc3Q7CisKKyAgLyoqIENvbmNhdGVuYXRlcyBhIHRyYW5zbGF0aW9uIGFuZCBhIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIGlubGluZSBBZmZpbmVUcmFuc2Zvcm1UeXBlIG9wZXJhdG9yKiAoY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIGxpbmVhcikgY29uc3Q7CisKKyAgLyoqIENvbmNhdGVuYXRlcyBhIHRyYW5zbGF0aW9uIGFuZCBhIHJvdGF0aW9uICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgIGlubGluZSBJc29tZXRyeVRyYW5zZm9ybVR5cGUgb3BlcmF0b3IqKGNvbnN0IFJvdGF0aW9uQmFzZTxEZXJpdmVkLERpbT4mIHIpIGNvbnN0CisgIHsgcmV0dXJuICp0aGlzICogSXNvbWV0cnlUcmFuc2Zvcm1UeXBlKHIpOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgbGluZWFyIHRyYW5zZm9ybWF0aW9uIFxhIGwgd2l0aCB0aGUgdHJhbnNsYXRpb24gXGEgdCAqLworICAvLyBpdHMgYSBuaWdodG1hcmUgdG8gZGVmaW5lIGEgdGVtcGxhdGVkIGZyaWVuZCBmdW5jdGlvbiBvdXRzaWRlIGl0cyBkZWNsYXJhdGlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IGZyaWVuZAorICBpbmxpbmUgQWZmaW5lVHJhbnNmb3JtVHlwZSBvcGVyYXRvciooY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIGxpbmVhciwgY29uc3QgVHJhbnNsYXRpb24mIHQpCisgIHsKKyAgICBBZmZpbmVUcmFuc2Zvcm1UeXBlIHJlczsKKyAgICByZXMubWF0cml4KCkuc2V0WmVybygpOworICAgIHJlcy5saW5lYXIoKSA9IGxpbmVhci5kZXJpdmVkKCk7CisgICAgcmVzLnRyYW5zbGF0aW9uKCkgPSBsaW5lYXIuZGVyaXZlZCgpICogdC5tX2NvZWZmczsKKyAgICByZXMubWF0cml4KCkucm93KERpbSkuc2V0WmVybygpOworICAgIHJlcyhEaW0sRGltKSA9IFNjYWxhcigxKTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgLyoqIENvbmNhdGVuYXRlcyBhIHRyYW5zbGF0aW9uIGFuZCBhIHRyYW5zZm9ybWF0aW9uICovCisgIHRlbXBsYXRlPGludCBNb2RlLCBpbnQgT3B0aW9ucz4KKyAgaW5saW5lIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGU+IG9wZXJhdG9yKiAoY29uc3QgVHJhbnNmb3JtPFNjYWxhcixEaW0sTW9kZSxPcHRpb25zPiYgdCkgY29uc3QKKyAgeworICAgIFRyYW5zZm9ybTxTY2FsYXIsRGltLE1vZGU+IHJlcyA9IHQ7CisgICAgcmVzLnByZXRyYW5zbGF0ZShtX2NvZWZmcyk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIC8qKiBBcHBsaWVzIHRyYW5zbGF0aW9uIHRvIHZlY3RvciAqLworICBpbmxpbmUgVmVjdG9yVHlwZSBvcGVyYXRvciogKGNvbnN0IFZlY3RvclR5cGUmIG90aGVyKSBjb25zdAorICB7IHJldHVybiBtX2NvZWZmcyArIG90aGVyOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIHRyYW5zbGF0aW9uIChvcHBvc2l0ZSkgKi8KKyAgVHJhbnNsYXRpb24gaW52ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIFRyYW5zbGF0aW9uKC1tX2NvZWZmcyk7IH0KKworICBUcmFuc2xhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zbGF0aW9uJiBvdGhlcikKKyAgeworICAgIG1fY29lZmZzID0gb3RoZXIubV9jb2VmZnM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IFRyYW5zbGF0aW9uIElkZW50aXR5KCkgeyByZXR1cm4gVHJhbnNsYXRpb24oVmVjdG9yVHlwZTo6WmVybygpKTsgfQorCisgIC8qKiBccmV0dXJucyBcYyAqdGhpcyB3aXRoIHNjYWxhciB0eXBlIGNhc3RlZCB0byBcYSBOZXdTY2FsYXJUeXBlCisgICAgKgorICAgICogTm90ZSB0aGF0IGlmIFxhIE5ld1NjYWxhclR5cGUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2NhbGFyIHR5cGUgb2YgXGMgKnRoaXMKKyAgICAqIHRoZW4gdGhpcyBmdW5jdGlvbiBzbWFydGx5IHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gXGMgKnRoaXMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTmV3U2NhbGFyVHlwZT4KKyAgaW5saW5lIHR5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPFRyYW5zbGF0aW9uLFRyYW5zbGF0aW9uPE5ld1NjYWxhclR5cGUsRGltPiA+Ojp0eXBlIGNhc3QoKSBjb25zdAorICB7IHJldHVybiB0eXBlbmFtZSBpbnRlcm5hbDo6Y2FzdF9yZXR1cm5fdHlwZTxUcmFuc2xhdGlvbixUcmFuc2xhdGlvbjxOZXdTY2FsYXJUeXBlLERpbT4gPjo6dHlwZSgqdGhpcyk7IH0KKworICAvKiogQ29weSBjb25zdHJ1Y3RvciB3aXRoIHNjYWxhciB0eXBlIGNvbnZlcnNpb24gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJTY2FsYXJUeXBlPgorICBpbmxpbmUgZXhwbGljaXQgVHJhbnNsYXRpb24oY29uc3QgVHJhbnNsYXRpb248T3RoZXJTY2FsYXJUeXBlLERpbT4mIG90aGVyKQorICB7IG1fY29lZmZzID0gb3RoZXIudmVjdG9yKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7IH0KKworICAvKiogXHJldHVybnMgXGMgdHJ1ZSBpZiBcYyAqdGhpcyBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIFxhIG90aGVyLCB3aXRoaW4gdGhlIHByZWNpc2lvbgorICAgICogZGV0ZXJtaW5lZCBieSBcYSBwcmVjLgorICAgICoKKyAgICAqIFxzYSBNYXRyaXhCYXNlOjppc0FwcHJveCgpICovCisgIGJvb2wgaXNBcHByb3goY29uc3QgVHJhbnNsYXRpb24mIG90aGVyLCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdAorICB7IHJldHVybiBtX2NvZWZmcy5pc0FwcHJveChvdGhlci5tX2NvZWZmcywgcHJlYyk7IH0KKworfTsKKworLyoqIFxhZGR0b2dyb3VwIEdlb21ldHJ5X01vZHVsZSAqLworLy9AewordHlwZWRlZiBUcmFuc2xhdGlvbjxmbG9hdCwgMj4gVHJhbnNsYXRpb24yZjsKK3R5cGVkZWYgVHJhbnNsYXRpb248ZG91YmxlLDI+IFRyYW5zbGF0aW9uMmQ7Cit0eXBlZGVmIFRyYW5zbGF0aW9uPGZsb2F0LCAzPiBUcmFuc2xhdGlvbjNmOwordHlwZWRlZiBUcmFuc2xhdGlvbjxkb3VibGUsMz4gVHJhbnNsYXRpb24zZDsKKy8vQH0KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgoraW5saW5lIHR5cGVuYW1lIFRyYW5zbGF0aW9uPFNjYWxhcixEaW0+OjpBZmZpbmVUcmFuc2Zvcm1UeXBlCitUcmFuc2xhdGlvbjxTY2FsYXIsRGltPjo6b3BlcmF0b3IqIChjb25zdCBVbmlmb3JtU2NhbGluZzxTY2FsYXI+JiBvdGhlcikgY29uc3QKK3sKKyAgQWZmaW5lVHJhbnNmb3JtVHlwZSByZXM7CisgIHJlcy5tYXRyaXgoKS5zZXRaZXJvKCk7CisgIHJlcy5saW5lYXIoKS5kaWFnb25hbCgpLmZpbGwob3RoZXIuZmFjdG9yKCkpOworICByZXMudHJhbnNsYXRpb24oKSA9IG1fY29lZmZzOworICByZXMoRGltLERpbSkgPSBTY2FsYXIoMSk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBUcmFuc2xhdGlvbjxTY2FsYXIsRGltPjo6QWZmaW5lVHJhbnNmb3JtVHlwZQorVHJhbnNsYXRpb248U2NhbGFyLERpbT46Om9wZXJhdG9yKiAoY29uc3QgRWlnZW5CYXNlPE90aGVyRGVyaXZlZD4mIGxpbmVhcikgY29uc3QKK3sKKyAgQWZmaW5lVHJhbnNmb3JtVHlwZSByZXM7CisgIHJlcy5tYXRyaXgoKS5zZXRaZXJvKCk7CisgIHJlcy5saW5lYXIoKSA9IGxpbmVhci5kZXJpdmVkKCk7CisgIHJlcy50cmFuc2xhdGlvbigpID0gbV9jb2VmZnM7CisgIHJlcy5tYXRyaXgoKS5yb3coRGltKS5zZXRaZXJvKCk7CisgIHJlcyhEaW0sRGltKSA9IFNjYWxhcigxKTsKKyAgcmV0dXJuIHJlczsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9UUkFOU0xBVElPTl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvR2VvbWV0cnkvVW1leWFtYS5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1VtZXlhbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzA5MzljCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0dlb21ldHJ5L1VtZXlhbWEuaApAQCAtMCwwICsxLDE3MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9VTUVZQU1BX0gKKyNkZWZpbmUgRUlHRU5fVU1FWUFNQV9ICisKKy8vIFRoaXMgZmlsZSByZXF1aXJlcyB0aGUgdXNlciB0byBpbmNsdWRlIAorLy8gKiBFaWdlbi9Db3JlCisvLyAqIEVpZ2VuL0xVIAorLy8gKiBFaWdlbi9TVkQKKy8vICogRWlnZW4vQXJyYXkKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworLy8gVGhlc2UgaGVscGVycyBhcmUgcmVxdWlyZWQgc2luY2UgaXQgYWxsb3dzIHRvIHVzZSBtaXhlZCB0eXBlcyBhcyBwYXJhbWV0ZXJzCisvLyBmb3IgdGhlIFVtZXlhbWEuIFRoZSBwcm9ibGVtIHdpdGggbWl4ZWQgcGFyYW1ldGVycyBpcyB0aGF0IHRoZSByZXR1cm4gdHlwZQorLy8gY2Fubm90IHRyaXZpYWxseSBiZSBkZWR1Y2VkIHdoZW4gZmxvYXQgYW5kIGRvdWJsZSB0eXBlcyBhcmUgbWl4ZWQuCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBDb21waWxlIHRpbWUgcmV0dXJuIHR5cGUgZGVkdWN0aW9uIGZvciBkaWZmZXJlbnQgTWF0cml4QmFzZSB0eXBlcy4KKy8vIERpZmZlcmVudCBtZWFucyBoZXJlIGRpZmZlcmVudCBhbGlnbm1lbnQgYW5kIHBhcmFtZXRlcnMgYnV0IHRoZSBzYW1lIHVuZGVybHlpbmcKKy8vIHJlYWwgc2NhbGFyIHR5cGUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBPdGhlck1hdHJpeFR5cGU+CitzdHJ1Y3QgdW1leWFtYV90cmFuc2Zvcm1fbWF0cml4X3R5cGUKK3sKKyAgZW51bSB7CisgICAgTWluUm93c0F0Q29tcGlsZVRpbWUgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRFlOQU1JQyhNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgT3RoZXJNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSksCisKKyAgICAvLyBXaGVuIHBvc3NpYmxlIHdlIHdhbnQgdG8gY2hvb3NlIHNvbWUgc21hbGwgZml4ZWQgc2l6ZSB2YWx1ZSBzaW5jZSB0aGUgcmVzdWx0CisgICAgLy8gaXMgbGlrZWx5IHRvIGZpdCBvbiB0aGUgc3RhY2suIFNvIGhlcmUsIEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDIGlzIG5vdCB3aGF0IHdlIHdhbnQuCisgICAgSG9tb2dlbmVvdXNEaW1lbnNpb24gPSBpbnQoTWluUm93c0F0Q29tcGlsZVRpbWUpID09IER5bmFtaWMgPyBEeW5hbWljIDogaW50KE1pblJvd3NBdENvbXBpbGVUaW1lKSsxCisgIH07CisKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgdHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIsCisgICAgSG9tb2dlbmVvdXNEaW1lbnNpb24sCisgICAgSG9tb2dlbmVvdXNEaW1lbnNpb24sCisgICAgQXV0b0FsaWduIHwgKHRyYWl0czxNYXRyaXhUeXBlPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3IpLAorICAgIEhvbW9nZW5lb3VzRGltZW5zaW9uLAorICAgIEhvbW9nZW5lb3VzRGltZW5zaW9uCisgID4gdHlwZTsKK307CisKK30KKworI2VuZGlmCisKKy8qKgorKiBcZ2VvbWV0cnlfbW9kdWxlIFxpbmdyb3VwIEdlb21ldHJ5X01vZHVsZQorKgorKiBcYnJpZWYgUmV0dXJucyB0aGUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiB0d28gcG9pbnQgc2V0cy4KKyoKKyogVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbjoKKyogIkxlYXN0LXNxdWFyZXMgZXN0aW1hdGlvbiBvZiB0cmFuc2Zvcm1hdGlvbiBwYXJhbWV0ZXJzIGJldHdlZW4gdHdvIHBvaW50IHBhdHRlcm5zIiwKKyogU2hpbmppIFVtZXlhbWEsIFBBTUkgMTk5MSwgRE9JOiAxMC4xMTA5LzM0Ljg4NTczCisqCisqIEl0IGVzdGltYXRlcyBwYXJhbWV0ZXJzIFxmJCBjLCBcbWF0aGJme1J9LCBcZiQgYW5kIFxmJCBcbWF0aGJme3R9IFxmJCBzdWNoIHRoYXQKKyogXGZ7YWxpZ24qfQorKiAgIFxmcmFjezF9e259IFxzdW1fe2k9MX1ebiBcdmVydFx2ZXJ0IHlfaSAtIChjXG1hdGhiZntSfXhfaSArIFxtYXRoYmZ7dH0pIFx2ZXJ0XHZlcnRfMl4yCisqIFxmfQorKiBpcyBtaW5pbWl6ZWQuCisqCisqIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gdGhlIGFuYWx5c2lzIG9mIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeAorKiBcZiQgXFNpZ21hX3tcbWF0aGJme3h9XG1hdGhiZnt5fX0gXGluIFxtYXRoYmJ7Un1ee2QgXHRpbWVzIGR9IFxmJAorKiBvZiB0aGUgaW5wdXQgcG9pbnQgc2V0cyBcZiQgXG1hdGhiZnt4fSBcZiQgYW5kIFxmJCBcbWF0aGJme3l9IFxmJCB3aGVyZSAKKyogXGYkZFxmJCBpcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaW1lbnNpb24gKHdoaWNoIGlzIHR5cGljYWxseSBzbWFsbCkuCisqIFRoZSBhbmFseXNpcyBpcyBpbnZvbHZpbmcgdGhlIFNWRCBoYXZpbmcgYSBjb21wbGV4aXR5IG9mIFxmJE8oZF4zKVxmJAorKiB0aG91Z2ggdGhlIGFjdHVhbCBjb21wdXRhdGlvbmFsIGVmZm9ydCBsaWVzIGluIHRoZSBjb3ZhcmlhbmNlCisqIG1hdHJpeCBjb21wdXRhdGlvbiB3aGljaCBoYXMgYW4gYXN5bXB0b3RpYyBsb3dlciBib3VuZCBvZiBcZiRPKGRtKVxmJCB3aGVuIAorKiB0aGUgaW5wdXQgcG9pbnQgc2V0cyBoYXZlIGRpbWVuc2lvbiBcZiRkIFx0aW1lcyBtXGYkLgorKgorKiBDdXJyZW50bHkgdGhlIG1ldGhvZCBpcyB3b3JraW5nIG9ubHkgZm9yIGZsb2F0aW5nIHBvaW50IG1hdHJpY2VzLgorKgorKiBcdG9kbyBTaG91bGQgdGhlIHJldHVybiB0eXBlIG9mIHVtZXlhbWEoKSBiZWNvbWUgYSBUcmFuc2Zvcm0/CisqCisqIFxwYXJhbSBzcmMgU291cmNlIHBvaW50cyBcZiQgXG1hdGhiZnt4fSA9IFxsZWZ0KCB4XzEsIFxoZG90cywgeF9uIFxyaWdodCkgXGYkLgorKiBccGFyYW0gZHN0IERlc3RpbmF0aW9uIHBvaW50cyBcZiQgXG1hdGhiZnt5fSA9IFxsZWZ0KCB5XzEsIFxoZG90cywgeV9uIFxyaWdodCkgXGYkLgorKiBccGFyYW0gd2l0aF9zY2FsaW5nIFNldHMgXGYkIGM9MSBcZiQgd2hlbiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcGFzc2VkLgorKiBccmV0dXJuIFRoZSBob21vZ2VuZW91cyB0cmFuc2Zvcm1hdGlvbiAKKyogXGZ7YWxpZ24qfQorKiAgIFQgPSBcYmVnaW57Ym1hdHJpeH0gY1xtYXRoYmZ7Un0gJiBcbWF0aGJme3R9IFxcIFxtYXRoYmZ7MH0gJiAxIFxlbmR7Ym1hdHJpeH0KKyogXGZ9CisqIG1pbmltaXppbmcgdGhlIHJlc3VkaXVhbCBhYm92ZS4gVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBhbHdheXMgcmV0dXJuZWQgYXMgYW4gCisqIEVpZ2VuOjpNYXRyaXguCisqLwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3R5cGVuYW1lIGludGVybmFsOjp1bWV5YW1hX3RyYW5zZm9ybV9tYXRyaXhfdHlwZTxEZXJpdmVkLCBPdGhlckRlcml2ZWQ+Ojp0eXBlCit1bWV5YW1hKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHNyYywgY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBkc3QsIGJvb2wgd2l0aF9zY2FsaW5nID0gdHJ1ZSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dW1leWFtYV90cmFuc2Zvcm1fbWF0cml4X3R5cGU8RGVyaXZlZCwgT3RoZXJEZXJpdmVkPjo6dHlwZSBUcmFuc2Zvcm1hdGlvbk1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxUcmFuc2Zvcm1hdGlvbk1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggSW5kZXg7CisKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCghTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwgTlVNRVJJQ19UWVBFX01VU1RfQkVfUkVBTCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE90aGVyRGVyaXZlZD46OlNjYWxhcj46OnZhbHVlKSwKKyAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKworICBlbnVtIHsgRGltZW5zaW9uID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0RZTkFNSUMoRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUsIE90aGVyRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUpIH07CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEaW1lbnNpb24sIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltZW5zaW9uLCBEaW1lbnNpb24+IE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlX3Jvd19tYWpvcjxEZXJpdmVkPjo6dHlwZSBSb3dNYWpvck1hdHJpeFR5cGU7CisKKyAgY29uc3QgSW5kZXggbSA9IHNyYy5yb3dzKCk7IC8vIGRpbWVuc2lvbgorICBjb25zdCBJbmRleCBuID0gc3JjLmNvbHMoKTsgLy8gbnVtYmVyIG9mIG1lYXN1cmVtZW50cworCisgIC8vIHJlcXVpcmVkIGZvciBkZW1lYW5pbmcgLi4uCisgIGNvbnN0IFJlYWxTY2FsYXIgb25lX292ZXJfbiA9IDEgLyBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPihuKTsKKworICAvLyBjb21wdXRhdGlvbiBvZiBtZWFuCisgIGNvbnN0IFZlY3RvclR5cGUgc3JjX21lYW4gPSBzcmMucm93d2lzZSgpLnN1bSgpICogb25lX292ZXJfbjsKKyAgY29uc3QgVmVjdG9yVHlwZSBkc3RfbWVhbiA9IGRzdC5yb3d3aXNlKCkuc3VtKCkgKiBvbmVfb3Zlcl9uOworCisgIC8vIGRlbWVhbmluZyBvZiBzcmMgYW5kIGRzdCBwb2ludHMKKyAgY29uc3QgUm93TWFqb3JNYXRyaXhUeXBlIHNyY19kZW1lYW4gPSBzcmMuY29sd2lzZSgpIC0gc3JjX21lYW47CisgIGNvbnN0IFJvd01ham9yTWF0cml4VHlwZSBkc3RfZGVtZWFuID0gZHN0LmNvbHdpc2UoKSAtIGRzdF9tZWFuOworCisgIC8vIEVxLiAoMzYpLSgzNykKKyAgY29uc3QgU2NhbGFyIHNyY192YXIgPSBzcmNfZGVtZWFuLnJvd3dpc2UoKS5zcXVhcmVkTm9ybSgpLnN1bSgpICogb25lX292ZXJfbjsKKworICAvLyBFcS4gKDM4KQorICBjb25zdCBNYXRyaXhUeXBlIHNpZ21hID0gb25lX292ZXJfbiAqIGRzdF9kZW1lYW4gKiBzcmNfZGVtZWFuLnRyYW5zcG9zZSgpOworCisgIEphY29iaVNWRDxNYXRyaXhUeXBlPiBzdmQoc2lnbWEsIENvbXB1dGVGdWxsVSB8IENvbXB1dGVGdWxsVik7CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVzdWx0aW5nIHRyYW5zZm9ybWF0aW9uIHdpdGggYW4gaWRlbnRpdHkgbWF0cml4Li4uCisgIFRyYW5zZm9ybWF0aW9uTWF0cml4VHlwZSBSdCA9IFRyYW5zZm9ybWF0aW9uTWF0cml4VHlwZTo6SWRlbnRpdHkobSsxLG0rMSk7CisKKyAgLy8gRXEuICgzOSkKKyAgVmVjdG9yVHlwZSBTID0gVmVjdG9yVHlwZTo6T25lcyhtKTsKKyAgaWYgKHNpZ21hLmRldGVybWluYW50KCk8MCkgUyhtLTEpID0gLTE7CisKKyAgLy8gRXEuICg0MCkgYW5kICg0MykKKyAgY29uc3QgVmVjdG9yVHlwZSYgZCA9IHN2ZC5zaW5ndWxhclZhbHVlcygpOworICBJbmRleCByYW5rID0gMDsgZm9yIChJbmRleCBpPTA7IGk8bTsgKytpKSBpZiAoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihkLmNvZWZmKGkpLGQuY29lZmYoMCkpKSArK3Jhbms7CisgIGlmIChyYW5rID09IG0tMSkgeworICAgIGlmICggc3ZkLm1hdHJpeFUoKS5kZXRlcm1pbmFudCgpICogc3ZkLm1hdHJpeFYoKS5kZXRlcm1pbmFudCgpID4gMCApIHsKKyAgICAgIFJ0LmJsb2NrKDAsMCxtLG0pLm5vYWxpYXMoKSA9IHN2ZC5tYXRyaXhVKCkqc3ZkLm1hdHJpeFYoKS50cmFuc3Bvc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgU2NhbGFyIHMgPSBTKG0tMSk7IFMobS0xKSA9IC0xOworICAgICAgUnQuYmxvY2soMCwwLG0sbSkubm9hbGlhcygpID0gc3ZkLm1hdHJpeFUoKSAqIFMuYXNEaWFnb25hbCgpICogc3ZkLm1hdHJpeFYoKS50cmFuc3Bvc2UoKTsKKyAgICAgIFMobS0xKSA9IHM7CisgICAgfQorICB9IGVsc2UgeworICAgIFJ0LmJsb2NrKDAsMCxtLG0pLm5vYWxpYXMoKSA9IHN2ZC5tYXRyaXhVKCkgKiBTLmFzRGlhZ29uYWwoKSAqIHN2ZC5tYXRyaXhWKCkudHJhbnNwb3NlKCk7CisgIH0KKworICAvLyBFcS4gKDQyKQorICBjb25zdCBTY2FsYXIgYyA9IDEvc3JjX3ZhciAqIHN2ZC5zaW5ndWxhclZhbHVlcygpLmRvdChTKTsKKworICAvLyBFcS4gKDQxKQorICAvLyBOb3RlIHRoYXQgd2UgZmlyc3QgYXNzaWduIGRzdF9tZWFuIHRvIHRoZSBkZXN0aW5hdGlvbiBzbyB0aGF0IHRoZXJlIG5vIG5lZWQKKyAgLy8gZm9yIGEgdGVtcG9yYXJ5LgorICBSdC5jb2wobSkuaGVhZChtKSA9IGRzdF9tZWFuOworICBSdC5jb2wobSkuaGVhZChtKS5ub2FsaWFzKCkgLT0gYypSdC50b3BMZWZ0Q29ybmVyKG0sbSkqc3JjX21lYW47CisKKyAgaWYgKHdpdGhfc2NhbGluZykgUnQuYmxvY2soMCwwLG0sbSkgKj0gYzsKKworICByZXR1cm4gUnQ7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVU1FWUFNQV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvR2VvbWV0cnkvYXJjaC9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9hcmNoL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNjdhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvR2VvbWV0cnkvYXJjaC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9HZW9tZXRyeV9hcmNoX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9HZW9tZXRyeV9hcmNoX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL0dlb21ldHJ5L2FyY2ggQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9HZW9tZXRyeS9hcmNoL0dlb21ldHJ5X1NTRS5oIGIvRWlnZW4vc3JjL0dlb21ldHJ5L2FyY2gvR2VvbWV0cnlfU1NFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4Mjg0ZgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9HZW9tZXRyeS9hcmNoL0dlb21ldHJ5X1NTRS5oCkBAIC0wLDAgKzEsMTE1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBSb2hpdCBHYXJnIDxycGcuMzE0QGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HRU9NRVRSWV9TU0VfSAorI2RlZmluZSBFSUdFTl9HRU9NRVRSWV9TU0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgT3RoZXJEZXJpdmVkPgorc3RydWN0IHF1YXRfcHJvZHVjdDxBcmNoaXRlY3R1cmU6OlNTRSwgRGVyaXZlZCwgT3RoZXJEZXJpdmVkLCBmbG9hdCwgQWxpZ25lZD4KK3sKKyAgc3RhdGljIGlubGluZSBRdWF0ZXJuaW9uPGZsb2F0PiBydW4oY29uc3QgUXVhdGVybmlvbkJhc2U8RGVyaXZlZD4mIF9hLCBjb25zdCBRdWF0ZXJuaW9uQmFzZTxPdGhlckRlcml2ZWQ+JiBfYikKKyAgeworICAgIGNvbnN0IF9fbTEyOCBtYXNrID0gX21tX2Nhc3RzaTEyOF9wcyhfbW1fc2V0cl9lcGkzMigwLDAsMCwweDgwMDAwMDAwKSk7CisgICAgUXVhdGVybmlvbjxmbG9hdD4gcmVzOworICAgIF9fbTEyOCBhID0gX2EuY29lZmZzKCkudGVtcGxhdGUgcGFja2V0PEFsaWduZWQ+KDApOworICAgIF9fbTEyOCBiID0gX2IuY29lZmZzKCkudGVtcGxhdGUgcGFja2V0PEFsaWduZWQ+KDApOworICAgIF9fbTEyOCBmbGlwMSA9IF9tbV94b3JfcHMoX21tX211bF9wcyh2ZWM0Zl9zd2l6emxlMShhLDEsMiwwLDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0Zl9zd2l6emxlMShiLDIsMCwxLDIpKSxtYXNrKTsKKyAgICBfX20xMjggZmxpcDIgPSBfbW1feG9yX3BzKF9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYSwzLDMsMywxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjNGZfc3dpenpsZTEoYiwwLDEsMiwxKSksbWFzayk7CisgICAgcHN0b3JlKCZyZXMueCgpLAorICAgICAgICAgICAgICBfbW1fYWRkX3BzKF9tbV9zdWJfcHMoX21tX211bF9wcyhhLHZlYzRmX3N3aXp6bGUxKGIsMywzLDMsMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX211bF9wcyh2ZWM0Zl9zd2l6emxlMShhLDIsMCwxLDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0Zl9zd2l6emxlMShiLDEsMiwwLDApKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2FkZF9wcyhmbGlwMSxmbGlwMikpKTsKKyAgICByZXR1cm4gcmVzOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JMaHMsdHlwZW5hbWUgVmVjdG9yUmhzPgorc3RydWN0IGNyb3NzM19pbXBsPEFyY2hpdGVjdHVyZTo6U1NFLFZlY3RvckxocyxWZWN0b3JSaHMsZmxvYXQsdHJ1ZT4KK3sKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBwbGFpbl9tYXRyaXhfdHlwZTxWZWN0b3JMaHM+Ojp0eXBlCisgIHJ1bihjb25zdCBWZWN0b3JMaHMmIGxocywgY29uc3QgVmVjdG9yUmhzJiByaHMpCisgIHsKKyAgICBfX20xMjggYSA9IGxocy50ZW1wbGF0ZSBwYWNrZXQ8VmVjdG9yTGhzOjpGbGFncyZBbGlnbmVkQml0ID8gQWxpZ25lZCA6IFVuYWxpZ25lZD4oMCk7CisgICAgX19tMTI4IGIgPSByaHMudGVtcGxhdGUgcGFja2V0PFZlY3RvclJoczo6RmxhZ3MmQWxpZ25lZEJpdCA/IEFsaWduZWQgOiBVbmFsaWduZWQ+KDApOworICAgIF9fbTEyOCBtdWwxPV9tbV9tdWxfcHModmVjNGZfc3dpenpsZTEoYSwxLDIsMCwzKSx2ZWM0Zl9zd2l6emxlMShiLDIsMCwxLDMpKTsKKyAgICBfX20xMjggbXVsMj1fbW1fbXVsX3BzKHZlYzRmX3N3aXp6bGUxKGEsMiwwLDEsMyksdmVjNGZfc3dpenpsZTEoYiwxLDIsMCwzKSk7CisgICAgdHlwZW5hbWUgcGxhaW5fbWF0cml4X3R5cGU8VmVjdG9yTGhzPjo6dHlwZSByZXM7CisgICAgcHN0b3JlKCZyZXMueCgpLF9tbV9zdWJfcHMobXVsMSxtdWwyKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKworCisKKwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZCwgY2xhc3MgT3RoZXJEZXJpdmVkPgorc3RydWN0IHF1YXRfcHJvZHVjdDxBcmNoaXRlY3R1cmU6OlNTRSwgRGVyaXZlZCwgT3RoZXJEZXJpdmVkLCBkb3VibGUsIEFsaWduZWQ+Cit7CisgIHN0YXRpYyBpbmxpbmUgUXVhdGVybmlvbjxkb3VibGU+IHJ1bihjb25zdCBRdWF0ZXJuaW9uQmFzZTxEZXJpdmVkPiYgX2EsIGNvbnN0IFF1YXRlcm5pb25CYXNlPE90aGVyRGVyaXZlZD4mIF9iKQorICB7CisgIGNvbnN0IFBhY2tldDJkIG1hc2sgPSBfbW1fY2FzdHNpMTI4X3BkKF9tbV9zZXRfZXBpMzIoMHgwLDB4MCwweDgwMDAwMDAwLDB4MCkpOworCisgIFF1YXRlcm5pb248ZG91YmxlPiByZXM7CisKKyAgY29uc3QgZG91YmxlKiBhID0gX2EuY29lZmZzKCkuZGF0YSgpOworICBQYWNrZXQyZCBiX3h5ID0gX2IuY29lZmZzKCkudGVtcGxhdGUgcGFja2V0PEFsaWduZWQ+KDApOworICBQYWNrZXQyZCBiX3p3ID0gX2IuY29lZmZzKCkudGVtcGxhdGUgcGFja2V0PEFsaWduZWQ+KDIpOworICBQYWNrZXQyZCBhX3h4ID0gcHNldDE8UGFja2V0MmQ+KGFbMF0pOworICBQYWNrZXQyZCBhX3l5ID0gcHNldDE8UGFja2V0MmQ+KGFbMV0pOworICBQYWNrZXQyZCBhX3p6ID0gcHNldDE8UGFja2V0MmQ+KGFbMl0pOworICBQYWNrZXQyZCBhX3d3ID0gcHNldDE8UGFja2V0MmQ+KGFbM10pOworCisgIC8vIHR3byB0ZW1wb3JhcmllczoKKyAgUGFja2V0MmQgdDEsIHQyOworCisgIC8qCisgICAqIHQxID0gd3cqeHkgKyB5eSp6dworICAgKiB0MiA9IHp6Knh5IC0geHgqencKKyAgICogcmVzLnh5ID0gdDEgKy8tIHN3YXAodDIpCisgICAqLworICB0MSA9IHBhZGQocG11bChhX3d3LCBiX3h5KSwgcG11bChhX3l5LCBiX3p3KSk7CisgIHQyID0gcHN1YihwbXVsKGFfenosIGJfeHkpLCBwbXVsKGFfeHgsIGJfencpKTsKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobWFzaykKKyAgcHN0b3JlKCZyZXMueCgpLCBfbW1fYWRkc3ViX3BkKHQxLCBwcmV2ZXJzZSh0MikpKTsKKyNlbHNlCisgIHBzdG9yZSgmcmVzLngoKSwgcGFkZCh0MSwgcHhvcihtYXNrLHByZXZlcnNlKHQyKSkpKTsKKyNlbmRpZgorICAKKyAgLyoKKyAgICogdDEgPSB3dyp6dyAtIHl5Knh5CisgICAqIHQyID0genoqencgKyB4eCp4eQorICAgKiByZXMuencgPSB0MSAtLysgc3dhcCh0MikgPSBzd2FwKCBzd2FwKHQxKSArLy0gdDIpCisgICAqLworICB0MSA9IHBzdWIocG11bChhX3d3LCBiX3p3KSwgcG11bChhX3l5LCBiX3h5KSk7CisgIHQyID0gcGFkZChwbXVsKGFfenosIGJfencpLCBwbXVsKGFfeHgsIGJfeHkpKTsKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkVfU1NFMworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobWFzaykKKyAgcHN0b3JlKCZyZXMueigpLCBwcmV2ZXJzZShfbW1fYWRkc3ViX3BkKHByZXZlcnNlKHQxKSwgdDIpKSk7CisjZWxzZQorICBwc3RvcmUoJnJlcy56KCksIHBzdWIodDEsIHB4b3IobWFzayxwcmV2ZXJzZSh0MikpKSk7CisjZW5kaWYKKworICByZXR1cm4gcmVzOworfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fR0VPTUVUUllfU1NFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Ib3VzZWhvbGRlci9CbG9ja0hvdXNlaG9sZGVyLmggYi9FaWdlbi9zcmMvSG91c2Vob2xkZXIvQmxvY2tIb3VzZWhvbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OTFjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvSG91c2Vob2xkZXIvQmxvY2tIb3VzZWhvbGRlci5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIFZpbmNlbnQgTGVqZXVuZQorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CTE9DS19IT1VTRUhPTERFUl9ICisjZGVmaW5lIEVJR0VOX0JMT0NLX0hPVVNFSE9MREVSX0gKKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgaGVscGVyIGZ1bmN0aW9uIHRvIGRlYWwgd2l0aCBibG9jayBob3VzZWhvbGRlciByZWZsZWN0b3JzCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmlhbmd1bGFyRmFjdG9yVHlwZSx0eXBlbmFtZSBWZWN0b3JzVHlwZSx0eXBlbmFtZSBDb2VmZnNUeXBlPgordm9pZCBtYWtlX2Jsb2NrX2hvdXNlaG9sZGVyX3RyaWFuZ3VsYXJfZmFjdG9yKFRyaWFuZ3VsYXJGYWN0b3JUeXBlJiB0cmlGYWN0b3IsIGNvbnN0IFZlY3RvcnNUeXBlJiB2ZWN0b3JzLCBjb25zdCBDb2VmZnNUeXBlJiBoQ29lZmZzKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyaWFuZ3VsYXJGYWN0b3JUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JzVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgY29uc3QgSW5kZXggbmJWZWNzID0gdmVjdG9ycy5jb2xzKCk7CisgIGVpZ2VuX2Fzc2VydCh0cmlGYWN0b3Iucm93cygpID09IG5iVmVjcyAmJiB0cmlGYWN0b3IuY29scygpID09IG5iVmVjcyAmJiB2ZWN0b3JzLnJvd3MoKT49bmJWZWNzKTsKKworICBmb3IoSW5kZXggaSA9IDA7IGkgPCBuYlZlY3M7IGkrKykKKyAgeworICAgIEluZGV4IHJzID0gdmVjdG9ycy5yb3dzKCkgLSBpOworICAgIFNjYWxhciBWaWkgPSB2ZWN0b3JzKGksaSk7CisgICAgdmVjdG9ycy5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2VmZlJlZihpLGkpID0gU2NhbGFyKDEpOworICAgIHRyaUZhY3Rvci5jb2woaSkuaGVhZChpKS5ub2FsaWFzKCkgPSAtaENvZWZmcyhpKSAqIHZlY3RvcnMuYmxvY2soaSwgMCwgcnMsIGkpLmFkam9pbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2ZWN0b3JzLmNvbChpKS50YWlsKHJzKTsKKyAgICB2ZWN0b3JzLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmNvZWZmUmVmKGksIGkpID0gVmlpOworICAgIC8vIEZJWE1FIGFkZCAubm9hbGlhcygpIG9uY2UgdGhlIHRyaWFuZ3VsYXIgcHJvZHVjdCBjYW4gd29yayBpbnBsYWNlCisgICAgdHJpRmFjdG9yLmNvbChpKS5oZWFkKGkpID0gdHJpRmFjdG9yLmJsb2NrKDAsMCxpLGkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdHJpRmFjdG9yLmNvbChpKS5oZWFkKGkpOworICAgIHRyaUZhY3RvcihpLGkpID0gaENvZWZmcyhpKTsKKyAgfQorfQorCisvKiogXGludGVybmFsICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIFZlY3RvcnNUeXBlLHR5cGVuYW1lIENvZWZmc1R5cGU+Cit2b2lkIGFwcGx5X2Jsb2NrX2hvdXNlaG9sZGVyX29uX3RoZV9sZWZ0KE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgVmVjdG9yc1R5cGUmIHZlY3RvcnMsIGNvbnN0IENvZWZmc1R5cGUmIGhDb2VmZnMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIGVudW0geyBURmFjdG9yU2l6ZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CisgIEluZGV4IG5iVmVjcyA9IHZlY3RvcnMuY29scygpOworICBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBURmFjdG9yU2l6ZSwgVEZhY3RvclNpemU+IFQobmJWZWNzLG5iVmVjcyk7CisgIG1ha2VfYmxvY2tfaG91c2Vob2xkZXJfdHJpYW5ndWxhcl9mYWN0b3IoVCwgdmVjdG9ycywgaENvZWZmcyk7CisKKyAgY29uc3QgVHJpYW5ndWxhclZpZXc8Y29uc3QgVmVjdG9yc1R5cGUsIFVuaXRMb3dlcj4mIFYodmVjdG9ycyk7CisKKyAgLy8gQSAtPSBWIFQgVl4qIEEKKyAgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcixWZWN0b3JzVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsMCwKKyAgICAgICAgIFZlY3RvcnNUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSxNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZT4gdG1wID0gVi5hZGpvaW50KCkgKiBtYXQ7CisgIC8vIEZJWE1FIGFkZCAubm9hbGlhcygpIG9uY2UgdGhlIHRyaWFuZ3VsYXIgcHJvZHVjdCBjYW4gd29yayBpbnBsYWNlCisgIHRtcCA9IFQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuYWRqb2ludCgpICogdG1wOworICBtYXQubm9hbGlhcygpIC09IFYgKiB0bXA7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0JMT0NLX0hPVVNFSE9MREVSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9Ib3VzZWhvbGRlci9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9Ib3VzZWhvbGRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTQ5MzdkCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0hvdXNlaG9sZGVyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX0hvdXNlaG9sZGVyX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9Ib3VzZWhvbGRlcl9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9Ib3VzZWhvbGRlciBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0hvdXNlaG9sZGVyL0hvdXNlaG9sZGVyLmggYi9FaWdlbi9zcmMvSG91c2Vob2xkZXIvSG91c2Vob2xkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjY0YjdkCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0hvdXNlaG9sZGVyL0hvdXNlaG9sZGVyLmgKQEAgLTAsMCArMSwxNjggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9IT1VTRUhPTERFUl9ICisjZGVmaW5lIEVJR0VOX0hPVVNFSE9MREVSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgbj4gc3RydWN0IGRlY3JlbWVudF9zaXplCit7CisgIGVudW0geworICAgIHJldCA9IG49PUR5bmFtaWMgPyBuIDogbi0xCisgIH07Cit9OworfQorCisvKiogQ29tcHV0ZXMgdGhlIGVsZW1lbnRhcnkgcmVmbGVjdG9yIEggc3VjaCB0aGF0OgorICAqIFxmJCBIICp0aGlzID0gWyBiZXRhIDAgLi4uIDBdXlQgXGYkCisgICogd2hlcmUgdGhlIHRyYW5zZm9ybWF0aW9uIEggaXM6CisgICogXGYkIEggPSBJIC0gdGF1IHYgdl4qXGYkCisgICogYW5kIHRoZSB2ZWN0b3IgdiBpczoKKyAgKiBcZiQgdl5UID0gWzEgZXNzZW50aWFsXlRdIFxmJAorICAqCisgICogVGhlIGVzc2VudGlhbCBwYXJ0IG9mIHRoZSB2ZWN0b3IgXGMgdiBpcyBzdG9yZWQgaW4gKnRoaXMuCisgICogCisgICogT24gb3V0cHV0OgorICAqIFxwYXJhbSB0YXUgdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbgorICAqIFxwYXJhbSBiZXRhIHRoZSByZXN1bHQgb2YgSCAqIFxjICp0aGlzCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6bWFrZUhvdXNlaG9sZGVyKCksIE1hdHJpeEJhc2U6OmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoKSwKKyAgKiAgICAgTWF0cml4QmFzZTo6YXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3ZvaWQgTWF0cml4QmFzZTxEZXJpdmVkPjo6bWFrZUhvdXNlaG9sZGVySW5QbGFjZShTY2FsYXImIHRhdSwgUmVhbFNjYWxhciYgYmV0YSkKK3sKKyAgVmVjdG9yQmxvY2s8RGVyaXZlZCwgaW50ZXJuYWw6OmRlY3JlbWVudF9zaXplPEJhc2U6OlNpemVBdENvbXBpbGVUaW1lPjo6cmV0PiBlc3NlbnRpYWxQYXJ0KGRlcml2ZWQoKSwgMSwgc2l6ZSgpLTEpOworICBtYWtlSG91c2Vob2xkZXIoZXNzZW50aWFsUGFydCwgdGF1LCBiZXRhKTsKK30KKworLyoqIENvbXB1dGVzIHRoZSBlbGVtZW50YXJ5IHJlZmxlY3RvciBIIHN1Y2ggdGhhdDoKKyAgKiBcZiQgSCAqdGhpcyA9IFsgYmV0YSAwIC4uLiAwXV5UIFxmJAorICAqIHdoZXJlIHRoZSB0cmFuc2Zvcm1hdGlvbiBIIGlzOgorICAqIFxmJCBIID0gSSAtIHRhdSB2IHZeKlxmJAorICAqIGFuZCB0aGUgdmVjdG9yIHYgaXM6CisgICogXGYkIHZeVCA9IFsxIGVzc2VudGlhbF5UXSBcZiQKKyAgKgorICAqIE9uIG91dHB1dDoKKyAgKiBccGFyYW0gZXNzZW50aWFsIHRoZSBlc3NlbnRpYWwgcGFydCBvZiB0aGUgdmVjdG9yIFxjIHYKKyAgKiBccGFyYW0gdGF1IHRoZSBzY2FsaW5nIGZhY3RvciBvZiB0aGUgSG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb24KKyAgKiBccGFyYW0gYmV0YSB0aGUgcmVzdWx0IG9mIEggKiBcYyAqdGhpcworICAqCisgICogXHNhIE1hdHJpeEJhc2U6Om1ha2VIb3VzZWhvbGRlckluUGxhY2UoKSwgTWF0cml4QmFzZTo6YXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdCgpLAorICAqICAgICBNYXRyaXhCYXNlOjphcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgRXNzZW50aWFsUGFydD4KK3ZvaWQgTWF0cml4QmFzZTxEZXJpdmVkPjo6bWFrZUhvdXNlaG9sZGVyKAorICBFc3NlbnRpYWxQYXJ0JiBlc3NlbnRpYWwsCisgIFNjYWxhciYgdGF1LAorICBSZWFsU2NhbGFyJiBiZXRhKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKEVzc2VudGlhbFBhcnQpCisgIFZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQsIEVzc2VudGlhbFBhcnQ6OlNpemVBdENvbXBpbGVUaW1lPiB0YWlsKGRlcml2ZWQoKSwgMSwgc2l6ZSgpLTEpOworICAKKyAgUmVhbFNjYWxhciB0YWlsU3FOb3JtID0gc2l6ZSgpPT0xID8gUmVhbFNjYWxhcigwKSA6IHRhaWwuc3F1YXJlZE5vcm0oKTsKKyAgU2NhbGFyIGMwID0gY29lZmYoMCk7CisKKyAgaWYodGFpbFNxTm9ybSA9PSBSZWFsU2NhbGFyKDApICYmIGludGVybmFsOjppbWFnKGMwKT09UmVhbFNjYWxhcigwKSkKKyAgeworICAgIHRhdSA9IFJlYWxTY2FsYXIoMCk7CisgICAgYmV0YSA9IGludGVybmFsOjpyZWFsKGMwKTsKKyAgICBlc3NlbnRpYWwuc2V0WmVybygpOworICB9CisgIGVsc2UKKyAgeworICAgIGJldGEgPSBpbnRlcm5hbDo6c3FydChpbnRlcm5hbDo6YWJzMihjMCkgKyB0YWlsU3FOb3JtKTsKKyAgICBpZiAoaW50ZXJuYWw6OnJlYWwoYzApPj1SZWFsU2NhbGFyKDApKQorICAgICAgYmV0YSA9IC1iZXRhOworICAgIGVzc2VudGlhbCA9IHRhaWwgLyAoYzAgLSBiZXRhKTsKKyAgICB0YXUgPSBpbnRlcm5hbDo6Y29uaigoYmV0YSAtIGMwKSAvIGJldGEpOworICB9Cit9CisKKy8qKiBBcHBseSB0aGUgZWxlbWVudGFyeSByZWZsZWN0b3IgSCBnaXZlbiBieQorICAqIFxmJCBIID0gSSAtIHRhdSB2IHZeKlxmJAorICAqIHdpdGgKKyAgKiBcZiQgdl5UID0gWzEgZXNzZW50aWFsXlRdIFxmJAorICAqIGZyb20gdGhlIGxlZnQgdG8gYSB2ZWN0b3Igb3IgbWF0cml4LgorICAqCisgICogT24gaW5wdXQ6CisgICogXHBhcmFtIGVzc2VudGlhbCB0aGUgZXNzZW50aWFsIHBhcnQgb2YgdGhlIHZlY3RvciBcYyB2CisgICogXHBhcmFtIHRhdSB0aGUgc2NhbGluZyBmYWN0b3Igb2YgdGhlIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9uCisgICogXHBhcmFtIHdvcmtzcGFjZSBhIHBvaW50ZXIgdG8gd29ya2luZyBzcGFjZSB3aXRoIGF0IGxlYXN0CisgICogICAgICAgICAgICAgICAgICB0aGlzLT5jb2xzKCkgKiBlc3NlbnRpYWwuc2l6ZSgpIGVudHJpZXMKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjptYWtlSG91c2Vob2xkZXIoKSwgTWF0cml4QmFzZTo6bWFrZUhvdXNlaG9sZGVySW5QbGFjZSgpLCAKKyAgKiAgICAgTWF0cml4QmFzZTo6YXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIEVzc2VudGlhbFBhcnQ+Cit2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46OmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoCisgIGNvbnN0IEVzc2VudGlhbFBhcnQmIGVzc2VudGlhbCwKKyAgY29uc3QgU2NhbGFyJiB0YXUsCisgIFNjYWxhciogd29ya3NwYWNlKQoreworICBpZihyb3dzKCkgPT0gMSkKKyAgeworICAgICp0aGlzICo9IFNjYWxhcigxKS10YXU7CisgIH0KKyAgZWxzZQorICB7CisgICAgTWFwPHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9yb3dfdHlwZTxQbGFpbk9iamVjdD46OnR5cGU+IHRtcCh3b3Jrc3BhY2UsY29scygpKTsKKyAgICBCbG9jazxEZXJpdmVkLCBFc3NlbnRpYWxQYXJ0OjpTaXplQXRDb21waWxlVGltZSwgRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWU+IGJvdHRvbShkZXJpdmVkKCksIDEsIDAsIHJvd3MoKS0xLCBjb2xzKCkpOworICAgIHRtcC5ub2FsaWFzKCkgPSBlc3NlbnRpYWwuYWRqb2ludCgpICogYm90dG9tOworICAgIHRtcCArPSB0aGlzLT5yb3coMCk7CisgICAgdGhpcy0+cm93KDApIC09IHRhdSAqIHRtcDsKKyAgICBib3R0b20ubm9hbGlhcygpIC09IHRhdSAqIGVzc2VudGlhbCAqIHRtcDsKKyAgfQorfQorCisvKiogQXBwbHkgdGhlIGVsZW1lbnRhcnkgcmVmbGVjdG9yIEggZ2l2ZW4gYnkKKyAgKiBcZiQgSCA9IEkgLSB0YXUgdiB2XipcZiQKKyAgKiB3aXRoCisgICogXGYkIHZeVCA9IFsxIGVzc2VudGlhbF5UXSBcZiQKKyAgKiBmcm9tIHRoZSByaWdodCB0byBhIHZlY3RvciBvciBtYXRyaXguCisgICoKKyAgKiBPbiBpbnB1dDoKKyAgKiBccGFyYW0gZXNzZW50aWFsIHRoZSBlc3NlbnRpYWwgcGFydCBvZiB0aGUgdmVjdG9yIFxjIHYKKyAgKiBccGFyYW0gdGF1IHRoZSBzY2FsaW5nIGZhY3RvciBvZiB0aGUgSG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb24KKyAgKiBccGFyYW0gd29ya3NwYWNlIGEgcG9pbnRlciB0byB3b3JraW5nIHNwYWNlIHdpdGggYXQgbGVhc3QKKyAgKiAgICAgICAgICAgICAgICAgIHRoaXMtPmNvbHMoKSAqIGVzc2VudGlhbC5zaXplKCkgZW50cmllcworICAqCisgICogXHNhIE1hdHJpeEJhc2U6Om1ha2VIb3VzZWhvbGRlcigpLCBNYXRyaXhCYXNlOjptYWtlSG91c2Vob2xkZXJJblBsYWNlKCksIAorICAqICAgICBNYXRyaXhCYXNlOjphcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBFc3NlbnRpYWxQYXJ0Pgordm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+OjphcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodCgKKyAgY29uc3QgRXNzZW50aWFsUGFydCYgZXNzZW50aWFsLAorICBjb25zdCBTY2FsYXImIHRhdSwKKyAgU2NhbGFyKiB3b3Jrc3BhY2UpCit7CisgIGlmKGNvbHMoKSA9PSAxKQorICB7CisgICAgKnRoaXMgKj0gU2NhbGFyKDEpLXRhdTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBNYXA8dHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbF90eXBlPFBsYWluT2JqZWN0Pjo6dHlwZT4gdG1wKHdvcmtzcGFjZSxyb3dzKCkpOworICAgIEJsb2NrPERlcml2ZWQsIERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lLCBFc3NlbnRpYWxQYXJ0OjpTaXplQXRDb21waWxlVGltZT4gcmlnaHQoZGVyaXZlZCgpLCAwLCAxLCByb3dzKCksIGNvbHMoKS0xKTsKKyAgICB0bXAubm9hbGlhcygpID0gcmlnaHQgKiBlc3NlbnRpYWwuY29uanVnYXRlKCk7CisgICAgdG1wICs9IHRoaXMtPmNvbCgwKTsKKyAgICB0aGlzLT5jb2woMCkgLT0gdGF1ICogdG1wOworICAgIHJpZ2h0Lm5vYWxpYXMoKSAtPSB0YXUgKiB0bXAgKiBlc3NlbnRpYWwudHJhbnNwb3NlKCk7CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9IT1VTRUhPTERFUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvSG91c2Vob2xkZXIvSG91c2Vob2xkZXJTZXF1ZW5jZS5oIGIvRWlnZW4vc3JjL0hvdXNlaG9sZGVyL0hvdXNlaG9sZGVyU2VxdWVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTcxZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0hvdXNlaG9sZGVyL0hvdXNlaG9sZGVyU2VxdWVuY2UuaApAQCAtMCwwICsxLDQ0MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0hPVVNFSE9MREVSX1NFUVVFTkNFX0gKKyNkZWZpbmUgRUlHRU5fSE9VU0VIT0xERVJfU0VRVUVOQ0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIEhvdXNlaG9sZGVyX01vZHVsZQorICAqIFxob3VzZWhvbGRlcl9tb2R1bGUKKyAgKiBcY2xhc3MgSG91c2Vob2xkZXJTZXF1ZW5jZQorICAqIFxicmllZiBTZXF1ZW5jZSBvZiBIb3VzZWhvbGRlciByZWZsZWN0aW9ucyBhY3Rpbmcgb24gc3Vic3BhY2VzIHdpdGggZGVjcmVhc2luZyBzaXplCisgICogXHRwYXJhbSBWZWN0b3JzVHlwZSB0eXBlIG9mIG1hdHJpeCBjb250YWluaW5nIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3JzCisgICogXHRwYXJhbSBDb2VmZnNUeXBlICB0eXBlIG9mIHZlY3RvciBjb250YWluaW5nIHRoZSBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMKKyAgKiBcdHBhcmFtIFNpZGUgICAgICAgIGVpdGhlciBPblRoZUxlZnQgKHRoZSBkZWZhdWx0KSBvciBPblRoZVJpZ2h0CisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcm9kdWN0IHNlcXVlbmNlIG9mIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb25zIHdoZXJlIHRoZSBmaXJzdCBIb3VzZWhvbGRlciByZWZsZWN0aW9uCisgICogYWN0cyBvbiB0aGUgd2hvbGUgc3BhY2UsIHRoZSBzZWNvbmQgSG91c2Vob2xkZXIgcmVmbGVjdGlvbiBsZWF2ZXMgdGhlIG9uZS1kaW1lbnNpb25hbCBzdWJzcGFjZSBzcGFubmVkIGJ5CisgICogdGhlIGZpcnN0IHVuaXQgdmVjdG9yIGludmFyaWFudCwgdGhlIHRoaXJkIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb24gbGVhdmVzIHRoZSB0d28tZGltZW5zaW9uYWwgc3Vic3BhY2UKKyAgKiBzcGFubmVkIGJ5IHRoZSBmaXJzdCB0d28gdW5pdCB2ZWN0b3JzIGludmFyaWFudCwgYW5kIHNvIG9uIHVwIHRvIHRoZSBsYXN0IHJlZmxlY3Rpb24gd2hpY2ggbGVhdmVzIGFsbCBidXQKKyAgKiBvbmUgZGltZW5zaW9ucyBpbnZhcmlhbnQgYW5kIGFjdHMgb25seSBvbiB0aGUgbGFzdCBkaW1lbnNpb24uIFN1Y2ggc2VxdWVuY2VzIG9mIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb25zCisgICogYXJlIHVzZWQgaW4gc2V2ZXJhbCBhbGdvcml0aG1zIHRvIHplcm8gb3V0IGNlcnRhaW4gcGFydHMgb2YgYSBtYXRyaXguIEluZGVlZCwgdGhlIG1ldGhvZHMKKyAgKiBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjo6bWF0cml4USgpLCBUcmlkaWFnb25hbGl6YXRpb246Om1hdHJpeFEoKSwgSG91c2Vob2xkZXJRUjo6aG91c2Vob2xkZXJRKCksCisgICogYW5kIENvbFBpdkhvdXNlaG9sZGVyUVI6OmhvdXNlaG9sZGVyUSgpIGFsbCByZXR1cm4gYSAlSG91c2Vob2xkZXJTZXF1ZW5jZS4KKyAgKgorICAqIE1vcmUgcHJlY2lzZWx5LCB0aGUgY2xhc3MgJUhvdXNlaG9sZGVyU2VxdWVuY2UgcmVwcmVzZW50cyBhbiBcZiQgbiBcdGltZXMgbiBcZiQgbWF0cml4IFxmJCBIIFxmJCBvZiB0aGUKKyAgKiBmb3JtIFxmJCBIID0gXHByb2Rfe2k9MH1ee24tMX0gSF9pIFxmJCB3aGVyZSB0aGUgaS10aCBIb3VzZWhvbGRlciByZWZsZWN0aW9uIGlzIFxmJCBIX2kgPSBJIC0gaF9pIHZfaQorICAqIHZfaV4qIFxmJC4gVGhlIGktdGggSG91c2Vob2xkZXIgY29lZmZpY2llbnQgXGYkIGhfaSBcZiQgaXMgYSBzY2FsYXIgYW5kIHRoZSBpLXRoIEhvdXNlaG9sZGVyIHZlY3RvciBcZiQKKyAgKiB2X2kgXGYkIGlzIGEgdmVjdG9yIG9mIHRoZSBmb3JtCisgICogXGZbIAorICAqIHZfaSA9IFtcdW5kZXJicmFjZXswLCBcbGRvdHMsIDB9X3tpLTFcbWJveHsgemVyb3N9fSwgMSwgXHVuZGVyYnJhY2V7KiwgXGxkb3RzLCp9X3tuLWlcbWJveHsgYXJiaXRyYXJ5IGVudHJpZXN9fSBdLiAKKyAgKiBcZl0KKyAgKiBUaGUgbGFzdCBcZiQgbi1pIFxmJCBlbnRyaWVzIG9mIFxmJCB2X2kgXGYkIGFyZSBjYWxsZWQgdGhlIGVzc2VudGlhbCBwYXJ0IG9mIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3IuCisgICoKKyAgKiBUeXBpY2FsIHVzYWdlcyBhcmUgbGlzdGVkIGJlbG93LCB3aGVyZSBIIGlzIGEgSG91c2Vob2xkZXJTZXF1ZW5jZToKKyAgKiBcY29kZQorICAqIEEuYXBwbHlPblRoZVJpZ2h0KEgpOyAgICAgICAgICAgICAvLyBBID0gQSAqIEgKKyAgKiBBLmFwcGx5T25UaGVMZWZ0KEgpOyAgICAgICAgICAgICAgLy8gQSA9IEggKiBBCisgICogQS5hcHBseU9uVGhlUmlnaHQoSC5hZGpvaW50KCkpOyAgIC8vIEEgPSBBICogSF4qCisgICogQS5hcHBseU9uVGhlTGVmdChILmFkam9pbnQoKSk7ICAgIC8vIEEgPSBIXiogKiBBCisgICogTWF0cml4WGQgUSA9IEg7ICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gdG8gYSBkZW5zZSBtYXRyaXgKKyAgKiBcZW5kY29kZQorICAqIEluIGFkZGl0aW9uIHRvIHRoZSBhZGpvaW50LCB5b3UgY2FuIGFsc28gYXBwbHkgdGhlIGludmVyc2UgKD1hZGpvaW50KSwgdGhlIHRyYW5zcG9zZSwgYW5kIHRoZSBjb25qdWdhdGUgb3BlcmF0b3JzLgorICAqCisgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBIb3VzZWhvbGRlclNlcXVlbmNlKGNvbnN0IFZlY3RvcnNUeXBlJiwgY29uc3QgQ29lZmZzVHlwZSYpIGZvciBhbiBleGFtcGxlLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVMZWZ0KCksIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVSaWdodCgpCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvcnNUeXBlLCB0eXBlbmFtZSBDb2VmZnNUeXBlLCBpbnQgU2lkZT4KK3N0cnVjdCB0cmFpdHM8SG91c2Vob2xkZXJTZXF1ZW5jZTxWZWN0b3JzVHlwZSxDb2VmZnNUeXBlLFNpZGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JzVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JzVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yc1R5cGU6OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IFNpZGU9PU9uVGhlTGVmdCA/IHRyYWl0czxWZWN0b3JzVHlwZT46OlJvd3NBdENvbXBpbGVUaW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0cmFpdHM8VmVjdG9yc1R5cGU+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gU2lkZT09T25UaGVMZWZ0ID8gdHJhaXRzPFZlY3RvcnNUeXBlPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRyYWl0czxWZWN0b3JzVHlwZT46Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgRmxhZ3MgPSAwCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JzVHlwZSwgdHlwZW5hbWUgQ29lZmZzVHlwZSwgaW50IFNpZGU+CitzdHJ1Y3QgaHNlcV9zaWRlX2RlcGVuZGVudF9pbXBsCit7CisgIHR5cGVkZWYgQmxvY2s8Y29uc3QgVmVjdG9yc1R5cGUsIER5bmFtaWMsIDE+IEVzc2VudGlhbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgSG91c2Vob2xkZXJTZXF1ZW5jZTxWZWN0b3JzVHlwZSwgQ29lZmZzVHlwZSwgT25UaGVMZWZ0PiBIb3VzZWhvbGRlclNlcXVlbmNlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JzVHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgRXNzZW50aWFsVmVjdG9yVHlwZSBlc3NlbnRpYWxWZWN0b3IoY29uc3QgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUmIGgsIEluZGV4IGspCisgIHsKKyAgICBJbmRleCBzdGFydCA9IGsrMStoLm1fc2hpZnQ7CisgICAgcmV0dXJuIEJsb2NrPGNvbnN0IFZlY3RvcnNUeXBlLER5bmFtaWMsMT4oaC5tX3ZlY3RvcnMsIHN0YXJ0LCBrLCBoLnJvd3MoKS1zdGFydCwgMSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvcnNUeXBlLCB0eXBlbmFtZSBDb2VmZnNUeXBlPgorc3RydWN0IGhzZXFfc2lkZV9kZXBlbmRlbnRfaW1wbDxWZWN0b3JzVHlwZSwgQ29lZmZzVHlwZSwgT25UaGVSaWdodD4KK3sKKyAgdHlwZWRlZiBUcmFuc3Bvc2U8QmxvY2s8Y29uc3QgVmVjdG9yc1R5cGUsIDEsIER5bmFtaWM+ID4gRXNzZW50aWFsVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBIb3VzZWhvbGRlclNlcXVlbmNlPFZlY3RvcnNUeXBlLCBDb2VmZnNUeXBlLCBPblRoZVJpZ2h0PiBIb3VzZWhvbGRlclNlcXVlbmNlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JzVHlwZTo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgRXNzZW50aWFsVmVjdG9yVHlwZSBlc3NlbnRpYWxWZWN0b3IoY29uc3QgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUmIGgsIEluZGV4IGspCisgIHsKKyAgICBJbmRleCBzdGFydCA9IGsrMStoLm1fc2hpZnQ7CisgICAgcmV0dXJuIEJsb2NrPGNvbnN0IFZlY3RvcnNUeXBlLDEsRHluYW1pYz4oaC5tX3ZlY3RvcnMsIGssIHN0YXJ0LCAxLCBoLnJvd3MoKS1zdGFydCkudHJhbnNwb3NlKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IG1hdHJpeF90eXBlX3RpbWVzX3NjYWxhcl90eXBlCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPE90aGVyU2NhbGFyVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmV0dXJuVHlwZQorICAgIFJlc3VsdFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8UmVzdWx0U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIDAsIE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZT4gVHlwZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JzVHlwZSwgdHlwZW5hbWUgQ29lZmZzVHlwZSwgaW50IFNpZGU+IGNsYXNzIEhvdXNlaG9sZGVyU2VxdWVuY2UKKyAgOiBwdWJsaWMgRWlnZW5CYXNlPEhvdXNlaG9sZGVyU2VxdWVuY2U8VmVjdG9yc1R5cGUsQ29lZmZzVHlwZSxTaWRlPiA+Cit7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8SG91c2Vob2xkZXJTZXF1ZW5jZT46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPEhvdXNlaG9sZGVyU2VxdWVuY2U+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxIb3VzZWhvbGRlclNlcXVlbmNlPjo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8SG91c2Vob2xkZXJTZXF1ZW5jZT46Ok1heENvbHNBdENvbXBpbGVUaW1lCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8SG91c2Vob2xkZXJTZXF1ZW5jZT46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JzVHlwZTo6SW5kZXggSW5kZXg7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpoc2VxX3NpZGVfZGVwZW5kZW50X2ltcGw8VmVjdG9yc1R5cGUsQ29lZmZzVHlwZSxTaWRlPjo6RXNzZW50aWFsVmVjdG9yVHlwZQorICAgICAgICAgICAgRXNzZW50aWFsVmVjdG9yVHlwZTsKKworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIEhvdXNlaG9sZGVyU2VxdWVuY2U8CisgICAgICBWZWN0b3JzVHlwZSwKKyAgICAgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAorICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBDb2VmZnNUeXBlOjpDb25qdWdhdGVSZXR1cm5UeXBlPjo6dHlwZSwKKyAgICAgICAgQ29lZmZzVHlwZT46OnR5cGUsCisgICAgICBTaWRlCisgICAgPiBDb25qdWdhdGVSZXR1cm5UeXBlOworCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgICogXHBhcmFtW2luXSAgdiAgICAgICVNYXRyaXggY29udGFpbmluZyB0aGUgZXNzZW50aWFsIHBhcnRzIG9mIHRoZSBIb3VzZWhvbGRlciB2ZWN0b3JzCisgICAgICAqIFxwYXJhbVtpbl0gIGggICAgICBWZWN0b3IgY29udGFpbmluZyB0aGUgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzCisgICAgICAqCisgICAgICAqIENvbnN0cnVjdHMgdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlIHdpdGggY29lZmZpY2llbnRzIGdpdmVuIGJ5IFxwIGggYW5kIHZlY3RvcnMgZ2l2ZW4gYnkgXHAgdi4gVGhlCisgICAgICAqIGktdGggSG91c2Vob2xkZXIgY29lZmZpY2llbnQgXGYkIGhfaSBcZiQgaXMgZ2l2ZW4gYnkgXHAgaChpKSBhbmQgdGhlIGVzc2VudGlhbCBwYXJ0IG9mIHRoZSBpLXRoCisgICAgICAqIEhvdXNlaG9sZGVyIHZlY3RvciBcZiQgdl9pIFxmJCBpcyBnaXZlbiBieSBccCB2KGssaSkgd2l0aCBccCBrID4gXHAgaSAodGhlIHN1YmRpYWdvbmFsIHBhcnQgb2YgdGhlCisgICAgICAqIGktdGggY29sdW1uKS4gSWYgXHAgdiBoYXMgZmV3ZXIgY29sdW1ucyB0aGFuIHJvd3MsIHRoZW4gdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlIGNvbnRhaW5zIGFzIG1hbnkKKyAgICAgICogSG91c2Vob2xkZXIgcmVmbGVjdGlvbnMgYXMgdGhlcmUgYXJlIGNvbHVtbnMuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoZSAlSG91c2Vob2xkZXJTZXF1ZW5jZSBvYmplY3Qgc3RvcmVzIFxwIHYgYW5kIFxwIGggYnkgcmVmZXJlbmNlLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBIb3VzZWhvbGRlclNlcXVlbmNlX0hvdXNlaG9sZGVyU2VxdWVuY2UuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEhvdXNlaG9sZGVyU2VxdWVuY2VfSG91c2Vob2xkZXJTZXF1ZW5jZS5vdXQKKyAgICAgICoKKyAgICAgICogXHNhIHNldExlbmd0aCgpLCBzZXRTaGlmdCgpCisgICAgICAqLworICAgIEhvdXNlaG9sZGVyU2VxdWVuY2UoY29uc3QgVmVjdG9yc1R5cGUmIHYsIGNvbnN0IENvZWZmc1R5cGUmIGgpCisgICAgICA6IG1fdmVjdG9ycyh2KSwgbV9jb2VmZnMoaCksIG1fdHJhbnMoZmFsc2UpLCBtX2xlbmd0aCh2LmRpYWdvbmFsU2l6ZSgpKSwKKyAgICAgICAgbV9zaGlmdCgwKQorICAgIHsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvcHkgY29uc3RydWN0b3IuICovCisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZShjb25zdCBIb3VzZWhvbGRlclNlcXVlbmNlJiBvdGhlcikKKyAgICAgIDogbV92ZWN0b3JzKG90aGVyLm1fdmVjdG9ycyksCisgICAgICAgIG1fY29lZmZzKG90aGVyLm1fY29lZmZzKSwKKyAgICAgICAgbV90cmFucyhvdGhlci5tX3RyYW5zKSwKKyAgICAgICAgbV9sZW5ndGgob3RoZXIubV9sZW5ndGgpLAorICAgICAgICBtX3NoaWZ0KG90aGVyLm1fc2hpZnQpCisgICAgeworICAgIH0KKworICAgIC8qKiBcYnJpZWYgTnVtYmVyIG9mIHJvd3Mgb2YgdHJhbnNmb3JtYXRpb24gdmlld2VkIGFzIGEgbWF0cml4LgorICAgICAgKiBccmV0dXJucyBOdW1iZXIgb2Ygcm93cyAKKyAgICAgICogXGRldGFpbHMgVGhpcyBlcXVhbHMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3BhY2UgdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gYWN0cyBvbi4KKyAgICAgICovCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIFNpZGU9PU9uVGhlTGVmdCA/IG1fdmVjdG9ycy5yb3dzKCkgOiBtX3ZlY3RvcnMuY29scygpOyB9CisKKyAgICAvKiogXGJyaWVmIE51bWJlciBvZiBjb2x1bW5zIG9mIHRyYW5zZm9ybWF0aW9uIHZpZXdlZCBhcyBhIG1hdHJpeC4KKyAgICAgICogXHJldHVybnMgTnVtYmVyIG9mIGNvbHVtbnMKKyAgICAgICogXGRldGFpbHMgVGhpcyBlcXVhbHMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3BhY2UgdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gYWN0cyBvbi4KKyAgICAgICovCisgICAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIHJvd3MoKTsgfQorCisgICAgLyoqIFxicmllZiBFc3NlbnRpYWwgcGFydCBvZiBhIEhvdXNlaG9sZGVyIHZlY3Rvci4KKyAgICAgICogXHBhcmFtW2luXSAgayAgSW5kZXggb2YgSG91c2Vob2xkZXIgcmVmbGVjdGlvbgorICAgICAgKiBccmV0dXJucyAgICBWZWN0b3IgY29udGFpbmluZyBub24tdHJpdmlhbCBlbnRyaWVzIG9mIGstdGggSG91c2Vob2xkZXIgdmVjdG9yCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZXNzZW50aWFsIHBhcnQgb2YgdGhlIEhvdXNlaG9sZGVyIHZlY3RvciBcZiQgdl9pIFxmJC4gVGhpcyBpcyBhIHZlY3RvciBvZgorICAgICAgKiBsZW5ndGggXGYkIG4taSBcZiQgY29udGFpbmluZyB0aGUgbGFzdCBcZiQgbi1pIFxmJCBlbnRyaWVzIG9mIHRoZSB2ZWN0b3IKKyAgICAgICogXGZbIAorICAgICAgKiB2X2kgPSBbXHVuZGVyYnJhY2V7MCwgXGxkb3RzLCAwfV97aS0xXG1ib3h7IHplcm9zfX0sIDEsIFx1bmRlcmJyYWNleyosIFxsZG90cywqfV97bi1pXG1ib3h7IGFyYml0cmFyeSBlbnRyaWVzfX0gXS4gCisgICAgICAqIFxmXQorICAgICAgKiBUaGUgaW5kZXggXGYkIGkgXGYkIGVxdWFscyBccCBrICsgc2hpZnQoKSwgY29ycmVzcG9uZGluZyB0byB0aGUgay10aCBjb2x1bW4gb2YgdGhlIG1hdHJpeCBccCB2CisgICAgICAqIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxzYSBzZXRTaGlmdCgpLCBzaGlmdCgpCisgICAgICAqLworICAgIGNvbnN0IEVzc2VudGlhbFZlY3RvclR5cGUgZXNzZW50aWFsVmVjdG9yKEluZGV4IGspIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGsgPj0gMCAmJiBrIDwgbV9sZW5ndGgpOworICAgICAgcmV0dXJuIGludGVybmFsOjpoc2VxX3NpZGVfZGVwZW5kZW50X2ltcGw8VmVjdG9yc1R5cGUsQ29lZmZzVHlwZSxTaWRlPjo6ZXNzZW50aWFsVmVjdG9yKCp0aGlzLCBrKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmICVUcmFuc3Bvc2Ugb2YgdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlLiAqLworICAgIEhvdXNlaG9sZGVyU2VxdWVuY2UgdHJhbnNwb3NlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gSG91c2Vob2xkZXJTZXF1ZW5jZSgqdGhpcykuc2V0VHJhbnMoIW1fdHJhbnMpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29tcGxleCBjb25qdWdhdGUgb2YgdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlLiAqLworICAgIENvbmp1Z2F0ZVJldHVyblR5cGUgY29uanVnYXRlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQ29uanVnYXRlUmV0dXJuVHlwZShtX3ZlY3RvcnMsIG1fY29lZmZzLmNvbmp1Z2F0ZSgpKQorICAgICAgICAgICAgIC5zZXRUcmFucyhtX3RyYW5zKQorICAgICAgICAgICAgIC5zZXRMZW5ndGgobV9sZW5ndGgpCisgICAgICAgICAgICAgLnNldFNoaWZ0KG1fc2hpZnQpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgQWRqb2ludCAoY29uanVnYXRlIHRyYW5zcG9zZSkgb2YgdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlLiAqLworICAgIENvbmp1Z2F0ZVJldHVyblR5cGUgYWRqb2ludCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGNvbmp1Z2F0ZSgpLnNldFRyYW5zKCFtX3RyYW5zKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIEludmVyc2Ugb2YgdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlIChlcXVhbHMgdGhlIGFkam9pbnQpLiAqLworICAgIENvbmp1Z2F0ZVJldHVyblR5cGUgaW52ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIGFkam9pbnQoKTsgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3RUeXBlPiBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdFR5cGUmIGRzdCkgY29uc3QKKyAgICB7CisgICAgICBNYXRyaXg8U2NhbGFyLCBEZXN0VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDEsCisgICAgICAgICAgICAgQXV0b0FsaWdufENvbE1ham9yLCBEZXN0VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsIDE+IHdvcmtzcGFjZShyb3dzKCkpOworICAgICAgZXZhbFRvKGRzdCwgd29ya3NwYWNlKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdCwgdHlwZW5hbWUgV29ya3NwYWNlPgorICAgIHZvaWQgZXZhbFRvKERlc3QmIGRzdCwgV29ya3NwYWNlJiB3b3Jrc3BhY2UpIGNvbnN0CisgICAgeworICAgICAgd29ya3NwYWNlLnJlc2l6ZShyb3dzKCkpOworICAgICAgSW5kZXggdmVjcyA9IG1fbGVuZ3RoOworICAgICAgaWYoICAgIGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPFZlY3RvcnNUeXBlPjo6dHlwZSxEZXN0Pjo6dmFsdWUKKyAgICAgICAgICAmJiBpbnRlcm5hbDo6ZXh0cmFjdF9kYXRhKGRzdCkgPT0gaW50ZXJuYWw6OmV4dHJhY3RfZGF0YShtX3ZlY3RvcnMpKQorICAgICAgeworICAgICAgICAvLyBpbi1wbGFjZQorICAgICAgICBkc3QuZGlhZ29uYWwoKS5zZXRPbmVzKCk7CisgICAgICAgIGRzdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpLnNldFplcm8oKTsKKyAgICAgICAgZm9yKEluZGV4IGsgPSB2ZWNzLTE7IGsgPj0gMDsgLS1rKQorICAgICAgICB7CisgICAgICAgICAgSW5kZXggY29ybmVyU2l6ZSA9IHJvd3MoKSAtIGsgLSBtX3NoaWZ0OworICAgICAgICAgIGlmKG1fdHJhbnMpCisgICAgICAgICAgICBkc3QuYm90dG9tUmlnaHRDb3JuZXIoY29ybmVyU2l6ZSwgY29ybmVyU2l6ZSkKKyAgICAgICAgICAgICAgIC5hcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodChlc3NlbnRpYWxWZWN0b3IoayksIG1fY29lZmZzLmNvZWZmKGspLCB3b3Jrc3BhY2UuZGF0YSgpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBkc3QuYm90dG9tUmlnaHRDb3JuZXIoY29ybmVyU2l6ZSwgY29ybmVyU2l6ZSkKKyAgICAgICAgICAgICAgIC5hcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KGVzc2VudGlhbFZlY3RvcihrKSwgbV9jb2VmZnMuY29lZmYoayksIHdvcmtzcGFjZS5kYXRhKCkpOworCisgICAgICAgICAgLy8gY2xlYXIgdGhlIG9mZiBkaWFnb25hbCB2ZWN0b3IKKyAgICAgICAgICBkc3QuY29sKGspLnRhaWwocm93cygpLWstMSkuc2V0WmVybygpOworICAgICAgICB9CisgICAgICAgIC8vIGNsZWFyIHRoZSByZW1haW5pbmcgY29sdW1ucyBpZiBuZWVkZWQKKyAgICAgICAgZm9yKEluZGV4IGsgPSAwOyBrPGNvbHMoKS12ZWNzIDsgKytrKQorICAgICAgICAgIGRzdC5jb2woaykudGFpbChyb3dzKCktay0xKS5zZXRaZXJvKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGRzdC5zZXRJZGVudGl0eShyb3dzKCksIHJvd3MoKSk7CisgICAgICAgIGZvcihJbmRleCBrID0gdmVjcy0xOyBrID49IDA7IC0taykKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGNvcm5lclNpemUgPSByb3dzKCkgLSBrIC0gbV9zaGlmdDsKKyAgICAgICAgICBpZihtX3RyYW5zKQorICAgICAgICAgICAgZHN0LmJvdHRvbVJpZ2h0Q29ybmVyKGNvcm5lclNpemUsIGNvcm5lclNpemUpCisgICAgICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoZXNzZW50aWFsVmVjdG9yKGspLCBtX2NvZWZmcy5jb2VmZihrKSwgJndvcmtzcGFjZS5jb2VmZlJlZigwKSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZHN0LmJvdHRvbVJpZ2h0Q29ybmVyKGNvcm5lclNpemUsIGNvcm5lclNpemUpCisgICAgICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3NlbnRpYWxWZWN0b3IoayksIG1fY29lZmZzLmNvZWZmKGspLCAmd29ya3NwYWNlLmNvZWZmUmVmKDApKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiBpbmxpbmUgdm9pZCBhcHBseVRoaXNPblRoZVJpZ2h0KERlc3QmIGRzdCkgY29uc3QKKyAgICB7CisgICAgICBNYXRyaXg8U2NhbGFyLDEsRGVzdDo6Um93c0F0Q29tcGlsZVRpbWUsUm93TWFqb3IsMSxEZXN0OjpNYXhSb3dzQXRDb21waWxlVGltZT4gd29ya3NwYWNlKGRzdC5yb3dzKCkpOworICAgICAgYXBwbHlUaGlzT25UaGVSaWdodChkc3QsIHdvcmtzcGFjZSk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3QsIHR5cGVuYW1lIFdvcmtzcGFjZT4KKyAgICBpbmxpbmUgdm9pZCBhcHBseVRoaXNPblRoZVJpZ2h0KERlc3QmIGRzdCwgV29ya3NwYWNlJiB3b3Jrc3BhY2UpIGNvbnN0CisgICAgeworICAgICAgd29ya3NwYWNlLnJlc2l6ZShkc3Qucm93cygpKTsKKyAgICAgIGZvcihJbmRleCBrID0gMDsgayA8IG1fbGVuZ3RoOyArK2spCisgICAgICB7CisgICAgICAgIEluZGV4IGFjdHVhbF9rID0gbV90cmFucyA/IG1fbGVuZ3RoLWstMSA6IGs7CisgICAgICAgIGRzdC5yaWdodENvbHMocm93cygpLW1fc2hpZnQtYWN0dWFsX2spCisgICAgICAgICAgIC5hcHBseUhvdXNlaG9sZGVyT25UaGVSaWdodChlc3NlbnRpYWxWZWN0b3IoYWN0dWFsX2spLCBtX2NvZWZmcy5jb2VmZihhY3R1YWxfayksIHdvcmtzcGFjZS5kYXRhKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiBpbmxpbmUgdm9pZCBhcHBseVRoaXNPblRoZUxlZnQoRGVzdCYgZHN0KSBjb25zdAorICAgIHsKKyAgICAgIE1hdHJpeDxTY2FsYXIsMSxEZXN0OjpDb2xzQXRDb21waWxlVGltZSxSb3dNYWpvciwxLERlc3Q6Ok1heENvbHNBdENvbXBpbGVUaW1lPiB3b3Jrc3BhY2UoZHN0LmNvbHMoKSk7CisgICAgICBhcHBseVRoaXNPblRoZUxlZnQoZHN0LCB3b3Jrc3BhY2UpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBXb3Jrc3BhY2U+CisgICAgaW5saW5lIHZvaWQgYXBwbHlUaGlzT25UaGVMZWZ0KERlc3QmIGRzdCwgV29ya3NwYWNlJiB3b3Jrc3BhY2UpIGNvbnN0CisgICAgeworICAgICAgd29ya3NwYWNlLnJlc2l6ZShkc3QuY29scygpKTsKKyAgICAgIGZvcihJbmRleCBrID0gMDsgayA8IG1fbGVuZ3RoOyArK2spCisgICAgICB7CisgICAgICAgIEluZGV4IGFjdHVhbF9rID0gbV90cmFucyA/IGsgOiBtX2xlbmd0aC1rLTE7CisgICAgICAgIGRzdC5ib3R0b21Sb3dzKHJvd3MoKS1tX3NoaWZ0LWFjdHVhbF9rKQorICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3NlbnRpYWxWZWN0b3IoYWN0dWFsX2spLCBtX2NvZWZmcy5jb2VmZihhY3R1YWxfayksIHdvcmtzcGFjZS5kYXRhKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIHByb2R1Y3Qgb2YgYSBIb3VzZWhvbGRlciBzZXF1ZW5jZSB3aXRoIGEgbWF0cml4LgorICAgICAgKiBccGFyYW1baW5dICBvdGhlciAgJU1hdHJpeCBiZWluZyBtdWx0aXBsaWVkLgorICAgICAgKiBccmV0dXJucyAgICBFeHByZXNzaW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHByb2R1Y3QuCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgXGYkIEhNIFxmJCB3aGVyZSBcZiQgSCBcZiQgaXMgdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IFxwICp0aGlzCisgICAgICAqIGFuZCBcZiQgTSBcZiQgaXMgdGhlIG1hdHJpeCBccCBvdGhlci4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIHR5cGVuYW1lIGludGVybmFsOjptYXRyaXhfdHlwZV90aW1lc19zY2FsYXJfdHlwZTxTY2FsYXIsIE90aGVyRGVyaXZlZD46OlR5cGUgb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om1hdHJpeF90eXBlX3RpbWVzX3NjYWxhcl90eXBlPFNjYWxhciwgT3RoZXJEZXJpdmVkPjo6VHlwZQorICAgICAgICByZXMob3RoZXIudGVtcGxhdGUgY2FzdDx0eXBlbmFtZSBpbnRlcm5hbDo6bWF0cml4X3R5cGVfdGltZXNfc2NhbGFyX3R5cGU8U2NhbGFyLE90aGVyRGVyaXZlZD46OlJlc3VsdFNjYWxhcj4oKSk7CisgICAgICBhcHBseVRoaXNPblRoZUxlZnQocmVzKTsKKyAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZlY3RvcnNUeXBlLCB0eXBlbmFtZSBfQ29lZmZzVHlwZSwgaW50IF9TaWRlPiBmcmllbmQgc3RydWN0IGludGVybmFsOjpoc2VxX3NpZGVfZGVwZW5kZW50X2ltcGw7CisKKyAgICAvKiogXGJyaWVmIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UuCisgICAgICAqIFxwYXJhbSBbaW5dICBsZW5ndGggIE5ldyB2YWx1ZSBmb3IgdGhlIGxlbmd0aC4KKyAgICAgICoKKyAgICAgICogQnkgZGVmYXVsdCwgdGhlIGxlbmd0aCBcZiQgbiBcZiQgb2YgdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlIFxmJCBIID0gSF8wIEhfMSBcbGRvdHMgSF97bi0xfSBcZiQgaXMgc2V0CisgICAgICAqIHRvIHRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgbWF0cml4IFxwIHYgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvciwgb3IgdGhlIG51bWJlciBvZiByb3dzIGlmIHRoYXQKKyAgICAgICogaXMgc21hbGxlci4gQWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBsZW5ndGggZXF1YWxzIFxwIGxlbmd0aC4KKyAgICAgICoKKyAgICAgICogXHNhIGxlbmd0aCgpCisgICAgICAqLworICAgIEhvdXNlaG9sZGVyU2VxdWVuY2UmIHNldExlbmd0aChJbmRleCBsZW5ndGgpCisgICAgeworICAgICAgbV9sZW5ndGggPSBsZW5ndGg7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIFxicmllZiBTZXRzIHRoZSBzaGlmdCBvZiB0aGUgSG91c2Vob2xkZXIgc2VxdWVuY2UuCisgICAgICAqIFxwYXJhbSBbaW5dICBzaGlmdCAgTmV3IHZhbHVlIGZvciB0aGUgc2hpZnQuCisgICAgICAqCisgICAgICAqIEJ5IGRlZmF1bHQsIGEgJUhvdXNlaG9sZGVyU2VxdWVuY2Ugb2JqZWN0IHJlcHJlc2VudHMgXGYkIEggPSBIXzAgSF8xIFxsZG90cyBIX3tuLTF9IFxmJCBhbmQgdGhlIGktdGgKKyAgICAgICogY29sdW1uIG9mIHRoZSBtYXRyaXggXHAgdiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBpLXRoIEhvdXNlaG9sZGVyCisgICAgICAqIHJlZmxlY3Rpb24uIEFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgb2JqZWN0IHJlcHJlc2VudHMgXGYkIEggPSBIX3tcbWF0aHJte3NoaWZ0fX0KKyAgICAgICogSF97XG1hdGhybXtzaGlmdH0rMX0gXGxkb3RzIEhfe24tMX0gXGYkIGFuZCB0aGUgaS10aCBjb2x1bW4gb2YgXHAgdiBjb3JyZXNwb25kcyB0byB0aGUgKHNoaWZ0K2kpLXRoCisgICAgICAqIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb24uCisgICAgICAqCisgICAgICAqIFxzYSBzaGlmdCgpCisgICAgICAqLworICAgIEhvdXNlaG9sZGVyU2VxdWVuY2UmIHNldFNoaWZ0KEluZGV4IHNoaWZ0KQorICAgIHsKKyAgICAgIG1fc2hpZnQgPSBzaGlmdDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbmRleCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2xlbmd0aDsgfSAgLyoqPCBcYnJpZWYgUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBIb3VzZWhvbGRlciBzZXF1ZW5jZS4gKi8KKyAgICBJbmRleCBzaGlmdCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hpZnQ7IH0gICAgLyoqPCBcYnJpZWYgUmV0dXJucyB0aGUgc2hpZnQgb2YgdGhlIEhvdXNlaG9sZGVyIHNlcXVlbmNlLiAqLworCisgICAgLyogTmVjZXNzYXJ5IGZvciAuYWRqb2ludCgpIGFuZCAuY29uanVnYXRlKCkgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yc1R5cGUyLCB0eXBlbmFtZSBDb2VmZnNUeXBlMiwgaW50IFNpZGUyPiBmcmllbmQgY2xhc3MgSG91c2Vob2xkZXJTZXF1ZW5jZTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICAvKiogXGJyaWVmIFNldHMgdGhlIHRyYW5zcG9zZSBmbGFnLgorICAgICAgKiBccGFyYW0gW2luXSAgdHJhbnMgIE5ldyB2YWx1ZSBvZiB0aGUgdHJhbnNwb3NlIGZsYWcuCisgICAgICAqCisgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc3Bvc2UgZmxhZyBpcyBub3Qgc2V0LiBJZiB0aGUgdHJhbnNwb3NlIGZsYWcgaXMgc2V0LCB0aGVuIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMgCisgICAgICAqIFxmJCBIXlQgPSBIX3tuLTF9XlQgXGxkb3RzIEhfMV5UIEhfMF5UIFxmJCBpbnN0ZWFkIG9mIFxmJCBIID0gSF8wIEhfMSBcbGRvdHMgSF97bi0xfSBcZiQuCisgICAgICAqCisgICAgICAqIFxzYSB0cmFucygpCisgICAgICAqLworICAgIEhvdXNlaG9sZGVyU2VxdWVuY2UmIHNldFRyYW5zKGJvb2wgdHJhbnMpCisgICAgeworICAgICAgbV90cmFucyA9IHRyYW5zOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJvb2wgdHJhbnMoKSBjb25zdCB7IHJldHVybiBtX3RyYW5zOyB9ICAgICAvKio8IFxicmllZiBSZXR1cm5zIHRoZSB0cmFuc3Bvc2UgZmxhZy4gKi8KKworICAgIHR5cGVuYW1lIFZlY3RvcnNUeXBlOjpOZXN0ZWQgbV92ZWN0b3JzOworICAgIHR5cGVuYW1lIENvZWZmc1R5cGU6Ok5lc3RlZCBtX2NvZWZmczsKKyAgICBib29sIG1fdHJhbnM7CisgICAgSW5kZXggbV9sZW5ndGg7CisgICAgSW5kZXggbV9zaGlmdDsKK307CisKKy8qKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIHByb2R1Y3Qgb2YgYSBtYXRyaXggd2l0aCBhIEhvdXNlaG9sZGVyIHNlcXVlbmNlLgorICAqIFxwYXJhbVtpbl0gIG90aGVyICAlTWF0cml4IGJlaW5nIG11bHRpcGxpZWQuCisgICogXHBhcmFtW2luXSAgaCAgICAgICVIb3VzZWhvbGRlclNlcXVlbmNlIGJlaW5nIG11bHRpcGxpZWQuCisgICogXHJldHVybnMgICAgRXhwcmVzc2lvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwcm9kdWN0LgorICAqCisgICogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBcZiQgTUggXGYkIHdoZXJlIFxmJCBNIFxmJCBpcyB0aGUgbWF0cml4IFxwIG90aGVyIGFuZCBcZiQgSCBcZiQgaXMgdGhlCisgICogSG91c2Vob2xkZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgXHAgaC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZCwgdHlwZW5hbWUgVmVjdG9yc1R5cGUsIHR5cGVuYW1lIENvZWZmc1R5cGUsIGludCBTaWRlPgordHlwZW5hbWUgaW50ZXJuYWw6Om1hdHJpeF90eXBlX3RpbWVzX3NjYWxhcl90eXBlPHR5cGVuYW1lIFZlY3RvcnNUeXBlOjpTY2FsYXIsT3RoZXJEZXJpdmVkPjo6VHlwZSBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlciwgY29uc3QgSG91c2Vob2xkZXJTZXF1ZW5jZTxWZWN0b3JzVHlwZSxDb2VmZnNUeXBlLFNpZGU+JiBoKQoreworICB0eXBlbmFtZSBpbnRlcm5hbDo6bWF0cml4X3R5cGVfdGltZXNfc2NhbGFyX3R5cGU8dHlwZW5hbWUgVmVjdG9yc1R5cGU6OlNjYWxhcixPdGhlckRlcml2ZWQ+OjpUeXBlCisgICAgcmVzKG90aGVyLnRlbXBsYXRlIGNhc3Q8dHlwZW5hbWUgaW50ZXJuYWw6Om1hdHJpeF90eXBlX3RpbWVzX3NjYWxhcl90eXBlPHR5cGVuYW1lIFZlY3RvcnNUeXBlOjpTY2FsYXIsT3RoZXJEZXJpdmVkPjo6UmVzdWx0U2NhbGFyPigpKTsKKyAgaC5hcHBseVRoaXNPblRoZVJpZ2h0KHJlcyk7CisgIHJldHVybiByZXM7Cit9CisKKy8qKiBcaW5ncm91cCBIb3VzZWhvbGRlcl9Nb2R1bGUgXGhvdXNlaG9sZGVyX21vZHVsZQorICAqIFxicmllZiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgY29uc3RydWN0aW5nIGEgSG91c2Vob2xkZXIgc2VxdWVuY2UuIAorICAqIFxyZXR1cm5zIEEgSG91c2Vob2xkZXJTZXF1ZW5jZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yc1R5cGUsIHR5cGVuYW1lIENvZWZmc1R5cGU+CitIb3VzZWhvbGRlclNlcXVlbmNlPFZlY3RvcnNUeXBlLENvZWZmc1R5cGU+IGhvdXNlaG9sZGVyU2VxdWVuY2UoY29uc3QgVmVjdG9yc1R5cGUmIHYsIGNvbnN0IENvZWZmc1R5cGUmIGgpCit7CisgIHJldHVybiBIb3VzZWhvbGRlclNlcXVlbmNlPFZlY3RvcnNUeXBlLENvZWZmc1R5cGUsT25UaGVMZWZ0Pih2LCBoKTsKK30KKworLyoqIFxpbmdyb3VwIEhvdXNlaG9sZGVyX01vZHVsZSBcaG91c2Vob2xkZXJfbW9kdWxlCisgICogXGJyaWVmIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RpbmcgYSBIb3VzZWhvbGRlciBzZXF1ZW5jZS4gCisgICogXHJldHVybnMgQSBIb3VzZWhvbGRlclNlcXVlbmNlIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCisgICogXGRldGFpbHMgVGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gaG91c2Vob2xkZXJTZXF1ZW5jZSgpIGluIHRoYXQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IFxwIE9uVGhlU2lkZSBvZgorICAqIHRoZSBjb25zdHJ1Y3RlZCBIb3VzZWhvbGRlclNlcXVlbmNlIGlzIHNldCB0byBPblRoZVJpZ2h0LCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IE9uVGhlTGVmdC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvcnNUeXBlLCB0eXBlbmFtZSBDb2VmZnNUeXBlPgorSG91c2Vob2xkZXJTZXF1ZW5jZTxWZWN0b3JzVHlwZSxDb2VmZnNUeXBlLE9uVGhlUmlnaHQ+IHJpZ2h0SG91c2Vob2xkZXJTZXF1ZW5jZShjb25zdCBWZWN0b3JzVHlwZSYgdiwgY29uc3QgQ29lZmZzVHlwZSYgaCkKK3sKKyAgcmV0dXJuIEhvdXNlaG9sZGVyU2VxdWVuY2U8VmVjdG9yc1R5cGUsQ29lZmZzVHlwZSxPblRoZVJpZ2h0Pih2LCBoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9IT1VTRUhPTERFUl9TRVFVRU5DRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9CYXNpY1ByZWNvbmRpdGlvbmVycy5oIGIvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvQmFzaWNQcmVjb25kaXRpb25lcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2NhOWJmCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvQmFzaWNQcmVjb25kaXRpb25lcnMuaApAQCAtMCwwICsxLDE0OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0JBU0lDX1BSRUNPTkRJVElPTkVSU19ICisjZGVmaW5lIEVJR0VOX0JBU0lDX1BSRUNPTkRJVElPTkVSU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgSXRlcmF0aXZlTGluZWFyU29sdmVyc19Nb2R1bGUKKyAgKiBcYnJpZWYgQSBwcmVjb25kaXRpb25lciBiYXNlZCBvbiB0aGUgZGlnb25hbCBlbnRyaWVzCisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBhcHByb3hpbWF0ZWx5IHNvbHZlIGZvciBBLnggPSBiIHByb2JsZW1zIGFzc3VtaW5nIEEgaXMgYSBkaWFnb25hbCBtYXRyaXguCisgICogSW4gb3RoZXIgd29yZHMsIHRoaXMgcHJlY29uZGl0aW9uZXIgbmVnbGVjdHMgYWxsIG9mZiBkaWFnb25hbCBlbnRyaWVzIGFuZCwgaW4gRWlnZW4ncyBsYW5ndWFnZSwgc29sdmVzIGZvcjoKKyAgKiBcY29kZQorICAqIEEuZGlhZ29uYWwoKS5hc0RpYWdvbmFsKCkgLiB4ID0gYgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBcdHBhcmFtIF9TY2FsYXIgdGhlIHR5cGUgb2YgdGhlIHNjYWxhci4KKyAgKgorICAqIFRoaXMgcHJlY29uZGl0aW9uZXIgaXMgc3VpdGFibGUgZm9yIGJvdGggc2VsZmFkam9pbnQgYW5kIGdlbmVyYWwgcHJvYmxlbXMuCisgICogVGhlIGRpYWdvbmFsIGVudHJpZXMgYXJlIHByZS1pbnZlcnRlZCBhbmQgc3RvcmVkIGludG8gYSBkZW5zZSB2ZWN0b3IuCisgICoKKyAgKiBcbm90ZSBBIHZhcmlhbnQgdGhhdCBoYXMgeWV0IHRvIGJlIGltcGxlbWVudGVkIHdvdWxkIGF0dGVtcHQgdG8gcHJlc2VydmUgdGhlIG5vcm0gb2YgZWFjaCBjb2x1bW4uCisgICoKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyPgorY2xhc3MgRGlhZ29uYWxQcmVjb25kaXRpb25lcgoreworICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yOjpJbmRleCBJbmRleDsKKworICBwdWJsaWM6CisgICAgLy8gdGhpcyB0eXBlZGVmIGlzIG9ubHkgdG8gZXhwb3J0IHRoZSBzY2FsYXIgdHlwZSBhbmQgY29tcGlsZS10aW1lIGRpbWVuc2lvbnMgdG8gc29sdmVfcmV0dmFsCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTWF0cml4VHlwZTsKKworICAgIERpYWdvbmFsUHJlY29uZGl0aW9uZXIoKSA6IG1faXNJbml0aWFsaXplZChmYWxzZSkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdFR5cGU+CisgICAgRGlhZ29uYWxQcmVjb25kaXRpb25lcihjb25zdCBNYXRUeXBlJiBtYXQpIDogbV9pbnZkaWFnKG1hdC5jb2xzKCkpCisgICAgeworICAgICAgY29tcHV0ZShtYXQpOworICAgIH0KKworICAgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2ludmRpYWcuc2l6ZSgpOyB9CisgICAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1faW52ZGlhZy5zaXplKCk7IH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRUeXBlPgorICAgIERpYWdvbmFsUHJlY29uZGl0aW9uZXImIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdFR5cGUmICkKKyAgICB7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdFR5cGU+CisgICAgRGlhZ29uYWxQcmVjb25kaXRpb25lciYgZmFjdG9yaXplKGNvbnN0IE1hdFR5cGUmIG1hdCkKKyAgICB7CisgICAgICBtX2ludmRpYWcucmVzaXplKG1hdC5jb2xzKCkpOworICAgICAgZm9yKGludCBqPTA7IGo8bWF0Lm91dGVyU2l6ZSgpOyArK2opCisgICAgICB7CisgICAgICAgIHR5cGVuYW1lIE1hdFR5cGU6OklubmVySXRlcmF0b3IgaXQobWF0LGopOworICAgICAgICB3aGlsZShpdCAmJiBpdC5pbmRleCgpIT1qKSArK2l0OworICAgICAgICBpZihpdCAmJiBpdC5pbmRleCgpPT1qKQorICAgICAgICAgIG1faW52ZGlhZyhqKSA9IFNjYWxhcigxKS9pdC52YWx1ZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgbV9pbnZkaWFnKGopID0gMDsKKyAgICAgIH0KKyAgICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdFR5cGU+CisgICAgRGlhZ29uYWxQcmVjb25kaXRpb25lciYgY29tcHV0ZShjb25zdCBNYXRUeXBlJiBtYXQpCisgICAgeworICAgICAgcmV0dXJuIGZhY3Rvcml6ZShtYXQpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdD4KKyAgICB2b2lkIF9zb2x2ZShjb25zdCBSaHMmIGIsIERlc3QmIHgpIGNvbnN0CisgICAgeworICAgICAgeCA9IG1faW52ZGlhZy5hcnJheSgpICogYi5hcnJheSgpIDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+IGlubGluZSBjb25zdCBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPERpYWdvbmFsUHJlY29uZGl0aW9uZXIsIFJocz4KKyAgICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGlhZ29uYWxQcmVjb25kaXRpb25lciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9pbnZkaWFnLnNpemUoKT09Yi5yb3dzKCkKKyAgICAgICAgICAgICAgICAmJiAiRGlhZ29uYWxQcmVjb25kaXRpb25lcjo6c29sdmUoKTogaW52YWxpZCBudW1iZXIgb2Ygcm93cyBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCBiIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxEaWFnb25hbFByZWNvbmRpdGlvbmVyLCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBWZWN0b3IgbV9pbnZkaWFnOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBzb2x2ZV9yZXR2YWw8RGlhZ29uYWxQcmVjb25kaXRpb25lcjxfTWF0cml4VHlwZT4sIFJocz4KKyAgOiBzb2x2ZV9yZXR2YWxfYmFzZTxEaWFnb25hbFByZWNvbmRpdGlvbmVyPF9NYXRyaXhUeXBlPiwgUmhzPgoreworICB0eXBlZGVmIERpYWdvbmFsUHJlY29uZGl0aW9uZXI8X01hdHJpeFR5cGU+IERlYzsKKyAgRUlHRU5fTUFLRV9TT0xWRV9IRUxQRVJTKERlYyxSaHMpCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgZGVjKCkuX3NvbHZlKHJocygpLGRzdCk7CisgIH0KK307CisKK30KKworLyoqIFxpbmdyb3VwIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlCisgICogXGJyaWVmIEEgbmFpdmUgcHJlY29uZGl0aW9uZXIgd2hpY2ggYXBwcm94aW1hdGVzIGFueSBtYXRyaXggYXMgdGhlIGlkZW50aXR5IG1hdHJpeAorICAqCisgICogXHNhIGNsYXNzIERpYWdvbmFsUHJlY29uZGl0aW9uZXIKKyAgKi8KK2NsYXNzIElkZW50aXR5UHJlY29uZGl0aW9uZXIKK3sKKyAgcHVibGljOgorCisgICAgSWRlbnRpdHlQcmVjb25kaXRpb25lcigpIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIElkZW50aXR5UHJlY29uZGl0aW9uZXIoY29uc3QgTWF0cml4VHlwZSYgKSB7fQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgSWRlbnRpdHlQcmVjb25kaXRpb25lciYgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgKSB7IHJldHVybiAqdGhpczsgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgSWRlbnRpdHlQcmVjb25kaXRpb25lciYgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmICkgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgSWRlbnRpdHlQcmVjb25kaXRpb25lciYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiApIHsgcmV0dXJuICp0aGlzOyB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBSaHMmIHNvbHZlKGNvbnN0IFJocyYgYikgY29uc3QgeyByZXR1cm4gYjsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9CQVNJQ19QUkVDT05ESVRJT05FUlNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvQmlDR1NUQUIuaCBiL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0JpQ0dTVEFCLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MzQxYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0JpQ0dTVEFCLmgKQEAgLTAsMCArMSwyNTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CSUNHU1RBQl9ICisjZGVmaW5lIEVJR0VOX0JJQ0dTVEFCX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwgTG93LWxldmVsIGJpIGNvbmp1Z2F0ZSBncmFkaWVudCBzdGFiaWxpemVkIGFsZ29yaXRobQorICAqIFxwYXJhbSBtYXQgVGhlIG1hdHJpeCBBCisgICogXHBhcmFtIHJocyBUaGUgcmlnaHQgaGFuZCBzaWRlIHZlY3RvciBiCisgICogXHBhcmFtIHggT24gaW5wdXQgYW5kIGluaXRpYWwgc29sdXRpb24sIG9uIG91dHB1dCB0aGUgY29tcHV0ZWQgc29sdXRpb24uCisgICogXHBhcmFtIHByZWNvbmQgQSBwcmVjb25kaXRpb25lciBiZWluZyBhYmxlIHRvIGVmZmljaWVudGx5IHNvbHZlIGZvciBhbgorICAqICAgICAgICAgICAgICAgIGFwcHJveGltYXRpb24gb2YgQXg9YiAocmVnYXJkbGVzcyBvZiBiKQorICAqIFxwYXJhbSBpdGVycyBPbiBpbnB1dCB0aGUgbWF4IG51bWJlciBvZiBpdGVyYXRpb24sIG9uIG91dHB1dCB0aGUgbnVtYmVyIG9mIHBlcmZvcm1lZCBpdGVyYXRpb25zLgorICAqIFxwYXJhbSB0b2xfZXJyb3IgT24gaW5wdXQgdGhlIHRvbGVyYW5jZSBlcnJvciwgb24gb3V0cHV0IGFuIGVzdGltYXRpb24gb2YgdGhlIHJlbGF0aXZlIGVycm9yLgorICAqIFxyZXR1cm4gZmFsc2UgaW4gdGhlIGNhc2Ugb2YgbnVtZXJpY2FsIGlzc3VlLCBmb3IgZXhhbXBsZSBhIGJyZWFrIGRvd24gb2YgQmlDR1NUQUIuIAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBQcmVjb25kaXRpb25lcj4KK2Jvb2wgYmljZ3N0YWIoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBjb25zdCBSaHMmIHJocywgRGVzdCYgeCwKKyAgICAgICAgICAgICAgY29uc3QgUHJlY29uZGl0aW9uZXImIHByZWNvbmQsIGludCYgaXRlcnMsCisgICAgICAgICAgICAgIHR5cGVuYW1lIERlc3Q6OlJlYWxTY2FsYXImIHRvbF9lcnJvcikKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgUmVhbFNjYWxhciB0b2wgPSB0b2xfZXJyb3I7CisgIGludCBtYXhJdGVycyA9IGl0ZXJzOworCisgIGludCBuID0gbWF0LmNvbHMoKTsKKyAgVmVjdG9yVHlwZSByICA9IHJocyAtIG1hdCAqIHg7CisgIFZlY3RvclR5cGUgcjAgPSByOworICAKKyAgUmVhbFNjYWxhciByMF9zcW5vcm0gPSByMC5zcXVhcmVkTm9ybSgpOworICBTY2FsYXIgcmhvICAgID0gMTsKKyAgU2NhbGFyIGFscGhhICA9IDE7CisgIFNjYWxhciB3ICAgICAgPSAxOworICAKKyAgVmVjdG9yVHlwZSB2ID0gVmVjdG9yVHlwZTo6WmVybyhuKSwgcCA9IFZlY3RvclR5cGU6Olplcm8obik7CisgIFZlY3RvclR5cGUgeShuKSwgIHoobik7CisgIFZlY3RvclR5cGUga3QobiksIGtzKG4pOworCisgIFZlY3RvclR5cGUgcyhuKSwgdChuKTsKKworICBSZWFsU2NhbGFyIHRvbDIgPSB0b2wqdG9sOworICBpbnQgaSA9IDA7CisKKyAgd2hpbGUgKCByLnNxdWFyZWROb3JtKCkvcjBfc3Fub3JtID4gdG9sMiAmJiBpPG1heEl0ZXJzICkKKyAgeworICAgIFNjYWxhciByaG9fb2xkID0gcmhvOworCisgICAgcmhvID0gcjAuZG90KHIpOworICAgIGlmIChyaG8gPT0gU2NhbGFyKDApKSByZXR1cm4gZmFsc2U7IC8qIE5ldyBzZWFyY2ggZGlyZWN0aW9ucyBjYW5ub3QgYmUgZm91bmQgKi8KKyAgICBTY2FsYXIgYmV0YSA9IChyaG8vcmhvX29sZCkgKiAoYWxwaGEgLyB3KTsKKyAgICBwID0gciArIGJldGEgKiAocCAtIHcgKiB2KTsKKyAgICAKKyAgICB5ID0gcHJlY29uZC5zb2x2ZShwKTsKKyAgICAKKyAgICB2Lm5vYWxpYXMoKSA9IG1hdCAqIHk7CisKKyAgICBhbHBoYSA9IHJobyAvIHIwLmRvdCh2KTsKKyAgICBzID0gciAtIGFscGhhICogdjsKKworICAgIHogPSBwcmVjb25kLnNvbHZlKHMpOworICAgIHQubm9hbGlhcygpID0gbWF0ICogejsKKworICAgIHcgPSB0LmRvdChzKSAvIHQuc3F1YXJlZE5vcm0oKTsKKyAgICB4ICs9IGFscGhhICogeSArIHcgKiB6OworICAgIHIgPSBzIC0gdyAqIHQ7CisgICAgKytpOworICB9CisgIHRvbF9lcnJvciA9IHNxcnQoci5zcXVhcmVkTm9ybSgpL3IwX3Nxbm9ybSk7CisgIGl0ZXJzID0gaTsKKyAgcmV0dXJuIHRydWU7IAorfQorCit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwKKyAgICAgICAgICB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXIgPSBEaWFnb25hbFByZWNvbmRpdGlvbmVyPHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTY2FsYXI+ID4KK2NsYXNzIEJpQ0dTVEFCOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KK3N0cnVjdCB0cmFpdHM8QmlDR1NUQUI8X01hdHJpeFR5cGUsX1ByZWNvbmRpdGlvbmVyPiA+Cit7CisgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBfUHJlY29uZGl0aW9uZXIgUHJlY29uZGl0aW9uZXI7Cit9OworCit9CisKKy8qKiBcaW5ncm91cCBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzX01vZHVsZQorICAqIFxicmllZiBBIGJpIGNvbmp1Z2F0ZSBncmFkaWVudCBzdGFiaWxpemVkIHNvbHZlciBmb3Igc3BhcnNlIHNxdWFyZSBwcm9ibGVtcworICAqCisgICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gc29sdmUgZm9yIEEueCA9IGIgc3BhcnNlIGxpbmVhciBwcm9ibGVtcyB1c2luZyBhIGJpIGNvbmp1Z2F0ZSBncmFkaWVudAorICAqIHN0YWJpbGl6ZWQgYWxnb3JpdGhtLiBUaGUgdmVjdG9ycyB4IGFuZCBiIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBjYW4gYmUgYSBkZW5zZSBvciBhIHNwYXJzZSBtYXRyaXguCisgICogXHRwYXJhbSBfUHJlY29uZGl0aW9uZXIgdGhlIHR5cGUgb2YgdGhlIHByZWNvbmRpdGlvbmVyLiBEZWZhdWx0IGlzIERpYWdvbmFsUHJlY29uZGl0aW9uZXIKKyAgKgorICAqIFRoZSBtYXhpbWFsIG51bWJlciBvZiBpdGVyYXRpb25zIGFuZCB0b2xlcmFuY2UgdmFsdWUgY2FuIGJlIGNvbnRyb2xsZWQgdmlhIHRoZSBzZXRNYXhJdGVyYXRpb25zKCkKKyAgKiBhbmQgc2V0VG9sZXJhbmNlKCkgbWV0aG9kcy4gVGhlIGRlZmF1bHRzIGFyZSB0aGUgc2l6ZSBvZiB0aGUgcHJvYmxlbSBmb3IgdGhlIG1heGltYWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKyAgKiBhbmQgTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSBmb3IgdGhlIHRvbGVyYW5jZS4KKyAgKiAKKyAgKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGFzIHRoZSBkaXJlY3Qgc29sdmVyIGNsYXNzZXMuIEhlcmUgaXMgYSB0eXBpY2FsIHVzYWdlIGV4YW1wbGU6CisgICogXGNvZGUKKyAgKiBpbnQgbiA9IDEwMDAwOworICAqIFZlY3RvclhkIHgobiksIGIobik7CisgICogU3BhcnNlTWF0cml4PGRvdWJsZT4gQShuLG4pOworICAqIC8vIGZpbGwgQSBhbmQgYgorICAqIEJpQ0dTVEFCPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc29sdmVyOworICAqIHNvbHZlcihBKTsKKyAgKiB4ID0gc29sdmVyLnNvbHZlKGIpOworICAqIHN0ZDo6Y291dCA8PCAiI2l0ZXJhdGlvbnM6ICAgICAiIDw8IHNvbHZlci5pdGVyYXRpb25zKCkgPDwgc3RkOjplbmRsOworICAqIHN0ZDo6Y291dCA8PCAiZXN0aW1hdGVkIGVycm9yOiAiIDw8IHNvbHZlci5lcnJvcigpICAgICAgPDwgc3RkOjplbmRsOworICAqIC8vIHVwZGF0ZSBiLCBhbmQgc29sdmUgYWdhaW4KKyAgKiB4ID0gc29sdmVyLnNvbHZlKGIpOworICAqIFxlbmRjb2RlCisgICogCisgICogQnkgZGVmYXVsdCB0aGUgaXRlcmF0aW9ucyBzdGFydCB3aXRoIHg9MCBhcyBhbiBpbml0aWFsIGd1ZXNzIG9mIHRoZSBzb2x1dGlvbi4KKyAgKiBPbmUgY2FuIGNvbnRyb2wgdGhlIHN0YXJ0IHVzaW5nIHRoZSBzb2x2ZVdpdGhHdWVzcygpIG1ldGhvZC4gSGVyZSBpcyBhIHN0ZXAgYnkKKyAgKiBzdGVwIGV4ZWN1dGlvbiBleGFtcGxlIHN0YXJ0aW5nIHdpdGggYSByYW5kb20gZ3Vlc3MgYW5kIHByaW50aW5nIHRoZSBldm9sdXRpb24KKyAgKiBvZiB0aGUgZXN0aW1hdGVkIGVycm9yOgorICAqICogXGNvZGUKKyAgKiB4ID0gVmVjdG9yWGQ6OlJhbmRvbShuKTsKKyAgKiBzb2x2ZXIuc2V0TWF4SXRlcmF0aW9ucygxKTsKKyAgKiBpbnQgaSA9IDA7CisgICogZG8geworICAqICAgeCA9IHNvbHZlci5zb2x2ZVdpdGhHdWVzcyhiLHgpOworICAqICAgc3RkOjpjb3V0IDw8IGkgPDwgIiA6ICIgPDwgc29sdmVyLmVycm9yKCkgPDwgc3RkOjplbmRsOworICAqICAgKytpOworICAqIH0gd2hpbGUgKHNvbHZlci5pbmZvKCkhPVN1Y2Nlc3MgJiYgaTwxMDApOworICAqIFxlbmRjb2RlCisgICogTm90ZSB0aGF0IHN1Y2ggYSBzdGVwIGJ5IHN0ZXAgZXhjdXRpb24gaXMgc2xpZ2h0bHkgc2xvd2VyLgorICAqIAorICAqIFxzYSBjbGFzcyBTaW1wbGljaWFsQ2hvbGVza3ksIERpYWdvbmFsUHJlY29uZGl0aW9uZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXIKKyAgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgX1ByZWNvbmRpdGlvbmVyPgorY2xhc3MgQmlDR1NUQUIgOiBwdWJsaWMgSXRlcmF0aXZlU29sdmVyQmFzZTxCaUNHU1RBQjxfTWF0cml4VHlwZSxfUHJlY29uZGl0aW9uZXI+ID4KK3sKKyAgdHlwZWRlZiBJdGVyYXRpdmVTb2x2ZXJCYXNlPEJpQ0dTVEFCPiBCYXNlOworICB1c2luZyBCYXNlOjptcF9tYXRyaXg7CisgIHVzaW5nIEJhc2U6Om1fZXJyb3I7CisgIHVzaW5nIEJhc2U6Om1faXRlcmF0aW9uczsKKyAgdXNpbmcgQmFzZTo6bV9pbmZvOworICB1c2luZyBCYXNlOjptX2lzSW5pdGlhbGl6ZWQ7CitwdWJsaWM6CisgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBfUHJlY29uZGl0aW9uZXIgUHJlY29uZGl0aW9uZXI7CisKK3B1YmxpYzoKKworICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KKyAgQmlDR1NUQUIoKSA6IEJhc2UoKSB7fQorCisgIC8qKiBJbml0aWFsaXplIHRoZSBzb2x2ZXIgd2l0aCBtYXRyaXggXGEgQSBmb3IgZnVydGhlciBcYyBBeD1iIHNvbHZpbmcuCisgICAgKiAKKyAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgYSBzaG9ydGN1dCBmb3IgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9sbG93ZWQKKyAgICAqIGJ5IGEgY2FsbCB0byBjb21wdXRlKCkuCisgICAgKiAKKyAgICAqIFx3YXJuaW5nIHRoaXMgY2xhc3Mgc3RvcmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggQSBhcyB3ZWxsIGFzIHNvbWUKKyAgICAqIHByZWNvbXB1dGVkIHZhbHVlcyB0aGF0IGRlcGVuZCBvbiBpdC4gVGhlcmVmb3JlLCBpZiBcYSBBIGlzIGNoYW5nZWQKKyAgICAqIHRoaXMgY2xhc3MgYmVjb21lcyBpbnZhbGlkLiBDYWxsIGNvbXB1dGUoKSB0byB1cGRhdGUgaXQgd2l0aCB0aGUgbmV3CisgICAgKiBtYXRyaXggQSwgb3IgbW9kaWZ5IGEgY29weSBvZiBBLgorICAgICovCisgIEJpQ0dTVEFCKGNvbnN0IE1hdHJpeFR5cGUmIEEpIDogQmFzZShBKSB7fQorCisgIH5CaUNHU1RBQigpIHt9CisgIAorICAvKiogXHJldHVybnMgdGhlIHNvbHV0aW9uIHggb2YgXGYkIEEgeCA9IGIgXGYkIHVzaW5nIHRoZSBjdXJyZW50IGRlY29tcG9zaXRpb24gb2YgQQorICAgICogXGEgeDAgYXMgYW4gaW5pdGlhbCBzb2x1dGlvbi4KKyAgICAqCisgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIEd1ZXNzPgorICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnNvbHZlX3JldHZhbF93aXRoX2d1ZXNzPEJpQ0dTVEFCLCBSaHMsIEd1ZXNzPgorICBzb2x2ZVdpdGhHdWVzcyhjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIsIGNvbnN0IEd1ZXNzJiB4MCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkJpQ0dTVEFCIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICBlaWdlbl9hc3NlcnQoQmFzZTo6cm93cygpPT1iLnJvd3MoKQorICAgICAgICAgICAgICAmJiAiQmlDR1NUQUI6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgIHJldHVybiBpbnRlcm5hbDo6c29sdmVfcmV0dmFsX3dpdGhfZ3Vlc3MKKyAgICAgICAgICAgIDxCaUNHU1RBQiwgUmhzLCBHdWVzcz4oKnRoaXMsIGIuZGVyaXZlZCgpLCB4MCk7CisgIH0KKyAgCisgIC8qKiBcaW50ZXJuYWwgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgIHZvaWQgX3NvbHZlV2l0aEd1ZXNzKGNvbnN0IFJocyYgYiwgRGVzdCYgeCkgY29uc3QKKyAgeyAgICAKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGZvcihpbnQgaj0wOyBqPGIuY29scygpOyArK2opCisgICAgeworICAgICAgbV9pdGVyYXRpb25zID0gQmFzZTo6bWF4SXRlcmF0aW9ucygpOworICAgICAgbV9lcnJvciA9IEJhc2U6Om1fdG9sZXJhbmNlOworICAgICAgCisgICAgICB0eXBlbmFtZSBEZXN0OjpDb2xYcHIgeGooeCxqKTsKKyAgICAgIGlmKCFpbnRlcm5hbDo6YmljZ3N0YWIoKm1wX21hdHJpeCwgYi5jb2woaiksIHhqLCBCYXNlOjptX3ByZWNvbmRpdGlvbmVyLCBtX2l0ZXJhdGlvbnMsIG1fZXJyb3IpKQorICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgIH0KKyAgICBtX2luZm8gPSBmYWlsZWQgPyBOdW1lcmljYWxJc3N1ZQorICAgICAgICAgICA6IG1fZXJyb3IgPD0gQmFzZTo6bV90b2xlcmFuY2UgPyBTdWNjZXNzCisgICAgICAgICAgIDogTm9Db252ZXJnZW5jZTsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICB9CisKKyAgLyoqIFxpbnRlcm5hbCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KKyAgdm9pZCBfc29sdmUoY29uc3QgUmhzJiBiLCBEZXN0JiB4KSBjb25zdAorICB7CisgICAgeC5zZXRaZXJvKCk7CisgICAgX3NvbHZlV2l0aEd1ZXNzKGIseCk7CisgIH0KKworcHJvdGVjdGVkOgorCit9OworCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lciwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNvbHZlX3JldHZhbDxCaUNHU1RBQjxfTWF0cml4VHlwZSwgX1ByZWNvbmRpdGlvbmVyPiwgUmhzPgorICA6IHNvbHZlX3JldHZhbF9iYXNlPEJpQ0dTVEFCPF9NYXRyaXhUeXBlLCBfUHJlY29uZGl0aW9uZXI+LCBSaHM+Cit7CisgIHR5cGVkZWYgQmlDR1NUQUI8X01hdHJpeFR5cGUsIF9QcmVjb25kaXRpb25lcj4gRGVjOworICBFSUdFTl9NQUtFX1NPTFZFX0hFTFBFUlMoRGVjLFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBkZWMoKS5fc29sdmUocmhzKCksZHN0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQklDR1NUQUJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNjYzAwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fSXRlcmF0aXZlTGluZWFyU29sdmVyc19TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fSXRlcmF0aXZlTGluZWFyU29sdmVyc19TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9Db25qdWdhdGVHcmFkaWVudC5oIGIvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvQ29uanVnYXRlR3JhZGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRmMjUzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvQ29uanVnYXRlR3JhZGllbnQuaApAQCAtMCwwICsxLDI1MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NPTkpVR0FURV9HUkFESUVOVF9ICisjZGVmaW5lIEVJR0VOX0NPTkpVR0FURV9HUkFESUVOVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGludGVybmFsIExvdy1sZXZlbCBjb25qdWdhdGUgZ3JhZGllbnQgYWxnb3JpdGhtCisgICogXHBhcmFtIG1hdCBUaGUgbWF0cml4IEEKKyAgKiBccGFyYW0gcmhzIFRoZSByaWdodCBoYW5kIHNpZGUgdmVjdG9yIGIKKyAgKiBccGFyYW0geCBPbiBpbnB1dCBhbmQgaW5pdGlhbCBzb2x1dGlvbiwgb24gb3V0cHV0IHRoZSBjb21wdXRlZCBzb2x1dGlvbi4KKyAgKiBccGFyYW0gcHJlY29uZCBBIHByZWNvbmRpdGlvbmVyIGJlaW5nIGFibGUgdG8gZWZmaWNpZW50bHkgc29sdmUgZm9yIGFuCisgICogICAgICAgICAgICAgICAgYXBwcm94aW1hdGlvbiBvZiBBeD1iIChyZWdhcmRsZXNzIG9mIGIpCisgICogXHBhcmFtIGl0ZXJzIE9uIGlucHV0IHRoZSBtYXggbnVtYmVyIG9mIGl0ZXJhdGlvbiwgb24gb3V0cHV0IHRoZSBudW1iZXIgb2YgcGVyZm9ybWVkIGl0ZXJhdGlvbnMuCisgICogXHBhcmFtIHRvbF9lcnJvciBPbiBpbnB1dCB0aGUgdG9sZXJhbmNlIGVycm9yLCBvbiBvdXRwdXQgYW4gZXN0aW1hdGlvbiBvZiB0aGUgcmVsYXRpdmUgZXJyb3IuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3QsIHR5cGVuYW1lIFByZWNvbmRpdGlvbmVyPgorRUlHRU5fRE9OVF9JTkxJTkUKK3ZvaWQgY29uanVnYXRlX2dyYWRpZW50KGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgUmhzJiByaHMsIERlc3QmIHgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVjb25kaXRpb25lciYgcHJlY29uZCwgaW50JiBpdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIERlc3Q6OlJlYWxTY2FsYXImIHRvbF9lcnJvcikKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFiczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVzdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgCisgIFJlYWxTY2FsYXIgdG9sID0gdG9sX2Vycm9yOworICBpbnQgbWF4SXRlcnMgPSBpdGVyczsKKyAgCisgIGludCBuID0gbWF0LmNvbHMoKTsKKworICBWZWN0b3JUeXBlIHJlc2lkdWFsID0gcmhzIC0gbWF0ICogeDsgLy9pbml0aWFsIHJlc2lkdWFsCisgIFZlY3RvclR5cGUgcChuKTsKKworICBwID0gcHJlY29uZC5zb2x2ZShyZXNpZHVhbCk7ICAgICAgLy9pbml0aWFsIHNlYXJjaCBkaXJlY3Rpb24KKworICBWZWN0b3JUeXBlIHoobiksIHRtcChuKTsKKyAgUmVhbFNjYWxhciBhYnNOZXcgPSBpbnRlcm5hbDo6cmVhbChyZXNpZHVhbC5kb3QocCkpOyAgLy8gdGhlIHNxdWFyZSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgciBzY2FsZWQgYnkgaW52TQorICBSZWFsU2NhbGFyIHJoc05vcm0yID0gcmhzLnNxdWFyZWROb3JtKCk7CisgIFJlYWxTY2FsYXIgcmVzaWR1YWxOb3JtMiA9IDA7CisgIFJlYWxTY2FsYXIgdGhyZXNob2xkID0gdG9sKnRvbCpyaHNOb3JtMjsKKyAgaW50IGkgPSAwOworICB3aGlsZShpIDwgbWF4SXRlcnMpCisgIHsKKyAgICB0bXAubm9hbGlhcygpID0gbWF0ICogcDsgICAgICAgICAgICAgIC8vIHRoZSBib3R0bGVuZWNrIG9mIHRoZSBhbGdvcml0aG0KKworICAgIFNjYWxhciBhbHBoYSA9IGFic05ldyAvIHAuZG90KHRtcCk7ICAgLy8gdGhlIGFtb3VudCB3ZSB0cmF2ZWwgb24gZGlyCisgICAgeCArPSBhbHBoYSAqIHA7ICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgc29sdXRpb24KKyAgICByZXNpZHVhbCAtPSBhbHBoYSAqIHRtcDsgICAgICAgICAgICAgIC8vIHVwZGF0ZSByZXNpZHVlCisgICAgCisgICAgcmVzaWR1YWxOb3JtMiA9IHJlc2lkdWFsLnNxdWFyZWROb3JtKCk7CisgICAgaWYocmVzaWR1YWxOb3JtMiA8IHRocmVzaG9sZCkKKyAgICAgIGJyZWFrOworICAgIAorICAgIHogPSBwcmVjb25kLnNvbHZlKHJlc2lkdWFsKTsgICAgICAgICAgLy8gYXBwcm94aW1hdGVseSBzb2x2ZSBmb3IgIkEgeiA9IHJlc2lkdWFsIgorCisgICAgUmVhbFNjYWxhciBhYnNPbGQgPSBhYnNOZXc7CisgICAgYWJzTmV3ID0gaW50ZXJuYWw6OnJlYWwocmVzaWR1YWwuZG90KHopKTsgICAgIC8vIHVwZGF0ZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgcgorICAgIFJlYWxTY2FsYXIgYmV0YSA9IGFic05ldyAvIGFic09sZDsgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIEdyYW0tU2NobWlkdCB2YWx1ZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbmV3IHNlYXJjaCBkaXJlY3Rpb24KKyAgICBwID0geiArIGJldGEgKiBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHNlYXJjaCBkaXJlY3Rpb24KKyAgICBpKys7CisgIH0KKyAgdG9sX2Vycm9yID0gc3FydChyZXNpZHVhbE5vcm0yIC8gcmhzTm9ybTIpOworICBpdGVycyA9IGk7Cit9CisKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG89TG93ZXIsCisgICAgICAgICAgdHlwZW5hbWUgX1ByZWNvbmRpdGlvbmVyID0gRGlhZ29uYWxQcmVjb25kaXRpb25lcjx0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyPiA+CitjbGFzcyBDb25qdWdhdGVHcmFkaWVudDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8sIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lcj4KK3N0cnVjdCB0cmFpdHM8Q29uanVnYXRlR3JhZGllbnQ8X01hdHJpeFR5cGUsX1VwTG8sX1ByZWNvbmRpdGlvbmVyPiA+Cit7CisgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBfUHJlY29uZGl0aW9uZXIgUHJlY29uZGl0aW9uZXI7Cit9OworCit9CisKKy8qKiBcaW5ncm91cCBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzX01vZHVsZQorICAqIFxicmllZiBBIGNvbmp1Z2F0ZSBncmFkaWVudCBzb2x2ZXIgZm9yIHNwYXJzZSBzZWxmLWFkam9pbnQgcHJvYmxlbXMKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLnggPSBiIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdXNpbmcgYSBjb25qdWdhdGUgZ3JhZGllbnQgYWxnb3JpdGhtLgorICAqIFRoZSBzcGFyc2UgbWF0cml4IEEgbXVzdCBiZSBzZWxmYWRqb2ludC4gVGhlIHZlY3RvcnMgeCBhbmQgYiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgY2FuIGJlIGEgZGVuc2Ugb3IgYSBzcGFyc2UgbWF0cml4LgorICAqIFx0cGFyYW0gX1VwTG8gdGhlIHRyaWFuZ3VsYXIgcGFydCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGNvbXB1dGF0aW9ucy4gSXQgY2FuIGJlIExvd2VyCisgICogICAgICAgICAgICAgICBvciBVcHBlci4gRGVmYXVsdCBpcyBMb3dlci4KKyAgKiBcdHBhcmFtIF9QcmVjb25kaXRpb25lciB0aGUgdHlwZSBvZiB0aGUgcHJlY29uZGl0aW9uZXIuIERlZmF1bHQgaXMgRGlhZ29uYWxQcmVjb25kaXRpb25lcgorICAqCisgICogVGhlIG1heGltYWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYW5kIHRvbGVyYW5jZSB2YWx1ZSBjYW4gYmUgY29udHJvbGxlZCB2aWEgdGhlIHNldE1heEl0ZXJhdGlvbnMoKQorICAqIGFuZCBzZXRUb2xlcmFuY2UoKSBtZXRob2RzLiBUaGUgZGVmYXVsdHMgYXJlIHRoZSBzaXplIG9mIHRoZSBwcm9ibGVtIGZvciB0aGUgbWF4aW1hbCBudW1iZXIgb2YgaXRlcmF0aW9ucworICAqIGFuZCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpIGZvciB0aGUgdG9sZXJhbmNlLgorICAqIAorICAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYXMgdGhlIGRpcmVjdCBzb2x2ZXIgY2xhc3Nlcy4gSGVyZSBpcyBhIHR5cGljYWwgdXNhZ2UgZXhhbXBsZToKKyAgKiBcY29kZQorICAqIGludCBuID0gMTAwMDA7CisgICogVmVjdG9yWGQgeChuKSwgYihuKTsKKyAgKiBTcGFyc2VNYXRyaXg8ZG91YmxlPiBBKG4sbik7CisgICogLy8gZmlsbCBBIGFuZCBiCisgICogQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4PGRvdWJsZT4gPiBjZzsKKyAgKiBjZy5jb21wdXRlKEEpOworICAqIHggPSBjZy5zb2x2ZShiKTsKKyAgKiBzdGQ6OmNvdXQgPDwgIiNpdGVyYXRpb25zOiAgICAgIiA8PCBjZy5pdGVyYXRpb25zKCkgPDwgc3RkOjplbmRsOworICAqIHN0ZDo6Y291dCA8PCAiZXN0aW1hdGVkIGVycm9yOiAiIDw8IGNnLmVycm9yKCkgICAgICA8PCBzdGQ6OmVuZGw7CisgICogLy8gdXBkYXRlIGIsIGFuZCBzb2x2ZSBhZ2FpbgorICAqIHggPSBjZy5zb2x2ZShiKTsKKyAgKiBcZW5kY29kZQorICAqIAorICAqIEJ5IGRlZmF1bHQgdGhlIGl0ZXJhdGlvbnMgc3RhcnQgd2l0aCB4PTAgYXMgYW4gaW5pdGlhbCBndWVzcyBvZiB0aGUgc29sdXRpb24uCisgICogT25lIGNhbiBjb250cm9sIHRoZSBzdGFydCB1c2luZyB0aGUgc29sdmVXaXRoR3Vlc3MoKSBtZXRob2QuIEhlcmUgaXMgYSBzdGVwIGJ5CisgICogc3RlcCBleGVjdXRpb24gZXhhbXBsZSBzdGFydGluZyB3aXRoIGEgcmFuZG9tIGd1ZXNzIGFuZCBwcmludGluZyB0aGUgZXZvbHV0aW9uCisgICogb2YgdGhlIGVzdGltYXRlZCBlcnJvcjoKKyAgKiAqIFxjb2RlCisgICogeCA9IFZlY3RvclhkOjpSYW5kb20obik7CisgICogY2cuc2V0TWF4SXRlcmF0aW9ucygxKTsKKyAgKiBpbnQgaSA9IDA7CisgICogZG8geworICAqICAgeCA9IGNnLnNvbHZlV2l0aEd1ZXNzKGIseCk7CisgICogICBzdGQ6OmNvdXQgPDwgaSA8PCAiIDogIiA8PCBjZy5lcnJvcigpIDw8IHN0ZDo6ZW5kbDsKKyAgKiAgICsraTsKKyAgKiB9IHdoaWxlIChjZy5pbmZvKCkhPVN1Y2Nlc3MgJiYgaTwxMDApOworICAqIFxlbmRjb2RlCisgICogTm90ZSB0aGF0IHN1Y2ggYSBzdGVwIGJ5IHN0ZXAgZXhjdXRpb24gaXMgc2xpZ2h0bHkgc2xvd2VyLgorICAqIAorICAqIFxzYSBjbGFzcyBTaW1wbGljaWFsQ2hvbGVza3ksIERpYWdvbmFsUHJlY29uZGl0aW9uZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXIKKyAgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+CitjbGFzcyBDb25qdWdhdGVHcmFkaWVudCA6IHB1YmxpYyBJdGVyYXRpdmVTb2x2ZXJCYXNlPENvbmp1Z2F0ZUdyYWRpZW50PF9NYXRyaXhUeXBlLF9VcExvLF9QcmVjb25kaXRpb25lcj4gPgoreworICB0eXBlZGVmIEl0ZXJhdGl2ZVNvbHZlckJhc2U8Q29uanVnYXRlR3JhZGllbnQ+IEJhc2U7CisgIHVzaW5nIEJhc2U6Om1wX21hdHJpeDsKKyAgdXNpbmcgQmFzZTo6bV9lcnJvcjsKKyAgdXNpbmcgQmFzZTo6bV9pdGVyYXRpb25zOworICB1c2luZyBCYXNlOjptX2luZm87CisgIHVzaW5nIEJhc2U6Om1faXNJbml0aWFsaXplZDsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIF9QcmVjb25kaXRpb25lciBQcmVjb25kaXRpb25lcjsKKworICBlbnVtIHsKKyAgICBVcExvID0gX1VwTG8KKyAgfTsKKworcHVibGljOgorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLworICBDb25qdWdhdGVHcmFkaWVudCgpIDogQmFzZSgpIHt9CisKKyAgLyoqIEluaXRpYWxpemUgdGhlIHNvbHZlciB3aXRoIG1hdHJpeCBcYSBBIGZvciBmdXJ0aGVyIFxjIEF4PWIgc29sdmluZy4KKyAgICAqIAorICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBhIHNob3J0Y3V0IGZvciB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb2xsb3dlZAorICAgICogYnkgYSBjYWxsIHRvIGNvbXB1dGUoKS4KKyAgICAqIAorICAgICogXHdhcm5pbmcgdGhpcyBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBBIGFzIHdlbGwgYXMgc29tZQorICAgICogcHJlY29tcHV0ZWQgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIGl0LiBUaGVyZWZvcmUsIGlmIFxhIEEgaXMgY2hhbmdlZAorICAgICogdGhpcyBjbGFzcyBiZWNvbWVzIGludmFsaWQuIENhbGwgY29tcHV0ZSgpIHRvIHVwZGF0ZSBpdCB3aXRoIHRoZSBuZXcKKyAgICAqIG1hdHJpeCBBLCBvciBtb2RpZnkgYSBjb3B5IG9mIEEuCisgICAgKi8KKyAgQ29uanVnYXRlR3JhZGllbnQoY29uc3QgTWF0cml4VHlwZSYgQSkgOiBCYXNlKEEpIHt9CisKKyAgfkNvbmp1Z2F0ZUdyYWRpZW50KCkge30KKyAgCisgIC8qKiBccmV0dXJucyB0aGUgc29sdXRpb24geCBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbiBvZiBBCisgICAgKiBcYSB4MCBhcyBhbiBpbml0aWFsIHNvbHV0aW9uLgorICAgICoKKyAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgR3Vlc3M+CisgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6c29sdmVfcmV0dmFsX3dpdGhfZ3Vlc3M8Q29uanVnYXRlR3JhZGllbnQsIFJocywgR3Vlc3M+CisgIHNvbHZlV2l0aEd1ZXNzKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYiwgY29uc3QgR3Vlc3MmIHgwKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29uanVnYXRlR3JhZGllbnQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgIGVpZ2VuX2Fzc2VydChCYXNlOjpyb3dzKCk9PWIucm93cygpCisgICAgICAgICAgICAgICYmICJDb25qdWdhdGVHcmFkaWVudDo6c29sdmUoKTogaW52YWxpZCBudW1iZXIgb2Ygcm93cyBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCBiIik7CisgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWxfd2l0aF9ndWVzcworICAgICAgICAgICAgPENvbmp1Z2F0ZUdyYWRpZW50LCBSaHMsIEd1ZXNzPigqdGhpcywgYi5kZXJpdmVkKCksIHgwKTsKKyAgfQorCisgIC8qKiBcaW50ZXJuYWwgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgIHZvaWQgX3NvbHZlV2l0aEd1ZXNzKGNvbnN0IFJocyYgYiwgRGVzdCYgeCkgY29uc3QKKyAgeworICAgIG1faXRlcmF0aW9ucyA9IEJhc2U6Om1heEl0ZXJhdGlvbnMoKTsKKyAgICBtX2Vycm9yID0gQmFzZTo6bV90b2xlcmFuY2U7CisKKyAgICBmb3IoaW50IGo9MDsgajxiLmNvbHMoKTsgKytqKQorICAgIHsKKyAgICAgIG1faXRlcmF0aW9ucyA9IEJhc2U6Om1heEl0ZXJhdGlvbnMoKTsKKyAgICAgIG1fZXJyb3IgPSBCYXNlOjptX3RvbGVyYW5jZTsKKworICAgICAgdHlwZW5hbWUgRGVzdDo6Q29sWHByIHhqKHgsaik7CisgICAgICBpbnRlcm5hbDo6Y29uanVnYXRlX2dyYWRpZW50KG1wX21hdHJpeC0+dGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCksIGIuY29sKGopLCB4aiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTo6bV9wcmVjb25kaXRpb25lciwgbV9pdGVyYXRpb25zLCBtX2Vycm9yKTsKKyAgICB9CisKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIG1faW5mbyA9IG1fZXJyb3IgPD0gQmFzZTo6bV90b2xlcmFuY2UgPyBTdWNjZXNzIDogTm9Db252ZXJnZW5jZTsKKyAgfQorICAKKyAgLyoqIFxpbnRlcm5hbCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KKyAgdm9pZCBfc29sdmUoY29uc3QgUmhzJiBiLCBEZXN0JiB4KSBjb25zdAorICB7CisgICAgeC5zZXRPbmVzKCk7CisgICAgX3NvbHZlV2l0aEd1ZXNzKGIseCk7CisgIH0KKworcHJvdGVjdGVkOgorCit9OworCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8sIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lciwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNvbHZlX3JldHZhbDxDb25qdWdhdGVHcmFkaWVudDxfTWF0cml4VHlwZSxfVXBMbyxfUHJlY29uZGl0aW9uZXI+LCBSaHM+CisgIDogc29sdmVfcmV0dmFsX2Jhc2U8Q29uanVnYXRlR3JhZGllbnQ8X01hdHJpeFR5cGUsX1VwTG8sX1ByZWNvbmRpdGlvbmVyPiwgUmhzPgoreworICB0eXBlZGVmIENvbmp1Z2F0ZUdyYWRpZW50PF9NYXRyaXhUeXBlLF9VcExvLF9QcmVjb25kaXRpb25lcj4gRGVjOworICBFSUdFTl9NQUtFX1NPTFZFX0hFTFBFUlMoRGVjLFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBkZWMoKS5fc29sdmUocmhzKCksZHN0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09OSlVHQVRFX0dSQURJRU5UX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0luY29tcGxldGVMVVQuaCBiL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0luY29tcGxldGVMVVQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQzMDRmCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnMvSW5jb21wbGV0ZUxVVC5oCkBAIC0wLDAgKzEsNDY2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fSU5DT01QTEVURV9MVVRfSAorI2RlZmluZSBFSUdFTl9JTkNPTVBMRVRFX0xVVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKioKKyAqIFxicmllZiBJbmNvbXBsZXRlIExVIGZhY3Rvcml6YXRpb24gd2l0aCBkdWFsLXRocmVzaG9sZCBzdHJhdGVneQorICogRHVyaW5nIHRoZSBudW1lcmljYWwgZmFjdG9yaXphdGlvbiwgdHdvIGRyb3BwaW5nIHJ1bGVzIGFyZSB1c2VkIDoKKyAqICAxKSBhbnkgZWxlbWVudCB3aG9zZSBtYWduaXR1ZGUgaXMgbGVzcyB0aGFuIHNvbWUgdG9sZXJhbmNlIGlzIGRyb3BwZWQuCisgKiAgICBUaGlzIHRvbGVyYW5jZSBpcyBvYnRhaW5lZCBieSBtdWx0aXBseWluZyB0aGUgaW5wdXQgdG9sZXJhbmNlIEBwIGRyb3B0b2wgCisgKiAgICBieSB0aGUgYXZlcmFnZSBtYWduaXR1ZGUgb2YgYWxsIHRoZSBvcmlnaW5hbCBlbGVtZW50cyBpbiB0aGUgY3VycmVudCByb3cuCisgKiAgMikgQWZ0ZXIgdGhlIGVsaW1pbmF0aW9uIG9mIHRoZSByb3csIG9ubHkgdGhlIEBwIGZpbGwgbGFyZ2VzdCBlbGVtZW50cyBpbiAKKyAqICAgIHRoZSBMIHBhcnQgYW5kIHRoZSBAcCBmaWxsIGxhcmdlc3QgZWxlbWVudHMgaW4gdGhlIFUgcGFydCBhcmUga2VwdCAKKyAqICAgIChpbiBhZGRpdGlvbiB0byB0aGUgZGlhZ29uYWwgZWxlbWVudCApLiBOb3RlIHRoYXQgQHAgZmlsbCBpcyBjb21wdXRlZCBmcm9tIAorICogICAgdGhlIGlucHV0IHBhcmFtZXRlciBAcCBmaWxsZmFjdG9yIHdoaWNoIGlzIHVzZWQgdGhlIHJhdGlvIHRvIGNvbnRyb2wgdGhlIGZpbGxfaW4gCisgKiAgICByZWxhdGl2ZWx5IHRvIHRoZSBpbml0aWFsIG51bWJlciBvZiBub256ZXJvIGVsZW1lbnRzLgorICogCisgKiBUaGUgdHdvIGV4dHJlbWUgY2FzZXMgYXJlIHdoZW4gQHAgZHJvcHRvbD0wICh0byBrZWVwIGFsbCB0aGUgQHAgZmlsbCoyIGxhcmdlc3QgZWxlbWVudHMpCisgKiBhbmQgd2hlbiBAcCBmaWxsPW4vMiB3aXRoIEBwIGRyb3B0b2wgYmVpbmcgZGlmZmVyZW50IHRvIHplcm8uIAorICogCisgKiBSZWZlcmVuY2VzIDogWW91c2VmIFNhYWQsIElMVVQ6IEEgZHVhbCB0aHJlc2hvbGQgaW5jb21wbGV0ZSBMVSBmYWN0b3JpemF0aW9uLCAKKyAqICAgICAgICAgICAgICBOdW1lcmljYWwgTGluZWFyIEFsZ2VicmEgd2l0aCBBcHBsaWNhdGlvbnMsIDEoNCksIHBwIDM4Ny00MDIsIDE5OTQuCisgKiAKKyAqIE5PVEUgOiBUaGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgSUxVVCBpbXBsZW1lbnRhdGlvbgorICogaW4gdGhlIFNQQVJTS0lUIHBhY2thZ2UsIENvcHlyaWdodCAoQykgMjAwNSwgdGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWlubmVzb3RhIAorICogIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEw6IAorICogICAgaHR0cDovL3d3dy11c2Vycy5jcy51bW4uZWR1L35zYWFkL3NvZnR3YXJlL1NQQVJTS0lUL1JFQURNRQorICogSG93ZXZlciwgWW91c2VmIFNhYWQgZ2F2ZSB1cyBwZXJtaXNzaW9uIHRvIHJlbGljZW5zZSBoaXMgSUxVVCBjb2RlIHRvIE1QTDIuCisgKiBTZWUgdGhlIEVpZ2VuIG1haWxpbmcgbGlzdCBhcmNoaXZlLCB0aHJlYWQ6IElMVVQsIGRhdGU6IEp1bHkgOCwgMjAxMjoKKyAqICAgaHR0cDovL2xpc3RlbmdpbmUudHV4ZmFtaWx5Lm9yZy9saXN0cy50dXhmYW1pbHkub3JnL2VpZ2VuLzIwMTIvMDcvbXNnMDAwNjQuaHRtbAorICogYWx0ZXJuYXRpdmVseSwgb24gR01BTkU6CisgKiAgIGh0dHA6Ly9jb21tZW50cy5nbWFuZS5vcmcvZ21hbmUuY29tcC5saWIuZWlnZW4vMzMwMgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhcj4KK2NsYXNzIEluY29tcGxldGVMVVQgOiBpbnRlcm5hbDo6bm9uY29weWFibGUKK3sKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3I7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLFJvd01ham9yPiBGYWN0b3JUeXBlOworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcj4gUGVybXV0VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZhY3RvclR5cGU6OkluZGV4IEluZGV4OworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhUeXBlOworICAgIAorICAgIEluY29tcGxldGVMVVQoKQorICAgICAgOiBtX2Ryb3B0b2woTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSwgbV9maWxsZmFjdG9yKDEwKSwKKyAgICAgICAgbV9hbmFseXNpc0lzT2soZmFsc2UpLCBtX2ZhY3Rvcml6YXRpb25Jc09rKGZhbHNlKSwgbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHt9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBJbmNvbXBsZXRlTFVUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgUmVhbFNjYWxhciBkcm9wdG9sPU51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSwgaW50IGZpbGxmYWN0b3IgPSAxMCkKKyAgICAgIDogbV9kcm9wdG9sKGRyb3B0b2wpLG1fZmlsbGZhY3RvcihmaWxsZmFjdG9yKSwKKyAgICAgICAgbV9hbmFseXNpc0lzT2soZmFsc2UpLG1fZmFjdG9yaXphdGlvbklzT2soZmFsc2UpLG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoZmlsbGZhY3RvciAhPSAwKTsKKyAgICAgIGNvbXB1dGUobWF0KTsgCisgICAgfQorICAgIAorICAgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2x1LnJvd3MoKTsgfQorICAgIAorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2x1LmNvbHMoKTsgfQorCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeC5hcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSW5jb21wbGV0ZUxVVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgYW1hdCk7CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICB2b2lkIGZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBhbWF0KTsKKyAgICAKKyAgICAvKioKKyAgICAgICogQ29tcHV0ZSBhbiBpbmNvbXBsZXRlIExVIGZhY3Rvcml6YXRpb24gd2l0aCBkdWFsIHRocmVzaG9sZCBvbiB0aGUgbWF0cml4IG1hdAorICAgICAgKiBObyBwaXZvdGluZyBpcyBkb25lIGluIHRoaXMgdmVyc2lvbgorICAgICAgKiAKKyAgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgSW5jb21wbGV0ZUxVVDxTY2FsYXI+JiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIGFtYXQpCisgICAgeworICAgICAgYW5hbHl6ZVBhdHRlcm4oYW1hdCk7IAorICAgICAgZmFjdG9yaXplKGFtYXQpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgPT0gdHJ1ZSk7IAorICAgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkIHNldERyb3B0b2woUmVhbFNjYWxhciBkcm9wdG9sKTsgCisgICAgdm9pZCBzZXRGaWxsZmFjdG9yKGludCBmaWxsZmFjdG9yKTsgCisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlKGNvbnN0IFJocyYgYiwgRGVzdCYgeCkgY29uc3QKKyAgICB7CisgICAgICB4ID0gbV9QaW52ICogYjsgIAorICAgICAgeCA9IG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnNvbHZlKHgpOworICAgICAgeCA9IG1fbHUudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUoeCk7CisgICAgICB4ID0gbV9QICogeDsgCisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPiBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxJbmNvbXBsZXRlTFVULCBSaHM+CisgICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJJbmNvbXBsZXRlTFVUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChjb2xzKCk9PWIucm93cygpCisgICAgICAgICAgICAgICAgJiYgIkluY29tcGxldGVMVVQ6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8SW5jb21wbGV0ZUxVVCwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclYsIHR5cGVuYW1lIFZlY3Rvckk+CisgICAgaW50IFF1aWNrU3BsaXQoVmVjdG9yViAmcm93LCBWZWN0b3JJICZpbmQsIGludCBuY3V0KTsKKworCisgICAgLyoqIGtlZXBzIG9mZi1kaWFnb25hbCBlbnRyaWVzOyBkcm9wcyBkaWFnb25hbCBlbnRyaWVzICovCisgICAgc3RydWN0IGtlZXBfZGlhZyB7CisgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpIChjb25zdCBJbmRleCYgcm93LCBjb25zdCBJbmRleCYgY29sLCBjb25zdCBTY2FsYXImKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gcm93IT1jb2w7CisgICAgICB9CisgICAgfTsKKworcHJvdGVjdGVkOgorCisgICAgRmFjdG9yVHlwZSBtX2x1OworICAgIFJlYWxTY2FsYXIgbV9kcm9wdG9sOworICAgIGludCBtX2ZpbGxmYWN0b3I7CisgICAgYm9vbCBtX2FuYWx5c2lzSXNPazsKKyAgICBib29sIG1fZmFjdG9yaXphdGlvbklzT2s7CisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQ7CisgICAgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsSW5kZXg+IG1fUDsgICAgIC8vIEZpbGwtcmVkdWNpbmcgcGVybXV0YXRpb24KKyAgICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsSW5kZXg+IG1fUGludjsgIC8vIEludmVyc2UgcGVybXV0YXRpb24KK307CisKKy8qKgorICogU2V0IGNvbnRyb2wgcGFyYW1ldGVyIGRyb3B0b2wKKyAqICBccGFyYW0gZHJvcHRvbCAgIERyb3AgYW55IGVsZW1lbnQgd2hvc2UgbWFnbml0dWRlIGlzIGxlc3MgdGhhbiB0aGlzIHRvbGVyYW5jZSAKKyAqKi8gCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIEluY29tcGxldGVMVVQ8U2NhbGFyPjo6c2V0RHJvcHRvbChSZWFsU2NhbGFyIGRyb3B0b2wpCit7CisgIHRoaXMtPm1fZHJvcHRvbCA9IGRyb3B0b2w7ICAgCit9CisKKy8qKgorICogU2V0IGNvbnRyb2wgcGFyYW1ldGVyIGZpbGxmYWN0b3IKKyAqIFxwYXJhbSBmaWxsZmFjdG9yICBUaGlzIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgIG51bWJlciBAcCBmaWxsX2luIG9mIGxhcmdlc3QgZWxlbWVudHMgdG8ga2VlcCBvbiBlYWNoIHJvdy4gCisgKiovIAordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBJbmNvbXBsZXRlTFVUPFNjYWxhcj46OnNldEZpbGxmYWN0b3IoaW50IGZpbGxmYWN0b3IpCit7CisgIHRoaXMtPm1fZmlsbGZhY3RvciA9IGZpbGxmYWN0b3I7ICAgCit9CisKKworLyoqCisgKiBDb21wdXRlIGEgcXVpY2stc29ydCBzcGxpdCBvZiBhIHZlY3RvciAKKyAqIE9uIG91dHB1dCwgdGhlIHZlY3RvciByb3cgaXMgcGVybXV0ZWQgc3VjaCB0aGF0IGl0cyBlbGVtZW50cyBzYXRpc2Z5CisgKiBhYnMocm93KGkpKSA+PSBhYnMocm93KG5jdXQpKSBpZiBpPG5jdXQKKyAqIGFicyhyb3coaSkpIDw9IGFicyhyb3cobmN1dCkpIGlmIGk+bmN1dCAKKyAqIFxwYXJhbSByb3cgVGhlIHZlY3RvciBvZiB2YWx1ZXMKKyAqIFxwYXJhbSBpbmQgVGhlIGFycmF5IG9mIGluZGV4IGZvciB0aGUgZWxlbWVudHMgaW4gQHAgcm93CisgKiBccGFyYW0gbmN1dCAgVGhlIG51bWJlciBvZiBsYXJnZXN0IGVsZW1lbnRzIHRvIGtlZXAKKyAqKi8gCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclYsIHR5cGVuYW1lIFZlY3Rvckk+CitpbnQgSW5jb21wbGV0ZUxVVDxTY2FsYXI+OjpRdWlja1NwbGl0KFZlY3RvclYgJnJvdywgVmVjdG9ySSAmaW5kLCBpbnQgbmN1dCkKK3sKKyAgdXNpbmcgc3RkOjpzd2FwOworICBpbnQgbWlkOworICBpbnQgbiA9IHJvdy5zaXplKCk7IC8qIGxlbmd0aCBvZiB0aGUgdmVjdG9yICovCisgIGludCBmaXJzdCwgbGFzdCA7IAorICAKKyAgbmN1dC0tOyAvKiB0byBmaXQgdGhlIHplcm8tYmFzZWQgaW5kaWNlcyAqLworICBmaXJzdCA9IDA7IAorICBsYXN0ID0gbi0xOyAKKyAgaWYgKG5jdXQgPCBmaXJzdCB8fCBuY3V0ID4gbGFzdCApIHJldHVybiAwOworICAKKyAgZG8geworICAgIG1pZCA9IGZpcnN0OyAKKyAgICBSZWFsU2NhbGFyIGFic2tleSA9IHN0ZDo6YWJzKHJvdyhtaWQpKTsgCisgICAgZm9yIChpbnQgaiA9IGZpcnN0ICsgMTsgaiA8PSBsYXN0OyBqKyspIHsKKyAgICAgIGlmICggc3RkOjphYnMocm93KGopKSA+IGFic2tleSkgeworICAgICAgICArK21pZDsKKyAgICAgICAgc3dhcChyb3cobWlkKSwgcm93KGopKTsKKyAgICAgICAgc3dhcChpbmQobWlkKSwgaW5kKGopKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogSW50ZXJjaGFuZ2UgZm9yIHRoZSBwaXZvdCBlbGVtZW50ICovCisgICAgc3dhcChyb3cobWlkKSwgcm93KGZpcnN0KSk7CisgICAgc3dhcChpbmQobWlkKSwgaW5kKGZpcnN0KSk7CisgICAgCisgICAgaWYgKG1pZCA+IG5jdXQpIGxhc3QgPSBtaWQgLSAxOworICAgIGVsc2UgaWYgKG1pZCA8IG5jdXQgKSBmaXJzdCA9IG1pZCArIDE7IAorICB9IHdoaWxlIChtaWQgIT0gbmN1dCApOworICAKKyAgcmV0dXJuIDA7IC8qIG1pZCBpcyBlcXVhbCB0byBuY3V0ICovIAorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+Cit2b2lkIEluY29tcGxldGVMVVQ8U2NhbGFyPjo6YW5hbHl6ZVBhdHRlcm4oY29uc3QgX01hdHJpeFR5cGUmIGFtYXQpCit7CisgIC8vIENvbXB1dGUgdGhlIEZpbGwtcmVkdWNpbmcgcGVybXV0YXRpb24KKyAgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvciwgSW5kZXg+IG1hdDEgPSBhbWF0OworICBTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yLCBJbmRleD4gbWF0MiA9IGFtYXQudHJhbnNwb3NlKCk7CisgIC8vIFN5bW1ldHJpemUgdGhlIHBhdHRlcm4KKyAgLy8gRklYTUUgZm9yIGEgbWF0cml4IHdpdGggbmVhcmx5IHN5bW1ldHJpYyBwYXR0ZXJuLCBtYXQyK21hdDEgaXMgdGhlIGFwcHJvcHJpYXRlIGNob2ljZS4KKyAgLy8gICAgICAgb24gdGhlIG90aGVyIGhhbmQgZm9yIGEgcmVhbGx5IG5vbi1zeW1tZXRyaWMgcGF0dGVybiwgbWF0MiptYXQxIHNob3VsZCBiZSBwcmVmZXJlZC4uLgorICBTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yLCBJbmRleD4gQXRBID0gbWF0MiArIG1hdDE7CisgIEF0QS5wcnVuZShrZWVwX2RpYWcoKSk7CisgIGludGVybmFsOjptaW5pbXVtX2RlZ3JlZV9vcmRlcmluZzxTY2FsYXIsIEluZGV4PihBdEEsIG1fUCk7ICAvLyBUaGVuIGNvbXB1dGUgdGhlIEFNRCBvcmRlcmluZy4uLgorCisgIG1fUGludiAgPSBtX1AuaW52ZXJzZSgpOyAvLyAuLi4gYW5kIHRoZSBpbnZlcnNlIHBlcm11dGF0aW9uCisKKyAgbV9hbmFseXNpc0lzT2sgPSB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+Cit2b2lkIEluY29tcGxldGVMVVQ8U2NhbGFyPjo6ZmFjdG9yaXplKGNvbnN0IF9NYXRyaXhUeXBlJiBhbWF0KQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgdXNpbmcgc3RkOjphYnM7CisKKyAgZWlnZW5fYXNzZXJ0KChhbWF0LnJvd3MoKSA9PSBhbWF0LmNvbHMoKSkgJiYgIlRoZSBmYWN0b3JpemF0aW9uIHNob3VsZCBiZSBkb25lIG9uIGEgc3F1YXJlIG1hdHJpeCIpOworICBpbnQgbiA9IGFtYXQuY29scygpOyAgLy8gU2l6ZSBvZiB0aGUgbWF0cml4CisgIG1fbHUucmVzaXplKG4sbik7CisgIC8vIERlY2xhcmUgV29ya2luZyB2ZWN0b3JzIGFuZCB2YXJpYWJsZXMKKyAgVmVjdG9yIHUobikgOyAgICAgLy8gcmVhbCB2YWx1ZXMgb2YgdGhlIHJvdyAtLSBtYXhpbXVtIHNpemUgaXMgbiAtLQorICBWZWN0b3JYaSBqdShuKTsgICAvLyBjb2x1bW4gcG9zaXRpb24gb2YgdGhlIHZhbHVlcyBpbiB1IC0tIG1heGltdW0gc2l6ZSAgaXMgbgorICBWZWN0b3JYaSBqcihuKTsgICAvLyBJbmRpY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIG5vbnplcm8gZWxlbWVudHMgaW4gdGhlIHZlY3RvciB1IC0tIEEgemVybyBsb2NhdGlvbiBpcyBpbmRpY2F0ZWQgYnkgLTEKKworICAvLyBBcHBseSB0aGUgZmlsbC1yZWR1Y2luZyBwZXJtdXRhdGlvbgorICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIllvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOworICBTcGFyc2VNYXRyaXg8U2NhbGFyLFJvd01ham9yLCBJbmRleD4gbWF0OworICBtYXQgPSBhbWF0LnR3aXN0ZWRCeShtX1BpbnYpOworCisgIC8vIEluaXRpYWxpemF0aW9uCisgIGpyLmZpbGwoLTEpOworICBqdS5maWxsKDApOworICB1LmZpbGwoMCk7CisKKyAgLy8gbnVtYmVyIG9mIGxhcmdlc3QgZWxlbWVudHMgdG8ga2VlcCBpbiBlYWNoIHJvdzoKKyAgaW50IGZpbGxfaW4gPSAgIHN0YXRpY19jYXN0PGludD4gKGFtYXQubm9uWmVyb3MoKSptX2ZpbGxmYWN0b3IpL24rMTsKKyAgaWYgKGZpbGxfaW4gPiBuKSBmaWxsX2luID0gbjsKKworICAvLyBudW1iZXIgb2YgbGFyZ2VzdCBub256ZXJvIGVsZW1lbnRzIHRvIGtlZXAgaW4gdGhlIEwgYW5kIHRoZSBVIHBhcnQgb2YgdGhlIGN1cnJlbnQgcm93OgorICBpbnQgbm56TCA9IGZpbGxfaW4vMjsKKyAgaW50IG5uelUgPSBubnpMOworICBtX2x1LnJlc2VydmUobiAqIChubnpMICsgbm56VSArIDEpKTsKKworICAvLyBnbG9iYWwgbG9vcCBvdmVyIHRoZSByb3dzIG9mIHRoZSBzcGFyc2UgbWF0cml4CisgIGZvciAoaW50IGlpID0gMDsgaWkgPCBuOyBpaSsrKQorICB7CisgICAgLy8gMSAtIGNvcHkgdGhlIGxvd2VyIGFuZCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcm93IGkgb2YgbWF0IGluIHRoZSB3b3JraW5nIHZlY3RvciB1CisKKyAgICBpbnQgc2l6ZXUgPSAxOyAvLyBudW1iZXIgb2Ygbm9uemVybyBlbGVtZW50cyBpbiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgY3VycmVudCByb3cKKyAgICBpbnQgc2l6ZWwgPSAwOyAvLyBudW1iZXIgb2Ygbm9uemVybyBlbGVtZW50cyBpbiB0aGUgbG93ZXIgcGFydCBvZiB0aGUgY3VycmVudCByb3cKKyAgICBqdShpaSkgICAgPSBpaTsKKyAgICB1KGlpKSAgICAgPSAwOworICAgIGpyKGlpKSAgICA9IGlpOworICAgIFJlYWxTY2FsYXIgcm93bm9ybSA9IDA7CisKKyAgICB0eXBlbmFtZSBGYWN0b3JUeXBlOjpJbm5lckl0ZXJhdG9yIGpfaXQobWF0LCBpaSk7IC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY3VycmVudCByb3cgaWkKKyAgICBmb3IgKDsgal9pdDsgKytqX2l0KQorICAgIHsKKyAgICAgIGludCBrID0gal9pdC5pbmRleCgpOworICAgICAgaWYgKGsgPCBpaSkKKyAgICAgIHsKKyAgICAgICAgLy8gY29weSB0aGUgbG93ZXIgcGFydAorICAgICAgICBqdShzaXplbCkgPSBrOworICAgICAgICB1KHNpemVsKSA9IGpfaXQudmFsdWUoKTsKKyAgICAgICAganIoaykgPSBzaXplbDsKKyAgICAgICAgKytzaXplbDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGsgPT0gaWkpCisgICAgICB7CisgICAgICAgIHUoaWkpID0gal9pdC52YWx1ZSgpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyBjb3B5IHRoZSB1cHBlciBwYXJ0CisgICAgICAgIGludCBqcG9zID0gaWkgKyBzaXpldTsKKyAgICAgICAganUoanBvcykgPSBrOworICAgICAgICB1KGpwb3MpID0gal9pdC52YWx1ZSgpOworICAgICAgICBqcihrKSA9IGpwb3M7CisgICAgICAgICsrc2l6ZXU7CisgICAgICB9CisgICAgICByb3dub3JtICs9IGludGVybmFsOjphYnMyKGpfaXQudmFsdWUoKSk7CisgICAgfQorCisgICAgLy8gMiAtIGRldGVjdCBwb3NzaWJsZSB6ZXJvIHJvdworICAgIGlmKHJvd25vcm09PTApCisgICAgeworICAgICAgbV9pbmZvID0gTnVtZXJpY2FsSXNzdWU7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFRha2UgdGhlIDItbm9ybSBvZiB0aGUgY3VycmVudCByb3cgYXMgYSByZWxhdGl2ZSB0b2xlcmFuY2UKKyAgICByb3dub3JtID0gc3FydChyb3dub3JtKTsKKworICAgIC8vIDMgLSBlbGltaW5hdGUgdGhlIHByZXZpb3VzIG5vbnplcm8gcm93cworICAgIGludCBqaiA9IDA7CisgICAgaW50IGxlbiA9IDA7CisgICAgd2hpbGUgKGpqIDwgc2l6ZWwpCisgICAgeworICAgICAgLy8gSW4gb3JkZXIgdG8gZWxpbWluYXRlIGluIHRoZSBjb3JyZWN0IG9yZGVyLAorICAgICAgLy8gd2UgbXVzdCBzZWxlY3QgZmlyc3QgdGhlIHNtYWxsZXN0IGNvbHVtbiBpbmRleCBhbW9uZyAganUoamo6c2l6ZWwpCisgICAgICBpbnQgazsKKyAgICAgIGludCBtaW5yb3cgPSBqdS5zZWdtZW50KGpqLHNpemVsLWpqKS5taW5Db2VmZigmayk7IC8vIGsgaXMgcmVsYXRpdmUgdG8gdGhlIHNlZ21lbnQKKyAgICAgIGsgKz0gamo7CisgICAgICBpZiAobWlucm93ICE9IGp1KGpqKSkKKyAgICAgIHsKKyAgICAgICAgLy8gc3dhcCB0aGUgdHdvIGxvY2F0aW9ucworICAgICAgICBpbnQgaiA9IGp1KGpqKTsKKyAgICAgICAgc3dhcChqdShqaiksIGp1KGspKTsKKyAgICAgICAganIobWlucm93KSA9IGpqOyAgIGpyKGopID0gazsKKyAgICAgICAgc3dhcCh1KGpqKSwgdShrKSk7CisgICAgICB9CisgICAgICAvLyBSZXNldCB0aGlzIGxvY2F0aW9uCisgICAgICBqcihtaW5yb3cpID0gLTE7CisKKyAgICAgIC8vIFN0YXJ0IGVsaW1pbmF0aW9uCisgICAgICB0eXBlbmFtZSBGYWN0b3JUeXBlOjpJbm5lckl0ZXJhdG9yIGtpX2l0KG1fbHUsIG1pbnJvdyk7CisgICAgICB3aGlsZSAoa2lfaXQgJiYga2lfaXQuaW5kZXgoKSA8IG1pbnJvdykgKytraV9pdDsKKyAgICAgIGVpZ2VuX2ludGVybmFsX2Fzc2VydChraV9pdCAmJiBraV9pdC5jb2woKT09bWlucm93KTsKKyAgICAgIFNjYWxhciBmYWN0ID0gdShqaikgLyBraV9pdC52YWx1ZSgpOworCisgICAgICAvLyBkcm9wIHRvbyBzbWFsbCBlbGVtZW50cworICAgICAgaWYoYWJzKGZhY3QpIDw9IG1fZHJvcHRvbCkKKyAgICAgIHsKKyAgICAgICAgamorKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIGxpbmVhciBjb21iaW5hdGlvbiBvZiB0aGUgY3VycmVudCByb3cgaWkgYW5kIHRoZSByb3cgbWlucm93CisgICAgICArK2tpX2l0OworICAgICAgZm9yICg7IGtpX2l0OyArK2tpX2l0KQorICAgICAgeworICAgICAgICBTY2FsYXIgcHJvZCA9IGZhY3QgKiBraV9pdC52YWx1ZSgpOworICAgICAgICBpbnQgaiAgICAgICA9IGtpX2l0LmluZGV4KCk7CisgICAgICAgIGludCBqcG9zICAgID0ganIoaik7CisgICAgICAgIGlmIChqcG9zID09IC0xKSAvLyBmaWxsLWluIGVsZW1lbnQKKyAgICAgICAgeworICAgICAgICAgIGludCBuZXdwb3M7CisgICAgICAgICAgaWYgKGogPj0gaWkpIC8vIGRlYWxpbmcgd2l0aCB0aGUgdXBwZXIgcGFydAorICAgICAgICAgIHsKKyAgICAgICAgICAgIG5ld3BvcyA9IGlpICsgc2l6ZXU7CisgICAgICAgICAgICBzaXpldSsrOworICAgICAgICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHNpemV1PD1uKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSAvLyBkZWFsaW5nIHdpdGggdGhlIGxvd2VyIHBhcnQKKyAgICAgICAgICB7CisgICAgICAgICAgICBuZXdwb3MgPSBzaXplbDsKKyAgICAgICAgICAgIHNpemVsKys7CisgICAgICAgICAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoc2l6ZWw8PWlpKTsKKyAgICAgICAgICB9CisgICAgICAgICAganUobmV3cG9zKSA9IGo7CisgICAgICAgICAgdShuZXdwb3MpID0gLXByb2Q7CisgICAgICAgICAganIoaikgPSBuZXdwb3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHUoanBvcykgLT0gcHJvZDsKKyAgICAgIH0KKyAgICAgIC8vIHN0b3JlIHRoZSBwaXZvdCBlbGVtZW50CisgICAgICB1KGxlbikgPSBmYWN0OworICAgICAganUobGVuKSA9IG1pbnJvdzsKKyAgICAgICsrbGVuOworCisgICAgICBqaisrOworICAgIH0gLy8gZW5kIG9mIHRoZSBlbGltaW5hdGlvbiBvbiB0aGUgcm93IGlpCisKKyAgICAvLyByZXNldCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcG9pbnRlciBqciB0byB6ZXJvCisgICAgZm9yKGludCBrID0gMDsgayA8c2l6ZXU7IGsrKykganIoanUoaWkraykpID0gLTE7CisKKyAgICAvLyA0IC0gcGFydGlhbGx5IHNvcnQgYW5kIGluc2VydCB0aGUgZWxlbWVudHMgaW4gdGhlIG1fbHUgbWF0cml4CisKKyAgICAvLyBzb3J0IHRoZSBMLXBhcnQgb2YgdGhlIHJvdworICAgIHNpemVsID0gbGVuOworICAgIGxlbiA9IChzdGQ6Om1pbikoc2l6ZWwsIG5uekwpOworICAgIHR5cGVuYW1lIFZlY3Rvcjo6U2VnbWVudFJldHVyblR5cGUgdWwodS5zZWdtZW50KDAsIHNpemVsKSk7CisgICAgdHlwZW5hbWUgVmVjdG9yWGk6OlNlZ21lbnRSZXR1cm5UeXBlIGp1bChqdS5zZWdtZW50KDAsIHNpemVsKSk7CisgICAgUXVpY2tTcGxpdCh1bCwganVsLCBsZW4pOworCisgICAgLy8gc3RvcmUgdGhlIGxhcmdlc3QgbV9maWxsIGVsZW1lbnRzIG9mIHRoZSBMIHBhcnQKKyAgICBtX2x1LnN0YXJ0VmVjKGlpKTsKKyAgICBmb3IoaW50IGsgPSAwOyBrIDwgbGVuOyBrKyspCisgICAgICBtX2x1Lmluc2VydEJhY2tCeU91dGVySW5uZXJVbm9yZGVyZWQoaWksanUoaykpID0gdShrKTsKKworICAgIC8vIHN0b3JlIHRoZSBkaWFnb25hbCBlbGVtZW50CisgICAgLy8gYXBwbHkgYSBzaGlmdGluZyBydWxlIHRvIGF2b2lkIHplcm8gcGl2b3RzICh3ZSBhcmUgZG9pbmcgYW4gaW5jb21wbGV0ZSBmYWN0b3JpemF0aW9uKQorICAgIGlmICh1KGlpKSA9PSBTY2FsYXIoMCkpCisgICAgICB1KGlpKSA9IHNxcnQobV9kcm9wdG9sKSAqIHJvd25vcm07CisgICAgbV9sdS5pbnNlcnRCYWNrQnlPdXRlcklubmVyVW5vcmRlcmVkKGlpLCBpaSkgPSB1KGlpKTsKKworICAgIC8vIHNvcnQgdGhlIFUtcGFydCBvZiB0aGUgcm93CisgICAgLy8gYXBwbHkgdGhlIGRyb3BwaW5nIHJ1bGUgZmlyc3QKKyAgICBsZW4gPSAwOworICAgIGZvcihpbnQgayA9IDE7IGsgPCBzaXpldTsgaysrKQorICAgIHsKKyAgICAgIGlmKGFicyh1KGlpK2spKSA+IG1fZHJvcHRvbCAqIHJvd25vcm0gKQorICAgICAgeworICAgICAgICArK2xlbjsKKyAgICAgICAgdShpaSArIGxlbikgID0gdShpaSArIGspOworICAgICAgICBqdShpaSArIGxlbikgPSBqdShpaSArIGspOworICAgICAgfQorICAgIH0KKyAgICBzaXpldSA9IGxlbiArIDE7IC8vICsxIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBkaWFnb25hbCBlbGVtZW50CisgICAgbGVuID0gKHN0ZDo6bWluKShzaXpldSwgbm56VSk7CisgICAgdHlwZW5hbWUgVmVjdG9yOjpTZWdtZW50UmV0dXJuVHlwZSB1dSh1LnNlZ21lbnQoaWkrMSwgc2l6ZXUtMSkpOworICAgIHR5cGVuYW1lIFZlY3RvclhpOjpTZWdtZW50UmV0dXJuVHlwZSBqdXUoanUuc2VnbWVudChpaSsxLCBzaXpldS0xKSk7CisgICAgUXVpY2tTcGxpdCh1dSwganV1LCBsZW4pOworCisgICAgLy8gc3RvcmUgdGhlIGxhcmdlc3QgZWxlbWVudHMgb2YgdGhlIFUgcGFydAorICAgIGZvcihpbnQgayA9IGlpICsgMTsgayA8IGlpICsgbGVuOyBrKyspCisgICAgICBtX2x1Lmluc2VydEJhY2tCeU91dGVySW5uZXJVbm9yZGVyZWQoaWksanUoaykpID0gdShrKTsKKyAgfQorCisgIG1fbHUuZmluYWxpemUoKTsKKyAgbV9sdS5tYWtlQ29tcHJlc3NlZCgpOworCisgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworICBtX2luZm8gPSBTdWNjZXNzOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNvbHZlX3JldHZhbDxJbmNvbXBsZXRlTFVUPF9NYXRyaXhUeXBlPiwgUmhzPgorICA6IHNvbHZlX3JldHZhbF9iYXNlPEluY29tcGxldGVMVVQ8X01hdHJpeFR5cGU+LCBSaHM+Cit7CisgIHR5cGVkZWYgSW5jb21wbGV0ZUxVVDxfTWF0cml4VHlwZT4gRGVjOworICBFSUdFTl9NQUtFX1NPTFZFX0hFTFBFUlMoRGVjLFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBkZWMoKS5fc29sdmUocmhzKCksZHN0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSU5DT01QTEVURV9MVVRfSAorCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9JdGVyYXRpdmVTb2x2ZXJCYXNlLmggYi9FaWdlbi9zcmMvSXRlcmF0aXZlTGluZWFyU29sdmVycy9JdGVyYXRpdmVTb2x2ZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3MDZjZQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzL0l0ZXJhdGl2ZVNvbHZlckJhc2UuaApAQCAtMCwwICsxLDI1NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0lURVJBVElWRV9TT0xWRVJfQkFTRV9ICisjZGVmaW5lIEVJR0VOX0lURVJBVElWRV9TT0xWRVJfQkFTRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgSXRlcmF0aXZlTGluZWFyU29sdmVyc19Nb2R1bGUKKyAgKiBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgbGluZWFyIGl0ZXJhdGl2ZSBzb2x2ZXJzCisgICoKKyAgKiBcc2EgY2xhc3MgU2ltcGxpY2lhbENob2xlc2t5LCBEaWFnb25hbFByZWNvbmRpdGlvbmVyLCBJZGVudGl0eVByZWNvbmRpdGlvbmVyCisgICovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIEl0ZXJhdGl2ZVNvbHZlckJhc2UgOiBpbnRlcm5hbDo6bm9uY29weWFibGUKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6UHJlY29uZGl0aW9uZXIgUHJlY29uZGl0aW9uZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisKK3B1YmxpYzoKKworICBEZXJpdmVkJiBkZXJpdmVkKCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKTsgfQorICBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsgfQorCisgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLworICBJdGVyYXRpdmVTb2x2ZXJCYXNlKCkKKyAgICA6IG1wX21hdHJpeCgwKQorICB7CisgICAgaW5pdCgpOworICB9CisKKyAgLyoqIEluaXRpYWxpemUgdGhlIHNvbHZlciB3aXRoIG1hdHJpeCBcYSBBIGZvciBmdXJ0aGVyIFxjIEF4PWIgc29sdmluZy4KKyAgICAqIAorICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBhIHNob3J0Y3V0IGZvciB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb2xsb3dlZAorICAgICogYnkgYSBjYWxsIHRvIGNvbXB1dGUoKS4KKyAgICAqIAorICAgICogXHdhcm5pbmcgdGhpcyBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCBBIGFzIHdlbGwgYXMgc29tZQorICAgICogcHJlY29tcHV0ZWQgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIGl0LiBUaGVyZWZvcmUsIGlmIFxhIEEgaXMgY2hhbmdlZAorICAgICogdGhpcyBjbGFzcyBiZWNvbWVzIGludmFsaWQuIENhbGwgY29tcHV0ZSgpIHRvIHVwZGF0ZSBpdCB3aXRoIHRoZSBuZXcKKyAgICAqIG1hdHJpeCBBLCBvciBtb2RpZnkgYSBjb3B5IG9mIEEuCisgICAgKi8KKyAgSXRlcmF0aXZlU29sdmVyQmFzZShjb25zdCBNYXRyaXhUeXBlJiBBKQorICB7CisgICAgaW5pdCgpOworICAgIGNvbXB1dGUoQSk7CisgIH0KKworICB+SXRlcmF0aXZlU29sdmVyQmFzZSgpIHt9CisgIAorICAvKiogSW5pdGlhbGl6ZXMgdGhlIGl0ZXJhdGl2ZSBzb2x2ZXIgZm9yIHRoZSBzcGFyY2l0eSBwYXR0ZXJuIG9mIHRoZSBtYXRyaXggXGEgQSBmb3IgZnVydGhlciBzb2x2aW5nIFxjIEF4PWIgcHJvYmxlbXMuCisgICAgKgorICAgICogQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIG1vc3RseSBjYWxsIGFuYWx5emVQYXR0ZXJuIG9uIHRoZSBwcmVjb25kaXRpb25lci4gSW4gdGhlIGZ1dHVyZQorICAgICogd2UgbWlnaHQsIGZvciBpbnN0YW5jZSwgaW1wbGVtZW50IGNvbHVtbiByZW9kZXJpbmcgZm9yIGZhc3RlciBtYXRyaXggdmVjdG9yIHByb2R1Y3RzLgorICAgICovCisgIERlcml2ZWQmIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdHJpeFR5cGUmIEEpCisgIHsKKyAgICBtX3ByZWNvbmRpdGlvbmVyLmFuYWx5emVQYXR0ZXJuKEEpOworICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgbV9hbmFseXNpc0lzT2sgPSB0cnVlOworICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgfQorICAKKyAgLyoqIEluaXRpYWxpemVzIHRoZSBpdGVyYXRpdmUgc29sdmVyIHdpdGggdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlIG1hdHJpeCBcYSBBIGZvciBmdXJ0aGVyIHNvbHZpbmcgXGMgQXg9YiBwcm9ibGVtcy4KKyAgICAqCisgICAgKiBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gbW9zdGx5IGNhbGwgZmFjdG9yaXplIG9uIHRoZSBwcmVjb25kaXRpb25lci4KKyAgICAqCisgICAgKiBcd2FybmluZyB0aGlzIGNsYXNzIHN0b3JlcyBhIHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IEEgYXMgd2VsbCBhcyBzb21lCisgICAgKiBwcmVjb21wdXRlZCB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gaXQuIFRoZXJlZm9yZSwgaWYgXGEgQSBpcyBjaGFuZ2VkCisgICAgKiB0aGlzIGNsYXNzIGJlY29tZXMgaW52YWxpZC4gQ2FsbCBjb21wdXRlKCkgdG8gdXBkYXRlIGl0IHdpdGggdGhlIG5ldworICAgICogbWF0cml4IEEsIG9yIG1vZGlmeSBhIGNvcHkgb2YgQS4KKyAgICAqLworICBEZXJpdmVkJiBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgQSkKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX2FuYWx5c2lzSXNPayAmJiAiWW91IG11c3QgZmlyc3QgY2FsbCBhbmFseXplUGF0dGVybigpIik7IAorICAgIG1wX21hdHJpeCA9ICZBOworICAgIG1fcHJlY29uZGl0aW9uZXIuZmFjdG9yaXplKEEpOworICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgfQorCisgIC8qKiBJbml0aWFsaXplcyB0aGUgaXRlcmF0aXZlIHNvbHZlciB3aXRoIHRoZSBtYXRyaXggXGEgQSBmb3IgZnVydGhlciBzb2x2aW5nIFxjIEF4PWIgcHJvYmxlbXMuCisgICAgKgorICAgICogQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIG1vc3RseSBpbml0aWFsaXplZC9jb21wdXRlIHRoZSBwcmVjb25kaXRpb25lci4gSW4gdGhlIGZ1dHVyZQorICAgICogd2UgbWlnaHQsIGZvciBpbnN0YW5jZSwgaW1wbGVtZW50IGNvbHVtbiByZW9kZXJpbmcgZm9yIGZhc3RlciBtYXRyaXggdmVjdG9yIHByb2R1Y3RzLgorICAgICoKKyAgICAqIFx3YXJuaW5nIHRoaXMgY2xhc3Mgc3RvcmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggQSBhcyB3ZWxsIGFzIHNvbWUKKyAgICAqIHByZWNvbXB1dGVkIHZhbHVlcyB0aGF0IGRlcGVuZCBvbiBpdC4gVGhlcmVmb3JlLCBpZiBcYSBBIGlzIGNoYW5nZWQKKyAgICAqIHRoaXMgY2xhc3MgYmVjb21lcyBpbnZhbGlkLiBDYWxsIGNvbXB1dGUoKSB0byB1cGRhdGUgaXQgd2l0aCB0aGUgbmV3CisgICAgKiBtYXRyaXggQSwgb3IgbW9kaWZ5IGEgY29weSBvZiBBLgorICAgICovCisgIERlcml2ZWQmIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgQSkKKyAgeworICAgIG1wX21hdHJpeCA9ICZBOworICAgIG1fcHJlY29uZGl0aW9uZXIuY29tcHV0ZShBKTsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gdHJ1ZTsKKyAgICBtX2luZm8gPSBTdWNjZXNzOworICAgIHJldHVybiBkZXJpdmVkKCk7CisgIH0KKworICAvKiogXGludGVybmFsICovCisgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtcF9tYXRyaXggPyBtcF9tYXRyaXgtPnJvd3MoKSA6IDA7IH0KKyAgLyoqIFxpbnRlcm5hbCAqLworICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbXBfbWF0cml4ID8gbXBfbWF0cml4LT5jb2xzKCkgOiAwOyB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSB0b2xlcmFuY2UgdGhyZXNob2xkIHVzZWQgYnkgdGhlIHN0b3BwaW5nIGNyaXRlcmlhICovCisgIFJlYWxTY2FsYXIgdG9sZXJhbmNlKCkgY29uc3QgeyByZXR1cm4gbV90b2xlcmFuY2U7IH0KKyAgCisgIC8qKiBTZXRzIHRoZSB0b2xlcmFuY2UgdGhyZXNob2xkIHVzZWQgYnkgdGhlIHN0b3BwaW5nIGNyaXRlcmlhICovCisgIERlcml2ZWQmIHNldFRvbGVyYW5jZShSZWFsU2NhbGFyIHRvbGVyYW5jZSkKKyAgeworICAgIG1fdG9sZXJhbmNlID0gdG9sZXJhbmNlOworICAgIHJldHVybiBkZXJpdmVkKCk7CisgIH0KKworICAvKiogXHJldHVybnMgYSByZWFkLXdyaXRlIHJlZmVyZW5jZSB0byB0aGUgcHJlY29uZGl0aW9uZXIgZm9yIGN1c3RvbSBjb25maWd1cmF0aW9uLiAqLworICBQcmVjb25kaXRpb25lciYgcHJlY29uZGl0aW9uZXIoKSB7IHJldHVybiBtX3ByZWNvbmRpdGlvbmVyOyB9CisgIAorICAvKiogXHJldHVybnMgYSByZWFkLW9ubHkgcmVmZXJlbmNlIHRvIHRoZSBwcmVjb25kaXRpb25lci4gKi8KKyAgY29uc3QgUHJlY29uZGl0aW9uZXImIHByZWNvbmRpdGlvbmVyKCkgY29uc3QgeyByZXR1cm4gbV9wcmVjb25kaXRpb25lcjsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgbWF4IG51bWJlciBvZiBpdGVyYXRpb25zICovCisgIGludCBtYXhJdGVyYXRpb25zKCkgY29uc3QKKyAgeworICAgIHJldHVybiAobXBfbWF0cml4ICYmIG1fbWF4SXRlcmF0aW9uczwwKSA/IG1wX21hdHJpeC0+Y29scygpIDogbV9tYXhJdGVyYXRpb25zOworICB9CisgIAorICAvKiogU2V0cyB0aGUgbWF4IG51bWJlciBvZiBpdGVyYXRpb25zICovCisgIERlcml2ZWQmIHNldE1heEl0ZXJhdGlvbnMoaW50IG1heEl0ZXJzKQorICB7CisgICAgbV9tYXhJdGVyYXRpb25zID0gbWF4SXRlcnM7CisgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgcGVyZm9ybWVkIGR1cmluZyB0aGUgbGFzdCBzb2x2ZSAqLworICBpbnQgaXRlcmF0aW9ucygpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb25qdWdhdGVHcmFkaWVudCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgcmV0dXJuIG1faXRlcmF0aW9uczsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgdG9sZXJhbmNlIGVycm9yIHJlYWNoZWQgZHVyaW5nIHRoZSBsYXN0IHNvbHZlICovCisgIFJlYWxTY2FsYXIgZXJyb3IoKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29uanVnYXRlR3JhZGllbnQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgIHJldHVybiBtX2Vycm9yOworICB9CisKKyAgLyoqIFxyZXR1cm5zIHRoZSBzb2x1dGlvbiB4IG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgKgorICAgICogXHNhIGNvbXB1dGUoKQorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4gaW5saW5lIGNvbnN0IGludGVybmFsOjpzb2x2ZV9yZXR2YWw8RGVyaXZlZCwgUmhzPgorICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJJdGVyYXRpdmVTb2x2ZXJCYXNlIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICBlaWdlbl9hc3NlcnQocm93cygpPT1iLnJvd3MoKQorICAgICAgICAgICAgICAmJiAiSXRlcmF0aXZlU29sdmVyQmFzZTo6c29sdmUoKTogaW52YWxpZCBudW1iZXIgb2Ygcm93cyBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCBiIik7CisgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8RGVyaXZlZCwgUmhzPihkZXJpdmVkKCksIGIuZGVyaXZlZCgpKTsKKyAgfQorICAKKyAgLyoqIFxyZXR1cm5zIHRoZSBzb2x1dGlvbiB4IG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgKgorICAgICogXHNhIGNvbXB1dGUoKQorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgaW5saW5lIGNvbnN0IGludGVybmFsOjpzcGFyc2Vfc29sdmVfcmV0dmFsPEl0ZXJhdGl2ZVNvbHZlckJhc2UsIFJocz4KKyAgc29sdmUoY29uc3QgU3BhcnNlTWF0cml4QmFzZTxSaHM+JiBiKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSXRlcmF0aXZlU29sdmVyQmFzZSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgZWlnZW5fYXNzZXJ0KHJvd3MoKT09Yi5yb3dzKCkKKyAgICAgICAgICAgICAgJiYgIkl0ZXJhdGl2ZVNvbHZlckJhc2U6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgIHJldHVybiBpbnRlcm5hbDo6c3BhcnNlX3NvbHZlX3JldHZhbDxJdGVyYXRpdmVTb2x2ZXJCYXNlLCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgIH0KKworICAvKiogXHJldHVybnMgU3VjY2VzcyBpZiB0aGUgaXRlcmF0aW9ucyBjb252ZXJnZWQsIGFuZCBOb0NvbnZlcmdlbmNlIG90aGVyd2lzZS4gKi8KKyAgQ29tcHV0YXRpb25JbmZvIGluZm8oKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSXRlcmF0aXZlU29sdmVyQmFzZSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgcmV0dXJuIG1faW5mbzsKKyAgfQorICAKKyAgLyoqIFxpbnRlcm5hbCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3RTY2FsYXIsIGludCBEZXN0T3B0aW9ucywgdHlwZW5hbWUgRGVzdEluZGV4PgorICB2b2lkIF9zb2x2ZV9zcGFyc2UoY29uc3QgUmhzJiBiLCBTcGFyc2VNYXRyaXg8RGVzdFNjYWxhcixEZXN0T3B0aW9ucyxEZXN0SW5kZXg+ICZkZXN0KSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KHJvd3MoKT09Yi5yb3dzKCkpOworICAgIAorICAgIGludCByaHNDb2xzID0gYi5jb2xzKCk7CisgICAgaW50IHNpemUgPSBiLnJvd3MoKTsKKyAgICBFaWdlbjo6TWF0cml4PERlc3RTY2FsYXIsRHluYW1pYywxPiB0YihzaXplKTsKKyAgICBFaWdlbjo6TWF0cml4PERlc3RTY2FsYXIsRHluYW1pYywxPiB0eChzaXplKTsKKyAgICBmb3IoaW50IGs9MDsgazxyaHNDb2xzOyArK2spCisgICAgeworICAgICAgdGIgPSBiLmNvbChrKTsKKyAgICAgIHR4ID0gZGVyaXZlZCgpLnNvbHZlKHRiKTsKKyAgICAgIGRlc3QuY29sKGspID0gdHguc3BhcnNlVmlldygwKTsKKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICB2b2lkIGluaXQoKQorICB7CisgICAgbV9pc0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgbV9hbmFseXNpc0lzT2sgPSBmYWxzZTsKKyAgICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gZmFsc2U7CisgICAgbV9tYXhJdGVyYXRpb25zID0gLTE7CisgICAgbV90b2xlcmFuY2UgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICB9CisgIGNvbnN0IE1hdHJpeFR5cGUqIG1wX21hdHJpeDsKKyAgUHJlY29uZGl0aW9uZXIgbV9wcmVjb25kaXRpb25lcjsKKworICBpbnQgbV9tYXhJdGVyYXRpb25zOworICBSZWFsU2NhbGFyIG1fdG9sZXJhbmNlOworICAKKyAgbXV0YWJsZSBSZWFsU2NhbGFyIG1fZXJyb3I7CisgIG11dGFibGUgaW50IG1faXRlcmF0aW9uczsKKyAgbXV0YWJsZSBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICBtdXRhYmxlIGJvb2wgbV9pc0luaXRpYWxpemVkLCBtX2FuYWx5c2lzSXNPaywgbV9mYWN0b3JpemF0aW9uSXNPazsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3JldHZhbDxJdGVyYXRpdmVTb2x2ZXJCYXNlPERlcml2ZWQ+LCBSaHM+CisgIDogc3BhcnNlX3NvbHZlX3JldHZhbF9iYXNlPEl0ZXJhdGl2ZVNvbHZlckJhc2U8RGVyaXZlZD4sIFJocz4KK3sKKyAgdHlwZWRlZiBJdGVyYXRpdmVTb2x2ZXJCYXNlPERlcml2ZWQ+IERlYzsKKyAgRUlHRU5fTUFLRV9TUEFSU0VfU09MVkVfSEVMUEVSUyhEZWMsUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGRlYygpLmRlcml2ZWQoKS5fc29sdmVfc3BhcnNlKHJocygpLGRzdCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0lURVJBVElWRV9TT0xWRVJfQkFTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvSmFjb2JpL0NNYWtlTGlzdHMudHh0IGIvRWlnZW4vc3JjL0phY29iaS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBkYWM2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0phY29iaS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9KYWNvYmlfU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUworICAke0VpZ2VuX0phY29iaV9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9KYWNvYmkgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9KYWNvYmkvSmFjb2JpLmggYi9FaWdlbi9zcmMvSmFjb2JpL0phY29iaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YzE3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvSmFjb2JpL0phY29iaS5oCkBAIC0wLDAgKzEsNDIwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fSkFDT0JJX0gKKyNkZWZpbmUgRUlHRU5fSkFDT0JJX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBKYWNvYmlfTW9kdWxlCisgICogXGphY29iaV9tb2R1bGUKKyAgKiBcY2xhc3MgSmFjb2JpUm90YXRpb24KKyAgKiBcYnJpZWYgUm90YXRpb24gZ2l2ZW4gYnkgYSBjb3NpbmUtc2luZSBwYWlyLgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgSmFjb2JpIG9yIEdpdmVucyByb3RhdGlvbi4KKyAgKiBUaGlzIGlzIGEgMkQgcm90YXRpb24gaW4gdGhlIHBsYW5lIFxjIEogb2YgYW5nbGUgXGYkIFx0aGV0YSBcZiQgZGVmaW5lZCBieQorICAqIGl0cyBjb3NpbmUgXGMgYyBhbmQgc2luZSBcYyBzIGFzIGZvbGxvdzoKKyAgKiBcZiQgSiA9IFxsZWZ0ICggXGJlZ2lue2FycmF5fXtjY30gYyAmIFxvdmVybGluZSBzIFxcIC1zICAmIFxvdmVybGluZSBjIFxlbmR7YXJyYXl9IFxyaWdodCApIFxmJAorICAqCisgICogWW91IGNhbiBhcHBseSB0aGUgcmVzcGVjdGl2ZSBjb3VudGVyLWNsb2Nrd2lzZSByb3RhdGlvbiB0byBhIGNvbHVtbiB2ZWN0b3IgXGMgdiBieQorICAqIGFwcGx5aW5nIGl0cyBhZGpvaW50IG9uIHRoZSBsZWZ0OiBcZiQgdiA9IEpeKiB2IFxmJCB0aGF0IHRyYW5zbGF0ZXMgdG8gdGhlIGZvbGxvd2luZyBFaWdlbiBjb2RlOgorICAqIFxjb2RlCisgICogdi5hcHBseU9uVGhlTGVmdChKLmFkam9pbnQoKSk7CisgICogXGVuZGNvZGUKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjphcHBseU9uVGhlTGVmdCgpLCBNYXRyaXhCYXNlOjphcHBseU9uVGhlUmlnaHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBjbGFzcyBKYWNvYmlSb3RhdGlvbgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aG91dCBhbnkgaW5pdGlhbGl6YXRpb24uICovCisgICAgSmFjb2JpUm90YXRpb24oKSB7fQorCisgICAgLyoqIENvbnN0cnVjdCBhIHBsYW5hciByb3RhdGlvbiBmcm9tIGEgY29zaW5lLXNpbmUgcGFpciAoXGEgYywgXGMgcykuICovCisgICAgSmFjb2JpUm90YXRpb24oY29uc3QgU2NhbGFyJiBjLCBjb25zdCBTY2FsYXImIHMpIDogbV9jKGMpLCBtX3Mocykge30KKworICAgIFNjYWxhciYgYygpIHsgcmV0dXJuIG1fYzsgfQorICAgIFNjYWxhciBjKCkgY29uc3QgeyByZXR1cm4gbV9jOyB9CisgICAgU2NhbGFyJiBzKCkgeyByZXR1cm4gbV9zOyB9CisgICAgU2NhbGFyIHMoKSBjb25zdCB7IHJldHVybiBtX3M7IH0KKworICAgIC8qKiBDb25jYXRlbmF0ZXMgdHdvIHBsYW5hciByb3RhdGlvbiAqLworICAgIEphY29iaVJvdGF0aW9uIG9wZXJhdG9yKihjb25zdCBKYWNvYmlSb3RhdGlvbiYgb3RoZXIpCisgICAgeworICAgICAgcmV0dXJuIEphY29iaVJvdGF0aW9uKG1fYyAqIG90aGVyLm1fYyAtIGludGVybmFsOjpjb25qKG1fcykgKiBvdGhlci5tX3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmNvbmoobV9jICogaW50ZXJuYWw6OmNvbmoob3RoZXIubV9zKSArIGludGVybmFsOjpjb25qKG1fcykgKiBpbnRlcm5hbDo6Y29uaihvdGhlci5tX2MpKSk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHRyYW5zcG9zZWQgdHJhbnNmb3JtYXRpb24gKi8KKyAgICBKYWNvYmlSb3RhdGlvbiB0cmFuc3Bvc2UoKSBjb25zdCB7IHJldHVybiBKYWNvYmlSb3RhdGlvbihtX2MsIC1pbnRlcm5hbDo6Y29uaihtX3MpKTsgfQorCisgICAgLyoqIFJldHVybnMgdGhlIGFkam9pbnQgdHJhbnNmb3JtYXRpb24gKi8KKyAgICBKYWNvYmlSb3RhdGlvbiBhZGpvaW50KCkgY29uc3QgeyByZXR1cm4gSmFjb2JpUm90YXRpb24oaW50ZXJuYWw6OmNvbmoobV9jKSwgLW1fcyk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgICAgYm9vbCBtYWtlSmFjb2JpKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mLCB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBwLCB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBxKTsKKyAgICBib29sIG1ha2VKYWNvYmkoUmVhbFNjYWxhciB4LCBTY2FsYXIgeSwgUmVhbFNjYWxhciB6KTsKKworICAgIHZvaWQgbWFrZUdpdmVucyhjb25zdCBTY2FsYXImIHAsIGNvbnN0IFNjYWxhciYgcSwgU2NhbGFyKiB6PTApOworCisgIHByb3RlY3RlZDoKKyAgICB2b2lkIG1ha2VHaXZlbnMoY29uc3QgU2NhbGFyJiBwLCBjb25zdCBTY2FsYXImIHEsIFNjYWxhciogeiwgaW50ZXJuYWw6OnRydWVfdHlwZSk7CisgICAgdm9pZCBtYWtlR2l2ZW5zKGNvbnN0IFNjYWxhciYgcCwgY29uc3QgU2NhbGFyJiBxLCBTY2FsYXIqIHosIGludGVybmFsOjpmYWxzZV90eXBlKTsKKworICAgIFNjYWxhciBtX2MsIG1fczsKK307CisKKy8qKiBNYWtlcyBcYyAqdGhpcyBhcyBhIEphY29iaSByb3RhdGlvbiBcYSBKIHN1Y2ggdGhhdCBhcHBseWluZyBcYSBKIG9uIGJvdGggdGhlIHJpZ2h0IGFuZCBsZWZ0IHNpZGVzIG9mIHRoZSBzZWxmYWRqb2ludCAyeDIgbWF0cml4CisgICogXGYkIEIgPSBcbGVmdCAoIFxiZWdpbnthcnJheX17Y2N9IHggJiB5IFxcIFxvdmVybGluZSB5ICYgeiBcZW5ke2FycmF5fSBccmlnaHQgKVxmJCB5aWVsZHMgYSBkaWFnb25hbCBtYXRyaXggXGYkIEEgPSBKXiogQiBKIFxmJAorICAqCisgICogXHNhIE1hdHJpeEJhc2U6Om1ha2VKYWNvYmkoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYsIEluZGV4LCBJbmRleCksIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVMZWZ0KCksIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVSaWdodCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Citib29sIEphY29iaVJvdGF0aW9uPFNjYWxhcj46Om1ha2VKYWNvYmkoUmVhbFNjYWxhciB4LCBTY2FsYXIgeSwgUmVhbFNjYWxhciB6KQoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIGlmKHkgPT0gU2NhbGFyKDApKQorICB7CisgICAgbV9jID0gU2NhbGFyKDEpOworICAgIG1fcyA9IFNjYWxhcigwKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZWxzZQorICB7CisgICAgUmVhbFNjYWxhciB0YXUgPSAoeC16KS8oUmVhbFNjYWxhcigyKSppbnRlcm5hbDo6YWJzKHkpKTsKKyAgICBSZWFsU2NhbGFyIHcgPSBpbnRlcm5hbDo6c3FydChpbnRlcm5hbDo6YWJzMih0YXUpICsgUmVhbFNjYWxhcigxKSk7CisgICAgUmVhbFNjYWxhciB0OworICAgIGlmKHRhdT5SZWFsU2NhbGFyKDApKQorICAgIHsKKyAgICAgIHQgPSBSZWFsU2NhbGFyKDEpIC8gKHRhdSArIHcpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdCA9IFJlYWxTY2FsYXIoMSkgLyAodGF1IC0gdyk7CisgICAgfQorICAgIFJlYWxTY2FsYXIgc2lnbl90ID0gdCA+IFJlYWxTY2FsYXIoMCkgPyBSZWFsU2NhbGFyKDEpIDogUmVhbFNjYWxhcigtMSk7CisgICAgUmVhbFNjYWxhciBuID0gUmVhbFNjYWxhcigxKSAvIGludGVybmFsOjpzcXJ0KGludGVybmFsOjphYnMyKHQpK1JlYWxTY2FsYXIoMSkpOworICAgIG1fcyA9IC0gc2lnbl90ICogKGludGVybmFsOjpjb25qKHkpIC8gaW50ZXJuYWw6OmFicyh5KSkgKiBpbnRlcm5hbDo6YWJzKHQpICogbjsKKyAgICBtX2MgPSBuOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKKy8qKiBNYWtlcyBcYyAqdGhpcyBhcyBhIEphY29iaSByb3RhdGlvbiBcYyBKIHN1Y2ggdGhhdCBhcHBseWluZyBcYSBKIG9uIGJvdGggdGhlIHJpZ2h0IGFuZCBsZWZ0IHNpZGVzIG9mIHRoZSAyeDIgc2VsZmFkam9pbnQgbWF0cml4CisgICogXGYkIEIgPSBcbGVmdCAoIFxiZWdpbnthcnJheX17Y2N9IFx0ZXh0e3RoaXN9X3twcH0gJiBcdGV4dHt0aGlzfV97cHF9IFxcIChcdGV4dHt0aGlzfV97cHF9KV4qICYgXHRleHR7dGhpc31fe3FxfSBcZW5ke2FycmF5fSBccmlnaHQgKVxmJCB5aWVsZHMKKyAgKiBhIGRpYWdvbmFsIG1hdHJpeCBcZiQgQSA9IEpeKiBCIEogXGYkCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBKYWNvYmlfbWFrZUphY29iaS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBKYWNvYmlfbWFrZUphY29iaS5vdXQKKyAgKgorICAqIFxzYSBKYWNvYmlSb3RhdGlvbjo6bWFrZUphY29iaShSZWFsU2NhbGFyLCBTY2FsYXIsIFJlYWxTY2FsYXIpLCBNYXRyaXhCYXNlOjphcHBseU9uVGhlTGVmdCgpLCBNYXRyaXhCYXNlOjphcHBseU9uVGhlUmlnaHQoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBib29sIEphY29iaVJvdGF0aW9uPFNjYWxhcj46Om1ha2VKYWNvYmkoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSwgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggcCwgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggcSkKK3sKKyAgcmV0dXJuIG1ha2VKYWNvYmkoaW50ZXJuYWw6OnJlYWwobS5jb2VmZihwLHApKSwgbS5jb2VmZihwLHEpLCBpbnRlcm5hbDo6cmVhbChtLmNvZWZmKHEscSkpKTsKK30KKworLyoqIE1ha2VzIFxjICp0aGlzIGFzIGEgR2l2ZW5zIHJvdGF0aW9uIFxjIEcgc3VjaCB0aGF0IGFwcGx5aW5nIFxmJCBHXiogXGYkIHRvIHRoZSBsZWZ0IG9mIHRoZSB2ZWN0b3IKKyAgKiBcZiQgViA9IFxsZWZ0ICggXGJlZ2lue2FycmF5fXtjfSBwIFxcIHEgXGVuZHthcnJheX0gXHJpZ2h0IClcZiQgeWllbGRzOgorICAqIFxmJCBHXiogViA9IFxsZWZ0ICggXGJlZ2lue2FycmF5fXtjfSByIFxcIDAgXGVuZHthcnJheX0gXHJpZ2h0IClcZiQuCisgICoKKyAgKiBUaGUgdmFsdWUgb2YgXGEgeiBpcyByZXR1cm5lZCBpZiBcYSB6IGlzIG5vdCBudWxsICh0aGUgZGVmYXVsdCBpcyBudWxsKS4KKyAgKiBBbHNvIG5vdGUgdGhhdCBHIGlzIGJ1aWx0IHN1Y2ggdGhhdCB0aGUgY29zaW5lIGlzIGFsd2F5cyByZWFsLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgSmFjb2JpX21ha2VHaXZlbnMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgSmFjb2JpX21ha2VHaXZlbnMub3V0CisgICoKKyAgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIGNvbnRpbnVvdXMgR2l2ZW5zIHJvdGF0aW9uIGdlbmVyYXRpb24gYWxnb3JpdGhtCisgICogZm91bmQgaW4gQW5kZXJzb24gKDIwMDApLCBEaXNjb250aW51b3VzIFBsYW5lIFJvdGF0aW9ucyBhbmQgdGhlIFN5bW1ldHJpYyBFaWdlbnZhbHVlIFByb2JsZW0uCisgICogTEFQQUNLIFdvcmtpbmcgTm90ZSAxNTAsIFVuaXZlcnNpdHkgb2YgVGVubmVzc2VlLCBVVC1DUy0wMC00NTQsIERlY2VtYmVyIDQsIDIwMDAuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6YXBwbHlPblRoZUxlZnQoKSwgTWF0cml4QmFzZTo6YXBwbHlPblRoZVJpZ2h0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgSmFjb2JpUm90YXRpb248U2NhbGFyPjo6bWFrZUdpdmVucyhjb25zdCBTY2FsYXImIHAsIGNvbnN0IFNjYWxhciYgcSwgU2NhbGFyKiB6KQoreworICBtYWtlR2l2ZW5zKHAsIHEsIHosIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LCBpbnRlcm5hbDo6dHJ1ZV90eXBlLCBpbnRlcm5hbDo6ZmFsc2VfdHlwZT46OnR5cGUoKSk7Cit9CisKKworLy8gc3BlY2lhbGl6YXRpb24gZm9yIGNvbXBsZXhlcwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+OjptYWtlR2l2ZW5zKGNvbnN0IFNjYWxhciYgcCwgY29uc3QgU2NhbGFyJiBxLCBTY2FsYXIqIHIsIGludGVybmFsOjp0cnVlX3R5cGUpCit7CisgIGlmKHE9PVNjYWxhcigwKSkKKyAgeworICAgIG1fYyA9IGludGVybmFsOjpyZWFsKHApPDAgPyBTY2FsYXIoLTEpIDogU2NhbGFyKDEpOworICAgIG1fcyA9IDA7CisgICAgaWYocikgKnIgPSBtX2MgKiBwOworICB9CisgIGVsc2UgaWYocD09U2NhbGFyKDApKQorICB7CisgICAgbV9jID0gMDsKKyAgICBtX3MgPSAtcS9pbnRlcm5hbDo6YWJzKHEpOworICAgIGlmKHIpICpyID0gaW50ZXJuYWw6OmFicyhxKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBSZWFsU2NhbGFyIHAxID0gaW50ZXJuYWw6Om5vcm0xKHApOworICAgIFJlYWxTY2FsYXIgcTEgPSBpbnRlcm5hbDo6bm9ybTEocSk7CisgICAgaWYocDE+PXExKQorICAgIHsKKyAgICAgIFNjYWxhciBwcyA9IHAgLyBwMTsKKyAgICAgIFJlYWxTY2FsYXIgcDIgPSBpbnRlcm5hbDo6YWJzMihwcyk7CisgICAgICBTY2FsYXIgcXMgPSBxIC8gcDE7CisgICAgICBSZWFsU2NhbGFyIHEyID0gaW50ZXJuYWw6OmFiczIocXMpOworCisgICAgICBSZWFsU2NhbGFyIHUgPSBpbnRlcm5hbDo6c3FydChSZWFsU2NhbGFyKDEpICsgcTIvcDIpOworICAgICAgaWYoaW50ZXJuYWw6OnJlYWwocCk8UmVhbFNjYWxhcigwKSkKKyAgICAgICAgdSA9IC11OworCisgICAgICBtX2MgPSBTY2FsYXIoMSkvdTsKKyAgICAgIG1fcyA9IC1xcyppbnRlcm5hbDo6Y29uaihwcykqKG1fYy9wMik7CisgICAgICBpZihyKSAqciA9IHAgKiB1OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgU2NhbGFyIHBzID0gcCAvIHExOworICAgICAgUmVhbFNjYWxhciBwMiA9IGludGVybmFsOjphYnMyKHBzKTsKKyAgICAgIFNjYWxhciBxcyA9IHEgLyBxMTsKKyAgICAgIFJlYWxTY2FsYXIgcTIgPSBpbnRlcm5hbDo6YWJzMihxcyk7CisKKyAgICAgIFJlYWxTY2FsYXIgdSA9IHExICogaW50ZXJuYWw6OnNxcnQocDIgKyBxMik7CisgICAgICBpZihpbnRlcm5hbDo6cmVhbChwKTxSZWFsU2NhbGFyKDApKQorICAgICAgICB1ID0gLXU7CisKKyAgICAgIHAxID0gaW50ZXJuYWw6OmFicyhwKTsKKyAgICAgIHBzID0gcC9wMTsKKyAgICAgIG1fYyA9IHAxL3U7CisgICAgICBtX3MgPSAtaW50ZXJuYWw6OmNvbmoocHMpICogKHEvdSk7CisgICAgICBpZihyKSAqciA9IHBzICogdTsKKyAgICB9CisgIH0KK30KKworLy8gc3BlY2lhbGl6YXRpb24gZm9yIHJlYWxzCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIEphY29iaVJvdGF0aW9uPFNjYWxhcj46Om1ha2VHaXZlbnMoY29uc3QgU2NhbGFyJiBwLCBjb25zdCBTY2FsYXImIHEsIFNjYWxhciogciwgaW50ZXJuYWw6OmZhbHNlX3R5cGUpCit7CisKKyAgaWYocT09U2NhbGFyKDApKQorICB7CisgICAgbV9jID0gcDxTY2FsYXIoMCkgPyBTY2FsYXIoLTEpIDogU2NhbGFyKDEpOworICAgIG1fcyA9IFNjYWxhcigwKTsKKyAgICBpZihyKSAqciA9IGludGVybmFsOjphYnMocCk7CisgIH0KKyAgZWxzZSBpZihwPT1TY2FsYXIoMCkpCisgIHsKKyAgICBtX2MgPSBTY2FsYXIoMCk7CisgICAgbV9zID0gcTxTY2FsYXIoMCkgPyBTY2FsYXIoMSkgOiBTY2FsYXIoLTEpOworICAgIGlmKHIpICpyID0gaW50ZXJuYWw6OmFicyhxKTsKKyAgfQorICBlbHNlIGlmKGludGVybmFsOjphYnMocCkgPiBpbnRlcm5hbDo6YWJzKHEpKQorICB7CisgICAgU2NhbGFyIHQgPSBxL3A7CisgICAgU2NhbGFyIHUgPSBpbnRlcm5hbDo6c3FydChTY2FsYXIoMSkgKyBpbnRlcm5hbDo6YWJzMih0KSk7CisgICAgaWYocDxTY2FsYXIoMCkpCisgICAgICB1ID0gLXU7CisgICAgbV9jID0gU2NhbGFyKDEpL3U7CisgICAgbV9zID0gLXQgKiBtX2M7CisgICAgaWYocikgKnIgPSBwICogdTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTY2FsYXIgdCA9IHAvcTsKKyAgICBTY2FsYXIgdSA9IGludGVybmFsOjpzcXJ0KFNjYWxhcigxKSArIGludGVybmFsOjphYnMyKHQpKTsKKyAgICBpZihxPFNjYWxhcigwKSkKKyAgICAgIHUgPSAtdTsKKyAgICBtX3MgPSAtU2NhbGFyKDEpL3U7CisgICAgbV9jID0gLXQgKiBtX3M7CisgICAgaWYocikgKnIgPSBxICogdTsKKyAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgSW1wbGVtZW50YXRpb24gb2YgTWF0cml4QmFzZSBtZXRob2RzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogXGphY29iaV9tb2R1bGUKKyAgKiBBcHBsaWVzIHRoZSBjbG9jayB3aXNlIDJEIHJvdGF0aW9uIFxhIGogdG8gdGhlIHNldCBvZiAyRCB2ZWN0b3JzIG9mIGNvcmRpbmF0ZXMgXGEgeCBhbmQgXGEgeToKKyAgKiBcZiQgXGxlZnQgKCBcYmVnaW57YXJyYXl9e2NjfSB4IFxcIHkgXGVuZHthcnJheX0gXHJpZ2h0ICkgID0gIEogXGxlZnQgKCBcYmVnaW57YXJyYXl9e2NjfSB4IFxcIHkgXGVuZHthcnJheX0gXHJpZ2h0ICkgXGYkCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6YXBwbHlPblRoZUxlZnQoKSwgTWF0cml4QmFzZTo6YXBwbHlPblRoZVJpZ2h0KCkKKyAgKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JYLCB0eXBlbmFtZSBWZWN0b3JZLCB0eXBlbmFtZSBPdGhlclNjYWxhcj4KK3ZvaWQgYXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKFZlY3RvclgmIF94LCBWZWN0b3JZJiBfeSwgY29uc3QgSmFjb2JpUm90YXRpb248T3RoZXJTY2FsYXI+JiBqKTsKK30KKworLyoqIFxqYWNvYmlfbW9kdWxlCisgICogQXBwbGllcyB0aGUgcm90YXRpb24gaW4gdGhlIHBsYW5lIFxhIGogdG8gdGhlIHJvd3MgXGEgcCBhbmQgXGEgcSBvZiBcYyAqdGhpcywgaS5lLiwgaXQgY29tcHV0ZXMgQiA9IEogKiBCLAorICAqIHdpdGggXGYkIEIgPSBcbGVmdCAoIFxiZWdpbnthcnJheX17Y2N9IFx0ZXh0eyp0aGlzLnJvd30ocCkgXFwgXHRleHR7KnRoaXMucm93fShxKSBcZW5ke2FycmF5fSBccmlnaHQgKSBcZiQuCisgICoKKyAgKiBcc2EgY2xhc3MgSmFjb2JpUm90YXRpb24sIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVSaWdodCgpLCBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclNjYWxhcj4KK2lubGluZSB2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46OmFwcGx5T25UaGVMZWZ0KEluZGV4IHAsIEluZGV4IHEsIGNvbnN0IEphY29iaVJvdGF0aW9uPE90aGVyU2NhbGFyPiYgaikKK3sKKyAgUm93WHByIHgodGhpcy0+cm93KHApKTsKKyAgUm93WHByIHkodGhpcy0+cm93KHEpKTsKKyAgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZSh4LCB5LCBqKTsKK30KKworLyoqIFxpbmdyb3VwIEphY29iaV9Nb2R1bGUKKyAgKiBBcHBsaWVzIHRoZSByb3RhdGlvbiBpbiB0aGUgcGxhbmUgXGEgaiB0byB0aGUgY29sdW1ucyBcYSBwIGFuZCBcYSBxIG9mIFxjICp0aGlzLCBpLmUuLCBpdCBjb21wdXRlcyBCID0gQiAqIEoKKyAgKiB3aXRoIFxmJCBCID0gXGxlZnQgKCBcYmVnaW57YXJyYXl9e2NjfSBcdGV4dHsqdGhpcy5jb2x9KHApICYgXHRleHR7KnRoaXMuY29sfShxKSBcZW5ke2FycmF5fSBccmlnaHQgKSBcZiQuCisgICoKKyAgKiBcc2EgY2xhc3MgSmFjb2JpUm90YXRpb24sIE1hdHJpeEJhc2U6OmFwcGx5T25UaGVMZWZ0KCksIGludGVybmFsOjphcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyU2NhbGFyPgoraW5saW5lIHZvaWQgTWF0cml4QmFzZTxEZXJpdmVkPjo6YXBwbHlPblRoZVJpZ2h0KEluZGV4IHAsIEluZGV4IHEsIGNvbnN0IEphY29iaVJvdGF0aW9uPE90aGVyU2NhbGFyPiYgaikKK3sKKyAgQ29sWHByIHgodGhpcy0+Y29sKHApKTsKKyAgQ29sWHByIHkodGhpcy0+Y29sKHEpKTsKKyAgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZSh4LCB5LCBqLnRyYW5zcG9zZSgpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclgsIHR5cGVuYW1lIFZlY3RvclksIHR5cGVuYW1lIE90aGVyU2NhbGFyPgordm9pZCAvKkVJR0VOX0RPTlRfSU5MSU5FKi8gYXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKFZlY3RvclgmIF94LCBWZWN0b3JZJiBfeSwgY29uc3QgSmFjb2JpUm90YXRpb248T3RoZXJTY2FsYXI+JiBqKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3Rvclg6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3Rvclg6OlNjYWxhciBTY2FsYXI7CisgIGVudW0geyBQYWNrZXRTaXplID0gcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgcGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgZWlnZW5fYXNzZXJ0KF94LnNpemUoKSA9PSBfeS5zaXplKCkpOworICBJbmRleCBzaXplID0gX3guc2l6ZSgpOworICBJbmRleCBpbmNyeCA9IF94LmlubmVyU3RyaWRlKCk7CisgIEluZGV4IGluY3J5ID0gX3kuaW5uZXJTdHJpZGUoKTsKKworICBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIHggPSAmX3guY29lZmZSZWYoMCk7CisgIFNjYWxhciogRUlHRU5fUkVTVFJJQ1QgeSA9ICZfeS5jb2VmZlJlZigwKTsKKworICAvKioqIGR5bmFtaWMtc2l6ZSB2ZWN0b3JpemVkIHBhdGhzICoqKi8KKworICBpZihWZWN0b3JYOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljICYmCisgICAgKFZlY3Rvclg6OkZsYWdzICYgVmVjdG9yWTo6RmxhZ3MgJiBQYWNrZXRBY2Nlc3NCaXQpICYmCisgICAgKChpbmNyeD09MSAmJiBpbmNyeT09MSkgfHwgUGFja2V0U2l6ZSA9PSAxKSkKKyAgeworICAgIC8vIGJvdGggdmVjdG9ycyBhcmUgc2VxdWVudGlhbGx5IHN0b3JlZCBpbiBtZW1vcnkgPT4gdmVjdG9yaXphdGlvbgorICAgIGVudW0geyBQZWVsaW5nID0gMiB9OworCisgICAgSW5kZXggYWxpZ25lZFN0YXJ0ID0gaW50ZXJuYWw6OmZpcnN0X2FsaWduZWQoeSwgc2l6ZSk7CisgICAgSW5kZXggYWxpZ25lZEVuZCA9IGFsaWduZWRTdGFydCArICgoc2l6ZS1hbGlnbmVkU3RhcnQpL1BhY2tldFNpemUpKlBhY2tldFNpemU7CisKKyAgICBjb25zdCBQYWNrZXQgcGMgPSBwc2V0MTxQYWNrZXQ+KGouYygpKTsKKyAgICBjb25zdCBQYWNrZXQgcHMgPSBwc2V0MTxQYWNrZXQ+KGoucygpKTsKKyAgICBjb25qX2hlbHBlcjxQYWNrZXQsUGFja2V0LE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsZmFsc2U+IHBjajsKKworICAgIGZvcihJbmRleCBpPTA7IGk8YWxpZ25lZFN0YXJ0OyArK2kpCisgICAgeworICAgICAgU2NhbGFyIHhpID0geFtpXTsKKyAgICAgIFNjYWxhciB5aSA9IHlbaV07CisgICAgICB4W2ldID0gIGouYygpICogeGkgKyBjb25qKGoucygpKSAqIHlpOworICAgICAgeVtpXSA9IC1qLnMoKSAqIHhpICsgY29uaihqLmMoKSkgKiB5aTsKKyAgICB9CisKKyAgICBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIHB4ID0geCArIGFsaWduZWRTdGFydDsKKyAgICBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIHB5ID0geSArIGFsaWduZWRTdGFydDsKKworICAgIGlmKGludGVybmFsOjpmaXJzdF9hbGlnbmVkKHgsIHNpemUpPT1hbGlnbmVkU3RhcnQpCisgICAgeworICAgICAgZm9yKEluZGV4IGk9YWxpZ25lZFN0YXJ0OyBpPGFsaWduZWRFbmQ7IGkrPVBhY2tldFNpemUpCisgICAgICB7CisgICAgICAgIFBhY2tldCB4aSA9IHBsb2FkPFBhY2tldD4ocHgpOworICAgICAgICBQYWNrZXQgeWkgPSBwbG9hZDxQYWNrZXQ+KHB5KTsKKyAgICAgICAgcHN0b3JlKHB4LCBwYWRkKHBtdWwocGMseGkpLHBjai5wbXVsKHBzLHlpKSkpOworICAgICAgICBwc3RvcmUocHksIHBzdWIocGNqLnBtdWwocGMseWkpLHBtdWwocHMseGkpKSk7CisgICAgICAgIHB4ICs9IFBhY2tldFNpemU7CisgICAgICAgIHB5ICs9IFBhY2tldFNpemU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBJbmRleCBwZWVsaW5nRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChzaXplLWFsaWduZWRTdGFydCkvKFBlZWxpbmcqUGFja2V0U2l6ZSkpKihQZWVsaW5nKlBhY2tldFNpemUpOworICAgICAgZm9yKEluZGV4IGk9YWxpZ25lZFN0YXJ0OyBpPHBlZWxpbmdFbmQ7IGkrPVBlZWxpbmcqUGFja2V0U2l6ZSkKKyAgICAgIHsKKyAgICAgICAgUGFja2V0IHhpICAgPSBwbG9hZHU8UGFja2V0PihweCk7CisgICAgICAgIFBhY2tldCB4aTEgID0gcGxvYWR1PFBhY2tldD4ocHgrUGFja2V0U2l6ZSk7CisgICAgICAgIFBhY2tldCB5aSAgID0gcGxvYWQgPFBhY2tldD4ocHkpOworICAgICAgICBQYWNrZXQgeWkxICA9IHBsb2FkIDxQYWNrZXQ+KHB5K1BhY2tldFNpemUpOworICAgICAgICBwc3RvcmV1KHB4LCBwYWRkKHBtdWwocGMseGkpLHBjai5wbXVsKHBzLHlpKSkpOworICAgICAgICBwc3RvcmV1KHB4K1BhY2tldFNpemUsIHBhZGQocG11bChwYyx4aTEpLHBjai5wbXVsKHBzLHlpMSkpKTsKKyAgICAgICAgcHN0b3JlIChweSwgcHN1YihwY2oucG11bChwYyx5aSkscG11bChwcyx4aSkpKTsKKyAgICAgICAgcHN0b3JlIChweStQYWNrZXRTaXplLCBwc3ViKHBjai5wbXVsKHBjLHlpMSkscG11bChwcyx4aTEpKSk7CisgICAgICAgIHB4ICs9IFBlZWxpbmcqUGFja2V0U2l6ZTsKKyAgICAgICAgcHkgKz0gUGVlbGluZypQYWNrZXRTaXplOworICAgICAgfQorICAgICAgaWYoYWxpZ25lZEVuZCE9cGVlbGluZ0VuZCkKKyAgICAgIHsKKyAgICAgICAgUGFja2V0IHhpID0gcGxvYWR1PFBhY2tldD4oeCtwZWVsaW5nRW5kKTsKKyAgICAgICAgUGFja2V0IHlpID0gcGxvYWQgPFBhY2tldD4oeStwZWVsaW5nRW5kKTsKKyAgICAgICAgcHN0b3JldSh4K3BlZWxpbmdFbmQsIHBhZGQocG11bChwYyx4aSkscGNqLnBtdWwocHMseWkpKSk7CisgICAgICAgIHBzdG9yZSAoeStwZWVsaW5nRW5kLCBwc3ViKHBjai5wbXVsKHBjLHlpKSxwbXVsKHBzLHhpKSkpOworICAgICAgfQorICAgIH0KKworICAgIGZvcihJbmRleCBpPWFsaWduZWRFbmQ7IGk8c2l6ZTsgKytpKQorICAgIHsKKyAgICAgIFNjYWxhciB4aSA9IHhbaV07CisgICAgICBTY2FsYXIgeWkgPSB5W2ldOworICAgICAgeFtpXSA9ICBqLmMoKSAqIHhpICsgY29uaihqLnMoKSkgKiB5aTsKKyAgICAgIHlbaV0gPSAtai5zKCkgKiB4aSArIGNvbmooai5jKCkpICogeWk7CisgICAgfQorICB9CisKKyAgLyoqKiBmaXhlZC1zaXplIHZlY3Rvcml6ZWQgcGF0aCAqKiovCisgIGVsc2UgaWYoVmVjdG9yWDo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gRHluYW1pYyAmJgorICAgICAgICAgIChWZWN0b3JYOjpGbGFncyAmIFZlY3Rvclk6OkZsYWdzICYgUGFja2V0QWNjZXNzQml0KSAmJgorICAgICAgICAgIChWZWN0b3JYOjpGbGFncyAmIFZlY3Rvclk6OkZsYWdzICYgQWxpZ25lZEJpdCkpCisgIHsKKyAgICBjb25zdCBQYWNrZXQgcGMgPSBwc2V0MTxQYWNrZXQ+KGouYygpKTsKKyAgICBjb25zdCBQYWNrZXQgcHMgPSBwc2V0MTxQYWNrZXQ+KGoucygpKTsKKyAgICBjb25qX2hlbHBlcjxQYWNrZXQsUGFja2V0LE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsZmFsc2U+IHBjajsKKyAgICBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIHB4ID0geDsKKyAgICBTY2FsYXIqIEVJR0VOX1JFU1RSSUNUIHB5ID0geTsKKyAgICBmb3IoSW5kZXggaT0wOyBpPHNpemU7IGkrPVBhY2tldFNpemUpCisgICAgeworICAgICAgUGFja2V0IHhpID0gcGxvYWQ8UGFja2V0PihweCk7CisgICAgICBQYWNrZXQgeWkgPSBwbG9hZDxQYWNrZXQ+KHB5KTsKKyAgICAgIHBzdG9yZShweCwgcGFkZChwbXVsKHBjLHhpKSxwY2oucG11bChwcyx5aSkpKTsKKyAgICAgIHBzdG9yZShweSwgcHN1YihwY2oucG11bChwYyx5aSkscG11bChwcyx4aSkpKTsKKyAgICAgIHB4ICs9IFBhY2tldFNpemU7CisgICAgICBweSArPSBQYWNrZXRTaXplOworICAgIH0KKyAgfQorCisgIC8qKiogbm9uLXZlY3Rvcml6ZWQgcGF0aCAqKiovCisgIGVsc2UKKyAgeworICAgIGZvcihJbmRleCBpPTA7IGk8c2l6ZTsgKytpKQorICAgIHsKKyAgICAgIFNjYWxhciB4aSA9ICp4OworICAgICAgU2NhbGFyIHlpID0gKnk7CisgICAgICAqeCA9ICBqLmMoKSAqIHhpICsgY29uaihqLnMoKSkgKiB5aTsKKyAgICAgICp5ID0gLWoucygpICogeGkgKyBjb25qKGouYygpKSAqIHlpOworICAgICAgeCArPSBpbmNyeDsKKyAgICAgIHkgKz0gaW5jcnk7CisgICAgfQorICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0pBQ09CSV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvTFUvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvTFUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkOGQ3OAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9MVS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDggQEAKK0ZJTEUoR0xPQiBFaWdlbl9MVV9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTIAorICAke0VpZ2VuX0xVX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL0xVIENPTVBPTkVOVCBEZXZlbAorICApCisKK0FERF9TVUJESVJFQ1RPUlkoYXJjaCkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9MVS9EZXRlcm1pbmFudC5oIGIvRWlnZW4vc3JjL0xVL0RldGVybWluYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2MmM1ZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9MVS9EZXRlcm1pbmFudC5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fREVURVJNSU5BTlRfSAorI2RlZmluZSBFSUdFTl9ERVRFUk1JTkFOVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBicnV0ZWZvcmNlX2RldDNfaGVscGVyCisoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbWF0cml4LCBpbnQgYSwgaW50IGIsIGludCBjKQoreworICByZXR1cm4gbWF0cml4LmNvZWZmKDAsYSkKKyAgICAgICAgICogKG1hdHJpeC5jb2VmZigxLGIpICogbWF0cml4LmNvZWZmKDIsYykgLSBtYXRyaXguY29lZmYoMSxjKSAqIG1hdHJpeC5jb2VmZigyLGIpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhciBicnV0ZWZvcmNlX2RldDRfaGVscGVyCisoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbWF0cml4LCBpbnQgaiwgaW50IGssIGludCBtLCBpbnQgbikKK3sKKyAgcmV0dXJuIChtYXRyaXguY29lZmYoaiwwKSAqIG1hdHJpeC5jb2VmZihrLDEpIC0gbWF0cml4LmNvZWZmKGssMCkgKiBtYXRyaXguY29lZmYoaiwxKSkKKyAgICAgICAqIChtYXRyaXguY29lZmYobSwyKSAqIG1hdHJpeC5jb2VmZihuLDMpIC0gbWF0cml4LmNvZWZmKG4sMikgKiBtYXRyaXguY29lZmYobSwzKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsCisgICAgICAgICBpbnQgRGV0ZXJtaW5hbnRUeXBlID0gRGVyaXZlZDo6Um93c0F0Q29tcGlsZVRpbWUKKz4gc3RydWN0IGRldGVybWluYW50X2ltcGwKK3sKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBydW4oY29uc3QgRGVyaXZlZCYgbSkKKyAgeworICAgIGlmKERlcml2ZWQ6OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljICYmIG0ucm93cygpPT0wKQorICAgICAgcmV0dXJuIHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6U2NhbGFyKDEpOworICAgIHJldHVybiBtLnBhcnRpYWxQaXZMdSgpLmRldGVybWluYW50KCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBkZXRlcm1pbmFudF9pbXBsPERlcml2ZWQsIDE+Cit7CisgIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQmIG0pCisgIHsKKyAgICByZXR1cm4gbS5jb2VmZigwLDApOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgZGV0ZXJtaW5hbnRfaW1wbDxEZXJpdmVkLCAyPgoreworICBzdGF0aWMgaW5saW5lIHR5cGVuYW1lIHRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIHJ1bihjb25zdCBEZXJpdmVkJiBtKQorICB7CisgICAgcmV0dXJuIG0uY29lZmYoMCwwKSAqIG0uY29lZmYoMSwxKSAtIG0uY29lZmYoMSwwKSAqIG0uY29lZmYoMCwxKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gc3RydWN0IGRldGVybWluYW50X2ltcGw8RGVyaXZlZCwgMz4KK3sKKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSB0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBydW4oY29uc3QgRGVyaXZlZCYgbSkKKyAgeworICAgIHJldHVybiBicnV0ZWZvcmNlX2RldDNfaGVscGVyKG0sMCwxLDIpCisgICAgICAgICAgLSBicnV0ZWZvcmNlX2RldDNfaGVscGVyKG0sMSwwLDIpCisgICAgICAgICAgKyBicnV0ZWZvcmNlX2RldDNfaGVscGVyKG0sMiwwLDEpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBzdHJ1Y3QgZGV0ZXJtaW5hbnRfaW1wbDxEZXJpdmVkLCA0PgoreworICBzdGF0aWMgdHlwZW5hbWUgdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIgcnVuKGNvbnN0IERlcml2ZWQmIG0pCisgIHsKKyAgICAvLyB0cmljayBieSBNYXJ0aW4gQ29zdGFiZWwgdG8gY29tcHV0ZSA0eDQgZGV0IHdpdGggb25seSAzMCBtdWxzCisgICAgcmV0dXJuIGJydXRlZm9yY2VfZGV0NF9oZWxwZXIobSwwLDEsMiwzKQorICAgICAgICAgIC0gYnJ1dGVmb3JjZV9kZXQ0X2hlbHBlcihtLDAsMiwxLDMpCisgICAgICAgICAgKyBicnV0ZWZvcmNlX2RldDRfaGVscGVyKG0sMCwzLDEsMikKKyAgICAgICAgICArIGJydXRlZm9yY2VfZGV0NF9oZWxwZXIobSwxLDIsMCwzKQorICAgICAgICAgIC0gYnJ1dGVmb3JjZV9kZXQ0X2hlbHBlcihtLDEsMywwLDIpCisgICAgICAgICAgKyBicnV0ZWZvcmNlX2RldDRfaGVscGVyKG0sMiwzLDAsMSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGx1X21vZHVsZQorICAqCisgICogXHJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoaXMgbWF0cml4CisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBNYXRyaXhCYXNlPERlcml2ZWQ+OjpkZXRlcm1pbmFudCgpIGNvbnN0Cit7CisgIGFzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPERlcml2ZWQsQmFzZTo6Um93c0F0Q29tcGlsZVRpbWU+Ojp0eXBlIE5lc3RlZDsKKyAgcmV0dXJuIGludGVybmFsOjpkZXRlcm1pbmFudF9pbXBsPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE5lc3RlZD46OnR5cGU+OjpydW4oZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9ERVRFUk1JTkFOVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvTFUvRnVsbFBpdkxVLmggYi9FaWdlbi9zcmMvTFUvRnVsbFBpdkxVLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzZjk2YwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9MVS9GdWxsUGl2TFUuaApAQCAtMCwwICsxLDczNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTFVfSAorI2RlZmluZSBFSUdFTl9MVV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgTFVfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgRnVsbFBpdkxVCisgICoKKyAgKiBcYnJpZWYgTFUgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCB3aXRoIGNvbXBsZXRlIHBpdm90aW5nLCBhbmQgcmVsYXRlZCBmZWF0dXJlcworICAqCisgICogXHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBMVSBkZWNvbXBvc2l0aW9uCisgICoKKyAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBMVSBkZWNvbXBvc2l0aW9uIG9mIGFueSBtYXRyaXgsIHdpdGggY29tcGxldGUgcGl2b3Rpbmc6IHRoZSBtYXRyaXggQQorICAqIGlzIGRlY29tcG9zZWQgYXMgQSA9IFBMVVEgd2hlcmUgTCBpcyB1bml0LWxvd2VyLXRyaWFuZ3VsYXIsIFUgaXMgdXBwZXItdHJpYW5ndWxhciwgYW5kIFAgYW5kIFEKKyAgKiBhcmUgcGVybXV0YXRpb24gbWF0cmljZXMuIFRoaXMgaXMgYSByYW5rLXJldmVhbGluZyBMVSBkZWNvbXBvc2l0aW9uLiBUaGUgZWlnZW52YWx1ZXMgKGRpYWdvbmFsCisgICogY29lZmZpY2llbnRzKSBvZiBVIGFyZSBzb3J0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IGFueSB6ZXJvcyBhcmUgYXQgdGhlIGVuZC4KKyAgKgorICAqIFRoaXMgZGVjb21wb3NpdGlvbiBwcm92aWRlcyB0aGUgZ2VuZXJpYyBhcHByb2FjaCB0byBzb2x2aW5nIHN5c3RlbXMgb2YgbGluZWFyIGVxdWF0aW9ucywgY29tcHV0aW5nCisgICogdGhlIHJhbmssIGludmVydGliaWxpdHksIGludmVyc2UsIGtlcm5lbCwgYW5kIGRldGVybWluYW50LgorICAqCisgICogVGhpcyBMVSBkZWNvbXBvc2l0aW9uIGlzIHZlcnkgc3RhYmxlIGFuZCB3ZWxsIHRlc3RlZCB3aXRoIGxhcmdlIG1hdHJpY2VzLiBIb3dldmVyIHRoZXJlIGFyZSB1c2UgY2FzZXMgd2hlcmUgdGhlIFNWRAorICAqIGRlY29tcG9zaXRpb24gaXMgaW5oZXJlbnRseSBtb3JlIHN0YWJsZSBhbmQvb3IgZmxleGlibGUuIEZvciBleGFtcGxlLCB3aGVuIGNvbXB1dGluZyB0aGUga2VybmVsIG9mIGEgbWF0cml4LAorICAqIHdvcmtpbmcgd2l0aCB0aGUgU1ZEIGFsbG93cyB0byBzZWxlY3QgdGhlIHNtYWxsZXN0IHNpbmd1bGFyIHZhbHVlcyBvZiB0aGUgbWF0cml4LCBzb21ldGhpbmcgdGhhdAorICAqIHRoZSBMVSBkZWNvbXBvc2l0aW9uIGRvZXNuJ3Qgc2VlLgorICAqCisgICogVGhlIGRhdGEgb2YgdGhlIExVIGRlY29tcG9zaXRpb24gY2FuIGJlIGRpcmVjdGx5IGFjY2Vzc2VkIHRocm91Z2ggdGhlIG1ldGhvZHMgbWF0cml4TFUoKSwKKyAgKiBwZXJtdXRhdGlvblAoKSwgcGVybXV0YXRpb25RKCkuCisgICoKKyAgKiBBcyBhbiBleGVtcGxlLCBoZXJlIGlzIGhvdyB0aGUgb3JpZ2luYWwgbWF0cml4IGNhbiBiZSByZXRyaWV2ZWQ6CisgICogXGluY2x1ZGUgY2xhc3NfRnVsbFBpdkxVLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX0Z1bGxQaXZMVS5vdXQKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpmdWxsUGl2THUoKSwgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQoKSwgTWF0cml4QmFzZTo6aW52ZXJzZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgRnVsbFBpdkxVCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX3Jvd190eXBlPE1hdHJpeFR5cGUsIEluZGV4Pjo6dHlwZSBJbnRSb3dWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbF90eXBlPE1hdHJpeFR5cGUsIEluZGV4Pjo6dHlwZSBJbnRDb2xWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgUGVybXV0YXRpb25NYXRyaXg8Q29sc0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBQZXJtdXRhdGlvblFUeXBlOworICAgIHR5cGVkZWYgUGVybXV0YXRpb25NYXRyaXg8Um93c0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPiBQZXJtdXRhdGlvblBUeXBlOworCisgICAgLyoqCisgICAgICAqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBMVTo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikuCisgICAgICAqLworICAgIEZ1bGxQaXZMVSgpOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yIHdpdGggbWVtb3J5IHByZWFsbG9jYXRpb24KKyAgICAgICoKKyAgICAgICogTGlrZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBidXQgd2l0aCBwcmVhbGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBkYXRhCisgICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHByb2JsZW0gXGEgc2l6ZS4KKyAgICAgICogXHNhIEZ1bGxQaXZMVSgpCisgICAgICAqLworICAgIEZ1bGxQaXZMVShJbmRleCByb3dzLCBJbmRleCBjb2xzKTsKKworICAgIC8qKiBDb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIG1hdHJpeCB0aGUgbWF0cml4IG9mIHdoaWNoIHRvIGNvbXB1dGUgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqICAgICAgICAgICAgICAgSXQgaXMgcmVxdWlyZWQgdG8gYmUgbm9uemVyby4KKyAgICAgICovCisgICAgRnVsbFBpdkxVKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisKKyAgICAvKiogQ29tcHV0ZXMgdGhlIExVIGRlY29tcG9zaXRpb24gb2YgdGhlIGdpdmVuIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIG1hdHJpeCB0aGUgbWF0cml4IG9mIHdoaWNoIHRvIGNvbXB1dGUgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqICAgICAgICAgICAgICAgSXQgaXMgcmVxdWlyZWQgdG8gYmUgbm9uemVyby4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gKnRoaXMKKyAgICAgICovCisgICAgRnVsbFBpdkxVJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisKKyAgICAvKiogXHJldHVybnMgdGhlIExVIGRlY29tcG9zaXRpb24gbWF0cml4OiB0aGUgdXBwZXItdHJpYW5ndWxhciBwYXJ0IGlzIFUsIHRoZQorICAgICAgKiB1bml0LWxvd2VyLXRyaWFuZ3VsYXIgcGFydCBpcyBMIChhdCBsZWFzdCBmb3Igc3F1YXJlIG1hdHJpY2VzOyBpbiB0aGUgbm9uLXNxdWFyZQorICAgICAgKiBjYXNlLCBzcGVjaWFsIGNhcmUgaXMgbmVlZGVkLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgRnVsbFBpdkxVKS4KKyAgICAgICoKKyAgICAgICogXHNhIG1hdHJpeEwoKSwgbWF0cml4VSgpCisgICAgICAqLworICAgIGlubGluZSBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXhMVSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fbHU7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uemVybyBwaXZvdHMgaW4gdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqIEhlcmUgbm9uemVybyBpcyBtZWFudCBpbiB0aGUgZXhhY3Qgc2Vuc2UsIG5vdCBpbiBhIGZ1enp5IHNlbnNlLgorICAgICAgKiBTbyB0aGF0IG5vdGlvbiBpc24ndCByZWFsbHkgaW50cmluc2ljYWxseSBpbnRlcmVzdGluZywgYnV0IGl0IGlzCisgICAgICAqIHN0aWxsIHVzZWZ1bCB3aGVuIGltcGxlbWVudGluZyBhbGdvcml0aG1zLgorICAgICAgKgorICAgICAgKiBcc2EgcmFuaygpCisgICAgICAqLworICAgIGlubGluZSBJbmRleCBub256ZXJvUGl2b3RzKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9ub256ZXJvX3Bpdm90czsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBiaWdnZXN0IHBpdm90LCBpLmUuIHRoZSBiaWdnZXN0CisgICAgICAqICAgICAgICAgIGRpYWdvbmFsIGNvZWZmaWNpZW50IG9mIFUuCisgICAgICAqLworICAgIFJlYWxTY2FsYXIgbWF4UGl2b3QoKSBjb25zdCB7IHJldHVybiBtX21heHBpdm90OyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHBlcm11dGF0aW9uIG1hdHJpeCBQCisgICAgICAqCisgICAgICAqIFxzYSBwZXJtdXRhdGlvblEoKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUGVybXV0YXRpb25QVHlwZSYgcGVybXV0YXRpb25QKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9wOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgcGVybXV0YXRpb24gbWF0cml4IFEKKyAgICAgICoKKyAgICAgICogXHNhIHBlcm11dGF0aW9uUCgpCisgICAgICAqLworICAgIGlubGluZSBjb25zdCBQZXJtdXRhdGlvblFUeXBlJiBwZXJtdXRhdGlvblEoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX3E7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBrZXJuZWwgb2YgdGhlIG1hdHJpeCwgYWxzbyBjYWxsZWQgaXRzIG51bGwtc3BhY2UuIFRoZSBjb2x1bW5zIG9mIHRoZSByZXR1cm5lZCBtYXRyaXgKKyAgICAgICogd2lsbCBmb3JtIGEgYmFzaXMgb2YgdGhlIGtlcm5lbC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgSWYgdGhlIGtlcm5lbCBoYXMgZGltZW5zaW9uIHplcm8sIHRoZW4gdGhlIHJldHVybmVkIG1hdHJpeCBpcyBhIGNvbHVtbi12ZWN0b3IgZmlsbGVkIHdpdGggemVyb3MuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKgorICAgICAgKiBFeGFtcGxlOiBcaW5jbHVkZSBGdWxsUGl2TFVfa2VybmVsLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBGdWxsUGl2TFVfa2VybmVsLm91dAorICAgICAgKgorICAgICAgKiBcc2EgaW1hZ2UoKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6Omtlcm5lbF9yZXR2YWw8RnVsbFBpdkxVPiBrZXJuZWwoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6a2VybmVsX3JldHZhbDxGdWxsUGl2TFU+KCp0aGlzKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGltYWdlIG9mIHRoZSBtYXRyaXgsIGFsc28gY2FsbGVkIGl0cyBjb2x1bW4tc3BhY2UuIFRoZSBjb2x1bW5zIG9mIHRoZSByZXR1cm5lZCBtYXRyaXgKKyAgICAgICogd2lsbCBmb3JtIGEgYmFzaXMgb2YgdGhlIGtlcm5lbC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIG9yaWdpbmFsTWF0cml4IHRoZSBvcmlnaW5hbCBtYXRyaXgsIG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlYXNvbiB3aHkgaXQgaXMgbmVlZGVkIHRvIHBhc3MgaXQgaGVyZSwgaXMgdGhhdCB0aGlzIGFsbG93cworICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYSBsYXJnZSBvcHRpbWl6YXRpb24sIGFzIG90aGVyd2lzZSB0aGlzIG1ldGhvZCB3b3VsZCBuZWVkIHRvIHJlY29uc3RydWN0IGl0CisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBJZiB0aGUgaW1hZ2UgaGFzIGRpbWVuc2lvbiB6ZXJvLCB0aGVuIHRoZSByZXR1cm5lZCBtYXRyaXggaXMgYSBjb2x1bW4tdmVjdG9yIGZpbGxlZCB3aXRoIHplcm9zLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgRnVsbFBpdkxVX2ltYWdlLmNwcAorICAgICAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBGdWxsUGl2TFVfaW1hZ2Uub3V0CisgICAgICAqCisgICAgICAqIFxzYSBrZXJuZWwoKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OmltYWdlX3JldHZhbDxGdWxsUGl2TFU+CisgICAgICBpbWFnZShjb25zdCBNYXRyaXhUeXBlJiBvcmlnaW5hbE1hdHJpeCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OmltYWdlX3JldHZhbDxGdWxsUGl2TFU+KCp0aGlzLCBvcmlnaW5hbE1hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm4gYSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBBeD1iLCB3aGVyZSBBIGlzIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxwYXJhbSBiIHRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGVxdWF0aW9uIHRvIHNvbHZlLiBDYW4gYmUgYSB2ZWN0b3Igb3IgYSBtYXRyaXgsCisgICAgICAqICAgICAgICAgIHRoZSBvbmx5IHJlcXVpcmVtZW50IGluIG9yZGVyIGZvciB0aGUgZXF1YXRpb24gdG8gbWFrZSBzZW5zZSBpcyB0aGF0CisgICAgICAqICAgICAgICAgIGIucm93cygpPT1BLnJvd3MoKSwgd2hlcmUgQSBpcyB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBhIHNvbHV0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZV9hYm91dF9jaGVja2luZ19zb2x1dGlvbnMKKyAgICAgICoKKyAgICAgICogXG5vdGVfYWJvdXRfYXJiaXRyYXJ5X2Nob2ljZV9vZl9zb2x1dGlvbgorICAgICAgKiBcbm90ZV9hYm91dF91c2luZ19rZXJuZWxfdG9fc3R1ZHlfbXVsdGlwbGVfc29sdXRpb25zCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEZ1bGxQaXZMVV9zb2x2ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRnVsbFBpdkxVX3NvbHZlLm91dAorICAgICAgKgorICAgICAgKiBcc2EgVHJpYW5ndWxhclZpZXc6OnNvbHZlKCksIGtlcm5lbCgpLCBpbnZlcnNlKCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPEZ1bGxQaXZMVSwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxGdWxsUGl2TFUsIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIExVIGRlY29tcG9zaXRpb24uIEl0IGhhcyBvbmx5IGxpbmVhciBjb21wbGV4aXR5CisgICAgICAqICh0aGF0IGlzLCBPKG4pIHdoZXJlIG4gaXMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3F1YXJlIG1hdHJpeCkKKyAgICAgICogYXMgdGhlIExVIGRlY29tcG9zaXRpb24gaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBpcyBvbmx5IGZvciBzcXVhcmUgbWF0cmljZXMuCisgICAgICAqCisgICAgICAqIFxub3RlIEZvciBmaXhlZC1zaXplIG1hdHJpY2VzIG9mIHNpemUgdXAgdG8gNCwgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQoKSBvZmZlcnMKKyAgICAgICogICAgICAgb3B0aW1pemVkIHBhdGhzLgorICAgICAgKgorICAgICAgKiBcd2FybmluZyBhIGRldGVybWluYW50IGNhbiBiZSB2ZXJ5IGJpZyBvciBzbWFsbCwgc28gZm9yIG1hdHJpY2VzCisgICAgICAqIG9mIGxhcmdlIGVub3VnaCBkaW1lbnNpb24sIHRoZXJlIGlzIGEgcmlzayBvZiBvdmVyZmxvdy91bmRlcmZsb3cuCisgICAgICAqCisgICAgICAqIFxzYSBNYXRyaXhCYXNlOjpkZXRlcm1pbmFudCgpCisgICAgICAqLworICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhciBkZXRlcm1pbmFudCgpIGNvbnN0OworCisgICAgLyoqIEFsbG93cyB0byBwcmVzY3JpYmUgYSB0aHJlc2hvbGQgdG8gYmUgdXNlZCBieSBjZXJ0YWluIG1ldGhvZHMsIHN1Y2ggYXMgcmFuaygpLAorICAgICAgKiB3aG8gbmVlZCB0byBkZXRlcm1pbmUgd2hlbiBwaXZvdHMgYXJlIHRvIGJlIGNvbnNpZGVyZWQgbm9uemVyby4gVGhpcyBpcyBub3QgdXNlZCBmb3IgdGhlCisgICAgICAqIExVIGRlY29tcG9zaXRpb24gaXRzZWxmLgorICAgICAgKgorICAgICAgKiBXaGVuIGl0IG5lZWRzIHRvIGdldCB0aGUgdGhyZXNob2xkIHZhbHVlLCBFaWdlbiBjYWxscyB0aHJlc2hvbGQoKS4gQnkgZGVmYXVsdCwgdGhpcworICAgICAgKiB1c2VzIGEgZm9ybXVsYSB0byBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBhIHJlYXNvbmFibGUgdGhyZXNob2xkLgorICAgICAgKiBPbmNlIHlvdSBoYXZlIGNhbGxlZCB0aGUgcHJlc2VudCBtZXRob2Qgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKSwKKyAgICAgICogeW91ciB2YWx1ZSBpcyB1c2VkIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIFxwYXJhbSB0aHJlc2hvbGQgVGhlIG5ldyB2YWx1ZSB0byB1c2UgYXMgdGhlIHRocmVzaG9sZC4KKyAgICAgICoKKyAgICAgICogQSBwaXZvdCB3aWxsIGJlIGNvbnNpZGVyZWQgbm9uemVybyBpZiBpdHMgYWJzb2x1dGUgdmFsdWUgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuCisgICAgICAqICBcZiQgXHZlcnQgcGl2b3QgXHZlcnQgXGxlcXNsYW50IHRocmVzaG9sZCBcdGltZXMgXHZlcnQgbWF4cGl2b3QgXHZlcnQgXGYkCisgICAgICAqIHdoZXJlIG1heHBpdm90IGlzIHRoZSBiaWdnZXN0IHBpdm90LgorICAgICAgKgorICAgICAgKiBJZiB5b3Ugd2FudCB0byBjb21lIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGNhbGwgc2V0VGhyZXNob2xkKERlZmF1bHRfdCkKKyAgICAgICovCisgICAgRnVsbFBpdkxVJiBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYgdGhyZXNob2xkKQorICAgIHsKKyAgICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZCA9IHRydWU7CisgICAgICBtX3ByZXNjcmliZWRUaHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIEFsbG93cyB0byBjb21lIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGxldHRpbmcgRWlnZW4gdXNlIGl0cyBkZWZhdWx0IGZvcm11bGEgZm9yCisgICAgICAqIGRldGVybWluaW5nIHRoZSB0aHJlc2hvbGQuCisgICAgICAqCisgICAgICAqIFlvdSBzaG91bGQgcGFzcyB0aGUgc3BlY2lhbCBvYmplY3QgRWlnZW46OkRlZmF1bHQgYXMgcGFyYW1ldGVyIGhlcmUuCisgICAgICAqIFxjb2RlIGx1LnNldFRocmVzaG9sZChFaWdlbjo6RGVmYXVsdCk7IFxlbmRjb2RlCisgICAgICAqCisgICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBGdWxsUGl2TFUmIHNldFRocmVzaG9sZChEZWZhdWx0X3QpCisgICAgeworICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkID0gZmFsc2U7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHRocmVzaG9sZCB0aGF0IHdpbGwgYmUgdXNlZCBieSBjZXJ0YWluIG1ldGhvZHMgc3VjaCBhcyByYW5rKCkuCisgICAgICAqCisgICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBSZWFsU2NhbGFyIHRocmVzaG9sZCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCB8fCBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQpOworICAgICAgcmV0dXJuIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZCA/IG1fcHJlc2NyaWJlZFRocmVzaG9sZAorICAgICAgLy8gdGhpcyBmb3JtdWxhIGNvbWVzIGZyb20gZXhwZXJpbWVudGluZyAoc2VlICJMVSBwcmVjaXNpb24gdHVuaW5nIiB0aHJlYWQgb24gdGhlIGxpc3QpCisgICAgICAvLyBhbmQgdHVybnMgb3V0IHRvIGJlIGlkZW50aWNhbCB0byBIaWdoYW0ncyBmb3JtdWxhIHVzZWQgYWxyZWFkeSBpbiBMREx0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiBtX2x1LmRpYWdvbmFsU2l6ZSgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgcmFuayBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IHJhbmsoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIFJlYWxTY2FsYXIgcHJlbXVsdGlwbGllZF90aHJlc2hvbGQgPSBpbnRlcm5hbDo6YWJzKG1fbWF4cGl2b3QpICogdGhyZXNob2xkKCk7CisgICAgICBJbmRleCByZXN1bHQgPSAwOworICAgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbV9ub256ZXJvX3Bpdm90czsgKytpKQorICAgICAgICByZXN1bHQgKz0gKGludGVybmFsOjphYnMobV9sdS5jb2VmZihpLGkpKSA+IHByZW11bHRpcGxpZWRfdGhyZXNob2xkKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBkaW1lbnNpb24gb2YgdGhlIGtlcm5lbCBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IGRpbWVuc2lvbk9mS2VybmVsKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gY29scygpIC0gcmFuaygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIExVIGRlY29tcG9zaXRpb24gcmVwcmVzZW50cyBhbiBpbmplY3RpdmUKKyAgICAgICogICAgICAgICAgbGluZWFyIG1hcCwgaS5lLiBoYXMgdHJpdmlhbCBrZXJuZWw7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaGFzIHRvIGRldGVybWluZSB3aGljaCBwaXZvdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICAgICogICAgICAgRm9yIHRoYXQsIGl0IHVzZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSB0aGF0IHlvdSBjYW4gY29udHJvbCBieSBjYWxsaW5nCisgICAgICAqICAgICAgIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgICAqLworICAgIGlubGluZSBib29sIGlzSW5qZWN0aXZlKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gcmFuaygpID09IGNvbHMoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uIHJlcHJlc2VudHMgYSBzdXJqZWN0aXZlCisgICAgICAqICAgICAgICAgIGxpbmVhciBtYXA7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaGFzIHRvIGRldGVybWluZSB3aGljaCBwaXZvdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICAgICogICAgICAgRm9yIHRoYXQsIGl0IHVzZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSB0aGF0IHlvdSBjYW4gY29udHJvbCBieSBjYWxsaW5nCisgICAgICAqICAgICAgIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgICAqLworICAgIGlubGluZSBib29sIGlzU3VyamVjdGl2ZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIHJhbmsoKSA9PSByb3dzKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgTFUgZGVjb21wb3NpdGlvbiBpcyBpbnZlcnRpYmxlLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNJbnZlcnRpYmxlKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gaXNJbmplY3RpdmUoKSAmJiAobV9sdS5yb3dzKCkgPT0gbV9sdS5jb2xzKCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBJZiB0aGlzIG1hdHJpeCBpcyBub3QgaW52ZXJ0aWJsZSwgdGhlIHJldHVybmVkIG1hdHJpeCBoYXMgdW5kZWZpbmVkIGNvZWZmaWNpZW50cy4KKyAgICAgICogICAgICAgVXNlIGlzSW52ZXJ0aWJsZSgpIHRvIGZpcnN0IGRldGVybWluZSB3aGV0aGVyIHRoaXMgbWF0cml4IGlzIGludmVydGlibGUuCisgICAgICAqCisgICAgICAqIFxzYSBNYXRyaXhCYXNlOjppbnZlcnNlKCkKKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjpzb2x2ZV9yZXR2YWw8RnVsbFBpdkxVLHR5cGVuYW1lIE1hdHJpeFR5cGU6OklkZW50aXR5UmV0dXJuVHlwZT4gaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fbHUucm93cygpID09IG1fbHUuY29scygpICYmICJZb3UgY2FuJ3QgdGFrZSB0aGUgaW52ZXJzZSBvZiBhIG5vbi1zcXVhcmUgbWF0cml4ISIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8RnVsbFBpdkxVLHR5cGVuYW1lIE1hdHJpeFR5cGU6OklkZW50aXR5UmV0dXJuVHlwZT4KKyAgICAgICAgICAgICAgICgqdGhpcywgTWF0cml4VHlwZTo6SWRlbnRpdHkobV9sdS5yb3dzKCksIG1fbHUuY29scygpKSk7CisgICAgfQorCisgICAgTWF0cml4VHlwZSByZWNvbnN0cnVjdGVkTWF0cml4KCkgY29uc3Q7CisKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbHUucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2x1LmNvbHMoKTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBNYXRyaXhUeXBlIG1fbHU7CisgICAgUGVybXV0YXRpb25QVHlwZSBtX3A7CisgICAgUGVybXV0YXRpb25RVHlwZSBtX3E7CisgICAgSW50Q29sVmVjdG9yVHlwZSBtX3Jvd3NUcmFuc3Bvc2l0aW9uczsKKyAgICBJbnRSb3dWZWN0b3JUeXBlIG1fY29sc1RyYW5zcG9zaXRpb25zOworICAgIEluZGV4IG1fZGV0X3BxLCBtX25vbnplcm9fcGl2b3RzOworICAgIFJlYWxTY2FsYXIgbV9tYXhwaXZvdCwgbV9wcmVzY3JpYmVkVGhyZXNob2xkOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkLCBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorRnVsbFBpdkxVPE1hdHJpeFR5cGU+OjpGdWxsUGl2TFUoKQorICA6IG1faXNJbml0aWFsaXplZChmYWxzZSksIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZChmYWxzZSkKK3sKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0Z1bGxQaXZMVTxNYXRyaXhUeXBlPjo6RnVsbFBpdkxVKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCisgIDogbV9sdShyb3dzLCBjb2xzKSwKKyAgICBtX3Aocm93cyksCisgICAgbV9xKGNvbHMpLAorICAgIG1fcm93c1RyYW5zcG9zaXRpb25zKHJvd3MpLAorICAgIG1fY29sc1RyYW5zcG9zaXRpb25zKGNvbHMpLAorICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKGZhbHNlKQoreworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorRnVsbFBpdkxVPE1hdHJpeFR5cGU+OjpGdWxsUGl2TFUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICA6IG1fbHUobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSksCisgICAgbV9wKG1hdHJpeC5yb3dzKCkpLAorICAgIG1fcShtYXRyaXguY29scygpKSwKKyAgICBtX3Jvd3NUcmFuc3Bvc2l0aW9ucyhtYXRyaXgucm93cygpKSwKKyAgICBtX2NvbHNUcmFuc3Bvc2l0aW9ucyhtYXRyaXguY29scygpKSwKKyAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZChmYWxzZSkKK3sKKyAgY29tcHV0ZShtYXRyaXgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorRnVsbFBpdkxVPE1hdHJpeFR5cGU+JiBGdWxsUGl2TFU8TWF0cml4VHlwZT46OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQoreworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICBtX2x1ID0gbWF0cml4OworCisgIGNvbnN0IEluZGV4IHNpemUgPSBtYXRyaXguZGlhZ29uYWxTaXplKCk7CisgIGNvbnN0IEluZGV4IHJvd3MgPSBtYXRyaXgucm93cygpOworICBjb25zdCBJbmRleCBjb2xzID0gbWF0cml4LmNvbHMoKTsKKworICAvLyB3aWxsIHN0b3JlIHRoZSB0cmFuc3Bvc2l0aW9ucywgYmVmb3JlIHdlIGFjY3VtdWxhdGUgdGhlbSBhdCB0aGUgZW5kLgorICAvLyBjYW4ndCBhY2N1bXVsYXRlIG9uLXRoZS1mbHkgYmVjYXVzZSB0aGF0IHdpbGwgYmUgZG9uZSBpbiByZXZlcnNlIG9yZGVyIGZvciB0aGUgcm93cy4KKyAgbV9yb3dzVHJhbnNwb3NpdGlvbnMucmVzaXplKG1hdHJpeC5yb3dzKCkpOworICBtX2NvbHNUcmFuc3Bvc2l0aW9ucy5yZXNpemUobWF0cml4LmNvbHMoKSk7CisgIEluZGV4IG51bWJlcl9vZl90cmFuc3Bvc2l0aW9ucyA9IDA7IC8vIG51bWJlciBvZiBOT05UUklWSUFMIHRyYW5zcG9zaXRpb25zLCBpLmUuIG1fcm93c1RyYW5zcG9zaXRpb25zW2ldIT1pCisKKyAgbV9ub256ZXJvX3Bpdm90cyA9IHNpemU7IC8vIHRoZSBnZW5lcmljIGNhc2UgaXMgdGhhdCBpbiB3aGljaCBhbGwgcGl2b3RzIGFyZSBub256ZXJvIChpbnZlcnRpYmxlIGNhc2UpCisgIG1fbWF4cGl2b3QgPSBSZWFsU2NhbGFyKDApOworCisgIGZvcihJbmRleCBrID0gMDsgayA8IHNpemU7ICsraykKKyAgeworICAgIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIGZpbmQgdGhlIHBpdm90LgorCisgICAgLy8gYmlnZ2VzdCBjb2VmZmljaWVudCBpbiB0aGUgcmVtYWluaW5nIGJvdHRvbS1yaWdodCBjb3JuZXIgKHN0YXJ0aW5nIGF0IHJvdyBrLCBjb2wgaykKKyAgICBJbmRleCByb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIsIGNvbF9vZl9iaWdnZXN0X2luX2Nvcm5lcjsKKyAgICBSZWFsU2NhbGFyIGJpZ2dlc3RfaW5fY29ybmVyOworICAgIGJpZ2dlc3RfaW5fY29ybmVyID0gbV9sdS5ib3R0b21SaWdodENvcm5lcihyb3dzLWssIGNvbHMtaykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jd2lzZUFicygpCisgICAgICAgICAgICAgICAgICAgICAgICAubWF4Q29lZmYoJnJvd19vZl9iaWdnZXN0X2luX2Nvcm5lciwgJmNvbF9vZl9iaWdnZXN0X2luX2Nvcm5lcik7CisgICAgcm93X29mX2JpZ2dlc3RfaW5fY29ybmVyICs9IGs7IC8vIGNvcnJlY3QgdGhlIHZhbHVlcyEgc2luY2UgdGhleSB3ZXJlIGNvbXB1dGVkIGluIHRoZSBjb3JuZXIsCisgICAgY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyICs9IGs7IC8vIG5lZWQgdG8gYWRkIGsgdG8gdGhlbS4KKworICAgIGlmKGJpZ2dlc3RfaW5fY29ybmVyPT1SZWFsU2NhbGFyKDApKQorICAgIHsKKyAgICAgIC8vIGJlZm9yZSBleGl0aW5nLCBtYWtlIHN1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgc3RpbGwgdW5pbml0aWFsaXplZCB0cmFuc3Bvc2l0aW9ucworICAgICAgLy8gaW4gYSBzYW5lIHN0YXRlIHdpdGhvdXQgZGVzdHJveWluZyB3aGF0IHdlIGFscmVhZHkgaGF2ZS4KKyAgICAgIG1fbm9uemVyb19waXZvdHMgPSBrOworICAgICAgZm9yKEluZGV4IGkgPSBrOyBpIDwgc2l6ZTsgKytpKQorICAgICAgeworICAgICAgICBtX3Jvd3NUcmFuc3Bvc2l0aW9ucy5jb2VmZlJlZihpKSA9IGk7CisgICAgICAgIG1fY29sc1RyYW5zcG9zaXRpb25zLmNvZWZmUmVmKGkpID0gaTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmKGJpZ2dlc3RfaW5fY29ybmVyID4gbV9tYXhwaXZvdCkgbV9tYXhwaXZvdCA9IGJpZ2dlc3RfaW5fY29ybmVyOworCisgICAgLy8gTm93IHRoYXQgd2UndmUgZm91bmQgdGhlIHBpdm90LCB3ZSBuZWVkIHRvIGFwcGx5IHRoZSByb3cvY29sIHN3YXBzIHRvCisgICAgLy8gYnJpbmcgaXQgdG8gdGhlIGxvY2F0aW9uIChrLGspLgorCisgICAgbV9yb3dzVHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaykgPSByb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXI7CisgICAgbV9jb2xzVHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaykgPSBjb2xfb2ZfYmlnZ2VzdF9pbl9jb3JuZXI7CisgICAgaWYoayAhPSByb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpIHsKKyAgICAgIG1fbHUucm93KGspLnN3YXAobV9sdS5yb3cocm93X29mX2JpZ2dlc3RfaW5fY29ybmVyKSk7CisgICAgICArK251bWJlcl9vZl90cmFuc3Bvc2l0aW9uczsKKyAgICB9CisgICAgaWYoayAhPSBjb2xfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpIHsKKyAgICAgIG1fbHUuY29sKGspLnN3YXAobV9sdS5jb2woY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyKSk7CisgICAgICArK251bWJlcl9vZl90cmFuc3Bvc2l0aW9uczsKKyAgICB9CisKKyAgICAvLyBOb3cgdGhhdCB0aGUgcGl2b3QgaXMgYXQgdGhlIHJpZ2h0IGxvY2F0aW9uLCB3ZSB1cGRhdGUgdGhlIHJlbWFpbmluZworICAgIC8vIGJvdHRvbS1yaWdodCBjb3JuZXIgYnkgR2F1c3NpYW4gZWxpbWluYXRpb24uCisKKyAgICBpZihrPHJvd3MtMSkKKyAgICAgIG1fbHUuY29sKGspLnRhaWwocm93cy1rLTEpIC89IG1fbHUuY29lZmYoayxrKTsKKyAgICBpZihrPHNpemUtMSkKKyAgICAgIG1fbHUuYmxvY2soaysxLGsrMSxyb3dzLWstMSxjb2xzLWstMSkubm9hbGlhcygpIC09IG1fbHUuY29sKGspLnRhaWwocm93cy1rLTEpICogbV9sdS5yb3coaykudGFpbChjb2xzLWstMSk7CisgIH0KKworICAvLyB0aGUgbWFpbiBsb29wIGlzIG92ZXIsIHdlIHN0aWxsIGhhdmUgdG8gYWNjdW11bGF0ZSB0aGUgdHJhbnNwb3NpdGlvbnMgdG8gZmluZCB0aGUKKyAgLy8gcGVybXV0YXRpb25zIFAgYW5kIFEKKworICBtX3Auc2V0SWRlbnRpdHkocm93cyk7CisgIGZvcihJbmRleCBrID0gc2l6ZS0xOyBrID49IDA7IC0taykKKyAgICBtX3AuYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVSaWdodChrLCBtX3Jvd3NUcmFuc3Bvc2l0aW9ucy5jb2VmZihrKSk7CisKKyAgbV9xLnNldElkZW50aXR5KGNvbHMpOworICBmb3IoSW5kZXggayA9IDA7IGsgPCBzaXplOyArK2spCisgICAgbV9xLmFwcGx5VHJhbnNwb3NpdGlvbk9uVGhlUmlnaHQoaywgbV9jb2xzVHJhbnNwb3NpdGlvbnMuY29lZmYoaykpOworCisgIG1fZGV0X3BxID0gKG51bWJlcl9vZl90cmFuc3Bvc2l0aW9ucyUyKSA/IC0xIDogMTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIEZ1bGxQaXZMVTxNYXRyaXhUeXBlPjo6ZGV0ZXJtaW5hbnQoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIGVpZ2VuX2Fzc2VydChtX2x1LnJvd3MoKSA9PSBtX2x1LmNvbHMoKSAmJiAiWW91IGNhbid0IHRha2UgdGhlIGRldGVybWluYW50IG9mIGEgbm9uLXNxdWFyZSBtYXRyaXghIik7CisgIHJldHVybiBTY2FsYXIobV9kZXRfcHEpICogU2NhbGFyKG1fbHUuZGlhZ29uYWwoKS5wcm9kKCkpOworfQorCisvKiogXHJldHVybnMgdGhlIG1hdHJpeCByZXByZXNlbnRlZCBieSB0aGUgZGVjb21wb3NpdGlvbiwKKyAqIGkuZS4sIGl0IHJldHVybnMgdGhlIHByb2R1Y3Q6IFBeey0xfSBMIFUgUV57LTF9LgorICogVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgZGVidWcgcHVycG9zZS4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitNYXRyaXhUeXBlIEZ1bGxQaXZMVTxNYXRyaXhUeXBlPjo6cmVjb25zdHJ1Y3RlZE1hdHJpeCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgY29uc3QgSW5kZXggc21hbGxkaW0gPSAoc3RkOjptaW4pKG1fbHUucm93cygpLCBtX2x1LmNvbHMoKSk7CisgIC8vIExVCisgIE1hdHJpeFR5cGUgcmVzKG1fbHUucm93cygpLG1fbHUuY29scygpKTsKKyAgLy8gRklYTUUgdGhlIC50b0RlbnNlTWF0cml4KCkgc2hvdWxkIG5vdCBiZSBuZWVkZWQuLi4KKyAgcmVzID0gbV9sdS5sZWZ0Q29scyhzbWFsbGRpbSkKKyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpCisgICAgICAqIG1fbHUudG9wUm93cyhzbWFsbGRpbSkKKyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCk7CisKKyAgLy8gUF57LTF9KExVKQorICByZXMgPSBtX3AuaW52ZXJzZSgpICogcmVzOworCisgIC8vIChQXnstMX1MVSlRXnstMX0KKyAgcmVzID0gcmVzICogbV9xLmludmVyc2UoKTsKKworICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqIEltcGxlbWVudGF0aW9uIG9mIGtlcm5lbCgpICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitzdHJ1Y3Qga2VybmVsX3JldHZhbDxGdWxsUGl2TFU8X01hdHJpeFR5cGU+ID4KKyAgOiBrZXJuZWxfcmV0dmFsX2Jhc2U8RnVsbFBpdkxVPF9NYXRyaXhUeXBlPiA+Cit7CisgIEVJR0VOX01BS0VfS0VSTkVMX0hFTFBFUlMoRnVsbFBpdkxVPF9NYXRyaXhUeXBlPikKKworICBlbnVtIHsgTWF4U21hbGxEaW1BdENvbXBpbGVUaW1lID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKAorICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSkKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBjb25zdCBJbmRleCBjb2xzID0gZGVjKCkubWF0cml4TFUoKS5jb2xzKCksIGRpbWtlciA9IGNvbHMgLSByYW5rKCk7CisgICAgaWYoZGlta2VyID09IDApCisgICAgeworICAgICAgLy8gVGhlIEtlcm5lbCBpcyBqdXN0IHswfSwgc28gaXQgZG9lc24ndCBoYXZlIGEgYmFzaXMgcHJvcGVybHkgc3BlYWtpbmcsIGJ1dCBsZXQncworICAgICAgLy8gYXZvaWQgY3Jhc2hpbmcvYXNzZXJ0aW5nIGFzIHRoYXQgZGVwZW5kcyBvbiBmbG9hdGluZyBwb2ludCBjYWxjdWxhdGlvbnMuIExldCdzCisgICAgICAvLyBqdXN0IHJldHVybiBhIHNpbmdsZSBjb2x1bW4gdmVjdG9yIGZpbGxlZCB3aXRoIHplcm9zLgorICAgICAgZHN0LnNldFplcm8oKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBMZXQgdXMgdXNlIHRoZSBmb2xsb3dpbmcgbGVtbWE6CisgICAgICAqCisgICAgICAqIExlbW1hOiBJZiB0aGUgbWF0cml4IEEgaGFzIHRoZSBMVSBkZWNvbXBvc2l0aW9uIFBBUSA9IExVLAorICAgICAgKiB0aGVuIEtlciBBID0gUShLZXIgVSkuCisgICAgICAqCisgICAgICAqIFByb29mOiB0cml2aWFsOiBqdXN0IGtlZXAgaW4gbWluZCB0aGF0IFAsIFEsIEwgYXJlIGludmVydGlibGUuCisgICAgICAqLworCisgICAgLyogVGh1cywgYWxsIHdlIG5lZWQgdG8gZG8gaXMgdG8gY29tcHV0ZSBLZXIgVSwgYW5kIHRoZW4gYXBwbHkgUS4KKyAgICAgICoKKyAgICAgICogVSBpcyB1cHBlciB0cmlhbmd1bGFyLCB3aXRoIGVpZ2VudmFsdWVzIHNvcnRlZCBzbyB0aGF0IGFueSB6ZXJvcyBhcHBlYXIgYXQgdGhlIGVuZC4KKyAgICAgICogVGh1cywgdGhlIGRpYWdvbmFsIG9mIFUgZW5kcyB3aXRoIGV4YWN0bHkKKyAgICAgICogZGltS2VyIHplcm8ncy4gTGV0IHVzIHVzZSB0aGF0IHRvIGNvbnN0cnVjdCBkaW1LZXIgbGluZWFybHkKKyAgICAgICogaW5kZXBlbmRlbnQgdmVjdG9ycyBpbiBLZXIgVS4KKyAgICAgICovCisKKyAgICBNYXRyaXg8SW5kZXgsIER5bmFtaWMsIDEsIDAsIE1heFNtYWxsRGltQXRDb21waWxlVGltZSwgMT4gcGl2b3RzKHJhbmsoKSk7CisgICAgUmVhbFNjYWxhciBwcmVtdWx0aXBsaWVkX3RocmVzaG9sZCA9IGRlYygpLm1heFBpdm90KCkgKiBkZWMoKS50aHJlc2hvbGQoKTsKKyAgICBJbmRleCBwID0gMDsKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBkZWMoKS5ub256ZXJvUGl2b3RzKCk7ICsraSkKKyAgICAgIGlmKGFicyhkZWMoKS5tYXRyaXhMVSgpLmNvZWZmKGksaSkpID4gcHJlbXVsdGlwbGllZF90aHJlc2hvbGQpCisgICAgICAgIHBpdm90cy5jb2VmZlJlZihwKyspID0gaTsKKyAgICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQocCA9PSByYW5rKCkpOworCisgICAgLy8gd2UgY29uc3RydWN0IGEgdGVtcG9yYXR5IHRyYXBlem9pZCBtYXRyaXggbSwgYnkgdGFraW5nIHRoZSBVIG1hdHJpeCBhbmQKKyAgICAvLyBwZXJtdXRpbmcgdGhlIHJvd3MgYW5kIGNvbHMgdG8gYnJpbmcgdGhlIG5vbm5lZ2xpZ2libGUgcGl2b3RzIHRvIHRoZSB0b3Agb2YKKyAgICAvLyB0aGUgbWFpbiBkaWFnb25hbC4gV2UgbmVlZCB0aGF0IHRvIGJlIGFibGUgdG8gYXBwbHkgb3VyIHRyaWFuZ3VsYXIgc29sdmVycy4KKyAgICAvLyBGSVhNRSB3aGVuIHdlIGdldCB0cmlhbmd1bGFyVmlldy1mb3ItcmVjdGFuZ3VsYXItbWF0cmljZXMsIHRoaXMgY2FuIGJlIHNpbXBsaWZpZWQKKyAgICBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgICAgICBNYXhTbWFsbERpbUF0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lPgorICAgICAgbShkZWMoKS5tYXRyaXhMVSgpLmJsb2NrKDAsIDAsIHJhbmsoKSwgY29scykpOworICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHJhbmsoKTsgKytpKQorICAgIHsKKyAgICAgIGlmKGkpIG0ucm93KGkpLmhlYWQoaSkuc2V0WmVybygpOworICAgICAgbS5yb3coaSkudGFpbChjb2xzLWkpID0gZGVjKCkubWF0cml4TFUoKS5yb3cocGl2b3RzLmNvZWZmKGkpKS50YWlsKGNvbHMtaSk7CisgICAgfQorICAgIG0uYmxvY2soMCwgMCwgcmFuaygpLCByYW5rKCkpOworICAgIG0uYmxvY2soMCwgMCwgcmFuaygpLCByYW5rKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkuc2V0WmVybygpOworICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHJhbmsoKTsgKytpKQorICAgICAgbS5jb2woaSkuc3dhcChtLmNvbChwaXZvdHMuY29lZmYoaSkpKTsKKworICAgIC8vIG9rLCB3ZSBoYXZlIG91ciB0cmFwZXpvaWQgbWF0cml4LCB3ZSBjYW4gYXBwbHkgdGhlIHRyaWFuZ3VsYXIgc29sdmVyLgorICAgIC8vIG5vdGljZSB0aGF0IHRoZSBtYXRoIGJlaGluZCB0aGlzIHN1Z2dlc3RzIHRoYXQgd2Ugc2hvdWxkIGFwcGx5IHRoaXMgdG8gdGhlCisgICAgLy8gbmVnYXRpdmUgb2YgdGhlIFJIUywgYnV0IGZvciBwZXJmb3JtYW5jZSB3ZSBqdXN0IHB1dCB0aGUgbmVnYXRpdmUgc2lnbiBlbHNld2hlcmUsIHNlZSBiZWxvdy4KKyAgICBtLnRvcExlZnRDb3JuZXIocmFuaygpLCByYW5rKCkpCisgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZUluUGxhY2UoCisgICAgICAgIG0udG9wUmlnaHRDb3JuZXIocmFuaygpLCBkaW1rZXIpCisgICAgICApOworCisgICAgLy8gbm93IHdlIG11c3QgdW5kbyB0aGUgY29sdW1uIHBlcm11dGF0aW9uIHRoYXQgd2UgaGFkIGFwcGxpZWQhCisgICAgZm9yKEluZGV4IGkgPSByYW5rKCktMTsgaSA+PSAwOyAtLWkpCisgICAgICBtLmNvbChpKS5zd2FwKG0uY29sKHBpdm90cy5jb2VmZihpKSkpOworCisgICAgLy8gc2VlIHRoZSBuZWdhdGl2ZSBzaWduIGluIHRoZSBuZXh0IGxpbmUsIHRoYXQncyB3aGF0IHdlIHdlcmUgdGFsa2luZyBhYm91dCBhYm92ZS4KKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCByYW5rKCk7ICsraSkgZHN0LnJvdyhkZWMoKS5wZXJtdXRhdGlvblEoKS5pbmRpY2VzKCkuY29lZmYoaSkpID0gLW0ucm93KGkpLnRhaWwoZGlta2VyKTsKKyAgICBmb3IoSW5kZXggaSA9IHJhbmsoKTsgaSA8IGNvbHM7ICsraSkgZHN0LnJvdyhkZWMoKS5wZXJtdXRhdGlvblEoKS5pbmRpY2VzKCkuY29lZmYoaSkpLnNldFplcm8oKTsKKyAgICBmb3IoSW5kZXggayA9IDA7IGsgPCBkaW1rZXI7ICsraykgZHN0LmNvZWZmUmVmKGRlYygpLnBlcm11dGF0aW9uUSgpLmluZGljZXMoKS5jb2VmZihyYW5rKCkrayksIGspID0gU2NhbGFyKDEpOworICB9Cit9OworCisvKioqKiogSW1wbGVtZW50YXRpb24gb2YgaW1hZ2UoKSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitzdHJ1Y3QgaW1hZ2VfcmV0dmFsPEZ1bGxQaXZMVTxfTWF0cml4VHlwZT4gPgorICA6IGltYWdlX3JldHZhbF9iYXNlPEZ1bGxQaXZMVTxfTWF0cml4VHlwZT4gPgoreworICBFSUdFTl9NQUtFX0lNQUdFX0hFTFBFUlMoRnVsbFBpdkxVPF9NYXRyaXhUeXBlPikKKworICBlbnVtIHsgTWF4U21hbGxEaW1BdENvbXBpbGVUaW1lID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKAorICAgICAgICAgICAgTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSkKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBpZihyYW5rKCkgPT0gMCkKKyAgICB7CisgICAgICAvLyBUaGUgSW1hZ2UgaXMganVzdCB7MH0sIHNvIGl0IGRvZXNuJ3QgaGF2ZSBhIGJhc2lzIHByb3Blcmx5IHNwZWFraW5nLCBidXQgbGV0J3MKKyAgICAgIC8vIGF2b2lkIGNyYXNoaW5nL2Fzc2VydGluZyBhcyB0aGF0IGRlcGVuZHMgb24gZmxvYXRpbmcgcG9pbnQgY2FsY3VsYXRpb25zLiBMZXQncworICAgICAgLy8ganVzdCByZXR1cm4gYSBzaW5nbGUgY29sdW1uIHZlY3RvciBmaWxsZWQgd2l0aCB6ZXJvcy4KKyAgICAgIGRzdC5zZXRaZXJvKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTWF0cml4PEluZGV4LCBEeW5hbWljLCAxLCAwLCBNYXhTbWFsbERpbUF0Q29tcGlsZVRpbWUsIDE+IHBpdm90cyhyYW5rKCkpOworICAgIFJlYWxTY2FsYXIgcHJlbXVsdGlwbGllZF90aHJlc2hvbGQgPSBkZWMoKS5tYXhQaXZvdCgpICogZGVjKCkudGhyZXNob2xkKCk7CisgICAgSW5kZXggcCA9IDA7CisgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgZGVjKCkubm9uemVyb1Bpdm90cygpOyArK2kpCisgICAgICBpZihhYnMoZGVjKCkubWF0cml4TFUoKS5jb2VmZihpLGkpKSA+IHByZW11bHRpcGxpZWRfdGhyZXNob2xkKQorICAgICAgICBwaXZvdHMuY29lZmZSZWYocCsrKSA9IGk7CisgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KHAgPT0gcmFuaygpKTsKKworICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHJhbmsoKTsgKytpKQorICAgICAgZHN0LmNvbChpKSA9IG9yaWdpbmFsTWF0cml4KCkuY29sKGRlYygpLnBlcm11dGF0aW9uUSgpLmluZGljZXMoKS5jb2VmZihwaXZvdHMuY29lZmYoaSkpKTsKKyAgfQorfTsKKworLyoqKioqIEltcGxlbWVudGF0aW9uIG9mIHNvbHZlKCkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3Qgc29sdmVfcmV0dmFsPEZ1bGxQaXZMVTxfTWF0cml4VHlwZT4sIFJocz4KKyAgOiBzb2x2ZV9yZXR2YWxfYmFzZTxGdWxsUGl2TFU8X01hdHJpeFR5cGU+LCBSaHM+Cit7CisgIEVJR0VOX01BS0VfU09MVkVfSEVMUEVSUyhGdWxsUGl2TFU8X01hdHJpeFR5cGU+LFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICAvKiBUaGUgZGVjb21wb3NpdGlvbiBQQVEgPSBMVSBjYW4gYmUgcmV3cml0dGVuIGFzIEEgPSBQXnstMX0gTCBVIFFeey0xfS4KKyAgICAgKiBTbyB3ZSBwcm9jZWVkIGFzIGZvbGxvd3M6CisgICAgICogU3RlcCAxOiBjb21wdXRlIGMgPSBQICogcmhzLgorICAgICAqIFN0ZXAgMjogcmVwbGFjZSBjIGJ5IHRoZSBzb2x1dGlvbiB4IHRvIEx4ID0gYy4gRXhpc3RzIGJlY2F1c2UgTCBpcyBpbnZlcnRpYmxlLgorICAgICAqIFN0ZXAgMzogcmVwbGFjZSBjIGJ5IHRoZSBzb2x1dGlvbiB4IHRvIFV4ID0gYy4gTWF5IG9yIG1heSBub3QgZXhpc3QuCisgICAgICogU3RlcCA0OiByZXN1bHQgPSBRICogYzsKKyAgICAgKi8KKworICAgIGNvbnN0IEluZGV4IHJvd3MgPSBkZWMoKS5yb3dzKCksIGNvbHMgPSBkZWMoKS5jb2xzKCksCisgICAgICAgICAgICAgIG5vbnplcm9fcGl2b3RzID0gZGVjKCkubm9uemVyb1Bpdm90cygpOworICAgIGVpZ2VuX2Fzc2VydChyaHMoKS5yb3dzKCkgPT0gcm93cyk7CisgICAgY29uc3QgSW5kZXggc21hbGxkaW0gPSAoc3RkOjptaW4pKHJvd3MsIGNvbHMpOworCisgICAgaWYobm9uemVyb19waXZvdHMgPT0gMCkKKyAgICB7CisgICAgICBkc3Quc2V0WmVybygpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVuYW1lIFJoczo6UGxhaW5PYmplY3QgYyhyaHMoKS5yb3dzKCksIHJocygpLmNvbHMoKSk7CisKKyAgICAvLyBTdGVwIDEKKyAgICBjID0gZGVjKCkucGVybXV0YXRpb25QKCkgKiByaHMoKTsKKworICAgIC8vIFN0ZXAgMgorICAgIGRlYygpLm1hdHJpeExVKCkKKyAgICAgICAgLnRvcExlZnRDb3JuZXIoc21hbGxkaW0sc21hbGxkaW0pCisgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkKKyAgICAgICAgLnNvbHZlSW5QbGFjZShjLnRvcFJvd3Moc21hbGxkaW0pKTsKKyAgICBpZihyb3dzPmNvbHMpCisgICAgeworICAgICAgYy5ib3R0b21Sb3dzKHJvd3MtY29scykKKyAgICAgICAgLT0gZGVjKCkubWF0cml4TFUoKS5ib3R0b21Sb3dzKHJvd3MtY29scykKKyAgICAgICAgICogYy50b3BSb3dzKGNvbHMpOworICAgIH0KKworICAgIC8vIFN0ZXAgMworICAgIGRlYygpLm1hdHJpeExVKCkKKyAgICAgICAgLnRvcExlZnRDb3JuZXIobm9uemVyb19waXZvdHMsIG5vbnplcm9fcGl2b3RzKQorICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKKyAgICAgICAgLnNvbHZlSW5QbGFjZShjLnRvcFJvd3Mobm9uemVyb19waXZvdHMpKTsKKworICAgIC8vIFN0ZXAgNAorICAgIGZvcihJbmRleCBpID0gMDsgaSA8IG5vbnplcm9fcGl2b3RzOyArK2kpCisgICAgICBkc3Qucm93KGRlYygpLnBlcm11dGF0aW9uUSgpLmluZGljZXMoKS5jb2VmZihpKSkgPSBjLnJvdyhpKTsKKyAgICBmb3IoSW5kZXggaSA9IG5vbnplcm9fcGl2b3RzOyBpIDwgZGVjKCkubWF0cml4TFUoKS5jb2xzKCk7ICsraSkKKyAgICAgIGRzdC5yb3coZGVjKCkucGVybXV0YXRpb25RKCkuaW5kaWNlcygpLmNvZWZmKGkpKS5zZXRaZXJvKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKioqKioqKiBNYXRyaXhCYXNlIG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBcbHVfbW9kdWxlCisgICoKKyAgKiBccmV0dXJuIHRoZSBmdWxsLXBpdm90aW5nIExVIGRlY29tcG9zaXRpb24gb2YgXGMgKnRoaXMuCisgICoKKyAgKiBcc2EgY2xhc3MgRnVsbFBpdkxVCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGNvbnN0IEZ1bGxQaXZMVTx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmZ1bGxQaXZMdSgpIGNvbnN0Cit7CisgIHJldHVybiBGdWxsUGl2TFU8UGxhaW5PYmplY3Q+KGV2YWwoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTFVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0xVL0ludmVyc2UuaCBiL0VpZ2VuL3NyYy9MVS9JbnZlcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliOGNkYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9MVS9JbnZlcnNlLmgKQEAgLTAsMCArMSwzOTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0lOVkVSU0VfSAorI2RlZmluZSBFSUdFTl9JTlZFUlNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogR2VuZXJhbCBjYXNlIGltcGxlbWVudGF0aW9uICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZSwgaW50IFNpemUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2UKK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIFJlc3VsdFR5cGUmIHJlc3VsdCkKKyAgeworICAgIHJlc3VsdCA9IG1hdHJpeC5wYXJ0aWFsUGl2THUoKS5pbnZlcnNlKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGUsIGludCBTaXplID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+CitzdHJ1Y3QgY29tcHV0ZV9pbnZlcnNlX2FuZF9kZXRfd2l0aF9jaGVjayB7IC8qIG5vdGhpbmchIGdlbmVyYWwgY2FzZSBub3Qgc3VwcG9ydGVkLiAqLyB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIFNpemUgMSBpbXBsZW1lbnRhdGlvbiAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29tcHV0ZV9pbnZlcnNlPE1hdHJpeFR5cGUsIFJlc3VsdFR5cGUsIDE+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBSZXN1bHRUeXBlJiByZXN1bHQpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgcmVzdWx0LmNvZWZmUmVmKDAsMCkgPSBTY2FsYXIoMSkgLyBtYXRyaXguY29lZmYoMCwwKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2VfYW5kX2RldF93aXRoX2NoZWNrPE1hdHJpeFR5cGUsIFJlc3VsdFR5cGUsIDE+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oCisgICAgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LAorICAgIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXImIGFic0RldGVybWluYW50VGhyZXNob2xkLAorICAgIFJlc3VsdFR5cGUmIHJlc3VsdCwKKyAgICB0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXImIGRldGVybWluYW50LAorICAgIGJvb2wmIGludmVydGlibGUKKyAgKQorICB7CisgICAgZGV0ZXJtaW5hbnQgPSBtYXRyaXguY29lZmYoMCwwKTsKKyAgICBpbnZlcnRpYmxlID0gYWJzKGRldGVybWluYW50KSA+IGFic0RldGVybWluYW50VGhyZXNob2xkOworICAgIGlmKGludmVydGlibGUpIHJlc3VsdC5jb2VmZlJlZigwLDApID0gdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyKDEpIC8gZGV0ZXJtaW5hbnQ7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2l6ZSAyIGltcGxlbWVudGF0aW9uICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK2lubGluZSB2b2lkIGNvbXB1dGVfaW52ZXJzZV9zaXplMl9oZWxwZXIoCisgICAgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBjb25zdCB0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXImIGludmRldCwKKyAgICBSZXN1bHRUeXBlJiByZXN1bHQpCit7CisgIHJlc3VsdC5jb2VmZlJlZigwLDApID0gbWF0cml4LmNvZWZmKDEsMSkgKiBpbnZkZXQ7CisgIHJlc3VsdC5jb2VmZlJlZigxLDApID0gLW1hdHJpeC5jb2VmZigxLDApICogaW52ZGV0OworICByZXN1bHQuY29lZmZSZWYoMCwxKSA9IC1tYXRyaXguY29lZmYoMCwxKSAqIGludmRldDsKKyAgcmVzdWx0LmNvZWZmUmVmKDEsMSkgPSBtYXRyaXguY29lZmYoMCwwKSAqIGludmRldDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2U8TWF0cml4VHlwZSwgUmVzdWx0VHlwZSwgMj4KK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIFJlc3VsdFR5cGUmIHJlc3VsdCkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICBjb25zdCBTY2FsYXIgaW52ZGV0ID0gdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyKDEpIC8gbWF0cml4LmRldGVybWluYW50KCk7CisgICAgY29tcHV0ZV9pbnZlcnNlX3NpemUyX2hlbHBlcihtYXRyaXgsIGludmRldCwgcmVzdWx0KTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2VfYW5kX2RldF93aXRoX2NoZWNrPE1hdHJpeFR5cGUsIFJlc3VsdFR5cGUsIDI+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oCisgICAgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LAorICAgIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXImIGFic0RldGVybWluYW50VGhyZXNob2xkLAorICAgIFJlc3VsdFR5cGUmIGludmVyc2UsCisgICAgdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyJiBkZXRlcm1pbmFudCwKKyAgICBib29sJiBpbnZlcnRpYmxlCisgICkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICBkZXRlcm1pbmFudCA9IG1hdHJpeC5kZXRlcm1pbmFudCgpOworICAgIGludmVydGlibGUgPSBhYnMoZGV0ZXJtaW5hbnQpID4gYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQ7CisgICAgaWYoIWludmVydGlibGUpIHJldHVybjsKKyAgICBjb25zdCBTY2FsYXIgaW52ZGV0ID0gU2NhbGFyKDEpIC8gZGV0ZXJtaW5hbnQ7CisgICAgY29tcHV0ZV9pbnZlcnNlX3NpemUyX2hlbHBlcihtYXRyaXgsIGludmRldCwgaW52ZXJzZSk7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2l6ZSAzIGltcGxlbWVudGF0aW9uICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IGksIGludCBqPgoraW5saW5lIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBjb2ZhY3Rvcl8zeDMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgZW51bSB7CisgICAgaTEgPSAoaSsxKSAlIDMsCisgICAgaTIgPSAoaSsyKSAlIDMsCisgICAgajEgPSAoaisxKSAlIDMsCisgICAgajIgPSAoaisyKSAlIDMKKyAgfTsKKyAgcmV0dXJuIG0uY29lZmYoaTEsIGoxKSAqIG0uY29lZmYoaTIsIGoyKQorICAgICAgIC0gbS5jb2VmZihpMSwgajIpICogbS5jb2VmZihpMiwgajEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgoraW5saW5lIHZvaWQgY29tcHV0ZV9pbnZlcnNlX3NpemUzX2hlbHBlcigKKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsCisgICAgY29uc3QgdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyJiBpbnZkZXQsCisgICAgY29uc3QgTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhciwzLDE+JiBjb2ZhY3RvcnNfY29sMCwKKyAgICBSZXN1bHRUeXBlJiByZXN1bHQpCit7CisgIHJlc3VsdC5yb3coMCkgPSBjb2ZhY3RvcnNfY29sMCAqIGludmRldDsKKyAgcmVzdWx0LmNvZWZmUmVmKDEsMCkgPSAgY29mYWN0b3JfM3gzPE1hdHJpeFR5cGUsMCwxPihtYXRyaXgpICogaW52ZGV0OworICByZXN1bHQuY29lZmZSZWYoMSwxKSA9ICBjb2ZhY3Rvcl8zeDM8TWF0cml4VHlwZSwxLDE+KG1hdHJpeCkgKiBpbnZkZXQ7CisgIHJlc3VsdC5jb2VmZlJlZigxLDIpID0gIGNvZmFjdG9yXzN4MzxNYXRyaXhUeXBlLDIsMT4obWF0cml4KSAqIGludmRldDsKKyAgcmVzdWx0LmNvZWZmUmVmKDIsMCkgPSAgY29mYWN0b3JfM3gzPE1hdHJpeFR5cGUsMCwyPihtYXRyaXgpICogaW52ZGV0OworICByZXN1bHQuY29lZmZSZWYoMiwxKSA9ICBjb2ZhY3Rvcl8zeDM8TWF0cml4VHlwZSwxLDI+KG1hdHJpeCkgKiBpbnZkZXQ7CisgIHJlc3VsdC5jb2VmZlJlZigyLDIpID0gIGNvZmFjdG9yXzN4MzxNYXRyaXhUeXBlLDIsMj4obWF0cml4KSAqIGludmRldDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2U8TWF0cml4VHlwZSwgUmVzdWx0VHlwZSwgMz4KK3sKKyAgc3RhdGljIGlubGluZSB2b2lkIHJ1bihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIFJlc3VsdFR5cGUmIHJlc3VsdCkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLDMsMT4gY29mYWN0b3JzX2NvbDA7CisgICAgY29mYWN0b3JzX2NvbDAuY29lZmZSZWYoMCkgPSAgY29mYWN0b3JfM3gzPE1hdHJpeFR5cGUsMCwwPihtYXRyaXgpOworICAgIGNvZmFjdG9yc19jb2wwLmNvZWZmUmVmKDEpID0gIGNvZmFjdG9yXzN4MzxNYXRyaXhUeXBlLDEsMD4obWF0cml4KTsKKyAgICBjb2ZhY3RvcnNfY29sMC5jb2VmZlJlZigyKSA9ICBjb2ZhY3Rvcl8zeDM8TWF0cml4VHlwZSwyLDA+KG1hdHJpeCk7CisgICAgY29uc3QgU2NhbGFyIGRldCA9IChjb2ZhY3RvcnNfY29sMC5jd2lzZVByb2R1Y3QobWF0cml4LmNvbCgwKSkpLnN1bSgpOworICAgIGNvbnN0IFNjYWxhciBpbnZkZXQgPSBTY2FsYXIoMSkgLyBkZXQ7CisgICAgY29tcHV0ZV9pbnZlcnNlX3NpemUzX2hlbHBlcihtYXRyaXgsIGludmRldCwgY29mYWN0b3JzX2NvbDAsIHJlc3VsdCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29tcHV0ZV9pbnZlcnNlX2FuZF9kZXRfd2l0aF9jaGVjazxNYXRyaXhUeXBlLCBSZXN1bHRUeXBlLCAzPgoreworICBzdGF0aWMgaW5saW5lIHZvaWQgcnVuKAorICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwKKyAgICBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiBhYnNEZXRlcm1pbmFudFRocmVzaG9sZCwKKyAgICBSZXN1bHRUeXBlJiBpbnZlcnNlLAorICAgIHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhciYgZGV0ZXJtaW5hbnQsCisgICAgYm9vbCYgaW52ZXJ0aWJsZQorICApCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgTWF0cml4PFNjYWxhciwzLDE+IGNvZmFjdG9yc19jb2wwOworICAgIGNvZmFjdG9yc19jb2wwLmNvZWZmUmVmKDApID0gIGNvZmFjdG9yXzN4MzxNYXRyaXhUeXBlLDAsMD4obWF0cml4KTsKKyAgICBjb2ZhY3RvcnNfY29sMC5jb2VmZlJlZigxKSA9ICBjb2ZhY3Rvcl8zeDM8TWF0cml4VHlwZSwxLDA+KG1hdHJpeCk7CisgICAgY29mYWN0b3JzX2NvbDAuY29lZmZSZWYoMikgPSAgY29mYWN0b3JfM3gzPE1hdHJpeFR5cGUsMiwwPihtYXRyaXgpOworICAgIGRldGVybWluYW50ID0gKGNvZmFjdG9yc19jb2wwLmN3aXNlUHJvZHVjdChtYXRyaXguY29sKDApKSkuc3VtKCk7CisgICAgaW52ZXJ0aWJsZSA9IGFicyhkZXRlcm1pbmFudCkgPiBhYnNEZXRlcm1pbmFudFRocmVzaG9sZDsKKyAgICBpZighaW52ZXJ0aWJsZSkgcmV0dXJuOworICAgIGNvbnN0IFNjYWxhciBpbnZkZXQgPSBTY2FsYXIoMSkgLyBkZXRlcm1pbmFudDsKKyAgICBjb21wdXRlX2ludmVyc2Vfc2l6ZTNfaGVscGVyKG1hdHJpeCwgaW52ZGV0LCBjb2ZhY3RvcnNfY29sMCwgaW52ZXJzZSk7CisgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiogU2l6ZSA0IGltcGxlbWVudGF0aW9uICoqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgZ2VuZXJhbF9kZXQzX2hlbHBlcgorKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG1hdHJpeCwgaW50IGkxLCBpbnQgaTIsIGludCBpMywgaW50IGoxLCBpbnQgajIsIGludCBqMykKK3sKKyAgcmV0dXJuIG1hdHJpeC5jb2VmZihpMSxqMSkKKyAgICAgICAgICogKG1hdHJpeC5jb2VmZihpMixqMikgKiBtYXRyaXguY29lZmYoaTMsajMpIC0gbWF0cml4LmNvZWZmKGkyLGozKSAqIG1hdHJpeC5jb2VmZihpMyxqMikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgaSwgaW50IGo+CitpbmxpbmUgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIGNvZmFjdG9yXzR4NChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCit7CisgIGVudW0geworICAgIGkxID0gKGkrMSkgJSA0LAorICAgIGkyID0gKGkrMikgJSA0LAorICAgIGkzID0gKGkrMykgJSA0LAorICAgIGoxID0gKGorMSkgJSA0LAorICAgIGoyID0gKGorMikgJSA0LAorICAgIGozID0gKGorMykgJSA0CisgIH07CisgIHJldHVybiBnZW5lcmFsX2RldDNfaGVscGVyKG1hdHJpeCwgaTEsIGkyLCBpMywgajEsIGoyLCBqMykKKyAgICAgICArIGdlbmVyYWxfZGV0M19oZWxwZXIobWF0cml4LCBpMiwgaTMsIGkxLCBqMSwgajIsIGozKQorICAgICAgICsgZ2VuZXJhbF9kZXQzX2hlbHBlcihtYXRyaXgsIGkzLCBpMSwgaTIsIGoxLCBqMiwgajMpOworfQorCit0ZW1wbGF0ZTxpbnQgQXJjaCwgdHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IGNvbXB1dGVfaW52ZXJzZV9zaXplNAoreworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBSZXN1bHRUeXBlJiByZXN1bHQpCisgIHsKKyAgICByZXN1bHQuY29lZmZSZWYoMCwwKSA9ICBjb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwwLDA+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDEsMCkgPSAtY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMCwxPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigyLDApID0gIGNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDAsMj4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMywwKSA9IC1jb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwwLDM+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDAsMikgPSAgY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMiwwPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigxLDIpID0gLWNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDIsMT4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMiwyKSA9ICBjb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwyLDI+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDMsMikgPSAtY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMiwzPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigwLDEpID0gLWNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDEsMD4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMSwxKSA9ICBjb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwxLDE+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDIsMSkgPSAtY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMSwyPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigzLDEpID0gIGNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDEsMz4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMCwzKSA9IC1jb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwzLDA+KG1hdHJpeCk7CisgICAgcmVzdWx0LmNvZWZmUmVmKDEsMykgPSAgY29mYWN0b3JfNHg0PE1hdHJpeFR5cGUsMywxPihtYXRyaXgpOworICAgIHJlc3VsdC5jb2VmZlJlZigyLDMpID0gLWNvZmFjdG9yXzR4NDxNYXRyaXhUeXBlLDMsMj4obWF0cml4KTsKKyAgICByZXN1bHQuY29lZmZSZWYoMywzKSA9ICBjb2ZhY3Rvcl80eDQ8TWF0cml4VHlwZSwzLDM+KG1hdHJpeCk7CisgICAgcmVzdWx0IC89IChtYXRyaXguY29sKDApLmN3aXNlUHJvZHVjdChyZXN1bHQucm93KDApLnRyYW5zcG9zZSgpKSkuc3VtKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29tcHV0ZV9pbnZlcnNlPE1hdHJpeFR5cGUsIFJlc3VsdFR5cGUsIDQ+CisgOiBjb21wdXRlX2ludmVyc2Vfc2l6ZTQ8QXJjaGl0ZWN0dXJlOjpUYXJnZXQsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlLCBSZXN1bHRUeXBlPgoreworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2VfYW5kX2RldF93aXRoX2NoZWNrPE1hdHJpeFR5cGUsIFJlc3VsdFR5cGUsIDQ+Cit7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBydW4oCisgICAgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LAorICAgIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXImIGFic0RldGVybWluYW50VGhyZXNob2xkLAorICAgIFJlc3VsdFR5cGUmIGludmVyc2UsCisgICAgdHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyJiBkZXRlcm1pbmFudCwKKyAgICBib29sJiBpbnZlcnRpYmxlCisgICkKKyAgeworICAgIGRldGVybWluYW50ID0gbWF0cml4LmRldGVybWluYW50KCk7CisgICAgaW52ZXJ0aWJsZSA9IGFicyhkZXRlcm1pbmFudCkgPiBhYnNEZXRlcm1pbmFudFRocmVzaG9sZDsKKyAgICBpZihpbnZlcnRpYmxlKSBjb21wdXRlX2ludmVyc2U8TWF0cml4VHlwZSwgUmVzdWx0VHlwZT46OnJ1bihtYXRyaXgsIGludmVyc2UpOworICB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqIE1hdHJpeEJhc2UgbWV0aG9kcyAqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgdHJhaXRzPGludmVyc2VfaW1wbDxNYXRyaXhUeXBlPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgaW52ZXJzZV9pbXBsIDogcHVibGljIFJldHVybkJ5VmFsdWU8aW52ZXJzZV9pbXBsPE1hdHJpeFR5cGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6ZXZhbDxNYXRyaXhUeXBlPjo6dHlwZSBNYXRyaXhUeXBlTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQ7CisgIE1hdHJpeFR5cGVOZXN0ZWQgbV9tYXRyaXg7CisKKyAgaW52ZXJzZV9pbXBsKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICA6IG1fbWF0cml4KG1hdHJpeCkKKyAge30KKworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBjb25zdCBpbnQgU2l6ZSA9IEVJR0VOX1BMQUlOX0VOVU1fTUlOKE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLERlc3Q6OkNvbHNBdENvbXBpbGVUaW1lKTsKKyAgICBFSUdFTl9PTkxZX1VTRURfRk9SX0RFQlVHKFNpemUpOworICAgIGVpZ2VuX2Fzc2VydCgoIChTaXplPD0xKSB8fCAoU2l6ZT40KSB8fCAoZXh0cmFjdF9kYXRhKG1fbWF0cml4KSE9ZXh0cmFjdF9kYXRhKGRzdCkpKQorICAgICAgICAgICAgICAmJiAiQWxpYXNpbmcgcHJvYmxlbSBkZXRlY3RlZCBpbiBpbnZlcnNlKCksIHlvdSBuZWVkIHRvIGRvIGludmVyc2UoKS5ldmFsKCkgaGVyZS4iKTsKKworICAgIGNvbXB1dGVfaW52ZXJzZTxNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZCwgRGVzdD46OnJ1bihtX21hdHJpeCwgZHN0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiBcbHVfbW9kdWxlCisgICoKKyAgKiBccmV0dXJucyB0aGUgbWF0cml4IGludmVyc2Ugb2YgdGhpcyBtYXRyaXguCisgICoKKyAgKiBGb3Igc21hbGwgZml4ZWQgc2l6ZXMgdXAgdG8gNHg0LCB0aGlzIG1ldGhvZCB1c2VzIGNvZmFjdG9ycy4KKyAgKiBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGlzIG1ldGhvZCB1c2VzIGNsYXNzIFBhcnRpYWxQaXZMVS4KKyAgKgorICAqIFxub3RlIFRoaXMgbWF0cml4IG11c3QgYmUgaW52ZXJ0aWJsZSwgb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiBJZiB5b3UgbmVlZCBhbgorICAqIGludmVydGliaWxpdHkgY2hlY2ssIGRvIHRoZSBmb2xsb3dpbmc6CisgICogXGxpIGZvciBmaXhlZCBzaXplcyB1cCB0byA0eDQsIHVzZSBjb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjaygpLgorICAqIFxsaSBmb3IgdGhlIGdlbmVyYWwgY2FzZSwgdXNlIGNsYXNzIEZ1bGxQaXZMVS4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfaW52ZXJzZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2ludmVyc2Uub3V0CisgICoKKyAgKiBcc2EgY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2soKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBpbnRlcm5hbDo6aW52ZXJzZV9pbXBsPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OmludmVyc2UoKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyLFRISVNfRlVOQ1RJT05fSVNfTk9UX0ZPUl9JTlRFR0VSX05VTUVSSUNfVFlQRVMpCisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgcmV0dXJuIGludGVybmFsOjppbnZlcnNlX2ltcGw8RGVyaXZlZD4oZGVyaXZlZCgpKTsKK30KKworLyoqIFxsdV9tb2R1bGUKKyAgKgorICAqIENvbXB1dGF0aW9uIG9mIG1hdHJpeCBpbnZlcnNlIGFuZCBkZXRlcm1pbmFudCwgd2l0aCBpbnZlcnRpYmlsaXR5IGNoZWNrLgorICAqCisgICogVGhpcyBpcyBvbmx5IGZvciBmaXhlZC1zaXplIHNxdWFyZSBtYXRyaWNlcyBvZiBzaXplIHVwIHRvIDR4NC4KKyAgKgorICAqIFxwYXJhbSBpbnZlcnNlIFJlZmVyZW5jZSB0byB0aGUgbWF0cml4IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBpbnZlcnNlLgorICAqIFxwYXJhbSBkZXRlcm1pbmFudCBSZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIGluIHdoaWNoIHRvIHN0b3JlIHRoZSBpbnZlcnNlLgorICAqIFxwYXJhbSBpbnZlcnRpYmxlIFJlZmVyZW5jZSB0byB0aGUgYm9vbCB2YXJpYWJsZSBpbiB3aGljaCB0byBzdG9yZSB3aGV0aGVyIHRoZSBtYXRyaXggaXMgaW52ZXJ0aWJsZS4KKyAgKiBccGFyYW0gYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQgT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRyb2xsaW5nIHRoZSBpbnZlcnRpYmlsaXR5IGNoZWNrLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF0cml4IHdpbGwgYmUgZGVjbGFyZWQgaW52ZXJ0aWJsZSBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgaXRzCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluYW50IGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHRocmVzaG9sZC4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2suY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjay5vdXQKKyAgKgorICAqIFxzYSBpbnZlcnNlKCksIGNvbXB1dGVJbnZlcnNlV2l0aENoZWNrKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSZXN1bHRUeXBlPgoraW5saW5lIHZvaWQgTWF0cml4QmFzZTxEZXJpdmVkPjo6Y29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2soCisgICAgUmVzdWx0VHlwZSYgaW52ZXJzZSwKKyAgICB0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXImIGRldGVybWluYW50LAorICAgIGJvb2wmIGludmVydGlibGUsCisgICAgY29uc3QgUmVhbFNjYWxhciYgYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQKKyAgKSBjb25zdAoreworICAvLyBpJ2QgbG92ZSB0byBwdXQgc29tZSBzdGF0aWMgYXNzZXJ0aW9ucyB0aGVyZSwgYnV0IFNGSU5BRSBtZWFucyB0aGF0IHRoZXkgaGF2ZSBubyBlZmZlY3QuLi4KKyAgZWlnZW5fYXNzZXJ0KHJvd3MoKSA9PSBjb2xzKCkpOworICAvLyBmb3IgMngyLCBpdCdzIHdvcnRoIGdpdmluZyBhIGNoYW5jZSB0byBhdm9pZCBldmFsdWF0aW5nLgorICAvLyBmb3IgbGFyZ2VyIHNpemVzLCBldmFsdWF0aW5nIGhhcyBuZWdsaWdpYmxlIGNvc3QgYW5kIGxpbWl0cyBjb2RlIHNpemUuCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPAorICAgIFJvd3NBdENvbXBpbGVUaW1lID09IDIsCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8dHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxEZXJpdmVkLCAyPjo6dHlwZT46OnR5cGUsCisgICAgUGxhaW5PYmplY3QKKyAgPjo6dHlwZSBNYXRyaXhUeXBlOworICBpbnRlcm5hbDo6Y29tcHV0ZV9pbnZlcnNlX2FuZF9kZXRfd2l0aF9jaGVjazxNYXRyaXhUeXBlLCBSZXN1bHRUeXBlPjo6cnVuCisgICAgKGRlcml2ZWQoKSwgYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQsIGludmVyc2UsIGRldGVybWluYW50LCBpbnZlcnRpYmxlKTsKK30KKworLyoqIFxsdV9tb2R1bGUKKyAgKgorICAqIENvbXB1dGF0aW9uIG9mIG1hdHJpeCBpbnZlcnNlLCB3aXRoIGludmVydGliaWxpdHkgY2hlY2suCisgICoKKyAgKiBUaGlzIGlzIG9ubHkgZm9yIGZpeGVkLXNpemUgc3F1YXJlIG1hdHJpY2VzIG9mIHNpemUgdXAgdG8gNHg0LgorICAqCisgICogXHBhcmFtIGludmVyc2UgUmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGludmVyc2UuCisgICogXHBhcmFtIGludmVydGlibGUgUmVmZXJlbmNlIHRvIHRoZSBib29sIHZhcmlhYmxlIGluIHdoaWNoIHRvIHN0b3JlIHdoZXRoZXIgdGhlIG1hdHJpeCBpcyBpbnZlcnRpYmxlLgorICAqIFxwYXJhbSBhYnNEZXRlcm1pbmFudFRocmVzaG9sZCBPcHRpb25hbCBwYXJhbWV0ZXIgY29udHJvbGxpbmcgdGhlIGludmVydGliaWxpdHkgY2hlY2suCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXRyaXggd2lsbCBiZSBkZWNsYXJlZCBpbnZlcnRpYmxlIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBpdHMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5hbnQgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdGhyZXNob2xkLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jb21wdXRlSW52ZXJzZVdpdGhDaGVjay5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2NvbXB1dGVJbnZlcnNlV2l0aENoZWNrLm91dAorICAqCisgICogXHNhIGludmVyc2UoKSwgY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2soKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIFJlc3VsdFR5cGU+CitpbmxpbmUgdm9pZCBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjb21wdXRlSW52ZXJzZVdpdGhDaGVjaygKKyAgICBSZXN1bHRUeXBlJiBpbnZlcnNlLAorICAgIGJvb2wmIGludmVydGlibGUsCisgICAgY29uc3QgUmVhbFNjYWxhciYgYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQKKyAgKSBjb25zdAoreworICBSZWFsU2NhbGFyIGRldGVybWluYW50OworICAvLyBpJ2QgbG92ZSB0byBwdXQgc29tZSBzdGF0aWMgYXNzZXJ0aW9ucyB0aGVyZSwgYnV0IFNGSU5BRSBtZWFucyB0aGF0IHRoZXkgaGF2ZSBubyBlZmZlY3QuLi4KKyAgZWlnZW5fYXNzZXJ0KHJvd3MoKSA9PSBjb2xzKCkpOworICBjb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjayhpbnZlcnNlLGRldGVybWluYW50LGludmVydGlibGUsYWJzRGV0ZXJtaW5hbnRUaHJlc2hvbGQpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0lOVkVSU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0xVL1BhcnRpYWxQaXZMVS5oIGIvRWlnZW4vc3JjL0xVL1BhcnRpYWxQaXZMVS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZmY5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvTFUvUGFydGlhbFBpdkxVLmgKQEAgLTAsMCArMSw0OTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BBUlRJQUxMVV9ICisjZGVmaW5lIEVJR0VOX1BBUlRJQUxMVV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgTFVfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgUGFydGlhbFBpdkxVCisgICoKKyAgKiBcYnJpZWYgTFUgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCB3aXRoIHBhcnRpYWwgcGl2b3RpbmcsIGFuZCByZWxhdGVkIGZlYXR1cmVzCisgICoKKyAgKiBccGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoIHdlIGFyZSBjb21wdXRpbmcgdGhlIExVIGRlY29tcG9zaXRpb24KKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIExVIGRlY29tcG9zaXRpb24gb2YgYSBcYiBzcXVhcmUgXGIgaW52ZXJ0aWJsZSBtYXRyaXgsIHdpdGggcGFydGlhbCBwaXZvdGluZzogdGhlIG1hdHJpeCBBCisgICogaXMgZGVjb21wb3NlZCBhcyBBID0gUExVIHdoZXJlIEwgaXMgdW5pdC1sb3dlci10cmlhbmd1bGFyLCBVIGlzIHVwcGVyLXRyaWFuZ3VsYXIsIGFuZCBQCisgICogaXMgYSBwZXJtdXRhdGlvbiBtYXRyaXguCisgICoKKyAgKiBUeXBpY2FsbHksIHBhcnRpYWwgcGl2b3RpbmcgTFUgZGVjb21wb3NpdGlvbiBpcyBvbmx5IGNvbnNpZGVyZWQgbnVtZXJpY2FsbHkgc3RhYmxlIGZvciBzcXVhcmUgaW52ZXJ0aWJsZQorICAqIG1hdHJpY2VzLiBUaHVzIExBUEFDSydzIGRnZXN2IGFuZCBkZ2VzdnggcmVxdWlyZSB0aGUgbWF0cml4IHRvIGJlIHNxdWFyZSBhbmQgaW52ZXJ0aWJsZS4gVGhlIHByZXNlbnQgY2xhc3MKKyAgKiBkb2VzIHRoZSBzYW1lLiBJdCB3aWxsIGFzc2VydCB0aGF0IHRoZSBtYXRyaXggaXMgc3F1YXJlLCBidXQgaXQgd29uJ3QgKGFjdHVhbGx5IGl0IGNhbid0KSBjaGVjayB0aGF0IHRoZQorICAqIG1hdHJpeCBpcyBpbnZlcnRpYmxlOiBpdCBpcyB5b3VyIHRhc2sgdG8gY2hlY2sgdGhhdCB5b3Ugb25seSB1c2UgdGhpcyBkZWNvbXBvc2l0aW9uIG9uIGludmVydGlibGUgbWF0cmljZXMuCisgICoKKyAgKiBUaGUgZ3VhcmFudGVlZCBzYWZlIGFsdGVybmF0aXZlLCB3b3JraW5nIGZvciBhbGwgbWF0cmljZXMsIGlzIHRoZSBmdWxsIHBpdm90aW5nIExVIGRlY29tcG9zaXRpb24sIHByb3ZpZGVkCisgICogYnkgY2xhc3MgRnVsbFBpdkxVLgorICAqCisgICogVGhpcyBpcyBcYiBub3QgYSByYW5rLXJldmVhbGluZyBMVSBkZWNvbXBvc2l0aW9uLiBNYW55IGZlYXR1cmVzIGFyZSBpbnRlbnRpb25hbGx5IGFic2VudCBmcm9tIHRoaXMgY2xhc3MsCisgICogc3VjaCBhcyByYW5rIGNvbXB1dGF0aW9uLiBJZiB5b3UgbmVlZCB0aGVzZSBmZWF0dXJlcywgdXNlIGNsYXNzIEZ1bGxQaXZMVS4KKyAgKgorICAqIFRoaXMgTFUgZGVjb21wb3NpdGlvbiBpcyBzdWl0YWJsZSB0byBpbnZlcnQgaW52ZXJ0aWJsZSBtYXRyaWNlcy4gSXQgaXMgd2hhdCBNYXRyaXhCYXNlOjppbnZlcnNlKCkgdXNlcworICAqIGluIHRoZSBnZW5lcmFsIGNhc2UuCisgICogT24gdGhlIG90aGVyIGhhbmQsIGl0IGlzIFxiIG5vdCBzdWl0YWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIG1hdHJpeCBpcyBpbnZlcnRpYmxlLgorICAqCisgICogVGhlIGRhdGEgb2YgdGhlIExVIGRlY29tcG9zaXRpb24gY2FuIGJlIGRpcmVjdGx5IGFjY2Vzc2VkIHRocm91Z2ggdGhlIG1ldGhvZHMgbWF0cml4TFUoKSwgcGVybXV0YXRpb25QKCkuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6cGFydGlhbFBpdkx1KCksIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCksIE1hdHJpeEJhc2U6OmludmVyc2UoKSwgTWF0cml4QmFzZTo6Y29tcHV0ZUludmVyc2UoKSwgY2xhc3MgRnVsbFBpdkxVCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgUGFydGlhbFBpdkxVCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICBlbnVtIHsKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMsCisgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZQorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBQZXJtdXRhdGlvbk1hdHJpeDxSb3dzQXRDb21waWxlVGltZSwgTWF4Um93c0F0Q29tcGlsZVRpbWU+IFBlcm11dGF0aW9uVHlwZTsKKyAgICB0eXBlZGVmIFRyYW5zcG9zaXRpb25zPFJvd3NBdENvbXBpbGVUaW1lLCBNYXhSb3dzQXRDb21waWxlVGltZT4gVHJhbnNwb3NpdGlvblR5cGU7CisKKworICAgIC8qKgorICAgICogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgKgorICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgdXNlZnVsIGluIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyIGludGVuZHMgdG8KKyAgICAqIHBlcmZvcm0gZGVjb21wb3NpdGlvbnMgdmlhIFBhcnRpYWxQaXZMVTo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikuCisgICAgKi8KKyAgICBQYXJ0aWFsUGl2TFUoKTsKKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAgICAqCisgICAgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIFxhIHNpemUuCisgICAgICAqIFxzYSBQYXJ0aWFsUGl2TFUoKQorICAgICAgKi8KKyAgICBQYXJ0aWFsUGl2TFUoSW5kZXggc2l6ZSk7CisKKyAgICAvKiogQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBtYXRyaXggdGhlIG1hdHJpeCBvZiB3aGljaCB0byBjb21wdXRlIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcd2FybmluZyBUaGUgbWF0cml4IHNob3VsZCBoYXZlIGZ1bGwgcmFuayAoZS5nLiBpZiBpdCdzIHNxdWFyZSwgaXQgc2hvdWxkIGJlIGludmVydGlibGUpLgorICAgICAgKiBJZiB5b3UgbmVlZCB0byBkZWFsIHdpdGggbm9uLWZ1bGwgcmFuaywgdXNlIGNsYXNzIEZ1bGxQaXZMVSBpbnN0ZWFkLgorICAgICAgKi8KKyAgICBQYXJ0aWFsUGl2TFUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTsKKworICAgIFBhcnRpYWxQaXZMVSYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpOworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBMVSBkZWNvbXBvc2l0aW9uIG1hdHJpeDogdGhlIHVwcGVyLXRyaWFuZ3VsYXIgcGFydCBpcyBVLCB0aGUKKyAgICAgICogdW5pdC1sb3dlci10cmlhbmd1bGFyIHBhcnQgaXMgTCAoYXQgbGVhc3QgZm9yIHNxdWFyZSBtYXRyaWNlczsgaW4gdGhlIG5vbi1zcXVhcmUKKyAgICAgICogY2FzZSwgc3BlY2lhbCBjYXJlIGlzIG5lZWRlZCwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIEZ1bGxQaXZMVSkuCisgICAgICAqCisgICAgICAqIFxzYSBtYXRyaXhMKCksIG1hdHJpeFUoKQorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4TFUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlBhcnRpYWxQaXZMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9sdTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHBlcm11dGF0aW9uIG1hdHJpeCBQLgorICAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUGVybXV0YXRpb25UeXBlJiBwZXJtdXRhdGlvblAoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlBhcnRpYWxQaXZMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9wOworICAgIH0KKworICAgIC8qKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBBeD1iLCB3aGVyZSBBIGlzIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIExVIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxwYXJhbSBiIHRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGVxdWF0aW9uIHRvIHNvbHZlLiBDYW4gYmUgYSB2ZWN0b3Igb3IgYSBtYXRyaXgsCisgICAgICAqICAgICAgICAgIHRoZSBvbmx5IHJlcXVpcmVtZW50IGluIG9yZGVyIGZvciB0aGUgZXF1YXRpb24gdG8gbWFrZSBzZW5zZSBpcyB0aGF0CisgICAgICAqICAgICAgICAgIGIucm93cygpPT1BLnJvd3MoKSwgd2hlcmUgQSBpcyB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyB0aGUgc29sdXRpb24uCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIFBhcnRpYWxQaXZMVV9zb2x2ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgUGFydGlhbFBpdkxVX3NvbHZlLm91dAorICAgICAgKgorICAgICAgKiBTaW5jZSB0aGlzIFBhcnRpYWxQaXZMVSBjbGFzcyBhc3N1bWVzIGFueXdheSB0aGF0IHRoZSBtYXRyaXggQSBpcyBpbnZlcnRpYmxlLCB0aGUgc29sdXRpb24KKyAgICAgICogdGhlb3JldGljYWxseSBleGlzdHMgYW5kIGlzIHVuaXF1ZSByZWdhcmRsZXNzIG9mIGIuCisgICAgICAqCisgICAgICAqIFxzYSBUcmlhbmd1bGFyVmlldzo6c29sdmUoKSwgaW52ZXJzZSgpLCBjb21wdXRlSW52ZXJzZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxQYXJ0aWFsUGl2TFUsIFJocz4KKyAgICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiUGFydGlhbFBpdkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPFBhcnRpYWxQaXZMVSwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBMVSBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcd2FybmluZyBUaGUgbWF0cml4IGJlaW5nIGRlY29tcG9zZWQgaGVyZSBpcyBhc3N1bWVkIHRvIGJlIGludmVydGlibGUuIElmIHlvdSBuZWVkIHRvIGNoZWNrIGZvcgorICAgICAgKiAgICAgICAgICBpbnZlcnRpYmlsaXR5LCB1c2UgY2xhc3MgRnVsbFBpdkxVIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIFxzYSBNYXRyaXhCYXNlOjppbnZlcnNlKCksIExVOjppbnZlcnNlKCkKKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjpzb2x2ZV9yZXR2YWw8UGFydGlhbFBpdkxVLHR5cGVuYW1lIE1hdHJpeFR5cGU6OklkZW50aXR5UmV0dXJuVHlwZT4gaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiUGFydGlhbFBpdkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPFBhcnRpYWxQaXZMVSx0eXBlbmFtZSBNYXRyaXhUeXBlOjpJZGVudGl0eVJldHVyblR5cGU+CisgICAgICAgICAgICAgICAoKnRoaXMsIE1hdHJpeFR5cGU6OklkZW50aXR5KG1fbHUucm93cygpLCBtX2x1LmNvbHMoKSkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIG1hdHJpeCBvZiB3aGljaAorICAgICAgKiAqdGhpcyBpcyB0aGUgTFUgZGVjb21wb3NpdGlvbi4gSXQgaGFzIG9ubHkgbGluZWFyIGNvbXBsZXhpdHkKKyAgICAgICogKHRoYXQgaXMsIE8obikgd2hlcmUgbiBpcyB0aGUgZGltZW5zaW9uIG9mIHRoZSBzcXVhcmUgbWF0cml4KQorICAgICAgKiBhcyB0aGUgTFUgZGVjb21wb3NpdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBcbm90ZSBGb3IgZml4ZWQtc2l6ZSBtYXRyaWNlcyBvZiBzaXplIHVwIHRvIDQsIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkgb2ZmZXJzCisgICAgICAqICAgICAgIG9wdGltaXplZCBwYXRocy4KKyAgICAgICoKKyAgICAgICogXHdhcm5pbmcgYSBkZXRlcm1pbmFudCBjYW4gYmUgdmVyeSBiaWcgb3Igc21hbGwsIHNvIGZvciBtYXRyaWNlcworICAgICAgKiBvZiBsYXJnZSBlbm91Z2ggZGltZW5zaW9uLCB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cvdW5kZXJmbG93LgorICAgICAgKgorICAgICAgKiBcc2EgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQoKQorICAgICAgKi8KKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgZGV0ZXJtaW5hbnQoKSBjb25zdDsKKworICAgIE1hdHJpeFR5cGUgcmVjb25zdHJ1Y3RlZE1hdHJpeCgpIGNvbnN0OworCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2x1LnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9sdS5jb2xzKCk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZSBtX2x1OworICAgIFBlcm11dGF0aW9uVHlwZSBtX3A7CisgICAgVHJhbnNwb3NpdGlvblR5cGUgbV9yb3dzVHJhbnNwb3NpdGlvbnM7CisgICAgSW5kZXggbV9kZXRfcDsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitQYXJ0aWFsUGl2TFU8TWF0cml4VHlwZT46OlBhcnRpYWxQaXZMVSgpCisgIDogbV9sdSgpLAorICAgIG1fcCgpLAorICAgIG1fcm93c1RyYW5zcG9zaXRpb25zKCksCisgICAgbV9kZXRfcCgwKSwKKyAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCit7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitQYXJ0aWFsUGl2TFU8TWF0cml4VHlwZT46OlBhcnRpYWxQaXZMVShJbmRleCBzaXplKQorICA6IG1fbHUoc2l6ZSwgc2l6ZSksCisgICAgbV9wKHNpemUpLAorICAgIG1fcm93c1RyYW5zcG9zaXRpb25zKHNpemUpLAorICAgIG1fZGV0X3AoMCksCisgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQoreworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorUGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+OjpQYXJ0aWFsUGl2TFUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICA6IG1fbHUobWF0cml4LnJvd3MoKSwgbWF0cml4LnJvd3MoKSksCisgICAgbV9wKG1hdHJpeC5yb3dzKCkpLAorICAgIG1fcm93c1RyYW5zcG9zaXRpb25zKG1hdHJpeC5yb3dzKCkpLAorICAgIG1fZGV0X3AoMCksCisgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQoreworICBjb21wdXRlKG1hdHJpeCk7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwgVGhpcyBpcyB0aGUgYmxvY2tlZCB2ZXJzaW9uIG9mIGZ1bGxwaXZsdV91bmJsb2NrZWQoKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgU3RvcmFnZU9yZGVyLCB0eXBlbmFtZSBQaXZJbmRleD4KK3N0cnVjdCBwYXJ0aWFsX2x1X2ltcGwKK3sKKyAgLy8gRklYTUUgYWRkIGEgc3RyaWRlIHRvIE1hcCwgc28gdGhhdCB0aGUgZm9sbG93aW5nIG1hcHBpbmcgYmVjb21lcyBlYXNpZXIsCisgIC8vIGFub3RoZXIgb3B0aW9uIHdvdWxkIGJlIHRvIGNyZWF0ZSBhbiBleHByZXNzaW9uIGJlaW5nIGFibGUgdG8gYXV0b21hdGljYWxseQorICAvLyB3YXJwIGFueSBNYXAsIE1hdHJpeCwgYW5kIEJsb2NrIGV4cHJlc3Npb25zIGFzIGEgdW5pcXVlIHR5cGUsIGJ1dCBzaW5jZSB0aGF0J3MgZXhhY3RseQorICAvLyBhIE1hcCArIHN0cmlkZSwgd2h5IG5vdCBhZGRpbmcgYSBzdHJpZGUgdG8gTWFwLCBhbmQgY29udmVuaWVudCBjdG9ycyBmcm9tIGEgTWF0cml4LAorICAvLyBhbmQgQmxvY2suCisgIHR5cGVkZWYgTWFwPE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIFN0b3JhZ2VPcmRlcj4gPiBNYXBMVTsKKyAgdHlwZWRlZiBCbG9jazxNYXBMVSwgRHluYW1pYywgRHluYW1pYz4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBCbG9jazxNYXRyaXhUeXBlLER5bmFtaWMsRHluYW1pYz4gQmxvY2tUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICAvKiogXGludGVybmFsIHBlcmZvcm1zIHRoZSBMVSBkZWNvbXBvc2l0aW9uIGluLXBsYWNlIG9mIHRoZSBtYXRyaXggXGEgbHUKKyAgICAqIHVzaW5nIGFuIHVuYmxvY2tlZCBhbGdvcml0aG0uCisgICAgKgorICAgICogSW4gYWRkaXRpb24sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcm93IHRyYW5zcG9zaXRpb25zIGluIHRoZQorICAgICogdmVjdG9yIFxhIHJvd190cmFuc3Bvc2l0aW9ucyB3aGljaCBtdXN0IGhhdmUgYSBzaXplIGVxdWFsIHRvIHRoZSBudW1iZXIKKyAgICAqIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCBcYSBsdSwgYW5kIGFuIGludGVnZXIgXGEgbmJfdHJhbnNwb3NpdGlvbnMKKyAgICAqIHdoaWNoIHJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2YgdHJhbnNwb3NpdGlvbnMuCisgICAgKgorICAgICogXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwaXZvdCB3aGljaCBpcyBleGFjdGx5IHplcm8gaWYgYW55LCBvciBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgICAgKi8KKyAgc3RhdGljIEluZGV4IHVuYmxvY2tlZF9sdShNYXRyaXhUeXBlJiBsdSwgUGl2SW5kZXgqIHJvd190cmFuc3Bvc2l0aW9ucywgUGl2SW5kZXgmIG5iX3RyYW5zcG9zaXRpb25zKQorICB7CisgICAgY29uc3QgSW5kZXggcm93cyA9IGx1LnJvd3MoKTsKKyAgICBjb25zdCBJbmRleCBjb2xzID0gbHUuY29scygpOworICAgIGNvbnN0IEluZGV4IHNpemUgPSAoc3RkOjptaW4pKHJvd3MsY29scyk7CisgICAgbmJfdHJhbnNwb3NpdGlvbnMgPSAwOworICAgIGludCBmaXJzdF96ZXJvX3Bpdm90ID0gLTE7CisgICAgZm9yKEluZGV4IGsgPSAwOyBrIDwgc2l6ZTsgKytrKQorICAgIHsKKyAgICAgIEluZGV4IHJyb3dzID0gcm93cy1rLTE7CisgICAgICBJbmRleCByY29scyA9IGNvbHMtay0xOworICAgICAgICAKKyAgICAgIEluZGV4IHJvd19vZl9iaWdnZXN0X2luX2NvbDsKKyAgICAgIFJlYWxTY2FsYXIgYmlnZ2VzdF9pbl9jb3JuZXIKKyAgICAgICAgPSBsdS5jb2woaykudGFpbChyb3dzLWspLmN3aXNlQWJzKCkubWF4Q29lZmYoJnJvd19vZl9iaWdnZXN0X2luX2NvbCk7CisgICAgICByb3dfb2ZfYmlnZ2VzdF9pbl9jb2wgKz0gazsKKworICAgICAgcm93X3RyYW5zcG9zaXRpb25zW2tdID0gcm93X29mX2JpZ2dlc3RfaW5fY29sOworCisgICAgICBpZihiaWdnZXN0X2luX2Nvcm5lciAhPSBSZWFsU2NhbGFyKDApKQorICAgICAgeworICAgICAgICBpZihrICE9IHJvd19vZl9iaWdnZXN0X2luX2NvbCkKKyAgICAgICAgeworICAgICAgICAgIGx1LnJvdyhrKS5zd2FwKGx1LnJvdyhyb3dfb2ZfYmlnZ2VzdF9pbl9jb2wpKTsKKyAgICAgICAgICArK25iX3RyYW5zcG9zaXRpb25zOworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUUgc2hhbGwgd2UgaW50cm9kdWNlIGEgc2FmZSBxdW90aWVudCBleHByZXNzaW9uIGluIGNhcyAxL2x1LmNvZWZmKGssaykKKyAgICAgICAgLy8gb3ZlcmZsb3cgYnV0IG5vdCB0aGUgYWN0dWFsIHF1b3RpZW50PworICAgICAgICBsdS5jb2woaykudGFpbChycm93cykgLz0gbHUuY29lZmYoayxrKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoZmlyc3RfemVyb19waXZvdD09LTEpCisgICAgICB7CisgICAgICAgIC8vIHRoZSBwaXZvdCBpcyBleGFjdGx5IHplcm8sIHdlIHJlY29yZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHBpdm90IHdoaWNoIGlzIGV4YWN0bHkgMCwKKyAgICAgICAgLy8gYW5kIGNvbnRpbnVlIHRoZSBmYWN0b3JpemF0aW9uIHN1Y2ggd2Ugc3RpbGwgaGF2ZSBBID0gUExVCisgICAgICAgIGZpcnN0X3plcm9fcGl2b3QgPSBrOworICAgICAgfQorCisgICAgICBpZihrPHJvd3MtMSkKKyAgICAgICAgbHUuYm90dG9tUmlnaHRDb3JuZXIocnJvd3MscmNvbHMpLm5vYWxpYXMoKSAtPSBsdS5jb2woaykudGFpbChycm93cykgKiBsdS5yb3coaykudGFpbChyY29scyk7CisgICAgfQorICAgIHJldHVybiBmaXJzdF96ZXJvX3Bpdm90OworICB9CisKKyAgLyoqIFxpbnRlcm5hbCBwZXJmb3JtcyB0aGUgTFUgZGVjb21wb3NpdGlvbiBpbi1wbGFjZSBvZiB0aGUgbWF0cml4IHJlcHJlc2VudGVkCisgICAgKiBieSB0aGUgdmFyaWFibGVzIFxhIHJvd3MsIFxhIGNvbHMsIFxhIGx1X2RhdGEsIGFuZCBcYSBsdV9zdHJpZGUgdXNpbmcgYQorICAgICogcmVjdXJzaXZlLCBibG9ja2VkIGFsZ29yaXRobS4KKyAgICAqCisgICAgKiBJbiBhZGRpdGlvbiwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByb3cgdHJhbnNwb3NpdGlvbnMgaW4gdGhlCisgICAgKiB2ZWN0b3IgXGEgcm93X3RyYW5zcG9zaXRpb25zIHdoaWNoIG11c3QgaGF2ZSBhIHNpemUgZXF1YWwgdG8gdGhlIG51bWJlcgorICAgICogb2YgY29sdW1ucyBvZiB0aGUgbWF0cml4IFxhIGx1LCBhbmQgYW4gaW50ZWdlciBcYSBuYl90cmFuc3Bvc2l0aW9ucworICAgICogd2hpY2ggcmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiB0cmFuc3Bvc2l0aW9ucy4KKyAgICAqCisgICAgKiBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHBpdm90IHdoaWNoIGlzIGV4YWN0bHkgemVybyBpZiBhbnksIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KKyAgICAqCisgICAgKiBcbm90ZSBUaGlzIHZlcnkgbG93IGxldmVsIGludGVyZmFjZSB1c2luZyBwb2ludGVycywgZXRjLiBpcyB0bzoKKyAgICAqICAgMSAtIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGluc3RhbmNpYXRpb25zIHRvIHRoZSBzdHJpY3QgbWluaW11bQorICAgICogICAyIC0gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIG9mIHRoZSBpbnN0YW5jaWF0aW9ucyB3aXRoIEJsb2NrPEJsb2NrPEJsb2NrPC4uLj4gPiA+CisgICAgKi8KKyAgc3RhdGljIEluZGV4IGJsb2NrZWRfbHUoSW5kZXggcm93cywgSW5kZXggY29scywgU2NhbGFyKiBsdV9kYXRhLCBJbmRleCBsdVN0cmlkZSwgUGl2SW5kZXgqIHJvd190cmFuc3Bvc2l0aW9ucywgUGl2SW5kZXgmIG5iX3RyYW5zcG9zaXRpb25zLCBJbmRleCBtYXhCbG9ja1NpemU9MjU2KQorICB7CisgICAgTWFwTFUgbHUxKGx1X2RhdGEsU3RvcmFnZU9yZGVyPT1Sb3dNYWpvcj9yb3dzOmx1U3RyaWRlLFN0b3JhZ2VPcmRlcj09Um93TWFqb3I/bHVTdHJpZGU6Y29scyk7CisgICAgTWF0cml4VHlwZSBsdShsdTEsMCwwLHJvd3MsY29scyk7CisKKyAgICBjb25zdCBJbmRleCBzaXplID0gKHN0ZDo6bWluKShyb3dzLGNvbHMpOworCisgICAgLy8gaWYgdGhlIG1hdHJpeCBpcyB0b28gc21hbGwsIG5vIGJsb2NraW5nOgorICAgIGlmKHNpemU8PTE2KQorICAgIHsKKyAgICAgIHJldHVybiB1bmJsb2NrZWRfbHUobHUsIHJvd190cmFuc3Bvc2l0aW9ucywgbmJfdHJhbnNwb3NpdGlvbnMpOworICAgIH0KKworICAgIC8vIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBudW1iZXIgb2Ygc3ViZGl2aXNpb25zIHRvIHRoZSBzaXplCisgICAgLy8gb2YgdGhlIG1hdHJpeCBzbyB0aGF0IHRoZXJlIGlzIGVub3VnaCBzdWIgYmxvY2tzOgorICAgIEluZGV4IGJsb2NrU2l6ZTsKKyAgICB7CisgICAgICBibG9ja1NpemUgPSBzaXplLzg7CisgICAgICBibG9ja1NpemUgPSAoYmxvY2tTaXplLzE2KSoxNjsKKyAgICAgIGJsb2NrU2l6ZSA9IChzdGQ6Om1pbikoKHN0ZDo6bWF4KShibG9ja1NpemUsSW5kZXgoOCkpLCBtYXhCbG9ja1NpemUpOworICAgIH0KKworICAgIG5iX3RyYW5zcG9zaXRpb25zID0gMDsKKyAgICBpbnQgZmlyc3RfemVyb19waXZvdCA9IC0xOworICAgIGZvcihJbmRleCBrID0gMDsgayA8IHNpemU7IGsrPWJsb2NrU2l6ZSkKKyAgICB7CisgICAgICBJbmRleCBicyA9IChzdGQ6Om1pbikoc2l6ZS1rLGJsb2NrU2l6ZSk7IC8vIGFjdHVhbCBzaXplIG9mIHRoZSBibG9jaworICAgICAgSW5kZXggdHJvd3MgPSByb3dzIC0gayAtIGJzOyAvLyB0cmFpbGluZyByb3dzCisgICAgICBJbmRleCB0c2l6ZSA9IHNpemUgLSBrIC0gYnM7IC8vIHRyYWlsaW5nIHNpemUKKworICAgICAgLy8gcGFydGl0aW9uIHRoZSBtYXRyaXg6CisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgQTAwIHwgQTAxIHwgQTAyCisgICAgICAvLyBsdSAgPSBBXzAgfCBBXzEgfCBBXzIgPSAgQTEwIHwgQTExIHwgQTEyCisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgQTIwIHwgQTIxIHwgQTIyCisgICAgICBCbG9ja1R5cGUgQV8wKGx1LDAsMCxyb3dzLGspOworICAgICAgQmxvY2tUeXBlIEFfMihsdSwwLGsrYnMscm93cyx0c2l6ZSk7CisgICAgICBCbG9ja1R5cGUgQTExKGx1LGssayxicyxicyk7CisgICAgICBCbG9ja1R5cGUgQTEyKGx1LGssayticyxicyx0c2l6ZSk7CisgICAgICBCbG9ja1R5cGUgQTIxKGx1LGsrYnMsayx0cm93cyxicyk7CisgICAgICBCbG9ja1R5cGUgQTIyKGx1LGsrYnMsayticyx0cm93cyx0c2l6ZSk7CisKKyAgICAgIFBpdkluZGV4IG5iX3RyYW5zcG9zaXRpb25zX2luX3BhbmVsOworICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCB0aGUgYmxvY2tlZCBMVSBhbGdvcml0aG0gb24gW0ExMV5UIEEyMV5UXV5UCisgICAgICAvLyB3aXRoIGEgdmVyeSBzbWFsbCBibG9ja2luZyBzaXplOgorICAgICAgSW5kZXggcmV0ID0gYmxvY2tlZF9sdSh0cm93cyticywgYnMsICZsdS5jb2VmZlJlZihrLGspLCBsdVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICByb3dfdHJhbnNwb3NpdGlvbnMraywgbmJfdHJhbnNwb3NpdGlvbnNfaW5fcGFuZWwsIDE2KTsKKyAgICAgIGlmKHJldD49MCAmJiBmaXJzdF96ZXJvX3Bpdm90PT0tMSkKKyAgICAgICAgZmlyc3RfemVyb19waXZvdCA9IGsrcmV0OworCisgICAgICBuYl90cmFuc3Bvc2l0aW9ucyArPSBuYl90cmFuc3Bvc2l0aW9uc19pbl9wYW5lbDsKKyAgICAgIC8vIHVwZGF0ZSBwZXJtdXRhdGlvbnMgYW5kIGFwcGx5IHRoZW0gdG8gQV8wCisgICAgICBmb3IoSW5kZXggaT1rOyBpPGsrYnM7ICsraSkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggcGl2ID0gKHJvd190cmFuc3Bvc2l0aW9uc1tpXSArPSBrKTsKKyAgICAgICAgQV8wLnJvdyhpKS5zd2FwKEFfMC5yb3cocGl2KSk7CisgICAgICB9CisKKyAgICAgIGlmKHRyb3dzKQorICAgICAgeworICAgICAgICAvLyBhcHBseSBwZXJtdXRhdGlvbnMgdG8gQV8yCisgICAgICAgIGZvcihJbmRleCBpPWs7aTxrK2JzOyArK2kpCisgICAgICAgICAgQV8yLnJvdyhpKS5zd2FwKEFfMi5yb3cocm93X3RyYW5zcG9zaXRpb25zW2ldKSk7CisKKyAgICAgICAgLy8gQTEyID0gQTExXi0xIEExMgorICAgICAgICBBMTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnNvbHZlSW5QbGFjZShBMTIpOworCisgICAgICAgIEEyMi5ub2FsaWFzKCkgLT0gQTIxICogQTEyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmlyc3RfemVyb19waXZvdDsKKyAgfQorfTsKKworLyoqIFxpbnRlcm5hbCBwZXJmb3JtcyB0aGUgTFUgZGVjb21wb3NpdGlvbiB3aXRoIHBhcnRpYWwgcGl2b3RpbmcgaW4tcGxhY2UuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uVHlwZT4KK3ZvaWQgcGFydGlhbF9sdV9pbnBsYWNlKE1hdHJpeFR5cGUmIGx1LCBUcmFuc3Bvc2l0aW9uVHlwZSYgcm93X3RyYW5zcG9zaXRpb25zLCB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uVHlwZTo6SW5kZXgmIG5iX3RyYW5zcG9zaXRpb25zKQoreworICBlaWdlbl9hc3NlcnQobHUuY29scygpID09IHJvd190cmFuc3Bvc2l0aW9ucy5zaXplKCkpOworICBlaWdlbl9hc3NlcnQoKCZyb3dfdHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoMSktJnJvd190cmFuc3Bvc2l0aW9ucy5jb2VmZlJlZigwKSkgPT0gMSk7CisKKyAgcGFydGlhbF9sdV9pbXBsCisgICAgPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQ/Um93TWFqb3I6Q29sTWFqb3IsIHR5cGVuYW1lIFRyYW5zcG9zaXRpb25UeXBlOjpJbmRleD4KKyAgICA6OmJsb2NrZWRfbHUobHUucm93cygpLCBsdS5jb2xzKCksICZsdS5jb2VmZlJlZigwLDApLCBsdS5vdXRlclN0cmlkZSgpLCAmcm93X3RyYW5zcG9zaXRpb25zLmNvZWZmUmVmKDApLCBuYl90cmFuc3Bvc2l0aW9ucyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorUGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+JiBQYXJ0aWFsUGl2TFU8TWF0cml4VHlwZT46OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQoreworICBtX2x1ID0gbWF0cml4OworCisgIGVpZ2VuX2Fzc2VydChtYXRyaXgucm93cygpID09IG1hdHJpeC5jb2xzKCkgJiYgIlBhcnRpYWxQaXZMVSBpcyBvbmx5IGZvciBzcXVhcmUgKGFuZCBtb3Jlb3ZlciBpbnZlcnRpYmxlKSBtYXRyaWNlcyIpOworICBjb25zdCBJbmRleCBzaXplID0gbWF0cml4LnJvd3MoKTsKKworICBtX3Jvd3NUcmFuc3Bvc2l0aW9ucy5yZXNpemUoc2l6ZSk7CisKKyAgdHlwZW5hbWUgVHJhbnNwb3NpdGlvblR5cGU6OkluZGV4IG5iX3RyYW5zcG9zaXRpb25zOworICBpbnRlcm5hbDo6cGFydGlhbF9sdV9pbnBsYWNlKG1fbHUsIG1fcm93c1RyYW5zcG9zaXRpb25zLCBuYl90cmFuc3Bvc2l0aW9ucyk7CisgIG1fZGV0X3AgPSAobmJfdHJhbnNwb3NpdGlvbnMlMikgPyAtMSA6IDE7CisKKyAgbV9wID0gbV9yb3dzVHJhbnNwb3NpdGlvbnM7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFBhcnRpYWxQaXZMVTxNYXRyaXhUeXBlPjo6ZGV0ZXJtaW5hbnQoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJQYXJ0aWFsUGl2TFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICByZXR1cm4gU2NhbGFyKG1fZGV0X3ApICogbV9sdS5kaWFnb25hbCgpLnByb2QoKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggcmVwcmVzZW50ZWQgYnkgdGhlIGRlY29tcG9zaXRpb24sCisgKiBpLmUuLCBpdCByZXR1cm5zIHRoZSBwcm9kdWN0OiBQXnstMX0gTCBVLgorICogVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgZGVidWcgcHVycG9zZS4gKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitNYXRyaXhUeXBlIFBhcnRpYWxQaXZMVTxNYXRyaXhUeXBlPjo6cmVjb25zdHJ1Y3RlZE1hdHJpeCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgLy8gTFUKKyAgTWF0cml4VHlwZSByZXMgPSBtX2x1LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkKKyAgICAgICAgICAgICAgICAgKiBtX2x1LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworCisgIC8vIFBeey0xfShMVSkKKyAgcmVzID0gbV9wLmludmVyc2UoKSAqIHJlczsKKworICByZXR1cm4gcmVzOworfQorCisvKioqKiogSW1wbGVtZW50YXRpb24gb2Ygc29sdmUoKSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBzb2x2ZV9yZXR2YWw8UGFydGlhbFBpdkxVPF9NYXRyaXhUeXBlPiwgUmhzPgorICA6IHNvbHZlX3JldHZhbF9iYXNlPFBhcnRpYWxQaXZMVTxfTWF0cml4VHlwZT4sIFJocz4KK3sKKyAgRUlHRU5fTUFLRV9TT0xWRV9IRUxQRVJTKFBhcnRpYWxQaXZMVTxfTWF0cml4VHlwZT4sUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIC8qIFRoZSBkZWNvbXBvc2l0aW9uIFBBID0gTFUgY2FuIGJlIHJld3JpdHRlbiBhcyBBID0gUF57LTF9IEwgVS4KKyAgICAqIFNvIHdlIHByb2NlZWQgYXMgZm9sbG93czoKKyAgICAqIFN0ZXAgMTogY29tcHV0ZSBjID0gUGIuCisgICAgKiBTdGVwIDI6IHJlcGxhY2UgYyBieSB0aGUgc29sdXRpb24geCB0byBMeCA9IGMuCisgICAgKiBTdGVwIDM6IHJlcGxhY2UgYyBieSB0aGUgc29sdXRpb24geCB0byBVeCA9IGMuCisgICAgKi8KKworICAgIGVpZ2VuX2Fzc2VydChyaHMoKS5yb3dzKCkgPT0gZGVjKCkubWF0cml4TFUoKS5yb3dzKCkpOworCisgICAgLy8gU3RlcCAxCisgICAgZHN0ID0gZGVjKCkucGVybXV0YXRpb25QKCkgKiByaHMoKTsKKworICAgIC8vIFN0ZXAgMgorICAgIGRlYygpLm1hdHJpeExVKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnNvbHZlSW5QbGFjZShkc3QpOworCisgICAgLy8gU3RlcCAzCisgICAgZGVjKCkubWF0cml4TFUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZUluUGxhY2UoZHN0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKioqKioqKiBNYXRyaXhCYXNlIG1ldGhvZHMgKioqKioqKi8KKworLyoqIFxsdV9tb2R1bGUKKyAgKgorICAqIFxyZXR1cm4gdGhlIHBhcnRpYWwtcGl2b3RpbmcgTFUgZGVjb21wb3NpdGlvbiBvZiBcYyAqdGhpcy4KKyAgKgorICAqIFxzYSBjbGFzcyBQYXJ0aWFsUGl2TFUKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgY29uc3QgUGFydGlhbFBpdkxVPHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6cGFydGlhbFBpdkx1KCkgY29uc3QKK3sKKyAgcmV0dXJuIFBhcnRpYWxQaXZMVTxQbGFpbk9iamVjdD4oZXZhbCgpKTsKK30KKworI2lmIEVJR0VOMl9TVVBQT1JUX1NUQUdFID4gU1RBR0UyMF9SRVNPTFZFX0FQSV9DT05GTElDVFMKKy8qKiBcbHVfbW9kdWxlCisgICoKKyAgKiBTeW5vbnltIG9mIHBhcnRpYWxQaXZMdSgpLgorICAqCisgICogXHJldHVybiB0aGUgcGFydGlhbC1waXZvdGluZyBMVSBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGNsYXNzIFBhcnRpYWxQaXZMVQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSBjb25zdCBQYXJ0aWFsUGl2TFU8dHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3Q+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpsdSgpIGNvbnN0Cit7CisgIHJldHVybiBQYXJ0aWFsUGl2TFU8UGxhaW5PYmplY3Q+KGV2YWwoKSk7Cit9CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QQVJUSUFMTFVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0xVL1BhcnRpYWxQaXZMVV9NS0wuaCBiL0VpZ2VuL3NyYy9MVS9QYXJ0aWFsUGl2TFVfTUtMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzNTk1MwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9MVS9QYXJ0aWFsUGl2TFVfTUtMLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29udGVudCA6IEVpZ2VuIGJpbmRpbmdzIHRvIEludGVsKFIpIE1LTAorICogICAgIExVIGRlY29tcG9zaXRpb24gd2l0aCBwYXJ0aWFsIHBpdm90aW5nIGJhc2VkIG9uIExBUEFDS0VfP2dldHJmIGZ1bmN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX1BBUlRJQUxMVV9MQVBBQ0tfSAorI2RlZmluZSBFSUdFTl9QQVJUSUFMTFVfTEFQQUNLX0gKKworI2luY2x1ZGUgIkVpZ2VuL3NyYy9Db3JlL3V0aWwvTUtMX3N1cHBvcnQuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwgU3BlY2lhbGl6YXRpb24gZm9yIHRoZSBkYXRhIHR5cGVzIHN1cHBvcnRlZCBieSBNS0wgKi8KKworI2RlZmluZSBFSUdFTl9NS0xfTFVfUEFSVFBJVihFSUdUWVBFLCBNS0xUWVBFLCBNS0xQUkVGSVgpIFwKK3RlbXBsYXRlPGludCBTdG9yYWdlT3JkZXI+IFwKK3N0cnVjdCBwYXJ0aWFsX2x1X2ltcGw8RUlHVFlQRSwgU3RvcmFnZU9yZGVyLCBsYXBhY2tfaW50PiBcCit7IFwKKyAgLyogXGludGVybmFsIHBlcmZvcm1zIHRoZSBMVSBkZWNvbXBvc2l0aW9uIGluLXBsYWNlIG9mIHRoZSBtYXRyaXggcmVwcmVzZW50ZWQgKi8gXAorICBzdGF0aWMgbGFwYWNrX2ludCBibG9ja2VkX2x1KGxhcGFja19pbnQgcm93cywgbGFwYWNrX2ludCBjb2xzLCBFSUdUWVBFKiBsdV9kYXRhLCBsYXBhY2tfaW50IGx1U3RyaWRlLCBsYXBhY2tfaW50KiByb3dfdHJhbnNwb3NpdGlvbnMsIGxhcGFja19pbnQmIG5iX3RyYW5zcG9zaXRpb25zLCBsYXBhY2tfaW50IG1heEJsb2NrU2l6ZT0yNTYpIFwKKyAgeyBcCisgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG1heEJsb2NrU2l6ZSk7XAorICAgIGxhcGFja19pbnQgbWF0cml4X29yZGVyLCBmaXJzdF96ZXJvX3Bpdm90OyBcCisgICAgbGFwYWNrX2ludCBtLCBuLCBsZGEsICppcGl2LCBpbmZvOyBcCisgICAgRUlHVFlQRSogYTsgXAorLyogU2V0IHVwIHBhcmFtZXRlcnMgZm9yID9nZXRyZiAqLyBcCisgICAgbWF0cml4X29yZGVyID0gU3RvcmFnZU9yZGVyPT1Sb3dNYWpvciA/IExBUEFDS19ST1dfTUFKT1IgOiBMQVBBQ0tfQ09MX01BSk9SOyBcCisgICAgbGRhID0gbHVTdHJpZGU7IFwKKyAgICBhID0gbHVfZGF0YTsgXAorICAgIGlwaXYgPSByb3dfdHJhbnNwb3NpdGlvbnM7IFwKKyAgICBtID0gcm93czsgXAorICAgIG4gPSBjb2xzOyBcCisgICAgbmJfdHJhbnNwb3NpdGlvbnMgPSAwOyBcCitcCisgICAgaW5mbyA9IExBUEFDS0VfIyNNS0xQUkVGSVgjI2dldHJmKCBtYXRyaXhfb3JkZXIsIG0sIG4sIChNS0xUWVBFKilhLCBsZGEsIGlwaXYgKTsgXAorXAorICAgIGZvcihpbnQgaT0wO2k8bTtpKyspIHsgaXBpdltpXS0tOyBpZiAoaXBpdltpXSE9aSkgbmJfdHJhbnNwb3NpdGlvbnMrKzsgfSBcCitcCisgICAgZWlnZW5fYXNzZXJ0KGluZm8gPj0gMCk7IFwKKy8qIHNvbWV0aGluZyBzaG91bGQgYmUgZG9uZSB3aXRoIG5iX3RyYW5zcG9zaXRpb25zICovIFwKK1wKKyAgICBmaXJzdF96ZXJvX3Bpdm90ID0gaW5mbzsgXAorICAgIHJldHVybiBmaXJzdF96ZXJvX3Bpdm90OyBcCisgIH0gXAorfTsKKworRUlHRU5fTUtMX0xVX1BBUlRQSVYoZG91YmxlLCBkb3VibGUsIGQpCitFSUdFTl9NS0xfTFVfUEFSVFBJVihmbG9hdCwgZmxvYXQsIHMpCitFSUdFTl9NS0xfTFVfUEFSVFBJVihkY29tcGxleCwgTUtMX0NvbXBsZXgxNiwgeikKK0VJR0VOX01LTF9MVV9QQVJUUElWKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsIGMpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1BBUlRJQUxMVV9MQVBBQ0tfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL0xVL2FyY2gvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvTFUvYXJjaC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI3ZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0xVL2FyY2gvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fTFVfYXJjaF9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fTFVfYXJjaF9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9MVS9hcmNoIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvTFUvYXJjaC9JbnZlcnNlX1NTRS5oIGIvRWlnZW4vc3JjL0xVL2FyY2gvSW52ZXJzZV9TU0UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI3YTIzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL0xVL2FyY2gvSW52ZXJzZV9TU0UuaApAQCAtMCwwICsxLDMyOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEgSW50ZWwgQ29ycG9yYXRpb24KKy8vIENvcHlyaWdodCAoQykgMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIFRoZSBTU0UgY29kZSBmb3IgdGhlIDR4NCBmbG9hdCBhbmQgZG91YmxlIG1hdHJpeCBpbnZlcnNlIGluIHRoaXMgZmlsZQorLy8gY29tZXMgZnJvbSB0aGUgZm9sbG93aW5nIEludGVsJ3MgbGlicmFyeToKKy8vIGh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvYXJ0aWNsZXMvb3B0aW1pemVkLW1hdHJpeC1saWJyYXJ5LWZvci11c2Utd2l0aC10aGUtaW50ZWwtcGVudGl1bXItNC1wcm9jZXNzb3JzLXNzZTItaW5zdHJ1Y3Rpb25zLworLy8KKy8vIEhlcmUgaXMgdGhlIHJlc3BlY3RpdmUgY29weXJpZ2h0IGFuZCBsaWNlbnNlIHN0YXRlbWVudDoKKy8vCisvLyAgIENvcHlyaWdodCAoYykgMjAwMSBJbnRlbCBDb3Jwb3JhdGlvbi4KKy8vCisvLyBQZXJtaXRpb24gaXMgZ3JhbnRlZCB0byB1c2UsIGNvcHksIGRpc3RyaWJ1dGUgYW5kIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcworLy8gb2YgdGhpcyBsaWJyYXJ5IGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUsIHByb3ZpZGVkLCB0aGF0IHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBzdGF0ZW1lbnQgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisvLyBJbnRlbCBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisvLyBhbnkgcHVycG9zZSwgYW5kIHNwZWNpZmljYWxseSBkaXNjbGFpbXMgYWxsIHdhcnJhbnRpZXMuCisvLyBTZWUgTEVHQUwuVFhUIGZvciBhbGwgdGhlIGxlZ2FsIGluZm9ybWF0aW9uLgorCisjaWZuZGVmIEVJR0VOX0lOVkVSU0VfU1NFX0gKKyNkZWZpbmUgRUlHRU5fSU5WRVJTRV9TU0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb21wdXRlX2ludmVyc2Vfc2l6ZTQ8QXJjaGl0ZWN0dXJlOjpTU0UsIGZsb2F0LCBNYXRyaXhUeXBlLCBSZXN1bHRUeXBlPgoreworICBlbnVtIHsKKyAgICBNYXRyaXhBbGlnbm1lbnQgICAgID0gYm9vbChNYXRyaXhUeXBlOjpGbGFncyZBbGlnbmVkQml0KSwKKyAgICBSZXN1bHRBbGlnbm1lbnQgICAgID0gYm9vbChSZXN1bHRUeXBlOjpGbGFncyZBbGlnbmVkQml0KSwKKyAgICBTdG9yYWdlT3JkZXJzTWF0Y2ggID0gKE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0KSA9PSAoUmVzdWx0VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpCisgIH07CisgIAorICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBSZXN1bHRUeXBlJiByZXN1bHQpCisgIHsKKyAgICBFSUdFTl9BTElHTjE2IGNvbnN0IHVuc2lnbmVkIGludCBfU2lnbl9QTk5QWzRdID0geyAweDAwMDAwMDAwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwIH07CisKKyAgICAvLyBMb2FkIHRoZSBmdWxsIG1hdHJpeCBpbnRvIHJlZ2lzdGVycworICAgIF9fbTEyOCBfTDEgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDApOworICAgIF9fbTEyOCBfTDIgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDQpOworICAgIF9fbTEyOCBfTDMgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDgpOworICAgIF9fbTEyOCBfTDQgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oMTIpOworCisgICAgLy8gVGhlIGludmVyc2UgaXMgY2FsY3VsYXRlZCB1c2luZyAiRGl2aWRlIGFuZCBDb25xdWVyIiB0ZWNobmlxdWUuIFRoZQorICAgIC8vIG9yaWdpbmFsIG1hdHJpeCBpcyBkaXZpZGUgaW50byBmb3VyIDJ4MiBzdWItbWF0cmljZXMuIFNpbmNlIGVhY2gKKyAgICAvLyByZWdpc3RlciBob2xkcyBmb3VyIG1hdHJpeCBlbGVtZW50LCB0aGUgc21hbGxlciBtYXRyaWNlcyBhcmUKKyAgICAvLyByZXByZXNlbnRlZCBhcyBhIHJlZ2lzdGVycy4gSGVuY2Ugd2UgZ2V0IGEgYmV0dGVyIGxvY2FsaXR5IG9mIHRoZQorICAgIC8vIGNhbGN1bGF0aW9ucy4KKworICAgIF9fbTEyOCBBLCBCLCBDLCBEOyAvLyB0aGUgZm91ciBzdWItbWF0cmljZXMKKyAgICBpZighU3RvcmFnZU9yZGVyc01hdGNoKQorICAgIHsKKyAgICAgIEEgPSBfbW1fdW5wYWNrbG9fcHMoX0wxLCBfTDIpOworICAgICAgQiA9IF9tbV91bnBhY2tsb19wcyhfTDMsIF9MNCk7CisgICAgICBDID0gX21tX3VucGFja2hpX3BzKF9MMSwgX0wyKTsKKyAgICAgIEQgPSBfbW1fdW5wYWNraGlfcHMoX0wzLCBfTDQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgQSA9IF9tbV9tb3ZlbGhfcHMoX0wxLCBfTDIpOworICAgICAgQiA9IF9tbV9tb3ZlaGxfcHMoX0wyLCBfTDEpOworICAgICAgQyA9IF9tbV9tb3ZlbGhfcHMoX0wzLCBfTDQpOworICAgICAgRCA9IF9tbV9tb3ZlaGxfcHMoX0w0LCBfTDMpOworICAgIH0KKworICAgIF9fbTEyOCBpQSwgaUIsIGlDLCBpRCwgICAgICAgICAgICAgICAgIC8vIHBhcnRpYWwgaW52ZXJzZSBvZiB0aGUgc3ViLW1hdHJpY2VzCisgICAgICAgICAgICBEQywgQUI7CisgICAgX19tMTI4IGRBLCBkQiwgZEMsIGREOyAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5hbnQgb2YgdGhlIHN1Yi1tYXRyaWNlcworICAgIF9fbTEyOCBkZXQsIGQsIGQxLCBkMjsKKyAgICBfX20xMjggcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNpcHJvY2FsIG9mIHRoZSBkZXRlcm1pbmFudAorCisgICAgLy8gIEFCID0gQSMgKiBCCisgICAgQUIgPSBfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKEEsQSwweDBGKSwgQik7CisgICAgQUIgPSBfbW1fc3ViX3BzKEFCLF9tbV9tdWxfcHMoX21tX3NodWZmbGVfcHMoQSxBLDB4QTUpLCBfbW1fc2h1ZmZsZV9wcyhCLEIsMHg0RSkpKTsKKyAgICAvLyAgREMgPSBEIyAqIEMKKyAgICBEQyA9IF9tbV9tdWxfcHMoX21tX3NodWZmbGVfcHMoRCxELDB4MEYpLCBDKTsKKyAgICBEQyA9IF9tbV9zdWJfcHMoREMsX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhELEQsMHhBNSksIF9tbV9zaHVmZmxlX3BzKEMsQywweDRFKSkpOworCisgICAgLy8gIGRBID0gfEF8CisgICAgZEEgPSBfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKEEsIEEsIDB4NUYpLEEpOworICAgIGRBID0gX21tX3N1Yl9zcyhkQSwgX21tX21vdmVobF9wcyhkQSxkQSkpOworICAgIC8vICBkQiA9IHxCfAorICAgIGRCID0gX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhCLCBCLCAweDVGKSxCKTsKKyAgICBkQiA9IF9tbV9zdWJfc3MoZEIsIF9tbV9tb3ZlaGxfcHMoZEIsZEIpKTsKKworICAgIC8vICBkQyA9IHxDfAorICAgIGRDID0gX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhDLCBDLCAweDVGKSxDKTsKKyAgICBkQyA9IF9tbV9zdWJfc3MoZEMsIF9tbV9tb3ZlaGxfcHMoZEMsZEMpKTsKKyAgICAvLyAgZEQgPSB8RHwKKyAgICBkRCA9IF9tbV9tdWxfcHMoX21tX3NodWZmbGVfcHMoRCwgRCwgMHg1RiksRCk7CisgICAgZEQgPSBfbW1fc3ViX3NzKGRELCBfbW1fbW92ZWhsX3BzKGRELGREKSk7CisKKyAgICAvLyAgZCA9IHRyYWNlKEFCKkRDKSA9IHRyYWNlKEEjKkIqRCMqQykKKyAgICBkID0gX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhEQyxEQywweEQ4KSxBQik7CisKKyAgICAvLyAgaUQgPSBDKkEjKkIKKyAgICBpRCA9IF9tbV9tdWxfcHMoX21tX3NodWZmbGVfcHMoQyxDLDB4QTApLCBfbW1fbW92ZWxoX3BzKEFCLEFCKSk7CisgICAgaUQgPSBfbW1fYWRkX3BzKGlELF9tbV9tdWxfcHMoX21tX3NodWZmbGVfcHMoQyxDLDB4RjUpLCBfbW1fbW92ZWhsX3BzKEFCLEFCKSkpOworICAgIC8vICBpQSA9IEIqRCMqQworICAgIGlBID0gX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhCLEIsMHhBMCksIF9tbV9tb3ZlbGhfcHMoREMsREMpKTsKKyAgICBpQSA9IF9tbV9hZGRfcHMoaUEsX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhCLEIsMHhGNSksIF9tbV9tb3ZlaGxfcHMoREMsREMpKSk7CisKKyAgICAvLyAgZCA9IHRyYWNlKEFCKkRDKSA9IHRyYWNlKEEjKkIqRCMqQykgW2NvbnRpbnVlXQorICAgIGQgID0gX21tX2FkZF9wcyhkLCBfbW1fbW92ZWhsX3BzKGQsIGQpKTsKKyAgICBkICA9IF9tbV9hZGRfc3MoZCwgX21tX3NodWZmbGVfcHMoZCwgZCwgMSkpOworICAgIGQxID0gX21tX211bF9zcyhkQSxkRCk7CisgICAgZDIgPSBfbW1fbXVsX3NzKGRCLGRDKTsKKworICAgIC8vICBpRCA9IEQqfEF8IC0gQypBIypCCisgICAgaUQgPSBfbW1fc3ViX3BzKF9tbV9tdWxfcHMoRCxfbW1fc2h1ZmZsZV9wcyhkQSxkQSwwKSksIGlEKTsKKworICAgIC8vICBpQSA9IEEqfER8IC0gQipEIypDOworICAgIGlBID0gX21tX3N1Yl9wcyhfbW1fbXVsX3BzKEEsX21tX3NodWZmbGVfcHMoZEQsZEQsMCkpLCBpQSk7CisKKyAgICAvLyAgZGV0ID0gfEF8KnxEfCArIHxCfCp8Q3wgLSB0cmFjZShBIypCKkQjKkMpCisgICAgZGV0ID0gX21tX3N1Yl9zcyhfbW1fYWRkX3NzKGQxLGQyKSxkKTsKKyAgICByZCAgPSBfbW1fZGl2X3NzKF9tbV9zZXRfc3MoMS4wZiksIGRldCk7CisKKy8vICAgICAjaWZkZWYgWkVST19TSU5HVUxBUgorLy8gICAgICAgICByZCA9IF9tbV9hbmRfcHMoX21tX2NtcG5lcV9zcyhkZXQsX21tX3NldHplcm9fcHMoKSksIHJkKTsKKy8vICAgICAjZW5kaWYKKworICAgIC8vICBpQiA9IEQgKiAoQSNCKSMgPSBEKkIjKkEKKyAgICBpQiA9IF9tbV9tdWxfcHMoRCwgX21tX3NodWZmbGVfcHMoQUIsQUIsMHgzMykpOworICAgIGlCID0gX21tX3N1Yl9wcyhpQiwgX21tX211bF9wcyhfbW1fc2h1ZmZsZV9wcyhELEQsMHhCMSksIF9tbV9zaHVmZmxlX3BzKEFCLEFCLDB4NjYpKSk7CisgICAgLy8gIGlDID0gQSAqIChEI0MpIyA9IEEqQyMqRAorICAgIGlDID0gX21tX211bF9wcyhBLCBfbW1fc2h1ZmZsZV9wcyhEQyxEQywweDMzKSk7CisgICAgaUMgPSBfbW1fc3ViX3BzKGlDLCBfbW1fbXVsX3BzKF9tbV9zaHVmZmxlX3BzKEEsQSwweEIxKSwgX21tX3NodWZmbGVfcHMoREMsREMsMHg2NikpKTsKKworICAgIHJkID0gX21tX3NodWZmbGVfcHMocmQscmQsMCk7CisgICAgcmQgPSBfbW1feG9yX3BzKHJkLCBfbW1fbG9hZF9wcygoZmxvYXQqKV9TaWduX1BOTlApKTsKKworICAgIC8vICBpQiA9IEMqfEJ8IC0gRCpCIypBCisgICAgaUIgPSBfbW1fc3ViX3BzKF9tbV9tdWxfcHMoQyxfbW1fc2h1ZmZsZV9wcyhkQixkQiwwKSksIGlCKTsKKworICAgIC8vICBpQyA9IEIqfEN8IC0gQSpDIypEOworICAgIGlDID0gX21tX3N1Yl9wcyhfbW1fbXVsX3BzKEIsX21tX3NodWZmbGVfcHMoZEMsZEMsMCkpLCBpQyk7CisKKyAgICAvLyAgaVggPSBpWCAvIGRldAorICAgIGlBID0gX21tX211bF9wcyhyZCxpQSk7CisgICAgaUIgPSBfbW1fbXVsX3BzKHJkLGlCKTsKKyAgICBpQyA9IF9tbV9tdWxfcHMocmQsaUMpOworICAgIGlEID0gX21tX211bF9wcyhyZCxpRCk7CisKKyAgICByZXN1bHQudGVtcGxhdGUgd3JpdGVQYWNrZXQ8UmVzdWx0QWxpZ25tZW50PiggMCwgX21tX3NodWZmbGVfcHMoaUEsaUIsMHg3NykpOworICAgIHJlc3VsdC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxSZXN1bHRBbGlnbm1lbnQ+KCA0LCBfbW1fc2h1ZmZsZV9wcyhpQSxpQiwweDIyKSk7CisgICAgcmVzdWx0LnRlbXBsYXRlIHdyaXRlUGFja2V0PFJlc3VsdEFsaWdubWVudD4oIDgsIF9tbV9zaHVmZmxlX3BzKGlDLGlELDB4NzcpKTsKKyAgICByZXN1bHQudGVtcGxhdGUgd3JpdGVQYWNrZXQ8UmVzdWx0QWxpZ25tZW50PigxMiwgX21tX3NodWZmbGVfcHMoaUMsaUQsMHgyMikpOworICB9CisKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29tcHV0ZV9pbnZlcnNlX3NpemU0PEFyY2hpdGVjdHVyZTo6U1NFLCBkb3VibGUsIE1hdHJpeFR5cGUsIFJlc3VsdFR5cGU+Cit7CisgIGVudW0geworICAgIE1hdHJpeEFsaWdubWVudCA9IGJvb2woTWF0cml4VHlwZTo6RmxhZ3MmQWxpZ25lZEJpdCksCisgICAgUmVzdWx0QWxpZ25tZW50ID0gYm9vbChSZXN1bHRUeXBlOjpGbGFncyZBbGlnbmVkQml0KSwKKyAgICBTdG9yYWdlT3JkZXJzTWF0Y2ggID0gKE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0KSA9PSAoUmVzdWx0VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpCisgIH07CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIFJlc3VsdFR5cGUmIHJlc3VsdCkKKyAgeworICAgIGNvbnN0IF9fbTEyOGQgX1NpZ25fTlAgPSBfbW1fY2FzdHNpMTI4X3BkKF9tbV9zZXRfZXBpMzIoMHgwLDB4MCwweDgwMDAwMDAwLDB4MCkpOworICAgIGNvbnN0IF9fbTEyOGQgX1NpZ25fUE4gPSBfbW1fY2FzdHNpMTI4X3BkKF9tbV9zZXRfZXBpMzIoMHg4MDAwMDAwMCwweDAsMHgwLDB4MCkpOworCisgICAgLy8gVGhlIGludmVyc2UgaXMgY2FsY3VsYXRlZCB1c2luZyAiRGl2aWRlIGFuZCBDb25xdWVyIiB0ZWNobmlxdWUuIFRoZQorICAgIC8vIG9yaWdpbmFsIG1hdHJpeCBpcyBkaXZpZGUgaW50byBmb3VyIDJ4MiBzdWItbWF0cmljZXMuIFNpbmNlIGVhY2gKKyAgICAvLyByZWdpc3RlciBvZiB0aGUgbWF0cml4IGhvbGRzIHR3byBlbGVtZW50LCB0aGUgc21hbGxlciBtYXRyaWNlcyBhcmUKKyAgICAvLyBjb25zaXN0ZWQgb2YgdHdvIHJlZ2lzdGVycy4gSGVuY2Ugd2UgZ2V0IGEgYmV0dGVyIGxvY2FsaXR5IG9mIHRoZQorICAgIC8vIGNhbGN1bGF0aW9ucy4KKworICAgIC8vIHRoZSBmb3VyIHN1Yi1tYXRyaWNlcworICAgIF9fbTEyOGQgQTEsIEEyLCBCMSwgQjIsIEMxLCBDMiwgRDEsIEQyOworICAgIAorICAgIGlmKFN0b3JhZ2VPcmRlcnNNYXRjaCkKKyAgICB7CisgICAgICBBMSA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggMCk7IEIxID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KCAyKTsKKyAgICAgIEEyID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KCA0KTsgQjIgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDYpOworICAgICAgQzEgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDgpOyBEMSA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PigxMCk7CisgICAgICBDMiA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PigxMik7IEQyID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KDE0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIF9fbTEyOGQgdG1wOworICAgICAgQTEgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDApOyBDMSA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggMik7CisgICAgICBBMiA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PiggNCk7IEMyID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KCA2KTsKKyAgICAgIHRtcCA9IEExOworICAgICAgQTEgPSBfbW1fdW5wYWNrbG9fcGQoQTEsQTIpOworICAgICAgQTIgPSBfbW1fdW5wYWNraGlfcGQodG1wLEEyKTsKKyAgICAgIHRtcCA9IEMxOworICAgICAgQzEgPSBfbW1fdW5wYWNrbG9fcGQoQzEsQzIpOworICAgICAgQzIgPSBfbW1fdW5wYWNraGlfcGQodG1wLEMyKTsKKyAgICAgIAorICAgICAgQjEgPSBtYXRyaXgudGVtcGxhdGUgcGFja2V0PE1hdHJpeEFsaWdubWVudD4oIDgpOyBEMSA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PigxMCk7CisgICAgICBCMiA9IG1hdHJpeC50ZW1wbGF0ZSBwYWNrZXQ8TWF0cml4QWxpZ25tZW50PigxMik7IEQyID0gbWF0cml4LnRlbXBsYXRlIHBhY2tldDxNYXRyaXhBbGlnbm1lbnQ+KDE0KTsKKyAgICAgIHRtcCA9IEIxOworICAgICAgQjEgPSBfbW1fdW5wYWNrbG9fcGQoQjEsQjIpOworICAgICAgQjIgPSBfbW1fdW5wYWNraGlfcGQodG1wLEIyKTsKKyAgICAgIHRtcCA9IEQxOworICAgICAgRDEgPSBfbW1fdW5wYWNrbG9fcGQoRDEsRDIpOworICAgICAgRDIgPSBfbW1fdW5wYWNraGlfcGQodG1wLEQyKTsKKyAgICB9CisgICAgCisgICAgX19tMTI4ZCBpQTEsIGlBMiwgaUIxLCBpQjIsIGlDMSwgaUMyLCBpRDEsIGlEMiwgICAgIC8vIHBhcnRpYWwgaW52ZXNlIG9mIHRoZSBzdWItbWF0cmljZXMKKyAgICAgICAgICAgIERDMSwgREMyLCBBQjEsIEFCMjsKKyAgICBfX20xMjhkIGRBLCBkQiwgZEMsIGREOyAgICAgLy8gZGV0ZXJtaW5hbnQgb2YgdGhlIHN1Yi1tYXRyaWNlcworICAgIF9fbTEyOGQgZGV0LCBkMSwgZDIsIHJkOworCisgICAgLy8gIGRBID0gfEF8CisgICAgZEEgPSBfbW1fc2h1ZmZsZV9wZChBMiwgQTIsIDEpOworICAgIGRBID0gX21tX211bF9wZChBMSwgZEEpOworICAgIGRBID0gX21tX3N1Yl9zZChkQSwgX21tX3NodWZmbGVfcGQoZEEsZEEsMykpOworICAgIC8vICBkQiA9IHxCfAorICAgIGRCID0gX21tX3NodWZmbGVfcGQoQjIsIEIyLCAxKTsKKyAgICBkQiA9IF9tbV9tdWxfcGQoQjEsIGRCKTsKKyAgICBkQiA9IF9tbV9zdWJfc2QoZEIsIF9tbV9zaHVmZmxlX3BkKGRCLGRCLDMpKTsKKworICAgIC8vICBBQiA9IEEjICogQgorICAgIEFCMSA9IF9tbV9tdWxfcGQoQjEsIF9tbV9zaHVmZmxlX3BkKEEyLEEyLDMpKTsKKyAgICBBQjIgPSBfbW1fbXVsX3BkKEIyLCBfbW1fc2h1ZmZsZV9wZChBMSxBMSwwKSk7CisgICAgQUIxID0gX21tX3N1Yl9wZChBQjEsIF9tbV9tdWxfcGQoQjIsIF9tbV9zaHVmZmxlX3BkKEExLEExLDMpKSk7CisgICAgQUIyID0gX21tX3N1Yl9wZChBQjIsIF9tbV9tdWxfcGQoQjEsIF9tbV9zaHVmZmxlX3BkKEEyLEEyLDApKSk7CisKKyAgICAvLyAgZEMgPSB8Q3wKKyAgICBkQyA9IF9tbV9zaHVmZmxlX3BkKEMyLCBDMiwgMSk7CisgICAgZEMgPSBfbW1fbXVsX3BkKEMxLCBkQyk7CisgICAgZEMgPSBfbW1fc3ViX3NkKGRDLCBfbW1fc2h1ZmZsZV9wZChkQyxkQywzKSk7CisgICAgLy8gIGREID0gfER8CisgICAgZEQgPSBfbW1fc2h1ZmZsZV9wZChEMiwgRDIsIDEpOworICAgIGREID0gX21tX211bF9wZChEMSwgZEQpOworICAgIGREID0gX21tX3N1Yl9zZChkRCwgX21tX3NodWZmbGVfcGQoZEQsZEQsMykpOworCisgICAgLy8gIERDID0gRCMgKiBDCisgICAgREMxID0gX21tX211bF9wZChDMSwgX21tX3NodWZmbGVfcGQoRDIsRDIsMykpOworICAgIERDMiA9IF9tbV9tdWxfcGQoQzIsIF9tbV9zaHVmZmxlX3BkKEQxLEQxLDApKTsKKyAgICBEQzEgPSBfbW1fc3ViX3BkKERDMSwgX21tX211bF9wZChDMiwgX21tX3NodWZmbGVfcGQoRDEsRDEsMykpKTsKKyAgICBEQzIgPSBfbW1fc3ViX3BkKERDMiwgX21tX211bF9wZChDMSwgX21tX3NodWZmbGVfcGQoRDIsRDIsMCkpKTsKKworICAgIC8vICByZCA9IHRyYWNlKEFCKkRDKSA9IHRyYWNlKEEjKkIqRCMqQykKKyAgICBkMSA9IF9tbV9tdWxfcGQoQUIxLCBfbW1fc2h1ZmZsZV9wZChEQzEsIERDMiwgMCkpOworICAgIGQyID0gX21tX211bF9wZChBQjIsIF9tbV9zaHVmZmxlX3BkKERDMSwgREMyLCAzKSk7CisgICAgcmQgPSBfbW1fYWRkX3BkKGQxLCBkMik7CisgICAgcmQgPSBfbW1fYWRkX3NkKHJkLCBfbW1fc2h1ZmZsZV9wZChyZCwgcmQsMykpOworCisgICAgLy8gIGlEID0gQypBIypCCisgICAgaUQxID0gX21tX211bF9wZChBQjEsIF9tbV9zaHVmZmxlX3BkKEMxLEMxLDApKTsKKyAgICBpRDIgPSBfbW1fbXVsX3BkKEFCMSwgX21tX3NodWZmbGVfcGQoQzIsQzIsMCkpOworICAgIGlEMSA9IF9tbV9hZGRfcGQoaUQxLCBfbW1fbXVsX3BkKEFCMiwgX21tX3NodWZmbGVfcGQoQzEsQzEsMykpKTsKKyAgICBpRDIgPSBfbW1fYWRkX3BkKGlEMiwgX21tX211bF9wZChBQjIsIF9tbV9zaHVmZmxlX3BkKEMyLEMyLDMpKSk7CisKKyAgICAvLyAgaUEgPSBCKkQjKkMKKyAgICBpQTEgPSBfbW1fbXVsX3BkKERDMSwgX21tX3NodWZmbGVfcGQoQjEsQjEsMCkpOworICAgIGlBMiA9IF9tbV9tdWxfcGQoREMxLCBfbW1fc2h1ZmZsZV9wZChCMixCMiwwKSk7CisgICAgaUExID0gX21tX2FkZF9wZChpQTEsIF9tbV9tdWxfcGQoREMyLCBfbW1fc2h1ZmZsZV9wZChCMSxCMSwzKSkpOworICAgIGlBMiA9IF9tbV9hZGRfcGQoaUEyLCBfbW1fbXVsX3BkKERDMiwgX21tX3NodWZmbGVfcGQoQjIsQjIsMykpKTsKKworICAgIC8vICBpRCA9IEQqfEF8IC0gQypBIypCCisgICAgZEEgPSBfbW1fc2h1ZmZsZV9wZChkQSxkQSwwKTsKKyAgICBpRDEgPSBfbW1fc3ViX3BkKF9tbV9tdWxfcGQoRDEsIGRBKSwgaUQxKTsKKyAgICBpRDIgPSBfbW1fc3ViX3BkKF9tbV9tdWxfcGQoRDIsIGRBKSwgaUQyKTsKKworICAgIC8vICBpQSA9IEEqfER8IC0gQipEIypDOworICAgIGREID0gX21tX3NodWZmbGVfcGQoZEQsZEQsMCk7CisgICAgaUExID0gX21tX3N1Yl9wZChfbW1fbXVsX3BkKEExLCBkRCksIGlBMSk7CisgICAgaUEyID0gX21tX3N1Yl9wZChfbW1fbXVsX3BkKEEyLCBkRCksIGlBMik7CisKKyAgICBkMSA9IF9tbV9tdWxfc2QoZEEsIGREKTsKKyAgICBkMiA9IF9tbV9tdWxfc2QoZEIsIGRDKTsKKworICAgIC8vICBpQiA9IEQgKiAoQSNCKSMgPSBEKkIjKkEKKyAgICBpQjEgPSBfbW1fbXVsX3BkKEQxLCBfbW1fc2h1ZmZsZV9wZChBQjIsQUIxLDEpKTsKKyAgICBpQjIgPSBfbW1fbXVsX3BkKEQyLCBfbW1fc2h1ZmZsZV9wZChBQjIsQUIxLDEpKTsKKyAgICBpQjEgPSBfbW1fc3ViX3BkKGlCMSwgX21tX211bF9wZChfbW1fc2h1ZmZsZV9wZChEMSxEMSwxKSwgX21tX3NodWZmbGVfcGQoQUIyLEFCMSwyKSkpOworICAgIGlCMiA9IF9tbV9zdWJfcGQoaUIyLCBfbW1fbXVsX3BkKF9tbV9zaHVmZmxlX3BkKEQyLEQyLDEpLCBfbW1fc2h1ZmZsZV9wZChBQjIsQUIxLDIpKSk7CisKKyAgICAvLyAgZGV0ID0gfEF8KnxEfCArIHxCfCp8Q3wgLSB0cmFjZShBIypCKkQjKkMpCisgICAgZGV0ID0gX21tX2FkZF9zZChkMSwgZDIpOworICAgIGRldCA9IF9tbV9zdWJfc2QoZGV0LCByZCk7CisKKyAgICAvLyAgaUMgPSBBICogKEQjQykjID0gQSpDIypECisgICAgaUMxID0gX21tX211bF9wZChBMSwgX21tX3NodWZmbGVfcGQoREMyLERDMSwxKSk7CisgICAgaUMyID0gX21tX211bF9wZChBMiwgX21tX3NodWZmbGVfcGQoREMyLERDMSwxKSk7CisgICAgaUMxID0gX21tX3N1Yl9wZChpQzEsIF9tbV9tdWxfcGQoX21tX3NodWZmbGVfcGQoQTEsQTEsMSksIF9tbV9zaHVmZmxlX3BkKERDMixEQzEsMikpKTsKKyAgICBpQzIgPSBfbW1fc3ViX3BkKGlDMiwgX21tX211bF9wZChfbW1fc2h1ZmZsZV9wZChBMixBMiwxKSwgX21tX3NodWZmbGVfcGQoREMyLERDMSwyKSkpOworCisgICAgcmQgPSBfbW1fZGl2X3NkKF9tbV9zZXRfc2QoMS4wKSwgZGV0KTsKKy8vICAgICAjaWZkZWYgWkVST19TSU5HVUxBUgorLy8gICAgICAgICByZCA9IF9tbV9hbmRfcGQoX21tX2NtcG5lcV9zZChkZXQsX21tX3NldHplcm9fcGQoKSksIHJkKTsKKy8vICAgICAjZW5kaWYKKyAgICByZCA9IF9tbV9zaHVmZmxlX3BkKHJkLHJkLDApOworCisgICAgLy8gIGlCID0gQyp8QnwgLSBEKkIjKkEKKyAgICBkQiA9IF9tbV9zaHVmZmxlX3BkKGRCLGRCLDApOworICAgIGlCMSA9IF9tbV9zdWJfcGQoX21tX211bF9wZChDMSwgZEIpLCBpQjEpOworICAgIGlCMiA9IF9tbV9zdWJfcGQoX21tX211bF9wZChDMiwgZEIpLCBpQjIpOworCisgICAgZDEgPSBfbW1feG9yX3BkKHJkLCBfU2lnbl9QTik7CisgICAgZDIgPSBfbW1feG9yX3BkKHJkLCBfU2lnbl9OUCk7CisKKyAgICAvLyAgaUMgPSBCKnxDfCAtIEEqQyMqRDsKKyAgICBkQyA9IF9tbV9zaHVmZmxlX3BkKGRDLGRDLDApOworICAgIGlDMSA9IF9tbV9zdWJfcGQoX21tX211bF9wZChCMSwgZEMpLCBpQzEpOworICAgIGlDMiA9IF9tbV9zdWJfcGQoX21tX211bF9wZChCMiwgZEMpLCBpQzIpOworCisgICAgcmVzdWx0LnRlbXBsYXRlIHdyaXRlUGFja2V0PFJlc3VsdEFsaWdubWVudD4oIDAsIF9tbV9tdWxfcGQoX21tX3NodWZmbGVfcGQoaUEyLCBpQTEsIDMpLCBkMSkpOyAgICAgLy8gaUEjIC8gZGV0CisgICAgcmVzdWx0LnRlbXBsYXRlIHdyaXRlUGFja2V0PFJlc3VsdEFsaWdubWVudD4oIDQsIF9tbV9tdWxfcGQoX21tX3NodWZmbGVfcGQoaUEyLCBpQTEsIDApLCBkMikpOworICAgIHJlc3VsdC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxSZXN1bHRBbGlnbm1lbnQ+KCAyLCBfbW1fbXVsX3BkKF9tbV9zaHVmZmxlX3BkKGlCMiwgaUIxLCAzKSwgZDEpKTsgICAgIC8vIGlCIyAvIGRldAorICAgIHJlc3VsdC50ZW1wbGF0ZSB3cml0ZVBhY2tldDxSZXN1bHRBbGlnbm1lbnQ+KCA2LCBfbW1fbXVsX3BkKF9tbV9zaHVmZmxlX3BkKGlCMiwgaUIxLCAwKSwgZDIpKTsKKyAgICByZXN1bHQudGVtcGxhdGUgd3JpdGVQYWNrZXQ8UmVzdWx0QWxpZ25tZW50PiggOCwgX21tX211bF9wZChfbW1fc2h1ZmZsZV9wZChpQzIsIGlDMSwgMyksIGQxKSk7ICAgICAvLyBpQyMgLyBkZXQKKyAgICByZXN1bHQudGVtcGxhdGUgd3JpdGVQYWNrZXQ8UmVzdWx0QWxpZ25tZW50PigxMiwgX21tX211bF9wZChfbW1fc2h1ZmZsZV9wZChpQzIsIGlDMSwgMCksIGQyKSk7CisgICAgcmVzdWx0LnRlbXBsYXRlIHdyaXRlUGFja2V0PFJlc3VsdEFsaWdubWVudD4oMTAsIF9tbV9tdWxfcGQoX21tX3NodWZmbGVfcGQoaUQyLCBpRDEsIDMpLCBkMSkpOyAgICAgLy8gaUQjIC8gZGV0CisgICAgcmVzdWx0LnRlbXBsYXRlIHdyaXRlUGFja2V0PFJlc3VsdEFsaWdubWVudD4oMTQsIF9tbV9tdWxfcGQoX21tX3NodWZmbGVfcGQoaUQyLCBpRDEsIDApLCBkMikpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9JTlZFUlNFX1NTRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvT3JkZXJpbmdNZXRob2RzL0FtZC5oIGIvRWlnZW4vc3JjL09yZGVyaW5nTWV0aG9kcy9BbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTA0ODUyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL09yZGVyaW5nTWV0aG9kcy9BbWQuaApAQCAtMCwwICsxLDQzOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvKgorCitOT1RFOiB0aGlzIHJvdXRpbmUgaGFzIGJlZW4gYWRhcHRlZCBmcm9tIHRoZSBDU3BhcnNlIGxpYnJhcnk6CisKK0NvcHlyaWdodCAoYykgMjAwNiwgVGltb3RoeSBBLiBEYXZpcy4KK2h0dHA6Ly93d3cuY2lzZS51ZmwuZWR1L3Jlc2VhcmNoL3NwYXJzZS9DU3BhcnNlCisKK0NTcGFyc2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKK3ZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitDU3BhcnNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0xlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIE1vZHVsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworKi8KKworI2luY2x1ZGUgIi4uL0NvcmUvdXRpbC9Ob25NUEwyLmgiCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX0FNRF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9BTURfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCBhbWRfZmxpcChjb25zdCBUJiBpKSB7IHJldHVybiAtaS0yOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgVCBhbWRfdW5mbGlwKGNvbnN0IFQmIGkpIHsgcmV0dXJuIGk8MCA/IGFtZF9mbGlwKGkpIDogaTsgfQordGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPiBpbmxpbmUgYm9vbCBhbWRfbWFya2VkKGNvbnN0IFQwKiB3LCBjb25zdCBUMSYgaikgeyByZXR1cm4gd1tqXTwwOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+IGlubGluZSB2b2lkIGFtZF9tYXJrKGNvbnN0IFQwKiB3LCBjb25zdCBUMSYgaikgeyByZXR1cm4gd1tqXSA9IGFtZF9mbGlwKHdbal0pOyB9CisKKy8qIGNsZWFyIHcgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4Pgorc3RhdGljIGludCBjc193Y2xlYXIgKEluZGV4IG1hcmssIEluZGV4IGxlbWF4LCBJbmRleCAqdywgSW5kZXggbikKK3sKKyAgSW5kZXggazsKKyAgaWYobWFyayA8IDIgfHwgKG1hcmsgKyBsZW1heCA8IDApKQorICB7CisgICAgZm9yKGsgPSAwOyBrIDwgbjsgaysrKQorICAgICAgaWYod1trXSAhPSAwKQorICAgICAgICB3W2tdID0gMTsKKyAgICBtYXJrID0gMjsKKyAgfQorICByZXR1cm4gKG1hcmspOyAgICAgLyogYXQgdGhpcyBwb2ludCwgd1swLi5uLTFdIDwgbWFyayBob2xkcyAqLworfQorCisvKiBkZXB0aC1maXJzdCBzZWFyY2ggYW5kIHBvc3RvcmRlciBvZiBhIHRyZWUgcm9vdGVkIGF0IG5vZGUgaiAqLwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+CitJbmRleCBjc190ZGZzKEluZGV4IGosIEluZGV4IGssIEluZGV4ICpoZWFkLCBjb25zdCBJbmRleCAqbmV4dCwgSW5kZXggKnBvc3QsIEluZGV4ICpzdGFjaykKK3sKKyAgaW50IGksIHAsIHRvcCA9IDA7CisgIGlmKCFoZWFkIHx8ICFuZXh0IHx8ICFwb3N0IHx8ICFzdGFjaykgcmV0dXJuICgtMSk7ICAgIC8qIGNoZWNrIGlucHV0cyAqLworICBzdGFja1swXSA9IGo7ICAgICAgICAgICAgICAgICAvKiBwbGFjZSBqIG9uIHRoZSBzdGFjayAqLworICB3aGlsZSAodG9wID49IDApICAgICAgICAgICAgICAgIC8qIHdoaWxlIChzdGFjayBpcyBub3QgZW1wdHkpICovCisgIHsKKyAgICBwID0gc3RhY2tbdG9wXTsgICAgICAgICAgIC8qIHAgPSB0b3Agb2Ygc3RhY2sgKi8KKyAgICBpID0gaGVhZFtwXTsgICAgICAgICAgICAgIC8qIGkgPSB5b3VuZ2VzdCBjaGlsZCBvZiBwICovCisgICAgaWYoaSA9PSAtMSkKKyAgICB7CisgICAgICB0b3AtLTsgICAgICAgICAgICAgICAgIC8qIHAgaGFzIG5vIHVub3JkZXJlZCBjaGlsZHJlbiBsZWZ0ICovCisgICAgICBwb3N0W2srK10gPSBwOyAgICAgICAgLyogbm9kZSBwIGlzIHRoZSBrdGggcG9zdG9yZGVyZWQgbm9kZSAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGVhZFtwXSA9IG5leHRbaV07ICAgLyogcmVtb3ZlIGkgZnJvbSBjaGlsZHJlbiBvZiBwICovCisgICAgICBzdGFja1srK3RvcF0gPSBpOyAgICAgLyogc3RhcnQgZGZzIG9uIGNoaWxkIG5vZGUgaSAqLworICAgIH0KKyAgfQorICByZXR1cm4gazsKK30KKworCisvKiogXGludGVybmFsCisgICogQXBwcm94aW1hdGUgbWluaW11bSBkZWdyZWUgb3JkZXJpbmcgYWxnb3JpdGhtLgorICAqIFxyZXR1cm5zIHRoZSBwZXJtdXRhdGlvbiBQIHJlZHVjaW5nIHRoZSBmaWxsLWluIG9mIHRoZSBpbnB1dCBtYXRyaXggXGEgQworICAqIFRoZSBpbnB1dCBtYXRyaXggXGEgQyBtdXN0IGJlIGEgc2VsZmFkam9pbnQgY29tcHJlc3NlZCBjb2x1bW4gbWFqb3IgU3BhcnNlTWF0cml4IG9iamVjdC4gQm90aCB0aGUgdXBwZXIgYW5kIGxvd2VyIHBhcnRzIGhhdmUgdG8gYmUgc3RvcmVkLCBidXQgdGhlIGRpYWdvbmFsIGVudHJpZXMgYXJlIG9wdGlvbmFsLgorICAqIE9uIGV4aXQgdGhlIHZhbHVlcyBvZiBDIGFyZSBkZXN0cm95ZWQgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXg+Cit2b2lkIG1pbmltdW1fZGVncmVlX29yZGVyaW5nKFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsSW5kZXg+JiBDLCBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsSW5kZXg+JiBwZXJtKQoreworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcixJbmRleD4gQ0NTOworICAKKyAgaW50IGQsIGRrLCBkZXh0LCBsZW1heCA9IDAsIGUsIGVsZW5rLCBlbG4sIGksIGosIGssIGsxLAorICAgICAgazIsIGszLCBqbGFzdCwgbG4sIGRlbnNlLCBuem1heCwgbWluZGVnID0gMCwgbnZpLCBudmosIG52aywgbWFyaywgd252aSwKKyAgICAgIG9rLCBuZWwgPSAwLCBwLCBwMSwgcDIsIHAzLCBwNCwgcGosIHBrLCBwazEsIHBrMiwgcG4sIHEsIHQ7CisgIHVuc2lnbmVkIGludCBoOworICAKKyAgSW5kZXggbiA9IEMuY29scygpOworICBkZW5zZSA9IHN0ZDo6bWF4PEluZGV4PiAoMTYsIEluZGV4KDEwICogc3FydChkb3VibGUobikpKSk7ICAgLyogZmluZCBkZW5zZSB0aHJlc2hvbGQgKi8KKyAgZGVuc2UgPSBzdGQ6Om1pbjxJbmRleD4gKG4tMiwgZGVuc2UpOworICAKKyAgSW5kZXggY256ID0gQy5ub25aZXJvcygpOworICBwZXJtLnJlc2l6ZShuKzEpOworICB0ID0gY256ICsgY256LzUgKyAyKm47ICAgICAgICAgICAgICAgICAvKiBhZGQgZWxib3cgcm9vbSB0byBDICovCisgIEMucmVzaXplTm9uWmVyb3ModCk7CisgIAorICBJbmRleCogVyAgICAgICA9IG5ldyBJbmRleFs4KihuKzEpXTsgLyogZ2V0IHdvcmtzcGFjZSAqLworICBJbmRleCogbGVuICAgICA9IFc7CisgIEluZGV4KiBudiAgICAgID0gVyArICAgKG4rMSk7CisgIEluZGV4KiBuZXh0ICAgID0gVyArIDIqKG4rMSk7CisgIEluZGV4KiBoZWFkICAgID0gVyArIDMqKG4rMSk7CisgIEluZGV4KiBlbGVuICAgID0gVyArIDQqKG4rMSk7CisgIEluZGV4KiBkZWdyZWUgID0gVyArIDUqKG4rMSk7CisgIEluZGV4KiB3ICAgICAgID0gVyArIDYqKG4rMSk7CisgIEluZGV4KiBoaGVhZCAgID0gVyArIDcqKG4rMSk7CisgIEluZGV4KiBsYXN0ICAgID0gcGVybS5pbmRpY2VzKCkuZGF0YSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBQIGFzIHdvcmtzcGFjZSBmb3IgbGFzdCAqLworICAKKyAgLyogLS0tIEluaXRpYWxpemUgcXVvdGllbnQgZ3JhcGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBJbmRleCogQ3AgPSBDLm91dGVySW5kZXhQdHIoKTsKKyAgSW5kZXgqIENpID0gQy5pbm5lckluZGV4UHRyKCk7CisgIGZvcihrID0gMDsgayA8IG47IGsrKykKKyAgICBsZW5ba10gPSBDcFtrKzFdIC0gQ3Bba107CisgIGxlbltuXSA9IDA7CisgIG56bWF4ID0gdDsKKyAgCisgIGZvcihpID0gMDsgaSA8PSBuOyBpKyspCisgIHsKKyAgICBoZWFkW2ldICAgPSAtMTsgICAgICAgICAgICAgICAgICAgICAvLyBkZWdyZWUgbGlzdCBpIGlzIGVtcHR5CisgICAgbGFzdFtpXSAgID0gLTE7CisgICAgbmV4dFtpXSAgID0gLTE7CisgICAgaGhlYWRbaV0gID0gLTE7ICAgICAgICAgICAgICAgICAgICAgLy8gaGFzaCBsaXN0IGkgaXMgZW1wdHkgCisgICAgbnZbaV0gICAgID0gMTsgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZSBpIGlzIGp1c3Qgb25lIG5vZGUKKyAgICB3W2ldICAgICAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAvLyBub2RlIGkgaXMgYWxpdmUKKyAgICBlbGVuW2ldICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvLyBFayBvZiBub2RlIGkgaXMgZW1wdHkKKyAgICBkZWdyZWVbaV0gPSBsZW5baV07ICAgICAgICAgICAgICAgICAvLyBkZWdyZWUgb2Ygbm9kZSBpCisgIH0KKyAgbWFyayA9IGludGVybmFsOjpjc193Y2xlYXI8SW5kZXg+KDAsIDAsIHcsIG4pOyAgICAgICAgIC8qIGNsZWFyIHcgKi8KKyAgZWxlbltuXSA9IC0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuIGlzIGEgZGVhZCBlbGVtZW50ICovCisgIENwW25dID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbiBpcyBhIHJvb3Qgb2YgYXNzZW1ibHkgdHJlZSAqLworICB3W25dID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG4gaXMgYSBkZWFkIGVsZW1lbnQgKi8KKyAgCisgIC8qIC0tLSBJbml0aWFsaXplIGRlZ3JlZSBsaXN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKQorICB7CisgICAgZCA9IGRlZ3JlZVtpXTsKKyAgICBpZihkID09IDApICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vZGUgaSBpcyBlbXB0eSAqLworICAgIHsKKyAgICAgIGVsZW5baV0gPSAtMjsgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgaSBpcyBkZWFkICovCisgICAgICBuZWwrKzsKKyAgICAgIENwW2ldID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIGkgaXMgYSByb290IG9mIGFzc2VtYmx5IHRyZWUgKi8KKyAgICAgIHdbaV0gPSAwOworICAgIH0KKyAgICBlbHNlIGlmKGQgPiBkZW5zZSkgICAgICAgICAgICAgICAgIC8qIG5vZGUgaSBpcyBkZW5zZSAqLworICAgIHsKKyAgICAgIG52W2ldID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGFic29yYiBpIGludG8gZWxlbWVudCBuICovCisgICAgICBlbGVuW2ldID0gLTE7ICAgICAgICAgICAgICAgICAvKiBub2RlIGkgaXMgZGVhZCAqLworICAgICAgbmVsKys7CisgICAgICBDcFtpXSA9IGFtZF9mbGlwIChuKTsKKyAgICAgIG52W25dKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZihoZWFkW2RdICE9IC0xKSBsYXN0W2hlYWRbZF1dID0gaTsKKyAgICAgIG5leHRbaV0gPSBoZWFkW2RdOyAgICAgICAgICAgLyogcHV0IG5vZGUgaSBpbiBkZWdyZWUgbGlzdCBkICovCisgICAgICBoZWFkW2RdID0gaTsKKyAgICB9CisgIH0KKyAgCisgIHdoaWxlIChuZWwgPCBuKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSAoc2VsZWN0aW5nIHBpdm90cykgZG8gKi8KKyAgeworICAgIC8qIC0tLSBTZWxlY3Qgbm9kZSBvZiBtaW5pbXVtIGFwcHJveGltYXRlIGRlZ3JlZSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGZvcihrID0gLTE7IG1pbmRlZyA8IG4gJiYgKGsgPSBoZWFkW21pbmRlZ10pID09IC0xOyBtaW5kZWcrKykge30KKyAgICBpZihuZXh0W2tdICE9IC0xKSBsYXN0W25leHRba11dID0gLTE7CisgICAgaGVhZFttaW5kZWddID0gbmV4dFtrXTsgICAgICAgICAgLyogcmVtb3ZlIGsgZnJvbSBkZWdyZWUgbGlzdCAqLworICAgIGVsZW5rID0gZWxlbltrXTsgICAgICAgICAgICAgICAgICAvKiBlbGVuayA9IHxFa3wgKi8KKyAgICBudmsgPSBudltrXTsgICAgICAgICAgICAgICAgICAgICAgLyogIyBvZiBub2RlcyBrIHJlcHJlc2VudHMgKi8KKyAgICBuZWwgKz0gbnZrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG52W2tdIG5vZGVzIG9mIEEgZWxpbWluYXRlZCAqLworICAgIAorICAgIC8qIC0tLSBHYXJiYWdlIGNvbGxlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGlmKGVsZW5rID4gMCAmJiBjbnogKyBtaW5kZWcgPj0gbnptYXgpCisgICAgeworICAgICAgZm9yKGogPSAwOyBqIDwgbjsgaisrKQorICAgICAgeworICAgICAgICBpZigocCA9IENwW2pdKSA+PSAwKSAgICAgIC8qIGogaXMgYSBsaXZlIG5vZGUgb3IgZWxlbWVudCAqLworICAgICAgICB7CisgICAgICAgICAgQ3Bbal0gPSBDaVtwXTsgICAgICAgICAgLyogc2F2ZSBmaXJzdCBlbnRyeSBvZiBvYmplY3QgKi8KKyAgICAgICAgICBDaVtwXSA9IGFtZF9mbGlwIChqKTsgICAgLyogZmlyc3QgZW50cnkgaXMgbm93IGFtZF9mbGlwKGopICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvcihxID0gMCwgcCA9IDA7IHAgPCBjbno7ICkgLyogc2NhbiBhbGwgb2YgbWVtb3J5ICovCisgICAgICB7CisgICAgICAgIGlmKChqID0gYW1kX2ZsaXAgKENpW3ArK10pKSA+PSAwKSAgLyogZm91bmQgb2JqZWN0IGogKi8KKyAgICAgICAgeworICAgICAgICAgIENpW3FdID0gQ3Bbal07ICAgICAgIC8qIHJlc3RvcmUgZmlyc3QgZW50cnkgb2Ygb2JqZWN0ICovCisgICAgICAgICAgQ3Bbal0gPSBxKys7ICAgICAgICAgIC8qIG5ldyBwb2ludGVyIHRvIG9iamVjdCBqICovCisgICAgICAgICAgZm9yKGszID0gMDsgazMgPCBsZW5bal0tMTsgazMrKykgQ2lbcSsrXSA9IENpW3ArK107CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNueiA9IHE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDaVtjbnouLi5uem1heC0xXSBub3cgZnJlZSAqLworICAgIH0KKyAgICAKKyAgICAvKiAtLS0gQ29uc3RydWN0IG5ldyBlbGVtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBkayA9IDA7CisgICAgbnZba10gPSAtbnZrOyAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgayBhcyBpbiBMayAqLworICAgIHAgPSBDcFtrXTsKKyAgICBwazEgPSAoZWxlbmsgPT0gMCkgPyBwIDogY256OyAgICAgIC8qIGRvIGluIHBsYWNlIGlmIGVsZW5ba10gPT0gMCAqLworICAgIHBrMiA9IHBrMTsKKyAgICBmb3IoazEgPSAxOyBrMSA8PSBlbGVuayArIDE7IGsxKyspCisgICAgeworICAgICAgaWYoazEgPiBlbGVuaykKKyAgICAgIHsKKyAgICAgICAgZSA9IGs7ICAgICAgICAgICAgICAgICAgICAgLyogc2VhcmNoIHRoZSBub2RlcyBpbiBrICovCisgICAgICAgIHBqID0gcDsgICAgICAgICAgICAgICAgICAgIC8qIGxpc3Qgb2Ygbm9kZXMgc3RhcnRzIGF0IENpW3BqXSovCisgICAgICAgIGxuID0gbGVuW2tdIC0gZWxlbms7ICAgICAgLyogbGVuZ3RoIG9mIGxpc3Qgb2Ygbm9kZXMgaW4gayAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBlID0gQ2lbcCsrXTsgICAgICAgICAgICAgIC8qIHNlYXJjaCB0aGUgbm9kZXMgaW4gZSAqLworICAgICAgICBwaiA9IENwW2VdOworICAgICAgICBsbiA9IGxlbltlXTsgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBsaXN0IG9mIG5vZGVzIGluIGUgKi8KKyAgICAgIH0KKyAgICAgIGZvcihrMiA9IDE7IGsyIDw9IGxuOyBrMisrKQorICAgICAgeworICAgICAgICBpID0gQ2lbcGorK107CisgICAgICAgIGlmKChudmkgPSBudltpXSkgPD0gMCkgY29udGludWU7IC8qIG5vZGUgaSBkZWFkLCBvciBzZWVuICovCisgICAgICAgIGRrICs9IG52aTsgICAgICAgICAgICAgICAgIC8qIGRlZ3JlZVtMa10gKz0gc2l6ZSBvZiBub2RlIGkgKi8KKyAgICAgICAgbnZbaV0gPSAtbnZpOyAgICAgICAgICAgICAvKiBuZWdhdGUgbnZbaV0gdG8gZGVub3RlIGkgaW4gTGsqLworICAgICAgICBDaVtwazIrK10gPSBpOyAgICAgICAgICAgIC8qIHBsYWNlIGkgaW4gTGsgKi8KKyAgICAgICAgaWYobmV4dFtpXSAhPSAtMSkgbGFzdFtuZXh0W2ldXSA9IGxhc3RbaV07CisgICAgICAgIGlmKGxhc3RbaV0gIT0gLTEpICAgICAgICAgLyogcmVtb3ZlIGkgZnJvbSBkZWdyZWUgbGlzdCAqLworICAgICAgICB7CisgICAgICAgICAgbmV4dFtsYXN0W2ldXSA9IG5leHRbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaGVhZFtkZWdyZWVbaV1dID0gbmV4dFtpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYoZSAhPSBrKQorICAgICAgeworICAgICAgICBDcFtlXSA9IGFtZF9mbGlwIChrKTsgICAgICAvKiBhYnNvcmIgZSBpbnRvIGsgKi8KKyAgICAgICAgd1tlXSA9IDA7ICAgICAgICAgICAgICAgICAvKiBlIGlzIG5vdyBhIGRlYWQgZWxlbWVudCAqLworICAgICAgfQorICAgIH0KKyAgICBpZihlbGVuayAhPSAwKSBjbnogPSBwazI7ICAgICAgICAgLyogQ2lbY256Li4ubnptYXhdIGlzIGZyZWUgKi8KKyAgICBkZWdyZWVba10gPSBkazsgICAgICAgICAgICAgICAgICAgLyogZXh0ZXJuYWwgZGVncmVlIG9mIGsgLSB8TGtcaXwgKi8KKyAgICBDcFtrXSA9IHBrMTsgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCBrIGlzIGluIENpW3BrMS4ucGsyLTFdICovCisgICAgbGVuW2tdID0gcGsyIC0gcGsxOworICAgIGVsZW5ba10gPSAtMjsgICAgICAgICAgICAgICAgICAgICAvKiBrIGlzIG5vdyBhbiBlbGVtZW50ICovCisgICAgCisgICAgLyogLS0tIEZpbmQgc2V0IGRpZmZlcmVuY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgbWFyayA9IGludGVybmFsOjpjc193Y2xlYXI8SW5kZXg+KG1hcmssIGxlbWF4LCB3LCBuKTsgIC8qIGNsZWFyIHcgaWYgbmVjZXNzYXJ5ICovCisgICAgZm9yKHBrID0gcGsxOyBwayA8IHBrMjsgcGsrKykgICAgLyogc2NhbiAxOiBmaW5kIHxMZVxMa3wgKi8KKyAgICB7CisgICAgICBpID0gQ2lbcGtdOworICAgICAgaWYoKGVsbiA9IGVsZW5baV0pIDw9IDApIGNvbnRpbnVlOy8qIHNraXAgaWYgZWxlbltpXSBlbXB0eSAqLworICAgICAgbnZpID0gLW52W2ldOyAgICAgICAgICAgICAgICAgICAgICAvKiBudltpXSB3YXMgbmVnYXRlZCAqLworICAgICAgd252aSA9IG1hcmsgLSBudmk7CisgICAgICBmb3IocCA9IENwW2ldOyBwIDw9IENwW2ldICsgZWxuIC0gMTsgcCsrKSAgLyogc2NhbiBFaSAqLworICAgICAgeworICAgICAgICBlID0gQ2lbcF07CisgICAgICAgIGlmKHdbZV0gPj0gbWFyaykKKyAgICAgICAgeworICAgICAgICAgIHdbZV0gLT0gbnZpOyAgICAgICAgICAvKiBkZWNyZW1lbnQgfExlXExrfCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYod1tlXSAhPSAwKSAgICAgICAgLyogZW5zdXJlIGUgaXMgYSBsaXZlIGVsZW1lbnQgKi8KKyAgICAgICAgeworICAgICAgICAgIHdbZV0gPSBkZWdyZWVbZV0gKyB3bnZpOyAvKiAxc3QgdGltZSBlIHNlZW4gaW4gc2NhbiAxICovCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogLS0tIERlZ3JlZSB1cGRhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgZm9yKHBrID0gcGsxOyBwayA8IHBrMjsgcGsrKykgICAgLyogc2NhbjI6IGRlZ3JlZSB1cGRhdGUgKi8KKyAgICB7CisgICAgICBpID0gQ2lbcGtdOyAgICAgICAgICAgICAgICAgICAvKiBjb25zaWRlciBub2RlIGkgaW4gTGsgKi8KKyAgICAgIHAxID0gQ3BbaV07CisgICAgICBwMiA9IHAxICsgZWxlbltpXSAtIDE7CisgICAgICBwbiA9IHAxOworICAgICAgZm9yKGggPSAwLCBkID0gMCwgcCA9IHAxOyBwIDw9IHAyOyBwKyspICAgIC8qIHNjYW4gRWkgKi8KKyAgICAgIHsKKyAgICAgICAgZSA9IENpW3BdOworICAgICAgICBpZih3W2VdICE9IDApICAgICAgICAgICAgIC8qIGUgaXMgYW4gdW5hYnNvcmJlZCBlbGVtZW50ICovCisgICAgICAgIHsKKyAgICAgICAgICBkZXh0ID0gd1tlXSAtIG1hcms7ICAgLyogZGV4dCA9IHxMZVxMa3wgKi8KKyAgICAgICAgICBpZihkZXh0ID4gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkICs9IGRleHQ7ICAgICAgICAgLyogc3VtIHVwIHRoZSBzZXQgZGlmZmVyZW5jZXMgKi8KKyAgICAgICAgICAgIENpW3BuKytdID0gZTsgICAgIC8qIGtlZXAgZSBpbiBFaSAqLworICAgICAgICAgICAgaCArPSBlOyAgICAgICAgICAgIC8qIGNvbXB1dGUgdGhlIGhhc2ggb2Ygbm9kZSBpICovCisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBDcFtlXSA9IGFtZF9mbGlwIChrKTsgIC8qIGFnZ3Jlc3NpdmUgYWJzb3JiLiBlLT5rICovCisgICAgICAgICAgICB3W2VdID0gMDsgICAgICAgICAgICAgLyogZSBpcyBhIGRlYWQgZWxlbWVudCAqLworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxlbltpXSA9IHBuIC0gcDEgKyAxOyAgICAgICAgLyogZWxlbltpXSA9IHxFaXwgKi8KKyAgICAgIHAzID0gcG47CisgICAgICBwNCA9IHAxICsgbGVuW2ldOworICAgICAgZm9yKHAgPSBwMiArIDE7IHAgPCBwNDsgcCsrKSAvKiBwcnVuZSBlZGdlcyBpbiBBaSAqLworICAgICAgeworICAgICAgICBqID0gQ2lbcF07CisgICAgICAgIGlmKChudmogPSBudltqXSkgPD0gMCkgY29udGludWU7IC8qIG5vZGUgaiBkZWFkIG9yIGluIExrICovCisgICAgICAgIGQgKz0gbnZqOyAgICAgICAgICAgICAgICAgIC8qIGRlZ3JlZShpKSArPSB8anwgKi8KKyAgICAgICAgQ2lbcG4rK10gPSBqOyAgICAgICAgICAgICAvKiBwbGFjZSBqIGluIG5vZGUgbGlzdCBvZiBpICovCisgICAgICAgIGggKz0gajsgICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgaGFzaCBmb3Igbm9kZSBpICovCisgICAgICB9CisgICAgICBpZihkID09IDApICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgZm9yIG1hc3MgZWxpbWluYXRpb24gKi8KKyAgICAgIHsKKyAgICAgICAgQ3BbaV0gPSBhbWRfZmxpcCAoayk7ICAgICAgLyogYWJzb3JiIGkgaW50byBrICovCisgICAgICAgIG52aSA9IC1udltpXTsKKyAgICAgICAgZGsgLT0gbnZpOyAgICAgICAgICAgICAgICAgLyogfExrfCAtPSB8aXwgKi8KKyAgICAgICAgbnZrICs9IG52aTsgICAgICAgICAgICAgICAgLyogfGt8ICs9IG52W2ldICovCisgICAgICAgIG5lbCArPSBudmk7CisgICAgICAgIG52W2ldID0gMDsKKyAgICAgICAgZWxlbltpXSA9IC0xOyAgICAgICAgICAgICAvKiBub2RlIGkgaXMgZGVhZCAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBkZWdyZWVbaV0gPSBzdGQ6Om1pbjxJbmRleD4gKGRlZ3JlZVtpXSwgZCk7ICAgLyogdXBkYXRlIGRlZ3JlZShpKSAqLworICAgICAgICBDaVtwbl0gPSBDaVtwM107ICAgICAgICAgLyogbW92ZSBmaXJzdCBub2RlIHRvIGVuZCAqLworICAgICAgICBDaVtwM10gPSBDaVtwMV07ICAgICAgICAgLyogbW92ZSAxc3QgZWwuIHRvIGVuZCBvZiBFaSAqLworICAgICAgICBDaVtwMV0gPSBrOyAgICAgICAgICAgICAgIC8qIGFkZCBrIGFzIDFzdCBlbGVtZW50IGluIG9mIEVpICovCisgICAgICAgIGxlbltpXSA9IHBuIC0gcDEgKyAxOyAgICAgLyogbmV3IGxlbiBvZiBhZGouIGxpc3Qgb2Ygbm9kZSBpICovCisgICAgICAgIGggJT0gbjsgICAgICAgICAgICAgICAgICAgIC8qIGZpbmFsaXplIGhhc2ggb2YgaSAqLworICAgICAgICBuZXh0W2ldID0gaGhlYWRbaF07ICAgICAgLyogcGxhY2UgaSBpbiBoYXNoIGJ1Y2tldCAqLworICAgICAgICBoaGVhZFtoXSA9IGk7CisgICAgICAgIGxhc3RbaV0gPSBoOyAgICAgICAgICAgICAgLyogc2F2ZSBoYXNoIG9mIGkgaW4gbGFzdFtpXSAqLworICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYW4yIGlzIGRvbmUgKi8KKyAgICBkZWdyZWVba10gPSBkazsgICAgICAgICAgICAgICAgICAgLyogZmluYWxpemUgfExrfCAqLworICAgIGxlbWF4ID0gc3RkOjptYXg8SW5kZXg+KGxlbWF4LCBkayk7CisgICAgbWFyayA9IGludGVybmFsOjpjc193Y2xlYXI8SW5kZXg+KG1hcmsrbGVtYXgsIGxlbWF4LCB3LCBuKTsgICAgLyogY2xlYXIgdyAqLworICAgIAorICAgIC8qIC0tLSBTdXBlcm5vZGUgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGZvcihwayA9IHBrMTsgcGsgPCBwazI7IHBrKyspCisgICAgeworICAgICAgaSA9IENpW3BrXTsKKyAgICAgIGlmKG52W2ldID49IDApIGNvbnRpbnVlOyAgICAgICAgIC8qIHNraXAgaWYgaSBpcyBkZWFkICovCisgICAgICBoID0gbGFzdFtpXTsgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbiBoYXNoIGJ1Y2tldCBvZiBub2RlIGkgKi8KKyAgICAgIGkgPSBoaGVhZFtoXTsKKyAgICAgIGhoZWFkW2hdID0gLTE7ICAgICAgICAgICAgICAgICAgICAvKiBoYXNoIGJ1Y2tldCB3aWxsIGJlIGVtcHR5ICovCisgICAgICBmb3IoOyBpICE9IC0xICYmIG5leHRbaV0gIT0gLTE7IGkgPSBuZXh0W2ldLCBtYXJrKyspCisgICAgICB7CisgICAgICAgIGxuID0gbGVuW2ldOworICAgICAgICBlbG4gPSBlbGVuW2ldOworICAgICAgICBmb3IocCA9IENwW2ldKzE7IHAgPD0gQ3BbaV0gKyBsbi0xOyBwKyspIHdbQ2lbcF1dID0gbWFyazsKKyAgICAgICAgamxhc3QgPSBpOworICAgICAgICBmb3IoaiA9IG5leHRbaV07IGogIT0gLTE7ICkgLyogY29tcGFyZSBpIHdpdGggYWxsIGogKi8KKyAgICAgICAgeworICAgICAgICAgIG9rID0gKGxlbltqXSA9PSBsbikgJiYgKGVsZW5bal0gPT0gZWxuKTsKKyAgICAgICAgICBmb3IocCA9IENwW2pdICsgMTsgb2sgJiYgcCA8PSBDcFtqXSArIGxuIC0gMTsgcCsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHdbQ2lbcF1dICE9IG1hcmspIG9rID0gMDsgICAgLyogY29tcGFyZSBpIGFuZCBqKi8KKyAgICAgICAgICB9CisgICAgICAgICAgaWYob2spICAgICAgICAgICAgICAgICAgICAgLyogaSBhbmQgaiBhcmUgaWRlbnRpY2FsICovCisgICAgICAgICAgeworICAgICAgICAgICAgQ3Bbal0gPSBhbWRfZmxpcCAoaSk7ICAvKiBhYnNvcmIgaiBpbnRvIGkgKi8KKyAgICAgICAgICAgIG52W2ldICs9IG52W2pdOworICAgICAgICAgICAgbnZbal0gPSAwOworICAgICAgICAgICAgZWxlbltqXSA9IC0xOyAgICAgICAgIC8qIG5vZGUgaiBpcyBkZWFkICovCisgICAgICAgICAgICBqID0gbmV4dFtqXTsgICAgICAgICAgLyogZGVsZXRlIGogZnJvbSBoYXNoIGJ1Y2tldCAqLworICAgICAgICAgICAgbmV4dFtqbGFzdF0gPSBqOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgamxhc3QgPSBqOyAgICAgICAgICAgICAvKiBqIGFuZCBpIGFyZSBkaWZmZXJlbnQgKi8KKyAgICAgICAgICAgIGogPSBuZXh0W2pdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiAtLS0gRmluYWxpemUgbmV3IGVsZW1lbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBmb3IocCA9IHBrMSwgcGsgPSBwazE7IHBrIDwgcGsyOyBwaysrKSAgIC8qIGZpbmFsaXplIExrICovCisgICAgeworICAgICAgaSA9IENpW3BrXTsKKyAgICAgIGlmKChudmkgPSAtbnZbaV0pIDw9IDApIGNvbnRpbnVlOy8qIHNraXAgaWYgaSBpcyBkZWFkICovCisgICAgICBudltpXSA9IG52aTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBudltpXSAqLworICAgICAgZCA9IGRlZ3JlZVtpXSArIGRrIC0gbnZpOyAgICAgICAgIC8qIGNvbXB1dGUgZXh0ZXJuYWwgZGVncmVlKGkpICovCisgICAgICBkID0gc3RkOjptaW48SW5kZXg+IChkLCBuIC0gbmVsIC0gbnZpKTsKKyAgICAgIGlmKGhlYWRbZF0gIT0gLTEpIGxhc3RbaGVhZFtkXV0gPSBpOworICAgICAgbmV4dFtpXSA9IGhlYWRbZF07ICAgICAgICAgICAgICAgLyogcHV0IGkgYmFjayBpbiBkZWdyZWUgbGlzdCAqLworICAgICAgbGFzdFtpXSA9IC0xOworICAgICAgaGVhZFtkXSA9IGk7CisgICAgICBtaW5kZWcgPSBzdGQ6Om1pbjxJbmRleD4gKG1pbmRlZywgZCk7ICAgICAgIC8qIGZpbmQgbmV3IG1pbmltdW0gZGVncmVlICovCisgICAgICBkZWdyZWVbaV0gPSBkOworICAgICAgQ2lbcCsrXSA9IGk7ICAgICAgICAgICAgICAgICAgICAgIC8qIHBsYWNlIGkgaW4gTGsgKi8KKyAgICB9CisgICAgbnZba10gPSBudms7ICAgICAgICAgICAgICAgICAgICAgIC8qICMgbm9kZXMgYWJzb3JiZWQgaW50byBrICovCisgICAgaWYoKGxlbltrXSA9IHAtcGsxKSA9PSAwKSAgICAgICAgIC8qIGxlbmd0aCBvZiBhZGogbGlzdCBvZiBlbGVtZW50IGsqLworICAgIHsKKyAgICAgIENwW2tdID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIGsgaXMgYSByb290IG9mIHRoZSB0cmVlICovCisgICAgICB3W2tdID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBrIGlzIG5vdyBhIGRlYWQgZWxlbWVudCAqLworICAgIH0KKyAgICBpZihlbGVuayAhPSAwKSBjbnogPSBwOyAgICAgICAgICAgLyogZnJlZSB1bnVzZWQgc3BhY2UgaW4gTGsgKi8KKyAgfQorICAKKyAgLyogLS0tIFBvc3RvcmRlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIENwW2ldID0gYW1kX2ZsaXAgKENwW2ldKTsvKiBmaXggYXNzZW1ibHkgdHJlZSAqLworICBmb3IoaiA9IDA7IGogPD0gbjsgaisrKSBoZWFkW2pdID0gLTE7CisgIGZvcihqID0gbjsgaiA+PSAwOyBqLS0pICAgICAgICAgICAgICAvKiBwbGFjZSB1bm9yZGVyZWQgbm9kZXMgaW4gbGlzdHMgKi8KKyAgeworICAgIGlmKG52W2pdID4gMCkgY29udGludWU7ICAgICAgICAgIC8qIHNraXAgaWYgaiBpcyBhbiBlbGVtZW50ICovCisgICAgbmV4dFtqXSA9IGhlYWRbQ3Bbal1dOyAgICAgICAgICAvKiBwbGFjZSBqIGluIGxpc3Qgb2YgaXRzIHBhcmVudCAqLworICAgIGhlYWRbQ3Bbal1dID0gajsKKyAgfQorICBmb3IoZSA9IG47IGUgPj0gMDsgZS0tKSAgICAgICAgICAgICAgLyogcGxhY2UgZWxlbWVudHMgaW4gbGlzdHMgKi8KKyAgeworICAgIGlmKG52W2VdIDw9IDApIGNvbnRpbnVlOyAgICAgICAgIC8qIHNraXAgdW5sZXNzIGUgaXMgYW4gZWxlbWVudCAqLworICAgIGlmKENwW2VdICE9IC0xKQorICAgIHsKKyAgICAgIG5leHRbZV0gPSBoZWFkW0NwW2VdXTsgICAgICAvKiBwbGFjZSBlIGluIGxpc3Qgb2YgaXRzIHBhcmVudCAqLworICAgICAgaGVhZFtDcFtlXV0gPSBlOworICAgIH0KKyAgfQorICBmb3IoayA9IDAsIGkgPSAwOyBpIDw9IG47IGkrKykgICAgICAgLyogcG9zdG9yZGVyIHRoZSBhc3NlbWJseSB0cmVlICovCisgIHsKKyAgICBpZihDcFtpXSA9PSAtMSkgayA9IGludGVybmFsOjpjc190ZGZzPEluZGV4PihpLCBrLCBoZWFkLCBuZXh0LCBwZXJtLmluZGljZXMoKS5kYXRhKCksIHcpOworICB9CisgIAorICBwZXJtLmluZGljZXMoKS5jb25zZXJ2YXRpdmVSZXNpemUobik7CisKKyAgZGVsZXRlW10gVzsKK30KKworfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfQU1EX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9PcmRlcmluZ01ldGhvZHMvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvT3JkZXJpbmdNZXRob2RzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNGJiMjcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvT3JkZXJpbmdNZXRob2RzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX09yZGVyaW5nTWV0aG9kc19TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fT3JkZXJpbmdNZXRob2RzX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL09yZGVyaW5nTWV0aG9kcyBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1BhU3RpWFN1cHBvcnQvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvUGFTdGlYU3VwcG9ydC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGM2NTdlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1BhU3RpWFN1cHBvcnQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fUGFzdGl4U3VwcG9ydF9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTIAorICAke0VpZ2VuX1Bhc3RpeFN1cHBvcnRfU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS9FaWdlbi9zcmMvUGFTdGlYU3VwcG9ydCBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1BhU3RpWFN1cHBvcnQvUGFTdGlYU3VwcG9ydC5oIGIvRWlnZW4vc3JjL1BhU3RpWFN1cHBvcnQvUGFTdGlYU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTEzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvUGFTdGlYU3VwcG9ydC9QYVN0aVhTdXBwb3J0LmgKQEAgLTAsMCArMSw3NDIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIETDqXNpcsOpIE51ZW50c2EtV2FrYW0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QQVNUSVhTVVBQT1JUX0gKKyNkZWZpbmUgRUlHRU5fUEFTVElYU1VQUE9SVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgUGFTdGlYU3VwcG9ydF9Nb2R1bGUKKyAgKiBcYnJpZWYgSW50ZXJmYWNlIHRvIHRoZSBQYVN0aXggc29sdmVyCisgICogCisgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHNvbHZlIHRoZSBsaW5lYXIgc3lzdGVtcyBBLlggPSBCIHZpYSB0aGUgUGFTdGl4IGxpYnJhcnkuIAorICAqIFRoZSBtYXRyaXggY2FuIGJlIGVpdGhlciByZWFsIG9yIGNvbXBsZXgsIHN5bW1ldHJpYyBvciBub3QuCisgICoKKyAgKiBcc2EgVHV0b3JpYWxTcGFyc2VEaXJlY3RTb2x2ZXJzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgYm9vbCBJc1N0clN5bSA9IGZhbHNlPiBjbGFzcyBQYXN0aXhMVTsKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgT3B0aW9ucz4gY2xhc3MgUGFzdGl4TExUOwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBPcHRpb25zPiBjbGFzcyBQYXN0aXhMRExUOworCituYW1lc3BhY2UgaW50ZXJuYWwKK3sKKyAgICAKKyAgdGVtcGxhdGU8Y2xhc3MgUGFzdGl4PiBzdHJ1Y3QgcGFzdGl4X3RyYWl0czsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4KKyAgc3RydWN0IHBhc3RpeF90cmFpdHM8IFBhc3RpeExVPF9NYXRyaXhUeXBlPiA+CisgIHsKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBPcHRpb25zPgorICBzdHJ1Y3QgcGFzdGl4X3RyYWl0czwgUGFzdGl4TExUPF9NYXRyaXhUeXBlLE9wdGlvbnM+ID4KKyAgeworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IE9wdGlvbnM+CisgIHN0cnVjdCBwYXN0aXhfdHJhaXRzPCBQYXN0aXhMRExUPF9NYXRyaXhUeXBlLE9wdGlvbnM+ID4KKyAgeworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgfTsKKyAgCisgIHZvaWQgZWlnZW5fcGFzdGl4KHBhc3RpeF9kYXRhX3QgKipwYXN0aXhfZGF0YSwgaW50IHBhc3RpeF9jb21tLCBpbnQgbiwgaW50ICpwdHIsIGludCAqaWR4LCBmbG9hdCAqdmFscywgaW50ICpwZXJtLCBpbnQgKiBpbnZwLCBmbG9hdCAqeCwgaW50IG5icmhzLCBpbnQgKmlwYXJtLCBkb3VibGUgKmRwYXJtKQorICB7CisgICAgaWYgKG4gPT0gMCkgeyBwdHIgPSBOVUxMOyBpZHggPSBOVUxMOyB2YWxzID0gTlVMTDsgfQorICAgIGlmIChuYnJocyA9PSAwKSB7eCA9IE5VTEw7IG5icmhzPTE7fQorICAgIHNfcGFzdGl4KHBhc3RpeF9kYXRhLCBwYXN0aXhfY29tbSwgbiwgcHRyLCBpZHgsIHZhbHMsIHBlcm0sIGludnAsIHgsIG5icmhzLCBpcGFybSwgZHBhcm0pOyAKKyAgfQorICAKKyAgdm9pZCBlaWdlbl9wYXN0aXgocGFzdGl4X2RhdGFfdCAqKnBhc3RpeF9kYXRhLCBpbnQgcGFzdGl4X2NvbW0sIGludCBuLCBpbnQgKnB0ciwgaW50ICppZHgsIGRvdWJsZSAqdmFscywgaW50ICpwZXJtLCBpbnQgKiBpbnZwLCBkb3VibGUgKngsIGludCBuYnJocywgaW50ICppcGFybSwgZG91YmxlICpkcGFybSkKKyAgeworICAgIGlmIChuID09IDApIHsgcHRyID0gTlVMTDsgaWR4ID0gTlVMTDsgdmFscyA9IE5VTEw7IH0KKyAgICBpZiAobmJyaHMgPT0gMCkge3ggPSBOVUxMOyBuYnJocz0xO30KKyAgICBkX3Bhc3RpeChwYXN0aXhfZGF0YSwgcGFzdGl4X2NvbW0sIG4sIHB0ciwgaWR4LCB2YWxzLCBwZXJtLCBpbnZwLCB4LCBuYnJocywgaXBhcm0sIGRwYXJtKTsgCisgIH0KKyAgCisgIHZvaWQgZWlnZW5fcGFzdGl4KHBhc3RpeF9kYXRhX3QgKipwYXN0aXhfZGF0YSwgaW50IHBhc3RpeF9jb21tLCBpbnQgbiwgaW50ICpwdHIsIGludCAqaWR4LCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICp2YWxzLCBpbnQgKnBlcm0sIGludCAqIGludnAsIHN0ZDo6Y29tcGxleDxmbG9hdD4gKngsIGludCBuYnJocywgaW50ICppcGFybSwgZG91YmxlICpkcGFybSkKKyAgeworICAgIGlmIChuID09IDApIHsgcHRyID0gTlVMTDsgaWR4ID0gTlVMTDsgdmFscyA9IE5VTEw7IH0KKyAgICBpZiAobmJyaHMgPT0gMCkge3ggPSBOVUxMOyBuYnJocz0xO30KKyAgICBjX3Bhc3RpeChwYXN0aXhfZGF0YSwgcGFzdGl4X2NvbW0sIG4sIHB0ciwgaWR4LCByZWludGVycHJldF9jYXN0PENPTVBMRVgqPih2YWxzKSwgcGVybSwgaW52cCwgcmVpbnRlcnByZXRfY2FzdDxDT01QTEVYKj4oeCksIG5icmhzLCBpcGFybSwgZHBhcm0pOyAKKyAgfQorICAKKyAgdm9pZCBlaWdlbl9wYXN0aXgocGFzdGl4X2RhdGFfdCAqKnBhc3RpeF9kYXRhLCBpbnQgcGFzdGl4X2NvbW0sIGludCBuLCBpbnQgKnB0ciwgaW50ICppZHgsIHN0ZDo6Y29tcGxleDxkb3VibGU+ICp2YWxzLCBpbnQgKnBlcm0sIGludCAqIGludnAsIHN0ZDo6Y29tcGxleDxkb3VibGU+ICp4LCBpbnQgbmJyaHMsIGludCAqaXBhcm0sIGRvdWJsZSAqZHBhcm0pCisgIHsKKyAgICBpZiAobiA9PSAwKSB7IHB0ciA9IE5VTEw7IGlkeCA9IE5VTEw7IHZhbHMgPSBOVUxMOyB9CisgICAgaWYgKG5icmhzID09IDApIHt4ID0gTlVMTDsgbmJyaHM9MTt9CisgICAgel9wYXN0aXgocGFzdGl4X2RhdGEsIHBhc3RpeF9jb21tLCBuLCBwdHIsIGlkeCwgcmVpbnRlcnByZXRfY2FzdDxEQ09NUExFWCo+KHZhbHMpLCBwZXJtLCBpbnZwLCByZWludGVycHJldF9jYXN0PERDT01QTEVYKj4oeCksIG5icmhzLCBpcGFybSwgZHBhcm0pOyAKKyAgfQorCisgIC8vIENvbnZlcnQgdGhlIG1hdHJpeCAgdG8gRm9ydHJhbi1zdHlsZSBOdW1iZXJpbmcKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIHZvaWQgY190b19mb3J0cmFuX251bWJlcmluZyAoTWF0cml4VHlwZSYgbWF0KQorICB7CisgICAgaWYgKCAhKG1hdC5vdXRlckluZGV4UHRyKClbMF0pICkgCisgICAgeyAKKyAgICAgIGludCBpOworICAgICAgZm9yKGkgPSAwOyBpIDw9IG1hdC5yb3dzKCk7ICsraSkKKyAgICAgICAgKyttYXQub3V0ZXJJbmRleFB0cigpW2ldOworICAgICAgZm9yKGkgPSAwOyBpIDwgbWF0Lm5vblplcm9zKCk7ICsraSkKKyAgICAgICAgKyttYXQuaW5uZXJJbmRleFB0cigpW2ldOworICAgIH0KKyAgfQorICAKKyAgLy8gQ29udmVydCB0byBDLXN0eWxlIE51bWJlcmluZworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgdm9pZCBmb3J0cmFuX3RvX2NfbnVtYmVyaW5nIChNYXRyaXhUeXBlJiBtYXQpCisgIHsKKyAgICAvLyBDaGVjayB0aGUgTnVtYmVyaW5nCisgICAgaWYgKCBtYXQub3V0ZXJJbmRleFB0cigpWzBdID09IDEgKSAKKyAgICB7IC8vIENvbnZlcnQgdG8gQy1zdHlsZSBudW1iZXJpbmcKKyAgICAgIGludCBpOworICAgICAgZm9yKGkgPSAwOyBpIDw9IG1hdC5yb3dzKCk7ICsraSkKKyAgICAgICAgLS1tYXQub3V0ZXJJbmRleFB0cigpW2ldOworICAgICAgZm9yKGkgPSAwOyBpIDwgbWF0Lm5vblplcm9zKCk7ICsraSkKKyAgICAgICAgLS1tYXQuaW5uZXJJbmRleFB0cigpW2ldOworICAgIH0KKyAgfQorfQorCisvLyBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIHRvIGludGVyZmFjZSB3aXRoIFBhU3RpWCBmdW5jdGlvbnMuIAorLy8gVXNlcnMgc2hvdWxkIG5vdCB1c2VkIHRoaXMgY2xhc3MgZGlyZWN0bHkuIAordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+CitjbGFzcyBQYXN0aXhCYXNlIDogaW50ZXJuYWw6Om5vbmNvcHlhYmxlCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYXN0aXhfdHJhaXRzPERlcml2ZWQ+OjpNYXRyaXhUeXBlIF9NYXRyaXhUeXBlOworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3I7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvcj4gQ29sU3BNYXRyaXg7CisgICAgCisgIHB1YmxpYzoKKyAgICAKKyAgICBQYXN0aXhCYXNlKCkgOiBtX2luaXRpc09rKGZhbHNlKSwgbV9hbmFseXNpc0lzT2soZmFsc2UpLCBtX2ZhY3Rvcml6YXRpb25Jc09rKGZhbHNlKSwgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwgbV9wYXN0aXhkYXRhKDApLCBtX3NpemUoMCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgfQorICAgIAorICAgIH5QYXN0aXhCYXNlKCkgCisgICAgeworICAgICAgY2xlYW4oKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHNvbHV0aW9uIHggb2YgXGYkIEEgeCA9IGIgXGYkIHVzaW5nIHRoZSBjdXJyZW50IGRlY29tcG9zaXRpb24gb2YgQS4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjpzb2x2ZV9yZXR2YWw8UGFzdGl4QmFzZSwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJQYXN0aXggc29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dzKCk9PWIucm93cygpCisgICAgICAgICAgICAgICAgJiYgIlBhc3RpeEJhc2U6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8UGFzdGl4QmFzZSwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KKyAgICBib29sIF9zb2x2ZSAoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZ4KSBjb25zdDsKKyAgICAKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0U2NhbGFyLCBpbnQgRGVzdE9wdGlvbnMsIHR5cGVuYW1lIERlc3RJbmRleD4KKyAgICB2b2lkIF9zb2x2ZV9zcGFyc2UoY29uc3QgUmhzJiBiLCBTcGFyc2VNYXRyaXg8RGVzdFNjYWxhcixEZXN0T3B0aW9ucyxEZXN0SW5kZXg+ICZkZXN0KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgZGVjb21wb3NpdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc29sdmluZywgeW91IG11c3QgZmlyc3QgY2FsbCBlaXRoZXIgY29tcHV0ZSgpIG9yIHN5bWJvbGljKCkvbnVtZXJpYygpIik7CisgICAgICBlaWdlbl9hc3NlcnQocm93cygpPT1iLnJvd3MoKSk7CisgICAgICAKKyAgICAgIC8vIHdlIHByb2Nlc3MgdGhlIHNwYXJzZSByaHMgcGVyIGJsb2NrIG9mIE5iQ29sc0F0T25jZSBjb2x1bW5zIHRlbXBvcmFyaWx5IHN0b3JlZCBpbnRvIGEgZGVuc2UgbWF0cml4LgorICAgICAgc3RhdGljIGNvbnN0IGludCBOYkNvbHNBdE9uY2UgPSAxOworICAgICAgaW50IHJoc0NvbHMgPSBiLmNvbHMoKTsKKyAgICAgIGludCBzaXplID0gYi5yb3dzKCk7CisgICAgICBFaWdlbjo6TWF0cml4PERlc3RTY2FsYXIsRHluYW1pYyxEeW5hbWljPiB0bXAoc2l6ZSxyaHNDb2xzKTsKKyAgICAgIGZvcihpbnQgaz0wOyBrPHJoc0NvbHM7IGsrPU5iQ29sc0F0T25jZSkKKyAgICAgIHsKKyAgICAgICAgaW50IGFjdHVhbENvbHMgPSBzdGQ6Om1pbjxpbnQ+KHJoc0NvbHMtaywgTmJDb2xzQXRPbmNlKTsKKyAgICAgICAgdG1wLmxlZnRDb2xzKGFjdHVhbENvbHMpID0gYi5taWRkbGVDb2xzKGssYWN0dWFsQ29scyk7CisgICAgICAgIHRtcC5sZWZ0Q29scyhhY3R1YWxDb2xzKSA9IGRlcml2ZWQoKS5zb2x2ZSh0bXAubGVmdENvbHMoYWN0dWFsQ29scykpOworICAgICAgICBkZXN0Lm1pZGRsZUNvbHMoayxhY3R1YWxDb2xzKSA9IHRtcC5sZWZ0Q29scyhhY3R1YWxDb2xzKS5zcGFyc2VWaWV3KCk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIERlcml2ZWQmIGRlcml2ZWQoKQorICAgIHsKKyAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOworICAgIH0KKyAgICBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgaW50ZWdlciB2ZWN0b3IgSVBBUk0gb2YgUGFTdGlYIHBhcmFtZXRlcnMKKyAgICAgICogdG8gbW9kaWZ5IHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuIAorICAgICAgKiBUaGUgc3RhdGlzdGljcyByZWxhdGVkIHRvIHRoZSBkaWZmZXJlbnQgcGhhc2VzIG9mIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlIGFyZSBzYXZlZCBoZXJlIGFzIHdlbGwKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgQXJyYXk8SW5kZXgsSVBBUk1fU0laRSwxPiYgaXBhcm0oKQorICAgIHsKKyAgICAgIHJldHVybiBtX2lwYXJtOyAKKyAgICB9CisgICAgCisgICAgLyoqIFJldHVybiBhIHJlZmVyZW5jZSB0byBhIHBhcnRpY3VsYXIgaW5kZXggcGFyYW1ldGVyIG9mIHRoZSBJUEFSTSB2ZWN0b3IgCisgICAgICogXHNhIGlwYXJtKCkKKyAgICAgKi8KKyAgICAKKyAgICBpbnQmIGlwYXJtKGludCBpZHhwYXJhbSkKKyAgICB7CisgICAgICByZXR1cm4gbV9pcGFybShpZHhwYXJhbSk7CisgICAgfQorICAgIAorICAgICAvKiogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgZG91YmxlIHZlY3RvciBEUEFSTSBvZiBQYVN0aVggcGFyYW1ldGVycyAKKyAgICAgICogVGhlIHN0YXRpc3RpY3MgcmVsYXRlZCB0byB0aGUgZGlmZmVyZW50IHBoYXNlcyBvZiBmYWN0b3JpemF0aW9uIGFuZCBzb2x2ZSBhcmUgc2F2ZWQgaGVyZSBhcyB3ZWxsCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIEFycmF5PFJlYWxTY2FsYXIsSVBBUk1fU0laRSwxPiYgZHBhcm0oKQorICAgIHsKKyAgICAgIHJldHVybiBtX2RwYXJtOyAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqIFJldHVybiBhIHJlZmVyZW5jZSB0byBhIHBhcnRpY3VsYXIgaW5kZXggcGFyYW1ldGVyIG9mIHRoZSBEUEFSTSB2ZWN0b3IgCisgICAgICogXHNhIGRwYXJtKCkKKyAgICAgKi8KKyAgICBkb3VibGUmIGRwYXJtKGludCBpZHhwYXJhbSkKKyAgICB7CisgICAgICByZXR1cm4gbV9kcGFybShpZHhwYXJhbSk7CisgICAgfQorICAgIAorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKyAgICAKKyAgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIFBhU3RpWCByZXBvcnRzIGEgcHJvYmxlbQorICAgICAgKiAgICAgICAgICBcYyBJbnZhbGlkSW5wdXQgaWYgdGhlIGlucHV0IG1hdHJpeCBpcyBpbnZhbGlkCisgICAgICAqCisgICAgICAqIFxzYSBpcGFybSgpICAgICAgICAgIAorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIHNvbHV0aW9uIHggb2YgXGYkIEEgeCA9IGIgXGYkIHVzaW5nIHRoZSBjdXJyZW50IGRlY29tcG9zaXRpb24gb2YgQS4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjpzcGFyc2Vfc29sdmVfcmV0dmFsPFBhc3RpeEJhc2UsIFJocz4KKyAgICBzb2x2ZShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiUGFzdGl4IExVLCBMTFQgb3IgTERMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQocm93cygpPT1iLnJvd3MoKQorICAgICAgICAgICAgICAgICYmICJQYXN0aXhCYXNlOjpzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6c3BhcnNlX3NvbHZlX3JldHZhbDxQYXN0aXhCYXNlLCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorICAgIAorICBwcm90ZWN0ZWQ6CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBQYXN0aXggZGF0YSBzdHJ1Y3R1cmUsIGNoZWNrIHRoZSBtYXRyaXgKKyAgICB2b2lkIGluaXQoKTsgCisgICAgCisgICAgLy8gQ29tcHV0ZSB0aGUgb3JkZXJpbmcgYW5kIHRoZSBzeW1ib2xpYyBmYWN0b3JpemF0aW9uCisgICAgdm9pZCBhbmFseXplUGF0dGVybihDb2xTcE1hdHJpeCYgbWF0KTsKKyAgICAKKyAgICAvLyBDb21wdXRlIHRoZSBudW1lcmljYWwgZmFjdG9yaXphdGlvbgorICAgIHZvaWQgZmFjdG9yaXplKENvbFNwTWF0cml4JiBtYXQpOworICAgIAorICAgIC8vIEZyZWUgYWxsIHRoZSBkYXRhIGFsbG9jYXRlZCBieSBQYXN0aXgKKyAgICB2b2lkIGNsZWFuKCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pbml0aXNPayAmJiAiVGhlIFBhc3RpeCBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBmaXJzdCIpOyAKKyAgICAgIG1faXBhcm0oSVBBUk1fU1RBUlRfVEFTSykgPSBBUElfVEFTS19DTEVBTjsKKyAgICAgIG1faXBhcm0oSVBBUk1fRU5EX1RBU0spID0gQVBJX1RBU0tfQ0xFQU47CisgICAgICBpbnRlcm5hbDo6ZWlnZW5fcGFzdGl4KCZtX3Bhc3RpeGRhdGEsIE1QSV9DT01NX1dPUkxELCAwLCAwLCAwLCAoU2NhbGFyKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Blcm0uZGF0YSgpLCBtX2ludnAuZGF0YSgpLCAwLCAwLCBtX2lwYXJtLmRhdGEoKSwgbV9kcGFybS5kYXRhKCkpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGNvbXB1dGUoQ29sU3BNYXRyaXgmIG1hdCk7CisgICAgCisgICAgaW50IG1faW5pdGlzT2s7IAorICAgIGludCBtX2FuYWx5c2lzSXNPazsKKyAgICBpbnQgbV9mYWN0b3JpemF0aW9uSXNPazsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKKyAgICBtdXRhYmxlIENvbXB1dGF0aW9uSW5mbyBtX2luZm87IAorICAgIG11dGFibGUgcGFzdGl4X2RhdGFfdCAqbV9wYXN0aXhkYXRhOyAvLyBEYXRhIHN0cnVjdHVyZSBmb3IgcGFzdGl4CisgICAgbXV0YWJsZSBpbnQgbV9jb21tOyAvLyBUaGUgTVBJIGNvbW11bmljYXRvciBpZGVudGlmaWVyCisgICAgbXV0YWJsZSBNYXRyaXg8aW50LElQQVJNX1NJWkUsMT4gbV9pcGFybTsgLy8gaW50ZWdlciB2ZWN0b3IgZm9yIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICAgbXV0YWJsZSBNYXRyaXg8ZG91YmxlLERQQVJNX1NJWkUsMT4gbV9kcGFybTsgLy8gU2NhbGFyIHZlY3RvciBmb3IgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAgICBtdXRhYmxlIE1hdHJpeDxJbmRleCxEeW5hbWljLDE+IG1fcGVybTsgIC8vIFBlcm11dGF0aW9uIHZlY3RvcgorICAgIG11dGFibGUgTWF0cml4PEluZGV4LER5bmFtaWMsMT4gbV9pbnZwOyAgLy8gSW52ZXJzZSBwZXJtdXRhdGlvbiB2ZWN0b3IKKyAgICBtdXRhYmxlIGludCBtX3NpemU7IC8vIFNpemUgb2YgdGhlIG1hdHJpeCAKK307IAorCisgLyoqIEluaXRpYWxpemUgdGhlIFBhU3RpWCBkYXRhIHN0cnVjdHVyZS4gCisgICAqQSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gZmlsbHMgaXBhcm0gYW5kIGRwYXJtIHdpdGggdGhlIGRlZmF1bHQgUGFTdGlYIHBhcmFtZXRlcnMKKyAgICogXHNhIGlwYXJtKCkgZHBhcm0oKQorICAgKi8KK3RlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPgordm9pZCBQYXN0aXhCYXNlPERlcml2ZWQ+Ojppbml0KCkKK3sKKyAgbV9zaXplID0gMDsgCisgIG1faXBhcm0uc2V0WmVybyhJUEFSTV9TSVpFKTsKKyAgbV9kcGFybS5zZXRaZXJvKERQQVJNX1NJWkUpOworICAKKyAgbV9pcGFybShJUEFSTV9NT0RJRllfUEFSQU1FVEVSKSA9IEFQSV9OTzsKKyAgcGFzdGl4KCZtX3Bhc3RpeGRhdGEsIE1QSV9DT01NX1dPUkxELAorICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgIDAsIDAsIDAsIDEsIG1faXBhcm0uZGF0YSgpLCBtX2RwYXJtLmRhdGEoKSk7CisgIAorICBtX2lwYXJtW0lQQVJNX01BVFJJWF9WRVJJRklDQVRJT05dID0gQVBJX05POworICBtX2lwYXJtW0lQQVJNX1ZFUkJPU0VdICAgICAgICAgICAgID0gMjsKKyAgbV9pcGFybVtJUEFSTV9PUkRFUklOR10gICAgICAgICAgICA9IEFQSV9PUkRFUl9TQ09UQ0g7CisgIG1faXBhcm1bSVBBUk1fSU5DT01QTEVURV0gICAgICAgICAgPSBBUElfTk87CisgIG1faXBhcm1bSVBBUk1fT09DX0xJTUlUXSAgICAgICAgICAgPSAyMDAwOworICBtX2lwYXJtW0lQQVJNX1JIU19NQUtJTkddICAgICAgICAgID0gQVBJX1JIU19COworICBtX2lwYXJtKElQQVJNX01BVFJJWF9WRVJJRklDQVRJT04pID0gQVBJX05POworICAKKyAgbV9pcGFybShJUEFSTV9TVEFSVF9UQVNLKSA9IEFQSV9UQVNLX0lOSVQ7CisgIG1faXBhcm0oSVBBUk1fRU5EX1RBU0spID0gQVBJX1RBU0tfSU5JVDsKKyAgaW50ZXJuYWw6OmVpZ2VuX3Bhc3RpeCgmbV9wYXN0aXhkYXRhLCBNUElfQ09NTV9XT1JMRCwgMCwgMCwgMCwgKFNjYWxhciopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCBtX2lwYXJtLmRhdGEoKSwgbV9kcGFybS5kYXRhKCkpOworICAKKyAgLy8gQ2hlY2sgdGhlIHJldHVybmVkIGVycm9yCisgIGlmKG1faXBhcm0oSVBBUk1fRVJST1JfTlVNQkVSKSkgeworICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICBtX2luaXRpc09rID0gZmFsc2U7CisgIH0KKyAgZWxzZSB7IAorICAgIG1faW5mbyA9IFN1Y2Nlc3M7CisgICAgbV9pbml0aXNPayA9IHRydWU7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+Cit2b2lkIFBhc3RpeEJhc2U8RGVyaXZlZD46OmNvbXB1dGUoQ29sU3BNYXRyaXgmIG1hdCkKK3sKKyAgZWlnZW5fYXNzZXJ0KG1hdC5yb3dzKCkgPT0gbWF0LmNvbHMoKSAmJiAiVGhlIGlucHV0IG1hdHJpeCBzaG91bGQgYmUgc3F1YXJlZCIpOworICAKKyAgYW5hbHl6ZVBhdHRlcm4obWF0KTsgIAorICBmYWN0b3JpemUobWF0KTsKKyAgCisgIG1faXBhcm0oSVBBUk1fTUFUUklYX1ZFUklGSUNBVElPTikgPSBBUElfTk87CisgIG1faXNJbml0aWFsaXplZCA9IG1fZmFjdG9yaXphdGlvbklzT2s7Cit9CisKKwordGVtcGxhdGUgPGNsYXNzIERlcml2ZWQ+Cit2b2lkIFBhc3RpeEJhc2U8RGVyaXZlZD46OmFuYWx5emVQYXR0ZXJuKENvbFNwTWF0cml4JiBtYXQpCit7ICAgICAgICAgICAgICAgICAgICAgICAgIAorICBlaWdlbl9hc3NlcnQobV9pbml0aXNPayAmJiAiVGhlIGluaXRpYWxpemF0aW9uIG9mIFBhU1RpWCBmYWlsZWQiKTsKKyAgCisgIC8vIGNsZWFuIHByZXZpb3VzIGNhbGxzCisgIGlmKG1fc2l6ZT4wKQorICAgIGNsZWFuKCk7CisgIAorICBtX3NpemUgPSBtYXQucm93cygpOworICBtX3Blcm0ucmVzaXplKG1fc2l6ZSk7CisgIG1faW52cC5yZXNpemUobV9zaXplKTsKKyAgCisgIG1faXBhcm0oSVBBUk1fU1RBUlRfVEFTSykgPSBBUElfVEFTS19PUkRFUklORzsKKyAgbV9pcGFybShJUEFSTV9FTkRfVEFTSykgPSBBUElfVEFTS19BTkFMWVNFOworICBpbnRlcm5hbDo6ZWlnZW5fcGFzdGl4KCZtX3Bhc3RpeGRhdGEsIE1QSV9DT01NX1dPUkxELCBtX3NpemUsIG1hdC5vdXRlckluZGV4UHRyKCksIG1hdC5pbm5lckluZGV4UHRyKCksCisgICAgICAgICAgICAgICBtYXQudmFsdWVQdHIoKSwgbV9wZXJtLmRhdGEoKSwgbV9pbnZwLmRhdGEoKSwgMCwgMCwgbV9pcGFybS5kYXRhKCksIG1fZHBhcm0uZGF0YSgpKTsKKyAgCisgIC8vIENoZWNrIHRoZSByZXR1cm5lZCBlcnJvcgorICBpZihtX2lwYXJtKElQQVJNX0VSUk9SX05VTUJFUikpCisgIHsKKyAgICBtX2luZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICBtX2FuYWx5c2lzSXNPayA9IGZhbHNlOworICB9CisgIGVsc2UKKyAgeyAKKyAgICBtX2luZm8gPSBTdWNjZXNzOworICAgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4KK3ZvaWQgUGFzdGl4QmFzZTxEZXJpdmVkPjo6ZmFjdG9yaXplKENvbFNwTWF0cml4JiBtYXQpCit7CisvLyAgIGlmKCZtX2NweU1hdCAhPSAmbWF0KSBtX2NweU1hdCA9IG1hdDsKKyAgZWlnZW5fYXNzZXJ0KG1fYW5hbHlzaXNJc09rICYmICJUaGUgYW5hbHlzaXMgcGhhc2Ugc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZhY3Rvcml6YXRpb24gcGhhc2UiKTsKKyAgbV9pcGFybShJUEFSTV9TVEFSVF9UQVNLKSA9IEFQSV9UQVNLX05VTUZBQ1Q7CisgIG1faXBhcm0oSVBBUk1fRU5EX1RBU0spID0gQVBJX1RBU0tfTlVNRkFDVDsKKyAgbV9zaXplID0gbWF0LnJvd3MoKTsKKyAgCisgIGludGVybmFsOjplaWdlbl9wYXN0aXgoJm1fcGFzdGl4ZGF0YSwgTVBJX0NPTU1fV09STEQsIG1fc2l6ZSwgbWF0Lm91dGVySW5kZXhQdHIoKSwgbWF0LmlubmVySW5kZXhQdHIoKSwKKyAgICAgICAgICAgICAgIG1hdC52YWx1ZVB0cigpLCBtX3Blcm0uZGF0YSgpLCBtX2ludnAuZGF0YSgpLCAwLCAwLCBtX2lwYXJtLmRhdGEoKSwgbV9kcGFybS5kYXRhKCkpOworICAKKyAgLy8gQ2hlY2sgdGhlIHJldHVybmVkIGVycm9yCisgIGlmKG1faXBhcm0oSVBBUk1fRVJST1JfTlVNQkVSKSkKKyAgeworICAgIG1faW5mbyA9IE51bWVyaWNhbElzc3VlOworICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSBmYWxzZTsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBtX2luZm8gPSBTdWNjZXNzOworICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgIH0KK30KKworLyogU29sdmUgdGhlIHN5c3RlbSAqLwordGVtcGxhdGU8dHlwZW5hbWUgQmFzZT4KK3RlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorYm9vbCBQYXN0aXhCYXNlPEJhc2U+Ojpfc29sdmUgKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiAmYiwgTWF0cml4QmFzZTxEZXN0PiAmeCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiVGhlIG1hdHJpeCBzaG91bGQgYmUgZmFjdG9yaXplZCBmaXJzdCIpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChEZXN0OjpGbGFncyZSb3dNYWpvckJpdCk9PTAsCisgICAgICAgICAgICAgICAgICAgICBUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9DT0xVTU5fTUFKT1JfTUFUUklDRVMpOworICBpbnQgcmhzID0gMTsKKyAgCisgIHggPSBiOyAvKiBvbiByZXR1cm4sIHggaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbXB1dGVkIHNvbHV0aW9uICovCisgIAorICBmb3IgKGludCBpID0gMDsgaSA8IGIuY29scygpOyBpKyspeworICAgIG1faXBhcm1bSVBBUk1fU1RBUlRfVEFTS10gICAgICAgICAgPSBBUElfVEFTS19TT0xWRTsKKyAgICBtX2lwYXJtW0lQQVJNX0VORF9UQVNLXSAgICAgICAgICAgID0gQVBJX1RBU0tfUkVGSU5FOworICAKKyAgICBpbnRlcm5hbDo6ZWlnZW5fcGFzdGl4KCZtX3Bhc3RpeGRhdGEsIE1QSV9DT01NX1dPUkxELCB4LnJvd3MoKSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGVybS5kYXRhKCksIG1faW52cC5kYXRhKCksICZ4KDAsIGkpLCByaHMsIG1faXBhcm0uZGF0YSgpLCBtX2RwYXJtLmRhdGEoKSk7CisgIH0KKyAgCisgIC8vIENoZWNrIHRoZSByZXR1cm5lZCBlcnJvcgorICBtX2luZm8gPSBtX2lwYXJtKElQQVJNX0VSUk9SX05VTUJFUik9PTAgPyBTdWNjZXNzIDogTnVtZXJpY2FsSXNzdWU7CisgIAorICByZXR1cm4gbV9pcGFybShJUEFSTV9FUlJPUl9OVU1CRVIpPT0wOworfQorCisvKiogXGluZ3JvdXAgUGFTdGlYU3VwcG9ydF9Nb2R1bGUKKyAgKiBcY2xhc3MgUGFzdGl4TFUKKyAgKiBcYnJpZWYgU3BhcnNlIGRpcmVjdCBMVSBzb2x2ZXIgYmFzZWQgb24gUGFTdGlYIGxpYnJhcnkKKyAgKiAKKyAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc29sdmUgdGhlIGxpbmVhciBzeXN0ZW1zIEEuWCA9IEIgd2l0aCBhIHN1cGVybm9kYWwgTFUgCisgICogZmFjdG9yaXphdGlvbiBpbiB0aGUgUGFTdGlYIGxpYnJhcnkuIFRoZSBtYXRyaXggQSBzaG91bGQgYmUgc3F1YXJlZCBhbmQgbm9uc2luZ3VsYXIKKyAgKiBQYVN0aVggcmVxdWlyZXMgdGhhdCB0aGUgbWF0cml4IEEgaGFzIGEgc3ltbWV0cmljIHN0cnVjdHVyYWwgcGF0dGVybi4gCisgICogVGhpcyBpbnRlcmZhY2UgY2FuIHN5bW1ldHJpemUgdGhlIGlucHV0IG1hdHJpeCBvdGhlcndpc2UuIAorICAqIFRoZSB2ZWN0b3JzIG9yIG1hdHJpY2VzIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICogCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKiBcdHBhcmFtIElzU3RyU3ltIEluZGljYXRlcyBpZiB0aGUgaW5wdXQgbWF0cml4IGhhcyBhIHN5bW1ldHJpYyBwYXR0ZXJuLCBkZWZhdWx0IGlzIGZhbHNlCisgICogTk9URSA6IE5vdGUgdGhhdCBpZiB0aGUgYW5hbHlzaXMgYW5kIGZhY3Rvcml6YXRpb24gcGhhc2UgYXJlIGNhbGxlZCBzZXBhcmF0ZWx5LCAKKyAgKiB0aGUgaW5wdXQgbWF0cml4IHdpbGwgYmUgc3ltbWV0cml6ZWQgYXQgZWFjaCBjYWxsLCBoZW5jZSBpdCBpcyBhZHZpc2VkIHRvIAorICAqIHN5bW1ldHJpemUgdGhlIG1hdHJpeCBpbiBhIGVuZC11c2VyIHByb2dyYW0gYW5kIHNldCBccCBJc1N0clN5bSB0byB0cnVlCisgICogCisgICogXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VEaXJlY3RTb2x2ZXJzCisgICogCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgYm9vbCBJc1N0clN5bT4KK2NsYXNzIFBhc3RpeExVIDogcHVibGljIFBhc3RpeEJhc2U8IFBhc3RpeExVPF9NYXRyaXhUeXBlPiA+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBQYXN0aXhCYXNlPFBhc3RpeExVPE1hdHJpeFR5cGU+ID4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvbFNwTWF0cml4IENvbFNwTWF0cml4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgCisgIHB1YmxpYzoKKyAgICBQYXN0aXhMVSgpIDogQmFzZSgpCisgICAgeworICAgICAgaW5pdCgpOworICAgIH0KKyAgICAKKyAgICBQYXN0aXhMVShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpOkJhc2UoKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisgICAgLyoqIENvbXB1dGUgdGhlIExVIHN1cGVybm9kYWwgZmFjdG9yaXphdGlvbiBvZiBccCBtYXRyaXguIAorICAgICAgKiBpcGFybSBhbmQgZHBhcm0gY2FuIGJlIHVzZWQgdG8gdHVuZSB0aGUgUGFTdGlYIHBhcmFtZXRlcnMuIAorICAgICAgKiBzZWUgdGhlIFBhU3RpWCB1c2VyJ3MgbWFudWFsCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgY29tcHV0ZSAoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIG1fc3RydWN0dXJlSXNVcHRvZGF0ZSA9IGZhbHNlOworICAgICAgQ29sU3BNYXRyaXggdGVtcDsKKyAgICAgIGdyYWJNYXRyaXgobWF0cml4LCB0ZW1wKTsKKyAgICAgIEJhc2U6OmNvbXB1dGUodGVtcCk7CisgICAgfQorICAgIC8qKiBDb21wdXRlIHRoZSBMVSBzeW1ib2xpYyBmYWN0b3JpemF0aW9uIG9mIFxwIG1hdHJpeCB1c2luZyBpdHMgc3BhcnNpdHkgcGF0dGVybi4gCisgICAgICAqIFNldmVyYWwgb3JkZXJpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCBhdCB0aGlzIHN0ZXAuIFNlZSB0aGUgUGFTdGlYIHVzZXIncyBtYW51YWwuIAorICAgICAgKiBUaGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHdpdGggc3VjY2Vzc2l2ZSBtYXRyaWNlcyBoYXZpbmcgdGhlIHNhbWUgcGF0dGVybiBhcyBccCBtYXRyaXgKKyAgICAgICogXHNhIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIG1fc3RydWN0dXJlSXNVcHRvZGF0ZSA9IGZhbHNlOworICAgICAgQ29sU3BNYXRyaXggdGVtcDsKKyAgICAgIGdyYWJNYXRyaXgobWF0cml4LCB0ZW1wKTsKKyAgICAgIEJhc2U6OmFuYWx5emVQYXR0ZXJuKHRlbXApOworICAgIH0KKworICAgIC8qKiBDb21wdXRlIHRoZSBMVSBzdXBlcm5vZGFsIGZhY3Rvcml6YXRpb24gb2YgXHAgbWF0cml4CisgICAgICAqIFdBUk5JTkcgVGhlIG1hdHJpeCBccCBtYXRyaXggc2hvdWxkIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJhbCBwYXR0ZXJuIAorICAgICAgKiBhcyB0aGUgc2FtZSB1c2VkIGluIHRoZSBhbmFseXNpcyBwaGFzZS4KKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkKKyAgICAgICovIAorICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBDb2xTcE1hdHJpeCB0ZW1wOworICAgICAgZ3JhYk1hdHJpeChtYXRyaXgsIHRlbXApOworICAgICAgQmFzZTo6ZmFjdG9yaXplKHRlbXApOworICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIAorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9zdHJ1Y3R1cmVJc1VwdG9kYXRlID0gZmFsc2U7CisgICAgICBtX2lwYXJtKElQQVJNX1NZTSkgPSBBUElfU1lNX05POworICAgICAgbV9pcGFybShJUEFSTV9GQUNUT1JJWkFUSU9OKSA9IEFQSV9GQUNUX0xVOworICAgIH0KKyAgICAKKyAgICB2b2lkIGdyYWJNYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBDb2xTcE1hdHJpeCYgb3V0KQorICAgIHsKKyAgICAgIGlmKElzU3RyU3ltKQorICAgICAgICBvdXQgPSBtYXRyaXg7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKCFtX3N0cnVjdHVyZUlzVXB0b2RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAvLyB1cGRhdGUgdGhlIHRyYW5zcG9zZWQgc3RydWN0dXJlCisgICAgICAgICAgbV90cmFuc3Bvc2VkU3RydWN0dXJlID0gbWF0cml4LnRyYW5zcG9zZSgpOworICAgICAgICAgIAorICAgICAgICAgIC8vIFNldCB0aGUgZWxlbWVudHMgb2YgdGhlIG1hdHJpeCB0byB6ZXJvIAorICAgICAgICAgIGZvciAoSW5kZXggaj0wOyBqPG1fdHJhbnNwb3NlZFN0cnVjdHVyZS5vdXRlclNpemUoKTsgKytqKSAKKyAgICAgICAgICAgIGZvcih0eXBlbmFtZSBDb2xTcE1hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChtX3RyYW5zcG9zZWRTdHJ1Y3R1cmUsIGopOyBpdDsgKytpdCkKKyAgICAgICAgICAgICAgaXQudmFsdWVSZWYoKSA9IDAuMDsKKworICAgICAgICAgIG1fc3RydWN0dXJlSXNVcHRvZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG91dCA9IG1fdHJhbnNwb3NlZFN0cnVjdHVyZSArIG1hdHJpeDsKKyAgICAgIH0KKyAgICAgIGludGVybmFsOjpjX3RvX2ZvcnRyYW5fbnVtYmVyaW5nKG91dCk7CisgICAgfQorICAgIAorICAgIHVzaW5nIEJhc2U6Om1faXBhcm07CisgICAgdXNpbmcgQmFzZTo6bV9kcGFybTsKKyAgICAKKyAgICBDb2xTcE1hdHJpeCBtX3RyYW5zcG9zZWRTdHJ1Y3R1cmU7CisgICAgYm9vbCBtX3N0cnVjdHVyZUlzVXB0b2RhdGU7Cit9OworCisvKiogXGluZ3JvdXAgUGFTdGlYU3VwcG9ydF9Nb2R1bGUKKyAgKiBcY2xhc3MgUGFzdGl4TExUCisgICogXGJyaWVmIEEgc3BhcnNlIGRpcmVjdCBzdXBlcm5vZGFsIENob2xlc2t5IChMTFQpIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlciBiYXNlZCBvbiB0aGUgUGFTdGlYIGxpYnJhcnkKKyAgKiAKKyAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc29sdmUgdGhlIGxpbmVhciBzeXN0ZW1zIEEuWCA9IEIgdmlhIGEgTExeVCBzdXBlcm5vZGFsIENob2xlc2t5IGZhY3Rvcml6YXRpb24KKyAgKiBhdmFpbGFibGUgaW4gdGhlIFBhU3RpWCBsaWJyYXJ5LiBUaGUgbWF0cml4IEEgc2hvdWxkIGJlIHN5bW1ldHJpYyBhbmQgcG9zaXRpdmUgZGVmaW5pdGUKKyAgKiBXQVJOSU5HIFNlbGZhZGpvaW50IGNvbXBsZXggbWF0cmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBQYVN0aVgKKyAgKiBUaGUgdmVjdG9ycyBvciBtYXRyaWNlcyBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlCisgICogCisgICogXHRwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIGl0IG11c3QgYmUgYSBTcGFyc2VNYXRyaXg8PgorICAqIFx0cGFyYW0gVXBMbyBUaGUgcGFydCBvZiB0aGUgbWF0cml4IHRvIHVzZSA6IExvd2VyIG9yIFVwcGVyLiBUaGUgZGVmYXVsdCBpcyBMb3dlciBhcyByZXF1aXJlZCBieSBQYVN0aVgKKyAgKiAKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZURpcmVjdFNvbHZlcnMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8+CitjbGFzcyBQYXN0aXhMTFQgOiBwdWJsaWMgUGFzdGl4QmFzZTwgUGFzdGl4TExUPF9NYXRyaXhUeXBlLCBfVXBMbz4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgUGFzdGl4QmFzZTxQYXN0aXhMTFQ8TWF0cml4VHlwZSwgX1VwTG8+ID4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkNvbFNwTWF0cml4IENvbFNwTWF0cml4OworICAgIAorICBwdWJsaWM6CisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIFBhc3RpeExMVCgpIDogQmFzZSgpCisgICAgeworICAgICAgaW5pdCgpOworICAgIH0KKyAgICAKKyAgICBQYXN0aXhMTFQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTpCYXNlKCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorCisgICAgLyoqIENvbXB1dGUgdGhlIEwgZmFjdG9yIG9mIHRoZSBMTF5UIHN1cGVybm9kYWwgZmFjdG9yaXphdGlvbiBvZiBccCBtYXRyaXggCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgY29tcHV0ZSAoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIENvbFNwTWF0cml4IHRlbXA7CisgICAgICBncmFiTWF0cml4KG1hdHJpeCwgdGVtcCk7CisgICAgICBCYXNlOjpjb21wdXRlKHRlbXApOworICAgIH0KKworICAgICAvKiogQ29tcHV0ZSB0aGUgTExeVCBzeW1ib2xpYyBmYWN0b3JpemF0aW9uIG9mIFxwIG1hdHJpeCB1c2luZyBpdHMgc3BhcnNpdHkgcGF0dGVybgorICAgICAgKiBUaGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHdpdGggc3VjY2Vzc2l2ZSBtYXRyaWNlcyBoYXZpbmcgdGhlIHNhbWUgcGF0dGVybiBhcyBccCBtYXRyaXgKKyAgICAgICogXHNhIGZhY3Rvcml6ZSgpCisgICAgICAqLworICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIENvbFNwTWF0cml4IHRlbXA7CisgICAgICBncmFiTWF0cml4KG1hdHJpeCwgdGVtcCk7CisgICAgICBCYXNlOjphbmFseXplUGF0dGVybih0ZW1wKTsKKyAgICB9CisgICAgICAvKiogQ29tcHV0ZSB0aGUgTExeVCBzdXBlcm5vZGFsIG51bWVyaWNhbCBmYWN0b3JpemF0aW9uIG9mIFxwIG1hdHJpeCAKKyAgICAgICAgKiBcc2EgYW5hbHl6ZVBhdHRlcm4oKQorICAgICAgICAqLworICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBDb2xTcE1hdHJpeCB0ZW1wOworICAgICAgZ3JhYk1hdHJpeChtYXRyaXgsIHRlbXApOworICAgICAgQmFzZTo6ZmFjdG9yaXplKHRlbXApOworICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIHVzaW5nIEJhc2U6Om1faXBhcm07CisgICAgCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBtX2lwYXJtKElQQVJNX1NZTSkgPSBBUElfU1lNX1lFUzsKKyAgICAgIG1faXBhcm0oSVBBUk1fRkFDVE9SSVpBVElPTikgPSBBUElfRkFDVF9MTFQ7CisgICAgfQorICAgIAorICAgIHZvaWQgZ3JhYk1hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIENvbFNwTWF0cml4JiBvdXQpCisgICAgeworICAgICAgLy8gUGFzdGl4IHN1cHBvcnRzIG9ubHkgbG93ZXIsIGNvbHVtbi1tYWpvciBtYXRyaWNlcyAKKyAgICAgIG91dC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgPSBtYXRyaXgudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCk7CisgICAgICBpbnRlcm5hbDo6Y190b19mb3J0cmFuX251bWJlcmluZyhvdXQpOworICAgIH0KK307CisKKy8qKiBcaW5ncm91cCBQYVN0aVhTdXBwb3J0X01vZHVsZQorICAqIFxjbGFzcyBQYXN0aXhMRExUCisgICogXGJyaWVmIEEgc3BhcnNlIGRpcmVjdCBzdXBlcm5vZGFsIENob2xlc2t5IChMTFQpIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlciBiYXNlZCBvbiB0aGUgUGFTdGlYIGxpYnJhcnkKKyAgKiAKKyAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc29sdmUgdGhlIGxpbmVhciBzeXN0ZW1zIEEuWCA9IEIgdmlhIGEgTERMXlQgc3VwZXJub2RhbCBDaG9sZXNreSBmYWN0b3JpemF0aW9uCisgICogYXZhaWxhYmxlIGluIHRoZSBQYVN0aVggbGlicmFyeS4gVGhlIG1hdHJpeCBBIHNob3VsZCBiZSBzeW1tZXRyaWMgYW5kIHBvc2l0aXZlIGRlZmluaXRlCisgICogV0FSTklORyBTZWxmYWRqb2ludCBjb21wbGV4IG1hdHJpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUGFTdGlYCisgICogVGhlIHZlY3RvcnMgb3IgbWF0cmljZXMgWCBhbmQgQiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZQorICAqIAorICAqIFx0cGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKiBcdHBhcmFtIFVwTG8gVGhlIHBhcnQgb2YgdGhlIG1hdHJpeCB0byB1c2UgOiBMb3dlciBvciBVcHBlci4gVGhlIGRlZmF1bHQgaXMgTG93ZXIgYXMgcmVxdWlyZWQgYnkgUGFTdGlYCisgICogCisgICogXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VEaXJlY3RTb2x2ZXJzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvPgorY2xhc3MgUGFzdGl4TERMVCA6IHB1YmxpYyBQYXN0aXhCYXNlPCBQYXN0aXhMRExUPF9NYXRyaXhUeXBlLCBfVXBMbz4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgUGFzdGl4QmFzZTxQYXN0aXhMRExUPE1hdHJpeFR5cGUsIF9VcExvPiA+IEJhc2U7IAorICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q29sU3BNYXRyaXggQ29sU3BNYXRyaXg7CisgICAgCisgIHB1YmxpYzoKKyAgICBlbnVtIHsgVXBMbyA9IF9VcExvIH07CisgICAgUGFzdGl4TERMVCgpOkJhc2UoKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICB9CisgICAgCisgICAgUGFzdGl4TERMVChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpOkJhc2UoKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogQ29tcHV0ZSB0aGUgTCBhbmQgRCBmYWN0b3JzIG9mIHRoZSBMRExeVCBmYWN0b3JpemF0aW9uIG9mIFxwIG1hdHJpeCAKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBjb21wdXRlIChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgQ29sU3BNYXRyaXggdGVtcDsKKyAgICAgIGdyYWJNYXRyaXgobWF0cml4LCB0ZW1wKTsKKyAgICAgIEJhc2U6OmNvbXB1dGUodGVtcCk7CisgICAgfQorCisgICAgLyoqIENvbXB1dGUgdGhlIExETF5UIHN5bWJvbGljIGZhY3Rvcml6YXRpb24gb2YgXHAgbWF0cml4IHVzaW5nIGl0cyBzcGFyc2l0eSBwYXR0ZXJuCisgICAgICAqIFRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgd2l0aCBzdWNjZXNzaXZlIG1hdHJpY2VzIGhhdmluZyB0aGUgc2FtZSBwYXR0ZXJuIGFzIFxwIG1hdHJpeAorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeyAKKyAgICAgIENvbFNwTWF0cml4IHRlbXA7CisgICAgICBncmFiTWF0cml4KG1hdHJpeCwgdGVtcCk7CisgICAgICBCYXNlOjphbmFseXplUGF0dGVybih0ZW1wKTsKKyAgICB9CisgICAgLyoqIENvbXB1dGUgdGhlIExETF5UIHN1cGVybm9kYWwgbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24gb2YgXHAgbWF0cml4IAorICAgICAgKiAKKyAgICAgICovCisgICAgdm9pZCBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIENvbFNwTWF0cml4IHRlbXA7CisgICAgICBncmFiTWF0cml4KG1hdHJpeCwgdGVtcCk7CisgICAgICBCYXNlOjpmYWN0b3JpemUodGVtcCk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB1c2luZyBCYXNlOjptX2lwYXJtOworICAgIAorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9pcGFybShJUEFSTV9TWU0pID0gQVBJX1NZTV9ZRVM7CisgICAgICBtX2lwYXJtKElQQVJNX0ZBQ1RPUklaQVRJT04pID0gQVBJX0ZBQ1RfTERMVDsKKyAgICB9CisgICAgCisgICAgdm9pZCBncmFiTWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgQ29sU3BNYXRyaXgmIG91dCkKKyAgICB7CisgICAgICAvLyBQYXN0aXggc3VwcG9ydHMgb25seSBsb3dlciwgY29sdW1uLW1ham9yIG1hdHJpY2VzIAorICAgICAgb3V0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSA9IG1hdHJpeC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBMbz4oKTsKKyAgICAgIGludGVybmFsOjpjX3RvX2ZvcnRyYW5fbnVtYmVyaW5nKG91dCk7CisgICAgfQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBzb2x2ZV9yZXR2YWw8UGFzdGl4QmFzZTxfTWF0cml4VHlwZT4sIFJocz4KKyAgOiBzb2x2ZV9yZXR2YWxfYmFzZTxQYXN0aXhCYXNlPF9NYXRyaXhUeXBlPiwgUmhzPgoreworICB0eXBlZGVmIFBhc3RpeEJhc2U8X01hdHJpeFR5cGU+IERlYzsKKyAgRUlHRU5fTUFLRV9TT0xWRV9IRUxQRVJTKERlYyxSaHMpCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgZGVjKCkuX3NvbHZlKHJocygpLGRzdCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3JldHZhbDxQYXN0aXhCYXNlPF9NYXRyaXhUeXBlPiwgUmhzPgorICA6IHNwYXJzZV9zb2x2ZV9yZXR2YWxfYmFzZTxQYXN0aXhCYXNlPF9NYXRyaXhUeXBlPiwgUmhzPgoreworICB0eXBlZGVmIFBhc3RpeEJhc2U8X01hdHJpeFR5cGU+IERlYzsKKyAgRUlHRU5fTUFLRV9TUEFSU0VfU09MVkVfSEVMUEVSUyhEZWMsUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGRlYygpLl9zb2x2ZV9zcGFyc2UocmhzKCksZHN0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9QYXJkaXNvU3VwcG9ydC9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9QYXJkaXNvU3VwcG9ydC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDk3YWI0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1BhcmRpc29TdXBwb3J0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX1BhcmRpc29TdXBwb3J0X1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMgCisgICR7RWlnZW5fUGFyZGlzb1N1cHBvcnRfU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS9FaWdlbi9zcmMvUGFyZGlzb1N1cHBvcnQgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9QYXJkaXNvU3VwcG9ydC9QYXJkaXNvU3VwcG9ydC5oIGIvRWlnZW4vc3JjL1BhcmRpc29TdXBwb3J0L1BhcmRpc29TdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkZWZjOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9QYXJkaXNvU3VwcG9ydC9QYXJkaXNvU3VwcG9ydC5oCkBAIC0wLDAgKzEsNjE0IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gSW50ZWwoUikgTUtMIFBBUkRJU08KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBFSUdFTl9QQVJESVNPU1VQUE9SVF9ICisjZGVmaW5lIEVJR0VOX1BBUkRJU09TVVBQT1JUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBQYXJkaXNvTFU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IE9wdGlvbnM9VXBwZXI+IGNsYXNzIFBhcmRpc29MTFQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IE9wdGlvbnM9VXBwZXI+IGNsYXNzIFBhcmRpc29MRExUOworCituYW1lc3BhY2UgaW50ZXJuYWwKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXg+CisgIHN0cnVjdCBwYXJkaXNvX3J1bl9zZWxlY3RvcgorICB7CisgICAgc3RhdGljIEluZGV4IHJ1biggX01LTF9EU1NfSEFORExFX3QgcHQsIEluZGV4IG1heGZjdCwgSW5kZXggbW51bSwgSW5kZXggdHlwZSwgSW5kZXggcGhhc2UsIEluZGV4IG4sIHZvaWQgKmEsCisgICAgICAgICAgICAgICAgICAgICAgSW5kZXggKmlhLCBJbmRleCAqamEsIEluZGV4ICpwZXJtLCBJbmRleCBucmhzLCBJbmRleCAqaXBhcm0sIEluZGV4IG1zZ2x2bCwgdm9pZCAqYiwgdm9pZCAqeCkKKyAgICB7CisgICAgICBJbmRleCBlcnJvciA9IDA7CisgICAgICA6OnBhcmRpc28ocHQsICZtYXhmY3QsICZtbnVtLCAmdHlwZSwgJnBoYXNlLCAmbiwgYSwgaWEsIGphLCBwZXJtLCAmbnJocywgaXBhcm0sICZtc2dsdmwsIGIsIHgsICZlcnJvcik7CisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorICB9OworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBwYXJkaXNvX3J1bl9zZWxlY3Rvcjxsb25nIGxvbmcgaW50PgorICB7CisgICAgdHlwZWRlZiBsb25nIGxvbmcgaW50IEluZGV4OworICAgIHN0YXRpYyBJbmRleCBydW4oIF9NS0xfRFNTX0hBTkRMRV90IHB0LCBJbmRleCBtYXhmY3QsIEluZGV4IG1udW0sIEluZGV4IHR5cGUsIEluZGV4IHBoYXNlLCBJbmRleCBuLCB2b2lkICphLAorICAgICAgICAgICAgICAgICAgICAgIEluZGV4ICppYSwgSW5kZXggKmphLCBJbmRleCAqcGVybSwgSW5kZXggbnJocywgSW5kZXggKmlwYXJtLCBJbmRleCBtc2dsdmwsIHZvaWQgKmIsIHZvaWQgKngpCisgICAgeworICAgICAgSW5kZXggZXJyb3IgPSAwOworICAgICAgOjpwYXJkaXNvXzY0KHB0LCAmbWF4ZmN0LCAmbW51bSwgJnR5cGUsICZwaGFzZSwgJm4sIGEsIGlhLCBqYSwgcGVybSwgJm5yaHMsIGlwYXJtLCAmbXNnbHZsLCBiLCB4LCAmZXJyb3IpOworICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBQYXJkaXNvPiBzdHJ1Y3QgcGFyZGlzb190cmFpdHM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CisgIHN0cnVjdCBwYXJkaXNvX3RyYWl0czwgUGFyZGlzb0xVPF9NYXRyaXhUeXBlPiA+CisgIHsKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBPcHRpb25zPgorICBzdHJ1Y3QgcGFyZGlzb190cmFpdHM8IFBhcmRpc29MTFQ8X01hdHJpeFR5cGUsIE9wdGlvbnM+ID4KKyAgeworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IE9wdGlvbnM+CisgIHN0cnVjdCBwYXJkaXNvX3RyYWl0czwgUGFyZGlzb0xETFQ8X01hdHJpeFR5cGUsIE9wdGlvbnM+ID4KKyAgeworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX01hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlOjpJbmRleCBJbmRleDsgICAgCisgIH07CisKK30KKwordGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4KK2NsYXNzIFBhcmRpc29JbXBsCit7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6cGFyZGlzb190cmFpdHM8RGVyaXZlZD4gVHJhaXRzOworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsUm93TWFqb3IsSW5kZXg+IFNwYXJzZU1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxJbmRleCwgMSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IEludFJvd1ZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8SW5kZXgsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBJbnRDb2xWZWN0b3JUeXBlOworICAgIGVudW0geworICAgICAgU2NhbGFySXNDb21wbGV4ID0gTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleAorICAgIH07CisKKyAgICBQYXJkaXNvSW1wbCgpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KChzaXplb2YoSW5kZXgpID49IHNpemVvZihfSU5URUdFUl90KSAmJiBzaXplb2YoSW5kZXgpIDw9IDgpICYmICJOb24tc3VwcG9ydGVkIGluZGV4IHR5cGUiKTsKKyAgICAgIG1faXBhcm0uc2V0WmVybygpOworICAgICAgbV9tc2dsdmwgPSAwOyAvLyBObyBvdXRwdXQKKyAgICAgIG1faW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB+UGFyZGlzb0ltcGwoKQorICAgIHsKKyAgICAgIHBhcmRpc29SZWxlYXNlKCk7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorICAKKyAgICAvKiogXGJyaWVmIFJlcG9ydHMgd2hldGhlciBwcmV2aW91cyBjb21wdXRhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgXGMgU3VjY2VzcyBpZiBjb21wdXRhdGlvbiB3YXMgc3VjY2VzZnVsLAorICAgICAgKiAgICAgICAgICBcYyBOdW1lcmljYWxJc3N1ZSBpZiB0aGUgbWF0cml4IGFwcGVhcnMgdG8gYmUgbmVnYXRpdmUuCisgICAgICAqLworICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKworICAgIC8qKiBcd2FybmluZyBmb3IgYWR2YW5jZWQgdXNhZ2Ugb25seS4KKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmFtZXRlciBhcnJheSBjb250cm9sbGluZyBQQVJESVNPLgorICAgICAgKiBTZWUgdGhlIFBBUkRJU08gbWFudWFsIHRvIGtub3cgaG93IHRvIHVzZSBpdC4gKi8KKyAgICBBcnJheTxJbmRleCw2NCwxPiYgcGFyZGlzb1BhcmFtZXRlckFycmF5KCkKKyAgICB7CisgICAgICByZXR1cm4gbV9pcGFybTsKKyAgICB9CisgICAgCisgICAgLyoqIFBlcmZvcm1zIGEgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBvbiB0aGUgc3BhcmNpdHkgb2YgXGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBzb2x2aW5nIGZvciBzZXZlcmFsIHByb2JsZW1zIGhhdmluZyB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisgICAgICAqIAorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgRGVyaXZlZCYgYW5hbHl6ZVBhdHRlcm4oY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTsKKyAgICAKKyAgICAvKiogUGVyZm9ybXMgYSBudW1lcmljIGRlY29tcG9zaXRpb24gb2YgXGEgbWF0cml4CisgICAgICAqCisgICAgICAqIFRoZSBnaXZlbiBtYXRyaXggbXVzdCBoYXMgdGhlIHNhbWUgc3BhcmNpdHkgdGhhbiB0aGUgbWF0cml4IG9uIHdoaWNoIHRoZSBzeW1ib2xpYyBkZWNvbXBvc2l0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4KKyAgICAgICoKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkKKyAgICAgICovCisgICAgRGVyaXZlZCYgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisKKyAgICBEZXJpdmVkJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBzb2x1dGlvbiB4IG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPFBhcmRpc29JbXBsLCBSaHM+CisgICAgc29sdmUoY29uc3QgTWF0cml4QmFzZTxSaHM+JiBiKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2luaXRpYWxpemVkICYmICJQYXJkaXNvIHNvbHZlciBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQocm93cygpPT1iLnJvd3MoKQorICAgICAgICAgICAgICAgICYmICJQYXJkaXNvSW1wbDo6c29sdmUoKTogaW52YWxpZCBudW1iZXIgb2Ygcm93cyBvZiB0aGUgcmlnaHQgaGFuZCBzaWRlIG1hdHJpeCBiIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxQYXJkaXNvSW1wbCwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgc29sdXRpb24geCBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbiBvZiBBLgorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnNwYXJzZV9zb2x2ZV9yZXR2YWw8UGFyZGlzb0ltcGwsIFJocz4KKyAgICBzb2x2ZShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faW5pdGlhbGl6ZWQgJiYgIlBhcmRpc28gc29sdmVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dzKCk9PWIucm93cygpCisgICAgICAgICAgICAgICAgJiYgIlBhcmRpc29JbXBsOjpzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6c3BhcnNlX3NvbHZlX3JldHZhbDxQYXJkaXNvSW1wbCwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKworICAgIERlcml2ZWQmIGRlcml2ZWQoKQorICAgIHsKKyAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOworICAgIH0KKyAgICBjb25zdCBEZXJpdmVkJiBkZXJpdmVkKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWQqPih0aGlzKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCRGVyaXZlZCwgdHlwZW5hbWUgWERlcml2ZWQ+CisgICAgYm9vbCBfc29sdmUoY29uc3QgTWF0cml4QmFzZTxCRGVyaXZlZD4gJmIsIE1hdHJpeEJhc2U8WERlcml2ZWQ+JiB4KSBjb25zdDsKKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3RTY2FsYXIsIGludCBEZXN0T3B0aW9ucywgdHlwZW5hbWUgRGVzdEluZGV4PgorICAgIHZvaWQgX3NvbHZlX3NwYXJzZShjb25zdCBSaHMmIGIsIFNwYXJzZU1hdHJpeDxEZXN0U2NhbGFyLERlc3RPcHRpb25zLERlc3RJbmRleD4gJmRlc3QpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fc2l6ZT09Yi5yb3dzKCkpOworCisgICAgICAvLyB3ZSBwcm9jZXNzIHRoZSBzcGFyc2UgcmhzIHBlciBibG9jayBvZiBOYkNvbHNBdE9uY2UgY29sdW1ucyB0ZW1wb3JhcmlseSBzdG9yZWQgaW50byBhIGRlbnNlIG1hdHJpeC4KKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgTmJDb2xzQXRPbmNlID0gNDsKKyAgICAgIGludCByaHNDb2xzID0gYi5jb2xzKCk7CisgICAgICBpbnQgc2l6ZSA9IGIucm93cygpOworICAgICAgLy8gUGFyZGlzbyBjYW5ub3Qgc29sdmUgaW4tcGxhY2UsCisgICAgICAvLyBzbyB3ZSBuZWVkIHR3byB0ZW1wb3JhcmllcworICAgICAgRWlnZW46Ok1hdHJpeDxEZXN0U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gdG1wX3JocyhzaXplLHJoc0NvbHMpOworICAgICAgRWlnZW46Ok1hdHJpeDxEZXN0U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gdG1wX3JlcyhzaXplLHJoc0NvbHMpOworICAgICAgZm9yKGludCBrPTA7IGs8cmhzQ29sczsgays9TmJDb2xzQXRPbmNlKQorICAgICAgeworICAgICAgICBpbnQgYWN0dWFsQ29scyA9IHN0ZDo6bWluPGludD4ocmhzQ29scy1rLCBOYkNvbHNBdE9uY2UpOworICAgICAgICB0bXBfcmhzLmxlZnRDb2xzKGFjdHVhbENvbHMpID0gYi5taWRkbGVDb2xzKGssYWN0dWFsQ29scyk7CisgICAgICAgIHRtcF9yZXMubGVmdENvbHMoYWN0dWFsQ29scykgPSBkZXJpdmVkKCkuc29sdmUodG1wX3Jocy5sZWZ0Q29scyhhY3R1YWxDb2xzKSk7CisgICAgICAgIGRlc3QubWlkZGxlQ29scyhrLGFjdHVhbENvbHMpID0gdG1wX3Jlcy5sZWZ0Q29scyhhY3R1YWxDb2xzKS5zcGFyc2VWaWV3KCk7CisgICAgICB9CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB2b2lkIHBhcmRpc29SZWxlYXNlKCkKKyAgICB7CisgICAgICBpZihtX2luaXRpYWxpemVkKSAvLyBGYWN0b3JpemF0aW9uIHJhbiBhdCBsZWFzdCBvbmNlCisgICAgICB7CisgICAgICAgIGludGVybmFsOjpwYXJkaXNvX3J1bl9zZWxlY3RvcjxJbmRleD46OnJ1bihtX3B0LCAxLCAxLCBtX3R5cGUsIC0xLCBtX3NpemUsIDAsIDAsIDAsIG1fcGVybS5kYXRhKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lwYXJtLmRhdGEoKSwgbV9tc2dsdmwsIDAsIDApOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGFyZGlzb0luaXQoaW50IHR5cGUpCisgICAgeworICAgICAgbV90eXBlID0gdHlwZTsKKyAgICAgIGJvb2wgc3ltbWV0cmljID0gYWJzKG1fdHlwZSkgPCAxMDsKKyAgICAgIG1faXBhcm1bMF0gPSAxOyAgIC8vIE5vIHNvbHZlciBkZWZhdWx0CisgICAgICBtX2lwYXJtWzFdID0gMzsgICAvLyB1c2UgTWV0aXMgZm9yIHRoZSBvcmRlcmluZworICAgICAgbV9pcGFybVsyXSA9IDE7ICAgLy8gTnVtYmVycyBvZiBwcm9jZXNzb3JzLCB2YWx1ZSBvZiBPTVBfTlVNX1RIUkVBRFMKKyAgICAgIG1faXBhcm1bM10gPSAwOyAgIC8vIE5vIGl0ZXJhdGl2ZS1kaXJlY3QgYWxnb3JpdGhtCisgICAgICBtX2lwYXJtWzRdID0gMDsgICAvLyBObyB1c2VyIGZpbGwtaW4gcmVkdWNpbmcgcGVybXV0YXRpb24KKyAgICAgIG1faXBhcm1bNV0gPSAwOyAgIC8vIFdyaXRlIHNvbHV0aW9uIGludG8geAorICAgICAgbV9pcGFybVs2XSA9IDA7ICAgLy8gTm90IGluIHVzZQorICAgICAgbV9pcGFybVs3XSA9IDI7ICAgLy8gTWF4IG51bWJlcnMgb2YgaXRlcmF0aXZlIHJlZmluZW1lbnQgc3RlcHMKKyAgICAgIG1faXBhcm1bOF0gPSAwOyAgIC8vIE5vdCBpbiB1c2UKKyAgICAgIG1faXBhcm1bOV0gPSAxMzsgIC8vIFBlcnR1cmIgdGhlIHBpdm90IGVsZW1lbnRzIHdpdGggMUUtMTMKKyAgICAgIG1faXBhcm1bMTBdID0gc3ltbWV0cmljID8gMCA6IDE7IC8vIFVzZSBub25zeW1tZXRyaWMgcGVybXV0YXRpb24gYW5kIHNjYWxpbmcgTVBTCisgICAgICBtX2lwYXJtWzExXSA9IDA7ICAvLyBOb3QgaW4gdXNlCisgICAgICBtX2lwYXJtWzEyXSA9IHN5bW1ldHJpYyA/IDAgOiAxOyAgLy8gTWF4aW11bSB3ZWlnaHRlZCBtYXRjaGluZyBhbGdvcml0aG0gaXMgc3dpdGNoZWQtb2ZmIChkZWZhdWx0IGZvciBzeW1tZXRyaWMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSBtX2lwYXJtWzEyXSA9IDEgaW4gY2FzZSBvZiBpbmFwcHJvcHJpYXRlIGFjY3VyYWN5CisgICAgICBtX2lwYXJtWzEzXSA9IDA7ICAvLyBPdXRwdXQ6IE51bWJlciBvZiBwZXJ0dXJiZWQgcGl2b3RzCisgICAgICBtX2lwYXJtWzE0XSA9IDA7ICAvLyBOb3QgaW4gdXNlCisgICAgICBtX2lwYXJtWzE1XSA9IDA7ICAvLyBOb3QgaW4gdXNlCisgICAgICBtX2lwYXJtWzE2XSA9IDA7ICAvLyBOb3QgaW4gdXNlCisgICAgICBtX2lwYXJtWzE3XSA9IC0xOyAvLyBPdXRwdXQ6IE51bWJlciBvZiBub256ZXJvcyBpbiB0aGUgZmFjdG9yIExVCisgICAgICBtX2lwYXJtWzE4XSA9IC0xOyAvLyBPdXRwdXQ6IE1mbG9wcyBmb3IgTFUgZmFjdG9yaXphdGlvbgorICAgICAgbV9pcGFybVsxOV0gPSAwOyAgLy8gT3V0cHV0OiBOdW1iZXJzIG9mIENHIEl0ZXJhdGlvbnMKKyAgICAgIAorICAgICAgbV9pcGFybVsyMF0gPSAwOyAgLy8gMXgxIHBpdm90aW5nCisgICAgICBtX2lwYXJtWzI2XSA9IDA7ICAvLyBObyBtYXRyaXggY2hlY2tlcgorICAgICAgbV9pcGFybVsyN10gPSAoc2l6ZW9mKFJlYWxTY2FsYXIpID09IDQpID8gMSA6IDA7CisgICAgICBtX2lwYXJtWzM0XSA9IDE7ICAvLyBDIGluZGV4aW5nCisgICAgICBtX2lwYXJtWzU5XSA9IDE7ICAvLyBBdXRvbWF0aWMgc3dpdGNoIGJldHdlZW4gSW4tQ29yZSBhbmQgT3V0LW9mLUNvcmUgbW9kZXMKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIGNhY2hlZCBkYXRhIHRvIHJlZHVjZSByZWFsbG9jYXRpb24sIGV0Yy4KKyAgICAKKyAgICB2b2lkIG1hbmFnZUVycm9yQ29kZShJbmRleCBlcnJvcikKKyAgICB7CisgICAgICBzd2l0Y2goZXJyb3IpCisgICAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBtX2luZm8gPSBTdWNjZXNzOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC00OgorICAgICAgICBjYXNlIC03OgorICAgICAgICAgIG1faW5mbyA9IE51bWVyaWNhbElzc3VlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBtdXRhYmxlIFNwYXJzZU1hdHJpeFR5cGUgbV9tYXRyaXg7CisgICAgQ29tcHV0YXRpb25JbmZvIG1faW5mbzsKKyAgICBib29sIG1faW5pdGlhbGl6ZWQsIG1fYW5hbHlzaXNJc09rLCBtX2ZhY3Rvcml6YXRpb25Jc09rOworICAgIEluZGV4IG1fdHlwZSwgbV9tc2dsdmw7CisgICAgbXV0YWJsZSB2b2lkICptX3B0WzY0XTsKKyAgICBtdXRhYmxlIEFycmF5PEluZGV4LDY0LDE+IG1faXBhcm07CisgICAgbXV0YWJsZSBJbnRDb2xWZWN0b3JUeXBlIG1fcGVybTsKKyAgICBJbmRleCBtX3NpemU7CisgICAgCisgIHByaXZhdGU6CisgICAgUGFyZGlzb0ltcGwoUGFyZGlzb0ltcGwgJikge30KK307CisKK3RlbXBsYXRlPGNsYXNzIERlcml2ZWQ+CitEZXJpdmVkJiBQYXJkaXNvSW1wbDxEZXJpdmVkPjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBhKQoreworICBtX3NpemUgPSBhLnJvd3MoKTsKKyAgZWlnZW5fYXNzZXJ0KGEucm93cygpID09IGEuY29scygpKTsKKworICBwYXJkaXNvUmVsZWFzZSgpOworICBtZW1zZXQobV9wdCwgMCwgc2l6ZW9mKG1fcHQpKTsKKyAgbV9wZXJtLnNldFplcm8obV9zaXplKTsKKyAgZGVyaXZlZCgpLmdldE1hdHJpeChhKTsKKyAgCisgIEluZGV4IGVycm9yOworICBlcnJvciA9IGludGVybmFsOjpwYXJkaXNvX3J1bl9zZWxlY3RvcjxJbmRleD46OnJ1bihtX3B0LCAxLCAxLCBtX3R5cGUsIDEyLCBtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWF0cml4LnZhbHVlUHRyKCksIG1fbWF0cml4Lm91dGVySW5kZXhQdHIoKSwgbV9tYXRyaXguaW5uZXJJbmRleFB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Blcm0uZGF0YSgpLCAwLCBtX2lwYXJtLmRhdGEoKSwgbV9tc2dsdmwsIE5VTEwsIE5VTEwpOworCisgIG1hbmFnZUVycm9yQ29kZShlcnJvcik7CisgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgbV9mYWN0b3JpemF0aW9uSXNPayA9IHRydWU7CisgIG1faW5pdGlhbGl6ZWQgPSB0cnVlOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgorRGVyaXZlZCYgUGFyZGlzb0ltcGw8RGVyaXZlZD46OmFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdHJpeFR5cGUmIGEpCit7CisgIG1fc2l6ZSA9IGEucm93cygpOworICBlaWdlbl9hc3NlcnQobV9zaXplID09IGEuY29scygpKTsKKworICBwYXJkaXNvUmVsZWFzZSgpOworICBtZW1zZXQobV9wdCwgMCwgc2l6ZW9mKG1fcHQpKTsKKyAgbV9wZXJtLnNldFplcm8obV9zaXplKTsKKyAgZGVyaXZlZCgpLmdldE1hdHJpeChhKTsKKyAgCisgIEluZGV4IGVycm9yOworICBlcnJvciA9IGludGVybmFsOjpwYXJkaXNvX3J1bl9zZWxlY3RvcjxJbmRleD46OnJ1bihtX3B0LCAxLCAxLCBtX3R5cGUsIDExLCBtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWF0cml4LnZhbHVlUHRyKCksIG1fbWF0cml4Lm91dGVySW5kZXhQdHIoKSwgbV9tYXRyaXguaW5uZXJJbmRleFB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Blcm0uZGF0YSgpLCAwLCBtX2lwYXJtLmRhdGEoKSwgbV9tc2dsdmwsIE5VTEwsIE5VTEwpOworICAKKyAgbWFuYWdlRXJyb3JDb2RlKGVycm9yKTsKKyAgbV9hbmFseXNpc0lzT2sgPSB0cnVlOworICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gZmFsc2U7CisgIG1faW5pdGlhbGl6ZWQgPSB0cnVlOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBEZXJpdmVkPgorRGVyaXZlZCYgUGFyZGlzb0ltcGw8RGVyaXZlZD46OmZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBhKQoreworICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIllvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOworICBlaWdlbl9hc3NlcnQobV9zaXplID09IGEucm93cygpICYmIG1fc2l6ZSA9PSBhLmNvbHMoKSk7CisgIAorICBkZXJpdmVkKCkuZ2V0TWF0cml4KGEpOworCisgIEluZGV4IGVycm9yOyAgCisgIGVycm9yID0gaW50ZXJuYWw6OnBhcmRpc29fcnVuX3NlbGVjdG9yPEluZGV4Pjo6cnVuKG1fcHQsIDEsIDEsIG1fdHlwZSwgMjIsIG1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9tYXRyaXgudmFsdWVQdHIoKSwgbV9tYXRyaXgub3V0ZXJJbmRleFB0cigpLCBtX21hdHJpeC5pbm5lckluZGV4UHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGVybS5kYXRhKCksIDAsIG1faXBhcm0uZGF0YSgpLCBtX21zZ2x2bCwgTlVMTCwgTlVMTCk7CisgIAorICBtYW5hZ2VFcnJvckNvZGUoZXJyb3IpOworICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gdHJ1ZTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgQmFzZT4KK3RlbXBsYXRlPHR5cGVuYW1lIEJEZXJpdmVkLHR5cGVuYW1lIFhEZXJpdmVkPgorYm9vbCBQYXJkaXNvSW1wbDxCYXNlPjo6X3NvbHZlKGNvbnN0IE1hdHJpeEJhc2U8QkRlcml2ZWQ+ICZiLCBNYXRyaXhCYXNlPFhEZXJpdmVkPiYgeCkgY29uc3QKK3sKKyAgaWYobV9pcGFybVswXSA9PSAwKSAvLyBGYWN0b3JpemF0aW9uIHdhcyBub3QgY29tcHV0ZWQKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy9JbmRleCBuID0gbV9tYXRyaXgucm93cygpOworICBJbmRleCBucmhzID0gSW5kZXgoYi5jb2xzKCkpOworICBlaWdlbl9hc3NlcnQobV9zaXplPT1iLnJvd3MoKSk7CisgIGVpZ2VuX2Fzc2VydCgoKE1hdHJpeEJhc2U8QkRlcml2ZWQ+OjpGbGFncyAmIFJvd01ham9yQml0KSA9PSAwIHx8IG5yaHMgPT0gMSkgJiYgIlJvdy1tYWpvciByaWdodCBoYW5kIHNpZGVzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgIGVpZ2VuX2Fzc2VydCgoKE1hdHJpeEJhc2U8WERlcml2ZWQ+OjpGbGFncyAmIFJvd01ham9yQml0KSA9PSAwIHx8IG5yaHMgPT0gMSkgJiYgIlJvdy1tYWpvciBtYXRyaWNlcyBvZiB1bmtub3ducyBhcmUgbm90IHN1cHBvcnRlZCIpOworICBlaWdlbl9hc3NlcnQoKChucmhzID09IDEpIHx8IGIub3V0ZXJTdHJpZGUoKSA9PSBiLnJvd3MoKSkpOworCisKKy8vICBzd2l0Y2ggKHRyYW5zcG9zZWQpIHsKKy8vICAgIGNhc2UgU3ZOb1RyYW5zICAgIDogbV9pcGFybVsxMV0gPSAwIDsgYnJlYWs7CisvLyAgICBjYXNlIFN2VHJhbnNwb3NlICA6IG1faXBhcm1bMTFdID0gMiA7IGJyZWFrOworLy8gICAgY2FzZSBTdkFkam9pbnQgICAgOiBtX2lwYXJtWzExXSA9IDEgOyBicmVhazsKKy8vICAgIGRlZmF1bHQ6CisvLyAgICAgIC8vc3RkOjpjZXJyIDw8ICJFaWdlbjogdHJhbnNwb3NpdGlvbiAgb3B0aW9uIFwiIiA8PCB0cmFuc3Bvc2VkIDw8ICJcIiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBQQVJESVNPIGJhY2tlbmRcbiI7CisvLyAgICAgIG1faXBhcm1bMTFdID0gMDsKKy8vICB9CisKKyAgU2NhbGFyKiByaHNfcHRyID0gY29uc3RfY2FzdDxTY2FsYXIqPihiLmRlcml2ZWQoKS5kYXRhKCkpOworICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gdG1wOworICAKKyAgLy8gUGFyZGlzbyBjYW5ub3Qgc29sdmUgaW4tcGxhY2UKKyAgaWYocmhzX3B0ciA9PSB4LmRlcml2ZWQoKS5kYXRhKCkpCisgIHsKKyAgICB0bXAgPSBiOworICAgIHJoc19wdHIgPSB0bXAuZGF0YSgpOworICB9CisgIAorICBJbmRleCBlcnJvcjsKKyAgZXJyb3IgPSBpbnRlcm5hbDo6cGFyZGlzb19ydW5fc2VsZWN0b3I8SW5kZXg+OjpydW4obV9wdCwgMSwgMSwgbV90eXBlLCAzMywgbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21hdHJpeC52YWx1ZVB0cigpLCBtX21hdHJpeC5vdXRlckluZGV4UHRyKCksIG1fbWF0cml4LmlubmVySW5kZXhQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wZXJtLmRhdGEoKSwgbnJocywgbV9pcGFybS5kYXRhKCksIG1fbXNnbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfcHRyLCB4LmRlcml2ZWQoKS5kYXRhKCkpOworCisgIHJldHVybiBlcnJvcj09MDsKK30KKworCisvKiogXGluZ3JvdXAgUGFyZGlzb1N1cHBvcnRfTW9kdWxlCisgICogXGNsYXNzIFBhcmRpc29MVQorICAqIFxicmllZiBBIHNwYXJzZSBkaXJlY3QgTFUgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIHRoZSBQQVJESVNPIGxpYnJhcnkKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgZGlyZWN0IExVIGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgSW50ZWwgTUtMIFBBUkRJU08gbGlicmFyeS4gVGhlIHNwYXJzZSBtYXRyaXggQSBtdXN0IGJlIHNxdWFyZWQgYW5kIGludmVydGlibGUuCisgICogVGhlIHZlY3RvcnMgb3IgbWF0cmljZXMgWCBhbmQgQiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKgorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggQSwgaXQgbXVzdCBiZSBhIFNwYXJzZU1hdHJpeDw+CisgICoKKyAgKiBcc2EgXHJlZiBUdXRvcmlhbFNwYXJzZURpcmVjdFNvbHZlcnMKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBQYXJkaXNvTFUgOiBwdWJsaWMgUGFyZGlzb0ltcGw8IFBhcmRpc29MVTxNYXRyaXhUeXBlPiA+Cit7CisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIFBhcmRpc29JbXBsPCBQYXJkaXNvTFU8TWF0cml4VHlwZT4gPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB1c2luZyBCYXNlOjpwYXJkaXNvSW5pdDsKKyAgICB1c2luZyBCYXNlOjptX21hdHJpeDsKKyAgICBmcmllbmQgY2xhc3MgUGFyZGlzb0ltcGw8IFBhcmRpc29MVTxNYXRyaXhUeXBlPiA+OworCisgIHB1YmxpYzoKKworICAgIHVzaW5nIEJhc2U6OmNvbXB1dGU7CisgICAgdXNpbmcgQmFzZTo6c29sdmU7CisKKyAgICBQYXJkaXNvTFUoKQorICAgICAgOiBCYXNlKCkKKyAgICB7CisgICAgICBwYXJkaXNvSW5pdChCYXNlOjpTY2FsYXJJc0NvbXBsZXggPyAxMyA6IDExKTsKKyAgICB9CisKKyAgICBQYXJkaXNvTFUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBCYXNlKCkKKyAgICB7CisgICAgICBwYXJkaXNvSW5pdChCYXNlOjpTY2FsYXJJc0NvbXBsZXggPyAxMyA6IDExKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisgIHByb3RlY3RlZDoKKyAgICB2b2lkIGdldE1hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgbV9tYXRyaXggPSBtYXRyaXg7CisgICAgfQorICAgIAorICBwcml2YXRlOgorICAgIFBhcmRpc29MVShQYXJkaXNvTFUmICkge30KK307CisKKy8qKiBcaW5ncm91cCBQYXJkaXNvU3VwcG9ydF9Nb2R1bGUKKyAgKiBcY2xhc3MgUGFyZGlzb0xMVAorICAqIFxicmllZiBBIHNwYXJzZSBkaXJlY3QgQ2hvbGVza3kgKExMVCkgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIHRoZSBQQVJESVNPIGxpYnJhcnkKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgTExeVCBDaG9sZXNreSBmYWN0b3JpemF0aW9uCisgICogdXNpbmcgdGhlIEludGVsIE1LTCBQQVJESVNPIGxpYnJhcnkuIFRoZSBzcGFyc2UgbWF0cml4IEEgbXVzdCBiZSBzZWxmYWpvaW50IGFuZCBwb3NpdGl2ZSBkZWZpbml0ZS4KKyAgKiBUaGUgdmVjdG9ycyBvciBtYXRyaWNlcyBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqCisgICogXHRwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIGl0IG11c3QgYmUgYSBTcGFyc2VNYXRyaXg8PgorICAqIFx0cGFyYW0gVXBMbyBjYW4gYmUgYW55IGJpdHdpc2UgY29tYmluYXRpb24gb2YgVXBwZXIsIExvd2VyLiBUaGUgZGVmYXVsdCBpcyBVcHBlciwgbWVhbmluZyBvbmx5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgaGFzIHRvIGJlIHVzZWQuCisgICogICAgICAgICBVcHBlcnxMb3dlciBjYW4gYmUgdXNlZCB0byB0ZWxsIGJvdGggdHJpYW5ndWxhciBwYXJ0cyBjYW4gYmUgdXNlZCBhcyBpbnB1dC4KKyAgKgorICAqIFxzYSBccmVmIFR1dG9yaWFsU3BhcnNlRGlyZWN0U29sdmVycworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IF9VcExvPgorY2xhc3MgUGFyZGlzb0xMVCA6IHB1YmxpYyBQYXJkaXNvSW1wbDwgUGFyZGlzb0xMVDxNYXRyaXhUeXBlLF9VcExvPiA+Cit7CisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIFBhcmRpc29JbXBsPCBQYXJkaXNvTExUPE1hdHJpeFR5cGUsX1VwTG8+ID4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB1c2luZyBCYXNlOjpwYXJkaXNvSW5pdDsKKyAgICB1c2luZyBCYXNlOjptX21hdHJpeDsKKyAgICBmcmllbmQgY2xhc3MgUGFyZGlzb0ltcGw8IFBhcmRpc29MTFQ8TWF0cml4VHlwZSxfVXBMbz4gPjsKKworICBwdWJsaWM6CisKKyAgICBlbnVtIHsgVXBMbyA9IF9VcExvIH07CisgICAgdXNpbmcgQmFzZTo6Y29tcHV0ZTsKKyAgICB1c2luZyBCYXNlOjpzb2x2ZTsKKworICAgIFBhcmRpc29MTFQoKQorICAgICAgOiBCYXNlKCkKKyAgICB7CisgICAgICBwYXJkaXNvSW5pdChCYXNlOjpTY2FsYXJJc0NvbXBsZXggPyA0IDogMik7CisgICAgfQorCisgICAgUGFyZGlzb0xMVChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICA6IEJhc2UoKQorICAgIHsKKyAgICAgIHBhcmRpc29Jbml0KEJhc2U6OlNjYWxhcklzQ29tcGxleCA/IDQgOiAyKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICAKKyAgICB2b2lkIGdldE1hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgLy8gUEFSRElTTyBzdXBwb3J0cyBvbmx5IHVwcGVyLCByb3ctbWFqb3IgbWF0cmljZXMKKyAgICAgIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxJbmRleD4gcF9udWxsOworICAgICAgbV9tYXRyaXgucmVzaXplKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpOworICAgICAgbV9tYXRyaXgudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gbWF0cml4LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcExvPigpLnR3aXN0ZWRCeShwX251bGwpOworICAgIH0KKyAgICAKKyAgcHJpdmF0ZToKKyAgICBQYXJkaXNvTExUKFBhcmRpc29MTFQmICkge30KK307CisKKy8qKiBcaW5ncm91cCBQYXJkaXNvU3VwcG9ydF9Nb2R1bGUKKyAgKiBcY2xhc3MgUGFyZGlzb0xETFQKKyAgKiBcYnJpZWYgQSBzcGFyc2UgZGlyZWN0IENob2xlc2t5IChMRExUKSBmYWN0b3JpemF0aW9uIGFuZCBzb2x2ZXIgYmFzZWQgb24gdGhlIFBBUkRJU08gbGlicmFyeQorICAqCisgICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gc29sdmUgZm9yIEEuWCA9IEIgc3BhcnNlIGxpbmVhciBwcm9ibGVtcyB2aWEgYSBMRExeVCBDaG9sZXNreSBmYWN0b3JpemF0aW9uCisgICogdXNpbmcgdGhlIEludGVsIE1LTCBQQVJESVNPIGxpYnJhcnkuIFRoZSBzcGFyc2UgbWF0cml4IEEgaXMgYXNzdW1lZCB0byBiZSBzZWxmYWpvaW50IGFuZCBwb3NpdGl2ZSBkZWZpbml0ZS4KKyAgKiBGb3IgY29tcGxleCBtYXRyaWNlcywgQSBjYW4gYWxzbyBiZSBzeW1tZXRyaWMgb25seSwgc2VlIHRoZSBcYSBPcHRpb25zIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgKiBUaGUgdmVjdG9ycyBvciBtYXRyaWNlcyBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqCisgICogXHRwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIGl0IG11c3QgYmUgYSBTcGFyc2VNYXRyaXg8PgorICAqIFx0cGFyYW0gT3B0aW9ucyBjYW4gYmUgYW55IGJpdHdpc2UgY29tYmluYXRpb24gb2YgVXBwZXIsIExvd2VyLCBhbmQgU3ltbWV0cmljLiBUaGUgZGVmYXVsdCBpcyBVcHBlciwgbWVhbmluZyBvbmx5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgaGFzIHRvIGJlIHVzZWQuCisgICogICAgICAgICBTeW1tZXRyaWMgY2FuIGJlIHVzZWQgZm9yIHN5bW1ldHJpYywgbm9uLXNlbGZhZGpvaW50IGNvbXBsZXggbWF0cmljZXMsIHRoZSBkZWZhdWx0IGJlaW5nIHRvIGFzc3VtZSBhIHNlbGZhZGpvaW50IG1hdHJpeC4KKyAgKiAgICAgICAgIFVwcGVyfExvd2VyIGNhbiBiZSB1c2VkIHRvIHRlbGwgYm90aCB0cmlhbmd1bGFyIHBhcnRzIGNhbiBiZSB1c2VkIGFzIGlucHV0LgorICAqCisgICogXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VEaXJlY3RTb2x2ZXJzCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgT3B0aW9ucz4KK2NsYXNzIFBhcmRpc29MRExUIDogcHVibGljIFBhcmRpc29JbXBsPCBQYXJkaXNvTERMVDxNYXRyaXhUeXBlLE9wdGlvbnM+ID4KK3sKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgUGFyZGlzb0ltcGw8IFBhcmRpc29MRExUPE1hdHJpeFR5cGUsT3B0aW9ucz4gPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHVzaW5nIEJhc2U6OnBhcmRpc29Jbml0OworICAgIHVzaW5nIEJhc2U6Om1fbWF0cml4OworICAgIGZyaWVuZCBjbGFzcyBQYXJkaXNvSW1wbDwgUGFyZGlzb0xETFQ8TWF0cml4VHlwZSxPcHRpb25zPiA+OworCisgIHB1YmxpYzoKKworICAgIHVzaW5nIEJhc2U6OmNvbXB1dGU7CisgICAgdXNpbmcgQmFzZTo6c29sdmU7CisgICAgZW51bSB7IFVwTG8gPSBPcHRpb25zJihVcHBlcnxMb3dlcikgfTsKKworICAgIFBhcmRpc29MRExUKCkKKyAgICAgIDogQmFzZSgpCisgICAgeworICAgICAgcGFyZGlzb0luaXQoQmFzZTo6U2NhbGFySXNDb21wbGV4ID8gKCBib29sKE9wdGlvbnMmU3ltbWV0cmljKSA/IDYgOiAtNCApIDogLTIpOworICAgIH0KKworICAgIFBhcmRpc29MRExUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgIDogQmFzZSgpCisgICAgeworICAgICAgcGFyZGlzb0luaXQoQmFzZTo6U2NhbGFySXNDb21wbGV4ID8gKCBib29sKE9wdGlvbnMmU3ltbWV0cmljKSA/IDYgOiAtNCApIDogLTIpOworICAgICAgY29tcHV0ZShtYXRyaXgpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGdldE1hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgLy8gUEFSRElTTyBzdXBwb3J0cyBvbmx5IHVwcGVyLCByb3ctbWFqb3IgbWF0cmljZXMKKyAgICAgIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxJbmRleD4gcF9udWxsOworICAgICAgbV9tYXRyaXgucmVzaXplKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpOworICAgICAgbV9tYXRyaXgudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gbWF0cml4LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcExvPigpLnR3aXN0ZWRCeShwX251bGwpOworICAgIH0KKyAgICAKKyAgcHJpdmF0ZToKKyAgICBQYXJkaXNvTERMVChQYXJkaXNvTERMVCYgKSB7fQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVyaXZlZCwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNvbHZlX3JldHZhbDxQYXJkaXNvSW1wbDxfRGVyaXZlZD4sIFJocz4KKyAgOiBzb2x2ZV9yZXR2YWxfYmFzZTxQYXJkaXNvSW1wbDxfRGVyaXZlZD4sIFJocz4KK3sKKyAgdHlwZWRlZiBQYXJkaXNvSW1wbDxfRGVyaXZlZD4gRGVjOworICBFSUdFTl9NQUtFX1NPTFZFX0hFTFBFUlMoRGVjLFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBkZWMoKS5fc29sdmUocmhzKCksZHN0KTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNwYXJzZV9zb2x2ZV9yZXR2YWw8UGFyZGlzb0ltcGw8RGVyaXZlZD4sIFJocz4KKyAgOiBzcGFyc2Vfc29sdmVfcmV0dmFsX2Jhc2U8UGFyZGlzb0ltcGw8RGVyaXZlZD4sIFJocz4KK3sKKyAgdHlwZWRlZiBQYXJkaXNvSW1wbDxEZXJpdmVkPiBEZWM7CisgIEVJR0VOX01BS0VfU1BBUlNFX1NPTFZFX0hFTFBFUlMoRGVjLFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBkZWMoKS5kZXJpdmVkKCkuX3NvbHZlX3NwYXJzZShyaHMoKSxkc3QpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QQVJESVNPU1VQUE9SVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvUVIvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvUVIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmNDNkNwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9RUi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9RUl9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fUVJfU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS9FaWdlbi9zcmMvUVIgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9RUi9Db2xQaXZIb3VzZWhvbGRlclFSLmggYi9FaWdlbi9zcmMvUVIvQ29sUGl2SG91c2Vob2xkZXJRUi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWEyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvUVIvQ29sUGl2SG91c2Vob2xkZXJRUi5oCkBAIC0wLDAgKzEsNTIwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT0xQSVZPVElOR0hPVVNFSE9MREVSUVJfSAorI2RlZmluZSBFSUdFTl9DT0xQSVZPVElOR0hPVVNFSE9MREVSUVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIFFSX01vZHVsZQorICAqCisgICogXGNsYXNzIENvbFBpdkhvdXNlaG9sZGVyUVIKKyAgKgorICAqIFxicmllZiBIb3VzZWhvbGRlciByYW5rLXJldmVhbGluZyBRUiBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4IHdpdGggY29sdW1uLXBpdm90aW5nCisgICoKKyAgKiBccGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoIHdlIGFyZSBjb21wdXRpbmcgdGhlIFFSIGRlY29tcG9zaXRpb24KKyAgKgorICAqIFRoaXMgY2xhc3MgcGVyZm9ybXMgYSByYW5rLXJldmVhbGluZyBRUiBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4IFxiIEEgaW50byBtYXRyaWNlcyBcYiBQLCBcYiBRIGFuZCBcYiBSCisgICogc3VjaCB0aGF0IAorICAqIFxmWworICAqICBcbWF0aGJme0F9IFwsIFxtYXRoYmZ7UH0gPSBcbWF0aGJme1F9IFwsIFxtYXRoYmZ7Un0KKyAgKiBcZl0KKyAgKiBieSB1c2luZyBIb3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnMuIEhlcmUsIFxiIFAgaXMgYSBwZXJtdXRhdGlvbiBtYXRyaXgsIFxiIFEgYSB1bml0YXJ5IG1hdHJpeCBhbmQgXGIgUiBhbiAKKyAgKiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeC4KKyAgKgorICAqIFRoaXMgZGVjb21wb3NpdGlvbiBwZXJmb3JtcyBjb2x1bW4gcGl2b3RpbmcgaW4gb3JkZXIgdG8gYmUgcmFuay1yZXZlYWxpbmcgYW5kIGltcHJvdmUKKyAgKiBudW1lcmljYWwgc3RhYmlsaXR5LiBJdCBpcyBzbG93ZXIgdGhhbiBIb3VzZWhvbGRlclFSLCBhbmQgZmFzdGVyIHRoYW4gRnVsbFBpdkhvdXNlaG9sZGVyUVIuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6Y29sUGl2SG91c2Vob2xkZXJRcigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgQ29sUGl2SG91c2Vob2xkZXJRUgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIFJvd3NBdENvbXBpbGVUaW1lLCBPcHRpb25zLCBNYXhSb3dzQXRDb21waWxlVGltZSwgTWF4Um93c0F0Q29tcGlsZVRpbWU+IE1hdHJpeFFUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2RpYWdfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBIQ29lZmZzVHlwZTsKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PENvbHNBdENvbXBpbGVUaW1lLCBNYXhDb2xzQXRDb21waWxlVGltZT4gUGVybXV0YXRpb25UeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX3Jvd190eXBlPE1hdHJpeFR5cGUsIEluZGV4Pjo6dHlwZSBJbnRSb3dWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX3Jvd190eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIFJvd1ZlY3RvclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZSwgUmVhbFNjYWxhcj46OnR5cGUgUmVhbFJvd1ZlY3RvclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBIb3VzZWhvbGRlclNlcXVlbmNlPE1hdHJpeFR5cGUsSENvZWZmc1R5cGU+OjpDb25qdWdhdGVSZXR1cm5UeXBlIEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlOworCisgICAgLyoqCisgICAgKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICAqCisgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgQ29sUGl2SG91c2Vob2xkZXJRUjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikuCisgICAgKi8KKyAgICBDb2xQaXZIb3VzZWhvbGRlclFSKCkKKyAgICAgIDogbV9xcigpLAorICAgICAgICBtX2hDb2VmZnMoKSwKKyAgICAgICAgbV9jb2xzUGVybXV0YXRpb24oKSwKKyAgICAgICAgbV9jb2xzVHJhbnNwb3NpdGlvbnMoKSwKKyAgICAgICAgbV90ZW1wKCksCisgICAgICAgIG1fY29sU3FOb3JtcygpLAorICAgICAgICBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3Igd2l0aCBtZW1vcnkgcHJlYWxsb2NhdGlvbgorICAgICAgKgorICAgICAgKiBMaWtlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGJ1dCB3aXRoIHByZWFsbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGRhdGEKKyAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJvYmxlbSBcYSBzaXplLgorICAgICAgKiBcc2EgQ29sUGl2SG91c2Vob2xkZXJRUigpCisgICAgICAqLworICAgIENvbFBpdkhvdXNlaG9sZGVyUVIoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICAgIDogbV9xcihyb3dzLCBjb2xzKSwKKyAgICAgICAgbV9oQ29lZmZzKChzdGQ6Om1pbikocm93cyxjb2xzKSksCisgICAgICAgIG1fY29sc1Blcm11dGF0aW9uKGNvbHMpLAorICAgICAgICBtX2NvbHNUcmFuc3Bvc2l0aW9ucyhjb2xzKSwKKyAgICAgICAgbV90ZW1wKGNvbHMpLAorICAgICAgICBtX2NvbFNxTm9ybXMoY29scyksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZChmYWxzZSkge30KKworICAgIENvbFBpdkhvdXNlaG9sZGVyUVIoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBtX3FyKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2hDb2VmZnMoKHN0ZDo6bWluKShtYXRyaXgucm93cygpLG1hdHJpeC5jb2xzKCkpKSwKKyAgICAgICAgbV9jb2xzUGVybXV0YXRpb24obWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fY29sc1RyYW5zcG9zaXRpb25zKG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX3RlbXAobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fY29sU3FOb3JtcyhtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKGZhbHNlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogVGhpcyBtZXRob2QgZmluZHMgYSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBBeD1iLCB3aGVyZSBBIGlzIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24sIGlmIGFueSBleGlzdHMuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBiIHRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGVxdWF0aW9uIHRvIHNvbHZlLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBhIHNvbHV0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGUgY2FzZSB3aGVyZSBiIGlzIGEgbWF0cml4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIEFsc28sIHRoaXMKKyAgICAgICogICAgICAgY29kZSBpcyBzcGFjZSBpbmVmZmljaWVudC4KKyAgICAgICoKKyAgICAgICogXG5vdGVfYWJvdXRfY2hlY2tpbmdfc29sdXRpb25zCisgICAgICAqCisgICAgICAqIFxub3RlX2Fib3V0X2FyYml0cmFyeV9jaG9pY2Vfb2Zfc29sdXRpb24KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgQ29sUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKKyAgICAgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ29sUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5vdXQKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPENvbFBpdkhvdXNlaG9sZGVyUVIsIFJocz4KKyAgICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29sUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxDb2xQaXZIb3VzZWhvbGRlclFSLCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUgaG91c2Vob2xkZXJRKHZvaWQpIGNvbnN0OworCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggd2hlcmUgdGhlIEhvdXNlaG9sZGVyIFFSIGRlY29tcG9zaXRpb24gaXMgc3RvcmVkCisgICAgICAqLworICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFFSKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb2xQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX3FyOworICAgIH0KKworICAgIENvbFBpdkhvdXNlaG9sZGVyUVImIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTsKKworICAgIGNvbnN0IFBlcm11dGF0aW9uVHlwZSYgY29sc1Blcm11dGF0aW9uKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb2xQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2NvbHNQZXJtdXRhdGlvbjsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgbWF0cml4IG9mIHdoaWNoCisgICAgICAqICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLiBJdCBoYXMgb25seSBsaW5lYXIgY29tcGxleGl0eQorICAgICAgKiAodGhhdCBpcywgTyhuKSB3aGVyZSBuIGlzIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNxdWFyZSBtYXRyaXgpCisgICAgICAqIGFzIHRoZSBRUiBkZWNvbXBvc2l0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgaXMgb25seSBmb3Igc3F1YXJlIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBcd2FybmluZyBhIGRldGVybWluYW50IGNhbiBiZSB2ZXJ5IGJpZyBvciBzbWFsbCwgc28gZm9yIG1hdHJpY2VzCisgICAgICAqIG9mIGxhcmdlIGVub3VnaCBkaW1lbnNpb24sIHRoZXJlIGlzIGEgcmlzayBvZiBvdmVyZmxvdy91bmRlcmZsb3cuCisgICAgICAqIE9uZSB3YXkgdG8gd29yayBhcm91bmQgdGhhdCBpcyB0byB1c2UgbG9nQWJzRGV0ZXJtaW5hbnQoKSBpbnN0ZWFkLgorICAgICAgKgorICAgICAgKiBcc2EgbG9nQWJzRGV0ZXJtaW5hbnQoKSwgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQoKQorICAgICAgKi8KKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIGFic0RldGVybWluYW50KCkgY29uc3Q7CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5hdHVyYWwgbG9nIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIG1hdHJpeCBvZiB3aGljaAorICAgICAgKiAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbi4gSXQgaGFzIG9ubHkgbGluZWFyIGNvbXBsZXhpdHkKKyAgICAgICogKHRoYXQgaXMsIE8obikgd2hlcmUgbiBpcyB0aGUgZGltZW5zaW9uIG9mIHRoZSBzcXVhcmUgbWF0cml4KQorICAgICAgKiBhcyB0aGUgUVIgZGVjb21wb3NpdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIGlzIG9ubHkgZm9yIHNxdWFyZSBtYXRyaWNlcy4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIHdvcmsgYXJvdW5kIHRoZSByaXNrIG9mIG92ZXJmbG93L3VuZGVyZmxvdyB0aGF0J3MgaW5oZXJlbnQKKyAgICAgICogdG8gZGV0ZXJtaW5hbnQgY29tcHV0YXRpb24uCisgICAgICAqCisgICAgICAqIFxzYSBhYnNEZXRlcm1pbmFudCgpLCBNYXRyaXhCYXNlOjpkZXRlcm1pbmFudCgpCisgICAgICAqLworICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgbG9nQWJzRGV0ZXJtaW5hbnQoKSBjb25zdDsKKworICAgIC8qKiBccmV0dXJucyB0aGUgcmFuayBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIEluZGV4IHJhbmsoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgUmVhbFNjYWxhciBwcmVtdWx0aXBsaWVkX3RocmVzaG9sZCA9IGludGVybmFsOjphYnMobV9tYXhwaXZvdCkgKiB0aHJlc2hvbGQoKTsKKyAgICAgIEluZGV4IHJlc3VsdCA9IDA7CisgICAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBtX25vbnplcm9fcGl2b3RzOyArK2kpCisgICAgICAgIHJlc3VsdCArPSAoaW50ZXJuYWw6OmFicyhtX3FyLmNvZWZmKGksaSkpID4gcHJlbXVsdGlwbGllZF90aHJlc2hvbGQpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGRpbWVuc2lvbiBvZiB0aGUga2VybmVsIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggZGltZW5zaW9uT2ZLZXJuZWwoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIGNvbHMoKSAtIHJhbmsoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uIHJlcHJlc2VudHMgYW4gaW5qZWN0aXZlCisgICAgICAqICAgICAgICAgIGxpbmVhciBtYXAsIGkuZS4gaGFzIHRyaXZpYWwga2VybmVsOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc0luamVjdGl2ZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29sUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gcmFuaygpID09IGNvbHMoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uIHJlcHJlc2VudHMgYSBzdXJqZWN0aXZlCisgICAgICAqICAgICAgICAgIGxpbmVhciBtYXA7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaGFzIHRvIGRldGVybWluZSB3aGljaCBwaXZvdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICAgICogICAgICAgRm9yIHRoYXQsIGl0IHVzZXMgdGhlIHRocmVzaG9sZCB2YWx1ZSB0aGF0IHlvdSBjYW4gY29udHJvbCBieSBjYWxsaW5nCisgICAgICAqICAgICAgIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgICAqLworICAgIGlubGluZSBib29sIGlzU3VyamVjdGl2ZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29sUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gcmFuaygpID09IHJvd3MoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uIGlzIGludmVydGlibGUuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc0ludmVydGlibGUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkNvbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIGlzSW5qZWN0aXZlKCkgJiYgaXNTdXJqZWN0aXZlKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxub3RlIElmIHRoaXMgbWF0cml4IGlzIG5vdCBpbnZlcnRpYmxlLCB0aGUgcmV0dXJuZWQgbWF0cml4IGhhcyB1bmRlZmluZWQgY29lZmZpY2llbnRzLgorICAgICAgKiAgICAgICBVc2UgaXNJbnZlcnRpYmxlKCkgdG8gZmlyc3QgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtYXRyaXggaXMgaW52ZXJ0aWJsZS4KKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0CisgICAgaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxDb2xQaXZIb3VzZWhvbGRlclFSLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJZGVudGl0eVJldHVyblR5cGU+CisgICAgaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29sUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxDb2xQaXZIb3VzZWhvbGRlclFSLHR5cGVuYW1lIE1hdHJpeFR5cGU6OklkZW50aXR5UmV0dXJuVHlwZT4KKyAgICAgICAgICAgICAgICgqdGhpcywgTWF0cml4VHlwZTo6SWRlbnRpdHkobV9xci5yb3dzKCksIG1fcXIuY29scygpKSk7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3FyLnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9xci5jb2xzKCk7IH0KKyAgICBjb25zdCBIQ29lZmZzVHlwZSYgaENvZWZmcygpIGNvbnN0IHsgcmV0dXJuIG1faENvZWZmczsgfQorCisgICAgLyoqIEFsbG93cyB0byBwcmVzY3JpYmUgYSB0aHJlc2hvbGQgdG8gYmUgdXNlZCBieSBjZXJ0YWluIG1ldGhvZHMsIHN1Y2ggYXMgcmFuaygpLAorICAgICAgKiB3aG8gbmVlZCB0byBkZXRlcm1pbmUgd2hlbiBwaXZvdHMgYXJlIHRvIGJlIGNvbnNpZGVyZWQgbm9uemVyby4gVGhpcyBpcyBub3QgdXNlZCBmb3IgdGhlCisgICAgICAqIFFSIGRlY29tcG9zaXRpb24gaXRzZWxmLgorICAgICAgKgorICAgICAgKiBXaGVuIGl0IG5lZWRzIHRvIGdldCB0aGUgdGhyZXNob2xkIHZhbHVlLCBFaWdlbiBjYWxscyB0aHJlc2hvbGQoKS4gQnkgZGVmYXVsdCwgdGhpcworICAgICAgKiB1c2VzIGEgZm9ybXVsYSB0byBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBhIHJlYXNvbmFibGUgdGhyZXNob2xkLgorICAgICAgKiBPbmNlIHlvdSBoYXZlIGNhbGxlZCB0aGUgcHJlc2VudCBtZXRob2Qgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKSwKKyAgICAgICogeW91ciB2YWx1ZSBpcyB1c2VkIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIFxwYXJhbSB0aHJlc2hvbGQgVGhlIG5ldyB2YWx1ZSB0byB1c2UgYXMgdGhlIHRocmVzaG9sZC4KKyAgICAgICoKKyAgICAgICogQSBwaXZvdCB3aWxsIGJlIGNvbnNpZGVyZWQgbm9uemVybyBpZiBpdHMgYWJzb2x1dGUgdmFsdWUgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuCisgICAgICAqICBcZiQgXHZlcnQgcGl2b3QgXHZlcnQgXGxlcXNsYW50IHRocmVzaG9sZCBcdGltZXMgXHZlcnQgbWF4cGl2b3QgXHZlcnQgXGYkCisgICAgICAqIHdoZXJlIG1heHBpdm90IGlzIHRoZSBiaWdnZXN0IHBpdm90LgorICAgICAgKgorICAgICAgKiBJZiB5b3Ugd2FudCB0byBjb21lIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGNhbGwgc2V0VGhyZXNob2xkKERlZmF1bHRfdCkKKyAgICAgICovCisgICAgQ29sUGl2SG91c2Vob2xkZXJRUiYgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImIHRocmVzaG9sZCkKKyAgICB7CisgICAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPSB0cnVlOworICAgICAgbV9wcmVzY3JpYmVkVGhyZXNob2xkID0gdGhyZXNob2xkOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBBbGxvd3MgdG8gY29tZSBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBsZXR0aW5nIEVpZ2VuIHVzZSBpdHMgZGVmYXVsdCBmb3JtdWxhIGZvcgorICAgICAgKiBkZXRlcm1pbmluZyB0aGUgdGhyZXNob2xkLgorICAgICAgKgorICAgICAgKiBZb3Ugc2hvdWxkIHBhc3MgdGhlIHNwZWNpYWwgb2JqZWN0IEVpZ2VuOjpEZWZhdWx0IGFzIHBhcmFtZXRlciBoZXJlLgorICAgICAgKiBcY29kZSBxci5zZXRUaHJlc2hvbGQoRWlnZW46OkRlZmF1bHQpOyBcZW5kY29kZQorICAgICAgKgorICAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2Ygc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgQ29sUGl2SG91c2Vob2xkZXJRUiYgc2V0VGhyZXNob2xkKERlZmF1bHRfdCkKKyAgICB7CisgICAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPSBmYWxzZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdGhyZXNob2xkIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGNlcnRhaW4gbWV0aG9kcyBzdWNoIGFzIHJhbmsoKS4KKyAgICAgICoKKyAgICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHNldFRocmVzaG9sZChjb25zdCBSZWFsU2NhbGFyJikuCisgICAgICAqLworICAgIFJlYWxTY2FsYXIgdGhyZXNob2xkKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkIHx8IG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZCk7CisgICAgICByZXR1cm4gbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkID8gbV9wcmVzY3JpYmVkVGhyZXNob2xkCisgICAgICAvLyB0aGlzIGZvcm11bGEgY29tZXMgZnJvbSBleHBlcmltZW50aW5nIChzZWUgIkxVIHByZWNpc2lvbiB0dW5pbmciIHRocmVhZCBvbiB0aGUgbGlzdCkKKyAgICAgIC8vIGFuZCB0dXJucyBvdXQgdG8gYmUgaWRlbnRpY2FsIHRvIEhpZ2hhbSdzIGZvcm11bGEgdXNlZCBhbHJlYWR5IGluIExETHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAqIG1fcXIuZGlhZ29uYWxTaXplKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uemVybyBwaXZvdHMgaW4gdGhlIFFSIGRlY29tcG9zaXRpb24uCisgICAgICAqIEhlcmUgbm9uemVybyBpcyBtZWFudCBpbiB0aGUgZXhhY3Qgc2Vuc2UsIG5vdCBpbiBhIGZ1enp5IHNlbnNlLgorICAgICAgKiBTbyB0aGF0IG5vdGlvbiBpc24ndCByZWFsbHkgaW50cmluc2ljYWxseSBpbnRlcmVzdGluZywgYnV0IGl0IGlzCisgICAgICAqIHN0aWxsIHVzZWZ1bCB3aGVuIGltcGxlbWVudGluZyBhbGdvcml0aG1zLgorICAgICAgKgorICAgICAgKiBcc2EgcmFuaygpCisgICAgICAqLworICAgIGlubGluZSBJbmRleCBub256ZXJvUGl2b3RzKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb2xQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX25vbnplcm9fcGl2b3RzOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGJpZ2dlc3QgcGl2b3QsIGkuZS4gdGhlIGJpZ2dlc3QKKyAgICAgICogICAgICAgICAgZGlhZ29uYWwgY29lZmZpY2llbnQgb2YgUi4KKyAgICAgICovCisgICAgUmVhbFNjYWxhciBtYXhQaXZvdCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF4cGl2b3Q7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZSBtX3FyOworICAgIEhDb2VmZnNUeXBlIG1faENvZWZmczsKKyAgICBQZXJtdXRhdGlvblR5cGUgbV9jb2xzUGVybXV0YXRpb247CisgICAgSW50Um93VmVjdG9yVHlwZSBtX2NvbHNUcmFuc3Bvc2l0aW9uczsKKyAgICBSb3dWZWN0b3JUeXBlIG1fdGVtcDsKKyAgICBSZWFsUm93VmVjdG9yVHlwZSBtX2NvbFNxTm9ybXM7CisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQsIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZDsKKyAgICBSZWFsU2NhbGFyIG1fcHJlc2NyaWJlZFRocmVzaG9sZCwgbV9tYXhwaXZvdDsKKyAgICBJbmRleCBtX25vbnplcm9fcGl2b3RzOworICAgIEluZGV4IG1fZGV0X3BxOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6YWJzRGV0ZXJtaW5hbnQoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb2xQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgZWlnZW5fYXNzZXJ0KG1fcXIucm93cygpID09IG1fcXIuY29scygpICYmICJZb3UgY2FuJ3QgdGFrZSB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBub24tc3F1YXJlIG1hdHJpeCEiKTsKKyAgcmV0dXJuIGludGVybmFsOjphYnMobV9xci5kaWFnb25hbCgpLnByb2QoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT46OmxvZ0Fic0RldGVybWluYW50KCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiQ29sUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIGVpZ2VuX2Fzc2VydChtX3FyLnJvd3MoKSA9PSBtX3FyLmNvbHMoKSAmJiAiWW91IGNhbid0IHRha2UgdGhlIGRldGVybWluYW50IG9mIGEgbm9uLXNxdWFyZSBtYXRyaXghIik7CisgIHJldHVybiBtX3FyLmRpYWdvbmFsKCkuY3dpc2VBYnMoKS5hcnJheSgpLmxvZygpLnN1bSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiYgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCit7CisgIEluZGV4IHJvd3MgPSBtYXRyaXgucm93cygpOworICBJbmRleCBjb2xzID0gbWF0cml4LmNvbHMoKTsKKyAgSW5kZXggc2l6ZSA9IG1hdHJpeC5kaWFnb25hbFNpemUoKTsKKworICBtX3FyID0gbWF0cml4OworICBtX2hDb2VmZnMucmVzaXplKHNpemUpOworCisgIG1fdGVtcC5yZXNpemUoY29scyk7CisKKyAgbV9jb2xzVHJhbnNwb3NpdGlvbnMucmVzaXplKG1hdHJpeC5jb2xzKCkpOworICBJbmRleCBudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnMgPSAwOworCisgIG1fY29sU3FOb3Jtcy5yZXNpemUoY29scyk7CisgIGZvcihJbmRleCBrID0gMDsgayA8IGNvbHM7ICsraykKKyAgICBtX2NvbFNxTm9ybXMuY29lZmZSZWYoaykgPSBtX3FyLmNvbChrKS5zcXVhcmVkTm9ybSgpOworCisgIFJlYWxTY2FsYXIgdGhyZXNob2xkX2hlbHBlciA9IG1fY29sU3FOb3Jtcy5tYXhDb2VmZigpICogaW50ZXJuYWw6OmFiczIoTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkgLyBSZWFsU2NhbGFyKHJvd3MpOworCisgIG1fbm9uemVyb19waXZvdHMgPSBzaXplOyAvLyB0aGUgZ2VuZXJpYyBjYXNlIGlzIHRoYXQgaW4gd2hpY2ggYWxsIHBpdm90cyBhcmUgbm9uemVybyAoaW52ZXJ0aWJsZSBjYXNlKQorICBtX21heHBpdm90ID0gUmVhbFNjYWxhcigwKTsKKworICBmb3IoSW5kZXggayA9IDA7IGsgPCBzaXplOyArK2spCisgIHsKKyAgICAvLyBmaXJzdCwgd2UgbG9vayB1cCBpbiBvdXIgdGFibGUgbV9jb2xTcU5vcm1zIHdoaWNoIGNvbHVtbiBoYXMgdGhlIGJpZ2dlc3Qgc3F1YXJlZCBub3JtCisgICAgSW5kZXggYmlnZ2VzdF9jb2xfaW5kZXg7CisgICAgUmVhbFNjYWxhciBiaWdnZXN0X2NvbF9zcV9ub3JtID0gbV9jb2xTcU5vcm1zLnRhaWwoY29scy1rKS5tYXhDb2VmZigmYmlnZ2VzdF9jb2xfaW5kZXgpOworICAgIGJpZ2dlc3RfY29sX2luZGV4ICs9IGs7CisKKyAgICAvLyBzaW5jZSBvdXIgdGFibGUgbV9jb2xTcU5vcm1zIGFjY3VtdWxhdGVzIGltcHJlY2lzaW9uIGF0IGV2ZXJ5IHN0ZXAsIHdlIG11c3Qgbm93IHJlY29tcHV0ZQorICAgIC8vIHRoZSBhY3R1YWwgc3F1YXJlZCBub3JtIG9mIHRoZSBzZWxlY3RlZCBjb2x1bW4uCisgICAgLy8gTm90ZSB0aGF0IG5vdCBkb2luZyBzbyBkb2VzIHJlc3VsdCBpbiBzb2x2ZSgpIHNvbWV0aW1lcyByZXR1cm5pbmcgaW5mL25hbiB2YWx1ZXMKKyAgICAvLyB3aGVuIHJ1bm5pbmcgdGhlIHVuaXQgdGVzdCB3aXRoIDEwMDAgcmVwZXRpdGlvbnMuCisgICAgYmlnZ2VzdF9jb2xfc3Ffbm9ybSA9IG1fcXIuY29sKGJpZ2dlc3RfY29sX2luZGV4KS50YWlsKHJvd3Mtaykuc3F1YXJlZE5vcm0oKTsKKworICAgIC8vIHdlIHN0b3JlIHRoYXQgYmFjayBpbnRvIG91ciB0YWJsZTogaXQgY2FuJ3QgaHVydCB0byBjb3JyZWN0IG91ciB0YWJsZS4KKyAgICBtX2NvbFNxTm9ybXMuY29lZmZSZWYoYmlnZ2VzdF9jb2xfaW5kZXgpID0gYmlnZ2VzdF9jb2xfc3Ffbm9ybTsKKworICAgIC8vIGlmIHRoZSBjdXJyZW50IGJpZ2dlc3QgY29sdW1uIGlzIHNtYWxsZXIgdGhhbiBlcHNpbG9uIHRpbWVzIHRoZSBpbml0aWFsIGJpZ2dlc3QgY29sdW1uLAorICAgIC8vIHRlcm1pbmF0ZSB0byBhdm9pZCBnZW5lcmF0aW5nIG5hbi9pbmYgdmFsdWVzLgorICAgIC8vIE5vdGUgdGhhdCBoZXJlLCBpZiB3ZSB0ZXN0IGluc3RlYWQgZm9yICJiaWdnZXN0ID09IDAiLCB3ZSBnZXQgYSBmYWlsdXJlIGV2ZXJ5IDEwMDAgKG9yIHNvKQorICAgIC8vIHJlcGV0aXRpb25zIG9mIHRoZSB1bml0IHRlc3QsIHdpdGggdGhlIHJlc3VsdCBvZiBzb2x2ZSgpIGZpbGxlZCB3aXRoIGxhcmdlIHZhbHVlcyBvZiB0aGUgb3JkZXIKKyAgICAvLyBvZiAxLyhzaXplKmVwc2lsb24pLgorICAgIGlmKGJpZ2dlc3RfY29sX3NxX25vcm0gPCB0aHJlc2hvbGRfaGVscGVyICogUmVhbFNjYWxhcihyb3dzLWspKQorICAgIHsKKyAgICAgIG1fbm9uemVyb19waXZvdHMgPSBrOworICAgICAgbV9oQ29lZmZzLnRhaWwoc2l6ZS1rKS5zZXRaZXJvKCk7CisgICAgICBtX3FyLmJvdHRvbVJpZ2h0Q29ybmVyKHJvd3Mtayxjb2xzLWspCisgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkKKyAgICAgICAgICAuc2V0WmVybygpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gYXBwbHkgdGhlIHRyYW5zcG9zaXRpb24gdG8gdGhlIGNvbHVtbnMKKyAgICBtX2NvbHNUcmFuc3Bvc2l0aW9ucy5jb2VmZlJlZihrKSA9IGJpZ2dlc3RfY29sX2luZGV4OworICAgIGlmKGsgIT0gYmlnZ2VzdF9jb2xfaW5kZXgpIHsKKyAgICAgIG1fcXIuY29sKGspLnN3YXAobV9xci5jb2woYmlnZ2VzdF9jb2xfaW5kZXgpKTsKKyAgICAgIHN0ZDo6c3dhcChtX2NvbFNxTm9ybXMuY29lZmZSZWYoayksIG1fY29sU3FOb3Jtcy5jb2VmZlJlZihiaWdnZXN0X2NvbF9pbmRleCkpOworICAgICAgKytudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnM7CisgICAgfQorCisgICAgLy8gZ2VuZXJhdGUgdGhlIGhvdXNlaG9sZGVyIHZlY3Rvciwgc3RvcmUgaXQgYmVsb3cgdGhlIGRpYWdvbmFsCisgICAgUmVhbFNjYWxhciBiZXRhOworICAgIG1fcXIuY29sKGspLnRhaWwocm93cy1rKS5tYWtlSG91c2Vob2xkZXJJblBsYWNlKG1faENvZWZmcy5jb2VmZlJlZihrKSwgYmV0YSk7CisKKyAgICAvLyBhcHBseSB0aGUgaG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb24gdG8gdGhlIGRpYWdvbmFsIGNvZWZmaWNpZW50CisgICAgbV9xci5jb2VmZlJlZihrLGspID0gYmV0YTsKKworICAgIC8vIHJlbWVtYmVyIHRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIGRpYWdvbmFsIGNvZWZmaWNpZW50cworICAgIGlmKGludGVybmFsOjphYnMoYmV0YSkgPiBtX21heHBpdm90KSBtX21heHBpdm90ID0gaW50ZXJuYWw6OmFicyhiZXRhKTsKKworICAgIC8vIGFwcGx5IHRoZSBob3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbgorICAgIG1fcXIuYm90dG9tUmlnaHRDb3JuZXIocm93cy1rLCBjb2xzLWstMSkKKyAgICAgICAgLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQobV9xci5jb2woaykudGFpbChyb3dzLWstMSksIG1faENvZWZmcy5jb2VmZlJlZihrKSwgJm1fdGVtcC5jb2VmZlJlZihrKzEpKTsKKworICAgIC8vIHVwZGF0ZSBvdXIgdGFibGUgb2Ygc3F1YXJlZCBub3JtcyBvZiB0aGUgY29sdW1ucworICAgIG1fY29sU3FOb3Jtcy50YWlsKGNvbHMtay0xKSAtPSBtX3FyLnJvdyhrKS50YWlsKGNvbHMtay0xKS5jd2lzZUFiczIoKTsKKyAgfQorCisgIG1fY29sc1Blcm11dGF0aW9uLnNldElkZW50aXR5KGNvbHMpOworICBmb3IoSW5kZXggayA9IDA7IGsgPCBtX25vbnplcm9fcGl2b3RzOyArK2spCisgICAgbV9jb2xzUGVybXV0YXRpb24uYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVSaWdodChrLCBtX2NvbHNUcmFuc3Bvc2l0aW9ucy5jb2VmZihrKSk7CisKKyAgbV9kZXRfcHEgPSAobnVtYmVyX29mX3RyYW5zcG9zaXRpb25zJTIpID8gLTEgOiAxOworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisgIHJldHVybiAqdGhpczsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBzb2x2ZV9yZXR2YWw8Q29sUGl2SG91c2Vob2xkZXJRUjxfTWF0cml4VHlwZT4sIFJocz4KKyAgOiBzb2x2ZV9yZXR2YWxfYmFzZTxDb2xQaXZIb3VzZWhvbGRlclFSPF9NYXRyaXhUeXBlPiwgUmhzPgoreworICBFSUdFTl9NQUtFX1NPTFZFX0hFTFBFUlMoQ29sUGl2SG91c2Vob2xkZXJRUjxfTWF0cml4VHlwZT4sUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGVpZ2VuX2Fzc2VydChyaHMoKS5yb3dzKCkgPT0gZGVjKCkucm93cygpKTsKKworICAgIGNvbnN0IGludCBjb2xzID0gZGVjKCkuY29scygpLAorICAgIG5vbnplcm9fcGl2b3RzID0gZGVjKCkubm9uemVyb1Bpdm90cygpOworCisgICAgaWYobm9uemVyb19waXZvdHMgPT0gMCkKKyAgICB7CisgICAgICBkc3Quc2V0WmVybygpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVuYW1lIFJoczo6UGxhaW5PYmplY3QgYyhyaHMoKSk7CisKKyAgICAvLyBOb3RlIHRoYXQgdGhlIG1hdHJpeCBRID0gSF8wXiogSF8xXiouLi4gc28gaXRzIGludmVyc2UgaXMgUV4qID0gKEhfMCBIXzEgLi4uKV5UCisgICAgYy5hcHBseU9uVGhlTGVmdChob3VzZWhvbGRlclNlcXVlbmNlKGRlYygpLm1hdHJpeFFSKCksIGRlYygpLmhDb2VmZnMoKSkKKyAgICAgICAgICAgICAgICAgICAgIC5zZXRMZW5ndGgoZGVjKCkubm9uemVyb1Bpdm90cygpKQorCQkgICAgIC50cmFuc3Bvc2UoKQorICAgICAgKTsKKworICAgIGRlYygpLm1hdHJpeFFSKCkKKyAgICAgICAudG9wTGVmdENvcm5lcihub256ZXJvX3Bpdm90cywgbm9uemVyb19waXZvdHMpCisgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgLnNvbHZlSW5QbGFjZShjLnRvcFJvd3Mobm9uemVyb19waXZvdHMpKTsKKworCisgICAgdHlwZW5hbWUgUmhzOjpQbGFpbk9iamVjdCBkKGMpOworICAgIGQudG9wUm93cyhub256ZXJvX3Bpdm90cykKKyAgICAgID0gZGVjKCkubWF0cml4UVIoKQorICAgICAgIC50b3BMZWZ0Q29ybmVyKG5vbnplcm9fcGl2b3RzLCBub256ZXJvX3Bpdm90cykKKyAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKKyAgICAgICAqIGMudG9wUm93cyhub256ZXJvX3Bpdm90cyk7CisKKyAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBub256ZXJvX3Bpdm90czsgKytpKSBkc3Qucm93KGRlYygpLmNvbHNQZXJtdXRhdGlvbigpLmluZGljZXMoKS5jb2VmZihpKSkgPSBjLnJvdyhpKTsKKyAgICBmb3IoSW5kZXggaSA9IG5vbnplcm9fcGl2b3RzOyBpIDwgY29sczsgKytpKSBkc3Qucm93KGRlYygpLmNvbHNQZXJtdXRhdGlvbigpLmluZGljZXMoKS5jb2VmZihpKSkuc2V0WmVybygpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggUSBhcyBhIHNlcXVlbmNlIG9mIGhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9ucyAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT46OkhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4KKyAgOjpob3VzZWhvbGRlclEoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJDb2xQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgcmV0dXJuIEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlKG1fcXIsIG1faENvZWZmcy5jb25qdWdhdGUoKSkuc2V0TGVuZ3RoKG1fbm9uemVyb19waXZvdHMpOworfQorCisvKiogXHJldHVybiB0aGUgY29sdW1uLXBpdm90aW5nIEhvdXNlaG9sZGVyIFFSIGRlY29tcG9zaXRpb24gb2YgXGMgKnRoaXMuCisgICoKKyAgKiBcc2EgY2xhc3MgQ29sUGl2SG91c2Vob2xkZXJRUgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IENvbFBpdkhvdXNlaG9sZGVyUVI8dHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3Q+CitNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjb2xQaXZIb3VzZWhvbGRlclFyKCkgY29uc3QKK3sKKyAgcmV0dXJuIENvbFBpdkhvdXNlaG9sZGVyUVI8UGxhaW5PYmplY3Q+KGV2YWwoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09MUElWT1RJTkdIT1VTRUhPTERFUlFSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9RUi9Db2xQaXZIb3VzZWhvbGRlclFSX01LTC5oIGIvRWlnZW4vc3JjL1FSL0NvbFBpdkhvdXNlaG9sZGVyUVJfTUtMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1ZWNmOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9RUi9Db2xQaXZIb3VzZWhvbGRlclFSX01LTC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBJbnRlbChSKSBNS0wKKyAqICAgIEhvdXNlaG9sZGVyIFFSIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXggd2l0aCBjb2x1bW4gcGl2b3RpbmcgYmFzZWQgb24KKyAqICAgIExBUEFDS0VfP2dlcXAzIGZ1bmN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIEVJR0VOX0NPTFBJVk9USU5HSE9VU0VIT0xERVJRUl9NS0xfSAorI2RlZmluZSBFSUdFTl9DT0xQSVZPVElOR0hPVVNFSE9MREVSUVJfTUtMX0gKKworI2luY2x1ZGUgIkVpZ2VuL3NyYy9Db3JlL3V0aWwvTUtMX3N1cHBvcnQuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW50ZXJuYWwgU3BlY2lhbGl6YXRpb24gZm9yIHRoZSBkYXRhIHR5cGVzIHN1cHBvcnRlZCBieSBNS0wgKi8KKworI2RlZmluZSBFSUdFTl9NS0xfUVJfQ09MUElWKEVJR1RZUEUsIE1LTFRZUEUsIE1LTFBSRUZJWCwgRUlHQ09MUk9XLCBNS0xDT0xST1cpIFwKK3RlbXBsYXRlPD4gaW5saW5lXAorQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg8RUlHVFlQRSwgRHluYW1pYywgRHluYW1pYywgRUlHQ09MUk9XLCBEeW5hbWljLCBEeW5hbWljPiA+JiBcCitDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1csIER5bmFtaWMsIER5bmFtaWM+ID46OmNvbXB1dGUoIFwKKyAgICAgICAgICAgICAgY29uc3QgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVywgRHluYW1pYywgRHluYW1pYz4mIG1hdHJpeCkgXAorXAoreyBcCisgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVywgRHluYW1pYywgRHluYW1pYz4gTWF0cml4VHlwZTsgXAorICB0eXBlZGVmIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7IFwKKyAgdHlwZWRlZiBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7IFwKKyAgSW5kZXggcm93cyA9IG1hdHJpeC5yb3dzKCk7XAorICBJbmRleCBjb2xzID0gbWF0cml4LmNvbHMoKTtcCisgIEluZGV4IHNpemUgPSBtYXRyaXguZGlhZ29uYWxTaXplKCk7XAorXAorICBtX3FyID0gbWF0cml4O1wKKyAgbV9oQ29lZmZzLnJlc2l6ZShzaXplKTtcCitcCisgIG1fY29sc1RyYW5zcG9zaXRpb25zLnJlc2l6ZShjb2xzKTtcCisgIC8qSW5kZXggbnVtYmVyX29mX3RyYW5zcG9zaXRpb25zID0gMDsqLyBcCitcCisgIG1fbm9uemVyb19waXZvdHMgPSAwOyBcCisgIG1fbWF4cGl2b3QgPSBSZWFsU2NhbGFyKDApO1wKKyAgbV9jb2xzUGVybXV0YXRpb24ucmVzaXplKGNvbHMpOyBcCisgIG1fY29sc1Blcm11dGF0aW9uLmluZGljZXMoKS5zZXRaZXJvKCk7IFwKK1wKKyAgbGFwYWNrX2ludCBsZGEgPSBtX3FyLm91dGVyU3RyaWRlKCksIGk7IFwKKyAgbGFwYWNrX2ludCBtYXRyaXhfb3JkZXIgPSBNS0xDT0xST1c7IFwKKyAgTEFQQUNLRV8jI01LTFBSRUZJWCMjZ2VxcDMoIG1hdHJpeF9vcmRlciwgcm93cywgY29scywgKE1LTFRZUEUqKW1fcXIuZGF0YSgpLCBsZGEsIChsYXBhY2tfaW50KiltX2NvbHNQZXJtdXRhdGlvbi5pbmRpY2VzKCkuZGF0YSgpLCAoTUtMVFlQRSopbV9oQ29lZmZzLmRhdGEoKSk7IFwKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsgXAorICBtX21heHBpdm90PW1fcXIuZGlhZ29uYWwoKS5jd2lzZUFicygpLm1heENvZWZmKCk7IFwKKyAgbV9oQ29lZmZzLmFkam9pbnRJblBsYWNlKCk7IFwKKyAgUmVhbFNjYWxhciBwcmVtdWx0aXBsaWVkX3RocmVzaG9sZCA9IGludGVybmFsOjphYnMobV9tYXhwaXZvdCkgKiB0aHJlc2hvbGQoKTsgXAorICBsYXBhY2tfaW50ICpwZXJtID0gbV9jb2xzUGVybXV0YXRpb24uaW5kaWNlcygpLmRhdGEoKTsgXAorICBmb3IoaT0wO2k8c2l6ZTtpKyspIHsgXAorICAgIG1fbm9uemVyb19waXZvdHMgKz0gKGludGVybmFsOjphYnMobV9xci5jb2VmZihpLGkpKSA+IHByZW11bHRpcGxpZWRfdGhyZXNob2xkKTtcCisgIH0gXAorICBmb3IoaT0wO2k8Y29scztpKyspIHBlcm1baV0tLTtcCitcCisgIC8qbV9kZXRfcHEgPSAobnVtYmVyX29mX3RyYW5zcG9zaXRpb25zJTIpID8gLTEgOiAxOyAgLy8gVE9ETzogSXQncyBub3QgbmVlZGVkIG5vdzsgZml4IHVwb24gYXZhaWxhYmlsaXR5IGluIEVpZ2VuICovIFwKK1wKKyAgcmV0dXJuICp0aGlzOyBcCit9CisKK0VJR0VOX01LTF9RUl9DT0xQSVYoZG91YmxlLCAgIGRvdWJsZSwgICAgICAgIGQsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTUtMX1FSX0NPTFBJVihmbG9hdCwgICAgZmxvYXQsICAgICAgICAgcywgQ29sTWFqb3IsIExBUEFDS19DT0xfTUFKT1IpCitFSUdFTl9NS0xfUVJfQ09MUElWKGRjb21wbGV4LCBNS0xfQ29tcGxleDE2LCB6LCBDb2xNYWpvciwgTEFQQUNLX0NPTF9NQUpPUikKK0VJR0VOX01LTF9RUl9DT0xQSVYoc2NvbXBsZXgsIE1LTF9Db21wbGV4OCwgIGMsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorCitFSUdFTl9NS0xfUVJfQ09MUElWKGRvdWJsZSwgICBkb3VibGUsICAgICAgICBkLCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKK0VJR0VOX01LTF9RUl9DT0xQSVYoZmxvYXQsICAgIGZsb2F0LCAgICAgICAgIHMsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorRUlHRU5fTUtMX1FSX0NPTFBJVihkY29tcGxleCwgTUtMX0NvbXBsZXgxNiwgeiwgUm93TWFqb3IsIExBUEFDS19ST1dfTUFKT1IpCitFSUdFTl9NS0xfUVJfQ09MUElWKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsICBjLCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DT0xQSVZPVElOR0hPVVNFSE9MREVSUVJfTUtMX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9RUi9GdWxsUGl2SG91c2Vob2xkZXJRUi5oIGIvRWlnZW4vc3JjL1FSL0Z1bGxQaXZIb3VzZWhvbGRlclFSLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4OThlNwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9RUi9GdWxsUGl2SG91c2Vob2xkZXJRUi5oCkBAIC0wLDAgKzEsNTk0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9GVUxMUElWT1RJTkdIT1VTRUhPTERFUlFSX0gKKyNkZWZpbmUgRUlHRU5fRlVMTFBJVk9USU5HSE9VU0VIT0xERVJRUl9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBzdHJ1Y3QgRnVsbFBpdkhvdXNlaG9sZGVyUVJNYXRyaXhRUmV0dXJuVHlwZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCB0cmFpdHM8RnVsbFBpdkhvdXNlaG9sZGVyUVJNYXRyaXhRUmV0dXJuVHlwZTxNYXRyaXhUeXBlPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UGxhaW5PYmplY3QgUmV0dXJuVHlwZTsKK307CisKK30KKworLyoqIFxpbmdyb3VwIFFSX01vZHVsZQorICAqCisgICogXGNsYXNzIEZ1bGxQaXZIb3VzZWhvbGRlclFSCisgICoKKyAgKiBcYnJpZWYgSG91c2Vob2xkZXIgcmFuay1yZXZlYWxpbmcgUVIgZGVjb21wb3NpdGlvbiBvZiBhIG1hdHJpeCB3aXRoIGZ1bGwgcGl2b3RpbmcKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUgUVIgZGVjb21wb3NpdGlvbgorICAqCisgICogVGhpcyBjbGFzcyBwZXJmb3JtcyBhIHJhbmstcmV2ZWFsaW5nIFFSIGRlY29tcG9zaXRpb24gb2YgYSBtYXRyaXggXGIgQSBpbnRvIG1hdHJpY2VzIFxiIFAsIFxiIFEgYW5kIFxiIFIKKyAgKiBzdWNoIHRoYXQgCisgICogXGZbCisgICogIFxtYXRoYmZ7QX0gXCwgXG1hdGhiZntQfSA9IFxtYXRoYmZ7UX0gXCwgXG1hdGhiZntSfQorICAqIFxmXQorICAqIGJ5IHVzaW5nIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9ucy4gSGVyZSwgXGIgUCBpcyBhIHBlcm11dGF0aW9uIG1hdHJpeCwgXGIgUSBhIHVuaXRhcnkgbWF0cml4IGFuZCBcYiBSIGFuIAorICAqIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LgorICAqCisgICogVGhpcyBkZWNvbXBvc2l0aW9uIHBlcmZvcm1zIGEgdmVyeSBwcnVkZW50IGZ1bGwgcGl2b3RpbmcgaW4gb3JkZXIgdG8gYmUgcmFuay1yZXZlYWxpbmcgYW5kIGFjaGlldmUgb3B0aW1hbAorICAqIG51bWVyaWNhbCBzdGFiaWxpdHkuIFRoZSB0cmFkZS1vZmYgaXMgdGhhdCBpdCBpcyBzbG93ZXIgdGhhbiBIb3VzZWhvbGRlclFSIGFuZCBDb2xQaXZIb3VzZWhvbGRlclFSLgorICAqCisgICogXHNhIE1hdHJpeEJhc2U6OmZ1bGxQaXZIb3VzZWhvbGRlclFyKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBGdWxsUGl2SG91c2Vob2xkZXJRUgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgaW50ZXJuYWw6OkZ1bGxQaXZIb3VzZWhvbGRlclFSTWF0cml4UVJldHVyblR5cGU8TWF0cml4VHlwZT4gTWF0cml4UVJldHVyblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fZGlhZ190eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIEhDb2VmZnNUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PEluZGV4LCAxLCBDb2xzQXRDb21waWxlVGltZSwgUm93TWFqb3IsIDEsIE1heENvbHNBdENvbXBpbGVUaW1lPiBJbnRSb3dWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgUGVybXV0YXRpb25NYXRyaXg8Q29sc0F0Q29tcGlsZVRpbWUsIE1heENvbHNBdENvbXBpbGVUaW1lPiBQZXJtdXRhdGlvblR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fY29sX3R5cGU8TWF0cml4VHlwZSwgSW5kZXg+Ojp0eXBlIEludENvbFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZT46OnR5cGUgUm93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9jb2xfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBDb2xWZWN0b3JUeXBlOworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBGdWxsUGl2SG91c2Vob2xkZXJRUjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJikuCisgICAgICAqLworICAgIEZ1bGxQaXZIb3VzZWhvbGRlclFSKCkKKyAgICAgIDogbV9xcigpLAorICAgICAgICBtX2hDb2VmZnMoKSwKKyAgICAgICAgbV9yb3dzX3RyYW5zcG9zaXRpb25zKCksCisgICAgICAgIG1fY29sc190cmFuc3Bvc2l0aW9ucygpLAorICAgICAgICBtX2NvbHNfcGVybXV0YXRpb24oKSwKKyAgICAgICAgbV90ZW1wKCksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZChmYWxzZSkge30KKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3RvciB3aXRoIG1lbW9yeSBwcmVhbGxvY2F0aW9uCisgICAgICAqCisgICAgICAqIExpa2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYnV0IHdpdGggcHJlYWxsb2NhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9ibGVtIFxhIHNpemUuCisgICAgICAqIFxzYSBGdWxsUGl2SG91c2Vob2xkZXJRUigpCisgICAgICAqLworICAgIEZ1bGxQaXZIb3VzZWhvbGRlclFSKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCisgICAgICA6IG1fcXIocm93cywgY29scyksCisgICAgICAgIG1faENvZWZmcygoc3RkOjptaW4pKHJvd3MsY29scykpLAorICAgICAgICBtX3Jvd3NfdHJhbnNwb3NpdGlvbnMocm93cyksCisgICAgICAgIG1fY29sc190cmFuc3Bvc2l0aW9ucyhjb2xzKSwKKyAgICAgICAgbV9jb2xzX3Blcm11dGF0aW9uKGNvbHMpLAorICAgICAgICBtX3RlbXAoKHN0ZDo6bWluKShyb3dzLGNvbHMpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKGZhbHNlKSB7fQorCisgICAgRnVsbFBpdkhvdXNlaG9sZGVyUVIoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBtX3FyKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2hDb2VmZnMoKHN0ZDo6bWluKShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSksCisgICAgICAgIG1fcm93c190cmFuc3Bvc2l0aW9ucyhtYXRyaXgucm93cygpKSwKKyAgICAgICAgbV9jb2xzX3RyYW5zcG9zaXRpb25zKG1hdHJpeC5jb2xzKCkpLAorICAgICAgICBtX2NvbHNfcGVybXV0YXRpb24obWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fdGVtcCgoc3RkOjptaW4pKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCkpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkKGZhbHNlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogVGhpcyBtZXRob2QgZmluZHMgYSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBBeD1iLCB3aGVyZSBBIGlzIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24sIGlmIGFueSBleGlzdHMuCisgICAgICAqCisgICAgICAqIFxwYXJhbSBiIHRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGVxdWF0aW9uIHRvIHNvbHZlLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBhIHNvbHV0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGUgY2FzZSB3aGVyZSBiIGlzIGEgbWF0cml4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIEFsc28sIHRoaXMKKyAgICAgICogICAgICAgY29kZSBpcyBzcGFjZSBpbmVmZmljaWVudC4KKyAgICAgICoKKyAgICAgICogXG5vdGVfYWJvdXRfY2hlY2tpbmdfc29sdXRpb25zCisgICAgICAqCisgICAgICAqIFxub3RlX2Fib3V0X2FyYml0cmFyeV9jaG9pY2Vfb2Zfc29sdXRpb24KKyAgICAgICoKKyAgICAgICogRXhhbXBsZTogXGluY2x1ZGUgRnVsbFBpdkhvdXNlaG9sZGVyUVJfc29sdmUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEZ1bGxQaXZIb3VzZWhvbGRlclFSX3NvbHZlLm91dAorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjpzb2x2ZV9yZXR2YWw8RnVsbFBpdkhvdXNlaG9sZGVyUVIsIFJocz4KKyAgICBzb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRnVsbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8RnVsbFBpdkhvdXNlaG9sZGVyUVIsIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgRXhwcmVzc2lvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtYXRyaXggUQorICAgICAgKi8KKyAgICBNYXRyaXhRUmV0dXJuVHlwZSBtYXRyaXhRKHZvaWQpIGNvbnN0OworCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXRyaXggd2hlcmUgdGhlIEhvdXNlaG9sZGVyIFFSIGRlY29tcG9zaXRpb24gaXMgc3RvcmVkCisgICAgICAqLworICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFFSKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9xcjsKKyAgICB9CisKKyAgICBGdWxsUGl2SG91c2Vob2xkZXJRUiYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpOworCisgICAgY29uc3QgUGVybXV0YXRpb25UeXBlJiBjb2xzUGVybXV0YXRpb24oKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkZ1bGxQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2NvbHNfcGVybXV0YXRpb247CisgICAgfQorCisgICAgY29uc3QgSW50Q29sVmVjdG9yVHlwZSYgcm93c1RyYW5zcG9zaXRpb25zKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9yb3dzX3RyYW5zcG9zaXRpb25zOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRldGVybWluYW50IG9mIHRoZSBtYXRyaXggb2Ygd2hpY2gKKyAgICAgICogKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uIEl0IGhhcyBvbmx5IGxpbmVhciBjb21wbGV4aXR5CisgICAgICAqICh0aGF0IGlzLCBPKG4pIHdoZXJlIG4gaXMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc3F1YXJlIG1hdHJpeCkKKyAgICAgICogYXMgdGhlIFFSIGRlY29tcG9zaXRpb24gaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBpcyBvbmx5IGZvciBzcXVhcmUgbWF0cmljZXMuCisgICAgICAqCisgICAgICAqIFx3YXJuaW5nIGEgZGV0ZXJtaW5hbnQgY2FuIGJlIHZlcnkgYmlnIG9yIHNtYWxsLCBzbyBmb3IgbWF0cmljZXMKKyAgICAgICogb2YgbGFyZ2UgZW5vdWdoIGRpbWVuc2lvbiwgdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93L3VuZGVyZmxvdy4KKyAgICAgICogT25lIHdheSB0byB3b3JrIGFyb3VuZCB0aGF0IGlzIHRvIHVzZSBsb2dBYnNEZXRlcm1pbmFudCgpIGluc3RlYWQuCisgICAgICAqCisgICAgICAqIFxzYSBsb2dBYnNEZXRlcm1pbmFudCgpLCBNYXRyaXhCYXNlOjpkZXRlcm1pbmFudCgpCisgICAgICAqLworICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgYWJzRGV0ZXJtaW5hbnQoKSBjb25zdDsKKworICAgIC8qKiBccmV0dXJucyB0aGUgbmF0dXJhbCBsb2cgb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgbWF0cml4IG9mIHdoaWNoCisgICAgICAqICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLiBJdCBoYXMgb25seSBsaW5lYXIgY29tcGxleGl0eQorICAgICAgKiAodGhhdCBpcywgTyhuKSB3aGVyZSBuIGlzIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNxdWFyZSBtYXRyaXgpCisgICAgICAqIGFzIHRoZSBRUiBkZWNvbXBvc2l0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgaXMgb25seSBmb3Igc3F1YXJlIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gd29yayBhcm91bmQgdGhlIHJpc2sgb2Ygb3ZlcmZsb3cvdW5kZXJmbG93IHRoYXQncyBpbmhlcmVudAorICAgICAgKiB0byBkZXRlcm1pbmFudCBjb21wdXRhdGlvbi4KKyAgICAgICoKKyAgICAgICogXHNhIGFic0RldGVybWluYW50KCksIE1hdHJpeEJhc2U6OmRldGVybWluYW50KCkKKyAgICAgICovCisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBsb2dBYnNEZXRlcm1pbmFudCgpIGNvbnN0OworCisgICAgLyoqIFxyZXR1cm5zIHRoZSByYW5rIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggcmFuaygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRnVsbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgUmVhbFNjYWxhciBwcmVtdWx0aXBsaWVkX3RocmVzaG9sZCA9IGludGVybmFsOjphYnMobV9tYXhwaXZvdCkgKiB0aHJlc2hvbGQoKTsKKyAgICAgIEluZGV4IHJlc3VsdCA9IDA7CisgICAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCBtX25vbnplcm9fcGl2b3RzOyArK2kpCisgICAgICAgIHJlc3VsdCArPSAoaW50ZXJuYWw6OmFicyhtX3FyLmNvZWZmKGksaSkpID4gcHJlbXVsdGlwbGllZF90aHJlc2hvbGQpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGRpbWVuc2lvbiBvZiB0aGUga2VybmVsIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24uCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggZGltZW5zaW9uT2ZLZXJuZWwoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkZ1bGxQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBjb2xzKCkgLSByYW5rKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCBvZiB3aGljaCAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbiByZXByZXNlbnRzIGFuIGluamVjdGl2ZQorICAgICAgKiAgICAgICAgICBsaW5lYXIgbWFwLCBpLmUuIGhhcyB0cml2aWFsIGtlcm5lbDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNJbmplY3RpdmUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkZ1bGxQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiByYW5rKCkgPT0gY29scygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggb2Ygd2hpY2ggKnRoaXMgaXMgdGhlIFFSIGRlY29tcG9zaXRpb24gcmVwcmVzZW50cyBhIHN1cmplY3RpdmUKKyAgICAgICogICAgICAgICAgbGluZWFyIG1hcDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBoYXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBpdm90cyBzaG91bGQgYmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgKiAgICAgICBGb3IgdGhhdCwgaXQgdXNlcyB0aGUgdGhyZXNob2xkIHZhbHVlIHRoYXQgeW91IGNhbiBjb250cm9sIGJ5IGNhbGxpbmcKKyAgICAgICogICAgICAgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNTdXJqZWN0aXZlKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gcmFuaygpID09IHJvd3MoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdHJ1ZSBpZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uIGlzIGludmVydGlibGUuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIGhhcyB0byBkZXRlcm1pbmUgd2hpY2ggcGl2b3RzIHNob3VsZCBiZSBjb25zaWRlcmVkIG5vbnplcm8uCisgICAgICAqICAgICAgIEZvciB0aGF0LCBpdCB1c2VzIHRoZSB0aHJlc2hvbGQgdmFsdWUgdGhhdCB5b3UgY2FuIGNvbnRyb2wgYnkgY2FsbGluZworICAgICAgKiAgICAgICBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc0ludmVydGlibGUoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkZ1bGxQaXZIb3VzZWhvbGRlclFSIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBpc0luamVjdGl2ZSgpICYmIGlzU3VyamVjdGl2ZSgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLgorICAgICAgKgorICAgICAgKiBcbm90ZSBJZiB0aGlzIG1hdHJpeCBpcyBub3QgaW52ZXJ0aWJsZSwgdGhlIHJldHVybmVkIG1hdHJpeCBoYXMgdW5kZWZpbmVkIGNvZWZmaWNpZW50cy4KKyAgICAgICogICAgICAgVXNlIGlzSW52ZXJ0aWJsZSgpIHRvIGZpcnN0IGRldGVybWluZSB3aGV0aGVyIHRoaXMgbWF0cml4IGlzIGludmVydGlibGUuCisgICAgICAqLyAgICBpbmxpbmUgY29uc3QKKyAgICBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPEZ1bGxQaXZIb3VzZWhvbGRlclFSLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJZGVudGl0eVJldHVyblR5cGU+CisgICAgaW52ZXJzZSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRnVsbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8RnVsbFBpdkhvdXNlaG9sZGVyUVIsdHlwZW5hbWUgTWF0cml4VHlwZTo6SWRlbnRpdHlSZXR1cm5UeXBlPgorICAgICAgICAgICAgICAgKCp0aGlzLCBNYXRyaXhUeXBlOjpJZGVudGl0eShtX3FyLnJvd3MoKSwgbV9xci5jb2xzKCkpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fcXIucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3FyLmNvbHMoKTsgfQorICAgIGNvbnN0IEhDb2VmZnNUeXBlJiBoQ29lZmZzKCkgY29uc3QgeyByZXR1cm4gbV9oQ29lZmZzOyB9CisKKyAgICAvKiogQWxsb3dzIHRvIHByZXNjcmliZSBhIHRocmVzaG9sZCB0byBiZSB1c2VkIGJ5IGNlcnRhaW4gbWV0aG9kcywgc3VjaCBhcyByYW5rKCksCisgICAgICAqIHdobyBuZWVkIHRvIGRldGVybWluZSB3aGVuIHBpdm90cyBhcmUgdG8gYmUgY29uc2lkZXJlZCBub256ZXJvLiBUaGlzIGlzIG5vdCB1c2VkIGZvciB0aGUKKyAgICAgICogUVIgZGVjb21wb3NpdGlvbiBpdHNlbGYuCisgICAgICAqCisgICAgICAqIFdoZW4gaXQgbmVlZHMgdG8gZ2V0IHRoZSB0aHJlc2hvbGQgdmFsdWUsIEVpZ2VuIGNhbGxzIHRocmVzaG9sZCgpLiBCeSBkZWZhdWx0LCB0aGlzCisgICAgICAqIHVzZXMgYSBmb3JtdWxhIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIGEgcmVhc29uYWJsZSB0aHJlc2hvbGQuCisgICAgICAqIE9uY2UgeW91IGhhdmUgY2FsbGVkIHRoZSBwcmVzZW50IG1ldGhvZCBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLAorICAgICAgKiB5b3VyIHZhbHVlIGlzIHVzZWQgaW5zdGVhZC4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIHRocmVzaG9sZCBUaGUgbmV3IHZhbHVlIHRvIHVzZSBhcyB0aGUgdGhyZXNob2xkLgorICAgICAgKgorICAgICAgKiBBIHBpdm90IHdpbGwgYmUgY29uc2lkZXJlZCBub256ZXJvIGlmIGl0cyBhYnNvbHV0ZSB2YWx1ZSBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4KKyAgICAgICogIFxmJCBcdmVydCBwaXZvdCBcdmVydCBcbGVxc2xhbnQgdGhyZXNob2xkIFx0aW1lcyBcdmVydCBtYXhwaXZvdCBcdmVydCBcZiQKKyAgICAgICogd2hlcmUgbWF4cGl2b3QgaXMgdGhlIGJpZ2dlc3QgcGl2b3QuCisgICAgICAqCisgICAgICAqIElmIHlvdSB3YW50IHRvIGNvbWUgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvciwgY2FsbCBzZXRUaHJlc2hvbGQoRGVmYXVsdF90KQorICAgICAgKi8KKyAgICBGdWxsUGl2SG91c2Vob2xkZXJRUiYgc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImIHRocmVzaG9sZCkKKyAgICB7CisgICAgICBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQgPSB0cnVlOworICAgICAgbV9wcmVzY3JpYmVkVGhyZXNob2xkID0gdGhyZXNob2xkOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBBbGxvd3MgdG8gY29tZSBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBsZXR0aW5nIEVpZ2VuIHVzZSBpdHMgZGVmYXVsdCBmb3JtdWxhIGZvcgorICAgICAgKiBkZXRlcm1pbmluZyB0aGUgdGhyZXNob2xkLgorICAgICAgKgorICAgICAgKiBZb3Ugc2hvdWxkIHBhc3MgdGhlIHNwZWNpYWwgb2JqZWN0IEVpZ2VuOjpEZWZhdWx0IGFzIHBhcmFtZXRlciBoZXJlLgorICAgICAgKiBcY29kZSBxci5zZXRUaHJlc2hvbGQoRWlnZW46OkRlZmF1bHQpOyBcZW5kY29kZQorICAgICAgKgorICAgICAgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2Ygc2V0VGhyZXNob2xkKGNvbnN0IFJlYWxTY2FsYXImKS4KKyAgICAgICovCisgICAgRnVsbFBpdkhvdXNlaG9sZGVyUVImIHNldFRocmVzaG9sZChEZWZhdWx0X3QpCisgICAgeworICAgICAgbV91c2VQcmVzY3JpYmVkVGhyZXNob2xkID0gZmFsc2U7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHRocmVzaG9sZCB0aGF0IHdpbGwgYmUgdXNlZCBieSBjZXJ0YWluIG1ldGhvZHMgc3VjaCBhcyByYW5rKCkuCisgICAgICAqCisgICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBzZXRUaHJlc2hvbGQoY29uc3QgUmVhbFNjYWxhciYpLgorICAgICAgKi8KKyAgICBSZWFsU2NhbGFyIHRocmVzaG9sZCgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCB8fCBtX3VzZVByZXNjcmliZWRUaHJlc2hvbGQpOworICAgICAgcmV0dXJuIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZCA/IG1fcHJlc2NyaWJlZFRocmVzaG9sZAorICAgICAgLy8gdGhpcyBmb3JtdWxhIGNvbWVzIGZyb20gZXhwZXJpbWVudGluZyAoc2VlICJMVSBwcmVjaXNpb24gdHVuaW5nIiB0aHJlYWQgb24gdGhlIGxpc3QpCisgICAgICAvLyBhbmQgdHVybnMgb3V0IHRvIGJlIGlkZW50aWNhbCB0byBIaWdoYW0ncyBmb3JtdWxhIHVzZWQgYWxyZWFkeSBpbiBMREx0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiBtX3FyLmRpYWdvbmFsU2l6ZSgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbnplcm8gcGl2b3RzIGluIHRoZSBRUiBkZWNvbXBvc2l0aW9uLgorICAgICAgKiBIZXJlIG5vbnplcm8gaXMgbWVhbnQgaW4gdGhlIGV4YWN0IHNlbnNlLCBub3QgaW4gYSBmdXp6eSBzZW5zZS4KKyAgICAgICogU28gdGhhdCBub3Rpb24gaXNuJ3QgcmVhbGx5IGludHJpbnNpY2FsbHkgaW50ZXJlc3RpbmcsIGJ1dCBpdCBpcworICAgICAgKiBzdGlsbCB1c2VmdWwgd2hlbiBpbXBsZW1lbnRpbmcgYWxnb3JpdGhtcy4KKyAgICAgICoKKyAgICAgICogXHNhIHJhbmsoKQorICAgICAgKi8KKyAgICBpbmxpbmUgSW5kZXggbm9uemVyb1Bpdm90cygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIG1fbm9uemVyb19waXZvdHM7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgYmlnZ2VzdCBwaXZvdCwgaS5lLiB0aGUgYmlnZ2VzdAorICAgICAgKiAgICAgICAgICBkaWFnb25hbCBjb2VmZmljaWVudCBvZiBVLgorICAgICAgKi8KKyAgICBSZWFsU2NhbGFyIG1heFBpdm90KCkgY29uc3QgeyByZXR1cm4gbV9tYXhwaXZvdDsgfQorCisgIHByb3RlY3RlZDoKKyAgICBNYXRyaXhUeXBlIG1fcXI7CisgICAgSENvZWZmc1R5cGUgbV9oQ29lZmZzOworICAgIEludENvbFZlY3RvclR5cGUgbV9yb3dzX3RyYW5zcG9zaXRpb25zOworICAgIEludFJvd1ZlY3RvclR5cGUgbV9jb2xzX3RyYW5zcG9zaXRpb25zOworICAgIFBlcm11dGF0aW9uVHlwZSBtX2NvbHNfcGVybXV0YXRpb247CisgICAgUm93VmVjdG9yVHlwZSBtX3RlbXA7CisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQsIG1fdXNlUHJlc2NyaWJlZFRocmVzaG9sZDsKKyAgICBSZWFsU2NhbGFyIG1fcHJlc2NyaWJlZFRocmVzaG9sZCwgbV9tYXhwaXZvdDsKKyAgICBJbmRleCBtX25vbnplcm9fcGl2b3RzOworICAgIFJlYWxTY2FsYXIgbV9wcmVjaXNpb247CisgICAgSW5kZXggbV9kZXRfcHE7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6YWJzRGV0ZXJtaW5hbnQoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIGVpZ2VuX2Fzc2VydChtX3FyLnJvd3MoKSA9PSBtX3FyLmNvbHMoKSAmJiAiWW91IGNhbid0IHRha2UgdGhlIGRldGVybWluYW50IG9mIGEgbm9uLXNxdWFyZSBtYXRyaXghIik7CisgIHJldHVybiBpbnRlcm5hbDo6YWJzKG1fcXIuZGlhZ29uYWwoKS5wcm9kKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6bG9nQWJzRGV0ZXJtaW5hbnQoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJGdWxsUGl2SG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIGVpZ2VuX2Fzc2VydChtX3FyLnJvd3MoKSA9PSBtX3FyLmNvbHMoKSAmJiAiWW91IGNhbid0IHRha2UgdGhlIGRldGVybWluYW50IG9mIGEgbm9uLXNxdWFyZSBtYXRyaXghIik7CisgIHJldHVybiBtX3FyLmRpYWdvbmFsKCkuY3dpc2VBYnMoKS5hcnJheSgpLmxvZygpLnN1bSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4mIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKK3sKKyAgSW5kZXggcm93cyA9IG1hdHJpeC5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtYXRyaXguY29scygpOworICBJbmRleCBzaXplID0gKHN0ZDo6bWluKShyb3dzLGNvbHMpOworCisgIG1fcXIgPSBtYXRyaXg7CisgIG1faENvZWZmcy5yZXNpemUoc2l6ZSk7CisKKyAgbV90ZW1wLnJlc2l6ZShjb2xzKTsKKworICBtX3ByZWNpc2lvbiA9IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiBzaXplOworCisgIG1fcm93c190cmFuc3Bvc2l0aW9ucy5yZXNpemUobWF0cml4LnJvd3MoKSk7CisgIG1fY29sc190cmFuc3Bvc2l0aW9ucy5yZXNpemUobWF0cml4LmNvbHMoKSk7CisgIEluZGV4IG51bWJlcl9vZl90cmFuc3Bvc2l0aW9ucyA9IDA7CisKKyAgUmVhbFNjYWxhciBiaWdnZXN0KDApOworCisgIG1fbm9uemVyb19waXZvdHMgPSBzaXplOyAvLyB0aGUgZ2VuZXJpYyBjYXNlIGlzIHRoYXQgaW4gd2hpY2ggYWxsIHBpdm90cyBhcmUgbm9uemVybyAoaW52ZXJ0aWJsZSBjYXNlKQorICBtX21heHBpdm90ID0gUmVhbFNjYWxhcigwKTsKKworICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgc2l6ZTsgKytrKQorICB7CisgICAgSW5kZXggcm93X29mX2JpZ2dlc3RfaW5fY29ybmVyLCBjb2xfb2ZfYmlnZ2VzdF9pbl9jb3JuZXI7CisgICAgUmVhbFNjYWxhciBiaWdnZXN0X2luX2Nvcm5lcjsKKworICAgIGJpZ2dlc3RfaW5fY29ybmVyID0gbV9xci5ib3R0b21SaWdodENvcm5lcihyb3dzLWssIGNvbHMtaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3dpc2VBYnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhDb2VmZigmcm93X29mX2JpZ2dlc3RfaW5fY29ybmVyLCAmY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyKTsKKyAgICByb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIgKz0gazsKKyAgICBjb2xfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIgKz0gazsKKyAgICBpZihrPT0wKSBiaWdnZXN0ID0gYmlnZ2VzdF9pbl9jb3JuZXI7CisKKyAgICAvLyBpZiB0aGUgY29ybmVyIGlzIG5lZ2xpZ2libGUsIHRoZW4gd2UgaGF2ZSBsZXNzIHRoYW4gZnVsbCByYW5rLCBhbmQgd2UgY2FuIGZpbmlzaCBlYXJseQorICAgIGlmKGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihiaWdnZXN0X2luX2Nvcm5lciwgYmlnZ2VzdCwgbV9wcmVjaXNpb24pKQorICAgIHsKKyAgICAgIG1fbm9uemVyb19waXZvdHMgPSBrOworICAgICAgZm9yKEluZGV4IGkgPSBrOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgeworICAgICAgICBtX3Jvd3NfdHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaSkgPSBpOworICAgICAgICBtX2NvbHNfdHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaSkgPSBpOworICAgICAgICBtX2hDb2VmZnMuY29lZmZSZWYoaSkgPSBTY2FsYXIoMCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBtX3Jvd3NfdHJhbnNwb3NpdGlvbnMuY29lZmZSZWYoaykgPSByb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXI7CisgICAgbV9jb2xzX3RyYW5zcG9zaXRpb25zLmNvZWZmUmVmKGspID0gY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyOworICAgIGlmKGsgIT0gcm93X29mX2JpZ2dlc3RfaW5fY29ybmVyKSB7CisgICAgICBtX3FyLnJvdyhrKS50YWlsKGNvbHMtaykuc3dhcChtX3FyLnJvdyhyb3dfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpLnRhaWwoY29scy1rKSk7CisgICAgICArK251bWJlcl9vZl90cmFuc3Bvc2l0aW9uczsKKyAgICB9CisgICAgaWYoayAhPSBjb2xfb2ZfYmlnZ2VzdF9pbl9jb3JuZXIpIHsKKyAgICAgIG1fcXIuY29sKGspLnN3YXAobV9xci5jb2woY29sX29mX2JpZ2dlc3RfaW5fY29ybmVyKSk7CisgICAgICArK251bWJlcl9vZl90cmFuc3Bvc2l0aW9uczsKKyAgICB9CisKKyAgICBSZWFsU2NhbGFyIGJldGE7CisgICAgbV9xci5jb2woaykudGFpbChyb3dzLWspLm1ha2VIb3VzZWhvbGRlckluUGxhY2UobV9oQ29lZmZzLmNvZWZmUmVmKGspLCBiZXRhKTsKKyAgICBtX3FyLmNvZWZmUmVmKGssaykgPSBiZXRhOworCisgICAgLy8gcmVtZW1iZXIgdGhlIG1heGltdW0gYWJzb2x1dGUgdmFsdWUgb2YgZGlhZ29uYWwgY29lZmZpY2llbnRzCisgICAgaWYoaW50ZXJuYWw6OmFicyhiZXRhKSA+IG1fbWF4cGl2b3QpIG1fbWF4cGl2b3QgPSBpbnRlcm5hbDo6YWJzKGJldGEpOworCisgICAgbV9xci5ib3R0b21SaWdodENvcm5lcihyb3dzLWssIGNvbHMtay0xKQorICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChtX3FyLmNvbChrKS50YWlsKHJvd3Mtay0xKSwgbV9oQ29lZmZzLmNvZWZmUmVmKGspLCAmbV90ZW1wLmNvZWZmUmVmKGsrMSkpOworICB9CisKKyAgbV9jb2xzX3Blcm11dGF0aW9uLnNldElkZW50aXR5KGNvbHMpOworICBmb3IoSW5kZXggayA9IDA7IGsgPCBzaXplOyArK2spCisgICAgbV9jb2xzX3Blcm11dGF0aW9uLmFwcGx5VHJhbnNwb3NpdGlvbk9uVGhlUmlnaHQoaywgbV9jb2xzX3RyYW5zcG9zaXRpb25zLmNvZWZmKGspKTsKKworICBtX2RldF9wcSA9IChudW1iZXJfb2ZfdHJhbnNwb3NpdGlvbnMlMikgPyAtMSA6IDE7CisgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgcmV0dXJuICp0aGlzOworfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNvbHZlX3JldHZhbDxGdWxsUGl2SG91c2Vob2xkZXJRUjxfTWF0cml4VHlwZT4sIFJocz4KKyAgOiBzb2x2ZV9yZXR2YWxfYmFzZTxGdWxsUGl2SG91c2Vob2xkZXJRUjxfTWF0cml4VHlwZT4sIFJocz4KK3sKKyAgRUlHRU5fTUFLRV9TT0xWRV9IRUxQRVJTKEZ1bGxQaXZIb3VzZWhvbGRlclFSPF9NYXRyaXhUeXBlPixSaHMpCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgY29uc3QgSW5kZXggcm93cyA9IGRlYygpLnJvd3MoKSwgY29scyA9IGRlYygpLmNvbHMoKTsKKyAgICBlaWdlbl9hc3NlcnQocmhzKCkucm93cygpID09IHJvd3MpOworCisgICAgLy8gRklYTUUgaW50cm9kdWNlIG5vbnplcm9QaXZvdHMoKSBhbmQgdXNlIGl0IGhlcmUuIGFuZCBtb3JlIGdlbmVyYWxseSwKKyAgICAvLyBtYWtlIHRoZSBzYW1lIGltcHJvdmVtZW50cyBpbiB0aGlzIGRlYyBhcyBpbiBGdWxsUGl2TFUuCisgICAgaWYoZGVjKCkucmFuaygpPT0wKQorICAgIHsKKyAgICAgIGRzdC5zZXRaZXJvKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHlwZW5hbWUgUmhzOjpQbGFpbk9iamVjdCBjKHJocygpKTsKKworICAgIE1hdHJpeDxTY2FsYXIsMSxSaHM6OkNvbHNBdENvbXBpbGVUaW1lPiB0ZW1wKHJocygpLmNvbHMoKSk7CisgICAgZm9yIChJbmRleCBrID0gMDsgayA8IGRlYygpLnJhbmsoKTsgKytrKQorICAgIHsKKyAgICAgIEluZGV4IHJlbWFpbmluZ1NpemUgPSByb3dzLWs7CisgICAgICBjLnJvdyhrKS5zd2FwKGMucm93KGRlYygpLnJvd3NUcmFuc3Bvc2l0aW9ucygpLmNvZWZmKGspKSk7CisgICAgICBjLmJvdHRvbVJpZ2h0Q29ybmVyKHJlbWFpbmluZ1NpemUsIHJocygpLmNvbHMoKSkKKyAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChkZWMoKS5tYXRyaXhRUigpLmNvbChrKS50YWlsKHJlbWFpbmluZ1NpemUtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjKCkuaENvZWZmcygpLmNvZWZmKGspLCAmdGVtcC5jb2VmZlJlZigwKSk7CisgICAgfQorCisgICAgaWYoIWRlYygpLmlzU3VyamVjdGl2ZSgpKQorICAgIHsKKyAgICAgIC8vIGlzIGMgaXMgaW4gdGhlIGltYWdlIG9mIFIgPworICAgICAgUmVhbFNjYWxhciBiaWdnZXN0X2luX3VwcGVyX3BhcnRfb2ZfYyA9IGMudG9wUm93cyggICBkZWMoKS5yYW5rKCkgICAgICkuY3dpc2VBYnMoKS5tYXhDb2VmZigpOworICAgICAgUmVhbFNjYWxhciBiaWdnZXN0X2luX2xvd2VyX3BhcnRfb2ZfYyA9IGMuYm90dG9tUm93cyhyb3dzLWRlYygpLnJhbmsoKSkuY3dpc2VBYnMoKS5tYXhDb2VmZigpOworICAgICAgLy8gRklYTUUgYnJhaW4gZGVhZAorICAgICAgY29uc3QgUmVhbFNjYWxhciBtX3ByZWNpc2lvbiA9IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiAoc3RkOjptaW4pKHJvd3MsY29scyk7CisgICAgICAvLyB0aGlzIGludGVybmFsOjogcHJlZml4IGlzIG5lZWRlZCBieSBhdCBsZWFzdCBnY2MgMy40IGFuZCBJQ0MKKyAgICAgIGlmKCFpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYmlnZ2VzdF9pbl9sb3dlcl9wYXJ0X29mX2MsIGJpZ2dlc3RfaW5fdXBwZXJfcGFydF9vZl9jLCBtX3ByZWNpc2lvbikpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVjKCkubWF0cml4UVIoKQorICAgICAgIC50b3BMZWZ0Q29ybmVyKGRlYygpLnJhbmsoKSwgZGVjKCkucmFuaygpKQorICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorICAgICAgIC5zb2x2ZUluUGxhY2UoYy50b3BSb3dzKGRlYygpLnJhbmsoKSkpOworCisgICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgZGVjKCkucmFuaygpOyArK2kpIGRzdC5yb3coZGVjKCkuY29sc1Blcm11dGF0aW9uKCkuaW5kaWNlcygpLmNvZWZmKGkpKSA9IGMucm93KGkpOworICAgIGZvcihJbmRleCBpID0gZGVjKCkucmFuaygpOyBpIDwgY29sczsgKytpKSBkc3Qucm93KGRlYygpLmNvbHNQZXJtdXRhdGlvbigpLmluZGljZXMoKS5jb2VmZihpKSkuc2V0WmVybygpOworICB9Cit9OworCisvKiogXGluZ3JvdXAgUVJfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgRXhwcmVzc2lvbiB0eXBlIGZvciByZXR1cm4gdmFsdWUgb2YgRnVsbFBpdkhvdXNlaG9sZGVyUVI6Om1hdHJpeFEoKQorICAqCisgICogXHRwYXJhbSBNYXRyaXhUeXBlIHR5cGUgb2YgdW5kZXJseWluZyBkZW5zZSBtYXRyaXgKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHN0cnVjdCBGdWxsUGl2SG91c2Vob2xkZXJRUk1hdHJpeFFSZXR1cm5UeXBlCisgIDogcHVibGljIFJldHVybkJ5VmFsdWU8RnVsbFBpdkhvdXNlaG9sZGVyUVJNYXRyaXhRUmV0dXJuVHlwZTxNYXRyaXhUeXBlPiA+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2NvbF90eXBlPE1hdHJpeFR5cGUsIEluZGV4Pjo6dHlwZSBJbnRDb2xWZWN0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9kaWFnX3R5cGU8TWF0cml4VHlwZT46OnR5cGUgSENvZWZmc1R5cGU7CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgMSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIFJvd01ham9yLCAxLAorICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZT4gV29ya1ZlY3RvclR5cGU7CisKKyAgRnVsbFBpdkhvdXNlaG9sZGVyUVJNYXRyaXhRUmV0dXJuVHlwZShjb25zdCBNYXRyaXhUeXBlJiAgICAgICBxciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIQ29lZmZzVHlwZSYgICAgICBoQ29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludENvbFZlY3RvclR5cGUmIHJvd3NUcmFuc3Bvc2l0aW9ucykKKyAgICA6IG1fcXIocXIpLAorICAgICAgbV9oQ29lZmZzKGhDb2VmZnMpLAorICAgICAgbV9yb3dzVHJhbnNwb3NpdGlvbnMocm93c1RyYW5zcG9zaXRpb25zKQorICAgICAge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VHlwZT4KKyAgdm9pZCBldmFsVG8oUmVzdWx0VHlwZSYgcmVzdWx0KSBjb25zdAorICB7CisgICAgY29uc3QgSW5kZXggcm93cyA9IG1fcXIucm93cygpOworICAgIFdvcmtWZWN0b3JUeXBlIHdvcmtzcGFjZShyb3dzKTsKKyAgICBldmFsVG8ocmVzdWx0LCB3b3Jrc3BhY2UpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlc3VsdCwgV29ya1ZlY3RvclR5cGUmIHdvcmtzcGFjZSkgY29uc3QKKyAgeworICAgIC8vIGNvbXB1dGUgdGhlIHByb2R1Y3QgSCdfMCBIJ18xIC4uLiBIJ19uLTEsCisgICAgLy8gd2hlcmUgSF9rIGlzIHRoZSBrLXRoIEhvdXNlaG9sZGVyIHRyYW5zZm9ybWF0aW9uIEkgLSBoX2sgdl9rIHZfaycKKyAgICAvLyBhbmQgdl9rIGlzIHRoZSBrLXRoIEhvdXNlaG9sZGVyIHZlY3RvciBbMSxtX3FyKGsrMSxrKSwgbV9xcihrKzIsayksIC4uLl0KKyAgICBjb25zdCBJbmRleCByb3dzID0gbV9xci5yb3dzKCk7CisgICAgY29uc3QgSW5kZXggY29scyA9IG1fcXIuY29scygpOworICAgIGNvbnN0IEluZGV4IHNpemUgPSAoc3RkOjptaW4pKHJvd3MsIGNvbHMpOworICAgIHdvcmtzcGFjZS5yZXNpemUocm93cyk7CisgICAgcmVzdWx0LnNldElkZW50aXR5KHJvd3MsIHJvd3MpOworICAgIGZvciAoSW5kZXggayA9IHNpemUtMTsgayA+PSAwOyBrLS0pCisgICAgeworICAgICAgcmVzdWx0LmJsb2NrKGssIGssIHJvd3Mtaywgcm93cy1rKQorICAgICAgICAgICAgLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQobV9xci5jb2woaykudGFpbChyb3dzLWstMSksIGludGVybmFsOjpjb25qKG1faENvZWZmcy5jb2VmZihrKSksICZ3b3Jrc3BhY2UuY29lZmZSZWYoaykpOworICAgICAgcmVzdWx0LnJvdyhrKS5zd2FwKHJlc3VsdC5yb3cobV9yb3dzVHJhbnNwb3NpdGlvbnMuY29lZmYoaykpKTsKKyAgICB9CisgIH0KKworICAgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3FyLnJvd3MoKTsgfQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3FyLnJvd3MoKTsgfQorCitwcm90ZWN0ZWQ6CisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBtX3FyOworICB0eXBlbmFtZSBIQ29lZmZzVHlwZTo6TmVzdGVkIG1faENvZWZmczsKKyAgdHlwZW5hbWUgSW50Q29sVmVjdG9yVHlwZTo6TmVzdGVkIG1fcm93c1RyYW5zcG9zaXRpb25zOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitpbmxpbmUgdHlwZW5hbWUgRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT46Ok1hdHJpeFFSZXR1cm5UeXBlIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+OjptYXRyaXhRKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRnVsbFBpdkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICByZXR1cm4gTWF0cml4UVJldHVyblR5cGUobV9xciwgbV9oQ29lZmZzLCBtX3Jvd3NfdHJhbnNwb3NpdGlvbnMpOworfQorCisvKiogXHJldHVybiB0aGUgZnVsbC1waXZvdGluZyBIb3VzZWhvbGRlciBRUiBkZWNvbXBvc2l0aW9uIG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGNsYXNzIEZ1bGxQaXZIb3VzZWhvbGRlclFSCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgRnVsbFBpdkhvdXNlaG9sZGVyUVI8dHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3Q+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpmdWxsUGl2SG91c2Vob2xkZXJRcigpIGNvbnN0Cit7CisgIHJldHVybiBGdWxsUGl2SG91c2Vob2xkZXJRUjxQbGFpbk9iamVjdD4oZXZhbCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9GVUxMUElWT1RJTkdIT1VTRUhPTERFUlFSX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9RUi9Ib3VzZWhvbGRlclFSLmggYi9FaWdlbi9zcmMvUVIvSG91c2Vob2xkZXJRUi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2IzMmMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvUVIvSG91c2Vob2xkZXJRUi5oCkBAIC0wLDAgKzEsMzQzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIFZpbmNlbnQgTGVqZXVuZQorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9RUl9ICisjZGVmaW5lIEVJR0VOX1FSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBRUl9Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIEhvdXNlaG9sZGVyUVIKKyAgKgorICAqIFxicmllZiBIb3VzZWhvbGRlciBRUiBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4CisgICoKKyAgKiBccGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgbWF0cml4IG9mIHdoaWNoIHdlIGFyZSBjb21wdXRpbmcgdGhlIFFSIGRlY29tcG9zaXRpb24KKyAgKgorICAqIFRoaXMgY2xhc3MgcGVyZm9ybXMgYSBRUiBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4IFxiIEEgaW50byBtYXRyaWNlcyBcYiBRIGFuZCBcYiBSCisgICogc3VjaCB0aGF0IAorICAqIFxmWworICAqICBcbWF0aGJme0F9ID0gXG1hdGhiZntRfSBcLCBcbWF0aGJme1J9CisgICogXGZdCisgICogYnkgdXNpbmcgSG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb25zLiBIZXJlLCBcYiBRIGEgdW5pdGFyeSBtYXRyaXggYW5kIFxiIFIgYW4gdXBwZXIgdHJpYW5ndWxhciBtYXRyaXguCisgICogVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gYSBjb21wYWN0IHdheSBjb21wYXRpYmxlIHdpdGggTEFQQUNLLgorICAqCisgICogTm90ZSB0aGF0IG5vIHBpdm90aW5nIGlzIHBlcmZvcm1lZC4gVGhpcyBpcyBcYiBub3QgYSByYW5rLXJldmVhbGluZyBkZWNvbXBvc2l0aW9uLgorICAqIElmIHlvdSB3YW50IHRoYXQgZmVhdHVyZSwgdXNlIEZ1bGxQaXZIb3VzZWhvbGRlclFSIG9yIENvbFBpdkhvdXNlaG9sZGVyUVIgaW5zdGVhZC4KKyAgKgorICAqIFRoaXMgSG91c2Vob2xkZXIgUVIgZGVjb21wb3NpdGlvbiBpcyBmYXN0ZXIsIGJ1dCBsZXNzIG51bWVyaWNhbGx5IHN0YWJsZSBhbmQgbGVzcyBmZWF0dXJlLWZ1bGwgdGhhbgorICAqIEZ1bGxQaXZIb3VzZWhvbGRlclFSIG9yIENvbFBpdkhvdXNlaG9sZGVyUVIuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6aG91c2Vob2xkZXJRcigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4gY2xhc3MgSG91c2Vob2xkZXJRUgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIFJvd3NBdENvbXBpbGVUaW1lLCAoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwgTWF4Um93c0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPiBNYXRyaXhRVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9kaWFnX3R5cGU8TWF0cml4VHlwZT46OnR5cGUgSENvZWZmc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZT46OnR5cGUgUm93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEhvdXNlaG9sZGVyU2VxdWVuY2U8TWF0cml4VHlwZSxIQ29lZmZzVHlwZT46OkNvbmp1Z2F0ZVJldHVyblR5cGUgSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGU7CisKKyAgICAvKioKKyAgICAqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yLgorICAgICoKKyAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBpbiBjYXNlcyBpbiB3aGljaCB0aGUgdXNlciBpbnRlbmRzIHRvCisgICAgKiBwZXJmb3JtIGRlY29tcG9zaXRpb25zIHZpYSBIb3VzZWhvbGRlclFSOjpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKS4KKyAgICAqLworICAgIEhvdXNlaG9sZGVyUVIoKSA6IG1fcXIoKSwgbV9oQ29lZmZzKCksIG1fdGVtcCgpLCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKKyAgICAvKiogXGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3Igd2l0aCBtZW1vcnkgcHJlYWxsb2NhdGlvbgorICAgICAgKgorICAgICAgKiBMaWtlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGJ1dCB3aXRoIHByZWFsbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGRhdGEKKyAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJvYmxlbSBcYSBzaXplLgorICAgICAgKiBcc2EgSG91c2Vob2xkZXJRUigpCisgICAgICAqLworICAgIEhvdXNlaG9sZGVyUVIoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICAgIDogbV9xcihyb3dzLCBjb2xzKSwKKyAgICAgICAgbV9oQ29lZmZzKChzdGQ6Om1pbikocm93cyxjb2xzKSksCisgICAgICAgIG1fdGVtcChjb2xzKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKSB7fQorCisgICAgSG91c2Vob2xkZXJRUihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICA6IG1fcXIobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSksCisgICAgICAgIG1faENvZWZmcygoc3RkOjptaW4pKG1hdHJpeC5yb3dzKCksbWF0cml4LmNvbHMoKSkpLAorICAgICAgICBtX3RlbXAobWF0cml4LmNvbHMoKSksCisgICAgICAgIG1faXNJbml0aWFsaXplZChmYWxzZSkKKyAgICB7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFRoaXMgbWV0aG9kIGZpbmRzIGEgc29sdXRpb24geCB0byB0aGUgZXF1YXRpb24gQXg9Yiwgd2hlcmUgQSBpcyB0aGUgbWF0cml4IG9mIHdoaWNoCisgICAgICAqICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLCBpZiBhbnkgZXhpc3RzLgorICAgICAgKgorICAgICAgKiBccGFyYW0gYiB0aGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBlcXVhdGlvbiB0byBzb2x2ZS4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSBzb2x1dGlvbi4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhlIGNhc2Ugd2hlcmUgYiBpcyBhIG1hdHJpeCBpcyBub3QgeWV0IGltcGxlbWVudGVkLiBBbHNvLCB0aGlzCisgICAgICAqICAgICAgIGNvZGUgaXMgc3BhY2UgaW5lZmZpY2llbnQuCisgICAgICAqCisgICAgICAqIFxub3RlX2Fib3V0X2NoZWNraW5nX3NvbHV0aW9ucworICAgICAgKgorICAgICAgKiBcbm90ZV9hYm91dF9hcmJpdHJhcnlfY2hvaWNlX29mX3NvbHV0aW9uCisgICAgICAqCisgICAgICAqIEV4YW1wbGU6IFxpbmNsdWRlIEhvdXNlaG9sZGVyUVJfc29sdmUuY3BwCisgICAgICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEhvdXNlaG9sZGVyUVJfc29sdmUub3V0CisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxIb3VzZWhvbGRlclFSLCBSaHM+CisgICAgc29sdmUoY29uc3QgTWF0cml4QmFzZTxSaHM+JiBiKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8SG91c2Vob2xkZXJRUiwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKworICAgIEhvdXNlaG9sZGVyU2VxdWVuY2VUeXBlIGhvdXNlaG9sZGVyUSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gSG91c2Vob2xkZXJTZXF1ZW5jZVR5cGUobV9xciwgbV9oQ29lZmZzLmNvbmp1Z2F0ZSgpKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG1hdHJpeCB3aGVyZSB0aGUgSG91c2Vob2xkZXIgUVIgZGVjb21wb3NpdGlvbiBpcyBzdG9yZWQKKyAgICAgICogaW4gYSBMQVBBQ0stY29tcGF0aWJsZSB3YXkuCisgICAgICAqLworICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeFFSKCkgY29uc3QKKyAgICB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gbV9xcjsKKyAgICB9CisKKyAgICBIb3VzZWhvbGRlclFSJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisKKyAgICAvKiogXHJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgbWF0cml4IG9mIHdoaWNoCisgICAgICAqICp0aGlzIGlzIHRoZSBRUiBkZWNvbXBvc2l0aW9uLiBJdCBoYXMgb25seSBsaW5lYXIgY29tcGxleGl0eQorICAgICAgKiAodGhhdCBpcywgTyhuKSB3aGVyZSBuIGlzIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNxdWFyZSBtYXRyaXgpCisgICAgICAqIGFzIHRoZSBRUiBkZWNvbXBvc2l0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFxub3RlIFRoaXMgaXMgb25seSBmb3Igc3F1YXJlIG1hdHJpY2VzLgorICAgICAgKgorICAgICAgKiBcd2FybmluZyBhIGRldGVybWluYW50IGNhbiBiZSB2ZXJ5IGJpZyBvciBzbWFsbCwgc28gZm9yIG1hdHJpY2VzCisgICAgICAqIG9mIGxhcmdlIGVub3VnaCBkaW1lbnNpb24sIHRoZXJlIGlzIGEgcmlzayBvZiBvdmVyZmxvdy91bmRlcmZsb3cuCisgICAgICAqIE9uZSB3YXkgdG8gd29yayBhcm91bmQgdGhhdCBpcyB0byB1c2UgbG9nQWJzRGV0ZXJtaW5hbnQoKSBpbnN0ZWFkLgorICAgICAgKgorICAgICAgKiBcc2EgbG9nQWJzRGV0ZXJtaW5hbnQoKSwgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQoKQorICAgICAgKi8KKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIGFic0RldGVybWluYW50KCkgY29uc3Q7CisKKyAgICAvKiogXHJldHVybnMgdGhlIG5hdHVyYWwgbG9nIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIG1hdHJpeCBvZiB3aGljaAorICAgICAgKiAqdGhpcyBpcyB0aGUgUVIgZGVjb21wb3NpdGlvbi4gSXQgaGFzIG9ubHkgbGluZWFyIGNvbXBsZXhpdHkKKyAgICAgICogKHRoYXQgaXMsIE8obikgd2hlcmUgbiBpcyB0aGUgZGltZW5zaW9uIG9mIHRoZSBzcXVhcmUgbWF0cml4KQorICAgICAgKiBhcyB0aGUgUVIgZGVjb21wb3NpdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLgorICAgICAgKgorICAgICAgKiBcbm90ZSBUaGlzIGlzIG9ubHkgZm9yIHNxdWFyZSBtYXRyaWNlcy4KKyAgICAgICoKKyAgICAgICogXG5vdGUgVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIHdvcmsgYXJvdW5kIHRoZSByaXNrIG9mIG92ZXJmbG93L3VuZGVyZmxvdyB0aGF0J3MgaW5oZXJlbnQKKyAgICAgICogdG8gZGV0ZXJtaW5hbnQgY29tcHV0YXRpb24uCisgICAgICAqCisgICAgICAqIFxzYSBhYnNEZXRlcm1pbmFudCgpLCBNYXRyaXhCYXNlOjpkZXRlcm1pbmFudCgpCisgICAgICAqLworICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgbG9nQWJzRGV0ZXJtaW5hbnQoKSBjb25zdDsKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9xci5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcXIuY29scygpOyB9CisgICAgY29uc3QgSENvZWZmc1R5cGUmIGhDb2VmZnMoKSBjb25zdCB7IHJldHVybiBtX2hDb2VmZnM7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZSBtX3FyOworICAgIEhDb2VmZnNUeXBlIG1faENvZWZmczsKKyAgICBSb3dWZWN0b3JUeXBlIG1fdGVtcDsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT46OmFic0RldGVybWluYW50KCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSG91c2Vob2xkZXJRUiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgIGVpZ2VuX2Fzc2VydChtX3FyLnJvd3MoKSA9PSBtX3FyLmNvbHMoKSAmJiAiWW91IGNhbid0IHRha2UgdGhlIGRldGVybWluYW50IG9mIGEgbm9uLXNxdWFyZSBtYXRyaXghIik7CisgIHJldHVybiBpbnRlcm5hbDo6YWJzKG1fcXIuZGlhZ29uYWwoKS5wcm9kKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+Ojpsb2dBYnNEZXRlcm1pbmFudCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkhvdXNlaG9sZGVyUVIgaXMgbm90IGluaXRpYWxpemVkLiIpOworICBlaWdlbl9hc3NlcnQobV9xci5yb3dzKCkgPT0gbV9xci5jb2xzKCkgJiYgIllvdSBjYW4ndCB0YWtlIHRoZSBkZXRlcm1pbmFudCBvZiBhIG5vbi1zcXVhcmUgbWF0cml4ISIpOworICByZXR1cm4gbV9xci5kaWFnb25hbCgpLmN3aXNlQWJzKCkuYXJyYXkoKS5sb2coKS5zdW0oKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbCAqLwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4UVIsIHR5cGVuYW1lIEhDb2VmZnM+Cit2b2lkIGhvdXNlaG9sZGVyX3FyX2lucGxhY2VfdW5ibG9ja2VkKE1hdHJpeFFSJiBtYXQsIEhDb2VmZnMmIGhDb2VmZnMsIHR5cGVuYW1lIE1hdHJpeFFSOjpTY2FsYXIqIHRlbXBEYXRhID0gMCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhRUjo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4UVI6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4UVI6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgSW5kZXggcm93cyA9IG1hdC5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtYXQuY29scygpOworICBJbmRleCBzaXplID0gKHN0ZDo6bWluKShyb3dzLGNvbHMpOworCisgIGVpZ2VuX2Fzc2VydChoQ29lZmZzLnNpemUoKSA9PSBzaXplKTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsTWF0cml4UVI6OkNvbHNBdENvbXBpbGVUaW1lLDE+IFRlbXBUeXBlOworICBUZW1wVHlwZSB0ZW1wVmVjdG9yOworICBpZih0ZW1wRGF0YT09MCkKKyAgeworICAgIHRlbXBWZWN0b3IucmVzaXplKGNvbHMpOworICAgIHRlbXBEYXRhID0gdGVtcFZlY3Rvci5kYXRhKCk7CisgIH0KKworICBmb3IoSW5kZXggayA9IDA7IGsgPCBzaXplOyArK2spCisgIHsKKyAgICBJbmRleCByZW1haW5pbmdSb3dzID0gcm93cyAtIGs7CisgICAgSW5kZXggcmVtYWluaW5nQ29scyA9IGNvbHMgLSBrIC0gMTsKKworICAgIFJlYWxTY2FsYXIgYmV0YTsKKyAgICBtYXQuY29sKGspLnRhaWwocmVtYWluaW5nUm93cykubWFrZUhvdXNlaG9sZGVySW5QbGFjZShoQ29lZmZzLmNvZWZmUmVmKGspLCBiZXRhKTsKKyAgICBtYXQuY29lZmZSZWYoayxrKSA9IGJldGE7CisKKyAgICAvLyBhcHBseSBIIHRvIHJlbWFpbmluZyBwYXJ0IG9mIG1fcXIgZnJvbSB0aGUgbGVmdAorICAgIG1hdC5ib3R0b21SaWdodENvcm5lcihyZW1haW5pbmdSb3dzLCByZW1haW5pbmdDb2xzKQorICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChtYXQuY29sKGspLnRhaWwocmVtYWluaW5nUm93cy0xKSwgaENvZWZmcy5jb2VmZlJlZihrKSwgdGVtcERhdGEraysxKTsKKyAgfQorfQorCisvKiogXGludGVybmFsICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhRUiwgdHlwZW5hbWUgSENvZWZmcz4KK3ZvaWQgaG91c2Vob2xkZXJfcXJfaW5wbGFjZV9ibG9ja2VkKE1hdHJpeFFSJiBtYXQsIEhDb2VmZnMmIGhDb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBNYXRyaXhRUjo6SW5kZXggbWF4QmxvY2tTaXplPTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTWF0cml4UVI6OlNjYWxhciogdGVtcERhdGEgPSAwKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFFSOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhRUjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhRUjo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIEJsb2NrPE1hdHJpeFFSLER5bmFtaWMsRHluYW1pYz4gQmxvY2tUeXBlOworCisgIEluZGV4IHJvd3MgPSBtYXQucm93cygpOworICBJbmRleCBjb2xzID0gbWF0LmNvbHMoKTsKKyAgSW5kZXggc2l6ZSA9IChzdGQ6Om1pbikocm93cywgY29scyk7CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMSxDb2xNYWpvcixNYXRyaXhRUjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsMT4gVGVtcFR5cGU7CisgIFRlbXBUeXBlIHRlbXBWZWN0b3I7CisgIGlmKHRlbXBEYXRhPT0wKQorICB7CisgICAgdGVtcFZlY3Rvci5yZXNpemUoY29scyk7CisgICAgdGVtcERhdGEgPSB0ZW1wVmVjdG9yLmRhdGEoKTsKKyAgfQorCisgIEluZGV4IGJsb2NrU2l6ZSA9IChzdGQ6Om1pbikobWF4QmxvY2tTaXplLHNpemUpOworCisgIEluZGV4IGsgPSAwOworICBmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgayArPSBibG9ja1NpemUpCisgIHsKKyAgICBJbmRleCBicyA9IChzdGQ6Om1pbikoc2l6ZS1rLGJsb2NrU2l6ZSk7ICAvLyBhY3R1YWwgc2l6ZSBvZiB0aGUgYmxvY2sKKyAgICBJbmRleCB0Y29scyA9IGNvbHMgLSBrIC0gYnM7ICAgICAgICAgICAgLy8gdHJhaWxpbmcgY29sdW1ucworICAgIEluZGV4IGJyb3dzID0gcm93cy1rOyAgICAgICAgICAgICAgICAgICAvLyByb3dzIG9mIHRoZSBibG9jaworCisgICAgLy8gcGFydGl0aW9uIHRoZSBtYXRyaXg6CisgICAgLy8gICAgICAgIEEwMCB8IEEwMSB8IEEwMgorICAgIC8vIG1hdCAgPSBBMTAgfCBBMTEgfCBBMTIKKyAgICAvLyAgICAgICAgQTIwIHwgQTIxIHwgQTIyCisgICAgLy8gYW5kIHBlcmZvcm1zIHRoZSBxciBkZWMgb2YgW0ExMV5UIEExMl5UXV5UCisgICAgLy8gYW5kIHVwZGF0ZSBbQTIxXlQgQTIyXlRdXlQgdXNpbmcgbGV2ZWwgMyBvcGVyYXRpb25zLgorICAgIC8vIEZpbmFsbHksIHRoZSBhbGdvcml0aG0gY29udGludWUgb24gQTIyCisKKyAgICBCbG9ja1R5cGUgQTExXzIxID0gbWF0LmJsb2NrKGssayxicm93cyxicyk7CisgICAgQmxvY2s8SENvZWZmcyxEeW5hbWljLDE+IGhDb2VmZnNTZWdtZW50ID0gaENvZWZmcy5zZWdtZW50KGssYnMpOworCisgICAgaG91c2Vob2xkZXJfcXJfaW5wbGFjZV91bmJsb2NrZWQoQTExXzIxLCBoQ29lZmZzU2VnbWVudCwgdGVtcERhdGEpOworCisgICAgaWYodGNvbHMpCisgICAgeworICAgICAgQmxvY2tUeXBlIEEyMV8yMiA9IG1hdC5ibG9jayhrLGsrYnMsYnJvd3MsdGNvbHMpOworICAgICAgYXBwbHlfYmxvY2tfaG91c2Vob2xkZXJfb25fdGhlX2xlZnQoQTIxXzIyLEExMV8yMSxoQ29lZmZzU2VnbWVudC5hZGpvaW50KCkpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNvbHZlX3JldHZhbDxIb3VzZWhvbGRlclFSPF9NYXRyaXhUeXBlPiwgUmhzPgorICA6IHNvbHZlX3JldHZhbF9iYXNlPEhvdXNlaG9sZGVyUVI8X01hdHJpeFR5cGU+LCBSaHM+Cit7CisgIEVJR0VOX01BS0VfU09MVkVfSEVMUEVSUyhIb3VzZWhvbGRlclFSPF9NYXRyaXhUeXBlPixSaHMpCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgY29uc3QgSW5kZXggcm93cyA9IGRlYygpLnJvd3MoKSwgY29scyA9IGRlYygpLmNvbHMoKTsKKyAgICBjb25zdCBJbmRleCByYW5rID0gKHN0ZDo6bWluKShyb3dzLCBjb2xzKTsKKyAgICBlaWdlbl9hc3NlcnQocmhzKCkucm93cygpID09IHJvd3MpOworCisgICAgdHlwZW5hbWUgUmhzOjpQbGFpbk9iamVjdCBjKHJocygpKTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGUgbWF0cml4IFEgPSBIXzBeKiBIXzFeKi4uLiBzbyBpdHMgaW52ZXJzZSBpcyBRXiogPSAoSF8wIEhfMSAuLi4pXlQKKyAgICBjLmFwcGx5T25UaGVMZWZ0KGhvdXNlaG9sZGVyU2VxdWVuY2UoCisgICAgICBkZWMoKS5tYXRyaXhRUigpLmxlZnRDb2xzKHJhbmspLAorICAgICAgZGVjKCkuaENvZWZmcygpLmhlYWQocmFuaykpLnRyYW5zcG9zZSgpCisgICAgKTsKKworICAgIGRlYygpLm1hdHJpeFFSKCkKKyAgICAgICAudG9wTGVmdENvcm5lcihyYW5rLCByYW5rKQorICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorICAgICAgIC5zb2x2ZUluUGxhY2UoYy50b3BSb3dzKHJhbmspKTsKKworICAgIGRzdC50b3BSb3dzKHJhbmspID0gYy50b3BSb3dzKHJhbmspOworICAgIGRzdC5ib3R0b21Sb3dzKGNvbHMtcmFuaykuc2V0WmVybygpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0hvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4mIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT46OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQoreworICBJbmRleCByb3dzID0gbWF0cml4LnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG1hdHJpeC5jb2xzKCk7CisgIEluZGV4IHNpemUgPSAoc3RkOjptaW4pKHJvd3MsY29scyk7CisKKyAgbV9xciA9IG1hdHJpeDsKKyAgbV9oQ29lZmZzLnJlc2l6ZShzaXplKTsKKworICBtX3RlbXAucmVzaXplKGNvbHMpOworCisgIGludGVybmFsOjpob3VzZWhvbGRlcl9xcl9pbnBsYWNlX2Jsb2NrZWQobV9xciwgbV9oQ29lZmZzLCA0OCwgbV90ZW1wLmRhdGEoKSk7CisKKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvKiogXHJldHVybiB0aGUgSG91c2Vob2xkZXIgUVIgZGVjb21wb3NpdGlvbiBvZiBcYyAqdGhpcy4KKyAgKgorICAqIFxzYSBjbGFzcyBIb3VzZWhvbGRlclFSCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgSG91c2Vob2xkZXJRUjx0eXBlbmFtZSBNYXRyaXhCYXNlPERlcml2ZWQ+OjpQbGFpbk9iamVjdD4KK01hdHJpeEJhc2U8RGVyaXZlZD46OmhvdXNlaG9sZGVyUXIoKSBjb25zdAoreworICByZXR1cm4gSG91c2Vob2xkZXJRUjxQbGFpbk9iamVjdD4oZXZhbCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9RUl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvUVIvSG91c2Vob2xkZXJRUl9NS0wuaCBiL0VpZ2VuL3NyYy9RUi9Ib3VzZWhvbGRlclFSX01LTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMTNkZTYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvUVIvSG91c2Vob2xkZXJRUl9NS0wuaApAQCAtMCwwICsxLDY5IEBACisvKgorIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb250ZW50IDogRWlnZW4gYmluZGluZ3MgdG8gSW50ZWwoUikgTUtMCisgKiAgICBIb3VzZWhvbGRlciBRUiBkZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4IHcvbyBwaXZvdGluZyBiYXNlZCBvbgorICogICAgTEFQQUNLRV8/Z2VxcmYgZnVuY3Rpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fUVJfTUtMX0gKKyNkZWZpbmUgRUlHRU5fUVJfTUtMX0gKKworI2luY2x1ZGUgIkVpZ2VuL3NyYy9Db3JlL3V0aWwvTUtMX3N1cHBvcnQuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwgU3BlY2lhbGl6YXRpb24gZm9yIHRoZSBkYXRhIHR5cGVzIHN1cHBvcnRlZCBieSBNS0wgKi8KKworI2RlZmluZSBFSUdFTl9NS0xfUVJfTk9QSVYoRUlHVFlQRSwgTUtMVFlQRSwgTUtMUFJFRklYKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhRUiwgdHlwZW5hbWUgSENvZWZmcz4gXAordm9pZCBob3VzZWhvbGRlcl9xcl9pbnBsYWNlX2Jsb2NrZWQoTWF0cml4UVImIG1hdCwgSENvZWZmcyYgaENvZWZmcywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTWF0cml4UVI6OkluZGV4IG1heEJsb2NrU2l6ZT0zMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlHVFlQRSogdGVtcERhdGEgPSAwKSBcCit7IFwKKyAgbGFwYWNrX2ludCBtID0gbWF0LnJvd3MoKTsgXAorICBsYXBhY2tfaW50IG4gPSBtYXQuY29scygpOyBcCisgIGxhcGFja19pbnQgbGRhID0gbWF0Lm91dGVyU3RyaWRlKCk7IFwKKyAgbGFwYWNrX2ludCBtYXRyaXhfb3JkZXIgPSAoTWF0cml4UVI6OklzUm93TWFqb3IpID8gTEFQQUNLX1JPV19NQUpPUiA6IExBUEFDS19DT0xfTUFKT1I7IFwKKyAgTEFQQUNLRV8jI01LTFBSRUZJWCMjZ2VxcmYoIG1hdHJpeF9vcmRlciwgbSwgbiwgKE1LTFRZUEUqKW1hdC5kYXRhKCksIGxkYSwgKE1LTFRZUEUqKWhDb2VmZnMuZGF0YSgpKTsgXAorICBoQ29lZmZzLmFkam9pbnRJblBsYWNlKCk7IFwKK1wKK30KKworRUlHRU5fTUtMX1FSX05PUElWKGRvdWJsZSwgZG91YmxlLCBkKQorRUlHRU5fTUtMX1FSX05PUElWKGZsb2F0LCBmbG9hdCwgcykKK0VJR0VOX01LTF9RUl9OT1BJVihkY29tcGxleCwgTUtMX0NvbXBsZXgxNiwgeikKK0VJR0VOX01LTF9RUl9OT1BJVihzY29tcGxleCwgTUtMX0NvbXBsZXg4LCBjKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9RUl9NS0xfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NWRC9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9TVkQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlZmM0NAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TVkQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fU1ZEX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9TVkRfU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS9FaWdlbi9zcmMvU1ZEIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU1ZEL0phY29iaVNWRC5oIGIvRWlnZW4vc3JjL1NWRC9KYWNvYmlTVkQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2RiZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NWRC9KYWNvYmlTVkQuaApAQCAtMCwwICsxLDg2NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fSkFDT0JJU1ZEX0gKKyNkZWZpbmUgRUlHRU5fSkFDT0JJU1ZEX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBmb3J3YXJkIGRlY2xhcmF0aW9uIChuZWVkZWQgYnkgSUNDKQorLy8gdGhlIGVtcHR5IGJvZHkgaXMgcmVxdWlyZWQgYnkgTVNWQwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXIsCisgICAgICAgICBib29sIElzQ29tcGxleCA9IE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpJc0NvbXBsZXg+CitzdHJ1Y3Qgc3ZkX3ByZWNvbmRpdGlvbl8yeDJfYmxvY2tfdG9fYmVfcmVhbCB7fTsKKworLyoqKiBRUiBwcmVjb25kaXRpb25lcnMgKFItU1ZEKQorICoqKgorICoqKiBUaGVpciByb2xlIGlzIHRvIHJlZHVjZSB0aGUgcHJvYmxlbSBvZiBjb21wdXRpbmcgdGhlIFNWRCB0byB0aGUgY2FzZSBvZiBhIHNxdWFyZSBtYXRyaXguCisgKioqIFRoaXMgYXBwcm9hY2gsIGtub3duIGFzIFItU1ZELCBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHJlY3Rhbmd1bGFyLWVub3VnaCBtYXRyaWNlcywgYW5kIGlzIGEgcmVxdWlyZW1lbnQgZm9yCisgKioqIEphY29iaVNWRCB3aGljaCBieSBpdHNlbGYgaXMgb25seSBhYmxlIHRvIHdvcmsgb24gc3F1YXJlIG1hdHJpY2VzLgorICoqKi8KKworZW51bSB7IFByZWNvbmRpdGlvbklmTW9yZUNvbHNUaGFuUm93cywgUHJlY29uZGl0aW9uSWZNb3JlUm93c1RoYW5Db2xzIH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBRUlByZWNvbmRpdGlvbmVyLCBpbnQgQ2FzZT4KK3N0cnVjdCBxcl9wcmVjb25kaXRpb25lcl9zaG91bGRfZG9fYW55dGhpbmcKK3sKKyAgZW51bSB7IGEgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSAhPSBEeW5hbWljICYmCisgICAgICAgICAgICAgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgIT0gRHluYW1pYyAmJgorICAgICAgICAgICAgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIDw9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgYiA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lICE9IER5bmFtaWMgJiYKKyAgICAgICAgICAgICBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSAhPSBEeW5hbWljICYmCisgICAgICAgICAgICAgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPD0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICByZXQgPSAhKCAoUVJQcmVjb25kaXRpb25lciA9PSBOb1FSUHJlY29uZGl0aW9uZXIpIHx8CisgICAgICAgICAgICAgICAgICAoQ2FzZSA9PSBQcmVjb25kaXRpb25JZk1vcmVDb2xzVGhhblJvd3MgJiYgYm9vbChhKSkgfHwKKyAgICAgICAgICAgICAgICAgIChDYXNlID09IFByZWNvbmRpdGlvbklmTW9yZVJvd3NUaGFuQ29scyAmJiBib29sKGIpKSApCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgUVJQcmVjb25kaXRpb25lciwgaW50IENhc2UsCisgICAgICAgICBib29sIERvQW55dGhpbmcgPSBxcl9wcmVjb25kaXRpb25lcl9zaG91bGRfZG9fYW55dGhpbmc8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lciwgQ2FzZT46OnJldAorPiBzdHJ1Y3QgcXJfcHJlY29uZGl0aW9uZXJfaW1wbCB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXIsIGludCBDYXNlPgorY2xhc3MgcXJfcHJlY29uZGl0aW9uZXJfaW1wbDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyLCBDYXNlLCBmYWxzZT4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdm9pZCBhbGxvY2F0ZShjb25zdCBKYWNvYmlTVkQ8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj4mKSB7fQorICBib29sIHJ1bihKYWNvYmlTVkQ8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj4mLCBjb25zdCBNYXRyaXhUeXBlJikKKyAgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLyoqKiBwcmVjb25kaXRpb25lciB1c2luZyBGdWxsUGl2SG91c2Vob2xkZXJRUiAqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBxcl9wcmVjb25kaXRpb25lcl9pbXBsPE1hdHJpeFR5cGUsIEZ1bGxQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXIsIFByZWNvbmRpdGlvbklmTW9yZVJvd3NUaGFuQ29scywgdHJ1ZT4KK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBlbnVtCisgIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBSb3dzQXRDb21waWxlVGltZSwgUm93TWFqb3IsIDEsIE1heFJvd3NBdENvbXBpbGVUaW1lPiBXb3Jrc3BhY2VUeXBlOworCisgIHZvaWQgYWxsb2NhdGUoY29uc3QgSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIEZ1bGxQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBzdmQpCisgIHsKKyAgICBpZiAoc3ZkLnJvd3MoKSAhPSBtX3FyLnJvd3MoKSB8fCBzdmQuY29scygpICE9IG1fcXIuY29scygpKQorICAgIHsKKyAgICAgIG1fcXIgPSBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPihzdmQucm93cygpLCBzdmQuY29scygpKTsKKyAgICB9CisgICAgaWYgKHN2ZC5tX2NvbXB1dGVGdWxsVSkgbV93b3Jrc3BhY2UucmVzaXplKHN2ZC5yb3dzKCkpOworICB9CisKKyAgYm9vbCBydW4oSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIEZ1bGxQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBzdmQsIGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgeworICAgIGlmKG1hdHJpeC5yb3dzKCkgPiBtYXRyaXguY29scygpKQorICAgIHsKKyAgICAgIG1fcXIuY29tcHV0ZShtYXRyaXgpOworICAgICAgc3ZkLm1fd29ya01hdHJpeCA9IG1fcXIubWF0cml4UVIoKS5ibG9jaygwLDAsbWF0cml4LmNvbHMoKSxtYXRyaXguY29scygpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgICAgIGlmKHN2ZC5tX2NvbXB1dGVGdWxsVSkgbV9xci5tYXRyaXhRKCkuZXZhbFRvKHN2ZC5tX21hdHJpeFUsIG1fd29ya3NwYWNlKTsKKyAgICAgIGlmKHN2ZC5jb21wdXRlVigpKSBzdmQubV9tYXRyaXhWID0gbV9xci5jb2xzUGVybXV0YXRpb24oKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK3ByaXZhdGU6CisgIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IG1fcXI7CisgIFdvcmtzcGFjZVR5cGUgbV93b3Jrc3BhY2U7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgcXJfcHJlY29uZGl0aW9uZXJfaW1wbDxNYXRyaXhUeXBlLCBGdWxsUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyLCBQcmVjb25kaXRpb25JZk1vcmVDb2xzVGhhblJvd3MsIHRydWU+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bQorICB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKyAgICBPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucworICB9OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBSb3dzQXRDb21waWxlVGltZSwgT3B0aW9ucywgTWF4Q29sc0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgICAgIFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlcjsKKworICB2b2lkIGFsbG9jYXRlKGNvbnN0IEphY29iaVNWRDxNYXRyaXhUeXBlLCBGdWxsUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyPiYgc3ZkKQorICB7CisgICAgaWYgKHN2ZC5jb2xzKCkgIT0gbV9xci5yb3dzKCkgfHwgc3ZkLnJvd3MoKSAhPSBtX3FyLmNvbHMoKSkKKyAgICB7CisgICAgICBtX3FyID0gRnVsbFBpdkhvdXNlaG9sZGVyUVI8VHJhbnNwb3NlVHlwZVdpdGhTYW1lU3RvcmFnZU9yZGVyPihzdmQuY29scygpLCBzdmQucm93cygpKTsKKyAgICB9CisgICAgbV9hZGpvaW50LnJlc2l6ZShzdmQuY29scygpLCBzdmQucm93cygpKTsKKyAgICBpZiAoc3ZkLm1fY29tcHV0ZUZ1bGxWKSBtX3dvcmtzcGFjZS5yZXNpemUoc3ZkLmNvbHMoKSk7CisgIH0KKworICBib29sIHJ1bihKYWNvYmlTVkQ8TWF0cml4VHlwZSwgRnVsbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4mIHN2ZCwgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICB7CisgICAgaWYobWF0cml4LmNvbHMoKSA+IG1hdHJpeC5yb3dzKCkpCisgICAgeworICAgICAgbV9hZGpvaW50ID0gbWF0cml4LmFkam9pbnQoKTsKKyAgICAgIG1fcXIuY29tcHV0ZShtX2Fkam9pbnQpOworICAgICAgc3ZkLm1fd29ya01hdHJpeCA9IG1fcXIubWF0cml4UVIoKS5ibG9jaygwLDAsbWF0cml4LnJvd3MoKSxtYXRyaXgucm93cygpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5hZGpvaW50KCk7CisgICAgICBpZihzdmQubV9jb21wdXRlRnVsbFYpIG1fcXIubWF0cml4USgpLmV2YWxUbyhzdmQubV9tYXRyaXhWLCBtX3dvcmtzcGFjZSk7CisgICAgICBpZihzdmQuY29tcHV0ZVUoKSkgc3ZkLm1fbWF0cml4VSA9IG1fcXIuY29sc1Blcm11dGF0aW9uKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSByZXR1cm4gZmFsc2U7CisgIH0KK3ByaXZhdGU6CisgIEZ1bGxQaXZIb3VzZWhvbGRlclFSPFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlcj4gbV9xcjsKKyAgVHJhbnNwb3NlVHlwZVdpdGhTYW1lU3RvcmFnZU9yZGVyIG1fYWRqb2ludDsKKyAgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX3Jvd190eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIG1fd29ya3NwYWNlOworfTsKKworLyoqKiBwcmVjb25kaXRpb25lciB1c2luZyBDb2xQaXZIb3VzZWhvbGRlclFSICoqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIHFyX3ByZWNvbmRpdGlvbmVyX2ltcGw8TWF0cml4VHlwZSwgQ29sUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyLCBQcmVjb25kaXRpb25JZk1vcmVSb3dzVGhhbkNvbHMsIHRydWU+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgdm9pZCBhbGxvY2F0ZShjb25zdCBKYWNvYmlTVkQ8TWF0cml4VHlwZSwgQ29sUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyPiYgc3ZkKQorICB7CisgICAgaWYgKHN2ZC5yb3dzKCkgIT0gbV9xci5yb3dzKCkgfHwgc3ZkLmNvbHMoKSAhPSBtX3FyLmNvbHMoKSkKKyAgICB7CisgICAgICBtX3FyID0gQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPihzdmQucm93cygpLCBzdmQuY29scygpKTsKKyAgICB9CisgICAgaWYgKHN2ZC5tX2NvbXB1dGVGdWxsVSkgbV93b3Jrc3BhY2UucmVzaXplKHN2ZC5yb3dzKCkpOworICAgIGVsc2UgaWYgKHN2ZC5tX2NvbXB1dGVUaGluVSkgbV93b3Jrc3BhY2UucmVzaXplKHN2ZC5jb2xzKCkpOworICB9CisKKyAgYm9vbCBydW4oSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4mIHN2ZCwgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICB7CisgICAgaWYobWF0cml4LnJvd3MoKSA+IG1hdHJpeC5jb2xzKCkpCisgICAgeworICAgICAgbV9xci5jb21wdXRlKG1hdHJpeCk7CisgICAgICBzdmQubV93b3JrTWF0cml4ID0gbV9xci5tYXRyaXhRUigpLmJsb2NrKDAsMCxtYXRyaXguY29scygpLG1hdHJpeC5jb2xzKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICAgICAgaWYoc3ZkLm1fY29tcHV0ZUZ1bGxVKSBtX3FyLmhvdXNlaG9sZGVyUSgpLmV2YWxUbyhzdmQubV9tYXRyaXhVLCBtX3dvcmtzcGFjZSk7CisgICAgICBlbHNlIGlmKHN2ZC5tX2NvbXB1dGVUaGluVSkKKyAgICAgIHsKKyAgICAgICAgc3ZkLm1fbWF0cml4VS5zZXRJZGVudGl0eShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKTsKKyAgICAgICAgbV9xci5ob3VzZWhvbGRlclEoKS5hcHBseVRoaXNPblRoZUxlZnQoc3ZkLm1fbWF0cml4VSwgbV93b3Jrc3BhY2UpOworICAgICAgfQorICAgICAgaWYoc3ZkLmNvbXB1dGVWKCkpIHN2ZC5tX21hdHJpeFYgPSBtX3FyLmNvbHNQZXJtdXRhdGlvbigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICBDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IG1fcXI7CisgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9jb2xfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBtX3dvcmtzcGFjZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBxcl9wcmVjb25kaXRpb25lcl9pbXBsPE1hdHJpeFR5cGUsIENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lciwgUHJlY29uZGl0aW9uSWZNb3JlQ29sc1RoYW5Sb3dzLCB0cnVlPgoreworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGVudW0KKyAgeworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMKKyAgfTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBSb3dzQXRDb21waWxlVGltZSwgT3B0aW9ucywgTWF4Q29sc0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgICAgIFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlcjsKKworICB2b2lkIGFsbG9jYXRlKGNvbnN0IEphY29iaVNWRDxNYXRyaXhUeXBlLCBDb2xQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBzdmQpCisgIHsKKyAgICBpZiAoc3ZkLmNvbHMoKSAhPSBtX3FyLnJvd3MoKSB8fCBzdmQucm93cygpICE9IG1fcXIuY29scygpKQorICAgIHsKKyAgICAgIG1fcXIgPSBDb2xQaXZIb3VzZWhvbGRlclFSPFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlcj4oc3ZkLmNvbHMoKSwgc3ZkLnJvd3MoKSk7CisgICAgfQorICAgIGlmIChzdmQubV9jb21wdXRlRnVsbFYpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQuY29scygpKTsKKyAgICBlbHNlIGlmIChzdmQubV9jb21wdXRlVGhpblYpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQucm93cygpKTsKKyAgICBtX2Fkam9pbnQucmVzaXplKHN2ZC5jb2xzKCksIHN2ZC5yb3dzKCkpOworICB9CisKKyAgYm9vbCBydW4oSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4mIHN2ZCwgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICB7CisgICAgaWYobWF0cml4LmNvbHMoKSA+IG1hdHJpeC5yb3dzKCkpCisgICAgeworICAgICAgbV9hZGpvaW50ID0gbWF0cml4LmFkam9pbnQoKTsKKyAgICAgIG1fcXIuY29tcHV0ZShtX2Fkam9pbnQpOworCisgICAgICBzdmQubV93b3JrTWF0cml4ID0gbV9xci5tYXRyaXhRUigpLmJsb2NrKDAsMCxtYXRyaXgucm93cygpLG1hdHJpeC5yb3dzKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLmFkam9pbnQoKTsKKyAgICAgIGlmKHN2ZC5tX2NvbXB1dGVGdWxsVikgbV9xci5ob3VzZWhvbGRlclEoKS5ldmFsVG8oc3ZkLm1fbWF0cml4ViwgbV93b3Jrc3BhY2UpOworICAgICAgZWxzZSBpZihzdmQubV9jb21wdXRlVGhpblYpCisgICAgICB7CisgICAgICAgIHN2ZC5tX21hdHJpeFYuc2V0SWRlbnRpdHkobWF0cml4LmNvbHMoKSwgbWF0cml4LnJvd3MoKSk7CisgICAgICAgIG1fcXIuaG91c2Vob2xkZXJRKCkuYXBwbHlUaGlzT25UaGVMZWZ0KHN2ZC5tX21hdHJpeFYsIG1fd29ya3NwYWNlKTsKKyAgICAgIH0KKyAgICAgIGlmKHN2ZC5jb21wdXRlVSgpKSBzdmQubV9tYXRyaXhVID0gbV9xci5jb2xzUGVybXV0YXRpb24oKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbHNlIHJldHVybiBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICBDb2xQaXZIb3VzZWhvbGRlclFSPFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlcj4gbV9xcjsKKyAgVHJhbnNwb3NlVHlwZVdpdGhTYW1lU3RvcmFnZU9yZGVyIG1fYWRqb2ludDsKKyAgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX3Jvd190eXBlPE1hdHJpeFR5cGU+Ojp0eXBlIG1fd29ya3NwYWNlOworfTsKKworLyoqKiBwcmVjb25kaXRpb25lciB1c2luZyBIb3VzZWhvbGRlclFSICoqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIHFyX3ByZWNvbmRpdGlvbmVyX2ltcGw8TWF0cml4VHlwZSwgSG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyLCBQcmVjb25kaXRpb25JZk1vcmVSb3dzVGhhbkNvbHMsIHRydWU+Cit7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgdm9pZCBhbGxvY2F0ZShjb25zdCBKYWNvYmlTVkQ8TWF0cml4VHlwZSwgSG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyPiYgc3ZkKQorICB7CisgICAgaWYgKHN2ZC5yb3dzKCkgIT0gbV9xci5yb3dzKCkgfHwgc3ZkLmNvbHMoKSAhPSBtX3FyLmNvbHMoKSkKKyAgICB7CisgICAgICBtX3FyID0gSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPihzdmQucm93cygpLCBzdmQuY29scygpKTsKKyAgICB9CisgICAgaWYgKHN2ZC5tX2NvbXB1dGVGdWxsVSkgbV93b3Jrc3BhY2UucmVzaXplKHN2ZC5yb3dzKCkpOworICAgIGVsc2UgaWYgKHN2ZC5tX2NvbXB1dGVUaGluVSkgbV93b3Jrc3BhY2UucmVzaXplKHN2ZC5jb2xzKCkpOworICB9CisKKyAgYm9vbCBydW4oSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIEhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4mIHN2ZCwgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICB7CisgICAgaWYobWF0cml4LnJvd3MoKSA+IG1hdHJpeC5jb2xzKCkpCisgICAgeworICAgICAgbV9xci5jb21wdXRlKG1hdHJpeCk7CisgICAgICBzdmQubV93b3JrTWF0cml4ID0gbV9xci5tYXRyaXhRUigpLmJsb2NrKDAsMCxtYXRyaXguY29scygpLG1hdHJpeC5jb2xzKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICAgICAgaWYoc3ZkLm1fY29tcHV0ZUZ1bGxVKSBtX3FyLmhvdXNlaG9sZGVyUSgpLmV2YWxUbyhzdmQubV9tYXRyaXhVLCBtX3dvcmtzcGFjZSk7CisgICAgICBlbHNlIGlmKHN2ZC5tX2NvbXB1dGVUaGluVSkKKyAgICAgIHsKKyAgICAgICAgc3ZkLm1fbWF0cml4VS5zZXRJZGVudGl0eShtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKTsKKyAgICAgICAgbV9xci5ob3VzZWhvbGRlclEoKS5hcHBseVRoaXNPblRoZUxlZnQoc3ZkLm1fbWF0cml4VSwgbV93b3Jrc3BhY2UpOworICAgICAgfQorICAgICAgaWYoc3ZkLmNvbXB1dGVWKCkpIHN2ZC5tX21hdHJpeFYuc2V0SWRlbnRpdHkobWF0cml4LmNvbHMoKSwgbWF0cml4LmNvbHMoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Citwcml2YXRlOgorICBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IG1fcXI7CisgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9jb2xfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBtX3dvcmtzcGFjZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBxcl9wcmVjb25kaXRpb25lcl9pbXBsPE1hdHJpeFR5cGUsIEhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lciwgUHJlY29uZGl0aW9uSWZNb3JlQ29sc1RoYW5Sb3dzLCB0cnVlPgoreworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGVudW0KKyAgeworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMKKyAgfTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBSb3dzQXRDb21waWxlVGltZSwgT3B0aW9ucywgTWF4Q29sc0F0Q29tcGlsZVRpbWUsIE1heFJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgICAgIFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlcjsKKworICB2b2lkIGFsbG9jYXRlKGNvbnN0IEphY29iaVNWRDxNYXRyaXhUeXBlLCBIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBzdmQpCisgIHsKKyAgICBpZiAoc3ZkLmNvbHMoKSAhPSBtX3FyLnJvd3MoKSB8fCBzdmQucm93cygpICE9IG1fcXIuY29scygpKQorICAgIHsKKyAgICAgIG1fcXIgPSBIb3VzZWhvbGRlclFSPFRyYW5zcG9zZVR5cGVXaXRoU2FtZVN0b3JhZ2VPcmRlcj4oc3ZkLmNvbHMoKSwgc3ZkLnJvd3MoKSk7CisgICAgfQorICAgIGlmIChzdmQubV9jb21wdXRlRnVsbFYpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQuY29scygpKTsKKyAgICBlbHNlIGlmIChzdmQubV9jb21wdXRlVGhpblYpIG1fd29ya3NwYWNlLnJlc2l6ZShzdmQucm93cygpKTsKKyAgICBtX2Fkam9pbnQucmVzaXplKHN2ZC5jb2xzKCksIHN2ZC5yb3dzKCkpOworICB9CisKKyAgYm9vbCBydW4oSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIEhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4mIHN2ZCwgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICB7CisgICAgaWYobWF0cml4LmNvbHMoKSA+IG1hdHJpeC5yb3dzKCkpCisgICAgeworICAgICAgbV9hZGpvaW50ID0gbWF0cml4LmFkam9pbnQoKTsKKyAgICAgIG1fcXIuY29tcHV0ZShtX2Fkam9pbnQpOworCisgICAgICBzdmQubV93b3JrTWF0cml4ID0gbV9xci5tYXRyaXhRUigpLmJsb2NrKDAsMCxtYXRyaXgucm93cygpLG1hdHJpeC5yb3dzKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLmFkam9pbnQoKTsKKyAgICAgIGlmKHN2ZC5tX2NvbXB1dGVGdWxsVikgbV9xci5ob3VzZWhvbGRlclEoKS5ldmFsVG8oc3ZkLm1fbWF0cml4ViwgbV93b3Jrc3BhY2UpOworICAgICAgZWxzZSBpZihzdmQubV9jb21wdXRlVGhpblYpCisgICAgICB7CisgICAgICAgIHN2ZC5tX21hdHJpeFYuc2V0SWRlbnRpdHkobWF0cml4LmNvbHMoKSwgbWF0cml4LnJvd3MoKSk7CisgICAgICAgIG1fcXIuaG91c2Vob2xkZXJRKCkuYXBwbHlUaGlzT25UaGVMZWZ0KHN2ZC5tX21hdHJpeFYsIG1fd29ya3NwYWNlKTsKKyAgICAgIH0KKyAgICAgIGlmKHN2ZC5jb21wdXRlVSgpKSBzdmQubV9tYXRyaXhVLnNldElkZW50aXR5KG1hdHJpeC5yb3dzKCksIG1hdHJpeC5yb3dzKCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVsc2UgcmV0dXJuIGZhbHNlOworICB9CisKK3ByaXZhdGU6CisgIEhvdXNlaG9sZGVyUVI8VHJhbnNwb3NlVHlwZVdpdGhTYW1lU3RvcmFnZU9yZGVyPiBtX3FyOworICBUcmFuc3Bvc2VUeXBlV2l0aFNhbWVTdG9yYWdlT3JkZXIgbV9hZGpvaW50OworICB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZT46OnR5cGUgbV93b3Jrc3BhY2U7Cit9OworCisvKioqIDJ4MiBTVkQgaW1wbGVtZW50YXRpb24KKyAqKioKKyAqKiogSmFjb2JpU1ZEIGNvbnNpc3RzIGluIHBlcmZvcm1pbmcgYSBzZXJpZXMgb2YgMngyIFNWRCBzdWJwcm9ibGVtcworICoqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXI+CitzdHJ1Y3Qgc3ZkX3ByZWNvbmRpdGlvbl8yeDJfYmxvY2tfdG9fYmVfcmVhbDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyLCBmYWxzZT4KK3sKKyAgdHlwZWRlZiBKYWNvYmlTVkQ8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj4gU1ZEOworICB0eXBlZGVmIHR5cGVuYW1lIFNWRDo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyB2b2lkIHJ1bih0eXBlbmFtZSBTVkQ6OldvcmtNYXRyaXhUeXBlJiwgU1ZEJiwgSW5kZXgsIEluZGV4KSB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXI+CitzdHJ1Y3Qgc3ZkX3ByZWNvbmRpdGlvbl8yeDJfYmxvY2tfdG9fYmVfcmVhbDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyLCB0cnVlPgoreworICB0eXBlZGVmIEphY29iaVNWRDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPiBTVkQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgU1ZEOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIHZvaWQgcnVuKHR5cGVuYW1lIFNWRDo6V29ya01hdHJpeFR5cGUmIHdvcmtfbWF0cml4LCBTVkQmIHN2ZCwgSW5kZXggcCwgSW5kZXggcSkKKyAgeworICAgIFNjYWxhciB6OworICAgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4gcm90OworICAgIFJlYWxTY2FsYXIgbiA9IHNxcnQoYWJzMih3b3JrX21hdHJpeC5jb2VmZihwLHApKSArIGFiczIod29ya19tYXRyaXguY29lZmYocSxwKSkpOworICAgIGlmKG49PTApCisgICAgeworICAgICAgeiA9IGFicyh3b3JrX21hdHJpeC5jb2VmZihwLHEpKSAvIHdvcmtfbWF0cml4LmNvZWZmKHAscSk7CisgICAgICB3b3JrX21hdHJpeC5yb3cocCkgKj0gejsKKyAgICAgIGlmKHN2ZC5jb21wdXRlVSgpKSBzdmQubV9tYXRyaXhVLmNvbChwKSAqPSBjb25qKHopOworICAgICAgeiA9IGFicyh3b3JrX21hdHJpeC5jb2VmZihxLHEpKSAvIHdvcmtfbWF0cml4LmNvZWZmKHEscSk7CisgICAgICB3b3JrX21hdHJpeC5yb3cocSkgKj0gejsKKyAgICAgIGlmKHN2ZC5jb21wdXRlVSgpKSBzdmQubV9tYXRyaXhVLmNvbChxKSAqPSBjb25qKHopOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcm90LmMoKSA9IGNvbmood29ya19tYXRyaXguY29lZmYocCxwKSkgLyBuOworICAgICAgcm90LnMoKSA9IHdvcmtfbWF0cml4LmNvZWZmKHEscCkgLyBuOworICAgICAgd29ya19tYXRyaXguYXBwbHlPblRoZUxlZnQocCxxLHJvdCk7CisgICAgICBpZihzdmQuY29tcHV0ZVUoKSkgc3ZkLm1fbWF0cml4VS5hcHBseU9uVGhlUmlnaHQocCxxLHJvdC5hZGpvaW50KCkpOworICAgICAgaWYod29ya19tYXRyaXguY29lZmYocCxxKSAhPSBTY2FsYXIoMCkpCisgICAgICB7CisgICAgICAgIFNjYWxhciB6ID0gYWJzKHdvcmtfbWF0cml4LmNvZWZmKHAscSkpIC8gd29ya19tYXRyaXguY29lZmYocCxxKTsKKyAgICAgICAgd29ya19tYXRyaXguY29sKHEpICo9IHo7CisgICAgICAgIGlmKHN2ZC5jb21wdXRlVigpKSBzdmQubV9tYXRyaXhWLmNvbChxKSAqPSB6OworICAgICAgfQorICAgICAgaWYod29ya19tYXRyaXguY29lZmYocSxxKSAhPSBTY2FsYXIoMCkpCisgICAgICB7CisgICAgICAgIHogPSBhYnMod29ya19tYXRyaXguY29lZmYocSxxKSkgLyB3b3JrX21hdHJpeC5jb2VmZihxLHEpOworICAgICAgICB3b3JrX21hdHJpeC5yb3cocSkgKj0gejsKKyAgICAgICAgaWYoc3ZkLmNvbXB1dGVVKCkpIHN2ZC5tX21hdHJpeFUuY29sKHEpICo9IGNvbmooeik7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZWFsU2NhbGFyLCB0eXBlbmFtZSBJbmRleD4KK3ZvaWQgcmVhbF8yeDJfamFjb2JpX3N2ZChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIEluZGV4IHAsIEluZGV4IHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFjb2JpUm90YXRpb248UmVhbFNjYWxhcj4gKmpfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYWNvYmlSb3RhdGlvbjxSZWFsU2NhbGFyPiAqal9yaWdodCkKK3sKKyAgTWF0cml4PFJlYWxTY2FsYXIsMiwyPiBtOworICBtIDw8IHJlYWwobWF0cml4LmNvZWZmKHAscCkpLCByZWFsKG1hdHJpeC5jb2VmZihwLHEpKSwKKyAgICAgICByZWFsKG1hdHJpeC5jb2VmZihxLHApKSwgcmVhbChtYXRyaXguY29lZmYocSxxKSk7CisgIEphY29iaVJvdGF0aW9uPFJlYWxTY2FsYXI+IHJvdDE7CisgIFJlYWxTY2FsYXIgdCA9IG0uY29lZmYoMCwwKSArIG0uY29lZmYoMSwxKTsKKyAgUmVhbFNjYWxhciBkID0gbS5jb2VmZigxLDApIC0gbS5jb2VmZigwLDEpOworICBpZih0ID09IFJlYWxTY2FsYXIoMCkpCisgIHsKKyAgICByb3QxLmMoKSA9IFJlYWxTY2FsYXIoMCk7CisgICAgcm90MS5zKCkgPSBkID4gUmVhbFNjYWxhcigwKSA/IFJlYWxTY2FsYXIoMSkgOiBSZWFsU2NhbGFyKC0xKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBSZWFsU2NhbGFyIHUgPSBkIC8gdDsKKyAgICByb3QxLmMoKSA9IFJlYWxTY2FsYXIoMSkgLyBzcXJ0KFJlYWxTY2FsYXIoMSkgKyBhYnMyKHUpKTsKKyAgICByb3QxLnMoKSA9IHJvdDEuYygpICogdTsKKyAgfQorICBtLmFwcGx5T25UaGVMZWZ0KDAsMSxyb3QxKTsKKyAgal9yaWdodC0+bWFrZUphY29iaShtLDAsMSk7CisgICpqX2xlZnQgID0gcm90MSAqIGpfcmlnaHQtPnRyYW5zcG9zZSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLyoqIFxpbmdyb3VwIFNWRF9Nb2R1bGUKKyAgKgorICAqCisgICogXGNsYXNzIEphY29iaVNWRAorICAqCisgICogXGJyaWVmIFR3by1zaWRlZCBKYWNvYmkgU1ZEIGRlY29tcG9zaXRpb24gb2YgYSByZWN0YW5ndWxhciBtYXRyaXgKKyAgKgorICAqIFxwYXJhbSBNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXRyaXggb2Ygd2hpY2ggd2UgYXJlIGNvbXB1dGluZyB0aGUgU1ZEIGRlY29tcG9zaXRpb24KKyAgKiBccGFyYW0gUVJQcmVjb25kaXRpb25lciB0aGlzIG9wdGlvbmFsIHBhcmFtZXRlciBhbGxvd3MgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBRUiBkZWNvbXBvc2l0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGludGVybmFsbHkKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgUi1TVkQgc3RlcCBmb3Igbm9uLXNxdWFyZSBtYXRyaWNlcy4gU2VlIGRpc2N1c3Npb24gb2YgcG9zc2libGUgdmFsdWVzIGJlbG93LgorICAqCisgICogU1ZEIGRlY29tcG9zaXRpb24gY29uc2lzdHMgaW4gZGVjb21wb3NpbmcgYW55IG4tYnktcCBtYXRyaXggXGEgQSBhcyBhIHByb2R1Y3QKKyAgKiAgIFxmWyBBID0gVSBTIFZeKiBcZl0KKyAgKiB3aGVyZSBcYSBVIGlzIGEgbi1ieS1uIHVuaXRhcnksIFxhIFYgaXMgYSBwLWJ5LXAgdW5pdGFyeSwgYW5kIFxhIFMgaXMgYSBuLWJ5LXAgcmVhbCBwb3NpdGl2ZSBtYXRyaXggd2hpY2ggaXMgemVybyBvdXRzaWRlIG9mIGl0cyBtYWluIGRpYWdvbmFsOworICAqIHRoZSBkaWFnb25hbCBlbnRyaWVzIG9mIFMgYXJlIGtub3duIGFzIHRoZSBcZW0gc2luZ3VsYXIgXGVtIHZhbHVlcyBvZiBcYSBBIGFuZCB0aGUgY29sdW1ucyBvZiBcYSBVIGFuZCBcYSBWIGFyZSBrbm93biBhcyB0aGUgbGVmdAorICAqIGFuZCByaWdodCBcZW0gc2luZ3VsYXIgXGVtIHZlY3RvcnMgb2YgXGEgQSByZXNwZWN0aXZlbHkuCisgICoKKyAgKiBTaW5ndWxhciB2YWx1ZXMgYXJlIGFsd2F5cyBzb3J0ZWQgaW4gZGVjcmVhc2luZyBvcmRlci4KKyAgKgorICAqIFRoaXMgSmFjb2JpU1ZEIGRlY29tcG9zaXRpb24gY29tcHV0ZXMgb25seSB0aGUgc2luZ3VsYXIgdmFsdWVzIGJ5IGRlZmF1bHQuIElmIHlvdSB3YW50IFxhIFUgb3IgXGEgViwgeW91IG5lZWQgdG8gYXNrIGZvciB0aGVtIGV4cGxpY2l0bHkuCisgICoKKyAgKiBZb3UgY2FuIGFzayBmb3Igb25seSBcZW0gdGhpbiBcYSBVIG9yIFxhIFYgdG8gYmUgY29tcHV0ZWQsIG1lYW5pbmcgdGhlIGZvbGxvd2luZy4gSW4gY2FzZSBvZiBhIHJlY3Rhbmd1bGFyIG4tYnktcCBtYXRyaXgsIGxldHRpbmcgXGEgbSBiZSB0aGUKKyAgKiBzbWFsbGVyIHZhbHVlIGFtb25nIFxhIG4gYW5kIFxhIHAsIHRoZXJlIGFyZSBvbmx5IFxhIG0gc2luZ3VsYXIgdmVjdG9yczsgdGhlIHJlbWFpbmluZyBjb2x1bW5zIG9mIFxhIFUgYW5kIFxhIFYgZG8gbm90IGNvcnJlc3BvbmQgdG8gYWN0dWFsCisgICogc2luZ3VsYXIgdmVjdG9ycy4gQXNraW5nIGZvciBcZW0gdGhpbiBcYSBVIG9yIFxhIFYgbWVhbnMgYXNraW5nIGZvciBvbmx5IHRoZWlyIFxhIG0gZmlyc3QgY29sdW1ucyB0byBiZSBmb3JtZWQuIFNvIFxhIFUgaXMgdGhlbiBhIG4tYnktbSBtYXRyaXgsCisgICogYW5kIFxhIFYgaXMgdGhlbiBhIHAtYnktbSBtYXRyaXguIE5vdGljZSB0aGF0IHRoaW4gXGEgVSBhbmQgXGEgViBhcmUgYWxsIHlvdSBuZWVkIGZvciAobGVhc3Qgc3F1YXJlcykgc29sdmluZy4KKyAgKgorICAqIEhlcmUncyBhbiBleGFtcGxlIGRlbW9uc3RyYXRpbmcgYmFzaWMgdXNhZ2U6CisgICogXGluY2x1ZGUgSmFjb2JpU1ZEX2Jhc2ljLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEphY29iaVNWRF9iYXNpYy5vdXQKKyAgKgorICAqIFRoaXMgSmFjb2JpU1ZEIGNsYXNzIGlzIGEgdHdvLXNpZGVkIEphY29iaSBSLVNWRCBkZWNvbXBvc2l0aW9uLCBlbnN1cmluZyBvcHRpbWFsIHJlbGlhYmlsaXR5IGFuZCBhY2N1cmFjeS4gVGhlIGRvd25zaWRlIGlzIHRoYXQgaXQncyBzbG93ZXIgdGhhbgorICAqIGJpZGlhZ29uYWxpemluZyBTVkQgYWxnb3JpdGhtcyBmb3IgbGFyZ2Ugc3F1YXJlIG1hdHJpY2VzOyBob3dldmVyIGl0cyBjb21wbGV4aXR5IGlzIHN0aWxsIFxmJCBPKG5eMnApIFxmJCB3aGVyZSBcYSBuIGlzIHRoZSBzbWFsbGVyIGRpbWVuc2lvbiBhbmQKKyAgKiBcYSBwIGlzIHRoZSBncmVhdGVyIGRpbWVuc2lvbiwgbWVhbmluZyB0aGF0IGl0IGlzIHN0aWxsIG9mIHRoZSBzYW1lIG9yZGVyIG9mIGNvbXBsZXhpdHkgYXMgdGhlIGZhc3RlciBiaWRpYWdvbmFsaXppbmcgUi1TVkQgYWxnb3JpdGhtcy4KKyAgKiBJbiBwYXJ0aWN1bGFyLCBsaWtlIGFueSBSLVNWRCwgaXQgdGFrZXMgYWR2YW50YWdlIG9mIG5vbi1zcXVhcmVuZXNzIGluIHRoYXQgaXRzIGNvbXBsZXhpdHkgaXMgb25seSBsaW5lYXIgaW4gdGhlIGdyZWF0ZXIgZGltZW5zaW9uLgorICAqCisgICogSWYgdGhlIGlucHV0IG1hdHJpeCBoYXMgaW5mIG9yIG5hbiBjb2VmZmljaWVudHMsIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uIGlzIHVuZGVmaW5lZCwgYnV0IHRoZSBjb21wdXRhdGlvbiBpcyBndWFyYW50ZWVkIHRvCisgICogdGVybWluYXRlIGluIGZpbml0ZSAoYW5kIHJlYXNvbmFibGUpIHRpbWUuCisgICoKKyAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGZvciBRUlByZWNvbmRpdGlvbmVyIGFyZToKKyAgKiBcbGkgQ29sUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyIGlzIHRoZSBkZWZhdWx0LiBJbiBwcmFjdGljZSBpdCdzIHZlcnkgc2FmZS4gSXQgdXNlcyBjb2x1bW4tcGl2b3RpbmcgUVIuCisgICogXGxpIEZ1bGxQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXIsIGlzIHRoZSBzYWZlc3QgYW5kIHNsb3dlc3QuIEl0IHVzZXMgZnVsbC1waXZvdGluZyBRUi4KKyAgKiAgICAgQ29udHJhcnkgdG8gb3RoZXIgUVJzLCBpdCBkb2Vzbid0IGFsbG93IGNvbXB1dGluZyB0aGluIHVuaXRhcmllcy4KKyAgKiBcbGkgSG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyIGlzIHRoZSBmYXN0ZXN0LCBhbmQgbGVzcyBzYWZlIGFuZCBhY2N1cmF0ZSB0aGFuIHRoZSBwaXZvdGluZyB2YXJpYW50cy4gSXQgdXNlcyBub24tcGl2b3RpbmcgUVIuCisgICogICAgIFRoaXMgaXMgdmVyeSBzaW1pbGFyIGluIHNhZmV0eSBhbmQgYWNjdXJhY3kgdG8gdGhlIGJpZGlhZ29uYWxpemF0aW9uIHByb2Nlc3MgdXNlZCBieSBiaWRpYWdvbmFsaXppbmcgU1ZEIGFsZ29yaXRobXMgKHNpbmNlIGJpZGlhZ29uYWxpemF0aW9uCisgICogICAgIGlzIGluaGVyZW50bHkgbm9uLXBpdm90aW5nKS4gSG93ZXZlciB0aGUgcmVzdWx0aW5nIFNWRCBpcyBzdGlsbCBtb3JlIHJlbGlhYmxlIHRoYW4gYmlkaWFnb25hbGl6aW5nIFNWRHMgYmVjYXVzZSB0aGUgSmFjb2JpLWJhc2VkIGl0ZXJhcml2ZQorICAqICAgICBwcm9jZXNzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgb3B0aW1pemVkIGJpZGlhZ29uYWwgU1ZEIGl0ZXJhdGlvbnMuCisgICogXGxpIE5vUVJQcmVjb25kaXRpb25lciBhbGxvd3Mgbm90IHRvIHVzZSBhIFFSIHByZWNvbmRpdGlvbmVyIGF0IGFsbC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGtub3cgdGhhdCB5b3Ugd2lsbCBvbmx5IGJlIGNvbXB1dGluZworICAqICAgICBKYWNvYmlTVkQgZGVjb21wb3NpdGlvbnMgb2Ygc3F1YXJlIG1hdHJpY2VzLiBOb24tc3F1YXJlIG1hdHJpY2VzIHJlcXVpcmUgYSBRUiBwcmVjb25kaXRpb25lci4gVXNpbmcgdGhpcyBvcHRpb24gd2lsbCByZXN1bHQgaW4KKyAgKiAgICAgZmFzdGVyIGNvbXBpbGF0aW9uIGFuZCBzbWFsbGVyIGV4ZWN1dGFibGUgY29kZS4gSXQgd29uJ3Qgc2lnbmlmaWNhbnRseSBzcGVlZCB1cCBjb21wdXRhdGlvbiwgc2luY2UgSmFjb2JpU1ZEIGlzIGFsd2F5cyBjaGVja2luZworICAqICAgICBpZiBRUiBwcmVjb25kaXRpb25pbmcgaXMgbmVlZGVkIGJlZm9yZSBhcHBseWluZyBpdCBhbnl3YXkuCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6amFjb2JpU3ZkKCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgUVJQcmVjb25kaXRpb25lcj4gY2xhc3MgSmFjb2JpU1ZECit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgZW51bSB7CisgICAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgIERpYWdTaXplQXRDb21waWxlVGltZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9EWU5BTUlDKFJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgICAgTWF4RGlhZ1NpemVBdENvbXBpbGVUaW1lID0gRUlHRU5fU0laRV9NSU5fUFJFRkVSX0ZJWEVEKE1heFJvd3NBdENvbXBpbGVUaW1lLE1heENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICAgIE1hdHJpeE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zCisgICAgfTsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgIE1hdHJpeE9wdGlvbnMsIE1heFJvd3NBdENvbXBpbGVUaW1lLCBNYXhSb3dzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgIE1hdHJpeFVUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgIE1hdHJpeE9wdGlvbnMsIE1heENvbHNBdENvbXBpbGVUaW1lLCBNYXhDb2xzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgIE1hdHJpeFZUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX2RpYWdfdHlwZTxNYXRyaXhUeXBlLCBSZWFsU2NhbGFyPjo6dHlwZSBTaW5ndWxhclZhbHVlc1R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8TWF0cml4VHlwZT46OnR5cGUgUm93VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9jb2xfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBDb2xUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGlhZ1NpemVBdENvbXBpbGVUaW1lLCBEaWFnU2l6ZUF0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgTWF0cml4T3B0aW9ucywgTWF4RGlhZ1NpemVBdENvbXBpbGVUaW1lLCBNYXhEaWFnU2l6ZUF0Q29tcGlsZVRpbWU+CisgICAgICAgICAgICBXb3JrTWF0cml4VHlwZTsKKworICAgIC8qKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgdXNlZnVsIGluIGNhc2VzIGluIHdoaWNoIHRoZSB1c2VyIGludGVuZHMgdG8KKyAgICAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgSmFjb2JpU1ZEOjpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmKS4KKyAgICAgICovCisgICAgSmFjb2JpU1ZEKCkKKyAgICAgIDogbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV9pc0FsbG9jYXRlZChmYWxzZSksCisgICAgICAgIG1fY29tcHV0YXRpb25PcHRpb25zKDApLAorICAgICAgICBtX3Jvd3MoLTEpLCBtX2NvbHMoLTEpCisgICAge30KKworCisgICAgLyoqIFxicmllZiBEZWZhdWx0IENvbnN0cnVjdG9yIHdpdGggbWVtb3J5IHByZWFsbG9jYXRpb24KKyAgICAgICoKKyAgICAgICogTGlrZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBidXQgd2l0aCBwcmVhbGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBkYXRhCisgICAgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHByb2JsZW0gc2l6ZS4KKyAgICAgICogXHNhIEphY29iaVNWRCgpCisgICAgICAqLworICAgIEphY29iaVNWRChJbmRleCByb3dzLCBJbmRleCBjb2xzLCB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zID0gMCkKKyAgICAgIDogbV9pc0luaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgbV9pc0FsbG9jYXRlZChmYWxzZSksCisgICAgICAgIG1fY29tcHV0YXRpb25PcHRpb25zKDApLAorICAgICAgICBtX3Jvd3MoLTEpLCBtX2NvbHMoLTEpCisgICAgeworICAgICAgYWxsb2NhdGUocm93cywgY29scywgY29tcHV0YXRpb25PcHRpb25zKTsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yIHBlcmZvcm1pbmcgdGhlIGRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4LgorICAgICAqCisgICAgICogXHBhcmFtIG1hdHJpeCB0aGUgbWF0cml4IHRvIGRlY29tcG9zZQorICAgICAqIFxwYXJhbSBjb21wdXRhdGlvbk9wdGlvbnMgb3B0aW9uYWwgcGFyYW1ldGVyIGFsbG93aW5nIHRvIHNwZWNpZnkgaWYgeW91IHdhbnQgZnVsbCBvciB0aGluIFUgb3IgViB1bml0YXJpZXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCBub25lIGlzIGNvbXB1dGVkLiBUaGlzIGlzIGEgYml0LWZpZWxkLCB0aGUgcG9zc2libGUgYml0cyBhcmUgI0NvbXB1dGVGdWxsVSwgI0NvbXB1dGVUaGluVSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICNDb21wdXRlRnVsbFYsICNDb21wdXRlVGhpblYuCisgICAgICoKKyAgICAgKiBUaGluIHVuaXRhcmllcyBhcmUgb25seSBhdmFpbGFibGUgaWYgeW91ciBtYXRyaXggdHlwZSBoYXMgYSBEeW5hbWljIG51bWJlciBvZiBjb2x1bW5zIChmb3IgZXhhbXBsZSBNYXRyaXhYZikuIFRoZXkgYWxzbyBhcmUgbm90CisgICAgICogYXZhaWxhYmxlIHdpdGggdGhlIChub24tZGVmYXVsdCkgRnVsbFBpdkhvdXNlaG9sZGVyUVIgcHJlY29uZGl0aW9uZXIuCisgICAgICovCisgICAgSmFjb2JpU1ZEKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgdW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucyA9IDApCisgICAgICA6IG1faXNJbml0aWFsaXplZChmYWxzZSksCisgICAgICAgIG1faXNBbGxvY2F0ZWQoZmFsc2UpLAorICAgICAgICBtX2NvbXB1dGF0aW9uT3B0aW9ucygwKSwKKyAgICAgICAgbV9yb3dzKC0xKSwgbV9jb2xzKC0xKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4LCBjb21wdXRhdGlvbk9wdGlvbnMpOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgTWV0aG9kIHBlcmZvcm1pbmcgdGhlIGRlY29tcG9zaXRpb24gb2YgZ2l2ZW4gbWF0cml4IHVzaW5nIGN1c3RvbSBvcHRpb25zLgorICAgICAqCisgICAgICogXHBhcmFtIG1hdHJpeCB0aGUgbWF0cml4IHRvIGRlY29tcG9zZQorICAgICAqIFxwYXJhbSBjb21wdXRhdGlvbk9wdGlvbnMgb3B0aW9uYWwgcGFyYW1ldGVyIGFsbG93aW5nIHRvIHNwZWNpZnkgaWYgeW91IHdhbnQgZnVsbCBvciB0aGluIFUgb3IgViB1bml0YXJpZXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCBub25lIGlzIGNvbXB1dGVkLiBUaGlzIGlzIGEgYml0LWZpZWxkLCB0aGUgcG9zc2libGUgYml0cyBhcmUgI0NvbXB1dGVGdWxsVSwgI0NvbXB1dGVUaGluVSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICNDb21wdXRlRnVsbFYsICNDb21wdXRlVGhpblYuCisgICAgICoKKyAgICAgKiBUaGluIHVuaXRhcmllcyBhcmUgb25seSBhdmFpbGFibGUgaWYgeW91ciBtYXRyaXggdHlwZSBoYXMgYSBEeW5hbWljIG51bWJlciBvZiBjb2x1bW5zIChmb3IgZXhhbXBsZSBNYXRyaXhYZikuIFRoZXkgYWxzbyBhcmUgbm90CisgICAgICogYXZhaWxhYmxlIHdpdGggdGhlIChub24tZGVmYXVsdCkgRnVsbFBpdkhvdXNlaG9sZGVyUVIgcHJlY29uZGl0aW9uZXIuCisgICAgICovCisgICAgSmFjb2JpU1ZEJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgdW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucyk7CisKKyAgICAvKiogXGJyaWVmIE1ldGhvZCBwZXJmb3JtaW5nIHRoZSBkZWNvbXBvc2l0aW9uIG9mIGdpdmVuIG1hdHJpeCB1c2luZyBjdXJyZW50IG9wdGlvbnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWF0cml4IHRoZSBtYXRyaXggdG8gZGVjb21wb3NlCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBjdXJyZW50IFxhIGNvbXB1dGF0aW9uT3B0aW9ucywgYXMgYWxyZWFkeSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9yIHRvIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYsIHVuc2lnbmVkIGludCkuCisgICAgICovCisgICAgSmFjb2JpU1ZEJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICByZXR1cm4gY29tcHV0ZShtYXRyaXgsIG1fY29tcHV0YXRpb25PcHRpb25zKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIFxhIFUgbWF0cml4LgorICAgICAqCisgICAgICogRm9yIHRoZSBTVkQgZGVjb21wb3NpdGlvbiBvZiBhIG4tYnktcCBtYXRyaXgsIGxldHRpbmcgXGEgbSBiZSB0aGUgbWluaW11bSBvZiBcYSBuIGFuZCBcYSBwLAorICAgICAqIHRoZSBVIG1hdHJpeCBpcyBuLWJ5LW4gaWYgeW91IGFza2VkIGZvciAjQ29tcHV0ZUZ1bGxVLCBhbmQgaXMgbi1ieS1tIGlmIHlvdSBhc2tlZCBmb3IgI0NvbXB1dGVUaGluVS4KKyAgICAgKgorICAgICAqIFRoZSBcYSBtIGZpcnN0IGNvbHVtbnMgb2YgXGEgVSBhcmUgdGhlIGxlZnQgc2luZ3VsYXIgdmVjdG9ycyBvZiB0aGUgbWF0cml4IGJlaW5nIGRlY29tcG9zZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhc3NlcnRzIHRoYXQgeW91IGFza2VkIGZvciBcYSBVIHRvIGJlIGNvbXB1dGVkLgorICAgICAqLworICAgIGNvbnN0IE1hdHJpeFVUeXBlJiBtYXRyaXhVKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJKYWNvYmlTVkQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KGNvbXB1dGVVKCkgJiYgIlRoaXMgSmFjb2JpU1ZEIGRlY29tcG9zaXRpb24gZGlkbid0IGNvbXB1dGUgVS4gRGlkIHlvdSBhc2sgZm9yIGl0PyIpOworICAgICAgcmV0dXJuIG1fbWF0cml4VTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIFxhIFYgbWF0cml4LgorICAgICAqCisgICAgICogRm9yIHRoZSBTVkQgZGVjb21wb3NpdGlvbiBvZiBhIG4tYnktcCBtYXRyaXgsIGxldHRpbmcgXGEgbSBiZSB0aGUgbWluaW11bSBvZiBcYSBuIGFuZCBcYSBwLAorICAgICAqIHRoZSBWIG1hdHJpeCBpcyBwLWJ5LXAgaWYgeW91IGFza2VkIGZvciAjQ29tcHV0ZUZ1bGxWLCBhbmQgaXMgcC1ieS1tIGlmIHlvdSBhc2tlZCBmb3IgQ29tcHV0ZVRoaW5WLgorICAgICAqCisgICAgICogVGhlIFxhIG0gZmlyc3QgY29sdW1ucyBvZiBcYSBWIGFyZSB0aGUgcmlnaHQgc2luZ3VsYXIgdmVjdG9ycyBvZiB0aGUgbWF0cml4IGJlaW5nIGRlY29tcG9zZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhc3NlcnRzIHRoYXQgeW91IGFza2VkIGZvciBcYSBWIHRvIGJlIGNvbXB1dGVkLgorICAgICAqLworICAgIGNvbnN0IE1hdHJpeFZUeXBlJiBtYXRyaXhWKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJKYWNvYmlTVkQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KGNvbXB1dGVWKCkgJiYgIlRoaXMgSmFjb2JpU1ZEIGRlY29tcG9zaXRpb24gZGlkbid0IGNvbXB1dGUgVi4gRGlkIHlvdSBhc2sgZm9yIGl0PyIpOworICAgICAgcmV0dXJuIG1fbWF0cml4VjsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIHZlY3RvciBvZiBzaW5ndWxhciB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBGb3IgdGhlIFNWRCBkZWNvbXBvc2l0aW9uIG9mIGEgbi1ieS1wIG1hdHJpeCwgbGV0dGluZyBcYSBtIGJlIHRoZSBtaW5pbXVtIG9mIFxhIG4gYW5kIFxhIHAsIHRoZQorICAgICAqIHJldHVybmVkIHZlY3RvciBoYXMgc2l6ZSBcYSBtLiAgU2luZ3VsYXIgdmFsdWVzIGFyZSBhbHdheXMgc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIuCisgICAgICovCisgICAgY29uc3QgU2luZ3VsYXJWYWx1ZXNUeXBlJiBzaW5ndWxhclZhbHVlcygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiSmFjb2JpU1ZEIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX3Npbmd1bGFyVmFsdWVzOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIFxhIFUgKGZ1bGwgb3IgdGhpbikgaXMgYXNrZWQgZm9yIGluIHRoaXMgU1ZEIGRlY29tcG9zaXRpb24gKi8KKyAgICBpbmxpbmUgYm9vbCBjb21wdXRlVSgpIGNvbnN0IHsgcmV0dXJuIG1fY29tcHV0ZUZ1bGxVIHx8IG1fY29tcHV0ZVRoaW5VOyB9CisgICAgLyoqIFxyZXR1cm5zIHRydWUgaWYgXGEgViAoZnVsbCBvciB0aGluKSBpcyBhc2tlZCBmb3IgaW4gdGhpcyBTVkQgZGVjb21wb3NpdGlvbiAqLworICAgIGlubGluZSBib29sIGNvbXB1dGVWKCkgY29uc3QgeyByZXR1cm4gbV9jb21wdXRlRnVsbFYgfHwgbV9jb21wdXRlVGhpblY7IH0KKworICAgIC8qKiBccmV0dXJucyBhIChsZWFzdCBzcXVhcmVzKSBzb2x1dGlvbiBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgU1ZEIGRlY29tcG9zaXRpb24gb2YgQS4KKyAgICAgICoKKyAgICAgICogXHBhcmFtIGIgdGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiB0aGUgZXF1YXRpb24gdG8gc29sdmUuCisgICAgICAqCisgICAgICAqIFxub3RlIFNvbHZpbmcgcmVxdWlyZXMgYm90aCBVIGFuZCBWIHRvIGJlIGNvbXB1dGVkLiBUaGluIFUgYW5kIFYgYXJlIGVub3VnaCwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgZnVsbCBVIG9yIFYuCisgICAgICAqCisgICAgICAqIFxub3RlIFNWRCBzb2x2aW5nIGlzIGltcGxpY2l0bHkgbGVhc3Qtc3F1YXJlcy4gVGh1cywgdGhpcyBtZXRob2Qgc2VydmVzIGJvdGggcHVycG9zZXMgb2YgZXhhY3Qgc29sdmluZyBhbmQgbGVhc3Qtc3F1YXJlcyBzb2x2aW5nLgorICAgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIHJldHVybmVkIHNvbHV0aW9uIGlzIGd1YXJhbnRlZWQgdG8gbWluaW1pemUgdGhlIEV1Y2xpZGVhbiBub3JtIFxmJCBcVmVydCBBIHggLSBiIFxWZXJ0IFxmJC4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPEphY29iaVNWRCwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJKYWNvYmlTVkQgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KGNvbXB1dGVVKCkgJiYgY29tcHV0ZVYoKSAmJiAiSmFjb2JpU1ZEOjpzb2x2ZSgpIHJlcXVpcmVzIGJvdGggdW5pdGFyaWVzIFUgYW5kIFYgdG8gYmUgY29tcHV0ZWQgKHRoaW4gdW5pdGFyaWVzIHN1ZmZpY2UpLiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8SmFjb2JpU1ZELCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2luZ3VsYXIgdmFsdWVzIHRoYXQgYXJlIG5vdCBleGFjdGx5IDAgKi8KKyAgICBJbmRleCBub256ZXJvU2luZ3VsYXJWYWx1ZXMoKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIkphY29iaVNWRCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9ub256ZXJvU2luZ3VsYXJWYWx1ZXM7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29sczsgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCBhbGxvY2F0ZShJbmRleCByb3dzLCBJbmRleCBjb2xzLCB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zKTsKKworICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VVR5cGUgbV9tYXRyaXhVOworICAgIE1hdHJpeFZUeXBlIG1fbWF0cml4VjsKKyAgICBTaW5ndWxhclZhbHVlc1R5cGUgbV9zaW5ndWxhclZhbHVlczsKKyAgICBXb3JrTWF0cml4VHlwZSBtX3dvcmtNYXRyaXg7CisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQsIG1faXNBbGxvY2F0ZWQ7CisgICAgYm9vbCBtX2NvbXB1dGVGdWxsVSwgbV9jb21wdXRlVGhpblU7CisgICAgYm9vbCBtX2NvbXB1dGVGdWxsViwgbV9jb21wdXRlVGhpblY7CisgICAgdW5zaWduZWQgaW50IG1fY29tcHV0YXRpb25PcHRpb25zOworICAgIEluZGV4IG1fbm9uemVyb1Npbmd1bGFyVmFsdWVzLCBtX3Jvd3MsIG1fY29scywgbV9kaWFnU2l6ZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9fTWF0cml4VHlwZSwgaW50IF9RUlByZWNvbmRpdGlvbmVyLCBib29sIF9Jc0NvbXBsZXg+CisgICAgZnJpZW5kIHN0cnVjdCBpbnRlcm5hbDo6c3ZkX3ByZWNvbmRpdGlvbl8yeDJfYmxvY2tfdG9fYmVfcmVhbDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX01hdHJpeFR5cGUsIGludCBfUVJQcmVjb25kaXRpb25lciwgaW50IF9DYXNlLCBib29sIF9Eb0FueXRoaW5nPgorICAgIGZyaWVuZCBzdHJ1Y3QgaW50ZXJuYWw6OnFyX3ByZWNvbmRpdGlvbmVyX2ltcGw7CisKKyAgICBpbnRlcm5hbDo6cXJfcHJlY29uZGl0aW9uZXJfaW1wbDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyLCBpbnRlcm5hbDo6UHJlY29uZGl0aW9uSWZNb3JlQ29sc1RoYW5Sb3dzPiBtX3FyX3ByZWNvbmRfbW9yZWNvbHM7CisgICAgaW50ZXJuYWw6OnFyX3ByZWNvbmRpdGlvbmVyX2ltcGw8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lciwgaW50ZXJuYWw6OlByZWNvbmRpdGlvbklmTW9yZVJvd3NUaGFuQ29scz4gbV9xcl9wcmVjb25kX21vcmVyb3dzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXI+Cit2b2lkIEphY29iaVNWRDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPjo6YWxsb2NhdGUoSW5kZXggcm93cywgSW5kZXggY29scywgdW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucykKK3sKKyAgZWlnZW5fYXNzZXJ0KHJvd3MgPj0gMCAmJiBjb2xzID49IDApOworCisgIGlmIChtX2lzQWxsb2NhdGVkICYmCisgICAgICByb3dzID09IG1fcm93cyAmJgorICAgICAgY29scyA9PSBtX2NvbHMgJiYKKyAgICAgIGNvbXB1dGF0aW9uT3B0aW9ucyA9PSBtX2NvbXB1dGF0aW9uT3B0aW9ucykKKyAgeworICAgIHJldHVybjsKKyAgfQorCisgIG1fcm93cyA9IHJvd3M7CisgIG1fY29scyA9IGNvbHM7CisgIG1faXNJbml0aWFsaXplZCA9IGZhbHNlOworICBtX2lzQWxsb2NhdGVkID0gdHJ1ZTsKKyAgbV9jb21wdXRhdGlvbk9wdGlvbnMgPSBjb21wdXRhdGlvbk9wdGlvbnM7CisgIG1fY29tcHV0ZUZ1bGxVID0gKGNvbXB1dGF0aW9uT3B0aW9ucyAmIENvbXB1dGVGdWxsVSkgIT0gMDsKKyAgbV9jb21wdXRlVGhpblUgPSAoY29tcHV0YXRpb25PcHRpb25zICYgQ29tcHV0ZVRoaW5VKSAhPSAwOworICBtX2NvbXB1dGVGdWxsViA9IChjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlRnVsbFYpICE9IDA7CisgIG1fY29tcHV0ZVRoaW5WID0gKGNvbXB1dGF0aW9uT3B0aW9ucyAmIENvbXB1dGVUaGluVikgIT0gMDsKKyAgZWlnZW5fYXNzZXJ0KCEobV9jb21wdXRlRnVsbFUgJiYgbV9jb21wdXRlVGhpblUpICYmICJKYWNvYmlTVkQ6IHlvdSBjYW4ndCBhc2sgZm9yIGJvdGggZnVsbCBhbmQgdGhpbiBVIik7CisgIGVpZ2VuX2Fzc2VydCghKG1fY29tcHV0ZUZ1bGxWICYmIG1fY29tcHV0ZVRoaW5WKSAmJiAiSmFjb2JpU1ZEOiB5b3UgY2FuJ3QgYXNrIGZvciBib3RoIGZ1bGwgYW5kIHRoaW4gViIpOworICBlaWdlbl9hc3NlcnQoRUlHRU5fSU1QTElFUyhtX2NvbXB1dGVUaGluVSB8fCBtX2NvbXB1dGVUaGluViwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpICYmCisgICAgICAgICAgICAgICJKYWNvYmlTVkQ6IHRoaW4gVSBhbmQgViBhcmUgb25seSBhdmFpbGFibGUgd2hlbiB5b3VyIG1hdHJpeCBoYXMgYSBkeW5hbWljIG51bWJlciBvZiBjb2x1bW5zLiIpOworICBpZiAoUVJQcmVjb25kaXRpb25lciA9PSBGdWxsUGl2SG91c2Vob2xkZXJRUlByZWNvbmRpdGlvbmVyKQorICB7CisgICAgICBlaWdlbl9hc3NlcnQoIShtX2NvbXB1dGVUaGluVSB8fCBtX2NvbXB1dGVUaGluVikgJiYKKyAgICAgICAgICAgICAgIkphY29iaVNWRDogY2FuJ3QgY29tcHV0ZSB0aGluIFUgb3IgdGhpbiBWIHdpdGggdGhlIEZ1bGxQaXZIb3VzZWhvbGRlclFSIHByZWNvbmRpdGlvbmVyLiAiCisgICAgICAgICAgICAgICJVc2UgdGhlIENvbFBpdkhvdXNlaG9sZGVyUVIgcHJlY29uZGl0aW9uZXIgaW5zdGVhZC4iKTsKKyAgfQorICBtX2RpYWdTaXplID0gKHN0ZDo6bWluKShtX3Jvd3MsIG1fY29scyk7CisgIG1fc2luZ3VsYXJWYWx1ZXMucmVzaXplKG1fZGlhZ1NpemUpOworICBtX21hdHJpeFUucmVzaXplKG1fcm93cywgbV9jb21wdXRlRnVsbFUgPyBtX3Jvd3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2NvbXB1dGVUaGluVSA/IG1fZGlhZ1NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKTsKKyAgbV9tYXRyaXhWLnJlc2l6ZShtX2NvbHMsIG1fY29tcHV0ZUZ1bGxWID8gbV9jb2xzCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9jb21wdXRlVGhpblYgPyBtX2RpYWdTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCk7CisgIG1fd29ya01hdHJpeC5yZXNpemUobV9kaWFnU2l6ZSwgbV9kaWFnU2l6ZSk7CisgIAorICBpZihtX2NvbHM+bV9yb3dzKSBtX3FyX3ByZWNvbmRfbW9yZWNvbHMuYWxsb2NhdGUoKnRoaXMpOworICBpZihtX3Jvd3M+bV9jb2xzKSBtX3FyX3ByZWNvbmRfbW9yZXJvd3MuYWxsb2NhdGUoKnRoaXMpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgUVJQcmVjb25kaXRpb25lcj4KK0phY29iaVNWRDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPiYKK0phY29iaVNWRDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPjo6Y29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIHVuc2lnbmVkIGludCBjb21wdXRhdGlvbk9wdGlvbnMpCit7CisgIGFsbG9jYXRlKG1hdHJpeC5yb3dzKCksIG1hdHJpeC5jb2xzKCksIGNvbXB1dGF0aW9uT3B0aW9ucyk7CisKKyAgLy8gY3VycmVudGx5IHdlIHN0b3Agd2hlbiB3ZSByZWFjaCBwcmVjaXNpb24gMiplcHNpbG9uIGFzIHRoZSBsYXN0IGJpdCBvZiBwcmVjaXNpb24gY2FuIHJlcXVpcmUgYW4gdW5yZWFzb25hYmxlIG51bWJlciBvZiBpdGVyYXRpb25zLAorICAvLyBvbmx5IHdvcnNlbmluZyB0aGUgcHJlY2lzaW9uIG9mIFUgYW5kIFYgYXMgd2UgYWNjdW11bGF0ZSBtb3JlIHJvdGF0aW9ucworICBjb25zdCBSZWFsU2NhbGFyIHByZWNpc2lvbiA9IFJlYWxTY2FsYXIoMikgKiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworCisgIC8vIGxpbWl0IGZvciB2ZXJ5IHNtYWxsIGRlbm9ybWFsIG51bWJlcnMgdG8gYmUgY29uc2lkZXJlZCB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIGluZmluaXRlIGxvb3BzIChzZWUgYnVnIDI4NikKKyAgY29uc3QgUmVhbFNjYWxhciBjb25zaWRlckFzWmVybyA9IFJlYWxTY2FsYXIoMikgKiBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpkZW5vcm1fbWluKCk7CisKKyAgLyoqKiBzdGVwIDEuIFRoZSBSLVNWRCBzdGVwOiB3ZSB1c2UgYSBRUiBkZWNvbXBvc2l0aW9uIHRvIHJlZHVjZSB0byB0aGUgY2FzZSBvZiBhIHNxdWFyZSBtYXRyaXggKi8KKworICBpZighbV9xcl9wcmVjb25kX21vcmVjb2xzLnJ1bigqdGhpcywgbWF0cml4KSAmJiAhbV9xcl9wcmVjb25kX21vcmVyb3dzLnJ1bigqdGhpcywgbWF0cml4KSkKKyAgeworICAgIG1fd29ya01hdHJpeCA9IG1hdHJpeC5ibG9jaygwLDAsbV9kaWFnU2l6ZSxtX2RpYWdTaXplKTsKKyAgICBpZihtX2NvbXB1dGVGdWxsVSkgbV9tYXRyaXhVLnNldElkZW50aXR5KG1fcm93cyxtX3Jvd3MpOworICAgIGlmKG1fY29tcHV0ZVRoaW5VKSBtX21hdHJpeFUuc2V0SWRlbnRpdHkobV9yb3dzLG1fZGlhZ1NpemUpOworICAgIGlmKG1fY29tcHV0ZUZ1bGxWKSBtX21hdHJpeFYuc2V0SWRlbnRpdHkobV9jb2xzLG1fY29scyk7CisgICAgaWYobV9jb21wdXRlVGhpblYpIG1fbWF0cml4Vi5zZXRJZGVudGl0eShtX2NvbHMsIG1fZGlhZ1NpemUpOworICB9CisKKyAgLyoqKiBzdGVwIDIuIFRoZSBtYWluIEphY29iaSBTVkQgaXRlcmF0aW9uLiAqKiovCisKKyAgYm9vbCBmaW5pc2hlZCA9IGZhbHNlOworICB3aGlsZSghZmluaXNoZWQpCisgIHsKKyAgICBmaW5pc2hlZCA9IHRydWU7CisKKyAgICAvLyBkbyBhIHN3ZWVwOiBmb3IgYWxsIGluZGV4IHBhaXJzIChwLHEpLCBwZXJmb3JtIFNWRCBvZiB0aGUgY29ycmVzcG9uZGluZyAyeDIgc3ViLW1hdHJpeAorCisgICAgZm9yKEluZGV4IHAgPSAxOyBwIDwgbV9kaWFnU2l6ZTsgKytwKQorICAgIHsKKyAgICAgIGZvcihJbmRleCBxID0gMDsgcSA8IHA7ICsrcSkKKyAgICAgIHsKKyAgICAgICAgLy8gaWYgdGhpcyAyeDIgc3ViLW1hdHJpeCBpcyBub3QgZGlhZ29uYWwgYWxyZWFkeS4uLgorICAgICAgICAvLyBub3RpY2UgdGhhdCB0aGlzIGNvbXBhcmlzb24gd2lsbCBldmFsdWF0ZSB0byBmYWxzZSBpZiBhbnkgTmFOIGlzIGludm9sdmVkLCBlbnN1cmluZyB0aGF0IE5hTidzIGRvbid0CisgICAgICAgIC8vIGtlZXAgdXMgaXRlcmF0aW5nIGZvcmV2ZXIuIFNpbWlsYXJseSwgc21hbGwgZGVub3JtYWwgbnVtYmVycyBhcmUgY29uc2lkZXJlZCB6ZXJvLgorICAgICAgICB1c2luZyBzdGQ6Om1heDsKKyAgICAgICAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPSAobWF4KShjb25zaWRlckFzWmVybywgcHJlY2lzaW9uICogKG1heCkoaW50ZXJuYWw6OmFicyhtX3dvcmtNYXRyaXguY29lZmYocCxwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjphYnMobV93b3JrTWF0cml4LmNvZWZmKHEscSkpKSk7CisgICAgICAgIGlmKChtYXgpKGludGVybmFsOjphYnMobV93b3JrTWF0cml4LmNvZWZmKHAscSkpLGludGVybmFsOjphYnMobV93b3JrTWF0cml4LmNvZWZmKHEscCkpKSA+IHRocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgIGZpbmlzaGVkID0gZmFsc2U7CisKKyAgICAgICAgICAvLyBwZXJmb3JtIFNWRCBkZWNvbXBvc2l0aW9uIG9mIDJ4MiBzdWItbWF0cml4IGNvcnJlc3BvbmRpbmcgdG8gaW5kaWNlcyBwLHEgdG8gbWFrZSBpdCBkaWFnb25hbAorICAgICAgICAgIGludGVybmFsOjpzdmRfcHJlY29uZGl0aW9uXzJ4Ml9ibG9ja190b19iZV9yZWFsPE1hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXI+OjpydW4obV93b3JrTWF0cml4LCAqdGhpcywgcCwgcSk7CisgICAgICAgICAgSmFjb2JpUm90YXRpb248UmVhbFNjYWxhcj4gal9sZWZ0LCBqX3JpZ2h0OworICAgICAgICAgIGludGVybmFsOjpyZWFsXzJ4Ml9qYWNvYmlfc3ZkKG1fd29ya01hdHJpeCwgcCwgcSwgJmpfbGVmdCwgJmpfcmlnaHQpOworCisgICAgICAgICAgLy8gYWNjdW11bGF0ZSByZXN1bHRpbmcgSmFjb2JpIHJvdGF0aW9ucworICAgICAgICAgIG1fd29ya01hdHJpeC5hcHBseU9uVGhlTGVmdChwLHEsal9sZWZ0KTsKKyAgICAgICAgICBpZihjb21wdXRlVSgpKSBtX21hdHJpeFUuYXBwbHlPblRoZVJpZ2h0KHAscSxqX2xlZnQudHJhbnNwb3NlKCkpOworCisgICAgICAgICAgbV93b3JrTWF0cml4LmFwcGx5T25UaGVSaWdodChwLHEsal9yaWdodCk7CisgICAgICAgICAgaWYoY29tcHV0ZVYoKSkgbV9tYXRyaXhWLmFwcGx5T25UaGVSaWdodChwLHEsal9yaWdodCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioqIHN0ZXAgMy4gVGhlIHdvcmsgbWF0cml4IGlzIG5vdyBkaWFnb25hbCwgc28gZW5zdXJlIGl0J3MgcG9zaXRpdmUgc28gaXRzIGRpYWdvbmFsIGVudHJpZXMgYXJlIHRoZSBzaW5ndWxhciB2YWx1ZXMgKioqLworCisgIGZvcihJbmRleCBpID0gMDsgaSA8IG1fZGlhZ1NpemU7ICsraSkKKyAgeworICAgIFJlYWxTY2FsYXIgYSA9IGludGVybmFsOjphYnMobV93b3JrTWF0cml4LmNvZWZmKGksaSkpOworICAgIG1fc2luZ3VsYXJWYWx1ZXMuY29lZmZSZWYoaSkgPSBhOworICAgIGlmKGNvbXB1dGVVKCkgJiYgKGEhPVJlYWxTY2FsYXIoMCkpKSBtX21hdHJpeFUuY29sKGkpICo9IG1fd29ya01hdHJpeC5jb2VmZihpLGkpL2E7CisgIH0KKworICAvKioqIHN0ZXAgNC4gU29ydCBzaW5ndWxhciB2YWx1ZXMgaW4gZGVzY2VuZGluZyBvcmRlciBhbmQgY29tcHV0ZSB0aGUgbnVtYmVyIG9mIG5vbnplcm8gc2luZ3VsYXIgdmFsdWVzICoqKi8KKworICBtX25vbnplcm9TaW5ndWxhclZhbHVlcyA9IG1fZGlhZ1NpemU7CisgIGZvcihJbmRleCBpID0gMDsgaSA8IG1fZGlhZ1NpemU7IGkrKykKKyAgeworICAgIEluZGV4IHBvczsKKyAgICBSZWFsU2NhbGFyIG1heFJlbWFpbmluZ1Npbmd1bGFyVmFsdWUgPSBtX3Npbmd1bGFyVmFsdWVzLnRhaWwobV9kaWFnU2l6ZS1pKS5tYXhDb2VmZigmcG9zKTsKKyAgICBpZihtYXhSZW1haW5pbmdTaW5ndWxhclZhbHVlID09IFJlYWxTY2FsYXIoMCkpCisgICAgeworICAgICAgbV9ub256ZXJvU2luZ3VsYXJWYWx1ZXMgPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmKHBvcykKKyAgICB7CisgICAgICBwb3MgKz0gaTsKKyAgICAgIHN0ZDo6c3dhcChtX3Npbmd1bGFyVmFsdWVzLmNvZWZmUmVmKGkpLCBtX3Npbmd1bGFyVmFsdWVzLmNvZWZmUmVmKHBvcykpOworICAgICAgaWYoY29tcHV0ZVUoKSkgbV9tYXRyaXhVLmNvbChwb3MpLnN3YXAobV9tYXRyaXhVLmNvbChpKSk7CisgICAgICBpZihjb21wdXRlVigpKSBtX21hdHJpeFYuY29sKHBvcykuc3dhcChtX21hdHJpeFYuY29sKGkpKTsKKyAgICB9CisgIH0KKworICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICByZXR1cm4gKnRoaXM7Cit9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXIsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBzb2x2ZV9yZXR2YWw8SmFjb2JpU1ZEPF9NYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPiwgUmhzPgorICA6IHNvbHZlX3JldHZhbF9iYXNlPEphY29iaVNWRDxfTWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj4sIFJocz4KK3sKKyAgdHlwZWRlZiBKYWNvYmlTVkQ8X01hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXI+IEphY29iaVNWRFR5cGU7CisgIEVJR0VOX01BS0VfU09MVkVfSEVMUEVSUyhKYWNvYmlTVkRUeXBlLFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQocmhzKCkucm93cygpID09IGRlYygpLnJvd3MoKSk7CisKKyAgICAvLyBBID0gVSBTIFZeKgorICAgIC8vIFNvIEFeey0xfSA9IFYgU157LTF9IFVeKgorCisgICAgSW5kZXggZGlhZ1NpemUgPSAoc3RkOjptaW4pKGRlYygpLnJvd3MoKSwgZGVjKCkuY29scygpKTsKKyAgICB0eXBlbmFtZSBKYWNvYmlTVkRUeXBlOjpTaW5ndWxhclZhbHVlc1R5cGUgaW52ZXJ0ZWRTaW5nVmFscyhkaWFnU2l6ZSk7CisKKyAgICBJbmRleCBub256ZXJvU2luZ1ZhbHMgPSBkZWMoKS5ub256ZXJvU2luZ3VsYXJWYWx1ZXMoKTsKKyAgICBpbnZlcnRlZFNpbmdWYWxzLmhlYWQobm9uemVyb1NpbmdWYWxzKSA9IGRlYygpLnNpbmd1bGFyVmFsdWVzKCkuaGVhZChub256ZXJvU2luZ1ZhbHMpLmFycmF5KCkuaW52ZXJzZSgpOworICAgIGludmVydGVkU2luZ1ZhbHMudGFpbChkaWFnU2l6ZSAtIG5vbnplcm9TaW5nVmFscykuc2V0WmVybygpOworCisgICAgZHN0ID0gZGVjKCkubWF0cml4VigpLmxlZnRDb2xzKGRpYWdTaXplKQorICAgICAgICAqIGludmVydGVkU2luZ1ZhbHMuYXNEaWFnb25hbCgpCisgICAgICAgICogZGVjKCkubWF0cml4VSgpLmxlZnRDb2xzKGRpYWdTaXplKS5hZGpvaW50KCkKKyAgICAgICAgKiByaHMoKTsKKyAgfQorfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXHN2ZF9tb2R1bGUKKyAgKgorICAqIFxyZXR1cm4gdGhlIHNpbmd1bGFyIHZhbHVlIGRlY29tcG9zaXRpb24gb2YgXGMgKnRoaXMgY29tcHV0ZWQgYnkgdHdvLXNpZGVkCisgICogSmFjb2JpIHRyYW5zZm9ybWF0aW9ucy4KKyAgKgorICAqIFxzYSBjbGFzcyBKYWNvYmlTVkQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitKYWNvYmlTVkQ8dHlwZW5hbWUgTWF0cml4QmFzZTxEZXJpdmVkPjo6UGxhaW5PYmplY3Q+CitNYXRyaXhCYXNlPERlcml2ZWQ+OjpqYWNvYmlTdmQodW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucykgY29uc3QKK3sKKyAgcmV0dXJuIEphY29iaVNWRDxQbGFpbk9iamVjdD4oKnRoaXMsIGNvbXB1dGF0aW9uT3B0aW9ucyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fSkFDT0JJU1ZEX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TVkQvSmFjb2JpU1ZEX01LTC5oIGIvRWlnZW4vc3JjL1NWRC9KYWNvYmlTVkRfTUtMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0NzlmNgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TVkQvSmFjb2JpU1ZEX01LTC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBFaWdlbiBiaW5kaW5ncyB0byBJbnRlbChSKSBNS0wKKyAqICAgIFNpbmd1bGFyIFZhbHVlIERlY29tcG9zaXRpb24gLSBTVkQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgRUlHRU5fSkFDT0JJU1ZEX01LTF9ICisjZGVmaW5lIEVJR0VOX0pBQ09CSVNWRF9NS0xfSAorCisjaW5jbHVkZSAiRWlnZW4vc3JjL0NvcmUvdXRpbC9NS0xfc3VwcG9ydC5oIgorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbnRlcm5hbCBTcGVjaWFsaXphdGlvbiBmb3IgdGhlIGRhdGEgdHlwZXMgc3VwcG9ydGVkIGJ5IE1LTCAqLworCisjZGVmaW5lIEVJR0VOX01LTF9TVkQoRUlHVFlQRSwgTUtMVFlQRSwgTUtMUlRZUEUsIE1LTFBSRUZJWCwgRUlHQ09MUk9XLCBNS0xDT0xST1cpIFwKK3RlbXBsYXRlPD4gaW5saW5lXAorSmFjb2JpU1ZEPE1hdHJpeDxFSUdUWVBFLCBEeW5hbWljLCBEeW5hbWljLCBFSUdDT0xST1csIER5bmFtaWMsIER5bmFtaWM+LCBDb2xQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+JiBcCitKYWNvYmlTVkQ8TWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVywgRHluYW1pYywgRHluYW1pYz4sIENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj46OmNvbXB1dGUoY29uc3QgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVywgRHluYW1pYywgRHluYW1pYz4mIG1hdHJpeCwgdW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucykgXAoreyBcCisgIHR5cGVkZWYgTWF0cml4PEVJR1RZUEUsIER5bmFtaWMsIER5bmFtaWMsIEVJR0NPTFJPVywgRHluYW1pYywgRHluYW1pYz4gTWF0cml4VHlwZTsgXAorICB0eXBlZGVmIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7IFwKKyAgdHlwZWRlZiBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7IFwKKyAgYWxsb2NhdGUobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSwgY29tcHV0YXRpb25PcHRpb25zKTsgXAorXAorICAvKmNvbnN0IFJlYWxTY2FsYXIgcHJlY2lzaW9uID0gUmVhbFNjYWxhcigyKSAqIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCk7Ki8gXAorICBtX25vbnplcm9TaW5ndWxhclZhbHVlcyA9IG1fZGlhZ1NpemU7IFwKK1wKKyAgbGFwYWNrX2ludCBsZGEgPSBtYXRyaXgub3V0ZXJTdHJpZGUoKSwgbGR1LCBsZHZ0OyBcCisgIGxhcGFja19pbnQgbWF0cml4X29yZGVyID0gTUtMQ09MUk9XOyBcCisgIGNoYXIgam9idSwgam9idnQ7IFwKKyAgTUtMVFlQRSAqdSwgKnZ0LCBkdW1teTsgXAorICBqb2J1ICA9IChtX2NvbXB1dGVGdWxsVSkgPyAnQScgOiAobV9jb21wdXRlVGhpblUpID8gJ1MnIDogJ04nOyBcCisgIGpvYnZ0ID0gKG1fY29tcHV0ZUZ1bGxWKSA/ICdBJyA6IChtX2NvbXB1dGVUaGluVikgPyAnUycgOiAnTic7IFwKKyAgaWYgKGNvbXB1dGVVKCkpIHsgXAorICAgIGxkdSAgPSBtX21hdHJpeFUub3V0ZXJTdHJpZGUoKTsgXAorICAgIHUgICAgPSAoTUtMVFlQRSopbV9tYXRyaXhVLmRhdGEoKTsgXAorICB9IGVsc2UgeyBsZHU9MTsgdT0mZHVtbXk7IH1cCisgIE1hdHJpeFR5cGUgbG9jYWxWOyBcCisgIGxkdnQgPSAobV9jb21wdXRlRnVsbFYpID8gbV9jb2xzIDogKG1fY29tcHV0ZVRoaW5WKSA/IG1fZGlhZ1NpemUgOiAxOyBcCisgIGlmIChjb21wdXRlVigpKSB7IFwKKyAgICBsb2NhbFYucmVzaXplKGxkdnQsIG1fY29scyk7IFwKKyAgICB2dCAgID0gKE1LTFRZUEUqKWxvY2FsVi5kYXRhKCk7IFwKKyAgfSBlbHNlIHsgbGR2dD0xOyB2dD0mZHVtbXk7IH1cCisgIE1hdHJpeDxNS0xSVFlQRSwgRHluYW1pYywgRHluYW1pYz4gc3VwZXJiOyBzdXBlcmIucmVzaXplKG1fZGlhZ1NpemUsIDEpOyBcCisgIE1hdHJpeFR5cGUgbV90ZW1wOyBtX3RlbXAgPSBtYXRyaXg7IFwKKyAgTEFQQUNLRV8jI01LTFBSRUZJWCMjZ2VzdmQoIG1hdHJpeF9vcmRlciwgam9idSwgam9idnQsIG1fcm93cywgbV9jb2xzLCAoTUtMVFlQRSopbV90ZW1wLmRhdGEoKSwgbGRhLCAoTUtMUlRZUEUqKW1fc2luZ3VsYXJWYWx1ZXMuZGF0YSgpLCB1LCBsZHUsIHZ0LCBsZHZ0LCBzdXBlcmIuZGF0YSgpKTsgXAorICBpZiAoY29tcHV0ZVYoKSkgbV9tYXRyaXhWID0gbG9jYWxWLmFkam9pbnQoKTsgXAorIC8qIGZvcihpbnQgaT0wO2k8bV9kaWFnU2l6ZTtpKyspIGlmIChtX3Npbmd1bGFyVmFsdWVzLmNvZWZmUmVmKGkpIDwgcHJlY2lzaW9uKSB7IG1fbm9uemVyb1Npbmd1bGFyVmFsdWVzLS07IG1fc2luZ3VsYXJWYWx1ZXMuY29lZmZSZWYoaSk9UmVhbFNjYWxhcigwKTt9Ki8gXAorICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOyBcCisgIHJldHVybiAqdGhpczsgXAorfQorCitFSUdFTl9NS0xfU1ZEKGRvdWJsZSwgICBkb3VibGUsICAgICAgICBkb3VibGUsIGQsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorRUlHRU5fTUtMX1NWRChmbG9hdCwgICAgZmxvYXQsICAgICAgICAgZmxvYXQgLCBzLCBDb2xNYWpvciwgTEFQQUNLX0NPTF9NQUpPUikKK0VJR0VOX01LTF9TVkQoZGNvbXBsZXgsIE1LTF9Db21wbGV4MTYsIGRvdWJsZSwgeiwgQ29sTWFqb3IsIExBUEFDS19DT0xfTUFKT1IpCitFSUdFTl9NS0xfU1ZEKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsICBmbG9hdCAsIGMsIENvbE1ham9yLCBMQVBBQ0tfQ09MX01BSk9SKQorCitFSUdFTl9NS0xfU1ZEKGRvdWJsZSwgICBkb3VibGUsICAgICAgICBkb3VibGUsIGQsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorRUlHRU5fTUtMX1NWRChmbG9hdCwgICAgZmxvYXQsICAgICAgICAgZmxvYXQgLCBzLCBSb3dNYWpvciwgTEFQQUNLX1JPV19NQUpPUikKK0VJR0VOX01LTF9TVkQoZGNvbXBsZXgsIE1LTF9Db21wbGV4MTYsIGRvdWJsZSwgeiwgUm93TWFqb3IsIExBUEFDS19ST1dfTUFKT1IpCitFSUdFTl9NS0xfU1ZEKHNjb21wbGV4LCBNS0xfQ29tcGxleDgsICBmbG9hdCAsIGMsIFJvd01ham9yLCBMQVBBQ0tfUk9XX01BSk9SKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0pBQ09CSVNWRF9NS0xfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NWRC9VcHBlckJpZGlhZ29uYWxpemF0aW9uLmggYi9FaWdlbi9zcmMvU1ZEL1VwcGVyQmlkaWFnb25hbGl6YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTNiMzEwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NWRC9VcHBlckJpZGlhZ29uYWxpemF0aW9uLmgKQEAgLTAsMCArMSwxNDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CSURJQUdPTkFMSVpBVElPTl9ICisjZGVmaW5lIEVJR0VOX0JJRElBR09OQUxJWkFUSU9OX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBVcHBlckJpZGlhZ29uYWxpemF0aW9uIHdpbGwgcHJvYmFibHkgYmUgcmVwbGFjZWQgYnkgYSBCaWRpYWdvbmFsaXphdGlvbiBjbGFzcywgZG9uJ3Qgd2FudCB0byBtYWtlIGl0IHN0YWJsZSBBUEkuCisvLyBBdCB0aGUgc2FtZSB0aW1lLCBpdCdzIHVzZWZ1bCB0byBrZWVwIGZvciBub3cgYXMgaXQncyBhYm91dCB0aGUgb25seSB0aGluZyB0aGF0IGlzIHRlc3RpbmcgdGhlIEJhbmRNYXRyaXggY2xhc3MuCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPiBjbGFzcyBVcHBlckJpZGlhZ29uYWxpemF0aW9uCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICBlbnVtIHsKKyAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgQ29sc0F0Q29tcGlsZVRpbWVNaW51c09uZSA9IGludGVybmFsOjpkZWNyZW1lbnRfc2l6ZTxDb2xzQXRDb21waWxlVGltZT46OnJldAorICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBDb2xzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCAxPiBDb2xWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgQmFuZE1hdHJpeDxSZWFsU2NhbGFyLCBDb2xzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIDEsIDA+IEJpZGlhZ29uYWxUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIDE+IERpYWdWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWVNaW51c09uZSwgMT4gU3VwZXJEaWFnVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIEhvdXNlaG9sZGVyU2VxdWVuY2U8CisgICAgICAgICAgICAgIGNvbnN0IE1hdHJpeFR5cGUsCisgICAgICAgICAgICAgIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxTY2FsYXI+LCBjb25zdCBEaWFnb25hbDxjb25zdCBNYXRyaXhUeXBlLDA+ID4KKyAgICAgICAgICAgID4gSG91c2Vob2xkZXJVU2VxdWVuY2VUeXBlOworICAgIHR5cGVkZWYgSG91c2Vob2xkZXJTZXF1ZW5jZTwKKyAgICAgICAgICAgICAgY29uc3QgTWF0cml4VHlwZSwKKyAgICAgICAgICAgICAgRGlhZ29uYWw8Y29uc3QgTWF0cml4VHlwZSwxPiwKKyAgICAgICAgICAgICAgT25UaGVSaWdodAorICAgICAgICAgICAgPiBIb3VzZWhvbGRlclZTZXF1ZW5jZVR5cGU7CisgICAgCisgICAgLyoqCisgICAgKiBcYnJpZWYgRGVmYXVsdCBDb25zdHJ1Y3Rvci4KKyAgICAqCisgICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgaW4gY2FzZXMgaW4gd2hpY2ggdGhlIHVzZXIgaW50ZW5kcyB0bworICAgICogcGVyZm9ybSBkZWNvbXBvc2l0aW9ucyB2aWEgQmlkaWFnb25hbGl6YXRpb246OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYpLgorICAgICovCisgICAgVXBwZXJCaWRpYWdvbmFsaXphdGlvbigpIDogbV9ob3VzZWhvbGRlcigpLCBtX2JpZGlhZ29uYWwoKSwgbV9pc0luaXRpYWxpemVkKGZhbHNlKSB7fQorCisgICAgVXBwZXJCaWRpYWdvbmFsaXphdGlvbihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICA6IG1faG91c2Vob2xkZXIobWF0cml4LnJvd3MoKSwgbWF0cml4LmNvbHMoKSksCisgICAgICAgIG1fYmlkaWFnb25hbChtYXRyaXguY29scygpLCBtYXRyaXguY29scygpKSwKKyAgICAgICAgbV9pc0luaXRpYWxpemVkKGZhbHNlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisgICAgCisgICAgVXBwZXJCaWRpYWdvbmFsaXphdGlvbiYgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpOworICAgIAorICAgIGNvbnN0IE1hdHJpeFR5cGUmIGhvdXNlaG9sZGVyKCkgY29uc3QgeyByZXR1cm4gbV9ob3VzZWhvbGRlcjsgfQorICAgIGNvbnN0IEJpZGlhZ29uYWxUeXBlJiBiaWRpYWdvbmFsKCkgY29uc3QgeyByZXR1cm4gbV9iaWRpYWdvbmFsOyB9CisgICAgCisgICAgY29uc3QgSG91c2Vob2xkZXJVU2VxdWVuY2VUeXBlIGhvdXNlaG9sZGVyVSgpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiVXBwZXJCaWRpYWdvbmFsaXphdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gSG91c2Vob2xkZXJVU2VxdWVuY2VUeXBlKG1faG91c2Vob2xkZXIsIG1faG91c2Vob2xkZXIuZGlhZ29uYWwoKS5jb25qdWdhdGUoKSk7CisgICAgfQorCisgICAgY29uc3QgSG91c2Vob2xkZXJWU2VxdWVuY2VUeXBlIGhvdXNlaG9sZGVyVigpIC8vIGNvbnN0IGhlcmUgZ2l2ZXMgbmFzdHkgZXJyb3JzIGFuZCBpJ20gbGF6eQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlVwcGVyQmlkaWFnb25hbGl6YXRpb24gaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgcmV0dXJuIEhvdXNlaG9sZGVyVlNlcXVlbmNlVHlwZShtX2hvdXNlaG9sZGVyLCBtX2hvdXNlaG9sZGVyLmNvbnN0X2Rlcml2ZWQoKS50ZW1wbGF0ZSBkaWFnb25hbDwxPigpKQorICAgICAgICAgICAgIC5zZXRMZW5ndGgobV9ob3VzZWhvbGRlci5jb2xzKCktMSkKKyAgICAgICAgICAgICAuc2V0U2hpZnQoMSk7CisgICAgfQorICAgIAorICBwcm90ZWN0ZWQ6CisgICAgTWF0cml4VHlwZSBtX2hvdXNlaG9sZGVyOworICAgIEJpZGlhZ29uYWxUeXBlIG1fYmlkaWFnb25hbDsKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlPgorVXBwZXJCaWRpYWdvbmFsaXphdGlvbjxfTWF0cml4VHlwZT4mIFVwcGVyQmlkaWFnb25hbGl6YXRpb248X01hdHJpeFR5cGU+Ojpjb21wdXRlKGNvbnN0IF9NYXRyaXhUeXBlJiBtYXRyaXgpCit7CisgIEluZGV4IHJvd3MgPSBtYXRyaXgucm93cygpOworICBJbmRleCBjb2xzID0gbWF0cml4LmNvbHMoKTsKKyAgCisgIGVpZ2VuX2Fzc2VydChyb3dzID49IGNvbHMgJiYgIlVwcGVyQmlkaWFnb25hbGl6YXRpb24gaXMgb25seSBmb3IgbWF0cmljZXMgc2F0aXNmeWluZyByb3dzPj1jb2xzLiIpOworICAKKyAgbV9ob3VzZWhvbGRlciA9IG1hdHJpeDsKKworICBDb2xWZWN0b3JUeXBlIHRlbXAocm93cyk7CisKKyAgZm9yIChJbmRleCBrID0gMDsgLyogYnJlYWtzIGF0IGs9PWNvbHMtMSBiZWxvdyAqLyA7ICsraykKKyAgeworICAgIEluZGV4IHJlbWFpbmluZ1Jvd3MgPSByb3dzIC0gazsKKyAgICBJbmRleCByZW1haW5pbmdDb2xzID0gY29scyAtIGsgLSAxOworCisgICAgLy8gY29uc3RydWN0IGxlZnQgaG91c2Vob2xkZXIgdHJhbnNmb3JtIGluLXBsYWNlIGluIG1faG91c2Vob2xkZXIKKyAgICBtX2hvdXNlaG9sZGVyLmNvbChrKS50YWlsKHJlbWFpbmluZ1Jvd3MpCisgICAgICAgICAgICAgICAgIC5tYWtlSG91c2Vob2xkZXJJblBsYWNlKG1faG91c2Vob2xkZXIuY29lZmZSZWYoayxrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iaWRpYWdvbmFsLnRlbXBsYXRlIGRpYWdvbmFsPDA+KCkuY29lZmZSZWYoaykpOworICAgIC8vIGFwcGx5IGhvdXNlaG9sZGVyIHRyYW5zZm9ybSB0byByZW1haW5pbmcgcGFydCBvZiBtX2hvdXNlaG9sZGVyIG9uIHRoZSBsZWZ0CisgICAgbV9ob3VzZWhvbGRlci5ib3R0b21SaWdodENvcm5lcihyZW1haW5pbmdSb3dzLCByZW1haW5pbmdDb2xzKQorICAgICAgICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChtX2hvdXNlaG9sZGVyLmNvbChrKS50YWlsKHJlbWFpbmluZ1Jvd3MtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faG91c2Vob2xkZXIuY29lZmYoayxrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5kYXRhKCkpOworCisgICAgaWYoayA9PSBjb2xzLTEpIGJyZWFrOworICAgIAorICAgIC8vIGNvbnN0cnVjdCByaWdodCBob3VzZWhvbGRlciB0cmFuc2Zvcm0gaW4tcGxhY2UgaW4gbV9ob3VzZWhvbGRlcgorICAgIG1faG91c2Vob2xkZXIucm93KGspLnRhaWwocmVtYWluaW5nQ29scykKKyAgICAgICAgICAgICAgICAgLm1ha2VIb3VzZWhvbGRlckluUGxhY2UobV9ob3VzZWhvbGRlci5jb2VmZlJlZihrLGsrMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmlkaWFnb25hbC50ZW1wbGF0ZSBkaWFnb25hbDwxPigpLmNvZWZmUmVmKGspKTsKKyAgICAvLyBhcHBseSBob3VzZWhvbGRlciB0cmFuc2Zvcm0gdG8gcmVtYWluaW5nIHBhcnQgb2YgbV9ob3VzZWhvbGRlciBvbiB0aGUgbGVmdAorICAgIG1faG91c2Vob2xkZXIuYm90dG9tUmlnaHRDb3JuZXIocmVtYWluaW5nUm93cy0xLCByZW1haW5pbmdDb2xzKQorICAgICAgICAgICAgICAgICAuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQobV9ob3VzZWhvbGRlci5yb3coaykudGFpbChyZW1haW5pbmdDb2xzLTEpLnRyYW5zcG9zZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ob3VzZWhvbGRlci5jb2VmZihrLGsrMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLmRhdGEoKSk7CisgIH0KKyAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgcmV0dXJuICp0aGlzOworfQorCisjaWYgMAorLyoqIFxyZXR1cm4gdGhlIEhvdXNlaG9sZGVyIFFSIGRlY29tcG9zaXRpb24gb2YgXGMgKnRoaXMuCisgICoKKyAgKiBcc2EgY2xhc3MgQmlkaWFnb25hbGl6YXRpb24KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBVcHBlckJpZGlhZ29uYWxpemF0aW9uPHR5cGVuYW1lIE1hdHJpeEJhc2U8RGVyaXZlZD46OlBsYWluT2JqZWN0PgorTWF0cml4QmFzZTxEZXJpdmVkPjo6YmlkaWFnb25hbGl6YXRpb24oKSBjb25zdAoreworICByZXR1cm4gVXBwZXJCaWRpYWdvbmFsaXphdGlvbjxQbGFpbk9iamVjdD4oZXZhbCgpKTsKK30KKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9CSURJQUdPTkFMSVpBVElPTl9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ2hvbGVza3kvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvU3BhcnNlQ2hvbGVza3kvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1YTU5ZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDaG9sZXNreS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9TcGFyc2VDaG9sZXNreV9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fU3BhcnNlQ2hvbGVza3lfU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS9FaWdlbi9zcmMvU3BhcnNlQ2hvbGVza3kgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDaG9sZXNreS9TaW1wbGljaWFsQ2hvbGVza3kuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDaG9sZXNreS9TaW1wbGljaWFsQ2hvbGVza3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmYzOGFiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNob2xlc2t5L1NpbXBsaWNpYWxDaG9sZXNreS5oCkBAIC0wLDAgKzEsODczIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLyoKKworTk9URTogdGhlIF9zeW1ib2xpYywgYW5kIF9udW1lcmljIGZ1bmN0aW9ucyBoYXMgYmVlbiBhZGFwdGVkIGZyb20KKyAgICAgIHRoZSBMREwgbGlicmFyeToKKworTERMIENvcHlyaWdodCAoYykgMjAwNSBieSBUaW1vdGh5IEEuIERhdmlzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTERMIExpY2Vuc2U6CisKKyAgICBZb3VyIHVzZSBvciBkaXN0cmlidXRpb24gb2YgTERMIG9yIGFueSBtb2RpZmllZCB2ZXJzaW9uIG9mCisgICAgTERMIGltcGxpZXMgdGhhdCB5b3UgYWdyZWUgdG8gdGhpcyBMaWNlbnNlLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEKKyAgICBVU0EKKworICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlIG9yIGNvcHkgdGhpcyBwcm9ncmFtIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgcHJvdmlkZWQgdGhhdCB0aGUgQ29weXJpZ2h0LCB0aGlzIExpY2Vuc2UsCisgICAgYW5kIHRoZSBBdmFpbGFiaWxpdHkgb2YgdGhlIG9yaWdpbmFsIHZlcnNpb24gaXMgcmV0YWluZWQgb24gYWxsIGNvcGllcy4KKyAgICBVc2VyIGRvY3VtZW50YXRpb24gb2YgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgY29kZSBvciBhbnkgbW9kaWZpZWQKKyAgICB2ZXJzaW9uIG9mIHRoaXMgY29kZSBtdXN0IGNpdGUgdGhlIENvcHlyaWdodCwgdGhpcyBMaWNlbnNlLCB0aGUKKyAgICBBdmFpbGFiaWxpdHkgbm90ZSwgYW5kICJVc2VkIGJ5IHBlcm1pc3Npb24uIiBQZXJtaXNzaW9uIHRvIG1vZGlmeQorICAgIHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMgZ3JhbnRlZCwgcHJvdmlkZWQgdGhlCisgICAgQ29weXJpZ2h0LCB0aGlzIExpY2Vuc2UsIGFuZCB0aGUgQXZhaWxhYmlsaXR5IG5vdGUgYXJlIHJldGFpbmVkLAorICAgIGFuZCBhIG5vdGljZSB0aGF0IHRoZSBjb2RlIHdhcyBtb2RpZmllZCBpcyBpbmNsdWRlZC4KKyAqLworCisjaW5jbHVkZSAiLi4vQ29yZS91dGlsL05vbk1QTDIuaCIKKworI2lmbmRlZiBFSUdFTl9TSU1QTElDSUFMX0NIT0xFU0tZX0gKKyNkZWZpbmUgRUlHRU5fU0lNUExJQ0lBTF9DSE9MRVNLWV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCitlbnVtIFNpbXBsaWNpYWxDaG9sZXNreU1vZGUgeworICBTaW1wbGljaWFsQ2hvbGVza3lMTFQsCisgIFNpbXBsaWNpYWxDaG9sZXNreUxETFQKK307CisKKy8qKiBcaW5ncm91cCBTcGFyc2VDaG9sZXNreV9Nb2R1bGUKKyAgKiBcYnJpZWYgQSBkaXJlY3Qgc3BhcnNlIENob2xlc2t5IGZhY3Rvcml6YXRpb25zCisgICoKKyAgKiBUaGVzZSBjbGFzc2VzIHByb3ZpZGUgTExeVCBhbmQgTERMXlQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbnMgb2Ygc3BhcnNlIG1hdHJpY2VzIHRoYXQgYXJlCisgICogc2VsZmFkam9pbnQgYW5kIHBvc2l0aXZlIGRlZmluaXRlLiBUaGUgZmFjdG9yaXphdGlvbiBhbGxvd3MgZm9yIHNvbHZpbmcgQS5YID0gQiB3aGVyZQorICAqIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICogCisgICogSW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBmaWxsLWluLCBhIHN5bW1ldHJpYyBwZXJtdXRhdGlvbiBQIGlzIGFwcGxpZWQgcHJpb3IgdG8gdGhlIGZhY3Rvcml6YXRpb24KKyAgKiBzdWNoIHRoYXQgdGhlIGZhY3Rvcml6ZWQgbWF0cml4IGlzIFAgQSBQXi0xLgorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKiBcdHBhcmFtIF9VcExvIHRoZSB0cmlhbmd1bGFyIHBhcnQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBjb21wdXRhdGlvbnMuIEl0IGNhbiBiZSBMb3dlcgorICAqICAgICAgICAgICAgICAgb3IgVXBwZXIuIERlZmF1bHQgaXMgTG93ZXIuCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBTaW1wbGljaWFsQ2hvbGVza3lCYXNlIDogaW50ZXJuYWw6Om5vbmNvcHlhYmxlCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICBlbnVtIHsgVXBMbyA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlVwTG8gfTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsSW5kZXg+IENob2xNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7CisKKyAgcHVibGljOgorCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgKi8KKyAgICBTaW1wbGljaWFsQ2hvbGVza3lCYXNlKCkKKyAgICAgIDogbV9pbmZvKFN1Y2Nlc3MpLCBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpLCBtX3NoaWZ0T2Zmc2V0KDApLCBtX3NoaWZ0U2NhbGUoMSkKKyAgICB7fQorCisgICAgU2ltcGxpY2lhbENob2xlc2t5QmFzZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgICA6IG1faW5mbyhTdWNjZXNzKSwgbV9pc0luaXRpYWxpemVkKGZhbHNlKSwgbV9zaGlmdE9mZnNldCgwKSwgbV9zaGlmdFNjYWxlKDEpCisgICAgeworICAgICAgZGVyaXZlZCgpLmNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICB+U2ltcGxpY2lhbENob2xlc2t5QmFzZSgpCisgICAgeworICAgIH0KKworICAgIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgICAgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKyAgICAKKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeC5hcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIHNvbHV0aW9uIHggb2YgXGYkIEEgeCA9IGIgXGYkIHVzaW5nIHRoZSBjdXJyZW50IGRlY29tcG9zaXRpb24gb2YgQS4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjpzb2x2ZV9yZXR2YWw8U2ltcGxpY2lhbENob2xlc2t5QmFzZSwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTaW1wbGljaWFsIExMVCBvciBMRExUIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dzKCk9PWIucm93cygpCisgICAgICAgICAgICAgICAgJiYgIlNpbXBsaWNpYWxDaG9sZXNreUJhc2U6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8U2ltcGxpY2lhbENob2xlc2t5QmFzZSwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgdGhlIHNvbHV0aW9uIHggb2YgXGYkIEEgeCA9IGIgXGYkIHVzaW5nIHRoZSBjdXJyZW50IGRlY29tcG9zaXRpb24gb2YgQS4KKyAgICAgICoKKyAgICAgICogXHNhIGNvbXB1dGUoKQorICAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+CisgICAgaW5saW5lIGNvbnN0IGludGVybmFsOjpzcGFyc2Vfc29sdmVfcmV0dmFsPFNpbXBsaWNpYWxDaG9sZXNreUJhc2UsIFJocz4KKyAgICBzb2x2ZShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFJocz4mIGIpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiU2ltcGxpY2lhbCBMTFQgb3IgTERMVCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQocm93cygpPT1iLnJvd3MoKQorICAgICAgICAgICAgICAgICYmICJTaW1wbGljaWFsQ2hvbGVza3k6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzcGFyc2Vfc29sdmVfcmV0dmFsPFNpbXBsaWNpYWxDaG9sZXNreUJhc2UsIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKyAgICB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBwZXJtdXRhdGlvbiBQCisgICAgICAqIFxzYSBwZXJtdXRhdGlvblBpbnYoKSAqLworICAgIGNvbnN0IFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxJbmRleD4mIHBlcm11dGF0aW9uUCgpIGNvbnN0CisgICAgeyByZXR1cm4gbV9QOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBpbnZlcnNlIFBeLTEgb2YgdGhlIHBlcm11dGF0aW9uIFAKKyAgICAgICogXHNhIHBlcm11dGF0aW9uUCgpICovCisgICAgY29uc3QgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljLEluZGV4PiYgcGVybXV0YXRpb25QaW52KCkgY29uc3QKKyAgICB7IHJldHVybiBtX1BpbnY7IH0KKworICAgIC8qKiBTZXRzIHRoZSBzaGlmdCBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFkanVzdCB0aGUgZGlhZ29uYWwgY29lZmZpY2llbnRzIGR1cmluZyB0aGUgbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24uCisgICAgICAqCisgICAgICAqIER1cmluZyB0aGUgbnVtZXJpY2FsIGZhY3Rvcml6YXRpb24sIHRoZSBkaWFnb25hbCBjb2VmZmljaWVudHMgYXJlIHRyYW5zZm9ybWVkIGJ5IHRoZSBmb2xsb3dpbmcgbGluZWFyIG1vZGVsOlxuCisgICAgICAqIFxjIGRfaWkgPSBcYSBvZmZzZXQgKyBcYSBzY2FsZSAqIFxjIGRfaWkKKyAgICAgICoKKyAgICAgICogVGhlIGRlZmF1bHQgaXMgdGhlIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uIHdpdGggXGEgb2Zmc2V0PTAsIGFuZCBcYSBzY2FsZT0xLgorICAgICAgKgorICAgICAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byBcYyAqdGhpcy4KKyAgICAgICovCisgICAgRGVyaXZlZCYgc2V0U2hpZnQoY29uc3QgUmVhbFNjYWxhciYgb2Zmc2V0LCBjb25zdCBSZWFsU2NhbGFyJiBzY2FsZSA9IDEpCisgICAgeworICAgICAgbV9zaGlmdE9mZnNldCA9IG9mZnNldDsKKyAgICAgIG1fc2hpZnRTY2FsZSA9IHNjYWxlOworICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RyZWFtPgorICAgIHZvaWQgZHVtcE1lbW9yeShTdHJlYW0mIHMpCisgICAgeworICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgIHMgPDwgIiAgTDogICAgICAgICIgPDwgKCh0b3RhbCs9KG1fbWF0cml4LmNvbHMoKSsxKSAqIHNpemVvZihpbnQpICsgbV9tYXRyaXgubm9uWmVyb3MoKSooc2l6ZW9mKGludCkrc2l6ZW9mKFNjYWxhcikpKSA+PiAyMCkgPDwgIk1iIiA8PCAiXG4iOworICAgICAgcyA8PCAiICBkaWFnOiAgICAgIiA8PCAoKHRvdGFsKz1tX2RpYWcuc2l6ZSgpICogc2l6ZW9mKFNjYWxhcikpID4+IDIwKSA8PCAiTWIiIDw8ICJcbiI7CisgICAgICBzIDw8ICIgIHRyZWU6ICAgICAiIDw8ICgodG90YWwrPW1fcGFyZW50LnNpemUoKSAqIHNpemVvZihpbnQpKSA+PiAyMCkgPDwgIk1iIiA8PCAiXG4iOworICAgICAgcyA8PCAiICBub256ZXJvczogIiA8PCAoKHRvdGFsKz1tX25vblplcm9zUGVyQ29sLnNpemUoKSAqIHNpemVvZihpbnQpKSA+PiAyMCkgPDwgIk1iIiA8PCAiXG4iOworICAgICAgcyA8PCAiICBwZXJtOiAgICAgIiA8PCAoKHRvdGFsKz1tX1Auc2l6ZSgpICogc2l6ZW9mKGludCkpID4+IDIwKSA8PCAiTWIiIDw8ICJcbiI7CisgICAgICBzIDw8ICIgIHBlcm1eLTE6ICAiIDw8ICgodG90YWwrPW1fUGludi5zaXplKCkgKiBzaXplb2YoaW50KSkgPj4gMjApIDw8ICJNYiIgPDwgIlxuIjsKKyAgICAgIHMgPDwgIiAgVE9UQUw6ICAgICIgPDwgKHRvdGFsPj4gMjApIDw8ICJNYiIgPDwgIlxuIjsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+CisgICAgdm9pZCBfc29sdmUoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+ICZkZXN0KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgZGVjb21wb3NpdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc29sdmluZywgeW91IG11c3QgZmlyc3QgY2FsbCBlaXRoZXIgY29tcHV0ZSgpIG9yIHN5bWJvbGljKCkvbnVtZXJpYygpIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9tYXRyaXgucm93cygpPT1iLnJvd3MoKSk7CisKKyAgICAgIGlmKG1faW5mbyE9U3VjY2VzcykKKyAgICAgICAgcmV0dXJuOworCisgICAgICBpZihtX1Auc2l6ZSgpPjApCisgICAgICAgIGRlc3QgPSBtX1AgKiBiOworICAgICAgZWxzZQorICAgICAgICBkZXN0ID0gYjsKKworICAgICAgaWYobV9tYXRyaXgubm9uWmVyb3MoKT4wKSAvLyBvdGhlcndpc2UgTD09SQorICAgICAgICBkZXJpdmVkKCkubWF0cml4TCgpLnNvbHZlSW5QbGFjZShkZXN0KTsKKworICAgICAgaWYobV9kaWFnLnNpemUoKT4wKQorICAgICAgICBkZXN0ID0gbV9kaWFnLmFzRGlhZ29uYWwoKS5pbnZlcnNlKCkgKiBkZXN0OworCisgICAgICBpZiAobV9tYXRyaXgubm9uWmVyb3MoKT4wKSAvLyBvdGhlcndpc2UgVT09SQorICAgICAgICBkZXJpdmVkKCkubWF0cml4VSgpLnNvbHZlSW5QbGFjZShkZXN0KTsKKworICAgICAgaWYobV9QLnNpemUoKT4wKQorICAgICAgICBkZXN0ID0gbV9QaW52ICogZGVzdDsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0U2NhbGFyLCBpbnQgRGVzdE9wdGlvbnMsIHR5cGVuYW1lIERlc3RJbmRleD4KKyAgICB2b2lkIF9zb2x2ZV9zcGFyc2UoY29uc3QgUmhzJiBiLCBTcGFyc2VNYXRyaXg8RGVzdFNjYWxhcixEZXN0T3B0aW9ucyxEZXN0SW5kZXg+ICZkZXN0KSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgZGVjb21wb3NpdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3Igc29sdmluZywgeW91IG11c3QgZmlyc3QgY2FsbCBlaXRoZXIgY29tcHV0ZSgpIG9yIHN5bWJvbGljKCkvbnVtZXJpYygpIik7CisgICAgICBlaWdlbl9hc3NlcnQobV9tYXRyaXgucm93cygpPT1iLnJvd3MoKSk7CisgICAgICAKKyAgICAgIC8vIHdlIHByb2Nlc3MgdGhlIHNwYXJzZSByaHMgcGVyIGJsb2NrIG9mIE5iQ29sc0F0T25jZSBjb2x1bW5zIHRlbXBvcmFyaWx5IHN0b3JlZCBpbnRvIGEgZGVuc2UgbWF0cml4LgorICAgICAgc3RhdGljIGNvbnN0IGludCBOYkNvbHNBdE9uY2UgPSA0OworICAgICAgaW50IHJoc0NvbHMgPSBiLmNvbHMoKTsKKyAgICAgIGludCBzaXplID0gYi5yb3dzKCk7CisgICAgICBFaWdlbjo6TWF0cml4PERlc3RTY2FsYXIsRHluYW1pYyxEeW5hbWljPiB0bXAoc2l6ZSxyaHNDb2xzKTsKKyAgICAgIGZvcihpbnQgaz0wOyBrPHJoc0NvbHM7IGsrPU5iQ29sc0F0T25jZSkKKyAgICAgIHsKKyAgICAgICAgaW50IGFjdHVhbENvbHMgPSBzdGQ6Om1pbjxpbnQ+KHJoc0NvbHMtaywgTmJDb2xzQXRPbmNlKTsKKyAgICAgICAgdG1wLmxlZnRDb2xzKGFjdHVhbENvbHMpID0gYi5taWRkbGVDb2xzKGssYWN0dWFsQ29scyk7CisgICAgICAgIHRtcC5sZWZ0Q29scyhhY3R1YWxDb2xzKSA9IGRlcml2ZWQoKS5zb2x2ZSh0bXAubGVmdENvbHMoYWN0dWFsQ29scykpOworICAgICAgICBkZXN0Lm1pZGRsZUNvbHMoayxhY3R1YWxDb2xzKSA9IHRtcC5sZWZ0Q29scyhhY3R1YWxDb2xzKS5zcGFyc2VWaWV3KCk7CisgICAgICB9CisgICAgfQorCisjZW5kaWYgLy8gRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworICBwcm90ZWN0ZWQ6CisgICAgCisgICAgLyoqIENvbXB1dGVzIHRoZSBzcGFyc2UgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXggKi8KKyAgICB0ZW1wbGF0ZTxib29sIERvTERMVD4KKyAgICB2b2lkIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtYXRyaXgucm93cygpPT1tYXRyaXguY29scygpKTsKKyAgICAgIEluZGV4IHNpemUgPSBtYXRyaXguY29scygpOworICAgICAgQ2hvbE1hdHJpeFR5cGUgYXAoc2l6ZSxzaXplKTsKKyAgICAgIG9yZGVyaW5nKG1hdHJpeCwgYXApOworICAgICAgYW5hbHl6ZVBhdHRlcm5fcHJlb3JkZXJlZChhcCwgRG9MRExUKTsKKyAgICAgIGZhY3Rvcml6ZV9wcmVvcmRlcmVkPERvTERMVD4oYXApOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTxib29sIERvTERMVD4KKyAgICB2b2lkIGZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBhKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChhLnJvd3MoKT09YS5jb2xzKCkpOworICAgICAgaW50IHNpemUgPSBhLmNvbHMoKTsKKyAgICAgIENob2xNYXRyaXhUeXBlIGFwKHNpemUsc2l6ZSk7CisgICAgICBhcC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBhLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcExvPigpLnR3aXN0ZWRCeShtX1ApOworICAgICAgZmFjdG9yaXplX3ByZW9yZGVyZWQ8RG9MRExUPihhcCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8Ym9vbCBEb0xETFQ+CisgICAgdm9pZCBmYWN0b3JpemVfcHJlb3JkZXJlZChjb25zdCBDaG9sTWF0cml4VHlwZSYgYSk7CisKKyAgICB2b2lkIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdHJpeFR5cGUmIGEsIGJvb2wgZG9MRExUKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChhLnJvd3MoKT09YS5jb2xzKCkpOworICAgICAgaW50IHNpemUgPSBhLmNvbHMoKTsKKyAgICAgIENob2xNYXRyaXhUeXBlIGFwKHNpemUsc2l6ZSk7CisgICAgICBvcmRlcmluZyhhLCBhcCk7CisgICAgICBhbmFseXplUGF0dGVybl9wcmVvcmRlcmVkKGFwLGRvTERMVCk7CisgICAgfQorICAgIHZvaWQgYW5hbHl6ZVBhdHRlcm5fcHJlb3JkZXJlZChjb25zdCBDaG9sTWF0cml4VHlwZSYgYSwgYm9vbCBkb0xETFQpOworICAgIAorICAgIHZvaWQgb3JkZXJpbmcoY29uc3QgTWF0cml4VHlwZSYgYSwgQ2hvbE1hdHJpeFR5cGUmIGFwKTsKKworICAgIC8qKiBrZWVwcyBvZmYtZGlhZ29uYWwgZW50cmllczsgZHJvcHMgZGlhZ29uYWwgZW50cmllcyAqLworICAgIHN0cnVjdCBrZWVwX2RpYWcgeworICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgSW5kZXgmIHJvdywgY29uc3QgSW5kZXgmIGNvbCwgY29uc3QgU2NhbGFyJikgY29uc3QKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHJvdyE9Y29sOworICAgICAgfQorICAgIH07CisKKyAgICBtdXRhYmxlIENvbXB1dGF0aW9uSW5mbyBtX2luZm87CisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtX2ZhY3Rvcml6YXRpb25Jc09rOworICAgIGJvb2wgbV9hbmFseXNpc0lzT2s7CisgICAgCisgICAgQ2hvbE1hdHJpeFR5cGUgbV9tYXRyaXg7CisgICAgVmVjdG9yVHlwZSBtX2RpYWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlhZ29uYWwgY29lZmZpY2llbnRzIChMRExUIG1vZGUpCisgICAgVmVjdG9yWGkgbV9wYXJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGltaW5hdGlvbiB0cmVlCisgICAgVmVjdG9yWGkgbV9ub25aZXJvc1BlckNvbDsKKyAgICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsSW5kZXg+IG1fUDsgICAgIC8vIHRoZSBwZXJtdXRhdGlvbgorICAgIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxJbmRleD4gbV9QaW52OyAgLy8gdGhlIGludmVyc2UgcGVybXV0YXRpb24KKworICAgIFJlYWxTY2FsYXIgbV9zaGlmdE9mZnNldDsKKyAgICBSZWFsU2NhbGFyIG1fc2hpZnRTY2FsZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8gPSBMb3dlcj4gY2xhc3MgU2ltcGxpY2lhbExMVDsKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8gPSBMb3dlcj4gY2xhc3MgU2ltcGxpY2lhbExETFQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvID0gTG93ZXI+IGNsYXNzIFNpbXBsaWNpYWxDaG9sZXNreTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbz4gc3RydWN0IHRyYWl0czxTaW1wbGljaWFsTExUPF9NYXRyaXhUeXBlLF9VcExvPiA+Cit7CisgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4OworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yLCBJbmRleD4gICAgICAgICAgICAgICBDaG9sTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBTcGFyc2VUcmlhbmd1bGFyVmlldzxDaG9sTWF0cml4VHlwZSwgRWlnZW46Okxvd2VyPiAgTWF0cml4TDsKKyAgdHlwZWRlZiBTcGFyc2VUcmlhbmd1bGFyVmlldzx0eXBlbmFtZSBDaG9sTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsIEVpZ2VuOjpVcHBlcj4gICBNYXRyaXhVOworICBzdGF0aWMgaW5saW5lIE1hdHJpeEwgZ2V0TChjb25zdCBNYXRyaXhUeXBlJiBtKSB7IHJldHVybiBtOyB9CisgIHN0YXRpYyBpbmxpbmUgTWF0cml4VSBnZXRVKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIG0uYWRqb2ludCgpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSxpbnQgX1VwTG8+IHN0cnVjdCB0cmFpdHM8U2ltcGxpY2lhbExETFQ8X01hdHJpeFR5cGUsX1VwTG8+ID4KK3sKKyAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICBlbnVtIHsgVXBMbyA9IF9VcExvIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleDsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvciwgSW5kZXg+ICAgICAgICAgICAgICAgICAgIENob2xNYXRyaXhUeXBlOworICB0eXBlZGVmIFNwYXJzZVRyaWFuZ3VsYXJWaWV3PENob2xNYXRyaXhUeXBlLCBFaWdlbjo6VW5pdExvd2VyPiAgTWF0cml4TDsKKyAgdHlwZWRlZiBTcGFyc2VUcmlhbmd1bGFyVmlldzx0eXBlbmFtZSBDaG9sTWF0cml4VHlwZTo6QWRqb2ludFJldHVyblR5cGUsIEVpZ2VuOjpVbml0VXBwZXI+IE1hdHJpeFU7CisgIHN0YXRpYyBpbmxpbmUgTWF0cml4TCBnZXRMKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsgcmV0dXJuIG07IH0KKyAgc3RhdGljIGlubGluZSBNYXRyaXhVIGdldFUoY29uc3QgTWF0cml4VHlwZSYgbSkgeyByZXR1cm4gbS5hZGpvaW50KCk7IH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8+IHN0cnVjdCB0cmFpdHM8U2ltcGxpY2lhbENob2xlc2t5PF9NYXRyaXhUeXBlLF9VcExvPiA+Cit7CisgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworfTsKKworfQorCisvKiogXGluZ3JvdXAgU3BhcnNlQ2hvbGVza3lfTW9kdWxlCisgICogXGNsYXNzIFNpbXBsaWNpYWxMTFQKKyAgKiBcYnJpZWYgQSBkaXJlY3Qgc3BhcnNlIExMVCBDaG9sZXNreSBmYWN0b3JpemF0aW9ucworICAqCisgICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIExMXlQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbnMgb2Ygc3BhcnNlIG1hdHJpY2VzIHRoYXQgYXJlCisgICogc2VsZmFkam9pbnQgYW5kIHBvc2l0aXZlIGRlZmluaXRlLiBUaGUgZmFjdG9yaXphdGlvbiBhbGxvd3MgZm9yIHNvbHZpbmcgQS5YID0gQiB3aGVyZQorICAqIFggYW5kIEIgY2FuIGJlIGVpdGhlciBkZW5zZSBvciBzcGFyc2UuCisgICogCisgICogSW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBmaWxsLWluLCBhIHN5bW1ldHJpYyBwZXJtdXRhdGlvbiBQIGlzIGFwcGxpZWQgcHJpb3IgdG8gdGhlIGZhY3Rvcml6YXRpb24KKyAgKiBzdWNoIHRoYXQgdGhlIGZhY3Rvcml6ZWQgbWF0cml4IGlzIFAgQSBQXi0xLgorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKiBcdHBhcmFtIF9VcExvIHRoZSB0cmlhbmd1bGFyIHBhcnQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBjb21wdXRhdGlvbnMuIEl0IGNhbiBiZSBMb3dlcgorICAqICAgICAgICAgICAgICAgb3IgVXBwZXIuIERlZmF1bHQgaXMgTG93ZXIuCisgICoKKyAgKiBcc2EgY2xhc3MgU2ltcGxpY2lhbExETFQKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCBpbnQgX1VwTG8+CisgICAgY2xhc3MgU2ltcGxpY2lhbExMVCA6IHB1YmxpYyBTaW1wbGljaWFsQ2hvbGVza3lCYXNlPFNpbXBsaWNpYWxMTFQ8X01hdHJpeFR5cGUsX1VwTG8+ID4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIHR5cGVkZWYgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxTaW1wbGljaWFsTExUPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcixJbmRleD4gQ2hvbE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8U2ltcGxpY2lhbExMVD4gVHJhaXRzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpNYXRyaXhMICBNYXRyaXhMOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhaXRzOjpNYXRyaXhVICBNYXRyaXhVOworcHVibGljOgorICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yICovCisgICAgU2ltcGxpY2lhbExMVCgpIDogQmFzZSgpIHt9CisgICAgLyoqIENvbnN0cnVjdHMgYW5kIHBlcmZvcm1zIHRoZSBMTFQgZmFjdG9yaXphdGlvbiBvZiBcYSBtYXRyaXggKi8KKyAgICBTaW1wbGljaWFsTExUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgICAgOiBCYXNlKG1hdHJpeCkge30KKworICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBmYWN0b3IgTCAqLworICAgIGlubGluZSBjb25zdCBNYXRyaXhMIG1hdHJpeEwoKSBjb25zdCB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChCYXNlOjptX2ZhY3Rvcml6YXRpb25Jc09rICYmICJTaW1wbGljaWFsIExMVCBub3QgZmFjdG9yaXplZCIpOworICAgICAgICByZXR1cm4gVHJhaXRzOjpnZXRMKEJhc2U6Om1fbWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZmFjdG9yIFUgKD0gTF4qKSAqLworICAgIGlubGluZSBjb25zdCBNYXRyaXhVIG1hdHJpeFUoKSBjb25zdCB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChCYXNlOjptX2ZhY3Rvcml6YXRpb25Jc09rICYmICJTaW1wbGljaWFsIExMVCBub3QgZmFjdG9yaXplZCIpOworICAgICAgICByZXR1cm4gVHJhaXRzOjpnZXRVKEJhc2U6Om1fbWF0cml4KTsKKyAgICB9CisgICAgCisgICAgLyoqIENvbXB1dGVzIHRoZSBzcGFyc2UgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXggKi8KKyAgICBTaW1wbGljaWFsTExUJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBCYXNlOjp0ZW1wbGF0ZSBjb21wdXRlPGZhbHNlPihtYXRyaXgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBQZXJmb3JtcyBhIHN5bWJvbGljIGRlY29tcG9zaXRpb24gb24gdGhlIHNwYXJjaXR5IG9mIFxhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gc29sdmluZyBmb3Igc2V2ZXJhbCBwcm9ibGVtcyBoYXZpbmcgdGhlIHNhbWUgc3RydWN0dXJlLgorICAgICAgKgorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBhKQorICAgIHsKKyAgICAgIEJhc2U6OmFuYWx5emVQYXR0ZXJuKGEsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKiogUGVyZm9ybXMgYSBudW1lcmljIGRlY29tcG9zaXRpb24gb2YgXGEgbWF0cml4CisgICAgICAqCisgICAgICAqIFRoZSBnaXZlbiBtYXRyaXggbXVzdCBoYXMgdGhlIHNhbWUgc3BhcmNpdHkgdGhhbiB0aGUgbWF0cml4IG9uIHdoaWNoIHRoZSBzeW1ib2xpYyBkZWNvbXBvc2l0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4KKyAgICAgICoKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkKKyAgICAgICovCisgICAgdm9pZCBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgYSkKKyAgICB7CisgICAgICBCYXNlOjp0ZW1wbGF0ZSBmYWN0b3JpemU8ZmFsc2U+KGEpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIHVuZGVybHlpbmcgbWF0cml4IGZyb20gdGhlIGN1cnJlbnQgZmFjdG9yaXphdGlvbiAqLworICAgIFNjYWxhciBkZXRlcm1pbmFudCgpIGNvbnN0CisgICAgeworICAgICAgU2NhbGFyIGRldEwgPSBCYXNlOjptX21hdHJpeC5kaWFnb25hbCgpLnByb2QoKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6YWJzMihkZXRMKTsKKyAgICB9Cit9OworCisvKiogXGluZ3JvdXAgU3BhcnNlQ2hvbGVza3lfTW9kdWxlCisgICogXGNsYXNzIFNpbXBsaWNpYWxMRExUCisgICogXGJyaWVmIEEgZGlyZWN0IHNwYXJzZSBMRExUIENob2xlc2t5IGZhY3Rvcml6YXRpb25zIHdpdGhvdXQgc3F1YXJlIHJvb3QuCisgICoKKyAgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgTERMXlQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbnMgd2l0aG91dCBzcXVhcmUgcm9vdCBvZiBzcGFyc2UgbWF0cmljZXMgdGhhdCBhcmUKKyAgKiBzZWxmYWRqb2ludCBhbmQgcG9zaXRpdmUgZGVmaW5pdGUuIFRoZSBmYWN0b3JpemF0aW9uIGFsbG93cyBmb3Igc29sdmluZyBBLlggPSBCIHdoZXJlCisgICogWCBhbmQgQiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKiAKKyAgKiBJbiBvcmRlciB0byByZWR1Y2UgdGhlIGZpbGwtaW4sIGEgc3ltbWV0cmljIHBlcm11dGF0aW9uIFAgaXMgYXBwbGllZCBwcmlvciB0byB0aGUgZmFjdG9yaXphdGlvbgorICAqIHN1Y2ggdGhhdCB0aGUgZmFjdG9yaXplZCBtYXRyaXggaXMgUCBBIFBeLTEuCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIGl0IG11c3QgYmUgYSBTcGFyc2VNYXRyaXg8PgorICAqIFx0cGFyYW0gX1VwTG8gdGhlIHRyaWFuZ3VsYXIgcGFydCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGNvbXB1dGF0aW9ucy4gSXQgY2FuIGJlIExvd2VyCisgICogICAgICAgICAgICAgICBvciBVcHBlci4gRGVmYXVsdCBpcyBMb3dlci4KKyAgKgorICAqIFxzYSBjbGFzcyBTaW1wbGljaWFsTExUCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgaW50IF9VcExvPgorICAgIGNsYXNzIFNpbXBsaWNpYWxMRExUIDogcHVibGljIFNpbXBsaWNpYWxDaG9sZXNreUJhc2U8U2ltcGxpY2lhbExETFQ8X01hdHJpeFR5cGUsX1VwTG8+ID4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIHR5cGVkZWYgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxTaW1wbGljaWFsTERMVD4gQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsQ29sTWFqb3IsSW5kZXg+IENob2xNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFNpbXBsaWNpYWxMRExUPiBUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6Ok1hdHJpeEwgIE1hdHJpeEw7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6Ok1hdHJpeFUgIE1hdHJpeFU7CitwdWJsaWM6CisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgKi8KKyAgICBTaW1wbGljaWFsTERMVCgpIDogQmFzZSgpIHt9CisKKyAgICAvKiogQ29uc3RydWN0cyBhbmQgcGVyZm9ybXMgdGhlIExMVCBmYWN0b3JpemF0aW9uIG9mIFxhIG1hdHJpeCAqLworICAgIFNpbXBsaWNpYWxMRExUKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICAgICAgOiBCYXNlKG1hdHJpeCkge30KKworICAgIC8qKiBccmV0dXJucyBhIHZlY3RvciBleHByZXNzaW9uIG9mIHRoZSBkaWFnb25hbCBEICovCisgICAgaW5saW5lIGNvbnN0IFZlY3RvclR5cGUgdmVjdG9yRCgpIGNvbnN0IHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KEJhc2U6Om1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlNpbXBsaWNpYWwgTERMVCBub3QgZmFjdG9yaXplZCIpOworICAgICAgICByZXR1cm4gQmFzZTo6bV9kaWFnOworICAgIH0KKyAgICAvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZmFjdG9yIEwgKi8KKyAgICBpbmxpbmUgY29uc3QgTWF0cml4TCBtYXRyaXhMKCkgY29uc3QgeworICAgICAgICBlaWdlbl9hc3NlcnQoQmFzZTo6bV9mYWN0b3JpemF0aW9uSXNPayAmJiAiU2ltcGxpY2lhbCBMRExUIG5vdCBmYWN0b3JpemVkIik7CisgICAgICAgIHJldHVybiBUcmFpdHM6OmdldEwoQmFzZTo6bV9tYXRyaXgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBmYWN0b3IgVSAoPSBMXiopICovCisgICAgaW5saW5lIGNvbnN0IE1hdHJpeFUgbWF0cml4VSgpIGNvbnN0IHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KEJhc2U6Om1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlNpbXBsaWNpYWwgTERMVCBub3QgZmFjdG9yaXplZCIpOworICAgICAgICByZXR1cm4gVHJhaXRzOjpnZXRVKEJhc2U6Om1fbWF0cml4KTsKKyAgICB9CisKKyAgICAvKiogQ29tcHV0ZXMgdGhlIHNwYXJzZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeCAqLworICAgIFNpbXBsaWNpYWxMRExUJiBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBCYXNlOjp0ZW1wbGF0ZSBjb21wdXRlPHRydWU+KG1hdHJpeCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAgIC8qKiBQZXJmb3JtcyBhIHN5bWJvbGljIGRlY29tcG9zaXRpb24gb24gdGhlIHNwYXJjaXR5IG9mIFxhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gc29sdmluZyBmb3Igc2V2ZXJhbCBwcm9ibGVtcyBoYXZpbmcgdGhlIHNhbWUgc3RydWN0dXJlLgorICAgICAgKgorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBhKQorICAgIHsKKyAgICAgIEJhc2U6OmFuYWx5emVQYXR0ZXJuKGEsIHRydWUpOworICAgIH0KKworICAgIC8qKiBQZXJmb3JtcyBhIG51bWVyaWMgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXgKKyAgICAgICoKKyAgICAgICogVGhlIGdpdmVuIG1hdHJpeCBtdXN0IGhhcyB0aGUgc2FtZSBzcGFyY2l0eSB0aGFuIHRoZSBtYXRyaXggb24gd2hpY2ggdGhlIHN5bWJvbGljIGRlY29tcG9zaXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkLgorICAgICAgKgorICAgICAgKiBcc2EgYW5hbHl6ZVBhdHRlcm4oKQorICAgICAgKi8KKyAgICB2b2lkIGZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBhKQorICAgIHsKKyAgICAgIEJhc2U6OnRlbXBsYXRlIGZhY3Rvcml6ZTx0cnVlPihhKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoZSB1bmRlcmx5aW5nIG1hdHJpeCBmcm9tIHRoZSBjdXJyZW50IGZhY3Rvcml6YXRpb24gKi8KKyAgICBTY2FsYXIgZGV0ZXJtaW5hbnQoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBCYXNlOjptX2RpYWcucHJvZCgpOworICAgIH0KK307CisKKy8qKiBcZGVwcmVjYXRlZCB1c2UgU2ltcGxpY2lhbExETFQgb3IgY2xhc3MgU2ltcGxpY2lhbExMVAorICAqIFxpbmdyb3VwIFNwYXJzZUNob2xlc2t5X01vZHVsZQorICAqIFxjbGFzcyBTaW1wbGljaWFsQ2hvbGVza3kKKyAgKgorICAqIFxzYSBjbGFzcyBTaW1wbGljaWFsTERMVCwgY2xhc3MgU2ltcGxpY2lhbExMVAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIGludCBfVXBMbz4KKyAgICBjbGFzcyBTaW1wbGljaWFsQ2hvbGVza3kgOiBwdWJsaWMgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxTaW1wbGljaWFsQ2hvbGVza3k8X01hdHJpeFR5cGUsX1VwTG8+ID4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgZW51bSB7IFVwTG8gPSBfVXBMbyB9OworICAgIHR5cGVkZWYgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxTaW1wbGljaWFsQ2hvbGVza3k+IEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yLEluZGV4PiBDaG9sTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxTaW1wbGljaWFsQ2hvbGVza3k+IFRyYWl0czsKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8U2ltcGxpY2lhbExETFQ8TWF0cml4VHlwZSxVcExvPiA+IExETFRUcmFpdHM7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFNpbXBsaWNpYWxMTFQ8TWF0cml4VHlwZSxVcExvPiAgPiBMTFRUcmFpdHM7CisgIHB1YmxpYzoKKyAgICBTaW1wbGljaWFsQ2hvbGVza3koKSA6IEJhc2UoKSwgbV9MRExUKHRydWUpIHt9CisKKyAgICBTaW1wbGljaWFsQ2hvbGVza3koY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBCYXNlKCksIG1fTERMVCh0cnVlKQorICAgIHsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICBTaW1wbGljaWFsQ2hvbGVza3kmIHNldE1vZGUoU2ltcGxpY2lhbENob2xlc2t5TW9kZSBtb2RlKQorICAgIHsKKyAgICAgIHN3aXRjaChtb2RlKQorICAgICAgeworICAgICAgY2FzZSBTaW1wbGljaWFsQ2hvbGVza3lMTFQ6CisgICAgICAgIG1fTERMVCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU2ltcGxpY2lhbENob2xlc2t5TERMVDoKKyAgICAgICAgbV9MRExUID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBWZWN0b3JUeXBlIHZlY3RvckQoKSBjb25zdCB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChCYXNlOjptX2ZhY3Rvcml6YXRpb25Jc09rICYmICJTaW1wbGljaWFsIENob2xlc2t5IG5vdCBmYWN0b3JpemVkIik7CisgICAgICAgIHJldHVybiBCYXNlOjptX2RpYWc7CisgICAgfQorICAgIGlubGluZSBjb25zdCBDaG9sTWF0cml4VHlwZSByYXdNYXRyaXgoKSBjb25zdCB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChCYXNlOjptX2ZhY3Rvcml6YXRpb25Jc09rICYmICJTaW1wbGljaWFsIENob2xlc2t5IG5vdCBmYWN0b3JpemVkIik7CisgICAgICAgIHJldHVybiBCYXNlOjptX21hdHJpeDsKKyAgICB9CisgICAgCisgICAgLyoqIENvbXB1dGVzIHRoZSBzcGFyc2UgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBcYSBtYXRyaXggKi8KKyAgICBTaW1wbGljaWFsQ2hvbGVza3kmIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIGlmKG1fTERMVCkKKyAgICAgICAgQmFzZTo6dGVtcGxhdGUgY29tcHV0ZTx0cnVlPihtYXRyaXgpOworICAgICAgZWxzZQorICAgICAgICBCYXNlOjp0ZW1wbGF0ZSBjb21wdXRlPGZhbHNlPihtYXRyaXgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBQZXJmb3JtcyBhIHN5bWJvbGljIGRlY29tcG9zaXRpb24gb24gdGhlIHNwYXJjaXR5IG9mIFxhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gc29sdmluZyBmb3Igc2V2ZXJhbCBwcm9ibGVtcyBoYXZpbmcgdGhlIHNhbWUgc3RydWN0dXJlLgorICAgICAgKgorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBhKQorICAgIHsKKyAgICAgIEJhc2U6OmFuYWx5emVQYXR0ZXJuKGEsIG1fTERMVCk7CisgICAgfQorCisgICAgLyoqIFBlcmZvcm1zIGEgbnVtZXJpYyBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUaGUgZ2l2ZW4gbWF0cml4IG11c3QgaGFzIHRoZSBzYW1lIHNwYXJjaXR5IHRoYW4gdGhlIG1hdHJpeCBvbiB3aGljaCB0aGUgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICAgICAqCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpCisgICAgICAqLworICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIGEpCisgICAgeworICAgICAgaWYobV9MRExUKQorICAgICAgICBCYXNlOjp0ZW1wbGF0ZSBmYWN0b3JpemU8dHJ1ZT4oYSk7CisgICAgICBlbHNlCisgICAgICAgIEJhc2U6OnRlbXBsYXRlIGZhY3Rvcml6ZTxmYWxzZT4oYSk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiAmYiwgTWF0cml4QmFzZTxEZXN0PiAmZGVzdCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoQmFzZTo6bV9mYWN0b3JpemF0aW9uSXNPayAmJiAiVGhlIGRlY29tcG9zaXRpb24gaXMgbm90IGluIGEgdmFsaWQgc3RhdGUgZm9yIHNvbHZpbmcsIHlvdSBtdXN0IGZpcnN0IGNhbGwgZWl0aGVyIGNvbXB1dGUoKSBvciBzeW1ib2xpYygpL251bWVyaWMoKSIpOworICAgICAgZWlnZW5fYXNzZXJ0KEJhc2U6Om1fbWF0cml4LnJvd3MoKT09Yi5yb3dzKCkpOworCisgICAgICBpZihCYXNlOjptX2luZm8hPVN1Y2Nlc3MpCisgICAgICAgIHJldHVybjsKKworICAgICAgaWYoQmFzZTo6bV9QLnNpemUoKT4wKQorICAgICAgICBkZXN0ID0gQmFzZTo6bV9QICogYjsKKyAgICAgIGVsc2UKKyAgICAgICAgZGVzdCA9IGI7CisKKyAgICAgIGlmKEJhc2U6Om1fbWF0cml4Lm5vblplcm9zKCk+MCkgLy8gb3RoZXJ3aXNlIEw9PUkKKyAgICAgIHsKKyAgICAgICAgaWYobV9MRExUKQorICAgICAgICAgIExETFRUcmFpdHM6OmdldEwoQmFzZTo6bV9tYXRyaXgpLnNvbHZlSW5QbGFjZShkZXN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIExMVFRyYWl0czo6Z2V0TChCYXNlOjptX21hdHJpeCkuc29sdmVJblBsYWNlKGRlc3QpOworICAgICAgfQorCisgICAgICBpZihCYXNlOjptX2RpYWcuc2l6ZSgpPjApCisgICAgICAgIGRlc3QgPSBCYXNlOjptX2RpYWcuYXNEaWFnb25hbCgpLmludmVyc2UoKSAqIGRlc3Q7CisKKyAgICAgIGlmIChCYXNlOjptX21hdHJpeC5ub25aZXJvcygpPjApIC8vIG90aGVyd2lzZSBJPT1JCisgICAgICB7CisgICAgICAgIGlmKG1fTERMVCkKKyAgICAgICAgICBMRExUVHJhaXRzOjpnZXRVKEJhc2U6Om1fbWF0cml4KS5zb2x2ZUluUGxhY2UoZGVzdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBMTFRUcmFpdHM6OmdldFUoQmFzZTo6bV9tYXRyaXgpLnNvbHZlSW5QbGFjZShkZXN0KTsKKyAgICAgIH0KKworICAgICAgaWYoQmFzZTo6bV9QLnNpemUoKT4wKQorICAgICAgICBkZXN0ID0gQmFzZTo6bV9QaW52ICogZGVzdDsKKyAgICB9CisgICAgCisgICAgU2NhbGFyIGRldGVybWluYW50KCkgY29uc3QKKyAgICB7CisgICAgICBpZihtX0xETFQpCisgICAgICB7CisgICAgICAgIHJldHVybiBCYXNlOjptX2RpYWcucHJvZCgpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBTY2FsYXIgZGV0TCA9IERpYWdvbmFsPGNvbnN0IENob2xNYXRyaXhUeXBlPihCYXNlOjptX21hdHJpeCkucHJvZCgpOworICAgICAgICByZXR1cm4gaW50ZXJuYWw6OmFiczIoZGV0TCk7CisgICAgICB9CisgICAgfQorICAgIAorICBwcm90ZWN0ZWQ6CisgICAgYm9vbCBtX0xETFQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordm9pZCBTaW1wbGljaWFsQ2hvbGVza3lCYXNlPERlcml2ZWQ+OjpvcmRlcmluZyhjb25zdCBNYXRyaXhUeXBlJiBhLCBDaG9sTWF0cml4VHlwZSYgYXApCit7CisgIGVpZ2VuX2Fzc2VydChhLnJvd3MoKT09YS5jb2xzKCkpOworICBjb25zdCBJbmRleCBzaXplID0gYS5yb3dzKCk7CisgIC8vIFRPRE8gYWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgcGVybXV0YXRpb24KKyAgLy8gTm90ZSB0aGF0IGFtZCBjb21wdXRlIHRoZSBpbnZlcnNlIHBlcm11dGF0aW9uCisgIHsKKyAgICBDaG9sTWF0cml4VHlwZSBDOworICAgIEMgPSBhLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcExvPigpOworICAgIC8vIHJlbW92ZSBkaWFnb25hbCBlbnRyaWVzOgorICAgIC8vIHNlZW1zIG5vdCB0byBiZSBuZWVkZWQKKyAgICAvLyBDLnBydW5lKGtlZXBfZGlhZygpKTsKKyAgICBpbnRlcm5hbDo6bWluaW11bV9kZWdyZWVfb3JkZXJpbmcoQywgbV9QaW52KTsKKyAgfQorCisgIGlmKG1fUGludi5zaXplKCk+MCkKKyAgICBtX1AgPSBtX1BpbnYuaW52ZXJzZSgpOworICBlbHNlCisgICAgbV9QLnJlc2l6ZSgwKTsKKworICBhcC5yZXNpemUoc2l6ZSxzaXplKTsKKyAgYXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gYS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBMbz4oKS50d2lzdGVkQnkobV9QKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3ZvaWQgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxEZXJpdmVkPjo6YW5hbHl6ZVBhdHRlcm5fcHJlb3JkZXJlZChjb25zdCBDaG9sTWF0cml4VHlwZSYgYXAsIGJvb2wgZG9MRExUKQoreworICBjb25zdCBJbmRleCBzaXplID0gYXAucm93cygpOworICBtX21hdHJpeC5yZXNpemUoc2l6ZSwgc2l6ZSk7CisgIG1fcGFyZW50LnJlc2l6ZShzaXplKTsKKyAgbV9ub25aZXJvc1BlckNvbC5yZXNpemUoc2l6ZSk7CisgIAorICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoSW5kZXgsIHRhZ3MsIHNpemUsIDApOworCisgIGZvcihJbmRleCBrID0gMDsgayA8IHNpemU7ICsraykKKyAgeworICAgIC8qIEwoayw6KSBwYXR0ZXJuOiBhbGwgbm9kZXMgcmVhY2hhYmxlIGluIGV0cmVlIGZyb20gbnogaW4gQSgwOmstMSxrKSAqLworICAgIG1fcGFyZW50W2tdID0gLTE7ICAgICAgICAgICAgIC8qIHBhcmVudCBvZiBrIGlzIG5vdCB5ZXQga25vd24gKi8KKyAgICB0YWdzW2tdID0gazsgICAgICAgICAgICAgICAgICAvKiBtYXJrIG5vZGUgayBhcyB2aXNpdGVkICovCisgICAgbV9ub25aZXJvc1BlckNvbFtrXSA9IDA7ICAgICAgLyogY291bnQgb2Ygbm9uemVyb3MgaW4gY29sdW1uIGsgb2YgTCAqLworICAgIGZvcih0eXBlbmFtZSBDaG9sTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChhcCxrKTsgaXQ7ICsraXQpCisgICAgeworICAgICAgSW5kZXggaSA9IGl0LmluZGV4KCk7CisgICAgICBpZihpIDwgaykKKyAgICAgIHsKKyAgICAgICAgLyogZm9sbG93IHBhdGggZnJvbSBpIHRvIHJvb3Qgb2YgZXRyZWUsIHN0b3AgYXQgZmxhZ2dlZCBub2RlICovCisgICAgICAgIGZvcig7IHRhZ3NbaV0gIT0gazsgaSA9IG1fcGFyZW50W2ldKQorICAgICAgICB7CisgICAgICAgICAgLyogZmluZCBwYXJlbnQgb2YgaSBpZiBub3QgeWV0IGRldGVybWluZWQgKi8KKyAgICAgICAgICBpZiAobV9wYXJlbnRbaV0gPT0gLTEpCisgICAgICAgICAgICBtX3BhcmVudFtpXSA9IGs7CisgICAgICAgICAgbV9ub25aZXJvc1BlckNvbFtpXSsrOyAgICAgICAgLyogTCAoayxpKSBpcyBub256ZXJvICovCisgICAgICAgICAgdGFnc1tpXSA9IGs7ICAgICAgICAgICAgICAgICAgLyogbWFyayBpIGFzIHZpc2l0ZWQgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyogY29uc3RydWN0IExwIGluZGV4IGFycmF5IGZyb20gbV9ub25aZXJvc1BlckNvbCBjb2x1bW4gY291bnRzICovCisgIEluZGV4KiBMcCA9IG1fbWF0cml4Lm91dGVySW5kZXhQdHIoKTsKKyAgTHBbMF0gPSAwOworICBmb3IoSW5kZXggayA9IDA7IGsgPCBzaXplOyArK2spCisgICAgTHBbaysxXSA9IExwW2tdICsgbV9ub25aZXJvc1BlckNvbFtrXSArIChkb0xETFQgPyAwIDogMSk7CisKKyAgbV9tYXRyaXgucmVzaXplTm9uWmVyb3MoTHBbc2l6ZV0pOworICAKKyAgbV9pc0luaXRpYWxpemVkICAgICA9IHRydWU7CisgIG1faW5mbyAgICAgICAgICAgICAgPSBTdWNjZXNzOworICBtX2FuYWx5c2lzSXNPayAgICAgID0gdHJ1ZTsKKyAgbV9mYWN0b3JpemF0aW9uSXNPayA9IGZhbHNlOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxib29sIERvTERMVD4KK3ZvaWQgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxEZXJpdmVkPjo6ZmFjdG9yaXplX3ByZW9yZGVyZWQoY29uc3QgQ2hvbE1hdHJpeFR5cGUmIGFwKQoreworICBlaWdlbl9hc3NlcnQobV9hbmFseXNpc0lzT2sgJiYgIllvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOworICBlaWdlbl9hc3NlcnQoYXAucm93cygpPT1hcC5jb2xzKCkpOworICBjb25zdCBJbmRleCBzaXplID0gYXAucm93cygpOworICBlaWdlbl9hc3NlcnQobV9wYXJlbnQuc2l6ZSgpPT1zaXplKTsKKyAgZWlnZW5fYXNzZXJ0KG1fbm9uWmVyb3NQZXJDb2wuc2l6ZSgpPT1zaXplKTsKKworICBjb25zdCBJbmRleCogTHAgPSBtX21hdHJpeC5vdXRlckluZGV4UHRyKCk7CisgIEluZGV4KiBMaSA9IG1fbWF0cml4LmlubmVySW5kZXhQdHIoKTsKKyAgU2NhbGFyKiBMeCA9IG1fbWF0cml4LnZhbHVlUHRyKCk7CisKKyAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKFNjYWxhciwgeSwgc2l6ZSwgMCk7CisgIGVpX2RlY2xhcmVfYWxpZ25lZF9zdGFja19jb25zdHJ1Y3RlZF92YXJpYWJsZShJbmRleCwgIHBhdHRlcm4sIHNpemUsIDApOworICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoSW5kZXgsICB0YWdzLCBzaXplLCAwKTsKKyAgCisgIGJvb2wgb2sgPSB0cnVlOworICBtX2RpYWcucmVzaXplKERvTERMVCA/IHNpemUgOiAwKTsKKyAgCisgIGZvcihJbmRleCBrID0gMDsgayA8IHNpemU7ICsraykKKyAgeworICAgIC8vIGNvbXB1dGUgbm9uemVybyBwYXR0ZXJuIG9mIGt0aCByb3cgb2YgTCwgaW4gdG9wb2xvZ2ljYWwgb3JkZXIKKyAgICB5W2tdID0gMC4wOyAgICAgICAgICAgICAgICAgICAgIC8vIFkoMDprKSBpcyBub3cgYWxsIHplcm8KKyAgICBJbmRleCB0b3AgPSBzaXplOyAgICAgICAgICAgICAgIC8vIHN0YWNrIGZvciBwYXR0ZXJuIGlzIGVtcHR5CisgICAgdGFnc1trXSA9IGs7ICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIG5vZGUgayBhcyB2aXNpdGVkCisgICAgbV9ub25aZXJvc1BlckNvbFtrXSA9IDA7ICAgICAgICAvLyBjb3VudCBvZiBub256ZXJvcyBpbiBjb2x1bW4gayBvZiBMCisgICAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQoYXAsayk7IGl0OyArK2l0KQorICAgIHsKKyAgICAgIEluZGV4IGkgPSBpdC5pbmRleCgpOworICAgICAgaWYoaSA8PSBrKQorICAgICAgeworICAgICAgICB5W2ldICs9IGludGVybmFsOjpjb25qKGl0LnZhbHVlKCkpOyAgICAgICAgICAgIC8qIHNjYXR0ZXIgQShpLGspIGludG8gWSAoc3VtIGR1cGxpY2F0ZXMpICovCisgICAgICAgIEluZGV4IGxlbjsKKyAgICAgICAgZm9yKGxlbiA9IDA7IHRhZ3NbaV0gIT0gazsgaSA9IG1fcGFyZW50W2ldKQorICAgICAgICB7CisgICAgICAgICAgcGF0dGVybltsZW4rK10gPSBpOyAgICAgLyogTChrLGkpIGlzIG5vbnplcm8gKi8KKyAgICAgICAgICB0YWdzW2ldID0gazsgICAgICAgICAgICAvKiBtYXJrIGkgYXMgdmlzaXRlZCAqLworICAgICAgICB9CisgICAgICAgIHdoaWxlKGxlbiA+IDApCisgICAgICAgICAgcGF0dGVyblstLXRvcF0gPSBwYXR0ZXJuWy0tbGVuXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjb21wdXRlIG51bWVyaWNhbCB2YWx1ZXMga3RoIHJvdyBvZiBMIChhIHNwYXJzZSB0cmlhbmd1bGFyIHNvbHZlKSAqLworCisgICAgUmVhbFNjYWxhciBkID0gaW50ZXJuYWw6OnJlYWwoeVtrXSkgKiBtX3NoaWZ0U2NhbGUgKyBtX3NoaWZ0T2Zmc2V0OyAgICAvLyBnZXQgRChrLGspLCBhcHBseSB0aGUgc2hpZnQgZnVuY3Rpb24sIGFuZCBjbGVhciBZKGspCisgICAgeVtrXSA9IDAuMDsKKyAgICBmb3IoOyB0b3AgPCBzaXplOyArK3RvcCkKKyAgICB7CisgICAgICBJbmRleCBpID0gcGF0dGVyblt0b3BdOyAgICAgICAvKiBwYXR0ZXJuW3RvcDpuLTFdIGlzIHBhdHRlcm4gb2YgTCg6LGspICovCisgICAgICBTY2FsYXIgeWkgPSB5W2ldOyAgICAgICAgICAgICAvKiBnZXQgYW5kIGNsZWFyIFkoaSkgKi8KKyAgICAgIHlbaV0gPSAwLjA7CisgICAgICAKKyAgICAgIC8qIHRoZSBub256ZXJvIGVudHJ5IEwoayxpKSAqLworICAgICAgU2NhbGFyIGxfa2k7CisgICAgICBpZihEb0xETFQpCisgICAgICAgIGxfa2kgPSB5aSAvIG1fZGlhZ1tpXTsgICAgICAgCisgICAgICBlbHNlCisgICAgICAgIHlpID0gbF9raSA9IHlpIC8gTHhbTHBbaV1dOworICAgICAgCisgICAgICBJbmRleCBwMiA9IExwW2ldICsgbV9ub25aZXJvc1BlckNvbFtpXTsKKyAgICAgIEluZGV4IHA7CisgICAgICBmb3IocCA9IExwW2ldICsgKERvTERMVCA/IDAgOiAxKTsgcCA8IHAyOyArK3ApCisgICAgICAgIHlbTGlbcF1dIC09IGludGVybmFsOjpjb25qKEx4W3BdKSAqIHlpOworICAgICAgZCAtPSBpbnRlcm5hbDo6cmVhbChsX2tpICogaW50ZXJuYWw6OmNvbmooeWkpKTsKKyAgICAgIExpW3BdID0gazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIEwoayxpKSBpbiBjb2x1bW4gZm9ybSBvZiBMICovCisgICAgICBMeFtwXSA9IGxfa2k7CisgICAgICArK21fbm9uWmVyb3NQZXJDb2xbaV07ICAgICAgICAgICAgICAvKiBpbmNyZW1lbnQgY291bnQgb2Ygbm9uemVyb3MgaW4gY29sIGkgKi8KKyAgICB9CisgICAgaWYoRG9MRExUKQorICAgIHsKKyAgICAgIG1fZGlhZ1trXSA9IGQ7CisgICAgICBpZihkID09IFJlYWxTY2FsYXIoMCkpCisgICAgICB7CisgICAgICAgIG9rID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhaWx1cmUsIEQoayxrKSBpcyB6ZXJvICovCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgSW5kZXggcCA9IExwW2tdICsgbV9ub25aZXJvc1BlckNvbFtrXSsrOworICAgICAgTGlbcF0gPSBrIDsgICAgICAgICAgICAgICAgLyogc3RvcmUgTChrLGspID0gc3FydCAoZCkgaW4gY29sdW1uIGsgKi8KKyAgICAgIGlmKGQgPD0gUmVhbFNjYWxhcigwKSkgeworICAgICAgICBvayA9IGZhbHNlOyAgICAgICAgICAgICAgLyogZmFpbHVyZSwgbWF0cml4IGlzIG5vdCBwb3NpdGl2ZSBkZWZpbml0ZSAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEx4W3BdID0gaW50ZXJuYWw6OnNxcnQoZCkgOworICAgIH0KKyAgfQorCisgIG1faW5mbyA9IG9rID8gU3VjY2VzcyA6IE51bWVyaWNhbElzc3VlOworICBtX2ZhY3Rvcml6YXRpb25Jc09rID0gdHJ1ZTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3Qgc29sdmVfcmV0dmFsPFNpbXBsaWNpYWxDaG9sZXNreUJhc2U8RGVyaXZlZD4sIFJocz4KKyAgOiBzb2x2ZV9yZXR2YWxfYmFzZTxTaW1wbGljaWFsQ2hvbGVza3lCYXNlPERlcml2ZWQ+LCBSaHM+Cit7CisgIHR5cGVkZWYgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxEZXJpdmVkPiBEZWM7CisgIEVJR0VOX01BS0VfU09MVkVfSEVMUEVSUyhEZWMsUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGRlYygpLmRlcml2ZWQoKS5fc29sdmUocmhzKCksZHN0KTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNwYXJzZV9zb2x2ZV9yZXR2YWw8U2ltcGxpY2lhbENob2xlc2t5QmFzZTxEZXJpdmVkPiwgUmhzPgorICA6IHNwYXJzZV9zb2x2ZV9yZXR2YWxfYmFzZTxTaW1wbGljaWFsQ2hvbGVza3lCYXNlPERlcml2ZWQ+LCBSaHM+Cit7CisgIHR5cGVkZWYgU2ltcGxpY2lhbENob2xlc2t5QmFzZTxEZXJpdmVkPiBEZWM7CisgIEVJR0VOX01BS0VfU1BBUlNFX1NPTFZFX0hFTFBFUlMoRGVjLFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBkZWMoKS5kZXJpdmVkKCkuX3NvbHZlX3NwYXJzZShyaHMoKSxkc3QpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TSU1QTElDSUFMX0NIT0xFU0tZX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0FtYmlWZWN0b3IuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0FtYmlWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2ZhYWRiCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvQW1iaVZlY3Rvci5oCkBAIC0wLDAgKzEsMzcxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQU1CSVZFQ1RPUl9ICisjZGVmaW5lIEVJR0VOX0FNQklWRUNUT1JfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbAorICAqIEh5YnJpZCBzcGFyc2UvZGVuc2UgdmVjdG9yIGNsYXNzIGRlc2lnbmVkIGZvciBpbnRlbnNpdmUgcmVhZC13cml0ZSBvcGVyYXRpb25zLgorICAqCisgICogU2VlIEJhc2ljU3BhcnNlTExUIGFuZCBTcGFyc2VQcm9kdWN0IGZvciB1c2FnZSBleGFtcGxlcy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIHR5cGVuYW1lIF9JbmRleD4KK2NsYXNzIEFtYmlWZWN0b3IKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBfSW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgQW1iaVZlY3RvcihJbmRleCBzaXplKQorICAgICAgOiBtX2J1ZmZlcigwKSwgbV96ZXJvKDApLCBtX3NpemUoMCksIG1fYWxsb2NhdGVkU2l6ZSgwKSwgbV9hbGxvY2F0ZWRFbGVtZW50cygwKSwgbV9tb2RlKC0xKQorICAgIHsKKyAgICAgIHJlc2l6ZShzaXplKTsKKyAgICB9CisKKyAgICB2b2lkIGluaXQoZG91YmxlIGVzdGltYXRlZERlbnNpdHkpOworICAgIHZvaWQgaW5pdChpbnQgbW9kZSk7CisKKyAgICBJbmRleCBub25aZXJvcygpIGNvbnN0OworCisgICAgLyoqIFNwZWNpZmllcyBhIHN1Yi12ZWN0b3IgdG8gd29yayBvbiAqLworICAgIHZvaWQgc2V0Qm91bmRzKEluZGV4IHN0YXJ0LCBJbmRleCBlbmQpIHsgbV9zdGFydCA9IHN0YXJ0OyBtX2VuZCA9IGVuZDsgfQorCisgICAgdm9pZCBzZXRaZXJvKCk7CisKKyAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICBTY2FsYXImIGNvZWZmUmVmKEluZGV4IGkpOworICAgIFNjYWxhciYgY29lZmYoSW5kZXggaSk7CisKKyAgICBjbGFzcyBJdGVyYXRvcjsKKworICAgIH5BbWJpVmVjdG9yKCkgeyBkZWxldGVbXSBtX2J1ZmZlcjsgfQorCisgICAgdm9pZCByZXNpemUoSW5kZXggc2l6ZSkKKyAgICB7CisgICAgICBpZiAobV9hbGxvY2F0ZWRTaXplIDwgc2l6ZSkKKyAgICAgICAgcmVhbGxvY2F0ZShzaXplKTsKKyAgICAgIG1fc2l6ZSA9IHNpemU7CisgICAgfQorCisgICAgSW5kZXggc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorCisgIHByb3RlY3RlZDoKKworICAgIHZvaWQgcmVhbGxvY2F0ZShJbmRleCBzaXplKQorICAgIHsKKyAgICAgIC8vIGlmIHRoZSBzaXplIG9mIHRoZSBtYXRyaXggaXMgbm90IHRvbyBsYXJnZSwgbGV0J3MgYWxsb2NhdGUgYSBiaXQgbW9yZSB0aGFuIG5lZWRlZCBzdWNoCisgICAgICAvLyB0aGF0IHdlIGNhbiBoYW5kbGUgZGVuc2UgdmVjdG9yIGV2ZW4gaW4gc3BhcnNlIG1vZGUuCisgICAgICBkZWxldGVbXSBtX2J1ZmZlcjsKKyAgICAgIGlmIChzaXplPDEwMDApCisgICAgICB7CisgICAgICAgIEluZGV4IGFsbG9jU2l6ZSA9IChzaXplICogc2l6ZW9mKExpc3RFbCkpL3NpemVvZihTY2FsYXIpOworICAgICAgICBtX2FsbG9jYXRlZEVsZW1lbnRzID0gKGFsbG9jU2l6ZSpzaXplb2YoU2NhbGFyKSkvc2l6ZW9mKExpc3RFbCk7CisgICAgICAgIG1fYnVmZmVyID0gbmV3IFNjYWxhclthbGxvY1NpemVdOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtX2FsbG9jYXRlZEVsZW1lbnRzID0gKHNpemUqc2l6ZW9mKFNjYWxhcikpL3NpemVvZihMaXN0RWwpOworICAgICAgICBtX2J1ZmZlciA9IG5ldyBTY2FsYXJbc2l6ZV07CisgICAgICB9CisgICAgICBtX3NpemUgPSBzaXplOworICAgICAgbV9zdGFydCA9IDA7CisgICAgICBtX2VuZCA9IG1fc2l6ZTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWxsb2NhdGVTcGFyc2UoKQorICAgIHsKKyAgICAgIEluZGV4IGNvcHlFbGVtZW50cyA9IG1fYWxsb2NhdGVkRWxlbWVudHM7CisgICAgICBtX2FsbG9jYXRlZEVsZW1lbnRzID0gKHN0ZDo6bWluKShJbmRleChtX2FsbG9jYXRlZEVsZW1lbnRzKjEuNSksbV9zaXplKTsKKyAgICAgIEluZGV4IGFsbG9jU2l6ZSA9IG1fYWxsb2NhdGVkRWxlbWVudHMgKiBzaXplb2YoTGlzdEVsKTsKKyAgICAgIGFsbG9jU2l6ZSA9IGFsbG9jU2l6ZS9zaXplb2YoU2NhbGFyKSArIChhbGxvY1NpemUlc2l6ZW9mKFNjYWxhcik+MD8xOjApOworICAgICAgU2NhbGFyKiBuZXdCdWZmZXIgPSBuZXcgU2NhbGFyW2FsbG9jU2l6ZV07CisgICAgICBtZW1jcHkobmV3QnVmZmVyLCAgbV9idWZmZXIsICBjb3B5RWxlbWVudHMgKiBzaXplb2YoTGlzdEVsKSk7CisgICAgICBkZWxldGVbXSBtX2J1ZmZlcjsKKyAgICAgIG1fYnVmZmVyID0gbmV3QnVmZmVyOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgLy8gZWxlbWVudCB0eXBlIG9mIHRoZSBsaW5rZWQgbGlzdAorICAgIHN0cnVjdCBMaXN0RWwKKyAgICB7CisgICAgICBJbmRleCBuZXh0OworICAgICAgSW5kZXggaW5kZXg7CisgICAgICBTY2FsYXIgdmFsdWU7CisgICAgfTsKKworICAgIC8vIHVzZWQgdG8gc3RvcmUgZGF0YSBpbiBib3RoIG1vZGUKKyAgICBTY2FsYXIqIG1fYnVmZmVyOworICAgIFNjYWxhciBtX3plcm87CisgICAgSW5kZXggbV9zaXplOworICAgIEluZGV4IG1fc3RhcnQ7CisgICAgSW5kZXggbV9lbmQ7CisgICAgSW5kZXggbV9hbGxvY2F0ZWRTaXplOworICAgIEluZGV4IG1fYWxsb2NhdGVkRWxlbWVudHM7CisgICAgSW5kZXggbV9tb2RlOworCisgICAgLy8gbGlua2VkIGxpc3QgbW9kZQorICAgIEluZGV4IG1fbGxTdGFydDsKKyAgICBJbmRleCBtX2xsQ3VycmVudDsKKyAgICBJbmRleCBtX2xsU2l6ZTsKK307CisKKy8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvcyBpbiB0aGUgY3VycmVudCBzdWIgdmVjdG9yICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLHR5cGVuYW1lIF9JbmRleD4KK19JbmRleCBBbWJpVmVjdG9yPF9TY2FsYXIsX0luZGV4Pjo6bm9uWmVyb3MoKSBjb25zdAoreworICBpZiAobV9tb2RlPT1Jc1NwYXJzZSkKKyAgICByZXR1cm4gbV9sbFNpemU7CisgIGVsc2UKKyAgICByZXR1cm4gbV9lbmQgLSBtX3N0YXJ0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLHR5cGVuYW1lIF9JbmRleD4KK3ZvaWQgQW1iaVZlY3RvcjxfU2NhbGFyLF9JbmRleD46OmluaXQoZG91YmxlIGVzdGltYXRlZERlbnNpdHkpCit7CisgIGlmIChlc3RpbWF0ZWREZW5zaXR5PjAuMSkKKyAgICBpbml0KElzRGVuc2UpOworICBlbHNlCisgICAgaW5pdChJc1NwYXJzZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsdHlwZW5hbWUgX0luZGV4Pgordm9pZCBBbWJpVmVjdG9yPF9TY2FsYXIsX0luZGV4Pjo6aW5pdChpbnQgbW9kZSkKK3sKKyAgbV9tb2RlID0gbW9kZTsKKyAgaWYgKG1fbW9kZT09SXNTcGFyc2UpCisgIHsKKyAgICBtX2xsU2l6ZSA9IDA7CisgICAgbV9sbFN0YXJ0ID0gLTE7CisgIH0KK30KKworLyoqIE11c3QgYmUgY2FsbGVkIHdoZW5ldmVyIHdlIG1pZ2h0IHBlcmZvcm0gYSB3cml0ZSBhY2Nlc3MKKyAgKiB3aXRoIGFuIGluZGV4IHNtYWxsZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lLgorICAqCisgICogRG9uJ3Qgd29ycnksIHRoaXMgZnVuY3Rpb24gaXMgZXh0cmVtZWx5IGNoZWFwLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcix0eXBlbmFtZSBfSW5kZXg+Cit2b2lkIEFtYmlWZWN0b3I8X1NjYWxhcixfSW5kZXg+OjpyZXN0YXJ0KCkKK3sKKyAgbV9sbEN1cnJlbnQgPSBtX2xsU3RhcnQ7Cit9CisKKy8qKiBTZXQgYWxsIGNvZWZmaWNpZW50cyBvZiBjdXJyZW50IHN1YnZlY3RvciB0byB6ZXJvICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLHR5cGVuYW1lIF9JbmRleD4KK3ZvaWQgQW1iaVZlY3RvcjxfU2NhbGFyLF9JbmRleD46OnNldFplcm8oKQoreworICBpZiAobV9tb2RlPT1Jc0RlbnNlKQorICB7CisgICAgZm9yIChJbmRleCBpPW1fc3RhcnQ7IGk8bV9lbmQ7ICsraSkKKyAgICAgIG1fYnVmZmVyW2ldID0gU2NhbGFyKDApOworICB9CisgIGVsc2UKKyAgeworICAgIGVpZ2VuX2Fzc2VydChtX21vZGU9PUlzU3BhcnNlKTsKKyAgICBtX2xsU2l6ZSA9IDA7CisgICAgbV9sbFN0YXJ0ID0gLTE7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcix0eXBlbmFtZSBfSW5kZXg+CitfU2NhbGFyJiBBbWJpVmVjdG9yPF9TY2FsYXIsX0luZGV4Pjo6Y29lZmZSZWYoX0luZGV4IGkpCit7CisgIGlmIChtX21vZGU9PUlzRGVuc2UpCisgICAgcmV0dXJuIG1fYnVmZmVyW2ldOworICBlbHNlCisgIHsKKyAgICBMaXN0RWwqIEVJR0VOX1JFU1RSSUNUIGxsRWxlbWVudHMgPSByZWludGVycHJldF9jYXN0PExpc3RFbCo+KG1fYnVmZmVyKTsKKyAgICAvLyBUT0RPIGZhY3Rvcml6ZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gcmVkdWNlIGNvZGUgZ2VuZXJhdGlvbgorICAgIGVpZ2VuX2Fzc2VydChtX21vZGU9PUlzU3BhcnNlKTsKKyAgICBpZiAobV9sbFNpemU9PTApCisgICAgeworICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgbV9sbFN0YXJ0ID0gMDsKKyAgICAgIG1fbGxDdXJyZW50ID0gMDsKKyAgICAgICsrbV9sbFNpemU7CisgICAgICBsbEVsZW1lbnRzWzBdLnZhbHVlID0gU2NhbGFyKDApOworICAgICAgbGxFbGVtZW50c1swXS5pbmRleCA9IGk7CisgICAgICBsbEVsZW1lbnRzWzBdLm5leHQgPSAtMTsKKyAgICAgIHJldHVybiBsbEVsZW1lbnRzWzBdLnZhbHVlOworICAgIH0KKyAgICBlbHNlIGlmIChpPGxsRWxlbWVudHNbbV9sbFN0YXJ0XS5pbmRleCkKKyAgICB7CisgICAgICAvLyB0aGlzIGlzIGdvaW5nIHRvIGJlIHRoZSBuZXcgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdAorICAgICAgTGlzdEVsJiBlbCA9IGxsRWxlbWVudHNbbV9sbFNpemVdOworICAgICAgZWwudmFsdWUgPSBTY2FsYXIoMCk7CisgICAgICBlbC5pbmRleCA9IGk7CisgICAgICBlbC5uZXh0ID0gbV9sbFN0YXJ0OworICAgICAgbV9sbFN0YXJ0ID0gbV9sbFNpemU7CisgICAgICArK21fbGxTaXplOworICAgICAgbV9sbEN1cnJlbnQgPSBtX2xsU3RhcnQ7CisgICAgICByZXR1cm4gZWwudmFsdWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBJbmRleCBuZXh0ZWwgPSBsbEVsZW1lbnRzW21fbGxDdXJyZW50XS5uZXh0OworICAgICAgZWlnZW5fYXNzZXJ0KGk+PWxsRWxlbWVudHNbbV9sbEN1cnJlbnRdLmluZGV4ICYmICJ5b3UgbXVzdCBjYWxsIHJlc3RhcnQoKSBiZWZvcmUgaW5zZXJ0aW5nIGFuIGVsZW1lbnQgd2l0aCBsb3dlciBvciBlcXVhbCBpbmRleCIpOworICAgICAgd2hpbGUgKG5leHRlbCA+PSAwICYmIGxsRWxlbWVudHNbbmV4dGVsXS5pbmRleDw9aSkKKyAgICAgIHsKKyAgICAgICAgbV9sbEN1cnJlbnQgPSBuZXh0ZWw7CisgICAgICAgIG5leHRlbCA9IGxsRWxlbWVudHNbbmV4dGVsXS5uZXh0OworICAgICAgfQorCisgICAgICBpZiAobGxFbGVtZW50c1ttX2xsQ3VycmVudF0uaW5kZXg9PWkpCisgICAgICB7CisgICAgICAgIC8vIHRoZSBjb2VmZmljaWVudCBhbHJlYWR5IGV4aXN0cyBhbmQgd2UgZm91bmQgaXQgIQorICAgICAgICByZXR1cm4gbGxFbGVtZW50c1ttX2xsQ3VycmVudF0udmFsdWU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChtX2xsU2l6ZT49bV9hbGxvY2F0ZWRFbGVtZW50cykKKyAgICAgICAgeworICAgICAgICAgIHJlYWxsb2NhdGVTcGFyc2UoKTsKKyAgICAgICAgICBsbEVsZW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxMaXN0RWwqPihtX2J1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgZWlnZW5faW50ZXJuYWxfYXNzZXJ0KG1fbGxTaXplPG1fYWxsb2NhdGVkRWxlbWVudHMgJiYgImludGVybmFsIGVycm9yOiBvdmVyZmxvdyBpbiBzcGFyc2UgbW9kZSIpOworICAgICAgICAvLyBsZXQncyBpbnNlcnQgYSBuZXcgY29lZmZpY2llbnQKKyAgICAgICAgTGlzdEVsJiBlbCA9IGxsRWxlbWVudHNbbV9sbFNpemVdOworICAgICAgICBlbC52YWx1ZSA9IFNjYWxhcigwKTsKKyAgICAgICAgZWwuaW5kZXggPSBpOworICAgICAgICBlbC5uZXh0ID0gbGxFbGVtZW50c1ttX2xsQ3VycmVudF0ubmV4dDsKKyAgICAgICAgbGxFbGVtZW50c1ttX2xsQ3VycmVudF0ubmV4dCA9IG1fbGxTaXplOworICAgICAgICArK21fbGxTaXplOworICAgICAgICByZXR1cm4gZWwudmFsdWU7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsdHlwZW5hbWUgX0luZGV4PgorX1NjYWxhciYgQW1iaVZlY3RvcjxfU2NhbGFyLF9JbmRleD46OmNvZWZmKF9JbmRleCBpKQoreworICBpZiAobV9tb2RlPT1Jc0RlbnNlKQorICAgIHJldHVybiBtX2J1ZmZlcltpXTsKKyAgZWxzZQorICB7CisgICAgTGlzdEVsKiBFSUdFTl9SRVNUUklDVCBsbEVsZW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxMaXN0RWwqPihtX2J1ZmZlcik7CisgICAgZWlnZW5fYXNzZXJ0KG1fbW9kZT09SXNTcGFyc2UpOworICAgIGlmICgobV9sbFNpemU9PTApIHx8IChpPGxsRWxlbWVudHNbbV9sbFN0YXJ0XS5pbmRleCkpCisgICAgeworICAgICAgcmV0dXJuIG1femVybzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIEluZGV4IGVsaWQgPSBtX2xsU3RhcnQ7CisgICAgICB3aGlsZSAoZWxpZCA+PSAwICYmIGxsRWxlbWVudHNbZWxpZF0uaW5kZXg8aSkKKyAgICAgICAgZWxpZCA9IGxsRWxlbWVudHNbZWxpZF0ubmV4dDsKKworICAgICAgaWYgKGxsRWxlbWVudHNbZWxpZF0uaW5kZXg9PWkpCisgICAgICAgIHJldHVybiBsbEVsZW1lbnRzW21fbGxDdXJyZW50XS52YWx1ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1femVybzsKKyAgICB9CisgIH0KK30KKworLyoqIEl0ZXJhdG9yIG92ZXIgdGhlIG5vbnplcm8gY29lZmZpY2llbnRzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLHR5cGVuYW1lIF9JbmRleD4KK2NsYXNzIEFtYmlWZWN0b3I8X1NjYWxhcixfSW5kZXg+OjpJdGVyYXRvcgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgKiBccGFyYW0gdmVjIHRoZSB2ZWN0b3Igb24gd2hpY2ggd2UgaXRlcmF0ZQorICAgICAgKiBccGFyYW0gZXBzaWxvbiB0aGUgbWluaW1hbCB2YWx1ZSB1c2VkIHRvIHBydW5lIHplcm8gY29lZmZpY2llbnRzLgorICAgICAgKiBJbiBwcmFjdGljZSwgYWxsIGNvZWZmaWNpZW50cyBoYXZpbmcgYSBtYWduaXR1ZGUgc21hbGxlciB0aGFuIFxhIGVwc2lsb24KKyAgICAgICogYXJlIHNraXBwZWQuCisgICAgICAqLworICAgIEl0ZXJhdG9yKGNvbnN0IEFtYmlWZWN0b3ImIHZlYywgUmVhbFNjYWxhciBlcHNpbG9uID0gMCkKKyAgICAgIDogbV92ZWN0b3IodmVjKQorICAgIHsKKyAgICAgIG1fZXBzaWxvbiA9IGVwc2lsb247CisgICAgICBtX2lzRGVuc2UgPSBtX3ZlY3Rvci5tX21vZGU9PUlzRGVuc2U7CisgICAgICBpZiAobV9pc0RlbnNlKQorICAgICAgeworICAgICAgICBtX2N1cnJlbnRFbCA9IDA7ICAgLy8gdGhpcyBpcyB0byBhdm9pZCBhIGNvbXBpbGF0aW9uIHdhcm5pbmcKKyAgICAgICAgbV9jYWNoZWRWYWx1ZSA9IDA7IC8vIHRoaXMgaXMgdG8gYXZvaWQgYSBjb21waWxhdGlvbiB3YXJuaW5nCisgICAgICAgIG1fY2FjaGVkSW5kZXggPSBtX3ZlY3Rvci5tX3N0YXJ0LTE7CisgICAgICAgICsrKCp0aGlzKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgTGlzdEVsKiBFSUdFTl9SRVNUUklDVCBsbEVsZW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxMaXN0RWwqPihtX3ZlY3Rvci5tX2J1ZmZlcik7CisgICAgICAgIG1fY3VycmVudEVsID0gbV92ZWN0b3IubV9sbFN0YXJ0OworICAgICAgICB3aGlsZSAobV9jdXJyZW50RWw+PTAgJiYgaW50ZXJuYWw6OmFicyhsbEVsZW1lbnRzW21fY3VycmVudEVsXS52YWx1ZSk8PW1fZXBzaWxvbikKKyAgICAgICAgICBtX2N1cnJlbnRFbCA9IGxsRWxlbWVudHNbbV9jdXJyZW50RWxdLm5leHQ7CisgICAgICAgIGlmIChtX2N1cnJlbnRFbDwwKQorICAgICAgICB7CisgICAgICAgICAgbV9jYWNoZWRWYWx1ZSA9IDA7IC8vIHRoaXMgaXMgdG8gYXZvaWQgYSBjb21waWxhdGlvbiB3YXJuaW5nCisgICAgICAgICAgbV9jYWNoZWRJbmRleCA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG1fY2FjaGVkSW5kZXggPSBsbEVsZW1lbnRzW21fY3VycmVudEVsXS5pbmRleDsKKyAgICAgICAgICBtX2NhY2hlZFZhbHVlID0gbGxFbGVtZW50c1ttX2N1cnJlbnRFbF0udmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVkSW5kZXg7IH0KKyAgICBTY2FsYXIgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2NhY2hlZFZhbHVlOyB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9jYWNoZWRJbmRleD49MDsgfQorCisgICAgSXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgIGlmIChtX2lzRGVuc2UpCisgICAgICB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICArK21fY2FjaGVkSW5kZXg7CisgICAgICAgIH0gd2hpbGUgKG1fY2FjaGVkSW5kZXg8bV92ZWN0b3IubV9lbmQgJiYgaW50ZXJuYWw6OmFicyhtX3ZlY3Rvci5tX2J1ZmZlclttX2NhY2hlZEluZGV4XSk8bV9lcHNpbG9uKTsKKyAgICAgICAgaWYgKG1fY2FjaGVkSW5kZXg8bV92ZWN0b3IubV9lbmQpCisgICAgICAgICAgbV9jYWNoZWRWYWx1ZSA9IG1fdmVjdG9yLm1fYnVmZmVyW21fY2FjaGVkSW5kZXhdOworICAgICAgICBlbHNlCisgICAgICAgICAgbV9jYWNoZWRJbmRleD0tMTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgTGlzdEVsKiBFSUdFTl9SRVNUUklDVCBsbEVsZW1lbnRzID0gcmVpbnRlcnByZXRfY2FzdDxMaXN0RWwqPihtX3ZlY3Rvci5tX2J1ZmZlcik7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBtX2N1cnJlbnRFbCA9IGxsRWxlbWVudHNbbV9jdXJyZW50RWxdLm5leHQ7CisgICAgICAgIH0gd2hpbGUgKG1fY3VycmVudEVsPj0wICYmIGludGVybmFsOjphYnMobGxFbGVtZW50c1ttX2N1cnJlbnRFbF0udmFsdWUpPG1fZXBzaWxvbik7CisgICAgICAgIGlmIChtX2N1cnJlbnRFbDwwKQorICAgICAgICB7CisgICAgICAgICAgbV9jYWNoZWRJbmRleCA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG1fY2FjaGVkSW5kZXggPSBsbEVsZW1lbnRzW21fY3VycmVudEVsXS5pbmRleDsKKyAgICAgICAgICBtX2NhY2hlZFZhbHVlID0gbGxFbGVtZW50c1ttX2N1cnJlbnRFbF0udmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IEFtYmlWZWN0b3ImIG1fdmVjdG9yOyAvLyB0aGUgdGFyZ2V0IHZlY3RvcgorICAgIEluZGV4IG1fY3VycmVudEVsOyAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IGVsZW1lbnQgaW4gc3BhcnNlL2xpbmtlZC1saXN0IG1vZGUKKyAgICBSZWFsU2NhbGFyIG1fZXBzaWxvbjsgICAgICAgLy8gZXBzaWxvbiB1c2VkIHRvIHBydW5lIHplcm8gY29lZmZpY2llbnRzCisgICAgSW5kZXggbV9jYWNoZWRJbmRleDsgICAgICAgICAgLy8gY3VycmVudCBjb29yZGluYXRlCisgICAgU2NhbGFyIG1fY2FjaGVkVmFsdWU7ICAgICAgIC8vIGN1cnJlbnQgdmFsdWUKKyAgICBib29sIG1faXNEZW5zZTsgICAgICAgICAgICAgLy8gbW9kZSBvZiB0aGUgdmVjdG9yCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9BTUJJVkVDVE9SX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0NNYWtlTGlzdHMudHh0IGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2MDQ1MgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX1NwYXJzZUNvcmVfU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUyAKKyAgJHtFaWdlbl9TcGFyc2VDb3JlX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL1NwYXJzZUNvcmUgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0NvbXByZXNzZWRTdG9yYWdlLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9Db21wcmVzc2VkU3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTk5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9Db21wcmVzc2VkU3RvcmFnZS5oCkBAIC0wLDAgKzEsMjMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09NUFJFU1NFRF9TVE9SQUdFX0gKKyNkZWZpbmUgRUlHRU5fQ09NUFJFU1NFRF9TVE9SQUdFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8qKiBcaW50ZXJuYWwKKyAgKiBTdG9yZXMgYSBzcGFyc2Ugc2V0IG9mIHZhbHVlcyBhcyBhIGxpc3Qgb2YgdmFsdWVzIGFuZCBhIGxpc3Qgb2YgaW5kaWNlcy4KKyAgKgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcix0eXBlbmFtZSBfSW5kZXg+CitjbGFzcyBDb21wcmVzc2VkU3RvcmFnZQoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgX0luZGV4IEluZGV4OworCisgIHByb3RlY3RlZDoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICBwdWJsaWM6CisKKyAgICBDb21wcmVzc2VkU3RvcmFnZSgpCisgICAgICA6IG1fdmFsdWVzKDApLCBtX2luZGljZXMoMCksIG1fc2l6ZSgwKSwgbV9hbGxvY2F0ZWRTaXplKDApCisgICAge30KKworICAgIENvbXByZXNzZWRTdG9yYWdlKHNpemVfdCBzaXplKQorICAgICAgOiBtX3ZhbHVlcygwKSwgbV9pbmRpY2VzKDApLCBtX3NpemUoMCksIG1fYWxsb2NhdGVkU2l6ZSgwKQorICAgIHsKKyAgICAgIHJlc2l6ZShzaXplKTsKKyAgICB9CisKKyAgICBDb21wcmVzc2VkU3RvcmFnZShjb25zdCBDb21wcmVzc2VkU3RvcmFnZSYgb3RoZXIpCisgICAgICA6IG1fdmFsdWVzKDApLCBtX2luZGljZXMoMCksIG1fc2l6ZSgwKSwgbV9hbGxvY2F0ZWRTaXplKDApCisgICAgeworICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICB9CisKKyAgICBDb21wcmVzc2VkU3RvcmFnZSYgb3BlcmF0b3I9KGNvbnN0IENvbXByZXNzZWRTdG9yYWdlJiBvdGhlcikKKyAgICB7CisgICAgICByZXNpemUob3RoZXIuc2l6ZSgpKTsKKyAgICAgIG1lbWNweShtX3ZhbHVlcywgb3RoZXIubV92YWx1ZXMsIG1fc2l6ZSAqIHNpemVvZihTY2FsYXIpKTsKKyAgICAgIG1lbWNweShtX2luZGljZXMsIG90aGVyLm1faW5kaWNlcywgbV9zaXplICogc2l6ZW9mKEluZGV4KSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZCBzd2FwKENvbXByZXNzZWRTdG9yYWdlJiBvdGhlcikKKyAgICB7CisgICAgICBzdGQ6OnN3YXAobV92YWx1ZXMsIG90aGVyLm1fdmFsdWVzKTsKKyAgICAgIHN0ZDo6c3dhcChtX2luZGljZXMsIG90aGVyLm1faW5kaWNlcyk7CisgICAgICBzdGQ6OnN3YXAobV9zaXplLCBvdGhlci5tX3NpemUpOworICAgICAgc3RkOjpzd2FwKG1fYWxsb2NhdGVkU2l6ZSwgb3RoZXIubV9hbGxvY2F0ZWRTaXplKTsKKyAgICB9CisKKyAgICB+Q29tcHJlc3NlZFN0b3JhZ2UoKQorICAgIHsKKyAgICAgIGRlbGV0ZVtdIG1fdmFsdWVzOworICAgICAgZGVsZXRlW10gbV9pbmRpY2VzOworICAgIH0KKworICAgIHZvaWQgcmVzZXJ2ZShzaXplX3Qgc2l6ZSkKKyAgICB7CisgICAgICBzaXplX3QgbmV3QWxsb2NhdGVkU2l6ZSA9IG1fc2l6ZSArIHNpemU7CisgICAgICBpZiAobmV3QWxsb2NhdGVkU2l6ZSA+IG1fYWxsb2NhdGVkU2l6ZSkKKyAgICAgICAgcmVhbGxvY2F0ZShuZXdBbGxvY2F0ZWRTaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHNxdWVlemUoKQorICAgIHsKKyAgICAgIGlmIChtX2FsbG9jYXRlZFNpemU+bV9zaXplKQorICAgICAgICByZWFsbG9jYXRlKG1fc2l6ZSk7CisgICAgfQorCisgICAgdm9pZCByZXNpemUoc2l6ZV90IHNpemUsIGZsb2F0IHJlc2VydmVTaXplRmFjdG9yID0gMCkKKyAgICB7CisgICAgICBpZiAobV9hbGxvY2F0ZWRTaXplPHNpemUpCisgICAgICAgIHJlYWxsb2NhdGUoc2l6ZSArIHNpemVfdChyZXNlcnZlU2l6ZUZhY3RvcipzaXplKSk7CisgICAgICBtX3NpemUgPSBzaXplOworICAgIH0KKworICAgIHZvaWQgYXBwZW5kKGNvbnN0IFNjYWxhciYgdiwgSW5kZXggaSkKKyAgICB7CisgICAgICBJbmRleCBpZCA9IHN0YXRpY19jYXN0PEluZGV4PihtX3NpemUpOworICAgICAgcmVzaXplKG1fc2l6ZSsxLCAxKTsKKyAgICAgIG1fdmFsdWVzW2lkXSA9IHY7CisgICAgICBtX2luZGljZXNbaWRdID0gaTsKKyAgICB9CisKKyAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKyAgICBpbmxpbmUgc2l6ZV90IGFsbG9jYXRlZFNpemUoKSBjb25zdCB7IHJldHVybiBtX2FsbG9jYXRlZFNpemU7IH0KKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsgbV9zaXplID0gMDsgfQorCisgICAgaW5saW5lIFNjYWxhciYgdmFsdWUoc2l6ZV90IGkpIHsgcmV0dXJuIG1fdmFsdWVzW2ldOyB9CisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgdmFsdWUoc2l6ZV90IGkpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2ldOyB9CisKKyAgICBpbmxpbmUgSW5kZXgmIGluZGV4KHNpemVfdCBpKSB7IHJldHVybiBtX2luZGljZXNbaV07IH0KKyAgICBpbmxpbmUgY29uc3QgSW5kZXgmIGluZGV4KHNpemVfdCBpKSBjb25zdCB7IHJldHVybiBtX2luZGljZXNbaV07IH0KKworICAgIHN0YXRpYyBDb21wcmVzc2VkU3RvcmFnZSBNYXAoSW5kZXgqIGluZGljZXMsIFNjYWxhciogdmFsdWVzLCBzaXplX3Qgc2l6ZSkKKyAgICB7CisgICAgICBDb21wcmVzc2VkU3RvcmFnZSByZXM7CisgICAgICByZXMubV9pbmRpY2VzID0gaW5kaWNlczsKKyAgICAgIHJlcy5tX3ZhbHVlcyA9IHZhbHVlczsKKyAgICAgIHJlcy5tX2FsbG9jYXRlZFNpemUgPSByZXMubV9zaXplID0gc2l6ZTsKKyAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBsYXJnZXN0IFxjIGsgc3VjaCB0aGF0IGZvciBhbGwgXGMgaiBpbiBbMCxrKSBpbmRleFtcYyBqXVw8XGEga2V5ICovCisgICAgaW5saW5lIEluZGV4IHNlYXJjaExvd2VySW5kZXgoSW5kZXgga2V5KSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBzZWFyY2hMb3dlckluZGV4KDAsIG1fc2l6ZSwga2V5KTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGxhcmdlc3QgXGMgayBpbiBbc3RhcnQsZW5kKSBzdWNoIHRoYXQgZm9yIGFsbCBcYyBqIGluIFtzdGFydCxrKSBpbmRleFtcYyBqXVw8XGEga2V5ICovCisgICAgaW5saW5lIEluZGV4IHNlYXJjaExvd2VySW5kZXgoc2l6ZV90IHN0YXJ0LCBzaXplX3QgZW5kLCBJbmRleCBrZXkpIGNvbnN0CisgICAgeworICAgICAgd2hpbGUoZW5kPnN0YXJ0KQorICAgICAgeworICAgICAgICBzaXplX3QgbWlkID0gKGVuZCtzdGFydCk+PjE7CisgICAgICAgIGlmIChtX2luZGljZXNbbWlkXTxrZXkpCisgICAgICAgICAgc3RhcnQgPSBtaWQrMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVuZCA9IG1pZDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxJbmRleD4oc3RhcnQpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgc3RvcmVkIHZhbHVlIGF0IGluZGV4IFxhIGtleQorICAgICAgKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgZXhpc3QsIHRoZW4gdGhlIHZhbHVlIFxhIGRlZmF1bHRWYWx1ZSBpcyByZXR1cm5lZCB3aXRob3V0IGFueSBpbnNlcnRpb24uICovCisgICAgaW5saW5lIFNjYWxhciBhdChJbmRleCBrZXksIFNjYWxhciBkZWZhdWx0VmFsdWUgPSBTY2FsYXIoMCkpIGNvbnN0CisgICAgeworICAgICAgaWYgKG1fc2l6ZT09MCkKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgIGVsc2UgaWYgKGtleT09bV9pbmRpY2VzW21fc2l6ZS0xXSkKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzW21fc2l6ZS0xXTsKKyAgICAgIC8vIF5eICBvcHRpbWl6YXRpb246IGxldCdzIGZpcnN0IGNoZWNrIGlmIGl0IGlzIHRoZSBsYXN0IGNvZWZmaWNpZW50CisgICAgICAvLyAodmVyeSBjb21tb24gaW4gaGlnaCBsZXZlbCBhbGdvcml0aG1zKQorICAgICAgY29uc3Qgc2l6ZV90IGlkID0gc2VhcmNoTG93ZXJJbmRleCgwLG1fc2l6ZS0xLGtleSk7CisgICAgICByZXR1cm4gKChpZDxtX3NpemUpICYmIChtX2luZGljZXNbaWRdPT1rZXkpKSA/IG1fdmFsdWVzW2lkXSA6IGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICAvKiogTGlrZSBhdCgpLCBidXQgdGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQgaW4gdGhlIHJhbmdlIFtzdGFydCxlbmQpICovCisgICAgaW5saW5lIFNjYWxhciBhdEluUmFuZ2Uoc2l6ZV90IHN0YXJ0LCBzaXplX3QgZW5kLCBJbmRleCBrZXksIFNjYWxhciBkZWZhdWx0VmFsdWUgPSBTY2FsYXIoMCkpIGNvbnN0CisgICAgeworICAgICAgaWYgKHN0YXJ0Pj1lbmQpCisgICAgICAgIHJldHVybiBTY2FsYXIoMCk7CisgICAgICBlbHNlIGlmIChlbmQ+c3RhcnQgJiYga2V5PT1tX2luZGljZXNbZW5kLTFdKQorICAgICAgICByZXR1cm4gbV92YWx1ZXNbZW5kLTFdOworICAgICAgLy8gXl4gIG9wdGltaXphdGlvbjogbGV0J3MgZmlyc3QgY2hlY2sgaWYgaXQgaXMgdGhlIGxhc3QgY29lZmZpY2llbnQKKyAgICAgIC8vICh2ZXJ5IGNvbW1vbiBpbiBoaWdoIGxldmVsIGFsZ29yaXRobXMpCisgICAgICBjb25zdCBzaXplX3QgaWQgPSBzZWFyY2hMb3dlckluZGV4KHN0YXJ0LGVuZC0xLGtleSk7CisgICAgICByZXR1cm4gKChpZDxlbmQpICYmIChtX2luZGljZXNbaWRdPT1rZXkpKSA/IG1fdmFsdWVzW2lkXSA6IGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIGF0IGluZGV4IFxhIGtleQorICAgICAgKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgZXhpc3QsIHRoZW4gdGhlIHZhbHVlIFxhIGRlZmF1bHRWYWx1ZSBpcyBpbnNlcnRlZAorICAgICAgKiBzdWNoIHRoYXQgdGhlIGtleXMgYXJlIHNvcnRlZC4gKi8KKyAgICBpbmxpbmUgU2NhbGFyJiBhdFdpdGhJbnNlcnRpb24oSW5kZXgga2V5LCBTY2FsYXIgZGVmYXVsdFZhbHVlID0gU2NhbGFyKDApKQorICAgIHsKKyAgICAgIHNpemVfdCBpZCA9IHNlYXJjaExvd2VySW5kZXgoMCxtX3NpemUsa2V5KTsKKyAgICAgIGlmIChpZD49bV9zaXplIHx8IG1faW5kaWNlc1tpZF0hPWtleSkKKyAgICAgIHsKKyAgICAgICAgcmVzaXplKG1fc2l6ZSsxLDEpOworICAgICAgICBmb3IgKHNpemVfdCBqPW1fc2l6ZS0xOyBqPmlkOyAtLWopCisgICAgICAgIHsKKyAgICAgICAgICBtX2luZGljZXNbal0gPSBtX2luZGljZXNbai0xXTsKKyAgICAgICAgICBtX3ZhbHVlc1tqXSA9IG1fdmFsdWVzW2otMV07CisgICAgICAgIH0KKyAgICAgICAgbV9pbmRpY2VzW2lkXSA9IGtleTsKKyAgICAgICAgbV92YWx1ZXNbaWRdID0gZGVmYXVsdFZhbHVlOworICAgICAgfQorICAgICAgcmV0dXJuIG1fdmFsdWVzW2lkXTsKKyAgICB9CisKKyAgICB2b2lkIHBydW5lKFNjYWxhciByZWZlcmVuY2UsIFJlYWxTY2FsYXIgZXBzaWxvbiA9IE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpCisgICAgeworICAgICAgc2l6ZV90IGsgPSAwOworICAgICAgc2l6ZV90IG4gPSBzaXplKCk7CisgICAgICBmb3IgKHNpemVfdCBpPTA7IGk8bjsgKytpKQorICAgICAgeworICAgICAgICBpZiAoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbih2YWx1ZShpKSwgcmVmZXJlbmNlLCBlcHNpbG9uKSkKKyAgICAgICAgeworICAgICAgICAgIHZhbHVlKGspID0gdmFsdWUoaSk7CisgICAgICAgICAgaW5kZXgoaykgPSBpbmRleChpKTsKKyAgICAgICAgICArK2s7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlc2l6ZShrLDApOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICBpbmxpbmUgdm9pZCByZWFsbG9jYXRlKHNpemVfdCBzaXplKQorICAgIHsKKyAgICAgIFNjYWxhciogbmV3VmFsdWVzICA9IG5ldyBTY2FsYXJbc2l6ZV07CisgICAgICBJbmRleCogbmV3SW5kaWNlcyA9IG5ldyBJbmRleFtzaXplXTsKKyAgICAgIHNpemVfdCBjb3B5U2l6ZSA9IChzdGQ6Om1pbikoc2l6ZSwgbV9zaXplKTsKKyAgICAgIC8vIGNvcHkKKyAgICAgIGludGVybmFsOjpzbWFydF9jb3B5KG1fdmFsdWVzLCBtX3ZhbHVlcytjb3B5U2l6ZSwgbmV3VmFsdWVzKTsKKyAgICAgIGludGVybmFsOjpzbWFydF9jb3B5KG1faW5kaWNlcywgbV9pbmRpY2VzK2NvcHlTaXplLCBuZXdJbmRpY2VzKTsKKyAgICAgIC8vIGRlbGV0ZSBvbGQgc3R1ZmYKKyAgICAgIGRlbGV0ZVtdIG1fdmFsdWVzOworICAgICAgZGVsZXRlW10gbV9pbmRpY2VzOworICAgICAgbV92YWx1ZXMgPSBuZXdWYWx1ZXM7CisgICAgICBtX2luZGljZXMgPSBuZXdJbmRpY2VzOworICAgICAgbV9hbGxvY2F0ZWRTaXplID0gc2l6ZTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIFNjYWxhciogbV92YWx1ZXM7CisgICAgSW5kZXgqIG1faW5kaWNlczsKKyAgICBzaXplX3QgbV9zaXplOworICAgIHNpemVfdCBtX2FsbG9jYXRlZFNpemU7CisKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTVBSRVNTRURfU1RPUkFHRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9Db25zZXJ2YXRpdmVTcGFyc2VTcGFyc2VQcm9kdWN0LmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9Db25zZXJ2YXRpdmVTcGFyc2VTcGFyc2VQcm9kdWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiNWUxZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL0NvbnNlcnZhdGl2ZVNwYXJzZVNwYXJzZVByb2R1Y3QuaApAQCAtMCwwICsxLDI0NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09OU0VSVkFUSVZFU1BBUlNFU1BBUlNFUFJPRFVDVF9ICisjZGVmaW5lIEVJR0VOX0NPTlNFUlZBVElWRVNQQVJTRVNQQVJTRVBST0RVQ1RfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdGF0aWMgdm9pZCBjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X2ltcGwoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHM+Ojp0eXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzPjo6dHlwZTo6SW5kZXggSW5kZXg7CisKKyAgLy8gbWFrZSBzdXJlIHRvIGNhbGwgaW5uZXJTaXplL291dGVyU2l6ZSBzaW5jZSB3ZSBmYWtlIHRoZSBzdG9yYWdlIG9yZGVyLgorICBJbmRleCByb3dzID0gbGhzLmlubmVyU2l6ZSgpOworICBJbmRleCBjb2xzID0gcmhzLm91dGVyU2l6ZSgpOworICBlaWdlbl9hc3NlcnQobGhzLm91dGVyU2l6ZSgpID09IHJocy5pbm5lclNpemUoKSk7CisKKyAgc3RkOjp2ZWN0b3I8Ym9vbD4gbWFzayhyb3dzLGZhbHNlKTsKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IHZhbHVlcyhyb3dzKTsKKyAgTWF0cml4PEluZGV4LER5bmFtaWMsMT4gIGluZGljZXMocm93cyk7CisKKyAgLy8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBub24gemVybyBlbnRyaWVzCisgIC8vIGdpdmVuIGEgcmhzIGNvbHVtbiBjb250YWluaW5nIFkgbm9uIHplcm9zLCB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVzcGVjdGl2ZSBZIGNvbHVtbnMKKyAgLy8gb2YgdGhlIGxocyBkaWZmZXJzIGluIGF2ZXJhZ2Ugb2Ygb25lIG5vbiB6ZXJvcywgdGh1cyB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvcyBmb3IKKyAgLy8gdGhlIHByb2R1Y3Qgb2YgYSByaHMgY29sdW1uIHdpdGggdGhlIGxocyBpcyBYK1kgd2hlcmUgWCBpcyB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygbm9uIHplcm8KKyAgLy8gcGVyIGNvbHVtbiBvZiB0aGUgbGhzLgorICAvLyBUaGVyZWZvcmUsIHdlIGhhdmUgbm56KGxocypyaHMpID0gbm56KGxocykgKyBubnoocmhzKQorICBJbmRleCBlc3RpbWF0ZWRfbm56X3Byb2QgPSBsaHMubm9uWmVyb3MoKSArIHJocy5ub25aZXJvcygpOworCisgIHJlcy5zZXRaZXJvKCk7CisgIHJlcy5yZXNlcnZlKEluZGV4KGVzdGltYXRlZF9ubnpfcHJvZCkpOworICAvLyB3ZSBjb21wdXRlIGVhY2ggY29sdW1uIG9mIHRoZSByZXN1bHQsIG9uZSBhZnRlciB0aGUgb3RoZXIKKyAgZm9yIChJbmRleCBqPTA7IGo8Y29sczsgKytqKQorICB7CisKKyAgICByZXMuc3RhcnRWZWMoaik7CisgICAgSW5kZXggbm56ID0gMDsKKyAgICBmb3IgKHR5cGVuYW1lIFJoczo6SW5uZXJJdGVyYXRvciByaHNJdChyaHMsIGopOyByaHNJdDsgKytyaHNJdCkKKyAgICB7CisgICAgICBTY2FsYXIgeSA9IHJoc0l0LnZhbHVlKCk7CisgICAgICBJbmRleCBrID0gcmhzSXQuaW5kZXgoKTsKKyAgICAgIGZvciAodHlwZW5hbWUgTGhzOjpJbm5lckl0ZXJhdG9yIGxoc0l0KGxocywgayk7IGxoc0l0OyArK2xoc0l0KQorICAgICAgeworICAgICAgICBJbmRleCBpID0gbGhzSXQuaW5kZXgoKTsKKyAgICAgICAgU2NhbGFyIHggPSBsaHNJdC52YWx1ZSgpOworICAgICAgICBpZighbWFza1tpXSkKKyAgICAgICAgeworICAgICAgICAgIG1hc2tbaV0gPSB0cnVlOworICAgICAgICAgIHZhbHVlc1tpXSA9IHggKiB5OworICAgICAgICAgIGluZGljZXNbbm56XSA9IGk7CisgICAgICAgICAgKytubno7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbHVlc1tpXSArPSB4ICogeTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1bm9yZGVyZWQgaW5zZXJ0aW9uCisgICAgZm9yKGludCBrPTA7IGs8bm56OyArK2spCisgICAgeworICAgICAgaW50IGkgPSBpbmRpY2VzW2tdOworICAgICAgcmVzLmluc2VydEJhY2tCeU91dGVySW5uZXJVbm9yZGVyZWQoaixpKSA9IHZhbHVlc1tpXTsKKyAgICAgIG1hc2tbaV0gPSBmYWxzZTsKKyAgICB9CisKKyNpZiAwCisgICAgLy8gYWx0ZXJuYXRpdmUgb3JkZXJlZCBpbnNlcnRpb24gY29kZToKKworICAgIGludCB0MjAwID0gcm93cy8obG9nMigyMDApKjEuMzkpOworICAgIGludCB0ID0gKHJvd3MqMTAwKS8xMzk7CisKKyAgICAvLyBGSVhNRSByZXNlcnZlIG5ueiBub24gemVyb3MKKyAgICAvLyBGSVhNRSBpbXBsZW1lbnQgZmFzdCBzb3J0IGFsZ29yaXRobXMgZm9yIHZlcnkgc21hbGwgbm56CisgICAgLy8gaWYgdGhlIHJlc3VsdCBpcyBzcGFyc2UgZW5vdWdoID0+IHVzZSBhIHF1aWNrIHNvcnQKKyAgICAvLyBvdGhlcndpc2UgPT4gbG9vcCB0aHJvdWdoIHRoZSBlbnRpcmUgdmVjdG9yCisgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgdG8gcGVyZm9ybSBhbiBleHBlbnNpdmUgbG9nMiB3aGVuIHRoZQorICAgIC8vIHJlc3VsdCBpcyBjbGVhcmx5IHZlcnkgc3BhcnNlIHdlIHVzZSBhIGxpbmVhciBib3VuZCB1cCB0byAyMDAuCisgICAgLy9pZigobm56PDIwMCAmJiBubno8dDIwMCkgfHwgbm56ICogbG9nMihubnopIDwgdCkKKyAgICAvL3Jlcy5zdGFydFZlYyhqKTsKKyAgICBpZih0cnVlKQorICAgIHsKKyAgICAgIGlmKG5uej4xKSBzdGQ6OnNvcnQoaW5kaWNlcy5kYXRhKCksaW5kaWNlcy5kYXRhKCkrbm56KTsKKyAgICAgIGZvcihpbnQgaz0wOyBrPG5uejsgKytrKQorICAgICAgeworICAgICAgICBpbnQgaSA9IGluZGljZXNba107CisgICAgICAgIHJlcy5pbnNlcnRCYWNrQnlPdXRlcklubmVyKGosaSkgPSB2YWx1ZXNbaV07CisgICAgICAgIG1hc2tbaV0gPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIGRlbnNlIHBhdGgKKyAgICAgIGZvcihpbnQgaT0wOyBpPHJvd3M7ICsraSkKKyAgICAgIHsKKyAgICAgICAgaWYobWFza1tpXSkKKyAgICAgICAgeworICAgICAgICAgIG1hc2tbaV0gPSBmYWxzZTsKKyAgICAgICAgICByZXMuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihqLGkpID0gdmFsdWVzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgfQorICByZXMuZmluYWxpemUoKTsKK30KKworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGUsCisgIGludCBMaHNTdG9yYWdlT3JkZXIgPSB0cmFpdHM8TGhzPjo6RmxhZ3MmUm93TWFqb3JCaXQsCisgIGludCBSaHNTdG9yYWdlT3JkZXIgPSB0cmFpdHM8UmhzPjo6RmxhZ3MmUm93TWFqb3JCaXQsCisgIGludCBSZXNTdG9yYWdlT3JkZXIgPSB0cmFpdHM8UmVzdWx0VHlwZT46OkZsYWdzJlJvd01ham9yQml0Pgorc3RydWN0IGNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfc2VsZWN0b3I7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IGNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfc2VsZWN0b3I8TGhzLFJocyxSZXN1bHRUeXBlLENvbE1ham9yLENvbE1ham9yLENvbE1ham9yPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzPjo6dHlwZSBMaHNDbGVhbmVkOworICB0eXBlZGVmIHR5cGVuYW1lIExoc0NsZWFuZWQ6OlNjYWxhciBTY2FsYXI7CisKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUmVzdWx0VHlwZSYgcmVzKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLFJvd01ham9yPiBSb3dNYWpvck1hdHJpeDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXIsQ29sTWFqb3I+IENvbE1ham9yTWF0cml4OworICAgIENvbE1ham9yTWF0cml4IHJlc0NvbChsaHMucm93cygpLHJocy5jb2xzKCkpOworICAgIGludGVybmFsOjpjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X2ltcGw8TGhzLFJocyxDb2xNYWpvck1hdHJpeD4obGhzLCByaHMsIHJlc0NvbCk7CisgICAgLy8gc29ydCB0aGUgbm9uIHplcm9zOgorICAgIFJvd01ham9yTWF0cml4IHJlc1JvdyhyZXNDb2wpOworICAgIHJlcyA9IHJlc1JvdzsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsUm93TWFqb3IsQ29sTWFqb3IsQ29sTWFqb3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXIsUm93TWFqb3I+IFJvd01ham9yTWF0cml4OworICAgICBSb3dNYWpvck1hdHJpeCByaHNSb3cgPSByaHM7CisgICAgIFJvd01ham9yTWF0cml4IHJlc1JvdyhsaHMucm93cygpLCByaHMuY29scygpKTsKKyAgICAgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3RfaW1wbDxSb3dNYWpvck1hdHJpeCxMaHMsUm93TWFqb3JNYXRyaXg+KHJoc1JvdywgbGhzLCByZXNSb3cpOworICAgICByZXMgPSByZXNSb3c7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IGNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfc2VsZWN0b3I8TGhzLFJocyxSZXN1bHRUeXBlLENvbE1ham9yLFJvd01ham9yLENvbE1ham9yPgoreworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMpCisgIHsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXIsUm93TWFqb3I+IFJvd01ham9yTWF0cml4OworICAgIFJvd01ham9yTWF0cml4IGxoc1JvdyA9IGxoczsKKyAgICBSb3dNYWpvck1hdHJpeCByZXNSb3cobGhzLnJvd3MoKSwgcmhzLmNvbHMoKSk7CisgICAgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3RfaW1wbDxSaHMsUm93TWFqb3JNYXRyaXgsUm93TWFqb3JNYXRyaXg+KHJocywgbGhzUm93LCByZXNSb3cpOworICAgIHJlcyA9IHJlc1JvdzsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsUm93TWFqb3IsUm93TWFqb3IsQ29sTWFqb3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixSb3dNYWpvcj4gUm93TWFqb3JNYXRyaXg7CisgICAgUm93TWFqb3JNYXRyaXggcmVzUm93KGxocy5yb3dzKCksIHJocy5jb2xzKCkpOworICAgIGludGVybmFsOjpjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X2ltcGw8UmhzLExocyxSb3dNYWpvck1hdHJpeD4ocmhzLCBsaHMsIHJlc1Jvdyk7CisgICAgcmVzID0gcmVzUm93OworICB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IGNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfc2VsZWN0b3I8TGhzLFJocyxSZXN1bHRUeXBlLENvbE1ham9yLENvbE1ham9yLFJvd01ham9yPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czx0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGU+OjpTY2FsYXIgU2NhbGFyOworCisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixDb2xNYWpvcj4gQ29sTWFqb3JNYXRyaXg7CisgICAgQ29sTWFqb3JNYXRyaXggcmVzQ29sKGxocy5yb3dzKCksIHJocy5jb2xzKCkpOworICAgIGludGVybmFsOjpjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X2ltcGw8TGhzLFJocyxDb2xNYWpvck1hdHJpeD4obGhzLCByaHMsIHJlc0NvbCk7CisgICAgcmVzID0gcmVzQ29sOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0cnVjdCBjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3NlbGVjdG9yPExocyxSaHMsUmVzdWx0VHlwZSxSb3dNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUmVzdWx0VHlwZSYgcmVzKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLENvbE1ham9yPiBDb2xNYWpvck1hdHJpeDsKKyAgICBDb2xNYWpvck1hdHJpeCBsaHNDb2wgPSBsaHM7CisgICAgQ29sTWFqb3JNYXRyaXggcmVzQ29sKGxocy5yb3dzKCksIHJocy5jb2xzKCkpOworICAgIGludGVybmFsOjpjb25zZXJ2YXRpdmVfc3BhcnNlX3NwYXJzZV9wcm9kdWN0X2ltcGw8Q29sTWFqb3JNYXRyaXgsUmhzLENvbE1ham9yTWF0cml4PihsaHNDb2wsIHJocywgcmVzQ29sKTsKKyAgICByZXMgPSByZXNDb2w7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IGNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfc2VsZWN0b3I8TGhzLFJocyxSZXN1bHRUeXBlLENvbE1ham9yLFJvd01ham9yLFJvd01ham9yPgoreworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMpCisgIHsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXIsQ29sTWFqb3I+IENvbE1ham9yTWF0cml4OworICAgIENvbE1ham9yTWF0cml4IHJoc0NvbCA9IHJoczsKKyAgICBDb2xNYWpvck1hdHJpeCByZXNDb2wobGhzLnJvd3MoKSwgcmhzLmNvbHMoKSk7CisgICAgaW50ZXJuYWw6OmNvbnNlcnZhdGl2ZV9zcGFyc2Vfc3BhcnNlX3Byb2R1Y3RfaW1wbDxMaHMsQ29sTWFqb3JNYXRyaXgsQ29sTWFqb3JNYXRyaXg+KGxocywgcmhzQ29sLCByZXNDb2wpOworICAgIHJlcyA9IHJlc0NvbDsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3QgY29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsUm93TWFqb3IsUm93TWFqb3IsUm93TWFqb3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcykKKyAgeworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHR5cGVuYW1lIFJlc3VsdFR5cGU6OlNjYWxhcixSb3dNYWpvcj4gUm93TWFqb3JNYXRyaXg7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLENvbE1ham9yPiBDb2xNYWpvck1hdHJpeDsKKyAgICBSb3dNYWpvck1hdHJpeCByZXNSb3cobGhzLnJvd3MoKSxyaHMuY29scygpKTsKKyAgICBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9pbXBsPFJocyxMaHMsUm93TWFqb3JNYXRyaXg+KHJocywgbGhzLCByZXNSb3cpOworICAgIC8vIHNvcnQgdGhlIG5vbiB6ZXJvczoKKyAgICBDb2xNYWpvck1hdHJpeCByZXNDb2wocmVzUm93KTsKKyAgICByZXMgPSByZXNDb2w7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0NPTlNFUlZBVElWRVNQQVJTRVNQQVJTRVBST0RVQ1RfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvQ29yZUl0ZXJhdG9ycy5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvQ29yZUl0ZXJhdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTQ2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9Db3JlSXRlcmF0b3JzLmgKQEAgLTAsMCArMSw2MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQ09SRUlURVJBVE9SU19ICisjZGVmaW5lIEVJR0VOX0NPUkVJVEVSQVRPUlNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSByZXNwZWN0aXZlIElubmVySXRlcmF0b3IgZGVmaW5pdGlvbiBvZiB0aGUgZXhwcmVzc2lvbnMgZGVmaW5lZCBpbiBFaWdlbi9Db3JlCisgKi8KKworLyoqIFxpbmdyb3VwIFNwYXJzZUNvcmVfTW9kdWxlCisgICogXGNsYXNzIElubmVySXRlcmF0b3IKKyAgKiBcYnJpZWYgQW4gSW5uZXJJdGVyYXRvciBhbGxvd3MgdG8gbG9vcCBvdmVyIHRoZSBlbGVtZW50IG9mIGEgc3BhcnNlIChvciBkZW5zZSkgbWF0cml4IG9yIGV4cHJlc3Npb24KKyAgKgorICAqIHRvZG8KKyAgKi8KKworLy8gZ2VuZXJpYyB2ZXJzaW9uIGZvciBkZW5zZSBtYXRyaXggYW5kIGV4cHJlc3Npb25zCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBEZW5zZUJhc2U8RGVyaXZlZD46OklubmVySXRlcmF0b3IKK3sKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IEluZGV4OworCisgICAgZW51bSB7IElzUm93TWFqb3IgPSAoRGVyaXZlZDo6RmxhZ3MmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCB9OworICBwdWJsaWM6CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbm5lckl0ZXJhdG9yKGNvbnN0IERlcml2ZWQmIGV4cHIsIEluZGV4IG91dGVyKQorICAgICAgOiBtX2V4cHJlc3Npb24oZXhwciksIG1faW5uZXIoMCksIG1fb3V0ZXIob3V0ZXIpLCBtX2VuZChleHByLmlubmVyU2l6ZSgpKQorICAgIHt9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNjYWxhciB2YWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIChJc1Jvd01ham9yKSA/IG1fZXhwcmVzc2lvbi5jb2VmZihtX291dGVyLCBtX2lubmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fZXhwcmVzc2lvbi5jb2VmZihtX2lubmVyLCBtX291dGVyKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IG1faW5uZXIrKzsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbm5lcjsgfQorICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlciA6IGluZGV4KCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IGluZGV4KCkgOiBtX291dGVyOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX2lubmVyIDwgbV9lbmQgJiYgbV9pbm5lcj49MDsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBEZXJpdmVkJiBtX2V4cHJlc3Npb247CisgICAgSW5kZXggbV9pbm5lcjsKKyAgICBjb25zdCBJbmRleCBtX291dGVyOworICAgIGNvbnN0IEluZGV4IG1fZW5kOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9DT1JFSVRFUkFUT1JTX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL01hcHBlZFNwYXJzZU1hdHJpeC5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvTWFwcGVkU3BhcnNlTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjZDQ4MwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL01hcHBlZFNwYXJzZU1hdHJpeC5oCkBAIC0wLDAgKzEsMTc5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFQUEVEX1NQQVJTRU1BVFJJWF9ICisjZGVmaW5lIEVJR0VOX01BUFBFRF9TUEFSU0VNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxjbGFzcyBNYXBwZWRTcGFyc2VNYXRyaXgKKyAgKgorICAqIFxicmllZiBTcGFyc2UgbWF0cml4CisgICoKKyAgKiBccGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4gdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqCisgICogU2VlIGh0dHA6Ly93d3cubmV0bGliLm9yZy9saW5hbGcvaHRtbF90ZW1wbGF0ZXMvbm9kZTkxLmh0bWwgZm9yIGRldGFpbHMgb24gdGhlIHN0b3JhZ2Ugc2NoZW1lLgorICAqCisgICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9GbGFncywgdHlwZW5hbWUgX0luZGV4Pgorc3RydWN0IHRyYWl0czxNYXBwZWRTcGFyc2VNYXRyaXg8X1NjYWxhciwgX0ZsYWdzLCBfSW5kZXg+ID4gOiB0cmFpdHM8U3BhcnNlTWF0cml4PF9TY2FsYXIsIF9GbGFncywgX0luZGV4PiA+Cit7fTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9GbGFncywgdHlwZW5hbWUgX0luZGV4PgorY2xhc3MgTWFwcGVkU3BhcnNlTWF0cml4CisgIDogcHVibGljIFNwYXJzZU1hdHJpeEJhc2U8TWFwcGVkU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9GbGFncywgX0luZGV4PiA+Cit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShNYXBwZWRTcGFyc2VNYXRyaXgpCisgICAgZW51bSB7IElzUm93TWFqb3IgPSBCYXNlOjpJc1Jvd01ham9yIH07CisKKyAgcHJvdGVjdGVkOgorCisgICAgSW5kZXggICBtX291dGVyU2l6ZTsKKyAgICBJbmRleCAgIG1faW5uZXJTaXplOworICAgIEluZGV4ICAgbV9ubno7CisgICAgSW5kZXgqICBtX291dGVySW5kZXg7CisgICAgSW5kZXgqICBtX2lubmVySW5kaWNlczsKKyAgICBTY2FsYXIqIG1fdmFsdWVzOworCisgIHB1YmxpYzoKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXJTaXplIDogbV9pbm5lclNpemU7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX2lubmVyU2l6ZSA6IG1fb3V0ZXJTaXplOyB9CisgICAgaW5saW5lIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5uZXJTaXplOyB9CisgICAgaW5saW5lIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3V0ZXJTaXplOyB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBkaXJlY3QgYWNjZXNzIGludGVyZmFjZQorICAgIGlubGluZSBjb25zdCBTY2FsYXIqIHZhbHVlUHRyKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KKyAgICBpbmxpbmUgU2NhbGFyKiB2YWx1ZVB0cigpIHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKKyAgICBpbmxpbmUgY29uc3QgSW5kZXgqIGlubmVySW5kZXhQdHIoKSBjb25zdCB7IHJldHVybiBtX2lubmVySW5kaWNlczsgfQorICAgIGlubGluZSBJbmRleCogaW5uZXJJbmRleFB0cigpIHsgcmV0dXJuIG1faW5uZXJJbmRpY2VzOyB9CisKKyAgICBpbmxpbmUgY29uc3QgSW5kZXgqIG91dGVySW5kZXhQdHIoKSBjb25zdCB7IHJldHVybiBtX291dGVySW5kZXg7IH0KKyAgICBpbmxpbmUgSW5kZXgqIG91dGVySW5kZXhQdHIoKSB7IHJldHVybiBtX291dGVySW5kZXg7IH0KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGlubGluZSBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICBJbmRleCBzdGFydCA9IG1fb3V0ZXJJbmRleFtvdXRlcl07CisgICAgICBJbmRleCBlbmQgPSBtX291dGVySW5kZXhbb3V0ZXIrMV07CisgICAgICBpZiAoc3RhcnQ9PWVuZCkKKyAgICAgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgICAgIGVsc2UgaWYgKGVuZD4wICYmIGlubmVyPT1tX2lubmVySW5kaWNlc1tlbmQtMV0pCisgICAgICAgIHJldHVybiBtX3ZhbHVlc1tlbmQtMV07CisgICAgICAvLyBeXiAgb3B0aW1pemF0aW9uOiBsZXQncyBmaXJzdCBjaGVjayBpZiBpdCBpcyB0aGUgbGFzdCBjb2VmZmljaWVudAorICAgICAgLy8gKHZlcnkgY29tbW9uIGluIGhpZ2ggbGV2ZWwgYWxnb3JpdGhtcykKKworICAgICAgY29uc3QgSW5kZXgqIHIgPSBzdGQ6Omxvd2VyX2JvdW5kKCZtX2lubmVySW5kaWNlc1tzdGFydF0sJm1faW5uZXJJbmRpY2VzW2VuZC0xXSxpbm5lcik7CisgICAgICBjb25zdCBJbmRleCBpZCA9IHItJm1faW5uZXJJbmRpY2VzWzBdOworICAgICAgcmV0dXJuICgoKnI9PWlubmVyKSAmJiAoaWQ8ZW5kKSkgPyBtX3ZhbHVlc1tpZF0gOiBTY2FsYXIoMCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICBJbmRleCBzdGFydCA9IG1fb3V0ZXJJbmRleFtvdXRlcl07CisgICAgICBJbmRleCBlbmQgPSBtX291dGVySW5kZXhbb3V0ZXIrMV07CisgICAgICBlaWdlbl9hc3NlcnQoZW5kPj1zdGFydCAmJiAieW91IHByb2JhYmx5IGNhbGxlZCBjb2VmZlJlZiBvbiBhIG5vbiBmaW5hbGl6ZWQgbWF0cml4Iik7CisgICAgICBlaWdlbl9hc3NlcnQoZW5kPnN0YXJ0ICYmICJjb2VmZlJlZiBjYW5ub3QgYmUgY2FsbGVkIG9uIGEgemVybyBjb2VmZmljaWVudCIpOworICAgICAgSW5kZXgqIHIgPSBzdGQ6Omxvd2VyX2JvdW5kKCZtX2lubmVySW5kaWNlc1tzdGFydF0sJm1faW5uZXJJbmRpY2VzW2VuZF0saW5uZXIpOworICAgICAgY29uc3QgSW5kZXggaWQgPSByLSZtX2lubmVySW5kaWNlc1swXTsKKyAgICAgIGVpZ2VuX2Fzc2VydCgoKnI9PWlubmVyKSAmJiAoaWQ8ZW5kKSAmJiAiY29lZmZSZWYgY2Fubm90IGJlIGNhbGxlZCBvbiBhIHplcm8gY29lZmZpY2llbnQiKTsKKyAgICAgIHJldHVybiBtX3ZhbHVlc1tpZF07CisgICAgfQorCisgICAgY2xhc3MgSW5uZXJJdGVyYXRvcjsKKyAgICBjbGFzcyBSZXZlcnNlSW5uZXJJdGVyYXRvcjsKKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvIGNvZWZmaWNpZW50cyAqLworICAgIGlubGluZSBJbmRleCBub25aZXJvcygpIGNvbnN0ICB7IHJldHVybiBtX25uejsgfQorCisgICAgaW5saW5lIE1hcHBlZFNwYXJzZU1hdHJpeChJbmRleCByb3dzLCBJbmRleCBjb2xzLCBJbmRleCBubnosIEluZGV4KiBvdXRlckluZGV4UHRyLCBJbmRleCogaW5uZXJJbmRleFB0ciwgU2NhbGFyKiB2YWx1ZVB0cikKKyAgICAgIDogbV9vdXRlclNpemUoSXNSb3dNYWpvcj9yb3dzOmNvbHMpLCBtX2lubmVyU2l6ZShJc1Jvd01ham9yP2NvbHM6cm93cyksIG1fbm56KG5ueiksIG1fb3V0ZXJJbmRleChvdXRlckluZGV4UHRyKSwKKyAgICAgICAgbV9pbm5lckluZGljZXMoaW5uZXJJbmRleFB0ciksIG1fdmFsdWVzKHZhbHVlUHRyKQorICAgIHt9CisKKyAgICAvKiogRW1wdHkgZGVzdHJ1Y3RvciAqLworICAgIGlubGluZSB+TWFwcGVkU3BhcnNlTWF0cml4KCkge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IF9GbGFncywgdHlwZW5hbWUgX0luZGV4PgorY2xhc3MgTWFwcGVkU3BhcnNlTWF0cml4PFNjYWxhcixfRmxhZ3MsX0luZGV4Pjo6SW5uZXJJdGVyYXRvcgoreworICBwdWJsaWM6CisgICAgSW5uZXJJdGVyYXRvcihjb25zdCBNYXBwZWRTcGFyc2VNYXRyaXgmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgICA6IG1fbWF0cml4KG1hdCksCisgICAgICAgIG1fb3V0ZXIob3V0ZXIpLAorICAgICAgICBtX2lkKG1hdC5vdXRlckluZGV4UHRyKClbb3V0ZXJdKSwKKyAgICAgICAgbV9zdGFydChtX2lkKSwKKyAgICAgICAgbV9lbmQobWF0Lm91dGVySW5kZXhQdHIoKVtvdXRlcisxXSkKKyAgICB7fQorCisgICAgaW5saW5lIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IG1faWQrKzsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgudmFsdWVQdHIoKVttX2lkXTsgfQorICAgIGlubGluZSBTY2FsYXImIHZhbHVlUmVmKCkgeyByZXR1cm4gY29uc3RfY2FzdDxTY2FsYXImPihtX21hdHJpeC52YWx1ZVB0cigpW21faWRdKTsgfQorCisgICAgaW5saW5lIEluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguaW5uZXJJbmRleFB0cigpW21faWRdOyB9CisgICAgaW5saW5lIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyIDogaW5kZXgoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gaW5kZXgoKSA6IG1fb3V0ZXI7IH0KKworICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKG1faWQgPCBtX2VuZCkgJiYgKG1faWQ+PW1fc3RhcnQpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IE1hcHBlZFNwYXJzZU1hdHJpeCYgbV9tYXRyaXg7CisgICAgY29uc3QgSW5kZXggbV9vdXRlcjsKKyAgICBJbmRleCBtX2lkOworICAgIGNvbnN0IEluZGV4IG1fc3RhcnQ7CisgICAgY29uc3QgSW5kZXggbV9lbmQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfRmxhZ3MsIHR5cGVuYW1lIF9JbmRleD4KK2NsYXNzIE1hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXIsX0ZsYWdzLF9JbmRleD46OlJldmVyc2VJbm5lckl0ZXJhdG9yCit7CisgIHB1YmxpYzoKKyAgICBSZXZlcnNlSW5uZXJJdGVyYXRvcihjb25zdCBNYXBwZWRTcGFyc2VNYXRyaXgmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgICA6IG1fbWF0cml4KG1hdCksCisgICAgICAgIG1fb3V0ZXIob3V0ZXIpLAorICAgICAgICBtX2lkKG1hdC5vdXRlckluZGV4UHRyKClbb3V0ZXIrMV0pLAorICAgICAgICBtX3N0YXJ0KG1hdC5vdXRlckluZGV4UHRyKClbb3V0ZXJdKSwKKyAgICAgICAgbV9lbmQobV9pZCkKKyAgICB7fQorCisgICAgaW5saW5lIFJldmVyc2VJbm5lckl0ZXJhdG9yJiBvcGVyYXRvci0tKCkgeyBtX2lkLS07IHJldHVybiAqdGhpczsgfQorCisgICAgaW5saW5lIFNjYWxhciB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnZhbHVlUHRyKClbbV9pZC0xXTsgfQorICAgIGlubGluZSBTY2FsYXImIHZhbHVlUmVmKCkgeyByZXR1cm4gY29uc3RfY2FzdDxTY2FsYXImPihtX21hdHJpeC52YWx1ZVB0cigpW21faWQtMV0pOyB9CisKKyAgICBpbmxpbmUgSW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5pbm5lckluZGV4UHRyKClbbV9pZC0xXTsgfQorICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlciA6IGluZGV4KCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IGluZGV4KCkgOiBtX291dGVyOyB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIChtX2lkIDw9IG1fZW5kKSAmJiAobV9pZD5tX3N0YXJ0KTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBNYXBwZWRTcGFyc2VNYXRyaXgmIG1fbWF0cml4OworICAgIGNvbnN0IEluZGV4IG1fb3V0ZXI7CisgICAgSW5kZXggbV9pZDsKKyAgICBjb25zdCBJbmRleCBtX3N0YXJ0OworICAgIGNvbnN0IEluZGV4IG1fZW5kOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVBQRURfU1BBUlNFTUFUUklYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZUFzc2lnbi5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQXNzaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZUFzc2lnbi5oCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VCbG9jay5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWZkODA3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQmxvY2suaApAQCAtMCwwICsxLDM4NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX0JMT0NLX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0JMT0NLX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgU2l6ZT4KK3N0cnVjdCB0cmFpdHM8U3BhcnNlSW5uZXJWZWN0b3JTZXQ8TWF0cml4VHlwZSwgU2l6ZT4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8TWF0cml4VHlwZT46OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxNYXRyaXhUeXBlPjo6U3RvcmFnZUtpbmQgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgTWF0cml4WHByIFhwcktpbmQ7CisgIGVudW0geworICAgIElzUm93TWFqb3IgPSAoaW50KE1hdHJpeFR5cGU6OkZsYWdzKSZSb3dNYWpvckJpdCk9PVJvd01ham9yQml0LAorICAgIEZsYWdzID0gTWF0cml4VHlwZTo6RmxhZ3MsCisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBJc1Jvd01ham9yID8gU2l6ZSA6IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gSXNSb3dNYWpvciA/IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIDogU2l6ZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gQ29sc0F0Q29tcGlsZVRpbWUsCisgICAgQ29lZmZSZWFkQ29zdCA9IE1hdHJpeFR5cGU6OkNvZWZmUmVhZENvc3QKKyAgfTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFNpemU+CitjbGFzcyBTcGFyc2VJbm5lclZlY3RvclNldCA6IGludGVybmFsOjpub19hc3NpZ25tZW50X29wZXJhdG9yLAorICBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VJbm5lclZlY3RvclNldDxNYXRyaXhUeXBlLCBTaXplPiA+Cit7CisgIHB1YmxpYzoKKworICAgIGVudW0geyBJc1Jvd01ham9yID0gaW50ZXJuYWw6OnRyYWl0czxTcGFyc2VJbm5lclZlY3RvclNldD46OklzUm93TWFqb3IgfTsKKworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFNwYXJzZUlubmVyVmVjdG9yU2V0KQorICAgIGNsYXNzIElubmVySXRlcmF0b3I6IHB1YmxpYyBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yCisgICAgeworICAgICAgcHVibGljOgorICAgICAgICBpbmxpbmUgSW5uZXJJdGVyYXRvcihjb25zdCBTcGFyc2VJbm5lclZlY3RvclNldCYgeHByLCBJbmRleCBvdXRlcikKKyAgICAgICAgICA6IE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IoeHByLm1fbWF0cml4LCB4cHIubV9vdXRlclN0YXJ0ICsgb3V0ZXIpLCBtX291dGVyKG91dGVyKQorICAgICAgICB7fQorICAgICAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXIgOiB0aGlzLT5pbmRleCgpOyB9CisgICAgICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gdGhpcy0+aW5kZXgoKSA6IG1fb3V0ZXI7IH0KKyAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgSW5kZXggbV9vdXRlcjsKKyAgICB9OworICAgIGNsYXNzIFJldmVyc2VJbm5lckl0ZXJhdG9yOiBwdWJsaWMgTWF0cml4VHlwZTo6UmV2ZXJzZUlubmVySXRlcmF0b3IKKyAgICB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGlubGluZSBSZXZlcnNlSW5uZXJJdGVyYXRvcihjb25zdCBTcGFyc2VJbm5lclZlY3RvclNldCYgeHByLCBJbmRleCBvdXRlcikKKyAgICAgICAgICA6IE1hdHJpeFR5cGU6OlJldmVyc2VJbm5lckl0ZXJhdG9yKHhwci5tX21hdHJpeCwgeHByLm1fb3V0ZXJTdGFydCArIG91dGVyKSwgbV9vdXRlcihvdXRlcikKKyAgICAgICAge30KKyAgICAgICAgaW5saW5lIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyIDogdGhpcy0+aW5kZXgoKTsgfQorICAgICAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IHRoaXMtPmluZGV4KCkgOiBtX291dGVyOyB9CisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIEluZGV4IG1fb3V0ZXI7CisgICAgfTsKKworICAgIGlubGluZSBTcGFyc2VJbm5lclZlY3RvclNldChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIEluZGV4IG91dGVyU3RhcnQsIEluZGV4IG91dGVyU2l6ZSkKKyAgICAgIDogbV9tYXRyaXgobWF0cml4KSwgbV9vdXRlclN0YXJ0KG91dGVyU3RhcnQpLCBtX291dGVyU2l6ZShvdXRlclNpemUpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KCAob3V0ZXJTdGFydD49MCkgJiYgKChvdXRlclN0YXJ0K291dGVyU2l6ZSk8PW1hdHJpeC5vdXRlclNpemUoKSkgKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU3BhcnNlSW5uZXJWZWN0b3JTZXQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBJbmRleCBvdXRlcikKKyAgICAgIDogbV9tYXRyaXgobWF0cml4KSwgbV9vdXRlclN0YXJ0KG91dGVyKSwgbV9vdXRlclNpemUoU2l6ZSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoU2l6ZSE9RHluYW1pYyk7CisgICAgICBlaWdlbl9hc3NlcnQoIChvdXRlcj49MCkgJiYgKG91dGVyPG1hdHJpeC5vdXRlclNpemUoKSkgKTsKKyAgICB9CisKKy8vICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisvLyAgICAgaW5saW5lIFNwYXJzZUlubmVyVmVjdG9yU2V0JiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKy8vICAgICB7CisvLyAgICAgICByZXR1cm4gKnRoaXM7CisvLyAgICAgfQorCisvLyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlPgorLy8gICAgIGlubGluZSBTcGFyc2VJbm5lclZlY3RvclNldCYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisvLyAgICAgeworLy8gICAgICAgcmV0dXJuICp0aGlzOworLy8gICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyU2l6ZS52YWx1ZSgpIDogbV9tYXRyaXgucm93cygpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fbWF0cml4LmNvbHMoKSA6IG1fb3V0ZXJTaXplLnZhbHVlKCk7IH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9tYXRyaXg7CisgICAgSW5kZXggbV9vdXRlclN0YXJ0OworICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBTaXplPiBtX291dGVyU2l6ZTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzcGVjaWFsaXNhdGlvbiBmb3IgU3BhcnNlTWF0cml4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4LCBpbnQgU2l6ZT4KK2NsYXNzIFNwYXJzZUlubmVyVmVjdG9yU2V0PFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX0luZGV4PiwgU2l6ZT4KKyAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VJbm5lclZlY3RvclNldDxTcGFyc2VNYXRyaXg8X1NjYWxhciwgX09wdGlvbnMsIF9JbmRleD4sIFNpemU+ID4KK3sKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX0luZGV4PiBNYXRyaXhUeXBlOworICBwdWJsaWM6CisKKyAgICBlbnVtIHsgSXNSb3dNYWpvciA9IGludGVybmFsOjp0cmFpdHM8U3BhcnNlSW5uZXJWZWN0b3JTZXQ+OjpJc1Jvd01ham9yIH07CisKKyAgICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShTcGFyc2VJbm5lclZlY3RvclNldCkKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yOiBwdWJsaWMgTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvcgorICAgIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgaW5saW5lIElubmVySXRlcmF0b3IoY29uc3QgU3BhcnNlSW5uZXJWZWN0b3JTZXQmIHhwciwgSW5kZXggb3V0ZXIpCisgICAgICAgICAgOiBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yKHhwci5tX21hdHJpeCwgeHByLm1fb3V0ZXJTdGFydCArIG91dGVyKSwgbV9vdXRlcihvdXRlcikKKyAgICAgICAge30KKyAgICAgICAgaW5saW5lIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyIDogdGhpcy0+aW5kZXgoKTsgfQorICAgICAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IHRoaXMtPmluZGV4KCkgOiBtX291dGVyOyB9CisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIEluZGV4IG1fb3V0ZXI7CisgICAgfTsKKyAgICBjbGFzcyBSZXZlcnNlSW5uZXJJdGVyYXRvcjogcHVibGljIE1hdHJpeFR5cGU6OlJldmVyc2VJbm5lckl0ZXJhdG9yCisgICAgeworICAgICAgcHVibGljOgorICAgICAgICBpbmxpbmUgUmV2ZXJzZUlubmVySXRlcmF0b3IoY29uc3QgU3BhcnNlSW5uZXJWZWN0b3JTZXQmIHhwciwgSW5kZXggb3V0ZXIpCisgICAgICAgICAgOiBNYXRyaXhUeXBlOjpSZXZlcnNlSW5uZXJJdGVyYXRvcih4cHIubV9tYXRyaXgsIHhwci5tX291dGVyU3RhcnQgKyBvdXRlciksIG1fb3V0ZXIob3V0ZXIpCisgICAgICAgIHt9CisgICAgICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlciA6IHRoaXMtPmluZGV4KCk7IH0KKyAgICAgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyB0aGlzLT5pbmRleCgpIDogbV9vdXRlcjsgfQorICAgICAgcHJvdGVjdGVkOgorICAgICAgICBJbmRleCBtX291dGVyOworICAgIH07CisKKyAgICBpbmxpbmUgU3BhcnNlSW5uZXJWZWN0b3JTZXQoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBJbmRleCBvdXRlclN0YXJ0LCBJbmRleCBvdXRlclNpemUpCisgICAgICA6IG1fbWF0cml4KG1hdHJpeCksIG1fb3V0ZXJTdGFydChvdXRlclN0YXJ0KSwgbV9vdXRlclNpemUob3V0ZXJTaXplKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCggKG91dGVyU3RhcnQ+PTApICYmICgob3V0ZXJTdGFydCtvdXRlclNpemUpPD1tYXRyaXgub3V0ZXJTaXplKCkpICk7CisgICAgfQorCisgICAgaW5saW5lIFNwYXJzZUlubmVyVmVjdG9yU2V0KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgSW5kZXggb3V0ZXIpCisgICAgICA6IG1fbWF0cml4KG1hdHJpeCksIG1fb3V0ZXJTdGFydChvdXRlciksIG1fb3V0ZXJTaXplKFNpemUpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KFNpemU9PTEpOworICAgICAgZWlnZW5fYXNzZXJ0KCAob3V0ZXI+PTApICYmIChvdXRlcjxtYXRyaXgub3V0ZXJTaXplKCkpICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGlubGluZSBTcGFyc2VJbm5lclZlY3RvclNldCYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlIF9OZXN0ZWRNYXRyaXhUeXBlOworICAgICAgX05lc3RlZE1hdHJpeFR5cGUmIG1hdHJpeCA9IGNvbnN0X2Nhc3Q8X05lc3RlZE1hdHJpeFR5cGUmPihtX21hdHJpeCk7OworICAgICAgLy8gVGhpcyBhc3NpZ25lbWVudCBpcyBzbG93IGlmIHRoaXMgdmVjdG9yIHNldCBpcyBub3QgZW1wdHkKKyAgICAgIC8vIGFuZC9vciBpdCBpcyBub3QgYXQgdGhlIGVuZCBvZiB0aGUgbm9uemVyb3Mgb2YgdGhlIHVuZGVybHlpbmcgbWF0cml4LgorCisgICAgICAvLyAxIC0gZXZhbCB0byBhIHRlbXBvcmFyeSB0byBhdm9pZCB0cmFuc3Bvc2l0aW9uIGFuZC9vciBhbGlhc2luZyBpc3N1ZXMKKyAgICAgIFNwYXJzZU1hdHJpeDxTY2FsYXIsIElzUm93TWFqb3IgPyBSb3dNYWpvciA6IENvbE1ham9yLCBJbmRleD4gdG1wKG90aGVyKTsKKworICAgICAgLy8gMiAtIGxldCdzIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZW5vdWdoIGFsbG9jYXRlZCBtZW1vcnkKKyAgICAgIEluZGV4IG5ueiAgICAgICAgICAgPSB0bXAubm9uWmVyb3MoKTsKKyAgICAgIEluZGV4IG5uel9wcmV2aW91cyAgPSBub25aZXJvcygpOworICAgICAgSW5kZXggZnJlZV9zaXplICAgICA9IEluZGV4KG1hdHJpeC5kYXRhKCkuYWxsb2NhdGVkU2l6ZSgpKSArIG5uel9wcmV2aW91czsKKyAgICAgIEluZGV4IG5uel9oZWFkICAgICAgPSBtX291dGVyU3RhcnQ9PTAgPyAwIDogbWF0cml4Lm91dGVySW5kZXhQdHIoKVttX291dGVyU3RhcnRdOworICAgICAgSW5kZXggdGFpbCAgICAgICAgICA9IG1fbWF0cml4Lm91dGVySW5kZXhQdHIoKVttX291dGVyU3RhcnQrbV9vdXRlclNpemUudmFsdWUoKV07CisgICAgICBJbmRleCBubnpfdGFpbCAgICAgID0gbWF0cml4Lm5vblplcm9zKCkgLSB0YWlsOworCisgICAgICBpZihubno+ZnJlZV9zaXplKQorICAgICAgeworICAgICAgICAvLyByZWFsbG9jIG1hbnVhbGx5IHRvIHJlZHVjZSBjb3BpZXMKKyAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6U3RvcmFnZSBuZXdkYXRhKG1fbWF0cml4Lm5vblplcm9zKCkgLSBubnpfcHJldmlvdXMgKyBubnopOworCisgICAgICAgIHN0ZDo6bWVtY3B5KCZuZXdkYXRhLnZhbHVlKDApLCAmbV9tYXRyaXguZGF0YSgpLnZhbHVlKDApLCBubnpfaGVhZCpzaXplb2YoU2NhbGFyKSk7CisgICAgICAgIHN0ZDo6bWVtY3B5KCZuZXdkYXRhLmluZGV4KDApLCAmbV9tYXRyaXguZGF0YSgpLmluZGV4KDApLCBubnpfaGVhZCpzaXplb2YoSW5kZXgpKTsKKworICAgICAgICBzdGQ6Om1lbWNweSgmbmV3ZGF0YS52YWx1ZShubnpfaGVhZCksICZ0bXAuZGF0YSgpLnZhbHVlKDApLCBubnoqc2l6ZW9mKFNjYWxhcikpOworICAgICAgICBzdGQ6Om1lbWNweSgmbmV3ZGF0YS5pbmRleChubnpfaGVhZCksICZ0bXAuZGF0YSgpLmluZGV4KDApLCBubnoqc2l6ZW9mKEluZGV4KSk7CisKKyAgICAgICAgc3RkOjptZW1jcHkoJm5ld2RhdGEudmFsdWUobm56X2hlYWQrbm56KSwgJm1hdHJpeC5kYXRhKCkudmFsdWUodGFpbCksIG5uel90YWlsKnNpemVvZihTY2FsYXIpKTsKKyAgICAgICAgc3RkOjptZW1jcHkoJm5ld2RhdGEuaW5kZXgobm56X2hlYWQrbm56KSwgJm1hdHJpeC5kYXRhKCkuaW5kZXgodGFpbCksIG5uel90YWlsKnNpemVvZihJbmRleCkpOworCisgICAgICAgIG1hdHJpeC5kYXRhKCkuc3dhcChuZXdkYXRhKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8gbm8gbmVlZCB0byByZWFsbG9jLCBzaW1wbHkgY29weSB0aGUgdGFpbCBhdCBpdHMgcmVzcGVjdGl2ZSBwb3NpdGlvbiBhbmQgaW5zZXJ0IHRtcAorICAgICAgICBtYXRyaXguZGF0YSgpLnJlc2l6ZShubnpfaGVhZCArIG5ueiArIG5uel90YWlsKTsKKworICAgICAgICBpZihubno8bm56X3ByZXZpb3VzKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjptZW1jcHkoJm1hdHJpeC5kYXRhKCkudmFsdWUobm56X2hlYWQrbm56KSwgJm1hdHJpeC5kYXRhKCkudmFsdWUodGFpbCksIG5uel90YWlsKnNpemVvZihTY2FsYXIpKTsKKyAgICAgICAgICBzdGQ6Om1lbWNweSgmbWF0cml4LmRhdGEoKS5pbmRleChubnpfaGVhZCtubnopLCAmbWF0cml4LmRhdGEoKS5pbmRleCh0YWlsKSwgbm56X3RhaWwqc2l6ZW9mKEluZGV4KSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZm9yKEluZGV4IGk9bm56X3RhaWwtMTsgaT49MDsgLS1pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdHJpeC5kYXRhKCkudmFsdWUobm56X2hlYWQrbm56K2kpID0gbWF0cml4LmRhdGEoKS52YWx1ZSh0YWlsK2kpOworICAgICAgICAgICAgbWF0cml4LmRhdGEoKS5pbmRleChubnpfaGVhZCtubnoraSkgPSBtYXRyaXguZGF0YSgpLmluZGV4KHRhaWwraSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjptZW1jcHkoJm1hdHJpeC5kYXRhKCkudmFsdWUobm56X2hlYWQpLCAmdG1wLmRhdGEoKS52YWx1ZSgwKSwgbm56KnNpemVvZihTY2FsYXIpKTsKKyAgICAgICAgc3RkOjptZW1jcHkoJm1hdHJpeC5kYXRhKCkuaW5kZXgobm56X2hlYWQpLCAmdG1wLmRhdGEoKS5pbmRleCgwKSwgbm56KnNpemVvZihJbmRleCkpOworICAgICAgfQorCisgICAgICAvLyB1cGRhdGUgb3V0ZXIgaW5kZXggcG9pbnRlcnMKKyAgICAgIEluZGV4IHAgPSBubnpfaGVhZDsKKyAgICAgIGZvcihJbmRleCBrPTA7IGs8bV9vdXRlclNpemUudmFsdWUoKTsgKytrKQorICAgICAgeworICAgICAgICBtYXRyaXgub3V0ZXJJbmRleFB0cigpW21fb3V0ZXJTdGFydCtrXSA9IHA7CisgICAgICAgIHAgKz0gdG1wLmlubmVyVmVjdG9yKGspLm5vblplcm9zKCk7CisgICAgICB9CisgICAgICBzdGQ6OnB0cmRpZmZfdCBvZmZzZXQgPSBubnogLSBubnpfcHJldmlvdXM7CisgICAgICBmb3IoSW5kZXggayA9IG1fb3V0ZXJTdGFydCArIG1fb3V0ZXJTaXplLnZhbHVlKCk7IGs8PW1hdHJpeC5vdXRlclNpemUoKTsgKytrKQorICAgICAgeworICAgICAgICBtYXRyaXgub3V0ZXJJbmRleFB0cigpW2tdICs9IG9mZnNldDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBTcGFyc2VJbm5lclZlY3RvclNldCYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZUlubmVyVmVjdG9yU2V0JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gb3BlcmF0b3I9PFNwYXJzZUlubmVyVmVjdG9yU2V0PihvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogdmFsdWVQdHIoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fbWF0cml4LnZhbHVlUHRyKCkgKyBtX21hdHJpeC5vdXRlckluZGV4UHRyKClbbV9vdXRlclN0YXJ0XTsgfQorICAgIGlubGluZSBTY2FsYXIqIHZhbHVlUHRyKCkKKyAgICB7IHJldHVybiBtX21hdHJpeC5jb25zdF9jYXN0X2Rlcml2ZWQoKS52YWx1ZVB0cigpICsgbV9tYXRyaXgub3V0ZXJJbmRleFB0cigpW21fb3V0ZXJTdGFydF07IH0KKworICAgIGlubGluZSBjb25zdCBJbmRleCogaW5uZXJJbmRleFB0cigpIGNvbnN0CisgICAgeyByZXR1cm4gbV9tYXRyaXguaW5uZXJJbmRleFB0cigpICsgbV9tYXRyaXgub3V0ZXJJbmRleFB0cigpW21fb3V0ZXJTdGFydF07IH0KKyAgICBpbmxpbmUgSW5kZXgqIGlubmVySW5kZXhQdHIoKQorICAgIHsgcmV0dXJuIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLmlubmVySW5kZXhQdHIoKSArIG1fbWF0cml4Lm91dGVySW5kZXhQdHIoKVttX291dGVyU3RhcnRdOyB9CisKKyAgICBpbmxpbmUgY29uc3QgSW5kZXgqIG91dGVySW5kZXhQdHIoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fbWF0cml4Lm91dGVySW5kZXhQdHIoKSArIG1fb3V0ZXJTdGFydDsgfQorICAgIGlubGluZSBJbmRleCogb3V0ZXJJbmRleFB0cigpCisgICAgeyByZXR1cm4gbV9tYXRyaXguY29uc3RfY2FzdF9kZXJpdmVkKCkub3V0ZXJJbmRleFB0cigpICsgbV9vdXRlclN0YXJ0OyB9CisKKyAgICBJbmRleCBub25aZXJvcygpIGNvbnN0CisgICAgeworICAgICAgaWYobV9tYXRyaXguaXNDb21wcmVzc2VkKCkpCisgICAgICAgIHJldHVybiAgc3RkOjpzaXplX3QobV9tYXRyaXgub3V0ZXJJbmRleFB0cigpW21fb3V0ZXJTdGFydCttX291dGVyU2l6ZS52YWx1ZSgpXSkKKyAgICAgICAgICAgICAgLSBzdGQ6OnNpemVfdChtX21hdHJpeC5vdXRlckluZGV4UHRyKClbbV9vdXRlclN0YXJ0XSk7CisgICAgICBlbHNlIGlmKG1fb3V0ZXJTaXplLnZhbHVlKCk9PTApCisgICAgICAgIHJldHVybiAwOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTWFwPGNvbnN0IE1hdHJpeDxJbmRleCxTaXplLDE+ID4obV9tYXRyaXguaW5uZXJOb25aZXJvUHRyKCkrbV9vdXRlclN0YXJ0LCBtX291dGVyU2l6ZS52YWx1ZSgpKS5zdW0oKTsKKyAgICB9CisKKyAgICBjb25zdCBTY2FsYXImIGxhc3RDb2VmZigpIGNvbnN0CisgICAgeworICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShTcGFyc2VJbm5lclZlY3RvclNldCk7CisgICAgICBlaWdlbl9hc3NlcnQobm9uWmVyb3MoKT4wKTsKKyAgICAgIGlmKG1fbWF0cml4LmlzQ29tcHJlc3NlZCgpKQorICAgICAgICByZXR1cm4gbV9tYXRyaXgudmFsdWVQdHIoKVttX21hdHJpeC5vdXRlckluZGV4UHRyKClbbV9vdXRlclN0YXJ0KzFdLTFdOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbV9tYXRyaXgudmFsdWVQdHIoKVttX21hdHJpeC5vdXRlckluZGV4UHRyKClbbV9vdXRlclN0YXJ0XSttX21hdHJpeC5pbm5lck5vblplcm9QdHIoKVttX291dGVyU3RhcnRdLTFdOworICAgIH0KKworLy8gICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZT4KKy8vICAgICBpbmxpbmUgU3BhcnNlSW5uZXJWZWN0b3JTZXQmIG9wZXJhdG9yPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorLy8gICAgIHsKKy8vICAgICAgIHJldHVybiAqdGhpczsKKy8vICAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlclNpemUudmFsdWUoKSA6IG1fbWF0cml4LnJvd3MoKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX21hdHJpeC5jb2xzKCkgOiBtX291dGVyU2l6ZS52YWx1ZSgpOyB9CisKKyAgcHJvdGVjdGVkOgorCisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG1fbWF0cml4OworICAgIEluZGV4IG1fb3V0ZXJTdGFydDsKKyAgICBjb25zdCBpbnRlcm5hbDo6dmFyaWFibGVfaWZfZHluYW1pYzxJbmRleCwgU2l6ZT4gbV9vdXRlclNpemU7CisKK307CisKKy8vLS0tLS0tLS0tLQorCisvKiogXHJldHVybnMgdGhlIGktdGggcm93IG9mIHRoZSBtYXRyaXggXGMgKnRoaXMuIEZvciByb3ctbWFqb3IgbWF0cml4IG9ubHkuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCwxPiBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojpyb3coSW5kZXggaSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChJc1Jvd01ham9yLFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX1JPV19NQUpPUl9NQVRSSUNFUyk7CisgIHJldHVybiBpbm5lclZlY3RvcihpKTsKK30KKworLyoqIFxyZXR1cm5zIHRoZSBpLXRoIHJvdyBvZiB0aGUgbWF0cml4IFxjICp0aGlzLiBGb3Igcm93LW1ham9yIG1hdHJpeCBvbmx5LgorICAqIChyZWFkLW9ubHkgdmVyc2lvbikgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLDE+IFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46OnJvdyhJbmRleCBpKSBjb25zdAoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKElzUm93TWFqb3IsVEhJU19NRVRIT0RfSVNfT05MWV9GT1JfUk9XX01BSk9SX01BVFJJQ0VTKTsKKyAgcmV0dXJuIGlubmVyVmVjdG9yKGkpOworfQorCisvKiogXHJldHVybnMgdGhlIGktdGggY29sdW1uIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMuIEZvciBjb2x1bW4tbWFqb3IgbWF0cml4IG9ubHkuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCwxPiBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjb2woSW5kZXggaSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCghSXNSb3dNYWpvcixUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9DT0xVTU5fTUFKT1JfTUFUUklDRVMpOworICByZXR1cm4gaW5uZXJWZWN0b3IoaSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgaS10aCBjb2x1bW4gb2YgdGhlIG1hdHJpeCBcYyAqdGhpcy4gRm9yIGNvbHVtbi1tYWpvciBtYXRyaXggb25seS4KKyAgKiAocmVhZC1vbmx5IHZlcnNpb24pICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCwxPiBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjb2woSW5kZXggaSkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCghSXNSb3dNYWpvcixUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9DT0xVTU5fTUFKT1JfTUFUUklDRVMpOworICByZXR1cm4gaW5uZXJWZWN0b3IoaSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgXGEgb3V0ZXIgLXRoIGNvbHVtbiAocmVzcC4gcm93KSBvZiB0aGUgbWF0cml4IFxjICp0aGlzIGlmIFxjICp0aGlzCisgICogaXMgY29sLW1ham9yIChyZXNwLiByb3ctbWFqb3IpLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK1NwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsMT4gU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6aW5uZXJWZWN0b3IoSW5kZXggb3V0ZXIpCit7IHJldHVybiBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLDE+KGRlcml2ZWQoKSwgb3V0ZXIpOyB9CisKKy8qKiBccmV0dXJucyB0aGUgXGEgb3V0ZXIgLXRoIGNvbHVtbiAocmVzcC4gcm93KSBvZiB0aGUgbWF0cml4IFxjICp0aGlzIGlmIFxjICp0aGlzCisgICogaXMgY29sLW1ham9yIChyZXNwLiByb3ctbWFqb3IpLiBSZWFkLW9ubHkuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCwxPiBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojppbm5lclZlY3RvcihJbmRleCBvdXRlcikgY29uc3QKK3sgcmV0dXJuIFNwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsMT4oZGVyaXZlZCgpLCBvdXRlcik7IH0KKworLyoqIFxyZXR1cm5zIHRoZSBpLXRoIHJvdyBvZiB0aGUgbWF0cml4IFxjICp0aGlzLiBGb3Igcm93LW1ham9yIG1hdHJpeCBvbmx5LiAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK1NwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsRHluYW1pYz4gU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6bWlkZGxlUm93cyhJbmRleCBzdGFydCwgSW5kZXggc2l6ZSkKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChJc1Jvd01ham9yLFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX1JPV19NQUpPUl9NQVRSSUNFUyk7CisgIHJldHVybiBpbm5lclZlY3RvcnMoc3RhcnQsIHNpemUpOworfQorCisvKiogXHJldHVybnMgdGhlIGktdGggcm93IG9mIHRoZSBtYXRyaXggXGMgKnRoaXMuIEZvciByb3ctbWFqb3IgbWF0cml4IG9ubHkuCisgICogKHJlYWQtb25seSB2ZXJzaW9uKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IFNwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsRHluYW1pYz4gU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6bWlkZGxlUm93cyhJbmRleCBzdGFydCwgSW5kZXggc2l6ZSkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChJc1Jvd01ham9yLFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX1JPV19NQUpPUl9NQVRSSUNFUyk7CisgIHJldHVybiBpbm5lclZlY3RvcnMoc3RhcnQsIHNpemUpOworfQorCisvKiogXHJldHVybnMgdGhlIGktdGggY29sdW1uIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMuIEZvciBjb2x1bW4tbWFqb3IgbWF0cml4IG9ubHkuICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCxEeW5hbWljPiBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjptaWRkbGVDb2xzKEluZGV4IHN0YXJ0LCBJbmRleCBzaXplKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKCFJc1Jvd01ham9yLFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0NPTFVNTl9NQUpPUl9NQVRSSUNFUyk7CisgIHJldHVybiBpbm5lclZlY3RvcnMoc3RhcnQsIHNpemUpOworfQorCisvKiogXHJldHVybnMgdGhlIGktdGggY29sdW1uIG9mIHRoZSBtYXRyaXggXGMgKnRoaXMuIEZvciBjb2x1bW4tbWFqb3IgbWF0cml4IG9ubHkuCisgICogKHJlYWQtb25seSB2ZXJzaW9uKSAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IFNwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsRHluYW1pYz4gU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6bWlkZGxlQ29scyhJbmRleCBzdGFydCwgSW5kZXggc2l6ZSkgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCghSXNSb3dNYWpvcixUSElTX01FVEhPRF9JU19PTkxZX0ZPUl9DT0xVTU5fTUFKT1JfTUFUUklDRVMpOworICByZXR1cm4gaW5uZXJWZWN0b3JzKHN0YXJ0LCBzaXplKTsKK30KKworCisKKy8qKiBccmV0dXJucyB0aGUgXGEgb3V0ZXIgLXRoIGNvbHVtbiAocmVzcC4gcm93KSBvZiB0aGUgbWF0cml4IFxjICp0aGlzIGlmIFxjICp0aGlzCisgICogaXMgY29sLW1ham9yIChyZXNwLiByb3ctbWFqb3IpLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK1NwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsRHluYW1pYz4gU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6aW5uZXJWZWN0b3JzKEluZGV4IG91dGVyU3RhcnQsIEluZGV4IG91dGVyU2l6ZSkKK3sgcmV0dXJuIFNwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsRHluYW1pYz4oZGVyaXZlZCgpLCBvdXRlclN0YXJ0LCBvdXRlclNpemUpOyB9CisKKy8qKiBccmV0dXJucyB0aGUgXGEgb3V0ZXIgLXRoIGNvbHVtbiAocmVzcC4gcm93KSBvZiB0aGUgbWF0cml4IFxjICp0aGlzIGlmIFxjICp0aGlzCisgICogaXMgY29sLW1ham9yIChyZXNwLiByb3ctbWFqb3IpLiBSZWFkLW9ubHkuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCxEeW5hbWljPiBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojppbm5lclZlY3RvcnMoSW5kZXggb3V0ZXJTdGFydCwgSW5kZXggb3V0ZXJTaXplKSBjb25zdAoreyByZXR1cm4gU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCxEeW5hbWljPihkZXJpdmVkKCksIG91dGVyU3RhcnQsIG91dGVyU2l6ZSk7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfQkxPQ0tfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQ3dpc2VCaW5hcnlPcC5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQ3dpc2VCaW5hcnlPcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Zjk3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VDd2lzZUJpbmFyeU9wLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfQ1dJU0VfQklOQVJZX09QX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0NXSVNFX0JJTkFSWV9PUF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvLyBIZXJlIHdlIGhhdmUgdG8gaGFuZGxlIDMgY2FzZXM6CisvLyAgMSAtIHNwYXJzZSBvcCBkZW5zZQorLy8gIDIgLSBkZW5zZSBvcCBzcGFyc2UKKy8vICAzIC0gc3BhcnNlIG9wIHNwYXJzZQorLy8gV2UgYWxzbyBuZWVkIHRvIGltcGxlbWVudCBhIDR0aCBpdGVyYXRvciBmb3I6CisvLyAgNCAtIGRlbnNlIG9wIGRlbnNlCisvLyBGaW5hbGx5LCB3ZSBhbHNvIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgcHJvZHVjdCBhbmQgb3RoZXIgb3BlcmF0aW9ucyA6CisvLyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uICAgICAgcmV0dXJuZWQgbW9kZQorLy8gIDEgLSBzcGFyc2Ugb3AgZGVuc2UgICAgcHJvZHVjdCAgICAgIHNwYXJzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgIGRlbnNlCisvLyAgMiAtIGRlbnNlIG9wIHNwYXJzZSAgICBwcm9kdWN0ICAgICAgc3BhcnNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljICAgICAgZGVuc2UKKy8vICAzIC0gc3BhcnNlIG9wIHNwYXJzZSAgIHByb2R1Y3QgICAgICBzcGFyc2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgICAgICBzcGFyc2UKKy8vICA0IC0gZGVuc2Ugb3AgZGVuc2UgICAgIHByb2R1Y3QgICAgICBkZW5zZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyAgICAgIGRlbnNlCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPD4gc3RydWN0IHByb21vdGVfc3RvcmFnZV90eXBlPERlbnNlLFNwYXJzZT4KK3sgdHlwZWRlZiBTcGFyc2UgcmV0OyB9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBwcm9tb3RlX3N0b3JhZ2VfdHlwZTxTcGFyc2UsRGVuc2U+Cit7IHR5cGVkZWYgU3BhcnNlIHJldDsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQmluYXJ5T3AsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXJpdmVkLAorICB0eXBlbmFtZSBfTGhzU3RvcmFnZU1vZGUgPSB0eXBlbmFtZSB0cmFpdHM8TGhzPjo6U3RvcmFnZUtpbmQsCisgIHR5cGVuYW1lIF9SaHNTdG9yYWdlTW9kZSA9IHR5cGVuYW1lIHRyYWl0czxSaHM+OjpTdG9yYWdlS2luZD4KK2NsYXNzIHNwYXJzZV9jd2lzZV9iaW5hcnlfb3BfaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3I7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitjbGFzcyBDd2lzZUJpbmFyeU9wSW1wbDxCaW5hcnlPcCwgTGhzLCBSaHMsIFNwYXJzZT4KKyAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxDd2lzZUJpbmFyeU9wPEJpbmFyeU9wLCBMaHMsIFJocz4gPgoreworICBwdWJsaWM6CisgICAgY2xhc3MgSW5uZXJJdGVyYXRvcjsKKyAgICBjbGFzcyBSZXZlcnNlSW5uZXJJdGVyYXRvcjsKKyAgICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiBEZXJpdmVkOworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQpCisgICAgQ3dpc2VCaW5hcnlPcEltcGwoKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxMaHM+OjpTdG9yYWdlS2luZCBMaHNTdG9yYWdlS2luZDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxSaHM+OjpTdG9yYWdlS2luZCBSaHNTdG9yYWdlS2luZDsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKAorICAgICAgICAgICAgICAgICghaW50ZXJuYWw6OmlzX3NhbWU8TGhzU3RvcmFnZUtpbmQsUmhzU3RvcmFnZUtpbmQ+Ojp2YWx1ZSkKKyAgICAgICAgICAgIHx8ICAoKExoczo6RmxhZ3MmUm93TWFqb3JCaXQpID09IChSaHM6OkZsYWdzJlJvd01ham9yQml0KSkpLAorICAgICAgICAgICAgVEhFX1NUT1JBR0VfT1JERVJfT0ZfQk9USF9TSURFU19NVVNUX01BVENIKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCaW5hcnlPcCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitjbGFzcyBDd2lzZUJpbmFyeU9wSW1wbDxCaW5hcnlPcCxMaHMsUmhzLFNwYXJzZT46OklubmVySXRlcmF0b3IKKyAgOiBwdWJsaWMgaW50ZXJuYWw6OnNwYXJzZV9jd2lzZV9iaW5hcnlfb3BfaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3I8QmluYXJ5T3AsTGhzLFJocyx0eXBlbmFtZSBDd2lzZUJpbmFyeU9wSW1wbDxCaW5hcnlPcCxMaHMsUmhzLFNwYXJzZT46OklubmVySXRlcmF0b3I+Cit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6c3BhcnNlX2N3aXNlX2JpbmFyeV9vcF9pbm5lcl9pdGVyYXRvcl9zZWxlY3RvcjwKKyAgICAgIEJpbmFyeU9wLExocyxSaHMsIElubmVySXRlcmF0b3I+IEJhc2U7CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3QgQ3dpc2VCaW5hcnlPcEltcGwmIGJpbk9wLCB0eXBlbmFtZSBDd2lzZUJpbmFyeU9wSW1wbDo6SW5kZXggb3V0ZXIpCisgICAgICA6IEJhc2UoYmluT3AuZGVyaXZlZCgpLG91dGVyKQorICAgIHt9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIGlubmVyLWl0ZXJhdG9ycworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaW50ZXJuYWw6OmZ1bmNfaXNfY29uanVuY3Rpb24geyBlbnVtIHsgcmV0ID0gZmFsc2UgfTsgfTsKKy8vIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBpbnRlcm5hbDo6ZnVuY19pc19jb25qdW5jdGlvbjxpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8VD4gPiB7IGVudW0geyByZXQgPSB0cnVlIH07IH07CisKKy8vIFRPRE8gZ2VuZXJhbGl6ZSB0aGUgaW50ZXJuYWw6OnNjYWxhcl9wcm9kdWN0X29wIHNwZWNpYWxpemF0aW9uIHRvIGFsbCBjb25qdW5jdGlvbnMgaWYgYW55ICEKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gc3BhcnNlIC0gc3BhcnNlICAoZ2VuZXJpYykKK3RlbXBsYXRlPHR5cGVuYW1lIEJpbmFyeU9wLCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIHNwYXJzZV9jd2lzZV9iaW5hcnlfb3BfaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3I8QmluYXJ5T3AsIExocywgUmhzLCBEZXJpdmVkLCBTcGFyc2UsIFNwYXJzZT4KK3sKKyAgICB0eXBlZGVmIEN3aXNlQmluYXJ5T3A8QmluYXJ5T3AsIExocywgUmhzPiBDd2lzZUJpbmFyeVhwcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxDd2lzZUJpbmFyeVhwcj46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8Q3dpc2VCaW5hcnlYcHI+OjpfTGhzTmVzdGVkIF9MaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8Q3dpc2VCaW5hcnlYcHI+OjpfUmhzTmVzdGVkIF9SaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTGhzTmVzdGVkOjpJbm5lckl0ZXJhdG9yIExoc0l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1Joc05lc3RlZDo6SW5uZXJJdGVyYXRvciBSaHNJdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisKKyAgcHVibGljOgorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBzcGFyc2VfY3dpc2VfYmluYXJ5X29wX2lubmVyX2l0ZXJhdG9yX3NlbGVjdG9yKGNvbnN0IEN3aXNlQmluYXJ5WHByJiB4cHIsIEluZGV4IG91dGVyKQorICAgICAgOiBtX2xoc0l0ZXIoeHByLmxocygpLG91dGVyKSwgbV9yaHNJdGVyKHhwci5yaHMoKSxvdXRlciksIG1fZnVuY3Rvcih4cHIuZnVuY3RvcigpKQorICAgIHsKKyAgICAgIHRoaXMtPm9wZXJhdG9yKysoKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgIGlmIChtX2xoc0l0ZXIgJiYgbV9yaHNJdGVyICYmIChtX2xoc0l0ZXIuaW5kZXgoKSA9PSBtX3Joc0l0ZXIuaW5kZXgoKSkpCisgICAgICB7CisgICAgICAgIG1faWQgPSBtX2xoc0l0ZXIuaW5kZXgoKTsKKyAgICAgICAgbV92YWx1ZSA9IG1fZnVuY3RvcihtX2xoc0l0ZXIudmFsdWUoKSwgbV9yaHNJdGVyLnZhbHVlKCkpOworICAgICAgICArK21fbGhzSXRlcjsKKyAgICAgICAgKyttX3Joc0l0ZXI7CisgICAgICB9CisgICAgICBlbHNlIGlmIChtX2xoc0l0ZXIgJiYgKCFtX3Joc0l0ZXIgfHwgKG1fbGhzSXRlci5pbmRleCgpIDwgbV9yaHNJdGVyLmluZGV4KCkpKSkKKyAgICAgIHsKKyAgICAgICAgbV9pZCA9IG1fbGhzSXRlci5pbmRleCgpOworICAgICAgICBtX3ZhbHVlID0gbV9mdW5jdG9yKG1fbGhzSXRlci52YWx1ZSgpLCBTY2FsYXIoMCkpOworICAgICAgICArK21fbGhzSXRlcjsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1fcmhzSXRlciAmJiAoIW1fbGhzSXRlciB8fCAobV9saHNJdGVyLmluZGV4KCkgPiBtX3Joc0l0ZXIuaW5kZXgoKSkpKQorICAgICAgeworICAgICAgICBtX2lkID0gbV9yaHNJdGVyLmluZGV4KCk7CisgICAgICAgIG1fdmFsdWUgPSBtX2Z1bmN0b3IoU2NhbGFyKDApLCBtX3Joc0l0ZXIudmFsdWUoKSk7CisgICAgICAgICsrbV9yaHNJdGVyOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtX3ZhbHVlID0gMDsgLy8gdGhpcyBpcyB0byBhdm9pZCBhIGNvbXBpbGF0aW9uIHdhcm5pbmcKKyAgICAgICAgbV9pZCA9IC0xOworICAgICAgfQorICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pZDsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gTGhzOjpJc1Jvd01ham9yID8gbV9saHNJdGVyLnJvdygpIDogaW5kZXgoKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gTGhzOjpJc1Jvd01ham9yID8gaW5kZXgoKSA6IG1fbGhzSXRlci5jb2woKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9pZD49MDsgfQorCisgIHByb3RlY3RlZDoKKyAgICBMaHNJdGVyYXRvciBtX2xoc0l0ZXI7CisgICAgUmhzSXRlcmF0b3IgbV9yaHNJdGVyOworICAgIGNvbnN0IEJpbmFyeU9wJiBtX2Z1bmN0b3I7CisgICAgU2NhbGFyIG1fdmFsdWU7CisgICAgSW5kZXggbV9pZDsKK307CisKKy8vIHNwYXJzZSAtIHNwYXJzZSAgKHByb2R1Y3QpCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIHNwYXJzZV9jd2lzZV9iaW5hcnlfb3BfaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3I8c2NhbGFyX3Byb2R1Y3Rfb3A8VD4sIExocywgUmhzLCBEZXJpdmVkLCBTcGFyc2UsIFNwYXJzZT4KK3sKKyAgICB0eXBlZGVmIHNjYWxhcl9wcm9kdWN0X29wPFQ+IEJpbmFyeUZ1bmM7CisgICAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPEJpbmFyeUZ1bmMsIExocywgUmhzPiBDd2lzZUJpbmFyeVhwcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEN3aXNlQmluYXJ5WHByOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPEN3aXNlQmluYXJ5WHByPjo6X0xoc05lc3RlZCBfTGhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0xoc05lc3RlZDo6SW5uZXJJdGVyYXRvciBMaHNJdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxDd2lzZUJpbmFyeVhwcj46Ol9SaHNOZXN0ZWQgX1Joc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SaHNOZXN0ZWQ6OklubmVySXRlcmF0b3IgUmhzSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBwdWJsaWM6CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIHNwYXJzZV9jd2lzZV9iaW5hcnlfb3BfaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3IoY29uc3QgQ3dpc2VCaW5hcnlYcHImIHhwciwgSW5kZXggb3V0ZXIpCisgICAgICA6IG1fbGhzSXRlcih4cHIubGhzKCksb3V0ZXIpLCBtX3Joc0l0ZXIoeHByLnJocygpLG91dGVyKSwgbV9mdW5jdG9yKHhwci5mdW5jdG9yKCkpCisgICAgeworICAgICAgd2hpbGUgKG1fbGhzSXRlciAmJiBtX3Joc0l0ZXIgJiYgKG1fbGhzSXRlci5pbmRleCgpICE9IG1fcmhzSXRlci5pbmRleCgpKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKG1fbGhzSXRlci5pbmRleCgpIDwgbV9yaHNJdGVyLmluZGV4KCkpCisgICAgICAgICAgKyttX2xoc0l0ZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICArK21fcmhzSXRlcjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgICsrbV9saHNJdGVyOworICAgICAgKyttX3Joc0l0ZXI7CisgICAgICB3aGlsZSAobV9saHNJdGVyICYmIG1fcmhzSXRlciAmJiAobV9saHNJdGVyLmluZGV4KCkgIT0gbV9yaHNJdGVyLmluZGV4KCkpKQorICAgICAgeworICAgICAgICBpZiAobV9saHNJdGVyLmluZGV4KCkgPCBtX3Joc0l0ZXIuaW5kZXgoKSkKKyAgICAgICAgICArK21fbGhzSXRlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICsrbV9yaHNJdGVyOworICAgICAgfQorICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3IobV9saHNJdGVyLnZhbHVlKCksIG1fcmhzSXRlci52YWx1ZSgpKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fbGhzSXRlci5pbmRleCgpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBtX2xoc0l0ZXIucm93KCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIG1fbGhzSXRlci5jb2woKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKG1fbGhzSXRlciAmJiBtX3Joc0l0ZXIpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIExoc0l0ZXJhdG9yIG1fbGhzSXRlcjsKKyAgICBSaHNJdGVyYXRvciBtX3Joc0l0ZXI7CisgICAgY29uc3QgQmluYXJ5RnVuYyYgbV9mdW5jdG9yOworfTsKKworLy8gc3BhcnNlIC0gZGVuc2UgIChwcm9kdWN0KQordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBzcGFyc2VfY3dpc2VfYmluYXJ5X29wX2lubmVyX2l0ZXJhdG9yX3NlbGVjdG9yPHNjYWxhcl9wcm9kdWN0X29wPFQ+LCBMaHMsIFJocywgRGVyaXZlZCwgU3BhcnNlLCBEZW5zZT4KK3sKKyAgICB0eXBlZGVmIHNjYWxhcl9wcm9kdWN0X29wPFQ+IEJpbmFyeUZ1bmM7CisgICAgdHlwZWRlZiBDd2lzZUJpbmFyeU9wPEJpbmFyeUZ1bmMsIExocywgUmhzPiBDd2lzZUJpbmFyeVhwcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEN3aXNlQmluYXJ5WHByOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPEN3aXNlQmluYXJ5WHByPjo6X0xoc05lc3RlZCBfTGhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPEN3aXNlQmluYXJ5WHByPjo6UmhzTmVzdGVkIFJoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9MaHNOZXN0ZWQ6OklubmVySXRlcmF0b3IgTGhzSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICAgIGVudW0geyBJc1Jvd01ham9yID0gKGludChMaHM6OkZsYWdzKSZSb3dNYWpvckJpdCk9PVJvd01ham9yQml0IH07CisgIHB1YmxpYzoKKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgc3BhcnNlX2N3aXNlX2JpbmFyeV9vcF9pbm5lcl9pdGVyYXRvcl9zZWxlY3Rvcihjb25zdCBDd2lzZUJpbmFyeVhwciYgeHByLCBJbmRleCBvdXRlcikKKyAgICAgIDogbV9yaHMoeHByLnJocygpKSwgbV9saHNJdGVyKHhwci5saHMoKSxvdXRlciksIG1fZnVuY3Rvcih4cHIuZnVuY3RvcigpKSwgbV9vdXRlcihvdXRlcikKKyAgICB7fQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICArK21fbGhzSXRlcjsKKyAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2NhbGFyIHZhbHVlKCkgY29uc3QKKyAgICB7IHJldHVybiBtX2Z1bmN0b3IobV9saHNJdGVyLnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgIG1fcmhzLmNvZWZmKElzUm93TWFqb3I/bV9vdXRlcjptX2xoc0l0ZXIuaW5kZXgoKSxJc1Jvd01ham9yP21fbGhzSXRlci5pbmRleCgpOm1fb3V0ZXIpKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fbGhzSXRlci5pbmRleCgpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBtX2xoc0l0ZXIucm93KCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIG1fbGhzSXRlci5jb2woKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9saHNJdGVyOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIFJoc05lc3RlZCBtX3JoczsKKyAgICBMaHNJdGVyYXRvciBtX2xoc0l0ZXI7CisgICAgY29uc3QgQmluYXJ5RnVuYyBtX2Z1bmN0b3I7CisgICAgY29uc3QgSW5kZXggbV9vdXRlcjsKK307CisKKy8vIHNwYXJzZSAtIGRlbnNlICAocHJvZHVjdCkKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXJpdmVkPgorY2xhc3Mgc3BhcnNlX2N3aXNlX2JpbmFyeV9vcF9pbm5lcl9pdGVyYXRvcl9zZWxlY3RvcjxzY2FsYXJfcHJvZHVjdF9vcDxUPiwgTGhzLCBSaHMsIERlcml2ZWQsIERlbnNlLCBTcGFyc2U+Cit7CisgICAgdHlwZWRlZiBzY2FsYXJfcHJvZHVjdF9vcDxUPiBCaW5hcnlGdW5jOworICAgIHR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxCaW5hcnlGdW5jLCBMaHMsIFJocz4gQ3dpc2VCaW5hcnlYcHI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDd2lzZUJpbmFyeVhwcjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxDd2lzZUJpbmFyeVhwcj46Ol9SaHNOZXN0ZWQgX1Joc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SaHNOZXN0ZWQ6OklubmVySXRlcmF0b3IgUmhzSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworCisgICAgZW51bSB7IElzUm93TWFqb3IgPSAoaW50KFJoczo6RmxhZ3MpJlJvd01ham9yQml0KT09Um93TWFqb3JCaXQgfTsKKyAgcHVibGljOgorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBzcGFyc2VfY3dpc2VfYmluYXJ5X29wX2lubmVyX2l0ZXJhdG9yX3NlbGVjdG9yKGNvbnN0IEN3aXNlQmluYXJ5WHByJiB4cHIsIEluZGV4IG91dGVyKQorICAgICAgOiBtX3hwcih4cHIpLCBtX3Joc0l0ZXIoeHByLnJocygpLG91dGVyKSwgbV9mdW5jdG9yKHhwci5mdW5jdG9yKCkpLCBtX291dGVyKG91dGVyKQorICAgIHt9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgICsrbV9yaHNJdGVyOworICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIgdmFsdWUoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fZnVuY3RvcihtX3hwci5saHMoKS5jb2VmZihJc1Jvd01ham9yP21fb3V0ZXI6bV9yaHNJdGVyLmluZGV4KCksSXNSb3dNYWpvcj9tX3Joc0l0ZXIuaW5kZXgoKTptX291dGVyKSwgbV9yaHNJdGVyLnZhbHVlKCkpOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9yaHNJdGVyLmluZGV4KCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzSXRlci5yb3coKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gbV9yaHNJdGVyLmNvbCgpOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3Joc0l0ZXI7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgQ3dpc2VCaW5hcnlYcHImIG1feHByOworICAgIFJoc0l0ZXJhdG9yIG1fcmhzSXRlcjsKKyAgICBjb25zdCBCaW5hcnlGdW5jJiBtX2Z1bmN0b3I7CisgICAgY29uc3QgSW5kZXggbV9vdXRlcjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIFNwYXJzZU1hdHJpeEJhc2UgYW5kIFNwYXJzZUN3aXNlIGZ1bmN0aW9ucy9vcGVyYXRvcnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCAmCitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvci09KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCit7CisgIHJldHVybiAqdGhpcyA9IGRlcml2ZWQoKSAtIG90aGVyLmRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCAmCitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcis9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIHJldHVybiAqdGhpcyA9IGRlcml2ZWQoKSArIG90aGVyLmRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRUlHRU5fU1BBUlNFX0NXSVNFX1BST0RVQ1RfUkVUVVJOX1RZUEUKK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46OmN3aXNlUHJvZHVjdChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gRUlHRU5fU1BBUlNFX0NXSVNFX1BST0RVQ1RfUkVUVVJOX1RZUEUoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9DV0lTRV9CSU5BUllfT1BfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQ3dpc2VVbmFyeU9wLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VDd2lzZVVuYXJ5T3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTUwYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlQ3dpc2VVbmFyeU9wLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9DV0lTRV9VTkFSWV9PUF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9DV0lTRV9VTkFSWV9PUF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBVbmFyeU9wLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgQ3dpc2VVbmFyeU9wSW1wbDxVbmFyeU9wLE1hdHJpeFR5cGUsU3BhcnNlPgorICA6IHB1YmxpYyBTcGFyc2VNYXRyaXhCYXNlPEN3aXNlVW5hcnlPcDxVbmFyeU9wLCBNYXRyaXhUeXBlPiA+Cit7CisgIHB1YmxpYzoKKworICAgIGNsYXNzIElubmVySXRlcmF0b3I7CisgICAgY2xhc3MgUmV2ZXJzZUlubmVySXRlcmF0b3I7CisKKyAgICB0eXBlZGVmIEN3aXNlVW5hcnlPcDxVbmFyeU9wLCBNYXRyaXhUeXBlPiBEZXJpdmVkOworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQpCisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6X1hwclR5cGVOZXN0ZWQgX01hdHJpeFR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZU5lc3RlZDo6SW5uZXJJdGVyYXRvciBNYXRyaXhUeXBlSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZU5lc3RlZDo6UmV2ZXJzZUlubmVySXRlcmF0b3IgTWF0cml4VHlwZVJldmVyc2VJdGVyYXRvcjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBDd2lzZVVuYXJ5T3BJbXBsPFVuYXJ5T3AsTWF0cml4VHlwZSxTcGFyc2U+OjpJbm5lckl0ZXJhdG9yCisgICAgOiBwdWJsaWMgQ3dpc2VVbmFyeU9wSW1wbDxVbmFyeU9wLE1hdHJpeFR5cGUsU3BhcnNlPjo6TWF0cml4VHlwZUl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDd2lzZVVuYXJ5T3BJbXBsOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3dpc2VVbmFyeU9wSW1wbDxVbmFyeU9wLE1hdHJpeFR5cGUsU3BhcnNlPjo6TWF0cml4VHlwZUl0ZXJhdG9yIEJhc2U7CisgIHB1YmxpYzoKKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvcihjb25zdCBDd2lzZVVuYXJ5T3BJbXBsJiB1bmFyeU9wLCB0eXBlbmFtZSBDd2lzZVVuYXJ5T3BJbXBsOjpJbmRleCBvdXRlcikKKyAgICAgIDogQmFzZSh1bmFyeU9wLmRlcml2ZWQoKS5uZXN0ZWRFeHByZXNzaW9uKCksb3V0ZXIpLCBtX2Z1bmN0b3IodW5hcnlPcC5kZXJpdmVkKCkuZnVuY3RvcigpKQorICAgIHt9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKQorICAgIHsgQmFzZTo6b3BlcmF0b3IrKygpOyByZXR1cm4gKnRoaXM7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgQ3dpc2VVbmFyeU9wSW1wbDo6U2NhbGFyIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9mdW5jdG9yKEJhc2U6OnZhbHVlKCkpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFVuYXJ5T3AgbV9mdW5jdG9yOworICBwcml2YXRlOgorICAgIHR5cGVuYW1lIEN3aXNlVW5hcnlPcEltcGw6OlNjYWxhciYgdmFsdWVSZWYoKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFVuYXJ5T3AsIHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBDd2lzZVVuYXJ5T3BJbXBsPFVuYXJ5T3AsTWF0cml4VHlwZSxTcGFyc2U+OjpSZXZlcnNlSW5uZXJJdGVyYXRvcgorICAgIDogcHVibGljIEN3aXNlVW5hcnlPcEltcGw8VW5hcnlPcCxNYXRyaXhUeXBlLFNwYXJzZT46Ok1hdHJpeFR5cGVSZXZlcnNlSXRlcmF0b3IKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEN3aXNlVW5hcnlPcEltcGw6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDd2lzZVVuYXJ5T3BJbXBsPFVuYXJ5T3AsTWF0cml4VHlwZSxTcGFyc2U+OjpNYXRyaXhUeXBlUmV2ZXJzZUl0ZXJhdG9yIEJhc2U7CisgIHB1YmxpYzoKKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgUmV2ZXJzZUlubmVySXRlcmF0b3IoY29uc3QgQ3dpc2VVbmFyeU9wSW1wbCYgdW5hcnlPcCwgdHlwZW5hbWUgQ3dpc2VVbmFyeU9wSW1wbDo6SW5kZXggb3V0ZXIpCisgICAgICA6IEJhc2UodW5hcnlPcC5kZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLG91dGVyKSwgbV9mdW5jdG9yKHVuYXJ5T3AuZGVyaXZlZCgpLmZ1bmN0b3IoKSkKKyAgICB7fQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBSZXZlcnNlSW5uZXJJdGVyYXRvciYgb3BlcmF0b3ItLSgpCisgICAgeyBCYXNlOjpvcGVyYXRvci0tKCk7IHJldHVybiAqdGhpczsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBDd2lzZVVuYXJ5T3BJbXBsOjpTY2FsYXIgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2Z1bmN0b3IoQmFzZTo6dmFsdWUoKSk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgVW5hcnlPcCBtX2Z1bmN0b3I7CisgIHByaXZhdGU6CisgICAgdHlwZW5hbWUgQ3dpc2VVbmFyeU9wSW1wbDo6U2NhbGFyJiB2YWx1ZVJlZigpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVmlld09wLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgQ3dpc2VVbmFyeVZpZXdJbXBsPFZpZXdPcCxNYXRyaXhUeXBlLFNwYXJzZT4KKyAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxDd2lzZVVuYXJ5VmlldzxWaWV3T3AsIE1hdHJpeFR5cGU+ID4KK3sKKyAgcHVibGljOgorCisgICAgY2xhc3MgSW5uZXJJdGVyYXRvcjsKKyAgICBjbGFzcyBSZXZlcnNlSW5uZXJJdGVyYXRvcjsKKworICAgIHR5cGVkZWYgQ3dpc2VVbmFyeVZpZXc8Vmlld09wLCBNYXRyaXhUeXBlPiBEZXJpdmVkOworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQpCisKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6X01hdHJpeFR5cGVOZXN0ZWQgX01hdHJpeFR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZU5lc3RlZDo6SW5uZXJJdGVyYXRvciBNYXRyaXhUeXBlSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZU5lc3RlZDo6UmV2ZXJzZUlubmVySXRlcmF0b3IgTWF0cml4VHlwZVJldmVyc2VJdGVyYXRvcjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZpZXdPcCwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIEN3aXNlVW5hcnlWaWV3SW1wbDxWaWV3T3AsTWF0cml4VHlwZSxTcGFyc2U+OjpJbm5lckl0ZXJhdG9yCisgICAgOiBwdWJsaWMgQ3dpc2VVbmFyeVZpZXdJbXBsPFZpZXdPcCxNYXRyaXhUeXBlLFNwYXJzZT46Ok1hdHJpeFR5cGVJdGVyYXRvcgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3dpc2VVbmFyeVZpZXdJbXBsOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3dpc2VVbmFyeVZpZXdJbXBsPFZpZXdPcCxNYXRyaXhUeXBlLFNwYXJzZT46Ok1hdHJpeFR5cGVJdGVyYXRvciBCYXNlOworICBwdWJsaWM6CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3QgQ3dpc2VVbmFyeVZpZXdJbXBsJiB1bmFyeU9wLCB0eXBlbmFtZSBDd2lzZVVuYXJ5Vmlld0ltcGw6OkluZGV4IG91dGVyKQorICAgICAgOiBCYXNlKHVuYXJ5T3AuZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKSxvdXRlciksIG1fZnVuY3Rvcih1bmFyeU9wLmRlcml2ZWQoKS5mdW5jdG9yKCkpCisgICAge30KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgeyBCYXNlOjpvcGVyYXRvcisrKCk7IHJldHVybiAqdGhpczsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBDd2lzZVVuYXJ5Vmlld0ltcGw6OlNjYWxhciB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnVuY3RvcihCYXNlOjp2YWx1ZSgpKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgQ3dpc2VVbmFyeVZpZXdJbXBsOjpTY2FsYXImIHZhbHVlUmVmKCkgeyByZXR1cm4gbV9mdW5jdG9yKEJhc2U6OnZhbHVlUmVmKCkpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFZpZXdPcCBtX2Z1bmN0b3I7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWaWV3T3AsIHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBDd2lzZVVuYXJ5Vmlld0ltcGw8Vmlld09wLE1hdHJpeFR5cGUsU3BhcnNlPjo6UmV2ZXJzZUlubmVySXRlcmF0b3IKKyAgICA6IHB1YmxpYyBDd2lzZVVuYXJ5Vmlld0ltcGw8Vmlld09wLE1hdHJpeFR5cGUsU3BhcnNlPjo6TWF0cml4VHlwZVJldmVyc2VJdGVyYXRvcgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3dpc2VVbmFyeVZpZXdJbXBsOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3dpc2VVbmFyeVZpZXdJbXBsPFZpZXdPcCxNYXRyaXhUeXBlLFNwYXJzZT46Ok1hdHJpeFR5cGVSZXZlcnNlSXRlcmF0b3IgQmFzZTsKKyAgcHVibGljOgorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBSZXZlcnNlSW5uZXJJdGVyYXRvcihjb25zdCBDd2lzZVVuYXJ5Vmlld0ltcGwmIHVuYXJ5T3AsIHR5cGVuYW1lIEN3aXNlVW5hcnlWaWV3SW1wbDo6SW5kZXggb3V0ZXIpCisgICAgICA6IEJhc2UodW5hcnlPcC5kZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLG91dGVyKSwgbV9mdW5jdG9yKHVuYXJ5T3AuZGVyaXZlZCgpLmZ1bmN0b3IoKSkKKyAgICB7fQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBSZXZlcnNlSW5uZXJJdGVyYXRvciYgb3BlcmF0b3ItLSgpCisgICAgeyBCYXNlOjpvcGVyYXRvci0tKCk7IHJldHVybiAqdGhpczsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSB0eXBlbmFtZSBDd2lzZVVuYXJ5Vmlld0ltcGw6OlNjYWxhciB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnVuY3RvcihCYXNlOjp2YWx1ZSgpKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgdHlwZW5hbWUgQ3dpc2VVbmFyeVZpZXdJbXBsOjpTY2FsYXImIHZhbHVlUmVmKCkgeyByZXR1cm4gbV9mdW5jdG9yKEJhc2U6OnZhbHVlUmVmKCkpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFZpZXdPcCBtX2Z1bmN0b3I7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJgorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IqPShjb25zdCBTY2FsYXImIG90aGVyKQoreworICBmb3IgKEluZGV4IGo9MDsgajxvdXRlclNpemUoKTsgKytqKQorICAgIGZvciAodHlwZW5hbWUgRGVyaXZlZDo6SW5uZXJJdGVyYXRvciBpKGRlcml2ZWQoKSxqKTsgaTsgKytpKQorICAgICAgaS52YWx1ZVJlZigpICo9IG90aGVyOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJgorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IvPShjb25zdCBTY2FsYXImIG90aGVyKQoreworICBmb3IgKEluZGV4IGo9MDsgajxvdXRlclNpemUoKTsgKytqKQorICAgIGZvciAodHlwZW5hbWUgRGVyaXZlZDo6SW5uZXJJdGVyYXRvciBpKGRlcml2ZWQoKSxqKTsgaTsgKytpKQorICAgICAgaS52YWx1ZVJlZigpIC89IG90aGVyOworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9DV0lTRV9VTkFSWV9PUF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VEZW5zZVByb2R1Y3QuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZURlbnNlUHJvZHVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzI5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VEZW5zZVByb2R1Y3QuaApAQCAtMCwwICsxLDMwMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFREVOU0VQUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFREVOU0VQUk9EVUNUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgSW5uZXJTaXplPiBzdHJ1Y3QgU3BhcnNlRGVuc2VQcm9kdWN0UmV0dXJuVHlwZQoreworICB0eXBlZGVmIFNwYXJzZVRpbWVEZW5zZVByb2R1Y3Q8TGhzLFJocz4gVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiBzdHJ1Y3QgU3BhcnNlRGVuc2VQcm9kdWN0UmV0dXJuVHlwZTxMaHMsUmhzLDE+Cit7CisgIHR5cGVkZWYgU3BhcnNlRGVuc2VPdXRlclByb2R1Y3Q8TGhzLFJocyxmYWxzZT4gVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgSW5uZXJTaXplPiBzdHJ1Y3QgRGVuc2VTcGFyc2VQcm9kdWN0UmV0dXJuVHlwZQoreworICB0eXBlZGVmIERlbnNlVGltZVNwYXJzZVByb2R1Y3Q8TGhzLFJocz4gVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiBzdHJ1Y3QgRGVuc2VTcGFyc2VQcm9kdWN0UmV0dXJuVHlwZTxMaHMsUmhzLDE+Cit7CisgIHR5cGVkZWYgU3BhcnNlRGVuc2VPdXRlclByb2R1Y3Q8UmhzLExocyx0cnVlPiBUeXBlOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGJvb2wgVHI+CitzdHJ1Y3QgdHJhaXRzPFNwYXJzZURlbnNlT3V0ZXJQcm9kdWN0PExocyxSaHMsVHI+ID4KK3sKKyAgdHlwZWRlZiBTcGFyc2UgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPHR5cGVuYW1lIHRyYWl0czxMaHM+OjpTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxSaHM+OjpTY2FsYXI+OjpSZXR1cm5UeXBlIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6TmVzdGVkIExoc05lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6Ok5lc3RlZCBSaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHNOZXN0ZWQ+Ojp0eXBlIF9MaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxSaHNOZXN0ZWQ+Ojp0eXBlIF9SaHNOZXN0ZWQ7CisKKyAgZW51bSB7CisgICAgTGhzQ29lZmZSZWFkQ29zdCA9IHRyYWl0czxfTGhzTmVzdGVkPjo6Q29lZmZSZWFkQ29zdCwKKyAgICBSaHNDb2VmZlJlYWRDb3N0ID0gdHJhaXRzPF9SaHNOZXN0ZWQ+OjpDb2VmZlJlYWRDb3N0LAorCisgICAgUm93c0F0Q29tcGlsZVRpbWUgICAgPSBUciA/IGludCh0cmFpdHM8UmhzPjo6Um93c0F0Q29tcGlsZVRpbWUpICAgICA6IGludCh0cmFpdHM8TGhzPjo6Um93c0F0Q29tcGlsZVRpbWUpLAorICAgIENvbHNBdENvbXBpbGVUaW1lICAgID0gVHIgPyBpbnQodHJhaXRzPExocz46OkNvbHNBdENvbXBpbGVUaW1lKSAgICAgOiBpbnQodHJhaXRzPFJocz46OkNvbHNBdENvbXBpbGVUaW1lKSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IFRyID8gaW50KHRyYWl0czxSaHM+OjpNYXhSb3dzQXRDb21waWxlVGltZSkgIDogaW50KHRyYWl0czxMaHM+OjpNYXhSb3dzQXRDb21waWxlVGltZSksCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBUciA/IGludCh0cmFpdHM8TGhzPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUpICA6IGludCh0cmFpdHM8UmhzPjo6TWF4Q29sc0F0Q29tcGlsZVRpbWUpLAorCisgICAgRmxhZ3MgPSBUciA/IFJvd01ham9yQml0IDogMCwKKworICAgIENvZWZmUmVhZENvc3QgPSBMaHNDb2VmZlJlYWRDb3N0ICsgUmhzQ29lZmZSZWFkQ29zdCArIE51bVRyYWl0czxTY2FsYXI+OjpNdWxDb3N0CisgIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGJvb2wgVHI+CitjbGFzcyBTcGFyc2VEZW5zZU91dGVyUHJvZHVjdAorIDogcHVibGljIFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlRGVuc2VPdXRlclByb2R1Y3Q8TGhzLFJocyxUcj4gPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlRGVuc2VPdXRlclByb2R1Y3Q+IEJhc2U7CisgICAgRUlHRU5fREVOU0VfUFVCTElDX0lOVEVSRkFDRShTcGFyc2VEZW5zZU91dGVyUHJvZHVjdCkKKyAgICB0eXBlZGVmIGludGVybmFsOjp0cmFpdHM8U3BhcnNlRGVuc2VPdXRlclByb2R1Y3Q+IFRyYWl0czsKKworICBwcml2YXRlOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6Okxoc05lc3RlZCBMaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlJoc05lc3RlZCBSaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6Ol9MaHNOZXN0ZWQgX0xoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYWl0czo6X1Joc05lc3RlZCBfUmhzTmVzdGVkOworCisgIHB1YmxpYzoKKworICAgIGNsYXNzIElubmVySXRlcmF0b3I7CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNwYXJzZURlbnNlT3V0ZXJQcm9kdWN0KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgICAgIDogbV9saHMobGhzKSwgbV9yaHMocmhzKQorICAgIHsKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoIVRyLFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBTcGFyc2VEZW5zZU91dGVyUHJvZHVjdChjb25zdCBSaHMmIHJocywgY29uc3QgTGhzJiBsaHMpCisgICAgICA6IG1fbGhzKGxocyksIG1fcmhzKHJocykKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKFRyLFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gVHIgPyBtX3Jocy5yb3dzKCkgOiBtX2xocy5yb3dzKCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBUciA/IG1fbGhzLmNvbHMoKSA6IG1fcmhzLmNvbHMoKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBfTGhzTmVzdGVkJiBsaHMoKSBjb25zdCB7IHJldHVybiBtX2xoczsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgX1Joc05lc3RlZCYgcmhzKCkgY29uc3QgeyByZXR1cm4gbV9yaHM7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTGhzTmVzdGVkIG1fbGhzOworICAgIFJoc05lc3RlZCBtX3JoczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBib29sIFRyYW5zcG9zZT4KK2NsYXNzIFNwYXJzZURlbnNlT3V0ZXJQcm9kdWN0PExocyxSaHMsVHJhbnNwb3NlPjo6SW5uZXJJdGVyYXRvciA6IHB1YmxpYyBfTGhzTmVzdGVkOjpJbm5lckl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTGhzTmVzdGVkOjpJbm5lckl0ZXJhdG9yIEJhc2U7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3QgU3BhcnNlRGVuc2VPdXRlclByb2R1Y3QmIHByb2QsIEluZGV4IG91dGVyKQorICAgICAgOiBCYXNlKHByb2QubGhzKCksIDApLCBtX291dGVyKG91dGVyKSwgbV9mYWN0b3IocHJvZC5yaHMoKS5jb2VmZihvdXRlcikpCisgICAgeworICAgIH0KKworICAgIGlubGluZSBJbmRleCBvdXRlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3V0ZXI7IH0KKyAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gVHJhbnNwb3NlID8gQmFzZTo6cm93KCkgOiBtX291dGVyOyB9CisgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIFRyYW5zcG9zZSA/IG1fb3V0ZXIgOiBCYXNlOjpyb3coKTsgfQorCisgICAgaW5saW5lIFNjYWxhciB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIEJhc2U6OnZhbHVlKCkgKiBtX2ZhY3RvcjsgfQorCisgIHByb3RlY3RlZDoKKyAgICBpbnQgbV9vdXRlcjsKKyAgICBTY2FsYXIgbV9mYWN0b3I7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgdHJhaXRzPFNwYXJzZVRpbWVEZW5zZVByb2R1Y3Q8TGhzLFJocz4gPgorIDogdHJhaXRzPFByb2R1Y3RCYXNlPFNwYXJzZVRpbWVEZW5zZVByb2R1Y3Q8TGhzLFJocz4sIExocywgUmhzPiA+Cit7CisgIHR5cGVkZWYgRGVuc2UgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgTWF0cml4WHByIFhwcktpbmQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VMaHNUeXBlLCB0eXBlbmFtZSBEZW5zZVJoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmVzVHlwZSwKKyAgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIgPSAoKFNwYXJzZUxoc1R5cGU6OkZsYWdzJlJvd01ham9yQml0KT09Um93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvciwKKyAgICAgICAgIGJvb2wgQ29sUGVyQ29sID0gKChEZW5zZVJoc1R5cGU6OkZsYWdzJlJvd01ham9yQml0KT09MCkgfHwgRGVuc2VSaHNUeXBlOjpDb2xzQXRDb21waWxlVGltZT09MT4KK3N0cnVjdCBzcGFyc2VfdGltZV9kZW5zZV9wcm9kdWN0X2ltcGw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZUxoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmhzVHlwZSwgdHlwZW5hbWUgRGVuc2VSZXNUeXBlPgorc3RydWN0IHNwYXJzZV90aW1lX2RlbnNlX3Byb2R1Y3RfaW1wbDxTcGFyc2VMaHNUeXBlLERlbnNlUmhzVHlwZSxEZW5zZVJlc1R5cGUsIFJvd01ham9yLCB0cnVlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPFNwYXJzZUxoc1R5cGU+Ojp0eXBlIExoczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZW5zZVJoc1R5cGU+Ojp0eXBlIFJoczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZW5zZVJlc1R5cGU+Ojp0eXBlIFJlczsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5uZXJJdGVyYXRvciBMaHNJbm5lckl0ZXJhdG9yOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgU3BhcnNlTGhzVHlwZSYgbGhzLCBjb25zdCBEZW5zZVJoc1R5cGUmIHJocywgRGVuc2VSZXNUeXBlJiByZXMsIHR5cGVuYW1lIFJlczo6U2NhbGFyIGFscGhhKQorICB7CisgICAgZm9yKEluZGV4IGM9MDsgYzxyaHMuY29scygpOyArK2MpCisgICAgeworICAgICAgaW50IG4gPSBsaHMub3V0ZXJTaXplKCk7CisgICAgICBmb3IoSW5kZXggaj0wOyBqPG47ICsraikKKyAgICAgIHsKKyAgICAgICAgdHlwZW5hbWUgUmVzOjpTY2FsYXIgdG1wKDApOworICAgICAgICBmb3IoTGhzSW5uZXJJdGVyYXRvciBpdChsaHMsaik7IGl0IDsrK2l0KQorICAgICAgICAgIHRtcCArPSBpdC52YWx1ZSgpICogcmhzLmNvZWZmKGl0LmluZGV4KCksYyk7CisgICAgICAgIHJlcy5jb2VmZlJlZihqLGMpID0gYWxwaGEgKiB0bXA7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VMaHNUeXBlLCB0eXBlbmFtZSBEZW5zZVJoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmVzVHlwZT4KK3N0cnVjdCBzcGFyc2VfdGltZV9kZW5zZV9wcm9kdWN0X2ltcGw8U3BhcnNlTGhzVHlwZSxEZW5zZVJoc1R5cGUsRGVuc2VSZXNUeXBlLCBDb2xNYWpvciwgdHJ1ZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxTcGFyc2VMaHNUeXBlPjo6dHlwZSBMaHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVuc2VSaHNUeXBlPjo6dHlwZSBSaHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVuc2VSZXNUeXBlPjo6dHlwZSBSZXM7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpJbm5lckl0ZXJhdG9yIExoc0lubmVySXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFNwYXJzZUxoc1R5cGUmIGxocywgY29uc3QgRGVuc2VSaHNUeXBlJiByaHMsIERlbnNlUmVzVHlwZSYgcmVzLCB0eXBlbmFtZSBSZXM6OlNjYWxhciBhbHBoYSkKKyAgeworICAgIGZvcihJbmRleCBjPTA7IGM8cmhzLmNvbHMoKTsgKytjKQorICAgIHsKKyAgICAgIGZvcihJbmRleCBqPTA7IGo8bGhzLm91dGVyU2l6ZSgpOyArK2opCisgICAgICB7CisgICAgICAgIHR5cGVuYW1lIFJlczo6U2NhbGFyIHJoc19qID0gYWxwaGEgKiByaHMuY29lZmYoaixjKTsKKyAgICAgICAgZm9yKExoc0lubmVySXRlcmF0b3IgaXQobGhzLGopOyBpdCA7KytpdCkKKyAgICAgICAgICByZXMuY29lZmZSZWYoaXQuaW5kZXgoKSxjKSArPSBpdC52YWx1ZSgpICogcmhzX2o7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VMaHNUeXBlLCB0eXBlbmFtZSBEZW5zZVJoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmVzVHlwZT4KK3N0cnVjdCBzcGFyc2VfdGltZV9kZW5zZV9wcm9kdWN0X2ltcGw8U3BhcnNlTGhzVHlwZSxEZW5zZVJoc1R5cGUsRGVuc2VSZXNUeXBlLCBSb3dNYWpvciwgZmFsc2U+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8U3BhcnNlTGhzVHlwZT46OnR5cGUgTGhzOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlbnNlUmhzVHlwZT46OnR5cGUgUmhzOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPERlbnNlUmVzVHlwZT46OnR5cGUgUmVzOworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5uZXJJdGVyYXRvciBMaHNJbm5lckl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBTcGFyc2VMaHNUeXBlJiBsaHMsIGNvbnN0IERlbnNlUmhzVHlwZSYgcmhzLCBEZW5zZVJlc1R5cGUmIHJlcywgdHlwZW5hbWUgUmVzOjpTY2FsYXIgYWxwaGEpCisgIHsKKyAgICBmb3IoSW5kZXggaj0wOyBqPGxocy5vdXRlclNpemUoKTsgKytqKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIFJlczo6Um93WHByIHJlc19qKHJlcy5yb3coaikpOworICAgICAgZm9yKExoc0lubmVySXRlcmF0b3IgaXQobGhzLGopOyBpdCA7KytpdCkKKyAgICAgICAgcmVzX2ogKz0gKGFscGhhKml0LnZhbHVlKCkpICogcmhzLnJvdyhpdC5pbmRleCgpKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZUxoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmhzVHlwZSwgdHlwZW5hbWUgRGVuc2VSZXNUeXBlPgorc3RydWN0IHNwYXJzZV90aW1lX2RlbnNlX3Byb2R1Y3RfaW1wbDxTcGFyc2VMaHNUeXBlLERlbnNlUmhzVHlwZSxEZW5zZVJlc1R5cGUsIENvbE1ham9yLCBmYWxzZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxTcGFyc2VMaHNUeXBlPjo6dHlwZSBMaHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVuc2VSaHNUeXBlPjo6dHlwZSBSaHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8RGVuc2VSZXNUeXBlPjo6dHlwZSBSZXM7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpJbm5lckl0ZXJhdG9yIExoc0lubmVySXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpJbmRleCBJbmRleDsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFNwYXJzZUxoc1R5cGUmIGxocywgY29uc3QgRGVuc2VSaHNUeXBlJiByaHMsIERlbnNlUmVzVHlwZSYgcmVzLCB0eXBlbmFtZSBSZXM6OlNjYWxhciBhbHBoYSkKKyAgeworICAgIGZvcihJbmRleCBqPTA7IGo8bGhzLm91dGVyU2l6ZSgpOyArK2opCisgICAgeworICAgICAgdHlwZW5hbWUgUmhzOjpDb25zdFJvd1hwciByaHNfaihyaHMucm93KGopKTsKKyAgICAgIGZvcihMaHNJbm5lckl0ZXJhdG9yIGl0KGxocyxqKTsgaXQgOysraXQpCisgICAgICAgIHJlcy5yb3coaXQuaW5kZXgoKSkgKz0gKGFscGhhKml0LnZhbHVlKCkpICogcmhzX2o7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VMaHNUeXBlLCB0eXBlbmFtZSBEZW5zZVJoc1R5cGUsIHR5cGVuYW1lIERlbnNlUmVzVHlwZSx0eXBlbmFtZSBBbHBoYVR5cGU+CitpbmxpbmUgdm9pZCBzcGFyc2VfdGltZV9kZW5zZV9wcm9kdWN0KGNvbnN0IFNwYXJzZUxoc1R5cGUmIGxocywgY29uc3QgRGVuc2VSaHNUeXBlJiByaHMsIERlbnNlUmVzVHlwZSYgcmVzLCBjb25zdCBBbHBoYVR5cGUmIGFscGhhKQoreworICBzcGFyc2VfdGltZV9kZW5zZV9wcm9kdWN0X2ltcGw8U3BhcnNlTGhzVHlwZSxEZW5zZVJoc1R5cGUsRGVuc2VSZXNUeXBlPjo6cnVuKGxocywgcmhzLCByZXMsIGFscGhhKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorY2xhc3MgU3BhcnNlVGltZURlbnNlUHJvZHVjdAorICA6IHB1YmxpYyBQcm9kdWN0QmFzZTxTcGFyc2VUaW1lRGVuc2VQcm9kdWN0PExocyxSaHM+LCBMaHMsIFJocz4KK3sKKyAgcHVibGljOgorICAgIEVJR0VOX1BST0RVQ1RfUFVCTElDX0lOVEVSRkFDRShTcGFyc2VUaW1lRGVuc2VQcm9kdWN0KQorCisgICAgU3BhcnNlVGltZURlbnNlUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpIDogQmFzZShsaHMscmhzKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIHNjYWxlQW5kQWRkVG8oRGVzdCYgZGVzdCwgU2NhbGFyIGFscGhhKSBjb25zdAorICAgIHsKKyAgICAgIGludGVybmFsOjpzcGFyc2VfdGltZV9kZW5zZV9wcm9kdWN0KG1fbGhzLCBtX3JocywgZGVzdCwgYWxwaGEpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFNwYXJzZVRpbWVEZW5zZVByb2R1Y3QmIG9wZXJhdG9yPShjb25zdCBTcGFyc2VUaW1lRGVuc2VQcm9kdWN0Jik7Cit9OworCisKKy8vIGRlbnNlID0gZGVuc2UgKiBzcGFyc2UKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCB0cmFpdHM8RGVuc2VUaW1lU3BhcnNlUHJvZHVjdDxMaHMsUmhzPiA+CisgOiB0cmFpdHM8UHJvZHVjdEJhc2U8RGVuc2VUaW1lU3BhcnNlUHJvZHVjdDxMaHMsUmhzPiwgTGhzLCBSaHM+ID4KK3sKKyAgdHlwZWRlZiBEZW5zZSBTdG9yYWdlS2luZDsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CitjbGFzcyBEZW5zZVRpbWVTcGFyc2VQcm9kdWN0CisgIDogcHVibGljIFByb2R1Y3RCYXNlPERlbnNlVGltZVNwYXJzZVByb2R1Y3Q8TGhzLFJocz4sIExocywgUmhzPgoreworICBwdWJsaWM6CisgICAgRUlHRU5fUFJPRFVDVF9QVUJMSUNfSU5URVJGQUNFKERlbnNlVGltZVNwYXJzZVByb2R1Y3QpCisKKyAgICBEZW5zZVRpbWVTcGFyc2VQcm9kdWN0KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykgOiBCYXNlKGxocyxyaHMpCisgICAge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkZXN0LCBTY2FsYXIgYWxwaGEpIGNvbnN0CisgICAgeworICAgICAgVHJhbnNwb3NlPGNvbnN0IF9MaHNOZXN0ZWQ+IGxoc190KG1fbGhzKTsKKyAgICAgIFRyYW5zcG9zZTxjb25zdCBfUmhzTmVzdGVkPiByaHNfdChtX3Jocyk7CisgICAgICBUcmFuc3Bvc2U8RGVzdD4gZGVzdF90KGRlc3QpOworICAgICAgaW50ZXJuYWw6OnNwYXJzZV90aW1lX2RlbnNlX3Byb2R1Y3QocmhzX3QsIGxoc190LCBkZXN0X3QsIGFscGhhKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBEZW5zZVRpbWVTcGFyc2VQcm9kdWN0JiBvcGVyYXRvcj0oY29uc3QgRGVuc2VUaW1lU3BhcnNlUHJvZHVjdCYpOworfTsKKworLy8gc3BhcnNlICogZGVuc2UKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgY29uc3QgdHlwZW5hbWUgU3BhcnNlRGVuc2VQcm9kdWN0UmV0dXJuVHlwZTxEZXJpdmVkLE90aGVyRGVyaXZlZD46OlR5cGUKK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgU3BhcnNlRGVuc2VQcm9kdWN0UmV0dXJuVHlwZTxEZXJpdmVkLE90aGVyRGVyaXZlZD46OlR5cGUoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRURFTlNFUFJPRFVDVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VEaWFnb25hbFByb2R1Y3QuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZURpYWdvbmFsUHJvZHVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NWJmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VEaWFnb25hbFByb2R1Y3QuaApAQCAtMCwwICsxLDE4NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9ESUFHT05BTF9QUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0RJQUdPTkFMX1BST0RVQ1RfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLy8gVGhlIHByb2R1Y3Qgb2YgYSBkaWFnb25hbCBtYXRyaXggd2l0aCBhIHNwYXJzZSBtYXRyaXggY2FuIGJlIGVhc2lseQorLy8gaW1wbGVtZW50ZWQgdXNpbmcgZXhwcmVzc2lvbiB0ZW1wbGF0ZS4KKy8vIFdlIGhhdmUgdHdvIGNvbnNpZGVyIHZlcnkgZGlmZmVyZW50IGNhc2VzOgorLy8gMSAtIGRpYWcgKiByb3ctbWFqb3Igc3BhcnNlCisvLyAgICAgPT4gZWFjaCBpbm5lciB2ZWN0b3IgPD0+IHNjYWxhciAqIHNwYXJzZSB2ZWN0b3IgcHJvZHVjdAorLy8gICAgID0+IHNvIHdlIGNhbiByZXVzZSBDd2lzZVVuYXJ5T3A6OklubmVySXRlcmF0b3IKKy8vIDIgLSBkaWFnICogY29sLW1ham9yIHNwYXJzZQorLy8gICAgID0+IGVhY2ggaW5uZXIgdmVjdG9yIDw9PiBkZW5zZXZlY3RvciAqIHNwYXJzZSB2ZWN0b3IgY3dpc2UgcHJvZHVjdAorLy8gICAgID0+IGFnYWluLCB3ZSBjYW4gcmV1c2Ugc3BlY2lhbGl6YXRpb24gb2YgQ3dpc2VCaW5hcnlPcDo6SW5uZXJJdGVyYXRvcgorLy8gICAgICAgIGZvciB0aGF0IHBhcnRpY3VsYXIgY2FzZQorLy8gVGhlIHR3byBvdGhlciBjYXNlcyBhcmUgc3ltbWV0cmljLgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCB0cmFpdHM8U3BhcnNlRGlhZ29uYWxQcm9kdWN0PExocywgUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHM+Ojp0eXBlIF9MaHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxSaHM+Ojp0eXBlIF9SaHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xoczo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX2luZGV4X3R5cGU8dHlwZW5hbWUgdHJhaXRzPExocz46OkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8UmhzPjo6SW5kZXg+Ojp0eXBlIEluZGV4OworICB0eXBlZGVmIFNwYXJzZSBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiBNYXRyaXhYcHIgWHByS2luZDsKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBfTGhzOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IF9SaHM6OkNvbHNBdENvbXBpbGVUaW1lLAorCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBfTGhzOjpNYXhSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IF9SaHM6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorCisgICAgU3BhcnNlRmxhZ3MgPSBpc19kaWFnb25hbDxfTGhzPjo6cmV0ID8gaW50KF9SaHM6OkZsYWdzKSA6IGludChfTGhzOjpGbGFncyksCisgICAgRmxhZ3MgPSAoU3BhcnNlRmxhZ3MmUm93TWFqb3JCaXQpLAorICAgIENvZWZmUmVhZENvc3QgPSBEeW5hbWljCisgIH07Cit9OworCitlbnVtIHtTRFBfSXNEaWFnb25hbCwgU0RQX0lzU3BhcnNlUm93TWFqb3IsIFNEUF9Jc1NwYXJzZUNvbE1ham9yfTsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBTcGFyc2VEaWFnb25hbFByb2R1Y3RUeXBlLCBpbnQgUmhzTW9kZSwgaW50IExoc01vZGU+CitjbGFzcyBzcGFyc2VfZGlhZ29uYWxfcHJvZHVjdF9pbm5lcl9pdGVyYXRvcl9zZWxlY3RvcjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorY2xhc3MgU3BhcnNlRGlhZ29uYWxQcm9kdWN0CisgIDogcHVibGljIFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlRGlhZ29uYWxQcm9kdWN0PExocyxSaHM+ID4sCisgICAgaW50ZXJuYWw6Om5vX2Fzc2lnbm1lbnRfb3BlcmF0b3IKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExoczo6TmVzdGVkIExoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6TmVzdGVkIFJoc05lc3RlZDsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TGhzTmVzdGVkPjo6dHlwZSBfTGhzTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8UmhzTmVzdGVkPjo6dHlwZSBfUmhzTmVzdGVkOworCisgICAgZW51bSB7CisgICAgICBMaHNNb2RlID0gaW50ZXJuYWw6OmlzX2RpYWdvbmFsPF9MaHNOZXN0ZWQ+OjpyZXQgPyBpbnRlcm5hbDo6U0RQX0lzRGlhZ29uYWwKKyAgICAgICAgICAgICAgOiAoX0xoc05lc3RlZDo6RmxhZ3MmUm93TWFqb3JCaXQpID8gaW50ZXJuYWw6OlNEUF9Jc1NwYXJzZVJvd01ham9yIDogaW50ZXJuYWw6OlNEUF9Jc1NwYXJzZUNvbE1ham9yLAorICAgICAgUmhzTW9kZSA9IGludGVybmFsOjppc19kaWFnb25hbDxfUmhzTmVzdGVkPjo6cmV0ID8gaW50ZXJuYWw6OlNEUF9Jc0RpYWdvbmFsCisgICAgICAgICAgICAgIDogKF9SaHNOZXN0ZWQ6OkZsYWdzJlJvd01ham9yQml0KSA/IGludGVybmFsOjpTRFBfSXNTcGFyc2VSb3dNYWpvciA6IGludGVybmFsOjpTRFBfSXNTcGFyc2VDb2xNYWpvcgorICAgIH07CisKKyAgcHVibGljOgorCisgICAgRUlHRU5fU1BBUlNFX1BVQkxJQ19JTlRFUkZBQ0UoU3BhcnNlRGlhZ29uYWxQcm9kdWN0KQorCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6c3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3IKKyAgICAgICAgICAgICAgICA8X0xoc05lc3RlZCxfUmhzTmVzdGVkLFNwYXJzZURpYWdvbmFsUHJvZHVjdCxMaHNNb2RlLFJoc01vZGU+IElubmVySXRlcmF0b3I7CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIFNwYXJzZURpYWdvbmFsUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCisgICAgICA6IG1fbGhzKGxocyksIG1fcmhzKHJocykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobGhzLmNvbHMoKSA9PSByaHMucm93cygpICYmICJpbnZhbGlkIHNwYXJzZSBtYXRyaXggKiBkaWFnb25hbCBtYXRyaXggcHJvZHVjdCIpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbGhzLnJvd3MoKTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzLmNvbHMoKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBfTGhzTmVzdGVkJiBsaHMoKSBjb25zdCB7IHJldHVybiBtX2xoczsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgX1Joc05lc3RlZCYgcmhzKCkgY29uc3QgeyByZXR1cm4gbV9yaHM7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgTGhzTmVzdGVkIG1fbGhzOworICAgIFJoc05lc3RlZCBtX3JoczsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBTcGFyc2VEaWFnb25hbFByb2R1Y3RUeXBlPgorY2xhc3Mgc3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3IKKzxMaHMsUmhzLFNwYXJzZURpYWdvbmFsUHJvZHVjdFR5cGUsU0RQX0lzRGlhZ29uYWwsU0RQX0lzU3BhcnNlUm93TWFqb3I+CisgIDogcHVibGljIEN3aXNlVW5hcnlPcDxzY2FsYXJfbXVsdGlwbGVfb3A8dHlwZW5hbWUgTGhzOjpTY2FsYXI+LGNvbnN0IFJocz46OklubmVySXRlcmF0b3IKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxzY2FsYXJfbXVsdGlwbGVfb3A8dHlwZW5hbWUgTGhzOjpTY2FsYXI+LGNvbnN0IFJocz46OklubmVySXRlcmF0b3IgQmFzZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIExoczo6SW5kZXggSW5kZXg7CisgIHB1YmxpYzoKKyAgICBpbmxpbmUgc3BhcnNlX2RpYWdvbmFsX3Byb2R1Y3RfaW5uZXJfaXRlcmF0b3Jfc2VsZWN0b3IoCisgICAgICAgICAgICAgIGNvbnN0IFNwYXJzZURpYWdvbmFsUHJvZHVjdFR5cGUmIGV4cHIsIEluZGV4IG91dGVyKQorICAgICAgOiBCYXNlKGV4cHIucmhzKCkqKGV4cHIubGhzKCkuZGlhZ29uYWwoKS5jb2VmZihvdXRlcikpLCBvdXRlcikKKyAgICB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFNwYXJzZURpYWdvbmFsUHJvZHVjdFR5cGU+CitjbGFzcyBzcGFyc2VfZGlhZ29uYWxfcHJvZHVjdF9pbm5lcl9pdGVyYXRvcl9zZWxlY3RvcgorPExocyxSaHMsU3BhcnNlRGlhZ29uYWxQcm9kdWN0VHlwZSxTRFBfSXNEaWFnb25hbCxTRFBfSXNTcGFyc2VDb2xNYWpvcj4KKyAgOiBwdWJsaWMgQ3dpc2VCaW5hcnlPcDwKKyAgICAgIHNjYWxhcl9wcm9kdWN0X29wPHR5cGVuYW1lIExoczo6U2NhbGFyPiwKKyAgICAgIFNwYXJzZUlubmVyVmVjdG9yU2V0PFJocywxPiwKKyAgICAgIHR5cGVuYW1lIExoczo6RGlhZ29uYWxWZWN0b3JUeXBlPjo6SW5uZXJJdGVyYXRvcgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3dpc2VCaW5hcnlPcDwKKyAgICAgIHNjYWxhcl9wcm9kdWN0X29wPHR5cGVuYW1lIExoczo6U2NhbGFyPiwKKyAgICAgIFNwYXJzZUlubmVyVmVjdG9yU2V0PFJocywxPiwKKyAgICAgIHR5cGVuYW1lIExoczo6RGlhZ29uYWxWZWN0b3JUeXBlPjo6SW5uZXJJdGVyYXRvciBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTGhzOjpJbmRleCBJbmRleDsKKyAgcHVibGljOgorICAgIGlubGluZSBzcGFyc2VfZGlhZ29uYWxfcHJvZHVjdF9pbm5lcl9pdGVyYXRvcl9zZWxlY3RvcigKKyAgICAgICAgICAgICAgY29uc3QgU3BhcnNlRGlhZ29uYWxQcm9kdWN0VHlwZSYgZXhwciwgSW5kZXggb3V0ZXIpCisgICAgICA6IEJhc2UoZXhwci5yaHMoKS5pbm5lclZlY3RvcihvdXRlcikgLmN3aXNlUHJvZHVjdChleHByLmxocygpLmRpYWdvbmFsKCkpLCAwKQorICAgIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgU3BhcnNlRGlhZ29uYWxQcm9kdWN0VHlwZT4KK2NsYXNzIHNwYXJzZV9kaWFnb25hbF9wcm9kdWN0X2lubmVyX2l0ZXJhdG9yX3NlbGVjdG9yCis8TGhzLFJocyxTcGFyc2VEaWFnb25hbFByb2R1Y3RUeXBlLFNEUF9Jc1NwYXJzZUNvbE1ham9yLFNEUF9Jc0RpYWdvbmFsPgorICA6IHB1YmxpYyBDd2lzZVVuYXJ5T3A8c2NhbGFyX211bHRpcGxlX29wPHR5cGVuYW1lIFJoczo6U2NhbGFyPixjb25zdCBMaHM+OjpJbm5lckl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDd2lzZVVuYXJ5T3A8c2NhbGFyX211bHRpcGxlX29wPHR5cGVuYW1lIFJoczo6U2NhbGFyPixjb25zdCBMaHM+OjpJbm5lckl0ZXJhdG9yIEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBwdWJsaWM6CisgICAgaW5saW5lIHNwYXJzZV9kaWFnb25hbF9wcm9kdWN0X2lubmVyX2l0ZXJhdG9yX3NlbGVjdG9yKAorICAgICAgICAgICAgICBjb25zdCBTcGFyc2VEaWFnb25hbFByb2R1Y3RUeXBlJiBleHByLCBJbmRleCBvdXRlcikKKyAgICAgIDogQmFzZShleHByLmxocygpKmV4cHIucmhzKCkuZGlhZ29uYWwoKS5jb2VmZihvdXRlciksIG91dGVyKQorICAgIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgU3BhcnNlRGlhZ29uYWxQcm9kdWN0VHlwZT4KK2NsYXNzIHNwYXJzZV9kaWFnb25hbF9wcm9kdWN0X2lubmVyX2l0ZXJhdG9yX3NlbGVjdG9yCis8TGhzLFJocyxTcGFyc2VEaWFnb25hbFByb2R1Y3RUeXBlLFNEUF9Jc1NwYXJzZVJvd01ham9yLFNEUF9Jc0RpYWdvbmFsPgorICA6IHB1YmxpYyBDd2lzZUJpbmFyeU9wPAorICAgICAgc2NhbGFyX3Byb2R1Y3Rfb3A8dHlwZW5hbWUgUmhzOjpTY2FsYXI+LAorICAgICAgU3BhcnNlSW5uZXJWZWN0b3JTZXQ8TGhzLDE+LAorICAgICAgVHJhbnNwb3NlPGNvbnN0IHR5cGVuYW1lIFJoczo6RGlhZ29uYWxWZWN0b3JUeXBlPiA+OjpJbm5lckl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDd2lzZUJpbmFyeU9wPAorICAgICAgc2NhbGFyX3Byb2R1Y3Rfb3A8dHlwZW5hbWUgUmhzOjpTY2FsYXI+LAorICAgICAgU3BhcnNlSW5uZXJWZWN0b3JTZXQ8TGhzLDE+LAorICAgICAgVHJhbnNwb3NlPGNvbnN0IHR5cGVuYW1lIFJoczo6RGlhZ29uYWxWZWN0b3JUeXBlPiA+OjpJbm5lckl0ZXJhdG9yIEJhc2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBMaHM6OkluZGV4IEluZGV4OworICBwdWJsaWM6CisgICAgaW5saW5lIHNwYXJzZV9kaWFnb25hbF9wcm9kdWN0X2lubmVyX2l0ZXJhdG9yX3NlbGVjdG9yKAorICAgICAgICAgICAgICBjb25zdCBTcGFyc2VEaWFnb25hbFByb2R1Y3RUeXBlJiBleHByLCBJbmRleCBvdXRlcikKKyAgICAgIDogQmFzZShleHByLmxocygpLmlubmVyVmVjdG9yKG91dGVyKSAuY3dpc2VQcm9kdWN0KGV4cHIucmhzKCkuZGlhZ29uYWwoKS50cmFuc3Bvc2UoKSksIDApCisgICAge30KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBTcGFyc2VNYXRyaXhCYXNlIGZ1bmN0aW9ucworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorY29uc3QgU3BhcnNlRGlhZ29uYWxQcm9kdWN0PERlcml2ZWQsT3RoZXJEZXJpdmVkPgorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6b3BlcmF0b3IqKGNvbnN0IERpYWdvbmFsQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIFNwYXJzZURpYWdvbmFsUHJvZHVjdDxEZXJpdmVkLE90aGVyRGVyaXZlZD4odGhpcy0+ZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9ESUFHT05BTF9QUk9EVUNUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZURvdC5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlRG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0YTU5MwotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZURvdC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfRE9UX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0RPVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojpkb3QoY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1ZFQ1RPUl9TSVpFKERlcml2ZWQsT3RoZXJEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPjo6dmFsdWUpLAorICAgIFlPVV9NSVhFRF9ESUZGRVJFTlRfTlVNRVJJQ19UWVBFU19fWU9VX05FRURfVE9fVVNFX1RIRV9DQVNUX01FVEhPRF9PRl9NQVRSSVhCQVNFX1RPX0NBU1RfTlVNRVJJQ19UWVBFU19FWFBMSUNJVExZKQorCisgIGVpZ2VuX2Fzc2VydChzaXplKCkgPT0gb3RoZXIuc2l6ZSgpKTsKKyAgZWlnZW5fYXNzZXJ0KG90aGVyLnNpemUoKT4wICYmICJ5b3UgYXJlIHVzaW5nIGEgbm9uIGluaXRpYWxpemVkIHZlY3RvciIpOworCisgIHR5cGVuYW1lIERlcml2ZWQ6OklubmVySXRlcmF0b3IgaShkZXJpdmVkKCksMCk7CisgIFNjYWxhciByZXMoMCk7CisgIHdoaWxlIChpKQorICB7CisgICAgcmVzICs9IGludGVybmFsOjpjb25qKGkudmFsdWUoKSkgKiBvdGhlci5jb2VmZihpLmluZGV4KCkpOworICAgICsraTsKKyAgfQorICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyCitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojpkb3QoY29uc3QgU3BhcnNlTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9WRUNUT1JfT05MWShEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE90aGVyRGVyaXZlZCkKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1ZFQ1RPUl9TSVpFKERlcml2ZWQsT3RoZXJEZXJpdmVkKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPjo6dmFsdWUpLAorICAgIFlPVV9NSVhFRF9ESUZGRVJFTlRfTlVNRVJJQ19UWVBFU19fWU9VX05FRURfVE9fVVNFX1RIRV9DQVNUX01FVEhPRF9PRl9NQVRSSVhCQVNFX1RPX0NBU1RfTlVNRVJJQ19UWVBFU19FWFBMSUNJVExZKQorCisgIGVpZ2VuX2Fzc2VydChzaXplKCkgPT0gb3RoZXIuc2l6ZSgpKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6Ok5lc3RlZCAgTmVzdGVkOworICB0eXBlZGVmIHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6TmVzdGVkICBPdGhlck5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxOZXN0ZWQ+Ojp0eXBlICBOZXN0ZWRDbGVhbmVkOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyTmVzdGVkPjo6dHlwZSAgT3RoZXJOZXN0ZWRDbGVhbmVkOworCisgIGNvbnN0IE5lc3RlZCBudGhpcyhkZXJpdmVkKCkpOworICBjb25zdCBPdGhlck5lc3RlZCBub3RoZXIob3RoZXIuZGVyaXZlZCgpKTsKKworICB0eXBlbmFtZSBOZXN0ZWRDbGVhbmVkOjpJbm5lckl0ZXJhdG9yIGkobnRoaXMsMCk7CisgIHR5cGVuYW1lIE90aGVyTmVzdGVkQ2xlYW5lZDo6SW5uZXJJdGVyYXRvciBqKG5vdGhlciwwKTsKKyAgU2NhbGFyIHJlcygwKTsKKyAgd2hpbGUgKGkgJiYgaikKKyAgeworICAgIGlmIChpLmluZGV4KCk9PWouaW5kZXgoKSkKKyAgICB7CisgICAgICByZXMgKz0gaW50ZXJuYWw6OmNvbmooaS52YWx1ZSgpKSAqIGoudmFsdWUoKTsKKyAgICAgICsraTsgKytqOworICAgIH0KKyAgICBlbHNlIGlmIChpLmluZGV4KCk8ai5pbmRleCgpKQorICAgICAgKytpOworICAgIGVsc2UKKyAgICAgICsrajsKKyAgfQorICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsCitTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjpzcXVhcmVkTm9ybSgpIGNvbnN0Cit7CisgIHJldHVybiBpbnRlcm5hbDo6cmVhbCgoKnRoaXMpLmN3aXNlQWJzMigpLnN1bSgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2lubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbAorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6bm9ybSgpIGNvbnN0Cit7CisgIHJldHVybiBpbnRlcm5hbDo6c3FydChzcXVhcmVkTm9ybSgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfRE9UX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZUZ1enp5LmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VGdXp6eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjM2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VGdXp6eS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfRlVaWllfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfRlVaWllfSAorCisvLyB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorLy8gdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorLy8gYm9vbCBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojppc0FwcHJveCgKKy8vICAgY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlciwKKy8vICAgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgcHJlYworLy8gKSBjb25zdAorLy8geworLy8gICBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPERlcml2ZWQsMj46OnR5cGUgbmVzdGVkKGRlcml2ZWQoKSk7CisvLyAgIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8T3RoZXJEZXJpdmVkLDI+Ojp0eXBlIG90aGVyTmVzdGVkKG90aGVyLmRlcml2ZWQoKSk7CisvLyAgIHJldHVybiAgICAobmVzdGVkIC0gb3RoZXJOZXN0ZWQpLmN3aXNlKCkuYWJzMigpLnN1bSgpCisvLyAgICAgICAgICA8PSBwcmVjICogcHJlYyAqIChzdGQ6Om1pbikobmVzdGVkLmN3aXNlKCkuYWJzMigpLnN1bSgpLCBvdGhlck5lc3RlZC5jd2lzZSgpLmFiczIoKS5zdW0oKSk7CisvLyB9CisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfRlVaWllfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlTWF0cml4LmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmI3NzRmCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlTWF0cml4LmgKQEAgLTAsMCArMSwxMTE2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VNQVRSSVhfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIFNwYXJzZUNvcmVfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgU3BhcnNlTWF0cml4CisgICoKKyAgKiBcYnJpZWYgQSB2ZXJzYXRpYmxlIHNwYXJzZSBtYXRyaXggcmVwcmVzZW50YXRpb24KKyAgKgorICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIG1vcmUgdmVyc2F0aWxlIHZhcmlhbnRzIG9mIHRoZSBjb21tb24gXGVtIGNvbXByZXNzZWQgcm93L2NvbHVtbiBzdG9yYWdlIGZvcm1hdC4KKyAgKiBFYWNoIGNvbG11bidzIChyZXNwLiByb3cpIG5vbiB6ZXJvcyBhcmUgc3RvcmVkIGFzIGEgcGFpciBvZiB2YWx1ZSB3aXRoIGFzc29jaWF0ZWQgcm93IChyZXNwLiBjb2xtaXVuKSBpbmRleC4KKyAgKiBBbGwgdGhlIG5vbiB6ZXJvcyBhcmUgc3RvcmVkIGluIGEgc2luZ2xlIGxhcmdlIGJ1ZmZlci4gVW5saWtlIHRoZSBcZW0gY29tcHJlc3NlZCBmb3JtYXQsIHRoZXJlIG1pZ2h0IGJlIGV4dHJhCisgICogc3BhY2UgaW5iZXR3ZWVuIHRoZSBub256ZXJvcyBvZiB0d28gc3VjY2Vzc2l2ZSBjb2xtdW5zIChyZXNwLiByb3dzKSBzdWNoIHRoYXQgaW5zZXJ0aW9uIG9mIG5ldyBub24temVybworICAqIGNhbiBiZSBkb25lIHdpdGggbGltaXRlZCBtZW1vcnkgcmVhbGxvY2F0aW9uIGFuZCBjb3BpZXMuCisgICoKKyAgKiBBIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIG1ha2VDb21wcmVzc2VkKCkgdHVybnMgdGhlIG1hdHJpeCBpbnRvIHRoZSBzdGFuZGFyZCBcZW0gY29tcHJlc3NlZCBmb3JtYXQKKyAgKiBjb21wYXRpYmxlIHdpdGggbWFueSBsaWJyYXJ5LgorICAqCisgICogTW9yZSBkZXRhaWxzIG9uIHRoaXMgc3RvcmFnZSBzY2VoZW1lIGFyZSBnaXZlbiBpbiB0aGUgXHJlZiBUdXRvcmlhbFNwYXJzZSAibWFudWFsIHBhZ2VzIi4KKyAgKgorICAqIFx0cGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4gdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqIFx0cGFyYW0gX09wdGlvbnMgVW5pb24gb2YgYml0IGZsYWdzIGNvbnRyb2xsaW5nIHRoZSBzdG9yYWdlIHNjaGVtZS4gQ3VycmVudGx5IHRoZSBvbmx5IHBvc3NpYmlsaXR5CisgICogICAgICAgICAgICAgICAgIGlzIFJvd01ham9yLiBUaGUgZGVmYXVsdCBpcyAwIHdoaWNoIG1lYW5zIGNvbHVtbi1tYWpvci4KKyAgKiBcdHBhcmFtIF9JbmRleCB0aGUgdHlwZSBvZiB0aGUgaW5kaWNlcy4gSXQgaGFzIHRvIGJlIGEgXGIgc2lnbmVkIHR5cGUgKGUuZy4sIHNob3J0LCBpbnQsIHN0ZDo6cHRyZGlmZl90KS4gRGVmYXVsdCBpcyBcYyBpbnQuCisgICoKKyAgKiBUaGlzIGNsYXNzIGNhbiBiZSBleHRlbmRlZCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBwbHVnaW4gbWVjaGFuaXNtIGRlc2NyaWJlZCBvbiB0aGUgcGFnZQorICAqIFxyZWYgVG9waWNDdXN0b21pemluZ0VpZ2VuIGJ5IGRlZmluaW5nIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxjIEVJR0VOX1NQQVJTRU1BVFJJWF9QTFVHSU4uCisgICovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9JbmRleD4KK3N0cnVjdCB0cmFpdHM8U3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfSW5kZXg+ID4KK3sKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBfSW5kZXggSW5kZXg7CisgIHR5cGVkZWYgU3BhcnNlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgRmxhZ3MgPSBfT3B0aW9ucyB8IE5lc3RCeVJlZkJpdCB8IEx2YWx1ZUJpdCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OlJlYWRDb3N0LAorICAgIFN1cHBvcnRlZEFjY2Vzc1BhdHRlcm5zID0gSW5uZXJSYW5kb21BY2Nlc3NQYXR0ZXJuCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9JbmRleCwgaW50IERpYWdJbmRleD4KK3N0cnVjdCB0cmFpdHM8RGlhZ29uYWw8Y29uc3QgU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfSW5kZXg+LCBEaWFnSW5kZXg+ID4KK3sKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8X1NjYWxhciwgX09wdGlvbnMsIF9JbmRleD4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBuZXN0ZWQ8TWF0cml4VHlwZT46OnR5cGUgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPE1hdHJpeFR5cGVOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworCisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgRGVuc2UgU3RvcmFnZUtpbmQ7CisgIHR5cGVkZWYgX0luZGV4IEluZGV4OworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworCisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IDEsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gMSwKKyAgICBGbGFncyA9IDAsCisgICAgQ29lZmZSZWFkQ29zdCA9IF9NYXRyaXhUeXBlTmVzdGVkOjpDb2VmZlJlYWRDb3N0KjEwCisgIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXg+CitjbGFzcyBTcGFyc2VNYXRyaXgKKyAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VNYXRyaXg8X1NjYWxhciwgX09wdGlvbnMsIF9JbmRleD4gPgoreworICBwdWJsaWM6CisgICAgRUlHRU5fU1BBUlNFX1BVQkxJQ19JTlRFUkZBQ0UoU3BhcnNlTWF0cml4KQorICAgIEVJR0VOX1NQQVJTRV9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1IoU3BhcnNlTWF0cml4LCArPSkKKyAgICBFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKFNwYXJzZU1hdHJpeCwgLT0pCisKKyAgICB0eXBlZGVmIE1hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXIsRmxhZ3M+IE1hcDsKKyAgICB1c2luZyBCYXNlOjpJc1Jvd01ham9yOworICAgIHR5cGVkZWYgaW50ZXJuYWw6OkNvbXByZXNzZWRTdG9yYWdlPFNjYWxhcixJbmRleD4gU3RvcmFnZTsKKyAgICBlbnVtIHsKKyAgICAgIE9wdGlvbnMgPSBfT3B0aW9ucworICAgIH07CisKKyAgcHJvdGVjdGVkOgorCisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLChGbGFncyZ+Um93TWFqb3JCaXQpfChJc1Jvd01ham9yP1Jvd01ham9yQml0OjApPiBUcmFuc3Bvc2VkU3BhcnNlTWF0cml4OworCisgICAgSW5kZXggbV9vdXRlclNpemU7CisgICAgSW5kZXggbV9pbm5lclNpemU7CisgICAgSW5kZXgqIG1fb3V0ZXJJbmRleDsKKyAgICBJbmRleCogbV9pbm5lck5vblplcm9zOyAgICAgLy8gb3B0aW9uYWwsIGlmIG51bGwgdGhlbiB0aGUgZGF0YSBpcyBjb21wcmVzc2VkCisgICAgU3RvcmFnZSBtX2RhdGE7CisgICAgCisgICAgRWlnZW46Ok1hcDxNYXRyaXg8SW5kZXgsRHluYW1pYywxPiA+IGlubmVyTm9uWmVyb3MoKSB7IHJldHVybiBFaWdlbjo6TWFwPE1hdHJpeDxJbmRleCxEeW5hbWljLDE+ID4obV9pbm5lck5vblplcm9zLCBtX2lubmVyTm9uWmVyb3M/bV9vdXRlclNpemU6MCk7IH0KKyAgICBjb25zdCAgRWlnZW46Ok1hcDxjb25zdCBNYXRyaXg8SW5kZXgsRHluYW1pYywxPiA+IGlubmVyTm9uWmVyb3MoKSBjb25zdCB7IHJldHVybiBFaWdlbjo6TWFwPGNvbnN0IE1hdHJpeDxJbmRleCxEeW5hbWljLDE+ID4obV9pbm5lck5vblplcm9zLCBtX2lubmVyTm9uWmVyb3M/bV9vdXRlclNpemU6MCk7IH0KKworICBwdWJsaWM6CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHdoZXRoZXIgXGMgKnRoaXMgaXMgaW4gY29tcHJlc3NlZCBmb3JtLiAqLworICAgIGlubGluZSBib29sIGlzQ29tcHJlc3NlZCgpIGNvbnN0IHsgcmV0dXJuIG1faW5uZXJOb25aZXJvcz09MDsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgbWF0cml4ICovCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlclNpemUgOiBtX2lubmVyU2l6ZTsgfQorICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCAqLworICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1faW5uZXJTaXplIDogbV9vdXRlclNpemU7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgKHJlc3AuIGNvbHVtbnMpIG9mIHRoZSBtYXRyaXggaWYgdGhlIHN0b3JhZ2Ugb3JkZXIgY29sdW1uIG1ham9yIChyZXNwLiByb3cgbWFqb3IpICovCisgICAgaW5saW5lIEluZGV4IGlubmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5uZXJTaXplOyB9CisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyAocmVzcC4gcm93cykgb2YgdGhlIG1hdHJpeCBpZiB0aGUgc3RvcmFnZSBvcmRlciBjb2x1bW4gbWFqb3IgKHJlc3AuIHJvdyBtYWpvcikgKi8KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbV9vdXRlclNpemU7IH0KKyAgICAKKyAgICAvKiogXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiB2YWx1ZXMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHNhIGlubmVySW5kZXhQdHIoKSwgb3V0ZXJJbmRleFB0cigpICovCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogdmFsdWVQdHIoKSBjb25zdCB7IHJldHVybiAmbV9kYXRhLnZhbHVlKDApOyB9CisgICAgLyoqIFxyZXR1cm5zIGEgbm9uLWNvbnN0IHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHZhbHVlcy4KKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhaW1lZCBhdCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzLgorICAgICAgKiBcc2EgaW5uZXJJbmRleFB0cigpLCBvdXRlckluZGV4UHRyKCkgKi8KKyAgICBpbmxpbmUgU2NhbGFyKiB2YWx1ZVB0cigpIHsgcmV0dXJuICZtX2RhdGEudmFsdWUoMCk7IH0KKworICAgIC8qKiBccmV0dXJucyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIGlubmVyIGluZGljZXMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHNhIHZhbHVlUHRyKCksIG91dGVySW5kZXhQdHIoKSAqLworICAgIGlubGluZSBjb25zdCBJbmRleCogaW5uZXJJbmRleFB0cigpIGNvbnN0IHsgcmV0dXJuICZtX2RhdGEuaW5kZXgoMCk7IH0KKyAgICAvKiogXHJldHVybnMgYSBub24tY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgaW5uZXIgaW5kaWNlcy4KKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhaW1lZCBhdCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzLgorICAgICAgKiBcc2EgdmFsdWVQdHIoKSwgb3V0ZXJJbmRleFB0cigpICovCisgICAgaW5saW5lIEluZGV4KiBpbm5lckluZGV4UHRyKCkgeyByZXR1cm4gJm1fZGF0YS5pbmRleCgwKTsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdGhlIHN0YXJ0aW5nIHBvc2l0aW9ucyBvZiB0aGUgaW5uZXIgdmVjdG9ycy4KKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhaW1lZCBhdCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzLgorICAgICAgKiBcc2EgdmFsdWVQdHIoKSwgaW5uZXJJbmRleFB0cigpICovCisgICAgaW5saW5lIGNvbnN0IEluZGV4KiBvdXRlckluZGV4UHRyKCkgY29uc3QgeyByZXR1cm4gbV9vdXRlckluZGV4OyB9CisgICAgLyoqIFxyZXR1cm5zIGEgbm9uLWNvbnN0IHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHRoZSBzdGFydGluZyBwb3NpdGlvbnMgb2YgdGhlIGlubmVyIHZlY3RvcnMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHNhIHZhbHVlUHRyKCksIGlubmVySW5kZXhQdHIoKSAqLworICAgIGlubGluZSBJbmRleCogb3V0ZXJJbmRleFB0cigpIHsgcmV0dXJuIG1fb3V0ZXJJbmRleDsgfQorCisgICAgLyoqIFxyZXR1cm5zIGEgY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdGhlIG51bWJlciBvZiBub24gemVyb3Mgb2YgdGhlIGlubmVyIHZlY3RvcnMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHdhcm5pbmcgaXQgcmV0dXJucyB0aGUgbnVsbCBwb2ludGVyIDAgaW4gY29tcHJlc3NlZCBtb2RlICovCisgICAgaW5saW5lIGNvbnN0IEluZGV4KiBpbm5lck5vblplcm9QdHIoKSBjb25zdCB7IHJldHVybiBtX2lubmVyTm9uWmVyb3M7IH0KKyAgICAvKiogXHJldHVybnMgYSBub24tY29uc3QgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdGhlIG51bWJlciBvZiBub24gemVyb3Mgb2YgdGhlIGlubmVyIHZlY3RvcnMuCisgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWltZWQgYXQgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICogXHdhcm5pbmcgaXQgcmV0dXJucyB0aGUgbnVsbCBwb2ludGVyIDAgaW4gY29tcHJlc3NlZCBtb2RlICovCisgICAgaW5saW5lIEluZGV4KiBpbm5lck5vblplcm9QdHIoKSB7IHJldHVybiBtX2lubmVyTm9uWmVyb3M7IH0KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBpbmxpbmUgU3RvcmFnZSYgZGF0YSgpIHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBpbmxpbmUgY29uc3QgU3RvcmFnZSYgZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbWF0cml4IGF0IHBvc2l0aW9uIFxhIGksIFxhIGoKKyAgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFNjYWxhcigwKSBpZiB0aGUgZWxlbWVudCBpcyBhbiBleHBsaWNpdCBcZW0gemVybyAqLworICAgIGlubGluZSBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworICAgICAgSW5kZXggZW5kID0gbV9pbm5lck5vblplcm9zID8gbV9vdXRlckluZGV4W291dGVyXSArIG1faW5uZXJOb25aZXJvc1tvdXRlcl0gOiBtX291dGVySW5kZXhbb3V0ZXIrMV07CisgICAgICByZXR1cm4gbV9kYXRhLmF0SW5SYW5nZShtX291dGVySW5kZXhbb3V0ZXJdLCBlbmQsIGlubmVyKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSBub24tY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgbWF0cml4IGF0IHBvc2l0aW9uIFxhIGksIFxhIGoKKyAgICAgICoKKyAgICAgICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgdGhlbiBpdCBpcyBpbnNlcnRlZCB2aWEgdGhlIGluc2VydChJbmRleCxJbmRleCkgZnVuY3Rpb24KKyAgICAgICogd2hpY2ggaXRzZWxmIHR1cm5zIHRoZSBtYXRyaXggaW50byBhIG5vbiBjb21wcmVzc2VkIGZvcm0gaWYgdGhhdCB3YXMgbm90IHRoZSBjYXNlLgorICAgICAgKgorICAgICAgKiBUaGlzIGlzIGEgTyhsb2cobm56X2opKSBvcGVyYXRpb24gKGJpbmFyeSBzZWFyY2gpIHBsdXMgdGhlIGNvc3Qgb2YgaW5zZXJ0KEluZGV4LEluZGV4KQorICAgICAgKiBmdW5jdGlvbiBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorICAgICAgKi8KKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgIEluZGV4IHN0YXJ0ID0gbV9vdXRlckluZGV4W291dGVyXTsKKyAgICAgIEluZGV4IGVuZCA9IG1faW5uZXJOb25aZXJvcyA/IG1fb3V0ZXJJbmRleFtvdXRlcl0gKyBtX2lubmVyTm9uWmVyb3Nbb3V0ZXJdIDogbV9vdXRlckluZGV4W291dGVyKzFdOworICAgICAgZWlnZW5fYXNzZXJ0KGVuZD49c3RhcnQgJiYgInlvdSBwcm9iYWJseSBjYWxsZWQgY29lZmZSZWYgb24gYSBub24gZmluYWxpemVkIG1hdHJpeCIpOworICAgICAgaWYoZW5kPD1zdGFydCkKKyAgICAgICAgcmV0dXJuIGluc2VydChyb3csY29sKTsKKyAgICAgIGNvbnN0IEluZGV4IHAgPSBtX2RhdGEuc2VhcmNoTG93ZXJJbmRleChzdGFydCxlbmQtMSxpbm5lcik7CisgICAgICBpZigocDxlbmQpICYmIChtX2RhdGEuaW5kZXgocCk9PWlubmVyKSkKKyAgICAgICAgcmV0dXJuIG1fZGF0YS52YWx1ZShwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGluc2VydChyb3csY29sKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBub3ZlbCBub24gemVybyBjb2VmZmljaWVudCB3aXRoIGNvb3JkaW5hdGVzIFxhIHJvdyB4IFxhIGNvbC4KKyAgICAgICogVGhlIG5vbiB6ZXJvIGNvZWZmaWNpZW50IG11c3QgXGIgbm90IGFscmVhZHkgZXhpc3QuCisgICAgICAqCisgICAgICAqIElmIHRoZSBtYXRyaXggXGMgKnRoaXMgaXMgaW4gY29tcHJlc3NlZCBtb2RlLCB0aGVuIFxjICp0aGlzIGlzIHR1cm5lZCBpbnRvIHVuY29tcHJlc3NlZAorICAgICAgKiBtb2RlIHdoaWxlIHJlc2VydmluZyByb29tIGZvciAyIG5vbiB6ZXJvcyBwZXIgaW5uZXIgdmVjdG9yLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBmaXJzdAorICAgICAgKiBjYWxsIHJlc2VydmUoY29uc3QgU2l6ZXNUeXBlICYpIHRvIHJlc2VydmUgYSBtb3JlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBlbGVtZW50cyBwZXIKKyAgICAgICogaW5uZXIgdmVjdG9yIHRoYXQgYmV0dGVyIG1hdGNoIHlvdXIgc2NlbmFyaW8uCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBzb3J0ZWQgaW5zZXJ0aW9uIGluIE8oMSkgaWYgdGhlIGVsZW1lbnRzIG9mIGVhY2ggaW5uZXIgdmVjdG9yIGFyZQorICAgICAgKiBpbnNlcnRlZCBpbiBpbmNyZWFzaW5nIGlubmVyIGluZGV4IG9yZGVyLCBhbmQgaW4gTyhubnpfaikgZm9yIGEgcmFuZG9tIGluc2VydGlvbi4KKyAgICAgICoKKyAgICAgICovCisgICAgRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyJiBpbnNlcnQoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgaWYoaXNDb21wcmVzc2VkKCkpCisgICAgICB7CisgICAgICAgIHJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KG91dGVyU2l6ZSgpLCAyKSk7CisgICAgICB9CisgICAgICByZXR1cm4gaW5zZXJ0VW5jb21wcmVzc2VkKHJvdyxjb2wpOworICAgIH0KKworICBwdWJsaWM6CisKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yOworICAgIGNsYXNzIFJldmVyc2VJbm5lckl0ZXJhdG9yOworCisgICAgLyoqIFJlbW92ZXMgYWxsIG5vbiB6ZXJvcyBidXQga2VlcCBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgaW5saW5lIHZvaWQgc2V0WmVybygpCisgICAgeworICAgICAgbV9kYXRhLmNsZWFyKCk7CisgICAgICBtZW1zZXQobV9vdXRlckluZGV4LCAwLCAobV9vdXRlclNpemUrMSkqc2l6ZW9mKEluZGV4KSk7CisgICAgICBpZihtX2lubmVyTm9uWmVyb3MpCisgICAgICAgIG1lbXNldChtX2lubmVyTm9uWmVyb3MsIDAsIChtX291dGVyU2l6ZSkqc2l6ZW9mKEluZGV4KSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uIHplcm8gY29lZmZpY2llbnRzICovCisgICAgaW5saW5lIEluZGV4IG5vblplcm9zKCkgY29uc3QKKyAgICB7CisgICAgICBpZihtX2lubmVyTm9uWmVyb3MpCisgICAgICAgIHJldHVybiBpbm5lck5vblplcm9zKCkuc3VtKCk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW5kZXg+KG1fZGF0YS5zaXplKCkpOworICAgIH0KKworICAgIC8qKiBQcmVhbGxvY2F0ZXMgXGEgcmVzZXJ2ZVNpemUgbm9uIHplcm9zLgorICAgICAgKgorICAgICAgKiBQcmVjb25kaXRpb246IHRoZSBtYXRyaXggbXVzdCBiZSBpbiBjb21wcmVzc2VkIG1vZGUuICovCisgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShJbmRleCByZXNlcnZlU2l6ZSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaXNDb21wcmVzc2VkKCkgJiYgIlRoaXMgZnVuY3Rpb24gZG9lcyBub3QgbWFrZSBzZW5zZSBpbiBub24gY29tcHJlc3NlZCBtb2RlLiIpOworICAgICAgbV9kYXRhLnJlc2VydmUocmVzZXJ2ZVNpemUpOworICAgIH0KKyAgICAKKyAgICAjaWZkZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogUHJlYWxsb2NhdGVzIFxhIHJlc2VydmVTaXplW1xjIGpdIG5vbiB6ZXJvcyBmb3IgZWFjaCBjb2x1bW4gKHJlc3AuIHJvdykgXGMgai4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiB0dXJucyB0aGUgbWF0cml4IGluIG5vbi1jb21wcmVzc2VkIG1vZGUgKi8KKyAgICB0ZW1wbGF0ZTxjbGFzcyBTaXplc1R5cGU+CisgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShjb25zdCBTaXplc1R5cGUmIHJlc2VydmVTaXplcyk7CisgICAgI2Vsc2UKKyAgICB0ZW1wbGF0ZTxjbGFzcyBTaXplc1R5cGU+CisgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShjb25zdCBTaXplc1R5cGUmIHJlc2VydmVTaXplcywgY29uc3QgdHlwZW5hbWUgU2l6ZXNUeXBlOjp2YWx1ZV90eXBlJiBlbmFibGVpZiA9IHR5cGVuYW1lIFNpemVzVHlwZTo6dmFsdWVfdHlwZSgpKQorICAgIHsKKyAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShlbmFibGVpZik7CisgICAgICByZXNlcnZlSW5uZXJWZWN0b3JzKHJlc2VydmVTaXplcyk7CisgICAgfQorICAgIHRlbXBsYXRlPGNsYXNzIFNpemVzVHlwZT4KKyAgICBpbmxpbmUgdm9pZCByZXNlcnZlKGNvbnN0IFNpemVzVHlwZSYgcmVzZXJ2ZVNpemVzLCBjb25zdCB0eXBlbmFtZSBTaXplc1R5cGU6OlNjYWxhciYgZW5hYmxlaWYgPQorICAgICNpZiAoIWRlZmluZWQoX01TQ19WRVIpKSB8fCAoX01TQ19WRVI+PTE1MDApIC8vIE1TVkMgMjAwNSBmYWlscyB0byBjb21waWxlIHdpdGggdGhpcyB0eXBlbmFtZQorICAgICAgICB0eXBlbmFtZQorICAgICNlbmRpZgorICAgICAgICBTaXplc1R5cGU6OlNjYWxhcigpKQorICAgIHsKKyAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShlbmFibGVpZik7CisgICAgICByZXNlcnZlSW5uZXJWZWN0b3JzKHJlc2VydmVTaXplcyk7CisgICAgfQorICAgICNlbmRpZiAvLyBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICBwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8Y2xhc3MgU2l6ZXNUeXBlPgorICAgIGlubGluZSB2b2lkIHJlc2VydmVJbm5lclZlY3RvcnMoY29uc3QgU2l6ZXNUeXBlJiByZXNlcnZlU2l6ZXMpCisgICAgeworICAgICAgCisgICAgICBpZihpc0NvbXByZXNzZWQoKSkKKyAgICAgIHsKKyAgICAgICAgc3RkOjpzaXplX3QgdG90YWxSZXNlcnZlU2l6ZSA9IDA7CisgICAgICAgIC8vIHR1cm4gdGhlIG1hdHJpeCBpbnRvIG5vbi1jb21wcmVzc2VkIG1vZGUKKyAgICAgICAgbV9pbm5lck5vblplcm9zID0gbmV3IEluZGV4W21fb3V0ZXJTaXplXTsKKyAgICAgICAgCisgICAgICAgIC8vIHRlbXBvcmFyaWx5IHVzZSBtX2lubmVyU2l6ZXMgdG8gaG9sZCB0aGUgbmV3IHN0YXJ0aW5nIHBvaW50cy4KKyAgICAgICAgSW5kZXgqIG5ld091dGVySW5kZXggPSBtX2lubmVyTm9uWmVyb3M7CisgICAgICAgIAorICAgICAgICBJbmRleCBjb3VudCA9IDA7CisgICAgICAgIGZvcihJbmRleCBqPTA7IGo8bV9vdXRlclNpemU7ICsraikKKyAgICAgICAgeworICAgICAgICAgIG5ld091dGVySW5kZXhbal0gPSBjb3VudDsKKyAgICAgICAgICBjb3VudCArPSByZXNlcnZlU2l6ZXNbal0gKyAobV9vdXRlckluZGV4W2orMV0tbV9vdXRlckluZGV4W2pdKTsKKyAgICAgICAgICB0b3RhbFJlc2VydmVTaXplICs9IHJlc2VydmVTaXplc1tqXTsKKyAgICAgICAgfQorICAgICAgICBtX2RhdGEucmVzZXJ2ZSh0b3RhbFJlc2VydmVTaXplKTsKKyAgICAgICAgc3RkOjpwdHJkaWZmX3QgcHJldmlvdXNPdXRlckluZGV4ID0gbV9vdXRlckluZGV4W21fb3V0ZXJTaXplXTsKKyAgICAgICAgZm9yKHN0ZDo6cHRyZGlmZl90IGo9bV9vdXRlclNpemUtMTsgaj49MDsgLS1qKQorICAgICAgICB7CisgICAgICAgICAgcHRyZGlmZl90IGlubmVyTk5aID0gcHJldmlvdXNPdXRlckluZGV4IC0gbV9vdXRlckluZGV4W2pdOworICAgICAgICAgIGZvcihzdGQ6OnB0cmRpZmZfdCBpPWlubmVyTk5aLTE7IGk+PTA7IC0taSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBtX2RhdGEuaW5kZXgobmV3T3V0ZXJJbmRleFtqXStpKSA9IG1fZGF0YS5pbmRleChtX291dGVySW5kZXhbal0raSk7CisgICAgICAgICAgICBtX2RhdGEudmFsdWUobmV3T3V0ZXJJbmRleFtqXStpKSA9IG1fZGF0YS52YWx1ZShtX291dGVySW5kZXhbal0raSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByZXZpb3VzT3V0ZXJJbmRleCA9IG1fb3V0ZXJJbmRleFtqXTsKKyAgICAgICAgICBtX291dGVySW5kZXhbal0gPSBuZXdPdXRlckluZGV4W2pdOworICAgICAgICAgIG1faW5uZXJOb25aZXJvc1tqXSA9IGlubmVyTk5aOworICAgICAgICB9CisgICAgICAgIG1fb3V0ZXJJbmRleFttX291dGVyU2l6ZV0gPSBtX291dGVySW5kZXhbbV9vdXRlclNpemUtMV0gKyBtX2lubmVyTm9uWmVyb3NbbV9vdXRlclNpemUtMV0gKyByZXNlcnZlU2l6ZXNbbV9vdXRlclNpemUtMV07CisgICAgICAgIAorICAgICAgICBtX2RhdGEucmVzaXplKG1fb3V0ZXJJbmRleFttX291dGVyU2l6ZV0pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBJbmRleCogbmV3T3V0ZXJJbmRleCA9IG5ldyBJbmRleFttX291dGVyU2l6ZSsxXTsKKyAgICAgICAgSW5kZXggY291bnQgPSAwOworICAgICAgICBmb3IoSW5kZXggaj0wOyBqPG1fb3V0ZXJTaXplOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBuZXdPdXRlckluZGV4W2pdID0gY291bnQ7CisgICAgICAgICAgSW5kZXggYWxyZWFkeVJlc2VydmVkID0gKG1fb3V0ZXJJbmRleFtqKzFdLW1fb3V0ZXJJbmRleFtqXSkgLSBtX2lubmVyTm9uWmVyb3Nbal07CisgICAgICAgICAgSW5kZXggdG9SZXNlcnZlID0gc3RkOjptYXg8c3RkOjpwdHJkaWZmX3Q+KHJlc2VydmVTaXplc1tqXSwgYWxyZWFkeVJlc2VydmVkKTsKKyAgICAgICAgICBjb3VudCArPSB0b1Jlc2VydmUgKyBtX2lubmVyTm9uWmVyb3Nbal07CisgICAgICAgIH0KKyAgICAgICAgbmV3T3V0ZXJJbmRleFttX291dGVyU2l6ZV0gPSBjb3VudDsKKyAgICAgICAgCisgICAgICAgIG1fZGF0YS5yZXNpemUoY291bnQpOworICAgICAgICBmb3IocHRyZGlmZl90IGo9bV9vdXRlclNpemUtMTsgaj49MDsgLS1qKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpwdHJkaWZmX3Qgb2Zmc2V0ID0gbmV3T3V0ZXJJbmRleFtqXSAtIG1fb3V0ZXJJbmRleFtqXTsKKyAgICAgICAgICBpZihvZmZzZXQ+MCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnB0cmRpZmZfdCBpbm5lck5OWiA9IG1faW5uZXJOb25aZXJvc1tqXTsKKyAgICAgICAgICAgIGZvcihzdGQ6OnB0cmRpZmZfdCBpPWlubmVyTk5aLTE7IGk+PTA7IC0taSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbV9kYXRhLmluZGV4KG5ld091dGVySW5kZXhbal0raSkgPSBtX2RhdGEuaW5kZXgobV9vdXRlckluZGV4W2pdK2kpOworICAgICAgICAgICAgICBtX2RhdGEudmFsdWUobmV3T3V0ZXJJbmRleFtqXStpKSA9IG1fZGF0YS52YWx1ZShtX291dGVySW5kZXhbal0raSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdGQ6OnN3YXAobV9vdXRlckluZGV4LCBuZXdPdXRlckluZGV4KTsKKyAgICAgICAgZGVsZXRlW10gbmV3T3V0ZXJJbmRleDsKKyAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgcHVibGljOgorCisgICAgLy8tLS0gbG93IGxldmVsIHB1cmVseSBjb2hlcmVudCBmaWxsaW5nIC0tLQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbm9uIHplcm8gY29lZmZpY2llbnQgYXQgcG9zaXRpb24gXGEgcm93LCBcYSBjb2wgYXNzdW1pbmcgdGhhdDoKKyAgICAgICogLSB0aGUgbm9uemVybyBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0CisgICAgICAqIC0gdGhlIG5ldyBjb2VmZmljaWVudCBpcyB0aGUgbGFzdCBvbmUgYWNjb3JkaW5nIHRvIHRoZSBzdG9yYWdlIG9yZGVyCisgICAgICAqCisgICAgICAqIEJlZm9yZSBmaWxsaW5nIGEgZ2l2ZW4gaW5uZXIgdmVjdG9yIHlvdSBtdXN0IGNhbGwgdGhlIHN0YXRWZWMoSW5kZXgpIGZ1bmN0aW9uLgorICAgICAgKgorICAgICAgKiBBZnRlciBhbiBpbnNlcnRpb24gc2Vzc2lvbiwgeW91IHNob3VsZCBjYWxsIHRoZSBmaW5hbGl6ZSgpIGZ1bmN0aW9uLgorICAgICAgKgorICAgICAgKiBcc2EgaW5zZXJ0LCBpbnNlcnRCYWNrQnlPdXRlcklubmVyLCBzdGFydFZlYyAqLworICAgIGlubGluZSBTY2FsYXImIGluc2VydEJhY2soSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIGluc2VydEJhY2tCeU91dGVySW5uZXIoSXNSb3dNYWpvcj9yb3c6Y29sLCBJc1Jvd01ham9yP2NvbDpyb3cpOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogXHNhIGluc2VydEJhY2ssIHN0YXJ0VmVjICovCisgICAgaW5saW5lIFNjYWxhciYgaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihJbmRleCBvdXRlciwgSW5kZXggaW5uZXIpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KHNpemVfdChtX291dGVySW5kZXhbb3V0ZXIrMV0pID09IG1fZGF0YS5zaXplKCkgJiYgIkludmFsaWQgb3JkZXJlZCBpbnNlcnRpb24gKGludmFsaWQgb3V0ZXIgaW5kZXgpIik7CisgICAgICBlaWdlbl9hc3NlcnQoIChtX291dGVySW5kZXhbb3V0ZXIrMV0tbV9vdXRlckluZGV4W291dGVyXT09MCB8fCBtX2RhdGEuaW5kZXgobV9kYXRhLnNpemUoKS0xKTxpbm5lcikgJiYgIkludmFsaWQgb3JkZXJlZCBpbnNlcnRpb24gKGludmFsaWQgaW5uZXIgaW5kZXgpIik7CisgICAgICBJbmRleCBwID0gbV9vdXRlckluZGV4W291dGVyKzFdOworICAgICAgKyttX291dGVySW5kZXhbb3V0ZXIrMV07CisgICAgICBtX2RhdGEuYXBwZW5kKDAsIGlubmVyKTsKKyAgICAgIHJldHVybiBtX2RhdGEudmFsdWUocCk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBcd2FybmluZyB1c2UgaXQgb25seSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgKi8KKyAgICBpbmxpbmUgU2NhbGFyJiBpbnNlcnRCYWNrQnlPdXRlcklubmVyVW5vcmRlcmVkKEluZGV4IG91dGVyLCBJbmRleCBpbm5lcikKKyAgICB7CisgICAgICBJbmRleCBwID0gbV9vdXRlckluZGV4W291dGVyKzFdOworICAgICAgKyttX291dGVySW5kZXhbb3V0ZXIrMV07CisgICAgICBtX2RhdGEuYXBwZW5kKDAsIGlubmVyKTsKKyAgICAgIHJldHVybiBtX2RhdGEudmFsdWUocCk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBcc2EgaW5zZXJ0QmFjaywgaW5zZXJ0QmFja0J5T3V0ZXJJbm5lciAqLworICAgIGlubGluZSB2b2lkIHN0YXJ0VmVjKEluZGV4IG91dGVyKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX291dGVySW5kZXhbb3V0ZXJdPT1pbnQobV9kYXRhLnNpemUoKSkgJiYgIllvdSBtdXN0IGNhbGwgc3RhcnRWZWMgZm9yIGVhY2ggaW5uZXIgdmVjdG9yIHNlcXVlbnRpYWxseSIpOworICAgICAgZWlnZW5fYXNzZXJ0KG1fb3V0ZXJJbmRleFtvdXRlcisxXT09MCAmJiAiWW91IG11c3QgY2FsbCBzdGFydFZlYyBmb3IgZWFjaCBpbm5lciB2ZWN0b3Igc2VxdWVudGlhbGx5Iik7CisgICAgICBtX291dGVySW5kZXhbb3V0ZXIrMV0gPSBtX291dGVySW5kZXhbb3V0ZXJdOworICAgIH0KKworICAgIC8qKiBcaW50ZXJuYWwKKyAgICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgaW5zZXJ0aW5nIGEgc2V0IG9mIG5vbiB6ZXJvIGVudHJpZXMgdXNpbmcgdGhlIGxvdyBsZXZlbCBjb21wcmVzc2VkIEFQSS4KKyAgICAgICovCisgICAgaW5saW5lIHZvaWQgZmluYWxpemUoKQorICAgIHsKKyAgICAgIGlmKGlzQ29tcHJlc3NlZCgpKQorICAgICAgeworICAgICAgICBJbmRleCBzaXplID0gc3RhdGljX2Nhc3Q8SW5kZXg+KG1fZGF0YS5zaXplKCkpOworICAgICAgICBJbmRleCBpID0gbV9vdXRlclNpemU7CisgICAgICAgIC8vIGZpbmQgdGhlIGxhc3QgZmlsbGVkIGNvbHVtbgorICAgICAgICB3aGlsZSAoaT49MCAmJiBtX291dGVySW5kZXhbaV09PTApCisgICAgICAgICAgLS1pOworICAgICAgICArK2k7CisgICAgICAgIHdoaWxlIChpPD1tX291dGVyU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgIG1fb3V0ZXJJbmRleFtpXSA9IHNpemU7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8tLS0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3JzPgorICAgIHZvaWQgc2V0RnJvbVRyaXBsZXRzKGNvbnN0IElucHV0SXRlcmF0b3JzJiBiZWdpbiwgY29uc3QgSW5wdXRJdGVyYXRvcnMmIGVuZCk7CisKKyAgICB2b2lkIHN1bXVwRHVwbGljYXRlcygpOworCisgICAgLy8tLS0KKyAgICAKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIHNhbWUgYXMgaW5zZXJ0KEluZGV4LEluZGV4KSBleGNlcHQgdGhhdCB0aGUgaW5kaWNlcyBhcmUgZ2l2ZW4gcmVsYXRpdmUgdG8gdGhlIHN0b3JhZ2Ugb3JkZXIgKi8KKyAgICBFSUdFTl9ET05UX0lOTElORSBTY2FsYXImIGluc2VydEJ5T3V0ZXJJbm5lcihJbmRleCBqLCBJbmRleCBpKQorICAgIHsKKyAgICAgIHJldHVybiBpbnNlcnQoSXNSb3dNYWpvciA/IGogOiBpLCBJc1Jvd01ham9yID8gaSA6IGopOworICAgIH0KKworICAgIC8qKiBUdXJucyB0aGUgbWF0cml4IGludG8gdGhlIFxlbSBjb21wcmVzc2VkIGZvcm1hdC4KKyAgICAgICovCisgICAgdm9pZCBtYWtlQ29tcHJlc3NlZCgpCisgICAgeworICAgICAgaWYoaXNDb21wcmVzc2VkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIAorICAgICAgSW5kZXggb2xkU3RhcnQgPSBtX291dGVySW5kZXhbMV07CisgICAgICBtX291dGVySW5kZXhbMV0gPSBtX2lubmVyTm9uWmVyb3NbMF07CisgICAgICBmb3IoSW5kZXggaj0xOyBqPG1fb3V0ZXJTaXplOyArK2opCisgICAgICB7CisgICAgICAgIEluZGV4IG5leHRPbGRTdGFydCA9IG1fb3V0ZXJJbmRleFtqKzFdOworICAgICAgICBzdGQ6OnB0cmRpZmZfdCBvZmZzZXQgPSBvbGRTdGFydCAtIG1fb3V0ZXJJbmRleFtqXTsKKyAgICAgICAgaWYob2Zmc2V0PjApCisgICAgICAgIHsKKyAgICAgICAgICBmb3IoSW5kZXggaz0wOyBrPG1faW5uZXJOb25aZXJvc1tqXTsgKytrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1fZGF0YS5pbmRleChtX291dGVySW5kZXhbal0raykgPSBtX2RhdGEuaW5kZXgob2xkU3RhcnQrayk7CisgICAgICAgICAgICBtX2RhdGEudmFsdWUobV9vdXRlckluZGV4W2pdK2spID0gbV9kYXRhLnZhbHVlKG9sZFN0YXJ0K2spOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX291dGVySW5kZXhbaisxXSA9IG1fb3V0ZXJJbmRleFtqXSArIG1faW5uZXJOb25aZXJvc1tqXTsKKyAgICAgICAgb2xkU3RhcnQgPSBuZXh0T2xkU3RhcnQ7CisgICAgICB9CisgICAgICBkZWxldGVbXSBtX2lubmVyTm9uWmVyb3M7CisgICAgICBtX2lubmVyTm9uWmVyb3MgPSAwOworICAgICAgbV9kYXRhLnJlc2l6ZShtX291dGVySW5kZXhbbV9vdXRlclNpemVdKTsKKyAgICAgIG1fZGF0YS5zcXVlZXplKCk7CisgICAgfQorCisgICAgLyoqIFN1cHByZXNzZXMgYWxsIG5vbnplcm9zIHdoaWNoIGFyZSBcYiBtdWNoIFxiIHNtYWxsZXIgXGIgdGhhbiBcYSByZWZlcmVuY2UgdW5kZXIgdGhlIHRvbGVyZW5jZSBcYSBlcHNpbG9uICovCisgICAgdm9pZCBwcnVuZShTY2FsYXIgcmVmZXJlbmNlLCBSZWFsU2NhbGFyIGVwc2lsb24gPSBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKQorICAgIHsKKyAgICAgIHBydW5lKGRlZmF1bHRfcHJ1bm5pbmdfZnVuYyhyZWZlcmVuY2UsZXBzaWxvbikpOworICAgIH0KKyAgICAKKyAgICAvKiogVHVybnMgdGhlIG1hdHJpeCBpbnRvIGNvbXByZXNzZWQgZm9ybWF0LCBhbmQgc3VwcHJlc3NlcyBhbGwgbm9uemVyb3Mgd2hpY2ggZG8gbm90IHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBcYSBrZWVwLgorICAgICAgKiBUaGUgZnVuY3RvciB0eXBlIFxhIEtlZXBGdW5jIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgICAgICAqIFxjb2RlCisgICAgICAqIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgSW5kZXgmIHJvdywgY29uc3QgSW5kZXgmIGNvbCwgY29uc3QgU2NhbGFyJiB2YWx1ZSkgY29uc3Q7CisgICAgICAqIFxlbmRjb2RlCisgICAgICAqIFxzYSBwcnVuZShTY2FsYXIsUmVhbFNjYWxhcikKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2VlcEZ1bmM+CisgICAgdm9pZCBwcnVuZShjb25zdCBLZWVwRnVuYyYga2VlcCA9IEtlZXBGdW5jKCkpCisgICAgeworICAgICAgLy8gVE9ETyBvcHRpbWl6ZSB0aGUgdW5jb21wcmVzc2VkIG1vZGUgdG8gYXZvaWQgbW92aW5nIGFuZCBhbGxvY2F0aW5nIHRoZSBkYXRhIHR3aWNlCisgICAgICAvLyBUT0RPIGFsc28gaW1wbGVtZW50IGEgdW5pdCB0ZXN0CisgICAgICBtYWtlQ29tcHJlc3NlZCgpOworCisgICAgICBJbmRleCBrID0gMDsKKyAgICAgIGZvcihJbmRleCBqPTA7IGo8bV9vdXRlclNpemU7ICsraikKKyAgICAgIHsKKyAgICAgICAgSW5kZXggcHJldmlvdXNTdGFydCA9IG1fb3V0ZXJJbmRleFtqXTsKKyAgICAgICAgbV9vdXRlckluZGV4W2pdID0gazsKKyAgICAgICAgSW5kZXggZW5kID0gbV9vdXRlckluZGV4W2orMV07CisgICAgICAgIGZvcihJbmRleCBpPXByZXZpb3VzU3RhcnQ7IGk8ZW5kOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICBpZihrZWVwKElzUm93TWFqb3I/ajptX2RhdGEuaW5kZXgoaSksIElzUm93TWFqb3I/bV9kYXRhLmluZGV4KGkpOmosIG1fZGF0YS52YWx1ZShpKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgbV9kYXRhLnZhbHVlKGspID0gbV9kYXRhLnZhbHVlKGkpOworICAgICAgICAgICAgbV9kYXRhLmluZGV4KGspID0gbV9kYXRhLmluZGV4KGkpOworICAgICAgICAgICAgKytrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgbV9vdXRlckluZGV4W21fb3V0ZXJTaXplXSA9IGs7CisgICAgICBtX2RhdGEucmVzaXplKGssMCk7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZXMgdGhlIG1hdHJpeCB0byBhIFxhIHJvd3MgeCBcYSBjb2xzIG1hdHJpeCBhbmQgaW5pdGlhbGl6ZXMgaXQgdG8gemVyby4KKyAgICAgICogXHNhIHJlc2l6ZU5vblplcm9zKEluZGV4KSwgcmVzZXJ2ZSgpLCBzZXRaZXJvKCkKKyAgICAgICovCisgICAgdm9pZCByZXNpemUoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlclNpemUgPSBJc1Jvd01ham9yID8gcm93cyA6IGNvbHM7CisgICAgICBtX2lubmVyU2l6ZSA9IElzUm93TWFqb3IgPyBjb2xzIDogcm93czsKKyAgICAgIG1fZGF0YS5jbGVhcigpOworICAgICAgaWYgKG1fb3V0ZXJTaXplICE9IG91dGVyU2l6ZSB8fCBtX291dGVyU2l6ZT09MCkKKyAgICAgIHsKKyAgICAgICAgZGVsZXRlW10gbV9vdXRlckluZGV4OworICAgICAgICBtX291dGVySW5kZXggPSBuZXcgSW5kZXggW291dGVyU2l6ZSsxXTsKKyAgICAgICAgbV9vdXRlclNpemUgPSBvdXRlclNpemU7CisgICAgICB9CisgICAgICBpZihtX2lubmVyTm9uWmVyb3MpCisgICAgICB7CisgICAgICAgIGRlbGV0ZVtdIG1faW5uZXJOb25aZXJvczsKKyAgICAgICAgbV9pbm5lck5vblplcm9zID0gMDsKKyAgICAgIH0KKyAgICAgIG1lbXNldChtX291dGVySW5kZXgsIDAsIChtX291dGVyU2l6ZSsxKSpzaXplb2YoSW5kZXgpKTsKKyAgICB9CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFJlc2l6ZSB0aGUgbm9uemVybyB2ZWN0b3IgdG8gXGEgc2l6ZSAqLworICAgIHZvaWQgcmVzaXplTm9uWmVyb3MoSW5kZXggc2l6ZSkKKyAgICB7CisgICAgICAvLyBUT0RPIHJlbW92ZSB0aGlzIGZ1bmN0aW9uCisgICAgICBtX2RhdGEucmVzaXplKHNpemUpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBhIGNvbnN0IGV4cHJlc3Npb24gb2YgdGhlIGRpYWdvbmFsIGNvZWZmaWNpZW50cyAqLworICAgIGNvbnN0IERpYWdvbmFsPGNvbnN0IFNwYXJzZU1hdHJpeD4gZGlhZ29uYWwoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IgeWllbGRpbmcgYW4gZW1wdHkgXGMgMCBcYyB4IFxjIDAgbWF0cml4ICovCisgICAgaW5saW5lIFNwYXJzZU1hdHJpeCgpCisgICAgICA6IG1fb3V0ZXJTaXplKC0xKSwgbV9pbm5lclNpemUoMCksIG1fb3V0ZXJJbmRleCgwKSwgbV9pbm5lck5vblplcm9zKDApCisgICAgeworICAgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpOworICAgICAgcmVzaXplKDAsIDApOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgXGEgcm93cyBcYyB4IFxhIGNvbHMgZW1wdHkgbWF0cml4ICovCisgICAgaW5saW5lIFNwYXJzZU1hdHJpeChJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgICAgOiBtX291dGVyU2l6ZSgwKSwgbV9pbm5lclNpemUoMCksIG1fb3V0ZXJJbmRleCgwKSwgbV9pbm5lck5vblplcm9zKDApCisgICAgeworICAgICAgY2hlY2tfdGVtcGxhdGVfcGFyYW1ldGVycygpOworICAgICAgcmVzaXplKHJvd3MsIGNvbHMpOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgc3BhcnNlIG1hdHJpeCBmcm9tIHRoZSBzcGFyc2UgZXhwcmVzc2lvbiBcYSBvdGhlciAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBpbmxpbmUgU3BhcnNlTWF0cml4KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICA6IG1fb3V0ZXJTaXplKDApLCBtX2lubmVyU2l6ZSgwKSwgbV9vdXRlckluZGV4KDApLCBtX2lubmVyTm9uWmVyb3MoMCkKKyAgICB7CisgICAgICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisgICAgICAqdGhpcyA9IG90aGVyLmRlcml2ZWQoKTsKKyAgICB9CisKKyAgICAvKiogQ29weSBjb25zdHJ1Y3RvciAoaXQgcGVyZm9ybXMgYSBkZWVwIGNvcHkpICovCisgICAgaW5saW5lIFNwYXJzZU1hdHJpeChjb25zdCBTcGFyc2VNYXRyaXgmIG90aGVyKQorICAgICAgOiBCYXNlKCksIG1fb3V0ZXJTaXplKDApLCBtX2lubmVyU2l6ZSgwKSwgbV9vdXRlckluZGV4KDApLCBtX2lubmVyTm9uWmVyb3MoMCkKKyAgICB7CisgICAgICBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCk7CisgICAgICAqdGhpcyA9IG90aGVyLmRlcml2ZWQoKTsKKyAgICB9CisKKyAgICAvKiogU3dhcHMgdGhlIGNvbnRlbnQgb2YgdHdvIHNwYXJzZSBtYXRyaWNlcyBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgKiBUaGlzIGlzIGEgZmFzdCBvcGVyYXRpb24gdGhhdCBzaW1wbHkgc3dhcHMgdGhlIHVuZGVybHlpbmcgcG9pbnRlcnMgYW5kIHBhcmFtZXRlcnMuICovCisgICAgaW5saW5lIHZvaWQgc3dhcChTcGFyc2VNYXRyaXgmIG90aGVyKQorICAgIHsKKyAgICAgIC8vRUlHRU5fREJHX1NQQVJTRShzdGQ6OmNvdXQgPDwgIlNwYXJzZU1hdHJpeDo6IHN3YXBcbiIpOworICAgICAgc3RkOjpzd2FwKG1fb3V0ZXJJbmRleCwgb3RoZXIubV9vdXRlckluZGV4KTsKKyAgICAgIHN0ZDo6c3dhcChtX2lubmVyU2l6ZSwgb3RoZXIubV9pbm5lclNpemUpOworICAgICAgc3RkOjpzd2FwKG1fb3V0ZXJTaXplLCBvdGhlci5tX291dGVyU2l6ZSk7CisgICAgICBzdGQ6OnN3YXAobV9pbm5lck5vblplcm9zLCBvdGhlci5tX2lubmVyTm9uWmVyb3MpOworICAgICAgbV9kYXRhLnN3YXAob3RoZXIubV9kYXRhKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU3BhcnNlTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlTWF0cml4JiBvdGhlcikKKyAgICB7CisgICAgICBpZiAob3RoZXIuaXNSVmFsdWUoKSkKKyAgICAgIHsKKyAgICAgICAgc3dhcChvdGhlci5jb25zdF9jYXN0X2Rlcml2ZWQoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGluaXRBc3NpZ25tZW50KG90aGVyKTsKKyAgICAgICAgaWYob3RoZXIuaXNDb21wcmVzc2VkKCkpCisgICAgICAgIHsKKyAgICAgICAgICBtZW1jcHkobV9vdXRlckluZGV4LCBvdGhlci5tX291dGVySW5kZXgsIChtX291dGVyU2l6ZSsxKSpzaXplb2YoSW5kZXgpKTsKKyAgICAgICAgICBtX2RhdGEgPSBvdGhlci5tX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgU3BhcnNlTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlU3BhcnNlUHJvZHVjdDxMaHMsUmhzPiYgcHJvZHVjdCkKKyAgICB7IHJldHVybiBCYXNlOjpvcGVyYXRvcj0ocHJvZHVjdCk7IH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIFNwYXJzZU1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeyByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KG90aGVyLmRlcml2ZWQoKSk7IH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIFNwYXJzZU1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IEVpZ2VuQmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7IHJldHVybiBCYXNlOjpvcGVyYXRvcj0ob3RoZXIuZGVyaXZlZCgpKTsgfQorICAgICNlbmRpZgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIEVJR0VOX0RPTlRfSU5MSU5FIFNwYXJzZU1hdHJpeCYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgaW5pdEFzc2lnbm1lbnQob3RoZXIuZGVyaXZlZCgpKTsKKyAgICAgIGNvbnN0IGJvb2wgbmVlZFRvVHJhbnNwb3NlID0gKEZsYWdzICYgUm93TWFqb3JCaXQpICE9IChPdGhlckRlcml2ZWQ6OkZsYWdzICYgUm93TWFqb3JCaXQpOworICAgICAgaWYgKG5lZWRUb1RyYW5zcG9zZSkKKyAgICAgIHsKKyAgICAgICAgLy8gdHdvIHBhc3NlcyBhbGdvcml0aG06CisgICAgICAgIC8vICAxIC0gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGNvZWZmcyBwZXIgZGVzdCBpbm5lciB2ZWN0b3IKKyAgICAgICAgLy8gIDIgLSBkbyB0aGUgYWN0dWFsIGNvcHkvZXZhbAorICAgICAgICAvLyBTaW5jZSBlYWNoIGNvZWZmIG9mIHRoZSByaHMgaGFzIHRvIGJlIGV2YWx1YXRlZCB0d2ljZSwgbGV0J3MgZXZhbHVhdGUgaXQgaWYgbmVlZGVkCisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxPdGhlckRlcml2ZWQsMj46OnR5cGUgT3RoZXJDb3B5OworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyQ29weT46OnR5cGUgX090aGVyQ29weTsKKyAgICAgICAgT3RoZXJDb3B5IG90aGVyQ29weShvdGhlci5kZXJpdmVkKCkpOworCisgICAgICAgIEVpZ2VuOjpNYXA8TWF0cml4PEluZGV4LCBEeW5hbWljLCAxPiA+IChtX291dGVySW5kZXgsb3V0ZXJTaXplKCkpLnNldFplcm8oKTsKKyAgICAgICAgLy8gcGFzcyAxCisgICAgICAgIC8vIEZJWE1FIHRoZSBhYm92ZSBjb3B5IGNvdWxkIGJlIG1lcmdlZCB3aXRoIHRoYXQgcGFzcworICAgICAgICBmb3IgKEluZGV4IGo9MDsgajxvdGhlckNvcHkub3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgICBmb3IgKHR5cGVuYW1lIF9PdGhlckNvcHk6OklubmVySXRlcmF0b3IgaXQob3RoZXJDb3B5LCBqKTsgaXQ7ICsraXQpCisgICAgICAgICAgICArK21fb3V0ZXJJbmRleFtpdC5pbmRleCgpXTsKKworICAgICAgICAvLyBwcmVmaXggc3VtCisgICAgICAgIEluZGV4IGNvdW50ID0gMDsKKyAgICAgICAgVmVjdG9yWGkgcG9zaXRpb25zKG91dGVyU2l6ZSgpKTsKKyAgICAgICAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IHRtcCA9IG1fb3V0ZXJJbmRleFtqXTsKKyAgICAgICAgICBtX291dGVySW5kZXhbal0gPSBjb3VudDsKKyAgICAgICAgICBwb3NpdGlvbnNbal0gPSBjb3VudDsKKyAgICAgICAgICBjb3VudCArPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgbV9vdXRlckluZGV4W291dGVyU2l6ZSgpXSA9IGNvdW50OworICAgICAgICAvLyBhbGxvYworICAgICAgICBtX2RhdGEucmVzaXplKGNvdW50KTsKKyAgICAgICAgLy8gcGFzcyAyCisgICAgICAgIGZvciAoSW5kZXggaj0wOyBqPG90aGVyQ29weS5vdXRlclNpemUoKTsgKytqKQorICAgICAgICB7CisgICAgICAgICAgZm9yICh0eXBlbmFtZSBfT3RoZXJDb3B5OjpJbm5lckl0ZXJhdG9yIGl0KG90aGVyQ29weSwgaik7IGl0OyArK2l0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4IHBvcyA9IHBvc2l0aW9uc1tpdC5pbmRleCgpXSsrOworICAgICAgICAgICAgbV9kYXRhLmluZGV4KHBvcykgPSBqOworICAgICAgICAgICAgbV9kYXRhLnZhbHVlKHBvcykgPSBpdC52YWx1ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIHRoZXJlIGlzIG5vIHNwZWNpYWwgb3B0aW1pemF0aW9uCisgICAgICAgIHJldHVybiBCYXNlOjpvcGVyYXRvcj0ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IFNwYXJzZU1hdHJpeCYgbSkKKyAgICB7CisgICAgICBFSUdFTl9EQkdfU1BBUlNFKAorICAgICAgICBzIDw8ICJOb256ZXJvIGVudHJpZXM6XG4iOworICAgICAgICBpZihtLmlzQ29tcHJlc3NlZCgpKQorICAgICAgICAgIGZvciAoSW5kZXggaT0wOyBpPG0ubm9uWmVyb3MoKTsgKytpKQorICAgICAgICAgICAgcyA8PCAiKCIgPDwgbS5tX2RhdGEudmFsdWUoaSkgPDwgIiwiIDw8IG0ubV9kYXRhLmluZGV4KGkpIDw8ICIpICI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBmb3IgKEluZGV4IGk9MDsgaTxtLm91dGVyU2l6ZSgpOyArK2kpCisgICAgICAgICAgeworICAgICAgICAgICAgaW50IHAgPSBtLm1fb3V0ZXJJbmRleFtpXTsKKyAgICAgICAgICAgIGludCBwZSA9IG0ubV9vdXRlckluZGV4W2ldK20ubV9pbm5lck5vblplcm9zW2ldOworICAgICAgICAgICAgSW5kZXggaz1wOworICAgICAgICAgICAgZm9yICg7IGs8cGU7ICsraykKKyAgICAgICAgICAgICAgcyA8PCAiKCIgPDwgbS5tX2RhdGEudmFsdWUoaykgPDwgIiwiIDw8IG0ubV9kYXRhLmluZGV4KGspIDw8ICIpICI7CisgICAgICAgICAgICBmb3IgKDsgazxtLm1fb3V0ZXJJbmRleFtpKzFdOyArK2spCisgICAgICAgICAgICAgIHMgPDwgIihfLF8pICI7CisgICAgICAgICAgfQorICAgICAgICBzIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHMgPDwgIk91dGVyIHBvaW50ZXJzOlxuIjsKKyAgICAgICAgZm9yIChJbmRleCBpPTA7IGk8bS5vdXRlclNpemUoKTsgKytpKQorICAgICAgICAgIHMgPDwgbS5tX291dGVySW5kZXhbaV0gPDwgIiAiOworICAgICAgICBzIDw8ICIgJCIgPDwgc3RkOjplbmRsOworICAgICAgICBpZighbS5pc0NvbXByZXNzZWQoKSkKKyAgICAgICAgeworICAgICAgICAgIHMgPDwgIklubmVyIG5vbiB6ZXJvczpcbiI7CisgICAgICAgICAgZm9yIChJbmRleCBpPTA7IGk8bS5vdXRlclNpemUoKTsgKytpKQorICAgICAgICAgICAgcyA8PCBtLm1faW5uZXJOb25aZXJvc1tpXSA8PCAiICI7CisgICAgICAgICAgcyA8PCAiICQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAgICAgICBzIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICk7CisgICAgICBzIDw8IHN0YXRpY19jYXN0PGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlTWF0cml4PiY+KG0pOworICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgLyoqIERlc3RydWN0b3IgKi8KKyAgICBpbmxpbmUgflNwYXJzZU1hdHJpeCgpCisgICAgeworICAgICAgZGVsZXRlW10gbV9vdXRlckluZGV4OworICAgICAgZGVsZXRlW10gbV9pbm5lck5vblplcm9zOworICAgIH0KKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBPdmVybG9hZGVkIGZvciBwZXJmb3JtYW5jZSAqLworICAgIFNjYWxhciBzdW0oKSBjb25zdDsKKyNlbmRpZgorICAgIAorIyAgIGlmZGVmIEVJR0VOX1NQQVJTRU1BVFJJWF9QTFVHSU4KKyMgICAgIGluY2x1ZGUgRUlHRU5fU1BBUlNFTUFUUklYX1BMVUdJTgorIyAgIGVuZGlmCisKK3Byb3RlY3RlZDoKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyPgorICAgIHZvaWQgaW5pdEFzc2lnbm1lbnQoY29uc3QgT3RoZXImIG90aGVyKQorICAgIHsKKyAgICAgIHJlc2l6ZShvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisgICAgICBpZihtX2lubmVyTm9uWmVyb3MpCisgICAgICB7CisgICAgICAgIGRlbGV0ZVtdIG1faW5uZXJOb25aZXJvczsKKyAgICAgICAgbV9pbm5lck5vblplcm9zID0gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogXGludGVybmFsCisgICAgICAqIFxzYSBpbnNlcnQoSW5kZXgsSW5kZXgpICovCisgICAgRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyJiBpbnNlcnRDb21wcmVzc2VkKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChpc0NvbXByZXNzZWQoKSk7CisKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKworICAgICAgSW5kZXggcHJldmlvdXNPdXRlciA9IG91dGVyOworICAgICAgaWYgKG1fb3V0ZXJJbmRleFtvdXRlcisxXT09MCkKKyAgICAgIHsKKyAgICAgICAgLy8gd2Ugc3RhcnQgYSBuZXcgaW5uZXIgdmVjdG9yCisgICAgICAgIHdoaWxlIChwcmV2aW91c091dGVyPj0wICYmIG1fb3V0ZXJJbmRleFtwcmV2aW91c091dGVyXT09MCkKKyAgICAgICAgeworICAgICAgICAgIG1fb3V0ZXJJbmRleFtwcmV2aW91c091dGVyXSA9IHN0YXRpY19jYXN0PEluZGV4PihtX2RhdGEuc2l6ZSgpKTsKKyAgICAgICAgICAtLXByZXZpb3VzT3V0ZXI7CisgICAgICAgIH0KKyAgICAgICAgbV9vdXRlckluZGV4W291dGVyKzFdID0gbV9vdXRlckluZGV4W291dGVyXTsKKyAgICAgIH0KKworICAgICAgLy8gaGVyZSB3ZSBoYXZlIHRvIGhhbmRsZSB0aGUgdHJpY2t5IGNhc2Ugd2hlcmUgdGhlIG91dGVySW5kZXggYXJyYXkKKyAgICAgIC8vIHN0YXJ0cyB3aXRoOiBbIDAgMCAwIDAgMCAxIC4uLl0gYW5kIHdlIGFyZSBpbnNlcnRlZCBpbiwgZS5nLiwKKyAgICAgIC8vIHRoZSAybmQgaW5uZXIgdmVjdG9yLi4uCisgICAgICBib29sIGlzTGFzdFZlYyA9ICghKHByZXZpb3VzT3V0ZXI9PS0xICYmIG1fZGF0YS5zaXplKCkhPTApKQorICAgICAgICAgICAgICAgICAgICAmJiAoc2l6ZV90KG1fb3V0ZXJJbmRleFtvdXRlcisxXSkgPT0gbV9kYXRhLnNpemUoKSk7CisKKyAgICAgIHNpemVfdCBzdGFydElkID0gbV9vdXRlckluZGV4W291dGVyXTsKKyAgICAgIC8vIEZJWE1FIGxldCdzIG1ha2Ugc3VyZSBzaXplb2YobG9uZyBpbnQpID09IHNpemVvZihzaXplX3QpCisgICAgICBzaXplX3QgcCA9IG1fb3V0ZXJJbmRleFtvdXRlcisxXTsKKyAgICAgICsrbV9vdXRlckluZGV4W291dGVyKzFdOworCisgICAgICBmbG9hdCByZWFsbG9jUmF0aW8gPSAxOworICAgICAgaWYgKG1fZGF0YS5hbGxvY2F0ZWRTaXplKCk8PW1fZGF0YS5zaXplKCkpCisgICAgICB7CisgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHByZWFsbG9jYXRlZCBtZW1vcnksIGxldCdzIHJlc2VydmUgYSBtaW5pbXVtIG9mIDMyIGVsZW1lbnRzCisgICAgICAgIGlmIChtX2RhdGEuc2l6ZSgpPT0wKQorICAgICAgICB7CisgICAgICAgICAgbV9kYXRhLnJlc2VydmUoMzIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgZGF0YSwgdG8gcmVkdWNlIG11bHRpcGxlIHJlYWxsb2NhdGlvbnMKKyAgICAgICAgICAvLyB3ZSB1c2UgYSBzbWFydCByZXNpemUgYWxnb3JpdGhtIGJhc2VkIG9uIHRoZSBjdXJyZW50IGZpbGxpbmcgcmF0aW8KKyAgICAgICAgICAvLyBpbiBhZGRpdGlvbiwgd2UgdXNlIGZsb2F0IHRvIGF2b2lkIGludGVnZXJzIG92ZXJmbG93cworICAgICAgICAgIGZsb2F0IG5uekVzdGltYXRlID0gZmxvYXQobV9vdXRlckluZGV4W291dGVyXSkqZmxvYXQobV9vdXRlclNpemUpL2Zsb2F0KG91dGVyKzEpOworICAgICAgICAgIHJlYWxsb2NSYXRpbyA9IChubnpFc3RpbWF0ZS1mbG9hdChtX2RhdGEuc2l6ZSgpKSkvZmxvYXQobV9kYXRhLnNpemUoKSk7CisgICAgICAgICAgLy8gZnVydGhlcm1vcmUgd2UgYm91bmQgdGhlIHJlYWxsb2MgcmF0aW8gdG86CisgICAgICAgICAgLy8gICAxKSByZWR1Y2UgbXVsdGlwbGUgbWlub3IgcmVhbGxvYyB3aGVuIHRoZSBtYXRyaXggaXMgYWxtb3N0IGZpbGxlZAorICAgICAgICAgIC8vICAgMikgYXZvaWQgdG8gYWxsb2NhdGUgdG9vIG11Y2ggbWVtb3J5IHdoZW4gdGhlIG1hdHJpeCBpcyBhbG1vc3QgZW1wdHkKKyAgICAgICAgICByZWFsbG9jUmF0aW8gPSAoc3RkOjptaW4pKChzdGQ6Om1heCkocmVhbGxvY1JhdGlvLDEuNWYpLDguZik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1fZGF0YS5yZXNpemUobV9kYXRhLnNpemUoKSsxLHJlYWxsb2NSYXRpbyk7CisKKyAgICAgIGlmICghaXNMYXN0VmVjKQorICAgICAgeworICAgICAgICBpZiAocHJldmlvdXNPdXRlcj09LTEpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBvb3BzIHdyb25nIGd1ZXNzLgorICAgICAgICAgIC8vIGxldCdzIGNvcnJlY3QgdGhlIG91dGVyIG9mZnNldHMKKyAgICAgICAgICBmb3IgKEluZGV4IGs9MDsgazw9KG91dGVyKzEpOyArK2spCisgICAgICAgICAgICBtX291dGVySW5kZXhba10gPSAwOworICAgICAgICAgIEluZGV4IGs9b3V0ZXIrMTsKKyAgICAgICAgICB3aGlsZShtX291dGVySW5kZXhba109PTApCisgICAgICAgICAgICBtX291dGVySW5kZXhbaysrXSA9IDE7CisgICAgICAgICAgd2hpbGUgKGs8PW1fb3V0ZXJTaXplICYmIG1fb3V0ZXJJbmRleFtrXSE9MCkKKyAgICAgICAgICAgIG1fb3V0ZXJJbmRleFtrKytdKys7CisgICAgICAgICAgcCA9IDA7CisgICAgICAgICAgLS1rOworICAgICAgICAgIGsgPSBtX291dGVySW5kZXhba10tMTsKKyAgICAgICAgICB3aGlsZSAoaz4wKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1fZGF0YS5pbmRleChrKSA9IG1fZGF0YS5pbmRleChrLTEpOworICAgICAgICAgICAgbV9kYXRhLnZhbHVlKGspID0gbV9kYXRhLnZhbHVlKGstMSk7CisgICAgICAgICAgICBrLS07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vIHdlIGFyZSBub3QgaW5zZXJ0aW5nIGludG8gdGhlIGxhc3QgaW5uZXIgdmVjCisgICAgICAgICAgLy8gdXBkYXRlIG91dGVyIGluZGljZXM6CisgICAgICAgICAgSW5kZXggaiA9IG91dGVyKzI7CisgICAgICAgICAgd2hpbGUgKGo8PW1fb3V0ZXJTaXplICYmIG1fb3V0ZXJJbmRleFtqXSE9MCkKKyAgICAgICAgICAgIG1fb3V0ZXJJbmRleFtqKytdKys7CisgICAgICAgICAgLS1qOworICAgICAgICAgIC8vIHNoaWZ0IGRhdGEgb2YgbGFzdCB2ZWNzOgorICAgICAgICAgIEluZGV4IGsgPSBtX291dGVySW5kZXhbal0tMTsKKyAgICAgICAgICB3aGlsZSAoaz49SW5kZXgocCkpCisgICAgICAgICAgeworICAgICAgICAgICAgbV9kYXRhLmluZGV4KGspID0gbV9kYXRhLmluZGV4KGstMSk7CisgICAgICAgICAgICBtX2RhdGEudmFsdWUoaykgPSBtX2RhdGEudmFsdWUoay0xKTsKKyAgICAgICAgICAgIGstLTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgd2hpbGUgKCAocCA+IHN0YXJ0SWQpICYmIChtX2RhdGEuaW5kZXgocC0xKSA+IGlubmVyKSApCisgICAgICB7CisgICAgICAgIG1fZGF0YS5pbmRleChwKSA9IG1fZGF0YS5pbmRleChwLTEpOworICAgICAgICBtX2RhdGEudmFsdWUocCkgPSBtX2RhdGEudmFsdWUocC0xKTsKKyAgICAgICAgLS1wOworICAgICAgfQorCisgICAgICBtX2RhdGEuaW5kZXgocCkgPSBpbm5lcjsKKyAgICAgIHJldHVybiAobV9kYXRhLnZhbHVlKHApID0gMCk7CisgICAgfQorCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBBIHZlY3RvciBvYmplY3QgdGhhdCBpcyBlcXVhbCB0byAwIGV2ZXJ5d2hlcmUgYnV0IHYgYXQgdGhlIHBvc2l0aW9uIGkgKi8KKyAgICBjbGFzcyBTaW5nbGV0b25WZWN0b3IKKyAgICB7CisgICAgICAgIEluZGV4IG1faW5kZXg7CisgICAgICAgIEluZGV4IG1fdmFsdWU7CisgICAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgSW5kZXggdmFsdWVfdHlwZTsKKyAgICAgICAgU2luZ2xldG9uVmVjdG9yKEluZGV4IGksIEluZGV4IHYpCisgICAgICAgICAgOiBtX2luZGV4KGkpLCBtX3ZhbHVlKHYpCisgICAgICAgIHt9CisKKyAgICAgICAgSW5kZXggb3BlcmF0b3JbXShJbmRleCBpKSBjb25zdCB7IHJldHVybiBpPT1tX2luZGV4ID8gbV92YWx1ZSA6IDA7IH0KKyAgICB9OworCisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBcc2EgaW5zZXJ0KEluZGV4LEluZGV4KSAqLworICAgIEVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciYgaW5zZXJ0VW5jb21wcmVzc2VkKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCghaXNDb21wcmVzc2VkKCkpOworCisgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgIHN0ZDo6cHRyZGlmZl90IHJvb20gPSBtX291dGVySW5kZXhbb3V0ZXIrMV0gLSBtX291dGVySW5kZXhbb3V0ZXJdOworICAgICAgc3RkOjpwdHJkaWZmX3QgaW5uZXJOTlogPSBtX2lubmVyTm9uWmVyb3Nbb3V0ZXJdOworICAgICAgaWYoaW5uZXJOTlo+PXJvb20pCisgICAgICB7CisgICAgICAgIC8vIHRoaXMgaW5uZXIgdmVjdG9yIGlzIGZ1bGwsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgd2hvbGUgYnVmZmVyIDooCisgICAgICAgIHJlc2VydmUoU2luZ2xldG9uVmVjdG9yKG91dGVyLHN0ZDo6bWF4PHN0ZDo6cHRyZGlmZl90PigyLGlubmVyTk5aKSkpOworICAgICAgfQorCisgICAgICBJbmRleCBzdGFydElkID0gbV9vdXRlckluZGV4W291dGVyXTsKKyAgICAgIEluZGV4IHAgPSBzdGFydElkICsgbV9pbm5lck5vblplcm9zW291dGVyXTsKKyAgICAgIHdoaWxlICggKHAgPiBzdGFydElkKSAmJiAobV9kYXRhLmluZGV4KHAtMSkgPiBpbm5lcikgKQorICAgICAgeworICAgICAgICBtX2RhdGEuaW5kZXgocCkgPSBtX2RhdGEuaW5kZXgocC0xKTsKKyAgICAgICAgbV9kYXRhLnZhbHVlKHApID0gbV9kYXRhLnZhbHVlKHAtMSk7CisgICAgICAgIC0tcDsKKyAgICAgIH0KKworICAgICAgbV9pbm5lck5vblplcm9zW291dGVyXSsrOworCisgICAgICBtX2RhdGEuaW5kZXgocCkgPSBpbm5lcjsKKyAgICAgIHJldHVybiAobV9kYXRhLnZhbHVlKHApID0gMCk7CisgICAgfQorCitwdWJsaWM6CisgICAgLyoqIFxpbnRlcm5hbAorICAgICAgKiBcc2EgaW5zZXJ0KEluZGV4LEluZGV4KSAqLworICAgIGlubGluZSBTY2FsYXImIGluc2VydEJhY2tVbmNvbXByZXNzZWQoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICBlaWdlbl9hc3NlcnQoIWlzQ29tcHJlc3NlZCgpKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lubmVyTm9uWmVyb3Nbb3V0ZXJdPD0obV9vdXRlckluZGV4W291dGVyKzFdIC0gbV9vdXRlckluZGV4W291dGVyXSkpOworCisgICAgICBJbmRleCBwID0gbV9vdXRlckluZGV4W291dGVyXSArIG1faW5uZXJOb25aZXJvc1tvdXRlcl07CisgICAgICBtX2lubmVyTm9uWmVyb3Nbb3V0ZXJdKys7CisgICAgICBtX2RhdGEuaW5kZXgocCkgPSBpbm5lcjsKKyAgICAgIHJldHVybiAobV9kYXRhLnZhbHVlKHApID0gMCk7CisgICAgfQorCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCBjaGVja190ZW1wbGF0ZV9wYXJhbWV0ZXJzKCkKKyAgeworICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoTnVtVHJhaXRzPEluZGV4Pjo6SXNTaWduZWQsVEhFX0lOREVYX1RZUEVfTVVTVF9CRV9BX1NJR05FRF9UWVBFKTsKKyAgfQorCisgIHN0cnVjdCBkZWZhdWx0X3BydW5uaW5nX2Z1bmMgeworICAgIGRlZmF1bHRfcHJ1bm5pbmdfZnVuYyhTY2FsYXIgcmVmLCBSZWFsU2NhbGFyIGVwcykgOiByZWZlcmVuY2UocmVmKSwgZXBzaWxvbihlcHMpIHt9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgSW5kZXgmLCBjb25zdCBJbmRleCYsIGNvbnN0IFNjYWxhciYgdmFsdWUpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuICFpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4odmFsdWUsIHJlZmVyZW5jZSwgZXBzaWxvbik7CisgICAgfQorICAgIFNjYWxhciByZWZlcmVuY2U7CisgICAgUmVhbFNjYWxhciBlcHNpbG9uOworICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9JbmRleD4KK2NsYXNzIFNwYXJzZU1hdHJpeDxTY2FsYXIsX09wdGlvbnMsX0luZGV4Pjo6SW5uZXJJdGVyYXRvcgoreworICBwdWJsaWM6CisgICAgSW5uZXJJdGVyYXRvcihjb25zdCBTcGFyc2VNYXRyaXgmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgICA6IG1fdmFsdWVzKG1hdC52YWx1ZVB0cigpKSwgbV9pbmRpY2VzKG1hdC5pbm5lckluZGV4UHRyKCkpLCBtX291dGVyKG91dGVyKSwgbV9pZChtYXQubV9vdXRlckluZGV4W291dGVyXSkKKyAgICB7CisgICAgICBpZihtYXQuaXNDb21wcmVzc2VkKCkpCisgICAgICAgIG1fZW5kID0gbWF0Lm1fb3V0ZXJJbmRleFtvdXRlcisxXTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9lbmQgPSBtX2lkICsgbWF0Lm1faW5uZXJOb25aZXJvc1tvdXRlcl07CisgICAgfQorCisgICAgaW5saW5lIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IG1faWQrKzsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW21faWRdOyB9CisgICAgaW5saW5lIFNjYWxhciYgdmFsdWVSZWYoKSB7IHJldHVybiBjb25zdF9jYXN0PFNjYWxhciY+KG1fdmFsdWVzW21faWRdKTsgfQorCisgICAgaW5saW5lIEluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRpY2VzW21faWRdOyB9CisgICAgaW5saW5lIEluZGV4IG91dGVyKCkgY29uc3QgeyByZXR1cm4gbV9vdXRlcjsgfQorICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlciA6IGluZGV4KCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IGluZGV4KCkgOiBtX291dGVyOyB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIChtX2lkIDwgbV9lbmQpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFNjYWxhciogbV92YWx1ZXM7CisgICAgY29uc3QgSW5kZXgqIG1faW5kaWNlczsKKyAgICBjb25zdCBJbmRleCBtX291dGVyOworICAgIEluZGV4IG1faWQ7CisgICAgSW5kZXggbV9lbmQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4PgorY2xhc3MgU3BhcnNlTWF0cml4PFNjYWxhcixfT3B0aW9ucyxfSW5kZXg+OjpSZXZlcnNlSW5uZXJJdGVyYXRvcgoreworICBwdWJsaWM6CisgICAgUmV2ZXJzZUlubmVySXRlcmF0b3IoY29uc3QgU3BhcnNlTWF0cml4JiBtYXQsIEluZGV4IG91dGVyKQorICAgICAgOiBtX3ZhbHVlcyhtYXQudmFsdWVQdHIoKSksIG1faW5kaWNlcyhtYXQuaW5uZXJJbmRleFB0cigpKSwgbV9vdXRlcihvdXRlciksIG1fc3RhcnQobWF0Lm1fb3V0ZXJJbmRleFtvdXRlcl0pCisgICAgeworICAgICAgaWYobWF0LmlzQ29tcHJlc3NlZCgpKQorICAgICAgICBtX2lkID0gbWF0Lm1fb3V0ZXJJbmRleFtvdXRlcisxXTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9pZCA9IG1fc3RhcnQgKyBtYXQubV9pbm5lck5vblplcm9zW291dGVyXTsKKyAgICB9CisKKyAgICBpbmxpbmUgUmV2ZXJzZUlubmVySXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7IC0tbV9pZDsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW21faWQtMV07IH0KKyAgICBpbmxpbmUgU2NhbGFyJiB2YWx1ZVJlZigpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyJj4obV92YWx1ZXNbbV9pZC0xXSk7IH0KKworICAgIGlubGluZSBJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kaWNlc1ttX2lkLTFdOyB9CisgICAgaW5saW5lIEluZGV4IG91dGVyKCkgY29uc3QgeyByZXR1cm4gbV9vdXRlcjsgfQorICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlciA6IGluZGV4KCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IGluZGV4KCkgOiBtX291dGVyOyB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIChtX2lkID4gbV9zdGFydCk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgU2NhbGFyKiBtX3ZhbHVlczsKKyAgICBjb25zdCBJbmRleCogbV9pbmRpY2VzOworICAgIGNvbnN0IEluZGV4IG1fb3V0ZXI7CisgICAgSW5kZXggbV9pZDsKKyAgICBjb25zdCBJbmRleCBtX3N0YXJ0OworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZT4KK3ZvaWQgc2V0X2Zyb21fdHJpcGxldHMoY29uc3QgSW5wdXRJdGVyYXRvciYgYmVnaW4sIGNvbnN0IElucHV0SXRlcmF0b3ImIGVuZCwgU3BhcnNlTWF0cml4VHlwZSYgbWF0LCBpbnQgT3B0aW9ucyA9IDApCit7CisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShPcHRpb25zKTsKKyAgZW51bSB7IElzUm93TWFqb3IgPSBTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgU3BhcnNlTWF0cml4PFNjYWxhcixJc1Jvd01ham9yP0NvbE1ham9yOlJvd01ham9yPiB0ck1hdChtYXQucm93cygpLG1hdC5jb2xzKCkpOworCisgIC8vIHBhc3MgMTogY291bnQgdGhlIG5ueiBwZXIgaW5uZXItdmVjdG9yCisgIFZlY3RvclhpIHdpKHRyTWF0Lm91dGVyU2l6ZSgpKTsKKyAgd2kuc2V0WmVybygpOworICBmb3IoSW5wdXRJdGVyYXRvciBpdChiZWdpbik7IGl0IT1lbmQ7ICsraXQpCisgICAgd2koSXNSb3dNYWpvciA/IGl0LT5jb2woKSA6IGl0LT5yb3coKSkrKzsKKworICAvLyBwYXNzIDI6IGluc2VydCBhbGwgdGhlIGVsZW1lbnRzIGludG8gdHJNYXQKKyAgdHJNYXQucmVzZXJ2ZSh3aSk7CisgIGZvcihJbnB1dEl0ZXJhdG9yIGl0KGJlZ2luKTsgaXQhPWVuZDsgKytpdCkKKyAgICB0ck1hdC5pbnNlcnRCYWNrVW5jb21wcmVzc2VkKGl0LT5yb3coKSxpdC0+Y29sKCkpID0gaXQtPnZhbHVlKCk7CisKKyAgLy8gcGFzcyAzOgorICB0ck1hdC5zdW11cER1cGxpY2F0ZXMoKTsKKworICAvLyBwYXNzIDQ6IHRyYW5zcG9zZWQgY29weSAtPiBpbXBsaWNpdCBzb3J0aW5nCisgIG1hdCA9IHRyTWF0OworfQorCit9CisKKworLyoqIEZpbGwgdGhlIG1hdHJpeCBcYyAqdGhpcyB3aXRoIHRoZSBsaXN0IG9mIFxlbSB0cmlwbGV0cyBkZWZpbmVkIGJ5IHRoZSBpdGVyYXRvciByYW5nZSBcYSBiZWdpbiAtIFxiLgorICAqCisgICogQSBcZW0gdHJpcGxldCBpcyBhIHR1cGxlIChpLGosdmFsdWUpIGRlZmluaW5nIGEgbm9uLXplcm8gZWxlbWVudC4KKyAgKiBUaGUgaW5wdXQgbGlzdCBvZiB0cmlwbGV0cyBkb2VzIG5vdCBoYXZlIHRvIGJlIHNvcnRlZCwgYW5kIGNhbiBjb250YWlucyBkdXBsaWNhdGVkIGVsZW1lbnRzLgorICAqIEluIGFueSBjYXNlLCB0aGUgcmVzdWx0IGlzIGEgXGIgc29ydGVkIGFuZCBcYiBjb21wcmVzc2VkIHNwYXJzZSBtYXRyaXggd2hlcmUgdGhlIGR1cGxpY2F0ZXMgaGF2ZSBiZWVuIHN1bW1lZCB1cC4KKyAgKiBUaGlzIGlzIGEgXGVtIE8obikgb3BlcmF0aW9uLCB3aXRoIFxlbSBuIHRoZSBudW1iZXIgb2YgdHJpcGxldCBlbGVtZW50cy4KKyAgKiBUaGUgaW5pdGlhbCBjb250ZW50cyBvZiBcYyAqdGhpcyBpcyBkZXN0cm95ZWQuCisgICogVGhlIG1hdHJpeCBcYyAqdGhpcyBtdXN0IGJlIHByb3Blcmx5IHJlc2l6ZWQgYmVmb3JlaGFuZCB1c2luZyB0aGUgU3BhcnNlTWF0cml4KEluZGV4LEluZGV4KSBjb25zdHJ1Y3RvciwKKyAgKiBvciB0aGUgcmVzaXplKEluZGV4LEluZGV4KSBtZXRob2QuIFRoZSBzaXplcyBhcmUgbm90IGV4dHJhY3RlZCBmcm9tIHRoZSB0cmlwbGV0IGxpc3QuCisgICoKKyAgKiBUaGUgXGEgSW5wdXRJdGVyYXRvcnMgdmFsdWVfdHlwZSBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2U6CisgICogXGNvZGUKKyAgKiBTY2FsYXIgdmFsdWUoKSBjb25zdDsgLy8gdGhlIHZhbHVlCisgICogU2NhbGFyIHJvdygpIGNvbnN0OyAgIC8vIHRoZSByb3cgaW5kZXggaQorICAqIFNjYWxhciBjb2woKSBjb25zdDsgICAvLyB0aGUgY29sdW1uIGluZGV4IGoKKyAgKiBcZW5kY29kZQorICAqIFNlZSBmb3IgaW5zdGFuY2UgdGhlIEVpZ2VuOjpUcmlwbGV0IHRlbXBsYXRlIGNsYXNzLgorICAqCisgICogSGVyZSBpcyBhIHR5cGljYWwgdXNhZ2UgZXhhbXBsZToKKyAgKiBcY29kZQorICAgIHR5cGVkZWYgVHJpcGxldDxkb3VibGU+IFQ7CisgICAgc3RkOjp2ZWN0b3I8VD4gdHJpcGxldExpc3Q7CisgICAgdHJpcGxldHMucmVzZXJ2ZShlc3RpbWF0aW9uX29mX2VudHJpZXMpOworICAgIGZvciguLi4pCisgICAgeworICAgICAgLy8gLi4uCisgICAgICB0cmlwbGV0TGlzdC5wdXNoX2JhY2soVChpLGosdl9paikpOworICAgIH0KKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0ocm93cyxjb2xzKTsKKyAgICBtLnNldEZyb21UcmlwbGV0cyh0cmlwbGV0TGlzdC5iZWdpbigpLCB0cmlwbGV0TGlzdC5lbmQoKSk7CisgICAgLy8gbSBpcyByZWFkeSB0byBnbyEKKyAgKiBcZW5kY29kZQorICAqCisgICogXHdhcm5pbmcgVGhlIGxpc3Qgb2YgdHJpcGxldHMgaXMgcmVhZCBtdWx0aXBsZSB0aW1lcyAoYXQgbGVhc3QgdHdpY2UpLiBUaGVyZWZvcmUsIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBkZWZpbmUKKyAgKiBhbiBhYnN0cmFjdCBpdGVyYXRvciBvdmVyIGEgY29tcGxleCBkYXRhLXN0cnVjdHVyZSB0aGF0IHdvdWxkIGJlIGV4cGVuc2l2ZSB0byBldmFsdWF0ZS4gVGhlIHRyaXBsZXRzIHNob3VsZCByYXRoZXIKKyAgKiBiZSBleHBsaWNpdGVseSBzdG9yZWQgaW50byBhIHN0ZDo6dmVjdG9yIGZvciBpbnN0YW5jZS4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXg+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9ycz4KK3ZvaWQgU3BhcnNlTWF0cml4PFNjYWxhcixfT3B0aW9ucyxfSW5kZXg+OjpzZXRGcm9tVHJpcGxldHMoY29uc3QgSW5wdXRJdGVyYXRvcnMmIGJlZ2luLCBjb25zdCBJbnB1dEl0ZXJhdG9ycyYgZW5kKQoreworICBpbnRlcm5hbDo6c2V0X2Zyb21fdHJpcGxldHMoYmVnaW4sIGVuZCwgKnRoaXMpOworfQorCisvKiogXGludGVybmFsICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4Pgordm9pZCBTcGFyc2VNYXRyaXg8U2NhbGFyLF9PcHRpb25zLF9JbmRleD46OnN1bXVwRHVwbGljYXRlcygpCit7CisgIGVpZ2VuX2Fzc2VydCghaXNDb21wcmVzc2VkKCkpOworICAvLyBUT0RPLCBpbiBwcmFjdGljZSB3ZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgbV9pbm5lck5vblplcm9zIGZvciB0aGF0IHRhc2sKKyAgVmVjdG9yWGkgd2koaW5uZXJTaXplKCkpOworICB3aS5maWxsKC0xKTsKKyAgSW5kZXggY291bnQgPSAwOworICAvLyBmb3IgZWFjaCBpbm5lci12ZWN0b3IsIHdpW2lubmVyX2luZGV4XSB3aWxsIGhvbGQgdGhlIHBvc2l0aW9uIG9mIGZpcnN0IGVsZW1lbnQgaW50byB0aGUgaW5kZXgvdmFsdWUgYnVmZmVycworICBmb3IoaW50IGo9MDsgajxvdXRlclNpemUoKTsgKytqKQorICB7CisgICAgSW5kZXggc3RhcnQgICA9IGNvdW50OworICAgIEluZGV4IG9sZEVuZCAgPSBtX291dGVySW5kZXhbal0rbV9pbm5lck5vblplcm9zW2pdOworICAgIGZvcihJbmRleCBrPW1fb3V0ZXJJbmRleFtqXTsgazxvbGRFbmQ7ICsraykKKyAgICB7CisgICAgICBJbmRleCBpID0gbV9kYXRhLmluZGV4KGspOworICAgICAgaWYod2koaSk+PXN0YXJ0KQorICAgICAgeworICAgICAgICAvLyB3ZSBhbHJlYWR5IG1lZXQgdGhpcyBlbnRyeSA9PiBhY2N1bXVsYXRlIGl0CisgICAgICAgIG1fZGF0YS52YWx1ZSh3aShpKSkgKz0gbV9kYXRhLnZhbHVlKGspOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtX2RhdGEudmFsdWUoY291bnQpID0gbV9kYXRhLnZhbHVlKGspOworICAgICAgICBtX2RhdGEuaW5kZXgoY291bnQpID0gbV9kYXRhLmluZGV4KGspOworICAgICAgICB3aShpKSA9IGNvdW50OworICAgICAgICArK2NvdW50OworICAgICAgfQorICAgIH0KKyAgICBtX291dGVySW5kZXhbal0gPSBzdGFydDsKKyAgfQorICBtX291dGVySW5kZXhbbV9vdXRlclNpemVdID0gY291bnQ7CisKKyAgLy8gdHVybiB0aGUgbWF0cml4IGludG8gY29tcHJlc3NlZCBmb3JtCisgIGRlbGV0ZVtdIG1faW5uZXJOb25aZXJvczsKKyAgbV9pbm5lck5vblplcm9zID0gMDsKKyAgbV9kYXRhLnJlc2l6ZShtX291dGVySW5kZXhbbV9vdXRlclNpemVdKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VNQVRSSVhfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlTWF0cml4QmFzZS5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlTWF0cml4QmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTI1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VNYXRyaXhCYXNlLmgKQEAgLTAsMCArMSw0NTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRU1BVFJJWEJBU0VfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VNQVRSSVhCQVNFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBTcGFyc2VDb3JlX01vZHVsZQorICAqCisgICogXGNsYXNzIFNwYXJzZU1hdHJpeEJhc2UKKyAgKgorICAqIFxicmllZiBCYXNlIGNsYXNzIG9mIGFueSBzcGFyc2UgbWF0cmljZXMgb3Igc3BhcnNlIGV4cHJlc3Npb25zCisgICoKKyAgKiBcdHBhcmFtIERlcml2ZWQKKyAgKgorICAqIFRoaXMgY2xhc3MgY2FuIGJlIGV4dGVuZGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHBsdWdpbiBtZWNoYW5pc20gZGVzY3JpYmVkIG9uIHRoZSBwYWdlCisgICogXHJlZiBUb3BpY0N1c3RvbWl6aW5nRWlnZW4gYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXGMgRUlHRU5fU1BBUlNFTUFUUklYQkFTRV9QTFVHSU4uCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBTcGFyc2VNYXRyaXhCYXNlIDogcHVibGljIEVpZ2VuQmFzZTxEZXJpdmVkPgoreworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGVfaWZfYXJpdGhtZXRpYzwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIFBhY2tldFJldHVyblR5cGU7CisKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeEJhc2UgU3RvcmFnZUJhc2VUeXBlOworICAgIHR5cGVkZWYgRWlnZW5CYXNlPERlcml2ZWQ+IEJhc2U7CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBFaWdlbkJhc2U8T3RoZXJEZXJpdmVkPiAmb3RoZXIpCisgICAgeworICAgICAgb3RoZXIuZGVyaXZlZCgpLmV2YWxUbyhkZXJpdmVkKCkpOworICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisKKyAgICBlbnVtIHsKKworICAgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJvd3MgYXQgY29tcGlsZS10aW1lLiBUaGlzIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZAorICAgICAgICAgICogYnkgdGhlIFxhIERlcml2ZWQgdHlwZS4gSWYgYSB2YWx1ZSBpcyBub3Qga25vd24gYXQgY29tcGlsZS10aW1lLAorICAgICAgICAgICogaXQgaXMgc2V0IHRvIHRoZSBcYSBEeW5hbWljIGNvbnN0YW50LgorICAgICAgICAgICogXHNhIE1hdHJpeEJhc2U6OnJvd3MoKSwgTWF0cml4QmFzZTo6Y29scygpLCBDb2xzQXRDb21waWxlVGltZSwgU2l6ZUF0Q29tcGlsZVRpbWUgKi8KKworICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgYXQgY29tcGlsZS10aW1lLiBUaGlzIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZAorICAgICAgICAgICogYnkgdGhlIFxhIERlcml2ZWQgdHlwZS4gSWYgYSB2YWx1ZSBpcyBub3Qga25vd24gYXQgY29tcGlsZS10aW1lLAorICAgICAgICAgICogaXQgaXMgc2V0IHRvIHRoZSBcYSBEeW5hbWljIGNvbnN0YW50LgorICAgICAgICAgICogXHNhIE1hdHJpeEJhc2U6OnJvd3MoKSwgTWF0cml4QmFzZTo6Y29scygpLCBSb3dzQXRDb21waWxlVGltZSwgU2l6ZUF0Q29tcGlsZVRpbWUgKi8KKworCisgICAgICBTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZT46OnJldCksCisgICAgICAgIC8qKjwgVGhpcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cywgaS5lLiB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgKiByb3dzIHRpbWVzIHRoZSBudW1iZXIgb2YgY29sdW1ucywgb3IgdG8gXGEgRHluYW1pYyBpZiB0aGlzIGlzIG5vdAorICAgICAgICAgICoga25vd24gYXQgY29tcGlsZS10aW1lLiBcc2EgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lICovCisKKyAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gUm93c0F0Q29tcGlsZVRpbWUsCisgICAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IENvbHNBdENvbXBpbGVUaW1lLAorCisgICAgICBNYXhTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhDb2xzQXRDb21waWxlVGltZT46OnJldCksCisKKyAgICAgIElzVmVjdG9yQXRDb21waWxlVGltZSA9IFJvd3NBdENvbXBpbGVUaW1lID09IDEgfHwgQ29sc0F0Q29tcGlsZVRpbWUgPT0gMSwKKyAgICAgICAgLyoqPCBUaGlzIGlzIHNldCB0byB0cnVlIGlmIGVpdGhlciB0aGUgbnVtYmVyIG9mIHJvd3Mgb3IgdGhlIG51bWJlciBvZgorICAgICAgICAgICogY29sdW1ucyBpcyBrbm93biBhdCBjb21waWxlLXRpbWUgdG8gYmUgZXF1YWwgdG8gMS4gSW5kZWVkLCBpbiB0aGF0IGNhc2UsCisgICAgICAgICAgKiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgY29sdW1uLXZlY3RvciAoaWYgdGhlcmUgaXMgb25seSBvbmUgY29sdW1uKSBvciB3aXRoCisgICAgICAgICAgKiBhIHJvdy12ZWN0b3IgKGlmIHRoZXJlIGlzIG9ubHkgb25lIHJvdykuICovCisKKyAgICAgIEZsYWdzID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MsCisgICAgICAgIC8qKjwgVGhpcyBzdG9yZXMgZXhwcmVzc2lvbiBccmVmIGZsYWdzIGZsYWdzIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGluaGVyaXRlZCBieSBuZXcgZXhwcmVzc2lvbnMKKyAgICAgICAgICAqIGNvbnN0cnVjdGVkIGZyb20gdGhpcyBvbmUuIFNlZSB0aGUgXHJlZiBmbGFncyAibGlzdCBvZiBmbGFncyIuCisgICAgICAgICAgKi8KKworICAgICAgQ29lZmZSZWFkQ29zdCA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvZWZmUmVhZENvc3QsCisgICAgICAgIC8qKjwgVGhpcyBpcyBhIHJvdWdoIG1lYXN1cmUgb2YgaG93IGV4cGVuc2l2ZSBpdCBpcyB0byByZWFkIG9uZSBjb2VmZmljaWVudCBmcm9tCisgICAgICAgICAgKiB0aGlzIGV4cHJlc3Npb24uCisgICAgICAgICAgKi8KKworICAgICAgSXNSb3dNYWpvciA9IEZsYWdzJlJvd01ham9yQml0ID8gMSA6IDAsCisKKyAgICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAgIF9IYXNEaXJlY3RBY2Nlc3MgPSAoaW50KEZsYWdzKSZEaXJlY3RBY2Nlc3NCaXQpID8gMSA6IDAgLy8gd29ya2Fyb3VuZCBzdW5DQworICAgICAgI2VuZGlmCisgICAgfTsKKworICAgIC8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OmFkam9pbnQoKSAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jb25qdWdhdGVfb3A8U2NhbGFyPiwgRWlnZW46OlRyYW5zcG9zZTxjb25zdCBEZXJpdmVkPiA+LAorICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3NlPGNvbnN0IERlcml2ZWQ+CisgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIEFkam9pbnRSZXR1cm5UeXBlOworCisKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIEZsYWdzJlJvd01ham9yQml0ID8gUm93TWFqb3IgOiBDb2xNYWpvcj4gUGxhaW5PYmplY3Q7CisKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBUaGlzIGlzIHRoZSAicmVhbCBzY2FsYXIiIHR5cGU7IGlmIHRoZSBcYSBTY2FsYXIgdHlwZSBpcyBhbHJlYWR5IHJlYWwgbnVtYmVycworICAgICAgKiAoZS5nLiBpbnQsIGZsb2F0IG9yIGRvdWJsZSkgdGhlbiBcYSBSZWFsU2NhbGFyIGlzIGp1c3QgdGhlIHNhbWUgYXMgXGEgU2NhbGFyLiBJZgorICAgICAgKiBcYSBTY2FsYXIgaXMgXGEgc3RkOjpjb21wbGV4PFQ+IHRoZW4gUmVhbFNjYWxhciBpcyBcYSBULgorICAgICAgKgorICAgICAgKiBcc2EgY2xhc3MgTnVtVHJhaXRzCisgICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAgIC8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIGNvZWZmKCkKKyAgICAgICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8X0hhc0RpcmVjdEFjY2VzcywgY29uc3QgU2NhbGFyJiwgU2NhbGFyPjo6dHlwZSBDb2VmZlJldHVyblR5cGU7CisKKyAgICAvKiogXGludGVybmFsIFJlcHJlc2VudHMgYSBtYXRyaXggd2l0aCBhbGwgY29lZmZpY2llbnRzIGVxdWFsIHRvIG9uZSBhbm90aGVyKi8KKyAgICB0eXBlZGVmIEN3aXNlTnVsbGFyeU9wPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8U2NhbGFyPixNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gPiBDb25zdGFudFJldHVyblR5cGU7CisKKyAgICAvKiogdHlwZSBvZiB0aGUgZXF1aXZhbGVudCBzcXVhcmUgbWF0cml4ICovCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEVJR0VOX1NJWkVfTUFYKFJvd3NBdENvbXBpbGVUaW1lLENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fU0laRV9NQVgoUm93c0F0Q29tcGlsZVRpbWUsQ29sc0F0Q29tcGlsZVRpbWUpPiBTcXVhcmVNYXRyaXhUeXBlOworCisgICAgaW5saW5lIGNvbnN0IERlcml2ZWQmIGRlcml2ZWQoKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+KHRoaXMpOyB9CisgICAgaW5saW5lIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgICAgaW5saW5lIERlcml2ZWQmIGNvbnN0X2Nhc3RfZGVyaXZlZCgpIGNvbnN0CisgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWQqPihjb25zdF9jYXN0PFNwYXJzZU1hdHJpeEJhc2UqPih0aGlzKSk7IH0KKyNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworI2RlZmluZSBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUyBFaWdlbjo6U3BhcnNlTWF0cml4QmFzZQorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvQ29tbW9uQ3dpc2VVbmFyeU9wcy5oIgorIyAgIGluY2x1ZGUgIi4uL3BsdWdpbnMvQ29tbW9uQ3dpc2VCaW5hcnlPcHMuaCIKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL01hdHJpeEN3aXNlVW5hcnlPcHMuaCIKKyMgICBpbmNsdWRlICIuLi9wbHVnaW5zL01hdHJpeEN3aXNlQmluYXJ5T3BzLmgiCisjICAgaWZkZWYgRUlHRU5fU1BBUlNFTUFUUklYQkFTRV9QTFVHSU4KKyMgICAgIGluY2x1ZGUgRUlHRU5fU1BBUlNFTUFUUklYQkFTRV9QTFVHSU4KKyMgICBlbmRpZgorIyAgIHVuZGVmIEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTCisjdW5kZWYgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1MKKworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cy4gXHNhIGNvbHMoKSAqLworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLnJvd3MoKTsgfQorICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuIFxzYSByb3dzKCkgKi8KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKS5jb2xzKCk7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMsIHdoaWNoIGlzIFxhIHJvd3MoKSpjb2xzKCkuCisgICAgICAqIFxzYSByb3dzKCksIGNvbHMoKS4gKi8KKyAgICBpbmxpbmUgSW5kZXggc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHJvd3MoKSAqIGNvbHMoKTsgfQorICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIHdoaWNoIGlzIGluIHByYWN0aWNlIHRoZSBudW1iZXIKKyAgICAgICogb2Ygc3RvcmVkIGNvZWZmaWNpZW50cy4gKi8KKyAgICBpbmxpbmUgSW5kZXggbm9uWmVyb3MoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCkubm9uWmVyb3MoKTsgfQorICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIGVpdGhlciB0aGUgbnVtYmVyIG9mIHJvd3Mgb3IgdGhlIG51bWJlciBvZiBjb2x1bW5zIGlzIGVxdWFsIHRvIDEuCisgICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgICAgICogXGNvZGUgcm93cygpPT0xIHx8IGNvbHMoKT09MSBcZW5kY29kZQorICAgICAgKiBcc2Egcm93cygpLCBjb2xzKCksIElzVmVjdG9yQXRDb21waWxlVGltZS4gKi8KKyAgICBpbmxpbmUgYm9vbCBpc1ZlY3RvcigpIGNvbnN0IHsgcmV0dXJuIHJvd3MoKT09MSB8fCBjb2xzKCk9PTE7IH0KKyAgICAvKiogXHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0b3JhZ2UgbWFqb3IgZGltZW5zaW9uLAorICAgICAgKiBpLmUuLCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIGEgY29sdW1ucyBtYWpvciBtYXRyaXgsIGFuZCB0aGUgbnVtYmVyIG9mIHJvd3Mgb3RoZXJ3aXNlICovCisgICAgSW5kZXggb3V0ZXJTaXplKCkgY29uc3QgeyByZXR1cm4gKGludChGbGFncykmUm93TWFqb3JCaXQpID8gdGhpcy0+cm93cygpIDogdGhpcy0+Y29scygpOyB9CisgICAgLyoqIFxyZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBpbm5lciBkaW1lbnNpb24gYWNjb3JkaW5nIHRvIHRoZSBzdG9yYWdlIG9yZGVyLAorICAgICAgKiBpLmUuLCB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIGEgY29sdW1ucyBtYWpvciBtYXRyaXgsIGFuZCB0aGUgbnVtYmVyIG9mIGNvbHMgb3RoZXJ3aXNlICovCisgICAgSW5kZXggaW5uZXJTaXplKCkgY29uc3QgeyByZXR1cm4gKGludChGbGFncykmUm93TWFqb3JCaXQpID8gdGhpcy0+Y29scygpIDogdGhpcy0+cm93cygpOyB9CisKKyAgICBib29sIGlzUlZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9pc1JWYWx1ZTsgfQorICAgIERlcml2ZWQmIG1hcmtBc1JWYWx1ZSgpIHsgbV9pc1JWYWx1ZSA9IHRydWU7IHJldHVybiBkZXJpdmVkKCk7IH0KKworICAgIFNwYXJzZU1hdHJpeEJhc2UoKSA6IG1faXNSVmFsdWUoZmFsc2UpIHsgLyogVE9ETyBjaGVjayBmbGFncyAqLyB9CisKKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3I9KGNvbnN0IFJldHVybkJ5VmFsdWU8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgb3RoZXIuZXZhbFRvKGRlcml2ZWQoKSk7CisgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIGlubGluZSBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gYXNzaWduKG90aGVyLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgaW5saW5lIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBEZXJpdmVkJiBvdGhlcikKKyAgICB7CisvLyAgICAgICBpZiAob3RoZXIuaXNSVmFsdWUoKSkKKy8vICAgICAgICAgZGVyaXZlZCgpLnN3YXAob3RoZXIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworLy8gICAgICAgZWxzZQorICAgICAgcmV0dXJuIGFzc2lnbihvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIERlcml2ZWQmIGFzc2lnbihjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorICAgIHsKKyAgICAgIGNvbnN0IGJvb2wgdHJhbnNwb3NlID0gKEZsYWdzICYgUm93TWFqb3JCaXQpICE9IChPdGhlckRlcml2ZWQ6OkZsYWdzICYgUm93TWFqb3JCaXQpOworICAgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0gKGludChPdGhlckRlcml2ZWQ6OkZsYWdzKSAmIFJvd01ham9yQml0KSA/IG90aGVyLnJvd3MoKSA6IG90aGVyLmNvbHMoKTsKKyAgICAgIGlmICgoIXRyYW5zcG9zZSkgJiYgb3RoZXIuaXNSVmFsdWUoKSkKKyAgICAgIHsKKyAgICAgICAgLy8gZXZhbCB3aXRob3V0IHRlbXBvcmFyeQorICAgICAgICBkZXJpdmVkKCkucmVzaXplKG90aGVyLnJvd3MoKSwgb3RoZXIuY29scygpKTsKKyAgICAgICAgZGVyaXZlZCgpLnNldFplcm8oKTsKKyAgICAgICAgZGVyaXZlZCgpLnJlc2VydmUoKHN0ZDo6bWF4KSh0aGlzLT5yb3dzKCksdGhpcy0+Y29scygpKSoyKTsKKyAgICAgICAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJTaXplOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBkZXJpdmVkKCkuc3RhcnRWZWMoaik7CisgICAgICAgICAgZm9yICh0eXBlbmFtZSBPdGhlckRlcml2ZWQ6OklubmVySXRlcmF0b3IgaXQob3RoZXIsIGopOyBpdDsgKytpdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBTY2FsYXIgdiA9IGl0LnZhbHVlKCk7CisgICAgICAgICAgICBkZXJpdmVkKCkuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihqLGl0LmluZGV4KCkpID0gdjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVyaXZlZCgpLmZpbmFsaXplKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGFzc2lnbkdlbmVyaWMob3RoZXIpOworICAgICAgfQorICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIHZvaWQgYXNzaWduR2VuZXJpYyhjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKQorICAgIHsKKyAgICAgIC8vY29uc3QgYm9vbCB0cmFuc3Bvc2UgPSAoRmxhZ3MgJiBSb3dNYWpvckJpdCkgIT0gKE90aGVyRGVyaXZlZDo6RmxhZ3MgJiBSb3dNYWpvckJpdCk7CisgICAgICBlaWdlbl9hc3NlcnQoKCAoKGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN1cHBvcnRlZEFjY2Vzc1BhdHRlcm5zJk91dGVyUmFuZG9tQWNjZXNzUGF0dGVybik9PU91dGVyUmFuZG9tQWNjZXNzUGF0dGVybikgfHwKKyAgICAgICAgICAgICAgICAgICghKChGbGFncyAmIFJvd01ham9yQml0KSAhPSAoT3RoZXJEZXJpdmVkOjpGbGFncyAmIFJvd01ham9yQml0KSkpKSAmJgorICAgICAgICAgICAgICAgICAgInRoZSB0cmFuc3Bvc2Ugb3BlcmF0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIGhhbmRsZWQgaW4gU3BhcnNlTWF0cml4OjpvcGVyYXRvcj0iKTsKKworICAgICAgZW51bSB7IEZsaXAgPSAoRmxhZ3MgJiBSb3dNYWpvckJpdCkgIT0gKE90aGVyRGVyaXZlZDo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgfTsKKworICAgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0gb3RoZXIub3V0ZXJTaXplKCk7CisgICAgICAvL3R5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPHRyYW5zcG9zZSwgTGlua2VkVmVjdG9yTWF0cml4PFNjYWxhcixGbGFncyZSb3dNYWpvckJpdD4sIERlcml2ZWQ+Ojp0eXBlIFRlbXBUeXBlOworICAgICAgLy8gdGhhbmtzIHRvIHNoYWxsb3cgY29waWVzLCB3ZSBhbHdheXMgZXZhbCB0byBhIHRlbXBhcnkKKyAgICAgIERlcml2ZWQgdGVtcChvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisKKyAgICAgIHRlbXAucmVzZXJ2ZSgoc3RkOjptYXgpKHRoaXMtPnJvd3MoKSx0aGlzLT5jb2xzKCkpKjIpOworICAgICAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJTaXplOyArK2opCisgICAgICB7CisgICAgICAgIHRlbXAuc3RhcnRWZWMoaik7CisgICAgICAgIGZvciAodHlwZW5hbWUgT3RoZXJEZXJpdmVkOjpJbm5lckl0ZXJhdG9yIGl0KG90aGVyLmRlcml2ZWQoKSwgaik7IGl0OyArK2l0KQorICAgICAgICB7CisgICAgICAgICAgU2NhbGFyIHYgPSBpdC52YWx1ZSgpOworICAgICAgICAgIHRlbXAuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihGbGlwP2l0LmluZGV4KCk6aixGbGlwP2o6aXQuaW5kZXgoKSkgPSB2OworICAgICAgICB9CisgICAgICB9CisgICAgICB0ZW1wLmZpbmFsaXplKCk7CisKKyAgICAgIGRlcml2ZWQoKSA9IHRlbXAubWFya0FzUlZhbHVlKCk7CisgICAgfQorCisgIHB1YmxpYzoKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBEZXJpdmVkJiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlU3BhcnNlUHJvZHVjdDxMaHMsUmhzPiYgcHJvZHVjdCk7CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IFNwYXJzZU1hdHJpeEJhc2UmIG0pCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpOZXN0ZWQgTmVzdGVkOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxOZXN0ZWQ+Ojp0eXBlIE5lc3RlZENsZWFuZWQ7CisKKyAgICAgIGlmIChGbGFncyZSb3dNYWpvckJpdCkKKyAgICAgIHsKKyAgICAgICAgY29uc3QgTmVzdGVkIG5tKG0uZGVyaXZlZCgpKTsKKyAgICAgICAgZm9yIChJbmRleCByb3c9MDsgcm93PG5tLm91dGVyU2l6ZSgpOyArK3JvdykKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGNvbCA9IDA7CisgICAgICAgICAgZm9yICh0eXBlbmFtZSBOZXN0ZWRDbGVhbmVkOjpJbm5lckl0ZXJhdG9yIGl0KG5tLmRlcml2ZWQoKSwgcm93KTsgaXQ7ICsraXQpCisgICAgICAgICAgeworICAgICAgICAgICAgZm9yICggOyBjb2w8aXQuaW5kZXgoKTsgKytjb2wpCisgICAgICAgICAgICAgIHMgPDwgIjAgIjsKKyAgICAgICAgICAgIHMgPDwgaXQudmFsdWUoKSA8PCAiICI7CisgICAgICAgICAgICArK2NvbDsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yICggOyBjb2w8bS5jb2xzKCk7ICsrY29sKQorICAgICAgICAgICAgcyA8PCAiMCAiOworICAgICAgICAgIHMgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGNvbnN0IE5lc3RlZCBubShtLmRlcml2ZWQoKSk7CisgICAgICAgIGlmIChtLmNvbHMoKSA9PSAxKSB7CisgICAgICAgICAgSW5kZXggcm93ID0gMDsKKyAgICAgICAgICBmb3IgKHR5cGVuYW1lIE5lc3RlZENsZWFuZWQ6OklubmVySXRlcmF0b3IgaXQobm0uZGVyaXZlZCgpLCAwKTsgaXQ7ICsraXQpCisgICAgICAgICAgeworICAgICAgICAgICAgZm9yICggOyByb3c8aXQuaW5kZXgoKTsgKytyb3cpCisgICAgICAgICAgICAgIHMgPDwgIjAiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHMgPDwgaXQudmFsdWUoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICArK3JvdzsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yICggOyByb3c8bS5yb3dzKCk7ICsrcm93KQorICAgICAgICAgICAgcyA8PCAiMCIgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFNwYXJzZU1hdHJpeDxTY2FsYXIsIFJvd01ham9yQml0PiB0cmFucyA9IG07CisgICAgICAgICAgcyA8PCBzdGF0aWNfY2FzdDxjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZU1hdHJpeDxTY2FsYXIsIFJvd01ham9yQml0PiA+Jj4odHJhbnMpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3IrPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3ItPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgIERlcml2ZWQmIG9wZXJhdG9yKj0oY29uc3QgU2NhbGFyJiBvdGhlcik7CisgICAgRGVyaXZlZCYgb3BlcmF0b3IvPShjb25zdCBTY2FsYXImIG90aGVyKTsKKworICAgICNkZWZpbmUgRUlHRU5fU1BBUlNFX0NXSVNFX1BST0RVQ1RfUkVUVVJOX1RZUEUgXAorICAgICAgQ3dpc2VCaW5hcnlPcDwgXAorICAgICAgICBpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3Rfb3A8IFwKKyAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6c2NhbGFyX3Byb2R1Y3RfdHJhaXRzPCBcCisgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsIFwKKyAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8T3RoZXJEZXJpdmVkPjo6U2NhbGFyIFwKKyAgICAgICAgICA+OjpSZXR1cm5UeXBlIFwKKyAgICAgICAgPiwgXAorICAgICAgICBEZXJpdmVkLCBcCisgICAgICAgIE90aGVyRGVyaXZlZCBcCisgICAgICA+CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBFSUdFTl9TUEFSU0VfQ1dJU0VfUFJPRFVDVF9SRVRVUk5fVFlQRQorICAgIGN3aXNlUHJvZHVjdChjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdDsKKworICAgIC8vIHNwYXJzZSAqIHNwYXJzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCB0eXBlbmFtZSBTcGFyc2VTcGFyc2VQcm9kdWN0UmV0dXJuVHlwZTxEZXJpdmVkLE90aGVyRGVyaXZlZD46OlR5cGUKKyAgICBvcGVyYXRvciooY29uc3QgU3BhcnNlTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisKKyAgICAvLyBzcGFyc2UgKiBkaWFnb25hbAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCBTcGFyc2VEaWFnb25hbFByb2R1Y3Q8RGVyaXZlZCxPdGhlckRlcml2ZWQ+CisgICAgb3BlcmF0b3IqKGNvbnN0IERpYWdvbmFsQmFzZTxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3Q7CisKKyAgICAvLyBkaWFnb25hbCAqIHNwYXJzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gZnJpZW5kCisgICAgY29uc3QgU3BhcnNlRGlhZ29uYWxQcm9kdWN0PE90aGVyRGVyaXZlZCxEZXJpdmVkPgorICAgIG9wZXJhdG9yKihjb25zdCBEaWFnb25hbEJhc2U8T3RoZXJEZXJpdmVkPiAmbGhzLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlJiByaHMpCisgICAgeyByZXR1cm4gU3BhcnNlRGlhZ29uYWxQcm9kdWN0PE90aGVyRGVyaXZlZCxEZXJpdmVkPihsaHMuZGVyaXZlZCgpLCByaHMuZGVyaXZlZCgpKTsgfQorCisgICAgLyoqIGRlbnNlICogc3BhcnNlIChyZXR1cm4gYSBkZW5zZSBvYmplY3QgdW5sZXNzIGl0IGlzIGFuIG91dGVyIHByb2R1Y3QpICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBmcmllbmQKKyAgICBjb25zdCB0eXBlbmFtZSBEZW5zZVNwYXJzZVByb2R1Y3RSZXR1cm5UeXBlPE90aGVyRGVyaXZlZCxEZXJpdmVkPjo6VHlwZQorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIGxocywgY29uc3QgRGVyaXZlZCYgcmhzKQorICAgIHsgcmV0dXJuIHR5cGVuYW1lIERlbnNlU3BhcnNlUHJvZHVjdFJldHVyblR5cGU8T3RoZXJEZXJpdmVkLERlcml2ZWQ+OjpUeXBlKGxocy5kZXJpdmVkKCkscmhzKTsgfQorCisgICAgLyoqIHNwYXJzZSAqIGRlbnNlIChyZXR1cm5zIGEgZGVuc2Ugb2JqZWN0IHVubGVzcyBpdCBpcyBhbiBvdXRlciBwcm9kdWN0KSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCB0eXBlbmFtZSBTcGFyc2VEZW5zZVByb2R1Y3RSZXR1cm5UeXBlPERlcml2ZWQsT3RoZXJEZXJpdmVkPjo6VHlwZQorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdDsKKyAgICAKKyAgICAgLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgUCBIIFBeLTEgd2hlcmUgSCBpcyB0aGUgbWF0cml4IHJlcHJlc2VudGVkIGJ5IFxjICp0aGlzICovCisgICAgU3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0PERlcml2ZWQsVXBwZXJ8TG93ZXI+IHR3aXN0ZWRCeShjb25zdCBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsSW5kZXg+JiBwZXJtKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBTcGFyc2VTeW1tZXRyaWNQZXJtdXRhdGlvblByb2R1Y3Q8RGVyaXZlZCxVcHBlcnxMb3dlcj4oZGVyaXZlZCgpLCBwZXJtKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgRGVyaXZlZCYgb3BlcmF0b3IqPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKKworICAgICNpZmRlZiBFSUdFTjJfU1VQUE9SVAorICAgIC8vIGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6OnBsYWluX21hdHJpeF90eXBlX2NvbHVtbl9tYWpvcjxPdGhlckRlcml2ZWQ+Ojp0eXBlCisgICAgc29sdmVUcmlhbmd1bGFyKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgICAgLy8gZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICB2b2lkIHNvbHZlVHJpYW5ndWxhckluUGxhY2UoTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3Q7CisgICAgI2VuZGlmIC8vIEVJR0VOMl9TVVBQT1JUCisKKyAgICB0ZW1wbGF0ZTxpbnQgTW9kZT4KKyAgICBpbmxpbmUgY29uc3QgU3BhcnNlVHJpYW5ndWxhclZpZXc8RGVyaXZlZCwgTW9kZT4gdHJpYW5ndWxhclZpZXcoKSBjb25zdDsKKworICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBVcExvPiBpbmxpbmUgY29uc3QgU3BhcnNlU2VsZkFkam9pbnRWaWV3PERlcml2ZWQsIFVwTG8+IHNlbGZhZGpvaW50VmlldygpIGNvbnN0OworICAgIHRlbXBsYXRlPHVuc2lnbmVkIGludCBVcExvPiBpbmxpbmUgU3BhcnNlU2VsZkFkam9pbnRWaWV3PERlcml2ZWQsIFVwTG8+IHNlbGZhZGpvaW50VmlldygpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBTY2FsYXIgZG90KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4gU2NhbGFyIGRvdChjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKyAgICBSZWFsU2NhbGFyIHNxdWFyZWROb3JtKCkgY29uc3Q7CisgICAgUmVhbFNjYWxhciBub3JtKCkgIGNvbnN0OworCisgICAgVHJhbnNwb3NlPERlcml2ZWQ+IHRyYW5zcG9zZSgpIHsgcmV0dXJuIGRlcml2ZWQoKTsgfQorICAgIGNvbnN0IFRyYW5zcG9zZTxjb25zdCBEZXJpdmVkPiB0cmFuc3Bvc2UoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCk7IH0KKyAgICBjb25zdCBBZGpvaW50UmV0dXJuVHlwZSBhZGpvaW50KCkgY29uc3QgeyByZXR1cm4gdHJhbnNwb3NlKCk7IH0KKworICAgIC8vIHN1Yi12ZWN0b3IKKyAgICBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLDE+IHJvdyhJbmRleCBpKTsKKyAgICBjb25zdCBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLDE+IHJvdyhJbmRleCBpKSBjb25zdDsKKyAgICBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLDE+IGNvbChJbmRleCBqKTsKKyAgICBjb25zdCBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLDE+IGNvbChJbmRleCBqKSBjb25zdDsKKyAgICBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLDE+IGlubmVyVmVjdG9yKEluZGV4IG91dGVyKTsKKyAgICBjb25zdCBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLDE+IGlubmVyVmVjdG9yKEluZGV4IG91dGVyKSBjb25zdDsKKworICAgIC8vIHNldCBvZiBzdWItdmVjdG9ycworICAgIFNwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsRHluYW1pYz4gc3Vicm93cyhJbmRleCBzdGFydCwgSW5kZXggc2l6ZSk7CisgICAgY29uc3QgU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCxEeW5hbWljPiBzdWJyb3dzKEluZGV4IHN0YXJ0LCBJbmRleCBzaXplKSBjb25zdDsKKyAgICBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLER5bmFtaWM+IHN1YmNvbHMoSW5kZXggc3RhcnQsIEluZGV4IHNpemUpOworICAgIGNvbnN0IFNwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsRHluYW1pYz4gc3ViY29scyhJbmRleCBzdGFydCwgSW5kZXggc2l6ZSkgY29uc3Q7CisgICAgCisgICAgU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCxEeW5hbWljPiBtaWRkbGVSb3dzKEluZGV4IHN0YXJ0LCBJbmRleCBzaXplKTsKKyAgICBjb25zdCBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLER5bmFtaWM+IG1pZGRsZVJvd3MoSW5kZXggc3RhcnQsIEluZGV4IHNpemUpIGNvbnN0OworICAgIFNwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsRHluYW1pYz4gbWlkZGxlQ29scyhJbmRleCBzdGFydCwgSW5kZXggc2l6ZSk7CisgICAgY29uc3QgU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RGVyaXZlZCxEeW5hbWljPiBtaWRkbGVDb2xzKEluZGV4IHN0YXJ0LCBJbmRleCBzaXplKSBjb25zdDsKKyAgICBTcGFyc2VJbm5lclZlY3RvclNldDxEZXJpdmVkLER5bmFtaWM+IGlubmVyVmVjdG9ycyhJbmRleCBvdXRlclN0YXJ0LCBJbmRleCBvdXRlclNpemUpOworICAgIGNvbnN0IFNwYXJzZUlubmVyVmVjdG9yU2V0PERlcml2ZWQsRHluYW1pYz4gaW5uZXJWZWN0b3JzKEluZGV4IG91dGVyU3RhcnQsIEluZGV4IG91dGVyU2l6ZSkgY29uc3Q7CisKKyAgICAgIC8qKiBcaW50ZXJuYWwgdXNlIG9wZXJhdG9yPSAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VEZXJpdmVkPgorICAgICAgdm9pZCBldmFsVG8oTWF0cml4QmFzZTxEZW5zZURlcml2ZWQ+JiBkc3QpIGNvbnN0CisgICAgICB7CisgICAgICAgIGRzdC5zZXRaZXJvKCk7CisgICAgICAgIGZvciAoSW5kZXggaj0wOyBqPG91dGVyU2l6ZSgpOyArK2opCisgICAgICAgICAgZm9yICh0eXBlbmFtZSBEZXJpdmVkOjpJbm5lckl0ZXJhdG9yIGkoZGVyaXZlZCgpLGopOyBpOyArK2kpCisgICAgICAgICAgICBkc3QuY29lZmZSZWYoaS5yb3coKSxpLmNvbCgpKSA9IGkudmFsdWUoKTsKKyAgICAgIH0KKworICAgICAgTWF0cml4PFNjYWxhcixSb3dzQXRDb21waWxlVGltZSxDb2xzQXRDb21waWxlVGltZT4gdG9EZW5zZSgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiBkZXJpdmVkKCk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgYm9vbCBpc0FwcHJveChjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyLAorICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciBwcmVjID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKSBjb25zdAorICAgIHsgcmV0dXJuIHRvRGVuc2UoKS5pc0FwcHJveChvdGhlci50b0RlbnNlKCkscHJlYyk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBib29sIGlzQXBwcm94KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIsCisgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyIHByZWMgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgICAgeyByZXR1cm4gdG9EZW5zZSgpLmlzQXBwcm94KG90aGVyLHByZWMpOyB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG1hdHJpeCBvciB2ZWN0b3Igb2J0YWluZWQgYnkgZXZhbHVhdGluZyB0aGlzIGV4cHJlc3Npb24uCisgICAgICAqCisgICAgICAqIE5vdGljZSB0aGF0IGluIHRoZSBjYXNlIG9mIGEgcGxhaW4gbWF0cml4IG9yIHZlY3RvciAobm90IGFuIGV4cHJlc3Npb24pIHRoaXMgZnVuY3Rpb24ganVzdCByZXR1cm5zCisgICAgICAqIGEgY29uc3QgcmVmZXJlbmNlLCBpbiBvcmRlciB0byBhdm9pZCBhIHVzZWxlc3MgY29weS4KKyAgICAgICovCisgICAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpldmFsPERlcml2ZWQ+Ojp0eXBlIGV2YWwoKSBjb25zdAorICAgIHsgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpldmFsPERlcml2ZWQ+Ojp0eXBlKGRlcml2ZWQoKSk7IH0KKworICAgIFNjYWxhciBzdW0oKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisKKyAgICBib29sIG1faXNSVmFsdWU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRU1BVFJJWEJBU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlUGVybXV0YXRpb24uaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVBlcm11dGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5N2I3NQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVBlcm11dGF0aW9uLmgKQEAgLTAsMCArMSwxNDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEyIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfUEVSTVVUQVRJT05fSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfUEVSTVVUQVRJT05fSAorCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBzcGFyc2UgKiBwZXJtdXRhdGlvbiBwcm9kdWN0cworCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgUGVybXV0YXRpb25UeXBlLCB0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgU2lkZSwgYm9vbCBUcmFuc3Bvc2VkPgorc3RydWN0IHRyYWl0czxwZXJtdXRfc3BhcnNlbWF0cml4X3Byb2R1Y3RfcmV0dmFsPFBlcm11dGF0aW9uVHlwZSwgTWF0cml4VHlwZSwgU2lkZSwgVHJhbnNwb3NlZD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8dHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkPjo6dHlwZSBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDo6SW5kZXggSW5kZXg7CisgIGVudW0geworICAgIFNyY1N0b3JhZ2VPcmRlciA9IE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOjpGbGFncyZSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgTW92ZU91dGVyID0gU3JjU3RvcmFnZU9yZGVyPT1Sb3dNYWpvciA/IFNpZGU9PU9uVGhlTGVmdCA6IFNpZGU9PU9uVGhlUmlnaHQKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxNb3ZlT3V0ZXIsCisgICAgICAgIFNwYXJzZU1hdHJpeDxTY2FsYXIsU3JjU3RvcmFnZU9yZGVyLEluZGV4PiwKKyAgICAgICAgU3BhcnNlTWF0cml4PFNjYWxhcixpbnQoU3JjU3RvcmFnZU9yZGVyKT09Um93TWFqb3I/Q29sTWFqb3I6Um93TWFqb3IsSW5kZXg+ID46OnR5cGUgUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBlcm11dGF0aW9uVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFNpZGUsIGJvb2wgVHJhbnNwb3NlZD4KK3N0cnVjdCBwZXJtdXRfc3BhcnNlbWF0cml4X3Byb2R1Y3RfcmV0dmFsCisgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxwZXJtdXRfc3BhcnNlbWF0cml4X3Byb2R1Y3RfcmV0dmFsPFBlcm11dGF0aW9uVHlwZSwgTWF0cml4VHlwZSwgU2lkZSwgVHJhbnNwb3NlZD4gPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQ6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDo6SW5kZXggSW5kZXg7CisKKyAgICBlbnVtIHsKKyAgICAgIFNyY1N0b3JhZ2VPcmRlciA9IE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOjpGbGFncyZSb3dNYWpvckJpdCA/IFJvd01ham9yIDogQ29sTWFqb3IsCisgICAgICBNb3ZlT3V0ZXIgPSBTcmNTdG9yYWdlT3JkZXI9PVJvd01ham9yID8gU2lkZT09T25UaGVMZWZ0IDogU2lkZT09T25UaGVSaWdodAorICAgIH07CisKKyAgICBwZXJtdXRfc3BhcnNlbWF0cml4X3Byb2R1Y3RfcmV0dmFsKGNvbnN0IFBlcm11dGF0aW9uVHlwZSYgcGVybSwgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgICAgOiBtX3Blcm11dGF0aW9uKHBlcm0pLCBtX21hdHJpeChtYXRyaXgpCisgICAge30KKworICAgIGlubGluZSBpbnQgcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorICAgIGlubGluZSBpbnQgY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gaW5saW5lIHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgICB7CisgICAgICBpZihNb3ZlT3V0ZXIpCisgICAgICB7CisgICAgICAgIFNwYXJzZU1hdHJpeDxTY2FsYXIsU3JjU3RvcmFnZU9yZGVyLEluZGV4PiB0bXAobV9tYXRyaXgucm93cygpLCBtX21hdHJpeC5jb2xzKCkpOworICAgICAgICBWZWN0b3JYaSBzaXplcyhtX21hdHJpeC5vdXRlclNpemUoKSk7CisgICAgICAgIGZvcihJbmRleCBqPTA7IGo8bV9tYXRyaXgub3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIEluZGV4IGpwID0gbV9wZXJtdXRhdGlvbi5pbmRpY2VzKCkuY29lZmYoaik7CisgICAgICAgICAgc2l6ZXNbKChTaWRlPT1PblRoZUxlZnQpIF4gVHJhbnNwb3NlZCkgPyBqcCA6IGpdID0gbV9tYXRyaXguaW5uZXJWZWN0b3IoKChTaWRlPT1PblRoZVJpZ2h0KSBeIFRyYW5zcG9zZWQpID8ganAgOiBqKS5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgdG1wLnJlc2VydmUoc2l6ZXMpOworICAgICAgICBmb3IoSW5kZXggaj0wOyBqPG1fbWF0cml4Lm91dGVyU2l6ZSgpOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCBqcCA9IG1fcGVybXV0YXRpb24uaW5kaWNlcygpLmNvZWZmKGopOworICAgICAgICAgIEluZGV4IGpzcmMgPSAoKFNpZGU9PU9uVGhlUmlnaHQpIF4gVHJhbnNwb3NlZCkgPyBqcCA6IGo7CisgICAgICAgICAgSW5kZXggamRzdCA9ICgoU2lkZT09T25UaGVMZWZ0KSBeIFRyYW5zcG9zZWQpID8ganAgOiBqOworICAgICAgICAgIGZvcih0eXBlbmFtZSBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDo6SW5uZXJJdGVyYXRvciBpdChtX21hdHJpeCxqc3JjKTsgaXQ7ICsraXQpCisgICAgICAgICAgICB0bXAuaW5zZXJ0QnlPdXRlcklubmVyKGpkc3QsaXQuaW5kZXgoKSkgPSBpdC52YWx1ZSgpOworICAgICAgICB9CisgICAgICAgIGRzdCA9IHRtcDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgU3BhcnNlTWF0cml4PFNjYWxhcixpbnQoU3JjU3RvcmFnZU9yZGVyKT09Um93TWFqb3I/Q29sTWFqb3I6Um93TWFqb3IsSW5kZXg+IHRtcChtX21hdHJpeC5yb3dzKCksIG1fbWF0cml4LmNvbHMoKSk7CisgICAgICAgIFZlY3RvclhpIHNpemVzKHRtcC5vdXRlclNpemUoKSk7CisgICAgICAgIHNpemVzLnNldFplcm8oKTsKKyAgICAgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljLEluZGV4PiBwZXJtOworICAgICAgICBpZigoU2lkZT09T25UaGVMZWZ0KSBeIFRyYW5zcG9zZWQpCisgICAgICAgICAgcGVybSA9IG1fcGVybXV0YXRpb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwZXJtID0gbV9wZXJtdXRhdGlvbi50cmFuc3Bvc2UoKTsKKworICAgICAgICBmb3IoSW5kZXggaj0wOyBqPG1fbWF0cml4Lm91dGVyU2l6ZSgpOyArK2opCisgICAgICAgICAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOjpJbm5lckl0ZXJhdG9yIGl0KG1fbWF0cml4LGopOyBpdDsgKytpdCkKKyAgICAgICAgICAgIHNpemVzW3Blcm0uaW5kaWNlcygpLmNvZWZmKGl0LmluZGV4KCkpXSsrOworICAgICAgICB0bXAucmVzZXJ2ZShzaXplcyk7CisgICAgICAgIGZvcihJbmRleCBqPTA7IGo8bV9tYXRyaXgub3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgICBmb3IodHlwZW5hbWUgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQ6OklubmVySXRlcmF0b3IgaXQobV9tYXRyaXgsaik7IGl0OyArK2l0KQorICAgICAgICAgICAgdG1wLmluc2VydEJ5T3V0ZXJJbm5lcihwZXJtLmluZGljZXMoKS5jb2VmZihpdC5pbmRleCgpKSxqKSA9IGl0LnZhbHVlKCk7CisgICAgICAgIGRzdCA9IHRtcDsKKyAgICAgIH0KKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFBlcm11dGF0aW9uVHlwZSYgbV9wZXJtdXRhdGlvbjsKKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9tYXRyaXg7Cit9OworCit9CisKKworCisvKiogXHJldHVybnMgdGhlIG1hdHJpeCB3aXRoIHRoZSBwZXJtdXRhdGlvbiBhcHBsaWVkIHRvIHRoZSBjb2x1bW5zCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VEZXJpdmVkLCB0eXBlbmFtZSBQZXJtRGVyaXZlZD4KK2lubGluZSBjb25zdCBpbnRlcm5hbDo6cGVybXV0X3NwYXJzZW1hdHJpeF9wcm9kdWN0X3JldHZhbDxQZXJtdXRhdGlvbkJhc2U8UGVybURlcml2ZWQ+LCBTcGFyc2VEZXJpdmVkLCBPblRoZVJpZ2h0LCBmYWxzZT4KK29wZXJhdG9yKihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZURlcml2ZWQ+JiBtYXRyaXgsIGNvbnN0IFBlcm11dGF0aW9uQmFzZTxQZXJtRGVyaXZlZD4mIHBlcm0pCit7CisgIHJldHVybiBpbnRlcm5hbDo6cGVybXV0X3NwYXJzZW1hdHJpeF9wcm9kdWN0X3JldHZhbDxQZXJtdXRhdGlvbkJhc2U8UGVybURlcml2ZWQ+LCBTcGFyc2VEZXJpdmVkLCBPblRoZVJpZ2h0LCBmYWxzZT4ocGVybSwgbWF0cml4LmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHdpdGggdGhlIHBlcm11dGF0aW9uIGFwcGxpZWQgdG8gdGhlIHJvd3MKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZURlcml2ZWQsIHR5cGVuYW1lIFBlcm1EZXJpdmVkPgoraW5saW5lIGNvbnN0IGludGVybmFsOjpwZXJtdXRfc3BhcnNlbWF0cml4X3Byb2R1Y3RfcmV0dmFsPFBlcm11dGF0aW9uQmFzZTxQZXJtRGVyaXZlZD4sIFNwYXJzZURlcml2ZWQsIE9uVGhlTGVmdCwgZmFsc2U+CitvcGVyYXRvciooIGNvbnN0IFBlcm11dGF0aW9uQmFzZTxQZXJtRGVyaXZlZD4mIHBlcm0sIGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlRGVyaXZlZD4mIG1hdHJpeCkKK3sKKyAgcmV0dXJuIGludGVybmFsOjpwZXJtdXRfc3BhcnNlbWF0cml4X3Byb2R1Y3RfcmV0dmFsPFBlcm11dGF0aW9uQmFzZTxQZXJtRGVyaXZlZD4sIFNwYXJzZURlcml2ZWQsIE9uVGhlTGVmdCwgZmFsc2U+KHBlcm0sIG1hdHJpeC5kZXJpdmVkKCkpOworfQorCisKKworLyoqIFxyZXR1cm5zIHRoZSBtYXRyaXggd2l0aCB0aGUgaW52ZXJzZSBwZXJtdXRhdGlvbiBhcHBsaWVkIHRvIHRoZSBjb2x1bW5zLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlRGVyaXZlZCwgdHlwZW5hbWUgUGVybURlcml2ZWQ+CitpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnBlcm11dF9zcGFyc2VtYXRyaXhfcHJvZHVjdF9yZXR2YWw8UGVybXV0YXRpb25CYXNlPFBlcm1EZXJpdmVkPiwgU3BhcnNlRGVyaXZlZCwgT25UaGVSaWdodCwgdHJ1ZT4KK29wZXJhdG9yKihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZURlcml2ZWQ+JiBtYXRyaXgsIGNvbnN0IFRyYW5zcG9zZTxQZXJtdXRhdGlvbkJhc2U8UGVybURlcml2ZWQ+ID4mIHRwZXJtKQoreworICByZXR1cm4gaW50ZXJuYWw6OnBlcm11dF9zcGFyc2VtYXRyaXhfcHJvZHVjdF9yZXR2YWw8UGVybXV0YXRpb25CYXNlPFBlcm1EZXJpdmVkPiwgU3BhcnNlRGVyaXZlZCwgT25UaGVSaWdodCwgdHJ1ZT4odHBlcm0ubmVzdGVkUGVybXV0YXRpb24oKSwgbWF0cml4LmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyB0aGUgbWF0cml4IHdpdGggdGhlIGludmVyc2UgcGVybXV0YXRpb24gYXBwbGllZCB0byB0aGUgcm93cy4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZURlcml2ZWQsIHR5cGVuYW1lIFBlcm1EZXJpdmVkPgoraW5saW5lIGNvbnN0IGludGVybmFsOjpwZXJtdXRfc3BhcnNlbWF0cml4X3Byb2R1Y3RfcmV0dmFsPFBlcm11dGF0aW9uQmFzZTxQZXJtRGVyaXZlZD4sIFNwYXJzZURlcml2ZWQsIE9uVGhlTGVmdCwgdHJ1ZT4KK29wZXJhdG9yKihjb25zdCBUcmFuc3Bvc2U8UGVybXV0YXRpb25CYXNlPFBlcm1EZXJpdmVkPiA+JiB0cGVybSwgY29uc3QgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VEZXJpdmVkPiYgbWF0cml4KQoreworICByZXR1cm4gaW50ZXJuYWw6OnBlcm11dF9zcGFyc2VtYXRyaXhfcHJvZHVjdF9yZXR2YWw8UGVybXV0YXRpb25CYXNlPFBlcm1EZXJpdmVkPiwgU3BhcnNlRGVyaXZlZCwgT25UaGVMZWZ0LCB0cnVlPih0cGVybS5uZXN0ZWRQZXJtdXRhdGlvbigpLCBtYXRyaXguZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfU0VMRkFESk9JTlRWSUVXX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVByb2R1Y3QuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVByb2R1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTU1NWI4Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlUHJvZHVjdC5oCkBAIC0wLDAgKzEsMTg2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VQUk9EVUNUX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFUFJPRFVDVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBTcGFyc2VTcGFyc2VQcm9kdWN0UmV0dXJuVHlwZQoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TGhzPjo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7CisgICAgTGhzUm93TWFqb3IgPSBpbnRlcm5hbDo6dHJhaXRzPExocz46OkZsYWdzICYgUm93TWFqb3JCaXQsCisgICAgUmhzUm93TWFqb3IgPSBpbnRlcm5hbDo6dHJhaXRzPFJocz46OkZsYWdzICYgUm93TWFqb3JCaXQsCisgICAgVHJhbnNwb3NlUmhzID0gKCFMaHNSb3dNYWpvcikgJiYgUmhzUm93TWFqb3IsCisgICAgVHJhbnNwb3NlTGhzID0gTGhzUm93TWFqb3IgJiYgKCFSaHNSb3dNYWpvcikKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxUcmFuc3Bvc2VMaHMsCisgICAgU3BhcnNlTWF0cml4PFNjYWxhciwwPiwKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPExocyxSaHM6OlJvd3NBdENvbXBpbGVUaW1lPjo6dHlwZT46OnR5cGUgTGhzTmVzdGVkOworCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPFRyYW5zcG9zZVJocywKKyAgICBTcGFyc2VNYXRyaXg8U2NhbGFyLDA+LAorICAgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8UmhzLExoczo6Um93c0F0Q29tcGlsZVRpbWU+Ojp0eXBlPjo6dHlwZSBSaHNOZXN0ZWQ7CisKKyAgdHlwZWRlZiBTcGFyc2VTcGFyc2VQcm9kdWN0PExoc05lc3RlZCwgUmhzTmVzdGVkPiBUeXBlOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIExoc05lc3RlZCwgdHlwZW5hbWUgUmhzTmVzdGVkPgorc3RydWN0IHRyYWl0czxTcGFyc2VTcGFyc2VQcm9kdWN0PExoc05lc3RlZCwgUmhzTmVzdGVkPiA+Cit7CisgIHR5cGVkZWYgTWF0cml4WHByIFhwcktpbmQ7CisgIC8vIGNsZWFuIHRoZSBuZXN0ZWQgdHlwZXM6CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHNOZXN0ZWQ+Ojp0eXBlIF9MaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxSaHNOZXN0ZWQ+Ojp0eXBlIF9SaHNOZXN0ZWQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgX0xoc05lc3RlZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwcm9tb3RlX2luZGV4X3R5cGU8dHlwZW5hbWUgdHJhaXRzPF9MaHNOZXN0ZWQ+OjpJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPF9SaHNOZXN0ZWQ+OjpJbmRleD46OnR5cGUgSW5kZXg7CisKKyAgZW51bSB7CisgICAgTGhzQ29lZmZSZWFkQ29zdCA9IF9MaHNOZXN0ZWQ6OkNvZWZmUmVhZENvc3QsCisgICAgUmhzQ29lZmZSZWFkQ29zdCA9IF9SaHNOZXN0ZWQ6OkNvZWZmUmVhZENvc3QsCisgICAgTGhzRmxhZ3MgPSBfTGhzTmVzdGVkOjpGbGFncywKKyAgICBSaHNGbGFncyA9IF9SaHNOZXN0ZWQ6OkZsYWdzLAorCisgICAgUm93c0F0Q29tcGlsZVRpbWUgICAgPSBfTGhzTmVzdGVkOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSAgICA9IF9SaHNOZXN0ZWQ6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gX0xoc05lc3RlZDo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBfUmhzTmVzdGVkOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKworICAgIElubmVyU2l6ZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChfTGhzTmVzdGVkOjpDb2xzQXRDb21waWxlVGltZSwgX1Joc05lc3RlZDo6Um93c0F0Q29tcGlsZVRpbWUpLAorCisgICAgRXZhbFRvUm93TWFqb3IgPSAoUmhzRmxhZ3MgJiBMaHNGbGFncyAmIFJvd01ham9yQml0KSwKKworICAgIFJlbW92ZWRCaXRzID0gfihFdmFsVG9Sb3dNYWpvciA/IDAgOiBSb3dNYWpvckJpdCksCisKKyAgICBGbGFncyA9IChpbnQoTGhzRmxhZ3MgfCBSaHNGbGFncykgJiBIZXJlZGl0YXJ5Qml0cyAmIFJlbW92ZWRCaXRzKQorICAgICAgICAgIHwgRXZhbEJlZm9yZUFzc2lnbmluZ0JpdAorICAgICAgICAgIHwgRXZhbEJlZm9yZU5lc3RpbmdCaXQsCisKKyAgICBDb2VmZlJlYWRDb3N0ID0gRHluYW1pYworICB9OworCisgIHR5cGVkZWYgU3BhcnNlIFN0b3JhZ2VLaW5kOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIExoc05lc3RlZCwgdHlwZW5hbWUgUmhzTmVzdGVkPgorY2xhc3MgU3BhcnNlU3BhcnNlUHJvZHVjdCA6IGludGVybmFsOjpub19hc3NpZ25tZW50X29wZXJhdG9yLAorICBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VTcGFyc2VQcm9kdWN0PExoc05lc3RlZCwgUmhzTmVzdGVkPiA+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VTcGFyc2VQcm9kdWN0PiBCYXNlOworICAgIEVJR0VOX0RFTlNFX1BVQkxJQ19JTlRFUkZBQ0UoU3BhcnNlU3BhcnNlUHJvZHVjdCkKKworICBwcml2YXRlOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNwYXJzZVNwYXJzZVByb2R1Y3Q+OjpfTGhzTmVzdGVkIF9MaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFNwYXJzZVNwYXJzZVByb2R1Y3Q+OjpfUmhzTmVzdGVkIF9SaHNOZXN0ZWQ7CisKKyAgcHVibGljOgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CisgICAgRUlHRU5fU1RST05HX0lOTElORSBTcGFyc2VTcGFyc2VQcm9kdWN0KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykKKyAgICAgIDogbV9saHMobGhzKSwgbV9yaHMocmhzKSwgbV90b2xlcmFuY2UoMCksIG1fY29uc2VydmF0aXZlKHRydWUpCisgICAgeworICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU3BhcnNlU3BhcnNlUHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlYWxTY2FsYXIgdG9sZXJhbmNlKQorICAgICAgOiBtX2xocyhsaHMpLCBtX3JocyhyaHMpLCBtX3RvbGVyYW5jZSh0b2xlcmFuY2UpLCBtX2NvbnNlcnZhdGl2ZShmYWxzZSkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgfQorCisgICAgU3BhcnNlU3BhcnNlUHJvZHVjdCBwcnVuZWQoU2NhbGFyIHJlZmVyZW5jZSA9IDAsIFJlYWxTY2FsYXIgZXBzaWxvbiA9IE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIFNwYXJzZVNwYXJzZVByb2R1Y3QobV9saHMsbV9yaHMsaW50ZXJuYWw6OmFicyhyZWZlcmVuY2UpKmVwc2lsb24pOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+CisgICAgdm9pZCBldmFsVG8oRGVzdCYgcmVzdWx0KSBjb25zdAorICAgIHsKKyAgICAgIGlmKG1fY29uc2VydmF0aXZlKQorICAgICAgICBpbnRlcm5hbDo6Y29uc2VydmF0aXZlX3NwYXJzZV9zcGFyc2VfcHJvZHVjdF9zZWxlY3RvcjxfTGhzTmVzdGVkLCBfUmhzTmVzdGVkLCBEZXN0Pjo6cnVuKGxocygpLHJocygpLHJlc3VsdCk7CisgICAgICBlbHNlCisgICAgICAgIGludGVybmFsOjpzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX3NlbGVjdG9yPF9MaHNOZXN0ZWQsIF9SaHNOZXN0ZWQsIERlc3Q+OjpydW4obGhzKCkscmhzKCkscmVzdWx0LG1fdG9sZXJhbmNlKTsKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2xocy5yb3dzKCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3Jocy5jb2xzKCk7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgX0xoc05lc3RlZCYgbGhzKCkgY29uc3QgeyByZXR1cm4gbV9saHM7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IF9SaHNOZXN0ZWQmIHJocygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fbGhzLmNvbHMoKSA9PSBtX3Jocy5yb3dzKCkpOworCisgICAgICBlbnVtIHsKKyAgICAgICAgUHJvZHVjdElzVmFsaWQgPSBfTGhzTmVzdGVkOjpDb2xzQXRDb21waWxlVGltZT09RHluYW1pYworICAgICAgICAgICAgICAgICAgICAgIHx8IF9SaHNOZXN0ZWQ6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgfHwgaW50KF9MaHNOZXN0ZWQ6OkNvbHNBdENvbXBpbGVUaW1lKT09aW50KF9SaHNOZXN0ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSwKKyAgICAgICAgQXJlVmVjdG9ycyA9IF9MaHNOZXN0ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSAmJiBfUmhzTmVzdGVkOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsCisgICAgICAgIFNhbWVTaXplcyA9IEVJR0VOX1BSRURJQ0FURV9TQU1FX01BVFJJWF9TSVpFKF9MaHNOZXN0ZWQsX1Joc05lc3RlZCkKKyAgICAgIH07CisgICAgICAvLyBub3RlIHRvIHRoZSBsb3N0IHVzZXI6CisgICAgICAvLyAgICAqIGZvciBhIGRvdCBwcm9kdWN0IHVzZTogdjEuZG90KHYyKQorICAgICAgLy8gICAgKiBmb3IgYSBjb2VmZi13aXNlIHByb2R1Y3QgdXNlOiB2MS5jd2lzZSgpKnYyCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKFByb2R1Y3RJc1ZhbGlkIHx8ICEoQXJlVmVjdG9ycyAmJiBTYW1lU2l6ZXMpLAorICAgICAgICBJTlZBTElEX1ZFQ1RPUl9WRUNUT1JfUFJPRFVDVF9fSUZfWU9VX1dBTlRFRF9BX0RPVF9PUl9DT0VGRl9XSVNFX1BST0RVQ1RfWU9VX01VU1RfVVNFX1RIRV9FWFBMSUNJVF9GVU5DVElPTlMpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKFByb2R1Y3RJc1ZhbGlkIHx8ICEoU2FtZVNpemVzICYmICFBcmVWZWN0b3JzKSwKKyAgICAgICAgSU5WQUxJRF9NQVRSSVhfUFJPRFVDVF9fSUZfWU9VX1dBTlRFRF9BX0NPRUZGX1dJU0VfUFJPRFVDVF9ZT1VfTVVTVF9VU0VfVEhFX0VYUExJQ0lUX0ZVTkNUSU9OKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChQcm9kdWN0SXNWYWxpZCB8fCBTYW1lU2l6ZXMsIElOVkFMSURfTUFUUklYX1BST0RVQ1QpCisgICAgfQorCisgICAgTGhzTmVzdGVkIG1fbGhzOworICAgIFJoc05lc3RlZCBtX3JoczsKKyAgICBSZWFsU2NhbGFyIG1fdG9sZXJhbmNlOworICAgIGJvb2wgbV9jb25zZXJ2YXRpdmU7Cit9OworCisvLyBzcGFyc2UgPSBzcGFyc2UgKiBzcGFyc2UKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK2lubGluZSBEZXJpdmVkJiBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+OjpvcGVyYXRvcj0oY29uc3QgU3BhcnNlU3BhcnNlUHJvZHVjdDxMaHMsUmhzPiYgcHJvZHVjdCkKK3sKKyAgcHJvZHVjdC5ldmFsVG8oZGVyaXZlZCgpKTsKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIHByb2R1Y3Qgb2YgdHdvIHNwYXJzZSBtYXRyaWNlcy4KKyAgKiBCeSBkZWZhdWx0IGEgY29uc2VydmF0aXZlIHByb2R1Y3QgcHJlc2VydmluZyB0aGUgc3ltYm9saWMgbm9uIHplcm9zIGlzIHBlcmZvcm1lZC4KKyAgKiBUaGUgYXV0b21hdGljIHBydW5pbmcgb2YgdGhlIHNtYWxsIHZhbHVlcyBjYW4gYmUgYWNoaWV2ZWQgYnkgY2FsbGluZyB0aGUgcHJ1bmVkKCkgZnVuY3Rpb24KKyAgKiBpbiB3aGljaCBjYXNlIGEgdG90YWxseSBkaWZmZXJlbnQgcHJvZHVjdCBhbGdvcml0aG0gaXMgZW1wbG95ZWQ6CisgICogXGNvZGUKKyAgKiBDID0gKEEqQikucHJ1bmVkKCk7ICAgICAgICAgICAgIC8vIHN1cHJlc3MgbnVtZXJpY2FsIHplcm9zIChleGFjdCkKKyAgKiBDID0gKEEqQikucHJ1bmVkKHJlZik7CisgICogQyA9IChBKkIpLnBydW5lZChyZWYsZXBzaWxvbik7CisgICogXGVuZGNvZGUKKyAgKiB3aGVyZSBcYyByZWYgaXMgYSBtZWFuaW5nZnVsIG5vbiB6ZXJvIHJlZmVyZW5jZSB2YWx1ZS4KKyAgKiAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBjb25zdCB0eXBlbmFtZSBTcGFyc2VTcGFyc2VQcm9kdWN0UmV0dXJuVHlwZTxEZXJpdmVkLE90aGVyRGVyaXZlZD46OlR5cGUKK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgU3BhcnNlU3BhcnNlUHJvZHVjdFJldHVyblR5cGU8RGVyaXZlZCxPdGhlckRlcml2ZWQ+OjpUeXBlKGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VQUk9EVUNUX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVJlZHV4LmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VSZWR1eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZGE5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VSZWR1eC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VSRURVWF9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRVJFRFVYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIKK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46OnN1bSgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCk+MCAmJiBjb2xzKCk+MCAmJiAieW91IGFyZSB1c2luZyBhIG5vbiBpbml0aWFsaXplZCBtYXRyaXgiKTsKKyAgU2NhbGFyIHJlcygwKTsKKyAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJTaXplKCk7ICsraikKKyAgICBmb3IgKHR5cGVuYW1lIERlcml2ZWQ6OklubmVySXRlcmF0b3IgaXRlcihkZXJpdmVkKCksaik7IGl0ZXI7ICsraXRlcikKKyAgICAgIHJlcyArPSBpdGVyLnZhbHVlKCk7CisgIHJldHVybiByZXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4PgordHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxTcGFyc2VNYXRyaXg8X1NjYWxhcixfT3B0aW9ucyxfSW5kZXg+ID46OlNjYWxhcgorU3BhcnNlTWF0cml4PF9TY2FsYXIsX09wdGlvbnMsX0luZGV4Pjo6c3VtKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KHJvd3MoKT4wICYmIGNvbHMoKT4wICYmICJ5b3UgYXJlIHVzaW5nIGEgbm9uIGluaXRpYWxpemVkIG1hdHJpeCIpOworICByZXR1cm4gTWF0cml4PFNjYWxhciwxLER5bmFtaWM+OjpNYXAoJm1fZGF0YS52YWx1ZSgwKSwgbV9kYXRhLnNpemUoKSkuc3VtKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4PgordHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxTcGFyc2VWZWN0b3I8X1NjYWxhcixfT3B0aW9ucywgX0luZGV4PiA+OjpTY2FsYXIKK1NwYXJzZVZlY3RvcjxfU2NhbGFyLF9PcHRpb25zLF9JbmRleD46OnN1bSgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCk+MCAmJiBjb2xzKCk+MCAmJiAieW91IGFyZSB1c2luZyBhIG5vbiBpbml0aWFsaXplZCBtYXRyaXgiKTsKKyAgcmV0dXJuIE1hdHJpeDxTY2FsYXIsMSxEeW5hbWljPjo6TWFwKCZtX2RhdGEudmFsdWUoMCksIG1fZGF0YS5zaXplKCkpLnN1bSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRVJFRFVYX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVNlbGZBZGpvaW50Vmlldy5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlU2VsZkFkam9pbnRWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlYzBhNgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVNlbGZBZGpvaW50Vmlldy5oCkBAIC0wLDAgKzEsNDgwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX1NFTEZBREpPSU5UVklFV19ICisjZGVmaW5lIEVJR0VOX1NQQVJTRV9TRUxGQURKT0lOVFZJRVdfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIFNwYXJzZUNvcmVfTW9kdWxlCisgICogXGNsYXNzIFNwYXJzZVNlbGZBZGpvaW50VmlldworICAqCisgICogXGJyaWVmIFBzZXVkbyBleHByZXNzaW9uIHRvIG1hbmlwdWxhdGUgYSB0cmlhbmd1bGFyIHNwYXJzZSBtYXRyaXggYXMgYSBzZWxmYWRqb2ludCBtYXRyaXguCisgICoKKyAgKiBccGFyYW0gTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgZGVuc2UgbWF0cml4IHN0b3JpbmcgdGhlIGNvZWZmaWNpZW50cworICAqIFxwYXJhbSBVcExvIGNhbiBiZSBlaXRoZXIgXGMgI0xvd2VyIG9yIFxjICNVcHBlcgorICAqCisgICogVGhpcyBjbGFzcyBpcyBhbiBleHByZXNzaW9uIG9mIGEgc2VmbGFkam9pbnQgbWF0cml4IGZyb20gYSB0cmlhbmd1bGFyIHBhcnQgb2YgYSBtYXRyaXgKKyAgKiB3aXRoIGdpdmVuIGRlbnNlIHN0b3JhZ2Ugb2YgdGhlIGNvZWZmaWNpZW50cy4gSXQgaXMgdGhlIHJldHVybiB0eXBlIG9mIE1hdHJpeEJhc2U6OnNlbGZhZGpvaW50VmlldygpCisgICogYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgdGhhdCBpdCBpcyB1c2VkLgorICAqCisgICogXHNhIFNwYXJzZU1hdHJpeEJhc2U6OnNlbGZhZGpvaW50VmlldygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFVwTG8+CitjbGFzcyBTcGFyc2VTZWxmQWRqb2ludFRpbWVEZW5zZVByb2R1Y3Q7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgVXBMbz4KK2NsYXNzIERlbnNlVGltZVNwYXJzZVNlbGZBZGpvaW50UHJvZHVjdDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgVXBMbz4KK3N0cnVjdCB0cmFpdHM8U3BhcnNlU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsVXBMbz4gPiA6IHRyYWl0czxNYXRyaXhUeXBlPiB7Cit9OworCit0ZW1wbGF0ZTxpbnQgU3JjVXBMbyxpbnQgRHN0VXBMbyx0eXBlbmFtZSBNYXRyaXhUeXBlLGludCBEZXN0T3JkZXI+Cit2b2lkIHBlcm11dGVfc3ltbV90b19zeW1tKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgU3BhcnNlTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcixEZXN0T3JkZXIsdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXg+JiBfZGVzdCwgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXgqIHBlcm0gPSAwKTsKKwordGVtcGxhdGU8aW50IFVwTG8sdHlwZW5hbWUgTWF0cml4VHlwZSxpbnQgRGVzdE9yZGVyPgordm9pZCBwZXJtdXRlX3N5bW1fdG9fZnVsbHN5bW0oY29uc3QgTWF0cml4VHlwZSYgbWF0LCBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLERlc3RPcmRlcix0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleD4mIF9kZXN0LCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCogcGVybSA9IDApOworCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHVuc2lnbmVkIGludCBVcExvPiBjbGFzcyBTcGFyc2VTZWxmQWRqb2ludFZpZXcKKyAgOiBwdWJsaWMgRWlnZW5CYXNlPFNwYXJzZVNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLFVwTG8+ID4KK3sKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiBNYXRyaXg8SW5kZXgsRHluYW1pYywxPiBWZWN0b3JJOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIE1hdHJpeFR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSBfTWF0cml4VHlwZU5lc3RlZDsKKworICAgIGlubGluZSBTcGFyc2VTZWxmQWRqb2ludFZpZXcoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KSA6IG1fbWF0cml4KG1hdHJpeCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQocm93cygpPT1jb2xzKCkgJiYgIlNlbGZBZGpvaW50VmlldyBpcyBvbmx5IGZvciBzcXVhcmVkIG1hdHJpY2VzIik7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LmNvbHMoKTsgfQorCisgICAgLyoqIFxpbnRlcm5hbCBccmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbmVzdGVkIG1hdHJpeCAqLworICAgIGNvbnN0IF9NYXRyaXhUeXBlTmVzdGVkJiBtYXRyaXgoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeDsgfQorICAgIF9NYXRyaXhUeXBlTmVzdGVkJiBtYXRyaXgoKSB7IHJldHVybiBtX21hdHJpeC5jb25zdF9jYXN0X2Rlcml2ZWQoKTsgfQorCisgICAgLyoqIEVmZmljaWVudCBzcGFyc2Ugc2VsZi1hZGpvaW50IG1hdHJpeCB0aW1lcyBkZW5zZSB2ZWN0b3IvbWF0cml4IHByb2R1Y3QgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgU3BhcnNlU2VsZkFkam9pbnRUaW1lRGVuc2VQcm9kdWN0PE1hdHJpeFR5cGUsT3RoZXJEZXJpdmVkLFVwTG8+CisgICAgb3BlcmF0b3IqKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgcmhzKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBTcGFyc2VTZWxmQWRqb2ludFRpbWVEZW5zZVByb2R1Y3Q8TWF0cml4VHlwZSxPdGhlckRlcml2ZWQsVXBMbz4obV9tYXRyaXgsIHJocy5kZXJpdmVkKCkpOworICAgIH0KKworICAgIC8qKiBFZmZpY2llbnQgZGVuc2UgdmVjdG9yL21hdHJpeCB0aW1lcyBzcGFyc2Ugc2VsZi1hZGpvaW50IG1hdHJpeCBwcm9kdWN0ICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBmcmllbmQKKyAgICBEZW5zZVRpbWVTcGFyc2VTZWxmQWRqb2ludFByb2R1Y3Q8T3RoZXJEZXJpdmVkLE1hdHJpeFR5cGUsVXBMbz4KKyAgICBvcGVyYXRvciooY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBsaHMsIGNvbnN0IFNwYXJzZVNlbGZBZGpvaW50VmlldyYgcmhzKQorICAgIHsKKyAgICAgIHJldHVybiBEZW5zZVRpbWVTcGFyc2VTZWxmQWRqb2ludFByb2R1Y3Q8T3RoZXJEZXJpdmVkLF9NYXRyaXhUeXBlTmVzdGVkLFVwTG8+KGxocy5kZXJpdmVkKCksIHJocy5tX21hdHJpeCk7CisgICAgfQorCisgICAgLyoqIFBlcmZvcm0gYSBzeW1tZXRyaWMgcmFuayBLIHVwZGF0ZSBvZiB0aGUgc2VsZmFkam9pbnQgbWF0cml4IFxjICp0aGlzOgorICAgICAgKiBcZiQgdGhpcyA9IHRoaXMgKyBcYWxwaGEgKCB1IHVeKiApIFxmJCB3aGVyZSBcYSB1IGlzIGEgdmVjdG9yIG9yIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gXGMgKnRoaXMKKyAgICAgICoKKyAgICAgICogVG8gcGVyZm9ybSBcZiQgdGhpcyA9IHRoaXMgKyBcYWxwaGEgKCB1XiogdSApIFxmJCB5b3UgY2FuIHNpbXBseQorICAgICAgKiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB1LmFkam9pbnQoKS4KKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZFU+CisgICAgU3BhcnNlU2VsZkFkam9pbnRWaWV3JiByYW5rVXBkYXRlKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZFU+JiB1LCBTY2FsYXIgYWxwaGEgPSBTY2FsYXIoMSkpOworICAgIAorICAgIC8qKiBcaW50ZXJuYWwgdHJpZ2dlcmVkIGJ5IHNwYXJzZV9tYXRyaXggPSBTcGFyc2VTZWxmYWRqb2ludFZpZXc7ICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdFNjYWxhcixpbnQgU3RvcmFnZU9yZGVyPiB2b2lkIGV2YWxUbyhTcGFyc2VNYXRyaXg8RGVzdFNjYWxhcixTdG9yYWdlT3JkZXIsSW5kZXg+JiBfZGVzdCkgY29uc3QKKyAgICB7CisgICAgICBpbnRlcm5hbDo6cGVybXV0ZV9zeW1tX3RvX2Z1bGxzeW1tPFVwTG8+KG1fbWF0cml4LCBfZGVzdCk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3RTY2FsYXI+IHZvaWQgZXZhbFRvKER5bmFtaWNTcGFyc2VNYXRyaXg8RGVzdFNjYWxhcixDb2xNYWpvcixJbmRleD4mIF9kZXN0KSBjb25zdAorICAgIHsKKyAgICAgIC8vIFRPRE8gZGlyZWN0bHkgZXZhbHVhdGUgaW50byBfZGVzdDsKKyAgICAgIFNwYXJzZU1hdHJpeDxEZXN0U2NhbGFyLENvbE1ham9yLEluZGV4PiB0bXAoX2Rlc3Qucm93cygpLF9kZXN0LmNvbHMoKSk7CisgICAgICBpbnRlcm5hbDo6cGVybXV0ZV9zeW1tX3RvX2Z1bGxzeW1tPFVwTG8+KG1fbWF0cml4LCB0bXApOworICAgICAgX2Rlc3QgPSB0bXA7CisgICAgfQorICAgIAorICAgIC8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIFAgSCBQXi0xICovCisgICAgU3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0PF9NYXRyaXhUeXBlTmVzdGVkLFVwTG8+IHR3aXN0ZWRCeShjb25zdCBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWMsSW5kZXg+JiBwZXJtKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBTcGFyc2VTeW1tZXRyaWNQZXJtdXRhdGlvblByb2R1Y3Q8X01hdHJpeFR5cGVOZXN0ZWQsVXBMbz4obV9tYXRyaXgsIHBlcm0pOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTcmNNYXRyaXhUeXBlLGludCBTcmNVcExvPgorICAgIFNwYXJzZVNlbGZBZGpvaW50VmlldyYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZVN5bW1ldHJpY1Blcm11dGF0aW9uUHJvZHVjdDxTcmNNYXRyaXhUeXBlLFNyY1VwTG8+JiBwZXJtdXRlZE1hdHJpeCkKKyAgICB7CisgICAgICBwZXJtdXRlZE1hdHJpeC5ldmFsVG8oKnRoaXMpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworCisgICAgU3BhcnNlU2VsZkFkam9pbnRWaWV3JiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlU2VsZkFkam9pbnRWaWV3JiBzcmMpCisgICAgeworICAgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYz4gcG51bGw7CisgICAgICByZXR1cm4gKnRoaXMgPSBzcmMudHdpc3RlZEJ5KHBudWxsKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTcmNNYXRyaXhUeXBlLHVuc2lnbmVkIGludCBTcmNVcExvPgorICAgIFNwYXJzZVNlbGZBZGpvaW50VmlldyYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZVNlbGZBZGpvaW50VmlldzxTcmNNYXRyaXhUeXBlLFNyY1VwTG8+JiBzcmMpCisgICAgeworICAgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYz4gcG51bGw7CisgICAgICByZXR1cm4gKnRoaXMgPSBzcmMudHdpc3RlZEJ5KHBudWxsKTsKKyAgICB9CisgICAgCisKKyAgICAvLyBjb25zdCBTcGFyc2VMTFQ8UGxhaW5PYmplY3QsIFVwTG8+IGxsdCgpIGNvbnN0OworICAgIC8vIGNvbnN0IFNwYXJzZUxETFQ8UGxhaW5PYmplY3QsIFVwTG8+IGxkbHQoKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisKKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9tYXRyaXg7CisgICAgbXV0YWJsZSBWZWN0b3JJIG1fY291bnRQZXJSb3c7CisgICAgbXV0YWJsZSBWZWN0b3JJIG1fY291bnRQZXJDb2w7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEltcGxlbWVudGF0aW9uIG9mIFNwYXJzZU1hdHJpeEJhc2UgbWV0aG9kcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dW5zaWduZWQgaW50IFVwTG8+Citjb25zdCBTcGFyc2VTZWxmQWRqb2ludFZpZXc8RGVyaXZlZCwgVXBMbz4gU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6c2VsZmFkam9pbnRWaWV3KCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHVuc2lnbmVkIGludCBVcExvPgorU3BhcnNlU2VsZkFkam9pbnRWaWV3PERlcml2ZWQsIFVwTG8+IFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46OnNlbGZhZGpvaW50VmlldygpCit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW1wbGVtZW50YXRpb24gb2YgU3BhcnNlU2VsZkFkam9pbnRWaWV3IG1ldGhvZHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdW5zaWduZWQgaW50IFVwTG8+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkVT4KK1NwYXJzZVNlbGZBZGpvaW50VmlldzxNYXRyaXhUeXBlLFVwTG8+JgorU3BhcnNlU2VsZkFkam9pbnRWaWV3PE1hdHJpeFR5cGUsVXBMbz46OnJhbmtVcGRhdGUoY29uc3QgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkVT4mIHUsIFNjYWxhciBhbHBoYSkKK3sKKyAgU3BhcnNlTWF0cml4PFNjYWxhcixNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdD9Sb3dNYWpvcjpDb2xNYWpvcj4gdG1wID0gdSAqIHUuYWRqb2ludCgpOworICBpZihhbHBoYT09U2NhbGFyKDApKQorICAgIG1fbWF0cml4LmNvbnN0X2Nhc3RfZGVyaXZlZCgpID0gdG1wLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwTG8+KCk7CisgIGVsc2UKKyAgICBtX21hdHJpeC5jb25zdF9jYXN0X2Rlcml2ZWQoKSArPSBhbHBoYSAqIHRtcC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcExvPigpOworCisgIHJldHVybiAqdGhpczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBzcGFyc2Ugc2VsZi1hZGpvaW50IHRpbWUgZGVuc2UgbWF0cml4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFVwTG8+CitzdHJ1Y3QgdHJhaXRzPFNwYXJzZVNlbGZBZGpvaW50VGltZURlbnNlUHJvZHVjdDxMaHMsUmhzLFVwTG8+ID4KKyA6IHRyYWl0czxQcm9kdWN0QmFzZTxTcGFyc2VTZWxmQWRqb2ludFRpbWVEZW5zZVByb2R1Y3Q8TGhzLFJocyxVcExvPiwgTGhzLCBSaHM+ID4KK3sKKyAgdHlwZWRlZiBEZW5zZSBTdG9yYWdlS2luZDsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgVXBMbz4KK2NsYXNzIFNwYXJzZVNlbGZBZGpvaW50VGltZURlbnNlUHJvZHVjdAorICA6IHB1YmxpYyBQcm9kdWN0QmFzZTxTcGFyc2VTZWxmQWRqb2ludFRpbWVEZW5zZVByb2R1Y3Q8TGhzLFJocyxVcExvPiwgTGhzLCBSaHM+Cit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9QUk9EVUNUX1BVQkxJQ19JTlRFUkZBQ0UoU3BhcnNlU2VsZkFkam9pbnRUaW1lRGVuc2VQcm9kdWN0KQorCisgICAgU3BhcnNlU2VsZkFkam9pbnRUaW1lRGVuc2VQcm9kdWN0KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykgOiBCYXNlKGxocyxyaHMpCisgICAge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgc2NhbGVBbmRBZGRUbyhEZXN0JiBkZXN0LCBTY2FsYXIgYWxwaGEpIGNvbnN0CisgICAgeworICAgICAgLy8gVE9ETyB1c2UgYWxwaGEKKyAgICAgIGVpZ2VuX2Fzc2VydChhbHBoYT09U2NhbGFyKDEpICYmICJhbHBoYSAhPSAxIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQsIHNvcnJ5Iik7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPExocz46OnR5cGUgX0xoczsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8UmhzPjo6dHlwZSBfUmhzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfTGhzOjpJbm5lckl0ZXJhdG9yIExoc0lubmVySXRlcmF0b3I7CisgICAgICBlbnVtIHsKKyAgICAgICAgTGhzSXNSb3dNYWpvciA9IChfTGhzOjpGbGFncyZSb3dNYWpvckJpdCk9PVJvd01ham9yQml0LAorICAgICAgICBQcm9jZXNzRmlyc3RIYWxmID0KKyAgICAgICAgICAgICAgICAgKChVcExvJihVcHBlcnxMb3dlcikpPT0oVXBwZXJ8TG93ZXIpKQorICAgICAgICAgICAgICB8fCAoIChVcExvJlVwcGVyKSAmJiAhTGhzSXNSb3dNYWpvcikKKyAgICAgICAgICAgICAgfHwgKCAoVXBMbyZMb3dlcikgJiYgTGhzSXNSb3dNYWpvciksCisgICAgICAgIFByb2Nlc3NTZWNvbmRIYWxmID0gIVByb2Nlc3NGaXJzdEhhbGYKKyAgICAgIH07CisgICAgICBmb3IgKEluZGV4IGo9MDsgajxtX2xocy5vdXRlclNpemUoKTsgKytqKQorICAgICAgeworICAgICAgICBMaHNJbm5lckl0ZXJhdG9yIGkobV9saHMsaik7CisgICAgICAgIGlmIChQcm9jZXNzU2Vjb25kSGFsZikKKyAgICAgICAgeworICAgICAgICAgIHdoaWxlIChpICYmIGkuaW5kZXgoKTxqKSArK2k7CisgICAgICAgICAgaWYoaSAmJiBpLmluZGV4KCk9PWopCisgICAgICAgICAgeworICAgICAgICAgICAgZGVzdC5yb3coaikgKz0gaS52YWx1ZSgpICogbV9yaHMucm93KGopOworICAgICAgICAgICAgKytpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IoOyAoUHJvY2Vzc0ZpcnN0SGFsZiA/IGkgJiYgaS5pbmRleCgpIDwgaiA6IGkpIDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgSW5kZXggYSA9IExoc0lzUm93TWFqb3IgPyBqIDogaS5pbmRleCgpOworICAgICAgICAgIEluZGV4IGIgPSBMaHNJc1Jvd01ham9yID8gaS5pbmRleCgpIDogajsKKyAgICAgICAgICB0eXBlbmFtZSBMaHM6OlNjYWxhciB2ID0gaS52YWx1ZSgpOworICAgICAgICAgIGRlc3Qucm93KGEpICs9ICh2KSAqIG1fcmhzLnJvdyhiKTsKKyAgICAgICAgICBkZXN0LnJvdyhiKSArPSBpbnRlcm5hbDo6Y29uaih2KSAqIG1fcmhzLnJvdyhhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHJvY2Vzc0ZpcnN0SGFsZiAmJiBpICYmIChpLmluZGV4KCk9PWopKQorICAgICAgICAgIGRlc3Qucm93KGopICs9IGkudmFsdWUoKSAqIG1fcmhzLnJvdyhqKTsKKyAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBTcGFyc2VTZWxmQWRqb2ludFRpbWVEZW5zZVByb2R1Y3QmIG9wZXJhdG9yPShjb25zdCBTcGFyc2VTZWxmQWRqb2ludFRpbWVEZW5zZVByb2R1Y3QmKTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFVwTG8+CitzdHJ1Y3QgdHJhaXRzPERlbnNlVGltZVNwYXJzZVNlbGZBZGpvaW50UHJvZHVjdDxMaHMsUmhzLFVwTG8+ID4KKyA6IHRyYWl0czxQcm9kdWN0QmFzZTxEZW5zZVRpbWVTcGFyc2VTZWxmQWRqb2ludFByb2R1Y3Q8TGhzLFJocyxVcExvPiwgTGhzLCBSaHM+ID4KK3t9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFVwTG8+CitjbGFzcyBEZW5zZVRpbWVTcGFyc2VTZWxmQWRqb2ludFByb2R1Y3QKKyAgOiBwdWJsaWMgUHJvZHVjdEJhc2U8RGVuc2VUaW1lU3BhcnNlU2VsZkFkam9pbnRQcm9kdWN0PExocyxSaHMsVXBMbz4sIExocywgUmhzPgoreworICBwdWJsaWM6CisgICAgRUlHRU5fUFJPRFVDVF9QVUJMSUNfSU5URVJGQUNFKERlbnNlVGltZVNwYXJzZVNlbGZBZGpvaW50UHJvZHVjdCkKKworICAgIERlbnNlVGltZVNwYXJzZVNlbGZBZGpvaW50UHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpIDogQmFzZShsaHMscmhzKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIHNjYWxlQW5kQWRkVG8oRGVzdCYgLypkZXN0Ki8sIFNjYWxhciAvKmFscGhhKi8pIGNvbnN0CisgICAgeworICAgICAgLy8gVE9ETworICAgIH0KKworICBwcml2YXRlOgorICAgIERlbnNlVGltZVNwYXJzZVNlbGZBZGpvaW50UHJvZHVjdCYgb3BlcmF0b3I9KGNvbnN0IERlbnNlVGltZVNwYXJzZVNlbGZBZGpvaW50UHJvZHVjdCYpOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbXBsZW1lbnRhdGlvbiBvZiBzeW1tZXRyaWMgY29waWVzIGFuZCBwZXJtdXRhdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBpbnRlcm5hbCB7CisgIAordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFVwTG8+CitzdHJ1Y3QgdHJhaXRzPFNwYXJzZVN5bW1ldHJpY1Blcm11dGF0aW9uUHJvZHVjdDxNYXRyaXhUeXBlLFVwTG8+ID4gOiB0cmFpdHM8TWF0cml4VHlwZT4geworfTsKKwordGVtcGxhdGU8aW50IFVwTG8sdHlwZW5hbWUgTWF0cml4VHlwZSxpbnQgRGVzdE9yZGVyPgordm9pZCBwZXJtdXRlX3N5bW1fdG9fZnVsbHN5bW0oY29uc3QgTWF0cml4VHlwZSYgbWF0LCBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLERlc3RPcmRlcix0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleD4mIF9kZXN0LCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCogcGVybSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsRGVzdE9yZGVyLEluZGV4PiBEZXN0OworICB0eXBlZGVmIE1hdHJpeDxJbmRleCxEeW5hbWljLDE+IFZlY3Rvckk7CisgIAorICBEZXN0JiBkZXN0KF9kZXN0LmRlcml2ZWQoKSk7CisgIGVudW0geworICAgIFN0b3JhZ2VPcmRlck1hdGNoID0gaW50KERlc3Q6OklzUm93TWFqb3IpID09IGludChNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICB9OworICAKKyAgSW5kZXggc2l6ZSA9IG1hdC5yb3dzKCk7CisgIFZlY3RvckkgY291bnQ7CisgIGNvdW50LnJlc2l6ZShzaXplKTsKKyAgY291bnQuc2V0WmVybygpOworICBkZXN0LnJlc2l6ZShzaXplLHNpemUpOworICBmb3IoSW5kZXggaiA9IDA7IGo8c2l6ZTsgKytqKQorICB7CisgICAgSW5kZXgganAgPSBwZXJtID8gcGVybVtqXSA6IGo7CisgICAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobWF0LGopOyBpdDsgKytpdCkKKyAgICB7CisgICAgICBJbmRleCBpID0gaXQuaW5kZXgoKTsKKyAgICAgIEluZGV4IHIgPSBpdC5yb3coKTsKKyAgICAgIEluZGV4IGMgPSBpdC5jb2woKTsKKyAgICAgIEluZGV4IGlwID0gcGVybSA/IHBlcm1baV0gOiBpOworICAgICAgaWYoVXBMbz09KFVwcGVyfExvd2VyKSkKKyAgICAgICAgY291bnRbU3RvcmFnZU9yZGVyTWF0Y2ggPyBqcCA6IGlwXSsrOworICAgICAgZWxzZSBpZihyPT1jKQorICAgICAgICBjb3VudFtpcF0rKzsKKyAgICAgIGVsc2UgaWYoKCBVcExvPT1Mb3dlciAmJiByPmMpIHx8ICggVXBMbz09VXBwZXIgJiYgcjxjKSkKKyAgICAgIHsKKyAgICAgICAgY291bnRbaXBdKys7CisgICAgICAgIGNvdW50W2pwXSsrOworICAgICAgfQorICAgIH0KKyAgfQorICBJbmRleCBubnogPSBjb3VudC5zdW0oKTsKKyAgCisgIC8vIHJlc2VydmUgc3BhY2UKKyAgZGVzdC5yZXNpemVOb25aZXJvcyhubnopOworICBkZXN0Lm91dGVySW5kZXhQdHIoKVswXSA9IDA7CisgIGZvcihJbmRleCBqPTA7IGo8c2l6ZTsgKytqKQorICAgIGRlc3Qub3V0ZXJJbmRleFB0cigpW2orMV0gPSBkZXN0Lm91dGVySW5kZXhQdHIoKVtqXSArIGNvdW50W2pdOworICBmb3IoSW5kZXggaj0wOyBqPHNpemU7ICsraikKKyAgICBjb3VudFtqXSA9IGRlc3Qub3V0ZXJJbmRleFB0cigpW2pdOworICAKKyAgLy8gY29weSBkYXRhCisgIGZvcihJbmRleCBqID0gMDsgajxzaXplOyArK2opCisgIHsKKyAgICBmb3IodHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtYXQsaik7IGl0OyArK2l0KQorICAgIHsKKyAgICAgIEluZGV4IGkgPSBpdC5pbmRleCgpOworICAgICAgSW5kZXggciA9IGl0LnJvdygpOworICAgICAgSW5kZXggYyA9IGl0LmNvbCgpOworICAgICAgCisgICAgICBJbmRleCBqcCA9IHBlcm0gPyBwZXJtW2pdIDogajsKKyAgICAgIEluZGV4IGlwID0gcGVybSA/IHBlcm1baV0gOiBpOworICAgICAgCisgICAgICBpZihVcExvPT0oVXBwZXJ8TG93ZXIpKQorICAgICAgeworICAgICAgICBJbmRleCBrID0gY291bnRbU3RvcmFnZU9yZGVyTWF0Y2ggPyBqcCA6IGlwXSsrOworICAgICAgICBkZXN0LmlubmVySW5kZXhQdHIoKVtrXSA9IFN0b3JhZ2VPcmRlck1hdGNoID8gaXAgOiBqcDsKKyAgICAgICAgZGVzdC52YWx1ZVB0cigpW2tdID0gaXQudmFsdWUoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYocj09YykKKyAgICAgIHsKKyAgICAgICAgSW5kZXggayA9IGNvdW50W2lwXSsrOworICAgICAgICBkZXN0LmlubmVySW5kZXhQdHIoKVtrXSA9IGlwOworICAgICAgICBkZXN0LnZhbHVlUHRyKClba10gPSBpdC52YWx1ZSgpOworICAgICAgfQorICAgICAgZWxzZSBpZigoIChVcExvJkxvd2VyKT09TG93ZXIgJiYgcj5jKSB8fCAoIChVcExvJlVwcGVyKT09VXBwZXIgJiYgcjxjKSkKKyAgICAgIHsKKyAgICAgICAgaWYoIVN0b3JhZ2VPcmRlck1hdGNoKQorICAgICAgICAgIHN0ZDo6c3dhcChpcCxqcCk7CisgICAgICAgIEluZGV4IGsgPSBjb3VudFtqcF0rKzsKKyAgICAgICAgZGVzdC5pbm5lckluZGV4UHRyKClba10gPSBpcDsKKyAgICAgICAgZGVzdC52YWx1ZVB0cigpW2tdID0gaXQudmFsdWUoKTsKKyAgICAgICAgayA9IGNvdW50W2lwXSsrOworICAgICAgICBkZXN0LmlubmVySW5kZXhQdHIoKVtrXSA9IGpwOworICAgICAgICBkZXN0LnZhbHVlUHRyKClba10gPSBpbnRlcm5hbDo6Y29uaihpdC52YWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGU8aW50IF9TcmNVcExvLGludCBfRHN0VXBMbyx0eXBlbmFtZSBNYXRyaXhUeXBlLGludCBEc3RPcmRlcj4KK3ZvaWQgcGVybXV0ZV9zeW1tX3RvX3N5bW0oY29uc3QgTWF0cml4VHlwZSYgbWF0LCBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLERzdE9yZGVyLHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4PiYgX2Rlc3QsIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4KiBwZXJtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIFNwYXJzZU1hdHJpeDxTY2FsYXIsRHN0T3JkZXIsSW5kZXg+JiBkZXN0KF9kZXN0LmRlcml2ZWQoKSk7CisgIHR5cGVkZWYgTWF0cml4PEluZGV4LER5bmFtaWMsMT4gVmVjdG9ySTsKKyAgZW51bSB7CisgICAgU3JjT3JkZXIgPSBNYXRyaXhUeXBlOjpJc1Jvd01ham9yID8gUm93TWFqb3IgOiBDb2xNYWpvciwKKyAgICBTdG9yYWdlT3JkZXJNYXRjaCA9IGludChTcmNPcmRlcikgPT0gaW50KERzdE9yZGVyKSwKKyAgICBEc3RVcExvID0gRHN0T3JkZXI9PVJvd01ham9yID8gKF9Ec3RVcExvPT1VcHBlciA/IExvd2VyIDogVXBwZXIpIDogX0RzdFVwTG8sCisgICAgU3JjVXBMbyA9IFNyY09yZGVyPT1Sb3dNYWpvciA/IChfU3JjVXBMbz09VXBwZXIgPyBMb3dlciA6IFVwcGVyKSA6IF9TcmNVcExvCisgIH07CisgIAorICBJbmRleCBzaXplID0gbWF0LnJvd3MoKTsKKyAgVmVjdG9ySSBjb3VudChzaXplKTsKKyAgY291bnQuc2V0WmVybygpOworICBkZXN0LnJlc2l6ZShzaXplLHNpemUpOworICBmb3IoSW5kZXggaiA9IDA7IGo8c2l6ZTsgKytqKQorICB7CisgICAgSW5kZXgganAgPSBwZXJtID8gcGVybVtqXSA6IGo7CisgICAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobWF0LGopOyBpdDsgKytpdCkKKyAgICB7CisgICAgICBJbmRleCBpID0gaXQuaW5kZXgoKTsKKyAgICAgIGlmKChpbnQoU3JjVXBMbyk9PWludChMb3dlcikgJiYgaTxqKSB8fCAoaW50KFNyY1VwTG8pPT1pbnQoVXBwZXIpICYmIGk+aikpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgCisgICAgICBJbmRleCBpcCA9IHBlcm0gPyBwZXJtW2ldIDogaTsKKyAgICAgIGNvdW50W2ludChEc3RVcExvKT09aW50KExvd2VyKSA/IChzdGQ6Om1pbikoaXAsanApIDogKHN0ZDo6bWF4KShpcCxqcCldKys7CisgICAgfQorICB9CisgIGRlc3Qub3V0ZXJJbmRleFB0cigpWzBdID0gMDsKKyAgZm9yKEluZGV4IGo9MDsgajxzaXplOyArK2opCisgICAgZGVzdC5vdXRlckluZGV4UHRyKClbaisxXSA9IGRlc3Qub3V0ZXJJbmRleFB0cigpW2pdICsgY291bnRbal07CisgIGRlc3QucmVzaXplTm9uWmVyb3MoZGVzdC5vdXRlckluZGV4UHRyKClbc2l6ZV0pOworICBmb3IoSW5kZXggaj0wOyBqPHNpemU7ICsraikKKyAgICBjb3VudFtqXSA9IGRlc3Qub3V0ZXJJbmRleFB0cigpW2pdOworICAKKyAgZm9yKEluZGV4IGogPSAwOyBqPHNpemU7ICsraikKKyAgeworICAgIAorICAgIGZvcih0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KG1hdCxqKTsgaXQ7ICsraXQpCisgICAgeworICAgICAgSW5kZXggaSA9IGl0LmluZGV4KCk7CisgICAgICBpZigoaW50KFNyY1VwTG8pPT1pbnQoTG93ZXIpICYmIGk8aikgfHwgKGludChTcmNVcExvKT09aW50KFVwcGVyKSAmJiBpPmopKQorICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgSW5kZXgganAgPSBwZXJtID8gcGVybVtqXSA6IGo7CisgICAgICBJbmRleCBpcCA9IHBlcm0/IHBlcm1baV0gOiBpOworICAgICAgCisgICAgICBJbmRleCBrID0gY291bnRbaW50KERzdFVwTG8pPT1pbnQoTG93ZXIpID8gKHN0ZDo6bWluKShpcCxqcCkgOiAoc3RkOjptYXgpKGlwLGpwKV0rKzsKKyAgICAgIGRlc3QuaW5uZXJJbmRleFB0cigpW2tdID0gaW50KERzdFVwTG8pPT1pbnQoTG93ZXIpID8gKHN0ZDo6bWF4KShpcCxqcCkgOiAoc3RkOjptaW4pKGlwLGpwKTsKKyAgICAgIAorICAgICAgaWYoIVN0b3JhZ2VPcmRlck1hdGNoKSBzdGQ6OnN3YXAoaXAsanApOworICAgICAgaWYoICgoaW50KERzdFVwTG8pPT1pbnQoTG93ZXIpICYmIGlwPGpwKSB8fCAoaW50KERzdFVwTG8pPT1pbnQoVXBwZXIpICYmIGlwPmpwKSkpCisgICAgICAgIGRlc3QudmFsdWVQdHIoKVtrXSA9IGNvbmooaXQudmFsdWUoKSk7CisgICAgICBlbHNlCisgICAgICAgIGRlc3QudmFsdWVQdHIoKVtrXSA9IGl0LnZhbHVlKCk7CisgICAgfQorICB9Cit9CisKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSxpbnQgVXBMbz4KK2NsYXNzIFNwYXJzZVN5bW1ldHJpY1Blcm11dGF0aW9uUHJvZHVjdAorICA6IHB1YmxpYyBFaWdlbkJhc2U8U3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0PE1hdHJpeFR5cGUsVXBMbz4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHByb3RlY3RlZDoKKyAgICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYyxJbmRleD4gUGVybTsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgTWF0cml4PEluZGV4LER5bmFtaWMsMT4gVmVjdG9ySTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6Ok5lc3RlZCBNYXRyaXhUeXBlTmVzdGVkOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgX01hdHJpeFR5cGVOZXN0ZWQ7CisgICAgCisgICAgU3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0KGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgUGVybSYgcGVybSkKKyAgICAgIDogbV9tYXRyaXgobWF0KSwgbV9wZXJtKHBlcm0pCisgICAge30KKyAgICAKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguY29scygpOyB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdFNjYWxhciwgaW50IE9wdGlvbnMsIHR5cGVuYW1lIERzdEluZGV4PgorICAgIHZvaWQgZXZhbFRvKFNwYXJzZU1hdHJpeDxEZXN0U2NhbGFyLE9wdGlvbnMsRHN0SW5kZXg+JiBfZGVzdCkgY29uc3QKKyAgICB7CisgICAgICBpbnRlcm5hbDo6cGVybXV0ZV9zeW1tX3RvX2Z1bGxzeW1tPFVwTG8+KG1fbWF0cml4LF9kZXN0LG1fcGVybS5pbmRpY2VzKCkuZGF0YSgpKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdFR5cGUsdW5zaWduZWQgaW50IERlc3RVcExvPiB2b2lkIGV2YWxUbyhTcGFyc2VTZWxmQWRqb2ludFZpZXc8RGVzdFR5cGUsRGVzdFVwTG8+JiBkZXN0KSBjb25zdAorICAgIHsKKyAgICAgIGludGVybmFsOjpwZXJtdXRlX3N5bW1fdG9fc3ltbTxVcExvLERlc3RVcExvPihtX21hdHJpeCxkZXN0Lm1hdHJpeCgpLG1fcGVybS5pbmRpY2VzKCkuZGF0YSgpKTsKKyAgICB9CisgICAgCisgIHByb3RlY3RlZDoKKyAgICBNYXRyaXhUeXBlTmVzdGVkIG1fbWF0cml4OworICAgIGNvbnN0IFBlcm0mIG1fcGVybTsKKworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfU0VMRkFESk9JTlRWSUVXX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVNwYXJzZVByb2R1Y3RXaXRoUHJ1bmluZy5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlU3BhcnNlUHJvZHVjdFdpdGhQcnVuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzOGFjNQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVNwYXJzZVByb2R1Y3RXaXRoUHJ1bmluZy5oCkBAIC0wLDAgKzEsMTQ5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VTUEFSU0VQUk9EVUNUV0lUSFBSVU5JTkdfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VTUEFSU0VQUk9EVUNUV0lUSFBSVU5JTkdfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworCisvLyBwZXJmb3JtIGEgcHNldWRvIGluLXBsYWNlIHNwYXJzZSAqIHNwYXJzZSBwcm9kdWN0IGFzc3VtaW5nIGFsbCBtYXRyaWNlcyBhcmUgY29sIG1ham9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUmVzdWx0VHlwZT4KK3N0YXRpYyB2b2lkIHNwYXJzZV9zcGFyc2VfcHJvZHVjdF93aXRoX3BydW5pbmdfaW1wbChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlc3VsdFR5cGUmIHJlcywgdHlwZW5hbWUgUmVzdWx0VHlwZTo6UmVhbFNjYWxhciB0b2xlcmFuY2UpCit7CisgIC8vIHJldHVybiBzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX2ltcGwyKGxocyxyaHMscmVzKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzPjo6dHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGU6OkluZGV4IEluZGV4OworCisgIC8vIG1ha2Ugc3VyZSB0byBjYWxsIGlubmVyU2l6ZS9vdXRlclNpemUgc2luY2Ugd2UgZmFrZSB0aGUgc3RvcmFnZSBvcmRlci4KKyAgSW5kZXggcm93cyA9IGxocy5pbm5lclNpemUoKTsKKyAgSW5kZXggY29scyA9IHJocy5vdXRlclNpemUoKTsKKyAgLy9pbnQgc2l6ZSA9IGxocy5vdXRlclNpemUoKTsKKyAgZWlnZW5fYXNzZXJ0KGxocy5vdXRlclNpemUoKSA9PSByaHMuaW5uZXJTaXplKCkpOworCisgIC8vIGFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlcgorICBBbWJpVmVjdG9yPFNjYWxhcixJbmRleD4gdGVtcFZlY3Rvcihyb3dzKTsKKworICAvLyBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvIGVudHJpZXMKKyAgLy8gZ2l2ZW4gYSByaHMgY29sdW1uIGNvbnRhaW5pbmcgWSBub24gemVyb3MsIHdlIGFzc3VtZSB0aGF0IHRoZSByZXNwZWN0aXZlIFkgY29sdW1ucworICAvLyBvZiB0aGUgbGhzIGRpZmZlcnMgaW4gYXZlcmFnZSBvZiBvbmUgbm9uIHplcm9zLCB0aHVzIHRoZSBudW1iZXIgb2Ygbm9uIHplcm9zIGZvcgorICAvLyB0aGUgcHJvZHVjdCBvZiBhIHJocyBjb2x1bW4gd2l0aCB0aGUgbGhzIGlzIFgrWSB3aGVyZSBYIGlzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBub24gemVybworICAvLyBwZXIgY29sdW1uIG9mIHRoZSBsaHMuCisgIC8vIFRoZXJlZm9yZSwgd2UgaGF2ZSBubnoobGhzKnJocykgPSBubnoobGhzKSArIG5ueihyaHMpCisgIEluZGV4IGVzdGltYXRlZF9ubnpfcHJvZCA9IGxocy5ub25aZXJvcygpICsgcmhzLm5vblplcm9zKCk7CisKKyAgLy8gbWltaWNzIGEgcmVzaXplQnlJbm5lck91dGVyOgorICBpZihSZXN1bHRUeXBlOjpJc1Jvd01ham9yKQorICAgIHJlcy5yZXNpemUoY29scywgcm93cyk7CisgIGVsc2UKKyAgICByZXMucmVzaXplKHJvd3MsIGNvbHMpOworCisgIHJlcy5yZXNlcnZlKGVzdGltYXRlZF9ubnpfcHJvZCk7CisgIGRvdWJsZSByYXRpb0NvbFJlcyA9IGRvdWJsZShlc3RpbWF0ZWRfbm56X3Byb2QpL2RvdWJsZShsaHMucm93cygpKnJocy5jb2xzKCkpOworICBmb3IgKEluZGV4IGo9MDsgajxjb2xzOyArK2opCisgIHsKKyAgICAvLyBGSVhNRToKKyAgICAvL2RvdWJsZSByYXRpb0NvbFJlcyA9IChkb3VibGUocmhzLmlubmVyVmVjdG9yKGopLm5vblplcm9zKCkpICsgZG91YmxlKGxocy5ub25aZXJvcygpKS9kb3VibGUobGhzLmNvbHMoKSkpL2RvdWJsZShsaHMucm93cygpKTsKKyAgICAvLyBsZXQncyBkbyBhIG1vcmUgYWNjdXJhdGUgZGV0ZXJtaW5hdGlvbiBvZiB0aGUgbm56IHJhdGlvIGZvciB0aGUgY3VycmVudCBjb2x1bW4gaiBvZiByZXMKKyAgICB0ZW1wVmVjdG9yLmluaXQocmF0aW9Db2xSZXMpOworICAgIHRlbXBWZWN0b3Iuc2V0WmVybygpOworICAgIGZvciAodHlwZW5hbWUgUmhzOjpJbm5lckl0ZXJhdG9yIHJoc0l0KHJocywgaik7IHJoc0l0OyArK3Joc0l0KQorICAgIHsKKyAgICAgIC8vIEZJWE1FIHNob3VsZCBiZSB3cml0dGVuIGxpa2UgdGhpczogdG1wICs9IHJoc0l0LnZhbHVlKCkgKiBsaHMuY29sKHJoc0l0LmluZGV4KCkpCisgICAgICB0ZW1wVmVjdG9yLnJlc3RhcnQoKTsKKyAgICAgIFNjYWxhciB4ID0gcmhzSXQudmFsdWUoKTsKKyAgICAgIGZvciAodHlwZW5hbWUgTGhzOjpJbm5lckl0ZXJhdG9yIGxoc0l0KGxocywgcmhzSXQuaW5kZXgoKSk7IGxoc0l0OyArK2xoc0l0KQorICAgICAgeworICAgICAgICB0ZW1wVmVjdG9yLmNvZWZmUmVmKGxoc0l0LmluZGV4KCkpICs9IGxoc0l0LnZhbHVlKCkgKiB4OworICAgICAgfQorICAgIH0KKyAgICByZXMuc3RhcnRWZWMoaik7CisgICAgZm9yICh0eXBlbmFtZSBBbWJpVmVjdG9yPFNjYWxhcixJbmRleD46Okl0ZXJhdG9yIGl0KHRlbXBWZWN0b3IsdG9sZXJhbmNlKTsgaXQ7ICsraXQpCisgICAgICByZXMuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihqLGl0LmluZGV4KCkpID0gaXQudmFsdWUoKTsKKyAgfQorICByZXMuZmluYWxpemUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGUsCisgIGludCBMaHNTdG9yYWdlT3JkZXIgPSB0cmFpdHM8TGhzPjo6RmxhZ3MmUm93TWFqb3JCaXQsCisgIGludCBSaHNTdG9yYWdlT3JkZXIgPSB0cmFpdHM8UmhzPjo6RmxhZ3MmUm93TWFqb3JCaXQsCisgIGludCBSZXNTdG9yYWdlT3JkZXIgPSB0cmFpdHM8UmVzdWx0VHlwZT46OkZsYWdzJlJvd01ham9yQml0Pgorc3RydWN0IHNwYXJzZV9zcGFyc2VfcHJvZHVjdF93aXRoX3BydW5pbmdfc2VsZWN0b3I7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IHNwYXJzZV9zcGFyc2VfcHJvZHVjdF93aXRoX3BydW5pbmdfc2VsZWN0b3I8TGhzLFJocyxSZXN1bHRUeXBlLENvbE1ham9yLENvbE1ham9yLENvbE1ham9yPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czx0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGU+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFJlc3VsdFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMsIFJlYWxTY2FsYXIgdG9sZXJhbmNlKQorICB7CisgICAgdHlwZW5hbWUgcmVtb3ZlX2FsbDxSZXN1bHRUeXBlPjo6dHlwZSBfcmVzKHJlcy5yb3dzKCksIHJlcy5jb2xzKCkpOworICAgIGludGVybmFsOjpzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX2ltcGw8TGhzLFJocyxSZXN1bHRUeXBlPihsaHMsIHJocywgX3JlcywgdG9sZXJhbmNlKTsKKyAgICByZXMuc3dhcChfcmVzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsQ29sTWFqb3IsQ29sTWFqb3IsUm93TWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVzdWx0VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMsIFJlYWxTY2FsYXIgdG9sZXJhbmNlKQorICB7CisgICAgLy8gd2UgbmVlZCBhIGNvbC1tYWpvciBtYXRyaXggdG8gaG9sZCB0aGUgcmVzdWx0CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyPiBTcGFyc2VUZW1wb3JhcnlUeXBlOworICAgIFNwYXJzZVRlbXBvcmFyeVR5cGUgX3JlcyhyZXMucm93cygpLCByZXMuY29scygpKTsKKyAgICBpbnRlcm5hbDo6c3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19pbXBsPExocyxSaHMsU3BhcnNlVGVtcG9yYXJ5VHlwZT4obGhzLCByaHMsIF9yZXMsIHRvbGVyYW5jZSk7CisgICAgcmVzID0gX3JlczsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsUm93TWFqb3IsUm93TWFqb3IsUm93TWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVzdWx0VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMsIFJlYWxTY2FsYXIgdG9sZXJhbmNlKQorICB7CisgICAgLy8gbGV0J3MgdHJhbnNwb3NlIHRoZSBwcm9kdWN0IHRvIGdldCBhIGNvbHVtbiB4IGNvbHVtbiBwcm9kdWN0CisgICAgdHlwZW5hbWUgcmVtb3ZlX2FsbDxSZXN1bHRUeXBlPjo6dHlwZSBfcmVzKHJlcy5yb3dzKCksIHJlcy5jb2xzKCkpOworICAgIGludGVybmFsOjpzcGFyc2Vfc3BhcnNlX3Byb2R1Y3Rfd2l0aF9wcnVuaW5nX2ltcGw8UmhzLExocyxSZXN1bHRUeXBlPihyaHMsIGxocywgX3JlcywgdG9sZXJhbmNlKTsKKyAgICByZXMuc3dhcChfcmVzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19zZWxlY3RvcjxMaHMsUmhzLFJlc3VsdFR5cGUsUm93TWFqb3IsUm93TWFqb3IsQ29sTWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmVzdWx0VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlJiByZXMsIFJlYWxTY2FsYXIgdG9sZXJhbmNlKQorICB7CisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmVzdWx0VHlwZTo6U2NhbGFyLENvbE1ham9yPiBDb2xNYWpvck1hdHJpeDsKKyAgICBDb2xNYWpvck1hdHJpeCBjb2xMaHMobGhzKTsKKyAgICBDb2xNYWpvck1hdHJpeCBjb2xSaHMocmhzKTsKKyAgICBpbnRlcm5hbDo6c3BhcnNlX3NwYXJzZV9wcm9kdWN0X3dpdGhfcHJ1bmluZ19pbXBsPENvbE1ham9yTWF0cml4LENvbE1ham9yTWF0cml4LFJlc3VsdFR5cGU+KGNvbExocywgY29sUmhzLCByZXMsIHRvbGVyYW5jZSk7CisKKyAgICAvLyBsZXQncyB0cmFuc3Bvc2UgdGhlIHByb2R1Y3QgdG8gZ2V0IGEgY29sdW1uIHggY29sdW1uIHByb2R1Y3QKKy8vICAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDx0eXBlbmFtZSBSZXN1bHRUeXBlOjpTY2FsYXI+IFNwYXJzZVRlbXBvcmFyeVR5cGU7CisvLyAgICAgU3BhcnNlVGVtcG9yYXJ5VHlwZSBfcmVzKHJlcy5jb2xzKCksIHJlcy5yb3dzKCkpOworLy8gICAgIHNwYXJzZV9zcGFyc2VfcHJvZHVjdF93aXRoX3BydW5pbmdfaW1wbDxSaHMsTGhzLFNwYXJzZVRlbXBvcmFyeVR5cGU+KHJocywgbGhzLCBfcmVzKTsKKy8vICAgICByZXMgPSBfcmVzLnRyYW5zcG9zZSgpOworICB9Cit9OworCisvLyBOT1RFIHRoZSAyIG90aGVycyBjYXNlcyAoY29sIHJvdyAqKSBtdXN0IG5ldmVyIG9jY3VyIHNpbmNlIHRoZXkgYXJlIGNhdWdodAorLy8gYnkgUHJvZHVjdFJldHVyblR5cGUgd2hpY2ggdHJhbnNmb3JtcyBpdCB0byAoY29sIGNvbCAqKSBieSBldmFsdWF0aW5nIHJocy4KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFU1BBUlNFUFJPRFVDVFdJVEhQUlVOSU5HX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVRyYW5zcG9zZS5oIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlVHJhbnNwb3NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZjlkZQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVRyYW5zcG9zZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRVRSQU5TUE9TRV9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRVRSQU5TUE9TRV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBUcmFuc3Bvc2VJbXBsPE1hdHJpeFR5cGUsU3BhcnNlPgorICA6IHB1YmxpYyBTcGFyc2VNYXRyaXhCYXNlPFRyYW5zcG9zZTxNYXRyaXhUeXBlPiA+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQ+Ojp0eXBlIF9NYXRyaXhUeXBlTmVzdGVkOworICBwdWJsaWM6CisKKyAgICBFSUdFTl9TUEFSU0VfUFVCTElDX0lOVEVSRkFDRShUcmFuc3Bvc2U8TWF0cml4VHlwZT4pCisKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yOworICAgIGNsYXNzIFJldmVyc2VJbm5lckl0ZXJhdG9yOworCisgICAgaW5saW5lIEluZGV4IG5vblplcm9zKCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKS5ub25aZXJvcygpOyB9Cit9OworCisvLyBOT1RFOiBWQzEwIHRyaWdnZXIgYW4gSUNFIGlmIGRvbid0IHB1dCB0eXBlbmFtZSBUcmFuc3Bvc2VJbXBsPE1hdHJpeFR5cGUsU3BhcnNlPjo6IGluIGZyb250IG9mIEluZGV4LAorLy8gYSB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zcG9zZUltcGw8TWF0cml4VHlwZSxTcGFyc2U+OjpJbmRleCBJbmRleDsKKy8vIGRvZXMgbm90IGZpeCB0aGUgaXNzdWUuCisvLyBBbiBhbHRlcm5hdGl2ZSBpcyB0byBkZWZpbmUgdGhlIG5lc3RlZCBjbGFzcyBpbiB0aGUgcGFyZW50IGNsYXNzIGl0c2VsZi4KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IGNsYXNzIFRyYW5zcG9zZUltcGw8TWF0cml4VHlwZSxTcGFyc2U+OjpJbm5lckl0ZXJhdG9yCisgIDogcHVibGljIF9NYXRyaXhUeXBlTmVzdGVkOjpJbm5lckl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZU5lc3RlZDo6SW5uZXJJdGVyYXRvciBCYXNlOworICBwdWJsaWM6CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3QgVHJhbnNwb3NlSW1wbCYgdHJhbnMsIHR5cGVuYW1lIFRyYW5zcG9zZUltcGw8TWF0cml4VHlwZSxTcGFyc2U+OjpJbmRleCBvdXRlcikKKyAgICAgIDogQmFzZSh0cmFucy5kZXJpdmVkKCkubmVzdGVkRXhwcmVzc2lvbigpLCBvdXRlcikKKyAgICB7fQorICAgIGlubGluZSB0eXBlbmFtZSBUcmFuc3Bvc2VJbXBsPE1hdHJpeFR5cGUsU3BhcnNlPjo6SW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gQmFzZTo6Y29sKCk7IH0KKyAgICBpbmxpbmUgdHlwZW5hbWUgVHJhbnNwb3NlSW1wbDxNYXRyaXhUeXBlLFNwYXJzZT46OkluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIEJhc2U6OnJvdygpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBjbGFzcyBUcmFuc3Bvc2VJbXBsPE1hdHJpeFR5cGUsU3BhcnNlPjo6UmV2ZXJzZUlubmVySXRlcmF0b3IKKyAgOiBwdWJsaWMgX01hdHJpeFR5cGVOZXN0ZWQ6OlJldmVyc2VJbm5lckl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfTWF0cml4VHlwZU5lc3RlZDo6UmV2ZXJzZUlubmVySXRlcmF0b3IgQmFzZTsKKyAgcHVibGljOgorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBSZXZlcnNlSW5uZXJJdGVyYXRvcihjb25zdCBUcmFuc3Bvc2VJbXBsJiB4cHIsIHR5cGVuYW1lIFRyYW5zcG9zZUltcGw8TWF0cml4VHlwZSxTcGFyc2U+OjpJbmRleCBvdXRlcikKKyAgICAgIDogQmFzZSh4cHIuZGVyaXZlZCgpLm5lc3RlZEV4cHJlc3Npb24oKSwgb3V0ZXIpCisgICAge30KKyAgICBpbmxpbmUgdHlwZW5hbWUgVHJhbnNwb3NlSW1wbDxNYXRyaXhUeXBlLFNwYXJzZT46OkluZGV4IHJvdygpIGNvbnN0IHsgcmV0dXJuIEJhc2U6OmNvbCgpOyB9CisgICAgaW5saW5lIHR5cGVuYW1lIFRyYW5zcG9zZUltcGw8TWF0cml4VHlwZSxTcGFyc2U+OjpJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBCYXNlOjpyb3coKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VUUkFOU1BPU0VfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlVHJpYW5ndWxhclZpZXcuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVRyaWFuZ3VsYXJWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3ZTRiZAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVRyaWFuZ3VsYXJWaWV3LmgKQEAgLTAsMCArMSwxNjQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfVFJJQU5HVUxBUlZJRVdfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfVFJJQU5HVUxBUlZJRVdfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKyAgCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgTW9kZT4KK3N0cnVjdCB0cmFpdHM8U3BhcnNlVHJpYW5ndWxhclZpZXc8TWF0cml4VHlwZSxNb2RlPiA+Cis6IHB1YmxpYyB0cmFpdHM8TWF0cml4VHlwZT4KK3t9OworCit9IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgTW9kZT4gY2xhc3MgU3BhcnNlVHJpYW5ndWxhclZpZXcKKyAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLE1vZGU+ID4KK3sKKyAgICBlbnVtIHsgU2tpcEZpcnN0ID0gKChNb2RlJkxvd2VyKSAmJiAhKE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0KSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKChNb2RlJlVwcGVyKSAmJiAgKE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0KSksCisgICAgICAgICAgIFNraXBMYXN0ID0gIVNraXBGaXJzdCwKKyAgICAgICAgICAgSGFzVW5pdERpYWcgPSAoTW9kZSZVbml0RGlhZykgPyAxIDogMAorICAgIH07CisKKyAgcHVibGljOgorICAgIAorICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFNwYXJzZVRyaWFuZ3VsYXJWaWV3KQorCisgICAgY2xhc3MgSW5uZXJJdGVyYXRvcjsKKyAgICBjbGFzcyBSZXZlcnNlSW5uZXJJdGVyYXRvcjsKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIE1hdHJpeFR5cGVOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX3JlZmVyZW5jZTxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSBNYXRyaXhUeXBlTmVzdGVkTm9uUmVmOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8TWF0cml4VHlwZU5lc3RlZD46OnR5cGUgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQ7CisKKyAgICBpbmxpbmUgU3BhcnNlVHJpYW5ndWxhclZpZXcoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KSA6IG1fbWF0cml4KG1hdHJpeCkge30KKworICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICBpbmxpbmUgY29uc3QgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQmIG5lc3RlZEV4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBtX21hdHJpeDsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZV9jb2x1bW5fbWFqb3I8T3RoZXJEZXJpdmVkPjo6dHlwZQorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiB2b2lkIHNvbHZlSW5QbGFjZShNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IHZvaWQgc29sdmVJblBsYWNlKFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0OworCisgIHByb3RlY3RlZDoKKyAgICBNYXRyaXhUeXBlTmVzdGVkIG1fbWF0cml4OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IE1vZGU+CitjbGFzcyBTcGFyc2VUcmlhbmd1bGFyVmlldzxNYXRyaXhUeXBlLE1vZGU+OjpJbm5lckl0ZXJhdG9yIDogcHVibGljIE1hdHJpeFR5cGVOZXN0ZWRDbGVhbmVkOjpJbm5lckl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDo6SW5uZXJJdGVyYXRvciBCYXNlOworICBwdWJsaWM6CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIElubmVySXRlcmF0b3IoY29uc3QgU3BhcnNlVHJpYW5ndWxhclZpZXcmIHZpZXcsIEluZGV4IG91dGVyKQorICAgICAgOiBCYXNlKHZpZXcubmVzdGVkRXhwcmVzc2lvbigpLCBvdXRlciksIG1fcmV0dXJuT25lKGZhbHNlKQorICAgIHsKKyAgICAgIGlmKFNraXBGaXJzdCkKKyAgICAgIHsKKyAgICAgICAgd2hpbGUoKCp0aGlzKSAmJiAoSGFzVW5pdERpYWcgPyB0aGlzLT5pbmRleCgpPD1vdXRlciA6IHRoaXMtPmluZGV4KCk8b3V0ZXIpKQorICAgICAgICAgIEJhc2U6Om9wZXJhdG9yKysoKTsKKyAgICAgICAgaWYoSGFzVW5pdERpYWcpCisgICAgICAgICAgbV9yZXR1cm5PbmUgPSB0cnVlOworICAgICAgfQorICAgICAgZWxzZSBpZihIYXNVbml0RGlhZyAmJiAoKCFCYXNlOjpvcGVyYXRvciBib29sKCkpIHx8IEJhc2U6OmluZGV4KCk+PUJhc2U6Om91dGVyKCkpKQorICAgICAgeworICAgICAgICBpZigoIVNraXBGaXJzdCkgJiYgQmFzZTo6b3BlcmF0b3IgYm9vbCgpKQorICAgICAgICAgIEJhc2U6Om9wZXJhdG9yKysoKTsKKyAgICAgICAgbV9yZXR1cm5PbmUgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgaWYoSGFzVW5pdERpYWcgJiYgbV9yZXR1cm5PbmUpCisgICAgICAgIG1fcmV0dXJuT25lID0gZmFsc2U7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIEJhc2U6Om9wZXJhdG9yKysoKTsKKyAgICAgICAgaWYoSGFzVW5pdERpYWcgJiYgKCFTa2lwRmlyc3QpICYmICgoIUJhc2U6Om9wZXJhdG9yIGJvb2woKSkgfHwgQmFzZTo6aW5kZXgoKT49QmFzZTo6b3V0ZXIoKSkpCisgICAgICAgIHsKKyAgICAgICAgICBpZigoIVNraXBGaXJzdCkgJiYgQmFzZTo6b3BlcmF0b3IgYm9vbCgpKQorICAgICAgICAgICAgQmFzZTo6b3BlcmF0b3IrKygpOworICAgICAgICAgIG1fcmV0dXJuT25lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBCYXNlOjpyb3coKTsgfQorICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBCYXNlOjpjb2woKTsgfQorICAgIGlubGluZSBJbmRleCBpbmRleCgpIGNvbnN0CisgICAgeworICAgICAgaWYoSGFzVW5pdERpYWcgJiYgbV9yZXR1cm5PbmUpICByZXR1cm4gQmFzZTo6b3V0ZXIoKTsKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2U6OmluZGV4KCk7CisgICAgfQorICAgIGlubGluZSBTY2FsYXIgdmFsdWUoKSBjb25zdAorICAgIHsKKyAgICAgIGlmKEhhc1VuaXREaWFnICYmIG1fcmV0dXJuT25lKSAgcmV0dXJuIFNjYWxhcigxKTsKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2U6OnZhbHVlKCk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBvcGVyYXRvciBib29sKCkgY29uc3QKKyAgICB7CisgICAgICBpZihIYXNVbml0RGlhZyAmJiBtX3JldHVybk9uZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gKFNraXBGaXJzdCA/IEJhc2U6Om9wZXJhdG9yIGJvb2woKSA6IChCYXNlOjpvcGVyYXRvciBib29sKCkgJiYgdGhpcy0+aW5kZXgoKSA8PSB0aGlzLT5vdXRlcigpKSk7CisgICAgfQorICBwcm90ZWN0ZWQ6CisgICAgYm9vbCBtX3JldHVybk9uZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBNb2RlPgorY2xhc3MgU3BhcnNlVHJpYW5ndWxhclZpZXc8TWF0cml4VHlwZSxNb2RlPjo6UmV2ZXJzZUlubmVySXRlcmF0b3IgOiBwdWJsaWMgTWF0cml4VHlwZU5lc3RlZENsZWFuZWQ6OlJldmVyc2VJbm5lckl0ZXJhdG9yCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlTmVzdGVkQ2xlYW5lZDo6UmV2ZXJzZUlubmVySXRlcmF0b3IgQmFzZTsKKyAgcHVibGljOgorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBSZXZlcnNlSW5uZXJJdGVyYXRvcihjb25zdCBTcGFyc2VUcmlhbmd1bGFyVmlldyYgdmlldywgSW5kZXggb3V0ZXIpCisgICAgICA6IEJhc2Uodmlldy5uZXN0ZWRFeHByZXNzaW9uKCksIG91dGVyKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydCgoIUhhc1VuaXREaWFnKSAmJiAiUmV2ZXJzZUlubmVySXRlcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCB5ZXQgdHJpYW5ndWxhciB2aWV3cyB3aXRoIGEgdW5pdCBkaWFnb25hbCIpOworICAgICAgaWYoU2tpcExhc3QpCisgICAgICAgIHdoaWxlKCgqdGhpcykgJiYgdGhpcy0+aW5kZXgoKT5vdXRlcikKKyAgICAgICAgICAtLSgqdGhpcyk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbm5lckl0ZXJhdG9yJiBvcGVyYXRvci0tKCkKKyAgICB7IEJhc2U6Om9wZXJhdG9yLS0oKTsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gQmFzZTo6cm93KCk7IH0KKyAgICBpbmxpbmUgSW5kZXggY29sKCkgY29uc3QgeyByZXR1cm4gQmFzZTo6Y29sKCk7IH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIFNraXBMYXN0ID8gQmFzZTo6b3BlcmF0b3IgYm9vbCgpIDogKEJhc2U6Om9wZXJhdG9yIGJvb2woKSAmJiB0aGlzLT5pbmRleCgpID49IHRoaXMtPm91dGVyKCkpOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTxpbnQgTW9kZT4KK2lubGluZSBjb25zdCBTcGFyc2VUcmlhbmd1bGFyVmlldzxEZXJpdmVkLCBNb2RlPgorU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPjo6dHJpYW5ndWxhclZpZXcoKSBjb25zdAoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRV9UUklBTkdVTEFSVklFV19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VVdGlsLmggYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2MmEwOAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVV0aWwuaApAQCAtMCwwICsxLDE3MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRVVUSUxfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VVVElMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKyNpZmRlZiBOREVCVUcKKyNkZWZpbmUgRUlHRU5fREJHX1NQQVJTRShYKQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fREJHX1NQQVJTRShYKSBYCisjZW5kaWYKKworI2RlZmluZSBFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsIE9wKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+IFwKK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgb3BlcmF0b3IgT3AoY29uc3QgRWlnZW46OlNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIFwKK3sgXAorICByZXR1cm4gQmFzZTo6b3BlcmF0b3IgT3Aob3RoZXIuZGVyaXZlZCgpKTsgXAorfSBcCitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yIE9wKGNvbnN0IERlcml2ZWQmIG90aGVyKSBcCit7IFwKKyAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yIE9wKG90aGVyKTsgXAorfQorCisjZGVmaW5lIEVJR0VOX1NQQVJTRV9JTkhFUklUX1NDQUxBUl9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsIE9wKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4gXAorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvciBPcChjb25zdCBPdGhlciYgc2NhbGFyKSBcCit7IFwKKyAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yIE9wKHNjYWxhcik7IFwKK30KKworI2RlZmluZSBFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SUyhEZXJpdmVkKSBcCitFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsID0pIFwKK0VJR0VOX1NQQVJTRV9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1IoRGVyaXZlZCwgKz0pIFwKK0VJR0VOX1NQQVJTRV9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1IoRGVyaXZlZCwgLT0pIFwKK0VJR0VOX1NQQVJTRV9JTkhFUklUX1NDQUxBUl9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsICo9KSBcCitFSUdFTl9TUEFSU0VfSU5IRVJJVF9TQ0FMQVJfQVNTSUdOTUVOVF9PUEVSQVRPUihEZXJpdmVkLCAvPSkKKworI2RlZmluZSBfRUlHRU5fU1BBUlNFX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCwgQmFzZUNsYXNzKSBcCisgIHR5cGVkZWYgQmFzZUNsYXNzIEJhc2U7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkID46OlNjYWxhciBTY2FsYXI7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsgXAorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6bmVzdGVkPERlcml2ZWQgPjo6dHlwZSBOZXN0ZWQ7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkID46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8RGVyaXZlZCA+OjpJbmRleCBJbmRleDsgXAorICBlbnVtIHsgUm93c0F0Q29tcGlsZVRpbWUgPSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkID46OlJvd3NBdENvbXBpbGVUaW1lLCBcCisgICAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gRWlnZW46OmludGVybmFsOjp0cmFpdHM8RGVyaXZlZCA+OjpDb2xzQXRDb21waWxlVGltZSwgXAorICAgICAgICBGbGFncyA9IEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQgPjo6RmxhZ3MsIFwKKyAgICAgICAgQ29lZmZSZWFkQ29zdCA9IEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQgPjo6Q29lZmZSZWFkQ29zdCwgXAorICAgICAgICBTaXplQXRDb21waWxlVGltZSA9IEJhc2U6OlNpemVBdENvbXBpbGVUaW1lLCBcCisgICAgICAgIElzVmVjdG9yQXRDb21waWxlVGltZSA9IEJhc2U6OklzVmVjdG9yQXRDb21waWxlVGltZSB9OyBcCisgIHVzaW5nIEJhc2U6OmRlcml2ZWQ7IFwKKyAgdXNpbmcgQmFzZTo6Y29uc3RfY2FzdF9kZXJpdmVkOworCisjZGVmaW5lIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQpIFwKKyAgX0VJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQsIEVpZ2VuOjpTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQgPikKKworY29uc3QgaW50IENvaGVyZW50QWNjZXNzUGF0dGVybiAgICAgPSAweDE7Citjb25zdCBpbnQgSW5uZXJSYW5kb21BY2Nlc3NQYXR0ZXJuICA9IDB4MiB8IENvaGVyZW50QWNjZXNzUGF0dGVybjsKK2NvbnN0IGludCBPdXRlclJhbmRvbUFjY2Vzc1BhdHRlcm4gID0gMHg0IHwgQ29oZXJlbnRBY2Nlc3NQYXR0ZXJuOworY29uc3QgaW50IFJhbmRvbUFjY2Vzc1BhdHRlcm4gICAgICAgPSAweDggfCBPdXRlclJhbmRvbUFjY2Vzc1BhdHRlcm4gfCBJbm5lclJhbmRvbUFjY2Vzc1BhdHRlcm47CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIFNwYXJzZU1hdHJpeEJhc2U7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0ZsYWdzID0gMCwgdHlwZW5hbWUgX0luZGV4ID0gaW50PiAgY2xhc3MgU3BhcnNlTWF0cml4OwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9GbGFncyA9IDAsIHR5cGVuYW1lIF9JbmRleCA9IGludD4gIGNsYXNzIER5bmFtaWNTcGFyc2VNYXRyaXg7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0ZsYWdzID0gMCwgdHlwZW5hbWUgX0luZGV4ID0gaW50PiAgY2xhc3MgU3BhcnNlVmVjdG9yOwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9GbGFncyA9IDAsIHR5cGVuYW1lIF9JbmRleCA9IGludD4gIGNsYXNzIE1hcHBlZFNwYXJzZU1hdHJpeDsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFNpemU+ICAgICAgICAgICBjbGFzcyBTcGFyc2VJbm5lclZlY3RvclNldDsKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBNb2RlPiAgICAgICAgICAgY2xhc3MgU3BhcnNlVHJpYW5ndWxhclZpZXc7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB1bnNpZ25lZCBpbnQgVXBMbz4gIGNsYXNzIFNwYXJzZVNlbGZBZGpvaW50VmlldzsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPiAgICAgICAgICAgICAgY2xhc3MgU3BhcnNlRGlhZ29uYWxQcm9kdWN0OwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gY2xhc3MgU3BhcnNlVmlldzsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+ICAgICAgICBjbGFzcyBTcGFyc2VTcGFyc2VQcm9kdWN0OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+ICAgICAgICBjbGFzcyBTcGFyc2VUaW1lRGVuc2VQcm9kdWN0OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+ICAgICAgICBjbGFzcyBEZW5zZVRpbWVTcGFyc2VQcm9kdWN0OwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGJvb2wgVHJhbnNwb3NlPiBjbGFzcyBTcGFyc2VEZW5zZU91dGVyUHJvZHVjdDsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+IHN0cnVjdCBTcGFyc2VTcGFyc2VQcm9kdWN0UmV0dXJuVHlwZTsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgSW5uZXJTaXplID0gaW50ZXJuYWw6OnRyYWl0czxMaHM+OjpDb2xzQXRDb21waWxlVGltZT4gc3RydWN0IERlbnNlU3BhcnNlUHJvZHVjdFJldHVyblR5cGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IElubmVyU2l6ZSA9IGludGVybmFsOjp0cmFpdHM8TGhzPjo6Q29sc0F0Q29tcGlsZVRpbWU+IHN0cnVjdCBTcGFyc2VEZW5zZVByb2R1Y3RSZXR1cm5UeXBlOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSxpbnQgVXBMbz4gY2xhc3MgU3BhcnNlU3ltbWV0cmljUGVybXV0YXRpb25Qcm9kdWN0OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULGludCBSb3dzLGludCBDb2xzPiBzdHJ1Y3Qgc3BhcnNlX2V2YWw7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBldmFsPFQsU3BhcnNlPgorICA6IHB1YmxpYyBzcGFyc2VfZXZhbDxULCB0cmFpdHM8VD46OlJvd3NBdENvbXBpbGVUaW1lLHRyYWl0czxUPjo6Q29sc0F0Q29tcGlsZVRpbWU+Cit7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCxpbnQgQ29scz4gc3RydWN0IHNwYXJzZV9ldmFsPFQsMSxDb2xzPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8VD46OlNjYWxhciBfU2NhbGFyOworICAgIGVudW0geyBfRmxhZ3MgPSB0cmFpdHM8VD46OkZsYWdzfCBSb3dNYWpvckJpdCB9OworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8X1NjYWxhciwgX0ZsYWdzPiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCxpbnQgUm93cz4gc3RydWN0IHNwYXJzZV9ldmFsPFQsUm93cywxPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8VD46OlNjYWxhciBfU2NhbGFyOworICAgIGVudW0geyBfRmxhZ3MgPSB0cmFpdHM8VD46OkZsYWdzICYgKH5Sb3dNYWpvckJpdCkgfTsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU3BhcnNlVmVjdG9yPF9TY2FsYXIsIF9GbGFncz4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsaW50IFJvd3MsaW50IENvbHM+IHN0cnVjdCBzcGFyc2VfZXZhbCB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8VD46OlNjYWxhciBfU2NhbGFyOworICAgIGVudW0geyBfRmxhZ3MgPSB0cmFpdHM8VD46OkZsYWdzIH07CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxfU2NhbGFyLCBfRmxhZ3M+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc3BhcnNlX2V2YWw8VCwxLDE+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyIF9TY2FsYXI7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIE1hdHJpeDxfU2NhbGFyLCAxLCAxPiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHBsYWluX21hdHJpeF90eXBlPFQsU3BhcnNlPgoreworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxUPjo6U2NhbGFyIF9TY2FsYXI7CisgICAgZW51bSB7CisgICAgICAgICAgX0ZsYWdzID0gdHJhaXRzPFQ+OjpGbGFncworICAgIH07CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9GbGFncz4gdHlwZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGluZ3JvdXAgU3BhcnNlQ29yZV9Nb2R1bGUKKyAgKgorICAqIFxjbGFzcyBUcmlwbGV0CisgICoKKyAgKiBcYnJpZWYgQSBzbWFsbCBzdHJ1Y3R1cmUgdG8gaG9sZCBhIG5vbiB6ZXJvIGFzIGEgdHJpcGxldCAoaSxqLHZhbHVlKS4KKyAgKgorICAqIFxzYSBTcGFyc2VNYXRyaXg6OnNldEZyb21UcmlwbGV0cygpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4PXVuc2lnbmVkIGludD4KK2NsYXNzIFRyaXBsZXQKK3sKK3B1YmxpYzoKKyAgVHJpcGxldCgpIDogbV9yb3coMCksIG1fY29sKDApLCBtX3ZhbHVlKDApIHt9CisKKyAgVHJpcGxldChjb25zdCBJbmRleCYgaSwgY29uc3QgSW5kZXgmIGosIGNvbnN0IFNjYWxhciYgdiA9IFNjYWxhcigwKSkKKyAgICA6IG1fcm93KGkpLCBtX2NvbChqKSwgbV92YWx1ZSh2KQorICB7fQorCisgIC8qKiBccmV0dXJucyB0aGUgcm93IGluZGV4IG9mIHRoZSBlbGVtZW50ICovCisgIGNvbnN0IEluZGV4JiByb3coKSBjb25zdCB7IHJldHVybiBtX3JvdzsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBlbGVtZW50ICovCisgIGNvbnN0IEluZGV4JiBjb2woKSBjb25zdCB7IHJldHVybiBtX2NvbDsgfQorCisgIC8qKiBccmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgKi8KKyAgY29uc3QgU2NhbGFyJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KK3Byb3RlY3RlZDoKKyAgSW5kZXggbV9yb3csIG1fY29sOworICBTY2FsYXIgbV92YWx1ZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFVVRJTF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VWZWN0b3IuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NTJmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3BhcnNlQ29yZS9TcGFyc2VWZWN0b3IuaApAQCAtMCwwICsxLDM5OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFVkVDVE9SX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFVkVDVE9SX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBTcGFyc2VDb3JlX01vZHVsZQorICAqIFxjbGFzcyBTcGFyc2VWZWN0b3IKKyAgKgorICAqIFxicmllZiBhIHNwYXJzZSB2ZWN0b3IgY2xhc3MKKyAgKgorICAqIFx0cGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4gdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqCisgICogU2VlIGh0dHA6Ly93d3cubmV0bGliLm9yZy9saW5hbGcvaHRtbF90ZW1wbGF0ZXMvbm9kZTkxLmh0bWwgZm9yIGRldGFpbHMgb24gdGhlIHN0b3JhZ2Ugc2NoZW1lLgorICAqCisgICogVGhpcyBjbGFzcyBjYW4gYmUgZXh0ZW5kZWQgd2l0aCB0aGUgaGVscCBvZiB0aGUgcGx1Z2luIG1lY2hhbmlzbSBkZXNjcmliZWQgb24gdGhlIHBhZ2UKKyAgKiBccmVmIFRvcGljQ3VzdG9taXppbmdFaWdlbiBieSBkZWZpbmluZyB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBcYyBFSUdFTl9TUEFSU0VWRUNUT1JfUExVR0lOLgorICAqLworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXg+CitzdHJ1Y3QgdHJhaXRzPFNwYXJzZVZlY3RvcjxfU2NhbGFyLCBfT3B0aW9ucywgX0luZGV4PiA+Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgX0luZGV4IEluZGV4OworICB0eXBlZGVmIFNwYXJzZSBTdG9yYWdlS2luZDsKKyAgdHlwZWRlZiBNYXRyaXhYcHIgWHByS2luZDsKKyAgZW51bSB7CisgICAgSXNDb2xWZWN0b3IgPSAoX09wdGlvbnMgJiBSb3dNYWpvckJpdCkgPyAwIDogMSwKKworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gSXNDb2xWZWN0b3IgPyBEeW5hbWljIDogMSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IElzQ29sVmVjdG9yID8gMSA6IER5bmFtaWMsCisgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IENvbHNBdENvbXBpbGVUaW1lLAorICAgIEZsYWdzID0gX09wdGlvbnMgfCBOZXN0QnlSZWZCaXQgfCBMdmFsdWVCaXQgfCAoSXNDb2xWZWN0b3IgPyAwIDogUm93TWFqb3JCaXQpLAorICAgIENvZWZmUmVhZENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhZENvc3QsCisgICAgU3VwcG9ydGVkQWNjZXNzUGF0dGVybnMgPSBJbm5lclJhbmRvbUFjY2Vzc1BhdHRlcm4KKyAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4PgorY2xhc3MgU3BhcnNlVmVjdG9yCisgIDogcHVibGljIFNwYXJzZU1hdHJpeEJhc2U8U3BhcnNlVmVjdG9yPF9TY2FsYXIsIF9PcHRpb25zLCBfSW5kZXg+ID4KK3sKKyAgcHVibGljOgorICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFNwYXJzZVZlY3RvcikKKyAgICBFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKFNwYXJzZVZlY3RvciwgKz0pCisgICAgRUlHRU5fU1BBUlNFX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUihTcGFyc2VWZWN0b3IsIC09KQorCisgIHByb3RlY3RlZDoKKyAgcHVibGljOgorCisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXhCYXNlPFNwYXJzZVZlY3Rvcj4gU3BhcnNlQmFzZTsKKyAgICBlbnVtIHsgSXNDb2xWZWN0b3IgPSBpbnRlcm5hbDo6dHJhaXRzPFNwYXJzZVZlY3Rvcj46OklzQ29sVmVjdG9yIH07CisgICAgCisgICAgZW51bSB7CisgICAgICBPcHRpb25zID0gX09wdGlvbnMKKyAgICB9OworCisgICAgaW50ZXJuYWw6OkNvbXByZXNzZWRTdG9yYWdlPFNjYWxhcixJbmRleD4gbV9kYXRhOworICAgIEluZGV4IG1fc2l6ZTsKKworICAgIGludGVybmFsOjpDb21wcmVzc2VkU3RvcmFnZTxTY2FsYXIsSW5kZXg+JiBfZGF0YSgpIHsgcmV0dXJuIG1fZGF0YTsgfQorICAgIGludGVybmFsOjpDb21wcmVzc2VkU3RvcmFnZTxTY2FsYXIsSW5kZXg+JiBfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorCisgIHB1YmxpYzoKKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIElzQ29sVmVjdG9yID8gbV9zaXplIDogMTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIElzQ29sVmVjdG9yID8gMSA6IG1fc2l6ZTsgfQorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggaW5uZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBvdXRlclNpemUoKSBjb25zdCB7IHJldHVybiAxOyB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IFNjYWxhciogdmFsdWVQdHIoKSBjb25zdCB7IHJldHVybiAmbV9kYXRhLnZhbHVlKDApOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBTY2FsYXIqIHZhbHVlUHRyKCkgeyByZXR1cm4gJm1fZGF0YS52YWx1ZSgwKTsgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBJbmRleCogaW5uZXJJbmRleFB0cigpIGNvbnN0IHsgcmV0dXJuICZtX2RhdGEuaW5kZXgoMCk7IH0KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4KiBpbm5lckluZGV4UHRyKCkgeyByZXR1cm4gJm1fZGF0YS5pbmRleCgwKTsgfQorCisgICAgaW5saW5lIFNjYWxhciBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoKElzQ29sVmVjdG9yID8gY29sIDogcm93KT09MCk7CisgICAgICByZXR1cm4gY29lZmYoSXNDb2xWZWN0b3IgPyByb3cgOiBjb2wpOworICAgIH0KKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmKEluZGV4IGkpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5hdChpKTsgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KChJc0NvbFZlY3RvciA/IGNvbCA6IHJvdyk9PTApOworICAgICAgcmV0dXJuIGNvZWZmKElzQ29sVmVjdG9yID8gcm93IDogY29sKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvZWZmaWNpZW50IHZhbHVlIGF0IGdpdmVuIGluZGV4IFxhIGkKKyAgICAgICogVGhpcyBvcGVyYXRpb24gaW52b2xlcyBhIGxvZyhyaG8qc2l6ZSkgYmluYXJ5IHNlYXJjaC4gSWYgdGhlIGNvZWZmaWNpZW50IGRvZXMgbm90CisgICAgICAqIGV4aXN0IHlldCwgdGhlbiBhIHNvcnRlZCBpbnNlcnRpb24gaW50byBhIHNlcXVlbnRpYWwgYnVmZmVyIGlzIHBlcmZvcm1lZC4KKyAgICAgICoKKyAgICAgICogVGhpcyBpbnNlcnRpb24gbWlnaHQgYmUgdmVyeSBjb3N0bHkgaWYgdGhlIG51bWJlciBvZiBub256ZXJvcyBhYm92ZSBcYSBpIGlzIGxhcmdlLgorICAgICAgKi8KKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCBpKQorICAgIHsKKyAgICAgIHJldHVybiBtX2RhdGEuYXRXaXRoSW5zZXJ0aW9uKGkpOworICAgIH0KKworICBwdWJsaWM6CisKKyAgICBjbGFzcyBJbm5lckl0ZXJhdG9yOworICAgIGNsYXNzIFJldmVyc2VJbm5lckl0ZXJhdG9yOworCisgICAgaW5saW5lIHZvaWQgc2V0WmVybygpIHsgbV9kYXRhLmNsZWFyKCk7IH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbiB6ZXJvIGNvZWZmaWNpZW50cyAqLworICAgIGlubGluZSBJbmRleCBub25aZXJvcygpIGNvbnN0ICB7IHJldHVybiBzdGF0aWNfY2FzdDxJbmRleD4obV9kYXRhLnNpemUoKSk7IH0KKworICAgIGlubGluZSB2b2lkIHN0YXJ0VmVjKEluZGV4IG91dGVyKQorICAgIHsKKyAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShvdXRlcik7CisgICAgICBlaWdlbl9hc3NlcnQob3V0ZXI9PTApOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIGluc2VydEJhY2tCeU91dGVySW5uZXIoSW5kZXggb3V0ZXIsIEluZGV4IGlubmVyKQorICAgIHsKKyAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShvdXRlcik7CisgICAgICBlaWdlbl9hc3NlcnQob3V0ZXI9PTApOworICAgICAgcmV0dXJuIGluc2VydEJhY2soaW5uZXIpOworICAgIH0KKyAgICBpbmxpbmUgU2NhbGFyJiBpbnNlcnRCYWNrKEluZGV4IGkpCisgICAgeworICAgICAgbV9kYXRhLmFwcGVuZCgwLCBpKTsKKyAgICAgIHJldHVybiBtX2RhdGEudmFsdWUobV9kYXRhLnNpemUoKS0xKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBpbnNlcnQoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgSW5kZXggaW5uZXIgPSBJc0NvbFZlY3RvciA/IHJvdyA6IGNvbDsKKyAgICAgIEluZGV4IG91dGVyID0gSXNDb2xWZWN0b3IgPyBjb2wgOiByb3c7CisgICAgICBlaWdlbl9hc3NlcnQob3V0ZXI9PTApOworICAgICAgcmV0dXJuIGluc2VydChpbm5lcik7CisgICAgfQorICAgIFNjYWxhciYgaW5zZXJ0KEluZGV4IGkpCisgICAgeworICAgICAgSW5kZXggc3RhcnRJZCA9IDA7CisgICAgICBJbmRleCBwID0gSW5kZXgobV9kYXRhLnNpemUoKSkgLSAxOworICAgICAgLy8gVE9ETyBzbWFydCByZWFsbG9jCisgICAgICBtX2RhdGEucmVzaXplKHArMiwxKTsKKworICAgICAgd2hpbGUgKCAocCA+PSBzdGFydElkKSAmJiAobV9kYXRhLmluZGV4KHApID4gaSkgKQorICAgICAgeworICAgICAgICBtX2RhdGEuaW5kZXgocCsxKSA9IG1fZGF0YS5pbmRleChwKTsKKyAgICAgICAgbV9kYXRhLnZhbHVlKHArMSkgPSBtX2RhdGEudmFsdWUocCk7CisgICAgICAgIC0tcDsKKyAgICAgIH0KKyAgICAgIG1fZGF0YS5pbmRleChwKzEpID0gaTsKKyAgICAgIG1fZGF0YS52YWx1ZShwKzEpID0gMDsKKyAgICAgIHJldHVybiBtX2RhdGEudmFsdWUocCsxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICovCisgICAgaW5saW5lIHZvaWQgcmVzZXJ2ZShJbmRleCByZXNlcnZlU2l6ZSkgeyBtX2RhdGEucmVzZXJ2ZShyZXNlcnZlU2l6ZSk7IH0KKworCisgICAgaW5saW5lIHZvaWQgZmluYWxpemUoKSB7fQorCisgICAgdm9pZCBwcnVuZShTY2FsYXIgcmVmZXJlbmNlLCBSZWFsU2NhbGFyIGVwc2lsb24gPSBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKQorICAgIHsKKyAgICAgIG1fZGF0YS5wcnVuZShyZWZlcmVuY2UsZXBzaWxvbik7CisgICAgfQorCisgICAgdm9pZCByZXNpemUoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQocm93cz09MSB8fCBjb2xzPT0xKTsKKyAgICAgIHJlc2l6ZShJc0NvbFZlY3RvciA/IHJvd3MgOiBjb2xzKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6ZShJbmRleCBuZXdTaXplKQorICAgIHsKKyAgICAgIG1fc2l6ZSA9IG5ld1NpemU7CisgICAgICBtX2RhdGEuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6ZU5vblplcm9zKEluZGV4IHNpemUpIHsgbV9kYXRhLnJlc2l6ZShzaXplKTsgfQorCisgICAgaW5saW5lIFNwYXJzZVZlY3RvcigpIDogbV9zaXplKDApIHsgcmVzaXplKDApOyB9CisKKyAgICBpbmxpbmUgU3BhcnNlVmVjdG9yKEluZGV4IHNpemUpIDogbV9zaXplKDApIHsgcmVzaXplKHNpemUpOyB9CisKKyAgICBpbmxpbmUgU3BhcnNlVmVjdG9yKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpIDogbV9zaXplKDApIHsgcmVzaXplKHJvd3MsY29scyk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBpbmxpbmUgU3BhcnNlVmVjdG9yKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICA6IG1fc2l6ZSgwKQorICAgIHsKKyAgICAgICp0aGlzID0gb3RoZXIuZGVyaXZlZCgpOworICAgIH0KKworICAgIGlubGluZSBTcGFyc2VWZWN0b3IoY29uc3QgU3BhcnNlVmVjdG9yJiBvdGhlcikKKyAgICAgIDogbV9zaXplKDApCisgICAgeworICAgICAgKnRoaXMgPSBvdGhlci5kZXJpdmVkKCk7CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgc3dhcChTcGFyc2VWZWN0b3ImIG90aGVyKQorICAgIHsKKyAgICAgIHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7CisgICAgICBtX2RhdGEuc3dhcChvdGhlci5tX2RhdGEpOworICAgIH0KKworICAgIGlubGluZSBTcGFyc2VWZWN0b3ImIG9wZXJhdG9yPShjb25zdCBTcGFyc2VWZWN0b3ImIG90aGVyKQorICAgIHsKKyAgICAgIGlmIChvdGhlci5pc1JWYWx1ZSgpKQorICAgICAgeworICAgICAgICBzd2FwKG90aGVyLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmVzaXplKG90aGVyLnNpemUoKSk7CisgICAgICAgIG1fZGF0YSA9IG90aGVyLm1fZGF0YTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIFNwYXJzZVZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgaWYgKGludChSb3dzQXRDb21waWxlVGltZSkhPWludChPdGhlckRlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSkKKyAgICAgICAgcmV0dXJuIGFzc2lnbihvdGhlci50cmFuc3Bvc2UoKSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBhc3NpZ24ob3RoZXIpOworICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgU3BhcnNlVmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgU3BhcnNlU3BhcnNlUHJvZHVjdDxMaHMsUmhzPiYgcHJvZHVjdCkKKyAgICB7CisgICAgICByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KHByb2R1Y3QpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtICYgcywgY29uc3QgU3BhcnNlVmVjdG9yJiBtKQorICAgIHsKKyAgICAgIGZvciAoSW5kZXggaT0wOyBpPG0ubm9uWmVyb3MoKTsgKytpKQorICAgICAgICBzIDw8ICIoIiA8PCBtLm1fZGF0YS52YWx1ZShpKSA8PCAiLCIgPDwgbS5tX2RhdGEuaW5kZXgoaSkgPDwgIikgIjsKKyAgICAgIHMgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgLyoqIERlc3RydWN0b3IgKi8KKyAgICBpbmxpbmUgflNwYXJzZVZlY3RvcigpIHt9CisKKyAgICAvKiogT3ZlcmxvYWRlZCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICBTY2FsYXIgc3VtKCkgY29uc3Q7CisKKyAgcHVibGljOgorCisgICAgLyoqIFxkZXByZWNhdGVkIHVzZSBzZXRaZXJvKCkgYW5kIHJlc2VydmUoKSAqLworICAgIEVJR0VOX0RFUFJFQ0FURUQgdm9pZCBzdGFydEZpbGwoSW5kZXggcmVzZXJ2ZSkKKyAgICB7CisgICAgICBzZXRaZXJvKCk7CisgICAgICBtX2RhdGEucmVzZXJ2ZShyZXNlcnZlKTsKKyAgICB9CisKKyAgICAvKiogXGRlcHJlY2F0ZWQgdXNlIGluc2VydEJhY2soSW5kZXgsSW5kZXgpICovCisgICAgRUlHRU5fREVQUkVDQVRFRCBTY2FsYXImIGZpbGwoSW5kZXggciwgSW5kZXggYykKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQocj09MCB8fCBjPT0wKTsKKyAgICAgIHJldHVybiBmaWxsKElzQ29sVmVjdG9yID8gciA6IGMpOworICAgIH0KKworICAgIC8qKiBcZGVwcmVjYXRlZCB1c2UgaW5zZXJ0QmFjayhJbmRleCkgKi8KKyAgICBFSUdFTl9ERVBSRUNBVEVEIFNjYWxhciYgZmlsbChJbmRleCBpKQorICAgIHsKKyAgICAgIG1fZGF0YS5hcHBlbmQoMCwgaSk7CisgICAgICByZXR1cm4gbV9kYXRhLnZhbHVlKG1fZGF0YS5zaXplKCktMSk7CisgICAgfQorCisgICAgLyoqIFxkZXByZWNhdGVkIHVzZSBpbnNlcnQoSW5kZXgsSW5kZXgpICovCisgICAgRUlHRU5fREVQUkVDQVRFRCBTY2FsYXImIGZpbGxyYW5kKEluZGV4IHIsIEluZGV4IGMpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KHI9PTAgfHwgYz09MCk7CisgICAgICByZXR1cm4gZmlsbHJhbmQoSXNDb2xWZWN0b3IgPyByIDogYyk7CisgICAgfQorCisgICAgLyoqIFxkZXByZWNhdGVkIHVzZSBpbnNlcnQoSW5kZXgpICovCisgICAgRUlHRU5fREVQUkVDQVRFRCBTY2FsYXImIGZpbGxyYW5kKEluZGV4IGkpCisgICAgeworICAgICAgcmV0dXJuIGluc2VydChpKTsKKyAgICB9CisKKyAgICAvKiogXGRlcHJlY2F0ZWQgdXNlIGZpbmFsaXplKCkgKi8KKyAgICBFSUdFTl9ERVBSRUNBVEVEIHZvaWQgZW5kRmlsbCgpIHt9CisgICAgCisjICAgaWZkZWYgRUlHRU5fU1BBUlNFVkVDVE9SX1BMVUdJTgorIyAgICAgaW5jbHVkZSBFSUdFTl9TUEFSU0VWRUNUT1JfUExVR0lOCisjICAgZW5kaWYKKworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ET05UX0lOTElORSBTcGFyc2VWZWN0b3ImIGFzc2lnbihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIF9vdGhlcikKKyAgICB7CisgICAgICBjb25zdCBPdGhlckRlcml2ZWQmIG90aGVyKF9vdGhlci5kZXJpdmVkKCkpOworICAgICAgY29uc3QgYm9vbCBuZWVkVG9UcmFuc3Bvc2UgPSAoRmxhZ3MgJiBSb3dNYWpvckJpdCkgIT0gKE90aGVyRGVyaXZlZDo6RmxhZ3MgJiBSb3dNYWpvckJpdCk7CisgICAgICBpZihuZWVkVG9UcmFuc3Bvc2UpCisgICAgICB7CisgICAgICAgIEluZGV4IHNpemUgPSBvdGhlci5zaXplKCk7CisgICAgICAgIEluZGV4IG5ueiA9IG90aGVyLm5vblplcm9zKCk7CisgICAgICAgIHJlc2l6ZShzaXplKTsKKyAgICAgICAgcmVzZXJ2ZShubnopOworICAgICAgICBmb3IoSW5kZXggaT0wOyBpPHNpemU7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6SW5uZXJJdGVyYXRvciBpdChvdGhlciwgaSk7CisgICAgICAgICAgaWYoaXQpCisgICAgICAgICAgICAgIGluc2VydChpKSA9IGl0LnZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyB0aGVyZSBpcyBubyBzcGVjaWFsIG9wdGltaXphdGlvbgorICAgICAgICByZXR1cm4gQmFzZTo6b3BlcmF0b3I9KG90aGVyKTsKKyAgICAgIH0KKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4PgorY2xhc3MgU3BhcnNlVmVjdG9yPFNjYWxhcixfT3B0aW9ucyxfSW5kZXg+OjpJbm5lckl0ZXJhdG9yCit7CisgIHB1YmxpYzoKKyAgICBJbm5lckl0ZXJhdG9yKGNvbnN0IFNwYXJzZVZlY3RvciYgdmVjLCBJbmRleCBvdXRlcj0wKQorICAgICAgOiBtX2RhdGEodmVjLm1fZGF0YSksIG1faWQoMCksIG1fZW5kKHN0YXRpY19jYXN0PEluZGV4PihtX2RhdGEuc2l6ZSgpKSkKKyAgICB7CisgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUob3V0ZXIpOworICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyPT0wKTsKKyAgICB9CisKKyAgICBJbm5lckl0ZXJhdG9yKGNvbnN0IGludGVybmFsOjpDb21wcmVzc2VkU3RvcmFnZTxTY2FsYXIsSW5kZXg+JiBkYXRhKQorICAgICAgOiBtX2RhdGEoZGF0YSksIG1faWQoMCksIG1fZW5kKHN0YXRpY19jYXN0PEluZGV4PihtX2RhdGEuc2l6ZSgpKSkKKyAgICB7fQorCisgICAgaW5saW5lIElubmVySXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IG1faWQrKzsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnZhbHVlKG1faWQpOyB9CisgICAgaW5saW5lIFNjYWxhciYgdmFsdWVSZWYoKSB7IHJldHVybiBjb25zdF9jYXN0PFNjYWxhciY+KG1fZGF0YS52YWx1ZShtX2lkKSk7IH0KKworICAgIGlubGluZSBJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5pbmRleChtX2lkKTsgfQorICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc0NvbFZlY3RvciA/IGluZGV4KCkgOiAwOyB9CisgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIElzQ29sVmVjdG9yID8gMCA6IGluZGV4KCk7IH0KKworICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKG1faWQgPCBtX2VuZCk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgaW50ZXJuYWw6OkNvbXByZXNzZWRTdG9yYWdlPFNjYWxhcixJbmRleD4mIG1fZGF0YTsKKyAgICBJbmRleCBtX2lkOworICAgIGNvbnN0IEluZGV4IG1fZW5kOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9JbmRleD4KK2NsYXNzIFNwYXJzZVZlY3RvcjxTY2FsYXIsX09wdGlvbnMsX0luZGV4Pjo6UmV2ZXJzZUlubmVySXRlcmF0b3IKK3sKKyAgcHVibGljOgorICAgIFJldmVyc2VJbm5lckl0ZXJhdG9yKGNvbnN0IFNwYXJzZVZlY3RvciYgdmVjLCBJbmRleCBvdXRlcj0wKQorICAgICAgOiBtX2RhdGEodmVjLm1fZGF0YSksIG1faWQoc3RhdGljX2Nhc3Q8SW5kZXg+KG1fZGF0YS5zaXplKCkpKSwgbV9zdGFydCgwKQorICAgIHsKKyAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShvdXRlcik7CisgICAgICBlaWdlbl9hc3NlcnQob3V0ZXI9PTApOworICAgIH0KKworICAgIFJldmVyc2VJbm5lckl0ZXJhdG9yKGNvbnN0IGludGVybmFsOjpDb21wcmVzc2VkU3RvcmFnZTxTY2FsYXIsSW5kZXg+JiBkYXRhKQorICAgICAgOiBtX2RhdGEoZGF0YSksIG1faWQoc3RhdGljX2Nhc3Q8SW5kZXg+KG1fZGF0YS5zaXplKCkpKSwgbV9zdGFydCgwKQorICAgIHt9CisKKyAgICBpbmxpbmUgUmV2ZXJzZUlubmVySXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7IG1faWQtLTsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnZhbHVlKG1faWQtMSk7IH0KKyAgICBpbmxpbmUgU2NhbGFyJiB2YWx1ZVJlZigpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyJj4obV9kYXRhLnZhbHVlKG1faWQtMSkpOyB9CisKKyAgICBpbmxpbmUgSW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuaW5kZXgobV9pZC0xKTsgfQorICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7IHJldHVybiBJc0NvbFZlY3RvciA/IGluZGV4KCkgOiAwOyB9CisgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIElzQ29sVmVjdG9yID8gMCA6IGluZGV4KCk7IH0KKworICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKG1faWQgPiBtX3N0YXJ0KTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBpbnRlcm5hbDo6Q29tcHJlc3NlZFN0b3JhZ2U8U2NhbGFyLEluZGV4PiYgbV9kYXRhOworICAgIEluZGV4IG1faWQ7CisgICAgY29uc3QgSW5kZXggbV9zdGFydDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFVkVDVE9SX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVZpZXcuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1NwYXJzZVZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBiOWVhCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvU3BhcnNlVmlldy5oCkBAIC0wLDAgKzEsOTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIERhbmllbCBMb3dlbmdydWIgPGxvd2RhbmllQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFVklFV19ICisjZGVmaW5lIEVJR0VOX1NQQVJTRVZJRVdfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCB0cmFpdHM8U3BhcnNlVmlldzxNYXRyaXhUeXBlPiA+IDogdHJhaXRzPE1hdHJpeFR5cGU+Cit7CisgIHR5cGVkZWYgaW50IEluZGV4OworICB0eXBlZGVmIFNwYXJzZSBTdG9yYWdlS2luZDsKKyAgZW51bSB7CisgICAgRmxhZ3MgPSBpbnQodHJhaXRzPE1hdHJpeFR5cGU+OjpGbGFncykgJiAoUm93TWFqb3JCaXQpCisgIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIFNwYXJzZVZpZXcgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VWaWV3PE1hdHJpeFR5cGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgTWF0cml4VHlwZU5lc3RlZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxNYXRyaXhUeXBlTmVzdGVkPjo6dHlwZSBfTWF0cml4VHlwZU5lc3RlZDsKK3B1YmxpYzoKKyAgRUlHRU5fU1BBUlNFX1BVQkxJQ19JTlRFUkZBQ0UoU3BhcnNlVmlldykKKworICBTcGFyc2VWaWV3KGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgY29uc3QgU2NhbGFyJiBtX3JlZmVyZW5jZSA9IFNjYWxhcigwKSwKKyAgICAgICAgICAgICB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBtX2Vwc2lsb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIDogCisgICAgbV9tYXRyaXgobWF0KSwgbV9yZWZlcmVuY2UobV9yZWZlcmVuY2UpLCBtX2Vwc2lsb24obV9lcHNpbG9uKSB7fQorCisgIGNsYXNzIElubmVySXRlcmF0b3I7CisKKyAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5yb3dzKCk7IH0KKyAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeC5jb2xzKCk7IH0KKworICBpbmxpbmUgSW5kZXggaW5uZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguaW5uZXJTaXplKCk7IH0KKyAgaW5saW5lIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4Lm91dGVyU2l6ZSgpOyB9CisKK3Byb3RlY3RlZDoKKyAgTWF0cml4VHlwZU5lc3RlZCBtX21hdHJpeDsKKyAgU2NhbGFyIG1fcmVmZXJlbmNlOworICB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBtX2Vwc2lsb247Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgU3BhcnNlVmlldzxNYXRyaXhUeXBlPjo6SW5uZXJJdGVyYXRvciA6IHB1YmxpYyBfTWF0cml4VHlwZU5lc3RlZDo6SW5uZXJJdGVyYXRvcgoreworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIF9NYXRyaXhUeXBlTmVzdGVkOjpJbm5lckl0ZXJhdG9yIEl0ZXJCYXNlOworICBJbm5lckl0ZXJhdG9yKGNvbnN0IFNwYXJzZVZpZXcmIHZpZXcsIEluZGV4IG91dGVyKSA6CisgIEl0ZXJCYXNlKHZpZXcubV9tYXRyaXgsIG91dGVyKSwgbV92aWV3KHZpZXcpCisgIHsKKyAgICBpbmNyZW1lbnRUb05vblplcm8oKTsKKyAgfQorCisgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5uZXJJdGVyYXRvciYgb3BlcmF0b3IrKygpCisgIHsKKyAgICBJdGVyQmFzZTo6b3BlcmF0b3IrKygpOworICAgIGluY3JlbWVudFRvTm9uWmVybygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHVzaW5nIEl0ZXJCYXNlOjp2YWx1ZTsKKworcHJvdGVjdGVkOgorICBjb25zdCBTcGFyc2VWaWV3JiBtX3ZpZXc7CisKK3ByaXZhdGU6CisgIHZvaWQgaW5jcmVtZW50VG9Ob25aZXJvKCkKKyAgeworICAgIHdoaWxlKChib29sKCp0aGlzKSkgJiYgaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKHZhbHVlKCksIG1fdmlldy5tX3JlZmVyZW5jZSwgbV92aWV3Lm1fZXBzaWxvbikpCisgICAgeworICAgICAgSXRlckJhc2U6Om9wZXJhdG9yKysoKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBTcGFyc2VWaWV3PERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OnNwYXJzZVZpZXcoY29uc3QgU2NhbGFyJiBtX3JlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBtX2Vwc2lsb24pIGNvbnN0Cit7CisgIHJldHVybiBTcGFyc2VWaWV3PERlcml2ZWQ+KGRlcml2ZWQoKSwgbV9yZWZlcmVuY2UsIG1fZXBzaWxvbik7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1RyaWFuZ3VsYXJTb2x2ZXIuaCBiL0VpZ2VuL3NyYy9TcGFyc2VDb3JlL1RyaWFuZ3VsYXJTb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjhhZDgyCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1NwYXJzZUNvcmUvVHJpYW5ndWxhclNvbHZlci5oCkBAIC0wLDAgKzEsMzM0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFVFJJQU5HVUxBUlNPTFZFUl9ICisjZGVmaW5lIEVJR0VOX1NQQVJTRVRSSUFOR1VMQVJTT0xWRVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlLAorICBpbnQgVXBMbyA9IChNb2RlICYgTG93ZXIpCisgICAgICAgICAgID8gTG93ZXIKKyAgICAgICAgICAgOiAoTW9kZSAmIFVwcGVyKQorICAgICAgICAgICA/IFVwcGVyCisgICAgICAgICAgIDogLTEsCisgIGludCBTdG9yYWdlT3JkZXIgPSBpbnQodHJhaXRzPExocz46OkZsYWdzKSAmIFJvd01ham9yQml0Pgorc3RydWN0IHNwYXJzZV9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yOworCisvLyBmb3J3YXJkIHN1YnN0aXR1dGlvbiwgcm93LW1ham9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE1vZGU+CitzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8TGhzLFJocyxNb2RlLExvd2VyLFJvd01ham9yPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6U2NhbGFyIFNjYWxhcjsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBSaHMmIG90aGVyKQorICB7CisgICAgZm9yKGludCBjb2w9MCA7IGNvbDxvdGhlci5jb2xzKCkgOyArK2NvbCkKKyAgICB7CisgICAgICBmb3IoaW50IGk9MDsgaTxsaHMucm93cygpOyArK2kpCisgICAgICB7CisgICAgICAgIFNjYWxhciB0bXAgPSBvdGhlci5jb2VmZihpLGNvbCk7CisgICAgICAgIFNjYWxhciBsYXN0VmFsKDApOworICAgICAgICBpbnQgbGFzdEluZGV4ID0gMDsKKyAgICAgICAgZm9yKHR5cGVuYW1lIExoczo6SW5uZXJJdGVyYXRvciBpdChsaHMsIGkpOyBpdDsgKytpdCkKKyAgICAgICAgeworICAgICAgICAgIGxhc3RWYWwgPSBpdC52YWx1ZSgpOworICAgICAgICAgIGxhc3RJbmRleCA9IGl0LmluZGV4KCk7CisgICAgICAgICAgaWYobGFzdEluZGV4PT1pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgdG1wIC09IGxhc3RWYWwgKiBvdGhlci5jb2VmZihsYXN0SW5kZXgsY29sKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoTW9kZSAmIFVuaXREaWFnKQorICAgICAgICAgIG90aGVyLmNvZWZmUmVmKGksY29sKSA9IHRtcDsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgZWlnZW5fYXNzZXJ0KGxhc3RJbmRleD09aSk7CisgICAgICAgICAgb3RoZXIuY29lZmZSZWYoaSxjb2wpID0gdG1wL2xhc3RWYWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8vIGJhY2t3YXJkIHN1YnN0aXR1dGlvbiwgcm93LW1ham9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IE1vZGU+CitzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8TGhzLFJocyxNb2RlLFVwcGVyLFJvd01ham9yPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFJoczo6U2NhbGFyIFNjYWxhcjsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBSaHMmIG90aGVyKQorICB7CisgICAgZm9yKGludCBjb2w9MCA7IGNvbDxvdGhlci5jb2xzKCkgOyArK2NvbCkKKyAgICB7CisgICAgICBmb3IoaW50IGk9bGhzLnJvd3MoKS0xIDsgaT49MCA7IC0taSkKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyIHRtcCA9IG90aGVyLmNvZWZmKGksY29sKTsKKyAgICAgICAgU2NhbGFyIGxfaWkgPSAwOworICAgICAgICB0eXBlbmFtZSBMaHM6OklubmVySXRlcmF0b3IgaXQobGhzLCBpKTsKKyAgICAgICAgd2hpbGUoaXQgJiYgaXQuaW5kZXgoKTxpKQorICAgICAgICAgICsraXQ7CisgICAgICAgIGlmKCEoTW9kZSAmIFVuaXREaWFnKSkKKyAgICAgICAgeworICAgICAgICAgIGVpZ2VuX2Fzc2VydChpdCAmJiBpdC5pbmRleCgpPT1pKTsKKyAgICAgICAgICBsX2lpID0gaXQudmFsdWUoKTsKKyAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ICYmIGl0LmluZGV4KCkgPT0gaSkKKyAgICAgICAgICArK2l0OworICAgICAgICBmb3IoOyBpdDsgKytpdCkKKyAgICAgICAgeworICAgICAgICAgIHRtcCAtPSBpdC52YWx1ZSgpICogb3RoZXIuY29lZmYoaXQuaW5kZXgoKSxjb2wpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE1vZGUgJiBVbml0RGlhZykKKyAgICAgICAgICBvdGhlci5jb2VmZlJlZihpLGNvbCkgPSB0bXA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBvdGhlci5jb2VmZlJlZihpLGNvbCkgPSB0bXAvbF9paTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKy8vIGZvcndhcmQgc3Vic3RpdHV0aW9uLCBjb2wtbWFqb3IKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgTW9kZT4KK3N0cnVjdCBzcGFyc2Vfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxMaHMsUmhzLE1vZGUsTG93ZXIsQ29sTWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzOjpTY2FsYXIgU2NhbGFyOworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIFJocyYgb3RoZXIpCisgIHsKKyAgICBmb3IoaW50IGNvbD0wIDsgY29sPG90aGVyLmNvbHMoKSA7ICsrY29sKQorICAgIHsKKyAgICAgIGZvcihpbnQgaT0wOyBpPGxocy5jb2xzKCk7ICsraSkKKyAgICAgIHsKKyAgICAgICAgU2NhbGFyJiB0bXAgPSBvdGhlci5jb2VmZlJlZihpLGNvbCk7CisgICAgICAgIGlmICh0bXAhPVNjYWxhcigwKSkgLy8gb3B0aW1pemF0aW9uIHdoZW4gb3RoZXIgaXMgYWN0dWFsbHkgc3BhcnNlCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlbmFtZSBMaHM6OklubmVySXRlcmF0b3IgaXQobGhzLCBpKTsKKyAgICAgICAgICB3aGlsZShpdCAmJiBpdC5pbmRleCgpPGkpCisgICAgICAgICAgICArK2l0OworICAgICAgICAgIGlmKCEoTW9kZSAmIFVuaXREaWFnKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBlaWdlbl9hc3NlcnQoaXQgJiYgaXQuaW5kZXgoKT09aSk7CisgICAgICAgICAgICB0bXAgLz0gaXQudmFsdWUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGl0ICYmIGl0LmluZGV4KCk9PWkpCisgICAgICAgICAgICArK2l0OworICAgICAgICAgIGZvcig7IGl0OyArK2l0KQorICAgICAgICAgICAgb3RoZXIuY29lZmZSZWYoaXQuaW5kZXgoKSwgY29sKSAtPSB0bXAgKiBpdC52YWx1ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9OworCisvLyBiYWNrd2FyZCBzdWJzdGl0dXRpb24sIGNvbC1tYWpvcgordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlPgorc3RydWN0IHNwYXJzZV9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPExocyxSaHMsTW9kZSxVcHBlcixDb2xNYWpvcj4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBSaHM6OlNjYWxhciBTY2FsYXI7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgUmhzJiBvdGhlcikKKyAgeworICAgIGZvcihpbnQgY29sPTAgOyBjb2w8b3RoZXIuY29scygpIDsgKytjb2wpCisgICAgeworICAgICAgZm9yKGludCBpPWxocy5jb2xzKCktMTsgaT49MDsgLS1pKQorICAgICAgeworICAgICAgICBTY2FsYXImIHRtcCA9IG90aGVyLmNvZWZmUmVmKGksY29sKTsKKyAgICAgICAgaWYgKHRtcCE9U2NhbGFyKDApKSAvLyBvcHRpbWl6YXRpb24gd2hlbiBvdGhlciBpcyBhY3R1YWxseSBzcGFyc2UKKyAgICAgICAgeworICAgICAgICAgIGlmKCEoTW9kZSAmIFVuaXREaWFnKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIHJlcGxhY2UgdGhpcyBieSBhIGJpbmFyeSBzZWFyY2guIG1ha2Ugc3VyZSB0aGUgYmluYXJ5IHNlYXJjaCBpcyBzYWZlIGZvciBwYXJ0aWFsbHkgc29ydGVkIGVsZW1lbnRzCisgICAgICAgICAgICB0eXBlbmFtZSBMaHM6OlJldmVyc2VJbm5lckl0ZXJhdG9yIGl0KGxocywgaSk7CisgICAgICAgICAgICB3aGlsZShpdCAmJiBpdC5pbmRleCgpIT1pKQorICAgICAgICAgICAgICAtLWl0OworICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KGl0ICYmIGl0LmluZGV4KCk9PWkpOworICAgICAgICAgICAgb3RoZXIuY29lZmZSZWYoaSxjb2wpIC89IGl0LnZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHR5cGVuYW1lIExoczo6SW5uZXJJdGVyYXRvciBpdChsaHMsIGkpOworICAgICAgICAgIGZvcig7IGl0ICYmIGl0LmluZGV4KCk8aTsgKytpdCkKKyAgICAgICAgICAgIG90aGVyLmNvZWZmUmVmKGl0LmluZGV4KCksIGNvbCkgLT0gdG1wICogaXQudmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPHR5cGVuYW1lIEV4cHJlc3Npb25UeXBlLGludCBNb2RlPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBTcGFyc2VUcmlhbmd1bGFyVmlldzxFeHByZXNzaW9uVHlwZSxNb2RlPjo6c29sdmVJblBsYWNlKE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX21hdHJpeC5jb2xzKCkgPT0gbV9tYXRyaXgucm93cygpICYmIG1fbWF0cml4LmNvbHMoKSA9PSBvdGhlci5yb3dzKCkpOworICBlaWdlbl9hc3NlcnQoKCEoTW9kZSAmIFplcm9EaWFnKSkgJiYgYm9vbChNb2RlICYgKFVwcGVyfExvd2VyKSkpOworCisgIGVudW0geyBjb3B5ID0gaW50ZXJuYWw6OnRyYWl0czxPdGhlckRlcml2ZWQ+OjpGbGFncyAmIFJvd01ham9yQml0IH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8Y29weSwKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fbWF0cml4X3R5cGVfY29sdW1uX21ham9yPE90aGVyRGVyaXZlZD46OnR5cGUsIE90aGVyRGVyaXZlZCY+Ojp0eXBlIE90aGVyQ29weTsKKyAgT3RoZXJDb3B5IG90aGVyQ29weShvdGhlci5kZXJpdmVkKCkpOworCisgIGludGVybmFsOjpzcGFyc2Vfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxFeHByZXNzaW9uVHlwZSwgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9yZWZlcmVuY2U8T3RoZXJDb3B5Pjo6dHlwZSwgTW9kZT46OnJ1bihtX21hdHJpeCwgb3RoZXJDb3B5KTsKKworICBpZiAoY29weSkKKyAgICBvdGhlciA9IG90aGVyQ29weTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRXhwcmVzc2lvblR5cGUsaW50IE1vZGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Cit0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fbWF0cml4X3R5cGVfY29sdW1uX21ham9yPE90aGVyRGVyaXZlZD46OnR5cGUKK1NwYXJzZVRyaWFuZ3VsYXJWaWV3PEV4cHJlc3Npb25UeXBlLE1vZGU+Ojpzb2x2ZShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreworICB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fbWF0cml4X3R5cGVfY29sdW1uX21ham9yPE90aGVyRGVyaXZlZD46OnR5cGUgcmVzKG90aGVyKTsKKyAgc29sdmVJblBsYWNlKHJlcyk7CisgIHJldHVybiByZXM7Cit9CisKKy8vIHB1cmUgc3BhcnNlIHBhdGgKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlLAorICBpbnQgVXBMbyA9IChNb2RlICYgTG93ZXIpCisgICAgICAgICAgID8gTG93ZXIKKyAgICAgICAgICAgOiAoTW9kZSAmIFVwcGVyKQorICAgICAgICAgICA/IFVwcGVyCisgICAgICAgICAgIDogLTEsCisgIGludCBTdG9yYWdlT3JkZXIgPSBpbnQoTGhzOjpGbGFncykgJiAoUm93TWFqb3JCaXQpPgorc3RydWN0IHNwYXJzZV9zb2x2ZV90cmlhbmd1bGFyX3NwYXJzZV9zZWxlY3RvcjsKKworLy8gZm9yd2FyZCBzdWJzdGl0dXRpb24sIGNvbC1tYWpvcgordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIGludCBNb2RlLCBpbnQgVXBMbz4KK3N0cnVjdCBzcGFyc2Vfc29sdmVfdHJpYW5ndWxhcl9zcGFyc2Vfc2VsZWN0b3I8TGhzLFJocyxNb2RlLFVwTG8sQ29sTWFqb3I+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUmhzOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHByb21vdGVfaW5kZXhfdHlwZTx0eXBlbmFtZSB0cmFpdHM8TGhzPjo6SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxSaHM+OjpJbmRleD46OnR5cGUgSW5kZXg7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBMaHMmIGxocywgUmhzJiBvdGhlcikKKyAgeworICAgIGNvbnN0IGJvb2wgSXNMb3dlciA9IChVcExvPT1Mb3dlcik7CisgICAgQW1iaVZlY3RvcjxTY2FsYXIsSW5kZXg+IHRlbXBWZWN0b3Iob3RoZXIucm93cygpKjIpOworICAgIHRlbXBWZWN0b3Iuc2V0Qm91bmRzKDAsb3RoZXIucm93cygpKTsKKworICAgIFJocyByZXMob3RoZXIucm93cygpLCBvdGhlci5jb2xzKCkpOworICAgIHJlcy5yZXNlcnZlKG90aGVyLm5vblplcm9zKCkpOworCisgICAgZm9yKGludCBjb2w9MCA7IGNvbDxvdGhlci5jb2xzKCkgOyArK2NvbCkKKyAgICB7CisgICAgICAvLyBGSVhNRSBlc3RpbWF0ZSBudW1iZXIgb2Ygbm9uIHplcm9zCisgICAgICB0ZW1wVmVjdG9yLmluaXQoLjk5LypmbG9hdChvdGhlci5jb2woY29sKS5ub25aZXJvcygpKS9mbG9hdChvdGhlci5yb3dzKCkpKi8pOworICAgICAgdGVtcFZlY3Rvci5zZXRaZXJvKCk7CisgICAgICB0ZW1wVmVjdG9yLnJlc3RhcnQoKTsKKyAgICAgIGZvciAodHlwZW5hbWUgUmhzOjpJbm5lckl0ZXJhdG9yIHJoc0l0KG90aGVyLCBjb2wpOyByaHNJdDsgKytyaHNJdCkKKyAgICAgIHsKKyAgICAgICAgdGVtcFZlY3Rvci5jb2VmZlJlZihyaHNJdC5pbmRleCgpKSA9IHJoc0l0LnZhbHVlKCk7CisgICAgICB9CisKKyAgICAgIGZvcihpbnQgaT1Jc0xvd2VyPzA6bGhzLmNvbHMoKS0xOworICAgICAgICAgIElzTG93ZXI/aTxsaHMuY29scygpOmk+PTA7CisgICAgICAgICAgaSs9SXNMb3dlcj8xOi0xKQorICAgICAgeworICAgICAgICB0ZW1wVmVjdG9yLnJlc3RhcnQoKTsKKyAgICAgICAgU2NhbGFyJiBjaSA9IHRlbXBWZWN0b3IuY29lZmZSZWYoaSk7CisgICAgICAgIGlmIChjaSE9U2NhbGFyKDApKQorICAgICAgICB7CisgICAgICAgICAgLy8gZmluZAorICAgICAgICAgIHR5cGVuYW1lIExoczo6SW5uZXJJdGVyYXRvciBpdChsaHMsIGkpOworICAgICAgICAgIGlmKCEoTW9kZSAmIFVuaXREaWFnKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNMb3dlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZWlnZW5fYXNzZXJ0KGl0LmluZGV4KCk9PWkpOworICAgICAgICAgICAgICBjaSAvPSBpdC52YWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBjaSAvPSBsaHMuY29lZmYoaSxpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGVtcFZlY3Rvci5yZXN0YXJ0KCk7CisgICAgICAgICAgaWYgKElzTG93ZXIpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGl0LmluZGV4KCk9PWkpCisgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICBmb3IoOyBpdDsgKytpdCkKKyAgICAgICAgICAgICAgdGVtcFZlY3Rvci5jb2VmZlJlZihpdC5pbmRleCgpKSAtPSBjaSAqIGl0LnZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IoOyBpdCAmJiBpdC5pbmRleCgpPGk7ICsraXQpCisgICAgICAgICAgICAgIHRlbXBWZWN0b3IuY29lZmZSZWYoaXQuaW5kZXgoKSkgLT0gY2kgKiBpdC52YWx1ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisKKyAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAvLyBGSVhNRSBjb21wdXRlIGEgcmVmZXJlbmNlIHZhbHVlIHRvIGZpbHRlciB6ZXJvcworICAgICAgZm9yICh0eXBlbmFtZSBBbWJpVmVjdG9yPFNjYWxhcixJbmRleD46Okl0ZXJhdG9yIGl0KHRlbXBWZWN0b3IvKiwxZS0xMiovKTsgaXQ7ICsraXQpCisgICAgICB7CisgICAgICAgICsrIGNvdW50OworLy8gICAgICAgICBzdGQ6OmNlcnIgPDwgImZpbGwgIiA8PCBpdC5pbmRleCgpIDw8ICIsICIgPDwgY29sIDw8ICJcbiI7CisvLyAgICAgICAgIHN0ZDo6Y291dCA8PCBpdC52YWx1ZSgpIDw8ICIgICI7CisgICAgICAgIC8vIEZJWE1FIHVzZSBpbnNlcnRCYWNrCisgICAgICAgIHJlcy5pbnNlcnQoaXQuaW5kZXgoKSwgY29sKSA9IGl0LnZhbHVlKCk7CisgICAgICB9CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgInRlbXBWZWN0b3Iubm9uWmVyb3MoKSA9PSAiIDw8IGludChjb3VudCkgPDwgIiAvICIgPDwgKG90aGVyLnJvd3MoKSkgPDwgIlxuIjsKKyAgICB9CisgICAgcmVzLmZpbmFsaXplKCk7CisgICAgb3RoZXIgPSByZXMubWFya0FzUlZhbHVlKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFeHByZXNzaW9uVHlwZSxpbnQgTW9kZT4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK3ZvaWQgU3BhcnNlVHJpYW5ndWxhclZpZXc8RXhwcmVzc2lvblR5cGUsTW9kZT46OnNvbHZlSW5QbGFjZShTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9tYXRyaXguY29scygpID09IG1fbWF0cml4LnJvd3MoKSAmJiBtX21hdHJpeC5jb2xzKCkgPT0gb3RoZXIucm93cygpKTsKKyAgZWlnZW5fYXNzZXJ0KCAoIShNb2RlICYgWmVyb0RpYWcpKSAmJiBib29sKE1vZGUgJiAoVXBwZXJ8TG93ZXIpKSk7CisKKy8vICAgZW51bSB7IGNvcHkgPSBpbnRlcm5hbDo6dHJhaXRzPE90aGVyRGVyaXZlZD46OkZsYWdzICYgUm93TWFqb3JCaXQgfTsKKworLy8gICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDxjb3B5LAorLy8gICAgIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9tYXRyaXhfdHlwZV9jb2x1bW5fbWFqb3I8T3RoZXJEZXJpdmVkPjo6dHlwZSwgT3RoZXJEZXJpdmVkJj46OnR5cGUgT3RoZXJDb3B5OworLy8gICBPdGhlckNvcHkgb3RoZXJDb3B5KG90aGVyLmRlcml2ZWQoKSk7CisKKyAgaW50ZXJuYWw6OnNwYXJzZV9zb2x2ZV90cmlhbmd1bGFyX3NwYXJzZV9zZWxlY3RvcjxFeHByZXNzaW9uVHlwZSwgT3RoZXJEZXJpdmVkLCBNb2RlPjo6cnVuKG1fbWF0cml4LCBvdGhlci5kZXJpdmVkKCkpOworCisvLyAgIGlmIChjb3B5KQorLy8gICAgIG90aGVyID0gb3RoZXJDb3B5OworfQorCisjaWZkZWYgRUlHRU4yX1NVUFBPUlQKKworLy8gZGVwcmVjYXRlZCBzdHVmZjoKKworLyoqIFxkZXByZWNhdGVkICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQ+Ojpzb2x2ZVRyaWFuZ3VsYXJJblBsYWNlKE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7CisgIHRoaXMtPnRlbXBsYXRlIHRyaWFuZ3VsYXI8RmxhZ3MmKFVwcGVyfExvd2VyKT4oKS5zb2x2ZUluUGxhY2Uob3RoZXIpOworfQorCisvKiogXGRlcHJlY2F0ZWQgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Cit0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fbWF0cml4X3R5cGVfY29sdW1uX21ham9yPE90aGVyRGVyaXZlZD46OnR5cGUKK1NwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZD46OnNvbHZlVHJpYW5ndWxhcihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSBjb25zdAoreworICB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fbWF0cml4X3R5cGVfY29sdW1uX21ham9yPE90aGVyRGVyaXZlZD46OnR5cGUgcmVzKG90aGVyKTsKKyAgZGVyaXZlZCgpLnNvbHZlVHJpYW5ndWxhckluUGxhY2UocmVzKTsKKyAgcmV0dXJuIHJlczsKK30KKyNlbmRpZiAvLyBFSUdFTjJfU1VQUE9SVAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NQQVJTRVRSSUFOR1VMQVJTT0xWRVJfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1N0bFN1cHBvcnQvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvU3RsU3VwcG9ydC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjA5NGY2Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1N0bFN1cHBvcnQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fU3RsU3VwcG9ydF9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fU3RsU3VwcG9ydF9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9TdGxTdXBwb3J0IENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvU3RsU3VwcG9ydC9TdGREZXF1ZS5oIGIvRWlnZW4vc3JjL1N0bFN1cHBvcnQvU3RkRGVxdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU4ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1N0bFN1cHBvcnQvU3RkRGVxdWUuaApAQCAtMCwwICsxLDEzNCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ29vZ2xlbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NURERFUVVFX0gKKyNkZWZpbmUgRUlHRU5fU1REREVRVUVfSAorCisjaW5jbHVkZSAiRWlnZW4vc3JjL1N0bFN1cHBvcnQvZGV0YWlscy5oIgorCisvLyBEZWZpbmUgdGhlIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gKGUuZy4gbmVjZXNzYXJ5IGZvciB0aGUgSW50ZWwgY29tcGlsZXIpCisjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fR05VQ19fKQorICAjZGVmaW5lIEVJR0VOX0VYUExJQ0lUX1NUTF9ERVFVRV9JTlNUQU5USUFUSU9OKC4uLikgdGVtcGxhdGUgY2xhc3Mgc3RkOjpkZXF1ZTxfX1ZBX0FSR1NfXywgRUlHRU5fQUxJR05FRF9BTExPQ0FUT1I8X19WQV9BUkdTX18+ID47CisjZWxzZQorICAjZGVmaW5lIEVJR0VOX0VYUExJQ0lUX1NUTF9ERVFVRV9JTlNUQU5USUFUSU9OKC4uLikKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgc2VjdGlvbiBjb250YWlucyBhIGNvbnZlbmllbmNlIE1BQ1JPIHdoaWNoIGFsbG93cyBhbiBlYXN5IHNwZWNpYWxpemF0aW9uIG9mCisgKiBzdGQ6OmRlcXVlIHN1Y2ggdGhhdCBmb3IgZGF0YSB0eXBlcyB3aXRoIGFsaWdubWVudCBpc3N1ZXMgdGhlIGNvcnJlY3QgYWxsb2NhdG9yCisgKiBpcyB1c2VkIGF1dG9tYXRpY2FsbHkuCisgKi8KKyNkZWZpbmUgRUlHRU5fREVGSU5FX1NUTF9ERVFVRV9TUEVDSUFMSVpBVElPTiguLi4pIFwKK0VJR0VOX0VYUExJQ0lUX1NUTF9ERVFVRV9JTlNUQU5USUFUSU9OKF9fVkFfQVJHU19fKSBcCituYW1lc3BhY2Ugc3RkIFwKK3sgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXk+IFwKKyAgY2xhc3MgZGVxdWU8X19WQV9BUkdTX18sIF9BeT4gIFwKKyAgICA6IHB1YmxpYyBkZXF1ZTxfX1ZBX0FSR1NfXywgRUlHRU5fQUxJR05FRF9BTExPQ0FUT1I8X19WQV9BUkdTX18+ID4gXAorICB7IFwKKyAgICB0eXBlZGVmIGRlcXVlPF9fVkFfQVJHU19fLCBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxfX1ZBX0FSR1NfXz4gPiBkZXF1ZV9iYXNlOyBcCisgIHB1YmxpYzogXAorICAgIHR5cGVkZWYgX19WQV9BUkdTX18gdmFsdWVfdHlwZTsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgZGVxdWVfYmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7IFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGRlcXVlX2Jhc2U6OnNpemVfdHlwZSBzaXplX3R5cGU7ICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBkZXF1ZV9iYXNlOjppdGVyYXRvciBpdGVyYXRvcjsgIFwKKyAgICBleHBsaWNpdCBkZXF1ZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpIDogZGVxdWVfYmFzZShhKSB7fSAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+IFwKKyAgICBkZXF1ZShJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSkgOiBkZXF1ZV9iYXNlKGZpcnN0LCBsYXN0LCBhKSB7fSBcCisgICAgZGVxdWUoY29uc3QgZGVxdWUmIGMpIDogZGVxdWVfYmFzZShjKSB7fSAgXAorICAgIGV4cGxpY2l0IGRlcXVlKHNpemVfdHlwZSBudW0sIGNvbnN0IHZhbHVlX3R5cGUmIHZhbCA9IHZhbHVlX3R5cGUoKSkgOiBkZXF1ZV9iYXNlKG51bSwgdmFsKSB7fSBcCisgICAgZGVxdWUoaXRlcmF0b3Igc3RhcnQsIGl0ZXJhdG9yIGVuZCkgOiBkZXF1ZV9iYXNlKHN0YXJ0LCBlbmQpIHt9ICBcCisgICAgZGVxdWUmIG9wZXJhdG9yPShjb25zdCBkZXF1ZSYgeCkgeyAgXAorICAgICAgZGVxdWVfYmFzZTo6b3BlcmF0b3I9KHgpOyAgXAorICAgICAgcmV0dXJuICp0aGlzOyAgXAorICAgIH0gXAorICB9OyBcCit9CisKKy8vIGNoZWNrIHdoZXRoZXIgd2UgcmVhbGx5IG5lZWQgdGhlIHN0ZDo6ZGVxdWUgc3BlY2lhbGl6YXRpb24KKyNpZiAhKGRlZmluZWQoX0dMSUJDWFhfREVRVUUpICYmICghRUlHRU5fR05VQ19BVF9MRUFTVCg0LDEpKSkgLyogTm90ZSB0aGF0IGJlZm9yZSBnY2MtNC4xIHdlIGFscmVhZHkgaGF2ZTogc3RkOjpkZXF1ZTo6cmVzaXplKHNpemVfdHlwZSxjb25zdCBUJikuICovCisKK25hbWVzcGFjZSBzdGQgeworCisjZGVmaW5lIEVJR0VOX1NURF9ERVFVRV9TUEVDSUFMSVpBVElPTl9CT0RZIFwKKyAgcHVibGljOiAgXAorICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBkZXF1ZV9iYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgZGVxdWVfYmFzZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGRlcXVlX2Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOyAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgZGVxdWVfYmFzZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7ICBcCisgICAgZXhwbGljaXQgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IGRlcXVlX2Jhc2UoYSkge30gIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPiBcCisgICAgZGVxdWUoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpIFwKKyAgICA6IGRlcXVlX2Jhc2UoZmlyc3QsIGxhc3QsIGEpIHt9IFwKKyAgICBkZXF1ZShjb25zdCBkZXF1ZSYgYykgOiBkZXF1ZV9iYXNlKGMpIHt9ICBcCisgICAgZXhwbGljaXQgZGVxdWUoc2l6ZV90eXBlIG51bSwgY29uc3QgdmFsdWVfdHlwZSYgdmFsID0gdmFsdWVfdHlwZSgpKSA6IGRlcXVlX2Jhc2UobnVtLCB2YWwpIHt9IFwKKyAgICBkZXF1ZShpdGVyYXRvciBzdGFydCwgaXRlcmF0b3IgZW5kKSA6IGRlcXVlX2Jhc2Uoc3RhcnQsIGVuZCkge30gIFwKKyAgICBkZXF1ZSYgb3BlcmF0b3I9KGNvbnN0IGRlcXVlJiB4KSB7ICBcCisgICAgICBkZXF1ZV9iYXNlOjpvcGVyYXRvcj0oeCk7ICBcCisgICAgICByZXR1cm4gKnRoaXM7ICBcCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGNsYXNzIGRlcXVlPFQsRUlHRU5fQUxJR05FRF9BTExPQ0FUT1I8VD4gPgorICAgIDogcHVibGljIGRlcXVlPEVJR0VOX1dPUktBUk9VTkRfTVNWQ19TVExfU1VQUE9SVChUKSwKKyAgICAgICAgICAgICAgICAgICBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb248RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpPiA+Cit7CisgIHR5cGVkZWYgZGVxdWU8RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpLAorICAgICAgICAgICAgICAgIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbjxFSUdFTl9XT1JLQVJPVU5EX01TVkNfU1RMX1NVUFBPUlQoVCk+ID4gZGVxdWVfYmFzZTsKKyAgRUlHRU5fU1REX0RFUVVFX1NQRUNJQUxJWkFUSU9OX0JPRFkKKworICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpCisgIHsgcmVzaXplKG5ld19zaXplLCBUKCkpOyB9CisKKyNpZiBkZWZpbmVkKF9ERVFVRV8pCisgIC8vIHdvcmthcm91bmQgTVNWQyBzdGQ6OmRlcXVlIGltcGxlbWVudGF0aW9uCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeworICAgIGlmIChkZXF1ZV9iYXNlOjpzaXplKCkgPCBuZXdfc2l6ZSkKKyAgICAgIGRlcXVlX2Jhc2U6Ol9JbnNlcnRfbihkZXF1ZV9iYXNlOjplbmQoKSwgbmV3X3NpemUgLSBkZXF1ZV9iYXNlOjpzaXplKCksIHgpOworICAgIGVsc2UgaWYgKG5ld19zaXplIDwgZGVxdWVfYmFzZTo6c2l6ZSgpKQorICAgICAgZGVxdWVfYmFzZTo6ZXJhc2UoZGVxdWVfYmFzZTo6YmVnaW4oKSArIG5ld19zaXplLCBkZXF1ZV9iYXNlOjplbmQoKSk7CisgIH0KKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeyBkZXF1ZV9iYXNlOjpwdXNoX2JhY2soeCk7IH0gCisgIHZvaWQgcHVzaF9mcm9udChjb25zdCB2YWx1ZV90eXBlJiB4KQorICB7IGRlcXVlX2Jhc2U6OnB1c2hfZnJvbnQoeCk7IH0KKyAgdXNpbmcgZGVxdWVfYmFzZTo6aW5zZXJ0OyAgCisgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeyByZXR1cm4gZGVxdWVfYmFzZTo6aW5zZXJ0KHBvc2l0aW9uLHgpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgIHsgZGVxdWVfYmFzZTo6aW5zZXJ0KHBvc2l0aW9uLCBuZXdfc2l6ZSwgeCk7IH0KKyNlbGlmIGRlZmluZWQoX0dMSUJDWFhfREVRVUUpICYmIEVJR0VOX0dOVUNfQVRfTEVBU1QoNCwyKQorICAvLyB3b3JrYXJvdW5kIEdDQyBzdGQ6OmRlcXVlIGltcGxlbWVudGF0aW9uCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeworICAgIGlmIChuZXdfc2l6ZSA8IGRlcXVlX2Jhc2U6OnNpemUoKSkKKyAgICAgIGRlcXVlX2Jhc2U6Ol9NX2VyYXNlX2F0X2VuZCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgbmV3X3NpemUpOworICAgIGVsc2UKKyAgICAgIGRlcXVlX2Jhc2U6Omluc2VydChkZXF1ZV9iYXNlOjplbmQoKSwgbmV3X3NpemUgLSBkZXF1ZV9iYXNlOjpzaXplKCksIHgpOworICB9CisjZWxzZQorICAvLyBlaXRoZXIgR0NDIDQuMSBvciBub24tR0NDCisgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggc2hvdWxkIGFsd2F5cyB3b3JrLgorICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgIHsKKyAgICBpZiAobmV3X3NpemUgPCBkZXF1ZV9iYXNlOjpzaXplKCkpCisgICAgICBkZXF1ZV9iYXNlOjplcmFzZShkZXF1ZV9iYXNlOjpiZWdpbigpICsgbmV3X3NpemUsIGRlcXVlX2Jhc2U6OmVuZCgpKTsKKyAgICBlbHNlIGlmIChuZXdfc2l6ZSA+IGRlcXVlX2Jhc2U6OnNpemUoKSkKKyAgICAgIGRlcXVlX2Jhc2U6Omluc2VydChkZXF1ZV9iYXNlOjplbmQoKSwgbmV3X3NpemUgLSBkZXF1ZV9iYXNlOjpzaXplKCksIHgpOworICB9CisjZW5kaWYKKyAgfTsKK30KKworI2VuZGlmIC8vIGNoZWNrIHdoZXRoZXIgc3BlY2lhbGl6YXRpb24gaXMgYWN0dWFsbHkgcmVxdWlyZWQKKworI2VuZGlmIC8vIEVJR0VOX1NURERFUVVFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9TdGxTdXBwb3J0L1N0ZExpc3QuaCBiL0VpZ2VuL3NyYy9TdGxTdXBwb3J0L1N0ZExpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjczODFlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1N0bFN1cHBvcnQvU3RkTGlzdC5oCkBAIC0wLDAgKzEsMTE0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnb29nbGVtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1RETElTVF9ICisjZGVmaW5lIEVJR0VOX1NURExJU1RfSAorCisjaW5jbHVkZSAiRWlnZW4vc3JjL1N0bFN1cHBvcnQvZGV0YWlscy5oIgorCisvLyBEZWZpbmUgdGhlIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gKGUuZy4gbmVjZXNzYXJ5IGZvciB0aGUgSW50ZWwgY29tcGlsZXIpCisjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSB8fCBkZWZpbmVkKF9fR05VQ19fKQorICAjZGVmaW5lIEVJR0VOX0VYUExJQ0lUX1NUTF9MSVNUX0lOU1RBTlRJQVRJT04oLi4uKSB0ZW1wbGF0ZSBjbGFzcyBzdGQ6Omxpc3Q8X19WQV9BUkdTX18sIEVJR0VOX0FMSUdORURfQUxMT0NBVE9SPF9fVkFfQVJHU19fPiA+OworI2Vsc2UKKyAgI2RlZmluZSBFSUdFTl9FWFBMSUNJVF9TVExfTElTVF9JTlNUQU5USUFUSU9OKC4uLikKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgc2VjdGlvbiBjb250YWlucyBhIGNvbnZlbmllbmNlIE1BQ1JPIHdoaWNoIGFsbG93cyBhbiBlYXN5IHNwZWNpYWxpemF0aW9uIG9mCisgKiBzdGQ6Omxpc3Qgc3VjaCB0aGF0IGZvciBkYXRhIHR5cGVzIHdpdGggYWxpZ25tZW50IGlzc3VlcyB0aGUgY29ycmVjdCBhbGxvY2F0b3IKKyAqIGlzIHVzZWQgYXV0b21hdGljYWxseS4KKyAqLworI2RlZmluZSBFSUdFTl9ERUZJTkVfU1RMX0xJU1RfU1BFQ0lBTElaQVRJT04oLi4uKSBcCitFSUdFTl9FWFBMSUNJVF9TVExfTElTVF9JTlNUQU5USUFUSU9OKF9fVkFfQVJHU19fKSBcCituYW1lc3BhY2Ugc3RkIFwKK3sgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXk+IFwKKyAgY2xhc3MgbGlzdDxfX1ZBX0FSR1NfXywgX0F5PiAgXAorICAgIDogcHVibGljIGxpc3Q8X19WQV9BUkdTX18sIEVJR0VOX0FMSUdORURfQUxMT0NBVE9SPF9fVkFfQVJHU19fPiA+IFwKKyAgeyBcCisgICAgdHlwZWRlZiBsaXN0PF9fVkFfQVJHU19fLCBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxfX1ZBX0FSR1NfXz4gPiBsaXN0X2Jhc2U7IFwKKyAgcHVibGljOiBcCisgICAgdHlwZWRlZiBfX1ZBX0FSR1NfXyB2YWx1ZV90eXBlOyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBsaXN0X2Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBsaXN0X2Jhc2U6OnNpemVfdHlwZSBzaXplX3R5cGU7ICBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBsaXN0X2Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOyAgXAorICAgIGV4cGxpY2l0IGxpc3QoY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IGxpc3RfYmFzZShhKSB7fSAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+IFwKKyAgICBsaXN0KElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IGxpc3RfYmFzZShmaXJzdCwgbGFzdCwgYSkge30gXAorICAgIGxpc3QoY29uc3QgbGlzdCYgYykgOiBsaXN0X2Jhc2UoYykge30gIFwKKyAgICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBudW0sIGNvbnN0IHZhbHVlX3R5cGUmIHZhbCA9IHZhbHVlX3R5cGUoKSkgOiBsaXN0X2Jhc2UobnVtLCB2YWwpIHt9IFwKKyAgICBsaXN0KGl0ZXJhdG9yIHN0YXJ0LCBpdGVyYXRvciBlbmQpIDogbGlzdF9iYXNlKHN0YXJ0LCBlbmQpIHt9ICBcCisgICAgbGlzdCYgb3BlcmF0b3I9KGNvbnN0IGxpc3QmIHgpIHsgIFwKKyAgICAgIGxpc3RfYmFzZTo6b3BlcmF0b3I9KHgpOyAgXAorICAgICAgcmV0dXJuICp0aGlzOyAgXAorICAgIH0gXAorICB9OyBcCit9CisKKy8vIGNoZWNrIHdoZXRoZXIgd2UgcmVhbGx5IG5lZWQgdGhlIHN0ZDo6dmVjdG9yIHNwZWNpYWxpemF0aW9uCisjaWYgIShkZWZpbmVkKF9HTElCQ1hYX1ZFQ1RPUikgJiYgKCFFSUdFTl9HTlVDX0FUX0xFQVNUKDQsMSkpKSAvKiBOb3RlIHRoYXQgYmVmb3JlIGdjYy00LjEgd2UgYWxyZWFkeSBoYXZlOiBzdGQ6Omxpc3Q6OnJlc2l6ZShzaXplX3R5cGUsY29uc3QgVCYpLiAqLworCituYW1lc3BhY2Ugc3RkCit7CisKKyNkZWZpbmUgRUlHRU5fU1REX0xJU1RfU1BFQ0lBTElaQVRJT05fQk9EWSBcCisgIHB1YmxpYzogIFwKKyAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgbGlzdF9iYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgbGlzdF9iYXNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOyAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgbGlzdF9iYXNlOjppdGVyYXRvciBpdGVyYXRvcjsgIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGxpc3RfYmFzZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7ICBcCisgICAgZXhwbGljaXQgbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpIDogbGlzdF9iYXNlKGEpIHt9ICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4gXAorICAgIGxpc3QoSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpIFwKKyAgICA6IGxpc3RfYmFzZShmaXJzdCwgbGFzdCwgYSkge30gXAorICAgIGxpc3QoY29uc3QgbGlzdCYgYykgOiBsaXN0X2Jhc2UoYykge30gIFwKKyAgICBleHBsaWNpdCBsaXN0KHNpemVfdHlwZSBudW0sIGNvbnN0IHZhbHVlX3R5cGUmIHZhbCA9IHZhbHVlX3R5cGUoKSkgOiBsaXN0X2Jhc2UobnVtLCB2YWwpIHt9IFwKKyAgICBsaXN0KGl0ZXJhdG9yIHN0YXJ0LCBpdGVyYXRvciBlbmQpIDogbGlzdF9iYXNlKHN0YXJ0LCBlbmQpIHt9ICBcCisgICAgbGlzdCYgb3BlcmF0b3I9KGNvbnN0IGxpc3QmIHgpIHsgIFwKKyAgICBsaXN0X2Jhc2U6Om9wZXJhdG9yPSh4KTsgIFwKKyAgICByZXR1cm4gKnRoaXM7IFwKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGNsYXNzIGxpc3Q8VCxFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxUPiA+CisgICAgOiBwdWJsaWMgbGlzdDxFSUdFTl9XT1JLQVJPVU5EX01TVkNfU1RMX1NVUFBPUlQoVCksCisgICAgICAgICAgICAgICAgICBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb248RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpPiA+CisgIHsKKyAgICB0eXBlZGVmIGxpc3Q8RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpLAorICAgICAgICAgICAgICAgICBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb248RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpPiA+IGxpc3RfYmFzZTsKKyAgICBFSUdFTl9TVERfTElTVF9TUEVDSUFMSVpBVElPTl9CT0RZCisKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpCisgICAgeyByZXNpemUobmV3X3NpemUsIFQoKSk7IH0KKworICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgICB7CisgICAgICBpZiAobGlzdF9iYXNlOjpzaXplKCkgPCBuZXdfc2l6ZSkKKyAgICAgICAgbGlzdF9iYXNlOjppbnNlcnQobGlzdF9iYXNlOjplbmQoKSwgbmV3X3NpemUgLSBsaXN0X2Jhc2U6OnNpemUoKSwgeCk7CisgICAgICBlbHNlCisgICAgICAgIHdoaWxlIChuZXdfc2l6ZSA8IGxpc3RfYmFzZTo6c2l6ZSgpKSBsaXN0X2Jhc2U6OnBvcF9iYWNrKCk7CisgICAgfQorCisjaWYgZGVmaW5lZChfTElTVF8pCisgICAgLy8gd29ya2Fyb3VuZCBNU1ZDIHN0ZDo6bGlzdCBpbXBsZW1lbnRhdGlvbgorICAgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgICAgeyBsaXN0X2Jhc2U6OnB1c2hfYmFjayh4KTsgfSAKKyAgICB1c2luZyBsaXN0X2Jhc2U6Omluc2VydDsgIAorICAgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgICB7IHJldHVybiBsaXN0X2Jhc2U6Omluc2VydChwb3NpdGlvbix4KTsgfQorICAgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgICAgeyBsaXN0X2Jhc2U6Omluc2VydChwb3NpdGlvbiwgbmV3X3NpemUsIHgpOyB9CisjZW5kaWYKKyAgfTsKK30KKworI2VuZGlmIC8vIGNoZWNrIHdoZXRoZXIgc3BlY2lhbGl6YXRpb24gaXMgYWN0dWFsbHkgcmVxdWlyZWQKKworI2VuZGlmIC8vIEVJR0VOX1NURExJU1RfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1N0bFN1cHBvcnQvU3RkVmVjdG9yLmggYi9FaWdlbi9zcmMvU3RsU3VwcG9ydC9TdGRWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE5YWJlCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1N0bFN1cHBvcnQvU3RkVmVjdG9yLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA5IEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdvb2dsZW1haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TVERWRUNUT1JfSAorI2RlZmluZSBFSUdFTl9TVERWRUNUT1JfSAorCisjaW5jbHVkZSAiRWlnZW4vc3JjL1N0bFN1cHBvcnQvZGV0YWlscy5oIgorCisvKioKKyAqIFRoaXMgc2VjdGlvbiBjb250YWlucyBhIGNvbnZlbmllbmNlIE1BQ1JPIHdoaWNoIGFsbG93cyBhbiBlYXN5IHNwZWNpYWxpemF0aW9uIG9mCisgKiBzdGQ6OnZlY3RvciBzdWNoIHRoYXQgZm9yIGRhdGEgdHlwZXMgd2l0aCBhbGlnbm1lbnQgaXNzdWVzIHRoZSBjb3JyZWN0IGFsbG9jYXRvcgorICogaXMgdXNlZCBhdXRvbWF0aWNhbGx5LgorICovCisjZGVmaW5lIEVJR0VOX0RFRklORV9TVExfVkVDVE9SX1NQRUNJQUxJWkFUSU9OKC4uLikgXAorbmFtZXNwYWNlIHN0ZCBcCit7IFwKKyAgdGVtcGxhdGU8PiBcCisgIGNsYXNzIHZlY3RvcjxfX1ZBX0FSR1NfXywgc3RkOjphbGxvY2F0b3I8X19WQV9BUkdTX18+ID4gIFwKKyAgICA6IHB1YmxpYyB2ZWN0b3I8X19WQV9BUkdTX18sIEVJR0VOX0FMSUdORURfQUxMT0NBVE9SPF9fVkFfQVJHU19fPiA+IFwKKyAgeyBcCisgICAgdHlwZWRlZiB2ZWN0b3I8X19WQV9BUkdTX18sIEVJR0VOX0FMSUdORURfQUxMT0NBVE9SPF9fVkFfQVJHU19fPiA+IHZlY3Rvcl9iYXNlOyBcCisgIHB1YmxpYzogXAorICAgIHR5cGVkZWYgX19WQV9BUkdTX18gdmFsdWVfdHlwZTsgXAorICAgIHR5cGVkZWYgdmVjdG9yX2Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOyBcCisgICAgdHlwZWRlZiB2ZWN0b3JfYmFzZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsgIFwKKyAgICB0eXBlZGVmIHZlY3Rvcl9iYXNlOjppdGVyYXRvciBpdGVyYXRvcjsgIFwKKyAgICBleHBsaWNpdCB2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IHZlY3Rvcl9iYXNlKGEpIHt9ICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4gXAorICAgIHZlY3RvcihJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBhID0gYWxsb2NhdG9yX3R5cGUoKSkgOiB2ZWN0b3JfYmFzZShmaXJzdCwgbGFzdCwgYSkge30gXAorICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIGMpIDogdmVjdG9yX2Jhc2UoYykge30gIFwKKyAgICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIG51bSwgY29uc3QgdmFsdWVfdHlwZSYgdmFsID0gdmFsdWVfdHlwZSgpKSA6IHZlY3Rvcl9iYXNlKG51bSwgdmFsKSB7fSBcCisgICAgdmVjdG9yKGl0ZXJhdG9yIHN0YXJ0LCBpdGVyYXRvciBlbmQpIDogdmVjdG9yX2Jhc2Uoc3RhcnQsIGVuZCkge30gIFwKKyAgICB2ZWN0b3ImIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIHgpIHsgIFwKKyAgICAgIHZlY3Rvcl9iYXNlOjpvcGVyYXRvcj0oeCk7ICBcCisgICAgICByZXR1cm4gKnRoaXM7ICBcCisgICAgfSBcCisgIH07IFwKK30KKworbmFtZXNwYWNlIHN0ZCB7CisKKyNkZWZpbmUgRUlHRU5fU1REX1ZFQ1RPUl9TUEVDSUFMSVpBVElPTl9CT0RZIFwKKyAgcHVibGljOiAgXAorICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSB2ZWN0b3JfYmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7IFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHZlY3Rvcl9iYXNlOjpzaXplX3R5cGUgc2l6ZV90eXBlOyAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgdmVjdG9yX2Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOyAgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgdmVjdG9yX2Jhc2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOyAgXAorICAgIGV4cGxpY2l0IHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgYSA9IGFsbG9jYXRvcl90eXBlKCkpIDogdmVjdG9yX2Jhc2UoYSkge30gIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPiBcCisgICAgdmVjdG9yKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIGEgPSBhbGxvY2F0b3JfdHlwZSgpKSBcCisgICAgOiB2ZWN0b3JfYmFzZShmaXJzdCwgbGFzdCwgYSkge30gXAorICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIGMpIDogdmVjdG9yX2Jhc2UoYykge30gIFwKKyAgICBleHBsaWNpdCB2ZWN0b3Ioc2l6ZV90eXBlIG51bSwgY29uc3QgdmFsdWVfdHlwZSYgdmFsID0gdmFsdWVfdHlwZSgpKSA6IHZlY3Rvcl9iYXNlKG51bSwgdmFsKSB7fSBcCisgICAgdmVjdG9yKGl0ZXJhdG9yIHN0YXJ0LCBpdGVyYXRvciBlbmQpIDogdmVjdG9yX2Jhc2Uoc3RhcnQsIGVuZCkge30gIFwKKyAgICB2ZWN0b3ImIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIHgpIHsgIFwKKyAgICAgIHZlY3Rvcl9iYXNlOjpvcGVyYXRvcj0oeCk7ICBcCisgICAgICByZXR1cm4gKnRoaXM7ICBcCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGNsYXNzIHZlY3RvcjxULEVJR0VOX0FMSUdORURfQUxMT0NBVE9SPFQ+ID4KKyAgICA6IHB1YmxpYyB2ZWN0b3I8RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpLAorICAgICAgICAgICAgICAgICAgICBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb248RUlHRU5fV09SS0FST1VORF9NU1ZDX1NUTF9TVVBQT1JUKFQpPiA+Cit7CisgIHR5cGVkZWYgdmVjdG9yPEVJR0VOX1dPUktBUk9VTkRfTVNWQ19TVExfU1VQUE9SVChUKSwKKyAgICAgICAgICAgICAgICAgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uPEVJR0VOX1dPUktBUk9VTkRfTVNWQ19TVExfU1VQUE9SVChUKT4gPiB2ZWN0b3JfYmFzZTsKKyAgRUlHRU5fU1REX1ZFQ1RPUl9TUEVDSUFMSVpBVElPTl9CT0RZCisKKyAgdm9pZCByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplKQorICB7IHJlc2l6ZShuZXdfc2l6ZSwgVCgpKTsgfQorCisjaWYgZGVmaW5lZChfVkVDVE9SXykKKyAgLy8gd29ya2Fyb3VuZCBNU1ZDIHN0ZDo6dmVjdG9yIGltcGxlbWVudGF0aW9uCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeworICAgIGlmICh2ZWN0b3JfYmFzZTo6c2l6ZSgpIDwgbmV3X3NpemUpCisgICAgICB2ZWN0b3JfYmFzZTo6X0luc2VydF9uKHZlY3Rvcl9iYXNlOjplbmQoKSwgbmV3X3NpemUgLSB2ZWN0b3JfYmFzZTo6c2l6ZSgpLCB4KTsKKyAgICBlbHNlIGlmIChuZXdfc2l6ZSA8IHZlY3Rvcl9iYXNlOjpzaXplKCkpCisgICAgICB2ZWN0b3JfYmFzZTo6ZXJhc2UodmVjdG9yX2Jhc2U6OmJlZ2luKCkgKyBuZXdfc2l6ZSwgdmVjdG9yX2Jhc2U6OmVuZCgpKTsKKyAgfQorICB2b2lkIHB1c2hfYmFjayhjb25zdCB2YWx1ZV90eXBlJiB4KQorICB7IHZlY3Rvcl9iYXNlOjpwdXNoX2JhY2soeCk7IH0gCisgIHVzaW5nIHZlY3Rvcl9iYXNlOjppbnNlcnQ7ICAKKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiB4KQorICB7IHJldHVybiB2ZWN0b3JfYmFzZTo6aW5zZXJ0KHBvc2l0aW9uLHgpOyB9CisgIHZvaWQgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uLCBzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgIHsgdmVjdG9yX2Jhc2U6Omluc2VydChwb3NpdGlvbiwgbmV3X3NpemUsIHgpOyB9CisjZWxpZiBkZWZpbmVkKF9HTElCQ1hYX1ZFQ1RPUikgJiYgKCEoRUlHRU5fR05VQ19BVF9MRUFTVCg0LDEpKSkKKyAgLyogTm90ZSB0aGF0IGJlZm9yZSBnY2MtNC4xIHdlIGFscmVhZHkgaGF2ZTogc3RkOjp2ZWN0b3I6OnJlc2l6ZShzaXplX3R5cGUsY29uc3QgVCYpLgorICAgKiBIb3dldmVyLCB0aGlzIHNwZWNpYWxpemF0aW9uIGlzIHN0aWxsIG5lZWRlZCB0byBtYWtlIHRoZSBhYm92ZSBFSUdFTl9ERUZJTkVfU1RMX1ZFQ1RPUl9TUEVDSUFMSVpBVElPTiB0cmljayB0byB3b3JrLiAqLworICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUsIGNvbnN0IHZhbHVlX3R5cGUmIHgpCisgIHsKKyAgICB2ZWN0b3JfYmFzZTo6cmVzaXplKG5ld19zaXplLHgpOworICB9CisjZWxpZiBkZWZpbmVkKF9HTElCQ1hYX1ZFQ1RPUikgJiYgRUlHRU5fR05VQ19BVF9MRUFTVCg0LDIpCisgIC8vIHdvcmthcm91bmQgR0NDIHN0ZDo6dmVjdG9yIGltcGxlbWVudGF0aW9uCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeworICAgIGlmIChuZXdfc2l6ZSA8IHZlY3Rvcl9iYXNlOjpzaXplKCkpCisgICAgICB2ZWN0b3JfYmFzZTo6X01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBuZXdfc2l6ZSk7CisgICAgZWxzZQorICAgICAgdmVjdG9yX2Jhc2U6Omluc2VydCh2ZWN0b3JfYmFzZTo6ZW5kKCksIG5ld19zaXplIC0gdmVjdG9yX2Jhc2U6OnNpemUoKSwgeCk7CisgIH0KKyNlbHNlCisgIC8vIGVpdGhlciBHQ0MgNC4xIG9yIG5vbi1HQ0MKKyAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBzaG91bGQgYWx3YXlzIHdvcmsuCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgeCkKKyAgeworICAgIGlmIChuZXdfc2l6ZSA8IHZlY3Rvcl9iYXNlOjpzaXplKCkpCisgICAgICB2ZWN0b3JfYmFzZTo6ZXJhc2UodmVjdG9yX2Jhc2U6OmJlZ2luKCkgKyBuZXdfc2l6ZSwgdmVjdG9yX2Jhc2U6OmVuZCgpKTsKKyAgICBlbHNlIGlmIChuZXdfc2l6ZSA+IHZlY3Rvcl9iYXNlOjpzaXplKCkpCisgICAgICB2ZWN0b3JfYmFzZTo6aW5zZXJ0KHZlY3Rvcl9iYXNlOjplbmQoKSwgbmV3X3NpemUgLSB2ZWN0b3JfYmFzZTo6c2l6ZSgpLCB4KTsKKyAgfQorI2VuZGlmCisgIH07Cit9CisKKyNlbmRpZiAvLyBFSUdFTl9TVERWRUNUT1JfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1N0bFN1cHBvcnQvZGV0YWlscy5oIGIvRWlnZW4vc3JjL1N0bFN1cHBvcnQvZGV0YWlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZGViYzcKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3RsU3VwcG9ydC9kZXRhaWxzLmgKQEAgLTAsMCArMSw4NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ29vZ2xlbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NUTF9ERVRBSUxTX0gKKyNkZWZpbmUgRUlHRU5fU1RMX0RFVEFJTFNfSAorCisjaWZuZGVmIEVJR0VOX0FMSUdORURfQUxMT0NBVE9SCisgICNkZWZpbmUgRUlHRU5fQUxJR05FRF9BTExPQ0FUT1IgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yCisjZW5kaWYKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworICAvLyBUaGlzIG9uZSBpcyBuZWVkZWQgdG8gcHJldmVudCByZWltcGxlbWVudGluZyB0aGUgd2hvbGUgc3RkOjp2ZWN0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBjbGFzcyBhbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbiA6IHB1YmxpYyBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxUPgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHNpemVfdCAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgVCogICAgICAgIHBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBUKiAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIFQmICAgICAgICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCBUJiAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgVCAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPgorICAgIHN0cnVjdCByZWJpbmQKKyAgICB7CisgICAgICB0eXBlZGVmIGFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uPFU+IG90aGVyOworICAgIH07CisKKyAgICBhbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbigpIHt9CisgICAgYWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb24oY29uc3QgYWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb24mICkgOiBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxUPigpIHt9CisgICAgYWxpZ25lZF9hbGxvY2F0b3JfaW5kaXJlY3Rpb24oY29uc3QgRUlHRU5fQUxJR05FRF9BTExPQ0FUT1I8VD4mICkge30KKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPgorICAgIGFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uKGNvbnN0IGFsaWduZWRfYWxsb2NhdG9yX2luZGlyZWN0aW9uPFU+JiApIHt9CisgICAgdGVtcGxhdGU8Y2xhc3MgVT4KKyAgICBhbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbihjb25zdCBFSUdFTl9BTElHTkVEX0FMTE9DQVRPUjxVPiYgKSB7fQorICAgIH5hbGlnbmVkX2FsbG9jYXRvcl9pbmRpcmVjdGlvbigpIHt9CisgIH07CisKKyNpZmRlZiBfTVNDX1ZFUgorCisgIC8vIHNvbWV0aW1lcywgTVNWQyBkZXRlY3RzLCBhdCBjb21waWxlIHRpbWUsIHRoYXQgdGhlIGFyZ3VtZW50IHgKKyAgLy8gaW4gc3RkOjp2ZWN0b3I6OnJlc2l6ZShzaXplX3QgcyxUIHgpIHdvbid0IGJlIGFsaWduZWQgYW5kIGdlbmVyYXRlIGFuIGVycm9yCisgIC8vIGV2ZW4gaWYgdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQuIFdoZW5jZSB0aGlzIGxpdHRsZSB3cmFwcGVyLgorI2RlZmluZSBFSUdFTl9XT1JLQVJPVU5EX01TVkNfU1RMX1NVUFBPUlQoVCkgXAorICB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OmNvbmRpdGlvbmFsPCBcCisgICAgRWlnZW46OmludGVybmFsOjppc19hcml0aG1ldGljPFQ+Ojp2YWx1ZSwgXAorICAgIFQsIFwKKyAgICBFaWdlbjo6aW50ZXJuYWw6Ondvcmthcm91bmRfbXN2Y19zdGxfc3VwcG9ydDxUPiBcCisgID46OnR5cGUKKworICBuYW1lc3BhY2UgaW50ZXJuYWwgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3Qgd29ya2Fyb3VuZF9tc3ZjX3N0bF9zdXBwb3J0IDogcHVibGljIFQKKyAgeworICAgIGlubGluZSB3b3JrYXJvdW5kX21zdmNfc3RsX3N1cHBvcnQoKSA6IFQoKSB7fQorICAgIGlubGluZSB3b3JrYXJvdW5kX21zdmNfc3RsX3N1cHBvcnQoY29uc3QgVCYgb3RoZXIpIDogVChvdGhlcikge30KKyAgICBpbmxpbmUgb3BlcmF0b3IgVCYgKCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PFQqPih0aGlzKTsgfQorICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBUJiAoKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KHRoaXMpOyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJUPgorICAgIGlubGluZSBUJiBvcGVyYXRvcj0oY29uc3QgT3RoZXJUJiBvdGhlcikKKyAgICB7IFQ6Om9wZXJhdG9yPShvdGhlcik7IHJldHVybiAqdGhpczsgfQorICAgIGlubGluZSB3b3JrYXJvdW5kX21zdmNfc3RsX3N1cHBvcnQmIG9wZXJhdG9yPShjb25zdCB3b3JrYXJvdW5kX21zdmNfc3RsX3N1cHBvcnQmIG90aGVyKQorICAgIHsgVDo6b3BlcmF0b3I9KG90aGVyKTsgcmV0dXJuICp0aGlzOyB9CisgIH07CisgIH0KKworI2Vsc2UKKworI2RlZmluZSBFSUdFTl9XT1JLQVJPVU5EX01TVkNfU1RMX1NVUFBPUlQoVCkgVAorCisjZW5kaWYKKworfQorCisjZW5kaWYgLy8gRUlHRU5fU1RMX0RFVEFJTFNfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1N1cGVyTFVTdXBwb3J0L0NNYWtlTGlzdHMudHh0IGIvRWlnZW4vc3JjL1N1cGVyTFVTdXBwb3J0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOGViZTUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvU3VwZXJMVVN1cHBvcnQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fU3VwZXJMVVN1cHBvcnRfU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUyAKKyAgJHtFaWdlbl9TdXBlckxVU3VwcG9ydF9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9TdXBlckxVU3VwcG9ydCBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL1N1cGVyTFVTdXBwb3J0L1N1cGVyTFVTdXBwb3J0LmggYi9FaWdlbi9zcmMvU3VwZXJMVVN1cHBvcnQvU3VwZXJMVVN1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWZiMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL1N1cGVyTFVTdXBwb3J0L1N1cGVyTFVTdXBwb3J0LmgKQEAgLTAsMCArMSwxMDI1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TVVBFUkxVU1VQUE9SVF9ICisjZGVmaW5lIEVJR0VOX1NVUEVSTFVTVVBQT1JUX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKyNkZWZpbmUgREVDTF9HU1NWWChQUkVGSVgsRkxPQVRUWVBFLEtFWVRZUEUpCQlcCisgICAgZXh0ZXJuICJDIiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBzdHJ1Y3QgeyBGTE9BVFRZUEUgZm9yX2x1OyBGTE9BVFRZUEUgdG90YWxfbmVlZGVkOyBpbnQgZXhwYW5zaW9uczsgfSBQUkVGSVgjI21lbV91c2FnZV90OyAgIFwKKyAgICAgIGV4dGVybiB2b2lkIFBSRUZJWCMjZ3Nzdngoc3VwZXJsdV9vcHRpb25zX3QgKiwgU3VwZXJNYXRyaXggKiwgaW50ICosIGludCAqLCBpbnQgKiwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgRkxPQVRUWVBFICosIEZMT0FUVFlQRSAqLCBTdXBlck1hdHJpeCAqLCBTdXBlck1hdHJpeCAqLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICosIGludCwgU3VwZXJNYXRyaXggKiwgU3VwZXJNYXRyaXggKiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVRUWVBFICosIEZMT0FUVFlQRSAqLCBGTE9BVFRZUEUgKiwgRkxPQVRUWVBFICosICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRUZJWCMjbWVtX3VzYWdlX3QgKiwgU3VwZXJMVVN0YXRfdCAqLCBpbnQgKik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgZmxvYXQgU3VwZXJMVV9nc3N2eChzdXBlcmx1X29wdGlvbnNfdCAqb3B0aW9ucywgU3VwZXJNYXRyaXggKkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBpbnQgKnBlcm1fYywgaW50ICpwZXJtX3IsIGludCAqZXRyZWUsIGNoYXIgKmVxdWVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgRkxPQVRUWVBFICpSLCBGTE9BVFRZUEUgKkMsIFN1cGVyTWF0cml4ICpMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIFN1cGVyTWF0cml4ICpVLCB2b2lkICp3b3JrLCBpbnQgbHdvcmssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBTdXBlck1hdHJpeCAqQiwgU3VwZXJNYXRyaXggKlgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgRkxPQVRUWVBFICpyZWNpcF9waXZvdF9ncm93dGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIEZMT0FUVFlQRSAqcmNvbmQsIEZMT0FUVFlQRSAqZmVyciwgRkxPQVRUWVBFICpiZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBTdXBlckxVU3RhdF90ICpzdGF0cywgaW50ICppbmZvLCBLRVlUWVBFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBSRUZJWCMjbWVtX3VzYWdlX3QgbWVtX3VzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQUkVGSVgjI2dzc3Z4KG9wdGlvbnMsIEEsIHBlcm1fYywgcGVybV9yLCBldHJlZSwgZXF1ZWQsIFIsIEMsIEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBVLCB3b3JrLCBsd29yaywgQiwgWCwgcmVjaXBfcGl2b3RfZ3Jvd3RoLCByY29uZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgZmVyciwgYmVyciwgJm1lbV91c2FnZSwgc3RhdHMsIGluZm8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbWVtX3VzYWdlLmZvcl9sdTsgLyogYnl0ZXMgdXNlZCBieSB0aGUgZmFjdG9yIHN0b3JhZ2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworREVDTF9HU1NWWChzLGZsb2F0LGZsb2F0KQorREVDTF9HU1NWWChjLGZsb2F0LHN0ZDo6Y29tcGxleDxmbG9hdD4pCitERUNMX0dTU1ZYKGQsZG91YmxlLGRvdWJsZSkKK0RFQ0xfR1NTVlgoeixkb3VibGUsc3RkOjpjb21wbGV4PGRvdWJsZT4pCisKKyNpZmRlZiBNSUxVX0FMUEhBCisjZGVmaW5lIEVJR0VOX1NVUEVSTFVfSEFTX0lMVQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9TVVBFUkxVX0hBU19JTFUKKworLy8gc2ltaWxhcmx5IGZvciB0aGUgaW5jb21wbGV0ZSBmYWN0b3JpemF0aW9uIHVzaW5nIGdzaXN4CisjZGVmaW5lIERFQ0xfR1NJU1goUFJFRklYLEZMT0FUVFlQRSxLRVlUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXh0ZXJuICJDIiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBleHRlcm4gdm9pZCBQUkVGSVgjI2dzaXN4KHN1cGVybHVfb3B0aW9uc190ICosIFN1cGVyTWF0cml4ICosIGludCAqLCBpbnQgKiwgaW50ICosICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBGTE9BVFRZUEUgKiwgRkxPQVRUWVBFICosIFN1cGVyTWF0cml4ICosIFN1cGVyTWF0cml4ICosICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqLCBpbnQsIFN1cGVyTWF0cml4ICosIFN1cGVyTWF0cml4ICosIEZMT0FUVFlQRSAqLCBGTE9BVFRZUEUgKiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgUFJFRklYIyNtZW1fdXNhZ2VfdCAqLCBTdXBlckxVU3RhdF90ICosIGludCAqKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIGZsb2F0IFN1cGVyTFVfZ3Npc3goc3VwZXJsdV9vcHRpb25zX3QgKm9wdGlvbnMsIFN1cGVyTWF0cml4ICpBLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBpbnQgKnBlcm1fYywgaW50ICpwZXJtX3IsIGludCAqZXRyZWUsIGNoYXIgKmVxdWVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBGTE9BVFRZUEUgKlIsIEZMT0FUVFlQRSAqQywgU3VwZXJNYXRyaXggKkwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBTdXBlck1hdHJpeCAqVSwgdm9pZCAqd29yaywgaW50IGx3b3JrLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBTdXBlck1hdHJpeCAqQiwgU3VwZXJNYXRyaXggKlgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBGTE9BVFRZUEUgKnJlY2lwX3Bpdm90X2dyb3d0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBGTE9BVFRZUEUgKnJjb25kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBTdXBlckxVU3RhdF90ICpzdGF0cywgaW50ICppbmZvLCBLRVlUWVBFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFJFRklYIyNtZW1fdXNhZ2VfdCBtZW1fdXNhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFJFRklYIyNnc2lzeChvcHRpb25zLCBBLCBwZXJtX2MsIHBlcm1fciwgZXRyZWUsIGVxdWVkLCBSLCBDLCBMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBVLCB3b3JrLCBsd29yaywgQiwgWCwgcmVjaXBfcGl2b3RfZ3Jvd3RoLCByY29uZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAmbWVtX3VzYWdlLCBzdGF0cywgaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG1lbV91c2FnZS5mb3JfbHU7IC8qIGJ5dGVzIHVzZWQgYnkgdGhlIGZhY3RvciBzdG9yYWdlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworREVDTF9HU0lTWChzLGZsb2F0LGZsb2F0KQorREVDTF9HU0lTWChjLGZsb2F0LHN0ZDo6Y29tcGxleDxmbG9hdD4pCitERUNMX0dTSVNYKGQsZG91YmxlLGRvdWJsZSkKK0RFQ0xfR1NJU1goeixkb3VibGUsc3RkOjpjb21wbGV4PGRvdWJsZT4pCisKKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IFNsdU1hdHJpeE1hcEhlbHBlcjsKKworLyoqIFxpbnRlcm5hbAorICAqCisgICogQSB3cmFwcGVyIGNsYXNzIGZvciBTdXBlckxVIG1hdHJpY2VzLiBJdCBzdXBwb3J0cyBvbmx5IGNvbXByZXNzZWQgc3BhcnNlIG1hdHJpY2VzCisgICogYW5kIGRlbnNlIG1hdHJpY2VzLiBTdXBlcm5vZGFsIGFuZCBvdGhlciBmYW5jeSBmb3JtYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB3cmFwcGVyLgorICAqCisgICogVGhpcyB3cmFwcGVyIGNsYXNzIG1haW5seSBhaW1zIHRvIGF2b2lkcyB0aGUgbmVlZCBvZiBkeW5hbWljIGFsbG9jYXRpb24gb2YgdGhlIHN0b3JhZ2Ugc3RydWN0dXJlLgorICAqLworc3RydWN0IFNsdU1hdHJpeCA6IFN1cGVyTWF0cml4Cit7CisgIFNsdU1hdHJpeCgpCisgIHsKKyAgICBTdG9yZSA9ICZzdG9yYWdlOworICB9CisKKyAgU2x1TWF0cml4KGNvbnN0IFNsdU1hdHJpeCYgb3RoZXIpCisgICAgOiBTdXBlck1hdHJpeChvdGhlcikKKyAgeworICAgIFN0b3JlID0gJnN0b3JhZ2U7CisgICAgc3RvcmFnZSA9IG90aGVyLnN0b3JhZ2U7CisgIH0KKworICBTbHVNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBTbHVNYXRyaXgmIG90aGVyKQorICB7CisgICAgU3VwZXJNYXRyaXg6Om9wZXJhdG9yPShzdGF0aWNfY2FzdDxjb25zdCBTdXBlck1hdHJpeCY+KG90aGVyKSk7CisgICAgU3RvcmUgPSAmc3RvcmFnZTsKKyAgICBzdG9yYWdlID0gb3RoZXIuc3RvcmFnZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdHJ1Y3QKKyAgeworICAgIHVuaW9uIHtpbnQgbm56O2ludCBsZGE7fTsKKyAgICB2b2lkICp2YWx1ZXM7CisgICAgaW50ICppbm5lckluZDsKKyAgICBpbnQgKm91dGVySW5kOworICB9IHN0b3JhZ2U7CisKKyAgdm9pZCBzZXRTdG9yYWdlVHlwZShTdHlwZV90IHQpCisgIHsKKyAgICBTdHlwZSA9IHQ7CisgICAgaWYgKHQ9PVNMVV9OQyB8fCB0PT1TTFVfTlIgfHwgdD09U0xVX0ROKQorICAgICAgU3RvcmUgPSAmc3RvcmFnZTsKKyAgICBlbHNlCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJzdG9yYWdlIHR5cGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgU3RvcmUgPSAwOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KKyAgdm9pZCBzZXRTY2FsYXJUeXBlKCkKKyAgeworICAgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkKKyAgICAgIER0eXBlID0gU0xVX1M7CisgICAgZWxzZSBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLGRvdWJsZT46OnZhbHVlKQorICAgICAgRHR5cGUgPSBTTFVfRDsKKyAgICBlbHNlIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsc3RkOjpjb21wbGV4PGZsb2F0PiA+Ojp2YWx1ZSkKKyAgICAgIER0eXBlID0gU0xVX0M7CisgICAgZWxzZSBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnZhbHVlKQorICAgICAgRHR5cGUgPSBTTFVfWjsKKyAgICBlbHNlCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJTY2FsYXIgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IFN1cGVyTFUiKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorICBzdGF0aWMgU2x1TWF0cml4IE1hcChNYXRyaXhCYXNlPE1hdHJpeFR5cGU+JiBfbWF0KQorICB7CisgICAgTWF0cml4VHlwZSYgbWF0KF9tYXQuZGVyaXZlZCgpKTsKKyAgICBlaWdlbl9hc3NlcnQoICgoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpIT1Sb3dNYWpvckJpdCkgJiYgInJvdy1tYWpvciBkZW5zZSBtYXRyaWNlcyBhcmUgbm90IHN1cHBvcnRlZCBieSBTdXBlckxVIik7CisgICAgU2x1TWF0cml4IHJlczsKKyAgICByZXMuc2V0U3RvcmFnZVR5cGUoU0xVX0ROKTsKKyAgICByZXMuc2V0U2NhbGFyVHlwZTx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+KCk7CisgICAgcmVzLk10eXBlICAgICA9IFNMVV9HRTsKKworICAgIHJlcy5ucm93ICAgICAgPSBtYXQucm93cygpOworICAgIHJlcy5uY29sICAgICAgPSBtYXQuY29scygpOworCisgICAgcmVzLnN0b3JhZ2UubGRhICAgICAgID0gTWF0cml4VHlwZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lID8gbWF0LnNpemUoKSA6IG1hdC5vdXRlclN0cmlkZSgpOworICAgIHJlcy5zdG9yYWdlLnZhbHVlcyAgICA9IG1hdC5kYXRhKCk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgIHN0YXRpYyBTbHVNYXRyaXggTWFwKFNwYXJzZU1hdHJpeEJhc2U8TWF0cml4VHlwZT4mIG1hdCkKKyAgeworICAgIFNsdU1hdHJpeCByZXM7CisgICAgaWYgKChNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdCk9PVJvd01ham9yQml0KQorICAgIHsKKyAgICAgIHJlcy5zZXRTdG9yYWdlVHlwZShTTFVfTlIpOworICAgICAgcmVzLm5yb3cgICAgICA9IG1hdC5jb2xzKCk7CisgICAgICByZXMubmNvbCAgICAgID0gbWF0LnJvd3MoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJlcy5zZXRTdG9yYWdlVHlwZShTTFVfTkMpOworICAgICAgcmVzLm5yb3cgICAgICA9IG1hdC5yb3dzKCk7CisgICAgICByZXMubmNvbCAgICAgID0gbWF0LmNvbHMoKTsKKyAgICB9CisKKyAgICByZXMuTXR5cGUgICAgICAgPSBTTFVfR0U7CisKKyAgICByZXMuc3RvcmFnZS5ubnogICAgICAgPSBtYXQubm9uWmVyb3MoKTsKKyAgICByZXMuc3RvcmFnZS52YWx1ZXMgICAgPSBtYXQuZGVyaXZlZCgpLnZhbHVlUHRyKCk7CisgICAgcmVzLnN0b3JhZ2UuaW5uZXJJbmQgID0gbWF0LmRlcml2ZWQoKS5pbm5lckluZGV4UHRyKCk7CisgICAgcmVzLnN0b3JhZ2Uub3V0ZXJJbmQgID0gbWF0LmRlcml2ZWQoKS5vdXRlckluZGV4UHRyKCk7CisKKyAgICByZXMuc2V0U2NhbGFyVHlwZTx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+KCk7CisKKyAgICAvLyBGSVhNRSB0aGUgZm9sbG93aW5nIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlCisgICAgaWYgKE1hdHJpeFR5cGU6OkZsYWdzICYgVXBwZXIpCisgICAgICByZXMuTXR5cGUgPSBTTFVfVFJVOworICAgIGlmIChNYXRyaXhUeXBlOjpGbGFncyAmIExvd2VyKQorICAgICAgcmVzLk10eXBlID0gU0xVX1RSTDsKKworICAgIGVpZ2VuX2Fzc2VydCgoKE1hdHJpeFR5cGU6OkZsYWdzICYgU2VsZkFkam9pbnQpPT0wKSAmJiAiU2VsZkFkam9pbnQgbWF0cml4IHNoYXBlIG5vdCBzdXBwb3J0ZWQgYnkgU3VwZXJMVSIpOworCisgICAgcmV0dXJuIHJlczsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93cywgaW50IENvbHMsIGludCBPcHRpb25zLCBpbnQgTVJvd3MsIGludCBNQ29scz4KK3N0cnVjdCBTbHVNYXRyaXhNYXBIZWxwZXI8TWF0cml4PFNjYWxhcixSb3dzLENvbHMsT3B0aW9ucyxNUm93cyxNQ29scz4gPgoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzLE9wdGlvbnMsTVJvd3MsTUNvbHM+IE1hdHJpeFR5cGU7CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtYXQsIFNsdU1hdHJpeCYgcmVzKQorICB7CisgICAgZWlnZW5fYXNzZXJ0KCAoKE9wdGlvbnMmUm93TWFqb3IpIT1Sb3dNYWpvcikgJiYgInJvdy1tYWpvciBkZW5zZSBtYXRyaWNlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IFN1cGVyTFUiKTsKKyAgICByZXMuc2V0U3RvcmFnZVR5cGUoU0xVX0ROKTsKKyAgICByZXMuc2V0U2NhbGFyVHlwZTxTY2FsYXI+KCk7CisgICAgcmVzLk10eXBlICAgICA9IFNMVV9HRTsKKworICAgIHJlcy5ucm93ICAgICAgPSBtYXQucm93cygpOworICAgIHJlcy5uY29sICAgICAgPSBtYXQuY29scygpOworCisgICAgcmVzLnN0b3JhZ2UubGRhICAgICAgID0gbWF0Lm91dGVyU3RyaWRlKCk7CisgICAgcmVzLnN0b3JhZ2UudmFsdWVzICAgID0gbWF0LmRhdGEoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3N0cnVjdCBTbHVNYXRyaXhNYXBIZWxwZXI8U3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkPiA+Cit7CisgIHR5cGVkZWYgRGVyaXZlZCBNYXRyaXhUeXBlOworICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgbWF0LCBTbHVNYXRyaXgmIHJlcykKKyAgeworICAgIGlmICgoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCkKKyAgICB7CisgICAgICByZXMuc2V0U3RvcmFnZVR5cGUoU0xVX05SKTsKKyAgICAgIHJlcy5ucm93ICAgICAgPSBtYXQuY29scygpOworICAgICAgcmVzLm5jb2wgICAgICA9IG1hdC5yb3dzKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZXMuc2V0U3RvcmFnZVR5cGUoU0xVX05DKTsKKyAgICAgIHJlcy5ucm93ICAgICAgPSBtYXQucm93cygpOworICAgICAgcmVzLm5jb2wgICAgICA9IG1hdC5jb2xzKCk7CisgICAgfQorCisgICAgcmVzLk10eXBlICAgICAgID0gU0xVX0dFOworCisgICAgcmVzLnN0b3JhZ2Uubm56ICAgICAgID0gbWF0Lm5vblplcm9zKCk7CisgICAgcmVzLnN0b3JhZ2UudmFsdWVzICAgID0gbWF0LnZhbHVlUHRyKCk7CisgICAgcmVzLnN0b3JhZ2UuaW5uZXJJbmQgID0gbWF0LmlubmVySW5kZXhQdHIoKTsKKyAgICByZXMuc3RvcmFnZS5vdXRlckluZCAgPSBtYXQub3V0ZXJJbmRleFB0cigpOworCisgICAgcmVzLnNldFNjYWxhclR5cGU8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPigpOworCisgICAgLy8gRklYTUUgdGhlIGZvbGxvd2luZyBpcyBub3QgdmVyeSBhY2N1cmF0ZQorICAgIGlmIChNYXRyaXhUeXBlOjpGbGFncyAmIFVwcGVyKQorICAgICAgcmVzLk10eXBlID0gU0xVX1RSVTsKKyAgICBpZiAoTWF0cml4VHlwZTo6RmxhZ3MgJiBMb3dlcikKKyAgICAgIHJlcy5NdHlwZSA9IFNMVV9UUkw7CisKKyAgICBlaWdlbl9hc3NlcnQoKChNYXRyaXhUeXBlOjpGbGFncyAmIFNlbGZBZGpvaW50KT09MCkgJiYgIlNlbGZBZGpvaW50IG1hdHJpeCBzaGFwZSBub3Qgc3VwcG9ydGVkIGJ5IFN1cGVyTFUiKTsKKyAgfQorfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK1NsdU1hdHJpeCBhc1NsdU1hdHJpeChNYXRyaXhUeXBlJiBtYXQpCit7CisgIHJldHVybiBTbHVNYXRyaXg6Ok1hcChtYXQpOworfQorCisvKiogVmlldyBhIFN1cGVyIExVIG1hdHJpeCBhcyBhbiBFaWdlbiBleHByZXNzaW9uICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBGbGFncywgdHlwZW5hbWUgSW5kZXg+CitNYXBwZWRTcGFyc2VNYXRyaXg8U2NhbGFyLEZsYWdzLEluZGV4PiBtYXBfc3VwZXJsdShTbHVNYXRyaXgmIHNsdU1hdCkKK3sKKyAgZWlnZW5fYXNzZXJ0KChGbGFncyZSb3dNYWpvcik9PVJvd01ham9yICYmIHNsdU1hdC5TdHlwZSA9PSBTTFVfTlIKKyAgICAgICAgIHx8IChGbGFncyZDb2xNYWpvcik9PUNvbE1ham9yICYmIHNsdU1hdC5TdHlwZSA9PSBTTFVfTkMpOworCisgIEluZGV4IG91dGVyU2l6ZSA9IChGbGFncyZSb3dNYWpvcik9PVJvd01ham9yID8gc2x1TWF0Lm5jb2wgOiBzbHVNYXQubnJvdzsKKworICByZXR1cm4gTWFwcGVkU3BhcnNlTWF0cml4PFNjYWxhcixGbGFncyxJbmRleD4oCisgICAgc2x1TWF0Lm5yb3csIHNsdU1hdC5uY29sLCBzbHVNYXQuc3RvcmFnZS5vdXRlckluZFtvdXRlclNpemVdLAorICAgIHNsdU1hdC5zdG9yYWdlLm91dGVySW5kLCBzbHVNYXQuc3RvcmFnZS5pbm5lckluZCwgcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihzbHVNYXQuc3RvcmFnZS52YWx1ZXMpICk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGluZ3JvdXAgU3VwZXJMVVN1cHBvcnRfTW9kdWxlCisgICogXGNsYXNzIFN1cGVyTFVCYXNlCisgICogXGJyaWVmIFRoZSBiYXNlIGNsYXNzIGZvciB0aGUgZGlyZWN0IGFuZCBpbmNvbXBsZXRlIExVIGZhY3Rvcml6YXRpb24gb2YgU3VwZXJMVQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBTdXBlckxVQmFzZSA6IGludGVybmFsOjpub25jb3B5YWJsZQoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfTWF0cml4VHlwZSBNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxpbnQsIDEsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBJbnRSb3dWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PGludCwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IEludENvbFZlY3RvclR5cGU7ICAgIAorICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcj4gTFVNYXRyaXhUeXBlOworCisgIHB1YmxpYzoKKworICAgIFN1cGVyTFVCYXNlKCkge30KKworICAgIH5TdXBlckxVQmFzZSgpCisgICAgeworICAgICAgY2xlYXJGYWN0b3JzKCk7CisgICAgfQorICAgIAorICAgIERlcml2ZWQmIGRlcml2ZWQoKSB7IHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpOyB9CisgICAgY29uc3QgRGVyaXZlZCYgZGVyaXZlZCgpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyk7IH0KKyAgICAKKyAgICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4LnJvd3MoKTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXguY29scygpOyB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBTdXBlciBMVSBvcHRpb24gb2JqZWN0IHRvIGNvbmZpZ3VyZSB0aGUgIFN1cGVyIExVIGFsZ29yaXRobXMuICovCisgICAgaW5saW5lIHN1cGVybHVfb3B0aW9uc190JiBvcHRpb25zKCkgeyByZXR1cm4gbV9zbHVPcHRpb25zOyB9CisgICAgCisgICAgLyoqIFxicmllZiBSZXBvcnRzIHdoZXRoZXIgcHJldmlvdXMgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAqCisgICAgICAqIFxyZXR1cm5zIFxjIFN1Y2Nlc3MgaWYgY29tcHV0YXRpb24gd2FzIHN1Y2Nlc2Z1bCwKKyAgICAgICogICAgICAgICAgXGMgTnVtZXJpY2FsSXNzdWUgaWYgdGhlIG1hdHJpeC5hcHBlYXJzIHRvIGJlIG5lZ2F0aXZlLgorICAgICAgKi8KKyAgICBDb21wdXRhdGlvbkluZm8gaW5mbygpIGNvbnN0CisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1faXNJbml0aWFsaXplZCAmJiAiRGVjb21wb3NpdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICByZXR1cm4gbV9pbmZvOworICAgIH0KKworICAgIC8qKiBDb21wdXRlcyB0aGUgc3BhcnNlIENob2xlc2t5IGRlY29tcG9zaXRpb24gb2YgXGEgbWF0cml4ICovCisgICAgdm9pZCBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBkZXJpdmVkKCkuYW5hbHl6ZVBhdHRlcm4obWF0cml4KTsKKyAgICAgIGRlcml2ZWQoKS5mYWN0b3JpemUobWF0cml4KTsKKyAgICB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBzb2x1dGlvbiB4IG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPFN1cGVyTFVCYXNlLCBSaHM+IHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTdXBlckxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIGVpZ2VuX2Fzc2VydChyb3dzKCk9PWIucm93cygpCisgICAgICAgICAgICAgICAgJiYgIlN1cGVyTFU6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8U3VwZXJMVUJhc2UsIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKyAgICB9CisgICAgCisgICAgLyoqIFxyZXR1cm5zIHRoZSBzb2x1dGlvbiB4IG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAgICovCisvLyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorLy8gICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6c3BhcnNlX3NvbHZlX3JldHZhbDxTdXBlckxVLCBSaHM+IHNvbHZlKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKy8vICAgICB7CisvLyAgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJTdXBlckxVIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKy8vICAgICAgIGVpZ2VuX2Fzc2VydChyb3dzKCk9PWIucm93cygpCisvLyAgICAgICAgICAgICAgICAgJiYgIlN1cGVyTFU6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworLy8gICAgICAgcmV0dXJuIGludGVybmFsOjpzcGFyc2Vfc29sdmVfcmV0dmFsPFN1cGVyTFUsIFJocz4oKnRoaXMsIGIuZGVyaXZlZCgpKTsKKy8vICAgICB9CisgICAgCisgICAgLyoqIFBlcmZvcm1zIGEgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBvbiB0aGUgc3BhcmNpdHkgb2YgXGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBzb2x2aW5nIGZvciBzZXZlcmFsIHByb2JsZW1zIGhhdmluZyB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisgICAgICAqIAorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiAvKm1hdHJpeCovKQorICAgIHsKKyAgICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICBtX2luZm8gPSBTdWNjZXNzOworICAgICAgbV9hbmFseXNpc0lzT2sgPSB0cnVlOworICAgICAgbV9mYWN0b3JpemF0aW9uSXNPayA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJlYW0+CisgICAgdm9pZCBkdW1wTWVtb3J5KFN0cmVhbSYgcykKKyAgICB7fQorICAgIAorICBwcm90ZWN0ZWQ6CisgICAgCisgICAgdm9pZCBpbml0RmFjdG9yaXphdGlvbihjb25zdCBNYXRyaXhUeXBlJiBhKQorICAgIHsKKyAgICAgIHNldF9kZWZhdWx0X29wdGlvbnMoJnRoaXMtPm1fc2x1T3B0aW9ucyk7CisgICAgICAKKyAgICAgIGNvbnN0IGludCBzaXplID0gYS5yb3dzKCk7CisgICAgICBtX21hdHJpeCA9IGE7CisKKyAgICAgIG1fc2x1QSA9IGludGVybmFsOjphc1NsdU1hdHJpeChtX21hdHJpeCk7CisgICAgICBjbGVhckZhY3RvcnMoKTsKKworICAgICAgbV9wLnJlc2l6ZShzaXplKTsKKyAgICAgIG1fcS5yZXNpemUoc2l6ZSk7CisgICAgICBtX3NsdVJzY2FsZS5yZXNpemUoc2l6ZSk7CisgICAgICBtX3NsdUNzY2FsZS5yZXNpemUoc2l6ZSk7CisgICAgICBtX3NsdUV0cmVlLnJlc2l6ZShzaXplKTsKKworICAgICAgLy8gc2V0IGVtcHR5IEIgYW5kIFgKKyAgICAgIG1fc2x1Qi5zZXRTdG9yYWdlVHlwZShTTFVfRE4pOworICAgICAgbV9zbHVCLnNldFNjYWxhclR5cGU8U2NhbGFyPigpOworICAgICAgbV9zbHVCLk10eXBlICAgICAgICAgID0gU0xVX0dFOworICAgICAgbV9zbHVCLnN0b3JhZ2UudmFsdWVzID0gMDsKKyAgICAgIG1fc2x1Qi5ucm93ICAgICAgICAgICA9IDA7CisgICAgICBtX3NsdUIubmNvbCAgICAgICAgICAgPSAwOworICAgICAgbV9zbHVCLnN0b3JhZ2UubGRhICAgID0gc2l6ZTsKKyAgICAgIG1fc2x1WCAgICAgICAgICAgICAgICA9IG1fc2x1QjsKKyAgICAgIAorICAgICAgbV9leHRyYWN0ZWREYXRhQXJlRGlydHkgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICB2b2lkIGluaXQoKQorICAgIHsKKyAgICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICAgIG1faXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgbV9zbHVMLlN0b3JlID0gMDsKKyAgICAgIG1fc2x1VS5TdG9yZSA9IDA7CisgICAgfQorICAgIAorICAgIHZvaWQgZXh0cmFjdERhdGEoKSBjb25zdDsKKworICAgIHZvaWQgY2xlYXJGYWN0b3JzKCkKKyAgICB7CisgICAgICBpZihtX3NsdUwuU3RvcmUpCisgICAgICAgIERlc3Ryb3lfU3VwZXJOb2RlX01hdHJpeCgmbV9zbHVMKTsKKyAgICAgIGlmKG1fc2x1VS5TdG9yZSkKKyAgICAgICAgRGVzdHJveV9Db21wQ29sX01hdHJpeCgmbV9zbHVVKTsKKworICAgICAgbV9zbHVMLlN0b3JlID0gMDsKKyAgICAgIG1fc2x1VS5TdG9yZSA9IDA7CisKKyAgICAgIG1lbXNldCgmbV9zbHVMLDAsc2l6ZW9mIG1fc2x1TCk7CisgICAgICBtZW1zZXQoJm1fc2x1VSwwLHNpemVvZiBtX3NsdVUpOworICAgIH0KKworICAgIC8vIGNhY2hlZCBkYXRhIHRvIHJlZHVjZSByZWFsbG9jYXRpb24sIGV0Yy4KKyAgICBtdXRhYmxlIExVTWF0cml4VHlwZSBtX2w7CisgICAgbXV0YWJsZSBMVU1hdHJpeFR5cGUgbV91OworICAgIG11dGFibGUgSW50Q29sVmVjdG9yVHlwZSBtX3A7CisgICAgbXV0YWJsZSBJbnRSb3dWZWN0b3JUeXBlIG1fcTsKKworICAgIG11dGFibGUgTFVNYXRyaXhUeXBlIG1fbWF0cml4OyAgLy8gY29weSBvZiB0aGUgZmFjdG9yaXplZCBtYXRyaXgKKyAgICBtdXRhYmxlIFNsdU1hdHJpeCBtX3NsdUE7CisgICAgbXV0YWJsZSBTdXBlck1hdHJpeCBtX3NsdUwsIG1fc2x1VTsKKyAgICBtdXRhYmxlIFNsdU1hdHJpeCBtX3NsdUIsIG1fc2x1WDsKKyAgICBtdXRhYmxlIFN1cGVyTFVTdGF0X3QgbV9zbHVTdGF0OworICAgIG11dGFibGUgc3VwZXJsdV9vcHRpb25zX3QgbV9zbHVPcHRpb25zOworICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8aW50PiBtX3NsdUV0cmVlOworICAgIG11dGFibGUgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYywxPiBtX3NsdVJzY2FsZSwgbV9zbHVDc2NhbGU7CisgICAgbXV0YWJsZSBNYXRyaXg8UmVhbFNjYWxhcixEeW5hbWljLDE+IG1fc2x1RmVyciwgbV9zbHVCZXJyOworICAgIG11dGFibGUgY2hhciBtX3NsdUVxdWVkOworCisgICAgbXV0YWJsZSBDb21wdXRhdGlvbkluZm8gbV9pbmZvOworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworICAgIGludCBtX2ZhY3Rvcml6YXRpb25Jc09rOworICAgIGludCBtX2FuYWx5c2lzSXNPazsKKyAgICBtdXRhYmxlIGJvb2wgbV9leHRyYWN0ZWREYXRhQXJlRGlydHk7CisgICAgCisgIHByaXZhdGU6CisgICAgU3VwZXJMVUJhc2UoU3VwZXJMVUJhc2UmICkgeyB9Cit9OworCisKKy8qKiBcaW5ncm91cCBTdXBlckxVU3VwcG9ydF9Nb2R1bGUKKyAgKiBcY2xhc3MgU3VwZXJMVQorICAqIFxicmllZiBBIHNwYXJzZSBkaXJlY3QgTFUgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIHRoZSBTdXBlckxVIGxpYnJhcnkKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgZGlyZWN0IExVIGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgU3VwZXJMVSBsaWJyYXJ5LiBUaGUgc3BhcnNlIG1hdHJpeCBBIG11c3QgYmUgc3F1YXJlZCBhbmQgaW52ZXJ0aWJsZS4gVGhlIHZlY3RvcnMgb3IgbWF0cmljZXMKKyAgKiBYIGFuZCBCIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKgorICAqIFxzYSBccmVmIFR1dG9yaWFsU3BhcnNlRGlyZWN0U29sdmVycworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitjbGFzcyBTdXBlckxVIDogcHVibGljIFN1cGVyTFVCYXNlPF9NYXRyaXhUeXBlLFN1cGVyTFU8X01hdHJpeFR5cGU+ID4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU3VwZXJMVUJhc2U8X01hdHJpeFR5cGUsU3VwZXJMVT4gQmFzZTsKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpJbnRSb3dWZWN0b3JUeXBlIEludFJvd1ZlY3RvclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpJbnRDb2xWZWN0b3JUeXBlIEludENvbFZlY3RvclR5cGU7ICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6TFVNYXRyaXhUeXBlIExVTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIFRyaWFuZ3VsYXJWaWV3PExVTWF0cml4VHlwZSwgTG93ZXJ8VW5pdERpYWc+ICBMTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIFRyaWFuZ3VsYXJWaWV3PExVTWF0cml4VHlwZSwgIFVwcGVyPiAgICAgICAgICAgVU1hdHJpeFR5cGU7CisKKyAgcHVibGljOgorCisgICAgU3VwZXJMVSgpIDogQmFzZSgpIHsgaW5pdCgpOyB9CisKKyAgICBTdXBlckxVKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkgOiBCYXNlKCkKKyAgICB7CisgICAgICBCYXNlOjppbml0KCk7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorCisgICAgflN1cGVyTFUoKQorICAgIHsKKyAgICB9CisgICAgCisgICAgLyoqIFBlcmZvcm1zIGEgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBvbiB0aGUgc3BhcmNpdHkgb2YgXGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBzb2x2aW5nIGZvciBzZXZlcmFsIHByb2JsZW1zIGhhdmluZyB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisgICAgICAqIAorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgbV9pbmZvID0gSW52YWxpZElucHV0OworICAgICAgbV9pc0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgICBCYXNlOjphbmFseXplUGF0dGVybihtYXRyaXgpOworICAgIH0KKyAgICAKKyAgICAvKiogUGVyZm9ybXMgYSBudW1lcmljIGRlY29tcG9zaXRpb24gb2YgXGEgbWF0cml4CisgICAgICAqCisgICAgICAqIFRoZSBnaXZlbiBtYXRyaXggbXVzdCBoYXMgdGhlIHNhbWUgc3BhcmNpdHkgdGhhbiB0aGUgbWF0cml4IG9uIHdoaWNoIHRoZSBzeW1ib2xpYyBkZWNvbXBvc2l0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4KKyAgICAgICoKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCkKKyAgICAgICovCisgICAgdm9pZCBmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KTsKKyAgICAKKyAgICAjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgLyoqIFxpbnRlcm5hbCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiAmYiwgTWF0cml4QmFzZTxEZXN0PiAmZGVzdCkgY29uc3Q7CisgICAgI2VuZGlmIC8vIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisgICAgCisgICAgaW5saW5lIGNvbnN0IExNYXRyaXhUeXBlJiBtYXRyaXhMKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAobV9leHRyYWN0ZWREYXRhQXJlRGlydHkpIHRoaXMtPmV4dHJhY3REYXRhKCk7CisgICAgICByZXR1cm4gbV9sOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBVTWF0cml4VHlwZSYgbWF0cml4VSgpIGNvbnN0CisgICAgeworICAgICAgaWYgKG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5KSB0aGlzLT5leHRyYWN0RGF0YSgpOworICAgICAgcmV0dXJuIG1fdTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgSW50Q29sVmVjdG9yVHlwZSYgcGVybXV0YXRpb25QKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAobV9leHRyYWN0ZWREYXRhQXJlRGlydHkpIHRoaXMtPmV4dHJhY3REYXRhKCk7CisgICAgICByZXR1cm4gbV9wOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBJbnRSb3dWZWN0b3JUeXBlJiBwZXJtdXRhdGlvblEoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eSkgdGhpcy0+ZXh0cmFjdERhdGEoKTsKKyAgICAgIHJldHVybiBtX3E7CisgICAgfQorICAgIAorICAgIFNjYWxhciBkZXRlcm1pbmFudCgpIGNvbnN0OworICAgIAorICBwcm90ZWN0ZWQ6CisgICAgCisgICAgdXNpbmcgQmFzZTo6bV9tYXRyaXg7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVPcHRpb25zOworICAgIHVzaW5nIEJhc2U6Om1fc2x1QTsKKyAgICB1c2luZyBCYXNlOjptX3NsdUI7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVYOworICAgIHVzaW5nIEJhc2U6Om1fcDsKKyAgICB1c2luZyBCYXNlOjptX3E7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVFdHJlZTsKKyAgICB1c2luZyBCYXNlOjptX3NsdUVxdWVkOworICAgIHVzaW5nIEJhc2U6Om1fc2x1UnNjYWxlOworICAgIHVzaW5nIEJhc2U6Om1fc2x1Q3NjYWxlOworICAgIHVzaW5nIEJhc2U6Om1fc2x1TDsKKyAgICB1c2luZyBCYXNlOjptX3NsdVU7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVTdGF0OworICAgIHVzaW5nIEJhc2U6Om1fc2x1RmVycjsKKyAgICB1c2luZyBCYXNlOjptX3NsdUJlcnI7CisgICAgdXNpbmcgQmFzZTo6bV9sOworICAgIHVzaW5nIEJhc2U6Om1fdTsKKyAgICAKKyAgICB1c2luZyBCYXNlOjptX2FuYWx5c2lzSXNPazsKKyAgICB1c2luZyBCYXNlOjptX2ZhY3Rvcml6YXRpb25Jc09rOworICAgIHVzaW5nIEJhc2U6Om1fZXh0cmFjdGVkRGF0YUFyZURpcnR5OworICAgIHVzaW5nIEJhc2U6Om1faXNJbml0aWFsaXplZDsKKyAgICB1c2luZyBCYXNlOjptX2luZm87CisgICAgCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBCYXNlOjppbml0KCk7CisgICAgICAKKyAgICAgIHNldF9kZWZhdWx0X29wdGlvbnMoJnRoaXMtPm1fc2x1T3B0aW9ucyk7CisgICAgICBtX3NsdU9wdGlvbnMuUHJpbnRTdGF0ICAgICAgICA9IE5POworICAgICAgbV9zbHVPcHRpb25zLkNvbmRpdGlvbk51bWJlciAgPSBOTzsKKyAgICAgIG1fc2x1T3B0aW9ucy5UcmFucyAgICAgICAgICAgID0gTk9UUkFOUzsKKyAgICAgIG1fc2x1T3B0aW9ucy5Db2xQZXJtICAgICAgICAgID0gQ09MQU1EOworICAgIH0KKyAgICAKKyAgICAKKyAgcHJpdmF0ZToKKyAgICBTdXBlckxVKFN1cGVyTFUmICkgeyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBTdXBlckxVPE1hdHJpeFR5cGU+OjpmYWN0b3JpemUoY29uc3QgTWF0cml4VHlwZSYgYSkKK3sKKyAgZWlnZW5fYXNzZXJ0KG1fYW5hbHlzaXNJc09rICYmICJZb3UgbXVzdCBmaXJzdCBjYWxsIGFuYWx5emVQYXR0ZXJuKCkiKTsKKyAgaWYoIW1fYW5hbHlzaXNJc09rKQorICB7CisgICAgbV9pbmZvID0gSW52YWxpZElucHV0OworICAgIHJldHVybjsKKyAgfQorICAKKyAgdGhpcy0+aW5pdEZhY3Rvcml6YXRpb24oYSk7CisgIAorICBpbnQgaW5mbyA9IDA7CisgIFJlYWxTY2FsYXIgcmVjaXBfcGl2b3RfZ3Jvd3RoLCByY29uZDsKKyAgUmVhbFNjYWxhciBmZXJyLCBiZXJyOworCisgIFN0YXRJbml0KCZtX3NsdVN0YXQpOworICBTdXBlckxVX2dzc3Z4KCZtX3NsdU9wdGlvbnMsICZtX3NsdUEsIG1fcS5kYXRhKCksIG1fcC5kYXRhKCksICZtX3NsdUV0cmVlWzBdLAorICAgICAgICAgICAgICAgICZtX3NsdUVxdWVkLCAmbV9zbHVSc2NhbGVbMF0sICZtX3NsdUNzY2FsZVswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVMLCAmbV9zbHVVLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgJm1fc2x1QiwgJm1fc2x1WCwKKyAgICAgICAgICAgICAgICAmcmVjaXBfcGl2b3RfZ3Jvd3RoLCAmcmNvbmQsCisgICAgICAgICAgICAgICAgJmZlcnIsICZiZXJyLAorICAgICAgICAgICAgICAgICZtX3NsdVN0YXQsICZpbmZvLCBTY2FsYXIoKSk7CisgIFN0YXRGcmVlKCZtX3NsdVN0YXQpOworCisgIG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5ID0gdHJ1ZTsKKworICAvLyBGSVhNRSBob3cgdG8gYmV0dGVyIGNoZWNrIGZvciBlcnJvcnMgPz8/CisgIG1faW5mbyA9IGluZm8gPT0gMCA/IFN1Y2Nlc3MgOiBOdW1lcmljYWxJc3N1ZTsKKyAgbV9mYWN0b3JpemF0aW9uSXNPayA9IHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KK3ZvaWQgU3VwZXJMVTxNYXRyaXhUeXBlPjo6X3NvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiAmYiwgTWF0cml4QmFzZTxEZXN0PiYgeCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlRoZSBkZWNvbXBvc2l0aW9uIGlzIG5vdCBpbiBhIHZhbGlkIHN0YXRlIGZvciBzb2x2aW5nLCB5b3UgbXVzdCBmaXJzdCBjYWxsIGVpdGhlciBjb21wdXRlKCkgb3IgYW5hbHl6ZVBhdHRlcm4oKS9mYWN0b3JpemUoKSIpOworCisgIGNvbnN0IGludCBzaXplID0gbV9tYXRyaXgucm93cygpOworICBjb25zdCBpbnQgcmhzQ29scyA9IGIuY29scygpOworICBlaWdlbl9hc3NlcnQoc2l6ZT09Yi5yb3dzKCkpOworCisgIG1fc2x1T3B0aW9ucy5UcmFucyA9IE5PVFJBTlM7CisgIG1fc2x1T3B0aW9ucy5GYWN0ID0gRkFDVE9SRUQ7CisgIG1fc2x1T3B0aW9ucy5JdGVyUmVmaW5lID0gTk9SRUZJTkU7CisgIAorCisgIG1fc2x1RmVyci5yZXNpemUocmhzQ29scyk7CisgIG1fc2x1QmVyci5yZXNpemUocmhzQ29scyk7CisgIG1fc2x1QiA9IFNsdU1hdHJpeDo6TWFwKGIuY29uc3RfY2FzdF9kZXJpdmVkKCkpOworICBtX3NsdVggPSBTbHVNYXRyaXg6Ok1hcCh4LmRlcml2ZWQoKSk7CisgIAorICB0eXBlbmFtZSBSaHM6OlBsYWluT2JqZWN0IGJfY3B5OworICBpZihtX3NsdUVxdWVkIT0nTicpCisgIHsKKyAgICBiX2NweSA9IGI7CisgICAgbV9zbHVCID0gU2x1TWF0cml4OjpNYXAoYl9jcHkuY29uc3RfY2FzdF9kZXJpdmVkKCkpOyAgCisgIH0KKworICBTdGF0SW5pdCgmbV9zbHVTdGF0KTsKKyAgaW50IGluZm8gPSAwOworICBSZWFsU2NhbGFyIHJlY2lwX3Bpdm90X2dyb3d0aCwgcmNvbmQ7CisgIFN1cGVyTFVfZ3NzdngoJm1fc2x1T3B0aW9ucywgJm1fc2x1QSwKKyAgICAgICAgICAgICAgICBtX3EuZGF0YSgpLCBtX3AuZGF0YSgpLAorICAgICAgICAgICAgICAgICZtX3NsdUV0cmVlWzBdLCAmbV9zbHVFcXVlZCwKKyAgICAgICAgICAgICAgICAmbV9zbHVSc2NhbGVbMF0sICZtX3NsdUNzY2FsZVswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVMLCAmbV9zbHVVLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgJm1fc2x1QiwgJm1fc2x1WCwKKyAgICAgICAgICAgICAgICAmcmVjaXBfcGl2b3RfZ3Jvd3RoLCAmcmNvbmQsCisgICAgICAgICAgICAgICAgJm1fc2x1RmVyclswXSwgJm1fc2x1QmVyclswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVTdGF0LCAmaW5mbywgU2NhbGFyKCkpOworICBTdGF0RnJlZSgmbV9zbHVTdGF0KTsKKyAgbV9pbmZvID0gaW5mbz09MCA/IFN1Y2Nlc3MgOiBOdW1lcmljYWxJc3N1ZTsKK30KKworLy8gdGhlIGNvZGUgb2YgdGhpcyBleHRyYWN0RGF0YSgpIGZ1bmN0aW9uIGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgU3VwZXJMVSdzIE1hdGxhYiBzdXBwb3J0IGNvZGUsCisvLworLy8gIENvcHlyaWdodCAoYykgMTk5NCBieSBYZXJveCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gIFRISVMgTUFURVJJQUwgSVMgUFJPVklERUQgQVMgSVMsIFdJVEggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWQorLy8gIEVYUFJFU1NFRCBPUiBJTVBMSUVELiAgQU5ZIFVTRSBJUyBBVCBZT1VSIE9XTiBSSVNLLgorLy8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIFN1cGVyTFVCYXNlPE1hdHJpeFR5cGUsRGVyaXZlZD46OmV4dHJhY3REYXRhKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KG1fZmFjdG9yaXphdGlvbklzT2sgJiYgIlRoZSBkZWNvbXBvc2l0aW9uIGlzIG5vdCBpbiBhIHZhbGlkIHN0YXRlIGZvciBleHRyYWN0aW5nIGZhY3RvcnMsIHlvdSBtdXN0IGZpcnN0IGNhbGwgZWl0aGVyIGNvbXB1dGUoKSBvciBhbmFseXplUGF0dGVybigpL2ZhY3Rvcml6ZSgpIik7CisgIGlmIChtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eSkKKyAgeworICAgIGludCAgICAgICAgIHVwcGVyOworICAgIGludCAgICAgICAgIGZzdXBjLCBpc3RhcnQsIG5zdXByOworICAgIGludCAgICAgICAgIGxhc3RsID0gMCwgbGFzdHUgPSAwOworICAgIFNDZm9ybWF0ICAgICpMc3RvcmUgPSBzdGF0aWNfY2FzdDxTQ2Zvcm1hdCo+KG1fc2x1TC5TdG9yZSk7CisgICAgTkNmb3JtYXQgICAgKlVzdG9yZSA9IHN0YXRpY19jYXN0PE5DZm9ybWF0Kj4obV9zbHVVLlN0b3JlKTsKKyAgICBTY2FsYXIgICAgICAqU05wdHI7CisKKyAgICBjb25zdCBpbnQgc2l6ZSA9IG1fbWF0cml4LnJvd3MoKTsKKyAgICBtX2wucmVzaXplKHNpemUsc2l6ZSk7CisgICAgbV9sLnJlc2l6ZU5vblplcm9zKExzdG9yZS0+bm56KTsKKyAgICBtX3UucmVzaXplKHNpemUsc2l6ZSk7CisgICAgbV91LnJlc2l6ZU5vblplcm9zKFVzdG9yZS0+bm56KTsKKworICAgIGludCogTGNvbCA9IG1fbC5vdXRlckluZGV4UHRyKCk7CisgICAgaW50KiBMcm93ID0gbV9sLmlubmVySW5kZXhQdHIoKTsKKyAgICBTY2FsYXIqIEx2YWwgPSBtX2wudmFsdWVQdHIoKTsKKworICAgIGludCogVWNvbCA9IG1fdS5vdXRlckluZGV4UHRyKCk7CisgICAgaW50KiBVcm93ID0gbV91LmlubmVySW5kZXhQdHIoKTsKKyAgICBTY2FsYXIqIFV2YWwgPSBtX3UudmFsdWVQdHIoKTsKKworICAgIFVjb2xbMF0gPSAwOworICAgIFVjb2xbMF0gPSAwOworCisgICAgLyogZm9yIGVhY2ggc3VwZXJub2RlICovCisgICAgZm9yIChpbnQgayA9IDA7IGsgPD0gTHN0b3JlLT5uc3VwZXI7ICsraykKKyAgICB7CisgICAgICBmc3VwYyAgID0gTF9GU1RfU1VQQyhrKTsKKyAgICAgIGlzdGFydCAgPSBMX1NVQl9TVEFSVChmc3VwYyk7CisgICAgICBuc3VwciAgID0gTF9TVUJfU1RBUlQoZnN1cGMrMSkgLSBpc3RhcnQ7CisgICAgICB1cHBlciAgID0gMTsKKworICAgICAgLyogZm9yIGVhY2ggY29sdW1uIGluIHRoZSBzdXBlcm5vZGUgKi8KKyAgICAgIGZvciAoaW50IGogPSBmc3VwYzsgaiA8IExfRlNUX1NVUEMoaysxKTsgKytqKQorICAgICAgeworICAgICAgICBTTnB0ciA9ICYoKFNjYWxhciopTHN0b3JlLT5uenZhbClbTF9OWl9TVEFSVChqKV07CisKKyAgICAgICAgLyogRXh0cmFjdCBVICovCisgICAgICAgIGZvciAoaW50IGkgPSBVX05aX1NUQVJUKGopOyBpIDwgVV9OWl9TVEFSVChqKzEpOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICBVdmFsW2xhc3R1XSA9ICgoU2NhbGFyKilVc3RvcmUtPm56dmFsKVtpXTsKKyAgICAgICAgICAvKiBNYXRsYWIgZG9lc24ndCBsaWtlIGV4cGxpY2l0IHplcm8uICovCisgICAgICAgICAgaWYgKFV2YWxbbGFzdHVdICE9IDAuMCkKKyAgICAgICAgICAgIFVyb3dbbGFzdHUrK10gPSBVX1NVQihpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVwcGVyOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAvKiB1cHBlciB0cmlhbmdsZSBpbiB0aGUgc3VwZXJub2RlICovCisgICAgICAgICAgVXZhbFtsYXN0dV0gPSBTTnB0cltpXTsKKyAgICAgICAgICAvKiBNYXRsYWIgZG9lc24ndCBsaWtlIGV4cGxpY2l0IHplcm8uICovCisgICAgICAgICAgaWYgKFV2YWxbbGFzdHVdICE9IDAuMCkKKyAgICAgICAgICAgIFVyb3dbbGFzdHUrK10gPSBMX1NVQihpc3RhcnQraSk7CisgICAgICAgIH0KKyAgICAgICAgVWNvbFtqKzFdID0gbGFzdHU7CisKKyAgICAgICAgLyogRXh0cmFjdCBMICovCisgICAgICAgIEx2YWxbbGFzdGxdID0gMS4wOyAvKiB1bml0IGRpYWdvbmFsICovCisgICAgICAgIExyb3dbbGFzdGwrK10gPSBMX1NVQihpc3RhcnQgKyB1cHBlciAtIDEpOworICAgICAgICBmb3IgKGludCBpID0gdXBwZXI7IGkgPCBuc3VwcjsgKytpKQorICAgICAgICB7CisgICAgICAgICAgTHZhbFtsYXN0bF0gPSBTTnB0cltpXTsKKyAgICAgICAgICAvKiBNYXRsYWIgZG9lc24ndCBsaWtlIGV4cGxpY2l0IHplcm8uICovCisgICAgICAgICAgaWYgKEx2YWxbbGFzdGxdICE9IDAuMCkKKyAgICAgICAgICAgIExyb3dbbGFzdGwrK10gPSBMX1NVQihpc3RhcnQraSk7CisgICAgICAgIH0KKyAgICAgICAgTGNvbFtqKzFdID0gbGFzdGw7CisKKyAgICAgICAgKyt1cHBlcjsKKyAgICAgIH0gLyogZm9yIGogLi4uICovCisKKyAgICB9IC8qIGZvciBrIC4uLiAqLworCisgICAgLy8gc3F1ZWV6ZSB0aGUgbWF0cmljZXMgOgorICAgIG1fbC5yZXNpemVOb25aZXJvcyhsYXN0bCk7CisgICAgbV91LnJlc2l6ZU5vblplcm9zKGxhc3R1KTsKKworICAgIG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5ID0gZmFsc2U7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIFN1cGVyTFU8TWF0cml4VHlwZT46OlNjYWxhciBTdXBlckxVPE1hdHJpeFR5cGU+OjpkZXRlcm1pbmFudCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChtX2ZhY3Rvcml6YXRpb25Jc09rICYmICJUaGUgZGVjb21wb3NpdGlvbiBpcyBub3QgaW4gYSB2YWxpZCBzdGF0ZSBmb3IgY29tcHV0aW5nIHRoZSBkZXRlcm1pbmFudCwgeW91IG11c3QgZmlyc3QgY2FsbCBlaXRoZXIgY29tcHV0ZSgpIG9yIGFuYWx5emVQYXR0ZXJuKCkvZmFjdG9yaXplKCkiKTsKKyAgCisgIGlmIChtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eSkKKyAgICB0aGlzLT5leHRyYWN0RGF0YSgpOworCisgIFNjYWxhciBkZXQgPSBTY2FsYXIoMSk7CisgIGZvciAoaW50IGo9MDsgajxtX3UuY29scygpOyArK2opCisgIHsKKyAgICBpZiAobV91Lm91dGVySW5kZXhQdHIoKVtqKzFdLW1fdS5vdXRlckluZGV4UHRyKClbal0gPiAwKQorICAgIHsKKyAgICAgIGludCBsYXN0SWQgPSBtX3Uub3V0ZXJJbmRleFB0cigpW2orMV0tMTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX3UuaW5uZXJJbmRleFB0cigpW2xhc3RJZF08PWopOworICAgICAgaWYgKG1fdS5pbm5lckluZGV4UHRyKClbbGFzdElkXT09aikKKyAgICAgICAgZGV0ICo9IG1fdS52YWx1ZVB0cigpW2xhc3RJZF07CisgICAgfQorICB9CisgIGlmKG1fc2x1RXF1ZWQhPSdOJykKKyAgICByZXR1cm4gZGV0L21fc2x1UnNjYWxlLnByb2QoKS9tX3NsdUNzY2FsZS5wcm9kKCk7CisgIGVsc2UKKyAgICByZXR1cm4gZGV0OworfQorCisjaWZkZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyNkZWZpbmUgRUlHRU5fU1VQRVJMVV9IQVNfSUxVCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1NVUEVSTFVfSEFTX0lMVQorCisvKiogXGluZ3JvdXAgU3VwZXJMVVN1cHBvcnRfTW9kdWxlCisgICogXGNsYXNzIFN1cGVySUxVCisgICogXGJyaWVmIEEgc3BhcnNlIGRpcmVjdCBcYiBpbmNvbXBsZXRlIExVIGZhY3Rvcml6YXRpb24gYW5kIHNvbHZlciBiYXNlZCBvbiB0aGUgU3VwZXJMVSBsaWJyYXJ5CisgICoKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBzb2x2ZSBmb3IgYW4gYXBwcm94aW1hdGUgc29sdXRpb24gb2YgQS5YID0gQiBzcGFyc2UgbGluZWFyIHByb2JsZW1zIHZpYSBhbiBpbmNvbXBsZXRlIExVIGZhY3Rvcml6YXRpb24KKyAgKiB1c2luZyB0aGUgU3VwZXJMVSBsaWJyYXJ5LiBUaGlzIGNsYXNzIGlzIGFpbWVkIHRvIGJlIHVzZWQgYXMgYSBwcmVjb25kaXRpb25lciBvZiB0aGUgaXRlcmF0aXZlIGxpbmVhciBzb2x2ZXJzLgorICAqCisgICogXHdhcm5pbmcgVGhpcyBjbGFzcyByZXF1aXJlcyBTdXBlckxVIDQgb3IgbGF0ZXIuCisgICoKKyAgKiBcdHBhcmFtIF9NYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IEEsIGl0IG11c3QgYmUgYSBTcGFyc2VNYXRyaXg8PgorICAqCisgICogXHNhIFxyZWYgVHV0b3JpYWxTcGFyc2VEaXJlY3RTb2x2ZXJzLCBjbGFzcyBDb25qdWdhdGVHcmFkaWVudCwgY2xhc3MgQmlDR1NUQUIKKyAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitjbGFzcyBTdXBlcklMVSA6IHB1YmxpYyBTdXBlckxVQmFzZTxfTWF0cml4VHlwZSxTdXBlcklMVTxfTWF0cml4VHlwZT4gPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTdXBlckxVQmFzZTxfTWF0cml4VHlwZSxTdXBlcklMVT4gQmFzZTsKKyAgICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6SW5kZXggSW5kZXg7CisKKyAgcHVibGljOgorCisgICAgU3VwZXJJTFUoKSA6IEJhc2UoKSB7IGluaXQoKTsgfQorCisgICAgU3VwZXJJTFUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KSA6IEJhc2UoKQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICB+U3VwZXJJTFUoKQorICAgIHsKKyAgICB9CisgICAgCisgICAgLyoqIFBlcmZvcm1zIGEgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBvbiB0aGUgc3BhcmNpdHkgb2YgXGEgbWF0cml4LgorICAgICAgKgorICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiBzb2x2aW5nIGZvciBzZXZlcmFsIHByb2JsZW1zIGhhdmluZyB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisgICAgICAqIAorICAgICAgKiBcc2EgZmFjdG9yaXplKCkKKyAgICAgICovCisgICAgdm9pZCBhbmFseXplUGF0dGVybihjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgQmFzZTo6YW5hbHl6ZVBhdHRlcm4obWF0cml4KTsKKyAgICB9CisgICAgCisgICAgLyoqIFBlcmZvcm1zIGEgbnVtZXJpYyBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeAorICAgICAgKgorICAgICAgKiBUaGUgZ2l2ZW4gbWF0cml4IG11c3QgaGFzIHRoZSBzYW1lIHNwYXJjaXR5IHRoYW4gdGhlIG1hdHJpeCBvbiB3aGljaCB0aGUgc3ltYm9saWMgZGVjb21wb3NpdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICAgICAqCisgICAgICAqIFxzYSBhbmFseXplUGF0dGVybigpCisgICAgICAqLworICAgIHZvaWQgZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCk7CisgICAgCisgICAgI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIC8qKiBcaW50ZXJuYWwgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KKyAgICB2b2lkIF9zb2x2ZShjb25zdCBNYXRyaXhCYXNlPFJocz4gJmIsIE1hdHJpeEJhc2U8RGVzdD4gJmRlc3QpIGNvbnN0OworICAgICNlbmRpZiAvLyBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorICAgIAorICBwcm90ZWN0ZWQ6CisgICAgCisgICAgdXNpbmcgQmFzZTo6bV9tYXRyaXg7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVPcHRpb25zOworICAgIHVzaW5nIEJhc2U6Om1fc2x1QTsKKyAgICB1c2luZyBCYXNlOjptX3NsdUI7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVYOworICAgIHVzaW5nIEJhc2U6Om1fcDsKKyAgICB1c2luZyBCYXNlOjptX3E7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVFdHJlZTsKKyAgICB1c2luZyBCYXNlOjptX3NsdUVxdWVkOworICAgIHVzaW5nIEJhc2U6Om1fc2x1UnNjYWxlOworICAgIHVzaW5nIEJhc2U6Om1fc2x1Q3NjYWxlOworICAgIHVzaW5nIEJhc2U6Om1fc2x1TDsKKyAgICB1c2luZyBCYXNlOjptX3NsdVU7CisgICAgdXNpbmcgQmFzZTo6bV9zbHVTdGF0OworICAgIHVzaW5nIEJhc2U6Om1fc2x1RmVycjsKKyAgICB1c2luZyBCYXNlOjptX3NsdUJlcnI7CisgICAgdXNpbmcgQmFzZTo6bV9sOworICAgIHVzaW5nIEJhc2U6Om1fdTsKKyAgICAKKyAgICB1c2luZyBCYXNlOjptX2FuYWx5c2lzSXNPazsKKyAgICB1c2luZyBCYXNlOjptX2ZhY3Rvcml6YXRpb25Jc09rOworICAgIHVzaW5nIEJhc2U6Om1fZXh0cmFjdGVkRGF0YUFyZURpcnR5OworICAgIHVzaW5nIEJhc2U6Om1faXNJbml0aWFsaXplZDsKKyAgICB1c2luZyBCYXNlOjptX2luZm87CisKKyAgICB2b2lkIGluaXQoKQorICAgIHsKKyAgICAgIEJhc2U6OmluaXQoKTsKKyAgICAgIAorICAgICAgaWx1X3NldF9kZWZhdWx0X29wdGlvbnMoJm1fc2x1T3B0aW9ucyk7CisgICAgICBtX3NsdU9wdGlvbnMuUHJpbnRTdGF0ICAgICAgICA9IE5POworICAgICAgbV9zbHVPcHRpb25zLkNvbmRpdGlvbk51bWJlciAgPSBOTzsKKyAgICAgIG1fc2x1T3B0aW9ucy5UcmFucyAgICAgICAgICAgID0gTk9UUkFOUzsKKyAgICAgIG1fc2x1T3B0aW9ucy5Db2xQZXJtICAgICAgICAgID0gTU1EX0FUX1BMVVNfQTsKKyAgICAgIAorICAgICAgLy8gbm8gYXR0ZW1wdCB0byBwcmVzZXJ2ZSBjb2x1bW4gc3VtCisgICAgICBtX3NsdU9wdGlvbnMuSUxVX01JTFUgPSBTSUxVOworICAgICAgLy8gb25seSBiYXNpYyBJTFUoaykgc3VwcG9ydCAtLSBubyBkaXJlY3QgY29udHJvbCBvdmVyIG1lbW9yeSBjb25zdW1wdGlvbgorICAgICAgLy8gYmV0dGVyIHRvIHVzZSBJTFVfRHJvcFJ1bGUgPSBEUk9QX0JBU0lDIHwgRFJPUF9BUkVBCisgICAgICAvLyBhbmQgc2V0IElMVV9GaWxsRmFjdG9yIHRvIG1heCBtZW1vcnkgZ3Jvd3RoCisgICAgICBtX3NsdU9wdGlvbnMuSUxVX0Ryb3BSdWxlID0gRFJPUF9CQVNJQzsKKyAgICAgIG1fc2x1T3B0aW9ucy5JTFVfRHJvcFRvbCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSoxMDsKKyAgICB9CisgICAgCisgIHByaXZhdGU6CisgICAgU3VwZXJJTFUoU3VwZXJJTFUmICkgeyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBTdXBlcklMVTxNYXRyaXhUeXBlPjo6ZmFjdG9yaXplKGNvbnN0IE1hdHJpeFR5cGUmIGEpCit7CisgIGVpZ2VuX2Fzc2VydChtX2FuYWx5c2lzSXNPayAmJiAiWW91IG11c3QgZmlyc3QgY2FsbCBhbmFseXplUGF0dGVybigpIik7CisgIGlmKCFtX2FuYWx5c2lzSXNPaykKKyAgeworICAgIG1faW5mbyA9IEludmFsaWRJbnB1dDsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIHRoaXMtPmluaXRGYWN0b3JpemF0aW9uKGEpOworCisgIGludCBpbmZvID0gMDsKKyAgUmVhbFNjYWxhciByZWNpcF9waXZvdF9ncm93dGgsIHJjb25kOworCisgIFN0YXRJbml0KCZtX3NsdVN0YXQpOworICBTdXBlckxVX2dzaXN4KCZtX3NsdU9wdGlvbnMsICZtX3NsdUEsIG1fcS5kYXRhKCksIG1fcC5kYXRhKCksICZtX3NsdUV0cmVlWzBdLAorICAgICAgICAgICAgICAgICZtX3NsdUVxdWVkLCAmbV9zbHVSc2NhbGVbMF0sICZtX3NsdUNzY2FsZVswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVMLCAmbV9zbHVVLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgJm1fc2x1QiwgJm1fc2x1WCwKKyAgICAgICAgICAgICAgICAmcmVjaXBfcGl2b3RfZ3Jvd3RoLCAmcmNvbmQsCisgICAgICAgICAgICAgICAgJm1fc2x1U3RhdCwgJmluZm8sIFNjYWxhcigpKTsKKyAgU3RhdEZyZWUoJm1fc2x1U3RhdCk7CisKKyAgLy8gRklYTUUgaG93IHRvIGJldHRlciBjaGVjayBmb3IgZXJyb3JzID8/PworICBtX2luZm8gPSBpbmZvID09IDAgPyBTdWNjZXNzIDogTnVtZXJpY2FsSXNzdWU7CisgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgUmhzLHR5cGVuYW1lIERlc3Q+Cit2b2lkIFN1cGVySUxVPE1hdHJpeFR5cGU+Ojpfc29sdmUoY29uc3QgTWF0cml4QmFzZTxSaHM+ICZiLCBNYXRyaXhCYXNlPERlc3Q+JiB4KSBjb25zdAoreworICBlaWdlbl9hc3NlcnQobV9mYWN0b3JpemF0aW9uSXNPayAmJiAiVGhlIGRlY29tcG9zaXRpb24gaXMgbm90IGluIGEgdmFsaWQgc3RhdGUgZm9yIHNvbHZpbmcsIHlvdSBtdXN0IGZpcnN0IGNhbGwgZWl0aGVyIGNvbXB1dGUoKSBvciBhbmFseXplUGF0dGVybigpL2ZhY3Rvcml6ZSgpIik7CisKKyAgY29uc3QgaW50IHNpemUgPSBtX21hdHJpeC5yb3dzKCk7CisgIGNvbnN0IGludCByaHNDb2xzID0gYi5jb2xzKCk7CisgIGVpZ2VuX2Fzc2VydChzaXplPT1iLnJvd3MoKSk7CisKKyAgbV9zbHVPcHRpb25zLlRyYW5zID0gTk9UUkFOUzsKKyAgbV9zbHVPcHRpb25zLkZhY3QgPSBGQUNUT1JFRDsKKyAgbV9zbHVPcHRpb25zLkl0ZXJSZWZpbmUgPSBOT1JFRklORTsKKworICBtX3NsdUZlcnIucmVzaXplKHJoc0NvbHMpOworICBtX3NsdUJlcnIucmVzaXplKHJoc0NvbHMpOworICBtX3NsdUIgPSBTbHVNYXRyaXg6Ok1hcChiLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKKyAgbV9zbHVYID0gU2x1TWF0cml4OjpNYXAoeC5kZXJpdmVkKCkpOworCisgIHR5cGVuYW1lIFJoczo6UGxhaW5PYmplY3QgYl9jcHk7CisgIGlmKG1fc2x1RXF1ZWQhPSdOJykKKyAgeworICAgIGJfY3B5ID0gYjsKKyAgICBtX3NsdUIgPSBTbHVNYXRyaXg6Ok1hcChiX2NweS5jb25zdF9jYXN0X2Rlcml2ZWQoKSk7ICAKKyAgfQorICAKKyAgaW50IGluZm8gPSAwOworICBSZWFsU2NhbGFyIHJlY2lwX3Bpdm90X2dyb3d0aCwgcmNvbmQ7CisKKyAgU3RhdEluaXQoJm1fc2x1U3RhdCk7CisgIFN1cGVyTFVfZ3Npc3goJm1fc2x1T3B0aW9ucywgJm1fc2x1QSwKKyAgICAgICAgICAgICAgICBtX3EuZGF0YSgpLCBtX3AuZGF0YSgpLAorICAgICAgICAgICAgICAgICZtX3NsdUV0cmVlWzBdLCAmbV9zbHVFcXVlZCwKKyAgICAgICAgICAgICAgICAmbV9zbHVSc2NhbGVbMF0sICZtX3NsdUNzY2FsZVswXSwKKyAgICAgICAgICAgICAgICAmbV9zbHVMLCAmbV9zbHVVLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgJm1fc2x1QiwgJm1fc2x1WCwKKyAgICAgICAgICAgICAgICAmcmVjaXBfcGl2b3RfZ3Jvd3RoLCAmcmNvbmQsCisgICAgICAgICAgICAgICAgJm1fc2x1U3RhdCwgJmluZm8sIFNjYWxhcigpKTsKKyAgU3RhdEZyZWUoJm1fc2x1U3RhdCk7CisKKyAgbV9pbmZvID0gaW5mbz09MCA/IFN1Y2Nlc3MgOiBOdW1lcmljYWxJc3N1ZTsKK30KKyNlbmRpZgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworICAKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3Qgc29sdmVfcmV0dmFsPFN1cGVyTFVCYXNlPF9NYXRyaXhUeXBlLERlcml2ZWQ+LCBSaHM+CisgIDogc29sdmVfcmV0dmFsX2Jhc2U8U3VwZXJMVUJhc2U8X01hdHJpeFR5cGUsRGVyaXZlZD4sIFJocz4KK3sKKyAgdHlwZWRlZiBTdXBlckxVQmFzZTxfTWF0cml4VHlwZSxEZXJpdmVkPiBEZWM7CisgIEVJR0VOX01BS0VfU09MVkVfSEVMUEVSUyhEZWMsUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGRlYygpLmRlcml2ZWQoKS5fc29sdmUocmhzKCksZHN0KTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBzcGFyc2Vfc29sdmVfcmV0dmFsPFN1cGVyTFVCYXNlPF9NYXRyaXhUeXBlLERlcml2ZWQ+LCBSaHM+CisgIDogc3BhcnNlX3NvbHZlX3JldHZhbF9iYXNlPFN1cGVyTFVCYXNlPF9NYXRyaXhUeXBlLERlcml2ZWQ+LCBSaHM+Cit7CisgIHR5cGVkZWYgU3VwZXJMVUJhc2U8X01hdHJpeFR5cGUsRGVyaXZlZD4gRGVjOworICBFSUdFTl9NQUtFX1NQQVJTRV9TT0xWRV9IRUxQRVJTKERlYyxSaHMpCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgZGVjKCkuZGVyaXZlZCgpLl9zb2x2ZShyaHMoKSxkc3QpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TVVBFUkxVU1VQUE9SVF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvVW1mUGFja1N1cHBvcnQvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvVW1mUGFja1N1cHBvcnQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3ZGUwMAotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9VbWZQYWNrU3VwcG9ydC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9VbWZQYWNrU3VwcG9ydF9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTIAorICAke0VpZ2VuX1VtZlBhY2tTdXBwb3J0X1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL1VtZlBhY2tTdXBwb3J0IENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvVW1mUGFja1N1cHBvcnQvVW1mUGFja1N1cHBvcnQuaCBiL0VpZ2VuL3NyYy9VbWZQYWNrU3VwcG9ydC9VbWZQYWNrU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMTcyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvVW1mUGFja1N1cHBvcnQvVW1mUGFja1N1cHBvcnQuaApAQCAtMCwwICsxLDQzMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVU1GUEFDS1NVUFBPUlRfSAorI2RlZmluZSBFSUdFTl9VTUZQQUNLU1VQUE9SVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiBUT0RPIGV4dHJhY3QgTCwgZXh0cmFjdCBVLCBjb21wdXRlIGRldCwgZXRjLi4uICovCisKKy8vIGdlbmVyaWMgZG91YmxlL2NvbXBsZXg8ZG91YmxlPiB3cmFwcGVyIGZ1bmN0aW9uczoKKworaW5saW5lIHZvaWQgdW1mcGFja19mcmVlX251bWVyaWModm9pZCAqKk51bWVyaWMsIGRvdWJsZSkKK3sgdW1mcGFja19kaV9mcmVlX251bWVyaWMoTnVtZXJpYyk7ICpOdW1lcmljID0gMDsgfQorCitpbmxpbmUgdm9pZCB1bWZwYWNrX2ZyZWVfbnVtZXJpYyh2b2lkICoqTnVtZXJpYywgc3RkOjpjb21wbGV4PGRvdWJsZT4pCit7IHVtZnBhY2tfemlfZnJlZV9udW1lcmljKE51bWVyaWMpOyAqTnVtZXJpYyA9IDA7IH0KKworaW5saW5lIHZvaWQgdW1mcGFja19mcmVlX3N5bWJvbGljKHZvaWQgKipTeW1ib2xpYywgZG91YmxlKQoreyB1bWZwYWNrX2RpX2ZyZWVfc3ltYm9saWMoU3ltYm9saWMpOyAqU3ltYm9saWMgPSAwOyB9CisKK2lubGluZSB2b2lkIHVtZnBhY2tfZnJlZV9zeW1ib2xpYyh2b2lkICoqU3ltYm9saWMsIHN0ZDo6Y29tcGxleDxkb3VibGU+KQoreyB1bWZwYWNrX3ppX2ZyZWVfc3ltYm9saWMoU3ltYm9saWMpOyAqU3ltYm9saWMgPSAwOyB9CisKK2lubGluZSBpbnQgdW1mcGFja19zeW1ib2xpYyhpbnQgbl9yb3csaW50IG5fY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBBcFtdLCBjb25zdCBpbnQgQWlbXSwgY29uc3QgZG91YmxlIEF4W10sIHZvaWQgKipTeW1ib2xpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgQ29udHJvbCBbVU1GUEFDS19DT05UUk9MXSwgZG91YmxlIEluZm8gW1VNRlBBQ0tfSU5GT10pCit7CisgIHJldHVybiB1bWZwYWNrX2RpX3N5bWJvbGljKG5fcm93LG5fY29sLEFwLEFpLEF4LFN5bWJvbGljLENvbnRyb2wsSW5mbyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19zeW1ib2xpYyhpbnQgbl9yb3csaW50IG5fY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBBcFtdLCBjb25zdCBpbnQgQWlbXSwgY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4gQXhbXSwgdm9pZCAqKlN5bWJvbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBDb250cm9sIFtVTUZQQUNLX0NPTlRST0xdLCBkb3VibGUgSW5mbyBbVU1GUEFDS19JTkZPXSkKK3sKKyAgcmV0dXJuIHVtZnBhY2tfemlfc3ltYm9saWMobl9yb3csbl9jb2wsQXAsQWksJmludGVybmFsOjpyZWFsX3JlZihBeFswXSksMCxTeW1ib2xpYyxDb250cm9sLEluZm8pOworfQorCitpbmxpbmUgaW50IHVtZnBhY2tfbnVtZXJpYyggY29uc3QgaW50IEFwW10sIGNvbnN0IGludCBBaVtdLCBjb25zdCBkb3VibGUgQXhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpTeW1ib2xpYywgdm9pZCAqKk51bWVyaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIENvbnRyb2xbVU1GUEFDS19DT05UUk9MXSxkb3VibGUgSW5mbyBbVU1GUEFDS19JTkZPXSkKK3sKKyAgcmV0dXJuIHVtZnBhY2tfZGlfbnVtZXJpYyhBcCxBaSxBeCxTeW1ib2xpYyxOdW1lcmljLENvbnRyb2wsSW5mbyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19udW1lcmljKCBjb25zdCBpbnQgQXBbXSwgY29uc3QgaW50IEFpW10sIGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+IEF4W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqU3ltYm9saWMsIHZvaWQgKipOdW1lcmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBDb250cm9sW1VNRlBBQ0tfQ09OVFJPTF0sZG91YmxlIEluZm8gW1VNRlBBQ0tfSU5GT10pCit7CisgIHJldHVybiB1bWZwYWNrX3ppX251bWVyaWMoQXAsQWksJmludGVybmFsOjpyZWFsX3JlZihBeFswXSksMCxTeW1ib2xpYyxOdW1lcmljLENvbnRyb2wsSW5mbyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19zb2x2ZSggaW50IHN5cywgY29uc3QgaW50IEFwW10sIGNvbnN0IGludCBBaVtdLCBjb25zdCBkb3VibGUgQXhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIFhbXSwgY29uc3QgZG91YmxlIEJbXSwgdm9pZCAqTnVtZXJpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIENvbnRyb2xbVU1GUEFDS19DT05UUk9MXSwgZG91YmxlIEluZm9bVU1GUEFDS19JTkZPXSkKK3sKKyAgcmV0dXJuIHVtZnBhY2tfZGlfc29sdmUoc3lzLEFwLEFpLEF4LFgsQixOdW1lcmljLENvbnRyb2wsSW5mbyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19zb2x2ZSggaW50IHN5cywgY29uc3QgaW50IEFwW10sIGNvbnN0IGludCBBaVtdLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBBeFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBYW10sIGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+IEJbXSwgdm9pZCAqTnVtZXJpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIENvbnRyb2xbVU1GUEFDS19DT05UUk9MXSwgZG91YmxlIEluZm9bVU1GUEFDS19JTkZPXSkKK3sKKyAgcmV0dXJuIHVtZnBhY2tfemlfc29sdmUoc3lzLEFwLEFpLCZpbnRlcm5hbDo6cmVhbF9yZWYoQXhbMF0pLDAsJmludGVybmFsOjpyZWFsX3JlZihYWzBdKSwwLCZpbnRlcm5hbDo6cmVhbF9yZWYoQlswXSksMCxOdW1lcmljLENvbnRyb2wsSW5mbyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19nZXRfbHVueihpbnQgKmxueiwgaW50ICp1bnosIGludCAqbl9yb3csIGludCAqbl9jb2wsIGludCAqbnpfdWRpYWcsIHZvaWQgKk51bWVyaWMsIGRvdWJsZSkKK3sKKyAgcmV0dXJuIHVtZnBhY2tfZGlfZ2V0X2x1bnoobG56LHVueixuX3JvdyxuX2NvbCxuel91ZGlhZyxOdW1lcmljKTsKK30KKworaW5saW5lIGludCB1bWZwYWNrX2dldF9sdW56KGludCAqbG56LCBpbnQgKnVueiwgaW50ICpuX3JvdywgaW50ICpuX2NvbCwgaW50ICpuel91ZGlhZywgdm9pZCAqTnVtZXJpYywgc3RkOjpjb21wbGV4PGRvdWJsZT4pCit7CisgIHJldHVybiB1bWZwYWNrX3ppX2dldF9sdW56KGxueix1bnosbl9yb3csbl9jb2wsbnpfdWRpYWcsTnVtZXJpYyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19nZXRfbnVtZXJpYyhpbnQgTHBbXSwgaW50IExqW10sIGRvdWJsZSBMeFtdLCBpbnQgVXBbXSwgaW50IFVpW10sIGRvdWJsZSBVeFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBQW10sIGludCBRW10sIGRvdWJsZSBEeFtdLCBpbnQgKmRvX3JlY2lwLCBkb3VibGUgUnNbXSwgdm9pZCAqTnVtZXJpYykKK3sKKyAgcmV0dXJuIHVtZnBhY2tfZGlfZ2V0X251bWVyaWMoTHAsTGosTHgsVXAsVWksVXgsUCxRLER4LGRvX3JlY2lwLFJzLE51bWVyaWMpOworfQorCitpbmxpbmUgaW50IHVtZnBhY2tfZ2V0X251bWVyaWMoaW50IExwW10sIGludCBMaltdLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBMeFtdLCBpbnQgVXBbXSwgaW50IFVpW10sIHN0ZDo6Y29tcGxleDxkb3VibGU+IFV4W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFBbXSwgaW50IFFbXSwgc3RkOjpjb21wbGV4PGRvdWJsZT4gRHhbXSwgaW50ICpkb19yZWNpcCwgZG91YmxlIFJzW10sIHZvaWQgKk51bWVyaWMpCit7CisgIGRvdWJsZSYgbHgwX3JlYWwgPSBpbnRlcm5hbDo6cmVhbF9yZWYoTHhbMF0pOworICBkb3VibGUmIHV4MF9yZWFsID0gaW50ZXJuYWw6OnJlYWxfcmVmKFV4WzBdKTsKKyAgZG91YmxlJiBkeDBfcmVhbCA9IGludGVybmFsOjpyZWFsX3JlZihEeFswXSk7CisgIHJldHVybiB1bWZwYWNrX3ppX2dldF9udW1lcmljKExwLExqLEx4PyZseDBfcmVhbDowLDAsVXAsVWksVXg/JnV4MF9yZWFsOjAsMCxQLFEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER4PyZkeDBfcmVhbDowLDAsZG9fcmVjaXAsUnMsTnVtZXJpYyk7Cit9CisKK2lubGluZSBpbnQgdW1mcGFja19nZXRfZGV0ZXJtaW5hbnQoZG91YmxlICpNeCwgZG91YmxlICpFeCwgdm9pZCAqTnVtZXJpY0hhbmRsZSwgZG91YmxlIFVzZXJfSW5mbyBbVU1GUEFDS19JTkZPXSkKK3sKKyAgcmV0dXJuIHVtZnBhY2tfZGlfZ2V0X2RldGVybWluYW50KE14LEV4LE51bWVyaWNIYW5kbGUsVXNlcl9JbmZvKTsKK30KKworaW5saW5lIGludCB1bWZwYWNrX2dldF9kZXRlcm1pbmFudChzdGQ6OmNvbXBsZXg8ZG91YmxlPiAqTXgsIGRvdWJsZSAqRXgsIHZvaWQgKk51bWVyaWNIYW5kbGUsIGRvdWJsZSBVc2VyX0luZm8gW1VNRlBBQ0tfSU5GT10pCit7CisgIGRvdWJsZSYgbXhfcmVhbCA9IGludGVybmFsOjpyZWFsX3JlZigqTXgpOworICByZXR1cm4gdW1mcGFja196aV9nZXRfZGV0ZXJtaW5hbnQoJm14X3JlYWwsMCxFeCxOdW1lcmljSGFuZGxlLFVzZXJfSW5mbyk7Cit9CisKKy8qKiBcaW5ncm91cCBVbWZQYWNrU3VwcG9ydF9Nb2R1bGUKKyAgKiBcYnJpZWYgQSBzcGFyc2UgTFUgZmFjdG9yaXphdGlvbiBhbmQgc29sdmVyIGJhc2VkIG9uIFVtZlBhY2sKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLlggPSBCIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdmlhIGEgTFUgZmFjdG9yaXphdGlvbgorICAqIHVzaW5nIHRoZSBVbWZQYWNrIGxpYnJhcnkuIFRoZSBzcGFyc2UgbWF0cml4IEEgbXVzdCBiZSBzcXVhcmVkIGFuZCBmdWxsIHJhbmsuCisgICogVGhlIHZlY3RvcnMgb3IgbWF0cmljZXMgWCBhbmQgQiBjYW4gYmUgZWl0aGVyIGRlbnNlIG9yIHNwYXJzZS4KKyAgKgorICAqIFxXQVJOSU5HIFRoZSBpbnB1dCBtYXRyaXggQSBzaG91bGQgYmUgaW4gYSBcYiBjb21wcmVzc2VkIGFuZCBcYiBjb2x1bW4tbWFqb3IgZm9ybS4KKyAgKiBPdGhlcndpc2UgYW4gZXhwZW5zaXZlIGNvcHkgd2lsbCBiZSBtYWRlLiBZb3UgY2FuIGNhbGwgdGhlIGluZXhwZW5zaXZlIG1ha2VDb21wcmVzc2VkKCkgdG8gZ2V0IGEgY29tcHJlc3NlZCBtYXRyaXguCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBpdCBtdXN0IGJlIGEgU3BhcnNlTWF0cml4PD4KKyAgKgorICAqIFxzYSBccmVmIFR1dG9yaWFsU3BhcnNlRGlyZWN0U29sdmVycworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGU+CitjbGFzcyBVbWZQYWNrTFUgOiBpbnRlcm5hbDo6bm9uY29weWFibGUKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3I7CisgICAgdHlwZWRlZiBNYXRyaXg8aW50LCAxLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gSW50Um93VmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxpbnQsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBJbnRDb2xWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcj4gTFVNYXRyaXhUeXBlOworICAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcixpbnQ+IFVtZnBhY2tNYXRyaXhUeXBlOworCisgIHB1YmxpYzoKKworICAgIFVtZlBhY2tMVSgpIHsgaW5pdCgpOyB9CisKKyAgICBVbWZQYWNrTFUoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4KQorICAgIHsKKyAgICAgIGluaXQoKTsKKyAgICAgIGNvbXB1dGUobWF0cml4KTsKKyAgICB9CisKKyAgICB+VW1mUGFja0xVKCkKKyAgICB7CisgICAgICBpZihtX3N5bWJvbGljKSB1bWZwYWNrX2ZyZWVfc3ltYm9saWMoJm1fc3ltYm9saWMsU2NhbGFyKCkpOworICAgICAgaWYobV9udW1lcmljKSAgdW1mcGFja19mcmVlX251bWVyaWMoJm1fbnVtZXJpYyxTY2FsYXIoKSk7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2NvcHlNYXRyaXgucm93cygpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2NvcHlNYXRyaXguY29scygpOyB9CisKKyAgICAvKiogXGJyaWVmIFJlcG9ydHMgd2hldGhlciBwcmV2aW91cyBjb21wdXRhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICoKKyAgICAgICogXHJldHVybnMgXGMgU3VjY2VzcyBpZiBjb21wdXRhdGlvbiB3YXMgc3VjY2VzZnVsLAorICAgICAgKiAgICAgICAgICBcYyBOdW1lcmljYWxJc3N1ZSBpZiB0aGUgbWF0cml4LmFwcGVhcnMgdG8gYmUgbmVnYXRpdmUuCisgICAgICAqLworICAgIENvbXB1dGF0aW9uSW5mbyBpbmZvKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJEZWNvbXBvc2l0aW9uIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgIHJldHVybiBtX2luZm87CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IExVTWF0cml4VHlwZSYgbWF0cml4TCgpIGNvbnN0CisgICAgeworICAgICAgaWYgKG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5KSBleHRyYWN0RGF0YSgpOworICAgICAgcmV0dXJuIG1fbDsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgTFVNYXRyaXhUeXBlJiBtYXRyaXhVKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAobV9leHRyYWN0ZWREYXRhQXJlRGlydHkpIGV4dHJhY3REYXRhKCk7CisgICAgICByZXR1cm4gbV91OworICAgIH0KKworICAgIGlubGluZSBjb25zdCBJbnRDb2xWZWN0b3JUeXBlJiBwZXJtdXRhdGlvblAoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eSkgZXh0cmFjdERhdGEoKTsKKyAgICAgIHJldHVybiBtX3A7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IEludFJvd1ZlY3RvclR5cGUmIHBlcm11dGF0aW9uUSgpIGNvbnN0CisgICAgeworICAgICAgaWYgKG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5KSBleHRyYWN0RGF0YSgpOworICAgICAgcmV0dXJuIG1fcTsKKyAgICB9CisKKyAgICAvKiogQ29tcHV0ZXMgdGhlIHNwYXJzZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIG9mIFxhIG1hdHJpeCAKKyAgICAgKiAgTm90ZSB0aGF0IHRoZSBtYXRyaXggc2hvdWxkIGJlIGNvbHVtbi1tYWpvciwgYW5kIGluIGNvbXByZXNzZWQgZm9ybWF0IGZvciBiZXN0IHBlcmZvcm1hbmNlLgorICAgICAqICBcc2EgU3BhcnNlTWF0cml4OjptYWtlQ29tcHJlc3NlZCgpLgorICAgICAqLworICAgIHZvaWQgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgYW5hbHl6ZVBhdHRlcm4obWF0cml4KTsKKyAgICAgIGZhY3Rvcml6ZShtYXRyaXgpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgc29sdXRpb24geCBvZiBcZiQgQSB4ID0gYiBcZiQgdXNpbmcgdGhlIGN1cnJlbnQgZGVjb21wb3NpdGlvbiBvZiBBLgorICAgICAgKgorICAgICAgKiBcc2EgY29tcHV0ZSgpCisgICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KKyAgICBpbmxpbmUgY29uc3QgaW50ZXJuYWw6OnNvbHZlX3JldHZhbDxVbWZQYWNrTFUsIFJocz4gc29sdmUoY29uc3QgTWF0cml4QmFzZTxSaHM+JiBiKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlVtZlBhY2tMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICBlaWdlbl9hc3NlcnQocm93cygpPT1iLnJvd3MoKQorICAgICAgICAgICAgICAgICYmICJVbWZQYWNrTFU6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworICAgICAgcmV0dXJuIGludGVybmFsOjpzb2x2ZV9yZXR2YWw8VW1mUGFja0xVLCBSaHM+KCp0aGlzLCBiLmRlcml2ZWQoKSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBzb2x1dGlvbiB4IG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEuCisgICAgICAqCisgICAgICAqIFxzYSBjb21wdXRlKCkKKyAgICAgICovCisvLyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzPgorLy8gICAgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6c3BhcnNlX3NvbHZlX3JldHZhbDxVbWZQQWNrTFUsIFJocz4gc29sdmUoY29uc3QgU3BhcnNlTWF0cml4QmFzZTxSaHM+JiBiKSBjb25zdAorLy8gICAgIHsKKy8vICAgICAgIGVpZ2VuX2Fzc2VydChtX2lzSW5pdGlhbGl6ZWQgJiYgIlVtZlBBY2tMVSBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisvLyAgICAgICBlaWdlbl9hc3NlcnQocm93cygpPT1iLnJvd3MoKQorLy8gICAgICAgICAgICAgICAgICYmICJVbWZQQWNrTFU6OnNvbHZlKCk6IGludmFsaWQgbnVtYmVyIG9mIHJvd3Mgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSBtYXRyaXggYiIpOworLy8gICAgICAgcmV0dXJuIGludGVybmFsOjpzcGFyc2Vfc29sdmVfcmV0dmFsPFVtZlBBY2tMVSwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworLy8gICAgIH0KKworICAgIC8qKiBQZXJmb3JtcyBhIHN5bWJvbGljIGRlY29tcG9zaXRpb24gb24gdGhlIHNwYXJjaXR5IG9mIFxhIG1hdHJpeC4KKyAgICAgICoKKyAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gc29sdmluZyBmb3Igc2V2ZXJhbCBwcm9ibGVtcyBoYXZpbmcgdGhlIHNhbWUgc3RydWN0dXJlLgorICAgICAgKgorICAgICAgKiBcc2EgZmFjdG9yaXplKCksIGNvbXB1dGUoKQorICAgICAgKi8KKyAgICB2b2lkIGFuYWx5emVQYXR0ZXJuKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBpZihtX3N5bWJvbGljKQorICAgICAgICB1bWZwYWNrX2ZyZWVfc3ltYm9saWMoJm1fc3ltYm9saWMsU2NhbGFyKCkpOworICAgICAgaWYobV9udW1lcmljKQorICAgICAgICB1bWZwYWNrX2ZyZWVfbnVtZXJpYygmbV9udW1lcmljLFNjYWxhcigpKTsKKyAgICAgIAorICAgICAgZ3JhcElucHV0KG1hdHJpeCk7CisKKyAgICAgIGludCBlcnJvckNvZGUgPSAwOworICAgICAgZXJyb3JDb2RlID0gdW1mcGFja19zeW1ib2xpYyhtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpLCBtX291dGVySW5kZXhQdHIsIG1faW5uZXJJbmRleFB0ciwgbV92YWx1ZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fc3ltYm9saWMsIDAsIDApOworCisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgbV9pbmZvID0gZXJyb3JDb2RlID8gSW52YWxpZElucHV0IDogU3VjY2VzczsKKyAgICAgIG1fYW5hbHlzaXNJc09rID0gdHJ1ZTsKKyAgICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogUGVyZm9ybXMgYSBudW1lcmljIGRlY29tcG9zaXRpb24gb2YgXGEgbWF0cml4CisgICAgICAqCisgICAgICAqIFRoZSBnaXZlbiBtYXRyaXggbXVzdCBoYXMgdGhlIHNhbWUgc3BhcmNpdHkgdGhhbiB0aGUgbWF0cml4IG9uIHdoaWNoIHRoZSBwYXR0ZXJuIGFueWx5c2lzIGhhcyBiZWVuIHBlcmZvcm1lZC4KKyAgICAgICoKKyAgICAgICogXHNhIGFuYWx5emVQYXR0ZXJuKCksIGNvbXB1dGUoKQorICAgICAgKi8KKyAgICB2b2lkIGZhY3Rvcml6ZShjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG1fYW5hbHlzaXNJc09rICYmICJVbWZQYWNrTFU6IHlvdSBtdXN0IGZpcnN0IGNhbGwgYW5hbHl6ZVBhdHRlcm4oKSIpOworICAgICAgaWYobV9udW1lcmljKQorICAgICAgICB1bWZwYWNrX2ZyZWVfbnVtZXJpYygmbV9udW1lcmljLFNjYWxhcigpKTsKKworICAgICAgZ3JhcElucHV0KG1hdHJpeCk7CisKKyAgICAgIGludCBlcnJvckNvZGU7CisgICAgICBlcnJvckNvZGUgPSB1bWZwYWNrX251bWVyaWMobV9vdXRlckluZGV4UHRyLCBtX2lubmVySW5kZXhQdHIsIG1fdmFsdWVQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zeW1ib2xpYywgJm1fbnVtZXJpYywgMCwgMCk7CisKKyAgICAgIG1faW5mbyA9IGVycm9yQ29kZSA/IE51bWVyaWNhbElzc3VlIDogU3VjY2VzczsKKyAgICAgIG1fZmFjdG9yaXphdGlvbklzT2sgPSB0cnVlOworICAgIH0KKworICAgICNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogXGludGVybmFsICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQkRlcml2ZWQsdHlwZW5hbWUgWERlcml2ZWQ+CisgICAgYm9vbCBfc29sdmUoY29uc3QgTWF0cml4QmFzZTxCRGVyaXZlZD4gJmIsIE1hdHJpeEJhc2U8WERlcml2ZWQ+ICZ4KSBjb25zdDsKKyAgICAjZW5kaWYKKworICAgIFNjYWxhciBkZXRlcm1pbmFudCgpIGNvbnN0OworCisgICAgdm9pZCBleHRyYWN0RGF0YSgpIGNvbnN0OworCisgIHByb3RlY3RlZDoKKworCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBtX2luZm8gPSBJbnZhbGlkSW5wdXQ7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgIG1fbnVtZXJpYyA9IDA7CisgICAgICBtX3N5bWJvbGljID0gMDsKKyAgICAgIG1fb3V0ZXJJbmRleFB0ciA9IDA7CisgICAgICBtX2lubmVySW5kZXhQdHIgPSAwOworICAgICAgbV92YWx1ZVB0ciAgICAgID0gMDsKKyAgICB9CisgICAgCisgICAgdm9pZCBncmFwSW5wdXQoY29uc3QgTWF0cml4VHlwZSYgbWF0KQorICAgIHsKKyAgICAgIG1fY29weU1hdHJpeC5yZXNpemUobWF0LnJvd3MoKSwgbWF0LmNvbHMoKSk7CisgICAgICBpZiggKChNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdCk9PVJvd01ham9yQml0KSB8fCBzaXplb2YodHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXgpIT1zaXplb2YoaW50KSB8fCAhbWF0LmlzQ29tcHJlc3NlZCgpICkKKyAgICAgIHsKKyAgICAgICAgLy8gbm9uIHN1cHBvcnRlZCBpbnB1dCAtPiBjb3B5CisgICAgICAgIG1fY29weU1hdHJpeCA9IG1hdDsKKyAgICAgICAgbV9vdXRlckluZGV4UHRyID0gbV9jb3B5TWF0cml4Lm91dGVySW5kZXhQdHIoKTsKKyAgICAgICAgbV9pbm5lckluZGV4UHRyID0gbV9jb3B5TWF0cml4LmlubmVySW5kZXhQdHIoKTsKKyAgICAgICAgbV92YWx1ZVB0ciAgICAgID0gbV9jb3B5TWF0cml4LnZhbHVlUHRyKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG1fb3V0ZXJJbmRleFB0ciA9IG1hdC5vdXRlckluZGV4UHRyKCk7CisgICAgICAgIG1faW5uZXJJbmRleFB0ciA9IG1hdC5pbm5lckluZGV4UHRyKCk7CisgICAgICAgIG1fdmFsdWVQdHIgICAgICA9IG1hdC52YWx1ZVB0cigpOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNhY2hlZCBkYXRhIHRvIHJlZHVjZSByZWFsbG9jYXRpb24sIGV0Yy4KKyAgICBtdXRhYmxlIExVTWF0cml4VHlwZSBtX2w7CisgICAgbXV0YWJsZSBMVU1hdHJpeFR5cGUgbV91OworICAgIG11dGFibGUgSW50Q29sVmVjdG9yVHlwZSBtX3A7CisgICAgbXV0YWJsZSBJbnRSb3dWZWN0b3JUeXBlIG1fcTsKKworICAgIFVtZnBhY2tNYXRyaXhUeXBlIG1fY29weU1hdHJpeDsKKyAgICBjb25zdCBTY2FsYXIqIG1fdmFsdWVQdHI7CisgICAgY29uc3QgaW50KiBtX291dGVySW5kZXhQdHI7CisgICAgY29uc3QgaW50KiBtX2lubmVySW5kZXhQdHI7CisgICAgdm9pZCogbV9udW1lcmljOworICAgIHZvaWQqIG1fc3ltYm9saWM7CisKKyAgICBtdXRhYmxlIENvbXB1dGF0aW9uSW5mbyBtX2luZm87CisgICAgYm9vbCBtX2lzSW5pdGlhbGl6ZWQ7CisgICAgaW50IG1fZmFjdG9yaXphdGlvbklzT2s7CisgICAgaW50IG1fYW5hbHlzaXNJc09rOworICAgIG11dGFibGUgYm9vbCBtX2V4dHJhY3RlZERhdGFBcmVEaXJ0eTsKKyAgICAKKyAgcHJpdmF0ZToKKyAgICBVbWZQYWNrTFUoVW1mUGFja0xVJiApIHsgfQorfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBVbWZQYWNrTFU8TWF0cml4VHlwZT46OmV4dHJhY3REYXRhKCkgY29uc3QKK3sKKyAgaWYgKG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5KQorICB7CisgICAgLy8gZ2V0IHNpemUgb2YgdGhlIGRhdGEKKyAgICBpbnQgbG56LCB1bnosIHJvd3MsIGNvbHMsIG56X3VkaWFnOworICAgIHVtZnBhY2tfZ2V0X2x1bnooJmxueiwgJnVueiwgJnJvd3MsICZjb2xzLCAmbnpfdWRpYWcsIG1fbnVtZXJpYywgU2NhbGFyKCkpOworCisgICAgLy8gYWxsb2NhdGUgZGF0YQorICAgIG1fbC5yZXNpemUocm93cywoc3RkOjptaW4pKHJvd3MsY29scykpOworICAgIG1fbC5yZXNpemVOb25aZXJvcyhsbnopOworCisgICAgbV91LnJlc2l6ZSgoc3RkOjptaW4pKHJvd3MsY29scyksY29scyk7CisgICAgbV91LnJlc2l6ZU5vblplcm9zKHVueik7CisKKyAgICBtX3AucmVzaXplKHJvd3MpOworICAgIG1fcS5yZXNpemUoY29scyk7CisKKyAgICAvLyBleHRyYWN0CisgICAgdW1mcGFja19nZXRfbnVtZXJpYyhtX2wub3V0ZXJJbmRleFB0cigpLCBtX2wuaW5uZXJJbmRleFB0cigpLCBtX2wudmFsdWVQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdS5vdXRlckluZGV4UHRyKCksIG1fdS5pbm5lckluZGV4UHRyKCksIG1fdS52YWx1ZVB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9wLmRhdGEoKSwgbV9xLmRhdGEoKSwgMCwgMCwgMCwgbV9udW1lcmljKTsKKworICAgIG1fZXh0cmFjdGVkRGF0YUFyZURpcnR5ID0gZmFsc2U7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIFVtZlBhY2tMVTxNYXRyaXhUeXBlPjo6U2NhbGFyIFVtZlBhY2tMVTxNYXRyaXhUeXBlPjo6ZGV0ZXJtaW5hbnQoKSBjb25zdAoreworICBTY2FsYXIgZGV0OworICB1bWZwYWNrX2dldF9kZXRlcm1pbmFudCgmZGV0LCAwLCBtX251bWVyaWMsIDApOworICByZXR1cm4gZGV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGU8dHlwZW5hbWUgQkRlcml2ZWQsdHlwZW5hbWUgWERlcml2ZWQ+Citib29sIFVtZlBhY2tMVTxNYXRyaXhUeXBlPjo6X3NvbHZlKGNvbnN0IE1hdHJpeEJhc2U8QkRlcml2ZWQ+ICZiLCBNYXRyaXhCYXNlPFhEZXJpdmVkPiAmeCkgY29uc3QKK3sKKyAgY29uc3QgaW50IHJoc0NvbHMgPSBiLmNvbHMoKTsKKyAgZWlnZW5fYXNzZXJ0KChCRGVyaXZlZDo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wICYmICJVbWZQYWNrTFUgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0IG5vbiBjb2wtbWFqb3IgcmhzIHlldCIpOworICBlaWdlbl9hc3NlcnQoKFhEZXJpdmVkOjpGbGFncyZSb3dNYWpvckJpdCk9PTAgJiYgIlVtZlBhY2tMVSBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgbm9uIGNvbC1tYWpvciByZXN1bHQgeWV0Iik7CisKKyAgaW50IGVycm9yQ29kZTsKKyAgZm9yIChpbnQgaj0wOyBqPHJoc0NvbHM7ICsraikKKyAgeworICAgIGVycm9yQ29kZSA9IHVtZnBhY2tfc29sdmUoVU1GUEFDS19BLAorICAgICAgICBtX291dGVySW5kZXhQdHIsIG1faW5uZXJJbmRleFB0ciwgbV92YWx1ZVB0ciwKKyAgICAgICAgJnguY29sKGopLmNvZWZmUmVmKDApLCAmYi5jb25zdF9jYXN0X2Rlcml2ZWQoKS5jb2woaikuY29lZmZSZWYoMCksIG1fbnVtZXJpYywgMCwgMCk7CisgICAgaWYgKGVycm9yQ29kZSE9MCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3Qgc29sdmVfcmV0dmFsPFVtZlBhY2tMVTxfTWF0cml4VHlwZT4sIFJocz4KKyAgOiBzb2x2ZV9yZXR2YWxfYmFzZTxVbWZQYWNrTFU8X01hdHJpeFR5cGU+LCBSaHM+Cit7CisgIHR5cGVkZWYgVW1mUGFja0xVPF9NYXRyaXhUeXBlPiBEZWM7CisgIEVJR0VOX01BS0VfU09MVkVfSEVMUEVSUyhEZWMsUmhzKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIGRlYygpLl9zb2x2ZShyaHMoKSxkc3QpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZSwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNwYXJzZV9zb2x2ZV9yZXR2YWw8VW1mUGFja0xVPF9NYXRyaXhUeXBlPiwgUmhzPgorICA6IHNwYXJzZV9zb2x2ZV9yZXR2YWxfYmFzZTxVbWZQYWNrTFU8X01hdHJpeFR5cGU+LCBSaHM+Cit7CisgIHR5cGVkZWYgVW1mUGFja0xVPF9NYXRyaXhUeXBlPiBEZWM7CisgIEVJR0VOX01BS0VfU1BBUlNFX1NPTFZFX0hFTFBFUlMoRGVjLFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBkZWMoKS5fc29sdmUocmhzKCksZHN0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fVU1GUEFDS1NVUFBPUlRfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL21pc2MvQ01ha2VMaXN0cy50eHQgYi9FaWdlbi9zcmMvbWlzYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNThmZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL21pc2MvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fbWlzY19TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fbWlzY19TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L0VpZ2VuL3NyYy9taXNjIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvbWlzYy9JbWFnZS5oIGIvRWlnZW4vc3JjL21pc2MvSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWM1ZjQzCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL21pc2MvSW1hZ2UuaApAQCAtMCwwICsxLDg0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUlTQ19JTUFHRV9ICisjZGVmaW5lIEVJR0VOX01JU0NfSU1BR0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxjbGFzcyBpbWFnZV9yZXR2YWxfYmFzZQorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZT4KK3N0cnVjdCB0cmFpdHM8aW1hZ2VfcmV0dmFsX2Jhc2U8RGVjb21wb3NpdGlvblR5cGU+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDwKKyAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsCisgICAgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIC8vIHRoZSBpbWFnZSBpcyBhIHN1YnNwYWNlIG9mIHRoZSBkZXN0aW5hdGlvbiBzcGFjZSwgd2hvc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGltZW5zaW9uIGlzIHRoZSBudW1iZXIgb2Ygcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4CisgICAgRHluYW1pYywgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGtub3cgYXQgY29tcGlsZSB0aW1lIHRoZSBkaW1lbnNpb24gb2YgdGhlIGltYWdlICh0aGUgcmFuaykKKyAgICBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgIE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLCAvLyB0aGUgaW1hZ2UgbWF0cml4IHdpbGwgY29uc2lzdCBvZiBjb2x1bW5zIGZyb20gdGhlIG9yaWdpbmFsIG1hdHJpeCwKKyAgICBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSAgLy8gc28gaXQgaGFzIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFuZCBhdCBtb3N0IGFzIG1hbnkgY29sdW1ucy4KKyAgPiBSZXR1cm5UeXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0RlY29tcG9zaXRpb25UeXBlPiBzdHJ1Y3QgaW1hZ2VfcmV0dmFsX2Jhc2UKKyA6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPGltYWdlX3JldHZhbF9iYXNlPF9EZWNvbXBvc2l0aW9uVHlwZT4gPgoreworICB0eXBlZGVmIF9EZWNvbXBvc2l0aW9uVHlwZSBEZWNvbXBvc2l0aW9uVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIFJldHVybkJ5VmFsdWU8aW1hZ2VfcmV0dmFsX2Jhc2U+IEJhc2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6SW5kZXggSW5kZXg7CisKKyAgaW1hZ2VfcmV0dmFsX2Jhc2UoY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIGRlYywgY29uc3QgTWF0cml4VHlwZSYgb3JpZ2luYWxNYXRyaXgpCisgICAgOiBtX2RlYyhkZWMpLCBtX3JhbmsoZGVjLnJhbmsoKSksCisgICAgICBtX2NvbHMobV9yYW5rID09IDAgPyAxIDogbV9yYW5rKSwKKyAgICAgIG1fb3JpZ2luYWxNYXRyaXgob3JpZ2luYWxNYXRyaXgpCisgIHt9CisKKyAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2RlYy5yb3dzKCk7IH0KKyAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2NvbHM7IH0KKyAgaW5saW5lIEluZGV4IHJhbmsoKSBjb25zdCB7IHJldHVybiBtX3Jhbms7IH0KKyAgaW5saW5lIGNvbnN0IERlY29tcG9zaXRpb25UeXBlJiBkZWMoKSBjb25zdCB7IHJldHVybiBtX2RlYzsgfQorICBpbmxpbmUgY29uc3QgTWF0cml4VHlwZSYgb3JpZ2luYWxNYXRyaXgoKSBjb25zdCB7IHJldHVybiBtX29yaWdpbmFsTWF0cml4OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gaW5saW5lIHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIHN0YXRpY19jYXN0PGNvbnN0IGltYWdlX3JldHZhbDxEZWNvbXBvc2l0aW9uVHlwZT4qPih0aGlzKS0+ZXZhbFRvKGRzdCk7CisgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIG1fZGVjOworICAgIEluZGV4IG1fcmFuaywgbV9jb2xzOworICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1fb3JpZ2luYWxNYXRyaXg7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2RlZmluZSBFSUdFTl9NQUtFX0lNQUdFX0hFTFBFUlMoRGVjb21wb3NpdGlvblR5cGUpIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsgXAorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsgXAorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OyBcCisgIHR5cGVkZWYgRWlnZW46OmludGVybmFsOjppbWFnZV9yZXR2YWxfYmFzZTxEZWNvbXBvc2l0aW9uVHlwZT4gQmFzZTsgXAorICB1c2luZyBCYXNlOjpkZWM7IFwKKyAgdXNpbmcgQmFzZTo6b3JpZ2luYWxNYXRyaXg7IFwKKyAgdXNpbmcgQmFzZTo6cmFuazsgXAorICB1c2luZyBCYXNlOjpyb3dzOyBcCisgIHVzaW5nIEJhc2U6OmNvbHM7IFwKKyAgaW1hZ2VfcmV0dmFsKGNvbnN0IERlY29tcG9zaXRpb25UeXBlJiBkZWMsIGNvbnN0IE1hdHJpeFR5cGUmIG9yaWdpbmFsTWF0cml4KSBcCisgICAgOiBCYXNlKGRlYywgb3JpZ2luYWxNYXRyaXgpIHt9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUlTQ19JTUFHRV9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvbWlzYy9LZXJuZWwuaCBiL0VpZ2VuL3NyYy9taXNjL0tlcm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTE1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvbWlzYy9LZXJuZWwuaApAQCAtMCwwICsxLDgxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUlTQ19LRVJORUxfSAorI2RlZmluZSBFSUdFTl9NSVNDX0tFUk5FTF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGNsYXNzIGtlcm5lbF9yZXR2YWxfYmFzZQorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZT4KK3N0cnVjdCB0cmFpdHM8a2VybmVsX3JldHZhbF9iYXNlPERlY29tcG9zaXRpb25UeXBlPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVjb21wb3NpdGlvblR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8CisgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLAorICAgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAvLyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlICJrZXJuZWwgbWF0cml4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgbnVtYmVyIG9mIGNvbHMgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBwcm9kdWN0ICJtYXRyaXggKiBrZXJuZWwgPSB6ZXJvIiBtYWtlcyBzZW5zZQorICAgIER5bmFtaWMsICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGF0IGNvbXBpbGUtdGltZSB0aGUgZGltZW5zaW9uIG9mIHRoZSBrZXJuZWwKKyAgICBNYXRyaXhUeXBlOjpPcHRpb25zLAorICAgIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLCAvLyBzZWUgZXhwbGFuYXRpb24gZm9yIDJuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSAvLyB0aGUga2VybmVsIGlzIGEgc3Vic3BhY2Ugb2YgdGhlIGRvbWFpbiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9zZSBkaW1lbnNpb24gaXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgKKyAgPiBSZXR1cm5UeXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0RlY29tcG9zaXRpb25UeXBlPiBzdHJ1Y3Qga2VybmVsX3JldHZhbF9iYXNlCisgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxrZXJuZWxfcmV0dmFsX2Jhc2U8X0RlY29tcG9zaXRpb25UeXBlPiA+Cit7CisgIHR5cGVkZWYgX0RlY29tcG9zaXRpb25UeXBlIERlY29tcG9zaXRpb25UeXBlOworICB0eXBlZGVmIFJldHVybkJ5VmFsdWU8a2VybmVsX3JldHZhbF9iYXNlPiBCYXNlOworICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OkluZGV4IEluZGV4OworCisgIGtlcm5lbF9yZXR2YWxfYmFzZShjb25zdCBEZWNvbXBvc2l0aW9uVHlwZSYgZGVjKQorICAgIDogbV9kZWMoZGVjKSwKKyAgICAgIG1fcmFuayhkZWMucmFuaygpKSwKKyAgICAgIG1fY29scyhtX3Jhbms9PWRlYy5jb2xzKCkgPyAxIDogZGVjLmNvbHMoKSAtIG1fcmFuaykKKyAge30KKworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjLmNvbHMoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29sczsgfQorICBpbmxpbmUgSW5kZXggcmFuaygpIGNvbnN0IHsgcmV0dXJuIG1fcmFuazsgfQorICBpbmxpbmUgY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIGRlYygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gaW5saW5lIHZvaWQgZXZhbFRvKERlc3QmIGRzdCkgY29uc3QKKyAgeworICAgIHN0YXRpY19jYXN0PGNvbnN0IGtlcm5lbF9yZXR2YWw8RGVjb21wb3NpdGlvblR5cGU+Kj4odGhpcyktPmV2YWxUbyhkc3QpOworICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IERlY29tcG9zaXRpb25UeXBlJiBtX2RlYzsKKyAgICBJbmRleCBtX3JhbmssIG1fY29sczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjZGVmaW5lIEVJR0VOX01BS0VfS0VSTkVMX0hFTFBFUlMoRGVjb21wb3NpdGlvblR5cGUpIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsgXAorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsgXAorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OyBcCisgIHR5cGVkZWYgRWlnZW46OmludGVybmFsOjprZXJuZWxfcmV0dmFsX2Jhc2U8RGVjb21wb3NpdGlvblR5cGU+IEJhc2U7IFwKKyAgdXNpbmcgQmFzZTo6ZGVjOyBcCisgIHVzaW5nIEJhc2U6OnJhbms7IFwKKyAgdXNpbmcgQmFzZTo6cm93czsgXAorICB1c2luZyBCYXNlOjpjb2xzOyBcCisgIGtlcm5lbF9yZXR2YWwoY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIGRlYykgOiBCYXNlKGRlYykge30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NSVNDX0tFUk5FTF9ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvbWlzYy9Tb2x2ZS5oIGIvRWlnZW4vc3JjL21pc2MvU29sdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjcwZDYwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL21pc2MvU29sdmUuaApAQCAtMCwwICsxLDc2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUlTQ19TT0xWRV9ICisjZGVmaW5lIEVJR0VOX01JU0NfU09MVkVfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxjbGFzcyBzb2x2ZV9yZXR2YWxfYmFzZQorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZSwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHRyYWl0czxzb2x2ZV9yZXR2YWxfYmFzZTxEZWNvbXBvc2l0aW9uVHlwZSwgUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVjb21wb3NpdGlvblR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgUmhzOjpTY2FsYXIsCisgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBSaHM6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBSaHM6OlBsYWluT2JqZWN0OjpPcHRpb25zLAorICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgUmhzOjpNYXhDb2xzQXRDb21waWxlVGltZT4gUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9EZWNvbXBvc2l0aW9uVHlwZSwgdHlwZW5hbWUgUmhzPiBzdHJ1Y3Qgc29sdmVfcmV0dmFsX2Jhc2UKKyA6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPHNvbHZlX3JldHZhbF9iYXNlPF9EZWNvbXBvc2l0aW9uVHlwZSwgUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDx0eXBlbmFtZSBSaHM6Ok5lc3RlZD46OnR5cGUgUmhzTmVzdGVkQ2xlYW5lZDsKKyAgdHlwZWRlZiBfRGVjb21wb3NpdGlvblR5cGUgRGVjb21wb3NpdGlvblR5cGU7CisgIHR5cGVkZWYgUmV0dXJuQnlWYWx1ZTxzb2x2ZV9yZXR2YWxfYmFzZT4gQmFzZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpJbmRleCBJbmRleDsKKworICBzb2x2ZV9yZXR2YWxfYmFzZShjb25zdCBEZWNvbXBvc2l0aW9uVHlwZSYgZGVjLCBjb25zdCBSaHMmIHJocykKKyAgICA6IG1fZGVjKGRlYyksIG1fcmhzKHJocykKKyAge30KKworICBpbmxpbmUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjLmNvbHMoKTsgfQorICBpbmxpbmUgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fcmhzLmNvbHMoKTsgfQorICBpbmxpbmUgY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIGRlYygpIGNvbnN0IHsgcmV0dXJuIG1fZGVjOyB9CisgIGlubGluZSBjb25zdCBSaHNOZXN0ZWRDbGVhbmVkJiByaHMoKSBjb25zdCB7IHJldHVybiBtX3JoczsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIERlc3Q+IGlubGluZSB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBzdGF0aWNfY2FzdDxjb25zdCBzb2x2ZV9yZXR2YWw8RGVjb21wb3NpdGlvblR5cGUsUmhzPio+KHRoaXMpLT5ldmFsVG8oZHN0KTsKKyAgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBEZWNvbXBvc2l0aW9uVHlwZSYgbV9kZWM7CisgICAgdHlwZW5hbWUgUmhzOjpOZXN0ZWQgbV9yaHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2RlZmluZSBFSUdFTl9NQUtFX1NPTFZFX0hFTFBFUlMoRGVjb21wb3NpdGlvblR5cGUsUmhzKSBcCisgIHR5cGVkZWYgdHlwZW5hbWUgRGVjb21wb3NpdGlvblR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsgXAorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsgXAorICB0eXBlZGVmIEVpZ2VuOjppbnRlcm5hbDo6c29sdmVfcmV0dmFsX2Jhc2U8RGVjb21wb3NpdGlvblR5cGUsUmhzPiBCYXNlOyBcCisgIHVzaW5nIEJhc2U6OmRlYzsgXAorICB1c2luZyBCYXNlOjpyaHM7IFwKKyAgdXNpbmcgQmFzZTo6cm93czsgXAorICB1c2luZyBCYXNlOjpjb2xzOyBcCisgIHNvbHZlX3JldHZhbChjb25zdCBEZWNvbXBvc2l0aW9uVHlwZSYgZGVjLCBjb25zdCBSaHMmIHJocykgXAorICAgIDogQmFzZShkZWMsIHJocykge30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NSVNDX1NPTFZFX0gKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9taXNjL1NwYXJzZVNvbHZlLmggYi9FaWdlbi9zcmMvbWlzYy9TcGFyc2VTb2x2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmM0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvbWlzYy9TcGFyc2VTb2x2ZS5oCkBAIC0wLDAgKzEsMTExIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU1BBUlNFX1NPTFZFX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX1NPTFZFX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9EZWNvbXBvc2l0aW9uVHlwZSwgdHlwZW5hbWUgUmhzPiBzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3JldHZhbF9iYXNlOwordGVtcGxhdGU8dHlwZW5hbWUgX0RlY29tcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBSaHM+IHN0cnVjdCBzcGFyc2Vfc29sdmVfcmV0dmFsOworICAKK3RlbXBsYXRlPHR5cGVuYW1lIERlY29tcG9zaXRpb25UeXBlLCB0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgdHJhaXRzPHNwYXJzZV9zb2x2ZV9yZXR2YWxfYmFzZTxEZWNvbXBvc2l0aW9uVHlwZSwgUmhzPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVjb21wb3NpdGlvblR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8dHlwZW5hbWUgUmhzOjpTY2FsYXIsIFJoczo6T3B0aW9ucywgdHlwZW5hbWUgUmhzOjpJbmRleD4gUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9EZWNvbXBvc2l0aW9uVHlwZSwgdHlwZW5hbWUgUmhzPiBzdHJ1Y3Qgc3BhcnNlX3NvbHZlX3JldHZhbF9iYXNlCisgOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxzcGFyc2Vfc29sdmVfcmV0dmFsX2Jhc2U8X0RlY29tcG9zaXRpb25UeXBlLCBSaHM+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPHR5cGVuYW1lIFJoczo6TmVzdGVkPjo6dHlwZSBSaHNOZXN0ZWRDbGVhbmVkOworICB0eXBlZGVmIF9EZWNvbXBvc2l0aW9uVHlwZSBEZWNvbXBvc2l0aW9uVHlwZTsKKyAgdHlwZWRlZiBSZXR1cm5CeVZhbHVlPHNwYXJzZV9zb2x2ZV9yZXR2YWxfYmFzZT4gQmFzZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpJbmRleCBJbmRleDsKKworICBzcGFyc2Vfc29sdmVfcmV0dmFsX2Jhc2UoY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIGRlYywgY29uc3QgUmhzJiByaHMpCisgICAgOiBtX2RlYyhkZWMpLCBtX3JocyhyaHMpCisgIHt9CisKKyAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2RlYy5jb2xzKCk7IH0KKyAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3Jocy5jb2xzKCk7IH0KKyAgaW5saW5lIGNvbnN0IERlY29tcG9zaXRpb25UeXBlJiBkZWMoKSBjb25zdCB7IHJldHVybiBtX2RlYzsgfQorICBpbmxpbmUgY29uc3QgUmhzTmVzdGVkQ2xlYW5lZCYgcmhzKCkgY29uc3QgeyByZXR1cm4gbV9yaHM7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgc3BhcnNlX3NvbHZlX3JldHZhbDxEZWNvbXBvc2l0aW9uVHlwZSxSaHM+Kj4odGhpcyktPmV2YWxUbyhkc3QpOworICB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IERlY29tcG9zaXRpb25UeXBlJiBtX2RlYzsKKyAgICB0eXBlbmFtZSBSaHM6Ok5lc3RlZCBtX3JoczsKK307CisKKyNkZWZpbmUgRUlHRU5fTUFLRV9TUEFSU0VfU09MVkVfSEVMUEVSUyhEZWNvbXBvc2l0aW9uVHlwZSxSaHMpIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsgXAorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsgXAorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OyBcCisgIHR5cGVkZWYgRWlnZW46OmludGVybmFsOjpzcGFyc2Vfc29sdmVfcmV0dmFsX2Jhc2U8RGVjb21wb3NpdGlvblR5cGUsUmhzPiBCYXNlOyBcCisgIHVzaW5nIEJhc2U6OmRlYzsgXAorICB1c2luZyBCYXNlOjpyaHM7IFwKKyAgdXNpbmcgQmFzZTo6cm93czsgXAorICB1c2luZyBCYXNlOjpjb2xzOyBcCisgIHNwYXJzZV9zb2x2ZV9yZXR2YWwoY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIGRlYywgY29uc3QgUmhzJiByaHMpIFwKKyAgICA6IEJhc2UoZGVjLCByaHMpIHt9CisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZSwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBHdWVzcz4gc3RydWN0IHNvbHZlX3JldHZhbF93aXRoX2d1ZXNzOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZSwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBHdWVzcz4KK3N0cnVjdCB0cmFpdHM8c29sdmVfcmV0dmFsX3dpdGhfZ3Vlc3M8RGVjb21wb3NpdGlvblR5cGUsIFJocywgR3Vlc3M+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBSaHM6OlNjYWxhciwKKyAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIFJoczo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgIFJoczo6UGxhaW5PYmplY3Q6Ok9wdGlvbnMsCisgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICBSaHM6Ok1heENvbHNBdENvbXBpbGVUaW1lPiBSZXR1cm5UeXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVjb21wb3NpdGlvblR5cGUsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgR3Vlc3M+IHN0cnVjdCBzb2x2ZV9yZXR2YWxfd2l0aF9ndWVzcworIDogcHVibGljIFJldHVybkJ5VmFsdWU8c29sdmVfcmV0dmFsX3dpdGhfZ3Vlc3M8RGVjb21wb3NpdGlvblR5cGUsIFJocywgR3Vlc3M+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZWNvbXBvc2l0aW9uVHlwZTo6SW5kZXggSW5kZXg7CisKKyAgc29sdmVfcmV0dmFsX3dpdGhfZ3Vlc3MoY29uc3QgRGVjb21wb3NpdGlvblR5cGUmIGRlYywgY29uc3QgUmhzJiByaHMsIGNvbnN0IEd1ZXNzJiBndWVzcykKKyAgICA6IG1fZGVjKGRlYyksIG1fcmhzKHJocyksIG1fZ3Vlc3MoZ3Vlc3MpCisgIHt9CisKKyAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2RlYy5jb2xzKCk7IH0KKyAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3Jocy5jb2xzKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiBpbmxpbmUgdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgZHN0ID0gbV9ndWVzczsKKyAgICBtX2RlYy5fc29sdmVXaXRoR3Vlc3MobV9yaHMsZHN0KTsKKyAgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBEZWNvbXBvc2l0aW9uVHlwZSYgbV9kZWM7CisgICAgY29uc3QgdHlwZW5hbWUgUmhzOjpOZXN0ZWQgbV9yaHM7CisgICAgY29uc3QgdHlwZW5hbWUgR3Vlc3M6Ok5lc3RlZCBtX2d1ZXNzOworfTsKKworfSAvLyBuYW1lcHNhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfU09MVkVfSApkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL21pc2MvYmxhcy5oIGIvRWlnZW4vc3JjL21pc2MvYmxhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmY2U5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvbWlzYy9ibGFzLmgKQEAgLTAsMCArMSw2NTggQEAKKyNpZm5kZWYgQkxBU19ICisjZGVmaW5lIEJMQVNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisjZGVmaW5lIEJMQVNGVU5DKEZVTkMpIEZVTkMjI18KKworI2lmZGVmIF9fV0lONjRfXwordHlwZWRlZiBsb25nIGxvbmcgQkxBU0xPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBCTEFTVUxPTkc7CisjZWxzZQordHlwZWRlZiBsb25nIEJMQVNMT05HOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIEJMQVNVTE9ORzsKKyNlbmRpZgorCitpbnQgICAgQkxBU0ZVTkMoeGVyYmxhKShjb25zdCBjaGFyICosIGludCAqaW5mbywgaW50KTsKKworZmxvYXQgIEJMQVNGVU5DKHNkb3QpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzZHNkb3QpKGludCAqLCBmbG9hdCAgKiwgICAgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKKworZG91YmxlIEJMQVNGVU5DKGRzZG90KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkZG90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocWRvdCkgIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgIEJMQVNGVU5DKGNkb3R1dykgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0Kik7CitpbnQgIEJMQVNGVU5DKGNkb3RjdykgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0Kik7CitpbnQgIEJMQVNGVU5DKHpkb3R1dykgIChpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlKik7CitpbnQgIEJMQVNGVU5DKHpkb3RjdykgIChpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlKik7CisKK2ludCAgICBCTEFTRlVOQyhzYXhweSkgKGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGRheHB5KSAoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMocWF4cHkpIChpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjYXhweSkgKGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHpheHB5KSAoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeGF4cHkpIChpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjYXhweWMpKGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHpheHB5YykoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeGF4cHljKShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNjb3B5KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhkY29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMocWNvcHkpIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNjb3B5KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh6Y29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeGNvcHkpIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoc3N3YXApIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGRzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhxc3dhcCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoY3N3YXApIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHpzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh4c3dhcCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2Zsb2F0ICBCTEFTRlVOQyhzYXN1bSkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZmxvYXQgIEJMQVNGVU5DKHNjYXN1bSkoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZGFzdW0pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxYXN1bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6YXN1bSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhhc3VtKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKGlzYW1heCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWRhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpcWFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGljYW1heCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXphbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpeGFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoaXNtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpZG1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlxbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWNtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpem1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl4bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhpc2FtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlkYW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXFhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpY2FtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl6YW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXhhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKGlzbWluKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpZG1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGljbWluKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpem1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXhtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitmbG9hdCAgQkxBU0ZVTkMoc2FtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkYW1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFhbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2NhbWF4KShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkemFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2Zsb2F0ICBCTEFTRlVOQyhzYW1pbikgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRhbWluKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocWFtaW4pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzY2FtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6YW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworZmxvYXQgIEJMQVNGVU5DKHNtYXgpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZG1heCkgIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxbWF4KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZmxvYXQgIEJMQVNGVU5DKHNjbWF4KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZHptYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxeG1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitmbG9hdCAgQkxBU0ZVTkMoc21pbikgIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkbWluKSAgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFtaW4pICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2NtaW4pIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkem1pbikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4bWluKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhzc2NhbCkgKGludCAqLCAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoZHNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHFzY2FsKSAoaW50ICosICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjc2NhbCkgKGludCAqLCAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoenNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHhzY2FsKSAoaW50ICosICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjc3NjYWwpKGludCAqLCAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoemRzY2FsKShpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHhxc2NhbCkoaW50ICosICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworZmxvYXQgIEJMQVNGVU5DKHNucm0yKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2Nucm0yKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKKworZG91YmxlIEJMQVNGVU5DKGRucm0yKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocW5ybTIpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkem5ybTIpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4bnJtMikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhzcm90KSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqKTsKK2ludCAgICBCTEFTRlVOQyhkcm90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCAgICBCTEFTRlVOQyhxcm90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCAgICBCTEFTRlVOQyhjc3JvdCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqKTsKK2ludCAgICBCTEFTRlVOQyh6ZHJvdCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCAgICBCTEFTRlVOQyh4cXJvdCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNyb3RnKSAoZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKGRyb3RnKSAoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHFyb3RnKSAoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKGNyb3RnKSAoZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKHpyb3RnKSAoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHhyb3RnKSAoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworCitpbnQgICAgQkxBU0ZVTkMoc3JvdG1nKShmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKGRyb3RtZykoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNyb3RtKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgICAgQkxBU0ZVTkMoZHJvdG0pIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCAgICBCTEFTRlVOQyhxcm90bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworCisvKiBMZXZlbCAyIHJvdXRpbmVzICovCisKK2ludCBCTEFTRlVOQyhzZ2VyKShpbnQgKiwgICAgaW50ICosIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwKKwkJICAgZmxvYXQgKiwgIGludCAqLCBmbG9hdCAqLCAgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXIpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXIpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXJ1KShpbnQgKiwgICAgaW50ICosIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICosICBpbnQgKiwgZmxvYXQgKiwgIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VyYykoaW50ICosICAgIGludCAqLCBmbG9hdCAqLCAgZmxvYXQgKiwgaW50ICosCisJCSAgICBmbG9hdCAqLCAgaW50ICosIGZsb2F0ICosICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlcnUpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VyYykoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZXJ1KShpbnQgKiwgICAgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlcmMpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxZ2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlbXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3Ryc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRyc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRyc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3Ryc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRyc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRyc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3RwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRwbXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRic3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRic3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3N5bXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwgaW50ICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5bXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3ltdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzeW12KSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICosIGludCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeW12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5bXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzcG12KSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHNwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzcG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3BtdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzcG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c3BtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3lyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3lyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeXIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzeXIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzeXIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzeXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3NwcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICopOworaW50IEJMQVNGVU5DKGRzcHIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhxc3ByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoY3NwcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICopOworaW50IEJMQVNGVU5DKHpzcHIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4c3ByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKik7CisKK2ludCBCTEFTRlVOQyhzc3ByMikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICopOworaW50IEJMQVNGVU5DKGRzcHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMocXNwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjc3ByMikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICopOworaW50IEJMQVNGVU5DKHpzcHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeHNwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKKworaW50IEJMQVNGVU5DKGNoZXIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hwcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoemhwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeGhwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CisKK2ludCBCTEFTRlVOQyhjaGVyMikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNocHIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoemhwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4aHByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworCitpbnQgQkxBU0ZVTkMoY2hlbXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwgaW50ICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hwbXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aHBtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc25vcm0pKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRub3JtKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjbm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoem5vcm0pKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNoYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGJtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCisvKiBMZXZlbCAzIHJvdXRpbmVzICovCisKK2ludCBCTEFTRlVOQyhzZ2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosCisJICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjZ2VtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dlMm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJCSAgICAgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICAgZmxvYXQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgKiwgZG91YmxlICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlMm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJCSAgICAgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICAgZmxvYXQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgKiwgZG91YmxlICAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRyc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRyc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBmbG9hdCAqLCAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBmbG9hdCAqLCAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3N5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzeW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzeW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjc3ltbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5bW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzeW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzeXJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzeXJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeXJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzeXJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3N5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaGVtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpoZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNoZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hlcmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlcmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaGVyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpoZXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlcjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjaGVyMm0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcjJtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIybSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosCisJCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW1zKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZXRmMikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdldGYyKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxZ2V0ZjIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXRmMikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdldGYyKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2V0ZjIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dldHJmKShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2V0cmYpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dldHJmKShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2V0cmYpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzbGFzd3ApKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkbGFzd3ApKGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxbGFzd3ApKGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjbGFzd3ApKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6bGFzd3ApKGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4bGFzd3ApKGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dlc3YpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlc3YpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzcG90ZjIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRwb3RmMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXBvdGYyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjcG90ZjIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpwb3RmMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHBvdGYyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNwb3RyZikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHBvdHJmKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxcG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNwb3RyZikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenBvdHJmKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4cG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2xhdXUyKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkbGF1dTIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFsYXV1MikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2xhdXUyKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6bGF1dTIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhsYXV1MikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzbGF1dW0pKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRsYXV1bSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWxhdXVtKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjbGF1dW0pKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpsYXV1bSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGxhdXVtKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3RydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzcG90cmkpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRwb3RyaSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjcG90cmkpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpwb3RyaSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvcGx1Z2lucy9BcnJheUN3aXNlQmluYXJ5T3BzLmggYi9FaWdlbi9zcmMvcGx1Z2lucy9BcnJheUN3aXNlQmluYXJ5T3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5NzllYgotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9wbHVnaW5zL0FycmF5Q3dpc2VCaW5hcnlPcHMuaApAQCAtMCwwICsxLDE5OSBAQAorLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50IHdpc2UgcHJvZHVjdCBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFxzYSBNYXRyaXhCYXNlOjpjd2lzZVByb2R1Y3QKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRUlHRU5fQ1dJU0VfUFJPRFVDVF9SRVRVUk5fVFlQRShEZXJpdmVkLE90aGVyRGVyaXZlZCkKK29wZXJhdG9yKihjb25zdCBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUzxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIEVJR0VOX0NXSVNFX1BST0RVQ1RfUkVUVVJOX1RZUEUoRGVyaXZlZCxPdGhlckRlcml2ZWQpKGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50IHdpc2UgcXVvdGllbnQgb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBcc2EgTWF0cml4QmFzZTo6Y3dpc2VRdW90aWVudAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcXVvdGllbnRfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorb3BlcmF0b3IvKGNvbnN0IEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBtaW4gb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9taW4uY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfbWluLm91dAorICAqCisgICogXHNhIG1heCgpCisgICovCitFSUdFTl9NQUtFX0NXSVNFX0JJTkFSWV9PUChtaW4saW50ZXJuYWw6OnNjYWxhcl9taW5fb3ApCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIG1pbiBvZiBcYyAqdGhpcyBhbmQgc2NhbGFyIFxhIG90aGVyCisgICoKKyAgKiBcc2EgbWF4KCkKKyAgKi8KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX21pbl9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBDb25zdGFudFJldHVyblR5cGU+CisobWluKShjb25zdCBTY2FsYXIgJm90aGVyKSBjb25zdAoreworICByZXR1cm4gKG1pbikoRGVyaXZlZDo6UGxhaW5PYmplY3Q6OkNvbnN0YW50KHJvd3MoKSwgY29scygpLCBvdGhlcikpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBtYXggb2YgXGMgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9tYXguY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfbWF4Lm91dAorICAqCisgICogXHNhIG1pbigpCisgICovCitFSUdFTl9NQUtFX0NXSVNFX0JJTkFSWV9PUChtYXgsaW50ZXJuYWw6OnNjYWxhcl9tYXhfb3ApCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIG1heCBvZiBcYyAqdGhpcyBhbmQgc2NhbGFyIFxhIG90aGVyCisgICoKKyAgKiBcc2EgbWluKCkKKyAgKi8KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX21heF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBDb25zdGFudFJldHVyblR5cGU+CisobWF4KShjb25zdCBTY2FsYXIgJm90aGVyKSBjb25zdAoreworICByZXR1cm4gKG1heCkoRGVyaXZlZDo6UGxhaW5PYmplY3Q6OkNvbnN0YW50KHJvd3MoKSwgY29scygpLCBvdGhlcikpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBcPCBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2xlc3MuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfbGVzcy5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIG9wZXJhdG9yPigpLCBvcGVyYXRvcjw9KCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQklOQVJZX09QKG9wZXJhdG9yPCxzdGQ6Omxlc3MpCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIFw8PSBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2xlc3NfZXF1YWwuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfbGVzc19lcXVhbC5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIG9wZXJhdG9yPj0oKSwgb3BlcmF0b3I8KCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQklOQVJZX09QKG9wZXJhdG9yPD0sc3RkOjpsZXNzX2VxdWFsKQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBcPiBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2dyZWF0ZXIuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfZ3JlYXRlci5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIG9wZXJhdG9yPj0oKSwgb3BlcmF0b3I8KCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQklOQVJZX09QKG9wZXJhdG9yPixzdGQ6OmdyZWF0ZXIpCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIFw+PSBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2dyZWF0ZXJfZXF1YWwuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfZ3JlYXRlcl9lcXVhbC5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIG9wZXJhdG9yPigpLCBvcGVyYXRvcjw9KCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQklOQVJZX09QKG9wZXJhdG9yPj0sc3RkOjpncmVhdGVyX2VxdWFsKQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSA9PSBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFx3YXJuaW5nIHRoaXMgcGVyZm9ybXMgYW4gZXhhY3QgY29tcGFyaXNvbiwgd2hpY2ggaXMgZ2VuZXJhbGx5IGEgYmFkIGlkZWEgd2l0aCBmbG9hdGluZy1wb2ludCB0eXBlcy4KKyAgKiBJbiBvcmRlciB0byBjaGVjayBmb3IgZXF1YWxpdHkgYmV0d2VlbiB0d28gdmVjdG9ycyBvciBtYXRyaWNlcyB3aXRoIGZsb2F0aW5nLXBvaW50IGNvZWZmaWNpZW50cywgaXQgaXMKKyAgKiBnZW5lcmFsbHkgYSBmYXIgYmV0dGVyIGlkZWEgdG8gdXNlIGEgZnV6enkgY29tcGFyaXNvbiBhcyBwcm92aWRlZCBieSBpc0FwcHJveCgpIGFuZAorICAqIGlzTXVjaFNtYWxsZXJUaGFuKCkuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9lcXVhbF9lcXVhbC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9lcXVhbF9lcXVhbC5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIGlzQXBwcm94KCksIGlzTXVjaFNtYWxsZXJUaGFuKCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQklOQVJZX09QKG9wZXJhdG9yPT0sc3RkOjplcXVhbF90bykKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgIT0gb3BlcmF0b3Igb2YgKnRoaXMgYW5kIFxhIG90aGVyCisgICoKKyAgKiBcd2FybmluZyB0aGlzIHBlcmZvcm1zIGFuIGV4YWN0IGNvbXBhcmlzb24sIHdoaWNoIGlzIGdlbmVyYWxseSBhIGJhZCBpZGVhIHdpdGggZmxvYXRpbmctcG9pbnQgdHlwZXMuCisgICogSW4gb3JkZXIgdG8gY2hlY2sgZm9yIGVxdWFsaXR5IGJldHdlZW4gdHdvIHZlY3RvcnMgb3IgbWF0cmljZXMgd2l0aCBmbG9hdGluZy1wb2ludCBjb2VmZmljaWVudHMsIGl0IGlzCisgICogZ2VuZXJhbGx5IGEgZmFyIGJldHRlciBpZGVhIHRvIHVzZSBhIGZ1enp5IGNvbXBhcmlzb24gYXMgcHJvdmlkZWQgYnkgaXNBcHByb3goKSBhbmQKKyAgKiBpc011Y2hTbWFsbGVyVGhhbigpLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2Vfbm90X2VxdWFsLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX25vdF9lcXVhbC5vdXQKKyAgKgorICAqIFxzYSBhbGwoKSwgYW55KCksIGlzQXBwcm94KCksIGlzTXVjaFNtYWxsZXJUaGFuKCkKKyAgKi8KK0VJR0VOX01BS0VfQ1dJU0VfQklOQVJZX09QKG9wZXJhdG9yIT0sc3RkOjpub3RfZXF1YWxfdG8pCisKKy8vIHNjYWxhciBhZGRpdGlvbgorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBcYyAqdGhpcyB3aXRoIGVhY2ggY29lZmYgaW5jcmVtZW50ZWQgYnkgdGhlIGNvbnN0YW50IFxhIHNjYWxhcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfcGx1cy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9wbHVzLm91dAorICAqCisgICogXHNhIG9wZXJhdG9yKz0oKSwgb3BlcmF0b3ItKCkKKyAgKi8KK2lubGluZSBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9hZGRfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KK29wZXJhdG9yKyhjb25zdCBTY2FsYXImIHNjYWxhcikgY29uc3QKK3sKKyAgcmV0dXJuIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2FkZF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfYWRkX29wPFNjYWxhcj4oc2NhbGFyKSk7Cit9CisKK2ZyaWVuZCBpbmxpbmUgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYWRkX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CitvcGVyYXRvcisoY29uc3QgU2NhbGFyJiBzY2FsYXIsY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8RGVyaXZlZD4mIG90aGVyKQoreworICByZXR1cm4gb3RoZXIgKyBzY2FsYXI7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIFxjICp0aGlzIHdpdGggZWFjaCBjb2VmZiBkZWNyZW1lbnRlZCBieSB0aGUgY29uc3RhbnQgXGEgc2NhbGFyCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9taW51cy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9taW51cy5vdXQKKyAgKgorICAqIFxzYSBvcGVyYXRvcisoKSwgb3BlcmF0b3ItPSgpCisgICovCitpbmxpbmUgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYWRkX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CitvcGVyYXRvci0oY29uc3QgU2NhbGFyJiBzY2FsYXIpIGNvbnN0Cit7CisgIHJldHVybiAqdGhpcyArICgtc2NhbGFyKTsKK30KKworZnJpZW5kIGlubGluZSBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9hZGRfb3A8U2NhbGFyPiwgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfb3Bwb3NpdGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gPgorb3BlcmF0b3ItKGNvbnN0IFNjYWxhciYgc2NhbGFyLGNvbnN0IEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTPERlcml2ZWQ+JiBvdGhlcikKK3sKKyAgcmV0dXJuICgtb3RoZXIpICsgc2NhbGFyOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSAmJiBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFx3YXJuaW5nIHRoaXMgb3BlcmF0b3IgaXMgZm9yIGV4cHJlc3Npb24gb2YgYm9vbCBvbmx5LgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfYm9vbGVhbl9hbmQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfYm9vbGVhbl9hbmQub3V0CisgICoKKyAgKiBcc2Egb3BlcmF0b3J8fCgpLCBzZWxlY3QoKQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgoraW5saW5lIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9ib29sZWFuX2FuZF9vcCwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorb3BlcmF0b3ImJihjb25zdCBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUzxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8Ym9vbCxTY2FsYXI+Ojp2YWx1ZSAmJiBpbnRlcm5hbDo6aXNfc2FtZTxib29sLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0VYUFJFU1NJT05TX09GX0JPT0wpOworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Jvb2xlYW5fYW5kX29wLCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+KGRlcml2ZWQoKSxvdGhlci5kZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSB8fCBvcGVyYXRvciBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFx3YXJuaW5nIHRoaXMgb3BlcmF0b3IgaXMgZm9yIGV4cHJlc3Npb24gb2YgYm9vbCBvbmx5LgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfYm9vbGVhbl9vci5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9ib29sZWFuX29yLm91dAorICAqCisgICogXHNhIG9wZXJhdG9yJiYoKSwgc2VsZWN0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYm9vbGVhbl9vcl9vcCwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorb3BlcmF0b3J8fChjb25zdCBFSUdFTl9DVVJSRU5UX1NUT1JBR0VfQkFTRV9DTEFTUzxPdGhlckRlcml2ZWQ+ICZvdGhlcikgY29uc3QKK3sKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8Ym9vbCxTY2FsYXI+Ojp2YWx1ZSAmJiBpbnRlcm5hbDo6aXNfc2FtZTxib29sLHR5cGVuYW1lIE90aGVyRGVyaXZlZDo6U2NhbGFyPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0VYUFJFU1NJT05TX09GX0JPT0wpOworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Jvb2xlYW5fb3Jfb3AsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLG90aGVyLmRlcml2ZWQoKSk7Cit9CmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvcGx1Z2lucy9BcnJheUN3aXNlVW5hcnlPcHMuaCBiL0VpZ2VuL3NyYy9wbHVnaW5zL0FycmF5Q3dpc2VVbmFyeU9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmZhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvcGx1Z2lucy9BcnJheUN3aXNlVW5hcnlPcHMuaApAQCAtMCwwICsxLDIwMiBAQAorCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGFic29sdXRlIHZhbHVlIG9mIFxjICp0aGlzCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9hYnMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfYWJzLm91dAorICAqCisgICogXHNhIGFiczIoKQorICAqLworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9hYnNfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KK2FicygpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIHNxdWFyZWQgYWJzb2x1dGUgdmFsdWUgb2YgXGMgKnRoaXMKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2FiczIuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfYWJzMi5vdXQKKyAgKgorICAqIFxzYSBhYnMoKSwgc3F1YXJlKCkKKyAgKi8KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYWJzMl9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorYWJzMigpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGV4cG9uZW50aWFsIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfZXhwLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2V4cC5vdXQKKyAgKgorICAqIFxzYSBwb3coKSwgbG9nKCksIHNpbigpLCBjb3MoKQorICAqLworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2V4cF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorZXhwKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgbG9nYXJpdGhtIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfbG9nLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2xvZy5vdXQKKyAgKgorICAqIFxzYSBleHAoKQorICAqLworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2xvZ19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorbG9nKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2Ugc3F1YXJlIHJvb3Qgb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9zcXJ0LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3NxcnQub3V0CisgICoKKyAgKiBcc2EgcG93KCksIHNxdWFyZSgpCisgICovCitpbmxpbmUgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3FydF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorc3FydCgpIGNvbnN0Cit7CisgIHJldHVybiBkZXJpdmVkKCk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGNvc2luZSBvZiAqdGhpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2Nvcy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9jb3Mub3V0CisgICoKKyAgKiBcc2Egc2luKCksIGFjb3MoKQorICAqLworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvc19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorY29zKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBzaW5lIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2Vfc2luLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3Npbi5vdXQKKyAgKgorICAqIFxzYSBjb3MoKSwgYXNpbigpCisgICovCitpbmxpbmUgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc2luX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CitzaW4oKSBjb25zdAoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBhcmMgY29zaW5lIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2VfYWNvcy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBDd2lzZV9hY29zLm91dAorICAqCisgICogXHNhIGNvcygpLCBhc2luKCkKKyAgKi8KK2lubGluZSBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9hY29zX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CithY29zKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgYXJjIHNpbmUgb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9hc2luLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX2FzaW4ub3V0CisgICoKKyAgKiBcc2Egc2luKCksIGFjb3MoKQorICAqLworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2FzaW5fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KK2FzaW4oKSBjb25zdAoreworICByZXR1cm4gZGVyaXZlZCgpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSB0YW4gb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV90YW4uY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfdGFuLm91dAorICAqCisgICogXHNhIGNvcygpLCBzaW4oKQorICAqLworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Rhbl9vcDxTY2FsYXI+LCBEZXJpdmVkPgordGFuKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBwb3dlciBvZiAqdGhpcyB0byB0aGUgZ2l2ZW4gZXhwb25lbnQuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBDd2lzZV9wb3cuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfcG93Lm91dAorICAqCisgICogXHNhIGV4cCgpLCBsb2coKQorICAqLworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3Bvd19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorcG93KGNvbnN0IFNjYWxhciYgZXhwb25lbnQpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9wb3dfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KKyAgICAgICAgICAoZGVyaXZlZCgpLCBpbnRlcm5hbDo6c2NhbGFyX3Bvd19vcDxTY2FsYXI+KGV4cG9uZW50KSk7Cit9CisKKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgaW52ZXJzZSBvZiAqdGhpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2ludmVyc2UuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfaW52ZXJzZS5vdXQKKyAgKgorICAqIFxzYSBvcGVyYXRvci8oKSwgb3BlcmF0b3IqKCkKKyAgKi8KK2lubGluZSBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9pbnZlcnNlX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CitpbnZlcnNlKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2Ugc3F1YXJlIG9mICp0aGlzLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgQ3dpc2Vfc3F1YXJlLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIEN3aXNlX3NxdWFyZS5vdXQKKyAgKgorICAqIFxzYSBvcGVyYXRvci8oKSwgb3BlcmF0b3IqKCksIGFiczIoKQorICAqLworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3NxdWFyZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorc3F1YXJlKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgY3ViZSBvZiAqdGhpcy4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIEN3aXNlX2N1YmUuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQ3dpc2VfY3ViZS5vdXQKKyAgKgorICAqIFxzYSBzcXVhcmUoKSwgcG93KCkKKyAgKi8KK2lubGluZSBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9jdWJlX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CitjdWJlKCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworI2RlZmluZSBFSUdFTl9NQUtFX1NDQUxBUl9DV0lTRV9VTkFSWV9PUChNRVRIT0RfTkFNRSxGVU5DVE9SKSBcCisgIGlubGluZSBjb25zdCBDd2lzZVVuYXJ5T3A8c3RkOjpiaW5kZXIybmQ8RlVOQ1RPUjxTY2FsYXI+ID4sIGNvbnN0IERlcml2ZWQ+IFwKKyAgTUVUSE9EX05BTUUoY29uc3QgU2NhbGFyJiBzKSBjb25zdCB7IFwKKyAgICByZXR1cm4gQ3dpc2VVbmFyeU9wPHN0ZDo6YmluZGVyMm5kPEZVTkNUT1I8U2NhbGFyPiA+LCBjb25zdCBEZXJpdmVkPiBcCisgICAgICAgICAgICAoZGVyaXZlZCgpLCBzdGQ6OmJpbmQybmQoRlVOQ1RPUjxTY2FsYXI+KCksIHMpKTsgXAorICB9CisKK0VJR0VOX01BS0VfU0NBTEFSX0NXSVNFX1VOQVJZX09QKG9wZXJhdG9yPT0sICBzdGQ6OmVxdWFsX3RvKQorRUlHRU5fTUFLRV9TQ0FMQVJfQ1dJU0VfVU5BUllfT1Aob3BlcmF0b3IhPSwgIHN0ZDo6bm90X2VxdWFsX3RvKQorRUlHRU5fTUFLRV9TQ0FMQVJfQ1dJU0VfVU5BUllfT1Aob3BlcmF0b3I8LCAgIHN0ZDo6bGVzcykKK0VJR0VOX01BS0VfU0NBTEFSX0NXSVNFX1VOQVJZX09QKG9wZXJhdG9yPD0sICBzdGQ6Omxlc3NfZXF1YWwpCitFSUdFTl9NQUtFX1NDQUxBUl9DV0lTRV9VTkFSWV9PUChvcGVyYXRvcj4sICAgc3RkOjpncmVhdGVyKQorRUlHRU5fTUFLRV9TQ0FMQVJfQ1dJU0VfVU5BUllfT1Aob3BlcmF0b3I+PSwgIHN0ZDo6Z3JlYXRlcl9lcXVhbCkKKwpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL3BsdWdpbnMvQmxvY2tNZXRob2RzLmggYi9FaWdlbi9zcmMvcGx1Z2lucy9CbG9ja01ldGhvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjIyNDAwCi0tLSAvZGV2L251bGwKKysrIGIvRWlnZW4vc3JjL3BsdWdpbnMvQmxvY2tNZXRob2RzLmgKQEAgLTAsMCArMSw1ODAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQkxPQ0tNRVRIT0RTX0gKKyNkZWZpbmUgRUlHRU5fQkxPQ0tNRVRIT0RTX0gKKworI2lmbmRlZiBFSUdFTl9QQVJTRURfQllfRE9YWUdFTgorCisvKiogXGludGVybmFsIGV4cHJlc3Npb24gdHlwZSBvZiBhIGNvbHVtbiAqLwordHlwZWRlZiBCbG9jazxEZXJpdmVkLCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwgMSwgIUlzUm93TWFqb3I+IENvbFhwcjsKK3R5cGVkZWYgY29uc3QgQmxvY2s8Y29uc3QgRGVyaXZlZCwgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsIDEsICFJc1Jvd01ham9yPiBDb25zdENvbFhwcjsKKy8qKiBcaW50ZXJuYWwgZXhwcmVzc2lvbiB0eXBlIG9mIGEgcm93ICovCit0eXBlZGVmIEJsb2NrPERlcml2ZWQsIDEsIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLCBJc1Jvd01ham9yPiBSb3dYcHI7Cit0eXBlZGVmIGNvbnN0IEJsb2NrPGNvbnN0IERlcml2ZWQsIDEsIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lLCBJc1Jvd01ham9yPiBDb25zdFJvd1hwcjsKKy8qKiBcaW50ZXJuYWwgZXhwcmVzc2lvbiB0eXBlIG9mIGEgYmxvY2sgb2Ygd2hvbGUgY29sdW1ucyAqLwordHlwZWRlZiBCbG9jazxEZXJpdmVkLCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpSb3dzQXRDb21waWxlVGltZSwgRHluYW1pYywgIUlzUm93TWFqb3I+IENvbHNCbG9ja1hwcjsKK3R5cGVkZWYgY29uc3QgQmxvY2s8Y29uc3QgRGVyaXZlZCwgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsIER5bmFtaWMsICFJc1Jvd01ham9yPiBDb25zdENvbHNCbG9ja1hwcjsKKy8qKiBcaW50ZXJuYWwgZXhwcmVzc2lvbiB0eXBlIG9mIGEgYmxvY2sgb2Ygd2hvbGUgcm93cyAqLwordHlwZWRlZiBCbG9jazxEZXJpdmVkLCBEeW5hbWljLCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZSwgSXNSb3dNYWpvcj4gUm93c0Jsb2NrWHByOwordHlwZWRlZiBjb25zdCBCbG9jazxjb25zdCBEZXJpdmVkLCBEeW5hbWljLCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZSwgSXNSb3dNYWpvcj4gQ29uc3RSb3dzQmxvY2tYcHI7CisvKiogXGludGVybmFsIGV4cHJlc3Npb24gdHlwZSBvZiBhIGJsb2NrIG9mIHdob2xlIGNvbHVtbnMgKi8KK3RlbXBsYXRlPGludCBOPiBzdHJ1Y3QgTkNvbHNCbG9ja1hwciB7IHR5cGVkZWYgQmxvY2s8RGVyaXZlZCwgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsIE4sICFJc1Jvd01ham9yPiBUeXBlOyB9OwordGVtcGxhdGU8aW50IE4+IHN0cnVjdCBDb25zdE5Db2xzQmxvY2tYcHIgeyB0eXBlZGVmIGNvbnN0IEJsb2NrPGNvbnN0IERlcml2ZWQsIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlJvd3NBdENvbXBpbGVUaW1lLCBOLCAhSXNSb3dNYWpvcj4gVHlwZTsgfTsKKy8qKiBcaW50ZXJuYWwgZXhwcmVzc2lvbiB0eXBlIG9mIGEgYmxvY2sgb2Ygd2hvbGUgcm93cyAqLwordGVtcGxhdGU8aW50IE4+IHN0cnVjdCBOUm93c0Jsb2NrWHByIHsgdHlwZWRlZiBCbG9jazxEZXJpdmVkLCBOLCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZSwgSXNSb3dNYWpvcj4gVHlwZTsgfTsKK3RlbXBsYXRlPGludCBOPiBzdHJ1Y3QgQ29uc3ROUm93c0Jsb2NrWHByIHsgdHlwZWRlZiBjb25zdCBCbG9jazxjb25zdCBEZXJpdmVkLCBOLCBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpDb2xzQXRDb21waWxlVGltZSwgSXNSb3dNYWpvcj4gVHlwZTsgfTsKKworCisjZW5kaWYgLy8gbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKy8qKiBccmV0dXJucyBhIGR5bmFtaWMtc2l6ZSBleHByZXNzaW9uIG9mIGEgYmxvY2sgaW4gKnRoaXMuCisgICoKKyAgKiBccGFyYW0gc3RhcnRSb3cgdGhlIGZpcnN0IHJvdyBpbiB0aGUgYmxvY2sKKyAgKiBccGFyYW0gc3RhcnRDb2wgdGhlIGZpcnN0IGNvbHVtbiBpbiB0aGUgYmxvY2sKKyAgKiBccGFyYW0gYmxvY2tSb3dzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgYmxvY2sKKyAgKiBccGFyYW0gYmxvY2tDb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYmxvY2sKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfYmxvY2tfaW50X2ludF9pbnRfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfYmxvY2tfaW50X2ludF9pbnRfaW50Lm91dAorICAqCisgICogXG5vdGUgRXZlbiB0aG91Z2ggdGhlIHJldHVybmVkIGV4cHJlc3Npb24gaGFzIGR5bmFtaWMgc2l6ZSwgaW4gdGhlIGNhc2UKKyAgKiB3aGVuIGl0IGlzIGFwcGxpZWQgdG8gYSBmaXhlZC1zaXplIG1hdHJpeCwgaXQgaW5oZXJpdHMgYSBmaXhlZCBtYXhpbWFsIHNpemUsCisgICogd2hpY2ggbWVhbnMgdGhhdCBldmFsdWF0aW5nIGl0IGRvZXMgbm90IGNhdXNlIGEgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgpCisgICovCitpbmxpbmUgQmxvY2s8RGVyaXZlZD4gYmxvY2soSW5kZXggc3RhcnRSb3csIEluZGV4IHN0YXJ0Q29sLCBJbmRleCBibG9ja1Jvd3MsIEluZGV4IGJsb2NrQ29scykKK3sKKyAgcmV0dXJuIEJsb2NrPERlcml2ZWQ+KGRlcml2ZWQoKSwgc3RhcnRSb3csIHN0YXJ0Q29sLCBibG9ja1Jvd3MsIGJsb2NrQ29scyk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KS4gKi8KK2lubGluZSBjb25zdCBCbG9jazxjb25zdCBEZXJpdmVkPiBibG9jayhJbmRleCBzdGFydFJvdywgSW5kZXggc3RhcnRDb2wsIEluZGV4IGJsb2NrUm93cywgSW5kZXggYmxvY2tDb2xzKSBjb25zdAoreworICByZXR1cm4gQmxvY2s8Y29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCBzdGFydFJvdywgc3RhcnRDb2wsIGJsb2NrUm93cywgYmxvY2tDb2xzKTsKK30KKworCisKKworLyoqIFxyZXR1cm5zIGEgZHluYW1pYy1zaXplIGV4cHJlc3Npb24gb2YgYSB0b3AtcmlnaHQgY29ybmVyIG9mICp0aGlzLgorICAqCisgICogXHBhcmFtIGNSb3dzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29ybmVyCisgICogXHBhcmFtIGNDb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgY29ybmVyCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3RvcFJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90b3BSaWdodENvcm5lcl9pbnRfaW50Lm91dAorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKyAgKi8KK2lubGluZSBCbG9jazxEZXJpdmVkPiB0b3BSaWdodENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpCit7CisgIHJldHVybiBCbG9jazxEZXJpdmVkPihkZXJpdmVkKCksIDAsIGNvbHMoKSAtIGNDb2xzLCBjUm93cywgY0NvbHMpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiB0b3BSaWdodENvcm5lcihJbmRleCwgSW5kZXgpLiovCitpbmxpbmUgY29uc3QgQmxvY2s8Y29uc3QgRGVyaXZlZD4gdG9wUmlnaHRDb3JuZXIoSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKSBjb25zdAoreworICByZXR1cm4gQmxvY2s8Y29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCAwLCBjb2xzKCkgLSBjQ29scywgY1Jvd3MsIGNDb2xzKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgYSBmaXhlZC1zaXplIHRvcC1yaWdodCBjb3JuZXIgb2YgKnRoaXMuCisgICoKKyAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVycyBDUm93cyBhbmQgQ0NvbHMgYXJlIHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBpbiB0aGUgY29ybmVyLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcFJpZ2h0Q29ybmVyLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lci5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisgICovCit0ZW1wbGF0ZTxpbnQgQ1Jvd3MsIGludCBDQ29scz4KK2lubGluZSBCbG9jazxEZXJpdmVkLCBDUm93cywgQ0NvbHM+IHRvcFJpZ2h0Q29ybmVyKCkKK3sKKyAgcmV0dXJuIEJsb2NrPERlcml2ZWQsIENSb3dzLCBDQ29scz4oZGVyaXZlZCgpLCAwLCBjb2xzKCkgLSBDQ29scyk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHRvcFJpZ2h0Q29ybmVyPGludCwgaW50PigpLiovCit0ZW1wbGF0ZTxpbnQgQ1Jvd3MsIGludCBDQ29scz4KK2lubGluZSBjb25zdCBCbG9jazxjb25zdCBEZXJpdmVkLCBDUm93cywgQ0NvbHM+IHRvcFJpZ2h0Q29ybmVyKCkgY29uc3QKK3sKKyAgcmV0dXJuIEJsb2NrPGNvbnN0IERlcml2ZWQsIENSb3dzLCBDQ29scz4oZGVyaXZlZCgpLCAwLCBjb2xzKCkgLSBDQ29scyk7Cit9CisKKworCisKKy8qKiBccmV0dXJucyBhIGR5bmFtaWMtc2l6ZSBleHByZXNzaW9uIG9mIGEgdG9wLWxlZnQgY29ybmVyIG9mICp0aGlzLgorICAqCisgICogXHBhcmFtIGNSb3dzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29ybmVyCisgICogXHBhcmFtIGNDb2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgY29ybmVyCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX3RvcExlZnRDb3JuZXJfaW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RvcExlZnRDb3JuZXJfaW50X2ludC5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisgICovCitpbmxpbmUgQmxvY2s8RGVyaXZlZD4gdG9wTGVmdENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpCit7CisgIHJldHVybiBCbG9jazxEZXJpdmVkPihkZXJpdmVkKCksIDAsIDAsIGNSb3dzLCBjQ29scyk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHRvcExlZnRDb3JuZXIoSW5kZXgsIEluZGV4KS4qLworaW5saW5lIGNvbnN0IEJsb2NrPGNvbnN0IERlcml2ZWQ+IHRvcExlZnRDb3JuZXIoSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKSBjb25zdAoreworICByZXR1cm4gQmxvY2s8Y29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCAwLCAwLCBjUm93cywgY0NvbHMpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIGZpeGVkLXNpemUgdG9wLWxlZnQgY29ybmVyIG9mICp0aGlzLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgQ1Jvd3MgYW5kIENDb2xzIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4gdGhlIGNvcm5lci4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BMZWZ0Q29ybmVyLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BMZWZ0Q29ybmVyLm91dAorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKyAgKi8KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIEJsb2NrPERlcml2ZWQsIENSb3dzLCBDQ29scz4gdG9wTGVmdENvcm5lcigpCit7CisgIHJldHVybiBCbG9jazxEZXJpdmVkLCBDUm93cywgQ0NvbHM+KGRlcml2ZWQoKSwgMCwgMCk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHRvcExlZnRDb3JuZXI8aW50LCBpbnQ+KCkuKi8KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIGNvbnN0IEJsb2NrPGNvbnN0IERlcml2ZWQsIENSb3dzLCBDQ29scz4gdG9wTGVmdENvcm5lcigpIGNvbnN0Cit7CisgIHJldHVybiBCbG9jazxjb25zdCBEZXJpdmVkLCBDUm93cywgQ0NvbHM+KGRlcml2ZWQoKSwgMCwgMCk7Cit9CisKKworCisvKiogXHJldHVybnMgYSBkeW5hbWljLXNpemUgZXhwcmVzc2lvbiBvZiBhIGJvdHRvbS1yaWdodCBjb3JuZXIgb2YgKnRoaXMuCisgICoKKyAgKiBccGFyYW0gY1Jvd3MgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBjb3JuZXIKKyAgKiBccGFyYW0gY0NvbHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBjb3JuZXIKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfYm90dG9tUmlnaHRDb3JuZXJfaW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2JvdHRvbVJpZ2h0Q29ybmVyX2ludF9pbnQub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorICAqLworaW5saW5lIEJsb2NrPERlcml2ZWQ+IGJvdHRvbVJpZ2h0Q29ybmVyKEluZGV4IGNSb3dzLCBJbmRleCBjQ29scykKK3sKKyAgcmV0dXJuIEJsb2NrPERlcml2ZWQ+KGRlcml2ZWQoKSwgcm93cygpIC0gY1Jvd3MsIGNvbHMoKSAtIGNDb2xzLCBjUm93cywgY0NvbHMpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBib3R0b21SaWdodENvcm5lcihJbmRleCwgSW5kZXgpLiovCitpbmxpbmUgY29uc3QgQmxvY2s8Y29uc3QgRGVyaXZlZD4gYm90dG9tUmlnaHRDb3JuZXIoSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKSBjb25zdAoreworICByZXR1cm4gQmxvY2s8Y29uc3QgRGVyaXZlZD4oZGVyaXZlZCgpLCByb3dzKCkgLSBjUm93cywgY29scygpIC0gY0NvbHMsIGNSb3dzLCBjQ29scyk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgZml4ZWQtc2l6ZSBib3R0b20tcmlnaHQgY29ybmVyIG9mICp0aGlzLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgQ1Jvd3MgYW5kIENDb2xzIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4gdGhlIGNvcm5lci4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lci5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tUmlnaHRDb3JuZXIub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorICAqLwordGVtcGxhdGU8aW50IENSb3dzLCBpbnQgQ0NvbHM+CitpbmxpbmUgQmxvY2s8RGVyaXZlZCwgQ1Jvd3MsIENDb2xzPiBib3R0b21SaWdodENvcm5lcigpCit7CisgIHJldHVybiBCbG9jazxEZXJpdmVkLCBDUm93cywgQ0NvbHM+KGRlcml2ZWQoKSwgcm93cygpIC0gQ1Jvd3MsIGNvbHMoKSAtIENDb2xzKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgYm90dG9tUmlnaHRDb3JuZXI8aW50LCBpbnQ+KCkuKi8KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIGNvbnN0IEJsb2NrPGNvbnN0IERlcml2ZWQsIENSb3dzLCBDQ29scz4gYm90dG9tUmlnaHRDb3JuZXIoKSBjb25zdAoreworICByZXR1cm4gQmxvY2s8Y29uc3QgRGVyaXZlZCwgQ1Jvd3MsIENDb2xzPihkZXJpdmVkKCksIHJvd3MoKSAtIENSb3dzLCBjb2xzKCkgLSBDQ29scyk7Cit9CisKKworCisvKiogXHJldHVybnMgYSBkeW5hbWljLXNpemUgZXhwcmVzc2lvbiBvZiBhIGJvdHRvbS1sZWZ0IGNvcm5lciBvZiAqdGhpcy4KKyAgKgorICAqIFxwYXJhbSBjUm93cyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGNvcm5lcgorICAqIFxwYXJhbSBjQ29scyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGNvcm5lcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9ib3R0b21MZWZ0Q29ybmVyX2ludF9pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9ib3R0b21MZWZ0Q29ybmVyX2ludF9pbnQub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorICAqLworaW5saW5lIEJsb2NrPERlcml2ZWQ+IGJvdHRvbUxlZnRDb3JuZXIoSW5kZXggY1Jvd3MsIEluZGV4IGNDb2xzKQoreworICByZXR1cm4gQmxvY2s8RGVyaXZlZD4oZGVyaXZlZCgpLCByb3dzKCkgLSBjUm93cywgMCwgY1Jvd3MsIGNDb2xzKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgYm90dG9tTGVmdENvcm5lcihJbmRleCwgSW5kZXgpLiovCitpbmxpbmUgY29uc3QgQmxvY2s8Y29uc3QgRGVyaXZlZD4gYm90dG9tTGVmdENvcm5lcihJbmRleCBjUm93cywgSW5kZXggY0NvbHMpIGNvbnN0Cit7CisgIHJldHVybiBCbG9jazxjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIHJvd3MoKSAtIGNSb3dzLCAwLCBjUm93cywgY0NvbHMpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBhIGZpeGVkLXNpemUgYm90dG9tLWxlZnQgY29ybmVyIG9mICp0aGlzLgorICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgQ1Jvd3MgYW5kIENDb2xzIGFyZSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4gdGhlIGNvcm5lci4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21MZWZ0Q29ybmVyLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21MZWZ0Q29ybmVyLm91dAorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKyAgKi8KK3RlbXBsYXRlPGludCBDUm93cywgaW50IENDb2xzPgoraW5saW5lIEJsb2NrPERlcml2ZWQsIENSb3dzLCBDQ29scz4gYm90dG9tTGVmdENvcm5lcigpCit7CisgIHJldHVybiBCbG9jazxEZXJpdmVkLCBDUm93cywgQ0NvbHM+KGRlcml2ZWQoKSwgcm93cygpIC0gQ1Jvd3MsIDApOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBib3R0b21MZWZ0Q29ybmVyPGludCwgaW50PigpLiovCit0ZW1wbGF0ZTxpbnQgQ1Jvd3MsIGludCBDQ29scz4KK2lubGluZSBjb25zdCBCbG9jazxjb25zdCBEZXJpdmVkLCBDUm93cywgQ0NvbHM+IGJvdHRvbUxlZnRDb3JuZXIoKSBjb25zdAoreworICByZXR1cm4gQmxvY2s8Y29uc3QgRGVyaXZlZCwgQ1Jvd3MsIENDb2xzPihkZXJpdmVkKCksIHJvd3MoKSAtIENSb3dzLCAwKTsKK30KKworCisKKy8qKiBccmV0dXJucyBhIGJsb2NrIGNvbnNpc3Rpbmcgb2YgdGhlIHRvcCByb3dzIG9mICp0aGlzLgorICAqCisgICogXHBhcmFtIG4gdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBibG9jaworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90b3BSb3dzX2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RvcFJvd3NfaW50Lm91dAorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKyAgKi8KK2lubGluZSBSb3dzQmxvY2tYcHIgdG9wUm93cyhJbmRleCBuKQoreworICByZXR1cm4gUm93c0Jsb2NrWHByKGRlcml2ZWQoKSwgMCwgMCwgbiwgY29scygpKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgdG9wUm93cyhJbmRleCkuKi8KK2lubGluZSBDb25zdFJvd3NCbG9ja1hwciB0b3BSb3dzKEluZGV4IG4pIGNvbnN0Cit7CisgIHJldHVybiBDb25zdFJvd3NCbG9ja1hwcihkZXJpdmVkKCksIDAsIDAsIG4sIGNvbHMoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhIGJsb2NrIGNvbnNpc3Rpbmcgb2YgdGhlIHRvcCByb3dzIG9mICp0aGlzLgorICAqCisgICogXHRwYXJhbSBOIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgYmxvY2sKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3RvcFJvd3MuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfdG9wUm93cy5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisgICovCit0ZW1wbGF0ZTxpbnQgTj4KK2lubGluZSB0eXBlbmFtZSBOUm93c0Jsb2NrWHByPE4+OjpUeXBlIHRvcFJvd3MoKQoreworICByZXR1cm4gdHlwZW5hbWUgTlJvd3NCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIDAsIDAsIE4sIGNvbHMoKSk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHRvcFJvd3M8aW50PigpLiovCit0ZW1wbGF0ZTxpbnQgTj4KK2lubGluZSB0eXBlbmFtZSBDb25zdE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUgdG9wUm93cygpIGNvbnN0Cit7CisgIHJldHVybiB0eXBlbmFtZSBDb25zdE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUoZGVyaXZlZCgpLCAwLCAwLCBOLCBjb2xzKCkpOworfQorCisKKworLyoqIFxyZXR1cm5zIGEgYmxvY2sgY29uc2lzdGluZyBvZiB0aGUgYm90dG9tIHJvd3Mgb2YgKnRoaXMuCisgICoKKyAgKiBccGFyYW0gbiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGJsb2NrCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2JvdHRvbVJvd3NfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfYm90dG9tUm93c19pbnQub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorICAqLworaW5saW5lIFJvd3NCbG9ja1hwciBib3R0b21Sb3dzKEluZGV4IG4pCit7CisgIHJldHVybiBSb3dzQmxvY2tYcHIoZGVyaXZlZCgpLCByb3dzKCkgLSBuLCAwLCBuLCBjb2xzKCkpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBib3R0b21Sb3dzKEluZGV4KS4qLworaW5saW5lIENvbnN0Um93c0Jsb2NrWHByIGJvdHRvbVJvd3MoSW5kZXggbikgY29uc3QKK3sKKyAgcmV0dXJuIENvbnN0Um93c0Jsb2NrWHByKGRlcml2ZWQoKSwgcm93cygpIC0gbiwgMCwgbiwgY29scygpKTsKK30KKworLyoqIFxyZXR1cm5zIGEgYmxvY2sgY29uc2lzdGluZyBvZiB0aGUgYm90dG9tIHJvd3Mgb2YgKnRoaXMuCisgICoKKyAgKiBcdHBhcmFtIE4gdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBibG9jaworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfYm90dG9tUm93cy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9ib3R0b21Sb3dzLm91dAorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKyAgKi8KK3RlbXBsYXRlPGludCBOPgoraW5saW5lIHR5cGVuYW1lIE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUgYm90dG9tUm93cygpCit7CisgIHJldHVybiB0eXBlbmFtZSBOUm93c0Jsb2NrWHByPE4+OjpUeXBlKGRlcml2ZWQoKSwgcm93cygpIC0gTiwgMCwgTiwgY29scygpKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgYm90dG9tUm93czxpbnQ+KCkuKi8KK3RlbXBsYXRlPGludCBOPgoraW5saW5lIHR5cGVuYW1lIENvbnN0TlJvd3NCbG9ja1hwcjxOPjo6VHlwZSBib3R0b21Sb3dzKCkgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0TlJvd3NCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIHJvd3MoKSAtIE4sIDAsIE4sIGNvbHMoKSk7Cit9CisKKworCisvKiogXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIGEgcmFuZ2Ugb2Ygcm93cyBvZiAqdGhpcy4KKyAgKgorICAqIFxwYXJhbSBzdGFydFJvdyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHJvdyBpbiB0aGUgYmxvY2sKKyAgKiBccGFyYW0gbnVtUm93cyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGJsb2NrCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBEZW5zZUJhc2VfbWlkZGxlUm93c19pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRGVuc2VCYXNlX21pZGRsZVJvd3NfaW50Lm91dAorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKyAgKi8KK2lubGluZSBSb3dzQmxvY2tYcHIgbWlkZGxlUm93cyhJbmRleCBzdGFydFJvdywgSW5kZXggbnVtUm93cykKK3sKKyAgcmV0dXJuIFJvd3NCbG9ja1hwcihkZXJpdmVkKCksIHN0YXJ0Um93LCAwLCBudW1Sb3dzLCBjb2xzKCkpOworfQorCisvKiogVGhpcyBpcyB0aGUgY29uc3QgdmVyc2lvbiBvZiBtaWRkbGVSb3dzKEluZGV4LEluZGV4KS4qLworaW5saW5lIENvbnN0Um93c0Jsb2NrWHByIG1pZGRsZVJvd3MoSW5kZXggc3RhcnRSb3csIEluZGV4IG51bVJvd3MpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdFJvd3NCbG9ja1hwcihkZXJpdmVkKCksIHN0YXJ0Um93LCAwLCBudW1Sb3dzLCBjb2xzKCkpOworfQorCisvKiogXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIGEgcmFuZ2Ugb2Ygcm93cyBvZiAqdGhpcy4KKyAgKgorICAqIFx0cGFyYW0gTiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGJsb2NrCisgICogXHBhcmFtIHN0YXJ0Um93IHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgcm93IGluIHRoZSBibG9jaworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVSb3dzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIERlbnNlQmFzZV90ZW1wbGF0ZV9pbnRfbWlkZGxlUm93cy5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisgICovCit0ZW1wbGF0ZTxpbnQgTj4KK2lubGluZSB0eXBlbmFtZSBOUm93c0Jsb2NrWHByPE4+OjpUeXBlIG1pZGRsZVJvd3MoSW5kZXggc3RhcnRSb3cpCit7CisgIHJldHVybiB0eXBlbmFtZSBOUm93c0Jsb2NrWHByPE4+OjpUeXBlKGRlcml2ZWQoKSwgc3RhcnRSb3csIDAsIE4sIGNvbHMoKSk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIG1pZGRsZVJvd3M8aW50PigpLiovCit0ZW1wbGF0ZTxpbnQgTj4KK2lubGluZSB0eXBlbmFtZSBDb25zdE5Sb3dzQmxvY2tYcHI8Tj46OlR5cGUgbWlkZGxlUm93cyhJbmRleCBzdGFydFJvdykgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0TlJvd3NCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIHN0YXJ0Um93LCAwLCBOLCBjb2xzKCkpOworfQorCisKKworLyoqIFxyZXR1cm5zIGEgYmxvY2sgY29uc2lzdGluZyBvZiB0aGUgbGVmdCBjb2x1bW5zIG9mICp0aGlzLgorICAqCisgICogXHBhcmFtIG4gdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBibG9jaworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9sZWZ0Q29sc19pbnQuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9sZWZ0Q29sc19pbnQub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorICAqLworaW5saW5lIENvbHNCbG9ja1hwciBsZWZ0Q29scyhJbmRleCBuKQoreworICByZXR1cm4gQ29sc0Jsb2NrWHByKGRlcml2ZWQoKSwgMCwgMCwgcm93cygpLCBuKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgbGVmdENvbHMoSW5kZXgpLiovCitpbmxpbmUgQ29uc3RDb2xzQmxvY2tYcHIgbGVmdENvbHMoSW5kZXggbikgY29uc3QKK3sKKyAgcmV0dXJuIENvbnN0Q29sc0Jsb2NrWHByKGRlcml2ZWQoKSwgMCwgMCwgcm93cygpLCBuKTsKK30KKworLyoqIFxyZXR1cm5zIGEgYmxvY2sgY29uc2lzdGluZyBvZiB0aGUgbGVmdCBjb2x1bW5zIG9mICp0aGlzLgorICAqCisgICogXHRwYXJhbSBOIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYmxvY2sKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2xlZnRDb2xzLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2xlZnRDb2xzLm91dAorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKyAgKi8KK3RlbXBsYXRlPGludCBOPgoraW5saW5lIHR5cGVuYW1lIE5Db2xzQmxvY2tYcHI8Tj46OlR5cGUgbGVmdENvbHMoKQoreworICByZXR1cm4gdHlwZW5hbWUgTkNvbHNCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIDAsIDAsIHJvd3MoKSwgTik7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGxlZnRDb2xzPGludD4oKS4qLwordGVtcGxhdGU8aW50IE4+CitpbmxpbmUgdHlwZW5hbWUgQ29uc3ROQ29sc0Jsb2NrWHByPE4+OjpUeXBlIGxlZnRDb2xzKCkgY29uc3QKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIENvbnN0TkNvbHNCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIDAsIDAsIHJvd3MoKSwgTik7Cit9CisKKworCisvKiogXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSByaWdodCBjb2x1bW5zIG9mICp0aGlzLgorICAqCisgICogXHBhcmFtIG4gdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBibG9jaworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9yaWdodENvbHNfaW50LmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeEJhc2VfcmlnaHRDb2xzX2ludC5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBCbG9jaywgYmxvY2soSW5kZXgsSW5kZXgsSW5kZXgsSW5kZXgpCisgICovCitpbmxpbmUgQ29sc0Jsb2NrWHByIHJpZ2h0Q29scyhJbmRleCBuKQoreworICByZXR1cm4gQ29sc0Jsb2NrWHByKGRlcml2ZWQoKSwgMCwgY29scygpIC0gbiwgcm93cygpLCBuKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgcmlnaHRDb2xzKEluZGV4KS4qLworaW5saW5lIENvbnN0Q29sc0Jsb2NrWHByIHJpZ2h0Q29scyhJbmRleCBuKSBjb25zdAoreworICByZXR1cm4gQ29uc3RDb2xzQmxvY2tYcHIoZGVyaXZlZCgpLCAwLCBjb2xzKCkgLSBuLCByb3dzKCksIG4pOworfQorCisvKiogXHJldHVybnMgYSBibG9jayBjb25zaXN0aW5nIG9mIHRoZSByaWdodCBjb2x1bW5zIG9mICp0aGlzLgorICAqCisgICogXHRwYXJhbSBOIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYmxvY2sKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3JpZ2h0Q29scy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9yaWdodENvbHMub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorICAqLwordGVtcGxhdGU8aW50IE4+CitpbmxpbmUgdHlwZW5hbWUgTkNvbHNCbG9ja1hwcjxOPjo6VHlwZSByaWdodENvbHMoKQoreworICByZXR1cm4gdHlwZW5hbWUgTkNvbHNCbG9ja1hwcjxOPjo6VHlwZShkZXJpdmVkKCksIDAsIGNvbHMoKSAtIE4sIHJvd3MoKSwgTik7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHJpZ2h0Q29sczxpbnQ+KCkuKi8KK3RlbXBsYXRlPGludCBOPgoraW5saW5lIHR5cGVuYW1lIENvbnN0TkNvbHNCbG9ja1hwcjxOPjo6VHlwZSByaWdodENvbHMoKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgQ29uc3ROQ29sc0Jsb2NrWHByPE4+OjpUeXBlKGRlcml2ZWQoKSwgMCwgY29scygpIC0gTiwgcm93cygpLCBOKTsKK30KKworCisKKy8qKiBccmV0dXJucyBhIGJsb2NrIGNvbnNpc3Rpbmcgb2YgYSByYW5nZSBvZiBjb2x1bW5zIG9mICp0aGlzLgorICAqCisgICogXHBhcmFtIHN0YXJ0Q29sIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY29sdW1uIGluIHRoZSBibG9jaworICAqIFxwYXJhbSBudW1Db2xzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYmxvY2sKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIERlbnNlQmFzZV9taWRkbGVDb2xzX2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBEZW5zZUJhc2VfbWlkZGxlQ29sc19pbnQub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQmxvY2ssIGJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KQorICAqLworaW5saW5lIENvbHNCbG9ja1hwciBtaWRkbGVDb2xzKEluZGV4IHN0YXJ0Q29sLCBJbmRleCBudW1Db2xzKQoreworICByZXR1cm4gQ29sc0Jsb2NrWHByKGRlcml2ZWQoKSwgMCwgc3RhcnRDb2wsIHJvd3MoKSwgbnVtQ29scyk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIG1pZGRsZUNvbHMoSW5kZXgsSW5kZXgpLiovCitpbmxpbmUgQ29uc3RDb2xzQmxvY2tYcHIgbWlkZGxlQ29scyhJbmRleCBzdGFydENvbCwgSW5kZXggbnVtQ29scykgY29uc3QKK3sKKyAgcmV0dXJuIENvbnN0Q29sc0Jsb2NrWHByKGRlcml2ZWQoKSwgMCwgc3RhcnRDb2wsIHJvd3MoKSwgbnVtQ29scyk7Cit9CisKKy8qKiBccmV0dXJucyBhIGJsb2NrIGNvbnNpc3Rpbmcgb2YgYSByYW5nZSBvZiBjb2x1bW5zIG9mICp0aGlzLgorICAqCisgICogXHRwYXJhbSBOIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgYmxvY2sKKyAgKiBccGFyYW0gc3RhcnRDb2wgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjb2x1bW4gaW4gdGhlIGJsb2NrCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBEZW5zZUJhc2VfdGVtcGxhdGVfaW50X21pZGRsZUNvbHMuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVDb2xzLm91dAorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKyAgKi8KK3RlbXBsYXRlPGludCBOPgoraW5saW5lIHR5cGVuYW1lIE5Db2xzQmxvY2tYcHI8Tj46OlR5cGUgbWlkZGxlQ29scyhJbmRleCBzdGFydENvbCkKK3sKKyAgcmV0dXJuIHR5cGVuYW1lIE5Db2xzQmxvY2tYcHI8Tj46OlR5cGUoZGVyaXZlZCgpLCAwLCBzdGFydENvbCwgcm93cygpLCBOKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgbWlkZGxlQ29sczxpbnQ+KCkuKi8KK3RlbXBsYXRlPGludCBOPgoraW5saW5lIHR5cGVuYW1lIENvbnN0TkNvbHNCbG9ja1hwcjxOPjo6VHlwZSBtaWRkbGVDb2xzKEluZGV4IHN0YXJ0Q29sKSBjb25zdAoreworICByZXR1cm4gdHlwZW5hbWUgQ29uc3ROQ29sc0Jsb2NrWHByPE4+OjpUeXBlKGRlcml2ZWQoKSwgMCwgc3RhcnRDb2wsIHJvd3MoKSwgTik7Cit9CisKKworCisvKiogXHJldHVybnMgYSBmaXhlZC1zaXplIGV4cHJlc3Npb24gb2YgYSBibG9jayBpbiAqdGhpcy4KKyAgKgorICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIFxhIEJsb2NrUm93cyBhbmQgXGEgQmxvY2tDb2xzIGFyZSB0aGUgbnVtYmVyIG9mCisgICogcm93cyBhbmQgY29sdW1ucyBpbiB0aGUgYmxvY2suCisgICoKKyAgKiBccGFyYW0gc3RhcnRSb3cgdGhlIGZpcnN0IHJvdyBpbiB0aGUgYmxvY2sKKyAgKiBccGFyYW0gc3RhcnRDb2wgdGhlIGZpcnN0IGNvbHVtbiBpbiB0aGUgYmxvY2sKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfYmxvY2tfaW50X2ludC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2Jsb2NrX2ludF9pbnQub3V0CisgICoKKyAgKiBcbm90ZSBzaW5jZSBibG9jayBpcyBhIHRlbXBsYXRlZCBtZW1iZXIsIHRoZSBrZXl3b3JkIHRlbXBsYXRlIGhhcyB0byBiZSB1c2VkCisgICogaWYgdGhlIG1hdHJpeCB0eXBlIGlzIGFsc28gYSB0ZW1wbGF0ZSBwYXJhbWV0ZXI6IFxjb2RlIG0udGVtcGxhdGUgYmxvY2s8MywzPigxLDEpOyBcZW5kY29kZQorICAqCisgICogXHNhIGNsYXNzIEJsb2NrLCBibG9jayhJbmRleCxJbmRleCxJbmRleCxJbmRleCkKKyAgKi8KK3RlbXBsYXRlPGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHM+CitpbmxpbmUgQmxvY2s8RGVyaXZlZCwgQmxvY2tSb3dzLCBCbG9ja0NvbHM+IGJsb2NrKEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCkKK3sKKyAgcmV0dXJuIEJsb2NrPERlcml2ZWQsIEJsb2NrUm93cywgQmxvY2tDb2xzPihkZXJpdmVkKCksIHN0YXJ0Um93LCBzdGFydENvbCk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIGJsb2NrPD4oSW5kZXgsIEluZGV4KS4gKi8KK3RlbXBsYXRlPGludCBCbG9ja1Jvd3MsIGludCBCbG9ja0NvbHM+CitpbmxpbmUgY29uc3QgQmxvY2s8Y29uc3QgRGVyaXZlZCwgQmxvY2tSb3dzLCBCbG9ja0NvbHM+IGJsb2NrKEluZGV4IHN0YXJ0Um93LCBJbmRleCBzdGFydENvbCkgY29uc3QKK3sKKyAgcmV0dXJuIEJsb2NrPGNvbnN0IERlcml2ZWQsIEJsb2NrUm93cywgQmxvY2tDb2xzPihkZXJpdmVkKCksIHN0YXJ0Um93LCBzdGFydENvbCk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBcYSBpLXRoIGNvbHVtbiBvZiAqdGhpcy4gTm90ZSB0aGF0IHRoZSBudW1iZXJpbmcgc3RhcnRzIGF0IDAuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2NvbC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2NvbC5vdXQKKyAgKgorICAqIFxzYSByb3coKSwgY2xhc3MgQmxvY2sgKi8KK2lubGluZSBDb2xYcHIgY29sKEluZGV4IGkpCit7CisgIHJldHVybiBDb2xYcHIoZGVyaXZlZCgpLCBpKTsKK30KKworLyoqIFRoaXMgaXMgdGhlIGNvbnN0IHZlcnNpb24gb2YgY29sKCkuICovCitpbmxpbmUgQ29uc3RDb2xYcHIgY29sKEluZGV4IGkpIGNvbnN0Cit7CisgIHJldHVybiBDb25zdENvbFhwcihkZXJpdmVkKCksIGkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgXGEgaS10aCByb3cgb2YgKnRoaXMuIE5vdGUgdGhhdCB0aGUgbnVtYmVyaW5nIHN0YXJ0cyBhdCAwLgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9yb3cuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9yb3cub3V0CisgICoKKyAgKiBcc2EgY29sKCksIGNsYXNzIEJsb2NrICovCitpbmxpbmUgUm93WHByIHJvdyhJbmRleCBpKQoreworICByZXR1cm4gUm93WHByKGRlcml2ZWQoKSwgaSk7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBjb25zdCB2ZXJzaW9uIG9mIHJvdygpLiAqLworaW5saW5lIENvbnN0Um93WHByIHJvdyhJbmRleCBpKSBjb25zdAoreworICByZXR1cm4gQ29uc3RSb3dYcHIoZGVyaXZlZCgpLCBpKTsKK30KKworI2VuZGlmIC8vIEVJR0VOX0JMT0NLTUVUSE9EU19ICmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvcGx1Z2lucy9DTWFrZUxpc3RzLnR4dCBiL0VpZ2VuL3NyYy9wbHVnaW5zL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMWQzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvcGx1Z2lucy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9wbHVnaW5zX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9wbHVnaW5zX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vRWlnZW4vc3JjL3BsdWdpbnMgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9wbHVnaW5zL0NvbW1vbkN3aXNlQmluYXJ5T3BzLmggYi9FaWdlbi9zcmMvcGx1Z2lucy9Db21tb25Dd2lzZUJpbmFyeU9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OGQyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvcGx1Z2lucy9Db21tb25Dd2lzZUJpbmFyeU9wcy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8vIFRoaXMgZmlsZSBpcyBhIGJhc2UgY2xhc3MgcGx1Z2luIGNvbnRhaW5pbmcgY29tbW9uIGNvZWZmaWNpZW50IHdpc2UgZnVuY3Rpb25zLgorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZGlmZmVyZW5jZSBvZiBcYyAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFxub3RlIElmIHlvdSB3YW50IHRvIHN1YnN0cmFjdCBhIGdpdmVuIHNjYWxhciBmcm9tIGFsbCBjb2VmZmljaWVudHMsIHNlZSBDd2lzZTo6b3BlcmF0b3ItKCkuCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgb3BlcmF0b3ItPSgpCisgICovCitFSUdFTl9NQUtFX0NXSVNFX0JJTkFSWV9PUChvcGVyYXRvci0saW50ZXJuYWw6OnNjYWxhcl9kaWZmZXJlbmNlX29wKQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgc3VtIG9mIFxjICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogXG5vdGUgSWYgeW91IHdhbnQgdG8gYWRkIGEgZ2l2ZW4gc2NhbGFyIHRvIGFsbCBjb2VmZmljaWVudHMsIHNlZSBDd2lzZTo6b3BlcmF0b3IrKCkuCisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgb3BlcmF0b3IrPSgpCisgICovCitFSUdFTl9NQUtFX0NXSVNFX0JJTkFSWV9PUChvcGVyYXRvcissaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3ApCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgY3VzdG9tIGNvZWZmaWNpZW50LXdpc2Ugb3BlcmF0b3IgXGEgZnVuYyBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgQ3VzdG9tQmluYXJ5T3AgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0b3IKKyAgKiBvZiB0aGUgY3VzdG9tIG9wZXJhdG9yIChzZWUgY2xhc3MgQ3dpc2VCaW5hcnlPcCBmb3IgYW4gZXhhbXBsZSkKKyAgKgorICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBpbGx1c3RyYXRpbmcgdGhlIHVzZSBvZiBjdXN0b20gZnVuY3RvcnM6CisgICogXGluY2x1ZGUgY2xhc3NfQ3dpc2VCaW5hcnlPcC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBjbGFzc19Dd2lzZUJpbmFyeU9wLm91dAorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIG9wZXJhdG9yKygpLCBvcGVyYXRvci0oKSwgY3dpc2VQcm9kdWN0KCkKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbUJpbmFyeU9wLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8Q3VzdG9tQmluYXJ5T3AsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KK2JpbmFyeUV4cHIoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIsIGNvbnN0IEN1c3RvbUJpbmFyeU9wJiBmdW5jID0gQ3VzdG9tQmluYXJ5T3AoKSkgY29uc3QKK3sKKyAgcmV0dXJuIEN3aXNlQmluYXJ5T3A8Q3VzdG9tQmluYXJ5T3AsIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCksIGZ1bmMpOworfQorCmRpZmYgLS1naXQgYS9FaWdlbi9zcmMvcGx1Z2lucy9Db21tb25Dd2lzZVVuYXJ5T3BzLmggYi9FaWdlbi9zcmMvcGx1Z2lucy9Db21tb25Dd2lzZVVuYXJ5T3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlOTMxYQotLS0gL2Rldi9udWxsCisrKyBiL0VpZ2VuL3NyYy9wbHVnaW5zL0NvbW1vbkN3aXNlVW5hcnlPcHMuaApAQCAtMCwwICsxLDE3MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gVGhpcyBmaWxlIGlzIGEgYmFzZSBjbGFzcyBwbHVnaW4gY29udGFpbmluZyBjb21tb24gY29lZmZpY2llbnQgd2lzZSBmdW5jdGlvbnMuCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworLyoqIFxpbnRlcm5hbCBSZXByZXNlbnRzIGEgc2NhbGFyIG11bHRpcGxlIG9mIGFuIGV4cHJlc3Npb24gKi8KK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4gU2NhbGFyTXVsdGlwbGVSZXR1cm5UeXBlOworLyoqIFxpbnRlcm5hbCBSZXByZXNlbnRzIGEgcXVvdGllbnQgb2YgYW4gZXhwcmVzc2lvbiBieSBhIHNjYWxhciovCit0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50MV9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBTY2FsYXJRdW90aWVudDFSZXR1cm5UeXBlOworLyoqIFxpbnRlcm5hbCB0aGUgcmV0dXJuIHR5cGUgb2YgY29uanVnYXRlKCkgKi8KK3R5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVyaXZlZCYKKyAgICAgICAgICAgICAgICAgID46OnR5cGUgQ29uanVnYXRlUmV0dXJuVHlwZTsKKy8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIHJlYWwoKSBjb25zdCAqLwordHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8TnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcmVhbF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVyaXZlZCYKKyAgICAgICAgICAgICAgICAgID46OnR5cGUgUmVhbFJldHVyblR5cGU7CisvKiogXGludGVybmFsIHRoZSByZXR1cm4gdHlwZSBvZiByZWFsKCkgKi8KK3R5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgICAgICAgICAgIEN3aXNlVW5hcnlWaWV3PGludGVybmFsOjpzY2FsYXJfcmVhbF9yZWZfb3A8U2NhbGFyPiwgRGVyaXZlZD4sCisgICAgICAgICAgICAgICAgICAgIERlcml2ZWQmCisgICAgICAgICAgICAgICAgICA+Ojp0eXBlIE5vbkNvbnN0UmVhbFJldHVyblR5cGU7CisvKiogXGludGVybmFsIHRoZSByZXR1cm4gdHlwZSBvZiBpbWFnKCkgY29uc3QgKi8KK3R5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfaW1hZ19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPiBJbWFnUmV0dXJuVHlwZTsKKy8qKiBcaW50ZXJuYWwgdGhlIHJldHVybiB0eXBlIG9mIGltYWcoKSAqLwordHlwZWRlZiBDd2lzZVVuYXJ5VmlldzxpbnRlcm5hbDo6c2NhbGFyX2ltYWdfcmVmX29wPFNjYWxhcj4sIERlcml2ZWQ+IE5vbkNvbnN0SW1hZ1JldHVyblR5cGU7CisKKyNlbmRpZiAvLyBub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIG9wcG9zaXRlIG9mIFxjICp0aGlzCisgICovCitpbmxpbmUgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfb3Bwb3NpdGVfb3A8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KK29wZXJhdG9yLSgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKTsgfQorCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIFxjICp0aGlzIHNjYWxlZCBieSB0aGUgc2NhbGFyIGZhY3RvciBcYSBzY2FsYXIgKi8KK2lubGluZSBjb25zdCBTY2FsYXJNdWx0aXBsZVJldHVyblR5cGUKK29wZXJhdG9yKihjb25zdCBTY2FsYXImIHNjYWxhcikgY29uc3QKK3sKKyAgcmV0dXJuIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CisgICAgKGRlcml2ZWQoKSwgaW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+KHNjYWxhcikpOworfQorCisjaWZkZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KK2NvbnN0IFNjYWxhck11bHRpcGxlUmV0dXJuVHlwZSBvcGVyYXRvciooY29uc3QgUmVhbFNjYWxhciYgc2NhbGFyKSBjb25zdDsKKyNlbmRpZgorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiBcYyAqdGhpcyBkaXZpZGVkIGJ5IHRoZSBzY2FsYXIgdmFsdWUgXGEgc2NhbGFyICovCitpbmxpbmUgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfcXVvdGllbnQxX29wPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+CitvcGVyYXRvci8oY29uc3QgU2NhbGFyJiBzY2FsYXIpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudDFfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KKyAgICAoZGVyaXZlZCgpLCBpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50MV9vcDxTY2FsYXI+KHNjYWxhcikpOworfQorCisvKiogT3ZlcmxvYWRlZCBmb3IgZWZmaWNpZW50IHJlYWwgbWF0cml4IHRpbWVzIGNvbXBsZXggc2NhbGFyIHZhbHVlICovCitpbmxpbmUgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGUyX29wPFNjYWxhcixzdGQ6OmNvbXBsZXg8U2NhbGFyPiA+LCBjb25zdCBEZXJpdmVkPgorb3BlcmF0b3IqKGNvbnN0IHN0ZDo6Y29tcGxleDxTY2FsYXI+JiBzY2FsYXIpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZTJfb3A8U2NhbGFyLHN0ZDo6Y29tcGxleDxTY2FsYXI+ID4sIGNvbnN0IERlcml2ZWQ+CisgICAgKCpzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkKj4odGhpcyksIGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGUyX29wPFNjYWxhcixzdGQ6OmNvbXBsZXg8U2NhbGFyPiA+KHNjYWxhcikpOworfQorCitpbmxpbmUgZnJpZW5kIGNvbnN0IFNjYWxhck11bHRpcGxlUmV0dXJuVHlwZQorb3BlcmF0b3IqKGNvbnN0IFNjYWxhciYgc2NhbGFyLCBjb25zdCBTdG9yYWdlQmFzZVR5cGUmIG1hdHJpeCkKK3sgcmV0dXJuIG1hdHJpeCpzY2FsYXI7IH0KKworaW5saW5lIGZyaWVuZCBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZTJfb3A8U2NhbGFyLHN0ZDo6Y29tcGxleDxTY2FsYXI+ID4sIGNvbnN0IERlcml2ZWQ+CitvcGVyYXRvciooY29uc3Qgc3RkOjpjb21wbGV4PFNjYWxhcj4mIHNjYWxhciwgY29uc3QgU3RvcmFnZUJhc2VUeXBlJiBtYXRyaXgpCit7IHJldHVybiBtYXRyaXgqc2NhbGFyOyB9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mICp0aGlzIHdpdGggdGhlIFxhIFNjYWxhciB0eXBlIGNhc3RlZCB0bworICAqIFxhIE5ld1NjYWxhci4KKyAgKgorICAqIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgTmV3U2NhbGFyIGlzIHRoZSB0eXBlIHdlIGFyZSBjYXN0aW5nIHRoZSBzY2FsYXJzIHRvLgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgTmV3VHlwZT4KK3R5cGVuYW1lIGludGVybmFsOjpjYXN0X3JldHVybl90eXBlPERlcml2ZWQsY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfY2FzdF9vcDx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXIsIE5ld1R5cGU+LCBjb25zdCBEZXJpdmVkPiA+Ojp0eXBlCitjYXN0KCkgY29uc3QKK3sKKyAgcmV0dXJuIGRlcml2ZWQoKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGFkam9pbnQoKSAqLworaW5saW5lIENvbmp1Z2F0ZVJldHVyblR5cGUKK2Nvbmp1Z2F0ZSgpIGNvbnN0Cit7CisgIHJldHVybiBDb25qdWdhdGVSZXR1cm5UeXBlKGRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhIHJlYWQtb25seSBleHByZXNzaW9uIG9mIHRoZSByZWFsIHBhcnQgb2YgXGMgKnRoaXMuCisgICoKKyAgKiBcc2EgaW1hZygpICovCitpbmxpbmUgUmVhbFJldHVyblR5cGUKK3JlYWwoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCk7IH0KKworLyoqIFxyZXR1cm5zIGFuIHJlYWQtb25seSBleHByZXNzaW9uIG9mIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBcYyAqdGhpcy4KKyAgKgorICAqIFxzYSByZWFsKCkgKi8KK2lubGluZSBjb25zdCBJbWFnUmV0dXJuVHlwZQoraW1hZygpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKTsgfQorCisvKiogXGJyaWVmIEFwcGx5IGEgdW5hcnkgb3BlcmF0b3IgY29lZmZpY2llbnQtd2lzZQorICAqIFxwYXJhbVtpbl0gIGZ1bmMgIEZ1bmN0b3IgaW1wbGVtZW50aW5nIHRoZSB1bmFyeSBvcGVyYXRvcgorICAqIFx0cGFyYW0gIEN1c3RvbVVuYXJ5T3AgVHlwZSBvZiBcYSBmdW5jICAKKyAgKiBccmV0dXJucyBBbiBleHByZXNzaW9uIG9mIGEgY3VzdG9tIGNvZWZmaWNpZW50LXdpc2UgdW5hcnkgb3BlcmF0b3IgXGEgZnVuYyBvZiAqdGhpcworICAqCisgICogVGhlIGZ1bmN0aW9uIFxjIHB0cl9mdW4oKSBmcm9tIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSBjYW4gYmUgdXNlZCB0byBtYWtlIGZ1bmN0b3JzIG91dCBvZiBub3JtYWwgZnVuY3Rpb25zLgorICAqCisgICogRXhhbXBsZToKKyAgKiBcaW5jbHVkZSBjbGFzc19Dd2lzZVVuYXJ5T3BfcHRyZnVuLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX0N3aXNlVW5hcnlPcF9wdHJmdW4ub3V0CisgICoKKyAgKiBHZW51aW5lIGZ1bmN0b3JzIGFsbG93IGZvciBtb3JlIHBvc3NpYmlsaXRpZXMsIGZvciBpbnN0YW5jZSBpdCBtYXkgY29udGFpbiBhIHN0YXRlLgorICAqCisgICogRXhhbXBsZToKKyAgKiBcaW5jbHVkZSBjbGFzc19Dd2lzZVVuYXJ5T3AuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgY2xhc3NfQ3dpc2VVbmFyeU9wLm91dAorICAqCisgICogXHNhIGNsYXNzIEN3aXNlVW5hcnlPcCwgY2xhc3MgQ3dpc2VCaW5hcnlPcAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgQ3VzdG9tVW5hcnlPcD4KK2lubGluZSBjb25zdCBDd2lzZVVuYXJ5T3A8Q3VzdG9tVW5hcnlPcCwgY29uc3QgRGVyaXZlZD4KK3VuYXJ5RXhwcihjb25zdCBDdXN0b21VbmFyeU9wJiBmdW5jID0gQ3VzdG9tVW5hcnlPcCgpKSBjb25zdAoreworICByZXR1cm4gQ3dpc2VVbmFyeU9wPEN1c3RvbVVuYXJ5T3AsIGNvbnN0IERlcml2ZWQ+KGRlcml2ZWQoKSwgZnVuYyk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIGEgY3VzdG9tIGNvZWZmaWNpZW50LXdpc2UgdW5hcnkgb3BlcmF0b3IgXGEgZnVuYyBvZiAqdGhpcworICAqCisgICogVGhlIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBDdXN0b21VbmFyeU9wIGlzIHRoZSB0eXBlIG9mIHRoZSBmdW5jdG9yCisgICogb2YgdGhlIGN1c3RvbSB1bmFyeSBvcGVyYXRvci4KKyAgKgorICAqIEV4YW1wbGU6CisgICogXGluY2x1ZGUgY2xhc3NfQ3dpc2VVbmFyeU9wLmNwcAorICAqIE91dHB1dDogXHZlcmJpbmNsdWRlIGNsYXNzX0N3aXNlVW5hcnlPcC5vdXQKKyAgKgorICAqIFxzYSBjbGFzcyBDd2lzZVVuYXJ5T3AsIGNsYXNzIEN3aXNlQmluYXJ5T3AKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEN1c3RvbVZpZXdPcD4KK2lubGluZSBjb25zdCBDd2lzZVVuYXJ5VmlldzxDdXN0b21WaWV3T3AsIGNvbnN0IERlcml2ZWQ+Cit1bmFyeVZpZXdFeHByKGNvbnN0IEN1c3RvbVZpZXdPcCYgZnVuYyA9IEN1c3RvbVZpZXdPcCgpKSBjb25zdAoreworICByZXR1cm4gQ3dpc2VVbmFyeVZpZXc8Q3VzdG9tVmlld09wLCBjb25zdCBEZXJpdmVkPihkZXJpdmVkKCksIGZ1bmMpOworfQorCisvKiogXHJldHVybnMgYSBub24gY29uc3QgZXhwcmVzc2lvbiBvZiB0aGUgcmVhbCBwYXJ0IG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIGltYWcoKSAqLworaW5saW5lIE5vbkNvbnN0UmVhbFJldHVyblR5cGUKK3JlYWwoKSB7IHJldHVybiBkZXJpdmVkKCk7IH0KKworLyoqIFxyZXR1cm5zIGEgbm9uIGNvbnN0IGV4cHJlc3Npb24gb2YgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIFxjICp0aGlzLgorICAqCisgICogXHNhIHJlYWwoKSAqLworaW5saW5lIE5vbkNvbnN0SW1hZ1JldHVyblR5cGUKK2ltYWcoKSB7IHJldHVybiBkZXJpdmVkKCk7IH0KZGlmZiAtLWdpdCBhL0VpZ2VuL3NyYy9wbHVnaW5zL01hdHJpeEN3aXNlQmluYXJ5T3BzLmggYi9FaWdlbi9zcmMvcGx1Z2lucy9NYXRyaXhDd2lzZUJpbmFyeU9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzM3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvcGx1Z2lucy9NYXRyaXhDd2lzZUJpbmFyeU9wcy5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBUaGlzIGZpbGUgaXMgYSBiYXNlIGNsYXNzIHBsdWdpbiBjb250YWluaW5nIG1hdHJpeCBzcGVjaWZpY3MgY29lZmZpY2llbnQgd2lzZSBmdW5jdGlvbnMuCisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBTY2h1ciBwcm9kdWN0IChjb2VmZmljaWVudCB3aXNlIHByb2R1Y3QpIG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZVByb2R1Y3QuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZVByb2R1Y3Qub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgY3dpc2VBYnMyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEVJR0VOX0NXSVNFX1BST0RVQ1RfUkVUVVJOX1RZUEUoRGVyaXZlZCxPdGhlckRlcml2ZWQpCitjd2lzZVByb2R1Y3QoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBFSUdFTl9DV0lTRV9QUk9EVUNUX1JFVFVSTl9UWVBFKERlcml2ZWQsT3RoZXJEZXJpdmVkKShkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlID09IG9wZXJhdG9yIG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogXHdhcm5pbmcgdGhpcyBwZXJmb3JtcyBhbiBleGFjdCBjb21wYXJpc29uLCB3aGljaCBpcyBnZW5lcmFsbHkgYSBiYWQgaWRlYSB3aXRoIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorICAqIEluIG9yZGVyIHRvIGNoZWNrIGZvciBlcXVhbGl0eSBiZXR3ZWVuIHR3byB2ZWN0b3JzIG9yIG1hdHJpY2VzIHdpdGggZmxvYXRpbmctcG9pbnQgY29lZmZpY2llbnRzLCBpdCBpcworICAqIGdlbmVyYWxseSBhIGZhciBiZXR0ZXIgaWRlYSB0byB1c2UgYSBmdXp6eSBjb21wYXJpc29uIGFzIHByb3ZpZGVkIGJ5IGlzQXBwcm94KCkgYW5kCisgICogaXNNdWNoU21hbGxlclRoYW4oKS4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfY3dpc2VFcXVhbC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlRXF1YWwub3V0CisgICoKKyAgKiBcc2EgY3dpc2VOb3RFcXVhbCgpLCBpc0FwcHJveCgpLCBpc011Y2hTbWFsbGVyVGhhbigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgY29uc3QgQ3dpc2VCaW5hcnlPcDxzdGQ6OmVxdWFsX3RvPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4KK2N3aXNlRXF1YWwoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZUJpbmFyeU9wPHN0ZDo6ZXF1YWxfdG88U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPihkZXJpdmVkKCksIG90aGVyLmRlcml2ZWQoKSk7Cit9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlICE9IG9wZXJhdG9yIG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogXHdhcm5pbmcgdGhpcyBwZXJmb3JtcyBhbiBleGFjdCBjb21wYXJpc29uLCB3aGljaCBpcyBnZW5lcmFsbHkgYSBiYWQgaWRlYSB3aXRoIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorICAqIEluIG9yZGVyIHRvIGNoZWNrIGZvciBlcXVhbGl0eSBiZXR3ZWVuIHR3byB2ZWN0b3JzIG9yIG1hdHJpY2VzIHdpdGggZmxvYXRpbmctcG9pbnQgY29lZmZpY2llbnRzLCBpdCBpcworICAqIGdlbmVyYWxseSBhIGZhciBiZXR0ZXIgaWRlYSB0byB1c2UgYSBmdXp6eSBjb21wYXJpc29uIGFzIHByb3ZpZGVkIGJ5IGlzQXBwcm94KCkgYW5kCisgICogaXNNdWNoU21hbGxlclRoYW4oKS4KKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfY3dpc2VOb3RFcXVhbC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlTm90RXF1YWwub3V0CisgICoKKyAgKiBcc2EgY3dpc2VFcXVhbCgpLCBpc0FwcHJveCgpLCBpc011Y2hTbWFsbGVyVGhhbigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgY29uc3QgQ3dpc2VCaW5hcnlPcDxzdGQ6Om5vdF9lcXVhbF90bzxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+Citjd2lzZU5vdEVxdWFsKGNvbnN0IEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxzdGQ6Om5vdF9lcXVhbF90bzxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+KGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgbWluIG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZU1pbi5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlTWluLm91dAorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIG1heCgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9taW5fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorY3dpc2VNaW4oY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbWluX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBtaW4gb2YgKnRoaXMgYW5kIHNjYWxhciBcYSBvdGhlcgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIG1pbigpCisgICovCitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9taW5fb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlPgorY3dpc2VNaW4oY29uc3QgU2NhbGFyICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIGN3aXNlTWluKERlcml2ZWQ6OlBsYWluT2JqZWN0OjpDb25zdGFudChyb3dzKCksIGNvbHMoKSwgb3RoZXIpKTsKK30KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2UgbWF4IG9mICp0aGlzIGFuZCBcYSBvdGhlcgorICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZU1heC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlTWF4Lm91dAorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIG1pbigpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tYXhfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgT3RoZXJEZXJpdmVkPgorY3dpc2VNYXgoY29uc3QgRUlHRU5fQ1VSUkVOVF9TVE9SQUdFX0JBU0VfQ0xBU1M8T3RoZXJEZXJpdmVkPiAmb3RoZXIpIGNvbnN0Cit7CisgIHJldHVybiBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbWF4X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBtYXggb2YgKnRoaXMgYW5kIHNjYWxhciBcYSBvdGhlcgorICAqCisgICogXHNhIGNsYXNzIEN3aXNlQmluYXJ5T3AsIG1pbigpCisgICovCitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tYXhfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZCwgY29uc3QgQ29uc3RhbnRSZXR1cm5UeXBlPgorY3dpc2VNYXgoY29uc3QgU2NhbGFyICZvdGhlcikgY29uc3QKK3sKKyAgcmV0dXJuIGN3aXNlTWF4KERlcml2ZWQ6OlBsYWluT2JqZWN0OjpDb25zdGFudChyb3dzKCksIGNvbHMoKSwgb3RoZXIpKTsKK30KKworCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBxdW90aWVudCBvZiAqdGhpcyBhbmQgXGEgb3RoZXIKKyAgKgorICAqIEV4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeEJhc2VfY3dpc2VRdW90aWVudC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlUXVvdGllbnQub3V0CisgICoKKyAgKiBcc2EgY2xhc3MgQ3dpc2VCaW5hcnlPcCwgY3dpc2VQcm9kdWN0KCksIGN3aXNlSW52ZXJzZSgpCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9xdW90aWVudF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkLCBjb25zdCBPdGhlckRlcml2ZWQ+Citjd2lzZVF1b3RpZW50KGNvbnN0IEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdAoreworICByZXR1cm4gQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3F1b3RpZW50X29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQsIGNvbnN0IE90aGVyRGVyaXZlZD4oZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQpkaWZmIC0tZ2l0IGEvRWlnZW4vc3JjL3BsdWdpbnMvTWF0cml4Q3dpc2VVbmFyeU9wcy5oIGIvRWlnZW4vc3JjL3BsdWdpbnMvTWF0cml4Q3dpc2VVbmFyeU9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjA2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9FaWdlbi9zcmMvcGx1Z2lucy9NYXRyaXhDd2lzZVVuYXJ5T3BzLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gVGhpcyBmaWxlIGlzIGEgYmFzZSBjbGFzcyBwbHVnaW4gY29udGFpbmluZyBtYXRyaXggc3BlY2lmaWNzIGNvZWZmaWNpZW50IHdpc2UgZnVuY3Rpb25zLgorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSBhYnNvbHV0ZSB2YWx1ZSBvZiBcYyAqdGhpcworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZUFicy5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlQWJzLm91dAorICAqCisgICogXHNhIGN3aXNlQWJzMigpCisgICovCitFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Fic19vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorY3dpc2VBYnMoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCk7IH0KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2Ugc3F1YXJlZCBhYnNvbHV0ZSB2YWx1ZSBvZiBcYyAqdGhpcworICAqCisgICogRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZUFiczIuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4QmFzZV9jd2lzZUFiczIub3V0CisgICoKKyAgKiBcc2EgY3dpc2VBYnMoKQorICAqLworRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9hYnMyX29wPFNjYWxhcj4sIGNvbnN0IERlcml2ZWQ+Citjd2lzZUFiczIoKSBjb25zdCB7IHJldHVybiBkZXJpdmVkKCk7IH0KKworLyoqIFxyZXR1cm5zIGFuIGV4cHJlc3Npb24gb2YgdGhlIGNvZWZmaWNpZW50LXdpc2Ugc3F1YXJlIHJvb3Qgb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlU3FydC5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlU3FydC5vdXQKKyAgKgorICAqIFxzYSBjd2lzZVBvdygpLCBjd2lzZVNxdWFyZSgpCisgICovCitpbmxpbmUgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3FydF9vcDxTY2FsYXI+LCBjb25zdCBEZXJpdmVkPgorY3dpc2VTcXJ0KCkgY29uc3QgeyByZXR1cm4gZGVyaXZlZCgpOyB9CisKKy8qKiBccmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBjb2VmZmljaWVudC13aXNlIGludmVyc2Ugb2YgKnRoaXMuCisgICoKKyAgKiBFeGFtcGxlOiBcaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlSW52ZXJzZS5jcHAKKyAgKiBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhCYXNlX2N3aXNlSW52ZXJzZS5vdXQKKyAgKgorICAqIFxzYSBjd2lzZVByb2R1Y3QoKQorICAqLworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2ludmVyc2Vfb3A8U2NhbGFyPiwgY29uc3QgRGVyaXZlZD4KK2N3aXNlSW52ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIGRlcml2ZWQoKTsgfQorCisvKiogXHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgY29lZmZpY2llbnQtd2lzZSA9PSBvcGVyYXRvciBvZiBcYyAqdGhpcyBhbmQgYSBzY2FsYXIgXGEgcworICAqCisgICogXHdhcm5pbmcgdGhpcyBwZXJmb3JtcyBhbiBleGFjdCBjb21wYXJpc29uLCB3aGljaCBpcyBnZW5lcmFsbHkgYSBiYWQgaWRlYSB3aXRoIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorICAqIEluIG9yZGVyIHRvIGNoZWNrIGZvciBlcXVhbGl0eSBiZXR3ZWVuIHR3byB2ZWN0b3JzIG9yIG1hdHJpY2VzIHdpdGggZmxvYXRpbmctcG9pbnQgY29lZmZpY2llbnRzLCBpdCBpcworICAqIGdlbmVyYWxseSBhIGZhciBiZXR0ZXIgaWRlYSB0byB1c2UgYSBmdXp6eSBjb21wYXJpc29uIGFzIHByb3ZpZGVkIGJ5IGlzQXBwcm94KCkgYW5kCisgICogaXNNdWNoU21hbGxlclRoYW4oKS4KKyAgKgorICAqIFxzYSBjd2lzZUVxdWFsKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiAmKSBjb25zdAorICAqLworaW5saW5lIGNvbnN0IEN3aXNlVW5hcnlPcDxzdGQ6OmJpbmRlcjFzdDxzdGQ6OmVxdWFsX3RvPFNjYWxhcj4gPiwgY29uc3QgRGVyaXZlZD4KK2N3aXNlRXF1YWwoY29uc3QgU2NhbGFyJiBzKSBjb25zdAoreworICByZXR1cm4gQ3dpc2VVbmFyeU9wPHN0ZDo6YmluZGVyMXN0PHN0ZDo6ZXF1YWxfdG88U2NhbGFyPiA+LGNvbnN0IERlcml2ZWQ+CisgICAgICAgICAgKGRlcml2ZWQoKSwgc3RkOjpiaW5kMXN0KHN0ZDo6ZXF1YWxfdG88U2NhbGFyPigpLCBzKSk7Cit9CmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjcxN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDM1IEBACitJbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciBFaWdlbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworRXhwbGFuYXRpb24gYmVmb3JlIHN0YXJ0aW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworRWlnZW4gY29uc2lzdHMgb25seSBvZiBoZWFkZXIgZmlsZXMsIGhlbmNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGlsZQorYmVmb3JlIHlvdSBjYW4gdXNlIGl0LiBNb3Jlb3ZlciwgdGhlc2UgaGVhZGVyIGZpbGVzIGRvIG5vdCBkZXBlbmQgb24geW91cgorcGxhdGZvcm0sIHRoZXkgYXJlIHRoZSBzYW1lIGZvciBldmVyeWJvZHkuCisKK01ldGhvZCAxLiBJbnN0YWxsaW5nIHdpdGhvdXQgdXNpbmcgQ01ha2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworWW91IGNhbiB1c2UgcmlnaHQgYXdheSB0aGUgaGVhZGVycyBpbiB0aGUgRWlnZW4vIHN1YmRpcmVjdG9yeS4gSW4gb3JkZXIKK3RvIGluc3RhbGwsIGp1c3QgY29weSB0aGlzIEVpZ2VuLyBzdWJkaXJlY3RvcnkgdG8geW91ciBmYXZvcml0ZSBsb2NhdGlvbi4KK0lmIHlvdSBhbHNvIHdhbnQgdGhlIHVuc3VwcG9ydGVkIGZlYXR1cmVzLCBjb3B5IHRoZSB1bnN1cHBvcnRlZC8KK3N1YmRpcmVjdG9yeSB0b28uCisKK01ldGhvZCAyLiBJbnN0YWxsaW5nIHVzaW5nIENNYWtlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitMZXQncyBjYWxsIHRoaXMgZGlyZWN0b3J5ICdzb3VyY2VfZGlyJyAod2hlcmUgdGhpcyBJTlNUQUxMIGZpbGUgaXMpLgorQmVmb3JlIHN0YXJ0aW5nLCBjcmVhdGUgYW5vdGhlciBkaXJlY3Rvcnkgd2hpY2ggd2Ugd2lsbCBjYWxsICdidWlsZF9kaXInLgorCitEbzoKKworICBjZCBidWlsZF9kaXIKKyAgY21ha2Ugc291cmNlX2RpcgorICBtYWtlIGluc3RhbGwKKworVGhlICJtYWtlIGluc3RhbGwiIHN0ZXAgbWF5IHJlcXVpcmUgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLgorCitZb3UgY2FuIGFkanVzdCB0aGUgaW5zdGFsbGF0aW9uIGRlc3RpbmF0aW9uICh0aGUgInByZWZpeCIpCitieSBwYXNzaW5nIHRoZSAtRENNQUtFX0lOU1RBTExfUFJFRklYPW15cHJlZml4IG9wdGlvbiB0byBjbWFrZSwgYXMgaXMKK2V4cGxhaW5lZCBpbiB0aGUgbWVzc2FnZSB0aGF0IGNtYWtlIHByaW50cyBhdCB0aGUgZW5kLgpkaWZmIC0tZ2l0IGEvTU9EVUxFX0xJQ0VOU0VfTVBMMiBiL01PRFVMRV9MSUNFTlNFX01QTDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL01PRFVMRV9MSUNFTlNFX01QTDIKZGlmZiAtLWdpdCBhL1JFQURNRS5hbmRyb2lkIGIvUkVBRE1FLmFuZHJvaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxMGExYQotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS5hbmRyb2lkCkBAIC0wLDAgKzEsMTMgQEAKK0VpZ2VuIDMuMS4xCistLS0tLS0tLS0tLQorCitFaWdlbiBpcyBhIEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5IGZvciBsaW5lYXIgYWxnZWJyYTogbWF0cmljZXMsIHZlY3RvcnMsCitudW1lcmljYWwgc29sdmVycywgYW5kIHJlbGF0ZWQgYWxnb3JpdGhtcy4KKworV2Vic2l0ZTogaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvCisKK3YzLjEuMS4gUmVsZWFzZWQgb24gSnVseSAyMiwgMjAxMi4gVGhpcyBpcyBhIGNvcHkgb2YgdGhlIHNvdXJjZQorZGlzdHJpYnV0aW9uIGZyb20gaHR0cDovL2JpdGJ1Y2tldC5vcmcvZWlnZW4vZWlnZW4vZ2V0LzMuMS4xLnRhci5nei4KKworTm9uIE1QTDIgbGljZW5zZSBjb2RlIGlzIGRpc2FibGVkLiBUcnlpbmcgdG8gaW5jbHVkZSBzdWNoIGZpbGVzIHdpbGwKK2xlYWQgdG8gYW4gZXJyb3IuIFNlZSAuL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTm9uTVBMMi5oIGZvciBkZXRhaWxzLgpkaWZmIC0tZ2l0IGEvYmVuY2gvQmVuY2hTcGFyc2VVdGlsLmggYi9iZW5jaC9CZW5jaFNwYXJzZVV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk4MWY2Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvQmVuY2hTcGFyc2VVdGlsLmgKQEAgLTAsMCArMSwxNDkgQEAKKworI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFRpbWVyLmg+CisjaW5jbHVkZSA8c2V0PgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCisjaWZuZGVmIFNJWkUKKyNkZWZpbmUgU0laRSAxMDI0CisjZW5kaWYKKworI2lmbmRlZiBERU5TSVRZCisjZGVmaW5lIERFTlNJVFkgMC4wMQorI2VuZGlmCisKKyNpZm5kZWYgU0NBTEFSCisjZGVmaW5lIFNDQUxBUiBkb3VibGUKKyNlbmRpZgorCit0eXBlZGVmIFNDQUxBUiBTY2FsYXI7Cit0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKK3R5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IERlbnNlVmVjdG9yOwordHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyPiBFaWdlblNwYXJzZU1hdHJpeDsKKwordm9pZCBmaWxsTWF0cml4KGZsb2F0IGRlbnNpdHksIGludCByb3dzLCBpbnQgY29scywgIEVpZ2VuU3BhcnNlTWF0cml4JiBkc3QpCit7CisgIGRzdC5yZXNlcnZlKGRvdWJsZShyb3dzKSpjb2xzKmRlbnNpdHkpOworICBmb3IoaW50IGogPSAwOyBqIDwgY29sczsgaisrKQorICB7CisgICAgZm9yKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykKKyAgICB7CisgICAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLDEpIDwgZGVuc2l0eSkgPyBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSA6IDA7CisgICAgICBpZiAodiE9MCkKKyAgICAgICAgZHN0Lmluc2VydChpLGopID0gdjsKKyAgICB9CisgIH0KKyAgZHN0LmZpbmFsaXplKCk7Cit9CisKK3ZvaWQgZmlsbE1hdHJpeDIoaW50IG5uelBlckNvbCwgaW50IHJvd3MsIGludCBjb2xzLCAgRWlnZW5TcGFyc2VNYXRyaXgmIGRzdCkKK3sKKy8vICAgc3RkOjpjb3V0IDw8ICJhbGxvYyAiIDw8IG5uelBlckNvbCpjb2xzIDw8ICJcbiI7CisgIGRzdC5yZXNlcnZlKG5uelBlckNvbCpjb2xzKTsKKyAgZm9yKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykKKyAgeworICAgIHN0ZDo6c2V0PGludD4gYXV4OworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBubnpQZXJDb2w7IGkrKykKKyAgICB7CisgICAgICBpbnQgayA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSk7CisgICAgICB3aGlsZSAoYXV4LmZpbmQoaykhPWF1eC5lbmQoKSkKKyAgICAgICAgayA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSk7CisgICAgICBhdXguaW5zZXJ0KGspOworCisgICAgICBkc3QuaW5zZXJ0KGssaikgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICB9CisgIH0KKyAgZHN0LmZpbmFsaXplKCk7Cit9CisKK3ZvaWQgZWlUb0RlbnNlKGNvbnN0IEVpZ2VuU3BhcnNlTWF0cml4JiBzcmMsIERlbnNlTWF0cml4JiBkc3QpCit7CisgIGRzdC5zZXRaZXJvKCk7CisgIGZvciAoaW50IGo9MDsgajxzcmMuY29scygpOyArK2opCisgICAgZm9yIChFaWdlblNwYXJzZU1hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChzcmMuZGVyaXZlZCgpLCBqKTsgaXQ7ICsraXQpCisgICAgICBkc3QoaXQuaW5kZXgoKSxqKSA9IGl0LnZhbHVlKCk7Cit9CisKKyNpZm5kZWYgTk9HTU0KKyNpbmNsdWRlICJnbW0vZ21tLmgiCit0eXBlZGVmIGdtbTo6Y3NjX21hdHJpeDxTY2FsYXI+IEdtbVNwYXJzZTsKK3R5cGVkZWYgZ21tOjpjb2xfbWF0cml4PCBnbW06OndzdmVjdG9yPFNjYWxhcj4gPiBHbW1EeW5TcGFyc2U7Cit2b2lkIGVpVG9HbW0oY29uc3QgRWlnZW5TcGFyc2VNYXRyaXgmIHNyYywgR21tU3BhcnNlJiBkc3QpCit7CisgIEdtbUR5blNwYXJzZSB0bXAoc3JjLnJvd3MoKSwgc3JjLmNvbHMoKSk7CisgIGZvciAoaW50IGo9MDsgajxzcmMuY29scygpOyArK2opCisgICAgZm9yIChFaWdlblNwYXJzZU1hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChzcmMuZGVyaXZlZCgpLCBqKTsgaXQ7ICsraXQpCisgICAgICB0bXAoaXQuaW5kZXgoKSxqKSA9IGl0LnZhbHVlKCk7CisgIGdtbTo6Y29weSh0bXAsIGRzdCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBOT01UTAorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvbXRsL210bC5ocHA+Cit0eXBlZGVmIG10bDo6Y29tcHJlc3NlZDJEPFNjYWxhciwgbXRsOjptYXRyaXg6OnBhcmFtZXRlcnM8bXRsOjp0YWc6OmNvbF9tYWpvcj4gPiBNdGxTcGFyc2U7Cit0eXBlZGVmIG10bDo6Y29tcHJlc3NlZDJEPFNjYWxhciwgbXRsOjptYXRyaXg6OnBhcmFtZXRlcnM8bXRsOjp0YWc6OnJvd19tYWpvcj4gPiBNdGxTcGFyc2VSb3dNYWpvcjsKK3ZvaWQgZWlUb010bChjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc3JjLCBNdGxTcGFyc2UmIGRzdCkKK3sKKyAgbXRsOjptYXRyaXg6Omluc2VydGVyPE10bFNwYXJzZT4gaW5zKGRzdCk7CisgIGZvciAoaW50IGo9MDsgajxzcmMuY29scygpOyArK2opCisgICAgZm9yIChFaWdlblNwYXJzZU1hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChzcmMuZGVyaXZlZCgpLCBqKTsgaXQ7ICsraXQpCisgICAgICBpbnNbaXQuaW5kZXgoKV1bal0gPSBpdC52YWx1ZSgpOworfQorI2VuZGlmCisKKyNpZmRlZiBDU1BBUlNFCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJjcy5oIgorfQordm9pZCBlaVRvQ1NwYXJzZShjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc3JjLCBjcyogJmRzdCkKK3sKKyAgY3MqIGF1eCA9IGNzX3NwYWxsb2MgKDAsIDAsIDEsIDEsIDEpOworICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQorICAgIGZvciAoRWlnZW5TcGFyc2VNYXRyaXg6OklubmVySXRlcmF0b3IgaXQoc3JjLmRlcml2ZWQoKSwgaik7IGl0OyArK2l0KQorICAgICAgaWYgKCFjc19lbnRyeShhdXgsIGl0LmluZGV4KCksIGosIGl0LnZhbHVlKCkpKQorICAgICAgeworICAgICAgICBzdGQ6OmNvdXQgPDwgImNzX2VudHJ5IGVycm9yXG4iOworICAgICAgICBleGl0KDIpOworICAgICAgfQorICAgZHN0ID0gY3NfY29tcHJlc3MoYXV4KTsKKy8vICAgIGNzX3NwZnJlZShhdXgpOworfQorI2VuZGlmIC8vIENTUEFSU0UKKworI2lmbmRlZiBOT1VCTEFTCisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy92ZWN0b3IuaHBwPgorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvbWF0cml4LmhwcD4KKyNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL2lvLmhwcD4KKyNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL3RyaWFuZ3VsYXIuaHBwPgorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvdmVjdG9yX3NwYXJzZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy9tYXRyaXhfc3BhcnNlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL3ZlY3Rvcl9vZl92ZWN0b3IuaHBwPgorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvb3BlcmF0aW9uLmhwcD4KKwordHlwZWRlZiBib29zdDo6bnVtZXJpYzo6dWJsYXM6OmNvbXByZXNzZWRfbWF0cml4PFNjYWxhcixib29zdDo6bnVtZXJpYzo6dWJsYXM6OmNvbHVtbl9tYWpvcj4gVUJsYXNTcGFyc2U7CisKK3ZvaWQgZWlUb1VibGFzKGNvbnN0IEVpZ2VuU3BhcnNlTWF0cml4JiBzcmMsIFVCbGFzU3BhcnNlJiBkc3QpCit7CisgIGRzdC5yZXNpemUoc3JjLnJvd3MoKSwgc3JjLmNvbHMoKSwgZmFsc2UpOworICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQorICAgIGZvciAoRWlnZW5TcGFyc2VNYXRyaXg6OklubmVySXRlcmF0b3IgaXQoc3JjLmRlcml2ZWQoKSwgaik7IGl0OyArK2l0KQorICAgICAgZHN0KGl0LmluZGV4KCksaikgPSBpdC52YWx1ZSgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWlnZW5UeXBlLCB0eXBlbmFtZSBVYmxhc1R5cGU+Cit2b2lkIGVpVG9VYmxhc1ZlYyhjb25zdCBFaWdlblR5cGUmIHNyYywgVWJsYXNUeXBlJiBkc3QpCit7CisgIGRzdC5yZXNpemUoc3JjLnNpemUoKSk7CisgIGZvciAoaW50IGo9MDsgajxzcmMuc2l6ZSgpOyArK2opCisgICAgICBkc3Rbal0gPSBzcmMuY29lZmYoaik7Cit9CisjZW5kaWYKKworI2lmZGVmIE9TS0kKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPG9za2kvb3NraS5oPgorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9CZW5jaFRpbWVyLmggYi9iZW5jaC9CZW5jaFRpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlMmJjYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL0JlbmNoVGltZXIuaApAQCAtMCwwICsxLDE4NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQkVOQ0hfVElNRVJSX0gKKyNkZWZpbmUgRUlHRU5fQkVOQ0hfVElNRVJSX0gKKworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGlmbmRlZiBOT01JTk1BWAorIyAgIGRlZmluZSBOT01JTk1BWAorIyAgIGRlZmluZSBFSUdFTl9CVF9VTkRFRl9OT01JTk1BWAorIyBlbmRpZgorIyBpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICAgZGVmaW5lIEVJR0VOX0JUX1VOREVGX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisjaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKworbmFtZXNwYWNlIEVpZ2VuCit7CisKK2VudW0geworICBDUFVfVElNRVIgPSAwLAorICBSRUFMX1RJTUVSID0gMQorfTsKKworLyoqIEVsYXBzZWQgdGltZSB0aW1lciBrZWVwaW5nIHRoZSBiZXN0IHRyeS4KKyAgKgorICAqIE9uIFBPU0lYIHBsYXRmb3JtcyB3ZSB1c2UgY2xvY2tfZ2V0dGltZSB3aXRoIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRC4KKyAgKiBPbiBXaW5kb3dzIHdlIHVzZSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgorICAqCisgICogSW1wb3J0YW50OiBvbiBsaW51eCwgeW91IG11c3QgbGluayB3aXRoIC1scnQKKyAgKi8KK2NsYXNzIEJlbmNoVGltZXIKK3sKK3B1YmxpYzoKKworICBCZW5jaFRpbWVyKCkKKyAgeworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgICAgTEFSR0VfSU5URUdFUiBmcmVxOworICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXEpOworICAgIG1fZnJlcXVlbmN5ID0gKGRvdWJsZSlmcmVxLlF1YWRQYXJ0OworI2VuZGlmCisgICAgcmVzZXQoKTsKKyAgfQorCisgIH5CZW5jaFRpbWVyKCkge30KKworICBpbmxpbmUgdm9pZCByZXNldCgpCisgIHsKKyAgICBtX2Jlc3RzLmZpbGwoMWU5KTsKKyAgICBtX3dvcnN0cy5maWxsKDApOworICAgIG1fdG90YWxzLnNldFplcm8oKTsKKyAgfQorICBpbmxpbmUgdm9pZCBzdGFydCgpCisgIHsKKyAgICBtX3N0YXJ0c1tDUFVfVElNRVJdICA9IGdldENwdVRpbWUoKTsKKyAgICBtX3N0YXJ0c1tSRUFMX1RJTUVSXSA9IGdldFJlYWxUaW1lKCk7CisgIH0KKyAgaW5saW5lIHZvaWQgc3RvcCgpCisgIHsKKyAgICBtX3RpbWVzW0NQVV9USU1FUl0gPSBnZXRDcHVUaW1lKCkgLSBtX3N0YXJ0c1tDUFVfVElNRVJdOworICAgIG1fdGltZXNbUkVBTF9USU1FUl0gPSBnZXRSZWFsVGltZSgpIC0gbV9zdGFydHNbUkVBTF9USU1FUl07CisgICAgI2lmIEVJR0VOX1ZFUlNJT05fQVRfTEVBU1QoMiw5MCwwKQorICAgIG1fYmVzdHMgPSBtX2Jlc3RzLmN3aXNlTWluKG1fdGltZXMpOworICAgIG1fd29yc3RzID0gbV93b3JzdHMuY3dpc2VNYXgobV90aW1lcyk7CisgICAgI2Vsc2UKKyAgICBtX2Jlc3RzKDApID0gc3RkOjptaW4obV9iZXN0cygwKSxtX3RpbWVzKDApKTsKKyAgICBtX2Jlc3RzKDEpID0gc3RkOjptaW4obV9iZXN0cygxKSxtX3RpbWVzKDEpKTsKKyAgICBtX3dvcnN0cygwKSA9IHN0ZDo6bWF4KG1fd29yc3RzKDApLG1fdGltZXMoMCkpOworICAgIG1fd29yc3RzKDEpID0gc3RkOjptYXgobV93b3JzdHMoMSksbV90aW1lcygxKSk7CisgICAgI2VuZGlmCisgICAgbV90b3RhbHMgKz0gbV90aW1lczsKKyAgfQorCisgIC8qKiBSZXR1cm4gdGhlIGVsYXBzZWQgdGltZSBpbiBzZWNvbmRzIGJldHdlZW4gdGhlIGxhc3Qgc3RhcnQvc3RvcCBwYWlyCisgICAgKi8KKyAgaW5saW5lIGRvdWJsZSB2YWx1ZShpbnQgVElNRVIgPSBDUFVfVElNRVIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV90aW1lc1tUSU1FUl07CisgIH0KKworICAvKiogUmV0dXJuIHRoZSBiZXN0IGVsYXBzZWQgdGltZSBpbiBzZWNvbmRzCisgICAgKi8KKyAgaW5saW5lIGRvdWJsZSBiZXN0KGludCBUSU1FUiA9IENQVV9USU1FUikgY29uc3QKKyAgeworICAgIHJldHVybiBtX2Jlc3RzW1RJTUVSXTsKKyAgfQorCisgIC8qKiBSZXR1cm4gdGhlIHdvcnN0IGVsYXBzZWQgdGltZSBpbiBzZWNvbmRzCisgICAgKi8KKyAgaW5saW5lIGRvdWJsZSB3b3JzdChpbnQgVElNRVIgPSBDUFVfVElNRVIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV93b3JzdHNbVElNRVJdOworICB9CisKKyAgLyoqIFJldHVybiB0aGUgdG90YWwgZWxhcHNlZCB0aW1lIGluIHNlY29uZHMuCisgICAgKi8KKyAgaW5saW5lIGRvdWJsZSB0b3RhbChpbnQgVElNRVIgPSBDUFVfVElNRVIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gbV90b3RhbHNbVElNRVJdOworICB9CisKKyAgaW5saW5lIGRvdWJsZSBnZXRDcHVUaW1lKCkgY29uc3QKKyAgeworI2lmZGVmIF9XSU4zMgorICAgIExBUkdFX0lOVEVHRVIgcXVlcnlfdGlja3M7CisgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnF1ZXJ5X3RpY2tzKTsKKyAgICByZXR1cm4gcXVlcnlfdGlja3MuUXVhZFBhcnQvbV9mcmVxdWVuY3k7CisjZWxpZiBfX0FQUExFX18KKyAgICByZXR1cm4gZG91YmxlKG1hY2hfYWJzb2x1dGVfdGltZSgpKSoxZS05OworI2Vsc2UKKyAgICB0aW1lc3BlYyB0czsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJnRzKTsKKyAgICByZXR1cm4gZG91YmxlKHRzLnR2X3NlYykgKyAxZS05ICogZG91YmxlKHRzLnR2X25zZWMpOworI2VuZGlmCisgIH0KKworICBpbmxpbmUgZG91YmxlIGdldFJlYWxUaW1lKCkgY29uc3QKKyAgeworI2lmZGVmIF9XSU4zMgorICAgIFNZU1RFTVRJTUUgc3Q7CisgICAgR2V0U3lzdGVtVGltZSgmc3QpOworICAgIHJldHVybiAoZG91YmxlKXN0LndTZWNvbmQgKyAxLmUtMyAqIChkb3VibGUpc3Qud01pbGxpc2Vjb25kczsKKyNlbGlmIF9fQVBQTEVfXworICAgIHJldHVybiBkb3VibGUobWFjaF9hYnNvbHV0ZV90aW1lKCkpKjFlLTk7CisjZWxzZQorICAgIHRpbWVzcGVjIHRzOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7CisgICAgcmV0dXJuIGRvdWJsZSh0cy50dl9zZWMpICsgMWUtOSAqIGRvdWJsZSh0cy50dl9uc2VjKTsKKyNlbmRpZgorICB9CisKK3Byb3RlY3RlZDoKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorICBkb3VibGUgbV9mcmVxdWVuY3k7CisjZW5kaWYKKyAgVmVjdG9yMmQgbV9zdGFydHM7CisgIFZlY3RvcjJkIG1fdGltZXM7CisgIFZlY3RvcjJkIG1fYmVzdHM7CisgIFZlY3RvcjJkIG1fd29yc3RzOworICBWZWN0b3IyZCBtX3RvdGFsczsKKworcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCit9OworCisjZGVmaW5lIEJFTkNIKFRJTUVSLFRSSUVTLFJFUCxDT0RFKSB7IFwKKyAgICBUSU1FUi5yZXNldCgpOyBcCisgICAgZm9yKGludCB1Z2x5dmFybmFtZTE9MDsgdWdseXZhcm5hbWUxPFRSSUVTOyArK3VnbHl2YXJuYW1lMSl7IFwKKyAgICAgIFRJTUVSLnN0YXJ0KCk7IFwKKyAgICAgIGZvcihpbnQgdWdseXZhcm5hbWUyPTA7IHVnbHl2YXJuYW1lMjxSRVA7ICsrdWdseXZhcm5hbWUyKXsgXAorICAgICAgICBDT0RFOyBcCisgICAgICB9IFwKKyAgICAgIFRJTUVSLnN0b3AoKTsgXAorICAgIH0gXAorICB9CisKK30KKworLy8gY2xlYW4gI2RlZmluZWQgdG9rZW5zCisjaWZkZWYgRUlHRU5fQlRfVU5ERUZfTk9NSU5NQVgKKyMgdW5kZWYgRUlHRU5fQlRfVU5ERUZfTk9NSU5NQVgKKyMgdW5kZWYgTk9NSU5NQVgKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fQlRfVU5ERUZfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyB1bmRlZiBFSUdFTl9CVF9VTkRFRl9XSU4zMl9MRUFOX0FORF9NRUFOCisjIHVuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorCisjZW5kaWYgLy8gRUlHRU5fQkVOQ0hfVElNRVJSX0gKZGlmZiAtLWdpdCBhL2JlbmNoL0JlbmNoVXRpbC5oIGIvYmVuY2gvQmVuY2hVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4M2ExMwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL0JlbmNoVXRpbC5oCkBAIC0wLDAgKzEsOTIgQEAKKworI2lmbmRlZiBFSUdFTl9CRU5DSF9VVElMX0gKKyNkZWZpbmUgRUlHRU5fQkVOQ0hfVVRJTF9ICisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgIkJlbmNoVGltZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9yZXBldGl0aW9uL2VudW1fcGFyYW1zLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvcmVwZXRpdGlvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL3NlcS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2FycmF5LmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvYXJpdGhtZXRpYy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2NvbXBhcmlzb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9wdW5jdHVhdGlvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL3B1bmN0dWF0aW9uL2NvbW1hLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3Ivc3RyaW5naXplLmhwcD4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbml0TWF0cml4X3JhbmRvbShNYXRyaXhUeXBlJiBtYXQpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGluaXRNYXRyaXhfcmFuZG9tKE1hdHJpeFR5cGUmIG1hdCkKK3sKKyAgbWF0LnNldFJhbmRvbSgpOy8vID0gTWF0cml4VHlwZTo6cmFuZG9tKG1hdC5yb3dzKCksIG1hdC5jb2xzKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGluaXRNYXRyaXhfaWRlbnRpdHkoTWF0cml4VHlwZSYgbWF0KSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbml0TWF0cml4X2lkZW50aXR5KE1hdHJpeFR5cGUmIG1hdCkKK3sKKyAgbWF0LnNldElkZW50aXR5KCk7Cit9CisKKyNpZm5kZWYgX19JTlRFTF9DT01QSUxFUgorI2RlZmluZSBESVNBQkxFX1NTRV9FWENFUFRJT05TKCkgIHsgXAorICBpbnQgYXV4OyBcCisgIGFzbSggXAorICAic3RteGNzciAgICVbYXV4XSAgICAgICAgICAgXG5cdCIgXAorICAib3JsICAgICAgICQzMjgzMiwgJVthdXhdICAgXG5cdCIgXAorICAibGRteGNzciAgICVbYXV4XSAgICAgICAgICAgXG5cdCIgXAorICA6IDogW2F1eF0gIm0iIChhdXgpKTsgXAorfQorI2Vsc2UKKyNkZWZpbmUgRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpICAKKyNlbmRpZgorCisjaWZkZWYgQkVOQ0hfR01NCisjaW5jbHVkZSA8Z21tL2dtbS5oPgordGVtcGxhdGUgPHR5cGVuYW1lIEVpZ2VuTWF0cml4VHlwZSwgdHlwZW5hbWUgR21tTWF0cml4VHlwZT4KK3ZvaWQgZWlUb0dtbShjb25zdCBFaWdlbk1hdHJpeFR5cGUmIHNyYywgR21tTWF0cml4VHlwZSYgZHN0KQoreworICBkc3QucmVzaXplKHNyYy5yb3dzKCksc3JjLmNvbHMoKSk7CisgIGZvciAoaW50IGo9MDsgajxzcmMuY29scygpOyArK2opCisgICAgZm9yIChpbnQgaT0wOyBpPHNyYy5yb3dzKCk7ICsraSkKKyAgICAgIGRzdChpLGopID0gc3JjLmNvZWZmKGksaik7Cit9CisjZW5kaWYKKworCisjaWZkZWYgQkVOQ0hfR1NMCisjaW5jbHVkZSA8Z3NsL2dzbF9tYXRyaXguaD4KKyNpbmNsdWRlIDxnc2wvZ3NsX2xpbmFsZy5oPgorI2luY2x1ZGUgPGdzbC9nc2xfZWlnZW4uaD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFaWdlbk1hdHJpeFR5cGU+Cit2b2lkIGVpVG9Hc2woY29uc3QgRWlnZW5NYXRyaXhUeXBlJiBzcmMsIGdzbF9tYXRyaXgqKiBkc3QpCit7CisgIGZvciAoaW50IGo9MDsgajxzcmMuY29scygpOyArK2opCisgICAgZm9yIChpbnQgaT0wOyBpPHNyYy5yb3dzKCk7ICsraSkKKyAgICAgIGdzbF9tYXRyaXhfc2V0KCpkc3QsIGksIGosIHNyYy5jb2VmZihpLGopKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQkVOQ0hfVUJMQVMKKyNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL21hdHJpeC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy92ZWN0b3IuaHBwPgordGVtcGxhdGUgPHR5cGVuYW1lIEVpZ2VuTWF0cml4VHlwZSwgdHlwZW5hbWUgVWJsYXNNYXRyaXhUeXBlPgordm9pZCBlaVRvVWJsYXMoY29uc3QgRWlnZW5NYXRyaXhUeXBlJiBzcmMsIFVibGFzTWF0cml4VHlwZSYgZHN0KQoreworICBkc3QucmVzaXplKHNyYy5yb3dzKCksc3JjLmNvbHMoKSk7CisgIGZvciAoaW50IGo9MDsgajxzcmMuY29scygpOyArK2opCisgICAgZm9yIChpbnQgaT0wOyBpPHNyYy5yb3dzKCk7ICsraSkKKyAgICAgIGRzdChpLGopID0gc3JjLmNvZWZmKGksaik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWlnZW5UeXBlLCB0eXBlbmFtZSBVYmxhc1R5cGU+Cit2b2lkIGVpVG9VYmxhc1ZlYyhjb25zdCBFaWdlblR5cGUmIHNyYywgVWJsYXNUeXBlJiBkc3QpCit7CisgIGRzdC5yZXNpemUoc3JjLnNpemUoKSk7CisgIGZvciAoaW50IGo9MDsgajxzcmMuc2l6ZSgpOyArK2opCisgICAgICBkc3Rbal0gPSBzcmMuY29lZmYoaik7Cit9CisjZW5kaWYKKworI2VuZGlmIC8vIEVJR0VOX0JFTkNIX1VUSUxfSApkaWZmIC0tZ2l0IGEvYmVuY2gvUkVBRE1FLnR4dCBiL2JlbmNoL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4MzFhZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL1JFQURNRS50eHQKQEAgLTAsMCArMSw1NSBAQAorCitUaGlzIGZvbGRlciBjb250YWlucyBhIGNvdXBsZSBvZiBiZW5jaG1hcmsgdXRpdGllcyBhbmQgRWlnZW4gYmVuY2htYXJrcy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBiZW5jaF9tdWx0aV9jb21waWxlcnMuc2ggKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitUaGlzIHNjcmlwdCBhbGxvd3MgdG8gcnVuIGEgYmVuY2htYXJrIG9uIGEgc2V0IG9mIGRpZmZlcmVudCBjb21waWxlcnMvY29tcGlsZXIgb3B0aW9ucy4KK0l0IHRha2VzIHR3byBhcmd1bWVudHM6CisgLSBhIGZpbGUgZGVmaW5pbmcgdGhlIGxpc3Qgb2YgdGhlIGNvbXBpbGVycyB3aXRoIHRoZWlyIG9wdGlvbnMKKyAtIHRoZSAuY3BwIGZpbGUgb2YgdGhlIGJlbmNobWFyaworCitFeGFtcGxlczoKKworJCAuL2JlbmNoX211bHRpX2NvbXBpbGVycy5zaCBiYXNpY2JlbmNoLmN4eGxpc3QgYmFzaWNiZW5jaG1hcmsuY3BwCisKKyAgICBnKystNC4xIC1PMyAtRE5ERUJVRyAtZmlubGluZS1saW1pdD0xMDAwMAorICAgIDNkLTN4MyAgIC8gICA0ZC00eDQgICAvICAgWGQtNHg0ICAgLyAgIFhkLTIweDIwICAgLworICAgIDAuMjcxMTAyICAgMC4xMzE0MTYgICAwLjQyMjMyMiAgIDAuMTk4NjMzCisgICAgMC4yMDE2NTggICAwLjEwMjQzNiAgIDAuMzk3NTY2ICAgMC4yMDcyODIKKworICAgIGcrKy00LjIgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTEwMDAwCisgICAgM2QtM3gzICAgLyAgIDRkLTR4NCAgIC8gICBYZC00eDQgICAvICAgWGQtMjB4MjAgICAvCisgICAgMC4xMDc4MDUgICAwLjA4OTA1NzkgICAwLjMwMjY1ICAgMC4xNjE4NDMKKyAgICAwLjEyNzE1NyAgIDAuMDcxMjU4MSAgIDAuMjc4MzQxICAgMC4xOTEwMjkKKworICAgIGcrKy00LjMgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTEwMDAwCisgICAgM2QtM3gzICAgLyAgIDRkLTR4NCAgIC8gICBYZC00eDQgICAvICAgWGQtMjB4MjAgICAvCisgICAgMC4xMzQzMTggICAwLjEwNTI5MSAgIDAuMzcwNCAgIDAuMTgwOTY2CisgICAgMC4xMzc3MDMgICAwLjA3MzI0NzIgICAwLjMxMjI1ICAgMC4yMDIyMDQKKworICAgIGljcGMgLWZhc3QgLUROREVCVUcgLWZuby1leGNlcHRpb25zIC1uby1pbmxpbmUtbWF4LXNpemUKKyAgICAzZC0zeDMgICAvICAgNGQtNHg0ICAgLyAgIFhkLTR4NCAgIC8gICBYZC0yMHgyMCAgIC8KKyAgICAwLjIyNjE0NSAgIDAuMDk0MTMxOSAgIDAuMzcxODczICAgMC4xNTk0MzMKKyAgICAwLjEwOTMwMiAgIDAuMDgzNzUzOCAgIDAuMzI4MTAyICAgMC4xNzM4OTEKKworCiskIC4vYmVuY2hfbXVsdGlfY29tcGlsZXJzLnNoIG9tcGJlbmNoLmN4eGxpc3Qgb21wYmVuY2htYXJrLmNwcAorCisgICAgZysrLTQuMiAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MTAwMDAgLWZvcGVubXAKKyAgICBkb3VibGUsIGZpeGVkLXNpemUgNHg0OiAwLjAwMTY1MTA1cyAgMC4wNzc4NzM5cworICAgIGRvdWJsZSwgMzJ4MzI6IDAuMDY1NDc2OXMgMC4wNzUyODlzICA9PiB4MC44Njk2NzQgKDIpCisgICAgZG91YmxlLCAxMjh4MTI4OiAwLjA1NDE0OHMgMC4wNDE5NjY5cyAgPT4geDEuMjkwMjUgKDIpCisgICAgZG91YmxlLCA1MTJ4NTEyOiAwLjkxMzc5OXMgMC40Mjg1MzNzICA9PiB4Mi4xMzIzOSAoMikKKyAgICBkb3VibGUsIDEwMjR4MTAyNDogMTQuNTk3MnMgOS4zNTQycyAgPT4geDEuNTYwNSAoMikKKworICAgIGljcGMgLWZhc3QgLUROREVCVUcgLWZuby1leGNlcHRpb25zIC1uby1pbmxpbmUtbWF4LXNpemUgLW9wZW5tcAorICAgIGRvdWJsZSwgZml4ZWQtc2l6ZSA0eDQ6IDAuMDAwNTg5ODQ4cyAgMC4wMTk5NDlzCisgICAgZG91YmxlLCAzMngzMjogMC4wNjgyNzgxcyAwLjA0NDk3MjJzICA9PiB4MS41MTgyMyAoMikKKyAgICBkb3VibGUsIDEyOHgxMjg6IDAuMDU0NzUwOXMgMC4wNDM1NTE5cyAgPT4geDEuMjU3MTQgKDIpCisgICAgZG91YmxlLCA1MTJ4NTEyOiAwLjgyOTQzNnMgMC40MjQ0MzhzICA9PiB4MS45NTQyICgyKQorICAgIGRvdWJsZSwgMTAyNHgxMDI0OiAxNC41MjQzcyAxMC43NzM1cyAgPT4geDEuMzQ4MTUgKDIpCisKKworCmRpZmYgLS1naXQgYS9iZW5jaC9iYXNpY2JlbmNoLmN4eGxpc3QgYi9iZW5jaC9iYXNpY2JlbmNoLmN4eGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhYjM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2Jhc2ljYmVuY2guY3h4bGlzdApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaAorCisjIENMSVNUWygoZysrKSldPSJnKystMy40IC1PMyAtRE5ERUJVRyIKKyMgQ0xJU1RbKChnKyspKV09ImcrKy0zLjQgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTIwMDAwIgorCisjIENMSVNUWygoZysrKSldPSJnKystNC4xIC1PMyAtRE5ERUJVRyIKKyNDTElTVFsoKGcrKykpXT0iZysrLTQuMSAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MjAwMDAiCisKKyMgQ0xJU1RbKChnKyspKV09ImcrKy00LjIgLU8zIC1ETkRFQlVHIgorI0NMSVNUWygoZysrKSldPSJnKystNC4yIC1PMyAtRE5ERUJVRyAtZmlubGluZS1saW1pdD0yMDAwMCIKKyMgQ0xJU1RbKChnKyspKV09ImcrKy00LjIgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTIwMDAwIC1mcHJvZmlsZS1nZW5lcmF0ZSIKKyMgQ0xJU1RbKChnKyspKV09ImcrKy00LjIgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTIwMDAwIC1mcHJvZmlsZS11c2UiCisKKyMgQ0xJU1RbKChnKyspKV09ImcrKy00LjMgLU8zIC1ETkRFQlVHIgorI0NMSVNUWygoZysrKSldPSJnKystNC4zIC1PMyAtRE5ERUJVRyAtZmlubGluZS1saW1pdD0yMDAwMCIKKyMgQ0xJU1RbKChnKyspKV09ImcrKy00LjMgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTIwMDAwIC1mcHJvZmlsZS1nZW5lcmF0ZSIKKyMgQ0xJU1RbKChnKyspKV09ImcrKy00LjMgLU8zIC1ETkRFQlVHIC1maW5saW5lLWxpbWl0PTIwMDAwIC1mcHJvZmlsZS11c2UiCisKKyMgQ0xJU1RbKChnKyspKV09ImljcGMgLWZhc3QgLUROREVCVUcgLWZuby1leGNlcHRpb25zIC1uby1pbmxpbmUtbWF4LXNpemUgLXByb2YtZ2VueCIKKyMgQ0xJU1RbKChnKyspKV09ImljcGMgLWZhc3QgLUROREVCVUcgLWZuby1leGNlcHRpb25zIC1uby1pbmxpbmUtbWF4LXNpemUgLXByb2YtdXNlIgorCisjQ0xJU1RbKChnKyspKV09Ii9vcHQvaW50ZWwvQ29tcGlsZXIvMTEuMS8wNzIvYmluL2ludGVsNjQvaWNwYyAtZmFzdCAtRE5ERUJVRyAtZm5vLWV4Y2VwdGlvbnMgLW5vLWlubGluZS1tYXgtc2l6ZSAtbHJ0IgorQ0xJU1RbKChnKyspKV09Ii9ob21lL29yemVsL3N2bi9sbHZtL1JlbGVhc2UvYmluL2NsYW5nKysgLU8zIC1ETkRFQlVHIC1ERUlHRU5fRE9OVF9WRUNUT1JJWkUgLWxydCIKK0NMSVNUWygoZysrKSldPSIvaG9tZS9vcnplbC9zdm4vbGx2bS9SZWxlYXNlL2Jpbi9jbGFuZysrIC1PMyAtRE5ERUJVRyAtbHJ0IgorQ0xJU1RbKChnKyspKV09ImcrKy00LjQuNCAtTzMgLUROREVCVUcgLURFSUdFTl9ET05UX1ZFQ1RPUklaRSAtbHJ0IgorQ0xJU1RbKChnKyspKV09ImcrKy00LjQuNCAtTzMgLUROREVCVUcgLWxydCIKK0NMSVNUWygoZysrKSldPSJnKystNC41LjAgLU8zIC1ETkRFQlVHIC1ERUlHRU5fRE9OVF9WRUNUT1JJWkUgLWxydCIKK0NMSVNUWygoZysrKSldPSJnKystNC41LjAgLU8zIC1ETkRFQlVHIC1scnQiCmRpZmYgLS1naXQgYS9iZW5jaC9iYXNpY2JlbmNobWFyay5jcHAgYi9iZW5jaC9iYXNpY2JlbmNobWFyay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2ZWE4NQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2Jhc2ljYmVuY2htYXJrLmNwcApAQCAtMCwwICsxLDM1IEBACisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJCZW5jaFV0aWwuaCIKKyNpbmNsdWRlICJiYXNpY2JlbmNobWFyay5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBESVNBQkxFX1NTRV9FWENFUFRJT05TKCk7CisKKyAgLy8gdGhpcyBpcyB0aGUgbGlzdCBvZiBtYXRyaXggdHlwZSBhbmQgc2l6ZSB3ZSB3YW50IHRvIGJlbmNoOgorICAvLyAoKHN1ZmZpeCkgKG1hdHJpeCBzaXplKSAobnVtYmVyIG9mIGl0ZXJhdGlvbnMpKQorICAjZGVmaW5lIE1PREVTICgoM2QpKDMpKDQwMDAwMDApKSAoKDRkKSg0KSgxMDAwMDAwKSkgKChYZCkoNCkoMTAwMDAwMCkpICgoWGQpKDIwKSgxMDAwMCkpCisvLyAgICNkZWZpbmUgTU9ERVMgKChYZCkoMjApKDEwMDAwKSkKKworICAjZGVmaW5lIF9HRU5FUkFURV9IRUFERVIoUixBUkcsRUwpIDw8IEJPT1NUX1BQX1NUUklOR0laRShCT09TVF9QUF9TRVFfSEVBRChFTCkpIDw8ICItIiBcCisgICAgPDwgQk9PU1RfUFBfU1RSSU5HSVpFKEJPT1NUX1BQX1NFUV9FTEVNKDEsRUwpKSA8PCAieCIgXAorICAgIDw8IEJPT1NUX1BQX1NUUklOR0laRShCT09TVF9QUF9TRVFfRUxFTSgxLEVMKSkgPDwgIiAgIC8gICAiCisKKyAgc3RkOjpjb3V0IEJPT1NUX1BQX1NFUV9GT1JfRUFDSChfR0VORVJBVEVfSEVBREVSLCB+LCBNT0RFUyApIDw8IGVuZGw7CisKKyAgY29uc3QgaW50IHRyaWVzID0gMTA7CisKKyAgI2RlZmluZSBfUlVOX0JFTkNIKFIsQVJHLEVMKSBcCisgICAgc3RkOjpjb3V0IDw8IEFSRyggXAorICAgICAgQk9PU1RfUFBfQ0FUKE1hdHJpeCwgQk9PU1RfUFBfU0VRX0hFQUQoRUwpKSAoXAorICAgICAgICAgQk9PU1RfUFBfU0VRX0VMRU0oMSxFTCksQk9PU1RfUFBfU0VRX0VMRU0oMSxFTCkpLCBCT09TVF9QUF9TRVFfRUxFTSgyLEVMKSwgdHJpZXMpIFwKKyAgICA8PCAiICAgIjsKKworICBCT09TVF9QUF9TRVFfRk9SX0VBQ0goX1JVTl9CRU5DSCwgYmVuY2hCYXNpYzxMYXp5RXZhbD4sIE1PREVTICk7CisgIHN0ZDo6Y291dCA8PCBlbmRsOworICBCT09TVF9QUF9TRVFfRk9SX0VBQ0goX1JVTl9CRU5DSCwgYmVuY2hCYXNpYzxFYXJseUV2YWw+LCBNT0RFUyApOworICBzdGQ6OmNvdXQgPDwgZW5kbDsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JlbmNoL2Jhc2ljYmVuY2htYXJrLmggYi9iZW5jaC9iYXNpY2JlbmNobWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGMzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iYXNpY2JlbmNobWFyay5oCkBAIC0wLDAgKzEsNjMgQEAKKworI2lmbmRlZiBFSUdFTl9CRU5DSF9CQVNJQ0JFTkNIX0gKKyNkZWZpbmUgRUlHRU5fQkVOQ0hfQkFTSUNCRU5DSF9ICisKK2VudW0ge0xhenlFdmFsLCBFYXJseUV2YWwsIE9tcEV2YWx9OworCit0ZW1wbGF0ZTxpbnQgTW9kZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgYmVuY2hCYXNpY19sb29wKGNvbnN0IE1hdHJpeFR5cGUmIEksIE1hdHJpeFR5cGUmIG0sIGludCBpdGVyYXRpb25zKSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOworCit0ZW1wbGF0ZTxpbnQgTW9kZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgYmVuY2hCYXNpY19sb29wKGNvbnN0IE1hdHJpeFR5cGUmIEksIE1hdHJpeFR5cGUmIG0sIGludCBpdGVyYXRpb25zKQoreworICBmb3IoaW50IGEgPSAwOyBhIDwgaXRlcmF0aW9uczsgYSsrKQorICB7CisgICAgaWYgKE1vZGU9PUxhenlFdmFsKQorICAgIHsKKyAgICAgIGFzbSgiI2JlZ2luX2JlbmNoX2xvb3AgTGF6eUV2YWwiKTsKKyAgICAgIGlmIChNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSE9RWlnZW46OkR5bmFtaWMpIGFzbSgiI2ZpeGVkc2l6ZSIpOworICAgICAgbSA9IChJICsgMC4wMDAwNSAqIChtICsgbS5sYXp5KCkgKiBtKSkuZXZhbCgpOworICAgIH0KKyAgICBlbHNlIGlmIChNb2RlPT1PbXBFdmFsKQorICAgIHsKKyAgICAgIGFzbSgiI2JlZ2luX2JlbmNoX2xvb3AgT21wRXZhbCIpOworICAgICAgaWYgKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lIT1FaWdlbjo6RHluYW1pYykgYXNtKCIjZml4ZWRzaXplIik7CisgICAgICBtID0gKEkgKyAwLjAwMDA1ICogKG0gKyBtLmxhenkoKSAqIG0pKS5ldmFsT01QKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhc20oIiNiZWdpbl9iZW5jaF9sb29wIEVhcmx5RXZhbCIpOworICAgICAgaWYgKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lIT1FaWdlbjo6RHluYW1pYykgYXNtKCIjZml4ZWRzaXplIik7CisgICAgICBtID0gSSArIDAuMDAwMDUgKiAobSArIG0gKiBtKTsKKyAgICB9CisgICAgYXNtKCIjZW5kX2JlbmNoX2xvb3AiKTsKKyAgfQorfQorCit0ZW1wbGF0ZTxpbnQgTW9kZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK2RvdWJsZSBiZW5jaEJhc2ljKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgaW50IHNpemUsIGludCB0cmllcykgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKTsKKwordGVtcGxhdGU8aW50IE1vZGUsIHR5cGVuYW1lIE1hdHJpeFR5cGU+Citkb3VibGUgYmVuY2hCYXNpYyhjb25zdCBNYXRyaXhUeXBlJiBtYXQsIGludCBpdGVyYXRpb25zLCBpbnQgdHJpZXMpCit7CisgIGNvbnN0IGludCByb3dzID0gbWF0LnJvd3MoKTsKKyAgY29uc3QgaW50IGNvbHMgPSBtYXQuY29scygpOworCisgIE1hdHJpeFR5cGUgSShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIG0ocm93cyxjb2xzKTsKKworICBpbml0TWF0cml4X2lkZW50aXR5KEkpOworCisgIEVpZ2VuOjpCZW5jaFRpbWVyIHRpbWVyOworICBmb3IodWludCB0PTA7IHQ8dHJpZXM7ICsrdCkKKyAgeworICAgIGluaXRNYXRyaXhfcmFuZG9tKG0pOworICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgYmVuY2hCYXNpY19sb29wPE1vZGU+KEksIG0sIGl0ZXJhdGlvbnMpOworICAgIHRpbWVyLnN0b3AoKTsKKyAgICBjZXJyIDw8IG07CisgIH0KKyAgcmV0dXJuIHRpbWVyLnZhbHVlKCk7Cit9OworCisjZW5kaWYgLy8gRUlHRU5fQkVOQ0hfQkFTSUNCRU5DSF9ICmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaEJsYXNHZW1tLmNwcCBiL2JlbmNoL2JlbmNoQmxhc0dlbW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMDg2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaEJsYXNHZW1tLmNwcApAQCAtMCwwICsxLDIxOSBAQAorLy8gZysrIC1PMyAtRE5ERUJVRyAtSS4uIC1MIC91c3IvbGliNjQvYXRsYXMvIGJlbmNoQmxhc0dlbW0uY3BwIC1vIGJlbmNoQmxhc0dlbW0gLWxydCAtbGNibGFzCisvLyBwb3NzaWJsZSBvcHRpb25zOgorLy8gICAgLURFSUdFTl9ET05UX1ZFQ1RPUklaRQorLy8gICAgLW1zc2UyCisKKy8vICNkZWZpbmUgRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IKKyNkZWZpbmUgX0ZMT0FUCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSAiQmVuY2hUaW1lci5oIgorCisvLyBpbmNsdWRlIHRoZSBCTEFTIGhlYWRlcnMKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPGNibGFzLmg+Cit9CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaWZkZWYgX0ZMT0FUCit0eXBlZGVmIGZsb2F0IFNjYWxhcjsKKyNkZWZpbmUgQ0JMQVNfR0VNTSBjYmxhc19zZ2VtbQorI2Vsc2UKK3R5cGVkZWYgZG91YmxlIFNjYWxhcjsKKyNkZWZpbmUgQ0JMQVNfR0VNTSBjYmxhc19kZ2VtbQorI2VuZGlmCisKKwordHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhcixFaWdlbjo6RHluYW1pYyxFaWdlbjo6RHluYW1pYz4gTXlNYXRyaXg7Cit2b2lkIGJlbmNoX2VpZ2VuZ2VtbShNeU1hdHJpeCYgbWMsIGNvbnN0IE15TWF0cml4JiBtYSwgY29uc3QgTXlNYXRyaXgmIG1iLCBpbnQgbmJsb29wcyk7Cit2b2lkIGNoZWNrX3Byb2R1Y3QoaW50IE0sIGludCBOLCBpbnQgSyk7Cit2b2lkIGNoZWNrX3Byb2R1Y3Qodm9pZCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIC8vIGRpc2FibGUgU1NFIGV4Y2VwdGlvbnMKKyAgI2lmZGVmIF9fR05VQ19fCisgIHsKKyAgICBpbnQgYXV4OworICAgIGFzbSgKKyAgICAic3RteGNzciAgICVbYXV4XSAgICAgICAgICAgXG5cdCIKKyAgICAib3JsICAgICAgICQzMjgzMiwgJVthdXhdICAgXG5cdCIKKyAgICAibGRteGNzciAgICVbYXV4XSAgICAgICAgICAgXG5cdCIKKyAgICA6IDogW2F1eF0gIm0iIChhdXgpKTsKKyAgfQorICAjZW5kaWYKKworICBpbnQgbmJ0cmllcz0xLCBuYmxvb3BzPTEsIE0sIE4sIEs7CisKKyAgaWYgKGFyZ2M9PTIpCisgIHsKKyAgICBpZiAoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJjaGVjayIpCisgICAgICBjaGVja19wcm9kdWN0KCk7CisgICAgZWxzZQorICAgICAgTSA9IE4gPSBLID0gYXRvaShhcmd2WzFdKTsKKyAgfQorICBlbHNlIGlmICgoYXJnYz09MykgJiYgKHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pPT0iYXV0byIpKQorICB7CisgICAgTSA9IE4gPSBLID0gYXRvaShhcmd2WzJdKTsKKyAgICBuYmxvb3BzID0gMTAwMDAwMDAwMC8oTSpNKk0pOworICAgIGlmIChuYmxvb3BzPDEpCisgICAgICBuYmxvb3BzID0gMTsKKyAgICBuYnRyaWVzID0gNjsKKyAgfQorICBlbHNlIGlmIChhcmdjPT00KQorICB7CisgICAgTSA9IE4gPSBLID0gYXRvaShhcmd2WzFdKTsKKyAgICBuYmxvb3BzID0gYXRvaShhcmd2WzJdKTsKKyAgICBuYnRyaWVzID0gYXRvaShhcmd2WzNdKTsKKyAgfQorICBlbHNlIGlmIChhcmdjPT02KQorICB7CisgICAgTSA9IGF0b2koYXJndlsxXSk7CisgICAgTiA9IGF0b2koYXJndlsyXSk7CisgICAgSyA9IGF0b2koYXJndlszXSk7CisgICAgbmJsb29wcyA9IGF0b2koYXJndls0XSk7CisgICAgbmJ0cmllcyA9IGF0b2koYXJndls1XSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgc2l6ZSAgXG4iOworICAgIHN0ZDo6Y291dCA8PCAiVXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIGF1dG8gc2l6ZVxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiBzaXplIG5ibG9vcHMgbmJ0cmllc1xuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiBNIE4gSyBuYmxvb3BzIG5idHJpZXNcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgY2hlY2tcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJPcHRpb25zOlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgICBzaXplICAgICAgIHVuaXF1ZSBzaXplIG9mIHRoZSAyIG1hdHJpY2VzIChpbnRlZ2VyKVxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgICBhdXRvICAgICAgIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgYW5kIHRyaWVzXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgIG5ibG9vcHMgICAgbnVtYmVyIG9mIHRpbWVzIHRoZSBHRU1NIHJvdXRpbmVzIGlzIGV4ZWN1dGVkXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgIG5idHJpZXMgICAgbnVtYmVyIG9mIHRpbWVzIHRoZSBsb29wIGlzIGJlbmNoZWQgKHJldHVybiB0aGUgYmVzdCB0cnkpXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgIE0gTiBLICAgICAgc2l6ZXMgb2YgdGhlIG1hdHJpY2VzOiBNeE4gID0gIE14SyAqIEt4TiAoaW50ZWdlcnMpXG4iOworICAgIHN0ZDo6Y291dCA8PCAiICAgIGNoZWNrICAgICAgY2hlY2sgZWlnZW4gcHJvZHVjdCB1c2luZyBjYmxhcyBhcyBhIHJlZmVyZW5jZVxuIjsKKyAgICBleGl0KDEpOworICB9CisKKyAgZG91YmxlIG5ibWFkID0gZG91YmxlKE0pICogZG91YmxlKE4pICogZG91YmxlKEspICogZG91YmxlKG5ibG9vcHMpOworCisgIGlmICghKHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pPT0iYXV0byIpKQorICAgIHN0ZDo6Y291dCA8PCBNIDw8ICIgeCAiIDw8IE4gPDwgIiB4ICIgPDwgSyA8PCAiXG4iOworCisgIFNjYWxhciBhbHBoYSwgYmV0YTsKKyAgTXlNYXRyaXggbWEoTSxLKSwgbWIoSyxOKSwgbWMoTSxOKTsKKyAgbWEgPSBNeU1hdHJpeDo6UmFuZG9tKE0sSyk7CisgIG1iID0gTXlNYXRyaXg6OlJhbmRvbShLLE4pOworICBtYyA9IE15TWF0cml4OjpSYW5kb20oTSxOKTsKKworICBFaWdlbjo6QmVuY2hUaW1lciB0aW1lcjsKKworICAvLyB3ZSBzaW1wbHkgY29tcHV0ZSBjICs9IGEqYiwgc286CisgIGFscGhhID0gMTsKKyAgYmV0YSA9IDE7CisKKyAgLy8gYmVuY2ggY2JsYXMKKyAgLy8gUk9XU19BLCBDT0xTX0IsIENPTFNfQSwgMS4wLCAgQSwgQ09MU19BLCBCLCBDT0xTX0IsIDAuMCwgQywgQ09MU19CKTsKKyAgaWYgKCEoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJhdXRvIikpCisgIHsKKyAgICB0aW1lci5yZXNldCgpOworICAgIGZvciAodWludCBrPTAgOyBrPG5idHJpZXMgOyArK2spCisgICAgeworICAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgICBmb3IgKHVpbnQgaj0wIDsgajxuYmxvb3BzIDsgKytqKQorICAgICAgICAgICAgICAjaWZkZWYgRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IKKyAgICAgICAgICAgICAgQ0JMQVNfR0VNTShDYmxhc1Jvd01ham9yLCBDYmxhc05vVHJhbnMsIENibGFzTm9UcmFucywgTSwgTiwgSywgYWxwaGEsIG1hLmRhdGEoKSwgSywgbWIuZGF0YSgpLCBOLCBiZXRhLCBtYy5kYXRhKCksIE4pOworICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICBDQkxBU19HRU1NKENibGFzQ29sTWFqb3IsIENibGFzTm9UcmFucywgQ2JsYXNOb1RyYW5zLCBNLCBOLCBLLCBhbHBoYSwgbWEuZGF0YSgpLCBNLCBtYi5kYXRhKCksIEssIGJldGEsIG1jLmRhdGEoKSwgTSk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICB0aW1lci5zdG9wKCk7CisgICAgfQorICAgIGlmICghKHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pPT0iYXV0byIpKQorICAgICAgc3RkOjpjb3V0IDw8ICJjYmxhczogIiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgKCIgPDwgMWUtMypmbG9vcigxZS02Km5ibWFkL3RpbWVyLnZhbHVlKCkpIDw8ICIgR0Zsb3BzL3MpXG4iOworICAgIGVsc2UKKyAgICAgICAgc3RkOjpjb3V0IDw8IE0gPDwgIiA6ICIgPDwgdGltZXIudmFsdWUoKSA8PCAiIDsgIiA8PCAxZS0zKmZsb29yKDFlLTYqbmJtYWQvdGltZXIudmFsdWUoKSkgPDwgIlxuIjsKKyAgfQorCisgIC8vIGNsZWFyCisgIG1hID0gTXlNYXRyaXg6OlJhbmRvbShNLEspOworICBtYiA9IE15TWF0cml4OjpSYW5kb20oSyxOKTsKKyAgbWMgPSBNeU1hdHJpeDo6UmFuZG9tKE0sTik7CisKKyAgLy8gZWlnZW4KKy8vICAgaWYgKCEoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJhdXRvIikpCisgIHsKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICBmb3IgKHVpbnQgaz0wIDsgazxuYnRyaWVzIDsgKytrKQorICAgICAgeworICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgYmVuY2hfZWlnZW5nZW1tKG1jLCBtYSwgbWIsIG5ibG9vcHMpOworICAgICAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIH0KKyAgICAgIGlmICghKHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pPT0iYXV0byIpKQorICAgICAgICBzdGQ6OmNvdXQgPDwgImVpZ2VuIDogIiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgKCIgPDwgMWUtMypmbG9vcigxZS02Km5ibWFkL3RpbWVyLnZhbHVlKCkpIDw8ICIgR0Zsb3BzL3MpXG4iOworICAgICAgZWxzZQorICAgICAgICBzdGQ6OmNvdXQgPDwgTSA8PCAiIDogIiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgOyAiIDw8IDFlLTMqZmxvb3IoMWUtNipuYm1hZC90aW1lci52YWx1ZSgpKSA8PCAiXG4iOworICB9CisKKyAgc3RkOjpjb3V0IDw8ICJsMTogIiA8PCBFaWdlbjo6bDFDYWNoZVNpemUoKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAibDI6ICIgPDwgRWlnZW46OmwyQ2FjaGVTaXplKCkgPDwgc3RkOjplbmRsOworICAKKworICByZXR1cm4gMDsKK30KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGJlbmNoX2VpZ2VuZ2VtbShNeU1hdHJpeCYgbWMsIGNvbnN0IE15TWF0cml4JiBtYSwgY29uc3QgTXlNYXRyaXgmIG1iLCBpbnQgbmJsb29wcykKK3sKKyAgZm9yICh1aW50IGo9MCA7IGo8bmJsb29wcyA7ICsraikKKyAgICAgIG1jLm5vYWxpYXMoKSArPSBtYSAqIG1iOworfQorCisjZGVmaW5lIE1ZVkVSSUZZKEEsTSkgaWYgKCEoQSkpIHsgXAorICAgIHN0ZDo6Y291dCA8PCAiRkFJTDogIiA8PCBNIDw8ICJcbiI7IFwKKyAgfQordm9pZCBjaGVja19wcm9kdWN0KGludCBNLCBpbnQgTiwgaW50IEspCit7CisgIE15TWF0cml4IG1hKE0sSyksIG1iKEssTiksIG1jKE0sTiksIG1hVChLLE0pLCBtYlQoTixLKSwgbWVpZ2VuKE0sTiksIG1yZWYoTSxOKTsKKyAgbWEgPSBNeU1hdHJpeDo6UmFuZG9tKE0sSyk7CisgIG1iID0gTXlNYXRyaXg6OlJhbmRvbShLLE4pOworICBtYVQgPSBtYS50cmFuc3Bvc2UoKTsKKyAgbWJUID0gbWIudHJhbnNwb3NlKCk7CisgIG1jID0gTXlNYXRyaXg6OlJhbmRvbShNLE4pOworCisgIE15TWF0cml4OjpTY2FsYXIgZXBzID0gMWUtNDsKKworICBtZWlnZW4gPSBtcmVmID0gbWM7CisgIENCTEFTX0dFTU0oQ2JsYXNDb2xNYWpvciwgQ2JsYXNOb1RyYW5zLCBDYmxhc05vVHJhbnMsIE0sIE4sIEssIDEsIG1hLmRhdGEoKSwgTSwgbWIuZGF0YSgpLCBLLCAxLCBtcmVmLmRhdGEoKSwgTSk7CisgIG1laWdlbiArPSBtYSAqIG1iOworICBNWVZFUklGWShtZWlnZW4uaXNBcHByb3gobXJlZiwgZXBzKSwiLiAqIC4iKTsKKworICBtZWlnZW4gPSBtcmVmID0gbWM7CisgIENCTEFTX0dFTU0oQ2JsYXNDb2xNYWpvciwgQ2JsYXNUcmFucywgQ2JsYXNOb1RyYW5zLCBNLCBOLCBLLCAxLCBtYVQuZGF0YSgpLCBLLCBtYi5kYXRhKCksIEssIDEsIG1yZWYuZGF0YSgpLCBNKTsKKyAgbWVpZ2VuICs9IG1hVC50cmFuc3Bvc2UoKSAqIG1iOworICBNWVZFUklGWShtZWlnZW4uaXNBcHByb3gobXJlZiwgZXBzKSwiVCAqIC4iKTsKKworICBtZWlnZW4gPSBtcmVmID0gbWM7CisgIENCTEFTX0dFTU0oQ2JsYXNDb2xNYWpvciwgQ2JsYXNUcmFucywgQ2JsYXNUcmFucywgTSwgTiwgSywgMSwgbWFULmRhdGEoKSwgSywgbWJULmRhdGEoKSwgTiwgMSwgbXJlZi5kYXRhKCksIE0pOworICBtZWlnZW4gKz0gKG1hVC50cmFuc3Bvc2UoKSkgKiAobWJULnRyYW5zcG9zZSgpKTsKKyAgTVlWRVJJRlkobWVpZ2VuLmlzQXBwcm94KG1yZWYsIGVwcyksIlQgKiBUIik7CisKKyAgbWVpZ2VuID0gbXJlZiA9IG1jOworICBDQkxBU19HRU1NKENibGFzQ29sTWFqb3IsIENibGFzTm9UcmFucywgQ2JsYXNUcmFucywgTSwgTiwgSywgMSwgbWEuZGF0YSgpLCBNLCBtYlQuZGF0YSgpLCBOLCAxLCBtcmVmLmRhdGEoKSwgTSk7CisgIG1laWdlbiArPSBtYSAqIG1iVC50cmFuc3Bvc2UoKTsKKyAgTVlWRVJJRlkobWVpZ2VuLmlzQXBwcm94KG1yZWYsIGVwcyksIi4gKiBUIik7Cit9CisKK3ZvaWQgY2hlY2tfcHJvZHVjdCh2b2lkKQoreworICBpbnQgTSwgTiwgSzsKKyAgZm9yICh1aW50IGk9MDsgaTwxMDAwOyArK2kpCisgIHsKKyAgICBNID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsNjQpOworICAgIE4gPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSw3NjgpOworICAgIEsgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSw3NjgpOworICAgIE0gPSAoMCArIE0pICogMTsKKyAgICBzdGQ6OmNvdXQgPDwgTSA8PCAiIHggIiA8PCBOIDw8ICIgeCAiIDw8IEsgPDwgIlxuIjsKKyAgICBjaGVja19wcm9kdWN0KE0sIE4sIEspOworICB9Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoQ2hvbGVza3kuY3BwIGIvYmVuY2gvYmVuY2hDaG9sZXNreS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiM2UxMgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNoQ2hvbGVza3kuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisKKy8vIGcrKyAtRE5ERUJVRyAtTzMgLUkuLiBiZW5jaExMVC5jcHAgIC1vIGJlbmNoTExUICYmIC4vYmVuY2hMTFQKKy8vIG9wdGlvbnM6CisvLyAgLURCRU5DSF9HU0wgLWxnc2wgL3Vzci9saWIvbGliY2JsYXMuc28uMworLy8gIC1ERUlHRU5fRE9OVF9WRUNUT1JJWkUKKy8vICAtbXNzZTIKKy8vICAtRFJFUEVBVD0xMDAKKy8vICAtRFRSSUVTPTEwCisvLyAgLURTQ0FMQVI9ZG91YmxlCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+CisjaW5jbHVkZSA8YmVuY2gvQmVuY2hVdGlsLmg+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCAxMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgVFJJRVMKKyNkZWZpbmUgVFJJRVMgMTAKKyNlbmRpZgorCit0eXBlZGVmIGZsb2F0IFNjYWxhcjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB2b2lkIGJlbmNoTExUKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgaW50IGNvc3QgPSAwOworICBmb3IgKGludCBqPTA7IGo8cm93czsgKytqKQorICB7CisgICAgaW50IHIgPSBzdGQ6Om1heChyb3dzIC0gaiAtMSwwKTsKKyAgICBjb3N0ICs9IDIqKHIqaityK2opOworICB9CisKKyAgaW50IHJlcGVhdHMgPSAoUkVQRUFUKjEwMDApLyhyb3dzKnJvd3MpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFNxdWFyZU1hdHJpeFR5cGU7CisKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIFNxdWFyZU1hdHJpeFR5cGUgY292TWF0ID0gIGEgKiBhLmFkam9pbnQoKTsKKworICBCZW5jaFRpbWVyIHRpbWVyTm9TcXJ0LCB0aW1lclNxcnQ7CisKKyAgU2NhbGFyIGFjYyA9IDA7CisgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY292TWF0LnJvd3MoKS0xKTsKKyAgaW50IGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb3ZNYXQuY29scygpLTEpOworICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgeworICAgIHRpbWVyTm9TcXJ0LnN0YXJ0KCk7CisgICAgZm9yIChpbnQgaz0wOyBrPHJlcGVhdHM7ICsraykKKyAgICB7CisgICAgICBMRExUPFNxdWFyZU1hdHJpeFR5cGU+IGNob2xub3NxcnQoY292TWF0KTsKKyAgICAgIGFjYyArPSBjaG9sbm9zcXJ0Lm1hdHJpeEwoKS5jb2VmZihyLGMpOworICAgIH0KKyAgICB0aW1lck5vU3FydC5zdG9wKCk7CisgIH0KKworICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgeworICAgIHRpbWVyU3FydC5zdGFydCgpOworICAgIGZvciAoaW50IGs9MDsgazxyZXBlYXRzOyArK2spCisgICAgeworICAgICAgTExUPFNxdWFyZU1hdHJpeFR5cGU+IGNob2woY292TWF0KTsKKyAgICAgIGFjYyArPSBjaG9sLm1hdHJpeEwoKS5jb2VmZihyLGMpOworICAgIH0KKyAgICB0aW1lclNxcnQuc3RvcCgpOworICB9CisKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICAgIHN0ZDo6Y291dCA8PCAiZHluICAgIjsKKyAgZWxzZQorICAgIHN0ZDo6Y291dCA8PCAiZml4ZWQgIjsKKyAgc3RkOjpjb3V0IDw8IGNvdk1hdC5yb3dzKCkgPDwgIiBcdCIKKyAgICAgICAgICAgIDw8ICh0aW1lck5vU3FydC52YWx1ZSgpICogUkVQRUFUKSAvIHJlcGVhdHMgPDwgInMgIgorICAgICAgICAgICAgPDwgIigiIDw8IDFlLTYgKiBjb3N0KnJlcGVhdHMvdGltZXJOb1NxcnQudmFsdWUoKSA8PCAiIE1GTE9QUylcdCIKKyAgICAgICAgICAgIDw8ICh0aW1lclNxcnQudmFsdWUoKSAqIFJFUEVBVCkgLyByZXBlYXRzIDw8ICJzICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCAxZS02ICogY29zdCpyZXBlYXRzL3RpbWVyU3FydC52YWx1ZSgpIDw8ICIgTUZMT1BTKVxuIjsKKworCisgICNpZmRlZiBCRU5DSF9HU0wKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICB7CisgICAgdGltZXJTcXJ0LnJlc2V0KCk7CisKKyAgICBnc2xfbWF0cml4KiBnc2xDb3ZNYXQgPSBnc2xfbWF0cml4X2FsbG9jKGNvdk1hdC5yb3dzKCksY292TWF0LmNvbHMoKSk7CisgICAgZ3NsX21hdHJpeCogZ3NsQ29weSA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSxjb3ZNYXQuY29scygpKTsKKworICAgIGVpVG9Hc2woY292TWF0LCAmZ3NsQ292TWF0KTsKKyAgICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgICB7CisgICAgICB0aW1lclNxcnQuc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGs9MDsgazxyZXBlYXRzOyArK2spCisgICAgICB7CisgICAgICAgIGdzbF9tYXRyaXhfbWVtY3B5KGdzbENvcHksZ3NsQ292TWF0KTsKKyAgICAgICAgZ3NsX2xpbmFsZ19jaG9sZXNreV9kZWNvbXAoZ3NsQ29weSk7CisgICAgICAgIGFjYyArPSBnc2xfbWF0cml4X2dldChnc2xDb3B5LHIsYyk7CisgICAgICB9CisgICAgICB0aW1lclNxcnQuc3RvcCgpOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiIHwgXHQiCisgICAgICAgICAgICAgIDw8IHRpbWVyU3FydC52YWx1ZSgpICogUkVQRUFUIC8gcmVwZWF0cyA8PCAicyI7CisKKyAgICBnc2xfbWF0cml4X2ZyZWUoZ3NsQ292TWF0KTsKKyAgfQorICAjZW5kaWYKKyAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIC8vIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgb3B0aW1pemUgdG9vIG11Y2gKKyAgaWYgKGFjYz09MTIzKQorICAgIHN0ZDo6Y291dCA8PCBhY2M7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgIGNvbnN0IGludCBkeW5zaXplc1tdID0gezQsNiw4LDE2LDI0LDMyLDQ5LDY0LDEyOCwyNTYsNTEyLDkwMCwwfTsKKyAgc3RkOjpjb3V0IDw8ICJzaXplICAgICAgICAgICAgbm8gc3FydCAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIjsKKy8vICAgI2lmZGVmIEJFTkNIX0dTTAorLy8gICBzdGQ6OmNvdXQgPDwgIiAgICAgICBHU0wgKHN0YW5kYXJkICsgZG91YmxlICsgQVRMQVMpICAiOworLy8gICAjZW5kaWYKKyAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIGZvciAodWludCBpPTA7IGR5bnNpemVzW2ldPjA7ICsraSkKKyAgICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4oZHluc2l6ZXNbaV0sZHluc2l6ZXNbaV0pKTsKKworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLDIsMj4oKSk7CisgIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsMywzPigpKTsKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciw0LDQ+KCkpOworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLDUsNT4oKSk7CisgIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsNiw2PigpKTsKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciw3LDc+KCkpOworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLDgsOD4oKSk7CisgIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsMTIsMTI+KCkpOworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLDE2LDE2PigpKTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoRWlnZW5Tb2x2ZXIuY3BwIGIvYmVuY2gvYmVuY2hFaWdlblNvbHZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3OGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNoRWlnZW5Tb2x2ZXIuY3BwCkBAIC0wLDAgKzEsMjEyIEBACisKKy8vIGcrKyAtRE5ERUJVRyAtTzMgLUkuLiBiZW5jaEVpZ2VuU29sdmVyLmNwcCAgLW8gYmVuY2hFaWdlblNvbHZlciAmJiAuL2JlbmNoRWlnZW5Tb2x2ZXIKKy8vIG9wdGlvbnM6CisvLyAgLURCRU5DSF9HTU0KKy8vICAtREJFTkNIX0dTTCAtbGdzbCAvdXNyL2xpYi9saWJjYmxhcy5zby4zCisvLyAgLURFSUdFTl9ET05UX1ZFQ1RPUklaRQorLy8gIC1tc3NlMgorLy8gIC1EUkVQRUFUPTEwMAorLy8gIC1EVFJJRVM9MTAKKy8vICAtRFNDQUxBUj1kb3VibGUKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9RUj4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFV0aWwuaD4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEwMDAKKyNlbmRpZgorCisjaWZuZGVmIFRSSUVTCisjZGVmaW5lIFRSSUVTIDQKKyNlbmRpZgorCisjaWZuZGVmIFNDQUxBUgorI2RlZmluZSBTQ0FMQVIgZmxvYXQKKyNlbmRpZgorCit0eXBlZGVmIFNDQUxBUiBTY2FsYXI7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdm9pZCBiZW5jaEVpZ2VuU29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgaW50IHN0ZFJlcGVhdHMgPSBzdGQ6Om1heCgxLGludCgoUkVQRUFUKjEwMDApLyhyb3dzKnJvd3Mqc3FydChyb3dzKSkpKTsKKyAgaW50IHNhUmVwZWF0cyA9IHN0ZFJlcGVhdHMgKiA0OworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFNxdWFyZU1hdHJpeFR5cGU7CisKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIFNxdWFyZU1hdHJpeFR5cGUgY292TWF0ID0gIGEgKiBhLmFkam9pbnQoKTsKKworICBCZW5jaFRpbWVyIHRpbWVyU2EsIHRpbWVyU3RkOworCisgIFNjYWxhciBhY2MgPSAwOworICBpbnQgciA9IGludGVybmFsOjpyYW5kb208aW50PigwLGNvdk1hdC5yb3dzKCktMSk7CisgIGludCBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY292TWF0LmNvbHMoKS0xKTsKKyAgeworICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8U3F1YXJlTWF0cml4VHlwZT4gZWkoY292TWF0KTsKKyAgICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgICB7CisgICAgICB0aW1lclNhLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8c2FSZXBlYXRzOyArK2spCisgICAgICB7CisgICAgICAgIGVpLmNvbXB1dGUoY292TWF0KTsKKyAgICAgICAgYWNjICs9IGVpLmVpZ2VudmVjdG9ycygpLmNvZWZmKHIsYyk7CisgICAgICB9CisgICAgICB0aW1lclNhLnN0b3AoKTsKKyAgICB9CisgIH0KKworICB7CisgICAgRWlnZW5Tb2x2ZXI8U3F1YXJlTWF0cml4VHlwZT4gZWkoY292TWF0KTsKKyAgICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgICB7CisgICAgICB0aW1lclN0ZC5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPHN0ZFJlcGVhdHM7ICsraykKKyAgICAgIHsKKyAgICAgICAgZWkuY29tcHV0ZShjb3ZNYXQpOworICAgICAgICBhY2MgKz0gZWkuZWlnZW52ZWN0b3JzKCkuY29lZmYocixjKTsKKyAgICAgIH0KKyAgICAgIHRpbWVyU3RkLnN0b3AoKTsKKyAgICB9CisgIH0KKworICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgc3RkOjpjb3V0IDw8ICJkeW4gICAiOworICBlbHNlCisgICAgc3RkOjpjb3V0IDw8ICJmaXhlZCAiOworICBzdGQ6OmNvdXQgPDwgY292TWF0LnJvd3MoKSA8PCAiIFx0IgorICAgICAgICAgICAgPDwgdGltZXJTYS52YWx1ZSgpICogUkVQRUFUIC8gc2FSZXBlYXRzIDw8ICJzIFx0IgorICAgICAgICAgICAgPDwgdGltZXJTdGQudmFsdWUoKSAqIFJFUEVBVCAvIHN0ZFJlcGVhdHMgPDwgInMiOworCisgICNpZmRlZiBCRU5DSF9HTU0KKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICB7CisgICAgdGltZXJTYS5yZXNldCgpOworICAgIHRpbWVyU3RkLnJlc2V0KCk7CisKKyAgICBnbW06OmRlbnNlX21hdHJpeDxTY2FsYXI+IGdtbUNvdk1hdChjb3ZNYXQucm93cygpLGNvdk1hdC5jb2xzKCkpOworICAgIGdtbTo6ZGVuc2VfbWF0cml4PFNjYWxhcj4gZWlndmVjdChjb3ZNYXQucm93cygpLGNvdk1hdC5jb2xzKCkpOworICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZWlndmFsKGNvdk1hdC5yb3dzKCkpOworICAgIGVpVG9HbW0oY292TWF0LCBnbW1Db3ZNYXQpOworICAgIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQorICAgIHsKKyAgICAgIHRpbWVyU2Euc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGs9MDsgazxzYVJlcGVhdHM7ICsraykKKyAgICAgIHsKKyAgICAgICAgZ21tOjpzeW1tZXRyaWNfcXJfYWxnb3JpdGhtKGdtbUNvdk1hdCwgZWlndmFsLCBlaWd2ZWN0KTsKKyAgICAgICAgYWNjICs9IGVpZ3ZlY3QocixjKTsKKyAgICAgIH0KKyAgICAgIHRpbWVyU2Euc3RvcCgpOworICAgIH0KKyAgICAvLyB0aGUgbm9uLXNlbGZhZGpvaW50IHNvbHZlciBkb2VzIG5vdCBjb21wdXRlIHRoZSBlaWdlbiB2ZWN0b3JzCisvLyAgICAgZm9yIChpbnQgdD0wOyB0PFRSSUVTOyArK3QpCisvLyAgICAgeworLy8gICAgICAgdGltZXJTdGQuc3RhcnQoKTsKKy8vICAgICAgIGZvciAoaW50IGs9MDsgazxzdGRSZXBlYXRzOyArK2spCisvLyAgICAgICB7CisvLyAgICAgICAgIGdtbTo6aW1wbGljaXRfcXJfYWxnb3JpdGhtKGdtbUNvdk1hdCwgZWlndmFsLCBlaWd2ZWN0KTsKKy8vICAgICAgICAgYWNjICs9IGVpZ3ZlY3QocixjKTsKKy8vICAgICAgIH0KKy8vICAgICAgIHRpbWVyU3RkLnN0b3AoKTsKKy8vICAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIiB8IFx0IgorICAgICAgICAgICAgICA8PCB0aW1lclNhLnZhbHVlKCkgKiBSRVBFQVQgLyBzYVJlcGVhdHMgPDwgInMiCisgICAgICAgICAgICAgIDw8IC8qdGltZXJTdGQudmFsdWUoKSAqIFJFUEVBVCAvIHN0ZFJlcGVhdHMgPDwgInMiKi8gIiAgIG5hICAgIjsKKyAgfQorICAjZW5kaWYKKworICAjaWZkZWYgQkVOQ0hfR1NMCisgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgeworICAgIHRpbWVyU2EucmVzZXQoKTsKKyAgICB0aW1lclN0ZC5yZXNldCgpOworCisgICAgZ3NsX21hdHJpeCogZ3NsQ292TWF0ID0gZ3NsX21hdHJpeF9hbGxvYyhjb3ZNYXQucm93cygpLGNvdk1hdC5jb2xzKCkpOworICAgIGdzbF9tYXRyaXgqIGdzbENvcHkgPSBnc2xfbWF0cml4X2FsbG9jKGNvdk1hdC5yb3dzKCksY292TWF0LmNvbHMoKSk7CisgICAgZ3NsX21hdHJpeCogZWlndmVjdCA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSxjb3ZNYXQuY29scygpKTsKKyAgICBnc2xfdmVjdG9yKiBlaWd2YWwgID0gZ3NsX3ZlY3Rvcl9hbGxvYyhjb3ZNYXQucm93cygpKTsKKyAgICBnc2xfZWlnZW5fc3ltbXZfd29ya3NwYWNlKiBlaXN5bW0gPSBnc2xfZWlnZW5fc3ltbXZfYWxsb2MoY292TWF0LnJvd3MoKSk7CisgICAgCisgICAgZ3NsX21hdHJpeF9jb21wbGV4KiBlaWd2ZWN0eiA9IGdzbF9tYXRyaXhfY29tcGxleF9hbGxvYyhjb3ZNYXQucm93cygpLGNvdk1hdC5jb2xzKCkpOworICAgIGdzbF92ZWN0b3JfY29tcGxleCogZWlndmFseiAgPSBnc2xfdmVjdG9yX2NvbXBsZXhfYWxsb2MoY292TWF0LnJvd3MoKSk7CisgICAgZ3NsX2VpZ2VuX25vbnN5bW12X3dvcmtzcGFjZSogZWlub25zeW1tID0gZ3NsX2VpZ2VuX25vbnN5bW12X2FsbG9jKGNvdk1hdC5yb3dzKCkpOworICAgIAorICAgIGVpVG9Hc2woY292TWF0LCAmZ3NsQ292TWF0KTsKKyAgICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgICB7CisgICAgICB0aW1lclNhLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8c2FSZXBlYXRzOyArK2spCisgICAgICB7CisgICAgICAgIGdzbF9tYXRyaXhfbWVtY3B5KGdzbENvcHksZ3NsQ292TWF0KTsKKyAgICAgICAgZ3NsX2VpZ2VuX3N5bW12KGdzbENvcHksIGVpZ3ZhbCwgZWlndmVjdCwgZWlzeW1tKTsKKyAgICAgICAgYWNjICs9IGdzbF9tYXRyaXhfZ2V0KGVpZ3ZlY3QscixjKTsKKyAgICAgIH0KKyAgICAgIHRpbWVyU2Euc3RvcCgpOworICAgIH0KKyAgICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgICB7CisgICAgICB0aW1lclN0ZC5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPHN0ZFJlcGVhdHM7ICsraykKKyAgICAgIHsKKyAgICAgICAgZ3NsX21hdHJpeF9tZW1jcHkoZ3NsQ29weSxnc2xDb3ZNYXQpOworICAgICAgICBnc2xfZWlnZW5fbm9uc3ltbXYoZ3NsQ29weSwgZWlndmFseiwgZWlndmVjdHosIGVpbm9uc3ltbSk7CisgICAgICAgIGFjYyArPSBHU0xfUkVBTChnc2xfbWF0cml4X2NvbXBsZXhfZ2V0KGVpZ3ZlY3R6LHIsYykpOworICAgICAgfQorICAgICAgdGltZXJTdGQuc3RvcCgpOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiIHwgXHQiCisgICAgICAgICAgICAgIDw8IHRpbWVyU2EudmFsdWUoKSAqIFJFUEVBVCAvIHNhUmVwZWF0cyA8PCAicyBcdCIKKyAgICAgICAgICAgICAgPDwgdGltZXJTdGQudmFsdWUoKSAqIFJFUEVBVCAvIHN0ZFJlcGVhdHMgPDwgInMiOworCisgICAgZ3NsX21hdHJpeF9mcmVlKGdzbENvdk1hdCk7CisgICAgZ3NsX3ZlY3Rvcl9mcmVlKGdzbENvcHkpOworICAgIGdzbF9tYXRyaXhfZnJlZShlaWd2ZWN0KTsKKyAgICBnc2xfdmVjdG9yX2ZyZWUoZWlndmFsKTsKKyAgICBnc2xfbWF0cml4X2NvbXBsZXhfZnJlZShlaWd2ZWN0eik7CisgICAgZ3NsX3ZlY3Rvcl9jb21wbGV4X2ZyZWUoZWlndmFseik7CisgICAgZ3NsX2VpZ2VuX3N5bW12X2ZyZWUoZWlzeW1tKTsKKyAgICBnc2xfZWlnZW5fbm9uc3ltbXZfZnJlZShlaW5vbnN5bW0pOworICB9CisgICNlbmRpZgorCisgIHN0ZDo6Y291dCA8PCAiXG4iOworICAKKyAgLy8gbWFrZSBzdXJlIHRoZSBjb21waWxlciBkb2VzIG5vdCBvcHRpbWl6ZSB0b28gbXVjaAorICBpZiAoYWNjPT0xMjMpCisgICAgc3RkOjpjb3V0IDw8IGFjYzsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgY29uc3QgaW50IGR5bnNpemVzW10gPSB7NCw2LDgsMTIsMTYsMjQsMzIsNjQsMTI4LDI1Niw1MTIsMH07CisgIHN0ZDo6Y291dCA8PCAic2l6ZSAgICAgICAgICAgIHNlbGZhZGpvaW50ICAgICAgIGdlbmVyaWMiOworICAjaWZkZWYgQkVOQ0hfR01NCisgIHN0ZDo6Y291dCA8PCAiICAgICAgICBHTU0rKyAgICAgICAgICAiOworICAjZW5kaWYKKyAgI2lmZGVmIEJFTkNIX0dTTAorICBzdGQ6OmNvdXQgPDwgIiAgICAgICBHU0wgKGRvdWJsZSArIEFUTEFTKSAgIjsKKyAgI2VuZGlmCisgIHN0ZDo6Y291dCA8PCAiXG4iOworICBmb3IgKHVpbnQgaT0wOyBkeW5zaXplc1tpXT4wOyArK2kpCisgICAgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4oZHluc2l6ZXNbaV0sZHluc2l6ZXNbaV0pKTsKKworICBiZW5jaEVpZ2VuU29sdmVyKE1hdHJpeDxTY2FsYXIsMiwyPigpKTsKKyAgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLDMsMz4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciw0LDQ+KCkpOworICBiZW5jaEVpZ2VuU29sdmVyKE1hdHJpeDxTY2FsYXIsNiw2PigpKTsKKyAgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLDgsOD4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwxMiwxMj4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwxNiwxNj4oKSk7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaEZGVC5jcHAgYi9iZW5jaC9iZW5jaEZGVC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViMWExYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNoRkZULmNwcApAQCAtMCwwICsxLDExNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgTWFyayBCb3JnZXJkaW5nIG1hcmsgYSBib3JnZXJkaW5nIG5ldAorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8YmVuY2gvQmVuY2hVdGlsLmg+CisjaW5jbHVkZSA8Y29tcGxleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKworI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0ZGVD4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cmluZyBuYW1lb2YoKTsKKwordGVtcGxhdGUgPD4gc3RyaW5nIG5hbWVvZjxmbG9hdD4oKSB7cmV0dXJuICJmbG9hdCI7fQordGVtcGxhdGUgPD4gc3RyaW5nIG5hbWVvZjxkb3VibGU+KCkge3JldHVybiAiZG91YmxlIjt9Cit0ZW1wbGF0ZSA8PiBzdHJpbmcgbmFtZW9mPGxvbmcgZG91YmxlPigpIHtyZXR1cm4gImxvbmcgZG91YmxlIjt9CisKKyNpZm5kZWYgVFlQRQorI2RlZmluZSBUWVBFIGZsb2F0CisjZW5kaWYKKworI2lmbmRlZiBORkZUCisjZGVmaW5lIE5GRlQgMTAyNAorI2VuZGlmCisjaWZuZGVmIE5EQVRBCisjZGVmaW5lIE5EQVRBIDEwMDAwMDAKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBiZW5jaChpbnQgbmZmdCxib29sIGZ3ZCxib29sIHVuc2NhbGVkPWZhbHNlLCBib29sIGhhbGZzcGVjPWZhbHNlKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFQ+OjpSZWFsIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tcGxleDxTY2FsYXI+IENvbXBsZXg7CisgICAgaW50IG5pdHMgPSBOREFUQS9uZmZ0OworICAgIHZlY3RvcjxUPiBpbmJ1ZihuZmZ0KTsKKyAgICB2ZWN0b3I8Q29tcGxleCA+IG91dGJ1ZihuZmZ0KTsKKyAgICBGRlQ8IFNjYWxhciA+IGZmdDsKKworICAgIGlmICh1bnNjYWxlZCkgeworICAgICAgICBmZnQuU2V0RmxhZyhmZnQuVW5zY2FsZWQpOworICAgICAgICBjb3V0IDw8ICJ1bnNjYWxlZCAiOworICAgIH0KKyAgICBpZiAoaGFsZnNwZWMpIHsKKyAgICAgICAgZmZ0LlNldEZsYWcoZmZ0LkhhbGZTcGVjdHJ1bSk7CisgICAgICAgIGNvdXQgPDwgImhhbGZzcGVjICI7CisgICAgfQorCisKKyAgICBzdGQ6OmZpbGwoaW5idWYuYmVnaW4oKSxpbmJ1Zi5lbmQoKSwwKTsKKyAgICBmZnQuZndkKCBvdXRidWYgLCBpbmJ1Zik7CisKKyAgICBCZW5jaFRpbWVyIHRpbWVyOworICAgIHRpbWVyLnJlc2V0KCk7CisgICAgZm9yIChpbnQgaz0wO2s8ODsrK2spIHsKKyAgICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgICAgaWYgKGZ3ZCkKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuaXRzOyBpKyspCisgICAgICAgICAgICAgICAgZmZ0LmZ3ZCggb3V0YnVmICwgaW5idWYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbml0czsgaSsrKQorICAgICAgICAgICAgICAgIGZmdC5pbnYoaW5idWYsb3V0YnVmKTsKKyAgICAgICAgdGltZXIuc3RvcCgpOworICAgIH0KKworICAgIGNvdXQgPDwgbmFtZW9mPFNjYWxhcj4oKSA8PCAiICI7CisgICAgZG91YmxlIG1mbG9wcyA9IDUuKm5mZnQqbG9nMigoZG91YmxlKW5mZnQpIC8gKDFlNiAqIHRpbWVyLnZhbHVlKCkgLyAoZG91YmxlKW5pdHMgKTsKKyAgICBpZiAoIE51bVRyYWl0czxUPjo6SXNDb21wbGV4ICkgeworICAgICAgICBjb3V0IDw8ICJjb21wbGV4IjsKKyAgICB9ZWxzZXsKKyAgICAgICAgY291dCA8PCAicmVhbCAgICI7CisgICAgICAgIG1mbG9wcyAvPSAyOworICAgIH0KKworCisgICAgaWYgKGZ3ZCkKKyAgICAgICAgY291dCA8PCAiIGZ3ZCI7CisgICAgZWxzZQorICAgICAgICBjb3V0IDw8ICIgaW52IjsKKworICAgIGNvdXQgPDwgIiBORkZUPSIgPDwgbmZmdCA8PCAiICAiIDw8IChkb3VibGUoMWUtNipuZmZ0Km5pdHMpL3RpbWVyLnZhbHVlKCkpIDw8ICIgTVMvcyAgIiA8PCBtZmxvcHMgPDwgIk1GTE9QU1xuIjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsY2hhciAqKiBhcmd2KQoreworICAgIGJlbmNoPGNvbXBsZXg8ZmxvYXQ+ID4oTkZGVCx0cnVlKTsKKyAgICBiZW5jaDxjb21wbGV4PGZsb2F0PiA+KE5GRlQsZmFsc2UpOworICAgIGJlbmNoPGZsb2F0PihORkZULHRydWUpOworICAgIGJlbmNoPGZsb2F0PihORkZULGZhbHNlKTsKKyAgICBiZW5jaDxmbG9hdD4oTkZGVCxmYWxzZSx0cnVlKTsKKyAgICBiZW5jaDxmbG9hdD4oTkZGVCxmYWxzZSx0cnVlLHRydWUpOworCisgICAgYmVuY2g8Y29tcGxleDxkb3VibGU+ID4oTkZGVCx0cnVlKTsKKyAgICBiZW5jaDxjb21wbGV4PGRvdWJsZT4gPihORkZULGZhbHNlKTsKKyAgICBiZW5jaDxkb3VibGU+KE5GRlQsdHJ1ZSk7CisgICAgYmVuY2g8ZG91YmxlPihORkZULGZhbHNlKTsKKyAgICBiZW5jaDxjb21wbGV4PGxvbmcgZG91YmxlPiA+KE5GRlQsdHJ1ZSk7CisgICAgYmVuY2g8Y29tcGxleDxsb25nIGRvdWJsZT4gPihORkZULGZhbHNlKTsKKyAgICBiZW5jaDxsb25nIGRvdWJsZT4oTkZGVCx0cnVlKTsKKyAgICBiZW5jaDxsb25nIGRvdWJsZT4oTkZGVCxmYWxzZSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaFZlY0FkZC5jcHAgYi9iZW5jaC9iZW5jaFZlY0FkZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4ZTFlOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNoVmVjQWRkLmNwcApAQCAtMCwwICsxLDEzNSBAQAorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFRpbWVyLmg+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDUwCisjZW5kaWYKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEwMDAwCisjZW5kaWYKKwordHlwZWRlZiBmbG9hdCBTY2FsYXI7CisKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpIHZvaWQgYmVuY2hWZWMoU2NhbGFyKiBhLCBTY2FsYXIqIGIsIFNjYWxhciogYywgaW50IHNpemUpOworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdm9pZCBiZW5jaFZlYyhNYXRyaXhYZiYgYSwgTWF0cml4WGYmIGIsIE1hdHJpeFhmJiBjKTsKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpIHZvaWQgYmVuY2hWZWMoVmVjdG9yWGYmIGEsIFZlY3RvclhmJiBiLCBWZWN0b3JYZiYgYyk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgICAgaW50IHNpemUgPSBTSVpFICogODsKKyAgICBpbnQgc2l6ZTIgPSBzaXplICogc2l6ZTsKKyAgICBTY2FsYXIqIGEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplMik7CisgICAgU2NhbGFyKiBiID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PFNjYWxhcj4oc2l6ZTIrNCkrMTsKKyAgICBTY2FsYXIqIGMgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplMik7IAorICAgIAorICAgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgICAgeworICAgICAgICBhW2ldID0gYltpXSA9IGNbaV0gPSAwOworICAgIH0KKyAgICAKKyAgICBCZW5jaFRpbWVyIHRpbWVyOworICAgIAorICAgIHRpbWVyLnJlc2V0KCk7CisgICAgZm9yIChpbnQgaz0wOyBrPDEwOyArK2spCisgICAgeworICAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgICBiZW5jaFZlYyhhLCBiLCBjLCBzaXplMik7CisgICAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICB9CisgICAgc3RkOjpjb3V0IDw8IHRpbWVyLnZhbHVlKCkgPDwgInMgICIgPDwgKGRvdWJsZShzaXplMipSRVBFQVQpL3RpbWVyLnZhbHVlKCkpLygxMDI0LioxMDI0LioxMDI0LikgPDwgIiBHRmxvcHNcbiI7CisgICAgcmV0dXJuIDA7CisgICAgZm9yIChpbnQgaW5uZXJzaXplID0gc2l6ZTsgaW5uZXJzaXplPjIgOyAtLWlubmVyc2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChzaXplMiVpbm5lcnNpemU9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvdXRlcnNpemUgPSBzaXplMi9pbm5lcnNpemU7CisgICAgICAgICAgICBNYXRyaXhYZiBtYSA9IE1hcDxNYXRyaXhYZj4oYSwgaW5uZXJzaXplLCBvdXRlcnNpemUgKTsKKyAgICAgICAgICAgIE1hdHJpeFhmIG1iID0gTWFwPE1hdHJpeFhmPihiLCBpbm5lcnNpemUsIG91dGVyc2l6ZSApOworICAgICAgICAgICAgTWF0cml4WGYgbWMgPSBNYXA8TWF0cml4WGY+KGMsIGlubmVyc2l6ZSwgb3V0ZXJzaXplICk7CisgICAgICAgICAgICB0aW1lci5yZXNldCgpOworICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrPDM7ICsraykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgICAgICAgICAgIGJlbmNoVmVjKG1hLCBtYiwgbWMpOworICAgICAgICAgICAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBpbm5lcnNpemUgPDwgIiB4ICIgPDwgb3V0ZXJzaXplIDw8ICIgICIgPDwgdGltZXIudmFsdWUoKSA8PCAicyAgICIgPDwgKGRvdWJsZShzaXplMipSRVBFQVQpL3RpbWVyLnZhbHVlKCkpLygxMDI0LioxMDI0LioxMDI0LikgPDwgIiBHRmxvcHNcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgVmVjdG9yWGYgdmEgPSBNYXA8VmVjdG9yWGY+KGEsIHNpemUyKTsKKyAgICBWZWN0b3JYZiB2YiA9IE1hcDxWZWN0b3JYZj4oYiwgc2l6ZTIpOworICAgIFZlY3RvclhmIHZjID0gTWFwPFZlY3RvclhmPihjLCBzaXplMik7CisgICAgdGltZXIucmVzZXQoKTsKKyAgICBmb3IgKGludCBrPTA7IGs8MzsgKytrKQorICAgIHsKKyAgICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgICAgYmVuY2hWZWModmEsIHZiLCB2Yyk7CisgICAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICB9CisgICAgc3RkOjpjb3V0IDw8IHRpbWVyLnZhbHVlKCkgPDwgInMgICAiIDw8IChkb3VibGUoc2l6ZTIqUkVQRUFUKS90aW1lci52YWx1ZSgpKS8oMTAyNC4qMTAyNC4qMTAyNC4pIDw8ICIgR0Zsb3BzXG4iOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYmVuY2hWZWMoTWF0cml4WGYmIGEsIE1hdHJpeFhmJiBiLCBNYXRyaXhYZiYgYykKK3sKKyAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgICAgIGEgPSBhICsgYjsKK30KKwordm9pZCBiZW5jaFZlYyhWZWN0b3JYZiYgYSwgVmVjdG9yWGYmIGIsIFZlY3RvclhmJiBjKQoreworICAgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKKyAgICAgICAgYSA9IGEgKyBiOworfQorCit2b2lkIGJlbmNoVmVjKFNjYWxhciogYSwgU2NhbGFyKiBiLCBTY2FsYXIqIGMsIGludCBzaXplKQoreworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7CisgICAgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOworICAgIFBhY2tldFNjYWxhciBhMCwgYTEsIGEyLCBhMywgYjAsIGIxLCBiMiwgYjM7CisgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSs9UGFja2V0U2l6ZSo4KQorICAgICAgICB7CisvLyAgICAgICAgICAgICBhMCA9IGludGVybmFsOjpwbG9hZCgmYVtpXSk7CisvLyAgICAgICAgICAgICBiMCA9IGludGVybmFsOjpwbG9hZCgmYltpXSk7CisvLyAgICAgICAgICAgICBhMSA9IGludGVybmFsOjpwbG9hZCgmYVtpKzEqUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgICAgYjEgPSBpbnRlcm5hbDo6cGxvYWQoJmJbaSsxKlBhY2tldFNpemVdKTsKKy8vICAgICAgICAgICAgIGEyID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krMipQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICBiMiA9IGludGVybmFsOjpwbG9hZCgmYltpKzIqUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgICAgYTMgPSBpbnRlcm5hbDo6cGxvYWQoJmFbaSszKlBhY2tldFNpemVdKTsKKy8vICAgICAgICAgICAgIGIzID0gaW50ZXJuYWw6OnBsb2FkKCZiW2krMypQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2ldLCBpbnRlcm5hbDo6cGFkZChhMCwgYjApKTsKKy8vICAgICAgICAgICAgIGEwID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krNCpQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICBiMCA9IGludGVybmFsOjpwbG9hZCgmYltpKzQqUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgICAgCisvLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krMSpQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTEsIGIxKSk7CisvLyAgICAgICAgICAgICBhMSA9IGludGVybmFsOjpwbG9hZCgmYVtpKzUqUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgICAgYjEgPSBpbnRlcm5hbDo6cGxvYWQoJmJbaSs1KlBhY2tldFNpemVdKTsKKy8vICAgICAgICAgICAgIAorLy8gICAgICAgICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpKzIqUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGEyLCBiMikpOworLy8gICAgICAgICAgICAgYTIgPSBpbnRlcm5hbDo6cGxvYWQoJmFbaSs2KlBhY2tldFNpemVdKTsKKy8vICAgICAgICAgICAgIGIyID0gaW50ZXJuYWw6OnBsb2FkKCZiW2krNipQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICAKKy8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSszKlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMywgYjMpKTsKKy8vICAgICAgICAgICAgIGEzID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krNypQYWNrZXRTaXplXSk7CisvLyAgICAgICAgICAgICBiMyA9IGludGVybmFsOjpwbG9hZCgmYltpKzcqUGFja2V0U2l6ZV0pOworLy8gICAgICAgICAgICAgCisvLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNCpQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTAsIGIwKSk7CisvLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNSpQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTEsIGIxKSk7CisvLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNipQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTIsIGIyKSk7CisvLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNypQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTMsIGIzKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSsyKlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChpbnRlcm5hbDo6cGxvYWR1KCZhW2krMipQYWNrZXRTaXplXSksIGludGVybmFsOjpwbG9hZHUoJmJbaSsyKlBhY2tldFNpemVdKSkpOworICAgICAgICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpKzMqUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGludGVybmFsOjpwbG9hZHUoJmFbaSszKlBhY2tldFNpemVdKSwgaW50ZXJuYWw6OnBsb2FkdSgmYltpKzMqUGFja2V0U2l6ZV0pKSk7CisgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNCpQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoaW50ZXJuYWw6OnBsb2FkdSgmYVtpKzQqUGFja2V0U2l6ZV0pLCBpbnRlcm5hbDo6cGxvYWR1KCZiW2krNCpQYWNrZXRTaXplXSkpKTsKKyAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs1KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChpbnRlcm5hbDo6cGxvYWR1KCZhW2krNSpQYWNrZXRTaXplXSksIGludGVybmFsOjpwbG9hZHUoJmJbaSs1KlBhY2tldFNpemVdKSkpOworICAgICAgICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpKzYqUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGludGVybmFsOjpwbG9hZHUoJmFbaSs2KlBhY2tldFNpemVdKSwgaW50ZXJuYWw6OnBsb2FkdSgmYltpKzYqUGFja2V0U2l6ZV0pKSk7CisgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNypQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoaW50ZXJuYWw6OnBsb2FkdSgmYVtpKzcqUGFja2V0U2l6ZV0pLCBpbnRlcm5hbDo6cGxvYWR1KCZiW2krNypQYWNrZXRTaXplXSkpKTsKKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hfZ2VtbS5jcHAgYi9iZW5jaC9iZW5jaF9nZW1tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGFjMzRlCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2hfZ2VtbS5jcHAKQEAgLTAsMCArMSwyNzEgQEAKKworLy8gZysrLTQuNCBiZW5jaF9nZW1tLmNwcCAtSSAuLiAtTzIgLUROREVCVUcgLWxydCAtZm9wZW5tcCAmJiBPTVBfTlVNX1RIUkVBRFM9MiAgLi9hLm91dAorLy8gaWNwYyBiZW5jaF9nZW1tLmNwcCAtSSAuLiAtTzMgLUROREVCVUcgLWxydCAtb3Blbm1wICAmJiBPTVBfTlVNX1RIUkVBRFM9MiAgLi9hLm91dAorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFRpbWVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgU0NBTEFSCisvLyAjZGVmaW5lIFNDQUxBUiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+CisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKK3R5cGVkZWYgU0NBTEFSIFNjYWxhcjsKK3R5cGVkZWYgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKK3R5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBBOwordHlwZWRlZiBNYXRyaXg8LypSZWFsKi9TY2FsYXIsRHluYW1pYyxEeW5hbWljPiBCOwordHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gQzsKK3R5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNOworCisjaWZkZWYgSEFWRV9CTEFTCisKK2V4dGVybiAiQyIgeworICAjaW5jbHVkZSA8YmVuY2gvYnRsL2xpYnMvQ19CTEFTL2JsYXMuaD4KK30KKworc3RhdGljIGZsb2F0IGZvbmUgPSAxOworc3RhdGljIGZsb2F0IGZ6ZXJvID0gMDsKK3N0YXRpYyBkb3VibGUgZG9uZSA9IDE7CitzdGF0aWMgZG91YmxlIHN6ZXJvID0gMDsKK3N0YXRpYyBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGNmb25lID0gMTsKK3N0YXRpYyBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGNmemVybyA9IDA7CitzdGF0aWMgc3RkOjpjb21wbGV4PGRvdWJsZT4gY2RvbmUgPSAxOworc3RhdGljIHN0ZDo6Y29tcGxleDxkb3VibGU+IGNkemVybyA9IDA7CitzdGF0aWMgY2hhciBub3RyYW5zID0gJ04nOworc3RhdGljIGNoYXIgdHJhbnMgPSAnVCc7ICAKK3N0YXRpYyBjaGFyIG5vbnVuaXQgPSAnTic7CitzdGF0aWMgY2hhciBsb3dlciA9ICdMJzsKK3N0YXRpYyBjaGFyIHJpZ2h0ID0gJ1InOworc3RhdGljIGludCBpbnRvbmUgPSAxOworCit2b2lkIGJsYXNfZ2VtbShjb25zdCBNYXRyaXhYZiYgYSwgY29uc3QgTWF0cml4WGYmIGIsIE1hdHJpeFhmJiBjKQoreworICBpbnQgTSA9IGMucm93cygpOyBpbnQgTiA9IGMuY29scygpOyBpbnQgSyA9IGEuY29scygpOworICBpbnQgbGRhID0gYS5yb3dzKCk7IGludCBsZGIgPSBiLnJvd3MoKTsgaW50IGxkYyA9IGMucm93cygpOworCisgIHNnZW1tXygmbm90cmFucywmbm90cmFucywmTSwmTiwmSywmZm9uZSwKKyAgICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQqPihhLmRhdGEoKSksJmxkYSwKKyAgICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQqPihiLmRhdGEoKSksJmxkYiwmZm9uZSwKKyAgICAgICAgIGMuZGF0YSgpLCZsZGMpOworfQorCitFSUdFTl9ET05UX0lOTElORSB2b2lkIGJsYXNfZ2VtbShjb25zdCBNYXRyaXhYZCYgYSwgY29uc3QgTWF0cml4WGQmIGIsIE1hdHJpeFhkJiBjKQoreworICBpbnQgTSA9IGMucm93cygpOyBpbnQgTiA9IGMuY29scygpOyBpbnQgSyA9IGEuY29scygpOworICBpbnQgbGRhID0gYS5yb3dzKCk7IGludCBsZGIgPSBiLnJvd3MoKTsgaW50IGxkYyA9IGMucm93cygpOworCisgIGRnZW1tXygmbm90cmFucywmbm90cmFucywmTSwmTiwmSywmZG9uZSwKKyAgICAgICAgIGNvbnN0X2Nhc3Q8ZG91YmxlKj4oYS5kYXRhKCkpLCZsZGEsCisgICAgICAgICBjb25zdF9jYXN0PGRvdWJsZSo+KGIuZGF0YSgpKSwmbGRiLCZkb25lLAorICAgICAgICAgYy5kYXRhKCksJmxkYyk7Cit9CisKK3ZvaWQgYmxhc19nZW1tKGNvbnN0IE1hdHJpeFhjZiYgYSwgY29uc3QgTWF0cml4WGNmJiBiLCBNYXRyaXhYY2YmIGMpCit7CisgIGludCBNID0gYy5yb3dzKCk7IGludCBOID0gYy5jb2xzKCk7IGludCBLID0gYS5jb2xzKCk7CisgIGludCBsZGEgPSBhLnJvd3MoKTsgaW50IGxkYiA9IGIucm93cygpOyBpbnQgbGRjID0gYy5yb3dzKCk7CisKKyAgY2dlbW1fKCZub3RyYW5zLCZub3RyYW5zLCZNLCZOLCZLLChmbG9hdCopJmNmb25lLAorICAgICAgICAgY29uc3RfY2FzdDxmbG9hdCo+KChjb25zdCBmbG9hdCopYS5kYXRhKCkpLCZsZGEsCisgICAgICAgICBjb25zdF9jYXN0PGZsb2F0Kj4oKGNvbnN0IGZsb2F0KiliLmRhdGEoKSksJmxkYiwoZmxvYXQqKSZjZm9uZSwKKyAgICAgICAgIChmbG9hdCopYy5kYXRhKCksJmxkYyk7Cit9CisKK3ZvaWQgYmxhc19nZW1tKGNvbnN0IE1hdHJpeFhjZCYgYSwgY29uc3QgTWF0cml4WGNkJiBiLCBNYXRyaXhYY2QmIGMpCit7CisgIGludCBNID0gYy5yb3dzKCk7IGludCBOID0gYy5jb2xzKCk7IGludCBLID0gYS5jb2xzKCk7CisgIGludCBsZGEgPSBhLnJvd3MoKTsgaW50IGxkYiA9IGIucm93cygpOyBpbnQgbGRjID0gYy5yb3dzKCk7CisKKyAgemdlbW1fKCZub3RyYW5zLCZub3RyYW5zLCZNLCZOLCZLLChkb3VibGUqKSZjZG9uZSwKKyAgICAgICAgIGNvbnN0X2Nhc3Q8ZG91YmxlKj4oKGNvbnN0IGRvdWJsZSopYS5kYXRhKCkpLCZsZGEsCisgICAgICAgICBjb25zdF9jYXN0PGRvdWJsZSo+KChjb25zdCBkb3VibGUqKWIuZGF0YSgpKSwmbGRiLChkb3VibGUqKSZjZG9uZSwKKyAgICAgICAgIChkb3VibGUqKWMuZGF0YSgpLCZsZGMpOworfQorCisKKworI2VuZGlmCisKK3ZvaWQgbWF0bGFiX2NwbHhfY3BseChjb25zdCBNJiBhciwgY29uc3QgTSYgYWksIGNvbnN0IE0mIGJyLCBjb25zdCBNJiBiaSwgTSYgY3IsIE0mIGNpKQoreworICBjci5ub2FsaWFzKCkgKz0gYXIgKiBicjsKKyAgY3Iubm9hbGlhcygpIC09IGFpICogYmk7CisgIGNpLm5vYWxpYXMoKSArPSBhciAqIGJpOworICBjaS5ub2FsaWFzKCkgKz0gYWkgKiBicjsKK30KKwordm9pZCBtYXRsYWJfcmVhbF9jcGx4KGNvbnN0IE0mIGEsIGNvbnN0IE0mIGJyLCBjb25zdCBNJiBiaSwgTSYgY3IsIE0mIGNpKQoreworICBjci5ub2FsaWFzKCkgKz0gYSAqIGJyOworICBjaS5ub2FsaWFzKCkgKz0gYSAqIGJpOworfQorCit2b2lkIG1hdGxhYl9jcGx4X3JlYWwoY29uc3QgTSYgYXIsIGNvbnN0IE0mIGFpLCBjb25zdCBNJiBiLCBNJiBjciwgTSYgY2kpCit7CisgIGNyLm5vYWxpYXMoKSArPSBhciAqIGI7CisgIGNpLm5vYWxpYXMoKSArPSBhaSAqIGI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEIsIHR5cGVuYW1lIEM+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGdlbW0oY29uc3QgQSYgYSwgY29uc3QgQiYgYiwgQyYgYykKK3sKKyBjLm5vYWxpYXMoKSArPSBhICogYjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKK3sKKyAgc3RkOjpwdHJkaWZmX3QgbDEgPSBpbnRlcm5hbDo6cXVlcnlMMUNhY2hlU2l6ZSgpOworICBzdGQ6OnB0cmRpZmZfdCBsMiA9IGludGVybmFsOjpxdWVyeVRvcExldmVsQ2FjaGVTaXplKCk7CisgIHN0ZDo6Y291dCA8PCAiTDEgY2FjaGUgc2l6ZSAgICAgPSAiIDw8IChsMT4wID8gbDEvMTAyNCA6IC0xKSA8PCAiIEtCXG4iOworICBzdGQ6OmNvdXQgPDwgIkwyL0wzIGNhY2hlIHNpemUgID0gIiA8PCAobDI+MCA/IGwyLzEwMjQgOiAtMSkgPDwgIiBLQlxuIjsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6Z2VicF90cmFpdHM8U2NhbGFyLFNjYWxhcj4gVHJhaXRzOworICBzdGQ6OmNvdXQgPDwgIlJlZ2lzdGVyIGJsb2NraW5nID0gIiA8PCBUcmFpdHM6Om1yIDw8ICIgeCAiIDw8IFRyYWl0czo6bnIgPDwgIlxuIjsKKworICBpbnQgcmVwID0gMTsgICAgLy8gbnVtYmVyIG9mIHJlcGV0aXRpb25zIHBlciB0cnkKKyAgaW50IHRyaWVzID0gMjsgIC8vIG51bWJlciBvZiB0cmllcywgd2Uga2VlcCB0aGUgYmVzdAorCisgIGludCBzID0gMjA0ODsKKyAgaW50IGNhY2hlX3NpemUgPSAtMTsKKworICBib29sIG5lZWRfaGVscCA9IGZhbHNlOworICBmb3IgKGludCBpPTE7IGk8YXJnYzsgKytpKQorICB7CisgICAgaWYoYXJndltpXVswXT09J3MnKQorICAgICAgcyA9IGF0b2koYXJndltpXSsxKTsKKyAgICBlbHNlIGlmKGFyZ3ZbaV1bMF09PSdjJykKKyAgICAgIGNhY2hlX3NpemUgPSBhdG9pKGFyZ3ZbaV0rMSk7CisgICAgZWxzZSBpZihhcmd2W2ldWzBdPT0ndCcpCisgICAgICB0cmllcyA9IGF0b2koYXJndltpXSsxKTsKKyAgICBlbHNlIGlmKGFyZ3ZbaV1bMF09PSdwJykKKyAgICAgIHJlcCA9IGF0b2koYXJndltpXSsxKTsKKyAgICBlbHNlCisgICAgICBuZWVkX2hlbHAgPSB0cnVlOworICB9CisKKyAgaWYobmVlZF9oZWxwKQorICB7CisgICAgc3RkOjpjb3V0IDw8IGFyZ3ZbMF0gPDwgIiBzPG1hdHJpeCBzaXplPiBjPGNhY2hlIHNpemU+IHQ8bmIgdHJpZXM+IHA8bmIgcmVwZWF0cz5cbiI7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZihjYWNoZV9zaXplPjApCisgICAgc2V0Q3B1Q2FjaGVTaXplcyhjYWNoZV9zaXplLDk2KmNhY2hlX3NpemUpOworCisgIGludCBtID0gczsKKyAgaW50IG4gPSBzOworICBpbnQgcCA9IHM7CisgIEEgYShtLHApOyBhLnNldFJhbmRvbSgpOworICBCIGIocCxuKTsgYi5zZXRSYW5kb20oKTsKKyAgQyBjKG0sbik7IGMuc2V0T25lcygpOworICBDIHJjID0gYzsKKworICBzdGQ6OmNvdXQgPDwgIk1hdHJpeCBzaXplcyA9ICIgPDwgbSA8PCAieCIgPDwgcCA8PCAiICogIiA8PCBwIDw8ICJ4IiA8PCBuIDw8ICJcbiI7CisgIHN0ZDo6cHRyZGlmZl90IG1jKG0pLCBuYyhuKSwga2MocCk7CisgIGludGVybmFsOjpjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8U2NhbGFyLFNjYWxhcj4oa2MsIG1jLCBuYyk7CisgIHN0ZDo6Y291dCA8PCAiYmxvY2tpbmcgc2l6ZSAobWMgeCBrYykgPSAiIDw8IG1jIDw8ICIgeCAiIDw8IGtjIDw8ICJcbiI7CisKKyAgQyByID0gYzsKKworICAvLyBjaGVjayB0aGUgcGFyYWxsZWwgcHJvZHVjdCBpcyBjb3JyZWN0CisgICNpZiBkZWZpbmVkIEVJR0VOX0hBU19PUEVOTVAKKyAgaW50IHByb2NzID0gb21wX2dldF9tYXhfdGhyZWFkcygpOworICBpZihwcm9jcz4xKQorICB7CisgICAgI2lmZGVmIEhBVkVfQkxBUworICAgIGJsYXNfZ2VtbShhLGIscik7CisgICAgI2Vsc2UKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKDEpOworICAgIHIubm9hbGlhcygpICs9IGEgKiBiOworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMocHJvY3MpOworICAgICNlbmRpZgorICAgIGMubm9hbGlhcygpICs9IGEgKiBiOworICAgIGlmKCFyLmlzQXBwcm94KGMpKSBzdGQ6OmNlcnIgPDwgIldhcm5pbmcsIHlvdXIgcGFyYWxsZWwgcHJvZHVjdCBpcyBjcmFwIVxuXG4iOworICB9CisgICNlbGlmIGRlZmluZWQgSEFWRV9CTEFTCisgICAgYmxhc19nZW1tKGEsYixyKTsKKyAgICBjLm5vYWxpYXMoKSArPSBhICogYjsKKyAgICBpZighci5pc0FwcHJveChjKSkgc3RkOjpjZXJyIDw8ICJXYXJuaW5nLCB5b3VyIHByb2R1Y3QgaXMgY3JhcCFcblxuIjsKKyAgI2Vsc2UKKyAgICBnZW1tKGEsYixjKTsKKyAgICByLm5vYWxpYXMoKSArPSBhLmNhc3Q8U2NhbGFyPigpICogYi5jYXN0PFNjYWxhcj4oKTsKKyAgICBpZighci5pc0FwcHJveChjKSkgc3RkOjpjZXJyIDw8ICJXYXJuaW5nLCB5b3VyIHByb2R1Y3QgaXMgY3JhcCFcblxuIjsKKyAgI2VuZGlmCisKKyAgI2lmZGVmIEhBVkVfQkxBUworICBCZW5jaFRpbWVyIHRibGFzOworICBjID0gcmM7CisgIEJFTkNIKHRibGFzLCB0cmllcywgcmVwLCBibGFzX2dlbW0oYSxiLGMpKTsKKyAgc3RkOjpjb3V0IDw8ICJibGFzICBjcHUgICAgICAgICAiIDw8IHRibGFzLmJlc3QoQ1BVX1RJTUVSKS9yZXAgIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdGJsYXMuYmVzdChDUFVfVElNRVIpKSoxZS05ICA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0Ymxhcy50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7CisgIHN0ZDo6Y291dCA8PCAiYmxhcyAgcmVhbCAgICAgICAgIiA8PCB0Ymxhcy5iZXN0KFJFQUxfVElNRVIpL3JlcCA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3RibGFzLmJlc3QoUkVBTF9USU1FUikpKjFlLTkgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdGJsYXMudG90YWwoUkVBTF9USU1FUikgPDwgInMpXG4iOworICAjZW5kaWYKKworICBCZW5jaFRpbWVyIHRtdDsKKyAgYyA9IHJjOworICBCRU5DSCh0bXQsIHRyaWVzLCByZXAsIGdlbW0oYSxiLGMpKTsKKyAgc3RkOjpjb3V0IDw8ICJlaWdlbiBjcHUgICAgICAgICAiIDw8IHRtdC5iZXN0KENQVV9USU1FUikvcmVwICA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3RtdC5iZXN0KENQVV9USU1FUikpKjFlLTkgIDw8ICAiIEdGTE9QUyBcdCgiIDw8IHRtdC50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7CisgIHN0ZDo6Y291dCA8PCAiZWlnZW4gcmVhbCAgICAgICAgIiA8PCB0bXQuYmVzdChSRUFMX1RJTUVSKS9yZXAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90bXQuYmVzdChSRUFMX1RJTUVSKSkqMWUtOSA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0bXQudG90YWwoUkVBTF9USU1FUikgPDwgInMpXG4iOworCisgICNpZmRlZiBFSUdFTl9IQVNfT1BFTk1QCisgIGlmKHByb2NzPjEpCisgIHsKKyAgICBCZW5jaFRpbWVyIHRtb25vOworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMoMSk7CisgICAgRWlnZW46OmludGVybmFsOjpzZXROYlRocmVhZHMoMSk7CisgICAgYyA9IHJjOworICAgIEJFTkNIKHRtb25vLCB0cmllcywgcmVwLCBnZW1tKGEsYixjKSk7CisgICAgc3RkOjpjb3V0IDw8ICJlaWdlbiBtb25vIGNwdSAgICAiIDw8IHRtb25vLmJlc3QoQ1BVX1RJTUVSKS9yZXAgIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdG1vbm8uYmVzdChDUFVfVElNRVIpKSoxZS05ICA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0bW9uby50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJlaWdlbiBtb25vIHJlYWwgICAiIDw8IHRtb25vLmJlc3QoUkVBTF9USU1FUikvcmVwIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdG1vbm8uYmVzdChSRUFMX1RJTUVSKSkqMWUtOSA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0bW9uby50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJtdCBzcGVlZCB1cCB4IiA8PCB0bW9uby5iZXN0KENQVV9USU1FUikgLyB0bXQuYmVzdChSRUFMX1RJTUVSKSAgPDwgIiA9PiAiIDw8ICgxMDAuMCp0bW9uby5iZXN0KENQVV9USU1FUikgLyB0bXQuYmVzdChSRUFMX1RJTUVSKSkvcHJvY3MgPDwgIiVcbiI7CisgIH0KKyAgI2VuZGlmCisgIAorICAjaWZkZWYgREVDT1VQTEVECisgIGlmKChOdW1UcmFpdHM8QTo6U2NhbGFyPjo6SXNDb21wbGV4KSAmJiAoTnVtVHJhaXRzPEI6OlNjYWxhcj46OklzQ29tcGxleCkpCisgIHsKKyAgICBNIGFyKG0scCk7IGFyLnNldFJhbmRvbSgpOworICAgIE0gYWkobSxwKTsgYWkuc2V0UmFuZG9tKCk7CisgICAgTSBicihwLG4pOyBici5zZXRSYW5kb20oKTsKKyAgICBNIGJpKHAsbik7IGJpLnNldFJhbmRvbSgpOworICAgIE0gY3IobSxuKTsgY3Iuc2V0UmFuZG9tKCk7CisgICAgTSBjaShtLG4pOyBjaS5zZXRSYW5kb20oKTsKKyAgICAKKyAgICBCZW5jaFRpbWVyIHQ7CisgICAgQkVOQ0godCwgdHJpZXMsIHJlcCwgbWF0bGFiX2NwbHhfY3BseChhcixhaSxicixiaSxjcixjaSkpOworICAgIHN0ZDo6Y291dCA8PCAiXCJtYXRsYWJcIiBjcHUgICAgIiA8PCB0LmJlc3QoQ1BVX1RJTUVSKS9yZXAgIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdC5iZXN0KENQVV9USU1FUikpKjFlLTkgIDw8ICAiIEdGTE9QUyBcdCgiIDw8IHQudG90YWwoQ1BVX1RJTUVSKSAgPDwgInMpXG4iOworICAgIHN0ZDo6Y291dCA8PCAiXCJtYXRsYWJcIiByZWFsICAgIiA8PCB0LmJlc3QoUkVBTF9USU1FUikvcmVwIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdC5iZXN0KFJFQUxfVElNRVIpKSoxZS05IDw8ICAiIEdGTE9QUyBcdCgiIDw8IHQudG90YWwoUkVBTF9USU1FUikgPDwgInMpXG4iOworICB9CisgIGlmKCghTnVtVHJhaXRzPEE6OlNjYWxhcj46OklzQ29tcGxleCkgJiYgKE51bVRyYWl0czxCOjpTY2FsYXI+OjpJc0NvbXBsZXgpKQorICB7CisgICAgTSBhKG0scCk7ICBhLnNldFJhbmRvbSgpOworICAgIE0gYnIocCxuKTsgYnIuc2V0UmFuZG9tKCk7CisgICAgTSBiaShwLG4pOyBiaS5zZXRSYW5kb20oKTsKKyAgICBNIGNyKG0sbik7IGNyLnNldFJhbmRvbSgpOworICAgIE0gY2kobSxuKTsgY2kuc2V0UmFuZG9tKCk7CisgICAgCisgICAgQmVuY2hUaW1lciB0OworICAgIEJFTkNIKHQsIHRyaWVzLCByZXAsIG1hdGxhYl9yZWFsX2NwbHgoYSxicixiaSxjcixjaSkpOworICAgIHN0ZDo6Y291dCA8PCAiXCJtYXRsYWJcIiBjcHUgICAgIiA8PCB0LmJlc3QoQ1BVX1RJTUVSKS9yZXAgIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdC5iZXN0KENQVV9USU1FUikpKjFlLTkgIDw8ICAiIEdGTE9QUyBcdCgiIDw8IHQudG90YWwoQ1BVX1RJTUVSKSAgPDwgInMpXG4iOworICAgIHN0ZDo6Y291dCA8PCAiXCJtYXRsYWJcIiByZWFsICAgIiA8PCB0LmJlc3QoUkVBTF9USU1FUikvcmVwIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdC5iZXN0KFJFQUxfVElNRVIpKSoxZS05IDw8ICAiIEdGTE9QUyBcdCgiIDw8IHQudG90YWwoUkVBTF9USU1FUikgPDwgInMpXG4iOworICB9CisgIGlmKChOdW1UcmFpdHM8QTo6U2NhbGFyPjo6SXNDb21wbGV4KSAmJiAoIU51bVRyYWl0czxCOjpTY2FsYXI+OjpJc0NvbXBsZXgpKQorICB7CisgICAgTSBhcihtLHApOyBhci5zZXRSYW5kb20oKTsKKyAgICBNIGFpKG0scCk7IGFpLnNldFJhbmRvbSgpOworICAgIE0gYihwLG4pOyAgYi5zZXRSYW5kb20oKTsKKyAgICBNIGNyKG0sbik7IGNyLnNldFJhbmRvbSgpOworICAgIE0gY2kobSxuKTsgY2kuc2V0UmFuZG9tKCk7CisgICAgCisgICAgQmVuY2hUaW1lciB0OworICAgIEJFTkNIKHQsIHRyaWVzLCByZXAsIG1hdGxhYl9jcGx4X3JlYWwoYXIsYWksYixjcixjaSkpOworICAgIHN0ZDo6Y291dCA8PCAiXCJtYXRsYWJcIiBjcHUgICAgIiA8PCB0LmJlc3QoQ1BVX1RJTUVSKS9yZXAgIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdC5iZXN0KENQVV9USU1FUikpKjFlLTkgIDw8ICAiIEdGTE9QUyBcdCgiIDw8IHQudG90YWwoQ1BVX1RJTUVSKSAgPDwgInMpXG4iOworICAgIHN0ZDo6Y291dCA8PCAiXCJtYXRsYWJcIiByZWFsICAgIiA8PCB0LmJlc3QoUkVBTF9USU1FUikvcmVwIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdC5iZXN0KFJFQUxfVElNRVIpKSoxZS05IDw8ICAiIEdGTE9QUyBcdCgiIDw8IHQudG90YWwoUkVBTF9USU1FUikgPDwgInMpXG4iOworICB9CisgICNlbmRpZgorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaF9tdWx0aV9jb21waWxlcnMuc2ggYi9iZW5jaC9iZW5jaF9tdWx0aV9jb21waWxlcnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjdlOTFmMQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNoX211bHRpX2NvbXBpbGVycy5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaAorCitpZiAoKCQjIDwgMikpOyB0aGVuCisgICAgZWNobyAiVXNhZ2U6ICQwIGNvbXBpbGVybGlzdC50eHQgYmVuY2hmaWxlLmNwcCIKK2Vsc2UKKworY29tcGlsZXJsaXN0PSQxCitiZW5jaGZpbGU9JDIKKworZz0wCitzb3VyY2UgJGNvbXBpbGVybGlzdAorCisjIGZvciBlYWNoIGNvbXBpbGVyLCBjb21waWxlIGJlbmNoZmlsZSBhbmQgcnVuIHRoZSBiZW5jaG1hcmsKK2ZvciAoKCBpPTAgOyBpPGcgOyArK2kgKSkgOyBkbworICAjIGNoZWNrIHRoZSBjb21waWxlciBleGlzdHMKKyAgY29tcGlsZXI9YGVjaG8gJHtDTElTVFskaV19IHwgY3V0IC1kICIgIiAtZiAxYAorICBpZiBbIC1lIGB3aGljaCAkY29tcGlsZXJgIF07IHRoZW4KKyAgICBlY2hvICIke0NMSVNUWyRpXX0iCisjICAgICBlY2hvICIke0NMSVNUWyRpXX0gJGJlbmNoZmlsZSAtSS4uIC1vIGJlbmNofiIKKyMgICAgIGlmIFsgLWUgLi8uYmVuY2ggXSA7IHRoZW4gcm0gLmJlbmNoOyBmaQorICAgICR7Q0xJU1RbJGldfSAkYmVuY2hmaWxlIC1JLi4gLW8gLmJlbmNoICYmIC4vLmJlbmNoIDI+IC9kZXYvbnVsbAorICAgIGVjaG8gIiIKKyAgZWxzZQorICAgIGVjaG8gImNvbXBpbGVyIG5vdCBmb3VuZDogJGNvbXBpbGVyIgorICBmaQorZG9uZQorCitmaQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hfbm9ybS5jcHAgYi9iZW5jaC9iZW5jaF9ub3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDZkYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2hfbm9ybS5jcHAKQEAgLTAsMCArMSwzNDUgQEAKKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgIkJlbmNoVGltZXIuaCIKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgc3FzdW1Ob3JtKGNvbnN0IFQmIHYpCit7CisgIHJldHVybiB2Lm5vcm0oKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBoeXBvdE5vcm0oY29uc3QgVCYgdikKK3sKKyAgcmV0dXJuIHYuaHlwb3ROb3JtKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgYmx1ZU5vcm0oY29uc3QgVCYgdikKK3sKKyAgcmV0dXJuIHYuYmx1ZU5vcm0oKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBsYXBhY2tOb3JtKFQmIHYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVDo6U2NhbGFyIFNjYWxhcjsKKyAgaW50IG4gPSB2LnNpemUoKTsKKyAgU2NhbGFyIHNjYWxlID0gMDsKKyAgU2NhbGFyIHNzcSA9IDE7CisgIGZvciAoaW50IGk9MDtpPG47KytpKQorICB7CisgICAgU2NhbGFyIGF4ID0gaW50ZXJuYWw6OmFicyh2LmNvZWZmKGkpKTsKKyAgICBpZiAoc2NhbGUgPj0gYXgpCisgICAgeworICAgICAgc3NxICs9IGludGVybmFsOjphYnMyKGF4L3NjYWxlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNzcSA9IFNjYWxhcigxKSArIHNzcSAqIGludGVybmFsOjphYnMyKHNjYWxlL2F4KTsKKyAgICAgIHNjYWxlID0gYXg7CisgICAgfQorICB9CisgIHJldHVybiBzY2FsZSAqIGludGVybmFsOjpzcXJ0KHNzcSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgdHdvcGFzc05vcm0oVCYgdikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUOjpTY2FsYXIgU2NhbGFyOworICBTY2FsYXIgcyA9IHYuY3dpc2UoKS5hYnMoKS5tYXhDb2VmZigpOworICByZXR1cm4gcyoodi9zKS5ub3JtKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgYmwycGFzc05vcm0oVCYgdikKK3sKKyAgcmV0dXJuIHYuc3RhYmxlTm9ybSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIGRpdmFjTm9ybShUJiB2KQoreworICBpbnQgbiA9di5zaXplKCkgLyAyOworICBmb3IgKGludCBpPTA7aTxuOysraSkKKyAgICB2KGkpID0gdigyKmkpKnYoMippKSArIHYoMippKzEpKnYoMippKzEpOworICBuID0gbi8yOworICB3aGlsZSAobj4wKQorICB7CisgICAgZm9yIChpbnQgaT0wO2k8bjsrK2kpCisgICAgICB2KGkpID0gdigyKmkpICsgdigyKmkrMSk7CisgICAgbiA9IG4vMjsKKyAgfQorICByZXR1cm4gaW50ZXJuYWw6OnNxcnQodigwKSk7Cit9CisKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkUKK1BhY2tldDRmIGludGVybmFsOjpwbHQoY29uc3QgUGFja2V0NGYmIGEsIFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fY21wbHRfcHMoYSxiKTsgfQorUGFja2V0MmQgaW50ZXJuYWw6OnBsdChjb25zdCBQYWNrZXQyZCYgYSwgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9jbXBsdF9wZChhLGIpOyB9CisKK1BhY2tldDRmIGludGVybmFsOjpwYW5kbm90KGNvbnN0IFBhY2tldDRmJiBhLCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX2FuZG5vdF9wcyhhLGIpOyB9CitQYWNrZXQyZCBpbnRlcm5hbDo6cGFuZG5vdChjb25zdCBQYWNrZXQyZCYgYSwgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9hbmRub3RfcGQoYSxiKTsgfQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgcGJsdWVOb3JtKGNvbnN0IFQmIHYpCit7CisgICNpZm5kZWYgRUlHRU5fVkVDVE9SSVpFCisgIHJldHVybiB2LmJsdWVOb3JtKCk7CisgICNlbHNlCisgIHR5cGVkZWYgdHlwZW5hbWUgVDo6U2NhbGFyIFNjYWxhcjsKKworICBzdGF0aWMgaW50IG5tYXggPSAwOworICBzdGF0aWMgU2NhbGFyIGIxLCBiMiwgczFtLCBzMm0sIG92ZXJmbCwgcmJpZywgcmVsZXJyOworICBpbnQgbjsKKworICBpZihubWF4IDw9IDApCisgIHsKKyAgICBpbnQgbmJpZywgaWJldGEsIGl0LCBpZW1pbiwgaWVtYXgsIGlleHA7CisgICAgU2NhbGFyIGFiaWcsIGVwczsKKworICAgIG5iaWcgID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsgICAgICAgICAgICAvLyBsYXJnZXN0IGludGVnZXIKKyAgICBpYmV0YSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6cmFkaXg7IC8vTnVtVHJhaXRzPFNjYWxhcj46OkJhc2U7ICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzCisgICAgaXQgICAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmRpZ2l0czsgLy9OdW1UcmFpdHM8U2NhbGFyPjo6TWFudGlzc2E7ICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBiYXNlLWJldGEgZGlnaXRzIGluIG1hbnRpc3NhCisgICAgaWVtaW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1pbl9leHBvbmVudDsgIC8vIG1pbmltdW0gZXhwb25lbnQKKyAgICBpZW1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWF4X2V4cG9uZW50OyAgLy8gbWF4aW11bSBleHBvbmVudAorICAgIHJiaWcgID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptYXgoKTsgICAgICAgICAvLyBsYXJnZXN0IGZsb2F0aW5nLXBvaW50IG51bWJlcgorCisgICAgLy8gQ2hlY2sgdGhlIGJhc2ljIG1hY2hpbmUtZGVwZW5kZW50IGNvbnN0YW50cy4KKyAgICBpZihpZW1pbiA+IDEgLSAyKml0IHx8IDEraXQ+aWVtYXggfHwgKGl0PT0yICYmIGliZXRhPDUpCisgICAgICB8fCAoaXQ8PTQgJiYgaWJldGEgPD0gMyApIHx8IGl0PDIpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJ0aGUgYWxnb3JpdGhtIGNhbm5vdCBiZSBndWFyYW50ZWVkIG9uIHRoaXMgY29tcHV0ZXIiKTsKKyAgICB9CisgICAgaWV4cCAgPSAtKCgxLWllbWluKS8yKTsKKyAgICBiMSAgICA9IHN0ZDo6cG93KGliZXRhLCBpZXhwKTsgIC8vIGxvd2VyIGJvdW5kYXJ5IG9mIG1pZHJhbmdlCisgICAgaWV4cCAgPSAoaWVtYXggKyAxIC0gaXQpLzI7CisgICAgYjIgICAgPSBzdGQ6OnBvdyhpYmV0YSxpZXhwKTsgICAvLyB1cHBlciBib3VuZGFyeSBvZiBtaWRyYW5nZQorCisgICAgaWV4cCAgPSAoMi1pZW1pbikvMjsKKyAgICBzMW0gICA9IHN0ZDo6cG93KGliZXRhLGlleHApOyAgIC8vIHNjYWxpbmcgZmFjdG9yIGZvciBsb3dlciByYW5nZQorICAgIGlleHAgID0gLSAoKGllbWF4K2l0KS8yKTsKKyAgICBzMm0gICA9IHN0ZDo6cG93KGliZXRhLGlleHApOyAgIC8vIHNjYWxpbmcgZmFjdG9yIGZvciB1cHBlciByYW5nZQorCisgICAgb3ZlcmZsICA9IHJiaWcqczJtOyAgICAgICAgICAvLyBvdmVyZm93IGJvdW5kYXJ5IGZvciBhYmlnCisgICAgZXBzICAgICA9IHN0ZDo6cG93KGliZXRhLCAxLWl0KTsKKyAgICByZWxlcnIgID0gaW50ZXJuYWw6OnNxcnQoZXBzKTsgICAgICAvLyB0b2xlcmFuY2UgZm9yIG5lZ2xlY3RpbmcgYXNtbAorICAgIGFiaWcgICAgPSAxLjAvZXBzIC0gMS4wOworICAgIGlmIChTY2FsYXIobmJpZyk+YWJpZykgIG5tYXggPSBhYmlnOyAgLy8gbGFyZ2VzdCBzYWZlIG4KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICBubWF4ID0gbmJpZzsKKyAgfQorCisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIGNvbnN0IGludCBwcyA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgIFBhY2tldCBwYXNtbCA9IGludGVybmFsOjpwc2V0MShTY2FsYXIoMCkpOworICBQYWNrZXQgcGFtZWQgPSBpbnRlcm5hbDo6cHNldDEoU2NhbGFyKDApKTsKKyAgUGFja2V0IHBhYmlnID0gaW50ZXJuYWw6OnBzZXQxKFNjYWxhcigwKSk7CisgIFBhY2tldCBwczJtID0gaW50ZXJuYWw6OnBzZXQxKHMybSk7CisgIFBhY2tldCBwczFtID0gaW50ZXJuYWw6OnBzZXQxKHMxbSk7CisgIFBhY2tldCBwYjIgID0gaW50ZXJuYWw6OnBzZXQxKGIyKTsKKyAgUGFja2V0IHBiMSAgPSBpbnRlcm5hbDo6cHNldDEoYjEpOworICBmb3IoaW50IGo9MDsgajx2LnNpemUoKTsgais9cHMpCisgIHsKKyAgICBQYWNrZXQgYXggPSBpbnRlcm5hbDo6cGFicyh2LnRlbXBsYXRlIHBhY2tldDxBbGlnbmVkPihqKSk7CisgICAgUGFja2V0IGF4X3MybSA9IGludGVybmFsOjpwbXVsKGF4LHBzMm0pOworICAgIFBhY2tldCBheF9zMW0gPSBpbnRlcm5hbDo6cG11bChheCxwczFtKTsKKyAgICBQYWNrZXQgbWFza0JpZyA9IGludGVybmFsOjpwbHQocGIyLGF4KTsKKyAgICBQYWNrZXQgbWFza1NtbCA9IGludGVybmFsOjpwbHQoYXgscGIxKTsKKworLy8gICAgIFBhY2tldCBtYXNrTWVkID0gaW50ZXJuYWw6OnBhbmQobWFza1NtbCxtYXNrQmlnKTsKKy8vICAgICBQYWNrZXQgc2NhbGUgPSBpbnRlcm5hbDo6cHNldDEoU2NhbGFyKDApKTsKKy8vICAgICBzY2FsZSA9IGludGVybmFsOjpwb3Ioc2NhbGUsIGludGVybmFsOjpwYW5kKG1hc2tCaWcscHMybSkpOworLy8gICAgIHNjYWxlID0gaW50ZXJuYWw6OnBvcihzY2FsZSwgaW50ZXJuYWw6OnBhbmQobWFza1NtbCxwczFtKSk7CisvLyAgICAgc2NhbGUgPSBpbnRlcm5hbDo6cG9yKHNjYWxlLCBpbnRlcm5hbDo6cGFuZG5vdChpbnRlcm5hbDo6cHNldDEoU2NhbGFyKDEpKSxtYXNrTWVkKSk7CisvLyAgICAgYXggPSBpbnRlcm5hbDo6cG11bChheCxzY2FsZSk7CisvLyAgICAgYXggPSBpbnRlcm5hbDo6cG11bChheCxheCk7CisvLyAgICAgcGFiaWcgPSBpbnRlcm5hbDo6cGFkZChwYWJpZywgaW50ZXJuYWw6OnBhbmQobWFza0JpZywgYXgpKTsKKy8vICAgICBwYXNtbCA9IGludGVybmFsOjpwYWRkKHBhc21sLCBpbnRlcm5hbDo6cGFuZChtYXNrU21sLCBheCkpOworLy8gICAgIHBhbWVkID0gaW50ZXJuYWw6OnBhZGQocGFtZWQsIGludGVybmFsOjpwYW5kbm90KGF4LG1hc2tNZWQpKTsKKworCisgICAgcGFiaWcgPSBpbnRlcm5hbDo6cGFkZChwYWJpZywgaW50ZXJuYWw6OnBhbmQobWFza0JpZywgaW50ZXJuYWw6OnBtdWwoYXhfczJtLGF4X3MybSkpKTsKKyAgICBwYXNtbCA9IGludGVybmFsOjpwYWRkKHBhc21sLCBpbnRlcm5hbDo6cGFuZChtYXNrU21sLCBpbnRlcm5hbDo6cG11bChheF9zMW0sYXhfczFtKSkpOworICAgIHBhbWVkID0gaW50ZXJuYWw6OnBhZGQocGFtZWQsIGludGVybmFsOjpwYW5kbm90KGludGVybmFsOjpwbXVsKGF4LGF4KSxpbnRlcm5hbDo6cGFuZChtYXNrU21sLG1hc2tCaWcpKSk7CisgIH0KKyAgU2NhbGFyIGFiaWcgPSBpbnRlcm5hbDo6cHJlZHV4KHBhYmlnKTsKKyAgU2NhbGFyIGFzbWwgPSBpbnRlcm5hbDo6cHJlZHV4KHBhc21sKTsKKyAgU2NhbGFyIGFtZWQgPSBpbnRlcm5hbDo6cHJlZHV4KHBhbWVkKTsKKyAgaWYoYWJpZyA+IFNjYWxhcigwKSkKKyAgeworICAgIGFiaWcgPSBpbnRlcm5hbDo6c3FydChhYmlnKTsKKyAgICBpZihhYmlnID4gb3ZlcmZsKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAib3ZlcmZsb3ciKTsKKyAgICAgIHJldHVybiByYmlnOworICAgIH0KKyAgICBpZihhbWVkID4gU2NhbGFyKDApKQorICAgIHsKKyAgICAgIGFiaWcgPSBhYmlnL3MybTsKKyAgICAgIGFtZWQgPSBpbnRlcm5hbDo6c3FydChhbWVkKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBhYmlnL3MybTsKKyAgICB9CisKKyAgfQorICBlbHNlIGlmKGFzbWwgPiBTY2FsYXIoMCkpCisgIHsKKyAgICBpZiAoYW1lZCA+IFNjYWxhcigwKSkKKyAgICB7CisgICAgICBhYmlnID0gaW50ZXJuYWw6OnNxcnQoYW1lZCk7CisgICAgICBhbWVkID0gaW50ZXJuYWw6OnNxcnQoYXNtbCkgLyBzMW07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnNxcnQoYXNtbCkvczFtOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnNxcnQoYW1lZCk7CisgIH0KKyAgYXNtbCA9IHN0ZDo6bWluKGFiaWcsIGFtZWQpOworICBhYmlnID0gc3RkOjptYXgoYWJpZywgYW1lZCk7CisgIGlmKGFzbWwgPD0gYWJpZypyZWxlcnIpCisgICAgcmV0dXJuIGFiaWc7CisgIGVsc2UKKyAgICByZXR1cm4gYWJpZyAqIGludGVybmFsOjpzcXJ0KFNjYWxhcigxKSArIGludGVybmFsOjphYnMyKGFzbWwvYWJpZykpOworICAjZW5kaWYKK30KKworI2RlZmluZSBCRU5DSF9QRVJGKE5STSkgeyBcCisgIEVpZ2VuOjpCZW5jaFRpbWVyIHRmLCB0ZCwgdGNmOyB0Zi5yZXNldCgpOyB0ZC5yZXNldCgpOyB0Y2YucmVzZXQoKTtcCisgIGZvciAoaW50IGs9MDsgazx0cmllczsgKytrKSB7IFwKKyAgICB0Zi5zdGFydCgpOyBcCisgICAgZm9yIChpbnQgaT0wOyBpPGl0ZXJzOyArK2kpIE5STSh2Zik7IFwKKyAgICB0Zi5zdG9wKCk7IFwKKyAgfSBcCisgIGZvciAoaW50IGs9MDsgazx0cmllczsgKytrKSB7IFwKKyAgICB0ZC5zdGFydCgpOyBcCisgICAgZm9yIChpbnQgaT0wOyBpPGl0ZXJzOyArK2kpIE5STSh2ZCk7IFwKKyAgICB0ZC5zdG9wKCk7IFwKKyAgfSBcCisgIGZvciAoaW50IGs9MDsgazxzdGQ6Om1heCgxLHRyaWVzLzMpOyArK2spIHsgXAorICAgIHRjZi5zdGFydCgpOyBcCisgICAgZm9yIChpbnQgaT0wOyBpPGl0ZXJzOyArK2kpIE5STSh2Y2YpOyBcCisgICAgdGNmLnN0b3AoKTsgXAorICB9IFwKKyAgc3RkOjpjb3V0IDw8ICNOUk0gPDwgIlx0IiA8PCB0Zi52YWx1ZSgpIDw8ICIgICAiIDw8IHRkLnZhbHVlKCkgPDwgICIgICAgIiA8PCB0Y2YudmFsdWUoKSA8PCAiXG4iOyBcCit9CisKK3ZvaWQgY2hlY2tfYWNjdXJhY3koZG91YmxlIGJhc2VmLCBkb3VibGUgYmFzZWQsIGludCBzKQoreworICBkb3VibGUgeWYgPSBiYXNlZiAqIGludGVybmFsOjphYnMoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCkpOworICBkb3VibGUgeWQgPSBiYXNlZCAqIGludGVybmFsOjphYnMoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCkpOworICBWZWN0b3JYZiB2ZiA9IFZlY3RvclhmOjpPbmVzKHMpICogeWY7CisgIFZlY3RvclhkIHZkID0gVmVjdG9yWGQ6Ok9uZXMocykgKiB5ZDsKKworICBzdGQ6OmNvdXQgPDwgInJlZmVyZW5jZVx0IiA8PCBpbnRlcm5hbDo6c3FydChkb3VibGUocykpKnlmIDw8ICJcdCIgPDwgaW50ZXJuYWw6OnNxcnQoZG91YmxlKHMpKSp5ZCA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgInNxc3VtTm9ybVx0IiA8PCBzcXN1bU5vcm0odmYpIDw8ICJcdCIgPDwgc3FzdW1Ob3JtKHZkKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgImh5cG90Tm9ybVx0IiA8PCBoeXBvdE5vcm0odmYpIDw8ICJcdCIgPDwgaHlwb3ROb3JtKHZkKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgImJsdWVOb3JtXHQiIDw8IGJsdWVOb3JtKHZmKSA8PCAiXHQiIDw8IGJsdWVOb3JtKHZkKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgInBibHVlTm9ybVx0IiA8PCBwYmx1ZU5vcm0odmYpIDw8ICJcdCIgPDwgcGJsdWVOb3JtKHZkKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgImxhcGFja05vcm1cdCIgPDwgbGFwYWNrTm9ybSh2ZikgPDwgIlx0IiA8PCBsYXBhY2tOb3JtKHZkKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgInR3b3Bhc3NOb3JtXHQiIDw8IHR3b3Bhc3NOb3JtKHZmKSA8PCAiXHQiIDw8IHR3b3Bhc3NOb3JtKHZkKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgImJsMnBhc3NOb3JtXHQiIDw8IGJsMnBhc3NOb3JtKHZmKSA8PCAiXHQiIDw8IGJsMnBhc3NOb3JtKHZkKSA8PCAiXG4iOworfQorCit2b2lkIGNoZWNrX2FjY3VyYWN5X3ZhcihpbnQgZWYwLCBpbnQgZWYxLCBpbnQgZWQwLCBpbnQgZWQxLCBpbnQgcykKK3sKKyAgVmVjdG9yWGYgdmYocyk7CisgIFZlY3RvclhkIHZkKHMpOworICBmb3IgKGludCBpPTA7IGk8czsgKytpKQorICB7CisgICAgdmZbaV0gPSBpbnRlcm5hbDo6YWJzKGludGVybmFsOjpyYW5kb208ZG91YmxlPigpKSAqIHN0ZDo6cG93KGRvdWJsZSgxMCksIGludGVybmFsOjpyYW5kb208aW50PihlZjAsZWYxKSk7CisgICAgdmRbaV0gPSBpbnRlcm5hbDo6YWJzKGludGVybmFsOjpyYW5kb208ZG91YmxlPigpKSAqIHN0ZDo6cG93KGRvdWJsZSgxMCksIGludGVybmFsOjpyYW5kb208aW50PihlZDAsZWQxKSk7CisgIH0KKworICAvL3N0ZDo6Y291dCA8PCAicmVmZXJlbmNlXHQiIDw8IGludGVybmFsOjpzcXJ0KGRvdWJsZShzKSkqeWYgPDwgIlx0IiA8PCBpbnRlcm5hbDo6c3FydChkb3VibGUocykpKnlkIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAic3FzdW1Ob3JtXHQiICA8PCBzcXN1bU5vcm0odmYpICA8PCAiXHQiIDw8IHNxc3VtTm9ybSh2ZCkgIDw8ICJcdCIgPDwgc3FzdW1Ob3JtKHZmLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcdCIgPDwgc3FzdW1Ob3JtKHZkLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAiaHlwb3ROb3JtXHQiICA8PCBoeXBvdE5vcm0odmYpICA8PCAiXHQiIDw8IGh5cG90Tm9ybSh2ZCkgIDw8ICJcdCIgPDwgaHlwb3ROb3JtKHZmLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcdCIgPDwgaHlwb3ROb3JtKHZkLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAiYmx1ZU5vcm1cdCIgICA8PCBibHVlTm9ybSh2ZikgICA8PCAiXHQiIDw8IGJsdWVOb3JtKHZkKSAgIDw8ICJcdCIgPDwgYmx1ZU5vcm0odmYuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlx0IiA8PCBibHVlTm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgInBibHVlTm9ybVx0IiAgPDwgcGJsdWVOb3JtKHZmKSAgPDwgIlx0IiA8PCBwYmx1ZU5vcm0odmQpICA8PCAiXHQiIDw8IGJsdWVOb3JtKHZmLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcdCIgPDwgYmx1ZU5vcm0odmQuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICJsYXBhY2tOb3JtXHQiIDw8IGxhcGFja05vcm0odmYpIDw8ICJcdCIgPDwgbGFwYWNrTm9ybSh2ZCkgPDwgIlx0IiA8PCBsYXBhY2tOb3JtKHZmLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcdCIgPDwgbGFwYWNrTm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgInR3b3Bhc3NOb3JtXHQiIDw8IHR3b3Bhc3NOb3JtKHZmKSA8PCAiXHQiIDw8IHR3b3Bhc3NOb3JtKHZkKSA8PCAiXHQiIDw8IHR3b3Bhc3NOb3JtKHZmLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcdCIgPDwgdHdvcGFzc05vcm0odmQuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlxuIjsKKy8vICAgc3RkOjpjb3V0IDw8ICJibDJwYXNzTm9ybVx0IiA8PCBibDJwYXNzTm9ybSh2ZikgPDwgIlx0IiA8PCBibDJwYXNzTm9ybSh2ZCkgPDwgIlx0IiA8PCBibDJwYXNzTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IGJsMnBhc3NOb3JtKHZkLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcbiI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgaW50IHRyaWVzID0gMTA7CisgIGludCBpdGVycyA9IDEwMDAwMDsKKyAgZG91YmxlIHkgPSAxLjEzNDU3NDMyMzM0NTU3ODU0NTY3ODhlMTIgKiBpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKTsKKyAgVmVjdG9yWGYgdiA9IFZlY3RvclhmOjpPbmVzKDEwMjQpICogeTsKKworLy8gcmV0dXJuIDA7CisgIGludCBzID0gMTAwMDA7CisgIGRvdWJsZSBiYXNlZl9vayA9IDEuMTM0NTc0MzIzMzQ1NTc4NTQ1Njc4OGUxNTsKKyAgZG91YmxlIGJhc2VkX29rID0gMS4xMzQ1NzQzMjMzNDU1Nzg1NDU2Nzg4ZTk1OworCisgIGRvdWJsZSBiYXNlZl91bmRlciA9IDEuMTM0NTc0MzIzMzQ1NTc4NTQ1Njc4OGUtMjc7CisgIGRvdWJsZSBiYXNlZF91bmRlciA9IDEuMTM0NTc0MzIzMzQ1NTc4NTQ1Njc4OGUtMzAzOworCisgIGRvdWJsZSBiYXNlZl9vdmVyID0gMS4xMzQ1NzQzMjMzNDU1Nzg1NDU2Nzg4ZSsyNzsKKyAgZG91YmxlIGJhc2VkX292ZXIgPSAxLjEzNDU3NDMyMzM0NTU3ODU0NTY3ODhlKzMwMjsKKworICBzdGQ6OmNvdXQucHJlY2lzaW9uKDIwKTsKKworICBzdGQ6OmNlcnIgPDwgIlxuTm8gdW5kZXIvb3ZlcmZsb3c6XG4iOworICBjaGVja19hY2N1cmFjeShiYXNlZl9vaywgYmFzZWRfb2ssIHMpOworCisgIHN0ZDo6Y2VyciA8PCAiXG5VbmRlcmZsb3c6XG4iOworICBjaGVja19hY2N1cmFjeShiYXNlZl91bmRlciwgYmFzZWRfdW5kZXIsIHMpOworCisgIHN0ZDo6Y2VyciA8PCAiXG5PdmVyZmxvdzpcbiI7CisgIGNoZWNrX2FjY3VyYWN5KGJhc2VmX292ZXIsIGJhc2VkX292ZXIsIHMpOworCisgIHN0ZDo6Y2VyciA8PCAiXG5WYXJ5aW5nIChvdmVyKTpcbiI7CisgIGZvciAoaW50IGs9MDsgazwxOyArK2spCisgIHsKKyAgICBjaGVja19hY2N1cmFjeV92YXIoMjAsMjcsMTkwLDMwMixzKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgfQorCisgIHN0ZDo6Y2VyciA8PCAiXG5WYXJ5aW5nICh1bmRlcik6XG4iOworICBmb3IgKGludCBrPTA7IGs8MTsgKytrKQorICB7CisgICAgY2hlY2tfYWNjdXJhY3lfdmFyKC0yNywyMCwtMzAyLC0xOTAscyk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIH0KKworICBzdGQ6OmNvdXQucHJlY2lzaW9uKDQpOworICBzdGQ6OmNlcnIgPDwgIlBlcmZvcm1hbmNlIChvdXQgb2YgY2FjaGUpOlxuIjsKKyAgeworICAgIGludCBpdGVycyA9IDE7CisgICAgVmVjdG9yWGYgdmYgPSBWZWN0b3JYZjo6UmFuZG9tKDEwMjQqMTAyNCozMikgKiB5OworICAgIFZlY3RvclhkIHZkID0gVmVjdG9yWGQ6OlJhbmRvbSgxMDI0KjEwMjQqMzIpICogeTsKKyAgICBWZWN0b3JYY2YgdmNmID0gVmVjdG9yWGNmOjpSYW5kb20oMTAyNCoxMDI0KjMyKSAqIHk7CisgICAgQkVOQ0hfUEVSRihzcXN1bU5vcm0pOworICAgIEJFTkNIX1BFUkYoYmx1ZU5vcm0pOworLy8gICAgIEJFTkNIX1BFUkYocGJsdWVOb3JtKTsKKy8vICAgICBCRU5DSF9QRVJGKGxhcGFja05vcm0pOworLy8gICAgIEJFTkNIX1BFUkYoaHlwb3ROb3JtKTsKKy8vICAgICBCRU5DSF9QRVJGKHR3b3Bhc3NOb3JtKTsKKyAgICBCRU5DSF9QRVJGKGJsMnBhc3NOb3JtKTsKKyAgfQorCisgIHN0ZDo6Y2VyciA8PCAiXG5QZXJmb3JtYW5jZSAoaW4gY2FjaGUpOlxuIjsKKyAgeworICAgIGludCBpdGVycyA9IDEwMDAwMDsKKyAgICBWZWN0b3JYZiB2ZiA9IFZlY3RvclhmOjpSYW5kb20oNTEyKSAqIHk7CisgICAgVmVjdG9yWGQgdmQgPSBWZWN0b3JYZDo6UmFuZG9tKDUxMikgKiB5OworICAgIFZlY3RvclhjZiB2Y2YgPSBWZWN0b3JYY2Y6OlJhbmRvbSg1MTIpICogeTsKKyAgICBCRU5DSF9QRVJGKHNxc3VtTm9ybSk7CisgICAgQkVOQ0hfUEVSRihibHVlTm9ybSk7CisvLyAgICAgQkVOQ0hfUEVSRihwYmx1ZU5vcm0pOworLy8gICAgIEJFTkNIX1BFUkYobGFwYWNrTm9ybSk7CisvLyAgICAgQkVOQ0hfUEVSRihoeXBvdE5vcm0pOworLy8gICAgIEJFTkNIX1BFUkYodHdvcGFzc05vcm0pOworICAgIEJFTkNIX1BFUkYoYmwycGFzc05vcm0pOworICB9Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaF9yZXZlcnNlLmNwcCBiL2JlbmNoL2JlbmNoX3JldmVyc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNjljYTEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaF9yZXZlcnNlLmNwcApAQCAtMCwwICsxLDg0IEBACisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPGJlbmNoL0JlbmNoVXRpbC5oPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMTAwMDAwCisjZW5kaWYKKworI2lmbmRlZiBUUklFUworI2RlZmluZSBUUklFUyAyMAorI2VuZGlmCisKK3R5cGVkZWYgZG91YmxlIFNjYWxhcjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB2b2lkIGJlbmNoX3JldmVyc2UoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKyAgaW50IHNpemUgPSBtLnNpemUoKTsKKworICBpbnQgcmVwZWF0cyA9IChSRVBFQVQqMTAwMCkvc2l6ZTsKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgYiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworCisgIEJlbmNoVGltZXIgdGltZXJCLCB0aW1lckgsIHRpbWVyVjsKKworICBTY2FsYXIgYWNjID0gMDsKKyAgaW50IHIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpOworICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSk7CisgIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQorICB7CisgICAgdGltZXJCLnN0YXJ0KCk7CisgICAgZm9yIChpbnQgaz0wOyBrPHJlcGVhdHM7ICsraykKKyAgICB7CisgICAgICBhc20oIiNiZWdpbiBmb28iKTsKKyAgICAgIGIgPSBhLnJldmVyc2UoKTsKKyAgICAgIGFzbSgiI2VuZCBmb28iKTsKKyAgICAgIGFjYyArPSBiLmNvZWZmKHIsYyk7CisgICAgfQorICAgIHRpbWVyQi5zdG9wKCk7CisgIH0KKworICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCisgICAgc3RkOjpjb3V0IDw8ICJkeW4gICAiOworICBlbHNlCisgICAgc3RkOjpjb3V0IDw8ICJmaXhlZCAiOworICBzdGQ6OmNvdXQgPDwgcm93cyA8PCAiIHggIiA8PCBjb2xzIDw8ICIgXHQiCisgICAgICAgICAgICA8PCAodGltZXJCLnZhbHVlKCkgKiBSRVBFQVQpIC8gcmVwZWF0cyA8PCAicyAiCisgICAgICAgICAgICA8PCAiKCIgPDwgMWUtNiAqIHNpemUqcmVwZWF0cy90aW1lckIudmFsdWUoKSA8PCAiIE1GTE9QUylcdCI7CisKKyAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIC8vIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgb3B0aW1pemUgdG9vIG11Y2gKKyAgaWYgKGFjYz09MTIzKQorICAgIHN0ZDo6Y291dCA8PCBhY2M7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgIGNvbnN0IGludCBkeW5zaXplc1tdID0gezQsNiw4LDE2LDI0LDMyLDQ5LDY0LDEyOCwyNTYsNTEyLDkwMCwwfTsKKyAgc3RkOjpjb3V0IDw8ICJzaXplICAgICAgICAgICAgbm8gc3FydCAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIjsKKy8vICAgI2lmZGVmIEJFTkNIX0dTTAorLy8gICBzdGQ6OmNvdXQgPDwgIiAgICAgICBHU0wgKHN0YW5kYXJkICsgZG91YmxlICsgQVRMQVMpICAiOworLy8gICAjZW5kaWYKKyAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIGZvciAodWludCBpPTA7IGR5bnNpemVzW2ldPjA7ICsraSkKKyAgeworICAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+KGR5bnNpemVzW2ldLGR5bnNpemVzW2ldKSk7CisgICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4oZHluc2l6ZXNbaV0qZHluc2l6ZXNbaV0pKTsKKyAgfQorLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsMiwyPigpKTsKKy8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDMsMz4oKSk7CisvLyAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhciw0LDQ+KCkpOworLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsNSw1PigpKTsKKy8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDYsNj4oKSk7CisvLyAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhciw3LDc+KCkpOworLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsOCw4PigpKTsKKy8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDEyLDEyPigpKTsKKy8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDE2LDE2PigpKTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoX3N1bS5jcHAgYi9iZW5jaC9iZW5jaF9zdW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDkyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaF9zdW0uY3BwCkBAIC0wLDAgKzEsMTggQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKSAKK3sKKyAgdHlwZWRlZiBNYXRyaXg8U0NBTEFSLEVpZ2VuOjpEeW5hbWljLDE+IFZlYzsKKyAgVmVjIHYoU0laRSk7CisgIHYuc2V0WmVybygpOworICB2WzBdID0gMTsKKyAgdlsxXSA9IDI7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAxMDAwMDAwOyBpKyspCisgIHsKKyAgICB2LmNvZWZmUmVmKDApICs9IHYuc3VtKCkgKiBTQ0FMQVIoMWUtMjApOworICB9CisgIGNvdXQgPDwgdi5zdW0oKSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hfdW5yb2xsaW5nIGIvYmVuY2gvYmVuY2hfdW5yb2xsaW5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyNjQ0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaF91bnJvbGxpbmcKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL2Jhc2gKKworIyBnY2MgOiBDWFg9ImcrKyAgLWZpbmxpbmUtbGltaXQ9MTAwMDAgLWZ0ZW1wbGF0ZS1kZXB0aC0yMDAwIC0tcGFyYW0gbWF4LWlubGluZS1yZWN1cnNpdmUtZGVwdGg9MjAwMCIKKyMgaWNjIDogQ1hYPSJpY3BjIC1mYXN0IC1uby1pbmxpbmUtbWF4LXNpemUgLWZuby1leGNlcHRpb25zIgorQ1hYPSR7Q1hYLWcrKyAgLWZpbmxpbmUtbGltaXQ9MTAwMDAgLWZ0ZW1wbGF0ZS1kZXB0aC0yMDAwIC0tcGFyYW0gbWF4LWlubGluZS1yZWN1cnNpdmUtZGVwdGg9MjAwMH0gIyBkZWZhdWx0IHZhbHVlCisKK2ZvciAoKGk9MTsgaTwxNjsgKytpKSk7IGRvCisgICAgZWNobyAiTWF0cml4IHNpemU6ICRpIHggJGkgOiIKKyAgICAkQ1hYIC1PMyAtSS4uIC1ETkRFQlVHICBiZW5jaG1hcmsuY3BwIC1ETUFUU0laRT0kaSAtREVJR0VOX1VOUk9MTElOR19MSU1JVD00MDAgLW8gYmVuY2htYXJrICYmIHRpbWUgLi9iZW5jaG1hcmsgPi9kZXYvbnVsbAorICAgICRDWFggLU8zIC1JLi4gLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MTAwMDAgYmVuY2htYXJrLmNwcCAtRE1BVFNJWkU9JGkgLURFSUdFTl9ET05UX1VTRV9VTlJPTExFRF9MT09QUz0xIC1vIGJlbmNobWFyayAmJiB0aW1lIC4vYmVuY2htYXJrID4vZGV2L251bGwKKyAgICBlY2hvICIgIgorZG9uZQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2htYXJrLmNwcCBiL2JlbmNoL2JlbmNobWFyay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyMWI5MAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNobWFyay5jcHAKQEAgLTAsMCArMSwzOSBAQAorLy8gZysrIC1PMyAtRE5ERUJVRyAtRE1BVFNJWkU9PHg+IGJlbmNobWFyay5jcHAgLW8gYmVuY2htYXJrICYmIHRpbWUgLi9iZW5jaG1hcmsKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKworI2lmbmRlZiBNQVRTSVpFCisjZGVmaW5lIE1BVFNJWkUgMworI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCA0MDAwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgU0NBTEFSCisjZGVmaW5lIFNDQUxBUiBkb3VibGUKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIE1hdHJpeDxTQ0FMQVIsTUFUU0laRSxNQVRTSVpFPiBJID0gTWF0cml4PFNDQUxBUixNQVRTSVpFLE1BVFNJWkU+OjpPbmVzKCk7CisgICAgTWF0cml4PFNDQUxBUixNQVRTSVpFLE1BVFNJWkU+IG07CisgICAgZm9yKGludCBpID0gMDsgaSA8IE1BVFNJWkU7IGkrKykKKyAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IE1BVFNJWkU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgbShpLGopID0gKGkrTUFUU0laRSpqKTsKKyAgICAgICAgfQorICAgIGFzbSgiI2JlZ2luIik7CisgICAgZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQorICAgIHsKKyAgICAgICAgbSA9IE1hdHJpeDxTQ0FMQVIsTUFUU0laRSxNQVRTSVpFPjo6T25lcygpICsgMC4wMDAwNSAqIChtICsgKG0qbSkpOworICAgIH0KKyAgICBhc20oIiNlbmQiKTsKKyAgICBjb3V0IDw8IG0gPDwgZW5kbDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNobWFya1NsaWNlLmNwcCBiL2JlbmNoL2JlbmNobWFya1NsaWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI4OWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2htYXJrU2xpY2UuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIGcrKyAtTzMgLUROREVCVUcgYmVuY2htYXJrWC5jcHAgLW8gYmVuY2htYXJrWCAmJiB0aW1lIC4vYmVuY2htYXJrWAorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMTAwMDAKKyNlbmRpZgorCisjaWZuZGVmIFNDQUxBUgorI2RlZmluZSBTQ0FMQVIgZmxvYXQKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICB0eXBlZGVmIE1hdHJpeDxTQ0FMQVIsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gTWF0OworICBNYXQgbSgxMDAsIDEwMCk7CisgIG0uc2V0UmFuZG9tKCk7CisKKyAgZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQorICB7CisgICAgaW50IHIsIGMsIG5yLCBuYzsKKyAgICByID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDEwKTsKKyAgICBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDEwKTsKKyAgICBuciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oNTAsODApOworICAgIG5jID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50Pig1MCw4MCk7CisgICAgbS5ibG9jayhyLGMsbnIsbmMpICs9IE1hdDo6T25lcyhucixuYyk7CisgICAgbS5ibG9jayhyLGMsbnIsbmMpICo9IFNDQUxBUigxMCk7CisgICAgbS5ibG9jayhyLGMsbnIsbmMpIC09IE1hdDo6Y29uc3RhbnQobnIsbmMsMTApOworICAgIG0uYmxvY2socixjLG5yLG5jKSAvPSBTQ0FMQVIoMTApOworICB9CisgIGNvdXQgPDwgbVswXSA8PCBlbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNobWFya1guY3BwIGIvYmVuY2gvYmVuY2htYXJrWC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0YjYwYwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2JlbmNobWFya1guY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIGcrKyAtZm9wZW5tcCAtSSAuLiAtTzMgLUROREVCVUcgLWZpbmxpbmUtbGltaXQ9MTAwMCBiZW5jaG1hcmtYLmNwcCAtbyBiICYmIHRpbWUgLi9iCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgTUFUVFlQRQorI2RlZmluZSBNQVRUWVBFIE1hdHJpeFhMZAorI2VuZGlmCisKKyNpZm5kZWYgTUFUU0laRQorI2RlZmluZSBNQVRTSVpFIDQwMAorI2VuZGlmCisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCAxMDAKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCU1BVFRZUEUgSSA9IE1BVFRZUEU6Ok9uZXMoTUFUU0laRSxNQVRTSVpFKTsKKwlNQVRUWVBFIG0oTUFUU0laRSxNQVRTSVpFKTsKKwlmb3IoaW50IGkgPSAwOyBpIDwgTUFUU0laRTsgaSsrKSBmb3IoaW50IGogPSAwOyBqIDwgTUFUU0laRTsgaisrKQorCXsKKwkJbShpLGopID0gKGkraisxKS8oTUFUU0laRSpNQVRTSVpFKTsKKwl9CisJZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQorCXsKKwkJbSA9IEkgKyAwLjAwMDEgKiAobSArIG0qbSk7CisJfQorCWNvdXQgPDwgbSgwLDApIDw8IGVuZGw7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaG1hcmtYY3dpc2UuY3BwIGIvYmVuY2gvYmVuY2htYXJrWGN3aXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQzNzQzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYmVuY2htYXJrWGN3aXNlLmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBnKysgLU8zIC1ETkRFQlVHIGJlbmNobWFya1guY3BwIC1vIGJlbmNobWFya1ggJiYgdGltZSAuL2JlbmNobWFya1gKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgVkVDVFlQRQorI2RlZmluZSBWRUNUWVBFIFZlY3RvclhMZAorI2VuZGlmCisKKyNpZm5kZWYgVkVDU0laRQorI2RlZmluZSBWRUNTSVpFIDEwMDAwMDAKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMTAwMAorI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJVkVDVFlQRSBJID0gVkVDVFlQRTo6T25lcyhWRUNTSVpFKTsKKwlWRUNUWVBFIG0oVkVDU0laRSwxKTsKKwlmb3IoaW50IGkgPSAwOyBpIDwgVkVDU0laRTsgaSsrKQorCXsKKwkJbVtpXSA9IDAuMSAqIGkvVkVDU0laRTsKKwl9CisJZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQorCXsKKwkJbSA9IFZFQ1RZUEU6Ok9uZXMoVkVDU0laRSkgKyAwLjAwMDA1ICogKG0uY3dpc2UoKS5zcXVhcmUoKSArIG0vNCk7CisJfQorCWNvdXQgPDwgbVswXSA8PCBlbmRsOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2htYXJrX3N1aXRlIGIvYmVuY2gvYmVuY2htYXJrX3N1aXRlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmMjFkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9iZW5jaG1hcmtfc3VpdGUKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL2Jhc2gKK0NYWD0ke0NYWC1nKyt9ICMgZGVmYXVsdCB2YWx1ZSB1bmxlc3MgY2FsbGVyIGhhcyBkZWZpbmVkIENYWAorZWNobyAiRml4ZWQgc2l6ZSAzeDMsIGNvbHVtbi1tYWpvciwgLUROREVCVUciCiskQ1hYIC1PMyAtSSAuLiAtRE5ERUJVRyBiZW5jaG1hcmsuY3BwIC1vIGJlbmNobWFyayAmJiB0aW1lIC4vYmVuY2htYXJrID4vZGV2L251bGwKK2VjaG8gIkZpeGVkIHNpemUgM3gzLCBjb2x1bW4tbWFqb3IsIHdpdGggYXNzZXJ0cyIKKyRDWFggLU8zIC1JIC4uIGJlbmNobWFyay5jcHAgLW8gYmVuY2htYXJrICYmIHRpbWUgLi9iZW5jaG1hcmsgPi9kZXYvbnVsbAorZWNobyAiRml4ZWQgc2l6ZSAzeDMsIHJvdy1tYWpvciwgLUROREVCVUciCiskQ1hYIC1PMyAtSSAuLiAtREVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SIC1ETkRFQlVHIGJlbmNobWFyay5jcHAgLW8gYmVuY2htYXJrICYmIHRpbWUgLi9iZW5jaG1hcmsgPi9kZXYvbnVsbAorZWNobyAiRml4ZWQgc2l6ZSAzeDMsIHJvdy1tYWpvciwgd2l0aCBhc3NlcnRzIgorJENYWCAtTzMgLUkgLi4gLURFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUiBiZW5jaG1hcmsuY3BwIC1vIGJlbmNobWFyayAmJiB0aW1lIC4vYmVuY2htYXJrID4vZGV2L251bGwKK2VjaG8gIkR5bmFtaWMgc2l6ZSAyMHgyMCwgY29sdW1uLW1ham9yLCAtRE5ERUJVRyIKKyRDWFggLU8zIC1JIC4uIC1ETkRFQlVHIGJlbmNobWFya1guY3BwIC1vIGJlbmNobWFya1ggJiYgdGltZSAuL2JlbmNobWFya1ggPi9kZXYvbnVsbAorZWNobyAiRHluYW1pYyBzaXplIDIweDIwLCBjb2x1bW4tbWFqb3IsIHdpdGggYXNzZXJ0cyIKKyRDWFggLU8zIC1JIC4uIGJlbmNobWFya1guY3BwIC1vIGJlbmNobWFya1ggJiYgdGltZSAuL2JlbmNobWFya1ggPi9kZXYvbnVsbAorZWNobyAiRHluYW1pYyBzaXplIDIweDIwLCByb3ctbWFqb3IsIC1ETkRFQlVHIgorJENYWCAtTzMgLUkgLi4gLURFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUiAtRE5ERUJVRyBiZW5jaG1hcmtYLmNwcCAtbyBiZW5jaG1hcmtYICYmIHRpbWUgLi9iZW5jaG1hcmtYID4vZGV2L251bGwKK2VjaG8gIkR5bmFtaWMgc2l6ZSAyMHgyMCwgcm93LW1ham9yLCB3aXRoIGFzc2VydHMiCiskQ1hYIC1PMyAtSSAuLiAtREVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SIGJlbmNobWFya1guY3BwIC1vIGJlbmNobWFya1ggJiYgdGltZSAuL2JlbmNobWFya1ggPi9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL0NNYWtlTGlzdHMudHh0IGIvYmVuY2gvYnRsL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWI0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMDQgQEAKK1BST0pFQ1QoQlRMKQorCitDTUFLRV9NSU5JTVVNX1JFUVVJUkVEKFZFUlNJT04gMi42LjIpCisKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAke1BST0pFQ1RfU09VUkNFX0RJUn0vY21ha2UgJHtFaWdlbl9TT1VSQ0VfRElSfS9jbWFrZSkKK2luY2x1ZGUoTWFjcm9PcHRpb25hbEFkZFN1YmRpcmVjdG9yeSkKKworT1BUSU9OKEJUTF9OT1ZFQyAiRGlzYWJsZSBTU0UvQWx0aXZlYyBvcHRpbWl6YXRpb25zIHdoZW4gcG9zc2libGUiIE9GRikKKworU0VUKENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCisKK3N0cmluZyhSRUdFWCBNQVRDSCBpY3BjIElTX0lDUEMgJHtDTUFLRV9DWFhfQ09NUElMRVJ9KQorSUYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYIE9SIElTX0lDUEMpCisgIFNFVChDTUFLRV9DWFhfRkxBR1MgIi1nMCAtTzMgLUROREVCVUciKQorICBTRVQoQ01BS0VfRm9ydHJhbl9GTEFHUyAiLWcwIC1PMyAtRE5ERUJVRyIpCisgIElGKE5PVCBCVExfTk9WRUMpCisgICAgU0VUKENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1tc3NlMiIpCisgICAgU0VUKENNQUtFX0ZvcnRyYW5fRkxBR1MgIiR7Q01BS0VfRm9ydHJhbl9GTEFHU30gLW1zc2UyIikKKyAgRUxTRShOT1QgQlRMX05PVkVDKQorICAgIFNFVChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtREVJR0VOX0RPTlRfVkVDVE9SSVpFIikKKyAgRU5ESUYoTk9UIEJUTF9OT1ZFQykKK0VORElGKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCBPUiBJU19JQ1BDKQorCitJRihNU1ZDKQorICBTRVQoQ01BS0VfQ1hYX0ZMQUdTICIgL08yIC9PdCAvR0wgL2ZwOmZhc3QgLUROREVCVUciKQorIyAgIFNFVChDTUFLRV9Gb3J0cmFuX0ZMQUdTICItZzAgLU8zIC1ETkRFQlVHIikKKyAgSUYoTk9UIEJUTF9OT1ZFQykKKyAgICBTRVQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gL2FyY2g6U1NFMiIpCisgIEVMU0UoTk9UIEJUTF9OT1ZFQykKKyAgICBTRVQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLURFSUdFTl9ET05UX1ZFQ1RPUklaRSIpCisgIEVORElGKE5PVCBCVExfTk9WRUMpCitFTkRJRihNU1ZDKQorCitpZihJU19JQ1BDKQorICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLWZhc3QiKQorICBzZXQoQ01BS0VfRm9ydHJhbl9GTEFHUyAiJHtDTUFLRV9Gb3J0cmFuX0ZMQUdTfSAtZmFzdCIpCitlbmRpZihJU19JQ1BDKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAke1BST0pFQ1RfU09VUkNFX0RJUn0vYWN0aW9ucworICAke1BST0pFQ1RfU09VUkNFX0RJUn0vZ2VuZXJpY19iZW5jaAorICAke1BST0pFQ1RfU09VUkNFX0RJUn0vZ2VuZXJpY19iZW5jaC91dGlscworICAke1BST0pFQ1RfU09VUkNFX0RJUn0vbGlicy9TVEwpCisKKyMgZmluZF9wYWNrYWdlKE1LTCkKKyMgaWYgKE1LTF9GT1VORCkKKyMgICBhZGRfZGVmaW5pdGlvbnMoLURIQVZFX01LTCkKKyMgICBzZXQoREVGQVVMVF9MSUJSQVJJRVMgJHtNS0xfTElCUkFSSUVTfSkKKyMgZW5kaWYgKE1LTF9GT1VORCkKKworTUFDUk8oQlRMX0FERF9CRU5DSCB0YXJnZXRuYW1lKQorCisgIGZvcmVhY2goX2N1cnJlbnRfdmFyICR7QVJHTn0pCisgICAgc2V0KF9sYXN0X3ZhciAke19jdXJyZW50X3Zhcn0pCisgIGVuZGZvcmVhY2goX2N1cnJlbnRfdmFyKQorCisgIHNldChfc291cmNlcyAke0FSR059KQorICBsaXN0KExFTkdUSCBfc291cmNlcyBfYXJnbl9sZW5ndGgpCisKKyAgbGlzdChSRU1PVkVfSVRFTSBfc291cmNlcyBPTiBPRkYgVFJVRSBGQUxTRSkKKworICBsaXN0KExFTkdUSCBfc291cmNlcyBfc3JjX2xlbmd0aCkKKworICBpZiAoJHtfYXJnbl9sZW5ndGh9IEVRVUFMICR7X3NyY19sZW5ndGh9KQorICAgIHNldChfbGFzdF92YXIgT04pCisgIGVuZGlmICgke19hcmduX2xlbmd0aH0gRVFVQUwgJHtfc3JjX2xlbmd0aH0pCisKKyAgT1BUSU9OKEJVSUxEXyR7dGFyZ2V0bmFtZX0gIkJ1aWxkIGJlbmNobWFyayAke3RhcmdldG5hbWV9IiAke19sYXN0X3Zhcn0pCisKKyAgSUYoQlVJTERfJHt0YXJnZXRuYW1lfSkKKyAgICBBRERfRVhFQ1VUQUJMRSgke3RhcmdldG5hbWV9ICR7X3NvdXJjZXN9KQorICAgIEFERF9URVNUKCR7dGFyZ2V0bmFtZX0gIiR7dGFyZ2V0bmFtZX0iKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldG5hbWV9ICR7REVGQVVMVF9MSUJSQVJJRVN9IHJ0KQorICBFTkRJRihCVUlMRF8ke3RhcmdldG5hbWV9KQorCitFTkRNQUNSTyhCVExfQUREX0JFTkNIKQorCittYWNybyhidGxfYWRkX3RhcmdldF9wcm9wZXJ0eSB0YXJnZXQgcHJvcCB2YWx1ZSkKKworICBpZihCVUlMRF8ke3RhcmdldH0pCisgICAgZ2V0X3RhcmdldF9wcm9wZXJ0eShwcmV2aW91cyAke3RhcmdldH0gJHtwcm9wfSkKKyAgICBpZihOT1QgcHJldmlvdXMpCisgICAgICBzZXQocHJldmlvdXMgIiIpCisgICAgZW5kaWYoKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke3RhcmdldH0gUFJPUEVSVElFUyAke3Byb3B9ICIke3ByZXZpb3VzfSAke3ZhbHVlfSIpCisgIGVuZGlmKCkKKworZW5kbWFjcm8oYnRsX2FkZF90YXJnZXRfcHJvcGVydHkpCisKK0VOQUJMRV9URVNUSU5HKCkKKworYWRkX3N1YmRpcmVjdG9yeShsaWJzL2VpZ2VuMykKK2FkZF9zdWJkaXJlY3RvcnkobGlicy9laWdlbjIpCithZGRfc3ViZGlyZWN0b3J5KGxpYnMvQkxBUykKK2FkZF9zdWJkaXJlY3RvcnkobGlicy91YmxhcykKK2FkZF9zdWJkaXJlY3RvcnkobGlicy9nbW0pCithZGRfc3ViZGlyZWN0b3J5KGxpYnMvbXRsNCkKK2FkZF9zdWJkaXJlY3RvcnkobGlicy9ibGl0eikKK2FkZF9zdWJkaXJlY3RvcnkobGlicy90dm1ldCkKK2FkZF9zdWJkaXJlY3RvcnkobGlicy9TVEwpCisKK2FkZF9zdWJkaXJlY3RvcnkoZGF0YSkKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvQ09QWUlORyBiL2JlbmNoL2J0bC9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjQ0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvQ09QWUlORwpAQCAtMCwwICsxLDM0MCBAQAorICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICAgICAgICAgICAgICAgICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorCisgICAgICAgICAgICAgICAgICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKyAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvUkVBRE1FIGIvYmVuY2gvYnRsL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Y1ZmIzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL1JFQURNRQpAQCAtMCwwICsxLDE1NCBAQAorQmVuY2ggVGVtcGxhdGUgTGlicmFyeQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJbnRyb2R1Y3Rpb24gOgorCitUaGUgYWltIG9mIHRoaXMgcHJvamVjdCBpcyB0byBjb21wYXJlIHRoZSBwZXJmb3JtYW5jZQorb2YgYXZhaWxhYmxlIG51bWVyaWNhbCBsaWJyYXJpZXMuIFRoZSBjb2RlIGlzIGRlc2lnbmVkCithcyBnZW5lcmljIGFuZCBtb2R1bGFyIGFzIHBvc3NpYmxlLiBUaHVzLCBhZGRpbmcgbmV3CitudW1lcmljYWwgbGlicmFyaWVzIG9yIG5ldyBudW1lcmljYWwgdGVzdHMgc2hvdWxkCityZXF1aXJlIG1pbmltYWwgZWZmb3J0LgorCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0luc3RhbGxhdGlvbiA6CisKK0JUTCB1c2VzIGNtYWtlIC8gY3Rlc3Q6CisKKzEgLSBjcmVhdGUgYSBidWlsZCBkaXJlY3Rvcnk6CisKKyAgJCBta2RpciBidWlsZAorICAkIGNkIGJ1aWxkCisKKzIgLSBjb25maWd1cmU6CisKKyAgJCBjY21ha2UgLi4KKworMyAtIHJ1biB0aGUgYmVuY2ggdXNpbmcgY3Rlc3Q6CisKKyAgJCBjdGVzdCAtVgorCitZb3UgY2FuIHJ1biB0aGUgYmVuY2htYXJrcyBvbmx5IG9uIGxpYnJhcmllcyBtYXRjaGluZyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbjoKKyAgY3Rlc3QgLVYgLVIgPHJlZ2V4cD4KK0ZvciBpbnN0YW5jZToKKyAgY3Rlc3QgLVYgLVIgZWlnZW4yCisKK1lvdSBjYW4gYWxzbyBzZWxlY3QgYSBnaXZlbiBzZXQgb2YgYWN0aW9ucyBkZWZpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQlRMX0NPTkZJRyB0aGlzIHdheToKKyAgQlRMX0NPTkZJRz0iLWEgYWN0aW9uMXs6YWN0aW9uMn0qIiBjdGVzdCAtVgorQW4gZXhlbXBsZToKKyAgQlRMX0NPTkZJRz0iLWEgYXhweTp2ZWN0b3JfbWF0cml4OnRyaXNvbHZlOmF0YSIgY3Rlc3QgLVYgLVIgZWlnZW4yCisKK0ZpbmFsbHksIGlmIGJlbmNoIHJlc3VsdHMgYWxyZWFkeSBleGlzdCAodGhlIGJlbmNoKi5kYXQgZmlsZXMpIHRoZW4gdGhleSBtZXJnZXMgYnkga2VlcGluZyB0aGUgYmVzdCBmb3IgZWFjaCBtYXRyaXggc2l6ZS4gSWYgeW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBvbmVzIHlvdSBjYW4gc2ltcGx5IGFkZCB0aGUgIi0tb3ZlcndyaXRlIiBvcHRpb246CisgIEJUTF9DT05GSUc9Ii1hIGF4cHk6dmVjdG9yX21hdHJpeDp0cmlzb2x2ZTphdGEgLS1vdmVyd3JpdGUiIGN0ZXN0IC1WIC1SIGVpZ2VuMgorCis0IDogQW5hbHl6ZSB0aGUgcmVzdWx0LiBkaWZmZXJlbnQgZGF0YSBmaWxlcyAoLmRhdCkgYXJlIHByb2R1Y2VkIGluIGVhY2ggbGlicyBkaXJlY3Rvcmllcy4KKyBJZiBnbnVwbG90IGlzIGF2YWlsYWJsZSwgY2hvb3NlIGEgZGlyZWN0b3J5IG5hbWUgaW4gdGhlIGRhdGEgZGlyZWN0b3J5IHRvIHN0b3JlIHRoZSByZXN1bHRzIGFuZCB0eXBlOgorICAgICAgICAkIGNkIGRhdGEKKyAgICAgICAgJCBta2RpciBteV9kaXJlY3RvcnkKKyAgICAgICAgJCBjcCAuLi9saWJzLyovKi5kYXQgbXlfZGlyZWN0b3J5CisgQnVpbGQgdGhlIGRhdGEgdXRpbGl0aWVzIGluIHRoaXMgKGRhdGEpIGRpcmVjdG9yeQorICAgICAgICBtYWtlCisgVGhlbiB5b3UgY2FuIGxvb2sgdGhlIHJhdyBkYXRhLAorICAgICAgICBnb19tZWFuIG15X2RpcmVjdG9yeQorIG9yIHNtb290aCB0aGUgZGF0YSBmaXJzdCA6CisJc21vb3RoX2FsbC5zaCBteV9kaXJlY3RvcnkKKwlnb19tZWFuIG15X2RpcmVjdG9yeV9zbW9vdGgKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0ZpbGVzIGFuZCBkaXJlY3RvcmllcyA6CisKKyBnZW5lcmljX2JlbmNoIDogYWxsIHRoZSBiZW5jaCBzb3VyY2VzIGNvbW1vbiB0byBhbGwgbGlicmFyaWVzCisKKyBhY3Rpb25zIDogc291cmNlcyBmb3IgZGlmZmVyZW50IGFjdGlvbiB3cmFwcGVycyAoYXhweSwgbWF0cml4LW1hdHJpeCBwcm9kdWN0KSB0byBiZSB0ZXN0ZWQuCisKKyBsaWJzLyogOiBiZW5jaCBzb3VyY2VzIHNwZWNpZmljIHRvIGVhY2ggdGVzdGVkIGxpYnJhcmllcy4KKworIG1hY2hpbmVfZGVwIDogZGlyZWN0b3J5IHVzZWQgdG8gc3RvcmUgbWFjaGluZSBzcGVjaWZpYyBNYWtlZmlsZS5pbgorCisgZGF0YSA6IGRpcmVjdG9yeSB1c2VkIHRvIHN0b3JlIGdudXBsb3Qgc2NyaXB0cyBhbmQgZGF0YSBhbmFseXNpcyB1dGlsaXRpZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworUHJpbmNpcGxlcyA6IHRoZSBjb2RlIG1vZHVsYXJpdHkgaXMgYWNoaWV2ZWQgYnkgZGVmaW5pbmcgdHdvIGNvbmNlcHRzIDoKKworICoqKioqKiBBY3Rpb24gY29uY2VwdCA6IFRoaXMgaXMgYSBjbGFzcyBkZWZpbmluZyB3aGljaCBraW5kCisgIG9mIHRlc3QgbXVzdCBiZSBwZXJmb3JtZWQgKGUuZy4gYSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QpLgorCUFuIEFjdGlvbiBzaG91bGQgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyA6CisKKyAgICAgICAgKioqIEN0b3IgdXNpbmcgdGhlIHNpemUgb2YgdGhlIHByb2JsZW0gKG1hdHJpeCBvciB2ZWN0b3Igc2l6ZSkgYXMgYW4gYXJndW1lbnQKKwkgICAgQWN0aW9uIGFjdGlvbihzaXplKTsKKyAgICAgICAgKioqIGluaXRpYWxpemUgOiB0aGlzIG1ldGhvZCBpbml0aWFsaXplIHRoZSBjYWxjdWxhdGlvbiAoZS5nLiBpbml0aWFsaXplIHRoZSBtYXRyaWNlcyBhbmQgdmVjdG9ycyBhcmd1bWVudHMpCisJICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CisJKioqIGNhbGN1bGF0ZSA6IHRoaXMgbWV0aG9kIGFjdHVhbGx5IGxhdW5jaCB0aGUgY2FsY3VsYXRpb24gdG8gYmUgYmVuY2htYXJrZWQKKwkgICAgYWN0aW9uLmNhbGN1bGF0ZTsKKwkqKiogbmJfb3BfYmFzZSgpIDogdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY29tcGxleGl0eSBvZiB0aGUgY2FsY3VsYXRlIG1ldGhvZCAoYWxsb3dpbmcgdGhlIG1mbG9wcyBldmFsdWF0aW9uKQorICAgICAgICAqKiogbmFtZSgpIDogdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWN0aW9uIChzdGQ6OnN0cmluZykKKworICoqKioqKiBJbnRlcmZhY2UgY29uY2VwdCA6IFRoaXMgaXMgYSBjbGFzcyBvciBuYW1lc3BhY2UgZGVmaW5pbmcgaG93IHRvIHVzZSBhIGdpdmVuIGxpYnJhcnkgYW5kCisgIGl0cyBzcGVjaWZpYyBjb250YWluZXJzIChtYXRyaXggYW5kIHZlY3RvcikuIFVwIHRvIG5vdyBhbiBpbnRlcmZhY2Ugc2hvdWxkIGZvbGxvd2luZyB0eXBlcworCisJKioqIHJlYWxfdHlwZSA6IGtpbmQgb2YgZmxvYXQgdG8gYmUgdXNlZCAoZmxvYXQgb3IgZG91YmxlKQorCSoqKiBzdGxfdmVjdG9yIDogbXVzdCBjb3JyZXNwb25kIHRvIHN0ZDo6dmVjdG9yPHJlYWxfdHlwZT4KKwkqKiogc3RsX21hdHJpeCA6IG11c3QgY29ycmVzcG9uZCB0byBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yPgorCSoqKiBnZW5lX3ZlY3RvciA6IHRoZSB2ZWN0b3IgdHlwZSBmb3IgdGhpcyBpbnRlcmZhY2UgICAgICAgIC0tPiBlLmcuIChyZWFsX3R5cGUgKikgZm9yIHRoZSBDX2ludGVyZmFjZQorCSoqKiBnZW5lX21hdHJpeCA6IHRoZSBtYXRyaXggdHlwZSBmb3IgdGhpcyBpbnRlcmZhY2UgICAgICAgIC0tPiBlLmcuIChnZW5lX3ZlY3RvciAqKSBmb3IgdGhlIENfaW50ZXJmYWNlCisKKwkrIHRoZSBmb2xsb3dpbmcgY29tbW9uIG1ldGhvZHMKKworICAgICAgICAqKiogZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiBBLCBpbnQgTikgIGRlYWxvY2F0aW9uIG9mIGEgTiBzaXplZCBnZW5lX21hdHJpeCBBCisgICAgICAgICoqKiBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpICBkZWFsb2NhdGlvbiBvZiBhIE4gc2l6ZWQgZ2VuZV92ZWN0b3IgQgorICAgICAgICAqKiogbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKSBjb3B5IHRoZSBjb250ZW50IG9mIGFuIHN0bF9tYXRyaXggQV9zdGwgaW50byBhIGdlbmVfbWF0cml4IEEuCisJICAgICBUaGUgYWxsb2NhdGlvbiBvZiBBIGlzIGRvbmUgaW4gdGhpcyBmdW5jdGlvbi4KKwkqKiogdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCkgIGNvcHkgdGhlIGNvbnRlbnQgb2YgYW4gc3RsX3ZlY3RvciBCX3N0bCBpbnRvIGEgZ2VuZV92ZWN0b3IgQi4KKwkgICAgIFRoZSBhbGxvY2F0aW9uIG9mIEIgaXMgZG9uZSBpbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICAqKiogbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCkgY29weSB0aGUgY29udGVudCBvZiBhbiBnZW5lX21hdHJpeCBBIGludG8gYW4gc3RsX21hdHJpeCBBX3N0bC4KKyAgICAgICAgICAgICBUaGUgc2l6ZSBvZiBBX1NUTCBtdXN0IGNvcnJlc3BvbmRzIHRvIHRoZSBzaXplIG9mIEEuCisgICAgICAgICoqKiB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQSwgc3RsX3ZlY3RvciAmIEFfc3RsKSBjb3B5IHRoZSBjb250ZW50IG9mIGFuIGdlbmVfdmVjdG9yIEEgaW50byBhbiBzdGxfdmVjdG9yIEFfc3RsLgorICAgICAgICAgICAgIFRoZSBzaXplIG9mIEJfU1RMIG11c3QgY29ycmVzcG9uZHMgdG8gdGhlIHNpemUgb2YgQi4KKwkqKiogY29weV9tYXRyaXgoZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKSA6IGNvcHkgdGhlIGNvbnRlbnQgb2Ygc291cmNlIGluIGNpYmxlLiBCb3RoIHNvdXJjZQorCQlhbmQgY2libGUgbXVzdCBiZSBzaXplZCBOeE4uCisJKioqIGNvcHlfdmVjdG9yKGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgTikgOiBjb3B5IHRoZSBjb250ZW50IG9mIHNvdXJjZSBpbiBjaWJsZS4gQm90aCBzb3VyY2UKKyAJCWFuZCBjaWJsZSBtdXN0IGJlIHNpemVkIE4uCisKKwlhbmQgdGhlIGZvbGxvd2luZyBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgYWN0aW9uIG9uZSB3YW50cyB0byBiZSBiZW5jaG1hcmtlZCA6CisKKwkqKiogIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTikKKwkqKiogIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTikKKyAgICAgICAgKioqICBhdGFfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pCisJKioqICBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pCisgICAgICAgICoqKiAgYXhweShyZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTikKKworIFRoZSBiZW5jaCBhbGdvcml0aG0gKGdlbmVyaWNfYmVuY2gvYmVuY2guaGgpIGlzIHRlbXBsYXRlZCB3aXRoIGFuIGFjdGlvbiBpdHNlbGYgdGVtcGxhdGVkIHdpdGgKKyBhbiBpbnRlcmZhY2UuIEEgdHlwaWNhbCBtYWluLmNwcCBzb3VyY2Ugc3RvcmVkIGluIGEgZ2l2ZW4gbGlicmFyeSBkaXJlY3RvcnkgbGlicy9BX0xJQgorIGxvb2tzIGxpa2UgOgorCisgYmVuY2g8IEFOX0FDVElPTiA8IEFOX0lOVEVSRkFDRSA+ID4oIDEwICwgMTAwMCAsIDUwICkgOworCisgdGhpcyBmdW5jdGlvbiB3aWxsIHByb2R1Y2UgWFkgZGF0YSBmaWxlIGNvbnRhaW5pbmcgbWVhc3VyZWQgIG1mbG9wcyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBzaXplIGZvciA1MAorIHNpemVzIGJldHdlZW4gMTAgYW5kIDEwMDAwLgorCisgVGhpcyBhbGdvcml0aG0gY2FuIGJlIGFkYXB0ZWQgYnkgcHJvdmlkaW5nIGEgZ2l2ZW4gUGVyZl9BbmFseXplciBvYmplY3Qgd2hpY2ggZGV0ZXJtaW5lcyBob3cgdGhlIHRpbWUKKyBtZWFzdXJlbWVudHMgbXVzdCBiZSBkb25lLiBGb3IgZXhhbXBsZSwgdGhlIFg4Nl9QZXJmX0FuYWx5emVyIHVzZSB0aGUgYXNtIHJkdHNjIGZ1bmN0aW9uIGFuZCBwcm92aWRlcworIGEgdmVyeSBmYXN0IGFuZCBhY2N1cmF0ZSAoYnV0IGxlc3MgcG9ydGFibGUpIHRpbWluZyBtZXRob2QuIFRoZSBkZWZhdWx0IGlzIHRoZSBQb3J0YWJsZV9QZXJmX0FuYWx5emVyCisgc28KKworIGJlbmNoPCBBTl9BQ1RJT04gPCBBTl9JTlRFUkZBQ0UgPiA+KCAxMCAsIDEwMDAgLCA1MCApIDsKKworIGlzIGVxdWl2YWxlbnQgdG8KKworIGJlbmNoPCBQb3J0YWJsZV9QZXJmX0FuYWx5emVyLEFOX0FDVElPTiA8IEFOX0lOVEVSRkFDRSA+ID4oIDEwICwgMTAwMCAsIDUwICkgOworCisgSWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgaXQgd2Ugc3VnZ2VzdCB0byB1c2UgYSBtaXhlZCBpbXBsZW1lbnRhdGlvbiAoWDg2X3BlcmZfQW5hbHl6ZXIrUG9ydGFibGVfUGVyZl9BbmFseXplcikuCisgcmVwbGFjZQorICAgICBiZW5jaDxQb3J0YWJsZV9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOworIHdpdGgKKyAgICAgYmVuY2g8TWl4ZWRfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKKyBpbiBnZW5lcmljL2JlbmNoLmhoCisKKy4KKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hYXRfcHJvZHVjdC5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hYXRfcHJvZHVjdC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTViMzVjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2FhdF9wcm9kdWN0LmhoCkBAIC0wLDAgKzEsMTQ1IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX2FhdF9wcm9kdWN0LmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX0FBVF9QUk9EVUNUCisjZGVmaW5lIEFDVElPTl9BQVRfUFJPRFVDVAorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9hYXRfcHJvZHVjdCB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEFjdGlvbl9hYXRfcHJvZHVjdCggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX2FhdF9wcm9kdWN0IEN0b3IiKTsKKworICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7CisKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX2FhdF9wcm9kdWN0KCBjb25zdCAgQWN0aW9uX2FhdF9wcm9kdWN0ICYgKQorICB7CisgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fYWF0X3Byb2R1Y3QgQ29weSBDdG9yIik7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIC8vIER0b3IKKworICB+QWN0aW9uX2FhdF9wcm9kdWN0KCB2b2lkICl7CisKKyAgICBNRVNTQUdFKCJBY3Rpb25fYWF0X3Byb2R1Y3QgRHRvciIpOworCisgICAgLy8gZGVhbGxvY2F0aW9uCisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKKworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJhYXRfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIGRvdWJsZShfc2l6ZSkqZG91YmxlKF9zaXplKSpkb3VibGUoX3NpemUpOworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworCisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsX3NpemUpOworCisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisKKyAgICAgIEludGVyZmFjZTo6YWF0X3Byb2R1Y3QoQSxYLF9zaXplKTsKKworICB9CisKKyAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKyAgICBpZiAoX3NpemU+MTI4KSByZXR1cm47CisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKworICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLHJlc3Vfc3RsKTsKKworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjphYXRfcHJvZHVjdChBX3N0bCxYX3N0bCxfc2l6ZSk7CisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworCisgICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQV9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWF9yZWY7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFg7CisKKworICBpbnQgX3NpemU7CisKK307CisKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXRhX3Byb2R1Y3QuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXRhX3Byb2R1Y3QuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzNjRmZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hdGFfcHJvZHVjdC5oaApAQCAtMCwwICsxLDE0NSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9hdGFfcHJvZHVjdC5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9BVEFfUFJPRFVDVAorI2RlZmluZSBBQ1RJT05fQVRBX1BST0RVQ1QKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fYXRhX3Byb2R1Y3QgeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKworICBBY3Rpb25fYXRhX3Byb2R1Y3QoIGludCBzaXplICk6X3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl9hdGFfcHJvZHVjdCBDdG9yIik7CisKKyAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOworCisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorCisgIEFjdGlvbl9hdGFfcHJvZHVjdCggY29uc3QgIEFjdGlvbl9hdGFfcHJvZHVjdCAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2F0YV9wcm9kdWN0IENvcHkgQ3RvciIpOworICAgIGV4aXQoMCk7CisgIH0KKworICAvLyBEdG9yCisKKyAgfkFjdGlvbl9hdGFfcHJvZHVjdCggdm9pZCApeworCisgICAgTUVTU0FHRSgiQWN0aW9uX2F0YV9wcm9kdWN0IER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOworCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7CisKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAiYXRhXyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiAyLjAqX3NpemUqX3NpemUqX3NpemU7CisgIH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7CisKKyAgfQorCisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKworICAgICAgSW50ZXJmYWNlOjphdGFfcHJvZHVjdChBLFgsX3NpemUpOworCisgIH0KKworICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworCisgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgscmVzdV9zdGwpOworCisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmF0YV9wcm9kdWN0KEFfc3RsLFhfc3RsLF9zaXplKTsKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisKKyAgICBpZiAoZXJyb3I+MS5lLTYpeworICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisgICAgICBleGl0KDEpOworICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYX3JlZjsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEE7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKKworCisgIGludCBfc2l6ZTsKKworfTsKKworCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hdHZfcHJvZHVjdC5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hdHZfcHJvZHVjdC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODIzNDUxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F0dl9wcm9kdWN0LmhoCkBAIC0wLDAgKzEsMTM0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX2F0dl9wcm9kdWN0LmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX0FUVl9QUk9EVUNUCisjZGVmaW5lIEFDVElPTl9BVFZfUFJPRFVDVAorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9hdHZfcHJvZHVjdCB7CisKK3B1YmxpYyA6CisKKyAgQWN0aW9uX2F0dl9wcm9kdWN0KCBpbnQgc2l6ZSApIDogX3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl9hdHZfcHJvZHVjdCBDdG9yIik7CisKKyAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCX3JlZixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCxYX3N0bCk7CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorICBBY3Rpb25fYXR2X3Byb2R1Y3QoIGNvbnN0ICBBY3Rpb25fYXR2X3Byb2R1Y3QgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9hdHZfcHJvZHVjdCBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgfkFjdGlvbl9hdHZfcHJvZHVjdCggdm9pZCApCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fYXR2X3Byb2R1Y3QgRHRvciIpOworCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEJfcmVmKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFhfcmVmKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSgpIHsgcmV0dXJuICJhdHZfIiArIEludGVyZmFjZTo6bmFtZSgpOyB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKSB7IHJldHVybiAyLjAqX3NpemUqX3NpemU7IH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEJfcmVmLEIsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgQlRMX0FTTV9DT01NRU5UKCJiZWdpbiBhdHYiKTsKKyAgICBJbnRlcmZhY2U6OmF0dl9wcm9kdWN0KEEsQixYLF9zaXplKTsKKyAgICBCVExfQVNNX0NPTU1FTlQoImVuZCBhdHYiKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICkKKyAgeworICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCxyZXN1X3N0bCk7CisKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6YXR2X3Byb2R1Y3QoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKworICAgIGlmIChlcnJvcj4xLmUtNil7CisgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEFfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEJfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFhfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBCOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CisKKworICBpbnQgX3NpemU7CisKK307CisKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXhwYnkuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXhwYnkuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1MTFhYgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9heHBieS5oaApAQCAtMCwwICsxLDEyNyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9heHBieS5oaAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fQVhQQlkKKyNkZWZpbmUgQUNUSU9OX0FYUEJZCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX2F4cGJ5IHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisgIEFjdGlvbl9heHBieSggaW50IHNpemUgKTpfc2l6ZShzaXplKSxfYWxwaGEoMC41KSxfYmV0YSgwLjk1KQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX2F4cGJ5IEN0b3IiKTsKKworICAgIC8vIFNUTCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihYX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oWV9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWV9yZWYsWV9zdGwpOworCisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCxYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWSxZX3N0bCk7CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorICBBY3Rpb25fYXhwYnkoIGNvbnN0ICBBY3Rpb25fYXhwYnkgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9heHBieSBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorICB+QWN0aW9uX2F4cGJ5KCB2b2lkICl7CisgICAgTUVTU0FHRSgiQWN0aW9uX2F4cGJ5IER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWF9yZWYpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWV9yZWYpOworCisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFkpOworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAiYXhwYnlfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIDMuMCpfc2l6ZTsKKyAgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFhfcmVmLFgsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWV9yZWYsWSxfc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgQlRMX0FTTV9DT01NRU5UKCJteWJlZ2luIGF4cGJ5Iik7CisgICAgSW50ZXJmYWNlOjpheHBieShfYWxwaGEsWCxfYmV0YSxZLF9zaXplKTsKKyAgICBCVExfQVNNX0NPTU1FTlQoIm15ZW5kIGF4cGJ5Iik7CisgIH0KKworICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChZLHJlc3Vfc3RsKTsKKworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpheHBieShfYWxwaGEsWF9zdGwsX2JldGEsWV9zdGwsX3NpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFlfc3RsLHJlc3Vfc3RsKTsKKworICAgIGlmIChlcnJvcj4xLmUtNil7CisgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAgIGV4aXQoMik7CisgICAgfQorICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIFlfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBYX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBZX3JlZjsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWTsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBfYWxwaGE7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIF9iZXRhOworCisgIGludCBfc2l6ZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F4cHkuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXhweS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGNiM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F4cHkuaGgKQEAgLTAsMCArMSwxMzkgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBhY3Rpb25fYXhweS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9BWFBZCisjZGVmaW5lIEFDVElPTl9BWFBZCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX2F4cHkgeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKworICBBY3Rpb25fYXhweSggaW50IHNpemUgKTpfc2l6ZShzaXplKSxfY29lZigxLjApCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fYXhweSBDdG9yIik7CisKKyAgICAvLyBTVEwgdmVjdG9yIGluaXRpYWxpemF0aW9uCisKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihYX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oWV9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChZX3JlZixZX3N0bCk7CisKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChZLFlfc3RsKTsKKworCisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorCisgIEFjdGlvbl9heHB5KCBjb25zdCAgQWN0aW9uX2F4cHkgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9heHB5IENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBEdG9yCisKKyAgfkFjdGlvbl9heHB5KCB2b2lkICl7CisKKyAgICBNRVNTQUdFKCJBY3Rpb25fYXhweSBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWF9yZWYpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWV9yZWYpOworCisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFkpOworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJheHB5XyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiAyLjAqX3NpemU7CisgIH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZixYLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFlfcmVmLFksX3NpemUpOworICB9CisKKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgIEJUTF9BU01fQ09NTUVOVCgibXliZWdpbiBheHB5Iik7CisgICAgSW50ZXJmYWNlOjpheHB5KF9jb2VmLFgsWSxfc2l6ZSk7CisgICAgQlRMX0FTTV9DT01NRU5UKCJteWVuZCBheHB5Iik7CisgIH0KKworICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworCisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFkscmVzdV9zdGwpOworCisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmF4cHkoX2NvZWYsWF9zdGwsWV9zdGwsX3NpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFlfc3RsLHJlc3Vfc3RsKTsKKworICAgIGlmIChlcnJvcj4xLmUtNil7CisgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAgIGV4aXQoMCk7CisgICAgfQorCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWV9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFhfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFlfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBZOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIF9jb2VmOworCisgIGludCBfc2l6ZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2Nob2xlc2t5LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2Nob2xlc2t5LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjZkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fY2hvbGVza3kuaGgKQEAgLTAsMCArMSwxMjggQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBhY3Rpb25fY2hvbGVza3kuaGgKKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX0NIT0xFU0tZCisjZGVmaW5lIEFDVElPTl9DSE9MRVNLWQorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9jaG9sZXNreSB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEFjdGlvbl9jaG9sZXNreSggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX2Nob2xlc2t5IEN0b3IiKTsKKworICAgIC8vIFNUTCBtYXQvdmVjIGluaXRpYWxpemF0aW9uCisgICAgaW5pdF9tYXRyaXhfc3ltbTxwc2V1ZG9fcmFuZG9tPihYX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oQ19zdGwsX3NpemUpOworCisgICAgLy8gbWFrZSBzdXJlIFggaXMgaW52ZXJ0aWJsZQorICAgIGZvciAoaW50IGk9MDsgaTxfc2l6ZTsgKytpKQorICAgICAgWF9zdGxbaV1baV0gPSBzdGQ6OmFicyhYX3N0bFtpXVtpXSkgKiAxZTIgKyAxMDA7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsQ19zdGwpOworCisgICAgX2Nvc3QgPSAwOworICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZTsgKytqKQorICAgIHsKKyAgICAgIGRvdWJsZSByID0gc3RkOjptYXgoX3NpemUgLSBqIC0xLDApOworICAgICAgX2Nvc3QgKz0gMioocipqK3Iraik7CisgICAgfQorICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKworICBBY3Rpb25fY2hvbGVza3koIGNvbnN0ICBBY3Rpb25fY2hvbGVza3kgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9jaG9sZXNreSBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorCisgIH5BY3Rpb25fY2hvbGVza3koIHZvaWQgKXsKKworICAgIE1FU1NBR0UoIkFjdGlvbl9jaG9sZXNreSBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQyxfc2l6ZSk7CisgIH0KKworICAvLyBhY3Rpb24gbmFtZQorCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gImNob2xlc2t5XyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiBfY29zdDsKKyAgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsX3NpemUpOworICB9CisKKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgICAgSW50ZXJmYWNlOjpjaG9sZXNreShYLEMsX3NpemUpOworICB9CisKKyAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpjaG9sZXNreShYX3N0bCxDX3N0bCxfc2l6ZSk7CisvLworLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihDX3N0bCxyZXN1X3N0bCk7CisvLworLy8gICAgIGlmIChlcnJvcj4xLmUtNil7CisvLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKy8vICAgICAgIGV4aXQoMCk7CisvLyAgICAgfQorCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQ19zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEM7CisKKyAgaW50IF9zaXplOworICBkb3VibGUgX2Nvc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9nZXIuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fZ2VyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzY2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fZ2VyLmhoCkBAIC0wLDAgKzEsMTI4IEBACisKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fR0VSCisjZGVmaW5lIEFDVElPTl9HRVIKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fZ2VyIHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisgIEJUTF9ET05UX0lOTElORSBBY3Rpb25fZ2VyKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fZ2VyIEN0b3IiKTsKKworICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCB0bXA7CisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihYX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCX3JlZixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsWF9zdGwpOworICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKyAgQWN0aW9uX2dlciggY29uc3QgIEFjdGlvbl9nZXIgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9nZXIgQ29weSBDdG9yIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIER0b3IKKyAgQlRMX0RPTlRfSU5MSU5FIH5BY3Rpb25fZ2VyKCB2b2lkICl7CisgICAgTUVTU0FHRSgiQWN0aW9uX2dlciBEdG9yIik7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCX3JlZik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CisKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gImdlcl8iICsgSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiAyLjAqX3NpemUqX3NpemU7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihCX3JlZixCLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFhfcmVmLFgsX3NpemUpOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgIEJUTF9BU01fQ09NTUVOVCgiI2JlZ2luIGdlciIpOworICAgIEludGVyZmFjZTo6Z2VyKEEsQixYLF9zaXplKTsKKyAgICBCVExfQVNNX0NPTU1FTlQoImVuZCBnZXIiKTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgscmVzdV9zdGwpOworCisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmdlcihBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworCisgICAgaWYgKGVycm9yPjEuZS0zKXsKKyAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworLy8gICAgICAgZXhpdCgwKTsKKyAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBCX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBCX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBYX3JlZjsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEE7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBYOworCisgIGludCBfc2l6ZTsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25faGVzc2VuYmVyZy5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9oZXNzZW5iZXJnLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDBlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25faGVzc2VuYmVyZy5oaApAQCAtMCwwICsxLDIzMyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9oZXNzZW5iZXJnLmhoCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9IRVNTRU5CRVJHCisjZGVmaW5lIEFDVElPTl9IRVNTRU5CRVJHCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX2hlc3NlbmJlcmcgeworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKworICBBY3Rpb25faGVzc2VuYmVyZyggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX2hlc3NlbmJlcmcgQ3RvciIpOworCisgICAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKKworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KENfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsQ19zdGwpOworCisgICAgX2Nvc3QgPSAwOworICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZS0yOyArK2opCisgICAgeworICAgICAgZG91YmxlIHIgPSBzdGQ6Om1heCgwLF9zaXplLWotMSk7CisgICAgICBkb3VibGUgYiA9IHN0ZDo6bWF4KDAsX3NpemUtai0yKTsKKyAgICAgIF9jb3N0ICs9IDYgKyAzKmIgKyByKnIqNCArIHIqX3NpemUqNDsKKyAgICB9CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorCisgIEFjdGlvbl9oZXNzZW5iZXJnKCBjb25zdCAgQWN0aW9uX2hlc3NlbmJlcmcgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9oZXNzZW5iZXJnIENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBEdG9yCisKKyAgfkFjdGlvbl9oZXNzZW5iZXJnKCB2b2lkICl7CisKKyAgICBNRVNTQUdFKCJBY3Rpb25faGVzc2VuYmVyZyBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQyxfc2l6ZSk7CisgIH0KKworICAvLyBhY3Rpb24gbmFtZQorCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gImhlc3NlbmJlcmdfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIF9jb3N0OworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgICBJbnRlcmZhY2U6Omhlc3NlbmJlcmcoWCxDLF9zaXplKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoQyxyZXN1X3N0bCk7CisKKy8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6aGVzc2VuYmVyZyhYX3N0bCxDX3N0bCxfc2l6ZSk7CisvLworLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihDX3N0bCxyZXN1X3N0bCk7CisvLworLy8gICAgIGlmIChlcnJvcj4xLmUtNil7CisvLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKy8vICAgICAgIGV4aXQoMCk7CisvLyAgICAgfQorCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQ19zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFhfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFg7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQzsKKworICBpbnQgX3NpemU7CisgIGRvdWJsZSBfY29zdDsKK307CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24geworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKworICBBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uIEN0b3IiKTsKKworICAgIC8vIFNUTCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihYX3N0bCxfc2l6ZSk7CisgICAgCisgICAgZm9yKGludCBpPTA7IGk8X3NpemU7ICsraSkKKyAgICB7CisgICAgICBmb3IoaW50IGo9MDsgajxpOyArK2opCisgICAgICAgIFhfc3RsW2ldW2pdID0gWF9zdGxbal1baV07CisgICAgfQorICAgIAorICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KENfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsQ19zdGwpOworCisgICAgX2Nvc3QgPSAwOworICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZS0yOyArK2opCisgICAgeworICAgICAgZG91YmxlIHIgPSBzdGQ6Om1heCgwLF9zaXplLWotMSk7CisgICAgICBkb3VibGUgYiA9IHN0ZDo6bWF4KDAsX3NpemUtai0yKTsKKyAgICAgIF9jb3N0ICs9IDYuICsgMy4qYiArIHIqcio4LjsKKyAgICB9CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorCisgIEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24oIGNvbnN0ICBBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uICYgKQorICB7CisgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uIENvcHkgQ3RvciIpOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBEdG9yCisKKyAgfkFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24oIHZvaWQgKXsKKworICAgIE1FU1NBR0UoIkFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24gRHRvciIpOworCisgICAgLy8gZGVhbGxvY2F0aW9uCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEMsX3NpemUpOworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKSB7IHJldHVybiAidHJpZGlhZ29uYWxpemF0aW9uXyIrSW50ZXJmYWNlOjpuYW1lKCk7IH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiBfY29zdDsKKyAgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsX3NpemUpOworICB9CisKKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgICAgSW50ZXJmYWNlOjp0cmlkaWFnb25hbGl6YXRpb24oWCxDLF9zaXplKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoQyxyZXN1X3N0bCk7CisKKy8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6dHJpZGlhZ29uYWxpemF0aW9uKFhfc3RsLENfc3RsLF9zaXplKTsKKy8vCisvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisvLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKENfc3RsLHJlc3Vfc3RsKTsKKy8vCisvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKy8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworLy8gICAgICAgZXhpdCgwKTsKKy8vICAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBDX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWF9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBDOworCisgIGludCBfc2l6ZTsKKyAgZG91YmxlIF9jb3N0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbHVfZGVjb21wLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2x1X2RlY29tcC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQ4ZTgyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2x1X2RlY29tcC5oaApAQCAtMCwwICsxLDEyNCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9sdV9kZWNvbXAuaGgKKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX0xVX0RFQ09NUAorI2RlZmluZSBBQ1RJT05fTFVfREVDT01QCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX2x1X2RlY29tcCB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEFjdGlvbl9sdV9kZWNvbXAoIGludCBzaXplICk6X3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl9sdV9kZWNvbXAgQ3RvciIpOworCisgICAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKKworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KENfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsQ19zdGwpOworCisgICAgX2Nvc3QgPSAyLjAqc2l6ZSpzaXplKnNpemUvMy4wICsgc2l6ZSpzaXplOworICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKworICBBY3Rpb25fbHVfZGVjb21wKCBjb25zdCAgQWN0aW9uX2x1X2RlY29tcCAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2x1X2RlY29tcCBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorCisgIH5BY3Rpb25fbHVfZGVjb21wKCB2b2lkICl7CisKKyAgICBNRVNTQUdFKCJBY3Rpb25fbHVfZGVjb21wIER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChDLF9zaXplKTsKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAiY29tcGxldGVfbHVfZGVjb21wXyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiBfY29zdDsKKyAgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsX3NpemUpOworICB9CisKKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgICAgSW50ZXJmYWNlOjpsdV9kZWNvbXAoWCxDLF9zaXplKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoQyxyZXN1X3N0bCk7CisKKy8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bHVfZGVjb21wKFhfc3RsLENfc3RsLF9zaXplKTsKKy8vCisvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisvLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKENfc3RsLHJlc3Vfc3RsKTsKKy8vCisvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKy8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworLy8gICAgICAgZXhpdCgwKTsKKy8vICAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBDX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWF9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBDOworCisgIGludCBfc2l6ZTsKKyAgZG91YmxlIF9jb3N0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbHVfc29sdmUuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbHVfc29sdmUuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4MWU2MwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9sdV9zb2x2ZS5oaApAQCAtMCwwICsxLDEzNiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9sdV9zb2x2ZS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgQUNUSU9OX0xVX1NPTFZFCisjZGVmaW5lIEFDVElPTl9MVV9TT0xWRQorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgImluaXQvaW5pdF9mdW5jdGlvbi5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK2NsYXNzIEFjdGlvbl9sdV9zb2x2ZSAKK3sKKworcHVibGljIDoKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJsdV9zb2x2ZV8iK0ludGVyZmFjZTo6bmFtZSgpOworICB9CisgIAorICBzdGF0aWMgZG91YmxlIG5iX29wX2Jhc2UoaW50IHNpemUpeworICAgIHJldHVybiAyLjAqc2l6ZSpzaXplKnNpemUvMy4wOyAgLy8gcXVlc3Rpb25hYmxlIGJ1dCBub3QgcmVhbGx5IGltcG9ydGFudAorICB9CisKKworICBzdGF0aWMgZG91YmxlIGNhbGN1bGF0ZSggaW50IG5iX2NhbGMsIGludCBzaXplICkgeworCisgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBCX3N0bDsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CisKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxzaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCxzaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihYX3N0bCxzaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEI7CisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBYOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBMVTsgCisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChMVSxBX3N0bCk7CisgIAorICAgIC8vIGxvY2FsIHZhcmlhYmxlIDoKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6UGl2b3RfVmVjdG9yIHBpdm90OyAvLyBwaXZvdCB2ZWN0b3IKKyAgICBJbnRlcmZhY2U6Om5ld19QaXZvdF9WZWN0b3IocGl2b3Qsc2l6ZSk7CisgICAgCisgICAgLy8gdGltZXIgdXRpbGl0aWVzCisKKyAgICBQb3J0YWJsZV9UaW1lciBjaHJvbm9zOworCisgICAgLy8gdGltZSBtZWFzdXJlbWVudAorCisgICAgY2hyb25vcy5zdGFydCgpOworICAgIAorICAgIGZvciAoaW50IGlpPTA7aWk8bmJfY2FsYztpaSsrKXsKKworICAgICAgLy8gTFUgZmFjdG9yaXphdGlvbgorICAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBLExVLHNpemUpOworICAgICAgSW50ZXJmYWNlOjpMVV9mYWN0b3IoTFUscGl2b3Qsc2l6ZSk7CisgICAgICAKKyAgICAgIC8vIExVIHNvbHZlCisKKyAgICAgIEludGVyZmFjZTo6TFVfc29sdmUoTFUscGl2b3QsQixYLHNpemUpOworCisgICAgfQorCisgICAgLy8gVGltZSBzdG9wCisKKyAgICBjaHJvbm9zLnN0b3AoKTsKKworICAgIGRvdWJsZSB0aW1lPWNocm9ub3MudXNlcl90aW1lKCk7CisgIAorICAgIC8vIGNoZWNrIHJlc3VsdCA6CisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQl9uZXdfc3RsKHNpemUpOworICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLFhfc3RsKTsKKworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfdmVjdG9yX3Byb2R1Y3QoQV9zdGwsWF9zdGwsQl9uZXdfc3RsLHNpemUpOyAKKyAgCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKEJfc3RsLEJfbmV3X3N0bCk7CisgICAgCisgICAgaWYgKGVycm9yPjEuZS01KXsKKyAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmRpc3BsYXlfdmVjdG9yKEJfc3RsKTsKKyAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpkaXNwbGF5X3ZlY3RvcihCX25ld19zdGwpOworICAgICAgZXhpdCgwKTsKKyAgICB9CisgICAgCisgICAgLy8gZGVhbGxvY2F0aW9uIGFuZCByZXR1cm4gdGltZQorICAgIAorICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxzaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CisgICAgSW50ZXJmYWNlOjpmcmVlX1Bpdm90X1ZlY3RvcihwaXZvdCk7CisKKyAgICByZXR1cm4gdGltZTsKKyAgfQorCit9OworICAKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVlZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaApAQCAtMCwwICsxLDE1MCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fTUFUUklYX01BVFJJWF9QUk9EVUNUCisjZGVmaW5lIEFDVElPTl9NQVRSSVhfTUFUUklYX1BST0RVQ1QKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0IHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCBDdG9yIik7CisKKyAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCX3JlZixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7CisKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCggY29uc3QgIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgQ29weSBDdG9yIik7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIC8vIER0b3IKKworICB+QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCggdm9pZCApeworCisgICAgTUVTU0FHRSgiQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOworCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7CisKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAibWF0cml4X21hdHJpeF8iK0ludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgICByZXR1cm4gMi4wKl9zaXplKl9zaXplKl9zaXplOworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworCisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEJfcmVmLEIsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7CisKKyAgfQorCisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKyAgICAgIEludGVyZmFjZTo6bWF0cml4X21hdHJpeF9wcm9kdWN0KEEsQixYLF9zaXplKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworICAgIGlmIChfc2l6ZTwyMDApCisgICAgeworICAgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgscmVzdV9zdGwpOworICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisgICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisgICAgICBpZiAoZXJyb3I+MS5lLTYpeworICAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQl9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQV9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQl9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWF9yZWY7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEI7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKKworCisgIGludCBfc2l6ZTsKKworfTsKKworCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3RfYmlzLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdF9iaXMuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljMTBhNgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3RfYmlzLmhoCkBAIC0wLDAgKzEsMTUyIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdF9iaXMuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fTUFUUklYX01BVFJJWF9QUk9EVUNUX0JJUworI2RlZmluZSBBQ1RJT05fTUFUUklYX01BVFJJWF9QUk9EVUNUX0JJUworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiU1RMX3RpbWVyLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXRfdmVjdG9yLmhoIgorI2luY2x1ZGUgImluaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0X2JpcyB7CisKK3B1YmxpYyA6CisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAibWF0cml4X21hdHJpeF8iK0ludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgc3RhdGljIGRvdWJsZSBuYl9vcF9iYXNlKGludCBzaXplKXsKKyAgICByZXR1cm4gMi4wKnNpemUqc2l6ZSpzaXplOworICB9CisKKyAgc3RhdGljIGRvdWJsZSBjYWxjdWxhdGUoIGludCBuYl9jYWxjLCBpbnQgc2l6ZSApIHsKKworICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBCX3N0bDsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CisKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxzaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihCX3N0bCxzaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihYX3N0bCxzaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQV9yZWY7CisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBCX3JlZjsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFhfcmVmOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQjsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IFg7CisKKworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCX3JlZixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7CisKKworICAgIC8vIFNUTF90aW1lciB1dGlsaXRpZXMKKworICAgIFNUTF90aW1lciBjaHJvbm9zOworCisgICAgLy8gQmFzZWxpbmUgZXZhbHVhdGlvbgorCisgICAgY2hyb25vcy5zdGFydF9iYXNlbGluZShuYl9jYWxjKTsKKworICAgIGRvIHsKKworICAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLHNpemUpOworICAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChCX3JlZixCLHNpemUpOworICAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLHNpemUpOworCisKKyAgICAgIC8vICAgICAgSW50ZXJmYWNlOjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQSxCLFgsc2l6ZSk7IFRoaXMgbGluZSBtdXN0IGJlIGNvbW1lbnRlZCAhISEhCisgICAgfQorICAgIHdoaWxlKGNocm9ub3MuY2hlY2soKSk7CisKKyAgICBjaHJvbm9zLnJlcG9ydCh0cnVlKTsKKworICAgIC8vIFRpbWUgbWVhc3VyZW1lbnQKKworICAgIGNocm9ub3Muc3RhcnQobmJfY2FsYyk7CisKKyAgICBkbyB7CisKKyAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxzaXplKTsKKyAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsQixzaXplKTsKKyAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxzaXplKTsKKworICAgICAgSW50ZXJmYWNlOjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQSxCLFgsc2l6ZSk7IC8vIGhlcmUgaXQgaXMgbm90IGNvbW1lbnRlZCAhISEhCisgICAgfQorICAgIHdoaWxlKGNocm9ub3MuY2hlY2soKSk7CisKKyAgICBjaHJvbm9zLnJlcG9ydCh0cnVlKTsKKworICAgIGRvdWJsZSB0aW1lPWNocm9ub3MuY2FsY3VsYXRlZF90aW1lLzIwMDAuMDsKKworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGwoc2l6ZSk7CisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7CisKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bWF0cml4X21hdHJpeF9wcm9kdWN0KEFfc3RsLEJfc3RsLFhfc3RsLHNpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKworICAgIGlmIChlcnJvcj4xLmUtNil7CisgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLy8gZGVhbGxvY2F0aW9uIGFuZCByZXR1cm4gdGltZQorCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLHNpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQixzaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsc2l6ZSk7CisKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLHNpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQl9yZWYsc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixzaXplKTsKKworICAgIHJldHVybiB0aW1lOworICB9CisKK307CisKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFiNzlkCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaApAQCAtMCwwICsxLDE1MyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fTUFUUklYX1ZFQ1RPUl9QUk9EVUNUCisjZGVmaW5lIEFDVElPTl9NQVRSSVhfVkVDVE9SX1BST0RVQ1QKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0IHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QoIGludCBzaXplICk6X3NpemUoc2l6ZSkKKyAgeworICAgIE1FU1NBR0UoIkFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QgQ3RvciIpOworCisgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKworICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKworICBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KCBjb25zdCAgQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorCisgIEJUTF9ET05UX0lOTElORSB+QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCggdm9pZCApeworCisgICAgTUVTU0FHRSgiQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFgpOworCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCX3JlZik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CisKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAibWF0cml4X3ZlY3Rvcl8iICsgSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiAyLjAqX3NpemUqX3NpemU7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworCisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEJfcmVmLEIsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7CisKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKyAgICAgIEJUTF9BU01fQ09NTUVOVCgiI2JlZ2luIG1hdHJpeF92ZWN0b3JfcHJvZHVjdCIpOworICAgICAgSW50ZXJmYWNlOjptYXRyaXhfdmVjdG9yX3Byb2R1Y3QoQSxCLFgsX3NpemUpOworICAgICAgQlRMX0FTTV9DT01NRU5UKCJlbmQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0Iik7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCxyZXN1X3N0bCk7CisKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bWF0cml4X3ZlY3Rvcl9wcm9kdWN0KEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisKKyAgICBpZiAoZXJyb3I+MS5lLTUpeworICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisgICAgICBleGl0KDApOworICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEFfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEJfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFhfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBCOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CisKKworICBpbnQgX3NpemU7CisKK307CisKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fcGFydGlhbF9sdS5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9wYXJ0aWFsX2x1LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MGVhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fcGFydGlhbF9sdS5oaApAQCAtMCwwICsxLDEyNSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9sdV9kZWNvbXAuaGgKKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX1BBUlRJQUxfTFUKKyNkZWZpbmUgQUNUSU9OX1BBUlRJQUxfTFUKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fcGFydGlhbF9sdSB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEFjdGlvbl9wYXJ0aWFsX2x1KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fcGFydGlhbF9sdSBDdG9yIik7CisKKyAgICAvLyBTVEwgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oWF9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KENfc3RsLF9zaXplKTsKKworICAgIC8vIG1ha2Ugc3VyZSBYIGlzIGludmVydGlibGUKKyAgICBmb3IgKGludCBpPTA7IGk8X3NpemU7ICsraSkKKyAgICAgIFhfc3RsW2ldW2ldID0gWF9zdGxbaV1baV0gKiAxZTIgKyAxOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChDLENfc3RsKTsKKworICAgIF9jb3N0ID0gMi4wKnNpemUqc2l6ZSpzaXplLzMuMCArIHNpemUqc2l6ZTsKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX3BhcnRpYWxfbHUoIGNvbnN0ICBBY3Rpb25fcGFydGlhbF9sdSAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX3BhcnRpYWxfbHUgQ29weSBDdG9yIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIER0b3IKKworICB+QWN0aW9uX3BhcnRpYWxfbHUoIHZvaWQgKXsKKworICAgIE1FU1NBR0UoIkFjdGlvbl9wYXJ0aWFsX2x1IER0b3IiKTsKKworICAgIC8vIGRlYWxsb2NhdGlvbgorICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChDLF9zaXplKTsKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAicGFydGlhbF9sdV9kZWNvbXBfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIF9jb3N0OworICB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgICBJbnRlcmZhY2U6OnBhcnRpYWxfbHVfZGVjb21wKFgsQyxfc2l6ZSk7CisgIH0KKworICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisvLyAgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKEMscmVzdV9zdGwpOworCisvLyAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Omx1X2RlY29tcChYX3N0bCxDX3N0bCxfc2l6ZSk7CisvLworLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihDX3N0bCxyZXN1X3N0bCk7CisvLworLy8gICAgIGlmIChlcnJvcj4xLmUtNil7CisvLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKy8vICAgICAgIGV4aXQoMCk7CisvLyAgICAgfQorCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQ19zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEM7CisKKyAgaW50IF9zaXplOworICBkb3VibGUgX2Nvc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9yb3QuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fcm90LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODIyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fcm90LmhoCkBAIC0wLDAgKzEsMTE2IEBACisKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fUk9UCisjZGVmaW5lIEFDVElPTl9ST1QKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fcm90IHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisgIEJUTF9ET05UX0lOTElORSBBY3Rpb25fcm90KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fcm90IEN0b3IiKTsKKworICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCB0bXA7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChBX3JlZixBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOworICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKyAgQWN0aW9uX3JvdCggY29uc3QgIEFjdGlvbl9yb3QgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9yb3QgQ29weSBDdG9yIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIER0b3IKKyAgQlRMX0RPTlRfSU5MSU5FIH5BY3Rpb25fcm90KCB2b2lkICl7CisgICAgTUVTU0FHRSgiQWN0aW9uX3JvdCBEdG9yIik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihBKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQV9yZWYpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQl9yZWYpOworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAicm90XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIDYuMCpfc2l6ZTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSAgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihBX3JlZixBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEJfcmVmLEIsX3NpemUpOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgIEJUTF9BU01fQ09NTUVOVCgiI2JlZ2luIHJvdCIpOworICAgIEludGVyZmFjZTo6cm90KEEsQiwwLjUsMC42LF9zaXplKTsKKyAgICBCVExfQVNNX0NPTU1FTlQoImVuZCByb3QiKTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisvLyAgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgscmVzdV9zdGwpOworCisvLyAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OnJvdChBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisKKy8vICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKy8vICAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworCisvLyAgICAgaWYgKGVycm9yPjEuZS0zKXsKKy8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworLy8gICAgICAgZXhpdCgwKTsKKy8vICAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQV9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBCX3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEFfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEJfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQTsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBCOworCisgIGludCBfc2l6ZTsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fc3ltdi5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9zeW12LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMmI5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fc3ltdi5oaApAQCAtMCwwICsxLDEzOSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9zeW12LmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX1NZTVYKKyNkZWZpbmUgQUNUSU9OX1NZTVYKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fc3ltdiB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEJUTF9ET05UX0lOTElORSBBY3Rpb25fc3ltdiggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX3N5bXYgQ3RvciIpOworCisgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgaW5pdF9tYXRyaXhfc3ltbTxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCxYX3N0bCk7CisKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX3N5bXYoIGNvbnN0ICBBY3Rpb25fc3ltdiAmICkKKyAgeworICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX3N5bXYgQ29weSBDdG9yIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIC8vIER0b3IKKyAgQlRMX0RPTlRfSU5MSU5FIH5BY3Rpb25fc3ltdiggdm9pZCApeworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFgpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQl9yZWYpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWF9yZWYpOworICB9CisKKyAgLy8gYWN0aW9uIG5hbWUKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICJzeW12XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsKKyAgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgICAgcmV0dXJuIDIuMCpfc2l6ZSpfc2l6ZTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSAgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoQl9yZWYsQixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZixYLF9zaXplKTsKKworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgICAgQlRMX0FTTV9DT01NRU5UKCIjYmVnaW4gc3ltdiIpOworICAgICAgSW50ZXJmYWNlOjpzeW12KEEsQixYLF9zaXplKTsKKyAgICAgIEJUTF9BU01fQ09NTUVOVCgiZW5kIHN5bXYiKTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKKworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpzeW12KEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisKKyAgICBpZiAoZXJyb3I+MS5lLTUpeworICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisgICAgICBleGl0KDApOworICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEFfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEJfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFhfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBCOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CisKKworICBpbnQgX3NpemU7CisKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fc3lyMi5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9zeXIyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNjcxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fc3lyMi5oaApAQCAtMCwwICsxLDEzMyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl9zeXIyLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQUNUSU9OX1NZUjIKKyNkZWZpbmUgQUNUSU9OX1NZUjIKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fc3lyMiB7CisKK3B1YmxpYyA6CisKKyAgLy8gQ3RvcgorCisgIEJUTF9ET05UX0lOTElORSBBY3Rpb25fc3lyMiggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHRtcDsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCxYX3N0bCk7CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorICBBY3Rpb25fc3lyMiggY29uc3QgIEFjdGlvbl9zeXIyICYgKQorICB7CisgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fc3lyMiBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorICBCVExfRE9OVF9JTkxJTkUgfkFjdGlvbl9zeXIyKCB2b2lkICl7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCX3JlZik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CisgIH0KKworICAvLyBhY3Rpb24gbmFtZQorCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gInN5cjJfIiArIEludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgICByZXR1cm4gMi4wKl9zaXplKl9zaXplOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FICB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoQl9yZWYsQixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZixYLF9zaXplKTsKKyAgfQorCisgIEJUTF9ET05UX0lOTElORSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKKyAgICAgIEJUTF9BU01fQ09NTUVOVCgiI2JlZ2luIHN5cjIiKTsKKyAgICAgIEludGVyZmFjZTo6c3lyMihBLEIsWCxfc2l6ZSk7CisgICAgICBCVExfQVNNX0NPTU1FTlQoImVuZCBzeXIyIik7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKKworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpzeXIyKEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisKKyAgICBpZiAoZXJyb3I+MS5lLTMpeworICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisvLyAgICAgICBleGl0KDApOworICAgIH0KKworICB9CisKK3ByaXZhdGUgOgorCisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciByZXN1X3N0bDsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEFfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEJfcmVmOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFhfcmVmOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBCOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CisKKworICBpbnQgX3NpemU7CisKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fdHJpc29sdmUuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fdHJpc29sdmUuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmMGI0NwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cmlzb2x2ZS5oaApAQCAtMCwwICsxLDEzNyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGFjdGlvbl90cmlzb2x2ZS5oaAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBBQ1RJT05fVFJJU09MVkUKKyNkZWZpbmUgQUNUSU9OX1RSSVNPTFZFCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX3RyaXNvbHZlIHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQWN0aW9uX3RyaXNvbHZlKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCisgIHsKKyAgICBNRVNTQUdFKCJBY3Rpb25fdHJpc29sdmUgQ3RvciIpOworCisgICAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KExfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZTsgKytqKQorICAgIHsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxqOyArK2kpCisgICAgICAgIExfc3RsW2pdW2ldID0gMDsKKyAgICAgIExfc3RsW2pdW2pdICs9IDM7CisgICAgfQorCisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEwsTF9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOworCisgICAgX2Nvc3QgPSAwOworICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZTsgKytqKQorICAgIHsKKyAgICAgIF9jb3N0ICs9IDIqaiArIDE7CisgICAgfQorICB9CisKKyAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKKworICBBY3Rpb25fdHJpc29sdmUoIGNvbnN0ICBBY3Rpb25fdHJpc29sdmUgJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl90cmlzb2x2ZSBDb3B5IEN0b3IiKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgLy8gRHRvcgorCisgIH5BY3Rpb25fdHJpc29sdmUoIHZvaWQgKXsKKworICAgIE1FU1NBR0UoIkFjdGlvbl90cmlzb2x2ZSBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEwsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQik7CisgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYKTsKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAidHJpc29sdmVfdmVjdG9yXyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiBfY29zdDsKKyAgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKyAgICAvL0ludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgICBJbnRlcmZhY2U6OnRyaXNvbHZlX2xvd2VyKEwsQixYLF9zaXplKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCl7CisgICAgaWYgKF9zaXplPjEyOCkgcmV0dXJuOworICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgscmVzdV9zdGwpOworCisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OnRyaXNvbHZlX2xvd2VyKExfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisKKyAgICBpZiAoZXJyb3I+MS5lLTQpeworICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisgICAgICBleGl0KDIpOworICAgIH0gLy9lbHNlIElORk9TKCJDQUxDVUxBVElPTiBPSy4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IExfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBCX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggTDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBYOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEI7CisKKyAgaW50IF9zaXplOworICBkb3VibGUgX2Nvc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cmlzb2x2ZV9tYXRyaXguaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fdHJpc29sdmVfbWF0cml4LmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzJiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fdHJpc29sdmVfbWF0cml4LmhoCkBAIC0wLDAgKzEsMTY1IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9UUklTT0xWRV9NQVRSSVhfUFJPRFVDVAorI2RlZmluZSBBQ1RJT05fVFJJU09MVkVfTUFUUklYX1BST0RVQ1QKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJTVExfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJpbml0L2luaXRfZnVuY3Rpb24uaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKKyNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitjbGFzcyBBY3Rpb25fdHJpc29sdmVfbWF0cml4IHsKKworcHVibGljIDoKKworICAvLyBDdG9yCisKKyAgQWN0aW9uX3RyaXNvbHZlX21hdHJpeCggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX3RyaXNvbHZlX21hdHJpeCBDdG9yIik7CisKKyAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKworICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZTsgKytqKQorICAgIHsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxqOyArK2kpCisgICAgICAgIEFfc3RsW2pdW2ldID0gMDsKKyAgICAgIEFfc3RsW2pdW2pdICs9IDM7CisgICAgfQorCisgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCLEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLFhfc3RsKTsKKworICAgIF9jb3N0ID0gMDsKKyAgICBmb3IgKGludCBqPTA7IGo8X3NpemU7ICsraikKKyAgICB7CisgICAgICBfY29zdCArPSAyKmogKyAxOworICAgIH0KKyAgICBfY29zdCAqPSBfc2l6ZTsKKyAgfQorCisgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCisKKyAgQWN0aW9uX3RyaXNvbHZlX21hdHJpeCggY29uc3QgIEFjdGlvbl90cmlzb2x2ZV9tYXRyaXggJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl90cmlzb2x2ZV9tYXRyaXggQ29weSBDdG9yIik7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIC8vIER0b3IKKworICB+QWN0aW9uX3RyaXNvbHZlX21hdHJpeCggdm9pZCApeworCisgICAgTUVTU0FHRSgiQWN0aW9uX3RyaXNvbHZlX21hdHJpeCBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOworCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7CisKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAidHJpc29sdmVfbWF0cml4XyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIH0KKworICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICAgIHJldHVybiBfY29zdDsKKyAgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKKworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChCX3JlZixCLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsX3NpemUpOworCisgIH0KKworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgICBJbnRlcmZhY2U6OnRyaXNvbHZlX2xvd2VyX21hdHJpeChBLEIsWCxfc2l6ZSk7CisgIH0KKworICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworCisgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKworLy8gICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLHJlc3Vfc3RsKTsKKy8vCisvLyAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisvLworLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisvLworLy8gICAgIGlmIChlcnJvcj4xLmUtNil7CisvLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKy8vIC8vICAgICAgIGV4aXQoMSk7CisvLyAgICAgfQorCisgIH0KKworcHJpdmF0ZSA6CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQl9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBYX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHJlc3Vfc3RsOworCisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQV9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQl9yZWY7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWF9yZWY7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEI7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKKworICBpbnQgX3NpemU7CisgIGRvdWJsZSBfY29zdDsKKworfTsKKworCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cm1tLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3RybW0uaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3ODEzOAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cm1tLmhoCkBAIC0wLDAgKzEsMTY1IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEFDVElPTl9UUk1NCisjZGVmaW5lIEFDVElPTl9UUk1NCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiU1RMX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAiaW5pdC9pbml0X2Z1bmN0aW9uLmhoIgorI2luY2x1ZGUgImluaXQvaW5pdF92ZWN0b3IuaGgiCisjaW5jbHVkZSAiaW5pdC9pbml0X21hdHJpeC5oaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX3RybW0geworCitwdWJsaWMgOgorCisgIC8vIEN0b3IKKworICBBY3Rpb25fdHJtbSggaW50IHNpemUgKTpfc2l6ZShzaXplKQorICB7CisgICAgTUVTU0FHRSgiQWN0aW9uX3RybW0gQ3RvciIpOworCisgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICBmb3IgKGludCBqPTA7IGo8X3NpemU7ICsraikKKyAgICB7CisgICAgICBmb3IgKGludCBpPTA7IGk8ajsgKytpKQorICAgICAgICBBX3N0bFtqXVtpXSA9IDA7CisgICAgICBBX3N0bFtqXVtqXSArPSAzOworICAgIH0KKworICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCX3JlZixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQixCX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7CisKKyAgICBfY29zdCA9IDA7CisgICAgZm9yIChpbnQgaj0wOyBqPF9zaXplOyArK2opCisgICAgeworICAgICAgX2Nvc3QgKz0gMipqICsgMTsKKyAgICB9CisgICAgX2Nvc3QgKj0gX3NpemU7CisgIH0KKworICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgorCisgIEFjdGlvbl90cm1tKCBjb25zdCAgQWN0aW9uX3RybW0gJiApCisgIHsKKyAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl90cm1tIENvcHkgQ3RvciIpOworICAgIGV4aXQoMCk7CisgIH0KKworICAvLyBEdG9yCisKKyAgfkFjdGlvbl90cm1tKCB2b2lkICl7CisKKyAgICBNRVNTQUdFKCJBY3Rpb25fdHJtbSBEdG9yIik7CisKKyAgICAvLyBkZWFsbG9jYXRpb24KKworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOworCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7CisKKyAgfQorCisgIC8vIGFjdGlvbiBuYW1lCisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAidHJtbV8iK0ludGVyZmFjZTo6bmFtZSgpOworICB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgICByZXR1cm4gX2Nvc3Q7CisgIH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7CisKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsQixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKKworICB9CisKKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICAgICAgSW50ZXJmYWNlOjp0cm1tKEEsQixYLF9zaXplKTsKKyAgfQorCisgIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisKKyAgICAvLyBjYWxjdWxhdGlvbiBjaGVjaworCisvLyAgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgscmVzdV9zdGwpOworLy8KKy8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bWF0cml4X21hdHJpeF9wcm9kdWN0KEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKy8vCisvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisvLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKy8vCisvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKy8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworLy8gLy8gICAgICAgZXhpdCgxKTsKKy8vICAgICB9CisKKyAgfQorCitwcml2YXRlIDoKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBCX3N0bDsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBBX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBCX3JlZjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYX3JlZjsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEE7CisgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQjsKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOworCisgIGludCBfc2l6ZTsKKyAgZG91YmxlIF9jb3N0OworCit9OworCisKKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYmFzaWNfYWN0aW9ucy5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2Jhc2ljX2FjdGlvbnMuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzMzNlYQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2Jhc2ljX2FjdGlvbnMuaGgKQEAgLTAsMCArMSwyMSBAQAorCisjaW5jbHVkZSAiYWN0aW9uX2F4cHkuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2F4cGJ5LmhoIgorCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXR2X3Byb2R1Y3QuaGgiCisKKyNpbmNsdWRlICJhY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoIgorLy8gI2luY2x1ZGUgImFjdGlvbl9hdGFfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYWF0X3Byb2R1Y3QuaGgiCisKKyNpbmNsdWRlICJhY3Rpb25fdHJpc29sdmUuaGgiCisjaW5jbHVkZSAiYWN0aW9uX3RybW0uaGgiCisjaW5jbHVkZSAiYWN0aW9uX3N5bXYuaGgiCisvLyAjaW5jbHVkZSAiYWN0aW9uX3N5bW0uaGgiCisjaW5jbHVkZSAiYWN0aW9uX3N5cjIuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2dlci5oaCIKKyNpbmNsdWRlICJhY3Rpb25fcm90LmhoIgorCisvLyAjaW5jbHVkZSAiYWN0aW9uX2x1X3NvbHZlLmhoIgorCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvY21ha2UvRmluZEFDTUwuY21ha2UgYi9iZW5jaC9idGwvY21ha2UvRmluZEFDTUwuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1YWUxYgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kQUNNTC5jbWFrZQpAQCAtMCwwICsxLDQ5IEBACisKK2lmIChBQ01MX0xJQlJBUklFUykKKyAgc2V0KEFDTUxfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoQUNNTF9MSUJSQVJJRVMpCisKK2ZpbmRfbGlicmFyeShBQ01MX0xJQlJBUklFUworICBOQU1FUworICBhY21sX21wIGFjbWxfbXYKKyAgUEFUSFMKKyAgJEVOVntBQ01MRElSfS9saWIKKyAgJEVOVntBQ01MX0RJUn0vbGliCisgICR7TElCX0lOU1RBTExfRElSfQorKQorCitmaW5kX2ZpbGUoQUNNTF9MSUJSQVJJRVMKKyAgTkFNRVMKKyAgbGliYWNtbF9tcC5zbworICBQQVRIUworICAvdXNyL2xpYgorICAkRU5We0FDTUxESVJ9L2xpYgorICAke0xJQl9JTlNUQUxMX0RJUn0KKykKKworaWYoTk9UIEFDTUxfTElCUkFSSUVTKQorICAgIG1lc3NhZ2UoU1RBVFVTICJNdWx0aS10aHJlYWRlZCBsaWJyYXJ5IG5vdCBmb3VuZCwgbG9va2luZyBmb3Igc2luZ2xlLXRocmVhZGVkIikKKyAgICBmaW5kX2xpYnJhcnkoQUNNTF9MSUJSQVJJRVMKKyAgICAgICAgTkFNRVMKKyAgICAgICAgYWNtbCBhY21sX212CisgICAgICAgIFBBVEhTCisgICAgICAgICRFTlZ7QUNNTERJUn0vbGliCisgICAgICAgICRFTlZ7QUNNTF9ESVJ9L2xpYgorICAgICAgICAke0xJQl9JTlNUQUxMX0RJUn0KKyAgICAgICAgKQorICAgIGZpbmRfZmlsZShBQ01MX0xJQlJBUklFUworICAgICAgICBsaWJhY21sLnNvIGxpYmFjbWxfbXYuc28KKyAgICAgICAgUEFUSFMKKyAgICAgICAgL3Vzci9saWIKKyAgICAgICAgJEVOVntBQ01MRElSfS9saWIKKyAgICAgICAgJHtMSUJfSU5TVEFMTF9ESVJ9CisgICAgICAgICkKK2VuZGlmKCkKKworCisKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhBQ01MIERFRkFVTFRfTVNHIEFDTUxfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKEFDTUxfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2NtYWtlL0ZpbmRBVExBUy5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kQVRMQVMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5MDY1MgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kQVRMQVMuY21ha2UKQEAgLTAsMCArMSwzOSBAQAorCitpZiAoQVRMQVNfTElCUkFSSUVTKQorICBzZXQoQVRMQVNfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoQVRMQVNfTElCUkFSSUVTKQorCitmaW5kX2ZpbGUoQVRMQVNfTElCIGxpYmF0bGFzLnNvLjMgUEFUSFMgL3Vzci9saWIgJEVOVntBVExBU0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorZmluZF9saWJyYXJ5KEFUTEFTX0xJQiBhdGxhcyBQQVRIUyAkRU5We0FUTEFTRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisKK2ZpbmRfZmlsZShBVExBU19DQkxBUyBsaWJjYmxhcy5zby4zIFBBVEhTIC91c3IvbGliICRFTlZ7QVRMQVNESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKK2ZpbmRfbGlicmFyeShBVExBU19DQkxBUyBjYmxhcyBQQVRIUyAkRU5We0FUTEFTRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisKK2ZpbmRfZmlsZShBVExBU19MQVBBQ0sgbGlibGFwYWNrX2F0bGFzLnNvLjMgUEFUSFMgL3Vzci9saWIgJEVOVntBVExBU0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorZmluZF9saWJyYXJ5KEFUTEFTX0xBUEFDSyBsYXBhY2tfYXRsYXMgUEFUSFMgJEVOVntBVExBU0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorCitpZihOT1QgQVRMQVNfTEFQQUNLKQorICBmaW5kX2ZpbGUoQVRMQVNfTEFQQUNLIGxpYmxhcGFjay5zby4zIFBBVEhTIC91c3IvbGliL2F0bGFzICRFTlZ7QVRMQVNESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKyAgZmluZF9saWJyYXJ5KEFUTEFTX0xBUEFDSyBsYXBhY2sgUEFUSFMgJEVOVntBVExBU0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorZW5kaWYoTk9UIEFUTEFTX0xBUEFDSykKKworZmluZF9maWxlKEFUTEFTX0Y3N0JMQVMgbGliZjc3Ymxhcy5zby4zIFBBVEhTIC91c3IvbGliICRFTlZ7QVRMQVNESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKK2ZpbmRfbGlicmFyeShBVExBU19GNzdCTEFTIGY3N2JsYXMgUEFUSFMgJEVOVntBVExBU0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorCitpZihBVExBU19MSUIgQU5EIEFUTEFTX0NCTEFTIEFORCBBVExBU19MQVBBQ0sgQU5EIEFUTEFTX0Y3N0JMQVMpCisKKyAgc2V0KEFUTEFTX0xJQlJBUklFUyAke0FUTEFTX0xBUEFDS30gJHtBVExBU19DQkxBU30gICR7QVRMQVNfRjc3QkxBU30gJHtBVExBU19MSUJ9KQorICAKKyAgIyBzZWFyY2ggdGhlIGRlZmF1bHQgbGFwYWNrIGxpYiBsaW5rIHRvIGl0CisgIGZpbmRfZmlsZShBVExBU19SRUZFUkVOQ0VfTEFQQUNLIGxpYmxhcGFjay5zby4zIFBBVEhTIC91c3IvbGliIC91c3IvbGliNjQpCisgIGZpbmRfbGlicmFyeShBVExBU19SRUZFUkVOQ0VfTEFQQUNLIE5BTUVTIGxhcGFjaykKKyAgaWYoQVRMQVNfUkVGRVJFTkNFX0xBUEFDSykKKyAgICBzZXQoQVRMQVNfTElCUkFSSUVTICR7QVRMQVNfTElCUkFSSUVTfSAke0FUTEFTX1JFRkVSRU5DRV9MQVBBQ0t9KQorICBlbmRpZigpCisgIAorZW5kaWYoQVRMQVNfTElCIEFORCBBVExBU19DQkxBUyBBTkQgQVRMQVNfTEFQQUNLIEFORCBBVExBU19GNzdCTEFTKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEFUTEFTIERFRkFVTFRfTVNHIEFUTEFTX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChBVExBU19MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvY21ha2UvRmluZEJsaXR6LmNtYWtlIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRCbGl0ei5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg4MGJiCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRCbGl0ei5jbWFrZQpAQCAtMCwwICsxLDQwIEBACisjIC0gVHJ5IHRvIGZpbmQgYmxpdHogbGliCisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBCTElUWl9GT1VORCAtIHN5c3RlbSBoYXMgYmxpdHogbGliCisjICBCTElUWl9JTkNMVURFUyAtIHRoZSBibGl0eiBpbmNsdWRlIGRpcmVjdG9yeQorIyAgQkxJVFpfTElCUkFSSUVTIC0gVGhlIGxpYnJhcmllcyBuZWVkZWQgdG8gdXNlIGJsaXR6CisKKyMgQ29weXJpZ2h0IChjKSAyMDA2LCBNb250ZWwgTGF1cmVudCwgPG1vbnRlbEBrZGUub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMDcsIEFsbGVuIFdpbnRlciwgPHdpbnRlckBrZGUub3JnPgorIyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuCisKKyMgaW5jbHVkZShGaW5kTGlicmFyeVdpdGhEZWJ1ZykKKworaWYgKEJMSVRaX0lOQ0xVREVTIEFORCBCTElUWl9MSUJSQVJJRVMpCisgIHNldChCbGl0el9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChCTElUWl9JTkNMVURFUyBBTkQgQkxJVFpfTElCUkFSSUVTKQorCitmaW5kX3BhdGgoQkxJVFpfSU5DTFVERVMKKyAgTkFNRVMKKyAgYmxpdHovYXJyYXkuaAorICBQQVRIX1NVRkZJWEVTIGJsaXR6KgorICBQQVRIUworICAkRU5We0JMSVRaRElSfS9pbmNsdWRlCisgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKykKKworZmluZF9saWJyYXJ5KEJMSVRaX0xJQlJBUklFUworICBibGl0egorICBQQVRIUworICAkRU5We0JMSVRaRElSfS9saWIKKyAgJHtMSUJfSU5TVEFMTF9ESVJ9CispCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQmxpdHogREVGQVVMVF9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTElUWl9JTkNMVURFUyBCTElUWl9MSUJSQVJJRVMpCisKK21hcmtfYXNfYWR2YW5jZWQoQkxJVFpfSU5DTFVERVMgQkxJVFpfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2NtYWtlL0ZpbmRDQkxBUy5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kQ0JMQVMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0ZjAyOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kQ0JMQVMuY21ha2UKQEAgLTAsMCArMSwzNCBAQAorIyBpbmNsdWRlKEZpbmRMaWJyYXJ5V2l0aERlYnVnKQorCitpZiAoQ0JMQVNfSU5DTFVERVMgQU5EIENCTEFTX0xJQlJBUklFUykKKyAgc2V0KENCTEFTX0ZJTkRfUVVJRVRMWSBUUlVFKQorZW5kaWYgKENCTEFTX0lOQ0xVREVTIEFORCBDQkxBU19MSUJSQVJJRVMpCisKK2ZpbmRfcGF0aChDQkxBU19JTkNMVURFUworICBOQU1FUworICBjYmxhcy5oCisgIFBBVEhTCisgICRFTlZ7Q0JMQVNESVJ9L2luY2x1ZGUKKyAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorKQorCitmaW5kX2xpYnJhcnkoQ0JMQVNfTElCUkFSSUVTCisgIGNibGFzCisgIFBBVEhTCisgICRFTlZ7Q0JMQVNESVJ9L2xpYgorICAke0xJQl9JTlNUQUxMX0RJUn0KKykKKworZmluZF9maWxlKENCTEFTX0xJQlJBUklFUworICBsaWJjYmxhcy5zby4zCisgIFBBVEhTCisgIC91c3IvbGliCisgICRFTlZ7Q0JMQVNESVJ9L2xpYgorICAke0xJQl9JTlNUQUxMX0RJUn0KKykKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhDQkxBUyBERUZBVUxUX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCTEFTX0lOQ0xVREVTIENCTEFTX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChDQkxBU19JTkNMVURFUyBDQkxBU19MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvY21ha2UvRmluZEdNTS5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kR01NLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNDljNjQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvY21ha2UvRmluZEdNTS5jbWFrZQpAQCAtMCwwICsxLDE3IEBACitpZiAoR01NX0lOQ0xVREVfRElSKQorICAjIGluIGNhY2hlIGFscmVhZHkKKyAgc2V0KEdNTV9GT1VORCBUUlVFKQorZWxzZSAoR01NX0lOQ0xVREVfRElSKQorCitmaW5kX3BhdGgoR01NX0lOQ0xVREVfRElSIE5BTUVTIGdtbS9nbW0uaAorICAgICBQQVRIUworICAgICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9CisgICAgICR7R01NX0lOQ0xVREVfUEFUSH0KKyAgICkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK0ZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhHTU0gREVGQVVMVF9NU0cgR01NX0lOQ0xVREVfRElSICkKKworbWFya19hc19hZHZhbmNlZChHTU1fSU5DTFVERV9ESVIpCisKK2VuZGlmKEdNTV9JTkNMVURFX0RJUikKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9jbWFrZS9GaW5kR09UTy5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kR09UTy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VhMDkzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRHT1RPLmNtYWtlCkBAIC0wLDAgKzEsMTUgQEAKKworaWYgKEdPVE9fTElCUkFSSUVTKQorICBzZXQoR09UT19GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChHT1RPX0xJQlJBUklFUykKKworZmluZF9saWJyYXJ5KEdPVE9fTElCUkFSSUVTIGdvdG8gUEFUSFMgJEVOVntHT1RPRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisKK2lmKEdPVE9fTElCUkFSSUVTIEFORCBDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisgIHNldChHT1RPX0xJQlJBUklFUyAke0dPVE9fTElCUkFSSUVTfSAiLWxwdGhyZWFkIC1sZ2ZvcnRyYW4iKQorZW5kaWYoKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdPVE8gREVGQVVMVF9NU0cgR09UT19MSUJSQVJJRVMpCisKK21hcmtfYXNfYWR2YW5jZWQoR09UT19MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvY21ha2UvRmluZEdPVE8yLmNtYWtlIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRHT1RPMi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWE2OGQyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRHT1RPMi5jbWFrZQpAQCAtMCwwICsxLDI1IEBACisKK2lmIChHT1RPMl9MSUJSQVJJRVMpCisgIHNldChHT1RPMl9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChHT1RPMl9MSUJSQVJJRVMpCisjIAorIyBmaW5kX3BhdGgoR09UT19JTkNMVURFUworIyAgIE5BTUVTCisjICAgY2JsYXMuaAorIyAgIFBBVEhTCisjICAgJEVOVntHT1RPRElSfS9pbmNsdWRlCisjICAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorIyApCisKK2ZpbmRfZmlsZShHT1RPMl9MSUJSQVJJRVMgbGliZ290bzIuc28gUEFUSFMgL3Vzci9saWIgJEVOVntHT1RPMkRJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorZmluZF9saWJyYXJ5KEdPVE8yX0xJQlJBUklFUyBnb3RvMiBQQVRIUyAkRU5We0dPVE8yRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisKK2lmKEdPVE8yX0xJQlJBUklFUyBBTkQgQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorICBzZXQoR09UTzJfTElCUkFSSUVTICR7R09UTzJfTElCUkFSSUVTfSAiLWxwdGhyZWFkIC1sZ2ZvcnRyYW4iKQorZW5kaWYoKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdPVE8yIERFRkFVTFRfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09UTzJfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKEdPVE8yX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9jbWFrZS9GaW5kTUtMLmNtYWtlIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRNS0wuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkN2M2ZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kTUtMLmNtYWtlCkBAIC0wLDAgKzEsNjUgQEAKKworaWYgKE1LTF9MSUJSQVJJRVMpCisgIHNldChNS0xfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoTUtMX0xJQlJBUklFUykKKworaWYoQ01BS0VfTUlOT1JfVkVSU0lPTiBHUkVBVEVSIDQpCisKK2lmKCR7Q01BS0VfSE9TVF9TWVNURU1fUFJPQ0VTU09SfSBTVFJFUVVBTCAieDg2XzY0IikKKworZmluZF9saWJyYXJ5KE1LTF9MSUJSQVJJRVMKKyAgbWtsX2NvcmUKKyAgUEFUSFMKKyAgJEVOVntNS0xMSUJ9CisgIC9vcHQvaW50ZWwvbWtsLyovbGliL2VtNjR0CisgIC9vcHQvaW50ZWwvQ29tcGlsZXIvKi8qL21rbC9saWIvZW02NHQKKyAgJHtMSUJfSU5TVEFMTF9ESVJ9CispCisKK2ZpbmRfbGlicmFyeShNS0xfR1VJREUKKyAgZ3VpZGUKKyAgUEFUSFMKKyAgJEVOVntNS0xMSUJ9CisgIC9vcHQvaW50ZWwvbWtsLyovbGliL2VtNjR0CisgIC9vcHQvaW50ZWwvQ29tcGlsZXIvKi8qL21rbC9saWIvZW02NHQKKyAgL29wdC9pbnRlbC9Db21waWxlci8qLyovbGliL2ludGVsNjQKKyAgJHtMSUJfSU5TVEFMTF9ESVJ9CispCisKK2lmKE1LTF9MSUJSQVJJRVMgQU5EIE1LTF9HVUlERSkKKyAgc2V0KE1LTF9MSUJSQVJJRVMgJHtNS0xfTElCUkFSSUVTfSBta2xfaW50ZWxfbHA2NCBta2xfc2VxdWVudGlhbCAke01LTF9HVUlERX0gcHRocmVhZCkKK2VuZGlmKCkKKworZWxzZSgke0NNQUtFX0hPU1RfU1lTVEVNX1BST0NFU1NPUn0gU1RSRVFVQUwgIng4Nl82NCIpCisKK2ZpbmRfbGlicmFyeShNS0xfTElCUkFSSUVTCisgIG1rbF9jb3JlCisgIFBBVEhTCisgICRFTlZ7TUtMTElCfQorICAvb3B0L2ludGVsL21rbC8qL2xpYi8zMgorICAvb3B0L2ludGVsL0NvbXBpbGVyLyovKi9ta2wvbGliLzMyCisgICR7TElCX0lOU1RBTExfRElSfQorKQorCitmaW5kX2xpYnJhcnkoTUtMX0dVSURFCisgIGd1aWRlCisgIFBBVEhTCisgICRFTlZ7TUtMTElCfQorICAvb3B0L2ludGVsL21rbC8qL2xpYi8zMgorICAvb3B0L2ludGVsL0NvbXBpbGVyLyovKi9ta2wvbGliLzMyCisgIC9vcHQvaW50ZWwvQ29tcGlsZXIvKi8qL2xpYi9pbnRlbDMyCisgICR7TElCX0lOU1RBTExfRElSfQorKQorCitpZihNS0xfTElCUkFSSUVTIEFORCBNS0xfR1VJREUpCisgIHNldChNS0xfTElCUkFSSUVTICR7TUtMX0xJQlJBUklFU30gbWtsX2ludGVsIG1rbF9zZXF1ZW50aWFsICR7TUtMX0dVSURFfSBwdGhyZWFkKQorZW5kaWYoKQorCitlbmRpZigke0NNQUtFX0hPU1RfU1lTVEVNX1BST0NFU1NPUn0gU1RSRVFVQUwgIng4Nl82NCIpCisKK2VuZGlmKENNQUtFX01JTk9SX1ZFUlNJT04gR1JFQVRFUiA0KQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKE1LTCBERUZBVUxUX01TRyBNS0xfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKE1LTF9MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvY21ha2UvRmluZE1UTDQuY21ha2UgYi9iZW5jaC9idGwvY21ha2UvRmluZE1UTDQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNDkwOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9jbWFrZS9GaW5kTVRMNC5jbWFrZQpAQCAtMCwwICsxLDMxIEBACisjIC0gVHJ5IHRvIGZpbmQgZWlnZW4yIGhlYWRlcnMKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIE1UTDRfRk9VTkQgLSBzeXN0ZW0gaGFzIGVpZ2VuMiBsaWIKKyMgIE1UTDRfSU5DTFVERV9ESVIgLSB0aGUgZWlnZW4yIGluY2x1ZGUgZGlyZWN0b3J5CisjCisjIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKyMgQWRhcHRlZCBmcm9tIEZpbmRFaWdlbi5jbWFrZToKKyMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE1vbnRlbCBMYXVyZW50LCA8bW9udGVsQGtkZS5vcmc+CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuCisKK2lmIChNVEw0X0lOQ0xVREVfRElSKQorCisgICMgaW4gY2FjaGUgYWxyZWFkeQorICBzZXQoTVRMNF9GT1VORCBUUlVFKQorCitlbHNlIChNVEw0X0lOQ0xVREVfRElSKQorCitmaW5kX3BhdGgoTVRMNF9JTkNMVURFX0RJUiBOQU1FUyBib29zdC9udW1lcmljL210bC9tdGwuaHBwCisgICAgIFBBVEhTCisgICAgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKyAgICkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhNVEw0IERFRkFVTFRfTVNHIE1UTDRfSU5DTFVERV9ESVIpCisKK21hcmtfYXNfYWR2YW5jZWQoTVRMNF9JTkNMVURFX0RJUikKKworZW5kaWYoTVRMNF9JTkNMVURFX0RJUikKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2NtYWtlL0ZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzLmNtYWtlIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTIyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvY21ha2UvRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MuY21ha2UKQEAgLTAsMCArMSw2MCBAQAorIyBGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoTkFNRSAoREVGQVVMVF9NU0d8IkN1c3RvbSBmYWlsdXJlIG1lc3NhZ2UiKSBWQVIxIC4uLiApCisjCisjIFRoaXMgbWFjcm8gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBGaW5kWFhYLmNtYWtlIG1vZHVsZXMgZmlsZXMuCisjIEl0IGhhbmRsZXMgdGhlIFJFUVVJUkVEIGFuZCBRVUlFVCBhcmd1bWVudCB0byBGSU5EX1BBQ0tBR0UoKSBhbmQKKyMgaXQgYWxzbyBzZXRzIHRoZSA8VVBQRVJDQVNFRF9OQU1FPl9GT1VORCB2YXJpYWJsZS4KKyMgVGhlIHBhY2thZ2UgaXMgZm91bmQgaWYgYWxsIHZhcmlhYmxlcyBsaXN0ZWQgYXJlIFRSVUUuCisjIEV4YW1wbGU6CisjCisjICAgIEZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhMaWJYbWwyIERFRkFVTFRfTVNHIExJQlhNTDJfTElCUkFSSUVTIExJQlhNTDJfSU5DTFVERV9ESVIpCisjCisjIExpYlhtbDIgaXMgY29uc2lkZXJlZCB0byBiZSBmb3VuZCwgaWYgYm90aCBMSUJYTUwyX0xJQlJBUklFUyBhbmQgCisjIExJQlhNTDJfSU5DTFVERV9ESVIgYXJlIHZhbGlkLiBUaGVuIGFsc28gTElCWE1MMl9GT1VORCBpcyBzZXQgdG8gVFJVRS4KKyMgSWYgaXQgaXMgbm90IGZvdW5kIGFuZCBSRVFVSVJFRCB3YXMgdXNlZCwgaXQgZmFpbHMgd2l0aCBGQVRBTF9FUlJPUiwgCisjIGluZGVwZW5kZW50IHdoZXRoZXIgUVVJRVQgd2FzIHVzZWQgb3Igbm90LgorIworIyBJZiBpdCBpcyBmb3VuZCwgdGhlIGxvY2F0aW9uIGlzIHJlcG9ydGVkIHVzaW5nIHRoZSBWQVIxIGFyZ3VtZW50LCBzbyAKKyMgaGVyZSBhIG1lc3NhZ2UgIkZvdW5kIExpYlhtbDI6IC91c3IvbGliL2xpYnhtbDIuc28iIHdpbGwgYmUgcHJpbnRlZCBvdXQuCisjIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgREVGQVVMVF9NU0csIHRoZSBtZXNzYWdlIGluIHRoZSBmYWlsdXJlIGNhc2Ugd2lsbCAKKyMgYmUgIkNvdWxkIE5PVCBmaW5kIExpYlhtbDIiLCBpZiB5b3UgZG9uJ3QgbGlrZSB0aGlzIG1lc3NhZ2UgeW91IGNhbiBzcGVjaWZ5CisjIHlvdXIgb3duIGN1c3RvbSBmYWlsdXJlIG1lc3NhZ2UgdGhlcmUuCisKK01BQ1JPKEZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyBfTkFNRSBfRkFJTF9NU0cgX1ZBUjEgKQorCisgIElGKCIke19GQUlMX01TR30iIFNUUkVRVUFMICJERUZBVUxUX01TRyIpCisgICAgSUYgKCR7X05BTUV9X0ZJTkRfUkVRVUlSRUQpCisgICAgICBTRVQoX0ZBSUxfTUVTU0FHRSAiQ291bGQgbm90IGZpbmQgUkVRVUlSRUQgcGFja2FnZSAke19OQU1FfSIpCisgICAgRUxTRSAoJHtfTkFNRX1fRklORF9SRVFVSVJFRCkKKyAgICAgIFNFVChfRkFJTF9NRVNTQUdFICJDb3VsZCBub3QgZmluZCBPUFRJT05BTCBwYWNrYWdlICR7X05BTUV9IikKKyAgICBFTkRJRiAoJHtfTkFNRX1fRklORF9SRVFVSVJFRCkKKyAgRUxTRSgiJHtfRkFJTF9NU0d9IiBTVFJFUVVBTCAiREVGQVVMVF9NU0ciKQorICAgIFNFVChfRkFJTF9NRVNTQUdFICIke19GQUlMX01TR30iKQorICBFTkRJRigiJHtfRkFJTF9NU0d9IiBTVFJFUVVBTCAiREVGQVVMVF9NU0ciKQorCisgIFNUUklORyhUT1VQUEVSICR7X05BTUV9IF9OQU1FX1VQUEVSKQorCisgIFNFVCgke19OQU1FX1VQUEVSfV9GT1VORCBUUlVFKQorICBJRihOT1QgJHtfVkFSMX0pCisgICAgU0VUKCR7X05BTUVfVVBQRVJ9X0ZPVU5EIEZBTFNFKQorICBFTkRJRihOT1QgJHtfVkFSMX0pCisKKyAgRk9SRUFDSChfQ1VSUkVOVF9WQVIgJHtBUkdOfSkKKyAgICBJRihOT1QgJHtfQ1VSUkVOVF9WQVJ9KQorICAgICAgU0VUKCR7X05BTUVfVVBQRVJ9X0ZPVU5EIEZBTFNFKQorICAgIEVORElGKE5PVCAke19DVVJSRU5UX1ZBUn0pCisgIEVOREZPUkVBQ0goX0NVUlJFTlRfVkFSKQorCisgIElGICgke19OQU1FX1VQUEVSfV9GT1VORCkKKyAgICBJRiAoTk9UICR7X05BTUV9X0ZJTkRfUVVJRVRMWSkKKyAgICAgICAgTUVTU0FHRShTVEFUVVMgIkZvdW5kICR7X05BTUV9OiAkeyR7X1ZBUjF9fSIpCisgICAgRU5ESUYgKE5PVCAke19OQU1FfV9GSU5EX1FVSUVUTFkpCisgIEVMU0UgKCR7X05BTUVfVVBQRVJ9X0ZPVU5EKQorICAgIElGICgke19OQU1FfV9GSU5EX1JFUVVJUkVEKQorICAgICAgICBNRVNTQUdFKEZBVEFMX0VSUk9SICIke19GQUlMX01FU1NBR0V9IikKKyAgICBFTFNFICgke19OQU1FfV9GSU5EX1JFUVVJUkVEKQorICAgICAgSUYgKE5PVCAke19OQU1FfV9GSU5EX1FVSUVUTFkpCisgICAgICAgIE1FU1NBR0UoU1RBVFVTICIke19GQUlMX01FU1NBR0V9IikKKyAgICAgIEVORElGIChOT1QgJHtfTkFNRX1fRklORF9RVUlFVExZKQorICAgIEVORElGICgke19OQU1FfV9GSU5EX1JFUVVJUkVEKQorICBFTkRJRiAoJHtfTkFNRV9VUFBFUn1fRk9VTkQpCitFTkRNQUNSTyhGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvY21ha2UvRmluZFR2bWV0LmNtYWtlIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRUdm1ldC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmEyOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2NtYWtlL0ZpbmRUdm1ldC5jbWFrZQpAQCAtMCwwICsxLDMyIEBACisjIC0gVHJ5IHRvIGZpbmQgdHZtZXQgaGVhZGVycworIyBPbmNlIGRvbmUgdGhpcyB3aWxsIGRlZmluZQorIworIyAgVFZNRVRfRk9VTkQgLSBzeXN0ZW0gaGFzIHR2bWV0IGxpYgorIyAgVFZNRVRfSU5DTFVERV9ESVIgLSB0aGUgdHZtZXQgaW5jbHVkZSBkaXJlY3RvcnkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorIyBBZGFwdGVkIGZyb20gRmluZEVpZ2VuLmNtYWtlOgorIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgTW9udGVsIExhdXJlbnQsIDxtb250ZWxAa2RlLm9yZz4KKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorIyBGb3IgZGV0YWlscyBzZWUgdGhlIGFjY29tcGFueWluZyBDT1BZSU5HLUNNQUtFLVNDUklQVFMgZmlsZS4KKworaWYgKFRWTUVUX0lOQ0xVREVfRElSKQorCisgICMgaW4gY2FjaGUgYWxyZWFkeQorICBzZXQoVFZNRVRfRk9VTkQgVFJVRSkKKworZWxzZSAoVFZNRVRfSU5DTFVERV9ESVIpCisKK2ZpbmRfcGF0aChUVk1FVF9JTkNMVURFX0RJUiBOQU1FUyB0dm1ldC90dm1ldC5oCisgICAgIFBBVEhTCisgICAgICR7VFZNRVRESVJ9LworICAgICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9CisgICApCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoVHZtZXQgREVGQVVMVF9NU0cgVFZNRVRfSU5DTFVERV9ESVIpCisKK21hcmtfYXNfYWR2YW5jZWQoVFZNRVRfSU5DTFVERV9ESVIpCisKK2VuZGlmKFRWTUVUX0lOQ0xVREVfRElSKQorCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvY21ha2UvTWFjcm9PcHRpb25hbEFkZFN1YmRpcmVjdG9yeS5jbWFrZSBiL2JlbmNoL2J0bC9jbWFrZS9NYWNyb09wdGlvbmFsQWRkU3ViZGlyZWN0b3J5LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTA0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvY21ha2UvTWFjcm9PcHRpb25hbEFkZFN1YmRpcmVjdG9yeS5jbWFrZQpAQCAtMCwwICsxLDMxIEBACisjIC0gTUFDUk9fT1BUSU9OQUxfQUREX1NVQkRJUkVDVE9SWSgpIGNvbWJpbmVzIEFERF9TVUJESVJFQ1RPUlkoKSB3aXRoIGFuIE9QVElPTigpCisjIE1BQ1JPX09QVElPTkFMX0FERF9TVUJESVJFQ1RPUlkoIDxkaXI+ICkKKyMgSWYgeW91IHVzZSBNQUNST19PUFRJT05BTF9BRERfU1VCRElSRUNUT1JZKCkgaW5zdGVhZCBvZiBBRERfU1VCRElSRUNUT1JZKCksCisjIHRoaXMgd2lsbCBoYXZlIHR3byBlZmZlY3RzCisjIDEgLSBDTWFrZSB3aWxsIG5vdCBjb21wbGFpbiBpZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QKKyMgICAgIFRoaXMgbWFrZXMgc2Vuc2UgaWYgeW91IHdhbnQgdG8gZGlzdHJpYnV0ZSBqdXN0IG9uZSBvZiB0aGUgc3ViZGlycworIyAgICAgaW4gYSBzb3VyY2UgcGFja2FnZSwgZS5nLiBqdXN0IG9uZSBvZiB0aGUgc3ViZGlycyBpbiBrZGVleHRyYWdlYXIuCisjIDIgLSBJZiB0aGUgZGlyZWN0b3J5IGV4aXN0cywgaXQgd2lsbCBvZmZlciBhbiBvcHRpb24gdG8gc2tpcCB0aGUgCisjICAgICBzdWJkaXJlY3RvcnkuCisjICAgICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjb21waWxlIG9ubHkgYSBzdWJzZXQgb2YgYWxsCisjICAgICBkaXJlY3Rvcmllcy4KKworIyBDb3B5cmlnaHQgKGMpIDIwMDcsIEFsZXhhbmRlciBOZXVuZG9yZiwgPG5ldW5kb3JmQGtkZS5vcmc+CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuCisKKworTUFDUk8gKE1BQ1JPX09QVElPTkFMX0FERF9TVUJESVJFQ1RPUlkgX2RpciApCisgICBHRVRfRklMRU5BTUVfQ09NUE9ORU5UKF9mdWxsUGF0aCAke19kaXJ9IEFCU09MVVRFKQorICAgSUYoRVhJU1RTICR7X2Z1bGxQYXRofSkKKyAgICAgIElGKCR7QVJHQ30gRVFVQUwgMikKKyAgICAgICAgT1BUSU9OKEJVSUxEXyR7X2Rpcn0gIkJ1aWxkIGRpcmVjdG9yeSAke19kaXJ9IiAke0FSR1YxfSkKKyAgICAgIEVMU0UoJHtBUkdDfSBFUVVBTCAyKQorICAgICAgICBPUFRJT04oQlVJTERfJHtfZGlyfSAiQnVpbGQgZGlyZWN0b3J5ICR7X2Rpcn0iIFRSVUUpCisgICAgICBFTkRJRigke0FSR0N9IEVRVUFMIDIpCisgICAgICBJRihCVUlMRF8ke19kaXJ9KQorICAgICAgICAgQUREX1NVQkRJUkVDVE9SWSgke19kaXJ9KQorICAgICAgRU5ESUYoQlVJTERfJHtfZGlyfSkKKyAgIEVORElGKEVYSVNUUyAke19mdWxsUGF0aH0pCitFTkRNQUNSTyAoTUFDUk9fT1BUSU9OQUxfQUREX1NVQkRJUkVDVE9SWSkKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9kYXRhL0NNYWtlTGlzdHMudHh0IGIvYmVuY2gvYnRsL2RhdGEvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmMmEzNgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9kYXRhL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzIgQEAKKworQUREX0NVU1RPTV9UQVJHRVQoY29weV9zY3JpcHRzKQorCitTRVQoc2NyaXB0X2ZpbGVzIGdvX21lYW4gbWtfbWVhbl9zY3JpcHQuc2ggbWtfbmV3X2dudXBsb3Quc2gKKyAgICBwZXJsaWJfcGxvdF9zZXR0aW5ncy50eHQgYWN0aW9uX3NldHRpbmdzLnR4dCBnbnVwbG90X2NvbW1vbl9zZXR0aW5ncy5oaCApCisKK0ZPUkVBQ0goc2NyaXB0X2ZpbGUgJHtzY3JpcHRfZmlsZXN9KQorQUREX0NVU1RPTV9DT01NQU5EKAorICBUQVJHRVQgY29weV9zY3JpcHRzCisgIFBPU1RfQlVJTEQKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7c2NyaXB0X2ZpbGV9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8KKyAgQVJHUworKQorRU5ERk9SRUFDSChzY3JpcHRfZmlsZSkKKworQUREX0NVU1RPTV9DT01NQU5EKAorICBUQVJHRVQgY29weV9zY3JpcHRzCisgIFBPU1RfQlVJTEQKKyAgQ09NTUFORCAke0NNQUtFX0NYWF9DT01QSUxFUn0gLS12ZXJzaW9uIHwgaGVhZCAtbiAxID4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2NvbXBpbGVyX3ZlcnNpb24udHh0CisgIEFSR1MKKykKK0FERF9DVVNUT01fQ09NTUFORCgKKyAgVEFSR0VUIGNvcHlfc2NyaXB0cworICBQT1NUX0JVSUxECisgIENPTU1BTkQgZWNobyAiJHtFaWdlbl9TT1VSQ0VfRElSfSIgPiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZWlnZW5fcm9vdF9kaXIudHh0CisgIEFSR1MKKykKKworYWRkX2V4ZWN1dGFibGUoc21vb3RoIHNtb290aC5jeHgpCithZGRfZXhlY3V0YWJsZShyZWd1bGFyaXplIHJlZ3VsYXJpemUuY3h4KQorYWRkX2V4ZWN1dGFibGUobWFpbiBtZWFuLmN4eCkKK2FkZF9kZXBlbmRlbmNpZXMobWFpbiBjb3B5X3NjcmlwdHMpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9hY3Rpb25fc2V0dGluZ3MudHh0IGIvYmVuY2gvYnRsL2RhdGEvYWN0aW9uX3NldHRpbmdzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzIyMTNlCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2RhdGEvYWN0aW9uX3NldHRpbmdzLnR4dApAQCAtMCwwICsxLDE5IEBACithYXQgOyAiey8qMS41IEEgeCBBXlR9IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjMwMDAKK2F0YSA7ICJ7LyoxLjUgQV5UIHggQX0iIDsgIm1hdHJpeCBzaXplIiA7IDQ6MzAwMAorYXR2IDsgInsvKjEuNSBtYXRyaXheVCB4IHZlY3Rvcn0iIDsgIm1hdHJpeCBzaXplIiA7IDQ6MzAwMAorYXhwYnkgOyAiey8qMS41IFkgPSBhbHBoYSBYICsgYmV0YSBZfSIgOyAidmVjdG9yIHNpemUiIDsgNToxMDAwMDAwCitheHB5IDsgInsvKjEuNSBZICs9IGFscGhhIFh9IiA7ICJ2ZWN0b3Igc2l6ZSIgOyA1OjEwMDAwMDAKK21hdHJpeF9tYXRyaXggOyAiey8qMS41IG1hdHJpeCBtYXRyaXggcHJvZHVjdH0iIDsgIm1hdHJpeCBzaXplIiA7IDQ6MzAwMAorbWF0cml4X3ZlY3RvciA7ICJ7LyoxLjUgbWF0cml4IHZlY3RvciBwcm9kdWN0fSIgOyAibWF0cml4IHNpemUiIDsgNDozMDAwCit0cm1tIDsgInsvKjEuNSB0cmlhbmd1bGFyIG1hdHJpeCBtYXRyaXggcHJvZHVjdH0iIDsgIm1hdHJpeCBzaXplIiA7IDQ6MzAwMAordHJpc29sdmVfdmVjdG9yIDsgInsvKjEuNSB0cmlhbmd1bGFyIHNvbHZlciAtIHZlY3RvciAoWCA9IGludihMKSBYKX0iIDsgInNpemUiIDsgNDozMDAwCit0cmlzb2x2ZV9tYXRyaXggOyAiey8qMS41IHRyaWFuZ3VsYXIgc29sdmVyIC0gbWF0cml4IChNID0gaW52KEwpIE0pfSIgOyAic2l6ZSIgOyA0OjMwMDAKK2Nob2xlc2t5IDsgInsvKjEuNSBDaG9sZXNreSBkZWNvbXBvc2l0aW9ufSIgOyAibWF0cml4IHNpemUiIDsgNDozMDAwCitjb21wbGV0ZV9sdV9kZWNvbXAgOyAiey8qMS41IENvbXBsZXRlIExVIGRlY29tcG9zaXRpb259IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjMwMDAKK3BhcnRpYWxfbHVfZGVjb21wIDsgInsvKjEuNSBQYXJ0aWFsIExVIGRlY29tcG9zaXRpb259IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjMwMDAKK3RyaWRpYWdvbmFsaXphdGlvbiA7ICJ7LyoxLjUgVHJpZGlhZ29uYWxpemF0aW9ufSIgOyAibWF0cml4IHNpemUiIDsgNDozMDAwCitoZXNzZW5iZXJnIDsgInsvKjEuNSBIZXNzZW5iZXJnIGRlY29tcG9zaXRpb259IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjMwMDAKK3N5bXYgOyAiey8qMS41IHN5bW1ldHJpYyBtYXRyaXggdmVjdG9yIHByb2R1Y3R9IiA7ICJtYXRyaXggc2l6ZSIgOyA0OjMwMDAKK3N5cjIgOyAiey8qMS41IHN5bW1yZXRyaWMgcmFuay0yIHVwZGF0ZSAoQSArPSB1XlQgdiArIHUgdl5UKX0iIDsgIm1hdHJpeCBzaXplIiA7IDQ6MzAwMAorZ2VyIDsgInsvKjEuNSBnZW5lcmFsIHJhbmstMSB1cGRhdGUgKEEgKz0gdSB2XlQpfSIgOyAibWF0cml4IHNpemUiIDsgNDozMDAwCityb3QgOyAiey8qMS41IGFwcGx5IHJvdGF0aW9uIGluIHRoZSBwbGFuZX0iIDsgInZlY3RvciBzaXplIiA7IDQ6MTAwMDAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9kYXRhL2dudXBsb3RfY29tbW9uX3NldHRpbmdzLmhoIGIvYmVuY2gvYnRsL2RhdGEvZ251cGxvdF9jb21tb25fc2V0dGluZ3MuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2NzdkZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9kYXRhL2dudXBsb3RfY29tbW9uX3NldHRpbmdzLmhoCkBAIC0wLDAgKzEsODcgQEAKK3NldCBub2NsaXAgcG9pbnRzCitzZXQgY2xpcCBvbmUKK3NldCBub2NsaXAgdHdvCitzZXQgYmFyIDEuMDAwMDAwCitzZXQgYm9yZGVyIDMxIGx0IC0xIGx3IDEuMDAwCitzZXQgeGRhdGEKK3NldCB5ZGF0YQorc2V0IHpkYXRhCitzZXQgeDJkYXRhCitzZXQgeTJkYXRhCitzZXQgYm94d2lkdGgKK3NldCBkdW1teSB4LHkKK3NldCBmb3JtYXQgeCAiJWciCitzZXQgZm9ybWF0IHkgIiVnIgorc2V0IGZvcm1hdCB4MiAiJWciCitzZXQgZm9ybWF0IHkyICIlZyIKK3NldCBmb3JtYXQgeiAiJWciCitzZXQgYW5nbGVzIHJhZGlhbnMKK3NldCBub2dyaWQKK3NldCBrZXkgdGl0bGUgIiIKK3NldCBrZXkgbGVmdCB0b3AgUmlnaHQgbm9yZXZlcnNlIGJveCBsaW5ldHlwZSAtMiBsaW5ld2lkdGggMS4wMDAgc2FtcGxlbiA0IHNwYWNpbmcgMSB3aWR0aCAwCitzZXQgbm9sYWJlbAorc2V0IG5vYXJyb3cKKyMgc2V0IG5vbGluZXN0eWxlICMgZGVwcmVjYXRlZAorc2V0IG5vbG9nc2NhbGUKK3NldCBsb2dzY2FsZSB4IDEwCitzZXQgb2Zmc2V0cyAwLCAwLCAwLCAwCitzZXQgcG9pbnRzaXplIDEKK3NldCBlbmNvZGluZyBkZWZhdWx0CitzZXQgbm9wb2xhcgorc2V0IG5vcGFyYW1ldHJpYworc2V0IHZpZXcgNjAsIDMwLCAxLCAxCitzZXQgc2FtcGxlcyAxMDAsIDEwMAorc2V0IGlzb3NhbXBsZXMgMTAsIDEwCitzZXQgc3VyZmFjZQorc2V0IG5vY29udG91cgorc2V0IGNsYWJlbCAnJTguM2cnCitzZXQgbWFwcGluZyBjYXJ0ZXNpYW4KK3NldCBub2hpZGRlbjNkCitzZXQgY250cnBhcmFtIG9yZGVyIDQKK3NldCBjbnRycGFyYW0gbGluZWFyCitzZXQgY250cnBhcmFtIGxldmVscyBhdXRvIDUKK3NldCBjbnRycGFyYW0gcG9pbnRzIDUKK3NldCBzaXplIHJhdGlvIDAgMSwxCitzZXQgb3JpZ2luIDAsMAorIyBzZXQgZGF0YSBzdHlsZSBsaW5lcworIyBzZXQgZnVuY3Rpb24gc3R5bGUgbGluZXMKK3NldCB4emVyb2F4aXMgbHQgLTIgbHcgMS4wMDAKK3NldCB4Mnplcm9heGlzIGx0IC0yIGx3IDEuMDAwCitzZXQgeXplcm9heGlzIGx0IC0yIGx3IDEuMDAwCitzZXQgeTJ6ZXJvYXhpcyBsdCAtMiBsdyAxLjAwMAorc2V0IHRpY3MgaW4KK3NldCB0aWNzbGV2ZWwgMC41CitzZXQgdGljcyBzY2FsZSAxLCAwLjUKK3NldCBteHRpY3MgZGVmYXVsdAorc2V0IG15dGljcyBkZWZhdWx0CitzZXQgbXgydGljcyBkZWZhdWx0CitzZXQgbXkydGljcyBkZWZhdWx0CitzZXQgeHRpY3MgYm9yZGVyIG1pcnJvciBub3JvdGF0ZSBhdXRvZnJlcQorc2V0IHl0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEKK3NldCB6dGljcyBib3JkZXIgbm9taXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEKK3NldCBub3gydGljcworc2V0IG5veTJ0aWNzCitzZXQgdGltZXN0YW1wICIiIGJvdHRvbSBub3JvdGF0ZSBvZmZzZXQgMCwwCitzZXQgcnJhbmdlIFsgKiA6ICogXSBub3JldmVyc2Ugbm93cml0ZWJhY2sgICMgKGN1cnJlbnRseSBbLTA6MTBdICkKK3NldCB0cmFuZ2UgWyAqIDogKiBdIG5vcmV2ZXJzZSBub3dyaXRlYmFjayAgIyAoY3VycmVudGx5IFstNTo1XSApCitzZXQgdXJhbmdlIFsgKiA6ICogXSBub3JldmVyc2Ugbm93cml0ZWJhY2sgICMgKGN1cnJlbnRseSBbLTU6NV0gKQorc2V0IHZyYW5nZSBbICogOiAqIF0gbm9yZXZlcnNlIG5vd3JpdGViYWNrICAjIChjdXJyZW50bHkgWy01OjVdICkKK3NldCB4bGFiZWwgIm1hdHJpeCBzaXplIiBvZmZzZXQgMCwwCitzZXQgeDJsYWJlbCAiIiBvZmZzZXQgMCwwCitzZXQgdGltZWZtdCAiJWQvJW0vJXlcbiVIOiVNIgorc2V0IHhyYW5nZSBbIDEwIDogMTAwMCBdIG5vcmV2ZXJzZSBub3dyaXRlYmFjaworc2V0IHgycmFuZ2UgWyAqIDogKiBdIG5vcmV2ZXJzZSBub3dyaXRlYmFjayAgIyAoY3VycmVudGx5IFstMTA6MTBdICkKK3NldCB5bGFiZWwgIk1GTE9QUyIgb2Zmc2V0IDAsMAorc2V0IHkybGFiZWwgIiIgb2Zmc2V0IDAsMAorc2V0IHlyYW5nZSBbICogOiAqIF0gbm9yZXZlcnNlIG5vd3JpdGViYWNrICAjIChjdXJyZW50bHkgWy0xMDoxMF0gKQorc2V0IHkycmFuZ2UgWyAqIDogKiBdIG5vcmV2ZXJzZSBub3dyaXRlYmFjayAgIyAoY3VycmVudGx5IFstMTA6MTBdICkKK3NldCB6bGFiZWwgIiIgb2Zmc2V0IDAsMAorc2V0IHpyYW5nZSBbICogOiAqIF0gbm9yZXZlcnNlIG5vd3JpdGViYWNrICAjIChjdXJyZW50bHkgWy0xMDoxMF0gKQorc2V0IHplcm8gMWUtMDgKK3NldCBsbWFyZ2luIC0xCitzZXQgYm1hcmdpbiAtMQorc2V0IHJtYXJnaW4gLTEKK3NldCB0bWFyZ2luIC0xCitzZXQgbG9jYWxlICJDIgorc2V0IHhyYW5nZSBbNDoxMDI0XQorCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9nb19tZWFuIGIvYmVuY2gvYnRsL2RhdGEvZ29fbWVhbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjMzOGNhCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2RhdGEvZ29fbWVhbgpAQCAtMCwwICsxLDU4IEBACisjIS9iaW4vYmFzaAorCitpZiBbICQjIDwgMSBdOyB0aGVuCisgIGVjaG8gIlVzYWdlOiAkMCB3b3JraW5nX2RpcmVjdG9yeSBbdGlueXxsYXJnZSBbcHJlZml4XV0iCitlbHNlCisKK21rZGlyIC1wICQxCisjI2NwIC4uL2xpYnMvKi8qLmRhdCAkMQorCittb2RlPWxhcmdlCitpZiBbICQjID4gMiBdOyB0aGVuCisgIG1vZGU9JDIKK2ZpCitpZiBbICQjID4gMyBdOyB0aGVuCisgIHByZWZpeD0kMworZmkKKworRUlHRU5ESVI9YGNhdCBlaWdlbl9yb290X2Rpci50eHRgCisKK3dlYnBhZ2VmaWxlbmFtZT0kMS9pbmRleC5odG1sCittZWFuc3RhdHNmaWxlbmFtZT0kMS9tZWFuLmh0bWwKKworZWNobyAnJyAgPiAkbWVhbnN0YXRzZmlsZW5hbWUKK2VjaG8gJycgID4gJHdlYnBhZ2VmaWxlbmFtZQorZWNobyAnPHA+PHN0cm9uZz5Db25maWd1cmF0aW9uPC9zdHJvbmc+JyAgPj4gJHdlYnBhZ2VmaWxlbmFtZQorZWNobyAnPHVsPidcCisgICc8bGk+JyBgY2F0IC9wcm9jL2NwdWluZm8gfCBncmVwICJtb2RlbCBuYW1lIiB8IGhlYWQgLW4gMWBcCisgICcgICgnIGB1bmFtZSAtbWAgJyk8L2xpPidcCisgICc8bGk+IGNvbXBpbGVyOiAnIGBjYXQgY29tcGlsZXJfdmVyc2lvbi50eHRgICc8L2xpPidcCisgICc8bGk+IGVpZ2VuMzogJyBgaGcgaWRlbnRpZnkgLWkgJEVJR0VORElSYCAnPC9saT4nXAorICAnPC91bD4nIFwKKyAgJzwvcD4nICA+PiAkd2VicGFnZWZpbGVuYW1lCisKK3NvdXJjZSBta19tZWFuX3NjcmlwdC5zaCBheHB5ICQxIDExIDI1MDAgMTAwMDAwIDI1MDAwMCAgJG1vZGUgJHByZWZpeAorc291cmNlIG1rX21lYW5fc2NyaXB0LnNoIGF4cGJ5ICQxIDExIDI1MDAgMTAwMDAwIDI1MDAwMCAkbW9kZSAkcHJlZml4Citzb3VyY2UgbWtfbWVhbl9zY3JpcHQuc2ggbWF0cml4X3ZlY3RvciAkMSAxMSA1MCAzMDAgMTAwMCAkbW9kZSAkcHJlZml4Citzb3VyY2UgbWtfbWVhbl9zY3JpcHQuc2ggYXR2ICQxIDExIDUwIDMwMCAxMDAwICRtb2RlICRwcmVmaXgKK3NvdXJjZSBta19tZWFuX3NjcmlwdC5zaCBtYXRyaXhfbWF0cml4ICQxIDExIDEwMCAzMDAgMTAwMCAkbW9kZSAkcHJlZml4Citzb3VyY2UgbWtfbWVhbl9zY3JpcHQuc2ggYWF0ICQxIDExIDEwMCAzMDAgMTAwMCAkbW9kZSAkcHJlZml4CisjIHNvdXJjZSBta19tZWFuX3NjcmlwdC5zaCBhdGEgJDEgMTEgMTAwIDMwMCAxMDAwICRtb2RlICRwcmVmaXgKK3NvdXJjZSBta19tZWFuX3NjcmlwdC5zaCB0cm1tICQxIDExIDEwMCAzMDAgMTAwMCAkbW9kZSAkcHJlZml4Citzb3VyY2UgbWtfbWVhbl9zY3JpcHQuc2ggdHJpc29sdmVfdmVjdG9yICQxIDExIDEwMCAzMDAgMTAwMCAkbW9kZSAkcHJlZml4Citzb3VyY2UgbWtfbWVhbl9zY3JpcHQuc2ggdHJpc29sdmVfbWF0cml4ICQxIDExIDEwMCAzMDAgMTAwMCAkbW9kZSAkcHJlZml4Citzb3VyY2UgbWtfbWVhbl9zY3JpcHQuc2ggY2hvbGVza3kgJDEgMTEgMTAwIDMwMCAxMDAwICRtb2RlICRwcmVmaXgKK3NvdXJjZSBta19tZWFuX3NjcmlwdC5zaCBwYXJ0aWFsX2x1X2RlY29tcCAkMSAxMSAxMDAgMzAwIDEwMDAgJG1vZGUgJHByZWZpeAorc291cmNlIG1rX21lYW5fc2NyaXB0LnNoIHRyaWRpYWdvbmFsaXphdGlvbiAkMSAxMSAxMDAgMzAwIDEwMDAgJG1vZGUgJHByZWZpeAorc291cmNlIG1rX21lYW5fc2NyaXB0LnNoIGhlc3NlbmJlcmcgJDEgMTEgMTAwIDMwMCAxMDAwICRtb2RlICRwcmVmaXgKK3NvdXJjZSBta19tZWFuX3NjcmlwdC5zaCBzeW12ICQxIDExIDUwIDMwMCAxMDAwICRtb2RlICRwcmVmaXgKK3NvdXJjZSBta19tZWFuX3NjcmlwdC5zaCBzeXIyICQxIDExIDUwIDMwMCAxMDAwICRtb2RlICRwcmVmaXgKK3NvdXJjZSBta19tZWFuX3NjcmlwdC5zaCBnZXIgJDEgMTEgNTAgMzAwIDEwMDAgJG1vZGUgJHByZWZpeAorc291cmNlIG1rX21lYW5fc2NyaXB0LnNoIHJvdCAkMSAxMSAyNTAwIDEwMDAwMCAyNTAwMDAgJG1vZGUgJHByZWZpeAorc291cmNlIG1rX21lYW5fc2NyaXB0LnNoIGNvbXBsZXRlX2x1X2RlY29tcCAkMSAxMSAxMDAgMzAwIDEwMDAgJG1vZGUgJHByZWZpeAorCitmaQorCisjIyBjb21waWxlIHRoZSB3ZWIgcGFnZSAjIworCisjZWNobyBgY2F0IGZvb3Rlci5odG1sYCA+PiAkd2VicGFnZWZpbGVuYW1lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2RhdGEvbWVhbi5jeHggYi9iZW5jaC9idGwvZGF0YS9tZWFuLmN4eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY3ZWYzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2RhdGEvbWVhbi5jeHgKQEAgLTAsMCArMSwxODIgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBtZWFuLmN4eAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSAiYmVuY2hfcGFyYW1ldGVyLmhoIgorI2luY2x1ZGUgInV0aWxzL3h5X2ZpbGUuaGgiCisjaW5jbHVkZSA8c2V0PgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitkb3VibGUgbWVhbl9jYWxjKGNvbnN0IHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCBjb25zdCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMsIGNvbnN0IGludCBzaXplX21pbiwgY29uc3QgaW50IHNpemVfbWF4KTsKKworY2xhc3MgTGliX01lYW57CisKK3B1YmxpYzoKKyAgTGliX01lYW4oIHZvaWQgKTpfbGliX25hbWUoKSxfbWVhbl9pbl9jYWNoZSgpLF9tZWFuX291dF9vZl9jYWNoZSgpeworICAgIE1FU1NBR0UoIkxpYl9tZWFuIERlZmF1bHQgQ3RvciIpOworICAgIE1FU1NBR0UoIiEhISBzaG91bGQgbm90IGJlIHVzZWQiKTsKKyAgICBleGl0KDApOworICB9CisgIExpYl9NZWFuKGNvbnN0IHN0cmluZyAmIG5hbWUsIGNvbnN0IGRvdWJsZSAmIG1pYywgY29uc3QgZG91YmxlICYgbW9jKTpfbGliX25hbWUobmFtZSksX21lYW5faW5fY2FjaGUobWljKSxfbWVhbl9vdXRfb2ZfY2FjaGUobW9jKXsKKyAgICBNRVNTQUdFKCJMaWJfbWVhbiBDdG9yIik7CisgIH0KKyAgTGliX01lYW4oY29uc3QgTGliX01lYW4gJiBsbSk6X2xpYl9uYW1lKGxtLl9saWJfbmFtZSksX21lYW5faW5fY2FjaGUobG0uX21lYW5faW5fY2FjaGUpLF9tZWFuX291dF9vZl9jYWNoZShsbS5fbWVhbl9vdXRfb2ZfY2FjaGUpeworICAgIE1FU1NBR0UoIkxpYl9tZWFuIENvcHkgQ3RvciIpOworICB9CisgIH5MaWJfTWVhbiggdm9pZCApeworICAgIE1FU1NBR0UoIkxpYl9tZWFuIER0b3IiKTsKKyAgfQorICAgIAorICBkb3VibGUgX21lYW5faW5fY2FjaGU7CisgIGRvdWJsZSBfbWVhbl9vdXRfb2ZfY2FjaGU7CisgIHN0cmluZyBfbGliX25hbWU7CisKKyAgYm9vbCBvcGVyYXRvciA8ICggY29uc3QgTGliX01lYW4gJnJpZ2h0KSBjb25zdCAKKyAgeworICAgIC8vcmV0dXJuICggdGhpcy0+X21lYW5fb3V0X29mX2NhY2hlID4gcmlnaHQuX21lYW5fb3V0X29mX2NhY2hlKSA7CisgICAgcmV0dXJuICggdGhpcy0+X21lYW5faW5fY2FjaGUgPiByaWdodC5fbWVhbl9pbl9jYWNoZSkgOworICB9CisKK307IAorCisKK2ludCBtYWluKCBpbnQgYXJnYyAsIGNoYXIgKmFyZ3ZbXSApCit7CisKKyAgaWYgKGFyZ2M8Nil7CisgICAgSU5GT1MoIiEhISBFcnJvciAuLi4gdXNhZ2UgOiBtYWluIHdoYXQgbWljIE1pYyBtb2MgTW9jIGZpbGVuYW1lMSBmaW5lbmFtZTIuLi4iKTsKKyAgICBleGl0KDApOworICB9CisgIElORk9TKGFyZ2MpOworCisgIGludCBtaW5faW5fY2FjaGU9YXRvaShhcmd2WzJdKTsKKyAgaW50IG1heF9pbl9jYWNoZT1hdG9pKGFyZ3ZbM10pOworICBpbnQgbWluX291dF9vZl9jYWNoZT1hdG9pKGFyZ3ZbNF0pOworICBpbnQgbWF4X291dF9vZl9jYWNoZT1hdG9pKGFyZ3ZbNV0pOworCisKKyAgbXVsdGlzZXQ8TGliX01lYW4+IHNfbGliX21lYW4gOworCisgIGZvciAoaW50IGk9NjtpPGFyZ2M7aSsrKXsKKyAgICAKKyAgICBzdHJpbmcgZmlsZW5hbWU9YXJndltpXTsKKyAgICAKKyAgICBJTkZPUyhmaWxlbmFtZSk7CisKKyAgICBkb3VibGUgbWljPTA7CisgICAgZG91YmxlIG1vYz0wOworCisgICAgeworICAgICAgCisgICAgICB2ZWN0b3I8aW50PiB0YWJfc2l6ZXM7CisgICAgICB2ZWN0b3I8ZG91YmxlPiB0YWJfbWZsb3BzOworCisgICAgICByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsdGFiX3NpemVzLHRhYl9tZmxvcHMpOworCisgICAgICBtaWM9bWVhbl9jYWxjKHRhYl9zaXplcyx0YWJfbWZsb3BzLG1pbl9pbl9jYWNoZSxtYXhfaW5fY2FjaGUpOworICAgICAgbW9jPW1lYW5fY2FsYyh0YWJfc2l6ZXMsdGFiX21mbG9wcyxtaW5fb3V0X29mX2NhY2hlLG1heF9vdXRfb2ZfY2FjaGUpOworCisgICAgICBMaWJfTWVhbiBjdXJfbGliX21lYW4oZmlsZW5hbWUsbWljLG1vYyk7CisgICAgICAKKyAgICAgIHNfbGliX21lYW4uaW5zZXJ0KGN1cl9saWJfbWVhbik7CQorCisgICAgfSAgIAorICAgICAgICAgICAKKyAgfQorCisKKyAgY291dCA8PCAiPFRBQkxFIEJPUkRFUiBDRUxMUEFERElORz0yPiIgPDwgZW5kbCA7CisgIGNvdXQgPDwgIiAgPFRSPiIgPDwgZW5kbCA7CisgIGNvdXQgPDwgIiAgICA8VEggQUxJR049Q0VOVEVSPiAiIDw8IGFyZ3ZbMV0gPDwgIiA8L1RIPiIgPDwgZW5kbCA7CisgIGNvdXQgPDwgIiAgICA8VEggQUxJR049Q0VOVEVSPiA8YSBocmVmPSIiI21lYW5fbWFya2VyIiI+IGluIGNhY2hlIDxCUj4gbWVhbiBwZXJmIDxCUj4gTWZsb3BzIDwvYT48L1RIPiIgPDwgZW5kbCA7CisgIGNvdXQgPDwgIiAgICA8VEggQUxJR049Q0VOVEVSPiBpbiBjYWNoZSA8QlI+ICUgYmVzdCA8L1RIPiIgPDwgZW5kbCA7CisgIGNvdXQgPDwgIiAgICA8VEggQUxJR049Q0VOVEVSPiA8YSBocmVmPSIiI21lYW5fbWFya2VyIiI+IG91dCBvZiBjYWNoZSA8QlI+IG1lYW4gcGVyZiA8QlI+IE1mbG9wcyA8L2E+PC9USD4iIDw8IGVuZGwgOworICBjb3V0IDw8ICIgICAgPFRIIEFMSUdOPUNFTlRFUj4gb3V0IG9mIGNhY2hlIDxCUj4gJSBiZXN0IDwvVEg+IiA8PCBlbmRsIDsKKyAgY291dCA8PCAiICAgIDxUSCBBTElHTj1DRU5URVI+IGRldGFpbHMgPC9USD4iIDw8IGVuZGwgOworICBjb3V0IDw8ICIgICAgPFRIIEFMSUdOPUNFTlRFUj4gY29tbWVudHMgPC9USD4iIDw8IGVuZGwgOworICBjb3V0IDw8ICIgIDwvVFI+IiA8PCBlbmRsIDsKKworICBtdWx0aXNldDxMaWJfTWVhbj46Oml0ZXJhdG9yIGlzID0gc19saWJfbWVhbi5iZWdpbigpOworICBMaWJfTWVhbiBiZXN0KCppcyk7ICAKKyAgCisKKyAgZm9yIChpcz1zX2xpYl9tZWFuLmJlZ2luKCk7IGlzIT1zX2xpYl9tZWFuLmVuZCgpIDsgaXMrKyl7CisKKyAgICBjb3V0IDw8ICIgIDxUUj4iIDw8IGVuZGwgOworICAgIGNvdXQgPDwgIiAgICAgPFREPiAiIDw8IGlzLT5fbGliX25hbWUgPDwgIiA8L1REPiIgPDwgZW5kbCA7CisgICAgY291dCA8PCAiICAgICA8VEQ+ICIgPDwgaXMtPl9tZWFuX2luX2NhY2hlIDw8ICIgPC9URD4iIDw8IGVuZGwgOworICAgIGNvdXQgPDwgIiAgICAgPFREPiAiIDw8IDEwMCooaXMtPl9tZWFuX2luX2NhY2hlL2Jlc3QuX21lYW5faW5fY2FjaGUpIDw8ICIgPC9URD4iIDw8IGVuZGwgOworICAgIGNvdXQgPDwgIiAgICAgPFREPiAiIDw8IGlzLT5fbWVhbl9vdXRfb2ZfY2FjaGUgPDwgIiA8L1REPiIgPDwgZW5kbCA7CisgICAgY291dCA8PCAiICAgICA8VEQ+ICIgPDwgMTAwKihpcy0+X21lYW5fb3V0X29mX2NhY2hlL2Jlc3QuX21lYW5fb3V0X29mX2NhY2hlKSA8PCAiIDwvVEQ+IiA8PCBlbmRsIDsKKyAgICBjb3V0IDw8ICIgICAgIDxURD4gIiA8PCAKKyAgICAgICI8YSBocmVmPVwiIyI8PGlzLT5fbGliX25hbWU8PCJfIjw8YXJndlsxXTw8IlwiPnNuaXBwZXQ8L2E+LyIgCisgICAgICAiPGEgaHJlZj1cIiMiPDxpcy0+X2xpYl9uYW1lPDwiX2ZsYWdzXCI+ZmxhZ3M8L2E+ICA8L1REPiIgPDwgZW5kbCA7CisgICAgY291dCA8PCAiICAgICA8VEQ+ICIgPDwgCisgICAgICAiPGEgaHJlZj1cIiMiPDxpcy0+X2xpYl9uYW1lPDwiX2NvbW1lbnRzXCI+Y2xpY2sgaGVyZTwvYT4gIDwvVEQ+IiA8PCBlbmRsIDsKKyAgICBjb3V0IDw8ICIgIDwvVFI+IiA8PCBlbmRsIDsKKyAgCisgIH0KKworICBjb3V0IDw8ICI8L1RBQkxFPiIgPDwgZW5kbCA7CisKKyAgb2ZzdHJlYW0gb3V0cHV0X2ZpbGUgKCIuLi9vcmRlcl9saWIiLGlvczo6b3V0KSA7CisgIAorICBmb3IgKGlzPXNfbGliX21lYW4uYmVnaW4oKTsgaXMhPXNfbGliX21lYW4uZW5kKCkgOyBpcysrKXsKKyAgICBvdXRwdXRfZmlsZSA8PCBpcy0+X2xpYl9uYW1lIDw8IGVuZGwgOworICB9CisKKyAgb3V0cHV0X2ZpbGUuY2xvc2UoKTsKKworfQorCitkb3VibGUgbWVhbl9jYWxjKGNvbnN0IHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCBjb25zdCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMsIGNvbnN0IGludCBzaXplX21pbiwgY29uc3QgaW50IHNpemVfbWF4KXsKKyAgCisgIGludCBzaXplPXRhYl9zaXplcy5zaXplKCk7CisgIGludCBuYl9zYW1wbGU9MDsKKyAgZG91YmxlIG1lYW49MC4wOworCisgIGZvciAoaW50IGk9MDtpPHNpemU7aSsrKXsKKyAgICAKKyAgICAKKyAgICBpZiAoKHRhYl9zaXplc1tpXT49c2l6ZV9taW4pJiYodGFiX3NpemVzW2ldPD1zaXplX21heCkpeworICAgICAgCisgICAgICBuYl9zYW1wbGUrKzsKKyAgICAgIG1lYW4rPXRhYl9tZmxvcHNbaV07CisKKyAgICB9CisKKyAgICAKKyAgfQorCisgIGlmIChuYl9zYW1wbGU9PTApeworICAgIElORk9TKCJubyBkYXRhIGZvciBtZWFuIGNhbGN1bGF0aW9uIik7CisgICAgcmV0dXJuIDAuMDsKKyAgfQorCisgIHJldHVybiBtZWFuL25iX3NhbXBsZTsKK30KKworICAKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9ta19nbnVwbG90X3NjcmlwdC5zaCBiL2JlbmNoL2J0bC9kYXRhL21rX2dudXBsb3Rfc2NyaXB0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYTdiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZGF0YS9ta19nbnVwbG90X3NjcmlwdC5zaApAQCAtMCwwICsxLDY4IEBACisjISAvYmluL2Jhc2gKK1dIQVQ9JDEKK0RJUj0kMgorZWNobyAkV0hBVCBzY3JpcHQgZ2VuZXJhdGlvbgorY2F0ICRXSEFULmhoID4gJFdIQVQuZ251cGxvdAorCitEQVRBX0ZJTEU9YGZpbmQgJERJUiAtbmFtZSAiKi5kYXQiIHwgZ3JlcCAkV0hBVGAKKworZWNobyBwbG90IFxcID4+ICRXSEFULmdudXBsb3QKKworZm9yIEZJTEUgaW4gJERBVEFfRklMRQorZG8KKyAgICBMQVNUPSRGSUxFCitkb25lCisKK2VjaG8gTEFTVD0kTEFTVAorCitmb3IgRklMRSBpbiAkREFUQV9GSUxFCitkbworICAgICBpZiBbICRGSUxFICE9ICRMQVNUIF0KKyAgICAgdGhlbgorCUJBU0U9JHtGSUxFIyMqL30gOyBCQVNFPSR7RklMRSMjKi99IDsgQVZBTlQ9YmVuY2hfJHtXSEFUfV8gOyBSRURVQz0ke0JBU0UjIyokQVZBTlR9IDsgVElUTEU9JHtSRURVQyUuZGF0fQorCWVjaG8gIiciJEZJTEUiJyIgdGl0bGUgIiciJFRJVExFIiciICIsXFwiID4+ICAkV0hBVC5nbnVwbG90CisgICAgIGZpCitkb25lCitCQVNFPSR7TEFTVCMjKi99IDsgQkFTRT0ke0ZJTEUjIyovfSA7IEFWQU5UPWJlbmNoXyR7V0hBVH1fIDsgUkVEVUM9JHtCQVNFIyMqJEFWQU5UfSA7IFRJVExFPSR7UkVEVUMlLmRhdH0KK2VjaG8gIiciJExBU1QiJyIgdGl0bGUgIiciJFRJVExFIiciID4+ICAkV0hBVC5nbnVwbG90CisKKyNlY2hvIHNldCB0ZXJtIHBvc3RzY3JpcHQgY29sb3IgPj4gJFdIQVQuZ251cGxvdAorI2VjaG8gc2V0IG91dHB1dCAiJyIkV0hBVC5wcyInIiA+PiAkV0hBVC5nbnVwbG90CitlY2hvIHNldCB0ZXJtIHBibSBzbWFsbCBjb2xvciA+PiAkV0hBVC5nbnVwbG90CitlY2hvIHNldCBvdXRwdXQgIiciJFdIQVQucHBtIiciID4+ICRXSEFULmdudXBsb3QKK2VjaG8gcGxvdCBcXCA+PiAkV0hBVC5nbnVwbG90CisKK2ZvciBGSUxFIGluICREQVRBX0ZJTEUKK2RvCisgICAgIGlmIFsgJEZJTEUgIT0gJExBU1QgXQorICAgICB0aGVuCisJQkFTRT0ke0ZJTEUjIyovfSA7IEJBU0U9JHtGSUxFIyMqL30gOyBBVkFOVD1iZW5jaF8ke1dIQVR9XyA7IFJFRFVDPSR7QkFTRSMjKiRBVkFOVH0gOyBUSVRMRT0ke1JFRFVDJS5kYXR9CisJZWNobyAiJyIkRklMRSInIiB0aXRsZSAiJyIkVElUTEUiJyIgIixcXCIgPj4gICRXSEFULmdudXBsb3QKKyAgICAgZmkKK2RvbmUKK0JBU0U9JHtMQVNUIyMqL30gOyBCQVNFPSR7RklMRSMjKi99IDsgQVZBTlQ9YmVuY2hfJHtXSEFUfV8gOyBSRURVQz0ke0JBU0UjIyokQVZBTlR9IDsgVElUTEU9JHtSRURVQyUuZGF0fQorZWNobyAiJyIkTEFTVCInIiB0aXRsZSAiJyIkVElUTEUiJyIgPj4gICRXSEFULmdudXBsb3QKKworZWNobyBzZXQgdGVybSBqcGVnIGxhcmdlID4+ICRXSEFULmdudXBsb3QKK2VjaG8gc2V0IG91dHB1dCAiJyIkV0hBVC5qcGciJyIgPj4gJFdIQVQuZ251cGxvdAorZWNobyBwbG90IFxcID4+ICRXSEFULmdudXBsb3QKKworZm9yIEZJTEUgaW4gJERBVEFfRklMRQorZG8KKyAgICAgaWYgWyAkRklMRSAhPSAkTEFTVCBdCisgICAgIHRoZW4KKwlCQVNFPSR7RklMRSMjKi99IDsgQkFTRT0ke0ZJTEUjIyovfSA7IEFWQU5UPWJlbmNoXyR7V0hBVH1fIDsgUkVEVUM9JHtCQVNFIyMqJEFWQU5UfSA7IFRJVExFPSR7UkVEVUMlLmRhdH0KKwllY2hvICInIiRGSUxFIiciIHRpdGxlICInIiRUSVRMRSInIiAiLFxcIiA+PiAgJFdIQVQuZ251cGxvdAorICAgICBmaQorZG9uZQorQkFTRT0ke0xBU1QjIyovfSA7IEJBU0U9JHtGSUxFIyMqL30gOyBBVkFOVD1iZW5jaF8ke1dIQVR9XyA7IFJFRFVDPSR7QkFTRSMjKiRBVkFOVH0gOyBUSVRMRT0ke1JFRFVDJS5kYXR9CitlY2hvICInIiRMQVNUIiciIHRpdGxlICInIiRUSVRMRSInIiA+PiAgJFdIQVQuZ251cGxvdAorCisKK2dudXBsb3QgLXBlcnNpc3QgPCAkV0hBVC5nbnVwbG90CisKK3JtICRXSEFULmdudXBsb3QKKworCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2RhdGEvbWtfbWVhbl9zY3JpcHQuc2ggYi9iZW5jaC9idGwvZGF0YS9ta19tZWFuX3NjcmlwdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTBkZjAyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2RhdGEvbWtfbWVhbl9zY3JpcHQuc2gKQEAgLTAsMCArMSw1MiBAQAorIyEgL2Jpbi9iYXNoCitXSEFUPSQxCitESVI9JDIKK01JTklDPSQzCitNQVhJQz0kNAorTUlOT0M9JDUKK01BWE9DPSQ2CitwcmVmaXg9JDgKKworbWVhbnN0YXRzZmlsZW5hbWU9JDIvbWVhbi5odG1sCisKK1dPUktfRElSPXRtcAorbWtkaXIgJFdPUktfRElSCisKK0RBVEFfRklMRT1gZmluZCAkRElSIC1uYW1lICIqLmRhdCIgfCBncmVwIF8ke1dIQVR9YAorCitpZiBbIC1uICIkREFUQV9GSUxFIiBdOyB0aGVuCisKKyAgZWNobyAiIgorICBlY2hvICIkMS4uLiIKKyAgZm9yIEZJTEUgaW4gJERBVEFfRklMRQorICBkbworICAgICAgICAgICMjZWNobyBoZWxsbyB3b3JsZAorICAgICAgICAgICMjZWNobyAibWtfbWVhbl9zY3JpcHQxIiAke0ZJTEV9CisgICAgQkFTRT0ke0ZJTEUjIyovfSA7IEJBU0U9JHtGSUxFIyMqL30gOyBBVkFOVD1iZW5jaF8ke1dIQVR9XyA7IFJFRFVDPSR7QkFTRSMjKiRBVkFOVH0gOyBUSVRMRT0ke1JFRFVDJS5kYXR9CisKKyAgICAjI2VjaG8gIm1rX21lYW5fc2NyaXB0MSIgJHtUSVRMRX0KKyAgICBjcCAkRklMRSAke1dPUktfRElSfS8ke1RJVExFfQorCisgIGRvbmUKKworICBjZCAkV09SS19ESVIKKyAgLi4vbWFpbiAkMSAkMyAkNCAkNSAkNiAqID4+IC4uLyRtZWFuc3RhdHNmaWxlbmFtZQorICAuLi9ta19uZXdfZ251cGxvdC5zaCAkMSAkMiAkNworICBybSAtZiAqLmdudXBsb3QKKyAgY2QgLi4KKworICBlY2hvICc8YnIvPicgPj4gJG1lYW5zdGF0c2ZpbGVuYW1lCisKKyAgd2VicGFnZWZpbGVuYW1lPSQyL2luZGV4Lmh0bWwKKyAgIyBlY2hvICc8aDM+JyR7V0hBVH0nPC9oMz4nICA+PiAkd2VicGFnZWZpbGVuYW1lCisgIGVjaG8gJzxoci8+PGEgaHJlZj0iJyRwcmVmaXgkMScucGRmIj48aW1nIHNyYz0iJyRwcmVmaXgkMScucG5nIiBhbHQ9Iicke1dIQVR9JyIgLz48L2E+PGJyLz4nICA+PiAkd2VicGFnZWZpbGVuYW1lCisKK2ZpCisKK3JtIC1SICRXT1JLX0RJUgorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2RhdGEvbWtfbmV3X2dudXBsb3Quc2ggYi9iZW5jaC9idGwvZGF0YS9ta19uZXdfZ251cGxvdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYWQzYjIzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2RhdGEvbWtfbmV3X2dudXBsb3Quc2gKQEAgLTAsMCArMSw1NCBAQAorIyEvYmluL2Jhc2gKK1dIQVQ9JDEKK0RJUj0kMgorCitjYXQgLi4vZ251cGxvdF9jb21tb25fc2V0dGluZ3MuaGggPiAke1dIQVR9LmdudXBsb3QKKworZWNobyAic2V0IHRpdGxlICIgYGdyZXAgJHtXSEFUfSAuLi9hY3Rpb25fc2V0dGluZ3MudHh0IHwgaGVhZCAtbiAxIHwgY3V0IC1kICI7IiAtZiAyYCA+PiAkV0hBVC5nbnVwbG90CitlY2hvICJzZXQgeGxhYmVsICIgYGdyZXAgJHtXSEFUfSAuLi9hY3Rpb25fc2V0dGluZ3MudHh0IHwgaGVhZCAtbiAxIHwgY3V0IC1kICI7IiAtZiAzYCAiIG9mZnNldCAwLDAiID4+ICRXSEFULmdudXBsb3QKK2VjaG8gInNldCB4cmFuZ2UgWyIgYGdyZXAgJHtXSEFUfSAuLi9hY3Rpb25fc2V0dGluZ3MudHh0IHwgaGVhZCAtbiAxIHwgY3V0IC1kICI7IiAtZiA0YCAiXSIgPj4gJFdIQVQuZ251cGxvdAorCitpZiBbICQjID4gMyBdOyB0aGVuCisgIGlmIFsgIiQzIiA9PSAidGlueSIgXTsgdGhlbgorICAgIGVjaG8gInNldCB4cmFuZ2UgWzI6MTZdIiA+PiAkV0hBVC5nbnVwbG90CisgICAgZWNobyAic2V0IG5vbG9nc2NhbGUiID4+ICRXSEFULmdudXBsb3QKKyAgZmkKK2ZpCisKKworCitEQVRBX0ZJTEU9YGNhdCAuLi9vcmRlcl9saWJgCitlY2hvIHNldCB0ZXJtIHBvc3RzY3JpcHQgY29sb3Igcm91bmRlZCBlbmhhbmNlZCA+PiAkV0hBVC5nbnVwbG90CitlY2hvIHNldCBvdXRwdXQgIiciLi4vJHtESVJ9LyRXSEFULnBzIiciID4+ICRXSEFULmdudXBsb3QKKworIyBlY2hvIHNldCB0ZXJtIHN2ZyBjb2xvciByb3VuZGVkIGVuaGFuY2VkID4+ICRXSEFULmdudXBsb3QKKyMgZWNobyAic2V0IHRlcm1pbmFsIHN2ZyBlbmhhbmNlZCBzaXplIDEwMDAgMTAwMCBmbmFtZSBcIlRpbWVzXCIgZnNpemUgMzYiID4+ICRXSEFULmdudXBsb3QKKyMgZWNobyBzZXQgb3V0cHV0ICInIi4uLyR7RElSfS8kV0hBVC5zdmciJyIgPj4gJFdIQVQuZ251cGxvdAorCitlY2hvIHBsb3QgXFwgPj4gJFdIQVQuZ251cGxvdAorCitmb3IgRklMRSBpbiAkREFUQV9GSUxFCitkbworICAgIExBU1Q9JEZJTEUKK2RvbmUKKworZm9yIEZJTEUgaW4gJERBVEFfRklMRQorZG8KKyAgICBCQVNFPSR7RklMRSMjKi99IDsgQkFTRT0ke0ZJTEUjIyovfSA7IEFWQU5UPWJlbmNoXyR7V0hBVH1fIDsgUkVEVUM9JHtCQVNFIyMqJEFWQU5UfSA7IFRJVExFPSR7UkVEVUMlLmRhdH0KKworICAgIGVjaG8gIiciJEZJTEUiJyIgYGdyZXAgJFRJVExFIC4uL3BlcmxpYl9wbG90X3NldHRpbmdzLnR4dCB8IGhlYWQgLW4gMSB8IGN1dCAtZCAiOyIgLWYgMmAgIlxcIiA+PiAgJFdIQVQuZ251cGxvdAorICAgIGlmIFsgJEZJTEUgIT0gJExBU1QgXQorICAgIHRoZW4KKyAgICAgIGVjaG8gIiwgXFwiID4+ICAkV0hBVC5nbnVwbG90CisgICAgZmkKK2RvbmUKK2VjaG8gIiAiID4+ICAkV0hBVC5nbnVwbG90CisKK2dudXBsb3QgLXBlcnNpc3QgPCAkV0hBVC5nbnVwbG90CisKK3JtICRXSEFULmdudXBsb3QKKworcHMycGRmIC4uLyR7RElSfS8kV0hBVC5wcyAuLi8ke0RJUn0vJFdIQVQucGRmCitjb252ZXJ0IC1iYWNrZ3JvdW5kIHdoaXRlIC1kZW5zaXR5IDEyMCAtcm90YXRlIDkwIC1yZXNpemUgODAwICtkaXRoZXIgLWNvbG9ycyAyNTYgLXF1YWxpdHkgMCAuLi8ke0RJUn0vJFdIQVQucHMgLWJhY2tncm91bmQgd2hpdGUgLWZsYXR0ZW4gIC4uLyR7RElSfS8kV0hBVC5wbmcKKworIyBwc3RvZWRpdCAtcm90YXRlIC05MCAteHNjYWxlIDAuOCAteXNjYWxlIDAuOCAtY2VudGVyZWQgLXlzaGlmdCAtNTAgLXhzaGlmdCAtMTAwICAtZiBwbG90LXN2ZyBhYXQucHMgIGFhdDIuc3ZnCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9wZXJsaWJfcGxvdF9zZXR0aW5ncy50eHQgYi9iZW5jaC9idGwvZGF0YS9wZXJsaWJfcGxvdF9zZXR0aW5ncy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0NGJhYgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9kYXRhL3BlcmxpYl9wbG90X3NldHRpbmdzLnR4dApAQCAtMCwwICsxLDE2IEBACitlaWdlbjMgOyAgICAgICAgICB3aXRoIGxpbmVzIGx3IDQgbHQgMSBsYyByZ2Jjb2xvciAiYmxhY2siCitlaWdlbjIgOyAgICAgICAgICB3aXRoIGxpbmVzIGx3IDMgbHQgMSBsYyByZ2Jjb2xvciAiIzk5OTk5OSIKK0VpZ2VuQkxBUyA7ICAgICAgIHdpdGggbGluZXMgbHcgMyBsdCAzIGxjIHJnYmNvbG9yICIjOTk5OTk5IgorZWlnZW4zX25vdmVjIDsgICAgd2l0aCBsaW5lcyBsdyAyIGx0IDEgbGMgcmdiY29sb3IgIiM5OTk5OTkiCitlaWdlbjNfbm9nY2N2ZWMgOyB3aXRoIGxpbmVzIGx3IDIgbHQgMiBsYyByZ2Jjb2xvciAiIzk5MTAxMCIKK0lOVEVMX01LTCA7ICAgICAgIHdpdGggbGluZXMgbHcgMyBsdCAxIGxjIHJnYmNvbG9yICIjZmYwMDAwIgorQVRMQVMgOyAgICAgICAgICAgd2l0aCBsaW5lcyBsdyAzIGx0IDEgbGMgcmdiY29sb3IgIiMwMDgwMDAiCitnbW0gOyAgICAgICAgICAgICB3aXRoIGxpbmVzIGx3IDMgbHQgMSBsYyByZ2Jjb2xvciAiIzAwMDBmZiIKK3VibGFzIDsgICAgICAgICAgIHdpdGggbGluZXMgbHcgMyBsdCAxIGxjIHJnYmNvbG9yICIjMDBiN2ZmIgorbXRsNCA7ICAgICAgICAgICAgd2l0aCBsaW5lcyBsdyAzIGx0IDEgbGMgcmdiY29sb3IgIiNkMTg4NDciCitibGl0eiA7ICAgICAgICAgICB3aXRoIGxpbmVzIGx3IDMgbHQgMSBsYyByZ2Jjb2xvciAiI2ZmMDBmZiIKK0Y3NyA7ICAgICAgICAgICAgIHdpdGggbGluZXMgbHcgMyBsdCAzIGxjIHJnYmNvbG9yICIjZTZlNjRjIgorR09UTyA7ICAgICAgICAgICAgd2l0aCBsaW5lcyBsdyAzIGx0IDMgbGMgcmdiY29sb3IgIiNDMDU2MDAiCitHT1RPMiA7ICAgICAgICAgICB3aXRoIGxpbmVzIGx3IDMgbHQgMSBsYyByZ2Jjb2xvciAiI0MwNTYwMCIKK0MgOyAgICAgICAgICAgICAgIHdpdGggbGluZXMgbHcgMyBsdCAzIGxjIHJnYmNvbG9yICIjZTZiZDk2IgorQUNNTCA7ICAgICAgICAgICAgd2l0aCBsaW5lcyBsdyAyIGx0IDMgbGMgcmdiY29sb3IgIiNlNmU2NGMiCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9yZWd1bGFyaXplLmN4eCBiL2JlbmNoL2J0bC9kYXRhL3JlZ3VsYXJpemUuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZGF0YS9yZWd1bGFyaXplLmN4eApAQCAtMCwwICsxLDEzMSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHJlZ3VsYXJpemUuY3h4CisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE1IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8gCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vIAorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlICJiZW5jaF9wYXJhbWV0ZXIuaGgiCisjaW5jbHVkZSA8c2V0PgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit2b2lkIHJlYWRfeHlfZmlsZShjb25zdCBzdHJpbmcgJiBmaWxlbmFtZSwgdmVjdG9yPGludD4gJiB0YWJfc2l6ZXMsIHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcyk7Cit2b2lkIHJlZ3VsYXJpemVfY3VydmUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsCisJCSAgICAgIGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgCisJCSAgICAgIGNvbnN0IHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCAKKwkJICAgICAgaW50IHN0YXJ0X2N1dF9zaXplLCBpbnQgc3RvcF9jdXRfc2l6ZSk7CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBtYWluKCBpbnQgYXJnYyAsIGNoYXIgKmFyZ3ZbXSApCit7CisKKyAgLy8gaW5wdXQgZGF0YQorCisgIGlmIChhcmdjPDQpeworICAgIElORk9TKCIhISEgRXJyb3IgLi4uIHVzYWdlIDogbWFpbiBmaWxlbmFtZSBzdGFydF9jdXRfc2l6ZSBzdG9wX2N1dF9zaXplIHJlZ3VsYXJpemVfZmlsZW5hbWUiKTsKKyAgICBleGl0KDApOworICB9CisgIElORk9TKGFyZ2MpOworCisgIGludCBzdGFydF9jdXRfc2l6ZT1hdG9pKGFyZ3ZbMl0pOworICBpbnQgc3RvcF9jdXRfc2l6ZT1hdG9pKGFyZ3ZbM10pOworCisgIHN0cmluZyBmaWxlbmFtZT1hcmd2WzFdOworICBzdHJpbmcgcmVndWxhcml6ZV9maWxlbmFtZT1hcmd2WzRdOworICAKKyAgSU5GT1MoZmlsZW5hbWUpOworICBJTkZPUygic3RhcnRfY3V0X3NpemU9Ijw8c3RhcnRfY3V0X3NpemUpOworCisgIHZlY3RvcjxpbnQ+IHRhYl9zaXplczsKKyAgdmVjdG9yPGRvdWJsZT4gdGFiX21mbG9wczsKKworICByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsdGFiX3NpemVzLHRhYl9tZmxvcHMpOworCisgIC8vIHJlZ3VsYXJpemVpbmcKKworICByZWd1bGFyaXplX2N1cnZlKHJlZ3VsYXJpemVfZmlsZW5hbWUsdGFiX21mbG9wcyx0YWJfc2l6ZXMsc3RhcnRfY3V0X3NpemUsc3RvcF9jdXRfc2l6ZSk7CisgIAorCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgcmVndWxhcml6ZV9jdXJ2ZShjb25zdCBzdHJpbmcgJiBmaWxlbmFtZSwKKwkJICAgICAgY29uc3QgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzLCAKKwkJICAgICAgY29uc3QgdmVjdG9yPGludD4gJiB0YWJfc2l6ZXMsIAorCQkgICAgICBpbnQgc3RhcnRfY3V0X3NpemUsIGludCBzdG9wX2N1dF9zaXplKQoreworICBpbnQgc2l6ZT10YWJfbWZsb3BzLnNpemUoKTsKKyAgb2ZzdHJlYW0gb3V0cHV0X2ZpbGUgKGZpbGVuYW1lLmNfc3RyKCksaW9zOjpvdXQpIDsKKworICBpbnQgaT0wOworCisgIHdoaWxlKHRhYl9zaXplc1tpXTxzdGFydF9jdXRfc2l6ZSl7CisgICAgCisgICAgb3V0cHV0X2ZpbGUgPDwgdGFiX3NpemVzW2ldIDw8ICIgIiA8PCAgdGFiX21mbG9wc1tpXSA8PCBlbmRsIDsKKyAgICBpKys7CisKKyAgfQorICAgIAorICBvdXRwdXRfZmlsZSA8PCBlbmRsIDsKKworICB3aGlsZSh0YWJfc2l6ZXNbaV08c3RvcF9jdXRfc2l6ZSl7CisgICAgCisgICAgaSsrOworCisgIH0KKworICB3aGlsZShpPHNpemUpeworICAgIAorICAgIG91dHB1dF9maWxlIDw8IHRhYl9zaXplc1tpXSA8PCAiICIgPDwgIHRhYl9tZmxvcHNbaV0gPDwgZW5kbCA7CisgICAgaSsrOworCisgIH0KKworICBvdXRwdXRfZmlsZS5jbG9zZSgpOworCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCByZWFkX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsIHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpeworCisgIGlmc3RyZWFtIGlucHV0X2ZpbGUgKGZpbGVuYW1lLmNfc3RyKCksaW9zOjppbikgOworCisgIGlmICghaW5wdXRfZmlsZSl7CisgICAgSU5GT1MoIiEhISBFcnJvciBvcGVuaW5nICI8PGZpbGVuYW1lKTsKKyAgICBleGl0KDApOworICB9CisgIAorICBpbnQgbmJfcG9pbnQ9MDsKKyAgaW50IHNpemU9MDsKKyAgZG91YmxlIG1mbG9wcz0wOworCisgIHdoaWxlIChpbnB1dF9maWxlID4+IHNpemUgPj4gbWZsb3BzICl7CisgICAgbmJfcG9pbnQrKzsKKyAgICB0YWJfc2l6ZXMucHVzaF9iYWNrKHNpemUpOworICAgIHRhYl9tZmxvcHMucHVzaF9iYWNrKG1mbG9wcyk7CisgIH0KKyAgU0NSVVRFKG5iX3BvaW50KTsKKworICBpbnB1dF9maWxlLmNsb3NlKCk7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9kYXRhL3Ntb290aC5jeHggYi9iZW5jaC9idGwvZGF0YS9zbW9vdGguY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjcwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZGF0YS9zbW9vdGguY3h4CkBAIC0wLDAgKzEsMTk4IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgc21vb3RoLmN4eAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSAiYmVuY2hfcGFyYW1ldGVyLmhoIgorI2luY2x1ZGUgPHNldD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordm9pZCByZWFkX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsIHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpOwordm9pZCB3cml0ZV94eV9maWxlKGNvbnN0IHN0cmluZyAmIGZpbGVuYW1lLCB2ZWN0b3I8aW50PiAmIHRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzKTsKK3ZvaWQgc21vb3RoX2N1cnZlKGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgdmVjdG9yPGRvdWJsZT4gJiBzbW9vdGhfdGFiX21mbG9wcyxpbnQgd2luZG93X2hhbGZfd2lkdGgpOwordm9pZCBjZW50ZXJlZF9zbW9vdGhfY3VydmUoY29uc3QgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzLCB2ZWN0b3I8ZG91YmxlPiAmIHNtb290aF90YWJfbWZsb3BzLGludCB3aW5kb3dfaGFsZl93aWR0aCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IG1haW4oIGludCBhcmdjICwgY2hhciAqYXJndltdICkKK3sKKworICAvLyBpbnB1dCBkYXRhCisKKyAgaWYgKGFyZ2M8Myl7CisgICAgSU5GT1MoIiEhISBFcnJvciAuLi4gdXNhZ2UgOiBtYWluIGZpbGVuYW1lIHdpbmRvd19oYWxmX3dpZHRoIHNtb290aF9maWxlbmFtZSIpOworICAgIGV4aXQoMCk7CisgIH0KKyAgSU5GT1MoYXJnYyk7CisKKyAgaW50IHdpbmRvd19oYWxmX3dpZHRoPWF0b2koYXJndlsyXSk7CisKKyAgc3RyaW5nIGZpbGVuYW1lPWFyZ3ZbMV07CisgIHN0cmluZyBzbW9vdGhfZmlsZW5hbWU9YXJndlszXTsKKyAgCisgIElORk9TKGZpbGVuYW1lKTsKKyAgSU5GT1MoIndpbmRvd19oYWxmX3dpZHRoPSI8PHdpbmRvd19oYWxmX3dpZHRoKTsKKworICB2ZWN0b3I8aW50PiB0YWJfc2l6ZXM7CisgIHZlY3Rvcjxkb3VibGU+IHRhYl9tZmxvcHM7CisKKyAgcmVhZF94eV9maWxlKGZpbGVuYW1lLHRhYl9zaXplcyx0YWJfbWZsb3BzKTsKKworICAvLyBzbW9vdGhpbmcKKworICB2ZWN0b3I8ZG91YmxlPiBzbW9vdGhfdGFiX21mbG9wczsKKworICAvL3Ntb290aF9jdXJ2ZSh0YWJfbWZsb3BzLHNtb290aF90YWJfbWZsb3BzLHdpbmRvd19oYWxmX3dpZHRoKTsKKyAgY2VudGVyZWRfc21vb3RoX2N1cnZlKHRhYl9tZmxvcHMsc21vb3RoX3RhYl9tZmxvcHMsd2luZG93X2hhbGZfd2lkdGgpOworCisgIC8vIG91dHB1dCByZXN1bHQKKworICB3cml0ZV94eV9maWxlKHNtb290aF9maWxlbmFtZSx0YWJfc2l6ZXMsc21vb3RoX3RhYl9tZmxvcHMpOworICAKKworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3RlbXBsYXRlPGNsYXNzIFZFQ1RPUj4KK2RvdWJsZSB3ZWlnaHRlZF9tZWFuKGNvbnN0IFZFQ1RPUiAmIGRhdGEpCit7CisKKyAgZG91YmxlIG1lYW49MC4wOworICAKKyAgZm9yIChpbnQgaT0wIDsgaTxkYXRhLnNpemUoKSA7IGkrKyl7CisKKyAgICBtZWFuKz1kYXRhW2ldOworCisgIH0KKworICByZXR1cm4gbWVhbi9kb3VibGUoZGF0YS5zaXplKCkpIDsKKworfSAgICAKKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3ZvaWQgc21vb3RoX2N1cnZlKGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgdmVjdG9yPGRvdWJsZT4gJiBzbW9vdGhfdGFiX21mbG9wcyxpbnQgd2luZG93X2hhbGZfd2lkdGgpeworICAKKyAgaW50IHdpbmRvd193aWR0aD0yKndpbmRvd19oYWxmX3dpZHRoKzE7CisKKyAgaW50IHNpemU9dGFiX21mbG9wcy5zaXplKCk7CisKKyAgdmVjdG9yPGRvdWJsZT4gc2FtcGxlKHdpbmRvd193aWR0aCk7CisgIAorICBmb3IgKGludCBpPTAgOyBpIDwgc2l6ZSA7IGkrKyl7CisgICAgCisgICAgZm9yICggaW50IGo9MCA7IGogPCB3aW5kb3dfd2lkdGggOyBqKysgKXsKKyAgICAgIAorICAgICAgaW50IHNoaWZ0ZWRfaW5kZXg9aStqLXdpbmRvd19oYWxmX3dpZHRoOworICAgICAgaWYgKHNoaWZ0ZWRfaW5kZXg8MCkgc2hpZnRlZF9pbmRleD0wOworICAgICAgaWYgKHNoaWZ0ZWRfaW5kZXg+c2l6ZS0xKSBzaGlmdGVkX2luZGV4PXNpemUtMTsKKyAgICAgIHNhbXBsZVtqXT10YWJfbWZsb3BzW3NoaWZ0ZWRfaW5kZXhdOworICAgICAgCisgICAgfQorCisgICAgc21vb3RoX3RhYl9tZmxvcHMucHVzaF9iYWNrKHdlaWdodGVkX21lYW4oc2FtcGxlKSk7CisKKyAgfQorCit9CisKK3ZvaWQgY2VudGVyZWRfc21vb3RoX2N1cnZlKGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgdmVjdG9yPGRvdWJsZT4gJiBzbW9vdGhfdGFiX21mbG9wcyxpbnQgd2luZG93X2hhbGZfd2lkdGgpeworICAKKyAgaW50IG1heF93aW5kb3dfd2lkdGg9Mip3aW5kb3dfaGFsZl93aWR0aCsxOworCisgIGludCBzaXplPXRhYl9tZmxvcHMuc2l6ZSgpOworCisgIAorICBmb3IgKGludCBpPTAgOyBpIDwgc2l6ZSA7IGkrKyl7CisKKyAgICBkZXF1ZTxkb3VibGU+IHNhbXBsZTsKKworICAgIAorICAgIHNhbXBsZS5wdXNoX2JhY2sodGFiX21mbG9wc1tpXSk7CisKKyAgICBmb3IgKCBpbnQgaj0xIDsgaiA8PSB3aW5kb3dfaGFsZl93aWR0aCA7IGorKyApeworICAgICAgCisgICAgICBpbnQgYmVmb3JlPWktajsKKyAgICAgIGludCBhZnRlcj1pK2o7CisgICAgICAKKyAgICAgIGlmICgoYmVmb3JlPj0wKSYmKGFmdGVyPHNpemUpKSAvLyBpbnNpZGUgb2YgdGhlIHZlY3RvcgorCXsgCisJICBzYW1wbGUucHVzaF9mcm9udCh0YWJfbWZsb3BzW2JlZm9yZV0pOworCSAgc2FtcGxlLnB1c2hfYmFjayh0YWJfbWZsb3BzW2FmdGVyXSk7CisJfQorICAgIH0KKyAgICAKKyAgICBzbW9vdGhfdGFiX21mbG9wcy5wdXNoX2JhY2sod2VpZ2h0ZWRfbWVhbihzYW1wbGUpKTsKKyAgICAKKyAgfQorCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIHdyaXRlX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsIHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpeworCisgIG9mc3RyZWFtIG91dHB1dF9maWxlIChmaWxlbmFtZS5jX3N0cigpLGlvczo6b3V0KSA7CisgIAorICBmb3IgKGludCBpPTAgOyBpIDwgdGFiX3NpemVzLnNpemUoKSA7IGkrKykKKyAgICB7CisgICAgICBvdXRwdXRfZmlsZSA8PCB0YWJfc2l6ZXNbaV0gPDwgIiAiIDw8ICB0YWJfbWZsb3BzW2ldIDw8IGVuZGwgOworICAgIH0KKyAgCisgIG91dHB1dF9maWxlLmNsb3NlKCk7CisKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgcmVhZF94eV9maWxlKGNvbnN0IHN0cmluZyAmIGZpbGVuYW1lLCB2ZWN0b3I8aW50PiAmIHRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzKXsKKworICBpZnN0cmVhbSBpbnB1dF9maWxlIChmaWxlbmFtZS5jX3N0cigpLGlvczo6aW4pIDsKKworICBpZiAoIWlucHV0X2ZpbGUpeworICAgIElORk9TKCIhISEgRXJyb3Igb3BlbmluZyAiPDxmaWxlbmFtZSk7CisgICAgZXhpdCgwKTsKKyAgfQorICAKKyAgaW50IG5iX3BvaW50PTA7CisgIGludCBzaXplPTA7CisgIGRvdWJsZSBtZmxvcHM9MDsKKworICB3aGlsZSAoaW5wdXRfZmlsZSA+PiBzaXplID4+IG1mbG9wcyApeworICAgIG5iX3BvaW50Kys7CisgICAgdGFiX3NpemVzLnB1c2hfYmFjayhzaXplKTsKKyAgICB0YWJfbWZsb3BzLnB1c2hfYmFjayhtZmxvcHMpOworICB9CisgIFNDUlVURShuYl9wb2ludCk7CisKKyAgaW5wdXRfZmlsZS5jbG9zZSgpOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9zbW9vdGhfYWxsLnNoIGIvYmVuY2gvYnRsL2RhdGEvc21vb3RoX2FsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTViZmRmCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2RhdGEvc21vb3RoX2FsbC5zaApAQCAtMCwwICsxLDY4IEBACisjISAvYmluL2Jhc2gKK09SSUdfRElSPSQxCitTTU9PVEhfRElSPSR7T1JJR19ESVJ9X3Ntb290aAorbWtkaXIgJHtTTU9PVEhfRElSfQorCitBWFBZX0ZJTEU9YGZpbmQgJHtPUklHX0RJUn0gLW5hbWUgIiouZGF0IiB8IGdyZXAgYXhweWAKK2ZvciBGSUxFIGluICR7QVhQWV9GSUxFfQorZG8KKyAgICBlY2hvICRGSUxFCisgICAgQkFTRT0ke0ZJTEUjIyovfQorICAgIC4vc21vb3RoICR7T1JJR19ESVJ9LyR7QkFTRX0gNCAke1NNT09USF9ESVJ9LyR7QkFTRX1fdG1wCisgICAgLi9yZWd1bGFyaXplICR7U01PT1RIX0RJUn0vJHtCQVNFfV90bXAgMjUwMCAxNTAwMCAke1NNT09USF9ESVJ9LyR7QkFTRX0KKyAgICBybSAtZiAgJHtTTU9PVEhfRElSfS8ke0JBU0V9X3RtcAorZG9uZQorCisKK01BVFJJWF9WRUNUT1JfRklMRT1gZmluZCAke09SSUdfRElSfSAtbmFtZSAiKi5kYXQiIHwgZ3JlcCBtYXRyaXhfdmVjdG9yYAorZm9yIEZJTEUgaW4gJHtNQVRSSVhfVkVDVE9SX0ZJTEV9CitkbworICAgIGVjaG8gJEZJTEUKKyAgICBCQVNFPSR7RklMRSMjKi99CisgICAgLi9zbW9vdGggJHtPUklHX0RJUn0vJHtCQVNFfSA0ICR7U01PT1RIX0RJUn0vJHtCQVNFfV90bXAKKyAgICAuL3JlZ3VsYXJpemUgJHtTTU9PVEhfRElSfS8ke0JBU0V9X3RtcCA1MCAxODAgJHtTTU9PVEhfRElSfS8ke0JBU0V9CisgICAgcm0gLWYgICR7U01PT1RIX0RJUn0vJHtCQVNFfV90bXAKK2RvbmUKKworTUFUUklYX01BVFJJWF9GSUxFPWBmaW5kICR7T1JJR19ESVJ9IC1uYW1lICIqLmRhdCIgfCBncmVwIG1hdHJpeF9tYXRyaXhgCitmb3IgRklMRSBpbiAke01BVFJJWF9NQVRSSVhfRklMRX0KK2RvCisgICAgZWNobyAkRklMRQorICAgIEJBU0U9JHtGSUxFIyMqL30KKyAgICAuL3Ntb290aCAke09SSUdfRElSfS8ke0JBU0V9IDQgJHtTTU9PVEhfRElSfS8ke0JBU0V9Citkb25lCisKK0FBVF9GSUxFPWBmaW5kICR7T1JJR19ESVJ9IC1uYW1lICIqLmRhdCIgfCBncmVwIF9hYXRgCitmb3IgRklMRSBpbiAke0FBVF9GSUxFfQorZG8KKyAgICBlY2hvICRGSUxFCisgICAgQkFTRT0ke0ZJTEUjIyovfQorICAgIC4vc21vb3RoICR7T1JJR19ESVJ9LyR7QkFTRX0gNCAke1NNT09USF9ESVJ9LyR7QkFTRX0KK2RvbmUKKworCitBVEFfRklMRT1gZmluZCAke09SSUdfRElSfSAtbmFtZSAiKi5kYXQiIHwgZ3JlcCBfYXRhYAorZm9yIEZJTEUgaW4gJHtBVEFfRklMRX0KK2RvCisgICAgZWNobyAkRklMRQorICAgIEJBU0U9JHtGSUxFIyMqL30KKyAgICAuL3Ntb290aCAke09SSUdfRElSfS8ke0JBU0V9IDQgJHtTTU9PVEhfRElSfS8ke0JBU0V9Citkb25lCisKKyMjIyBubyBzbW9vdGhpbmcgZm9yIHRpbnl2ZWN0b3IgYW5kIG1hdHJpY2VzIGxpYnMKKworVElOWV9CTElUWl9GSUxFPWBmaW5kICR7T1JJR19ESVJ9IC1uYW1lICIqLmRhdCIgfCBncmVwIHRpbnlfYmxpdHpgCitmb3IgRklMRSBpbiAke1RJTllfQkxJVFpfRklMRX0KK2RvCisgICAgZWNobyAkRklMRQorICAgIEJBU0U9JHtGSUxFIyMqL30KKyAgICBjcCAke09SSUdfRElSfS8ke0JBU0V9ICR7U01PT1RIX0RJUn0vJHtCQVNFfQorZG9uZQorCitUVk1FVF9GSUxFPWBmaW5kICR7T1JJR19ESVJ9IC1uYW1lICIqLmRhdCIgfCBncmVwIHR2bWV0YAorZm9yIEZJTEUgaW4gJHtUVk1FVF9GSUxFfQorZG8KKyAgICBlY2hvICRGSUxFCisgICAgQkFTRT0ke0ZJTEUjIyovfQorICAgIGNwICR7T1JJR19ESVJ9LyR7QkFTRX0gJHtTTU9PVEhfRElSfS8ke0JBU0V9Citkb25lCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9iZW5jaC5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2JlbmNoLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNWMzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9iZW5jaC5oaApAQCAtMCwwICsxLDE2OCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGJlbmNoLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNiBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQkVOQ0hfSEgKKyNkZWZpbmUgQkVOQ0hfSEgKKworI2luY2x1ZGUgImJ0bC5oaCIKKyNpbmNsdWRlICJiZW5jaF9wYXJhbWV0ZXIuaGgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAic2l6ZV9saW5fbG9nLmhoIgorI2luY2x1ZGUgInh5X2ZpbGUuaGgiCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplci5oaCIKKy8vICNpbmNsdWRlICJ0aW1lcnMvbWl4ZWRfcGVyZl9hbmFseXplci5oaCIKKy8vICNpbmNsdWRlICJ0aW1lcnMveDg2X3BlcmZfYW5hbHl6ZXIuaGgiCisvLyAjaW5jbHVkZSAidGltZXJzL1NUTF9wZXJmX2FuYWx5emVyLmhoIgorI2lmZGVmIEhBVkVfTUtMCitleHRlcm4gIkMiIHZvaWQgY2JsYXNfc2F4cHkoY29uc3QgaW50LCBjb25zdCBmbG9hdCwgY29uc3QgZmxvYXQqLCBjb25zdCBpbnQsIGZsb2F0ICosIGNvbnN0IGludCk7CisjZW5kaWYKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwgY2xhc3MgQWN0aW9uPgorQlRMX0RPTlRfSU5MSU5FIHZvaWQgYmVuY2goIGludCBzaXplX21pbiwgaW50IHNpemVfbWF4LCBpbnQgbmJfcG9pbnQgKQoreworICBpZiAoQnRsQ29uZmlnOjpza2lwQWN0aW9uKEFjdGlvbjo6bmFtZSgpKSkKKyAgICByZXR1cm47CisKKyAgc3RyaW5nIGZpbGVuYW1lPSJiZW5jaF8iK0FjdGlvbjo6bmFtZSgpKyIuZGF0IjsKKworICBJTkZPUygic3RhcnRpbmcgIiA8PGZpbGVuYW1lKTsKKworICAvLyB1dGlsaXRpZXMKKworICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHRhYl9tZmxvcHMobmJfcG9pbnQpOworICBzdGQ6OnZlY3RvcjxpbnQ+IHRhYl9zaXplcyhuYl9wb2ludCk7CisKKyAgLy8gbWF0cmljZXMgYW5kIHZlY3RvciBzaXplIGNhbGN1bGF0aW9ucworICBzaXplX2xpbl9sb2cobmJfcG9pbnQsc2l6ZV9taW4sc2l6ZV9tYXgsdGFiX3NpemVzKTsKKworICBzdGQ6OnZlY3RvcjxpbnQ+IG9sZFNpemVzOworICBzdGQ6OnZlY3Rvcjxkb3VibGU+IG9sZEZsb3BzOworICBib29sIGhhc09sZFJlc3VsdHMgPSByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsIG9sZFNpemVzLCBvbGRGbG9wcywgdHJ1ZSk7CisgIGludCBvbGRpID0gb2xkU2l6ZXMuc2l6ZSgpIC0gMTsKKworICAvLyBsb29wIG9uIG1hdHJpeCBzaXplCisgIFBlcmZfQW5hbHl6ZXI8QWN0aW9uPiBwZXJmX2FjdGlvbjsKKyAgZm9yIChpbnQgaT1uYl9wb2ludC0xO2k+PTA7aS0tKQorICB7CisgICAgLy9JTkZPUygic2l6ZT0iIDw8dGFiX3NpemVzW2ldPDwiICAgKCI8PG5iX3BvaW50LWk8PCIvIjw8bmJfcG9pbnQ8PCIpIik7CisgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCAic2l6ZSA9ICIgPDwgdGFiX3NpemVzW2ldIDw8ICIgICIgPDwgc3RkOjpmbHVzaDsKKworICAgIEJUTF9ESVNBQkxFX1NTRV9FWENFUFRJT05TKCk7CisgICAgI2lmZGVmIEhBVkVfTUtMCisgICAgeworICAgICAgZmxvYXQgZHVtbXk7CisgICAgICBjYmxhc19zYXhweSgxLDAsJmR1bW15LDEsJmR1bW15LDEpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHRhYl9tZmxvcHNbaV0gPSBwZXJmX2FjdGlvbi5ldmFsX21mbG9wcyh0YWJfc2l6ZXNbaV0pOworICAgIHN0ZDo6Y291dCA8PCB0YWJfbWZsb3BzW2ldOworICAgIAorICAgIGlmIChoYXNPbGRSZXN1bHRzKQorICAgIHsKKyAgICAgIHdoaWxlIChvbGRpPj0wICYmIG9sZFNpemVzW29sZGldPnRhYl9zaXplc1tpXSkKKyAgICAgICAgLS1vbGRpOworICAgICAgaWYgKG9sZGk+PTAgJiYgb2xkU2l6ZXNbb2xkaV09PXRhYl9zaXplc1tpXSkKKyAgICAgIHsKKyAgICAgICAgaWYgKG9sZEZsb3BzW29sZGldPHRhYl9tZmxvcHNbaV0pCisgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdCA+ICI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0IDwgIjsKKyAgICAgICAgc3RkOjpjb3V0IDw8IG9sZEZsb3BzW29sZGldOworICAgICAgfQorICAgICAgLS1vbGRpOworICAgIH0KKyAgICBzdGQ6OmNvdXQgPDwgIiBNRmxvcHMgICAgKCIgPDwgbmJfcG9pbnQtaSA8PCAiLyIgPDwgbmJfcG9pbnQgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIGlmICghQnRsQ29uZmlnOjpJbnN0YW5jZS5vdmVyd3JpdGVSZXN1bHRzKQorICB7CisgICAgaWYgKGhhc09sZFJlc3VsdHMpCisgICAgeworICAgICAgLy8gbWVyZ2UgdGhlIHR3byBkYXRhCisgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IG5ld1NpemVzOworICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBuZXdGbG9wczsKKyAgICAgIGludCBpPTA7CisgICAgICBpbnQgaj0wOworICAgICAgd2hpbGUgKGk8dGFiX3NpemVzLnNpemUoKSAmJiBqPG9sZFNpemVzLnNpemUoKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHRhYl9zaXplc1tpXSA9PSBvbGRTaXplc1tqXSkKKyAgICAgICAgeworICAgICAgICAgIG5ld1NpemVzLnB1c2hfYmFjayh0YWJfc2l6ZXNbaV0pOworICAgICAgICAgIG5ld0Zsb3BzLnB1c2hfYmFjayhzdGQ6Om1heCh0YWJfbWZsb3BzW2ldLCBvbGRGbG9wc1tqXSkpOworICAgICAgICAgICsraTsKKyAgICAgICAgICArK2o7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGFiX3NpemVzW2ldIDwgb2xkU2l6ZXNbal0pCisgICAgICAgIHsKKyAgICAgICAgICBuZXdTaXplcy5wdXNoX2JhY2sodGFiX3NpemVzW2ldKTsKKyAgICAgICAgICBuZXdGbG9wcy5wdXNoX2JhY2sodGFiX21mbG9wc1tpXSk7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG5ld1NpemVzLnB1c2hfYmFjayhvbGRTaXplc1tqXSk7CisgICAgICAgICAgbmV3RmxvcHMucHVzaF9iYWNrKG9sZEZsb3BzW2pdKTsKKyAgICAgICAgICArK2o7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlIChpPHRhYl9zaXplcy5zaXplKCkpCisgICAgICB7CisgICAgICAgIG5ld1NpemVzLnB1c2hfYmFjayh0YWJfc2l6ZXNbaV0pOworICAgICAgICBuZXdGbG9wcy5wdXNoX2JhY2sodGFiX21mbG9wc1tpXSk7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChqPG9sZFNpemVzLnNpemUoKSkKKyAgICAgIHsKKyAgICAgICAgbmV3U2l6ZXMucHVzaF9iYWNrKG9sZFNpemVzW2pdKTsKKyAgICAgICAgbmV3RmxvcHMucHVzaF9iYWNrKG9sZEZsb3BzW2pdKTsKKyAgICAgICAgKytqOworICAgICAgfQorICAgICAgdGFiX21mbG9wcyA9IG5ld0Zsb3BzOworICAgICAgdGFiX3NpemVzID0gbmV3U2l6ZXM7CisgICAgfQorICB9CisKKyAgLy8gZHVtcCB0aGUgcmVzdWx0IGluIGEgZmlsZSAgOgorICBkdW1wX3h5X2ZpbGUodGFiX3NpemVzLHRhYl9tZmxvcHMsZmlsZW5hbWUpOworCit9CisKKy8vIGRlZmF1bHQgUGVyZiBBbmFseXplcgorCit0ZW1wbGF0ZSA8Y2xhc3MgQWN0aW9uPgorQlRMX0RPTlRfSU5MSU5FIHZvaWQgYmVuY2goIGludCBzaXplX21pbiwgaW50IHNpemVfbWF4LCBpbnQgbmJfcG9pbnQgKXsKKworICAvLyBpZiB0aGUgcmR0c2MgaXMgbm90IGF2YWlsYWJsZSA6CisgIGJlbmNoPFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbixzaXplX21heCxuYl9wb2ludCk7CisgIC8vIGlmIHRoZSByZHRzYyBpcyBhdmFpbGFibGUgOgorLy8gICAgYmVuY2g8TWl4ZWRfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKKworCisgIC8vIE9ubHkgZm9yIHNtYWxsIHByb2JsZW0gc2l6ZS4gT3RoZXJ3aXplIGl0IHdpbGwgYmUgdG9vIGxvbmcKKy8vICAgYmVuY2g8WDg2X1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbixzaXplX21heCxuYl9wb2ludCk7CisvLyAgIGJlbmNoPFNUTF9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvYmVuY2hfcGFyYW1ldGVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvYmVuY2hfcGFyYW1ldGVyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzU1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9iZW5jaF9wYXJhbWV0ZXIuaGgKQEAgLTAsMCArMSw1MyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGJlbmNoX3BhcmFtZXRlci5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTYgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEJFTkNIX1BBUkFNRVRFUl9ISAorI2RlZmluZSBCRU5DSF9QQVJBTUVURVJfSEgKKworLy8gbWluaW1hbCB0aW1lIGZvciBlYWNoIG1lYXN1cmVtZW50CisjZGVmaW5lIFJFQUxfVFlQRSBmbG9hdAorLy8gbWluaW1hbCB0aW1lIGZvciBlYWNoIG1lYXN1cmVtZW50CisjZGVmaW5lIE1JTl9USU1FIDAuMgorLy8gbmIgb2YgcG9pbnQgb24gYmVuY2ggY3VydmVzCisjZGVmaW5lIE5CX1BPSU5UIDEwMAorLy8gbWluIHZlY3RvciBzaXplIGZvciBheHB5IGJlbmNoCisjZGVmaW5lIE1JTl9BWFBZIDUKKy8vIG1heCB2ZWN0b3Igc2l6ZSBmb3IgYXhweSBiZW5jaAorI2RlZmluZSBNQVhfQVhQWSAxMDAwMDAwCisvLyBtaW4gbWF0cml4IHNpemUgZm9yIG1hdHJpeCB2ZWN0b3IgcHJvZHVjdCBiZW5jaAorI2RlZmluZSBNSU5fTVYgNQorLy8gbWF4IG1hdHJpeCBzaXplIGZvciBtYXRyaXggdmVjdG9yIHByb2R1Y3QgYmVuY2gKKyNkZWZpbmUgTUFYX01WIDMwMDAKKy8vIG1pbiBtYXRyaXggc2l6ZSBmb3IgbWF0cml4IG1hdHJpeCBwcm9kdWN0IGJlbmNoCisjZGVmaW5lIE1JTl9NTSA1CisvLyBtYXggbWF0cml4IHNpemUgZm9yIG1hdHJpeCBtYXRyaXggcHJvZHVjdCBiZW5jaAorI2RlZmluZSBNQVhfTU0gTUFYX01WCisvLyBtaW4gbWF0cml4IHNpemUgZm9yIExVIGJlbmNoCisjZGVmaW5lIE1JTl9MVSA1CisvLyBtYXggbWF0cml4IHNpemUgZm9yIExVIGJlbmNoCisjZGVmaW5lIE1BWF9MVSAzMDAwCisvLyBtYXggc2l6ZSBmb3IgdGlueSB2ZWN0b3IgYW5kIG1hdHJpeAorI2RlZmluZSBUSU5ZX01WX01BWF9TSVpFIDE2CisvLyBkZWZhdWx0IG5iX3NhbXBsZSBmb3IgeDg2IHRpbWVyCisjZGVmaW5lIERFRkFVTFRfTkJfU0FNUExFIDEwMDAKKworLy8gaG93IG1hbnkgdGltZXMgd2UgcnVuIGEgc2luZ2xlIGJlbmNoIChrZWVwIHRoZSBiZXN0IHBlcmYpCisjZGVmaW5lIERFRkFVTFRfTkJfVFJJRVMgMworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2J0bC5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2J0bC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWE4OGZmCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvYnRsLmhoCkBAIC0wLDAgKzEsMjQ3IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYnRsLmhoCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIEJUTF9ISAorI2RlZmluZSBCVExfSEgKKworI2luY2x1ZGUgImJlbmNoX3BhcmFtZXRlci5oaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKworI2lmIChkZWZpbmVkIF9fR05VQ19fKQorI2RlZmluZSBCVExfQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkgaW5saW5lCisjZWxzZQorI2RlZmluZSBCVExfQUxXQVlTX0lOTElORSBpbmxpbmUKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19HTlVDX18pCisjZGVmaW5lIEJUTF9ET05UX0lOTElORSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCisjZWxzZQorI2RlZmluZSBCVExfRE9OVF9JTkxJTkUKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19HTlVDX18pCisjZGVmaW5lIEJUTF9BU01fQ09NTUVOVChYKSAgYXNtKCIjIiBYKQorI2Vsc2UKKyNkZWZpbmUgQlRMX0FTTV9DT01NRU5UKFgpCisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9fR05VQ19fKSAmJiAoIWRlZmluZWQgX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19wb3dlcnBjX18pCisjZGVmaW5lIEJUTF9ESVNBQkxFX1NTRV9FWENFUFRJT05TKCkgIHsgXAorICBpbnQgYXV4OyBcCisgIGFzbSggXAorICAic3RteGNzciAgICVbYXV4XSAgICAgICAgICAgXG5cdCIgXAorICAib3JsICAgICAgICQzMjgzMiwgJVthdXhdICAgXG5cdCIgXAorICAibGRteGNzciAgICVbYXV4XSAgICAgICAgICAgXG5cdCIgXAorICA6IDogW2F1eF0gIm0iIChhdXgpKTsgXAorfQorI2Vsc2UKKyNkZWZpbmUgQlRMX0RJU0FCTEVfU1NFX0VYQ0VQVElPTlMoKQorI2VuZGlmCisKKy8qKiBFbmhhbmNlZCBzdGQ6OnN0cmluZworKi8KK2NsYXNzIEJ0bFN0cmluZyA6IHB1YmxpYyBzdGQ6OnN0cmluZworeworcHVibGljOgorICAgIEJ0bFN0cmluZygpIDogc3RkOjpzdHJpbmcoKSB7fQorICAgIEJ0bFN0cmluZyhjb25zdCBCdGxTdHJpbmcmIHN0cikgOiBzdGQ6OnN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnN0cmluZyY+KHN0cikpIHt9CisgICAgQnRsU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIDogc3RkOjpzdHJpbmcoc3RyKSB7fQorICAgIEJ0bFN0cmluZyhjb25zdCBjaGFyKiBzdHIpIDogc3RkOjpzdHJpbmcoc3RyKSB7fQorCisgICAgb3BlcmF0b3IgY29uc3QgY2hhciogKCkgY29uc3QgeyByZXR1cm4gY19zdHIoKTsgfQorCisgICAgdm9pZCB0cmltKCBib29sIGxlZnQgPSB0cnVlLCBib29sIHJpZ2h0ID0gdHJ1ZSApCisgICAgeworICAgICAgICBpbnQgbHNwYWNlcywgcnNwYWNlcywgbGVuID0gbGVuZ3RoKCksIGk7CisgICAgICAgIGxzcGFjZXMgPSByc3BhY2VzID0gMDsKKworICAgICAgICBpZiAoIGxlZnQgKQorICAgICAgICAgICAgZm9yIChpPTA7IGk8bGVuICYmIChhdChpKT09JyAnfHxhdChpKT09J1x0J3x8YXQoaSk9PSdccid8fGF0KGkpPT0nXG4nKTsgKytsc3BhY2VzLCsraSk7CisKKyAgICAgICAgaWYgKCByaWdodCAmJiBsc3BhY2VzIDwgbGVuICkKKyAgICAgICAgICAgIGZvcihpPWxlbi0xOyBpPj0wICYmIChhdChpKT09JyAnfHxhdChpKT09J1x0J3x8YXQoaSk9PSdccid8fGF0KGkpPT0nXG4nKTsgcnNwYWNlcysrLGktLSk7CisKKyAgICAgICAgKnRoaXMgPSBzdWJzdHIobHNwYWNlcywgbGVuLWxzcGFjZXMtcnNwYWNlcyk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QnRsU3RyaW5nPiBzcGxpdCggY29uc3QgQnRsU3RyaW5nJiBkZWxpbXMgPSAiXHRcbiAiKSBjb25zdAorICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QnRsU3RyaW5nPiByZXQ7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1TcGxpdHMgPSAwOworICAgICAgICBzaXplX3Qgc3RhcnQsIHBvczsKKyAgICAgICAgc3RhcnQgPSAwOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBwb3MgPSBmaW5kX2ZpcnN0X29mKGRlbGltcywgc3RhcnQpOworICAgICAgICAgICAgaWYgKHBvcyA9PSBzdGFydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQucHVzaF9iYWNrKCIiKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHBvcyArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwb3MgPT0gbnBvcykKKyAgICAgICAgICAgICAgICByZXQucHVzaF9iYWNrKCBzdWJzdHIoc3RhcnQpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0LnB1c2hfYmFjayggc3Vic3RyKHN0YXJ0LCBwb3MgLSBzdGFydCkgKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHBvcyArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3N0YXJ0ID0gZmluZF9maXJzdF9ub3Rfb2YoZGVsaW1zLCBzdGFydCk7CisgICAgICAgICAgICArK251bVNwbGl0czsKKyAgICAgICAgfSB3aGlsZSAocG9zICE9IG5wb3MpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGJvb2wgZW5kc1dpdGgoY29uc3QgQnRsU3RyaW5nJiBzdHIpIGNvbnN0CisgICAgeworICAgICAgICBpZihzdHIuc2l6ZSgpPnRoaXMtPnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRoaXMtPnN1YnN0cih0aGlzLT5zaXplKCktc3RyLnNpemUoKSxzdHIuc2l6ZSgpKSA9PSBzdHI7CisgICAgfQorICAgIGJvb2wgY29udGFpbnMoY29uc3QgQnRsU3RyaW5nJiBzdHIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+ZmluZChzdHIpPHRoaXMtPnNpemUoKTsKKyAgICB9CisgICAgYm9vbCBiZWdpbnNXaXRoKGNvbnN0IEJ0bFN0cmluZyYgc3RyKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYoc3RyLnNpemUoKT50aGlzLT5zaXplKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLT5zdWJzdHIoMCxzdHIuc2l6ZSgpKSA9PSBzdHI7CisgICAgfQorCisgICAgQnRsU3RyaW5nIHRvTG93ZXJDYXNlKCB2b2lkICkKKyAgICB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKGJlZ2luKCksIGVuZCgpLCBiZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQoKikoaW50KT4oOjp0b2xvd2VyKSApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIEJ0bFN0cmluZyB0b1VwcGVyQ2FzZSggdm9pZCApCisgICAgeworICAgICAgICBzdGQ6OnRyYW5zZm9ybShiZWdpbigpLCBlbmQoKSwgYmVnaW4oKSwgc3RhdGljX2Nhc3Q8aW50KCopKGludCk+KDo6dG91cHBlcikgKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKiBDYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24uCisgICAgKi8KKyAgICBib29sIGlzRXF1aXYoY29uc3QgQnRsU3RyaW5nJiBzdHIpIGNvbnN0CisgICAgeworICAgICAgICBCdGxTdHJpbmcgc3RyMCA9ICp0aGlzOworICAgICAgICBzdHIwLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIEJ0bFN0cmluZyBzdHIxID0gc3RyOworICAgICAgICBzdHIxLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIHJldHVybiBzdHIwID09IHN0cjE7CisgICAgfQorCisgICAgLyoqIERlY29tcG9zZSB0aGUgY3VycmVudCBzdHJpbmcgYXMgYSBwYXRoIGFuZCBhIGZpbGUuCisgICAgICAgIEZvciBpbnN0YW5jZTogImRpcjEvZGlyMi9maWxlLmV4dCIgbGVhZHMgdG8gcGF0aD0iZGlyMS9kaXIyLyIgYW5kIGZpbGVuYW1lPSJmaWxlLmV4dCIKKyAgICAqLworICAgIHZvaWQgZGVjb21wb3NlUGF0aEFuZEZpbGUoQnRsU3RyaW5nJiBwYXRoLCBCdGxTdHJpbmcmIGZpbGVuYW1lKSBjb25zdAorICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QnRsU3RyaW5nPiBlbGVtZW50cyA9IHRoaXMtPnNwbGl0KCIvXFwiKTsKKyAgICAgICAgcGF0aCA9ICIiOworICAgICAgICBmaWxlbmFtZSA9IGVsZW1lbnRzLmJhY2soKTsKKyAgICAgICAgZWxlbWVudHMucG9wX2JhY2soKTsKKyAgICAgICAgaWYgKHRoaXMtPmF0KDApPT0nLycpCisgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGVsZW1lbnRzLnNpemUoKSA7ICsraSkKKyAgICAgICAgICAgIHBhdGggKz0gZWxlbWVudHNbaV0gKyAiLyI7CisgICAgfQorfTsKKworY2xhc3MgQnRsQ29uZmlnCit7CitwdWJsaWM6CisgIEJ0bENvbmZpZygpCisgICAgOiBvdmVyd3JpdGVSZXN1bHRzKGZhbHNlKSwgY2hlY2tSZXN1bHRzKHRydWUpLCByZWFsY2xvY2soZmFsc2UpLCB0cmllcyhERUZBVUxUX05CX1RSSUVTKQorICB7CisgICAgY2hhciAqIF9jb25maWc7CisgICAgX2NvbmZpZyA9IGdldGVudiAoIkJUTF9DT05GSUciKTsKKyAgICBpZiAoX2NvbmZpZyE9TlVMTCkKKyAgICB7CisgICAgICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IGNvbmZpZyA9IEJ0bFN0cmluZyhfY29uZmlnKS5zcGxpdCgiIFx0XG4iKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpPGNvbmZpZy5zaXplKCk7IGkrKykKKyAgICAgIHsKKyAgICAgICAgaWYgKGNvbmZpZ1tpXS5iZWdpbnNXaXRoKCItYSIpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkrMT09Y29uZmlnLnNpemUoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgImVycm9yIHByb2Nlc3Npbmcgb3B0aW9uOiAiIDw8IGNvbmZpZ1tpXSA8PCAiXG4iOworICAgICAgICAgICAgZXhpdCgyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgSW5zdGFuY2UubV9zZWxlY3RlZEFjdGlvbk5hbWVzID0gY29uZmlnW2krMV0uc3BsaXQoIjoiKTsKKworICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjb25maWdbaV0uYmVnaW5zV2l0aCgiLXQiKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChpKzE9PWNvbmZpZy5zaXplKCkpCisgICAgICAgICAgeworICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJlcnJvciBwcm9jZXNzaW5nIG9wdGlvbjogIiA8PCBjb25maWdbaV0gPDwgIlxuIjsKKyAgICAgICAgICAgIGV4aXQoMik7CisgICAgICAgICAgfQorICAgICAgICAgIEluc3RhbmNlLnRyaWVzID0gYXRvaShjb25maWdbaSsxXS5jX3N0cigpKTsKKworICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjb25maWdbaV0uYmVnaW5zV2l0aCgiLS1vdmVyd3JpdGUiKSkKKyAgICAgICAgeworICAgICAgICAgIEluc3RhbmNlLm92ZXJ3cml0ZVJlc3VsdHMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNvbmZpZ1tpXS5iZWdpbnNXaXRoKCItLW5vY2hlY2siKSkKKyAgICAgICAgeworICAgICAgICAgIEluc3RhbmNlLmNoZWNrUmVzdWx0cyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNvbmZpZ1tpXS5iZWdpbnNXaXRoKCItLXJlYWwiKSkKKyAgICAgICAgeworICAgICAgICAgIEluc3RhbmNlLnJlYWxjbG9jayA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBCVExfRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpOworICB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHN0YXRpYyBib29sIHNraXBBY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lKQorICB7CisgICAgaWYgKEluc3RhbmNlLm1fc2VsZWN0ZWRBY3Rpb25OYW1lcy5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQnRsU3RyaW5nIG5hbWUoX25hbWUpOworICAgIGZvciAoaW50IGk9MDsgaTxJbnN0YW5jZS5tX3NlbGVjdGVkQWN0aW9uTmFtZXMuc2l6ZSgpOyArK2kpCisgICAgICBpZiAobmFtZS5jb250YWlucyhJbnN0YW5jZS5tX3NlbGVjdGVkQWN0aW9uTmFtZXNbaV0pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN0YXRpYyBCdGxDb25maWcgSW5zdGFuY2U7CisgIGJvb2wgb3ZlcndyaXRlUmVzdWx0czsKKyAgYm9vbCBjaGVja1Jlc3VsdHM7CisgIGJvb2wgcmVhbGNsb2NrOworICBpbnQgdHJpZXM7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjp2ZWN0b3I8QnRsU3RyaW5nPiBtX3NlbGVjdGVkQWN0aW9uTmFtZXM7Cit9OworCisjZGVmaW5lIEJUTF9NQUlOIFwKKyAgQnRsQ29uZmlnIEJ0bENvbmZpZzo6SW5zdGFuY2UKKworI2VuZGlmIC8vIEJUTF9ISApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X2Z1bmN0aW9uLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X2Z1bmN0aW9uLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2JkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfZnVuY3Rpb24uaGgKQEAgLTAsMCArMSw1NCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGluaXRfZnVuY3Rpb24uaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTggQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisjaWZuZGVmIElOSVRfRlVOQ1RJT05fSEgKKyNkZWZpbmUgSU5JVF9GVU5DVElPTl9ISAorCitkb3VibGUgc2ltcGxlX2Z1bmN0aW9uKGludCBpbmRleCkKK3sKKyAgcmV0dXJuIGluZGV4OworfQorCitkb3VibGUgc2ltcGxlX2Z1bmN0aW9uKGludCBpbmRleF9pLCBpbnQgaW5kZXhfaikKK3sKKyAgcmV0dXJuIGluZGV4X2kraW5kZXhfajsKK30KKworZG91YmxlIHBzZXVkb19yYW5kb20oaW50IGluZGV4KQoreworICByZXR1cm4gc3RkOjpyYW5kKCkvZG91YmxlKFJBTkRfTUFYKTsKK30KKworZG91YmxlIHBzZXVkb19yYW5kb20oaW50IGluZGV4X2ksIGludCBpbmRleF9qKQoreworICByZXR1cm4gc3RkOjpyYW5kKCkvZG91YmxlKFJBTkRfTUFYKTsKK30KKworCitkb3VibGUgbnVsbF9mdW5jdGlvbihpbnQgaW5kZXgpCit7CisgIHJldHVybiAwLjA7Cit9CisKK2RvdWJsZSBudWxsX2Z1bmN0aW9uKGludCBpbmRleF9pLCBpbnQgaW5kZXhfaikKK3sKKyAgcmV0dXJuIDAuMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfbWF0cml4LmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X21hdHJpeC5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2NiZDIwCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X21hdHJpeC5oaApAQCAtMCwwICsxLDY0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgaW5pdF9tYXRyaXguaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBJTklUX01BVFJJWF9ISAorI2RlZmluZSBJTklUX01BVFJJWF9ISAorCisvLyBUaGUgVmVjdG9yIGNsYXNzIG11c3Qgc2F0aXNmeSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgU1RMIHZlY3RvciBjb25jZXB0IDoKKy8vICAgICAgICAgICAgcmVzaXplKCkgbWV0aG9kCisvLyAgICAgICAgICAgIFtdIG9wZXJhdG9yIGZvciBzZXR0aW5nIGVsZW1lbnQKKy8vICAgICAgICAgICAgdmFsdWVfdHlwZSBkZWZpbmVkCit0ZW1wbGF0ZTxkb3VibGUgaW5pdF9mdW5jdGlvbihpbnQsaW50KSwgY2xhc3MgVmVjdG9yPgorQlRMX0RPTlRfSU5MSU5FIHZvaWQgaW5pdF9yb3coVmVjdG9yICYgWCwgaW50IHNpemUsIGludCByb3cpeworCisgIFgucmVzaXplKHNpemUpOworCisgIGZvciAoaW50IGo9MDtqPFguc2l6ZSgpO2orKyl7CisgICAgWFtqXT10eXBlbmFtZSBWZWN0b3I6OnZhbHVlX3R5cGUoaW5pdF9mdW5jdGlvbihyb3csaikpOworICB9Cit9CisKKworLy8gTWF0cml4IGlzIGEgVmVjdG9yIG9mIFZlY3RvcgorLy8gVGhlIE1hdHJpeCBjbGFzcyBtdXN0IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIFNUTCB2ZWN0b3IgY29uY2VwdCA6CisvLyAgICAgICAgICAgIHJlc2l6ZSgpIG1ldGhvZAorLy8gICAgICAgICAgICBbXSBvcGVyYXRvciBmb3Igc2V0dGluZyByb3dzCit0ZW1wbGF0ZTxkb3VibGUgaW5pdF9mdW5jdGlvbihpbnQsaW50KSxjbGFzcyBWZWN0b3I+CitCVExfRE9OVF9JTkxJTkUgdm9pZCBpbml0X21hdHJpeChWZWN0b3IgJiAgQSwgaW50IHNpemUpeworICBBLnJlc2l6ZShzaXplKTsKKyAgZm9yIChpbnQgcm93PTA7IHJvdzxBLnNpemUoKSA7IHJvdysrKXsKKyAgICBpbml0X3Jvdzxpbml0X2Z1bmN0aW9uPihBW3Jvd10sc2l6ZSxyb3cpOworICB9Cit9CisKK3RlbXBsYXRlPGRvdWJsZSBpbml0X2Z1bmN0aW9uKGludCxpbnQpLGNsYXNzIE1hdHJpeD4KK0JUTF9ET05UX0lOTElORSB2b2lkIGluaXRfbWF0cml4X3N5bW0oTWF0cml4JiAgQSwgaW50IHNpemUpeworICBBLnJlc2l6ZShzaXplKTsKKyAgZm9yIChpbnQgcm93PTA7IHJvdzxBLnNpemUoKSA7IHJvdysrKQorICAgIEFbcm93XS5yZXNpemUoc2l6ZSk7CisgIGZvciAoaW50IHJvdz0wOyByb3c8QS5zaXplKCkgOyByb3crKyl7CisgICAgQVtyb3ddW3Jvd10gPSBpbml0X2Z1bmN0aW9uKHJvdyxyb3cpOworICAgIGZvciAoaW50IGNvbD0wOyBjb2w8cm93IDsgY29sKyspeworICAgICAgZG91YmxlIHggPSBpbml0X2Z1bmN0aW9uKHJvdyxjb2wpOworICAgICAgQVtyb3ddW2NvbF0gPSBBW2NvbF1bcm93XSA9IHg7CisgICAgfQorICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X3ZlY3Rvci5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2luaXQvaW5pdF92ZWN0b3IuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhZjBjOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2luaXQvaW5pdF92ZWN0b3IuaGgKQEAgLTAsMCArMSwzNyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGluaXRfdmVjdG9yLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgSU5JVF9WRUNUT1JfSEgKKyNkZWZpbmUgSU5JVF9WRUNUT1JfSEgKKworLy8gVGhlIFZlY3RvciBjbGFzcyBtdXN0IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIFNUTCB2ZWN0b3IgY29uY2VwdCA6CisvLyAgICAgICAgICAgIHJlc2l6ZSgpIG1ldGhvZAorLy8gICAgICAgICAgICBbXSBvcGVyYXRvciBmb3Igc2V0dGluZyBlbGVtZW50CisvLyAgICAgICAgICAgIHZhbHVlX3R5cGUgZGVmaW5lZAordGVtcGxhdGU8ZG91YmxlIGluaXRfZnVuY3Rpb24oaW50KSwgY2xhc3MgVmVjdG9yPgordm9pZCBpbml0X3ZlY3RvcihWZWN0b3IgJiBYLCBpbnQgc2l6ZSl7CisKKyAgWC5yZXNpemUoc2l6ZSk7CisKKyAgZm9yIChpbnQgaT0wO2k8WC5zaXplKCk7aSsrKXsKKyAgICBYW2ldPXR5cGVuYW1lIFZlY3Rvcjo6dmFsdWVfdHlwZShpbml0X2Z1bmN0aW9uKGkpKTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9iZW5jaF9zdGF0aWMuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9zdGF0aWMvYmVuY2hfc3RhdGljLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYjU1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9zdGF0aWMvYmVuY2hfc3RhdGljLmhoCkBAIC0wLDAgKzEsODAgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBiZW5jaF9zdGF0aWMuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE2IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBCRU5DSF9TVEFUSUNfSEgKKyNkZWZpbmUgQkVOQ0hfU1RBVElDX0hICisKKyNpbmNsdWRlICJidGwuaGgiCisjaW5jbHVkZSAiYmVuY2hfcGFyYW1ldGVyLmhoIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgInh5X2ZpbGUuaGgiCisjaW5jbHVkZSAic3RhdGljL3N0YXRpY19zaXplX2dlbmVyYXRvci5oaCIKKyNpbmNsdWRlICJ0aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplci5oaCIKKy8vICNpbmNsdWRlICJ0aW1lcnMvbWl4ZWRfcGVyZl9hbmFseXplci5oaCIKKy8vICNpbmNsdWRlICJ0aW1lcnMveDg2X3BlcmZfYW5hbHl6ZXIuaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKwordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBQZXJmX0FuYWx5emVyLCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQWN0aW9uLCB0ZW1wbGF0ZTxjbGFzcyxpbnQ+IGNsYXNzIEludGVyZmFjZT4KK0JUTF9ET05UX0lOTElORSAgdm9pZCBiZW5jaF9zdGF0aWModm9pZCkKK3sKKyAgaWYgKEJ0bENvbmZpZzo6c2tpcEFjdGlvbihBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSwxMD4gPjo6bmFtZSgpKSkKKyAgICByZXR1cm47CisKKyAgc3RyaW5nIGZpbGVuYW1lID0gImJlbmNoXyIgKyBBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSwxMD4gPjo6bmFtZSgpICsgIi5kYXQiOworCisgIElORk9TKCJzdGFydGluZyAiIDw8IGZpbGVuYW1lKTsKKworICBjb25zdCBpbnQgbWF4X3NpemUgPSBUSU5ZX01WX01BWF9TSVpFOworCisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdGFiX21mbG9wczsKKyAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB0YWJfc2l6ZXM7CisKKyAgc3RhdGljX3NpemVfZ2VuZXJhdG9yPG1heF9zaXplLFBlcmZfQW5hbHl6ZXIsQWN0aW9uLEludGVyZmFjZT46OmdvKHRhYl9zaXplcyx0YWJfbWZsb3BzKTsKKworICBkdW1wX3h5X2ZpbGUodGFiX3NpemVzLHRhYl9tZmxvcHMsZmlsZW5hbWUpOworfQorCisvLyBkZWZhdWx0IFBlcmYgQW5hbHl6ZXIKK3RlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQWN0aW9uLCB0ZW1wbGF0ZTxjbGFzcyxpbnQ+IGNsYXNzIEludGVyZmFjZT4KK0JUTF9ET05UX0lOTElORSAgdm9pZCBiZW5jaF9zdGF0aWModm9pZCkKK3sKKyAgYmVuY2hfc3RhdGljPFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsQWN0aW9uLEludGVyZmFjZT4oKTsKKyAgLy9iZW5jaF9zdGF0aWM8TWl4ZWRfUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPigpOworICAvL2JlbmNoX3N0YXRpYzxYODZfUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPigpOworfQorCisjZW5kaWYKKworCisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9pbnRlbF9iZW5jaF9maXhlZF9zaXplLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvc3RhdGljL2ludGVsX2JlbmNoX2ZpeGVkX3NpemUuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlZGNiYwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9pbnRlbF9iZW5jaF9maXhlZF9zaXplLmhoCkBAIC0wLDAgKzEsNjYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBpbnRlbF9iZW5jaF9maXhlZF9zaXplLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzcgQ0VUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgX0JFTkNIX0ZJWEVEX1NJWkVfSEhfCisjZGVmaW5lIF9CRU5DSF9GSVhFRF9TSVpFX0hIXworCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiZnVuY3Rpb25fdGltZS5oaCIKKwordGVtcGxhdGUgPGNsYXNzIEFjdGlvbj4KK2RvdWJsZSBiZW5jaF9maXhlZF9zaXplKGludCBzaXplLCB1bnNpZ25lZCBsb25nIGxvbmcgICYgbmJfY2FsYyx1bnNpZ25lZCBsb25nIGxvbmcgJiBuYl9pbml0KQoreworICAKKyAgQWN0aW9uIGFjdGlvbihzaXplKTsKKyAgCisgIGRvdWJsZSB0aW1lX2Jhc2VsaW5lPXRpbWVfaW5pdChuYl9pbml0LGFjdGlvbik7CisKKyAgd2hpbGUgKHRpbWVfYmFzZWxpbmUgPCBNSU5fVElNRSkgeworCisgICAgLy9JTkZPUygibmJfaW5pdD0iPDxuYl9pbml0KTsKKyAgICAvL0lORk9TKCJ0aW1lX2Jhc2VsaW5lPSI8PHRpbWVfYmFzZWxpbmUpOworICAgIG5iX2luaXQqPTI7CisgICAgdGltZV9iYXNlbGluZT10aW1lX2luaXQobmJfaW5pdCxhY3Rpb24pOworICB9CisgIAorICB0aW1lX2Jhc2VsaW5lPXRpbWVfYmFzZWxpbmUvKGRvdWJsZShuYl9pbml0KSk7CisgIAorICBkb3VibGUgdGltZV9hY3Rpb249dGltZV9jYWxjdWxhdGUobmJfY2FsYyxhY3Rpb24pOworICAKKyAgd2hpbGUgKHRpbWVfYWN0aW9uIDwgTUlOX1RJTUUpIHsKKyAgICAKKyAgICBuYl9jYWxjKj0yOworICAgIHRpbWVfYWN0aW9uPXRpbWVfY2FsY3VsYXRlKG5iX2NhbGMsYWN0aW9uKTsKKyAgfQorCisgIElORk9TKCJuYl9pbml0PSI8PG5iX2luaXQpOworICBJTkZPUygibmJfY2FsYz0iPDxuYl9jYWxjKTsKKyAgCisgIAorICB0aW1lX2FjdGlvbj10aW1lX2FjdGlvbi8oZG91YmxlKG5iX2NhbGMpKTsKKyAgCisgIGFjdGlvbi5jaGVja19yZXN1bHQoKTsKKyAgCisgIHRpbWVfYWN0aW9uPXRpbWVfYWN0aW9uLXRpbWVfYmFzZWxpbmU7CisKKyAgcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkvKHRpbWVfYWN0aW9uKjEwMDAwMDAuMCk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9zdGF0aWMvc3RhdGljX3NpemVfZ2VuZXJhdG9yLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvc3RhdGljL3N0YXRpY19zaXplX2dlbmVyYXRvci5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDAyZGYzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvc3RhdGljL3N0YXRpY19zaXplX2dlbmVyYXRvci5oaApAQCAtMCwwICsxLDU3IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgc3RhdGljX3NpemVfZ2VuZXJhdG9yLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzYgQ0VUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgX1NUQVRJQ19TSVpFX0dFTkVSQVRPUl9ISAorI2RlZmluZSBfU1RBVElDX1NJWkVfR0VORVJBVE9SX0hICisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvL3JlY3Vyc2l2ZSBnZW5lcmF0aW9uIG9mIHN0YXRpY2FsbHkgZGVmaW5lZCBtYXRyaXggYW5kIHZlY3RvciBzaXplcworCit0ZW1wbGF0ZSA8aW50IFNJWkUsdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBBY3Rpb24sIHRlbXBsYXRlPGNsYXNzLGludD4gY2xhc3MgSW50ZXJmYWNlPiAKK3N0cnVjdCBzdGF0aWNfc2l6ZV9nZW5lcmF0b3J7CisgIHN0YXRpYyB2b2lkIGdvKHZlY3Rvcjxkb3VibGU+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpCisgIHsKKyAgICB0YWJfc2l6ZXMucHVzaF9iYWNrKFNJWkUpOworICAgIHN0ZDo6Y291dCA8PCB0YWJfc2l6ZXMuYmFjaygpIDw8ICIgXHQiIDw8IHN0ZDo6Zmx1c2g7CisgICAgUGVyZl9BbmFseXplcjxBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSxTSVpFPiA+ID4gcGVyZl9hY3Rpb247CisgICAgdGFiX21mbG9wcy5wdXNoX2JhY2socGVyZl9hY3Rpb24uZXZhbF9tZmxvcHMoU0laRSkpOworICAgIHN0ZDo6Y291dCA8PCB0YWJfbWZsb3BzLmJhY2soKSA8PCAiIE1GbG9wcyIgPDwgc3RkOjplbmRsOworICAgIHN0YXRpY19zaXplX2dlbmVyYXRvcjxTSVpFLTEsUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPjo6Z28odGFiX3NpemVzLHRhYl9tZmxvcHMpOworICB9OworfTsKKworLy9yZWN1cnNpb24gZW5kCisKK3RlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEFjdGlvbiwgdGVtcGxhdGU8Y2xhc3MsaW50PiBjbGFzcyBJbnRlcmZhY2U+IAorc3RydWN0IHN0YXRpY19zaXplX2dlbmVyYXRvcjwxLFBlcmZfQW5hbHl6ZXIsQWN0aW9uLEludGVyZmFjZT57ICAKKyAgc3RhdGljICB2b2lkIGdvKHZlY3Rvcjxkb3VibGU+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpCisgIHsKKyAgICB0YWJfc2l6ZXMucHVzaF9iYWNrKDEpOworICAgIFBlcmZfQW5hbHl6ZXI8QWN0aW9uPEludGVyZmFjZTxSRUFMX1RZUEUsMT4gPiA+IHBlcmZfYWN0aW9uOworICAgIHRhYl9tZmxvcHMucHVzaF9iYWNrKHBlcmZfYWN0aW9uLmV2YWxfbWZsb3BzKDEpKTsKKyAgfTsKK307CisKKyNlbmRpZgorICAKKyAgCisgIAorICAKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9TVExfcGVyZl9hbmFseXplci5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9TVExfcGVyZl9hbmFseXplci5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWY4OTRiCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL1NUTF9wZXJmX2FuYWx5emVyLmhoCkBAIC0wLDAgKzEsODIgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBTVExfcGVyZl9hbmFseXplci5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTpYyAzIDE4OjU5OjM1IENFVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisjaWZuZGVmIF9TVExfUEVSRl9BTkFMWVNFUl9ISAorI2RlZmluZSBfU1RMX1BFUkZfQU5BTFlTRVJfSEgKKworI2luY2x1ZGUgIlNUTF90aW1lci5oaCIKKyNpbmNsdWRlICJiZW5jaF9wYXJhbWV0ZXIuaGgiCisKK3RlbXBsYXRlPGNsYXNzIEFDVElPTj4KK2NsYXNzIFNUTF9QZXJmX0FuYWx5emVyeworcHVibGljOiAgCisgIFNUTF9QZXJmX0FuYWx5emVyKHVuc2lnbmVkIGxvbmcgbG9uZyBuYl9zYW1wbGU9REVGQVVMVF9OQl9TQU1QTEUpOl9uYl9zYW1wbGUobmJfc2FtcGxlKSxfY2hyb25vcygpCisgIHsKKyAgICBNRVNTQUdFKCJTVExfUGVyZl9BbmFseXplciBDdG9yIik7CisgIH07IAorICBTVExfUGVyZl9BbmFseXplciggY29uc3QgU1RMX1BlcmZfQW5hbHl6ZXIgJiApeworICAgIElORk9TKCJDb3B5IEN0b3Igbm90IGltcGxlbWVudGVkIik7CisgICAgZXhpdCgwKTsKKyAgfTsKKyAgflNUTF9QZXJmX0FuYWx5emVyKCB2b2lkICl7CisgICAgTUVTU0FHRSgiU1RMX1BlcmZfQW5hbHl6ZXIgRHRvciIpOworICB9OworICAKKyAgCisgIGlubGluZSBkb3VibGUgZXZhbF9tZmxvcHMoaW50IHNpemUpCisgIHsKKworICAgIEFDVElPTiBhY3Rpb24oc2l6ZSk7CisKKyAgICBfY2hyb25vcy5zdGFydF9iYXNlbGluZShfbmJfc2FtcGxlKTsKKyAgICAgIAorICAgIGRvIHsKKworICAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKKyAgICB9IHdoaWxlIChfY2hyb25vcy5jaGVjaygpKTsKKworICAgIGRvdWJsZSBiYXNlbGluZV90aW1lPV9jaHJvbm9zLmdldF90aW1lKCk7CisKKyAgICBfY2hyb25vcy5zdGFydChfbmJfc2FtcGxlKTsKKyAgICBkbyB7CisgICAgICBhY3Rpb24uaW5pdGlhbGl6ZSgpOworICAgICAgYWN0aW9uLmNhbGN1bGF0ZSgpOworICAgIH0gd2hpbGUgKF9jaHJvbm9zLmNoZWNrKCkpOworCisgICAgZG91YmxlIGNhbGN1bGF0ZV90aW1lPV9jaHJvbm9zLmdldF90aW1lKCk7CisKKyAgICBkb3VibGUgY29ycmVjdGVkX3RpbWU9Y2FsY3VsYXRlX3RpbWUtYmFzZWxpbmVfdGltZTsKKyAgICAKKyAgICAvLyAgICBjb3V0IDw8IHNpemUgPDwiICI8PGJhc2VsaW5lX3RpbWU8PCIgIjw8Y2FsY3VsYXRlX3RpbWU8PCIgIjw8Y29ycmVjdGVkX3RpbWU8PCIgIjw8YWN0aW9uLm5iX29wX2Jhc2UoKSA8PCBlbmRsOyAgICAKKyAgICAKKyAgICByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8oY29ycmVjdGVkX3RpbWUqMTAwMDAwMC4wKTsKKyAgICAvL3JldHVybiBhY3Rpb24ubmJfb3BfYmFzZSgpLyhjYWxjdWxhdGVfdGltZSoxMDAwMDAwLjApOworICAgIAorICB9Citwcml2YXRlOgorCisgIFNUTF9UaW1lciBfY2hyb25vczsKKyAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9zYW1wbGU7CisKKyAgCit9OworCisgIAorICAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL1NUTF90aW1lci5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9TVExfdGltZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljNTRlOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9TVExfdGltZXIuaGgKQEAgLTAsMCArMSw3OCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIFNUTF9UaW1lci5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTpYyAzIDE4OjU5OjM1IENFVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisvLyBTVEwgVGltZXIgQ2xhc3MuIEFkYXB0ZWQgKEwuUC4pIGZyb20gdGhlIHRpbWVyIGNsYXNzIGJ5IE11c3NlciBldCBBbAorLy8gZGVzY3JpYmVkIGludCB0aGUgQm9vayA6IFNUTCBUdXRvcmlhbCBhbmQgcmVmZXJlbmNlIGd1aWRlLgorLy8gRGVmaW5lIGEgdGltZXIgY2xhc3MgZm9yIGFuYWx5emluZyBhbGdvcml0aG0gcGVyZm9ybWFuY2UuCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIFNUTF9UaW1lciB7CitwdWJsaWM6CisgIFNUTF9UaW1lcigpeyBiYXNlbGluZSA9IGZhbHNlOyB9OyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAvLyBTdGFydCBhIHNlcmllcyBvZiByIHRyaWFsczoKKyAgdm9pZCBzdGFydCh1bnNpZ25lZCBpbnQgcil7CisgICAgcmVwcyA9IHI7CisgICAgY291bnQgPSAwOworICAgIGl0ZXJhdGlvbnMuY2xlYXIoKTsKKyAgICBpdGVyYXRpb25zLnJlc2VydmUocmVwcyk7CisgICAgaW5pdGlhbCA9IHRpbWUoMCk7CisgIH07CisgIC8vIFN0YXJ0IGEgc2VyaWVzIG9mIHIgdHJpYWxzIHRvIGRldGVybWluZSBiYXNlbGluZSB0aW1lOgorICB2b2lkIHN0YXJ0X2Jhc2VsaW5lKHVuc2lnbmVkIGludCByKQorICB7CisgICAgYmFzZWxpbmUgPSB0cnVlOworICAgIHN0YXJ0KHIpOworICB9CisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJpYWxzIGhhdmUgYmVlbiBjb21wbGV0ZWQsIGVsc2UgZmFsc2UKKyAgYm9vbCBjaGVjaygpCisgIHsKKyAgICArK2NvdW50OworICAgIGZpbmFsID0gdGltZSgwKTsKKyAgICBpZiAoaW5pdGlhbCA8IGZpbmFsKSB7CisgICAgICBpdGVyYXRpb25zLnB1c2hfYmFjayhjb3VudCk7ICAKKyAgICAgIGluaXRpYWwgPSBmaW5hbDsKKyAgICAgIGNvdW50ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIChpdGVyYXRpb25zLnNpemUoKSA8IHJlcHMpOworICB9OworICAvLyBSZXR1cm5zIHRoZSByZXN1bHRzIGZvciBleHRlcm5hbCB1c2UKKyAgZG91YmxlIGdldF90aW1lKCB2b2lkICkKKyAgeworICAgIHNvcnQoaXRlcmF0aW9ucy5iZWdpbigpLCBpdGVyYXRpb25zLmVuZCgpKTsKKyAgICByZXR1cm4gMS4wL2l0ZXJhdGlvbnNbcmVwcy8yXTsKKyAgfTsKK3ByaXZhdGU6CisgIHVuc2lnbmVkIGludCByZXBzOyAgLy8gTnVtYmVyIG9mIHRyaWFscworICAvLyBGb3Igc3RvcmluZyBsb29wIGl0ZXJhdGlvbnMgb2YgYSB0cmlhbAorICB2ZWN0b3I8bG9uZz4gaXRlcmF0aW9uczsKKyAgLy8gRm9yIHNhdmluZyBpbml0aWFsIGFuZCBmaW5hbCB0aW1lcyBvZiBhIHRyaWFsCisgIHRpbWVfdCBpbml0aWFsLCBmaW5hbDsKKyAgLy8gRm9yIGNvdW50aW5nIGxvb3AgaXRlcmF0aW9ucyBvZiBhIHRyaWFsCisgIHVuc2lnbmVkIGxvbmcgY291bnQ7CisgIC8vIHRydWUgaWYgdGhpcyBpcyBhIGJhc2VsaW5lIGNvbXB1dGF0aW9uLCBmYWxzZSBvdGhlcndpc2UKKyAgYm9vbCBiYXNlbGluZTsKKyAgLy8gRm9yIHJlY29yZGluZyB0aGUgYmFzZWxpbmUgdGltZSAKKyAgZG91YmxlIGJhc2VsaW5lX3RpbWU7Cit9OworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvbWl4ZWRfcGVyZl9hbmFseXplci5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9taXhlZF9wZXJmX2FuYWx5emVyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTAyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvbWl4ZWRfcGVyZl9hbmFseXplci5oaApAQCAtMCwwICsxLDczIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgbWl4ZWRfcGVyZl9hbmFseXplci5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTpYyAzIDE4OjU5OjM2IENFVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisjaWZuZGVmIF9NSVhFRF9QRVJGX0FOQUxZU0VSX0hICisjZGVmaW5lIF9NSVhFRF9QRVJGX0FOQUxZU0VSX0hICisKKyNpbmNsdWRlICJ4ODZfcGVyZl9hbmFseXplci5oaCIKKyNpbmNsdWRlICJwb3J0YWJsZV9wZXJmX2FuYWx5emVyLmhoIgorCisvLyBjaG9vc2UgcG9ydGFibGUgcGVyZiBhbmFseXplciBmb3IgbG9uZyBjYWxjdWxhdGlvbnMgYW5kIHg4NiBhbmFseXNlciBmb3Igc2hvcnQgb25lcworCisKK3RlbXBsYXRlPGNsYXNzIEFjdGlvbj4KK2NsYXNzIE1peGVkX1BlcmZfQW5hbHl6ZXJ7CisgIAorcHVibGljOiAgCisgIE1peGVkX1BlcmZfQW5hbHl6ZXIoIHZvaWQgKTpfeDg2cGEoKSxfcHBhKCksX3VzZV9wcGEodHJ1ZSkKKyAgeworICAgIE1FU1NBR0UoIk1peGVkX1BlcmZfQW5hbHl6ZXIgQ3RvciIpOworICB9OyAKKyAgTWl4ZWRfUGVyZl9BbmFseXplciggY29uc3QgTWl4ZWRfUGVyZl9BbmFseXplciAmICl7CisgICAgSU5GT1MoIkNvcHkgQ3RvciBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICBleGl0KDApOworICB9OworICB+TWl4ZWRfUGVyZl9BbmFseXplciggdm9pZCApeworICAgIE1FU1NBR0UoIk1peGVkX1BlcmZfQW5hbHl6ZXIgRHRvciIpOworICB9OworICAgIAorICAKKyAgaW5saW5lIGRvdWJsZSBldmFsX21mbG9wcyhpbnQgc2l6ZSkKKyAgeworCisgICAgZG91YmxlIHJlc3VsdD0wLjA7CisgICAgaWYgKF91c2VfcHBhKXsgICAgICAKKyAgICAgIHJlc3VsdD1fcHBhLmV2YWxfbWZsb3BzKHNpemUpOworICAgICAgaWYgKF9wcGEuZ2V0X25iX2NhbGMoKT5ERUZBVUxUX05CX1NBTVBMRSl7X3VzZV9wcGE9ZmFsc2U7fSAgICAgIAorICAgIH0KKyAgICBlbHNleyAgICAgIAorICAgICAgcmVzdWx0PV94ODZwYS5ldmFsX21mbG9wcyhzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK3ByaXZhdGU6CisKKyAgUG9ydGFibGVfUGVyZl9BbmFseXplcjxBY3Rpb24+IF9wcGE7CisgIFg4Nl9QZXJmX0FuYWx5emVyPEFjdGlvbj4gX3g4NnBhOworICBib29sIF91c2VfcHBhOworCit9OworCisjZW5kaWYKKworICAKKyAgICAKKyAgCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplci5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV9wZXJmX2FuYWx5emVyLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGYzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplci5oaApAQCAtMCwwICsxLDEwMyBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHBvcnRhYmxlX3BlcmZfYW5hbHl6ZXIuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZO+/vWMgMyAxODo1OTozNSBDRVQgMjAwMgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBfUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISAorI2RlZmluZSBfUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISAorCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAidGltZXJzL3BvcnRhYmxlX3RpbWVyLmhoIgorCit0ZW1wbGF0ZSA8Y2xhc3MgQWN0aW9uPgorY2xhc3MgUG9ydGFibGVfUGVyZl9BbmFseXplcnsKK3B1YmxpYzoKKyAgUG9ydGFibGVfUGVyZl9BbmFseXplciggKTpfbmJfY2FsYygwKSwgbV90aW1lX2FjdGlvbigwKSwgX2Nocm9ub3MoKXsKKyAgICBNRVNTQUdFKCJQb3J0YWJsZV9QZXJmX0FuYWx5emVyIEN0b3IiKTsKKyAgfTsKKyAgUG9ydGFibGVfUGVyZl9BbmFseXplciggY29uc3QgUG9ydGFibGVfUGVyZl9BbmFseXplciAmICl7CisgICAgSU5GT1MoIkNvcHkgQ3RvciBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICBleGl0KDApOworICB9OworICB+UG9ydGFibGVfUGVyZl9BbmFseXplcigpeworICAgIE1FU1NBR0UoIlBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgRHRvciIpOworICB9OworCisgIEJUTF9ET05UX0lOTElORSBkb3VibGUgZXZhbF9tZmxvcHMoaW50IHNpemUpCisgIHsKKyAgICBBY3Rpb24gYWN0aW9uKHNpemUpOworCisvLyAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKKy8vICAgICB0aW1lX2FjdGlvbiA9IHRpbWVfY2FsY3VsYXRlKGFjdGlvbik7CisgICAgd2hpbGUgKG1fdGltZV9hY3Rpb24gPCBNSU5fVElNRSkKKyAgICB7CisgICAgICBpZihfbmJfY2FsYz09MCkgX25iX2NhbGMgPSAxOworICAgICAgZWxzZSAgICAgICAgICAgIF9uYl9jYWxjICo9IDI7CisgICAgICBhY3Rpb24uaW5pdGlhbGl6ZSgpOworICAgICAgbV90aW1lX2FjdGlvbiA9IHRpbWVfY2FsY3VsYXRlKGFjdGlvbik7CisgICAgfQorCisgICAgLy8gb3B0aW1pemUKKyAgICBmb3IgKGludCBpPTE7IGk8QnRsQ29uZmlnOjpJbnN0YW5jZS50cmllczsgKytpKQorICAgIHsKKyAgICAgIEFjdGlvbiBfYWN0aW9uKHNpemUpOworICAgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCBfYWN0aW9uLm5iX29wX2Jhc2UoKSpfbmJfY2FsYy8obV90aW1lX2FjdGlvbioxZTYpIDw8ICIgIjsKKyAgICAgIF9hY3Rpb24uaW5pdGlhbGl6ZSgpOworICAgICAgbV90aW1lX2FjdGlvbiA9IHN0ZDo6bWluKG1fdGltZV9hY3Rpb24sIHRpbWVfY2FsY3VsYXRlKF9hY3Rpb24pKTsKKyAgICB9CisKKyAgICBkb3VibGUgdGltZV9hY3Rpb24gPSBtX3RpbWVfYWN0aW9uIC8gKGRvdWJsZShfbmJfY2FsYykpOworCisgICAgLy8gY2hlY2sKKyAgICBpZiAoQnRsQ29uZmlnOjpJbnN0YW5jZS5jaGVja1Jlc3VsdHMgJiYgc2l6ZTwxMjgpCisgICAgeworICAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKKyAgICAgIGFjdGlvbi5jYWxjdWxhdGUoKTsKKyAgICAgIGFjdGlvbi5jaGVja19yZXN1bHQoKTsKKyAgICB9CisgICAgcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkvKHRpbWVfYWN0aW9uKjFlNik7CisgIH0KKworICBCVExfRE9OVF9JTkxJTkUgZG91YmxlIHRpbWVfY2FsY3VsYXRlKEFjdGlvbiAmIGFjdGlvbikKKyAgeworICAgIC8vIHRpbWUgbWVhc3VyZW1lbnQKKyAgICBhY3Rpb24uY2FsY3VsYXRlKCk7CisgICAgX2Nocm9ub3Muc3RhcnQoKTsKKyAgICBmb3IgKGludCBpaT0wO2lpPF9uYl9jYWxjO2lpKyspCisgICAgeworICAgICAgYWN0aW9uLmNhbGN1bGF0ZSgpOworICAgIH0KKyAgICBfY2hyb25vcy5zdG9wKCk7CisgICAgcmV0dXJuIF9jaHJvbm9zLnVzZXJfdGltZSgpOworICB9CisKKyAgdW5zaWduZWQgbG9uZyBsb25nIGdldF9uYl9jYWxjKCkKKyAgeworICAgIHJldHVybiBfbmJfY2FsYzsKKyAgfQorCisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBfbmJfY2FsYzsKKyAgZG91YmxlIG1fdGltZV9hY3Rpb247CisgIFBvcnRhYmxlX1RpbWVyIF9jaHJvbm9zOworCit9OworCisjZW5kaWYgLy9fUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISAorCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplcl9vbGQuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplcl9vbGQuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlMzc4MQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV9wZXJmX2FuYWx5emVyX29sZC5oaApAQCAtMCwwICsxLDEzNCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHBvcnRhYmxlX3BlcmZfYW5hbHl6ZXIuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZO+/vWMgMyAxODo1OTozNSBDRVQgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBfUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISAorI2RlZmluZSBfUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISAorCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAidGltZXJzL3BvcnRhYmxlX3RpbWVyLmhoIgorCit0ZW1wbGF0ZSA8Y2xhc3MgQWN0aW9uPgorY2xhc3MgUG9ydGFibGVfUGVyZl9BbmFseXplcnsKK3B1YmxpYzoKKyAgUG9ydGFibGVfUGVyZl9BbmFseXplciggdm9pZCApOl9uYl9jYWxjKDEpLF9uYl9pbml0KDEpLF9jaHJvbm9zKCl7CisgICAgTUVTU0FHRSgiUG9ydGFibGVfUGVyZl9BbmFseXplciBDdG9yIik7CisgIH07CisgIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIoIGNvbnN0IFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgJiApeworICAgIElORk9TKCJDb3B5IEN0b3Igbm90IGltcGxlbWVudGVkIik7CisgICAgZXhpdCgwKTsKKyAgfTsKKyAgflBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIoIHZvaWQgKXsKKyAgICBNRVNTQUdFKCJQb3J0YWJsZV9QZXJmX0FuYWx5emVyIER0b3IiKTsKKyAgfTsKKworCisKKyAgaW5saW5lIGRvdWJsZSBldmFsX21mbG9wcyhpbnQgc2l6ZSkKKyAgeworCisgICAgQWN0aW9uIGFjdGlvbihzaXplKTsKKworLy8gICAgIGRvdWJsZSB0aW1lX2Jhc2VsaW5lID0gdGltZV9pbml0KGFjdGlvbik7CisvLyAgICAgd2hpbGUgKHRpbWVfYmFzZWxpbmUgPCBNSU5fVElNRV9JTklUKQorLy8gICAgIHsKKy8vICAgICAgIF9uYl9pbml0ICo9IDI7CisvLyAgICAgICB0aW1lX2Jhc2VsaW5lID0gdGltZV9pbml0KGFjdGlvbik7CisvLyAgICAgfQorLy8KKy8vICAgICAvLyBvcHRpbWl6ZQorLy8gICAgIGZvciAoaW50IGk9MTsgaTxOQl9UUklFUzsgKytpKQorLy8gICAgICAgdGltZV9iYXNlbGluZSA9IHN0ZDo6bWluKHRpbWVfYmFzZWxpbmUsIHRpbWVfaW5pdChhY3Rpb24pKTsKKy8vCisvLyAgICAgdGltZV9iYXNlbGluZSA9IHRpbWVfYmFzZWxpbmUvKGRvdWJsZShfbmJfaW5pdCkpOworCisgICAgZG91YmxlIHRpbWVfYWN0aW9uID0gdGltZV9jYWxjdWxhdGUoYWN0aW9uKTsKKyAgICB3aGlsZSAodGltZV9hY3Rpb24gPCBNSU5fVElNRSkKKyAgICB7CisgICAgICBfbmJfY2FsYyAqPSAyOworICAgICAgdGltZV9hY3Rpb24gPSB0aW1lX2NhbGN1bGF0ZShhY3Rpb24pOworICAgIH0KKworICAgIC8vIG9wdGltaXplCisgICAgZm9yIChpbnQgaT0xOyBpPE5CX1RSSUVTOyArK2kpCisgICAgICB0aW1lX2FjdGlvbiA9IHN0ZDo6bWluKHRpbWVfYWN0aW9uLCB0aW1lX2NhbGN1bGF0ZShhY3Rpb24pKTsKKworLy8gICAgIElORk9TKCJzaXplPSI8PHNpemUpOworLy8gICAgIElORk9TKCJfbmJfaW5pdD0iPDxfbmJfaW5pdCk7CisvLyAgICAgSU5GT1MoIl9uYl9jYWxjPSI8PF9uYl9jYWxjKTsKKworICAgIHRpbWVfYWN0aW9uID0gdGltZV9hY3Rpb24gLyAoZG91YmxlKF9uYl9jYWxjKSk7CisKKyAgICBhY3Rpb24uY2hlY2tfcmVzdWx0KCk7CisKKworICAgIGRvdWJsZSB0aW1lX2Jhc2VsaW5lID0gdGltZV9pbml0KGFjdGlvbik7CisgICAgZm9yIChpbnQgaT0xOyBpPE5CX1RSSUVTOyArK2kpCisgICAgICB0aW1lX2Jhc2VsaW5lID0gc3RkOjptaW4odGltZV9iYXNlbGluZSwgdGltZV9pbml0KGFjdGlvbikpOworICAgIHRpbWVfYmFzZWxpbmUgPSB0aW1lX2Jhc2VsaW5lLyhkb3VibGUoX25iX2luaXQpKTsKKworCisKKy8vICAgICBJTkZPUygidGltZV9iYXNlbGluZT0iPDx0aW1lX2Jhc2VsaW5lKTsKKy8vICAgICBJTkZPUygidGltZV9hY3Rpb249Ijw8dGltZV9hY3Rpb24pOworCisgICAgdGltZV9hY3Rpb24gPSB0aW1lX2FjdGlvbiAtIHRpbWVfYmFzZWxpbmU7CisKKy8vICAgICBJTkZPUygidGltZV9jb3JyZWN0ZWQ9Ijw8dGltZV9hY3Rpb24pOworCisgICAgcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkvKHRpbWVfYWN0aW9uKjEwMDAwMDAuMCk7CisgIH0KKworICBpbmxpbmUgZG91YmxlIHRpbWVfaW5pdChBY3Rpb24gJiBhY3Rpb24pCisgIHsKKyAgICAvLyB0aW1lIG1lYXN1cmVtZW50CisgICAgX2Nocm9ub3Muc3RhcnQoKTsKKyAgICBmb3IgKGludCBpaT0wOyBpaTxfbmJfaW5pdDsgaWkrKykKKyAgICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CisgICAgX2Nocm9ub3Muc3RvcCgpOworICAgIHJldHVybiBfY2hyb25vcy51c2VyX3RpbWUoKTsKKyAgfQorCisKKyAgaW5saW5lIGRvdWJsZSB0aW1lX2NhbGN1bGF0ZShBY3Rpb24gJiBhY3Rpb24pCisgIHsKKyAgICAvLyB0aW1lIG1lYXN1cmVtZW50CisgICAgX2Nocm9ub3Muc3RhcnQoKTsKKyAgICBmb3IgKGludCBpaT0wO2lpPF9uYl9jYWxjO2lpKyspCisgICAgeworICAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKKyAgICAgIGFjdGlvbi5jYWxjdWxhdGUoKTsKKyAgICB9CisgICAgX2Nocm9ub3Muc3RvcCgpOworICAgIHJldHVybiBfY2hyb25vcy51c2VyX3RpbWUoKTsKKyAgfQorCisgIHVuc2lnbmVkIGxvbmcgbG9uZyBnZXRfbmJfY2FsYyggdm9pZCApCisgIHsKKyAgICByZXR1cm4gX25iX2NhbGM7CisgIH0KKworCitwcml2YXRlOgorICB1bnNpZ25lZCBsb25nIGxvbmcgX25iX2NhbGM7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBfbmJfaW5pdDsKKyAgUG9ydGFibGVfVGltZXIgX2Nocm9ub3M7CisKK307CisKKyNlbmRpZiAvL19QT1JUQUJMRV9QRVJGX0FOQUxZWkVSX0hICmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfdGltZXIuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfdGltZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTZhZDMwOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV90aW1lci5oaApAQCAtMCwwICsxLDE0NSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHBvcnRhYmxlX3RpbWVyLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiBmcm9tIGJvb3N0IGxpYgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNyBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKy8vICBzaW1wbGVfdGltZSBleHRyYWN0ZWQgZnJvbSB0aGUgYm9vc3QgbGlicmFyeQorLy8KKyNpZm5kZWYgX1BPUlRBQkxFX1RJTUVSX0hICisjZGVmaW5lIF9QT1JUQUJMRV9USU1FUl9ISAorCisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworI2luY2x1ZGUgPHRpbWUuaD4KKworCisjZGVmaW5lIFVTRUNfSU5fU0VDIDEwMDAwMDAKKworCisvLyAgdGltZXIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisvLyAgQSB0aW1lciBvYmplY3QgbWVhc3VyZXMgQ1BVIHRpbWUuCisjaWZkZWYgX01TQ19WRVIKKworI2RlZmluZSBOT01JTk1BWAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLyojaWZuZGVmIGhyX3RpbWVyCisjaW5jbHVkZSAiaHJfdGltZS5oIgorI2RlZmluZSBocl90aW1lcgorI2VuZGlmKi8KKworIGNsYXNzIFBvcnRhYmxlX1RpbWVyCisgeworICBwdWJsaWM6CisKKyAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICBMQVJHRV9JTlRFR0VSIHN0YXJ0OworICAgIExBUkdFX0lOVEVHRVIgc3RvcDsKKyAgIH0gc3RvcFdhdGNoOworCisKKyAgIFBvcnRhYmxlX1RpbWVyKCkKKyAgIHsKKwkgc3RhcnRWYWwuUXVhZFBhcnQgPSAwOworCSBzdG9wVmFsLlF1YWRQYXJ0ID0gMDsKKwkgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcXVlbmN5KTsKKyAgIH0KKworICAgdm9pZCBzdGFydCgpIHsgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnN0YXJ0VmFsKTsgfQorCisgICB2b2lkIHN0b3AoKSB7IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZzdG9wVmFsKTsgfQorCisgICBkb3VibGUgZWxhcHNlZCgpIHsKKwkgTEFSR0VfSU5URUdFUiB0aW1lOworICAgICB0aW1lLlF1YWRQYXJ0ID0gc3RvcFZhbC5RdWFkUGFydCAtIHN0YXJ0VmFsLlF1YWRQYXJ0OworICAgICByZXR1cm4gTElUb1NlY3ModGltZSk7CisgICB9CisKKyAgIGRvdWJsZSB1c2VyX3RpbWUoKSB7IHJldHVybiBlbGFwc2VkKCk7IH0KKworCisgcHJpdmF0ZToKKworICAgZG91YmxlIExJVG9TZWNzKExBUkdFX0lOVEVHRVImIEwpIHsKKyAgICAgcmV0dXJuICgoZG91YmxlKUwuUXVhZFBhcnQgLyhkb3VibGUpZnJlcXVlbmN5LlF1YWRQYXJ0KSA7CisgICB9CisKKyAgIExBUkdFX0lOVEVHRVIgc3RhcnRWYWw7CisgICBMQVJHRV9JTlRFR0VSIHN0b3BWYWw7CisgICBMQVJHRV9JTlRFR0VSIGZyZXF1ZW5jeTsKKworCisgfTsgLy8gUG9ydGFibGVfVGltZXIKKworI2Vsc2UKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisKK2NsYXNzIFBvcnRhYmxlX1RpbWVyCit7CisgcHVibGljOgorCisgIFBvcnRhYmxlX1RpbWVyKCkKKyAgeworICAgIG1fY2xraWQgPSBCdGxDb25maWc6Okluc3RhbmNlLnJlYWxjbG9jayA/IENMT0NLX1JFQUxUSU1FIDogQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEOworICB9CisKKyAgUG9ydGFibGVfVGltZXIoaW50IGNsa2lkKSA6IG1fY2xraWQoY2xraWQpCisgIHt9CisKKyAgdm9pZCBzdGFydCgpCisgIHsKKyAgICB0aW1lc3BlYyB0czsKKyAgICBjbG9ja19nZXR0aW1lKG1fY2xraWQsICZ0cyk7CisgICAgbV9zdGFydF90aW1lID0gZG91YmxlKHRzLnR2X3NlYykgKyAxZS05ICogZG91YmxlKHRzLnR2X25zZWMpOworCisgIH0KKworICB2b2lkIHN0b3AoKQorICB7CisgICAgdGltZXNwZWMgdHM7CisgICAgY2xvY2tfZ2V0dGltZShtX2Nsa2lkLCAmdHMpOworICAgIG1fc3RvcF90aW1lID0gZG91YmxlKHRzLnR2X3NlYykgKyAxZS05ICogZG91YmxlKHRzLnR2X25zZWMpOworCisgIH0KKworICBkb3VibGUgZWxhcHNlZCgpCisgIHsKKyAgICByZXR1cm4gIHVzZXJfdGltZSgpOworICB9CisKKyAgZG91YmxlIHVzZXJfdGltZSgpCisgIHsKKyAgICByZXR1cm4gbV9zdG9wX3RpbWUgLSBtX3N0YXJ0X3RpbWU7CisgIH0KKworCitwcml2YXRlOgorCisgIGludCBtX2Nsa2lkOworICBkb3VibGUgbV9zdG9wX3RpbWUsIG1fc3RhcnRfdGltZTsKKworfTsgLy8gUG9ydGFibGVfVGltZXIKKworI2VuZGlmCisKKyNlbmRpZiAgLy8gUE9SVEFCTEVfVElNRVJfSFBQCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMveDg2X3BlcmZfYW5hbHl6ZXIuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMveDg2X3BlcmZfYW5hbHl6ZXIuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlYTIxZAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy94ODZfcGVyZl9hbmFseXplci5oaApAQCAtMCwwICsxLDEwOCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHg4Nl9wZXJmX2FuYWx5emVyLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTvv71jIDMgMTg6NTk6MzUgQ0VUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgX1g4Nl9QRVJGX0FOQUxZU0VSX0hICisjZGVmaW5lIF9YODZfUEVSRl9BTkFMWVNFUl9ISAorCisjaW5jbHVkZSAieDg2X3RpbWVyLmhoIgorI2luY2x1ZGUgImJlbmNoX3BhcmFtZXRlci5oaCIKKwordGVtcGxhdGU8Y2xhc3MgQUNUSU9OPgorY2xhc3MgWDg2X1BlcmZfQW5hbHl6ZXJ7CitwdWJsaWM6CisgIFg4Nl9QZXJmX0FuYWx5emVyKCB1bnNpZ25lZCBsb25nIGxvbmcgbmJfc2FtcGxlPURFRkFVTFRfTkJfU0FNUExFKTpfbmJfc2FtcGxlKG5iX3NhbXBsZSksX2Nocm9ub3MoKQorICB7CisgICAgTUVTU0FHRSgiWDg2X1BlcmZfQW5hbHl6ZXIgQ3RvciIpOworICAgIF9jaHJvbm9zLmZpbmRfZnJlcXVlbmN5KCk7CisgIH07CisgIFg4Nl9QZXJmX0FuYWx5emVyKCBjb25zdCBYODZfUGVyZl9BbmFseXplciAmICl7CisgICAgSU5GT1MoIkNvcHkgQ3RvciBub3QgaW1wbGVtZW50ZWQiKTsKKyAgICBleGl0KDApOworICB9OworICB+WDg2X1BlcmZfQW5hbHl6ZXIoIHZvaWQgKXsKKyAgICBNRVNTQUdFKCJYODZfUGVyZl9BbmFseXplciBEdG9yIik7CisgIH07CisKKworICBpbmxpbmUgZG91YmxlIGV2YWxfbWZsb3BzKGludCBzaXplKQorICB7CisKKyAgICBBQ1RJT04gYWN0aW9uKHNpemUpOworCisgICAgaW50IG5iX2xvb3A9NTsKKyAgICBkb3VibGUgY2FsY3VsYXRlX3RpbWU9MC4wOworICAgIGRvdWJsZSBiYXNlbGluZV90aW1lPTAuMDsKKworICAgIGZvciAoaW50IGo9MCA7IGogPCBuYl9sb29wIDsgaisrKXsKKworICAgICAgX2Nocm9ub3MuY2xlYXIoKTsKKworICAgICAgZm9yKGludCBpPTAgOyBpIDwgX25iX3NhbXBsZSAgOyBpKyspCisgICAgICB7CisgICAgICAgIF9jaHJvbm9zLnN0YXJ0KCk7CisgICAgICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CisgICAgICAgIGFjdGlvbi5jYWxjdWxhdGUoKTsKKyAgICAgICAgX2Nocm9ub3Muc3RvcCgpOworICAgICAgICBfY2hyb25vcy5hZGRfZ2V0X2NsaWNrKCk7CisgICAgICB9CisKKyAgICAgIGNhbGN1bGF0ZV90aW1lICs9IGRvdWJsZShfY2hyb25vcy5nZXRfc2hvcnRlc3RfY2xpY2tzKCkpL19jaHJvbm9zLmZyZXF1ZW5jeSgpOworCisgICAgICBpZiAoaj09MCkgYWN0aW9uLmNoZWNrX3Jlc3VsdCgpOworCisgICAgICBfY2hyb25vcy5jbGVhcigpOworCisgICAgICBmb3IoaW50IGk9MCA7IGkgPCBfbmJfc2FtcGxlICA7IGkrKykKKyAgICAgIHsKKyAgICAgICAgX2Nocm9ub3Muc3RhcnQoKTsKKyAgICAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKKyAgICAgICAgX2Nocm9ub3Muc3RvcCgpOworICAgICAgICBfY2hyb25vcy5hZGRfZ2V0X2NsaWNrKCk7CisKKyAgICAgIH0KKworICAgICAgYmFzZWxpbmVfdGltZSs9ZG91YmxlKF9jaHJvbm9zLmdldF9zaG9ydGVzdF9jbGlja3MoKSkvX2Nocm9ub3MuZnJlcXVlbmN5KCk7CisKKyAgICB9CisKKyAgICBkb3VibGUgY29ycmVjdGVkX3RpbWUgPSAoY2FsY3VsYXRlX3RpbWUtYmFzZWxpbmVfdGltZSkvZG91YmxlKG5iX2xvb3ApOworCisKKy8vICAgICBJTkZPUygiX25iX3NhbXBsZT0iPDxfbmJfc2FtcGxlKTsKKy8vICAgICBJTkZPUygiYmFzZWxpbmVfdGltZT0iPDxiYXNlbGluZV90aW1lKTsKKy8vICAgICBJTkZPUygiY2FsY3VsYXRlX3RpbWU9Ijw8Y2FsY3VsYXRlX3RpbWUpOworLy8gICAgIElORk9TKCJjb3JyZWN0ZWRfdGltZT0iPDxjb3JyZWN0ZWRfdGltZSk7CisKKy8vICAgIGNvdXQgPDwgc2l6ZSA8PCIgIjw8YmFzZWxpbmVfdGltZTw8IiAiPDxjYWxjdWxhdGVfdGltZTw8IiAiPDxjb3JyZWN0ZWRfdGltZTw8IiAiPDxhY3Rpb24ubmJfb3BfYmFzZSgpIDw8IGVuZGw7CisKKyAgICByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8oY29ycmVjdGVkX3RpbWUqMTAwMDAwMC4wKTsKKyAgICAvL3JldHVybiBhY3Rpb24ubmJfb3BfYmFzZSgpLyhjYWxjdWxhdGVfdGltZSoxMDAwMDAwLjApOworICB9CisKK3ByaXZhdGU6CisKKyAgWDg2X1RpbWVyIF9jaHJvbm9zOworICB1bnNpZ25lZCBsb25nIGxvbmcgX25iX3NhbXBsZTsKKworCit9OworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMveDg2X3RpbWVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl90aW1lci5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmI1ZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl90aW1lci5oaApAQCAtMCwwICsxLDI0NiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIHg4Nl90aW1lci5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTvv71jIDMgMTg6NTk6MzUgQ0VUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgX1g4Nl9USU1FUl9ISAorI2RlZmluZSBfWDg2X1RJTUVSX0hICisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorLy8jaW5jbHVkZSAic3lzdGVtX3RpbWUuaCIKKyNkZWZpbmUgdTMyIHVuc2lnbmVkIGludAorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKy8vIGZyZXF1ZW5jZSBkZSBsYSBiZWNhbm5lIGVuIEh6CisvLyNkZWZpbmUgRlJFUVVFTkNZIDY0ODAwMDAwMAorLy8jZGVmaW5lIEZSRVFVRU5DWSAxNDAwMDAwMDAwCisjZGVmaW5lIEZSRVFVRU5DWSAxNjk1MDAwMDAwCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworY2xhc3MgWDg2X1RpbWVyIHsKKworcHVibGljIDoKKworICBYODZfVGltZXIoIHZvaWQgKTpfZnJlcXVlbmN5KEZSRVFVRU5DWSksX25iX3NhbXBsZSgwKQorICB7CisgICAgTUVTU0FHRSgiWDg2X1RpbWVyIERlZmF1bHQgQ3RvciIpOyAgICAKKyAgfQorCisgIGlubGluZSB2b2lkIHN0YXJ0KCB2b2lkICl7CisKKyAgICByZHRzYyhfY2xpY2tfc3RhcnQubjMyWzBdLF9jbGlja19zdGFydC5uMzJbMV0pOworCisgIH0KKworCisgIGlubGluZSB2b2lkIHN0b3AoIHZvaWQgKXsKKworICAgIHJkdHNjKF9jbGlja19zdG9wLm4zMlswXSxfY2xpY2tfc3RvcC5uMzJbMV0pOworCisgIH0KKyAgCisKKyAgaW5saW5lIGRvdWJsZSBmcmVxdWVuY3koIHZvaWQgKXsKKyAgICByZXR1cm4gX2ZyZXF1ZW5jeTsKKyAgfQorCisgIGRvdWJsZSBnZXRfZWxhcHNlZF90aW1lX2luX3NlY29uZCggdm9pZCApeworCisgICAgcmV0dXJuIChfY2xpY2tfc3RvcC5uNjQtX2NsaWNrX3N0YXJ0Lm42NCkvZG91YmxlKEZSRVFVRU5DWSk7CisKKworICB9ICAgIAorCisgIHVuc2lnbmVkIGxvbmcgbG9uZyAgZ2V0X2NsaWNrKCB2b2lkICl7CisgICAgCisgICAgcmV0dXJuIChfY2xpY2tfc3RvcC5uNjQtX2NsaWNrX3N0YXJ0Lm42NCk7CisKKyAgfSAgICAKKworICBpbmxpbmUgdm9pZCBmaW5kX2ZyZXF1ZW5jeSggdm9pZCApeworCisgICAgdGltZV90IGluaXRpYWwsIGZpbmFsOworICAgIGludCBkdW1teT0yOworCisgICAgaW5pdGlhbCA9IHRpbWUoMCk7CisgICAgc3RhcnQoKTsKKyAgICBkbyB7CisgICAgICBkdW1teSs9MjsKKyAgICB9CisgICAgd2hpbGUodGltZSgwKT09aW5pdGlhbCk7CisgICAgLy8gT24gZXN0IGF1IGRlYnV0IGQndW4gY3ljbGUgZCd1bmUgc2Vjb25kZSAhISEKKyAgICBpbml0aWFsID0gdGltZSgwKTsKKyAgICBzdGFydCgpOworICAgIGRvIHsKKyAgICAgIGR1bW15Kz0yOworICAgIH0KKyAgICB3aGlsZSh0aW1lKDApPT1pbml0aWFsKTsKKyAgICBmaW5hbD10aW1lKDApOworICAgIHN0b3AoKTsKKyAgICAvLyAgICBJTkZPUygiZmluZSBncmFpbmVkIHRpbWUgOiAiPDwgIGdldF9lbGFwc2VkX3RpbWVfaW5fc2Vjb25kKCkpOworICAgIC8vICBJTkZPUygiY29hcnNlIGdyYWluZWQgdGltZSA6ICI8PCAgZmluYWwtaW5pdGlhbCk7CisgICAgX2ZyZXF1ZW5jeT1fZnJlcXVlbmN5KmdldF9lbGFwc2VkX3RpbWVfaW5fc2Vjb25kKCkvZG91YmxlKGZpbmFsLWluaXRpYWwpOworICAgIC8vLyAgSU5GT1MoIkNQVSBmcmVxdWVuY3kgOiAiPDwgIF9mcmVxdWVuY3kpOyAgICAgICAgCisKKyAgfQorCisgIHZvaWQgIGFkZF9nZXRfY2xpY2soIHZvaWQgKXsKKyAgICAgICAKKyAgICBfbmJfc2FtcGxlKys7CisgICAgX2NvdW50ZWRfY2xpY2tzW2dldF9jbGljaygpXSsrOworICAgIGZpbGxfaGlzdG9yeV9jbGlja3MoKTsKKworICB9ICAgIAorCisgIHZvaWQgZHVtcF9zdGF0aXN0aWNzKHN0cmluZyBmaWxlbWFuZSl7CisgICAgCisgICAgb2ZzdHJlYW0gb3V0ZmlsZSAoZmlsZW1hbmUuY19zdHIoKSxpb3M6Om91dCkgOworCisgICAgc3RkOjptYXA8dW5zaWduZWQgbG9uZyBsb25nICwgdW5zaWduZWQgbG9uZyBsb25nPjo6aXRlcmF0b3IgaXRyOworICAgIGZvcihpdHI9X2NvdW50ZWRfY2xpY2tzLmJlZ2luKCkgOyBpdHIhPV9jb3VudGVkX2NsaWNrcy5lbmQoKSAgOyBpdHIrKykKKyAgICAgIHsgICAgICAKKyAgICAgIG91dGZpbGUgIDw8ICgqaXRyKS5maXJzdCA8PCAiICAiIDw8ICgqaXRyKS5zZWNvbmQgPDwgZW5kbCA7ICAgICAgIAorICAgICAgfSAgICAgIAorICAgIAorICAgIG91dGZpbGUuY2xvc2UoKTsKKworICB9CisKKyAgdm9pZCBkdW1wX2hpc3Rvcnkoc3RyaW5nIGZpbGVtYW5lKXsKKyAgICAKKyAgICBvZnN0cmVhbSBvdXRmaWxlIChmaWxlbWFuZS5jX3N0cigpLGlvczo6b3V0KSA7CisKKworCisgICAgZm9yKGludCBpPTAgOyBpPF9oaXN0b3J5X21lYW5fY2xpY2tzLnNpemUoKSA7IGkrKykKKyAgICAgIHsgICAgICAKKwlvdXRmaWxlICA8PCBpIDw8ICIgIiAKKwkJIDw8IF9oaXN0b3J5X21lYW5fY2xpY2tzW2ldIDw8ICIgIiAKKwkJIDw8IF9oaXN0b3J5X3Nob3J0ZXN0X2NsaWNrc1tpXSA8PCAiICIgCisJCSA8PCBfaGlzdG9yeV9tb3N0X29jY3VyZWRfY2xpY2tzW2ldIDw8IGVuZGwgOworICAgICAgfSAgICAgIAorICAgIAorICAgIG91dGZpbGUuY2xvc2UoKTsKKworICB9CisgICAgIAorCisKKyAgZG91YmxlIGdldF9tZWFuX2NsaWNrcyggdm9pZCApeworICAgIAorICAgIHN0ZDo6bWFwPHVuc2lnbmVkIGxvbmcgbG9uZyx1bnNpZ25lZCBsb25nIGxvbmc+OjppdGVyYXRvciBpdHI7CisgICAgCisgICAgdW5zaWduZWQgbG9uZyBsb25nIG1lYW5fY2xpY2tzPTA7CisKKyAgICBmb3IoaXRyPV9jb3VudGVkX2NsaWNrcy5iZWdpbigpIDsgaXRyIT1fY291bnRlZF9jbGlja3MuZW5kKCkgIDsgaXRyKyspCisgICAgICB7ICAgICAgCisJCisJbWVhbl9jbGlja3MrPSgqaXRyKS5zZWNvbmQqKCppdHIpLmZpcnN0OworICAgICAgfSAgICAgIAorCisgICAgcmV0dXJuIG1lYW5fY2xpY2tzL2RvdWJsZShfbmJfc2FtcGxlKTsKKworICB9CisKKyAgZG91YmxlIGdldF9zaG9ydGVzdF9jbGlja3MoIHZvaWQgKXsKKyAgICAKKyAgICByZXR1cm4gZG91YmxlKCgqX2NvdW50ZWRfY2xpY2tzLmJlZ2luKCkpLmZpcnN0KTsKKworICB9CisKKyAgdm9pZCBmaWxsX2hpc3RvcnlfY2xpY2tzKCB2b2lkICl7CisKKyAgICBfaGlzdG9yeV9tZWFuX2NsaWNrcy5wdXNoX2JhY2soZ2V0X21lYW5fY2xpY2tzKCkpOworICAgIF9oaXN0b3J5X3Nob3J0ZXN0X2NsaWNrcy5wdXNoX2JhY2soZ2V0X3Nob3J0ZXN0X2NsaWNrcygpKTsKKyAgICBfaGlzdG9yeV9tb3N0X29jY3VyZWRfY2xpY2tzLnB1c2hfYmFjayhnZXRfbW9zdF9vY2N1cmVkX2NsaWNrcygpKTsKKworICB9CisKKworICBkb3VibGUgZ2V0X21vc3Rfb2NjdXJlZF9jbGlja3MoIHZvaWQgKXsKKworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtb2M9MDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbWF4X29jY3VyZW5jZT0wOworCisgICAgc3RkOjptYXA8dW5zaWduZWQgbG9uZyBsb25nLHVuc2lnbmVkIGxvbmcgbG9uZz46Oml0ZXJhdG9yIGl0cjsKKworICAgIGZvcihpdHI9X2NvdW50ZWRfY2xpY2tzLmJlZ2luKCkgOyBpdHIhPV9jb3VudGVkX2NsaWNrcy5lbmQoKSAgOyBpdHIrKykKKyAgICAgIHsgICAgICAKKwkKKwlpZiAobWF4X29jY3VyZW5jZTw9KCppdHIpLnNlY29uZCl7CisJICBtYXhfb2NjdXJlbmNlPSgqaXRyKS5zZWNvbmQ7CisJICBtb2M9KCppdHIpLmZpcnN0OworCX0KKyAgICAgIH0gICAgICAKKyAgICAKKyAgICByZXR1cm4gZG91YmxlKG1vYyk7ICAgIAorCisgIH0KKyAgCisgIHZvaWQgY2xlYXIoIHZvaWQgKQorICB7CisgICAgX2NvdW50ZWRfY2xpY2tzLmNsZWFyKCk7CisKKyAgICBfaGlzdG9yeV9tZWFuX2NsaWNrcy5jbGVhcigpOworICAgIF9oaXN0b3J5X3Nob3J0ZXN0X2NsaWNrcy5jbGVhcigpOworICAgIF9oaXN0b3J5X21vc3Rfb2NjdXJlZF9jbGlja3MuY2xlYXIoKTsKKworICAgIF9uYl9zYW1wbGU9MDsKKyAgfQorCisKKyAgICAKK3ByaXZhdGUgOgorICAKKyAgdW5pb24KKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IG4zMlsyXSA7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIG42NCA7CisgIH0gX2NsaWNrX3N0YXJ0OworCisgIHVuaW9uCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBuMzJbMl0gOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBuNjQgOworICB9IF9jbGlja19zdG9wOworCisgIGRvdWJsZSBfZnJlcXVlbmN5IDsKKworICBtYXA8dW5zaWduZWQgbG9uZyBsb25nLHVuc2lnbmVkIGxvbmcgbG9uZz4gX2NvdW50ZWRfY2xpY2tzOworCisgIHZlY3Rvcjxkb3VibGU+IF9oaXN0b3J5X21lYW5fY2xpY2tzOworICB2ZWN0b3I8ZG91YmxlPiBfaGlzdG9yeV9zaG9ydGVzdF9jbGlja3M7CisgIHZlY3Rvcjxkb3VibGU+IF9oaXN0b3J5X21vc3Rfb2NjdXJlZF9jbGlja3M7CisKKyAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9zYW1wbGU7CisKKyAgCisKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xpbl9sb2cuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xpbl9sb2cuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhMzkzMgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3NpemVfbGluX2xvZy5oaApAQCAtMCwwICsxLDcwIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgc2l6ZV9saW5fbG9nLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzcgQ0VUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgU0laRV9MSU5fTE9HCisjZGVmaW5lIFNJWkVfTElOX0xPRworCisjaW5jbHVkZSAic2l6ZV9sb2cuaGgiCisKK3RlbXBsYXRlPGNsYXNzIFZlY3Rvcj4KK3ZvaWQgc2l6ZV9saW5fbG9nKGNvbnN0IGludCBuYl9wb2ludCwgY29uc3QgaW50IHNpemVfbWluLCBjb25zdCBpbnQgc2l6ZV9tYXgsIFZlY3RvciAmIFgpCit7CisgIGludCB0ZW49MTA7CisgIGludCBuaW5lPTk7CisKKyAgWC5yZXNpemUobmJfcG9pbnQpOworCisgIGlmIChuYl9wb2ludD50ZW4peworCisgICAgZm9yIChpbnQgaT0wO2k8bmluZTtpKyspeworICAgICAgCisgICAgICBYW2ldPWkrMTsKKworICAgIH0KKworICAgIFZlY3RvciBsb2dfc2l6ZTsKKyAgICBzaXplX2xvZyhuYl9wb2ludC1uaW5lLHRlbixzaXplX21heCxsb2dfc2l6ZSk7CisKKyAgICBmb3IgKGludCBpPTA7aTxuYl9wb2ludC1uaW5lO2krKyl7CisgICAgICAKKyAgICAgIFhbaStuaW5lXT1sb2dfc2l6ZVtpXTsKKworICAgIH0KKyAgfQorICBlbHNleworCisgICAgZm9yIChpbnQgaT0wO2k8bmJfcG9pbnQ7aSsrKXsKKyAgICAgIAorICAgICAgWFtpXT1pKzE7CisKKyAgICB9CisgIH0KKworIC8vICBmb3IgKGludCBpPTA7aTxuYl9wb2ludDtpKyspeworICAgIAorLy8gICAgICAgIElORk9TKCJjb21wdXRlZCBzaXplcyA6IFhbIjw8aTw8Il09Ijw8WFtpXSk7CisgICAgCisvLyAgIH0KKworfQorICAKKyNlbmRpZgorICAgIAorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3NpemVfbG9nLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9sb2cuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhM2RhNwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3NpemVfbG9nLmhoCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBzaXplX2xvZy5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNyBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgU0laRV9MT0cKKyNkZWZpbmUgU0laRV9MT0cKKworI2luY2x1ZGUgIm1hdGguaCIKKy8vIFRoZSBWZWN0b3IgY2xhc3MgbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgcGFydCBvZiBTVEwgdmVjdG9yIGNvbmNlcHQgOgorLy8gICAgICAgICAgICByZXNpemUoKSBtZXRob2QKKy8vICAgICAgICAgICAgW10gb3BlcmF0b3IgZm9yIHNldGluZyBlbGVtZW50CisvLyB0aGUgdmVjdG9yIGVsZW1lbnQgYXJlIGludCBjb21wYXRpYmxlLgordGVtcGxhdGU8Y2xhc3MgVmVjdG9yPgordm9pZCBzaXplX2xvZyhjb25zdCBpbnQgbmJfcG9pbnQsIGNvbnN0IGludCBzaXplX21pbiwgY29uc3QgaW50IHNpemVfbWF4LCBWZWN0b3IgJiBYKQoreworICBYLnJlc2l6ZShuYl9wb2ludCk7CisKKyAgZmxvYXQgbHNfbWluPWxvZyhmbG9hdChzaXplX21pbikpOworICBmbG9hdCBsc19tYXg9bG9nKGZsb2F0KHNpemVfbWF4KSk7CisKKyAgZmxvYXQgbHM9MC4wOworCisgIGZsb2F0IGRlbHRhX2xzPShsc19tYXgtbHNfbWluKS8oZmxvYXQobmJfcG9pbnQtMSkpOworCisgIGludCBzaXplPTA7CisKKyAgZm9yIChpbnQgaT0wO2k8bmJfcG9pbnQ7aSsrKXsKKworICAgIGxzID0gbHNfbWluICsgZmxvYXQoaSkqZGVsdGFfbHMgOworICAgIAorICAgIHNpemU9aW50KGV4cChscykpOyAKKworICAgIFhbaV09c2l6ZTsKKyAgfQorCit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy91dGlsaXRpZXMuaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3V0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzMwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy91dGlsaXRpZXMuaApAQCAtMCwwICsxLDkwIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgICAgOiB1dGlsaXRpZXMuaAorLy8gQ3JlYXRlZCAgIDogbWFyIGp1biAxOSAxMzoxODoxNCBDRVNUIDIwMDEKKy8vIEF1dGhvciAgICA6IEFudG9pbmUgWUVTU0FZQU4sIFBhdWwgUkFTQ0xFLCBFREYKKy8vIFByb2plY3QgICA6IFNBTE9NRQorLy8gQ29weXJpZ2h0IDogRURGIDIwMDEKKy8vICRIZWFkZXIkCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qIC0tLSAgRGVmaW5pdGlvbiBtYWNyb3MgZmlsZSB0byBwcmludCBpbmZvcm1hdGlvbiBpZiBfREVCVUdfIGlzIGRlZmluZWQgLS0tICovCisKKyMgaWZuZGVmIFVUSUxJVElFU19ICisjIGRlZmluZSBVVElMSVRJRVNfSAorCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorLy8jIGluY2x1ZGUgPGlvc3RyZWFtPiBvayBmb3IgZ2NjMy4wMQorIyBpbmNsdWRlIDxpb3N0cmVhbT4KKworLyogLS0tICBJTkZPUyBpcyBhbHdheXMgZGVmaW5lZCAod2l0aG91dCBfREVCVUdfKTogdG8gYmUgdXNlZCBmb3Igd2FybmluZ3MsIHdpdGggcmVsZWFzZSB2ZXJzaW9uIC0tLSAqLworCisjIGRlZmluZSBIRVJFV0VBUkUgY291dDw8Zmx1c2ggOyBjZXJyIDw8IF9fRklMRV9fIDw8ICIgWyIgPDwgX19MSU5FX18gPDwgIl0gOiAiIDw8IGZsdXNoIDsKKyMgZGVmaW5lIElORk9TKGNoYWluKSB7SEVSRVdFQVJFIDsgY2VyciA8PCBjaGFpbiA8PCBlbmRsIDt9CisjIGRlZmluZSBQWVNDUklQVChjaGFpbikge2NvdXQ8PGZsdXNoIDsgY2VyciA8PCAiLS0tUFlTQ1JJUFQtLS0gIiA8PCBjaGFpbiA8PCBlbmRsIDt9CisKKy8qIC0tLSBUbyBwcmludCBkYXRlIGFuZCB0aW1lIG9mIGNvbXBpbGF0aW9uIG9mIGN1cnJlbnQgc291cmNlIG9uIHN0ZG91dCAtLS0gKi8KKworIyBpZiBkZWZpbmVkICggX19HTlVDX18gKQorIyBkZWZpbmUgQ09NUElMRVIJCSJnKysiIDsKKyMgZWxpZiBkZWZpbmVkICggX19zdW4gKQorIyBkZWZpbmUgQ09NUElMRVIJCSJDQyIgOworIyBlbGlmIGRlZmluZWQgKCBfX0tDQyApCisjIGRlZmluZSBDT01QSUxFUgkJIktDQyIgOworIyBlbGlmIGRlZmluZWQgKCBfX1BHSSApCisjIGRlZmluZSBDT01QSUxFUgkJInBnQ0MiIDsKKyMgZWxzZQorIyBkZWZpbmUgQ09NUElMRVIJCSJ1bmRlZmluZWQiIDsKKyMgZW5kaWYKKworIyBpZmRlZiBJTkZPU19DT01QSUxBVElPTgorIyBlcnJvciBJTkZPU19DT01QSUxBVElPTiBhbHJlYWR5IGRlZmluZWQKKyMgZW5kaWYKKyMgZGVmaW5lIElORk9TX0NPTVBJTEFUSU9OCXtcCisJCQkJCWNlcnIgPDwgZmx1c2g7XAorCQkJCQljb3V0IDw8IF9fRklMRV9fIDtcCisJCQkJCWNvdXQgPDwgIiBbIiA8PCBfX0xJTkVfXyA8PCAiXSA6ICIgO1wKKwkJCQkJY291dCA8PCAiQ09NUElMRUQgd2l0aCAiIDw8IENPTVBJTEVSIDtcCisJCQkJCWNvdXQgPDwgIiwgIiA8PCBfX0RBVEVfXyA7IFwKKwkJCQkJY291dCA8PCAiIGF0ICIgPDwgX19USU1FX18gPDwgZW5kbCA7XAorCQkJCQljb3V0IDw8ICJcblxuIiA7XAorCQkJCQljb3V0IDw8IGZsdXNoIDtcCisJCQkJfQorCisjIGlmZGVmIF9ERUJVR18KKworLyogLS0tIHRoZSBmb2xsb3dpbmcgTUFDUk9TIGFyZSB1c2VmdWwgYXQgZGVidWcgdGltZSAtLS0gKi8KKworIyBkZWZpbmUgSEVSRSBjb3V0PDxmbHVzaCA7IGNlcnIgPDwgIi0gVHJhY2UgIiA8PCBfX0ZJTEVfXyA8PCAiIFsiIDw8IF9fTElORV9fIDw8ICJdIDogIiA8PCBmbHVzaCA7CisjIGRlZmluZSBTQ1JVVEUodmFyKSBIRVJFIDsgY2VyciA8PCAjdmFyIDw8ICI9IiA8PCB2YXIgPDwgZW5kbCA7CisjIGRlZmluZSBNRVNTQUdFKGNoYWluKSB7SEVSRSA7IGNlcnIgPDwgY2hhaW4gPDwgZW5kbCA7fQorIyBkZWZpbmUgSU5URVJSVVBUSU9OKGNvZGUpIEhFUkUgOyBjZXJyIDw8ICJJTlRFUlJVUFRJT04gcmV0dXJuIGNvZGU9ICIgPDwgY29kZSA8PCBlbmRsIDsgZXhpdChjb2RlKSA7CisKKyMgaWZuZGVmIEFTU0VSVAorIyBkZWZpbmUgQVNTRVJUKGNvbmRpdGlvbikgaWYgKCEoY29uZGl0aW9uKSl7IEhFUkUgOyBjZXJyIDw8ICJDT05ESVRJT04gIiA8PCAjY29uZGl0aW9uIDw8ICIgTk9UIFZFUklGSUVEIjw8IGVuZGwgOyBJTlRFUlJVUFRJT04oMSkgO30KKyMgZW5kaWYgLyogQVNTRVJUICovCisKKyNkZWZpbmUgUkVQRVJFIGNvdXQ8PGZsdXNoIDsgY2VyciA8PCAiICAgLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGwgPDwgZmx1c2ggOworI2RlZmluZSBCRUdJTl9PRihjaGFpbikge1JFUEVSRSA7IEhFUkUgOyBjZXJyIDw8ICJCZWdpbiBvZjogIiA8PCBjaGFpbiA8PCBlbmRsIDsgUkVQRVJFIDsgfQorI2RlZmluZSBFTkRfT0YoY2hhaW4pIHtSRVBFUkUgOyBIRVJFIDsgY2VyciA8PCAiTm9ybWFsIGVuZCBvZjogIiA8PCBjaGFpbiA8PCBlbmRsIDsgUkVQRVJFIDsgfQorCisKKworIyBlbHNlIC8qIGlmZGVmIF9ERUJVR18qLworCisjIGRlZmluZSBIRVJFCisjIGRlZmluZSBTQ1JVVEUodmFyKQorIyBkZWZpbmUgTUVTU0FHRShjaGFpbikKKyMgZGVmaW5lIElOVEVSUlVQVElPTihjb2RlKQorCisjIGlmbmRlZiBBU1NFUlQKKyMgZGVmaW5lIEFTU0VSVChjb25kaXRpb24pCisjIGVuZGlmIC8qIEFTU0VSVCAqLworCisjZGVmaW5lIFJFUEVSRQorI2RlZmluZSBCRUdJTl9PRihjaGFpbikKKyNkZWZpbmUgRU5EX09GKGNoYWluKQorCisKKyMgZW5kaWYgLyogaWZkZWYgX0RFQlVHXyovCisKKyMgZW5kaWYgLyogaWZuZGVmIFVUSUxJVElFU19IICovCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy94eV9maWxlLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMveHlfZmlsZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTcxYmVkCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMveHlfZmlsZS5oaApAQCAtMCwwICsxLDc1IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgZHVtcF9maWxlX3hfeS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoyMCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgWFlfRklMRV9ISAorI2RlZmluZSBYWV9GSUxFX0hICisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworYm9vbCByZWFkX3h5X2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBmaWxlbmFtZSwgc3RkOjp2ZWN0b3I8aW50PiAmIHRhYl9zaXplcywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzLCBib29sIHF1aWV0ID0gZmFsc2UpCit7CisKKyAgc3RkOjppZnN0cmVhbSBpbnB1dF9maWxlIChmaWxlbmFtZS5jX3N0cigpLHN0ZDo6aW9zOjppbik7CisKKyAgaWYgKCFpbnB1dF9maWxlKXsKKyAgICBpZiAoIXF1aWV0KSB7CisgICAgICBJTkZPUygiISEhIEVycm9yIG9wZW5pbmcgIjw8ZmlsZW5hbWUpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbnQgbmJfcG9pbnQ9MDsKKyAgaW50IHNpemU9MDsKKyAgZG91YmxlIG1mbG9wcz0wOworCisgIHdoaWxlIChpbnB1dF9maWxlID4+IHNpemUgPj4gbWZsb3BzICl7CisgICAgbmJfcG9pbnQrKzsKKyAgICB0YWJfc2l6ZXMucHVzaF9iYWNrKHNpemUpOworICAgIHRhYl9tZmxvcHMucHVzaF9iYWNrKG1mbG9wcyk7CisgIH0KKyAgU0NSVVRFKG5iX3BvaW50KTsKKworICBpbnB1dF9maWxlLmNsb3NlKCk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBUaGUgVmVjdG9yIGNsYXNzIG11c3Qgc2F0aXNmeSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgU1RMIHZlY3RvciBjb25jZXB0IDoKKy8vICAgICAgICAgICAgcmVzaXplKCkgbWV0aG9kCisvLyAgICAgICAgICAgIFtdIG9wZXJhdG9yIGZvciBzZXRpbmcgZWxlbWVudAorLy8gdGhlIHZlY3RvciBlbGVtZW50IG11c3QgaGF2ZSB0aGUgPDwgb3BlcmF0b3IgZGVmaW5lCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPGNsYXNzIFZlY3Rvcl9BLCBjbGFzcyBWZWN0b3JfQj4KK3ZvaWQgZHVtcF94eV9maWxlKGNvbnN0IFZlY3Rvcl9BICYgWCwgY29uc3QgVmVjdG9yX0IgJiBZLCBjb25zdCBzdGQ6OnN0cmluZyAmIGZpbGVuYW1lKXsKKyAgCisgIG9mc3RyZWFtIG91dGZpbGUgKGZpbGVuYW1lLmNfc3RyKCksaW9zOjpvdXQpIDsKKyAgaW50IHNpemU9WC5zaXplKCk7CisgIAorICBmb3IgKGludCBpPTA7aTxzaXplO2krKykKKyAgICBvdXRmaWxlIDw8IFhbaV0gPDwgIiAiIDw8IFlbaV0gPDwgZW5kbDsKKworICBvdXRmaWxlLmNsb3NlKCk7Cit9IAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL0JMQVMvQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy9CTEFTL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDJmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNjAgQEAKKworZmluZF9wYWNrYWdlKEFUTEFTKQoraWYgKEFUTEFTX0ZPVU5EKQorICBidGxfYWRkX2JlbmNoKGJ0bF9hdGxhcyBtYWluLmNwcCkKKyAgaWYoQlVJTERfYnRsX2F0bGFzKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhidGxfYXRsYXMgJHtBVExBU19MSUJSQVJJRVN9KQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhidGxfYXRsYXMgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRENCTEFTTkFNRT1BVExBUyAtREhBU19MQVBBQ0s9MSIpCisgIGVuZGlmKEJVSUxEX2J0bF9hdGxhcykKK2VuZGlmIChBVExBU19GT1VORCkKKworZmluZF9wYWNrYWdlKE1LTCkKK2lmIChNS0xfRk9VTkQpCisgIGJ0bF9hZGRfYmVuY2goYnRsX21rbCBtYWluLmNwcCkKKyAgaWYoQlVJTERfYnRsX21rbCkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoYnRsX21rbCAke01LTF9MSUJSQVJJRVN9KQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhidGxfbWtsIFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLURDQkxBU05BTUU9SU5URUxfTUtMIC1ESEFTX0xBUEFDSz0xIikKKyAgZW5kaWYoQlVJTERfYnRsX21rbCkKK2VuZGlmIChNS0xfRk9VTkQpCisKKworZmluZF9wYWNrYWdlKEdPVE8yKQoraWYgKEdPVE8yX0ZPVU5EKQorICBidGxfYWRkX2JlbmNoKGJ0bF9nb3RvMiBtYWluLmNwcCkKKyAgaWYoQlVJTERfYnRsX2dvdG8yKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhidGxfZ290bzIgJHtHT1RPX0xJQlJBUklFU30gKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhidGxfZ290bzIgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRENCTEFTTkFNRT1HT1RPMiIpCisgIGVuZGlmKEJVSUxEX2J0bF9nb3RvMikKK2VuZGlmIChHT1RPMl9GT1VORCkKKworZmluZF9wYWNrYWdlKEdPVE8pCitpZiAoR09UT19GT1VORCkKKyAgaWYoR09UTzJfRk9VTkQpCisgICAgYnRsX2FkZF9iZW5jaChidGxfZ290byBtYWluLmNwcCBPRkYpCisgIGVsc2UoKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX2dvdG8gbWFpbi5jcHApCisgIGVuZGlmKCkKKyAgaWYoQlVJTERfYnRsX2dvdG8pCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJ0bF9nb3RvICR7R09UT19MSUJSQVJJRVN9ICkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoYnRsX2dvdG8gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRENCTEFTTkFNRT1HT1RPIikKKyAgZW5kaWYoQlVJTERfYnRsX2dvdG8pCitlbmRpZiAoR09UT19GT1VORCkKKworZmluZF9wYWNrYWdlKEFDTUwpCitpZiAoQUNNTF9GT1VORCkKKyAgYnRsX2FkZF9iZW5jaChidGxfYWNtbCBtYWluLmNwcCkKKyAgaWYoQlVJTERfYnRsX2FjbWwpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGJ0bF9hY21sICR7QUNNTF9MSUJSQVJJRVN9ICkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoYnRsX2FjbWwgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRENCTEFTTkFNRT1BQ01MIC1ESEFTX0xBUEFDSz0xIikKKyAgZW5kaWYoQlVJTERfYnRsX2FjbWwpCitlbmRpZiAoQUNNTF9GT1VORCkKKworaWYoRWlnZW5fU09VUkNFX0RJUiBBTkQgQ01BS0VfRm9ydHJhbl9DT01QSUxFUl9XT1JLUykKKyAgIyB3ZSBhcmUgaW5zaWRlIEVpZ2VuIGFuZCBibGFzL2xhcGFjayBpbnRlcmZhY2UgaXMgY29tcGlsYWJsZQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7RWlnZW5fU09VUkNFX0RJUn0pCisgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuYmxhcyBtYWluLmNwcCkKKyAgaWYoQlVJTERfYnRsX2VpZ2VuYmxhcykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoYnRsX2VpZ2VuYmxhcyBlaWdlbl9ibGFzIGVpZ2VuX2xhcGFjayApCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGJ0bF9laWdlbmJsYXMgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRENCTEFTTkFNRT1FaWdlbkJMQVMiKQorICBlbmRpZigpCitlbmRpZigpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXMuaCBiL2JlbmNoL2J0bC9saWJzL0JMQVMvYmxhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZjNhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXMuaApAQCAtMCwwICsxLDY3NSBAQAorI2lmbmRlZiBCTEFTX0gKKyNkZWZpbmUgQkxBU19ICisKKyNkZWZpbmUgQkxBU0ZVTkMoRlVOQykgRlVOQyMjXworCisjaWZkZWYgX19XSU42NF9fCit0eXBlZGVmIGxvbmcgbG9uZyBCTEFTTE9ORzsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIEJMQVNVTE9ORzsKKyNlbHNlCit0eXBlZGVmIGxvbmcgQkxBU0xPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQkxBU1VMT05HOworI2VuZGlmCisKK2ludCAgICBCTEFTRlVOQyh4ZXJibGEpKGNvbnN0IGNoYXIgKiwgaW50ICppbmZvLCBpbnQpOworCitmbG9hdCAgQkxBU0ZVTkMoc2RvdCkgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZmxvYXQgIEJMQVNGVU5DKHNkc2RvdCkoaW50ICosIGZsb2F0ICAqLCAgICAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworCitkb3VibGUgQkxBU0ZVTkMoZHNkb3QpIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRkb3QpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxZG90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKKyNpZiBkZWZpbmVkKEZfSU5URVJGQUNFX0dGT1JUKSAmJiAhZGVmaW5lZChfXzY0QklUX18pCitpbnQgICBCTEFTRlVOQyhjZG90dSkgIChpbnQgKiwgZmxvYXQgICogLCBpbnQgKiwgZmxvYXQgICosICBpbnQgKik7CitpbnQgICBCTEFTRlVOQyhjZG90YykgIChpbnQgKiwgZmxvYXQgICosICBpbnQgKiwgZmxvYXQgICosICBpbnQgKik7Cit2b2lkICBCTEFTRlVOQyh6ZG90dSkgIChkb3VibGUgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOwordm9pZCAgQkxBU0ZVTkMoemRvdGMpICAoZG91YmxlICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKK3ZvaWQgIEJMQVNGVU5DKHhkb3R1KSAgKGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKik7Cit2b2lkICBCTEFTRlVOQyh4ZG90YykgIChkb3VibGUgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOworI2VsaWYgIGRlZmluZWQoRl9JTlRFUkZBQ0VfRjJDKSB8fCBcCisgICAgIGRlZmluZWQoRl9JTlRFUkZBQ0VfUEdJKSB8fCBcCisgICAgIGRlZmluZWQoRl9JTlRFUkZBQ0VfR0ZPUlQpIHx8IFwKKyAgICAoZGVmaW5lZChGX0lOVEVSRkFDRV9QQVRIU0NBTEUpICYmIGRlZmluZWQoX182NEJJVF9fKSkKK3ZvaWQgIEJMQVNGVU5DKGNkb3R1KSAgKGZsb2F0ICosICBpbnQgKiwgZmxvYXQgICogLCBpbnQgKiwgZmxvYXQgICosICBpbnQgKik7Cit2b2lkICBCTEFTRlVOQyhjZG90YykgIChmbG9hdCAqLCAgaW50ICosIGZsb2F0ICAqLCAgaW50ICosIGZsb2F0ICAqLCAgaW50ICopOwordm9pZCAgQkxBU0ZVTkMoemRvdHUpICAoZG91YmxlICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKK3ZvaWQgIEJMQVNGVU5DKHpkb3RjKSAgKGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKik7Cit2b2lkICBCTEFTRlVOQyh4ZG90dSkgIChkb3VibGUgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOwordm9pZCAgQkxBU0ZVTkMoeGRvdGMpICAoZG91YmxlICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKKyNlbHNlCitzdGQ6OmNvbXBsZXg8ZmxvYXQ+ICAgQkxBU0ZVTkMoY2RvdHUpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK3N0ZDo6Y29tcGxleDxmbG9hdD4gICBCTEFTRlVOQyhjZG90YykgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworc3RkOjpjb21wbGV4PGRvdWJsZT4gIEJMQVNGVU5DKHpkb3R1KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKK3N0ZDo6Y29tcGxleDxkb3VibGU+ICBCTEFTRlVOQyh6ZG90YykgIChpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKik7Citkb3VibGUgIEJMQVNGVU5DKHhkb3R1KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKK2RvdWJsZSAgQkxBU0ZVTkMoeGRvdGMpICAoaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOworI2VuZGlmCisKK2ludCAgQkxBU0ZVTkMoY2RvdHV3KSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQqKTsKK2ludCAgQkxBU0ZVTkMoY2RvdGN3KSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQqKTsKK2ludCAgQkxBU0ZVTkMoemRvdHV3KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUqKTsKK2ludCAgQkxBU0ZVTkMoemRvdGN3KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUqKTsKKworaW50ICAgIEJMQVNGVU5DKHNheHB5KSAoaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoZGF4cHkpIChpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhxYXhweSkgKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNheHB5KSAoaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoemF4cHkpIChpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh4YXhweSkgKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNheHB5YykoaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoemF4cHljKShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh4YXhweWMpKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoc2NvcHkpIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGRjb3B5KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhxY29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoY2NvcHkpIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHpjb3B5KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh4Y29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhzc3dhcCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoZHN3YXApIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHFzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhjc3dhcCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoenN3YXApIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKHhzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworZmxvYXQgIEJMQVNGVU5DKHNhc3VtKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2Nhc3VtKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkYXN1bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFhc3VtKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZHphc3VtKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxeGFzdW0pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoaXNhbWF4KShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpZGFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlxYW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWNhbWF4KShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpemFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl4YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCAgICBCTEFTRlVOQyhpc21heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlkbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXFtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpY21heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl6bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXhtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKGlzYW1pbikoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWRhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpcWFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGljYW1pbikoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaXphbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpeGFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgICAgQkxBU0ZVTkMoaXNtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGlkbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpcW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoaWNtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGl6bWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhpeG1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2Zsb2F0ICBCTEFTRlVOQyhzYW1heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRhbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocWFtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzY2FtYXgpKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworZmxvYXQgIEJMQVNGVU5DKHNhbWluKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZGFtaW4pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxYW1pbikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZmxvYXQgIEJMQVNGVU5DKHNjYW1pbikoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZHphbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxeGFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitmbG9hdCAgQkxBU0ZVTkMoc21heCkgIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkbWF4KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFtYXgpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCAgQkxBU0ZVTkMoc2NtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkem1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2Zsb2F0ICBCTEFTRlVOQyhzbWluKSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRtaW4pICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocW1pbikgIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzY21pbikgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6bWluKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhtaW4pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNzY2FsKSAoaW50ICosICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyhkc2NhbCkgKGludCAqLCAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMocXNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNzY2FsKSAoaW50ICosICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh6c2NhbCkgKGludCAqLCAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeHNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50ICAgIEJMQVNGVU5DKGNzc2NhbCkoaW50ICosICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCAgICBCTEFTRlVOQyh6ZHNjYWwpKGludCAqLCAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgICAgQkxBU0ZVTkMoeHFzY2FsKShpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitmbG9hdCAgQkxBU0ZVTkMoc25ybTIpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2Zsb2F0ICBCTEFTRlVOQyhzY25ybTIpKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworCitkb3VibGUgQkxBU0ZVTkMoZG5ybTIpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxbnJtMikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6bnJtMikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhucm0yKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKKworaW50ICAgIEJMQVNGVU5DKHNyb3QpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKGRyb3QpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHFyb3QpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKGNzcm90KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICopOworaW50ICAgIEJMQVNGVU5DKHpkcm90KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHhxcm90KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworCitpbnQgICAgQkxBU0ZVTkMoc3JvdGcpIChmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKik7CitpbnQgICAgQkxBU0ZVTkMoZHJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgICAgQkxBU0ZVTkMocXJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgICAgQkxBU0ZVTkMoY3JvdGcpIChmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKik7CitpbnQgICAgQkxBU0ZVTkMoenJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgICAgQkxBU0ZVTkMoeHJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CisKK2ludCAgICBCTEFTRlVOQyhzcm90bWcpKGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKik7CitpbnQgICAgQkxBU0ZVTkMoZHJvdG1nKShkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworCitpbnQgICAgQkxBU0ZVTkMoc3JvdG0pIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKK2ludCAgICBCTEFTRlVOQyhkcm90bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50ICAgIEJMQVNGVU5DKHFyb3RtKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CisKKy8qIExldmVsIDIgcm91dGluZXMgKi8KKworaW50IEJMQVNGVU5DKHNnZXIpKGludCAqLCAgICBpbnQgKiwgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLAorCQkgICBmbG9hdCAqLCAgaW50ICosIGZsb2F0ICosICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlcikoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlcikoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlcnUpKGludCAqLCAgICBpbnQgKiwgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLAorCQkgICAgZmxvYXQgKiwgIGludCAqLCBmbG9hdCAqLCAgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXJjKShpbnQgKiwgICAgaW50ICosIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICosICBpbnQgKiwgZmxvYXQgKiwgIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VydSkoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXJjKShpbnQgKiwgICAgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlcnUpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VyYykoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dlbXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cHN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3RybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRybXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3Ric3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3Ric3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3ltdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3ltdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzeW12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5bXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwgaW50ICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5bXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c3ltdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3NwbXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3BtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXNwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzcG12KSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenNwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzcG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzeXIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5cikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3lyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzeXIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5cikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c3lyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3N5cjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5cjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5cjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5cjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3ByKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoZHNwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICopOworaW50IEJMQVNGVU5DKHFzcHIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjc3ByKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosCisJCSAgICBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoenNwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICopOworaW50IEJMQVNGVU5DKHhzcHIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqKTsKKworaW50IEJMQVNGVU5DKHNzcHIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoZHNwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhxc3ByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKGNzcHIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7CitpbnQgQkxBU0ZVTkMoenNwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCisJCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4c3ByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworCitpbnQgQkxBU0ZVTkMoY2hlcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaHByKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKK2ludCBCTEFTRlVOQyh6aHByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4aHByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKKworaW50IEJMQVNGVU5DKGNoZXIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpoZXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hwcjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCisJCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKK2ludCBCTEFTRlVOQyh6aHByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKKwkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHhocHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAorCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CisKK2ludCBCTEFTRlVOQyhjaGVtdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZW12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaHBtdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLAorCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpocG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKKwkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aHBtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCisJCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzbm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZG5vcm0pKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNub3JtKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6bm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGJtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKKy8qIExldmVsIDMgcm91dGluZXMgKi8KKworaW50IEJMQVNGVU5DKHNnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLAorCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNnZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLAorCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLAorCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHN0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBmbG9hdCAqLCAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRyc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBmbG9hdCAqLCAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRyc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3RybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAorCSAgIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCisJICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzeW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNzeW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3ltbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5bW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3N5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzc3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCisJICAgZmxvYXQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNoZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoY2hlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpoZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhjaGVyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKGNoZXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkgICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCSAgIGRvdWJsZSosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNoZXIybSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCSAgIGZsb2F0ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyMm0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKKwkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlcjJtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAorCQkgICAgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCisJCSAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAorCQkgICAgZG91YmxlICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwKKwkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAorCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosCisJCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosCisJCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZW1zKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKKwkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLAorCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCisJCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dldGYyKShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2V0ZjIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXRmMikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dldGYyKShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2V0ZjIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZXRmMikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2V0cmYpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdldHJmKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2V0cmYpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdldHJmKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNsYXN3cCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNsYXN3cCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc2dldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzZ2VzdikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlc3YpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VzdikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlc3YpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNwb3RmMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHBvdGYyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxcG90ZjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNwb3RmMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenBvdGYyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4cG90ZjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3BvdHJmKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkcG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFwb3RyZikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3BvdHJmKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6cG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhwb3RyZikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzbGF1dTIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRsYXV1MikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjbGF1dTIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpsYXV1MikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNsYXV1bSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGxhdXVtKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxbGF1dW0pKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNsYXV1bSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemxhdXVtKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4bGF1dW0pKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCitpbnQgQkxBU0ZVTkMoc3RydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CisKK2ludCBCTEFTRlVOQyhzdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKKworaW50IEJMQVNGVU5DKHNwb3RyaSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxcG90cmkpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNwb3RyaSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4cG90cmkpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL0JMQVMvYmxhc19pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTA1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsODMgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBibGFzX2ludGVyZmFjZS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MjggQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIGJsYXNfUFJPRFVJVF9NQVRSSUNFX1ZFQ1RFVVJfSEgKKyNkZWZpbmUgYmxhc19QUk9EVUlUX01BVFJJQ0VfVkVDVEVVUl9ISAorCisjaW5jbHVkZSA8Y19pbnRlcmZhY2VfYmFzZS5oPgorI2luY2x1ZGUgPGNvbXBsZXg+CitleHRlcm4gIkMiCit7CisjaW5jbHVkZSAiYmxhcy5oIgorCisgIC8vIENob2xlc2t5IEZhY3Rvcml6YXRpb24KKy8vICAgdm9pZCBzcG90cmZfKGNvbnN0IGNoYXIqIHVwbG8sIGNvbnN0IGludCogbiwgZmxvYXQgKmEsIGNvbnN0IGludCogbGQsIGludCogaW5mbyk7CisvLyAgIHZvaWQgZHBvdHJmXyhjb25zdCBjaGFyKiB1cGxvLCBjb25zdCBpbnQqIG4sIGRvdWJsZSAqYSwgY29uc3QgaW50KiBsZCwgaW50KiBpbmZvKTsKKyAgdm9pZCBzc3l0cmRfKGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbiwgZmxvYXQgKmEsIGNvbnN0IGludCAqbGRhLCBmbG9hdCAqZCwgZmxvYXQgKmUsIGZsb2F0ICp0YXUsIGZsb2F0ICp3b3JrLCBpbnQgKmx3b3JrLCBpbnQgKmluZm8gKTsKKyAgdm9pZCBkc3l0cmRfKGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbiwgZG91YmxlICphLCBjb25zdCBpbnQgKmxkYSwgZG91YmxlICpkLCBkb3VibGUgKmUsIGRvdWJsZSAqdGF1LCBkb3VibGUgKndvcmssIGludCAqbHdvcmssIGludCAqaW5mbyApOworICB2b2lkIHNnZWhyZF8oIGNvbnN0IGludCAqbiwgaW50ICppbG8sIGludCAqaWhpLCBmbG9hdCAqYSwgY29uc3QgaW50ICpsZGEsIGZsb2F0ICp0YXUsIGZsb2F0ICp3b3JrLCBpbnQgKmx3b3JrLCBpbnQgKmluZm8gKTsKKyAgdm9pZCBkZ2VocmRfKCBjb25zdCBpbnQgKm4sIGludCAqaWxvLCBpbnQgKmloaSwgZG91YmxlICphLCBjb25zdCBpbnQgKmxkYSwgZG91YmxlICp0YXUsIGRvdWJsZSAqd29yaywgaW50ICpsd29yaywgaW50ICppbmZvICk7CisKKyAgLy8gTFUgcm93IHBpdm90aW5nCisvLyAgIHZvaWQgZGdldHJmXyggaW50ICptLCBpbnQgKm4sIGRvdWJsZSAqYSwgaW50ICpsZGEsIGludCAqaXBpdiwgaW50ICppbmZvICk7CisvLyAgIHZvaWQgc2dldHJmXyhjb25zdCBpbnQqIG0sIGNvbnN0IGludCogbiwgZmxvYXQgKmEsIGNvbnN0IGludCogbGQsIGludCogaXBpdm90LCBpbnQqIGluZm8pOworICAvLyBMVSBmdWxsIHBpdm90aW5nCisgIHZvaWQgc2dldGMyXyhjb25zdCBpbnQqIG4sIGZsb2F0ICphLCBjb25zdCBpbnQgKmxkYSwgaW50ICppcGl2LCBpbnQgKmpwaXYsIGludCppbmZvICk7CisgIHZvaWQgZGdldGMyXyhjb25zdCBpbnQqIG4sIGRvdWJsZSAqYSwgY29uc3QgaW50ICpsZGEsIGludCAqaXBpdiwgaW50ICpqcGl2LCBpbnQqaW5mbyApOworI2lmZGVmIEhBU19MQVBBQ0sKKyNlbmRpZgorfQorCisjZGVmaW5lIE1BS0VfU1RSSU5HMihTKSAjUworI2RlZmluZSBNQUtFX1NUUklORyhTKSBNQUtFX1NUUklORzIoUykKKworI2RlZmluZSBDQVQyKEEsQikgQSMjQgorI2RlZmluZSBDQVQoQSxCKSBDQVQyKEEsQikKKworCit0ZW1wbGF0ZTxjbGFzcyByZWFsPiBjbGFzcyBibGFzX2ludGVyZmFjZTsKKworCitzdGF0aWMgY2hhciBub3RyYW5zID0gJ04nOworc3RhdGljIGNoYXIgdHJhbnMgPSAnVCc7CitzdGF0aWMgY2hhciBub251bml0ID0gJ04nOworc3RhdGljIGNoYXIgbG93ZXIgPSAnTCc7CitzdGF0aWMgY2hhciByaWdodCA9ICdSJzsKK3N0YXRpYyBjaGFyIGxlZnQgPSAnTCc7CitzdGF0aWMgaW50IGludG9uZSA9IDE7CisKKworCisjZGVmaW5lIFNDQUxBUiAgICAgICAgZmxvYXQKKyNkZWZpbmUgU0NBTEFSX1BSRUZJWCBzCisjaW5jbHVkZSAiYmxhc19pbnRlcmZhY2VfaW1wbC5oaCIKKyN1bmRlZiBTQ0FMQVIKKyN1bmRlZiBTQ0FMQVJfUFJFRklYCisKKworI2RlZmluZSBTQ0FMQVIgICAgICAgIGRvdWJsZQorI2RlZmluZSBTQ0FMQVJfUFJFRklYIGQKKyNpbmNsdWRlICJibGFzX2ludGVyZmFjZV9pbXBsLmhoIgorI3VuZGVmIFNDQUxBUgorI3VuZGVmIFNDQUxBUl9QUkVGSVgKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlX2ltcGwuaGggYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlX2ltcGwuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4NGRmMAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL0JMQVMvYmxhc19pbnRlcmZhY2VfaW1wbC5oaApAQCAtMCwwICsxLDE1MSBAQAorCisjZGVmaW5lIEJMQVNfRlVOQyhOQU1FKSBDQVQoQ0FUKFNDQUxBUl9QUkVGSVgsTkFNRSksXykKKwordGVtcGxhdGU8PiBjbGFzcyBibGFzX2ludGVyZmFjZTxTQ0FMQVI+IDogcHVibGljIGNfaW50ZXJmYWNlX2Jhc2U8U0NBTEFSPgoreworCitwdWJsaWMgOgorICAKKyAgc3RhdGljIFNDQUxBUiBmb25lOworICBzdGF0aWMgU0NBTEFSIGZ6ZXJvOworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSgpCisgIHsKKyAgICByZXR1cm4gTUFLRV9TVFJJTkcoQ0JMQVNOQU1FKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIEJMQVNfRlVOQyhnZW12KSgmbm90cmFucywmTiwmTiwmZm9uZSxBLCZOLEIsJmludG9uZSwmZnplcm8sWCwmaW50b25lKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzeW12KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoc3ltdikoJmxvd2VyLCAmTiwmZm9uZSxBLCZOLEIsJmludG9uZSwmZnplcm8sWCwmaW50b25lKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzeXIyKGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoc3lyMikoJmxvd2VyLCZOLCZmb25lLEIsJmludG9uZSxYLCZpbnRvbmUsQSwmTik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgZ2VyKGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoZ2VyKSgmTiwmTiwmZm9uZSxYLCZpbnRvbmUsWSwmaW50b25lLEEsJk4pOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHJvdChnZW5lX3ZlY3RvciAmIEEsICBnZW5lX3ZlY3RvciAmIEIsIFNDQUxBUiBjLCBTQ0FMQVIgcywgaW50IE4peworICAgIEJMQVNfRlVOQyhyb3QpKCZOLEEsJmludG9uZSxCLCZpbnRvbmUsJmMsJnMpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoZ2VtdikoJnRyYW5zLCZOLCZOLCZmb25lLEEsJk4sQiwmaW50b25lLCZmemVybyxYLCZpbnRvbmUpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgQkxBU19GVU5DKGdlbW0pKCZub3RyYW5zLCZub3RyYW5zLCZOLCZOLCZOLCZmb25lLEEsJk4sQiwmTiwmZnplcm8sWCwmTik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIEJMQVNfRlVOQyhnZW1tKSgmbm90cmFucywmbm90cmFucywmTiwmTiwmTiwmZm9uZSxBLCZOLEIsJk4sJmZ6ZXJvLFgsJk4pOworICB9CisKKy8vICAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisvLyAgICAgc3N5cmtfKCZsb3dlciwmdHJhbnMsJk4sJk4sJmZvbmUsQSwmTiwmZnplcm8sWCwmTik7CisvLyAgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoc3lyaykoJmxvd2VyLCZub3RyYW5zLCZOLCZOLCZmb25lLEEsJk4sJmZ6ZXJvLFgsJk4pOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoU0NBTEFSIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgQkxBU19GVU5DKGF4cHkpKCZOLCZjb2VmLFgsJmludG9uZSxZLCZpbnRvbmUpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KFNDQUxBUiBhLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIFNDQUxBUiBiLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoc2NhbCkoJk4sJmIsWSwmaW50b25lKTsKKyAgICBCTEFTX0ZVTkMoYXhweSkoJk4sJmEsWCwmaW50b25lLFksJmludG9uZSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY2hvbGVza3koY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgICBpbnQgTjIgPSBOKk47CisgICAgQkxBU19GVU5DKGNvcHkpKCZOMiwgWCwgJmludG9uZSwgQywgJmludG9uZSk7CisgICAgY2hhciB1cGxvID0gJ0wnOworICAgIGludCBpbmZvID0gMDsKKyAgICBCTEFTX0ZVTkMocG90cmYpKCZ1cGxvLCAmTiwgQywgJk4sICZpbmZvKTsKKyAgICBpZihpbmZvIT0wKSBzdGQ6OmNlcnIgPDwgInBvdHJmXyBlcnJvciAiIDw8IGluZm8gPDwgIlxuIjsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBwYXJ0aWFsX2x1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICAgIGludCBOMiA9IE4qTjsKKyAgICBCTEFTX0ZVTkMoY29weSkoJk4yLCBYLCAmaW50b25lLCBDLCAmaW50b25lKTsKKyAgICBjaGFyIHVwbG8gPSAnTCc7CisgICAgaW50IGluZm8gPSAwOworICAgIGludCAqIGlwaXYgPSAoaW50KilhbGxvY2Eoc2l6ZW9mKGludCkqTik7CisgICAgQkxBU19GVU5DKGdldHJmKSgmTiwgJk4sIEMsICZOLCBpcGl2LCAmaW5mbyk7CisgICAgaWYoaW5mbyE9MCkgc3RkOjpjZXJyIDw8ICJnZXRyZl8gZXJyb3IgIiA8PCBpbmZvIDw8ICJcbiI7CisgIH0KKyAgCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkMoY29weSkoJk4sIEIsICZpbnRvbmUsIFgsICZpbnRvbmUpOworICAgIEJMQVNfRlVOQyh0cnN2KSgmbG93ZXIsICZub3RyYW5zLCAmbm9udW5pdCwgJk4sIEwsICZOLCBYLCAmaW50b25lKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcl9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgQkxBU19GVU5DKGNvcHkpKCZOLCBCLCAmaW50b25lLCBYLCAmaW50b25lKTsKKyAgICBCTEFTX0ZVTkModHJzbSkoJnJpZ2h0LCAmbG93ZXIsICZub3RyYW5zLCAmbm9udW5pdCwgJk4sICZOLCAmZm9uZSwgTCwgJk4sIFgsICZOKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cm1tKGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBCTEFTX0ZVTkModHJtbSkoJmxlZnQsICZsb3dlciwgJm5vdHJhbnMsJm5vbnVuaXQsICZOLCZOLCZmb25lLEEsJk4sQiwmTik7CisgIH0KKworICAjaWZkZWYgSEFTX0xBUEFDSworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBsdV9kZWNvbXAoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgICBpbnQgTjIgPSBOKk47CisgICAgQkxBU19GVU5DKGNvcHkpKCZOMiwgWCwgJmludG9uZSwgQywgJmludG9uZSk7CisgICAgY2hhciB1cGxvID0gJ0wnOworICAgIGludCBpbmZvID0gMDsKKyAgICBpbnQgKiBpcGl2ID0gKGludCopYWxsb2NhKHNpemVvZihpbnQpKk4pOworICAgIGludCAqIGpwaXYgPSAoaW50KilhbGxvY2Eoc2l6ZW9mKGludCkqTik7CisgICAgQkxBU19GVU5DKGdldGMyKSgmTiwgQywgJk4sIGlwaXYsIGpwaXYsICZpbmZvKTsKKyAgfQorCisKKworICBzdGF0aWMgaW5saW5lIHZvaWQgaGVzc2VuYmVyZyhjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICAgIHsKKyAgICAgIGludCBOMiA9IE4qTjsKKyAgICAgIGludCBpbmMgPSAxOworICAgICAgQkxBU19GVU5DKGNvcHkpKCZOMiwgWCwgJmluYywgQywgJmluYyk7CisgICAgfQorICAgIGludCBpbmZvID0gMDsKKyAgICBpbnQgaWxvID0gMTsKKyAgICBpbnQgaWhpID0gTjsKKyAgICBpbnQgYnNpemUgPSA2NDsKKyAgICBpbnQgd29ya3NpemUgPSBOKmJzaXplOworICAgIFNDQUxBUiogZCA9IG5ldyBTQ0FMQVJbTit3b3Jrc2l6ZV07CisgICAgQkxBU19GVU5DKGdlaHJkKSgmTiwgJmlsbywgJmloaSwgQywgJk4sIGQsIGQrTiwgJndvcmtzaXplLCAmaW5mbyk7CisgICAgZGVsZXRlW10gZDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkaWFnb25hbGl6YXRpb24oY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgICB7CisgICAgICBpbnQgTjIgPSBOKk47CisgICAgICBpbnQgaW5jID0gMTsKKyAgICAgIEJMQVNfRlVOQyhjb3B5KSgmTjIsIFgsICZpbmMsIEMsICZpbmMpOworICAgIH0KKyAgICBjaGFyIHVwbG8gPSAnVSc7CisgICAgaW50IGluZm8gPSAwOworICAgIGludCBpbG8gPSAxOworICAgIGludCBpaGkgPSBOOworICAgIGludCBic2l6ZSA9IDY0OworICAgIGludCB3b3Jrc2l6ZSA9IE4qYnNpemU7CisgICAgU0NBTEFSKiBkID0gbmV3IFNDQUxBUlszKk4rd29ya3NpemVdOworICAgIEJMQVNfRlVOQyhzeXRyZCkoJnVwbG8sICZOLCBDLCAmTiwgZCwgZCtOLCBkKzIqTiwgZCszKk4sICZ3b3Jrc2l6ZSwgJmluZm8pOworICAgIGRlbGV0ZVtdIGQ7CisgIH0KKyAgCisgICNlbmRpZiAvLyBIQVNfTEFQQUNLCisKK307CisKK1NDQUxBUiBibGFzX2ludGVyZmFjZTxTQ0FMQVI+Ojpmb25lID0gU0NBTEFSKDEpOworU0NBTEFSIGJsYXNfaW50ZXJmYWNlPFNDQUxBUj46OmZ6ZXJvID0gU0NBTEFSKDApOwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvQkxBUy9jX2ludGVyZmFjZV9iYXNlLmggYi9iZW5jaC9idGwvbGlicy9CTEFTL2NfaW50ZXJmYWNlX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTVkOGRjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvQkxBUy9jX2ludGVyZmFjZV9iYXNlLmgKQEAgLTAsMCArMSw3MyBAQAorCisjaWZuZGVmIEJUTF9DX0lOVEVSRkFDRV9CQVNFX0gKKyNkZWZpbmUgQlRMX0NfSU5URVJGQUNFX0JBU0VfSAorCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCit0ZW1wbGF0ZTxjbGFzcyByZWFsPiBjbGFzcyBjX2ludGVyZmFjZV9iYXNlCit7CisKK3B1YmxpYzoKKworICB0eXBlZGVmIHJlYWwgICAgICAgICAgICAgICAgICAgICAgcmVhbF90eXBlOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+ICAgICAgICAgc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gIHN0bF9tYXRyaXg7CisKKyAgdHlwZWRlZiByZWFsKiBnZW5lX21hdHJpeDsKKyAgdHlwZWRlZiByZWFsKiBnZW5lX3ZlY3RvcjsKKworICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKXsKKyAgICBkZWxldGUgQTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgQil7CisgICAgZGVsZXRlIEI7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKKyAgICBBID0gbmV3IHJlYWxbTipOXTsKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKykKKyAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQorICAgICAgICBBW2krTipqXSA9IEFfc3RsW2pdW2ldOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgaW50IE4gPSBCX3N0bC5zaXplKCk7CisgICAgQiA9IG5ldyByZWFsW05dOworICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQorICAgICAgQltpXSA9IEJfc3RsW2ldOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGludCBOID0gQl9zdGwuc2l6ZSgpOworICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQorICAgICAgQl9zdGxbaV0gPSBCW2ldOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIGludCBOID0gQV9zdGwuc2l6ZSgpOworICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAgIEFfc3RsW2pdLnJlc2l6ZShOKTsKKyAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQorICAgICAgICBBX3N0bFtqXVtpXSA9IEFbaStOKmpdOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4peworICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQorICAgICAgY2libGVbaV09c291cmNlW2ldOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgICBjaWJsZVtpK04qal0gPSBzb3VyY2VbaStOKmpdOworICAgICAgfQorICAgIH0KKyAgfQorCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL0JMQVMvbWFpbi5jcHAgYi9iZW5jaC9idGwvbGlicy9CTEFTL21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDdjOWYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL21haW4uY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBtYWluLmNwcAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MjggQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiYmxhc19pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworI2luY2x1ZGUgImFjdGlvbl9jaG9sZXNreS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fbHVfZGVjb21wLmhoIgorI2luY2x1ZGUgImFjdGlvbl9wYXJ0aWFsX2x1LmhoIgorI2luY2x1ZGUgImFjdGlvbl90cmlzb2x2ZV9tYXRyaXguaGgiCisKKyNpZmRlZiBIQVNfTEFQQUNLCisjaW5jbHVkZSAiYWN0aW9uX2hlc3NlbmJlcmcuaGgiCisjZW5kaWYKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKworICBiZW5jaDxBY3Rpb25fYXhweTxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9heHBieTxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fc3ltdjxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3N5cjI8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX2dlcjxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3JvdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlPGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpc29sdmVfbWF0cml4PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl90cm1tPGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl9jaG9sZXNreTxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3BhcnRpYWxfbHU8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgI2lmZGVmIEhBU19MQVBBQ0sKKyAgYmVuY2g8QWN0aW9uX2x1X2RlY29tcDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2hlc3NlbmJlcmc8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb248Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgICNlbmRpZgorCisgIC8vYmVuY2g8QWN0aW9uX2x1X3NvbHZlPGJsYXNfTFVfc29sdmVfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL1NUTC9DTWFrZUxpc3RzLnR4dCBiL2JlbmNoL2J0bC9saWJzL1NUTC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2ZjMmRjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvU1RML0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMiBAQAorCitidGxfYWRkX2JlbmNoKGJ0bF9TVEwgbWFpbi5jcHAgT0ZGKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvU1RML1NUTF9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9TVEwvU1RMX2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2U3NmJkCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvU1RML1NUTF9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwyNDQgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBTVExfaW50ZXJmYWNlLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoyNCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgU1RMX0lOVEVSRkFDRV9ISAorI2RlZmluZSBTVExfSU5URVJGQUNFX0hICisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8Y2xhc3MgcmVhbD4KK2NsYXNzIFNUTF9pbnRlcmZhY2V7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIHN0bF9tYXRyaXggZ2VuZV9tYXRyaXg7CisKKyAgdHlwZWRlZiBzdGxfdmVjdG9yIGdlbmVfdmVjdG9yOworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gIlNUTCI7CisgIH0KKworICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKXt9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXt9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgQSA9IEFfc3RsOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgQiA9IEJfc3RsOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIEJfc3RsID0gQiA7CisgIH0KKworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBBX3N0bCA9IEEgOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgTil7CisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgY2libGVbaV09c291cmNlW2ldOworICAgIH0KKyAgfQorCisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCisgICAgICBmb3IgKGludCBqPTA7ajxOO2orKykKKyAgICAgICAgY2libGVbaV1bal09c291cmNlW2ldW2pdOworICB9CisKKy8vICAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTikKKy8vICAgeworLy8gICAgIHJlYWwgc29tbWU7CisvLyAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworLy8gICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworLy8gICAgICAgICBzb21tZT0wLjA7CisvLyAgICAgICAgIGZvciAoaW50IGs9MDtrPE47aysrKQorLy8gICAgICAgICAgIHNvbW1lICs9IEFbaV1ba10qQVtqXVtrXTsKKy8vICAgICAgICAgWFtqXVtpXT1zb21tZTsKKy8vICAgICAgIH0KKy8vICAgICB9CisvLyAgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKQorICB7CisgICAgcmVhbCBzb21tZTsKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICAgIHNvbW1lPTAuMDsKKyAgICAgICAgaWYoaT49aikKKyAgICAgICAgeworICAgICAgICAgIGZvciAoaW50IGs9MDtrPE47aysrKXsKKyAgICAgICAgICAgIHNvbW1lKz1BW2tdW2ldKkFba11bal07CisgICAgICAgICAgfQorICAgICAgICAgIFhbal1baV09c29tbWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pCisgIHsKKyAgICByZWFsIHNvbW1lOworICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICAgICAgc29tbWU9MC4wOworICAgICAgICBmb3IgKGludCBrPTA7azxOO2srKykKKyAgICAgICAgICBzb21tZSs9QVtrXVtpXSpCW2pdW2tdOworICAgICAgICBYW2pdW2ldPXNvbW1lOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pCisgIHsKKyAgICByZWFsIHNvbW1lOworICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICAgIHNvbW1lPTAuMDsKKyAgICAgIGZvciAoaW50IGo9MDtqPE47aisrKQorICAgICAgICBzb21tZSs9QVtqXVtpXSpCW2pdOworICAgICAgWFtpXT1zb21tZTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgc3ltdihnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTikKKyAgeworICAgIGZvciAoaW50IGo9MDsgajxOOyArK2opCisgICAgICBYW2pdID0gMDsKKyAgICBmb3IgKGludCBqPTA7IGo8TjsgKytqKQorICAgIHsKKyAgICAgIHJlYWwgdDEgPSBCW2pdOworICAgICAgcmVhbCB0MiA9IDA7CisgICAgICBYW2pdICs9IHQxICogQVtqXVtqXTsKKyAgICAgIGZvciAoaW50IGk9aisxOyBpPE47ICsraSkgeworICAgICAgICBYW2ldICs9IHQxICogQVtqXVtpXTsKKyAgICAgICAgdDIgKz0gQVtqXVtpXSAqIEJbaV07CisgICAgICB9CisgICAgICBYW2pdICs9IHQyOworICAgIH0KKyAgfQorICAKKyAgc3RhdGljIGlubGluZSB2b2lkIHN5cjIoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pCisgIHsKKyAgICBmb3IgKGludCBqPTA7IGo8TjsgKytqKQorICAgIHsKKyAgICAgIGZvciAoaW50IGk9ajsgaTxOOyArK2kpCisgICAgICAgIEFbal1baV0gKz0gQltpXSpYW2pdICsgQltqXSpYW2ldOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXIoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pCisgIHsKKyAgICBmb3IgKGludCBqPTA7IGo8TjsgKytqKQorICAgIHsKKyAgICAgIGZvciAoaW50IGk9ajsgaTxOOyArK2kpCisgICAgICAgIEFbal1baV0gKz0gWFtpXSpZW2pdOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTikKKyAgeworICAgIHJlYWwgc29tbWU7CisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgc29tbWUgPSAwLjA7CisgICAgICBmb3IgKGludCBqPTA7ajxOO2orKykKKyAgICAgICAgc29tbWUgKz0gQVtpXVtqXSpCW2pdOworICAgICAgWFtpXSA9IHNvbW1lOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgIFlbaV0rPWNvZWYqWFtpXTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShyZWFsIGEsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgIFlbaV0gPSBhKlhbaV0gKyBiKllbaV07CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIGNvcHlfdmVjdG9yKEIsWCxOKTsKKyAgICBmb3IoaW50IGk9MDsgaTxOOyArK2kpCisgICAgeworICAgICAgWFtpXSAvPSBMW2ldW2ldOworICAgICAgcmVhbCB0bXAgPSBYW2ldOworICAgICAgZm9yIChpbnQgaj1pKzE7IGo8TjsgKytqKQorICAgICAgICBYW2pdIC09IHRtcCAqIExbaV1bal07CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSByZWFsIG5vcm1fZGlmZihjb25zdCBzdGxfdmVjdG9yICYgQSwgY29uc3Qgc3RsX3ZlY3RvciAmIEIpCisgIHsKKyAgICBpbnQgTj1BLnNpemUoKTsKKyAgICByZWFsIHNvbW1lPTAuMDsKKyAgICByZWFsIHNvbW1lMj0wLjA7CisKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICByZWFsIGRpZmY9QVtpXS1CW2ldOworICAgICAgc29tbWUrPWRpZmYqZGlmZjsKKyAgICAgIHNvbW1lMis9QVtpXSpBW2ldOworICAgIH0KKyAgICByZXR1cm4gc29tbWUvc29tbWUyOworICB9CisKKyAgc3RhdGljIGlubGluZSByZWFsIG5vcm1fZGlmZihjb25zdCBzdGxfbWF0cml4ICYgQSwgY29uc3Qgc3RsX21hdHJpeCAmIEIpCisgIHsKKyAgICBpbnQgTj1BWzBdLnNpemUoKTsKKyAgICByZWFsIHNvbW1lPTAuMDsKKyAgICByZWFsIHNvbW1lMj0wLjA7CisKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgICAgIHJlYWwgZGlmZj1BW2ldW2pdIC0gQltpXVtqXTsKKyAgICAgICAgc29tbWUgKz0gZGlmZipkaWZmOworICAgICAgICBzb21tZTIgKz0gQVtpXVtqXSpBW2ldW2pdOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzb21tZS9zb21tZTI7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgZGlzcGxheV92ZWN0b3IoY29uc3Qgc3RsX3ZlY3RvciAmIEEpCisgIHsKKyAgICBpbnQgTj1BLnNpemUoKTsKKyAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgICAgICBJTkZPUygiQVsiPDxpPDwiXT0iPDxBW2ldPDxlbmRsKTsKKyAgICB9CisgIH0KKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9TVEwvbWFpbi5jcHAgYi9iZW5jaC9idGwvbGlicy9TVEwvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3MzMyOAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL1NUTC9tYWluLmNwcApAQCAtMCwwICsxLDQyIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgbWFpbi5jcHAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjIzIENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNUTF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2g8QWN0aW9uX2F4cHk8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9heHBieTxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3N5bXY8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3N5cjI8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXRhX3Byb2R1Y3Q8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PFNUTF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy9ibGl0ei9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBhYjczCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNyBAQAorCitmaW5kX3BhY2thZ2UoQmxpdHopCisKK2lmIChCTElUWl9GT1VORCkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0JMSVRaX0lOQ0xVREVTfSkKKworICBidGxfYWRkX2JlbmNoKGJ0bF9ibGl0eiBidGxfYmxpdHouY3BwKQorICBpZiAoQlVJTERfYnRsX2JsaXR6KQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhidGxfYmxpdHogJHtCTElUWl9MSUJSQVJJRVN9KQorICBlbmRpZiAoQlVJTERfYnRsX2JsaXR6KQorCisgIGJ0bF9hZGRfYmVuY2goYnRsX3RpbnlfYmxpdHogYnRsX3RpbnlfYmxpdHouY3BwIE9GRikKKyAgaWYgKEJVSUxEX2J0bF90aW55X2JsaXR6KQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhidGxfdGlueV9ibGl0eiAke0JMSVRaX0xJQlJBUklFU30pCisgIGVuZGlmIChCVUlMRF9idGxfdGlueV9ibGl0eikKKworZW5kaWYgKEJMSVRaX0ZPVU5EKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjlmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9ibGl0ei9ibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwxOTIgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MzEgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisjaWZuZGVmIEJMSVRaX0xVX1NPTFZFX0lOVEVSRkFDRV9ISAorI2RlZmluZSBCTElUWl9MVV9TT0xWRV9JTlRFUkZBQ0VfSEgKKworI2luY2x1ZGUgImJsaXR6L2FycmF5LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCitCWl9VU0lOR19OQU1FU1BBQ0UoYmxpdHopCisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UgOiBwdWJsaWMgYmxpdHpfaW50ZXJmYWNlPHJlYWw+Cit7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBibGl0el9pbnRlcmZhY2U8cmVhbD46OmdlbmVfbWF0cml4IGdlbmVfbWF0cml4OworICB0eXBlZGVmIHR5cGVuYW1lIGJsaXR6X2ludGVyZmFjZTxyZWFsPjo6Z2VuZV92ZWN0b3IgZ2VuZV92ZWN0b3I7CisKKyAgdHlwZWRlZiBibGl0ejo6QXJyYXk8aW50LDE+IFBpdm90X1ZlY3RvcjsKKworICBpbmxpbmUgc3RhdGljIHZvaWQgbmV3X1Bpdm90X1ZlY3RvcihQaXZvdF9WZWN0b3IgJiBwaXZvdCxpbnQgTikKKyAgeworCisgICAgcGl2b3QucmVzaXplKE4pOworCisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgZnJlZV9QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICYgcGl2b3QpCisgIHsKKyAgICAKKyAgICByZXR1cm47CisKKyAgfQorCisKKyAgc3RhdGljIGlubGluZSByZWFsIG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciBCLCBpbnQgcm93LCBpbnQgY29sX3N0YXJ0LCBpbnQgY29sX2VuZCkKKyAgeworICAgIAorICAgIHJlYWwgc29tbWU9MC47CisgICAgCisgICAgZm9yIChpbnQgaj1jb2xfc3RhcnQgOyBqPGNvbF9lbmQrMSA7IGorKyl7CisJCisJc29tbWUrPUEocm93LGopKkIoaik7CisJCisgICAgfQorCisgICAgcmV0dXJuIHNvbW1lOworCisgIH0KKworCisKKworICBzdGF0aWMgaW5saW5lIHJlYWwgbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChnZW5lX21hdHJpeCAmIEEsIGludCByb3csIGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kLCBnZW5lX21hdHJpeCAmIEIsIGludCByb3dfc2hpZnQsIGludCBjb2wgKQorICB7CisgICAgCisgICAgcmVhbCBzb21tZT0wLjsKKyAgICAKKyAgICBmb3IgKGludCBqPWNvbF9zdGFydCA7IGo8Y29sX2VuZCsxIDsgaisrKXsKKwkKKwlzb21tZSs9QShyb3csaikqQihqK3Jvd19zaGlmdCxjb2wpOworCQorICAgIH0KKworICAgIHJldHVybiBzb21tZTsKKworICB9CisKKyAgaW5saW5lIHN0YXRpYyB2b2lkIExVX2ZhY3RvcihnZW5lX21hdHJpeCAmIExVLCBQaXZvdF9WZWN0b3IgJiBwaXZvdCwgaW50IE4pCisgIHsKKworICAgIEFTU0VSVCggTFUucm93cygpPT1MVS5jb2xzKCkgKSA7CisgICAgaW50IGluZGV4X21heCA9IDAgOworICAgIHJlYWwgYmlnID0gMC4gOworICAgIHJlYWwgdGhlU3VtID0gMC4gOworICAgIHJlYWwgZHVtID0gMC4gOworICAgIC8vIEdldCB0aGUgaW1wbGljaXQgc2NhbGluZyBpbmZvcm1hdGlvbiA6CisgICAgZ2VuZV92ZWN0b3IgSW1wbGljaXRTY2FsaW5nKCBOICkgOworICAgIGZvciggaW50IGk9MDsgaTxOOyBpKysgKSB7CisgICAgICBiaWcgPSAwLiA7CisgICAgICBmb3IoIGludCBqPTA7IGo8TjsgaisrICkgeworCWlmKCBhYnMoIExVKCBpLCBqICkgKT49YmlnICkgYmlnID0gYWJzKCBMVSggaSwgaiApICkgOworICAgICAgfQorICAgICAgaWYoIGJpZz09MC4gKSB7CisJSU5GT1MoICJibGl0el9MVV9mYWN0b3I6OlNpbmd1bGFyIG1hdHJpeCIgKSA7CisJZXhpdCggMCApIDsKKyAgICAgIH0KKyAgICAgIEltcGxpY2l0U2NhbGluZyggaSApID0gMS4vYmlnIDsKKyAgICB9CisgICAgLy8gTG9vcCBvdmVyIGNvbHVtbnMgb2YgQ3JvdXQncyBtZXRob2QgOgorICAgIGZvciggaW50IGo9MDsgajxOOyBqKysgKSB7CisgICAgICBmb3IoIGludCBpPTA7IGk8ajsgaSsrICkgeworCXRoZVN1bSA9IExVKCBpLCBqICkgOworCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBpLTEsIExVLCAwLCBqKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApLCBqICkgKSA7CisJTFUoIGksIGogKSA9IHRoZVN1bSA7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGxhcmdlc3QgcGl2b3QgZWxlbWVudCA6CisgICAgICBiaWcgPSAwLiA7CisgICAgICBmb3IoIGludCBpPWo7IGk8TjsgaSsrICkgeworCXRoZVN1bSA9IExVKCBpLCBqICkgOworCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBqLTEsIExVLCAwLCBqKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApLCBqICkgKSA7CisJTFUoIGksIGogKSA9IHRoZVN1bSA7CisJaWYoIChJbXBsaWNpdFNjYWxpbmcoIGkgKSphYnMoIHRoZVN1bSApKT49YmlnICkgeworCSAgZHVtID0gSW1wbGljaXRTY2FsaW5nKCBpICkqYWJzKCB0aGVTdW0gKSA7CisJICBiaWcgPSBkdW0gOworCSAgaW5kZXhfbWF4ID0gaSA7CisJfQorICAgICAgfQorICAgICAgLy8gSW50ZXJjaGFuZ2luZyByb3dzIGFuZCB0aGUgc2NhbGUgZmFjdG9yIDoKKyAgICAgIGlmKCBqIT1pbmRleF9tYXggKSB7CisJZm9yKCBpbnQgaz0wOyBrPE47IGsrKyApIHsKKwkgIGR1bSA9IExVKCBpbmRleF9tYXgsIGsgKSA7CisJICBMVSggaW5kZXhfbWF4LCBrICkgPSBMVSggaiwgayApIDsKKwkgIExVKCBqLCBrICkgPSBkdW0gOworCX0KKwlJbXBsaWNpdFNjYWxpbmcoIGluZGV4X21heCApID0gSW1wbGljaXRTY2FsaW5nKCBqICkgOworICAgICAgfQorICAgICAgcGl2b3QoIGogKSA9IGluZGV4X21heCA7CisgICAgICBpZiAoIExVKCBqLCBqICk9PTAuICkgTFUoIGosIGogKSA9IDEuZS0yMCA7CisgICAgICAvLyBEaXZpZGUgYnkgdGhlIHBpdm90IGVsZW1lbnQgOgorICAgICAgaWYoIGo8TiApIHsKKwlkdW0gPSAxLi9MVSggaiwgaiApIDsKKwlmb3IoIGludCBpPWorMTsgaTxOOyBpKysgKSBMVSggaSwgaiApICo9IGR1bSA7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgTFVfc29sdmUoY29uc3QgZ2VuZV9tYXRyaXggJiBMVSwgY29uc3QgUGl2b3RfVmVjdG9yIHBpdm90LCBnZW5lX3ZlY3RvciAmQiwgZ2VuZV92ZWN0b3IgWCwgaW50IE4pCisgIHsKKworICAgIC8vIFBvdXIgY29uc2VydmVyIGxlIG1lbWUgaGVhZGVyLCBvbiB0cmF2YWlsbGUgc3VyIFgsIGNvcGllIGR1IHNlY29uZC1tZW1icmUgQgorICAgIFggPSBCLmNvcHkoKSA7CisgICAgQVNTRVJUKCBMVS5yb3dzKCk9PUxVLmNvbHMoKSApIDsKKyAgICBmaXJzdEluZGV4IGluZEkgOworICAgIC8vIEZvcndhcmQgc3Vic3RpdHV0aW9uIDoKKyAgICBpbnQgaWkgPSAwIDsKKyAgICByZWFsIHRoZVN1bSA9IDAuIDsKKyAgICBmb3IoIGludCBpPTA7IGk8TjsgaSsrICkgeworICAgICAgaW50IGlwID0gcGl2b3QoIGkgKSA7CisgICAgICB0aGVTdW0gPSBYKCBpcCApIDsKKyAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaXAgKSA7CisgICAgICBYKCBpcCApID0gWCggaSApIDsKKyAgICAgIC8vICAgICAgQiggaXAgKSA9IEIoIGkgKSA7CisgICAgICBpZiggaWkgKSB7CisJdGhlU3VtIC09IG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoTFUsIFgsIGksIGlpLTEsIGktMSkgOworCS8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaWktMSwgaS0xICkgKSpYKCBSYW5nZSggaWktMSwgaS0xICkgKSApIDsKKwkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqQiggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7CisgICAgICB9IGVsc2UgaWYoIHRoZVN1bSApIHsKKwlpaSA9IGkrMSA7CisgICAgICB9CisgICAgICBYKCBpICkgPSB0aGVTdW0gOworICAgICAgLy8gICAgICBCKCBpICkgPSB0aGVTdW0gOworICAgIH0KKyAgICAvLyBCYWNrc3Vic3RpdHV0aW9uIDoKKyAgICBmb3IoIGludCBpPU4tMTsgaT49MDsgaS0tICkgeworICAgICAgdGhlU3VtID0gWCggaSApIDsKKyAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaSApIDsKKyAgICAgIHRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpKzEsIE4pIDsKKyAgICAgIC8vICAgICAgdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpKzEsIHRvRW5kICkgKSpYKCBSYW5nZSggaSsxLCB0b0VuZCApICkgKSA7CisgICAgICAvLyAgICAgIHRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaSsxLCB0b0VuZCApICkqQiggUmFuZ2UoIGkrMSwgdG9FbmQgKSApICkgOworICAgICAgLy8gU3RvcmUgYSBjb21wb25lbnQgb2YgdGhlIHNvbHV0aW9uIHZlY3RvciA6CisgICAgICBYKCBpICkgPSB0aGVTdW0vTFUoIGksIGkgKSA7CisgICAgICAvLyAgICAgIEIoIGkgKSA9IHRoZVN1bS9MVSggaSwgaSApIDsKKyAgICB9CisKKyAgfQorCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2JsaXR6L2JsaXR6X2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL2JsaXR6L2JsaXR6X2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjdjNDdjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovYmxpdHpfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTQ3IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgYmxpdHpfaW50ZXJmYWNlLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgQkxJVFpfSU5URVJGQUNFX0hICisjZGVmaW5lIEJMSVRaX0lOVEVSRkFDRV9ISAorCisjaW5jbHVkZSA8YmxpdHovYmxpdHouaD4KKyNpbmNsdWRlIDxibGl0ei9hcnJheS5oPgorI2luY2x1ZGUgPGJsaXR6L3ZlY3Rvci1ldC5oPgorI2luY2x1ZGUgPGJsaXR6L3ZlY3doZXJlLmg+CisjaW5jbHVkZSA8YmxpdHovbWF0cml4Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCitCWl9VU0lOR19OQU1FU1BBQ0UoYmxpdHopCisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyBibGl0el9pbnRlcmZhY2V7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIGJsaXR6OjpBcnJheTxyZWFsLCAyPiAgZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgYmxpdHo6OkFycmF5PHJlYWwsIDE+ICBnZW5lX3ZlY3RvcjsKKy8vICAgdHlwZWRlZiBibGl0ejo6TWF0cml4PHJlYWwsIGJsaXR6OjpDb2x1bW5NYWpvcj4gIGdlbmVfbWF0cml4OworLy8gICB0eXBlZGVmIGJsaXR6OjpWZWN0b3I8cmVhbD4gZ2VuZV92ZWN0b3I7CisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCkgeyByZXR1cm4gImJsaXR6IjsgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pe30KKworICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpe30KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBBLnJlc2l6ZShBX3N0bFswXS5zaXplKCksQV9zdGwuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKXsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspeworICAgICAgICBBKGksaik9QV9zdGxbal1baV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgQi5yZXNpemUoQl9zdGwuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgICAgIEIoaSk9Ql9zdGxbaV07CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgICAgQl9zdGxbaV09QihpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgaW50IE49QV9zdGwuc2l6ZSgpOworICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAgIEFfc3RsW2pdLnJlc2l6ZShOKTsKKyAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQorICAgICAgICBBX3N0bFtqXVtpXSA9IEEoaSxqKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKQorICB7CisgICAgZmlyc3RJbmRleCBpOworICAgIHNlY29uZEluZGV4IGo7CisgICAgdGhpcmRJbmRleCBrOworICAgIFggPSBzdW0oQShpLGspICogQihrLGopLCBrKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGFfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pCisgIHsKKyAgICBmaXJzdEluZGV4IGk7CisgICAgc2Vjb25kSW5kZXggajsKKyAgICB0aGlyZEluZGV4IGs7CisgICAgWCA9IHN1bShBKGssaSkgKiBBKGssaiksIGspOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTikKKyAgeworICAgIGZpcnN0SW5kZXggaTsKKyAgICBzZWNvbmRJbmRleCBqOworICAgIHRoaXJkSW5kZXggazsKKyAgICBYID0gc3VtKEEoaSxrKSAqIEEoaixrKSwgayk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKQorICB7CisgICAgZmlyc3RJbmRleCBpOworICAgIHNlY29uZEluZGV4IGo7CisgICAgWCA9IHN1bShBKGksaikqQihqKSxqKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTikKKyAgeworICAgIGZpcnN0SW5kZXggaTsKKyAgICBzZWNvbmRJbmRleCBqOworICAgIFggPSBzdW0oQShqLGkpICogQihqKSxqKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KGNvbnN0IHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKQorICB7CisgICAgZmlyc3RJbmRleCBpOworICAgIFkgPSBZKGkpICsgY29lZiAqIFgoaSk7CisgICAgLy9ZICs9IGNvZWYgKiBYOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgY2libGUgPSBzb3VyY2U7CisgICAgLy9jaWJsZS50ZW1wbGF0ZSBvcGVyYXRvcj08Z2VuZV9tYXRyaXg+KHNvdXJjZSk7CisvLyAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworLy8gICAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworLy8gICAgICAgICBjaWJsZShpLGopPXNvdXJjZShpLGopOworLy8gICAgICAgfQorLy8gICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4peworICAgIC8vY2libGUudGVtcGxhdGUgb3BlcmF0b3I9PGdlbmVfdmVjdG9yPihzb3VyY2UpOworICAgIGNpYmxlID0gc291cmNlOworICB9CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovYnRsX2JsaXR6LmNwcCBiL2JlbmNoL2J0bC9saWJzL2JsaXR6L2J0bF9ibGl0ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkMmI1OQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2JsaXR6L2J0bF9ibGl0ei5jcHAKQEAgLTAsMCArMSw1MSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIG1haW4uY3BwCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJibGl0el9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXhweS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fbHVfc29sdmUuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2F0YV9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hYXRfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXR2X3Byb2R1Y3QuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX2F4cHk8YmxpdHpfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKworICAvL2JlbmNoPEFjdGlvbl9sdV9zb2x2ZTxibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovYnRsX3RpbnlfYmxpdHouY3BwIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovYnRsX3RpbnlfYmxpdHouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZGRkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9ibGl0ei9idGxfdGlueV9ibGl0ei5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIG1haW4uY3BwCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJ0aW55X2JsaXR6X2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJzdGF0aWMvYmVuY2hfc3RhdGljLmhoIgorI2luY2x1ZGUgImFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXhweS5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9heHB5LHRpbnlfYmxpdHpfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCx0aW55X2JsaXR6X2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QsdGlueV9ibGl0el9pbnRlcmZhY2U+KCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovdGlueV9ibGl0el9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9ibGl0ei90aW55X2JsaXR6X2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjI2ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovdGlueV9ibGl0el9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwxMDYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICB0aW55X2JsaXR6X2ludGVyZmFjZS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MzAgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIFRJTllfQkxJVFpfSU5URVJGQUNFX0hICisjZGVmaW5lIFRJTllfQkxJVFpfSU5URVJGQUNFX0hICisKKyNpbmNsdWRlICJibGl0ei9hcnJheS5oIgorI2luY2x1ZGUgImJsaXR6L3RpbnkuaCIKKyNpbmNsdWRlICJibGl0ei90aW55bWF0LmgiCisjaW5jbHVkZSAiYmxpdHovdGlueXZlYy5oIgorI2luY2x1ZGUgPGJsaXR6L3Rpbnl2ZWMtZXQuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworQlpfVVNJTkdfTkFNRVNQQUNFKGJsaXR6KQorCit0ZW1wbGF0ZTxjbGFzcyByZWFsLCBpbnQgU0laRT4KK2NsYXNzIHRpbnlfYmxpdHpfaW50ZXJmYWNlCit7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIFRpbnlWZWN0b3I8cmVhbCxTSVpFPiBnZW5lX3ZlY3RvcjsKKyAgdHlwZWRlZiBUaW55TWF0cml4PHJlYWwsU0laRSxTSVpFPiBnZW5lX21hdHJpeDsKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7IHJldHVybiAidGlueV9ibGl0eiI7IH0KKworICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKXt9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXt9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgZm9yIChpbnQgaj0wOyBqPEFfc3RsLnNpemUoKSA7IGorKykKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspCisgICAgICAgIEEoaSxqKT1BX3N0bFtqXVtpXTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspCisgICAgICBCKGkpID0gQl9zdGxbaV07CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKykKKyAgICAgIEJfc3RsW2ldID0gQihpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKykKKyAgICB7CisgICAgICBBX3N0bFtqXS5yZXNpemUoTik7CisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgICAgQV9zdGxbal1baV0gPSBBKGksaik7CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspCisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgICAgY2libGUoaSxqKSA9IHNvdXJjZShpLGopOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgTil7CisgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgY2libGUoaSkgPSBzb3VyY2UoaSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWCA9IHByb2R1Y3QoQSxCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSBwcm9kdWN0KEEsQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgWSArPSBjb2VmICogWDsKKyAgfQorCit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL0NNYWtlTGlzdHMudHh0IGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZThmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxOSBAQAorCitmaW5kX3BhY2thZ2UoRWlnZW4yKQorCitpZihFSUdFTjJfRk9VTkQpCisKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyhCRUZPUkUgJHtFSUdFTjJfSU5DTFVERV9ESVJ9KQorICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjJfbGluZWFyIG1haW5fbGluZWFyLmNwcCkKKyAgYnRsX2FkZF9iZW5jaChidGxfZWlnZW4yX3ZlY21hdCBtYWluX3ZlY21hdC5jcHApCisgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuMl9tYXRtYXQgbWFpbl9tYXRtYXQuY3BwKQorICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjJfYWR2IG1haW5fYWR2LmNwcCAgICAgICkKKworICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4yX2xpbmVhciBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURCVExfUFJFRklYPWVpZ2VuMiIpCisgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjJfdmVjbWF0IENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREJUTF9QUkVGSVg9ZWlnZW4yIikKKyAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX2VpZ2VuMl9tYXRtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1EQlRMX1BSRUZJWD1laWdlbjIiKQorICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4yX2FkdiAgICBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURCVExfUFJFRklYPWVpZ2VuMiIpCisKKyAgYnRsX2FkZF9iZW5jaChidGxfdGlueV9laWdlbjIgYnRsX3RpbnlfZWlnZW4yLmNwcCBPRkYpCisKK2VuZGlmKCkgIyBFSUdFTjJfRk9VTkQKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9idGxfdGlueV9laWdlbjIuY3BwIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL2J0bF90aW55X2VpZ2VuMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1MTViZQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9idGxfdGlueV9laWdlbjIuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJlaWdlbjNfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgInN0YXRpYy9iZW5jaF9zdGF0aWMuaGgiCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9heHB5LmhoIgorI2luY2x1ZGUgImFjdGlvbl9sdV9zb2x2ZS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXRhX3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2FhdF9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hdHZfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fY2hvbGVza3kuaGgiCisjaW5jbHVkZSAiYWN0aW9uX3RyaXNvbHZlLmhoIgorCitCVExfTUFJTjsKKworaW50IG1haW4oKQoreworCisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXhweSxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F0dl9wcm9kdWN0LGVpZ2VuMl9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fY2hvbGVza3ksZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl90cmlzb2x2ZSxlaWdlbjJfaW50ZXJmYWNlPigpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9laWdlbjJfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL2VpZ2VuMl9pbnRlcmZhY2UuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmZTU4MQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9laWdlbjJfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTY4IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgRUlHRU4yX0lOVEVSRkFDRV9ISAorI2RlZmluZSBFSUdFTjJfSU5URVJGQUNFX0hICisvLyAjaW5jbHVkZSA8Y2JsYXMuaD4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL1FSPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJidGwuaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordGVtcGxhdGU8Y2xhc3MgcmVhbCwgaW50IFNJWkU9RHluYW1pYz4KK2NsYXNzIGVpZ2VuMl9pbnRlcmZhY2UKK3sKKworcHVibGljIDoKKworICBlbnVtIHtJc0ZpeGVkU2l6ZSA9IChTSVpFIT1EeW5hbWljKX07CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZTsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+IHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3Rvcj4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8cmVhbCxTSVpFLFNJWkU+IGdlbmVfbWF0cml4OworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8cmVhbCxTSVpFLDE+IGdlbmVfdmVjdG9yOworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICAjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NFKQorICAgIGlmIChTSVpFPT1EeW5hbWljKSByZXR1cm4gImVpZ2VuMiI7IGVsc2UgcmV0dXJuICJ0aW55X2VpZ2VuMiI7CisgICAgI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQUxUSVZFQykKKyAgICBpZiAoU0laRT09RHluYW1pYykgcmV0dXJuICJlaWdlbjIiOyBlbHNlIHJldHVybiAidGlueV9laWdlbjIiOworICAgICNlbHNlCisgICAgaWYgKFNJWkU9PUR5bmFtaWMpIHJldHVybiAiZWlnZW4yX25vdmVjIjsgZWxzZSByZXR1cm4gInRpbnlfZWlnZW4yX25vdmVjIjsKKyAgICAjZW5kaWYKKyAgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pIHt9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKSB7fQorCisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIEEucmVzaXplKEFfc3RsWzBdLnNpemUoKSwgQV9zdGwuc2l6ZSgpKTsKKworICAgIGZvciAoaW50IGo9MDsgajxBX3N0bC5zaXplKCkgOyBqKyspeworICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKyl7CisgICAgICAgIEEuY29lZmZSZWYoaSxqKSA9IEFfc3RsW2pdW2ldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBCLnJlc2l6ZShCX3N0bC5zaXplKCksMSk7CisKKyAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgICAgIEIuY29lZmZSZWYoaSkgPSBCX3N0bFtpXTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FICB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgICAgQl9zdGxbaV0gPSBCLmNvZWZmKGkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgaW50IE49QV9zdGwuc2l6ZSgpOworCisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgICAgQV9zdGxbal0ucmVzaXplKE4pOworICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgICBBX3N0bFtqXVtpXSA9IEEuY29lZmYoaSxqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBYID0gKEEqQikubGF6eSgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZWRfbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBYID0gKEEudHJhbnNwb3NlKCkqQi50cmFuc3Bvc2UoKSkubGF6eSgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWCA9IChBLnRyYW5zcG9zZSgpKkEpLmxhenkoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFggPSAoQSpBLnRyYW5zcG9zZSgpKS5sYXp5KCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBYID0gKEEqQikvKi5sYXp5KCkqLzsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgWCA9IChBLnRyYW5zcG9zZSgpKkIpLyoubGF6eSgpKi87CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShyZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgWSArPSBjb2VmICogWDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShyZWFsIGEsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBZID0gYSpYICsgYipZOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7CisgICAgY2libGUgPSBzb3VyY2U7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKKyAgICBjaWJsZSA9IHNvdXJjZTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4peworICAgIFggPSBMLnRlbXBsYXRlIG1hcmtlZDxMb3dlclRyaWFuZ3VsYXI+KCkuc29sdmVUcmlhbmd1bGFyKEIpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaXNvbHZlX2xvd2VyX21hdHJpeChjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCYgWCwgaW50IE4peworICAgIFggPSBMLnRlbXBsYXRlIG1hcmtlZDxMb3dlclRyaWFuZ3VsYXI+KCkuc29sdmVUcmlhbmd1bGFyKEIpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNob2xlc2t5KGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisgICAgQyA9IFgubGx0KCkubWF0cml4TCgpOworLy8gICAgIEMgPSBYOworLy8gICAgIENob2xlc2t5PGdlbmVfbWF0cml4Pjo6Y29tcHV0ZUluUGxhY2UoQyk7CisvLyAgICAgQ2hvbGVza3k8Z2VuZV9tYXRyaXg+Ojpjb21wdXRlSW5QbGFjZUJsb2NrKEMpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGx1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICAgIEMgPSBYLmx1KCkubWF0cml4TFUoKTsKKy8vICAgICBDID0gWC5pbnZlcnNlKCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisgICAgQyA9IFRyaWRpYWdvbmFsaXphdGlvbjxnZW5lX21hdHJpeD4oWCkucGFja2VkTWF0cml4KCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgaGVzc2VuYmVyZyhjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICAgIEMgPSBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxnZW5lX21hdHJpeD4oWCkucGFja2VkTWF0cml4KCk7CisgIH0KKworCisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fYWR2LmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX2Fkdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzMzY4OQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX2Fkdi5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImVpZ2VuMl9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYWN0aW9uX3RyaXNvbHZlLmhoIgorI2luY2x1ZGUgImFjdGlvbl90cmlzb2x2ZV9tYXRyaXguaGgiCisjaW5jbHVkZSAiYWN0aW9uX2Nob2xlc2t5LmhoIgorI2luY2x1ZGUgImFjdGlvbl9oZXNzZW5iZXJnLmhoIgorI2luY2x1ZGUgImFjdGlvbl9sdV9kZWNvbXAuaGgiCisvLyAjaW5jbHVkZSAiYWN0aW9uX3BhcnRpYWxfbHUuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisgIGJlbmNoPEFjdGlvbl90cmlzb2x2ZTxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpc29sdmVfbWF0cml4PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9jaG9sZXNreTxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fbHVfZGVjb21wPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9wYXJ0aWFsX2x1PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX2hlc3NlbmJlcmc8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbjxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX2xpbmVhci5jcHAgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl9saW5lYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2QxNmMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl9saW5lYXIuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJlaWdlbjJfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisKKyAgYmVuY2g8QWN0aW9uX2F4cHk8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9heHBieTxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKyAgCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX21hdG1hdC5jcHAgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl9tYXRtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOWRjOWMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl9tYXRtYXQuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJlaWdlbjJfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworLy8gICBiZW5jaDxBY3Rpb25fdHJtbTxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX3ZlY21hdC5jcHAgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl92ZWNtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNjZjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl92ZWNtYXQuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJlaWdlbjJfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9zeW12PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9zeXIyPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9nZXI8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKworICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9laWdlbjMvQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjYWUyMwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDY1IEBACisKKworaWYoKE5PVCBFSUdFTjNfSU5DTFVERV9ESVIpIEFORCBFaWdlbl9TT1VSQ0VfRElSKQorICAjIHVubGVzcyBFSUdFTjNfSU5DTFVERV9ESVIgaXMgZGVmaW5lZCwgbGV0J3MgdXNlIGN1cnJlbnQgRWlnZW4gdmVyc2lvbgorICBzZXQoRUlHRU4zX0lOQ0xVREVfRElSICR7RWlnZW5fU09VUkNFX0RJUn0pCisgIHNldChFSUdFTjNfRk9VTkQgVFJVRSkKK2Vsc2UoKQorICBmaW5kX3BhY2thZ2UoRWlnZW4zKQorZW5kaWYoKQorCitpZiAoRUlHRU4zX0ZPVU5EKQorCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtFSUdFTjNfSU5DTFVERV9ESVJ9KQorICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjNfbGluZWFyIG1haW5fbGluZWFyLmNwcCkKKyAgYnRsX2FkZF9iZW5jaChidGxfZWlnZW4zX3ZlY21hdCBtYWluX3ZlY21hdC5jcHApCisgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19tYXRtYXQgbWFpbl9tYXRtYXQuY3BwKQorICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjNfYWR2IG1haW5fYWR2LmNwcCAgICAgICkKKworICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4zX2xpbmVhciBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURCVExfUFJFRklYPWVpZ2VuMyIpCisgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfdmVjbWF0IENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtREJUTF9QUkVGSVg9ZWlnZW4zIikKKyAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX2VpZ2VuM19tYXRtYXQgQ09NUElMRV9GTEFHUyAiLWZuby1leGNlcHRpb25zIC1EQlRMX1BSRUZJWD1laWdlbjMiKQorICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4zX2FkdiAgICBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURCVExfUFJFRklYPWVpZ2VuMyIpCisKKyAgb3B0aW9uKEJUTF9CRU5DSF9OT0dDQ1ZFQyAiYWxzbyBiZW5jaCBFaWdlbiBleHBsaWNpdCB2ZWMgd2l0aG91dCBHQ0MncyBhdXRvIHZlYyIgT0ZGKQorICBpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDWFggQU5EIEJUTF9CRU5DSF9OT0dDQ1ZFQykKKyAgICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjNfbm9nY2N2ZWNfbGluZWFyIG1haW5fbGluZWFyLmNwcCkKKyAgICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjNfbm9nY2N2ZWNfdmVjbWF0IG1haW5fdmVjbWF0LmNwcCkKKyAgICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjNfbm9nY2N2ZWNfbWF0bWF0IG1haW5fbWF0bWF0LmNwcCkKKyAgICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjNfbm9nY2N2ZWNfYWR2ICAgIG1haW5fYWR2LmNwcCAgICkKKworICAgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfbm9nY2N2ZWNfbGluZWFyIENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtZm5vLXRyZWUtdmVjdG9yaXplIC1EQlRMX1BSRUZJWD1laWdlbjNfbm9nY2N2ZWMiKQorICAgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfbm9nY2N2ZWNfdmVjbWF0IENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtZm5vLXRyZWUtdmVjdG9yaXplIC1EQlRMX1BSRUZJWD1laWdlbjNfbm9nY2N2ZWMiKQorICAgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfbm9nY2N2ZWNfbWF0bWF0IENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtZm5vLXRyZWUtdmVjdG9yaXplIC1EQlRMX1BSRUZJWD1laWdlbjNfbm9nY2N2ZWMiKQorICAgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF9laWdlbjNfbm9nY2N2ZWNfYWR2ICAgIENPTVBJTEVfRkxBR1MgIi1mbm8tZXhjZXB0aW9ucyAtZm5vLXRyZWUtdmVjdG9yaXplIC1EQlRMX1BSRUZJWD1laWdlbjNfbm9nY2N2ZWMiKQorICBlbmRpZigpCisKKworICBpZihOT1QgQlRMX05PVkVDKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19ub3ZlY19saW5lYXIgbWFpbl9saW5lYXIuY3BwIE9GRikKKyAgICBidGxfYWRkX2JlbmNoKGJ0bF9laWdlbjNfbm92ZWNfdmVjbWF0IG1haW5fdmVjbWF0LmNwcCBPRkYpCisgICAgYnRsX2FkZF9iZW5jaChidGxfZWlnZW4zX25vdmVjX21hdG1hdCBtYWluX21hdG1hdC5jcHAgT0ZGKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX2VpZ2VuM19ub3ZlY19hZHYgbWFpbl9hZHYuY3BwICAgICAgIE9GRikKKyAgICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4zX25vdmVjX2xpbmVhciBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURFSUdFTl9ET05UX1ZFQ1RPUklaRSAtREJUTF9QUkVGSVg9ZWlnZW4zX25vdmVjIikKKyAgICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4zX25vdmVjX3ZlY21hdCBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURFSUdFTl9ET05UX1ZFQ1RPUklaRSAtREJUTF9QUkVGSVg9ZWlnZW4zX25vdmVjIikKKyAgICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4zX25vdmVjX21hdG1hdCBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURFSUdFTl9ET05UX1ZFQ1RPUklaRSAtREJUTF9QUkVGSVg9ZWlnZW4zX25vdmVjIikKKyAgICBidGxfYWRkX3RhcmdldF9wcm9wZXJ0eShidGxfZWlnZW4zX25vdmVjX2FkdiAgICBDT01QSUxFX0ZMQUdTICItZm5vLWV4Y2VwdGlvbnMgLURFSUdFTl9ET05UX1ZFQ1RPUklaRSAtREJUTF9QUkVGSVg9ZWlnZW4zX25vdmVjIikKKworIyAgICAgaWYoQlVJTERfYnRsX2VpZ2VuM19hZHYpCisjICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhidGxfZWlnZW4zX2FkdiAke01LTF9MSUJSQVJJRVN9KQorIyAgICAgZW5kaWYoQlVJTERfYnRsX2VpZ2VuM19hZHYpCisKKyAgZW5kaWYoTk9UIEJUTF9OT1ZFQykKKworICBidGxfYWRkX2JlbmNoKGJ0bF90aW55X2VpZ2VuMyBidGxfdGlueV9laWdlbjMuY3BwIE9GRikKKworICBpZihOT1QgQlRMX05PVkVDKQorICAgIGJ0bF9hZGRfYmVuY2goYnRsX3RpbnlfZWlnZW4zX25vdmVjIGJ0bF90aW55X2VpZ2VuMy5jcHAgT0ZGKQorICAgIGJ0bF9hZGRfdGFyZ2V0X3Byb3BlcnR5KGJ0bF90aW55X2VpZ2VuM19ub3ZlYyAgICBDT01QSUxFX0ZMQUdTICItREJUTF9QUkVGSVg9ZWlnZW4zX3RpbnkiKQorCisgICAgaWYoQlVJTERfYnRsX3RpbnlfZWlnZW4zX25vdmVjKQorICAgICAgYnRsX2FkZF90YXJnZXRfcHJvcGVydHkoYnRsX3RpbnlfZWlnZW4zX25vdmVjICAgIENPTVBJTEVfRkxBR1MgIi1ERUlHRU5fRE9OVF9WRUNUT1JJWkUgLURCVExfUFJFRklYPWVpZ2VuM190aW55X25vdmVjIikKKyAgICBlbmRpZihCVUlMRF9idGxfdGlueV9laWdlbjNfbm92ZWMpCisgIGVuZGlmKE5PVCBCVExfTk9WRUMpCisKK2VuZGlmIChFSUdFTjNfRk9VTkQpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9laWdlbjMvYnRsX3RpbnlfZWlnZW4zLmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9idGxfdGlueV9laWdlbjMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNTE1YmUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvYnRsX3RpbnlfZWlnZW4zLmNwcApAQCAtMCwwICsxLDQ2IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiZWlnZW4zX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJzdGF0aWMvYmVuY2hfc3RhdGljLmhoIgorI2luY2x1ZGUgImFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXhweS5oaCIKKyNpbmNsdWRlICJhY3Rpb25fbHVfc29sdmUuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2F0YV9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hYXRfcHJvZHVjdC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fYXR2X3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2Nob2xlc2t5LmhoIgorI2luY2x1ZGUgImFjdGlvbl90cmlzb2x2ZS5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F4cHksZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QsZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QsZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9hdHZfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2Nob2xlc2t5LGVpZ2VuMl9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fdHJpc29sdmUsZWlnZW4yX2ludGVyZmFjZT4oKTsKKworICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9laWdlbjMvZWlnZW4zX2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9laWdlbjNfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYmNjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvZWlnZW4zX2ludGVyZmFjZS5oaApAQCAtMCwwICsxLDI0MCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBFSUdFTjNfSU5URVJGQUNFX0hICisjZGVmaW5lIEVJR0VOM19JTlRFUkZBQ0VfSEgKKworI2luY2x1ZGUgPEVpZ2VuL0VpZ2VuPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJidGwuaGgiCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordGVtcGxhdGU8Y2xhc3MgcmVhbCwgaW50IFNJWkU9RHluYW1pYz4KK2NsYXNzIGVpZ2VuM19pbnRlcmZhY2UKK3sKKworcHVibGljIDoKKworICBlbnVtIHtJc0ZpeGVkU2l6ZSA9IChTSVpFIT1EeW5hbWljKX07CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZTsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+IHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3Rvcj4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8cmVhbCxTSVpFLFNJWkU+IGdlbmVfbWF0cml4OworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8cmVhbCxTSVpFLDE+IGdlbmVfdmVjdG9yOworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gRUlHRU5fTUFLRVNUUklORyhCVExfUFJFRklYKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pIHt9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKSB7fQorCisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIEEucmVzaXplKEFfc3RsWzBdLnNpemUoKSwgQV9zdGwuc2l6ZSgpKTsKKworICAgIGZvciAoaW50IGo9MDsgajxBX3N0bC5zaXplKCkgOyBqKyspeworICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKyl7CisgICAgICAgIEEuY29lZmZSZWYoaSxqKSA9IEFfc3RsW2pdW2ldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBCLnJlc2l6ZShCX3N0bC5zaXplKCksMSk7CisKKyAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgICAgIEIuY29lZmZSZWYoaSkgPSBCX3N0bFtpXTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FICB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgICAgQl9zdGxbaV0gPSBCLmNvZWZmKGkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgaW50IE49QV9zdGwuc2l6ZSgpOworCisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgICAgQV9zdGxbal0ucmVzaXplKE4pOworICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgICBBX3N0bFtqXVtpXSA9IEEuY29lZmYoaSxqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBYLm5vYWxpYXMoKSA9IEEqQjsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3Bvc2VkX21hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWC5ub2FsaWFzKCkgPSBBLnRyYW5zcG9zZSgpKkIudHJhbnNwb3NlKCk7CisgIH0KKworLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKy8vICAgICBYLm5vYWxpYXMoKSA9IEEudHJhbnNwb3NlKCkqQTsKKy8vICAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFgudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc2V0WmVybygpOworICAgIFgudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUoQSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBYLm5vYWxpYXMoKSA9IEEqQjsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBzeW12KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBYLm5vYWxpYXMoKSA9IChBLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIEIpOworLy8gICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X3ZlY3RvcjxyZWFsLDAsTG93ZXJUcmlhbmd1bGFyQml0LGZhbHNlLGZhbHNlPihOLEEuZGF0YSgpLE4sIEIuZGF0YSgpLCAxLCBYLmRhdGEoKSwgMSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBTcmM+IHN0YXRpYyB2b2lkIHRyaWFzc2lnbihEZXN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgICAgY29uc3QgaW50IFBhY2tldFNpemUgPSBzaXplb2YoUGFja2V0KS9zaXplb2YoU2NhbGFyKTsKKyAgICBpbnQgc2l6ZSA9IGRzdC5jb2xzKCk7CisgICAgZm9yKGludCBqPTA7IGo8c2l6ZTsgais9MSkKKyAgICB7CisvLyAgICAgICBjb25zdCBpbnQgYWxpZ25lZEVuZCA9IGFsaWduZWRTdGFydCArICgoaW5uZXJTaXplLWFsaWduZWRTdGFydCkgJiB+cGFja2V0QWxpZ25lZE1hc2spOworICAgICAgU2NhbGFyKiBBMCA9IGRzdC5kYXRhKCkgKyBqKmRzdC5zdHJpZGUoKTsKKyAgICAgIGludCBzdGFydGkgPSBqOworICAgICAgaW50IGFsaWduZWRFbmQgPSBzdGFydGk7CisgICAgICBpbnQgYWxpZ25lZFN0YXJ0ID0gKHN0YXJ0aSkgKyBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZCgmQTBbc3RhcnRpXSwgc2l6ZS1zdGFydGkpOworICAgICAgYWxpZ25lZEVuZCA9IGFsaWduZWRTdGFydCArICgoc2l6ZS1hbGlnbmVkU3RhcnQpLygyKlBhY2tldFNpemUpKSooUGFja2V0U2l6ZSoyKTsKKworICAgICAgLy8gZG8gdGhlIG5vbi12ZWN0b3JpemFibGUgcGFydCBvZiB0aGUgYXNzaWdubWVudAorICAgICAgZm9yIChpbnQgaW5kZXggPSBzdGFydGk7IGluZGV4PGFsaWduZWRTdGFydCA7ICsraW5kZXgpCisgICAgICB7CisgICAgICAgIGlmKERlc3Q6OkZsYWdzJlJvd01ham9yQml0KQorICAgICAgICAgIGRzdC5jb3B5Q29lZmYoaiwgaW5kZXgsIHNyYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkc3QuY29weUNvZWZmKGluZGV4LCBqLCBzcmMpOworICAgICAgfQorCisgICAgICAvLyBkbyB0aGUgdmVjdG9yaXphYmxlIHBhcnQgb2YgdGhlIGFzc2lnbm1lbnQKKyAgICAgIGZvciAoaW50IGluZGV4ID0gYWxpZ25lZFN0YXJ0OyBpbmRleDxhbGlnbmVkRW5kOyBpbmRleCs9UGFja2V0U2l6ZSkKKyAgICAgIHsKKyAgICAgICAgaWYoRGVzdDo6RmxhZ3MmUm93TWFqb3JCaXQpCisgICAgICAgICAgZHN0LnRlbXBsYXRlIGNvcHlQYWNrZXQ8U3JjLCBBbGlnbmVkLCBVbmFsaWduZWQ+KGosIGluZGV4LCBzcmMpOworICAgICAgICBlbHNlCisgICAgICAgICAgZHN0LnRlbXBsYXRlIGNvcHlQYWNrZXQ8U3JjLCBBbGlnbmVkLCBVbmFsaWduZWQ+KGluZGV4LCBqLCBzcmMpOworICAgICAgfQorCisgICAgICAvLyBkbyB0aGUgbm9uLXZlY3Rvcml6YWJsZSBwYXJ0IG9mIHRoZSBhc3NpZ25tZW50CisgICAgICBmb3IgKGludCBpbmRleCA9IGFsaWduZWRFbmQ7IGluZGV4PHNpemU7ICsraW5kZXgpCisgICAgICB7CisgICAgICAgIGlmKERlc3Q6OkZsYWdzJlJvd01ham9yQml0KQorICAgICAgICAgIGRzdC5jb3B5Q29lZmYoaiwgaW5kZXgsIHNyYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkc3QuY29weUNvZWZmKGluZGV4LCBqLCBzcmMpOworICAgICAgfQorICAgICAgLy9kc3QuY29sKGopLnRhaWwoTi1qKSA9IHNyYy5jb2woaikudGFpbChOLWopOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHN5cjIoZ2VuZV9tYXRyaXggJiBBLCAgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICAvLyBpbnRlcm5hbDo6cHJvZHVjdF9zZWxmYWRqb2ludF9yYW5rMl91cGRhdGU8cmVhbCwwLExvd2VyVHJpYW5ndWxhckJpdD4oTixBLmRhdGEoKSxOLCBYLmRhdGEoKSwgMSwgWS5kYXRhKCksIDEsIC0xKTsKKyAgICBmb3IoaW50IGo9MDsgajxOOyArK2opCisgICAgICBBLmNvbChqKS50YWlsKE4taikgKz0gWFtqXSAqIFkudGFpbChOLWopICsgWVtqXSAqIFgudGFpbChOLWopOworICB9CisKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgZ2VyKGdlbmVfbWF0cml4ICYgQSwgIGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgZm9yKGludCBqPTA7IGo8TjsgKytqKQorICAgICAgQS5jb2woaikgKz0gWCAqIFlbal07CisgIH0KKworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCByb3QoZ2VuZV92ZWN0b3IgJiBBLCAgZ2VuZV92ZWN0b3IgJiBCLCByZWFsIGMsIHJlYWwgcywgaW50IE4peworICAgIGludGVybmFsOjphcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUoQSwgQiwgSmFjb2JpUm90YXRpb248cmVhbD4oYyxzKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFgubm9hbGlhcygpID0gKEEudHJhbnNwb3NlKCkqQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShyZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgWSArPSBjb2VmICogWDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShyZWFsIGEsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBZID0gYSpYICsgYipZOworICB9CisKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKKyAgICBjaWJsZSA9IHNvdXJjZTsKKyAgfQorCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgTil7CisgICAgY2libGUgPSBzb3VyY2U7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3ImIFgsIGludCBOKXsKKyAgICBYID0gTC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcl9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKXsKKyAgICBYID0gTC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cm1tKGNvbnN0IGdlbmVfbWF0cml4ICYgTCwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsIGdlbmVfbWF0cml4JiBYLCBpbnQgTil7CisgICAgWC5ub2FsaWFzKCkgPSBMLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICogQjsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjaG9sZXNreShjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICAgIEMgPSBYOworICAgIGludGVybmFsOjpsbHRfaW5wbGFjZTxyZWFsLExvd2VyPjo6YmxvY2tlZChDKTsKKyAgICAvL0MgPSBYLmxsdCgpLm1hdHJpeEwoKTsKKy8vICAgICBDID0gWDsKKy8vICAgICBDaG9sZXNreTxnZW5lX21hdHJpeD46OmNvbXB1dGVJblBsYWNlKEMpOworLy8gICAgIENob2xlc2t5PGdlbmVfbWF0cml4Pjo6Y29tcHV0ZUluUGxhY2VCbG9jayhDKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBsdV9kZWNvbXAoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgICBDID0gWC5mdWxsUGl2THUoKS5tYXRyaXhMVSgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHBhcnRpYWxfbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisgICAgTWF0cml4PERlbnNlSW5kZXgsMSxEeW5hbWljPiBwaXYoTik7CisgICAgRGVuc2VJbmRleCBuYjsKKyAgICBDID0gWDsKKyAgICBpbnRlcm5hbDo6cGFydGlhbF9sdV9pbnBsYWNlKEMscGl2LG5iKTsKKy8vICAgICBDID0gWC5wYXJ0aWFsUGl2THUoKS5tYXRyaXhMVSgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICAgIHR5cGVuYW1lIFRyaWRpYWdvbmFsaXphdGlvbjxnZW5lX21hdHJpeD46OkNvZWZmVmVjdG9yVHlwZSBhdXgoTi0xKTsKKyAgICBDID0gWDsKKyAgICBpbnRlcm5hbDo6dHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2UoQywgYXV4KTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBoZXNzZW5iZXJnKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisgICAgQyA9IEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPGdlbmVfbWF0cml4PihYKS5wYWNrZWRNYXRyaXgoKTsKKyAgfQorCisKKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl9hZHYuY3BwIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fYWR2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmU1ODU3Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fYWR2LmNwcApAQCAtMCwwICsxLDQ0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiZWlnZW4zX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJiZW5jaC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fdHJpc29sdmUuaGgiCisjaW5jbHVkZSAiYWN0aW9uX3RyaXNvbHZlX21hdHJpeC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fY2hvbGVza3kuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2hlc3NlbmJlcmcuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2x1X2RlY29tcC5oaCIKKyNpbmNsdWRlICJhY3Rpb25fcGFydGlhbF9sdS5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl90cmlzb2x2ZV9tYXRyaXg8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2Nob2xlc2t5PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9sdV9kZWNvbXA8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3BhcnRpYWxfbHU8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25faGVzc2VuYmVyZzxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fbGluZWFyLmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX2xpbmVhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1MzhiNwotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX2xpbmVhci5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImVpZ2VuM19pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKworICBiZW5jaDxBY3Rpb25fYXhweTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F4cGJ5PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fcm90PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICAKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fbWF0bWF0LmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX21hdG1hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2ZmEyYgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX21hdG1hdC5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImVpZ2VuM19pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworLy8gICBiZW5jaDxBY3Rpb25fYXRhX3Byb2R1Y3Q8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl90cm1tPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fdmVjbWF0LmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX3ZlY21hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkYTQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX3ZlY21hdC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgImVpZ2VuM19pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAiYmVuY2guaGgiCisjaW5jbHVkZSAiYmFzaWNfYWN0aW9ucy5oaCIKKworQlRMX01BSU47CisKK2ludCBtYWluKCkKK3sKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3N5bXY8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3N5cjI8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2dlcjxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2dtbS9DTWFrZUxpc3RzLnR4dCBiL2JlbmNoL2J0bC9saWJzL2dtbS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzI1ODYyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvZ21tL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorCitmaW5kX3BhY2thZ2UoR01NKQoraWYgKEdNTV9GT1VORCkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0dNTV9JTkNMVURFU30pCisgIGJ0bF9hZGRfYmVuY2goYnRsX2dtbSBtYWluLmNwcCkKK2VuZGlmIChHTU1fRk9VTkQpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9nbW0vZ21tX0xVX3NvbHZlX2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL2dtbS9nbW1fTFVfc29sdmVfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjlmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9nbW0vZ21tX0xVX3NvbHZlX2ludGVyZmFjZS5oaApAQCAtMCwwICsxLDE5MiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIGJsaXR6X0xVX3NvbHZlX2ludGVyZmFjZS5oaAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMSBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLyAKKyNpZm5kZWYgQkxJVFpfTFVfU09MVkVfSU5URVJGQUNFX0hICisjZGVmaW5lIEJMSVRaX0xVX1NPTFZFX0lOVEVSRkFDRV9ISAorCisjaW5jbHVkZSAiYmxpdHovYXJyYXkuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK0JaX1VTSU5HX05BTUVTUEFDRShibGl0eikKKwordGVtcGxhdGU8Y2xhc3MgcmVhbD4KK2NsYXNzIGJsaXR6X0xVX3NvbHZlX2ludGVyZmFjZSA6IHB1YmxpYyBibGl0el9pbnRlcmZhY2U8cmVhbD4KK3sKKworcHVibGljIDoKKworICB0eXBlZGVmIHR5cGVuYW1lIGJsaXR6X2ludGVyZmFjZTxyZWFsPjo6Z2VuZV9tYXRyaXggZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmxpdHpfaW50ZXJmYWNlPHJlYWw+OjpnZW5lX3ZlY3RvciBnZW5lX3ZlY3RvcjsKKworICB0eXBlZGVmIGJsaXR6OjpBcnJheTxpbnQsMT4gUGl2b3RfVmVjdG9yOworCisgIGlubGluZSBzdGF0aWMgdm9pZCBuZXdfUGl2b3RfVmVjdG9yKFBpdm90X1ZlY3RvciAmIHBpdm90LGludCBOKQorICB7CisKKyAgICBwaXZvdC5yZXNpemUoTik7CisKKyAgfQorCisgIGlubGluZSBzdGF0aWMgdm9pZCBmcmVlX1Bpdm90X1ZlY3RvcihQaXZvdF9WZWN0b3IgJiBwaXZvdCkKKyAgeworICAgIAorICAgIHJldHVybjsKKworICB9CisKKworICBzdGF0aWMgaW5saW5lIHJlYWwgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3NsaWNlZChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yIEIsIGludCByb3csIGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kKQorICB7CisgICAgCisgICAgcmVhbCBzb21tZT0wLjsKKyAgICAKKyAgICBmb3IgKGludCBqPWNvbF9zdGFydCA7IGo8Y29sX2VuZCsxIDsgaisrKXsKKwkKKwlzb21tZSs9QShyb3csaikqQihqKTsKKwkKKyAgICB9CisKKyAgICByZXR1cm4gc29tbWU7CisKKyAgfQorCisKKworCisgIHN0YXRpYyBpbmxpbmUgcmVhbCBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKGdlbmVfbWF0cml4ICYgQSwgaW50IHJvdywgaW50IGNvbF9zdGFydCwgaW50IGNvbF9lbmQsIGdlbmVfbWF0cml4ICYgQiwgaW50IHJvd19zaGlmdCwgaW50IGNvbCApCisgIHsKKyAgICAKKyAgICByZWFsIHNvbW1lPTAuOworICAgIAorICAgIGZvciAoaW50IGo9Y29sX3N0YXJ0IDsgajxjb2xfZW5kKzEgOyBqKyspeworCQorCXNvbW1lKz1BKHJvdyxqKSpCKGorcm93X3NoaWZ0LGNvbCk7CisJCisgICAgfQorCisgICAgcmV0dXJuIHNvbW1lOworCisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgTFVfZmFjdG9yKGdlbmVfbWF0cml4ICYgTFUsIFBpdm90X1ZlY3RvciAmIHBpdm90LCBpbnQgTikKKyAgeworCisgICAgQVNTRVJUKCBMVS5yb3dzKCk9PUxVLmNvbHMoKSApIDsKKyAgICBpbnQgaW5kZXhfbWF4ID0gMCA7CisgICAgcmVhbCBiaWcgPSAwLiA7CisgICAgcmVhbCB0aGVTdW0gPSAwLiA7CisgICAgcmVhbCBkdW0gPSAwLiA7CisgICAgLy8gR2V0IHRoZSBpbXBsaWNpdCBzY2FsaW5nIGluZm9ybWF0aW9uIDoKKyAgICBnZW5lX3ZlY3RvciBJbXBsaWNpdFNjYWxpbmcoIE4gKSA7CisgICAgZm9yKCBpbnQgaT0wOyBpPE47IGkrKyApIHsKKyAgICAgIGJpZyA9IDAuIDsKKyAgICAgIGZvciggaW50IGo9MDsgajxOOyBqKysgKSB7CisJaWYoIGFicyggTFUoIGksIGogKSApPj1iaWcgKSBiaWcgPSBhYnMoIExVKCBpLCBqICkgKSA7CisgICAgICB9CisgICAgICBpZiggYmlnPT0wLiApIHsKKwlJTkZPUyggImJsaXR6X0xVX2ZhY3Rvcjo6U2luZ3VsYXIgbWF0cml4IiApIDsKKwlleGl0KCAwICkgOworICAgICAgfQorICAgICAgSW1wbGljaXRTY2FsaW5nKCBpICkgPSAxLi9iaWcgOworICAgIH0KKyAgICAvLyBMb29wIG92ZXIgY29sdW1ucyBvZiBDcm91dCdzIG1ldGhvZCA6CisgICAgZm9yKCBpbnQgaj0wOyBqPE47IGorKyApIHsKKyAgICAgIGZvciggaW50IGk9MDsgaTxqOyBpKysgKSB7CisJdGhlU3VtID0gTFUoIGksIGogKSA7CisJdGhlU3VtIC09IG1hdHJpeF9tYXRyaXhfcHJvZHVjdF9zbGljZWQoTFUsIGksIDAsIGktMSwgTFUsIDAsIGopIDsKKwkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGZyb21TdGFydCwgaS0xICkgKSpMVSggUmFuZ2UoIGZyb21TdGFydCwgaS0xICksIGogKSApIDsKKwlMVSggaSwgaiApID0gdGhlU3VtIDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gU2VhcmNoIGZvciB0aGUgbGFyZ2VzdCBwaXZvdCBlbGVtZW50IDoKKyAgICAgIGJpZyA9IDAuIDsKKyAgICAgIGZvciggaW50IGk9ajsgaTxOOyBpKysgKSB7CisJdGhlU3VtID0gTFUoIGksIGogKSA7CisJdGhlU3VtIC09IG1hdHJpeF9tYXRyaXhfcHJvZHVjdF9zbGljZWQoTFUsIGksIDAsIGotMSwgTFUsIDAsIGopIDsKKwkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGZyb21TdGFydCwgai0xICkgKSpMVSggUmFuZ2UoIGZyb21TdGFydCwgai0xICksIGogKSApIDsKKwlMVSggaSwgaiApID0gdGhlU3VtIDsKKwlpZiggKEltcGxpY2l0U2NhbGluZyggaSApKmFicyggdGhlU3VtICkpPj1iaWcgKSB7CisJICBkdW0gPSBJbXBsaWNpdFNjYWxpbmcoIGkgKSphYnMoIHRoZVN1bSApIDsKKwkgIGJpZyA9IGR1bSA7CisJICBpbmRleF9tYXggPSBpIDsKKwl9CisgICAgICB9CisgICAgICAvLyBJbnRlcmNoYW5naW5nIHJvd3MgYW5kIHRoZSBzY2FsZSBmYWN0b3IgOgorICAgICAgaWYoIGohPWluZGV4X21heCApIHsKKwlmb3IoIGludCBrPTA7IGs8TjsgaysrICkgeworCSAgZHVtID0gTFUoIGluZGV4X21heCwgayApIDsKKwkgIExVKCBpbmRleF9tYXgsIGsgKSA9IExVKCBqLCBrICkgOworCSAgTFUoIGosIGsgKSA9IGR1bSA7CisJfQorCUltcGxpY2l0U2NhbGluZyggaW5kZXhfbWF4ICkgPSBJbXBsaWNpdFNjYWxpbmcoIGogKSA7CisgICAgICB9CisgICAgICBwaXZvdCggaiApID0gaW5kZXhfbWF4IDsKKyAgICAgIGlmICggTFUoIGosIGogKT09MC4gKSBMVSggaiwgaiApID0gMS5lLTIwIDsKKyAgICAgIC8vIERpdmlkZSBieSB0aGUgcGl2b3QgZWxlbWVudCA6CisgICAgICBpZiggajxOICkgeworCWR1bSA9IDEuL0xVKCBqLCBqICkgOworCWZvciggaW50IGk9aisxOyBpPE47IGkrKyApIExVKCBpLCBqICkgKj0gZHVtIDsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIGlubGluZSBzdGF0aWMgdm9pZCBMVV9zb2x2ZShjb25zdCBnZW5lX21hdHJpeCAmIExVLCBjb25zdCBQaXZvdF9WZWN0b3IgcGl2b3QsIGdlbmVfdmVjdG9yICZCLCBnZW5lX3ZlY3RvciBYLCBpbnQgTikKKyAgeworCisgICAgLy8gUG91ciBjb25zZXJ2ZXIgbGUgbWVtZSBoZWFkZXIsIG9uIHRyYXZhaWxsZSBzdXIgWCwgY29waWUgZHUgc2Vjb25kLW1lbWJyZSBCCisgICAgWCA9IEIuY29weSgpIDsKKyAgICBBU1NFUlQoIExVLnJvd3MoKT09TFUuY29scygpICkgOworICAgIGZpcnN0SW5kZXggaW5kSSA7CisgICAgLy8gRm9yd2FyZCBzdWJzdGl0dXRpb24gOgorICAgIGludCBpaSA9IDAgOworICAgIHJlYWwgdGhlU3VtID0gMC4gOworICAgIGZvciggaW50IGk9MDsgaTxOOyBpKysgKSB7CisgICAgICBpbnQgaXAgPSBwaXZvdCggaSApIDsKKyAgICAgIHRoZVN1bSA9IFgoIGlwICkgOworICAgICAgLy8gICAgICB0aGVTdW0gPSBCKCBpcCApIDsKKyAgICAgIFgoIGlwICkgPSBYKCBpICkgOworICAgICAgLy8gICAgICBCKCBpcCApID0gQiggaSApIDsKKyAgICAgIGlmKCBpaSApIHsKKwl0aGVTdW0gLT0gbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3NsaWNlZChMVSwgWCwgaSwgaWktMSwgaS0xKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpaS0xLCBpLTEgKSApKlgoIFJhbmdlKCBpaS0xLCBpLTEgKSApICkgOworCS8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaWktMSwgaS0xICkgKSpCKCBSYW5nZSggaWktMSwgaS0xICkgKSApIDsKKyAgICAgIH0gZWxzZSBpZiggdGhlU3VtICkgeworCWlpID0gaSsxIDsKKyAgICAgIH0KKyAgICAgIFgoIGkgKSA9IHRoZVN1bSA7CisgICAgICAvLyAgICAgIEIoIGkgKSA9IHRoZVN1bSA7CisgICAgfQorICAgIC8vIEJhY2tzdWJzdGl0dXRpb24gOgorICAgIGZvciggaW50IGk9Ti0xOyBpPj0wOyBpLS0gKSB7CisgICAgICB0aGVTdW0gPSBYKCBpICkgOworICAgICAgLy8gICAgICB0aGVTdW0gPSBCKCBpICkgOworICAgICAgdGhlU3VtIC09IG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoTFUsIFgsIGksIGkrMSwgTikgOworICAgICAgLy8gICAgICB0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGkrMSwgdG9FbmQgKSApKlgoIFJhbmdlKCBpKzEsIHRvRW5kICkgKSApIDsKKyAgICAgIC8vICAgICAgdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpKzEsIHRvRW5kICkgKSpCKCBSYW5nZSggaSsxLCB0b0VuZCApICkgKSA7CisgICAgICAvLyBTdG9yZSBhIGNvbXBvbmVudCBvZiB0aGUgc29sdXRpb24gdmVjdG9yIDoKKyAgICAgIFgoIGkgKSA9IHRoZVN1bS9MVSggaSwgaSApIDsKKyAgICAgIC8vICAgICAgQiggaSApID0gdGhlU3VtL0xVKCBpLCBpICkgOworICAgIH0KKworICB9CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZ21tL2dtbV9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9nbW0vZ21tX2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWEzMDNjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvZ21tL2dtbV9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwxNDQgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgR01NX0lOVEVSRkFDRV9ISAorI2RlZmluZSBHTU1fSU5URVJGQUNFX0hICisKKyNpbmNsdWRlIDxnbW0vZ21tLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBuYW1lc3BhY2UgZ21tOworCit0ZW1wbGF0ZTxjbGFzcyByZWFsPgorY2xhc3MgZ21tX2ludGVyZmFjZSB7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7CisKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKKworICB0eXBlZGVmIGdtbTo6ZGVuc2VfbWF0cml4PHJlYWw+IGdlbmVfbWF0cml4OworICB0eXBlZGVmIHN0bF92ZWN0b3IgZ2VuZV92ZWN0b3I7CisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKKyAgeworICAgIHJldHVybiAiZ21tIjsKKyAgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4peworICAgIHJldHVybiA7CisgIH0KKworICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpeworICAgIHJldHVybiA7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBBLnJlc2l6ZShBX3N0bFswXS5zaXplKCksQV9zdGwuc2l6ZSgpKTsKKworICAgIGZvciAoaW50IGo9MDsgajxBX3N0bC5zaXplKCkgOyBqKyspeworICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKyl7CisgICAgICAgIEEoaSxqKSA9IEFfc3RsW2pdW2ldOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIEIgPSBCX3N0bDsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBCX3N0bCA9IEI7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgICAgaW50IE49QV9zdGwuc2l6ZSgpOworCisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgICAgQV9zdGxbal0ucmVzaXplKE4pOworICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgICBBX3N0bFtqXVtpXSA9IEEoaSxqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBnbW06Om11bHQoQSxCLCBYKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3Bvc2VkX21hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgZ21tOjptdWx0KGdtbTo6dHJhbnNwb3NlZChBKSxnbW06OnRyYW5zcG9zZWQoQiksIFgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgZ21tOjptdWx0KGdtbTo6dHJhbnNwb3NlZChBKSxBLCBYKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIGdtbTo6bXVsdChBLGdtbTo6dHJhbnNwb3NlZChBKSwgWCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBnbW06Om11bHQoQSxCLFgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKEEpLEIsWCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgZ21tOjphZGQoZ21tOjpzY2FsZWQoWCxjb2VmKSwgWSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhwYnkocmVhbCBhLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgZ21tOjphZGQoZ21tOjpzY2FsZWQoWCxhKSwgZ21tOjpzY2FsZWQoWSxiKSwgWSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKKyAgICBnbW06OmNvcHkoc291cmNlLGNpYmxlKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4peworICAgIGdtbTo6Y29weShzb3VyY2UsY2libGUpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaXNvbHZlX2xvd2VyKGNvbnN0IGdlbmVfbWF0cml4ICYgTCwgY29uc3QgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIGdtbTo6Y29weShCLFgpOworICAgIGdtbTo6bG93ZXJfdHJpX3NvbHZlKEwsIFgsIGZhbHNlKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBwYXJ0aWFsX2x1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgUiwgaW50IE4peworICAgIGdtbTo6Y29weShYLFIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gaXB2dChOKTsKKyAgICBnbW06Omx1X2ZhY3RvcihSLCBpcHZ0KTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBoZXNzZW5iZXJnKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBSLCBpbnQgTil7CisgICAgZ21tOjpjb3B5KFgsUik7CisgICAgZ21tOjpIZXNzZW5iZXJnX3JlZHVjdGlvbihSLFgsZmFsc2UpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgUiwgaW50IE4peworICAgIGdtbTo6Y29weShYLFIpOworICAgIGdtbTo6SG91c2Vob2xkZXJfdHJpZGlhZ29uYWxpemF0aW9uKFIsWCxmYWxzZSk7CisgIH0KKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9nbW0vbWFpbi5jcHAgYi9iZW5jaC9idGwvbGlicy9nbW0vbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwYzA1MQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL2dtbS9tYWluLmNwcApAQCAtMCwwICsxLDUxIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaW5jbHVkZSAidXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiZ21tX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJiZW5jaC5oaCIKKyNpbmNsdWRlICJiYXNpY19hY3Rpb25zLmhoIgorI2luY2x1ZGUgImFjdGlvbl9oZXNzZW5iZXJnLmhoIgorI2luY2x1ZGUgImFjdGlvbl9wYXJ0aWFsX2x1LmhoIgorCitCVExfTUFJTjsKKworaW50IG1haW4oKQoreworCisgIGJlbmNoPEFjdGlvbl9heHB5PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworLy8gICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fdHJpc29sdmU8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgLy9iZW5jaDxBY3Rpb25fbHVfc29sdmU8YmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl9wYXJ0aWFsX2x1PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIAorICBiZW5jaDxBY3Rpb25faGVzc2VuYmVyZzxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uPGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvbXRsNC8ua2RiZ3JjLm1haW4gYi9iZW5jaC9idGwvbGlicy9tdGw0Ly5rZGJncmMubWFpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQwODJmCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvbXRsNC8ua2RiZ3JjLm1haW4KQEAgLTAsMCArMSwxMiBAQAorW0dlbmVyYWxdCitEZWJ1Z2dlckNtZFN0cj0KK0RyaXZlck5hbWU9R0RCCitGaWxlVmVyc2lvbj0xCitPcHRpb25zU2VsZWN0ZWQ9CitQcm9ncmFtQXJncz0KK1RUWUxldmVsPTcKK1dvcmtpbmdEaXJlY3Rvcnk9CisKK1tNZW1vcnldCitDb2x1bW5XaWR0aHM9ODAsMAorTnVtRXhwcnM9MApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvbXRsNC9DTWFrZUxpc3RzLnR4dCBiL2JlbmNoL2J0bC9saWJzL210bDQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiNDdhOAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL210bDQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACisKK2ZpbmRfcGFja2FnZShNVEw0KQoraWYgKE1UTDRfRk9VTkQpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtNVEw0X0lOQ0xVREVfRElSfSkKKyAgYnRsX2FkZF9iZW5jaChidGxfbXRsNCBtYWluLmNwcCkKK2VuZGlmIChNVEw0X0ZPVU5EKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvbXRsNC9tYWluLmNwcCBiL2JlbmNoL2J0bC9saWJzL210bDQvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmY2ZiOQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL210bDQvbWFpbi5jcHAKQEAgLTAsMCArMSw0NiBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgIm10bDRfaW50ZXJmYWNlLmhoIgorI2luY2x1ZGUgImJlbmNoLmhoIgorI2luY2x1ZGUgImJhc2ljX2FjdGlvbnMuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2Nob2xlc2t5LmhoIgorLy8gI2luY2x1ZGUgImFjdGlvbl9sdV9kZWNvbXAuaGgiCisKK0JUTF9NQUlOOworCitpbnQgbWFpbigpCit7CisKKyAgYmVuY2g8QWN0aW9uX2F4cHk8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworCisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxtdGw0X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxtdGw0X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworLy8gICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlPG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworLy8gICBiZW5jaDxBY3Rpb25fY2hvbGVza3k8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisvLyAgIGJlbmNoPEFjdGlvbl9sdV9kZWNvbXA8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvbXRsNC9tdGw0X0xVX3NvbHZlX2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL210bDQvbXRsNF9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiOWY1NgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2J0bC9saWJzL210bDQvbXRsNF9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwxOTIgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MzEgQ0VTVCAyMDAyCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8gCisjaWZuZGVmIEJMSVRaX0xVX1NPTFZFX0lOVEVSRkFDRV9ISAorI2RlZmluZSBCTElUWl9MVV9TT0xWRV9JTlRFUkZBQ0VfSEgKKworI2luY2x1ZGUgImJsaXR6L2FycmF5LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCitCWl9VU0lOR19OQU1FU1BBQ0UoYmxpdHopCisKK3RlbXBsYXRlPGNsYXNzIHJlYWw+CitjbGFzcyBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UgOiBwdWJsaWMgYmxpdHpfaW50ZXJmYWNlPHJlYWw+Cit7CisKK3B1YmxpYyA6CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBibGl0el9pbnRlcmZhY2U8cmVhbD46OmdlbmVfbWF0cml4IGdlbmVfbWF0cml4OworICB0eXBlZGVmIHR5cGVuYW1lIGJsaXR6X2ludGVyZmFjZTxyZWFsPjo6Z2VuZV92ZWN0b3IgZ2VuZV92ZWN0b3I7CisKKyAgdHlwZWRlZiBibGl0ejo6QXJyYXk8aW50LDE+IFBpdm90X1ZlY3RvcjsKKworICBpbmxpbmUgc3RhdGljIHZvaWQgbmV3X1Bpdm90X1ZlY3RvcihQaXZvdF9WZWN0b3IgJiBwaXZvdCxpbnQgTikKKyAgeworCisgICAgcGl2b3QucmVzaXplKE4pOworCisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgZnJlZV9QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICYgcGl2b3QpCisgIHsKKyAgICAKKyAgICByZXR1cm47CisKKyAgfQorCisKKyAgc3RhdGljIGlubGluZSByZWFsIG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciBCLCBpbnQgcm93LCBpbnQgY29sX3N0YXJ0LCBpbnQgY29sX2VuZCkKKyAgeworICAgIAorICAgIHJlYWwgc29tbWU9MC47CisgICAgCisgICAgZm9yIChpbnQgaj1jb2xfc3RhcnQgOyBqPGNvbF9lbmQrMSA7IGorKyl7CisJCisJc29tbWUrPUEocm93LGopKkIoaik7CisJCisgICAgfQorCisgICAgcmV0dXJuIHNvbW1lOworCisgIH0KKworCisKKworICBzdGF0aWMgaW5saW5lIHJlYWwgbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChnZW5lX21hdHJpeCAmIEEsIGludCByb3csIGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kLCBnZW5lX21hdHJpeCAmIEIsIGludCByb3dfc2hpZnQsIGludCBjb2wgKQorICB7CisgICAgCisgICAgcmVhbCBzb21tZT0wLjsKKyAgICAKKyAgICBmb3IgKGludCBqPWNvbF9zdGFydCA7IGo8Y29sX2VuZCsxIDsgaisrKXsKKwkKKwlzb21tZSs9QShyb3csaikqQihqK3Jvd19zaGlmdCxjb2wpOworCQorICAgIH0KKworICAgIHJldHVybiBzb21tZTsKKworICB9CisKKyAgaW5saW5lIHN0YXRpYyB2b2lkIExVX2ZhY3RvcihnZW5lX21hdHJpeCAmIExVLCBQaXZvdF9WZWN0b3IgJiBwaXZvdCwgaW50IE4pCisgIHsKKworICAgIEFTU0VSVCggTFUucm93cygpPT1MVS5jb2xzKCkgKSA7CisgICAgaW50IGluZGV4X21heCA9IDAgOworICAgIHJlYWwgYmlnID0gMC4gOworICAgIHJlYWwgdGhlU3VtID0gMC4gOworICAgIHJlYWwgZHVtID0gMC4gOworICAgIC8vIEdldCB0aGUgaW1wbGljaXQgc2NhbGluZyBpbmZvcm1hdGlvbiA6CisgICAgZ2VuZV92ZWN0b3IgSW1wbGljaXRTY2FsaW5nKCBOICkgOworICAgIGZvciggaW50IGk9MDsgaTxOOyBpKysgKSB7CisgICAgICBiaWcgPSAwLiA7CisgICAgICBmb3IoIGludCBqPTA7IGo8TjsgaisrICkgeworCWlmKCBhYnMoIExVKCBpLCBqICkgKT49YmlnICkgYmlnID0gYWJzKCBMVSggaSwgaiApICkgOworICAgICAgfQorICAgICAgaWYoIGJpZz09MC4gKSB7CisJSU5GT1MoICJibGl0el9MVV9mYWN0b3I6OlNpbmd1bGFyIG1hdHJpeCIgKSA7CisJZXhpdCggMCApIDsKKyAgICAgIH0KKyAgICAgIEltcGxpY2l0U2NhbGluZyggaSApID0gMS4vYmlnIDsKKyAgICB9CisgICAgLy8gTG9vcCBvdmVyIGNvbHVtbnMgb2YgQ3JvdXQncyBtZXRob2QgOgorICAgIGZvciggaW50IGo9MDsgajxOOyBqKysgKSB7CisgICAgICBmb3IoIGludCBpPTA7IGk8ajsgaSsrICkgeworCXRoZVN1bSA9IExVKCBpLCBqICkgOworCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBpLTEsIExVLCAwLCBqKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApLCBqICkgKSA7CisJTFUoIGksIGogKSA9IHRoZVN1bSA7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGxhcmdlc3QgcGl2b3QgZWxlbWVudCA6CisgICAgICBiaWcgPSAwLiA7CisgICAgICBmb3IoIGludCBpPWo7IGk8TjsgaSsrICkgeworCXRoZVN1bSA9IExVKCBpLCBqICkgOworCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBqLTEsIExVLCAwLCBqKSA7CisJLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApLCBqICkgKSA7CisJTFUoIGksIGogKSA9IHRoZVN1bSA7CisJaWYoIChJbXBsaWNpdFNjYWxpbmcoIGkgKSphYnMoIHRoZVN1bSApKT49YmlnICkgeworCSAgZHVtID0gSW1wbGljaXRTY2FsaW5nKCBpICkqYWJzKCB0aGVTdW0gKSA7CisJICBiaWcgPSBkdW0gOworCSAgaW5kZXhfbWF4ID0gaSA7CisJfQorICAgICAgfQorICAgICAgLy8gSW50ZXJjaGFuZ2luZyByb3dzIGFuZCB0aGUgc2NhbGUgZmFjdG9yIDoKKyAgICAgIGlmKCBqIT1pbmRleF9tYXggKSB7CisJZm9yKCBpbnQgaz0wOyBrPE47IGsrKyApIHsKKwkgIGR1bSA9IExVKCBpbmRleF9tYXgsIGsgKSA7CisJICBMVSggaW5kZXhfbWF4LCBrICkgPSBMVSggaiwgayApIDsKKwkgIExVKCBqLCBrICkgPSBkdW0gOworCX0KKwlJbXBsaWNpdFNjYWxpbmcoIGluZGV4X21heCApID0gSW1wbGljaXRTY2FsaW5nKCBqICkgOworICAgICAgfQorICAgICAgcGl2b3QoIGogKSA9IGluZGV4X21heCA7CisgICAgICBpZiAoIExVKCBqLCBqICk9PTAuICkgTFUoIGosIGogKSA9IDEuZS0yMCA7CisgICAgICAvLyBEaXZpZGUgYnkgdGhlIHBpdm90IGVsZW1lbnQgOgorICAgICAgaWYoIGo8TiApIHsKKwlkdW0gPSAxLi9MVSggaiwgaiApIDsKKwlmb3IoIGludCBpPWorMTsgaTxOOyBpKysgKSBMVSggaSwgaiApICo9IGR1bSA7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBpbmxpbmUgc3RhdGljIHZvaWQgTFVfc29sdmUoY29uc3QgZ2VuZV9tYXRyaXggJiBMVSwgY29uc3QgUGl2b3RfVmVjdG9yIHBpdm90LCBnZW5lX3ZlY3RvciAmQiwgZ2VuZV92ZWN0b3IgWCwgaW50IE4pCisgIHsKKworICAgIC8vIFBvdXIgY29uc2VydmVyIGxlIG1lbWUgaGVhZGVyLCBvbiB0cmF2YWlsbGUgc3VyIFgsIGNvcGllIGR1IHNlY29uZC1tZW1icmUgQgorICAgIFggPSBCLmNvcHkoKSA7CisgICAgQVNTRVJUKCBMVS5yb3dzKCk9PUxVLmNvbHMoKSApIDsKKyAgICBmaXJzdEluZGV4IGluZEkgOworICAgIC8vIEZvcndhcmQgc3Vic3RpdHV0aW9uIDoKKyAgICBpbnQgaWkgPSAwIDsKKyAgICByZWFsIHRoZVN1bSA9IDAuIDsKKyAgICBmb3IoIGludCBpPTA7IGk8TjsgaSsrICkgeworICAgICAgaW50IGlwID0gcGl2b3QoIGkgKSA7CisgICAgICB0aGVTdW0gPSBYKCBpcCApIDsKKyAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaXAgKSA7CisgICAgICBYKCBpcCApID0gWCggaSApIDsKKyAgICAgIC8vICAgICAgQiggaXAgKSA9IEIoIGkgKSA7CisgICAgICBpZiggaWkgKSB7CisJdGhlU3VtIC09IG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoTFUsIFgsIGksIGlpLTEsIGktMSkgOworCS8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaWktMSwgaS0xICkgKSpYKCBSYW5nZSggaWktMSwgaS0xICkgKSApIDsKKwkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqQiggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7CisgICAgICB9IGVsc2UgaWYoIHRoZVN1bSApIHsKKwlpaSA9IGkrMSA7CisgICAgICB9CisgICAgICBYKCBpICkgPSB0aGVTdW0gOworICAgICAgLy8gICAgICBCKCBpICkgPSB0aGVTdW0gOworICAgIH0KKyAgICAvLyBCYWNrc3Vic3RpdHV0aW9uIDoKKyAgICBmb3IoIGludCBpPU4tMTsgaT49MDsgaS0tICkgeworICAgICAgdGhlU3VtID0gWCggaSApIDsKKyAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaSApIDsKKyAgICAgIHRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpKzEsIE4pIDsKKyAgICAgIC8vICAgICAgdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpKzEsIHRvRW5kICkgKSpYKCBSYW5nZSggaSsxLCB0b0VuZCApICkgKSA7CisgICAgICAvLyAgICAgIHRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaSsxLCB0b0VuZCApICkqQiggUmFuZ2UoIGkrMSwgdG9FbmQgKSApICkgOworICAgICAgLy8gU3RvcmUgYSBjb21wb25lbnQgb2YgdGhlIHNvbHV0aW9uIHZlY3RvciA6CisgICAgICBYKCBpICkgPSB0aGVTdW0vTFUoIGksIGkgKSA7CisgICAgICAvLyAgICAgIEIoIGkgKSA9IHRoZVN1bS9MVSggaSwgaSApIDsKKyAgICB9CisKKyAgfQorCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL210bDQvbXRsNF9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9tdGw0L210bDRfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTVhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy9tdGw0L210bDRfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTQ0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKy8vCisjaWZuZGVmIE1UTDRfSU5URVJGQUNFX0hICisjZGVmaW5lIE1UTDRfSU5URVJGQUNFX0hICisKKyNpbmNsdWRlIDxib29zdC9udW1lcmljL210bC9tdGwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvbXRsL3V0aWxpdHkvcmFuZ2VfZ2VuZXJhdG9yLmhwcD4KKy8vICNpbmNsdWRlIDxib29zdC9udW1lcmljL210bC9vcGVyYXRpb24vY2hvbGVza3kuaHBwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgbmFtZXNwYWNlIG10bDsKKwordGVtcGxhdGU8Y2xhc3MgcmVhbD4KK2NsYXNzIG10bDRfaW50ZXJmYWNlIHsKKworcHVibGljIDoKKworICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlIDsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+ICBzdGxfdmVjdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3IgPiBzdGxfbWF0cml4OworCisgIHR5cGVkZWYgbXRsOjpkZW5zZTJEPHJlYWwsIG10bDo6bWF0cml4OjpwYXJhbWV0ZXJzPG10bDo6dGFnOjpjb2xfbWFqb3I+ID4gZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgbXRsOjpkZW5zZV92ZWN0b3I8cmVhbD4gIGdlbmVfdmVjdG9yOworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSgpIHsgcmV0dXJuICJtdGw0IjsgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4peworICAgIHJldHVybiA7CisgIH0KKworICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpeworICAgIHJldHVybiA7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBBLmNoYW5nZV9kaW0oQV9zdGxbMF0uc2l6ZSgpLCBBX3N0bC5zaXplKCkpOworCisgICAgZm9yIChpbnQgaj0wOyBqPEFfc3RsLnNpemUoKSA7IGorKyl7CisgICAgICBmb3IgKGludCBpPTA7IGk8QV9zdGxbal0uc2l6ZSgpIDsgaSsrKXsKKyAgICAgICAgQShpLGopID0gQV9zdGxbal1baV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgICAgQi5jaGFuZ2VfZGltKEJfc3RsLnNpemUoKSk7CisgICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CisgICAgICBCW2ldID0gQl9zdGxbaV07CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgICAgQl9zdGxbaV0gPSBCW2ldOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBpbnQgTj1BX3N0bC5zaXplKCk7CisgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgICAgQV9zdGxbal0ucmVzaXplKE4pOworICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgICAgICBBX3N0bFtqXVtpXSA9IEEoaSxqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBYID0gKEEqQik7CisvLyAgICAgbW9ydG9uX2RlbnNlPGRvdWJsZSwgZG9wcGxlZF82NF9yb3dfbWFzaz4gQyhOLE4pOworLy8gICAgIEMgPSBCOworLy8gICAgIFggPSAoQSpDKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3Bvc2VkX21hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWCA9ICh0cmFucyhBKSp0cmFucyhCKSk7CisgIH0KKworLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKy8vICAgICBYID0gKHRyYW5zKEEpKkEpOworLy8gICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgICAgWCA9IChBKnRyYW5zKEEpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4peworICAgIFggPSAoQSpCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgWCA9ICh0cmFucyhBKSpCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KGNvbnN0IHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKKyAgICBZICs9IGNvZWYgKiBYOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCByZWFsIGIsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4peworICAgIFkgPSBhKlggKyBiKlk7CisgIH0KKworLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgY2hvbGVza3koY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKy8vICAgICBDID0gWDsKKy8vICAgICByZWN1cnNpdmVfY2hvbGVza3koQyk7CisvLyAgIH0KKworLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBSLCBpbnQgTil7CisvLyAgICAgUiA9IFg7CisvLyAgICAgc3RkOjp2ZWN0b3I8aW50PiBpcHZ0KE4pOworLy8gICAgIGx1X2ZhY3RvcihSLCBpcHZ0KTsKKy8vICAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBYID0gbG93ZXJfdHJpc29sdmUoTCwgQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKKyAgICBjaWJsZSA9IHNvdXJjZTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4peworICAgIGNpYmxlID0gc291cmNlOworICB9CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvdHZtZXQvQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9idGwvbGlicy90dm1ldC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWI1NjViCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvdHZtZXQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACisKK2ZpbmRfcGFja2FnZShUdm1ldCkKK2lmIChUVk1FVF9GT1VORCkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1RWTUVUX0lOQ0xVREVfRElSfSkKKyAgYnRsX2FkZF9iZW5jaChidGxfdHZtZXQgbWFpbi5jcHAgT0ZGKQorZW5kaWYgKFRWTUVUX0ZPVU5EKQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvdHZtZXQvbWFpbi5jcHAgYi9iZW5jaC9idGwvbGlicy90dm1ldC9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzMyMTVjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvdHZtZXQvbWFpbi5jcHAKQEAgLTAsMCArMSw0MCBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRmlsZSAgIDogIG1haW4uY3BwCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJ0dm1ldF9pbnRlcmZhY2UuaGgiCisjaW5jbHVkZSAic3RhdGljL2JlbmNoX3N0YXRpYy5oaCIKKyNpbmNsdWRlICJhY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2F0dl9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9heHB5LmhoIgorCitCVExfTUFJTjsKKworaW50IG1haW4oKQoreworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F4cHksdHZtZXRfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCx0dm1ldF9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LHR2bWV0X2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9hdHZfcHJvZHVjdCx0dm1ldF9pbnRlcmZhY2U+KCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvdHZtZXQvdHZtZXRfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvdHZtZXQvdHZtZXRfaW50ZXJmYWNlLmhoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDFhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy90dm1ldC90dm1ldF9pbnRlcmZhY2UuaGgKQEAgLTAsMCArMSwxMDQgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpbGUgICA6ICB0dm1ldF9pbnRlcmZhY2UuaGgKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjMwIENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2lmbmRlZiBUVk1FVF9JTlRFUkZBQ0VfSEgKKyNkZWZpbmUgVFZNRVRfSU5URVJGQUNFX0hICisKKyNpbmNsdWRlIDx0dm1ldC90dm1ldC5oPgorI2luY2x1ZGUgPHR2bWV0L1ZlY3Rvci5oPgorI2luY2x1ZGUgPHR2bWV0L01hdHJpeC5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBuYW1lc3BhY2UgdHZtZXQ7CisKK3RlbXBsYXRlPGNsYXNzIHJlYWwsIGludCBTSVpFPgorY2xhc3MgdHZtZXRfaW50ZXJmYWNleworCitwdWJsaWMgOgorCisgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGUgOworCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gIHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3RvciA+IHN0bF9tYXRyaXg7CisKKyAgdHlwZWRlZiBWZWN0b3I8cmVhbCxTSVpFPiBnZW5lX3ZlY3RvcjsKKyAgdHlwZWRlZiBNYXRyaXg8cmVhbCxTSVpFLFNJWkU+IGdlbmVfbWF0cml4OworCisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSgpIHsgcmV0dXJuICJ0aW55X3R2bWV0IjsgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pe30KKworICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpe30KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgICBmb3IgKGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKQorICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKykKKyAgICAgICAgQShpLGopID0gQV9zdGxbal1baV07CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKQorICAgICAgQltpXT1CX3N0bFtpXTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgICAgIEJfc3RsW2ldPUJbaV07CisgICAgfQorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIGludCBOID0gQV9zdGwuc2l6ZSgpOworICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAgIEFfc3RsW2pdLnJlc2l6ZShOKTsKKyAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQorICAgICAgICBBX3N0bFtqXVtpXSA9IEEoaSxqKTsKKyAgICB9CisgIH0KKworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCAmIHNvdXJjZSwgZ2VuZV9tYXRyaXggJiBjaWJsZSwgaW50IE4peworICAgIGNpYmxlID0gc291cmNlOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgTil7CisgICAgY2libGUgPSBzb3VyY2U7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICBYID0gcHJvZChBLEIpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgWCA9IHByb2QoQSxCKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgWCA9IHByb2QodHJhbnMoQSksQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgWSs9Y29lZipYOworICB9CisKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy91Ymxhcy9DTWFrZUxpc3RzLnR4dCBiL2JlbmNoL2J0bC9saWJzL3VibGFzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYjU4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy91Ymxhcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDcgQEAKKworZmluZF9wYWNrYWdlKEJvb3N0KQoraWYgKEJvb3N0X0ZPVU5EKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Qm9vc3RfSU5DTFVERV9ESVJTfSkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0Jvb3N0X0lOQ0xVREVTfSkKKyAgYnRsX2FkZF9iZW5jaChidGxfdWJsYXMgbWFpbi5jcHApCitlbmRpZiAoQm9vc3RfRk9VTkQpCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy91Ymxhcy9tYWluLmNwcCBiL2JlbmNoL2J0bC9saWJzL3VibGFzL21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZTc3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9idGwvbGlicy91Ymxhcy9tYWluLmNwcApAQCAtMCwwICsxLDQ0IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgbWFpbi5jcHAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CisvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjI3IENFU1QgMjAwMgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisvLworI2luY2x1ZGUgInV0aWxpdGllcy5oIgorI2luY2x1ZGUgInVibGFzX2ludGVyZmFjZS5oaCIKKyNpbmNsdWRlICJiZW5jaC5oaCIKKyNpbmNsdWRlICJiYXNpY19hY3Rpb25zLmhoIgorCitCVExfTUFJTjsKKworaW50IG1haW4oKQoreworICBiZW5jaDxBY3Rpb25fYXhweTx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKy8vICAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKworICBiZW5jaDxBY3Rpb25fdHJpc29sdmU8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworCisgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL3VibGFzL3VibGFzX2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL3VibGFzL3VibGFzX2ludGVyZmFjZS5oaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNhZDUxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvYnRsL2xpYnMvdWJsYXMvdWJsYXNfaW50ZXJmYWNlLmhoCkBAIC0wLDAgKzEsMTQxIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlICAgOiAgdWJsYXNfaW50ZXJmYWNlLmhoCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgorLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoyNyBDRVNUIDIwMDIKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKy8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorLy8KKyNpZm5kZWYgVUJMQVNfSU5URVJGQUNFX0hICisjZGVmaW5lIFVCTEFTX0lOVEVSRkFDRV9ISAorCisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy92ZWN0b3IuaHBwPgorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvbWF0cml4LmhwcD4KKyNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL2lvLmhwcD4KKyNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL3RyaWFuZ3VsYXIuaHBwPgorCit1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Om51bWVyaWM7CisKK3RlbXBsYXRlIDxjbGFzcyByZWFsPgorY2xhc3MgdWJsYXNfaW50ZXJmYWNleworCitwdWJsaWMgOgorCisgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGUgOworCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yPiBzdGxfbWF0cml4OworCisgIHR5cGVkZWYgdHlwZW5hbWUgYm9vc3Q6Om51bWVyaWM6OnVibGFzOjptYXRyaXg8cmVhbCxib29zdDo6bnVtZXJpYzo6dWJsYXM6OmNvbHVtbl9tYWpvcj4gZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgYm9vc3Q6Om51bWVyaWM6OnVibGFzOjp2ZWN0b3I8cmVhbD4gZ2VuZV92ZWN0b3I7CisKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkgeyByZXR1cm4gInVibGFzIjsgfQorCisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pIHt9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKSB7fQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIEEucmVzaXplKEFfc3RsLnNpemUoKSxBX3N0bFswXS5zaXplKCkpOworICAgIGZvciAoaW50IGo9MDsgajxBX3N0bC5zaXplKCkgOyBqKyspCisgICAgICBmb3IgKGludCBpPTA7IGk8QV9zdGxbal0uc2l6ZSgpIDsgaSsrKQorICAgICAgICBBKGksaik9QV9zdGxbal1baV07CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgICBCLnJlc2l6ZShCX3N0bC5zaXplKCkpOworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspCisgICAgICBCKGkpPUJfc3RsW2ldOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspCisgICAgICBCX3N0bFtpXT1CKGkpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICAgIGludCBOPUFfc3RsLnNpemUoKTsKKyAgICBmb3IgKGludCBqPTA7ajxOO2orKykKKyAgICB7CisgICAgICBBX3N0bFtqXS5yZXNpemUoTik7CisgICAgICBmb3IgKGludCBpPTA7aTxOO2krKykKKyAgICAgICAgQV9zdGxbal1baV09QShpLGopOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4peworICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICAgIGNpYmxlKGkpID0gc291cmNlKGkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCAmIHNvdXJjZSwgZ2VuZV9tYXRyaXggJiBjaWJsZSwgaW50IE4peworICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAgICAgY2libGUoaSxqKSA9IHNvdXJjZShpLGopOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xvdyhnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgWCA9ICBwcm9kKEEsQik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0X3Nsb3coZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFggPSAgcHJvZChBLEIpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHlfc2xvdyhjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgWSs9Y29lZipYOworICB9CisKKyAgLy8gYWxpYXMgZnJlZSBhc3NpZ25lbWVudHMKKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBYLmFzc2lnbihwcm9kKEEsQikpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgICBYLmFzc2lnbihwcm9kKHRyYW5zKEEpLEIpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAgIFguYXNzaWduKHByb2QoQSxCKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7CisgICAgWS5wbHVzX2Fzc2lnbihjb2VmKlgpOworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCByZWFsIGIsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4peworICAgIFkgPSBhKlggKyBiKlk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICAvLyBYID0gIHByb2QodHJhbnMoQSksQSk7CisgICAgWC5hc3NpZ24ocHJvZCh0cmFucyhBKSxBKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgICAvLyBYID0gIHByb2QoQSx0cmFucyhBKSk7CisgICAgWC5hc3NpZ24ocHJvZChBLHRyYW5zKEEpKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgICAgWCA9IHNvbHZlKEwsIEIsIHVibGFzOjpsb3dlcl90YWcgKCkpOworICB9CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvY2hlY2tfY2FjaGVfcXVlcmllcy5jcHAgYi9iZW5jaC9jaGVja19jYWNoZV9xdWVyaWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlkNDRjCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvY2hlY2tfY2FjaGVfcXVlcmllcy5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKworI2RlZmluZSBFSUdFTl9JTlRFUk5BTF9ERUJVR19DQUNIRV9RVUVSWQorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyNkZWZpbmUgRFVNUF9DUFVJRChDT0RFKSB7XAorICBpbnQgYWJjZFs0XTsgXAorICBhYmNkWzBdID0gYWJjZFsxXSA9IGFiY2RbMl0gPSBhYmNkWzNdID0gMDtcCisgIEVJR0VOX0NQVUlEKGFiY2QsIENPREUsIDApOyBcCisgIHN0ZDo6Y291dCA8PCAiVGhlIGNvZGUgIiA8PCBDT0RFIDw8ICIgZ2l2ZXMgIiBcCisgICAgICAgICAgICAgIDw8IChpbnQqKShhYmNkWzBdKSA8PCAiICIgPDwgKGludCopKGFiY2RbMV0pIDw8ICIgIiBcCisgICAgICAgICAgICAgIDw8IChpbnQqKShhYmNkWzJdKSA8PCAiICIgPDwgKGludCopKGFiY2RbM10pIDw8ICIgIiA8PCBzdGQ6OmVuZGw7IFwKKyAgfQorICAKK2ludCBtYWluKCkKK3sKKyAgY291dCA8PCAiRWlnZW4ncyBMMSAgICA9ICIgPDwgaW50ZXJuYWw6OnF1ZXJ5TDFDYWNoZVNpemUoKSA8PCBlbmRsOworICBjb3V0IDw8ICJFaWdlbidzIEwyL0wzID0gIiA8PCBpbnRlcm5hbDo6cXVlcnlUb3BMZXZlbENhY2hlU2l6ZSgpIDw8IGVuZGw7CisgIGludCBsMSwgbDIsIGwzOworICBpbnRlcm5hbDo6cXVlcnlDYWNoZVNpemVzKGwxLCBsMiwgbDMpOworICBjb3V0IDw8ICJFaWdlbidzIEwxLCBMMiwgTDMgICAgICAgPSAiIDw8IGwxIDw8ICIgIiA8PCBsMiA8PCAiICIgPDwgbDMgPDwgZW5kbDsKKyAgCisgICNpZmRlZiBFSUdFTl9DUFVJRAorCisgIGludCBhYmNkWzRdOworICBpbnQgc3RyaW5nWzhdOworICBjaGFyKiBzdHJpbmdfY2hhciA9IChjaGFyKikoc3RyaW5nKTsKKworICAvLyB2ZW5kb3IgSUQKKyAgRUlHRU5fQ1BVSUQoYWJjZCwweDAsMCk7CisgIHN0cmluZ1swXSA9IGFiY2RbMV07CisgIHN0cmluZ1sxXSA9IGFiY2RbM107CisgIHN0cmluZ1syXSA9IGFiY2RbMl07CisgIHN0cmluZ1szXSA9IDA7CisgIGNvdXQgPDwgZW5kbDsKKyAgY291dCA8PCAidmVuZG9yIGlkID0gIiA8PCBzdHJpbmdfY2hhciA8PCBlbmRsOworICBjb3V0IDw8IGVuZGw7CisgIGludCBtYXhfZnVuY3MgPSBhYmNkWzBdOworCisgIGludGVybmFsOjpxdWVyeUNhY2hlU2l6ZXNfaW50ZWxfY29kZXMobDEsIGwyLCBsMyk7CisgIGNvdXQgPDwgIkVpZ2VuJ3MgaW50ZWwgY29kZXMgTDEsIEwyLCBMMyA9ICIgPDwgbDEgPDwgIiAiIDw8IGwyIDw8ICIgIiA8PCBsMyA8PCBlbmRsOworICBpZihtYXhfZnVuY3M+PTQpCisgIHsKKyAgICBpbnRlcm5hbDo6cXVlcnlDYWNoZVNpemVzX2ludGVsX2RpcmVjdChsMSwgbDIsIGwzKTsKKyAgICBjb3V0IDw8ICJFaWdlbidzIGludGVsIGRpcmVjdCBMMSwgTDIsIEwzID0gIiA8PCBsMSA8PCAiICIgPDwgbDIgPDwgIiAiIDw8IGwzIDw8IGVuZGw7CisgIH0KKyAgaW50ZXJuYWw6OnF1ZXJ5Q2FjaGVTaXplc19hbWQobDEsIGwyLCBsMyk7CisgIGNvdXQgPDwgIkVpZ2VuJ3MgYW1kIEwxLCBMMiwgTDMgICAgICAgICA9ICIgPDwgbDEgPDwgIiAiIDw8IGwyIDw8ICIgIiA8PCBsMyA8PCBlbmRsOworICBjb3V0IDw8IGVuZGw7CisgIAorICAvLyBkdW1wIEludGVsIGRpcmVjdCBtZXRob2QKKyAgaWYobWF4X2Z1bmNzPj00KQorICB7CisgICAgbDEgPSBsMiA9IGwzID0gMDsKKyAgICBpbnQgY2FjaGVfaWQgPSAwOworICAgIGludCBjYWNoZV90eXBlID0gMDsKKyAgICBkbyB7CisgICAgICBhYmNkWzBdID0gYWJjZFsxXSA9IGFiY2RbMl0gPSBhYmNkWzNdID0gMDsKKyAgICAgIEVJR0VOX0NQVUlEKGFiY2QsMHg0LGNhY2hlX2lkKTsKKyAgICAgIGNhY2hlX3R5cGUgID0gKGFiY2RbMF0gJiAweDBGKSA+PiAwOworICAgICAgaW50IGNhY2hlX2xldmVsID0gKGFiY2RbMF0gJiAweEUwKSA+PiA1OyAgLy8gQVs3OjVdCisgICAgICBpbnQgd2F5cyAgICAgICAgPSAoYWJjZFsxXSAmIDB4RkZDMDAwMDApID4+IDIyOyAvLyBCWzMxOjIyXQorICAgICAgaW50IHBhcnRpdGlvbnMgID0gKGFiY2RbMV0gJiAweDAwM0ZGMDAwKSA+PiAxMjsgLy8gQlsyMToxMl0KKyAgICAgIGludCBsaW5lX3NpemUgICA9IChhYmNkWzFdICYgMHgwMDAwMEZGRikgPj4gIDA7IC8vIEJbMTE6MF0KKyAgICAgIGludCBzZXRzICAgICAgICA9IChhYmNkWzJdKTsgICAgICAgICAgICAgICAgICAgIC8vIENbMzE6MF0KKyAgICAgIGludCBjYWNoZV9zaXplID0gKHdheXMrMSkgKiAocGFydGl0aW9ucysxKSAqIChsaW5lX3NpemUrMSkgKiAoc2V0cysxKTsKKyAgICAgIAorICAgICAgY291dCA8PCAiY2FjaGVbIiA8PCBjYWNoZV9pZCA8PCAiXS50eXBlICAgICAgID0gIiA8PCBjYWNoZV90eXBlIDw8ICJcbiI7CisgICAgICBjb3V0IDw8ICJjYWNoZVsiIDw8IGNhY2hlX2lkIDw8ICJdLmxldmVsICAgICAgPSAiIDw8IGNhY2hlX2xldmVsIDw8ICJcbiI7CisgICAgICBjb3V0IDw8ICJjYWNoZVsiIDw8IGNhY2hlX2lkIDw8ICJdLndheXMgICAgICAgPSAiIDw8IHdheXMgPDwgIlxuIjsKKyAgICAgIGNvdXQgPDwgImNhY2hlWyIgPDwgY2FjaGVfaWQgPDwgIl0ucGFydGl0aW9ucyA9ICIgPDwgcGFydGl0aW9ucyA8PCAiXG4iOworICAgICAgY291dCA8PCAiY2FjaGVbIiA8PCBjYWNoZV9pZCA8PCAiXS5saW5lX3NpemUgID0gIiA8PCBsaW5lX3NpemUgPDwgIlxuIjsKKyAgICAgIGNvdXQgPDwgImNhY2hlWyIgPDwgY2FjaGVfaWQgPDwgIl0uc2V0cyAgICAgICA9ICIgPDwgc2V0cyA8PCAiXG4iOworICAgICAgY291dCA8PCAiY2FjaGVbIiA8PCBjYWNoZV9pZCA8PCAiXS5zaXplICAgICAgID0gIiA8PCBjYWNoZV9zaXplIDw8ICJcbiI7CisgICAgICAKKyAgICAgIGNhY2hlX2lkKys7CisgICAgfSB3aGlsZShjYWNoZV90eXBlPjAgJiYgY2FjaGVfaWQ8MTYpOworICB9CisgIAorICAvLyBkdW1wIGV2ZXJ5dGhpbmcKKyAgc3RkOjpjb3V0IDw8IGVuZGwgPDwiUmF3IGR1bXA6IiA8PCBlbmRsOworICBmb3IoaW50IGk9MDsgaTxtYXhfZnVuY3M7ICsraSkKKyAgICBEVU1QX0NQVUlEKGkpOworCisgIERVTVBfQ1BVSUQoMHg4MDAwMDAwMCk7CisgIERVTVBfQ1BVSUQoMHg4MDAwMDAwMSk7CisgIERVTVBfQ1BVSUQoMHg4MDAwMDAwMik7CisgIERVTVBfQ1BVSUQoMHg4MDAwMDAwMyk7CisgIERVTVBfQ1BVSUQoMHg4MDAwMDAwNCk7CisgIERVTVBfQ1BVSUQoMHg4MDAwMDAwNSk7CisgIERVTVBfQ1BVSUQoMHg4MDAwMDAwNik7CisgIERVTVBfQ1BVSUQoMHg4MDAwMDAwNyk7CisgIERVTVBfQ1BVSUQoMHg4MDAwMDAwOCk7CisgICNlbHNlCisgIGNvdXQgPDwgIkVJR0VOX0NQVUlEIGlzIG5vdCBkZWZpbmVkIiA8PCBlbmRsOworICAjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9iZW5jaC9laWczMy5jcHAgYi9iZW5jaC9laWczMy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwOGI5OQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL2VpZzMzLmNwcApAQCAtMCwwICsxLDE5NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBUaGUgY29tcHV0ZVJvb3RzIGZ1bmN0aW9uIGluY2x1ZGVkIGluIHRoaXMgaXMgYmFzZWQgb24gbWF0ZXJpYWxzCisvLyBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZCBsaWNlbnNlOgorLy8gCisvLyBHZW9tZXRyaWMgVG9vbHMsIExMQworLy8gQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKy8vIAorLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uCisvLyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBzb2Z0d2FyZSBhbmQgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gY292ZXJlZCBieQorLy8gdGhpcyBsaWNlbnNlICh0aGUgIlNvZnR3YXJlIikgdG8gdXNlLCByZXByb2R1Y2UsIGRpc3BsYXksIGRpc3RyaWJ1dGUsCisvLyBleGVjdXRlLCBhbmQgdHJhbnNtaXQgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZQorLy8gU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgdGhpcmQtcGFydGllcyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8KKy8vIGRvIHNvLCBhbGwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nOgorLy8gCisvLyBUaGUgY29weXJpZ2h0IG5vdGljZXMgaW4gdGhlIFNvZnR3YXJlIGFuZCB0aGlzIGVudGlyZSBzdGF0ZW1lbnQsIGluY2x1ZGluZworLy8gdGhlIGFib3ZlIGxpY2Vuc2UgZ3JhbnQsIHRoaXMgcmVzdHJpY3Rpb24gYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKy8vIG11c3QgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGluIHdob2xlIG9yIGluIHBhcnQsIGFuZAorLy8gYWxsIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNvZnR3YXJlLCB1bmxlc3Mgc3VjaCBjb3BpZXMgb3IgZGVyaXZhdGl2ZQorLy8gd29ya3MgYXJlIHNvbGVseSBpbiB0aGUgZm9ybSBvZiBtYWNoaW5lLWV4ZWN1dGFibGUgb2JqZWN0IGNvZGUgZ2VuZXJhdGVkIGJ5CisvLyBhIHNvdXJjZSBsYW5ndWFnZSBwcm9jZXNzb3IuCisvLyAKKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisvLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQKKy8vIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBBTllPTkUgRElTVFJJQlVUSU5HIFRIRSBTT0ZUV0FSRSBCRSBMSUFCTEUKKy8vIEZPUiBBTlkgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorLy8gQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisvLyBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPGJlbmNoL0JlbmNoVGltZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4LCB0eXBlbmFtZSBSb290cz4KK2lubGluZSB2b2lkIGNvbXB1dGVSb290cyhjb25zdCBNYXRyaXgmIG0sIFJvb3RzJiByb290cykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXg6OlNjYWxhciBTY2FsYXI7CisgIGNvbnN0IFNjYWxhciBzX2ludjMgPSAxLjAvMy4wOworICBjb25zdCBTY2FsYXIgc19zcXJ0MyA9IGludGVybmFsOjpzcXJ0KFNjYWxhcigzLjApKTsKKworICAvLyBUaGUgY2hhcmFjdGVyaXN0aWMgZXF1YXRpb24gaXMgeF4zIC0gYzIqeF4yICsgYzEqeCAtIGMwID0gMC4gIFRoZQorICAvLyBlaWdlbnZhbHVlcyBhcmUgdGhlIHJvb3RzIHRvIHRoaXMgZXF1YXRpb24sIGFsbCBndWFyYW50ZWVkIHRvIGJlCisgIC8vIHJlYWwtdmFsdWVkLCBiZWNhdXNlIHRoZSBtYXRyaXggaXMgc3ltbWV0cmljLgorICBTY2FsYXIgYzAgPSBtKDAsMCkqbSgxLDEpKm0oMiwyKSArIFNjYWxhcigyKSptKDAsMSkqbSgwLDIpKm0oMSwyKSAtIG0oMCwwKSptKDEsMikqbSgxLDIpIC0gbSgxLDEpKm0oMCwyKSptKDAsMikgLSBtKDIsMikqbSgwLDEpKm0oMCwxKTsKKyAgU2NhbGFyIGMxID0gbSgwLDApKm0oMSwxKSAtIG0oMCwxKSptKDAsMSkgKyBtKDAsMCkqbSgyLDIpIC0gbSgwLDIpKm0oMCwyKSArIG0oMSwxKSptKDIsMikgLSBtKDEsMikqbSgxLDIpOworICBTY2FsYXIgYzIgPSBtKDAsMCkgKyBtKDEsMSkgKyBtKDIsMik7CisKKyAgLy8gQ29uc3RydWN0IHRoZSBwYXJhbWV0ZXJzIHVzZWQgaW4gY2xhc3NpZnlpbmcgdGhlIHJvb3RzIG9mIHRoZSBlcXVhdGlvbgorICAvLyBhbmQgaW4gc29sdmluZyB0aGUgZXF1YXRpb24gZm9yIHRoZSByb290cyBpbiBjbG9zZWQgZm9ybS4KKyAgU2NhbGFyIGMyX292ZXJfMyA9IGMyKnNfaW52MzsKKyAgU2NhbGFyIGFfb3Zlcl8zID0gKGMxIC0gYzIqYzJfb3Zlcl8zKSpzX2ludjM7CisgIGlmIChhX292ZXJfMyA+IFNjYWxhcigwKSkKKyAgICBhX292ZXJfMyA9IFNjYWxhcigwKTsKKworICBTY2FsYXIgaGFsZl9iID0gU2NhbGFyKDAuNSkqKGMwICsgYzJfb3Zlcl8zKihTY2FsYXIoMikqYzJfb3Zlcl8zKmMyX292ZXJfMyAtIGMxKSk7CisKKyAgU2NhbGFyIHEgPSBoYWxmX2IqaGFsZl9iICsgYV9vdmVyXzMqYV9vdmVyXzMqYV9vdmVyXzM7CisgIGlmIChxID4gU2NhbGFyKDApKQorICAgIHEgPSBTY2FsYXIoMCk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMgYnkgc29sdmluZyBmb3IgdGhlIHJvb3RzIG9mIHRoZSBwb2x5bm9taWFsLgorICBTY2FsYXIgcmhvID0gaW50ZXJuYWw6OnNxcnQoLWFfb3Zlcl8zKTsKKyAgU2NhbGFyIHRoZXRhID0gc3RkOjphdGFuMihpbnRlcm5hbDo6c3FydCgtcSksaGFsZl9iKSpzX2ludjM7CisgIFNjYWxhciBjb3NfdGhldGEgPSBpbnRlcm5hbDo6Y29zKHRoZXRhKTsKKyAgU2NhbGFyIHNpbl90aGV0YSA9IGludGVybmFsOjpzaW4odGhldGEpOworICByb290cygwKSA9IGMyX292ZXJfMyArIFNjYWxhcigyKSpyaG8qY29zX3RoZXRhOworICByb290cygxKSA9IGMyX292ZXJfMyAtIHJobyooY29zX3RoZXRhICsgc19zcXJ0MypzaW5fdGhldGEpOworICByb290cygyKSA9IGMyX292ZXJfMyAtIHJobyooY29zX3RoZXRhIC0gc19zcXJ0MypzaW5fdGhldGEpOworCisgIC8vIFNvcnQgaW4gaW5jcmVhc2luZyBvcmRlci4KKyAgaWYgKHJvb3RzKDApID49IHJvb3RzKDEpKQorICAgIHN0ZDo6c3dhcChyb290cygwKSxyb290cygxKSk7CisgIGlmIChyb290cygxKSA+PSByb290cygyKSkKKyAgeworICAgIHN0ZDo6c3dhcChyb290cygxKSxyb290cygyKSk7CisgICAgaWYgKHJvb3RzKDApID49IHJvb3RzKDEpKQorICAgICAgc3RkOjpzd2FwKHJvb3RzKDApLHJvb3RzKDEpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXgsIHR5cGVuYW1lIFZlY3Rvcj4KK3ZvaWQgZWlnZW4zMyhjb25zdCBNYXRyaXgmIG1hdCwgTWF0cml4JiBldmVjcywgVmVjdG9yJiBldmFscykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXg6OlNjYWxhciBTY2FsYXI7CisgIC8vIFNjYWxlIHRoZSBtYXRyaXggc28gaXRzIGVudHJpZXMgYXJlIGluIFstMSwxXS4gIFRoZSBzY2FsaW5nIGlzIGFwcGxpZWQKKyAgLy8gb25seSB3aGVuIGF0IGxlYXN0IG9uZSBtYXRyaXggZW50cnkgaGFzIG1hZ25pdHVkZSBsYXJnZXIgdGhhbiAxLgorCisgIFNjYWxhciBzY2FsZSA9IG1hdC5jd2lzZUFicygpLyoudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkqLy5tYXhDb2VmZigpOworICBzY2FsZSA9IHN0ZDo6bWF4KHNjYWxlLFNjYWxhcigxKSk7CisgIE1hdHJpeCBzY2FsZWRNYXQgPSBtYXQgLyBzY2FsZTsKKworICAvLyBDb21wdXRlIHRoZSBlaWdlbnZhbHVlcworLy8gICBzY2FsZWRNYXQuc2V0WmVybygpOworICBjb21wdXRlUm9vdHMoc2NhbGVkTWF0LGV2YWxzKTsKKworICAvLyBjb21wdXRlIHRoZSBlaWdlbiB2ZWN0b3JzCisgIC8vICoqaGVyZSB3ZSBhc3N1bWUgMyBkaWZmZXJlbnRzIGVpZ2VudmFsdWVzKioKKworICAvLyAib3B0aW1pemVkIHZlcnNpb24iIHdoaWNoIGFwcGVhcnMgdG8gYmUgc2xvd2VyIHdpdGggZ2NjIQorLy8gICAgIFZlY3RvciBiYXNlOworLy8gICAgIFNjYWxhciBhbHBoYSwgYmV0YTsKKy8vICAgICBiYXNlIDw8ICAgc2NhbGVkTWF0KDEsMCkgKiBzY2FsZWRNYXQoMiwxKSwKKy8vICAgICAgICAgICAgICAgc2NhbGVkTWF0KDEsMCkgKiBzY2FsZWRNYXQoMiwwKSwKKy8vICAgICAgICAgICAgICAtc2NhbGVkTWF0KDEsMCkgKiBzY2FsZWRNYXQoMSwwKTsKKy8vICAgICBmb3IoaW50IGs9MDsgazwyOyArK2spCisvLyAgICAgeworLy8gICAgICAgYWxwaGEgPSBzY2FsZWRNYXQoMCwwKSAtIGV2YWxzKGspOworLy8gICAgICAgYmV0YSAgPSBzY2FsZWRNYXQoMSwxKSAtIGV2YWxzKGspOworLy8gICAgICAgZXZlY3MuY29sKGspID0gKGJhc2UgKyBWZWN0b3IoLWJldGEqc2NhbGVkTWF0KDIsMCksIC1hbHBoYSpzY2FsZWRNYXQoMiwxKSwgYWxwaGEqYmV0YSkpLm5vcm1hbGl6ZWQoKTsKKy8vICAgICB9CisvLyAgICAgZXZlY3MuY29sKDIpID0gZXZlY3MuY29sKDApLmNyb3NzKGV2ZWNzLmNvbCgxKSkubm9ybWFsaXplZCgpOworCisvLyAgIC8vIG5haXZlIHZlcnNpb24KKy8vICAgTWF0cml4IHRtcDsKKy8vICAgdG1wID0gc2NhbGVkTWF0OworLy8gICB0bXAuZGlhZ29uYWwoKS5hcnJheSgpIC09IGV2YWxzKDApOworLy8gICBldmVjcy5jb2woMCkgPSB0bXAucm93KDApLmNyb3NzKHRtcC5yb3coMSkpLm5vcm1hbGl6ZWQoKTsKKy8vIAorLy8gICB0bXAgPSBzY2FsZWRNYXQ7CisvLyAgIHRtcC5kaWFnb25hbCgpLmFycmF5KCkgLT0gZXZhbHMoMSk7CisvLyAgIGV2ZWNzLmNvbCgxKSA9IHRtcC5yb3coMCkuY3Jvc3ModG1wLnJvdygxKSkubm9ybWFsaXplZCgpOworLy8gCisvLyAgIHRtcCA9IHNjYWxlZE1hdDsKKy8vICAgdG1wLmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBldmFscygyKTsKKy8vICAgZXZlY3MuY29sKDIpID0gdG1wLnJvdygwKS5jcm9zcyh0bXAucm93KDEpKS5ub3JtYWxpemVkKCk7CisgIAorICAvLyBhIG1vcmUgc3RhYmxlIHZlcnNpb246CisgIGlmKChldmFscygyKS1ldmFscygwKSk8PUVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICB7CisgICAgZXZlY3Muc2V0SWRlbnRpdHkoKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBNYXRyaXggdG1wOworICAgIHRtcCA9IHNjYWxlZE1hdDsKKyAgICB0bXAuZGlhZ29uYWwgKCkuYXJyYXkgKCkgLT0gZXZhbHMgKDIpOworICAgIGV2ZWNzLmNvbCAoMikgPSB0bXAucm93ICgwKS5jcm9zcyAodG1wLnJvdyAoMSkpLm5vcm1hbGl6ZWQgKCk7CisgICAgCisgICAgdG1wID0gc2NhbGVkTWF0OworICAgIHRtcC5kaWFnb25hbCAoKS5hcnJheSAoKSAtPSBldmFscyAoMSk7CisgICAgZXZlY3MuY29sKDEpID0gdG1wLnJvdyAoMCkuY3Jvc3ModG1wLnJvdyAoMSkpOworICAgIFNjYWxhciBuMSA9IGV2ZWNzLmNvbCgxKS5ub3JtKCk7CisgICAgaWYobjE8PUVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgZXZlY3MuY29sKDEpID0gZXZlY3MuY29sKDIpLnVuaXRPcnRob2dvbmFsKCk7CisgICAgZWxzZQorICAgICAgZXZlY3MuY29sKDEpIC89IG4xOworICAgIAorICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGV2ZWNzWzFdIGlzIG9ydGhvZ29uYWwgdG8gZXZlY3NbMl0KKyAgICBldmVjcy5jb2woMSkgPSBldmVjcy5jb2woMikuY3Jvc3MoZXZlY3MuY29sKDEpLmNyb3NzKGV2ZWNzLmNvbCgyKSkpLm5vcm1hbGl6ZWQoKTsKKyAgICBldmVjcy5jb2woMCkgPSBldmVjcy5jb2woMikuY3Jvc3MoZXZlY3MuY29sKDEpKTsKKyAgfQorICAKKyAgLy8gUmVzY2FsZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplLgorICBldmFscyAqPSBzY2FsZTsKK30KKworaW50IG1haW4oKQoreworICBCZW5jaFRpbWVyIHQ7CisgIGludCB0cmllcyA9IDEwOworICBpbnQgcmVwID0gNDAwMDAwOworICB0eXBlZGVmIE1hdHJpeDNmIE1hdDsKKyAgdHlwZWRlZiBWZWN0b3IzZiBWZWM7CisgIE1hdCBBID0gTWF0OjpSYW5kb20oMywzKTsKKyAgQSA9IEEuYWRqb2ludCgpICogQTsKKworICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdD4gZWlnKEEpOworICBCRU5DSCh0LCB0cmllcywgcmVwLCBlaWcuY29tcHV0ZShBKSk7CisgIHN0ZDo6Y291dCA8PCAiRWlnZW46ICAiIDw8IHQuYmVzdCgpIDw8ICJzXG4iOworCisgIE1hdCBldmVjczsKKyAgVmVjIGV2YWxzOworICBCRU5DSCh0LCB0cmllcywgcmVwLCBlaWdlbjMzKEEsZXZlY3MsZXZhbHMpKTsKKyAgc3RkOjpjb3V0IDw8ICJEaXJlY3Q6ICIgPDwgdC5iZXN0KCkgPDwgInNcblxuIjsKKworICBzdGQ6OmNlcnIgPDwgIkVpZ2VudmFsdWUvZWlnZW52ZWN0b3IgZGlmZnM6XG4iOworICBzdGQ6OmNlcnIgPDwgKGV2YWxzIC0gZWlnLmVpZ2VudmFsdWVzKCkpLnRyYW5zcG9zZSgpIDw8ICJcbiI7CisgIGZvcihpbnQgaz0wO2s8MzsrK2spCisgICAgaWYoZXZlY3MuY29sKGspLmRvdChlaWcuZWlnZW52ZWN0b3JzKCkuY29sKGspKTwwKQorICAgICAgZXZlY3MuY29sKGspID0gLWV2ZWNzLmNvbChrKTsKKyAgc3RkOjpjZXJyIDw8IGV2ZWNzIC0gZWlnLmVpZ2VudmVjdG9ycygpIDw8ICJcblxuIjsKK30KZGlmZiAtLWdpdCBhL2JlbmNoL2dlb21ldHJ5LmNwcCBiL2JlbmNoL2dlb21ldHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTg3YTUxCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvZ2VvbWV0cnkuY3BwCkBAIC0wLDAgKzEsMTI2IEBACisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFRpbWVyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgU0NBTEFSCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDgKKyNlbmRpZgorCit0eXBlZGVmIFNDQUxBUiBTY2FsYXI7Cit0eXBlZGVmIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7Cit0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLER5bmFtaWMsRHluYW1pYz4gQTsKK3R5cGVkZWYgTWF0cml4PC8qUmVhbCovU2NhbGFyLER5bmFtaWMsRHluYW1pYz4gQjsKK3R5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IEM7Cit0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtYXRpb24sIHR5cGVuYW1lIERhdGE+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbiYgdCwgRGF0YSYgZGF0YSkKK3sKKyAgRUlHRU5fQVNNX0NPTU1FTlQoImJlZ2luIik7CisgIGRhdGEgPSB0ICogZGF0YTsKKyAgRUlHRU5fQVNNX0NPTU1FTlQoImVuZCIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIERhdGE+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHRyYW5zZm9ybShjb25zdCBRdWF0ZXJuaW9uPFNjYWxhcj4mIHQsIERhdGEmIGRhdGEpCit7CisgIEVJR0VOX0FTTV9DT01NRU5UKCJiZWdpbiBxdWF0Iik7CisgIGZvcihpbnQgaT0wO2k8ZGF0YS5jb2xzKCk7KytpKQorICAgIGRhdGEuY29sKGkpID0gdCAqIGRhdGEuY29sKGkpOworICBFSUdFTl9BU01fQ09NTUVOVCgiZW5kIHF1YXQiKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFRvUm90YXRpb25NYXRyaXhXcmFwcGVyCit7CisgIGVudW0ge0RpbSA9IFQ6OkRpbX07CisgIHR5cGVkZWYgdHlwZW5hbWUgVDo6U2NhbGFyIFNjYWxhcjsKKyAgVG9Sb3RhdGlvbk1hdHJpeFdyYXBwZXIoY29uc3QgVCYgbykgOiBvYmplY3Qobykge30KKyAgVCBvYmplY3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBRVHlwZSwgdHlwZW5hbWUgRGF0YT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRvUm90YXRpb25NYXRyaXhXcmFwcGVyPFFUeXBlPiYgdCwgRGF0YSYgZGF0YSkKK3sKKyAgRUlHRU5fQVNNX0NPTU1FTlQoImJlZ2luIHF1YXQgdmlhIG1hdCIpOworICBkYXRhID0gdC5vYmplY3QudG9Sb3RhdGlvbk1hdHJpeCgpICogZGF0YTsKKyAgRUlHRU5fQVNNX0NPTU1FTlQoImVuZCBxdWF0IHZpYSBtYXQiKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCB0eXBlbmFtZSBEYXRhPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCB0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtPFNjYWxhcixEaW0sUHJvamVjdGl2ZT4mIHQsIERhdGEmIGRhdGEpCit7CisgIGRhdGEgPSAodCAqIGRhdGEuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkpLnRlbXBsYXRlIGJsb2NrPERpbSxEYXRhOjpDb2xzQXRDb21waWxlVGltZT4oMCwwKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGdldF9kaW0geyBlbnVtIHsgRGltID0gVDo6RGltIH07IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgUiwgaW50IEMsIGludCBPLCBpbnQgTVIsIGludCBNQz4KK3N0cnVjdCBnZXRfZGltPE1hdHJpeDxTLFIsQyxPLE1SLE1DPiA+IHsgZW51bSB7IERpbSA9IFIgfTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtYXRpb24sIGludCBOPgorc3RydWN0IGJlbmNoX2ltcGwKK3sKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKGNvbnN0IFRyYW5zZm9ybWF0aW9uJiB0KQorICB7CisgICAgTWF0cml4PHR5cGVuYW1lIFRyYW5zZm9ybWF0aW9uOjpTY2FsYXIsZ2V0X2RpbTxUcmFuc2Zvcm1hdGlvbj46OkRpbSxOPiBkYXRhOworICAgIGRhdGEuc2V0UmFuZG9tKCk7CisgICAgYmVuY2hfaW1wbDxUcmFuc2Zvcm1hdGlvbixOLTE+OjpydW4odCk7CisgICAgQmVuY2hUaW1lciB0aW1lcjsKKyAgICBCRU5DSCh0aW1lciwxMCwxMDAwMDAsdHJhbnNmb3JtKHQsZGF0YSkpOworICAgIGNvdXQud2lkdGgoOSk7CisgICAgY291dCA8PCB0aW1lci5iZXN0KCkgPDwgIiAiOworICB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zZm9ybWF0aW9uPgorc3RydWN0IGJlbmNoX2ltcGw8VHJhbnNmb3JtYXRpb24sMD4KK3sKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKGNvbnN0IFRyYW5zZm9ybWF0aW9uJikge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zZm9ybWF0aW9uPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBiZW5jaChjb25zdCBzdGQ6OnN0cmluZyYgbXNnLCBjb25zdCBUcmFuc2Zvcm1hdGlvbiYgdCkKK3sKKyAgY291dCA8PCBtc2cgPDwgIiAiOworICBiZW5jaF9pbXBsPFRyYW5zZm9ybWF0aW9uLFNJWkU+OjpydW4odCk7CisgIHN0ZDo6Y291dCA8PCAiXG4iOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICBNYXRyaXg8U2NhbGFyLDMsND4gbWF0MzQ7IG1hdDM0LnNldFJhbmRvbSgpOworICBUcmFuc2Zvcm08U2NhbGFyLDMsSXNvbWV0cnk+IGlzbzMobWF0MzQpOworICBUcmFuc2Zvcm08U2NhbGFyLDMsQWZmaW5lPiBhZmYzKG1hdDM0KTsKKyAgVHJhbnNmb3JtPFNjYWxhciwzLEFmZmluZUNvbXBhY3Q+IGNhZmYzKG1hdDM0KTsKKyAgVHJhbnNmb3JtPFNjYWxhciwzLFByb2plY3RpdmU+IHByb2ozKG1hdDM0KTsKKyAgUXVhdGVybmlvbjxTY2FsYXI+IHF1YXQ7cXVhdC5zZXRJZGVudGl0eSgpOworICBUb1JvdGF0aW9uTWF0cml4V3JhcHBlcjxRdWF0ZXJuaW9uPFNjYWxhcj4gPiBxdWF0bWF0KHF1YXQpOworICBNYXRyaXg8U2NhbGFyLDMsMz4gbWF0MzM7IG1hdDMzLnNldFJhbmRvbSgpOworICAKKyAgY291dC5wcmVjaXNpb24oNCk7CisgIHN0ZDo6Y291dAorICAgICA8PCAiTiAgICAgICAgICAiOworICBmb3IoaW50IGk9MDtpPFNJWkU7KytpKQorICB7CisgICAgY291dC53aWR0aCg5KTsKKyAgICBjb3V0IDw8IGkrMSA8PCAiICI7CisgIH0KKyAgY291dCA8PCAiXG4iOworICAKKyAgYmVuY2goIm1hdHJpeCAzeDMiLCBtYXQzMyk7CisgIGJlbmNoKCJxdWF0ZXJuaW9uIiwgcXVhdCk7CisgIGJlbmNoKCJxdWF0LW1hdCAgIiwgcXVhdG1hdCk7CisgIGJlbmNoKCJpc29tZXRyeTMgIiwgaXNvMyk7CisgIGJlbmNoKCJhZmZpbmUzICAgIiwgYWZmMyk7CisgIGJlbmNoKCJjIGFmZmluZTMgIiwgY2FmZjMpOworICBiZW5jaCgicHJvajMgICAgICIsIHByb2ozKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmVuY2gvcHJvZHVjdF90aHJlc2hvbGQuY3BwIGIvYmVuY2gvcHJvZHVjdF90aHJlc2hvbGQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNmQxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9wcm9kdWN0X3RocmVzaG9sZC5jcHAKQEAgLTAsMCArMSwxNDMgQEAKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8YmVuY2gvQmVuY2hUaW1lci5oPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisjZGVmaW5lIEVORCA5CisKK3RlbXBsYXRlPGludCBTPiBzdHJ1Y3QgbWFwX3NpemUgeyBlbnVtIHsgcmV0ID0gUyB9OyB9OwordGVtcGxhdGU8PiAgc3RydWN0IG1hcF9zaXplPDEwPiB7IGVudW0geyByZXQgPSAyMCB9OyB9OwordGVtcGxhdGU8PiAgc3RydWN0IG1hcF9zaXplPDExPiB7IGVudW0geyByZXQgPSA1MCB9OyB9OwordGVtcGxhdGU8PiAgc3RydWN0IG1hcF9zaXplPDEyPiB7IGVudW0geyByZXQgPSAxMDAgfTsgfTsKK3RlbXBsYXRlPD4gIHN0cnVjdCBtYXBfc2l6ZTwxMz4geyBlbnVtIHsgcmV0ID0gMzAwIH07IH07CisKK3RlbXBsYXRlPGludCBNLCBpbnQgTixpbnQgSz4gc3RydWN0IGFsdF9wcm9kCit7CisgIGVudW0geworICAgIHJldCA9IE09PTEgJiYgTj09MSA/IElubmVyUHJvZHVjdAorICAgICAgICA6IEs9PTEgPyBPdXRlclByb2R1Y3QKKyAgICAgICAgOiBNPT0xID8gR2VtdlByb2R1Y3QKKyAgICAgICAgOiBOPT0xID8gR2VtdlByb2R1Y3QKKyAgICAgICAgOiBHZW1tUHJvZHVjdAorICB9OworfTsKKyAgICAgICAgCit2b2lkIHByaW50X21vZGUoaW50IG1vZGUpCit7CisgIGlmKG1vZGU9PUlubmVyUHJvZHVjdCkgc3RkOjpjb3V0IDw8ICJpIjsKKyAgaWYobW9kZT09T3V0ZXJQcm9kdWN0KSBzdGQ6OmNvdXQgPDwgIm8iOworICBpZihtb2RlPT1Db2VmZkJhc2VkUHJvZHVjdE1vZGUpIHN0ZDo6Y291dCA8PCAiYyI7CisgIGlmKG1vZGU9PUxhenlDb2VmZkJhc2VkUHJvZHVjdE1vZGUpIHN0ZDo6Y291dCA8PCAibCI7CisgIGlmKG1vZGU9PUdlbXZQcm9kdWN0KSBzdGQ6OmNvdXQgPDwgInYiOworICBpZihtb2RlPT1HZW1tUHJvZHVjdCkgc3RkOjpjb3V0IDw8ICJtIjsKK30KKwordGVtcGxhdGU8aW50IE1vZGUsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXM+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHByb2QoY29uc3QgTGhzJiBhLCBjb25zdCBSaHMmIGIsIFJlcyYgYykKK3sKKyAgYy5ub2FsaWFzKCkgKz0gdHlwZW5hbWUgUHJvZHVjdFJldHVyblR5cGU8TGhzLFJocyxNb2RlPjo6VHlwZShhLGIpOworfQorCit0ZW1wbGF0ZTxpbnQgTSwgaW50IE4sIGludCBLLCB0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBiZW5jaF9wcm9kKCkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLE0sSz4gTGhzOyBMaHMgYTsgYS5zZXRSYW5kb20oKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLEssTj4gUmhzOyBSaHMgYjsgYi5zZXRSYW5kb20oKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLE0sTj4gUmVzOyBSZXMgYzsgYy5zZXRSYW5kb20oKTsKKworICBCZW5jaFRpbWVyIHQ7CisgIGRvdWJsZSBuID0gMi4qZG91YmxlKE0pKmRvdWJsZShOKSpkb3VibGUoSyk7CisgIGludCByZXAgPSAxMDAwMDAuL247CisgIHJlcCAvPSAyOworICBpZihyZXA8MSkgcmVwID0gMTsKKyAgZG8geworICAgIHJlcCAqPSAyOworICAgIHQucmVzZXQoKTsKKyAgICBCRU5DSCh0LDEscmVwLHByb2Q8Q29lZmZCYXNlZFByb2R1Y3RNb2RlPihhLGIsYykpOworICB9IHdoaWxlKHQuYmVzdCgpPDAuMSk7CisgIAorICB0LnJlc2V0KCk7CisgIEJFTkNIKHQsNSxyZXAscHJvZDxNb2RlPihhLGIsYykpOworCisgIHByaW50X21vZGUoTW9kZSk7CisgIHN0ZDo6Y291dCA8PCBpbnQoMWUtNipuKnJlcC90LmJlc3QoKSkgPDwgIlx0IjsKK30KKwordGVtcGxhdGU8aW50IE4+IHN0cnVjdCBwcmludF9uOwordGVtcGxhdGU8aW50IE0sIGludCBOLCBpbnQgSz4gc3RydWN0IGxvb3Bfb25fbTsKK3RlbXBsYXRlPGludCBNLCBpbnQgTiwgaW50IEssIHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGU+IHN0cnVjdCBsb29wX29uX247CisKK3RlbXBsYXRlPGludCBNLCBpbnQgTiwgaW50IEs+CitzdHJ1Y3QgbG9vcF9vbl9rCit7CisgIHN0YXRpYyB2b2lkIHJ1bigpCisgIHsKKyAgICBzdGQ6OmNvdXQgPDwgIks9IiA8PCBLIDw8ICJcdCI7CisgICAgcHJpbnRfbjxOPjo6cnVuKCk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisKKyAgICBsb29wX29uX208TSxOLEs+OjpydW4oKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuXG4iOworCisgICAgbG9vcF9vbl9rPE0sTixLKzE+OjpydW4oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8aW50IE0sIGludCBOPgorc3RydWN0IGxvb3Bfb25fazxNLE4sRU5EPiB7IHN0YXRpYyB2b2lkIHJ1bigpe30gfTsKKworCit0ZW1wbGF0ZTxpbnQgTSwgaW50IE4sIGludCBLPgorc3RydWN0IGxvb3Bfb25fbQoreworICBzdGF0aWMgdm9pZCBydW4oKQorICB7CisgICAgc3RkOjpjb3V0IDw8IE0gPDwgImZcdCI7CisgICAgbG9vcF9vbl9uPE0sTixLLGZsb2F0LENvZWZmQmFzZWRQcm9kdWN0TW9kZT46OnJ1bigpOworICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgIAorICAgIHN0ZDo6Y291dCA8PCBNIDw8ICJmXHQiOworICAgIGxvb3Bfb25fbjxNLE4sSyxmbG9hdCwtMT46OnJ1bigpOworICAgIHN0ZDo6Y291dCA8PCAiXG4iOworCisgICAgbG9vcF9vbl9tPE0rMSxOLEs+OjpydW4oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8aW50IE4sIGludCBLPgorc3RydWN0IGxvb3Bfb25fbTxFTkQsTixLPiB7IHN0YXRpYyB2b2lkIHJ1bigpe30gfTsKKwordGVtcGxhdGU8aW50IE0sIGludCBOLCBpbnQgSywgdHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZT4KK3N0cnVjdCBsb29wX29uX24KK3sKKyAgc3RhdGljIHZvaWQgcnVuKCkKKyAgeworICAgIGJlbmNoX3Byb2Q8TSxOLEssU2NhbGFyLE1vZGU9PS0xPyBhbHRfcHJvZDxNLE4sSz46OnJldCA6IE1vZGU+KCk7CisgICAgCisgICAgbG9vcF9vbl9uPE0sTisxLEssU2NhbGFyLE1vZGU+OjpydW4oKTsKKyAgfQorfTsKKwordGVtcGxhdGU8aW50IE0sIGludCBLLCB0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlPgorc3RydWN0IGxvb3Bfb25fbjxNLEVORCxLLFNjYWxhcixNb2RlPiB7IHN0YXRpYyB2b2lkIHJ1bigpe30gfTsKKwordGVtcGxhdGU8aW50IE4+IHN0cnVjdCBwcmludF9uCit7CisgIHN0YXRpYyB2b2lkIHJ1bigpCisgIHsKKyAgICBzdGQ6OmNvdXQgPDwgbWFwX3NpemU8Tj46OnJldCA8PCAiXHQiOworICAgIHByaW50X248TisxPjo6cnVuKCk7CisgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IHByaW50X248RU5EPiB7IHN0YXRpYyB2b2lkIHJ1bigpe30gfTsKKworaW50IG1haW4oKQoreworICBsb29wX29uX2s8MSwxLDE+OjpydW4oKTsKKyAgCisgIHJldHVybiAwOyAKK30KZGlmZiAtLWdpdCBhL2JlbmNoL3F1YXRfc2xlcnAuY3BwIGIvYmVuY2gvcXVhdF9zbGVycC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmYjNiZgotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3F1YXRfc2xlcnAuY3BwCkBAIC0wLDAgKzEsMjQ3IEBACisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxiZW5jaC9CZW5jaFRpbWVyLmg+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKKwordGVtcGxhdGU8dHlwZW5hbWUgUT4KK0VJR0VOX0RPTlRfSU5MSU5FIFEgbmxlcnAoY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpCit7CisgIHJldHVybiBRKChhLmNvZWZmcygpICogKDEuMC10KSArIGIuY29lZmZzKCkgKiB0KS5ub3JtYWxpemVkKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRPgorRUlHRU5fRE9OVF9JTkxJTkUgUSBzbGVycF9laWdlbihjb25zdCBRJiBhLCBjb25zdCBRJiBiLCB0eXBlbmFtZSBROjpTY2FsYXIgdCkKK3sKKyAgcmV0dXJuIGEuc2xlcnAodCxiKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUT4KK0VJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfbGVnYWN5KGNvbnN0IFEmIGEsIGNvbnN0IFEmIGIsIHR5cGVuYW1lIFE6OlNjYWxhciB0KQoreworICB0eXBlZGVmIHR5cGVuYW1lIFE6OlNjYWxhciBTY2FsYXI7CisgIHN0YXRpYyBjb25zdCBTY2FsYXIgb25lID0gU2NhbGFyKDEpIC0gZHVtbXlfcHJlY2lzaW9uPFNjYWxhcj4oKTsKKyAgU2NhbGFyIGQgPSBhLmRvdChiKTsKKyAgU2NhbGFyIGFic0QgPSBpbnRlcm5hbDo6YWJzKGQpOworICBpZiAoYWJzRD49b25lKQorICAgIHJldHVybiBhOworCisgIC8vIHRoZXRhIGlzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSAyIHF1YXRlcm5pb25zCisgIFNjYWxhciB0aGV0YSA9IHN0ZDo6YWNvcyhhYnNEKTsKKyAgU2NhbGFyIHNpblRoZXRhID0gaW50ZXJuYWw6OnNpbih0aGV0YSk7CisKKyAgU2NhbGFyIHNjYWxlMCA9IGludGVybmFsOjpzaW4oICggU2NhbGFyKDEpIC0gdCApICogdGhldGEpIC8gc2luVGhldGE7CisgIFNjYWxhciBzY2FsZTEgPSBpbnRlcm5hbDo6c2luKCAoIHQgKiB0aGV0YSkgKSAvIHNpblRoZXRhOworICBpZiAoZDwwKQorICAgIHNjYWxlMSA9IC1zY2FsZTE7CisKKyAgcmV0dXJuIFEoc2NhbGUwICogYS5jb2VmZnMoKSArIHNjYWxlMSAqIGIuY29lZmZzKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRPgorRUlHRU5fRE9OVF9JTkxJTkUgUSBzbGVycF9sZWdhY3lfbmxlcnAoY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUTo6U2NhbGFyIFNjYWxhcjsKKyAgc3RhdGljIGNvbnN0IFNjYWxhciBvbmUgPSBTY2FsYXIoMSkgLSBlcHNpbG9uPFNjYWxhcj4oKTsKKyAgU2NhbGFyIGQgPSBhLmRvdChiKTsKKyAgU2NhbGFyIGFic0QgPSBpbnRlcm5hbDo6YWJzKGQpOworICAKKyAgU2NhbGFyIHNjYWxlMDsKKyAgU2NhbGFyIHNjYWxlMTsKKyAgCisgIGlmIChhYnNEPj1vbmUpCisgIHsKKyAgICBzY2FsZTAgPSBTY2FsYXIoMSkgLSB0OworICAgIHNjYWxlMSA9IHQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gdGhldGEgaXMgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIDIgcXVhdGVybmlvbnMKKyAgICBTY2FsYXIgdGhldGEgPSBzdGQ6OmFjb3MoYWJzRCk7CisgICAgU2NhbGFyIHNpblRoZXRhID0gaW50ZXJuYWw6OnNpbih0aGV0YSk7CisKKyAgICBzY2FsZTAgPSBpbnRlcm5hbDo6c2luKCAoIFNjYWxhcigxKSAtIHQgKSAqIHRoZXRhKSAvIHNpblRoZXRhOworICAgIHNjYWxlMSA9IGludGVybmFsOjpzaW4oICggdCAqIHRoZXRhKSApIC8gc2luVGhldGE7CisgICAgaWYgKGQ8MCkKKyAgICAgIHNjYWxlMSA9IC1zY2FsZTE7CisgIH0KKworICByZXR1cm4gUShzY2FsZTAgKiBhLmNvZWZmcygpICsgc2NhbGUxICogYi5jb2VmZnMoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgVCBzaW5fb3Zlcl94KFQgeCkKK3sKKyAgaWYgKFQoMSkgKyB4KnggPT0gVCgxKSkKKyAgICByZXR1cm4gVCgxKTsKKyAgZWxzZQorICAgIHJldHVybiBzdGQ6OnNpbih4KS94OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRPgorRUlHRU5fRE9OVF9JTkxJTkUgUSBzbGVycF9ydyhjb25zdCBRJiBhLCBjb25zdCBRJiBiLCB0eXBlbmFtZSBROjpTY2FsYXIgdCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBROjpTY2FsYXIgU2NhbGFyOworICAKKyAgU2NhbGFyIGQgPSBhLmRvdChiKTsKKyAgU2NhbGFyIHRoZXRhOworICBpZiAoZDwwLjApCisgICAgdGhldGEgPSAvKk1fUEkgLSovIFNjYWxhcigyKSpzdGQ6OmFzaW4oIChhLmNvZWZmcygpK2IuY29lZmZzKCkpLm5vcm0oKS8yICk7CisgIGVsc2UKKyAgICB0aGV0YSA9IFNjYWxhcigyKSpzdGQ6OmFzaW4oIChhLmNvZWZmcygpLWIuY29lZmZzKCkpLm5vcm0oKS8yICk7CisgIAorICAvLyB0aGV0YSBpcyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgMiBxdWF0ZXJuaW9ucworLy8gICBTY2FsYXIgdGhldGEgPSBzdGQ6OmFjb3MoYWJzRCk7CisgIFNjYWxhciBzaW5PdmVyVGhldGEgPSBzaW5fb3Zlcl94KHRoZXRhKTsKKworICBTY2FsYXIgc2NhbGUwID0gKFNjYWxhcigxKS10KSpzaW5fb3Zlcl94KCAoIFNjYWxhcigxKSAtIHQgKSAqIHRoZXRhKSAvIHNpbk92ZXJUaGV0YTsKKyAgU2NhbGFyIHNjYWxlMSA9IHQgKiBzaW5fb3Zlcl94KCAoIHQgKiB0aGV0YSkgKSAvIHNpbk92ZXJUaGV0YTsKKyAgaWYgKGQ8MCkKKyAgICBzY2FsZTEgPSAtc2NhbGUxOworCisgIHJldHVybiBRdWF0ZXJuaW9uPFNjYWxhcj4oc2NhbGUwICogYS5jb2VmZnMoKSArIHNjYWxlMSAqIGIuY29lZmZzKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRPgorRUlHRU5fRE9OVF9JTkxJTkUgUSBzbGVycF9nYWVsKGNvbnN0IFEmIGEsIGNvbnN0IFEmIGIsIHR5cGVuYW1lIFE6OlNjYWxhciB0KQoreworICB0eXBlZGVmIHR5cGVuYW1lIFE6OlNjYWxhciBTY2FsYXI7CisgIAorICBTY2FsYXIgZCA9IGEuZG90KGIpOworICBTY2FsYXIgdGhldGE7CisvLyAgIHRoZXRhID0gU2NhbGFyKDIpICogYXRhbjIoKGEuY29lZmZzKCktYi5jb2VmZnMoKSkubm9ybSgpLChhLmNvZWZmcygpK2IuY29lZmZzKCkpLm5vcm0oKSk7CisvLyAgIGlmIChkPDAuMCkKKy8vICAgICB0aGV0YSA9IE1fUEktdGhldGE7CisgIAorICBpZiAoZDwwLjApCisgICAgdGhldGEgPSAvKk1fUEkgLSovIFNjYWxhcigyKSpzdGQ6OmFzaW4oICgtYS5jb2VmZnMoKS1iLmNvZWZmcygpKS5ub3JtKCkvMiApOworICBlbHNlCisgICAgdGhldGEgPSBTY2FsYXIoMikqc3RkOjphc2luKCAoYS5jb2VmZnMoKS1iLmNvZWZmcygpKS5ub3JtKCkvMiApOworICAKKyAgCisgIFNjYWxhciBzY2FsZTA7CisgIFNjYWxhciBzY2FsZTE7CisgIGlmKHRoZXRhKnRoZXRhLVNjYWxhcig2KT09LVNjYWxhcig2KSkKKyAgeworICAgIHNjYWxlMCA9IFNjYWxhcigxKSAtIHQ7CisgICAgc2NhbGUxID0gdDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTY2FsYXIgc2luVGhldGEgPSBzdGQ6OnNpbih0aGV0YSk7CisgICAgc2NhbGUwID0gaW50ZXJuYWw6OnNpbiggKCBTY2FsYXIoMSkgLSB0ICkgKiB0aGV0YSkgLyBzaW5UaGV0YTsKKyAgICBzY2FsZTEgPSBpbnRlcm5hbDo6c2luKCAoIHQgKiB0aGV0YSkgKSAvIHNpblRoZXRhOworICAgIGlmIChkPDApCisgICAgICBzY2FsZTEgPSAtc2NhbGUxOworICB9CisKKyAgcmV0dXJuIFF1YXRlcm5pb248U2NhbGFyPihzY2FsZTAgKiBhLmNvZWZmcygpICsgc2NhbGUxICogYi5jb2VmZnMoKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgdHlwZWRlZiBkb3VibGUgUmVmU2NhbGFyOworICB0eXBlZGVmIGZsb2F0IFRlc3RTY2FsYXI7CisgIAorICB0eXBlZGVmIFF1YXRlcm5pb248UmVmU2NhbGFyPiAgUWQ7CisgIHR5cGVkZWYgUXVhdGVybmlvbjxUZXN0U2NhbGFyPiBRZjsKKyAgCisgIHVuc2lnbmVkIGludCBnX3NlZWQgPSAodW5zaWduZWQgaW50KSB0aW1lKE5VTEwpOworICBzdGQ6OmNvdXQgPDwgZ19zZWVkIDw8ICJcbiI7CisvLyAgIGdfc2VlZCA9IDEyNTk5MzI0OTY7CisgIHNyYW5kKGdfc2VlZCk7CisgIAorICBNYXRyaXg8UmVmU2NhbGFyLER5bmFtaWMsMT4gbWF4ZXJyKDcpOworICBtYXhlcnIuc2V0WmVybygpOworICAKKyAgTWF0cml4PFJlZlNjYWxhcixEeW5hbWljLDE+IGF2Z2Vycig3KTsKKyAgYXZnZXJyLnNldFplcm8oKTsKKyAgCisgIGNvdXQgPDwgImRvdWJsZT0+ZmxvYXQ9PmRvdWJsZSAgICAgICBubGVycCAgICAgICAgZWlnZW4gICAgICAgIGxlZ2FjeShzbmFwKSAgICAgICAgIGxlZ2FjeShubGVycCkgICAgICAgIHJpZ2h0d2F5ICAgICAgICAgZ2FlbCdzIGNyaXRlcmlhXG4iOworICAKKyAgaW50IHJlcCA9IDEwMDsKKyAgaW50IGl0ZXJzID0gNDA7CisgIGZvciAoaW50IHc9MDsgdzxyZXA7ICsrdykKKyAgeworICAgIFFmIGEsIGI7CisgICAgYS5jb2VmZnMoKS5zZXRSYW5kb20oKTsKKyAgICBhLm5vcm1hbGl6ZSgpOworICAgIGIuY29lZmZzKCkuc2V0UmFuZG9tKCk7CisgICAgYi5ub3JtYWxpemUoKTsKKyAgICAKKyAgICBRZiBjWzZdOworICAgIAorICAgIFFkIGFyKGEuY2FzdDxSZWZTY2FsYXI+KCkpOworICAgIFFkIGJyKGIuY2FzdDxSZWZTY2FsYXI+KCkpOworICAgIFFkIGNyOworICAgIAorICAgIAorICAgIAorICAgIGNvdXQucHJlY2lzaW9uKDgpOworICAgIGNvdXQgPDwgc3RkOjpzY2llbnRpZmljOworICAgIGZvciAoaW50IGk9MDsgaTxpdGVyczsgKytpKQorICAgIHsKKyAgICAgIFJlZlNjYWxhciB0ID0gMC42NTsKKyAgICAgIGNyID0gc2xlcnBfcncoYXIsYnIsdCk7CisgICAgICAKKyAgICAgIFFmIHJlZmMgPSBjci5jYXN0PFRlc3RTY2FsYXI+KCk7CisgICAgICBjWzBdID0gbmxlcnAoYSxiLHQpOworICAgICAgY1sxXSA9IHNsZXJwX2VpZ2VuKGEsYix0KTsKKyAgICAgIGNbMl0gPSBzbGVycF9sZWdhY3koYSxiLHQpOworICAgICAgY1szXSA9IHNsZXJwX2xlZ2FjeV9ubGVycChhLGIsdCk7CisgICAgICBjWzRdID0gc2xlcnBfcncoYSxiLHQpOworICAgICAgY1s1XSA9IHNsZXJwX2dhZWwoYSxiLHQpOworICAgICAgCisgICAgICBWZWN0b3JYZCBlcnIoNyk7CisgICAgICBlcnJbMF0gPSAoY3IuY29lZmZzKCktcmVmYy5jYXN0PFJlZlNjYWxhcj4oKS5jb2VmZnMoKSkubm9ybSgpOworLy8gICAgICAgc3RkOjpjb3V0IDw8IGVyclswXSA8PCAiICAgICI7CisgICAgICBmb3IgKGludCBrPTA7IGs8NjsgKytrKQorICAgICAgeworICAgICAgICBlcnJbaysxXSA9IChjW2tdLmNvZWZmcygpLXJlZmMuY29lZmZzKCkpLm5vcm0oKTsKKy8vICAgICAgICAgc3RkOjpjb3V0IDw8IGVycltrKzFdIDw8ICIgICAgIjsKKyAgICAgIH0KKyAgICAgIG1heGVyciA9IG1heGVyci5jd2lzZSgpLm1heChlcnIpOworICAgICAgYXZnZXJyICs9IGVycjsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgICAgYiA9IGNyLmNhc3Q8VGVzdFNjYWxhcj4oKTsKKyAgICAgIGJyID0gY3I7CisgICAgfQorLy8gICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICB9CisgIGF2Z2VyciAvPSBSZWZTY2FsYXIocmVwKml0ZXJzKTsKKyAgY291dCA8PCAiXG5cbkFjY3VyYWN5OlxuIgorICAgICAgIDw8ICIgIG1heDogIiA8PCBtYXhlcnIudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgY291dCA8PCAiICBhdmc6ICIgPDwgYXZnZXJyLnRyYW5zcG9zZSgpIDw8ICJcbiI7CisgIAorICAvLyBwZXJmIGJlbmNoCisgIFF1YXRlcm5pb25mIGEsYjsKKyAgYS5jb2VmZnMoKS5zZXRSYW5kb20oKTsKKyAgYS5ub3JtYWxpemUoKTsKKyAgYi5jb2VmZnMoKS5zZXRSYW5kb20oKTsKKyAgYi5ub3JtYWxpemUoKTsKKyAgLy9iID0gYTsKKyAgZmxvYXQgcyA9IDAuNjU7CisgICAgCisgICNkZWZpbmUgQkVOQ0goRlVOQykge1wKKyAgICBCZW5jaFRpbWVyIHQ7IFwKKyAgICBmb3IoaW50IGs9MDsgazwyOyArK2spIHtcCisgICAgICB0LnN0YXJ0KCk7IFwKKyAgICAgIGZvcihpbnQgaT0wOyBpPDEwMDAwMDA7ICsraSkgXAorICAgICAgICBGVU5DKGEsYixzKTsgXAorICAgICAgdC5zdG9wKCk7IFwKKyAgICB9IFwKKyAgICBjb3V0IDw8ICIgICIgPDwgI0ZVTkMgPDwgIiA9PiBcdCAiIDw8IHQudmFsdWUoKSA8PCAic1xuIjsgXAorICB9CisgIAorICBjb3V0IDw8ICJcblNwZWVkOlxuIiA8PCBzdGQ6OmZpeGVkOworICBCRU5DSChubGVycCk7CisgIEJFTkNIKHNsZXJwX2VpZ2VuKTsKKyAgQkVOQ0goc2xlcnBfbGVnYWN5KTsKKyAgQkVOQ0goc2xlcnBfbGVnYWN5X25sZXJwKTsKKyAgQkVOQ0goc2xlcnBfcncpOworICBCRU5DSChzbGVycF9nYWVsKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmVuY2gvcXVhdG11bC5jcHAgYi9iZW5jaC9xdWF0bXVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDlkNzkyCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvcXVhdG11bC5jcHAKQEAgLTAsMCArMSw0NyBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8YmVuY2gvQmVuY2hUaW1lci5oPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0PgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBxdWF0bXVsX2RlZmF1bHQoY29uc3QgUXVhdCYgYSwgY29uc3QgUXVhdCYgYiwgUXVhdCYgYykKK3sKKyAgYyA9IGEgKiBiOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0PgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBxdWF0bXVsX25vdmVjKGNvbnN0IFF1YXQmIGEsIGNvbnN0IFF1YXQmIGIsIFF1YXQmIGMpCit7CisgIGMgPSBpbnRlcm5hbDo6cXVhdF9wcm9kdWN0PDAsIFF1YXQsIFF1YXQsIHR5cGVuYW1lIFF1YXQ6OlNjYWxhciwgQWxpZ25lZD46OnJ1bihhLGIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0PiB2b2lkIGJlbmNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBsYWJlbCkKK3sKKyAgaW50IHRyaWVzID0gMTA7CisgIGludCByZXAgPSAxMDAwMDAwOworICBCZW5jaFRpbWVyIHQ7CisgIAorICBRdWF0IGEoNCwgMSwgMiwgMyk7CisgIFF1YXQgYigyLCAzLCA0LCA1KTsKKyAgUXVhdCBjOworICAKKyAgc3RkOjpjb3V0LnByZWNpc2lvbigzKTsKKyAgCisgIEJFTkNIKHQsIHRyaWVzLCByZXAsIHF1YXRtdWxfZGVmYXVsdChhLGIsYykpOworICBzdGQ6OmNvdXQgPDwgbGFiZWwgPDwgIiBkZWZhdWx0ICIgPDwgMWUzKnQuYmVzdChDUFVfVElNRVIpIDw8ICJtcyAgXHQiIDw8IDFlLTYqZG91YmxlKHJlcCkvKHQuYmVzdChDUFVfVElNRVIpKSA8PCAiIE0gbXVsL3NcbiI7CisgIAorICBCRU5DSCh0LCB0cmllcywgcmVwLCBxdWF0bXVsX25vdmVjKGEsYixjKSk7CisgIHN0ZDo6Y291dCA8PCBsYWJlbCA8PCAiIG5vdmVjICAgIiA8PCAxZTMqdC5iZXN0KENQVV9USU1FUikgPDwgIm1zICBcdCIgPDwgMWUtNipkb3VibGUocmVwKS8odC5iZXN0KENQVV9USU1FUikpIDw8ICIgTSBtdWwvc1xuIjsKK30KKworaW50IG1haW4oKQoreworICBiZW5jaDxRdWF0ZXJuaW9uZj4oImZsb2F0ICIpOworICBiZW5jaDxRdWF0ZXJuaW9uZD4oImRvdWJsZSIpOworCisgIHJldHVybiAwOworCit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV9jaG9sZXNreS5jcHAgYi9iZW5jaC9zcGFyc2VfY2hvbGVza3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYjIyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcGFyc2VfY2hvbGVza3kuY3BwCkBAIC0wLDAgKzEsMjE2IEBACisvLyAjZGVmaW5lIEVJR0VOX1RBVUNTX1NVUFBPUlQKKy8vICNkZWZpbmUgRUlHRU5fQ0hPTE1PRF9TVVBQT1JUCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlPgorCisvLyBnKysgLURTSVpFPTEwMDAwIC1EREVOU0lUWT0wLjAwMSAgc3BhcnNlX2Nob2xlc2t5LmNwcCAtSS4uIC1EREVOU0VNQVRSSSAtTzMgLWcwIC1ETkRFQlVHICAgLUROQlRSSUVTPTEgLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS90YXVjc19mdWxsL3NyYy8gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL3RhdWNzX2Z1bGwvYnVpbGQvbGludXgvICAtTC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvdGF1Y3NfZnVsbC9saWIvbGludXgvIC1sdGF1Y3MgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9Hb3RvQkxBUy9saWJnb3RvLmEgLWxwdGhyZWFkIC1JIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvU3VpdGVTcGFyc2UvQ0hPTE1PRC9JbmNsdWRlLyAkQ0hPTExJQiAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL1VGY29uZmlnLyAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NDT0xBTUQvTGliL2xpYmNjb2xhbWQuYSAgIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvU3VpdGVTcGFyc2UvQ0hPTE1PRC9MaWIvbGliY2hvbG1vZC5hIC1sbWV0aXMgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9BTUQvTGliL2xpYmFtZC5hICAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NBTUQvTGliL2xpYmNhbWQuYSAgIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvU3VpdGVTcGFyc2UvQ0NPTEFNRC9MaWIvbGliY2NvbGFtZC5hICAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NPTEFNRC9MaWIvbGliY29sYW1kLmEgLWxsYXBhY2sgJiYgLi9hLm91dAorCisjZGVmaW5lIE5PR01NCisjZGVmaW5lIE5PTVRMCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDEwCisjZW5kaWYKKworI2lmbmRlZiBERU5TSVRZCisjZGVmaW5lIERFTlNJVFkgMC4wMQorI2VuZGlmCisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCAxCisjZW5kaWYKKworI2luY2x1ZGUgIkJlbmNoU3BhcnNlVXRpbC5oIgorCisjaWZuZGVmIE1JTkRFTlNJVFkKKyNkZWZpbmUgTUlOREVOU0lUWSAwLjAwMDQKKyNlbmRpZgorCisjaWZuZGVmIE5CVFJJRVMKKyNkZWZpbmUgTkJUUklFUyAxMAorI2VuZGlmCisKKyNkZWZpbmUgQkVOQ0goWCkgXAorICB0aW1lci5yZXNldCgpOyBcCisgIGZvciAoaW50IF9qPTA7IF9qPE5CVFJJRVM7ICsrX2opIHsgXAorICAgIHRpbWVyLnN0YXJ0KCk7IFwKKyAgICBmb3IgKGludCBfaz0wOyBfazxSRVBFQVQ7ICsrX2spIHsgXAorICAgICAgICBYICBcCisgIH0gdGltZXIuc3RvcCgpOyB9CisKKy8vIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixVcHBlclRyaWFuZ3VsYXI+IEVpZ2VuU3BhcnNlVHJpTWF0cml4OwordHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLFNlbGZBZGpvaW50fExvd2VyVHJpYW5ndWxhcj4gRWlnZW5TcGFyc2VTZWxmQWRqb2ludE1hdHJpeDsKKwordm9pZCBmaWxsU3BkTWF0cml4KGZsb2F0IGRlbnNpdHksIGludCByb3dzLCBpbnQgY29scywgIEVpZ2VuU3BhcnNlU2VsZkFkam9pbnRNYXRyaXgmIGRzdCkKK3sKKyAgZHN0LnN0YXJ0RmlsbChyb3dzKmNvbHMqZGVuc2l0eSk7CisgIGZvcihpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspCisgIHsKKyAgICBkc3QuZmlsbChqLGopID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KDEwLDIwKTsKKyAgICBmb3IoaW50IGkgPSBqKzE7IGkgPCByb3dzOyBpKyspCisgICAgeworICAgICAgU2NhbGFyIHYgPSAoaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oMCwxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiAwOworICAgICAgaWYgKHYhPTApCisgICAgICAgIGRzdC5maWxsKGksaikgPSB2OworICAgIH0KKworICB9CisgIGRzdC5lbmRGaWxsKCk7Cit9CisKKyNpbmNsdWRlIDxFaWdlbi9DaG9sZXNreT4KKwordGVtcGxhdGU8aW50IEJhY2tlbmQ+Cit2b2lkIGRvRWlnZW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgRWlnZW5TcGFyc2VTZWxmQWRqb2ludE1hdHJpeCYgc20xLCBpbnQgZmxhZ3MgPSAwKQoreworICBzdGQ6OmNvdXQgPDwgbmFtZSA8PCAiLi4uIiA8PCBzdGQ6OmZsdXNoOworICBCZW5jaFRpbWVyIHRpbWVyOworICB0aW1lci5zdGFydCgpOworICBTcGFyc2VMTFQ8RWlnZW5TcGFyc2VTZWxmQWRqb2ludE1hdHJpeCxCYWNrZW5kPiBjaG9sKHNtMSwgZmxhZ3MpOworICB0aW1lci5zdG9wKCk7CisgIHN0ZDo6Y291dCA8PCAiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKyAgc3RkOjpjb3V0IDw8ICIgIG5uejogIiA8PCBzbTEubm9uWmVyb3MoKSA8PCAiID0+ICIgPDwgY2hvbC5tYXRyaXhMKCkubm9uWmVyb3MoKSA8PCAiXG4iOworLy8gICBzdGQ6OmNvdXQgPDwgInNwYXJzZVxuIiA8PCBjaG9sLm1hdHJpeEwoKSA8PCAiJVxuIjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJvd3MgPSBTSVpFOworICBpbnQgY29scyA9IFNJWkU7CisgIGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOworICBCZW5jaFRpbWVyIHRpbWVyOworCisgIFZlY3RvclhmIGIgPSBWZWN0b3JYZjo6UmFuZG9tKGNvbHMpOworICBWZWN0b3JYZiB4ID0gVmVjdG9yWGY6OlJhbmRvbShjb2xzKTsKKworICBib29sIGRlbnNlZG9uZSA9IGZhbHNlOworCisgIC8vZm9yIChmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsgZGVuc2l0eT49TUlOREVOU0lUWTsgZGVuc2l0eSo9MC41KQorLy8gICBmbG9hdCBkZW5zaXR5ID0gMC41OworICB7CisgICAgRWlnZW5TcGFyc2VTZWxmQWRqb2ludE1hdHJpeCBzbTEocm93cywgY29scyk7CisgICAgc3RkOjpjb3V0IDw8ICJHZW5lcmF0ZSBzcGFyc2UgbWF0cml4IChtaWdodCB0YWtlIGEgd2hpbGUpLi4uXG4iOworICAgIGZpbGxTcGRNYXRyaXgoZGVuc2l0eSwgcm93cywgY29scywgc20xKTsKKyAgICBzdGQ6OmNvdXQgPDwgIkRPTkVcblxuIjsKKworICAgIC8vIGRlbnNlIG1hdHJpY2VzCisgICAgI2lmZGVmIERFTlNFTUFUUklYCisgICAgaWYgKCFkZW5zZWRvbmUpCisgICAgeworICAgICAgZGVuc2Vkb25lID0gdHJ1ZTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gRGVuc2VcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7CisgICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLGNvbHMpOworICAgICAgZWlUb0RlbnNlKHNtMSwgbTEpOworICAgICAgbTEgPSAobTEgKyBtMS50cmFuc3Bvc2UoKSkuZXZhbCgpOworICAgICAgbTEuZGlhZ29uYWwoKSAqPSAwLjU7CisKKy8vICAgICAgIEJFTkNIKExMVDxEZW5zZU1hdHJpeD4gY2hvbChtMSk7KQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICJkZW5zZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisgICAgICBCZW5jaFRpbWVyIHRpbWVyOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIExMVDxEZW5zZU1hdHJpeD4gY2hvbChtMSk7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgImRlbnNlOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgICBpbnQgY291bnQgPSAwOworICAgICAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKKyAgICAgICAgZm9yIChpbnQgaT1qOyBpPHJvd3M7ICsraSkKKyAgICAgICAgICBpZiAoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihpbnRlcm5hbDo6YWJzKGNob2wubWF0cml4TCgpKGksaikpLCAwLjEpKQorICAgICAgICAgICAgY291bnQrKzsKKyAgICAgIHN0ZDo6Y291dCA8PCAiZGVuc2U6ICIgPDwgIm5ueiA9ICIgPDwgY291bnQgPDwgIlxuIjsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiZGVuc2U6XG4iIDw8IG0xIDw8ICJcblxuIiA8PCBjaG9sLm1hdHJpeEwoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIGVpZ2VuIHNwYXJzZSBtYXRyaWNlcworICAgIGRvRWlnZW48RWlnZW46OkRlZmF1bHRCYWNrZW5kPigiRWlnZW4vU3BhcnNlIiwgc20xLCBFaWdlbjo6SW5jb21wbGV0ZUZhY3Rvcml6YXRpb24pOworCisgICAgI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAorICAgIGRvRWlnZW48RWlnZW46OkNob2xtb2Q+KCJFaWdlbi9DaG9sbW9kIiwgc20xLCBFaWdlbjo6SW5jb21wbGV0ZUZhY3Rvcml6YXRpb24pOworICAgICNlbmRpZgorCisgICAgI2lmZGVmIEVJR0VOX1RBVUNTX1NVUFBPUlQKKyAgICBkb0VpZ2VuPEVpZ2VuOjpUYXVjcz4oIkVpZ2VuL1RhdWNzIiwgc20xLCBFaWdlbjo6SW5jb21wbGV0ZUZhY3Rvcml6YXRpb24pOworICAgICNlbmRpZgorCisgICAgI2lmIDAKKyAgICAvLyBUQVVDUworICAgIHsKKyAgICAgIHRhdWNzX2Njc19tYXRyaXggQSA9IHNtMS5hc1RhdWNzTWF0cml4KCk7CisKKyAgICAgIC8vQkVOQ0godGF1Y3NfY2NzX21hdHJpeCogY2hvbCA9IHRhdWNzX2Njc19mYWN0b3JfbGx0KCZBLCAwLCAwKTspCisvLyAgICAgICBCRU5DSCh0YXVjc19zdXBlcm5vZGFsX2ZhY3Rvcl90b19jY3ModGF1Y3NfY2NzX2ZhY3Rvcl9sbHRfbGwoJkEpKTspCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgInRhdWNzOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKyAgICAgIHRhdWNzX2Njc19tYXRyaXgqIGNob2wgPSB0YXVjc19jY3NfZmFjdG9yX2xsdCgmQSwgMCwgMCk7CisKKyAgICAgIGZvciAoaW50IGo9MDsgajxjb2xzOyArK2opCisgICAgICB7CisgICAgICAgIGZvciAoaW50IGk9Y2hvbC0+Y29scHRyW2pdOyBpPGNob2wtPmNvbHB0cltqKzFdOyArK2kpCisgICAgICAgICAgc3RkOjpjb3V0IDw8IGNob2wtPnZhbHVlcy5kW2ldIDw8ICIgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDSE9MTU9ECisgICAgI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAorICAgIHsKKyAgICAgIGNob2xtb2RfY29tbW9uIGM7CisgICAgICBjaG9sbW9kX3N0YXJ0ICgmYyk7CisgICAgICBjaG9sbW9kX3NwYXJzZSBBOworICAgICAgY2hvbG1vZF9mYWN0b3IgKkw7CisKKyAgICAgIEEgPSBzbTEuYXNDaG9sbW9kTWF0cml4KCk7CisgICAgICBCZW5jaFRpbWVyIHRpbWVyOworLy8gICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBlcm0oY29scyk7CisvLyAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHNldChuY29scyk7CisgICAgICBmb3IgKGludCBpPTA7IGk8Y29sczsgKytpKQorICAgICAgICBwZXJtW2ldID0gaTsKKy8vICAgICAgIGMubm1ldGhvZHMgPSAxOworLy8gICAgICAgYy5tZXRob2RbMF0gPSAxOworCisgICAgICBjLm5tZXRob2RzID0gMTsKKyAgICAgIGMubWV0aG9kIFswXS5vcmRlcmluZyA9IENIT0xNT0RfTkFUVVJBTDsKKyAgICAgIGMucG9zdG9yZGVyID0gMDsKKyAgICAgIGMuZmluYWxfbGwgPSAxOworCisgICAgICBMID0gY2hvbG1vZF9hbmFseXplX3AoJkEsICZwZXJtWzBdLCAmcGVybVswXSwgY29scywgJmMpOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICJjaG9sbW9kL2FuYWx5emU6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgY2hvbG1vZF9mYWN0b3JpemUoJkEsIEwsICZjKTsKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiY2hvbG1vZC9mYWN0b3JpemU6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworICAgICAgY2hvbG1vZF9zcGFyc2UqIGNob2xtYXQgPSBjaG9sbW9kX2ZhY3Rvcl90b19zcGFyc2UoTCwgJmMpOworCisgICAgICBjaG9sbW9kX3ByaW50X2ZhY3RvcihMLCAiRmFjdG9ycyIsICZjKTsKKworICAgICAgY2hvbG1vZF9wcmludF9zcGFyc2UoY2hvbG1hdCwgIkNob2wiLCAmYyk7CisgICAgICBjaG9sbW9kX3dyaXRlX3NwYXJzZShzdGRvdXQsIGNob2xtYXQsIDAsIDAsICZjKTsKKy8vCisvLyAgICAgICBjaG9sbW9kX3ByaW50X3NwYXJzZSgmQSwgIkEiLCAmYyk7CisvLyAgICAgICBjaG9sbW9kX3dyaXRlX3NwYXJzZShzdGRvdXQsICZBLCAwLCAwLCAmYyk7CisKKworLy8gICAgICAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKKy8vICAgICAgIHsKKy8vICAgICAgICAgICBmb3IgKGludCBpPWNob2wtPmNvbHB0cltqXTsgaTxjaG9sLT5jb2xwdHJbaisxXTsgKytpKQorLy8gICAgICAgICAgICAgc3RkOjpjb3V0IDw8IGNob2wtPnZhbHVlcy5zW2ldIDw8ICIgIjsKKy8vICAgICAgIH0KKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAjZW5kaWYKKworCisKKyAgfQorCisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV9kZW5zZV9wcm9kdWN0LmNwcCBiL2JlbmNoL3NwYXJzZV9kZW5zZV9wcm9kdWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Y1MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvc3BhcnNlX2RlbnNlX3Byb2R1Y3QuY3BwCkBAIC0wLDAgKzEsMTg3IEBACisKKy8vZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wMDUgLURTSVpFPTEwMDAwICYmIC4vYS5vdXQKKy8vZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wNSAtRFNJWkU9MjAwMCAmJiAuL2Eub3V0CisvLyAtRE5PR01NIC1ETk9NVEwgLURDU1BBUlNFCisvLyAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvSW5jbHVkZS8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0xpYi9saWJjc3BhcnNlLmEKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDY1MDAwMAorI2VuZGlmCisKKyNpZm5kZWYgREVOU0lUWQorI2RlZmluZSBERU5TSVRZIDAuMDEKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMQorI2VuZGlmCisKKyNpbmNsdWRlICJCZW5jaFNwYXJzZVV0aWwuaCIKKworI2lmbmRlZiBNSU5ERU5TSVRZCisjZGVmaW5lIE1JTkRFTlNJVFkgMC4wMDA0CisjZW5kaWYKKworI2lmbmRlZiBOQlRSSUVTCisjZGVmaW5lIE5CVFJJRVMgMTAKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNIKFgpIFwKKyAgdGltZXIucmVzZXQoKTsgXAorICBmb3IgKGludCBfaj0wOyBfajxOQlRSSUVTOyArK19qKSB7IFwKKyAgICB0aW1lci5zdGFydCgpOyBcCisgICAgZm9yIChpbnQgX2s9MDsgX2s8UkVQRUFUOyArK19rKSB7IFwKKyAgICAgICAgWCAgXAorICB9IHRpbWVyLnN0b3AoKTsgfQorCisKKyNpZmRlZiBDU1BBUlNFCitjcyogY3Nfc29ydGVkX211bHRpcGx5KGNvbnN0IGNzKiBhLCBjb25zdCBjcyogYikKK3sKKyAgY3MqIEEgPSBjc190cmFuc3Bvc2UgKGEsIDEpIDsKKyAgY3MqIEIgPSBjc190cmFuc3Bvc2UgKGIsIDEpIDsKKyAgY3MqIEQgPSBjc19tdWx0aXBseSAoQixBKSA7ICAgLyogRCA9IEInKkEnICovCisgIGNzX3NwZnJlZSAoQSkgOworICBjc19zcGZyZWUgKEIpIDsKKyAgY3NfZHJvcHplcm9zIChEKSA7ICAgICAgLyogZHJvcCB6ZXJvcyBmcm9tIEQgKi8KKyAgY3MqIEMgPSBjc190cmFuc3Bvc2UgKEQsIDEpIDsgICAvKiBDID0gRCcsIHNvIHRoYXQgQyBpcyBzb3J0ZWQgKi8KKyAgY3Nfc3BmcmVlIChEKSA7CisgIHJldHVybiBDOworfQorI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByb3dzID0gU0laRTsKKyAgaW50IGNvbHMgPSBTSVpFOworICBmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsKKworICBFaWdlblNwYXJzZU1hdHJpeCBzbTEocm93cyxjb2xzKTsKKyAgRGVuc2VWZWN0b3IgdjEoY29scyksIHYyKGNvbHMpOworICB2MS5zZXRSYW5kb20oKTsKKworICBCZW5jaFRpbWVyIHRpbWVyOworICBmb3IgKGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOyBkZW5zaXR5Pj1NSU5ERU5TSVRZOyBkZW5zaXR5Kj0wLjUpCisgIHsKKyAgICAvL2ZpbGxNYXRyaXgoZGVuc2l0eSwgcm93cywgY29scywgc20xKTsKKyAgICBmaWxsTWF0cml4Mig3LCByb3dzLCBjb2xzLCBzbTEpOworCisgICAgLy8gZGVuc2UgbWF0cmljZXMKKyAgICAjaWZkZWYgREVOU0VNQVRSSVgKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIERlbnNlXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgRGVuc2VNYXRyaXggbTEocm93cyxjb2xzKTsKKyAgICAgIGVpVG9EZW5zZShzbTEsIG0xKTsKKworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgICAgIHYyID0gbTEgKiB2MTsKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIHY6XHQiIDw8IHRpbWVyLmJlc3QoKSA8PCAiICAiIDw8IGRvdWJsZShSRVBFQVQpL3RpbWVyLmJlc3QoKSA8PCAiICogLyBzZWMgIiA8PCBlbmRsOworCisgICAgICB0aW1lci5yZXNldCgpOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKKyAgICAgICAgdjIgPSBtMS50cmFuc3Bvc2UoKSAqIHYxOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIHY6XHQiIDw8IHRpbWVyLmJlc3QoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIGVpZ2VuIHNwYXJzZSBtYXRyaWNlcworICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gc3BhcnNlXHQiIDw8IHNtMS5ub25aZXJvcygpL2Zsb2F0KHNtMS5yb3dzKCkqc20xLmNvbHMoKSkqMTAwIDw8ICIlXG4iOworCisgICAgICBCRU5DSChhc20oIiNteWMiKTsgdjIgPSBzbTEgKiB2MTsgYXNtKCIjbXlkIik7KQorICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogdjpcdCIgPDwgdGltZXIuYmVzdCgpL1JFUEVBVCA8PCAiICAiIDw8IGRvdWJsZShSRVBFQVQpL3RpbWVyLmJlc3QoUkVBTF9USU1FUikgPDwgIiAqIC8gc2VjICIgPDwgZW5kbDsKKworCisgICAgICBCRU5DSCggeyBhc20oIiNteWEiKTsgdjIgPSBzbTEudHJhbnNwb3NlKCkgKiB2MTsgYXNtKCIjbXliIik7IH0pCisKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci5iZXN0KCkvUkVQRUFUIDw8IGVuZGw7CisgICAgfQorCisvLyAgICAgeworLy8gICAgICAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IG0xKHNtMSk7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGR5bi1zcGFyc2VcdCIgPDwgbTEubm9uWmVyb3MoKS9mbG9hdChtMS5yb3dzKCkqbTEuY29scygpKSoxMDAgPDwgIiVcbiI7CisvLworLy8gICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSB2MiA9IG0xICogdjE7KQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogdjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8KKy8vICAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgdjIgPSBtMS50cmFuc3Bvc2UoKSAqIHYxOykKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAgICAgfQorCisgICAgLy8gR01NKysKKyAgICAjaWZuZGVmIE5PR01NCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJHTU0rKyBzcGFyc2VcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7CisgICAgICAvL0dtbUR5blNwYXJzZSAgZ21tVDMocm93cyxjb2xzKTsKKyAgICAgIEdtbVNwYXJzZSBtMShyb3dzLGNvbHMpOworICAgICAgZWlUb0dtbShzbTEsIG0xKTsKKworICAgICAgc3RkOjp2ZWN0b3I8U2NhbGFyPiBnbW1WMShjb2xzKSwgZ21tVjIoY29scyk7CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJmdtbVYxWzBdLCBjb2xzKSA9IHYxOworICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1WMlswXSwgY29scykgPSB2MjsKKworICAgICAgQkVOQ0goIGFzbSgiI215eCIpOyBnbW06Om11bHQobTEsIGdtbVYxLCBnbW1WMik7IGFzbSgiI215eSIpOyApCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKyAgICAgIEJFTkNIKCBnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKG0xKSwgZ21tVjEsIGdtbVYyKTsgKQorICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIHY6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisgICAgCisgICAgI2lmbmRlZiBOT1VCTEFTCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyBzcGFyc2VcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7CisgICAgICBVQmxhc1NwYXJzZSBtMShyb3dzLGNvbHMpOworICAgICAgZWlUb1VibGFzKHNtMSwgbTEpOworICAgICAgCisgICAgICBib29zdDo6bnVtZXJpYzo6dWJsYXM6OnZlY3RvcjxTY2FsYXI+IHV2MSwgdXYyOworICAgICAgZWlUb1VibGFzVmVjKHYxLHV2MSk7CisgICAgICBlaVRvVWJsYXNWZWModjIsdXYyKTsKKworLy8gICAgICAgc3RkOjp2ZWN0b3I8U2NhbGFyPiBnbW1WMShjb2xzKSwgZ21tVjIoY29scyk7CisvLyAgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJmdtbVYxWzBdLCBjb2xzKSA9IHYxOworLy8gICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1WMlswXSwgY29scykgPSB2MjsKKworICAgICAgQkVOQ0goIHV2MiA9IGJvb3N0OjpudW1lcmljOjp1Ymxhczo6cHJvZChtMSwgdXYxKTsgKQorICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogdjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisvLyAgICAgICBCRU5DSCggYm9vc3Q6OnVibGFzOjpwcm9kKGdtbTo6dHJhbnNwb3NlZChtMSksIGdtbVYxLCBnbW1WMik7ICkKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLy8gTVRMNAorICAgICNpZm5kZWYgTk9NVEwKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1UTDRcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7CisgICAgICBNdGxTcGFyc2UgbTEocm93cyxjb2xzKTsKKyAgICAgIGVpVG9NdGwoc20xLCBtMSk7CisgICAgICBtdGw6OmRlbnNlX3ZlY3RvcjxTY2FsYXI+IG10bFYxKGNvbHMsIDEuMCk7CisgICAgICBtdGw6OmRlbnNlX3ZlY3RvcjxTY2FsYXI+IG10bFYyKGNvbHMsIDEuMCk7CisKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICBtdGxWMiA9IG0xICogbXRsVjE7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICBtdGxWMiA9IHRyYW5zKG0xKSAqIG10bFYxOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIHY6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBzdGQ6OmNvdXQgPDwgIlxuXG4iOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV9sdS5jcHAgYi9iZW5jaC9zcGFyc2VfbHUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzUwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcGFyc2VfbHUuY3BwCkBAIC0wLDAgKzEsMTMyIEBACisKKy8vIGcrKyAtSS4uIHNwYXJzZV9sdS5jcHAgLU8zIC1nMCAtSSAvdXNyL2luY2x1ZGUvc3VwZXJsdS8gLWxzdXBlcmx1IC1sZ2ZvcnRyYW4gLURTSVpFPTEwMDAgLURERU5TSVRZPS4wNSAmJiAuL2Eub3V0CisKKyNkZWZpbmUgRUlHRU5fU1VQRVJMVV9TVVBQT1JUCisjZGVmaW5lIEVJR0VOX1VNRlBBQ0tfU1VQUE9SVAorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KKworI2RlZmluZSBOT0dNTQorI2RlZmluZSBOT01UTAorCisjaWZuZGVmIFNJWkUKKyNkZWZpbmUgU0laRSAxMAorI2VuZGlmCisKKyNpZm5kZWYgREVOU0lUWQorI2RlZmluZSBERU5TSVRZIDAuMDEKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMQorI2VuZGlmCisKKyNpbmNsdWRlICJCZW5jaFNwYXJzZVV0aWwuaCIKKworI2lmbmRlZiBNSU5ERU5TSVRZCisjZGVmaW5lIE1JTkRFTlNJVFkgMC4wMDA0CisjZW5kaWYKKworI2lmbmRlZiBOQlRSSUVTCisjZGVmaW5lIE5CVFJJRVMgMTAKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNIKFgpIFwKKyAgdGltZXIucmVzZXQoKTsgXAorICBmb3IgKGludCBfaj0wOyBfajxOQlRSSUVTOyArK19qKSB7IFwKKyAgICB0aW1lci5zdGFydCgpOyBcCisgICAgZm9yIChpbnQgX2s9MDsgX2s8UkVQRUFUOyArK19rKSB7IFwKKyAgICAgICAgWCAgXAorICB9IHRpbWVyLnN0b3AoKTsgfQorCit0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3JYOworCisjaW5jbHVkZSA8RWlnZW4vTFU+CisKK3RlbXBsYXRlPGludCBCYWNrZW5kPgordm9pZCBkb0VpZ2VuKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IEVpZ2VuU3BhcnNlTWF0cml4JiBzbTEsIGNvbnN0IFZlY3RvclgmIGIsIFZlY3RvclgmIHgsIGludCBmbGFncyA9IDApCit7CisgIHN0ZDo6Y291dCA8PCBuYW1lIDw8ICIuLi4iIDw8IHN0ZDo6Zmx1c2g7CisgIEJlbmNoVGltZXIgdGltZXI7IHRpbWVyLnN0YXJ0KCk7CisgIFNwYXJzZUxVPEVpZ2VuU3BhcnNlTWF0cml4LEJhY2tlbmQ+IGx1KHNtMSwgZmxhZ3MpOworICB0aW1lci5zdG9wKCk7CisgIGlmIChsdS5zdWNjZWVkZWQoKSkKKyAgICBzdGQ6OmNvdXQgPDwgIjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICBlbHNlCisgIHsKKyAgICBzdGQ6OmNvdXQgPDwgIjpcdCBGQUlMRUQiIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgYm9vbCBvazsKKyAgdGltZXIucmVzZXQoKTsgdGltZXIuc3RhcnQoKTsKKyAgb2sgPSBsdS5zb2x2ZShiLCZ4KTsKKyAgdGltZXIuc3RvcCgpOworICBpZiAob2spCisgICAgc3RkOjpjb3V0IDw8ICIgIHNvbHZlOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgIGVsc2UKKyAgICBzdGQ6OmNvdXQgPDwgIiAgc29sdmU6XHQiIDw8ICIgRkFJTEVEIiA8PCBlbmRsOworCisgIC8vc3RkOjpjb3V0IDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJvd3MgPSBTSVpFOworICBpbnQgY29scyA9IFNJWkU7CisgIGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOworICBCZW5jaFRpbWVyIHRpbWVyOworCisgIFZlY3RvclggYiA9IFZlY3Rvclg6OlJhbmRvbShjb2xzKTsKKyAgVmVjdG9yWCB4ID0gVmVjdG9yWDo6UmFuZG9tKGNvbHMpOworCisgIGJvb2wgZGVuc2Vkb25lID0gZmFsc2U7CisKKyAgLy9mb3IgKGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOyBkZW5zaXR5Pj1NSU5ERU5TSVRZOyBkZW5zaXR5Kj0wLjUpCisvLyAgIGZsb2F0IGRlbnNpdHkgPSAwLjU7CisgIHsKKyAgICBFaWdlblNwYXJzZU1hdHJpeCBzbTEocm93cywgY29scyk7CisgICAgZmlsbE1hdHJpeChkZW5zaXR5LCByb3dzLCBjb2xzLCBzbTEpOworCisgICAgLy8gZGVuc2UgbWF0cmljZXMKKyAgICAjaWZkZWYgREVOU0VNQVRSSVgKKyAgICBpZiAoIWRlbnNlZG9uZSkKKyAgICB7CisgICAgICBkZW5zZWRvbmUgPSB0cnVlOworICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBEZW5zZVx0IiA8PCBkZW5zaXR5KjEwMCA8PCAiJVxuIjsKKyAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyk7CisgICAgICBlaVRvRGVuc2Uoc20xLCBtMSk7CisKKyAgICAgIEJlbmNoVGltZXIgdGltZXI7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgRnVsbFBpdkxVPERlbnNlTWF0cml4PiBsdShtMSk7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuL2RlbnNlOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgbHUuc29sdmUoYiwmeCk7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgc29sdmU6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCBiLnRyYW5zcG9zZSgpIDw8ICJcbiI7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAgIH0KKyAgICAjZW5kaWYKKworICAgICNpZmRlZiBFSUdFTl9VTUZQQUNLX1NVUFBPUlQKKyAgICB4LnNldFplcm8oKTsKKyAgICBkb0VpZ2VuPEVpZ2VuOjpVbWZQYWNrPigiRWlnZW4vVW1mUGFjayAoYXV0bykiLCBzbTEsIGIsIHgsIDApOworICAgICNlbmRpZgorCisgICAgI2lmZGVmIEVJR0VOX1NVUEVSTFVfU1VQUE9SVAorICAgIHguc2V0WmVybygpOworICAgIGRvRWlnZW48RWlnZW46OlN1cGVyTFU+KCJFaWdlbi9TdXBlckxVIChuYXQpIiwgc20xLCBiLCB4LCBFaWdlbjo6TmF0dXJhbE9yZGVyaW5nKTsKKy8vICAgICBkb0VpZ2VuPEVpZ2VuOjpTdXBlckxVPigiRWlnZW4vU3VwZXJMVSAoTUQgQVQrQSkiLCBzbTEsIGIsIHgsIEVpZ2VuOjpNaW5pbXVtRGVncmVlX0FUX1BMVVNfQSk7CisvLyAgICAgZG9FaWdlbjxFaWdlbjo6U3VwZXJMVT4oIkVpZ2VuL1N1cGVyTFUgKE1EIEFUQSkiLCBzbTEsIGIsIHgsIEVpZ2VuOjpNaW5pbXVtRGVncmVlX0FUQSk7CisgICAgZG9FaWdlbjxFaWdlbjo6U3VwZXJMVT4oIkVpZ2VuL1N1cGVyTFUgKENPTEFNRCkiLCBzbTEsIGIsIHgsIEVpZ2VuOjpDb2xBcHByb3hNaW5pbXVtRGVncmVlKTsKKyAgICAjZW5kaWYKKworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV9wcm9kdWN0LmNwcCBiL2JlbmNoL3NwYXJzZV9wcm9kdWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmZjNDRmCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvc3BhcnNlX3Byb2R1Y3QuY3BwCkBAIC0wLDAgKzEsMzIzIEBACisKKy8vZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wMDUgLURTSVpFPTEwMDAwICYmIC4vYS5vdXQKKy8vZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wNSAtRFNJWkU9MjAwMCAmJiAuL2Eub3V0CisvLyAtRE5PR01NIC1ETk9NVEwgLURDU1BBUlNFCisvLyAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvSW5jbHVkZS8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0xpYi9saWJjc3BhcnNlLmEKKworI2luY2x1ZGUgPHR5cGVpbmZvPgorCisjaWZuZGVmIFNJWkUKKyNkZWZpbmUgU0laRSAxMDAwMDAwCisjZW5kaWYKKworI2lmbmRlZiBOTlpQRVJDT0wKKyNkZWZpbmUgTk5aUEVSQ09MIDYKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiQmVuY2hUaW1lci5oIgorI2luY2x1ZGUgIkJlbmNoVXRpbC5oIgorI2luY2x1ZGUgIkJlbmNoU3BhcnNlVXRpbC5oIgorCisjaWZuZGVmIE5CVFJJRVMKKyNkZWZpbmUgTkJUUklFUyAxCisjZW5kaWYKKworI2RlZmluZSBCRU5DSChYKSBcCisgIHRpbWVyLnJlc2V0KCk7IFwKKyAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCisgICAgdGltZXIuc3RhcnQoKTsgXAorICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCisgICAgICAgIFggIFwKKyAgfSB0aW1lci5zdG9wKCk7IH0KKworLy8gI2lmZGVmIE1LTAorLy8KKy8vICNpbmNsdWRlICJta2xfdHlwZXMuaCIKKy8vICNpbmNsdWRlICJta2xfc3BibGFzLmgiCisvLworLy8gdGVtcGxhdGU8dHlwZW5hbWUgTGhzLHR5cGVuYW1lIFJocyx0eXBlbmFtZSBSZXM+CisvLyB2b2lkIG1rbF9tdWx0aXBseShjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlcyYgcmVzKQorLy8geworLy8gICBjaGFyIG4gPSAnTic7CisvLyAgIGZsb2F0IGFscGhhID0gMTsKKy8vICAgY2hhciBtYXRkZXNjcmFbNl07CisvLyAgIG1hdGRlc2NyYVswXSA9ICdHJzsKKy8vICAgbWF0ZGVzY3JhWzFdID0gMDsKKy8vICAgbWF0ZGVzY3JhWzJdID0gMDsKKy8vICAgbWF0ZGVzY3JhWzNdID0gJ0MnOworLy8gICBta2xfc2NzY21tKCZuLCBsaHMucm93cygpLCByaHMuY29scygpLCBsaHMuY29scygpLCAmYWxwaGEsIG1hdGRlc2NyYSwKKy8vICAgICAgICAgICAgICBsaHMuX3ZhbHVlUHRyKCksIGxocy5faW5uZXJJbmRleFB0cigpLCBsaHMub3V0ZXJJbmRleFB0cigpLAorLy8gICAgICAgICAgICAgIHBudHJlLCBiLCAmbGRiLCAmYmV0YSwgYywgJmxkYyk7CisvLyAvLyAgIG1rbF9zb21hdGNvcHkoJ0MnLCAnVCcsIGxocy5yb3dzKCksIGxocy5jb2xzKCksIDEsCisvLyAvLyAgICAgICAgICAgICAgICAgbGhzLl92YWx1ZVB0cigpLCBsaHMucm93cygpLCBEU1QsIGRzdF9zdHJpZGUpOworLy8gfQorLy8KKy8vICNlbmRpZgorCisKKyNpZmRlZiBDU1BBUlNFCitjcyogY3Nfc29ydGVkX211bHRpcGx5KGNvbnN0IGNzKiBhLCBjb25zdCBjcyogYikKK3sKKy8vICAgcmV0dXJuIGNzX211bHRpcGx5KGEsYik7CisKKyAgY3MqIEEgPSBjc190cmFuc3Bvc2UoYSwgMSk7CisgIGNzKiBCID0gY3NfdHJhbnNwb3NlKGIsIDEpOworICBjcyogRCA9IGNzX211bHRpcGx5KEIsQSk7ICAgLyogRCA9IEInKkEnICovCisgIGNzX3NwZnJlZSAoQSkgOworICBjc19zcGZyZWUgKEIpIDsKKyAgY3NfZHJvcHplcm9zIChEKSA7ICAgICAgLyogZHJvcCB6ZXJvcyBmcm9tIEQgKi8KKyAgY3MqIEMgPSBjc190cmFuc3Bvc2UgKEQsIDEpIDsgICAvKiBDID0gRCcsIHNvIHRoYXQgQyBpcyBzb3J0ZWQgKi8KKyAgY3Nfc3BmcmVlIChEKSA7CisgIHJldHVybiBDOworCisvLyAgIGNzKiBBID0gY3NfdHJhbnNwb3NlKGEsIDEpOworLy8gICBjcyogQyA9IGNzX3RyYW5zcG9zZShBLCAxKTsKKy8vICAgcmV0dXJuIEM7Cit9CisKK2NzKiBjc19zb3J0ZWRfbXVsdGlwbHkyKGNvbnN0IGNzKiBhLCBjb25zdCBjcyogYikKK3sKKyAgY3MqIEQgPSBjc19tdWx0aXBseShhLGIpOworICBjcyogRSA9IGNzX3RyYW5zcG9zZShELDEpOworICBjc19zcGZyZWUoRCk7CisgIGNzKiBDID0gY3NfdHJhbnNwb3NlKEUsMSk7CisgIGNzX3NwZnJlZShFKTsKKyAgcmV0dXJuIEM7Cit9CisjZW5kaWYKKwordm9pZCBiZW5jaF9zb3J0KCk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisvLyAgIGJlbmNoX3NvcnQoKTsKKworICBpbnQgcm93cyA9IFNJWkU7CisgIGludCBjb2xzID0gU0laRTsKKyAgZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7CisKKyAgRWlnZW5TcGFyc2VNYXRyaXggc20xKHJvd3MsY29scyksIHNtMihyb3dzLGNvbHMpLCBzbTMocm93cyxjb2xzKSwgc200KHJvd3MsY29scyk7CisKKyAgQmVuY2hUaW1lciB0aW1lcjsKKyAgZm9yIChpbnQgbm56UGVyQ29sID0gTk5aUEVSQ09MOyBubnpQZXJDb2w+MTsgbm56UGVyQ29sLz0xLjEpCisgIHsKKyAgICBzbTEuc2V0WmVybygpOworICAgIHNtMi5zZXRaZXJvKCk7CisgICAgZmlsbE1hdHJpeDIobm56UGVyQ29sLCByb3dzLCBjb2xzLCBzbTEpOworICAgIGZpbGxNYXRyaXgyKG5uelBlckNvbCwgcm93cywgY29scywgc20yKTsKKy8vICAgICBzdGQ6OmNlcnIgPDwgImZpbGxpbmcgT0tcbiI7CisKKyAgICAvLyBkZW5zZSBtYXRyaWNlcworICAgICNpZmRlZiBERU5TRU1BVFJJWAorICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gRGVuc2VcdCIgPDwgbm56UGVyQ29sIDw8ICIlXG4iOworICAgICAgRGVuc2VNYXRyaXggbTEocm93cyxjb2xzKSwgbTIocm93cyxjb2xzKSwgbTMocm93cyxjb2xzKTsKKyAgICAgIGVpVG9EZW5zZShzbTEsIG0xKTsKKyAgICAgIGVpVG9EZW5zZShzbTIsIG0yKTsKKworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgICAgIG0zID0gbTEgKiBtMjsKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgICAgIG0zID0gbTEudHJhbnNwb3NlKCkgKiBtMjsKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQorICAgICAgICBtMyA9IG0xLnRyYW5zcG9zZSgpICogbTIudHJhbnNwb3NlKCk7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYic6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgICAgIG0zID0gbTEgKiBtMi50cmFuc3Bvc2UoKTsKKyAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLy8gZWlnZW4gc3BhcnNlIG1hdHJpY2VzCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBzcGFyc2VcdCIgPDwgc20xLm5vblplcm9zKCkvKGZsb2F0KHNtMS5yb3dzKCkpKmZsb2F0KHNtMS5jb2xzKCkpKSoxMDAgPDwgIiUgKiAiCisgICAgICAgICAgICAgICAgPDwgc20yLm5vblplcm9zKCkvKGZsb2F0KHNtMi5yb3dzKCkpKmZsb2F0KHNtMi5jb2xzKCkpKSoxMDAgPDwgIiVcbiI7CisKKyAgICAgIEJFTkNIKHNtMyA9IHNtMSAqIHNtMjsgKQorICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisvLyAgICAgICBCRU5DSChzbTMgPSBzbTEudHJhbnNwb3NlKCkgKiBzbTI7ICkKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAvLworLy8gICAgICAgQkVOQ0goc20zID0gc20xLnRyYW5zcG9zZSgpICogc20yLnRyYW5zcG9zZSgpOyApCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYic6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vIC8vCisvLyAgICAgICBCRU5DSChzbTMgPSBzbTEgKiBzbTIudHJhbnNwb3NlKCk7ICkKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGInIDpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOworLy8KKy8vICAgICAgIEJFTkNIKCBzbTMuX2V4cGVyaW1lbnRhbE5ld1Byb2R1Y3Qoc20xLCBzbTIpOyApCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLworLy8gICAgICAgQkVOQ0goc20zLl9leHBlcmltZW50YWxOZXdQcm9kdWN0KHNtMS50cmFuc3Bvc2UoKSxzbTIpOyApCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gLy8KKy8vICAgICAgIEJFTkNIKHNtMy5fZXhwZXJpbWVudGFsTmV3UHJvZHVjdChzbTEudHJhbnNwb3NlKCksc20yLnRyYW5zcG9zZSgpKTsgKQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAvLworLy8gICAgICAgQkVOQ0goc20zLl9leHBlcmltZW50YWxOZXdQcm9kdWN0KHNtMSwgc20yLnRyYW5zcG9zZSgpKTspCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJyA6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBlaWdlbiBkeW4tc3BhcnNlIG1hdHJpY2VzCisgICAgLyp7CisgICAgICBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhcj4gbTEoc20xKSwgbTIoc20yKSwgbTMoc20zKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gZHluLXNwYXJzZVx0IiA8PCBtMS5ub25aZXJvcygpLyhmbG9hdChtMS5yb3dzKCkpKmZsb2F0KG0xLmNvbHMoKSkpKjEwMCA8PCAiJSAqICIKKyAgICAgICAgICAgICAgICA8PCBtMi5ub25aZXJvcygpLyhmbG9hdChtMi5yb3dzKCkpKmZsb2F0KG0yLmNvbHMoKSkpKjEwMCA8PCAiJVxuIjsKKworLy8gICAgICAgdGltZXIucmVzZXQoKTsKKy8vICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBCRU5DSChmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spIG0zID0gbTEgKiBtMjspCisvLyAgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgc20zIDw8ICJcbiI7CisKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICB0aW1lci5zdGFydCgpOworLy8gICAgICAgc3RkOjpjZXJyIDw8ICJ0cmFuc3Bvc2UuLi5cbiI7CisvLyAgICAgICBFaWdlblNwYXJzZU1hdHJpeCBzbTQgPSBzbTEudHJhbnNwb3NlKCk7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgc200Lm5vblplcm9zKCkgPDwgIiA9PSAiIDw8IHNtMS5ub25aZXJvcygpIDw8ICJcbiI7CisvLyAgICAgICBleGl0KDEpOworLy8gICAgICAgc3RkOjpjZXJyIDw8ICJ0cmFuc3Bvc2UgT0tcbiI7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgc20xIDw8ICJcblxuIiA8PCBzbTEudHJhbnNwb3NlKCkgPDwgIlxuXG4iIDw8IHNtNC50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7CisgICAgICBCRU5DSChmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spIG0zID0gbTEudHJhbnNwb3NlKCkgKiBtMjspCisvLyAgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisvLyAgICAgICB0aW1lci5yZXNldCgpOworLy8gICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIEJFTkNIKCBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spIG0zID0gbTEudHJhbnNwb3NlKCkgKiBtMi50cmFuc3Bvc2UoKTsgKQorLy8gICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKy8vICAgICAgIHRpbWVyLnJlc2V0KCk7CisvLyAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgQkVOQ0goIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgbTMgPSBtMSAqIG0yLnRyYW5zcG9zZSgpOyApCisvLyAgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJyA6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9Ki8KKworICAgIC8vIENTcGFyc2UKKyAgICAjaWZkZWYgQ1NQQVJTRQorICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiQ1NwYXJzZSBcdCIgPDwgbm56UGVyQ29sIDw8ICIlXG4iOworICAgICAgY3MgKm0xLCAqbTIsICptMzsKKyAgICAgIGVpVG9DU3BhcnNlKHNtMSwgbTEpOworICAgICAgZWlUb0NTcGFyc2Uoc20yLCBtMik7CisKKyAgICAgIEJFTkNIKAorICAgICAgeworICAgICAgICBtMyA9IGNzX3NvcnRlZF9tdWx0aXBseShtMSwgbTIpOworICAgICAgICBpZiAoIW0zKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpjZXJyIDw8ICJjc19tdWx0aXBseSBmYWlsZWRcbiI7CisgICAgICAgIH0KKy8vICAgICAgICAgY3NfcHJpbnQobTMsIDApOworICAgICAgICBjc19zcGZyZWUobTMpOworICAgICAgfQorICAgICAgKTsKKy8vICAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKworLy8gICAgICAgQkVOQ0goIHsgbTMgPSBjc19zb3J0ZWRfbXVsdGlwbHkyKG0xLCBtMik7IGNzX3NwZnJlZShtMyk7IH0gKTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAjaWZuZGVmIE5PVUJMQVMKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgInVibGFzXHQiIDw8IG5uelBlckNvbCA8PCAiJVxuIjsKKyAgICAgIFVCbGFzU3BhcnNlIG0xKHJvd3MsY29scyksIG0yKHJvd3MsY29scyksIG0zKHJvd3MsY29scyk7CisgICAgICBlaVRvVWJsYXMoc20xLCBtMSk7CisgICAgICBlaVRvVWJsYXMoc20yLCBtMik7CisKKyAgICAgIEJFTkNIKGJvb3N0OjpudW1lcmljOjp1Ymxhczo6cHJvZChtMSwgbTIsIG0zKTspOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIEdNTSsrCisgICAgI2lmbmRlZiBOT0dNTQorICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiR01NKysgc3BhcnNlXHQiIDw8IG5uelBlckNvbCA8PCAiJVxuIjsKKyAgICAgIEdtbUR5blNwYXJzZSAgZ21tVDMocm93cyxjb2xzKTsKKyAgICAgIEdtbVNwYXJzZSBtMShyb3dzLGNvbHMpLCBtMihyb3dzLGNvbHMpLCBtMyhyb3dzLGNvbHMpOworICAgICAgZWlUb0dtbShzbTEsIG0xKTsKKyAgICAgIGVpVG9HbW0oc20yLCBtMik7CisKKyAgICAgIEJFTkNIKGdtbTo6bXVsdChtMSwgbTIsIGdtbVQzKTspOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisvLyAgICAgICBCRU5DSChnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKG0xKSwgbTIsIGdtbVQzKTspOworLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vCisvLyAgICAgICBpZiAocm93czw1MDApCisvLyAgICAgICB7CisvLyAgICAgICAgIEJFTkNIKGdtbTo6bXVsdChnbW06OnRyYW5zcG9zZWQobTEpLCBnbW06OnRyYW5zcG9zZWQobTIpLCBnbW1UMyk7KTsKKy8vICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLworLy8gICAgICAgICBCRU5DSChnbW06Om11bHQobTEsIGdtbTo6dHJhbnNwb3NlZChtMiksIGdtbVQzKTspOworLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gICAgICAgfQorLy8gICAgICAgZWxzZQorLy8gICAgICAgeworLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYic6XHQiIDw8ICJmb3JldmVyIiA8PCBlbmRsOworLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJzpcdCIgPDwgImZvcmV2ZXIiIDw8IGVuZGw7CisvLyAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorCisgICAgLy8gTVRMNAorICAgICNpZm5kZWYgTk9NVEwKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1UTDRcdCIgPDwgbm56UGVyQ29sIDw8ICIlXG4iOworICAgICAgTXRsU3BhcnNlIG0xKHJvd3MsY29scyksIG0yKHJvd3MsY29scyksIG0zKHJvd3MsY29scyk7CisgICAgICBlaVRvTXRsKHNtMSwgbTEpOworICAgICAgZWlUb010bChzbTIsIG0yKTsKKworICAgICAgQkVOQ0gobTMgPSBtMSAqIG0yOyk7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisKKy8vICAgICAgIEJFTkNIKG0zID0gdHJhbnMobTEpICogbTI7KTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLworLy8gICAgICAgQkVOQ0gobTMgPSB0cmFucyhtMSkgKiB0cmFucyhtMik7KTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLworLy8gICAgICAgQkVOQ0gobTMgPSBtMSAqIHRyYW5zKG0yKTspOworLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYicgOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgc3RkOjpjb3V0IDw8ICJcblxuIjsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKKwpkaWZmIC0tZ2l0IGEvYmVuY2gvc3BhcnNlX3JhbmRvbXNldHRlci5jcHAgYi9iZW5jaC9zcGFyc2VfcmFuZG9tc2V0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWE3NmUzCi0tLSAvZGV2L251bGwKKysrIGIvYmVuY2gvc3BhcnNlX3JhbmRvbXNldHRlci5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKworI2RlZmluZSBOT0dNTQorI2RlZmluZSBOT01UTAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGV4dC9oYXNoX21hcD4KKyNpbmNsdWRlIDxnb29nbGUvZGVuc2VfaGFzaF9tYXA+CisjaW5jbHVkZSA8Z29vZ2xlL3NwYXJzZV9oYXNoX21hcD4KKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgMTAwMDAKKyNlbmRpZgorCisjaWZuZGVmIERFTlNJVFkKKyNkZWZpbmUgREVOU0lUWSAwLjAxCisjZW5kaWYKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEKKyNlbmRpZgorCisjaW5jbHVkZSAiQmVuY2hTcGFyc2VVdGlsLmgiCisKKyNpZm5kZWYgTUlOREVOU0lUWQorI2RlZmluZSBNSU5ERU5TSVRZIDAuMDAwNAorI2VuZGlmCisKKyNpZm5kZWYgTkJUUklFUworI2RlZmluZSBOQlRSSUVTIDEwCisjZW5kaWYKKworI2RlZmluZSBCRU5DSChYKSBcCisgIHRpbWVyLnJlc2V0KCk7IFwKKyAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCisgICAgdGltZXIuc3RhcnQoKTsgXAorICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCisgICAgICAgIFggIFwKKyAgfSB0aW1lci5zdG9wKCk7IH0KKworCitzdGF0aWMgZG91YmxlIHJ0aW1lOworc3RhdGljIGRvdWJsZSBuZW50cmllczsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2V0dGVyVHlwZT4KK3ZvaWQgZG9zdHVmZihjb25zdCBjaGFyKiBuYW1lLCBFaWdlblNwYXJzZU1hdHJpeCYgc20xKQoreworICBpbnQgcm93cyA9IHNtMS5yb3dzKCk7CisgIGludCBjb2xzID0gc20xLmNvbHMoKTsKKyAgc20xLnNldFplcm8oKTsKKyAgQmVuY2hUaW1lciB0OworICBTZXR0ZXJUeXBlKiBzZXQxID0gbmV3IFNldHRlclR5cGUoc20xKTsKKyAgdC5yZXNldCgpOyB0LnN0YXJ0KCk7CisgIGZvciAoaW50IGs9MDsgazxuZW50cmllczsgKytrKQorICAgICgqc2V0MSkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpKSArPSAxOworICB0LnN0b3AoKTsKKyAgc3RkOjpjb3V0IDw8ICJzdGQ6Om1hcCA9PiAgICAgIFx0IiA8PCB0LnZhbHVlKCktcnRpbWUKKyAgICAgICAgICAgIDw8ICIgbm56PSIgPDwgc2V0MS0+bm9uWmVyb3MoKSA8PCBzdGQ6OmZsdXNoOworCisgIC8vIGdldGNoYXIoKTsKKworICB0LnJlc2V0KCk7IHQuc3RhcnQoKTsgZGVsZXRlIHNldDE7IHQuc3RvcCgpOworICBzdGQ6OmNvdXQgPDwgIiAgYmFjazogXHQiIDw8IHQudmFsdWUoKSA8PCAiXG4iOworfQorICAgIAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJvd3MgPSBTSVpFOworICBpbnQgY29scyA9IFNJWkU7CisgIGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOworCisgIEVpZ2VuU3BhcnNlTWF0cml4IHNtMShyb3dzLGNvbHMpLCBzbTIocm93cyxjb2xzKTsKKworCisgIG5lbnRyaWVzID0gcm93cypjb2xzKmRlbnNpdHk7CisgIHN0ZDo6Y291dCA8PCAibiA9ICIgPDwgbmVudHJpZXMgPDwgIlxuIjsKKyAgaW50IGR1bW15OworICBCZW5jaFRpbWVyIHQ7CisKKyAgdC5yZXNldCgpOyB0LnN0YXJ0KCk7CisgIGZvciAoaW50IGs9MDsgazxuZW50cmllczsgKytrKQorICAgIGR1bW15ID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKSArIGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSk7CisgIHQuc3RvcCgpOworICBydGltZSA9IHQudmFsdWUoKTsKKyAgc3RkOjpjb3V0IDw8ICJydGltZSA9ICIgPDwgcnRpbWUgPDwgIiAoIiA8PCBkdW1teSA8PCAiKVxuXG4iOworICBjb25zdCBpbnQgQml0cyA9IDY7CisgIGZvciAoOzspCisgIHsKKyAgICBkb3N0dWZmPFJhbmRvbVNldHRlcjxFaWdlblNwYXJzZU1hdHJpeCxTdGRNYXBUcmFpdHMsQml0cz4gPigic3RkOjptYXAgICAgICIsIHNtMSk7CisgICAgZG9zdHVmZjxSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsR251SGFzaE1hcFRyYWl0cyxCaXRzPiA+KCJnbnU6Omhhc2hfbWFwIiwgc20xKTsKKyAgICBkb3N0dWZmPFJhbmRvbVNldHRlcjxFaWdlblNwYXJzZU1hdHJpeCxHb29nbGVEZW5zZUhhc2hNYXBUcmFpdHMsQml0cz4gPigiZ29vZ2xlOjpkZW5zZSIsIHNtMSk7CisgICAgZG9zdHVmZjxSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsR29vZ2xlU3BhcnNlSGFzaE1hcFRyYWl0cyxCaXRzPiA+KCJnb29nbGU6OnNwYXJzZSIsIHNtMSk7CisKKy8vICAgICB7CisvLyAgICAgICBSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsR251SGFzaE1hcFRyYWl0cyxCaXRzPiBzZXQxKHNtMSk7CisvLyAgICAgICB0LnJlc2V0KCk7IHQuc3RhcnQoKTsKKy8vICAgICAgIGZvciAoaW50IGs9MDsgazxuOyArK2spCisvLyAgICAgICAgIHNldDEoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpKSArPSAxOworLy8gICAgICAgdC5zdG9wKCk7CisvLyAgICAgICBzdGQ6OmNvdXQgPDwgImdudTo6aGFzaF9tYXAgPT4gXHQiIDw8IHQudmFsdWUoKS1ydGltZQorLy8gICAgICAgICAgICAgICAgIDw8ICIgbm56PSIgPDwgc2V0MS5ub25aZXJvcygpIDw8ICJcbiI7Z2V0Y2hhcigpOworLy8gICAgIH0KKy8vICAgICB7CisvLyAgICAgICBSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsR29vZ2xlRGVuc2VIYXNoTWFwVHJhaXRzLEJpdHM+IHNldDEoc20xKTsKKy8vICAgICAgIHQucmVzZXQoKTsgdC5zdGFydCgpOworLy8gICAgICAgZm9yIChpbnQgaz0wOyBrPG47ICsraykKKy8vICAgICAgICAgc2V0MShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpICs9IDE7CisvLyAgICAgICB0LnN0b3AoKTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiZ29vZ2xlOjpkZW5zZSA9PiBcdCIgPDwgdC52YWx1ZSgpLXJ0aW1lCisvLyAgICAgICAgICAgICAgICAgPDwgIiBubno9IiA8PCBzZXQxLm5vblplcm9zKCkgPDwgIlxuIjtnZXRjaGFyKCk7CisvLyAgICAgfQorLy8gICAgIHsKKy8vICAgICAgIFJhbmRvbVNldHRlcjxFaWdlblNwYXJzZU1hdHJpeCxHb29nbGVTcGFyc2VIYXNoTWFwVHJhaXRzLEJpdHM+IHNldDEoc20xKTsKKy8vICAgICAgIHQucmVzZXQoKTsgdC5zdGFydCgpOworLy8gICAgICAgZm9yIChpbnQgaz0wOyBrPG47ICsraykKKy8vICAgICAgICAgc2V0MShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpICs9IDE7CisvLyAgICAgICB0LnN0b3AoKTsKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiZ29vZ2xlOjpzcGFyc2UgPT4gXHQiIDw8IHQudmFsdWUoKS1ydGltZQorLy8gICAgICAgICAgICAgICAgIDw8ICIgbm56PSIgPDwgc2V0MS5ub25aZXJvcygpIDw8ICJcbiI7Z2V0Y2hhcigpOworLy8gICAgIH0KKyAgICBzdGQ6OmNvdXQgPDwgIlxuXG4iOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV9zZXR0ZXIuY3BwIGIvYmVuY2gvc3BhcnNlX3NldHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmMGIxMQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3NwYXJzZV9zZXR0ZXIuY3BwCkBAIC0wLDAgKzEsNDg1IEBACisKKy8vZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wMDUgLURTSVpFPTEwMDAwICYmIC4vYS5vdXQKKy8vZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wNSAtRFNJWkU9MjAwMCAmJiAuL2Eub3V0CisvLyAtRE5PR01NIC1ETk9NVEwgLURDU1BBUlNFCisvLyAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvSW5jbHVkZS8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0xpYi9saWJjc3BhcnNlLmEKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDEwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgTkJQRVJST1cKKyNkZWZpbmUgTkJQRVJST1cgMjQKKyNlbmRpZgorCisjaWZuZGVmIFJFUEVBVAorI2RlZmluZSBSRVBFQVQgMgorI2VuZGlmCisKKyNpZm5kZWYgTkJUUklFUworI2RlZmluZSBOQlRSSUVTIDIKKyNlbmRpZgorCisjaWZuZGVmIEtLCisjZGVmaW5lIEtLIDEwCisjZW5kaWYKKworI2lmbmRlZiBOT0dPT0dMRQorI2RlZmluZSBFSUdFTl9HT09HTEVIQVNIX1NVUFBPUlQKKyNpbmNsdWRlIDxnb29nbGUvc3BhcnNlX2hhc2hfbWFwPgorI2VuZGlmCisKKyNpbmNsdWRlICJCZW5jaFNwYXJzZVV0aWwuaCIKKworI2RlZmluZSBDSEVDS19NRU0KKy8vICNkZWZpbmUgQ0hFQ0tfTUVNICBzdGQvKiovOjpjb3V0IDw8ICJjaGVjayBtZW1cbiI7IGdldGNoYXIoKTsKKworI2RlZmluZSBCRU5DSChYKSBcCisgIHRpbWVyLnJlc2V0KCk7IFwKKyAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCisgICAgdGltZXIuc3RhcnQoKTsgXAorICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCisgICAgICAgIFggIFwKKyAgfSB0aW1lci5zdG9wKCk7IH0KKwordHlwZWRlZiBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4gQ29vcmRpbmF0ZXM7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPGZsb2F0PiBWYWx1ZXM7CisKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0aW5uZXJyYW5kX2VpZ2VuKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fZHluYW1pYyhjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX2VpZ2VuX2NvbXBhY3QoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKTsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9zdW1lcShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX2VpZ2VuX2dudV9oYXNoKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fZ29vZ2xlX2RlbnNlKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fZ29vZ2xlX3NwYXJzZShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX3NjaXB5KGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfdWJsYXNfbWFwcGVkKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfdWJsYXNfY29vcmQoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKTsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF91Ymxhc19jb21wcmVzc2VkKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfdWJsYXNfZ2VudmVjKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfbXRsKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscyk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByb3dzID0gU0laRTsKKyAgaW50IGNvbHMgPSBTSVpFOworICBib29sIGZ1bGx5cmFuZCA9IHRydWU7CisKKyAgQmVuY2hUaW1lciB0aW1lcjsKKyAgQ29vcmRpbmF0ZXMgY29vcmRzOworICBWYWx1ZXMgdmFsdWVzOworICBpZihmdWxseXJhbmQpCisgIHsKKyAgICBDb29yZGluYXRlcyBwb29sOworICAgIHBvb2wucmVzZXJ2ZShjb2xzKk5CUEVSUk9XKTsKKyAgICBzdGQ6OmNlcnIgPDwgImZpbGwgcG9vbCIgPDwgIlxuIjsKKyAgICBmb3IgKGludCBpPTA7IGk8Y29scypOQlBFUlJPVzsgKQorICAgIHsKKy8vICAgICAgIER5bmFtaWNTcGFyc2VNYXRyaXg8aW50PiBzdGVuY2lsKFNJWkUsU0laRSk7CisgICAgICBWZWN0b3IyaSBpaihpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpOworLy8gICAgICAgaWYoc3RlbmNpbC5jb2VmZlJlZihpai54KCksIGlqLnkoKSk9PTApCisgICAgICB7CisvLyAgICAgICAgIHN0ZW5jaWwuY29lZmZSZWYoaWoueCgpLCBpai55KCkpID0gMTsKKyAgICAgICAgcG9vbC5wdXNoX2JhY2soaWopOworCisgICAgICB9CisgICAgICArK2k7CisgICAgfQorICAgIHN0ZDo6Y2VyciA8PCAicG9vbCBvayIgPDwgIlxuIjsKKyAgICBpbnQgbiA9IGNvbHMqTkJQRVJST1cqS0s7CisgICAgY29vcmRzLnJlc2VydmUobik7CisgICAgdmFsdWVzLnJlc2VydmUobik7CisgICAgZm9yIChpbnQgaT0wOyBpPG47ICsraSkKKyAgICB7CisgICAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHBvb2wuc2l6ZSgpKTsKKyAgICAgIGNvb3Jkcy5wdXNoX2JhY2socG9vbFtpXSk7CisgICAgICB2YWx1ZXMucHVzaF9iYWNrKGludGVybmFsOjpyYW5kb208U2NhbGFyPigpKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKKyAgICBmb3IgKGludCBpPTA7IGk8TkJQRVJST1c7ICsraSkKKyAgICB7CisgICAgICBjb29yZHMucHVzaF9iYWNrKFZlY3RvcjJpKGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSksaikpOworICAgICAgdmFsdWVzLnB1c2hfYmFjayhpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSk7CisgICAgfQorICB9CisgIHN0ZDo6Y291dCA8PCAibm56ID0gIiA8PCBjb29yZHMuc2l6ZSgpICA8PCAiXG4iOworICBDSEVDS19NRU0KKworICAgIC8vIGRlbnNlIG1hdHJpY2VzCisgICAgI2lmZGVmIERFTlNFTUFUUklYCisgICAgeworICAgICAgQkVOQ0goc2V0cmFuZF9laWdlbl9kZW5zZShjb29yZHMsdmFsdWVzKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIERlbnNlXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvLyBlaWdlbiBzcGFyc2UgbWF0cmljZXMKKy8vICAgICBpZiAoIWZ1bGx5cmFuZCkKKy8vICAgICB7CisvLyAgICAgICBCRU5DSChzZXRpbm5lcnJhbmRfZWlnZW4oY29vcmRzLHZhbHVlcyk7KQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBmaWxscmFuZFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisvLyAgICAgfQorICAgIHsKKyAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZHluYW1pYyhjb29yZHMsdmFsdWVzKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGR5bmFtaWNcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOworICAgIH0KKy8vICAgICB7CisvLyAgICAgICBCRU5DSChzZXRyYW5kX2VpZ2VuX2NvbXBhY3QoY29vcmRzLHZhbHVlcyk7KQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBjb21wYWN0XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKy8vICAgICB9CisgICAgeworICAgICAgQkVOQ0goc2V0cmFuZF9laWdlbl9zdW1lcShjb29yZHMsdmFsdWVzKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIHN1bWVxXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9CisgICAgeworLy8gICAgICAgQkVOQ0goc2V0cmFuZF9laWdlbl9nbnVfaGFzaChjb29yZHMsdmFsdWVzKTspCisvLyAgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIHN0ZDo6bWFwXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9CisgICAgeworICAgICAgQkVOQ0goc2V0cmFuZF9zY2lweShjb29yZHMsdmFsdWVzKTspCisgICAgICBzdGQ6OmNvdXQgPDwgInNjaXB5XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9CisgICAgI2lmbmRlZiBOT0dPT0dMRQorICAgIHsKKyAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZ29vZ2xlX2RlbnNlKGNvb3Jkcyx2YWx1ZXMpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gZ29vZ2xlIGRlbnNlXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9CisgICAgeworICAgICAgQkVOQ0goc2V0cmFuZF9laWdlbl9nb29nbGVfc3BhcnNlKGNvb3Jkcyx2YWx1ZXMpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gZ29vZ2xlIHNwYXJzZVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICAgICNlbmRpZgorCisgICAgI2lmbmRlZiBOT1VCTEFTCisgICAgeworLy8gICAgICAgQkVOQ0goc2V0cmFuZF91Ymxhc19tYXBwZWQoY29vcmRzLHZhbHVlcyk7KQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyBtYXBwZWRcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOworICAgIH0KKyAgICB7CisgICAgICBCRU5DSChzZXRyYW5kX3VibGFzX2dlbnZlYyhjb29yZHMsdmFsdWVzKTspCisgICAgICBzdGQ6OmNvdXQgPDwgInVibGFzIHZlY29mdmVjXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9CisgICAgLyp7CisgICAgICB0aW1lci5yZXNldCgpOworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKKyAgICAgICAgc2V0cmFuZF91Ymxhc19jb21wcmVzc2VkKGNvb3Jkcyx2YWx1ZXMpOworICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyBjb21wXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9CisgICAgeworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgICAgIHNldHJhbmRfdWJsYXNfY29vcmQoY29vcmRzLHZhbHVlcyk7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgICBzdGQ6OmNvdXQgPDwgInVibGFzIGNvb3JkXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgICB9Ki8KKyAgICAjZW5kaWYKKworCisgICAgLy8gTVRMNAorICAgICNpZm5kZWYgTk9NVEwKKyAgICB7CisgICAgICBCRU5DSChzZXRyYW5kX210bChjb29yZHMsdmFsdWVzKSk7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1UTFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICAgICNlbmRpZgorCisgIHJldHVybiAwOworfQorCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldGlubmVycmFuZF9laWdlbihjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0KFNJWkUsU0laRSk7CisgIC8vbWF0LnN0YXJ0RmlsbCgyMDAwMDAwLypjb29yZHMuc2l6ZSgpKi8pOworICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgbWF0Lmluc2VydChjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSA9IHZhbHNbaV07CisgIH0KKyAgbWF0LmZpbmFsaXplKCk7CisgIENIRUNLX01FTTsKKyAgcmV0dXJuIDA7Cit9CisKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9keW5hbWljKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworICBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0KFNJWkUsU0laRSk7CisgIG1hdC5yZXNlcnZlKGNvb3Jkcy5zaXplKCkvMTApOworICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgbWF0LmNvZWZmUmVmKGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CisgIH0KKyAgbWF0LmZpbmFsaXplKCk7CisgIENIRUNLX01FTTsKKyAgcmV0dXJuICZtYXQuY29lZmZSZWYoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7Cit9CisKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9zdW1lcShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgaW50IG4gPSBjb29yZHMuc2l6ZSgpL0tLOworICBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0KFNJWkUsU0laRSk7CisgIGZvciAoaW50IGo9MDsgajxLSzsgKytqKQorICB7CisgICAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IGF1eChTSVpFLFNJWkUpOworICAgIG1hdC5yZXNlcnZlKG4pOworICAgIGZvciAoaW50IGk9aipuOyBpPChqKzEpKm47ICsraSkKKyAgICB7CisgICAgICBhdXguaW5zZXJ0KGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CisgICAgfQorICAgIGF1eC5maW5hbGl6ZSgpOworICAgIG1hdCArPSBhdXg7CisgIH0KKyAgcmV0dXJuICZtYXQuY29lZmZSZWYoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7Cit9CisKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9jb21wYWN0KGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworICBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhcj4gc2V0dGVyKFNJWkUsU0laRSk7CisgIHNldHRlci5yZXNlcnZlKGNvb3Jkcy5zaXplKCkvMTApOworICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgc2V0dGVyLmNvZWZmUmVmKGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CisgIH0KKyAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0ID0gc2V0dGVyOworICBDSEVDS19NRU07CisgIHJldHVybiAmbWF0LmNvZWZmUmVmKGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfQorCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fZ251X2hhc2goY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoreworICB1c2luZyBuYW1lc3BhY2UgRWlnZW47CisgIFNwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdChTSVpFLFNJWkUpOworICB7CisgICAgUmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeDxTY2FsYXI+LCBTdGRNYXBUcmFpdHMgPiBzZXR0ZXIobWF0KTsKKyAgICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQorICAgIHsKKyAgICAgIHNldHRlcihjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSArPSB2YWxzW2ldOworICAgIH0KKyAgICBDSEVDS19NRU07CisgIH0KKyAgcmV0dXJuICZtYXQuY29lZmZSZWYoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7Cit9CisKKyNpZm5kZWYgTk9HT09HTEUKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9nb29nbGVfZGVuc2UoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoreworICB1c2luZyBuYW1lc3BhY2UgRWlnZW47CisgIFNwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdChTSVpFLFNJWkUpOworICB7CisgICAgUmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeDxTY2FsYXI+LCBHb29nbGVEZW5zZUhhc2hNYXBUcmFpdHM+IHNldHRlcihtYXQpOworICAgIGZvciAoaW50IGk9MDsgaTxjb29yZHMuc2l6ZSgpOyArK2kpCisgICAgICBzZXR0ZXIoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgKz0gdmFsc1tpXTsKKyAgICBDSEVDS19NRU07CisgIH0KKyAgcmV0dXJuICZtYXQuY29lZmZSZWYoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7Cit9CisKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9nb29nbGVfc3BhcnNlKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKKyAgeworICAgIFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXg8U2NhbGFyPiwgR29vZ2xlU3BhcnNlSGFzaE1hcFRyYWl0cz4gc2V0dGVyKG1hdCk7CisgICAgZm9yIChpbnQgaT0wOyBpPGNvb3Jkcy5zaXplKCk7ICsraSkKKyAgICAgIHNldHRlcihjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSArPSB2YWxzW2ldOworICAgIENIRUNLX01FTTsKKyAgfQorICByZXR1cm4gJm1hdC5jb2VmZlJlZihjb29yZHNbMF0ueCgpLCBjb29yZHNbMF0ueSgpKTsKK30KKyNlbmRpZgorCisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBjb29fdG9jc3IoY29uc3QgaW50IG5fcm93LAorICAgICAgICAgICAgICAgY29uc3QgaW50IG5fY29sLAorICAgICAgICAgICAgICAgY29uc3QgaW50IG5ueiwKKyAgICAgICAgICAgICAgIGNvbnN0IENvb3JkaW5hdGVzIEFpaiwKKyAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlcyBBeCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBCcFtdLAorICAgICAgICAgICAgICAgICAgICAgaW50IEJqW10sCisgICAgICAgICAgICAgICAgICAgICBUIEJ4W10pCit7CisgICAgLy9jb21wdXRlIG51bWJlciBvZiBub24temVybyBlbnRyaWVzIHBlciByb3cgb2YgQSBjb29fdG9jc3IKKyAgICBzdGQ6OmZpbGwoQnAsIEJwICsgbl9yb3csIDApOworCisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBubno7IG4rKyl7CisgICAgICAgIEJwW0FpaltuXS54KCldKys7CisgICAgfQorCisgICAgLy9jdW1zdW0gdGhlIG5ueiBwZXIgcm93IHRvIGdldCBCcFtdCisgICAgZm9yKGludCBpID0gMCwgY3Vtc3VtID0gMDsgaSA8IG5fcm93OyBpKyspeworICAgICAgICBpbnQgdGVtcCA9IEJwW2ldOworICAgICAgICBCcFtpXSA9IGN1bXN1bTsKKyAgICAgICAgY3Vtc3VtICs9IHRlbXA7CisgICAgfQorICAgIEJwW25fcm93XSA9IG5uejsKKworICAgIC8vd3JpdGUgQWosQXggaW50byBCaixCeAorICAgIGZvcihpbnQgbiA9IDA7IG4gPCBubno7IG4rKyl7CisgICAgICAgIGludCByb3cgID0gQWlqW25dLngoKTsKKyAgICAgICAgaW50IGRlc3QgPSBCcFtyb3ddOworCisgICAgICAgIEJqW2Rlc3RdID0gQWlqW25dLnkoKTsKKyAgICAgICAgQnhbZGVzdF0gPSBBeFtuXTsKKworICAgICAgICBCcFtyb3ddKys7CisgICAgfQorCisgICAgZm9yKGludCBpID0gMCwgbGFzdCA9IDA7IGkgPD0gbl9yb3c7IGkrKyl7CisgICAgICAgIGludCB0ZW1wID0gQnBbaV07CisgICAgICAgIEJwW2ldICA9IGxhc3Q7CisgICAgICAgIGxhc3QgICA9IHRlbXA7CisgICAgfQorCisgICAgLy9ub3cgQnAsQmosQnggZm9ybSBhIENTUiByZXByZXNlbnRhdGlvbiAod2l0aCBwb3NzaWJsZSBkdXBsaWNhdGVzKQorfQorCit0ZW1wbGF0ZTwgY2xhc3MgVDEsIGNsYXNzIFQyID4KK2Jvb2wga3ZfcGFpcl9sZXNzKGNvbnN0IHN0ZDo6cGFpcjxUMSxUMj4mIHgsIGNvbnN0IHN0ZDo6cGFpcjxUMSxUMj4mIHkpeworICAgIHJldHVybiB4LmZpcnN0IDwgeS5maXJzdDsKK30KKworCit0ZW1wbGF0ZTxjbGFzcyBJLCBjbGFzcyBUPgordm9pZCBjc3Jfc29ydF9pbmRpY2VzKGNvbnN0IEkgbl9yb3csCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSSBBcFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgQWpbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIEF4W10pCit7CisgICAgc3RkOjp2ZWN0b3I8IHN0ZDo6cGFpcjxJLFQ+ID4gdGVtcDsKKworICAgIGZvcihJIGkgPSAwOyBpIDwgbl9yb3c7IGkrKyl7CisgICAgICAgIEkgcm93X3N0YXJ0ID0gQXBbaV07CisgICAgICAgIEkgcm93X2VuZCAgID0gQXBbaSsxXTsKKworICAgICAgICB0ZW1wLmNsZWFyKCk7CisKKyAgICAgICAgZm9yKEkgamogPSByb3dfc3RhcnQ7IGpqIDwgcm93X2VuZDsgamorKyl7CisgICAgICAgICAgICB0ZW1wLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBaltqal0sQXhbampdKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNvcnQodGVtcC5iZWdpbigpLHRlbXAuZW5kKCksa3ZfcGFpcl9sZXNzPEksVD4pOworCisgICAgICAgIGZvcihJIGpqID0gcm93X3N0YXJ0LCBuID0gMDsgamogPCByb3dfZW5kOyBqaisrLCBuKyspeworICAgICAgICAgICAgQWpbampdID0gdGVtcFtuXS5maXJzdDsKKyAgICAgICAgICAgIEF4W2pqXSA9IHRlbXBbbl0uc2Vjb25kOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSSwgY2xhc3MgVD4KK3ZvaWQgY3NyX3N1bV9kdXBsaWNhdGVzKGNvbnN0IEkgbl9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJIG5fY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBBcFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBBaltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBBeFtdKQoreworICAgIEkgbm56ID0gMDsKKyAgICBJIHJvd19lbmQgPSAwOworICAgIGZvcihJIGkgPSAwOyBpIDwgbl9yb3c7IGkrKyl7CisgICAgICAgIEkgamogPSByb3dfZW5kOworICAgICAgICByb3dfZW5kID0gQXBbaSsxXTsKKyAgICAgICAgd2hpbGUoIGpqIDwgcm93X2VuZCApeworICAgICAgICAgICAgSSBqID0gQWpbampdOworICAgICAgICAgICAgVCB4ID0gQXhbampdOworICAgICAgICAgICAgamorKzsKKyAgICAgICAgICAgIHdoaWxlKCBqaiA8IHJvd19lbmQgJiYgQWpbampdID09IGogKXsKKyAgICAgICAgICAgICAgICB4ICs9IEF4W2pqXTsKKyAgICAgICAgICAgICAgICBqaisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWpbbm56XSA9IGo7CisgICAgICAgICAgICBBeFtubnpdID0geDsKKyAgICAgICAgICAgIG5ueisrOworICAgICAgICB9CisgICAgICAgIEFwW2krMV0gPSBubno7CisgICAgfQorfQorCitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfc2NpcHkoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoreworICB1c2luZyBuYW1lc3BhY2UgRWlnZW47CisgIFNwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdChTSVpFLFNJWkUpOworICBtYXQucmVzaXplTm9uWmVyb3MoY29vcmRzLnNpemUoKSk7CisvLyAgIHN0ZDo6Y2VyciA8PCAic2V0cmFuZF9zY2lweS4uLlxuIjsKKyAgY29vX3RvY3NyPFNjYWxhcj4oU0laRSxTSVpFLCBjb29yZHMuc2l6ZSgpLCBjb29yZHMsIHZhbHMsIG1hdC5fb3V0ZXJJbmRleFB0cigpLCBtYXQuX2lubmVySW5kZXhQdHIoKSwgbWF0Ll92YWx1ZVB0cigpKTsKKy8vICAgc3RkOjpjZXJyIDw8ICJjb29fdG9jc3Igb2tcbiI7CisKKyAgY3NyX3NvcnRfaW5kaWNlcyhTSVpFLCBtYXQuX291dGVySW5kZXhQdHIoKSwgbWF0Ll9pbm5lckluZGV4UHRyKCksIG1hdC5fdmFsdWVQdHIoKSk7CisKKyAgY3NyX3N1bV9kdXBsaWNhdGVzKFNJWkUsIFNJWkUsIG1hdC5fb3V0ZXJJbmRleFB0cigpLCBtYXQuX2lubmVySW5kZXhQdHIoKSwgbWF0Ll92YWx1ZVB0cigpKTsKKworICBtYXQucmVzaXplTm9uWmVyb3MobWF0Ll9vdXRlckluZGV4UHRyKClbU0laRV0pOworCisgIHJldHVybiAmbWF0LmNvZWZmUmVmKGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworfQorCisKKyNpZm5kZWYgTk9VQkxBUworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX3VibGFzX21hcHBlZChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Om51bWVyaWM6OnVibGFzOworICBtYXBwZWRfbWF0cml4PFNjYWxhcj4gYXV4KFNJWkUsU0laRSk7CisgIGZvciAoaW50IGk9MDsgaTxjb29yZHMuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBhdXgoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgKz0gdmFsc1tpXTsKKyAgfQorICBDSEVDS19NRU07CisgIGNvbXByZXNzZWRfbWF0cml4PFNjYWxhcj4gbWF0KGF1eCk7CisgIHJldHVybiAwOy8vICZtYXQoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7Cit9CisvKkVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF91Ymxhc19jb29yZChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Om51bWVyaWM6OnVibGFzOworICBjb29yZGluYXRlX21hdHJpeDxTY2FsYXI+IGF1eChTSVpFLFNJWkUpOworICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgYXV4KGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpID0gdmFsc1tpXTsKKyAgfQorICBjb21wcmVzc2VkX21hdHJpeDxTY2FsYXI+IG1hdChhdXgpOworICByZXR1cm4gMDsvLyZtYXQoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7Cit9CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfdWJsYXNfY29tcHJlc3NlZChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Om51bWVyaWM6OnVibGFzOworICBjb21wcmVzc2VkX21hdHJpeDxTY2FsYXI+IG1hdChTSVpFLFNJWkUpOworICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgbWF0KGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpID0gdmFsc1tpXTsKKyAgfQorICByZXR1cm4gMDsvLyZtYXQoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7Cit9Ki8KK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF91Ymxhc19nZW52ZWMoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoreworICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7CisgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6bnVtZXJpYzsKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOjp1YmxhczsKKworLy8gICB1Ymxhczo6dmVjdG9yPGNvb3JkaW5hdGVfdmVjdG9yPFNjYWxhcj4gPiBmb287CisgIGdlbmVyYWxpemVkX3ZlY3Rvcl9vZl92ZWN0b3I8U2NhbGFyLCByb3dfbWFqb3IsIHVibGFzOjp2ZWN0b3I8Y29vcmRpbmF0ZV92ZWN0b3I8U2NhbGFyPiA+ID4gYXV4KFNJWkUsU0laRSk7CisgIGZvciAoaW50IGk9MDsgaTxjb29yZHMuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBhdXgoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgKz0gdmFsc1tpXTsKKyAgfQorICBDSEVDS19NRU07CisgIGNvbXByZXNzZWRfbWF0cml4PFNjYWxhcixyb3dfbWFqb3I+IG1hdChhdXgpOworICByZXR1cm4gMDsvLyZtYXQoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBOT01UTAorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBzZXRyYW5kX210bChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV90cmFuc3Bvc2UuY3BwIGIvYmVuY2gvc3BhcnNlX3RyYW5zcG9zZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhYWNmNQotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3NwYXJzZV90cmFuc3Bvc2UuY3BwCkBAIC0wLDAgKzEsMTA0IEBACisKKy8vZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV90cmFuc3Bvc2UuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjAwNSAtRFNJWkU9MTAwMDAgJiYgLi9hLm91dAorLy8gLUROT0dNTSAtRE5PTVRMCisvLyAtRENTUEFSU0UgLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0luY2x1ZGUvIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9MaWIvbGliY3NwYXJzZS5hCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDEwMDAwCisjZW5kaWYKKworI2lmbmRlZiBERU5TSVRZCisjZGVmaW5lIERFTlNJVFkgMC4wMQorI2VuZGlmCisKKyNpZm5kZWYgUkVQRUFUCisjZGVmaW5lIFJFUEVBVCAxCisjZW5kaWYKKworI2luY2x1ZGUgIkJlbmNoU3BhcnNlVXRpbC5oIgorCisjaWZuZGVmIE1JTkRFTlNJVFkKKyNkZWZpbmUgTUlOREVOU0lUWSAwLjAwMDQKKyNlbmRpZgorCisjaWZuZGVmIE5CVFJJRVMKKyNkZWZpbmUgTkJUUklFUyAxMAorI2VuZGlmCisKKyNkZWZpbmUgQkVOQ0goWCkgXAorICB0aW1lci5yZXNldCgpOyBcCisgIGZvciAoaW50IF9qPTA7IF9qPE5CVFJJRVM7ICsrX2opIHsgXAorICAgIHRpbWVyLnN0YXJ0KCk7IFwKKyAgICBmb3IgKGludCBfaz0wOyBfazxSRVBFQVQ7ICsrX2spIHsgXAorICAgICAgICBYICBcCisgIH0gdGltZXIuc3RvcCgpOyB9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByb3dzID0gU0laRTsKKyAgaW50IGNvbHMgPSBTSVpFOworICBmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsKKworICBFaWdlblNwYXJzZU1hdHJpeCBzbTEocm93cyxjb2xzKSwgc20zKHJvd3MsY29scyk7CisKKyAgQmVuY2hUaW1lciB0aW1lcjsKKyAgZm9yIChmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsgZGVuc2l0eT49TUlOREVOU0lUWTsgZGVuc2l0eSo9MC41KQorICB7CisgICAgZmlsbE1hdHJpeChkZW5zaXR5LCByb3dzLCBjb2xzLCBzbTEpOworCisgICAgLy8gZGVuc2UgbWF0cmljZXMKKyAgICAjaWZkZWYgREVOU0VNQVRSSVgKKyAgICB7CisgICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLGNvbHMpLCBtMyhyb3dzLGNvbHMpOworICAgICAgZWlUb0RlbnNlKHNtMSwgbTEpOworICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBtMyA9IG0xLnRyYW5zcG9zZSgpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiICBFaWdlbiBkZW5zZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHN0ZDo6Y291dCA8PCAiTm9uIHplcm9zOiAiIDw8IHNtMS5ub25aZXJvcygpL2Zsb2F0KHNtMS5yb3dzKCkqc20xLmNvbHMoKSkqMTAwIDw8ICIlXG4iOworCisgICAgLy8gZWlnZW4gc3BhcnNlIG1hdHJpY2VzCisgICAgeworICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBzbTMgPSBzbTEudHJhbnNwb3NlKCk7KQorICAgICAgc3RkOjpjb3V0IDw8ICIgIEVpZ2VuOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ1NwYXJzZQorICAgICNpZmRlZiBDU1BBUlNFCisgICAgeworICAgICAgY3MgKm0xLCAqbTM7CisgICAgICBlaVRvQ1NwYXJzZShzbTEsIG0xKTsKKworICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSB7IG0zID0gY3NfdHJhbnNwb3NlKG0xLDEpOyBjc19zcGZyZWUobTMpO30pCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgQ1NwYXJzZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIEdNTSsrCisgICAgI2lmbmRlZiBOT0dNTQorICAgIHsKKyAgICAgIEdtbUR5blNwYXJzZSAgZ21tVDMocm93cyxjb2xzKTsKKyAgICAgIEdtbVNwYXJzZSBtMShyb3dzLGNvbHMpLCBtMyhyb3dzLGNvbHMpOworICAgICAgZWlUb0dtbShzbTEsIG0xKTsKKyAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgZ21tOjpjb3B5KGdtbTo6dHJhbnNwb3NlZChtMSksbTMpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiICBHTU06XHRcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIE1UTDQKKyAgICAjaWZuZGVmIE5PTVRMCisgICAgeworICAgICAgTXRsU3BhcnNlIG0xKHJvd3MsY29scyksIG0zKHJvd3MsY29scyk7CisgICAgICBlaVRvTXRsKHNtMSwgbTEpOworICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBtMyA9IHRyYW5zKG0xKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgTVRMNDpcdFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgc3RkOjpjb3V0IDw8ICJcblxuIjsKKyAgfQorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfdHJpc29sdmVyLmNwcCBiL2JlbmNoL3NwYXJzZV90cmlzb2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZjRmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcGFyc2VfdHJpc29sdmVyLmNwcApAQCAtMCwwICsxLDIyMCBAQAorCisvL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDA1IC1EU0laRT0xMDAwMCAmJiAuL2Eub3V0CisvL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDUgLURTSVpFPTIwMDAgJiYgLi9hLm91dAorLy8gLUROT0dNTSAtRE5PTVRMCisvLyAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvSW5jbHVkZS8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0xpYi9saWJjc3BhcnNlLmEKKworI2lmbmRlZiBTSVpFCisjZGVmaW5lIFNJWkUgMTAwMDAKKyNlbmRpZgorCisjaWZuZGVmIERFTlNJVFkKKyNkZWZpbmUgREVOU0lUWSAwLjAxCisjZW5kaWYKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEKKyNlbmRpZgorCisjaW5jbHVkZSAiQmVuY2hTcGFyc2VVdGlsLmgiCisKKyNpZm5kZWYgTUlOREVOU0lUWQorI2RlZmluZSBNSU5ERU5TSVRZIDAuMDAwNAorI2VuZGlmCisKKyNpZm5kZWYgTkJUUklFUworI2RlZmluZSBOQlRSSUVTIDEwCisjZW5kaWYKKworI2RlZmluZSBCRU5DSChYKSBcCisgIHRpbWVyLnJlc2V0KCk7IFwKKyAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCisgICAgdGltZXIuc3RhcnQoKTsgXAorICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCisgICAgICAgIFggIFwKKyAgfSB0aW1lci5zdG9wKCk7IH0KKwordHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLFVwcGVyVHJpYW5ndWxhcj4gRWlnZW5TcGFyc2VUcmlNYXRyaXg7Cit0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsUm93TWFqb3JCaXR8VXBwZXJUcmlhbmd1bGFyPiBFaWdlblNwYXJzZVRyaU1hdHJpeFJvdzsKKwordm9pZCBmaWxsTWF0cml4KGZsb2F0IGRlbnNpdHksIGludCByb3dzLCBpbnQgY29scywgIEVpZ2VuU3BhcnNlVHJpTWF0cml4JiBkc3QpCit7CisgIGRzdC5zdGFydEZpbGwocm93cypjb2xzKmRlbnNpdHkpOworICBmb3IoaW50IGogPSAwOyBqIDwgY29sczsgaisrKQorICB7CisgICAgZm9yKGludCBpID0gMDsgaSA8IGo7IGkrKykKKyAgICB7CisgICAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLDEpIDwgZGVuc2l0eSkgPyBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSA6IDA7CisgICAgICBpZiAodiE9MCkKKyAgICAgICAgZHN0LmZpbGwoaSxqKSA9IHY7CisgICAgfQorICAgIGRzdC5maWxsKGosaikgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgfQorICBkc3QuZW5kRmlsbCgpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgcm93cyA9IFNJWkU7CisgIGludCBjb2xzID0gU0laRTsKKyAgZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7CisgIEJlbmNoVGltZXIgdGltZXI7CisgICNpZiAxCisgIEVpZ2VuU3BhcnNlVHJpTWF0cml4IHNtMShyb3dzLGNvbHMpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgRGVuc2VWZWN0b3IgYiA9IERlbnNlVmVjdG9yOjpSYW5kb20oY29scyk7CisgIERlbnNlVmVjdG9yIHggPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKGNvbHMpOworCisgIGJvb2wgZGVuc2Vkb25lID0gZmFsc2U7CisKKyAgZm9yIChmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsgZGVuc2l0eT49TUlOREVOU0lUWTsgZGVuc2l0eSo9MC41KQorICB7CisgICAgRWlnZW5TcGFyc2VUcmlNYXRyaXggc20xKHJvd3MsIGNvbHMpOworICAgIGZpbGxNYXRyaXgoZGVuc2l0eSwgcm93cywgY29scywgc20xKTsKKworICAgIC8vIGRlbnNlIG1hdHJpY2VzCisgICAgI2lmZGVmIERFTlNFTUFUUklYCisgICAgaWYgKCFkZW5zZWRvbmUpCisgICAgeworICAgICAgZGVuc2Vkb25lID0gdHJ1ZTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gRGVuc2VcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7CisgICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLGNvbHMpOworICAgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsRHluYW1pYyxEeW5hbWljLFJvd01ham9yQml0PiBtMihyb3dzLGNvbHMpOworICAgICAgZWlUb0RlbnNlKHNtMSwgbTEpOworICAgICAgbTIgPSBtMTsKKworICAgICAgQkVOQ0goeCA9IG0xLm1hcmtlZDxVcHBlclRyaWFuZ3VsYXI+KCkuc29sdmVUcmlhbmd1bGFyKGIpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgY29sbWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAgICAgICBzdGQ6OmNlcnIgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOworCisgICAgICBCRU5DSCh4ID0gbTIubWFya2VkPFVwcGVyVHJpYW5ndWxhcj4oKS5zb2x2ZVRyaWFuZ3VsYXIoYik7KQorICAgICAgc3RkOjpjb3V0IDw8ICIgICByb3dtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vICAgICAgIHN0ZDo6Y2VyciA8PCB4LnRyYW5zcG9zZSgpIDw8ICJcbiI7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLy8gZWlnZW4gc3BhcnNlIG1hdHJpY2VzCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBzcGFyc2VcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7CisgICAgICBFaWdlblNwYXJzZVRyaU1hdHJpeFJvdyBzbTIgPSBzbTE7CisKKyAgICAgIEJFTkNIKHggPSBzbTEuc29sdmVUcmlhbmd1bGFyKGIpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgY29sbWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAgICAgICBzdGQ6OmNlcnIgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOworCisgICAgICBCRU5DSCh4ID0gc20yLnNvbHZlVHJpYW5ndWxhcihiKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIHJvd21ham9yXi0xICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gICAgICAgc3RkOjpjZXJyIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKworLy8gICAgICAgeCA9IGI7CisvLyAgICAgICBCRU5DSChzbTEuaW52ZXJzZVByb2R1Y3RJblBsYWNlKHgpOykKKy8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgY29sbWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgKGlucGxhY2UpIiA8PCBlbmRsOworLy8gICAgICAgc3RkOjpjZXJyIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKy8vCisvLyAgICAgICB4ID0gYjsKKy8vICAgICAgIEJFTkNIKHNtMi5pbnZlcnNlUHJvZHVjdEluUGxhY2UoeCk7KQorLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICByb3dtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiAoaW5wbGFjZSkiIDw8IGVuZGw7CisvLyAgICAgICBzdGQ6OmNlcnIgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAgIH0KKworCisKKyAgICAvLyBDU3BhcnNlCisgICAgI2lmZGVmIENTUEFSU0UKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIkNTcGFyc2UgXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgY3MgKm0xOworICAgICAgZWlUb0NTcGFyc2Uoc20xLCBtMSk7CisKKyAgICAgIEJFTkNIKHggPSBiOyBpZiAoIWNzX2xzb2x2ZSAobTEsIHguZGF0YSgpKSl7c3RkOjpjZXJyIDw8ICJjc19sc29sdmUgZmFpbGVkXG4iOyBicmVhazt9OyApCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGNvbG1ham9yXi0xICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIEdNTSsrCisgICAgI2lmbmRlZiBOT0dNTQorICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiR01NKysgc3BhcnNlXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOworICAgICAgR21tU3BhcnNlIG0xKHJvd3MsY29scyk7CisgICAgICBnbW06OmNzcl9tYXRyaXg8U2NhbGFyPiBtMjsKKyAgICAgIGVpVG9HbW0oc20xLCBtMSk7CisgICAgICBnbW06OmNvcHkobTEsbTIpOworICAgICAgc3RkOjp2ZWN0b3I8U2NhbGFyPiBnbW1YKGNvbHMpLCBnbW1CKGNvbHMpOworICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1YWzBdLCBjb2xzKSA9IHg7CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJmdtbUJbMF0sIGNvbHMpID0gYjsKKworICAgICAgZ21tWCA9IGdtbUI7CisgICAgICBCRU5DSChnbW06OnVwcGVyX3RyaV9zb2x2ZShtMSwgZ21tWCwgZmFsc2UpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgY29sbWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAgICAgICBzdGQ6OmNlcnIgPDwgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1YWzBdLCBjb2xzKS50cmFuc3Bvc2UoKSA8PCAiXG4iOworCisgICAgICBnbW1YID0gZ21tQjsKKyAgICAgIEJFTkNIKGdtbTo6dXBwZXJfdHJpX3NvbHZlKG0yLCBnbW1YLCBmYWxzZSk7KQorICAgICAgdGltZXIuc3RvcCgpOworICAgICAgc3RkOjpjb3V0IDw8ICIgICByb3dtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKy8vICAgICAgIHN0ZDo6Y2VyciA8PCBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJmdtbVhbMF0sIGNvbHMpLnRyYW5zcG9zZSgpIDw8ICJcbiI7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLy8gTVRMNAorICAgICNpZm5kZWYgTk9NVEwKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1UTDRcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7CisgICAgICBNdGxTcGFyc2UgbTEocm93cyxjb2xzKTsKKyAgICAgIE10bFNwYXJzZVJvd01ham9yIG0yKHJvd3MsY29scyk7CisgICAgICBlaVRvTXRsKHNtMSwgbTEpOworICAgICAgbTIgPSBtMTsKKyAgICAgIG10bDo6ZGVuc2VfdmVjdG9yPFNjYWxhcj4geChyb3dzLCAxLjApOworICAgICAgbXRsOjpkZW5zZV92ZWN0b3I8U2NhbGFyPiBiKHJvd3MsIDEuMCk7CisKKyAgICAgIEJFTkNIKHggPSBtdGw6OnVwcGVyX3RyaXNvbHZlKG0xLGIpOykKKyAgICAgIHN0ZDo6Y291dCA8PCAiICAgY29sbWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisvLyAgICAgICBzdGQ6OmNlcnIgPDwgeCA8PCAiXG4iOworCisgICAgICBCRU5DSCh4ID0gbXRsOjp1cHBlcl90cmlzb2x2ZShtMixiKTspCisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIHJvd21ham9yXi0xICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworLy8gICAgICAgc3RkOjpjZXJyIDw8IHggPDwgIlxuIjsKKyAgICB9CisgICAgI2VuZGlmCisKKworICAgIHN0ZDo6Y291dCA8PCAiXG5cbiI7CisgIH0KKyAgI2VuZGlmCisKKyAgI2lmIDAKKyAgICAvLyBiZW5jaCBzbWFsbCBtYXRyaWNlcyAoaW4tcGxhY2UgdmVyc3VzIHJldHVybiBieWUgdmFsdWUpCisgICAgeworICAgICAgdGltZXIucmVzZXQoKTsKKyAgICAgIGZvciAoaW50IF9qPTA7IF9qPDEwOyArK19qKSB7CisgICAgICAgIE1hdHJpeDRmIG0gPSBNYXRyaXg0Zjo6UmFuZG9tKCk7CisgICAgICAgIFZlY3RvcjRmIGIgPSBWZWN0b3I0Zjo6UmFuZG9tKCk7CisgICAgICAgIFZlY3RvcjRmIHggPSBWZWN0b3I0Zjo6UmFuZG9tKCk7CisgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgIGZvciAoaW50IF9rPTA7IF9rPDEwMDAwMDA7ICsrX2spIHsKKyAgICAgICAgICBiID0gbS5pbnZlcnNlUHJvZHVjdChiKTsKKyAgICAgICAgfQorICAgICAgICB0aW1lci5zdG9wKCk7CisgICAgICB9CisgICAgICBzdGQ6OmNvdXQgPDwgIjR4NCA6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICB9CisKKyAgICB7CisgICAgICB0aW1lci5yZXNldCgpOworICAgICAgZm9yIChpbnQgX2o9MDsgX2o8MTA7ICsrX2opIHsKKyAgICAgICAgTWF0cml4NGYgbSA9IE1hdHJpeDRmOjpSYW5kb20oKTsKKyAgICAgICAgVmVjdG9yNGYgYiA9IFZlY3RvcjRmOjpSYW5kb20oKTsKKyAgICAgICAgVmVjdG9yNGYgeCA9IFZlY3RvcjRmOjpSYW5kb20oKTsKKyAgICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgICAgZm9yIChpbnQgX2s9MDsgX2s8MTAwMDAwMDsgKytfaykgeworICAgICAgICAgIG0uaW52ZXJzZVByb2R1Y3RJblBsYWNlKHgpOworICAgICAgICB9CisgICAgICAgIHRpbWVyLnN0b3AoKTsKKyAgICAgIH0KKyAgICAgIHN0ZDo6Y291dCA8PCAiNHg0IElQIDpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYmVuY2gvQ01ha2VMaXN0cy50eHQgYi9iZW5jaC9zcGJlbmNoL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTkxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcGJlbmNoL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNjUgQEAKKworCitzZXQoQkxBU19GT1VORCBUUlVFKQorc2V0KExBUEFDS19GT1VORCBUUlVFKQorc2V0KEJMQVNfTElCUkFSSUVTIGVpZ2VuX2JsYXNfc3RhdGljKQorc2V0KExBUEFDS19MSUJSQVJJRVMgZWlnZW5fbGFwYWNrX3N0YXRpYykKKworc2V0KFNQQVJTRV9MSUJTICIiKQorCisjIGZpbmRfbGlicmFyeShQQVJESVNPX0xJQlJBUklFUyBwYXJkaXNvNDEyLUdOVTQ1MC1YODYtNjQpCisjIGlmKFBBUkRJU09fTElCUkFSSUVTKQorIyAgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9QQVJESVNPX1NVUFBPUlQiKQorIyAgIHNldChTUEFSU0VfTElCUyAke1NQQVJTRV9MSUJTfSAke1BBUkRJU09fTElCUkFSSUVTfSkKKyMgZW5kaWYoUEFSRElTT19MSUJSQVJJRVMpCisKK2ZpbmRfcGFja2FnZShDaG9sbW9kKQoraWYoQ0hPTE1PRF9GT1VORCBBTkQgQkxBU19GT1VORCBBTkQgTEFQQUNLX0ZPVU5EKQorICBhZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fQ0hPTE1PRF9TVVBQT1JUIikKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0NIT0xNT0RfSU5DTFVERVN9KQorICBzZXQoU1BBUlNFX0xJQlMgJHtTUEFSU0VfTElCU30gJHtDSE9MTU9EX0xJQlJBUklFU30gJHtCTEFTX0xJQlJBUklFU30gJHtMQVBBQ0tfTElCUkFSSUVTfSkKKyAgc2V0KENIT0xNT0RfQUxMX0xJQlMgICR7Q0hPTE1PRF9MSUJSQVJJRVN9ICR7QkxBU19MSUJSQVJJRVN9ICR7TEFQQUNLX0xJQlJBUklFU30pCitlbmRpZigpCisKK2ZpbmRfcGFja2FnZShVbWZwYWNrKQoraWYoVU1GUEFDS19GT1VORCBBTkQgQkxBU19GT1VORCkKKyAgYWRkX2RlZmluaXRpb25zKCItREVJR0VOX1VNRlBBQ0tfU1VQUE9SVCIpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtVTUZQQUNLX0lOQ0xVREVTfSkKKyAgc2V0KFNQQVJTRV9MSUJTICR7U1BBUlNFX0xJQlN9ICR7VU1GUEFDS19MSUJSQVJJRVN9ICR7QkxBU19MSUJSQVJJRVN9KQorICBzZXQoVU1GUEFDS19BTExfTElCUyAke1VNRlBBQ0tfTElCUkFSSUVTfSAke0JMQVNfTElCUkFSSUVTfSkKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKFN1cGVyTFUpCitpZihTVVBFUkxVX0ZPVU5EIEFORCBCTEFTX0ZPVU5EKQorICBhZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fU1VQRVJMVV9TVVBQT1JUIikKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1NVUEVSTFVfSU5DTFVERVN9KQorICBzZXQoU1BBUlNFX0xJQlMgJHtTUEFSU0VfTElCU30gJHtTVVBFUkxVX0xJQlJBUklFU30gJHtCTEFTX0xJQlJBUklFU30pCisgIHNldChTVVBFUkxVX0FMTF9MSUJTICR7U1VQRVJMVV9MSUJSQVJJRVN9ICR7QkxBU19MSUJSQVJJRVN9KQorZW5kaWYoKQorCisKK2ZpbmRfcGFja2FnZShQYXN0aXgpCitmaW5kX3BhY2thZ2UoU2NvdGNoKQorZmluZF9wYWNrYWdlKE1ldGlzKQoraWYoUEFTVElYX0ZPVU5EIEFORCBCTEFTX0ZPVU5EKQorICBhZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fUEFTVElYX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7UEFTVElYX0lOQ0xVREVTfSkKKyAgaWYoU0NPVENIX0ZPVU5EKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtTQ09UQ0hfSU5DTFVERVN9KQorICAgIHNldChQQVNUSVhfTElCUkFSSUVTICR7UEFTVElYX0xJQlJBUklFU30gJHtTQ09UQ0hfTElCUkFSSUVTfSkKKyAgZWxzZWlmKE1FVElTX0ZPVU5EKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtNRVRJU19JTkNMVURFU30pCisgICAgc2V0KFBBU1RJWF9MSUJSQVJJRVMgJHtQQVNUSVhfTElCUkFSSUVTfSAke01FVElTX0xJQlJBUklFU30pICAKKyAgZW5kaWYoU0NPVENIX0ZPVU5EKQorICBzZXQoU1BBUlNFX0xJQlMgJHtTUEFSU0VfTElCU30gJHtQQVNUSVhfTElCUkFSSUVTfSAke09SREVSSU5HX0xJQlJBUklFU30gJHtCTEFTX0xJQlJBUklFU30pCisgIHNldChQQVNUSVhfQUxMX0xJQlMgJHtQQVNUSVhfTElCUkFSSUVTfSAke0JMQVNfTElCUkFSSUVTfSkKK2VuZGlmKFBBU1RJWF9GT1VORCBBTkQgQkxBU19GT1VORCkKKworZmluZF9saWJyYXJ5KFJUX0xJQlJBUlkgcnQpCitpZihSVF9MSUJSQVJZKQorICBzZXQoU1BBUlNFX0xJQlMgJHtTUEFSU0VfTElCU30gJHtSVF9MSUJSQVJZfSkKK2VuZGlmKFJUX0xJQlJBUlkpCisKK2FkZF9leGVjdXRhYmxlKHNwYmVuY2hzb2x2ZXIgc3BiZW5jaHNvbHZlci5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMgKHNwYmVuY2hzb2x2ZXIgJHtTUEFSU0VfTElCU30pCisKZGlmZiAtLWdpdCBhL2JlbmNoL3NwYmVuY2gvc3BiZW5jaHNvbHZlci5jcHAgYi9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDU0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKyNpbmNsdWRlIDxiZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuaD4KKwordm9pZCBiZW5jaF9wcmludGhlbHAoKQoreworICAgIGNvdXQ8PCAiIFxuYmVuY2hzb2x2ZXIgOiBwZXJmb3JtcyBhIGJlbmNobWFyayBvZiBhbGwgdGhlIHNvbHZlcnMgYXZhaWxhYmxlIGluIEVpZ2VuIFxuXG4iOworICAgIGNvdXQ8PCAiIE1BVFJJWCBGT0xERVIgOiBcbiI7CisgICAgY291dDw8ICIgVGhlIG1hdHJpY2VzIGZvciB0aGUgYmVuY2htYXJrIHNob3VsZCBiZSBjb2xsZWN0ZWQgaW4gYSBmb2xkZXIgc3BlY2lmaWVkIHdpdGggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgRUlHRU5fTUFUUklYRElSIFxuIjsKKyAgICBjb3V0PDwgIiBUaGlzIGZvbGRlciBzaG91bGQgY29udGFpbiB0aGUgc3ViZm9sZGVycyByZWFsLyBhbmQgY29tcGxleC8gOiBcbiI7CisgICAgY291dDw8ICIgVGhlIG1hdHJpY2VzIGFyZSBzdG9yZWQgdXNpbmcgdGhlIG1hdHJpeCBtYXJrZXQgY29vcmRpbmF0ZSBmb3JtYXQgXG4iOworICAgIGNvdXQ8PCAiIFRoZSBtYXRyaXggYW5kIGFzc29jaWF0ZWQgcmlnaHQtaGFuZCBzaWRlIChyaHMpIGZpbGVzIGFyZSBuYW1lZCByZXNwZWN0aXZlbHkgXG4iOworICAgIGNvdXQ8PCAiIGFzIE1hdHJpeE5hbWUubXR4IGFuZCBNYXRyaXhOYW1lX2IubXR4LiBJZiB0aGUgcmhzIGRvZXMgbm90IGV4aXN0LCBhIHJhbmRvbSBvbmUgaXMgZ2VuZXJhdGVkLiBcbiI7CisgICAgY291dDw8ICIgSWYgYSBtYXRyaXggaXMgU1BELCB0aGUgbWF0cml4IHNob3VsZCBiZSBuYW1lZCBhcyBNYXRyaXhOYW1lX1NQRC5tdHggXG4iOworICAgIGNvdXQ8PCAiIElmIGEgdHJ1ZSBzb2x1dGlvbiBleGlzdHMsIGl0IHNob3VsZCBiZSBuYW1lZCBhcyBNYXRyaXhOYW1lX3gubXR4OyBcbiIgICAgIDsKKyAgICBjb3V0PDwgIiBpdCB3aWxsIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbm9ybSBvZiB0aGUgZXJyb3IgcmVsYXRpdmUgdG8gdGhlIGNvbXB1dGVkIHNvbHV0aW9uc1xuXG4iOworICAgIGNvdXQ8PCAiIE9QVElPTlMgOiBcbiI7IAorICAgIGNvdXQ8PCAiIC1oIG9yIC0taGVscCBcbiAgICBwcmludCB0aGlzIGhlbHAgYW5kIHJldHVyblxuXG4iOworICAgIGNvdXQ8PCAiIC1kIG1hdHJpeGRpciBcbiAgICBVc2UgbWF0cml4ZGlyIGFzIHRoZSBtYXRyaXggZm9sZGVyIGluc3RlYWQgb2YgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEVJR0VOX01BVFJJWERJUlxuXG4iOyAKKyAgICBjb3V0PDwgIiAtbyBvdXRwdXRmaWxlLmh0bWwgXG4gICAgT3V0cHV0IHRoZSBzdGF0aXN0aWNzIHRvIGEgaHRtbCBmaWxlIFxuXG4iOworICAgIGNvdXQ8PCAiIC0tZXBzIDxSZWxFcnI+IFNldHMgdGhlIHJlbGF0aXZlIHRvbGVyYW5jZSBmb3IgaXRlcmF0aXZlIHNvbHZlcnMgKGRlZmF1bHQgMWUtMDgpIFxuXG4iOworICAgIGNvdXQ8PCAiIC0tbWF4aXRzIDxNYXhJdHM+IFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgKGRlZmF1bHQgMTAwMCkgXG5cbiI7CisgICAgCit9CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmdzKQoreworICAKKyAgYm9vbCBoZWxwID0gKCBnZXRfb3B0aW9ucyhhcmdjLCBhcmdzLCAiLWgiKSB8fCBnZXRfb3B0aW9ucyhhcmdjLCBhcmdzLCAiLS1oZWxwIikgKTsKKyAgaWYoaGVscCkgeworICAgIGJlbmNoX3ByaW50aGVscCgpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgdGVzdCBtYXRyaWNlcworICBzdHJpbmcgbWF0cml4X2RpcjsKKyAgaWYgKCFnZXRfb3B0aW9ucyhhcmdjLCBhcmdzLCAiLWQiLCAmbWF0cml4X2RpcikpCisgIHsKKyAgICBpZihnZXRlbnYoIkVJR0VOX01BVFJJWERJUiIpID09IE5VTEwpeworICAgICAgc3RkOjpjZXJyIDw8ICJQbGVhc2UsIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXRyaWNlcyB3aXRoIC1kIG1hdF9mb2xkZXIgb3IgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEVJR0VOX01BVFJJWERJUiBcbiI7CisgICAgICBzdGQ6OmNlcnIgPDwgIiBSdW4gd2l0aCAtLWhlbHAgdG8gc2VlIHRoZSBsaXN0IG9mIGFsbCB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgXG4iOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtYXRyaXhfZGlyID0gZ2V0ZW52KCJFSUdFTl9NQVRSSVhESVIiKTsKKyAgfQorICAgICAKKyAgc3RkOjpvZnN0cmVhbSBzdGF0YnVmOworICBzdHJpbmcgc3RhdEZpbGUgOworICAKKyAgLy8gR2V0IHRoZSBmaWxlIHRvIHdyaXRlIHRoZSBzdGF0aXN0aWNzCisgIGJvb2wgc3RhdEZpbGVFeGlzdHMgPSBnZXRfb3B0aW9ucyhhcmdjLCBhcmdzLCAiLW8iLCAmc3RhdEZpbGUpOworICBpZihzdGF0RmlsZUV4aXN0cykKKyAgeworICAgIHN0YXRidWYub3BlbihzdGF0RmlsZS5jX3N0cigpLCBzdGQ6Omlvczo6b3V0KTsKKyAgICBpZihzdGF0YnVmLmdvb2QoKSl7CisgICAgICBzdGF0RmlsZUV4aXN0cyA9IHRydWU7IAorICAgICAgcHJpbnRTdGF0aGVhZGVyKHN0YXRidWYpOworICAgICAgc3RhdGJ1Zi5jbG9zZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgICBzdGQ6OmNlcnIgPDwgIlVuYWJsZSB0byBvcGVuIHRoZSBwcm92aWRlZCBmaWxlIGZvciB3cml0dGluZy4uLiBcbiI7CisgIH0gICAgICAgCisgIAorICAvLyBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYW5kIHRoZSB0b2xlcmFuY2UKKyAgaW50IG1heGl0ZXJzID0gMTAwMDsgCisgIGRvdWJsZSB0b2wgPSAxZS0wODsgCisgIHN0cmluZyBpbnZhbDsgCisgIGlmIChnZXRfb3B0aW9ucyhhcmdjLCBhcmdzLCAiLS1lcHMiLCAmaW52YWwpKQorICAgIHRvbCA9IGF0b2YoaW52YWwuY19zdHIoKSk7IAorICBpZihnZXRfb3B0aW9ucyhhcmdjLCBhcmdzLCAiLS1tYXhpdHMiLCAmaW52YWwpKQorICAgIG1heGl0ZXJzID0gYXRvaShpbnZhbC5jX3N0cigpKTsgCisgIAorICBzdHJpbmcgY3VycmVudF9kaXI7IAorICAvLyBUZXN0IHRoZSBtYXRyaWNlcyBpbiAlRUlHRU5fTUFUUklYRElSL3JlYWwKKyAgY3VycmVudF9kaXIgPSBtYXRyaXhfZGlyICsgIi9yZWFsIjsgCisgIEJyb3dzZV9NYXRyaWNlczxkb3VibGU+KGN1cnJlbnRfZGlyLCBzdGF0RmlsZUV4aXN0cywgc3RhdEZpbGUsbWF4aXRlcnMsIHRvbCk7CisgIAorICAvLyBUZXN0IHRoZSBtYXRyaWNlcyBpbiAlRUlHRU5fTUFUUklYRElSL2NvbXBsZXgKKyAgY3VycmVudF9kaXIgPSBtYXRyaXhfZGlyICsgIi9jb21wbGV4IjsgCisgIEJyb3dzZV9NYXRyaWNlczxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KGN1cnJlbnRfZGlyLCBzdGF0RmlsZUV4aXN0cywgc3RhdEZpbGUsIG1heGl0ZXJzLCB0b2wpOyAKKyAgCisgIGlmKHN0YXRGaWxlRXhpc3RzKQorICB7CisgICAgc3RhdGJ1Zi5vcGVuKHN0YXRGaWxlLmNfc3RyKCksIHN0ZDo6aW9zOjphcHApOyAKKyAgICBzdGF0YnVmIDw8ICI8L1RBQkxFPiBcbiI7CisgICAgY291dCA8PCAiXG4gT3V0cHV0IHdyaXR0ZW4gaW4gIiA8PCBzdGF0RmlsZSA8PCAiIC4uLlxuIjsKKyAgICBzdGF0YnVmLmNsb3NlKCk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworICAgICAgCmRpZmYgLS1naXQgYS9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuaCBiL2JlbmNoL3NwYmVuY2gvc3BiZW5jaHNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWM3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuaApAQCAtMCwwICsxLDUzMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRMOpc2lyw6kgTnVlbnRzYS1XYWthbSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgIkVpZ2VuL1NwYXJzZUNvcmUiCisjaW5jbHVkZSA8YmVuY2gvQmVuY2hUaW1lci5oPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PgorI2luY2x1ZGUgPEVpZ2VuL0phY29iaT4KKyNpbmNsdWRlIDxFaWdlbi9Ib3VzZWhvbGRlcj4KKyNpbmNsdWRlIDxFaWdlbi9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzPgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0l0ZXJhdGl2ZVNvbHZlcnM+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BhcnNlRXh0cmE+CisKKyNpZmRlZiBFSUdFTl9DSE9MTU9EX1NVUFBPUlQKKyNpbmNsdWRlIDxFaWdlbi9DaG9sbW9kU3VwcG9ydD4KKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVU1GUEFDS19TVVBQT1JUCisjaW5jbHVkZSA8RWlnZW4vVW1mUGFja1N1cHBvcnQ+CisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1BBUkRJU09fU1VQUE9SVAorI2luY2x1ZGUgPEVpZ2VuL1BhcmRpc29TdXBwb3J0PgorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9TVVBFUkxVX1NVUFBPUlQKKyNpbmNsdWRlIDxFaWdlbi9TdXBlckxVU3VwcG9ydD4KKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fUEFTVElYX1NVUFBPUlQKKyNpbmNsdWRlIDxFaWdlbi9QYVN0aVhTdXBwb3J0PgorI2VuZGlmCisKKy8vIENPTlNUQU5UUworI2RlZmluZSBFSUdFTl9VTUZQQUNLICAwCisjZGVmaW5lIEVJR0VOX1NVUEVSTFUgIDEKKyNkZWZpbmUgRUlHRU5fUEFTVElYICAyCisjZGVmaW5lIEVJR0VOX1BBUkRJU08gIDMKKyNkZWZpbmUgRUlHRU5fQklDR1NUQUIgIDQKKyNkZWZpbmUgRUlHRU5fQklDR1NUQUJfSUxVVCAgNQorI2RlZmluZSBFSUdFTl9HTVJFUyA2CisjZGVmaW5lIEVJR0VOX0dNUkVTX0lMVVQgNworI2RlZmluZSBFSUdFTl9TSU1QTElDSUFMX0xETFQgIDgKKyNkZWZpbmUgRUlHRU5fQ0hPTE1PRF9MRExUICA5CisjZGVmaW5lIEVJR0VOX1BBU1RJWF9MRExUICAxMAorI2RlZmluZSBFSUdFTl9QQVJESVNPX0xETFQgIDExCisjZGVmaW5lIEVJR0VOX1NJTVBMSUNJQUxfTExUICAxMgorI2RlZmluZSBFSUdFTl9DSE9MTU9EX1NVUEVSTk9EQUxfTExUICAxMworI2RlZmluZSBFSUdFTl9DSE9MTU9EX1NJTVBMSUNJQUxfTExUICAxNAorI2RlZmluZSBFSUdFTl9QQVNUSVhfTExUICAxNQorI2RlZmluZSBFSUdFTl9QQVJESVNPX0xMVCAgMTYKKyNkZWZpbmUgRUlHRU5fQ0cgIDE3CisjZGVmaW5lIEVJR0VOX0NHX1BSRUNPTkQgIDE4CisjZGVmaW5lIEVJR0VOX0FMTF9TT0xWRVJTICAxOQorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOyAKKworc3RydWN0IFN0YXRzeworICBDb21wdXRhdGlvbkluZm8gaW5mbzsKKyAgZG91YmxlIHRvdGFsX3RpbWU7CisgIGRvdWJsZSBjb21wdXRlX3RpbWU7CisgIGRvdWJsZSBzb2x2ZV90aW1lOyAKKyAgZG91YmxlIHJlbF9lcnJvcjsKKyAgaW50IG1lbW9yeV91c2VkOyAKKyAgaW50IGl0ZXJhdGlvbnM7CisgIGludCBpc2F2YWlsOyAKKyAgaW50IGlzSXRlcmF0aXZlOworfTsgCisKKy8vIEdsb2JhbCB2YXJpYWJsZXMgZm9yIGlucHV0IHBhcmFtZXRlcnMKK2ludCBNYXhpbXVtSXRlcnM7IC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMKK2RvdWJsZSBSZWxFcnI7IC8vIFJlbGF0aXZlIGVycm9yIG9mIHRoZSBjb21wdXRlZCBzb2x1dGlvbgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgdHlwZW5hbWUgTnVtVHJhaXRzPFQ+OjpSZWFsIHRlc3RfcHJlY2lzaW9uKCkgeyByZXR1cm4gTnVtVHJhaXRzPFQ+OjpkdW1teV9wcmVjaXNpb24oKTsgfQordGVtcGxhdGU8PiBpbmxpbmUgZmxvYXQgdGVzdF9wcmVjaXNpb248ZmxvYXQ+KCkgeyByZXR1cm4gMWUtM2Y7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit0ZW1wbGF0ZTw+IGlubGluZSBkb3VibGUgdGVzdF9wcmVjaXNpb248ZG91YmxlPigpIHsgcmV0dXJuIDFlLTY7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3RlbXBsYXRlPD4gaW5saW5lIGZsb2F0IHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpIHsgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBkb3VibGUgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpIHsgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKTsgfQorCit2b2lkIHByaW50U3RhdGhlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQpCit7CisgIGludCBMVWNudCA9IDA7IAorICBzdHJpbmcgTFVsaXN0ID0iICIsIExMVGxpc3QgPSAiPFRIID4gTExUIiwgTERMVGxpc3QgPSAiPFRIID4gTERMVCAiOworICAKKyNpZmRlZiBFSUdFTl9VTUZQQUNLX1NVUFBPUlQKKyAgTFVsaXN0ICs9ICI8VEggPiBVTUZQQUNLICI7IExVY250Kys7CisjZW5kaWYKKyNpZmRlZiBFSUdFTl9TVVBFUkxVX1NVUFBPUlQKKyAgTFVsaXN0ICs9ICI8VEggPiBTVVBFUkxVICI7IExVY250Kys7CisjZW5kaWYKKyNpZmRlZiBFSUdFTl9DSE9MTU9EX1NVUFBPUlQKKyAgTExUbGlzdCArPSAiPFRIID4gQ0hPTE1PRCBTUCBMTFQ8VEggPiBDSE9MTU9EIExMVCI7IAorICBMRExUbGlzdCArPSAiPFRIPkNIT0xNT0QgTERMVCI7IAorI2VuZGlmCisjaWZkZWYgRUlHRU5fUEFSRElTT19TVVBQT1JUCisgIExVbGlzdCArPSAiPFRIID4gUEFSRElTTyBMVSI7ICBMVWNudCsrOworICBMTFRsaXN0ICs9ICI8VEggPiBQQVJESVNPIExMVCI7IAorICBMRExUbGlzdCArPSAiPFRIID4gUEFSRElTTyBMRExUIjsKKyNlbmRpZgorI2lmZGVmIEVJR0VOX1BBU1RJWF9TVVBQT1JUCisgIExVbGlzdCArPSAiPFRIID4gUEFTVElYIExVIjsgIExVY250Kys7CisgIExMVGxpc3QgKz0gIjxUSCA+IFBBU1RJWCBMTFQiOyAKKyAgTERMVGxpc3QgKz0gIjxUSCA+IFBBU1RJWCBMRExUIjsKKyNlbmRpZgorICAKKyAgb3V0IDw8ICI8VEFCTEUgYm9yZGVyPVwiMVwiID5cbiAiOworICBvdXQgPDwgIjxUUj48VEg+TWF0cml4IDxUSD4gTiA8VEg+IE5OWiA8VEg+ICI7CisgIGlmIChMVWNudCkgb3V0IDw8IExVbGlzdDsKKyAgb3V0IDw8ICIgPFRIID5CaUNHU1RBQiA8VEggPkJpQ0dTVEFCK0lMVVQiPDwgIjxUSCA+R01SRVMrSUxVVCIgPDxMRExUbGlzdCA8PCBMTFRsaXN0IDw8ICAiPFRIPiBDRyAiPDwgc3RkOjplbmRsOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgU2NhbGFyPgorU3RhdHMgY2FsbF9zb2x2ZXIoU29sdmVyICZzb2x2ZXIsIGNvbnN0IHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgY29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIGIsIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiByZWZYKQoreworICBTdGF0cyBzdGF0OyAKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4geDsgCisgIEJlbmNoVGltZXIgdGltZXI7IAorICB0aW1lci5yZXNldCgpOworICB0aW1lci5zdGFydCgpOworICBzb2x2ZXIuY29tcHV0ZShBKTsgCisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCisgIHsKKyAgICBzdGF0LmluZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICBzdGQ6OmNlcnIgPDwgIlNvbHZlciBmYWlsZWQgLi4uIFxuIjsKKyAgICByZXR1cm4gc3RhdDsKKyAgfQorICB0aW1lci5zdG9wKCk7IAorICBzdGF0LmNvbXB1dGVfdGltZSA9IHRpbWVyLnZhbHVlKCk7CisgIAorICB0aW1lci5yZXNldCgpOworICB0aW1lci5zdGFydCgpOworICB4ID0gc29sdmVyLnNvbHZlKGIpOyAKKyAgaWYgKHNvbHZlci5pbmZvKCkgPT0gTnVtZXJpY2FsSXNzdWUpCisgIHsKKyAgICBzdGF0LmluZm8gPSBOdW1lcmljYWxJc3N1ZTsKKyAgICBzdGQ6OmNlcnIgPDwgIlNvbHZlciBmYWlsZWQgLi4uIFxuIjsKKyAgICByZXR1cm4gc3RhdDsKKyAgfQorICAKKyAgdGltZXIuc3RvcCgpOworICBzdGF0LnNvbHZlX3RpbWUgPSB0aW1lci52YWx1ZSgpOworICBzdGF0LnRvdGFsX3RpbWUgPSBzdGF0LnNvbHZlX3RpbWUgKyBzdGF0LmNvbXB1dGVfdGltZTsKKyAgc3RhdC5tZW1vcnlfdXNlZCA9IDA7IAorICAvLyBWZXJpZnkgdGhlIHJlbGF0aXZlIGVycm9yCisgIGlmKHJlZlguc2l6ZSgpICE9IDApCisgICAgc3RhdC5yZWxfZXJyb3IgPSAocmVmWCAtIHgpLm5vcm0oKS9yZWZYLm5vcm0oKTsKKyAgZWxzZSAKKyAgeworICAgIC8vIENvbXB1dGUgdGhlIHJlbGF0aXZlIHJlc2lkdWFsIG5vcm0KKyAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiB0ZW1wOyAKKyAgICB0ZW1wID0gQSAqIHg7IAorICAgIHN0YXQucmVsX2Vycm9yID0gKGItdGVtcCkubm9ybSgpL2Iubm9ybSgpOworICB9CisgIGlmICggc3RhdC5yZWxfZXJyb3IgPiBSZWxFcnIgKQorICB7CisgICAgc3RhdC5pbmZvID0gTm9Db252ZXJnZW5jZTsgCisgICAgcmV0dXJuIHN0YXQ7CisgIH0KKyAgZWxzZSAKKyAgeworICAgIHN0YXQuaW5mbyA9IFN1Y2Nlc3M7CisgICAgcmV0dXJuIHN0YXQ7IAorICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgU2NhbGFyPgorU3RhdHMgY2FsbF9kaXJlY3Rzb2x2ZXIoU29sdmVyJiBzb2x2ZXIsIGNvbnN0IHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgY29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIGIsIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiByZWZYKQoreworICAgIFN0YXRzIHN0YXQ7CisgICAgc3RhdCA9IGNhbGxfc29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7CisgICAgcmV0dXJuIHN0YXQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgU2NhbGFyPgorU3RhdHMgY2FsbF9pdGVyc29sdmVyKFNvbHZlciAmc29sdmVyLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiBiLCBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgcmVmWCkKK3sKKyAgU3RhdHMgc3RhdDsKKyAgc29sdmVyLnNldFRvbGVyYW5jZShSZWxFcnIpOyAKKyAgc29sdmVyLnNldE1heEl0ZXJhdGlvbnMoTWF4aW11bUl0ZXJzKTsKKyAgCisgIHN0YXQgPSBjYWxsX3NvbHZlcihzb2x2ZXIsIEEsIGIsIHJlZlgpOyAKKyAgc3RhdC5pdGVyYXRpb25zID0gc29sdmVyLml0ZXJhdGlvbnMoKTsKKyAgcmV0dXJuIHN0YXQ7IAorfQorCitpbmxpbmUgdm9pZCBwcmludFN0YXRJdGVtKFN0YXRzICpzdGF0LCBpbnQgc29sdmVyX2lkLCBpbnQmIGJlc3RfdGltZV9pZCwgZG91YmxlJiBiZXN0X3RpbWVfdmFsKQoreworICBzdGF0W3NvbHZlcl9pZF0uaXNhdmFpbCA9IDE7ICAKKyAgCisgIGlmIChzdGF0W3NvbHZlcl9pZF0uaW5mbyA9PSBOdW1lcmljYWxJc3N1ZSkKKyAgeworICAgIGNvdXQgPDwgIiBTT0xWRVIgRkFJTEVEIC4uLiBQcm9iYWJseSBhIG51bWVyaWNhbCBpc3N1ZSBcbiI7CisgICAgcmV0dXJuOworICB9CisgIGlmIChzdGF0W3NvbHZlcl9pZF0uaW5mbyA9PSBOb0NvbnZlcmdlbmNlKXsKKyAgICBjb3V0IDw8ICJSRUwuIEVSUk9SICIgPDwgIHN0YXRbc29sdmVyX2lkXS5yZWxfZXJyb3I7CisgICAgaWYoc3RhdFtzb2x2ZXJfaWRdLmlzSXRlcmF0aXZlID09IDEpCisgICAgICBjb3V0IDw8ICIgKCIgPDwgc3RhdFtzb2x2ZXJfaWRdLml0ZXJhdGlvbnMgPDwgIikgXG4iOyAKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIFJlY29yZCB0aGUgYmVzdCBDUFUgdGltZSAKKyAgaWYgKCFiZXN0X3RpbWVfdmFsKSAKKyAgeworICAgIGJlc3RfdGltZV92YWwgPSBzdGF0W3NvbHZlcl9pZF0udG90YWxfdGltZTsKKyAgICBiZXN0X3RpbWVfaWQgPSBzb2x2ZXJfaWQ7CisgIH0KKyAgZWxzZSBpZiAoc3RhdFtzb2x2ZXJfaWRdLnRvdGFsX3RpbWUgPCBiZXN0X3RpbWVfdmFsKQorICB7CisgICAgYmVzdF90aW1lX3ZhbCA9IHN0YXRbc29sdmVyX2lkXS50b3RhbF90aW1lOworICAgIGJlc3RfdGltZV9pZCA9IHNvbHZlcl9pZDsgCisgIH0KKyAgLy8gUHJpbnQgc3RhdGlzdGljcyB0byBzdGFuZGFyZCBvdXRwdXQKKyAgaWYgKHN0YXRbc29sdmVyX2lkXS5pbmZvID09IFN1Y2Nlc3MpeworICAgIGNvdXQ8PCAiQ09NUFVURSBUSU1FIDogIiA8PCBzdGF0W3NvbHZlcl9pZF0uY29tcHV0ZV90aW1lPDwgIiBcbiI7CisgICAgY291dDw8ICJTT0xWRSBUSU1FIDogIiA8PCBzdGF0W3NvbHZlcl9pZF0uc29sdmVfdGltZTw8ICIgXG4iOworICAgIGNvdXQ8PCAiVE9UQUwgVElNRSA6ICIgPDwgc3RhdFtzb2x2ZXJfaWRdLnRvdGFsX3RpbWU8PCAiIFxuIjsKKyAgICBjb3V0IDw8ICJSRUwuIEVSUk9SIDogIiA8PCBzdGF0W3NvbHZlcl9pZF0ucmVsX2Vycm9yIDsKKyAgICBpZihzdGF0W3NvbHZlcl9pZF0uaXNJdGVyYXRpdmUgPT0gMSkgeworICAgICAgY291dCA8PCAiICgiIDw8IHN0YXRbc29sdmVyX2lkXS5pdGVyYXRpb25zIDw8ICIpICI7CisgICAgfQorICAgIGNvdXQgPDwgc3RkOjplbmRsOworICB9CisgICAgCit9CisKKworLyogUHJpbnQgdGhlIHJlc3VsdHMgZnJvbSBhbGwgc29sdmVycyBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhciBtYXRyaXggCisgKiBUaGUgYmVzdCBDUFUgdGltZSBpcyBwcmludGVkIGluIGJvbGQKKyAqLworaW5saW5lIHZvaWQgcHJpbnRIdG1sU3RhdExpbmUoU3RhdHMgKnN0YXQsIGludCBiZXN0X3RpbWVfaWQsIHN0cmluZyYgc3RhdGxpbmUpCit7CisgIAorICBzdHJpbmcgbWFya3VwOworICBvc3RyaW5nc3RyZWFtIGNvbXB1dGUsc29sdmUsdG90YWwsZXJyb3I7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgRUlHRU5fQUxMX1NPTFZFUlM7IGkrKykgCisgIHsKKyAgICBpZiAoc3RhdFtpXS5pc2F2YWlsID09IDApIGNvbnRpbnVlOworICAgIGlmKGkgPT0gYmVzdF90aW1lX2lkKQorICAgICAgbWFya3VwID0gIjxURCBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6cmVkXCI+IjsKKyAgICBlbHNlCisgICAgICBtYXJrdXAgPSAiPFREPiI7CisgICAgCisgICAgaWYgKHN0YXRbaV0uaW5mbyA9PSBTdWNjZXNzKXsKKyAgICAgIGNvbXB1dGUgPDwgbWFya3VwIDw8IHN0YXRbaV0uY29tcHV0ZV90aW1lOworICAgICAgc29sdmUgPDwgbWFya3VwIDw8IHN0YXRbaV0uc29sdmVfdGltZTsKKyAgICAgIHRvdGFsIDw8IG1hcmt1cCA8PCBzdGF0W2ldLnRvdGFsX3RpbWU7IAorICAgICAgZXJyb3IgPDwgIiA8VEQ+ICIgPDwgc3RhdFtpXS5yZWxfZXJyb3I7CisgICAgICBpZihzdGF0W2ldLmlzSXRlcmF0aXZlID09IDEpIHsKKyAgICAgICAgZXJyb3IgPDwgIiAoIiA8PCBzdGF0W2ldLml0ZXJhdGlvbnMgPDwgIikgIjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjb21wdXRlIDw8ICIgPFREPiAtIiA7CisgICAgICBzb2x2ZSA8PCAiIDxURD4gLSIgOworICAgICAgdG90YWwgPDwgIiA8VEQ+IC0iIDsKKyAgICAgIGlmKHN0YXRbaV0uaW5mbyA9PSBOb0NvbnZlcmdlbmNlKXsKKyAgICAgICAgZXJyb3IgPDwgIiA8VEQ+ICI8PCBzdGF0W2ldLnJlbF9lcnJvciA7CisgICAgICAgIGlmKHN0YXRbaV0uaXNJdGVyYXRpdmUgPT0gMSkKKyAgICAgICAgICBlcnJvciA8PCAiICgiIDw8IHN0YXRbaV0uaXRlcmF0aW9ucyA8PCAiKSAiOyAKKyAgICAgIH0KKyAgICAgIGVsc2UgICAgZXJyb3IgPDwgIiA8VEQ+IC0gIjsKKyAgICB9CisgIH0KKyAgCisgIHN0YXRsaW5lID0gIjxUSD5Db21wdXRlIFRpbWUgIiArIGNvbXB1dGUuc3RyKCkgKyAiXG4iIAorICAgICAgICAgICAgICAgICAgICAgICAgKyAgIjxUUj48VEg+U29sdmUgVGltZSAiICsgc29sdmUuc3RyKCkgKyAiXG4iIAorICAgICAgICAgICAgICAgICAgICAgICAgKyAgIjxUUj48VEg+VG90YWwgVGltZSAiICsgdG90YWwuc3RyKCkgKyAiXG4iIAorICAgICAgICAgICAgICAgICAgICAgICAgKyI8VFI+PFRIPkVycm9yKEl0ZXIpIiArIGVycm9yLnN0cigpICsgIlxuIjsgCisgIAorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgoraW50IFNlbGVjdFNvbHZlcnMoY29uc3QgU3BhcnNlTWF0cml4PFNjYWxhcj4mQSwgdW5zaWduZWQgaW50IHN5bSwgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIGIsIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiByZWZYLCBTdGF0cyAqc3RhdCkKK3sKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvcj4gU3BNYXQ7IAorICAvLyBGaXJzdCwgZGVhbCB3aXRoIE5vbnN5bW1ldHJpYyBhbmQgc3ltbWV0cmljIG1hdHJpY2VzCisgIGludCBiZXN0X3RpbWVfaWQgPSAwOyAKKyAgZG91YmxlIGJlc3RfdGltZV92YWwgPSAwLjA7CisgIC8vVU1GUEFDSworICAjaWZkZWYgRUlHRU5fVU1GUEFDS19TVVBQT1JUCisgIHsKKyAgICBjb3V0IDw8ICJTb2x2aW5nIHdpdGggVU1GUEFDSyBMVSAuLi4gXG4iOyAKKyAgICBVbWZQYWNrTFU8U3BNYXQ+IHNvbHZlcjsgCisgICAgc3RhdFtFSUdFTl9VTUZQQUNLXSA9IGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7IAorICAgIHByaW50U3RhdEl0ZW0oc3RhdCwgRUlHRU5fVU1GUEFDSywgYmVzdF90aW1lX2lkLCBiZXN0X3RpbWVfdmFsKTsgCisgIH0KKyAgI2VuZGlmCisgICAgLy9TdXBlckxVCisgICNpZmRlZiBFSUdFTl9TVVBFUkxVX1NVUFBPUlQKKyAgeworICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFNVUEVSTFUgLi4uIFxuIjsgCisgICAgU3VwZXJMVTxTcE1hdD4gc29sdmVyOworICAgIHN0YXRbRUlHRU5fU1VQRVJMVV0gPSBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEEsIGIsIHJlZlgpOyAKKyAgICBwcmludFN0YXRJdGVtKHN0YXQsIEVJR0VOX1NVUEVSTFUsIGJlc3RfdGltZV9pZCwgYmVzdF90aW1lX3ZhbCk7IAorICB9CisgICNlbmRpZgorICAgIAorICAgLy8gUGFTdGl4IExVCisgICNpZmRlZiBFSUdFTl9QQVNUSVhfU1VQUE9SVAorICB7CisgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggUEFTVElYIExVIC4uLiBcbiI7IAorICAgIFBhc3RpeExVPFNwTWF0PiBzb2x2ZXI7IAorICAgIHN0YXRbRUlHRU5fUEFTVElYXSA9IGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCkgOworICAgIHByaW50U3RhdEl0ZW0oc3RhdCwgRUlHRU5fUEFTVElYLCBiZXN0X3RpbWVfaWQsIGJlc3RfdGltZV92YWwpOyAKKyAgfQorICAjZW5kaWYKKworICAgLy9QQVJESVNPIExVCisgICNpZmRlZiBFSUdFTl9QQVJESVNPX1NVUFBPUlQKKyAgeworICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBUkRJU08gTFUgLi4uIFxuIjsgCisgICAgUGFyZGlzb0xVPFNwTWF0PiAgc29sdmVyOyAKKyAgICBzdGF0W0VJR0VOX1BBUkRJU09dID0gY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBBLCBiLCByZWZYKTsKKyAgICBwcmludFN0YXRJdGVtKHN0YXQsIEVJR0VOX1BBUkRJU08sIGJlc3RfdGltZV9pZCwgYmVzdF90aW1lX3ZhbCk7IAorICB9CisgICNlbmRpZgorCisKKyAgCisgIC8vQmlDR1NUQUIKKyAgeworICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIEJpQ0dTVEFCIC4uLiBcbiI7IAorICAgIEJpQ0dTVEFCPFNwTWF0PiBzb2x2ZXI7IAorICAgIHN0YXRbRUlHRU5fQklDR1NUQUJdID0gY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7CisgICAgc3RhdFtFSUdFTl9CSUNHU1RBQl0uaXNJdGVyYXRpdmUgPSAxOworICAgIHByaW50U3RhdEl0ZW0oc3RhdCwgRUlHRU5fQklDR1NUQUIsIGJlc3RfdGltZV9pZCwgYmVzdF90aW1lX3ZhbCk7IAorICB9CisgIC8vQmlDR1NUQUIrSUxVVAorICB7CisgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQmlDR1NUQUIgYW5kIElMVVQgLi4uIFxuIjsgCisgICAgQmlDR1NUQUI8U3BNYXQsIEluY29tcGxldGVMVVQ8U2NhbGFyPiA+IHNvbHZlcjsgCisgICAgc3RhdFtFSUdFTl9CSUNHU1RBQl9JTFVUXSA9IGNhbGxfaXRlcnNvbHZlcihzb2x2ZXIsIEEsIGIsIHJlZlgpOworICAgIHN0YXRbRUlHRU5fQklDR1NUQUJfSUxVVF0uaXNJdGVyYXRpdmUgPSAxOworICAgIHByaW50U3RhdEl0ZW0oc3RhdCwgRUlHRU5fQklDR1NUQUJfSUxVVCwgYmVzdF90aW1lX2lkLCBiZXN0X3RpbWVfdmFsKTsgCisgIH0KKyAgCisgICAKKyAgLy9HTVJFUworLy8gICB7CisvLyAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggR01SRVMgLi4uIFxuIjsgCisvLyAgICAgR01SRVM8U3BNYXQ+IHNvbHZlcjsgCisvLyAgICAgc3RhdFtFSUdFTl9HTVJFU10gPSBjYWxsX2l0ZXJzb2x2ZXIoc29sdmVyLCBBLCBiLCByZWZYKTsKKy8vICAgICBzdGF0W0VJR0VOX0dNUkVTXS5pc0l0ZXJhdGl2ZSA9IDE7CisvLyAgICAgcHJpbnRTdGF0SXRlbShzdGF0LCBFSUdFTl9HTVJFUywgYmVzdF90aW1lX2lkLCBiZXN0X3RpbWVfdmFsKTsgCisvLyAgIH0KKyAgLy9HTVJFUytJTFVUCisgIHsKKyAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBHTVJFUyBhbmQgSUxVVCAuLi4gXG4iOyAKKyAgICBHTVJFUzxTcE1hdCwgSW5jb21wbGV0ZUxVVDxTY2FsYXI+ID4gc29sdmVyOyAKKyAgICBzdGF0W0VJR0VOX0dNUkVTX0lMVVRdID0gY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7CisgICAgc3RhdFtFSUdFTl9HTVJFU19JTFVUXS5pc0l0ZXJhdGl2ZSA9IDE7CisgICAgcHJpbnRTdGF0SXRlbShzdGF0LCBFSUdFTl9HTVJFU19JTFVULCBiZXN0X3RpbWVfaWQsIGJlc3RfdGltZV92YWwpOyAKKyAgfQorICAKKyAgLy8gSGVybWl0aWFuIGFuZCBub3QgbmVjZXNzYXJpbHkgcG9zaXRpdmUtZGVmaW5pdGVzCisgIGlmIChzeW0gIT0gTm9uU3ltbWV0cmljKQorICB7CisgICAgLy8gSW50ZXJuYWwgQ2hvbGVza3kKKyAgICB7CisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBTaW1wbGljaWFsIExETFQgLi4uIFxuIjsgCisgICAgICBTaW1wbGljaWFsTERMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsKKyAgICAgIHN0YXRbRUlHRU5fU0lNUExJQ0lBTF9MRExUXSA9IGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7IAorICAgICAgcHJpbnRTdGF0SXRlbShzdGF0LCBFSUdFTl9TSU1QTElDSUFMX0xETFQsIGJlc3RfdGltZV9pZCwgYmVzdF90aW1lX3ZhbCk7IAorICAgIH0KKyAgICAKKyAgICAvLyBDSE9MTU9ECisgICAgI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAorICAgIHsKKyAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIENIT0xNT0QgTERMVCAuLi4gXG4iOyAKKyAgICAgIENob2xtb2REZWNvbXBvc2l0aW9uPFNwTWF0LCBMb3dlcj4gc29sdmVyOworICAgICAgc29sdmVyLnNldE1vZGUoQ2hvbG1vZExETHQpOworICAgICAgc3RhdFtFSUdFTl9DSE9MTU9EX0xETFRdID0gIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7CisgICAgICBwcmludFN0YXRJdGVtKHN0YXQsRUlHRU5fQ0hPTE1PRF9MRExULCBiZXN0X3RpbWVfaWQsIGJlc3RfdGltZV92YWwpOyAKKyAgICB9CisgICAgI2VuZGlmCisgICAgCisgICAgLy9QQVNUSVggTExUCisgICAgI2lmZGVmIEVJR0VOX1BBU1RJWF9TVVBQT1JUCisgICAgeworICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggUEFTVElYIExETFQgLi4uIFxuIjsgCisgICAgICBQYXN0aXhMRExUPFNwTWF0LCBMb3dlcj4gc29sdmVyOyAKKyAgICAgIHN0YXRbRUlHRU5fUEFTVElYX0xETFRdID0gY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBBLCBiLCByZWZYKTsKKyAgICAgIHByaW50U3RhdEl0ZW0oc3RhdCxFSUdFTl9QQVNUSVhfTERMVCwgYmVzdF90aW1lX2lkLCBiZXN0X3RpbWVfdmFsKTsgCisgICAgfQorICAgICNlbmRpZgorICAgIAorICAgIC8vUEFSRElTTyBMTFQKKyAgICAjaWZkZWYgRUlHRU5fUEFSRElTT19TVVBQT1JUCisgICAgeworICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggUEFSRElTTyBMRExUIC4uLiBcbiI7IAorICAgICAgUGFyZGlzb0xETFQ8U3BNYXQsIExvd2VyPiBzb2x2ZXI7IAorICAgICAgc3RhdFtFSUdFTl9QQVJESVNPX0xETFRdID0gY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBBLCBiLCByZWZYKTsgCisgICAgICBwcmludFN0YXRJdGVtKHN0YXQsRUlHRU5fUEFSRElTT19MRExULCBiZXN0X3RpbWVfaWQsIGJlc3RfdGltZV92YWwpOyAKKyAgICB9CisgICAgI2VuZGlmCisgIH0KKworICAgLy8gTm93LCBzeW1tZXRyaWMgUE9TSVRJVkUgREVGSU5JVEUgbWF0cmljZXMKKyAgaWYgKHN5bSA9PSBTUEQpCisgIHsKKyAgICAKKyAgICAvL0ludGVybmFsIFNwYXJzZSBDaG9sZXNreQorICAgIHsKKyAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFNJTVBMSUNJQUwgTExUIC4uLiBcbiI7IAorICAgICAgU2ltcGxpY2lhbExMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsgCisgICAgICBzdGF0W0VJR0VOX1NJTVBMSUNJQUxfTExUXSA9IGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7IAorICAgICAgcHJpbnRTdGF0SXRlbShzdGF0LEVJR0VOX1NJTVBMSUNJQUxfTExULCBiZXN0X3RpbWVfaWQsIGJlc3RfdGltZV92YWwpOyAKKyAgICB9CisgICAgCisgICAgLy8gQ0hPTE1PRAorICAgICNpZmRlZiBFSUdFTl9DSE9MTU9EX1NVUFBPUlQKKyAgICB7CisgICAgICAvLyBDaG9sTU9EIFN1cGVyTm9kYWwgTExUCisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBDSE9MTU9EIExMVCAoU3VwZXJub2RhbCkuLi4gXG4iOyAKKyAgICAgIENob2xtb2REZWNvbXBvc2l0aW9uPFNwTWF0LCBMb3dlcj4gc29sdmVyOworICAgICAgc29sdmVyLnNldE1vZGUoQ2hvbG1vZFN1cGVybm9kYWxMTHQpOworICAgICAgc3RhdFtFSUdFTl9DSE9MTU9EX1NVUEVSTk9EQUxfTExUXSA9IGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7CisgICAgICBwcmludFN0YXRJdGVtKHN0YXQsRUlHRU5fQ0hPTE1PRF9TVVBFUk5PREFMX0xMVCwgYmVzdF90aW1lX2lkLCBiZXN0X3RpbWVfdmFsKTsgCisgICAgICAvLyBDaG9sTW9kIFNpbXBsaWNpYWwgTExUCisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBDSE9MTU9EIExMVCAoU2ltcGxpY2lhbCkgLi4uIFxuIjsgCisgICAgICBzb2x2ZXIuc2V0TW9kZShDaG9sbW9kU2ltcGxpY2lhbExMdCk7CisgICAgICBzdGF0W0VJR0VOX0NIT0xNT0RfU0lNUExJQ0lBTF9MTFRdID0gY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBBLCBiLCByZWZYKTsKKyAgICAgIHByaW50U3RhdEl0ZW0oc3RhdCxFSUdFTl9DSE9MTU9EX1NJTVBMSUNJQUxfTExULCBiZXN0X3RpbWVfaWQsIGJlc3RfdGltZV92YWwpOyAKKyAgICB9CisgICAgI2VuZGlmCisgICAgCisgICAgLy9QQVNUSVggTExUCisgICAgI2lmZGVmIEVJR0VOX1BBU1RJWF9TVVBQT1JUCisgICAgeworICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggUEFTVElYIExMVCAuLi4gXG4iOyAKKyAgICAgIFBhc3RpeExMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsgCisgICAgICBzdGF0W0VJR0VOX1BBU1RJWF9MTFRdID0gIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7CisgICAgICBwcmludFN0YXRJdGVtKHN0YXQsRUlHRU5fUEFTVElYX0xMVCwgYmVzdF90aW1lX2lkLCBiZXN0X3RpbWVfdmFsKTsgCisgICAgfQorICAgICNlbmRpZgorICAgIAorICAgIC8vUEFSRElTTyBMTFQKKyAgICAjaWZkZWYgRUlHRU5fUEFSRElTT19TVVBQT1JUCisgICAgeworICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggUEFSRElTTyBMTFQgLi4uIFxuIjsgCisgICAgICBQYXJkaXNvTExUPFNwTWF0LCBMb3dlcj4gc29sdmVyOyAKKyAgICAgIHN0YXRbRUlHRU5fUEFSRElTT19MTFRdID0gY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBBLCBiLCByZWZYKTsKKyAgICAgIHByaW50U3RhdEl0ZW0oc3RhdCxFSUdFTl9QQVJESVNPX0xMVCwgYmVzdF90aW1lX2lkLCBiZXN0X3RpbWVfdmFsKTsgCisgICAgfQorICAgICNlbmRpZgorICAgIAorICAgIC8vIEludGVybmFsIENHCisgICAgeworICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQ0cgLi4uIFxuIjsgCisgICAgICBDb25qdWdhdGVHcmFkaWVudDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsgCisgICAgICBzdGF0W0VJR0VOX0NHXSA9IGNhbGxfaXRlcnNvbHZlcihzb2x2ZXIsIEEsIGIsIHJlZlgpOworICAgICAgc3RhdFtFSUdFTl9DR10uaXNJdGVyYXRpdmUgPSAxOworICAgICAgcHJpbnRTdGF0SXRlbShzdGF0LEVJR0VOX0NHLCBiZXN0X3RpbWVfaWQsIGJlc3RfdGltZV92YWwpOyAKKyAgICB9CisgICAgLy9DRytJZGVudGl0eVByZWNvbmRpdGlvbmVyCisvLyAgICAgeworLy8gICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQ0cgYW5kIElkZW50aXR5UHJlY29uZGl0aW9uZXIgLi4uIFxuIjsgCisvLyAgICAgICBDb25qdWdhdGVHcmFkaWVudDxTcE1hdCwgTG93ZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXI+IHNvbHZlcjsgCisvLyAgICAgICBzdGF0W0VJR0VOX0NHX1BSRUNPTkRdID0gY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgQSwgYiwgcmVmWCk7CisvLyAgICAgICBzdGF0W0VJR0VOX0NHX1BSRUNPTkRdLmlzSXRlcmF0aXZlID0gMTsKKy8vICAgICAgIHByaW50U3RhdEl0ZW0oc3RhdCxFSUdFTl9DR19QUkVDT05ELCBiZXN0X3RpbWVfaWQsIGJlc3RfdGltZV92YWwpOyAKKy8vICAgICB9CisgIH0gLy8gRW5kIFNQRCBtYXRyaWNlcyAKKyAgCisgIHJldHVybiBiZXN0X3RpbWVfaWQ7Cit9CisKKy8qIEJyb3dzZSBhbGwgdGhlIG1hdHJpY2VzIGF2YWlsYWJsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciAKKyAqIGFuZCBzb2x2ZSB0aGUgYXNzb2NpYXRlZCBsaW5lYXIgc3lzdGVtLgorICogVGhlIHJlc3VsdHMgb2YgZWFjaCBzb2x2ZSBhcmUgcHJpbnRlZCBpbiB0aGUgc3RhbmRhcmQgb3V0cHV0CisgKiBhbmQgb3B0aW9uYWxseSBpbiB0aGUgcHJvdmlkZWQgaHRtbCBmaWxlCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIEJyb3dzZV9NYXRyaWNlcyhjb25zdCBzdHJpbmcgZm9sZGVyLCBib29sIHN0YXRGaWxlRXhpc3RzLCBzdGQ6OnN0cmluZyYgc3RhdEZpbGUsIGludCBtYXhpdGVycywgZG91YmxlIHRvbCkKK3sKKyAgTWF4aW11bUl0ZXJzID0gbWF4aXRlcnM7IC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMsIGdsb2JhbCB2YXJpYWJsZSAKKyAgUmVsRXJyID0gdG9sOyAgLy9SZWxhdGl2ZSByZXNpZHVhbCBlcnJvciAgYXMgc3RvcHBpbmcgY3JpdGVyaW9uIGZvciBpdGVyYXRpdmUgc29sdmVycworICBNYXRyaXhNYXJrZXRJdGVyYXRvcjxTY2FsYXI+IGl0KGZvbGRlcik7CisgIFN0YXRzIHN0YXRbRUlHRU5fQUxMX1NPTFZFUlNdOworICBmb3IgKCA7IGl0OyArK2l0KQorICB7ICAgIAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRUlHRU5fQUxMX1NPTFZFUlM7IGkrKykKKyAgICB7CisgICAgICBzdGF0W2ldLmlzYXZhaWwgPSAwOworICAgICAgc3RhdFtpXS5pc0l0ZXJhdGl2ZSA9IDA7CisgICAgfQorICAgIAorICAgIGludCBiZXN0X3RpbWVfaWQ7CisgICAgY291dDw8ICJcblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gXG4iOworICAgIGNvdXQ8PCAiID09PT09PSAgU09MVklORyBXSVRIIE1BVFJJWCAiIDw8IGl0Lm1hdG5hbWUoKSA8PCAiID09PT1cbiI7CisgICAgY291dDw8ICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFxuXG4iOworICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IHJlZlg7CisgICAgaWYoaXQuaGFzcmVmWCgpKSByZWZYID0gaXQucmVmWCgpOworICAgIGJlc3RfdGltZV9pZCA9IFNlbGVjdFNvbHZlcnM8U2NhbGFyPihpdC5tYXRyaXgoKSwgaXQuc3ltKCksIGl0LnJocygpLCByZWZYLCAmc3RhdFswXSk7CisgICAgCisgICAgaWYoc3RhdEZpbGVFeGlzdHMpCisgICAgeworICAgICAgc3RyaW5nIHN0YXRsaW5lOworICAgICAgcHJpbnRIdG1sU3RhdExpbmUoJnN0YXRbMF0sIGJlc3RfdGltZV9pZCwgc3RhdGxpbmUpOyAKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gc3RhdGJ1ZihzdGF0RmlsZS5jX3N0cigpLCBzdGQ6Omlvczo6YXBwKTsKKyAgICAgIHN0YXRidWYgPDwgIjxUUj48VEggcm93c3Bhbj1cIjRcIj4iIDw8IGl0Lm1hdG5hbWUoKSA8PCAiIDxURCByb3dzcGFuPVwiNFwiPiAiCisgICAgICA8PCBpdC5tYXRyaXgoKS5yb3dzKCkgPDwgIiA8VEQgcm93c3Bhbj1cIjRcIj4gIiA8PCBpdC5tYXRyaXgoKS5ub25aZXJvcygpPDwgIiAiPDwgc3RhdGxpbmUgOworICAgICAgc3RhdGJ1Zi5jbG9zZSgpOworICAgIH0KKyAgfSAKK30gCisKK2Jvb2wgZ2V0X29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmdzLCBzdHJpbmcgb3B0aW9uLCBzdHJpbmcqIHZhbHVlPTApCit7CisgIGludCBpZHggPSAxLCBmb3VuZD1mYWxzZTsgCisgIHdoaWxlIChpZHg8YXJnYyAmJiAhZm91bmQpeworICAgIGlmIChvcHRpb24uY29tcGFyZShhcmdzW2lkeF0pID09IDApeworICAgICAgZm91bmQgPSB0cnVlOyAKKyAgICAgIGlmKHZhbHVlKSAqdmFsdWUgPSBhcmdzW2lkeCsxXTsKKyAgICB9CisgICAgaWR4Kz0yOworICB9CisgIHJldHVybiBmb3VuZDsgCit9CmRpZmYgLS1naXQgYS9iZW5jaC9zcG12LmNwcCBiL2JlbmNoL3NwbXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzI2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9iZW5jaC9zcG12LmNwcApAQCAtMCwwICsxLDIzMyBAQAorCisvL2crKy00LjQgLUROT01UTCAgLVdsLC1ycGF0aCAvdXNyL2xvY2FsL2xpYi9vc2tpIC1MIC91c3IvbG9jYWwvbGliL29za2kvIC1sIG9za2kgLWwgb3NraV91dGlsIC1sIG9za2lfdXRpbF9UaWQgIC1ET1NLSSAtSSB+L0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvICBzcG12LmNwcCAgLUkgLi4gLU8yIC1ETkRFQlVHIC1scnQgIC1sbSAtbCBvc2tpX21hdF9DU0NfVGlkICAtbG9za2lsdCAmJiAuL2Eub3V0IHIyMDAwMDAgYzIwMDAwMCBuMTAwIHQxIHAxCisKKyNkZWZpbmUgU0NBTEFSIGRvdWJsZQorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgIkJlbmNoVGltZXIuaCIKKyNpbmNsdWRlICJCZW5jaFNwYXJzZVV0aWwuaCIKKworI2RlZmluZSBTUE1WX0JFTkNIKENPREUpIEJFTkNIKHQsdHJpZXMscmVwZWF0cyxDT0RFKTsKKworLy8gI2lmZGVmIE1LTAorLy8KKy8vICNpbmNsdWRlICJta2xfdHlwZXMuaCIKKy8vICNpbmNsdWRlICJta2xfc3BibGFzLmgiCisvLworLy8gdGVtcGxhdGU8dHlwZW5hbWUgTGhzLHR5cGVuYW1lIFJocyx0eXBlbmFtZSBSZXM+CisvLyB2b2lkIG1rbF9tdWx0aXBseShjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIFJlcyYgcmVzKQorLy8geworLy8gICBjaGFyIG4gPSAnTic7CisvLyAgIGZsb2F0IGFscGhhID0gMTsKKy8vICAgY2hhciBtYXRkZXNjcmFbNl07CisvLyAgIG1hdGRlc2NyYVswXSA9ICdHJzsKKy8vICAgbWF0ZGVzY3JhWzFdID0gMDsKKy8vICAgbWF0ZGVzY3JhWzJdID0gMDsKKy8vICAgbWF0ZGVzY3JhWzNdID0gJ0MnOworLy8gICBta2xfc2NzY21tKCZuLCBsaHMucm93cygpLCByaHMuY29scygpLCBsaHMuY29scygpLCAmYWxwaGEsIG1hdGRlc2NyYSwKKy8vICAgICAgICAgICAgICBsaHMuX3ZhbHVlUHRyKCksIGxocy5faW5uZXJJbmRleFB0cigpLCBsaHMub3V0ZXJJbmRleFB0cigpLAorLy8gICAgICAgICAgICAgIHBudHJlLCBiLCAmbGRiLCAmYmV0YSwgYywgJmxkYyk7CisvLyAvLyAgIG1rbF9zb21hdGNvcHkoJ0MnLCAnVCcsIGxocy5yb3dzKCksIGxocy5jb2xzKCksIDEsCisvLyAvLyAgICAgICAgICAgICAgICAgbGhzLl92YWx1ZVB0cigpLCBsaHMucm93cygpLCBEU1QsIGRzdF9zdHJpZGUpOworLy8gfQorLy8KKy8vICNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgc2l6ZSA9IDEwMDAwOworICBpbnQgcm93cyA9IHNpemU7CisgIGludCBjb2xzID0gc2l6ZTsKKyAgaW50IG5uelBlckNvbCA9IDQwOworICBpbnQgdHJpZXMgPSAyOworICBpbnQgcmVwZWF0cyA9IDI7CisKKyAgYm9vbCBuZWVkX2hlbHAgPSBmYWxzZTsKKyAgZm9yKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgeworICAgIGlmKGFyZ3ZbaV1bMF0gPT0gJ3InKQorICAgIHsKKyAgICAgIHJvd3MgPSBhdG9pKGFyZ3ZbaV0rMSk7CisgICAgfQorICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAnYycpCisgICAgeworICAgICAgY29scyA9IGF0b2koYXJndltpXSsxKTsKKyAgICB9CisgICAgZWxzZSBpZihhcmd2W2ldWzBdID09ICduJykKKyAgICB7CisgICAgICBubnpQZXJDb2wgPSBhdG9pKGFyZ3ZbaV0rMSk7CisgICAgfQorICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAndCcpCisgICAgeworICAgICAgdHJpZXMgPSBhdG9pKGFyZ3ZbaV0rMSk7CisgICAgfQorICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAncCcpCisgICAgeworICAgICAgcmVwZWF0cyA9IGF0b2koYXJndltpXSsxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIG5lZWRfaGVscCA9IHRydWU7CisgICAgfQorICB9CisgIGlmKG5lZWRfaGVscCkKKyAgeworICAgIHN0ZDo6Y291dCA8PCBhcmd2WzBdIDw8ICIgcjxuYiByb3dzPiBjPG5iIGNvbHVtbnM+IG48bm9uIHplcm9zIHBlciBjb2x1bW4+IHQ8bmIgdHJpZXM+IHA8bmIgcmVwZWF0cz5cbiI7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBzdGQ6OmNvdXQgPDwgIlNwTVYgIiA8PCByb3dzIDw8ICIgeCAiIDw8IGNvbHMgPDwgIiB3aXRoICIgPDwgbm56UGVyQ29sIDw8ICIgbm9uIHplcm9zIHBlciBjb2x1bW4uICgiIDw8IHJlcGVhdHMgPDwgIiByZXBlYXRzLCBhbmQgIiA8PCB0cmllcyA8PCAiIHRyaWVzKVxuXG4iOworCisgIEVpZ2VuU3BhcnNlTWF0cml4IHNtKHJvd3MsY29scyk7CisgIERlbnNlVmVjdG9yIGR2KGNvbHMpLCByZXMocm93cyk7CisgIGR2LnNldFJhbmRvbSgpOworCisgIEJlbmNoVGltZXIgdDsKKyAgd2hpbGUgKG5uelBlckNvbD49NCkKKyAgeworICAgIHN0ZDo6Y291dCA8PCAibm56OiAiIDw8IG5uelBlckNvbCA8PCAiXG4iOworICAgIHNtLnNldFplcm8oKTsKKyAgICBmaWxsTWF0cml4MihubnpQZXJDb2wsIHJvd3MsIGNvbHMsIHNtKTsKKworICAgIC8vIGRlbnNlIG1hdHJpY2VzCisgICAgI2lmZGVmIERFTlNFTUFUUklYCisgICAgeworICAgICAgRGVuc2VNYXRyaXggZG0ocm93cyxjb2xzKSwgKHJvd3MsY29scyk7CisgICAgICBlaVRvRGVuc2Uoc20sIGRtKTsKKworICAgICAgU1BNVl9CRU5DSChyZXMgPSBkbSAqIHNtKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRGVuc2UgICAgICAgIiA8PCB0LnZhbHVlKCkvcmVwZWF0cyA8PCAiXHQiOworCisgICAgICBTUE1WX0JFTkNIcmVzID0gZG0udHJhbnNwb3NlKCkgKiBzbSk7CisgICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgZW5kbDsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvLyBlaWdlbiBzcGFyc2UgbWF0cmljZXMKKyAgICB7CisgICAgICBTUE1WX0JFTkNIKHJlcy5ub2FsaWFzKCkgKz0gc20gKiBkdjsgKQorICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiAgICAgICAiIDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCI7CisKKyAgICAgIFNQTVZfQkVOQ0gocmVzLm5vYWxpYXMoKSArPSBzbS50cmFuc3Bvc2UoKSAqIGR2OyApCisgICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBDU3BhcnNlCisgICAgI2lmZGVmIENTUEFSU0UKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIkNTcGFyc2UgXG4iOworICAgICAgY3MgKmNzbTsKKyAgICAgIGVpVG9DU3BhcnNlKHNtLCBjc20pOworCisvLyAgICAgICBCRU5DSCgpOworLy8gICAgICAgdGltZXIuc3RvcCgpOworLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworCisvLyAgICAgICBCRU5DSCggeyBtMyA9IGNzX3NvcnRlZF9tdWx0aXBseTIobTEsIG0yKTsgY3Nfc3BmcmVlKG0zKTsgfSApOworLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgICNpZmRlZiBPU0tJCisgICAgeworICAgICAgb3NraV9tYXRyaXhfdCBvbTsKKyAgICAgIG9za2lfdmVjdmlld190IG92LCBvcmVzOworICAgICAgb3NraV9Jbml0KCk7CisgICAgICBvbSA9IG9za2lfQ3JlYXRlTWF0Q1NDKHNtLl9vdXRlckluZGV4UHRyKCksIHNtLl9pbm5lckluZGV4UHRyKCksIHNtLl92YWx1ZVB0cigpLCByb3dzLCBjb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSRV9JTlBVVE1BVCwgMSwgSU5ERVhfWkVST19CQVNFRCk7CisgICAgICBvdiA9IG9za2lfQ3JlYXRlVmVjVmlldyhkdi5kYXRhKCksIGNvbHMsIFNUUklERV9VTklUKTsKKyAgICAgIG9yZXMgPSBvc2tpX0NyZWF0ZVZlY1ZpZXcocmVzLmRhdGEoKSwgcm93cywgU1RSSURFX1VOSVQpOworCisgICAgICBTUE1WX0JFTkNIKCBvc2tpX01hdE11bHQob20sIE9QX05PUk1BTCwgMSwgb3YsIDAsIG9yZXMpICk7CisgICAgICBzdGQ6OmNvdXQgPDwgIk9TS0kgICAgICAgICIgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlx0IjsKKworICAgICAgU1BNVl9CRU5DSCggb3NraV9NYXRNdWx0KG9tLCBPUF9UUkFOUywgMSwgb3YsIDAsIG9yZXMpICk7CisgICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlxuIjsKKworICAgICAgLy8gdHVuZQorICAgICAgdC5yZXNldCgpOworICAgICAgdC5zdGFydCgpOworICAgICAgb3NraV9TZXRIaW50TWF0TXVsdChvbSwgT1BfTk9STUFMLCAxLjAsIFNZTUJPTElDX1ZFQywgMC4wLCBTWU1CT0xJQ19WRUMsIEFMV0FZU19UVU5FX0FHR1JFU1NJVkVMWSk7CisgICAgICBvc2tpX1R1bmVNYXQob20pOworICAgICAgdC5zdG9wKCk7CisgICAgICBkb3VibGUgdHVuaW5nID0gdC52YWx1ZSgpOworCisgICAgICBTUE1WX0JFTkNIKCBvc2tpX01hdE11bHQob20sIE9QX05PUk1BTCwgMSwgb3YsIDAsIG9yZXMpICk7CisgICAgICBzdGQ6OmNvdXQgPDwgIk9TS0kgdHVuZWQgICIgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlx0IjsKKworICAgICAgU1BNVl9CRU5DSCggb3NraV9NYXRNdWx0KG9tLCBPUF9UUkFOUywgMSwgb3YsIDAsIG9yZXMpICk7CisgICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlx0KCIgPDwgdHVuaW5nIDw8ICAiKVxuIjsKKworCisgICAgICBvc2tpX0Rlc3Ryb3lNYXQob20pOworICAgICAgb3NraV9EZXN0cm95VmVjVmlldyhvdik7CisgICAgICBvc2tpX0Rlc3Ryb3lWZWNWaWV3KG9yZXMpOworICAgICAgb3NraV9DbG9zZSgpOworICAgIH0KKyAgICAjZW5kaWYKKworICAgICNpZm5kZWYgTk9VQkxBUworICAgIHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6bnVtZXJpYzsKKyAgICAgIFVibGFzTWF0cml4IHVtKHJvd3MsY29scyk7CisgICAgICBlaVRvVWJsYXMoc20sIHVtKTsKKworICAgICAgYm9vc3Q6Om51bWVyaWM6OnVibGFzOjp2ZWN0b3I8U2NhbGFyPiB1dihjb2xzKSwgdXJlcyhyb3dzKTsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmdXZbMF0sIGNvbHMpID0gZHY7CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJnVyZXNbMF0sIHJvd3MpID0gcmVzOworCisgICAgICBTUE1WX0JFTkNIKHVibGFzOjpheHB5X3Byb2QodW0sIHV2LCB1cmVzLCB0cnVlKSk7CisgICAgICBzdGQ6OmNvdXQgPDwgInVibGFzICAgICAgICIgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlx0IjsKKworICAgICAgU1BNVl9CRU5DSCh1Ymxhczo6YXhweV9wcm9kKGJvb3N0OjpudW1lcmljOjp1Ymxhczo6dHJhbnModW0pLCB1diwgdXJlcywgdHJ1ZSkpOworICAgICAgc3RkOjpjb3V0IDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgLy8gR01NKysKKyAgICAjaWZuZGVmIE5PR01NCisgICAgeworICAgICAgR21tU3BhcnNlIGdtKHJvd3MsY29scyk7CisgICAgICBlaVRvR21tKHNtLCBnbSk7CisKKyAgICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZ3YoY29scyksIGdyZXMocm93cyk7CisgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJmd2WzBdLCBjb2xzKSA9IGR2OworICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZncmVzWzBdLCByb3dzKSA9IHJlczsKKworICAgICAgU1BNVl9CRU5DSChnbW06Om11bHQoZ20sIGd2LCBncmVzKSk7CisgICAgICBzdGQ6OmNvdXQgPDwgIkdNTSsrICAgICAgICIgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlx0IjsKKworICAgICAgU1BNVl9CRU5DSChnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKGdtKSwgZ3YsIGdyZXMpKTsKKyAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkvcmVwZWF0cyA8PCBlbmRsOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8vIE1UTDQKKyAgICAjaWZuZGVmIE5PTVRMCisgICAgeworICAgICAgTXRsU3BhcnNlIG1tKHJvd3MsY29scyk7CisgICAgICBlaVRvTXRsKHNtLCBtbSk7CisgICAgICBtdGw6OmRlbnNlX3ZlY3RvcjxTY2FsYXI+IG12KGNvbHMsIDEuMCk7CisgICAgICBtdGw6OmRlbnNlX3ZlY3RvcjxTY2FsYXI+IG1yZXMocm93cywgMS4wKTsKKworICAgICAgU1BNVl9CRU5DSChtcmVzID0gbW0gKiBtdik7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1UTDQgICAgICAgICIgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlx0IjsKKworICAgICAgU1BNVl9CRU5DSChtcmVzID0gdHJhbnMobW0pICogbXYpOworICAgICAgc3RkOjpjb3V0IDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8IGVuZGw7CisgICAgfQorICAgICNlbmRpZgorCisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisKKyAgICBpZihubnpQZXJDb2w9PTEpCisgICAgICBicmVhazsKKyAgICBubnpQZXJDb2wgLT0gbm56UGVyQ29sLzI7CisgIH0KKworICByZXR1cm4gMDsKK30KKworCisKZGlmZiAtLWdpdCBhL2JlbmNoL3Zkd19uZXcuY3BwIGIvYmVuY2gvdmR3X25ldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2MDQwNAotLS0gL2Rldi9udWxsCisrKyBiL2JlbmNoL3Zkd19uZXcuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKyNpZm5kZWYgU0NBTEFSCisjZGVmaW5lIFNDQUxBUiBmbG9hdAorI2VuZGlmCisKKyNpZm5kZWYgU0laRQorI2RlZmluZSBTSVpFIDEwMDAwCisjZW5kaWYKKworI2lmbmRlZiBSRVBFQVQKKyNkZWZpbmUgUkVQRUFUIDEwMDAwCisjZW5kaWYKKwordHlwZWRlZiBNYXRyaXg8U0NBTEFSLCBFaWdlbjo6RHluYW1pYywgMT4gVmVjOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitTQ0FMQVIgRV9WRFcoY29uc3QgVmVjICZpbnRlcmFjdGlvbnMxLCBjb25zdCBWZWMgJmludGVyYWN0aW9uczIpCit7CisgIHJldHVybiAoaW50ZXJhY3Rpb25zMi5jd2lzZSgpL2ludGVyYWN0aW9uczEpCisgICAgICAgICAuY3dpc2UoKS5jdWJlKCkKKyAgICAgICAgIC5jd2lzZSgpLnNxdWFyZSgpCisgICAgICAgICAuY3dpc2UoKS5zcXVhcmUoKQorICAgICAgICAgLnN1bSgpOworfQorCitpbnQgbWFpbigpIAoreworICAvLworICAvLyAgICAgICAgICAxICAgMiAgIDMgICA0ICAuLi4gKGludGVyYWN0aW9ucykKKyAgLy8ga2EgICAgICAgLiAgIC4gICAuICAgLiAgLi4uCisgIC8vIHJhYiAgICAgIC4gICAuICAgLiAgIC4gIC4uLgorICAvLyBlbmVyZ3kgICAuICAgLiAgIC4gICAuICAuLi4KKyAgLy8gLi4uICAgICAuLi4gLi4uIC4uLiAuLi4gLi4uCisgIC8vICh2YXJpYWJsZXMKKyAgLy8gICAgZm9yCisgIC8vIGludGVyYWN0aW9uKQorICAvLworICBWZWMgaW50ZXJhY3Rpb25zMShTSVpFKSwgaW50ZXJhY3Rpb25zMihTSVpFKTsgLy8gU0laRSBpcyB0aGUgbnVtYmVyIG9mIHZkdyBpbnRlcmFjdGlvbnMgaW4gb3VyIHN5c3RlbQorICAvLyBTZXR1cENhbGN1bGF0aW9ucygpCisgIFNDQUxBUiByYWIgPSAxLjA7ICAKKyAgaW50ZXJhY3Rpb25zMS5zZXRDb25zdGFudCgyLjQpOworICBpbnRlcmFjdGlvbnMyLnNldENvbnN0YW50KHJhYik7CisgIAorICAvLyBFbmVyZ3koKQorICBTQ0FMQVIgZW5lcmd5ID0gMC4wOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaTxSRVBFQVQ7ICsraSkgeworICAgIGVuZXJneSArPSBFX1ZEVyhpbnRlcmFjdGlvbnMxLCBpbnRlcmFjdGlvbnMyKTsKKyAgICBlbmVyZ3kgKj0gMSArIDFlLTIwICogaTsgLy8gcHJldmVudCBjb21waWxlciBmcm9tIG9wdGltaXppbmcgdGhlIGxvb3AKKyAgfQorICBjb3V0IDw8ICJlbmVyZ3kgPSAiIDw8IGVuZXJneSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvYmxhcy9CYW5kVHJpYW5ndWxhclNvbHZlci5oIGIvYmxhcy9CYW5kVHJpYW5ndWxhclNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMmQ3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL0JhbmRUcmlhbmd1bGFyU29sdmVyLmgKQEAgLTAsMCArMSw5NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0JBTkRfVFJJQU5HVUxBUlNPTFZFUl9ICisjZGVmaW5lIEVJR0VOX0JBTkRfVFJJQU5HVUxBUlNPTFZFUl9ICisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAvKiBcaW50ZXJuYWwKKyAgKiBTb2x2ZSBBeD1iIHdpdGggQSBhIGJhbmQgdHJpYW5ndWxhciBtYXRyaXgKKyAgKiBUT0RPOiBleHRlbmQgaXQgdG8gbWF0cmljZXMgZm9yIHggYWJkIGIgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgdHlwZW5hbWUgTGhzU2NhbGFyLCBib29sIENvbmpMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgaW50IFN0b3JhZ2VPcmRlcj4KK3N0cnVjdCBiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I7CisKKwordGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyPgorc3RydWN0IGJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxJbmRleCxNb2RlLExoc1NjYWxhcixDb25qTGhzLFJoc1NjYWxhcixSb3dNYWpvcj4KK3sKKyAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PExoc1NjYWxhcixEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4gTGhzTWFwOworICB0eXBlZGVmIE1hcDxNYXRyaXg8UmhzU2NhbGFyLER5bmFtaWMsMT4gPiBSaHNNYXA7CisgIGVudW0geyBJc0xvd2VyID0gKE1vZGUmTG93ZXIpID8gMSA6IDAgfTsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIEluZGV4IGssIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLCBSaHNTY2FsYXIqIF9vdGhlcikKKyAgeworICAgIGNvbnN0IExoc01hcCBsaHMoX2xocyxzaXplLGsrMSxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOworICAgIFJoc01hcCBvdGhlcihfb3RoZXIsc2l6ZSwxKTsKKyAgICB0eXBlbmFtZSBpbnRlcm5hbDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmpMaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDx0eXBlbmFtZSBpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxMaHNTY2FsYXI+LExoc01hcD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExoc01hcCY+CisgICAgICAgICAgICAgICAgICAgICAgICA6OnR5cGUgY2pMaHMobGhzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGZvcihpbnQgY29sPTAgOyBjb2w8b3RoZXIuY29scygpIDsgKytjb2wpCisgICAgeworICAgICAgZm9yKGludCBpaT0wOyBpaTxzaXplOyArK2lpKQorICAgICAgeworICAgICAgICBpbnQgaSA9IElzTG93ZXIgPyBpaSA6IHNpemUtaWktMTsKKyAgICAgICAgaW50IGFjdHVhbF9rID0gKHN0ZDo6bWluKShrLGlpKTsKKyAgICAgICAgaW50IGFjdHVhbF9zdGFydCA9IElzTG93ZXIgPyBrLWFjdHVhbF9rIDogMTsKKyAgICAgICAgCisgICAgICAgIGlmKGFjdHVhbF9rPjApCisgICAgICAgICAgb3RoZXIuY29lZmZSZWYoaSxjb2wpIC09IGNqTGhzLnJvdyhpKS5zZWdtZW50KGFjdHVhbF9zdGFydCxhY3R1YWxfaykudHJhbnNwb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3dpc2VQcm9kdWN0KG90aGVyLmNvbChjb2wpLnNlZ21lbnQoSXNMb3dlciA/IGktYWN0dWFsX2sgOiBpKzEsYWN0dWFsX2spKS5zdW0oKTsKKworICAgICAgICBpZigoTW9kZSZVbml0RGlhZyk9PTApCisgICAgICAgICAgb3RoZXIuY29lZmZSZWYoaSxjb2wpIC89IGNqTGhzKGksSXNMb3dlciA/IGsgOiAwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3QgYmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPEluZGV4LE1vZGUsTGhzU2NhbGFyLENvbmpMaHMsUmhzU2NhbGFyLENvbE1ham9yPgoreworICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBMaHNNYXA7CisgIHR5cGVkZWYgTWFwPE1hdHJpeDxSaHNTY2FsYXIsRHluYW1pYywxPiA+IFJoc01hcDsKKyAgZW51bSB7IElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPyAxIDogMCB9OworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgSW5kZXggaywgY29uc3QgTGhzU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsIFJoc1NjYWxhciogX290aGVyKQorICB7CisgICAgY29uc3QgTGhzTWFwIGxocyhfbGhzLGsrMSxzaXplLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7CisgICAgUmhzTWFwIG90aGVyKF9vdGhlcixzaXplLDEpOworICAgIHR5cGVuYW1lIGludGVybmFsOjpjb25kaXRpb25hbDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uakxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3dpc2VVbmFyeU9wPHR5cGVuYW1lIGludGVybmFsOjpzY2FsYXJfY29uanVnYXRlX29wPExoc1NjYWxhcj4sTGhzTWFwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGhzTWFwJj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dHlwZSBjakxocyhsaHMpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZm9yKGludCBjb2w9MCA7IGNvbDxvdGhlci5jb2xzKCkgOyArK2NvbCkKKyAgICB7CisgICAgICBmb3IoaW50IGlpPTA7IGlpPHNpemU7ICsraWkpCisgICAgICB7CisgICAgICAgIGludCBpID0gSXNMb3dlciA/IGlpIDogc2l6ZS1paS0xOworICAgICAgICBpbnQgYWN0dWFsX2sgPSAoc3RkOjptaW4pKGssc2l6ZS1paS0xKTsKKyAgICAgICAgaW50IGFjdHVhbF9zdGFydCA9IElzTG93ZXIgPyAxIDogay1hY3R1YWxfazsKKyAgICAgICAgCisgICAgICAgIGlmKChNb2RlJlVuaXREaWFnKT09MCkKKyAgICAgICAgICBvdGhlci5jb2VmZlJlZihpLGNvbCkgLz0gY2pMaHMoSXNMb3dlciA/IDAgOiBrLCBpKTsKKworICAgICAgICBpZihhY3R1YWxfaz4wKQorICAgICAgICAgIG90aGVyLmNvbChjb2wpLnNlZ21lbnQoSXNMb3dlciA/IGkrMSA6IGktYWN0dWFsX2ssIGFjdHVhbF9rKQorICAgICAgICAgICAgICAtPSBvdGhlci5jb2VmZihpLGNvbCkgKiBjakxocy5jb2woaSkuc2VnbWVudChhY3R1YWxfc3RhcnQsYWN0dWFsX2spOworICAgICAgICAKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKyNlbmRpZiAvLyBFSUdFTl9CQU5EX1RSSUFOR1VMQVJTT0xWRVJfSApkaWZmIC0tZ2l0IGEvYmxhcy9DTWFrZUxpc3RzLnR4dCBiL2JsYXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzZDU4NwotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1NyBAQAorCitwcm9qZWN0KEVpZ2VuQmxhcyBDWFgpCisKK2luY2x1ZGUoIi4uL2NtYWtlL2xhbmd1YWdlX3N1cHBvcnQuY21ha2UiKQorCit3b3JrYXJvdW5kXzkyMjAoRm9ydHJhbiBFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTKQorCitpZihFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTKQorICBlbmFibGVfbGFuZ3VhZ2UoRm9ydHJhbiBPUFRJT05BTCkKK2VuZGlmKCkKKworYWRkX2N1c3RvbV90YXJnZXQoYmxhcykKKworc2V0KEVpZ2VuQmxhc19TUkNTIHNpbmdsZS5jcHAgZG91YmxlLmNwcCBjb21wbGV4X3NpbmdsZS5jcHAgY29tcGxleF9kb3VibGUuY3BwIHhlcmJsYS5jcHApCisKK2lmKEVJR0VOX0ZvcnRyYW5fQ09NUElMRVJfV09SS1MpCisKK3NldChFaWdlbkJsYXNfU1JDUyAke0VpZ2VuQmxhc19TUkNTfQorICAgIGNvbXBsZXhkb3RzLmYKKyAgICBzcm90bS5mIHNyb3RtZy5mIGRyb3RtLmYgZHJvdG1nLmYKKyAgICBsc2FtZS5mICAgY2hwcjIuZiAgZHNwbXYuZiAgICBkdHBzdi5mIHNzYm12LmYgIHNzcHIuZiAgIHN0cG12LmYKKyAgICB6aHByMi5mICBjaGJtdi5mICBjaHByLmYgICBjdHBtdi5mICAgICBkc3ByMi5mICBzc3Btdi5mICAgIHN0cHN2LmYKKyAgICB6aGJtdi5mICB6aHByLmYgICB6dHBtdi5mIGNocG12LmYgICBjdHBzdi5mICAgIGRzYm12LmYgIGRzcHIuZiAgIGR0cG12LmYgICBzc3ByMi5mCisgICAgemhwbXYuZiAgICB6dHBzdi5mCisgICAgZHRibXYuZiBzdGJtdi5mIGN0Ym12LmYgenRibXYuZgorKQorZWxzZSgpCisKK21lc3NhZ2UoV0FSTklORyAiIE5vIGZvcnRyYW4gY29tcGlsZXIgaGFzIGJlZW4gZGV0ZWN0ZWQsIHRoZSBibGFzIGJ1aWxkIHdpbGwgYmUgaW5jb21wbGV0ZS4iKQorCitlbmRpZigpCisKK2FkZF9saWJyYXJ5KGVpZ2VuX2JsYXNfc3RhdGljICR7RWlnZW5CbGFzX1NSQ1N9KQorYWRkX2xpYnJhcnkoZWlnZW5fYmxhcyBTSEFSRUQgJHtFaWdlbkJsYXNfU1JDU30pCisKK2lmKEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoZWlnZW5fYmxhc19zdGF0aWMgJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhlaWdlbl9ibGFzICAgICAgICAke0VJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPfSkKK2VuZGlmKCkKKworYWRkX2RlcGVuZGVuY2llcyhibGFzIGVpZ2VuX2JsYXMgZWlnZW5fYmxhc19zdGF0aWMpCisKK2luc3RhbGwoVEFSR0VUUyBlaWdlbl9ibGFzIGVpZ2VuX2JsYXNfc3RhdGljCisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gYmluCisgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gbGliCisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gbGliKQorCitpZihFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTKQorCitpZihFSUdFTl9MRUFWRV9URVNUX0lOX0FMTF9UQVJHRVQpCisgIGFkZF9zdWJkaXJlY3RvcnkodGVzdGluZykgIyBjYW4ndCBkbyBFWENMVURFX0ZST01fQUxMIGhlcmUsIGJyZWFrcyBDVGVzdAorZWxzZSgpCisgIGFkZF9zdWJkaXJlY3RvcnkodGVzdGluZyBFWENMVURFX0ZST01fQUxMKQorZW5kaWYoKQorCitlbmRpZigpCisKZGlmZiAtLWdpdCBhL2JsYXMvUkVBRE1FLnR4dCBiL2JsYXMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2E4YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIEJMQVMgbGlicmFyeSBidWlsdCBvbiB0b3Agb2YgRWlnZW4uCisKK1RoaXMgaXMgY3VycmVudGx5IGEgd29yayBpbiBwcm9ncmVzcyB3aGljaCBpcyBmYXIgdG8gYmUgcmVhZHkgZm9yIHVzZSwKK2J1dCBmZWVsIGZyZWUgdG8gY29udHJpYnV0ZSB0byBpdCBpZiB5b3Ugd2lzaC4KKworVGhpcyBtb2R1bGUgaXMgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuIEluIG9yZGVyIHRvIGNvbXBpbGUgaXQsIHlvdSBuZWVkIHRvCit0eXBlICdtYWtlIGJsYXMnIGZyb20gd2l0aGluIHlvdXIgYnVpbGQgZGlyLgorCmRpZmYgLS1naXQgYS9ibGFzL2NoYm12LmYgYi9ibGFzL2NoYm12LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxYzMzMAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvY2hibXYuZgpAQCAtMCwwICsxLDMxMCBAQAorICAgICAgU1VCUk9VVElORSBDSEJNVihVUExPLE4sSyxBTFBIQSxBLExEQSxYLElOQ1gsQkVUQSxZLElOQ1kpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYIEFMUEhBLEJFVEEKKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLEssTERBLE4KKyAgICAgIENIQVJBQ1RFUiBVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYIEEoTERBLCopLFgoKiksWSgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIENIQk1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciAgb3BlcmF0aW9uCisqCisqICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwKKyoKKyogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyogIEEgaXMgYW4gbiBieSBuIGhlcm1pdGlhbiBiYW5kIG1hdHJpeCwgd2l0aCBrIHN1cGVyLWRpYWdvbmFscy4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgYmFuZCBtYXRyaXggQSBpcyBiZWluZyBzdXBwbGllZCBhcworKiAgICAgICAgICAgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgVGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHN1cHBsaWVkLgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgc3VwcGxpZWQuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBLICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIEsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3VwZXItZGlhZ29uYWxzIG9mIHRoZQorKiAgICAgICAgICAgbWF0cml4IEEuIEsgbXVzdCBzYXRpc2Z5ICAwIC5sZS4gSy4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQUxQSEEgIC0gQ09NUExFWCAgICAgICAgIC4KKyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQSAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gKCBMREEsIG4gKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkKKyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIKKyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgY29sdW1uIGJ5CisqICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cKKyogICAgICAgICAgICggayArIDEgKSBvZiB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdXBlci1kaWFnb25hbCBzdGFydGluZyBhdAorKiAgICAgICAgICAgcG9zaXRpb24gMiBpbiByb3cgaywgYW5kIHNvIG9uLiBUaGUgdG9wIGxlZnQgayBieSBrIHRyaWFuZ2xlCisqICAgICAgICAgICBvZiB0aGUgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4KKyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgdGhlIHVwcGVyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgYSBoZXJtaXRpYW4gYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwKKyogICAgICAgICAgIGZ1bGwgbWF0cml4IHN0b3JhZ2UgdG8gYmFuZCBzdG9yYWdlOgorKgorKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOCisqICAgICAgICAgICAgICAgICAgICBNID0gSyArIDEgLSBKCisqICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IE1BWCggMSwgSiAtIEsgKSwgSgorKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApCisqICAgICAgICAgICAgICAxMCAgICBDT05USU5VRQorKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUKKyoKKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkKKyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIKKyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgY29sdW1uIGJ5CisqICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cgMSBvZgorKiAgICAgICAgICAgdGhlIGFycmF5LCB0aGUgZmlyc3Qgc3ViLWRpYWdvbmFsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEgaW4KKyogICAgICAgICAgIHJvdyAyLCBhbmQgc28gb24uIFRoZSBib3R0b20gcmlnaHQgayBieSBrIHRyaWFuZ2xlIG9mIHRoZQorKiAgICAgICAgICAgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4KKyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgdGhlIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgYSBoZXJtaXRpYW4gYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwKKyogICAgICAgICAgIGZ1bGwgbWF0cml4IHN0b3JhZ2UgdG8gYmFuZCBzdG9yYWdlOgorKgorKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOCisqICAgICAgICAgICAgICAgICAgICBNID0gMSAtIEoKKyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gSiwgTUlOKCBOLCBKICsgSyApCisqICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkKKyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFCisqICAgICAgICAgICAgICAyMCBDT05USU5VRQorKgorKiAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBpbWFnaW5hcnkgcGFydHMgb2YgdGhlIGRpYWdvbmFsIGVsZW1lbnRzIG5lZWQKKyogICAgICAgICAgIG5vdCBiZSBzZXQgYW5kIGFyZSBhc3N1bWVkIHRvIGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIExEQSAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTERBIHNwZWNpZmllcyB0aGUgZmlyc3QgZGltZW5zaW9uIG9mIEEgYXMgZGVjbGFyZWQKKyogICAgICAgICAgIGluIHRoZSBjYWxsaW5nIChzdWIpIHByb2dyYW0uIExEQSBtdXN0IGJlIGF0IGxlYXN0CisqICAgICAgICAgICAoIGsgKyAxICkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIENPTVBMRVggICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZQorKiAgICAgICAgICAgdmVjdG9yIHguCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIElOQ1ggICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEJFVEEgICAtIENPTVBMRVggICAgICAgICAuCisqICAgICAgICAgICBPbiBlbnRyeSwgQkVUQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBiZXRhLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBZICAgICAgLSBDT01QTEVYICAgICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWSApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBZIG11c3QgY29udGFpbiB0aGUKKyogICAgICAgICAgIHZlY3RvciB5LiBPbiBleGl0LCBZIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSB1cGRhdGVkIHZlY3RvciB5LgorKgorKiAgSU5DWSAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNZIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFkuIElOQ1kgbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRnVydGhlciBEZXRhaWxzCisqICA9PT09PT09PT09PT09PT0KKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCBPTkUKKyAgICAgIFBBUkFNRVRFUiAoT05FPSAoMS4wRSswLDAuMEUrMCkpCisgICAgICBDT01QTEVYIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoWkVSTz0gKDAuMEUrMCwwLjBFKzApKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggVEVNUDEsVEVNUDIKKyAgICAgIElOVEVHRVIgSSxJTkZPLElYLElZLEosSlgsSlksS1BMVVMxLEtYLEtZLEwKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgTFNBTUUKKyAgICAgIEVYVEVSTkFMIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMIFhFUkJMQQorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyBDT05KRyxNQVgsTUlOLFJFQUwKKyogICAgIC4uCisqCisqICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorKgorICAgICAgSU5GTyA9IDAKKyAgICAgIElGICguTk9ULkxTQU1FKFVQTE8sJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKFVQTE8sJ0wnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAxCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gMgorICAgICAgRUxTRSBJRiAoSy5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDMKKyAgICAgIEVMU0UgSUYgKExEQS5MVC4gKEsrMSkpIFRIRU4KKyAgICAgICAgICBJTkZPID0gNgorICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDgKKyAgICAgIEVMU0UgSUYgKElOQ1kuRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSAxMQorICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ0NIQk1WICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKChOLkVRLjApIC5PUi4gKChBTFBIQS5FUS5aRVJPKS5BTkQuIChCRVRBLkVRLk9ORSkpKSBSRVRVUk4KKyoKKyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnRzIGluICBYICBhbmQgIFkuCisqCisgICAgICBJRiAoSU5DWC5HVC4wKSBUSEVOCisgICAgICAgICAgS1ggPSAxCisgICAgICBFTFNFCisgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgRU5EIElGCisgICAgICBJRiAoSU5DWS5HVC4wKSBUSEVOCisgICAgICAgICAgS1kgPSAxCisgICAgICBFTFNFCisgICAgICAgICAgS1kgPSAxIC0gKE4tMSkqSU5DWQorICAgICAgRU5EIElGCisqCisqICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQQorKiAgICAgYXJlIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQS4KKyoKKyogICAgIEZpcnN0IGZvcm0gIHkgOj0gYmV0YSp5LgorKgorICAgICAgSUYgKEJFVEEuTkUuT05FKSBUSEVOCisgICAgICAgICAgSUYgKElOQ1kuRVEuMSkgVEhFTgorICAgICAgICAgICAgICBJRiAoQkVUQS5FUS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJKSA9IFpFUk8KKyAgIDEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gQkVUQSpZKEkpCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIElZID0gS1kKKyAgICAgICAgICAgICAgSUYgKEJFVEEuRVEuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICAzMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBCRVRBKlkoSVkpCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisgICAgICBJRiAoQUxQSEEuRVEuWkVSTykgUkVUVVJOCisgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisqCisqICAgICAgICBGb3JtICB5ICB3aGVuIHVwcGVyIHRyaWFuZ2xlIG9mIEEgaXMgc3RvcmVkLgorKgorICAgICAgICAgIEtQTFVTMSA9IEsgKyAxCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDYwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IE1BWCgxLEotSyksSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWShJKSArIFRFTVAxKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIENPTkpHKEEoTCtJLEopKSpYKEkpCisgICA1MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBURU1QMSpSRUFMKEEoS1BMVVMxLEopKSArIEFMUEhBKlRFTVAyCisgICA2MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgIEpZID0gS1kKKyAgICAgICAgICAgICAgRE8gODAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpYKEpYKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICBJWSA9IEtZCisgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgRE8gNzAgSSA9IE1BWCgxLEotSyksSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IFkoSVkpICsgVEVNUDEqQShMK0ksSikKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgQ09OSkcoQShMK0ksSikpKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgNzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSlkpID0gWShKWSkgKyBURU1QMSpSRUFMKEEoS1BMVVMxLEopKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIElGIChKLkdULkspIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtZID0gS1kgKyBJTkNZCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgIDgwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIHkgIHdoZW4gbG93ZXIgdHJpYW5nbGUgb2YgQSBpcyBzdG9yZWQuCisqCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDEwMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSikKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBURU1QMSpSRUFMKEEoMSxKKSkKKyAgICAgICAgICAgICAgICAgIEwgPSAxIC0gSgorICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IEogKyAxLE1JTihOLEorSykKKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWShJKSArIFRFTVAxKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIENPTkpHKEEoTCtJLEopKSpYKEkpCisgICA5MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBBTFBIQSpURU1QMgorICAxMDAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICBKWSA9IEtZCisgICAgICAgICAgICAgIERPIDEyMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSlgpCisgICAgICAgICAgICAgICAgICBURU1QMiA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIFkoSlkpID0gWShKWSkgKyBURU1QMSpSRUFMKEEoMSxKKSkKKyAgICAgICAgICAgICAgICAgIEwgPSAxIC0gSgorICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgSVkgPSBKWQorICAgICAgICAgICAgICAgICAgRE8gMTEwIEkgPSBKICsgMSxNSU4oTixKK0spCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gWShJWSkgKyBURU1QMSpBKEwrSSxKKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gVEVNUDIgKyBDT05KRyhBKEwrSSxKKSkqWChJWCkKKyAgMTEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBZKEpZKSA9IFkoSlkpICsgQUxQSEEqVEVNUDIKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBKWSA9IEpZICsgSU5DWQorICAxMjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDSEJNViAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvY2hwbXYuZiBiL2JsYXMvY2hwbXYuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThiZTVhCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9jaHBtdi5mCkBAIC0wLDAgKzEsMjcyIEBACisgICAgICBTVUJST1VUSU5FIENIUE1WKFVQTE8sTixBTFBIQSxBUCxYLElOQ1gsQkVUQSxZLElOQ1kpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYIEFMUEhBLEJFVEEKKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLE4KKyAgICAgIENIQVJBQ1RFUiBVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYIEFQKCopLFgoKiksWSgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIENIUE1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb24KKyoKKyogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorKgorKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAorKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwcGVyIG9yIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBBIGlzIHN1cHBsaWVkIGluIHRoZSBwYWNrZWQKKyogICAgICAgICAgIGFycmF5IEFQIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIFRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBpbiBBUC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgVGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQUxQSEEgIC0gQ09NUExFWCAgICAgICAgIC4KKyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQVAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKQorKiAgICAgICAgICAgYW5kIGEoIDIsIDIgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKQorKiAgICAgICAgICAgYW5kIGEoIDMsIDEgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIE5vdGUgdGhhdCB0aGUgaW1hZ2luYXJ5IHBhcnRzIG9mIHRoZSBkaWFnb25hbCBlbGVtZW50cyBuZWVkCisqICAgICAgICAgICBub3QgYmUgc2V0IGFuZCBhcmUgYXNzdW1lZCB0byBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBDT01QTEVYICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeC4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQkVUQSAgIC0gQ09NUExFWCAgICAgICAgIC4KKyogICAgICAgICAgIE9uIGVudHJ5LCBCRVRBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGJldGEuIFdoZW4gQkVUQSBpcworKiAgICAgICAgICAgc3VwcGxpZWQgYXMgemVybyB0aGVuIFkgbmVlZCBub3QgYmUgc2V0IG9uIGlucHV0LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBZICAgICAgLSBDT01QTEVYICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWSApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBZIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeS4gT24gZXhpdCwgWSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgdXBkYXRlZAorKiAgICAgICAgICAgdmVjdG9yIHkuCisqCisqICBJTkNZICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1kgc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWS4gSU5DWSBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYIE9ORQorICAgICAgUEFSQU1FVEVSIChPTkU9ICgxLjBFKzAsMC4wRSswKSkKKyAgICAgIENPTVBMRVggWkVSTworICAgICAgUEFSQU1FVEVSIChaRVJPPSAoMC4wRSswLDAuMEUrMCkpCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCBURU1QMSxURU1QMgorICAgICAgSU5URUdFUiBJLElORk8sSVgsSVksSixKWCxKWSxLLEtLLEtYLEtZCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgQ09OSkcsUkVBTAorKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNgorICAgICAgRUxTRSBJRiAoSU5DWS5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDkKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdDSFBNViAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGICgoTi5FUS4wKSAuT1IuICgoQUxQSEEuRVEuWkVSTykuQU5ELiAoQkVUQS5FUS5PTkUpKSkgUkVUVVJOCisqCisqICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50cyBpbiAgWCAgYW5kICBZLgorKgorICAgICAgSUYgKElOQ1guR1QuMCkgVEhFTgorICAgICAgICAgIEtYID0gMQorICAgICAgRUxTRQorICAgICAgICAgIEtYID0gMSAtIChOLTEpKklOQ1gKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElOQ1kuR1QuMCkgVEhFTgorICAgICAgICAgIEtZID0gMQorICAgICAgRUxTRQorICAgICAgICAgIEtZID0gMSAtIChOLTEpKklOQ1kKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEFQCisqICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4KKyoKKyogICAgIEZpcnN0IGZvcm0gIHkgOj0gYmV0YSp5LgorKgorICAgICAgSUYgKEJFVEEuTkUuT05FKSBUSEVOCisgICAgICAgICAgSUYgKElOQ1kuRVEuMSkgVEhFTgorICAgICAgICAgICAgICBJRiAoQkVUQS5FUS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJKSA9IFpFUk8KKyAgIDEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gQkVUQSpZKEkpCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIElZID0gS1kKKyAgICAgICAgICAgICAgSUYgKEJFVEEuRVEuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICAzMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBCRVRBKlkoSVkpCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisgICAgICBJRiAoQUxQSEEuRVEuWkVSTykgUkVUVVJOCisgICAgICBLSyA9IDEKKyAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyoKKyogICAgICAgIEZvcm0gIHkgIHdoZW4gQVAgY29udGFpbnMgdGhlIHVwcGVyIHRyaWFuZ2xlLgorKgorICAgICAgICAgIElGICgoSU5DWC5FUS4xKSAuQU5ELiAoSU5DWS5FUS4xKSkgVEhFTgorICAgICAgICAgICAgICBETyA2MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSikKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgIFkoSSkgPSBZKEkpICsgVEVNUDEqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgQ09OSkcoQVAoSykpKlgoSSkKKyAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDUwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBZKEopID0gWShKKSArIFRFTVAxKlJFQUwoQVAoS0srSi0xKSkgKyBBTFBIQSpURU1QMgorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIEoKKyAgIDYwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgSlkgPSBLWQorICAgICAgICAgICAgICBETyA4MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSlgpCisgICAgICAgICAgICAgICAgICBURU1QMiA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgIElZID0gS1kKKyAgICAgICAgICAgICAgICAgIERPIDcwIEsgPSBLSyxLSyArIEogLSAyCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBZKElZKSArIFRFTVAxKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIENPTkpHKEFQKEspKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBZKEpZKSA9IFkoSlkpICsgVEVNUDEqUkVBTChBUChLSytKLTEpKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICA4MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRU5EIElGCisgICAgICBFTFNFCisqCisqICAgICAgICBGb3JtICB5ICB3aGVuIEFQIGNvbnRhaW5zIHRoZSBsb3dlciB0cmlhbmdsZS4KKyoKKyAgICAgICAgICBJRiAoKElOQ1guRVEuMSkgLkFORC4gKElOQ1kuRVEuMSkpIFRIRU4KKyAgICAgICAgICAgICAgRE8gMTAwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBZKEopID0gWShKKSArIFRFTVAxKlJFQUwoQVAoS0spKQorICAgICAgICAgICAgICAgICAgSyA9IEtLICsgMQorICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IEogKyAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWShJKSArIFRFTVAxKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIENPTkpHKEFQKEspKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICA5MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBBTFBIQSpURU1QMgorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgMTAwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgSlkgPSBLWQorICAgICAgICAgICAgICBETyAxMjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpYKEpYKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBZKEpZKSA9IFkoSlkpICsgVEVNUDEqUkVBTChBUChLSykpCisgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICBJWSA9IEpZCisgICAgICAgICAgICAgICAgICBETyAxMTAgSyA9IEtLICsgMSxLSyArIE4gLSBKCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gWShJWSkgKyBURU1QMSpBUChLKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gVEVNUDIgKyBDT05KRyhBUChLKSkqWChJWCkKKyAgMTEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBZKEpZKSA9IFkoSlkpICsgQUxQSEEqVEVNUDIKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBKWSA9IEpZICsgSU5DWQorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgMTIwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgQ0hQTVYgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL2NocHIuZiBiL2JsYXMvY2hwci5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmQ1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2NocHIuZgpAQCAtMCwwICsxLDIyMCBAQAorICAgICAgU1VCUk9VVElORSBDSFBSKFVQTE8sTixBTFBIQSxYLElOQ1gsQVApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMIEFMUEhBCisgICAgICBJTlRFR0VSIElOQ1gsTgorICAgICAgQ0hBUkFDVEVSIFVQTE8KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggQVAoKiksWCgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIENIUFIgICAgcGVyZm9ybXMgdGhlIGhlcm1pdGlhbiByYW5rIDEgb3BlcmF0aW9uCisqCisqICAgICBBIDo9IGFscGhhKngqY29uamcoIHgnICkgKyBBLAorKgorKiAgd2hlcmUgYWxwaGEgaXMgYSByZWFsIHNjYWxhciwgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCBBIGlzIGFuCisqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwcGVyIG9yIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBBIGlzIHN1cHBsaWVkIGluIHRoZSBwYWNrZWQKKyogICAgICAgICAgIGFycmF5IEFQIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIFRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBpbiBBUC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgVGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQUxQSEEgIC0gUkVBTCAgICAgICAgICAgIC4KKyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWCAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIElOQ1ggICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFQICAgICAtIENPTVBMRVggICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0CisqICAgICAgICAgICAoICggbiooIG4gKyAxICkgKS8yICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCAgVVBMTyA9ICdVJyBvciAndScsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIGhlcm1pdGlhbiBtYXRyaXgKKyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKQorKiAgICAgICAgICAgY29udGFpbnMgYSggMSwgMSApLCBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMSwgMiApCisqICAgICAgICAgICBhbmQgYSggMiwgMiApIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLiBPbiBleGl0LCB0aGUgYXJyYXkKKyogICAgICAgICAgIEFQIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlCisqICAgICAgICAgICB1cGRhdGVkIG1hdHJpeC4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKQorKiAgICAgICAgICAgYW5kIGEoIDMsIDEgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4gT24gZXhpdCwgdGhlIGFycmF5CisqICAgICAgICAgICBBUCBpcyBvdmVyd3JpdHRlbiBieSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZQorKiAgICAgICAgICAgdXBkYXRlZCBtYXRyaXguCisqICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiB0aGUgZGlhZ29uYWwgZWxlbWVudHMgbmVlZAorKiAgICAgICAgICAgbm90IGJlIHNldCwgdGhleSBhcmUgYXNzdW1lZCB0byBiZSB6ZXJvLCBhbmQgb24gZXhpdCB0aGV5CisqICAgICAgICAgICBhcmUgc2V0IHRvIHplcm8uCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoWkVSTz0gKDAuMEUrMCwwLjBFKzApKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggVEVNUAorICAgICAgSU5URUdFUiBJLElORk8sSVgsSixKWCxLLEtLLEtYCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgQ09OSkcsUkVBTAorKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNQorICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ0NIUFIgICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKChOLkVRLjApIC5PUi4gKEFMUEhBLkVRLlJFQUwoWkVSTykpKSBSRVRVUk4KKyoKKyogICAgIFNldCB0aGUgc3RhcnQgcG9pbnQgaW4gWCBpZiB0aGUgaW5jcmVtZW50IGlzIG5vdCB1bml0eS4KKyoKKyAgICAgIElGIChJTkNYLkxFLjApIFRIRU4KKyAgICAgICAgICBLWCA9IDEgLSAoTi0xKSpJTkNYCisgICAgICBFTFNFIElGIChJTkNYLk5FLjEpIFRIRU4KKyAgICAgICAgICBLWCA9IDEKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEFQCisqICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4KKyoKKyAgICAgIEtLID0gMQorICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgQSAgd2hlbiB1cHBlciB0cmlhbmdsZSBpcyBzdG9yZWQgaW4gQVAuCisqCisgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICBETyAyMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IEFMUEhBKkNPTkpHKFgoSikpCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVAoSykgPSBBUChLKSArIFgoSSkqVEVNUAorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDEwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLK0otMSkgPSBSRUFMKEFQKEtLK0otMSkpICsgUkVBTChYKEopKlRFTVApCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgQVAoS0srSi0xKSA9IFJFQUwoQVAoS0srSi0xKSkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIEoKKyAgIDIwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgRE8gNDAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gQUxQSEEqQ09OSkcoWChKWCkpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEsgPSBLSyxLSyArIEogLSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKElYKSpURU1QCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAzMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBBUChLSytKLTEpID0gUkVBTChBUChLSytKLTEpKSArIFJFQUwoWChKWCkqVEVNUCkKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICBBUChLSytKLTEpID0gUkVBTChBUChLSytKLTEpKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIEoKKyAgIDQwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIEEgIHdoZW4gbG93ZXIgdHJpYW5nbGUgaXMgc3RvcmVkIGluIEFQLgorKgorICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgSUYgKFgoSikuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBBTFBIQSpDT05KRyhYKEopKQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLKSA9IFJFQUwoQVAoS0spKSArIFJFQUwoVEVNUCpYKEopKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSyArIDEKKyAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gSiArIDEsTgorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJKSpURU1QCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgNTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgQVAoS0spID0gUkVBTChBUChLSykpCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBOIC0gSiArIDEKKyAgIDYwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgRE8gODAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gQUxQSEEqQ09OSkcoWChKWCkpCisgICAgICAgICAgICAgICAgICAgICAgQVAoS0spID0gUkVBTChBUChLSykpICsgUkVBTChURU1QKlgoSlgpKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgICAgICBETyA3MCBLID0gS0sgKyAxLEtLICsgTiAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVAoSykgPSBBUChLKSArIFgoSVgpKlRFTVAKKyAgIDcwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLKSA9IFJFQUwoQVAoS0spKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIE4gLSBKICsgMQorICAgODAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDSFBSICAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvY2hwcjIuZiBiL2JsYXMvY2hwcjIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDAyMGVmCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9jaHByMi5mCkBAIC0wLDAgKzEsMjU1IEBACisgICAgICBTVUJST1VUSU5FIENIUFIyKFVQTE8sTixBTFBIQSxYLElOQ1gsWSxJTkNZLEFQKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCBBTFBIQQorICAgICAgSU5URUdFUiBJTkNYLElOQ1ksTgorICAgICAgQ0hBUkFDVEVSIFVQTE8KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggQVAoKiksWCgqKSxZKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgQ0hQUjIgIHBlcmZvcm1zIHRoZSBoZXJtaXRpYW4gcmFuayAyIG9wZXJhdGlvbgorKgorKiAgICAgQSA6PSBhbHBoYSp4KmNvbmpnKCB5JyApICsgY29uamcoIGFscGhhICkqeSpjb25qZyggeCcgKSArIEEsCisqCisqICB3aGVyZSBhbHBoYSBpcyBhIHNjYWxhciwgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4KKyogIG4gYnkgbiBoZXJtaXRpYW4gbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4IEEgaXMgc3VwcGxpZWQgaW4gdGhlIHBhY2tlZAorKiAgICAgICAgICAgYXJyYXkgQVAgYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgVGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgaW4gQVAuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBTFBIQSAgLSBDT01QTEVYICAgICAgICAgLgorKiAgICAgICAgICAgT24gZW50cnksIEFMUEhBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGFscGhhLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBDT01QTEVYICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeC4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWSAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1kgKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWSBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIElOQ1kgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWSBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBZLiBJTkNZIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFQICAgICAtIENPTVBMRVggICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0CisqICAgICAgICAgICAoICggbiooIG4gKyAxICkgKS8yICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCAgVVBMTyA9ICdVJyBvciAndScsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIGhlcm1pdGlhbiBtYXRyaXgKKyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKQorKiAgICAgICAgICAgY29udGFpbnMgYSggMSwgMSApLCBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMSwgMiApCisqICAgICAgICAgICBhbmQgYSggMiwgMiApIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLiBPbiBleGl0LCB0aGUgYXJyYXkKKyogICAgICAgICAgIEFQIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlCisqICAgICAgICAgICB1cGRhdGVkIG1hdHJpeC4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKQorKiAgICAgICAgICAgYW5kIGEoIDMsIDEgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4gT24gZXhpdCwgdGhlIGFycmF5CisqICAgICAgICAgICBBUCBpcyBvdmVyd3JpdHRlbiBieSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZQorKiAgICAgICAgICAgdXBkYXRlZCBtYXRyaXguCisqICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiB0aGUgZGlhZ29uYWwgZWxlbWVudHMgbmVlZAorKiAgICAgICAgICAgbm90IGJlIHNldCwgdGhleSBhcmUgYXNzdW1lZCB0byBiZSB6ZXJvLCBhbmQgb24gZXhpdCB0aGV5CisqICAgICAgICAgICBhcmUgc2V0IHRvIHplcm8uCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoWkVSTz0gKDAuMEUrMCwwLjBFKzApKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggVEVNUDEsVEVNUDIKKyAgICAgIElOVEVHRVIgSSxJTkZPLElYLElZLEosSlgsSlksSyxLSyxLWCxLWQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCBMU0FNRQorICAgICAgRVhURVJOQUwgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgWEVSQkxBCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDIENPTkpHLFJFQUwKKyogICAgIC4uCisqCisqICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorKgorICAgICAgSU5GTyA9IDAKKyAgICAgIElGICguTk9ULkxTQU1FKFVQTE8sJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKFVQTE8sJ0wnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAxCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gMgorICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDUKKyAgICAgIEVMU0UgSUYgKElOQ1kuRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA3CisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkZPLk5FLjApIFRIRU4KKyAgICAgICAgICBDQUxMIFhFUkJMQSgnQ0hQUjIgJyxJTkZPKQorICAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuCisqCisgICAgICBJRiAoKE4uRVEuMCkgLk9SLiAoQUxQSEEuRVEuWkVSTykpIFJFVFVSTgorKgorKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludHMgaW4gWCBhbmQgWSBpZiB0aGUgaW5jcmVtZW50cyBhcmUgbm90IGJvdGgKKyogICAgIHVuaXR5LgorKgorICAgICAgSUYgKChJTkNYLk5FLjEpIC5PUi4gKElOQ1kuTkUuMSkpIFRIRU4KKyAgICAgICAgICBJRiAoSU5DWC5HVC4wKSBUSEVOCisgICAgICAgICAgICAgIEtYID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgICAgIEVORCBJRgorICAgICAgICAgIElGIChJTkNZLkdULjApIFRIRU4KKyAgICAgICAgICAgICAgS1kgPSAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLWSA9IDEgLSAoTi0xKSpJTkNZCisgICAgICAgICAgRU5EIElGCisgICAgICAgICAgSlggPSBLWAorICAgICAgICAgIEpZID0gS1kKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEFQCisqICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4KKyoKKyAgICAgIEtLID0gMQorICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgQSAgd2hlbiB1cHBlciB0cmlhbmdsZSBpcyBzdG9yZWQgaW4gQVAuCisqCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGICgoWChKKS5ORS5aRVJPKSAuT1IuIChZKEopLk5FLlpFUk8pKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpDT05KRyhZKEopKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gQ09OSkcoQUxQSEEqWChKKSkKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJKSpURU1QMSArIFkoSSkqVEVNUDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICAxMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBBUChLSytKLTEpID0gUkVBTChBUChLSytKLTEpKSArCisgICAgICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwoWChKKSpURU1QMStZKEopKlRFTVAyKQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLK0otMSkgPSBSRUFMKEFQKEtLK0otMSkpCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICAyMCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBETyA0MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoKFgoSlgpLk5FLlpFUk8pIC5PUi4gKFkoSlkpLk5FLlpFUk8pKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpDT05KRyhZKEpZKSkKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IENPTkpHKEFMUEhBKlgoSlgpKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IEtZCisgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSyA9IEtLLEtLICsgSiAtIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVAoSykgPSBBUChLKSArIFgoSVgpKlRFTVAxICsgWShJWSkqVEVNUDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDMwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLK0otMSkgPSBSRUFMKEFQKEtLK0otMSkpICsKKyAgICAgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTChYKEpYKSpURU1QMStZKEpZKSpURU1QMikKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICBBUChLSytKLTEpID0gUkVBTChBUChLSytKLTEpKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICA0MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRU5EIElGCisgICAgICBFTFNFCisqCisqICAgICAgICBGb3JtICBBICB3aGVuIGxvd2VyIHRyaWFuZ2xlIGlzIHN0b3JlZCBpbiBBUC4KKyoKKyAgICAgICAgICBJRiAoKElOQ1guRVEuMSkgLkFORC4gKElOQ1kuRVEuMSkpIFRIRU4KKyAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgSUYgKChYKEopLk5FLlpFUk8pIC5PUi4gKFkoSikuTkUuWkVSTykpIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKkNPTkpHKFkoSikpCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBDT05KRyhBTFBIQSpYKEopKQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLKSA9IFJFQUwoQVAoS0spKSArCisgICAgICsgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTChYKEopKlRFTVAxK1koSikqVEVNUDIpCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLICsgMQorICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSBKICsgMSxOCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKEkpKlRFTVAxICsgWShJKSpURU1QMgorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDUwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLKSA9IFJFQUwoQVAoS0spKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgTiAtIEogKyAxCisgICA2MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBETyA4MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoKFgoSlgpLk5FLlpFUk8pIC5PUi4gKFkoSlkpLk5FLlpFUk8pKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpDT05KRyhZKEpZKSkKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IENPTkpHKEFMUEhBKlgoSlgpKQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLKSA9IFJFQUwoQVAoS0spKSArCisgICAgICsgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTChYKEpYKSpURU1QMStZKEpZKSpURU1QMikKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBKWQorICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEsgPSBLSyArIDEsS0sgKyBOIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJWCkqVEVNUDEgKyBZKElZKSpURU1QMgorICAgNzAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgQVAoS0spID0gUkVBTChBUChLSykpCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBKWSA9IEpZICsgSU5DWQorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIE4gLSBKICsgMQorICAgODAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDSFBSMiAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvY29tbW9uLmggYi9ibGFzL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OThjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2NvbW1vbi5oCkBAIC0wLDAgKzEsMTQwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9CTEFTX0NPTU1PTl9ICisjZGVmaW5lIEVJR0VOX0JMQVNfQ09NTU9OX0gKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNvbXBsZXg+CisKKyNpZm5kZWYgU0NBTEFSCisjZXJyb3IgdGhlIHRva2VuIFNDQUxBUiBtdXN0IGJlIGRlZmluZWQgdG8gY29tcGlsZSB0aGlzIGZpbGUKKyNlbmRpZgorCisjaW5jbHVkZSA8RWlnZW4vc3JjL21pc2MvYmxhcy5oPgorCisKKyNkZWZpbmUgTk9UUiAgICAwCisjZGVmaW5lIFRSICAgICAgMQorI2RlZmluZSBBREogICAgIDIKKworI2RlZmluZSBMRUZUICAgIDAKKyNkZWZpbmUgUklHSFQgICAxCisKKyNkZWZpbmUgVVAgICAgICAwCisjZGVmaW5lIExPICAgICAgMQorCisjZGVmaW5lIE5VTklUICAgMAorI2RlZmluZSBVTklUICAgIDEKKworI2RlZmluZSBJTlZBTElEIDB4ZmYKKworI2RlZmluZSBPUChYKSAgICggICAoKFgpPT0nTicgfHwgKFgpPT0nbicpID8gTk9UUiAgIFwKKyAgICAgICAgICAgICAgICAgIDogKChYKT09J1QnIHx8IChYKT09J3QnKSA/IFRSICAgICBcCisgICAgICAgICAgICAgICAgICA6ICgoWCk9PSdDJyB8fCAoWCk9PSdjJykgPyBBREogICAgXAorICAgICAgICAgICAgICAgICAgOiBJTlZBTElEKQorCisjZGVmaW5lIFNJREUoWCkgKCAgICgoWCk9PSdMJyB8fCAoWCk9PSdsJykgPyBMRUZUICAgXAorICAgICAgICAgICAgICAgICAgOiAoKFgpPT0nUicgfHwgKFgpPT0ncicpID8gUklHSFQgIFwKKyAgICAgICAgICAgICAgICAgIDogSU5WQUxJRCkKKworI2RlZmluZSBVUExPKFgpICggICAoKFgpPT0nVScgfHwgKFgpPT0ndScpID8gVVAgICAgIFwKKyAgICAgICAgICAgICAgICAgIDogKChYKT09J0wnIHx8IChYKT09J2wnKSA/IExPICAgICBcCisgICAgICAgICAgICAgICAgICA6IElOVkFMSUQpCisKKyNkZWZpbmUgRElBRyhYKSAoICAgKChYKT09J04nIHx8IChYKT09J04nKSA/IE5VTklUICBcCisgICAgICAgICAgICAgICAgICA6ICgoWCk9PSdVJyB8fCAoWCk9PSd1JykgPyBVTklUICAgXAorICAgICAgICAgICAgICAgICAgOiBJTlZBTElEKQorCisKK2lubGluZSBib29sIGNoZWNrX29wKGNvbnN0IGNoYXIqIG9wKQoreworICByZXR1cm4gT1AoKm9wKSE9MHhmZjsKK30KKworaW5saW5lIGJvb2wgY2hlY2tfc2lkZShjb25zdCBjaGFyKiBzaWRlKQoreworICByZXR1cm4gU0lERSgqc2lkZSkhPTB4ZmY7Cit9CisKK2lubGluZSBib29sIGNoZWNrX3VwbG8oY29uc3QgY2hhciogdXBsbykKK3sKKyAgcmV0dXJuIFVQTE8oKnVwbG8pIT0weGZmOworfQorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9KYWNvYmk+CisKKworbmFtZXNwYWNlIEVpZ2VuIHsKKyNpbmNsdWRlICJCYW5kVHJpYW5ndWxhclNvbHZlci5oIgorfQorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3R5cGVkZWYgU0NBTEFSIFNjYWxhcjsKK3R5cGVkZWYgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKK3R5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXg7CisKK2VudW0KK3sKKyAgSXNDb21wbGV4ID0gRWlnZW46Ok51bVRyYWl0czxTQ0FMQVI+OjpJc0NvbXBsZXgsCisgIENvbmogPSBJc0NvbXBsZXgKK307CisKK3R5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IFBsYWluTWF0cml4VHlwZTsKK3R5cGVkZWYgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IE1hdHJpeFR5cGU7Cit0eXBlZGVmIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4gU3RyaWRlZFZlY3RvclR5cGU7Cit0eXBlZGVmIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPiBDb21wYWN0VmVjdG9yVHlwZTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK01hcDxNYXRyaXg8VCxEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4KK21hdHJpeChUKiBkYXRhLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBzdHJpZGUpCit7CisgIHJldHVybiBNYXA8TWF0cml4PFQsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+KGRhdGEsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPD4oc3RyaWRlKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitNYXA8TWF0cml4PFQsRHluYW1pYywxPiwgMCwgSW5uZXJTdHJpZGU8RHluYW1pYz4gPiB2ZWN0b3IoVCogZGF0YSwgaW50IHNpemUsIGludCBpbmNyKQoreworICByZXR1cm4gTWFwPE1hdHJpeDxULER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4oZGF0YSwgc2l6ZSwgSW5uZXJTdHJpZGU8RHluYW1pYz4oaW5jcikpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorTWFwPE1hdHJpeDxULER5bmFtaWMsMT4gPiB2ZWN0b3IoVCogZGF0YSwgaW50IHNpemUpCit7CisgIHJldHVybiBNYXA8TWF0cml4PFQsRHluYW1pYywxPiA+KGRhdGEsIHNpemUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCogZ2V0X2NvbXBhY3RfdmVjdG9yKFQqIHgsIGludCBuLCBpbnQgaW5jeCkKK3sKKyAgaWYoaW5jeD09MSkKKyAgICByZXR1cm4geDsKKworICBUKiByZXQgPSBuZXcgU2NhbGFyW25dOworICBpZihpbmN4PDApIHZlY3RvcihyZXQsbikgPSB2ZWN0b3IoeCxuLC1pbmN4KS5yZXZlcnNlKCk7CisgIGVsc2UgICAgICAgdmVjdG9yKHJldCxuKSA9IHZlY3Rvcih4LG4sIGluY3gpOworICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCogY29weV9iYWNrKFQqIHhfY3B5LCBUKiB4LCBpbnQgbiwgaW50IGluY3gpCit7CisgIGlmKHhfY3B5PT14KQorICAgIHJldHVybiAwOworCisgIGlmKGluY3g8MCkgdmVjdG9yKHgsbiwtaW5jeCkucmV2ZXJzZSgpID0gdmVjdG9yKHhfY3B5LG4pOworICBlbHNlICAgICAgIHZlY3Rvcih4LG4sIGluY3gpICAgICAgICAgICA9IHZlY3Rvcih4X2NweSxuKTsKKyAgcmV0dXJuIHhfY3B5OworfQorCisjZGVmaW5lIEVJR0VOX0JMQVNfRlVOQyhYKSBFSUdFTl9DQVQoU0NBTEFSX1NVRkZJWCxYIyNfKQorCisjZW5kaWYgLy8gRUlHRU5fQkxBU19DT01NT05fSApkaWZmIC0tZ2l0IGEvYmxhcy9jb21wbGV4X2RvdWJsZS5jcHAgYi9ibGFzL2NvbXBsZXhfZG91YmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhjNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9jb21wbGV4X2RvdWJsZS5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIFNDQUxBUiAgICAgICAgc3RkOjpjb21wbGV4PGRvdWJsZT4KKyNkZWZpbmUgU0NBTEFSX1NVRkZJWCB6CisjZGVmaW5lIFNDQUxBUl9TVUZGSVhfVVAgIloiCisjZGVmaW5lIFJFQUxfU0NBTEFSX1NVRkZJWCBkCisjZGVmaW5lIElTQ09NUExFWCAgICAgMQorCisjaW5jbHVkZSAibGV2ZWwxX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDFfY3BseF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwyX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDJfY3BseF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwzX2ltcGwuaCIKZGlmZiAtLWdpdCBhL2JsYXMvY29tcGxleF9zaW5nbGUuY3BwIGIvYmxhcy9jb21wbGV4X3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4NjUxOQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvY29tcGxleF9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBTQ0FMQVIgICAgICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4KKyNkZWZpbmUgU0NBTEFSX1NVRkZJWCBjCisjZGVmaW5lIFNDQUxBUl9TVUZGSVhfVVAgIkMiCisjZGVmaW5lIFJFQUxfU0NBTEFSX1NVRkZJWCBzCisjZGVmaW5lIElTQ09NUExFWCAgICAgMQorCisjaW5jbHVkZSAibGV2ZWwxX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDFfY3BseF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwyX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDJfY3BseF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwzX2ltcGwuaCIKZGlmZiAtLWdpdCBhL2JsYXMvY29tcGxleGRvdHMuZiBiL2JsYXMvY29tcGxleGRvdHMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2RhNTFkCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9jb21wbGV4ZG90cy5mCkBAIC0wLDAgKzEsNDMgQEAKKyAgICAgIENPTVBMRVggRlVOQ1RJT04gQ0RPVEMoTixDWCxJTkNYLENZLElOQ1kpCisgICAgICBJTlRFR0VSIElOQ1gsSU5DWSxOCisgICAgICBDT01QTEVYIENYKCopLENZKCopCisgICAgICBDT01QTEVYIFJFUworICAgICAgRVhURVJOQUwgQ0RPVENXCisgICAgICAKKyAgICAgIENBTEwgQ0RPVENXKE4sQ1gsSU5DWCxDWSxJTkNZLFJFUykKKyAgICAgIENET1RDID0gUkVTCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgCisgICAgICBDT01QTEVYIEZVTkNUSU9OIENET1RVKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgSU5URUdFUiBJTkNYLElOQ1ksTgorICAgICAgQ09NUExFWCBDWCgqKSxDWSgqKQorICAgICAgQ09NUExFWCBSRVMKKyAgICAgIEVYVEVSTkFMIENET1RVVworICAgICAgCisgICAgICBDQUxMIENET1RVVyhOLENYLElOQ1gsQ1ksSU5DWSxSRVMpCisgICAgICBDRE9UVSA9IFJFUworICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIAorICAgICAgRE9VQkxFIENPTVBMRVggRlVOQ1RJT04gWkRPVEMoTixDWCxJTkNYLENZLElOQ1kpCisgICAgICBJTlRFR0VSIElOQ1gsSU5DWSxOCisgICAgICBET1VCTEUgQ09NUExFWCBDWCgqKSxDWSgqKQorICAgICAgRE9VQkxFIENPTVBMRVggUkVTCisgICAgICBFWFRFUk5BTCBaRE9UQ1cKKyAgICAgIAorICAgICAgQ0FMTCBaRE9UQ1coTixDWCxJTkNYLENZLElOQ1ksUkVTKQorICAgICAgWkRPVEMgPSBSRVMKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICAKKyAgICAgIERPVUJMRSBDT01QTEVYIEZVTkNUSU9OIFpET1RVKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgSU5URUdFUiBJTkNYLElOQ1ksTgorICAgICAgRE9VQkxFIENPTVBMRVggQ1goKiksQ1koKikKKyAgICAgIERPVUJMRSBDT01QTEVYIFJFUworICAgICAgRVhURVJOQUwgWkRPVFVXCisgICAgICAKKyAgICAgIENBTEwgWkRPVFVXKE4sQ1gsSU5DWCxDWSxJTkNZLFJFUykKKyAgICAgIFpET1RVID0gUkVTCisgICAgICBSRVRVUk4KKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy9jdGJtdi5mIGIvYmxhcy9jdGJtdi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODc5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2N0Ym12LmYKQEAgLTAsMCArMSwzNjYgQEAKKyAgICAgIFNVQlJPVVRJTkUgQ1RCTVYoVVBMTyxUUkFOUyxESUFHLE4sSyxBLExEQSxYLElOQ1gpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSIElOQ1gsSyxMREEsTgorICAgICAgQ0hBUkFDVEVSIERJQUcsVFJBTlMsVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCBBKExEQSwqKSxYKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgQ1RCTVYgIHBlcmZvcm1zIG9uZSBvZiB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb25zCisqCisqICAgICB4IDo9IEEqeCwgICBvciAgIHggOj0gQScqeCwgICBvciAgIHggOj0gY29uamcoIEEnICkqeCwKKyoKKyogIHdoZXJlIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yIG5vbi11bml0LAorKiAgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCwgd2l0aCAoIGsgKyAxICkgZGlhZ29uYWxzLgorKgorKiAgQXJndW1lbnRzCisqICA9PT09PT09PT09CisqCisqICBVUExPICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggaXMgYW4gdXBwZXIgb3IKKyogICAgICAgICAgIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIEEgaXMgYW4gdXBwZXIgdHJpYW5ndWxhciBtYXRyaXguCisqCisqICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIEEgaXMgYSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgVFJBTlMgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVFJBTlMgc3BlY2lmaWVzIHRoZSBvcGVyYXRpb24gdG8gYmUgcGVyZm9ybWVkIGFzCisqICAgICAgICAgICBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnTicgb3IgJ24nICAgeCA6PSBBKnguCisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdUJyBvciAndCcgICB4IDo9IEEnKnguCisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdDJyBvciAnYycgICB4IDo9IGNvbmpnKCBBJyApKnguCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIERJQUcgICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIERJQUcgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IEEgaXMgdW5pdAorKiAgICAgICAgICAgdHJpYW5ndWxhciBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgRElBRyA9ICdVJyBvciAndScgICBBIGlzIGFzc3VtZWQgdG8gYmUgdW5pdCB0cmlhbmd1bGFyLgorKgorKiAgICAgICAgICAgICAgRElBRyA9ICdOJyBvciAnbicgICBBIGlzIG5vdCBhc3N1bWVkIHRvIGJlIHVuaXQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYW5ndWxhci4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgTiAgICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEsgICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCBLIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCisqICAgICAgICAgICBzdXBlci1kaWFnb25hbHMgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgT24gZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgorKiAgICAgICAgICAgc3ViLWRpYWdvbmFscyBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBLIG11c3Qgc2F0aXNmeSAgMCAubGUuIEsuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEEgICAgICAtIENPTVBMRVggICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OICggTERBLCBuICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgdGhlIGxlYWRpbmcgKCBrICsgMSApCisqICAgICAgICAgICBieSBuIHBhcnQgb2YgdGhlIGFycmF5IEEgbXVzdCBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyCisqICAgICAgICAgICBiYW5kIHBhcnQgb2YgdGhlIG1hdHJpeCBvZiBjb2VmZmljaWVudHMsIHN1cHBsaWVkIGNvbHVtbiBieQorKiAgICAgICAgICAgY29sdW1uLCB3aXRoIHRoZSBsZWFkaW5nIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggaW4gcm93CisqICAgICAgICAgICAoIGsgKyAxICkgb2YgdGhlIGFycmF5LCB0aGUgZmlyc3Qgc3VwZXItZGlhZ29uYWwgc3RhcnRpbmcgYXQKKyogICAgICAgICAgIHBvc2l0aW9uIDIgaW4gcm93IGssIGFuZCBzbyBvbi4gVGhlIHRvcCBsZWZ0IGsgYnkgayB0cmlhbmdsZQorKiAgICAgICAgICAgb2YgdGhlIGFycmF5IEEgaXMgbm90IHJlZmVyZW5jZWQuCisqICAgICAgICAgICBUaGUgZm9sbG93aW5nIHByb2dyYW0gc2VnbWVudCB3aWxsIHRyYW5zZmVyIGFuIHVwcGVyCisqICAgICAgICAgICB0cmlhbmd1bGFyIGJhbmQgbWF0cml4IGZyb20gY29udmVudGlvbmFsIGZ1bGwgbWF0cml4IHN0b3JhZ2UKKyogICAgICAgICAgIHRvIGJhbmQgc3RvcmFnZToKKyoKKyogICAgICAgICAgICAgICAgIERPIDIwLCBKID0gMSwgTgorKiAgICAgICAgICAgICAgICAgICAgTSA9IEsgKyAxIC0gSgorKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBNQVgoIDEsIEogLSBLICksIEoKKyogICAgICAgICAgICAgICAgICAgICAgIEEoIE0gKyBJLCBKICkgPSBtYXRyaXgoIEksIEogKQorKiAgICAgICAgICAgICAgMTAgICAgQ09OVElOVUUKKyogICAgICAgICAgICAgIDIwIENPTlRJTlVFCisqCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgdGhlIGxlYWRpbmcgKCBrICsgMSApCisqICAgICAgICAgICBieSBuIHBhcnQgb2YgdGhlIGFycmF5IEEgbXVzdCBjb250YWluIHRoZSBsb3dlciB0cmlhbmd1bGFyCisqICAgICAgICAgICBiYW5kIHBhcnQgb2YgdGhlIG1hdHJpeCBvZiBjb2VmZmljaWVudHMsIHN1cHBsaWVkIGNvbHVtbiBieQorKiAgICAgICAgICAgY29sdW1uLCB3aXRoIHRoZSBsZWFkaW5nIGRpYWdvbmFsIG9mIHRoZSBtYXRyaXggaW4gcm93IDEgb2YKKyogICAgICAgICAgIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1Yi1kaWFnb25hbCBzdGFydGluZyBhdCBwb3NpdGlvbiAxIGluCisqICAgICAgICAgICByb3cgMiwgYW5kIHNvIG9uLiBUaGUgYm90dG9tIHJpZ2h0IGsgYnkgayB0cmlhbmdsZSBvZiB0aGUKKyogICAgICAgICAgIGFycmF5IEEgaXMgbm90IHJlZmVyZW5jZWQuCisqICAgICAgICAgICBUaGUgZm9sbG93aW5nIHByb2dyYW0gc2VnbWVudCB3aWxsIHRyYW5zZmVyIGEgbG93ZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwgZnVsbCBtYXRyaXggc3RvcmFnZQorKiAgICAgICAgICAgdG8gYmFuZCBzdG9yYWdlOgorKgorKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOCisqICAgICAgICAgICAgICAgICAgICBNID0gMSAtIEoKKyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gSiwgTUlOKCBOLCBKICsgSyApCisqICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkKKyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFCisqICAgICAgICAgICAgICAyMCBDT05USU5VRQorKgorKiAgICAgICAgICAgTm90ZSB0aGF0IHdoZW4gRElBRyA9ICdVJyBvciAndScgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBBCisqICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaWFnb25hbCBlbGVtZW50cyBvZiB0aGUgbWF0cml4IGFyZSBub3QKKyogICAgICAgICAgIHJlZmVyZW5jZWQsIGJ1dCBhcmUgYXNzdW1lZCB0byBiZSB1bml0eS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgTERBICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBMREEgc3BlY2lmaWVzIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgQSBhcyBkZWNsYXJlZAorKiAgICAgICAgICAgaW4gdGhlIGNhbGxpbmcgKHN1YikgcHJvZ3JhbS4gTERBIG11c3QgYmUgYXQgbGVhc3QKKyogICAgICAgICAgICggayArIDEgKS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWCAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguIE9uIGV4aXQsIFggaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUKKyogICAgICAgICAgIHRyYW5mb3JtZWQgdmVjdG9yIHguCisqCisqICBJTkNYICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoWkVSTz0gKDAuMEUrMCwwLjBFKzApKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggVEVNUAorICAgICAgSU5URUdFUiBJLElORk8sSVgsSixKWCxLUExVUzEsS1gsTAorICAgICAgTE9HSUNBTCBOT0NPTkosTk9VTklUCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgQ09OSkcsTUFYLE1JTgorKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKC5OT1QuTFNBTUUoVFJBTlMsJ04nKSAuQU5ELiAuTk9ULkxTQU1FKFRSQU5TLCdUJykgLkFORC4KKyAgICAgKyAgICAgICAgIC5OT1QuTFNBTUUoVFJBTlMsJ0MnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGICguTk9ULkxTQU1FKERJQUcsJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKERJQUcsJ04nKSkgVEhFTgorICAgICAgICAgIElORk8gPSAzCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNAorICAgICAgRUxTRSBJRiAoSy5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDUKKyAgICAgIEVMU0UgSUYgKExEQS5MVC4gKEsrMSkpIFRIRU4KKyAgICAgICAgICBJTkZPID0gNworICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDkKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdDVEJNViAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGIChOLkVRLjApIFJFVFVSTgorKgorICAgICAgTk9DT05KID0gTFNBTUUoVFJBTlMsJ1QnKQorICAgICAgTk9VTklUID0gTFNBTUUoRElBRywnTicpCisqCisqICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50IGluIFggaWYgdGhlIGluY3JlbWVudCBpcyBub3QgdW5pdHkuIFRoaXMKKyogICAgIHdpbGwgYmUgICggTiAtIDEgKSpJTkNYICAgdG9vIHNtYWxsIGZvciBkZXNjZW5kaW5nIGxvb3BzLgorKgorICAgICAgSUYgKElOQ1guTEUuMCkgVEhFTgorICAgICAgICAgIEtYID0gMSAtIChOLTEpKklOQ1gKKyAgICAgIEVMU0UgSUYgKElOQ1guTkUuMSkgVEhFTgorICAgICAgICAgIEtYID0gMQorICAgICAgRU5EIElGCisqCisqICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiBBIGFyZQorKiAgICAgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBLgorKgorICAgICAgSUYgKExTQU1FKFRSQU5TLCdOJykpIFRIRU4KKyoKKyogICAgICAgICBGb3JtICB4IDo9IEEqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtQTFVTMSA9IEsgKyAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEwgPSBLUExVUzEgLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSBNQVgoMSxKLUspLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKEkpID0gWChJKSArIFRFTVAqQShMK0ksSikKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikqQShLUExVUzEsSikKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDQwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gTUFYKDEsSi1LKSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJWCkgPSBYKElYKSArIFRFTVAqQShMK0ksSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAzMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSlgpID0gWChKWCkqQShLUExVUzEsSikKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElGIChKLkdULkspIEtYID0gS1ggKyBJTkNYCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDYwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEwgPSAxIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gTUlOKE4sSitLKSxKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJKSA9IFgoSSkgKyBURU1QKkEoTCtJLEopCisgICA1MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSikgPSBYKEopKkEoMSxKKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgS1ggPSBLWCArIChOLTEpKklOQ1gKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDgwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgICAgICBMID0gMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSSA9IE1JTihOLEorSyksSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgKyBURU1QKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAgNzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpKkEoMSxKKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgSUYgKChOLUopLkdFLkspIEtYID0gS1ggLSBJTkNYCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIHggOj0gQScqeCAgb3IgIHggOj0gY29uamcoIEEnICkqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtQTFVTMSA9IEsgKyAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDExMCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQShLUExVUzEsSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IEogLSAxLE1BWCgxLEotSyksLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgQShMK0ksSikqWChJKQorICAgOTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQ09OSkcoQShLUExVUzEsSikpCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwMCBJID0gSiAtIDEsTUFYKDEsSi1LKSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBDT05KRyhBKEwrSSxKKSkqWChJKQorICAxMDAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIFgoSikgPSBURU1QCisgIDExMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMTQwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBLWCA9IEtYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQShLUExVUzEsSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTIwIEkgPSBKIC0gMSxNQVgoMSxKLUspLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEEoTCtJLEopKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAxMjAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQ09OSkcoQShLUExVUzEsSikpCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEzMCBJID0gSiAtIDEsTUFYKDEsSi1LKSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBDT05KRyhBKEwrSSxKKSkqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgIDEzMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgWChKWCkgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCAtIElOQ1gKKyAgMTQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMTcwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgIEwgPSAxIC0gSgorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQSgxLEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE1MCBJID0gSiArIDEsTUlOKE4sSitLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBBKEwrSSxKKSpYKEkpCisgIDE1MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpDT05KRyhBKDEsSikpCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE2MCBJID0gSiArIDEsTUlOKE4sSitLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBDT05KRyhBKEwrSSxKKSkqWChJKQorICAxNjAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIFgoSikgPSBURU1QCisgIDE3MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyAyMDAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgIEtYID0gS1ggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgIEwgPSAxIC0gSgorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQSgxLEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE4MCBJID0gSiArIDEsTUlOKE4sSitLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBBKEwrSSxKKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgMTgwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkNPTkpHKEEoMSxKKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTkwIEkgPSBKICsgMSxNSU4oTixKK0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIENPTkpHKEEoTCtJLEopKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgMTkwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAyMDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIENUQk1WIC4KKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy9jdHBtdi5mIGIvYmxhcy9jdHBtdi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Mzc0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2N0cG12LmYKQEAgLTAsMCArMSwzMjkgQEAKKyAgICAgIFNVQlJPVVRJTkUgQ1RQTVYoVVBMTyxUUkFOUyxESUFHLE4sQVAsWCxJTkNYKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiBJTkNYLE4KKyAgICAgIENIQVJBQ1RFUiBESUFHLFRSQU5TLFVQTE8KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggQVAoKiksWCgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIENUUE1WICBwZXJmb3JtcyBvbmUgb2YgdGhlIG1hdHJpeC12ZWN0b3Igb3BlcmF0aW9ucworKgorKiAgICAgeCA6PSBBKngsICAgb3IgICB4IDo9IEEnKngsICAgb3IgICB4IDo9IGNvbmpnKCBBJyApKngsCisqCisqICB3aGVyZSB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kICBBIGlzIGFuIG4gYnkgbiB1bml0LCBvciBub24tdW5pdCwKKyogIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgbWF0cml4IGlzIGFuIHVwcGVyIG9yCisqICAgICAgICAgICBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBBIGlzIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBBIGlzIGEgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXguCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFRSQU5TICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFRSQU5TIHNwZWNpZmllcyB0aGUgb3BlcmF0aW9uIHRvIGJlIHBlcmZvcm1lZCBhcworKiAgICAgICAgICAgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ04nIG9yICduJyAgIHggOj0gQSp4LgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnVCcgb3IgJ3QnICAgeCA6PSBBJyp4LgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnQycgb3IgJ2MnICAgeCA6PSBjb25qZyggQScgKSp4LgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBESUFHICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBESUFHIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBBIGlzIHVuaXQKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIERJQUcgPSAnVScgb3IgJ3UnICAgQSBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgdHJpYW5ndWxhci4KKyoKKyogICAgICAgICAgICAgIERJQUcgPSAnTicgb3IgJ24nICAgQSBpcyBub3QgYXNzdW1lZCB0byBiZSB1bml0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ3VsYXIuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBUCAgICAgLSBDT01QTEVYICAgICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAoIG4qKCBuICsgMSApICkvMiApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXggcGFja2VkIHNlcXVlbnRpYWxseSwKKyogICAgICAgICAgIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSBjb250YWlucyBhKCAxLCAxICksCisqICAgICAgICAgICBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMSwgMiApIGFuZCBhKCAyLCAyICkKKyogICAgICAgICAgIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBwYWNrZWQgc2VxdWVudGlhbGx5LAorKiAgICAgICAgICAgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApIGNvbnRhaW5zIGEoIDEsIDEgKSwKKyogICAgICAgICAgIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAyLCAxICkgYW5kIGEoIDMsIDEgKQorKiAgICAgICAgICAgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uCisqICAgICAgICAgICBOb3RlIHRoYXQgd2hlbiAgRElBRyA9ICdVJyBvciAndScsIHRoZSBkaWFnb25hbCBlbGVtZW50cyBvZgorKiAgICAgICAgICAgQSBhcmUgbm90IHJlZmVyZW5jZWQsIGJ1dCBhcmUgYXNzdW1lZCB0byBiZSB1bml0eS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWCAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguIE9uIGV4aXQsIFggaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUKKyogICAgICAgICAgIHRyYW5mb3JtZWQgdmVjdG9yIHguCisqCisqICBJTkNYICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoWkVSTz0gKDAuMEUrMCwwLjBFKzApKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggVEVNUAorICAgICAgSU5URUdFUiBJLElORk8sSVgsSixKWCxLLEtLLEtYCisgICAgICBMT0dJQ0FMIE5PQ09OSixOT1VOSVQKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgTFNBTUUKKyAgICAgIEVYVEVSTkFMIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMIFhFUkJMQQorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyBDT05KRworKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKC5OT1QuTFNBTUUoVFJBTlMsJ04nKSAuQU5ELiAuTk9ULkxTQU1FKFRSQU5TLCdUJykgLkFORC4KKyAgICAgKyAgICAgICAgIC5OT1QuTFNBTUUoVFJBTlMsJ0MnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGICguTk9ULkxTQU1FKERJQUcsJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKERJQUcsJ04nKSkgVEhFTgorICAgICAgICAgIElORk8gPSAzCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNAorICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDcKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdDVFBNViAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGIChOLkVRLjApIFJFVFVSTgorKgorICAgICAgTk9DT05KID0gTFNBTUUoVFJBTlMsJ1QnKQorICAgICAgTk9VTklUID0gTFNBTUUoRElBRywnTicpCisqCisqICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50IGluIFggaWYgdGhlIGluY3JlbWVudCBpcyBub3QgdW5pdHkuIFRoaXMKKyogICAgIHdpbGwgYmUgICggTiAtIDEgKSpJTkNYICB0b28gc21hbGwgZm9yIGRlc2NlbmRpbmcgbG9vcHMuCisqCisgICAgICBJRiAoSU5DWC5MRS4wKSBUSEVOCisgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgRUxTRSBJRiAoSU5DWC5ORS4xKSBUSEVOCisgICAgICAgICAgS1ggPSAxCisgICAgICBFTkQgSUYKKyoKKyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIEFQIGFyZQorKiAgICAgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4KKyoKKyAgICAgIElGIChMU0FNRShUUkFOUywnTicpKSBUSEVOCisqCisqICAgICAgICBGb3JtICB4Oj0gQSp4LgorKgorICAgICAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyAgICAgICAgICAgICAgS0sgPSAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJKSA9IFgoSSkgKyBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikqQVAoS0srSi0xKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyA0MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSyA9IEtLLEtLICsgSiAtIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgKyBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgMzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpKkFQKEtLK0otMSkKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEtLID0gKE4qIChOKzEpKS8yCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDYwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gTixKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJKSA9IFgoSSkgKyBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyAtIDEKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikqQVAoS0stTitKKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSAoTi1KKzEpCisgICA2MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gODAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEsgPSBLSyxLSyAtIChOLSAoSisxKSksLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgKyBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAgNzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpKkFQKEtLLU4rSikKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSAoTi1KKzEpCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIHggOj0gQScqeCAgb3IgIHggOj0gY29uamcoIEEnICkqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtLID0gKE4qIChOKzEpKS8yCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDExMCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sgLSAxCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PQ09OSikgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpBUChLSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IEogLSAxLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgQVAoSykqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgLSAxCisgICA5MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpDT05KRyhBUChLSykpCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwMCBJID0gSiAtIDEsMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBDT05KRyhBUChLKSkqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgLSAxCisgIDEwMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgWChKKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gSgorICAxMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWCArIChOLTEpKklOQ1gKKyAgICAgICAgICAgICAgICAgIERPIDE0MCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEyMCBLID0gS0sgLSAxLEtLIC0gSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEFQKEspKlgoSVgpCisgIDEyMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpDT05KRyhBUChLSykpCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEzMCBLID0gS0sgLSAxLEtLIC0gSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIENPTkpHKEFQKEspKSpYKElYKQorICAxMzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIFgoSlgpID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyAtIEoKKyAgMTQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgS0sgPSAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDE3MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sgKyAxCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PQ09OSikgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpBUChLSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTUwIEkgPSBKICsgMSxOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEFQKEspKlgoSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAxNTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQ09OSkcoQVAoS0spKQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxNjAgSSA9IEogKyAxLE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgQ09OSkcoQVAoSykpKlgoSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAxNjAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIFgoSikgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgMTcwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDIwMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE4MCBLID0gS0sgKyAxLEtLICsgTiAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEFQKEspKlgoSVgpCisgIDE4MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpDT05KRyhBUChLSykpCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE5MCBLID0gS0sgKyAxLEtLICsgTiAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIENPTkpHKEFQKEspKSpYKElYKQorICAxOTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIFgoSlgpID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgMjAwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDVFBNViAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvY3Rwc3YuZiBiL2JsYXMvY3Rwc3YuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODA0Nzk3Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9jdHBzdi5mCkBAIC0wLDAgKzEsMzMyIEBACisgICAgICBTVUJST1VUSU5FIENUUFNWKFVQTE8sVFJBTlMsRElBRyxOLEFQLFgsSU5DWCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgSU5DWCxOCisgICAgICBDSEFSQUNURVIgRElBRyxUUkFOUyxVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYIEFQKCopLFgoKikKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICBDVFBTViAgc29sdmVzIG9uZSBvZiB0aGUgc3lzdGVtcyBvZiBlcXVhdGlvbnMKKyoKKyogICAgIEEqeCA9IGIsICAgb3IgICBBJyp4ID0gYiwgICBvciAgIGNvbmpnKCBBJyApKnggPSBiLAorKgorKiAgd2hlcmUgYiBhbmQgeCBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yCisqICBub24tdW5pdCwgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgorKgorKiAgTm8gdGVzdCBmb3Igc2luZ3VsYXJpdHkgb3IgbmVhci1zaW5ndWxhcml0eSBpcyBpbmNsdWRlZCBpbiB0aGlzCisqICByb3V0aW5lLiBTdWNoIHRlc3RzIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgbWF0cml4IGlzIGFuIHVwcGVyIG9yCisqICAgICAgICAgICBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBBIGlzIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBBIGlzIGEgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXguCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFRSQU5TICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFRSQU5TIHNwZWNpZmllcyB0aGUgZXF1YXRpb25zIHRvIGJlIHNvbHZlZCBhcworKiAgICAgICAgICAgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ04nIG9yICduJyAgIEEqeCA9IGIuCisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdUJyBvciAndCcgICBBJyp4ID0gYi4KKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ0MnIG9yICdjJyAgIGNvbmpnKCBBJyApKnggPSBiLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBESUFHICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBESUFHIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBBIGlzIHVuaXQKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIERJQUcgPSAnVScgb3IgJ3UnICAgQSBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgdHJpYW5ndWxhci4KKyoKKyogICAgICAgICAgICAgIERJQUcgPSAnTicgb3IgJ24nICAgQSBpcyBub3QgYXNzdW1lZCB0byBiZSB1bml0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ3VsYXIuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBUCAgICAgLSBDT01QTEVYICAgICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAoIG4qKCBuICsgMSApICkvMiApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciBtYXRyaXggcGFja2VkIHNlcXVlbnRpYWxseSwKKyogICAgICAgICAgIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSBjb250YWlucyBhKCAxLCAxICksCisqICAgICAgICAgICBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMSwgMiApIGFuZCBhKCAyLCAyICkKKyogICAgICAgICAgIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBwYWNrZWQgc2VxdWVudGlhbGx5LAorKiAgICAgICAgICAgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApIGNvbnRhaW5zIGEoIDEsIDEgKSwKKyogICAgICAgICAgIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAyLCAxICkgYW5kIGEoIDMsIDEgKQorKiAgICAgICAgICAgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uCisqICAgICAgICAgICBOb3RlIHRoYXQgd2hlbiAgRElBRyA9ICdVJyBvciAndScsIHRoZSBkaWFnb25hbCBlbGVtZW50cyBvZgorKiAgICAgICAgICAgQSBhcmUgbm90IHJlZmVyZW5jZWQsIGJ1dCBhcmUgYXNzdW1lZCB0byBiZSB1bml0eS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWCAgICAgIC0gQ09NUExFWCAgICAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgcmlnaHQtaGFuZCBzaWRlIHZlY3RvciBiLiBPbiBleGl0LCBYIGlzIG92ZXJ3cml0dGVuCisqICAgICAgICAgICB3aXRoIHRoZSBzb2x1dGlvbiB2ZWN0b3IgeC4KKyoKKyogIElOQ1ggICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEZ1cnRoZXIgRGV0YWlscworKiAgPT09PT09PT09PT09PT09CisqCisqICBMZXZlbCAyIEJsYXMgcm91dGluZS4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggWkVSTworICAgICAgUEFSQU1FVEVSIChaRVJPPSAoMC4wRSswLDAuMEUrMCkpCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCBURU1QCisgICAgICBJTlRFR0VSIEksSU5GTyxJWCxKLEpYLEssS0ssS1gKKyAgICAgIExPR0lDQUwgTk9DT05KLE5PVU5JVAorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCBMU0FNRQorICAgICAgRVhURVJOQUwgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgWEVSQkxBCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDIENPTkpHCisqICAgICAuLgorKgorKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyoKKyAgICAgIElORk8gPSAwCisgICAgICBJRiAoLk5PVC5MU0FNRShVUExPLCdVJykgLkFORC4gLk5PVC5MU0FNRShVUExPLCdMJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMQorICAgICAgRUxTRSBJRiAoLk5PVC5MU0FNRShUUkFOUywnTicpIC5BTkQuIC5OT1QuTFNBTUUoVFJBTlMsJ1QnKSAuQU5ELgorICAgICArICAgICAgICAgLk5PVC5MU0FNRShUUkFOUywnQycpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDIKKyAgICAgIEVMU0UgSUYgKC5OT1QuTFNBTUUoRElBRywnVScpIC5BTkQuIC5OT1QuTFNBTUUoRElBRywnTicpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDMKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA0CisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNworICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ0NUUFNWICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKE4uRVEuMCkgUkVUVVJOCisqCisgICAgICBOT0NPTkogPSBMU0FNRShUUkFOUywnVCcpCisgICAgICBOT1VOSVQgPSBMU0FNRShESUFHLCdOJykKKyoKKyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnQgaW4gWCBpZiB0aGUgaW5jcmVtZW50IGlzIG5vdCB1bml0eS4gVGhpcworKiAgICAgd2lsbCBiZSAgKCBOIC0gMSApKklOQ1ggIHRvbyBzbWFsbCBmb3IgZGVzY2VuZGluZyBsb29wcy4KKyoKKyAgICAgIElGIChJTkNYLkxFLjApIFRIRU4KKyAgICAgICAgICBLWCA9IDEgLSAoTi0xKSpJTkNYCisgICAgICBFTFNFIElGIChJTkNYLk5FLjEpIFRIRU4KKyAgICAgICAgICBLWCA9IDEKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgQVAgYXJlCisqICAgICBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEFQLgorKgorICAgICAgSUYgKExTQU1FKFRSQU5TLCdOJykpIFRIRU4KKyoKKyogICAgICAgIEZvcm0gIHggOj0gaW52KCBBICkqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtLID0gKE4qIChOKzEpKS8yCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDIwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSikgPSBYKEopL0FQKEtLKQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gS0sgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSBKIC0gMSwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKEkpID0gWChJKSAtIFRFTVAqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLIC0gMQorICAgMTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSBKCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgRE8gNDAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSlgpID0gWChKWCkvQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEsgPSBLSyAtIDEsS0sgLSBKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgLSBURU1QKkFQKEspCisgICAzMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gSgorICAgNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLSyA9IDEKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEopLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikvQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IEogKyAxLE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSSkgPSBYKEkpIC0gVEVNUCpBUChLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICA1MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgIDYwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDgwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpL0FQKEtLKQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBLID0gS0sgKyAxLEtLICsgTiAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKElYKSA9IFgoSVgpIC0gVEVNUCpBUChLKQorICAgNzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgeCA6PSBpbnYoIEEnICkqeCAgb3IgIHggOj0gaW52KCBjb25qZyggQScgKSApKnguCisqCisgICAgICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorICAgICAgICAgICAgICBLSyA9IDEKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMTEwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IDEsSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QIC0gQVAoSykqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICA5MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0FQKEtLK0otMSkKKyAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwMCBJID0gMSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgLSBDT05KRyhBUChLKSkqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgIDEwMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0NPTkpHKEFQKEtLK0otMSkpCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgWChKKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAxMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMTQwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PQ09OSikgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMjAgSyA9IEtLLEtLICsgSiAtIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QIC0gQVAoSykqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgIDEyMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0FQKEtLK0otMSkKKyAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEzMCBLID0gS0ssS0sgKyBKIC0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgLSBDT05KRyhBUChLKSkqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgIDEzMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0NPTkpHKEFQKEtLK0otMSkpCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgWChKWCkgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAxNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLSyA9IChOKiAoTisxKSkvMgorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxNzAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PQ09OSikgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxNTAgSSA9IE4sSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QIC0gQVAoSykqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgLSAxCisgIDE1MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0FQKEtLLU4rSikKKyAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE2MCBJID0gTixKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgLSBDT05KRyhBUChLKSkqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgLSAxCisgIDE2MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0NPTkpHKEFQKEtLLU4rSikpCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgWChKKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gKE4tSisxKQorICAxNzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgS1ggPSBLWCArIChOLTEpKklOQ1gKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDIwMCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTgwIEsgPSBLSyxLSyAtIChOLSAoSisxKSksLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QIC0gQVAoSykqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgIDE4MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0FQKEtLLU4rSikKKyAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE5MCBLID0gS0ssS0sgLSAoTi0gKEorMSkpLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCAtIENPTkpHKEFQKEspKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCAtIElOQ1gKKyAgMTkwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAvQ09OSkcoQVAoS0stTitKKSkKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSAoTi1KKzEpCisgIDIwMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgQ1RQU1YgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL2RvdWJsZS5jcHAgYi9ibGFzL2RvdWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkMmY2MwotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZG91YmxlLmNwcApAQCAtMCwwICsxLDE5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgU0NBTEFSICAgICAgICBkb3VibGUKKyNkZWZpbmUgU0NBTEFSX1NVRkZJWCBkCisjZGVmaW5lIFNDQUxBUl9TVUZGSVhfVVAgIkQiCisjZGVmaW5lIElTQ09NUExFWCAgICAgMAorCisjaW5jbHVkZSAibGV2ZWwxX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDFfcmVhbF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwyX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDJfcmVhbF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwzX2ltcGwuaCIKZGlmZiAtLWdpdCBhL2JsYXMvZHJvdG0uZiBiL2JsYXMvZHJvdG0uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2EzYjExCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9kcm90bS5mCkBAIC0wLDAgKzEsMTQ3IEBACisgICAgICBTVUJST1VUSU5FIERST1RNKE4sRFgsSU5DWCxEWSxJTkNZLERQQVJBTSkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLE4KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gRFBBUkFNKDUpLERYKCopLERZKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgICAgQVBQTFkgVEhFIE1PRElGSUVEIEdJVkVOUyBUUkFOU0ZPUk1BVElPTiwgSCwgVE8gVEhFIDIgQlkgTiBNQVRSSVgKKyoKKyogICAgIChEWCoqVCkgLCBXSEVSRSAqKlQgSU5ESUNBVEVTIFRSQU5TUE9TRS4gVEhFIEVMRU1FTlRTIE9GIERYIEFSRSBJTgorKiAgICAgKERZKipUKQorKgorKiAgICAgRFgoTFgrSSpJTkNYKSwgSSA9IDAgVE8gTi0xLCBXSEVSRSBMWCA9IDEgSUYgSU5DWCAuR0UuIDAsIEVMU0UKKyogICAgIExYID0gKC1JTkNYKSpOLCBBTkQgU0lNSUxBUkxZIEZPUiBTWSBVU0lORyBMWSBBTkQgSU5DWS4KKyogICAgIFdJVEggRFBBUkFNKDEpPURGTEFHLCBIIEhBUyBPTkUgT0YgVEhFIEZPTExPV0lORyBGT1JNUy4uCisqCisqICAgICBERkxBRz0tMS5EMCAgICAgREZMQUc9MC5EMCAgICAgICAgREZMQUc9MS5EMCAgICAgREZMQUc9LTIuRDAKKyoKKyogICAgICAgKERIMTEgIERIMTIpICAgICgxLkQwICBESDEyKSAgICAoREgxMSAgMS5EMCkgICAgKDEuRDAgIDAuRDApCisqICAgICBIPSggICAgICAgICAgKSAgICAoICAgICAgICAgICkgICAgKCAgICAgICAgICApICAgICggICAgICAgICAgKQorKiAgICAgICAoREgyMSAgREgyMiksICAgKERIMjEgIDEuRDApLCAgICgtMS5EMCBESDIyKSwgICAoMC5EMCAgMS5EMCkuCisqICAgICBTRUUgRFJPVE1HIEZPUiBBIERFU0NSSVBUSU9OIE9GIERBVEEgU1RPUkFHRSBJTiBEUEFSQU0uCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PQorKgorKiAgTiAgICAgIChpbnB1dCkgSU5URUdFUgorKiAgICAgICAgIG51bWJlciBvZiBlbGVtZW50cyBpbiBpbnB1dCB2ZWN0b3IocykKKyoKKyogIERYICAgICAoaW5wdXQvb3V0cHV0KSBET1VCTEUgUFJFQ0lTSU9OIGFycmF5LCBkaW1lbnNpb24gTgorKiAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gdmVjdG9yIHdpdGggTiBlbGVtZW50cworKgorKiAgSU5DWCAgIChpbnB1dCkgSU5URUdFUgorKiAgICAgICAgIHN0b3JhZ2Ugc3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzIG9mIERYCisqCisqICBEWSAgICAgKGlucHV0L291dHB1dCkgRE9VQkxFIFBSRUNJU0lPTiBhcnJheSwgZGltZW5zaW9uIE4KKyogICAgICAgICBkb3VibGUgcHJlY2lzaW9uIHZlY3RvciB3aXRoIE4gZWxlbWVudHMKKyoKKyogIElOQ1kgICAoaW5wdXQpIElOVEVHRVIKKyogICAgICAgICBzdG9yYWdlIHNwYWNpbmcgYmV0d2VlbiBlbGVtZW50cyBvZiBEWQorKgorKiAgRFBBUkFNIChpbnB1dC9vdXRwdXQpICBET1VCTEUgUFJFQ0lTSU9OIGFycmF5LCBkaW1lbnNpb24gNSAKKyogICAgIERQQVJBTSgxKT1ERkxBRworKiAgICAgRFBBUkFNKDIpPURIMTEKKyogICAgIERQQVJBTSgzKT1ESDIxCisqICAgICBEUEFSQU0oNCk9REgxMgorKiAgICAgRFBBUkFNKDUpPURIMjIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBERkxBRyxESDExLERIMTIsREgyMSxESDIyLFRXTyxXLFosWkVSTworICAgICAgSU5URUdFUiBJLEtYLEtZLE5TVEVQUworKiAgICAgLi4KKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSBaRVJPLFRXTy8wLkQwLDIuRDAvCisqICAgICAuLgorKgorICAgICAgREZMQUcgPSBEUEFSQU0oMSkKKyAgICAgIElGIChOLkxFLjAgLk9SLiAoREZMQUcrVFdPLkVRLlpFUk8pKSBHTyBUTyAxNDAKKyAgICAgIElGICguTk9ULiAoSU5DWC5FUS5JTkNZLkFORC5JTkNYLkdULjApKSBHTyBUTyA3MAorKgorICAgICAgTlNURVBTID0gTipJTkNYCisgICAgICBJRiAoREZMQUcpIDUwLDEwLDMwCisgICAxMCBDT05USU5VRQorICAgICAgREgxMiA9IERQQVJBTSg0KQorICAgICAgREgyMSA9IERQQVJBTSgzKQorICAgICAgRE8gMjAgSSA9IDEsTlNURVBTLElOQ1gKKyAgICAgICAgICBXID0gRFgoSSkKKyAgICAgICAgICBaID0gRFkoSSkKKyAgICAgICAgICBEWChJKSA9IFcgKyBaKkRIMTIKKyAgICAgICAgICBEWShJKSA9IFcqREgyMSArIFoKKyAgIDIwIENPTlRJTlVFCisgICAgICBHTyBUTyAxNDAKKyAgIDMwIENPTlRJTlVFCisgICAgICBESDExID0gRFBBUkFNKDIpCisgICAgICBESDIyID0gRFBBUkFNKDUpCisgICAgICBETyA0MCBJID0gMSxOU1RFUFMsSU5DWAorICAgICAgICAgIFcgPSBEWChJKQorICAgICAgICAgIFogPSBEWShJKQorICAgICAgICAgIERYKEkpID0gVypESDExICsgWgorICAgICAgICAgIERZKEkpID0gLVcgKyBESDIyKloKKyAgIDQwIENPTlRJTlVFCisgICAgICBHTyBUTyAxNDAKKyAgIDUwIENPTlRJTlVFCisgICAgICBESDExID0gRFBBUkFNKDIpCisgICAgICBESDEyID0gRFBBUkFNKDQpCisgICAgICBESDIxID0gRFBBUkFNKDMpCisgICAgICBESDIyID0gRFBBUkFNKDUpCisgICAgICBETyA2MCBJID0gMSxOU1RFUFMsSU5DWAorICAgICAgICAgIFcgPSBEWChJKQorICAgICAgICAgIFogPSBEWShJKQorICAgICAgICAgIERYKEkpID0gVypESDExICsgWipESDEyCisgICAgICAgICAgRFkoSSkgPSBXKkRIMjEgKyBaKkRIMjIKKyAgIDYwIENPTlRJTlVFCisgICAgICBHTyBUTyAxNDAKKyAgIDcwIENPTlRJTlVFCisgICAgICBLWCA9IDEKKyAgICAgIEtZID0gMQorICAgICAgSUYgKElOQ1guTFQuMCkgS1ggPSAxICsgKDEtTikqSU5DWAorICAgICAgSUYgKElOQ1kuTFQuMCkgS1kgPSAxICsgKDEtTikqSU5DWQorKgorICAgICAgSUYgKERGTEFHKSAxMjAsODAsMTAwCisgICA4MCBDT05USU5VRQorICAgICAgREgxMiA9IERQQVJBTSg0KQorICAgICAgREgyMSA9IERQQVJBTSgzKQorICAgICAgRE8gOTAgSSA9IDEsTgorICAgICAgICAgIFcgPSBEWChLWCkKKyAgICAgICAgICBaID0gRFkoS1kpCisgICAgICAgICAgRFgoS1gpID0gVyArIFoqREgxMgorICAgICAgICAgIERZKEtZKSA9IFcqREgyMSArIFoKKyAgICAgICAgICBLWCA9IEtYICsgSU5DWAorICAgICAgICAgIEtZID0gS1kgKyBJTkNZCisgICA5MCBDT05USU5VRQorICAgICAgR08gVE8gMTQwCisgIDEwMCBDT05USU5VRQorICAgICAgREgxMSA9IERQQVJBTSgyKQorICAgICAgREgyMiA9IERQQVJBTSg1KQorICAgICAgRE8gMTEwIEkgPSAxLE4KKyAgICAgICAgICBXID0gRFgoS1gpCisgICAgICAgICAgWiA9IERZKEtZKQorICAgICAgICAgIERYKEtYKSA9IFcqREgxMSArIFoKKyAgICAgICAgICBEWShLWSkgPSAtVyArIERIMjIqWgorICAgICAgICAgIEtYID0gS1ggKyBJTkNYCisgICAgICAgICAgS1kgPSBLWSArIElOQ1kKKyAgMTEwIENPTlRJTlVFCisgICAgICBHTyBUTyAxNDAKKyAgMTIwIENPTlRJTlVFCisgICAgICBESDExID0gRFBBUkFNKDIpCisgICAgICBESDEyID0gRFBBUkFNKDQpCisgICAgICBESDIxID0gRFBBUkFNKDMpCisgICAgICBESDIyID0gRFBBUkFNKDUpCisgICAgICBETyAxMzAgSSA9IDEsTgorICAgICAgICAgIFcgPSBEWChLWCkKKyAgICAgICAgICBaID0gRFkoS1kpCisgICAgICAgICAgRFgoS1gpID0gVypESDExICsgWipESDEyCisgICAgICAgICAgRFkoS1kpID0gVypESDIxICsgWipESDIyCisgICAgICAgICAgS1ggPSBLWCArIElOQ1gKKyAgICAgICAgICBLWSA9IEtZICsgSU5DWQorICAxMzAgQ09OVElOVUUKKyAgMTQwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy9kcm90bWcuZiBiL2JsYXMvZHJvdG1nLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlNjQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZHJvdG1nLmYKQEAgLTAsMCArMSwyMDYgQEAKKyAgICAgIFNVQlJPVVRJTkUgRFJPVE1HKEREMSxERDIsRFgxLERZMSxEUEFSQU0pCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEREMSxERDIsRFgxLERZMQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBEUEFSQU0oNSkKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICAgICBDT05TVFJVQ1QgVEhFIE1PRElGSUVEIEdJVkVOUyBUUkFOU0ZPUk1BVElPTiBNQVRSSVggSCBXSElDSCBaRVJPUworKiAgICAgVEhFIFNFQ09ORCBDT01QT05FTlQgT0YgVEhFIDItVkVDVE9SICAoRFNRUlQoREQxKSpEWDEsRFNRUlQoREQyKSoKKyogICAgIERZMikqKlQuCisqICAgICBXSVRIIERQQVJBTSgxKT1ERkxBRywgSCBIQVMgT05FIE9GIFRIRSBGT0xMT1dJTkcgRk9STVMuLgorKgorKiAgICAgREZMQUc9LTEuRDAgICAgIERGTEFHPTAuRDAgICAgICAgIERGTEFHPTEuRDAgICAgIERGTEFHPS0yLkQwCisqCisqICAgICAgIChESDExICBESDEyKSAgICAoMS5EMCAgREgxMikgICAgKERIMTEgIDEuRDApICAgICgxLkQwICAwLkQwKQorKiAgICAgSD0oICAgICAgICAgICkgICAgKCAgICAgICAgICApICAgICggICAgICAgICAgKSAgICAoICAgICAgICAgICkKKyogICAgICAgKERIMjEgIERIMjIpLCAgIChESDIxICAxLkQwKSwgICAoLTEuRDAgREgyMiksICAgKDAuRDAgIDEuRDApLgorKiAgICAgTE9DQVRJT05TIDItNCBPRiBEUEFSQU0gQ09OVEFJTiBESDExLCBESDIxLCBESDEyLCBBTkQgREgyMgorKiAgICAgUkVTUEVDVElWRUxZLiAoVkFMVUVTIE9GIDEuRDAsIC0xLkQwLCBPUiAwLkQwIElNUExJRUQgQlkgVEhFCisqICAgICBWQUxVRSBPRiBEUEFSQU0oMSkgQVJFIE5PVCBTVE9SRUQgSU4gRFBBUkFNLikKKyoKKyogICAgIFRIRSBWQUxVRVMgT0YgR0FNU1EgQU5EIFJHQU1TUSBTRVQgSU4gVEhFIERBVEEgU1RBVEVNRU5UIE1BWSBCRQorKiAgICAgSU5FWEFDVC4gIFRISVMgSVMgT0sgQVMgVEhFWSBBUkUgT05MWSBVU0VEIEZPUiBURVNUSU5HIFRIRSBTSVpFCisqICAgICBPRiBERDEgQU5EIEREMi4gIEFMTCBBQ1RVQUwgU0NBTElORyBPRiBEQVRBIElTIERPTkUgVVNJTkcgR0FNLgorKgorKgorKiAgQXJndW1lbnRzCisqICA9PT09PT09PT0KKyoKKyogIEREMSAgICAoaW5wdXQvb3V0cHV0KSBET1VCTEUgUFJFQ0lTSU9OCisqCisqICBERDIgICAgKGlucHV0L291dHB1dCkgRE9VQkxFIFBSRUNJU0lPTiAKKyoKKyogIERYMSAgICAoaW5wdXQvb3V0cHV0KSBET1VCTEUgUFJFQ0lTSU9OIAorKgorKiAgRFkxICAgIChpbnB1dCkgRE9VQkxFIFBSRUNJU0lPTgorKgorKiAgRFBBUkFNIChpbnB1dC9vdXRwdXQpICBET1VCTEUgUFJFQ0lTSU9OIGFycmF5LCBkaW1lbnNpb24gNQorKiAgICAgRFBBUkFNKDEpPURGTEFHCisqICAgICBEUEFSQU0oMik9REgxMQorKiAgICAgRFBBUkFNKDMpPURIMjEKKyogICAgIERQQVJBTSg0KT1ESDEyCisqICAgICBEUEFSQU0oNSk9REgyMgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIERGTEFHLERIMTEsREgxMixESDIxLERIMjIsRFAxLERQMixEUTEsRFEyLERURU1QLAorICAgICArICAgICAgICAgICAgICAgICBEVSxHQU0sR0FNU1EsT05FLFJHQU1TUSxUV08sWkVSTworICAgICAgSU5URUdFUiBJR08KKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgREFCUworKiAgICAgLi4KKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorKgorICAgICAgREFUQSBaRVJPLE9ORSxUV08vMC5EMCwxLkQwLDIuRDAvCisgICAgICBEQVRBIEdBTSxHQU1TUSxSR0FNU1EvNDA5Ni5EMCwxNjc3NzIxNi5EMCw1Ljk2MDQ2NDVELTgvCisqICAgICAuLgorCisgICAgICBJRiAoLk5PVC5ERDEuTFQuWkVSTykgR08gVE8gMTAKKyogICAgICAgR08gWkVSTy1ILUQtQU5ELURYMS4uCisgICAgICBHTyBUTyA2MAorICAgMTAgQ09OVElOVUUKKyogICAgIENBU0UtREQxLU5PTk5FR0FUSVZFCisgICAgICBEUDIgPSBERDIqRFkxCisgICAgICBJRiAoLk5PVC5EUDIuRVEuWkVSTykgR08gVE8gMjAKKyAgICAgIERGTEFHID0gLVRXTworICAgICAgR08gVE8gMjYwCisqICAgICBSRUdVTEFSLUNBU0UuLgorICAgMjAgQ09OVElOVUUKKyAgICAgIERQMSA9IEREMSpEWDEKKyAgICAgIERRMiA9IERQMipEWTEKKyAgICAgIERRMSA9IERQMSpEWDEKKyoKKyAgICAgIElGICguTk9ULkRBQlMoRFExKS5HVC5EQUJTKERRMikpIEdPIFRPIDQwCisgICAgICBESDIxID0gLURZMS9EWDEKKyAgICAgIERIMTIgPSBEUDIvRFAxCisqCisgICAgICBEVSA9IE9ORSAtIERIMTIqREgyMQorKgorICAgICAgSUYgKC5OT1QuRFUuTEUuWkVSTykgR08gVE8gMzAKKyogICAgICAgICBHTyBaRVJPLUgtRC1BTkQtRFgxLi4KKyAgICAgIEdPIFRPIDYwCisgICAzMCBDT05USU5VRQorICAgICAgREZMQUcgPSBaRVJPCisgICAgICBERDEgPSBERDEvRFUKKyAgICAgIEREMiA9IEREMi9EVQorICAgICAgRFgxID0gRFgxKkRVCisqICAgICAgICAgR08gU0NBTEUtQ0hFQ0suLgorICAgICAgR08gVE8gMTAwCisgICA0MCBDT05USU5VRQorICAgICAgSUYgKC5OT1QuRFEyLkxULlpFUk8pIEdPIFRPIDUwCisqICAgICAgICAgR08gWkVSTy1ILUQtQU5ELURYMS4uCisgICAgICBHTyBUTyA2MAorICAgNTAgQ09OVElOVUUKKyAgICAgIERGTEFHID0gT05FCisgICAgICBESDExID0gRFAxL0RQMgorICAgICAgREgyMiA9IERYMS9EWTEKKyAgICAgIERVID0gT05FICsgREgxMSpESDIyCisgICAgICBEVEVNUCA9IEREMi9EVQorICAgICAgREQyID0gREQxL0RVCisgICAgICBERDEgPSBEVEVNUAorICAgICAgRFgxID0gRFkxKkRVCisqICAgICAgICAgR08gU0NBTEUtQ0hFQ0sKKyAgICAgIEdPIFRPIDEwMAorKiAgICAgUFJPQ0VEVVJFLi5aRVJPLUgtRC1BTkQtRFgxLi4KKyAgIDYwIENPTlRJTlVFCisgICAgICBERkxBRyA9IC1PTkUKKyAgICAgIERIMTEgPSBaRVJPCisgICAgICBESDEyID0gWkVSTworICAgICAgREgyMSA9IFpFUk8KKyAgICAgIERIMjIgPSBaRVJPCisqCisgICAgICBERDEgPSBaRVJPCisgICAgICBERDIgPSBaRVJPCisgICAgICBEWDEgPSBaRVJPCisqICAgICAgICAgUkVUVVJOLi4KKyAgICAgIEdPIFRPIDIyMAorKiAgICAgUFJPQ0VEVVJFLi5GSVgtSC4uCisgICA3MCBDT05USU5VRQorICAgICAgSUYgKC5OT1QuREZMQUcuR0UuWkVSTykgR08gVE8gOTAKKyoKKyAgICAgIElGICguTk9ULkRGTEFHLkVRLlpFUk8pIEdPIFRPIDgwCisgICAgICBESDExID0gT05FCisgICAgICBESDIyID0gT05FCisgICAgICBERkxBRyA9IC1PTkUKKyAgICAgIEdPIFRPIDkwCisgICA4MCBDT05USU5VRQorICAgICAgREgyMSA9IC1PTkUKKyAgICAgIERIMTIgPSBPTkUKKyAgICAgIERGTEFHID0gLU9ORQorICAgOTAgQ09OVElOVUUKKyAgICAgIEdPIFRPIElHTygxMjAsMTUwLDE4MCwyMTApCisqICAgICBQUk9DRURVUkUuLlNDQUxFLUNIRUNLCisgIDEwMCBDT05USU5VRQorICAxMTAgQ09OVElOVUUKKyAgICAgIElGICguTk9ULkREMS5MRS5SR0FNU1EpIEdPIFRPIDEzMAorICAgICAgSUYgKEREMS5FUS5aRVJPKSBHTyBUTyAxNjAKKyAgICAgIEFTU0lHTiAxMjAgVE8gSUdPCisqICAgICAgICAgICAgICBGSVgtSC4uCisgICAgICBHTyBUTyA3MAorICAxMjAgQ09OVElOVUUKKyAgICAgIEREMSA9IEREMSpHQU0qKjIKKyAgICAgIERYMSA9IERYMS9HQU0KKyAgICAgIERIMTEgPSBESDExL0dBTQorICAgICAgREgxMiA9IERIMTIvR0FNCisgICAgICBHTyBUTyAxMTAKKyAgMTMwIENPTlRJTlVFCisgIDE0MCBDT05USU5VRQorICAgICAgSUYgKC5OT1QuREQxLkdFLkdBTVNRKSBHTyBUTyAxNjAKKyAgICAgIEFTU0lHTiAxNTAgVE8gSUdPCisqICAgICAgICAgICAgICBGSVgtSC4uCisgICAgICBHTyBUTyA3MAorICAxNTAgQ09OVElOVUUKKyAgICAgIEREMSA9IEREMS9HQU0qKjIKKyAgICAgIERYMSA9IERYMSpHQU0KKyAgICAgIERIMTEgPSBESDExKkdBTQorICAgICAgREgxMiA9IERIMTIqR0FNCisgICAgICBHTyBUTyAxNDAKKyAgMTYwIENPTlRJTlVFCisgIDE3MCBDT05USU5VRQorICAgICAgSUYgKC5OT1QuREFCUyhERDIpLkxFLlJHQU1TUSkgR08gVE8gMTkwCisgICAgICBJRiAoREQyLkVRLlpFUk8pIEdPIFRPIDIyMAorICAgICAgQVNTSUdOIDE4MCBUTyBJR08KKyogICAgICAgICAgICAgIEZJWC1ILi4KKyAgICAgIEdPIFRPIDcwCisgIDE4MCBDT05USU5VRQorICAgICAgREQyID0gREQyKkdBTSoqMgorICAgICAgREgyMSA9IERIMjEvR0FNCisgICAgICBESDIyID0gREgyMi9HQU0KKyAgICAgIEdPIFRPIDE3MAorICAxOTAgQ09OVElOVUUKKyAgMjAwIENPTlRJTlVFCisgICAgICBJRiAoLk5PVC5EQUJTKEREMikuR0UuR0FNU1EpIEdPIFRPIDIyMAorICAgICAgQVNTSUdOIDIxMCBUTyBJR08KKyogICAgICAgICAgICAgIEZJWC1ILi4KKyAgICAgIEdPIFRPIDcwCisgIDIxMCBDT05USU5VRQorICAgICAgREQyID0gREQyL0dBTSoqMgorICAgICAgREgyMSA9IERIMjEqR0FNCisgICAgICBESDIyID0gREgyMipHQU0KKyAgICAgIEdPIFRPIDIwMAorICAyMjAgQ09OVElOVUUKKyAgICAgIElGIChERkxBRykgMjUwLDIzMCwyNDAKKyAgMjMwIENPTlRJTlVFCisgICAgICBEUEFSQU0oMykgPSBESDIxCisgICAgICBEUEFSQU0oNCkgPSBESDEyCisgICAgICBHTyBUTyAyNjAKKyAgMjQwIENPTlRJTlVFCisgICAgICBEUEFSQU0oMikgPSBESDExCisgICAgICBEUEFSQU0oNSkgPSBESDIyCisgICAgICBHTyBUTyAyNjAKKyAgMjUwIENPTlRJTlVFCisgICAgICBEUEFSQU0oMikgPSBESDExCisgICAgICBEUEFSQU0oMykgPSBESDIxCisgICAgICBEUEFSQU0oNCkgPSBESDEyCisgICAgICBEUEFSQU0oNSkgPSBESDIyCisgIDI2MCBDT05USU5VRQorICAgICAgRFBBUkFNKDEpID0gREZMQUcKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL2RzYm12LmYgYi9ibGFzL2RzYm12LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4MmQxZgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZHNibXYuZgpAQCAtMCwwICsxLDMwNCBAQAorICAgICAgU1VCUk9VVElORSBEU0JNVihVUExPLE4sSyxBTFBIQSxBLExEQSxYLElOQ1gsQkVUQSxZLElOQ1kpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEFMUEhBLEJFVEEKKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLEssTERBLE4KKyAgICAgIENIQVJBQ1RFUiBVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEEoTERBLCopLFgoKiksWSgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIERTQk1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciAgb3BlcmF0aW9uCisqCisqICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwKKyoKKyogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyogIEEgaXMgYW4gbiBieSBuIHN5bW1ldHJpYyBiYW5kIG1hdHJpeCwgd2l0aCBrIHN1cGVyLWRpYWdvbmFscy4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgYmFuZCBtYXRyaXggQSBpcyBiZWluZyBzdXBwbGllZCBhcworKiAgICAgICAgICAgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgVGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHN1cHBsaWVkLgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgc3VwcGxpZWQuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBLICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIEsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3VwZXItZGlhZ29uYWxzIG9mIHRoZQorKiAgICAgICAgICAgbWF0cml4IEEuIEsgbXVzdCBzYXRpc2Z5ICAwIC5sZS4gSy4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQUxQSEEgIC0gRE9VQkxFIFBSRUNJU0lPTi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQSAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBESU1FTlNJT04gKCBMREEsIG4gKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkKKyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIKKyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgY29sdW1uIGJ5CisqICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cKKyogICAgICAgICAgICggayArIDEgKSBvZiB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdXBlci1kaWFnb25hbCBzdGFydGluZyBhdAorKiAgICAgICAgICAgcG9zaXRpb24gMiBpbiByb3cgaywgYW5kIHNvIG9uLiBUaGUgdG9wIGxlZnQgayBieSBrIHRyaWFuZ2xlCisqICAgICAgICAgICBvZiB0aGUgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4KKyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgdGhlIHVwcGVyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgYSBzeW1tZXRyaWMgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwKKyogICAgICAgICAgIGZ1bGwgbWF0cml4IHN0b3JhZ2UgdG8gYmFuZCBzdG9yYWdlOgorKgorKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOCisqICAgICAgICAgICAgICAgICAgICBNID0gSyArIDEgLSBKCisqICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IE1BWCggMSwgSiAtIEsgKSwgSgorKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApCisqICAgICAgICAgICAgICAxMCAgICBDT05USU5VRQorKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUKKyoKKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkKKyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIKKyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgY29sdW1uIGJ5CisqICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cgMSBvZgorKiAgICAgICAgICAgdGhlIGFycmF5LCB0aGUgZmlyc3Qgc3ViLWRpYWdvbmFsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEgaW4KKyogICAgICAgICAgIHJvdyAyLCBhbmQgc28gb24uIFRoZSBib3R0b20gcmlnaHQgayBieSBrIHRyaWFuZ2xlIG9mIHRoZQorKiAgICAgICAgICAgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4KKyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgdGhlIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgYSBzeW1tZXRyaWMgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwKKyogICAgICAgICAgIGZ1bGwgbWF0cml4IHN0b3JhZ2UgdG8gYmFuZCBzdG9yYWdlOgorKgorKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOCisqICAgICAgICAgICAgICAgICAgICBNID0gMSAtIEoKKyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gSiwgTUlOKCBOLCBKICsgSyApCisqICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkKKyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFCisqICAgICAgICAgICAgICAyMCBDT05USU5VRQorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBMREEgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIExEQSBzcGVjaWZpZXMgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBBIGFzIGRlY2xhcmVkCisqICAgICAgICAgICBpbiB0aGUgY2FsbGluZyAoc3ViKSBwcm9ncmFtLiBMREEgbXVzdCBiZSBhdCBsZWFzdAorKiAgICAgICAgICAgKCBrICsgMSApLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBET1VCTEUgUFJFQ0lTSU9OIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUKKyogICAgICAgICAgIHZlY3RvciB4LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBJTkNYICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBCRVRBICAgLSBET1VCTEUgUFJFQ0lTSU9OLgorKiAgICAgICAgICAgT24gZW50cnksIEJFVEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYmV0YS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWSAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1kgKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWSBtdXN0IGNvbnRhaW4gdGhlCisqICAgICAgICAgICB2ZWN0b3IgeS4gT24gZXhpdCwgWSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgdXBkYXRlZCB2ZWN0b3IgeS4KKyoKKyogIElOQ1kgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWSBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBZLiBJTkNZIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBPTkUsWkVSTworICAgICAgUEFSQU1FVEVSIChPTkU9MS4wRCswLFpFUk89MC4wRCswKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gVEVNUDEsVEVNUDIKKyAgICAgIElOVEVHRVIgSSxJTkZPLElYLElZLEosSlgsSlksS1BMVVMxLEtYLEtZLEwKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgTFNBTUUKKyAgICAgIEVYVEVSTkFMIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMIFhFUkJMQQorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyBNQVgsTUlOCisqICAgICAuLgorKgorKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyoKKyAgICAgIElORk8gPSAwCisgICAgICBJRiAoLk5PVC5MU0FNRShVUExPLCdVJykgLkFORC4gLk5PVC5MU0FNRShVUExPLCdMJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMQorICAgICAgRUxTRSBJRiAoTi5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDIKKyAgICAgIEVMU0UgSUYgKEsuTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSAzCisgICAgICBFTFNFIElGIChMREEuTFQuIChLKzEpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDYKKyAgICAgIEVMU0UgSUYgKElOQ1guRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA4CisgICAgICBFTFNFIElGIChJTkNZLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gMTEKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdEU0JNViAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGICgoTi5FUS4wKSAuT1IuICgoQUxQSEEuRVEuWkVSTykuQU5ELiAoQkVUQS5FUS5PTkUpKSkgUkVUVVJOCisqCisqICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50cyBpbiAgWCAgYW5kICBZLgorKgorICAgICAgSUYgKElOQ1guR1QuMCkgVEhFTgorICAgICAgICAgIEtYID0gMQorICAgICAgRUxTRQorICAgICAgICAgIEtYID0gMSAtIChOLTEpKklOQ1gKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElOQ1kuR1QuMCkgVEhFTgorICAgICAgICAgIEtZID0gMQorICAgICAgRUxTRQorICAgICAgICAgIEtZID0gMSAtIChOLTEpKklOQ1kKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEEKKyogICAgIGFyZSBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEEuCisqCisqICAgICBGaXJzdCBmb3JtICB5IDo9IGJldGEqeS4KKyoKKyAgICAgIElGIChCRVRBLk5FLk9ORSkgVEhFTgorICAgICAgICAgIElGIChJTkNZLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgSUYgKEJFVEEuRVEuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSSkgPSBaRVJPCisgICAxMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJKSA9IEJFVEEqWShJKQorICAgMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBJWSA9IEtZCisgICAgICAgICAgICAgIElGIChCRVRBLkVRLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgMzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gQkVUQSpZKElZKQorICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorICAgICAgSUYgKEFMUEhBLkVRLlpFUk8pIFJFVFVSTgorICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgeSAgd2hlbiB1cHBlciB0cmlhbmdsZSBvZiBBIGlzIHN0b3JlZC4KKyoKKyAgICAgICAgICBLUExVUzEgPSBLICsgMQorICAgICAgICAgIElGICgoSU5DWC5FUS4xKSAuQU5ELiAoSU5DWS5FUS4xKSkgVEhFTgorICAgICAgICAgICAgICBETyA2MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSikKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgTCA9IEtQTFVTMSAtIEoKKyAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSBNQVgoMSxKLUspLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgWShJKSA9IFkoSSkgKyBURU1QMSpBKEwrSSxKKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gVEVNUDIgKyBBKEwrSSxKKSpYKEkpCisgICA1MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBURU1QMSpBKEtQTFVTMSxKKSArIEFMUEhBKlRFTVAyCisgICA2MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgIEpZID0gS1kKKyAgICAgICAgICAgICAgRE8gODAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpYKEpYKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICBJWSA9IEtZCisgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgRE8gNzAgSSA9IE1BWCgxLEotSyksSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IFkoSVkpICsgVEVNUDEqQShMK0ksSikKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgQShMK0ksSikqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKWSkgPSBZKEpZKSArIFRFTVAxKkEoS1BMVVMxLEopICsgQUxQSEEqVEVNUDIKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBKWSA9IEpZICsgSU5DWQorICAgICAgICAgICAgICAgICAgSUYgKEouR1QuSykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIEtYID0gS1ggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS1kgPSBLWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgODAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgeSAgd2hlbiBsb3dlciB0cmlhbmdsZSBvZiBBIGlzIHN0b3JlZC4KKyoKKyAgICAgICAgICBJRiAoKElOQ1guRVEuMSkgLkFORC4gKElOQ1kuRVEuMSkpIFRIRU4KKyAgICAgICAgICAgICAgRE8gMTAwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBZKEopID0gWShKKSArIFRFTVAxKkEoMSxKKQorICAgICAgICAgICAgICAgICAgTCA9IDEgLSBKCisgICAgICAgICAgICAgICAgICBETyA5MCBJID0gSiArIDEsTUlOKE4sSitLKQorICAgICAgICAgICAgICAgICAgICAgIFkoSSkgPSBZKEkpICsgVEVNUDEqQShMK0ksSikKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgQShMK0ksSikqWChJKQorICAgOTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSikgPSBZKEopICsgQUxQSEEqVEVNUDIKKyAgMTAwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgSlkgPSBLWQorICAgICAgICAgICAgICBETyAxMjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpYKEpYKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBZKEpZKSA9IFkoSlkpICsgVEVNUDEqQSgxLEopCisgICAgICAgICAgICAgICAgICBMID0gMSAtIEoKKyAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgIElZID0gSlkKKyAgICAgICAgICAgICAgICAgIERPIDExMCBJID0gSiArIDEsTUlOKE4sSitLKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IFkoSVkpICsgVEVNUDEqQShMK0ksSikKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgQShMK0ksSikqWChJWCkKKyAgMTEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBZKEpZKSA9IFkoSlkpICsgQUxQSEEqVEVNUDIKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBKWSA9IEpZICsgSU5DWQorICAxMjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBEU0JNViAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvZHNwbXYuZiBiL2JsYXMvZHNwbXYuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUxMjFlCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9kc3Btdi5mCkBAIC0wLDAgKzEsMjY1IEBACisgICAgICBTVUJST1VUSU5FIERTUE1WKFVQTE8sTixBTFBIQSxBUCxYLElOQ1gsQkVUQSxZLElOQ1kpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEFMUEhBLEJFVEEKKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLE4KKyAgICAgIENIQVJBQ1RFUiBVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEFQKCopLFgoKiksWSgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIERTUE1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb24KKyoKKyogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorKgorKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAorKiAgQSBpcyBhbiBuIGJ5IG4gc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwcGVyIG9yIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBBIGlzIHN1cHBsaWVkIGluIHRoZSBwYWNrZWQKKyogICAgICAgICAgIGFycmF5IEFQIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIFRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBpbiBBUC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgVGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQUxQSEEgIC0gRE9VQkxFIFBSRUNJU0lPTi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQVAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBzeW1tZXRyaWMgbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKQorKiAgICAgICAgICAgYW5kIGEoIDIsIDIgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBzeW1tZXRyaWMgbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKQorKiAgICAgICAgICAgYW5kIGEoIDMsIDEgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWCAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIElOQ1ggICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEJFVEEgICAtIERPVUJMRSBQUkVDSVNJT04uCisqICAgICAgICAgICBPbiBlbnRyeSwgQkVUQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBiZXRhLiBXaGVuIEJFVEEgaXMKKyogICAgICAgICAgIHN1cHBsaWVkIGFzIHplcm8gdGhlbiBZIG5lZWQgbm90IGJlIHNldCBvbiBpbnB1dC4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWSAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1kgKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWSBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHkuIE9uIGV4aXQsIFkgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIHVwZGF0ZWQKKyogICAgICAgICAgIHZlY3RvciB5LgorKgorKiAgSU5DWSAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNZIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFkuIElOQ1kgbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRnVydGhlciBEZXRhaWxzCisqICA9PT09PT09PT09PT09PT0KKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBPTkUsWkVSTworICAgICAgUEFSQU1FVEVSIChPTkU9MS4wRCswLFpFUk89MC4wRCswKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gVEVNUDEsVEVNUDIKKyAgICAgIElOVEVHRVIgSSxJTkZPLElYLElZLEosSlgsSlksSyxLSyxLWCxLWQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCBMU0FNRQorICAgICAgRVhURVJOQUwgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgWEVSQkxBCisqICAgICAuLgorKgorKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyoKKyAgICAgIElORk8gPSAwCisgICAgICBJRiAoLk5PVC5MU0FNRShVUExPLCdVJykgLkFORC4gLk5PVC5MU0FNRShVUExPLCdMJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMQorICAgICAgRUxTRSBJRiAoTi5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDIKKyAgICAgIEVMU0UgSUYgKElOQ1guRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA2CisgICAgICBFTFNFIElGIChJTkNZLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gOQorICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ0RTUE1WICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKChOLkVRLjApIC5PUi4gKChBTFBIQS5FUS5aRVJPKS5BTkQuIChCRVRBLkVRLk9ORSkpKSBSRVRVUk4KKyoKKyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnRzIGluICBYICBhbmQgIFkuCisqCisgICAgICBJRiAoSU5DWC5HVC4wKSBUSEVOCisgICAgICAgICAgS1ggPSAxCisgICAgICBFTFNFCisgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgRU5EIElGCisgICAgICBJRiAoSU5DWS5HVC4wKSBUSEVOCisgICAgICAgICAgS1kgPSAxCisgICAgICBFTFNFCisgICAgICAgICAgS1kgPSAxIC0gKE4tMSkqSU5DWQorICAgICAgRU5EIElGCisqCisqICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQVAKKyogICAgIGFyZSBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEFQLgorKgorKiAgICAgRmlyc3QgZm9ybSAgeSA6PSBiZXRhKnkuCisqCisgICAgICBJRiAoQkVUQS5ORS5PTkUpIFRIRU4KKyAgICAgICAgICBJRiAoSU5DWS5FUS4xKSBUSEVOCisgICAgICAgICAgICAgIElGIChCRVRBLkVRLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWkVSTworICAgMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSSkgPSBCRVRBKlkoSSkKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSVkgPSBLWQorICAgICAgICAgICAgICBJRiAoQkVUQS5FUS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDMwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IEJFVEEqWShJWSkKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyAgICAgIElGIChBTFBIQS5FUS5aRVJPKSBSRVRVUk4KKyAgICAgIEtLID0gMQorICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgeSAgd2hlbiBBUCBjb250YWlucyB0aGUgdXBwZXIgdHJpYW5nbGUuCisqCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDYwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgWShJKSA9IFkoSSkgKyBURU1QMSpBUChLKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gVEVNUDIgKyBBUChLKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICA1MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBURU1QMSpBUChLSytKLTEpICsgQUxQSEEqVEVNUDIKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICA2MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgIEpZID0gS1kKKyAgICAgICAgICAgICAgRE8gODAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpYKEpYKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICBJWSA9IEtZCisgICAgICAgICAgICAgICAgICBETyA3MCBLID0gS0ssS0sgKyBKIC0gMgorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gWShJWSkgKyBURU1QMSpBUChLKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gVEVNUDIgKyBBUChLKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBZKEpZKSA9IFkoSlkpICsgVEVNUDEqQVAoS0srSi0xKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICA4MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRU5EIElGCisgICAgICBFTFNFCisqCisqICAgICAgICBGb3JtICB5ICB3aGVuIEFQIGNvbnRhaW5zIHRoZSBsb3dlciB0cmlhbmdsZS4KKyoKKyAgICAgICAgICBJRiAoKElOQ1guRVEuMSkgLkFORC4gKElOQ1kuRVEuMSkpIFRIRU4KKyAgICAgICAgICAgICAgRE8gMTAwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBZKEopID0gWShKKSArIFRFTVAxKkFQKEtLKQorICAgICAgICAgICAgICAgICAgSyA9IEtLICsgMQorICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IEogKyAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWShJKSArIFRFTVAxKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIEFQKEspKlgoSSkKKyAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDkwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBZKEopID0gWShKKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgKE4tSisxKQorICAxMDAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICBKWSA9IEtZCisgICAgICAgICAgICAgIERPIDEyMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSlgpCisgICAgICAgICAgICAgICAgICBURU1QMiA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIFkoSlkpID0gWShKWSkgKyBURU1QMSpBUChLSykKKyAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgIElZID0gSlkKKyAgICAgICAgICAgICAgICAgIERPIDExMCBLID0gS0sgKyAxLEtLICsgTiAtIEoKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBZKElZKSArIFRFTVAxKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIEFQKEspKlgoSVgpCisgIDExMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKWSkgPSBZKEpZKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyAoTi1KKzEpCisgIDEyMCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERTUE1WIC4KKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy9kc3ByLmYgYi9ibGFzL2RzcHIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzhlNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9kc3ByLmYKQEAgLTAsMCArMSwyMDIgQEAKKyAgICAgIFNVQlJPVVRJTkUgRFNQUihVUExPLE4sQUxQSEEsWCxJTkNYLEFQKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBBTFBIQQorICAgICAgSU5URUdFUiBJTkNYLE4KKyAgICAgIENIQVJBQ1RFUiBVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEFQKCopLFgoKikKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICBEU1BSICAgIHBlcmZvcm1zIHRoZSBzeW1tZXRyaWMgcmFuayAxIG9wZXJhdGlvbgorKgorKiAgICAgQSA6PSBhbHBoYSp4KngnICsgQSwKKyoKKyogIHdoZXJlIGFscGhhIGlzIGEgcmVhbCBzY2FsYXIsIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgQSBpcyBhbgorKiAgbiBieSBuIHN5bW1ldHJpYyBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgorKgorKiAgQXJndW1lbnRzCisqICA9PT09PT09PT09CisqCisqICBVUExPICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cHBlciBvciBsb3dlcgorKiAgICAgICAgICAgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBtYXRyaXggQSBpcyBzdXBwbGllZCBpbiB0aGUgcGFja2VkCisqICAgICAgICAgICBhcnJheSBBUCBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBUaGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgaW4gQVAuCisqCisqICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIFRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBpbiBBUC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgTiAgICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFMUEhBICAtIERPVUJMRSBQUkVDSVNJT04uCisqICAgICAgICAgICBPbiBlbnRyeSwgQUxQSEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYWxwaGEuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIERPVUJMRSBQUkVDSVNJT04gYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHZlY3RvciB4LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBJTkNYICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBUCAgICAgLSBET1VCTEUgUFJFQ0lTSU9OIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAoIG4qKCBuICsgMSApICkvMiApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBzeW1tZXRyaWMgbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKQorKiAgICAgICAgICAgYW5kIGEoIDIsIDIgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4gT24gZXhpdCwgdGhlIGFycmF5CisqICAgICAgICAgICBBUCBpcyBvdmVyd3JpdHRlbiBieSB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZQorKiAgICAgICAgICAgdXBkYXRlZCBtYXRyaXguCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeAorKiAgICAgICAgICAgcGFja2VkIHNlcXVlbnRpYWxseSwgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApCisqICAgICAgICAgICBjb250YWlucyBhKCAxLCAxICksIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAyLCAxICkKKyogICAgICAgICAgIGFuZCBhKCAzLCAxICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uIE9uIGV4aXQsIHRoZSBhcnJheQorKiAgICAgICAgICAgQVAgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUKKyogICAgICAgICAgIHVwZGF0ZWQgbWF0cml4LgorKgorKiAgRnVydGhlciBEZXRhaWxzCisqICA9PT09PT09PT09PT09PT0KKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89MC4wRCswKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gVEVNUAorICAgICAgSU5URUdFUiBJLElORk8sSVgsSixKWCxLLEtLLEtYCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqCisqICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorKgorICAgICAgSU5GTyA9IDAKKyAgICAgIElGICguTk9ULkxTQU1FKFVQTE8sJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKFVQTE8sJ0wnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAxCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gMgorICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDUKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdEU1BSICAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGICgoTi5FUS4wKSAuT1IuIChBTFBIQS5FUS5aRVJPKSkgUkVUVVJOCisqCisqICAgICBTZXQgdGhlIHN0YXJ0IHBvaW50IGluIFggaWYgdGhlIGluY3JlbWVudCBpcyBub3QgdW5pdHkuCisqCisgICAgICBJRiAoSU5DWC5MRS4wKSBUSEVOCisgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgRUxTRSBJRiAoSU5DWC5ORS4xKSBUSEVOCisgICAgICAgICAgS1ggPSAxCisgICAgICBFTkQgSUYKKyoKKyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBBUAorKiAgICAgYXJlIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQVAuCisqCisgICAgICBLSyA9IDEKKyAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyoKKyogICAgICAgIEZvcm0gIEEgIHdoZW4gdXBwZXIgdHJpYW5nbGUgaXMgc3RvcmVkIGluIEFQLgorKgorICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgRE8gMjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgSUYgKFgoSikuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBBTFBIQSpYKEopCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsSgorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJKSpURU1QCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgMTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICAyMCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgIERPIDQwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IEFMUEhBKlgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEsgPSBLSyxLSyArIEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKElYKSpURU1QCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAzMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICA0MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRU5EIElGCisgICAgICBFTFNFCisqCisqICAgICAgICBGb3JtICBBICB3aGVuIGxvd2VyIHRyaWFuZ2xlIGlzIHN0b3JlZCBpbiBBUC4KKyoKKyAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgIERPIDYwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGIChYKEopLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSBKLE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVAoSykgPSBBUChLKSArIFgoSSkqVEVNUAorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDUwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgTiAtIEogKyAxCisgICA2MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgIERPIDgwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IEFMUEhBKlgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEsgPSBLSyxLSyArIE4gLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKElYKSpURU1QCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICA3MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBOIC0gSiArIDEKKyAgIDgwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgRFNQUiAgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL2RzcHIyLmYgYi9ibGFzL2RzcHIyLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2YjU0YQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvZHNwcjIuZgpAQCAtMCwwICsxLDIzMyBAQAorICAgICAgU1VCUk9VVElORSBEU1BSMihVUExPLE4sQUxQSEEsWCxJTkNYLFksSU5DWSxBUCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gQUxQSEEKKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLE4KKyAgICAgIENIQVJBQ1RFUiBVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEFQKCopLFgoKiksWSgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIERTUFIyICBwZXJmb3JtcyB0aGUgc3ltbWV0cmljIHJhbmsgMiBvcGVyYXRpb24KKyoKKyogICAgIEEgOj0gYWxwaGEqeCp5JyArIGFscGhhKnkqeCcgKyBBLAorKgorKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuCisqICBuIGJ5IG4gc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwcGVyIG9yIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBBIGlzIHN1cHBsaWVkIGluIHRoZSBwYWNrZWQKKyogICAgICAgICAgIGFycmF5IEFQIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIFRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBpbiBBUC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgVGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQUxQSEEgIC0gRE9VQkxFIFBSRUNJU0lPTi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWCAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIElOQ1ggICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFkgICAgICAtIERPVUJMRSBQUkVDSVNJT04gYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNZICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFkgbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHZlY3RvciB5LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBJTkNZICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1kgc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWS4gSU5DWSBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBUCAgICAgLSBET1VCTEUgUFJFQ0lTSU9OIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAoIG4qKCBuICsgMSApICkvMiApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBzeW1tZXRyaWMgbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKQorKiAgICAgICAgICAgYW5kIGEoIDIsIDIgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4gT24gZXhpdCwgdGhlIGFycmF5CisqICAgICAgICAgICBBUCBpcyBvdmVyd3JpdHRlbiBieSB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZQorKiAgICAgICAgICAgdXBkYXRlZCBtYXRyaXguCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeAorKiAgICAgICAgICAgcGFja2VkIHNlcXVlbnRpYWxseSwgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApCisqICAgICAgICAgICBjb250YWlucyBhKCAxLCAxICksIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAyLCAxICkKKyogICAgICAgICAgIGFuZCBhKCAzLCAxICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uIE9uIGV4aXQsIHRoZSBhcnJheQorKiAgICAgICAgICAgQVAgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUKKyogICAgICAgICAgIHVwZGF0ZWQgbWF0cml4LgorKgorKiAgRnVydGhlciBEZXRhaWxzCisqICA9PT09PT09PT09PT09PT0KKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89MC4wRCswKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gVEVNUDEsVEVNUDIKKyAgICAgIElOVEVHRVIgSSxJTkZPLElYLElZLEosSlgsSlksSyxLSyxLWCxLWQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCBMU0FNRQorICAgICAgRVhURVJOQUwgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgWEVSQkxBCisqICAgICAuLgorKgorKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyoKKyAgICAgIElORk8gPSAwCisgICAgICBJRiAoLk5PVC5MU0FNRShVUExPLCdVJykgLkFORC4gLk5PVC5MU0FNRShVUExPLCdMJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMQorICAgICAgRUxTRSBJRiAoTi5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDIKKyAgICAgIEVMU0UgSUYgKElOQ1guRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA1CisgICAgICBFTFNFIElGIChJTkNZLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNworICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ0RTUFIyICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKChOLkVRLjApIC5PUi4gKEFMUEhBLkVRLlpFUk8pKSBSRVRVUk4KKyoKKyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnRzIGluIFggYW5kIFkgaWYgdGhlIGluY3JlbWVudHMgYXJlIG5vdCBib3RoCisqICAgICB1bml0eS4KKyoKKyAgICAgIElGICgoSU5DWC5ORS4xKSAuT1IuIChJTkNZLk5FLjEpKSBUSEVOCisgICAgICAgICAgSUYgKElOQ1guR1QuMCkgVEhFTgorICAgICAgICAgICAgICBLWCA9IDEKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEtYID0gMSAtIChOLTEpKklOQ1gKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBJRiAoSU5DWS5HVC4wKSBUSEVOCisgICAgICAgICAgICAgIEtZID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgS1kgPSAxIC0gKE4tMSkqSU5DWQorICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICBKWSA9IEtZCisgICAgICBFTkQgSUYKKyoKKyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBBUAorKiAgICAgYXJlIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQVAuCisqCisgICAgICBLSyA9IDEKKyAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyoKKyogICAgICAgIEZvcm0gIEEgIHdoZW4gdXBwZXIgdHJpYW5nbGUgaXMgc3RvcmVkIGluIEFQLgorKgorICAgICAgICAgIElGICgoSU5DWC5FUS4xKSAuQU5ELiAoSU5DWS5FUS4xKSkgVEhFTgorICAgICAgICAgICAgICBETyAyMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoKFgoSikuTkUuWkVSTykgLk9SLiAoWShKKS5ORS5aRVJPKSkgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWShKKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVAoSykgPSBBUChLKSArIFgoSSkqVEVNUDEgKyBZKEkpKlRFTVAyCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgMTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICAyMCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBETyA0MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoKFgoSlgpLk5FLlpFUk8pIC5PUi4gKFkoSlkpLk5FLlpFUk8pKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpZKEpZKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gQUxQSEEqWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBLWQorICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEsgPSBLSyxLSyArIEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKElYKSpURU1QMSArIFkoSVkpKlRFTVAyCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICAzMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgIEpZID0gSlkgKyBJTkNZCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgNDAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgQSAgd2hlbiBsb3dlciB0cmlhbmdsZSBpcyBzdG9yZWQgaW4gQVAuCisqCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDYwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGICgoWChKKS5ORS5aRVJPKSAuT1IuIChZKEopLk5FLlpFUk8pKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpZKEopCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBBTFBIQSpYKEopCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IEosTgorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJKSpURU1QMSArIFkoSSkqVEVNUDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICA1MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIE4gLSBKICsgMQorICAgNjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgRE8gODAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgSUYgKChYKEpYKS5ORS5aRVJPKSAuT1IuIChZKEpZKS5ORS5aRVJPKSkgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWShKWSkKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IEFMUEhBKlgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgICAgIElZID0gSlkKKyAgICAgICAgICAgICAgICAgICAgICBETyA3MCBLID0gS0ssS0sgKyBOIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJWCkqVEVNUDEgKyBZKElZKSpURU1QMgorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgNzAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBKWSA9IEpZICsgSU5DWQorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIE4gLSBKICsgMQorICAgODAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBEU1BSMiAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvZHRibXYuZiBiL2JsYXMvZHRibXYuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdmZmRlCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9kdGJtdi5mCkBAIC0wLDAgKzEsMzM1IEBACisgICAgICBTVUJST1VUSU5FIERUQk1WKFVQTE8sVFJBTlMsRElBRyxOLEssQSxMREEsWCxJTkNYKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiBJTkNYLEssTERBLE4KKyAgICAgIENIQVJBQ1RFUiBESUFHLFRSQU5TLFVQTE8KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gQShMREEsKiksWCgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIERUQk1WICBwZXJmb3JtcyBvbmUgb2YgdGhlIG1hdHJpeC12ZWN0b3Igb3BlcmF0aW9ucworKgorKiAgICAgeCA6PSBBKngsICAgb3IgICB4IDo9IEEnKngsCisqCisqICB3aGVyZSB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kICBBIGlzIGFuIG4gYnkgbiB1bml0LCBvciBub24tdW5pdCwKKyogIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgYmFuZCBtYXRyaXgsIHdpdGggKCBrICsgMSApIGRpYWdvbmFscy4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgbWF0cml4IGlzIGFuIHVwcGVyIG9yCisqICAgICAgICAgICBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBBIGlzIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBBIGlzIGEgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXguCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFRSQU5TICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFRSQU5TIHNwZWNpZmllcyB0aGUgb3BlcmF0aW9uIHRvIGJlIHBlcmZvcm1lZCBhcworKiAgICAgICAgICAgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ04nIG9yICduJyAgIHggOj0gQSp4LgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnVCcgb3IgJ3QnICAgeCA6PSBBJyp4LgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnQycgb3IgJ2MnICAgeCA6PSBBJyp4LgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBESUFHICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBESUFHIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBBIGlzIHVuaXQKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIERJQUcgPSAnVScgb3IgJ3UnICAgQSBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgdHJpYW5ndWxhci4KKyoKKyogICAgICAgICAgICAgIERJQUcgPSAnTicgb3IgJ24nICAgQSBpcyBub3QgYXNzdW1lZCB0byBiZSB1bml0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ3VsYXIuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBLICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgorKiAgICAgICAgICAgc3VwZXItZGlhZ29uYWxzIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE9uIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIEsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YKKyogICAgICAgICAgIHN1Yi1kaWFnb25hbHMgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgSyBtdXN0IHNhdGlzZnkgIDAgLmxlLiBLLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBICAgICAgLSBET1VCTEUgUFJFQ0lTSU9OIGFycmF5IG9mIERJTUVOU0lPTiAoIExEQSwgbiApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdVJyBvciAndScsIHRoZSBsZWFkaW5nICggayArIDEgKQorKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhcgorKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBtYXRyaXggb2YgY29lZmZpY2llbnRzLCBzdXBwbGllZCBjb2x1bW4gYnkKKyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdworKiAgICAgICAgICAgKCBrICsgMSApIG9mIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1cGVyLWRpYWdvbmFsIHN0YXJ0aW5nIGF0CisqICAgICAgICAgICBwb3NpdGlvbiAyIGluIHJvdyBrLCBhbmQgc28gb24uIFRoZSB0b3AgbGVmdCBrIGJ5IGsgdHJpYW5nbGUKKyogICAgICAgICAgIG9mIHRoZSBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLgorKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciBhbiB1cHBlcgorKiAgICAgICAgICAgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbCBmdWxsIG1hdHJpeCBzdG9yYWdlCisqICAgICAgICAgICB0byBiYW5kIHN0b3JhZ2U6CisqCisqICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4KKyogICAgICAgICAgICAgICAgICAgIE0gPSBLICsgMSAtIEoKKyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gTUFYKCAxLCBKIC0gSyApLCBKCisqICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkKKyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFCisqICAgICAgICAgICAgICAyMCBDT05USU5VRQorKgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBsZWFkaW5nICggayArIDEgKQorKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhcgorKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBtYXRyaXggb2YgY29lZmZpY2llbnRzLCBzdXBwbGllZCBjb2x1bW4gYnkKKyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdyAxIG9mCisqICAgICAgICAgICB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdWItZGlhZ29uYWwgc3RhcnRpbmcgYXQgcG9zaXRpb24gMSBpbgorKiAgICAgICAgICAgcm93IDIsIGFuZCBzbyBvbi4gVGhlIGJvdHRvbSByaWdodCBrIGJ5IGsgdHJpYW5nbGUgb2YgdGhlCisqICAgICAgICAgICBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLgorKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciBhIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIGJhbmQgbWF0cml4IGZyb20gY29udmVudGlvbmFsIGZ1bGwgbWF0cml4IHN0b3JhZ2UKKyogICAgICAgICAgIHRvIGJhbmQgc3RvcmFnZToKKyoKKyogICAgICAgICAgICAgICAgIERPIDIwLCBKID0gMSwgTgorKiAgICAgICAgICAgICAgICAgICAgTSA9IDEgLSBKCisqICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IEosIE1JTiggTiwgSiArIEsgKQorKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApCisqICAgICAgICAgICAgICAxMCAgICBDT05USU5VRQorKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUKKyoKKyogICAgICAgICAgIE5vdGUgdGhhdCB3aGVuIERJQUcgPSAnVScgb3IgJ3UnIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQQorKiAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZGlhZ29uYWwgZWxlbWVudHMgb2YgdGhlIG1hdHJpeCBhcmUgbm90CisqICAgICAgICAgICByZWZlcmVuY2VkLCBidXQgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdHkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIExEQSAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTERBIHNwZWNpZmllcyB0aGUgZmlyc3QgZGltZW5zaW9uIG9mIEEgYXMgZGVjbGFyZWQKKyogICAgICAgICAgIGluIHRoZSBjYWxsaW5nIChzdWIpIHByb2dyYW0uIExEQSBtdXN0IGJlIGF0IGxlYXN0CisqICAgICAgICAgICAoIGsgKyAxICkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIERPVUJMRSBQUkVDSVNJT04gYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHZlY3RvciB4LiBPbiBleGl0LCBYIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlCisqICAgICAgICAgICB0cmFuZm9ybWVkIHZlY3RvciB4LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRnVydGhlciBEZXRhaWxzCisqICA9PT09PT09PT09PT09PT0KKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89MC4wRCswKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gVEVNUAorICAgICAgSU5URUdFUiBJLElORk8sSVgsSixKWCxLUExVUzEsS1gsTAorICAgICAgTE9HSUNBTCBOT1VOSVQKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgTFNBTUUKKyAgICAgIEVYVEVSTkFMIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMIFhFUkJMQQorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyBNQVgsTUlOCisqICAgICAuLgorKgorKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyoKKyAgICAgIElORk8gPSAwCisgICAgICBJRiAoLk5PVC5MU0FNRShVUExPLCdVJykgLkFORC4gLk5PVC5MU0FNRShVUExPLCdMJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMQorICAgICAgRUxTRSBJRiAoLk5PVC5MU0FNRShUUkFOUywnTicpIC5BTkQuIC5OT1QuTFNBTUUoVFJBTlMsJ1QnKSAuQU5ELgorICAgICArICAgICAgICAgLk5PVC5MU0FNRShUUkFOUywnQycpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDIKKyAgICAgIEVMU0UgSUYgKC5OT1QuTFNBTUUoRElBRywnVScpIC5BTkQuIC5OT1QuTFNBTUUoRElBRywnTicpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDMKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA0CisgICAgICBFTFNFIElGIChLLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNQorICAgICAgRUxTRSBJRiAoTERBLkxULiAoSysxKSkgVEhFTgorICAgICAgICAgIElORk8gPSA3CisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gOQorICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ0RUQk1WICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKE4uRVEuMCkgUkVUVVJOCisqCisgICAgICBOT1VOSVQgPSBMU0FNRShESUFHLCdOJykKKyoKKyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnQgaW4gWCBpZiB0aGUgaW5jcmVtZW50IGlzIG5vdCB1bml0eS4gVGhpcworKiAgICAgd2lsbCBiZSAgKCBOIC0gMSApKklOQ1ggICB0b28gc21hbGwgZm9yIGRlc2NlbmRpbmcgbG9vcHMuCisqCisgICAgICBJRiAoSU5DWC5MRS4wKSBUSEVOCisgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgRUxTRSBJRiAoSU5DWC5ORS4xKSBUSEVOCisgICAgICAgICAgS1ggPSAxCisgICAgICBFTkQgSUYKKyoKKyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIEEgYXJlCisqICAgICBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEEuCisqCisgICAgICBJRiAoTFNBTUUoVFJBTlMsJ04nKSkgVEhFTgorKgorKiAgICAgICAgIEZvcm0gIHggOj0gQSp4LgorKgorICAgICAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyAgICAgICAgICAgICAgS1BMVVMxID0gSyArIDEKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEopLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTCA9IEtQTFVTMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IE1BWCgxLEotSyksSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSSkgPSBYKEkpICsgVEVNUCpBKEwrSSxKKQorICAgMTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEopID0gWChKKSpBKEtQTFVTMSxKKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gNDAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgICAgIEwgPSBLUExVUzEgLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSBNQVgoMSxKLUspLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKElYKSA9IFgoSVgpICsgVEVNUCpBKEwrSSxKKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgIDMwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKWCkgPSBYKEpYKSpBKEtQTFVTMSxKKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgSUYgKEouR1QuSykgS1ggPSBLWCArIElOQ1gKKyAgIDQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gNjAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEopLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTCA9IDEgLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSBNSU4oTixKK0spLEogKyAxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKEkpID0gWChJKSArIFRFTVAqQShMK0ksSikKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikqQSgxLEopCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICA2MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gODAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgICAgIEwgPSAxIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBJID0gTUlOKE4sSitLKSxKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJWCkgPSBYKElYKSArIFRFTVAqQShMK0ksSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgICA3MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSlgpID0gWChKWCkqQSgxLEopCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoKE4tSikuR0UuSykgS1ggPSBLWCAtIElOQ1gKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgeCA6PSBBJyp4LgorKgorICAgICAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyAgICAgICAgICAgICAgS1BMVVMxID0gSyArIDEKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMTAwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgIEwgPSBLUExVUzEgLSBKCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQShLUExVUzEsSikKKyAgICAgICAgICAgICAgICAgICAgICBETyA5MCBJID0gSiAtIDEsTUFYKDEsSi1LKSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEEoTCtJLEopKlgoSSkKKyAgIDkwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIFgoSikgPSBURU1QCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMTIwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBLWCA9IEtYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkEoS1BMVVMxLEopCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTEwIEkgPSBKIC0gMSxNQVgoMSxKLUspLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgQShMK0ksSikqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCAtIElOQ1gKKyAgMTEwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIFgoSlgpID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggLSBJTkNYCisgIDEyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDE0MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBMID0gMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpBKDEsSikKKyAgICAgICAgICAgICAgICAgICAgICBETyAxMzAgSSA9IEogKyAxLE1JTihOLEorSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBBKEwrSSxKKSpYKEkpCisgIDEzMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBYKEopID0gVEVNUAorICAxNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMTYwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICBMID0gMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpBKDEsSikKKyAgICAgICAgICAgICAgICAgICAgICBETyAxNTAgSSA9IEogKyAxLE1JTihOLEorSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBBKEwrSSxKKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAxNTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgWChKWCkgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgMTYwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBEVEJNViAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvZHRwbXYuZiBiL2JsYXMvZHRwbXYuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJjMTEyCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9kdHBtdi5mCkBAIC0wLDAgKzEsMjkzIEBACisgICAgICBTVUJST1VUSU5FIERUUE1WKFVQTE8sVFJBTlMsRElBRyxOLEFQLFgsSU5DWCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgSU5DWCxOCisgICAgICBDSEFSQUNURVIgRElBRyxUUkFOUyxVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEFQKCopLFgoKikKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICBEVFBNViAgcGVyZm9ybXMgb25lIG9mIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbnMKKyoKKyogICAgIHggOj0gQSp4LCAgIG9yICAgeCA6PSBBJyp4LAorKgorKiAgd2hlcmUgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCAgQSBpcyBhbiBuIGJ5IG4gdW5pdCwgb3Igbm9uLXVuaXQsCisqICB1cHBlciBvciBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdHJpeCBpcyBhbiB1cHBlciBvcgorKiAgICAgICAgICAgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgQSBpcyBhbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgQSBpcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBUUkFOUyAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBUUkFOUyBzcGVjaWZpZXMgdGhlIG9wZXJhdGlvbiB0byBiZSBwZXJmb3JtZWQgYXMKKyogICAgICAgICAgIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdOJyBvciAnbicgICB4IDo9IEEqeC4KKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ1QnIG9yICd0JyAgIHggOj0gQScqeC4KKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ0MnIG9yICdjJyAgIHggOj0gQScqeC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRElBRyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgRElBRyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgQSBpcyB1bml0CisqICAgICAgICAgICB0cmlhbmd1bGFyIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBESUFHID0gJ1UnIG9yICd1JyAgIEEgaXMgYXNzdW1lZCB0byBiZSB1bml0IHRyaWFuZ3VsYXIuCisqCisqICAgICAgICAgICAgICBESUFHID0gJ04nIG9yICduJyAgIEEgaXMgbm90IGFzc3VtZWQgdG8gYmUgdW5pdAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbmd1bGFyLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQVAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoICBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IHBhY2tlZCBzZXF1ZW50aWFsbHksCisqICAgICAgICAgICBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkgY29udGFpbnMgYSggMSwgMSApLAorKiAgICAgICAgICAgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKSBhbmQgYSggMiwgMiApCisqICAgICAgICAgICByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggcGFja2VkIHNlcXVlbnRpYWxseSwKKyogICAgICAgICAgIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSBjb250YWlucyBhKCAxLCAxICksCisqICAgICAgICAgICBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMiwgMSApIGFuZCBhKCAzLCAxICkKKyogICAgICAgICAgIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLgorKiAgICAgICAgICAgTm90ZSB0aGF0IHdoZW4gIERJQUcgPSAnVScgb3IgJ3UnLCB0aGUgZGlhZ29uYWwgZWxlbWVudHMgb2YKKyogICAgICAgICAgIEEgYXJlIG5vdCByZWZlcmVuY2VkLCBidXQgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdHkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIERPVUJMRSBQUkVDSVNJT04gYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHZlY3RvciB4LiBPbiBleGl0LCBYIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlCisqICAgICAgICAgICB0cmFuZm9ybWVkIHZlY3RvciB4LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRnVydGhlciBEZXRhaWxzCisqICA9PT09PT09PT09PT09PT0KKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89MC4wRCswKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gVEVNUAorICAgICAgSU5URUdFUiBJLElORk8sSVgsSixKWCxLLEtLLEtYCisgICAgICBMT0dJQ0FMIE5PVU5JVAorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCBMU0FNRQorICAgICAgRVhURVJOQUwgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgWEVSQkxBCisqICAgICAuLgorKgorKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyoKKyAgICAgIElORk8gPSAwCisgICAgICBJRiAoLk5PVC5MU0FNRShVUExPLCdVJykgLkFORC4gLk5PVC5MU0FNRShVUExPLCdMJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMQorICAgICAgRUxTRSBJRiAoLk5PVC5MU0FNRShUUkFOUywnTicpIC5BTkQuIC5OT1QuTFNBTUUoVFJBTlMsJ1QnKSAuQU5ELgorICAgICArICAgICAgICAgLk5PVC5MU0FNRShUUkFOUywnQycpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDIKKyAgICAgIEVMU0UgSUYgKC5OT1QuTFNBTUUoRElBRywnVScpIC5BTkQuIC5OT1QuTFNBTUUoRElBRywnTicpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDMKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA0CisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNworICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ0RUUE1WICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKE4uRVEuMCkgUkVUVVJOCisqCisgICAgICBOT1VOSVQgPSBMU0FNRShESUFHLCdOJykKKyoKKyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnQgaW4gWCBpZiB0aGUgaW5jcmVtZW50IGlzIG5vdCB1bml0eS4gVGhpcworKiAgICAgd2lsbCBiZSAgKCBOIC0gMSApKklOQ1ggIHRvbyBzbWFsbCBmb3IgZGVzY2VuZGluZyBsb29wcy4KKyoKKyAgICAgIElGIChJTkNYLkxFLjApIFRIRU4KKyAgICAgICAgICBLWCA9IDEgLSAoTi0xKSpJTkNYCisgICAgICBFTFNFIElGIChJTkNYLk5FLjEpIFRIRU4KKyAgICAgICAgICBLWCA9IDEKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgQVAgYXJlCisqICAgICBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEFQLgorKgorICAgICAgSUYgKExTQU1FKFRSQU5TLCdOJykpIFRIRU4KKyoKKyogICAgICAgIEZvcm0gIHg6PSBBKnguCisqCisgICAgICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorICAgICAgICAgICAgICBLSyA9IDEKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEopLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKEkpID0gWChJKSArIFRFTVAqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgMTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEopID0gWChKKSpBUChLSytKLTEpCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIEoKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDQwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBLID0gS0ssS0sgKyBKIC0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJWCkgPSBYKElYKSArIFRFTVAqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAzMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSlgpID0gWChKWCkqQVAoS0srSi0xKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIEoKKyAgIDQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgS0sgPSAoTiogKE4rMSkpLzIKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gNjAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEopLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSBOLEogKyAxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKEkpID0gWChJKSArIFRFTVAqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLIC0gMQorICAgNTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEopID0gWChKKSpBUChLSy1OK0opCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyAtIChOLUorMSkKKyAgIDYwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEtYID0gS1ggKyAoTi0xKSpJTkNYCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyA4MCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSyA9IEtLLEtLIC0gKE4tIChKKzEpKSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJWCkgPSBYKElYKSArIFRFTVAqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgICA3MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSlgpID0gWChKWCkqQVAoS0stTitKKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyAtIChOLUorMSkKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgeCA6PSBBJyp4LgorKgorICAgICAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyAgICAgICAgICAgICAgS0sgPSAoTiogKE4rMSkpLzIKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMTAwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkFQKEtLKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSyAtIDEKKyAgICAgICAgICAgICAgICAgICAgICBETyA5MCBJID0gSiAtIDEsMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEFQKEspKlgoSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgLSAxCisgICA5MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBYKEopID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSBKCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgRE8gMTIwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTEwIEsgPSBLSyAtIDEsS0sgLSBKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEFQKEspKlgoSVgpCisgIDExMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSBKCisgIDEyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEtLID0gMQorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxNDAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLICsgMQorICAgICAgICAgICAgICAgICAgICAgIERPIDEzMCBJID0gSiArIDEsTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEFQKEspKlgoSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgIDEzMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBYKEopID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyAoTi1KKzEpCisgIDE0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyAxNjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpBUChLSykKKyAgICAgICAgICAgICAgICAgICAgICBETyAxNTAgSyA9IEtLICsgMSxLSyArIE4gLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgQVAoSykqWChJWCkKKyAgMTUwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIFgoSlgpID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgMTYwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBEVFBNViAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvZHRwc3YuZiBiL2JsYXMvZHRwc3YuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2U1OGQzCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9kdHBzdi5mCkBAIC0wLDAgKzEsMjk2IEBACisgICAgICBTVUJST1VUSU5FIERUUFNWKFVQTE8sVFJBTlMsRElBRyxOLEFQLFgsSU5DWCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgSU5DWCxOCisgICAgICBDSEFSQUNURVIgRElBRyxUUkFOUyxVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEFQKCopLFgoKikKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICBEVFBTViAgc29sdmVzIG9uZSBvZiB0aGUgc3lzdGVtcyBvZiBlcXVhdGlvbnMKKyoKKyogICAgIEEqeCA9IGIsICAgb3IgICBBJyp4ID0gYiwKKyoKKyogIHdoZXJlIGIgYW5kIHggYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuIG4gYnkgbiB1bml0LCBvcgorKiAgbm9uLXVuaXQsIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyoKKyogIE5vIHRlc3QgZm9yIHNpbmd1bGFyaXR5IG9yIG5lYXItc2luZ3VsYXJpdHkgaXMgaW5jbHVkZWQgaW4gdGhpcworKiAgcm91dGluZS4gU3VjaCB0ZXN0cyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdHJpeCBpcyBhbiB1cHBlciBvcgorKiAgICAgICAgICAgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgQSBpcyBhbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgQSBpcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBUUkFOUyAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBUUkFOUyBzcGVjaWZpZXMgdGhlIGVxdWF0aW9ucyB0byBiZSBzb2x2ZWQgYXMKKyogICAgICAgICAgIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdOJyBvciAnbicgICBBKnggPSBiLgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnVCcgb3IgJ3QnICAgQScqeCA9IGIuCisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdDJyBvciAnYycgICBBJyp4ID0gYi4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRElBRyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgRElBRyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgQSBpcyB1bml0CisqICAgICAgICAgICB0cmlhbmd1bGFyIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBESUFHID0gJ1UnIG9yICd1JyAgIEEgaXMgYXNzdW1lZCB0byBiZSB1bml0IHRyaWFuZ3VsYXIuCisqCisqICAgICAgICAgICAgICBESUFHID0gJ04nIG9yICduJyAgIEEgaXMgbm90IGFzc3VtZWQgdG8gYmUgdW5pdAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbmd1bGFyLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQVAgICAgIC0gRE9VQkxFIFBSRUNJU0lPTiBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoICBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IHBhY2tlZCBzZXF1ZW50aWFsbHksCisqICAgICAgICAgICBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkgY29udGFpbnMgYSggMSwgMSApLAorKiAgICAgICAgICAgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKSBhbmQgYSggMiwgMiApCisqICAgICAgICAgICByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggcGFja2VkIHNlcXVlbnRpYWxseSwKKyogICAgICAgICAgIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSBjb250YWlucyBhKCAxLCAxICksCisqICAgICAgICAgICBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMiwgMSApIGFuZCBhKCAzLCAxICkKKyogICAgICAgICAgIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLgorKiAgICAgICAgICAgTm90ZSB0aGF0IHdoZW4gIERJQUcgPSAnVScgb3IgJ3UnLCB0aGUgZGlhZ29uYWwgZWxlbWVudHMgb2YKKyogICAgICAgICAgIEEgYXJlIG5vdCByZWZlcmVuY2VkLCBidXQgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdHkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIERPVUJMRSBQUkVDSVNJT04gYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHJpZ2h0LWhhbmQgc2lkZSB2ZWN0b3IgYi4gT24gZXhpdCwgWCBpcyBvdmVyd3JpdHRlbgorKiAgICAgICAgICAgd2l0aCB0aGUgc29sdXRpb24gdmVjdG9yIHguCisqCisqICBJTkNYICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoWkVSTz0wLjBEKzApCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBURU1QCisgICAgICBJTlRFR0VSIEksSU5GTyxJWCxKLEpYLEssS0ssS1gKKyAgICAgIExPR0lDQUwgTk9VTklUCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqCisqICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorKgorICAgICAgSU5GTyA9IDAKKyAgICAgIElGICguTk9ULkxTQU1FKFVQTE8sJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKFVQTE8sJ0wnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAxCisgICAgICBFTFNFIElGICguTk9ULkxTQU1FKFRSQU5TLCdOJykgLkFORC4gLk5PVC5MU0FNRShUUkFOUywnVCcpIC5BTkQuCisgICAgICsgICAgICAgICAuTk9ULkxTQU1FKFRSQU5TLCdDJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMgorICAgICAgRUxTRSBJRiAoLk5PVC5MU0FNRShESUFHLCdVJykgLkFORC4gLk5PVC5MU0FNRShESUFHLCdOJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMworICAgICAgRUxTRSBJRiAoTi5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDQKKyAgICAgIEVMU0UgSUYgKElOQ1guRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA3CisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkZPLk5FLjApIFRIRU4KKyAgICAgICAgICBDQUxMIFhFUkJMQSgnRFRQU1YgJyxJTkZPKQorICAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuCisqCisgICAgICBJRiAoTi5FUS4wKSBSRVRVUk4KKyoKKyAgICAgIE5PVU5JVCA9IExTQU1FKERJQUcsJ04nKQorKgorKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludCBpbiBYIGlmIHRoZSBpbmNyZW1lbnQgaXMgbm90IHVuaXR5LiBUaGlzCisqICAgICB3aWxsIGJlICAoIE4gLSAxICkqSU5DWCAgdG9vIHNtYWxsIGZvciBkZXNjZW5kaW5nIGxvb3BzLgorKgorICAgICAgSUYgKElOQ1guTEUuMCkgVEhFTgorICAgICAgICAgIEtYID0gMSAtIChOLTEpKklOQ1gKKyAgICAgIEVMU0UgSUYgKElOQ1guTkUuMSkgVEhFTgorICAgICAgICAgIEtYID0gMQorICAgICAgRU5EIElGCisqCisqICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiBBUCBhcmUKKyogICAgIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQVAuCisqCisgICAgICBJRiAoTFNBTUUoVFJBTlMsJ04nKSkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgeCA6PSBpbnYoIEEgKSp4LgorKgorICAgICAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyAgICAgICAgICAgICAgS0sgPSAoTiogKE4rMSkpLzIKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMjAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEopLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikvQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSyAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IEogLSAxLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSSkgPSBYKEkpIC0gVEVNUCpBUChLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgLSAxCisgICAxMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyAtIEoKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEpYID0gS1ggKyAoTi0xKSpJTkNYCisgICAgICAgICAgICAgICAgICBETyA0MCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKWCkgPSBYKEpYKS9BUChLSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSyA9IEtLIC0gMSxLSyAtIEogKyAxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJWCkgPSBYKElYKSAtIFRFTVAqQVAoSykKKyAgIDMwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSBKCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEtLID0gMQorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyA2MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSikuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEopID0gWChKKS9BUChLSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gSiArIDEsTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJKSA9IFgoSSkgLSBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgKE4tSisxKQorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gODAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSlgpID0gWChKWCkvQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEsgPSBLSyArIDEsS0sgKyBOIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgLSBURU1QKkFQKEspCisgICA3MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgKE4tSisxKQorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIElGCisgICAgICBFTFNFCisqCisqICAgICAgICBGb3JtICB4IDo9IGludiggQScgKSp4LgorKgorICAgICAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyAgICAgICAgICAgICAgS0sgPSAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDEwMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgICAgICBETyA5MCBJID0gMSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCAtIEFQKEspKlgoSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICA5MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUC9BUChLSytKLTEpCisgICAgICAgICAgICAgICAgICAgICAgWChKKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAxMDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMTIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTEwIEsgPSBLSyxLSyArIEogLSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QIC0gQVAoSykqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgMTEwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0FQKEtLK0otMSkKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgIDEyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEtLID0gKE4qIChOKzEpKS8yCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDE0MCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgICAgICBETyAxMzAgSSA9IE4sSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgLSBBUChLKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLIC0gMQorICAxMzAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAvQVAoS0stTitKKQorICAgICAgICAgICAgICAgICAgICAgIFgoSikgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyAtIChOLUorMSkKKyAgMTQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEtYID0gS1ggKyAoTi0xKSpJTkNYCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyAxNjAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICBETyAxNTAgSyA9IEtLLEtLIC0gKE4tIChKKzEpKSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCAtIEFQKEspKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgIDE1MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUC9BUChLSy1OK0opCisgICAgICAgICAgICAgICAgICAgICAgWChKWCkgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gKE4tSisxKQorICAxNjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERUUFNWIC4KKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy9sZXZlbDFfY3BseF9pbXBsLmggYi9ibGFzL2xldmVsMV9jcGx4X2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDZiOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9sZXZlbDFfY3BseF9pbXBsLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK3N0cnVjdCBzY2FsYXJfbm9ybTFfb3AgeworICB0eXBlZGVmIFJlYWxTY2FsYXIgcmVzdWx0X3R5cGU7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKHNjYWxhcl9ub3JtMV9vcCkKKyAgaW5saW5lIFJlYWxTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6bm9ybTEoYSk7IH0KK307CituYW1lc3BhY2UgRWlnZW4geworICBuYW1lc3BhY2UgaW50ZXJuYWwgeworICAgIHRlbXBsYXRlPD4gc3RydWN0IGZ1bmN0b3JfdHJhaXRzPHNjYWxhcl9ub3JtMV9vcCA+CisgICAgeworICAgICAgZW51bSB7IENvc3QgPSAzICogTnVtVHJhaXRzPFNjYWxhcj46OkFkZENvc3QsIFBhY2tldEFjY2VzcyA9IDAgfTsKKyAgICB9OworICB9Cit9CisKKy8vIGNvbXB1dGVzIHRoZSBzdW0gb2YgbWFnbml0dWRlcyBvZiBhbGwgdmVjdG9yIGVsZW1lbnRzIG9yLCBmb3IgYSBjb21wbGV4IHZlY3RvciB4LCB0aGUgc3VtCisvLyByZXMgPSB8UmV4MXwgKyB8SW14MXwgKyB8UmV4MnwgKyB8SW14MnwgKyAuLi4gKyB8UmV4bnwgKyB8SW14bnwsIHdoZXJlIHggaXMgYSB2ZWN0b3Igb2Ygb3JkZXIgbgorUmVhbFNjYWxhciBFSUdFTl9DQVQoRUlHRU5fQ0FUKFJFQUxfU0NBTEFSX1NVRkZJWCxTQ0FMQVJfU1VGRklYKSxhc3VtXykoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KQoreworLy8gICBzdGQ6OmNlcnIgPDwgIl9fYXN1bSAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiXG4iOworICBDb21wbGV4KiB4ID0gcmVpbnRlcnByZXRfY2FzdDxDb21wbGV4Kj4ocHgpOworCisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBpZigqaW5jeD09MSkgIHJldHVybiB2ZWN0b3IoeCwqbikudW5hcnlFeHByPHNjYWxhcl9ub3JtMV9vcD4oKS5zdW0oKTsKKyAgZWxzZSAgICAgICAgICByZXR1cm4gdmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKS51bmFyeUV4cHI8c2NhbGFyX25vcm0xX29wPigpLnN1bSgpOworfQorCisvLyBjb21wdXRlcyBhIGRvdCBwcm9kdWN0IG9mIGEgY29uanVnYXRlZCB2ZWN0b3Igd2l0aCBhbm90aGVyIHZlY3Rvci4KK2ludCBFSUdFTl9CTEFTX0ZVTkMoZG90Y3cpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciogcHJlcykKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJfZG90YyAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiICIgPDwgKmluY3kgPDwgIlxuIjsKKworICBpZigqbjw9MCkgcmV0dXJuIDA7CisKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIqIHJlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHJlcyk7CisKKyAgaWYoKmluY3g9PTEgJiYgKmluY3k9PTEpICAgICpyZXMgPSAodmVjdG9yKHgsKm4pLmRvdCh2ZWN0b3IoeSwqbikpKTsKKyAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PjApICpyZXMgPSAodmVjdG9yKHgsKm4sKmluY3gpLmRvdCh2ZWN0b3IoeSwqbiwqaW5jeSkpKTsKKyAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PjApICpyZXMgPSAodmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuZG90KHZlY3Rvcih5LCpuLCppbmN5KSkpOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k8MCkgKnJlcyA9ICh2ZWN0b3IoeCwqbiwqaW5jeCkuZG90KHZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpKSk7CisgIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeTwwKSAqcmVzID0gKHZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpLmRvdCh2ZWN0b3IoeSwqbiwtKmluY3kpLnJldmVyc2UoKSkpOworICByZXR1cm4gMDsKK30KKworLy8gY29tcHV0ZXMgYSB2ZWN0b3ItdmVjdG9yIGRvdCBwcm9kdWN0IHdpdGhvdXQgY29tcGxleCBjb25qdWdhdGlvbi4KK2ludCBFSUdFTl9CTEFTX0ZVTkMoZG90dXcpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciogcHJlcykKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJfZG90dSAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiICIgPDwgKmluY3kgPDwgIlxuIjsKKworICBpZigqbjw9MCkgcmV0dXJuIDA7CisKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIqIHJlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHJlcyk7CisKKyAgaWYoKmluY3g9PTEgJiYgKmluY3k9PTEpICAgICpyZXMgPSAodmVjdG9yKHgsKm4pLmN3aXNlUHJvZHVjdCh2ZWN0b3IoeSwqbikpKS5zdW0oKTsKKyAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PjApICpyZXMgPSAodmVjdG9yKHgsKm4sKmluY3gpLmN3aXNlUHJvZHVjdCh2ZWN0b3IoeSwqbiwqaW5jeSkpKS5zdW0oKTsKKyAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PjApICpyZXMgPSAodmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuY3dpc2VQcm9kdWN0KHZlY3Rvcih5LCpuLCppbmN5KSkpLnN1bSgpOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k8MCkgKnJlcyA9ICh2ZWN0b3IoeCwqbiwqaW5jeCkuY3dpc2VQcm9kdWN0KHZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpKSkuc3VtKCk7CisgIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeTwwKSAqcmVzID0gKHZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdCh2ZWN0b3IoeSwqbiwtKmluY3kpLnJldmVyc2UoKSkpLnN1bSgpOworICByZXR1cm4gMDsKK30KKworUmVhbFNjYWxhciBFSUdFTl9DQVQoRUlHRU5fQ0FUKFJFQUxfU0NBTEFSX1NVRkZJWCxTQ0FMQVJfU1VGRklYKSxucm0yXykoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KQoreworLy8gICBzdGQ6OmNlcnIgPDwgIl9fbnJtMiAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiXG4iOworICBpZigqbjw9MCkgcmV0dXJuIDA7CisKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisKKyAgaWYoKmluY3g9PTEpCisgICAgcmV0dXJuIHZlY3Rvcih4LCpuKS5zdGFibGVOb3JtKCk7CisKKyAgcmV0dXJuIHZlY3Rvcih4LCpuLCppbmN4KS5zdGFibGVOb3JtKCk7Cit9CisKK2ludCBFSUdFTl9DQVQoRUlHRU5fQ0FUKFNDQUxBUl9TVUZGSVgsUkVBTF9TQ0FMQVJfU1VGRklYKSxyb3RfKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKnBjLCBSZWFsU2NhbGFyICpwcykKK3sKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgUmVhbFNjYWxhciBjID0gKnBjOworICBSZWFsU2NhbGFyIHMgPSAqcHM7CisKKyAgU3RyaWRlZFZlY3RvclR5cGUgdngodmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKSk7CisgIFN0cmlkZWRWZWN0b3JUeXBlIHZ5KHZlY3Rvcih5LCpuLHN0ZDo6YWJzKCppbmN5KSkpOworCisgIFJldmVyc2U8U3RyaWRlZFZlY3RvclR5cGU+IHJ2eCh2eCk7CisgIFJldmVyc2U8U3RyaWRlZFZlY3RvclR5cGU+IHJ2eSh2eSk7CisKKyAgLy8gVE9ETyBpbXBsZW1lbnQgbWl4ZWQgcmVhbC1zY2FsYXIgcm90YXRpb25zCisgICAgICAgaWYoKmluY3g8MCAmJiAqaW5jeT4wKSBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHJ2eCwgdnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYyxzKSk7CisgIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeTwwKSBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHZ4LCBydnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYyxzKSk7CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHZ4LCB2eSwgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYyxzKSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFSUdFTl9DQVQoRUlHRU5fQ0FUKFNDQUxBUl9TVUZGSVgsUkVBTF9TQ0FMQVJfU1VGRklYKSxzY2FsXykoaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgUmVhbFNjYWxhciBhbHBoYSA9ICpwYWxwaGE7CisKKy8vICAgc3RkOjpjZXJyIDw8ICJfX3NjYWwgIiA8PCAqbiA8PCAiICIgPDwgYWxwaGEgPDwgIiAiIDw8ICppbmN4IDw8ICJcbiI7CisKKyAgaWYoKmluY3g9PTEpICB2ZWN0b3IoeCwqbikgKj0gYWxwaGE7CisgIGVsc2UgICAgICAgICAgdmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKSAqPSBhbHBoYTsKKworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYmxhcy9sZXZlbDFfaW1wbC5oIGIvYmxhcy9sZXZlbDFfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZWEyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2xldmVsMV9pbXBsLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK2ludCBFSUdFTl9CTEFTX0ZVTkMoYXhweSkoaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3kpCit7CisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyIGFscGhhICA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIGlmKCppbmN4PT0xICYmICppbmN5PT0xKSAgICB2ZWN0b3IoeSwqbikgKz0gYWxwaGEgKiB2ZWN0b3IoeCwqbik7CisgIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeT4wKSB2ZWN0b3IoeSwqbiwqaW5jeSkgKz0gYWxwaGEgKiB2ZWN0b3IoeCwqbiwqaW5jeCk7CisgIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeTwwKSB2ZWN0b3IoeSwqbiwtKmluY3kpLnJldmVyc2UoKSArPSBhbHBoYSAqIHZlY3Rvcih4LCpuLCppbmN4KTsKKyAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PjApIHZlY3Rvcih5LCpuLCppbmN5KSArPSBhbHBoYSAqIHZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpOworICBlbHNlIGlmKCppbmN4PDAgJiYgKmluY3k8MCkgdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkgKz0gYWxwaGEgKiB2ZWN0b3IoeCwqbiwtKmluY3gpLnJldmVyc2UoKTsKKworICByZXR1cm4gMDsKK30KKworaW50IEVJR0VOX0JMQVNfRlVOQyhjb3B5KShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3kpCit7CisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisKKyAgLy8gYmUgY2FyZWZ1bGwsICppbmN4PT0wIGlzIGFsbG93ZWQgISEKKyAgaWYoKmluY3g9PTEgJiYgKmluY3k9PTEpCisgICAgdmVjdG9yKHksKm4pID0gdmVjdG9yKHgsKm4pOworICBlbHNlCisgIHsKKyAgICBpZigqaW5jeDwwKSB4ID0geCAtICgqbi0xKSooKmluY3gpOworICAgIGlmKCppbmN5PDApIHkgPSB5IC0gKCpuLTEpKigqaW5jeSk7CisgICAgZm9yKGludCBpPTA7aTwqbjsrK2kpCisgICAgeworICAgICAgKnkgPSAqeDsKKyAgICAgIHggKz0gKmluY3g7CisgICAgICB5ICs9ICppbmN5OworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitpbnQgRUlHRU5fQ0FUKEVJR0VOX0NBVChpLFNDQUxBUl9TVUZGSVgpLGFtYXhfKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisKKyAgRGVuc2VJbmRleCByZXQ7CisgIGlmKCppbmN4PT0xKSAgdmVjdG9yKHgsKm4pLmN3aXNlQWJzKCkubWF4Q29lZmYoJnJldCk7CisgIGVsc2UgICAgICAgICAgdmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKS5jd2lzZUFicygpLm1heENvZWZmKCZyZXQpOworICByZXR1cm4gcmV0KzE7Cit9CisKK2ludCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGksU0NBTEFSX1NVRkZJWCksYW1pbl8pKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKK3sKKyAgaWYoKm48PTApIHJldHVybiAwOworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgCisgIERlbnNlSW5kZXggcmV0OworICBpZigqaW5jeD09MSkgIHZlY3Rvcih4LCpuKS5jd2lzZUFicygpLm1pbkNvZWZmKCZyZXQpOworICBlbHNlICAgICAgICAgIHZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkuY3dpc2VBYnMoKS5taW5Db2VmZigmcmV0KTsKKyAgcmV0dXJuIHJldCsxOworfQorCitpbnQgRUlHRU5fQkxBU19GVU5DKHJvdGcpKFJlYWxTY2FsYXIgKnBhLCBSZWFsU2NhbGFyICpwYiwgUmVhbFNjYWxhciAqcGMsIFJlYWxTY2FsYXIgKnBzKQoreworICBTY2FsYXImIGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciYgYiA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiKTsKKyAgUmVhbFNjYWxhciogYyA9IHBjOworICBTY2FsYXIqIHMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBzKTsKKworICAjaWYgIUlTQ09NUExFWAorICBTY2FsYXIgcix6OworICBTY2FsYXIgYWEgPSBpbnRlcm5hbDo6YWJzKGEpOworICBTY2FsYXIgYWIgPSBpbnRlcm5hbDo6YWJzKGIpOworICBpZigoYWErYWIpPT1TY2FsYXIoMCkpCisgIHsKKyAgICAqYyA9IDE7CisgICAgKnMgPSAwOworICAgIHIgPSAwOworICAgIHogPSAwOworICB9CisgIGVsc2UKKyAgeworICAgIHIgPSBpbnRlcm5hbDo6c3FydChhKmEgKyBiKmIpOworICAgIFNjYWxhciBhbWF4ID0gYWE+YWIgPyBhIDogYjsKKyAgICByID0gYW1heD4wID8gciA6IC1yOworICAgICpjID0gYS9yOworICAgICpzID0gYi9yOworICAgIHogPSAxOworICAgIGlmIChhYSA+IGFiKSB6ID0gKnM7CisgICAgaWYgKGFiID4gYWEgJiYgKmMhPVJlYWxTY2FsYXIoMCkpCisgICAgICB6ID0gU2NhbGFyKDEpLyAqYzsKKyAgfQorICAqcGEgPSByOworICAqcGIgPSB6OworICAjZWxzZQorICBTY2FsYXIgYWxwaGE7CisgIFJlYWxTY2FsYXIgbm9ybSxzY2FsZTsKKyAgaWYoaW50ZXJuYWw6OmFicyhhKT09UmVhbFNjYWxhcigwKSkKKyAgeworICAgICpjID0gUmVhbFNjYWxhcigwKTsKKyAgICAqcyA9IFNjYWxhcigxKTsKKyAgICBhID0gYjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzY2FsZSA9IGludGVybmFsOjphYnMoYSkgKyBpbnRlcm5hbDo6YWJzKGIpOworICAgIG5vcm0gPSBzY2FsZSppbnRlcm5hbDo6c3FydCgoaW50ZXJuYWw6OmFiczIoYS9zY2FsZSkpKyAoaW50ZXJuYWw6OmFiczIoYi9zY2FsZSkpKTsKKyAgICBhbHBoYSA9IGEvaW50ZXJuYWw6OmFicyhhKTsKKyAgICAqYyA9IGludGVybmFsOjphYnMoYSkvbm9ybTsKKyAgICAqcyA9IGFscGhhKmludGVybmFsOjpjb25qKGIpL25vcm07CisgICAgYSA9IGFscGhhKm5vcm07CisgIH0KKyAgI2VuZGlmCisKKy8vICAgSmFjb2JpUm90YXRpb248U2NhbGFyPiByOworLy8gICByLm1ha2VHaXZlbnMoYSxiKTsKKy8vICAgKmMgPSByLmMoKTsKKy8vICAgKnMgPSByLnMoKTsKKworICByZXR1cm4gMDsKK30KKworaW50IEVJR0VOX0JMQVNfRlVOQyhzY2FsKShpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKK3sKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYWxwaGEpOworCisgIGlmKCppbmN4PT0xKSAgdmVjdG9yKHgsKm4pICo9IGFscGhhOworICBlbHNlICAgICAgICAgIHZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkgKj0gYWxwaGE7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3dhcCkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5KQoreworICBpZigqbjw9MCkgcmV0dXJuIDA7CisKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworCisgIGlmKCppbmN4PT0xICYmICppbmN5PT0xKSAgICB2ZWN0b3IoeSwqbikuc3dhcCh2ZWN0b3IoeCwqbikpOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k+MCkgdmVjdG9yKHksKm4sKmluY3kpLnN3YXAodmVjdG9yKHgsKm4sKmluY3gpKTsKKyAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PDApIHZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpLnN3YXAodmVjdG9yKHgsKm4sKmluY3gpKTsKKyAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PjApIHZlY3Rvcih5LCpuLCppbmN5KS5zd2FwKHZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpKTsKKyAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PDApIHZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpLnN3YXAodmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkpOworCisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9ibGFzL2xldmVsMV9yZWFsX2ltcGwuaCBiL2JsYXMvbGV2ZWwxX3JlYWxfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2VjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2xldmVsMV9yZWFsX2ltcGwuaApAQCAtMCwwICsxLDEwMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworLy8gY29tcHV0ZXMgdGhlIHN1bSBvZiBtYWduaXR1ZGVzIG9mIGFsbCB2ZWN0b3IgZWxlbWVudHMgb3IsIGZvciBhIGNvbXBsZXggdmVjdG9yIHgsIHRoZSBzdW0KKy8vIHJlcyA9IHxSZXgxfCArIHxJbXgxfCArIHxSZXgyfCArIHxJbXgyfCArIC4uLiArIHxSZXhufCArIHxJbXhufCwgd2hlcmUgeCBpcyBhIHZlY3RvciBvZiBvcmRlciBuCitSZWFsU2NhbGFyIEVJR0VOX0JMQVNfRlVOQyhhc3VtKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiX2FzdW0gIiA8PCAqbiA8PCAiICIgPDwgKmluY3ggPDwgIlxuIjsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKworICBpZigqbjw9MCkgcmV0dXJuIDA7CisKKyAgaWYoKmluY3g9PTEpICByZXR1cm4gdmVjdG9yKHgsKm4pLmN3aXNlQWJzKCkuc3VtKCk7CisgIGVsc2UgICAgICAgICAgcmV0dXJuIHZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkuY3dpc2VBYnMoKS5zdW0oKTsKK30KKworLy8gY29tcHV0ZXMgYSB2ZWN0b3ItdmVjdG9yIGRvdCBwcm9kdWN0LgorU2NhbGFyIEVJR0VOX0JMQVNfRlVOQyhkb3QpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSkKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJfZG90ICIgPDwgKm4gPDwgIiAiIDw8ICppbmN4IDw8ICIgIiA8PCAqaW5jeSA8PCAiXG4iOworCisgIGlmKCpuPD0wKSByZXR1cm4gMDsKKworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisKKyAgaWYoKmluY3g9PTEgJiYgKmluY3k9PTEpICAgIHJldHVybiAodmVjdG9yKHgsKm4pLmN3aXNlUHJvZHVjdCh2ZWN0b3IoeSwqbikpKS5zdW0oKTsKKyAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PjApIHJldHVybiAodmVjdG9yKHgsKm4sKmluY3gpLmN3aXNlUHJvZHVjdCh2ZWN0b3IoeSwqbiwqaW5jeSkpKS5zdW0oKTsKKyAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PjApIHJldHVybiAodmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuY3dpc2VQcm9kdWN0KHZlY3Rvcih5LCpuLCppbmN5KSkpLnN1bSgpOworICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k8MCkgcmV0dXJuICh2ZWN0b3IoeCwqbiwqaW5jeCkuY3dpc2VQcm9kdWN0KHZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpKSkuc3VtKCk7CisgIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeTwwKSByZXR1cm4gKHZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdCh2ZWN0b3IoeSwqbiwtKmluY3kpLnJldmVyc2UoKSkpLnN1bSgpOworICBlbHNlIHJldHVybiAwOworfQorCisvLyBjb21wdXRlcyB0aGUgRXVjbGlkZWFuIG5vcm0gb2YgYSB2ZWN0b3IuCisvLyBGSVhNRQorU2NhbGFyIEVJR0VOX0JMQVNfRlVOQyhucm0yKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiX25ybTIgIiA8PCAqbiA8PCAiICIgPDwgKmluY3ggPDwgIlxuIjsKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworCisgIGlmKCppbmN4PT0xKSAgcmV0dXJuIHZlY3Rvcih4LCpuKS5zdGFibGVOb3JtKCk7CisgIGVsc2UgICAgICAgICAgcmV0dXJuIHZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkuc3RhYmxlTm9ybSgpOworfQorCitpbnQgRUlHRU5fQkxBU19GVU5DKHJvdCkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LCBSZWFsU2NhbGFyICpwYywgUmVhbFNjYWxhciAqcHMpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiX3JvdCAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiICIgPDwgKmluY3kgPDwgIlxuIjsKKyAgaWYoKm48PTApIHJldHVybiAwOworCisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyIGMgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7CisgIFNjYWxhciBzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHMpOworCisgIFN0cmlkZWRWZWN0b3JUeXBlIHZ4KHZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkpOworICBTdHJpZGVkVmVjdG9yVHlwZSB2eSh2ZWN0b3IoeSwqbixzdGQ6OmFicygqaW5jeSkpKTsKKworICBSZXZlcnNlPFN0cmlkZWRWZWN0b3JUeXBlPiBydngodngpOworICBSZXZlcnNlPFN0cmlkZWRWZWN0b3JUeXBlPiBydnkodnkpOworCisgICAgICAgaWYoKmluY3g8MCAmJiAqaW5jeT4wKSBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHJ2eCwgdnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYyxzKSk7CisgIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeTwwKSBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHZ4LCBydnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYyxzKSk7CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHZ4LCB2eSwgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYyxzKSk7CisKKworICByZXR1cm4gMDsKK30KKworLyoKKy8vIHBlcmZvcm1zIHJvdGF0aW9uIG9mIHBvaW50cyBpbiB0aGUgbW9kaWZpZWQgcGxhbmUuCitpbnQgRUlHRU5fQkxBU19GVU5DKHJvdG0pKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqcGFyYW0pCit7CisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKworICAvLyBUT0RPCisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGNvbXB1dGVzIHRoZSBtb2RpZmllZCBwYXJhbWV0ZXJzIGZvciBhIEdpdmVucyByb3RhdGlvbi4KK2ludCBFSUdFTl9CTEFTX0ZVTkMocm90bWcpKFJlYWxTY2FsYXIgKmQxLCBSZWFsU2NhbGFyICpkMiwgUmVhbFNjYWxhciAqeDEsIFJlYWxTY2FsYXIgKngyLCBSZWFsU2NhbGFyICpwYXJhbSkKK3sKKyAgLy8gVE9ETworCisgIHJldHVybiAwOworfQorKi8KZGlmZiAtLWdpdCBhL2JsYXMvbGV2ZWwyX2NwbHhfaW1wbC5oIGIvYmxhcy9sZXZlbDJfY3BseF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3OGYyYQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvbGV2ZWwyX2NwbHhfaW1wbC5oCkBAIC0wLDAgKzEsMjcwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCisvKiogIFpIRU1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciAgb3BlcmF0aW9uCisgICoKKyAgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAorICAqICBBIGlzIGFuIG4gYnkgbiBoZXJtaXRpYW4gbWF0cml4LgorICAqLworaW50IEVJR0VOX0JMQVNfRlVOQyhoZW12KShjaGFyICp1cGxvLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSkKK3sKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyIGFscGhhICA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhICAgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYmV0YSk7CisKKyAgLy8gY2hlY2sgYXJndW1lbnRzCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKm4pKSAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqaW5jeT09MCkgICAgICAgICAgICAgICBpbmZvID0gMTA7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRU1WICIsJmluZm8sNik7CisKKyAgaWYoKm49PTApCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiBhY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCpuLCppbmN4KTsKKyAgU2NhbGFyKiBhY3R1YWxfeSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCpuLCppbmN5KTsKKworICBpZihiZXRhIT1TY2FsYXIoMSkpCisgIHsKKyAgICBpZihiZXRhPT1TY2FsYXIoMCkpIHZlY3RvcihhY3R1YWxfeSwgKm4pLnNldFplcm8oKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgIHZlY3RvcihhY3R1YWxfeSwgKm4pICo9IGJldGE7CisgIH0KKworICBpZihhbHBoYSE9U2NhbGFyKDApKQorICB7CisgICAgLy8gVE9ETyBwZXJmb3JtcyBhIGRpcmVjdCBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9uCisgICAgICAgICBpZihVUExPKCp1cGxvKT09VVApIHZlY3RvcihhY3R1YWxfeSwqbikubm9hbGlhcygpICs9IG1hdHJpeChhLCpuLCpuLCpsZGEpLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIChhbHBoYSAqIHZlY3RvcihhY3R1YWxfeCwqbikpOworICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKSB2ZWN0b3IoYWN0dWFsX3ksKm4pLm5vYWxpYXMoKSArPSBtYXRyaXgoYSwqbiwqbiwqbGRhKS5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoYWxwaGEgKiB2ZWN0b3IoYWN0dWFsX3gsKm4pKTsKKyAgfQorCisgIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBhY3R1YWxfeDsKKyAgaWYoYWN0dWFsX3khPXkpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeSx5LCpuLCppbmN5KTsKKworICByZXR1cm4gMTsKK30KKworLyoqICBaSEJNViAgcGVyZm9ybXMgdGhlIG1hdHJpeC12ZWN0b3IgIG9wZXJhdGlvbgorICAqCisgICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorICAqCisgICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyAgKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIGJhbmQgbWF0cml4LCB3aXRoIGsgc3VwZXItZGlhZ29uYWxzLgorICAqLworLy8gaW50IEVJR0VOX0JMQVNfRlVOQyhoYm12KShjaGFyICp1cGxvLCBpbnQgKm4sIGludCAqaywgUmVhbFNjYWxhciAqYWxwaGEsIFJlYWxTY2FsYXIgKmEsIGludCAqbGRhLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyICp4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKmJldGEsIFJlYWxTY2FsYXIgKnksIGludCAqaW5jeSkKKy8vIHsKKy8vICAgcmV0dXJuIDE7CisvLyB9CisKKy8qKiAgWkhQTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbgorICAqCisgICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorICAqCisgICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyAgKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICovCisvLyBpbnQgRUlHRU5fQkxBU19GVU5DKGhwbXYpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqYWxwaGEsIFJlYWxTY2FsYXIgKmFwLCBSZWFsU2NhbGFyICp4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKmJldGEsIFJlYWxTY2FsYXIgKnksIGludCAqaW5jeSkKKy8vIHsKKy8vICAgcmV0dXJuIDE7CisvLyB9CisKKy8qKiAgWkhQUiAgICBwZXJmb3JtcyB0aGUgaGVybWl0aWFuIHJhbmsgMSBvcGVyYXRpb24KKyAgKgorICAqICAgICBBIDo9IGFscGhhKngqY29uamcoIHgnICkgKyBBLAorICAqCisgICogIHdoZXJlIGFscGhhIGlzIGEgcmVhbCBzY2FsYXIsIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgQSBpcyBhbgorICAqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICovCisvLyBpbnQgRUlHRU5fQkxBU19GVU5DKGhwcikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICphbHBoYSwgUmVhbFNjYWxhciAqeCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICphcCkKKy8vIHsKKy8vICAgcmV0dXJuIDE7CisvLyB9CisKKy8qKiAgWkhQUjIgIHBlcmZvcm1zIHRoZSBoZXJtaXRpYW4gcmFuayAyIG9wZXJhdGlvbgorICAqCisgICogICAgIEEgOj0gYWxwaGEqeCpjb25qZyggeScgKSArIGNvbmpnKCBhbHBoYSApKnkqY29uamcoIHgnICkgKyBBLAorICAqCisgICogIHdoZXJlIGFscGhhIGlzIGEgc2NhbGFyLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQgQSBpcyBhbgorICAqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICovCisvLyBpbnQgRUlHRU5fQkxBU19GVU5DKGhwcjIpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICp4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqYXApCisvLyB7CisvLyAgIHJldHVybiAxOworLy8gfQorCisvKiogIFpIRVIgICBwZXJmb3JtcyB0aGUgaGVybWl0aWFuIHJhbmsgMSBvcGVyYXRpb24KKyAgKgorICAqICAgICBBIDo9IGFscGhhKngqY29uamcoIHgnICkgKyBBLAorICAqCisgICogIHdoZXJlIGFscGhhIGlzIGEgcmVhbCBzY2FsYXIsIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgQSBpcyBhbgorICAqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeC4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoaGVyKShjaGFyICp1cGxvLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhKQoreworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFJlYWxTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxSZWFsU2NhbGFyKj4ocGFscGhhKTsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRVIgICIsJmluZm8sNik7CisKKyAgaWYoYWxwaGE9PVJlYWxTY2FsYXIoMCkpCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOworCisgIC8vIFRPRE8gcGVyZm9ybSBkaXJlY3QgY2FsbHMgdG8gdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbgorLy8gICBpZihVUExPKCp1cGxvKT09TE8pICAgICAgIG1hdHJpeChhLCpuLCpuLCpsZGEpLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKHZlY3Rvcih4X2NweSwqbiksIGFscGhhKTsKKy8vICAgZWxzZSBpZihVUExPKCp1cGxvKT09VVApICBtYXRyaXgoYSwqbiwqbiwqbGRhKS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZSh2ZWN0b3IoeF9jcHksKm4pLCBhbHBoYSk7CisKKyAgaWYoVVBMTygqdXBsbyk9PUxPKQorICAgIGZvcihpbnQgaj0wO2o8Km47KytqKQorICAgICAgbWF0cml4KGEsKm4sKm4sKmxkYSkuY29sKGopLnRhaWwoKm4taikgKz0gYWxwaGEgKiBpbnRlcm5hbDo6Y29uaih4X2NweVtqXSkgKiB2ZWN0b3IoeF9jcHkraiwqbi1qKTsKKyAgZWxzZQorICAgIGZvcihpbnQgaj0wO2o8Km47KytqKQorICAgICAgbWF0cml4KGEsKm4sKm4sKmxkYSkuY29sKGopLmhlYWQoaisxKSArPSBhbHBoYSAqIGludGVybmFsOjpjb25qKHhfY3B5W2pdKSAqIHZlY3Rvcih4X2NweSxqKzEpOworCisgIG1hdHJpeChhLCpuLCpuLCpsZGEpLmRpYWdvbmFsKCkuaW1hZygpLnNldFplcm8oKTsKKworICBpZih4X2NweSE9eCkgIGRlbGV0ZVtdIHhfY3B5OworCisgIHJldHVybiAxOworfQorCisvKiogIFpIRVIyICBwZXJmb3JtcyB0aGUgaGVybWl0aWFuIHJhbmsgMiBvcGVyYXRpb24KKyAgKgorICAqICAgICBBIDo9IGFscGhhKngqY29uamcoIHknICkgKyBjb25qZyggYWxwaGEgKSp5KmNvbmpnKCB4JyApICsgQSwKKyAgKgorICAqICB3aGVyZSBhbHBoYSBpcyBhIHNjYWxhciwgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4gbgorICAqICBieSBuIGhlcm1pdGlhbiBtYXRyaXguCisgICovCitpbnQgRUlHRU5fQkxBU19GVU5DKGhlcjIpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEpCit7CisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaW50IGluZm8gPSAwOworICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA5OworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiSEVSMiAiLCZpbmZvLDYpOworCisgIGlmKGFscGhhPT1TY2FsYXIoMCkpCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOworICBTY2FsYXIqIHlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksICpuLCAqaW5jeSk7CisKKyAgLy8gVE9ETyBwZXJmb3JtIGRpcmVjdCBjYWxscyB0byB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uCisgIGlmKFVQTE8oKnVwbG8pPT1MTykgICAgICAgbWF0cml4KGEsKm4sKm4sKmxkYSkuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUodmVjdG9yKHhfY3B5LCpuKSx2ZWN0b3IoeV9jcHksKm4pLGFscGhhKTsKKyAgZWxzZSBpZihVUExPKCp1cGxvKT09VVApICBtYXRyaXgoYSwqbiwqbiwqbGRhKS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZSh2ZWN0b3IoeF9jcHksKm4pLHZlY3Rvcih5X2NweSwqbiksYWxwaGEpOworCisgIG1hdHJpeChhLCpuLCpuLCpsZGEpLmRpYWdvbmFsKCkuaW1hZygpLnNldFplcm8oKTsKKworICBpZih4X2NweSE9eCkgIGRlbGV0ZVtdIHhfY3B5OworICBpZih5X2NweSE9eSkgIGRlbGV0ZVtdIHlfY3B5OworCisgIHJldHVybiAxOworfQorCisvKiogIFpHRVJVICBwZXJmb3JtcyB0aGUgcmFuayAxIG9wZXJhdGlvbgorICAqCisgICogICAgIEEgOj0gYWxwaGEqeCp5JyArIEEsCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggaXMgYW4gbSBlbGVtZW50IHZlY3RvciwgeSBpcyBhbiBuIGVsZW1lbnQKKyAgKiAgdmVjdG9yIGFuZCBBIGlzIGFuIG0gYnkgbiBtYXRyaXguCisgICovCitpbnQgRUlHRU5fQkxBU19GVU5DKGdlcnUpKGludCAqbSwgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSkKK3sKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKworICBpbnQgaW5mbyA9IDA7CisgICAgICAgaWYoKm08MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmluY3k9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJHRVJVICIsJmluZm8sNik7CisKKyAgaWYoYWxwaGE9PVNjYWxhcigwKSkKKyAgICByZXR1cm4gMTsKKworICBTY2FsYXIqIHhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsKm0sKmluY3gpOworICBTY2FsYXIqIHlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksKm4sKmluY3kpOworCisgIC8vIFRPRE8gcGVyZm9ybSBkaXJlY3QgY2FsbHMgdG8gdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbgorICBtYXRyaXgoYSwqbSwqbiwqbGRhKSArPSBhbHBoYSAqIHZlY3Rvcih4X2NweSwqbSkgKiB2ZWN0b3IoeV9jcHksKm4pLnRyYW5zcG9zZSgpOworCisgIGlmKHhfY3B5IT14KSAgZGVsZXRlW10geF9jcHk7CisgIGlmKHlfY3B5IT15KSAgZGVsZXRlW10geV9jcHk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiAgWkdFUkMgIHBlcmZvcm1zIHRoZSByYW5rIDEgb3BlcmF0aW9uCisgICoKKyAgKiAgICAgQSA6PSBhbHBoYSp4KmNvbmpnKCB5JyApICsgQSwKKyAgKgorICAqICB3aGVyZSBhbHBoYSBpcyBhIHNjYWxhciwgeCBpcyBhbiBtIGVsZW1lbnQgdmVjdG9yLCB5IGlzIGFuIG4gZWxlbWVudAorICAqICB2ZWN0b3IgYW5kIEEgaXMgYW4gbSBieSBuIG1hdHJpeC4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoZ2VyYykoaW50ICptLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhKQoreworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisgIFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGEpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYWxwaGEpOworCisgIGludCBpbmZvID0gMDsKKyAgICAgICBpZigqbTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqaW5jeT09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFUkMgIiwmaW5mbyw2KTsKKworICBpZihhbHBoYT09U2NhbGFyKDApKQorICAgIHJldHVybiAxOworCisgIFNjYWxhciogeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwqbSwqaW5jeCk7CisgIFNjYWxhciogeV9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSwqbiwqaW5jeSk7CisKKyAgLy8gVE9ETyBwZXJmb3JtIGRpcmVjdCBjYWxscyB0byB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uCisgIG1hdHJpeChhLCptLCpuLCpsZGEpICs9IGFscGhhICogdmVjdG9yKHhfY3B5LCptKSAqIHZlY3Rvcih5X2NweSwqbikuYWRqb2ludCgpOworCisgIGlmKHhfY3B5IT14KSAgZGVsZXRlW10geF9jcHk7CisgIGlmKHlfY3B5IT15KSAgZGVsZXRlW10geV9jcHk7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9ibGFzL2xldmVsMl9pbXBsLmggYi9ibGFzL2xldmVsMl9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5OWNmOQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvbGV2ZWwyX2ltcGwuaApAQCAtMCwwICsxLDQ1NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworaW50IEVJR0VOX0JMQVNfRlVOQyhnZW12KShjaGFyICpvcGEsIGludCAqbSwgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcGIsIGludCAqaW5jYiwgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBpbnQgKmluY2MpCit7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGludCwgY29uc3QgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyICosIGludCAsIFNjYWxhciAqLCBpbnQsIFNjYWxhcik7CisgIHN0YXRpYyBmdW5jdHlwZSBmdW5jWzRdOworCisgIHN0YXRpYyBib29sIGluaXQgPSBmYWxzZTsKKyAgaWYoIWluaXQpCisgIHsKKyAgICBmb3IoaW50IGs9MDsgazw0OyArK2spCisgICAgICBmdW5jW2tdID0gMDsKKworICAgIGZ1bmNbTk9UUl0gPSAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsU2NhbGFyLGZhbHNlPjo6cnVuKTsKKyAgICBmdW5jW1RSICBdID0gKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsU2NhbGFyLFJvd01ham9yLGZhbHNlLFNjYWxhcixmYWxzZT46OnJ1bik7CisgICAgZnVuY1tBREogXSA9IChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsZmFsc2U+OjpydW4pOworCisgICAgaW5pdCA9IHRydWU7CisgIH0KKworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYik7CisgIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOworICBTY2FsYXIgYWxwaGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgICA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiZXRhKTsKKworICAvLyBjaGVjayBhcmd1bWVudHMKKyAgaW50IGluZm8gPSAwOworICBpZihPUCgqb3BhKT09SU5WQUxJRCkgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKCptPDApICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbSkpICAgIGluZm8gPSA2OworICBlbHNlIGlmKCppbmNiPT0wKSAgICAgICAgICAgICAgIGluZm8gPSA4OworICBlbHNlIGlmKCppbmNjPT0wKSAgICAgICAgICAgICAgIGluZm8gPSAxMTsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFTVYgIiwmaW5mbyw2KTsKKworICBpZigqbT09MCB8fCAqbj09MCB8fCAoYWxwaGE9PVNjYWxhcigwKSAmJiBiZXRhPT1TY2FsYXIoMSkpKQorICAgIHJldHVybiAwOworCisgIGludCBhY3R1YWxfbSA9ICptOworICBpbnQgYWN0dWFsX24gPSAqbjsKKyAgaWYoT1AoKm9wYSkhPU5PVFIpCisgICAgc3RkOjpzd2FwKGFjdHVhbF9tLGFjdHVhbF9uKTsKKworICBTY2FsYXIqIGFjdHVhbF9iID0gZ2V0X2NvbXBhY3RfdmVjdG9yKGIsYWN0dWFsX24sKmluY2IpOworICBTY2FsYXIqIGFjdHVhbF9jID0gZ2V0X2NvbXBhY3RfdmVjdG9yKGMsYWN0dWFsX20sKmluY2MpOworCisgIGlmKGJldGEhPVNjYWxhcigxKSkKKyAgeworICAgIGlmKGJldGE9PVNjYWxhcigwKSkgdmVjdG9yKGFjdHVhbF9jLCBhY3R1YWxfbSkuc2V0WmVybygpOworICAgIGVsc2UgICAgICAgICAgICAgICAgdmVjdG9yKGFjdHVhbF9jLCBhY3R1YWxfbSkgKj0gYmV0YTsKKyAgfQorCisgIGludCBjb2RlID0gT1AoKm9wYSk7CisgIGZ1bmNbY29kZV0oYWN0dWFsX20sIGFjdHVhbF9uLCBhLCAqbGRhLCBhY3R1YWxfYiwgMSwgYWN0dWFsX2MsIDEsIGFscGhhKTsKKworICBpZihhY3R1YWxfYiE9YikgZGVsZXRlW10gYWN0dWFsX2I7CisgIGlmKGFjdHVhbF9jIT1jKSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX2MsYyxhY3R1YWxfbSwqaW5jYyk7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBFSUdFTl9CTEFTX0ZVTkModHJzdikoY2hhciAqdXBsbywgY2hhciAqb3BhLCBjaGFyICpkaWFnLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcGIsIGludCAqaW5jYikKK3sKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgY29uc3QgU2NhbGFyICosIGludCwgU2NhbGFyICopOworICBzdGF0aWMgZnVuY3R5cGUgZnVuY1sxNl07CisKKyAgc3RhdGljIGJvb2wgaW5pdCA9IGZhbHNlOworICBpZighaW5pdCkKKyAgeworICAgIGZvcihpbnQgaz0wOyBrPDE2OyArK2spCisgICAgICBmdW5jW2tdID0gMDsKKworICAgIGZ1bmNbTk9UUiAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMyldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIFVwcGVyfDAsICAgICAgIGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW1RSICAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnwwLCAgICAgICBmYWxzZSxSb3dNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8MCwgICAgICAgQ29uaiwgUm93TWFqb3I+OjpydW4pOworCisgICAgZnVuY1tOT1RSICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8MCwgICAgICAgZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMyldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIFVwcGVyfDAsICAgICAgIGZhbHNlLFJvd01ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICBDb25qLCBSb3dNYWpvcj46OnJ1bik7CisKKyAgICBmdW5jW05PVFIgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8VW5pdERpYWcsZmFsc2UsUm93TWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMyldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLENvbmosIFJvd01ham9yPjo6cnVuKTsKKworICAgIGZ1bmNbTk9UUiAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMyldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW1RSICAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnxVbml0RGlhZyxmYWxzZSxSb3dNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsQ29uaiwgUm93TWFqb3I+OjpydW4pOworCisgICAgaW5pdCA9IHRydWU7CisgIH0KKworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYik7CisKKyAgaW50IGluZm8gPSAwOworICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKE9QKCpvcGEpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKERJQUcoKmRpYWcpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA2OworICBlbHNlIGlmKCppbmNiPT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA4OworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiVFJTViAiLCZpbmZvLDYpOworCisgIFNjYWxhciogYWN0dWFsX2IgPSBnZXRfY29tcGFjdF92ZWN0b3IoYiwqbiwqaW5jYik7CisKKyAgaW50IGNvZGUgPSBPUCgqb3BhKSB8IChVUExPKCp1cGxvKSA8PCAyKSB8IChESUFHKCpkaWFnKSA8PCAzKTsKKyAgZnVuY1tjb2RlXSgqbiwgYSwgKmxkYSwgYWN0dWFsX2IpOworCisgIGlmKGFjdHVhbF9iIT1iKSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX2IsYiwqbiwqaW5jYik7CisKKyAgcmV0dXJuIDA7Cit9CisKKworCitpbnQgRUlHRU5fQkxBU19GVU5DKHRybXYpKGNoYXIgKnVwbG8sIGNoYXIgKm9wYSwgY2hhciAqZGlhZywgaW50ICpuLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBpbnQgKmluY2IpCit7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGludCwgY29uc3QgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyICosIGludCwgU2NhbGFyICosIGludCwgU2NhbGFyKTsKKyAgc3RhdGljIGZ1bmN0eXBlIGZ1bmNbMTZdOworCisgIHN0YXRpYyBib29sIGluaXQgPSBmYWxzZTsKKyAgaWYoIWluaXQpCisgIHsKKyAgICBmb3IoaW50IGs9MDsgazwxNjsgKytrKQorICAgICAgZnVuY1trXSA9IDA7CisKKyAgICBmdW5jW05PVFIgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LFVwcGVyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMyldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsTG93ZXJ8MCwgICAgICAgU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnwwLCAgICAgICBTY2FsYXIsQ29uaiwgU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKTsKKworICAgIGZ1bmNbTk9UUiAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMyldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsTG93ZXJ8MCwgICAgICAgU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LFVwcGVyfDAsICAgICAgIFNjYWxhcixDb25qLCBTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pOworCisgICAgZnVuY1tOT1RSICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW1RSICAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfFVuaXREaWFnLFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMyldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsTG93ZXJ8VW5pdERpYWcsU2NhbGFyLENvbmosIFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1bik7CisKKyAgICBmdW5jW05PVFIgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfFVuaXREaWFnLFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMyldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnxVbml0RGlhZyxTY2FsYXIsQ29uaiwgU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKTsKKworICAgIGluaXQgPSB0cnVlOworICB9CisKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGIpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihPUCgqb3BhKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZihESUFHKCpkaWFnKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNjsKKyAgZWxzZSBpZigqaW5jYj09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gODsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlRSTVYgIiwmaW5mbyw2KTsKKworICBpZigqbj09MCkKKyAgICByZXR1cm4gMTsKKworICBTY2FsYXIqIGFjdHVhbF9iID0gZ2V0X2NvbXBhY3RfdmVjdG9yKGIsKm4sKmluY2IpOworICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gcmVzKCpuKTsKKyAgcmVzLnNldFplcm8oKTsKKworICBpbnQgY29kZSA9IE9QKCpvcGEpIHwgKFVQTE8oKnVwbG8pIDw8IDIpIHwgKERJQUcoKmRpYWcpIDw8IDMpOworICBpZihjb2RlPj0xNiB8fCBmdW5jW2NvZGVdPT0wKQorICAgIHJldHVybiAwOworCisgIGZ1bmNbY29kZV0oKm4sICpuLCBhLCAqbGRhLCBhY3R1YWxfYiwgMSwgcmVzLmRhdGEoKSwgMSwgU2NhbGFyKDEpKTsKKworICBjb3B5X2JhY2socmVzLmRhdGEoKSxiLCpuLCppbmNiKTsKKyAgaWYoYWN0dWFsX2IhPWIpIGRlbGV0ZVtdIGFjdHVhbF9iOworCisgIHJldHVybiAwOworfQorCisvKiogIEdCTVYgIHBlcmZvcm1zIG9uZSBvZiB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb25zCisgICoKKyAgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksICAgb3IgICB5IDo9IGFscGhhKkEnKnggKyBiZXRhKnksCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIHZlY3RvcnMgYW5kIEEgaXMgYW4KKyAgKiAgbSBieSBuIGJhbmQgbWF0cml4LCB3aXRoIGtsIHN1Yi1kaWFnb25hbHMgYW5kIGt1IHN1cGVyLWRpYWdvbmFscy4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoZ2JtdikoY2hhciAqdHJhbnMsIGludCAqbSwgaW50ICpuLCBpbnQgKmtsLCBpbnQgKmt1LCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3kpCit7CisgIFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGEpOworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGJldGEpOworICBpbnQgY29lZmZfcm93cyA9ICprbCsqa3UrMTsKKyAgCisgIGludCBpbmZvID0gMDsKKyAgICAgICBpZihPUCgqdHJhbnMpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigqbTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqa2w8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqa3U8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqbGRhPGNvZWZmX3Jvd3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gODsKKyAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTA7CisgIGVsc2UgaWYoKmluY3k9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEzOworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiR0JNViAiLCZpbmZvLDYpOworICAKKyAgaWYoKm09PTAgfHwgKm49PTAgfHwgKGFscGhhPT1TY2FsYXIoMCkgJiYgYmV0YT09U2NhbGFyKDEpKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIGludCBhY3R1YWxfbSA9ICptOworICBpbnQgYWN0dWFsX24gPSAqbjsKKyAgaWYoT1AoKnRyYW5zKSE9Tk9UUikKKyAgICBzdGQ6OnN3YXAoYWN0dWFsX20sYWN0dWFsX24pOworICAKKyAgU2NhbGFyKiBhY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LGFjdHVhbF9uLCppbmN4KTsKKyAgU2NhbGFyKiBhY3R1YWxfeSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LGFjdHVhbF9tLCppbmN5KTsKKyAgCisgIGlmKGJldGEhPVNjYWxhcigxKSkKKyAgeworICAgIGlmKGJldGE9PVNjYWxhcigwKSkgdmVjdG9yKGFjdHVhbF95LCBhY3R1YWxfbSkuc2V0WmVybygpOworICAgIGVsc2UgICAgICAgICAgICAgICAgdmVjdG9yKGFjdHVhbF95LCBhY3R1YWxfbSkgKj0gYmV0YTsKKyAgfQorICAKKyAgTWF0cml4VHlwZSBtYXRfY29lZmZzKGEsY29lZmZfcm93cywqbiwqbGRhKTsKKyAgCisgIGludCBuYiA9IHN0ZDo6bWluKCpuLCgqbSkrKCprdSkpOworICBmb3IoaW50IGo9MDsgajxuYjsgKytqKQorICB7CisgICAgaW50IHN0YXJ0ID0gc3RkOjptYXgoMCxqIC0gKmt1KTsKKyAgICBpbnQgZW5kID0gc3RkOjptaW4oKCptKS0xLGogKyAqa2wpOworICAgIGludCBsZW4gPSBlbmQgLSBzdGFydCArIDE7CisgICAgaW50IG9mZnNldCA9ICgqa3UpIC0gaiArIHN0YXJ0OworICAgIGlmKE9QKCp0cmFucyk9PU5PVFIpCisgICAgICB2ZWN0b3IoYWN0dWFsX3krc3RhcnQsbGVuKSArPSAoYWxwaGEqYWN0dWFsX3hbal0pICogbWF0X2NvZWZmcy5jb2woaikuc2VnbWVudChvZmZzZXQsbGVuKTsKKyAgICBlbHNlIGlmKE9QKCp0cmFucyk9PVRSKQorICAgICAgYWN0dWFsX3lbal0gKz0gYWxwaGEgKiAoIG1hdF9jb2VmZnMuY29sKGopLnNlZ21lbnQob2Zmc2V0LGxlbikudHJhbnNwb3NlKCkgKiB2ZWN0b3IoYWN0dWFsX3grc3RhcnQsbGVuKSApLnZhbHVlKCk7CisgICAgZWxzZQorICAgICAgYWN0dWFsX3lbal0gKz0gYWxwaGEgKiAoIG1hdF9jb2VmZnMuY29sKGopLnNlZ21lbnQob2Zmc2V0LGxlbikuYWRqb2ludCgpICAgKiB2ZWN0b3IoYWN0dWFsX3grc3RhcnQsbGVuKSApLnZhbHVlKCk7CisgIH0gICAgCisgIAorICBpZihhY3R1YWxfeCE9eCkgZGVsZXRlW10gYWN0dWFsX3g7CisgIGlmKGFjdHVhbF95IT15KSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX3kseSxhY3R1YWxfbSwqaW5jeSk7CisgIAorICByZXR1cm4gMDsKK30KKworI2lmIDAKKy8qKiAgVEJNViAgcGVyZm9ybXMgb25lIG9mIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbnMKKyAgKgorICAqICAgICB4IDo9IEEqeCwgICBvciAgIHggOj0gQScqeCwKKyAgKgorICAqICB3aGVyZSB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kICBBIGlzIGFuIG4gYnkgbiB1bml0LCBvciBub24tdW5pdCwKKyAgKiAgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCwgd2l0aCAoIGsgKyAxICkgZGlhZ29uYWxzLgorICAqLworaW50IEVJR0VOX0JMQVNfRlVOQyh0Ym12KShjaGFyICp1cGxvLCBjaGFyICpvcGEsIGNoYXIgKmRpYWcsIGludCAqbiwgaW50ICprLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisgIFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGEpOworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgaW50IGNvZWZmX3Jvd3MgPSAqayArIDE7CisgIAorICBpbnQgaW5mbyA9IDA7CisgICAgICAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoT1AoKm9wYSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoRElBRygqZGlhZyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKms8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmxkYTxjb2VmZl9yb3dzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJUQk1WICIsJmluZm8sNik7CisgIAorICBpZigqbj09MCkKKyAgICByZXR1cm4gMDsKKyAgCisgIGludCBhY3R1YWxfbiA9ICpuOworICAKKyAgU2NhbGFyKiBhY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LGFjdHVhbF9uLCppbmN4KTsKKyAgCisgIE1hdHJpeFR5cGUgbWF0X2NvZWZmcyhhLGNvZWZmX3Jvd3MsKm4sKmxkYSk7CisgIAorICBpbnQga3UgPSBVUExPKCp1cGxvKT09VVBQRVIgPyAqayA6IDA7CisgIGludCBrbCA9IFVQTE8oKnVwbG8pPT1MT1dFUiA/ICprIDogMDsKKyAgCisgIGZvcihpbnQgaj0wOyBqPCpuOyArK2opCisgIHsKKyAgICBpbnQgc3RhcnQgPSBzdGQ6Om1heCgwLGogLSBrdSk7CisgICAgaW50IGVuZCA9IHN0ZDo6bWluKCgqbSktMSxqICsga2wpOworICAgIGludCBsZW4gPSBlbmQgLSBzdGFydCArIDE7CisgICAgaW50IG9mZnNldCA9IChrdSkgLSBqICsgc3RhcnQ7CisgICAgCisgICAgaWYoT1AoKnRyYW5zKT09Tk9UUikKKyAgICAgIHZlY3RvcihhY3R1YWxfeStzdGFydCxsZW4pICs9IChhbHBoYSphY3R1YWxfeFtqXSkgKiBtYXRfY29lZmZzLmNvbChqKS5zZWdtZW50KG9mZnNldCxsZW4pOworICAgIGVsc2UgaWYoT1AoKnRyYW5zKT09VFIpCisgICAgICBhY3R1YWxfeVtqXSArPSBhbHBoYSAqICggbWF0X2NvZWZmcy5jb2woaikuc2VnbWVudChvZmZzZXQsbGVuKS50cmFuc3Bvc2UoKSAqIHZlY3RvcihhY3R1YWxfeCtzdGFydCxsZW4pICkudmFsdWUoKTsKKyAgICBlbHNlCisgICAgICBhY3R1YWxfeVtqXSArPSBhbHBoYSAqICggbWF0X2NvZWZmcy5jb2woaikuc2VnbWVudChvZmZzZXQsbGVuKS5hZGpvaW50KCkgICAqIHZlY3RvcihhY3R1YWxfeCtzdGFydCxsZW4pICkudmFsdWUoKTsKKyAgfSAgICAKKyAgCisgIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBhY3R1YWxfeDsKKyAgaWYoYWN0dWFsX3khPXkpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeSx5LGFjdHVhbF9tLCppbmN5KTsKKyAgCisgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qKiAgRFRCU1YgIHNvbHZlcyBvbmUgb2YgdGhlIHN5c3RlbXMgb2YgZXF1YXRpb25zCisgICoKKyAgKiAgICAgQSp4ID0gYiwgICBvciAgIEEnKnggPSBiLAorICAqCisgICogIHdoZXJlIGIgYW5kIHggYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuIG4gYnkgbiB1bml0LCBvcgorICAqICBub24tdW5pdCwgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCwgd2l0aCAoIGsgKyAxICkKKyAgKiAgZGlhZ29uYWxzLgorICAqCisgICogIE5vIHRlc3QgZm9yIHNpbmd1bGFyaXR5IG9yIG5lYXItc2luZ3VsYXJpdHkgaXMgaW5jbHVkZWQgaW4gdGhpcworICAqICByb3V0aW5lLiBTdWNoIHRlc3RzIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkModGJzdikoY2hhciAqdXBsbywgY2hhciAqb3AsIGNoYXIgKmRpYWcsIGludCAqbiwgaW50ICprLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCit7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGludCwgY29uc3QgU2NhbGFyICosIGludCwgU2NhbGFyICopOworICBzdGF0aWMgZnVuY3R5cGUgZnVuY1sxNl07CisKKyAgc3RhdGljIGJvb2wgaW5pdCA9IGZhbHNlOworICBpZighaW5pdCkKKyAgeworICAgIGZvcihpbnQgaz0wOyBrPDE2OyArK2spCisgICAgICBmdW5jW2tdID0gMDsKKworICAgIGZ1bmNbTk9UUiAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMyldID0gKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LFVwcGVyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMyldID0gKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsUm93TWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMyldID0gKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixDb25qLCBTY2FsYXIsUm93TWFqb3I+OjpydW4pOworCisgICAgZnVuY1tOT1RSICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKV0gPSAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsTG93ZXJ8MCwgICAgICAgU2NhbGFyLGZhbHNlLFNjYWxhcixDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKV0gPSAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsVXBwZXJ8MCwgICAgICAgU2NhbGFyLGZhbHNlLFNjYWxhcixSb3dNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKV0gPSAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsVXBwZXJ8MCwgICAgICAgU2NhbGFyLENvbmosIFNjYWxhcixSb3dNYWpvcj46OnJ1bik7CisKKyAgICBmdW5jW05PVFIgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpXSA9IChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxVcHBlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW1RSICAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpXSA9IChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLFJvd01ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpXSA9IChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsQ29uaiwgU2NhbGFyLFJvd01ham9yPjo6cnVuKTsKKworICAgIGZ1bmNbTk9UUiAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMyldID0gKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LExvd2VyfFVuaXREaWFnLFNjYWxhcixmYWxzZSxTY2FsYXIsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMyldID0gKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LFVwcGVyfFVuaXREaWFnLFNjYWxhcixmYWxzZSxTY2FsYXIsUm93TWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMyldID0gKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LFVwcGVyfFVuaXREaWFnLFNjYWxhcixDb25qLCBTY2FsYXIsUm93TWFqb3I+OjpydW4pOworCisgICAgaW5pdCA9IHRydWU7CisgIH0KKworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIGludCBjb2VmZl9yb3dzID0gKmsrMTsKKyAgCisgIGludCBpbmZvID0gMDsKKyAgICAgICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihPUCgqb3ApPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZihESUFHKCpkaWFnKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqazwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqbGRhPGNvZWZmX3Jvd3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlRCU1YgIiwmaW5mbyw2KTsKKyAgCisgIGlmKCpuPT0wIHx8ICgqaz09MCAmJiBESUFHKCpkaWFnKT09VU5JVCkpCisgICAgcmV0dXJuIDA7CisgIAorICBpbnQgYWN0dWFsX24gPSAqbjsKKyAKKyAgU2NhbGFyKiBhY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LGFjdHVhbF9uLCppbmN4KTsKKyAgCisgIGludCBjb2RlID0gT1AoKm9wKSB8IChVUExPKCp1cGxvKSA8PCAyKSB8IChESUFHKCpkaWFnKSA8PCAzKTsKKyAgaWYoY29kZT49MTYgfHwgZnVuY1tjb2RlXT09MCkKKyAgICByZXR1cm4gMDsKKworICBmdW5jW2NvZGVdKCpuLCAqaywgYSwgKmxkYSwgYWN0dWFsX3gpOworICAKKyAgaWYoYWN0dWFsX3ghPXgpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeCx4LGFjdHVhbF9uLCppbmN4KTsKKyAgCisgIHJldHVybiAwOworfQorCisvKiogIERUUE1WICBwZXJmb3JtcyBvbmUgb2YgdGhlIG1hdHJpeC12ZWN0b3Igb3BlcmF0aW9ucworICAqCisgICogICAgIHggOj0gQSp4LCAgIG9yICAgeCA6PSBBJyp4LAorICAqCisgICogIHdoZXJlIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yIG5vbi11bml0LAorICAqICB1cHBlciBvciBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICovCisvLyBpbnQgRUlHRU5fQkxBU19GVU5DKHRwbXYpKGNoYXIgKnVwbG8sIGNoYXIgKnRyYW5zLCBjaGFyICpkaWFnLCBpbnQgKm4sIFJlYWxTY2FsYXIgKmFwLCBSZWFsU2NhbGFyICp4LCBpbnQgKmluY3gpCisvLyB7CisvLyAgIHJldHVybiAxOworLy8gfQorCisvKiogIERUUFNWICBzb2x2ZXMgb25lIG9mIHRoZSBzeXN0ZW1zIG9mIGVxdWF0aW9ucworICAqCisgICogICAgIEEqeCA9IGIsICAgb3IgICBBJyp4ID0gYiwKKyAgKgorICAqICB3aGVyZSBiIGFuZCB4IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQgQSBpcyBhbiBuIGJ5IG4gdW5pdCwgb3IKKyAgKiAgbm9uLXVuaXQsIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyAgKgorICAqICBObyB0ZXN0IGZvciBzaW5ndWxhcml0eSBvciBuZWFyLXNpbmd1bGFyaXR5IGlzIGluY2x1ZGVkIGluIHRoaXMKKyAgKiAgcm91dGluZS4gU3VjaCB0ZXN0cyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgICovCisvLyBpbnQgRUlHRU5fQkxBU19GVU5DKHRwc3YpKGNoYXIgKnVwbG8sIGNoYXIgKnRyYW5zLCBjaGFyICpkaWFnLCBpbnQgKm4sIFJlYWxTY2FsYXIgKmFwLCBSZWFsU2NhbGFyICp4LCBpbnQgKmluY3gpCisvLyB7CisvLyAgIHJldHVybiAxOworLy8gfQorCisvKiogIERHRVIgICBwZXJmb3JtcyB0aGUgcmFuayAxIG9wZXJhdGlvbgorICAqCisgICogICAgIEEgOj0gYWxwaGEqeCp5JyArIEEsCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggaXMgYW4gbSBlbGVtZW50IHZlY3RvciwgeSBpcyBhbiBuIGVsZW1lbnQKKyAgKiAgdmVjdG9yIGFuZCBBIGlzIGFuIG0gYnkgbiBtYXRyaXguCisgICovCitpbnQgRUlHRU5fQkxBU19GVU5DKGdlcikoaW50ICptLCBpbnQgKm4sIFNjYWxhciAqcGFscGhhLCBTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFNjYWxhciAqcHksIGludCAqaW5jeSwgU2NhbGFyICpwYSwgaW50ICpsZGEpCit7CisgIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaW50IGluZm8gPSAwOworICAgICAgIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA5OworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiR0VSICAiLCZpbmZvLDYpOworCisgIGlmKGFscGhhPT1TY2FsYXIoMCkpCisgICAgcmV0dXJuIDE7CisKKyAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCptLCppbmN4KTsKKyAgU2NhbGFyKiB5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCpuLCppbmN5KTsKKworICAvLyBUT0RPIHBlcmZvcm0gZGlyZWN0IGNhbGxzIHRvIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24KKyAgbWF0cml4KGEsKm0sKm4sKmxkYSkgKz0gYWxwaGEgKiB2ZWN0b3IoeF9jcHksKm0pICogdmVjdG9yKHlfY3B5LCpuKS5hZGpvaW50KCk7CisKKyAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKKyAgaWYoeV9jcHkhPXkpICBkZWxldGVbXSB5X2NweTsKKworICByZXR1cm4gMTsKK30KKworCmRpZmYgLS1naXQgYS9ibGFzL2xldmVsMl9yZWFsX2ltcGwuaCBiL2JsYXMvbGV2ZWwyX3JlYWxfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkODMzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2xldmVsMl9yZWFsX2ltcGwuaApAQCAtMCwwICsxLDIxMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworLy8geSA9IGFscGhhKkEqeCArIGJldGEqeQoraW50IEVJR0VOX0JMQVNfRlVOQyhzeW12KSAoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3kpCit7CisgIFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGEpOworICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7CisgIFNjYWxhciBhbHBoYSAgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYWxwaGEpOworICBTY2FsYXIgYmV0YSAgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGJldGEpOworCisgIC8vIGNoZWNrIGFyZ3VtZW50cworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmluY3k9PTApICAgICAgICAgICAgICAgaW5mbyA9IDEwOworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiU1lNViAiLCZpbmZvLDYpOworCisgIGlmKCpuPT0wKQorICAgIHJldHVybiAwOworCisgIFNjYWxhciogYWN0dWFsX3ggPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwqbiwqaW5jeCk7CisgIFNjYWxhciogYWN0dWFsX3kgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSwqbiwqaW5jeSk7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoYmV0YT09U2NhbGFyKDApKSB2ZWN0b3IoYWN0dWFsX3ksICpuKS5zZXRaZXJvKCk7CisgICAgZWxzZSAgICAgICAgICAgICAgICB2ZWN0b3IoYWN0dWFsX3ksICpuKSAqPSBiZXRhOworICB9CisKKyAgLy8gVE9ETyBwZXJmb3JtcyBhIGRpcmVjdCBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9uCisgICAgICAgaWYoVVBMTygqdXBsbyk9PVVQKSB2ZWN0b3IoYWN0dWFsX3ksKm4pLm5vYWxpYXMoKSArPSBtYXRyaXgoYSwqbiwqbiwqbGRhKS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiAoYWxwaGEgKiB2ZWN0b3IoYWN0dWFsX3gsKm4pKTsKKyAgZWxzZSBpZihVUExPKCp1cGxvKT09TE8pIHZlY3RvcihhY3R1YWxfeSwqbikubm9hbGlhcygpICs9IG1hdHJpeChhLCpuLCpuLCpsZGEpLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChhbHBoYSAqIHZlY3RvcihhY3R1YWxfeCwqbikpOworCisgIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBhY3R1YWxfeDsKKyAgaWYoYWN0dWFsX3khPXkpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeSx5LCpuLCppbmN5KTsKKworICByZXR1cm4gMTsKK30KKworLy8gQyA6PSBhbHBoYSp4KngnICsgQworaW50IEVJR0VOX0JMQVNfRlVOQyhzeXIpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpwYywgaW50ICpsZGMpCit7CisKKy8vICAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgY29uc3QgU2NhbGFyICosIGludCwgU2NhbGFyICosIGludCwgU2NhbGFyKTsKKy8vICAgc3RhdGljIGZ1bmN0eXBlIGZ1bmNbMl07CisKKy8vICAgc3RhdGljIGJvb2wgaW5pdCA9IGZhbHNlOworLy8gICBpZighaW5pdCkKKy8vICAgeworLy8gICAgIGZvcihpbnQgaz0wOyBrPDI7ICsraykKKy8vICAgICAgIGZ1bmNba10gPSAwOworLy8KKy8vICAgICBmdW5jW1VQXSA9IChpbnRlcm5hbDo6c2VsZmFkam9pbnRfcHJvZHVjdDxTY2FsYXIsQ29sTWFqb3IsQ29sTWFqb3IsZmFsc2UsVXBwZXJUcmlhbmd1bGFyPjo6cnVuKTsKKy8vICAgICBmdW5jW0xPXSA9IChpbnRlcm5hbDo6c2VsZmFkam9pbnRfcHJvZHVjdDxTY2FsYXIsQ29sTWFqb3IsQ29sTWFqb3IsZmFsc2UsTG93ZXJUcmlhbmd1bGFyPjo6cnVuKTsKKworLy8gICAgIGluaXQgPSB0cnVlOworLy8gICB9CisKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYWxwaGEpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlNZUiAgIiwmaW5mbyw2KTsKKworICBpZigqbj09MCB8fCBhbHBoYT09U2NhbGFyKDApKSByZXR1cm4gMTsKKworICAvLyBpZiB0aGUgaW5jcmVtZW50IGlzIG5vdCAxLCBsZXQncyBjb3B5IGl0IHRvIGEgdGVtcG9yYXJ5IHZlY3RvciB0byBlbmFibGUgdmVjdG9yaXphdGlvbgorICBTY2FsYXIqIHhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsKm4sKmluY3gpOworCisgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBtMihtYXRyaXgoYywqbiwqbiwqbGRjKSk7CisgIAorICAvLyBUT0RPIGNoZWNrIHdoeSB0aGlzIGlzIG5vdCBhY2N1cmF0ZSBlbm91Z2ggZm9yIGxhcGFjayB0ZXN0cworLy8gICBpZihVUExPKCp1cGxvKT09TE8pICAgICAgIG1hdHJpeChjLCpuLCpuLCpsZGMpLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKHZlY3Rvcih4X2NweSwqbiksIGFscGhhKTsKKy8vICAgZWxzZSBpZihVUExPKCp1cGxvKT09VVApICBtYXRyaXgoYywqbiwqbiwqbGRjKS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZSh2ZWN0b3IoeF9jcHksKm4pLCBhbHBoYSk7CisKKyAgaWYoVVBMTygqdXBsbyk9PUxPKQorICAgIGZvcihpbnQgaj0wO2o8Km47KytqKQorICAgICAgbWF0cml4KGMsKm4sKm4sKmxkYykuY29sKGopLnRhaWwoKm4taikgKz0gYWxwaGEgKiB4X2NweVtqXSAqIHZlY3Rvcih4X2NweStqLCpuLWopOworICBlbHNlCisgICAgZm9yKGludCBqPTA7ajwqbjsrK2opCisgICAgICBtYXRyaXgoYywqbiwqbiwqbGRjKS5jb2woaikuaGVhZChqKzEpICs9IGFscGhhICogeF9jcHlbal0gKiB2ZWN0b3IoeF9jcHksaisxKTsKKworICBpZih4X2NweSE9eCkgIGRlbGV0ZVtdIHhfY3B5OworCisgIHJldHVybiAxOworfQorCisvLyBDIDo9IGFscGhhKngqeScgKyBhbHBoYSp5KngnICsgQworaW50IEVJR0VOX0JMQVNfRlVOQyhzeXIyKShjaGFyICp1cGxvLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqcGMsIGludCAqbGRjKQoreworLy8gICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBjb25zdCBTY2FsYXIgKiwgaW50LCBjb25zdCBTY2FsYXIgKiwgaW50LCBTY2FsYXIgKiwgaW50LCBTY2FsYXIpOworLy8gICBzdGF0aWMgZnVuY3R5cGUgZnVuY1syXTsKKy8vCisvLyAgIHN0YXRpYyBib29sIGluaXQgPSBmYWxzZTsKKy8vICAgaWYoIWluaXQpCisvLyAgIHsKKy8vICAgICBmb3IoaW50IGs9MDsgazwyOyArK2spCisvLyAgICAgICBmdW5jW2tdID0gMDsKKy8vCisvLyAgICAgZnVuY1tVUF0gPSAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X3Byb2R1Y3Q8U2NhbGFyLENvbE1ham9yLENvbE1ham9yLGZhbHNlLFVwcGVyVHJpYW5ndWxhcj46OnJ1bik7CisvLyAgICAgZnVuY1tMT10gPSAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X3Byb2R1Y3Q8U2NhbGFyLENvbE1ham9yLENvbE1ham9yLGZhbHNlLExvd2VyVHJpYW5ndWxhcj46OnJ1bik7CisvLworLy8gICAgIGluaXQgPSB0cnVlOworLy8gICB9CisKKyAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKmluY3k9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmxkYzxzdGQ6Om1heCgxLCpuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJTWVIyICIsJmluZm8sNik7CisKKyAgaWYoYWxwaGE9PVNjYWxhcigwKSkKKyAgICByZXR1cm4gMTsKKworICBTY2FsYXIqIHhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsKm4sKmluY3gpOworICBTY2FsYXIqIHlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksKm4sKmluY3kpOworCisgIC8vIFRPRE8gcGVyZm9ybSBkaXJlY3QgY2FsbHMgdG8gdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbgorICBpZihVUExPKCp1cGxvKT09TE8pICAgICAgIG1hdHJpeChjLCpuLCpuLCpsZGMpLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKHZlY3Rvcih4X2NweSwqbiksIHZlY3Rvcih5X2NweSwqbiksIGFscGhhKTsKKyAgZWxzZSBpZihVUExPKCp1cGxvKT09VVApICBtYXRyaXgoYywqbiwqbiwqbGRjKS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZSh2ZWN0b3IoeF9jcHksKm4pLCB2ZWN0b3IoeV9jcHksKm4pLCBhbHBoYSk7CisKKyAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKKyAgaWYoeV9jcHkhPXkpICBkZWxldGVbXSB5X2NweTsKKworLy8gICBpbnQgY29kZSA9IFVQTE8oKnVwbG8pOworLy8gICBpZihjb2RlPj0yIHx8IGZ1bmNbY29kZV09PTApCisvLyAgICAgcmV0dXJuIDA7CisKKy8vICAgZnVuY1tjb2RlXSgqbiwgYSwgKmluY2EsIGIsICppbmNiLCBjLCAqbGRjLCBhbHBoYSk7CisgIHJldHVybiAxOworfQorCisvKiogIERTQk1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciAgb3BlcmF0aW9uCisgICoKKyAgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAorICAqICBBIGlzIGFuIG4gYnkgbiBzeW1tZXRyaWMgYmFuZCBtYXRyaXgsIHdpdGggayBzdXBlci1kaWFnb25hbHMuCisgICovCisvLyBpbnQgRUlHRU5fQkxBU19GVU5DKHNibXYpKCBjaGFyICp1cGxvLCBpbnQgKm4sIGludCAqaywgUmVhbFNjYWxhciAqYWxwaGEsIFJlYWxTY2FsYXIgKmEsIGludCAqbGRhLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciAqeCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpiZXRhLCBSZWFsU2NhbGFyICp5LCBpbnQgKmluY3kpCisvLyB7CisvLyAgIHJldHVybiAxOworLy8gfQorCisKKy8qKiAgRFNQTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbgorICAqCisgICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorICAqCisgICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyAgKiAgQSBpcyBhbiBuIGJ5IG4gc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgICoKKyAgKi8KKy8vIGludCBFSUdFTl9CTEFTX0ZVTkMoc3BtdikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICphbHBoYSwgUmVhbFNjYWxhciAqYXAsIFJlYWxTY2FsYXIgKngsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqYmV0YSwgUmVhbFNjYWxhciAqeSwgaW50ICppbmN5KQorLy8geworLy8gICByZXR1cm4gMTsKKy8vIH0KKworLyoqICBEU1BSICAgIHBlcmZvcm1zIHRoZSBzeW1tZXRyaWMgcmFuayAxIG9wZXJhdGlvbgorICAqCisgICogICAgIEEgOj0gYWxwaGEqeCp4JyArIEEsCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgaXMgYSByZWFsIHNjYWxhciwgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCBBIGlzIGFuCisgICogIG4gYnkgbiBzeW1tZXRyaWMgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyAgKi8KKy8vIGludCBFSUdFTl9CTEFTX0ZVTkMoc3ByKShjaGFyICp1cGxvLCBpbnQgKm4sIFNjYWxhciAqYWxwaGEsIFNjYWxhciAqeCwgaW50ICppbmN4LCBTY2FsYXIgKmFwKQorLy8geworLy8gICByZXR1cm4gMTsKKy8vIH0KKworLyoqICBEU1BSMiAgcGVyZm9ybXMgdGhlIHN5bW1ldHJpYyByYW5rIDIgb3BlcmF0aW9uCisgICoKKyAgKiAgICAgQSA6PSBhbHBoYSp4KnknICsgYWxwaGEqeSp4JyArIEEsCisgICoKKyAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuCisgICogIG4gYnkgbiBzeW1tZXRyaWMgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyAgKi8KKy8vIGludCBFSUdFTl9CTEFTX0ZVTkMoc3ByMikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICphbHBoYSwgUmVhbFNjYWxhciAqeCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICp5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKmFwKQorLy8geworLy8gICByZXR1cm4gMTsKKy8vIH0KKwpkaWZmIC0tZ2l0IGEvYmxhcy9sZXZlbDNfaW1wbC5oIGIvYmxhcy9sZXZlbDNfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzFmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2xldmVsM19pbXBsLmgKQEAgLTAsMCArMSw2MzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKK2ludCBFSUdFTl9CTEFTX0ZVTkMoZ2VtbSkoY2hhciAqb3BhLCBjaGFyICpvcGIsIGludCAqbSwgaW50ICpuLCBpbnQgKmssIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhLCBSZWFsU2NhbGFyICpwYiwgaW50ICpsZGIsIFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpwYywgaW50ICpsZGMpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gZ2VtbSAiIDw8ICpvcGEgPDwgIiAiIDw8ICpvcGIgPDwgIiAiIDw8ICptIDw8ICIgIiA8PCAqbiA8PCAiICIgPDwgKmsgPDwgIiAiIDw8ICpsZGEgPDwgIiAiIDw8ICpsZGIgPDwgIiAiIDw8ICpsZGMgPDwgIiAiIDw8ICpwYWxwaGEgPDwgIiAiIDw8ICpwYmV0YSA8PCAiXG4iOworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyLCBpbnRlcm5hbDo6bGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiwgRWlnZW46OmludGVybmFsOjpHZW1tUGFyYWxsZWxJbmZvPERlbnNlSW5kZXg+Kik7CisgIHN0YXRpYyBmdW5jdHlwZSBmdW5jWzEyXTsKKworICBzdGF0aWMgYm9vbCBpbml0ID0gZmFsc2U7CisgIGlmKCFpbml0KQorICB7CisgICAgZm9yKGludCBrPTA7IGs8MTI7ICsraykKKyAgICAgIGZ1bmNba10gPSAwOworICAgIGZ1bmNbTk9UUiAgfCAoTk9UUiA8PCAyKV0gPSAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLENvbE1ham9yLGZhbHNlLFNjYWxhcixDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChOT1RSIDw8IDIpXSA9IChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsZmFsc2UsU2NhbGFyLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKE5PVFIgPDwgMildID0gKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbTk9UUiAgfCAoVFIgICA8PCAyKV0gPSAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLENvbE1ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChUUiAgIDw8IDIpXSA9IChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsZmFsc2UsU2NhbGFyLFJvd01ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKFRSICAgPDwgMildID0gKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsUm93TWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbTk9UUiAgfCAoQURKICA8PCAyKV0gPSAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLENvbE1ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixDb25qLCBDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChBREogIDw8IDIpXSA9IChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsZmFsc2UsU2NhbGFyLFJvd01ham9yLENvbmosIENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKEFESiAgPDwgMildID0gKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsUm93TWFqb3IsQ29uaiwgQ29sTWFqb3I+OjpydW4pOworICAgIGluaXQgPSB0cnVlOworICB9CisKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGIpOworICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKKyAgU2NhbGFyIGFscGhhICA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhICAgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYmV0YSk7CisKKyAgaW50IGluZm8gPSAwOworICBpZihPUCgqb3BhKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKE9QKCpvcGIpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OworICBlbHNlIGlmKCprPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwoT1AoKm9wYSk9PU5PVFIpPyptOiprKSkgICAgICAgICAgICAgICAgICAgIGluZm8gPSA4OworICBlbHNlIGlmKCpsZGI8c3RkOjptYXgoMSwoT1AoKm9wYik9PU5PVFIpPyprOipuKSkgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxMDsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTM7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJHRU1NICIsJmluZm8sNik7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm0sICpuLCAqbGRjKS5zZXRaZXJvKCk7CisgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSAqPSBiZXRhOworICB9CisKKyAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsU2NhbGFyLFNjYWxhcixEeW5hbWljLER5bmFtaWMsRHluYW1pYz4gYmxvY2tpbmcoKm0sKm4sKmspOworCisgIGludCBjb2RlID0gT1AoKm9wYSkgfCAoT1AoKm9wYikgPDwgMik7CisgIGZ1bmNbY29kZV0oKm0sICpuLCAqaywgYSwgKmxkYSwgYiwgKmxkYiwgYywgKmxkYywgYWxwaGEsIGJsb2NraW5nLCAwKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBFSUdFTl9CTEFTX0ZVTkModHJzbSkoY2hhciAqc2lkZSwgY2hhciAqdXBsbywgY2hhciAqb3BhLCBjaGFyICpkaWFnLCBpbnQgKm0sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCAgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhLCBSZWFsU2NhbGFyICpwYiwgaW50ICpsZGIpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gdHJzbSAiIDw8ICpzaWRlIDw8ICIgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm9wYSA8PCAiICIgPDwgKmRpYWcgPDwgIiAiIDw8ICptIDw8ICIsIiA8PCAqbiA8PCAiICIgPDwgKnBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgKmxkYjw8ICJcbiI7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyICosIERlbnNlSW5kZXgsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mKTsKKyAgc3RhdGljIGZ1bmN0eXBlIGZ1bmNbMzJdOworCisgIHN0YXRpYyBib29sIGluaXQgPSBmYWxzZTsKKyAgaWYoIWluaXQpCisgIHsKKyAgICBmb3IoaW50IGs9MDsgazwzMjsgKytrKQorICAgICAgZnVuY1trXSA9IDA7CisKKyAgICBmdW5jW05PVFIgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgTG93ZXJ8MCwgICAgICAgICAgZmFsc2UsUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIExvd2VyfDAsICAgICAgICAgIENvbmosIFJvd01ham9yLENvbE1ham9yPjo6cnVuKTsKKworICAgIGZ1bmNbTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LFVwcGVyfDAsICAgICAgICAgIGZhbHNlLENvbE1ham9yLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW1RSICAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxMb3dlcnwwLCAgICAgICAgICBmYWxzZSxSb3dNYWpvcixDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsTG93ZXJ8MCwgICAgICAgICAgQ29uaiwgUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pOworCisgICAgZnVuY1tOT1RSICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgTG93ZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIFVwcGVyfDAsICAgICAgICAgIGZhbHNlLFJvd01ham9yLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICAgICBDb25qLCBSb3dNYWpvcixDb2xNYWpvcj46OnJ1bik7CisKKyAgICBmdW5jW05PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxMb3dlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsVXBwZXJ8MCwgICAgICAgICAgZmFsc2UsUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LFVwcGVyfDAsICAgICAgICAgIENvbmosIFJvd01ham9yLENvbE1ham9yPjo6cnVuKTsKKworCisgICAgZnVuY1tOT1RSICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3IsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLGZhbHNlLFJvd01ham9yLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBMb3dlcnxVbml0RGlhZyxDb25qLCBSb3dNYWpvcixDb2xNYWpvcj46OnJ1bik7CisKKyAgICBmdW5jW05PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxVcHBlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsTG93ZXJ8VW5pdERpYWcsZmFsc2UsUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LExvd2VyfFVuaXREaWFnLENvbmosIFJvd01ham9yLENvbE1ham9yPjo6cnVuKTsKKworICAgIGZ1bmNbTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW1RSICAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBVcHBlcnxVbml0RGlhZyxmYWxzZSxSb3dNYWpvcixDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsQ29uaiwgUm93TWFqb3IsQ29sTWFqb3I+OjpydW4pOworCisgICAgZnVuY1tOT1RSICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KV0gPSAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsTG93ZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3IsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCldID0gKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LFVwcGVyfFVuaXREaWFnLGZhbHNlLFJvd01ham9yLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpXSA9IChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxVcHBlcnxVbml0RGlhZyxDb25qLCBSb3dNYWpvcixDb2xNYWpvcj46OnJ1bik7CisKKyAgICBpbml0ID0gdHJ1ZTsKKyAgfQorCisgIFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGEpOworICBTY2FsYXIqIGIgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiKTsKKyAgU2NhbGFyICBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisKKyAgaW50IGluZm8gPSAwOworICBpZihTSURFKCpzaWRlKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOworICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOworICBlbHNlIGlmKE9QKCpvcGEpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOworICBlbHNlIGlmKERJQUcoKmRpYWcpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OworICBlbHNlIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OworICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA2OworICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwoU0lERSgqc2lkZSk9PUxFRlQpPyptOipuKSkgICAgICAgICAgICAgICAgIGluZm8gPSA5OworICBlbHNlIGlmKCpsZGI8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxMTsKKyAgaWYoaW5mbykKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlRSU00gIiwmaW5mbyw2KTsKKworICBpbnQgY29kZSA9IE9QKCpvcGEpIHwgKFNJREUoKnNpZGUpIDw8IDIpIHwgKFVQTE8oKnVwbG8pIDw8IDMpIHwgKERJQUcoKmRpYWcpIDw8IDQpOworICAKKyAgaWYoU0lERSgqc2lkZSk9PUxFRlQpCisgIHsKKyAgICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixTY2FsYXIsU2NhbGFyLER5bmFtaWMsRHluYW1pYyxEeW5hbWljLDQ+IGJsb2NraW5nKCptLCpuLCptKTsKKyAgICBmdW5jW2NvZGVdKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYmxvY2tpbmcpOworICB9CisgIGVsc2UKKyAgeworICAgIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLFNjYWxhcixTY2FsYXIsRHluYW1pYyxEeW5hbWljLER5bmFtaWMsND4gYmxvY2tpbmcoKm0sKm4sKm4pOworICAgIGZ1bmNbY29kZV0oKm4sICptLCBhLCAqbGRhLCBiLCAqbGRiLCBibG9ja2luZyk7CisgIH0KKworICBpZihhbHBoYSE9U2NhbGFyKDEpKQorICAgIG1hdHJpeChiLCptLCpuLCpsZGIpICo9IGFscGhhOworCisgIHJldHVybiAwOworfQorCisKKy8vIGIgPSBhbHBoYSpvcChhKSpiICBmb3Igc2lkZSA9ICdMJ29yJ2wnCisvLyBiID0gYWxwaGEqYipvcChhKSAgZm9yIHNpZGUgPSAnUidvcidyJworaW50IEVJR0VOX0JMQVNfRlVOQyh0cm1tKShjaGFyICpzaWRlLCBjaGFyICp1cGxvLCBjaGFyICpvcGEsIGNoYXIgKmRpYWcsIGludCAqbSwgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsICBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBpbnQgKmxkYikKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJpbiB0cm1tICIgPDwgKnNpZGUgPDwgIiAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqb3BhIDw8ICIgIiA8PCAqZGlhZyA8PCAiICIgPDwgKm0gPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCAqbGRhIDw8ICIgIiA8PCAqbGRiIDw8ICIgIiA8PCAqcGFscGhhIDw8ICJcbiI7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsIFNjYWxhciAqLCBEZW5zZUluZGV4LCBTY2FsYXIsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mKTsKKyAgc3RhdGljIGZ1bmN0eXBlIGZ1bmNbMzJdOworICBzdGF0aWMgYm9vbCBpbml0ID0gZmFsc2U7CisgIGlmKCFpbml0KQorICB7CisgICAgZm9yKGludCBrPTA7IGs8MzI7ICsraykKKyAgICAgIGZ1bmNba10gPSAwOworCisgICAgZnVuY1tOT1RSICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KV0gPSAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfDAsICAgICAgICAgIHRydWUsIENvbE1ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW1RSICAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpXSA9IChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8MCwgICAgICAgICAgdHJ1ZSwgUm93TWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCldID0gKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnwwLCAgICAgICAgICB0cnVlLCBSb3dNYWpvcixDb25qLCBDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisKKyAgICBmdW5jW05PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpXSA9IChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCldID0gKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixmYWxzZSxSb3dNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KV0gPSAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfDAsICAgICAgICAgIGZhbHNlLENvbE1ham9yLGZhbHNlLFJvd01ham9yLENvbmosIENvbE1ham9yPjo6cnVuKTsKKworICAgIGZ1bmNbTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCldID0gKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnwwLCAgICAgICAgICB0cnVlLCBDb2xNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KV0gPSAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfDAsICAgICAgICAgIHRydWUsIFJvd01ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpXSA9IChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8MCwgICAgICAgICAgdHJ1ZSwgUm93TWFqb3IsQ29uaiwgQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworCisgICAgZnVuY1tOT1RSICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KV0gPSAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfDAsICAgICAgICAgIGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW1RSICAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpXSA9IChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsZmFsc2UsUm93TWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCldID0gKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixmYWxzZSxSb3dNYWpvcixDb25qLCBDb2xNYWpvcj46OnJ1bik7CisKKyAgICBmdW5jW05PVFIgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpXSA9IChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8VW5pdERpYWcsdHJ1ZSwgQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCldID0gKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnxVbml0RGlhZyx0cnVlLCBSb3dNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KV0gPSAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfFVuaXREaWFnLHRydWUsIFJvd01ham9yLENvbmosIENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKworICAgIGZ1bmNbTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCldID0gKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KV0gPSAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLGZhbHNlLFJvd01ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpXSA9IChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3IsZmFsc2UsUm93TWFqb3IsQ29uaiwgQ29sTWFqb3I+OjpydW4pOworCisgICAgZnVuY1tOT1RSICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KV0gPSAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfFVuaXREaWFnLHRydWUsIENvbE1ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yPjo6cnVuKTsKKyAgICBmdW5jW1RSICAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpXSA9IChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8VW5pdERpYWcsdHJ1ZSwgUm93TWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbQURKICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCldID0gKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnxVbml0RGlhZyx0cnVlLCBSb3dNYWpvcixDb25qLCBDb2xNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisKKyAgICBmdW5jW05PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpXSA9IChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3I+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCldID0gKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixmYWxzZSxSb3dNYWpvcixmYWxzZSxDb2xNYWpvcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KV0gPSAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLGZhbHNlLFJvd01ham9yLENvbmosIENvbE1ham9yPjo6cnVuKTsKKworICAgIGluaXQgPSB0cnVlOworICB9CisKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGIpOworICBTY2FsYXIgIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFNJREUoKnNpZGUpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoT1AoKm9wYSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoRElBRygqZGlhZyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKm08MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDY7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLChTSURFKCpzaWRlKT09TEVGVCk/Km06Km4pKSAgICAgICAgICAgICAgICAgaW5mbyA9IDk7CisgIGVsc2UgaWYoKmxkYjxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDExOworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiVFJNTSAiLCZpbmZvLDYpOworCisgIGludCBjb2RlID0gT1AoKm9wYSkgfCAoU0lERSgqc2lkZSkgPDwgMikgfCAoVVBMTygqdXBsbykgPDwgMykgfCAoRElBRygqZGlhZykgPDwgNCk7CisKKyAgaWYoKm09PTAgfHwgKm49PTApCisgICAgcmV0dXJuIDE7CisKKyAgLy8gRklYTUUgZmluZCBhIHdheSB0byBhdm9pZCB0aGlzIGNvcHkKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IHRtcCA9IG1hdHJpeChiLCptLCpuLCpsZGIpOworICBtYXRyaXgoYiwqbSwqbiwqbGRiKS5zZXRaZXJvKCk7CisKKyAgaWYoU0lERSgqc2lkZSk9PUxFRlQpCisgIHsKKyAgICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixTY2FsYXIsU2NhbGFyLER5bmFtaWMsRHluYW1pYyxEeW5hbWljLDQ+IGJsb2NraW5nKCptLCpuLCptKTsKKyAgICBmdW5jW2NvZGVdKCptLCAqbiwgKm0sIGEsICpsZGEsIHRtcC5kYXRhKCksIHRtcC5vdXRlclN0cmlkZSgpLCBiLCAqbGRiLCBhbHBoYSwgYmxvY2tpbmcpOworICB9CisgIGVsc2UKKyAgeworICAgIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLFNjYWxhcixTY2FsYXIsRHluYW1pYyxEeW5hbWljLER5bmFtaWMsND4gYmxvY2tpbmcoKm0sKm4sKm4pOworICAgIGZ1bmNbY29kZV0oKm0sICpuLCAqbiwgdG1wLmRhdGEoKSwgdG1wLm91dGVyU3RyaWRlKCksIGEsICpsZGEsIGIsICpsZGIsIGFscGhhLCBibG9ja2luZyk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIGMgPSBhbHBoYSphKmIgKyBiZXRhKmMgIGZvciBzaWRlID0gJ0wnb3InbCcKKy8vIGMgPSBhbHBoYSpiKmEgKyBiZXRhKmMgIGZvciBzaWRlID0gJ1Inb3IncgoraW50IEVJR0VOX0JMQVNfRlVOQyhzeW1tKShjaGFyICpzaWRlLCBjaGFyICp1cGxvLCBpbnQgKm0sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBpbnQgKmxkYiwgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBpbnQgKmxkYykKK3sKKy8vICAgc3RkOjpjZXJyIDw8ICJpbiBzeW1tICIgPDwgKnNpZGUgPDwgIiAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqbSA8PCAieCIgPDwgKm4gPDwgIiBsZGE6IiA8PCAqbGRhIDw8ICIgbGRiOiIgPDwgKmxkYiA8PCAiIGxkYzoiIDw8ICpsZGMgPDwgIiBhbHBoYToiIDw8ICpwYWxwaGEgPDwgIiBiZXRhOiIgPDwgKnBiZXRhIDw8ICJcbiI7CisgIFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGEpOworICBTY2FsYXIqIGIgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiKTsKKyAgU2NhbGFyKiBjID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhICA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiZXRhKTsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFNJREUoKnNpZGUpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKm08MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLChTSURFKCpzaWRlKT09TEVGVCk/Km06Km4pKSAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmxkYjxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7CisgIGVsc2UgaWYoKmxkYzxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEyOworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiU1lNTSAiLCZpbmZvLDYpOworCisgIGlmKGJldGEhPVNjYWxhcigxKSkKKyAgeworICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICptLCAqbiwgKmxkYykuc2V0WmVybygpOworICAgIGVsc2UgICAgICAgICAgICAgICAgbWF0cml4KGMsICptLCAqbiwgKmxkYykgKj0gYmV0YTsKKyAgfQorCisgIGlmKCptPT0wIHx8ICpuPT0wKQorICB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAjaWYgSVNDT01QTEVYCisgIC8vIEZJWE1FIGFkZCBzdXBwb3J0IGZvciBzeW1tZXRyaWMgY29tcGxleCBtYXRyaXgKKyAgaW50IHNpemUgPSAoU0lERSgqc2lkZSk9PUxFRlQpID8gKCptKSA6ICgqbik7CisgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiBtYXRBKHNpemUsc2l6ZSk7CisgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgeworICAgIG1hdEEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBtYXRyaXgoYSxzaXplLHNpemUsKmxkYSk7CisgICAgbWF0QS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSA9IG1hdHJpeChhLHNpemUsc2l6ZSwqbGRhKS50cmFuc3Bvc2UoKTsKKyAgfQorICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1MTykKKyAgeworICAgIG1hdEEudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgPSBtYXRyaXgoYSxzaXplLHNpemUsKmxkYSk7CisgICAgbWF0QS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IG1hdHJpeChhLHNpemUsc2l6ZSwqbGRhKS50cmFuc3Bvc2UoKTsKKyAgfQorICBpZihTSURFKCpzaWRlKT09TEVGVCkKKyAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSArPSBhbHBoYSAqIG1hdEEgKiBtYXRyaXgoYiwgKm0sICpuLCAqbGRiKTsKKyAgZWxzZSBpZihTSURFKCpzaWRlKT09UklHSFQpCisgICAgbWF0cml4KGMsICptLCAqbiwgKmxkYykgKz0gYWxwaGEgKiBtYXRyaXgoYiwgKm0sICpuLCAqbGRiKSAqIG1hdEE7CisgICNlbHNlCisgIGlmKFNJREUoKnNpZGUpPT1MRUZUKQorICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkgICAgICAgaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgUm93TWFqb3IsdHJ1ZSxmYWxzZSwgQ29sTWFqb3IsZmFsc2UsZmFsc2UsIENvbE1ham9yPjo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgKmxkYywgYWxwaGEpOworICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKSAgaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgQ29sTWFqb3IsdHJ1ZSxmYWxzZSwgQ29sTWFqb3IsZmFsc2UsZmFsc2UsIENvbE1ham9yPjo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgKmxkYywgYWxwaGEpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgIGVsc2UgaWYoU0lERSgqc2lkZSk9PVJJR0hUKQorICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkgICAgICAgaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgQ29sTWFqb3IsZmFsc2UsZmFsc2UsIFJvd01ham9yLHRydWUsZmFsc2UsIENvbE1ham9yPjo6cnVuKCptLCAqbiwgYiwgKmxkYiwgYSwgKmxkYSwgYywgKmxkYywgYWxwaGEpOworICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKSAgaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgQ29sTWFqb3IsZmFsc2UsZmFsc2UsIENvbE1ham9yLHRydWUsZmFsc2UsIENvbE1ham9yPjo6cnVuKCptLCAqbiwgYiwgKmxkYiwgYSwgKmxkYSwgYywgKmxkYywgYWxwaGEpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKKyAgI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGMgPSBhbHBoYSphKmEnICsgYmV0YSpjICBmb3Igb3AgPSAnTidvciduJworLy8gYyA9IGFscGhhKmEnKmEgKyBiZXRhKmMgIGZvciBvcCA9ICdUJ29yJ3QnLCdDJ29yJ2MnCitpbnQgRUlHRU5fQkxBU19GVU5DKHN5cmspKGNoYXIgKnVwbG8sIGNoYXIgKm9wLCBpbnQgKm4sIGludCAqaywgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpwYywgaW50ICpsZGMpCit7CisvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gc3lyayAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqb3AgPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCAqayA8PCAiICIgPDwgKnBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgKnBiZXRhIDw8ICIgIiA8PCAqbGRjIDw8ICJcbiI7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsIFNjYWxhciAqLCBEZW5zZUluZGV4LCBTY2FsYXIpOworICBzdGF0aWMgZnVuY3R5cGUgZnVuY1s4XTsKKworICBzdGF0aWMgYm9vbCBpbml0ID0gZmFsc2U7CisgIGlmKCFpbml0KQorICB7CisgICAgZm9yKGludCBrPTA7IGs8ODsgKytrKQorICAgICAgZnVuY1trXSA9IDA7CisKKyAgICBmdW5jW05PVFIgIHwgKFVQIDw8IDIpXSA9IChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixDb2xNYWpvcixmYWxzZSxTY2FsYXIsUm93TWFqb3IsQ29sTWFqb3IsQ29uaiwgVXBwZXI+OjpydW4pOworICAgIGZ1bmNbVFIgICAgfCAoVVAgPDwgMildID0gKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLFJvd01ham9yLGZhbHNlLFNjYWxhcixDb2xNYWpvcixDb2xNYWpvcixDb25qLCBVcHBlcj46OnJ1bik7CisgICAgZnVuY1tBREogICB8IChVUCA8PCAyKV0gPSAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsQ29uaiwgU2NhbGFyLENvbE1ham9yLENvbE1ham9yLGZhbHNlLFVwcGVyPjo6cnVuKTsKKworICAgIGZ1bmNbTk9UUiAgfCAoTE8gPDwgMildID0gKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLENvbE1ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixDb2xNYWpvcixDb25qLCBMb3dlcj46OnJ1bik7CisgICAgZnVuY1tUUiAgICB8IChMTyA8PCAyKV0gPSAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsZmFsc2UsU2NhbGFyLENvbE1ham9yLENvbE1ham9yLENvbmosIExvd2VyPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKExPIDw8IDIpXSA9IChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsQ29sTWFqb3IsQ29sTWFqb3IsZmFsc2UsTG93ZXI+OjpydW4pOworCisgICAgaW5pdCA9IHRydWU7CisgIH0KKworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiBjID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhICA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiZXRhKTsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoT1AoKm9wKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoKms8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLChPUCgqb3ApPT1OT1RSKT8qbjoqaykpICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmxkYzxzdGQ6Om1heCgxLCpuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEwOworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiU1lSSyAiLCZpbmZvLDYpOworCisgIGlmKGJldGEhPVNjYWxhcigxKSkKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0WmVybygpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqPSBiZXRhOworICAgIGVsc2UKKyAgICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc2V0WmVybygpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqPSBiZXRhOworICB9CisKKyAgI2lmIElTQ09NUExFWAorICAvLyBGSVhNRSBhZGQgc3VwcG9ydCBmb3Igc3ltbWV0cmljIGNvbXBsZXggbWF0cml4CisgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgeworICAgIGlmKE9QKCpvcCk9PU5PVFIpCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPSBhbHBoYSAqIG1hdHJpeChhLCpuLCprLCpsZGEpICogbWF0cml4KGEsKm4sKmssKmxkYSkudHJhbnNwb3NlKCk7CisgICAgZWxzZQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKz0gYWxwaGEgKiBtYXRyaXgoYSwqaywqbiwqbGRhKS50cmFuc3Bvc2UoKSAqIG1hdHJpeChhLCprLCpuLCpsZGEpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmKE9QKCpvcCk9PU5PVFIpCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSArPSBhbHBoYSAqIG1hdHJpeChhLCpuLCprLCpsZGEpICogbWF0cml4KGEsKm4sKmssKmxkYSkudHJhbnNwb3NlKCk7CisgICAgZWxzZQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKz0gYWxwaGEgKiBtYXRyaXgoYSwqaywqbiwqbGRhKS50cmFuc3Bvc2UoKSAqIG1hdHJpeChhLCprLCpuLCpsZGEpOworICB9CisgICNlbHNlCisgIGludCBjb2RlID0gT1AoKm9wKSB8IChVUExPKCp1cGxvKSA8PCAyKTsKKyAgZnVuY1tjb2RlXSgqbiwgKmssIGEsICpsZGEsIGEsICpsZGEsIGMsICpsZGMsIGFscGhhKTsKKyAgI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGMgPSBhbHBoYSphKmInICsgYWxwaGEqYiphJyArIGJldGEqYyAgZm9yIG9wID0gJ04nb3InbicKKy8vIGMgPSBhbHBoYSphJypiICsgYWxwaGEqYicqYSArIGJldGEqYyAgZm9yIG9wID0gJ1Qnb3IndCcKK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3lyMmspKGNoYXIgKnVwbG8sIGNoYXIgKm9wLCBpbnQgKm4sIGludCAqaywgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBpbnQgKmxkYiwgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBpbnQgKmxkYykKK3sKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGIpOworICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGJldGEpOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihPUCgqb3ApPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqazwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqbGRiPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTI7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJTWVIySyIsJmluZm8sNik7CisKKyAgaWYoYmV0YSE9U2NhbGFyKDEpKQorICB7CisgICAgaWYoVVBMTygqdXBsbyk9PVVQKQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICo9IGJldGE7CisgICAgZWxzZQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICo9IGJldGE7CisgIH0KKworICBpZigqaz09MCkKKyAgICByZXR1cm4gMTsKKworICBpZihPUCgqb3ApPT1OT1RSKQorICB7CisgICAgaWYoVVBMTygqdXBsbyk9PVVQKQorICAgIHsKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgICs9IGFscGhhICptYXRyaXgoYSwgKm4sICprLCAqbGRhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKS50cmFuc3Bvc2UoKQorICAgICAgICArICBhbHBoYSptYXRyaXgoYiwgKm4sICprLCAqbGRiKSptYXRyaXgoYSwgKm4sICprLCAqbGRhKS50cmFuc3Bvc2UoKTsKKyAgICB9CisgICAgZWxzZSBpZihVUExPKCp1cGxvKT09TE8pCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKQorICAgICAgICArPSBhbHBoYSptYXRyaXgoYSwgKm4sICprLCAqbGRhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKS50cmFuc3Bvc2UoKQorICAgICAgICArICBhbHBoYSptYXRyaXgoYiwgKm4sICprLCAqbGRiKSptYXRyaXgoYSwgKm4sICprLCAqbGRhKS50cmFuc3Bvc2UoKTsKKyAgfQorICBlbHNlIGlmKE9QKCpvcCk9PVRSIHx8IE9QKCpvcCk9PUFESikKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgICs9IGFscGhhKm1hdHJpeChhLCAqaywgKm4sICpsZGEpLnRyYW5zcG9zZSgpKm1hdHJpeChiLCAqaywgKm4sICpsZGIpCisgICAgICAgICsgIGFscGhhKm1hdHJpeChiLCAqaywgKm4sICpsZGIpLnRyYW5zcG9zZSgpKm1hdHJpeChhLCAqaywgKm4sICpsZGEpOworICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkKKyAgICAgICAgKz0gYWxwaGEqbWF0cml4KGEsICprLCAqbiwgKmxkYSkudHJhbnNwb3NlKCkqbWF0cml4KGIsICprLCAqbiwgKmxkYikKKyAgICAgICAgKyAgYWxwaGEqbWF0cml4KGIsICprLCAqbiwgKmxkYikudHJhbnNwb3NlKCkqbWF0cml4KGEsICprLCAqbiwgKmxkYSk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworCisjaWYgSVNDT01QTEVYCisKKy8vIGMgPSBhbHBoYSphKmIgKyBiZXRhKmMgIGZvciBzaWRlID0gJ0wnb3InbCcKKy8vIGMgPSBhbHBoYSpiKmEgKyBiZXRhKmMgIGZvciBzaWRlID0gJ1Inb3IncgoraW50IEVJR0VOX0JMQVNfRlVOQyhoZW1tKShjaGFyICpzaWRlLCBjaGFyICp1cGxvLCBpbnQgKm0sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBpbnQgKmxkYiwgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBpbnQgKmxkYykKK3sKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGIpOworICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGJldGEpOworCisvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gaGVtbSAiIDw8ICpzaWRlIDw8ICIgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm0gPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgYmV0YSA8PCAiICIgPDwgKmxkYyA8PCAiXG4iOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoU0lERSgqc2lkZSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKFNJREUoKnNpZGUpPT1MRUZUKT8qbToqbikpICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqbGRiPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTI7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRU1NICIsJmluZm8sNik7CisKKyAgaWYoYmV0YT09U2NhbGFyKDApKSAgICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKS5zZXRaZXJvKCk7CisgIGVsc2UgaWYoYmV0YSE9U2NhbGFyKDEpKSAgbWF0cml4KGMsICptLCAqbiwgKmxkYykgKj0gYmV0YTsKKworICBpZigqbT09MCB8fCAqbj09MCkKKyAgeworICAgIHJldHVybiAxOworICB9CisKKyAgaWYoU0lERSgqc2lkZSk9PUxFRlQpCisgIHsKKyAgICBpZihVUExPKCp1cGxvKT09VVApICAgICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxSb3dNYWpvcix0cnVlLENvbmosICBDb2xNYWpvcixmYWxzZSxmYWxzZSwgQ29sTWFqb3I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgKmxkYywgYWxwaGEpOworICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKSAgaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LENvbE1ham9yLHRydWUsZmFsc2UsIENvbE1ham9yLGZhbHNlLGZhbHNlLCBDb2xNYWpvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpydW4oKm0sICpuLCBhLCAqbGRhLCBiLCAqbGRiLCBjLCAqbGRjLCBhbHBoYSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIGlmKFNJREUoKnNpZGUpPT1SSUdIVCkKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkgICAgICAgbWF0cml4KGMsKm0sKm4sKmxkYykgKz0gYWxwaGEgKiBtYXRyaXgoYiwqbSwqbiwqbGRiKSAqIG1hdHJpeChhLCpuLCpuLCpsZGEpLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsvKmludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxDb2xNYWpvcixmYWxzZSxmYWxzZSwgUm93TWFqb3IsdHJ1ZSxDb25qLCAgQ29sTWFqb3I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6cnVuKCptLCAqbiwgYiwgKmxkYiwgYSwgKmxkYSwgYywgKmxkYywgYWxwaGEpOyovCisgICAgZWxzZSBpZihVUExPKCp1cGxvKT09TE8pICBpbnRlcm5hbDo6cHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsQ29sTWFqb3IsZmFsc2UsZmFsc2UsIENvbE1ham9yLHRydWUsZmFsc2UsIENvbE1ham9yPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnJ1bigqbSwgKm4sIGIsICpsZGIsIGEsICpsZGEsIGMsICpsZGMsIGFscGhhKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGMgPSBhbHBoYSphKmNvbmooYScpICsgYmV0YSpjICBmb3Igb3AgPSAnTidvciduJworLy8gYyA9IGFscGhhKmNvbmooYScpKmEgKyBiZXRhKmMgIGZvciBvcCAgPSAnQydvcidjJworaW50IEVJR0VOX0JMQVNfRlVOQyhoZXJrKShjaGFyICp1cGxvLCBjaGFyICpvcCwgaW50ICpuLCBpbnQgKmssIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhLCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcGMsIGludCAqbGRjKQoreworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyKTsKKyAgc3RhdGljIGZ1bmN0eXBlIGZ1bmNbOF07CisKKyAgc3RhdGljIGJvb2wgaW5pdCA9IGZhbHNlOworICBpZighaW5pdCkKKyAgeworICAgIGZvcihpbnQgaz0wOyBrPDg7ICsraykKKyAgICAgIGZ1bmNba10gPSAwOworCisgICAgZnVuY1tOT1RSICB8IChVUCA8PCAyKV0gPSAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsU2NhbGFyLFJvd01ham9yLENvbmosIENvbE1ham9yLFVwcGVyPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKFVQIDw8IDIpXSA9IChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsVXBwZXI+OjpydW4pOworCisgICAgZnVuY1tOT1RSICB8IChMTyA8PCAyKV0gPSAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsU2NhbGFyLFJvd01ham9yLENvbmosIENvbE1ham9yLExvd2VyPjo6cnVuKTsKKyAgICBmdW5jW0FESiAgIHwgKExPIDw8IDIpXSA9IChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsTG93ZXI+OjpydW4pOworCisgICAgaW5pdCA9IHRydWU7CisgIH0KKworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiBjID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7CisgIFJlYWxTY2FsYXIgYWxwaGEgPSAqcGFscGhhOworICBSZWFsU2NhbGFyIGJldGEgID0gKnBiZXRhOworCisvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gaGVyayAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqb3AgPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCAqayA8PCAiICIgPDwgYWxwaGEgPDwgIiAiIDw8ICpsZGEgPDwgIiAiIDw8IGJldGEgPDwgIiAiIDw8ICpsZGMgPDwgIlxuIjsKKworICBpbnQgaW5mbyA9IDA7CisgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYoKE9QKCpvcCk9PUlOVkFMSUQpIHx8IChPUCgqb3ApPT1UUikpICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYoKms8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLChPUCgqb3ApPT1OT1RSKT8qbjoqaykpICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYoKmxkYzxzdGQ6Om1heCgxLCpuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEwOworICBpZihpbmZvKQorICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiSEVSSyAiLCZpbmZvLDYpOworCisgIGludCBjb2RlID0gT1AoKm9wKSB8IChVUExPKCp1cGxvKSA8PCAyKTsKKworICBpZihiZXRhIT1SZWFsU2NhbGFyKDEpKQorICB7CisgICAgaWYoVVBMTygqdXBsbyk9PVVQKQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkgKj0gYmV0YTsKKyAgICBlbHNlCisgICAgICBpZihiZXRhPT1TY2FsYXIoMCkpIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNldFplcm8oKTsKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKSAqPSBiZXRhOworICAKKyAgICBpZihiZXRhIT1TY2FsYXIoMCkpCisgICAgeworICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykuZGlhZ29uYWwoKS5yZWFsKCkgKj0gYmV0YTsKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLmRpYWdvbmFsKCkuaW1hZygpLnNldFplcm8oKTsKKyAgICB9CisgIH0KKworICBpZigqaz4wICYmIGFscGhhIT1SZWFsU2NhbGFyKDApKQorICB7CisgICAgZnVuY1tjb2RlXSgqbiwgKmssIGEsICpsZGEsIGEsICpsZGEsIGMsICpsZGMsIGFscGhhKTsKKyAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS5kaWFnb25hbCgpLmltYWcoKS5zZXRaZXJvKCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIGMgPSBhbHBoYSphKmNvbmooYicpICsgY29uaihhbHBoYSkqYipjb25qKGEnKSArIGJldGEqYywgIGZvciBvcCA9ICdOJ29yJ24nCisvLyBjID0gYWxwaGEqY29uaihhJykqYiArIGNvbmooYWxwaGEpKmNvbmooYicpKmEgKyBiZXRhKmMsICBmb3Igb3AgPSAnQydvcidjJworaW50IEVJR0VOX0JMQVNfRlVOQyhoZXIyaykoY2hhciAqdXBsbywgY2hhciAqb3AsIGludCAqbiwgaW50ICprLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcGIsIGludCAqbGRiLCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcGMsIGludCAqbGRjKQoreworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYik7CisgIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYWxwaGEpOworICBSZWFsU2NhbGFyIGJldGEgID0gKnBiZXRhOworCisgIGludCBpbmZvID0gMDsKKyAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKKyAgZWxzZSBpZigoT1AoKm9wKT09SU5WQUxJRCkgfHwgKE9QKCpvcCk9PVRSKSkgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKKyAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKKyAgZWxzZSBpZigqazwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKKyAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKKyAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTI7CisgIGlmKGluZm8pCisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRVIySyIsJmluZm8sNik7CisKKyAgaWYoYmV0YSE9UmVhbFNjYWxhcigxKSkKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0WmVybygpOworICAgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpICo9IGJldGE7CisgICAgZWxzZQorICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkgKj0gYmV0YTsKKworICAgIGlmKGJldGEhPVNjYWxhcigwKSkKKyAgICB7CisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS5kaWFnb25hbCgpLnJlYWwoKSAqPSBiZXRhOworICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykuZGlhZ29uYWwoKS5pbWFnKCkuc2V0WmVybygpOworICAgIH0KKyAgfQorICBlbHNlIGlmKCprPjAgJiYgYWxwaGEhPVNjYWxhcigwKSkKKyAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS5kaWFnb25hbCgpLmltYWcoKS5zZXRaZXJvKCk7CisKKyAgaWYoKms9PTApCisgICAgcmV0dXJuIDE7CisKKyAgaWYoT1AoKm9wKT09Tk9UUikKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgICB7CisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorICAgICAgICArPSAgICAgICAgIGFscGhhICptYXRyaXgoYSwgKm4sICprLCAqbGRhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKS5hZGpvaW50KCkKKyAgICAgICAgKyAgaW50ZXJuYWw6OmNvbmooYWxwaGEpKm1hdHJpeChiLCAqbiwgKmssICpsZGIpKm1hdHJpeChhLCAqbiwgKmssICpsZGEpLmFkam9pbnQoKTsKKyAgICB9CisgICAgZWxzZSBpZihVUExPKCp1cGxvKT09TE8pCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKQorICAgICAgICArPSBhbHBoYSptYXRyaXgoYSwgKm4sICprLCAqbGRhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKS5hZGpvaW50KCkKKyAgICAgICAgKyAgaW50ZXJuYWw6OmNvbmooYWxwaGEpKm1hdHJpeChiLCAqbiwgKmssICpsZGIpKm1hdHJpeChhLCAqbiwgKmssICpsZGEpLmFkam9pbnQoKTsKKyAgfQorICBlbHNlIGlmKE9QKCpvcCk9PUFESikKKyAgeworICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgICs9IGFscGhhKm1hdHJpeChhLCAqaywgKm4sICpsZGEpLmFkam9pbnQoKSptYXRyaXgoYiwgKmssICpuLCAqbGRiKQorICAgICAgICArICBpbnRlcm5hbDo6Y29uaihhbHBoYSkqbWF0cml4KGIsICprLCAqbiwgKmxkYikuYWRqb2ludCgpKm1hdHJpeChhLCAqaywgKm4sICpsZGEpOworICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkKKyAgICAgICAgKz0gYWxwaGEqbWF0cml4KGEsICprLCAqbiwgKmxkYSkuYWRqb2ludCgpKm1hdHJpeChiLCAqaywgKm4sICpsZGIpCisgICAgICAgICsgIGludGVybmFsOjpjb25qKGFscGhhKSptYXRyaXgoYiwgKmssICpuLCAqbGRiKS5hZGpvaW50KCkqbWF0cml4KGEsICprLCAqbiwgKmxkYSk7CisgIH0KKworICByZXR1cm4gMTsKK30KKworI2VuZGlmIC8vIElTQ09NUExFWApkaWZmIC0tZ2l0IGEvYmxhcy9sc2FtZS5mIGIvYmxhcy9sc2FtZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MzY5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL2xzYW1lLmYKQEAgLTAsMCArMSw4NSBAQAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMU0FNRShDQSxDQikKKyoKKyogIC0tIExBUEFDSyBhdXhpbGlhcnkgcm91dGluZSAodmVyc2lvbiAzLjEpIC0tCisqICAgICBVbml2LiBvZiBUZW5uZXNzZWUsIFVuaXYuIG9mIENhbGlmb3JuaWEgQmVya2VsZXkgYW5kIE5BRyBMdGQuLgorKiAgICAgTm92ZW1iZXIgMjAwNgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ0hBUkFDVEVSIENBLENCCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgTFNBTUUgcmV0dXJucyAuVFJVRS4gaWYgQ0EgaXMgdGhlIHNhbWUgbGV0dGVyIGFzIENCIHJlZ2FyZGxlc3Mgb2YKKyogIGNhc2UuCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PQorKgorKiAgQ0EgICAgICAoaW5wdXQpIENIQVJBQ1RFUioxCisqCisqICBDQiAgICAgIChpbnB1dCkgQ0hBUkFDVEVSKjEKKyogICAgICAgICAgQ0EgYW5kIENCIHNwZWNpZnkgdGhlIHNpbmdsZSBjaGFyYWN0ZXJzIHRvIGJlIGNvbXBhcmVkLgorKgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyBJQ0hBUgorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgSU5UQSxJTlRCLFpDT0RFCisqICAgICAuLgorKgorKiAgICAgVGVzdCBpZiB0aGUgY2hhcmFjdGVycyBhcmUgZXF1YWwKKyoKKyAgICAgIExTQU1FID0gQ0EgLkVRLiBDQgorICAgICAgSUYgKExTQU1FKSBSRVRVUk4KKyoKKyogICAgIE5vdyB0ZXN0IGZvciBlcXVpdmFsZW5jZSBpZiBib3RoIGNoYXJhY3RlcnMgYXJlIGFscGhhYmV0aWMuCisqCisgICAgICBaQ09ERSA9IElDSEFSKCdaJykKKyoKKyogICAgIFVzZSAnWicgcmF0aGVyIHRoYW4gJ0EnIHNvIHRoYXQgQVNDSUkgY2FuIGJlIGRldGVjdGVkIG9uIFByaW1lCisqICAgICBtYWNoaW5lcywgb24gd2hpY2ggSUNIQVIgcmV0dXJucyBhIHZhbHVlIHdpdGggYml0IDggc2V0LgorKiAgICAgSUNIQVIoJ0EnKSBvbiBQcmltZSBtYWNoaW5lcyByZXR1cm5zIDE5MyB3aGljaCBpcyB0aGUgc2FtZSBhcworKiAgICAgSUNIQVIoJ0EnKSBvbiBhbiBFQkNESUMgbWFjaGluZS4KKyoKKyAgICAgIElOVEEgPSBJQ0hBUihDQSkKKyAgICAgIElOVEIgPSBJQ0hBUihDQikKKyoKKyAgICAgIElGIChaQ09ERS5FUS45MCAuT1IuIFpDT0RFLkVRLjEyMikgVEhFTgorKgorKiAgICAgICAgQVNDSUkgaXMgYXNzdW1lZCAtIFpDT0RFIGlzIHRoZSBBU0NJSSBjb2RlIG9mIGVpdGhlciBsb3dlciBvcgorKiAgICAgICAgdXBwZXIgY2FzZSAnWicuCisqCisgICAgICAgICAgSUYgKElOVEEuR0UuOTcgLkFORC4gSU5UQS5MRS4xMjIpIElOVEEgPSBJTlRBIC0gMzIKKyAgICAgICAgICBJRiAoSU5UQi5HRS45NyAuQU5ELiBJTlRCLkxFLjEyMikgSU5UQiA9IElOVEIgLSAzMgorKgorICAgICAgRUxTRSBJRiAoWkNPREUuRVEuMjMzIC5PUi4gWkNPREUuRVEuMTY5KSBUSEVOCisqCisqICAgICAgICBFQkNESUMgaXMgYXNzdW1lZCAtIFpDT0RFIGlzIHRoZSBFQkNESUMgY29kZSBvZiBlaXRoZXIgbG93ZXIgb3IKKyogICAgICAgIHVwcGVyIGNhc2UgJ1onLgorKgorICAgICAgICAgIElGIChJTlRBLkdFLjEyOSAuQU5ELiBJTlRBLkxFLjEzNyAuT1IuCisgICAgICsgICAgICAgIElOVEEuR0UuMTQ1IC5BTkQuIElOVEEuTEUuMTUzIC5PUi4KKyAgICAgKyAgICAgICAgSU5UQS5HRS4xNjIgLkFORC4gSU5UQS5MRS4xNjkpIElOVEEgPSBJTlRBICsgNjQKKyAgICAgICAgICBJRiAoSU5UQi5HRS4xMjkgLkFORC4gSU5UQi5MRS4xMzcgLk9SLgorICAgICArICAgICAgICBJTlRCLkdFLjE0NSAuQU5ELiBJTlRCLkxFLjE1MyAuT1IuCisgICAgICsgICAgICAgIElOVEIuR0UuMTYyIC5BTkQuIElOVEIuTEUuMTY5KSBJTlRCID0gSU5UQiArIDY0CisqCisgICAgICBFTFNFIElGIChaQ09ERS5FUS4yMTggLk9SLiBaQ09ERS5FUS4yNTApIFRIRU4KKyoKKyogICAgICAgIEFTQ0lJIGlzIGFzc3VtZWQsIG9uIFByaW1lIG1hY2hpbmVzIC0gWkNPREUgaXMgdGhlIEFTQ0lJIGNvZGUKKyogICAgICAgIHBsdXMgMTI4IG9mIGVpdGhlciBsb3dlciBvciB1cHBlciBjYXNlICdaJy4KKyoKKyAgICAgICAgICBJRiAoSU5UQS5HRS4yMjUgLkFORC4gSU5UQS5MRS4yNTApIElOVEEgPSBJTlRBIC0gMzIKKyAgICAgICAgICBJRiAoSU5UQi5HRS4yMjUgLkFORC4gSU5UQi5MRS4yNTApIElOVEIgPSBJTlRCIC0gMzIKKyAgICAgIEVORCBJRgorICAgICAgTFNBTUUgPSBJTlRBIC5FUS4gSU5UQgorKgorKiAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgTFNBTUUKKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy9zaW5nbGUuY3BwIGIvYmxhcy9zaW5nbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzc3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3NpbmdsZS5jcHAKQEAgLTAsMCArMSwxOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIFNDQUxBUiAgICAgICAgZmxvYXQKKyNkZWZpbmUgU0NBTEFSX1NVRkZJWCBzCisjZGVmaW5lIFNDQUxBUl9TVUZGSVhfVVAgIlMiCisjZGVmaW5lIElTQ09NUExFWCAgICAgMAorCisjaW5jbHVkZSAibGV2ZWwxX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDFfcmVhbF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwyX2ltcGwuaCIKKyNpbmNsdWRlICJsZXZlbDJfcmVhbF9pbXBsLmgiCisjaW5jbHVkZSAibGV2ZWwzX2ltcGwuaCIKZGlmZiAtLWdpdCBhL2JsYXMvc3JvdG0uZiBiL2JsYXMvc3JvdG0uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzVhNTkzCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy9zcm90bS5mCkBAIC0wLDAgKzEsMTQ4IEBACisgICAgICBTVUJST1VUSU5FIFNST1RNKE4sU1gsSU5DWCxTWSxJTkNZLFNQQVJBTSkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLE4KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgU1BBUkFNKDUpLFNYKCopLFNZKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgICAgQVBQTFkgVEhFIE1PRElGSUVEIEdJVkVOUyBUUkFOU0ZPUk1BVElPTiwgSCwgVE8gVEhFIDIgQlkgTiBNQVRSSVgKKyoKKyogICAgIChTWCoqVCkgLCBXSEVSRSAqKlQgSU5ESUNBVEVTIFRSQU5TUE9TRS4gVEhFIEVMRU1FTlRTIE9GIFNYIEFSRSBJTgorKiAgICAgKERYKipUKQorKgorKiAgICAgU1goTFgrSSpJTkNYKSwgSSA9IDAgVE8gTi0xLCBXSEVSRSBMWCA9IDEgSUYgSU5DWCAuR0UuIDAsIEVMU0UKKyogICAgIExYID0gKC1JTkNYKSpOLCBBTkQgU0lNSUxBUkxZIEZPUiBTWSBVU0lORyBVU0lORyBMWSBBTkQgSU5DWS4KKyogICAgIFdJVEggU1BBUkFNKDEpPVNGTEFHLCBIIEhBUyBPTkUgT0YgVEhFIEZPTExPV0lORyBGT1JNUy4uCisqCisqICAgICBTRkxBRz0tMS5FMCAgICAgU0ZMQUc9MC5FMCAgICAgICAgU0ZMQUc9MS5FMCAgICAgU0ZMQUc9LTIuRTAKKyoKKyogICAgICAgKFNIMTEgIFNIMTIpICAgICgxLkUwICBTSDEyKSAgICAoU0gxMSAgMS5FMCkgICAgKDEuRTAgIDAuRTApCisqICAgICBIPSggICAgICAgICAgKSAgICAoICAgICAgICAgICkgICAgKCAgICAgICAgICApICAgICggICAgICAgICAgKQorKiAgICAgICAoU0gyMSAgU0gyMiksICAgKFNIMjEgIDEuRTApLCAgICgtMS5FMCBTSDIyKSwgICAoMC5FMCAgMS5FMCkuCisqICAgICBTRUUgIFNST1RNRyBGT1IgQSBERVNDUklQVElPTiBPRiBEQVRBIFNUT1JBR0UgSU4gU1BBUkFNLgorKgorKgorKiAgQXJndW1lbnRzCisqICA9PT09PT09PT0KKyoKKyogIE4gICAgICAoaW5wdXQpIElOVEVHRVIKKyogICAgICAgICBudW1iZXIgb2YgZWxlbWVudHMgaW4gaW5wdXQgdmVjdG9yKHMpCisqCisqICBTWCAgICAgKGlucHV0L291dHB1dCkgUkVBTCBhcnJheSwgZGltZW5zaW9uIE4KKyogICAgICAgICBkb3VibGUgcHJlY2lzaW9uIHZlY3RvciB3aXRoIE4gZWxlbWVudHMKKyoKKyogIElOQ1ggICAoaW5wdXQpIElOVEVHRVIKKyogICAgICAgICBzdG9yYWdlIHNwYWNpbmcgYmV0d2VlbiBlbGVtZW50cyBvZiBTWAorKgorKiAgU1kgICAgIChpbnB1dC9vdXRwdXQpIFJFQUwgYXJyYXksIGRpbWVuc2lvbiBOCisqICAgICAgICAgZG91YmxlIHByZWNpc2lvbiB2ZWN0b3Igd2l0aCBOIGVsZW1lbnRzCisqCisqICBJTkNZICAgKGlucHV0KSBJTlRFR0VSCisqICAgICAgICAgc3RvcmFnZSBzcGFjaW5nIGJldHdlZW4gZWxlbWVudHMgb2YgU1kKKyoKKyogIFNQQVJBTSAoaW5wdXQvb3V0cHV0KSAgUkVBTCBhcnJheSwgZGltZW5zaW9uIDUKKyogICAgIFNQQVJBTSgxKT1TRkxBRworKiAgICAgU1BBUkFNKDIpPVNIMTEKKyogICAgIFNQQVJBTSgzKT1TSDIxCisqICAgICBTUEFSQU0oNCk9U0gxMgorKiAgICAgU1BBUkFNKDUpPVNIMjIKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCBTRkxBRyxTSDExLFNIMTIsU0gyMSxTSDIyLFRXTyxXLFosWkVSTworICAgICAgSU5URUdFUiBJLEtYLEtZLE5TVEVQUworKiAgICAgLi4KKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSBaRVJPLFRXTy8wLkUwLDIuRTAvCisqICAgICAuLgorKgorICAgICAgU0ZMQUcgPSBTUEFSQU0oMSkKKyAgICAgIElGIChOLkxFLjAgLk9SLiAoU0ZMQUcrVFdPLkVRLlpFUk8pKSBHTyBUTyAxNDAKKyAgICAgIElGICguTk9ULiAoSU5DWC5FUS5JTkNZLkFORC5JTkNYLkdULjApKSBHTyBUTyA3MAorKgorICAgICAgTlNURVBTID0gTipJTkNYCisgICAgICBJRiAoU0ZMQUcpIDUwLDEwLDMwCisgICAxMCBDT05USU5VRQorICAgICAgU0gxMiA9IFNQQVJBTSg0KQorICAgICAgU0gyMSA9IFNQQVJBTSgzKQorICAgICAgRE8gMjAgSSA9IDEsTlNURVBTLElOQ1gKKyAgICAgICAgICBXID0gU1goSSkKKyAgICAgICAgICBaID0gU1koSSkKKyAgICAgICAgICBTWChJKSA9IFcgKyBaKlNIMTIKKyAgICAgICAgICBTWShJKSA9IFcqU0gyMSArIFoKKyAgIDIwIENPTlRJTlVFCisgICAgICBHTyBUTyAxNDAKKyAgIDMwIENPTlRJTlVFCisgICAgICBTSDExID0gU1BBUkFNKDIpCisgICAgICBTSDIyID0gU1BBUkFNKDUpCisgICAgICBETyA0MCBJID0gMSxOU1RFUFMsSU5DWAorICAgICAgICAgIFcgPSBTWChJKQorICAgICAgICAgIFogPSBTWShJKQorICAgICAgICAgIFNYKEkpID0gVypTSDExICsgWgorICAgICAgICAgIFNZKEkpID0gLVcgKyBTSDIyKloKKyAgIDQwIENPTlRJTlVFCisgICAgICBHTyBUTyAxNDAKKyAgIDUwIENPTlRJTlVFCisgICAgICBTSDExID0gU1BBUkFNKDIpCisgICAgICBTSDEyID0gU1BBUkFNKDQpCisgICAgICBTSDIxID0gU1BBUkFNKDMpCisgICAgICBTSDIyID0gU1BBUkFNKDUpCisgICAgICBETyA2MCBJID0gMSxOU1RFUFMsSU5DWAorICAgICAgICAgIFcgPSBTWChJKQorICAgICAgICAgIFogPSBTWShJKQorICAgICAgICAgIFNYKEkpID0gVypTSDExICsgWipTSDEyCisgICAgICAgICAgU1koSSkgPSBXKlNIMjEgKyBaKlNIMjIKKyAgIDYwIENPTlRJTlVFCisgICAgICBHTyBUTyAxNDAKKyAgIDcwIENPTlRJTlVFCisgICAgICBLWCA9IDEKKyAgICAgIEtZID0gMQorICAgICAgSUYgKElOQ1guTFQuMCkgS1ggPSAxICsgKDEtTikqSU5DWAorICAgICAgSUYgKElOQ1kuTFQuMCkgS1kgPSAxICsgKDEtTikqSU5DWQorKgorICAgICAgSUYgKFNGTEFHKSAxMjAsODAsMTAwCisgICA4MCBDT05USU5VRQorICAgICAgU0gxMiA9IFNQQVJBTSg0KQorICAgICAgU0gyMSA9IFNQQVJBTSgzKQorICAgICAgRE8gOTAgSSA9IDEsTgorICAgICAgICAgIFcgPSBTWChLWCkKKyAgICAgICAgICBaID0gU1koS1kpCisgICAgICAgICAgU1goS1gpID0gVyArIFoqU0gxMgorICAgICAgICAgIFNZKEtZKSA9IFcqU0gyMSArIFoKKyAgICAgICAgICBLWCA9IEtYICsgSU5DWAorICAgICAgICAgIEtZID0gS1kgKyBJTkNZCisgICA5MCBDT05USU5VRQorICAgICAgR08gVE8gMTQwCisgIDEwMCBDT05USU5VRQorICAgICAgU0gxMSA9IFNQQVJBTSgyKQorICAgICAgU0gyMiA9IFNQQVJBTSg1KQorICAgICAgRE8gMTEwIEkgPSAxLE4KKyAgICAgICAgICBXID0gU1goS1gpCisgICAgICAgICAgWiA9IFNZKEtZKQorICAgICAgICAgIFNYKEtYKSA9IFcqU0gxMSArIFoKKyAgICAgICAgICBTWShLWSkgPSAtVyArIFNIMjIqWgorICAgICAgICAgIEtYID0gS1ggKyBJTkNYCisgICAgICAgICAgS1kgPSBLWSArIElOQ1kKKyAgMTEwIENPTlRJTlVFCisgICAgICBHTyBUTyAxNDAKKyAgMTIwIENPTlRJTlVFCisgICAgICBTSDExID0gU1BBUkFNKDIpCisgICAgICBTSDEyID0gU1BBUkFNKDQpCisgICAgICBTSDIxID0gU1BBUkFNKDMpCisgICAgICBTSDIyID0gU1BBUkFNKDUpCisgICAgICBETyAxMzAgSSA9IDEsTgorICAgICAgICAgIFcgPSBTWChLWCkKKyAgICAgICAgICBaID0gU1koS1kpCisgICAgICAgICAgU1goS1gpID0gVypTSDExICsgWipTSDEyCisgICAgICAgICAgU1koS1kpID0gVypTSDIxICsgWipTSDIyCisgICAgICAgICAgS1ggPSBLWCArIElOQ1gKKyAgICAgICAgICBLWSA9IEtZICsgSU5DWQorICAxMzAgQ09OVElOVUUKKyAgMTQwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy9zcm90bWcuZiBiL2JsYXMvc3JvdG1nLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzYmQ0MgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvc3JvdG1nLmYKQEAgLTAsMCArMSwyMDggQEAKKyAgICAgIFNVQlJPVVRJTkUgU1JPVE1HKFNEMSxTRDIsU1gxLFNZMSxTUEFSQU0pCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMIFNEMSxTRDIsU1gxLFNZMQorKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCBTUEFSQU0oNSkKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICAgICBDT05TVFJVQ1QgVEhFIE1PRElGSUVEIEdJVkVOUyBUUkFOU0ZPUk1BVElPTiBNQVRSSVggSCBXSElDSCBaRVJPUworKiAgICAgVEhFIFNFQ09ORCBDT01QT05FTlQgT0YgVEhFIDItVkVDVE9SICAoU1FSVChTRDEpKlNYMSxTUVJUKFNEMikqCisqICAgICBTWTIpKipULgorKiAgICAgV0lUSCBTUEFSQU0oMSk9U0ZMQUcsIEggSEFTIE9ORSBPRiBUSEUgRk9MTE9XSU5HIEZPUk1TLi4KKyoKKyogICAgIFNGTEFHPS0xLkUwICAgICBTRkxBRz0wLkUwICAgICAgICBTRkxBRz0xLkUwICAgICBTRkxBRz0tMi5FMAorKgorKiAgICAgICAoU0gxMSAgU0gxMikgICAgKDEuRTAgIFNIMTIpICAgIChTSDExICAxLkUwKSAgICAoMS5FMCAgMC5FMCkKKyogICAgIEg9KCAgICAgICAgICApICAgICggICAgICAgICAgKSAgICAoICAgICAgICAgICkgICAgKCAgICAgICAgICApCisqICAgICAgIChTSDIxICBTSDIyKSwgICAoU0gyMSAgMS5FMCksICAgKC0xLkUwIFNIMjIpLCAgICgwLkUwICAxLkUwKS4KKyogICAgIExPQ0FUSU9OUyAyLTQgT0YgU1BBUkFNIENPTlRBSU4gU0gxMSxTSDIxLFNIMTIsIEFORCBTSDIyCisqICAgICBSRVNQRUNUSVZFTFkuIChWQUxVRVMgT0YgMS5FMCwgLTEuRTAsIE9SIDAuRTAgSU1QTElFRCBCWSBUSEUKKyogICAgIFZBTFVFIE9GIFNQQVJBTSgxKSBBUkUgTk9UIFNUT1JFRCBJTiBTUEFSQU0uKQorKgorKiAgICAgVEhFIFZBTFVFUyBPRiBHQU1TUSBBTkQgUkdBTVNRIFNFVCBJTiBUSEUgREFUQSBTVEFURU1FTlQgTUFZIEJFCisqICAgICBJTkVYQUNULiAgVEhJUyBJUyBPSyBBUyBUSEVZIEFSRSBPTkxZIFVTRUQgRk9SIFRFU1RJTkcgVEhFIFNJWkUKKyogICAgIE9GIFNEMSBBTkQgU0QyLiAgQUxMIEFDVFVBTCBTQ0FMSU5HIE9GIERBVEEgSVMgRE9ORSBVU0lORyBHQU0uCisqCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PQorKgorKgorKiAgU0QxICAgIChpbnB1dC9vdXRwdXQpIFJFQUwKKyoKKyogIFNEMiAgICAoaW5wdXQvb3V0cHV0KSBSRUFMCisqCisqICBTWDEgICAgKGlucHV0L291dHB1dCkgUkVBTAorKgorKiAgU1kxICAgIChpbnB1dCkgUkVBTAorKgorKgorKiAgU1BBUkFNIChpbnB1dC9vdXRwdXQpICBSRUFMIGFycmF5LCBkaW1lbnNpb24gNQorKiAgICAgU1BBUkFNKDEpPVNGTEFHCisqICAgICBTUEFSQU0oMik9U0gxMQorKiAgICAgU1BBUkFNKDMpPVNIMjEKKyogICAgIFNQQVJBTSg0KT1TSDEyCisqICAgICBTUEFSQU0oNSk9U0gyMgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMIEdBTSxHQU1TUSxPTkUsUkdBTVNRLFNGTEFHLFNIMTEsU0gxMixTSDIxLFNIMjIsU1AxLFNQMixTUTEsCisgICAgICsgICAgIFNRMixTVEVNUCxTVSxUV08sWkVSTworICAgICAgSU5URUdFUiBJR08KKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgQUJTCisqICAgICAuLgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisqCisgICAgICBEQVRBIFpFUk8sT05FLFRXTy8wLkUwLDEuRTAsMi5FMC8KKyAgICAgIERBVEEgR0FNLEdBTVNRLFJHQU1TUS80MDk2LkUwLDEuNjc3NzJFNyw1Ljk2MDQ2RS04LworKiAgICAgLi4KKworICAgICAgSUYgKC5OT1QuU0QxLkxULlpFUk8pIEdPIFRPIDEwCisqICAgICAgIEdPIFpFUk8tSC1ELUFORC1TWDEuLgorICAgICAgR08gVE8gNjAKKyAgIDEwIENPTlRJTlVFCisqICAgICBDQVNFLVNEMS1OT05ORUdBVElWRQorICAgICAgU1AyID0gU0QyKlNZMQorICAgICAgSUYgKC5OT1QuU1AyLkVRLlpFUk8pIEdPIFRPIDIwCisgICAgICBTRkxBRyA9IC1UV08KKyAgICAgIEdPIFRPIDI2MAorKiAgICAgUkVHVUxBUi1DQVNFLi4KKyAgIDIwIENPTlRJTlVFCisgICAgICBTUDEgPSBTRDEqU1gxCisgICAgICBTUTIgPSBTUDIqU1kxCisgICAgICBTUTEgPSBTUDEqU1gxCisqCisgICAgICBJRiAoLk5PVC5BQlMoU1ExKS5HVC5BQlMoU1EyKSkgR08gVE8gNDAKKyAgICAgIFNIMjEgPSAtU1kxL1NYMQorICAgICAgU0gxMiA9IFNQMi9TUDEKKyoKKyAgICAgIFNVID0gT05FIC0gU0gxMipTSDIxCisqCisgICAgICBJRiAoLk5PVC5TVS5MRS5aRVJPKSBHTyBUTyAzMAorKiAgICAgICAgIEdPIFpFUk8tSC1ELUFORC1TWDEuLgorICAgICAgR08gVE8gNjAKKyAgIDMwIENPTlRJTlVFCisgICAgICBTRkxBRyA9IFpFUk8KKyAgICAgIFNEMSA9IFNEMS9TVQorICAgICAgU0QyID0gU0QyL1NVCisgICAgICBTWDEgPSBTWDEqU1UKKyogICAgICAgICBHTyBTQ0FMRS1DSEVDSy4uCisgICAgICBHTyBUTyAxMDAKKyAgIDQwIENPTlRJTlVFCisgICAgICBJRiAoLk5PVC5TUTIuTFQuWkVSTykgR08gVE8gNTAKKyogICAgICAgICBHTyBaRVJPLUgtRC1BTkQtU1gxLi4KKyAgICAgIEdPIFRPIDYwCisgICA1MCBDT05USU5VRQorICAgICAgU0ZMQUcgPSBPTkUKKyAgICAgIFNIMTEgPSBTUDEvU1AyCisgICAgICBTSDIyID0gU1gxL1NZMQorICAgICAgU1UgPSBPTkUgKyBTSDExKlNIMjIKKyAgICAgIFNURU1QID0gU0QyL1NVCisgICAgICBTRDIgPSBTRDEvU1UKKyAgICAgIFNEMSA9IFNURU1QCisgICAgICBTWDEgPSBTWTEqU1UKKyogICAgICAgICBHTyBTQ0FMRS1DSEVDSworICAgICAgR08gVE8gMTAwCisqICAgICBQUk9DRURVUkUuLlpFUk8tSC1ELUFORC1TWDEuLgorICAgNjAgQ09OVElOVUUKKyAgICAgIFNGTEFHID0gLU9ORQorICAgICAgU0gxMSA9IFpFUk8KKyAgICAgIFNIMTIgPSBaRVJPCisgICAgICBTSDIxID0gWkVSTworICAgICAgU0gyMiA9IFpFUk8KKyoKKyAgICAgIFNEMSA9IFpFUk8KKyAgICAgIFNEMiA9IFpFUk8KKyAgICAgIFNYMSA9IFpFUk8KKyogICAgICAgICBSRVRVUk4uLgorICAgICAgR08gVE8gMjIwCisqICAgICBQUk9DRURVUkUuLkZJWC1ILi4KKyAgIDcwIENPTlRJTlVFCisgICAgICBJRiAoLk5PVC5TRkxBRy5HRS5aRVJPKSBHTyBUTyA5MAorKgorICAgICAgSUYgKC5OT1QuU0ZMQUcuRVEuWkVSTykgR08gVE8gODAKKyAgICAgIFNIMTEgPSBPTkUKKyAgICAgIFNIMjIgPSBPTkUKKyAgICAgIFNGTEFHID0gLU9ORQorICAgICAgR08gVE8gOTAKKyAgIDgwIENPTlRJTlVFCisgICAgICBTSDIxID0gLU9ORQorICAgICAgU0gxMiA9IE9ORQorICAgICAgU0ZMQUcgPSAtT05FCisgICA5MCBDT05USU5VRQorICAgICAgR08gVE8gSUdPKDEyMCwxNTAsMTgwLDIxMCkKKyogICAgIFBST0NFRFVSRS4uU0NBTEUtQ0hFQ0sKKyAgMTAwIENPTlRJTlVFCisgIDExMCBDT05USU5VRQorICAgICAgSUYgKC5OT1QuU0QxLkxFLlJHQU1TUSkgR08gVE8gMTMwCisgICAgICBJRiAoU0QxLkVRLlpFUk8pIEdPIFRPIDE2MAorICAgICAgQVNTSUdOIDEyMCBUTyBJR08KKyogICAgICAgICAgICAgIEZJWC1ILi4KKyAgICAgIEdPIFRPIDcwCisgIDEyMCBDT05USU5VRQorICAgICAgU0QxID0gU0QxKkdBTSoqMgorICAgICAgU1gxID0gU1gxL0dBTQorICAgICAgU0gxMSA9IFNIMTEvR0FNCisgICAgICBTSDEyID0gU0gxMi9HQU0KKyAgICAgIEdPIFRPIDExMAorICAxMzAgQ09OVElOVUUKKyAgMTQwIENPTlRJTlVFCisgICAgICBJRiAoLk5PVC5TRDEuR0UuR0FNU1EpIEdPIFRPIDE2MAorICAgICAgQVNTSUdOIDE1MCBUTyBJR08KKyogICAgICAgICAgICAgIEZJWC1ILi4KKyAgICAgIEdPIFRPIDcwCisgIDE1MCBDT05USU5VRQorICAgICAgU0QxID0gU0QxL0dBTSoqMgorICAgICAgU1gxID0gU1gxKkdBTQorICAgICAgU0gxMSA9IFNIMTEqR0FNCisgICAgICBTSDEyID0gU0gxMipHQU0KKyAgICAgIEdPIFRPIDE0MAorICAxNjAgQ09OVElOVUUKKyAgMTcwIENPTlRJTlVFCisgICAgICBJRiAoLk5PVC5BQlMoU0QyKS5MRS5SR0FNU1EpIEdPIFRPIDE5MAorICAgICAgSUYgKFNEMi5FUS5aRVJPKSBHTyBUTyAyMjAKKyAgICAgIEFTU0lHTiAxODAgVE8gSUdPCisqICAgICAgICAgICAgICBGSVgtSC4uCisgICAgICBHTyBUTyA3MAorICAxODAgQ09OVElOVUUKKyAgICAgIFNEMiA9IFNEMipHQU0qKjIKKyAgICAgIFNIMjEgPSBTSDIxL0dBTQorICAgICAgU0gyMiA9IFNIMjIvR0FNCisgICAgICBHTyBUTyAxNzAKKyAgMTkwIENPTlRJTlVFCisgIDIwMCBDT05USU5VRQorICAgICAgSUYgKC5OT1QuQUJTKFNEMikuR0UuR0FNU1EpIEdPIFRPIDIyMAorICAgICAgQVNTSUdOIDIxMCBUTyBJR08KKyogICAgICAgICAgICAgIEZJWC1ILi4KKyAgICAgIEdPIFRPIDcwCisgIDIxMCBDT05USU5VRQorICAgICAgU0QyID0gU0QyL0dBTSoqMgorICAgICAgU0gyMSA9IFNIMjEqR0FNCisgICAgICBTSDIyID0gU0gyMipHQU0KKyAgICAgIEdPIFRPIDIwMAorICAyMjAgQ09OVElOVUUKKyAgICAgIElGIChTRkxBRykgMjUwLDIzMCwyNDAKKyAgMjMwIENPTlRJTlVFCisgICAgICBTUEFSQU0oMykgPSBTSDIxCisgICAgICBTUEFSQU0oNCkgPSBTSDEyCisgICAgICBHTyBUTyAyNjAKKyAgMjQwIENPTlRJTlVFCisgICAgICBTUEFSQU0oMikgPSBTSDExCisgICAgICBTUEFSQU0oNSkgPSBTSDIyCisgICAgICBHTyBUTyAyNjAKKyAgMjUwIENPTlRJTlVFCisgICAgICBTUEFSQU0oMikgPSBTSDExCisgICAgICBTUEFSQU0oMykgPSBTSDIxCisgICAgICBTUEFSQU0oNCkgPSBTSDEyCisgICAgICBTUEFSQU0oNSkgPSBTSDIyCisgIDI2MCBDT05USU5VRQorICAgICAgU1BBUkFNKDEpID0gU0ZMQUcKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL3NzYm12LmYgYi9ibGFzL3NzYm12LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4OTNhMgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvc3NibXYuZgpAQCAtMCwwICsxLDMwNiBAQAorICAgICAgU1VCUk9VVElORSBTU0JNVihVUExPLE4sSyxBTFBIQSxBLExEQSxYLElOQ1gsQkVUQSxZLElOQ1kpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMIEFMUEhBLEJFVEEKKyAgICAgIElOVEVHRVIgSU5DWCxJTkNZLEssTERBLE4KKyAgICAgIENIQVJBQ1RFUiBVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMIEEoTERBLCopLFgoKiksWSgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIFNTQk1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciAgb3BlcmF0aW9uCisqCisqICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwKKyoKKyogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyogIEEgaXMgYW4gbiBieSBuIHN5bW1ldHJpYyBiYW5kIG1hdHJpeCwgd2l0aCBrIHN1cGVyLWRpYWdvbmFscy4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgYmFuZCBtYXRyaXggQSBpcyBiZWluZyBzdXBwbGllZCBhcworKiAgICAgICAgICAgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgVGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHN1cHBsaWVkLgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgc3VwcGxpZWQuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBLICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIEsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3VwZXItZGlhZ29uYWxzIG9mIHRoZQorKiAgICAgICAgICAgbWF0cml4IEEuIEsgbXVzdCBzYXRpc2Z5ICAwIC5sZS4gSy4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQUxQSEEgIC0gUkVBTCAgICAgICAgICAgIC4KKyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQSAgICAgIC0gUkVBTCAgICAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gKCBMREEsIG4gKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkKKyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIKKyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgY29sdW1uIGJ5CisqICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cKKyogICAgICAgICAgICggayArIDEgKSBvZiB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdXBlci1kaWFnb25hbCBzdGFydGluZyBhdAorKiAgICAgICAgICAgcG9zaXRpb24gMiBpbiByb3cgaywgYW5kIHNvIG9uLiBUaGUgdG9wIGxlZnQgayBieSBrIHRyaWFuZ2xlCisqICAgICAgICAgICBvZiB0aGUgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4KKyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgdGhlIHVwcGVyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgYSBzeW1tZXRyaWMgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwKKyogICAgICAgICAgIGZ1bGwgbWF0cml4IHN0b3JhZ2UgdG8gYmFuZCBzdG9yYWdlOgorKgorKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOCisqICAgICAgICAgICAgICAgICAgICBNID0gSyArIDEgLSBKCisqICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IE1BWCggMSwgSiAtIEsgKSwgSgorKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApCisqICAgICAgICAgICAgICAxMCAgICBDT05USU5VRQorKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUKKyoKKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkKKyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIKKyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgY29sdW1uIGJ5CisqICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cgMSBvZgorKiAgICAgICAgICAgdGhlIGFycmF5LCB0aGUgZmlyc3Qgc3ViLWRpYWdvbmFsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEgaW4KKyogICAgICAgICAgIHJvdyAyLCBhbmQgc28gb24uIFRoZSBib3R0b20gcmlnaHQgayBieSBrIHRyaWFuZ2xlIG9mIHRoZQorKiAgICAgICAgICAgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4KKyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgdGhlIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgYSBzeW1tZXRyaWMgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwKKyogICAgICAgICAgIGZ1bGwgbWF0cml4IHN0b3JhZ2UgdG8gYmFuZCBzdG9yYWdlOgorKgorKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOCisqICAgICAgICAgICAgICAgICAgICBNID0gMSAtIEoKKyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gSiwgTUlOKCBOLCBKICsgSyApCisqICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkKKyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFCisqICAgICAgICAgICAgICAyMCBDT05USU5VRQorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBMREEgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIExEQSBzcGVjaWZpZXMgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBBIGFzIGRlY2xhcmVkCisqICAgICAgICAgICBpbiB0aGUgY2FsbGluZyAoc3ViKSBwcm9ncmFtLiBMREEgbXVzdCBiZSBhdCBsZWFzdAorKiAgICAgICAgICAgKCBrICsgMSApLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBSRUFMICAgICAgICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUKKyogICAgICAgICAgIHZlY3RvciB4LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBJTkNYICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBCRVRBICAgLSBSRUFMICAgICAgICAgICAgLgorKiAgICAgICAgICAgT24gZW50cnksIEJFVEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYmV0YS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWSAgICAgIC0gUkVBTCAgICAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1kgKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWSBtdXN0IGNvbnRhaW4gdGhlCisqICAgICAgICAgICB2ZWN0b3IgeS4gT24gZXhpdCwgWSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgdXBkYXRlZCB2ZWN0b3IgeS4KKyoKKyogIElOQ1kgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWSBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBZLiBJTkNZIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEZ1cnRoZXIgRGV0YWlscworKiAgPT09PT09PT09PT09PT09CisqCisqICBMZXZlbCAyIEJsYXMgcm91dGluZS4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgT05FLFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoT05FPTEuMEUrMCxaRVJPPTAuMEUrMCkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMIFRFTVAxLFRFTVAyCisgICAgICBJTlRFR0VSIEksSU5GTyxJWCxJWSxKLEpYLEpZLEtQTFVTMSxLWCxLWSxMCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgTUFYLE1JTgorKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGIChLLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gMworICAgICAgRUxTRSBJRiAoTERBLkxULiAoSysxKSkgVEhFTgorICAgICAgICAgIElORk8gPSA2CisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gOAorICAgICAgRUxTRSBJRiAoSU5DWS5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDExCisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkZPLk5FLjApIFRIRU4KKyAgICAgICAgICBDQUxMIFhFUkJMQSgnU1NCTVYgJyxJTkZPKQorICAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuCisqCisgICAgICBJRiAoKE4uRVEuMCkgLk9SLiAoKEFMUEhBLkVRLlpFUk8pLkFORC4gKEJFVEEuRVEuT05FKSkpIFJFVFVSTgorKgorKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludHMgaW4gIFggIGFuZCAgWS4KKyoKKyAgICAgIElGIChJTkNYLkdULjApIFRIRU4KKyAgICAgICAgICBLWCA9IDEKKyAgICAgIEVMU0UKKyAgICAgICAgICBLWCA9IDEgLSAoTi0xKSpJTkNYCisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkNZLkdULjApIFRIRU4KKyAgICAgICAgICBLWSA9IDEKKyAgICAgIEVMU0UKKyAgICAgICAgICBLWSA9IDEgLSAoTi0xKSpJTkNZCisgICAgICBFTkQgSUYKKyoKKyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBBCisqICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBLgorKgorKiAgICAgRmlyc3QgZm9ybSAgeSA6PSBiZXRhKnkuCisqCisgICAgICBJRiAoQkVUQS5ORS5PTkUpIFRIRU4KKyAgICAgICAgICBJRiAoSU5DWS5FUS4xKSBUSEVOCisgICAgICAgICAgICAgIElGIChCRVRBLkVRLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWkVSTworICAgMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSSkgPSBCRVRBKlkoSSkKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSVkgPSBLWQorICAgICAgICAgICAgICBJRiAoQkVUQS5FUS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDMwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IEJFVEEqWShJWSkKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyAgICAgIElGIChBTFBIQS5FUS5aRVJPKSBSRVRVUk4KKyAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyoKKyogICAgICAgIEZvcm0gIHkgIHdoZW4gdXBwZXIgdHJpYW5nbGUgb2YgQSBpcyBzdG9yZWQuCisqCisgICAgICAgICAgS1BMVVMxID0gSyArIDEKKyAgICAgICAgICBJRiAoKElOQ1guRVEuMSkgLkFORC4gKElOQ1kuRVEuMSkpIFRIRU4KKyAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpYKEopCisgICAgICAgICAgICAgICAgICBURU1QMiA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEwgPSBLUExVUzEgLSBKCisgICAgICAgICAgICAgICAgICBETyA1MCBJID0gTUFYKDEsSi1LKSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgIFkoSSkgPSBZKEkpICsgVEVNUDEqQShMK0ksSikKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgQShMK0ksSikqWChJKQorICAgNTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSikgPSBZKEopICsgVEVNUDEqQShLUExVUzEsSikgKyBBTFBIQSpURU1QMgorICAgNjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICBKWSA9IEtZCisgICAgICAgICAgICAgIERPIDgwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKWCkKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgSVkgPSBLWQorICAgICAgICAgICAgICAgICAgTCA9IEtQTFVTMSAtIEoKKyAgICAgICAgICAgICAgICAgIERPIDcwIEkgPSBNQVgoMSxKLUspLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBZKElZKSArIFRFTVAxKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIEEoTCtJLEopKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgNzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSlkpID0gWShKWSkgKyBURU1QMSpBKEtQTFVTMSxKKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIElGIChKLkdULkspIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtZID0gS1kgKyBJTkNZCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgIDgwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIHkgIHdoZW4gbG93ZXIgdHJpYW5nbGUgb2YgQSBpcyBzdG9yZWQuCisqCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDEwMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSikKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBURU1QMSpBKDEsSikKKyAgICAgICAgICAgICAgICAgIEwgPSAxIC0gSgorICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IEogKyAxLE1JTihOLEorSykKKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWShJKSArIFRFTVAxKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIEEoTCtJLEopKlgoSSkKKyAgIDkwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBZKEopID0gWShKKSArIEFMUEhBKlRFTVAyCisgIDEwMCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgIEpZID0gS1kKKyAgICAgICAgICAgICAgRE8gMTIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKWCkKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgWShKWSkgPSBZKEpZKSArIFRFTVAxKkEoMSxKKQorICAgICAgICAgICAgICAgICAgTCA9IDEgLSBKCisgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICBJWSA9IEpZCisgICAgICAgICAgICAgICAgICBETyAxMTAgSSA9IEogKyAxLE1JTihOLEorSykKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBZKElZKSArIFRFTVAxKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIEEoTCtJLEopKlgoSVgpCisgIDExMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKWSkgPSBZKEpZKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgMTIwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU1NCTVYgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL3NzcG12LmYgYi9ibGFzL3NzcG12LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4NDQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvc3NwbXYuZgpAQCAtMCwwICsxLDI2NSBAQAorICAgICAgU1VCUk9VVElORSBTU1BNVihVUExPLE4sQUxQSEEsQVAsWCxJTkNYLEJFVEEsWSxJTkNZKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCBBTFBIQSxCRVRBCisgICAgICBJTlRFR0VSIElOQ1gsSU5DWSxOCisgICAgICBDSEFSQUNURVIgVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCBBUCgqKSxYKCopLFkoKikKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICBTU1BNViAgcGVyZm9ybXMgdGhlIG1hdHJpeC12ZWN0b3Igb3BlcmF0aW9uCisqCisqICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwKKyoKKyogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyogIEEgaXMgYW4gbiBieSBuIHN5bW1ldHJpYyBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgorKgorKiAgQXJndW1lbnRzCisqICA9PT09PT09PT09CisqCisqICBVUExPICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cHBlciBvciBsb3dlcgorKiAgICAgICAgICAgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBtYXRyaXggQSBpcyBzdXBwbGllZCBpbiB0aGUgcGFja2VkCisqICAgICAgICAgICBhcnJheSBBUCBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBUaGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgaW4gQVAuCisqCisqICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIFRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBpbiBBUC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgTiAgICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFMUEhBICAtIFJFQUwgICAgICAgICAgICAuCisqICAgICAgICAgICBPbiBlbnRyeSwgQUxQSEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYWxwaGEuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFQICAgICAtIFJFQUwgICAgICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0CisqICAgICAgICAgICAoICggbiooIG4gKyAxICkgKS8yICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeAorKiAgICAgICAgICAgcGFja2VkIHNlcXVlbnRpYWxseSwgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApCisqICAgICAgICAgICBjb250YWlucyBhKCAxLCAxICksIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAxLCAyICkKKyogICAgICAgICAgIGFuZCBhKCAyLCAyICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeAorKiAgICAgICAgICAgcGFja2VkIHNlcXVlbnRpYWxseSwgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApCisqICAgICAgICAgICBjb250YWlucyBhKCAxLCAxICksIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAyLCAxICkKKyogICAgICAgICAgIGFuZCBhKCAzLCAxICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIFJFQUwgICAgICAgICAgICAgYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHZlY3RvciB4LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBJTkNYICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBCRVRBICAgLSBSRUFMICAgICAgICAgICAgLgorKiAgICAgICAgICAgT24gZW50cnksIEJFVEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYmV0YS4gV2hlbiBCRVRBIGlzCisqICAgICAgICAgICBzdXBwbGllZCBhcyB6ZXJvIHRoZW4gWSBuZWVkIG5vdCBiZSBzZXQgb24gaW5wdXQuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFkgICAgICAtIFJFQUwgICAgICAgICAgICAgYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNZICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFkgbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHZlY3RvciB5LiBPbiBleGl0LCBZIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSB1cGRhdGVkCisqICAgICAgICAgICB2ZWN0b3IgeS4KKyoKKyogIElOQ1kgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWSBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBZLiBJTkNZIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEZ1cnRoZXIgRGV0YWlscworKiAgPT09PT09PT09PT09PT09CisqCisqICBMZXZlbCAyIEJsYXMgcm91dGluZS4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgT05FLFpFUk8KKyAgICAgIFBBUkFNRVRFUiAoT05FPTEuMEUrMCxaRVJPPTAuMEUrMCkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMIFRFTVAxLFRFTVAyCisgICAgICBJTlRFR0VSIEksSU5GTyxJWCxJWSxKLEpYLEpZLEssS0ssS1gsS1kKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgTFNBTUUKKyAgICAgIEVYVEVSTkFMIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMIFhFUkJMQQorKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNgorICAgICAgRUxTRSBJRiAoSU5DWS5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDkKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdTU1BNViAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGICgoTi5FUS4wKSAuT1IuICgoQUxQSEEuRVEuWkVSTykuQU5ELiAoQkVUQS5FUS5PTkUpKSkgUkVUVVJOCisqCisqICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50cyBpbiAgWCAgYW5kICBZLgorKgorICAgICAgSUYgKElOQ1guR1QuMCkgVEhFTgorICAgICAgICAgIEtYID0gMQorICAgICAgRUxTRQorICAgICAgICAgIEtYID0gMSAtIChOLTEpKklOQ1gKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElOQ1kuR1QuMCkgVEhFTgorICAgICAgICAgIEtZID0gMQorICAgICAgRUxTRQorICAgICAgICAgIEtZID0gMSAtIChOLTEpKklOQ1kKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEFQCisqICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4KKyoKKyogICAgIEZpcnN0IGZvcm0gIHkgOj0gYmV0YSp5LgorKgorICAgICAgSUYgKEJFVEEuTkUuT05FKSBUSEVOCisgICAgICAgICAgSUYgKElOQ1kuRVEuMSkgVEhFTgorICAgICAgICAgICAgICBJRiAoQkVUQS5FUS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJKSA9IFpFUk8KKyAgIDEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gQkVUQSpZKEkpCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIElZID0gS1kKKyAgICAgICAgICAgICAgSUYgKEJFVEEuRVEuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICAzMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBCRVRBKlkoSVkpCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisgICAgICBJRiAoQUxQSEEuRVEuWkVSTykgUkVUVVJOCisgICAgICBLSyA9IDEKKyAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyoKKyogICAgICAgIEZvcm0gIHkgIHdoZW4gQVAgY29udGFpbnMgdGhlIHVwcGVyIHRyaWFuZ2xlLgorKgorICAgICAgICAgIElGICgoSU5DWC5FUS4xKSAuQU5ELiAoSU5DWS5FUS4xKSkgVEhFTgorICAgICAgICAgICAgICBETyA2MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSikKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgIFkoSSkgPSBZKEkpICsgVEVNUDEqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgQVAoSykqWChJKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgNTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSikgPSBZKEopICsgVEVNUDEqQVAoS0srSi0xKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgNjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICBKWSA9IEtZCisgICAgICAgICAgICAgIERPIDgwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKWCkKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgSVkgPSBLWQorICAgICAgICAgICAgICAgICAgRE8gNzAgSyA9IEtLLEtLICsgSiAtIDIKKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IFkoSVkpICsgVEVNUDEqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgQVAoSykqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKWSkgPSBZKEpZKSArIFRFTVAxKkFQKEtLK0otMSkgKyBBTFBIQSpURU1QMgorICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgIEpZID0gSlkgKyBJTkNZCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgODAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgeSAgd2hlbiBBUCBjb250YWlucyB0aGUgbG93ZXIgdHJpYW5nbGUuCisqCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDEwMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSikKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBURU1QMSpBUChLSykKKyAgICAgICAgICAgICAgICAgIEsgPSBLSyArIDEKKyAgICAgICAgICAgICAgICAgIERPIDkwIEkgPSBKICsgMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJKSA9IFkoSSkgKyBURU1QMSpBUChLKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gVEVNUDIgKyBBUChLKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICA5MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBBTFBIQSpURU1QMgorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgMTAwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgSlkgPSBLWQorICAgICAgICAgICAgICBETyAxMjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpYKEpYKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBZKEpZKSA9IFkoSlkpICsgVEVNUDEqQVAoS0spCisgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICBJWSA9IEpZCisgICAgICAgICAgICAgICAgICBETyAxMTAgSyA9IEtLICsgMSxLSyArIE4gLSBKCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gWShJWSkgKyBURU1QMSpBUChLKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gVEVNUDIgKyBBUChLKSpYKElYKQorICAxMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSlkpID0gWShKWSkgKyBBTFBIQSpURU1QMgorICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgIEpZID0gSlkgKyBJTkNZCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgKE4tSisxKQorICAxMjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTU1BNViAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvc3Nwci5mIGIvYmxhcy9zc3ByLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlOTI2MQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvc3Nwci5mCkBAIC0wLDAgKzEsMjAyIEBACisgICAgICBTVUJST1VUSU5FIFNTUFIoVVBMTyxOLEFMUEhBLFgsSU5DWCxBUCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgQUxQSEEKKyAgICAgIElOVEVHRVIgSU5DWCxOCisgICAgICBDSEFSQUNURVIgVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCBBUCgqKSxYKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgU1NQUiAgICBwZXJmb3JtcyB0aGUgc3ltbWV0cmljIHJhbmsgMSBvcGVyYXRpb24KKyoKKyogICAgIEEgOj0gYWxwaGEqeCp4JyArIEEsCisqCisqICB3aGVyZSBhbHBoYSBpcyBhIHJlYWwgc2NhbGFyLCB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kIEEgaXMgYW4KKyogIG4gYnkgbiBzeW1tZXRyaWMgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4IEEgaXMgc3VwcGxpZWQgaW4gdGhlIHBhY2tlZAorKiAgICAgICAgICAgYXJyYXkgQVAgYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgVGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgaW4gQVAuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBTFBIQSAgLSBSRUFMICAgICAgICAgICAgLgorKiAgICAgICAgICAgT24gZW50cnksIEFMUEhBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGFscGhhLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBSRUFMICAgICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeC4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQVAgICAgIC0gUkVBTCAgICAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoICBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeAorKiAgICAgICAgICAgcGFja2VkIHNlcXVlbnRpYWxseSwgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApCisqICAgICAgICAgICBjb250YWlucyBhKCAxLCAxICksIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAxLCAyICkKKyogICAgICAgICAgIGFuZCBhKCAyLCAyICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uIE9uIGV4aXQsIHRoZSBhcnJheQorKiAgICAgICAgICAgQVAgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUKKyogICAgICAgICAgIHVwZGF0ZWQgbWF0cml4LgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIHN5bW1ldHJpYyBtYXRyaXgKKyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKQorKiAgICAgICAgICAgY29udGFpbnMgYSggMSwgMSApLCBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMiwgMSApCisqICAgICAgICAgICBhbmQgYSggMywgMSApIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLiBPbiBleGl0LCB0aGUgYXJyYXkKKyogICAgICAgICAgIEFQIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlCisqICAgICAgICAgICB1cGRhdGVkIG1hdHJpeC4KKyoKKyogIEZ1cnRoZXIgRGV0YWlscworKiAgPT09PT09PT09PT09PT09CisqCisqICBMZXZlbCAyIEJsYXMgcm91dGluZS4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgWkVSTworICAgICAgUEFSQU1FVEVSIChaRVJPPTAuMEUrMCkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMIFRFTVAKKyAgICAgIElOVEVHRVIgSSxJTkZPLElYLEosSlgsSyxLSyxLWAorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCBMU0FNRQorICAgICAgRVhURVJOQUwgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgWEVSQkxBCisqICAgICAuLgorKgorKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyoKKyAgICAgIElORk8gPSAwCisgICAgICBJRiAoLk5PVC5MU0FNRShVUExPLCdVJykgLkFORC4gLk5PVC5MU0FNRShVUExPLCdMJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMQorICAgICAgRUxTRSBJRiAoTi5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDIKKyAgICAgIEVMU0UgSUYgKElOQ1guRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA1CisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkZPLk5FLjApIFRIRU4KKyAgICAgICAgICBDQUxMIFhFUkJMQSgnU1NQUiAgJyxJTkZPKQorICAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuCisqCisgICAgICBJRiAoKE4uRVEuMCkgLk9SLiAoQUxQSEEuRVEuWkVSTykpIFJFVFVSTgorKgorKiAgICAgU2V0IHRoZSBzdGFydCBwb2ludCBpbiBYIGlmIHRoZSBpbmNyZW1lbnQgaXMgbm90IHVuaXR5LgorKgorICAgICAgSUYgKElOQ1guTEUuMCkgVEhFTgorICAgICAgICAgIEtYID0gMSAtIChOLTEpKklOQ1gKKyAgICAgIEVMU0UgSUYgKElOQ1guTkUuMSkgVEhFTgorICAgICAgICAgIEtYID0gMQorICAgICAgRU5EIElGCisqCisqICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQVAKKyogICAgIGFyZSBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEFQLgorKgorICAgICAgS0sgPSAxCisgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisqCisqICAgICAgICBGb3JtICBBICB3aGVuIHVwcGVyIHRyaWFuZ2xlIGlzIHN0b3JlZCBpbiBBUC4KKyoKKyAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgIERPIDIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGIChYKEopLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVAoSykgPSBBUChLKSArIFgoSSkqVEVNUAorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDEwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgMjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICBETyA0MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBBTFBIQSpYKEpYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICBETyAzMCBLID0gS0ssS0sgKyBKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJWCkqVEVNUAorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgMzAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgNDAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgQSAgd2hlbiBsb3dlciB0cmlhbmdsZSBpcyBzdG9yZWQgaW4gQVAuCisqCisgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICBETyA2MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IEFMUEhBKlgoSikKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gSixOCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKEkpKlRFTVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICA1MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIE4gLSBKICsgMQorICAgNjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICBETyA4MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBBTFBIQSpYKEpYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgICAgICBETyA3MCBLID0gS0ssS0sgKyBOIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJWCkqVEVNUAorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgNzAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgTiAtIEogKyAxCisgICA4MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNTUFIgIC4KKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy9zc3ByMi5mIGIvYmxhcy9zc3ByMi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjdjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3NzcHIyLmYKQEAgLTAsMCArMSwyMzMgQEAKKyAgICAgIFNVQlJPVVRJTkUgU1NQUjIoVVBMTyxOLEFMUEhBLFgsSU5DWCxZLElOQ1ksQVApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMIEFMUEhBCisgICAgICBJTlRFR0VSIElOQ1gsSU5DWSxOCisgICAgICBDSEFSQUNURVIgVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCBBUCgqKSxYKCopLFkoKikKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICBTU1BSMiAgcGVyZm9ybXMgdGhlIHN5bW1ldHJpYyByYW5rIDIgb3BlcmF0aW9uCisqCisqICAgICBBIDo9IGFscGhhKngqeScgKyBhbHBoYSp5KngnICsgQSwKKyoKKyogIHdoZXJlIGFscGhhIGlzIGEgc2NhbGFyLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQgQSBpcyBhbgorKiAgbiBieSBuIHN5bW1ldHJpYyBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgorKgorKiAgQXJndW1lbnRzCisqICA9PT09PT09PT09CisqCisqICBVUExPICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cHBlciBvciBsb3dlcgorKiAgICAgICAgICAgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBtYXRyaXggQSBpcyBzdXBwbGllZCBpbiB0aGUgcGFja2VkCisqICAgICAgICAgICBhcnJheSBBUCBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBUaGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgaW4gQVAuCisqCisqICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIFRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBpbiBBUC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgTiAgICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFMUEhBICAtIFJFQUwgICAgICAgICAgICAuCisqICAgICAgICAgICBPbiBlbnRyeSwgQUxQSEEgc3BlY2lmaWVzIHRoZSBzY2FsYXIgYWxwaGEuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIFJFQUwgICAgICAgICAgICAgYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHZlY3RvciB4LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBJTkNYICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBZICAgICAgLSBSRUFMICAgICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWSApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBZIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgSU5DWSAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNZIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFkuIElOQ1kgbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQVAgICAgIC0gUkVBTCAgICAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoICBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgc3ltbWV0cmljIG1hdHJpeAorKiAgICAgICAgICAgcGFja2VkIHNlcXVlbnRpYWxseSwgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApCisqICAgICAgICAgICBjb250YWlucyBhKCAxLCAxICksIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAxLCAyICkKKyogICAgICAgICAgIGFuZCBhKCAyLCAyICkgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uIE9uIGV4aXQsIHRoZSBhcnJheQorKiAgICAgICAgICAgQVAgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUKKyogICAgICAgICAgIHVwZGF0ZWQgbWF0cml4LgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIHN5bW1ldHJpYyBtYXRyaXgKKyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKQorKiAgICAgICAgICAgY29udGFpbnMgYSggMSwgMSApLCBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMiwgMSApCisqICAgICAgICAgICBhbmQgYSggMywgMSApIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLiBPbiBleGl0LCB0aGUgYXJyYXkKKyogICAgICAgICAgIEFQIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlCisqICAgICAgICAgICB1cGRhdGVkIG1hdHJpeC4KKyoKKyogIEZ1cnRoZXIgRGV0YWlscworKiAgPT09PT09PT09PT09PT09CisqCisqICBMZXZlbCAyIEJsYXMgcm91dGluZS4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgWkVSTworICAgICAgUEFSQU1FVEVSIChaRVJPPTAuMEUrMCkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMIFRFTVAxLFRFTVAyCisgICAgICBJTlRFR0VSIEksSU5GTyxJWCxJWSxKLEpYLEpZLEssS0ssS1gsS1kKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgTFNBTUUKKyAgICAgIEVYVEVSTkFMIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMIFhFUkJMQQorKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNQorICAgICAgRUxTRSBJRiAoSU5DWS5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDcKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdTU1BSMiAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGICgoTi5FUS4wKSAuT1IuIChBTFBIQS5FUS5aRVJPKSkgUkVUVVJOCisqCisqICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50cyBpbiBYIGFuZCBZIGlmIHRoZSBpbmNyZW1lbnRzIGFyZSBub3QgYm90aAorKiAgICAgdW5pdHkuCisqCisgICAgICBJRiAoKElOQ1guTkUuMSkgLk9SLiAoSU5DWS5ORS4xKSkgVEhFTgorICAgICAgICAgIElGIChJTkNYLkdULjApIFRIRU4KKyAgICAgICAgICAgICAgS1ggPSAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLWCA9IDEgLSAoTi0xKSpJTkNYCisgICAgICAgICAgRU5EIElGCisgICAgICAgICAgSUYgKElOQ1kuR1QuMCkgVEhFTgorICAgICAgICAgICAgICBLWSA9IDEKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEtZID0gMSAtIChOLTEpKklOQ1kKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgSlkgPSBLWQorICAgICAgRU5EIElGCisqCisqICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQVAKKyogICAgIGFyZSBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEFQLgorKgorICAgICAgS0sgPSAxCisgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisqCisqICAgICAgICBGb3JtICBBICB3aGVuIHVwcGVyIHRyaWFuZ2xlIGlzIHN0b3JlZCBpbiBBUC4KKyoKKyAgICAgICAgICBJRiAoKElOQ1guRVEuMSkgLkFORC4gKElOQ1kuRVEuMSkpIFRIRU4KKyAgICAgICAgICAgICAgRE8gMjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgSUYgKChYKEopLk5FLlpFUk8pIC5PUi4gKFkoSikuTkUuWkVSTykpIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlkoSikKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IEFMUEhBKlgoSikKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSxKCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKEkpKlRFTVAxICsgWShJKSpURU1QMgorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDEwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgMjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgRE8gNDAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgSUYgKChYKEpYKS5ORS5aRVJPKSAuT1IuIChZKEpZKS5ORS5aRVJPKSkgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWShKWSkKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IEFMUEhBKlgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgIElZID0gS1kKKyAgICAgICAgICAgICAgICAgICAgICBETyAzMCBLID0gS0ssS0sgKyBKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJWCkqVEVNUDEgKyBZKElZKSpURU1QMgorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgMzAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBKWSA9IEpZICsgSU5DWQorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIEoKKyAgIDQwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIEEgIHdoZW4gbG93ZXIgdHJpYW5nbGUgaXMgc3RvcmVkIGluIEFQLgorKgorICAgICAgICAgIElGICgoSU5DWC5FUS4xKSAuQU5ELiAoSU5DWS5FUS4xKSkgVEhFTgorICAgICAgICAgICAgICBETyA2MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoKFgoSikuTkUuWkVSTykgLk9SLiAoWShKKS5ORS5aRVJPKSkgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWShKKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSBKLE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVAoSykgPSBBUChLKSArIFgoSSkqVEVNUDEgKyBZKEkpKlRFTVAyCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgNTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBOIC0gSiArIDEKKyAgIDYwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIERPIDgwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGICgoWChKWCkuTkUuWkVSTykgLk9SLiAoWShKWSkuTkUuWkVSTykpIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlkoSlkpCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBBTFBIQSpYKEpYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IEpZCisgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSyA9IEtLLEtLICsgTiAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVAoSykgPSBBUChLKSArIFgoSVgpKlRFTVAxICsgWShJWSkqVEVNUDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDcwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBOIC0gSiArIDEKKyAgIDgwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU1NQUjIgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL3N0Ym12LmYgYi9ibGFzL3N0Ym12LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiOGYxMQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvc3RibXYuZgpAQCAtMCwwICsxLDMzNSBAQAorICAgICAgU1VCUk9VVElORSBTVEJNVihVUExPLFRSQU5TLERJQUcsTixLLEEsTERBLFgsSU5DWCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgSU5DWCxLLExEQSxOCisgICAgICBDSEFSQUNURVIgRElBRyxUUkFOUyxVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMIEEoTERBLCopLFgoKikKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICBTVEJNViAgcGVyZm9ybXMgb25lIG9mIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbnMKKyoKKyogICAgIHggOj0gQSp4LCAgIG9yICAgeCA6PSBBJyp4LAorKgorKiAgd2hlcmUgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCAgQSBpcyBhbiBuIGJ5IG4gdW5pdCwgb3Igbm9uLXVuaXQsCisqICB1cHBlciBvciBsb3dlciB0cmlhbmd1bGFyIGJhbmQgbWF0cml4LCB3aXRoICggayArIDEgKSBkaWFnb25hbHMuCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdHJpeCBpcyBhbiB1cHBlciBvcgorKiAgICAgICAgICAgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgQSBpcyBhbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgQSBpcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBUUkFOUyAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBUUkFOUyBzcGVjaWZpZXMgdGhlIG9wZXJhdGlvbiB0byBiZSBwZXJmb3JtZWQgYXMKKyogICAgICAgICAgIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdOJyBvciAnbicgICB4IDo9IEEqeC4KKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ1QnIG9yICd0JyAgIHggOj0gQScqeC4KKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ0MnIG9yICdjJyAgIHggOj0gQScqeC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRElBRyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgRElBRyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgQSBpcyB1bml0CisqICAgICAgICAgICB0cmlhbmd1bGFyIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBESUFHID0gJ1UnIG9yICd1JyAgIEEgaXMgYXNzdW1lZCB0byBiZSB1bml0IHRyaWFuZ3VsYXIuCisqCisqICAgICAgICAgICAgICBESUFHID0gJ04nIG9yICduJyAgIEEgaXMgbm90IGFzc3VtZWQgdG8gYmUgdW5pdAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbmd1bGFyLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgSyAgICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5IHdpdGggVVBMTyA9ICdVJyBvciAndScsIEsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YKKyogICAgICAgICAgIHN1cGVyLWRpYWdvbmFscyBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBPbiBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCBLIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCisqICAgICAgICAgICBzdWItZGlhZ29uYWxzIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIEsgbXVzdCBzYXRpc2Z5ICAwIC5sZS4gSy4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQSAgICAgIC0gUkVBTCAgICAgICAgICAgICBhcnJheSBvZiBESU1FTlNJT04gKCBMREEsIG4gKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkKKyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIKKyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgbWF0cml4IG9mIGNvZWZmaWNpZW50cywgc3VwcGxpZWQgY29sdW1uIGJ5CisqICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cKKyogICAgICAgICAgICggayArIDEgKSBvZiB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdXBlci1kaWFnb25hbCBzdGFydGluZyBhdAorKiAgICAgICAgICAgcG9zaXRpb24gMiBpbiByb3cgaywgYW5kIHNvIG9uLiBUaGUgdG9wIGxlZnQgayBieSBrIHRyaWFuZ2xlCisqICAgICAgICAgICBvZiB0aGUgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4KKyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgYW4gdXBwZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgYmFuZCBtYXRyaXggZnJvbSBjb252ZW50aW9uYWwgZnVsbCBtYXRyaXggc3RvcmFnZQorKiAgICAgICAgICAgdG8gYmFuZCBzdG9yYWdlOgorKgorKiAgICAgICAgICAgICAgICAgRE8gMjAsIEogPSAxLCBOCisqICAgICAgICAgICAgICAgICAgICBNID0gSyArIDEgLSBKCisqICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IE1BWCggMSwgSiAtIEsgKSwgSgorKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApCisqICAgICAgICAgICAgICAxMCAgICBDT05USU5VRQorKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUKKyoKKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgbGVhZGluZyAoIGsgKyAxICkKKyogICAgICAgICAgIGJ5IG4gcGFydCBvZiB0aGUgYXJyYXkgQSBtdXN0IGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIKKyogICAgICAgICAgIGJhbmQgcGFydCBvZiB0aGUgbWF0cml4IG9mIGNvZWZmaWNpZW50cywgc3VwcGxpZWQgY29sdW1uIGJ5CisqICAgICAgICAgICBjb2x1bW4sIHdpdGggdGhlIGxlYWRpbmcgZGlhZ29uYWwgb2YgdGhlIG1hdHJpeCBpbiByb3cgMSBvZgorKiAgICAgICAgICAgdGhlIGFycmF5LCB0aGUgZmlyc3Qgc3ViLWRpYWdvbmFsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEgaW4KKyogICAgICAgICAgIHJvdyAyLCBhbmQgc28gb24uIFRoZSBib3R0b20gcmlnaHQgayBieSBrIHRyaWFuZ2xlIG9mIHRoZQorKiAgICAgICAgICAgYXJyYXkgQSBpcyBub3QgcmVmZXJlbmNlZC4KKyogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBzZWdtZW50IHdpbGwgdHJhbnNmZXIgYSBsb3dlcgorKiAgICAgICAgICAgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbCBmdWxsIG1hdHJpeCBzdG9yYWdlCisqICAgICAgICAgICB0byBiYW5kIHN0b3JhZ2U6CisqCisqICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4KKyogICAgICAgICAgICAgICAgICAgIE0gPSAxIC0gSgorKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBKLCBNSU4oIE4sIEogKyBLICkKKyogICAgICAgICAgICAgICAgICAgICAgIEEoIE0gKyBJLCBKICkgPSBtYXRyaXgoIEksIEogKQorKiAgICAgICAgICAgICAgMTAgICAgQ09OVElOVUUKKyogICAgICAgICAgICAgIDIwIENPTlRJTlVFCisqCisqICAgICAgICAgICBOb3RlIHRoYXQgd2hlbiBESUFHID0gJ1UnIG9yICd1JyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEEKKyogICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpYWdvbmFsIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXggYXJlIG5vdAorKiAgICAgICAgICAgcmVmZXJlbmNlZCwgYnV0IGFyZSBhc3N1bWVkIHRvIGJlIHVuaXR5LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBMREEgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIExEQSBzcGVjaWZpZXMgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiBBIGFzIGRlY2xhcmVkCisqICAgICAgICAgICBpbiB0aGUgY2FsbGluZyAoc3ViKSBwcm9ncmFtLiBMREEgbXVzdCBiZSBhdCBsZWFzdAorKiAgICAgICAgICAgKCBrICsgMSApLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBSRUFMICAgICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeC4gT24gZXhpdCwgWCBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZQorKiAgICAgICAgICAgdHJhbmZvcm1lZCB2ZWN0b3IgeC4KKyoKKyogIElOQ1ggICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEZ1cnRoZXIgRGV0YWlscworKiAgPT09PT09PT09PT09PT09CisqCisqICBMZXZlbCAyIEJsYXMgcm91dGluZS4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgWkVSTworICAgICAgUEFSQU1FVEVSIChaRVJPPTAuMEUrMCkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMIFRFTVAKKyAgICAgIElOVEVHRVIgSSxJTkZPLElYLEosSlgsS1BMVVMxLEtYLEwKKyAgICAgIExPR0lDQUwgTk9VTklUCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgTUFYLE1JTgorKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKC5OT1QuTFNBTUUoVFJBTlMsJ04nKSAuQU5ELiAuTk9ULkxTQU1FKFRSQU5TLCdUJykgLkFORC4KKyAgICAgKyAgICAgICAgIC5OT1QuTFNBTUUoVFJBTlMsJ0MnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGICguTk9ULkxTQU1FKERJQUcsJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKERJQUcsJ04nKSkgVEhFTgorICAgICAgICAgIElORk8gPSAzCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNAorICAgICAgRUxTRSBJRiAoSy5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDUKKyAgICAgIEVMU0UgSUYgKExEQS5MVC4gKEsrMSkpIFRIRU4KKyAgICAgICAgICBJTkZPID0gNworICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDkKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdTVEJNViAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGIChOLkVRLjApIFJFVFVSTgorKgorICAgICAgTk9VTklUID0gTFNBTUUoRElBRywnTicpCisqCisqICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50IGluIFggaWYgdGhlIGluY3JlbWVudCBpcyBub3QgdW5pdHkuIFRoaXMKKyogICAgIHdpbGwgYmUgICggTiAtIDEgKSpJTkNYICAgdG9vIHNtYWxsIGZvciBkZXNjZW5kaW5nIGxvb3BzLgorKgorICAgICAgSUYgKElOQ1guTEUuMCkgVEhFTgorICAgICAgICAgIEtYID0gMSAtIChOLTEpKklOQ1gKKyAgICAgIEVMU0UgSUYgKElOQ1guTkUuMSkgVEhFTgorICAgICAgICAgIEtYID0gMQorICAgICAgRU5EIElGCisqCisqICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiBBIGFyZQorKiAgICAgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBLgorKgorICAgICAgSUYgKExTQU1FKFRSQU5TLCdOJykpIFRIRU4KKyoKKyogICAgICAgICBGb3JtICB4IDo9IEEqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtQTFVTMSA9IEsgKyAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEwgPSBLUExVUzEgLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSBNQVgoMSxKLUspLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKEkpID0gWChJKSArIFRFTVAqQShMK0ksSikKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikqQShLUExVUzEsSikKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDQwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gTUFYKDEsSi1LKSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJWCkgPSBYKElYKSArIFRFTVAqQShMK0ksSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAzMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSlgpID0gWChKWCkqQShLUExVUzEsSikKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElGIChKLkdULkspIEtYID0gS1ggKyBJTkNYCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDYwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEwgPSAxIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gTUlOKE4sSitLKSxKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJKSA9IFgoSSkgKyBURU1QKkEoTCtJLEopCisgICA1MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSikgPSBYKEopKkEoMSxKKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgS1ggPSBLWCArIChOLTEpKklOQ1gKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDgwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgICAgICBMID0gMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSSA9IE1JTihOLEorSyksSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgKyBURU1QKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAgNzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpKkEoMSxKKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgSUYgKChOLUopLkdFLkspIEtYID0gS1ggLSBJTkNYCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIHggOj0gQScqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtQTFVTMSA9IEsgKyAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDEwMCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkEoS1BMVVMxLEopCisgICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IEogLSAxLE1BWCgxLEotSyksLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBBKEwrSSxKKSpYKEkpCisgICA5MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBYKEopID0gVEVNUAorICAxMDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgS1ggPSBLWCArIChOLTEpKklOQ1gKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDEyMCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgS1ggPSBLWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgTCA9IEtQTFVTMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpBKEtQTFVTMSxKKQorICAgICAgICAgICAgICAgICAgICAgIERPIDExMCBJID0gSiAtIDEsTUFYKDEsSi1LKSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEEoTCtJLEopKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgIDExMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYIC0gSU5DWAorICAxMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxNDAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgTCA9IDEgLSBKCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQSgxLEopCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTMwIEkgPSBKICsgMSxNSU4oTixKK0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgQShMK0ksSikqWChJKQorICAxMzAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgWChKKSA9IFRFTVAKKyAgMTQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDE2MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgS1ggPSBLWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgTCA9IDEgLSBKCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQSgxLEopCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTUwIEkgPSBKICsgMSxNSU4oTixKK0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgQShMK0ksSikqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgMTUwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIFgoSlgpID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgIDE2MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU1RCTVYgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL3N0cG12LmYgYi9ibGFzL3N0cG12LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlYTQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvc3RwbXYuZgpAQCAtMCwwICsxLDI5MyBAQAorICAgICAgU1VCUk9VVElORSBTVFBNVihVUExPLFRSQU5TLERJQUcsTixBUCxYLElOQ1gpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSIElOQ1gsTgorICAgICAgQ0hBUkFDVEVSIERJQUcsVFJBTlMsVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCBBUCgqKSxYKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgU1RQTVYgIHBlcmZvcm1zIG9uZSBvZiB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb25zCisqCisqICAgICB4IDo9IEEqeCwgICBvciAgIHggOj0gQScqeCwKKyoKKyogIHdoZXJlIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yIG5vbi11bml0LAorKiAgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgorKgorKiAgQXJndW1lbnRzCisqICA9PT09PT09PT09CisqCisqICBVUExPICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggaXMgYW4gdXBwZXIgb3IKKyogICAgICAgICAgIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIEEgaXMgYW4gdXBwZXIgdHJpYW5ndWxhciBtYXRyaXguCisqCisqICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIEEgaXMgYSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgVFJBTlMgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVFJBTlMgc3BlY2lmaWVzIHRoZSBvcGVyYXRpb24gdG8gYmUgcGVyZm9ybWVkIGFzCisqICAgICAgICAgICBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnTicgb3IgJ24nICAgeCA6PSBBKnguCisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdUJyBvciAndCcgICB4IDo9IEEnKnguCisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdDJyBvciAnYycgICB4IDo9IEEnKnguCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIERJQUcgICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIERJQUcgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IEEgaXMgdW5pdAorKiAgICAgICAgICAgdHJpYW5ndWxhciBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgRElBRyA9ICdVJyBvciAndScgICBBIGlzIGFzc3VtZWQgdG8gYmUgdW5pdCB0cmlhbmd1bGFyLgorKgorKiAgICAgICAgICAgICAgRElBRyA9ICdOJyBvciAnbicgICBBIGlzIG5vdCBhc3N1bWVkIHRvIGJlIHVuaXQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYW5ndWxhci4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgTiAgICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFQICAgICAtIFJFQUwgICAgICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0CisqICAgICAgICAgICAoICggbiooIG4gKyAxICkgKS8yICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCAgVVBMTyA9ICdVJyBvciAndScsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBwYWNrZWQgc2VxdWVudGlhbGx5LAorKiAgICAgICAgICAgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApIGNvbnRhaW5zIGEoIDEsIDEgKSwKKyogICAgICAgICAgIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAxLCAyICkgYW5kIGEoIDIsIDIgKQorKiAgICAgICAgICAgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IHBhY2tlZCBzZXF1ZW50aWFsbHksCisqICAgICAgICAgICBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkgY29udGFpbnMgYSggMSwgMSApLAorKiAgICAgICAgICAgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKSBhbmQgYSggMywgMSApCisqICAgICAgICAgICByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIE5vdGUgdGhhdCB3aGVuICBESUFHID0gJ1UnIG9yICd1JywgdGhlIGRpYWdvbmFsIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBBIGFyZSBub3QgcmVmZXJlbmNlZCwgYnV0IGFyZSBhc3N1bWVkIHRvIGJlIHVuaXR5LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBSRUFMICAgICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeC4gT24gZXhpdCwgWCBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZQorKiAgICAgICAgICAgdHJhbmZvcm1lZCB2ZWN0b3IgeC4KKyoKKyogIElOQ1ggICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEZ1cnRoZXIgRGV0YWlscworKiAgPT09PT09PT09PT09PT09CisqCisqICBMZXZlbCAyIEJsYXMgcm91dGluZS4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMjItT2N0b2Jlci0xOTg2LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWIuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgWkVSTworICAgICAgUEFSQU1FVEVSIChaRVJPPTAuMEUrMCkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMIFRFTVAKKyAgICAgIElOVEVHRVIgSSxJTkZPLElYLEosSlgsSyxLSyxLWAorICAgICAgTE9HSUNBTCBOT1VOSVQKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgTFNBTUUKKyAgICAgIEVYVEVSTkFMIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMIFhFUkJMQQorKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKC5OT1QuTFNBTUUoVFJBTlMsJ04nKSAuQU5ELiAuTk9ULkxTQU1FKFRSQU5TLCdUJykgLkFORC4KKyAgICAgKyAgICAgICAgIC5OT1QuTFNBTUUoVFJBTlMsJ0MnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGICguTk9ULkxTQU1FKERJQUcsJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKERJQUcsJ04nKSkgVEhFTgorICAgICAgICAgIElORk8gPSAzCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNAorICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDcKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdTVFBNViAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGIChOLkVRLjApIFJFVFVSTgorKgorICAgICAgTk9VTklUID0gTFNBTUUoRElBRywnTicpCisqCisqICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50IGluIFggaWYgdGhlIGluY3JlbWVudCBpcyBub3QgdW5pdHkuIFRoaXMKKyogICAgIHdpbGwgYmUgICggTiAtIDEgKSpJTkNYICB0b28gc21hbGwgZm9yIGRlc2NlbmRpbmcgbG9vcHMuCisqCisgICAgICBJRiAoSU5DWC5MRS4wKSBUSEVOCisgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgRUxTRSBJRiAoSU5DWC5ORS4xKSBUSEVOCisgICAgICAgICAgS1ggPSAxCisgICAgICBFTkQgSUYKKyoKKyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIEFQIGFyZQorKiAgICAgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4KKyoKKyAgICAgIElGIChMU0FNRShUUkFOUywnTicpKSBUSEVOCisqCisqICAgICAgICBGb3JtICB4Oj0gQSp4LgorKgorICAgICAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyAgICAgICAgICAgICAgS0sgPSAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJKSA9IFgoSSkgKyBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikqQVAoS0srSi0xKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyA0MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSyA9IEtLLEtLICsgSiAtIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgKyBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgMzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpKkFQKEtLK0otMSkKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEtLID0gKE4qIChOKzEpKS8yCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDYwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gTixKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJKSA9IFgoSSkgKyBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyAtIDEKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikqQVAoS0stTitKKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSAoTi1KKzEpCisgICA2MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gODAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEsgPSBLSyxLSyAtIChOLSAoSisxKSksLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgKyBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAgNzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpKkFQKEtLLU4rSikKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSAoTi1KKzEpCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIHggOj0gQScqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtLID0gKE4qIChOKzEpKS8yCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDEwMCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpBUChLSykKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sgLSAxCisgICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IEogLSAxLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBBUChLKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLIC0gMQorICAgOTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgWChKKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gSgorICAxMDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWCArIChOLTEpKklOQ1gKKyAgICAgICAgICAgICAgICAgIERPIDEyMCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkFQKEtLKQorICAgICAgICAgICAgICAgICAgICAgIERPIDExMCBLID0gS0sgLSAxLEtLIC0gSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBBUChLKSpYKElYKQorICAxMTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgWChKWCkgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gSgorICAxMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLSyA9IDEKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMTQwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkFQKEtLKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSyArIDEKKyAgICAgICAgICAgICAgICAgICAgICBETyAxMzAgSSA9IEogKyAxLE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBBUChLKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAxMzAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgWChKKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgKE4tSisxKQorICAxNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMTYwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTUwIEsgPSBLSyArIDEsS0sgKyBOIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEFQKEspKlgoSVgpCisgIDE1MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyAoTi1KKzEpCisgIDE2MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgU1RQTVYgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL3N0cHN2LmYgYi9ibGFzL3N0cHN2LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5NWVmYgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvc3Rwc3YuZgpAQCAtMCwwICsxLDI5NiBAQAorICAgICAgU1VCUk9VVElORSBTVFBTVihVUExPLFRSQU5TLERJQUcsTixBUCxYLElOQ1gpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSIElOQ1gsTgorICAgICAgQ0hBUkFDVEVSIERJQUcsVFJBTlMsVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCBBUCgqKSxYKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgU1RQU1YgIHNvbHZlcyBvbmUgb2YgdGhlIHN5c3RlbXMgb2YgZXF1YXRpb25zCisqCisqICAgICBBKnggPSBiLCAgIG9yICAgQScqeCA9IGIsCisqCisqICB3aGVyZSBiIGFuZCB4IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQgQSBpcyBhbiBuIGJ5IG4gdW5pdCwgb3IKKyogIG5vbi11bml0LCB1cHBlciBvciBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisqCisqICBObyB0ZXN0IGZvciBzaW5ndWxhcml0eSBvciBuZWFyLXNpbmd1bGFyaXR5IGlzIGluY2x1ZGVkIGluIHRoaXMKKyogIHJvdXRpbmUuIFN1Y2ggdGVzdHMgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorKgorKiAgQXJndW1lbnRzCisqICA9PT09PT09PT09CisqCisqICBVUExPICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggaXMgYW4gdXBwZXIgb3IKKyogICAgICAgICAgIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIEEgaXMgYW4gdXBwZXIgdHJpYW5ndWxhciBtYXRyaXguCisqCisqICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIEEgaXMgYSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgVFJBTlMgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVFJBTlMgc3BlY2lmaWVzIHRoZSBlcXVhdGlvbnMgdG8gYmUgc29sdmVkIGFzCisqICAgICAgICAgICBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnTicgb3IgJ24nICAgQSp4ID0gYi4KKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ1QnIG9yICd0JyAgIEEnKnggPSBiLgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnQycgb3IgJ2MnICAgQScqeCA9IGIuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIERJQUcgICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIERJQUcgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IEEgaXMgdW5pdAorKiAgICAgICAgICAgdHJpYW5ndWxhciBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgRElBRyA9ICdVJyBvciAndScgICBBIGlzIGFzc3VtZWQgdG8gYmUgdW5pdCB0cmlhbmd1bGFyLgorKgorKiAgICAgICAgICAgICAgRElBRyA9ICdOJyBvciAnbicgICBBIGlzIG5vdCBhc3N1bWVkIHRvIGJlIHVuaXQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYW5ndWxhci4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgTiAgICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFQICAgICAtIFJFQUwgICAgICAgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0CisqICAgICAgICAgICAoICggbiooIG4gKyAxICkgKS8yICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCAgVVBMTyA9ICdVJyBvciAndScsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBwYWNrZWQgc2VxdWVudGlhbGx5LAorKiAgICAgICAgICAgY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCBBUCggMSApIGNvbnRhaW5zIGEoIDEsIDEgKSwKKyogICAgICAgICAgIEFQKCAyICkgYW5kIEFQKCAzICkgY29udGFpbiBhKCAxLCAyICkgYW5kIGEoIDIsIDIgKQorKiAgICAgICAgICAgcmVzcGVjdGl2ZWx5LCBhbmQgc28gb24uCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCBVUExPID0gJ0wnIG9yICdsJywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4IHBhY2tlZCBzZXF1ZW50aWFsbHksCisqICAgICAgICAgICBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkgY29udGFpbnMgYSggMSwgMSApLAorKiAgICAgICAgICAgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKSBhbmQgYSggMywgMSApCisqICAgICAgICAgICByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIE5vdGUgdGhhdCB3aGVuICBESUFHID0gJ1UnIG9yICd1JywgdGhlIGRpYWdvbmFsIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBBIGFyZSBub3QgcmVmZXJlbmNlZCwgYnV0IGFyZSBhc3N1bWVkIHRvIGJlIHVuaXR5LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBSRUFMICAgICAgICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCByaWdodC1oYW5kIHNpZGUgdmVjdG9yIGIuIE9uIGV4aXQsIFggaXMgb3ZlcndyaXR0ZW4KKyogICAgICAgICAgIHdpdGggdGhlIHNvbHV0aW9uIHZlY3RvciB4LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRnVydGhlciBEZXRhaWxzCisqICA9PT09PT09PT09PT09PT0KKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89MC4wRSswKQorKiAgICAgLi4KKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgVEVNUAorICAgICAgSU5URUdFUiBJLElORk8sSVgsSixKWCxLLEtLLEtYCisgICAgICBMT0dJQ0FMIE5PVU5JVAorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCBMU0FNRQorICAgICAgRVhURVJOQUwgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgWEVSQkxBCisqICAgICAuLgorKgorKiAgICAgVGVzdCB0aGUgaW5wdXQgcGFyYW1ldGVycy4KKyoKKyAgICAgIElORk8gPSAwCisgICAgICBJRiAoLk5PVC5MU0FNRShVUExPLCdVJykgLkFORC4gLk5PVC5MU0FNRShVUExPLCdMJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMQorICAgICAgRUxTRSBJRiAoLk5PVC5MU0FNRShUUkFOUywnTicpIC5BTkQuIC5OT1QuTFNBTUUoVFJBTlMsJ1QnKSAuQU5ELgorICAgICArICAgICAgICAgLk5PVC5MU0FNRShUUkFOUywnQycpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDIKKyAgICAgIEVMU0UgSUYgKC5OT1QuTFNBTUUoRElBRywnVScpIC5BTkQuIC5OT1QuTFNBTUUoRElBRywnTicpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDMKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA0CisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNworICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ1NUUFNWICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKE4uRVEuMCkgUkVUVVJOCisqCisgICAgICBOT1VOSVQgPSBMU0FNRShESUFHLCdOJykKKyoKKyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnQgaW4gWCBpZiB0aGUgaW5jcmVtZW50IGlzIG5vdCB1bml0eS4gVGhpcworKiAgICAgd2lsbCBiZSAgKCBOIC0gMSApKklOQ1ggIHRvbyBzbWFsbCBmb3IgZGVzY2VuZGluZyBsb29wcy4KKyoKKyAgICAgIElGIChJTkNYLkxFLjApIFRIRU4KKyAgICAgICAgICBLWCA9IDEgLSAoTi0xKSpJTkNYCisgICAgICBFTFNFIElGIChJTkNYLk5FLjEpIFRIRU4KKyAgICAgICAgICBLWCA9IDEKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgQVAgYXJlCisqICAgICBhY2Nlc3NlZCBzZXF1ZW50aWFsbHkgd2l0aCBvbmUgcGFzcyB0aHJvdWdoIEFQLgorKgorICAgICAgSUYgKExTQU1FKFRSQU5TLCdOJykpIFRIRU4KKyoKKyogICAgICAgIEZvcm0gIHggOj0gaW52KCBBICkqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtLID0gKE4qIChOKzEpKS8yCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDIwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSikgPSBYKEopL0FQKEtLKQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gS0sgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSBKIC0gMSwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKEkpID0gWChJKSAtIFRFTVAqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLIC0gMQorICAgMTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSBKCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgRE8gNDAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSlgpID0gWChKWCkvQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEsgPSBLSyAtIDEsS0sgLSBKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgLSBURU1QKkFQKEspCisgICAzMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gSgorICAgNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLSyA9IDEKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEopLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKKSA9IFgoSikvQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IEogKyAxLE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSSkgPSBYKEkpIC0gVEVNUCpBUChLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICA1MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgIDYwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDgwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpL0FQKEtLKQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBLID0gS0sgKyAxLEtLICsgTiAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKElYKSA9IFgoSVgpIC0gVEVNUCpBUChLKQorICAgNzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgeCA6PSBpbnYoIEEnICkqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtLID0gMQorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMDAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IDEsSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgLSBBUChLKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgOTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAvQVAoS0srSi0xKQorICAgICAgICAgICAgICAgICAgICAgIFgoSikgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIEoKKyAgMTAwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDEyMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgIERPIDExMCBLID0gS0ssS0sgKyBKIC0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCAtIEFQKEspKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgIDExMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUC9BUChLSytKLTEpCisgICAgICAgICAgICAgICAgICAgICAgWChKWCkgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAxMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLSyA9IChOKiAoTisxKSkvMgorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxNDAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTMwIEkgPSBOLEogKyAxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QIC0gQVAoSykqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyAtIDEKKyAgMTMwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0FQKEtLLU4rSikKKyAgICAgICAgICAgICAgICAgICAgICBYKEopID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSAoTi1KKzEpCisgIDE0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMTYwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgRE8gMTUwIEsgPSBLSyxLSyAtIChOLSAoSisxKSksLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgLSBBUChLKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAxNTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAvQVAoS0stTitKKQorICAgICAgICAgICAgICAgICAgICAgIFgoSlgpID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyAtIChOLUorMSkKKyAgMTYwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTVFBTViAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9DTWFrZUxpc3RzLnR4dCBiL2JsYXMvdGVzdGluZy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWI4MDI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDAgQEAKKworbWFjcm8oZWlfYWRkX2JsYXNfdGVzdCB0ZXN0bmFtZSkKKworICBzZXQodGFyZ2V0bmFtZSAke3Rlc3RuYW1lfSkKKworICBzZXQoZmlsZW5hbWUgJHt0ZXN0bmFtZX0uZikKKyAgYWRkX2V4ZWN1dGFibGUoJHt0YXJnZXRuYW1lfSAke2ZpbGVuYW1lfSkKKworICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXRuYW1lfSBlaWdlbl9ibGFzKQorCisgIGlmKEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldG5hbWV9ICR7RUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE99KQorICBlbmRpZigpCisKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0bmFtZX0gJHtFWFRFUk5BTF9MSUJTfSkKKworICBhZGRfdGVzdCgke3Rlc3RuYW1lfSAiJHtFaWdlbl9TT1VSQ0VfRElSfS9ibGFzL3Rlc3RpbmcvcnVuYmxhc3Rlc3Quc2giICIke3Rlc3RuYW1lfSIgIiR7RWlnZW5fU09VUkNFX0RJUn0vYmxhcy90ZXN0aW5nLyR7dGVzdG5hbWV9LmRhdCIpCisgIGFkZF9kZXBlbmRlbmNpZXMoYnVpbGR0ZXN0cyAke3RhcmdldG5hbWV9KQorICAKK2VuZG1hY3JvKGVpX2FkZF9ibGFzX3Rlc3QpCisKK2VpX2FkZF9ibGFzX3Rlc3Qoc2JsYXQxKQorZWlfYWRkX2JsYXNfdGVzdChzYmxhdDIpCitlaV9hZGRfYmxhc190ZXN0KHNibGF0MykKKworZWlfYWRkX2JsYXNfdGVzdChkYmxhdDEpCitlaV9hZGRfYmxhc190ZXN0KGRibGF0MikKK2VpX2FkZF9ibGFzX3Rlc3QoZGJsYXQzKQorCitlaV9hZGRfYmxhc190ZXN0KGNibGF0MSkKK2VpX2FkZF9ibGFzX3Rlc3QoY2JsYXQyKQorZWlfYWRkX2JsYXNfdGVzdChjYmxhdDMpCisKK2VpX2FkZF9ibGFzX3Rlc3QoemJsYXQxKQorZWlfYWRkX2JsYXNfdGVzdCh6YmxhdDIpCitlaV9hZGRfYmxhc190ZXN0KHpibGF0MykKKworIyBhZGRfY3VzdG9tX3RhcmdldChsZXZlbDEpCisjIGFkZF9kZXBlbmRlbmNpZXMobGV2ZWwxIHNibGF0MSkKKwpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL2NibGF0MS5mIGIvYmxhcy90ZXN0aW5nL2NibGF0MS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Yzk5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvY2JsYXQxLmYKQEAgLTAsMCArMSw2ODEgQEAKKyAgICAgIFBST0dSQU0gQ0JMQVQxCisqICAgICBUZXN0IHByb2dyYW0gZm9yIHRoZSBDT01QTEVYICAgIExldmVsIDEgQkxBUy4KKyogICAgIEJhc2VkIHVwb24gdGhlIG9yaWdpbmFsIEJMQVMgdGVzdCByb3V0aW5lIHRvZ2V0aGVyIHdpdGg6CisqICAgICBGMDZHQUYgRXhhbXBsZSBQcm9ncmFtIFRleHQKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTRkFDCisgICAgICBJTlRFR0VSICAgICAgICAgIElDCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICBDSEVDSzEsIENIRUNLMiwgSEVBREVSCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICBTRkFDLzkuNzY1NjI1RS00LworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBXUklURSAoTk9VVCw5OTk5OSkKKyAgICAgIERPIDIwIElDID0gMSwgMTAKKyAgICAgICAgIElDQVNFID0gSUMKKyAgICAgICAgIENBTEwgSEVBREVSCisqCisqICAgICAgICBJbml0aWFsaXplIFBBU1MsIElOQ1gsIElOQ1ksIGFuZCBNT0RFIGZvciBhIG5ldyBjYXNlLgorKiAgICAgICAgVGhlIHZhbHVlIDk5OTkgZm9yIElOQ1gsIElOQ1kgb3IgTU9ERSB3aWxsIGFwcGVhciBpbiB0aGUKKyogICAgICAgIGRldGFpbGVkICBvdXRwdXQsIGlmIGFueSwgZm9yIGNhc2VzIHRoYXQgZG8gbm90IGludm9sdmUKKyogICAgICAgIHRoZXNlIHBhcmFtZXRlcnMuCisqCisgICAgICAgICBQQVNTID0gLlRSVUUuCisgICAgICAgICBJTkNYID0gOTk5OQorICAgICAgICAgSU5DWSA9IDk5OTkKKyAgICAgICAgIE1PREUgPSA5OTk5CisgICAgICAgICBJRiAoSUNBU0UuTEUuNSkgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzIoU0ZBQykKKyAgICAgICAgIEVMU0UgSUYgKElDQVNFLkdFLjYpIFRIRU4KKyAgICAgICAgICAgIENBTEwgQ0hFQ0sxKFNGQUMpCisgICAgICAgICBFTkQgSUYKKyogICAgICAgIC0tIFByaW50CisgICAgICAgICBJRiAoUEFTUykgV1JJVEUgKE5PVVQsOTk5OTgpCisgICAyMCBDT05USU5VRQorICAgICAgU1RPUAorKgorOTk5OTkgRk9STUFUICgnIENvbXBsZXggQkxBUyBUZXN0IFByb2dyYW0gUmVzdWx0cycsLzFYKQorOTk5OTggRk9STUFUICgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0gUEFTUyAtLS0tLScpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgSEVBREVSCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ0hBUkFDVEVSKjYgICAgICBMKDEwKQorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxKS8nQ0RPVEMgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgyKS8nQ0RPVFUgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgzKS8nQ0FYUFkgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg0KS8nQ0NPUFkgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg1KS8nQ1NXQVAgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg2KS8nU0NOUk0yJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg3KS8nU0NBU1VNJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg4KS8nQ1NDQUwgJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCg5KS8nQ1NTQ0FMJy8KKyAgICAgIERBVEEgICAgICAgICAgICAgTCgxMCkvJ0lDQU1BWCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFdSSVRFIChOT1VULDk5OTk5KSBJQ0FTRSwgTChJQ0FTRSkKKyAgICAgIFJFVFVSTgorKgorOTk5OTkgRk9STUFUICgvJyBUZXN0IG9mIHN1YnByb2dyYW0gbnVtYmVyJyxJMywxMlgsQTYpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hFQ0sxKFNGQUMpCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0ZBQworKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICBDQQorICAgICAgUkVBTCAgICAgICAgICAgICAgU0EKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIEosIExFTiwgTlAxCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgIENUUlVFNSg4LDUsMiksIENUUlVFNig4LDUsMiksIENWKDgsNSwyKSwgQ1goOCksCisgICAgICsgICAgICAgICAgICAgICAgICBNV1BDUyg1KSwgTVdQQ1QoNSkKKyAgICAgIFJFQUwgICAgICAgICAgICAgIFNUUlVFMig1KSwgU1RSVUU0KDUpCisgICAgICBJTlRFR0VSICAgICAgICAgICBJVFJVRTMoNSkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0NBU1VNLCBTQ05STTIKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQU1BWAorICAgICAgRVhURVJOQUwgICAgICAgICAgU0NBU1VNLCBTQ05STTIsIElDQU1BWAorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIENTQ0FMLCBDU1NDQUwsIENURVNULCBJVEVTVDEsIFNURVNUMQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgTUFYCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNBLCBDQS8wLjNFMCwgKDAuNEUwLC0wLjdFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENWKEksSiwxKSxJPTEsOCksSj0xLDUpLygwLjFFMCwwLjFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRTAsMi4wRTApLCAoMS4wRTAsMi4wRTApLCAoMS4wRTAsMi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBFMCwyLjBFMCksICgwLjNFMCwtMC40RTApLCAoMy4wRTAsNC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xRTAsLTAuM0UwKSwgKDAuNUUwLC0wLjFFMCksICg1LjBFMCw2LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNS4wRTAsNi4wRTApLCAoNS4wRTAsNi4wRTApLCAoNS4wRTAsNi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDUuMEUwLDYuMEUwKSwgKDUuMEUwLDYuMEUwKSwgKDAuMUUwLDAuMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC42RTAsMC4xRTApLCAoMC4xRTAsLTAuM0UwKSwgKDcuMEUwLDguMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg3LjBFMCw4LjBFMCksICg3LjBFMCw4LjBFMCksICg3LjBFMCw4LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRTAsOC4wRTApLCAoMC4zRTAsMC4xRTApLCAoMC4xRTAsMC40RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNEUwLDAuMUUwKSwgKDAuMUUwLDAuMkUwKSwgKDIuMEUwLDMuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBFMCwzLjBFMCksICgyLjBFMCwzLjBFMCksICgyLjBFMCwzLjBFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENWKEksSiwyKSxJPTEsOCksSj0xLDUpLygwLjFFMCwwLjFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEUwLDUuMEUwKSwgKDQuMEUwLDUuMEUwKSwgKDQuMEUwLDUuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBFMCw1LjBFMCksICgwLjNFMCwtMC40RTApLCAoNi4wRTAsNy4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDYuMEUwLDcuMEUwKSwgKDYuMEUwLDcuMEUwKSwgKDYuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg2LjBFMCw3LjBFMCksICg2LjBFMCw3LjBFMCksICg2LjBFMCw3LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xRTAsLTAuM0UwKSwgKDguMEUwLDkuMEUwKSwgKDAuNUUwLC0wLjFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRTAsNS4wRTApLCAoMi4wRTAsNS4wRTApLCAoMi4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDIuMEUwLDUuMEUwKSwgKDIuMEUwLDUuMEUwKSwgKDAuMUUwLDAuMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBFMCw2LjBFMCksICgtMC42RTAsMC4xRTApLCAoNC4wRTAsNy4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMUUwLC0wLjNFMCksICg3LjBFMCwyLjBFMCksICg3LjBFMCwyLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRTAsMi4wRTApLCAoMC4zRTAsMC4xRTApLCAoNS4wRTAsOC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMUUwLDAuNEUwKSwgKDYuMEUwLDkuMEUwKSwgKDAuNEUwLDAuMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg4LjBFMCwzLjBFMCksICgwLjFFMCwwLjJFMCksICg5LjBFMCw0LjBFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICBTVFJVRTIvMC4wRTAsIDAuNUUwLCAwLjZFMCwgMC43RTAsIDAuN0UwLworICAgICAgREFUQSAgICAgICAgICAgICAgU1RSVUU0LzAuMEUwLCAwLjdFMCwgMS4wRTAsIDEuM0UwLCAxLjdFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1RSVUU1KEksSiwxKSxJPTEsOCksSj0xLDUpLygwLjFFMCwwLjFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRTAsMi4wRTApLCAoMS4wRTAsMi4wRTApLCAoMS4wRTAsMi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBFMCwyLjBFMCksICgtMC4xNkUwLC0wLjM3RTApLCAoMy4wRTAsNC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuMTdFMCwtMC4xOUUwKSwgKDAuMTNFMCwtMC4zOUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg1LjBFMCw2LjBFMCksICg1LjBFMCw2LjBFMCksICg1LjBFMCw2LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNS4wRTAsNi4wRTApLCAoNS4wRTAsNi4wRTApLCAoNS4wRTAsNi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMTFFMCwtMC4wM0UwKSwgKC0wLjE3RTAsMC40NkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0UwLC0wLjE5RTApLCAoNy4wRTAsOC4wRTApLCAoNy4wRTAsOC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEUwLDguMEUwKSwgKDcuMEUwLDguMEUwKSwgKDcuMEUwLDguMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjE5RTAsLTAuMTdFMCksICgwLjMyRTAsMC4wOUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjIzRTAsLTAuMjRFMCksICgwLjE4RTAsMC4wMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBFMCwzLjBFMCksICgyLjBFMCwzLjBFMCksICgyLjBFMCwzLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRTAsMy4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVFJVRTUoSSxKLDIpLEk9MSw4KSxKPTEsNSkvKDAuMUUwLDAuMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBFMCw1LjBFMCksICg0LjBFMCw1LjBFMCksICg0LjBFMCw1LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEUwLDUuMEUwKSwgKC0wLjE2RTAsLTAuMzdFMCksICg2LjBFMCw3LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNi4wRTAsNy4wRTApLCAoNi4wRTAsNy4wRTApLCAoNi4wRTAsNy4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDYuMEUwLDcuMEUwKSwgKDYuMEUwLDcuMEUwKSwgKDYuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0UwLC0wLjE5RTApLCAoOC4wRTAsOS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMTNFMCwtMC4zOUUwKSwgKDIuMEUwLDUuMEUwKSwgKDIuMEUwLDUuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBFMCw1LjBFMCksICgyLjBFMCw1LjBFMCksICgyLjBFMCw1LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xMUUwLC0wLjAzRTApLCAoMy4wRTAsNi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjE3RTAsMC40NkUwKSwgKDQuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0UwLC0wLjE5RTApLCAoNy4wRTAsMi4wRTApLCAoNy4wRTAsMi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEUwLDIuMEUwKSwgKDAuMTlFMCwtMC4xN0UwKSwgKDUuMEUwLDguMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjMyRTAsMC4wOUUwKSwgKDYuMEUwLDkuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjIzRTAsLTAuMjRFMCksICg4LjBFMCwzLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xOEUwLDAuMDFFMCksICg5LjBFMCw0LjBFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUUlVFNihJLEosMSksST0xLDgpLEo9MSw1KS8oMC4xRTAsMC4xRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwgKDEuMEUwLDIuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBFMCwyLjBFMCksICgxLjBFMCwyLjBFMCksICgxLjBFMCwyLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRTAsMi4wRTApLCAoMC4wOUUwLC0wLjEyRTApLCAoMy4wRTAsNC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwgKDMuMEUwLDQuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksICgzLjBFMCw0LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0UwLC0wLjA5RTApLCAoMC4xNUUwLC0wLjAzRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDUuMEUwLDYuMEUwKSwgKDUuMEUwLDYuMEUwKSwgKDUuMEUwLDYuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg1LjBFMCw2LjBFMCksICg1LjBFMCw2LjBFMCksICg1LjBFMCw2LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0UwLDAuMDNFMCksICgtMC4xOEUwLDAuMDNFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0UwLC0wLjA5RTApLCAoNy4wRTAsOC4wRTApLCAoNy4wRTAsOC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEUwLDguMEUwKSwgKDcuMEUwLDguMEUwKSwgKDcuMEUwLDguMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjA5RTAsMC4wM0UwKSwgKDAuMDNFMCwwLjEyRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMTJFMCwwLjAzRTApLCAoMC4wM0UwLDAuMDZFMCksICgyLjBFMCwzLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRTAsMy4wRTApLCAoMi4wRTAsMy4wRTApLCAoMi4wRTAsMy4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVFJVRTYoSSxKLDIpLEk9MSw4KSxKPTEsNSkvKDAuMUUwLDAuMUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBFMCw1LjBFMCksICg0LjBFMCw1LjBFMCksICg0LjBFMCw1LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLCAoNC4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEUwLDUuMEUwKSwgKDAuMDlFMCwtMC4xMkUwKSwgKDYuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg2LjBFMCw3LjBFMCksICg2LjBFMCw3LjBFMCksICg2LjBFMCw3LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNi4wRTAsNy4wRTApLCAoNi4wRTAsNy4wRTApLCAoNi4wRTAsNy4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNFMCwtMC4wOUUwKSwgKDguMEUwLDkuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjE1RTAsLTAuMDNFMCksICgyLjBFMCw1LjBFMCksICgyLjBFMCw1LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRTAsNS4wRTApLCAoMi4wRTAsNS4wRTApLCAoMi4wRTAsNS4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNFMCwwLjAzRTApLCAoMy4wRTAsNi4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjE4RTAsMC4wM0UwKSwgKDQuMEUwLDcuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjAzRTAsLTAuMDlFMCksICg3LjBFMCwyLjBFMCksICg3LjBFMCwyLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRTAsMi4wRTApLCAoMC4wOUUwLDAuMDNFMCksICg1LjBFMCw4LjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0UwLDAuMTJFMCksICg2LjBFMCw5LjBFMCksICgwLjEyRTAsMC4wM0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg4LjBFMCwzLjBFMCksICgwLjAzRTAsMC4wNkUwKSwgKDkuMEUwLDQuMEUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElUUlVFMy8wLCAxLCAyLCAyLCAyLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyA2MCBJTkNYID0gMSwgMgorICAgICAgICAgRE8gNDAgTlAxID0gMSwgNQorICAgICAgICAgICAgTiA9IE5QMSAtIDEKKyAgICAgICAgICAgIExFTiA9IDIqTUFYKE4sMSkKKyogICAgICAgICAgIC4uIFNldCB2ZWN0b3IgYXJndW1lbnRzIC4uCisgICAgICAgICAgICBETyAyMCBJID0gMSwgTEVOCisgICAgICAgICAgICAgICBDWChJKSA9IENWKEksTlAxLElOQ1gpCisgICAyMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYgKElDQVNFLkVRLjYpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFNDTlJNMiAuLgorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVDEoU0NOUk0yKE4sQ1gsSU5DWCksU1RSVUUyKE5QMSksU1RSVUUyKE5QMSksCisgICAgICsgICAgICAgICAgICAgICAgICAgICBTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNykgVEhFTgorKiAgICAgICAgICAgICAgLi4gU0NBU1VNIC4uCisgICAgICAgICAgICAgICBDQUxMIFNURVNUMShTQ0FTVU0oTixDWCxJTkNYKSxTVFJVRTQoTlAxKSxTVFJVRTQoTlAxKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICAgIFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS44KSBUSEVOCisqICAgICAgICAgICAgICAuLiBDU0NBTCAuLgorICAgICAgICAgICAgICAgQ0FMTCBDU0NBTChOLENBLENYLElOQ1gpCisgICAgICAgICAgICAgICBDQUxMIENURVNUKExFTixDWCxDVFJVRTUoMSxOUDEsSU5DWCksQ1RSVUU1KDEsTlAxLElOQ1gpLAorICAgICArICAgICAgICAgICAgICAgICAgICBTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuOSkgVEhFTgorKiAgICAgICAgICAgICAgLi4gQ1NTQ0FMIC4uCisgICAgICAgICAgICAgICBDQUxMIENTU0NBTChOLFNBLENYLElOQ1gpCisgICAgICAgICAgICAgICBDQUxMIENURVNUKExFTixDWCxDVFJVRTYoMSxOUDEsSU5DWCksQ1RSVUU2KDEsTlAxLElOQ1gpLAorICAgICArICAgICAgICAgICAgICAgICAgICBTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuMTApIFRIRU4KKyogICAgICAgICAgICAgIC4uIElDQU1BWCAuLgorICAgICAgICAgICAgICAgQ0FMTCBJVEVTVDEoSUNBTUFYKE4sQ1gsSU5DWCksSVRSVUUzKE5QMSkpCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzEnCisgICAgICAgICAgICAgICBTVE9QCisgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDQwICAgIENPTlRJTlVFCisgICA2MCBDT05USU5VRQorKgorICAgICAgSU5DWCA9IDEKKyAgICAgIElGIChJQ0FTRS5FUS44KSBUSEVOCisqICAgICAgICBDU0NBTAorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gemVyby4KKyAgICAgICAgIENBID0gKDAuMEUwLDAuMEUwKQorICAgICAgICAgRE8gODAgSSA9IDEsIDUKKyAgICAgICAgICAgIE1XUENUKEkpID0gKDAuMEUwLDAuMEUwKQorICAgICAgICAgICAgTVdQQ1MoSSkgPSAoMS4wRTAsMS4wRTApCisgICA4MCAgICBDT05USU5VRQorICAgICAgICAgQ0FMTCBDU0NBTCg1LENBLENYLElOQ1gpCisgICAgICAgICBDQUxMIENURVNUKDUsQ1gsTVdQQ1QsTVdQQ1MsU0ZBQykKKyAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjkpIFRIRU4KKyogICAgICAgIENTU0NBTAorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gemVyby4KKyAgICAgICAgIFNBID0gMC4wRTAKKyAgICAgICAgIERPIDEwMCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSAoMC4wRTAsMC4wRTApCisgICAgICAgICAgICBNV1BDUyhJKSA9ICgxLjBFMCwxLjBFMCkKKyAgMTAwICAgIENPTlRJTlVFCisgICAgICAgICBDQUxMIENTU0NBTCg1LFNBLENYLElOQ1gpCisgICAgICAgICBDQUxMIENURVNUKDUsQ1gsTVdQQ1QsTVdQQ1MsU0ZBQykKKyogICAgICAgIEFkZCBhIHRlc3QgZm9yIGFscGhhIGVxdWFsIHRvIG9uZS4KKyAgICAgICAgIFNBID0gMS4wRTAKKyAgICAgICAgIERPIDEyMCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSBDWChJKQorICAgICAgICAgICAgTVdQQ1MoSSkgPSBDWChJKQorICAxMjAgICAgQ09OVElOVUUKKyAgICAgICAgIENBTEwgQ1NTQ0FMKDUsU0EsQ1gsSU5DWCkKKyAgICAgICAgIENBTEwgQ1RFU1QoNSxDWCxNV1BDVCxNV1BDUyxTRkFDKQorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gbWludXMgb25lLgorICAgICAgICAgU0EgPSAtMS4wRTAKKyAgICAgICAgIERPIDE0MCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSAtQ1goSSkKKyAgICAgICAgICAgIE1XUENTKEkpID0gLUNYKEkpCisgIDE0MCAgICBDT05USU5VRQorICAgICAgICAgQ0FMTCBDU1NDQUwoNSxTQSxDWCxJTkNYKQorICAgICAgICAgQ0FMTCBDVEVTVCg1LENYLE1XUENULE1XUENTLFNGQUMpCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIRUNLMihTRkFDKQorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgIFNGQUMKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgQ0EKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIEosIEtJLCBLTiwgS1NJWkUsIExFTlgsIExFTlksIE1YLCBNWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICBDRE9UKDEpLCBDU0laRTEoNCksIENTSVpFMig3LDIpLCBDU0laRTMoMTQpLAorICAgICArICAgICAgICAgICAgICAgICAgQ1QxMFgoNyw0LDQpLCBDVDEwWSg3LDQsNCksIENUNig0LDQpLCBDVDcoNCw0KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIENUOCg3LDQsNCksIENYKDcpLCBDWDEoNyksIENZKDcpLCBDWTEoNykKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElOQ1hTKDQpLCBJTkNZUyg0KSwgTEVOUyg0LDIpLCBOUyg0KQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICBDRE9UQywgQ0RPVFUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgIENET1RDLCBDRE9UVQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIENBWFBZLCBDQ09QWSwgQ1NXQVAsIENURVNUCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBBQlMsIE1JTgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICBDQS8oMC40RTAsLTAuN0UwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1hTLzEsIDIsIC0yLCAtMS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1lTLzEsIC0yLCAxLCAtMi8KKyAgICAgIERBVEEgICAgICAgICAgICAgIExFTlMvMSwgMSwgMiwgNCwgMSwgMSwgMywgNy8KKyAgICAgIERBVEEgICAgICAgICAgICAgIE5TLzAsIDEsIDIsIDQvCisgICAgICBEQVRBICAgICAgICAgICAgICBDWDEvKDAuN0UwLC0wLjhFMCksICgtMC40RTAsLTAuN0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xRTAsLTAuOUUwKSwgKDAuMkUwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUUwLC0wLjRFMCksICgwLjFFMCwwLjRFMCksICgtMC42RTAsMC42RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1kxLygwLjZFMCwtMC42RTApLCAoLTAuOUUwLDAuNUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC42RTApLCAoMC4xRTAsLTAuNUUwKSwgKC0wLjFFMCwtMC4yRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjVFMCwtMC4zRTApLCAoMC44RTAsLTAuN0UwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1Q4KEksSiwxKSxJPTEsNyksSj0xLDQpLygwLjZFMCwtMC42RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zMkUwLC0xLjQxRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjMyRTAsLTEuNDFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTEuNTVFMCwwLjVFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMzJFMCwtMS40MUUwKSwgKC0xLjU1RTAsMC41RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNFMCwtMC44OUUwKSwgKC0wLjM4RTAsLTAuOTZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDgoSSxKLDIpLEk9MSw3KSxKPTEsNCkvKDAuNkUwLC0wLjZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjMyRTAsLTEuNDFFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKC0wLjA3RTAsLTAuODlFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUUwLDAuNUUwKSwgKDAuNDJFMCwtMS40MUUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43OEUwLDAuMDZFMCksICgtMC45RTAsMC41RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDZFMCwtMC4xM0UwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNzdFMCwtMC40OUUwKSwgKC0wLjVFMCwtMC4zRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNTJFMCwtMS41MUUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1Q4KEksSiwzKSxJPTEsNyksSj0xLDQpLygwLjZFMCwtMC42RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zMkUwLC0xLjQxRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgtMC4wN0UwLC0wLjg5RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0xLjE4RTAsLTAuMzFFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNzhFMCwwLjA2RTApLCAoLTEuNTRFMCwwLjk3RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNFMCwtMC44OUUwKSwgKC0wLjE4RTAsLTEuMzFFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDgoSSxKLDQpLEk9MSw3KSxKPTEsNCkvKDAuNkUwLC0wLjZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjMyRTAsLTEuNDFFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMzJFMCwtMS40MUUwKSwgKC0wLjlFMCwwLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wNUUwLC0wLjZFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4zMkUwLC0xLjQxRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjlFMCwwLjVFMCksICgwLjA1RTAsLTAuNkUwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNzdFMCwtMC40OUUwKSwgKC0wLjVFMCwtMC4zRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMzJFMCwtMS4xNkUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIENUNy8oMC4wRTAsMC4wRTApLCAoLTAuMDZFMCwtMC45MEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjY1RTAsLTAuNDdFMCksICgtMC4zNEUwLC0xLjIyRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKC0wLjA2RTAsLTAuOTBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNTlFMCwtMS40NkUwKSwgKC0xLjA0RTAsLTAuMDRFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoLTAuMDZFMCwtMC45MEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC44M0UwLDAuNTlFMCksICgwLjA3RTAsLTAuMzdFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoLTAuMDZFMCwtMC45MEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC43NkUwLC0xLjE1RTApLCAoLTEuMzNFMCwtMS44MkUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIENUNi8oMC4wRTAsMC4wRTApLCAoMC45MEUwLDAuMDZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC45MUUwLC0wLjc3RTApLCAoMS44MEUwLC0wLjEwRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuOTBFMCwwLjA2RTApLCAoMS40NUUwLDAuNzRFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4yMEUwLDAuOTBFMCksICgwLjBFMCwwLjBFMCksICgwLjkwRTAsMC4wNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC41NUUwLDAuMjNFMCksICgwLjgzRTAsLTAuMzlFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC45MEUwLDAuMDZFMCksICgxLjA0RTAsMC43OUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjk1RTAsMS4yMkUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFgoSSxKLDEpLEk9MSw3KSxKPTEsNCkvKDAuN0UwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjZFMCwtMC42RTApLCAoLTAuOUUwLDAuNUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC42RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RTAsMC41RTApLCAoMC43RTAsLTAuNkUwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWChJLEosMiksST0xLDcpLEo9MSw0KS8oMC43RTAsLTAuOEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkUwLC0wLjZFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuN0UwLC0wLjZFMCksICgtMC40RTAsLTAuN0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuOEUwLC0wLjdFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEUwLC0wLjdFMCksICgtMC4xRTAsLTAuMkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjJFMCwtMC44RTApLCAoMC43RTAsLTAuNkUwKSwgKDAuMUUwLDAuNEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWChJLEosMyksST0xLDcpLEo9MSw0KS8oMC43RTAsLTAuOEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkUwLC0wLjZFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKC0wLjlFMCwwLjVFMCksICgtMC40RTAsLTAuN0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEUwLC0wLjdFMCksICgwLjdFMCwtMC42RTApLCAoMC4yRTAsLTAuOEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RTAsMC41RTApLCAoMC4xRTAsMC40RTApLCAoMC42RTAsLTAuNkUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFgoSSxKLDQpLEk9MSw3KSxKPTEsNCkvKDAuN0UwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjZFMCwtMC42RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjZFMCwtMC42RTApLCAoMC43RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC42RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC42RTApLCAoLTAuMUUwLC0wLjJFMCksICgwLjhFMCwtMC43RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFkoSSxKLDEpLEk9MSw3KSxKPTEsNCkvKDAuNkUwLC0wLjZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC44RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjdFMCwtMC44RTApLCAoLTAuNEUwLC0wLjdFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuN0UwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEUwLC0wLjdFMCksICgtMC4xRTAsLTAuOUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjJFMCwtMC44RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1QxMFkoSSxKLDIpLEk9MSw3KSxKPTEsNCkvKDAuNkUwLC0wLjZFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC44RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgtMC4xRTAsLTAuOUUwKSwgKC0wLjlFMCwwLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43RTAsLTAuOEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgtMC42RTAsMC42RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjlFMCwwLjVFMCksICgtMC45RTAsLTAuNEUwKSwgKDAuMUUwLC0wLjVFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuMUUwLC0wLjlFMCksICgtMC41RTAsLTAuM0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdFMCwtMC44RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWShJLEosMyksST0xLDcpLEo9MSw0KS8oMC42RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0UwLC0wLjhFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKC0wLjFFMCwtMC45RTApLCAoMC43RTAsLTAuOEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoLTAuNkUwLDAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RTAsLTAuNEUwKSwgKC0wLjFFMCwtMC45RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0UwLC0wLjhFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWShJLEosNCksST0xLDcpLEo9MSw0KS8oMC42RTAsLTAuNkUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0UwLC0wLjhFMCksICgwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuN0UwLC0wLjhFMCksICgtMC45RTAsMC41RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjRFMCwtMC43RTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDAuN0UwLC0wLjhFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUUwLDAuNUUwKSwgKC0wLjRFMCwtMC43RTApLCAoMC4xRTAsLTAuNUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xRTAsLTAuOUUwKSwgKC0wLjVFMCwtMC4zRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMkUwLC0wLjhFMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICBDU0laRTEvKDAuMEUwLDAuMEUwKSwgKDAuOUUwLDAuOUUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjYzRTAsMS43M0UwKSwgKDIuOTBFMCwyLjc4RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1NJWkUzLygwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDEuMTdFMCwxLjE3RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMTdFMCwxLjE3RTApLCAoMS4xN0UwLDEuMTdFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4xN0UwLDEuMTdFMCksICgxLjE3RTAsMS4xN0UwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjE3RTAsMS4xN0UwKSwgKDEuMTdFMCwxLjE3RTApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1NJWkUyLygwLjBFMCwwLjBFMCksICgwLjBFMCwwLjBFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLCAoMC4wRTAsMC4wRTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEUwLDAuMEUwKSwgKDAuMEUwLDAuMEUwKSwgKDEuNTRFMCwxLjU0RTApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuNTRFMCwxLjU0RTApLCAoMS41NEUwLDEuNTRFMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS41NEUwLDEuNTRFMCksICgxLjU0RTAsMS41NEUwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjU0RTAsMS41NEUwKSwgKDEuNTRFMCwxLjU0RTApLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyA2MCBLSSA9IDEsIDQKKyAgICAgICAgIElOQ1ggPSBJTkNYUyhLSSkKKyAgICAgICAgIElOQ1kgPSBJTkNZUyhLSSkKKyAgICAgICAgIE1YID0gQUJTKElOQ1gpCisgICAgICAgICBNWSA9IEFCUyhJTkNZKQorKgorICAgICAgICAgRE8gNDAgS04gPSAxLCA0CisgICAgICAgICAgICBOID0gTlMoS04pCisgICAgICAgICAgICBLU0laRSA9IE1JTigyLEtOKQorICAgICAgICAgICAgTEVOWCA9IExFTlMoS04sTVgpCisgICAgICAgICAgICBMRU5ZID0gTEVOUyhLTixNWSkKKyogICAgICAgICAgIC4uIGluaXRpYWxpemUgYWxsIGFyZ3VtZW50IGFycmF5cyAuLgorICAgICAgICAgICAgRE8gMjAgSSA9IDEsIDcKKyAgICAgICAgICAgICAgIENYKEkpID0gQ1gxKEkpCisgICAgICAgICAgICAgICBDWShJKSA9IENZMShJKQorICAgMjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIElGIChJQ0FTRS5FUS4xKSBUSEVOCisqICAgICAgICAgICAgICAuLiBDRE9UQyAuLgorICAgICAgICAgICAgICAgQ0RPVCgxKSA9IENET1RDKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBDVEVTVCgxLENET1QsQ1Q2KEtOLEtJKSxDU0laRTEoS04pLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4yKSBUSEVOCisqICAgICAgICAgICAgICAuLiBDRE9UVSAuLgorICAgICAgICAgICAgICAgQ0RPVCgxKSA9IENET1RVKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBDVEVTVCgxLENET1QsQ1Q3KEtOLEtJKSxDU0laRTEoS04pLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4zKSBUSEVOCisqICAgICAgICAgICAgICAuLiBDQVhQWSAuLgorICAgICAgICAgICAgICAgQ0FMTCBDQVhQWShOLENBLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWSxDWSxDVDgoMSxLTixLSSksQ1NJWkUyKDEsS1NJWkUpLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS40KSBUSEVOCisqICAgICAgICAgICAgICAuLiBDQ09QWSAuLgorICAgICAgICAgICAgICAgQ0FMTCBDQ09QWShOLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWSxDWSxDVDEwWSgxLEtOLEtJKSxDU0laRTMsMS4wRTApCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS41KSBUSEVOCisqICAgICAgICAgICAgICAuLiBDU1dBUCAuLgorICAgICAgICAgICAgICAgQ0FMTCBDU1dBUChOLENYLElOQ1gsQ1ksSU5DWSkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWCxDWCxDVDEwWCgxLEtOLEtJKSxDU0laRTMsMS4wRTApCisgICAgICAgICAgICAgICBDQUxMIENURVNUKExFTlksQ1ksQ1QxMFkoMSxLTixLSSksQ1NJWkUzLDEuMEUwKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgV1JJVEUgKE5PVVQsKikgJyBTaG91bGRuJyd0IGJlIGhlcmUgaW4gQ0hFQ0syJworICAgICAgICAgICAgICAgU1RPUAorICAgICAgICAgICAgRU5EIElGCisqCisgICA0MCAgICBDT05USU5VRQorICAgNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNURVNUKExFTixTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlIgQ09NUEFSRVMgQVJSQVlTICBTQ09NUCgpIEFORCBTVFJVRSgpIE9GIExFTkdUSCBMRU4gVE8KKyogICAgIFNFRSBJRiBUSEUgVEVSTSBCWSBURVJNIERJRkZFUkVOQ0VTLCBNVUxUSVBMSUVEIEJZIFNGQUMsIEFSRQorKiAgICAgTkVHTElHSUJMRS4KKyoKKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgIFNGQUMKKyAgICAgIElOVEVHRVIgICAgICAgICAgTEVOCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0NPTVAoTEVOKSwgU1NJWkUoTEVOKSwgU1RSVUUoTEVOKQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTRAorICAgICAgSU5URUdFUiAgICAgICAgICBJCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0RJRkYKKyAgICAgIEVYVEVSTkFMICAgICAgICAgU0RJRkYKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgQUJTCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgRE8gNDAgSSA9IDEsIExFTgorICAgICAgICAgU0QgPSBTQ09NUChJKSAtIFNUUlVFKEkpCisgICAgICAgICBJRiAoU0RJRkYoQUJTKFNTSVpFKEkpKStBQlMoU0ZBQypTRCksQUJTKFNTSVpFKEkpKSkuRVEuMC4wRTApCisgICAgICsgICAgICAgR08gVE8gNDAKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgICAgU0NPTVAoSSkgSVMgTk9UIENMT1NFIFRPIFNUUlVFKEkpLgorKgorICAgICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwICAgIFdSSVRFIChOT1VULDk5OTk3KSBJQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgSSwgU0NPTVAoSSksCisgICAgICsgICAgIFNUUlVFKEkpLCBTRCwgU1NJWkUoSSkKKyAgIDQwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKzk5OTk5IEZPUk1BVCAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwnKQorOTk5OTggRk9STUFUICgvJyBDQVNFICBOIElOQ1ggSU5DWSBNT0RFICBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICsgICAgICAgJyBDT01QKEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKEkpICBESUZGRVJFTkNFJywKKyAgICAgKyAgICAgICAnICAgICBTSVpFKEkpJywvMVgpCis5OTk5NyBGT1JNQVQgKDFYLEk0LEkzLDNJNSxJMywyRTM2LjgsMkUxMi40KQorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNURVNUMShTQ09NUDEsU1RSVUUxLFNTSVpFLFNGQUMpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUMSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgVEhJUyBJUyBBTiBJTlRFUkZBQ0UgU1VCUk9VVElORSBUTyBBQ0NPTU9EQVRFIFRIRSBGT1JUUkFOCisqICAgICBSRVFVSVJFTUVOVCBUSEFUIFdIRU4gQSBEVU1NWSBBUkdVTUVOVCBJUyBBTiBBUlJBWSwgVEhFCisqICAgICBBQ1RVQUwgQVJHVU1FTlQgTVVTVCBBTFNPIEJFIEFOIEFSUkFZIE9SIEFOIEFSUkFZIEVMRU1FTlQuCisqCisqICAgICBDLkwuIExBV1NPTiwgSlBMLCAxOTc4IERFQyA2CisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQ09NUDEsIFNGQUMsIFNUUlVFMQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTU0laRSgqKQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQ09NUCgxKSwgU1RSVUUoMSkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBTVEVTVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBTQ09NUCgxKSA9IFNDT01QMQorICAgICAgU1RSVUUoMSkgPSBTVFJVRTEKKyAgICAgIENBTEwgU1RFU1QoMSxTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKgorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFJFQUwgICAgICAgICAgICAgRlVOQ1RJT04gU0RJRkYoU0EsU0IpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0RJRkYgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgIENPTVBVVEVTIERJRkZFUkVOQ0UgT0YgVFdPIE5VTUJFUlMuICBDLiBMLiBMQVdTT04sIEpQTCAxOTc0IEZFQiAxNQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQSwgU0IKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgU0RJRkYgPSBTQSAtIFNCCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDVEVTVChMRU4sQ0NPTVAsQ1RSVUUsQ1NJWkUsU0ZBQykKKyogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ1RFU1QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgIEMuTC4gTEFXU09OLCBKUEwsIDE5NzggREVDIDYKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0ZBQworICAgICAgSU5URUdFUiAgICAgICAgICBMRU4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICBDQ09NUChMRU4pLCBDU0laRShMRU4pLCBDVFJVRShMRU4pCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIEkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTQ09NUCgyMCksIFNTSVpFKDIwKSwgU1RSVUUoMjApCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICBTVEVTVAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICBBSU1BRywgUkVBTAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBETyAyMCBJID0gMSwgTEVOCisgICAgICAgICBTQ09NUCgyKkktMSkgPSBSRUFMKENDT01QKEkpKQorICAgICAgICAgU0NPTVAoMipJKSA9IEFJTUFHKENDT01QKEkpKQorICAgICAgICAgU1RSVUUoMipJLTEpID0gUkVBTChDVFJVRShJKSkKKyAgICAgICAgIFNUUlVFKDIqSSkgPSBBSU1BRyhDVFJVRShJKSkKKyAgICAgICAgIFNTSVpFKDIqSS0xKSA9IFJFQUwoQ1NJWkUoSSkpCisgICAgICAgICBTU0laRSgyKkkpID0gQUlNQUcoQ1NJWkUoSSkpCisgICAyMCBDT05USU5VRQorKgorICAgICAgQ0FMTCBTVEVTVCgyKkxFTixTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgSVRFU1QxKElDT01QLElUUlVFKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElURVNUMSAqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlJPVVRJTkUgQ09NUEFSRVMgVEhFIFZBUklBQkxFUyBJQ09NUCBBTkQgSVRSVUUgRk9SCisqICAgICBFUVVBTElUWS4KKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDT01QLCBJVFJVRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJRAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiAoSUNPTVAuRVEuSVRSVUUpIEdPIFRPIDQwCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgSUNPTVAgSVMgTk9UIEVRVUFMIFRPIElUUlVFLgorKgorICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwIElEID0gSUNPTVAgLSBJVFJVRQorICAgICAgV1JJVEUgKE5PVVQsOTk5OTcpIElDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBJQ09NUCwgSVRSVUUsIElECisgICA0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCis5OTk5OSBGT1JNQVQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMJykKKzk5OTk4IEZPUk1BVCAoLycgQ0FTRSAgTiBJTkNYIElOQ1kgTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLAorICAgICArICAgICAgICcgQ09NUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSAgICAgRElGRkVSRU5DRScsCisgICAgICsgICAgICAgLzFYKQorOTk5OTcgRk9STUFUICgxWCxJNCxJMywzSTUsMkkzNixJMTIpCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9jYmxhdDIuZGF0IGIvYmxhcy90ZXN0aW5nL2NibGF0Mi5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5ODczMAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9jYmxhdDIuZGF0CkBAIC0wLDAgKzEsMzUgQEAKKydjYmxhdDIuc3VtbScgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisnY2JsYXQyLnNuYXAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCistMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KK1QgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKzYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKzQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSworMCAxIDIgNCAgICAgICAgICAgVkFMVUVTIE9GIEsKKzQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorMSAyIC0xIC0yICAgICAgICAgVkFMVUVTIE9GIElOQ1ggQU5EIElOQ1kKKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKygwLjAsMC4wKSAoMS4wLDAuMCkgKDAuNywtMC45KSAgICAgICBWQUxVRVMgT0YgQUxQSEEKKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorKDAuMCwwLjApICgxLjAsMC4wKSAoMS4zLC0xLjEpICAgICAgIFZBTFVFUyBPRiBCRVRBCitDR0VNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ0dCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NIRU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDSEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ0hQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NUUk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDVEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ1RQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NUUlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDVEJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ1RQU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NHRVJDICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDR0VSVSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ0hFUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NIUFIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDSEVSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ0hQUjIgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9jYmxhdDIuZiBiL2JsYXMvdGVzdGluZy9jYmxhdDIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGYxODgxCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL2NibGF0Mi5mCkBAIC0wLDAgKzEsMzI0MSBAQAorICAgICAgUFJPR1JBTSBDQkxBVDIKKyoKKyogIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIENPTVBMRVggICAgICAgICAgTGV2ZWwgMiBCbGFzLgorKgorKiAgVGhlIHByb2dyYW0gbXVzdCBiZSBkcml2ZW4gYnkgYSBzaG9ydCBkYXRhIGZpbGUuIFRoZSBmaXJzdCAxOCByZWNvcmRzCisqICBvZiB0aGUgZmlsZSBhcmUgcmVhZCB1c2luZyBsaXN0LWRpcmVjdGVkIGlucHV0LCB0aGUgbGFzdCAxNyByZWNvcmRzCisqICBhcmUgcmVhZCB1c2luZyB0aGUgZm9ybWF0ICggQTYsIEwyICkuIEFuIGFubm90YXRlZCBleGFtcGxlIG9mIGEgZGF0YQorKiAgZmlsZSBjYW4gYmUgb2J0YWluZWQgYnkgZGVsZXRpbmcgdGhlIGZpcnN0IDMgY2hhcmFjdGVycyBmcm9tIHRoZQorKiAgZm9sbG93aW5nIDM1IGxpbmVzOgorKiAgJ0NCTEFUMi5TVU1NJyAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCisqICA2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKyogICdDQkxBMlQuU05BUCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKyogIC0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKKyogIEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KKyogIEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorKiAgVCAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisqICAxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworKiAgNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCisqICAwIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorKiAgNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBLCisqICAwIDEgMiA0ICAgICAgICAgICBWQUxVRVMgT0YgSworKiAgNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisqICAxIDIgLTEgLTIgICAgICAgICBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorKiAgMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorKiAgKDAuMCwwLjApICgxLjAsMC4wKSAoMC43LC0wLjkpICAgICAgIFZBTFVFUyBPRiBBTFBIQQorKiAgMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCisqICAoMC4wLDAuMCkgKDEuMCwwLjApICgxLjMsLTEuMSkgICAgICAgVkFMVUVTIE9GIEJFVEEKKyogIENHRU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBDR0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgQ0hFTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIENIQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBDSFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgQ1RSTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIENUQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBDVFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgQ1RSU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIENUQlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBDVFBTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgQ0dFUkMgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIENHRVJVICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBDSEVSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgQ0hQUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIENIRVIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBDSFBSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKgorKiAgICAgU2VlOgorKgorKiAgICAgICAgRG9uZ2FycmEgSi4gSi4sIER1IENyb3ogSi4gSi4sIEhhbW1hcmxpbmcgUy4gIGFuZCBIYW5zb24gUi4gSi4uCisqICAgICAgICBBbiAgZXh0ZW5kZWQgIHNldCBvZiBGb3J0cmFuICBCYXNpYyBMaW5lYXIgQWxnZWJyYSBTdWJwcm9ncmFtcy4KKyoKKyogICAgICAgIFRlY2huaWNhbCAgTWVtb3JhbmRhICBOb3MuIDQxIChyZXZpc2lvbiAzKSBhbmQgODEsICBNYXRoZW1hdGljcworKiAgICAgICAgYW5kICBDb21wdXRlciBTY2llbmNlICBEaXZpc2lvbiwgIEFyZ29ubmUgIE5hdGlvbmFsIExhYm9yYXRvcnksCisqICAgICAgICA5NzAwIFNvdXRoIENhc3MgQXZlbnVlLCBBcmdvbm5lLCBJbGxpbm9pcyA2MDQzOSwgVVMuCisqCisqICAgICAgICBPcgorKgorKiAgICAgICAgTkFHICBUZWNobmljYWwgUmVwb3J0cyBUUjMvODcgYW5kIFRSNC84NywgIE51bWVyaWNhbCBBbGdvcml0aG1zCisqICAgICAgICBHcm91cCAgTHRkLiwgIE5BRyAgQ2VudHJhbCAgT2ZmaWNlLCAgMjU2ICBCYW5idXJ5ICBSb2FkLCBPeGZvcmQKKyogICAgICAgIE9YMiA3REUsIFVLLCAgYW5kICBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBJbmMuLCAgMTEwMSAgMzFzdAorKiAgICAgICAgU3RyZWV0LCAgU3VpdGUgMTAwLCAgRG93bmVycyBHcm92ZSwgIElsbGlub2lzIDYwNTE1LTEyNjMsICBVU0EuCisqCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU4KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JTiA9IDUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5TVUJTCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOU1VCUyA9IDE3ICkKKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICksIE9ORSA9ICggMS4wLCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8sIFJIQUxGLCBST05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMCwgUkhBTEYgPSAwLjUsIFJPTkUgPSAxLjAgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5NQVgsIElOQ01BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTk1BWCA9IDY1LCBJTkNNQVggPSAyICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU5NQVgsIE5JRE1BWCwgTktCTUFYLCBOQUxNQVgsIE5CRU1BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOTUFYID0gNywgTklETUFYID0gOSwgTktCTUFYID0gNywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQUxNQVggPSA3LCBOQkVNQVggPSA3ICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIEVSUiwgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSVNOVU0sIEosIE4sIE5BTEYsIE5CRVQsIE5JRElNLCBOSU5DLCBOS0IsCisgICAgICQgICAgICAgICAgICAgICAgICAgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBMVEVTVFQsIFJFV0ksIFNBTUUsIFNGQVRBTCwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICAgVFNURVJSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVQKKyAgICAgIENIQVJBQ1RFUiozMiAgICAgICBTTkFQUywgU1VNTVJZCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBTEYoIE5BTE1BWCApLCBBUyggTk1BWCpOTUFYICksIEJFVCggTkJFTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCAyKk5NQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRE1BWCApLCBJTkMoIE5JTk1BWCApLCBLQiggTktCTUFYICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMVEVTVCggTlNVQlMgKQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FUyggTlNVQlMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgU0RJRkYKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMQ0UKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTRElGRiwgTENFCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENDSEsxLCBDQ0hLMiwgQ0NISzMsIENDSEs0LCBDQ0hLNSwgQ0NISzYsCisgICAgICQgICAgICAgICAgICAgICAgICAgQ0NIS0UsIENNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIFNOQU1FUy8nQ0dFTVYgJywgJ0NHQk1WICcsICdDSEVNViAnLCAnQ0hCTVYgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnQ0hQTVYgJywgJ0NUUk1WICcsICdDVEJNViAnLCAnQ1RQTVYgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnQ1RSU1YgJywgJ0NUQlNWICcsICdDVFBTViAnLCAnQ0dFUkMgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnQ0dFUlUgJywgJ0NIRVIgICcsICdDSFBSICAnLCAnQ0hFUjIgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnQ0hQUjIgJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc3VtbWFyeSBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTVU1NUlkKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTk9VVAorICAgICAgT1BFTiggTk9VVCwgRklMRSA9IFNVTU1SWSwgU1RBVFVTID0gJ05FVycgKQorICAgICAgTk9VVEMgPSBOT1VUCisqCisqICAgICBSZWFkIG5hbWUgYW5kIHVuaXQgbnVtYmVyIGZvciBzbmFwc2hvdCBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTTkFQUworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOVFJBCisgICAgICBUUkFDRSA9IE5UUkEuR0UuMAorICAgICAgSUYoIFRSQUNFIClUSEVOCisgICAgICAgICBPUEVOKCBOVFJBLCBGSUxFID0gU05BUFMsIFNUQVRVUyA9ICdORVcnICkKKyAgICAgIEVORCBJRgorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgcmV3aW5kaW5nIG9mIHRoZSBzbmFwc2hvdCBmaWxlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClSRVdJCisgICAgICBSRVdJID0gUkVXSS5BTkQuVFJBQ0UKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHN0b3BwaW5nIG9uIGFueSBmYWlsdXJlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTRkFUQUwKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBlcnJvciBleGl0cyBhcmUgdG8gYmUgdGVzdGVkLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUU1RFUlIKKyogICAgIFJlYWQgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiB0aGUgdGVzdCByYXRpbworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUSFJFU0gKKyoKKyogICAgIFJlYWQgYW5kIGNoZWNrIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgdGVzdHMuCisqCisqICAgICBWYWx1ZXMgb2YgTgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOSURJTQorICAgICAgSUYoIE5JRElNLkxULjEuT1IuTklESU0uR1QuTklETUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ04nLCBOSURNQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgRE8gMTAgSSA9IDEsIE5JRElNCisgICAgICAgICBJRiggSURJTSggSSApLkxULjAuT1IuSURJTSggSSApLkdULk5NQVggKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClOTUFYCisgICAgICAgICAgICBHTyBUTyAyMzAKKyAgICAgICAgIEVORCBJRgorICAgMTAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBLCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5LQgorICAgICAgSUYoIE5LQi5MVC4xLk9SLk5LQi5HVC5OS0JNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknSycsIE5LQk1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIERPIDIwIEkgPSAxLCBOS0IKKyAgICAgICAgIElGKCBLQiggSSApLkxULjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1ICkKKyAgICAgICAgICAgIEdPIFRPIDIzMAorICAgICAgICAgRU5EIElGCisgICAyMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIElOQ1ggYW5kIElOQ1kKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklOQworICAgICAgSUYoIE5JTkMuTFQuMS5PUi5OSU5DLkdULk5JTk1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdJTkNYIEFORCBJTkNZJywgTklOTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBETyAzMCBJID0gMSwgTklOQworICAgICAgICAgSUYoIElOQyggSSApLkVRLjAuT1IuQUJTKCBJTkMoIEkgKSApLkdULklOQ01BWCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKUlOQ01BWAorICAgICAgICAgICAgR08gVE8gMjMwCisgICAgICAgICBFTkQgSUYKKyAgIDMwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MSApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODggKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODAgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyA0MCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICA0MCBDT05USU5VRQorICAgNTAgUkVBRCggTklOLCBGTVQgPSA5OTg0LCBFTkQgPSA4MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDYwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA3MAorICAgNjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg2IClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDcwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDUwCisqCisgICA4MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBST05FCisgICA5MCBDT05USU5VRQorICAgICAgSUYoIFNESUZGKCBST05FICsgRVBTLCBST05FICkuRVEuUlpFUk8gKQorICAgICAkICAgR08gVE8gMTAwCisgICAgICBFUFMgPSBSSEFMRipFUFMKKyAgICAgIEdPIFRPIDkwCisgIDEwMCBDT05USU5VRQorICAgICAgRVBTID0gRVBTICsgRVBTCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApRVBTCisqCisqICAgICBDaGVjayB0aGUgcmVsaWFiaWxpdHkgb2YgQ01WQ0ggdXNpbmcgZXhhY3QgZGF0YS4KKyoKKyAgICAgIE4gPSBNSU4oIDMyLCBOTUFYICkKKyAgICAgIERPIDEyMCBKID0gMSwgTgorICAgICAgICAgRE8gMTEwIEkgPSAxLCBOCisgICAgICAgICAgICBBKCBJLCBKICkgPSBNQVgoIEkgLSBKICsgMSwgMCApCisgIDExMCAgICBDT05USU5VRQorICAgICAgICAgWCggSiApID0gSgorICAgICAgICAgWSggSiApID0gWkVSTworICAxMjAgQ09OVElOVUUKKyAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgWVkoIEogKSA9IEoqKCAoIEogKyAxICkqSiApLzIgLSAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTMwIENPTlRJTlVFCisqICAgICBZWSBob2xkcyB0aGUgZXhhY3QgcmVzdWx0LiBPbiBleGl0IGZyb20gQ01WQ0ggWVQgaG9sZHMKKyogICAgIHRoZSByZXN1bHQgY29tcHV0ZWQgYnkgQ01WQ0guCisgICAgICBUUkFOUyA9ICdOJworICAgICAgQ0FMTCBDTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwgMSwgWkVSTywgWSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExDRSggWVksIFlULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlJaRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApVFJBTlMsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBUUkFOUyA9ICdUJworICAgICAgQ0FMTCBDTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwgLTEsIFpFUk8sIFksIC0xLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgIFlZLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTENFKCBZWSwgWVQsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuUlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg1IClUUkFOUywgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyoKKyogICAgIFRlc3QgZWFjaCBzdWJyb3V0aW5lIGluIHR1cm4uCisqCisgICAgICBETyAyMTAgSVNOVU0gPSAxLCBOU1VCUworICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgSUYoIC5OT1QuTFRFU1QoIElTTlVNICkgKVRIRU4KKyogICAgICAgICAgIFN1YnByb2dyYW0gaXMgbm90IHRvIGJlIHRlc3RlZC4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTgzIClTTkFNRVMoIElTTlVNICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFNSTkFNVCA9IFNOQU1FUyggSVNOVU0gKQorKiAgICAgICAgICAgVGVzdCBlcnJvciBleGl0cy4KKyAgICAgICAgICAgIElGKCBUU1RFUlIgKVRIRU4KKyAgICAgICAgICAgICAgIENBTEwgQ0NIS0UoIElTTlVNLCBTTkFNRVMoIElTTlVNICksIE5PVVQgKQorICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBUZXN0IGNvbXB1dGF0aW9ucy4KKyAgICAgICAgICAgIElORk9UID0gMAorICAgICAgICAgICAgT0sgPSAuVFJVRS4KKyAgICAgICAgICAgIEZBVEFMID0gLkZBTFNFLgorICAgICAgICAgICAgR08gVE8gKCAxNDAsIDE0MCwgMTUwLCAxNTAsIDE1MCwgMTYwLCAxNjAsCisgICAgICQgICAgICAgICAgICAgIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTcwLCAxNzAsIDE4MCwKKyAgICAgJCAgICAgICAgICAgICAgMTgwLCAxOTAsIDE5MCApSVNOVU0KKyogICAgICAgICAgIFRlc3QgQ0dFTVYsIDAxLCBhbmQgQ0dCTVYsIDAyLgorICAxNDAgICAgICAgQ0FMTCBDQ0hLMSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5CRVQsIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRyApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgQ0hFTVYsIDAzLCBDSEJNViwgMDQsIGFuZCBDSFBNViwgMDUuCisgIDE1MCAgICAgICBDQUxMIENDSEsyKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLAorICAgICAkICAgICAgICAgICAgICAgICAgTkJFVCwgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBDVFJNViwgMDYsIENUQk1WLCAwNywgQ1RQTVYsIDA4LAorKiAgICAgICAgICAgQ1RSU1YsIDA5LCBDVEJTViwgMTAsIGFuZCBDVFBTViwgMTEuCisgIDE2MCAgICAgICBDQUxMIENDSEszKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFksIFlZLCBZUywgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IENHRVJDLCAxMiwgQ0dFUlUsIDEzLgorICAxNzAgICAgICAgQ0FMTCBDQ0hLNCggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IENIRVIsIDE0LCBhbmQgQ0hQUiwgMTUuCisgIDE4MCAgICAgICBDQUxMIENDSEs1KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsCisgICAgICQgICAgICAgICAgICAgICAgICBZVCwgRywgWiApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgQ0hFUjIsIDE2LCBhbmQgQ0hQUjIsIDE3LgorICAxOTAgICAgICAgQ0FMTCBDQ0hLNiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorKgorICAyMDAgICAgICAgSUYoIEZBVEFMLkFORC5TRkFUQUwgKQorICAgICAkICAgICAgICAgR08gVE8gMjIwCisgICAgICAgICBFTkQgSUYKKyAgMjEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MiApCisgICAgICBHTyBUTyAyNDAKKyoKKyAgMjIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MSApCisgICAgICBHTyBUTyAyNDAKKyoKKyAgMjMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NyApCisqCisgIDI0MCBDT05USU5VRQorICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgIENMT1NFICggTlRSQSApCisgICAgICBDTE9TRSAoIE5PVVQgKQorICAgICAgU1RPUAorKgorIDk5OTkgRk9STUFUKCAnIFJPVVRJTkVTIFBBU1MgQ09NUFVUQVRJT05BTCBURVNUUyBJRiBURVNUIFJBVElPIElTIExFUycsCisgICAgICQgICAgICAnUyBUSEFOJywgRjguMiApCisgOTk5OCBGT1JNQVQoICcgUkVMQVRJVkUgTUFDSElORSBQUkVDSVNJT04gSVMgVEFLRU4gVE8gQkUnLCAxUCwgRTkuMSApCisgOTk5NyBGT1JNQVQoICcgTlVNQkVSIE9GIFZBTFVFUyBPRiAnLCBBLCAnIElTIExFU1MgVEhBTiAxIE9SIEdSRUFURVIgJywKKyAgICAgJCAgICAgICdUSEFOICcsIEkyICkKKyA5OTk2IEZPUk1BVCggJyBWQUxVRSBPRiBOIElTIExFU1MgVEhBTiAwIE9SIEdSRUFURVIgVEhBTiAnLCBJMiApCisgOTk5NSBGT1JNQVQoICcgVkFMVUUgT0YgSyBJUyBMRVNTIFRIQU4gMCcgKQorIDk5OTQgRk9STUFUKCAnIEFCU09MVVRFIFZBTFVFIE9GIElOQ1ggT1IgSU5DWSBJUyAwIE9SIEdSRUFURVIgVEhBTiAnLAorICAgICAkICAgICAgSTIgKQorIDk5OTMgRk9STUFUKCAnIFRFU1RTIE9GIFRIRSBDT01QTEVYICAgICAgICAgIExFVkVMIDIgQkxBUycsIC8vJyBUSEUgRicsCisgICAgICQgICAgICAnT0xMT1dJTkcgUEFSQU1FVEVSIFZBTFVFUyBXSUxMIEJFIFVTRUQ6JyApCisgOTk5MiBGT1JNQVQoICcgICBGT1IgTiAgICAgICAgICAgICAgJywgOUk2ICkKKyA5OTkxIEZPUk1BVCggJyAgIEZPUiBLICAgICAgICAgICAgICAnLCA3STYgKQorIDk5OTAgRk9STUFUKCAnICAgRk9SIElOQ1ggQU5EIElOQ1kgICcsIDdJNiApCisgOTk4OSBGT1JNQVQoICcgICBGT1IgQUxQSEEgICAgICAgICAgJywKKyAgICAgJCAgICAgIDcoICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSAgJywgOiApICkKKyA5OTg4IEZPUk1BVCggJyAgIEZPUiBCRVRBICAgICAgICAgICAnLAorICAgICAkICAgICAgNyggJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpICAnLCA6ICkgKQorIDk5ODcgRk9STUFUKCAnIEFNRU5EIERBVEEgRklMRSBPUiBJTkNSRUFTRSBBUlJBWSBTSVpFUyBJTiBQUk9HUkFNJywKKyAgICAgJCAgICAgIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg2IEZPUk1BVCggJyBTVUJQUk9HUkFNIE5BTUUgJywgQTYsICcgTk9UIFJFQ09HTklaRUQnLCAvJyAqKioqKioqIFQnLAorICAgICAkICAgICAgJ0VTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg1IEZPUk1BVCggJyBFUlJPUiBJTiBDTVZDSCAtICBJTi1MSU5FIERPVCBQUk9EVUNUUyBBUkUgQkVJTkcgRVZBTFUnLAorICAgICAkICAgICAgJ0FURUQgV1JPTkdMWS4nLCAvJyBDTVZDSCBXQVMgQ0FMTEVEIFdJVEggVFJBTlMgPSAnLCBBMSwKKyAgICAgJCAgICAgICcgQU5EIFJFVFVSTkVEIFNBTUUgPSAnLCBMMSwgJyBBTkQgRVJSID0gJywgRjEyLjMsICcuJywgLworICAgICAkICAgJyBUSElTIE1BWSBCRSBEVUUgVE8gRkFVTFRTIElOIFRIRSBBUklUSE1FVElDIE9SIFRIRSBDT01QSUxFUi4nCisgICAgICQgICAgICAsIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg0IEZPUk1BVCggQTYsIEwyICkKKyA5OTgzIEZPUk1BVCggMVgsIEE2LCAnIFdBUyBOT1QgVEVTVEVEJyApCisgOTk4MiBGT1JNQVQoIC8nIEVORCBPRiBURVNUUycgKQorIDk5ODEgRk9STUFUKCAvJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTgwIEZPUk1BVCggJyBFUlJPUi1FWElUUyBXSUxMIE5PVCBCRSBURVNURUQnICkKKyoKKyogICAgIEVuZCBvZiBDQkxBVDIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzEoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwgTkJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICBYUywgWSwgWVksIFlTLCBZVCwgRyApCisqCisqICBUZXN0cyBDR0VNViBhbmQgQ0dCTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApLCBIQUxGID0gKCAwLjUsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOQkVULCBOSURJTSwgTklOQywgTktCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIFRSQU5TTAorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQywgSUtVLCBJTSwgSU4sIElOQ1gsIElOQ1hTLCBJTkNZLAorICAgICAkICAgICAgICAgICAgICAgICAgIElOQ1lTLCBJWCwgSVksIEtMLCBLTFMsIEtVLCBLVVMsIExBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQVMsIExYLCBMWSwgTSwgTUwsIE1TLCBOLCBOQVJHUywgTkMsIE5ELCBOSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOTCwgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBCQU5ERUQsIEZVTEwsIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMsIFRSQU5TUworICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExDRSwgTENFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTENFLCBMQ0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0dCTVYsIENHRU1WLCBDTUFLRSwgQ01WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWCwgTUlOCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nTlRDJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ0UnCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTEKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSAxMworICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTIwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisgICAgICAgICBORCA9IE4vMiArIDEKKyoKKyAgICAgICAgIERPIDExMCBJTSA9IDEsIDIKKyAgICAgICAgICAgIElGKCBJTS5FUS4xICkKKyAgICAgJCAgICAgICAgIE0gPSBNQVgoIE4gLSBORCwgMCApCisgICAgICAgICAgICBJRiggSU0uRVEuMiApCisgICAgICQgICAgICAgICBNID0gTUlOKCBOICsgTkQsIE5NQVggKQorKgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTksgPSBOS0IKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIE5LID0gMQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxMDAgSUtVID0gMSwgTksKKyAgICAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIEtVID0gS0IoIElLVSApCisgICAgICAgICAgICAgICAgICBLTCA9IE1BWCggS1UgLSAxLCAwICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEtVID0gTiAtIDEKKyAgICAgICAgICAgICAgICAgIEtMID0gTSAtIDEKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICBMREEgPSBLTCArIEtVICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTERBID0gTQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgQ01BS0UoIFNOQU1FKCAyOiAzICksICcgJywgJyAnLCBNLCBOLCBBLCBOTUFYLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIExEQSwgS0wsIEtVLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgIERPIDkwIElDID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnLk9SLlRSQU5TLkVRLidDJworKgorICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIE1MID0gTgorICAgICAgICAgICAgICAgICAgICAgTkwgPSBNCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBNTCA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5MID0gTgorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTkwKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOTCwgWCwgMSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1ggKSwgMCwgTkwgLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgICAgIElGKCBOTC5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBYKCBOTC8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTkwvMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBETyA3MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTUwKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE1MLCBZLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEFCUyggSU5DWSApLCAwLCBNTCAtIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0xTID0gS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtVUyA9IEtVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDR0VNViggVFJBTlMsIE0sIE4sIEFMUEhBLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1gsIEJFVEEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEtMLCBLVSwgQUxQSEEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENHQk1WKCBUUkFOUywgTSwgTiwgS0wsIEtVLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIFhYLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTENFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMQ0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTENFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTENFUkVTKCAnR0UnLCAnICcsIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MLCBZUywgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLTFMuRVEuS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLVVMuRVEuS1UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExDRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExDRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExDRVJFUyggJ0dFJywgJyAnLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTCwgWVMsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMyApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTVZDSCggVFJBTlMsIE0sIE4sIEFMUEhBLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgWCwgSU5DWCwgQkVUQSwgWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ksIFlULCBHLCBZWSwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBNLmxlLjAgb3IKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICBDT05USU5VRQorKgorICAxMjAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE0MAorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFRSQU5TLCBNLCBOLCBBTFBIQSwgTERBLAorICAgICAkICAgICAgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBUUkFOUywgTSwgTiwgS0wsIEtVLAorICAgICAkICAgICAgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDE0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDQoIEkzLCAnLCcgKSwgJygnLAorICAgICAkICAgICAgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgWCwnLCBJMiwgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFksJywgSTIsICcpIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgMiggSTMsICcsJyApLCAnKCcsCisgICAgICQgICAgICBGNC4xLCAnLCcsIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCgnLCBGNC4xLCAnLCcsCisgICAgICQgICAgICBGNC4xLCAnKSwgWSwnLCBJMiwgJykgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLMS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDQ0hLMiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLCBOQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyoKKyogIFRlc3RzIENIRU1WLCBDSEJNViBhbmQgQ0hQTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApLCBIQUxGID0gKCAwLjUsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOQkVULCBOSURJTSwgTklOQywgTktCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIFRSQU5TTAorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQywgSUssIElOLCBJTkNYLCBJTkNYUywgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJTkNZUywgSVgsIElZLCBLLCBLUywgTEFBLCBMREEsIExEQVMsIExYLCBMWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOLCBOQVJHUywgTkMsIE5LLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEJBTkRFRCwgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTENFLCBMQ0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMQ0UsIExDRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEJNViwgQ0hFTVYsIENIUE1WLCBDTUFLRSwgQ01WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ0UnCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDEwCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTEKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMTAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyoKKyAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgRE8gMTAwIElLID0gMSwgTksKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIEsgPSBLQiggSUsgKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSyA9IE4gLSAxCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTERBID0gSyArIDEKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExEQSA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElDID0gMSwgMgorICAgICAgICAgICAgICAgVVBMTyA9IElDSCggSUM6IElDICkKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgQ01BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwgTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gNzAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk4KKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgTiwgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0hFTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgTERBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBLLCBBTFBIQSwgTERBLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0hCTVYoIFVQTE8sIE4sIEssIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBBTFBIQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0hQTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgWFgsIElOQ1gsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBLCBZWSwgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExDRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTENFUkVTKCAnR0UnLCAnICcsIDEsIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVMsIFlZLCBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTENFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExDRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExDRVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUywgWVksIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMQ0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMQ0UoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExDRVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTLCBZWSwgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTVZDSCggJ04nLCBOLCBOLCBBTFBIQSwgQSwgTk1BWCwgWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFksIElOQ1ksIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTi5sZS4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBMREEsIElOQ1gsCisgICAgICQgICAgICBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIEssIEFMUEhBLCBMREEsCisgICAgICQgICAgICBJTkNYLCBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLAorICAgICAkICAgICAgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCgnLCBGNC4xLCAnLCcsCisgICAgICQgICAgICBGNC4xLCAnKSwgQVAsIFgsJywgSTIsICcsKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIFksJywgSTIsCisgICAgICQgICAgICAnKSAgICAgICAgICAgICAgICAuJyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDIoIEkzLCAnLCcgKSwgJygnLAorICAgICAkICAgICAgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgWCwnLCBJMiwgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFksJywgSTIsICcpICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIEEsJywgSTMsICcsIFgsJywgSTIsICcsKCcsIEY0LjEsICcsJywgRjQuMSwgJyksICcsCisgICAgICQgICAgICAnWSwnLCBJMiwgJykgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzMoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFhULCBHLCBaICkKKyoKKyogIFRlc3RzIENUUk1WLCBDVEJNViwgQ1RQTVYsIENUUlNWLCBDVEJTViBhbmQgQ1RQU1YuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICksIEhBTEYgPSAoIDAuNSwgMC4wICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjAsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOSURJTSwgTklOQywgTktCLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYVCggTk1BWCApLCBYWCggTk1BWCpJTkNNQVggKSwgWiggTk1BWCApCisgICAgICBSRUFMICAgICAgICAgICAgICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICksIEtCKCBOS0IgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFRSQU5TTAorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUNELCBJQ1QsIElDVSwgSUssIElOLCBJTkNYLCBJTkNYUywgSVgsIEssCisgICAgICQgICAgICAgICAgICAgICAgICAgS1MsIExBQSwgTERBLCBMREFTLCBMWCwgTiwgTkFSR1MsIE5DLCBOSywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBCQU5ERUQsIEZVTEwsIE5VTEwsIFBBQ0tFRCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBESUFHUywgVFJBTlMsIFRSQU5TUywgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hELCBJQ0hVCisgICAgICBDSEFSQUNURVIqMyAgICAgICAgSUNIVAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExDRSwgTENFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTENFLCBMQ0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ01BS0UsIENNVkNILCBDVEJNViwgQ1RCU1YsIENUUE1WLCBDVFBTViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDVFJNViwgQ1RSU1YKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hVLydVTCcvLCBJQ0hULydOVEMnLywgSUNIRC8nVU4nLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nUicKKyAgICAgIEJBTkRFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ0InCisgICAgICBQQUNLRUQgPSBTTkFNRSggMzogMyApLkVRLidQJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOAorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDkKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA3CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqICAgICBTZXQgdXAgemVybyB2ZWN0b3IgZm9yIENNVkNILgorICAgICAgRE8gMTAgSSA9IDEsIE5NQVgKKyAgICAgICAgIFooIEkgKSA9IFpFUk8KKyAgIDEwIENPTlRJTlVFCisqCisgICAgICBETyAxMTAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyoKKyAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgRE8gMTAwIElLID0gMSwgTksKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIEsgPSBLQiggSUsgKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSyA9IE4gLSAxCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTERBID0gSyArIDEKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExEQSA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisqCisgICAgICAgICAgICAgICBETyA4MCBJQ1QgPSAxLCAzCisgICAgICAgICAgICAgICAgICBUUkFOUyA9IElDSFQoIElDVDogSUNUICkKKyoKKyAgICAgICAgICAgICAgICAgIERPIDcwIElDRCA9IDEsIDIKKyAgICAgICAgICAgICAgICAgICAgIERJQUcgPSBJQ0hEKCBJQ0Q6IElDRCApCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCBESUFHLCBOLCBOLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQUEsIExEQSwgSywgSywgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA2MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNYICksIDAsIE4gLSAxLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBESUFHUyA9IERJQUcKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggU05BTUUoIDQ6IDUgKS5FUS4nTVYnIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDVFJNViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ1RCTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDVFBNViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTTkFNRSggNDogNSApLkVRLidTVicgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBMREEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENUUlNWKCBVUExPLCBUUkFOUywgRElBRywgTiwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgSywgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDVEJTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENUUFNWKCBVUExPLCBUUkFOUywgRElBRywgTiwgQUEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOUy5FUS5UUkFOU1MKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBESUFHLkVRLkRJQUdTCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMQ0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExDRVJFUyggJ0dFJywgJyAnLCAxLCBOLCBYUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExDRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTENFUkVTKCAnR0UnLCAnICcsIDEsIE4sIFhTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBBQlMoIElOQ1ggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTENFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMQ0VSRVMoICdHRScsICcgJywgMSwgTiwgWFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01WJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01WQ0goIFRSQU5TLCBOLCBOLCBPTkUsIEEsIE5NQVgsIFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBaRVJPLCBaLCBJTkNYLCBYVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU1YnIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIGFwcHJveGltYXRpb24gdG8gb3JpZ2luYWwgdmVjdG9yLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFhYKCAxICsgKCBJIC0gMSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNYICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBYKCBJICkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBaLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCwgWkVSTywgWCwgSU5DWCwgWFQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZBTFNFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA2MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgQ09OVElOVUUKKyoKKyAgMTEwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgRElBRywgTiwgTERBLAorICAgICAkICAgICAgSU5DWAorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgRElBRywgTiwgSywKKyAgICAgJCAgICAgIExEQSwgSU5DWAorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgRElBRywgTiwgSU5DWAorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMyggJycnJywgQTEsICcnJywnICksIEkzLCAnLCBBUCwgJywKKyAgICAgJCAgICAgICdYLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDMoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnIEEsJywgSTMsICcsIFgsJywgSTIsICcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAzKCAnJycnLCBBMSwgJycnLCcgKSwgSTMsICcsIEEsJywKKyAgICAgJCAgICAgIEkzLCAnLCBYLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzMuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzQoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgQ0dFUkMgYW5kIENHRVJVLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTywgSEFMRiwgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApLCBIQUxGID0gKCAwLjUsIDAuMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wLCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTklESU0sIE5JTkMsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFMUEhBLCBBTFMsIFRSQU5TTAorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElNLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksIElOQ1lTLCBJWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJWSwgSiwgTEFBLCBMREEsIExEQVMsIExYLCBMWSwgTSwgTVMsIE4sIE5BUkdTLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5DLCBORCwgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBDT05KLCBOVUxMLCBSRVNFVCwgU0FNRQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgVyggMSApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExDRSwgTENFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTENFLCBMQ0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0dFUkMsIENHRVJVLCBDTUFLRSwgQ01WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIENPTkpHLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIENPTkogPSBTTkFNRSggNTogNSApLkVRLidDJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgTkFSR1MgPSA5CisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTIwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisgICAgICAgICBORCA9IE4vMiArIDEKKyoKKyAgICAgICAgIERPIDExMCBJTSA9IDEsIDIKKyAgICAgICAgICAgIElGKCBJTS5FUS4xICkKKyAgICAgJCAgICAgICAgIE0gPSBNQVgoIE4gLSBORCwgMCApCisgICAgICAgICAgICBJRiggSU0uRVEuMiApCisgICAgICQgICAgICAgICBNID0gTUlOKCBOICsgTkQsIE5NQVggKQorKgorKiAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREEgPSBNCisgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDEwMCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTQorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE0sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE0gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBNLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE0vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE0vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyA5MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTgorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFkoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgWVkoIDEgKyBBQlMoIElOQ1kgKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA4MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCBTTkFNRSggMjogMyApLCAnICcsICcgJywgTSwgTiwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIE0gLSAxLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIE0sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWSwgTERBCisgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0dFUkMoIE0sIE4sIEFMUEhBLCBYWCwgSU5DWCwgWVksIElOQ1ksIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENHRVJVKCBNLCBOLCBBTFBIQSwgWFgsIElOQ1gsIFlZLCBJTkNZLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTENFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTENFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExDRVJFUyggJ0dFJywgJyAnLCBNLCBOLCBBUywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisqCisqICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNYLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBJICkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggTSAtIEkgKyAxICkKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWS5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBZKCBKICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IFkoIE4gLSBKICsgMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IENPTkpHKCBXKCAxICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTVZDSCggJ04nLCBNLCAxLCBBTFBIQSwgWiwgTk1BWCwgVywgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQSggMSwgSiApLCAxLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBKCAxICsgKCBKIC0gMSApKkxEQSApLCBFUFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgNzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE0ubGUuMCBvciBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgQ09OVElOVUUKKyoKKyAgMTIwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNTAKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxNDAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgTSwgTiwgQUxQSEEsIElOQ1gsIElOQ1ksIExEQQorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoIEkzLCAnLCcgKSwgJygnLCBGNC4xLCAnLCcsIEY0LjEsCisgICAgICQgICAgICAnKSwgWCwnLCBJMiwgJywgWSwnLCBJMiwgJywgQSwnLCBJMywgJykgICAgICAgICAgICAgICAgICAgJywKKyAgICAgJCAgICAgICcgICAgICAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLNC4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDQ0hLNSggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgWiApCisqCisqICBUZXN0cyBDSEVSIGFuZCBDSFBSLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTywgSEFMRiwgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApLCBIQUxGID0gKCAwLjUsIDAuMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wLCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTklESU0sIE5JTkMsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFMUEhBLCBUUkFOU0wKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlIsIEVSUk1BWCwgUkFMUEhBLCBSQUxTCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElDLCBJTiwgSU5DWCwgSU5DWFMsIElYLCBKLCBKQSwgSkosIExBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREEsIExEQVMsIExKLCBMWCwgTiwgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZVTEwsIE5VTEwsIFBBQ0tFRCwgUkVTRVQsIFNBTUUsIFVQUEVSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFcoIDEgKQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMQ0UsIExDRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExDRSwgTENFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENIRVIsIENIUFIsIENNQUtFLCBDTVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgQ01QTFgsIENPTkpHLCBNQVgsIFJFQUwKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidFJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDcKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA2CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMDAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERBID0gTgorICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDEwMAorICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgIERPIDkwIElDID0gMSwgMgorICAgICAgICAgICAgVVBMTyA9IElDSCggSUM6IElDICkKKyAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgIERPIDgwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpOCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWCwgMSwgWFgsIEFCUyggSU5DWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDcwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgUkFMUEhBID0gUkVBTCggQUxGKCBJQSApICkKKyAgICAgICAgICAgICAgICAgIEFMUEhBID0gQ01QTFgoIFJBTFBIQSwgUlpFUk8gKQorICAgICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5SQUxQSEEuRVEuUlpFUk8KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIE4gLSAxLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICBSQUxTID0gUkFMUEhBCisgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDIwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyoKKyogICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBSQUxQSEEsIElOQ1gsIExEQQorICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0hFUiggVVBMTywgTiwgUkFMUEhBLCBYWCwgSU5DWCwgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgUkFMUEhBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDSFBSKCBVUExPLCBOLCBSQUxQSEEsIFhYLCBJTkNYLCBBQSApCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IFJBTFMuRVEuUkFMUEhBCisgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTENFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRVJFUyggU05BTUUoIDI6IDMgKSwgVVBMTywgTiwgTiwgQVMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgMzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1guR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFgoIEkgKQorICAgNDAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBOIC0gSSArIDEgKQorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgSkEgPSAxCisgICAgICAgICAgICAgICAgICAgICBETyA2MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gQ09OSkcoIFooIEogKSApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01WQ0goICdOJywgTEosIDEsIEFMUEhBLCBaKCBKSiApLCBMSiwgVywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE9ORSwgQSggSkosIEogKSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSggSkEgKSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMSgorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICA2MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIGlmIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBOLkxFLjAgKQorICAgICAkICAgICAgICAgICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIFJBTFBIQSwgSU5DWCwgTERBCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIFJBTFBIQSwgSU5DWAorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBBUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgWCwnLAorICAgICAkICAgICAgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MiBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLNS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDQ0hLNiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgWiApCisqCisqICBUZXN0cyBDSEVSMiBhbmQgQ0hQUjIuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICksIEhBTEYgPSAoIDAuNSwgMC4wICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjAsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOSURJTSwgTklOQywgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBYKCBOTUFYICksIFhTKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhYKCBOTUFYKklOQ01BWCApLCBZKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICksIFooIE5NQVgsIDIgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUxQSEEsIEFMUywgVFJBTlNMCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUMsIElOLCBJTkNYLCBJTkNYUywgSU5DWSwgSU5DWVMsIElYLAorICAgICAkICAgICAgICAgICAgICAgICAgIElZLCBKLCBKQSwgSkosIExBQSwgTERBLCBMREFTLCBMSiwgTFgsIExZLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBXKCAyICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTENFLCBMQ0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMQ0UsIExDRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEVSMiwgQ0hQUjIsIENNQUtFLCBDTVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgQ09OSkcsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ0UnCisgICAgICBQQUNLRUQgPSBTTkFNRSggMzogMyApLkVRLidQJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDgKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gUlpFUk8KKyoKKyAgICAgIERPIDE0MCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICBMREEgPSBOCisgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgR08gVE8gMTQwCisgICAgICAgICBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICBMQUEgPSAoIE4qKCBOICsgMSApICkvMgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgRE8gMTMwIElDID0gMSwgMgorICAgICAgICAgICAgVVBMTyA9IElDSCggSUM6IElDICkKKyAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgIERPIDEyMCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyAxMTAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk4KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWS4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBZLCAxLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApLCAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBZKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIFlZKCAxICsgQUJTKCBJTkNZICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gMTAwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuQUxQSEEuRVEuWkVSTworKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgJyAnLCBOLCBOLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQUEsIExEQSwgTiAtIDEsIE4gLSAxLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIElOQ1gsIElOQ1ksIExEQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0hFUjIoIFVQTE8sIE4sIEFMUEhBLCBYWCwgSU5DWCwgWVksIElOQ1ksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0hQUjIoIFVQTE8sIE4sIEFMUEhBLCBYWCwgSU5DWCwgWVksIElOQ1ksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNjAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IExDRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMQ0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMQ0VSRVMoIFNOQU1FKCAyOiAzICksIFVQTE8sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMsIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5QQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTYwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNYLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAxICkgPSBYKCBJICkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSwgMSApID0gWCggTiAtIEkgKyAxICkKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNZLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAyICkgPSBZKCBJICkKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA4MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSwgMiApID0gWSggTiAtIEkgKyAxICkKKyAgIDgwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IEFMUEhBKkNPTkpHKCBaKCBKLCAyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMiApID0gQ09OSkcoIEFMUEhBICkqQ09OSkcoIFooIEosIDEgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01WQ0goICdOJywgTEosIDIsIE9ORSwgWiggSkosIDEgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIFcsIDEsIE9ORSwgQSggSkosIEogKSwgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlULCBHLCBBQSggSkEgKSwgRVBTLCBFUlIsIEZBVEFMLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICA5MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTi5sZS4wLgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE4uTEUuMCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAxMDAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEyMCAgICAgICBDT05USU5VRQorKgorICAxMzAgICAgQ09OVElOVUUKKyoKKyAgMTQwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNzAKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxNjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLAorICAgICAkICAgICAgSU5DWSwgTERBCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLCBJTkNZCisgICAgICBFTkQgSUYKKyoKKyAgMTcwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsKCcsIEY0LjEsICcsJywKKyAgICAgJCAgICAgIEY0LjEsICcpLCBYLCcsIEkyLCAnLCBZLCcsIEkyLCAnLCBBUCkgICAgICAgICAgICAgICAgICAgICAnLAorICAgICAkICAgICAgJyAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCgnLCBGNC4xLCAnLCcsCisgICAgICQgICAgICBGNC4xLCAnKSwgWCwnLCBJMiwgJywgWSwnLCBJMiwgJywgQSwnLCBJMywgJykgICAgICAgICAgICAgJywKKyAgICAgJCAgICAgICcgICAgICAgICAgICAuJyApCisgOTk5MiBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLNi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDQ0hLRSggSVNOVU0sIFNSTkFNVCwgTk9VVCApCisqCisqICBUZXN0cyB0aGUgZXJyb3IgZXhpdHMgZnJvbSB0aGUgTGV2ZWwgMiBCbGFzLgorKiAgUmVxdWlyZXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIGVycm9yLWhhbmRsaW5nIHJvdXRpbmUgWEVSQkxBLgorKiAgQUxQSEEsIFJBTFBIQSwgQkVUQSwgQSwgWCBhbmQgWSBzaG91bGQgbm90IG5lZWQgdG8gYmUgZGVmaW5lZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElTTlVNLCBOT1VUCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUxQSEEsIEJFVEEKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSQUxQSEEKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEEoIDEsIDEgKSwgWCggMSApLCBZKCAxICkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0dCTVYsIENHRU1WLCBDR0VSQywgQ0dFUlUsIENIQk1WLCBDSEVNViwgQ0hFUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDSEVSMiwgQ0hLWEVSLCBDSFBNViwgQ0hQUiwgQ0hQUjIsIENUQk1WLAorICAgICAkICAgICAgICAgICAgICAgICAgIENUQlNWLCBDVFBNViwgQ1RQU1YsIENUUk1WLCBDVFJTVgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyogICAgIE9LIGlzIHNldCB0byAuRkFMU0UuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIG9yIGJ5IENIS1hFUgorKiAgICAgaWYgYW55dGhpbmcgaXMgd3JvbmcuCisgICAgICBPSyA9IC5UUlVFLgorKiAgICAgTEVSUiBpcyBzZXQgdG8gLlRSVUUuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIGVhY2ggdGltZQorKiAgICAgaXQgaXMgY2FsbGVkLCBhbmQgaXMgdGhlbiB0ZXN0ZWQgYW5kIHJlLXNldCBieSBDSEtYRVIuCisgICAgICBMRVJSID0gLkZBTFNFLgorICAgICAgR08gVE8gKCAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsCisgICAgICQgICAgICAgIDkwLCAxMDAsIDExMCwgMTIwLCAxMzAsIDE0MCwgMTUwLCAxNjAsCisgICAgICQgICAgICAgIDE3MCApSVNOVU0KKyAgIDEwIElORk9UID0gMQorICAgICAgQ0FMTCBDR0VNViggJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENHRU1WKCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENHRU1WKCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENHRU1WKCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgQ0dFTVYoICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ0dFTVYoICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgMjAgSU5GT1QgPSAxCisgICAgICBDQUxMIENHQk1WKCAnLycsIDAsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0dCTVYoICdOJywgLTEsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0dCTVYoICdOJywgMCwgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0dCTVYoICdOJywgMCwgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0dCTVYoICdOJywgMiwgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgQ0dCTVYoICdOJywgMCwgMCwgMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0dCTVYoICdOJywgMCwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgQ0dCTVYoICdOJywgMCwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgMzAgSU5GT1QgPSAxCisgICAgICBDQUxMIENIRU1WKCAnLycsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0hFTVYoICdVJywgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0hFTVYoICdVJywgMiwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDSEVNViggJ1UnLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDSEVNViggJ1UnLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICA0MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0hCTVYoICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDSEJNViggJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEJNViggJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDSEJNViggJ1UnLCAwLCAxLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENIQk1WKCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIENIQk1WKCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgIDUwIElORk9UID0gMQorICAgICAgQ0FMTCBDSFBNViggJy8nLCAwLCBBTFBIQSwgQSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENIUE1WKCAnVScsIC0xLCBBTFBIQSwgQSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENIUE1WKCAnVScsIDAsIEFMUEhBLCBBLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ0hQTVYoICdVJywgMCwgQUxQSEEsIEEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIENUUk1WKCAnLycsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ1RSTVYoICdVJywgJy8nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDVFJNViggJ1UnLCAnTicsICcvJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENUUk1WKCAnVScsICdOJywgJ04nLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1WKCAnVScsICdOJywgJ04nLCAyLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgQ1RSTVYoICdVJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgNzAgSU5GT1QgPSAxCisgICAgICBDQUxMIENUQk1WKCAnLycsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ1RCTVYoICdVJywgJy8nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDVEJNViggJ1UnLCAnTicsICcvJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENUQk1WKCAnVScsICdOJywgJ04nLCAtMSwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUQk1WKCAnVScsICdOJywgJ04nLCAwLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENUQk1WKCAnVScsICdOJywgJ04nLCAwLCAxLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RCTVYoICdVJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgODAgSU5GT1QgPSAxCisgICAgICBDQUxMIENUUE1WKCAnLycsICdOJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ1RQTVYoICdVJywgJy8nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDVFBNViggJ1UnLCAnTicsICcvJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENUUE1WKCAnVScsICdOJywgJ04nLCAtMSwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENUUE1WKCAnVScsICdOJywgJ04nLCAwLCBBLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgIDkwIElORk9UID0gMQorICAgICAgQ0FMTCBDVFJTViggJy8nLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENUUlNWKCAnVScsICcvJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1RSU1YoICdVJywgJ04nLCAnLycsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDVFJTViggJ1UnLCAnTicsICdOJywgLTEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTViggJ1UnLCAnTicsICdOJywgMiwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENUUlNWKCAnVScsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgMTAwIElORk9UID0gMQorICAgICAgQ0FMTCBDVEJTViggJy8nLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENUQlNWKCAnVScsICcvJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1RCU1YoICdVJywgJ04nLCAnLycsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDVEJTViggJ1UnLCAnTicsICdOJywgLTEsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVEJTViggJ1UnLCAnTicsICdOJywgMCwgLTEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDVEJTViggJ1UnLCAnTicsICdOJywgMCwgMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUQlNWKCAnVScsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgMTEwIElORk9UID0gMQorICAgICAgQ0FMTCBDVFBTViggJy8nLCAnTicsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENUUFNWKCAnVScsICcvJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1RQU1YoICdVJywgJ04nLCAnLycsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDVFBTViggJ1UnLCAnTicsICdOJywgLTEsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDVFBTViggJ1UnLCAnTicsICdOJywgMCwgQSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDEyMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0dFUkMoIC0xLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENHRVJDKCAwLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDR0VSQyggMCwgMCwgQUxQSEEsIFgsIDAsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDR0VSQyggMCwgMCwgQUxQSEEsIFgsIDEsIFksIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDR0VSQyggMiwgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxMzAgSU5GT1QgPSAxCisgICAgICBDQUxMIENHRVJVKCAtMSwgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDR0VSVSggMCwgLTEsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0dFUlUoIDAsIDAsIEFMUEhBLCBYLCAwLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0dFUlUoIDAsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ0dFUlUoIDIsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgMTQwIElORk9UID0gMQorICAgICAgQ0FMTCBDSEVSKCAnLycsIDAsIFJBTFBIQSwgWCwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENIRVIoICdVJywgLTEsIFJBTFBIQSwgWCwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENIRVIoICdVJywgMCwgUkFMUEhBLCBYLCAwLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFUiggJ1UnLCAyLCBSQUxQSEEsIFgsIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxNTAgSU5GT1QgPSAxCisgICAgICBDQUxMIENIUFIoICcvJywgMCwgUkFMUEhBLCBYLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0hQUiggJ1UnLCAtMSwgUkFMUEhBLCBYLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0hQUiggJ1UnLCAwLCBSQUxQSEEsIFgsIDAsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIENIRVIyKCAnLycsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0hFUjIoICdVJywgLTEsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0hFUjIoICdVJywgMCwgQUxQSEEsIFgsIDAsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDSEVSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMSwgWSwgMCwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENIRVIyKCAnVScsIDIsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgMTcwIElORk9UID0gMQorICAgICAgQ0FMTCBDSFBSMiggJy8nLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENIUFIyKCAnVScsIC0xLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENIUFIyKCAnVScsIDAsIEFMUEhBLCBYLCAwLCBZLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hQUjIoICdVJywgMCwgQUxQSEEsIFgsIDEsIFksIDAsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyoKKyAgMTgwIElGKCBPSyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNSTkFNVAorICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNVAorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIFRFU1RTIE9GIEVSUk9SLUVYSVRTJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgVEhFIFRFU1RTIE9GIEVSUk9SLUVYSVRTICoqKioqJywKKyAgICAgJCAgICAgICcqKicgKQorKgorKiAgICAgRW5kIG9mIENDSEtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENNQUtFKCBUWVBFLCBVUExPLCBESUFHLCBNLCBOLCBBLCBOTUFYLCBBQSwgTERBLCBLTCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEtVLCBSRVNFVCwgVFJBTlNMICkKKyoKKyogIEdlbmVyYXRlcyB2YWx1ZXMgZm9yIGFuIE0gYnkgTiBtYXRyaXggQSB3aXRoaW4gdGhlIGJhbmR3aWR0aAorKiAgZGVmaW5lZCBieSBLTCBhbmQgS1UuCisqICBTdG9yZXMgdGhlIHZhbHVlcyBpbiB0aGUgYXJyYXkgQUEgaW4gdGhlIGRhdGEgc3RydWN0dXJlIHJlcXVpcmVkCisqICBieSB0aGUgcm91dGluZSwgd2l0aCB1bndhbnRlZCBlbGVtZW50cyBzZXQgdG8gcm9ndWUgdmFsdWUuCisqCisqICBUWVBFIGlzICdHRScsICdHQicsICdIRScsICdIQicsICdIUCcsICdUUicsICdUQicgT1IgJ1RQJy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSwgT05FID0gKCAxLjAsIDAuMCApICkKKyAgICAgIENPTVBMRVggICAgICAgICAgICBST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9HVUUgPSAoIC0xLjBFMTAsIDEuMEUxMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlJPR1VFID0gLTEuMEUxMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgS0wsIEtVLCBMREEsIE0sIE4sIE5NQVgKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBSRVNFVAorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIERJQUcsIFVQTE8KKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBUWVBFCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBOTUFYLCAqICksIEFBKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJMSwgSTIsIEkzLCBJQkVHLCBJRU5ELCBJT0ZGLCBKLCBKSiwgS0sKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBHRU4sIExPV0VSLCBTWU0sIFRSSSwgVU5JVCwgVVBQRVIKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIENCRUcKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDQkVHCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQ01QTFgsIENPTkpHLCBNQVgsIE1JTiwgUkVBTAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBHRU4gPSBUWVBFKCAxOiAxICkuRVEuJ0cnCisgICAgICBTWU0gPSBUWVBFKCAxOiAxICkuRVEuJ0gnCisgICAgICBUUkkgPSBUWVBFKCAxOiAxICkuRVEuJ1QnCisgICAgICBVUFBFUiA9ICggU1lNLk9SLlRSSSApLkFORC5VUExPLkVRLidVJworICAgICAgTE9XRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nTCcKKyAgICAgIFVOSVQgPSBUUkkuQU5ELkRJQUcuRVEuJ1UnCisqCisqICAgICBHZW5lcmF0ZSBkYXRhIGluIGFycmF5IEEuCisqCisgICAgICBETyAyMCBKID0gMSwgTgorICAgICAgICAgRE8gMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIElGKCBHRU4uT1IuKCBVUFBFUi5BTkQuSS5MRS5KICkuT1IuKCBMT1dFUi5BTkQuSS5HRS5KICkgKQorICAgICAkICAgICAgICAgIFRIRU4KKyAgICAgICAgICAgICAgIElGKCAoIEkuTEUuSi5BTkQuSiAtIEkuTEUuS1UgKS5PUi4KKyAgICAgJCAgICAgICAgICAgICAoIEkuR0UuSi5BTkQuSSAtIEouTEUuS0wgKSApVEhFTgorICAgICAgICAgICAgICAgICAgQSggSSwgSiApID0gQ0JFRyggUkVTRVQgKSArIFRSQU5TTAorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgQSggSSwgSiApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRiggSS5ORS5KIClUSEVOCisgICAgICAgICAgICAgICAgICBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBDT05KRyggQSggSSwgSiApICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFRSSSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVORCBJRgorICAgMTAgICAgQ09OVElOVUUKKyAgICAgICAgIElGKCBTWU0gKQorICAgICAkICAgICAgQSggSiwgSiApID0gQ01QTFgoIFJFQUwoIEEoIEosIEogKSApLCBSWkVSTyApCisgICAgICAgICBJRiggVFJJICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IEEoIEosIEogKSArIE9ORQorICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgQSggSiwgSiApID0gT05FCisgICAyMCBDT05USU5VRQorKgorKiAgICAgU3RvcmUgZWxlbWVudHMgaW4gYXJyYXkgQVMgaW4gZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQgYnkgcm91dGluZS4KKyoKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBETyAzMCBJID0gMSwgTQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidHQicgKVRIRU4KKyAgICAgICAgIERPIDkwIEogPSAxLCBOCisgICAgICAgICAgICBETyA2MCBJMSA9IDEsIEtVICsgMSAtIEoKKyAgICAgICAgICAgICAgIEFBKCBJMSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA2MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNzAgSTIgPSBJMSwgTUlOKCBLTCArIEtVICsgMSwgS1UgKyAxICsgTSAtIEogKQorICAgICAgICAgICAgICAgQUEoIEkyICsgKCBKIC0gMSApKkxEQSApID0gQSggSTIgKyBKIC0gS1UgLSAxLCBKICkKKyAgIDcwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA4MCBJMyA9IEkyLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJMyArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA4MCAgICAgICBDT05USU5VRQorICAgOTAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hFJy5PUi5UWVBFLkVRLidUUicgKVRIRU4KKyAgICAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKIC0gMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTAwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAxMDAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDExMCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgMTEwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxMjAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTIwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICBKSiA9IEogKyAoIEogLSAxICkqTERBCisgICAgICAgICAgICAgICBBQSggSkogKSA9IENNUExYKCBSRUFMKCBBQSggSkogKSApLCBSUk9HVUUgKQorICAgICAgICAgICAgRU5EIElGCisgIDEzMCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nSEInLk9SLlRZUEUuRVEuJ1RCJyApVEhFTgorICAgICAgICAgRE8gMTcwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIEtLID0gS0wgKyAxCisgICAgICAgICAgICAgICBJQkVHID0gTUFYKCAxLCBLTCArIDIgLSBKICkKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJRU5EID0gS0wKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElFTkQgPSBLTCArIDEKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgS0sgPSAxCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUJFRyA9IDIKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElFTkQgPSBNSU4oIEtMICsgMSwgMSArIE0gLSBKICkKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTQwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAxNDAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDE1MCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJICsgSiAtIEtLLCBKICkKKyAgMTUwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxNjAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTYwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICBKSiA9IEtLICsgKCBKIC0gMSApKkxEQQorICAgICAgICAgICAgICAgQUEoIEpKICkgPSBDTVBMWCggUkVBTCggQUEoIEpKICkgKSwgUlJPR1VFICkKKyAgICAgICAgICAgIEVORCBJRgorICAxNzAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hQJy5PUi5UWVBFLkVRLidUUCcgKVRIRU4KKyAgICAgICAgIElPRkYgPSAwCisgICAgICAgICBETyAxOTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTgwIEkgPSBJQkVHLCBJRU5ECisgICAgICAgICAgICAgICBJT0ZGID0gSU9GRiArIDEKKyAgICAgICAgICAgICAgIEFBKCBJT0ZGICkgPSBBKCBJLCBKICkKKyAgICAgICAgICAgICAgIElGKCBJLkVRLkogKVRIRU4KKyAgICAgICAgICAgICAgICAgIElGKCBVTklUICkKKyAgICAgJCAgICAgICAgICAgICAgIEFBKCBJT0ZGICkgPSBST0dVRQorICAgICAgICAgICAgICAgICAgSUYoIFNZTSApCisgICAgICQgICAgICAgICAgICAgICBBQSggSU9GRiApID0gQ01QTFgoIFJFQUwoIEFBKCBJT0ZGICkgKSwgUlJPR1VFICkKKyAgICAgICAgICAgICAgIEVORCBJRgorICAxODAgICAgICAgQ09OVElOVUUKKyAgMTkwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIENNQUtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENNVkNIKCBUUkFOUywgTSwgTiwgQUxQSEEsIEEsIE5NQVgsIFgsIElOQ1gsIEJFVEEsIFksCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNZLCBZVCwgRywgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgTVYgKQorKgorKiAgQ2hlY2tzIHRoZSByZXN1bHRzIG9mIHRoZSBjb21wdXRhdGlvbmFsIHRlc3RzLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUlpFUk8sIFJPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wLCBST05FID0gMS4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQkVUQQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgRVJSCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DWCwgSU5DWSwgTSwgTiwgTk1BWCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBNVgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBOTUFYLCAqICksIFgoICogKSwgWSggKiApLCBZVCggKiApLCBZWSggKiApCisgICAgICBSRUFMICAgICAgICAgICAgICAgRyggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQworICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUkkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJTkNYTCwgSU5DWUwsIElZLCBKLCBKWCwgS1gsIEtZLCBNTCwgTkwKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBDVFJBTiwgVFJBTgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgQUlNQUcsIENPTkpHLCBNQVgsIFJFQUwsIFNRUlQKKyogICAgIC4uIFN0YXRlbWVudCBGdW5jdGlvbnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBQlMxCisqICAgICAuLiBTdGF0ZW1lbnQgRnVuY3Rpb24gZGVmaW5pdGlvbnMgLi4KKyAgICAgIEFCUzEoIEMgKSA9IEFCUyggUkVBTCggQyApICkgKyBBQlMoIEFJTUFHKCBDICkgKQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnCisgICAgICBDVFJBTiA9IFRSQU5TLkVRLidDJworICAgICAgSUYoIFRSQU4uT1IuQ1RSQU4gKVRIRU4KKyAgICAgICAgIE1MID0gTgorICAgICAgICAgTkwgPSBNCisgICAgICBFTFNFCisgICAgICAgICBNTCA9IE0KKyAgICAgICAgIE5MID0gTgorICAgICAgRU5EIElGCisgICAgICBJRiggSU5DWC5MVC4wIClUSEVOCisgICAgICAgICBLWCA9IE5MCisgICAgICAgICBJTkNYTCA9IC0xCisgICAgICBFTFNFCisgICAgICAgICBLWCA9IDEKKyAgICAgICAgIElOQ1hMID0gMQorICAgICAgRU5EIElGCisgICAgICBJRiggSU5DWS5MVC4wIClUSEVOCisgICAgICAgICBLWSA9IE1MCisgICAgICAgICBJTkNZTCA9IC0xCisgICAgICBFTFNFCisgICAgICAgICBLWSA9IDEKKyAgICAgICAgIElOQ1lMID0gMQorICAgICAgRU5EIElGCisqCisqICAgICBDb21wdXRlIGV4cGVjdGVkIHJlc3VsdCBpbiBZVCB1c2luZyBkYXRhIGluIEEsIFggYW5kIFkuCisqICAgICBDb21wdXRlIGdhdWdlcyBpbiBHLgorKgorICAgICAgSVkgPSBLWQorICAgICAgRE8gNDAgSSA9IDEsIE1MCisgICAgICAgICBZVCggSVkgKSA9IFpFUk8KKyAgICAgICAgIEcoIElZICkgPSBSWkVSTworICAgICAgICAgSlggPSBLWAorICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgIERPIDEwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEosIEkgKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUzEoIEEoIEosIEkgKSApKkFCUzEoIFgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAxMCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRSBJRiggQ1RSQU4gKVRIRU4KKyAgICAgICAgICAgIERPIDIwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIENPTkpHKCBBKCBKLCBJICkgKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUzEoIEEoIEosIEkgKSApKkFCUzEoIFgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAyMCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgRE8gMzAgSiA9IDEsIE5MCisgICAgICAgICAgICAgICBZVCggSVkgKSA9IFlUKCBJWSApICsgQSggSSwgSiApKlgoIEpYICkKKyAgICAgICAgICAgICAgIEcoIElZICkgPSBHKCBJWSApICsgQUJTMSggQSggSSwgSiApICkqQUJTMSggWCggSlggKSApCisgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWEwKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIFlUKCBJWSApID0gQUxQSEEqWVQoIElZICkgKyBCRVRBKlkoIElZICkKKyAgICAgICAgIEcoIElZICkgPSBBQlMxKCBBTFBIQSApKkcoIElZICkgKyBBQlMxKCBCRVRBICkqQUJTMSggWSggSVkgKSApCisgICAgICAgICBJWSA9IElZICsgSU5DWUwKKyAgIDQwIENPTlRJTlVFCisqCisqICAgICBDb21wdXRlIHRoZSBlcnJvciByYXRpbyBmb3IgdGhpcyByZXN1bHQuCisqCisgICAgICBFUlIgPSBaRVJPCisgICAgICBETyA1MCBJID0gMSwgTUwKKyAgICAgICAgIEVSUkkgPSBBQlMoIFlUKCBJICkgLSBZWSggMSArICggSSAtIDEgKSpBQlMoIElOQ1kgKSApICkvRVBTCisgICAgICAgICBJRiggRyggSSApLk5FLlJaRVJPICkKKyAgICAgJCAgICAgIEVSUkkgPSBFUlJJL0coIEkgKQorICAgICAgICAgRVJSID0gTUFYKCBFUlIsIEVSUkkgKQorICAgICAgICAgSUYoIEVSUipTUVJUKCBFUFMgKS5HRS5ST05FICkKKyAgICAgJCAgICAgIEdPIFRPIDYwCisgICA1MCBDT05USU5VRQorKiAgICAgSWYgdGhlIGxvb3AgY29tcGxldGVzLCBhbGwgcmVzdWx0cyBhcmUgYXQgbGVhc3QgaGFsZiBhY2N1cmF0ZS4KKyAgICAgIEdPIFRPIDgwCisqCisqICAgICBSZXBvcnQgZmF0YWwgZXJyb3IuCisqCisgICA2MCBGQVRBTCA9IC5UUlVFLgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKQorICAgICAgRE8gNzAgSSA9IDEsIE1MCisgICAgICAgICBJRiggTVYgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLCBZVCggSSApLAorICAgICAkICAgICAgICAgWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUksCisgICAgICQgICAgICAgICBZWSggMSArICggSSAtIDEgKSpBQlMoIElOQ1kgKSApLCBZVCggSSApCisgICAgICAgICBFTkQgSUYKKyAgIDcwIENPTlRJTlVFCisqCisgICA4MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIENPTVBVVEVEIFJFU1VMVCBJUyBMRVNTIFRIQU4gSEFMJywKKyAgICAgJCAgICAgICdGIEFDQ1VSQVRFICoqKioqKionLCAvJyAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNURUQgUkUnLAorICAgICAkICAgICAgJ1NVTFQgICAgICAgICAgICAgICAgICAgIENPTVBVVEVEIFJFU1VMVCcgKQorIDk5OTggRk9STUFUKCAxWCwgSTcsIDIoICcgICgnLCBHMTUuNiwgJywnLCBHMTUuNiwgJyknICkgKQorKgorKiAgICAgRW5kIG9mIENNVkNILgorKgorICAgICAgRU5ECisgICAgICBMT0dJQ0FMIEZVTkNUSU9OIExDRSggUkksIFJKLCBMUiApCisqCisqICBUZXN0cyBpZiB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMUgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgUkkoICogKSwgUkooICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRE8gMTAgSSA9IDEsIExSCisgICAgICAgICBJRiggUkkoIEkgKS5ORS5SSiggSSApICkKKyAgICAgJCAgICAgIEdPIFRPIDIwCisgICAxMCBDT05USU5VRQorICAgICAgTENFID0gLlRSVUUuCisgICAgICBHTyBUTyAzMAorICAgMjAgQ09OVElOVUUKKyAgICAgIExDRSA9IC5GQUxTRS4KKyAgIDMwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExDRS4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMQ0VSRVMoIFRZUEUsIFVQTE8sIE0sIE4sIEFBLCBBUywgTERBICkKKyoKKyogIFRlc3RzIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGluIHR3byBhcnJheXMgYXJlIGVxdWFsLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnSEUnIG9yICdIUCcuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMREEsIE0sIE4KKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUEoIExEQSwgKiApLCBBUyggTERBLCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQkVHLCBJRU5ELCBKCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgVVBQRVIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDEwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAxMCAgICAgICBDT05USU5VRQorICAgMjAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hFJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIElCRUcgLSAxCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisqCisgICA2MCBDT05USU5VRQorICAgICAgTENFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExDRVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExDRVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgQ09NUExFWCBGVU5DVElPTiBDQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgY29tcGxleCBudW1iZXJzIGFzIHBhaXJzIG9mIHJhbmRvbSBudW1iZXJzIHVuaWZvcm1seQorKiAgZGlzdHJpYnV0ZWQgYmV0d2VlbiAtMC41IGFuZCAwLjUuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBSRVNFVAorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElDLCBKLCBNSSwgTUoKKyogICAgIC4uIFNhdmUgc3RhdGVtZW50IC4uCisgICAgICBTQVZFICAgICAgICAgICAgICAgSSwgSUMsIEosIE1JLCBNSgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIENNUExYCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCBSRVNFVCApVEhFTgorKiAgICAgICAgSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMuCisgICAgICAgICBNSSA9IDg5MQorICAgICAgICAgTUogPSA0NTcKKyAgICAgICAgIEkgPSA3CisgICAgICAgICBKID0gNworICAgICAgICAgSUMgPSAwCisgICAgICAgICBSRVNFVCA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorKgorKiAgICAgVGhlIHNlcXVlbmNlIG9mIHZhbHVlcyBvZiBJIG9yIEogaXMgYm91bmRlZCBiZXR3ZWVuIDEgYW5kIDk5OS4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gMSwyLDMsNiw3IG9yIDksIHRoZSBwZXJpb2Qgd2lsbCBiZSA1MC4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gNCBvciA4LCB0aGUgcGVyaW9kIHdpbGwgYmUgMjUuCisqICAgICBJZiBpbml0aWFsIEkgb3IgSiA9IDUsIHRoZSBwZXJpb2Qgd2lsbCBiZSAxMC4KKyogICAgIElDIGlzIHVzZWQgdG8gYnJlYWsgdXAgdGhlIHBlcmlvZCBieSBza2lwcGluZyAxIHZhbHVlIG9mIEkgb3IgSgorKiAgICAgaW4gNi4KKyoKKyAgICAgIElDID0gSUMgKyAxCisgICAxMCBJID0gSSpNSQorICAgICAgSiA9IEoqTUoKKyAgICAgIEkgPSBJIC0gMTAwMCooIEkvMTAwMCApCisgICAgICBKID0gSiAtIDEwMDAqKCBKLzEwMDAgKQorICAgICAgSUYoIElDLkdFLjUgKVRIRU4KKyAgICAgICAgIElDID0gMAorICAgICAgICAgR08gVE8gMTAKKyAgICAgIEVORCBJRgorICAgICAgQ0JFRyA9IENNUExYKCAoIEkgLSA1MDAgKS8xMDAxLjAsICggSiAtIDUwMCApLzEwMDEuMCApCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDQkVHLgorKgorICAgICAgRU5ECisgICAgICBSRUFMIEZVTkNUSU9OIFNESUZGKCBYLCBZICkKKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWCwgWQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBTRElGRiA9IFggLSBZCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTRElGRi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyoKKyogIFRlc3RzIHdoZXRoZXIgWEVSQkxBIGhhcyBkZXRlY3RlZCBhbiBlcnJvciB3aGVuIGl0IHNob3VsZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIC5OT1QuTEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKUlORk9ULCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBMRVJSID0gLkZBTFNFLgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKiogSUxMRUdBTCBWQUxVRSBPRiBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIE5PVCBEJywKKyAgICAgJCAgICAgICdFVEVDVEVEIEJZICcsIEE2LCAnICoqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0hLWEVSLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFhFUkJMQSggU1JOQU1FLCBJTkZPICkKKyoKKyogIFRoaXMgaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIHRvIGJlIHVzZWQgb25seSBhcyBwYXJ0IG9mCisqICB0aGUgdGVzdCBwcm9ncmFtIGZvciB0ZXN0aW5nIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDIgQkxBUworKiAgcm91dGluZXMuCisqCisqICBYRVJCTEEgIGlzIGFuIGVycm9yIGhhbmRsZXIgZm9yIHRoZSBMZXZlbCAyIEJMQVMgcm91dGluZXMuCisqCisqICBJdCBpcyBjYWxsZWQgYnkgdGhlIExldmVsIDIgQkxBUyByb3V0aW5lcyBpZiBhbiBpbnB1dCBwYXJhbWV0ZXIgaXMKKyogIGludmFsaWQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1FCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVQsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgTEVSUiA9IC5UUlVFLgorICAgICAgSUYoIElORk8uTkUuSU5GT1QgKVRIRU4KKyAgICAgICAgIElGKCBJTkZPVC5ORS4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GTywgSU5GT1QKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClJTkZPCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBJRiggU1JOQU1FLk5FLlNSTkFNVCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNRSwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwgJyBJTlNURUFEJywKKyAgICAgJCAgICAgICcgT0YgJywgSTIsICcgKioqKioqKicgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBTUk5BTUUgPSAnLCBBNiwgJyBJTlNURScsCisgICAgICQgICAgICAnQUQgT0YgJywgQTYsICcgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsCisgICAgICQgICAgICAnICoqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBYRVJCTEEKKyoKKyAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3RpbmcvY2JsYXQzLmRhdCBiL2JsYXMvdGVzdGluZy9jYmxhdDMuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODgxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvY2JsYXQzLmRhdApAQCAtMCwwICsxLDIzIEBACisnY2JsYXQzLnN1bW0nICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKzYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorJ2NibGF0My5zbmFwJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKzE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCis2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKzAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCisoMC4wLDAuMCkgKDEuMCwwLjApICgwLjcsLTAuOSkgICAgICAgVkFMVUVTIE9GIEFMUEhBCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKygwLjAsMC4wKSAoMS4wLDAuMCkgKDEuMywtMS4xKSAgICAgICBWQUxVRVMgT0YgQkVUQQorQ0dFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NIRU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDU1lNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ1RSTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NUUlNNICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDSEVSSyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorQ1NZUksgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0NIRVIySyBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitDU1lSMksgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL2NibGF0My5mIGIvYmxhcy90ZXN0aW5nL2NibGF0My5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmJlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvY2JsYXQzLmYKQEAgLTAsMCArMSwzNDM5IEBACisgICAgICBQUk9HUkFNIENCTEFUMworKgorKiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgQ09NUExFWCAgICAgICAgICBMZXZlbCAzIEJsYXMuCisqCisqICBUaGUgcHJvZ3JhbSBtdXN0IGJlIGRyaXZlbiBieSBhIHNob3J0IGRhdGEgZmlsZS4gVGhlIGZpcnN0IDE0IHJlY29yZHMKKyogIG9mIHRoZSBmaWxlIGFyZSByZWFkIHVzaW5nIGxpc3QtZGlyZWN0ZWQgaW5wdXQsIHRoZSBsYXN0IDkgcmVjb3JkcworKiAgYXJlIHJlYWQgdXNpbmcgdGhlIGZvcm1hdCAoIEE2LCBMMiApLiBBbiBhbm5vdGF0ZWQgZXhhbXBsZSBvZiBhIGRhdGEKKyogIGZpbGUgY2FuIGJlIG9idGFpbmVkIGJ5IGRlbGV0aW5nIHRoZSBmaXJzdCAzIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyogIGZvbGxvd2luZyAyMyBsaW5lczoKKyogICdDQkxBVDMuU1VNTScgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorKiAgNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisqICAnQ0JMQVQzLlNOQVAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCisqICAtMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCisqICBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCisqICBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KKyogIFQgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorKiAgMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKyogIDYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorKiAgMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKyogIDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKyogICgwLjAsMC4wKSAoMS4wLDAuMCkgKDAuNywtMC45KSAgICAgICBWQUxVRVMgT0YgQUxQSEEKKyogIDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorKiAgKDAuMCwwLjApICgxLjAsMC4wKSAoMS4zLC0xLjEpICAgICAgIFZBTFVFUyBPRiBCRVRBCisqICBDR0VNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgQ0hFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIENTWU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBDVFJNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgQ1RSU00gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIENIRVJLICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBDU1lSSyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgQ0hFUjJLIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIENTWVIySyBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqCisqICBTZWU6CisqCisqICAgICBEb25nYXJyYSBKLiBKLiwgRHUgQ3JveiBKLiBKLiwgRHVmZiBJLiBTLiBhbmQgSGFtbWFybGluZyBTLgorKiAgICAgQSBTZXQgb2YgTGV2ZWwgMyBCYXNpYyBMaW5lYXIgQWxnZWJyYSBTdWJwcm9ncmFtcy4KKyoKKyogICAgIFRlY2huaWNhbCBNZW1vcmFuZHVtIE5vLjg4IChSZXZpc2lvbiAxKSwgTWF0aGVtYXRpY3MgYW5kCisqICAgICBDb21wdXRlciBTY2llbmNlIERpdmlzaW9uLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnksIDk3MDAKKyogICAgIFNvdXRoIENhc3MgQXZlbnVlLCBBcmdvbm5lLCBJbGxpbm9pcyA2MDQzOSwgVVMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOID0gNSApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTlNVQlMKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5TVUJTID0gOSApCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApLCBPTkUgPSAoIDEuMCwgMC4wICkgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJaRVJPLCBSSEFMRiwgUk9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAsIFJIQUxGID0gMC41LCBST05FID0gMS4wICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOTUFYID0gNjUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JRE1BWCwgTkFMTUFYLCBOQkVNQVgKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JRE1BWCA9IDksIE5BTE1BWCA9IDcsIE5CRU1BWCA9IDcgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgRVJSLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJU05VTSwgSiwgTiwgTkFMRiwgTkJFVCwgTklESU0sIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTFRFU1RULCBSRVdJLCBTQU1FLCBTRkFUQUwsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgIFRTVEVSUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TQSwgVFJBTlNCCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUVUCisgICAgICBDSEFSQUNURVIqMzIgICAgICAgU05BUFMsIFNVTU1SWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUEoIE5NQVgqTk1BWCApLCBBQiggTk1BWCwgMipOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQUxGKCBOQUxNQVggKSwgQVMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCUyggTk1BWCpOTUFYICksIEMoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTk1BWCpOTUFYICksIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBXKCAyKk5NQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRE1BWCApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFRFU1QoIE5TVUJTICkKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVMoIE5TVUJTICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFNESUZGCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTENFCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU0RJRkYsIExDRQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDQ0hLMSwgQ0NISzIsIENDSEszLCBDQ0hLNCwgQ0NISzUsIENDSEtFLCBDTU1DSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWCwgTUlOCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvU1JOQU1DL1NSTkFNVAorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgU05BTUVTLydDR0VNTSAnLCAnQ0hFTU0gJywgJ0NTWU1NICcsICdDVFJNTSAnLAorICAgICAkICAgICAgICAgICAgICAgICAgICdDVFJTTSAnLCAnQ0hFUksgJywgJ0NTWVJLICcsICdDSEVSMksnLAorICAgICAkICAgICAgICAgICAgICAgICAgICdDU1lSMksnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBSZWFkIG5hbWUgYW5kIHVuaXQgbnVtYmVyIGZvciBzdW1tYXJ5IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNVTU1SWQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOT1VUCisgICAgICBPUEVOKCBOT1VULCBGSUxFID0gU1VNTVJZLCBTVEFUVVMgPSAnTkVXJyApCisgICAgICBOT1VUQyA9IE5PVVQKKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHNuYXBzaG90IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNOQVBTCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5UUkEKKyAgICAgIFRSQUNFID0gTlRSQS5HRS4wCisgICAgICBJRiggVFJBQ0UgKVRIRU4KKyAgICAgICAgIE9QRU4oIE5UUkEsIEZJTEUgPSBTTkFQUywgU1RBVFVTID0gJ05FVycgKQorICAgICAgRU5EIElGCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgZGlyZWN0cyByZXdpbmRpbmcgb2YgdGhlIHNuYXBzaG90IGZpbGUuCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVJFV0kKKyAgICAgIFJFV0kgPSBSRVdJLkFORC5UUkFDRQorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgc3RvcHBpbmcgb24gYW55IGZhaWx1cmUuCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNGQVRBTAorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGVycm9yIGV4aXRzIGFyZSB0byBiZSB0ZXN0ZWQuCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVRTVEVSUgorKiAgICAgUmVhZCB0aGUgdGhyZXNob2xkIHZhbHVlIG9mIHRoZSB0ZXN0IHJhdGlvCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVRIUkVTSAorKgorKiAgICAgUmVhZCBhbmQgY2hlY2sgdGhlIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSB0ZXN0cy4KKyoKKyogICAgIFZhbHVlcyBvZiBOCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5JRElNCisgICAgICBJRiggTklESU0uTFQuMS5PUi5OSURJTS5HVC5OSURNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknTicsIE5JRE1BWAorICAgICAgICAgR08gVE8gMjIwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBETyAxMCBJID0gMSwgTklESU0KKyAgICAgICAgIElGKCBJRElNKCBJICkuTFQuMC5PUi5JRElNKCBJICkuR1QuTk1BWCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKU5NQVgKKyAgICAgICAgICAgIEdPIFRPIDIyMAorICAgICAgICAgRU5EIElGCisgICAxMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIEFMUEhBCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5BTEYKKyAgICAgIElGKCBOQUxGLkxULjEuT1IuTkFMRi5HVC5OQUxNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknQUxQSEEnLCBOQUxNQVgKKyAgICAgICAgIEdPIFRPIDIyMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggQUxGKCBJICksIEkgPSAxLCBOQUxGICkKKyogICAgIFZhbHVlcyBvZiBCRVRBCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5CRVQKKyAgICAgIElGKCBOQkVULkxULjEuT1IuTkJFVC5HVC5OQkVNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknQkVUQScsIE5CRU1BWAorICAgICAgICAgR08gVE8gMjIwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBCRVQoIEkgKSwgSSA9IDEsIE5CRVQgKQorKgorKiAgICAgUmVwb3J0IHZhbHVlcyBvZiBwYXJhbWV0ZXJzLgorKgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKSggQUxGKCBJICksIEkgPSAxLCBOQUxGICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisgICAgICBJRiggLk5PVC5UU1RFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg0ICkKKyAgICAgIEVORCBJRgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVRIUkVTSAorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorKgorKiAgICAgUmVhZCBuYW1lcyBvZiBzdWJyb3V0aW5lcyBhbmQgZmxhZ3Mgd2hpY2ggaW5kaWNhdGUKKyogICAgIHdoZXRoZXIgdGhleSBhcmUgdG8gYmUgdGVzdGVkLgorKgorICAgICAgRE8gMjAgSSA9IDEsIE5TVUJTCisgICAgICAgICBMVEVTVCggSSApID0gLkZBTFNFLgorICAgMjAgQ09OVElOVUUKKyAgIDMwIFJFQUQoIE5JTiwgRk1UID0gOTk4OCwgRU5EID0gNjAgKVNOQU1FVCwgTFRFU1RUCisgICAgICBETyA0MCBJID0gMSwgTlNVQlMKKyAgICAgICAgIElGKCBTTkFNRVQuRVEuU05BTUVTKCBJICkgKQorICAgICAkICAgICAgR08gVE8gNTAKKyAgIDQwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MCApU05BTUVUCisgICAgICBTVE9QCisgICA1MCBMVEVTVCggSSApID0gTFRFU1RUCisgICAgICBHTyBUTyAzMAorKgorICAgNjAgQ09OVElOVUUKKyAgICAgIENMT1NFICggTklOICkKKyoKKyogICAgIENvbXB1dGUgRVBTICh0aGUgbWFjaGluZSBwcmVjaXNpb24pLgorKgorICAgICAgRVBTID0gUk9ORQorICAgNzAgQ09OVElOVUUKKyAgICAgIElGKCBTRElGRiggUk9ORSArIEVQUywgUk9ORSApLkVRLlJaRVJPICkKKyAgICAgJCAgIEdPIFRPIDgwCisgICAgICBFUFMgPSBSSEFMRipFUFMKKyAgICAgIEdPIFRPIDcwCisgICA4MCBDT05USU5VRQorICAgICAgRVBTID0gRVBTICsgRVBTCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApRVBTCisqCisqICAgICBDaGVjayB0aGUgcmVsaWFiaWxpdHkgb2YgQ01NQ0ggdXNpbmcgZXhhY3QgZGF0YS4KKyoKKyAgICAgIE4gPSBNSU4oIDMyLCBOTUFYICkKKyAgICAgIERPIDEwMCBKID0gMSwgTgorICAgICAgICAgRE8gOTAgSSA9IDEsIE4KKyAgICAgICAgICAgIEFCKCBJLCBKICkgPSBNQVgoIEkgLSBKICsgMSwgMCApCisgICA5MCAgICBDT05USU5VRQorICAgICAgICAgQUIoIEosIE5NQVggKyAxICkgPSBKCisgICAgICAgICBBQiggMSwgTk1BWCArIEogKSA9IEoKKyAgICAgICAgIEMoIEosIDEgKSA9IFpFUk8KKyAgMTAwIENPTlRJTlVFCisgICAgICBETyAxMTAgSiA9IDEsIE4KKyAgICAgICAgIENDKCBKICkgPSBKKiggKCBKICsgMSApKkogKS8yIC0gKCAoIEogKyAxICkqSiooIEogLSAxICkgKS8zCisgIDExMCBDT05USU5VRQorKiAgICAgQ0MgaG9sZHMgdGhlIGV4YWN0IHJlc3VsdC4gT24gZXhpdCBmcm9tIENNTUNIIENUIGhvbGRzCisqICAgICB0aGUgcmVzdWx0IGNvbXB1dGVkIGJ5IENNTUNILgorICAgICAgVFJBTlNBID0gJ04nCisgICAgICBUUkFOU0IgPSAnTicKKyAgICAgIENBTEwgQ01NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMQ0UoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5SWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKVRSQU5TQSwgVFJBTlNCLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorICAgICAgVFJBTlNCID0gJ0MnCisgICAgICBDQUxMIENNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTENFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuUlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIERPIDEyMCBKID0gMSwgTgorICAgICAgICAgQUIoIEosIE5NQVggKyAxICkgPSBOIC0gSiArIDEKKyAgICAgICAgIEFCKCAxLCBOTUFYICsgSiApID0gTiAtIEogKyAxCisgIDEyMCBDT05USU5VRQorICAgICAgRE8gMTMwIEogPSAxLCBOCisgICAgICAgICBDQyggTiAtIEogKyAxICkgPSBKKiggKCBKICsgMSApKkogKS8yIC0KKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICggKCBKICsgMSApKkoqKCBKIC0gMSApICkvMworICAxMzAgQ09OVElOVUUKKyAgICAgIFRSQU5TQSA9ICdDJworICAgICAgVFJBTlNCID0gJ04nCisgICAgICBDQUxMIENNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTENFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuUlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIFRSQU5TQiA9ICdDJworICAgICAgQ0FMTCBDTU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExDRSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlJaRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisqCisqICAgICBUZXN0IGVhY2ggc3Vicm91dGluZSBpbiB0dXJuLgorKgorICAgICAgRE8gMjAwIElTTlVNID0gMSwgTlNVQlMKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgIElGKCAuTk9ULkxURVNUKCBJU05VTSApIClUSEVOCisqICAgICAgICAgICBTdWJwcm9ncmFtIGlzIG5vdCB0byBiZSB0ZXN0ZWQuCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NyApU05BTUVTKCBJU05VTSApCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBTUk5BTVQgPSBTTkFNRVMoIElTTlVNICkKKyogICAgICAgICAgIFRlc3QgZXJyb3IgZXhpdHMuCisgICAgICAgICAgICBJRiggVFNURVJSIClUSEVOCisgICAgICAgICAgICAgICBDQUxMIENDSEtFKCBJU05VTSwgU05BTUVTKCBJU05VTSApLCBOT1VUICkKKyAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgVGVzdCBjb21wdXRhdGlvbnMuCisgICAgICAgICAgICBJTkZPVCA9IDAKKyAgICAgICAgICAgIE9LID0gLlRSVUUuCisgICAgICAgICAgICBGQVRBTCA9IC5GQUxTRS4KKyAgICAgICAgICAgIEdPIFRPICggMTQwLCAxNTAsIDE1MCwgMTYwLCAxNjAsIDE3MCwgMTcwLAorICAgICAkICAgICAgICAgICAgICAxODAsIDE4MCApSVNOVU0KKyogICAgICAgICAgIFRlc3QgQ0dFTU0sIDAxLgorICAxNDAgICAgICAgQ0FMTCBDQ0hLMSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIENDLCBDUywgQ1QsIEcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IENIRU1NLCAwMiwgQ1NZTU0sIDAzLgorICAxNTAgICAgICAgQ0FMTCBDQ0hLMiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIENDLCBDUywgQ1QsIEcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IENUUk1NLCAwNCwgQ1RSU00sIDA1LgorICAxNjAgICAgICAgQ0FMTCBDQ0hLMyggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTk1BWCwgQUIsCisgICAgICQgICAgICAgICAgICAgICAgICBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIENULCBHLCBDICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBDSEVSSywgMDYsIENTWVJLLCAwNy4KKyAgMTcwICAgICAgIENBTEwgQ0NISzQoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIEMsCisgICAgICQgICAgICAgICAgICAgICAgICBDQywgQ1MsIENULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBDSEVSMkssIDA4LCBDU1lSMkssIDA5LgorICAxODAgICAgICAgQ0FMTCBDQ0hLNSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHLCBXICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKgorICAxOTAgICAgICAgSUYoIEZBVEFMLkFORC5TRkFUQUwgKQorICAgICAkICAgICAgICAgR08gVE8gMjEwCisgICAgICAgICBFTkQgSUYKKyAgMjAwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NiApCisgICAgICBHTyBUTyAyMzAKKyoKKyAgMjEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApCisgICAgICBHTyBUTyAyMzAKKyoKKyAgMjIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MSApCisqCisgIDIzMCBDT05USU5VRQorICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgIENMT1NFICggTlRSQSApCisgICAgICBDTE9TRSAoIE5PVVQgKQorICAgICAgU1RPUAorKgorIDk5OTkgRk9STUFUKCAnIFJPVVRJTkVTIFBBU1MgQ09NUFVUQVRJT05BTCBURVNUUyBJRiBURVNUIFJBVElPIElTIExFUycsCisgICAgICQgICAgICAnUyBUSEFOJywgRjguMiApCisgOTk5OCBGT1JNQVQoICcgUkVMQVRJVkUgTUFDSElORSBQUkVDSVNJT04gSVMgVEFLRU4gVE8gQkUnLCAxUCwgRTkuMSApCisgOTk5NyBGT1JNQVQoICcgTlVNQkVSIE9GIFZBTFVFUyBPRiAnLCBBLCAnIElTIExFU1MgVEhBTiAxIE9SIEdSRUFURVIgJywKKyAgICAgJCAgICAgICdUSEFOICcsIEkyICkKKyA5OTk2IEZPUk1BVCggJyBWQUxVRSBPRiBOIElTIExFU1MgVEhBTiAwIE9SIEdSRUFURVIgVEhBTiAnLCBJMiApCisgOTk5NSBGT1JNQVQoICcgVEVTVFMgT0YgVEhFIENPTVBMRVggICAgICAgICAgTEVWRUwgMyBCTEFTJywgLy8nIFRIRSBGJywKKyAgICAgJCAgICAgICdPTExPV0lORyBQQVJBTUVURVIgVkFMVUVTIFdJTEwgQkUgVVNFRDonICkKKyA5OTk0IEZPUk1BVCggJyAgIEZPUiBOICAgICAgICAgICAgICAnLCA5STYgKQorIDk5OTMgRk9STUFUKCAnICAgRk9SIEFMUEhBICAgICAgICAgICcsCisgICAgICQgICAgICA3KCAnKCcsIEY0LjEsICcsJywgRjQuMSwgJykgICcsIDogKSApCisgOTk5MiBGT1JNQVQoICcgICBGT1IgQkVUQSAgICAgICAgICAgJywKKyAgICAgJCAgICAgIDcoICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSAgJywgOiApICkKKyA5OTkxIEZPUk1BVCggJyBBTUVORCBEQVRBIEZJTEUgT1IgSU5DUkVBU0UgQVJSQVkgU0laRVMgSU4gUFJPR1JBTScsCisgICAgICQgICAgICAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk5MCBGT1JNQVQoICcgU1VCUFJPR1JBTSBOQU1FICcsIEE2LCAnIE5PVCBSRUNPR05JWkVEJywgLycgKioqKioqKiBUJywKKyAgICAgJCAgICAgICdFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4OSBGT1JNQVQoICcgRVJST1IgSU4gQ01NQ0ggLSAgSU4tTElORSBET1QgUFJPRFVDVFMgQVJFIEJFSU5HIEVWQUxVJywKKyAgICAgJCAgICAgICdBVEVEIFdST05HTFkuJywgLycgQ01NQ0ggV0FTIENBTExFRCBXSVRIIFRSQU5TQSA9ICcsIEExLAorICAgICAkICAgICAgJyBBTkQgVFJBTlNCID0gJywgQTEsIC8nIEFORCBSRVRVUk5FRCBTQU1FID0gJywgTDEsICcgQU5EICcsCisgICAgICQgICAgICAnRVJSID0gJywgRjEyLjMsICcuJywgLycgVEhJUyBNQVkgQkUgRFVFIFRPIEZBVUxUUyBJTiBUSEUgJywKKyAgICAgJCAgICAgICdBUklUSE1FVElDIE9SIFRIRSBDT01QSUxFUi4nLCAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAnLAorICAgICAkICAgICAgJyoqKioqKionICkKKyA5OTg4IEZPUk1BVCggQTYsIEwyICkKKyA5OTg3IEZPUk1BVCggMVgsIEE2LCAnIFdBUyBOT1QgVEVTVEVEJyApCisgOTk4NiBGT1JNQVQoIC8nIEVORCBPRiBURVNUUycgKQorIDk5ODUgRk9STUFUKCAvJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg0IEZPUk1BVCggJyBFUlJPUi1FWElUUyBXSUxMIE5PVCBCRSBURVNURUQnICkKKyoKKyogICAgIEVuZCBvZiBDQkxBVDMuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NISzEoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQSwgQUEsIEFTLCBCLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcgKQorKgorKiAgVGVzdHMgQ0dFTU0uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICkgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNBLCBJQ0IsIElLLCBJTSwgSU4sIEssIEtTLCBMQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTEJCLCBMQ0MsIExEQSwgTERBUywgTERCLCBMREJTLCBMREMsIExEQ1MsIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgTUEsIE1CLCBNUywgTiwgTkEsIE5BUkdTLCBOQiwgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU5BLCBUUkFOQgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5BUywgVFJBTkJTLCBUUkFOU0EsIFRSQU5TQgorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExDRSwgTENFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTENFLCBMQ0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0dFTU0sIENNQUtFLCBDTU1DSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ05UQycvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTMKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMTAgSU0gPSAxLCBOSURJTQorICAgICAgICAgTSA9IElESU0oIElNICkKKyoKKyAgICAgICAgIERPIDEwMCBJTiA9IDEsIE5JRElNCisgICAgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREMgPSBNCisgICAgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICBMQ0MgPSBMREMqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICAgICBETyA4MCBJQ0EgPSAxLCAzCisgICAgICAgICAgICAgICAgICBUUkFOU0EgPSBJQ0goIElDQTogSUNBICkKKyAgICAgICAgICAgICAgICAgIFRSQU5BID0gVFJBTlNBLkVRLidUJy5PUi5UUkFOU0EuRVEuJ0MnCisqCisgICAgICAgICAgICAgICAgICBJRiggVFJBTkEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIE1BID0gSworICAgICAgICAgICAgICAgICAgICAgTkEgPSBNCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBNQSA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5BID0gSworICAgICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgICAgIExEQSA9IE1BCisgICAgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgR08gVE8gODAKKyAgICAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQSwgTk1BWCwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgIERPIDcwIElDQiA9IDEsIDMKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TQiA9IElDSCggSUNCOiBJQ0IgKQorICAgICAgICAgICAgICAgICAgICAgVFJBTkIgPSBUUkFOU0IuRVEuJ1QnLk9SLlRSQU5TQi5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOQiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgTUIgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBOQiA9IEsKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIE1CID0gSworICAgICAgICAgICAgICAgICAgICAgICAgTkIgPSBOCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgICAgICAgIFNldCBMREIgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgICAgICAgTERCID0gTUIKKyAgICAgICAgICAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICAgICBHTyBUTyA3MAorICAgICAgICAgICAgICAgICAgICAgTEJCID0gTERCKk5CCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgTUIsIE5CLCBCLCBOTUFYLCBCQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQiwgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5BUyA9IFRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTkJTID0gVFJBTlNCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssIEFMUEhBLCBMREEsIExEQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ0dFTU0oIFRSQU5TQSwgVFJBTlNCLCBNLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIEJCLCBMREIsIEJFVEEsIENDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFRSQU5TQS5FUS5UUkFOQVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU0IuRVEuVFJBTkJTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTENFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMQ0UoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERCUy5FUS5MREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExDRSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMQ0VSRVMoICdHRScsICcgJywgTSwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTMgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTU1DSCggVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQSwgTk1BWCwgQiwgTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMsIE5NQVgsIENULCBHLCBDQywgTERDLCBFUFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssCisgICAgICQgICBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnJycsIEExLCAnJycsJywKKyAgICAgJCAgICAgIDMoIEkzLCAnLCcgKSwgJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBCLCcsIEkzLAorICAgICAkICAgICAgJywoJywgRjQuMSwgJywnLCBGNC4xLCAnKSwgQywnLCBJMywgJykuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLMS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDQ0hLMiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBDSEVNTSBhbmQgQ1NZTU0uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICkgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNTLCBJQ1UsIElNLCBJTiwgTEFBLCBMQkIsIExDQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREEsIExEQVMsIExEQiwgTERCUywgTERDLCBMRENTLCBNLCBNUywgTiwgTkEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENPTkosIExFRlQsIE5VTEwsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgU0lERSwgU0lERVMsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIUywgSUNIVQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExDRSwgTENFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTENFLCBMQ0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0hFTU0sIENNQUtFLCBDTU1DSCwgQ1NZTU0KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIUy8nTFInLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBDT05KID0gU05BTUUoIDI6IDMgKS5FUS4nSEUnCisqCisgICAgICBOQVJHUyA9IDEyCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTAwIElNID0gMSwgTklESU0KKyAgICAgICAgIE0gPSBJRElNKCBJTSApCisqCisgICAgICAgICBETyA5MCBJTiA9IDEsIE5JRElNCisgICAgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREMgPSBNCisgICAgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gOTAKKyAgICAgICAgICAgIExDQyA9IExEQypOCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLk0uTEUuMAorKiAgICAgICAgICAgU2V0IExEQiB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREIgPSBNCisgICAgICAgICAgICBJRiggTERCLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERCID0gTERCICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERCLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gOTAKKyAgICAgICAgICAgIExCQiA9IExEQipOCisqCisqICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQiwgTk1BWCwgQkIsIExEQiwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBaRVJPICkKKyoKKyAgICAgICAgICAgIERPIDgwIElDUyA9IDEsIDIKKyAgICAgICAgICAgICAgIFNJREUgPSBJQ0hTKCBJQ1M6IElDUyApCisgICAgICAgICAgICAgICBMRUZUID0gU0lERS5FUS4nTCcKKyoKKyAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE5BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gODAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorICAgICAgICAgICAgICAgRE8gNzAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBoZXJtaXRpYW4gb3Igc3ltbWV0cmljIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgJyAnLCBOQSwgTkEsIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBDLCBOTUFYLCBDQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0lERVMgPSBTSURFCisgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgIEJMUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBTSURFLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgVVBMTywgTSwgTiwgQUxQSEEsIExEQSwgTERCLCBCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDSEVNTSggU0lERSwgVVBMTywgTSwgTiwgQUxQSEEsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ1NZTU0oIFNJREUsIFVQTE8sIE0sIE4sIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBTSURFUy5FUS5TSURFCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTENFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMQ0UoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREJTLkVRLkxEQgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTENFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExDRVJFUyggJ0dFJywgJyAnLCBNLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTU1DSCggJ04nLCAnTicsIE0sIE4sIE0sIEFMUEhBLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQiwgTk1BWCwgQkVUQSwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENULCBHLCBDQywgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTU1DSCggJ04nLCAnTicsIE0sIE4sIE4sIEFMUEhBLCBCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQSwgTk1BWCwgQkVUQSwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENULCBHLCBDQywgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMjAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsIFVQTE8sIE0sIE4sIEFMUEhBLCBMREEsCisgICAgICQgICBMREIsIEJFVEEsIExEQworKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIEEsJywgSTMsICcsIEIsJywgSTMsICcsKCcsIEY0LjEsCisgICAgICQgICAgICAnLCcsIEY0LjEsICcpLCBDLCcsIEkzLCAnKSAgICAuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLMi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDQ0hLMyggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOTUFYLCBBLCBBQSwgQVMsCisgICAgICQgICAgICAgICAgICAgICAgICBCLCBCQiwgQlMsIENULCBHLCBDICkKKyoKKyogIFRlc3RzIENUUk1NIGFuZCBDVFJTTS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApLCBPTkUgPSAoIDEuMCwgMC4wICkgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDVCggTk1BWCApCisgICAgICBSRUFMICAgICAgICAgICAgICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFMUEhBLCBBTFMKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQ0QsIElDUywgSUNULCBJQ1UsIElNLCBJTiwgSiwgTEFBLCBMQkIsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMREIsIExEQlMsIE0sIE1TLCBOLCBOQSwgTkFSR1MsIE5DLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVGVCwgTlVMTCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBESUFHUywgU0lERSwgU0lERVMsIFRSQU5BUywgVFJBTlNBLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIRCwgSUNIUywgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMQ0UsIExDRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExDRSwgTENFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENNQUtFLCBDTU1DSCwgQ1RSTU0sIENUUlNNCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFUvJ1VMJy8sIElDSFQvJ05UQycvLCBJQ0hELydVTicvLCBJQ0hTLydMUicvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTEKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqICAgICBTZXQgdXAgemVybyBtYXRyaXggZm9yIENNTUNILgorICAgICAgRE8gMjAgSiA9IDEsIE5NQVgKKyAgICAgICAgIERPIDEwIEkgPSAxLCBOTUFYCisgICAgICAgICAgICBDKCBJLCBKICkgPSBaRVJPCisgICAxMCAgICBDT05USU5VRQorICAgMjAgQ09OVElOVUUKKyoKKyAgICAgIERPIDE0MCBJTSA9IDEsIE5JRElNCisgICAgICAgICBNID0gSURJTSggSU0gKQorKgorICAgICAgICAgRE8gMTMwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERCIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQiA9IE0KKyAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgIExCQiA9IExEQipOCisgICAgICAgICAgICBOVUxMID0gTS5MRS4wLk9SLk4uTEUuMAorKgorICAgICAgICAgICAgRE8gMTIwIElDUyA9IDEsIDIKKyAgICAgICAgICAgICAgIFNJREUgPSBJQ0hTKCBJQ1M6IElDUyApCisgICAgICAgICAgICAgICBMRUZUID0gU0lERS5FUS4nTCcKKyAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE5BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyAgICAgICAgICAgICAgIERPIDExMCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorICAgICAgICAgICAgICAgICAgRE8gMTAwIElDVCA9IDEsIDMKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TQSA9IElDSFQoIElDVDogSUNUICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDkwIElDRCA9IDEsIDIKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQUcgPSBJQ0hEKCBJQ0Q6IElDRCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA4MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnVFInLCBVUExPLCBESUFHLCBOQSwgTkEsIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBQSwgTERBLCBSRVNFVCwgWkVSTyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJREVTID0gU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOQVMgPSBUUkFOU0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQUdTID0gRElBRworICAgICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNTScgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLCBOLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgTERCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDVFJNTSggU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgQUxQSEEsIEFBLCBMREEsIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU00nIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwgTiwgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIExEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ1RSU00oIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIEFMUEhBLCBBQSwgTERBLCBCQiwgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFNJREVTLkVRLlNJREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gVFJBTkFTLkVRLlRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IERJQUdTLkVRLkRJQUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMQ0UoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTENFUkVTKCAnR0UnLCAnICcsIE0sIE4sIEJTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMREJTLkVRLkxEQgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01NJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNTUNIKCBUUkFOU0EsICdOJywgTSwgTiwgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBLCBOTUFYLCBCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTywgQywgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTU1DSCggJ04nLCBUUkFOU0EsIE0sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQiwgTk1BWCwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEMsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU00nIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIGFwcHJveGltYXRpb24gdG8gb3JpZ2luYWwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSSwgSiApID0gQkIoIEkgKyAoIEogLSAxICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIoIEkgKyAoIEogLSAxICkqTERCICkgPSBBTFBIQSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIoIEksIEogKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTU1DSCggVFJBTlNBLCAnTicsIE0sIE4sIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEEsIE5NQVgsIEMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBCLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTU1DSCggJ04nLCBUUkFOU0EsIE0sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEMsIE5NQVgsIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBCLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEyMCAgICAgICBDT05USU5VRQorKgorICAxMzAgICAgQ09OVElOVUUKKyoKKyAgMTQwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNjAKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwKKyAgICAgJCAgIE4sIEFMUEhBLCBMREEsIExEQgorKgorICAxNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDQoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIEEsJywgSTMsICcsIEIsJywgSTMsICcpICAgICAgICAgJywKKyAgICAgJCAgICAgICcgICAgICAuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLMy4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDQ0hLNCggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBDSEVSSyBhbmQgQ1NZUksuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMCwgMC4wICkgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJPTkUsIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBST05FID0gMS4wLCBSWkVSTyA9IDAuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCRVRTCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVJSLCBFUlJNQVgsIFJBTFBIQSwgUkFMUywgUkJFVEEsIFJCRVRTCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ1QsIElDVSwgSUssIElOLCBKLCBKQywgSkosIEssIEtTLAorICAgICAkICAgICAgICAgICAgICAgICAgIExBQSwgTENDLCBMREEsIExEQVMsIExEQywgTERDUywgTEosIE1BLCBOLCBOQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQ09OSiwgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU4sIFVQUEVSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMsIFRSQU5TUywgVFJBTlNULCBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSFQsIElDSFUKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMQ0UsIExDRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExDRSwgTENFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENIRVJLLCBDTUFLRSwgQ01NQ0gsIENTWVJLCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQ01QTFgsIE1BWCwgUkVBTAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hULydOQycvLCBJQ0hVLydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIENPTkogPSBTTkFNRSggMjogMyApLkVRLidIRScKKyoKKyAgICAgIE5BUkdTID0gMTAKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMDAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREMgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERDID0gTgorICAgICAgICAgSUYoIExEQy5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQyA9IExEQyArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQy5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDEwMAorICAgICAgICAgTENDID0gTERDKk4KKyoKKyAgICAgICAgIERPIDkwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICBETyA4MCBJQ1QgPSAxLCAyCisgICAgICAgICAgICAgICBUUkFOUyA9IElDSFQoIElDVDogSUNUICkKKyAgICAgICAgICAgICAgIFRSQU4gPSBUUkFOUy5FUS4nQycKKyAgICAgICAgICAgICAgIElGKCBUUkFOLkFORC4uTk9ULkNPTkogKQorICAgICAkICAgICAgICAgICAgVFJBTlMgPSAnVCcKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBNQSA9IEsKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTUEgPSBOCisgICAgICAgICAgICAgICAgICBOQSA9IEsKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBMREEgPSBNQQorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDgwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEEsIE5NQVgsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICBETyA3MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorICAgICAgICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIFJBTFBIQSA9IFJFQUwoIEFMUEhBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQ01QTFgoIFJBTFBIQSwgUlpFUk8gKQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSQkVUQSA9IFJFQUwoIEJFVEEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IENNUExYKCBSQkVUQSwgUlpFUk8gKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBOVUxMID0gTlVMTC5PUi4oICggSy5MRS4wLk9SLlJBTFBIQS5FUS4KKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICBSWkVSTyApLkFORC5SQkVUQS5FUS5ST05FICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIENDLCBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSQUxTID0gUkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSQkVUUyA9IFJCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUUkFOUywgTiwgSywgUkFMUEhBLCBMREEsIFJCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENIRVJLKCBVUExPLCBUUkFOUywgTiwgSywgUkFMUEhBLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgUkJFVEEsIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUUkFOUywgTiwgSywgQUxQSEEsIExEQSwgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDU1lSSyggVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgQkVUQSwgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlNTLkVRLlRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gUkFMUy5FUS5SQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IFJCRVRTLkVRLlJCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gQkVUUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTENFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTENFUkVTKCBTTkFNRSggMjogMyApLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIENTLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMRENTLkVRLkxEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TVCA9ICdDJworICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNUID0gJ1QnCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01NQ0goIFRSQU5TVCwgJ04nLCBMSiwgMSwgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBKCAxLCBKSiApLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSggMSwgSiApLCBOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSkosIEogKSwgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQyggSkMgKSwgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDTU1DSCggJ04nLCBUUkFOU1QsIExKLCAxLCBLLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEEoIEpKLCAxICksIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBKCBKLCAxICksIE5NQVgsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCBKSiwgSiApLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDKCBKQyApLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDUwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA2MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICBDT05USU5VRQorKgorICAxMDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMTAgQ09OVElOVUUKKyAgICAgIElGKCBOLkdULjEgKQorICAgICAkICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgTiwgSywgUkFMUEhBLAorICAgICAkICAgICAgTERBLCBSQkVUQSwgTERDCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsCisgICAgICQgICAgICBMREEsIEJFVEEsIExEQworICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgIEY0LjEsICcsIEEsJywgSTMsICcsJywgRjQuMSwgJywgQywnLCBJMywgJykgICAgICAgICAgICAgICAnLAorICAgICAkICAgICAgJyAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSAsIEEsJywgSTMsICcsKCcsIEY0LjEsICcsJywgRjQuMSwKKyAgICAgJCAgICAgICcpLCBDLCcsIEkzLCAnKSAgICAgICAgICAuJyApCisgOTk5MiBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLNC4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDQ0hLNSggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBQiwgQUEsIEFTLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcsIFcgKQorKgorKiAgVGVzdHMgQ0hFUjJLIGFuZCBDU1lSMksuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSwgT05FID0gKCAxLjAsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBST05FLCBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9ORSA9IDEuMCwgUlpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTkJFVCwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQUEoIE5NQVgqTk1BWCApLCBBQiggMipOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBTEYoIE5BTEYgKSwgQVMoIE5NQVgqTk1BWCApLCBCQiggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkVUKCBOQkVUICksIEJTKCBOTUFYKk5NQVggKSwgQyggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENDKCBOTUFYKk5NQVggKSwgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFcoIDIqTk1BWCApCisgICAgICBSRUFMICAgICAgICAgICAgICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJFVFMKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlIsIEVSUk1BWCwgUkJFVEEsIFJCRVRTCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ1QsIElDVSwgSUssIElOLCBKLCBKQywgSkosIEpKQUIsCisgICAgICQgICAgICAgICAgICAgICAgICAgSywgS1MsIExBQSwgTEJCLCBMQ0MsIExEQSwgTERBUywgTERCLCBMREJTLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQywgTERDUywgTEosIE1BLCBOLCBOQSwgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENPTkosIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MsIFRSQU5TVCwgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hULCBJQ0hVCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTENFLCBMQ0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMQ0UsIExDRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEVSMkssIENNQUtFLCBDTU1DSCwgQ1NZUjJLCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQ01QTFgsIENPTkpHLCBNQVgsIFJFQUwKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVC8nTkMnLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBDT05KID0gU05BTUUoIDI6IDMgKS5FUS4nSEUnCisqCisgICAgICBOQVJHUyA9IDEyCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTMwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQyA9IE4KKyAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMzAKKyAgICAgICAgIExDQyA9IExEQypOCisqCisgICAgICAgICBETyAxMjAgSUsgPSAxLCBOSURJTQorICAgICAgICAgICAgSyA9IElESU0oIElLICkKKyoKKyAgICAgICAgICAgIERPIDExMCBJQ1QgPSAxLCAyCisgICAgICAgICAgICAgICBUUkFOUyA9IElDSFQoIElDVDogSUNUICkKKyAgICAgICAgICAgICAgIFRSQU4gPSBUUkFOUy5FUS4nQycKKyAgICAgICAgICAgICAgIElGKCBUUkFOLkFORC4uTk9ULkNPTkogKQorICAgICAkICAgICAgICAgICAgVFJBTlMgPSAnVCcKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBNQSA9IEsKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTUEgPSBOCisgICAgICAgICAgICAgICAgICBOQSA9IEsKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBMREEgPSBNQQorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgQ0FMTCBDTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIsIDIqTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICBMREIgPSBMREEKKyAgICAgICAgICAgICAgIExCQiA9IExBQQorICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCKCBLICsgMSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgMipOTUFYLCBCQiwgTERCLCBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBDQUxMIENNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiggSypOTUFYICsgMSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQkIsIExEQiwgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyAxMDAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyAgICAgICAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgICAgICAgIERPIDkwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDgwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJCRVRBID0gUkVBTCggQkVUQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQ01QTFgoIFJCRVRBLCBSWkVSTyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSBOVUxMLk9SLiggKCBLLkxFLjAuT1IuQUxQSEEuRVEuCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTyApLkFORC5SQkVUQS5FUS5ST05FICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIENDLCBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJCRVRTID0gUkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBOLCBLLCBBTFBIQSwgTERBLCBMREIsIFJCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENIRVIySyggVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIEJCLCBMREIsIFJCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE4sIEssIEFMUEhBLCBMREEsIExEQiwgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBDU1lSMksoIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBCQiwgTERCLCBCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU1MuRVEuVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExDRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTENFKCBCUywgQkIsIExCQiApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERCUy5FUS5MREIKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IFJCRVRTLkVRLlJCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IEJFVFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMQ0UoIENTLCBDQywgTENDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTENFUkVTKCAnSEUnLCBVUExPLCBOLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1QgPSAnQycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TVCA9ICdUJworICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSkFCID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEkgKSA9IEFMUEhBKkFCKCAoIEogLSAxICkqMioKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVggKyBLICsgSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IENPTkpHKCBBTFBIQSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCKCAoIEogLSAxICkqMioKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYICsgSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBLICsgSSApID0gQUxQSEEqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUIoICggSiAtIDEgKSoyKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVggKyBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgQ01NQ0goIFRSQU5TVCwgJ04nLCBMSiwgMSwgMipLLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05FLCBBQiggSkpBQiApLCAyKk5NQVgsIFcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKk5NQVgsIEJFVEEsIEMoIEpKLCBKICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBDVCwgRywgQ0MoIEpDICksIExEQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEkgKSA9IEFMUEhBKkNPTkpHKCBBQiggKCBLICsKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgLSAxICkqTk1BWCArIEogKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBLICsgSSApID0gQ09OSkcoIEFMUEhBKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCKCAoIEkgLSAxICkqTk1BWCArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEkgKSA9IEFMUEhBKkFCKCAoIEsgKyBJIC0gMSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCArIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IEFMUEhBKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCKCAoIEkgLSAxICkqTk1BWCArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIENNTUNIKCAnTicsICdOJywgTEosIDEsIDIqSywgT05FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUIoIEpKICksIE5NQVgsIFcsIDIqTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEsIEMoIEpKLCBKICksIE5NQVgsIENULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRywgQ0MoIEpDICksIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkpBQiA9IEpKQUIgKyAyKk5NQVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgICAgIENPTlRJTlVFCisqCisgIDEyMCAgICBDT05USU5VRQorKgorICAxMzAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE2MAorKgorICAxNDAgQ09OVElOVUUKKyAgICAgIElGKCBOLkdULjEgKQorICAgICAkICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsCisgICAgICQgICAgICBMREEsIExEQiwgUkJFVEEsIExEQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLAorICAgICAkICAgICAgTERBLCBMREIsIEJFVEEsIExEQworICAgICAgRU5EIElGCisqCisgIDE2MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgQiwnLCBJMywgJywnLCBGNC4xLAorICAgICAkICAgICAgJywgQywnLCBJMywgJykgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnLCgnLCBGNC4xLAorICAgICAkICAgICAgJywnLCBGNC4xLCAnKSwgQywnLCBJMywgJykgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0NISzUuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0NIS0UoIElTTlVNLCBTUk5BTVQsIE5PVVQgKQorKgorKiAgVGVzdHMgdGhlIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDMgQmxhcy4KKyogIFJlcXVpcmVzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBlcnJvci1oYW5kbGluZyByb3V0aW5lIFhFUkJMQS4KKyogIEFMUEhBLCBSQUxQSEEsIEJFVEEsIFJCRVRBLCBBLCBCIGFuZCBDIHNob3VsZCBub3QgbmVlZCB0byBiZSBkZWZpbmVkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJU05VTSwgTk9VVAorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFMUEhBLCBCRVRBCisgICAgICBSRUFMICAgICAgICAgICAgICAgUkFMUEhBLCBSQkVUQQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggMiwgMSApLCBCKCAyLCAxICksIEMoIDIsIDEgKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDR0VNTSwgQ0hFTU0sIENIRVIySywgQ0hFUkssIENIS1hFUiwgQ1NZTU0sCisgICAgICQgICAgICAgICAgICAgICAgICAgQ1NZUjJLLCBDU1lSSywgQ1RSTU0sIENUUlNNCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKiAgICAgT0sgaXMgc2V0IHRvIC5GQUxTRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgb3IgYnkgQ0hLWEVSCisqICAgICBpZiBhbnl0aGluZyBpcyB3cm9uZy4KKyAgICAgIE9LID0gLlRSVUUuCisqICAgICBMRVJSIGlzIHNldCB0byAuVFJVRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgZWFjaCB0aW1lCisqICAgICBpdCBpcyBjYWxsZWQsIGFuZCBpcyB0aGVuIHRlc3RlZCBhbmQgcmUtc2V0IGJ5IENIS1hFUi4KKyAgICAgIExFUlIgPSAuRkFMU0UuCisgICAgICBHTyBUTyAoIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwKKyAgICAgJCAgICAgICAgOTAgKUlTTlVNCisgICAxMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ0dFTU0oICcvJywgJ04nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxCisgICAgICBDQUxMIENHRU1NKCAnLycsICdDJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMQorICAgICAgQ0FMTCBDR0VNTSggJy8nLCAnVCcsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJy8nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENHRU1NKCAnQycsICcvJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnLycsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnQycsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENHRU1NKCAnTicsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnQycsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENHRU1NKCAnQycsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnQycsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENHRU1NKCAnVCcsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnQycsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENHRU1NKCAnTicsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnQycsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENHRU1NKCAnQycsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnQycsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENHRU1NKCAnVCcsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnQycsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENHRU1NKCAnTicsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnQycsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENHRU1NKCAnQycsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnQycsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENHRU1NKCAnVCcsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ04nLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENHRU1NKCAnTicsICdDJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENHRU1NKCAnQycsICdDJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnVCcsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIENHRU1NKCAnVCcsICdDJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnVCcsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENHRU1NKCAnTicsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnTicsIDAsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENHRU1NKCAnTicsICdDJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ0MnLCAwLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnQycsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENHRU1NKCAnTicsICdUJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ1QnLCAwLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnVCcsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIENHRU1NKCAnTicsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgQ0dFTU0oICdOJywgJ0MnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBDR0VNTSggJ04nLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIENHRU1NKCAnQycsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgQ0dFTU0oICdDJywgJ0MnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBDR0VNTSggJ0MnLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIENHRU1NKCAnVCcsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgQ0dFTU0oICdUJywgJ0MnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBDR0VNTSggJ1QnLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDIwIElORk9UID0gMQorICAgICAgQ0FMTCBDSEVNTSggJy8nLCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ0hFTU0oICdMJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENIRU1NKCAnTCcsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0hFTU0oICdSJywgJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEVNTSggJ0wnLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENIRU1NKCAnUicsICdMJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0hFTU0oICdMJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDSEVNTSggJ1InLCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENIRU1NKCAnTCcsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0hFTU0oICdSJywgJ0wnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDSEVNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFTU0oICdSJywgJ1UnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDSEVNTSggJ1InLCAnTCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ0hFTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENIRU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDSEVNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ0hFTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDSEVNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENIRU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgQ0hFTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDSEVNTSggJ1InLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDMwIElORk9UID0gMQorICAgICAgQ0FMTCBDU1lNTSggJy8nLCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ1NZTU0oICdMJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENTWU1NKCAnTCcsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1NZTU0oICdSJywgJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lNTSggJ0wnLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENTWU1NKCAnUicsICdMJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1NZTU0oICdMJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDU1lNTSggJ1InLCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENTWU1NKCAnTCcsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1NZTU0oICdSJywgJ0wnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1NZTU0oICdSJywgJ1UnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENTWU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDU1lNTSggJ1InLCAnTCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1NZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDU1lNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1NZTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgQ1NZTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDU1lNTSggJ1InLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBDVFJNTSggJy8nLCAnVScsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENUUk1NKCAnTCcsICcvJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ1UnLCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdOJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdVJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnUicsICdVJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnUicsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdMJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnUicsICdMJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIENUUk1NKCAnUicsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdVJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnUicsICdVJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdMJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnUicsICdMJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIENUUk1NKCAnUicsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ1UnLCAnQycsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSTU0oICdMJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSTU0oICdSJywgJ0wnLCAnQycsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBDVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICA1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ1RSU00oICcvJywgJ1UnLCAnTicsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnLycsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENUUlNNKCAnTCcsICdVJywgJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnTicsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnVScsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnVScsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnTCcsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnTCcsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnVScsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnVScsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnTCcsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnTCcsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUlNNKCAnTCcsICdVJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUlNNKCAnUicsICdVJywgJ0MnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUlNNKCAnTCcsICdMJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENUUlNNKCAnUicsICdMJywgJ0MnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgQ1RSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDEwMAorICAgNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIENIRVJLKCAnLycsICdOJywgMCwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENIRVJLKCAnVScsICdUJywgMCwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENIRVJLKCAnVScsICdOJywgLTEsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEVSSyggJ1UnLCAnQycsIC0xLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0hFUksoICdMJywgJ04nLCAtMSwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENIRVJLKCAnTCcsICdDJywgLTEsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDSEVSSyggJ1UnLCAnTicsIDAsIC0xLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0hFUksoICdVJywgJ0MnLCAwLCAtMSwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENIRVJLKCAnTCcsICdOJywgMCwgLTEsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDSEVSSyggJ0wnLCAnQycsIDAsIC0xLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFUksoICdVJywgJ04nLCAyLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFUksoICdVJywgJ0MnLCAwLCAyLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFUksoICdMJywgJ04nLCAyLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ0hFUksoICdMJywgJ0MnLCAwLCAyLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENIRVJLKCAnVScsICdOJywgMiwgMCwgUkFMUEhBLCBBLCAyLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDSEVSSyggJ1UnLCAnQycsIDIsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ0hFUksoICdMJywgJ04nLCAyLCAwLCBSQUxQSEEsIEEsIDIsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENIRVJLKCAnTCcsICdDJywgMiwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICA3MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgQ1NZUksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIENTWVJLKCAnVScsICdDJywgMCwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lSSyggJ1UnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENTWVJLKCAnVScsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ1NZUksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lSSyggJ0wnLCAnVCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENTWVJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ1NZUksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDU1lSSyggJ0wnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENTWVJLKCAnTCcsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1NZUksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENTWVJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDU1lSSyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1NZUksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDU1lSSyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIENTWVJLKCAnVScsICdUJywgMiwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgQ1NZUksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBDU1lSSyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDgwIElORk9UID0gMQorICAgICAgQ0FMTCBDSEVSMksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBDSEVSMksoICdVJywgJ1QnLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEVSMksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgQ0hFUjJLKCAnVScsICdDJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIENIRVIySyggJ0wnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDSEVSMksoICdMJywgJ0MnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0hFUjJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIENIRVIySyggJ1UnLCAnQycsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDSEVSMksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgQ0hFUjJLKCAnTCcsICdDJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRVIySyggJ1UnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENIRVIySyggJ0wnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENIRVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENIRVIySyggJ1UnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENIRVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENIRVIySyggJ0wnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDSEVSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgQ0hFUjJLKCAnVScsICdDJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENIRVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBDSEVSMksoICdMJywgJ0MnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDEwMAorICAgOTAgSU5GT1QgPSAxCisgICAgICBDQUxMIENTWVIySyggJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgQ1NZUjJLKCAnVScsICdDJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lSMksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lSMksoICdVJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lSMksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBDU1lSMksoICdMJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDU1lSMksoICdVJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDU1lSMksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDU1lSMksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBDU1lSMksoICdMJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIENTWVIySyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgQ1NZUjJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBDU1lSMksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgQ1NZUjJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBDU1lSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIENTWVIySyggJ0wnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENTWVIySyggJ1UnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENTWVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIENTWVIySyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisgIDEwMCBJRiggT0sgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTUk5BTVQKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTVQKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUycgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyAqKioqKicsCisgICAgICQgICAgICAnKionICkKKyoKKyogICAgIEVuZCBvZiBDQ0hLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDTUFLRSggVFlQRSwgVVBMTywgRElBRywgTSwgTiwgQSwgTk1BWCwgQUEsIExEQSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorKiAgR2VuZXJhdGVzIHZhbHVlcyBmb3IgYW4gTSBieSBOIG1hdHJpeCBBLgorKiAgU3RvcmVzIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IEFBIGluIHRoZSBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZAorKiAgYnkgdGhlIHJvdXRpbmUsIHdpdGggdW53YW50ZWQgZWxlbWVudHMgc2V0IHRvIHJvZ3VlIHZhbHVlLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnSEUnLCAnU1knIG9yICdUUicuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wLCAwLjAgKSwgT05FID0gKCAxLjAsIDAuMCApICkKKyAgICAgIENPTVBMRVggICAgICAgICAgICBST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9HVUUgPSAoIC0xLjBFMTAsIDEuMEUxMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFJST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlJPR1VFID0gLTEuMEUxMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOLCBOTUFYCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQSggTk1BWCwgKiApLCBBQSggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSiwgSkoKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBHRU4sIEhFUiwgTE9XRVIsIFNZTSwgVFJJLCBVTklULCBVUFBFUgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBDT01QTEVYICAgICAgICAgICAgQ0JFRworICAgICAgRVhURVJOQUwgICAgICAgICAgIENCRUcKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBDTVBMWCwgQ09OSkcsIFJFQUwKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgR0VOID0gVFlQRS5FUS4nR0UnCisgICAgICBIRVIgPSBUWVBFLkVRLidIRScKKyAgICAgIFNZTSA9IFRZUEUuRVEuJ1NZJworICAgICAgVFJJID0gVFlQRS5FUS4nVFInCisgICAgICBVUFBFUiA9ICggSEVSLk9SLlNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nVScKKyAgICAgIExPV0VSID0gKCBIRVIuT1IuU1lNLk9SLlRSSSApLkFORC5VUExPLkVRLidMJworICAgICAgVU5JVCA9IFRSSS5BTkQuRElBRy5FUS4nVScKKyoKKyogICAgIEdlbmVyYXRlIGRhdGEgaW4gYXJyYXkgQS4KKyoKKyAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICBETyAxMCBJID0gMSwgTQorICAgICAgICAgICAgSUYoIEdFTi5PUi4oIFVQUEVSLkFORC5JLkxFLkogKS5PUi4oIExPV0VSLkFORC5JLkdFLkogKSApCisgICAgICQgICAgICAgICAgVEhFTgorICAgICAgICAgICAgICAgQSggSSwgSiApID0gQ0JFRyggUkVTRVQgKSArIFRSQU5TTAorICAgICAgICAgICAgICAgSUYoIEkuTkUuSiApVEhFTgorKiAgICAgICAgICAgICAgICAgU2V0IHNvbWUgZWxlbWVudHMgdG8gemVybworICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMy5BTkQuSi5FUS5OLzIgKQorICAgICAkICAgICAgICAgICAgICAgQSggSSwgSiApID0gWkVSTworICAgICAgICAgICAgICAgICAgSUYoIEhFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gQ09OSkcoIEEoIEksIEogKSApCisgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTWU0gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEEoIEosIEkgKSA9IEEoIEksIEogKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggVFJJIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIEhFUiApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBDTVBMWCggUkVBTCggQSggSiwgSiApICksIFJaRVJPICkKKyAgICAgICAgIElGKCBUUkkgKQorICAgICAkICAgICAgQSggSiwgSiApID0gQSggSiwgSiApICsgT05FCisgICAgICAgICBJRiggVU5JVCApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBPTkUKKyAgIDIwIENPTlRJTlVFCisqCisqICAgICBTdG9yZSBlbGVtZW50cyBpbiBhcnJheSBBUyBpbiBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZCBieSByb3V0aW5lLgorKgorICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBNCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hFJy5PUi5UWVBFLkVRLidTWScuT1IuVFlQRS5FUS4nVFInIClUSEVOCisgICAgICAgICBETyA5MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKIC0gMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gNjAgSSA9IDEsIElCRUcgLSAxCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA2MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNzAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSwgSiApCisgICA3MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gODAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDgwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBJRiggSEVSIClUSEVOCisgICAgICAgICAgICAgICBKSiA9IEogKyAoIEogLSAxICkqTERBCisgICAgICAgICAgICAgICBBQSggSkogKSA9IENNUExYKCBSRUFMKCBBQSggSkogKSApLCBSUk9HVUUgKQorICAgICAgICAgICAgRU5EIElGCisgICA5MCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBDTUFLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDTU1DSCggVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEtLLCBBTFBIQSwgQSwgTERBLCBCLCBMREIsCisgICAgICQgICAgICAgICAgICAgICAgICBCRVRBLCBDLCBMREMsIENULCBHLCBDQywgTERDQywgRVBTLCBFUlIsIEZBVEFMLAorICAgICAkICAgICAgICAgICAgICAgICAgTk9VVCwgTVYgKQorKgorKiAgQ2hlY2tzIHRoZSByZXN1bHRzIG9mIHRoZSBjb21wdXRhdGlvbmFsIHRlc3RzLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjAsIDAuMCApICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBSWkVSTywgUk9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjAsIFJPTkUgPSAxLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIEFMUEhBLCBCRVRBCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBFUlIKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBLSywgTERBLCBMREIsIExEQywgTERDQywgTSwgTiwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBNVgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TQSwgVFJBTlNCCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBKCBMREEsICogKSwgQiggTERCLCAqICksIEMoIExEQywgKiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENDKCBMRENDLCAqICksIENUKCAqICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBHKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBDTAorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUkkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBKLCBLCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQ1RSQU5BLCBDVFJBTkIsIFRSQU5BLCBUUkFOQgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgQUlNQUcsIENPTkpHLCBNQVgsIFJFQUwsIFNRUlQKKyogICAgIC4uIFN0YXRlbWVudCBGdW5jdGlvbnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBQlMxCisqICAgICAuLiBTdGF0ZW1lbnQgRnVuY3Rpb24gZGVmaW5pdGlvbnMgLi4KKyAgICAgIEFCUzEoIENMICkgPSBBQlMoIFJFQUwoIENMICkgKSArIEFCUyggQUlNQUcoIENMICkgKQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBUUkFOQSA9IFRSQU5TQS5FUS4nVCcuT1IuVFJBTlNBLkVRLidDJworICAgICAgVFJBTkIgPSBUUkFOU0IuRVEuJ1QnLk9SLlRSQU5TQi5FUS4nQycKKyAgICAgIENUUkFOQSA9IFRSQU5TQS5FUS4nQycKKyAgICAgIENUUkFOQiA9IFRSQU5TQi5FUS4nQycKKyoKKyogICAgIENvbXB1dGUgZXhwZWN0ZWQgcmVzdWx0LCBvbmUgY29sdW1uIGF0IGEgdGltZSwgaW4gQ1QgdXNpbmcgZGF0YQorKiAgICAgaW4gQSwgQiBhbmQgQy4KKyogICAgIENvbXB1dGUgZ2F1Z2VzIGluIEcuCisqCisgICAgICBETyAyMjAgSiA9IDEsIE4KKyoKKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBDVCggSSApID0gWkVSTworICAgICAgICAgICAgRyggSSApID0gUlpFUk8KKyAgIDEwICAgIENPTlRJTlVFCisgICAgICAgICBJRiggLk5PVC5UUkFOQS5BTkQuLk5PVC5UUkFOQiApVEhFTgorICAgICAgICAgICAgRE8gMzAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBJLCBLICkqQiggSywgSiApCisgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBJLCBLICkgKSpBQlMxKCBCKCBLLCBKICkgKQorICAgMjAgICAgICAgICAgQ09OVElOVUUKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTFNFIElGKCBUUkFOQS5BTkQuLk5PVC5UUkFOQiApVEhFTgorICAgICAgICAgICAgSUYoIENUUkFOQSApVEhFTgorICAgICAgICAgICAgICAgRE8gNTAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBDT05KRyggQSggSywgSSApICkqQiggSywgSiApCisgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEssIEogKSApCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgNTAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIERPIDcwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSywgSSApKkIoIEssIEogKQorICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBLLCBKICkgKQorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgIEVMU0UgSUYoIC5OT1QuVFJBTkEuQU5ELlRSQU5CIClUSEVOCisgICAgICAgICAgICBJRiggQ1RSQU5CIClUSEVOCisgICAgICAgICAgICAgICBETyA5MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEksIEsgKSpDT05KRyggQiggSiwgSyApICkKKyAgICAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUzEoIEEoIEksIEsgKSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTMSggQiggSiwgSyApICkKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisgICA5MCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgRE8gMTEwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgICAgRE8gMTAwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEksIEsgKSpCKCBKLCBLICkKKyAgICAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUzEoIEEoIEksIEsgKSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTMSggQiggSiwgSyApICkKKyAgMTAwICAgICAgICAgICAgIENPTlRJTlVFCisgIDExMCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICBFTFNFIElGKCBUUkFOQS5BTkQuVFJBTkIgKVRIRU4KKyAgICAgICAgICAgIElGKCBDVFJBTkEgKVRIRU4KKyAgICAgICAgICAgICAgIElGKCBDVFJBTkIgKVRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDEzMCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgICAgIERPIDEyMCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBDT05KRyggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OSkcoIEIoIEosIEsgKSApCisgICAgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgIDEyMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAxMzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDE1MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgICAgIERPIDE0MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBDT05KRyggQSggSywgSSApICkqQiggSiwgSyApCisgICAgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgIDE0MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAxNTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUYoIENUUkFOQiApVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMTcwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgICAgICAgRE8gMTYwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEssIEkgKSpDT05KRyggQiggSiwgSyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUzEoIEEoIEssIEkgKSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTMSggQiggSiwgSyApICkKKyAgMTYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgIDE3MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgRE8gMTkwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgICAgICAgRE8gMTgwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEssIEkgKSpCKCBKLCBLICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUzEoIEEoIEssIEkgKSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTMSggQiggSiwgSyApICkKKyAgMTgwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgIDE5MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgRE8gMjAwIEkgPSAxLCBNCisgICAgICAgICAgICBDVCggSSApID0gQUxQSEEqQ1QoIEkgKSArIEJFVEEqQyggSSwgSiApCisgICAgICAgICAgICBHKCBJICkgPSBBQlMxKCBBTFBIQSApKkcoIEkgKSArCisgICAgICQgICAgICAgICAgICAgICBBQlMxKCBCRVRBICkqQUJTMSggQyggSSwgSiApICkKKyAgMjAwICAgIENPTlRJTlVFCisqCisqICAgICAgICBDb21wdXRlIHRoZSBlcnJvciByYXRpbyBmb3IgdGhpcyByZXN1bHQuCisqCisgICAgICAgICBFUlIgPSBaRVJPCisgICAgICAgICBETyAyMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIEVSUkkgPSBBQlMxKCBDVCggSSApIC0gQ0MoIEksIEogKSApL0VQUworICAgICAgICAgICAgSUYoIEcoIEkgKS5ORS5SWkVSTyApCisgICAgICQgICAgICAgICBFUlJJID0gRVJSSS9HKCBJICkKKyAgICAgICAgICAgIEVSUiA9IE1BWCggRVJSLCBFUlJJICkKKyAgICAgICAgICAgIElGKCBFUlIqU1FSVCggRVBTICkuR0UuUk9ORSApCisgICAgICQgICAgICAgICBHTyBUTyAyMzAKKyAgMjEwICAgIENPTlRJTlVFCisqCisgIDIyMCBDT05USU5VRQorKgorKiAgICAgSWYgdGhlIGxvb3AgY29tcGxldGVzLCBhbGwgcmVzdWx0cyBhcmUgYXQgbGVhc3QgaGFsZiBhY2N1cmF0ZS4KKyAgICAgIEdPIFRPIDI1MAorKgorKiAgICAgUmVwb3J0IGZhdGFsIGVycm9yLgorKgorICAyMzAgRkFUQUwgPSAuVFJVRS4KKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5ICkKKyAgICAgIERPIDI0MCBJID0gMSwgTQorICAgICAgICAgSUYoIE1WIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgQ1QoIEkgKSwgQ0MoIEksIEogKQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUksIENDKCBJLCBKICksIENUKCBJICkKKyAgICAgICAgIEVORCBJRgorICAyNDAgQ09OVElOVUUKKyAgICAgIElGKCBOLkdULjEgKQorICAgICAkICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKUoKKyoKKyAgMjUwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gQ09NUFVURUQgUkVTVUxUIElTIExFU1MgVEhBTiBIQUwnLAorICAgICAkICAgICAgJ0YgQUNDVVJBVEUgKioqKioqKicsIC8nICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RFRCBSRScsCisgICAgICQgICAgICAnU1VMVCAgICAgICAgICAgICAgICAgICAgQ09NUFVURUQgUkVTVUxUJyApCisgOTk5OCBGT1JNQVQoIDFYLCBJNywgMiggJyAgKCcsIEcxNS42LCAnLCcsIEcxNS42LCAnKScgKSApCisgOTk5NyBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisqCisqICAgICBFbmQgb2YgQ01NQ0guCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTENFKCBSSSwgUkosIExSICkKKyoKKyogIFRlc3RzIGlmIHR3byBhcnJheXMgYXJlIGlkZW50aWNhbC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTFIKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCAgICAgICAgICAgIFJJKCAqICksIFJKKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDEwIEkgPSAxLCBMUgorICAgICAgICAgSUYoIFJJKCBJICkuTkUuUkooIEkgKSApCisgICAgICQgICAgICBHTyBUTyAyMAorICAgMTAgQ09OVElOVUUKKyAgICAgIExDRSA9IC5UUlVFLgorICAgICAgR08gVE8gMzAKKyAgIDIwIENPTlRJTlVFCisgICAgICBMQ0UgPSAuRkFMU0UuCisgICAzMCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMQ0UuCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTENFUkVTKCBUWVBFLCBVUExPLCBNLCBOLCBBQSwgQVMsIExEQSApCisqCisqICBUZXN0cyBpZiBzZWxlY3RlZCBlbGVtZW50cyBpbiB0d28gYXJyYXlzIGFyZSBlcXVhbC4KKyoKKyogIFRZUEUgaXMgJ0dFJyBvciAnSEUnIG9yICdTWScuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIExEQSwgTSwgTgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8KKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBUWVBFCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVggICAgICAgICAgICBBQSggTERBLCAqICksIEFTKCBMREEsICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElCRUcsIElFTkQsIEoKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBVUFBFUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisgICAgICBJRiggVFlQRS5FUS4nR0UnIClUSEVOCisgICAgICAgICBETyAyMCBKID0gMSwgTgorICAgICAgICAgICAgRE8gMTAgSSA9IE0gKyAxLCBMREEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDEwICAgICAgIENPTlRJTlVFCisgICAyMCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nSEUnLk9SLlRZUEUuRVEuJ1NZJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIElCRUcgLSAxCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisqCisgICA2MCBDT05USU5VRQorICAgICAgTENFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExDRVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExDRVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgQ09NUExFWCBGVU5DVElPTiBDQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgY29tcGxleCBudW1iZXJzIGFzIHBhaXJzIG9mIHJhbmRvbSBudW1iZXJzIHVuaWZvcm1seQorKiAgZGlzdHJpYnV0ZWQgYmV0d2VlbiAtMC41IGFuZCAwLjUuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUMsIEosIE1JLCBNSgorKiAgICAgLi4gU2F2ZSBzdGF0ZW1lbnQgLi4KKyAgICAgIFNBVkUgICAgICAgICAgICAgICBJLCBJQywgSiwgTUksIE1KCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQ01QTFgKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIFJFU0VUIClUSEVOCisqICAgICAgICBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAgICAgIE1JID0gODkxCisgICAgICAgICBNSiA9IDQ1NworICAgICAgICAgSSA9IDcKKyAgICAgICAgIEogPSA3CisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIFJFU0VUID0gLkZBTFNFLgorICAgICAgRU5EIElGCisqCisqICAgICBUaGUgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIEkgb3IgSiBpcyBib3VuZGVkIGJldHdlZW4gMSBhbmQgOTk5LgorKiAgICAgSWYgaW5pdGlhbCBJIG9yIEogPSAxLDIsMyw2LDcgb3IgOSwgdGhlIHBlcmlvZCB3aWxsIGJlIDUwLgorKiAgICAgSWYgaW5pdGlhbCBJIG9yIEogPSA0IG9yIDgsIHRoZSBwZXJpb2Qgd2lsbCBiZSAyNS4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gNSwgdGhlIHBlcmlvZCB3aWxsIGJlIDEwLgorKiAgICAgSUMgaXMgdXNlZCB0byBicmVhayB1cCB0aGUgcGVyaW9kIGJ5IHNraXBwaW5nIDEgdmFsdWUgb2YgSSBvciBKCisqICAgICBpbiA2LgorKgorICAgICAgSUMgPSBJQyArIDEKKyAgIDEwIEkgPSBJKk1JCisgICAgICBKID0gSipNSgorICAgICAgSSA9IEkgLSAxMDAwKiggSS8xMDAwICkKKyAgICAgIEogPSBKIC0gMTAwMCooIEovMTAwMCApCisgICAgICBJRiggSUMuR0UuNSApVEhFTgorICAgICAgICAgSUMgPSAwCisgICAgICAgICBHTyBUTyAxMAorICAgICAgRU5EIElGCisgICAgICBDQkVHID0gQ01QTFgoICggSSAtIDUwMCApLzEwMDEuMCwgKCBKIC0gNTAwICkvMTAwMS4wICkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIENCRUcuCisqCisgICAgICBFTkQKKyAgICAgIFJFQUwgRlVOQ1RJT04gU0RJRkYoIFgsIFkgKQorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBYLCBZCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFNESUZGID0gWCAtIFkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNESUZGLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorKiAgVGVzdHMgd2hldGhlciBYRVJCTEEgaGFzIGRldGVjdGVkIGFuIGVycm9yIHdoZW4gaXQgc2hvdWxkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCAuTk9ULkxFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPVCwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqIElMTEVHQUwgVkFMVUUgT0YgUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBOT1QgRCcsCisgICAgICQgICAgICAnRVRFQ1RFRCBCWSAnLCBBNiwgJyAqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENIS1hFUi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBYRVJCTEEoIFNSTkFNRSwgSU5GTyApCisqCisqICBUaGlzIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSB0byBiZSB1c2VkIG9ubHkgYXMgcGFydCBvZgorKiAgdGhlIHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAzIEJMQVMKKyogIHJvdXRpbmVzLgorKgorKiAgWEVSQkxBICBpcyBhbiBlcnJvciBoYW5kbGVyIGZvciB0aGUgTGV2ZWwgMyBCTEFTIHJvdXRpbmVzLgorKgorKiAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMZXZlbCAzIEJMQVMgcm91dGluZXMgaWYgYW4gaW5wdXQgcGFyYW1ldGVyIGlzCisqICBpbnZhbGlkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1FCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVQsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgTEVSUiA9IC5UUlVFLgorICAgICAgSUYoIElORk8uTkUuSU5GT1QgKVRIRU4KKyAgICAgICAgIElGKCBJTkZPVC5ORS4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GTywgSU5GT1QKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClJTkZPCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBJRiggU1JOQU1FLk5FLlNSTkFNVCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNRSwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwgJyBJTlNURUFEJywKKyAgICAgJCAgICAgICcgT0YgJywgSTIsICcgKioqKioqKicgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBTUk5BTUUgPSAnLCBBNiwgJyBJTlNURScsCisgICAgICQgICAgICAnQUQgT0YgJywgQTYsICcgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsCisgICAgICQgICAgICAnICoqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBYRVJCTEEKKyoKKyAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3RpbmcvZGJsYXQxLmYgYi9ibGFzL3Rlc3RpbmcvZGJsYXQxLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0NWQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9kYmxhdDEuZgpAQCAtMCwwICsxLDc2OSBAQAorICAgICAgUFJPR1JBTSBEQkxBVDEKKyogICAgIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIERPVUJMRSBQUkVDSVNJT04gTGV2ZWwgMSBCTEFTLgorKiAgICAgQmFzZWQgdXBvbiB0aGUgb3JpZ2luYWwgQkxBUyB0ZXN0IHJvdXRpbmUgdG9nZXRoZXIgd2l0aDoKKyogICAgIEYwNkVBRiBFeGFtcGxlIFByb2dyYW0gVGV4dAorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNGQUMKKyAgICAgIElOVEVHRVIgICAgICAgICAgSUMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgIENIRUNLMCwgQ0hFQ0sxLCBDSEVDSzIsIENIRUNLMywgSEVBREVSCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICBTRkFDLzkuNzY1NjI1RC00LworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBXUklURSAoTk9VVCw5OTk5OSkKKyAgICAgIERPIDIwIElDID0gMSwgMTAKKyAgICAgICAgIElDQVNFID0gSUMKKyAgICAgICAgIENBTEwgSEVBREVSCisqCisqICAgICAgICAuLiBJbml0aWFsaXplICBQQVNTLCAgSU5DWCwgIElOQ1ksIGFuZCBNT0RFIGZvciBhIG5ldyBjYXNlLiAuLgorKiAgICAgICAgLi4gdGhlIHZhbHVlIDk5OTkgZm9yIElOQ1gsIElOQ1kgb3IgTU9ERSB3aWxsIGFwcGVhciBpbiB0aGUgLi4KKyogICAgICAgIC4uIGRldGFpbGVkICBvdXRwdXQsIGlmIGFueSwgZm9yIGNhc2VzICB0aGF0IGRvIG5vdCBpbnZvbHZlIC4uCisqICAgICAgICAuLiB0aGVzZSBwYXJhbWV0ZXJzIC4uCisqCisgICAgICAgICBQQVNTID0gLlRSVUUuCisgICAgICAgICBJTkNYID0gOTk5OQorICAgICAgICAgSU5DWSA9IDk5OTkKKyAgICAgICAgIE1PREUgPSA5OTk5CisgICAgICAgICBJRiAoSUNBU0UuRVEuMykgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzAoU0ZBQykKKyAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjcgLk9SLiBJQ0FTRS5FUS44IC5PUi4gSUNBU0UuRVEuOSAuT1IuCisgICAgICsgICAgICAgICAgICBJQ0FTRS5FUS4xMCkgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzEoU0ZBQykKKyAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjEgLk9SLiBJQ0FTRS5FUS4yIC5PUi4gSUNBU0UuRVEuNSAuT1IuCisgICAgICsgICAgICAgICAgICBJQ0FTRS5FUS42KSBUSEVOCisgICAgICAgICAgICBDQUxMIENIRUNLMihTRkFDKQorICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNCkgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzMoU0ZBQykKKyAgICAgICAgIEVORCBJRgorKiAgICAgICAgLS0gUHJpbnQKKyAgICAgICAgIElGIChQQVNTKSBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwIENPTlRJTlVFCisgICAgICBTVE9QCisqCis5OTk5OSBGT1JNQVQgKCcgUmVhbCBCTEFTIFRlc3QgUHJvZ3JhbSBSZXN1bHRzJywvMVgpCis5OTk5OCBGT1JNQVQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLSBQQVNTIC0tLS0tJykKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBIRUFERVIKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDSEFSQUNURVIqNiAgICAgIEwoMTApCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICBMKDEpLycgRERPVCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDIpLydEQVhQWSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDMpLydEUk9URyAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDQpLycgRFJPVCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDUpLydEQ09QWSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDYpLydEU1dBUCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDcpLydETlJNMiAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDgpLydEQVNVTSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDkpLydEU0NBTCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDEwKS8nSURBTUFYJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpIElDQVNFLCBMKElDQVNFKQorICAgICAgUkVUVVJOCisqCis5OTk5OSBGT1JNQVQgKC8nIFRlc3Qgb2Ygc3VicHJvZ3JhbSBudW1iZXInLEkzLDEyWCxBNikKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEVDSzAoU0ZBQykKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTRkFDCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIEQxMiwgU0EsIFNCLCBTQywgU1MKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEsKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgREExKDgpLCBEQVRSVUUoOCksIERCMSg4KSwgREJUUlVFKDgpLCBEQzEoOCksCisgICAgICsgICAgICAgICAgICAgICAgICBEUzEoOCkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBEUk9URywgU1RFU1QxCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgIERBMS8wLjNEMCwgMC40RDAsIC0wLjNEMCwgLTAuNEQwLCAtMC4zRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDEuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgREIxLzAuNEQwLCAwLjNEMCwgMC40RDAsIDAuM0QwLCAtMC40RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMS4wRDAsIDAuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgREMxLzAuNkQwLCAwLjhEMCwgLTAuNkQwLCAwLjhEMCwgMC42RDAsIDEuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDEuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFMxLzAuOEQwLCAwLjZEMCwgMC44RDAsIC0wLjZEMCwgMC44RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMS4wRDAsIDAuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgREFUUlVFLzAuNUQwLCAwLjVEMCwgMC41RDAsIC0wLjVEMCwgLTAuNUQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDEuMEQwLCAxLjBEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERCVFJVRS8wLjBEMCwgMC42RDAsIDAuMEQwLCAtMC42RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDEuMEQwLCAwLjBEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIEQxMi80MDk2LjBEMC8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgQ29tcHV0ZSB0cnVlIHZhbHVlcyB3aGljaCBjYW5ub3QgYmUgcHJlc3RvcmVkCisqICAgICBpbiBkZWNpbWFsIG5vdGF0aW9uCisqCisgICAgICBEQlRSVUUoMSkgPSAxLjBEMC8wLjZEMAorICAgICAgREJUUlVFKDMpID0gLTEuMEQwLzAuNkQwCisgICAgICBEQlRSVUUoNSkgPSAxLjBEMC8wLjZEMAorKgorICAgICAgRE8gMjAgSyA9IDEsIDgKKyogICAgICAgIC4uIFNldCBOPUsgZm9yIGlkZW50aWZpY2F0aW9uIGluIG91dHB1dCBpZiBhbnkgLi4KKyAgICAgICAgIE4gPSBLCisgICAgICAgICBJRiAoSUNBU0UuRVEuMykgVEhFTgorKiAgICAgICAgICAgLi4gRFJPVEcgLi4KKyAgICAgICAgICAgIElGIChLLkdULjgpIEdPIFRPIDQwCisgICAgICAgICAgICBTQSA9IERBMShLKQorICAgICAgICAgICAgU0IgPSBEQjEoSykKKyAgICAgICAgICAgIENBTEwgRFJPVEcoU0EsU0IsU0MsU1MpCisgICAgICAgICAgICBDQUxMIFNURVNUMShTQSxEQVRSVUUoSyksREFUUlVFKEspLFNGQUMpCisgICAgICAgICAgICBDQUxMIFNURVNUMShTQixEQlRSVUUoSyksREJUUlVFKEspLFNGQUMpCisgICAgICAgICAgICBDQUxMIFNURVNUMShTQyxEQzEoSyksREMxKEspLFNGQUMpCisgICAgICAgICAgICBDQUxMIFNURVNUMShTUyxEUzEoSyksRFMxKEspLFNGQUMpCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzAnCisgICAgICAgICAgICBTVE9QCisgICAgICAgICBFTkQgSUYKKyAgIDIwIENPTlRJTlVFCisgICA0MCBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEVDSzEoU0ZBQykKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTRkFDCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIExFTiwgTlAxCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIERUUlVFMSg1KSwgRFRSVUUzKDUpLCBEVFJVRTUoOCw1LDIpLCBEVig4LDUsMiksCisgICAgICsgICAgICAgICAgICAgICAgICBTQSgxMCksIFNURU1QKDEpLCBTVFJVRSg4KSwgU1goOCkKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElUUlVFMig1KQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBEQVNVTSwgRE5STTIKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElEQU1BWAorICAgICAgRVhURVJOQUwgICAgICAgICAgREFTVU0sIEROUk0yLCBJREFNQVgKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBJVEVTVDEsIERTQ0FMLCBTVEVTVCwgU1RFU1QxCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBNQVgKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgU0EvMC4zRDAsIC0xLjBEMCwgMC4wRDAsIDEuMEQwLCAwLjNEMCwgMC4zRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjNEMCwgMC4zRDAsIDAuM0QwLCAwLjNEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERWLzAuMUQwLCAyLjBEMCwgMi4wRDAsIDIuMEQwLCAyLjBEMCwgMi4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAyLjBEMCwgMi4wRDAsIDAuM0QwLCAzLjBEMCwgMy4wRDAsIDMuMEQwLCAzLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDMuMEQwLCAzLjBEMCwgMy4wRDAsIDAuM0QwLCAtMC40RDAsIDQuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgNC4wRDAsIDQuMEQwLCA0LjBEMCwgNC4wRDAsIDQuMEQwLCAwLjJEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjZEMCwgMC4zRDAsIDUuMEQwLCA1LjBEMCwgNS4wRDAsIDUuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgNS4wRDAsIDAuMUQwLCAtMC4zRDAsIDAuNUQwLCAtMC4xRDAsIDYuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgNi4wRDAsIDYuMEQwLCA2LjBEMCwgMC4xRDAsIDguMEQwLCA4LjBEMCwgOC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICA4LjBEMCwgOC4wRDAsIDguMEQwLCA4LjBEMCwgMC4zRDAsIDkuMEQwLCA5LjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDkuMEQwLCA5LjBEMCwgOS4wRDAsIDkuMEQwLCA5LjBEMCwgMC4zRDAsIDIuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNEQwLCAyLjBEMCwgMi4wRDAsIDIuMEQwLCAyLjBEMCwgMi4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjJEMCwgMy4wRDAsIC0wLjZEMCwgNS4wRDAsIDAuM0QwLCAyLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDIuMEQwLCAyLjBEMCwgMC4xRDAsIDQuMEQwLCAtMC4zRDAsIDYuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNUQwLCA3LjBEMCwgLTAuMUQwLCAzLjBEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUUlVFMS8wLjBEMCwgMC4zRDAsIDAuNUQwLCAwLjdEMCwgMC42RDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVFJVRTMvMC4wRDAsIDAuM0QwLCAwLjdEMCwgMS4xRDAsIDEuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFRSVUU1LzAuMTBEMCwgMi4wRDAsIDIuMEQwLCAyLjBEMCwgMi4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAyLjBEMCwgMi4wRDAsIDIuMEQwLCAtMC4zRDAsIDMuMEQwLCAzLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDMuMEQwLCAzLjBEMCwgMy4wRDAsIDMuMEQwLCAzLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgNC4wRDAsIDQuMEQwLCA0LjBEMCwgNC4wRDAsIDQuMEQwLCA0LjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMjBEMCwgLTAuNjBEMCwgMC4zMEQwLCA1LjBEMCwgNS4wRDAsIDUuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgNS4wRDAsIDUuMEQwLCAwLjAzRDAsIC0wLjA5RDAsIDAuMTVEMCwgLTAuMDNEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDYuMEQwLCA2LjBEMCwgNi4wRDAsIDYuMEQwLCAwLjEwRDAsIDguMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgOC4wRDAsIDguMEQwLCA4LjBEMCwgOC4wRDAsIDguMEQwLCA4LjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMDlEMCwgOS4wRDAsIDkuMEQwLCA5LjBEMCwgOS4wRDAsIDkuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgOS4wRDAsIDkuMEQwLCAwLjA5RDAsIDIuMEQwLCAtMC4xMkQwLCAyLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDIuMEQwLCAyLjBEMCwgMi4wRDAsIDIuMEQwLCAwLjA2RDAsIDMuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuMThEMCwgNS4wRDAsIDAuMDlEMCwgMi4wRDAsIDIuMEQwLCAyLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMDNEMCwgNC4wRDAsIC0wLjA5RDAsIDYuMEQwLCAtMC4xNUQwLCA3LjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjAzRDAsIDMuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgSVRSVUUyLzAsIDEsIDIsIDIsIDMvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDgwIElOQ1ggPSAxLCAyCisgICAgICAgICBETyA2MCBOUDEgPSAxLCA1CisgICAgICAgICAgICBOID0gTlAxIC0gMQorICAgICAgICAgICAgTEVOID0gMipNQVgoTiwxKQorKiAgICAgICAgICAgLi4gU2V0IHZlY3RvciBhcmd1bWVudHMgLi4KKyAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMRU4KKyAgICAgICAgICAgICAgIFNYKEkpID0gRFYoSSxOUDEsSU5DWCkKKyAgIDIwICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICBJRiAoSUNBU0UuRVEuNykgVEhFTgorKiAgICAgICAgICAgICAgLi4gRE5STTIgLi4KKyAgICAgICAgICAgICAgIFNURU1QKDEpID0gRFRSVUUxKE5QMSkKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QxKEROUk0yKE4sU1gsSU5DWCksU1RFTVAsU1RFTVAsU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjgpIFRIRU4KKyogICAgICAgICAgICAgIC4uIERBU1VNIC4uCisgICAgICAgICAgICAgICBTVEVNUCgxKSA9IERUUlVFMyhOUDEpCisgICAgICAgICAgICAgICBDQUxMIFNURVNUMShEQVNVTShOLFNYLElOQ1gpLFNURU1QLFNURU1QLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS45KSBUSEVOCisqICAgICAgICAgICAgICAuLiBEU0NBTCAuLgorICAgICAgICAgICAgICAgQ0FMTCBEU0NBTChOLFNBKChJTkNYLTEpKjUrTlAxKSxTWCxJTkNYKQorICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIExFTgorICAgICAgICAgICAgICAgICAgU1RSVUUoSSkgPSBEVFJVRTUoSSxOUDEsSU5DWCkKKyAgIDQwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTixTWCxTVFJVRSxTVFJVRSxTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuMTApIFRIRU4KKyogICAgICAgICAgICAgIC4uIElEQU1BWCAuLgorICAgICAgICAgICAgICAgQ0FMTCBJVEVTVDEoSURBTUFYKE4sU1gsSU5DWCksSVRSVUUyKE5QMSkpCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzEnCisgICAgICAgICAgICAgICBTVE9QCisgICAgICAgICAgICBFTkQgSUYKKyAgIDYwICAgIENPTlRJTlVFCisgICA4MCBDT05USU5VRQorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hFQ0syKFNGQUMpCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgU0ZBQworKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTQSwgU0MsIFNTCisgICAgICBJTlRFR0VSICAgICAgICAgICBJLCBKLCBLSSwgS04sIEtTSVpFLCBMRU5YLCBMRU5ZLCBNWCwgTVkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgRFQxMFgoNyw0LDQpLCBEVDEwWSg3LDQsNCksIERUNyg0LDQpLAorICAgICArICAgICAgICAgICAgICAgICAgRFQ4KDcsNCw0KSwgRFQ5WCg3LDQsNCksIERUOVkoNyw0LDQpLCBEWDEoNyksCisgICAgICsgICAgICAgICAgICAgICAgICBEWTEoNyksIFNTSVpFMSg0KSwgU1NJWkUyKDE0LDIpLCBTVFgoNyksIFNUWSg3KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIFNYKDcpLCBTWSg3KQorICAgICAgSU5URUdFUiAgICAgICAgICAgSU5DWFMoNCksIElOQ1lTKDQpLCBMRU5TKDQsMiksIE5TKDQpCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIERET1QKKyAgICAgIEVYVEVSTkFMICAgICAgICAgIERET1QKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBEQVhQWSwgRENPUFksIERTV0FQLCBTVEVTVCwgU1RFU1QxCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBBQlMsIE1JTgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICBTQS8wLjNEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1hTLzEsIDIsIC0yLCAtMS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1lTLzEsIC0yLCAxLCAtMi8KKyAgICAgIERBVEEgICAgICAgICAgICAgIExFTlMvMSwgMSwgMiwgNCwgMSwgMSwgMywgNy8KKyAgICAgIERBVEEgICAgICAgICAgICAgIE5TLzAsIDEsIDIsIDQvCisgICAgICBEQVRBICAgICAgICAgICAgICBEWDEvMC42RDAsIDAuMUQwLCAtMC41RDAsIDAuOEQwLCAwLjlEMCwgLTAuM0QwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFkxLzAuNUQwLCAtMC45RDAsIDAuM0QwLCAwLjdEMCwgLTAuNkQwLCAwLjJEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuOEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgU0MsIFNTLzAuOEQwLCAwLjZEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUNy8wLjBEMCwgMC4zMEQwLCAwLjIxRDAsIDAuNjJEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjMwRDAsIC0wLjA3RDAsIDAuODVEMCwgMC4wRDAsIDAuMzBEMCwgLTAuNzlEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjc0RDAsIDAuMEQwLCAwLjMwRDAsIDAuMzNEMCwgMS4yN0QwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQ4LzAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC42OEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC42OEQwLCAtMC44N0QwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjY4RDAsIC0wLjg3RDAsIDAuMTVEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuOTREMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC41RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjY4RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4zNUQwLCAtMC45RDAsIDAuNDhEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjM4RDAsIC0wLjlEMCwgMC41N0QwLCAwLjdEMCwgLTAuNzVEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMkQwLCAwLjk4RDAsIDAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC42OEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4zNUQwLCAtMC43MkQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjM4RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC42M0QwLCAwLjE1RDAsIDAuODhEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC42OEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC42OEQwLCAtMC45RDAsIDAuMzNEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjY4RDAsIC0wLjlEMCwgMC4zM0QwLCAwLjdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjc1RDAsIDAuMkQwLCAxLjA0RDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVDlYLzAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC43OEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC43OEQwLCAtMC40NkQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjc4RDAsIC0wLjQ2RDAsIC0wLjIyRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjA2RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNkQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC43OEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNjZEMCwgMC4xRDAsIC0wLjFEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjk2RDAsIDAuMUQwLCAtMC43NkQwLCAwLjhEMCwgMC45MEQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuM0QwLCAtMC4wMkQwLCAwLjZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNzhEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIC0wLjA2RDAsIDAuMUQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuMUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC45MEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4xRDAsIC0wLjIyRDAsIDAuOEQwLCAwLjE4RDAsIC0wLjNEMCwgLTAuMDJEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC43OEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC43OEQwLCAwLjI2RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuNzhEMCwgMC4yNkQwLCAtMC43NkQwLCAxLjEyRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQ5WS8wLjVEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMDREMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMDREMCwgLTAuNzhEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wNEQwLCAtMC43OEQwLCAwLjU0RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjA4RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNUQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wNEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC43RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC45RDAsIC0wLjEyRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC42NEQwLCAtMC45RDAsIC0wLjMwRDAsIDAuN0QwLCAtMC4xOEQwLCAwLjJEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMjhEMCwgMC41RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjA0RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjdEMCwgLTEuMDhEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC42NEQwLCAtMS4yNkQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC41NEQwLCAwLjIwRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNUQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMDREMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMDREMCwgLTAuOUQwLCAwLjE4RDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wNEQwLCAtMC45RDAsIDAuMThEMCwgMC43RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC4xOEQwLCAwLjJEMCwgMC4xNkQwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQxMFgvMC42RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjVEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuNUQwLCAtMC45RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuNUQwLCAtMC45RDAsIDAuM0QwLCAwLjdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC41RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjNEMCwgMC4xRDAsIDAuNUQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuOEQwLCAwLjFEMCwgLTAuNkQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC44RDAsIDAuM0QwLCAtMC4zRDAsIDAuNUQwLCAwLjZEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNUQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgLTAuOUQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4xRDAsIDAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC43RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjFEMCwgMC4zRDAsIDAuOEQwLCAtMC45RDAsIC0wLjNEMCwgMC41RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC41RDAsIDAuM0QwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjVEMCwgMC4zRDAsIC0wLjZEMCwgMC44RDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQxMFkvMC41RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuNkQwLCAwLjFEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC42RDAsIDAuMUQwLCAtMC41RDAsIDAuOEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC41RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIC0wLjVEMCwgLTAuOUQwLCAwLjZEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAtMC40RDAsIC0wLjlEMCwgMC45RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjdEMCwgLTAuNUQwLCAwLjJEMCwgMC42RDAsIDAuNUQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC42RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAtMC41RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNEQwLCAwLjlEMCwgLTAuNUQwLCAwLjZEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC42RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjZEMCwgLTAuOUQwLCAwLjFEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjZEMCwgLTAuOUQwLCAwLjFEMCwgMC43RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC41RDAsIDAuMkQwLCAwLjhEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNTSVpFMS8wLjBEMCwgMC4zRDAsIDEuNkQwLCAzLjJEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNTSVpFMi8wLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLAorICAgICArICAgICAgICAgICAgICAgICAgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMC8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgRE8gMTIwIEtJID0gMSwgNAorICAgICAgICAgSU5DWCA9IElOQ1hTKEtJKQorICAgICAgICAgSU5DWSA9IElOQ1lTKEtJKQorICAgICAgICAgTVggPSBBQlMoSU5DWCkKKyAgICAgICAgIE1ZID0gQUJTKElOQ1kpCisqCisgICAgICAgICBETyAxMDAgS04gPSAxLCA0CisgICAgICAgICAgICBOID0gTlMoS04pCisgICAgICAgICAgICBLU0laRSA9IE1JTigyLEtOKQorICAgICAgICAgICAgTEVOWCA9IExFTlMoS04sTVgpCisgICAgICAgICAgICBMRU5ZID0gTEVOUyhLTixNWSkKKyogICAgICAgICAgIC4uIEluaXRpYWxpemUgYWxsIGFyZ3VtZW50IGFycmF5cyAuLgorICAgICAgICAgICAgRE8gMjAgSSA9IDEsIDcKKyAgICAgICAgICAgICAgIFNYKEkpID0gRFgxKEkpCisgICAgICAgICAgICAgICBTWShJKSA9IERZMShJKQorICAgMjAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIElGIChJQ0FTRS5FUS4xKSBUSEVOCisqICAgICAgICAgICAgICAuLiBERE9UIC4uCisgICAgICAgICAgICAgICBDQUxMIFNURVNUMShERE9UKE4sU1gsSU5DWCxTWSxJTkNZKSxEVDcoS04sS0kpLFNTSVpFMShLTikKKyAgICAgKyAgICAgICAgICAgICAgICAgICAgICxTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuMikgVEhFTgorKiAgICAgICAgICAgICAgLi4gREFYUFkgLi4KKyAgICAgICAgICAgICAgIENBTEwgREFYUFkoTixTQSxTWCxJTkNYLFNZLElOQ1kpCisgICAgICAgICAgICAgICBETyA0MCBKID0gMSwgTEVOWQorICAgICAgICAgICAgICAgICAgU1RZKEopID0gRFQ4KEosS04sS0kpCisgICA0MCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVChMRU5ZLFNZLFNUWSxTU0laRTIoMSxLU0laRSksU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjUpIFRIRU4KKyogICAgICAgICAgICAgIC4uIERDT1BZIC4uCisgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgNworICAgICAgICAgICAgICAgICAgU1RZKEkpID0gRFQxMFkoSSxLTixLSSkKKyAgIDYwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBDQUxMIERDT1BZKE4sU1gsSU5DWCxTWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVChMRU5ZLFNZLFNUWSxTU0laRTIoMSwxKSwxLjBEMCkKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjYpIFRIRU4KKyogICAgICAgICAgICAgIC4uIERTV0FQIC4uCisgICAgICAgICAgICAgICBDQUxMIERTV0FQKE4sU1gsSU5DWCxTWSxJTkNZKQorICAgICAgICAgICAgICAgRE8gODAgSSA9IDEsIDcKKyAgICAgICAgICAgICAgICAgIFNUWChJKSA9IERUMTBYKEksS04sS0kpCisgICAgICAgICAgICAgICAgICBTVFkoSSkgPSBEVDEwWShJLEtOLEtJKQorICAgODAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOWCxTWCxTVFgsU1NJWkUyKDEsMSksMS4wRDApCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTlksU1ksU1RZLFNTSVpFMigxLDEpLDEuMEQwKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgV1JJVEUgKE5PVVQsKikgJyBTaG91bGRuJyd0IGJlIGhlcmUgaW4gQ0hFQ0syJworICAgICAgICAgICAgICAgU1RPUAorICAgICAgICAgICAgRU5EIElGCisgIDEwMCAgICBDT05USU5VRQorICAxMjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIRUNLMyhTRkFDKQorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNGQUMKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgU0EsIFNDLCBTUworICAgICAgSU5URUdFUiAgICAgICAgICAgSSwgSywgS0ksIEtOLCBLU0laRSwgTEVOWCwgTEVOWSwgTVgsIE1ZCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIENPUFlYKDUpLCBDT1BZWSg1KSwgRFQ5WCg3LDQsNCksIERUOVkoNyw0LDQpLAorICAgICArICAgICAgICAgICAgICAgICAgRFgxKDcpLCBEWTEoNyksIE1XUEMoMTEpLCBNV1BTKDExKSwgTVdQU1RYKDUpLAorICAgICArICAgICAgICAgICAgICAgICAgTVdQU1RZKDUpLCBNV1BUWCgxMSw1KSwgTVdQVFkoMTEsNSksIE1XUFgoNSksCisgICAgICsgICAgICAgICAgICAgICAgICBNV1BZKDUpLCBTU0laRTIoMTQsMiksIFNUWCg3KSwgU1RZKDcpLCBTWCg3KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIFNZKDcpCisgICAgICBJTlRFR0VSICAgICAgICAgICBJTkNYUyg0KSwgSU5DWVMoNCksIExFTlMoNCwyKSwgTVdQSU5YKDExKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIE1XUElOWSgxMSksIE1XUE4oMTEpLCBOUyg0KQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIERST1QsIFNURVNUCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBBQlMsIE1JTgorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICBTQS8wLjNEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1hTLzEsIDIsIC0yLCAtMS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIElOQ1lTLzEsIC0yLCAxLCAtMi8KKyAgICAgIERBVEEgICAgICAgICAgICAgIExFTlMvMSwgMSwgMiwgNCwgMSwgMSwgMywgNy8KKyAgICAgIERBVEEgICAgICAgICAgICAgIE5TLzAsIDEsIDIsIDQvCisgICAgICBEQVRBICAgICAgICAgICAgICBEWDEvMC42RDAsIDAuMUQwLCAtMC41RDAsIDAuOEQwLCAwLjlEMCwgLTAuM0QwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFkxLzAuNUQwLCAtMC45RDAsIDAuM0QwLCAwLjdEMCwgLTAuNkQwLCAwLjJEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuOEQwLworICAgICAgREFUQSAgICAgICAgICAgICAgU0MsIFNTLzAuOEQwLCAwLjZEMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUOVgvMC42RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjc4RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjc4RDAsIC0wLjQ2RDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuNzhEMCwgLTAuNDZEMCwgLTAuMjJEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDEuMDZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC42RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjc4RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC42NkQwLCAwLjFEMCwgLTAuMUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuOTZEMCwgMC4xRDAsIC0wLjc2RDAsIDAuOEQwLCAwLjkwRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC4zRDAsIC0wLjAyRDAsIDAuNkQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC43OEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgLTAuMDZEMCwgMC4xRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC4xRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjkwRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjFEMCwgLTAuMjJEMCwgMC44RDAsIDAuMThEMCwgLTAuM0QwLCAtMC4wMkQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC42RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjc4RDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjc4RDAsIDAuMjZEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC43OEQwLCAwLjI2RDAsIC0wLjc2RDAsIDEuMTJEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVDlZLzAuNUQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wNEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wNEQwLCAtMC43OEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjA0RDAsIC0wLjc4RDAsIDAuNTREMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMDhEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC41RDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjA0RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjlEMCwgLTAuMTJEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjY0RDAsIC0wLjlEMCwgLTAuMzBEMCwgMC43RDAsIC0wLjE4RDAsIDAuMkQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4yOEQwLCAwLjVEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMDREMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuN0QwLCAtMS4wOEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjY0RDAsIC0xLjI2RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjU0RDAsIDAuMjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC41RDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wNEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBEMCwgMC4wNEQwLCAtMC45RDAsIDAuMThEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDAuMEQwLCAwLjA0RDAsIC0wLjlEMCwgMC4xOEQwLCAwLjdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjE4RDAsIDAuMkQwLCAwLjE2RDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBTU0laRTIvMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLCAwLjBEMCwgMC4wRDAsIDAuMEQwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRDAsIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLAorICAgICArICAgICAgICAgICAgICAgICAgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAsIDEuMTdEMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDEuMTdEMCwgMS4xN0QwLCAxLjE3RDAvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIERPIDYwIEtJID0gMSwgNAorICAgICAgICAgSU5DWCA9IElOQ1hTKEtJKQorICAgICAgICAgSU5DWSA9IElOQ1lTKEtJKQorICAgICAgICAgTVggPSBBQlMoSU5DWCkKKyAgICAgICAgIE1ZID0gQUJTKElOQ1kpCisqCisgICAgICAgICBETyA0MCBLTiA9IDEsIDQKKyAgICAgICAgICAgIE4gPSBOUyhLTikKKyAgICAgICAgICAgIEtTSVpFID0gTUlOKDIsS04pCisgICAgICAgICAgICBMRU5YID0gTEVOUyhLTixNWCkKKyAgICAgICAgICAgIExFTlkgPSBMRU5TKEtOLE1ZKQorKgorICAgICAgICAgICAgSUYgKElDQVNFLkVRLjQpIFRIRU4KKyogICAgICAgICAgICAgIC4uIERST1QgLi4KKyAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCA3CisgICAgICAgICAgICAgICAgICBTWChJKSA9IERYMShJKQorICAgICAgICAgICAgICAgICAgU1koSSkgPSBEWTEoSSkKKyAgICAgICAgICAgICAgICAgIFNUWChJKSA9IERUOVgoSSxLTixLSSkKKyAgICAgICAgICAgICAgICAgIFNUWShJKSA9IERUOVkoSSxLTixLSSkKKyAgIDIwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBDQUxMIERST1QoTixTWCxJTkNYLFNZLElOQ1ksU0MsU1MpCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTlgsU1gsU1RYLFNTSVpFMigxLEtTSVpFKSxTRkFDKQorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVChMRU5ZLFNZLFNUWSxTU0laRTIoMSxLU0laRSksU0ZBQykKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIFdSSVRFIChOT1VULCopICcgU2hvdWxkbicndCBiZSBoZXJlIGluIENIRUNLMycKKyAgICAgICAgICAgICAgIFNUT1AKKyAgICAgICAgICAgIEVORCBJRgorICAgNDAgICAgQ09OVElOVUUKKyAgIDYwIENPTlRJTlVFCisqCisgICAgICBNV1BDKDEpID0gMQorICAgICAgRE8gODAgSSA9IDIsIDExCisgICAgICAgICBNV1BDKEkpID0gMAorICAgODAgQ09OVElOVUUKKyAgICAgIE1XUFMoMSkgPSAwCisgICAgICBETyAxMDAgSSA9IDIsIDYKKyAgICAgICAgIE1XUFMoSSkgPSAxCisgIDEwMCBDT05USU5VRQorICAgICAgRE8gMTIwIEkgPSA3LCAxMQorICAgICAgICAgTVdQUyhJKSA9IC0xCisgIDEyMCBDT05USU5VRQorICAgICAgTVdQSU5YKDEpID0gMQorICAgICAgTVdQSU5YKDIpID0gMQorICAgICAgTVdQSU5YKDMpID0gMQorICAgICAgTVdQSU5YKDQpID0gLTEKKyAgICAgIE1XUElOWCg1KSA9IDEKKyAgICAgIE1XUElOWCg2KSA9IC0xCisgICAgICBNV1BJTlgoNykgPSAxCisgICAgICBNV1BJTlgoOCkgPSAxCisgICAgICBNV1BJTlgoOSkgPSAtMQorICAgICAgTVdQSU5YKDEwKSA9IDEKKyAgICAgIE1XUElOWCgxMSkgPSAtMQorICAgICAgTVdQSU5ZKDEpID0gMQorICAgICAgTVdQSU5ZKDIpID0gMQorICAgICAgTVdQSU5ZKDMpID0gLTEKKyAgICAgIE1XUElOWSg0KSA9IC0xCisgICAgICBNV1BJTlkoNSkgPSAyCisgICAgICBNV1BJTlkoNikgPSAxCisgICAgICBNV1BJTlkoNykgPSAxCisgICAgICBNV1BJTlkoOCkgPSAtMQorICAgICAgTVdQSU5ZKDkpID0gLTEKKyAgICAgIE1XUElOWSgxMCkgPSAyCisgICAgICBNV1BJTlkoMTEpID0gMQorICAgICAgRE8gMTQwIEkgPSAxLCAxMQorICAgICAgICAgTVdQTihJKSA9IDUKKyAgMTQwIENPTlRJTlVFCisgICAgICBNV1BOKDUpID0gMworICAgICAgTVdQTigxMCkgPSAzCisgICAgICBETyAxNjAgSSA9IDEsIDUKKyAgICAgICAgIE1XUFgoSSkgPSBJCisgICAgICAgICBNV1BZKEkpID0gSQorICAgICAgICAgTVdQVFgoMSxJKSA9IEkKKyAgICAgICAgIE1XUFRZKDEsSSkgPSBJCisgICAgICAgICBNV1BUWCgyLEkpID0gSQorICAgICAgICAgTVdQVFkoMixJKSA9IC1JCisgICAgICAgICBNV1BUWCgzLEkpID0gNiAtIEkKKyAgICAgICAgIE1XUFRZKDMsSSkgPSBJIC0gNgorICAgICAgICAgTVdQVFgoNCxJKSA9IEkKKyAgICAgICAgIE1XUFRZKDQsSSkgPSAtSQorICAgICAgICAgTVdQVFgoNixJKSA9IDYgLSBJCisgICAgICAgICBNV1BUWSg2LEkpID0gSSAtIDYKKyAgICAgICAgIE1XUFRYKDcsSSkgPSAtSQorICAgICAgICAgTVdQVFkoNyxJKSA9IEkKKyAgICAgICAgIE1XUFRYKDgsSSkgPSBJIC0gNgorICAgICAgICAgTVdQVFkoOCxJKSA9IDYgLSBJCisgICAgICAgICBNV1BUWCg5LEkpID0gLUkKKyAgICAgICAgIE1XUFRZKDksSSkgPSBJCisgICAgICAgICBNV1BUWCgxMSxJKSA9IEkgLSA2CisgICAgICAgICBNV1BUWSgxMSxJKSA9IDYgLSBJCisgIDE2MCBDT05USU5VRQorICAgICAgTVdQVFgoNSwxKSA9IDEKKyAgICAgIE1XUFRYKDUsMikgPSAzCisgICAgICBNV1BUWCg1LDMpID0gNQorICAgICAgTVdQVFgoNSw0KSA9IDQKKyAgICAgIE1XUFRYKDUsNSkgPSA1CisgICAgICBNV1BUWSg1LDEpID0gLTEKKyAgICAgIE1XUFRZKDUsMikgPSAyCisgICAgICBNV1BUWSg1LDMpID0gLTIKKyAgICAgIE1XUFRZKDUsNCkgPSA0CisgICAgICBNV1BUWSg1LDUpID0gLTMKKyAgICAgIE1XUFRYKDEwLDEpID0gLTEKKyAgICAgIE1XUFRYKDEwLDIpID0gLTMKKyAgICAgIE1XUFRYKDEwLDMpID0gLTUKKyAgICAgIE1XUFRYKDEwLDQpID0gNAorICAgICAgTVdQVFgoMTAsNSkgPSA1CisgICAgICBNV1BUWSgxMCwxKSA9IDEKKyAgICAgIE1XUFRZKDEwLDIpID0gMgorICAgICAgTVdQVFkoMTAsMykgPSAyCisgICAgICBNV1BUWSgxMCw0KSA9IDQKKyAgICAgIE1XUFRZKDEwLDUpID0gMworICAgICAgRE8gMjAwIEkgPSAxLCAxMQorICAgICAgICAgSU5DWCA9IE1XUElOWChJKQorICAgICAgICAgSU5DWSA9IE1XUElOWShJKQorICAgICAgICAgRE8gMTgwIEsgPSAxLCA1CisgICAgICAgICAgICBDT1BZWChLKSA9IE1XUFgoSykKKyAgICAgICAgICAgIENPUFlZKEspID0gTVdQWShLKQorICAgICAgICAgICAgTVdQU1RYKEspID0gTVdQVFgoSSxLKQorICAgICAgICAgICAgTVdQU1RZKEspID0gTVdQVFkoSSxLKQorICAxODAgICAgQ09OVElOVUUKKyAgICAgICAgIENBTEwgRFJPVChNV1BOKEkpLENPUFlYLElOQ1gsQ09QWVksSU5DWSxNV1BDKEkpLE1XUFMoSSkpCisgICAgICAgICBDQUxMIFNURVNUKDUsQ09QWVgsTVdQU1RYLE1XUFNUWCxTRkFDKQorICAgICAgICAgQ0FMTCBTVEVTVCg1LENPUFlZLE1XUFNUWSxNV1BTVFksU0ZBQykKKyAgMjAwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTVEVTVChMRU4sU0NPTVAsU1RSVUUsU1NJWkUsU0ZBQykKKyogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTVEVTVCAqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgVEhJUyBTVUJSIENPTVBBUkVTIEFSUkFZUyAgU0NPTVAoKSBBTkQgU1RSVUUoKSBPRiBMRU5HVEggTEVOIFRPCisqICAgICBTRUUgSUYgVEhFIFRFUk0gQlkgVEVSTSBESUZGRVJFTkNFUywgTVVMVElQTElFRCBCWSBTRkFDLCBBUkUKKyogICAgIE5FR0xJR0lCTEUuCisqCisqICAgICBDLiBMLiBMQVdTT04sIEpQTCwgMTk3NCBERUMgMTAKKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTRkFDCisgICAgICBJTlRFR0VSICAgICAgICAgIExFTgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNDT01QKExFTiksIFNTSVpFKExFTiksIFNUUlVFKExFTikKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gU0QKKyAgICAgIElOVEVHRVIgICAgICAgICAgSQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNESUZGCisgICAgICBFWFRFUk5BTCAgICAgICAgIFNESUZGCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgIEFCUworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIERPIDQwIEkgPSAxLCBMRU4KKyAgICAgICAgIFNEID0gU0NPTVAoSSkgLSBTVFJVRShJKQorICAgICAgICAgSUYgKFNESUZGKEFCUyhTU0laRShJKSkrQUJTKFNGQUMqU0QpLEFCUyhTU0laRShJKSkpLkVRLjAuMEQwKQorICAgICArICAgICAgIEdPIFRPIDQwCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVJFICAgIFNDT01QKEkpIElTIE5PVCBDTE9TRSBUTyBTVFJVRShJKS4KKyoKKyAgICAgICAgIElGICggLk5PVC4gUEFTUykgR08gVE8gMjAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UIEZBSUwgTUVTU0FHRSBBTkQgSEVBREVSLgorICAgICAgICAgUEFTUyA9IC5GQUxTRS4KKyAgICAgICAgIFdSSVRFIChOT1VULDk5OTk5KQorICAgICAgICAgV1JJVEUgKE5PVVQsOTk5OTgpCisgICAyMCAgICBXUklURSAoTk9VVCw5OTk5NykgSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIEksIFNDT01QKEkpLAorICAgICArICAgICBTVFJVRShJKSwgU0QsIFNTSVpFKEkpCisgICA0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCis5OTk5OSBGT1JNQVQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMJykKKzk5OTk4IEZPUk1BVCAoLycgQ0FTRSAgTiBJTkNYIElOQ1kgTU9ERSAgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLAorICAgICArICAgICAgICcgQ09NUChJKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRShJKSAgRElGRkVSRU5DRScsCisgICAgICsgICAgICAgJyAgICAgU0laRShJKScsLzFYKQorOTk5OTcgRk9STUFUICgxWCxJNCxJMywzSTUsSTMsMkQzNi44LDJEMTIuNCkKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTVEVTVDEoU0NPTVAxLFNUUlVFMSxTU0laRSxTRkFDKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKiBTVEVTVDEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgIFRISVMgSVMgQU4gSU5URVJGQUNFIFNVQlJPVVRJTkUgVE8gQUNDT01PREFURSBUSEUgRk9SVFJBTgorKiAgICAgUkVRVUlSRU1FTlQgVEhBVCBXSEVOIEEgRFVNTVkgQVJHVU1FTlQgSVMgQU4gQVJSQVksIFRIRQorKiAgICAgQUNUVUFMIEFSR1VNRU5UIE1VU1QgQUxTTyBCRSBBTiBBUlJBWSBPUiBBTiBBUlJBWSBFTEVNRU5ULgorKgorKiAgICAgQy5MLiBMQVdTT04sIEpQTCwgMTk3OCBERUMgNgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgU0NPTVAxLCBTRkFDLCBTVFJVRTEKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgU1NJWkUoKikKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgU0NPTVAoMSksIFNUUlVFKDEpCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgU1RFU1QKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgU0NPTVAoMSkgPSBTQ09NUDEKKyAgICAgIFNUUlVFKDEpID0gU1RSVUUxCisgICAgICBDQUxMIFNURVNUKDEsU0NPTVAsU1RSVUUsU1NJWkUsU0ZBQykKKyoKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBET1VCTEUgUFJFQ0lTSU9OIEZVTkNUSU9OIFNESUZGKFNBLFNCKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNESUZGICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICBDT01QVVRFUyBESUZGRVJFTkNFIE9GIFRXTyBOVU1CRVJTLiAgQy4gTC4gTEFXU09OLCBKUEwgMTk3NCBGRUIgMTUKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICAgICAgICAgICAgICAgU0EsIFNCCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFNESUZGID0gU0EgLSBTQgorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgSVRFU1QxKElDT01QLElUUlVFKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElURVNUMSAqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlJPVVRJTkUgQ09NUEFSRVMgVEhFIFZBUklBQkxFUyBJQ09NUCBBTkQgSVRSVUUgRk9SCisqICAgICBFUVVBTElUWS4KKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDT01QLCBJVFJVRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJRAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBJRiAoSUNPTVAuRVEuSVRSVUUpIEdPIFRPIDQwCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgSUNPTVAgSVMgTk9UIEVRVUFMIFRPIElUUlVFLgorKgorICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwIElEID0gSUNPTVAgLSBJVFJVRQorICAgICAgV1JJVEUgKE5PVVQsOTk5OTcpIElDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBJQ09NUCwgSVRSVUUsIElECisgICA0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCis5OTk5OSBGT1JNQVQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMJykKKzk5OTk4IEZPUk1BVCAoLycgQ0FTRSAgTiBJTkNYIElOQ1kgTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLAorICAgICArICAgICAgICcgQ09NUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSAgICAgRElGRkVSRU5DRScsCisgICAgICsgICAgICAgLzFYKQorOTk5OTcgRk9STUFUICgxWCxJNCxJMywzSTUsMkkzNixJMTIpCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9kYmxhdDIuZGF0IGIvYmxhcy90ZXN0aW5nL2RibGF0Mi5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1NWI4MwotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9kYmxhdDIuZGF0CkBAIC0wLDAgKzEsMzQgQEAKKydkYmxhdDIuc3VtbScgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisnZGJsYXQyLnNuYXAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCistMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KK1QgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKzYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKzQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSworMCAxIDIgNCAgICAgICAgICAgVkFMVUVTIE9GIEsKKzQgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorMSAyIC0xIC0yICAgICAgICAgVkFMVUVTIE9GIElOQ1ggQU5EIElOQ1kKKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKzAuMCAxLjAgMC43ICAgICAgIFZBTFVFUyBPRiBBTFBIQQorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCiswLjAgMS4wIDAuOSAgICAgICBWQUxVRVMgT0YgQkVUQQorREdFTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RHQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEU1lNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFNCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RTUE1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEVFJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFRCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RUUE1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEVFJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFRCU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RUUFNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitER0VSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFNZUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RTUFIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEU1lSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFNQUjIgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9kYmxhdDIuZiBiL2JsYXMvdGVzdGluZy9kYmxhdDIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAyZDQzCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL2RibGF0Mi5mCkBAIC0wLDAgKzEsMzEzOCBAQAorICAgICAgUFJPR1JBTSBEQkxBVDIKKyoKKyogIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIERPVUJMRSBQUkVDSVNJT04gTGV2ZWwgMiBCbGFzLgorKgorKiAgVGhlIHByb2dyYW0gbXVzdCBiZSBkcml2ZW4gYnkgYSBzaG9ydCBkYXRhIGZpbGUuIFRoZSBmaXJzdCAxOCByZWNvcmRzCisqICBvZiB0aGUgZmlsZSBhcmUgcmVhZCB1c2luZyBsaXN0LWRpcmVjdGVkIGlucHV0LCB0aGUgbGFzdCAxNiByZWNvcmRzCisqICBhcmUgcmVhZCB1c2luZyB0aGUgZm9ybWF0ICggQTYsIEwyICkuIEFuIGFubm90YXRlZCBleGFtcGxlIG9mIGEgZGF0YQorKiAgZmlsZSBjYW4gYmUgb2J0YWluZWQgYnkgZGVsZXRpbmcgdGhlIGZpcnN0IDMgY2hhcmFjdGVycyBmcm9tIHRoZQorKiAgZm9sbG93aW5nIDM0IGxpbmVzOgorKiAgJ0RCTEFUMi5TVU1NJyAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCisqICA2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKyogICdEQkxBVDIuU05BUCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKyogIC0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKKyogIEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KKyogIEYgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorKiAgVCAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisqICAxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworKiAgNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCisqICAwIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorKiAgNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBLCisqICAwIDEgMiA0ICAgICAgICAgICBWQUxVRVMgT0YgSworKiAgNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisqICAxIDIgLTEgLTIgICAgICAgICBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorKiAgMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorKiAgMC4wIDEuMCAwLjcgICAgICAgVkFMVUVTIE9GIEFMUEhBCisqICAzICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKyogIDAuMCAxLjAgMC45ICAgICAgIFZBTFVFUyBPRiBCRVRBCisqICBER0VNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgREdCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIERTWU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBEU0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgRFNQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIERUUk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBEVEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgRFRQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIERUUlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBEVEJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgRFRQU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIERHRVIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBEU1lSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgRFNQUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIERTWVIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBEU1BSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKgorKiAgICAgU2VlOgorKgorKiAgICAgICAgRG9uZ2FycmEgSi4gSi4sIER1IENyb3ogSi4gSi4sIEhhbW1hcmxpbmcgUy4gIGFuZCBIYW5zb24gUi4gSi4uCisqICAgICAgICBBbiAgZXh0ZW5kZWQgIHNldCBvZiBGb3J0cmFuICBCYXNpYyBMaW5lYXIgQWxnZWJyYSBTdWJwcm9ncmFtcy4KKyoKKyogICAgICAgIFRlY2huaWNhbCAgTWVtb3JhbmRhICBOb3MuIDQxIChyZXZpc2lvbiAzKSBhbmQgODEsICBNYXRoZW1hdGljcworKiAgICAgICAgYW5kICBDb21wdXRlciBTY2llbmNlICBEaXZpc2lvbiwgIEFyZ29ubmUgIE5hdGlvbmFsIExhYm9yYXRvcnksCisqICAgICAgICA5NzAwIFNvdXRoIENhc3MgQXZlbnVlLCBBcmdvbm5lLCBJbGxpbm9pcyA2MDQzOSwgVVMuCisqCisqICAgICAgICBPcgorKgorKiAgICAgICAgTkFHICBUZWNobmljYWwgUmVwb3J0cyBUUjMvODcgYW5kIFRSNC84NywgIE51bWVyaWNhbCBBbGdvcml0aG1zCisqICAgICAgICBHcm91cCAgTHRkLiwgIE5BRyAgQ2VudHJhbCAgT2ZmaWNlLCAgMjU2ICBCYW5idXJ5ICBSb2FkLCBPeGZvcmQKKyogICAgICAgIE9YMiA3REUsIFVLLCAgYW5kICBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBJbmMuLCAgMTEwMSAgMzFzdAorKiAgICAgICAgU3RyZWV0LCAgU3VpdGUgMTAwLCAgRG93bmVycyBHcm92ZSwgIElsbGlub2lzIDYwNTE1LTEyNjMsICBVU0EuCisqCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU4KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JTiA9IDUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5TVUJTCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOU1VCUyA9IDE2ICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCwgSEFMRiA9IDAuNUQwLCBPTkUgPSAxLjBEMCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTk1BWCwgSU5DTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOTUFYID0gNjUsIElOQ01BWCA9IDIgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTk1BWCwgTklETUFYLCBOS0JNQVgsIE5BTE1BWCwgTkJFTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOSU5NQVggPSA3LCBOSURNQVggPSA5LCBOS0JNQVggPSA3LAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BTE1BWCA9IDcsIE5CRU1BWCA9IDcgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgRVJSLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJU05VTSwgSiwgTiwgTkFMRiwgTkJFVCwgTklESU0sIE5JTkMsIE5LQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIExURVNUVCwgUkVXSSwgU0FNRSwgU0ZBVEFMLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBUU1RFUlIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FVAorICAgICAgQ0hBUkFDVEVSKjMyICAgICAgIFNOQVBTLCBTVU1NUlkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFMRiggTkFMTUFYICksIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBHKCBOTUFYICksIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFkoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggMipOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURNQVggKSwgSU5DKCBOSU5NQVggKSwgS0IoIE5LQk1BWCApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFRFU1QoIE5TVUJTICkKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVMoIE5TVUJTICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIERESUZGCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTERFCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgRERJRkYsIExERQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBEQ0hLMSwgRENISzIsIERDSEszLCBEQ0hLNCwgRENISzUsIERDSEs2LAorICAgICAkICAgICAgICAgICAgICAgICAgIERDSEtFLCBETVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBTTkFNRVMvJ0RHRU1WICcsICdER0JNViAnLCAnRFNZTVYgJywgJ0RTQk1WICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0RTUE1WICcsICdEVFJNViAnLCAnRFRCTVYgJywgJ0RUUE1WICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0RUUlNWICcsICdEVEJTViAnLCAnRFRQU1YgJywgJ0RHRVIgICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0RTWVIgICcsICdEU1BSICAnLCAnRFNZUjIgJywgJ0RTUFIyICcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHN1bW1hcnkgb3V0cHV0IGZpbGUgYW5kIG9wZW4gZmlsZS4KKyoKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU1VNTVJZCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5PVVQKKyAgICAgIE9QRU4oIE5PVVQsIEZJTEUgPSBTVU1NUlksIFNUQVRVUyA9ICdORVcnICkKKyAgICAgIE5PVVRDID0gTk9VVAorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc25hcHNob3Qgb3V0cHV0IGZpbGUgYW5kIG9wZW4gZmlsZS4KKyoKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU05BUFMKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTlRSQQorICAgICAgVFJBQ0UgPSBOVFJBLkdFLjAKKyAgICAgIElGKCBUUkFDRSApVEhFTgorICAgICAgICAgT1BFTiggTlRSQSwgRklMRSA9IFNOQVBTLCBTVEFUVVMgPSAnTkVXJyApCisgICAgICBFTkQgSUYKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHJld2luZGluZyBvZiB0aGUgc25hcHNob3QgZmlsZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApUkVXSQorICAgICAgUkVXSSA9IFJFV0kuQU5ELlRSQUNFCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgZGlyZWN0cyBzdG9wcGluZyBvbiBhbnkgZmFpbHVyZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU0ZBVEFMCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgZXJyb3IgZXhpdHMgYXJlIHRvIGJlIHRlc3RlZC4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVFNURVJSCisqICAgICBSZWFkIHRoZSB0aHJlc2hvbGQgdmFsdWUgb2YgdGhlIHRlc3QgcmF0aW8KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVEhSRVNICisqCisqICAgICBSZWFkIGFuZCBjaGVjayB0aGUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHRlc3RzLgorKgorKiAgICAgVmFsdWVzIG9mIE4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklESU0KKyAgICAgIElGKCBOSURJTS5MVC4xLk9SLk5JRElNLkdULk5JRE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdOJywgTklETUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElESU0oIEkgKSwgSSA9IDEsIE5JRElNICkKKyAgICAgIERPIDEwIEkgPSAxLCBOSURJTQorICAgICAgICAgSUYoIElESU0oIEkgKS5MVC4wLk9SLklESU0oIEkgKS5HVC5OTUFYIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApTk1BWAorICAgICAgICAgICAgR08gVE8gMjMwCisgICAgICAgICBFTkQgSUYKKyAgIDEwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgSworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOS0IKKyAgICAgIElGKCBOS0IuTFQuMS5PUi5OS0IuR1QuTktCTUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ0snLCBOS0JNQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggS0IoIEkgKSwgSSA9IDEsIE5LQiApCisgICAgICBETyAyMCBJID0gMSwgTktCCisgICAgICAgICBJRiggS0IoIEkgKS5MVC4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApCisgICAgICAgICAgICBHTyBUTyAyMzAKKyAgICAgICAgIEVORCBJRgorICAgMjAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBJTkNYIGFuZCBJTkNZCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5JTkMKKyAgICAgIElGKCBOSU5DLkxULjEuT1IuTklOQy5HVC5OSU5NQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknSU5DWCBBTkQgSU5DWScsIE5JTk1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBJTkMoIEkgKSwgSSA9IDEsIE5JTkMgKQorICAgICAgRE8gMzAgSSA9IDEsIE5JTkMKKyAgICAgICAgIElGKCBJTkMoIEkgKS5FUS4wLk9SLkFCUyggSU5DKCBJICkgKS5HVC5JTkNNQVggKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClJTkNNQVgKKyAgICAgICAgICAgIEdPIFRPIDIzMAorICAgICAgICAgRU5EIElGCisgICAzMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIEFMUEhBCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5BTEYKKyAgICAgIElGKCBOQUxGLkxULjEuT1IuTkFMRi5HVC5OQUxNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknQUxQSEEnLCBOQUxNQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggQUxGKCBJICksIEkgPSAxLCBOQUxGICkKKyogICAgIFZhbHVlcyBvZiBCRVRBCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5CRVQKKyAgICAgIElGKCBOQkVULkxULjEuT1IuTkJFVC5HVC5OQkVNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknQkVUQScsIE5CRU1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBCRVQoIEkgKSwgSSA9IDEsIE5CRVQgKQorKgorKiAgICAgUmVwb3J0IHZhbHVlcyBvZiBwYXJhbWV0ZXJzLgorKgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTEgKSggS0IoIEkgKSwgSSA9IDEsIE5LQiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MCApKCBJTkMoIEkgKSwgSSA9IDEsIE5JTkMgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKSggQUxGKCBJICksIEkgPSAxLCBOQUxGICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg4ICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisgICAgICBJRiggLk5PVC5UU1RFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTgwICkKKyAgICAgIEVORCBJRgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVRIUkVTSAorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorKgorKiAgICAgUmVhZCBuYW1lcyBvZiBzdWJyb3V0aW5lcyBhbmQgZmxhZ3Mgd2hpY2ggaW5kaWNhdGUKKyogICAgIHdoZXRoZXIgdGhleSBhcmUgdG8gYmUgdGVzdGVkLgorKgorICAgICAgRE8gNDAgSSA9IDEsIE5TVUJTCisgICAgICAgICBMVEVTVCggSSApID0gLkZBTFNFLgorICAgNDAgQ09OVElOVUUKKyAgIDUwIFJFQUQoIE5JTiwgRk1UID0gOTk4NCwgRU5EID0gODAgKVNOQU1FVCwgTFRFU1RUCisgICAgICBETyA2MCBJID0gMSwgTlNVQlMKKyAgICAgICAgIElGKCBTTkFNRVQuRVEuU05BTUVTKCBJICkgKQorICAgICAkICAgICAgR08gVE8gNzAKKyAgIDYwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NiApU05BTUVUCisgICAgICBTVE9QCisgICA3MCBMVEVTVCggSSApID0gTFRFU1RUCisgICAgICBHTyBUTyA1MAorKgorICAgODAgQ09OVElOVUUKKyAgICAgIENMT1NFICggTklOICkKKyoKKyogICAgIENvbXB1dGUgRVBTICh0aGUgbWFjaGluZSBwcmVjaXNpb24pLgorKgorICAgICAgRVBTID0gT05FCisgICA5MCBDT05USU5VRQorICAgICAgSUYoIERESUZGKCBPTkUgKyBFUFMsIE9ORSApLkVRLlpFUk8gKQorICAgICAkICAgR08gVE8gMTAwCisgICAgICBFUFMgPSBIQUxGKkVQUworICAgICAgR08gVE8gOTAKKyAgMTAwIENPTlRJTlVFCisgICAgICBFUFMgPSBFUFMgKyBFUFMKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClFUFMKKyoKKyogICAgIENoZWNrIHRoZSByZWxpYWJpbGl0eSBvZiBETVZDSCB1c2luZyBleGFjdCBkYXRhLgorKgorICAgICAgTiA9IE1JTiggMzIsIE5NQVggKQorICAgICAgRE8gMTIwIEogPSAxLCBOCisgICAgICAgICBETyAxMTAgSSA9IDEsIE4KKyAgICAgICAgICAgIEEoIEksIEogKSA9IE1BWCggSSAtIEogKyAxLCAwICkKKyAgMTEwICAgIENPTlRJTlVFCisgICAgICAgICBYKCBKICkgPSBKCisgICAgICAgICBZKCBKICkgPSBaRVJPCisgIDEyMCBDT05USU5VRQorICAgICAgRE8gMTMwIEogPSAxLCBOCisgICAgICAgICBZWSggSiApID0gSiooICggSiArIDEgKSpKICkvMiAtICggKCBKICsgMSApKkoqKCBKIC0gMSApICkvMworICAxMzAgQ09OVElOVUUKKyogICAgIFlZIGhvbGRzIHRoZSBleGFjdCByZXN1bHQuIE9uIGV4aXQgZnJvbSBETVZDSCBZVCBob2xkcworKiAgICAgdGhlIHJlc3VsdCBjb21wdXRlZCBieSBETVZDSC4KKyAgICAgIFRSQU5TID0gJ04nCisgICAgICBDQUxMIERNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBYLCAxLCBaRVJPLCBZLCAxLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgIFlZLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTERFKCBZWSwgWVQsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODUgKVRSQU5TLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorICAgICAgVFJBTlMgPSAnVCcKKyAgICAgIENBTEwgRE1WQ0goIFRSQU5TLCBOLCBOLCBPTkUsIEEsIE5NQVgsIFgsIC0xLCBaRVJPLCBZLCAtMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExERSggWVksIFlULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg1IClUUkFOUywgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyoKKyogICAgIFRlc3QgZWFjaCBzdWJyb3V0aW5lIGluIHR1cm4uCisqCisgICAgICBETyAyMTAgSVNOVU0gPSAxLCBOU1VCUworICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgSUYoIC5OT1QuTFRFU1QoIElTTlVNICkgKVRIRU4KKyogICAgICAgICAgIFN1YnByb2dyYW0gaXMgbm90IHRvIGJlIHRlc3RlZC4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTgzIClTTkFNRVMoIElTTlVNICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFNSTkFNVCA9IFNOQU1FUyggSVNOVU0gKQorKiAgICAgICAgICAgVGVzdCBlcnJvciBleGl0cy4KKyAgICAgICAgICAgIElGKCBUU1RFUlIgKVRIRU4KKyAgICAgICAgICAgICAgIENBTEwgRENIS0UoIElTTlVNLCBTTkFNRVMoIElTTlVNICksIE5PVVQgKQorICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBUZXN0IGNvbXB1dGF0aW9ucy4KKyAgICAgICAgICAgIElORk9UID0gMAorICAgICAgICAgICAgT0sgPSAuVFJVRS4KKyAgICAgICAgICAgIEZBVEFMID0gLkZBTFNFLgorICAgICAgICAgICAgR08gVE8gKCAxNDAsIDE0MCwgMTUwLCAxNTAsIDE1MCwgMTYwLCAxNjAsCisgICAgICQgICAgICAgICAgICAgIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTcwLCAxODAsIDE4MCwKKyAgICAgJCAgICAgICAgICAgICAgMTkwLCAxOTAgKUlTTlVNCisqICAgICAgICAgICBUZXN0IERHRU1WLCAwMSwgYW5kIERHQk1WLCAwMi4KKyAgMTQwICAgICAgIENBTEwgRENISzEoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOQUxGLCBBTEYsCisgICAgICQgICAgICAgICAgICAgICAgICBOQkVULCBCRVQsIE5JTkMsIElOQywgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsCisgICAgICQgICAgICAgICAgICAgICAgICBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcgKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IERTWU1WLCAwMywgRFNCTVYsIDA0LCBhbmQgRFNQTVYsIDA1LgorICAxNTAgICAgICAgQ0FMTCBEQ0hLMiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5CRVQsIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRyApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgRFRSTVYsIDA2LCBEVEJNViwgMDcsIERUUE1WLCAwOCwKKyogICAgICAgICAgIERUUlNWLCAwOSwgRFRCU1YsIDEwLCBhbmQgRFRQU1YsIDExLgorICAxNjAgICAgICAgQ0FMTCBEQ0hLMyggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5JTkMsIElOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBZLCBZWSwgWVMsIFlULCBHLCBaICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBER0VSLCAxMi4KKyAgMTcwICAgICAgIENBTEwgRENISzQoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFlULCBHLCBaICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBEU1lSLCAxMywgYW5kIERTUFIsIDE0LgorICAxODAgICAgICAgQ0FMTCBEQ0hLNSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IERTWVIyLCAxNSwgYW5kIERTUFIyLCAxNi4KKyAgMTkwICAgICAgIENBTEwgRENISzYoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFlULCBHLCBaICkKKyoKKyAgMjAwICAgICAgIElGKCBGQVRBTC5BTkQuU0ZBVEFMICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDIyMAorICAgICAgICAgRU5EIElGCisgIDIxMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODIgKQorICAgICAgR08gVE8gMjQwCisqCisgIDIyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODEgKQorICAgICAgR08gVE8gMjQwCisqCisgIDIzMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODcgKQorKgorICAyNDAgQ09OVElOVUUKKyAgICAgIElGKCBUUkFDRSApCisgICAgICQgICBDTE9TRSAoIE5UUkEgKQorICAgICAgQ0xPU0UgKCBOT1VUICkKKyAgICAgIFNUT1AKKyoKKyA5OTk5IEZPUk1BVCggJyBST1VUSU5FUyBQQVNTIENPTVBVVEFUSU9OQUwgVEVTVFMgSUYgVEVTVCBSQVRJTyBJUyBMRVMnLAorICAgICAkICAgICAgJ1MgVEhBTicsIEY4LjIgKQorIDk5OTggRk9STUFUKCAnIFJFTEFUSVZFIE1BQ0hJTkUgUFJFQ0lTSU9OIElTIFRBS0VOIFRPIEJFJywgMVAsIEQ5LjEgKQorIDk5OTcgRk9STUFUKCAnIE5VTUJFUiBPRiBWQUxVRVMgT0YgJywgQSwgJyBJUyBMRVNTIFRIQU4gMSBPUiBHUkVBVEVSICcsCisgICAgICQgICAgICAnVEhBTiAnLCBJMiApCisgOTk5NiBGT1JNQVQoICcgVkFMVUUgT0YgTiBJUyBMRVNTIFRIQU4gMCBPUiBHUkVBVEVSIFRIQU4gJywgSTIgKQorIDk5OTUgRk9STUFUKCAnIFZBTFVFIE9GIEsgSVMgTEVTUyBUSEFOIDAnICkKKyA5OTk0IEZPUk1BVCggJyBBQlNPTFVURSBWQUxVRSBPRiBJTkNYIE9SIElOQ1kgSVMgMCBPUiBHUkVBVEVSIFRIQU4gJywKKyAgICAgJCAgICAgIEkyICkKKyA5OTkzIEZPUk1BVCggJyBURVNUUyBPRiBUSEUgRE9VQkxFIFBSRUNJU0lPTiBMRVZFTCAyIEJMQVMnLCAvLycgVEhFIEYnLAorICAgICAkICAgICAgJ09MTE9XSU5HIFBBUkFNRVRFUiBWQUxVRVMgV0lMTCBCRSBVU0VEOicgKQorIDk5OTIgRk9STUFUKCAnICAgRk9SIE4gICAgICAgICAgICAgICcsIDlJNiApCisgOTk5MSBGT1JNQVQoICcgICBGT1IgSyAgICAgICAgICAgICAgJywgN0k2ICkKKyA5OTkwIEZPUk1BVCggJyAgIEZPUiBJTkNYIEFORCBJTkNZICAnLCA3STYgKQorIDk5ODkgRk9STUFUKCAnICAgRk9SIEFMUEhBICAgICAgICAgICcsIDdGNi4xICkKKyA5OTg4IEZPUk1BVCggJyAgIEZPUiBCRVRBICAgICAgICAgICAnLCA3RjYuMSApCisgOTk4NyBGT1JNQVQoICcgQU1FTkQgREFUQSBGSUxFIE9SIElOQ1JFQVNFIEFSUkFZIFNJWkVTIElOIFBST0dSQU0nLAorICAgICAkICAgICAgLycgKioqKioqKiBURVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5ODYgRk9STUFUKCAnIFNVQlBST0dSQU0gTkFNRSAnLCBBNiwgJyBOT1QgUkVDT0dOSVpFRCcsIC8nICoqKioqKiogVCcsCisgICAgICQgICAgICAnRVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5ODUgRk9STUFUKCAnIEVSUk9SIElOIERNVkNIIC0gIElOLUxJTkUgRE9UIFBST0RVQ1RTIEFSRSBCRUlORyBFVkFMVScsCisgICAgICQgICAgICAnQVRFRCBXUk9OR0xZLicsIC8nIERNVkNIIFdBUyBDQUxMRUQgV0lUSCBUUkFOUyA9ICcsIEExLAorICAgICAkICAgICAgJyBBTkQgUkVUVVJORUQgU0FNRSA9ICcsIEwxLCAnIEFORCBFUlIgPSAnLCBGMTIuMywgJy4nLCAvCisgICAgICQgICAnIFRISVMgTUFZIEJFIERVRSBUTyBGQVVMVFMgSU4gVEhFIEFSSVRITUVUSUMgT1IgVEhFIENPTVBJTEVSLicKKyAgICAgJCAgICAgICwgLycgKioqKioqKiBURVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5ODQgRk9STUFUKCBBNiwgTDIgKQorIDk5ODMgRk9STUFUKCAxWCwgQTYsICcgV0FTIE5PVCBURVNURUQnICkKKyA5OTgyIEZPUk1BVCggLycgRU5EIE9GIFRFU1RTJyApCisgOTk4MSBGT1JNQVQoIC8nICoqKioqKiogRkFUQUwgRVJST1IgLSBURVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5ODAgRk9STUFUKCAnIEVSUk9SLUVYSVRTIFdJTEwgTk9UIEJFIFRFU1RFRCcgKQorKgorKiAgICAgRW5kIG9mIERCTEFUMi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBEQ0hLMSggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLCBOQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyoKKyogIFRlc3RzIERHRU1WIGFuZCBER0JNVi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIEhBTEYKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCwgSEFMRiA9IDAuNUQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTkJFVCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBHKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICksIEtCKCBOS0IgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUywgRVJSLCBFUlJNQVgsIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUMsIElLVSwgSU0sIElOLCBJTkNYLCBJTkNYUywgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJTkNZUywgSVgsIElZLCBLTCwgS0xTLCBLVSwgS1VTLCBMQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREFTLCBMWCwgTFksIE0sIE1MLCBNUywgTiwgTkFSR1MsIE5DLCBORCwgTkssCisgICAgICQgICAgICAgICAgICAgICAgICAgTkwsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQkFOREVELCBGVUxMLCBOVUxMLCBSRVNFVCwgU0FNRSwgVFJBTgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMREUsIExERVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExERSwgTERFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERHQk1WLCBER0VNViwgRE1BS0UsIERNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ05UQycvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidFJworICAgICAgQkFOREVEID0gU05BTUUoIDM6IDMgKS5FUS4nQicKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDExCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTMKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTIwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisgICAgICAgICBORCA9IE4vMiArIDEKKyoKKyAgICAgICAgIERPIDExMCBJTSA9IDEsIDIKKyAgICAgICAgICAgIElGKCBJTS5FUS4xICkKKyAgICAgJCAgICAgICAgIE0gPSBNQVgoIE4gLSBORCwgMCApCisgICAgICAgICAgICBJRiggSU0uRVEuMiApCisgICAgICQgICAgICAgICBNID0gTUlOKCBOICsgTkQsIE5NQVggKQorKgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTksgPSBOS0IKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIE5LID0gMQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxMDAgSUtVID0gMSwgTksKKyAgICAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIEtVID0gS0IoIElLVSApCisgICAgICAgICAgICAgICAgICBLTCA9IE1BWCggS1UgLSAxLCAwICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEtVID0gTiAtIDEKKyAgICAgICAgICAgICAgICAgIEtMID0gTSAtIDEKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICBMREEgPSBLTCArIEtVICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTERBID0gTQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgRE1BS0UoIFNOQU1FKCAyOiAzICksICcgJywgJyAnLCBNLCBOLCBBLCBOTUFYLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIExEQSwgS0wsIEtVLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgIERPIDkwIElDID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnLk9SLlRSQU5TLkVRLidDJworKgorICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIE1MID0gTgorICAgICAgICAgICAgICAgICAgICAgTkwgPSBNCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBNTCA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5MID0gTgorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTkwKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOTCwgWCwgMSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1ggKSwgMCwgTkwgLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgICAgIElGKCBOTC5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBYKCBOTC8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTkwvMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBETyA3MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTUwKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE1MLCBZLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEFCUyggSU5DWSApLCAwLCBNTCAtIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0xTID0gS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtVUyA9IEtVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBER0VNViggVFJBTlMsIE0sIE4sIEFMUEhBLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1gsIEJFVEEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEtMLCBLVSwgQUxQSEEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERHQk1WKCBUUkFOUywgTSwgTiwgS0wsIEtVLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIFhYLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERFUkVTKCAnR0UnLCAnICcsIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MLCBZUywgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLTFMuRVEuS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLVVMuRVEuS1UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExERSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExERSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExERVJFUyggJ0dFJywgJyAnLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTCwgWVMsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMyApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETVZDSCggVFJBTlMsIE0sIE4sIEFMUEhBLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgWCwgSU5DWCwgQkVUQSwgWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ksIFlULCBHLCBZWSwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBNLmxlLjAgb3IKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICBDT05USU5VRQorKgorICAxMjAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE0MAorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFRSQU5TLCBNLCBOLCBBTFBIQSwgTERBLAorICAgICAkICAgICAgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBUUkFOUywgTSwgTiwgS0wsIEtVLAorICAgICAkICAgICAgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDE0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDQoIEkzLCAnLCcgKSwgRjQuMSwKKyAgICAgJCAgICAgICcsIEEsJywgSTMsICcsIFgsJywgSTIsICcsJywgRjQuMSwgJywgWSwnLCBJMiwgJykgLicgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCAyKCBJMywgJywnICksIEY0LjEsCisgICAgICQgICAgICAnLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCcsIEY0LjEsICcsIFksJywgSTIsCisgICAgICQgICAgICAnKSAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIERDSEsxLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIERDSEsyKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOQUxGLCBBTEYsIE5CRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBCRVQsIE5JTkMsIElOQywgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgWFMsIFksIFlZLCBZUywgWVQsIEcgKQorKgorKiAgVGVzdHMgRFNZTVYsIERTQk1WIGFuZCBEU1BNVi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIEhBTEYKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCwgSEFMRiA9IDAuNUQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTkJFVCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBHKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICksIEtCKCBOS0IgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUywgRVJSLCBFUlJNQVgsIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUMsIElLLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksCisgICAgICQgICAgICAgICAgICAgICAgICAgSU5DWVMsIElYLCBJWSwgSywgS1MsIExBQSwgTERBLCBMREFTLCBMWCwgTFksCisgICAgICQgICAgICAgICAgICAgICAgICAgTiwgTkFSR1MsIE5DLCBOSywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBCQU5ERUQsIEZVTEwsIE5VTEwsIFBBQ0tFRCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExERSwgTERFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTERFLCBMREVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgRE1BS0UsIERNVkNILCBEU0JNViwgRFNQTVYsIERTWU1WCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidZJworICAgICAgQkFOREVEID0gU05BTUUoIDM6IDMgKS5FUS4nQicKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSAxMAorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDExCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOQorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMTAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyoKKyAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgRE8gMTAwIElLID0gMSwgTksKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIEsgPSBLQiggSUsgKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSyA9IE4gLSAxCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTERBID0gSyArIDEKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExEQSA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElDID0gMSwgMgorICAgICAgICAgICAgICAgVVBMTyA9IElDSCggSUM6IElDICkKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgRE1BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwgTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gNzAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk4KKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgTiwgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFNZTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgTERBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBLLCBBTFBIQSwgTERBLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFNCTVYoIFVQTE8sIE4sIEssIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBBTFBIQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFNQTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgWFgsIElOQ1gsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBLCBZWSwgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMREUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExERSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExERSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERFUkVTKCAnR0UnLCAnICcsIDEsIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVMsIFlZLCBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExERSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExERSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExERVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUywgWVksIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMREUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMREUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREUoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExERVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTLCBZWSwgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETVZDSCggJ04nLCBOLCBOLCBBTFBIQSwgQSwgTk1BWCwgWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFksIElOQ1ksIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTi5sZS4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBMREEsIElOQ1gsCisgICAgICQgICAgICBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIEssIEFMUEhBLCBMREEsCisgICAgICQgICAgICBJTkNYLCBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLAorICAgICAkICAgICAgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIEFQJywKKyAgICAgJCAgICAgICcsIFgsJywgSTIsICcsJywgRjQuMSwgJywgWSwnLCBJMiwgJykgICAgICAgICAgICAgICAgLicgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCAyKCBJMywgJywnICksIEY0LjEsCisgICAgICQgICAgICAnLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCcsIEY0LjEsICcsIFksJywgSTIsCisgICAgICQgICAgICAnKSAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgQSwnLAorICAgICAkICAgICAgSTMsICcsIFgsJywgSTIsICcsJywgRjQuMSwgJywgWSwnLCBJMiwgJykgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgRENISzIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENISzMoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFhULCBHLCBaICkKKyoKKyogIFRlc3RzIERUUk1WLCBEVEJNViwgRFRQTVYsIERUUlNWLCBEVEJTViBhbmQgRFRQU1YuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCwgSEFMRiA9IDAuNUQwLCBPTkUgPSAxLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5JRElNLCBOSU5DLCBOS0IsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBHKCBOTUFYICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWiggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICksIEtCKCBOS0IgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYLCBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQ0QsIElDVCwgSUNVLCBJSywgSU4sIElOQ1gsIElOQ1hTLCBJWCwgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBLUywgTEFBLCBMREEsIExEQVMsIExYLCBOLCBOQVJHUywgTkMsIE5LLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEJBTkRFRCwgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIERJQUcsIERJQUdTLCBUUkFOUywgVFJBTlNTLCBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSEQsIElDSFUKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0hUCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTERFLCBMREVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMREUsIExERVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBETUFLRSwgRE1WQ0gsIERUQk1WLCBEVEJTViwgRFRQTVYsIERUUFNWLAorICAgICAkICAgICAgICAgICAgICAgICAgIERUUk1WLCBEVFJTVgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFUvJ1VMJy8sIElDSFQvJ05UQycvLCBJQ0hELydVTicvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidSJworICAgICAgQkFOREVEID0gU05BTUUoIDM6IDMgKS5FUS4nQicKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSA4CisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDcKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKiAgICAgU2V0IHVwIHplcm8gdmVjdG9yIGZvciBETVZDSC4KKyAgICAgIERPIDEwIEkgPSAxLCBOTUFYCisgICAgICAgICBaKCBJICkgPSBaRVJPCisgICAxMCBDT05USU5VRQorKgorICAgICAgRE8gMTEwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqCisgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICBOSyA9IE5LQgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTksgPSAxCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDEwMCBJSyA9IDEsIE5LCisgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICBLID0gS0IoIElLICkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEsgPSBOIC0gMQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIExEQSA9IEsgKyAxCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMREEgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisqCisgICAgICAgICAgICBETyA5MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisqCisgICAgICAgICAgICAgICAgICBETyA3MCBJQ0QgPSAxLCAyCisgICAgICAgICAgICAgICAgICAgICBESUFHID0gSUNIRCggSUNEOiBJQ0QgKQorKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgRElBRywgTiwgTiwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgRElBR1MgPSBESUFHCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01WJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFRSTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBMREEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERUQk1WKCBVUExPLCBUUkFOUywgRElBRywgTiwgSywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFhYLCBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFRQTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU1YnIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBEVFJTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFRCU1YoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBEVFBTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gRElBRy5FUS5ESUFHUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREVSRVMoICdHRScsICcgJywgMSwgTiwgWFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExERVJFUyggJ0dFJywgJyAnLCAxLCBOLCBYUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExERSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERFUkVTKCAnR0UnLCAnICcsIDEsIE4sIFhTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBBQlMoIElOQ1ggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNVicgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCwgWkVSTywgWiwgSU5DWCwgWFQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ1NWJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBhcHByb3hpbWF0aW9uIHRvIG9yaWdpbmFsIHZlY3Rvci4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYWCggMSArICggSSAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWCApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gWCggSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIFpFUk8sIFgsIElOQ1gsIFhULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgIENPTlRJTlVFCisqCisgIDExMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwKKyAgICAgJCAgICAgIElOQ1gKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssCisgICAgICQgICAgICBMREEsIElOQ1gKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIElOQ1gKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDMoICcnJycsIEExLCAnJycsJyApLCBJMywgJywgQVAsICcsCisgICAgICQgICAgICAnWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMyggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgICcgQSwnLCBJMywgJywgWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAzKCAnJycnLCBBMSwgJycnLCcgKSwgSTMsICcsIEEsJywKKyAgICAgJCAgICAgIEkzLCAnLCBYLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIERDSEszLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIERDSEs0KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICBaICkKKyoKKyogIFRlc3RzIERHRVIuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCwgSEFMRiA9IDAuNUQwLCBPTkUgPSAxLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5BTEYsIE5JRElNLCBOSU5DLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEcoIE5NQVggKSwgWCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhTKCBOTUFYKklOQ01BWCApLCBYWCggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZKCBOTUFYICksIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBBTFMsIEVSUiwgRVJSTUFYLCBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSU0sIElOLCBJTkNYLCBJTkNYUywgSU5DWSwgSU5DWVMsIElYLAorICAgICAkICAgICAgICAgICAgICAgICAgIElZLCBKLCBMQUEsIExEQSwgTERBUywgTFgsIExZLCBNLCBNUywgTiwgTkFSR1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkMsIE5ELCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIE5VTEwsIFJFU0VULCBTQU1FCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBXKCAxICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTERFLCBMREVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMREUsIExERVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBER0VSLCBETUFLRSwgRE1WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWCwgTUlOCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgTkFSR1MgPSA5CisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMjAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyAgICAgICAgIE5EID0gTi8yICsgMQorKgorICAgICAgICAgRE8gMTEwIElNID0gMSwgMgorICAgICAgICAgICAgSUYoIElNLkVRLjEgKQorICAgICAkICAgICAgICAgTSA9IE1BWCggTiAtIE5ELCAwICkKKyAgICAgICAgICAgIElGKCBJTS5FUS4yICkKKyAgICAgJCAgICAgICAgIE0gPSBNSU4oIE4gKyBORCwgTk1BWCApCisqCisqICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQSA9IE0KKyAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLk0uTEUuMAorKgorICAgICAgICAgICAgRE8gMTAwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpNCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTSwgWCwgMSwgWFgsIEFCUyggSU5DWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgMCwgTSAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgSUYoIE0uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgWCggTS8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTS8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDkwIElZID0gMSwgTklOQworICAgICAgICAgICAgICAgICAgSU5DWSA9IElOQyggSVkgKQorICAgICAgICAgICAgICAgICAgTFkgPSBBQlMoIElOQ1kgKSpOCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFkuCisqCisgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWSwgMSwgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSwgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgWSggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBZWSggMSArIEFCUyggSU5DWSApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgIERPIDgwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoIFNOQU1FKCAyOiAzICksICcgJywgJyAnLCBNLCBOLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSwgTSAtIDEsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMWQorICAgICAgICAgICAgICAgICAgICAgICAgWVMoIEkgKSA9IFlZKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNZUyA9IElOQ1kKKyoKKyogICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgTSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYLCBJTkNZLCBMREEKKyAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICBDQUxMIERHRVIoIE0sIE4sIEFMUEhBLCBYWCwgSU5DWCwgWVksIElOQ1ksIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICBMREEgKQorKgorKiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE0MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMREUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREUoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERFUkVTKCAnR0UnLCAnICcsIE0sIE4sIEFTLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERBUy5FUS5MREEKKyoKKyogICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1guR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFgoIEkgKQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBNIC0gSSArIDEgKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNZLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IFkoIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gWSggTiAtIEogKyAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETVZDSCggJ04nLCBNLCAxLCBBTFBIQSwgWiwgTk1BWCwgVywgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQSggMSwgSiApLCAxLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBKCAxICsgKCBKIC0gMSApKkxEQSApLCBFUFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgNzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE0ubGUuMCBvciBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgQ09OVElOVUUKKyoKKyAgMTIwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNTAKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxNDAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgTSwgTiwgQUxQSEEsIElOQ1gsIElOQ1ksIExEQQorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoIEkzLCAnLCcgKSwgRjQuMSwgJywgWCwnLCBJMiwKKyAgICAgJCAgICAgICcsIFksJywgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgRENISzQuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENISzUoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgRFNZUiBhbmQgRFNQUi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBIQUxGID0gMC41RDAsIE9ORSA9IDEuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTklESU0sIE5JTkMsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgRyggTk1BWCApLCBYKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFMoIE5NQVgqSU5DTUFYICksIFhYKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFkoIE5NQVggKSwgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEFMUywgRVJSLCBFUlJNQVgsIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQywgSU4sIElOQ1gsIElOQ1hTLCBJWCwgSiwgSkEsIEpKLCBMQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMSiwgTFgsIE4sIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBXKCAxICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTERFLCBMREVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMREUsIExERVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBETUFLRSwgRE1WQ0gsIERTUFIsIERTWVIKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ1knCisgICAgICBQQUNLRUQgPSBTTkFNRSggMzogMyApLkVRLidQJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNworICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDYKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQSA9IE4KKyAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMDAKKyAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBETyA5MCBJQyA9IDEsIDIKKyAgICAgICAgICAgIFVQTE8gPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyA3MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisgICAgICAgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLkFMUEhBLkVRLlpFUk8KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIE4gLSAxLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisqCisqICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgQUxQSEEsIElOQ1gsIExEQQorICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgRFNZUiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgRFNQUiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBBQSApCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IExERSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMREVSRVMoIFNOQU1FKCAyOiAzICksIFVQTE8sIE4sIE4sIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5QQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDMwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNYLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBJICkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggTiAtIEkgKyAxICkKKyAgIDUwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgIEpBID0gMQorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IFooIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNVkNIKCAnTicsIExKLCAxLCBBTFBIQSwgWiggSkogKSwgTEosIFcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBPTkUsIEEoIEpKLCBKICksIDEsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEoIEpBICksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTEoKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyBpZiBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICBJRiggTi5MRS4wICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA3MCAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgIENPTlRJTlVFCisqCisgIDEwMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDExMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwgTERBCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYCisgICAgICBFTkQgSUYKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgWCwnLAorICAgICAkICAgICAgSTIsICcsIEFQKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgWCwnLAorICAgICAkICAgICAgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgRENISzUuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENISzYoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgRFNZUjIgYW5kIERTUFIyLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgWkVSTywgSEFMRiwgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wRDAsIEhBTEYgPSAwLjVEMCwgT05FID0gMS4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOSURJTSwgTklOQywgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBHKCBOTUFYICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggTk1BWCwgMiApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBTFBIQSwgQUxTLCBFUlIsIEVSUk1BWCwgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElDLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksIElOQ1lTLCBJWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJWSwgSiwgSkEsIEpKLCBMQUEsIExEQSwgTERBUywgTEosIExYLCBMWSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRSwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgVyggMiApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExERSwgTERFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTERFLCBMREVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgRE1BS0UsIERNVkNILCBEU1BSMiwgRFNZUjIKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ1knCisgICAgICBQQUNLRUQgPSBTTkFNRSggMzogMyApLkVRLidQJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDgKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTQwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQSA9IE4KKyAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxNDAKKyAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBETyAxMzAgSUMgPSAxLCAyCisgICAgICAgICAgICBVUExPID0gSUNIKCBJQzogSUMgKQorICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgRE8gMTIwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpOCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWCwgMSwgWFgsIEFCUyggSU5DWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDExMCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTgorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFkoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgWVkoIDEgKyBBQlMoIElOQ1kgKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyAxMDAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorICAgICAgICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5BTFBIQS5FUS5aRVJPCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBQSwgTERBLCBOIC0gMSwgTiAtIDEsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMWQorICAgICAgICAgICAgICAgICAgICAgICAgWVMoIEkgKSA9IFlZKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNZUyA9IElOQ1kKKyoKKyogICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWSwgTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBEU1lSMiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYLCBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBEU1BSMiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE2MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTERFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExERSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExERVJFUyggU05BTUUoIDI6IDMgKSwgVVBMTywgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUywgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNjAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1guR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDEgKSA9IFgoIEkgKQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAxICkgPSBYKCBOIC0gSSArIDEgKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1kuR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDIgKSA9IFkoIEkgKQorICAgNzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAyICkgPSBZKCBOIC0gSSArIDEgKQorICAgODAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBETyA5MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gWiggSiwgMiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAyICkgPSBaKCBKLCAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETVZDSCggJ04nLCBMSiwgMiwgQUxQSEEsIFooIEpKLCAxICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBXLCAxLCBPTkUsIEEoIEpKLCBKICksIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVCwgRywgQUEoIEpBICksIEVQUywgRVJSLCBGQVRBTCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgOTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOLkxFLjAgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgMTAwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICAgICAgICBDT05USU5VRQorKgorICAxMjAgICAgICAgQ09OVElOVUUKKyoKKyAgMTMwICAgIENPTlRJTlVFCisqCisgIDE0MCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTcwCisqCisgIDE1MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTYwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwKKyAgICAgJCAgICAgIElOQ1ksIExEQQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDE3MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBZLCcsIEkyLCAnLCBBUCkgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBZLCcsIEkyLCAnLCBBLCcsIEkzLCAnKSAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIERDSEs2LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIERDSEtFKCBJU05VTSwgU1JOQU1ULCBOT1VUICkKKyoKKyogIFRlc3RzIHRoZSBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAyIEJsYXMuCisqICBSZXF1aXJlcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgZXJyb3ItaGFuZGxpbmcgcm91dGluZSBYRVJCTEEuCisqICBBTFBIQSwgQkVUQSwgQSwgWCBhbmQgWSBzaG91bGQgbm90IG5lZWQgdG8gYmUgZGVmaW5lZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElTTlVNLCBOT1VUCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEJFVEEKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEEoIDEsIDEgKSwgWCggMSApLCBZKCAxICkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0hLWEVSLCBER0JNViwgREdFTVYsIERHRVIsIERTQk1WLCBEU1BNViwgRFNQUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBEU1BSMiwgRFNZTVYsIERTWVIsIERTWVIyLCBEVEJNViwgRFRCU1YsIERUUE1WLAorICAgICAkICAgICAgICAgICAgICAgICAgIERUUFNWLCBEVFJNViwgRFRSU1YKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqICAgICBPSyBpcyBzZXQgdG8gLkZBTFNFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBvciBieSBDSEtYRVIKKyogICAgIGlmIGFueXRoaW5nIGlzIHdyb25nLgorICAgICAgT0sgPSAuVFJVRS4KKyogICAgIExFUlIgaXMgc2V0IHRvIC5UUlVFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBlYWNoIHRpbWUKKyogICAgIGl0IGlzIGNhbGxlZCwgYW5kIGlzIHRoZW4gdGVzdGVkIGFuZCByZS1zZXQgYnkgQ0hLWEVSLgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIEdPIFRPICggMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLAorICAgICAkICAgICAgICA5MCwgMTAwLCAxMTAsIDEyMCwgMTMwLCAxNDAsIDE1MCwKKyAgICAgJCAgICAgICAgMTYwIClJU05VTQorICAgMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIERHRU1WKCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgREdFTVYoICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgREdFTVYoICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgREdFTVYoICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBER0VNViggJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBER0VNViggJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICAyMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgREdCTVYoICcvJywgMCwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBER0JNViggJ04nLCAtMSwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBER0JNViggJ04nLCAwLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBER0JNViggJ04nLCAwLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBER0JNViggJ04nLCAyLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBER0JNViggJ04nLCAwLCAwLCAxLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBER0JNViggJ04nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBER0JNViggJ04nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICAzMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFNZTVYoICcvJywgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBEU1lNViggJ1UnLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBEU1lNViggJ1UnLCAyLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERTWU1WKCAnVScsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIERTWU1WKCAnVScsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBEU0JNViggJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERTQk1WKCAnVScsIC0xLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERTQk1WKCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERTQk1WKCAnVScsIDAsIDEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgRFNCTVYoICdVJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFNCTVYoICdVJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgNTAgSU5GT1QgPSAxCisgICAgICBDQUxMIERTUE1WKCAnLycsIDAsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFNQTVYoICdVJywgLTEsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFNQTVYoICdVJywgMCwgQUxQSEEsIEEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEU1BNViggJ1UnLCAwLCBBTFBIQSwgQSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICA2MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFRSTVYoICcvJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBEVFJNViggJ1UnLCAnLycsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERUUk1WKCAnVScsICdOJywgJy8nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgRFRSTVYoICdVJywgJ04nLCAnTicsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTVYoICdVJywgJ04nLCAnTicsIDIsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBEVFJNViggJ1UnLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICA3MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFRCTVYoICcvJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBEVEJNViggJ1UnLCAnLycsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERUQk1WKCAnVScsICdOJywgJy8nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgRFRCTVYoICdVJywgJ04nLCAnTicsIC0xLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRCTVYoICdVJywgJ04nLCAnTicsIDAsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFRCTVYoICdVJywgJ04nLCAnTicsIDAsIDEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVEJNViggJ1UnLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICA4MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFRQTVYoICcvJywgJ04nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBEVFBNViggJ1UnLCAnLycsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERUUE1WKCAnVScsICdOJywgJy8nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgRFRQTVYoICdVJywgJ04nLCAnTicsIC0xLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFRQTVYoICdVJywgJ04nLCAnTicsIDAsIEEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgOTAgSU5GT1QgPSAxCisgICAgICBDQUxMIERUUlNWKCAnLycsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFRSU1YoICdVJywgJy8nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEVFJTViggJ1UnLCAnTicsICcvJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERUUlNWKCAnVScsICdOJywgJ04nLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNWKCAnVScsICdOJywgJ04nLCAyLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgRFRSU1YoICdVJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxMDAgSU5GT1QgPSAxCisgICAgICBDQUxMIERUQlNWKCAnLycsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFRCU1YoICdVJywgJy8nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEVEJTViggJ1UnLCAnTicsICcvJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERUQlNWKCAnVScsICdOJywgJ04nLCAtMSwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUQlNWKCAnVScsICdOJywgJ04nLCAwLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERUQlNWKCAnVScsICdOJywgJ04nLCAwLCAxLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRCU1YoICdVJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIERUUFNWKCAnLycsICdOJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFRQU1YoICdVJywgJy8nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEVFBTViggJ1UnLCAnTicsICcvJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERUUFNWKCAnVScsICdOJywgJ04nLCAtMSwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERUUFNWKCAnVScsICdOJywgJ04nLCAwLCBBLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTIwIElORk9UID0gMQorICAgICAgQ0FMTCBER0VSKCAtMSwgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBER0VSKCAwLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBER0VSKCAwLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERHRVIoIDAsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgREdFUiggMiwgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxMzAgSU5GT1QgPSAxCisgICAgICBDQUxMIERTWVIoICcvJywgMCwgQUxQSEEsIFgsIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBEU1lSKCAnVScsIC0xLCBBTFBIQSwgWCwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERTWVIoICdVJywgMCwgQUxQSEEsIFgsIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lSKCAnVScsIDIsIEFMUEhBLCBYLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTQwIElORk9UID0gMQorICAgICAgQ0FMTCBEU1BSKCAnLycsIDAsIEFMUEhBLCBYLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFNQUiggJ1UnLCAtMSwgQUxQSEEsIFgsIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBEU1BSKCAnVScsIDAsIEFMUEhBLCBYLCAwLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTUwIElORk9UID0gMQorICAgICAgQ0FMTCBEU1lSMiggJy8nLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERTWVIyKCAnVScsIC0xLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERTWVIyKCAnVScsIDAsIEFMUEhBLCBYLCAwLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZUjIoICdVJywgMCwgQUxQSEEsIFgsIDEsIFksIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEU1lSMiggJ1UnLCAyLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgIDE2MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFNQUjIoICcvJywgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBEU1BSMiggJ1UnLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBEU1BSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERTUFIyKCAnVScsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisgIDE3MCBJRiggT0sgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTUk5BTVQKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTVQKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUycgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyAqKioqKicsCisgICAgICQgICAgICAnKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBETUFLRSggVFlQRSwgVVBMTywgRElBRywgTSwgTiwgQSwgTk1BWCwgQUEsIExEQSwgS0wsCisgICAgICQgICAgICAgICAgICAgICAgICBLVSwgUkVTRVQsIFRSQU5TTCApCisqCisqICBHZW5lcmF0ZXMgdmFsdWVzIGZvciBhbiBNIGJ5IE4gbWF0cml4IEEgd2l0aGluIHRoZSBiYW5kd2lkdGgKKyogIGRlZmluZWQgYnkgS0wgYW5kIEtVLgorKiAgU3RvcmVzIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IEFBIGluIHRoZSBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZAorKiAgYnkgdGhlIHJvdXRpbmUsIHdpdGggdW53YW50ZWQgZWxlbWVudHMgc2V0IHRvIHJvZ3VlIHZhbHVlLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnR0InLCAnU1knLCAnU0InLCAnU1AnLCAnVFInLCAnVEInIE9SICdUUCcuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCwgT05FID0gMS4wRDAgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJPR1VFCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBST0dVRSA9IC0xLjBEMTAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEtMLCBLVSwgTERBLCBNLCBOLCBOTUFYCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTk1BWCwgKiApLCBBQSggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSTEsIEkyLCBJMywgSUJFRywgSUVORCwgSU9GRiwgSiwgS0sKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBHRU4sIExPV0VSLCBTWU0sIFRSSSwgVU5JVCwgVVBQRVIKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIERCRUcKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBEQkVHCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYLCBNSU4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgR0VOID0gVFlQRSggMTogMSApLkVRLidHJworICAgICAgU1lNID0gVFlQRSggMTogMSApLkVRLidTJworICAgICAgVFJJID0gVFlQRSggMTogMSApLkVRLidUJworICAgICAgVVBQRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nVScKKyAgICAgIExPV0VSID0gKCBTWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ0wnCisgICAgICBVTklUID0gVFJJLkFORC5ESUFHLkVRLidVJworKgorKiAgICAgR2VuZXJhdGUgZGF0YSBpbiBhcnJheSBBLgorKgorICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBJRiggR0VOLk9SLiggVVBQRVIuQU5ELkkuTEUuSiApLk9SLiggTE9XRVIuQU5ELkkuR0UuSiApICkKKyAgICAgJCAgICAgICAgICBUSEVOCisgICAgICAgICAgICAgICBJRiggKCBJLkxFLkouQU5ELkogLSBJLkxFLktVICkuT1IuCisgICAgICQgICAgICAgICAgICAgKCBJLkdFLkouQU5ELkkgLSBKLkxFLktMICkgKVRIRU4KKyAgICAgICAgICAgICAgICAgIEEoIEksIEogKSA9IERCRUcoIFJFU0VUICkgKyBUUkFOU0wKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEEoIEksIEogKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUYoIEkuTkUuSiApVEhFTgorICAgICAgICAgICAgICAgICAgSUYoIFNZTSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gQSggSSwgSiApCisgICAgICAgICAgICAgICAgICBFTFNFIElGKCBUUkkgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEEoIEosIEkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBFTkQgSUYKKyAgIDEwICAgIENPTlRJTlVFCisgICAgICAgICBJRiggVFJJICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IEEoIEosIEogKSArIE9ORQorICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgQSggSiwgSiApID0gT05FCisgICAyMCBDT05USU5VRQorKgorKiAgICAgU3RvcmUgZWxlbWVudHMgaW4gYXJyYXkgQVMgaW4gZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQgYnkgcm91dGluZS4KKyoKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBETyAzMCBJID0gMSwgTQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidHQicgKVRIRU4KKyAgICAgICAgIERPIDkwIEogPSAxLCBOCisgICAgICAgICAgICBETyA2MCBJMSA9IDEsIEtVICsgMSAtIEoKKyAgICAgICAgICAgICAgIEFBKCBJMSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA2MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNzAgSTIgPSBJMSwgTUlOKCBLTCArIEtVICsgMSwgS1UgKyAxICsgTSAtIEogKQorICAgICAgICAgICAgICAgQUEoIEkyICsgKCBKIC0gMSApKkxEQSApID0gQSggSTIgKyBKIC0gS1UgLSAxLCBKICkKKyAgIDcwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA4MCBJMyA9IEkyLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJMyArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA4MCAgICAgICBDT05USU5VRQorICAgOTAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NZJy5PUi5UWVBFLkVRLidUUicgKVRIRU4KKyAgICAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKIC0gMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTAwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAxMDAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDExMCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgMTEwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxMjAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTIwICAgICAgIENPTlRJTlVFCisgIDEzMCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nU0InLk9SLlRZUEUuRVEuJ1RCJyApVEhFTgorICAgICAgICAgRE8gMTcwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIEtLID0gS0wgKyAxCisgICAgICAgICAgICAgICBJQkVHID0gTUFYKCAxLCBLTCArIDIgLSBKICkKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJRU5EID0gS0wKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElFTkQgPSBLTCArIDEKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgS0sgPSAxCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUJFRyA9IDIKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElFTkQgPSBNSU4oIEtMICsgMSwgMSArIE0gLSBKICkKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTQwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAxNDAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDE1MCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJICsgSiAtIEtLLCBKICkKKyAgMTUwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxNjAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTYwICAgICAgIENPTlRJTlVFCisgIDE3MCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nU1AnLk9SLlRZUEUuRVEuJ1RQJyApVEhFTgorICAgICAgICAgSU9GRiA9IDAKKyAgICAgICAgIERPIDE5MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxODAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIElPRkYgPSBJT0ZGICsgMQorICAgICAgICAgICAgICAgQUEoIElPRkYgKSA9IEEoIEksIEogKQorICAgICAgICAgICAgICAgSUYoIEkuRVEuSiApVEhFTgorICAgICAgICAgICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgICAgICAgICAgQUEoIElPRkYgKSA9IFJPR1VFCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgMTgwICAgICAgIENPTlRJTlVFCisgIDE5MCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBETUFLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBETVZDSCggVFJBTlMsIE0sIE4sIEFMUEhBLCBBLCBOTUFYLCBYLCBJTkNYLCBCRVRBLCBZLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DWSwgWVQsIEcsIFlZLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIE1WICkKKyoKKyogIENoZWNrcyB0aGUgcmVzdWx0cyBvZiB0aGUgY29tcHV0YXRpb25hbCB0ZXN0cy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBPTkUgPSAxLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEJFVEEsIEVQUywgRVJSCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DWCwgSU5DWSwgTSwgTiwgTk1BWCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBNVgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBOTUFYLCAqICksIEcoICogKSwgWCggKiApLCBZKCAqICksIFlUKCAqICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUkkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJTkNYTCwgSU5DWUwsIElZLCBKLCBKWCwgS1gsIEtZLCBNTCwgTkwKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBUUkFOCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIFNRUlQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVFJBTiA9IFRSQU5TLkVRLidUJy5PUi5UUkFOUy5FUS4nQycKKyAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICBNTCA9IE4KKyAgICAgICAgIE5MID0gTQorICAgICAgRUxTRQorICAgICAgICAgTUwgPSBNCisgICAgICAgICBOTCA9IE4KKyAgICAgIEVORCBJRgorICAgICAgSUYoIElOQ1guTFQuMCApVEhFTgorICAgICAgICAgS1ggPSBOTAorICAgICAgICAgSU5DWEwgPSAtMQorICAgICAgRUxTRQorICAgICAgICAgS1ggPSAxCisgICAgICAgICBJTkNYTCA9IDEKKyAgICAgIEVORCBJRgorICAgICAgSUYoIElOQ1kuTFQuMCApVEhFTgorICAgICAgICAgS1kgPSBNTAorICAgICAgICAgSU5DWUwgPSAtMQorICAgICAgRUxTRQorICAgICAgICAgS1kgPSAxCisgICAgICAgICBJTkNZTCA9IDEKKyAgICAgIEVORCBJRgorKgorKiAgICAgQ29tcHV0ZSBleHBlY3RlZCByZXN1bHQgaW4gWVQgdXNpbmcgZGF0YSBpbiBBLCBYIGFuZCBZLgorKiAgICAgQ29tcHV0ZSBnYXVnZXMgaW4gRy4KKyoKKyAgICAgIElZID0gS1kKKyAgICAgIERPIDMwIEkgPSAxLCBNTAorICAgICAgICAgWVQoIElZICkgPSBaRVJPCisgICAgICAgICBHKCBJWSApID0gWkVSTworICAgICAgICAgSlggPSBLWAorICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgIERPIDEwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEosIEkgKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUyggQSggSiwgSSApKlgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAxMCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgRE8gMjAgSiA9IDEsIE5MCisgICAgICAgICAgICAgICBZVCggSVkgKSA9IFlUKCBJWSApICsgQSggSSwgSiApKlgoIEpYICkKKyAgICAgICAgICAgICAgIEcoIElZICkgPSBHKCBJWSApICsgQUJTKCBBKCBJLCBKICkqWCggSlggKSApCisgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWEwKKyAgIDIwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIFlUKCBJWSApID0gQUxQSEEqWVQoIElZICkgKyBCRVRBKlkoIElZICkKKyAgICAgICAgIEcoIElZICkgPSBBQlMoIEFMUEhBICkqRyggSVkgKSArIEFCUyggQkVUQSpZKCBJWSApICkKKyAgICAgICAgIElZID0gSVkgKyBJTkNZTAorICAgMzAgQ09OVElOVUUKKyoKKyogICAgIENvbXB1dGUgdGhlIGVycm9yIHJhdGlvIGZvciB0aGlzIHJlc3VsdC4KKyoKKyAgICAgIEVSUiA9IFpFUk8KKyAgICAgIERPIDQwIEkgPSAxLCBNTAorICAgICAgICAgRVJSSSA9IEFCUyggWVQoIEkgKSAtIFlZKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWSApICkgKS9FUFMKKyAgICAgICAgIElGKCBHKCBJICkuTkUuWkVSTyApCisgICAgICQgICAgICBFUlJJID0gRVJSSS9HKCBJICkKKyAgICAgICAgIEVSUiA9IE1BWCggRVJSLCBFUlJJICkKKyAgICAgICAgIElGKCBFUlIqU1FSVCggRVBTICkuR0UuT05FICkKKyAgICAgJCAgICAgIEdPIFRPIDUwCisgICA0MCBDT05USU5VRQorKiAgICAgSWYgdGhlIGxvb3AgY29tcGxldGVzLCBhbGwgcmVzdWx0cyBhcmUgYXQgbGVhc3QgaGFsZiBhY2N1cmF0ZS4KKyAgICAgIEdPIFRPIDcwCisqCisqICAgICBSZXBvcnQgZmF0YWwgZXJyb3IuCisqCisgICA1MCBGQVRBTCA9IC5UUlVFLgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKQorICAgICAgRE8gNjAgSSA9IDEsIE1MCisgICAgICAgICBJRiggTVYgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLCBZVCggSSApLAorICAgICAkICAgICAgICAgWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUksCisgICAgICQgICAgICAgICBZWSggMSArICggSSAtIDEgKSpBQlMoIElOQ1kgKSApLCBZVCggSSApCisgICAgICAgICBFTkQgSUYKKyAgIDYwIENPTlRJTlVFCisqCisgICA3MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIENPTVBVVEVEIFJFU1VMVCBJUyBMRVNTIFRIQU4gSEFMJywKKyAgICAgJCAgICAgICdGIEFDQ1VSQVRFICoqKioqKionLCAvJyAgICAgICAgICAgRVhQRUNURUQgUkVTVUxUICAgQ09NUFUnLAorICAgICAkICAgICAgJ1RFRCBSRVNVTFQnICkKKyA5OTk4IEZPUk1BVCggMVgsIEk3LCAyRzE4LjYgKQorKgorKiAgICAgRW5kIG9mIERNVkNILgorKgorICAgICAgRU5ECisgICAgICBMT0dJQ0FMIEZVTkNUSU9OIExERSggUkksIFJKLCBMUiApCisqCisqICBUZXN0cyBpZiB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMUgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUkkoICogKSwgUkooICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRE8gMTAgSSA9IDEsIExSCisgICAgICAgICBJRiggUkkoIEkgKS5ORS5SSiggSSApICkKKyAgICAgJCAgICAgIEdPIFRPIDIwCisgICAxMCBDT05USU5VRQorICAgICAgTERFID0gLlRSVUUuCisgICAgICBHTyBUTyAzMAorICAgMjAgQ09OVElOVUUKKyAgICAgIExERSA9IC5GQUxTRS4KKyAgIDMwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExERS4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMREVSRVMoIFRZUEUsIFVQTE8sIE0sIE4sIEFBLCBBUywgTERBICkKKyoKKyogIFRlc3RzIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGluIHR3byBhcnJheXMgYXJlIGVxdWFsLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnU1knIG9yICdTUCcuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMREEsIE0sIE4KKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUEoIExEQSwgKiApLCBBUyggTERBLCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQkVHLCBJRU5ELCBKCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgVVBQRVIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDEwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAxMCAgICAgICBDT05USU5VRQorICAgMjAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NZJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIElCRUcgLSAxCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisqCisgICA2MCBDT05USU5VRQorICAgICAgTERFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExERVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExERVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBEQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgcmFuZG9tIG51bWJlcnMgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGJldHdlZW4gLTAuNSBhbmQgMC41LgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQywgTUkKKyogICAgIC4uIFNhdmUgc3RhdGVtZW50IC4uCisgICAgICBTQVZFICAgICAgICAgICAgICAgSSwgSUMsIE1JCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgREJMRQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiggUkVTRVQgKVRIRU4KKyogICAgICAgIEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgorICAgICAgICAgTUkgPSA4OTEKKyAgICAgICAgIEkgPSA3CisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIFJFU0VUID0gLkZBTFNFLgorICAgICAgRU5EIElGCisqCisqICAgICBUaGUgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIEkgaXMgYm91bmRlZCBiZXR3ZWVuIDEgYW5kIDk5OS4KKyogICAgIElmIGluaXRpYWwgSSA9IDEsMiwzLDYsNyBvciA5LCB0aGUgcGVyaW9kIHdpbGwgYmUgNTAuCisqICAgICBJZiBpbml0aWFsIEkgPSA0IG9yIDgsIHRoZSBwZXJpb2Qgd2lsbCBiZSAyNS4KKyogICAgIElmIGluaXRpYWwgSSA9IDUsIHRoZSBwZXJpb2Qgd2lsbCBiZSAxMC4KKyogICAgIElDIGlzIHVzZWQgdG8gYnJlYWsgdXAgdGhlIHBlcmlvZCBieSBza2lwcGluZyAxIHZhbHVlIG9mIEkgaW4gNi4KKyoKKyAgICAgIElDID0gSUMgKyAxCisgICAxMCBJID0gSSpNSQorICAgICAgSSA9IEkgLSAxMDAwKiggSS8xMDAwICkKKyAgICAgIElGKCBJQy5HRS41IClUSEVOCisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIEdPIFRPIDEwCisgICAgICBFTkQgSUYKKyAgICAgIERCRUcgPSBEQkxFKCBJIC0gNTAwICkvMTAwMS4wRDAKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERCRUcuCisqCisgICAgICBFTkQKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gRlVOQ1RJT04gRERJRkYoIFgsIFkgKQorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBYLCBZCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERESUZGID0gWCAtIFkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERESUZGLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorKiAgVGVzdHMgd2hldGhlciBYRVJCTEEgaGFzIGRldGVjdGVkIGFuIGVycm9yIHdoZW4gaXQgc2hvdWxkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiggLk5PVC5MRVJSIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GT1QsIFNSTkFNVAorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIExFUlIgPSAuRkFMU0UuCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKiBJTExFR0FMIFZBTFVFIE9GIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgTk9UIEQnLAorICAgICAkICAgICAgJ0VURUNURUQgQlkgJywgQTYsICcgKioqKionICkKKyoKKyogICAgIEVuZCBvZiBDSEtYRVIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWEVSQkxBKCBTUk5BTUUsIElORk8gKQorKgorKiAgVGhpcyBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgdG8gYmUgdXNlZCBvbmx5IGFzIHBhcnQgb2YKKyogIHRoZSB0ZXN0IHByb2dyYW0gZm9yIHRlc3RpbmcgZXJyb3IgZXhpdHMgZnJvbSB0aGUgTGV2ZWwgMiBCTEFTCisqICByb3V0aW5lcy4KKyoKKyogIFhFUkJMQSAgaXMgYW4gZXJyb3IgaGFuZGxlciBmb3IgdGhlIExldmVsIDIgQkxBUyByb3V0aW5lcy4KKyoKKyogIEl0IGlzIGNhbGxlZCBieSB0aGUgTGV2ZWwgMiBCTEFTIHJvdXRpbmVzIGlmIGFuIGlucHV0IHBhcmFtZXRlciBpcworKiAgaW52YWxpZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk8KKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTUUKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVCwgT0ssIExFUlIKKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvU1JOQU1DL1NSTkFNVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBMRVJSID0gLlRSVUUuCisgICAgICBJRiggSU5GTy5ORS5JTkZPVCApVEhFTgorICAgICAgICAgSUYoIElORk9ULk5FLjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPLCBJTkZPVAorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKUlORk8KKyAgICAgICAgIEVORCBJRgorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIElGKCBTUk5BTUUuTkUuU1JOQU1UIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApU1JOQU1FLCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggSU5GTyA9ICcsIEk2LCAnIElOU1RFQUQnLAorICAgICAkICAgICAgJyBPRiAnLCBJMiwgJyAqKioqKioqJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIFNSTkFNRSA9ICcsIEE2LCAnIElOU1RFJywKKyAgICAgJCAgICAgICdBRCBPRiAnLCBBNiwgJyAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwKKyAgICAgJCAgICAgICcgKioqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFhFUkJMQQorKgorICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9kYmxhdDMuZGF0IGIvYmxhcy90ZXN0aW5nL2RibGF0My5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiYzJlNgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9kYmxhdDMuZGF0CkBAIC0wLDAgKzEsMjAgQEAKKydkYmxhdDMuc3VtbScgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisnZGJsYXQzLnNuYXAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCistMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCitGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KK1QgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKzYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKzAuMCAxLjAgMC43ICAgICAgIFZBTFVFUyBPRiBBTFBIQQorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCiswLjAgMS4wIDEuMyAgICAgICBWQUxVRVMgT0YgQkVUQQorREdFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RTWU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEVFJNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorRFRSU00gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK0RTWVJLICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitEU1lSMksgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL2RibGF0My5mIGIvYmxhcy90ZXN0aW5nL2RibGF0My5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MmUwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvZGJsYXQzLmYKQEAgLTAsMCArMSwyODIzIEBACisgICAgICBQUk9HUkFNIERCTEFUMworKgorKiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgRE9VQkxFIFBSRUNJU0lPTiBMZXZlbCAzIEJsYXMuCisqCisqICBUaGUgcHJvZ3JhbSBtdXN0IGJlIGRyaXZlbiBieSBhIHNob3J0IGRhdGEgZmlsZS4gVGhlIGZpcnN0IDE0IHJlY29yZHMKKyogIG9mIHRoZSBmaWxlIGFyZSByZWFkIHVzaW5nIGxpc3QtZGlyZWN0ZWQgaW5wdXQsIHRoZSBsYXN0IDYgcmVjb3JkcworKiAgYXJlIHJlYWQgdXNpbmcgdGhlIGZvcm1hdCAoIEE2LCBMMiApLiBBbiBhbm5vdGF0ZWQgZXhhbXBsZSBvZiBhIGRhdGEKKyogIGZpbGUgY2FuIGJlIG9idGFpbmVkIGJ5IGRlbGV0aW5nIHRoZSBmaXJzdCAzIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyogIGZvbGxvd2luZyAyMCBsaW5lczoKKyogICdEQkxBVDMuU1VNTScgICAgIE5BTUUgT0YgU1VNTUFSWSBPVVRQVVQgRklMRQorKiAgNiAgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU1VNTUFSWSBGSUxFCisqICAnREJMQVQzLlNOQVAnICAgICBOQU1FIE9GIFNOQVBTSE9UIE9VVFBVVCBGSUxFCisqICAtMSAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTTkFQU0hPVCBGSUxFIChOT1QgVVNFRCBJRiAuTFQuIDApCisqICBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gUkVXSU5EIFNOQVBTSE9UIEZJTEUgQUZURVIgRUFDSCBSRUNPUkQuCisqICBGICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gU1RPUCBPTiBGQUlMVVJFUy4KKyogIFQgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBURVNUIEVSUk9SIEVYSVRTLgorKiAgMTYuMCAgICAgVEhSRVNIT0xEIFZBTFVFIE9GIFRFU1QgUkFUSU8KKyogIDYgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgTgorKiAgMCAxIDIgMyA1IDkgICAgICAgVkFMVUVTIE9GIE4KKyogIDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQUxQSEEKKyogIDAuMCAxLjAgMC43ICAgICAgIFZBTFVFUyBPRiBBTFBIQQorKiAgMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCisqICAwLjAgMS4wIDEuMyAgICAgICBWQUxVRVMgT0YgQkVUQQorKiAgREdFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIERTWU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBEVFJNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgRFRSU00gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIERTWVJLICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBEU1lSMksgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKgorKiAgU2VlOgorKgorKiAgICAgRG9uZ2FycmEgSi4gSi4sIER1IENyb3ogSi4gSi4sIER1ZmYgSS4gUy4gYW5kIEhhbW1hcmxpbmcgUy4KKyogICAgIEEgU2V0IG9mIExldmVsIDMgQmFzaWMgTGluZWFyIEFsZ2VicmEgU3VicHJvZ3JhbXMuCisqCisqICAgICBUZWNobmljYWwgTWVtb3JhbmR1bSBOby44OCAoUmV2aXNpb24gMSksIE1hdGhlbWF0aWNzIGFuZAorKiAgICAgQ29tcHV0ZXIgU2NpZW5jZSBEaXZpc2lvbiwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LCA5NzAwCisqICAgICBTb3V0aCBDYXNzIEF2ZW51ZSwgQXJnb25uZSwgSWxsaW5vaXMgNjA0MzksIFVTLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU4KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JTiA9IDUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5TVUJTCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOU1VCUyA9IDYgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBIQUxGID0gMC41RDAsIE9ORSA9IDEuMEQwICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOTUFYID0gNjUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JRE1BWCwgTkFMTUFYLCBOQkVNQVgKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JRE1BWCA9IDksIE5BTE1BWCA9IDcsIE5CRU1BWCA9IDcgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgRVJSLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJU05VTSwgSiwgTiwgTkFMRiwgTkJFVCwgTklESU0sIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTFRFU1RULCBSRVdJLCBTQU1FLCBTRkFUQUwsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgIFRTVEVSUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TQSwgVFJBTlNCCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUVUCisgICAgICBDSEFSQUNURVIqMzIgICAgICAgU05BUFMsIFNVTU1SWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUEoIE5NQVgqTk1BWCApLCBBQiggTk1BWCwgMipOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQUxGKCBOQUxNQVggKSwgQVMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCUyggTk1BWCpOTUFYICksIEMoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTk1BWCpOTUFYICksIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBHKCBOTUFYICksIFcoIDIqTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklETUFYICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMVEVTVCggTlNVQlMgKQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FUyggTlNVQlMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRERJRkYKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMREUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBERElGRiwgTERFCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERDSEsxLCBEQ0hLMiwgRENISzMsIERDSEs0LCBEQ0hLNSwgRENIS0UsIERNTUNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBTTkFNRVMvJ0RHRU1NICcsICdEU1lNTSAnLCAnRFRSTU0gJywgJ0RUUlNNICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ0RTWVJLICcsICdEU1lSMksnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBSZWFkIG5hbWUgYW5kIHVuaXQgbnVtYmVyIGZvciBzdW1tYXJ5IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNVTU1SWQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOT1VUCisgICAgICBPUEVOKCBOT1VULCBGSUxFID0gU1VNTVJZLCBTVEFUVVMgPSAnTkVXJyApCisgICAgICBOT1VUQyA9IE5PVVQKKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHNuYXBzaG90IG91dHB1dCBmaWxlIGFuZCBvcGVuIGZpbGUuCisqCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNOQVBTCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5UUkEKKyAgICAgIFRSQUNFID0gTlRSQS5HRS4wCisgICAgICBJRiggVFJBQ0UgKVRIRU4KKyAgICAgICAgIE9QRU4oIE5UUkEsIEZJTEUgPSBTTkFQUywgU1RBVFVTID0gJ05FVycgKQorICAgICAgRU5EIElGCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgZGlyZWN0cyByZXdpbmRpbmcgb2YgdGhlIHNuYXBzaG90IGZpbGUuCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVJFV0kKKyAgICAgIFJFV0kgPSBSRVdJLkFORC5UUkFDRQorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgc3RvcHBpbmcgb24gYW55IGZhaWx1cmUuCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVNGQVRBTAorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGVycm9yIGV4aXRzIGFyZSB0byBiZSB0ZXN0ZWQuCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVRTVEVSUgorKiAgICAgUmVhZCB0aGUgdGhyZXNob2xkIHZhbHVlIG9mIHRoZSB0ZXN0IHJhdGlvCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKVRIUkVTSAorKgorKiAgICAgUmVhZCBhbmQgY2hlY2sgdGhlIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSB0ZXN0cy4KKyoKKyogICAgIFZhbHVlcyBvZiBOCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5JRElNCisgICAgICBJRiggTklESU0uTFQuMS5PUi5OSURJTS5HVC5OSURNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknTicsIE5JRE1BWAorICAgICAgICAgR08gVE8gMjIwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBETyAxMCBJID0gMSwgTklESU0KKyAgICAgICAgIElGKCBJRElNKCBJICkuTFQuMC5PUi5JRElNKCBJICkuR1QuTk1BWCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKU5NQVgKKyAgICAgICAgICAgIEdPIFRPIDIyMAorICAgICAgICAgRU5EIElGCisgICAxMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIEFMUEhBCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5BTEYKKyAgICAgIElGKCBOQUxGLkxULjEuT1IuTkFMRi5HVC5OQUxNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknQUxQSEEnLCBOQUxNQVgKKyAgICAgICAgIEdPIFRPIDIyMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggQUxGKCBJICksIEkgPSAxLCBOQUxGICkKKyogICAgIFZhbHVlcyBvZiBCRVRBCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5CRVQKKyAgICAgIElGKCBOQkVULkxULjEuT1IuTkJFVC5HVC5OQkVNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknQkVUQScsIE5CRU1BWAorICAgICAgICAgR08gVE8gMjIwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBCRVQoIEkgKSwgSSA9IDEsIE5CRVQgKQorKgorKiAgICAgUmVwb3J0IHZhbHVlcyBvZiBwYXJhbWV0ZXJzLgorKgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKSggQUxGKCBJICksIEkgPSAxLCBOQUxGICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisgICAgICBJRiggLk5PVC5UU1RFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg0ICkKKyAgICAgIEVORCBJRgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVRIUkVTSAorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorKgorKiAgICAgUmVhZCBuYW1lcyBvZiBzdWJyb3V0aW5lcyBhbmQgZmxhZ3Mgd2hpY2ggaW5kaWNhdGUKKyogICAgIHdoZXRoZXIgdGhleSBhcmUgdG8gYmUgdGVzdGVkLgorKgorICAgICAgRE8gMjAgSSA9IDEsIE5TVUJTCisgICAgICAgICBMVEVTVCggSSApID0gLkZBTFNFLgorICAgMjAgQ09OVElOVUUKKyAgIDMwIFJFQUQoIE5JTiwgRk1UID0gOTk4OCwgRU5EID0gNjAgKVNOQU1FVCwgTFRFU1RUCisgICAgICBETyA0MCBJID0gMSwgTlNVQlMKKyAgICAgICAgIElGKCBTTkFNRVQuRVEuU05BTUVTKCBJICkgKQorICAgICAkICAgICAgR08gVE8gNTAKKyAgIDQwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MCApU05BTUVUCisgICAgICBTVE9QCisgICA1MCBMVEVTVCggSSApID0gTFRFU1RUCisgICAgICBHTyBUTyAzMAorKgorICAgNjAgQ09OVElOVUUKKyAgICAgIENMT1NFICggTklOICkKKyoKKyogICAgIENvbXB1dGUgRVBTICh0aGUgbWFjaGluZSBwcmVjaXNpb24pLgorKgorICAgICAgRVBTID0gT05FCisgICA3MCBDT05USU5VRQorICAgICAgSUYoIERESUZGKCBPTkUgKyBFUFMsIE9ORSApLkVRLlpFUk8gKQorICAgICAkICAgR08gVE8gODAKKyAgICAgIEVQUyA9IEhBTEYqRVBTCisgICAgICBHTyBUTyA3MAorICAgODAgQ09OVElOVUUKKyAgICAgIEVQUyA9IEVQUyArIEVQUworICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUVQUworKgorKiAgICAgQ2hlY2sgdGhlIHJlbGlhYmlsaXR5IG9mIERNTUNIIHVzaW5nIGV4YWN0IGRhdGEuCisqCisgICAgICBOID0gTUlOKCAzMiwgTk1BWCApCisgICAgICBETyAxMDAgSiA9IDEsIE4KKyAgICAgICAgIERPIDkwIEkgPSAxLCBOCisgICAgICAgICAgICBBQiggSSwgSiApID0gTUFYKCBJIC0gSiArIDEsIDAgKQorICAgOTAgICAgQ09OVElOVUUKKyAgICAgICAgIEFCKCBKLCBOTUFYICsgMSApID0gSgorICAgICAgICAgQUIoIDEsIE5NQVggKyBKICkgPSBKCisgICAgICAgICBDKCBKLCAxICkgPSBaRVJPCisgIDEwMCBDT05USU5VRQorICAgICAgRE8gMTEwIEogPSAxLCBOCisgICAgICAgICBDQyggSiApID0gSiooICggSiArIDEgKSpKICkvMiAtICggKCBKICsgMSApKkoqKCBKIC0gMSApICkvMworICAxMTAgQ09OVElOVUUKKyogICAgIENDIGhvbGRzIHRoZSBleGFjdCByZXN1bHQuIE9uIGV4aXQgZnJvbSBETU1DSCBDVCBob2xkcworKiAgICAgdGhlIHJlc3VsdCBjb21wdXRlZCBieSBETU1DSC4KKyAgICAgIFRSQU5TQSA9ICdOJworICAgICAgVFJBTlNCID0gJ04nCisgICAgICBDQUxMIERNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTERFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKVRSQU5TQSwgVFJBTlNCLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorICAgICAgVFJBTlNCID0gJ1QnCisgICAgICBDQUxMIERNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTERFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKVRSQU5TQSwgVFJBTlNCLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorICAgICAgRE8gMTIwIEogPSAxLCBOCisgICAgICAgICBBQiggSiwgTk1BWCArIDEgKSA9IE4gLSBKICsgMQorICAgICAgICAgQUIoIDEsIE5NQVggKyBKICkgPSBOIC0gSiArIDEKKyAgMTIwIENPTlRJTlVFCisgICAgICBETyAxMzAgSiA9IDEsIE4KKyAgICAgICAgIENDKCBOIC0gSiArIDEgKSA9IEoqKCAoIEogKyAxICkqSiApLzIgLQorICAgICAkICAgICAgICAgICAgICAgICAgICAgKCAoIEogKyAxICkqSiooIEogLSAxICkgKS8zCisgIDEzMCBDT05USU5VRQorICAgICAgVFJBTlNBID0gJ1QnCisgICAgICBUUkFOU0IgPSAnTicKKyAgICAgIENBTEwgRE1NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMREUoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5aRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBUUkFOU0IgPSAnVCcKKyAgICAgIENBTEwgRE1NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMREUoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5aRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisqCisqICAgICBUZXN0IGVhY2ggc3Vicm91dGluZSBpbiB0dXJuLgorKgorICAgICAgRE8gMjAwIElTTlVNID0gMSwgTlNVQlMKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgIElGKCAuTk9ULkxURVNUKCBJU05VTSApIClUSEVOCisqICAgICAgICAgICBTdWJwcm9ncmFtIGlzIG5vdCB0byBiZSB0ZXN0ZWQuCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NyApU05BTUVTKCBJU05VTSApCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBTUk5BTVQgPSBTTkFNRVMoIElTTlVNICkKKyogICAgICAgICAgIFRlc3QgZXJyb3IgZXhpdHMuCisgICAgICAgICAgICBJRiggVFNURVJSIClUSEVOCisgICAgICAgICAgICAgICBDQUxMIERDSEtFKCBJU05VTSwgU05BTUVTKCBJU05VTSApLCBOT1VUICkKKyAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgVGVzdCBjb21wdXRhdGlvbnMuCisgICAgICAgICAgICBJTkZPVCA9IDAKKyAgICAgICAgICAgIE9LID0gLlRSVUUuCisgICAgICAgICAgICBGQVRBTCA9IC5GQUxTRS4KKyAgICAgICAgICAgIEdPIFRPICggMTQwLCAxNTAsIDE2MCwgMTYwLCAxNzAsIDE4MCApSVNOVU0KKyogICAgICAgICAgIFRlc3QgREdFTU0sIDAxLgorICAxNDAgICAgICAgQ0FMTCBEQ0hLMSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIENDLCBDUywgQ1QsIEcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IERTWU1NLCAwMi4KKyAgMTUwICAgICAgIENBTEwgRENISzIoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIEMsCisgICAgICQgICAgICAgICAgICAgICAgICBDQywgQ1MsIENULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBEVFJNTSwgMDMsIERUUlNNLCAwNC4KKyAgMTYwICAgICAgIENBTEwgRENISzMoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5NQVgsIEFCLAorICAgICAkICAgICAgICAgICAgICAgICAgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDVCwgRywgQyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgRFNZUkssIDA1LgorICAxNzAgICAgICAgQ0FMTCBEQ0hLNCggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIENDLCBDUywgQ1QsIEcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IERTWVIySywgMDYuCisgIDE4MCAgICAgICBDQUxMIERDSEs1KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcsIFcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqCisgIDE5MCAgICAgICBJRiggRkFUQUwuQU5ELlNGQVRBTCApCisgICAgICQgICAgICAgICBHTyBUTyAyMTAKKyAgICAgICAgIEVORCBJRgorICAyMDAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg2ICkKKyAgICAgIEdPIFRPIDIzMAorKgorICAyMTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg1ICkKKyAgICAgIEdPIFRPIDIzMAorKgorICAyMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkxICkKKyoKKyAgMjMwIENPTlRJTlVFCisgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgQ0xPU0UgKCBOVFJBICkKKyAgICAgIENMT1NFICggTk9VVCApCisgICAgICBTVE9QCisqCisgOTk5OSBGT1JNQVQoICcgUk9VVElORVMgUEFTUyBDT01QVVRBVElPTkFMIFRFU1RTIElGIFRFU1QgUkFUSU8gSVMgTEVTJywKKyAgICAgJCAgICAgICdTIFRIQU4nLCBGOC4yICkKKyA5OTk4IEZPUk1BVCggJyBSRUxBVElWRSBNQUNISU5FIFBSRUNJU0lPTiBJUyBUQUtFTiBUTyBCRScsIDFQLCBEOS4xICkKKyA5OTk3IEZPUk1BVCggJyBOVU1CRVIgT0YgVkFMVUVTIE9GICcsIEEsICcgSVMgTEVTUyBUSEFOIDEgT1IgR1JFQVRFUiAnLAorICAgICAkICAgICAgJ1RIQU4gJywgSTIgKQorIDk5OTYgRk9STUFUKCAnIFZBTFVFIE9GIE4gSVMgTEVTUyBUSEFOIDAgT1IgR1JFQVRFUiBUSEFOICcsIEkyICkKKyA5OTk1IEZPUk1BVCggJyBURVNUUyBPRiBUSEUgRE9VQkxFIFBSRUNJU0lPTiBMRVZFTCAzIEJMQVMnLCAvLycgVEhFIEYnLAorICAgICAkICAgICAgJ09MTE9XSU5HIFBBUkFNRVRFUiBWQUxVRVMgV0lMTCBCRSBVU0VEOicgKQorIDk5OTQgRk9STUFUKCAnICAgRk9SIE4gICAgICAgICAgICAgICcsIDlJNiApCisgOTk5MyBGT1JNQVQoICcgICBGT1IgQUxQSEEgICAgICAgICAgJywgN0Y2LjEgKQorIDk5OTIgRk9STUFUKCAnICAgRk9SIEJFVEEgICAgICAgICAgICcsIDdGNi4xICkKKyA5OTkxIEZPUk1BVCggJyBBTUVORCBEQVRBIEZJTEUgT1IgSU5DUkVBU0UgQVJSQVkgU0laRVMgSU4gUFJPR1JBTScsCisgICAgICQgICAgICAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk5MCBGT1JNQVQoICcgU1VCUFJPR1JBTSBOQU1FICcsIEE2LCAnIE5PVCBSRUNPR05JWkVEJywgLycgKioqKioqKiBUJywKKyAgICAgJCAgICAgICdFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4OSBGT1JNQVQoICcgRVJST1IgSU4gRE1NQ0ggLSAgSU4tTElORSBET1QgUFJPRFVDVFMgQVJFIEJFSU5HIEVWQUxVJywKKyAgICAgJCAgICAgICdBVEVEIFdST05HTFkuJywgLycgRE1NQ0ggV0FTIENBTExFRCBXSVRIIFRSQU5TQSA9ICcsIEExLAorICAgICAkICAgICAgJyBBTkQgVFJBTlNCID0gJywgQTEsIC8nIEFORCBSRVRVUk5FRCBTQU1FID0gJywgTDEsICcgQU5EICcsCisgICAgICQgICAgICAnRVJSID0gJywgRjEyLjMsICcuJywgLycgVEhJUyBNQVkgQkUgRFVFIFRPIEZBVUxUUyBJTiBUSEUgJywKKyAgICAgJCAgICAgICdBUklUSE1FVElDIE9SIFRIRSBDT01QSUxFUi4nLCAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAnLAorICAgICAkICAgICAgJyoqKioqKionICkKKyA5OTg4IEZPUk1BVCggQTYsIEwyICkKKyA5OTg3IEZPUk1BVCggMVgsIEE2LCAnIFdBUyBOT1QgVEVTVEVEJyApCisgOTk4NiBGT1JNQVQoIC8nIEVORCBPRiBURVNUUycgKQorIDk5ODUgRk9STUFUKCAvJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg0IEZPUk1BVCggJyBFUlJPUi1FWElUUyBXSUxMIE5PVCBCRSBURVNURUQnICkKKyoKKyogICAgIEVuZCBvZiBEQkxBVDMuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENISzEoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQSwgQUEsIEFTLCBCLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcgKQorKgorKiAgVGVzdHMgREdFTU0uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUywgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDQSwgSUNCLCBJSywgSU0sIElOLCBLLCBLUywgTEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgIExCQiwgTENDLCBMREEsIExEQVMsIExEQiwgTERCUywgTERDLCBMRENTLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgIE1BLCBNQiwgTVMsIE4sIE5BLCBOQVJHUywgTkIsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOQSwgVFJBTkIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOQVMsIFRSQU5CUywgVFJBTlNBLCBUUkFOU0IKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0gKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMREUsIExERVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExERSwgTERFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERHRU1NLCBETUFLRSwgRE1NQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydOVEMnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDEzCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMTAgSU0gPSAxLCBOSURJTQorICAgICAgICAgTSA9IElESU0oIElNICkKKyoKKyAgICAgICAgIERPIDEwMCBJTiA9IDEsIE5JRElNCisgICAgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREMgPSBNCisgICAgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICBMQ0MgPSBMREMqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICAgICBETyA4MCBJQ0EgPSAxLCAzCisgICAgICAgICAgICAgICAgICBUUkFOU0EgPSBJQ0goIElDQTogSUNBICkKKyAgICAgICAgICAgICAgICAgIFRSQU5BID0gVFJBTlNBLkVRLidUJy5PUi5UUkFOU0EuRVEuJ0MnCisqCisgICAgICAgICAgICAgICAgICBJRiggVFJBTkEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIE1BID0gSworICAgICAgICAgICAgICAgICAgICAgTkEgPSBNCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBNQSA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5BID0gSworICAgICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgICAgIExEQSA9IE1BCisgICAgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgICAgR08gVE8gODAKKyAgICAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQSwgTk1BWCwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgIERPIDcwIElDQiA9IDEsIDMKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TQiA9IElDSCggSUNCOiBJQ0IgKQorICAgICAgICAgICAgICAgICAgICAgVFJBTkIgPSBUUkFOU0IuRVEuJ1QnLk9SLlRSQU5TQi5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOQiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgTUIgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBOQiA9IEsKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIE1CID0gSworICAgICAgICAgICAgICAgICAgICAgICAgTkIgPSBOCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgICAgICAgIFNldCBMREIgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgICAgICAgTERCID0gTUIKKyAgICAgICAgICAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICAgICBHTyBUTyA3MAorICAgICAgICAgICAgICAgICAgICAgTEJCID0gTERCKk5CCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgTUIsIE5CLCBCLCBOTUFYLCBCQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQiwgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5BUyA9IFRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTkJTID0gVFJBTlNCCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTEJCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUyggSSApID0gQkIoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQlMgPSBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssIEFMUEhBLCBMREEsIExEQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgREdFTU0oIFRSQU5TQSwgVFJBTlNCLCBNLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIEJCLCBMREIsIEJFVEEsIENDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFRSQU5TQS5FUS5UUkFOQVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU0IuRVEuVFJBTkJTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREUoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERCUy5FUS5MREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExERSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMREVSRVMoICdHRScsICcgJywgTSwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTMgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETU1DSCggVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQSwgTk1BWCwgQiwgTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMsIE5NQVgsIENULCBHLCBDQywgTERDLCBFUFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssCisgICAgICQgICBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnJycsIEExLCAnJycsJywKKyAgICAgJCAgICAgIDMoIEkzLCAnLCcgKSwgRjQuMSwgJywgQSwnLCBJMywgJywgQiwnLCBJMywgJywnLCBGNC4xLCAnLCAnLAorICAgICAkICAgICAgJ0MsJywgSTMsICcpLicgKQorIDk5OTQgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgRENISzEuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENISzIoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQSwgQUEsIEFTLCBCLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcgKQorKgorKiAgVGVzdHMgRFNZTU0uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUywgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDUywgSUNVLCBJTSwgSU4sIExBQSwgTEJCLCBMQ0MsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMREIsIExEQlMsIExEQywgTERDUywgTSwgTVMsIE4sIE5BLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRUZULCBOVUxMLCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFNJREUsIFNJREVTLCBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSFMsIElDSFUKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMREUsIExERVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExERSwgTERFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIERNQUtFLCBETU1DSCwgRFNZTU0KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIUy8nTFInLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDEyCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMDAgSU0gPSAxLCBOSURJTQorICAgICAgICAgTSA9IElESU0oIElNICkKKyoKKyAgICAgICAgIERPIDkwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQyA9IE0KKyAgICAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyA5MAorICAgICAgICAgICAgTENDID0gTERDKk4KKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuTS5MRS4wCisqCisqICAgICAgICAgICBTZXQgTERCIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQiA9IE0KKyAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyA5MAorICAgICAgICAgICAgTEJCID0gTERCKk4KKyoKKyogICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBCLCBOTUFYLCBCQiwgTERCLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFpFUk8gKQorKgorICAgICAgICAgICAgRE8gODAgSUNTID0gMSwgMgorICAgICAgICAgICAgICAgU0lERSA9IElDSFMoIElDUzogSUNTICkKKyAgICAgICAgICAgICAgIExFRlQgPSBTSURFLkVRLidMJworKgorICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIE5BID0gTQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTkEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyA4MAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisgICAgICAgICAgICAgICBETyA3MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHN5bW1ldHJpYyBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdTWScsIFVQTE8sICcgJywgTkEsIE5BLCBBLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQywgTk1BWCwgQ0MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNJREVTID0gU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExCQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQlMoIEkgKSA9IEJCKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREJTID0gTERCCisgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgU0lERSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFVQTE8sIE0sIE4sIEFMUEhBLCBMREEsIExEQiwgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBEU1lNTSggU0lERSwgVVBMTywgTSwgTiwgQUxQSEEsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBCRVRBLCBDQywgTERDICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBTSURFUy5FUS5TSURFCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREUoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREJTLkVRLkxEQgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTERFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExERVJFUyggJ0dFJywgJyAnLCBNLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETU1DSCggJ04nLCAnTicsIE0sIE4sIE0sIEFMUEhBLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQiwgTk1BWCwgQkVUQSwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENULCBHLCBDQywgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETU1DSCggJ04nLCAnTicsIE0sIE4sIE4sIEFMUEhBLCBCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQSwgTk1BWCwgQkVUQSwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENULCBHLCBDQywgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMjAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsIFVQTE8sIE0sIE4sIEFMUEhBLCBMREEsCisgICAgICQgICBMREIsIEJFVEEsIExEQworKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICBGNC4xLCAnLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnLCcsIEY0LjEsICcsIEMsJywgSTMsICcpICAgJywKKyAgICAgJCAgICAgICcgLicgKQorIDk5OTQgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgRENISzIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENISzMoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTk1BWCwgQSwgQUEsIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgQiwgQkIsIEJTLCBDVCwgRywgQyApCisqCisqICBUZXN0cyBEVFJNTSBhbmQgRFRSU00uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBPTkUgPSAxLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDVCggTk1BWCApLCBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEFMUywgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUNELCBJQ1MsIElDVCwgSUNVLCBJTSwgSU4sIEosIExBQSwgTEJCLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQSwgTERBUywgTERCLCBMREJTLCBNLCBNUywgTiwgTkEsIE5BUkdTLCBOQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFRlQsIE5VTEwsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgRElBR1MsIFNJREUsIFNJREVTLCBUUkFOQVMsIFRSQU5TQSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSEQsIElDSFMsIElDSFUKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0hUCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTERFLCBMREVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMREUsIExERVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBETUFLRSwgRE1NQ0gsIERUUk1NLCBEVFJTTQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hVLydVTCcvLCBJQ0hULydOVEMnLywgSUNIRC8nVU4nLywgSUNIUy8nTFInLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDExCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqICAgICBTZXQgdXAgemVybyBtYXRyaXggZm9yIERNTUNILgorICAgICAgRE8gMjAgSiA9IDEsIE5NQVgKKyAgICAgICAgIERPIDEwIEkgPSAxLCBOTUFYCisgICAgICAgICAgICBDKCBJLCBKICkgPSBaRVJPCisgICAxMCAgICBDT05USU5VRQorICAgMjAgQ09OVElOVUUKKyoKKyAgICAgIERPIDE0MCBJTSA9IDEsIE5JRElNCisgICAgICAgICBNID0gSURJTSggSU0gKQorKgorICAgICAgICAgRE8gMTMwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERCIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQiA9IE0KKyAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgIExCQiA9IExEQipOCisgICAgICAgICAgICBOVUxMID0gTS5MRS4wLk9SLk4uTEUuMAorKgorICAgICAgICAgICAgRE8gMTIwIElDUyA9IDEsIDIKKyAgICAgICAgICAgICAgIFNJREUgPSBJQ0hTKCBJQ1M6IElDUyApCisgICAgICAgICAgICAgICBMRUZUID0gU0lERS5FUS4nTCcKKyAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE5BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyAgICAgICAgICAgICAgIERPIDExMCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorICAgICAgICAgICAgICAgICAgRE8gMTAwIElDVCA9IDEsIDMKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TQSA9IElDSFQoIElDVDogSUNUICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDkwIElDRCA9IDEsIDIKKyAgICAgICAgICAgICAgICAgICAgICAgIERJQUcgPSBJQ0hEKCBJQ0Q6IElDRCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA4MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnVFInLCBVUExPLCBESUFHLCBOQSwgTkEsIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBQSwgTERBLCBSRVNFVCwgWkVSTyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJREVTID0gU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOQVMgPSBUUkFOU0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQUdTID0gRElBRworICAgICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNTScgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLCBOLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgTERCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBEVFJNTSggU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgQUxQSEEsIEFBLCBMREEsIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU00nIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwgTiwgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIExEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFRSU00oIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4sIEFMUEhBLCBBQSwgTERBLCBCQiwgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFNJREVTLkVRLlNJREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gVFJBTkFTLkVRLlRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IERJQUdTLkVRLkRJQUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExERSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMREUoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERFUkVTKCAnR0UnLCAnICcsIE0sIE4sIEJTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMREJTLkVRLkxEQgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01NJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNTUNIKCBUUkFOU0EsICdOJywgTSwgTiwgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBLCBOTUFYLCBCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTywgQywgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETU1DSCggJ04nLCBUUkFOU0EsIE0sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQiwgTk1BWCwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEMsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU00nIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIGFwcHJveGltYXRpb24gdG8gb3JpZ2luYWwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSSwgSiApID0gQkIoIEkgKyAoIEogLSAxICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIoIEkgKyAoIEogLSAxICkqTERCICkgPSBBTFBIQSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIoIEksIEogKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETU1DSCggVFJBTlNBLCAnTicsIE0sIE4sIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEEsIE5NQVgsIEMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBCLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETU1DSCggJ04nLCBUUkFOU0EsIE0sIE4sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEMsIE5NQVgsIEEsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBCLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEyMCAgICAgICBDT05USU5VRQorKgorICAxMzAgICAgQ09OVElOVUUKKyoKKyAgMTQwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNjAKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsIFVQTE8sIFRSQU5TQSwgRElBRywgTSwKKyAgICAgJCAgIE4sIEFMUEhBLCBMREEsIExEQgorKgorICAxNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDQoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICBGNC4xLCAnLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnKSAgICAgICAgLicgKQorIDk5OTQgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgRENISzMuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENISzQoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQSwgQUEsIEFTLCBCLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcgKQorKgorKiAgVGVzdHMgRFNZUksuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBBTFMsIEJFVEEsIEJFVFMsIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ1QsIElDVSwgSUssIElOLCBKLCBKQywgSkosIEssIEtTLAorICAgICAkICAgICAgICAgICAgICAgICAgIExBQSwgTENDLCBMREEsIExEQVMsIExEQywgTERDUywgTEosIE1BLCBOLCBOQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU4sIFVQUEVSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMsIFRSQU5TUywgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hVCisgICAgICBDSEFSQUNURVIqMyAgICAgICAgSUNIVAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExERSwgTERFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTERFLCBMREVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgRE1BS0UsIERNTUNILCBEU1lSSworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hULydOVEMnLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDEwCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMDAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREMgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERDID0gTgorICAgICAgICAgSUYoIExEQy5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQyA9IExEQyArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQy5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDEwMAorICAgICAgICAgTENDID0gTERDKk4KKyAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgIERPIDkwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICBETyA4MCBJQ1QgPSAxLCAzCisgICAgICAgICAgICAgICBUUkFOUyA9IElDSFQoIElDVDogSUNUICkKKyAgICAgICAgICAgICAgIFRSQU4gPSBUUkFOUy5FUS4nVCcuT1IuVFJBTlMuRVEuJ0MnCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgTUEgPSBLCisgICAgICAgICAgICAgICAgICBOQSA9IE4KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE1BID0gTgorICAgICAgICAgICAgICAgICAgTkEgPSBLCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTUEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyA4MAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgRE8gNzAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyAgICAgICAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBDLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ1NZJywgVVBMTywgJyAnLCBOLCBOLCBDLCBOTUFYLCBDQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgQkVUUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE4sIEssIEFMUEhBLCBMREEsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRFNZUksoIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEsIENDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU1MuRVEuVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExERSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gQkVUUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExERSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExERVJFUyggJ1NZJywgVVBMTywgTiwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDMwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1NQ0goICdUJywgJ04nLCBMSiwgMSwgSywgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBKCAxLCBKSiApLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSggMSwgSiApLCBOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSkosIEogKSwgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQyggSkMgKSwgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETU1DSCggJ04nLCAnVCcsIExKLCAxLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEoIEpKLCAxICksIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBKCBKLCAxICksIE5NQVgsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCBKSiwgSiApLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDKCBKQyApLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDUwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA2MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICBDT05USU5VRQorKgorICAxMDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMTAgQ09OVElOVUUKKyAgICAgIElGKCBOLkdULjEgKQorICAgICAkICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgIExEQSwgQkVUQSwgTERDCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgIEY0LjEsICcsIEEsJywgSTMsICcsJywgRjQuMSwgJywgQywnLCBJMywgJykgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIERDSEs0LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIERDSEs1KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEFCLCBBQSwgQVMsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRywgVyApCisqCisqICBUZXN0cyBEU1lSMksuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBQSggTk1BWCpOTUFYICksIEFCKCAyKk5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFMRiggTkFMRiApLCBBUyggTk1BWCpOTUFYICksIEJCKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLCBDKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ0MoIE5NQVgqTk1BWCApLCBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgRyggTk1BWCApLCBXKCAyKk5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBTFBIQSwgQUxTLCBCRVRBLCBCRVRTLCBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNULCBJQ1UsIElLLCBJTiwgSiwgSkMsIEpKLCBKSkFCLAorICAgICAkICAgICAgICAgICAgICAgICAgIEssIEtTLCBMQUEsIExCQiwgTENDLCBMREEsIExEQVMsIExEQiwgTERCUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREMsIExEQ1MsIExKLCBNQSwgTiwgTkEsIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBOVUxMLCBSRVNFVCwgU0FNRSwgVFJBTiwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUywgVFJBTlNTLCBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSFUKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0hUCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTERFLCBMREVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMREUsIExERVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBETUFLRSwgRE1NQ0gsIERTWVIySworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hULydOVEMnLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDEyCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMzAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREMgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERDID0gTgorICAgICAgICAgSUYoIExEQy5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQyA9IExEQyArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQy5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDEzMAorICAgICAgICAgTENDID0gTERDKk4KKyAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgIERPIDEyMCBJSyA9IDEsIE5JRElNCisgICAgICAgICAgICBLID0gSURJTSggSUsgKQorKgorICAgICAgICAgICAgRE8gMTEwIElDVCA9IDEsIDMKKyAgICAgICAgICAgICAgIFRSQU5TID0gSUNIVCggSUNUOiBJQ1QgKQorICAgICAgICAgICAgICAgVFJBTiA9IFRSQU5TLkVRLidUJy5PUi5UUkFOUy5FUS4nQycKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBNQSA9IEsKKyAgICAgICAgICAgICAgICAgIE5BID0gTgorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTUEgPSBOCisgICAgICAgICAgICAgICAgICBOQSA9IEsKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBMREEgPSBNQQorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIsIDIqTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEIuCisqCisgICAgICAgICAgICAgICBMREIgPSBMREEKKyAgICAgICAgICAgICAgIExCQiA9IExBQQorICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIENBTEwgRE1BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCKCBLICsgMSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgMipOTUFYLCBCQiwgTERCLCBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBDQUxMIERNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiggSypOTUFYICsgMSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQkIsIExEQiwgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyAxMDAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyAgICAgICAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgICAgICAgIERPIDkwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDgwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBDLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBETUFLRSggJ1NZJywgVVBMTywgJyAnLCBOLCBOLCBDLCBOTUFYLCBDQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExCQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQlMoIEkgKSA9IEJCKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREJTID0gTERCCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExDQworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MoIEkgKSA9IENDKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMRENTID0gTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sCisgICAgICQgICAgICAgICAgICAgICAgICAgICBUUkFOUywgTiwgSywgQUxQSEEsIExEQSwgTERCLCBCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERTWVIySyggVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEJFVEEsIENDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU1MuRVEuVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExERSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERFKCBCUywgQkIsIExCQiApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERCUy5FUS5MREIKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gQkVUUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMREUoIENTLCBDQywgTENDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTERFUkVTKCAnU1knLCBVUExPLCBOLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKQUIgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSSApID0gQUIoICggSiAtIDEgKSoyKk5NQVggKyBLICsKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IEFCKCAoIEogLSAxICkqMipOTUFYICsKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJICkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIERNTUNIKCAnVCcsICdOJywgTEosIDEsIDIqSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBQiggSkpBQiApLCAyKk5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXLCAyKk5NQVgsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCBKSiwgSiApLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDKCBKQyApLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSSApID0gQUIoICggSyArIEkgLSAxICkqTk1BWCArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEsgKyBJICkgPSBBQiggKCBJIC0gMSApKk5NQVggKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEogKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgRE1NQ0goICdOJywgJ04nLCBMSiwgMSwgMipLLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEFCKCBKSiApLCBOTUFYLCBXLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMipOTUFYLCBCRVRBLCBDKCBKSiwgSiApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQ1QsIEcsIENDKCBKQyApLCBMREMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gSkMgKyBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gSkMgKyBMREMgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBTiApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSkFCID0gSkpBQiArIDIqTk1BWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE0MAorICAgNzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgODAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTIwICAgIENPTlRJTlVFCisqCisgIDEzMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTYwCisqCisgIDE0MCBDT05USU5VRQorICAgICAgSUYoIE4uR1QuMSApCisgICAgICQgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLAorICAgICAkICAgTERBLCBMREIsIEJFVEEsIExEQworKgorICAxNjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICBGNC4xLCAnLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnLCcsIEY0LjEsICcsIEMsJywgSTMsICcpICAgJywKKyAgICAgJCAgICAgICcgLicgKQorIDk5OTMgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgRENISzUuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgRENIS0UoIElTTlVNLCBTUk5BTVQsIE5PVVQgKQorKgorKiAgVGVzdHMgdGhlIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDMgQmxhcy4KKyogIFJlcXVpcmVzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBlcnJvci1oYW5kbGluZyByb3V0aW5lIFhFUkJMQS4KKyogIEFMUEhBLCBCRVRBLCBBLCBCIGFuZCBDIHNob3VsZCBub3QgbmVlZCB0byBiZSBkZWZpbmVkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJU05VTSwgTk9VVAorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFMUEhBLCBCRVRBCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBKCAyLCAxICksIEIoIDIsIDEgKSwgQyggMiwgMSApCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIENIS1hFUiwgREdFTU0sIERTWU1NLCBEU1lSMkssIERTWVJLLCBEVFJNTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBEVFJTTQorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyogICAgIE9LIGlzIHNldCB0byAuRkFMU0UuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIG9yIGJ5IENIS1hFUgorKiAgICAgaWYgYW55dGhpbmcgaXMgd3JvbmcuCisgICAgICBPSyA9IC5UUlVFLgorKiAgICAgTEVSUiBpcyBzZXQgdG8gLlRSVUUuIGJ5IHRoZSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIGVhY2ggdGltZQorKiAgICAgaXQgaXMgY2FsbGVkLCBhbmQgaXMgdGhlbiB0ZXN0ZWQgYW5kIHJlLXNldCBieSBDSEtYRVIuCisgICAgICBMRVJSID0gLkZBTFNFLgorICAgICAgR08gVE8gKCAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwIClJU05VTQorICAgMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIERHRU1NKCAnLycsICdOJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMQorICAgICAgQ0FMTCBER0VNTSggJy8nLCAnVCcsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgREdFTU0oICdOJywgJy8nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERHRU1NKCAnVCcsICcvJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBER0VNTSggJ04nLCAnTicsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERHRU1NKCAnTicsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgREdFTU0oICdUJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBER0VNTSggJ1QnLCAnVCcsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERHRU1NKCAnTicsICdOJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgREdFTU0oICdOJywgJ1QnLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBER0VNTSggJ1QnLCAnTicsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERHRU1NKCAnVCcsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgREdFTU0oICdOJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBER0VNTSggJ04nLCAnVCcsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERHRU1NKCAnVCcsICdOJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgREdFTU0oICdUJywgJ1QnLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBER0VNTSggJ04nLCAnTicsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgREdFTU0oICdOJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIERHRU1NKCAnVCcsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBER0VNTSggJ1QnLCAnVCcsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIERHRU1NKCAnTicsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgREdFTU0oICdUJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBER0VNTSggJ04nLCAnVCcsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIERHRU1NKCAnVCcsICdUJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgREdFTU0oICdOJywgJ04nLCAyLCAwLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBER0VNTSggJ04nLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIERHRU1NKCAnVCcsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgREdFTU0oICdUJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gNzAKKyAgIDIwIElORk9UID0gMQorICAgICAgQ0FMTCBEU1lNTSggJy8nLCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFNZTU0oICdMJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERTWU1NKCAnTCcsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgRFNZTU0oICdSJywgJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lNTSggJ0wnLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERTWU1NKCAnUicsICdMJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgRFNZTU0oICdMJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lNTSggJ1InLCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERTWU1NKCAnTCcsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgRFNZTU0oICdSJywgJ0wnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZTU0oICdSJywgJ1UnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERTWU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lNTSggJ1InLCAnTCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFNZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEU1lNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFNZTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBEU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgRFNZTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBEU1lNTSggJ1InLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyA3MAorICAgMzAgSU5GT1QgPSAxCisgICAgICBDQUxMIERUUk1NKCAnLycsICdVJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJy8nLCAnTicsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnVScsICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERUUk1NKCAnTCcsICdVJywgJ04nLCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ0wnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ0wnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnTicsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ0wnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ0wnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnTicsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSTU0oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSTU0oICdSJywgJ0wnLCAnTicsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBEVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gNzAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBEVFJTTSggJy8nLCAnVScsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERUUlNNKCAnTCcsICcvJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ1UnLCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEVFJTTSggJ0wnLCAnVScsICdOJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgRFRSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDcwCisgICA1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgRFNZUksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIERTWVJLKCAnVScsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSSyggJ1UnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIERTWVJLKCAnVScsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgRFNZUksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSSyggJ0wnLCAnVCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERTWVJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgRFNZUksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSSyggJ0wnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIERTWVJLKCAnTCcsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZUksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERTWVJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lSSyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZUksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBEU1lSSyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIERTWVJLKCAnVScsICdUJywgMiwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgRFNZUksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBEU1lSSyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyA3MAorICAgNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIERTWVIySyggJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgRFNZUjJLKCAnVScsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIERTWVIySyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgRFNZUjJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgRFNZUjJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBEU1lSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIERTWVIySyggJ0wnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWVIySyggJ1UnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIERTWVIySyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisgICA3MCBJRiggT0sgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTUk5BTVQKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTVQKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUycgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyAqKioqKicsCisgICAgICQgICAgICAnKionICkKKyoKKyogICAgIEVuZCBvZiBEQ0hLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBETUFLRSggVFlQRSwgVVBMTywgRElBRywgTSwgTiwgQSwgTk1BWCwgQUEsIExEQSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorKiAgR2VuZXJhdGVzIHZhbHVlcyBmb3IgYW4gTSBieSBOIG1hdHJpeCBBLgorKiAgU3RvcmVzIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IEFBIGluIHRoZSBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZAorKiAgYnkgdGhlIHJvdXRpbmUsIHdpdGggdW53YW50ZWQgZWxlbWVudHMgc2V0IHRvIHJvZ3VlIHZhbHVlLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnU1knIG9yICdUUicuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBPTkUgPSAxLjBEMCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJPR1VFID0gLTEuMEQxMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOLCBOTUFYCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTk1BWCwgKiApLCBBQSggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEdFTiwgTE9XRVIsIFNZTSwgVFJJLCBVTklULCBVUFBFUgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgREJFRworICAgICAgRVhURVJOQUwgICAgICAgICAgIERCRUcKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgR0VOID0gVFlQRS5FUS4nR0UnCisgICAgICBTWU0gPSBUWVBFLkVRLidTWScKKyAgICAgIFRSSSA9IFRZUEUuRVEuJ1RSJworICAgICAgVVBQRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nVScKKyAgICAgIExPV0VSID0gKCBTWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ0wnCisgICAgICBVTklUID0gVFJJLkFORC5ESUFHLkVRLidVJworKgorKiAgICAgR2VuZXJhdGUgZGF0YSBpbiBhcnJheSBBLgorKgorICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBJRiggR0VOLk9SLiggVVBQRVIuQU5ELkkuTEUuSiApLk9SLiggTE9XRVIuQU5ELkkuR0UuSiApICkKKyAgICAgJCAgICAgICAgICBUSEVOCisgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBEQkVHKCBSRVNFVCApICsgVFJBTlNMCisgICAgICAgICAgICAgICBJRiggSS5ORS5KIClUSEVOCisqICAgICAgICAgICAgICAgICBTZXQgc29tZSBlbGVtZW50cyB0byB6ZXJvCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4zLkFORC5KLkVRLk4vMiApCisgICAgICQgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBBKCBJLCBKICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFRSSSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVORCBJRgorICAgMTAgICAgQ09OVElOVUUKKyAgICAgICAgIElGKCBUUkkgKQorICAgICAkICAgICAgQSggSiwgSiApID0gQSggSiwgSiApICsgT05FCisgICAgICAgICBJRiggVU5JVCApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBPTkUKKyAgIDIwIENPTlRJTlVFCisqCisqICAgICBTdG9yZSBlbGVtZW50cyBpbiBhcnJheSBBUyBpbiBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZCBieSByb3V0aW5lLgorKgorICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBNCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NZJy5PUi5UWVBFLkVRLidUUicgKVRIRU4KKyAgICAgICAgIERPIDkwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUVORCA9IEogLSAxCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUJFRyA9IEogKyAxCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyA2MCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDYwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA3MCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDcwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA4MCBJID0gSUVORCArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgODAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERNQUtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIERNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgS0ssIEFMUEhBLCBBLCBMREEsIEIsIExEQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVEEsIEMsIExEQywgQ1QsIEcsIENDLCBMRENDLCBFUFMsIEVSUiwgRkFUQUwsCisgICAgICQgICAgICAgICAgICAgICAgICBOT1VULCBNViApCisqCisqICBDaGVja3MgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXB1dGF0aW9uYWwgdGVzdHMuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMEQwLCBPTkUgPSAxLjBEMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUxQSEEsIEJFVEEsIEVQUywgRVJSCisgICAgICBJTlRFR0VSICAgICAgICAgICAgS0ssIExEQSwgTERCLCBMREMsIExEQ0MsIE0sIE4sIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTVYKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOU0EsIFRSQU5TQgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQSggTERBLCAqICksIEIoIExEQiwgKiApLCBDKCBMREMsICogKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTERDQywgKiApLCBDVCggKiApLCBHKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlJJCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSiwgSworICAgICAgTE9HSUNBTCAgICAgICAgICAgIFRSQU5BLCBUUkFOQgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBTUVJUCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFRSQU5BID0gVFJBTlNBLkVRLidUJy5PUi5UUkFOU0EuRVEuJ0MnCisgICAgICBUUkFOQiA9IFRSQU5TQi5FUS4nVCcuT1IuVFJBTlNCLkVRLidDJworKgorKiAgICAgQ29tcHV0ZSBleHBlY3RlZCByZXN1bHQsIG9uZSBjb2x1bW4gYXQgYSB0aW1lLCBpbiBDVCB1c2luZyBkYXRhCisqICAgICBpbiBBLCBCIGFuZCBDLgorKiAgICAgQ29tcHV0ZSBnYXVnZXMgaW4gRy4KKyoKKyAgICAgIERPIDEyMCBKID0gMSwgTgorKgorICAgICAgICAgRE8gMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIENUKCBJICkgPSBaRVJPCisgICAgICAgICAgICBHKCBJICkgPSBaRVJPCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIC5OT1QuVFJBTkEuQU5ELi5OT1QuVFJBTkIgKVRIRU4KKyAgICAgICAgICAgIERPIDMwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSSwgSyApKkIoIEssIEogKQorICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTKCBBKCBJLCBLICkgKSpBQlMoIEIoIEssIEogKSApCisgICAyMCAgICAgICAgICBDT05USU5VRQorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UgSUYoIFRSQU5BLkFORC4uTk9ULlRSQU5CIClUSEVOCisgICAgICAgICAgICBETyA1MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEssIEkgKSpCKCBLLCBKICkKKyAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUyggQSggSywgSSApICkqQUJTKCBCKCBLLCBKICkgKQorICAgNDAgICAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTFNFIElGKCAuTk9ULlRSQU5BLkFORC5UUkFOQiApVEhFTgorICAgICAgICAgICAgRE8gNzAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBJLCBLICkqQiggSiwgSyApCisgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMoIEEoIEksIEsgKSApKkFCUyggQiggSiwgSyApICkKKyAgIDYwICAgICAgICAgIENPTlRJTlVFCisgICA3MCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRSBJRiggVFJBTkEuQU5ELlRSQU5CIClUSEVOCisgICAgICAgICAgICBETyA5MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEssIEkgKSpCKCBKLCBLICkKKyAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUyggQSggSywgSSApICkqQUJTKCBCKCBKLCBLICkgKQorICAgODAgICAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDEwMCBJID0gMSwgTQorICAgICAgICAgICAgQ1QoIEkgKSA9IEFMUEhBKkNUKCBJICkgKyBCRVRBKkMoIEksIEogKQorICAgICAgICAgICAgRyggSSApID0gQUJTKCBBTFBIQSApKkcoIEkgKSArIEFCUyggQkVUQSApKkFCUyggQyggSSwgSiApICkKKyAgMTAwICAgIENPTlRJTlVFCisqCisqICAgICAgICBDb21wdXRlIHRoZSBlcnJvciByYXRpbyBmb3IgdGhpcyByZXN1bHQuCisqCisgICAgICAgICBFUlIgPSBaRVJPCisgICAgICAgICBETyAxMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIEVSUkkgPSBBQlMoIENUKCBJICkgLSBDQyggSSwgSiApICkvRVBTCisgICAgICAgICAgICBJRiggRyggSSApLk5FLlpFUk8gKQorICAgICAkICAgICAgICAgRVJSSSA9IEVSUkkvRyggSSApCisgICAgICAgICAgICBFUlIgPSBNQVgoIEVSUiwgRVJSSSApCisgICAgICAgICAgICBJRiggRVJSKlNRUlQoIEVQUyApLkdFLk9ORSApCisgICAgICQgICAgICAgICBHTyBUTyAxMzAKKyAgMTEwICAgIENPTlRJTlVFCisqCisgIDEyMCBDT05USU5VRQorKgorKiAgICAgSWYgdGhlIGxvb3AgY29tcGxldGVzLCBhbGwgcmVzdWx0cyBhcmUgYXQgbGVhc3QgaGFsZiBhY2N1cmF0ZS4KKyAgICAgIEdPIFRPIDE1MAorKgorKiAgICAgUmVwb3J0IGZhdGFsIGVycm9yLgorKgorICAxMzAgRkFUQUwgPSAuVFJVRS4KKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5ICkKKyAgICAgIERPIDE0MCBJID0gMSwgTQorICAgICAgICAgSUYoIE1WIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgQ1QoIEkgKSwgQ0MoIEksIEogKQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUksIENDKCBJLCBKICksIENUKCBJICkKKyAgICAgICAgIEVORCBJRgorICAxNDAgQ09OVElOVUUKKyAgICAgIElGKCBOLkdULjEgKQorICAgICAkICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKUoKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gQ09NUFVURUQgUkVTVUxUIElTIExFU1MgVEhBTiBIQUwnLAorICAgICAkICAgICAgJ0YgQUNDVVJBVEUgKioqKioqKicsIC8nICAgICAgICAgICBFWFBFQ1RFRCBSRVNVTFQgICBDT01QVScsCisgICAgICQgICAgICAnVEVEIFJFU1VMVCcgKQorIDk5OTggRk9STUFUKCAxWCwgSTcsIDJHMTguNiApCisgOTk5NyBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisqCisqICAgICBFbmQgb2YgRE1NQ0guCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTERFKCBSSSwgUkosIExSICkKKyoKKyogIFRlc3RzIGlmIHR3byBhcnJheXMgYXJlIGlkZW50aWNhbC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTFIKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJJKCAqICksIFJKKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDEwIEkgPSAxLCBMUgorICAgICAgICAgSUYoIFJJKCBJICkuTkUuUkooIEkgKSApCisgICAgICQgICAgICBHTyBUTyAyMAorICAgMTAgQ09OVElOVUUKKyAgICAgIExERSA9IC5UUlVFLgorICAgICAgR08gVE8gMzAKKyAgIDIwIENPTlRJTlVFCisgICAgICBMREUgPSAuRkFMU0UuCisgICAzMCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMREUuCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTERFUkVTKCBUWVBFLCBVUExPLCBNLCBOLCBBQSwgQVMsIExEQSApCisqCisqICBUZXN0cyBpZiBzZWxlY3RlZCBlbGVtZW50cyBpbiB0d28gYXJyYXlzIGFyZSBlcXVhbC4KKyoKKyogIFRZUEUgaXMgJ0dFJyBvciAnU1knLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMREEsIE0sIE4KKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgQUEoIExEQSwgKiApLCBBUyggTERBLCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQkVHLCBJRU5ELCBKCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgVVBQRVIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDEwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAxMCAgICAgICBDT05USU5VRQorICAgMjAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NZJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIElCRUcgLSAxCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisqCisgICA2MCBDT05USU5VRQorICAgICAgTERFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExERVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExERVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBEQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgcmFuZG9tIG51bWJlcnMgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGJldHdlZW4gLTAuNSBhbmQgMC41LgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBSRVNFVAorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElDLCBNSQorKiAgICAgLi4gU2F2ZSBzdGF0ZW1lbnQgLi4KKyAgICAgIFNBVkUgICAgICAgICAgICAgICBJLCBJQywgTUkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIFJFU0VUIClUSEVOCisqICAgICAgICBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAgICAgIE1JID0gODkxCisgICAgICAgICBJID0gNworICAgICAgICAgSUMgPSAwCisgICAgICAgICBSRVNFVCA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorKgorKiAgICAgVGhlIHNlcXVlbmNlIG9mIHZhbHVlcyBvZiBJIGlzIGJvdW5kZWQgYmV0d2VlbiAxIGFuZCA5OTkuCisqICAgICBJZiBpbml0aWFsIEkgPSAxLDIsMyw2LDcgb3IgOSwgdGhlIHBlcmlvZCB3aWxsIGJlIDUwLgorKiAgICAgSWYgaW5pdGlhbCBJID0gNCBvciA4LCB0aGUgcGVyaW9kIHdpbGwgYmUgMjUuCisqICAgICBJZiBpbml0aWFsIEkgPSA1LCB0aGUgcGVyaW9kIHdpbGwgYmUgMTAuCisqICAgICBJQyBpcyB1c2VkIHRvIGJyZWFrIHVwIHRoZSBwZXJpb2QgYnkgc2tpcHBpbmcgMSB2YWx1ZSBvZiBJIGluIDYuCisqCisgICAgICBJQyA9IElDICsgMQorICAgMTAgSSA9IEkqTUkKKyAgICAgIEkgPSBJIC0gMTAwMCooIEkvMTAwMCApCisgICAgICBJRiggSUMuR0UuNSApVEhFTgorICAgICAgICAgSUMgPSAwCisgICAgICAgICBHTyBUTyAxMAorICAgICAgRU5EIElGCisgICAgICBEQkVHID0gKCBJIC0gNTAwICkvMTAwMS4wRDAKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERCRUcuCisqCisgICAgICBFTkQKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gRlVOQ1RJT04gRERJRkYoIFgsIFkgKQorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBYLCBZCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERESUZGID0gWCAtIFkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERESUZGLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorKiAgVGVzdHMgd2hldGhlciBYRVJCTEEgaGFzIGRldGVjdGVkIGFuIGVycm9yIHdoZW4gaXQgc2hvdWxkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCAuTk9ULkxFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPVCwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqIElMTEVHQUwgVkFMVUUgT0YgUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBOT1QgRCcsCisgICAgICQgICAgICAnRVRFQ1RFRCBCWSAnLCBBNiwgJyAqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENIS1hFUi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBYRVJCTEEoIFNSTkFNRSwgSU5GTyApCisqCisqICBUaGlzIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSB0byBiZSB1c2VkIG9ubHkgYXMgcGFydCBvZgorKiAgdGhlIHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAzIEJMQVMKKyogIHJvdXRpbmVzLgorKgorKiAgWEVSQkxBICBpcyBhbiBlcnJvciBoYW5kbGVyIGZvciB0aGUgTGV2ZWwgMyBCTEFTIHJvdXRpbmVzLgorKgorKiAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMZXZlbCAzIEJMQVMgcm91dGluZXMgaWYgYW4gaW5wdXQgcGFyYW1ldGVyIGlzCisqICBpbnZhbGlkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1FCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVQsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgTEVSUiA9IC5UUlVFLgorICAgICAgSUYoIElORk8uTkUuSU5GT1QgKVRIRU4KKyAgICAgICAgIElGKCBJTkZPVC5ORS4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GTywgSU5GT1QKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClJTkZPCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBJRiggU1JOQU1FLk5FLlNSTkFNVCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNRSwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwgJyBJTlNURUFEJywKKyAgICAgJCAgICAgICcgT0YgJywgSTIsICcgKioqKioqKicgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBTUk5BTUUgPSAnLCBBNiwgJyBJTlNURScsCisgICAgICQgICAgICAnQUQgT0YgJywgQTYsICcgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsCisgICAgICQgICAgICAnICoqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBYRVJCTEEKKyoKKyAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3RpbmcvcnVuYmxhc3Rlc3Quc2ggYi9ibGFzL3Rlc3RpbmcvcnVuYmxhc3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGZmYWYwMQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy9ydW5ibGFzdGVzdC5zaApAQCAtMCwwICsxLDQ1IEBACisjIS9iaW4vYmFzaAorCitibGFjaz0nXEVbMzBtJworcmVkPSdcRVszMW0nCitncmVlbj0nXEVbMzJtJworeWVsbG93PSdcRVszM20nCitibHVlPSdcRVszNG0nCittYWdlbnRhPSdcRVszNW0nCitjeWFuPSdcRVszNm0nCit3aGl0ZT0nXEVbMzdtJworCitpZiBbIC1mICQyIF07IHRoZW4KKyAgZGF0YT0kMgorICBpZiBbIC1mICQxLnN1bW0gXTsgdGhlbiBybSAkMS5zdW1tOyBmaQorICBpZiBbIC1mICQxLnNuYXAgXTsgdGhlbiBybSAkMS5zbmFwOyBmaQorZWxzZQorICBkYXRhPSQxCitmaQorCitpZiAhIC4vJDEgPCAkZGF0YSA+IC9kZXYvbnVsbCAyPiAucnVudGVzdC5sb2cgOyB0aGVuCisgIGVjaG8gLWUgICRyZWQgVGVzdCAkMSBmYWlsZWQ6ICRibGFjaworICBlY2hvIC1lICRibHVlCisgIGNhdCAucnVudGVzdC5sb2cKKyAgZWNobyAtZSAkYmxhY2sKKyAgZXhpdCAxCitlbHNlCisgIGlmIFsgLWYgJDEuc3VtbSBdOyB0aGVuCisgICAgaWYgWyBgZ3JlcCAiRkFUQUwgRVJST1IiICQxLnN1bW0gfCB3YyAtbGAgLWd0IDAgXTsgdGhlbgorICAgICAgZWNobyAtZSAgJHJlZCAiVGVzdCAkMSBmYWlsZWQgKEZBVEFMIEVSUk9SLCByZWFkIHRoZSBmaWxlICQxLnN1bW0gZm9yIGRldGFpbHMpIiAkYmxhY2sKKyAgICAgIGVjaG8gLWUgJGJsdWUKKyAgICAgIGNhdCAucnVudGVzdC5sb2cKKyAgICAgIGVjaG8gLWUgJGJsYWNrCisgICAgICBleGl0IDE7CisgICAgZmkKKworICAgIGlmIFsgYGdyZXAgIkZBSUxFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMiICQxLnN1bW0gfCB3YyAtbGAgLWd0IDAgXTsgdGhlbgorICAgICAgZWNobyAtZSAgJHJlZCAiVGVzdCAkMSBmYWlsZWQgKEZBSUxFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMsIHJlYWQgdGhlIGZpbGUgJDEuc3VtbSBmb3IgZGV0YWlscykiICRibGFjaworICAgICAgZWNobyAtZSAkYmx1ZQorICAgICAgY2F0IC5ydW50ZXN0LmxvZworICAgICAgZWNobyAtZSAkYmxhY2sKKyAgICAgIGV4aXQgMTsKKyAgICBmaSAgICAgIAorICBmaQorICBlY2hvIC1lICRncmVlbiBUZXN0ICQxIHBhc3NlZCRibGFjaworZmkKZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9zYmxhdDEuZiBiL2JsYXMvdGVzdGluZy9zYmxhdDEuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTgyZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL3NibGF0MS5mCkBAIC0wLDAgKzEsNzY5IEBACisgICAgICBQUk9HUkFNIFNCTEFUMQorKiAgICAgVGVzdCBwcm9ncmFtIGZvciB0aGUgUkVBTCAgICAgICAgICAgICBMZXZlbCAxIEJMQVMuCisqICAgICBCYXNlZCB1cG9uIHRoZSBvcmlnaW5hbCBCTEFTIHRlc3Qgcm91dGluZSB0b2dldGhlciB3aXRoOgorKiAgICAgRjA2RUFGIEV4YW1wbGUgUHJvZ3JhbSBUZXh0CisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0ZBQworICAgICAgSU5URUdFUiAgICAgICAgICBJQworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgQ0hFQ0swLCBDSEVDSzEsIENIRUNLMiwgQ0hFQ0szLCBIRUFERVIKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgIFNGQUMvOS43NjU2MjVFLTQvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFdSSVRFIChOT1VULDk5OTk5KQorICAgICAgRE8gMjAgSUMgPSAxLCAxMAorICAgICAgICAgSUNBU0UgPSBJQworICAgICAgICAgQ0FMTCBIRUFERVIKKyoKKyogICAgICAgIC4uIEluaXRpYWxpemUgIFBBU1MsICBJTkNYLCAgSU5DWSwgYW5kIE1PREUgZm9yIGEgbmV3IGNhc2UuIC4uCisqICAgICAgICAuLiB0aGUgdmFsdWUgOTk5OSBmb3IgSU5DWCwgSU5DWSBvciBNT0RFIHdpbGwgYXBwZWFyIGluIHRoZSAuLgorKiAgICAgICAgLi4gZGV0YWlsZWQgIG91dHB1dCwgaWYgYW55LCBmb3IgY2FzZXMgIHRoYXQgZG8gbm90IGludm9sdmUgLi4KKyogICAgICAgIC4uIHRoZXNlIHBhcmFtZXRlcnMgLi4KKyoKKyAgICAgICAgIFBBU1MgPSAuVFJVRS4KKyAgICAgICAgIElOQ1ggPSA5OTk5CisgICAgICAgICBJTkNZID0gOTk5OQorICAgICAgICAgTU9ERSA9IDk5OTkKKyAgICAgICAgIElGIChJQ0FTRS5FUS4zKSBUSEVOCisgICAgICAgICAgICBDQUxMIENIRUNLMChTRkFDKQorICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNyAuT1IuIElDQVNFLkVRLjggLk9SLiBJQ0FTRS5FUS45IC5PUi4KKyAgICAgKyAgICAgICAgICAgIElDQVNFLkVRLjEwKSBUSEVOCisgICAgICAgICAgICBDQUxMIENIRUNLMShTRkFDKQorICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuMSAuT1IuIElDQVNFLkVRLjIgLk9SLiBJQ0FTRS5FUS41IC5PUi4KKyAgICAgKyAgICAgICAgICAgIElDQVNFLkVRLjYpIFRIRU4KKyAgICAgICAgICAgIENBTEwgQ0hFQ0syKFNGQUMpCisgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS40KSBUSEVOCisgICAgICAgICAgICBDQUxMIENIRUNLMyhTRkFDKQorICAgICAgICAgRU5EIElGCisqICAgICAgICAtLSBQcmludAorICAgICAgICAgSUYgKFBBU1MpIFdSSVRFIChOT1VULDk5OTk4KQorICAgMjAgQ09OVElOVUUKKyAgICAgIFNUT1AKKyoKKzk5OTk5IEZPUk1BVCAoJyBSZWFsIEJMQVMgVGVzdCBQcm9ncmFtIFJlc3VsdHMnLC8xWCkKKzk5OTk4IEZPUk1BVCAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tIFBBU1MgLS0tLS0nKQorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIEhFQURFUgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENIQVJBQ1RFUio2ICAgICAgTCgxMCkKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgIEwoMSkvJyBTRE9UICcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoMikvJ1NBWFBZICcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoMykvJ1NST1RHICcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoNCkvJyBTUk9UICcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoNSkvJ1NDT1BZICcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoNikvJ1NTV0FQICcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoNykvJ1NOUk0yICcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoOCkvJ1NBU1VNICcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoOSkvJ1NTQ0FMICcvCisgICAgICBEQVRBICAgICAgICAgICAgIEwoMTApLydJU0FNQVgnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBXUklURSAoTk9VVCw5OTk5OSkgSUNBU0UsIEwoSUNBU0UpCisgICAgICBSRVRVUk4KKyoKKzk5OTk5IEZPUk1BVCAoLycgVGVzdCBvZiBzdWJwcm9ncmFtIG51bWJlcicsSTMsMTJYLEE2KQorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIRUNLMChTRkFDKQorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgIFNGQUMKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgRDEyLCBTQSwgU0IsIFNDLCBTUworICAgICAgSU5URUdFUiAgICAgICAgICAgSworKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBEQTEoOCksIERBVFJVRSg4KSwgREIxKDgpLCBEQlRSVUUoOCksIERDMSg4KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIERTMSg4KQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIFNST1RHLCBTVEVTVDEKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgREExLzAuM0UwLCAwLjRFMCwgLTAuM0UwLCAtMC40RTAsIC0wLjNFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEQjEvMC40RTAsIDAuM0UwLCAwLjRFMCwgMC4zRTAsIC0wLjRFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjBFMCwgMC4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEQzEvMC42RTAsIDAuOEUwLCAtMC42RTAsIDAuOEUwLCAwLjZFMCwgMS4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEUzEvMC44RTAsIDAuNkUwLCAwLjhFMCwgLTAuNkUwLCAwLjhFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjBFMCwgMC4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEQVRSVUUvMC41RTAsIDAuNUUwLCAwLjVFMCwgLTAuNUUwLCAtMC41RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4wRTAsIDEuMEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgREJUUlVFLzAuMEUwLCAwLjZFMCwgMC4wRTAsIC0wLjZFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4wRTAsIDAuMEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRDEyLzQwOTYuMEUwLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisqICAgICBDb21wdXRlIHRydWUgdmFsdWVzIHdoaWNoIGNhbm5vdCBiZSBwcmVzdG9yZWQKKyogICAgIGluIGRlY2ltYWwgbm90YXRpb24KKyoKKyAgICAgIERCVFJVRSgxKSA9IDEuMEUwLzAuNkUwCisgICAgICBEQlRSVUUoMykgPSAtMS4wRTAvMC42RTAKKyAgICAgIERCVFJVRSg1KSA9IDEuMEUwLzAuNkUwCisqCisgICAgICBETyAyMCBLID0gMSwgOAorKiAgICAgICAgLi4gU2V0IE49SyBmb3IgaWRlbnRpZmljYXRpb24gaW4gb3V0cHV0IGlmIGFueSAuLgorICAgICAgICAgTiA9IEsKKyAgICAgICAgIElGIChJQ0FTRS5FUS4zKSBUSEVOCisqICAgICAgICAgICAuLiBTUk9URyAuLgorICAgICAgICAgICAgSUYgKEsuR1QuOCkgR08gVE8gNDAKKyAgICAgICAgICAgIFNBID0gREExKEspCisgICAgICAgICAgICBTQiA9IERCMShLKQorICAgICAgICAgICAgQ0FMTCBTUk9URyhTQSxTQixTQyxTUykKKyAgICAgICAgICAgIENBTEwgU1RFU1QxKFNBLERBVFJVRShLKSxEQVRSVUUoSyksU0ZBQykKKyAgICAgICAgICAgIENBTEwgU1RFU1QxKFNCLERCVFJVRShLKSxEQlRSVUUoSyksU0ZBQykKKyAgICAgICAgICAgIENBTEwgU1RFU1QxKFNDLERDMShLKSxEQzEoSyksU0ZBQykKKyAgICAgICAgICAgIENBTEwgU1RFU1QxKFNTLERTMShLKSxEUzEoSyksU0ZBQykKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFIChOT1VULCopICcgU2hvdWxkbicndCBiZSBoZXJlIGluIENIRUNLMCcKKyAgICAgICAgICAgIFNUT1AKKyAgICAgICAgIEVORCBJRgorICAgMjAgQ09OVElOVUUKKyAgIDQwIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIRUNLMShTRkFDKQorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgIFNGQUMKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSSwgTEVOLCBOUDEKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgRFRSVUUxKDUpLCBEVFJVRTMoNSksIERUUlVFNSg4LDUsMiksIERWKDgsNSwyKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIFNBKDEwKSwgU1RFTVAoMSksIFNUUlVFKDgpLCBTWCg4KQorICAgICAgSU5URUdFUiAgICAgICAgICAgSVRSVUUyKDUpCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgIFNBU1VNLCBTTlJNMgorICAgICAgSU5URUdFUiAgICAgICAgICAgSVNBTUFYCisgICAgICBFWFRFUk5BTCAgICAgICAgICBTQVNVTSwgU05STTIsIElTQU1BWAorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIElURVNUMSwgU1NDQUwsIFNURVNULCBTVEVTVDEKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgIE1BWAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICBTQS8wLjNFMCwgLTEuMEUwLCAwLjBFMCwgMS4wRTAsIDAuM0UwLCAwLjNFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuM0UwLCAwLjNFMCwgMC4zRTAsIDAuM0UwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFYvMC4xRTAsIDIuMEUwLCAyLjBFMCwgMi4wRTAsIDIuMEUwLCAyLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDIuMEUwLCAyLjBFMCwgMC4zRTAsIDMuMEUwLCAzLjBFMCwgMy4wRTAsIDMuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMy4wRTAsIDMuMEUwLCAzLjBFMCwgMC4zRTAsIC0wLjRFMCwgNC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICA0LjBFMCwgNC4wRTAsIDQuMEUwLCA0LjBFMCwgNC4wRTAsIDAuMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNkUwLCAwLjNFMCwgNS4wRTAsIDUuMEUwLCA1LjBFMCwgNS4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICA1LjBFMCwgMC4xRTAsIC0wLjNFMCwgMC41RTAsIC0wLjFFMCwgNi4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICA2LjBFMCwgNi4wRTAsIDYuMEUwLCAwLjFFMCwgOC4wRTAsIDguMEUwLCA4LjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDguMEUwLCA4LjBFMCwgOC4wRTAsIDguMEUwLCAwLjNFMCwgOS4wRTAsIDkuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgOS4wRTAsIDkuMEUwLCA5LjBFMCwgOS4wRTAsIDkuMEUwLCAwLjNFMCwgMi4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC40RTAsIDIuMEUwLCAyLjBFMCwgMi4wRTAsIDIuMEUwLCAyLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMkUwLCAzLjBFMCwgLTAuNkUwLCA1LjBFMCwgMC4zRTAsIDIuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMi4wRTAsIDIuMEUwLCAwLjFFMCwgNC4wRTAsIC0wLjNFMCwgNi4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC41RTAsIDcuMEUwLCAtMC4xRTAsIDMuMEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFRSVUUxLzAuMEUwLCAwLjNFMCwgMC41RTAsIDAuN0UwLCAwLjZFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUUlVFMy8wLjBFMCwgMC4zRTAsIDAuN0UwLCAxLjFFMCwgMS4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVFJVRTUvMC4xMEUwLCAyLjBFMCwgMi4wRTAsIDIuMEUwLCAyLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDIuMEUwLCAyLjBFMCwgMi4wRTAsIC0wLjNFMCwgMy4wRTAsIDMuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMy4wRTAsIDMuMEUwLCAzLjBFMCwgMy4wRTAsIDMuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICA0LjBFMCwgNC4wRTAsIDQuMEUwLCA0LjBFMCwgNC4wRTAsIDQuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4yMEUwLCAtMC42MEUwLCAwLjMwRTAsIDUuMEUwLCA1LjBFMCwgNS4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICA1LjBFMCwgNS4wRTAsIDAuMDNFMCwgLTAuMDlFMCwgMC4xNUUwLCAtMC4wM0UwLAorICAgICArICAgICAgICAgICAgICAgICAgNi4wRTAsIDYuMEUwLCA2LjBFMCwgNi4wRTAsIDAuMTBFMCwgOC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICA4LjBFMCwgOC4wRTAsIDguMEUwLCA4LjBFMCwgOC4wRTAsIDguMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wOUUwLCA5LjBFMCwgOS4wRTAsIDkuMEUwLCA5LjBFMCwgOS4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICA5LjBFMCwgOS4wRTAsIDAuMDlFMCwgMi4wRTAsIC0wLjEyRTAsIDIuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMi4wRTAsIDIuMEUwLCAyLjBFMCwgMi4wRTAsIDAuMDZFMCwgMy4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC4xOEUwLCA1LjBFMCwgMC4wOUUwLCAyLjBFMCwgMi4wRTAsIDIuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wM0UwLCA0LjBFMCwgLTAuMDlFMCwgNi4wRTAsIC0wLjE1RTAsIDcuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuMDNFMCwgMy4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBJVFJVRTIvMCwgMSwgMiwgMiwgMy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRE8gODAgSU5DWCA9IDEsIDIKKyAgICAgICAgIERPIDYwIE5QMSA9IDEsIDUKKyAgICAgICAgICAgIE4gPSBOUDEgLSAxCisgICAgICAgICAgICBMRU4gPSAyKk1BWChOLDEpCisqICAgICAgICAgICAuLiBTZXQgdmVjdG9yIGFyZ3VtZW50cyAuLgorICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExFTgorICAgICAgICAgICAgICAgU1goSSkgPSBEVihJLE5QMSxJTkNYKQorICAgMjAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgIElGIChJQ0FTRS5FUS43KSBUSEVOCisqICAgICAgICAgICAgICAuLiBTTlJNMiAuLgorICAgICAgICAgICAgICAgU1RFTVAoMSkgPSBEVFJVRTEoTlAxKQorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVDEoU05STTIoTixTWCxJTkNYKSxTVEVNUCxTVEVNUCxTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuOCkgVEhFTgorKiAgICAgICAgICAgICAgLi4gU0FTVU0gLi4KKyAgICAgICAgICAgICAgIFNURU1QKDEpID0gRFRSVUUzKE5QMSkKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QxKFNBU1VNKE4sU1gsSU5DWCksU1RFTVAsU1RFTVAsU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjkpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFNTQ0FMIC4uCisgICAgICAgICAgICAgICBDQUxMIFNTQ0FMKE4sU0EoKElOQ1gtMSkqNStOUDEpLFNYLElOQ1gpCisgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTEVOCisgICAgICAgICAgICAgICAgICBTVFJVRShJKSA9IERUUlVFNShJLE5QMSxJTkNYKQorICAgNDAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOLFNYLFNUUlVFLFNUUlVFLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4xMCkgVEhFTgorKiAgICAgICAgICAgICAgLi4gSVNBTUFYIC4uCisgICAgICAgICAgICAgICBDQUxMIElURVNUMShJU0FNQVgoTixTWCxJTkNYKSxJVFJVRTIoTlAxKSkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIFdSSVRFIChOT1VULCopICcgU2hvdWxkbicndCBiZSBoZXJlIGluIENIRUNLMScKKyAgICAgICAgICAgICAgIFNUT1AKKyAgICAgICAgICAgIEVORCBJRgorICAgNjAgICAgQ09OVElOVUUKKyAgIDgwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEVDSzIoU0ZBQykKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTRkFDCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgIFNBLCBTQywgU1MKKyAgICAgIElOVEVHRVIgICAgICAgICAgIEksIEosIEtJLCBLTiwgS1NJWkUsIExFTlgsIExFTlksIE1YLCBNWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBEVDEwWCg3LDQsNCksIERUMTBZKDcsNCw0KSwgRFQ3KDQsNCksCisgICAgICsgICAgICAgICAgICAgICAgICBEVDgoNyw0LDQpLCBEVDlYKDcsNCw0KSwgRFQ5WSg3LDQsNCksIERYMSg3KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIERZMSg3KSwgU1NJWkUxKDQpLCBTU0laRTIoMTQsMiksIFNUWCg3KSwgU1RZKDcpLAorICAgICArICAgICAgICAgICAgICAgICAgU1goNyksIFNZKDcpCisgICAgICBJTlRFR0VSICAgICAgICAgICBJTkNYUyg0KSwgSU5DWVMoNCksIExFTlMoNCwyKSwgTlMoNCkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0RPVAorICAgICAgRVhURVJOQUwgICAgICAgICAgU0RPVAorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIFNBWFBZLCBTQ09QWSwgU1NXQVAsIFNURVNULCBTVEVTVDEKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgIEFCUywgTUlOCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNBLzAuM0UwLworICAgICAgREFUQSAgICAgICAgICAgICAgSU5DWFMvMSwgMiwgLTIsIC0xLworICAgICAgREFUQSAgICAgICAgICAgICAgSU5DWVMvMSwgLTIsIDEsIC0yLworICAgICAgREFUQSAgICAgICAgICAgICAgTEVOUy8xLCAxLCAyLCA0LCAxLCAxLCAzLCA3LworICAgICAgREFUQSAgICAgICAgICAgICAgTlMvMCwgMSwgMiwgNC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERYMS8wLjZFMCwgMC4xRTAsIC0wLjVFMCwgMC44RTAsIDAuOUUwLCAtMC4zRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC40RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEWTEvMC41RTAsIC0wLjlFMCwgMC4zRTAsIDAuN0UwLCAtMC42RTAsIDAuMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC44RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBTQywgU1MvMC44RTAsIDAuNkUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQ3LzAuMEUwLCAwLjMwRTAsIDAuMjFFMCwgMC42MkUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMzBFMCwgLTAuMDdFMCwgMC44NUUwLCAwLjBFMCwgMC4zMEUwLCAtMC43OUUwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNzRFMCwgMC4wRTAsIDAuMzBFMCwgMC4zM0UwLCAxLjI3RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVDgvMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjY4RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjY4RTAsIC0wLjg3RTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNjhFMCwgLTAuODdFMCwgMC4xNUUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC45NEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjVFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNjhFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjM1RTAsIC0wLjlFMCwgMC40OEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMzhFMCwgLTAuOUUwLCAwLjU3RTAsIDAuN0UwLCAtMC43NUUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4yRTAsIDAuOThFMCwgMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjY4RTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjM1RTAsIC0wLjcyRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMzhFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjYzRTAsIDAuMTVFMCwgMC44OEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjY4RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjY4RTAsIC0wLjlFMCwgMC4zM0UwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuNjhFMCwgLTAuOUUwLCAwLjMzRTAsIDAuN0UwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuNzVFMCwgMC4yRTAsIDEuMDRFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUOVgvMC42RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjc4RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjc4RTAsIC0wLjQ2RTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNzhFMCwgLTAuNDZFMCwgLTAuMjJFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDEuMDZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC42RTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjc4RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC42NkUwLCAwLjFFMCwgLTAuMUUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuOTZFMCwgMC4xRTAsIC0wLjc2RTAsIDAuOEUwLCAwLjkwRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC4zRTAsIC0wLjAyRTAsIDAuNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC43OEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgLTAuMDZFMCwgMC4xRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC4xRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjkwRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjFFMCwgLTAuMjJFMCwgMC44RTAsIDAuMThFMCwgLTAuM0UwLCAtMC4wMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC42RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjc4RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjc4RTAsIDAuMjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC43OEUwLCAwLjI2RTAsIC0wLjc2RTAsIDEuMTJFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVDlZLzAuNUUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wNEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wNEUwLCAtMC43OEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjA0RTAsIC0wLjc4RTAsIDAuNTRFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMDhFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC41RTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjA0RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjdFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjlFMCwgLTAuMTJFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjY0RTAsIC0wLjlFMCwgLTAuMzBFMCwgMC43RTAsIC0wLjE4RTAsIDAuMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4yOEUwLCAwLjVFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMDRFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuN0UwLCAtMS4wOEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjY0RTAsIC0xLjI2RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjU0RTAsIDAuMjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC41RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wNEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wNEUwLCAtMC45RTAsIDAuMThFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjA0RTAsIC0wLjlFMCwgMC4xOEUwLCAwLjdFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjE4RTAsIDAuMkUwLCAwLjE2RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVDEwWC8wLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNUUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC41RTAsIC0wLjlFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC41RTAsIC0wLjlFMCwgMC4zRTAsIDAuN0UwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC42RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjVFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuM0UwLCAwLjFFMCwgMC41RTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC44RTAsIDAuMUUwLCAtMC42RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjhFMCwgMC4zRTAsIC0wLjNFMCwgMC41RTAsIDAuNkUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC41RTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAtMC45RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjFFMCwgMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjdFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMUUwLCAwLjNFMCwgMC44RTAsIC0wLjlFMCwgLTAuM0UwLCAwLjVFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjVFMCwgMC4zRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNUUwLCAwLjNFMCwgLTAuNkUwLCAwLjhFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEVDEwWS8wLjVFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC42RTAsIDAuMUUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjZFMCwgMC4xRTAsIC0wLjVFMCwgMC44RTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjVFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgLTAuNUUwLCAtMC45RTAsIDAuNkUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIC0wLjRFMCwgLTAuOUUwLCAwLjlFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuN0UwLCAtMC41RTAsIDAuMkUwLCAwLjZFMCwgMC41RTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjZFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIC0wLjVFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC40RTAsIDAuOUUwLCAtMC41RTAsIDAuNkUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNkUwLCAtMC45RTAsIDAuMUUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuNkUwLCAtMC45RTAsIDAuMUUwLCAwLjdFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjVFMCwgMC4yRTAsIDAuOEUwLworICAgICAgREFUQSAgICAgICAgICAgICAgU1NJWkUxLzAuMEUwLCAwLjNFMCwgMS42RTAsIDMuMkUwLworICAgICAgREFUQSAgICAgICAgICAgICAgU1NJWkUyLzAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDEuMTdFMCwgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLCAxLjE3RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBETyAxMjAgS0kgPSAxLCA0CisgICAgICAgICBJTkNYID0gSU5DWFMoS0kpCisgICAgICAgICBJTkNZID0gSU5DWVMoS0kpCisgICAgICAgICBNWCA9IEFCUyhJTkNYKQorICAgICAgICAgTVkgPSBBQlMoSU5DWSkKKyoKKyAgICAgICAgIERPIDEwMCBLTiA9IDEsIDQKKyAgICAgICAgICAgIE4gPSBOUyhLTikKKyAgICAgICAgICAgIEtTSVpFID0gTUlOKDIsS04pCisgICAgICAgICAgICBMRU5YID0gTEVOUyhLTixNWCkKKyAgICAgICAgICAgIExFTlkgPSBMRU5TKEtOLE1ZKQorKiAgICAgICAgICAgLi4gSW5pdGlhbGl6ZSBhbGwgYXJndW1lbnQgYXJyYXlzIC4uCisgICAgICAgICAgICBETyAyMCBJID0gMSwgNworICAgICAgICAgICAgICAgU1goSSkgPSBEWDEoSSkKKyAgICAgICAgICAgICAgIFNZKEkpID0gRFkxKEkpCisgICAyMCAgICAgICBDT05USU5VRQorKgorICAgICAgICAgICAgSUYgKElDQVNFLkVRLjEpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFNET1QgLi4KKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QxKFNET1QoTixTWCxJTkNYLFNZLElOQ1kpLERUNyhLTixLSSksU1NJWkUxKEtOKQorICAgICArICAgICAgICAgICAgICAgICAgICAgLFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4yKSBUSEVOCisqICAgICAgICAgICAgICAuLiBTQVhQWSAuLgorICAgICAgICAgICAgICAgQ0FMTCBTQVhQWShOLFNBLFNYLElOQ1gsU1ksSU5DWSkKKyAgICAgICAgICAgICAgIERPIDQwIEogPSAxLCBMRU5ZCisgICAgICAgICAgICAgICAgICBTVFkoSikgPSBEVDgoSixLTixLSSkKKyAgIDQwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTlksU1ksU1RZLFNTSVpFMigxLEtTSVpFKSxTRkFDKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNSkgVEhFTgorKiAgICAgICAgICAgICAgLi4gU0NPUFkgLi4KKyAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCA3CisgICAgICAgICAgICAgICAgICBTVFkoSSkgPSBEVDEwWShJLEtOLEtJKQorICAgNjAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIENBTEwgU0NPUFkoTixTWCxJTkNYLFNZLElOQ1kpCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTlksU1ksU1RZLFNTSVpFMigxLDEpLDEuMEUwKQorICAgICAgICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuNikgVEhFTgorKiAgICAgICAgICAgICAgLi4gU1NXQVAgLi4KKyAgICAgICAgICAgICAgIENBTEwgU1NXQVAoTixTWCxJTkNYLFNZLElOQ1kpCisgICAgICAgICAgICAgICBETyA4MCBJID0gMSwgNworICAgICAgICAgICAgICAgICAgU1RYKEkpID0gRFQxMFgoSSxLTixLSSkKKyAgICAgICAgICAgICAgICAgIFNUWShJKSA9IERUMTBZKEksS04sS0kpCisgICA4MCAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgQ0FMTCBTVEVTVChMRU5YLFNYLFNUWCxTU0laRTIoMSwxKSwxLjBFMCkKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOWSxTWSxTVFksU1NJWkUyKDEsMSksMS4wRTApCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzInCisgICAgICAgICAgICAgICBTVE9QCisgICAgICAgICAgICBFTkQgSUYKKyAgMTAwICAgIENPTlRJTlVFCisgIDEyMCBDT05USU5VRQorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hFQ0szKFNGQUMpCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgU0ZBQworKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQSwgU0MsIFNTCisgICAgICBJTlRFR0VSICAgICAgICAgICBJLCBLLCBLSSwgS04sIEtTSVpFLCBMRU5YLCBMRU5ZLCBNWCwgTVkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgQ09QWVgoNSksIENPUFlZKDUpLCBEVDlYKDcsNCw0KSwgRFQ5WSg3LDQsNCksCisgICAgICsgICAgICAgICAgICAgICAgICBEWDEoNyksIERZMSg3KSwgTVdQQygxMSksIE1XUFMoMTEpLCBNV1BTVFgoNSksCisgICAgICsgICAgICAgICAgICAgICAgICBNV1BTVFkoNSksIE1XUFRYKDExLDUpLCBNV1BUWSgxMSw1KSwgTVdQWCg1KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIE1XUFkoNSksIFNTSVpFMigxNCwyKSwgU1RYKDcpLCBTVFkoNyksIFNYKDcpLAorICAgICArICAgICAgICAgICAgICAgICAgU1koNykKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElOQ1hTKDQpLCBJTkNZUyg0KSwgTEVOUyg0LDIpLCBNV1BJTlgoMTEpLAorICAgICArICAgICAgICAgICAgICAgICAgTVdQSU5ZKDExKSwgTVdQTigxMSksIE5TKDQpCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgU1JPVCwgU1RFU1QKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgIEFCUywgTUlOCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNBLzAuM0UwLworICAgICAgREFUQSAgICAgICAgICAgICAgSU5DWFMvMSwgMiwgLTIsIC0xLworICAgICAgREFUQSAgICAgICAgICAgICAgSU5DWVMvMSwgLTIsIDEsIC0yLworICAgICAgREFUQSAgICAgICAgICAgICAgTEVOUy8xLCAxLCAyLCA0LCAxLCAxLCAzLCA3LworICAgICAgREFUQSAgICAgICAgICAgICAgTlMvMCwgMSwgMiwgNC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERYMS8wLjZFMCwgMC4xRTAsIC0wLjVFMCwgMC44RTAsIDAuOUUwLCAtMC4zRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAtMC40RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBEWTEvMC41RTAsIC0wLjlFMCwgMC4zRTAsIDAuN0UwLCAtMC42RTAsIDAuMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC44RTAvCisgICAgICBEQVRBICAgICAgICAgICAgICBTQywgU1MvMC44RTAsIDAuNkUwLworICAgICAgREFUQSAgICAgICAgICAgICAgRFQ5WC8wLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNzhFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuNzhFMCwgLTAuNDZFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC43OEUwLCAtMC40NkUwLCAtMC4yMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMS4wNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjZFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNzhFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjY2RTAsIDAuMUUwLCAtMC4xRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC45NkUwLCAwLjFFMCwgLTAuNzZFMCwgMC44RTAsIDAuOTBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjNFMCwgLTAuMDJFMCwgMC42RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjc4RTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAtMC4wNkUwLCAwLjFFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIC0wLjFFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuOTBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMUUwLCAtMC4yMkUwLCAwLjhFMCwgMC4xOEUwLCAtMC4zRTAsIC0wLjAyRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjZFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNzhFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuNzhFMCwgMC4yNkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjc4RTAsIDAuMjZFMCwgLTAuNzZFMCwgMS4xMkUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIERUOVkvMC41RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjA0RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjA0RTAsIC0wLjc4RTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMDRFMCwgLTAuNzhFMCwgMC41NEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wOEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjVFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMDRFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuN0UwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuOUUwLCAtMC4xMkUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNjRFMCwgLTAuOUUwLCAtMC4zMEUwLCAwLjdFMCwgLTAuMThFMCwgMC4yRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjI4RTAsIDAuNUUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wNEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC43RTAsIC0xLjA4RTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuNjRFMCwgLTEuMjZFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuNTRFMCwgMC4yMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjVFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjA0RTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwKKyAgICAgKyAgICAgICAgICAgICAgICAgIDAuMEUwLCAwLjA0RTAsIC0wLjlFMCwgMC4xOEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMC4wRTAsIDAuMDRFMCwgLTAuOUUwLCAwLjE4RTAsIDAuN0UwLAorICAgICArICAgICAgICAgICAgICAgICAgLTAuMThFMCwgMC4yRTAsIDAuMTZFMC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNTSVpFMi8wLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLAorICAgICArICAgICAgICAgICAgICAgICAgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsIDAuMEUwLCAwLjBFMCwgMC4wRTAsCisgICAgICsgICAgICAgICAgICAgICAgICAwLjBFMCwgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLCAxLjE3RTAsCisgICAgICsgICAgICAgICAgICAgICAgICAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMCwgMS4xN0UwLAorICAgICArICAgICAgICAgICAgICAgICAgMS4xN0UwLCAxLjE3RTAsIDEuMTdFMC8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgRE8gNjAgS0kgPSAxLCA0CisgICAgICAgICBJTkNYID0gSU5DWFMoS0kpCisgICAgICAgICBJTkNZID0gSU5DWVMoS0kpCisgICAgICAgICBNWCA9IEFCUyhJTkNYKQorICAgICAgICAgTVkgPSBBQlMoSU5DWSkKKyoKKyAgICAgICAgIERPIDQwIEtOID0gMSwgNAorICAgICAgICAgICAgTiA9IE5TKEtOKQorICAgICAgICAgICAgS1NJWkUgPSBNSU4oMixLTikKKyAgICAgICAgICAgIExFTlggPSBMRU5TKEtOLE1YKQorICAgICAgICAgICAgTEVOWSA9IExFTlMoS04sTVkpCisqCisgICAgICAgICAgICBJRiAoSUNBU0UuRVEuNCkgVEhFTgorKiAgICAgICAgICAgICAgLi4gU1JPVCAuLgorICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIDcKKyAgICAgICAgICAgICAgICAgIFNYKEkpID0gRFgxKEkpCisgICAgICAgICAgICAgICAgICBTWShJKSA9IERZMShJKQorICAgICAgICAgICAgICAgICAgU1RYKEkpID0gRFQ5WChJLEtOLEtJKQorICAgICAgICAgICAgICAgICAgU1RZKEkpID0gRFQ5WShJLEtOLEtJKQorICAgMjAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIENBTEwgU1JPVChOLFNYLElOQ1gsU1ksSU5DWSxTQyxTUykKKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QoTEVOWCxTWCxTVFgsU1NJWkUyKDEsS1NJWkUpLFNGQUMpCisgICAgICAgICAgICAgICBDQUxMIFNURVNUKExFTlksU1ksU1RZLFNTSVpFMigxLEtTSVpFKSxTRkFDKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgV1JJVEUgKE5PVVQsKikgJyBTaG91bGRuJyd0IGJlIGhlcmUgaW4gQ0hFQ0szJworICAgICAgICAgICAgICAgU1RPUAorICAgICAgICAgICAgRU5EIElGCisgICA0MCAgICBDT05USU5VRQorICAgNjAgQ09OVElOVUUKKyoKKyAgICAgIE1XUEMoMSkgPSAxCisgICAgICBETyA4MCBJID0gMiwgMTEKKyAgICAgICAgIE1XUEMoSSkgPSAwCisgICA4MCBDT05USU5VRQorICAgICAgTVdQUygxKSA9IDAKKyAgICAgIERPIDEwMCBJID0gMiwgNgorICAgICAgICAgTVdQUyhJKSA9IDEKKyAgMTAwIENPTlRJTlVFCisgICAgICBETyAxMjAgSSA9IDcsIDExCisgICAgICAgICBNV1BTKEkpID0gLTEKKyAgMTIwIENPTlRJTlVFCisgICAgICBNV1BJTlgoMSkgPSAxCisgICAgICBNV1BJTlgoMikgPSAxCisgICAgICBNV1BJTlgoMykgPSAxCisgICAgICBNV1BJTlgoNCkgPSAtMQorICAgICAgTVdQSU5YKDUpID0gMQorICAgICAgTVdQSU5YKDYpID0gLTEKKyAgICAgIE1XUElOWCg3KSA9IDEKKyAgICAgIE1XUElOWCg4KSA9IDEKKyAgICAgIE1XUElOWCg5KSA9IC0xCisgICAgICBNV1BJTlgoMTApID0gMQorICAgICAgTVdQSU5YKDExKSA9IC0xCisgICAgICBNV1BJTlkoMSkgPSAxCisgICAgICBNV1BJTlkoMikgPSAxCisgICAgICBNV1BJTlkoMykgPSAtMQorICAgICAgTVdQSU5ZKDQpID0gLTEKKyAgICAgIE1XUElOWSg1KSA9IDIKKyAgICAgIE1XUElOWSg2KSA9IDEKKyAgICAgIE1XUElOWSg3KSA9IDEKKyAgICAgIE1XUElOWSg4KSA9IC0xCisgICAgICBNV1BJTlkoOSkgPSAtMQorICAgICAgTVdQSU5ZKDEwKSA9IDIKKyAgICAgIE1XUElOWSgxMSkgPSAxCisgICAgICBETyAxNDAgSSA9IDEsIDExCisgICAgICAgICBNV1BOKEkpID0gNQorICAxNDAgQ09OVElOVUUKKyAgICAgIE1XUE4oNSkgPSAzCisgICAgICBNV1BOKDEwKSA9IDMKKyAgICAgIERPIDE2MCBJID0gMSwgNQorICAgICAgICAgTVdQWChJKSA9IEkKKyAgICAgICAgIE1XUFkoSSkgPSBJCisgICAgICAgICBNV1BUWCgxLEkpID0gSQorICAgICAgICAgTVdQVFkoMSxJKSA9IEkKKyAgICAgICAgIE1XUFRYKDIsSSkgPSBJCisgICAgICAgICBNV1BUWSgyLEkpID0gLUkKKyAgICAgICAgIE1XUFRYKDMsSSkgPSA2IC0gSQorICAgICAgICAgTVdQVFkoMyxJKSA9IEkgLSA2CisgICAgICAgICBNV1BUWCg0LEkpID0gSQorICAgICAgICAgTVdQVFkoNCxJKSA9IC1JCisgICAgICAgICBNV1BUWCg2LEkpID0gNiAtIEkKKyAgICAgICAgIE1XUFRZKDYsSSkgPSBJIC0gNgorICAgICAgICAgTVdQVFgoNyxJKSA9IC1JCisgICAgICAgICBNV1BUWSg3LEkpID0gSQorICAgICAgICAgTVdQVFgoOCxJKSA9IEkgLSA2CisgICAgICAgICBNV1BUWSg4LEkpID0gNiAtIEkKKyAgICAgICAgIE1XUFRYKDksSSkgPSAtSQorICAgICAgICAgTVdQVFkoOSxJKSA9IEkKKyAgICAgICAgIE1XUFRYKDExLEkpID0gSSAtIDYKKyAgICAgICAgIE1XUFRZKDExLEkpID0gNiAtIEkKKyAgMTYwIENPTlRJTlVFCisgICAgICBNV1BUWCg1LDEpID0gMQorICAgICAgTVdQVFgoNSwyKSA9IDMKKyAgICAgIE1XUFRYKDUsMykgPSA1CisgICAgICBNV1BUWCg1LDQpID0gNAorICAgICAgTVdQVFgoNSw1KSA9IDUKKyAgICAgIE1XUFRZKDUsMSkgPSAtMQorICAgICAgTVdQVFkoNSwyKSA9IDIKKyAgICAgIE1XUFRZKDUsMykgPSAtMgorICAgICAgTVdQVFkoNSw0KSA9IDQKKyAgICAgIE1XUFRZKDUsNSkgPSAtMworICAgICAgTVdQVFgoMTAsMSkgPSAtMQorICAgICAgTVdQVFgoMTAsMikgPSAtMworICAgICAgTVdQVFgoMTAsMykgPSAtNQorICAgICAgTVdQVFgoMTAsNCkgPSA0CisgICAgICBNV1BUWCgxMCw1KSA9IDUKKyAgICAgIE1XUFRZKDEwLDEpID0gMQorICAgICAgTVdQVFkoMTAsMikgPSAyCisgICAgICBNV1BUWSgxMCwzKSA9IDIKKyAgICAgIE1XUFRZKDEwLDQpID0gNAorICAgICAgTVdQVFkoMTAsNSkgPSAzCisgICAgICBETyAyMDAgSSA9IDEsIDExCisgICAgICAgICBJTkNYID0gTVdQSU5YKEkpCisgICAgICAgICBJTkNZID0gTVdQSU5ZKEkpCisgICAgICAgICBETyAxODAgSyA9IDEsIDUKKyAgICAgICAgICAgIENPUFlYKEspID0gTVdQWChLKQorICAgICAgICAgICAgQ09QWVkoSykgPSBNV1BZKEspCisgICAgICAgICAgICBNV1BTVFgoSykgPSBNV1BUWChJLEspCisgICAgICAgICAgICBNV1BTVFkoSykgPSBNV1BUWShJLEspCisgIDE4MCAgICBDT05USU5VRQorICAgICAgICAgQ0FMTCBTUk9UKE1XUE4oSSksQ09QWVgsSU5DWCxDT1BZWSxJTkNZLE1XUEMoSSksTVdQUyhJKSkKKyAgICAgICAgIENBTEwgU1RFU1QoNSxDT1BZWCxNV1BTVFgsTVdQU1RYLFNGQUMpCisgICAgICAgICBDQUxMIFNURVNUKDUsQ09QWVksTVdQU1RZLE1XUFNUWSxTRkFDKQorICAyMDAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNURVNUKExFTixTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUICoqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIFNVQlIgQ09NUEFSRVMgQVJSQVlTICBTQ09NUCgpIEFORCBTVFJVRSgpIE9GIExFTkdUSCBMRU4gVE8KKyogICAgIFNFRSBJRiBUSEUgVEVSTSBCWSBURVJNIERJRkZFUkVOQ0VTLCBNVUxUSVBMSUVEIEJZIFNGQUMsIEFSRQorKiAgICAgTkVHTElHSUJMRS4KKyoKKyogICAgIEMuIEwuIExBV1NPTiwgSlBMLCAxOTc0IERFQyAxMAorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgIFNGQUMKKyAgICAgIElOVEVHRVIgICAgICAgICAgTEVOCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0NPTVAoTEVOKSwgU1NJWkUoTEVOKSwgU1RSVUUoTEVOKQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICBTRAorICAgICAgSU5URUdFUiAgICAgICAgICBJCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgU0RJRkYKKyAgICAgIEVYVEVSTkFMICAgICAgICAgU0RJRkYKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgQUJTCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgRE8gNDAgSSA9IDEsIExFTgorICAgICAgICAgU0QgPSBTQ09NUChJKSAtIFNUUlVFKEkpCisgICAgICAgICBJRiAoU0RJRkYoQUJTKFNTSVpFKEkpKStBQlMoU0ZBQypTRCksQUJTKFNTSVpFKEkpKSkuRVEuMC4wRTApCisgICAgICsgICAgICAgR08gVE8gNDAKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkUgICAgU0NPTVAoSSkgSVMgTk9UIENMT1NFIFRPIFNUUlVFKEkpLgorKgorICAgICAgICAgSUYgKCAuTk9ULiBQQVNTKSBHTyBUTyAyMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQgRkFJTCBNRVNTQUdFIEFORCBIRUFERVIuCisgICAgICAgICBQQVNTID0gLkZBTFNFLgorICAgICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpCisgICAgICAgICBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwICAgIFdSSVRFIChOT1VULDk5OTk3KSBJQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgSSwgU0NPTVAoSSksCisgICAgICsgICAgIFNUUlVFKEkpLCBTRCwgU1NJWkUoSSkKKyAgIDQwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKzk5OTk5IEZPUk1BVCAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwnKQorOTk5OTggRk9STUFUICgvJyBDQVNFICBOIElOQ1ggSU5DWSBNT0RFICBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICsgICAgICAgJyBDT01QKEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKEkpICBESUZGRVJFTkNFJywKKyAgICAgKyAgICAgICAnICAgICBTSVpFKEkpJywvMVgpCis5OTk5NyBGT1JNQVQgKDFYLEk0LEkzLDNJNSxJMywyRTM2LjgsMkUxMi40KQorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNURVNUMShTQ09NUDEsU1RSVUUxLFNTSVpFLFNGQUMpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqIFNURVNUMSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgVEhJUyBJUyBBTiBJTlRFUkZBQ0UgU1VCUk9VVElORSBUTyBBQ0NPTU9EQVRFIFRIRSBGT1JUUkFOCisqICAgICBSRVFVSVJFTUVOVCBUSEFUIFdIRU4gQSBEVU1NWSBBUkdVTUVOVCBJUyBBTiBBUlJBWSwgVEhFCisqICAgICBBQ1RVQUwgQVJHVU1FTlQgTVVTVCBBTFNPIEJFIEFOIEFSUkFZIE9SIEFOIEFSUkFZIEVMRU1FTlQuCisqCisqICAgICBDLkwuIExBV1NPTiwgSlBMLCAxOTc4IERFQyA2CisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQ09NUDEsIFNGQUMsIFNUUlVFMQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTU0laRSgqKQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICBTQ09NUCgxKSwgU1RSVUUoMSkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICBTVEVTVAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBTQ09NUCgxKSA9IFNDT01QMQorICAgICAgU1RSVUUoMSkgPSBTVFJVRTEKKyAgICAgIENBTEwgU1RFU1QoMSxTQ09NUCxTVFJVRSxTU0laRSxTRkFDKQorKgorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFJFQUwgICAgICAgICAgICAgRlVOQ1RJT04gU0RJRkYoU0EsU0IpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0RJRkYgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgIENPTVBVVEVTIERJRkZFUkVOQ0UgT0YgVFdPIE5VTUJFUlMuICBDLiBMLiBMQVdTT04sIEpQTCAxOTc0IEZFQiAxNQorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQSwgU0IKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgU0RJRkYgPSBTQSAtIFNCCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBJVEVTVDEoSUNPTVAsSVRSVUUpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSVRFU1QxICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgIFRISVMgU1VCUk9VVElORSBDT01QQVJFUyBUSEUgVkFSSUFCTEVTIElDT01QIEFORCBJVFJVRSBGT1IKKyogICAgIEVRVUFMSVRZLgorKiAgICAgQy4gTC4gTEFXU09OLCBKUEwsIDE5NzQgREVDIDEwCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNPTVAsIElUUlVFCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElECisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIElGIChJQ09NUC5FUS5JVFJVRSkgR08gVE8gNDAKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVSRSBJQ09NUCBJUyBOT1QgRVFVQUwgVE8gSVRSVUUuCisqCisgICAgICBJRiAoIC5OT1QuIFBBU1MpIEdPIFRPIDIwCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVCBGQUlMIE1FU1NBR0UgQU5EIEhFQURFUi4KKyAgICAgIFBBU1MgPSAuRkFMU0UuCisgICAgICBXUklURSAoTk9VVCw5OTk5OSkKKyAgICAgIFdSSVRFIChOT1VULDk5OTk4KQorICAgMjAgSUQgPSBJQ09NUCAtIElUUlVFCisgICAgICBXUklURSAoTk9VVCw5OTk5NykgSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIElDT01QLCBJVFJVRSwgSUQKKyAgIDQwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKzk5OTk5IEZPUk1BVCAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwnKQorOTk5OTggRk9STUFUICgvJyBDQVNFICBOIElOQ1ggSU5DWSBNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICsgICAgICAgJyBDT01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICAgICBESUZGRVJFTkNFJywKKyAgICAgKyAgICAgICAvMVgpCis5OTk5NyBGT1JNQVQgKDFYLEk0LEkzLDNJNSwySTM2LEkxMikKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL3NibGF0Mi5kYXQgYi9ibGFzL3Rlc3Rpbmcvc2JsYXQyLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTM3ZDMwCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL3NibGF0Mi5kYXQKQEAgLTAsMCArMSwzNCBAQAorJ3NibGF0Mi5zdW1tJyAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCis2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKydzYmxhdDIuc25hcCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKy0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorVCAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCiswIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBLCiswIDEgMiA0ICAgICAgICAgICBWQUxVRVMgT0YgSworNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisxIDIgLTEgLTIgICAgICAgICBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorMC4wIDEuMCAwLjcgICAgICAgVkFMVUVTIE9GIEFMUEhBCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKzAuMCAxLjAgMC45ICAgICAgIFZBTFVFUyBPRiBCRVRBCitTR0VNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU0dCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NTWU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTU0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1NQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NUUk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTVEJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1RQTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NUUlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTVEJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1RQU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NHRVIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTU1lSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1NQUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NTWVIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTU1BSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL3NibGF0Mi5mIGIvYmxhcy90ZXN0aW5nL3NibGF0Mi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1N2E4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3Rpbmcvc2JsYXQyLmYKQEAgLTAsMCArMSwzMTM4IEBACisgICAgICBQUk9HUkFNIFNCTEFUMgorKgorKiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgUkVBTCAgICAgICAgICAgICBMZXZlbCAyIEJsYXMuCisqCisqICBUaGUgcHJvZ3JhbSBtdXN0IGJlIGRyaXZlbiBieSBhIHNob3J0IGRhdGEgZmlsZS4gVGhlIGZpcnN0IDE4IHJlY29yZHMKKyogIG9mIHRoZSBmaWxlIGFyZSByZWFkIHVzaW5nIGxpc3QtZGlyZWN0ZWQgaW5wdXQsIHRoZSBsYXN0IDE2IHJlY29yZHMKKyogIGFyZSByZWFkIHVzaW5nIHRoZSBmb3JtYXQgKCBBNiwgTDIgKS4gQW4gYW5ub3RhdGVkIGV4YW1wbGUgb2YgYSBkYXRhCisqICBmaWxlIGNhbiBiZSBvYnRhaW5lZCBieSBkZWxldGluZyB0aGUgZmlyc3QgMyBjaGFyYWN0ZXJzIGZyb20gdGhlCisqICBmb2xsb3dpbmcgMzQgbGluZXM6CisqICAnU0JMQVQyLlNVTU0nICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKyogIDYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorKiAgJ1NCTEFUMi5TTkFQJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorKiAgLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorKiAgRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorKiAgRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCisqICBUICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKyogIDE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCisqICA2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKyogIDAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCisqICA0ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEsKKyogIDAgMSAyIDQgICAgICAgICAgIFZBTFVFUyBPRiBLCisqICA0ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIElOQ1ggQU5EIElOQ1kKKyogIDEgMiAtMSAtMiAgICAgICAgIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisqICAzICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCisqICAwLjAgMS4wIDAuNyAgICAgICBWQUxVRVMgT0YgQUxQSEEKKyogIDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorKiAgMC4wIDEuMCAwLjkgICAgICAgVkFMVUVTIE9GIEJFVEEKKyogIFNHRU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBTR0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgU1NZTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFNTQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBTU1BNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgU1RSTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFNUQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBTVFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgU1RSU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFNUQlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBTVFBTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgU0dFUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFNTWVIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBTU1BSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgU1NZUjIgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFNTUFIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqCisqICAgICBTZWU6CisqCisqICAgICAgICBEb25nYXJyYSBKLiBKLiwgRHUgQ3JveiBKLiBKLiwgSGFtbWFybGluZyBTLiAgYW5kIEhhbnNvbiBSLiBKLi4KKyogICAgICAgIEFuICBleHRlbmRlZCAgc2V0IG9mIEZvcnRyYW4gIEJhc2ljIExpbmVhciBBbGdlYnJhIFN1YnByb2dyYW1zLgorKgorKiAgICAgICAgVGVjaG5pY2FsICBNZW1vcmFuZGEgIE5vcy4gNDEgKHJldmlzaW9uIDMpIGFuZCA4MSwgIE1hdGhlbWF0aWNzCisqICAgICAgICBhbmQgIENvbXB1dGVyIFNjaWVuY2UgIERpdmlzaW9uLCAgQXJnb25uZSAgTmF0aW9uYWwgTGFib3JhdG9yeSwKKyogICAgICAgIDk3MDAgU291dGggQ2FzcyBBdmVudWUsIEFyZ29ubmUsIElsbGlub2lzIDYwNDM5LCBVUy4KKyoKKyogICAgICAgIE9yCisqCisqICAgICAgICBOQUcgIFRlY2huaWNhbCBSZXBvcnRzIFRSMy84NyBhbmQgVFI0Lzg3LCAgTnVtZXJpY2FsIEFsZ29yaXRobXMKKyogICAgICAgIEdyb3VwICBMdGQuLCAgTkFHICBDZW50cmFsICBPZmZpY2UsICAyNTYgIEJhbmJ1cnkgIFJvYWQsIE94Zm9yZAorKiAgICAgICAgT1gyIDdERSwgVUssICBhbmQgIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEluYy4sICAxMTAxICAzMXN0CisqICAgICAgICBTdHJlZXQsICBTdWl0ZSAxMDAsICBEb3duZXJzIEdyb3ZlLCAgSWxsaW5vaXMgNjA1MTUtMTI2MywgIFVTQS4KKyoKKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOID0gNSApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTlNVQlMKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5TVUJTID0gMTYgKQorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCwgSEFMRiA9IDAuNSwgT05FID0gMS4wICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOTUFYLCBJTkNNQVgKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5NQVggPSA2NSwgSU5DTUFYID0gMiApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTklOTUFYLCBOSURNQVgsIE5LQk1BWCwgTkFMTUFYLCBOQkVNQVgKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JTk1BWCA9IDcsIE5JRE1BWCA9IDksIE5LQk1BWCA9IDcsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkFMTUFYID0gNywgTkJFTUFYID0gNyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBFUlIsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElTTlVNLCBKLCBOLCBOQUxGLCBOQkVULCBOSURJTSwgTklOQywgTktCLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTFRFU1RULCBSRVdJLCBTQU1FLCBTRkFUQUwsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgIFRTVEVSUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUVUCisgICAgICBDSEFSQUNURVIqMzIgICAgICAgU05BUFMsIFNVTU1SWQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQUxGKCBOQUxNQVggKSwgQVMoIE5NQVgqTk1BWCApLCBCRVQoIE5CRU1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEcoIE5NQVggKSwgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCAyKk5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRE1BWCApLCBJTkMoIE5JTk1BWCApLCBLQiggTktCTUFYICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMVEVTVCggTlNVQlMgKQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FUyggTlNVQlMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgU0RJRkYKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTRElGRiwgTFNFCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNDSEsxLCBTQ0hLMiwgU0NISzMsIFNDSEs0LCBTQ0hLNSwgU0NISzYsCisgICAgICQgICAgICAgICAgICAgICAgICAgU0NIS0UsIFNNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIFNOQU1FUy8nU0dFTVYgJywgJ1NHQk1WICcsICdTU1lNViAnLCAnU1NCTVYgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnU1NQTVYgJywgJ1NUUk1WICcsICdTVEJNViAnLCAnU1RQTVYgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnU1RSU1YgJywgJ1NUQlNWICcsICdTVFBTViAnLCAnU0dFUiAgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnU1NZUiAgJywgJ1NTUFIgICcsICdTU1lSMiAnLCAnU1NQUjIgJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc3VtbWFyeSBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTVU1NUlkKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTk9VVAorICAgICAgT1BFTiggTk9VVCwgRklMRSA9IFNVTU1SWSwgU1RBVFVTID0gJ05FVycgKQorICAgICAgTk9VVEMgPSBOT1VUCisqCisqICAgICBSZWFkIG5hbWUgYW5kIHVuaXQgbnVtYmVyIGZvciBzbmFwc2hvdCBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTTkFQUworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOVFJBCisgICAgICBUUkFDRSA9IE5UUkEuR0UuMAorICAgICAgSUYoIFRSQUNFIClUSEVOCisgICAgICAgICBPUEVOKCBOVFJBLCBGSUxFID0gU05BUFMsIFNUQVRVUyA9ICdORVcnICkKKyAgICAgIEVORCBJRgorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgcmV3aW5kaW5nIG9mIHRoZSBzbmFwc2hvdCBmaWxlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClSRVdJCisgICAgICBSRVdJID0gUkVXSS5BTkQuVFJBQ0UKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHN0b3BwaW5nIG9uIGFueSBmYWlsdXJlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTRkFUQUwKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBlcnJvciBleGl0cyBhcmUgdG8gYmUgdGVzdGVkLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUU1RFUlIKKyogICAgIFJlYWQgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiB0aGUgdGVzdCByYXRpbworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUSFJFU0gKKyoKKyogICAgIFJlYWQgYW5kIGNoZWNrIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgdGVzdHMuCisqCisqICAgICBWYWx1ZXMgb2YgTgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOSURJTQorICAgICAgSUYoIE5JRElNLkxULjEuT1IuTklESU0uR1QuTklETUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ04nLCBOSURNQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgRE8gMTAgSSA9IDEsIE5JRElNCisgICAgICAgICBJRiggSURJTSggSSApLkxULjAuT1IuSURJTSggSSApLkdULk5NQVggKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClOTUFYCisgICAgICAgICAgICBHTyBUTyAyMzAKKyAgICAgICAgIEVORCBJRgorICAgMTAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBLCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5LQgorICAgICAgSUYoIE5LQi5MVC4xLk9SLk5LQi5HVC5OS0JNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknSycsIE5LQk1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIERPIDIwIEkgPSAxLCBOS0IKKyAgICAgICAgIElGKCBLQiggSSApLkxULjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1ICkKKyAgICAgICAgICAgIEdPIFRPIDIzMAorICAgICAgICAgRU5EIElGCisgICAyMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIElOQ1ggYW5kIElOQ1kKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklOQworICAgICAgSUYoIE5JTkMuTFQuMS5PUi5OSU5DLkdULk5JTk1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdJTkNYIEFORCBJTkNZJywgTklOTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBETyAzMCBJID0gMSwgTklOQworICAgICAgICAgSUYoIElOQyggSSApLkVRLjAuT1IuQUJTKCBJTkMoIEkgKSApLkdULklOQ01BWCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKUlOQ01BWAorICAgICAgICAgICAgR08gVE8gMjMwCisgICAgICAgICBFTkQgSUYKKyAgIDMwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MSApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODggKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODAgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyA0MCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICA0MCBDT05USU5VRQorICAgNTAgUkVBRCggTklOLCBGTVQgPSA5OTg0LCBFTkQgPSA4MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDYwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA3MAorICAgNjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg2IClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDcwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDUwCisqCisgICA4MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBPTkUKKyAgIDkwIENPTlRJTlVFCisgICAgICBJRiggU0RJRkYoIE9ORSArIEVQUywgT05FICkuRVEuWkVSTyApCisgICAgICQgICBHTyBUTyAxMDAKKyAgICAgIEVQUyA9IEhBTEYqRVBTCisgICAgICBHTyBUTyA5MAorICAxMDAgQ09OVElOVUUKKyAgICAgIEVQUyA9IEVQUyArIEVQUworICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUVQUworKgorKiAgICAgQ2hlY2sgdGhlIHJlbGlhYmlsaXR5IG9mIFNNVkNIIHVzaW5nIGV4YWN0IGRhdGEuCisqCisgICAgICBOID0gTUlOKCAzMiwgTk1BWCApCisgICAgICBETyAxMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDExMCBJID0gMSwgTgorICAgICAgICAgICAgQSggSSwgSiApID0gTUFYKCBJIC0gSiArIDEsIDAgKQorICAxMTAgICAgQ09OVElOVUUKKyAgICAgICAgIFgoIEogKSA9IEoKKyAgICAgICAgIFkoIEogKSA9IFpFUk8KKyAgMTIwIENPTlRJTlVFCisgICAgICBETyAxMzAgSiA9IDEsIE4KKyAgICAgICAgIFlZKCBKICkgPSBKKiggKCBKICsgMSApKkogKS8yIC0gKCAoIEogKyAxICkqSiooIEogLSAxICkgKS8zCisgIDEzMCBDT05USU5VRQorKiAgICAgWVkgaG9sZHMgdGhlIGV4YWN0IHJlc3VsdC4gT24gZXhpdCBmcm9tIFNNVkNIIFlUIGhvbGRzCisqICAgICB0aGUgcmVzdWx0IGNvbXB1dGVkIGJ5IFNNVkNILgorICAgICAgVFJBTlMgPSAnTicKKyAgICAgIENBTEwgU01WQ0goIFRSQU5TLCBOLCBOLCBPTkUsIEEsIE5NQVgsIFgsIDEsIFpFUk8sIFksIDEsIFlULCBHLAorICAgICAkICAgICAgICAgICAgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMU0UoIFlZLCBZVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5aRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApVFJBTlMsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBUUkFOUyA9ICdUJworICAgICAgQ0FMTCBTTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwgLTEsIFpFUk8sIFksIC0xLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgIFlZLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTFNFKCBZWSwgWVQsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODUgKVRSQU5TLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorKgorKiAgICAgVGVzdCBlYWNoIHN1YnJvdXRpbmUgaW4gdHVybi4KKyoKKyAgICAgIERPIDIxMCBJU05VTSA9IDEsIE5TVUJTCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICAgICBJRiggLk5PVC5MVEVTVCggSVNOVU0gKSApVEhFTgorKiAgICAgICAgICAgU3VicHJvZ3JhbSBpcyBub3QgdG8gYmUgdGVzdGVkLgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODMgKVNOQU1FUyggSVNOVU0gKQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgU1JOQU1UID0gU05BTUVTKCBJU05VTSApCisqICAgICAgICAgICBUZXN0IGVycm9yIGV4aXRzLgorICAgICAgICAgICAgSUYoIFRTVEVSUiApVEhFTgorICAgICAgICAgICAgICAgQ0FMTCBTQ0hLRSggSVNOVU0sIFNOQU1FUyggSVNOVU0gKSwgTk9VVCApCisgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFRlc3QgY29tcHV0YXRpb25zLgorICAgICAgICAgICAgSU5GT1QgPSAwCisgICAgICAgICAgICBPSyA9IC5UUlVFLgorICAgICAgICAgICAgRkFUQUwgPSAuRkFMU0UuCisgICAgICAgICAgICBHTyBUTyAoIDE0MCwgMTQwLCAxNTAsIDE1MCwgMTUwLCAxNjAsIDE2MCwKKyAgICAgJCAgICAgICAgICAgICAgMTYwLCAxNjAsIDE2MCwgMTYwLCAxNzAsIDE4MCwgMTgwLAorICAgICAkICAgICAgICAgICAgICAxOTAsIDE5MCApSVNOVU0KKyogICAgICAgICAgIFRlc3QgU0dFTVYsIDAxLCBhbmQgU0dCTVYsIDAyLgorICAxNDAgICAgICAgQ0FMTCBTQ0hLMSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5CRVQsIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRyApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgU1NZTVYsIDAzLCBTU0JNViwgMDQsIGFuZCBTU1BNViwgMDUuCisgIDE1MCAgICAgICBDQUxMIFNDSEsyKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLAorICAgICAkICAgICAgICAgICAgICAgICAgTkJFVCwgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBTVFJNViwgMDYsIFNUQk1WLCAwNywgU1RQTVYsIDA4LAorKiAgICAgICAgICAgU1RSU1YsIDA5LCBTVEJTViwgMTAsIGFuZCBTVFBTViwgMTEuCisgIDE2MCAgICAgICBDQUxMIFNDSEszKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFksIFlZLCBZUywgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IFNHRVIsIDEyLgorICAxNzAgICAgICAgQ0FMTCBTQ0hLNCggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IFNTWVIsIDEzLCBhbmQgU1NQUiwgMTQuCisgIDE4MCAgICAgICBDQUxMIFNDSEs1KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsCisgICAgICQgICAgICAgICAgICAgICAgICBZVCwgRywgWiApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgU1NZUjIsIDE1LCBhbmQgU1NQUjIsIDE2LgorICAxOTAgICAgICAgQ0FMTCBTQ0hLNiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorKgorICAyMDAgICAgICAgSUYoIEZBVEFMLkFORC5TRkFUQUwgKQorICAgICAkICAgICAgICAgR08gVE8gMjIwCisgICAgICAgICBFTkQgSUYKKyAgMjEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MiApCisgICAgICBHTyBUTyAyNDAKKyoKKyAgMjIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MSApCisgICAgICBHTyBUTyAyNDAKKyoKKyAgMjMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NyApCisqCisgIDI0MCBDT05USU5VRQorICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgIENMT1NFICggTlRSQSApCisgICAgICBDTE9TRSAoIE5PVVQgKQorICAgICAgU1RPUAorKgorIDk5OTkgRk9STUFUKCAnIFJPVVRJTkVTIFBBU1MgQ09NUFVUQVRJT05BTCBURVNUUyBJRiBURVNUIFJBVElPIElTIExFUycsCisgICAgICQgICAgICAnUyBUSEFOJywgRjguMiApCisgOTk5OCBGT1JNQVQoICcgUkVMQVRJVkUgTUFDSElORSBQUkVDSVNJT04gSVMgVEFLRU4gVE8gQkUnLCAxUCwgRTkuMSApCisgOTk5NyBGT1JNQVQoICcgTlVNQkVSIE9GIFZBTFVFUyBPRiAnLCBBLCAnIElTIExFU1MgVEhBTiAxIE9SIEdSRUFURVIgJywKKyAgICAgJCAgICAgICdUSEFOICcsIEkyICkKKyA5OTk2IEZPUk1BVCggJyBWQUxVRSBPRiBOIElTIExFU1MgVEhBTiAwIE9SIEdSRUFURVIgVEhBTiAnLCBJMiApCisgOTk5NSBGT1JNQVQoICcgVkFMVUUgT0YgSyBJUyBMRVNTIFRIQU4gMCcgKQorIDk5OTQgRk9STUFUKCAnIEFCU09MVVRFIFZBTFVFIE9GIElOQ1ggT1IgSU5DWSBJUyAwIE9SIEdSRUFURVIgVEhBTiAnLAorICAgICAkICAgICAgSTIgKQorIDk5OTMgRk9STUFUKCAnIFRFU1RTIE9GIFRIRSBSRUFMICAgICAgICAgICAgIExFVkVMIDIgQkxBUycsIC8vJyBUSEUgRicsCisgICAgICQgICAgICAnT0xMT1dJTkcgUEFSQU1FVEVSIFZBTFVFUyBXSUxMIEJFIFVTRUQ6JyApCisgOTk5MiBGT1JNQVQoICcgICBGT1IgTiAgICAgICAgICAgICAgJywgOUk2ICkKKyA5OTkxIEZPUk1BVCggJyAgIEZPUiBLICAgICAgICAgICAgICAnLCA3STYgKQorIDk5OTAgRk9STUFUKCAnICAgRk9SIElOQ1ggQU5EIElOQ1kgICcsIDdJNiApCisgOTk4OSBGT1JNQVQoICcgICBGT1IgQUxQSEEgICAgICAgICAgJywgN0Y2LjEgKQorIDk5ODggRk9STUFUKCAnICAgRk9SIEJFVEEgICAgICAgICAgICcsIDdGNi4xICkKKyA5OTg3IEZPUk1BVCggJyBBTUVORCBEQVRBIEZJTEUgT1IgSU5DUkVBU0UgQVJSQVkgU0laRVMgSU4gUFJPR1JBTScsCisgICAgICQgICAgICAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4NiBGT1JNQVQoICcgU1VCUFJPR1JBTSBOQU1FICcsIEE2LCAnIE5PVCBSRUNPR05JWkVEJywgLycgKioqKioqKiBUJywKKyAgICAgJCAgICAgICdFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4NSBGT1JNQVQoICcgRVJST1IgSU4gU01WQ0ggLSAgSU4tTElORSBET1QgUFJPRFVDVFMgQVJFIEJFSU5HIEVWQUxVJywKKyAgICAgJCAgICAgICdBVEVEIFdST05HTFkuJywgLycgU01WQ0ggV0FTIENBTExFRCBXSVRIIFRSQU5TID0gJywgQTEsCisgICAgICQgICAgICAnIEFORCBSRVRVUk5FRCBTQU1FID0gJywgTDEsICcgQU5EIEVSUiA9ICcsIEYxMi4zLCAnLicsIC8KKyAgICAgJCAgICcgVEhJUyBNQVkgQkUgRFVFIFRPIEZBVUxUUyBJTiBUSEUgQVJJVEhNRVRJQyBPUiBUSEUgQ09NUElMRVIuJworICAgICAkICAgICAgLCAvJyAqKioqKioqIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4NCBGT1JNQVQoIEE2LCBMMiApCisgOTk4MyBGT1JNQVQoIDFYLCBBNiwgJyBXQVMgTk9UIFRFU1RFRCcgKQorIDk5ODIgRk9STUFUKCAvJyBFTkQgT0YgVEVTVFMnICkKKyA5OTgxIEZPUk1BVCggLycgKioqKioqKiBGQVRBTCBFUlJPUiAtIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4MCBGT1JNQVQoICcgRVJST1ItRVhJVFMgV0lMTCBOT1QgQkUgVEVTVEVEJyApCisqCisqICAgICBFbmQgb2YgU0JMQVQyLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNDSEsxKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOS0IsIEtCLCBOQUxGLCBBTEYsIE5CRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBCRVQsIE5JTkMsIElOQywgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgWFMsIFksIFlZLCBZUywgWVQsIEcgKQorKgorKiAgVGVzdHMgU0dFTVYgYW5kIFNHQk1WLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWkVSTywgSEFMRgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCwgSEFMRiA9IDAuNSApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5BTEYsIE5CRVQsIE5JRElNLCBOSU5DLCBOS0IsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgRyggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFgoIE5NQVgqSU5DTUFYICksIFkoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIEVSUiwgRVJSTUFYLCBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDLCBJS1UsIElNLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksCisgICAgICQgICAgICAgICAgICAgICAgICAgSU5DWVMsIElYLCBJWSwgS0wsIEtMUywgS1UsIEtVUywgTEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBUywgTFgsIExZLCBNLCBNTCwgTVMsIE4sIE5BUkdTLCBOQywgTkQsIE5LLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5MLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEJBTkRFRCwgRlVMTCwgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU4KKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUywgVFJBTlNTCisgICAgICBDSEFSQUNURVIqMyAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFLCBMU0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0UsIExTRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTR0JNViwgU0dFTVYsIFNNQUtFLCBTTVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydOVEMnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nRScKKyAgICAgIEJBTkRFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ0InCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSAxMQorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDEzCisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDEyMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorICAgICAgICAgTkQgPSBOLzIgKyAxCisqCisgICAgICAgICBETyAxMTAgSU0gPSAxLCAyCisgICAgICAgICAgICBJRiggSU0uRVEuMSApCisgICAgICQgICAgICAgICBNID0gTUFYKCBOIC0gTkQsIDAgKQorICAgICAgICAgICAgSUYoIElNLkVRLjIgKQorICAgICAkICAgICAgICAgTSA9IE1JTiggTiArIE5ELCBOTUFYICkKKyoKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTAwIElLVSA9IDEsIE5LCisgICAgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICBLVSA9IEtCKCBJS1UgKQorICAgICAgICAgICAgICAgICAgS0wgPSBNQVgoIEtVIC0gMSwgMCApCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLVSA9IE4gLSAxCisgICAgICAgICAgICAgICAgICBLTCA9IE0gLSAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgTERBID0gS0wgKyBLVSArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIExEQSA9IE0KKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgICAgTEFBID0gTERBKk4KKyAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuTS5MRS4wCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCBTTkFNRSggMjogMyApLCAnICcsICcgJywgTSwgTiwgQSwgTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBMREEsIEtMLCBLVSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICBETyA5MCBJQyA9IDEsIDMKKyAgICAgICAgICAgICAgICAgIFRSQU5TID0gSUNIKCBJQzogSUMgKQorICAgICAgICAgICAgICAgICAgVFJBTiA9IFRSQU5TLkVRLidUJy5PUi5UUkFOUy5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBNTCA9IE4KKyAgICAgICAgICAgICAgICAgICAgIE5MID0gTQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgTUwgPSBNCisgICAgICAgICAgICAgICAgICAgICBOTCA9IE4KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gODAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk5MCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTkwsIFgsIDEsIFhYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNYICksIDAsIE5MIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICAgICBJRiggTkwuR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgWCggTkwvMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE5MLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk1MCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCAxLCBNTCwgWSwgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZLCBBQlMoIElOQ1kgKSwgMCwgTUwgLSAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtMUyA9IEtMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVVMgPSBLVQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUyggSSApID0gWVkoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1lTID0gSU5DWQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBNLCBOLCBBTFBIQSwgTERBLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU0dFTVYoIFRSQU5TLCBNLCBOLCBBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFhYLCBJTkNYLCBCRVRBLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBNLCBOLCBLTCwgS1UsIEFMUEhBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYLCBCRVRBLCBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTR0JNViggVFJBTlMsIE0sIE4sIEtMLCBLVSwgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBLCBYWCwgSU5DWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFRSQU5TLkVRLlRSQU5TUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFNFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExTRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExTRVJFUyggJ0dFJywgJyAnLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTCwgWVMsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gS0xTLkVRLktMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gS1VTLkVRLktVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMU0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMU0UoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMU0VSRVMoICdHRScsICcgJywgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUwsIFlTLCBZWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTMgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01WQ0goIFRSQU5TLCBNLCBOLCBBTFBIQSwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIFgsIElOQ1gsIEJFVEEsIFksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZLCBZVCwgRywgWVksIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTS5sZS4wIG9yCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgQ09OVElOVUUKKyoKKyAgMTIwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNDAKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBUUkFOUywgTSwgTiwgQUxQSEEsIExEQSwKKyAgICAgJCAgICAgIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVFJBTlMsIE0sIE4sIEtMLCBLVSwKKyAgICAgJCAgICAgIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgIEVORCBJRgorKgorICAxNDAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCA0KCBJMywgJywnICksIEY0LjEsCisgICAgICQgICAgICAnLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCcsIEY0LjEsICcsIFksJywgSTIsICcpIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgMiggSTMsICcsJyApLCBGNC4xLAorICAgICAkICAgICAgJywgQSwnLCBJMywgJywgWCwnLCBJMiwgJywnLCBGNC4xLCAnLCBZLCcsIEkyLAorICAgICAkICAgICAgJykgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLMS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTQ0hLMiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLCBOQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyoKKyogIFRlc3RzIFNTWU1WLCBTU0JNViBhbmQgU1NQTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wLCBIQUxGID0gMC41ICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTkJFVCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBHKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICksIEtCKCBOS0IgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUywgRVJSLCBFUlJNQVgsIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUMsIElLLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksCisgICAgICQgICAgICAgICAgICAgICAgICAgSU5DWVMsIElYLCBJWSwgSywgS1MsIExBQSwgTERBLCBMREFTLCBMWCwgTFksCisgICAgICQgICAgICAgICAgICAgICAgICAgTiwgTkFSR1MsIE5DLCBOSywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBCQU5ERUQsIEZVTEwsIE5VTEwsIFBBQ0tFRCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTRSwgTFNFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFNFLCBMU0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU01BS0UsIFNNVkNILCBTU0JNViwgU1NQTVYsIFNTWU1WCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNILydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidZJworICAgICAgQkFOREVEID0gU05BTUUoIDM6IDMgKS5FUS4nQicKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSAxMAorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDExCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOQorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMTAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyoKKyAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgRE8gMTAwIElLID0gMSwgTksKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIEsgPSBLQiggSUsgKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSyA9IE4gLSAxCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTERBID0gSyArIDEKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExEQSA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElDID0gMSwgMgorICAgICAgICAgICAgICAgVVBMTyA9IElDSCggSUM6IElDICkKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgU01BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwgTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gNzAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk4KKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgTiwgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1NZTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgTERBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBLLCBBTFBIQSwgTERBLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1NCTVYoIFVQTE8sIE4sIEssIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBBTFBIQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1NQTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgWFgsIElOQ1gsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBLCBZWSwgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExTRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExTRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTFNFUkVTKCAnR0UnLCAnICcsIDEsIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVMsIFlZLCBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFNFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExTRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExTRVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUywgWVksIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMU0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMU0UoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExTRVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTLCBZWSwgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTVZDSCggJ04nLCBOLCBOLCBBTFBIQSwgQSwgTk1BWCwgWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFksIElOQ1ksIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTi5sZS4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBMREEsIElOQ1gsCisgICAgICQgICAgICBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIEssIEFMUEhBLCBMREEsCisgICAgICQgICAgICBJTkNYLCBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLAorICAgICAkICAgICAgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIEFQJywKKyAgICAgJCAgICAgICcsIFgsJywgSTIsICcsJywgRjQuMSwgJywgWSwnLCBJMiwgJykgICAgICAgICAgICAgICAgLicgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCAyKCBJMywgJywnICksIEY0LjEsCisgICAgICQgICAgICAnLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCcsIEY0LjEsICcsIFksJywgSTIsCisgICAgICQgICAgICAnKSAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgQSwnLAorICAgICAkICAgICAgSTMsICcsIFgsJywgSTIsICcsJywgRjQuMSwgJywgWSwnLCBJMiwgJykgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgU0NISzIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU0NISzMoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFhULCBHLCBaICkKKyoKKyogIFRlc3RzIFNUUk1WLCBTVEJNViwgU1RQTVYsIFNUUlNWLCBTVEJTViBhbmQgU1RQU1YuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIEhBTEYgPSAwLjUsIE9ORSA9IDEuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5JRElNLCBOSU5DLCBOS0IsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBHKCBOTUFYICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWiggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICksIEtCKCBOS0IgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUiwgRVJSTUFYLCBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQ0QsIElDVCwgSUNVLCBJSywgSU4sIElOQ1gsIElOQ1hTLCBJWCwgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBLUywgTEFBLCBMREEsIExEQVMsIExYLCBOLCBOQVJHUywgTkMsIE5LLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEJBTkRFRCwgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIERJQUcsIERJQUdTLCBUUkFOUywgVFJBTlNTLCBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSEQsIElDSFUKKyAgICAgIENIQVJBQ1RFUiozICAgICAgICBJQ0hUCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFLCBMU0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0UsIExTRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTTUFLRSwgU01WQ0gsIFNUQk1WLCBTVEJTViwgU1RQTVYsIFNUUFNWLAorICAgICAkICAgICAgICAgICAgICAgICAgIFNUUk1WLCBTVFJTVgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFUvJ1VMJy8sIElDSFQvJ05UQycvLCBJQ0hELydVTicvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIEZVTEwgPSBTTkFNRSggMzogMyApLkVRLidSJworICAgICAgQkFOREVEID0gU05BTUUoIDM6IDMgKS5FUS4nQicKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSA4CisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDcKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKiAgICAgU2V0IHVwIHplcm8gdmVjdG9yIGZvciBTTVZDSC4KKyAgICAgIERPIDEwIEkgPSAxLCBOTUFYCisgICAgICAgICBaKCBJICkgPSBaRVJPCisgICAxMCBDT05USU5VRQorKgorICAgICAgRE8gMTEwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqCisgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICBOSyA9IE5LQgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTksgPSAxCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDEwMCBJSyA9IDEsIE5LCisgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICBLID0gS0IoIElLICkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEsgPSBOIC0gMQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIExEQSA9IEsgKyAxCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMREEgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisqCisgICAgICAgICAgICBETyA5MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisqCisgICAgICAgICAgICAgICAgICBETyA3MCBJQ0QgPSAxLCAyCisgICAgICAgICAgICAgICAgICAgICBESUFHID0gSUNIRCggSUNEOiBJQ0QgKQorKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgRElBRywgTiwgTiwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgRElBR1MgPSBESUFHCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01WJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1RSTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBMREEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNUQk1WKCBVUExPLCBUUkFOUywgRElBRywgTiwgSywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFhYLCBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1RQTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU1YnIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTVFJTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1RCU1YoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTVFBTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gRElBRy5FUS5ESUFHUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFNFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMU0VSRVMoICdHRScsICcgJywgMSwgTiwgWFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMU0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExTRVJFUyggJ0dFJywgJyAnLCAxLCBOLCBYUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExTRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFNFUkVTKCAnR0UnLCAnICcsIDEsIE4sIFhTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBBQlMoIElOQ1ggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNVicgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCwgWkVSTywgWiwgSU5DWCwgWFQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ1NWJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBhcHByb3hpbWF0aW9uIHRvIG9yaWdpbmFsIHZlY3Rvci4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYWCggMSArICggSSAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWCApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gWCggSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIFpFUk8sIFgsIElOQ1gsIFhULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgIENPTlRJTlVFCisqCisgIDExMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwKKyAgICAgJCAgICAgIElOQ1gKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssCisgICAgICQgICAgICBMREEsIElOQ1gKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIElOQ1gKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDMoICcnJycsIEExLCAnJycsJyApLCBJMywgJywgQVAsICcsCisgICAgICQgICAgICAnWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMyggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgICcgQSwnLCBJMywgJywgWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAzKCAnJycnLCBBMSwgJycnLCcgKSwgSTMsICcsIEEsJywKKyAgICAgJCAgICAgIEkzLCAnLCBYLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFNDSEszLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNDSEs0KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICBaICkKKyoKKyogIFRlc3RzIFNHRVIuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIEhBTEYgPSAwLjUsIE9ORSA9IDEuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNNQVgsIE5BTEYsIE5JRElNLCBOSU5DLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEcoIE5NQVggKSwgWCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhTKCBOTUFYKklOQ01BWCApLCBYWCggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZKCBOTUFYICksIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBBTFMsIEVSUiwgRVJSTUFYLCBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSU0sIElOLCBJTkNYLCBJTkNYUywgSU5DWSwgSU5DWVMsIElYLAorICAgICAkICAgICAgICAgICAgICAgICAgIElZLCBKLCBMQUEsIExEQSwgTERBUywgTFgsIExZLCBNLCBNUywgTiwgTkFSR1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkMsIE5ELCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIE5VTEwsIFJFU0VULCBTQU1FCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBXKCAxICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFLCBMU0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0UsIExTRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTR0VSLCBTTUFLRSwgU01WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWCwgTUlOCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgTkFSR1MgPSA5CisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMjAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyAgICAgICAgIE5EID0gTi8yICsgMQorKgorICAgICAgICAgRE8gMTEwIElNID0gMSwgMgorICAgICAgICAgICAgSUYoIElNLkVRLjEgKQorICAgICAkICAgICAgICAgTSA9IE1BWCggTiAtIE5ELCAwICkKKyAgICAgICAgICAgIElGKCBJTS5FUS4yICkKKyAgICAgJCAgICAgICAgIE0gPSBNSU4oIE4gKyBORCwgTk1BWCApCisqCisqICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQSA9IE0KKyAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLk0uTEUuMAorKgorICAgICAgICAgICAgRE8gMTAwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpNCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTSwgWCwgMSwgWFgsIEFCUyggSU5DWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgMCwgTSAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgSUYoIE0uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgWCggTS8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTS8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDkwIElZID0gMSwgTklOQworICAgICAgICAgICAgICAgICAgSU5DWSA9IElOQyggSVkgKQorICAgICAgICAgICAgICAgICAgTFkgPSBBQlMoIElOQ1kgKSpOCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFkuCisqCisgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWSwgMSwgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSwgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgWSggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBZWSggMSArIEFCUyggSU5DWSApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgIERPIDgwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoIFNOQU1FKCAyOiAzICksICcgJywgJyAnLCBNLCBOLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSwgTSAtIDEsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMWQorICAgICAgICAgICAgICAgICAgICAgICAgWVMoIEkgKSA9IFlZKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNZUyA9IElOQ1kKKyoKKyogICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgTSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYLCBJTkNZLCBMREEKKyAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFNHRVIoIE0sIE4sIEFMUEhBLCBYWCwgSU5DWCwgWVksIElOQ1ksIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICBMREEgKQorKgorKiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE0MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMU0UoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMU0UoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IElOQ1lTLkVRLklOQ1kKKyAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFNFUkVTKCAnR0UnLCAnICcsIE0sIE4sIEFTLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEgKQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERBUy5FUS5MREEKKyoKKyogICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1guR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFgoIEkgKQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBNIC0gSSArIDEgKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNZLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IFkoIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gWSggTiAtIEogKyAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTVZDSCggJ04nLCBNLCAxLCBBTFBIQSwgWiwgTk1BWCwgVywgMSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQSggMSwgSiApLCAxLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBKCAxICsgKCBKIC0gMSApKkxEQSApLCBFUFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgNzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE0ubGUuMCBvciBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgQ09OVElOVUUKKyoKKyAgMTIwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxNTAKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxNDAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgTSwgTiwgQUxQSEEsIElOQ1gsIElOQ1ksIExEQQorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoIEkzLCAnLCcgKSwgRjQuMSwgJywgWCwnLCBJMiwKKyAgICAgJCAgICAgICcsIFksJywgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgU0NISzQuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU0NISzUoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgU1NZUiBhbmQgU1NQUi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCwgSEFMRiA9IDAuNSwgT05FID0gMS4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTklESU0sIE5JTkMsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgRyggTk1BWCApLCBYKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFMoIE5NQVgqSU5DTUFYICksIFhYKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFkoIE5NQVggKSwgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUxQSEEsIEFMUywgRVJSLCBFUlJNQVgsIFRSQU5TTAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQywgSU4sIElOQ1gsIElOQ1hTLCBJWCwgSiwgSkEsIEpKLCBMQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMSiwgTFgsIE4sIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBXKCAxICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFLCBMU0VSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMU0UsIExTRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTTUFLRSwgU01WQ0gsIFNTUFIsIFNTWVIKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ1knCisgICAgICBQQUNLRUQgPSBTTkFNRSggMzogMyApLkVRLidQJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNworICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDYKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQSA9IE4KKyAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMDAKKyAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBETyA5MCBJQyA9IDEsIDIKKyAgICAgICAgICAgIFVQTE8gPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyA3MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisgICAgICAgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLkFMUEhBLkVRLlpFUk8KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIE4gLSAxLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisqCisqICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgQUxQSEEsIElOQ1gsIExEQQorICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgU1NZUiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgU1NQUiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBBQSApCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IExTRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMU0VSRVMoIFNOQU1FKCAyOiAzICksIFVQTE8sIE4sIE4sIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5QQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDMwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNYLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBJICkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggTiAtIEkgKyAxICkKKyAgIDUwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgIEpBID0gMQorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IFooIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNVkNIKCAnTicsIExKLCAxLCBBTFBIQSwgWiggSkogKSwgTEosIFcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBPTkUsIEEoIEpKLCBKICksIDEsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEoIEpBICksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTEoKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyBpZiBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICBJRiggTi5MRS4wICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA3MCAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgIENPTlRJTlVFCisqCisgIDEwMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDExMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwgTERBCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYCisgICAgICBFTkQgSUYKKyoKKyAgMTMwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgWCwnLAorICAgICAkICAgICAgSTIsICcsIEFQKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgWCwnLAorICAgICAkICAgICAgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgU0NISzUuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU0NISzYoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgU1NZUjIgYW5kIFNTUFIyLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWkVSTywgSEFMRiwgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wLCBIQUxGID0gMC41LCBPTkUgPSAxLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOSURJTSwgTklOQywgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBHKCBOTUFYICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKSwgWiggTk1BWCwgMiApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKSwgSU5DKCBOSU5DICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQUxTLCBFUlIsIEVSUk1BWCwgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElDLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksIElOQ1lTLCBJWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJWSwgSiwgSkEsIEpKLCBMQUEsIExEQSwgTERBUywgTEosIExYLCBMWSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRSwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgVyggMiApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTRSwgTFNFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFNFLCBMU0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU01BS0UsIFNNVkNILCBTU1BSMiwgU1NZUjIKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ1knCisgICAgICBQQUNLRUQgPSBTTkFNRSggMzogMyApLkVRLidQJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBOQVJHUyA9IDgKKyAgICAgIEVORCBJRgorKgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTQwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQSA9IE4KKyAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxNDAKKyAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBETyAxMzAgSUMgPSAxLCAyCisgICAgICAgICAgICBVUExPID0gSUNIKCBJQzogSUMgKQorICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgRE8gMTIwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpOCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWCwgMSwgWFgsIEFCUyggSU5DWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDExMCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTgorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFkoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgWVkoIDEgKyBBQlMoIElOQ1kgKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyAxMDAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorICAgICAgICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5BTFBIQS5FUS5aRVJPCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBQSwgTERBLCBOIC0gMSwgTiAtIDEsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMWQorICAgICAgICAgICAgICAgICAgICAgICAgWVMoIEkgKSA9IFlZKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNZUyA9IElOQ1kKKyoKKyogICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWSwgTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTU1lSMiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYLCBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTU1BSMiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE2MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTFNFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFNFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExTRVJFUyggU05BTUUoIDI6IDMgKSwgVVBMTywgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUywgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNjAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1guR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDEgKSA9IFgoIEkgKQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAxICkgPSBYKCBOIC0gSSArIDEgKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1kuR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDIgKSA9IFkoIEkgKQorICAgNzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAyICkgPSBZKCBOIC0gSSArIDEgKQorICAgODAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBETyA5MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gWiggSiwgMiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAyICkgPSBaKCBKLCAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTVZDSCggJ04nLCBMSiwgMiwgQUxQSEEsIFooIEpKLCAxICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBXLCAxLCBPTkUsIEEoIEpKLCBKICksIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVCwgRywgQUEoIEpBICksIEVQUywgRVJSLCBGQVRBTCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTERBICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQSA9IEpBICsgTEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgOTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyogICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJlcGVhdGluZyB0ZXN0cyB3aXRoIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOLkxFLjAgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgMTAwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICAgICAgICBDT05USU5VRQorKgorICAxMjAgICAgICAgQ09OVElOVUUKKyoKKyAgMTMwICAgIENPTlRJTlVFCisqCisgIDE0MCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTcwCisqCisgIDE1MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTYwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwKKyAgICAgJCAgICAgIElOQ1ksIExEQQorICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBOLCBBTFBIQSwgSU5DWCwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDE3MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBZLCcsIEkyLCAnLCBBUCkgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBZLCcsIEkyLCAnLCBBLCcsIEkzLCAnKSAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFNDSEs2LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNDSEtFKCBJU05VTSwgU1JOQU1ULCBOT1VUICkKKyoKKyogIFRlc3RzIHRoZSBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAyIEJsYXMuCisqICBSZXF1aXJlcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgZXJyb3ItaGFuZGxpbmcgcm91dGluZSBYRVJCTEEuCisqICBBTFBIQSwgQkVUQSwgQSwgWCBhbmQgWSBzaG91bGQgbm90IG5lZWQgdG8gYmUgZGVmaW5lZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElTTlVNLCBOT1VUCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUxQSEEsIEJFVEEKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIDEsIDEgKSwgWCggMSApLCBZKCAxICkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgQ0hLWEVSLCBTR0JNViwgU0dFTVYsIFNHRVIsIFNTQk1WLCBTU1BNViwgU1NQUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBTU1BSMiwgU1NZTVYsIFNTWVIsIFNTWVIyLCBTVEJNViwgU1RCU1YsIFNUUE1WLAorICAgICAkICAgICAgICAgICAgICAgICAgIFNUUFNWLCBTVFJNViwgU1RSU1YKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqICAgICBPSyBpcyBzZXQgdG8gLkZBTFNFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBvciBieSBDSEtYRVIKKyogICAgIGlmIGFueXRoaW5nIGlzIHdyb25nLgorICAgICAgT0sgPSAuVFJVRS4KKyogICAgIExFUlIgaXMgc2V0IHRvIC5UUlVFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBlYWNoIHRpbWUKKyogICAgIGl0IGlzIGNhbGxlZCwgYW5kIGlzIHRoZW4gdGVzdGVkIGFuZCByZS1zZXQgYnkgQ0hLWEVSLgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIEdPIFRPICggMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLAorICAgICAkICAgICAgICA5MCwgMTAwLCAxMTAsIDEyMCwgMTMwLCAxNDAsIDE1MCwKKyAgICAgJCAgICAgICAgMTYwIClJU05VTQorICAgMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNHRU1WKCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU0dFTVYoICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU0dFTVYoICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU0dFTVYoICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBTR0VNViggJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBTR0VNViggJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICAyMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU0dCTVYoICcvJywgMCwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTR0JNViggJ04nLCAtMSwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTR0JNViggJ04nLCAwLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTR0JNViggJ04nLCAwLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTR0JNViggJ04nLCAyLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBTR0JNViggJ04nLCAwLCAwLCAxLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBTR0JNViggJ04nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBTR0JNViggJ04nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICAzMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1NZTVYoICcvJywgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTU1lNViggJ1UnLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTU1lNViggJ1UnLCAyLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTWU1WKCAnVScsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFNTWU1WKCAnVScsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBTU0JNViggJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNTQk1WKCAnVScsIC0xLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNTQk1WKCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNTQk1WKCAnVScsIDAsIDEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgU1NCTVYoICdVJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1NCTVYoICdVJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgNTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNTUE1WKCAnLycsIDAsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1NQTVYoICdVJywgLTEsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1NQTVYoICdVJywgMCwgQUxQSEEsIEEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTU1BNViggJ1UnLCAwLCBBTFBIQSwgQSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICA2MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1RSTVYoICcvJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTVFJNViggJ1UnLCAnLycsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNUUk1WKCAnVScsICdOJywgJy8nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1RSTVYoICdVJywgJ04nLCAnTicsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgU1RSTVYoICdVJywgJ04nLCAnTicsIDIsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBTVFJNViggJ1UnLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICA3MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1RCTVYoICcvJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTVEJNViggJ1UnLCAnLycsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNUQk1WKCAnVScsICdOJywgJy8nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1RCTVYoICdVJywgJ04nLCAnTicsIC0xLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU1RCTVYoICdVJywgJ04nLCAnTicsIDAsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1RCTVYoICdVJywgJ04nLCAnTicsIDAsIDEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVEJNViggJ1UnLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgICA4MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1RQTVYoICcvJywgJ04nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTVFBNViggJ1UnLCAnLycsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNUUE1WKCAnVScsICdOJywgJy8nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1RQTVYoICdVJywgJ04nLCAnTicsIC0xLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1RQTVYoICdVJywgJ04nLCAnTicsIDAsIEEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAgOTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNUUlNWKCAnLycsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1RSU1YoICdVJywgJy8nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTVFJTViggJ1UnLCAnTicsICcvJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNUUlNWKCAnVScsICdOJywgJ04nLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUlNWKCAnVScsICdOJywgJ04nLCAyLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgU1RSU1YoICdVJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxMDAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNUQlNWKCAnLycsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1RCU1YoICdVJywgJy8nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTVEJTViggJ1UnLCAnTicsICcvJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNUQlNWKCAnVScsICdOJywgJ04nLCAtMSwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUQlNWKCAnVScsICdOJywgJ04nLCAwLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNUQlNWKCAnVScsICdOJywgJ04nLCAwLCAxLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RCU1YoICdVJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNUUFNWKCAnLycsICdOJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1RQU1YoICdVJywgJy8nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTVFBTViggJ1UnLCAnTicsICcvJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNUUFNWKCAnVScsICdOJywgJ04nLCAtMSwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNUUFNWKCAnVScsICdOJywgJ04nLCAwLCBBLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTIwIElORk9UID0gMQorICAgICAgQ0FMTCBTR0VSKCAtMSwgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTR0VSKCAwLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTR0VSKCAwLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNHRVIoIDAsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU0dFUiggMiwgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE3MAorICAxMzAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNTWVIoICcvJywgMCwgQUxQSEEsIFgsIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTU1lSKCAnVScsIC0xLCBBTFBIQSwgWCwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNTWVIoICdVJywgMCwgQUxQSEEsIFgsIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lSKCAnVScsIDIsIEFMUEhBLCBYLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTQwIElORk9UID0gMQorICAgICAgQ0FMTCBTU1BSKCAnLycsIDAsIEFMUEhBLCBYLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgU1NQUiggJ1UnLCAtMSwgQUxQSEEsIFgsIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTU1BSKCAnVScsIDAsIEFMUEhBLCBYLCAwLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxNzAKKyAgMTUwIElORk9UID0gMQorICAgICAgQ0FMTCBTU1lSMiggJy8nLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNTWVIyKCAnVScsIC0xLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNTWVIyKCAnVScsIDAsIEFMUEhBLCBYLCAwLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZUjIoICdVJywgMCwgQUxQSEEsIFgsIDEsIFksIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTU1lSMiggJ1UnLCAyLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTcwCisgIDE2MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1NQUjIoICcvJywgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTU1BSMiggJ1UnLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTU1BSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTUFIyKCAnVScsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisgIDE3MCBJRiggT0sgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTUk5BTVQKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTVQKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUycgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyAqKioqKicsCisgICAgICQgICAgICAnKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTTUFLRSggVFlQRSwgVVBMTywgRElBRywgTSwgTiwgQSwgTk1BWCwgQUEsIExEQSwgS0wsCisgICAgICQgICAgICAgICAgICAgICAgICBLVSwgUkVTRVQsIFRSQU5TTCApCisqCisqICBHZW5lcmF0ZXMgdmFsdWVzIGZvciBhbiBNIGJ5IE4gbWF0cml4IEEgd2l0aGluIHRoZSBiYW5kd2lkdGgKKyogIGRlZmluZWQgYnkgS0wgYW5kIEtVLgorKiAgU3RvcmVzIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IEFBIGluIHRoZSBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZAorKiAgYnkgdGhlIHJvdXRpbmUsIHdpdGggdW53YW50ZWQgZWxlbWVudHMgc2V0IHRvIHJvZ3VlIHZhbHVlLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnR0InLCAnU1knLCAnU0InLCAnU1AnLCAnVFInLCAnVEInIE9SICdUUCcuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIE9ORSA9IDEuMCApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJPR1VFID0gLTEuMEUxMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgS0wsIEtVLCBMREEsIE0sIE4sIE5NQVgKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBSRVNFVAorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIERJQUcsIFVQTE8KKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBUWVBFCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCAqICksIEFBKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJMSwgSTIsIEkzLCBJQkVHLCBJRU5ELCBJT0ZGLCBKLCBLSworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEdFTiwgTE9XRVIsIFNZTSwgVFJJLCBVTklULCBVUFBFUgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgU0JFRworICAgICAgRVhURVJOQUwgICAgICAgICAgIFNCRUcKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgsIE1JTgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBHRU4gPSBUWVBFKCAxOiAxICkuRVEuJ0cnCisgICAgICBTWU0gPSBUWVBFKCAxOiAxICkuRVEuJ1MnCisgICAgICBUUkkgPSBUWVBFKCAxOiAxICkuRVEuJ1QnCisgICAgICBVUFBFUiA9ICggU1lNLk9SLlRSSSApLkFORC5VUExPLkVRLidVJworICAgICAgTE9XRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nTCcKKyAgICAgIFVOSVQgPSBUUkkuQU5ELkRJQUcuRVEuJ1UnCisqCisqICAgICBHZW5lcmF0ZSBkYXRhIGluIGFycmF5IEEuCisqCisgICAgICBETyAyMCBKID0gMSwgTgorICAgICAgICAgRE8gMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIElGKCBHRU4uT1IuKCBVUFBFUi5BTkQuSS5MRS5KICkuT1IuKCBMT1dFUi5BTkQuSS5HRS5KICkgKQorICAgICAkICAgICAgICAgIFRIRU4KKyAgICAgICAgICAgICAgIElGKCAoIEkuTEUuSi5BTkQuSiAtIEkuTEUuS1UgKS5PUi4KKyAgICAgJCAgICAgICAgICAgICAoIEkuR0UuSi5BTkQuSSAtIEouTEUuS0wgKSApVEhFTgorICAgICAgICAgICAgICAgICAgQSggSSwgSiApID0gU0JFRyggUkVTRVQgKSArIFRSQU5TTAorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgQSggSSwgSiApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRiggSS5ORS5KIClUSEVOCisgICAgICAgICAgICAgICAgICBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBBKCBJLCBKICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFRSSSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVORCBJRgorICAgMTAgICAgQ09OVElOVUUKKyAgICAgICAgIElGKCBUUkkgKQorICAgICAkICAgICAgQSggSiwgSiApID0gQSggSiwgSiApICsgT05FCisgICAgICAgICBJRiggVU5JVCApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBPTkUKKyAgIDIwIENPTlRJTlVFCisqCisqICAgICBTdG9yZSBlbGVtZW50cyBpbiBhcnJheSBBUyBpbiBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZCBieSByb3V0aW5lLgorKgorICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBNCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0dCJyApVEhFTgorICAgICAgICAgRE8gOTAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDYwIEkxID0gMSwgS1UgKyAxIC0gSgorICAgICAgICAgICAgICAgQUEoIEkxICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDYwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA3MCBJMiA9IEkxLCBNSU4oIEtMICsgS1UgKyAxLCBLVSArIDEgKyBNIC0gSiApCisgICAgICAgICAgICAgICBBQSggSTIgKyAoIEogLSAxICkqTERBICkgPSBBKCBJMiArIEogLSBLVSAtIDEsIEogKQorICAgNzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDgwIEkzID0gSTIsIExEQQorICAgICAgICAgICAgICAgQUEoIEkzICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDgwICAgICAgIENPTlRJTlVFCisgICA5MCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nU1knLk9SLlRZUEUuRVEuJ1RSJyApVEhFTgorICAgICAgICAgRE8gMTMwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUVORCA9IEogLSAxCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUJFRyA9IEogKyAxCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxMDAgSSA9IDEsIElCRUcgLSAxCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDEwMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTEwIEkgPSBJQkVHLCBJRU5ECisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAxMTAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDEyMCBJID0gSUVORCArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAxMjAgICAgICAgQ09OVElOVUUKKyAgMTMwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidTQicuT1IuVFlQRS5FUS4nVEInIClUSEVOCisgICAgICAgICBETyAxNzAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgS0sgPSBLTCArIDEKKyAgICAgICAgICAgICAgIElCRUcgPSBNQVgoIDEsIEtMICsgMiAtIEogKQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElFTkQgPSBLTAorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUVORCA9IEtMICsgMQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBLSyA9IDEKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJQkVHID0gMgorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUVORCA9IE1JTiggS0wgKyAxLCAxICsgTSAtIEogKQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxNDAgSSA9IDEsIElCRUcgLSAxCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDE0MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTUwIEkgPSBJQkVHLCBJRU5ECisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEkgKyBKIC0gS0ssIEogKQorICAxNTAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDE2MCBJID0gSUVORCArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAxNjAgICAgICAgQ09OVElOVUUKKyAgMTcwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidTUCcuT1IuVFlQRS5FUS4nVFAnIClUSEVOCisgICAgICAgICBJT0ZGID0gMAorICAgICAgICAgRE8gMTkwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDE4MCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgSU9GRiA9IElPRkYgKyAxCisgICAgICAgICAgICAgICBBQSggSU9GRiApID0gQSggSSwgSiApCisgICAgICAgICAgICAgICBJRiggSS5FUS5KIClUSEVOCisgICAgICAgICAgICAgICAgICBJRiggVU5JVCApCisgICAgICQgICAgICAgICAgICAgICBBQSggSU9GRiApID0gUk9HVUUKKyAgICAgICAgICAgICAgIEVORCBJRgorICAxODAgICAgICAgQ09OVElOVUUKKyAgMTkwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNNQUtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNNVkNIKCBUUkFOUywgTSwgTiwgQUxQSEEsIEEsIE5NQVgsIFgsIElOQ1gsIEJFVEEsIFksCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNZLCBZVCwgRywgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgTVYgKQorKgorKiAgQ2hlY2tzIHRoZSByZXN1bHRzIG9mIHRoZSBjb21wdXRhdGlvbmFsIHRlc3RzLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wLCBPTkUgPSAxLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBCRVRBLCBFUFMsIEVSUgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ1gsIElOQ1ksIE0sIE4sIE5NQVgsIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTVYKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOUworKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTk1BWCwgKiApLCBHKCAqICksIFgoICogKSwgWSggKiApLCBZVCggKiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUlJJCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSU5DWEwsIElOQ1lMLCBJWSwgSiwgSlgsIEtYLCBLWSwgTUwsIE5MCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgVFJBTgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgTUFYLCBTUVJUCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFRSQU4gPSBUUkFOUy5FUS4nVCcuT1IuVFJBTlMuRVEuJ0MnCisgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgTUwgPSBOCisgICAgICAgICBOTCA9IE0KKyAgICAgIEVMU0UKKyAgICAgICAgIE1MID0gTQorICAgICAgICAgTkwgPSBOCisgICAgICBFTkQgSUYKKyAgICAgIElGKCBJTkNYLkxULjAgKVRIRU4KKyAgICAgICAgIEtYID0gTkwKKyAgICAgICAgIElOQ1hMID0gLTEKKyAgICAgIEVMU0UKKyAgICAgICAgIEtYID0gMQorICAgICAgICAgSU5DWEwgPSAxCisgICAgICBFTkQgSUYKKyAgICAgIElGKCBJTkNZLkxULjAgKVRIRU4KKyAgICAgICAgIEtZID0gTUwKKyAgICAgICAgIElOQ1lMID0gLTEKKyAgICAgIEVMU0UKKyAgICAgICAgIEtZID0gMQorICAgICAgICAgSU5DWUwgPSAxCisgICAgICBFTkQgSUYKKyoKKyogICAgIENvbXB1dGUgZXhwZWN0ZWQgcmVzdWx0IGluIFlUIHVzaW5nIGRhdGEgaW4gQSwgWCBhbmQgWS4KKyogICAgIENvbXB1dGUgZ2F1Z2VzIGluIEcuCisqCisgICAgICBJWSA9IEtZCisgICAgICBETyAzMCBJID0gMSwgTUwKKyAgICAgICAgIFlUKCBJWSApID0gWkVSTworICAgICAgICAgRyggSVkgKSA9IFpFUk8KKyAgICAgICAgIEpYID0gS1gKKyAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICBETyAxMCBKID0gMSwgTkwKKyAgICAgICAgICAgICAgIFlUKCBJWSApID0gWVQoIElZICkgKyBBKCBKLCBJICkqWCggSlggKQorICAgICAgICAgICAgICAgRyggSVkgKSA9IEcoIElZICkgKyBBQlMoIEEoIEosIEkgKSpYKCBKWCApICkKKyAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYTAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIERPIDIwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEksIEogKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUyggQSggSSwgSiApKlgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAyMCAgICAgICBDT05USU5VRQorICAgICAgICAgRU5EIElGCisgICAgICAgICBZVCggSVkgKSA9IEFMUEhBKllUKCBJWSApICsgQkVUQSpZKCBJWSApCisgICAgICAgICBHKCBJWSApID0gQUJTKCBBTFBIQSApKkcoIElZICkgKyBBQlMoIEJFVEEqWSggSVkgKSApCisgICAgICAgICBJWSA9IElZICsgSU5DWUwKKyAgIDMwIENPTlRJTlVFCisqCisqICAgICBDb21wdXRlIHRoZSBlcnJvciByYXRpbyBmb3IgdGhpcyByZXN1bHQuCisqCisgICAgICBFUlIgPSBaRVJPCisgICAgICBETyA0MCBJID0gMSwgTUwKKyAgICAgICAgIEVSUkkgPSBBQlMoIFlUKCBJICkgLSBZWSggMSArICggSSAtIDEgKSpBQlMoIElOQ1kgKSApICkvRVBTCisgICAgICAgICBJRiggRyggSSApLk5FLlpFUk8gKQorICAgICAkICAgICAgRVJSSSA9IEVSUkkvRyggSSApCisgICAgICAgICBFUlIgPSBNQVgoIEVSUiwgRVJSSSApCisgICAgICAgICBJRiggRVJSKlNRUlQoIEVQUyApLkdFLk9ORSApCisgICAgICQgICAgICBHTyBUTyA1MAorICAgNDAgQ09OVElOVUUKKyogICAgIElmIHRoZSBsb29wIGNvbXBsZXRlcywgYWxsIHJlc3VsdHMgYXJlIGF0IGxlYXN0IGhhbGYgYWNjdXJhdGUuCisgICAgICBHTyBUTyA3MAorKgorKiAgICAgUmVwb3J0IGZhdGFsIGVycm9yLgorKgorICAgNTAgRkFUQUwgPSAuVFJVRS4KKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5ICkKKyAgICAgIERPIDYwIEkgPSAxLCBNTAorICAgICAgICAgSUYoIE1WIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgWVQoIEkgKSwKKyAgICAgJCAgICAgICAgIFlZKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWSApICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLCAKKyAgICAgJCAgICAgICAgIFlZKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWSApICksIFlUKEkpCisgICAgICAgICBFTkQgSUYKKyAgIDYwIENPTlRJTlVFCisqCisgICA3MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIENPTVBVVEVEIFJFU1VMVCBJUyBMRVNTIFRIQU4gSEFMJywKKyAgICAgJCAgICAgICdGIEFDQ1VSQVRFICoqKioqKionLCAvJyAgICAgICAgICAgRVhQRUNURUQgUkVTVUxUICAgQ09NUFUnLAorICAgICAkICAgICAgJ1RFRCBSRVNVTFQnICkKKyA5OTk4IEZPUk1BVCggMVgsIEk3LCAyRzE4LjYgKQorKgorKiAgICAgRW5kIG9mIFNNVkNILgorKgorICAgICAgRU5ECisgICAgICBMT0dJQ0FMIEZVTkNUSU9OIExTRSggUkksIFJKLCBMUiApCisqCisqICBUZXN0cyBpZiB0d28gYXJyYXlzIGFyZSBpZGVudGljYWwuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMUgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgUkkoICogKSwgUkooICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRE8gMTAgSSA9IDEsIExSCisgICAgICAgICBJRiggUkkoIEkgKS5ORS5SSiggSSApICkKKyAgICAgJCAgICAgIEdPIFRPIDIwCisgICAxMCBDT05USU5VRQorICAgICAgTFNFID0gLlRSVUUuCisgICAgICBHTyBUTyAzMAorICAgMjAgQ09OVElOVUUKKyAgICAgIExTRSA9IC5GQUxTRS4KKyAgIDMwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExTRS4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMU0VSRVMoIFRZUEUsIFVQTE8sIE0sIE4sIEFBLCBBUywgTERBICkKKyoKKyogIFRlc3RzIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGluIHR3byBhcnJheXMgYXJlIGVxdWFsLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnU1knIG9yICdTUCcuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMREEsIE0sIE4KKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUEoIExEQSwgKiApLCBBUyggTERBLCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQkVHLCBJRU5ELCBKCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgVVBQRVIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDEwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAxMCAgICAgICBDT05USU5VRQorICAgMjAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NZJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMzAgSSA9IDEsIElCRUcgLSAxCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNDAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDQwICAgICAgIENPTlRJTlVFCisgICA1MCAgICBDT05USU5VRQorICAgICAgRU5EIElGCisqCisgICA2MCBDT05USU5VRQorICAgICAgTFNFUkVTID0gLlRSVUUuCisgICAgICBHTyBUTyA4MAorICAgNzAgQ09OVElOVUUKKyAgICAgIExTRVJFUyA9IC5GQUxTRS4KKyAgIDgwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExTRVJFUy4KKyoKKyAgICAgIEVORAorICAgICAgUkVBTCBGVU5DVElPTiBTQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgcmFuZG9tIG51bWJlcnMgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGJldHdlZW4gLTAuNSBhbmQgMC41LgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQywgTUkKKyogICAgIC4uIFNhdmUgc3RhdGVtZW50IC4uCisgICAgICBTQVZFICAgICAgICAgICAgICAgSSwgSUMsIE1JCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgUkVBTAorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiggUkVTRVQgKVRIRU4KKyogICAgICAgIEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgorICAgICAgICAgTUkgPSA4OTEKKyAgICAgICAgIEkgPSA3CisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIFJFU0VUID0gLkZBTFNFLgorICAgICAgRU5EIElGCisqCisqICAgICBUaGUgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIEkgaXMgYm91bmRlZCBiZXR3ZWVuIDEgYW5kIDk5OS4KKyogICAgIElmIGluaXRpYWwgSSA9IDEsMiwzLDYsNyBvciA5LCB0aGUgcGVyaW9kIHdpbGwgYmUgNTAuCisqICAgICBJZiBpbml0aWFsIEkgPSA0IG9yIDgsIHRoZSBwZXJpb2Qgd2lsbCBiZSAyNS4KKyogICAgIElmIGluaXRpYWwgSSA9IDUsIHRoZSBwZXJpb2Qgd2lsbCBiZSAxMC4KKyogICAgIElDIGlzIHVzZWQgdG8gYnJlYWsgdXAgdGhlIHBlcmlvZCBieSBza2lwcGluZyAxIHZhbHVlIG9mIEkgaW4gNi4KKyoKKyAgICAgIElDID0gSUMgKyAxCisgICAxMCBJID0gSSpNSQorICAgICAgSSA9IEkgLSAxMDAwKiggSS8xMDAwICkKKyAgICAgIElGKCBJQy5HRS41IClUSEVOCisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIEdPIFRPIDEwCisgICAgICBFTkQgSUYKKyAgICAgIFNCRUcgPSBSRUFMKCBJIC0gNTAwICkvMTAwMS4wCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTQkVHLgorKgorICAgICAgRU5ECisgICAgICBSRUFMIEZVTkNUSU9OIFNESUZGKCBYLCBZICkKKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWCwgWQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBTRElGRiA9IFggLSBZCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBTRElGRi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyoKKyogIFRlc3RzIHdoZXRoZXIgWEVSQkxBIGhhcyBkZXRlY3RlZCBhbiBlcnJvciB3aGVuIGl0IHNob3VsZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIC5OT1QuTEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKUlORk9ULCBTUk5BTVQKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBMRVJSID0gLkZBTFNFLgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKiogSUxMRUdBTCBWQUxVRSBPRiBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIE5PVCBEJywKKyAgICAgJCAgICAgICdFVEVDVEVEIEJZICcsIEE2LCAnICoqKioqJyApCisqCisqICAgICBFbmQgb2YgQ0hLWEVSLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFhFUkJMQSggU1JOQU1FLCBJTkZPICkKKyoKKyogIFRoaXMgaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgWEVSQkxBIHRvIGJlIHVzZWQgb25seSBhcyBwYXJ0IG9mCisqICB0aGUgdGVzdCBwcm9ncmFtIGZvciB0ZXN0aW5nIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDIgQkxBUworKiAgcm91dGluZXMuCisqCisqICBYRVJCTEEgIGlzIGFuIGVycm9yIGhhbmRsZXIgZm9yIHRoZSBMZXZlbCAyIEJMQVMgcm91dGluZXMuCisqCisqICBJdCBpcyBjYWxsZWQgYnkgdGhlIExldmVsIDIgQkxBUyByb3V0aW5lcyBpZiBhbiBpbnB1dCBwYXJhbWV0ZXIgaXMKKyogIGludmFsaWQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1FCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVQsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgTEVSUiA9IC5UUlVFLgorICAgICAgSUYoIElORk8uTkUuSU5GT1QgKVRIRU4KKyAgICAgICAgIElGKCBJTkZPVC5ORS4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GTywgSU5GT1QKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClJTkZPCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBJRiggU1JOQU1FLk5FLlNSTkFNVCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNRSwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwgJyBJTlNURUFEJywKKyAgICAgJCAgICAgICcgT0YgJywgSTIsICcgKioqKioqKicgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBTUk5BTUUgPSAnLCBBNiwgJyBJTlNURScsCisgICAgICQgICAgICAnQUQgT0YgJywgQTYsICcgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsCisgICAgICQgICAgICAnICoqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBYRVJCTEEKKyoKKyAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3Rpbmcvc2JsYXQzLmRhdCBiL2JsYXMvdGVzdGluZy9zYmxhdDMuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGU3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3Rpbmcvc2JsYXQzLmRhdApAQCAtMCwwICsxLDIwIEBACisnc2JsYXQzLnN1bW0nICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKzYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorJ3NibGF0My5zbmFwJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCitUICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKzE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCis2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKzAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCiszICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCiswLjAgMS4wIDAuNyAgICAgICBWQUxVRVMgT0YgQUxQSEEKKzMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorMC4wIDEuMCAxLjMgICAgICAgVkFMVUVTIE9GIEJFVEEKK1NHRU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTU1lNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1RSTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1NUUlNNICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitTU1lSSyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorU1NZUjJLIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy9zYmxhdDMuZiBiL2JsYXMvdGVzdGluZy9zYmxhdDMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVhOWViCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL3NibGF0My5mCkBAIC0wLDAgKzEsMjgyMyBAQAorICAgICAgUFJPR1JBTSBTQkxBVDMKKyoKKyogIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIFJFQUwgICAgICAgICAgICAgTGV2ZWwgMyBCbGFzLgorKgorKiAgVGhlIHByb2dyYW0gbXVzdCBiZSBkcml2ZW4gYnkgYSBzaG9ydCBkYXRhIGZpbGUuIFRoZSBmaXJzdCAxNCByZWNvcmRzCisqICBvZiB0aGUgZmlsZSBhcmUgcmVhZCB1c2luZyBsaXN0LWRpcmVjdGVkIGlucHV0LCB0aGUgbGFzdCA2IHJlY29yZHMKKyogIGFyZSByZWFkIHVzaW5nIHRoZSBmb3JtYXQgKCBBNiwgTDIgKS4gQW4gYW5ub3RhdGVkIGV4YW1wbGUgb2YgYSBkYXRhCisqICBmaWxlIGNhbiBiZSBvYnRhaW5lZCBieSBkZWxldGluZyB0aGUgZmlyc3QgMyBjaGFyYWN0ZXJzIGZyb20gdGhlCisqICBmb2xsb3dpbmcgMjAgbGluZXM6CisqICAnU0JMQVQzLlNVTU0nICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKyogIDYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorKiAgJ1NCTEFUMy5TTkFQJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorKiAgLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorKiAgRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorKiAgRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCisqICBUICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKyogIDE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCisqICA2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKyogIDAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCisqICAzICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCisqICAwLjAgMS4wIDAuNyAgICAgICBWQUxVRVMgT0YgQUxQSEEKKyogIDMgICAgICAgICAgICAgICAgIE5VTUJFUiBPRiBWQUxVRVMgT0YgQkVUQQorKiAgMC4wIDEuMCAxLjMgICAgICAgVkFMVUVTIE9GIEJFVEEKKyogIFNHRU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBTU1lNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgU1RSTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFNUUlNNICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBTU1lSSyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgU1NZUjJLIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyoKKyogIFNlZToKKyoKKyogICAgIERvbmdhcnJhIEouIEouLCBEdSBDcm96IEouIEouLCBEdWZmIEkuIFMuIGFuZCBIYW1tYXJsaW5nIFMuCisqICAgICBBIFNldCBvZiBMZXZlbCAzIEJhc2ljIExpbmVhciBBbGdlYnJhIFN1YnByb2dyYW1zLgorKgorKiAgICAgVGVjaG5pY2FsIE1lbW9yYW5kdW0gTm8uODggKFJldmlzaW9uIDEpLCBNYXRoZW1hdGljcyBhbmQKKyogICAgIENvbXB1dGVyIFNjaWVuY2UgRGl2aXNpb24sIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeSwgOTcwMAorKiAgICAgU291dGggQ2FzcyBBdmVudWUsIEFyZ29ubmUsIElsbGlub2lzIDYwNDM5LCBVUy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTklOCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOSU4gPSA1ICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOU1VCUworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTlNVQlMgPSA2ICkKKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIEhBTEYgPSAwLjUsIE9ORSA9IDEuMCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTk1BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTk1BWCA9IDY1ICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSURNQVgsIE5BTE1BWCwgTkJFTUFYCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOSURNQVggPSA5LCBOQUxNQVggPSA3LCBOQkVNQVggPSA3ICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIEVSUiwgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSVNOVU0sIEosIE4sIE5BTEYsIE5CRVQsIE5JRElNLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIExURVNUVCwgUkVXSSwgU0FNRSwgU0ZBVEFMLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBUU1RFUlIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOU0EsIFRSQU5TQgorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FVAorICAgICAgQ0hBUkFDVEVSKjMyICAgICAgIFNOQVBTLCBTVU1NUlkKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFBKCBOTUFYKk5NQVggKSwgQUIoIE5NQVgsIDIqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFMRiggTkFMTUFYICksIEFTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQlMoIE5NQVgqTk1BWCApLCBDKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ0MoIE5NQVgqTk1BWCApLCBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgRyggTk1BWCApLCBXKCAyKk5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRE1BWCApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFRFU1QoIE5TVUJTICkKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVMoIE5TVUJTICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFNESUZGCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFNFCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU0RJRkYsIExTRQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBTQ0hLMSwgU0NISzIsIFNDSEszLCBTQ0hLNCwgU0NISzUsIFNDSEtFLCBTTU1DSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWCwgTUlOCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvU1JOQU1DL1NSTkFNVAorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgU05BTUVTLydTR0VNTSAnLCAnU1NZTU0gJywgJ1NUUk1NICcsICdTVFJTTSAnLAorICAgICAkICAgICAgICAgICAgICAgICAgICdTU1lSSyAnLCAnU1NZUjJLJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc3VtbWFyeSBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTVU1NUlkKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTk9VVAorICAgICAgT1BFTiggTk9VVCwgRklMRSA9IFNVTU1SWSwgU1RBVFVTID0gJ05FVycgKQorICAgICAgTk9VVEMgPSBOT1VUCisqCisqICAgICBSZWFkIG5hbWUgYW5kIHVuaXQgbnVtYmVyIGZvciBzbmFwc2hvdCBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTTkFQUworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOVFJBCisgICAgICBUUkFDRSA9IE5UUkEuR0UuMAorICAgICAgSUYoIFRSQUNFIClUSEVOCisgICAgICAgICBPUEVOKCBOVFJBLCBGSUxFID0gU05BUFMsIFNUQVRVUyA9ICdORVcnICkKKyAgICAgIEVORCBJRgorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgcmV3aW5kaW5nIG9mIHRoZSBzbmFwc2hvdCBmaWxlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClSRVdJCisgICAgICBSRVdJID0gUkVXSS5BTkQuVFJBQ0UKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHN0b3BwaW5nIG9uIGFueSBmYWlsdXJlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTRkFUQUwKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBlcnJvciBleGl0cyBhcmUgdG8gYmUgdGVzdGVkLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUU1RFUlIKKyogICAgIFJlYWQgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiB0aGUgdGVzdCByYXRpbworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUSFJFU0gKKyoKKyogICAgIFJlYWQgYW5kIGNoZWNrIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgdGVzdHMuCisqCisqICAgICBWYWx1ZXMgb2YgTgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOSURJTQorICAgICAgSUYoIE5JRElNLkxULjEuT1IuTklESU0uR1QuTklETUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ04nLCBOSURNQVgKKyAgICAgICAgIEdPIFRPIDIyMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgRE8gMTAgSSA9IDEsIE5JRElNCisgICAgICAgICBJRiggSURJTSggSSApLkxULjAuT1IuSURJTSggSSApLkdULk5NQVggKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClOTUFYCisgICAgICAgICAgICBHTyBUTyAyMjAKKyAgICAgICAgIEVORCBJRgorICAgMTAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBBTFBIQQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOQUxGCisgICAgICBJRiggTkFMRi5MVC4xLk9SLk5BTEYuR1QuTkFMTUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ0FMUEhBJywgTkFMTUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEFMRiggSSApLCBJID0gMSwgTkFMRiApCisqICAgICBWYWx1ZXMgb2YgQkVUQQorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOQkVUCisgICAgICBJRiggTkJFVC5MVC4xLk9SLk5CRVQuR1QuTkJFTUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ0JFVEEnLCBOQkVNQVgKKyAgICAgICAgIEdPIFRPIDIyMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyoKKyogICAgIFJlcG9ydCB2YWx1ZXMgb2YgcGFyYW1ldGVycy4KKyoKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1ICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0ICkoIElESU0oIEkgKSwgSSA9IDEsIE5JRElNICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzICkoIEFMRiggSSApLCBJID0gMSwgTkFMRiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApKCBCRVQoIEkgKSwgSSA9IDEsIE5CRVQgKQorICAgICAgSUYoIC5OT1QuVFNURVJSIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NCApCisgICAgICBFTkQgSUYKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClUSFJFU0gKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSAqICkKKyoKKyogICAgIFJlYWQgbmFtZXMgb2Ygc3Vicm91dGluZXMgYW5kIGZsYWdzIHdoaWNoIGluZGljYXRlCisqICAgICB3aGV0aGVyIHRoZXkgYXJlIHRvIGJlIHRlc3RlZC4KKyoKKyAgICAgIERPIDIwIEkgPSAxLCBOU1VCUworICAgICAgICAgTFRFU1QoIEkgKSA9IC5GQUxTRS4KKyAgIDIwIENPTlRJTlVFCisgICAzMCBSRUFEKCBOSU4sIEZNVCA9IDk5ODgsIEVORCA9IDYwIClTTkFNRVQsIExURVNUVAorICAgICAgRE8gNDAgSSA9IDEsIE5TVUJTCisgICAgICAgICBJRiggU05BTUVULkVRLlNOQU1FUyggSSApICkKKyAgICAgJCAgICAgIEdPIFRPIDUwCisgICA0MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTAgKVNOQU1FVAorICAgICAgU1RPUAorICAgNTAgTFRFU1QoIEkgKSA9IExURVNUVAorICAgICAgR08gVE8gMzAKKyoKKyAgIDYwIENPTlRJTlVFCisgICAgICBDTE9TRSAoIE5JTiApCisqCisqICAgICBDb21wdXRlIEVQUyAodGhlIG1hY2hpbmUgcHJlY2lzaW9uKS4KKyoKKyAgICAgIEVQUyA9IE9ORQorICAgNzAgQ09OVElOVUUKKyAgICAgIElGKCBTRElGRiggT05FICsgRVBTLCBPTkUgKS5FUS5aRVJPICkKKyAgICAgJCAgIEdPIFRPIDgwCisgICAgICBFUFMgPSBIQUxGKkVQUworICAgICAgR08gVE8gNzAKKyAgIDgwIENPTlRJTlVFCisgICAgICBFUFMgPSBFUFMgKyBFUFMKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClFUFMKKyoKKyogICAgIENoZWNrIHRoZSByZWxpYWJpbGl0eSBvZiBTTU1DSCB1c2luZyBleGFjdCBkYXRhLgorKgorICAgICAgTiA9IE1JTiggMzIsIE5NQVggKQorICAgICAgRE8gMTAwIEogPSAxLCBOCisgICAgICAgICBETyA5MCBJID0gMSwgTgorICAgICAgICAgICAgQUIoIEksIEogKSA9IE1BWCggSSAtIEogKyAxLCAwICkKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICAgICBBQiggSiwgTk1BWCArIDEgKSA9IEoKKyAgICAgICAgIEFCKCAxLCBOTUFYICsgSiApID0gSgorICAgICAgICAgQyggSiwgMSApID0gWkVSTworICAxMDAgQ09OVElOVUUKKyAgICAgIERPIDExMCBKID0gMSwgTgorICAgICAgICAgQ0MoIEogKSA9IEoqKCAoIEogKyAxICkqSiApLzIgLSAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTEwIENPTlRJTlVFCisqICAgICBDQyBob2xkcyB0aGUgZXhhY3QgcmVzdWx0LiBPbiBleGl0IGZyb20gU01NQ0ggQ1QgaG9sZHMKKyogICAgIHRoZSByZXN1bHQgY29tcHV0ZWQgYnkgU01NQ0guCisgICAgICBUUkFOU0EgPSAnTicKKyAgICAgIFRSQU5TQiA9ICdOJworICAgICAgQ0FMTCBTTU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExTRSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIFRSQU5TQiA9ICdUJworICAgICAgQ0FMTCBTTU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExTRSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyAgICAgIERPIDEyMCBKID0gMSwgTgorICAgICAgICAgQUIoIEosIE5NQVggKyAxICkgPSBOIC0gSiArIDEKKyAgICAgICAgIEFCKCAxLCBOTUFYICsgSiApID0gTiAtIEogKyAxCisgIDEyMCBDT05USU5VRQorICAgICAgRE8gMTMwIEogPSAxLCBOCisgICAgICAgICBDQyggTiAtIEogKyAxICkgPSBKKiggKCBKICsgMSApKkogKS8yIC0KKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICggKCBKICsgMSApKkoqKCBKIC0gMSApICkvMworICAxMzAgQ09OVElOVUUKKyAgICAgIFRSQU5TQSA9ICdUJworICAgICAgVFJBTlNCID0gJ04nCisgICAgICBDQUxMIFNNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTFNFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKVRSQU5TQSwgVFJBTlNCLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorICAgICAgVFJBTlNCID0gJ1QnCisgICAgICBDQUxMIFNNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTFNFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKVRSQU5TQSwgVFJBTlNCLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorKgorKiAgICAgVGVzdCBlYWNoIHN1YnJvdXRpbmUgaW4gdHVybi4KKyoKKyAgICAgIERPIDIwMCBJU05VTSA9IDEsIE5TVUJTCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICAgICBJRiggLk5PVC5MVEVTVCggSVNOVU0gKSApVEhFTgorKiAgICAgICAgICAgU3VicHJvZ3JhbSBpcyBub3QgdG8gYmUgdGVzdGVkLgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODcgKVNOQU1FUyggSVNOVU0gKQorICAgICAgICAgRUxTRQorICAgICAgICAgICAgU1JOQU1UID0gU05BTUVTKCBJU05VTSApCisqICAgICAgICAgICBUZXN0IGVycm9yIGV4aXRzLgorICAgICAgICAgICAgSUYoIFRTVEVSUiApVEhFTgorICAgICAgICAgICAgICAgQ0FMTCBTQ0hLRSggSVNOVU0sIFNOQU1FUyggSVNOVU0gKSwgTk9VVCApCisgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFRlc3QgY29tcHV0YXRpb25zLgorICAgICAgICAgICAgSU5GT1QgPSAwCisgICAgICAgICAgICBPSyA9IC5UUlVFLgorICAgICAgICAgICAgRkFUQUwgPSAuRkFMU0UuCisgICAgICAgICAgICBHTyBUTyAoIDE0MCwgMTUwLCAxNjAsIDE2MCwgMTcwLCAxODAgKUlTTlVNCisqICAgICAgICAgICBUZXN0IFNHRU1NLCAwMS4KKyAgMTQwICAgICAgIENBTEwgU0NISzEoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIEMsCisgICAgICQgICAgICAgICAgICAgICAgICBDQywgQ1MsIENULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBTU1lNTSwgMDIuCisgIDE1MCAgICAgICBDQUxMIFNDSEsyKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDLAorICAgICAkICAgICAgICAgICAgICAgICAgQ0MsIENTLCBDVCwgRyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgU1RSTU0sIDAzLCBTVFJTTSwgMDQuCisgIDE2MCAgICAgICBDQUxMIFNDSEszKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOTUFYLCBBQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQ1QsIEcsIEMgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IFNTWVJLLCAwNS4KKyAgMTcwICAgICAgIENBTEwgU0NISzQoIFNOQU1FUyggSVNOVU0gKSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLAorICAgICAkICAgICAgICAgICAgICAgICAgUkVXSSwgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5NQVgsIEFCLCBBQSwgQVMsIEFCKCAxLCBOTUFYICsgMSApLCBCQiwgQlMsIEMsCisgICAgICQgICAgICAgICAgICAgICAgICBDQywgQ1MsIENULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKiAgICAgICAgICAgVGVzdCBTU1lSMkssIDA2LgorICAxODAgICAgICAgQ0FMTCBTQ0hLNSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHLCBXICkKKyAgICAgICAgICAgIEdPIFRPIDE5MAorKgorICAxOTAgICAgICAgSUYoIEZBVEFMLkFORC5TRkFUQUwgKQorICAgICAkICAgICAgICAgR08gVE8gMjEwCisgICAgICAgICBFTkQgSUYKKyAgMjAwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NiApCisgICAgICBHTyBUTyAyMzAKKyoKKyAgMjEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApCisgICAgICBHTyBUTyAyMzAKKyoKKyAgMjIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MSApCisqCisgIDIzMCBDT05USU5VRQorICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgIENMT1NFICggTlRSQSApCisgICAgICBDTE9TRSAoIE5PVVQgKQorICAgICAgU1RPUAorKgorIDk5OTkgRk9STUFUKCAnIFJPVVRJTkVTIFBBU1MgQ09NUFVUQVRJT05BTCBURVNUUyBJRiBURVNUIFJBVElPIElTIExFUycsCisgICAgICQgICAgICAnUyBUSEFOJywgRjguMiApCisgOTk5OCBGT1JNQVQoICcgUkVMQVRJVkUgTUFDSElORSBQUkVDSVNJT04gSVMgVEFLRU4gVE8gQkUnLCAxUCwgRTkuMSApCisgOTk5NyBGT1JNQVQoICcgTlVNQkVSIE9GIFZBTFVFUyBPRiAnLCBBLCAnIElTIExFU1MgVEhBTiAxIE9SIEdSRUFURVIgJywKKyAgICAgJCAgICAgICdUSEFOICcsIEkyICkKKyA5OTk2IEZPUk1BVCggJyBWQUxVRSBPRiBOIElTIExFU1MgVEhBTiAwIE9SIEdSRUFURVIgVEhBTiAnLCBJMiApCisgOTk5NSBGT1JNQVQoICcgVEVTVFMgT0YgVEhFIFJFQUwgICAgICAgICAgICAgTEVWRUwgMyBCTEFTJywgLy8nIFRIRSBGJywKKyAgICAgJCAgICAgICdPTExPV0lORyBQQVJBTUVURVIgVkFMVUVTIFdJTEwgQkUgVVNFRDonICkKKyA5OTk0IEZPUk1BVCggJyAgIEZPUiBOICAgICAgICAgICAgICAnLCA5STYgKQorIDk5OTMgRk9STUFUKCAnICAgRk9SIEFMUEhBICAgICAgICAgICcsIDdGNi4xICkKKyA5OTkyIEZPUk1BVCggJyAgIEZPUiBCRVRBICAgICAgICAgICAnLCA3RjYuMSApCisgOTk5MSBGT1JNQVQoICcgQU1FTkQgREFUQSBGSUxFIE9SIElOQ1JFQVNFIEFSUkFZIFNJWkVTIElOIFBST0dSQU0nLAorICAgICAkICAgICAgLycgKioqKioqKiBURVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5OTAgRk9STUFUKCAnIFNVQlBST0dSQU0gTkFNRSAnLCBBNiwgJyBOT1QgUkVDT0dOSVpFRCcsIC8nICoqKioqKiogVCcsCisgICAgICQgICAgICAnRVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5ODkgRk9STUFUKCAnIEVSUk9SIElOIFNNTUNIIC0gIElOLUxJTkUgRE9UIFBST0RVQ1RTIEFSRSBCRUlORyBFVkFMVScsCisgICAgICQgICAgICAnQVRFRCBXUk9OR0xZLicsIC8nIFNNTUNIIFdBUyBDQUxMRUQgV0lUSCBUUkFOU0EgPSAnLCBBMSwKKyAgICAgJCAgICAgICcgQU5EIFRSQU5TQiA9ICcsIEExLCAvJyBBTkQgUkVUVVJORUQgU0FNRSA9ICcsIEwxLCAnIEFORCAnLAorICAgICAkICAgICAgJ0VSUiA9ICcsIEYxMi4zLCAnLicsIC8nIFRISVMgTUFZIEJFIERVRSBUTyBGQVVMVFMgSU4gVEhFICcsCisgICAgICQgICAgICAnQVJJVEhNRVRJQyBPUiBUSEUgQ09NUElMRVIuJywgLycgKioqKioqKiBURVNUUyBBQkFORE9ORUQgJywKKyAgICAgJCAgICAgICcqKioqKioqJyApCisgOTk4OCBGT1JNQVQoIEE2LCBMMiApCisgOTk4NyBGT1JNQVQoIDFYLCBBNiwgJyBXQVMgTk9UIFRFU1RFRCcgKQorIDk5ODYgRk9STUFUKCAvJyBFTkQgT0YgVEVTVFMnICkKKyA5OTg1IEZPUk1BVCggLycgKioqKioqKiBGQVRBTCBFUlJPUiAtIFRFU1RTIEFCQU5ET05FRCAqKioqKioqJyApCisgOTk4NCBGT1JNQVQoICcgRVJST1ItRVhJVFMgV0lMTCBOT1QgQkUgVEVTVEVEJyApCisqCisqICAgICBFbmQgb2YgU0JMQVQzLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNDSEsxKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEEsIEFBLCBBUywgQiwgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHICkKKyoKKyogIFRlc3RzIFNHRU1NLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gMC4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDQyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApLCBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUxQSEEsIEFMUywgQkVUQSwgQkxTLCBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNBLCBJQ0IsIElLLCBJTSwgSU4sIEssIEtTLCBMQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTEJCLCBMQ0MsIExEQSwgTERBUywgTERCLCBMREJTLCBMREMsIExEQ1MsIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgTUEsIE1CLCBNUywgTiwgTkEsIE5BUkdTLCBOQiwgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU5BLCBUUkFOQgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5BUywgVFJBTkJTLCBUUkFOU0EsIFRSQU5TQgorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTRSwgTFNFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFNFLCBMU0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU0dFTU0sIFNNQUtFLCBTTU1DSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ05UQycvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTMKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyoKKyAgICAgIERPIDExMCBJTSA9IDEsIE5JRElNCisgICAgICAgICBNID0gSURJTSggSU0gKQorKgorICAgICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQyA9IE0KKyAgICAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIExDQyA9IExEQypOCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLk0uTEUuMAorKgorICAgICAgICAgICAgRE8gOTAgSUsgPSAxLCBOSURJTQorICAgICAgICAgICAgICAgSyA9IElESU0oIElLICkKKyoKKyAgICAgICAgICAgICAgIERPIDgwIElDQSA9IDEsIDMKKyAgICAgICAgICAgICAgICAgIFRSQU5TQSA9IElDSCggSUNBOiBJQ0EgKQorICAgICAgICAgICAgICAgICAgVFJBTkEgPSBUUkFOU0EuRVEuJ1QnLk9SLlRSQU5TQS5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgIElGKCBUUkFOQSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgTUEgPSBLCisgICAgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgIE1BID0gTQorICAgICAgICAgICAgICAgICAgICAgTkEgPSBLCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgICAgTERBID0gTUEKKyAgICAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICBHTyBUTyA4MAorICAgICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgRE8gNzAgSUNCID0gMSwgMworICAgICAgICAgICAgICAgICAgICAgVFJBTlNCID0gSUNIKCBJQ0I6IElDQiApCisgICAgICAgICAgICAgICAgICAgICBUUkFOQiA9IFRSQU5TQi5FUS4nVCcuT1IuVFJBTlNCLkVRLidDJworKgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU5CIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBNQiA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5CID0gSworICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgTUIgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBOQiA9IE4KKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgICAgICAgU2V0IExEQiB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICAgICAgICBMREIgPSBNQgorICAgICAgICAgICAgICAgICAgICAgSUYoIExEQi5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIExEQiA9IExEQiArIDEKKyogICAgICAgICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgICAgICAgSUYoIExEQi5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIEdPIFRPIDcwCisgICAgICAgICAgICAgICAgICAgICBMQkIgPSBMREIqTkIKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCBNQiwgTkIsIEIsIE5NQVgsIEJCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBDLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTkFTID0gVFJBTlNBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOQlMgPSBUUkFOU0IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExDQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MoIEkgKSA9IENDKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMRENTID0gTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywgQUxQSEEsIExEQSwgTERCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTR0VNTSggVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssIEFMUEhBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSwgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVFJBTlNBLkVRLlRSQU5BUworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFRSQU5TQi5FUS5UUkFOQlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExTRSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMREJTLkVRLkxEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTFNFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExTRVJFUyggJ0dFJywgJyAnLCBNLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMyApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBLCBOTUFYLCBCLCBOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQywgTk1BWCwgQ1QsIEcsIENDLCBMREMsIEVQUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgIENPTlRJTlVFCisqCisgIDExMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywKKyAgICAgJCAgIEFMUEhBLCBMREEsIExEQiwgQkVUQSwgTERDCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcnJywgQTEsICcnJywnLAorICAgICAkICAgICAgMyggSTMsICcsJyApLCBGNC4xLCAnLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnLCcsIEY0LjEsICcsICcsCisgICAgICQgICAgICAnQywnLCBJMywgJykuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLMS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTQ0hLMiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBTU1lNTS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUywgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDUywgSUNVLCBJTSwgSU4sIExBQSwgTEJCLCBMQ0MsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMREIsIExEQlMsIExEQywgTERDUywgTSwgTVMsIE4sIE5BLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5BUkdTLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRUZULCBOVUxMLCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFNJREUsIFNJREVTLCBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSFMsIElDSFUKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UsIExTRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTRSwgTFNFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNNQUtFLCBTTU1DSCwgU1NZTU0KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIUy8nTFInLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDEyCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMDAgSU0gPSAxLCBOSURJTQorICAgICAgICAgTSA9IElESU0oIElNICkKKyoKKyAgICAgICAgIERPIDkwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQyA9IE0KKyAgICAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyA5MAorICAgICAgICAgICAgTENDID0gTERDKk4KKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuTS5MRS4wCisqCisqICAgICAgICAgICBTZXQgTERCIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQiA9IE0KKyAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyA5MAorICAgICAgICAgICAgTEJCID0gTERCKk4KKyoKKyogICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBCLCBOTUFYLCBCQiwgTERCLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFpFUk8gKQorKgorICAgICAgICAgICAgRE8gODAgSUNTID0gMSwgMgorICAgICAgICAgICAgICAgU0lERSA9IElDSFMoIElDUzogSUNTICkKKyAgICAgICAgICAgICAgIExFRlQgPSBTSURFLkVRLidMJworKgorICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIE5BID0gTQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTkEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyA4MAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisgICAgICAgICAgICAgICBETyA3MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHN5bW1ldHJpYyBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdTWScsIFVQTE8sICcgJywgTkEsIE5BLCBBLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgRE8gNjAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTSwgTiwgQywgTk1BWCwgQ0MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNJREVTID0gU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExCQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQlMoIEkgKSA9IEJCKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREJTID0gTERCCisgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUyggSSApID0gQ0MoIEkgKQorICAgMzAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQ1MgPSBMREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgU0lERSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFVQTE8sIE0sIE4sIEFMUEhBLCBMREEsIExEQiwgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTU1lNTSggU0lERSwgVVBMTywgTSwgTiwgQUxQSEEsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBCRVRBLCBDQywgTERDICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBTSURFUy5FUS5TSURFCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMU0UoIEJTLCBCQiwgTEJCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBMREJTLkVRLkxEQgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTFNFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExTRVJFUyggJ0dFJywgJyAnLCBNLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTEVGVCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTU1DSCggJ04nLCAnTicsIE0sIE4sIE0sIEFMUEhBLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQiwgTk1BWCwgQkVUQSwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENULCBHLCBDQywgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTU1DSCggJ04nLCAnTicsIE0sIE4sIE4sIEFMUEhBLCBCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQSwgTk1BWCwgQkVUQSwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENULCBHLCBDQywgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMjAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsIFVQTE8sIE0sIE4sIEFMUEhBLCBMREEsCisgICAgICQgICBMREIsIEJFVEEsIExEQworKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICBGNC4xLCAnLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnLCcsIEY0LjEsICcsIEMsJywgSTMsICcpICAgJywKKyAgICAgJCAgICAgICcgLicgKQorIDk5OTQgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgU0NISzIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU0NISzMoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTk1BWCwgQSwgQUEsIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgQiwgQkIsIEJTLCBDVCwgRywgQyApCisqCisqICBUZXN0cyBTVFJNTSBhbmQgU1RSU00uCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCwgT05FID0gMS4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDKCBOTUFYLCBOTUFYICksIENUKCBOTUFYICksIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQUxTLCBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQ0QsIElDUywgSUNULCBJQ1UsIElNLCBJTiwgSiwgTEFBLCBMQkIsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERBLCBMREFTLCBMREIsIExEQlMsIE0sIE1TLCBOLCBOQSwgTkFSR1MsIE5DLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVGVCwgTlVMTCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBESUFHUywgU0lERSwgU0lERVMsIFRSQU5BUywgVFJBTlNBLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIRCwgSUNIUywgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMU0UsIExTRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExTRSwgTFNFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFNNQUtFLCBTTU1DSCwgU1RSTU0sIFNUUlNNCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFUvJ1VMJy8sIElDSFQvJ05UQycvLCBJQ0hELydVTicvLCBJQ0hTLydMUicvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIE5BUkdTID0gMTEKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFpFUk8KKyogICAgIFNldCB1cCB6ZXJvIG1hdHJpeCBmb3IgU01NQ0guCisgICAgICBETyAyMCBKID0gMSwgTk1BWAorICAgICAgICAgRE8gMTAgSSA9IDEsIE5NQVgKKyAgICAgICAgICAgIEMoIEksIEogKSA9IFpFUk8KKyAgIDEwICAgIENPTlRJTlVFCisgICAyMCBDT05USU5VRQorKgorICAgICAgRE8gMTQwIElNID0gMSwgTklESU0KKyAgICAgICAgIE0gPSBJRElNKCBJTSApCisqCisgICAgICAgICBETyAxMzAgSU4gPSAxLCBOSURJTQorICAgICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgICAgIFNldCBMREIgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERCID0gTQorICAgICAgICAgICAgSUYoIExEQi5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQiA9IExEQiArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQi5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgTEJCID0gTERCKk4KKyAgICAgICAgICAgIE5VTEwgPSBNLkxFLjAuT1IuTi5MRS4wCisqCisgICAgICAgICAgICBETyAxMjAgSUNTID0gMSwgMgorICAgICAgICAgICAgICAgU0lERSA9IElDSFMoIElDUzogSUNTICkKKyAgICAgICAgICAgICAgIExFRlQgPSBTSURFLkVRLidMJworICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIE5BID0gTQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTkEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorICAgICAgICAgICAgICAgRE8gMTEwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisqCisgICAgICAgICAgICAgICAgICBETyAxMDAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgICAgICAgVFJBTlNBID0gSUNIVCggSUNUOiBJQ1QgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSUNEID0gMSwgMgorICAgICAgICAgICAgICAgICAgICAgICAgRElBRyA9IElDSEQoIElDRDogSUNEICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDgwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdUUicsIFVQTE8sIERJQUcsIE5BLCBOQSwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIFJFU0VULCBaRVJPICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERVMgPSBTSURFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5BUyA9IFRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRElBR1MgPSBESUFHCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIExCQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlMoIEkgKSA9IEJCKCBJICkKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJTID0gTERCCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01NJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBTSURFLCBVUExPLCBUUkFOU0EsIERJQUcsIE0sIE4sIEFMUEhBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNUUk1NKCBTSURFLCBVUExPLCBUUkFOU0EsIERJQUcsIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBBTFBIQSwgQUEsIExEQSwgQkIsIExEQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTTkFNRSggNDogNSApLkVRLidTTScgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLCBOLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgTERCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTVFJTTSggU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgQUxQSEEsIEFBLCBMREEsIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gU0lERVMuRVEuU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBUUkFOQVMuRVEuVFJBTlNBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gRElBR1MuRVEuRElBRworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFNFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExTRSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMU0VSRVMoICdHRScsICcgJywgTSwgTiwgQlMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExEQlMuRVEuTERCCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggU05BTUUoIDQ6IDUgKS5FUS4nTU0nIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01NQ0goIFRSQU5TQSwgJ04nLCBNLCBOLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEEsIE5NQVgsIEIsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBDLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNTUNIKCAnTicsIFRSQU5TQSwgTSwgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBCLCBOTUFYLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTywgQywgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTTkFNRSggNDogNSApLkVRLidTTScgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgYXBwcm94aW1hdGlvbiB0byBvcmlnaW5hbAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCBJLCBKICkgPSBCQiggSSArICggSiAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiggSSArICggSiAtIDEgKSpMREIgKSA9IEFMUEhBKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiggSSwgSiApCisgICA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgNzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNTUNIKCBUUkFOU0EsICdOJywgTSwgTiwgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQSwgTk1BWCwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEIsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLkZBTFNFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNTUNIKCAnTicsIFRSQU5TQSwgTSwgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQywgTk1BWCwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEIsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLkZBTFNFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgODAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTIwICAgICAgIENPTlRJTlVFCisqCisgIDEzMCAgICBDT05USU5VRQorKgorICAxNDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE2MAorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgTiwgQUxQSEEsIExEQSwgTERCCisqCisgIDE2MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgNCggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgIEY0LjEsICcsIEEsJywgSTMsICcsIEIsJywgSTMsICcpICAgICAgICAuJyApCisgOTk5NCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBTQ0hLMy4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBTQ0hLNCggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBTU1lSSy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgRVBTLCBUSFJFU0gKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOQUxGLCBOQkVULCBOSURJTSwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBCKCBOTUFYLCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRVQgKSwgQlMoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEMoIE5NQVgsIE5NQVggKSwgQ0MoIE5NQVgqTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENTKCBOTUFYKk5NQVggKSwgQ1QoIE5NQVggKSwgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJFVFMsIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ1QsIElDVSwgSUssIElOLCBKLCBKQywgSkosIEssIEtTLAorICAgICAkICAgICAgICAgICAgICAgICAgIExBQSwgTENDLCBMREEsIExEQVMsIExEQywgTERDUywgTEosIE1BLCBOLCBOQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU4sIFVQUEVSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMsIFRSQU5TUywgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hVCisgICAgICBDSEFSQUNURVIqMyAgICAgICAgSUNIVAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTRSwgTFNFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFNFLCBMU0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU01BS0UsIFNNTUNILCBTU1lSSworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hULydOVEMnLywgSUNIVS8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBOQVJHUyA9IDEwCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBaRVJPCisqCisgICAgICBETyAxMDAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREMgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERDID0gTgorICAgICAgICAgSUYoIExEQy5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQyA9IExEQyArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQy5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDEwMAorICAgICAgICAgTENDID0gTERDKk4KKyAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgIERPIDkwIElLID0gMSwgTklESU0KKyAgICAgICAgICAgIEsgPSBJRElNKCBJSyApCisqCisgICAgICAgICAgICBETyA4MCBJQ1QgPSAxLCAzCisgICAgICAgICAgICAgICBUUkFOUyA9IElDSFQoIElDVDogSUNUICkKKyAgICAgICAgICAgICAgIFRSQU4gPSBUUkFOUy5FUS4nVCcuT1IuVFJBTlMuRVEuJ0MnCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgTUEgPSBLCisgICAgICAgICAgICAgICAgICBOQSA9IE4KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE1BID0gTgorICAgICAgICAgICAgICAgICAgTkEgPSBLCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTUEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyA4MAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgRE8gNzAgSUNVID0gMSwgMgorICAgICAgICAgICAgICAgICAgVVBMTyA9IElDSFUoIElDVTogSUNVICkKKyAgICAgICAgICAgICAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyoKKyAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBDLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ1NZJywgVVBMTywgJyAnLCBOLCBOLCBDLCBOTUFYLCBDQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgQkVUUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE4sIEssIEFMUEhBLCBMREEsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU1NZUksoIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEsIENDLCBMREMgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU1MuRVEuVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExTRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gQkVUUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExTRSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExTRVJFUyggJ1NZJywgVVBMTywgTiwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDMwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01NQ0goICdUJywgJ04nLCBMSiwgMSwgSywgQUxQSEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBKCAxLCBKSiApLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSggMSwgSiApLCBOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSkosIEogKSwgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQyggSkMgKSwgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTU1DSCggJ04nLCAnVCcsIExKLCAxLCBLLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEoIEpKLCAxICksIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBKCBKLCAxICksIE5NQVgsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCBKSiwgSiApLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDKCBKQyApLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSBKQyArIExEQyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDUwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA2MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICBDT05USU5VRQorKgorICAxMDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMTAgQ09OVElOVUUKKyAgICAgIElGKCBOLkdULjEgKQorICAgICAkICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgIExEQSwgQkVUQSwgTERDCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgIEY0LjEsICcsIEEsJywgSTMsICcsJywgRjQuMSwgJywgQywnLCBJMywgJykgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFNDSEs0LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNDSEs1KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEFCLCBBQSwgQVMsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRywgVyApCisqCisqICBUZXN0cyBTU1lSMksuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTkJFVCwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUEoIE5NQVgqTk1BWCApLCBBQiggMipOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBTEYoIE5BTEYgKSwgQVMoIE5NQVgqTk1BWCApLCBCQiggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkVUKCBOQkVUICksIEJTKCBOTUFYKk5NQVggKSwgQyggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENDKCBOTUFYKk5NQVggKSwgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEcoIE5NQVggKSwgVyggMipOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQUxQSEEsIEFMUywgQkVUQSwgQkVUUywgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUIsIElDVCwgSUNVLCBJSywgSU4sIEosIEpDLCBKSiwgSkpBQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBLLCBLUywgTEFBLCBMQkIsIExDQywgTERBLCBMREFTLCBMREIsIExEQlMsCisgICAgICQgICAgICAgICAgICAgICAgICAgTERDLCBMRENTLCBMSiwgTUEsIE4sIE5BLCBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTlVMTCwgUkVTRVQsIFNBTUUsIFRSQU4sIFVQUEVSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMsIFRSQU5TUywgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hVCisgICAgICBDSEFSQUNURVIqMyAgICAgICAgSUNIVAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExTRSwgTFNFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFNFLCBMU0VSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgU01BS0UsIFNNTUNILCBTU1lSMksKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVC8nTlRDJy8sIElDSFUvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgTkFSR1MgPSAxMgorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gWkVSTworKgorICAgICAgRE8gMTMwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQyA9IE4KKyAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMzAKKyAgICAgICAgIExDQyA9IExEQypOCisgICAgICAgICBOVUxMID0gTi5MRS4wCisqCisgICAgICAgICBETyAxMjAgSUsgPSAxLCBOSURJTQorICAgICAgICAgICAgSyA9IElESU0oIElLICkKKyoKKyAgICAgICAgICAgIERPIDExMCBJQ1QgPSAxLCAzCisgICAgICAgICAgICAgICBUUkFOUyA9IElDSFQoIElDVDogSUNUICkKKyAgICAgICAgICAgICAgIFRSQU4gPSBUUkFOUy5FUS4nVCcuT1IuVFJBTlMuRVEuJ0MnCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgTUEgPSBLCisgICAgICAgICAgICAgICAgICBOQSA9IE4KKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIE1BID0gTgorICAgICAgICAgICAgICAgICAgTkEgPSBLCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTUEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCLCAyKk5NQVgsIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiwgTk1BWCwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBCLgorKgorICAgICAgICAgICAgICAgTERCID0gTERBCisgICAgICAgICAgICAgICBMQkIgPSBMQUEKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBDQUxMIFNNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiggSyArIDEgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIDIqTk1BWCwgQkIsIExEQiwgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgQ0FMTCBTTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIoIEsqTk1BWCArIDEgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEJCLCBMREIsIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgRE8gMTAwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisgICAgICAgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICAgICAgICBETyA5MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA4MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgU01BS0UoICdTWScsIFVQTE8sICcgJywgTiwgTiwgQywgTk1BWCwgQ0MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorICAgICAgICAgICAgICAgICAgICAgICAgQkVUUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE4sIEssIEFMUEhBLCBMREEsIExEQiwgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTU1lSMksoIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBCRVRBLCBDQywgTERDICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlNTLkVRLlRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMU0UoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExTRSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQlMuRVEuTERCCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IEJFVFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTFNFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExTRVJFUyggJ1NZJywgVVBMTywgTiwgTiwgQ1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExEQ1MuRVEuTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSkFCID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEkgKSA9IEFCKCAoIEogLSAxICkqMipOTUFYICsgSyArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEsgKyBJICkgPSBBQiggKCBKIC0gMSApKjIqTk1BWCArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBTTU1DSCggJ1QnLCAnTicsIExKLCAxLCAyKkssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQUIoIEpKQUIgKSwgMipOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVywgMipOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSkosIEogKSwgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQyggSkMgKSwgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEkgKSA9IEFCKCAoIEsgKyBJIC0gMSApKk5NQVggKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBLICsgSSApID0gQUIoICggSSAtIDEgKSpOTUFYICsKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKICkKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFNNTUNIKCAnTicsICdOJywgTEosIDEsIDIqSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBQiggSkogKSwgTk1BWCwgVywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqTk1BWCwgQkVUQSwgQyggSkosIEogKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIENULCBHLCBDQyggSkMgKSwgTERDLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkpBQiA9IEpKQUIgKyAyKk5NQVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgICAgIENPTlRJTlVFCisqCisgIDEyMCAgICBDT05USU5VRQorKgorICAxMzAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE2MAorKgorICAxNDAgQ09OVElOVUUKKyAgICAgIElGKCBOLkdULjEgKQorICAgICAkICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwKKyAgICAgJCAgIExEQSwgTERCLCBCRVRBLCBMREMKKyoKKyAgMTYwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgRjQuMSwgJywgQSwnLCBJMywgJywgQiwnLCBJMywgJywnLCBGNC4xLCAnLCBDLCcsIEkzLCAnKSAgICcsCisgICAgICQgICAgICAnIC4nICkKKyA5OTkzIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFNDSEs1LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNDSEtFKCBJU05VTSwgU1JOQU1ULCBOT1VUICkKKyoKKyogIFRlc3RzIHRoZSBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAzIEJsYXMuCisqICBSZXF1aXJlcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgZXJyb3ItaGFuZGxpbmcgcm91dGluZSBYRVJCTEEuCisqICBBTFBIQSwgQkVUQSwgQSwgQiBhbmQgQyBzaG91bGQgbm90IG5lZWQgdG8gYmUgZGVmaW5lZC4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSVNOVU0sIE5PVVQKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQkVUQQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggMiwgMSApLCBCKCAyLCAxICksIEMoIDIsIDEgKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEtYRVIsIFNHRU1NLCBTU1lNTSwgU1NZUjJLLCBTU1lSSywgU1RSTU0sCisgICAgICQgICAgICAgICAgICAgICAgICAgU1RSU00KKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqICAgICBPSyBpcyBzZXQgdG8gLkZBTFNFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBvciBieSBDSEtYRVIKKyogICAgIGlmIGFueXRoaW5nIGlzIHdyb25nLgorICAgICAgT0sgPSAuVFJVRS4KKyogICAgIExFUlIgaXMgc2V0IHRvIC5UUlVFLiBieSB0aGUgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSBlYWNoIHRpbWUKKyogICAgIGl0IGlzIGNhbGxlZCwgYW5kIGlzIHRoZW4gdGVzdGVkIGFuZCByZS1zZXQgYnkgQ0hLWEVSLgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIEdPIFRPICggMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCApSVNOVU0KKyAgIDEwIElORk9UID0gMQorICAgICAgQ0FMTCBTR0VNTSggJy8nLCAnTicsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEKKyAgICAgIENBTEwgU0dFTU0oICcvJywgJ1QnLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNHRU1NKCAnTicsICcvJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTR0VNTSggJ1QnLCAnLycsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTR0VNTSggJ04nLCAnVCcsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNHRU1NKCAnVCcsICdOJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU0dFTU0oICdUJywgJ1QnLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTR0VNTSggJ04nLCAnTicsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNHRU1NKCAnTicsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU0dFTU0oICdUJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTR0VNTSggJ1QnLCAnVCcsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNHRU1NKCAnTicsICdOJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJ1QnLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTR0VNTSggJ1QnLCAnTicsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNHRU1NKCAnVCcsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJ04nLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFNHRU1NKCAnTicsICdUJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBTR0VNTSggJ1QnLCAnTicsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgU0dFTU0oICdUJywgJ1QnLCAwLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBTR0VNTSggJ04nLCAnTicsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFNHRU1NKCAnVCcsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJ1QnLCAwLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBTR0VNTSggJ1QnLCAnVCcsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFNHRU1NKCAnTicsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgU0dFTU0oICdOJywgJ1QnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBTR0VNTSggJ1QnLCAnTicsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFNHRU1NKCAnVCcsICdUJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDcwCisgICAyMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1NZTU0oICcvJywgJ1UnLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNTWU1NKCAnTCcsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lNTSggJ0wnLCAnVScsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNTWU1NKCAnUicsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NZTU0oICdMJywgJ0wnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lNTSggJ1InLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNTWU1NKCAnTCcsICdVJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1NZTU0oICdSJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTU1lNTSggJ0wnLCAnTCcsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNTWU1NKCAnUicsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTWU1NKCAnUicsICdVJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZTU0oICdSJywgJ0wnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNTWU1NKCAnTCcsICdVJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTU1lNTSggJ1InLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1NZTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNTWU1NKCAnUicsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgU1NZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBTU1lNTSggJ1InLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFNTWU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgU1NZTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gNzAKKyAgIDMwIElORk9UID0gMQorICAgICAgQ0FMTCBTVFJNTSggJy8nLCAnVScsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNUUk1NKCAnTCcsICcvJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ1UnLCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTVFJNTSggJ0wnLCAnVScsICdOJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSTU0oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgU1RSTU0oICdSJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDcwCisgICA0MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgU1RSU00oICcvJywgJ1UnLCAnTicsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnLycsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdVJywgJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1RSU00oICdMJywgJ1UnLCAnTicsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSU00oICdSJywgJ1UnLCAnTicsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnVScsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdMJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1RSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdVJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIFNUUlNNKCAnUicsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIFNUUlNNKCAnUicsICdVJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdMJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIFNUUlNNKCAnTCcsICdMJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIFNUUlNNKCAnUicsICdMJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDExCisgICAgICBDQUxMIFNUUlNNKCAnUicsICdMJywgJ1QnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyA3MAorICAgNTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFNTWVJLKCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBTU1lSSyggJ1UnLCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NZUksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBTU1lSSyggJ1UnLCAnVCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFNTWVJLKCAnTCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NZUksoICdMJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTU1lSSyggJ1UnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFNTWVJLKCAnVScsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1NZUksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBTU1lSSyggJ0wnLCAnVCcsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTWVJLKCAnVScsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lSSyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZUksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTWVJLKCAnTCcsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgU1NZUksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBTU1lSSyggJ1UnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFNTWVJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgU1NZUksoICdMJywgJ1QnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gNzAKKyAgIDYwIElORk9UID0gMQorICAgICAgQ0FMTCBTU1lSMksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFNTWVIySyggJ1UnLCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NZUjJLKCAnVScsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NZUjJLKCAnVScsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NZUjJLKCAnTCcsICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgU1NZUjJLKCAnTCcsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1NZUjJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1NZUjJLKCAnVScsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1NZUjJLKCAnTCcsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgU1NZUjJLKCAnTCcsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZUjJLKCAnVScsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBTU1lSMksoICdVJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFNTWVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgU1NZUjJLKCAnTCcsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFNTWVIySyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgU1NZUjJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBTU1lSMksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBTU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBTU1lSMksoICdVJywgJ1QnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBTU1lSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBTU1lSMksoICdMJywgJ1QnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorICAgNzAgSUYoIE9LIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU1JOQU1UCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApU1JOQU1UCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMnICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMgKioqKionLAorICAgICAkICAgICAgJyoqJyApCisqCisqICAgICBFbmQgb2YgU0NIS0UuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU01BS0UoIFRZUEUsIFVQTE8sIERJQUcsIE0sIE4sIEEsIE5NQVgsIEFBLCBMREEsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgVFJBTlNMICkKKyoKKyogIEdlbmVyYXRlcyB2YWx1ZXMgZm9yIGFuIE0gYnkgTiBtYXRyaXggQS4KKyogIFN0b3JlcyB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBBQSBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQKKyogIGJ5IHRoZSByb3V0aW5lLCB3aXRoIHVud2FudGVkIGVsZW1lbnRzIHNldCB0byByb2d1ZSB2YWx1ZS4KKyoKKyogIFRZUEUgaXMgJ0dFJywgJ1NZJyBvciAnVFInLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAwLjAsIE9ORSA9IDEuMCApCisgICAgICBSRUFMICAgICAgICAgICAgICAgUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJPR1VFID0gLTEuMEUxMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOLCBOTUFYCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgQSggTk1BWCwgKiApLCBBQSggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEdFTiwgTE9XRVIsIFNZTSwgVFJJLCBVTklULCBVUFBFUgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgU0JFRworICAgICAgRVhURVJOQUwgICAgICAgICAgIFNCRUcKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgR0VOID0gVFlQRS5FUS4nR0UnCisgICAgICBTWU0gPSBUWVBFLkVRLidTWScKKyAgICAgIFRSSSA9IFRZUEUuRVEuJ1RSJworICAgICAgVVBQRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nVScKKyAgICAgIExPV0VSID0gKCBTWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ0wnCisgICAgICBVTklUID0gVFJJLkFORC5ESUFHLkVRLidVJworKgorKiAgICAgR2VuZXJhdGUgZGF0YSBpbiBhcnJheSBBLgorKgorICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBJRiggR0VOLk9SLiggVVBQRVIuQU5ELkkuTEUuSiApLk9SLiggTE9XRVIuQU5ELkkuR0UuSiApICkKKyAgICAgJCAgICAgICAgICBUSEVOCisgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBTQkVHKCBSRVNFVCApICsgVFJBTlNMCisgICAgICAgICAgICAgICBJRiggSS5ORS5KIClUSEVOCisqICAgICAgICAgICAgICAgICBTZXQgc29tZSBlbGVtZW50cyB0byB6ZXJvCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4zLkFORC5KLkVRLk4vMiApCisgICAgICQgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBBKCBJLCBKICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFRSSSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVORCBJRgorICAgMTAgICAgQ09OVElOVUUKKyAgICAgICAgIElGKCBUUkkgKQorICAgICAkICAgICAgQSggSiwgSiApID0gQSggSiwgSiApICsgT05FCisgICAgICAgICBJRiggVU5JVCApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBPTkUKKyAgIDIwIENPTlRJTlVFCisqCisqICAgICBTdG9yZSBlbGVtZW50cyBpbiBhcnJheSBBUyBpbiBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZCBieSByb3V0aW5lLgorKgorICAgICAgSUYoIFRZUEUuRVEuJ0dFJyApVEhFTgorICAgICAgICAgRE8gNTAgSiA9IDEsIE4KKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBNCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBNICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ1NZJy5PUi5UWVBFLkVRLidUUicgKVRIRU4KKyAgICAgICAgIERPIDkwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUVORCA9IEogLSAxCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUJFRyA9IEogKyAxCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJQkVHID0gSgorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyA2MCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgIDYwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA3MCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDcwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA4MCBJID0gSUVORCArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgODAgICAgICAgQ09OVElOVUUKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNNQUtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFNNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgS0ssIEFMUEhBLCBBLCBMREEsIEIsIExEQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVEEsIEMsIExEQywgQ1QsIEcsIENDLCBMRENDLCBFUFMsIEVSUiwgRkFUQUwsCisgICAgICQgICAgICAgICAgICAgICAgICBOT1VULCBNViApCisqCisqICBDaGVja3MgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXB1dGF0aW9uYWwgdGVzdHMuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9IDAuMCwgT05FID0gMS4wICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBTFBIQSwgQkVUQSwgRVBTLCBFUlIKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBLSywgTERBLCBMREIsIExEQywgTERDQywgTSwgTiwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBNVgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TQSwgVFJBTlNCCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBKCBMREEsICogKSwgQiggTERCLCAqICksIEMoIExEQywgKiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENDKCBMRENDLCAqICksIENUKCAqICksIEcoICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgUkVBTCAgICAgICAgICAgICAgIEVSUkkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBKLCBLCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgVFJBTkEsIFRSQU5CCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIFNRUlQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgVFJBTkEgPSBUUkFOU0EuRVEuJ1QnLk9SLlRSQU5TQS5FUS4nQycKKyAgICAgIFRSQU5CID0gVFJBTlNCLkVRLidUJy5PUi5UUkFOU0IuRVEuJ0MnCisqCisqICAgICBDb21wdXRlIGV4cGVjdGVkIHJlc3VsdCwgb25lIGNvbHVtbiBhdCBhIHRpbWUsIGluIENUIHVzaW5nIGRhdGEKKyogICAgIGluIEEsIEIgYW5kIEMuCisqICAgICBDb21wdXRlIGdhdWdlcyBpbiBHLgorKgorICAgICAgRE8gMTIwIEogPSAxLCBOCisqCisgICAgICAgICBETyAxMCBJID0gMSwgTQorICAgICAgICAgICAgQ1QoIEkgKSA9IFpFUk8KKyAgICAgICAgICAgIEcoIEkgKSA9IFpFUk8KKyAgIDEwICAgIENPTlRJTlVFCisgICAgICAgICBJRiggLk5PVC5UUkFOQS5BTkQuLk5PVC5UUkFOQiApVEhFTgorICAgICAgICAgICAgRE8gMzAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBJLCBLICkqQiggSywgSiApCisgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMoIEEoIEksIEsgKSApKkFCUyggQiggSywgSiApICkKKyAgIDIwICAgICAgICAgIENPTlRJTlVFCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRSBJRiggVFJBTkEuQU5ELi5OT1QuVFJBTkIgKVRIRU4KKyAgICAgICAgICAgIERPIDUwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSywgSSApKkIoIEssIEogKQorICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTKCBBKCBLLCBJICkgKSpBQlMoIEIoIEssIEogKSApCisgICA0MCAgICAgICAgICBDT05USU5VRQorICAgNTAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UgSUYoIC5OT1QuVFJBTkEuQU5ELlRSQU5CIClUSEVOCisgICAgICAgICAgICBETyA3MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEksIEsgKSpCKCBKLCBLICkKKyAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUyggQSggSSwgSyApICkqQUJTKCBCKCBKLCBLICkgKQorICAgNjAgICAgICAgICAgQ09OVElOVUUKKyAgIDcwICAgICAgIENPTlRJTlVFCisgICAgICAgICBFTFNFIElGKCBUUkFOQS5BTkQuVFJBTkIgKVRIRU4KKyAgICAgICAgICAgIERPIDkwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgRE8gODAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSywgSSApKkIoIEosIEsgKQorICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTKCBBKCBLLCBJICkgKSpBQlMoIEIoIEosIEsgKSApCisgICA4MCAgICAgICAgICBDT05USU5VRQorICAgOTAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgRE8gMTAwIEkgPSAxLCBNCisgICAgICAgICAgICBDVCggSSApID0gQUxQSEEqQ1QoIEkgKSArIEJFVEEqQyggSSwgSiApCisgICAgICAgICAgICBHKCBJICkgPSBBQlMoIEFMUEhBICkqRyggSSApICsgQUJTKCBCRVRBICkqQUJTKCBDKCBJLCBKICkgKQorICAxMDAgICAgQ09OVElOVUUKKyoKKyogICAgICAgIENvbXB1dGUgdGhlIGVycm9yIHJhdGlvIGZvciB0aGlzIHJlc3VsdC4KKyoKKyAgICAgICAgIEVSUiA9IFpFUk8KKyAgICAgICAgIERPIDExMCBJID0gMSwgTQorICAgICAgICAgICAgRVJSSSA9IEFCUyggQ1QoIEkgKSAtIENDKCBJLCBKICkgKS9FUFMKKyAgICAgICAgICAgIElGKCBHKCBJICkuTkUuWkVSTyApCisgICAgICQgICAgICAgICBFUlJJID0gRVJSSS9HKCBJICkKKyAgICAgICAgICAgIEVSUiA9IE1BWCggRVJSLCBFUlJJICkKKyAgICAgICAgICAgIElGKCBFUlIqU1FSVCggRVBTICkuR0UuT05FICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEzMAorICAxMTAgICAgQ09OVElOVUUKKyoKKyAgMTIwIENPTlRJTlVFCisqCisqICAgICBJZiB0aGUgbG9vcCBjb21wbGV0ZXMsIGFsbCByZXN1bHRzIGFyZSBhdCBsZWFzdCBoYWxmIGFjY3VyYXRlLgorICAgICAgR08gVE8gMTUwCisqCisqICAgICBSZXBvcnQgZmF0YWwgZXJyb3IuCisqCisgIDEzMCBGQVRBTCA9IC5UUlVFLgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKQorICAgICAgRE8gMTQwIEkgPSAxLCBNCisgICAgICAgICBJRiggTVYgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLCBDVCggSSApLCBDQyggSSwgSiApCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgQ0MoIEksIEogKSwgQ1QoIEkgKQorICAgICAgICAgRU5EIElGCisgIDE0MCBDT05USU5VRQorICAgICAgSUYoIE4uR1QuMSApCisgICAgICQgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApSgorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBDT01QVVRFRCBSRVNVTFQgSVMgTEVTUyBUSEFOIEhBTCcsCisgICAgICQgICAgICAnRiBBQ0NVUkFURSAqKioqKioqJywgLycgICAgICAgICAgIEVYUEVDVEVEIFJFU1VMVCAgIENPTVBVJywKKyAgICAgJCAgICAgICdURUQgUkVTVUxUJyApCisgOTk5OCBGT1JNQVQoIDFYLCBJNywgMkcxOC42ICkKKyA5OTk3IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyoKKyogICAgIEVuZCBvZiBTTU1DSC4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMU0UoIFJJLCBSSiwgTFIgKQorKgorKiAgVGVzdHMgaWYgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMUgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBSRUFMICAgICAgICAgICAgICAgUkkoICogKSwgUkooICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRE8gMTAgSSA9IDEsIExSCisgICAgICAgICBJRiggUkkoIEkgKS5ORS5SSiggSSApICkKKyAgICAgJCAgICAgIEdPIFRPIDIwCisgICAxMCBDT05USU5VRQorICAgICAgTFNFID0gLlRSVUUuCisgICAgICBHTyBUTyAzMAorICAgMjAgQ09OVElOVUUKKyAgICAgIExTRSA9IC5GQUxTRS4KKyAgIDMwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExTRS4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMU0VSRVMoIFRZUEUsIFVQTE8sIE0sIE4sIEFBLCBBUywgTERBICkKKyoKKyogIFRlc3RzIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGluIHR3byBhcnJheXMgYXJlIGVxdWFsLgorKgorKiAgVFlQRSBpcyAnR0UnIG9yICdTWScuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIExEQSwgTSwgTgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8KKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBUWVBFCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBBQSggTERBLCAqICksIEFTKCBMREEsICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElCRUcsIElFTkQsIEoKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBVUFBFUgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisgICAgICBJRiggVFlQRS5FUS4nR0UnIClUSEVOCisgICAgICAgICBETyAyMCBKID0gMSwgTgorICAgICAgICAgICAgRE8gMTAgSSA9IE0gKyAxLCBMREEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDEwICAgICAgIENPTlRJTlVFCisgICAyMCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nU1knIClUSEVOCisgICAgICAgICBETyA1MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAzMCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gSUVORCArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyoKKyAgIDYwIENPTlRJTlVFCisgICAgICBMU0VSRVMgPSAuVFJVRS4KKyAgICAgIEdPIFRPIDgwCisgICA3MCBDT05USU5VRQorICAgICAgTFNFUkVTID0gLkZBTFNFLgorICAgODAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgTFNFUkVTLgorKgorICAgICAgRU5ECisgICAgICBSRUFMIEZVTkNUSU9OIFNCRUcoIFJFU0VUICkKKyoKKyogIEdlbmVyYXRlcyByYW5kb20gbnVtYmVycyB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYmV0d2VlbiAtMC41IGFuZCAwLjUuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUMsIE1JCisqICAgICAuLiBTYXZlIHN0YXRlbWVudCAuLgorICAgICAgU0FWRSAgICAgICAgICAgICAgIEksIElDLCBNSQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBJRiggUkVTRVQgKVRIRU4KKyogICAgICAgIEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzLgorICAgICAgICAgTUkgPSA4OTEKKyAgICAgICAgIEkgPSA3CisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIFJFU0VUID0gLkZBTFNFLgorICAgICAgRU5EIElGCisqCisqICAgICBUaGUgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIEkgaXMgYm91bmRlZCBiZXR3ZWVuIDEgYW5kIDk5OS4KKyogICAgIElmIGluaXRpYWwgSSA9IDEsMiwzLDYsNyBvciA5LCB0aGUgcGVyaW9kIHdpbGwgYmUgNTAuCisqICAgICBJZiBpbml0aWFsIEkgPSA0IG9yIDgsIHRoZSBwZXJpb2Qgd2lsbCBiZSAyNS4KKyogICAgIElmIGluaXRpYWwgSSA9IDUsIHRoZSBwZXJpb2Qgd2lsbCBiZSAxMC4KKyogICAgIElDIGlzIHVzZWQgdG8gYnJlYWsgdXAgdGhlIHBlcmlvZCBieSBza2lwcGluZyAxIHZhbHVlIG9mIEkgaW4gNi4KKyoKKyAgICAgIElDID0gSUMgKyAxCisgICAxMCBJID0gSSpNSQorICAgICAgSSA9IEkgLSAxMDAwKiggSS8xMDAwICkKKyAgICAgIElGKCBJQy5HRS41IClUSEVOCisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIEdPIFRPIDEwCisgICAgICBFTkQgSUYKKyAgICAgIFNCRUcgPSAoIEkgLSA1MDAgKS8xMDAxLjAKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNCRUcuCisqCisgICAgICBFTkQKKyAgICAgIFJFQUwgRlVOQ1RJT04gU0RJRkYoIFgsIFkgKQorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIFJFQUwgICAgICAgICAgICAgICBYLCBZCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFNESUZGID0gWCAtIFkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFNESUZGLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorKiAgVGVzdHMgd2hldGhlciBYRVJCTEEgaGFzIGRldGVjdGVkIGFuIGVycm9yIHdoZW4gaXQgc2hvdWxkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCAuTk9ULkxFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPVCwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqIElMTEVHQUwgVkFMVUUgT0YgUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBOT1QgRCcsCisgICAgICQgICAgICAnRVRFQ1RFRCBCWSAnLCBBNiwgJyAqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENIS1hFUi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBYRVJCTEEoIFNSTkFNRSwgSU5GTyApCisqCisqICBUaGlzIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSB0byBiZSB1c2VkIG9ubHkgYXMgcGFydCBvZgorKiAgdGhlIHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAzIEJMQVMKKyogIHJvdXRpbmVzLgorKgorKiAgWEVSQkxBICBpcyBhbiBlcnJvciBoYW5kbGVyIGZvciB0aGUgTGV2ZWwgMyBCTEFTIHJvdXRpbmVzLgorKgorKiAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMZXZlbCAzIEJMQVMgcm91dGluZXMgaWYgYW4gaW5wdXQgcGFyYW1ldGVyIGlzCisqICBpbnZhbGlkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1FCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVQsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgTEVSUiA9IC5UUlVFLgorICAgICAgSUYoIElORk8uTkUuSU5GT1QgKVRIRU4KKyAgICAgICAgIElGKCBJTkZPVC5ORS4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GTywgSU5GT1QKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClJTkZPCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBJRiggU1JOQU1FLk5FLlNSTkFNVCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNRSwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwgJyBJTlNURUFEJywKKyAgICAgJCAgICAgICcgT0YgJywgSTIsICcgKioqKioqKicgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBTUk5BTUUgPSAnLCBBNiwgJyBJTlNURScsCisgICAgICQgICAgICAnQUQgT0YgJywgQTYsICcgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsCisgICAgICQgICAgICAnICoqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBYRVJCTEEKKyoKKyAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ibGFzL3Rlc3RpbmcvemJsYXQxLmYgYi9ibGFzL3Rlc3RpbmcvemJsYXQxLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0MTVlMQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvdGVzdGluZy96YmxhdDEuZgpAQCAtMCwwICsxLDY4MSBAQAorICAgICAgUFJPR1JBTSBaQkxBVDEKKyogICAgIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIENPTVBMRVgqMTYgTGV2ZWwgMSBCTEFTLgorKiAgICAgQmFzZWQgdXBvbiB0aGUgb3JpZ2luYWwgQkxBUyB0ZXN0IHJvdXRpbmUgdG9nZXRoZXIgd2l0aDoKKyogICAgIEYwNkdBRiBFeGFtcGxlIFByb2dyYW0gVGV4dAorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNGQUMKKyAgICAgIElOVEVHRVIgICAgICAgICAgSUMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgIENIRUNLMSwgQ0hFQ0syLCBIRUFERVIKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgIFNGQUMvOS43NjU2MjVELTQvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFdSSVRFIChOT1VULDk5OTk5KQorICAgICAgRE8gMjAgSUMgPSAxLCAxMAorICAgICAgICAgSUNBU0UgPSBJQworICAgICAgICAgQ0FMTCBIRUFERVIKKyoKKyogICAgICAgIEluaXRpYWxpemUgUEFTUywgSU5DWCwgSU5DWSwgYW5kIE1PREUgZm9yIGEgbmV3IGNhc2UuCisqICAgICAgICBUaGUgdmFsdWUgOTk5OSBmb3IgSU5DWCwgSU5DWSBvciBNT0RFIHdpbGwgYXBwZWFyIGluIHRoZQorKiAgICAgICAgZGV0YWlsZWQgIG91dHB1dCwgaWYgYW55LCBmb3IgY2FzZXMgdGhhdCBkbyBub3QgaW52b2x2ZQorKiAgICAgICAgdGhlc2UgcGFyYW1ldGVycy4KKyoKKyAgICAgICAgIFBBU1MgPSAuVFJVRS4KKyAgICAgICAgIElOQ1ggPSA5OTk5CisgICAgICAgICBJTkNZID0gOTk5OQorICAgICAgICAgTU9ERSA9IDk5OTkKKyAgICAgICAgIElGIChJQ0FTRS5MRS41KSBUSEVOCisgICAgICAgICAgICBDQUxMIENIRUNLMihTRkFDKQorICAgICAgICAgRUxTRSBJRiAoSUNBU0UuR0UuNikgVEhFTgorICAgICAgICAgICAgQ0FMTCBDSEVDSzEoU0ZBQykKKyAgICAgICAgIEVORCBJRgorKiAgICAgICAgLS0gUHJpbnQKKyAgICAgICAgIElGIChQQVNTKSBXUklURSAoTk9VVCw5OTk5OCkKKyAgIDIwIENPTlRJTlVFCisgICAgICBTVE9QCisqCis5OTk5OSBGT1JNQVQgKCcgQ29tcGxleCBCTEFTIFRlc3QgUHJvZ3JhbSBSZXN1bHRzJywvMVgpCis5OTk5OCBGT1JNQVQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLSBQQVNTIC0tLS0tJykKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBIRUFERVIKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgTk9VVAorICAgICAgUEFSQU1FVEVSICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgUEFTUworKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDSEFSQUNURVIqNiAgICAgIEwoMTApCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICBMKDEpLydaRE9UQyAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDIpLydaRE9UVSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDMpLydaQVhQWSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDQpLydaQ09QWSAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDUpLydaU1dBUCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDYpLydEWk5STTInLworICAgICAgREFUQSAgICAgICAgICAgICBMKDcpLydEWkFTVU0nLworICAgICAgREFUQSAgICAgICAgICAgICBMKDgpLydaU0NBTCAnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDkpLydaRFNDQUwnLworICAgICAgREFUQSAgICAgICAgICAgICBMKDEwKS8nSVpBTUFYJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgV1JJVEUgKE5PVVQsOTk5OTkpIElDQVNFLCBMKElDQVNFKQorICAgICAgUkVUVVJOCisqCis5OTk5OSBGT1JNQVQgKC8nIFRlc3Qgb2Ygc3VicHJvZ3JhbSBudW1iZXInLEkzLDEyWCxBNikKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBDSEVDSzEoU0ZBQykKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgIChOT1VUPTYpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTRkFDCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgIENBCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBTQQorICAgICAgSU5URUdFUiAgICAgICAgICAgSSwgSiwgTEVOLCBOUDEKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgQ1RSVUU1KDgsNSwyKSwgQ1RSVUU2KDgsNSwyKSwgQ1YoOCw1LDIpLCBDWCg4KSwKKyAgICAgKyAgICAgICAgICAgICAgICAgIE1XUENTKDUpLCBNV1BDVCg1KQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgU1RSVUUyKDUpLCBTVFJVRTQoNSkKKyAgICAgIElOVEVHRVIgICAgICAgICAgIElUUlVFMyg1KQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICBEWkFTVU0sIERaTlJNMgorICAgICAgSU5URUdFUiAgICAgICAgICAgSVpBTUFYCisgICAgICBFWFRFUk5BTCAgICAgICAgICBEWkFTVU0sIERaTlJNMiwgSVpBTUFYCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgWlNDQUwsIFpEU0NBTCwgQ1RFU1QsIElURVNUMSwgU1RFU1QxCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICBNQVgKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgIC9DT01CTEEvSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIFBBU1MKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgU0EsIENBLzAuM0QwLCAoMC40RDAsLTAuN0QwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1YoSSxKLDEpLEk9MSw4KSxKPTEsNSkvKDAuMUQwLDAuMUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBEMCwyLjBEMCksICgxLjBEMCwyLjBEMCksICgxLjBEMCwyLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEQwLDIuMEQwKSwgKDAuM0QwLC0wLjREMCksICgzLjBEMCw0LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMy4wRDAsNC4wRDApLCAoMy4wRDAsNC4wRDApLCAoMy4wRDAsNC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjFEMCwtMC4zRDApLCAoMC41RDAsLTAuMUQwKSwgKDUuMEQwLDYuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg1LjBEMCw2LjBEMCksICg1LjBEMCw2LjBEMCksICg1LjBEMCw2LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNS4wRDAsNi4wRDApLCAoNS4wRDAsNi4wRDApLCAoMC4xRDAsMC4xRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjZEMCwwLjFEMCksICgwLjFEMCwtMC4zRDApLCAoNy4wRDAsOC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDcuMEQwLDguMEQwKSwgKDcuMEQwLDguMEQwKSwgKDcuMEQwLDguMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg3LjBEMCw4LjBEMCksICgwLjNEMCwwLjFEMCksICgwLjFEMCwwLjREMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC40RDAsMC4xRDApLCAoMC4xRDAsMC4yRDApLCAoMi4wRDAsMy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDIuMEQwLDMuMEQwKSwgKDIuMEQwLDMuMEQwKSwgKDIuMEQwLDMuMEQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1YoSSxKLDIpLEk9MSw4KSxKPTEsNSkvKDAuMUQwLDAuMUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRDAsNS4wRDApLCAoNC4wRDAsNS4wRDApLCAoNC4wRDAsNS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEQwLDUuMEQwKSwgKDAuM0QwLC0wLjREMCksICg2LjBEMCw3LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNi4wRDAsNy4wRDApLCAoNi4wRDAsNy4wRDApLCAoNi4wRDAsNy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDYuMEQwLDcuMEQwKSwgKDYuMEQwLDcuMEQwKSwgKDYuMEQwLDcuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjFEMCwtMC4zRDApLCAoOC4wRDAsOS4wRDApLCAoMC41RDAsLTAuMUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBEMCw1LjBEMCksICgyLjBEMCw1LjBEMCksICgyLjBEMCw1LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMi4wRDAsNS4wRDApLCAoMi4wRDAsNS4wRDApLCAoMC4xRDAsMC4xRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEQwLDYuMEQwKSwgKC0wLjZEMCwwLjFEMCksICg0LjBEMCw3LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xRDAsLTAuM0QwKSwgKDcuMEQwLDIuMEQwKSwgKDcuMEQwLDIuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg3LjBEMCwyLjBEMCksICgwLjNEMCwwLjFEMCksICg1LjBEMCw4LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xRDAsMC40RDApLCAoNi4wRDAsOS4wRDApLCAoMC40RDAsMC4xRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDguMEQwLDMuMEQwKSwgKDAuMUQwLDAuMkQwKSwgKDkuMEQwLDQuMEQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIFNUUlVFMi8wLjBEMCwgMC41RDAsIDAuNkQwLCAwLjdEMCwgMC43RDAvCisgICAgICBEQVRBICAgICAgICAgICAgICBTVFJVRTQvMC4wRDAsIDAuN0QwLCAxLjBEMCwgMS4zRDAsIDEuN0QwLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVFJVRTUoSSxKLDEpLEk9MSw4KSxKPTEsNSkvKDAuMUQwLDAuMUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBEMCwyLjBEMCksICgxLjBEMCwyLjBEMCksICgxLjBEMCwyLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEQwLDIuMEQwKSwgKC0wLjE2RDAsLTAuMzdEMCksICgzLjBEMCw0LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMy4wRDAsNC4wRDApLCAoMy4wRDAsNC4wRDApLCAoMy4wRDAsNC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xN0QwLC0wLjE5RDApLCAoMC4xM0QwLC0wLjM5RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDUuMEQwLDYuMEQwKSwgKDUuMEQwLDYuMEQwKSwgKDUuMEQwLDYuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg1LjBEMCw2LjBEMCksICg1LjBEMCw2LjBEMCksICg1LjBEMCw2LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xMUQwLC0wLjAzRDApLCAoLTAuMTdEMCwwLjQ2RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjE3RDAsLTAuMTlEMCksICg3LjBEMCw4LjBEMCksICg3LjBEMCw4LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRDAsOC4wRDApLCAoNy4wRDAsOC4wRDApLCAoNy4wRDAsOC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMTlEMCwtMC4xN0QwKSwgKDAuMzJEMCwwLjA5RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMjNEMCwtMC4yNEQwKSwgKDAuMThEMCwwLjAxRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDIuMEQwLDMuMEQwKSwgKDIuMEQwLDMuMEQwKSwgKDIuMEQwLDMuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBEMCwzLjBEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUUlVFNShJLEosMiksST0xLDgpLEo9MSw1KS8oMC4xRDAsMC4xRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEQwLDUuMEQwKSwgKDQuMEQwLDUuMEQwKSwgKDQuMEQwLDUuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRDAsNS4wRDApLCAoLTAuMTZEMCwtMC4zN0QwKSwgKDYuMEQwLDcuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg2LjBEMCw3LjBEMCksICg2LjBEMCw3LjBEMCksICg2LjBEMCw3LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNi4wRDAsNy4wRDApLCAoNi4wRDAsNy4wRDApLCAoNi4wRDAsNy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjE3RDAsLTAuMTlEMCksICg4LjBEMCw5LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xM0QwLC0wLjM5RDApLCAoMi4wRDAsNS4wRDApLCAoMi4wRDAsNS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDIuMEQwLDUuMEQwKSwgKDIuMEQwLDUuMEQwKSwgKDIuMEQwLDUuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjExRDAsLTAuMDNEMCksICgzLjBEMCw2LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuMTdEMCwwLjQ2RDApLCAoNC4wRDAsNy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjE3RDAsLTAuMTlEMCksICg3LjBEMCwyLjBEMCksICg3LjBEMCwyLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRDAsMi4wRDApLCAoMC4xOUQwLC0wLjE3RDApLCAoNS4wRDAsOC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMzJEMCwwLjA5RDApLCAoNi4wRDAsOS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMjNEMCwtMC4yNEQwKSwgKDguMEQwLDMuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjE4RDAsMC4wMUQwKSwgKDkuMEQwLDQuMEQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgICgoQ1RSVUU2KEksSiwxKSxJPTEsOCksSj0xLDUpLygwLjFEMCwwLjFEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLCAoMS4wRDAsMi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMEQwLDIuMEQwKSwgKDEuMEQwLDIuMEQwKSwgKDEuMEQwLDIuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjBEMCwyLjBEMCksICgwLjA5RDAsLTAuMTJEMCksICgzLjBEMCw0LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMy4wRDAsNC4wRDApLCAoMy4wRDAsNC4wRDApLCAoMy4wRDAsNC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwgKDMuMEQwLDQuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjAzRDAsLTAuMDlEMCksICgwLjE1RDAsLTAuMDNEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNS4wRDAsNi4wRDApLCAoNS4wRDAsNi4wRDApLCAoNS4wRDAsNi4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDUuMEQwLDYuMEQwKSwgKDUuMEQwLDYuMEQwKSwgKDUuMEQwLDYuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjAzRDAsMC4wM0QwKSwgKC0wLjE4RDAsMC4wM0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjAzRDAsLTAuMDlEMCksICg3LjBEMCw4LjBEMCksICg3LjBEMCw4LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNy4wRDAsOC4wRDApLCAoNy4wRDAsOC4wRDApLCAoNy4wRDAsOC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDlEMCwwLjAzRDApLCAoMC4wM0QwLDAuMTJEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4xMkQwLDAuMDNEMCksICgwLjAzRDAsMC4wNkQwKSwgKDIuMEQwLDMuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBEMCwzLjBEMCksICgyLjBEMCwzLjBEMCksICgyLjBEMCwzLjBEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUUlVFNihJLEosMiksST0xLDgpLEo9MSw1KS8oMC4xRDAsMC4xRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDQuMEQwLDUuMEQwKSwgKDQuMEQwLDUuMEQwKSwgKDQuMEQwLDUuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksICg0LjBEMCw1LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoNC4wRDAsNS4wRDApLCAoMC4wOUQwLC0wLjEyRDApLCAoNi4wRDAsNy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDYuMEQwLDcuMEQwKSwgKDYuMEQwLDcuMEQwKSwgKDYuMEQwLDcuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg2LjBEMCw3LjBEMCksICg2LjBEMCw3LjBEMCksICg2LjBEMCw3LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0QwLC0wLjA5RDApLCAoOC4wRDAsOS4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMTVEMCwtMC4wM0QwKSwgKDIuMEQwLDUuMEQwKSwgKDIuMEQwLDUuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgyLjBEMCw1LjBEMCksICgyLjBEMCw1LjBEMCksICgyLjBEMCw1LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0QwLDAuMDNEMCksICgzLjBEMCw2LjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuMThEMCwwLjAzRDApLCAoNC4wRDAsNy4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMDNEMCwtMC4wOUQwKSwgKDcuMEQwLDIuMEQwKSwgKDcuMEQwLDIuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICg3LjBEMCwyLjBEMCksICgwLjA5RDAsMC4wM0QwKSwgKDUuMEQwLDguMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjAzRDAsMC4xMkQwKSwgKDYuMEQwLDkuMEQwKSwgKDAuMTJEMCwwLjAzRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDguMEQwLDMuMEQwKSwgKDAuMDNEMCwwLjA2RDApLCAoOS4wRDAsNC4wRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgSVRSVUUzLzAsIDEsIDIsIDIsIDIvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDYwIElOQ1ggPSAxLCAyCisgICAgICAgICBETyA0MCBOUDEgPSAxLCA1CisgICAgICAgICAgICBOID0gTlAxIC0gMQorICAgICAgICAgICAgTEVOID0gMipNQVgoTiwxKQorKiAgICAgICAgICAgLi4gU2V0IHZlY3RvciBhcmd1bWVudHMgLi4KKyAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMRU4KKyAgICAgICAgICAgICAgIENYKEkpID0gQ1YoSSxOUDEsSU5DWCkKKyAgIDIwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBJRiAoSUNBU0UuRVEuNikgVEhFTgorKiAgICAgICAgICAgICAgLi4gRFpOUk0yIC4uCisgICAgICAgICAgICAgICBDQUxMIFNURVNUMShEWk5STTIoTixDWCxJTkNYKSxTVFJVRTIoTlAxKSxTVFJVRTIoTlAxKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICAgIFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS43KSBUSEVOCisqICAgICAgICAgICAgICAuLiBEWkFTVU0gLi4KKyAgICAgICAgICAgICAgIENBTEwgU1RFU1QxKERaQVNVTShOLENYLElOQ1gpLFNUUlVFNChOUDEpLFNUUlVFNChOUDEpLAorICAgICArICAgICAgICAgICAgICAgICAgICAgU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjgpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFpTQ0FMIC4uCisgICAgICAgICAgICAgICBDQUxMIFpTQ0FMKE4sQ0EsQ1gsSU5DWCkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOLENYLENUUlVFNSgxLE5QMSxJTkNYKSxDVFJVRTUoMSxOUDEsSU5DWCksCisgICAgICsgICAgICAgICAgICAgICAgICAgIFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS45KSBUSEVOCisqICAgICAgICAgICAgICAuLiBaRFNDQUwgLi4KKyAgICAgICAgICAgICAgIENBTEwgWkRTQ0FMKE4sU0EsQ1gsSU5DWCkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOLENYLENUUlVFNigxLE5QMSxJTkNYKSxDVFJVRTYoMSxOUDEsSU5DWCksCisgICAgICsgICAgICAgICAgICAgICAgICAgIFNGQUMpCisgICAgICAgICAgICBFTFNFIElGIChJQ0FTRS5FUS4xMCkgVEhFTgorKiAgICAgICAgICAgICAgLi4gSVpBTUFYIC4uCisgICAgICAgICAgICAgICBDQUxMIElURVNUMShJWkFNQVgoTixDWCxJTkNYKSxJVFJVRTMoTlAxKSkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIFdSSVRFIChOT1VULCopICcgU2hvdWxkbicndCBiZSBoZXJlIGluIENIRUNLMScKKyAgICAgICAgICAgICAgIFNUT1AKKyAgICAgICAgICAgIEVORCBJRgorKgorICAgNDAgICAgQ09OVElOVUUKKyAgIDYwIENPTlRJTlVFCisqCisgICAgICBJTkNYID0gMQorICAgICAgSUYgKElDQVNFLkVRLjgpIFRIRU4KKyogICAgICAgIFpTQ0FMCisqICAgICAgICBBZGQgYSB0ZXN0IGZvciBhbHBoYSBlcXVhbCB0byB6ZXJvLgorICAgICAgICAgQ0EgPSAoMC4wRDAsMC4wRDApCisgICAgICAgICBETyA4MCBJID0gMSwgNQorICAgICAgICAgICAgTVdQQ1QoSSkgPSAoMC4wRDAsMC4wRDApCisgICAgICAgICAgICBNV1BDUyhJKSA9ICgxLjBEMCwxLjBEMCkKKyAgIDgwICAgIENPTlRJTlVFCisgICAgICAgICBDQUxMIFpTQ0FMKDUsQ0EsQ1gsSU5DWCkKKyAgICAgICAgIENBTEwgQ1RFU1QoNSxDWCxNV1BDVCxNV1BDUyxTRkFDKQorICAgICAgRUxTRSBJRiAoSUNBU0UuRVEuOSkgVEhFTgorKiAgICAgICAgWkRTQ0FMCisqICAgICAgICBBZGQgYSB0ZXN0IGZvciBhbHBoYSBlcXVhbCB0byB6ZXJvLgorICAgICAgICAgU0EgPSAwLjBEMAorICAgICAgICAgRE8gMTAwIEkgPSAxLCA1CisgICAgICAgICAgICBNV1BDVChJKSA9ICgwLjBEMCwwLjBEMCkKKyAgICAgICAgICAgIE1XUENTKEkpID0gKDEuMEQwLDEuMEQwKQorICAxMDAgICAgQ09OVElOVUUKKyAgICAgICAgIENBTEwgWkRTQ0FMKDUsU0EsQ1gsSU5DWCkKKyAgICAgICAgIENBTEwgQ1RFU1QoNSxDWCxNV1BDVCxNV1BDUyxTRkFDKQorKiAgICAgICAgQWRkIGEgdGVzdCBmb3IgYWxwaGEgZXF1YWwgdG8gb25lLgorICAgICAgICAgU0EgPSAxLjBEMAorICAgICAgICAgRE8gMTIwIEkgPSAxLCA1CisgICAgICAgICAgICBNV1BDVChJKSA9IENYKEkpCisgICAgICAgICAgICBNV1BDUyhJKSA9IENYKEkpCisgIDEyMCAgICBDT05USU5VRQorICAgICAgICAgQ0FMTCBaRFNDQUwoNSxTQSxDWCxJTkNYKQorICAgICAgICAgQ0FMTCBDVEVTVCg1LENYLE1XUENULE1XUENTLFNGQUMpCisqICAgICAgICBBZGQgYSB0ZXN0IGZvciBhbHBoYSBlcXVhbCB0byBtaW51cyBvbmUuCisgICAgICAgICBTQSA9IC0xLjBEMAorICAgICAgICAgRE8gMTQwIEkgPSAxLCA1CisgICAgICAgICAgICBNV1BDVChJKSA9IC1DWChJKQorICAgICAgICAgICAgTVdQQ1MoSSkgPSAtQ1goSSkKKyAgMTQwICAgIENPTlRJTlVFCisgICAgICAgICBDQUxMIFpEU0NBTCg1LFNBLENYLElOQ1gpCisgICAgICAgICBDQUxMIENURVNUKDUsQ1gsTVdQQ1QsTVdQQ1MsU0ZBQykKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hFQ0syKFNGQUMpCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgU0ZBQworKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElDQVNFLCBJTkNYLCBJTkNZLCBNT0RFLCBOCisgICAgICBMT0dJQ0FMICAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICBDQQorICAgICAgSU5URUdFUiAgICAgICAgICAgSSwgSiwgS0ksIEtOLCBLU0laRSwgTEVOWCwgTEVOWSwgTVgsIE1ZCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgIENET1QoMSksIENTSVpFMSg0KSwgQ1NJWkUyKDcsMiksIENTSVpFMygxNCksCisgICAgICsgICAgICAgICAgICAgICAgICBDVDEwWCg3LDQsNCksIENUMTBZKDcsNCw0KSwgQ1Q2KDQsNCksIENUNyg0LDQpLAorICAgICArICAgICAgICAgICAgICAgICAgQ1Q4KDcsNCw0KSwgQ1goNyksIENYMSg3KSwgQ1koNyksIENZMSg3KQorICAgICAgSU5URUdFUiAgICAgICAgICAgSU5DWFMoNCksIElOQ1lTKDQpLCBMRU5TKDQsMiksIE5TKDQpCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgIFpET1RDLCBaRE9UVQorICAgICAgRVhURVJOQUwgICAgICAgICAgWkRPVEMsIFpET1RVCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgWkFYUFksIFpDT1BZLCBaU1dBUCwgQ1RFU1QKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgIEFCUywgTUlOCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgIENBLygwLjREMCwtMC43RDApLworICAgICAgREFUQSAgICAgICAgICAgICAgSU5DWFMvMSwgMiwgLTIsIC0xLworICAgICAgREFUQSAgICAgICAgICAgICAgSU5DWVMvMSwgLTIsIDEsIC0yLworICAgICAgREFUQSAgICAgICAgICAgICAgTEVOUy8xLCAxLCAyLCA0LCAxLCAxLCAzLCA3LworICAgICAgREFUQSAgICAgICAgICAgICAgTlMvMCwgMSwgMiwgNC8KKyAgICAgIERBVEEgICAgICAgICAgICAgIENYMS8oMC43RDAsLTAuOEQwKSwgKC0wLjREMCwtMC43RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjFEMCwtMC45RDApLCAoMC4yRDAsLTAuOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RDAsLTAuNEQwKSwgKDAuMUQwLDAuNEQwKSwgKC0wLjZEMCwwLjZEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICBDWTEvKDAuNkQwLC0wLjZEMCksICgtMC45RDAsMC41RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0QwLC0wLjZEMCksICgwLjFEMCwtMC41RDApLCAoLTAuMUQwLC0wLjJEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNUQwLC0wLjNEMCksICgwLjhEMCwtMC43RDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDgoSSxKLDEpLEk9MSw3KSxKPTEsNCkvKDAuNkQwLC0wLjZEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjMyRDAsLTEuNDFEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMzJEMCwtMS40MUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMS41NUQwLDAuNUQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zMkQwLC0xLjQxRDApLCAoLTEuNTVEMCwwLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0QwLC0wLjg5RDApLCAoLTAuMzhEMCwtMC45NkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUOChJLEosMiksST0xLDcpLEo9MSw0KS8oMC42RDAsLTAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMzJEMCwtMS40MUQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoLTAuMDdEMCwtMC44OUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RDAsMC41RDApLCAoMC40MkQwLC0xLjQxRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjc4RDAsMC4wNkQwKSwgKC0wLjlEMCwwLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wNkQwLC0wLjEzRDApLCAoMC4xRDAsLTAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC43N0QwLC0wLjQ5RDApLCAoLTAuNUQwLC0wLjNEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC41MkQwLC0xLjUxRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDgoSSxKLDMpLEk9MSw3KSxKPTEsNCkvKDAuNkQwLC0wLjZEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjMyRDAsLTEuNDFEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKC0wLjA3RDAsLTAuODlEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTEuMThEMCwtMC4zMUQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43OEQwLDAuMDZEMCksICgtMS41NEQwLDAuOTdEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wM0QwLC0wLjg5RDApLCAoLTAuMThEMCwtMS4zMUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUOChJLEosNCksST0xLDcpLEo9MSw0KS8oMC42RDAsLTAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMzJEMCwtMS40MUQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4zMkQwLC0xLjQxRDApLCAoLTAuOUQwLDAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjA1RDAsLTAuNkQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjMyRDAsLTEuNDFEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUQwLDAuNUQwKSwgKDAuMDVEMCwtMC42RDApLCAoMC4xRDAsLTAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC43N0QwLC0wLjQ5RDApLCAoLTAuNUQwLC0wLjNEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4zMkQwLC0xLjE2RDApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1Q3LygwLjBEMCwwLjBEMCksICgtMC4wNkQwLC0wLjkwRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNjVEMCwtMC40N0QwKSwgKC0wLjM0RDAsLTEuMjJEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoLTAuMDZEMCwtMC45MEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC41OUQwLC0xLjQ2RDApLCAoLTEuMDREMCwtMC4wNEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgtMC4wNkQwLC0wLjkwRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjgzRDAsMC41OUQwKSwgKDAuMDdEMCwtMC4zN0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgtMC4wNkQwLC0wLjkwRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjc2RDAsLTEuMTVEMCksICgtMS4zM0QwLC0xLjgyRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgQ1Q2LygwLjBEMCwwLjBEMCksICgwLjkwRDAsMC4wNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjkxRDAsLTAuNzdEMCksICgxLjgwRDAsLTAuMTBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC45MEQwLDAuMDZEMCksICgxLjQ1RDAsMC43NEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjIwRDAsMC45MEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuOTBEMCwwLjA2RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjU1RDAsMC4yM0QwKSwgKDAuODNEMCwtMC4zOUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjkwRDAsMC4wNkQwKSwgKDEuMDREMCwwLjc5RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuOTVEMCwxLjIyRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWChJLEosMSksST0xLDcpLEo9MSw0KS8oMC43RDAsLTAuOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkQwLC0wLjZEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuNkQwLC0wLjZEMCksICgtMC45RDAsMC41RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjZEMCwtMC42RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjlEMCwwLjVEMCksICgwLjdEMCwtMC42RDApLCAoMC4xRDAsLTAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUMTBYKEksSiwyKSxJPTEsNyksSj0xLDQpLygwLjdEMCwtMC44RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC42RDAsLTAuNkQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC43RDAsLTAuNkQwKSwgKC0wLjREMCwtMC43RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkQwLC0wLjZEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC44RDAsLTAuN0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC40RDAsLTAuN0QwKSwgKC0wLjFEMCwtMC4yRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMkQwLC0wLjhEMCksICgwLjdEMCwtMC42RDApLCAoMC4xRDAsMC40RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkQwLC0wLjZEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUMTBYKEksSiwzKSxJPTEsNyksSj0xLDQpLygwLjdEMCwtMC44RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC42RDAsLTAuNkQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoLTAuOUQwLDAuNUQwKSwgKC0wLjREMCwtMC43RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkQwLC0wLjZEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4xRDAsLTAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC40RDAsLTAuN0QwKSwgKDAuN0QwLC0wLjZEMCksICgwLjJEMCwtMC44RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjlEMCwwLjVEMCksICgwLjFEMCwwLjREMCksICgwLjZEMCwtMC42RDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWChJLEosNCksST0xLDcpLEo9MSw0KS8oMC43RDAsLTAuOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuNkQwLC0wLjZEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuNkQwLC0wLjZEMCksICgwLjdEMCwtMC42RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjZEMCwtMC42RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0QwLC0wLjZEMCksICgtMC4xRDAsLTAuMkQwKSwgKDAuOEQwLC0wLjdEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWShJLEosMSksST0xLDcpLEo9MSw0KS8oMC42RDAsLTAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0QwLC0wLjhEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuN0QwLC0wLjhEMCksICgtMC40RDAsLTAuN0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC43RDAsLTAuOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC40RDAsLTAuN0QwKSwgKC0wLjFEMCwtMC45RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMkQwLC0wLjhEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLworICAgICAgREFUQSAgICAgICAgICAgICAgKChDVDEwWShJLEosMiksST0xLDcpLEo9MSw0KS8oMC42RDAsLTAuNkQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0QwLC0wLjhEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKC0wLjFEMCwtMC45RDApLCAoLTAuOUQwLDAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjdEMCwtMC44RDApLCAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKC0wLjZEMCwwLjZEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuOUQwLDAuNUQwKSwgKC0wLjlEMCwtMC40RDApLCAoMC4xRDAsLTAuNUQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC4xRDAsLTAuOUQwKSwgKC0wLjVEMCwtMC4zRDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuN0QwLC0wLjhEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUMTBZKEksSiwzKSxJPTEsNyksSj0xLDQpLygwLjZEMCwtMC42RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43RDAsLTAuOEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoLTAuMUQwLC0wLjlEMCksICgwLjdEMCwtMC44RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgtMC42RDAsMC42RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjlEMCwtMC40RDApLCAoLTAuMUQwLC0wLjlEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43RDAsLTAuOEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICAoKENUMTBZKEksSiw0KSxJPTEsNyksSj0xLDQpLygwLjZEMCwtMC42RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC43RDAsLTAuOEQwKSwgKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC43RDAsLTAuOEQwKSwgKC0wLjlEMCwwLjVEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoLTAuNEQwLC0wLjdEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMC43RDAsLTAuOEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgtMC45RDAsMC41RDApLCAoLTAuNEQwLC0wLjdEMCksICgwLjFEMCwtMC41RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKC0wLjFEMCwtMC45RDApLCAoLTAuNUQwLC0wLjNEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4yRDAsLTAuOEQwKS8KKyAgICAgIERBVEEgICAgICAgICAgICAgIENTSVpFMS8oMC4wRDAsMC4wRDApLCAoMC45RDAsMC45RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuNjNEMCwxLjczRDApLCAoMi45MEQwLDIuNzhEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICBDU0laRTMvKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMS4xN0QwLDEuMTdEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS4xN0QwLDEuMTdEMCksICgxLjE3RDAsMS4xN0QwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjE3RDAsMS4xN0QwKSwgKDEuMTdEMCwxLjE3RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuMTdEMCwxLjE3RDApLCAoMS4xN0QwLDEuMTdEMCkvCisgICAgICBEQVRBICAgICAgICAgICAgICBDU0laRTIvKDAuMEQwLDAuMEQwKSwgKDAuMEQwLDAuMEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksICgwLjBEMCwwLjBEMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMC4wRDAsMC4wRDApLCAoMC4wRDAsMC4wRDApLCAoMS41NEQwLDEuNTREMCksCisgICAgICsgICAgICAgICAgICAgICAgICAoMS41NEQwLDEuNTREMCksICgxLjU0RDAsMS41NEQwKSwKKyAgICAgKyAgICAgICAgICAgICAgICAgICgxLjU0RDAsMS41NEQwKSwgKDEuNTREMCwxLjU0RDApLAorICAgICArICAgICAgICAgICAgICAgICAgKDEuNTREMCwxLjU0RDApLCAoMS41NEQwLDEuNTREMCkvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDYwIEtJID0gMSwgNAorICAgICAgICAgSU5DWCA9IElOQ1hTKEtJKQorICAgICAgICAgSU5DWSA9IElOQ1lTKEtJKQorICAgICAgICAgTVggPSBBQlMoSU5DWCkKKyAgICAgICAgIE1ZID0gQUJTKElOQ1kpCisqCisgICAgICAgICBETyA0MCBLTiA9IDEsIDQKKyAgICAgICAgICAgIE4gPSBOUyhLTikKKyAgICAgICAgICAgIEtTSVpFID0gTUlOKDIsS04pCisgICAgICAgICAgICBMRU5YID0gTEVOUyhLTixNWCkKKyAgICAgICAgICAgIExFTlkgPSBMRU5TKEtOLE1ZKQorKiAgICAgICAgICAgLi4gaW5pdGlhbGl6ZSBhbGwgYXJndW1lbnQgYXJyYXlzIC4uCisgICAgICAgICAgICBETyAyMCBJID0gMSwgNworICAgICAgICAgICAgICAgQ1goSSkgPSBDWDEoSSkKKyAgICAgICAgICAgICAgIENZKEkpID0gQ1kxKEkpCisgICAyMCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYgKElDQVNFLkVRLjEpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFpET1RDIC4uCisgICAgICAgICAgICAgICBDRE9UKDEpID0gWkRPVEMoTixDWCxJTkNYLENZLElOQ1kpCisgICAgICAgICAgICAgICBDQUxMIENURVNUKDEsQ0RPVCxDVDYoS04sS0kpLENTSVpFMShLTiksU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjIpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFpET1RVIC4uCisgICAgICAgICAgICAgICBDRE9UKDEpID0gWkRPVFUoTixDWCxJTkNYLENZLElOQ1kpCisgICAgICAgICAgICAgICBDQUxMIENURVNUKDEsQ0RPVCxDVDcoS04sS0kpLENTSVpFMShLTiksU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjMpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFpBWFBZIC4uCisgICAgICAgICAgICAgICBDQUxMIFpBWFBZKE4sQ0EsQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBDVEVTVChMRU5ZLENZLENUOCgxLEtOLEtJKSxDU0laRTIoMSxLU0laRSksU0ZBQykKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjQpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFpDT1BZIC4uCisgICAgICAgICAgICAgICBDQUxMIFpDT1BZKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBDVEVTVChMRU5ZLENZLENUMTBZKDEsS04sS0kpLENTSVpFMywxLjBEMCkKKyAgICAgICAgICAgIEVMU0UgSUYgKElDQVNFLkVRLjUpIFRIRU4KKyogICAgICAgICAgICAgIC4uIFpTV0FQIC4uCisgICAgICAgICAgICAgICBDQUxMIFpTV0FQKE4sQ1gsSU5DWCxDWSxJTkNZKQorICAgICAgICAgICAgICAgQ0FMTCBDVEVTVChMRU5YLENYLENUMTBYKDEsS04sS0kpLENTSVpFMywxLjBEMCkKKyAgICAgICAgICAgICAgIENBTEwgQ1RFU1QoTEVOWSxDWSxDVDEwWSgxLEtOLEtJKSxDU0laRTMsMS4wRDApCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBXUklURSAoTk9VVCwqKSAnIFNob3VsZG4nJ3QgYmUgaGVyZSBpbiBDSEVDSzInCisgICAgICAgICAgICAgICBTVE9QCisgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDQwICAgIENPTlRJTlVFCisgICA2MCBDT05USU5VRQorICAgICAgUkVUVVJOCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU1RFU1QoTEVOLFNDT01QLFNUUlVFLFNTSVpFLFNGQUMpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU1RFU1QgKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgIFRISVMgU1VCUiBDT01QQVJFUyBBUlJBWVMgIFNDT01QKCkgQU5EIFNUUlVFKCkgT0YgTEVOR1RIIExFTiBUTworKiAgICAgU0VFIElGIFRIRSBURVJNIEJZIFRFUk0gRElGRkVSRU5DRVMsIE1VTFRJUExJRUQgQlkgU0ZBQywgQVJFCisqICAgICBORUdMSUdJQkxFLgorKgorKiAgICAgQy4gTC4gTEFXU09OLCBKUEwsIDE5NzQgREVDIDEwCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgIE5PVVQKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgKE5PVVQ9NikKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gU0ZBQworICAgICAgSU5URUdFUiAgICAgICAgICBMRU4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTQ09NUChMRU4pLCBTU0laRShMRU4pLCBTVFJVRShMRU4pCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICBJQ0FTRSwgSU5DWCwgSU5DWSwgTU9ERSwgTgorICAgICAgTE9HSUNBTCAgICAgICAgICBQQVNTCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNECisgICAgICBJTlRFR0VSICAgICAgICAgIEkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTRElGRgorICAgICAgRVhURVJOQUwgICAgICAgICBTRElGRgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICBBQlMKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgL0NPTUJMQS9JQ0FTRSwgTiwgSU5DWCwgSU5DWSwgTU9ERSwgUEFTUworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisqCisgICAgICBETyA0MCBJID0gMSwgTEVOCisgICAgICAgICBTRCA9IFNDT01QKEkpIC0gU1RSVUUoSSkKKyAgICAgICAgIElGIChTRElGRihBQlMoU1NJWkUoSSkpK0FCUyhTRkFDKlNEKSxBQlMoU1NJWkUoSSkpKS5FUS4wLjBEMCkKKyAgICAgKyAgICAgICBHTyBUTyA0MAorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVSRSAgICBTQ09NUChJKSBJUyBOT1QgQ0xPU0UgVE8gU1RSVUUoSSkuCisqCisgICAgICAgICBJRiAoIC5OT1QuIFBBU1MpIEdPIFRPIDIwCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVCBGQUlMIE1FU1NBR0UgQU5EIEhFQURFUi4KKyAgICAgICAgIFBBU1MgPSAuRkFMU0UuCisgICAgICAgICBXUklURSAoTk9VVCw5OTk5OSkKKyAgICAgICAgIFdSSVRFIChOT1VULDk5OTk4KQorICAgMjAgICAgV1JJVEUgKE5PVVQsOTk5OTcpIElDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBJLCBTQ09NUChJKSwKKyAgICAgKyAgICAgU1RSVUUoSSksIFNELCBTU0laRShJKQorICAgNDAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorOTk5OTkgRk9STUFUICgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCcpCis5OTk5OCBGT1JNQVQgKC8nIENBU0UgIE4gSU5DWCBJTkNZIE1PREUgIEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywKKyAgICAgKyAgICAgICAnIENPTVAoSSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUoSSkgIERJRkZFUkVOQ0UnLAorICAgICArICAgICAgICcgICAgIFNJWkUoSSknLC8xWCkKKzk5OTk3IEZPUk1BVCAoMVgsSTQsSTMsM0k1LEkzLDJEMzYuOCwyRDEyLjQpCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgU1RFU1QxKFNDT01QMSxTVFJVRTEsU1NJWkUsU0ZBQykKKyogICAgICoqKioqKioqKioqKioqKioqKioqKioqKiogU1RFU1QxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICBUSElTIElTIEFOIElOVEVSRkFDRSBTVUJST1VUSU5FIFRPIEFDQ09NT0RBVEUgVEhFIEZPUlRSQU4KKyogICAgIFJFUVVJUkVNRU5UIFRIQVQgV0hFTiBBIERVTU1ZIEFSR1VNRU5UIElTIEFOIEFSUkFZLCBUSEUKKyogICAgIEFDVFVBTCBBUkdVTUVOVCBNVVNUIEFMU08gQkUgQU4gQVJSQVkgT1IgQU4gQVJSQVkgRUxFTUVOVC4KKyoKKyogICAgIEMuTC4gTEFXU09OLCBKUEwsIDE5NzggREVDIDYKKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNDT01QMSwgU0ZBQywgU1RSVUUxCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNTSVpFKCopCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gIFNDT01QKDEpLCBTVFJVRSgxKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgIFNURVNUCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyAgICAgIFNDT01QKDEpID0gU0NPTVAxCisgICAgICBTVFJVRSgxKSA9IFNUUlVFMQorICAgICAgQ0FMTCBTVEVTVCgxLFNDT01QLFNUUlVFLFNTSVpFLFNGQUMpCisqCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBTRElGRihTQSxTQikKKyogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTRElGRiAqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgQ09NUFVURVMgRElGRkVSRU5DRSBPRiBUV08gTlVNQkVSUy4gIEMuIEwuIExBV1NPTiwgSlBMIDE5NzQgRkVCIDE1CisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgICAgICAgICAgICAgIFNBLCBTQgorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBTRElGRiA9IFNBIC0gU0IKKyAgICAgIFJFVFVSTgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENURVNUKExFTixDQ09NUCxDVFJVRSxDU0laRSxTRkFDKQorKiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDVEVTVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgQy5MLiBMQVdTT04sIEpQTCwgMTk3OCBERUMgNgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTRkFDCisgICAgICBJTlRFR0VSICAgICAgICAgIExFTgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgIENDT01QKExFTiksIENTSVpFKExFTiksIENUUlVFKExFTikKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgSQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNDT01QKDIwKSwgU1NJWkUoMjApLCBTVFJVRSgyMCkKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgIFNURVNUCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgIERJTUFHLCBEQkxFCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDIwIEkgPSAxLCBMRU4KKyAgICAgICAgIFNDT01QKDIqSS0xKSA9IERCTEUoQ0NPTVAoSSkpCisgICAgICAgICBTQ09NUCgyKkkpID0gRElNQUcoQ0NPTVAoSSkpCisgICAgICAgICBTVFJVRSgyKkktMSkgPSBEQkxFKENUUlVFKEkpKQorICAgICAgICAgU1RSVUUoMipJKSA9IERJTUFHKENUUlVFKEkpKQorICAgICAgICAgU1NJWkUoMipJLTEpID0gREJMRShDU0laRShJKSkKKyAgICAgICAgIFNTSVpFKDIqSSkgPSBESU1BRyhDU0laRShJKSkKKyAgIDIwIENPTlRJTlVFCisqCisgICAgICBDQUxMIFNURVNUKDIqTEVOLFNDT01QLFNUUlVFLFNTSVpFLFNGQUMpCisgICAgICBSRVRVUk4KKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBJVEVTVDEoSUNPTVAsSVRSVUUpCisqICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSVRFU1QxICoqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgIFRISVMgU1VCUk9VVElORSBDT01QQVJFUyBUSEUgVkFSSUFCTEVTIElDT01QIEFORCBJVFJVRSBGT1IKKyogICAgIEVRVUFMSVRZLgorKiAgICAgQy4gTC4gTEFXU09OLCBKUEwsIDE5NzQgREVDIDEwCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICBOT1VUCisgICAgICBQQVJBTUVURVIgICAgICAgICAoTk9VVD02KQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNPTVAsIElUUlVFCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgSUNBU0UsIElOQ1gsIElOQ1ksIE1PREUsIE4KKyAgICAgIExPR0lDQUwgICAgICAgICAgIFBBU1MKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgIElECisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAvQ09NQkxBL0lDQVNFLCBOLCBJTkNYLCBJTkNZLCBNT0RFLCBQQVNTCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGIChJQ09NUC5FUS5JVFJVRSkgR08gVE8gNDAKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVSRSBJQ09NUCBJUyBOT1QgRVFVQUwgVE8gSVRSVUUuCisqCisgICAgICBJRiAoIC5OT1QuIFBBU1MpIEdPIFRPIDIwCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVCBGQUlMIE1FU1NBR0UgQU5EIEhFQURFUi4KKyAgICAgIFBBU1MgPSAuRkFMU0UuCisgICAgICBXUklURSAoTk9VVCw5OTk5OSkKKyAgICAgIFdSSVRFIChOT1VULDk5OTk4KQorICAgMjAgSUQgPSBJQ09NUCAtIElUUlVFCisgICAgICBXUklURSAoTk9VVCw5OTk5NykgSUNBU0UsIE4sIElOQ1gsIElOQ1ksIE1PREUsIElDT01QLCBJVFJVRSwgSUQKKyAgIDQwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKzk5OTk5IEZPUk1BVCAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwnKQorOTk5OTggRk9STUFUICgvJyBDQVNFICBOIElOQ1ggSU5DWSBNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICsgICAgICAgJyBDT01QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICAgICBESUZGRVJFTkNFJywKKyAgICAgKyAgICAgICAvMVgpCis5OTk5NyBGT1JNQVQgKDFYLEk0LEkzLDNJNSwySTM2LEkxMikKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL3pibGF0Mi5kYXQgYi9ibGFzL3Rlc3RpbmcvemJsYXQyLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTIyNDQwCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL3pibGF0Mi5kYXQKQEAgLTAsMCArMSwzNSBAQAorJ3pibGF0Mi5zdW1tJyAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCis2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKydjYmxhMnQuc25hcCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKy0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorVCAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCiswIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBLCiswIDEgMiA0ICAgICAgICAgICBWQUxVRVMgT0YgSworNCAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisxIDIgLTEgLTIgICAgICAgICBWQUxVRVMgT0YgSU5DWCBBTkQgSU5DWQorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorKDAuMCwwLjApICgxLjAsMC4wKSAoMC43LC0wLjkpICAgICAgIFZBTFVFUyBPRiBBTFBIQQorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCisoMC4wLDAuMCkgKDEuMCwwLjApICgxLjMsLTEuMSkgICAgICAgVkFMVUVTIE9GIEJFVEEKK1pHRU1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaR0JNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWkhFTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pIQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaSFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWlRSTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pUQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaVFBNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWlRSU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pUQlNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaVFBTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWkdFUkMgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pHRVJVICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaSEVSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWkhQUiAgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pIRVIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaSFBSMiAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL3pibGF0Mi5mIGIvYmxhcy90ZXN0aW5nL3pibGF0Mi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWNkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3Rlc3RpbmcvemJsYXQyLmYKQEAgLTAsMCArMSwzMjQ5IEBACisgICAgICBQUk9HUkFNIFpCTEFUMgorKgorKiAgVGVzdCBwcm9ncmFtIGZvciB0aGUgQ09NUExFWCoxNiAgICAgICBMZXZlbCAyIEJsYXMuCisqCisqICBUaGUgcHJvZ3JhbSBtdXN0IGJlIGRyaXZlbiBieSBhIHNob3J0IGRhdGEgZmlsZS4gVGhlIGZpcnN0IDE4IHJlY29yZHMKKyogIG9mIHRoZSBmaWxlIGFyZSByZWFkIHVzaW5nIGxpc3QtZGlyZWN0ZWQgaW5wdXQsIHRoZSBsYXN0IDE3IHJlY29yZHMKKyogIGFyZSByZWFkIHVzaW5nIHRoZSBmb3JtYXQgKCBBNiwgTDIgKS4gQW4gYW5ub3RhdGVkIGV4YW1wbGUgb2YgYSBkYXRhCisqICBmaWxlIGNhbiBiZSBvYnRhaW5lZCBieSBkZWxldGluZyB0aGUgZmlyc3QgMyBjaGFyYWN0ZXJzIGZyb20gdGhlCisqICBmb2xsb3dpbmcgMzUgbGluZXM6CisqICAnWkJMQVQyLlNVTU0nICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKyogIDYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorKiAgJ0NCTEEyVC5TTkFQJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorKiAgLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorKiAgRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorKiAgRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCisqICBUICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKyogIDE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCisqICA2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKyogIDAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCisqICA0ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEsKKyogIDAgMSAyIDQgICAgICAgICAgIFZBTFVFUyBPRiBLCisqICA0ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIElOQ1ggQU5EIElOQ1kKKyogIDEgMiAtMSAtMiAgICAgICAgIFZBTFVFUyBPRiBJTkNYIEFORCBJTkNZCisqICAzICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCisqICAoMC4wLDAuMCkgKDEuMCwwLjApICgwLjcsLTAuOSkgICAgICAgVkFMVUVTIE9GIEFMUEhBCisqICAzICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKyogICgwLjAsMC4wKSAoMS4wLDAuMCkgKDEuMywtMS4xKSAgICAgICBWQUxVRVMgT0YgQkVUQQorKiAgWkdFTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFpHQk1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBaSEVNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgWkhCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFpIUE1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBaVFJNViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgWlRCTVYgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFpUUE1WICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBaVFJTViAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgWlRCU1YgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFpUUFNWICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBaR0VSQyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgWkdFUlUgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFpIRVIgICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBaSFBSICAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgWkhFUjIgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFpIUFIyICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqCisqICAgICBTZWU6CisqCisqICAgICAgICBEb25nYXJyYSBKLiBKLiwgRHUgQ3JveiBKLiBKLiwgSGFtbWFybGluZyBTLiAgYW5kIEhhbnNvbiBSLiBKLi4KKyogICAgICAgIEFuICBleHRlbmRlZCAgc2V0IG9mIEZvcnRyYW4gIEJhc2ljIExpbmVhciBBbGdlYnJhIFN1YnByb2dyYW1zLgorKgorKiAgICAgICAgVGVjaG5pY2FsICBNZW1vcmFuZGEgIE5vcy4gNDEgKHJldmlzaW9uIDMpIGFuZCA4MSwgIE1hdGhlbWF0aWNzCisqICAgICAgICBhbmQgIENvbXB1dGVyIFNjaWVuY2UgIERpdmlzaW9uLCAgQXJnb25uZSAgTmF0aW9uYWwgTGFib3JhdG9yeSwKKyogICAgICAgIDk3MDAgU291dGggQ2FzcyBBdmVudWUsIEFyZ29ubmUsIElsbGlub2lzIDYwNDM5LCBVUy4KKyoKKyogICAgICAgIE9yCisqCisqICAgICAgICBOQUcgIFRlY2huaWNhbCBSZXBvcnRzIFRSMy84NyBhbmQgVFI0Lzg3LCAgTnVtZXJpY2FsIEFsZ29yaXRobXMKKyogICAgICAgIEdyb3VwICBMdGQuLCAgTkFHICBDZW50cmFsICBPZmZpY2UsICAyNTYgIEJhbmJ1cnkgIFJvYWQsIE94Zm9yZAorKiAgICAgICAgT1gyIDdERSwgVUssICBhbmQgIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEluYy4sICAxMTAxICAzMXN0CisqICAgICAgICBTdHJlZXQsICBTdWl0ZSAxMDAsICBEb3duZXJzIEdyb3ZlLCAgSWxsaW5vaXMgNjA1MTUtMTI2MywgIFVTQS4KKyoKKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5JTgorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOID0gNSApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTlNVQlMKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5TVUJTID0gMTcgKQorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8sIFJIQUxGLCBST05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwLCBSSEFMRiA9IDAuNUQwLCBST05FID0gMS4wRDAgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5NQVgsIElOQ01BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTk1BWCA9IDY1LCBJTkNNQVggPSAyICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU5NQVgsIE5JRE1BWCwgTktCTUFYLCBOQUxNQVgsIE5CRU1BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklOTUFYID0gNywgTklETUFYID0gOSwgTktCTUFYID0gNywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQUxNQVggPSA3LCBOQkVNQVggPSA3ICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIEVSUiwgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSVNOVU0sIEosIE4sIE5BTEYsIE5CRVQsIE5JRElNLCBOSU5DLCBOS0IsCisgICAgICQgICAgICAgICAgICAgICAgICAgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBMVEVTVFQsIFJFV0ksIFNBTUUsIFNGQVRBTCwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICAgVFNURVJSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVQKKyAgICAgIENIQVJBQ1RFUiozMiAgICAgICBTTkFQUywgU1VNTVJZCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBTEYoIE5BTE1BWCApLCBBUyggTk1BWCpOTUFYICksIEJFVCggTkJFTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCAyKk5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRE1BWCApLCBJTkMoIE5JTk1BWCApLCBLQiggTktCTUFYICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMVEVTVCggTlNVQlMgKQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FUyggTlNVQlMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRERJRkYKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMWkUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBERElGRiwgTFpFCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFpDSEsxLCBaQ0hLMiwgWkNISzMsIFpDSEs0LCBaQ0hLNSwgWkNISzYsCisgICAgICQgICAgICAgICAgICAgICAgICAgWkNIS0UsIFpNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIFNOQU1FUy8nWkdFTVYgJywgJ1pHQk1WICcsICdaSEVNViAnLCAnWkhCTVYgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnWkhQTVYgJywgJ1pUUk1WICcsICdaVEJNViAnLCAnWlRQTVYgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnWlRSU1YgJywgJ1pUQlNWICcsICdaVFBTViAnLCAnWkdFUkMgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnWkdFUlUgJywgJ1pIRVIgICcsICdaSFBSICAnLCAnWkhFUjIgJywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAnWkhQUjIgJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc3VtbWFyeSBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTVU1NUlkKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTk9VVAorICAgICAgT1BFTiggTk9VVCwgRklMRSA9IFNVTU1SWSwgU1RBVFVTID0gJ05FVycgKQorICAgICAgTk9VVEMgPSBOT1VUCisqCisqICAgICBSZWFkIG5hbWUgYW5kIHVuaXQgbnVtYmVyIGZvciBzbmFwc2hvdCBvdXRwdXQgZmlsZSBhbmQgb3BlbiBmaWxlLgorKgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTTkFQUworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOVFJBCisgICAgICBUUkFDRSA9IE5UUkEuR0UuMAorICAgICAgSUYoIFRSQUNFIClUSEVOCisgICAgICAgICBPUEVOKCBOVFJBLCBGSUxFID0gU05BUFMsIFNUQVRVUyA9ICdORVcnICkKKyAgICAgIEVORCBJRgorKiAgICAgUmVhZCB0aGUgZmxhZyB0aGF0IGRpcmVjdHMgcmV3aW5kaW5nIG9mIHRoZSBzbmFwc2hvdCBmaWxlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClSRVdJCisgICAgICBSRVdJID0gUkVXSS5BTkQuVFJBQ0UKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHN0b3BwaW5nIG9uIGFueSBmYWlsdXJlLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClTRkFUQUwKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBlcnJvciBleGl0cyBhcmUgdG8gYmUgdGVzdGVkLgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUU1RFUlIKKyogICAgIFJlYWQgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiB0aGUgdGVzdCByYXRpbworICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClUSFJFU0gKKyoKKyogICAgIFJlYWQgYW5kIGNoZWNrIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgdGVzdHMuCisqCisqICAgICBWYWx1ZXMgb2YgTgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqIClOSURJTQorICAgICAgSUYoIE5JRElNLkxULjEuT1IuTklESU0uR1QuTklETUFYIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApJ04nLCBOSURNQVgKKyAgICAgICAgIEdPIFRPIDIzMAorICAgICAgRU5EIElGCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKSggSURJTSggSSApLCBJID0gMSwgTklESU0gKQorICAgICAgRE8gMTAgSSA9IDEsIE5JRElNCisgICAgICAgICBJRiggSURJTSggSSApLkxULjAuT1IuSURJTSggSSApLkdULk5NQVggKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClOTUFYCisgICAgICAgICAgICBHTyBUTyAyMzAKKyAgICAgICAgIEVORCBJRgorICAgMTAgQ09OVElOVUUKKyogICAgIFZhbHVlcyBvZiBLCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5LQgorICAgICAgSUYoIE5LQi5MVC4xLk9SLk5LQi5HVC5OS0JNQVggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3ICknSycsIE5LQk1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIERPIDIwIEkgPSAxLCBOS0IKKyAgICAgICAgIElGKCBLQiggSSApLkxULjAgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1ICkKKyAgICAgICAgICAgIEdPIFRPIDIzMAorICAgICAgICAgRU5EIElGCisgICAyMCBDT05USU5VRQorKiAgICAgVmFsdWVzIG9mIElOQ1ggYW5kIElOQ1kKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklOQworICAgICAgSUYoIE5JTkMuTFQuMS5PUi5OSU5DLkdULk5JTk1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdJTkNYIEFORCBJTkNZJywgTklOTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBETyAzMCBJID0gMSwgTklOQworICAgICAgICAgSUYoIElOQyggSSApLkVRLjAuT1IuQUJTKCBJTkMoIEkgKSApLkdULklOQ01BWCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKUlOQ01BWAorICAgICAgICAgICAgR08gVE8gMjMwCisgICAgICAgICBFTkQgSUYKKyAgIDMwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjMwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMzAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MSApKCBLQiggSSApLCBJID0gMSwgTktCICkKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwICkoIElOQyggSSApLCBJID0gMSwgTklOQyApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODggKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODAgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyA0MCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICA0MCBDT05USU5VRQorICAgNTAgUkVBRCggTklOLCBGTVQgPSA5OTg0LCBFTkQgPSA4MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDYwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA3MAorICAgNjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg2IClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDcwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDUwCisqCisgICA4MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBST05FCisgICA5MCBDT05USU5VRQorICAgICAgSUYoIERESUZGKCBST05FICsgRVBTLCBST05FICkuRVEuUlpFUk8gKQorICAgICAkICAgR08gVE8gMTAwCisgICAgICBFUFMgPSBSSEFMRipFUFMKKyAgICAgIEdPIFRPIDkwCisgIDEwMCBDT05USU5VRQorICAgICAgRVBTID0gRVBTICsgRVBTCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApRVBTCisqCisqICAgICBDaGVjayB0aGUgcmVsaWFiaWxpdHkgb2YgWk1WQ0ggdXNpbmcgZXhhY3QgZGF0YS4KKyoKKyAgICAgIE4gPSBNSU4oIDMyLCBOTUFYICkKKyAgICAgIERPIDEyMCBKID0gMSwgTgorICAgICAgICAgRE8gMTEwIEkgPSAxLCBOCisgICAgICAgICAgICBBKCBJLCBKICkgPSBNQVgoIEkgLSBKICsgMSwgMCApCisgIDExMCAgICBDT05USU5VRQorICAgICAgICAgWCggSiApID0gSgorICAgICAgICAgWSggSiApID0gWkVSTworICAxMjAgQ09OVElOVUUKKyAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgWVkoIEogKSA9IEoqKCAoIEogKyAxICkqSiApLzIgLSAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTMwIENPTlRJTlVFCisqICAgICBZWSBob2xkcyB0aGUgZXhhY3QgcmVzdWx0LiBPbiBleGl0IGZyb20gWk1WQ0ggWVQgaG9sZHMKKyogICAgIHRoZSByZXN1bHQgY29tcHV0ZWQgYnkgWk1WQ0guCisgICAgICBUUkFOUyA9ICdOJworICAgICAgQ0FMTCBaTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwgMSwgWkVSTywgWSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICBZWSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExaRSggWVksIFlULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlJaRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NSApVFJBTlMsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBUUkFOUyA9ICdUJworICAgICAgQ0FMTCBaTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWCwgLTEsIFpFUk8sIFksIC0xLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgIFlZLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTFpFKCBZWSwgWVQsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuUlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg1IClUUkFOUywgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyoKKyogICAgIFRlc3QgZWFjaCBzdWJyb3V0aW5lIGluIHR1cm4uCisqCisgICAgICBETyAyMTAgSVNOVU0gPSAxLCBOU1VCUworICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgSUYoIC5OT1QuTFRFU1QoIElTTlVNICkgKVRIRU4KKyogICAgICAgICAgIFN1YnByb2dyYW0gaXMgbm90IHRvIGJlIHRlc3RlZC4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTgzIClTTkFNRVMoIElTTlVNICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFNSTkFNVCA9IFNOQU1FUyggSVNOVU0gKQorKiAgICAgICAgICAgVGVzdCBlcnJvciBleGl0cy4KKyAgICAgICAgICAgIElGKCBUU1RFUlIgKVRIRU4KKyAgICAgICAgICAgICAgIENBTEwgWkNIS0UoIElTTlVNLCBTTkFNRVMoIElTTlVNICksIE5PVVQgKQorICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBUZXN0IGNvbXB1dGF0aW9ucy4KKyAgICAgICAgICAgIElORk9UID0gMAorICAgICAgICAgICAgT0sgPSAuVFJVRS4KKyAgICAgICAgICAgIEZBVEFMID0gLkZBTFNFLgorICAgICAgICAgICAgR08gVE8gKCAxNDAsIDE0MCwgMTUwLCAxNTAsIDE1MCwgMTYwLCAxNjAsCisgICAgICQgICAgICAgICAgICAgIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTcwLCAxNzAsIDE4MCwKKyAgICAgJCAgICAgICAgICAgICAgMTgwLCAxOTAsIDE5MCApSVNOVU0KKyogICAgICAgICAgIFRlc3QgWkdFTVYsIDAxLCBhbmQgWkdCTVYsIDAyLgorICAxNDAgICAgICAgQ0FMTCBaQ0hLMSggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIE5CRVQsIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRyApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgWkhFTVYsIDAzLCBaSEJNViwgMDQsIGFuZCBaSFBNViwgMDUuCisgIDE1MCAgICAgICBDQUxMIFpDSEsyKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLAorICAgICAkICAgICAgICAgICAgICAgICAgTkJFVCwgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLAorICAgICAkICAgICAgICAgICAgICAgICAgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyAgICAgICAgICAgIEdPIFRPIDIwMAorKiAgICAgICAgICAgVGVzdCBaVFJNViwgMDYsIFpUQk1WLCAwNywgWlRQTVYsIDA4LAorKiAgICAgICAgICAgWlRSU1YsIDA5LCBaVEJTViwgMTAsIGFuZCBaVFBTViwgMTEuCisgIDE2MCAgICAgICBDQUxMIFpDSEszKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFksIFlZLCBZUywgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IFpHRVJDLCAxMiwgWkdFUlUsIDEzLgorICAxNzAgICAgICAgQ0FMTCBaQ0hLNCggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorICAgICAgICAgICAgR08gVE8gMjAwCisqICAgICAgICAgICBUZXN0IFpIRVIsIDE0LCBhbmQgWkhQUiwgMTUuCisgIDE4MCAgICAgICBDQUxMIFpDSEs1KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsCisgICAgICQgICAgICAgICAgICAgICAgICBZVCwgRywgWiApCisgICAgICAgICAgICBHTyBUTyAyMDAKKyogICAgICAgICAgIFRlc3QgWkhFUjIsIDE2LCBhbmQgWkhQUjIsIDE3LgorICAxOTAgICAgICAgQ0FMTCBaQ0hLNiggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLAorICAgICAkICAgICAgICAgICAgICAgICAgWVQsIEcsIFogKQorKgorICAyMDAgICAgICAgSUYoIEZBVEFMLkFORC5TRkFUQUwgKQorICAgICAkICAgICAgICAgR08gVE8gMjIwCisgICAgICAgICBFTkQgSUYKKyAgMjEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MiApCisgICAgICBHTyBUTyAyNDAKKyoKKyAgMjIwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4MSApCisgICAgICBHTyBUTyAyNDAKKyoKKyAgMjMwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4NyApCisqCisgIDI0MCBDT05USU5VRQorICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgIENMT1NFICggTlRSQSApCisgICAgICBDTE9TRSAoIE5PVVQgKQorICAgICAgU1RPUAorKgorIDk5OTkgRk9STUFUKCAnIFJPVVRJTkVTIFBBU1MgQ09NUFVUQVRJT05BTCBURVNUUyBJRiBURVNUIFJBVElPIElTIExFUycsCisgICAgICQgICAgICAnUyBUSEFOJywgRjguMiApCisgOTk5OCBGT1JNQVQoICcgUkVMQVRJVkUgTUFDSElORSBQUkVDSVNJT04gSVMgVEFLRU4gVE8gQkUnLCAxUCwgRDkuMSApCisgOTk5NyBGT1JNQVQoICcgTlVNQkVSIE9GIFZBTFVFUyBPRiAnLCBBLCAnIElTIExFU1MgVEhBTiAxIE9SIEdSRUFURVIgJywKKyAgICAgJCAgICAgICdUSEFOICcsIEkyICkKKyA5OTk2IEZPUk1BVCggJyBWQUxVRSBPRiBOIElTIExFU1MgVEhBTiAwIE9SIEdSRUFURVIgVEhBTiAnLCBJMiApCisgOTk5NSBGT1JNQVQoICcgVkFMVUUgT0YgSyBJUyBMRVNTIFRIQU4gMCcgKQorIDk5OTQgRk9STUFUKCAnIEFCU09MVVRFIFZBTFVFIE9GIElOQ1ggT1IgSU5DWSBJUyAwIE9SIEdSRUFURVIgVEhBTiAnLAorICAgICAkICAgICAgSTIgKQorIDk5OTMgRk9STUFUKCAnIFRFU1RTIE9GIFRIRSBDT01QTEVYKjE2ICAgICAgIExFVkVMIDIgQkxBUycsIC8vJyBUSEUgRicsCisgICAgICQgICAgICAnT0xMT1dJTkcgUEFSQU1FVEVSIFZBTFVFUyBXSUxMIEJFIFVTRUQ6JyApCisgOTk5MiBGT1JNQVQoICcgICBGT1IgTiAgICAgICAgICAgICAgJywgOUk2ICkKKyA5OTkxIEZPUk1BVCggJyAgIEZPUiBLICAgICAgICAgICAgICAnLCA3STYgKQorIDk5OTAgRk9STUFUKCAnICAgRk9SIElOQ1ggQU5EIElOQ1kgICcsIDdJNiApCisgOTk4OSBGT1JNQVQoICcgICBGT1IgQUxQSEEgICAgICAgICAgJywKKyAgICAgJCAgICAgIDcoICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSAgJywgOiApICkKKyA5OTg4IEZPUk1BVCggJyAgIEZPUiBCRVRBICAgICAgICAgICAnLAorICAgICAkICAgICAgNyggJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpICAnLCA6ICkgKQorIDk5ODcgRk9STUFUKCAnIEFNRU5EIERBVEEgRklMRSBPUiBJTkNSRUFTRSBBUlJBWSBTSVpFUyBJTiBQUk9HUkFNJywKKyAgICAgJCAgICAgIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg2IEZPUk1BVCggJyBTVUJQUk9HUkFNIE5BTUUgJywgQTYsICcgTk9UIFJFQ09HTklaRUQnLCAvJyAqKioqKioqIFQnLAorICAgICAkICAgICAgJ0VTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg1IEZPUk1BVCggJyBFUlJPUiBJTiBaTVZDSCAtICBJTi1MSU5FIERPVCBQUk9EVUNUUyBBUkUgQkVJTkcgRVZBTFUnLAorICAgICAkICAgICAgJ0FURUQgV1JPTkdMWS4nLCAvJyBaTVZDSCBXQVMgQ0FMTEVEIFdJVEggVFJBTlMgPSAnLCBBMSwKKyAgICAgJCAgICAgICcgQU5EIFJFVFVSTkVEIFNBTUUgPSAnLCBMMSwgJyBBTkQgRVJSID0gJywgRjEyLjMsICcuJywgLworICAgICAkICAgJyBUSElTIE1BWSBCRSBEVUUgVE8gRkFVTFRTIElOIFRIRSBBUklUSE1FVElDIE9SIFRIRSBDT01QSUxFUi4nCisgICAgICQgICAgICAsIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg0IEZPUk1BVCggQTYsIEwyICkKKyA5OTgzIEZPUk1BVCggMVgsIEE2LCAnIFdBUyBOT1QgVEVTVEVEJyApCisgOTk4MiBGT1JNQVQoIC8nIEVORCBPRiBURVNUUycgKQorIDk5ODEgRk9STUFUKCAvJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTgwIEZPUk1BVCggJyBFUlJPUi1FWElUUyBXSUxMIE5PVCBCRSBURVNURUQnICkKKyoKKyogICAgIEVuZCBvZiBaQkxBVDIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWkNISzEoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5BTEYsIEFMRiwgTkJFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVCwgTklOQywgSU5DLCBOTUFYLCBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICBYUywgWSwgWVksIFlTLCBZVCwgRyApCisqCisqICBUZXN0cyBaR0VNViBhbmQgWkdCTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjBEMCwgMC4wRDAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBIQUxGID0gKCAwLjVEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOQkVULCBOSURJTSwgTklOQywgTktCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIFRSQU5TTAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQywgSUtVLCBJTSwgSU4sIElOQ1gsIElOQ1hTLCBJTkNZLAorICAgICAkICAgICAgICAgICAgICAgICAgIElOQ1lTLCBJWCwgSVksIEtMLCBLTFMsIEtVLCBLVVMsIExBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQVMsIExYLCBMWSwgTSwgTUwsIE1TLCBOLCBOQVJHUywgTkMsIE5ELCBOSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOTCwgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBCQU5ERUQsIEZVTEwsIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMsIFRSQU5TUworICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkdCTVYsIFpHRU1WLCBaTUFLRSwgWk1WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWCwgTUlOCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nTlRDJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ0UnCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTEKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSAxMworICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTIwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisgICAgICAgICBORCA9IE4vMiArIDEKKyoKKyAgICAgICAgIERPIDExMCBJTSA9IDEsIDIKKyAgICAgICAgICAgIElGKCBJTS5FUS4xICkKKyAgICAgJCAgICAgICAgIE0gPSBNQVgoIE4gLSBORCwgMCApCisgICAgICAgICAgICBJRiggSU0uRVEuMiApCisgICAgICQgICAgICAgICBNID0gTUlOKCBOICsgTkQsIE5NQVggKQorKgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTksgPSBOS0IKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIE5LID0gMQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxMDAgSUtVID0gMSwgTksKKyAgICAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIEtVID0gS0IoIElLVSApCisgICAgICAgICAgICAgICAgICBLTCA9IE1BWCggS1UgLSAxLCAwICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEtVID0gTiAtIDEKKyAgICAgICAgICAgICAgICAgIEtMID0gTSAtIDEKKyAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICBMREEgPSBLTCArIEtVICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTERBID0gTQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgWk1BS0UoIFNOQU1FKCAyOiAzICksICcgJywgJyAnLCBNLCBOLCBBLCBOTUFYLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIExEQSwgS0wsIEtVLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgIERPIDkwIElDID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICAgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnLk9SLlRSQU5TLkVRLidDJworKgorICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIE1MID0gTgorICAgICAgICAgICAgICAgICAgICAgTkwgPSBNCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBNTCA9IE0KKyAgICAgICAgICAgICAgICAgICAgIE5MID0gTgorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTkwKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOTCwgWCwgMSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1ggKSwgMCwgTkwgLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgICAgIElGKCBOTC5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBYKCBOTC8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTkwvMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBETyA3MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTUwKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE1MLCBZLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEFCUyggSU5DWSApLCAwLCBNTCAtIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUyA9IFRSQU5TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0xTID0gS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtVUyA9IEtVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEFMUEhBLCBMREEsIElOQ1gsIEJFVEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaR0VNViggVFJBTlMsIE0sIE4sIEFMUEhBLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1gsIEJFVEEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE0sIE4sIEtMLCBLVSwgQUxQSEEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpHQk1WKCBUUkFOUywgTSwgTiwgS0wsIEtVLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIFhYLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIElOQ1kgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMWkUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA5ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFpFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTFpFUkVTKCAnR0UnLCAnICcsIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MLCBZUywgWVksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLTFMuRVEuS0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBLVVMuRVEuS1UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExaRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExaRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExaRVJFUyggJ0dFJywgJyAnLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTCwgWVMsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMyApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTVZDSCggVFJBTlMsIE0sIE4sIEFMUEhBLCBBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgWCwgSU5DWCwgQkVUQSwgWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ksIFlULCBHLCBZWSwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBNLmxlLjAgb3IKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgICAgIENPTlRJTlVFCisqCisgIDExMCAgICBDT05USU5VRQorKgorICAxMjAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE0MAorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFRSQU5TLCBNLCBOLCBBTFBIQSwgTERBLAorICAgICAkICAgICAgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBUUkFOUywgTSwgTiwgS0wsIEtVLAorICAgICAkICAgICAgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDE0MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDQoIEkzLCAnLCcgKSwgJygnLAorICAgICAkICAgICAgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgWCwnLCBJMiwgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFksJywgSTIsICcpIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgMiggSTMsICcsJyApLCAnKCcsCisgICAgICQgICAgICBGNC4xLCAnLCcsIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnLCgnLCBGNC4xLCAnLCcsCisgICAgICQgICAgICBGNC4xLCAnKSwgWSwnLCBJMiwgJykgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBaQ0hLMS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaQ0hLMiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTktCLCBLQiwgTkFMRiwgQUxGLCBOQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgQkVULCBOSU5DLCBJTkMsIE5NQVgsIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFhTLCBZLCBZWSwgWVMsIFlULCBHICkKKyoKKyogIFRlc3RzIFpIRU1WLCBaSEJNViBhbmQgWkhQTVYuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBIQUxGCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjBEMCwgMC4wRDAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBIQUxGID0gKCAwLjVEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOQkVULCBOSURJTSwgTklOQywgTktCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIFgoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYUyggTk1BWCpJTkNNQVggKSwgWFgoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWSggTk1BWCApLCBZUyggTk1BWCpJTkNNQVggKSwgWVQoIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBZWSggTk1BWCpJTkNNQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQUxTLCBCRVRBLCBCTFMsIFRSQU5TTAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQywgSUssIElOLCBJTkNYLCBJTkNYUywgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJTkNZUywgSVgsIElZLCBLLCBLUywgTEFBLCBMREEsIExEQVMsIExYLCBMWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOLCBOQVJHUywgTkMsIE5LLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEJBTkRFRCwgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFpFLCBMWkVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMWkUsIExaRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBaSEJNViwgWkhFTVYsIFpIUE1WLCBaTUFLRSwgWk1WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0gvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ0UnCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDEwCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gMTEKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTkQgSUYKKyoKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMTAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyoKKyAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgIE5LID0gTktCCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBOSyA9IDEKKyAgICAgICAgIEVORCBJRgorICAgICAgICAgRE8gMTAwIElLID0gMSwgTksKKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIEsgPSBLQiggSUsgKQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSyA9IE4gLSAxCisgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgTERBID0gSyArIDEKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExEQSA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgSUYoIExEQS5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQSA9IExEQSArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQS5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEwMAorICAgICAgICAgICAgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgTEFBID0gKCBOKiggTiArIDEgKSApLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDkwIElDID0gMSwgMgorICAgICAgICAgICAgICAgVVBMTyA9IElDSCggSUM6IElDICkKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIFRSQU5TTCA9IFpFUk8KKyAgICAgICAgICAgICAgIENBTEwgWk1BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQSwgTk1BWCwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4xIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBYKCBOLzIgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgQUJTKCBJTkNYICkqKCBOLzIgLSAxICkgKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgRE8gNzAgSVkgPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICBJTkNZID0gSU5DKCBJWSApCisgICAgICAgICAgICAgICAgICAgICBMWSA9IEFCUyggSU5DWSApKk4KKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgTiwgQUxQSEEsIExEQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkhFTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgTERBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBLLCBBTFBIQSwgTERBLCBJTkNYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkhCTVYoIFVQTE8sIE4sIEssIEFMUEhBLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1gsIEJFVEEsIFlZLCBJTkNZICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBOLCBBTFBIQSwgSU5DWCwgQkVUQSwgSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkhQTVYoIFVQTE8sIE4sIEFMUEhBLCBBQSwgWFgsIElOQ1gsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBLCBZWSwgSU5DWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExaRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExaRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTFpFUkVTKCAnR0UnLCAnICcsIDEsIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVMsIFlZLCBBQlMoIElOQ1kgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IExaRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFpFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gQkxTLkVRLkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExaRSggWVMsIFlZLCBMWSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExaRVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUywgWVksIEFCUyggSU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBMWkUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMWkUoIFlTLCBZWSwgTFkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRVJFUyggJ0dFJywgJyAnLCAxLCBOLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlTLCBZWSwgQUJTKCBJTkNZICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWVMuRVEuSU5DWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTVZDSCggJ04nLCBOLCBOLCBBTFBIQSwgQSwgTk1BWCwgWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIEJFVEEsIFksIElOQ1ksIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIHdpdGggTi5sZS4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDYwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgODAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICBDT05USU5VRQorKgorICAxMTAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEzMAorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBMREEsIElOQ1gsCisgICAgICQgICAgICBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIEssIEFMUEhBLCBMREEsCisgICAgICQgICAgICBJTkNYLCBCRVRBLCBJTkNZCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFVQTE8sIE4sIEFMUEhBLCBJTkNYLAorICAgICAkICAgICAgQkVUQSwgSU5DWQorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCgnLCBGNC4xLCAnLCcsCisgICAgICQgICAgICBGNC4xLCAnKSwgQVAsIFgsJywgSTIsICcsKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIFksJywgSTIsCisgICAgICQgICAgICAnKSAgICAgICAgICAgICAgICAuJyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIDIoIEkzLCAnLCcgKSwgJygnLAorICAgICAkICAgICAgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgWCwnLCBJMiwgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFksJywgSTIsICcpICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIEEsJywgSTMsICcsIFgsJywgSTIsICcsKCcsIEY0LjEsICcsJywgRjQuMSwgJyksICcsCisgICAgICQgICAgICAnWSwnLCBJMiwgJykgICAgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgWkNISzIuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWkNISzMoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5LQiwgS0IsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFhULCBHLCBaICkKKyoKKyogIFRlc3RzIFpUUk1WLCBaVEJNViwgWlRQTVYsIFpUUlNWLCBaVEJTViBhbmQgWlRQU1YuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEhBTEYgPSAoIDAuNUQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTklESU0sIE5JTkMsIE5LQiwgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIFgoIE5NQVggKSwgWFMoIE5NQVgqSU5DTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWFQoIE5NQVggKSwgWFgoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApLCBLQiggTktCICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBUUkFOU0wKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlIsIEVSUk1BWAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElDRCwgSUNULCBJQ1UsIElLLCBJTiwgSU5DWCwgSU5DWFMsIElYLCBLLAorICAgICAkICAgICAgICAgICAgICAgICAgIEtTLCBMQUEsIExEQSwgTERBUywgTFgsIE4sIE5BUkdTLCBOQywgTkssIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQkFOREVELCBGVUxMLCBOVUxMLCBQQUNLRUQsIFJFU0VULCBTQU1FCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgRElBR1MsIFRSQU5TLCBUUkFOU1MsIFVQTE8sIFVQTE9TCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgSUNIRCwgSUNIVQorICAgICAgQ0hBUkFDVEVSKjMgICAgICAgIElDSFQKKyogICAgIC4uIExvY2FsIEFycmF5cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIElTQU1FKCAxMyApCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMWkUsIExaRVJFUworICAgICAgRVhURVJOQUwgICAgICAgICAgIExaRSwgTFpFUkVTCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFpNQUtFLCBaTVZDSCwgWlRCTVYsIFpUQlNWLCBaVFBNViwgWlRQU1YsCisgICAgICQgICAgICAgICAgICAgICAgICAgWlRSTVYsIFpUUlNWCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVS8nVUwnLywgSUNIVC8nTlRDJy8sIElDSEQvJ1VOJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRlVMTCA9IFNOQU1FKCAzOiAzICkuRVEuJ1InCisgICAgICBCQU5ERUQgPSBTTkFNRSggMzogMyApLkVRLidCJworICAgICAgUEFDS0VEID0gU05BTUUoIDM6IDMgKS5FUS4nUCcKKyogICAgIERlZmluZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICBOQVJHUyA9IDgKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNworICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKiAgICAgU2V0IHVwIHplcm8gdmVjdG9yIGZvciBaTVZDSC4KKyAgICAgIERPIDEwIEkgPSAxLCBOTUFYCisgICAgICAgICBaKCBJICkgPSBaRVJPCisgICAxMCBDT05USU5VRQorKgorICAgICAgRE8gMTEwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqCisgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICBOSyA9IE5LQgorICAgICAgICAgRUxTRQorICAgICAgICAgICAgTksgPSAxCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIERPIDEwMCBJSyA9IDEsIE5LCisgICAgICAgICAgICBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICBLID0gS0IoIElLICkKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEsgPSBOIC0gMQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgIExEQSA9IEsgKyAxCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMREEgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wCisqCisgICAgICAgICAgICBETyA5MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorICAgICAgICAgICAgICAgRE8gODAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgICAgVFJBTlMgPSBJQ0hUKCBJQ1Q6IElDVCApCisqCisgICAgICAgICAgICAgICAgICBETyA3MCBJQ0QgPSAxLCAyCisgICAgICAgICAgICAgICAgICAgICBESUFHID0gSUNIRCggSUNEOiBJQ0QgKQorKgorKiAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgRElBRywgTiwgTiwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIEssIEssIFJFU0VULCBUUkFOU0wgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSVggPSAxLCBOSU5DCisgICAgICAgICAgICAgICAgICAgICAgICBJTkNYID0gSU5DKCBJWCApCisgICAgICAgICAgICAgICAgICAgICAgICBMWCA9IEFCUyggSU5DWCApKk4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSB2ZWN0b3IgWC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TTCA9IEhBTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCAxLCBOLCBYLCAxLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApLCAwLCBOIC0gMSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgRElBR1MgPSBESUFHCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtTID0gSworICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01WJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlRSTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggQkFOREVEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBMREEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpUQk1WKCBVUExPLCBUUkFOUywgRElBRywgTiwgSywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFhYLCBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlRQTVYoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBBQSwgWFgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggU05BTUUoIDQ6IDUgKS5FUS4nU1YnIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPLCBUUkFOUywgRElBRywgTiwgTERBLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaVFJTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgSU5DWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBCQU5ERUQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssIExEQSwgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlRCU1YoIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBLLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgWFgsIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQTE8sIFRSQU5TLCBESUFHLCBOLCBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaVFBTViggVVBMTywgVFJBTlMsIERJQUcsIE4sIEFBLCBYWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lcy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxICkgPSBVUExPLkVRLlVQTE9TCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMiApID0gVFJBTlMuRVEuVFJBTlNTCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gRElBRy5FUS5ESUFHUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTFpFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMWkVSRVMoICdHRScsICcgJywgMSwgTiwgWFMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMWkUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRVJFUyggJ0dFJywgJyAnLCAxLCBOLCBYUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgQUJTKCBJTkNYICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gSU5DWFMuRVEuSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExaRSggWFMsIFhYLCBMWCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFUkVTKCAnR0UnLCAnICcsIDEsIE4sIFhTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYLCBBQlMoIElOQ1ggKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBTTkFNRSggNDogNSApLkVRLidNVicgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNVkNIKCBUUkFOUywgTiwgTiwgT05FLCBBLCBOTUFYLCBYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DWCwgWkVSTywgWiwgSU5DWCwgWFQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ1NWJyApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBhcHByb3hpbWF0aW9uIHRvIG9yaWdpbmFsIHZlY3Rvci4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYWCggMSArICggSSAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyggSU5DWCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWCApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gWCggSSApCisgICA1MCAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTVZDSCggVFJBTlMsIE4sIE4sIE9ORSwgQSwgTk1BWCwgWiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ1gsIFpFUk8sIFgsIElOQ1gsIFhULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5GQUxTRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgIENPTlRJTlVFCisqCisgIDExMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIExEQSwKKyAgICAgJCAgICAgIElOQ1gKKyAgICAgIEVMU0UgSUYoIEJBTkRFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIEssCisgICAgICQgICAgICBMREEsIElOQ1gKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIERJQUcsIE4sIElOQ1gKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDMoICcnJycsIEExLCAnJycsJyApLCBJMywgJywgQVAsICcsCisgICAgICQgICAgICAnWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAzKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgJyBBLCcsIEkzLCAnLCBYLCcsIEkyLCAnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MyBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMyggJycnJywgQTEsICcnJywnICksIEkzLCAnLCBBLCcsCisgICAgICQgICAgICBJMywgJywgWCwnLCBJMiwgJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFpDSEszLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpDSEs0KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5JTkMsIElOQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIElOQ01BWCwgQSwgQUEsIEFTLCBYLCBYWCwgWFMsIFksIFlZLCBZUywgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICBaICkKKyoKKyogIFRlc3RzIFpHRVJDIGFuZCBaR0VSVS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgSEFMRiA9ICggMC41RDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOSURJTSwgTklOQywgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBYKCBOTUFYICksIFhTKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhYKCBOTUFYKklOQ01BWCApLCBZKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQUxQSEEsIEFMUywgVFJBTlNMCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVJSLCBFUlJNQVgKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSU0sIElOLCBJTkNYLCBJTkNYUywgSU5DWSwgSU5DWVMsIElYLAorICAgICAkICAgICAgICAgICAgICAgICAgIElZLCBKLCBMQUEsIExEQSwgTERBUywgTFgsIExZLCBNLCBNUywgTiwgTkFSR1MsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkMsIE5ELCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENPTkosIE5VTEwsIFJFU0VULCBTQU1FCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBXKCAxICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFpFLCBMWkVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMWkUsIExaRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBaR0VSQywgWkdFUlUsIFpNQUtFLCBaTVZDSAorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIEFCUywgRENPTkpHLCBNQVgsIE1JTgorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIENPTkogPSBTTkFNRSggNTogNSApLkVRLidDJworKiAgICAgRGVmaW5lIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgICAgTkFSR1MgPSA5CisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTIwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisgICAgICAgICBORCA9IE4vMiArIDEKKyoKKyAgICAgICAgIERPIDExMCBJTSA9IDEsIDIKKyAgICAgICAgICAgIElGKCBJTS5FUS4xICkKKyAgICAgJCAgICAgICAgIE0gPSBNQVgoIE4gLSBORCwgMCApCisgICAgICAgICAgICBJRiggSU0uRVEuMiApCisgICAgICQgICAgICAgICBNID0gTUlOKCBOICsgTkQsIE5NQVggKQorKgorKiAgICAgICAgICAgU2V0IExEQSB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICBMREEgPSBNCisgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5NLkxFLjAKKyoKKyAgICAgICAgICAgIERPIDEwMCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTQorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE0sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE0gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBNLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE0vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE0vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyA5MCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTgorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFkoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgWVkoIDEgKyBBQlMoIElOQ1kgKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyA4MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCBTTkFNRSggMjogMyApLCAnICcsICcgJywgTSwgTiwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIE0gLSAxLCBOIC0gMSwgUkVTRVQsIFRSQU5TTCApCisqCisgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICBBTFMgPSBBTFBIQQorICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSwgTFgKKyAgICAgICAgICAgICAgICAgICAgICAgIFhTKCBJICkgPSBYWCggSSApCisgICAyMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWFMgPSBJTkNYCisgICAgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTFkKKyAgICAgICAgICAgICAgICAgICAgICAgIFlTKCBJICkgPSBZWSggSSApCisgICAzMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgSU5DWVMgPSBJTkNZCisqCisqICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIE0sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWSwgTERBCisgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWkdFUkMoIE0sIE4sIEFMUEhBLCBYWCwgSU5DWCwgWVksIElOQ1ksIEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpHRVJVKCBNLCBOLCBBTFBIQSwgWFgsIElOQ1gsIFlZLCBJTkNZLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIENoZWNrIGlmIGVycm9yLWV4aXQgd2FzIHRha2VuIGluY29ycmVjdGx5LgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuT0sgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgU2VlIHdoYXQgZGF0YSBjaGFuZ2VkIGluc2lkZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTFpFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRVJFUyggJ0dFJywgJyAnLCBNLCBOLCBBUywgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisqCisqICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTQwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBJTkNYLkdULjAgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJICkgPSBYKCBJICkKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggTSAtIEkgKyAxICkKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWS5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBZKCBKICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IFkoIE4gLSBKICsgMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFcoIDEgKSA9IERDT05KRyggVyggMSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1WQ0goICdOJywgTSwgMSwgQUxQSEEsIFosIE5NQVgsIFcsIDEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkUsIEEoIDEsIEogKSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSggMSArICggSiAtIDEgKSpMREEgKSwgRVBTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMzAKKyAgIDcwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBNLmxlLjAgb3IgTi5sZS4wLgorICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgIENPTlRJTlVFCisqCisgIDEyMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTUwCisqCisgIDEzMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTQwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIE0sIE4sIEFMUEhBLCBJTkNYLCBJTkNZLCBMREEKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBSRVRVUk4KKyoKKyA5OTk5IEZPUk1BVCggJyAnLCBBNiwgJyBQQVNTRUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIENBTEwnLAorICAgICAkICAgICAgJ1MpJyApCisgOTk5OCBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIFBBUkFNRVRFUiBOVU1CRVIgJywgSTIsICcgV0FTIENIJywKKyAgICAgJCAgICAgICdBTkdFRCBJTkNPUlJFQ1RMWSAqKioqKioqJyApCisgOTk5NyBGT1JNQVQoICcgJywgQTYsICcgQ09NUExFVEVEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDJywKKyAgICAgJCAgICAgICdBTExTKScsIC8nICoqKioqKiogQlVUIFdJVEggTUFYSU1VTSBURVNUIFJBVElPJywgRjguMiwKKyAgICAgJCAgICAgICcgLSBTVVNQRUNUICoqKioqKionICkKKyA5OTk2IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBPTiBDQUxMIE5VTUJFUjonICkKKyA5OTk1IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyA5OTk0IEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCBJMywgJywnICksICcoJywgRjQuMSwgJywnLCBGNC4xLAorICAgICAkICAgICAgJyksIFgsJywgSTIsICcsIFksJywgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgICcsCisgICAgICQgICAgICAnICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgWkNISzQuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWkNISzUoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTklOQywgSU5DLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgSU5DTUFYLCBBLCBBQSwgQVMsIFgsIFhYLCBYUywgWSwgWVksIFlTLCBZVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgIFogKQorKgorKiAgVGVzdHMgWkhFUiBhbmQgWkhQUi4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDIgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gMTAtQXVndXN0LTE5ODcuCisqICAgICBSaWNoYXJkIEhhbnNvbiwgU2FuZGlhIE5hdGlvbmFsIExhYnMuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTkFHIENlbnRyYWwgT2ZmaWNlLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIEhBTEYsIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgSEFMRiA9ICggMC41RDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5DTUFYLCBOQUxGLCBOSURJTSwgTklOQywgTk1BWCwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBSRVdJLCBUUkFDRQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBKCBOTUFYLCBOTUFYICksIEFBKCBOTUFYKk5NQVggKSwgQUxGKCBOQUxGICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQVMoIE5NQVgqTk1BWCApLCBYKCBOTUFYICksIFhTKCBOTUFYKklOQ01BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFhYKCBOTUFYKklOQ01BWCApLCBZKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVMoIE5NQVgqSU5DTUFYICksIFlUKCBOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgWVkoIE5NQVgqSU5DTUFYICksIFooIE5NQVggKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEcoIE5NQVggKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIElESU0oIE5JRElNICksIElOQyggTklOQyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQUxQSEEsIFRSQU5TTAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYLCBSQUxQSEEsIFJBTFMKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQSwgSUMsIElOLCBJTkNYLCBJTkNYUywgSVgsIEosIEpBLCBKSiwgTEFBLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQSwgTERBUywgTEosIExYLCBOLCBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRSwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgVyggMSApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkhFUiwgWkhQUiwgWk1BS0UsIFpNVkNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBEQkxFLCBEQ01QTFgsIERDT05KRywgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nRScKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSA3CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gNgorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQSA9IE4KKyAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxMDAKKyAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBETyA5MCBJQyA9IDEsIDIKKyAgICAgICAgICAgIFVQTE8gPSBJQ0goIElDOiBJQyApCisgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICBETyA4MCBJWCA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgIElOQ1ggPSBJTkMoIElYICkKKyAgICAgICAgICAgICAgIExYID0gQUJTKCBJTkNYICkqTgorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBYLgorKgorICAgICAgICAgICAgICAgVFJBTlNMID0gSEFMRgorICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFgsIDEsIFhYLCBBQlMoIElOQ1ggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgIFgoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgWFgoIDEgKyBBQlMoIElOQ1ggKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICBETyA3MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgIFJBTFBIQSA9IERCTEUoIEFMRiggSUEgKSApCisgICAgICAgICAgICAgICAgICBBTFBIQSA9IERDTVBMWCggUkFMUEhBLCBSWkVSTyApCisgICAgICAgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLlJBTFBIQS5FUS5SWkVSTworKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggU05BTUUoIDI6IDMgKSwgVVBMTywgJyAnLCBOLCBOLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSwgTiAtIDEsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgIFJBTFMgPSBSQUxQSEEKKyAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAxMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExYCisgICAgICAgICAgICAgICAgICAgICBYUyggSSApID0gWFgoIEkgKQorICAgMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIElOQ1hTID0gSU5DWAorKgorKiAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJBTFBIQSwgSU5DWCwgTERBCisgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaSEVSKCBVUExPLCBOLCBSQUxQSEEsIFhYLCBJTkNYLCBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICBSQUxQSEEsIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFpIUFIoIFVQTE8sIE4sIFJBTFBIQSwgWFgsIElOQ1gsIEFBICkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gUkFMUy5FUS5SQUxQSEEKKyAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBMWkUoIFhTLCBYWCwgTFggKQorICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IElOQ1hTLkVRLklOQ1gKKyAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFUkVTKCBTTkFNRSggMjogMyApLCBVUExPLCBOLCBOLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSwgTERBICkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZCByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICBETyAzMCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICAzMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0IGNvbHVtbiBieSBjb2x1bW4uCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggSU5DWC5HVC4wIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgWiggSSApID0gWCggSSApCisgICA0MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEkgKSA9IFgoIE4gLSBJICsgMSApCisgICA1MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICBKQSA9IDEKKyAgICAgICAgICAgICAgICAgICAgIERPIDYwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICBXKCAxICkgPSBEQ09OSkcoIFooIEogKSApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1WQ0goICdOJywgTEosIDEsIEFMUEhBLCBaKCBKSiApLCBMSiwgVywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE9ORSwgQSggSkosIEogKSwgMSwgWVQsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQSggSkEgKSwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMREEgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBID0gSkEgKyBMSgorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICA2MCAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRUxTRQorKiAgICAgICAgICAgICAgICAgICAgQXZvaWQgcmVwZWF0aW5nIHRlc3RzIGlmIE4ubGUuMC4KKyAgICAgICAgICAgICAgICAgICAgIElGKCBOLkxFLjAgKQorICAgICAkICAgICAgICAgICAgICAgICAgR08gVE8gMTAwCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApSgorKgorICAxMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sIFJBTFBIQSwgSU5DWCwgTERBCisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk0IClOQywgU05BTUUsIFVQTE8sIE4sIFJBTFBIQSwgSU5DWAorICAgICAgRU5EIElGCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcsIEkzLCAnLCcsIEY0LjEsICcsIFgsJywKKyAgICAgJCAgICAgIEkyLCAnLCBBUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsJywgRjQuMSwgJywgWCwnLAorICAgICAkICAgICAgSTIsICcsIEEsJywgSTMsICcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuJyApCisgOTk5MiBGT1JNQVQoICcgKioqKioqKiBGQVRBTCBFUlJPUiAtIEVSUk9SLUVYSVQgVEFLRU4gT04gVkFMSUQgQ0FMTCAqJywKKyAgICAgJCAgICAgICcqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBaQ0hLNS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaQ0hLNiggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOSU5DLCBJTkMsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNNQVgsIEEsIEFBLCBBUywgWCwgWFgsIFhTLCBZLCBZWSwgWVMsIFlULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgWiApCisqCisqICBUZXN0cyBaSEVSMiBhbmQgWkhQUjIuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBIQUxGLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEhBTEYgPSAoIDAuNUQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIElOQ01BWCwgTkFMRiwgTklESU0sIE5JTkMsIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgWCggTk1BWCApLCBYUyggTk1BWCpJTkNNQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBYWCggTk1BWCpJTkNNQVggKSwgWSggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlTKCBOTUFYKklOQ01BWCApLCBZVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFlZKCBOTUFYKklOQ01BWCApLCBaKCBOTUFYLCAyICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApLCBJTkMoIE5JTkMgKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBBTFMsIFRSQU5TTAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElDLCBJTiwgSU5DWCwgSU5DWFMsIElOQ1ksIElOQ1lTLCBJWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBJWSwgSiwgSkEsIEpKLCBMQUEsIExEQSwgTERBUywgTEosIExYLCBMWSwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRlVMTCwgTlVMTCwgUEFDS0VELCBSRVNFVCwgU0FNRSwgVVBQRVIKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBVUExPLCBVUExPUworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIElDSAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgVyggMiApCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWkhFUjIsIFpIUFIyLCBaTUFLRSwgWk1WQ0gKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIERDT05KRywgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nVUwnLworKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBGVUxMID0gU05BTUUoIDM6IDMgKS5FUS4nRScKKyAgICAgIFBBQ0tFRCA9IFNOQU1FKCAzOiAzICkuRVEuJ1AnCisqICAgICBEZWZpbmUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgTkFSR1MgPSA5CisgICAgICBFTFNFIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgIE5BUkdTID0gOAorICAgICAgRU5EIElGCisqCisgICAgICBOQyA9IDAKKyAgICAgIFJFU0VUID0gLlRSVUUuCisgICAgICBFUlJNQVggPSBSWkVSTworKgorICAgICAgRE8gMTQwIElOID0gMSwgTklESU0KKyAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgIExEQSA9IE4KKyAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICBHTyBUTyAxNDAKKyAgICAgICAgIElGKCBQQUNLRUQgKVRIRU4KKyAgICAgICAgICAgIExBQSA9ICggTiooIE4gKyAxICkgKS8yCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBMQUEgPSBMREEqTgorICAgICAgICAgRU5EIElGCisqCisgICAgICAgICBETyAxMzAgSUMgPSAxLCAyCisgICAgICAgICAgICBVUExPID0gSUNIKCBJQzogSUMgKQorICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgRE8gMTIwIElYID0gMSwgTklOQworICAgICAgICAgICAgICAgSU5DWCA9IElOQyggSVggKQorICAgICAgICAgICAgICAgTFggPSBBQlMoIElOQ1ggKSpOCisqCisqICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgdmVjdG9yIFguCisqCisgICAgICAgICAgICAgICBUUkFOU0wgPSBIQUxGCisgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCAnR0UnLCAnICcsICcgJywgMSwgTiwgWCwgMSwgWFgsIEFCUyggSU5DWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgMCwgTiAtIDEsIFJFU0VULCBUUkFOU0wgKQorICAgICAgICAgICAgICAgSUYoIE4uR1QuMSApVEhFTgorICAgICAgICAgICAgICAgICAgWCggTi8yICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBYWCggMSArIEFCUyggSU5DWCApKiggTi8yIC0gMSApICkgPSBaRVJPCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDExMCBJWSA9IDEsIE5JTkMKKyAgICAgICAgICAgICAgICAgIElOQ1kgPSBJTkMoIElZICkKKyAgICAgICAgICAgICAgICAgIExZID0gQUJTKCBJTkNZICkqTgorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIHZlY3RvciBZLgorKgorICAgICAgICAgICAgICAgICAgVFJBTlNMID0gWkVSTworICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIDEsIE4sIFksIDEsIFlZLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCBJTkNZICksIDAsIE4gLSAxLCBSRVNFVCwgVFJBTlNMICkKKyAgICAgICAgICAgICAgICAgIElGKCBOLkdULjEgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIFkoIE4vMiApID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgWVkoIDEgKyBBQlMoIElOQ1kgKSooIE4vMiAtIDEgKSApID0gWkVSTworICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICBETyAxMDAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorICAgICAgICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMC5PUi5BTFBIQS5FUS5aRVJPCisqCisqICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICAgICBUUkFOU0wgPSBaRVJPCisgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBQSwgTERBLCBOIC0gMSwgTiAtIDEsIFJFU0VULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNMICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMWAorICAgICAgICAgICAgICAgICAgICAgICAgWFMoIEkgKSA9IFhYKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNYUyA9IElOQ1gKKyAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMWQorICAgICAgICAgICAgICAgICAgICAgICAgWVMoIEkgKSA9IFlZKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBJTkNZUyA9IElOQ1kKKyoKKyogICAgICAgICAgICAgICAgICAgIENhbGwgdGhlIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTkzIClOQywgU05BTUUsIFVQTE8sIE4sCisgICAgICQgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgSU5DWCwgSU5DWSwgTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaSEVSMiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRSBJRiggUEFDS0VEIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBJTkNYLCBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaSFBSMiggVVBMTywgTiwgQUxQSEEsIFhYLCBJTkNYLCBZWSwgSU5DWSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBICkKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE2MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE8uRVEuVVBMT1MKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTFpFKCBYUywgWFgsIExYICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBJTkNYUy5FUS5JTkNYCisgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNiApID0gTFpFKCBZUywgWVksIExZICkKKyAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBJTkNZUy5FUS5JTkNZCisgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRVJFUyggU05BTUUoIDI6IDMgKSwgVVBMTywgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUywgQUEsIExEQSApCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlBBQ0tFRCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNjAKKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdCBjb2x1bW4gYnkgY29sdW1uLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1guR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDEgKSA9IFgoIEkgKQorICAgNTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAxICkgPSBYKCBOIC0gSSArIDEgKQorICAgNjAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIElOQ1kuR1QuMCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSSA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFooIEksIDIgKSA9IFkoIEkgKQorICAgNzAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaKCBJLCAyICkgPSBZKCBOIC0gSSArIDEgKQorICAgODAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBETyA5MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMSApID0gQUxQSEEqRENPTkpHKCBaKCBKLCAyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggMiApID0gRENPTkpHKCBBTFBIQSApKkRDT05KRyggWiggSiwgMSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBOIC0gSiArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTVZDSCggJ04nLCBMSiwgMiwgT05FLCBaKCBKSiwgMSApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgVywgMSwgT05FLCBBKCBKSiwgSiApLCAxLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVQsIEcsIEFBKCBKQSApLCBFUFMsIEVSUiwgRkFUQUwsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZVTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExEQSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgPSBKQSArIExKCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgIDkwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICBFTFNFCisqICAgICAgICAgICAgICAgICAgICAgICBBdm9pZCByZXBlYXRpbmcgdGVzdHMgd2l0aCBOLmxlLjAuCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTi5MRS4wICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE0MAorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTIwICAgICAgIENPTlRJTlVFCisqCisgIDEzMCAgICBDT05USU5VRQorKgorICAxNDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE3MAorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDE2MCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggRlVMTCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIElOQ1gsCisgICAgICQgICAgICBJTkNZLCBMREEKKyAgICAgIEVMU0UgSUYoIFBBQ0tFRCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgTiwgQUxQSEEsIElOQ1gsIElOQ1kKKyAgICAgIEVORCBJRgorKgorICAxNzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcnJywgQTEsICcnJywnLCBJMywgJywoJywgRjQuMSwgJywnLAorICAgICAkICAgICAgRjQuMSwgJyksIFgsJywgSTIsICcsIFksJywgSTIsICcsIEFQKSAgICAgICAgICAgICAgICAgICAgICcsCisgICAgICQgICAgICAnICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnJycsIEExLCAnJycsJywgSTMsICcsKCcsIEY0LjEsICcsJywKKyAgICAgJCAgICAgIEY0LjEsICcpLCBYLCcsIEkyLCAnLCBZLCcsIEkyLCAnLCBBLCcsIEkzLCAnKSAgICAgICAgICAgICAnLAorICAgICAkICAgICAgJyAgICAgICAgICAgIC4nICkKKyA5OTkyIEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFpDSEs2LgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpDSEtFKCBJU05VTSwgU1JOQU1ULCBOT1VUICkKKyoKKyogIFRlc3RzIHRoZSBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAyIEJsYXMuCisqICBSZXF1aXJlcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgZXJyb3ItaGFuZGxpbmcgcm91dGluZSBYRVJCTEEuCisqICBBTFBIQSwgUkFMUEhBLCBCRVRBLCBBLCBYIGFuZCBZIHNob3VsZCBub3QgbmVlZCB0byBiZSBkZWZpbmVkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSVNOVU0sIE5PVVQKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQkVUQQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJBTFBIQQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggMSwgMSApLCBYKCAxICksIFkoIDEgKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBDSEtYRVIsIFpHQk1WLCBaR0VNViwgWkdFUkMsIFpHRVJVLCBaSEJNViwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBaSEVNViwgWkhFUiwgWkhFUjIsIFpIUE1WLCBaSFBSLCBaSFBSMiwgWlRCTVYsCisgICAgICQgICAgICAgICAgICAgICAgICAgWlRCU1YsIFpUUE1WLCBaVFBTViwgWlRSTVYsIFpUUlNWCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKiAgICAgT0sgaXMgc2V0IHRvIC5GQUxTRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgb3IgYnkgQ0hLWEVSCisqICAgICBpZiBhbnl0aGluZyBpcyB3cm9uZy4KKyAgICAgIE9LID0gLlRSVUUuCisqICAgICBMRVJSIGlzIHNldCB0byAuVFJVRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgZWFjaCB0aW1lCisqICAgICBpdCBpcyBjYWxsZWQsIGFuZCBpcyB0aGVuIHRlc3RlZCBhbmQgcmUtc2V0IGJ5IENIS1hFUi4KKyAgICAgIExFUlIgPSAuRkFMU0UuCisgICAgICBHTyBUTyAoIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwKKyAgICAgJCAgICAgICAgOTAsIDEwMCwgMTEwLCAxMjAsIDEzMCwgMTQwLCAxNTAsIDE2MCwKKyAgICAgJCAgICAgICAgMTcwIClJU05VTQorICAgMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpHRU1WKCAnLycsIDAsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkdFTVYoICdOJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkdFTVYoICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgWkdFTVYoICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0VNViggJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaR0VNViggJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICAyMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkdCTVYoICcvJywgMCwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaR0JNViggJ04nLCAtMSwgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0JNViggJ04nLCAyLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAwLCAxLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMCwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBaR0JNViggJ04nLCAwLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICAzMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkhFTVYoICcvJywgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaSEVNViggJ1UnLCAtMSwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaSEVNViggJ1UnLCAyLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRU1WKCAnVScsIDAsIEFMUEhBLCBBLCAxLCBYLCAwLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpIRU1WKCAnVScsIDAsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBaSEJNViggJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpIQk1WKCAnVScsIC0xLCAwLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIQk1WKCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgWCwgMSwgQkVUQSwgWSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpIQk1WKCAnVScsIDAsIDEsIEFMUEhBLCBBLCAxLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWkhCTVYoICdVJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWkhCTVYoICdVJywgMCwgMCwgQUxQSEEsIEEsIDEsIFgsIDEsIEJFVEEsIFksIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgNTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpIUE1WKCAnLycsIDAsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkhQTVYoICdVJywgLTEsIEFMUEhBLCBBLCBYLCAxLCBCRVRBLCBZLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgWkhQTVYoICdVJywgMCwgQUxQSEEsIEEsIFgsIDAsIEJFVEEsIFksIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaSFBNViggJ1UnLCAwLCBBTFBIQSwgQSwgWCwgMSwgQkVUQSwgWSwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICA2MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlRSTVYoICcvJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaVFJNViggJ1UnLCAnLycsICdOJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpUUk1WKCAnVScsICdOJywgJy8nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlRSTVYoICdVJywgJ04nLCAnTicsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDYKKyAgICAgIENBTEwgWlRSTVYoICdVJywgJ04nLCAnTicsIDIsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaVFJNViggJ1UnLCAnTicsICdOJywgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICA3MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlRCTVYoICcvJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaVEJNViggJ1UnLCAnLycsICdOJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpUQk1WKCAnVScsICdOJywgJy8nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlRCTVYoICdVJywgJ04nLCAnTicsIC0xLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWlRCTVYoICdVJywgJ04nLCAnTicsIDAsIC0xLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlRCTVYoICdVJywgJ04nLCAnTicsIDAsIDEsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVEJNViggJ1UnLCAnTicsICdOJywgMCwgMCwgQSwgMSwgWCwgMCApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgICA4MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlRQTVYoICcvJywgJ04nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaVFBNViggJ1UnLCAnLycsICdOJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpUUE1WKCAnVScsICdOJywgJy8nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlRQTVYoICdVJywgJ04nLCAnTicsIC0xLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlRQTVYoICdVJywgJ04nLCAnTicsIDAsIEEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAgOTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpUUlNWKCAnLycsICdOJywgJ04nLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlRSU1YoICdVJywgJy8nLCAnTicsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaVFJTViggJ1UnLCAnTicsICcvJywgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpUUlNWKCAnVScsICdOJywgJ04nLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUlNWKCAnVScsICdOJywgJ04nLCAyLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWlRSU1YoICdVJywgJ04nLCAnTicsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxMDAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpUQlNWKCAnLycsICdOJywgJ04nLCAwLCAwLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlRCU1YoICdVJywgJy8nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaVEJTViggJ1UnLCAnTicsICcvJywgMCwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpUQlNWKCAnVScsICdOJywgJ04nLCAtMSwgMCwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUQlNWKCAnVScsICdOJywgJ04nLCAwLCAtMSwgQSwgMSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpUQlNWKCAnVScsICdOJywgJ04nLCAwLCAxLCBBLCAxLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRCU1YoICdVJywgJ04nLCAnTicsIDAsIDAsIEEsIDEsIFgsIDAgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxMTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpUUFNWKCAnLycsICdOJywgJ04nLCAwLCBBLCBYLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlRQU1YoICdVJywgJy8nLCAnTicsIDAsIEEsIFgsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaVFBTViggJ1UnLCAnTicsICcvJywgMCwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpUUFNWKCAnVScsICdOJywgJ04nLCAtMSwgQSwgWCwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpUUFNWKCAnVScsICdOJywgJ04nLCAwLCBBLCBYLCAwICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxODAKKyAgMTIwIElORk9UID0gMQorICAgICAgQ0FMTCBaR0VSQyggLTEsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkdFUkMoIDAsIC0xLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpHRVJDKCAwLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpHRVJDKCAwLCAwLCBBTFBIQSwgWCwgMSwgWSwgMCwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpHRVJDKCAyLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDEzMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkdFUlUoIC0xLCAwLCBBTFBIQSwgWCwgMSwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpHRVJVKCAwLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0VSVSggMCwgMCwgQUxQSEEsIFgsIDAsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaR0VSVSggMCwgMCwgQUxQSEEsIFgsIDEsIFksIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaR0VSVSggMiwgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxNDAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpIRVIoICcvJywgMCwgUkFMUEhBLCBYLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkhFUiggJ1UnLCAtMSwgUkFMUEhBLCBYLCAxLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkhFUiggJ1UnLCAwLCBSQUxQSEEsIFgsIDAsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaSEVSKCAnVScsIDIsIFJBTFBIQSwgWCwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDE1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkhQUiggJy8nLCAwLCBSQUxQSEEsIFgsIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaSFBSKCAnVScsIC0xLCBSQUxQSEEsIFgsIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaSFBSKCAnVScsIDAsIFJBTFBIQSwgWCwgMCwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTgwCisgIDE2MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkhFUjIoICcvJywgMCwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaSEVSMiggJ1UnLCAtMSwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaSEVSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMCwgWSwgMSwgQSwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIyKCAnVScsIDAsIEFMUEhBLCBYLCAxLCBZLCAwLCBBLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWkhFUjIoICdVJywgMiwgQUxQSEEsIFgsIDEsIFksIDEsIEEsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDE4MAorICAxNzAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpIUFIyKCAnLycsIDAsIEFMUEhBLCBYLCAxLCBZLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkhQUjIoICdVJywgLTEsIEFMUEhBLCBYLCAxLCBZLCAxLCBBICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkhQUjIoICdVJywgMCwgQUxQSEEsIFgsIDAsIFksIDEsIEEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaSFBSMiggJ1UnLCAwLCBBTFBIQSwgWCwgMSwgWSwgMCwgQSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorICAxODAgSUYoIE9LIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU1JOQU1UCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApU1JOQU1UCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMnICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqICcsIEE2LCAnIEZBSUxFRCBUSEUgVEVTVFMgT0YgRVJST1ItRVhJVFMgKioqKionLAorICAgICAkICAgICAgJyoqJyApCisqCisqICAgICBFbmQgb2YgWkNIS0UuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWk1BS0UoIFRZUEUsIFVQTE8sIERJQUcsIE0sIE4sIEEsIE5NQVgsIEFBLCBMREEsIEtMLAorICAgICAkICAgICAgICAgICAgICAgICAgS1UsIFJFU0VULCBUUkFOU0wgKQorKgorKiAgR2VuZXJhdGVzIHZhbHVlcyBmb3IgYW4gTSBieSBOIG1hdHJpeCBBIHdpdGhpbiB0aGUgYmFuZHdpZHRoCisqICBkZWZpbmVkIGJ5IEtMIGFuZCBLVS4KKyogIFN0b3JlcyB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBBQSBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQKKyogIGJ5IHRoZSByb3V0aW5lLCB3aXRoIHVud2FudGVkIGVsZW1lbnRzIHNldCB0byByb2d1ZSB2YWx1ZS4KKyoKKyogIFRZUEUgaXMgJ0dFJywgJ0dCJywgJ0hFJywgJ0hCJywgJ0hQJywgJ1RSJywgJ1RCJyBPUiAnVFAnLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkVSTywgT05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBaRVJPID0gKCAwLjBEMCwgMC4wRDAgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBPTkUgPSAoIDEuMEQwLCAwLjBEMCApICkKKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUk9HVUUgPSAoIC0xLjBEMTAsIDEuMEQxMCApICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBSWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjBEMCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlJPR1VFCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSUk9HVUUgPSAtMS4wRDEwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBUUkFOU0wKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBLTCwgS1UsIExEQSwgTSwgTiwgTk1BWAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgRElBRywgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIE5NQVgsICogKSwgQUEoICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIEkxLCBJMiwgSTMsIElCRUcsIElFTkQsIElPRkYsIEosIEpKLCBLSworICAgICAgTE9HSUNBTCAgICAgICAgICAgIEdFTiwgTE9XRVIsIFNZTSwgVFJJLCBVTklULCBVUFBFUgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkJFRworICAgICAgRVhURVJOQUwgICAgICAgICAgIFpCRUcKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBEQkxFLCBEQ01QTFgsIERDT05KRywgTUFYLCBNSU4KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgR0VOID0gVFlQRSggMTogMSApLkVRLidHJworICAgICAgU1lNID0gVFlQRSggMTogMSApLkVRLidIJworICAgICAgVFJJID0gVFlQRSggMTogMSApLkVRLidUJworICAgICAgVVBQRVIgPSAoIFNZTS5PUi5UUkkgKS5BTkQuVVBMTy5FUS4nVScKKyAgICAgIExPV0VSID0gKCBTWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ0wnCisgICAgICBVTklUID0gVFJJLkFORC5ESUFHLkVRLidVJworKgorKiAgICAgR2VuZXJhdGUgZGF0YSBpbiBhcnJheSBBLgorKgorICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBJRiggR0VOLk9SLiggVVBQRVIuQU5ELkkuTEUuSiApLk9SLiggTE9XRVIuQU5ELkkuR0UuSiApICkKKyAgICAgJCAgICAgICAgICBUSEVOCisgICAgICAgICAgICAgICBJRiggKCBJLkxFLkouQU5ELkogLSBJLkxFLktVICkuT1IuCisgICAgICQgICAgICAgICAgICAgKCBJLkdFLkouQU5ELkkgLSBKLkxFLktMICkgKVRIRU4KKyAgICAgICAgICAgICAgICAgIEEoIEksIEogKSA9IFpCRUcoIFJFU0VUICkgKyBUUkFOU0wKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEEoIEksIEogKSA9IFpFUk8KKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUYoIEkuTkUuSiApVEhFTgorICAgICAgICAgICAgICAgICAgSUYoIFNZTSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgQSggSiwgSSApID0gRENPTkpHKCBBKCBJLCBKICkgKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggVFJJIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIFNZTSApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBEQ01QTFgoIERCTEUoIEEoIEosIEogKSApLCBSWkVSTyApCisgICAgICAgICBJRiggVFJJICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IEEoIEosIEogKSArIE9ORQorICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgQSggSiwgSiApID0gT05FCisgICAyMCBDT05USU5VRQorKgorKiAgICAgU3RvcmUgZWxlbWVudHMgaW4gYXJyYXkgQVMgaW4gZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQgYnkgcm91dGluZS4KKyoKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBETyAzMCBJID0gMSwgTQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidHQicgKVRIRU4KKyAgICAgICAgIERPIDkwIEogPSAxLCBOCisgICAgICAgICAgICBETyA2MCBJMSA9IDEsIEtVICsgMSAtIEoKKyAgICAgICAgICAgICAgIEFBKCBJMSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA2MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gNzAgSTIgPSBJMSwgTUlOKCBLTCArIEtVICsgMSwgS1UgKyAxICsgTSAtIEogKQorICAgICAgICAgICAgICAgQUEoIEkyICsgKCBKIC0gMSApKkxEQSApID0gQSggSTIgKyBKIC0gS1UgLSAxLCBKICkKKyAgIDcwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA4MCBJMyA9IEkyLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJMyArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA4MCAgICAgICBDT05USU5VRQorICAgOTAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hFJy5PUi5UWVBFLkVRLidUUicgKVRIRU4KKyAgICAgICAgIERPIDEzMCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKIC0gMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKICsgMQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgSUVORCA9IE4KKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRE8gMTAwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAxMDAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDExMCBJID0gSUJFRywgSUVORAorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgMTEwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxMjAgSSA9IElFTkQgKyAxLCBMREEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTIwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBJRiggU1lNIClUSEVOCisgICAgICAgICAgICAgICBKSiA9IEogKyAoIEogLSAxICkqTERBCisgICAgICAgICAgICAgICBBQSggSkogKSA9IERDTVBMWCggREJMRSggQUEoIEpKICkgKSwgUlJPR1VFICkKKyAgICAgICAgICAgIEVORCBJRgorICAxMzAgICAgQ09OVElOVUUKKyAgICAgIEVMU0UgSUYoIFRZUEUuRVEuJ0hCJy5PUi5UWVBFLkVRLidUQicgKVRIRU4KKyAgICAgICAgIERPIDE3MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBLSyA9IEtMICsgMQorICAgICAgICAgICAgICAgSUJFRyA9IE1BWCggMSwgS0wgKyAyIC0gSiApCisgICAgICAgICAgICAgICBJRiggVU5JVCApVEhFTgorICAgICAgICAgICAgICAgICAgSUVORCA9IEtMCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJRU5EID0gS0wgKyAxCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIEtLID0gMQorICAgICAgICAgICAgICAgSUYoIFVOSVQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIElCRUcgPSAyCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICBJRU5EID0gTUlOKCBLTCArIDEsIDEgKyBNIC0gSiApCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDE0MCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gUk9HVUUKKyAgMTQwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyAxNTAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIEFBKCBJICsgKCBKIC0gMSApKkxEQSApID0gQSggSSArIEogLSBLSywgSiApCisgIDE1MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgRE8gMTYwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgIDE2MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYoIFNZTSApVEhFTgorICAgICAgICAgICAgICAgSkogPSBLSyArICggSiAtIDEgKSpMREEKKyAgICAgICAgICAgICAgIEFBKCBKSiApID0gRENNUExYKCBEQkxFKCBBQSggSkogKSApLCBSUk9HVUUgKQorICAgICAgICAgICAgRU5EIElGCisgIDE3MCAgICBDT05USU5VRQorICAgICAgRUxTRSBJRiggVFlQRS5FUS4nSFAnLk9SLlRZUEUuRVEuJ1RQJyApVEhFTgorICAgICAgICAgSU9GRiA9IDAKKyAgICAgICAgIERPIDE5MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAxODAgSSA9IElCRUcsIElFTkQKKyAgICAgICAgICAgICAgIElPRkYgPSBJT0ZGICsgMQorICAgICAgICAgICAgICAgQUEoIElPRkYgKSA9IEEoIEksIEogKQorICAgICAgICAgICAgICAgSUYoIEkuRVEuSiApVEhFTgorICAgICAgICAgICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgICAgICAgICAgQUEoIElPRkYgKSA9IFJPR1VFCisgICAgICAgICAgICAgICAgICBJRiggU1lNICkKKyAgICAgJCAgICAgICAgICAgICAgIEFBKCBJT0ZGICkgPSBEQ01QTFgoIERCTEUoIEFBKCBJT0ZGICkgKSwgUlJPR1VFICkKKyAgICAgICAgICAgICAgIEVORCBJRgorICAxODAgICAgICAgQ09OVElOVUUKKyAgMTkwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpNQUtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpNVkNIKCBUUkFOUywgTSwgTiwgQUxQSEEsIEEsIE5NQVgsIFgsIElOQ1gsIEJFVEEsIFksCisgICAgICQgICAgICAgICAgICAgICAgICBJTkNZLCBZVCwgRywgWVksIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgTVYgKQorKgorKiAgQ2hlY2tzIHRoZSByZXN1bHRzIG9mIHRoZSBjb21wdXRhdGlvbmFsIHRlc3RzLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJaRVJPLCBST05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwLCBST05FID0gMS4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBCRVRBCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBFUlIKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkNYLCBJTkNZLCBNLCBOLCBOTUFYLCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIE1WCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlMKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIE5NQVgsICogKSwgWCggKiApLCBZKCAqICksIFlUKCAqICksIFlZKCAqICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBHKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBDCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVJSSQorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElOQ1hMLCBJTkNZTCwgSVksIEosIEpYLCBLWCwgS1ksIE1MLCBOTAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIENUUkFOLCBUUkFOCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgQUJTLCBEQkxFLCBEQ09OSkcsIERJTUFHLCBNQVgsIFNRUlQKKyogICAgIC4uIFN0YXRlbWVudCBGdW5jdGlvbnMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBBQlMxCisqICAgICAuLiBTdGF0ZW1lbnQgRnVuY3Rpb24gZGVmaW5pdGlvbnMgLi4KKyAgICAgIEFCUzEoIEMgKSA9IEFCUyggREJMRSggQyApICkgKyBBQlMoIERJTUFHKCBDICkgKQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBUUkFOID0gVFJBTlMuRVEuJ1QnCisgICAgICBDVFJBTiA9IFRSQU5TLkVRLidDJworICAgICAgSUYoIFRSQU4uT1IuQ1RSQU4gKVRIRU4KKyAgICAgICAgIE1MID0gTgorICAgICAgICAgTkwgPSBNCisgICAgICBFTFNFCisgICAgICAgICBNTCA9IE0KKyAgICAgICAgIE5MID0gTgorICAgICAgRU5EIElGCisgICAgICBJRiggSU5DWC5MVC4wIClUSEVOCisgICAgICAgICBLWCA9IE5MCisgICAgICAgICBJTkNYTCA9IC0xCisgICAgICBFTFNFCisgICAgICAgICBLWCA9IDEKKyAgICAgICAgIElOQ1hMID0gMQorICAgICAgRU5EIElGCisgICAgICBJRiggSU5DWS5MVC4wIClUSEVOCisgICAgICAgICBLWSA9IE1MCisgICAgICAgICBJTkNZTCA9IC0xCisgICAgICBFTFNFCisgICAgICAgICBLWSA9IDEKKyAgICAgICAgIElOQ1lMID0gMQorICAgICAgRU5EIElGCisqCisqICAgICBDb21wdXRlIGV4cGVjdGVkIHJlc3VsdCBpbiBZVCB1c2luZyBkYXRhIGluIEEsIFggYW5kIFkuCisqICAgICBDb21wdXRlIGdhdWdlcyBpbiBHLgorKgorICAgICAgSVkgPSBLWQorICAgICAgRE8gNDAgSSA9IDEsIE1MCisgICAgICAgICBZVCggSVkgKSA9IFpFUk8KKyAgICAgICAgIEcoIElZICkgPSBSWkVSTworICAgICAgICAgSlggPSBLWAorICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgIERPIDEwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEosIEkgKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUzEoIEEoIEosIEkgKSApKkFCUzEoIFgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAxMCAgICAgICBDT05USU5VRQorICAgICAgICAgRUxTRSBJRiggQ1RSQU4gKVRIRU4KKyAgICAgICAgICAgIERPIDIwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIERDT05KRyggQSggSiwgSSApICkqWCggSlggKQorICAgICAgICAgICAgICAgRyggSVkgKSA9IEcoIElZICkgKyBBQlMxKCBBKCBKLCBJICkgKSpBQlMxKCBYKCBKWCApICkKKyAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYTAorICAgMjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIERPIDMwIEogPSAxLCBOTAorICAgICAgICAgICAgICAgWVQoIElZICkgPSBZVCggSVkgKSArIEEoIEksIEogKSpYKCBKWCApCisgICAgICAgICAgICAgICBHKCBJWSApID0gRyggSVkgKSArIEFCUzEoIEEoIEksIEogKSApKkFCUzEoIFgoIEpYICkgKQorICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1hMCisgICAzMCAgICAgICBDT05USU5VRQorICAgICAgICAgRU5EIElGCisgICAgICAgICBZVCggSVkgKSA9IEFMUEhBKllUKCBJWSApICsgQkVUQSpZKCBJWSApCisgICAgICAgICBHKCBJWSApID0gQUJTMSggQUxQSEEgKSpHKCBJWSApICsgQUJTMSggQkVUQSApKkFCUzEoIFkoIElZICkgKQorICAgICAgICAgSVkgPSBJWSArIElOQ1lMCisgICA0MCBDT05USU5VRQorKgorKiAgICAgQ29tcHV0ZSB0aGUgZXJyb3IgcmF0aW8gZm9yIHRoaXMgcmVzdWx0LgorKgorICAgICAgRVJSID0gWkVSTworICAgICAgRE8gNTAgSSA9IDEsIE1MCisgICAgICAgICBFUlJJID0gQUJTKCBZVCggSSApIC0gWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKSApL0VQUworICAgICAgICAgSUYoIEcoIEkgKS5ORS5SWkVSTyApCisgICAgICQgICAgICBFUlJJID0gRVJSSS9HKCBJICkKKyAgICAgICAgIEVSUiA9IE1BWCggRVJSLCBFUlJJICkKKyAgICAgICAgIElGKCBFUlIqU1FSVCggRVBTICkuR0UuUk9ORSApCisgICAgICQgICAgICBHTyBUTyA2MAorICAgNTAgQ09OVElOVUUKKyogICAgIElmIHRoZSBsb29wIGNvbXBsZXRlcywgYWxsIHJlc3VsdHMgYXJlIGF0IGxlYXN0IGhhbGYgYWNjdXJhdGUuCisgICAgICBHTyBUTyA4MAorKgorKiAgICAgUmVwb3J0IGZhdGFsIGVycm9yLgorKgorICAgNjAgRkFUQUwgPSAuVFJVRS4KKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5ICkKKyAgICAgIERPIDcwIEkgPSAxLCBNTAorICAgICAgICAgSUYoIE1WIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgWVQoIEkgKSwKKyAgICAgJCAgICAgICAgIFlZKCAxICsgKCBJIC0gMSApKkFCUyggSU5DWSApICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLAorICAgICAkICAgICAgICAgWVkoIDEgKyAoIEkgLSAxICkqQUJTKCBJTkNZICkgKSwgWVQoIEkgKQorICAgICAgICAgRU5EIElGCisgICA3MCBDT05USU5VRQorKgorICAgODAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBDT01QVVRFRCBSRVNVTFQgSVMgTEVTUyBUSEFOIEhBTCcsCisgICAgICQgICAgICAnRiBBQ0NVUkFURSAqKioqKioqJywgLycgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVEVEIFJFJywKKyAgICAgJCAgICAgICdTVUxUICAgICAgICAgICAgICAgICAgICBDT01QVVRFRCBSRVNVTFQnICkKKyA5OTk4IEZPUk1BVCggMVgsIEk3LCAyKCAnICAoJywgRzE1LjYsICcsJywgRzE1LjYsICcpJyApICkKKyoKKyogICAgIEVuZCBvZiBaTVZDSC4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMWkUoIFJJLCBSSiwgTFIgKQorKgorKiAgVGVzdHMgaWYgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTFIKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFJJKCAqICksIFJKKCAqICkKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERPIDEwIEkgPSAxLCBMUgorICAgICAgICAgSUYoIFJJKCBJICkuTkUuUkooIEkgKSApCisgICAgICQgICAgICBHTyBUTyAyMAorICAgMTAgQ09OVElOVUUKKyAgICAgIExaRSA9IC5UUlVFLgorICAgICAgR08gVE8gMzAKKyAgIDIwIENPTlRJTlVFCisgICAgICBMWkUgPSAuRkFMU0UuCisgICAzMCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMWkUuCisqCisgICAgICBFTkQKKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gTFpFUkVTKCBUWVBFLCBVUExPLCBNLCBOLCBBQSwgQVMsIExEQSApCisqCisqICBUZXN0cyBpZiBzZWxlY3RlZCBlbGVtZW50cyBpbiB0d28gYXJyYXlzIGFyZSBlcXVhbC4KKyoKKyogIFRZUEUgaXMgJ0dFJywgJ0hFJyBvciAnSFAnLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFBKCBMREEsICogKSwgQVMoIExEQSwgKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFVQUEVSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICAgICBETyAxMCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgIDIwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgIElCRUcgPSAxCisgICAgICAgICAgICAgICBJRU5EID0gSgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgSUJFRyA9IEoKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDMwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDQwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBJRiggQUEoIEksIEogKS5ORS5BUyggSSwgSiApICkKKyAgICAgJCAgICAgICAgICAgIEdPIFRPIDcwCisgICA0MCAgICAgICBDT05USU5VRQorICAgNTAgICAgQ09OVElOVUUKKyAgICAgIEVORCBJRgorKgorICAgNjAgQ09OVElOVUUKKyAgICAgIExaRVJFUyA9IC5UUlVFLgorICAgICAgR08gVE8gODAKKyAgIDcwIENPTlRJTlVFCisgICAgICBMWkVSRVMgPSAuRkFMU0UuCisgICA4MCBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBMWkVSRVMuCisqCisgICAgICBFTkQKKyAgICAgIENPTVBMRVgqMTYgRlVOQ1RJT04gWkJFRyggUkVTRVQgKQorKgorKiAgR2VuZXJhdGVzIGNvbXBsZXggbnVtYmVycyBhcyBwYWlycyBvZiByYW5kb20gbnVtYmVycyB1bmlmb3JtbHkKKyogIGRpc3RyaWJ1dGVkIGJldHdlZW4gLTAuNSBhbmQgMC41LgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyogICAgIC4uIExvY2FsIFNjYWxhcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJLCBJQywgSiwgTUksIE1KCisqICAgICAuLiBTYXZlIHN0YXRlbWVudCAuLgorICAgICAgU0FWRSAgICAgICAgICAgICAgIEksIElDLCBKLCBNSSwgTUoKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBEQ01QTFgKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgSUYoIFJFU0VUIClUSEVOCisqICAgICAgICBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAgICAgIE1JID0gODkxCisgICAgICAgICBNSiA9IDQ1NworICAgICAgICAgSSA9IDcKKyAgICAgICAgIEogPSA3CisgICAgICAgICBJQyA9IDAKKyAgICAgICAgIFJFU0VUID0gLkZBTFNFLgorICAgICAgRU5EIElGCisqCisqICAgICBUaGUgc2VxdWVuY2Ugb2YgdmFsdWVzIG9mIEkgb3IgSiBpcyBib3VuZGVkIGJldHdlZW4gMSBhbmQgOTk5LgorKiAgICAgSWYgaW5pdGlhbCBJIG9yIEogPSAxLDIsMyw2LDcgb3IgOSwgdGhlIHBlcmlvZCB3aWxsIGJlIDUwLgorKiAgICAgSWYgaW5pdGlhbCBJIG9yIEogPSA0IG9yIDgsIHRoZSBwZXJpb2Qgd2lsbCBiZSAyNS4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gNSwgdGhlIHBlcmlvZCB3aWxsIGJlIDEwLgorKiAgICAgSUMgaXMgdXNlZCB0byBicmVhayB1cCB0aGUgcGVyaW9kIGJ5IHNraXBwaW5nIDEgdmFsdWUgb2YgSSBvciBKCisqICAgICBpbiA2LgorKgorICAgICAgSUMgPSBJQyArIDEKKyAgIDEwIEkgPSBJKk1JCisgICAgICBKID0gSipNSgorICAgICAgSSA9IEkgLSAxMDAwKiggSS8xMDAwICkKKyAgICAgIEogPSBKIC0gMTAwMCooIEovMTAwMCApCisgICAgICBJRiggSUMuR0UuNSApVEhFTgorICAgICAgICAgSUMgPSAwCisgICAgICAgICBHTyBUTyAxMAorICAgICAgRU5EIElGCisgICAgICBaQkVHID0gRENNUExYKCAoIEkgLSA1MDAgKS8xMDAxLjBEMCwgKCBKIC0gNTAwICkvMTAwMS4wRDAgKQorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgWkJFRy4KKyoKKyAgICAgIEVORAorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBGVU5DVElPTiBERElGRiggWCwgWSApCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFgsIFkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRERJRkYgPSBYIC0gWQorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgRERJRkYuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisqICBUZXN0cyB3aGV0aGVyIFhFUkJMQSBoYXMgZGV0ZWN0ZWQgYW4gZXJyb3Igd2hlbiBpdCBzaG91bGQuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAyIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDEwLUF1Z3VzdC0xOTg3LgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKiAgICAgSmVyZW15IER1IENyb3osIE5BRyBDZW50cmFsIE9mZmljZS4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCAuTk9ULkxFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPVCwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqIElMTEVHQUwgVkFMVUUgT0YgUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBOT1QgRCcsCisgICAgICQgICAgICAnRVRFQ1RFRCBCWSAnLCBBNiwgJyAqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENIS1hFUi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBYRVJCTEEoIFNSTkFNRSwgSU5GTyApCisqCisqICBUaGlzIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSB0byBiZSB1c2VkIG9ubHkgYXMgcGFydCBvZgorKiAgdGhlIHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAyIEJMQVMKKyogIHJvdXRpbmVzLgorKgorKiAgWEVSQkxBICBpcyBhbiBlcnJvciBoYW5kbGVyIGZvciB0aGUgTGV2ZWwgMiBCTEFTIHJvdXRpbmVzLgorKgorKiAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMZXZlbCAyIEJMQVMgcm91dGluZXMgaWYgYW4gaW5wdXQgcGFyYW1ldGVyIGlzCisqICBpbnZhbGlkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMiBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiAxMC1BdWd1c3QtMTk4Ny4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyogICAgIEplcmVteSBEdSBDcm96LCBOQUcgQ2VudHJhbCBPZmZpY2UuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GTworICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VULCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIExFUlIgPSAuVFJVRS4KKyAgICAgIElGKCBJTkZPLk5FLklORk9UIClUSEVOCisgICAgICAgICBJRiggSU5GT1QuTkUuMCApVEhFTgorICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKUlORk8sIElORk9UCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApSU5GTworICAgICAgICAgRU5EIElGCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgSUYoIFNSTkFNRS5ORS5TUk5BTVQgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTUUsIFNSTkFNVAorICAgICAgICAgT0sgPSAuRkFMU0UuCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsICcgSU5TVEVBRCcsCisgICAgICQgICAgICAnIE9GICcsIEkyLCAnICoqKioqKionICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggU1JOQU1FID0gJywgQTYsICcgSU5TVEUnLAorICAgICAkICAgICAgJ0FEIE9GICcsIEE2LCAnICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAqKioqKioqIFhFUkJMQSBXQVMgQ0FMTEVEIFdJVEggSU5GTyA9ICcsIEk2LAorICAgICAkICAgICAgJyAqKioqKioqJyApCisqCisqICAgICBFbmQgb2YgWEVSQkxBCisqCisgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvYmxhcy90ZXN0aW5nL3pibGF0My5kYXQgYi9ibGFzL3Rlc3RpbmcvemJsYXQzLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU1MTZmCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL3pibGF0My5kYXQKQEAgLTAsMCArMSwyMyBAQAorJ3pibGF0My5zdW1tJyAgICAgTkFNRSBPRiBTVU1NQVJZIE9VVFBVVCBGSUxFCis2ICAgICAgICAgICAgICAgICBVTklUIE5VTUJFUiBPRiBTVU1NQVJZIEZJTEUKKyd6YmxhdDMuc25hcCcgICAgIE5BTUUgT0YgU05BUFNIT1QgT1VUUFVUIEZJTEUKKy0xICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNOQVBTSE9UIEZJTEUgKE5PVCBVU0VEIElGIC5MVC4gMCkKK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBSRVdJTkQgU05BUFNIT1QgRklMRSBBRlRFUiBFQUNIIFJFQ09SRC4KK0YgICAgICAgIExPR0lDQUwgRkxBRywgVCBUTyBTVE9QIE9OIEZBSUxVUkVTLgorRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFRFU1QgRVJST1IgRVhJVFMuCisxNi4wICAgICBUSFJFU0hPTEQgVkFMVUUgT0YgVEVTVCBSQVRJTworNiAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBOCiswIDEgMiAzIDUgOSAgICAgICBWQUxVRVMgT0YgTgorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBBTFBIQQorKDAuMCwwLjApICgxLjAsMC4wKSAoMC43LC0wLjkpICAgICAgIFZBTFVFUyBPRiBBTFBIQQorMyAgICAgICAgICAgICAgICAgTlVNQkVSIE9GIFZBTFVFUyBPRiBCRVRBCisoMC4wLDAuMCkgKDEuMCwwLjApICgxLjMsLTEuMSkgICAgICAgVkFMVUVTIE9GIEJFVEEKK1pHRU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaSEVNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWlNZTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pUUk1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaVFJTTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWkhFUksgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KK1pTWVJLICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCitaSEVSMksgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorWlNZUjJLIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KZGlmZiAtLWdpdCBhL2JsYXMvdGVzdGluZy96YmxhdDMuZiBiL2JsYXMvdGVzdGluZy96YmxhdDMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmE1MjJmCi0tLSAvZGV2L251bGwKKysrIGIvYmxhcy90ZXN0aW5nL3pibGF0My5mCkBAIC0wLDAgKzEsMzQ0NSBAQAorICAgICAgUFJPR1JBTSBaQkxBVDMKKyoKKyogIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIENPTVBMRVgqMTYgICAgICAgTGV2ZWwgMyBCbGFzLgorKgorKiAgVGhlIHByb2dyYW0gbXVzdCBiZSBkcml2ZW4gYnkgYSBzaG9ydCBkYXRhIGZpbGUuIFRoZSBmaXJzdCAxNCByZWNvcmRzCisqICBvZiB0aGUgZmlsZSBhcmUgcmVhZCB1c2luZyBsaXN0LWRpcmVjdGVkIGlucHV0LCB0aGUgbGFzdCA5IHJlY29yZHMKKyogIGFyZSByZWFkIHVzaW5nIHRoZSBmb3JtYXQgKCBBNiwgTDIgKS4gQW4gYW5ub3RhdGVkIGV4YW1wbGUgb2YgYSBkYXRhCisqICBmaWxlIGNhbiBiZSBvYnRhaW5lZCBieSBkZWxldGluZyB0aGUgZmlyc3QgMyBjaGFyYWN0ZXJzIGZyb20gdGhlCisqICBmb2xsb3dpbmcgMjMgbGluZXM6CisqICAnWkJMQVQzLlNVTU0nICAgICBOQU1FIE9GIFNVTU1BUlkgT1VUUFVUIEZJTEUKKyogIDYgICAgICAgICAgICAgICAgIFVOSVQgTlVNQkVSIE9GIFNVTU1BUlkgRklMRQorKiAgJ1pCTEFUMy5TTkFQJyAgICAgTkFNRSBPRiBTTkFQU0hPVCBPVVRQVVQgRklMRQorKiAgLTEgICAgICAgICAgICAgICAgVU5JVCBOVU1CRVIgT0YgU05BUFNIT1QgRklMRSAoTk9UIFVTRUQgSUYgLkxULiAwKQorKiAgRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFJFV0lORCBTTkFQU0hPVCBGSUxFIEFGVEVSIEVBQ0ggUkVDT1JELgorKiAgRiAgICAgICAgTE9HSUNBTCBGTEFHLCBUIFRPIFNUT1AgT04gRkFJTFVSRVMuCisqICBUICAgICAgICBMT0dJQ0FMIEZMQUcsIFQgVE8gVEVTVCBFUlJPUiBFWElUUy4KKyogIDE2LjAgICAgIFRIUkVTSE9MRCBWQUxVRSBPRiBURVNUIFJBVElPCisqICA2ICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIE4KKyogIDAgMSAyIDMgNSA5ICAgICAgIFZBTFVFUyBPRiBOCisqICAzICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEFMUEhBCisqICAoMC4wLDAuMCkgKDEuMCwwLjApICgwLjcsLTAuOSkgICAgICAgVkFMVUVTIE9GIEFMUEhBCisqICAzICAgICAgICAgICAgICAgICBOVU1CRVIgT0YgVkFMVUVTIE9GIEJFVEEKKyogICgwLjAsMC4wKSAoMS4wLDAuMCkgKDEuMywtMS4xKSAgICAgICBWQUxVRVMgT0YgQkVUQQorKiAgWkdFTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFpIRU1NICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBaU1lNTSAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgWlRSTU0gIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFpUUlNNICBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBaSEVSSyAgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKiAgWlNZUksgIFQgUFVUIEYgRk9SIE5PIFRFU1QuIFNBTUUgQ09MVU1OUy4KKyogIFpIRVIySyBUIFBVVCBGIEZPUiBOTyBURVNULiBTQU1FIENPTFVNTlMuCisqICBaU1lSMksgVCBQVVQgRiBGT1IgTk8gVEVTVC4gU0FNRSBDT0xVTU5TLgorKgorKiAgU2VlOgorKgorKiAgICAgRG9uZ2FycmEgSi4gSi4sIER1IENyb3ogSi4gSi4sIER1ZmYgSS4gUy4gYW5kIEhhbW1hcmxpbmcgUy4KKyogICAgIEEgU2V0IG9mIExldmVsIDMgQmFzaWMgTGluZWFyIEFsZ2VicmEgU3VicHJvZ3JhbXMuCisqCisqICAgICBUZWNobmljYWwgTWVtb3JhbmR1bSBOby44OCAoUmV2aXNpb24gMSksIE1hdGhlbWF0aWNzIGFuZAorKiAgICAgQ29tcHV0ZXIgU2NpZW5jZSBEaXZpc2lvbiwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LCA5NzAwCisqICAgICBTb3V0aCBDYXNzIEF2ZW51ZSwgQXJnb25uZSwgSWxsaW5vaXMgNjA0MzksIFVTLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBOSU4KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5JTiA9IDUgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5TVUJTCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBOU1VCUyA9IDkgKQorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8sIFJIQUxGLCBST05FCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwLCBSSEFMRiA9IDAuNUQwLCBST05FID0gMS4wRDAgKQorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5NQVgKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIE5NQVggPSA2NSApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTklETUFYLCBOQUxNQVgsIE5CRU1BWAorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggTklETUFYID0gOSwgTkFMTUFYID0gNywgTkJFTUFYID0gNyApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRVBTLCBFUlIsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElTTlVNLCBKLCBOLCBOQUxGLCBOQkVULCBOSURJTSwgTk9VVCwgTlRSQQorICAgICAgTE9HSUNBTCAgICAgICAgICAgIEZBVEFMLCBMVEVTVFQsIFJFV0ksIFNBTUUsIFNGQVRBTCwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICAgVFNURVJSCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTlNBLCBUUkFOU0IKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRVQKKyAgICAgIENIQVJBQ1RFUiozMiAgICAgICBTTkFQUywgU1VNTVJZCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBQSggTk1BWCpOTUFYICksIEFCKCBOTUFYLCAyKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBTEYoIE5BTE1BWCApLCBBUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkIoIE5NQVgqTk1BWCApLCBCRVQoIE5CRU1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJTKCBOTUFYKk5NQVggKSwgQyggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENDKCBOTUFYKk5NQVggKSwgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFcoIDIqTk1BWCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklETUFYICkKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMVEVTVCggTlNVQlMgKQorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNOQU1FUyggTlNVQlMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRERJRkYKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMWkUKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBERElGRiwgTFpFCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgICAgICAgICAgIFpDSEsxLCBaQ0hLMiwgWkNISzMsIFpDSEs0LCBaQ0hLNSwgWkNIS0UsIFpNTUNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYLCBNSU4KKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9TUk5BTUMvU1JOQU1UCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBTTkFNRVMvJ1pHRU1NICcsICdaSEVNTSAnLCAnWlNZTU0gJywgJ1pUUk1NICcsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ1pUUlNNICcsICdaSEVSSyAnLCAnWlNZUksgJywgJ1pIRVIySycsCisgICAgICQgICAgICAgICAgICAgICAgICAgJ1pTWVIySycvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyoKKyogICAgIFJlYWQgbmFtZSBhbmQgdW5pdCBudW1iZXIgZm9yIHN1bW1hcnkgb3V0cHV0IGZpbGUgYW5kIG9wZW4gZmlsZS4KKyoKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU1VNTVJZCisgICAgICBSRUFEKCBOSU4sIEZNVCA9ICogKU5PVVQKKyAgICAgIE9QRU4oIE5PVVQsIEZJTEUgPSBTVU1NUlksIFNUQVRVUyA9ICdORVcnICkKKyAgICAgIE5PVVRDID0gTk9VVAorKgorKiAgICAgUmVhZCBuYW1lIGFuZCB1bml0IG51bWJlciBmb3Igc25hcHNob3Qgb3V0cHV0IGZpbGUgYW5kIG9wZW4gZmlsZS4KKyoKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU05BUFMKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTlRSQQorICAgICAgVFJBQ0UgPSBOVFJBLkdFLjAKKyAgICAgIElGKCBUUkFDRSApVEhFTgorICAgICAgICAgT1BFTiggTlRSQSwgRklMRSA9IFNOQVBTLCBTVEFUVVMgPSAnTkVXJyApCisgICAgICBFTkQgSUYKKyogICAgIFJlYWQgdGhlIGZsYWcgdGhhdCBkaXJlY3RzIHJld2luZGluZyBvZiB0aGUgc25hcHNob3QgZmlsZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApUkVXSQorICAgICAgUkVXSSA9IFJFV0kuQU5ELlRSQUNFCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgZGlyZWN0cyBzdG9wcGluZyBvbiBhbnkgZmFpbHVyZS4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApU0ZBVEFMCisqICAgICBSZWFkIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgZXJyb3IgZXhpdHMgYXJlIHRvIGJlIHRlc3RlZC4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVFNURVJSCisqICAgICBSZWFkIHRoZSB0aHJlc2hvbGQgdmFsdWUgb2YgdGhlIHRlc3QgcmF0aW8KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApVEhSRVNICisqCisqICAgICBSZWFkIGFuZCBjaGVjayB0aGUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHRlc3RzLgorKgorKiAgICAgVmFsdWVzIG9mIE4KKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTklESU0KKyAgICAgIElGKCBOSURJTS5MVC4xLk9SLk5JRElNLkdULk5JRE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdOJywgTklETUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIElESU0oIEkgKSwgSSA9IDEsIE5JRElNICkKKyAgICAgIERPIDEwIEkgPSAxLCBOSURJTQorICAgICAgICAgSUYoIElESU0oIEkgKS5MVC4wLk9SLklESU0oIEkgKS5HVC5OTUFYIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApTk1BWAorICAgICAgICAgICAgR08gVE8gMjIwCisgICAgICAgICBFTkQgSUYKKyAgIDEwIENPTlRJTlVFCisqICAgICBWYWx1ZXMgb2YgQUxQSEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkFMRgorICAgICAgSUYoIE5BTEYuTFQuMS5PUi5OQUxGLkdULk5BTE1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdBTFBIQScsIE5BTE1BWAorICAgICAgICAgR08gVE8gMjIwCisgICAgICBFTkQgSUYKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorKiAgICAgVmFsdWVzIG9mIEJFVEEKKyAgICAgIFJFQUQoIE5JTiwgRk1UID0gKiApTkJFVAorICAgICAgSUYoIE5CRVQuTFQuMS5PUi5OQkVULkdULk5CRU1BWCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKSdCRVRBJywgTkJFTUFYCisgICAgICAgICBHTyBUTyAyMjAKKyAgICAgIEVORCBJRgorICAgICAgUkVBRCggTklOLCBGTVQgPSAqICkoIEJFVCggSSApLCBJID0gMSwgTkJFVCApCisqCisqICAgICBSZXBvcnQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCisqCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApKCBJRElNKCBJICksIEkgPSAxLCBOSURJTSApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MyApKCBBTEYoIEkgKSwgSSA9IDEsIE5BTEYgKQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKSggQkVUKCBJICksIEkgPSAxLCBOQkVUICkKKyAgICAgIElGKCAuTk9ULlRTVEVSUiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODQgKQorICAgICAgRU5EIElGCisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApVEhSRVNICisgICAgICBXUklURSggTk9VVCwgRk1UID0gKiApCisqCisqICAgICBSZWFkIG5hbWVzIG9mIHN1YnJvdXRpbmVzIGFuZCBmbGFncyB3aGljaCBpbmRpY2F0ZQorKiAgICAgd2hldGhlciB0aGV5IGFyZSB0byBiZSB0ZXN0ZWQuCisqCisgICAgICBETyAyMCBJID0gMSwgTlNVQlMKKyAgICAgICAgIExURVNUKCBJICkgPSAuRkFMU0UuCisgICAyMCBDT05USU5VRQorICAgMzAgUkVBRCggTklOLCBGTVQgPSA5OTg4LCBFTkQgPSA2MCApU05BTUVULCBMVEVTVFQKKyAgICAgIERPIDQwIEkgPSAxLCBOU1VCUworICAgICAgICAgSUYoIFNOQU1FVC5FUS5TTkFNRVMoIEkgKSApCisgICAgICQgICAgICBHTyBUTyA1MAorICAgNDAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkwIClTTkFNRVQKKyAgICAgIFNUT1AKKyAgIDUwIExURVNUKCBJICkgPSBMVEVTVFQKKyAgICAgIEdPIFRPIDMwCisqCisgICA2MCBDT05USU5VRQorICAgICAgQ0xPU0UgKCBOSU4gKQorKgorKiAgICAgQ29tcHV0ZSBFUFMgKHRoZSBtYWNoaW5lIHByZWNpc2lvbikuCisqCisgICAgICBFUFMgPSBST05FCisgICA3MCBDT05USU5VRQorICAgICAgSUYoIERESUZGKCBST05FICsgRVBTLCBST05FICkuRVEuUlpFUk8gKQorICAgICAkICAgR08gVE8gODAKKyAgICAgIEVQUyA9IFJIQUxGKkVQUworICAgICAgR08gVE8gNzAKKyAgIDgwIENPTlRJTlVFCisgICAgICBFUFMgPSBFUFMgKyBFUFMKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClFUFMKKyoKKyogICAgIENoZWNrIHRoZSByZWxpYWJpbGl0eSBvZiBaTU1DSCB1c2luZyBleGFjdCBkYXRhLgorKgorICAgICAgTiA9IE1JTiggMzIsIE5NQVggKQorICAgICAgRE8gMTAwIEogPSAxLCBOCisgICAgICAgICBETyA5MCBJID0gMSwgTgorICAgICAgICAgICAgQUIoIEksIEogKSA9IE1BWCggSSAtIEogKyAxLCAwICkKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICAgICBBQiggSiwgTk1BWCArIDEgKSA9IEoKKyAgICAgICAgIEFCKCAxLCBOTUFYICsgSiApID0gSgorICAgICAgICAgQyggSiwgMSApID0gWkVSTworICAxMDAgQ09OVElOVUUKKyAgICAgIERPIDExMCBKID0gMSwgTgorICAgICAgICAgQ0MoIEogKSA9IEoqKCAoIEogKyAxICkqSiApLzIgLSAoICggSiArIDEgKSpKKiggSiAtIDEgKSApLzMKKyAgMTEwIENPTlRJTlVFCisqICAgICBDQyBob2xkcyB0aGUgZXhhY3QgcmVzdWx0LiBPbiBleGl0IGZyb20gWk1NQ0ggQ1QgaG9sZHMKKyogICAgIHRoZSByZXN1bHQgY29tcHV0ZWQgYnkgWk1NQ0guCisgICAgICBUUkFOU0EgPSAnTicKKyAgICAgIFRSQU5TQiA9ICdOJworICAgICAgQ0FMTCBaTU1DSCggVFJBTlNBLCBUUkFOU0IsIE4sIDEsIE4sIE9ORSwgQUIsIE5NQVgsCisgICAgICQgICAgICAgICAgICBBQiggMSwgTk1BWCArIDEgKSwgTk1BWCwgWkVSTywgQywgTk1BWCwgQ1QsIEcsIENDLAorICAgICAkICAgICAgICAgICAgTk1BWCwgRVBTLCBFUlIsIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgU0FNRSA9IExaRSggQ0MsIENULCBOICkKKyAgICAgIElGKCAuTk9ULlNBTUUuT1IuRVJSLk5FLlJaRVJPIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk4OSApVFJBTlNBLCBUUkFOU0IsIFNBTUUsIEVSUgorICAgICAgICAgU1RPUAorICAgICAgRU5EIElGCisgICAgICBUUkFOU0IgPSAnQycKKyAgICAgIENBTEwgWk1NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMWkUoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5SWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKVRSQU5TQSwgVFJBTlNCLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorICAgICAgRE8gMTIwIEogPSAxLCBOCisgICAgICAgICBBQiggSiwgTk1BWCArIDEgKSA9IE4gLSBKICsgMQorICAgICAgICAgQUIoIDEsIE5NQVggKyBKICkgPSBOIC0gSiArIDEKKyAgMTIwIENPTlRJTlVFCisgICAgICBETyAxMzAgSiA9IDEsIE4KKyAgICAgICAgIENDKCBOIC0gSiArIDEgKSA9IEoqKCAoIEogKyAxICkqSiApLzIgLQorICAgICAkICAgICAgICAgICAgICAgICAgICAgKCAoIEogKyAxICkqSiooIEogLSAxICkgKS8zCisgIDEzMCBDT05USU5VRQorICAgICAgVFJBTlNBID0gJ0MnCisgICAgICBUUkFOU0IgPSAnTicKKyAgICAgIENBTEwgWk1NQ0goIFRSQU5TQSwgVFJBTlNCLCBOLCAxLCBOLCBPTkUsIEFCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgQUIoIDEsIE5NQVggKyAxICksIE5NQVgsIFpFUk8sIEMsIE5NQVgsIENULCBHLCBDQywKKyAgICAgJCAgICAgICAgICAgIE5NQVgsIEVQUywgRVJSLCBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgIFNBTUUgPSBMWkUoIENDLCBDVCwgTiApCisgICAgICBJRiggLk5PVC5TQU1FLk9SLkVSUi5ORS5SWkVSTyApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5ODkgKVRSQU5TQSwgVFJBTlNCLCBTQU1FLCBFUlIKKyAgICAgICAgIFNUT1AKKyAgICAgIEVORCBJRgorICAgICAgVFJBTlNCID0gJ0MnCisgICAgICBDQUxMIFpNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTiwgMSwgTiwgT05FLCBBQiwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgIEFCKCAxLCBOTUFYICsgMSApLCBOTUFYLCBaRVJPLCBDLCBOTUFYLCBDVCwgRywgQ0MsCisgICAgICQgICAgICAgICAgICBOTUFYLCBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICBTQU1FID0gTFpFKCBDQywgQ1QsIE4gKQorICAgICAgSUYoIC5OT1QuU0FNRS5PUi5FUlIuTkUuUlpFUk8gKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg5IClUUkFOU0EsIFRSQU5TQiwgU0FNRSwgRVJSCisgICAgICAgICBTVE9QCisgICAgICBFTkQgSUYKKyoKKyogICAgIFRlc3QgZWFjaCBzdWJyb3V0aW5lIGluIHR1cm4uCisqCisgICAgICBETyAyMDAgSVNOVU0gPSAxLCBOU1VCUworICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgSUYoIC5OT1QuTFRFU1QoIElTTlVNICkgKVRIRU4KKyogICAgICAgICAgIFN1YnByb2dyYW0gaXMgbm90IHRvIGJlIHRlc3RlZC4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg3IClTTkFNRVMoIElTTlVNICkKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFNSTkFNVCA9IFNOQU1FUyggSVNOVU0gKQorKiAgICAgICAgICAgVGVzdCBlcnJvciBleGl0cy4KKyAgICAgICAgICAgIElGKCBUU1RFUlIgKVRIRU4KKyAgICAgICAgICAgICAgIENBTEwgWkNIS0UoIElTTlVNLCBTTkFNRVMoIElTTlVNICksIE5PVVQgKQorICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9ICogKQorICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICBUZXN0IGNvbXB1dGF0aW9ucy4KKyAgICAgICAgICAgIElORk9UID0gMAorICAgICAgICAgICAgT0sgPSAuVFJVRS4KKyAgICAgICAgICAgIEZBVEFMID0gLkZBTFNFLgorICAgICAgICAgICAgR08gVE8gKCAxNDAsIDE1MCwgMTUwLCAxNjAsIDE2MCwgMTcwLCAxNzAsCisgICAgICQgICAgICAgICAgICAgIDE4MCwgMTgwIClJU05VTQorKiAgICAgICAgICAgVGVzdCBaR0VNTSwgMDEuCisgIDE0MCAgICAgICBDQUxMIFpDSEsxKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDLAorICAgICAkICAgICAgICAgICAgICAgICAgQ0MsIENTLCBDVCwgRyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgWkhFTU0sIDAyLCBaU1lNTSwgMDMuCisgIDE1MCAgICAgICBDQUxMIFpDSEsyKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBBQiggMSwgTk1BWCArIDEgKSwgQkIsIEJTLCBDLAorICAgICAkICAgICAgICAgICAgICAgICAgQ0MsIENTLCBDVCwgRyApCisgICAgICAgICAgICBHTyBUTyAxOTAKKyogICAgICAgICAgIFRlc3QgWlRSTU0sIDA0LCBaVFJTTSwgMDUuCisgIDE2MCAgICAgICBDQUxMIFpDSEszKCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOTUFYLCBBQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQ1QsIEcsIEMgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IFpIRVJLLCAwNiwgWlNZUkssIDA3LgorICAxNzAgICAgICAgQ0FMTCBaQ0hLNCggU05BTUVTKCBJU05VTSApLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsCisgICAgICQgICAgICAgICAgICAgICAgICBSRVdJLCBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULAorICAgICAkICAgICAgICAgICAgICAgICAgTk1BWCwgQUIsIEFBLCBBUywgQUIoIDEsIE5NQVggKyAxICksIEJCLCBCUywgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgIENDLCBDUywgQ1QsIEcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqICAgICAgICAgICBUZXN0IFpIRVIySywgMDgsIFpTWVIySywgMDkuCisgIDE4MCAgICAgICBDQUxMIFpDSEs1KCBTTkFNRVMoIElTTlVNICksIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFJFV0ksIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBOTUFYLCBBQiwgQUEsIEFTLCBCQiwgQlMsIEMsIENDLCBDUywgQ1QsIEcsIFcgKQorICAgICAgICAgICAgR08gVE8gMTkwCisqCisgIDE5MCAgICAgICBJRiggRkFUQUwuQU5ELlNGQVRBTCApCisgICAgICQgICAgICAgICBHTyBUTyAyMTAKKyAgICAgICAgIEVORCBJRgorICAyMDAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg2ICkKKyAgICAgIEdPIFRPIDIzMAorKgorICAyMTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTg1ICkKKyAgICAgIEdPIFRPIDIzMAorKgorICAyMjAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTkxICkKKyoKKyAgMjMwIENPTlRJTlVFCisgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgQ0xPU0UgKCBOVFJBICkKKyAgICAgIENMT1NFICggTk9VVCApCisgICAgICBTVE9QCisqCisgOTk5OSBGT1JNQVQoICcgUk9VVElORVMgUEFTUyBDT01QVVRBVElPTkFMIFRFU1RTIElGIFRFU1QgUkFUSU8gSVMgTEVTJywKKyAgICAgJCAgICAgICdTIFRIQU4nLCBGOC4yICkKKyA5OTk4IEZPUk1BVCggJyBSRUxBVElWRSBNQUNISU5FIFBSRUNJU0lPTiBJUyBUQUtFTiBUTyBCRScsIDFQLCBEOS4xICkKKyA5OTk3IEZPUk1BVCggJyBOVU1CRVIgT0YgVkFMVUVTIE9GICcsIEEsICcgSVMgTEVTUyBUSEFOIDEgT1IgR1JFQVRFUiAnLAorICAgICAkICAgICAgJ1RIQU4gJywgSTIgKQorIDk5OTYgRk9STUFUKCAnIFZBTFVFIE9GIE4gSVMgTEVTUyBUSEFOIDAgT1IgR1JFQVRFUiBUSEFOICcsIEkyICkKKyA5OTk1IEZPUk1BVCggJyBURVNUUyBPRiBUSEUgQ09NUExFWCoxNiAgICAgICBMRVZFTCAzIEJMQVMnLCAvLycgVEhFIEYnLAorICAgICAkICAgICAgJ09MTE9XSU5HIFBBUkFNRVRFUiBWQUxVRVMgV0lMTCBCRSBVU0VEOicgKQorIDk5OTQgRk9STUFUKCAnICAgRk9SIE4gICAgICAgICAgICAgICcsIDlJNiApCisgOTk5MyBGT1JNQVQoICcgICBGT1IgQUxQSEEgICAgICAgICAgJywKKyAgICAgJCAgICAgIDcoICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSAgJywgOiApICkKKyA5OTkyIEZPUk1BVCggJyAgIEZPUiBCRVRBICAgICAgICAgICAnLAorICAgICAkICAgICAgNyggJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpICAnLCA6ICkgKQorIDk5OTEgRk9STUFUKCAnIEFNRU5EIERBVEEgRklMRSBPUiBJTkNSRUFTRSBBUlJBWSBTSVpFUyBJTiBQUk9HUkFNJywKKyAgICAgJCAgICAgIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTkwIEZPUk1BVCggJyBTVUJQUk9HUkFNIE5BTUUgJywgQTYsICcgTk9UIFJFQ09HTklaRUQnLCAvJyAqKioqKioqIFQnLAorICAgICAkICAgICAgJ0VTVFMgQUJBTkRPTkVEICoqKioqKionICkKKyA5OTg5IEZPUk1BVCggJyBFUlJPUiBJTiBaTU1DSCAtICBJTi1MSU5FIERPVCBQUk9EVUNUUyBBUkUgQkVJTkcgRVZBTFUnLAorICAgICAkICAgICAgJ0FURUQgV1JPTkdMWS4nLCAvJyBaTU1DSCBXQVMgQ0FMTEVEIFdJVEggVFJBTlNBID0gJywgQTEsCisgICAgICQgICAgICAnIEFORCBUUkFOU0IgPSAnLCBBMSwgLycgQU5EIFJFVFVSTkVEIFNBTUUgPSAnLCBMMSwgJyBBTkQgJywKKyAgICAgJCAgICAgICdFUlIgPSAnLCBGMTIuMywgJy4nLCAvJyBUSElTIE1BWSBCRSBEVUUgVE8gRkFVTFRTIElOIFRIRSAnLAorICAgICAkICAgICAgJ0FSSVRITUVUSUMgT1IgVEhFIENPTVBJTEVSLicsIC8nICoqKioqKiogVEVTVFMgQUJBTkRPTkVEICcsCisgICAgICQgICAgICAnKioqKioqKicgKQorIDk5ODggRk9STUFUKCBBNiwgTDIgKQorIDk5ODcgRk9STUFUKCAxWCwgQTYsICcgV0FTIE5PVCBURVNURUQnICkKKyA5OTg2IEZPUk1BVCggLycgRU5EIE9GIFRFU1RTJyApCisgOTk4NSBGT1JNQVQoIC8nICoqKioqKiogRkFUQUwgRVJST1IgLSBURVNUUyBBQkFORE9ORUQgKioqKioqKicgKQorIDk5ODQgRk9STUFUKCAnIEVSUk9SLUVYSVRTIFdJTEwgTk9UIEJFIFRFU1RFRCcgKQorKgorKiAgICAgRW5kIG9mIFpCTEFUMy4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaQ0hLMSggU05BTUUsIEVQUywgVEhSRVNILCBOT1VULCBOVFJBLCBUUkFDRSwgUkVXSSwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEZBVEFMLCBOSURJTSwgSURJTSwgTkFMRiwgQUxGLCBOQkVULCBCRVQsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICBBLCBBQSwgQVMsIEIsIEJCLCBCUywgQywgQ0MsIENTLCBDVCwgRyApCisqCisqICBUZXN0cyBaR0VNTS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDQyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUworICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ0EsIElDQiwgSUssIElNLCBJTiwgSywgS1MsIExBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMQkIsIExDQywgTERBLCBMREFTLCBMREIsIExEQlMsIExEQywgTERDUywgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBNQSwgTUIsIE1TLCBOLCBOQSwgTkFSR1MsIE5CLCBOQywgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBOVUxMLCBSRVNFVCwgU0FNRSwgVFJBTkEsIFRSQU5CCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVFJBTkFTLCBUUkFOQlMsIFRSQU5TQSwgVFJBTlNCCisgICAgICBDSEFSQUNURVIqMyAgICAgICAgSUNICisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFpFLCBMWkVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMWkUsIExaRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBaR0VNTSwgWk1BS0UsIFpNTUNICisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgTUFYCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSC8nTlRDJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgTkFSR1MgPSAxMworICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gUlpFUk8KKyoKKyAgICAgIERPIDExMCBJTSA9IDEsIE5JRElNCisgICAgICAgICBNID0gSURJTSggSU0gKQorKgorICAgICAgICAgRE8gMTAwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQyA9IE0KKyAgICAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyAxMDAKKyAgICAgICAgICAgIExDQyA9IExEQypOCisgICAgICAgICAgICBOVUxMID0gTi5MRS4wLk9SLk0uTEUuMAorKgorICAgICAgICAgICAgRE8gOTAgSUsgPSAxLCBOSURJTQorICAgICAgICAgICAgICAgSyA9IElESU0oIElLICkKKyoKKyAgICAgICAgICAgICAgIERPIDgwIElDQSA9IDEsIDMKKyAgICAgICAgICAgICAgICAgIFRSQU5TQSA9IElDSCggSUNBOiBJQ0EgKQorICAgICAgICAgICAgICAgICAgVFJBTkEgPSBUUkFOU0EuRVEuJ1QnLk9SLlRSQU5TQS5FUS4nQycKKyoKKyAgICAgICAgICAgICAgICAgIElGKCBUUkFOQSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgTUEgPSBLCisgICAgICAgICAgICAgICAgICAgICBOQSA9IE0KKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgIE1BID0gTQorICAgICAgICAgICAgICAgICAgICAgTkEgPSBLCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgICAgTERBID0gTUEKKyAgICAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICAgICBHTyBUTyA4MAorICAgICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisqICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBLCBOTUFYLCBBQSwgTERBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgRE8gNzAgSUNCID0gMSwgMworICAgICAgICAgICAgICAgICAgICAgVFJBTlNCID0gSUNIKCBJQ0I6IElDQiApCisgICAgICAgICAgICAgICAgICAgICBUUkFOQiA9IFRSQU5TQi5FUS4nVCcuT1IuVFJBTlNCLkVRLidDJworKgorICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU5CIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICBNQiA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5CID0gSworICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgTUIgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBOQiA9IE4KKyAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKiAgICAgICAgICAgICAgICAgICAgU2V0IExEQiB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICAgICAgICAgICAgICBMREIgPSBNQgorICAgICAgICAgICAgICAgICAgICAgSUYoIExEQi5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIExEQiA9IExEQiArIDEKKyogICAgICAgICAgICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgICAgICAgICAgSUYoIExEQi5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgICAgICAgICAgIEdPIFRPIDcwCisgICAgICAgICAgICAgICAgICAgICBMQkIgPSBMREIqTkIKKyoKKyogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCBNQiwgTkIsIEIsIE5NQVgsIEJCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBDLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQywgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTkFTID0gVFJBTlNBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOQlMgPSBUUkFOU0IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TID0gTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExDQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MoIEkgKSA9IENDKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMRENTID0gTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywgQUxQSEEsIExEQSwgTERCLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaR0VNTSggVFJBTlNBLCBUUkFOU0IsIE0sIE4sIEssIEFMUEhBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUEsIExEQSwgQkIsIExEQiwgQkVUQSwgQ0MsIExEQyApCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVFJBTlNBLkVRLlRSQU5BUworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFRSQU5TQi5FUS5UUkFOQlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBNUy5FUS5NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gTlMuRVEuTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEtTLkVRLksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExaRSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMREJTLkVRLkxEQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBCTFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIE5VTEwgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTFpFKCBDUywgQ0MsIExDQyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTIgKSA9IExaRVJFUyggJ0dFJywgJyAnLCBNLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMyApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBLCBOTUFYLCBCLCBOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQywgTk1BWCwgQ1QsIEcsIENDLCBMREMsIEVQUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUiwgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJNQVggPSBNQVgoIEVSUk1BWCwgRVJSICkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGdvdCByZWFsbHkgYmFkIGFuc3dlciwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIEZBVEFMICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgICAgQ09OVElOVUUKKyoKKyAgMTAwICAgIENPTlRJTlVFCisqCisgIDExMCBDT05USU5VRQorKgorKiAgICAgUmVwb3J0IHJlc3VsdC4KKyoKKyAgICAgIElGKCBFUlJNQVguTFQuVEhSRVNIIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApU05BTUUsIE5DCisgICAgICBFTFNFCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApU05BTUUsIE5DLCBFUlJNQVgKKyAgICAgIEVORCBJRgorICAgICAgR08gVE8gMTMwCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NSApTkMsIFNOQU1FLCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgSywKKyAgICAgJCAgIEFMUEhBLCBMREEsIExEQiwgQkVUQSwgTERDCisqCisgIDEzMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJycnLCBBMSwgJycnLCcnJywgQTEsICcnJywnLAorICAgICAkICAgICAgMyggSTMsICcsJyApLCAnKCcsIEY0LjEsICcsJywgRjQuMSwgJyksIEEsJywgSTMsICcsIEIsJywgSTMsCisgICAgICQgICAgICAnLCgnLCBGNC4xLCAnLCcsIEY0LjEsICcpLCBDLCcsIEkzLCAnKS4nICkKKyA5OTk0IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFpDSEsxLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpDSEsyKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEEsIEFBLCBBUywgQiwgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHICkKKyoKKyogIFRlc3RzIFpIRU1NIGFuZCBaU1lNTS4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5CRVQsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJFVCggTkJFVCApLCBCUyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQyggTk1BWCwgTk1BWCApLCBDQyggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJMUworICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ1MsIElDVSwgSU0sIElOLCBMQUEsIExCQiwgTENDLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQSwgTERBUywgTERCLCBMREJTLCBMREMsIExEQ1MsIE0sIE1TLCBOLCBOQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBOQVJHUywgTkMsIE5TCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgQ09OSiwgTEVGVCwgTlVMTCwgUkVTRVQsIFNBTUUKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBTSURFLCBTSURFUywgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hTLCBJQ0hVCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFpFLCBMWkVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMWkUsIExaRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBaSEVNTSwgWk1BS0UsIFpNTUNILCBaU1lNTQorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIE1BWAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hTLydMUicvLCBJQ0hVLydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIENPTkogPSBTTkFNRSggMjogMyApLkVRLidIRScKKyoKKyAgICAgIE5BUkdTID0gMTIKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMDAgSU0gPSAxLCBOSURJTQorICAgICAgICAgTSA9IElESU0oIElNICkKKyoKKyAgICAgICAgIERPIDkwIElOID0gMSwgTklESU0KKyAgICAgICAgICAgIE4gPSBJRElNKCBJTiApCisqICAgICAgICAgICBTZXQgTERDIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQyA9IE0KKyAgICAgICAgICAgIElGKCBMREMuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREMgPSBMREMgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREMuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyA5MAorICAgICAgICAgICAgTENDID0gTERDKk4KKyAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAuT1IuTS5MRS4wCisqICAgICAgICAgICBTZXQgTERCIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgIExEQiA9IE0KKyAgICAgICAgICAgIElGKCBMREIuTFQuTk1BWCApCisgICAgICQgICAgICAgICBMREIgPSBMREIgKyAxCisqICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgIElGKCBMREIuR1QuTk1BWCApCisgICAgICQgICAgICAgICBHTyBUTyA5MAorICAgICAgICAgICAgTEJCID0gTERCKk4KKyoKKyogICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBCLCBOTUFYLCBCQiwgTERCLCBSRVNFVCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIFpFUk8gKQorKgorICAgICAgICAgICAgRE8gODAgSUNTID0gMSwgMgorICAgICAgICAgICAgICAgU0lERSA9IElDSFMoIElDUzogSUNTICkKKyAgICAgICAgICAgICAgIExFRlQgPSBTSURFLkVRLidMJworKgorICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIE5BID0gTQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTkEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyA4MAorICAgICAgICAgICAgICAgTEFBID0gTERBKk5BCisqCisgICAgICAgICAgICAgICBETyA3MCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorKgorKiAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIGhlcm1pdGlhbiBvciBzeW1tZXRyaWMgbWF0cml4IEEuCisqCisgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE5BLCBOQSwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFBLCBMREEsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgIERPIDYwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyAgICAgICAgICAgICAgICAgICAgIERPIDUwIElCID0gMSwgTkJFVAorICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IEJFVCggSUIgKQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBDLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIE0sIE4sIEMsIE5NQVgsIENDLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBTSURFUyA9IFNJREUKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgTVMgPSBNCisgICAgICAgICAgICAgICAgICAgICAgICBOUyA9IE4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorICAgICAgICAgICAgICAgICAgICAgICAgQkxTID0gQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsIExDQworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MoIEkgKSA9IENDKCBJICkKKyAgIDMwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMRENTID0gTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsIFNJREUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICBVUExPLCBNLCBOLCBBTFBIQSwgTERBLCBMREIsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpIRU1NKCBTSURFLCBVUExPLCBNLCBOLCBBTFBIQSwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEJFVEEsIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaU1lNTSggU0lERSwgVVBMTywgTSwgTiwgQUxQSEEsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDExMAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFNJREVTLkVRLlNJREUKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBVUExPUy5FUS5VUExPCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMyApID0gTVMuRVEuTQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDQgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA1ICkgPSBBTFMuRVEuQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IExaRSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExEQlMuRVEuTERCCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IEJMUy5FUS5CRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMWkUoIENTLCBDQywgTENDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTFpFUkVTKCAnR0UnLCAnICcsIE0sIE4sIENTLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEyICkgPSBMRENTLkVRLkxEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgSWYgZGF0YSB3YXMgaW5jb3JyZWN0bHkgY2hhbmdlZCwgcmVwb3J0IGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIE5BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gU0FNRS5BTkQuSVNBTUUoIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuSVNBTUUoIEkgKSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSQorICAgNDAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULlNBTUUgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuTlVMTCApVEhFTgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlIHJlc3VsdC4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCAnTicsICdOJywgTSwgTiwgTSwgQUxQSEEsIEEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBCLCBOTUFYLCBCRVRBLCBDLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1QsIEcsIENDLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCAnTicsICdOJywgTSwgTiwgTiwgQUxQSEEsIEIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBBLCBOTUFYLCBCRVRBLCBDLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1QsIEcsIENDLCBMREMsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDUwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA2MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNzAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDgwICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICBDT05USU5VRQorKgorICAxMDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDEyMAorKgorICAxMTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgU0lERSwgVVBMTywgTSwgTiwgQUxQSEEsIExEQSwKKyAgICAgJCAgIExEQiwgQkVUQSwgTERDCisqCisgIDEyMCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgQiwnLCBJMywgJywoJywgRjQuMSwKKyAgICAgJCAgICAgICcsJywgRjQuMSwgJyksIEMsJywgSTMsICcpICAgIC4nICkKKyA5OTk0IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFpDSEsyLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpDSEszKCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5NQVgsIEEsIEFBLCBBUywKKyAgICAgJCAgICAgICAgICAgICAgICAgIEIsIEJCLCBCUywgQ1QsIEcsIEMgKQorKgorKiAgVGVzdHMgWlRSTU0gYW5kIFpUUlNNLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBSWkVSTyA9IDAuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUFMsIFRIUkVTSAorICAgICAgSU5URUdFUiAgICAgICAgICAgIE5BTEYsIE5JRElNLCBOTUFYLCBOT1VULCBOVFJBCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgRkFUQUwsIFJFV0ksIFRSQUNFCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU05BTUUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEEoIE5NQVgsIE5NQVggKSwgQUEoIE5NQVgqTk1BWCApLCBBTEYoIE5BTEYgKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBUyggTk1BWCpOTUFYICksIEIoIE5NQVgsIE5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBCQiggTk1BWCpOTUFYICksIEJTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDKCBOTUFYLCBOTUFYICksIENUKCBOTUFYICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQUxQSEEsIEFMUworICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElDRCwgSUNTLCBJQ1QsIElDVSwgSU0sIElOLCBKLCBMQUEsIExCQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMREEsIExEQVMsIExEQiwgTERCUywgTSwgTVMsIE4sIE5BLCBOQVJHUywgTkMsCisgICAgICQgICAgICAgICAgICAgICAgICAgTlMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRUZULCBOVUxMLCBSRVNFVCwgU0FNRQorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIERJQUcsIERJQUdTLCBTSURFLCBTSURFUywgVFJBTkFTLCBUUkFOU0EsIFVQTE8sCisgICAgICQgICAgICAgICAgICAgICAgICAgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hELCBJQ0hTLCBJQ0hVCisgICAgICBDSEFSQUNURVIqMyAgICAgICAgSUNIVAorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgSVNBTUUoIDEzICkKKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExaRSwgTFpFUkVTCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgTFpFLCBMWkVSRVMKKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCAgICAgICAgICAgWk1BS0UsIFpNTUNILCBaVFJNTSwgWlRSU00KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBNQVgKKyogICAgIC4uIFNjYWxhcnMgaW4gQ29tbW9uIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSU5GT1QsIE5PVVRDCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVRDLCBPSywgTEVSUgorKiAgICAgLi4gRGF0YSBzdGF0ZW1lbnRzIC4uCisgICAgICBEQVRBICAgICAgICAgICAgICAgSUNIVS8nVUwnLywgSUNIVC8nTlRDJy8sIElDSEQvJ1VOJy8sIElDSFMvJ0xSJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKgorICAgICAgTkFSR1MgPSAxMQorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gUlpFUk8KKyogICAgIFNldCB1cCB6ZXJvIG1hdHJpeCBmb3IgWk1NQ0guCisgICAgICBETyAyMCBKID0gMSwgTk1BWAorICAgICAgICAgRE8gMTAgSSA9IDEsIE5NQVgKKyAgICAgICAgICAgIEMoIEksIEogKSA9IFpFUk8KKyAgIDEwICAgIENPTlRJTlVFCisgICAyMCBDT05USU5VRQorKgorICAgICAgRE8gMTQwIElNID0gMSwgTklESU0KKyAgICAgICAgIE0gPSBJRElNKCBJTSApCisqCisgICAgICAgICBETyAxMzAgSU4gPSAxLCBOSURJTQorICAgICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgICAgIFNldCBMREIgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgTERCID0gTQorICAgICAgICAgICAgSUYoIExEQi5MVC5OTUFYICkKKyAgICAgJCAgICAgICAgIExEQiA9IExEQiArIDEKKyogICAgICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgICAgSUYoIExEQi5HVC5OTUFYICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDEzMAorICAgICAgICAgICAgTEJCID0gTERCKk4KKyAgICAgICAgICAgIE5VTEwgPSBNLkxFLjAuT1IuTi5MRS4wCisqCisgICAgICAgICAgICBETyAxMjAgSUNTID0gMSwgMgorICAgICAgICAgICAgICAgU0lERSA9IElDSFMoIElDUzogSUNTICkKKyAgICAgICAgICAgICAgIExFRlQgPSBTSURFLkVRLidMJworICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgIE5BID0gTQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTkQgSUYKKyogICAgICAgICAgICAgIFNldCBMREEgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgICAgICAgTERBID0gTkEKKyAgICAgICAgICAgICAgIElGKCBMREEuTFQuTk1BWCApCisgICAgICQgICAgICAgICAgICBMREEgPSBMREEgKyAxCisqICAgICAgICAgICAgICBTa2lwIHRlc3RzIGlmIG5vdCBlbm91Z2ggcm9vbS4KKyAgICAgICAgICAgICAgIElGKCBMREEuR1QuTk1BWCApCisgICAgICQgICAgICAgICAgICBHTyBUTyAxMzAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorICAgICAgICAgICAgICAgRE8gMTEwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisqCisgICAgICAgICAgICAgICAgICBETyAxMDAgSUNUID0gMSwgMworICAgICAgICAgICAgICAgICAgICAgVFJBTlNBID0gSUNIVCggSUNUOiBJQ1QgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gOTAgSUNEID0gMSwgMgorICAgICAgICAgICAgICAgICAgICAgICAgRElBRyA9IElDSEQoIElDRDogSUNEICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDgwIElBID0gMSwgTkFMRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBBTEYoIElBICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdUUicsIFVQTE8sIERJQUcsIE5BLCBOQSwgQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIEFBLCBMREEsIFJFU0VULCBaRVJPICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCBNLCBOLCBCLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgUkVTRVQsIFpFUk8gKQorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTkMgPSBOQyArIDEKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgZXZlcnkgZGF0dW0gYmVmb3JlIGNhbGxpbmcgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERVMgPSBTSURFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVUExPUyA9IFVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5BUyA9IFRSQU5TQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRElBR1MgPSBESUFHCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNUyA9IE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTKCBJICkgPSBBQSggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBUyA9IExEQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsIExCQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlMoIEkgKSA9IEJCKCBJICkKKyAgIDQwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMREJTID0gTERCCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFNOQU1FKCA0OiA1ICkuRVEuJ01NJyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQUNFICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOVFJBLCBGTVQgPSA5OTk1IClOQywgU05BTUUsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBTSURFLCBVUExPLCBUUkFOU0EsIERJQUcsIE0sIE4sIEFMUEhBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBMREIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpUUk1NKCBTSURFLCBVUExPLCBUUkFOU0EsIERJQUcsIE0sCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBBTFBIQSwgQUEsIExEQSwgQkIsIExEQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTTkFNRSggNDogNSApLkVRLidTTScgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NSApTkMsIFNOQU1FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLCBOLCBBTFBIQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgTERCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaVFJTTSggU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiwgQUxQSEEsIEFBLCBMREEsIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gU0lERVMuRVEuU0lERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBUUkFOQVMuRVEuVFJBTlNBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gRElBR1MuRVEuRElBRworICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IE1TLkVRLk0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNyApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFpFKCBBUywgQUEsIExBQSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERBUy5FUS5MREEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBOVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IExaRSggQlMsIEJCLCBMQkIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEwICkgPSBMWkVSRVMoICdHRScsICcgJywgTSwgTiwgQlMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTEgKSA9IExEQlMuRVEuTERCCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBkYXRhIHdhcyBpbmNvcnJlY3RseSBjaGFuZ2VkLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FID0gLlRSVUUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gMSwgTkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSBTQU1FLkFORC5JU0FNRSggSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5JU0FNRSggSSApICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJCisgICA1MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIC5OT1QuU0FNRSApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5OVUxMIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggU05BTUUoIDQ6IDUgKS5FUS4nTU0nIClUSEVOCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayB0aGUgcmVzdWx0LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIExFRlQgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1NQ0goIFRSQU5TQSwgJ04nLCBNLCBOLCBNLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEsIEEsIE5NQVgsIEIsIE5NQVgsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRVJPLCBDLCBOTUFYLCBDVCwgRywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCLCBMREIsIEVQUywgRVJSLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwsIE5PVVQsIC5UUlVFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCAnTicsIFRSQU5TQSwgTSwgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBCLCBOTUFYLCBBLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTywgQywgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiwgTERCLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTTkFNRSggNDogNSApLkVRLidTTScgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgYXBwcm94aW1hdGlvbiB0byBvcmlnaW5hbAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LgorKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSiA9IDEsIE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDYwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCBJLCBKICkgPSBCQiggSSArICggSiAtIDEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQiggSSArICggSiAtIDEgKSpMREIgKSA9IEFMUEhBKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiggSSwgSiApCisgICA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgNzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBMRUZUIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCBUUkFOU0EsICdOJywgTSwgTiwgTSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQSwgTk1BWCwgQywgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEIsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLkZBTFNFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCAnTicsIFRSQU5TQSwgTSwgTiwgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQywgTk1BWCwgQSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFUk8sIEIsIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkIsIExEQiwgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLkZBTFNFLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorICAgODAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDkwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMTAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTIwICAgICAgIENPTlRJTlVFCisqCisgIDEzMCAgICBDT05USU5VRQorKgorICAxNDAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE2MAorKgorICAxNTAgQ09OVElOVUUKKyAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk2IClTTkFNRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKU5DLCBTTkFNRSwgU0lERSwgVVBMTywgVFJBTlNBLCBESUFHLCBNLAorICAgICAkICAgTiwgQUxQSEEsIExEQSwgTERCCisqCisgIDE2MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgNCggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgQiwnLCBJMywgJykgICAgICAgICAnLAorICAgICAkICAgICAgJyAgICAgIC4nICkKKyA5OTk0IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gRVJST1ItRVhJVCBUQUtFTiBPTiBWQUxJRCBDQUxMIConLAorICAgICAkICAgICAgJyoqKioqKicgKQorKgorKiAgICAgRW5kIG9mIFpDSEszLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpDSEs0KCBTTkFNRSwgRVBTLCBUSFJFU0gsIE5PVVQsIE5UUkEsIFRSQUNFLCBSRVdJLAorICAgICAkICAgICAgICAgICAgICAgICAgRkFUQUwsIE5JRElNLCBJRElNLCBOQUxGLCBBTEYsIE5CRVQsIEJFVCwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEEsIEFBLCBBUywgQiwgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHICkKKyoKKyogIFRlc3RzIFpIRVJLIGFuZCBaU1lSSy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkVSTworICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJPTkUsIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBST05FID0gMS4wRDAsIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTkJFVCwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTk1BWCwgTk1BWCApLCBBQSggTk1BWCpOTUFYICksIEFMRiggTkFMRiApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEFTKCBOTUFYKk5NQVggKSwgQiggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIEJCKCBOTUFYKk5NQVggKSwgQkVUKCBOQkVUICksIEJTKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDKCBOTUFYLCBOTUFYICksIENDKCBOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDUyggTk1BWCpOTUFYICksIENUKCBOTUFYICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBHKCBOTUFYICkKKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJRElNKCBOSURJTSApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQUxQSEEsIEFMUywgQkVUQSwgQkVUUworICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVSUiwgRVJSTUFYLCBSQUxQSEEsIFJBTFMsIFJCRVRBLCBSQkVUUworICAgICAgSU5URUdFUiAgICAgICAgICAgIEksIElBLCBJQiwgSUNULCBJQ1UsIElLLCBJTiwgSiwgSkMsIEpKLCBLLCBLUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICBMQUEsIExDQywgTERBLCBMREFTLCBMREMsIExEQ1MsIExKLCBNQSwgTiwgTkEsCisgICAgICQgICAgICAgICAgICAgICAgICAgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENPTkosIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MsIFRSQU5TVCwgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hULCBJQ0hVCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFpFLCBMWkVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMWkUsIExaRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBaSEVSSywgWk1BS0UsIFpNTUNILCBaU1lSSworKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDICAgICAgICAgIERDTVBMWCwgTUFYLCBEQkxFCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUQworICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIERhdGEgc3RhdGVtZW50cyAuLgorICAgICAgREFUQSAgICAgICAgICAgICAgIElDSFQvJ05DJy8sIElDSFUvJ1VMJy8KKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgQ09OSiA9IFNOQU1FKCAyOiAzICkuRVEuJ0hFJworKgorICAgICAgTkFSR1MgPSAxMAorICAgICAgTkMgPSAwCisgICAgICBSRVNFVCA9IC5UUlVFLgorICAgICAgRVJSTUFYID0gUlpFUk8KKyoKKyAgICAgIERPIDEwMCBJTiA9IDEsIE5JRElNCisgICAgICAgICBOID0gSURJTSggSU4gKQorKiAgICAgICAgU2V0IExEQyB0byAxIG1vcmUgdGhhbiBtaW5pbXVtIHZhbHVlIGlmIHJvb20uCisgICAgICAgICBMREMgPSBOCisgICAgICAgICBJRiggTERDLkxULk5NQVggKQorICAgICAkICAgICAgTERDID0gTERDICsgMQorKiAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICBJRiggTERDLkdULk5NQVggKQorICAgICAkICAgICAgR08gVE8gMTAwCisgICAgICAgICBMQ0MgPSBMREMqTgorKgorICAgICAgICAgRE8gOTAgSUsgPSAxLCBOSURJTQorICAgICAgICAgICAgSyA9IElESU0oIElLICkKKyoKKyAgICAgICAgICAgIERPIDgwIElDVCA9IDEsIDIKKyAgICAgICAgICAgICAgIFRSQU5TID0gSUNIVCggSUNUOiBJQ1QgKQorICAgICAgICAgICAgICAgVFJBTiA9IFRSQU5TLkVRLidDJworICAgICAgICAgICAgICAgSUYoIFRSQU4uQU5ELi5OT1QuQ09OSiApCisgICAgICQgICAgICAgICAgICBUUkFOUyA9ICdUJworICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIE1BID0gSworICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBNQSA9IE4KKyAgICAgICAgICAgICAgICAgIE5BID0gSworICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE1BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gODAKKyAgICAgICAgICAgICAgIExBQSA9IExEQSpOQQorKgorKiAgICAgICAgICAgICAgR2VuZXJhdGUgdGhlIG1hdHJpeCBBLgorKgorICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQSwgTk1BWCwgQUEsIExEQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgIERPIDcwIElDVSA9IDEsIDIKKyAgICAgICAgICAgICAgICAgIFVQTE8gPSBJQ0hVKCBJQ1U6IElDVSApCisgICAgICAgICAgICAgICAgICBVUFBFUiA9IFVQTE8uRVEuJ1UnCisqCisgICAgICAgICAgICAgICAgICBETyA2MCBJQSA9IDEsIE5BTEYKKyAgICAgICAgICAgICAgICAgICAgIEFMUEhBID0gQUxGKCBJQSApCisgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgUkFMUEhBID0gREJMRSggQUxQSEEgKQorICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgPSBEQ01QTFgoIFJBTFBIQSwgUlpFUk8gKQorICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICAgICAgICAgICAgICAgICAgICBETyA1MCBJQiA9IDEsIE5CRVQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBCRVQoIElCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSQkVUQSA9IERCTEUoIEJFVEEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQSA9IERDTVBMWCggUkJFVEEsIFJaRVJPICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9IE4uTEUuMAorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgTlVMTCA9IE5VTEwuT1IuKCAoIEsuTEUuMC5PUi5SQUxQSEEuRVEuCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlpFUk8gKS5BTkQuUkJFVEEuRVEuUk9ORSApCisqCisqICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSB0aGUgbWF0cml4IEMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCBTTkFNRSggMjogMyApLCBVUExPLCAnICcsIE4sIE4sIEMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBDQywgTERDLCBSRVNFVCwgWkVSTyApCisqCisgICAgICAgICAgICAgICAgICAgICAgICBOQyA9IE5DICsgMQorKgorKiAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBldmVyeSBkYXR1bSBiZWZvcmUgY2FsbGluZyB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQTE9TID0gVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNTID0gVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TID0gTgorICAgICAgICAgICAgICAgICAgICAgICAgS1MgPSBLCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFMUyA9IFJBTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTID0gQUxQSEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsIExBQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVMoIEkgKSA9IEFBKCBJICkKKyAgIDEwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMREFTID0gTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkJFVFMgPSBSQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUUyA9IEJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgRE8gMjAgSSA9IDEsIExDQworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MoIEkgKSA9IENDKCBJICkKKyAgIDIwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBMRENTID0gTERDCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDYWxsIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE4sIEssIFJBTFBIQSwgTERBLCBSQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaSEVSSyggVVBMTywgVFJBTlMsIE4sIEssIFJBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIFJCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE4sIEssIEFMUEhBLCBMREEsIEJFVEEsIExEQworICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFJFV0kgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgUkVXSU5EIE5UUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWlNZUksoIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIEJFVEEsIENDLCBMREMgKQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpZiBlcnJvci1leGl0IHdhcyB0YWtlbiBpbmNvcnJlY3RseS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk9LIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5MiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFNlZSB3aGF0IGRhdGEgY2hhbmdlZCBpbnNpZGUgc3Vicm91dGluZXMuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMSApID0gVVBMT1MuRVEuVVBMTworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDIgKSA9IFRSQU5TUy5FUS5UUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDMgKSA9IE5TLkVRLk4KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA0ICkgPSBLUy5FUS5LCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IFJBTFMuRVEuUkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNSApID0gQUxTLkVRLkFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA2ICkgPSBMWkUoIEFTLCBBQSwgTEFBICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA3ICkgPSBMREFTLkVRLkxEQQorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCA4ICkgPSBSQkVUUy5FUS5SQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDggKSA9IEJFVFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExaRSggQ1MsIENDLCBMQ0MgKQorICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDkgKSA9IExaRVJFUyggU05BTUUoIDI6IDMgKSwgVVBMTywgTiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLCBDUywgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMCApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDMwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTIwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1QgPSAnQycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TVCA9ICdUJworICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEogPSAxLCBOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpKID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gTiAtIEogKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCBUUkFOU1QsICdOJywgTEosIDEsIEssCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQSwgQSggMSwgSkogKSwgTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEoIDEsIEogKSwgTk1BWCwgQkVUQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoIEpKLCBKICksIE5NQVgsIENULCBHLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MoIEpDICksIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1NQ0goICdOJywgVFJBTlNULCBMSiwgMSwgSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBLCBBKCBKSiwgMSApLCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSggSiwgMSApLCBOTUFYLCBCRVRBLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQyggSkosIEogKSwgTk1BWCwgQ1QsIEcsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQyggSkMgKSwgTERDLCBFUFMsIEVSUiwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVEFMLCBOT1VULCAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVVBQRVIgKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gSkMgKyBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDID0gSkMgKyBMREMgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUk1BWCA9IE1BWCggRVJSTUFYLCBFUlIgKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZ290IHJlYWxseSBiYWQgYW5zd2VyLCByZXBvcnQgYW5kCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggRkFUQUwgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTEwCisgICA0MCAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisgICA1MCAgICAgICAgICAgICAgICBDT05USU5VRQorKgorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisqCisgICA4MCAgICAgICBDT05USU5VRQorKgorICAgOTAgICAgQ09OVElOVUUKKyoKKyAgMTAwIENPTlRJTlVFCisqCisqICAgICBSZXBvcnQgcmVzdWx0LgorKgorICAgICAgSUYoIEVSUk1BWC5MVC5USFJFU0ggKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTTkFNRSwgTkMKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClTTkFNRSwgTkMsIEVSUk1BWAorICAgICAgRU5EIElGCisgICAgICBHTyBUTyAxMzAKKyoKKyAgMTEwIENPTlRJTlVFCisgICAgICBJRiggTi5HVC4xICkKKyAgICAgJCAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk1IClKCisqCisgIDEyMCBDT05USU5VRQorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTYgKVNOQU1FCisgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIFJBTFBIQSwKKyAgICAgJCAgICAgIExEQSwgUkJFVEEsIExEQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLAorICAgICAkICAgICAgTERBLCBCRVRBLCBMREMKKyAgICAgIEVORCBJRgorKgorICAxMzAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICcsIEE2LCAnIFBBU1NFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQ0FMTCcsCisgICAgICQgICAgICAnUyknICkKKyA5OTk4IEZPUk1BVCggJyAqKioqKioqIEZBVEFMIEVSUk9SIC0gUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBXQVMgQ0gnLAorICAgICAkICAgICAgJ0FOR0VEIElOQ09SUkVDVExZICoqKioqKionICkKKyA5OTk3IEZPUk1BVCggJyAnLCBBNiwgJyBDT01QTEVURUQgVEhFIENPTVBVVEFUSU9OQUwgVEVTVFMgKCcsIEk2LCAnIEMnLAorICAgICAkICAgICAgJ0FMTFMpJywgLycgKioqKioqKiBCVVQgV0lUSCBNQVhJTVVNIFRFU1QgUkFUSU8nLCBGOC4yLAorICAgICAkICAgICAgJyAtIFNVU1BFQ1QgKioqKioqKicgKQorIDk5OTYgRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIE9OIENBTEwgTlVNQkVSOicgKQorIDk5OTUgRk9STUFUKCAnICAgICAgVEhFU0UgQVJFIFRIRSBSRVNVTFRTIEZPUiBDT0xVTU4gJywgSTMgKQorIDk5OTQgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICBGNC4xLCAnLCBBLCcsIEkzLCAnLCcsIEY0LjEsICcsIEMsJywgSTMsICcpICAgICAgICAgICAgICAgJywKKyAgICAgJCAgICAgICcgICAgICAgICAgLicgKQorIDk5OTMgRk9STUFUKCAxWCwgSTYsICc6ICcsIEE2LCAnKCcsIDIoICcnJycsIEExLCAnJycsJyApLCAyKCBJMywgJywnICksCisgICAgICQgICAgICAnKCcsIEY0LjEsICcsJywgRjQuMSwgJykgLCBBLCcsIEkzLCAnLCgnLCBGNC4xLCAnLCcsIEY0LjEsCisgICAgICQgICAgICAnKSwgQywnLCBJMywgJykgICAgICAgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgWkNISzQuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWkNISzUoIFNOQU1FLCBFUFMsIFRIUkVTSCwgTk9VVCwgTlRSQSwgVFJBQ0UsIFJFV0ksCisgICAgICQgICAgICAgICAgICAgICAgICBGQVRBTCwgTklESU0sIElESU0sIE5BTEYsIEFMRiwgTkJFVCwgQkVULCBOTUFYLAorICAgICAkICAgICAgICAgICAgICAgICAgQUIsIEFBLCBBUywgQkIsIEJTLCBDLCBDQywgQ1MsIENULCBHLCBXICkKKyoKKyogIFRlc3RzIFpIRVIySyBhbmQgWlNZUjJLLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFBhcmFtZXRlcnMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBaRVJPLCBPTkUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIE9ORSA9ICggMS4wRDAsIDAuMEQwICkgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJPTkUsIFJaRVJPCisgICAgICBQQVJBTUVURVIgICAgICAgICAgKCBST05FID0gMS4wRDAsIFJaRVJPID0gMC4wRDAgKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgVEhSRVNICisgICAgICBJTlRFR0VSICAgICAgICAgICAgTkFMRiwgTkJFVCwgTklESU0sIE5NQVgsIE5PVVQsIE5UUkEKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgUkVXSSwgVFJBQ0UKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTTkFNRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQUEoIE5NQVgqTk1BWCApLCBBQiggMipOTUFYKk5NQVggKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBBTEYoIE5BTEYgKSwgQVMoIE5NQVgqTk1BWCApLCBCQiggTk1BWCpOTUFYICksCisgICAgICQgICAgICAgICAgICAgICAgICAgQkVUKCBOQkVUICksIEJTKCBOTUFYKk5NQVggKSwgQyggTk1BWCwgTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIENDKCBOTUFYKk5NQVggKSwgQ1MoIE5NQVgqTk1BWCApLCBDVCggTk1BWCApLAorICAgICAkICAgICAgICAgICAgICAgICAgIFcoIDIqTk1BWCApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRyggTk1BWCApCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSURJTSggTklESU0gKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBBTFMsIEJFVEEsIEJFVFMKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlIsIEVSUk1BWCwgUkJFVEEsIFJCRVRTCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUEsIElCLCBJQ1QsIElDVSwgSUssIElOLCBKLCBKQywgSkosIEpKQUIsCisgICAgICQgICAgICAgICAgICAgICAgICAgSywgS1MsIExBQSwgTEJCLCBMQ0MsIExEQSwgTERBUywgTERCLCBMREJTLAorICAgICAkICAgICAgICAgICAgICAgICAgIExEQywgTERDUywgTEosIE1BLCBOLCBOQSwgTkFSR1MsIE5DLCBOUworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENPTkosIE5VTEwsIFJFU0VULCBTQU1FLCBUUkFOLCBVUFBFUgorICAgICAgQ0hBUkFDVEVSKjEgICAgICAgIFRSQU5TLCBUUkFOU1MsIFRSQU5TVCwgVVBMTywgVVBMT1MKKyAgICAgIENIQVJBQ1RFUioyICAgICAgICBJQ0hULCBJQ0hVCisqICAgICAuLiBMb2NhbCBBcnJheXMgLi4KKyAgICAgIExPR0lDQUwgICAgICAgICAgICBJU0FNRSggMTMgKQorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTFpFLCBMWkVSRVMKKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBMWkUsIExaRVJFUworKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBaSEVSMkssIFpNQUtFLCBaTU1DSCwgWlNZUjJLCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgRENNUExYLCBEQ09OSkcsIE1BWCwgREJMRQorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gQ29tbW9uIGJsb2NrcyAuLgorICAgICAgQ09NTU9OICAgICAgICAgICAgIC9JTkZPQy9JTkZPVCwgTk9VVEMsIE9LLCBMRVJSCisqICAgICAuLiBEYXRhIHN0YXRlbWVudHMgLi4KKyAgICAgIERBVEEgICAgICAgICAgICAgICBJQ0hULydOQycvLCBJQ0hVLydVTCcvCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIENPTkogPSBTTkFNRSggMjogMyApLkVRLidIRScKKyoKKyAgICAgIE5BUkdTID0gMTIKKyAgICAgIE5DID0gMAorICAgICAgUkVTRVQgPSAuVFJVRS4KKyAgICAgIEVSUk1BWCA9IFJaRVJPCisqCisgICAgICBETyAxMzAgSU4gPSAxLCBOSURJTQorICAgICAgICAgTiA9IElESU0oIElOICkKKyogICAgICAgIFNldCBMREMgdG8gMSBtb3JlIHRoYW4gbWluaW11bSB2YWx1ZSBpZiByb29tLgorICAgICAgICAgTERDID0gTgorICAgICAgICAgSUYoIExEQy5MVC5OTUFYICkKKyAgICAgJCAgICAgIExEQyA9IExEQyArIDEKKyogICAgICAgIFNraXAgdGVzdHMgaWYgbm90IGVub3VnaCByb29tLgorICAgICAgICAgSUYoIExEQy5HVC5OTUFYICkKKyAgICAgJCAgICAgIEdPIFRPIDEzMAorICAgICAgICAgTENDID0gTERDKk4KKyoKKyAgICAgICAgIERPIDEyMCBJSyA9IDEsIE5JRElNCisgICAgICAgICAgICBLID0gSURJTSggSUsgKQorKgorICAgICAgICAgICAgRE8gMTEwIElDVCA9IDEsIDIKKyAgICAgICAgICAgICAgIFRSQU5TID0gSUNIVCggSUNUOiBJQ1QgKQorICAgICAgICAgICAgICAgVFJBTiA9IFRSQU5TLkVRLidDJworICAgICAgICAgICAgICAgSUYoIFRSQU4uQU5ELi5OT1QuQ09OSiApCisgICAgICQgICAgICAgICAgICBUUkFOUyA9ICdUJworICAgICAgICAgICAgICAgSUYoIFRSQU4gKVRIRU4KKyAgICAgICAgICAgICAgICAgIE1BID0gSworICAgICAgICAgICAgICAgICAgTkEgPSBOCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBNQSA9IE4KKyAgICAgICAgICAgICAgICAgIE5BID0gSworICAgICAgICAgICAgICAgRU5EIElGCisqICAgICAgICAgICAgICBTZXQgTERBIHRvIDEgbW9yZSB0aGFuIG1pbmltdW0gdmFsdWUgaWYgcm9vbS4KKyAgICAgICAgICAgICAgIExEQSA9IE1BCisgICAgICAgICAgICAgICBJRiggTERBLkxULk5NQVggKQorICAgICAkICAgICAgICAgICAgTERBID0gTERBICsgMQorKiAgICAgICAgICAgICAgU2tpcCB0ZXN0cyBpZiBub3QgZW5vdWdoIHJvb20uCisgICAgICAgICAgICAgICBJRiggTERBLkdULk5NQVggKQorICAgICAkICAgICAgICAgICAgR08gVE8gMTEwCisgICAgICAgICAgICAgICBMQUEgPSBMREEqTkEKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQS4KKyoKKyAgICAgICAgICAgICAgIElGKCBUUkFOIClUSEVOCisgICAgICAgICAgICAgICAgICBDQUxMIFpNQUtFKCAnR0UnLCAnICcsICcgJywgTUEsIE5BLCBBQiwgMipOTUFYLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIExEQSwgUkVTRVQsIFpFUk8gKQorICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIsIE5NQVgsIEFBLCBMREEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyogICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQi4KKyoKKyAgICAgICAgICAgICAgIExEQiA9IExEQQorICAgICAgICAgICAgICAgTEJCID0gTEFBCisgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgQ0FMTCBaTUFLRSggJ0dFJywgJyAnLCAnICcsIE1BLCBOQSwgQUIoIEsgKyAxICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAyKk5NQVgsIEJCLCBMREIsIFJFU0VULCBaRVJPICkKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoICdHRScsICcgJywgJyAnLCBNQSwgTkEsIEFCKCBLKk5NQVggKyAxICksCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBOTUFYLCBCQiwgTERCLCBSRVNFVCwgWkVSTyApCisgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgIERPIDEwMCBJQ1UgPSAxLCAyCisgICAgICAgICAgICAgICAgICBVUExPID0gSUNIVSggSUNVOiBJQ1UgKQorICAgICAgICAgICAgICAgICAgVVBQRVIgPSBVUExPLkVRLidVJworKgorICAgICAgICAgICAgICAgICAgRE8gOTAgSUEgPSAxLCBOQUxGCisgICAgICAgICAgICAgICAgICAgICBBTFBIQSA9IEFMRiggSUEgKQorKgorICAgICAgICAgICAgICAgICAgICAgRE8gODAgSUIgPSAxLCBOQkVUCisgICAgICAgICAgICAgICAgICAgICAgICBCRVRBID0gQkVUKCBJQiApCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkJFVEEgPSBEQkxFKCBCRVRBICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEgPSBEQ01QTFgoIFJCRVRBLCBSWkVSTyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSBOLkxFLjAKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSBOVUxMLk9SLiggKCBLLkxFLjAuT1IuQUxQSEEuRVEuCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTyApLkFORC5SQkVUQS5FUS5ST05FICkKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHRoZSBtYXRyaXggQy4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTEwgWk1BS0UoIFNOQU1FKCAyOiAzICksIFVQTE8sICcgJywgTiwgTiwgQywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVgsIENDLCBMREMsIFJFU0VULCBaRVJPICkKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIE5DID0gTkMgKyAxCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTYXZlIGV2ZXJ5IGRhdHVtIGJlZm9yZSBjYWxsaW5nIHRoZSBzdWJyb3V0aW5lLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBMT1MgPSBVUExPCisgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1MgPSBUUkFOUworICAgICAgICAgICAgICAgICAgICAgICAgTlMgPSBOCisgICAgICAgICAgICAgICAgICAgICAgICBLUyA9IEsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMUyA9IEFMUEhBCisgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSwgTEFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyggSSApID0gQUEoIEkgKQorICAgMTAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgIExEQVMgPSBMREEKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBMQkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJTKCBJICkgPSBCQiggSSApCisgICAyMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERCUyA9IExEQgorICAgICAgICAgICAgICAgICAgICAgICAgSUYoIENPTkogKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJCRVRTID0gUkJFVEEKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVFMgPSBCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLCBMQ0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENTKCBJICkgPSBDQyggSSApCisgICAzMCAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgTERDUyA9IExEQworKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCB0aGUgc3Vicm91dGluZS4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBQ0UgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5UUkEsIEZNVCA9IDk5OTQgKU5DLCBTTkFNRSwgVVBMTywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TLCBOLCBLLCBBTFBIQSwgTERBLCBMREIsIFJCRVRBLCBMREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBSRVdJICkKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIFJFV0lORCBOVFJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpIRVIySyggVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLCBBQSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMREEsIEJCLCBMREIsIFJCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBUUkFDRSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBXUklURSggTlRSQSwgRk1UID0gOTk5MyApTkMsIFNOQU1FLCBVUExPLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlMsIE4sIEssIEFMUEhBLCBMREEsIExEQiwgQkVUQSwgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggUkVXSSApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBSRVdJTkQgTlRSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTCBaU1lSMksoIFVQTE8sIFRSQU5TLCBOLCBLLCBBTFBIQSwgQUEsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERBLCBCQiwgTERCLCBCRVRBLCBDQywgTERDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgaWYgZXJyb3ItZXhpdCB3YXMgdGFrZW4gaW5jb3JyZWN0bHkuCisqCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5PSyApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUQUwgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPIFRPIDE1MAorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisqCisqICAgICAgICAgICAgICAgICAgICAgICBTZWUgd2hhdCBkYXRhIGNoYW5nZWQgaW5zaWRlIHN1YnJvdXRpbmVzLgorKgorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDEgKSA9IFVQTE9TLkVRLlVQTE8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAyICkgPSBUUkFOU1MuRVEuVFJBTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAzICkgPSBOUy5FUS5OCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggNCApID0gS1MuRVEuSworICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDUgKSA9IEFMUy5FUS5BTFBIQQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDYgKSA9IExaRSggQVMsIEFBLCBMQUEgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDcgKSA9IExEQVMuRVEuTERBCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOCApID0gTFpFKCBCUywgQkIsIExCQiApCisgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggOSApID0gTERCUy5FUS5MREIKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IFJCRVRTLkVRLlJCRVRBCisgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0FNRSggMTAgKSA9IEJFVFMuRVEuQkVUQQorICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggTlVMTCApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNBTUUoIDExICkgPSBMWkUoIENTLCBDQywgTENDICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMSApID0gTFpFUkVTKCAnSEUnLCBVUExPLCBOLCBOLCBDUywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0MsIExEQyApCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICAgIElTQU1FKCAxMiApID0gTERDUy5FUS5MREMKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIElmIGRhdGEgd2FzIGluY29ycmVjdGx5IGNoYW5nZWQsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBTUUgPSAuVFJVRS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBOQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNRSA9IFNBTUUuQU5ELklTQU1FKCBJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULklTQU1FKCBJICkgKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKUkKKyAgIDQwICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBJRiggLk5PVC5TQU1FIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCA9IC5UUlVFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgR08gVE8gMTUwCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgICAgICAgICAgICAgICAgICAgICAgIElGKCAuTk9ULk5VTEwgKVRIRU4KKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSByZXN1bHQgY29sdW1uIGJ5IGNvbHVtbi4KKyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1QgPSAnQycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TVCA9ICdUJworICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSkFCID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSkMgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBKID0gMSwgTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKID0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkogPSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSiA9IE4gLSBKICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggVFJBTiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsIEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEkgKSA9IEFMUEhBKkFCKCAoIEogLSAxICkqMioKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5NQVggKyBLICsgSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiggQ09OSiApVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IERDT05KRyggQUxQSEEgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQiggKCBKIC0gMSApKjIqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCArIEkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IEFMUEhBKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCKCAoIEogLSAxICkqMioKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTUFYICsgSSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgIDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCBUUkFOU1QsICdOJywgTEosIDEsIDIqSywKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ORSwgQUIoIEpKQUIgKSwgMipOTUFYLCBXLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMipOTUFYLCBCRVRBLCBDKCBKSiwgSiApLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCwgQ1QsIEcsIENDKCBKQyApLCBMREMsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUFMsIEVSUiwgRkFUQUwsIE5PVVQsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVFJVRS4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKCBJICkgPSBBTFBIQSpEQ09OSkcoIEFCKCAoIEsgKworICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSAtIDEgKSpOTUFYICsgSiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEsgKyBJICkgPSBEQ09OSkcoIEFMUEhBKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCKCAoIEkgLSAxICkqTk1BWCArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoIEkgKSA9IEFMUEhBKkFCKCAoIEsgKyBJIC0gMSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk1BWCArIEogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyggSyArIEkgKSA9IEFMUEhBKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCKCAoIEkgLSAxICkqTk1BWCArCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgIDYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMIFpNTUNIKCAnTicsICdOJywgTEosIDEsIDIqSywgT05FLAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUIoIEpKICksIE5NQVgsIFcsIDIqTk1BWCwKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEsIEMoIEpKLCBKICksIE5NQVgsIENULAorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRywgQ0MoIEpDICksIExEQywgRVBTLCBFUlIsCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRBTCwgTk9VVCwgLlRSVUUuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQyA9IEpDICsgTERDICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYoIFRSQU4gKQorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkpBQiA9IEpKQUIgKyAyKk5NQVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSTUFYID0gTUFYKCBFUlJNQVgsIEVSUiApCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBnb3QgcmVhbGx5IGJhZCBhbnN3ZXIsIHJlcG9ydCBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGKCBGQVRBTCApCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBHTyBUTyAxNDAKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyoKKyAgIDgwICAgICAgICAgICAgICAgIENPTlRJTlVFCisqCisgICA5MCAgICAgICAgICAgICBDT05USU5VRQorKgorICAxMDAgICAgICAgICAgQ09OVElOVUUKKyoKKyAgMTEwICAgICAgIENPTlRJTlVFCisqCisgIDEyMCAgICBDT05USU5VRQorKgorICAxMzAgQ09OVElOVUUKKyoKKyogICAgIFJlcG9ydCByZXN1bHQuCisqCisgICAgICBJRiggRVJSTUFYLkxULlRIUkVTSCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKVNOQU1FLCBOQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTcgKVNOQU1FLCBOQywgRVJSTUFYCisgICAgICBFTkQgSUYKKyAgICAgIEdPIFRPIDE2MAorKgorICAxNDAgQ09OVElOVUUKKyAgICAgIElGKCBOLkdULjEgKQorICAgICAkICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTUgKUoKKyoKKyAgMTUwIENPTlRJTlVFCisgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NiApU05BTUUKKyAgICAgIElGKCBDT05KIClUSEVOCisgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5NCApTkMsIFNOQU1FLCBVUExPLCBUUkFOUywgTiwgSywgQUxQSEEsCisgICAgICQgICAgICBMREEsIExEQiwgUkJFVEEsIExEQworICAgICAgRUxTRQorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTMgKU5DLCBTTkFNRSwgVVBMTywgVFJBTlMsIE4sIEssIEFMUEhBLAorICAgICAkICAgICAgTERBLCBMREIsIEJFVEEsIExEQworICAgICAgRU5EIElGCisqCisgIDE2MCBDT05USU5VRQorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBDT01QVVRBVElPTkFMIFRFU1RTICgnLCBJNiwgJyBDQUxMJywKKyAgICAgJCAgICAgICdTKScgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBQQVJBTUVURVIgTlVNQkVSICcsIEkyLCAnIFdBUyBDSCcsCisgICAgICQgICAgICAnQU5HRUQgSU5DT1JSRUNUTFkgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICcsIEE2LCAnIENPTVBMRVRFRCBUSEUgQ09NUFVUQVRJT05BTCBURVNUUyAoJywgSTYsICcgQycsCisgICAgICQgICAgICAnQUxMUyknLCAvJyAqKioqKioqIEJVVCBXSVRIIE1BWElNVU0gVEVTVCBSQVRJTycsIEY4LjIsCisgICAgICQgICAgICAnIC0gU1VTUEVDVCAqKioqKioqJyApCisgOTk5NiBGT1JNQVQoICcgKioqKioqKiAnLCBBNiwgJyBGQUlMRUQgT04gQ0FMTCBOVU1CRVI6JyApCisgOTk5NSBGT1JNQVQoICcgICAgICBUSEVTRSBBUkUgVEhFIFJFU1VMVFMgRk9SIENPTFVNTiAnLCBJMyApCisgOTk5NCBGT1JNQVQoIDFYLCBJNiwgJzogJywgQTYsICcoJywgMiggJycnJywgQTEsICcnJywnICksIDIoIEkzLCAnLCcgKSwKKyAgICAgJCAgICAgICcoJywgRjQuMSwgJywnLCBGNC4xLCAnKSwgQSwnLCBJMywgJywgQiwnLCBJMywgJywnLCBGNC4xLAorICAgICAkICAgICAgJywgQywnLCBJMywgJykgICAgICAgICAgIC4nICkKKyA5OTkzIEZPUk1BVCggMVgsIEk2LCAnOiAnLCBBNiwgJygnLCAyKCAnJycnLCBBMSwgJycnLCcgKSwgMiggSTMsICcsJyApLAorICAgICAkICAgICAgJygnLCBGNC4xLCAnLCcsIEY0LjEsICcpLCBBLCcsIEkzLCAnLCBCLCcsIEkzLCAnLCgnLCBGNC4xLAorICAgICAkICAgICAgJywnLCBGNC4xLCAnKSwgQywnLCBJMywgJykgICAgLicgKQorIDk5OTIgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBFUlJPUi1FWElUIFRBS0VOIE9OIFZBTElEIENBTEwgKicsCisgICAgICQgICAgICAnKioqKioqJyApCisqCisqICAgICBFbmQgb2YgWkNISzUuCisqCisgICAgICBFTkQKKyAgICAgIFNVQlJPVVRJTkUgWkNIS0UoIElTTlVNLCBTUk5BTVQsIE5PVVQgKQorKgorKiAgVGVzdHMgdGhlIGVycm9yIGV4aXRzIGZyb20gdGhlIExldmVsIDMgQmxhcy4KKyogIFJlcXVpcmVzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBlcnJvci1oYW5kbGluZyByb3V0aW5lIFhFUkJMQS4KKyogIEFMUEhBLCBSQUxQSEEsIEJFVEEsIFJCRVRBLCBBLCBCIGFuZCBDIHNob3VsZCBub3QgbmVlZCB0byBiZSBkZWZpbmVkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJU05VTSwgTk9VVAorICAgICAgQ0hBUkFDVEVSKjYgICAgICAgIFNSTkFNVAorKiAgICAgLi4gU2NhbGFycyBpbiBDb21tb24gLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVEMKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBMRVJSLCBPSworKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFMUEhBLCBCRVRBCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUkFMUEhBLCBSQkVUQQorKiAgICAgLi4gTG9jYWwgQXJyYXlzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggMiwgMSApLCBCKCAyLCAxICksIEMoIDIsIDEgKQorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMICAgICAgICAgICBaR0VNTSwgWkhFTU0sIFpIRVIySywgWkhFUkssIENIS1hFUiwgWlNZTU0sCisgICAgICQgICAgICAgICAgICAgICAgICAgWlNZUjJLLCBaU1lSSywgWlRSTU0sIFpUUlNNCisqICAgICAuLiBDb21tb24gYmxvY2tzIC4uCisgICAgICBDT01NT04gICAgICAgICAgICAgL0lORk9DL0lORk9ULCBOT1VUQywgT0ssIExFUlIKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorKiAgICAgT0sgaXMgc2V0IHRvIC5GQUxTRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgb3IgYnkgQ0hLWEVSCisqICAgICBpZiBhbnl0aGluZyBpcyB3cm9uZy4KKyAgICAgIE9LID0gLlRSVUUuCisqICAgICBMRVJSIGlzIHNldCB0byAuVFJVRS4gYnkgdGhlIHNwZWNpYWwgdmVyc2lvbiBvZiBYRVJCTEEgZWFjaCB0aW1lCisqICAgICBpdCBpcyBjYWxsZWQsIGFuZCBpcyB0aGVuIHRlc3RlZCBhbmQgcmUtc2V0IGJ5IENIS1hFUi4KKyAgICAgIExFUlIgPSAuRkFMU0UuCisgICAgICBHTyBUTyAoIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwKKyAgICAgJCAgICAgICAgOTAgKUlTTlVNCisgICAxMCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWkdFTU0oICcvJywgJ04nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpHRU1NKCAnLycsICdDJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMQorICAgICAgQ0FMTCBaR0VNTSggJy8nLCAnVCcsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJy8nLCAwLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpHRU1NKCAnQycsICcvJywgMCwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnLycsIDAsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnQycsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnQycsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpHRU1NKCAnQycsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ04nLCAtMSwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnQycsIC0xLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdUJywgLTEsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnQycsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpHRU1NKCAnTicsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnQycsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpHRU1NKCAnQycsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ04nLCAwLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnQycsIDAsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdUJywgMCwgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnQycsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpHRU1NKCAnTicsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnQycsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpHRU1NKCAnQycsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDUKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ04nLCAwLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnQycsIDAsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdUJywgMCwgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ04nLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFpHRU1NKCAnTicsICdDJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFpHRU1NKCAnQycsICdDJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnVCcsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDgKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA4CisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdDJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnVCcsIDAsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdOJywgMCwgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ04nLCAwLCAwLCAyLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnTicsIDAsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdDJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ0MnLCAwLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnQycsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdUJywgMCwgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ1QnLCAwLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnVCcsIDAsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFpHRU1NKCAnTicsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgWkdFTU0oICdOJywgJ0MnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBaR0VNTSggJ04nLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFpHRU1NKCAnQycsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgWkdFTU0oICdDJywgJ0MnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBaR0VNTSggJ0MnLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEzCisgICAgICBDQUxMIFpHRU1NKCAnVCcsICdOJywgMiwgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTMKKyAgICAgIENBTEwgWkdFTU0oICdUJywgJ0MnLCAyLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMworICAgICAgQ0FMTCBaR0VNTSggJ1QnLCAnVCcsIDIsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDIwIElORk9UID0gMQorICAgICAgQ0FMTCBaSEVNTSggJy8nLCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWkhFTU0oICdMJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRU1NKCAnTCcsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkhFTU0oICdSJywgJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaSEVNTSggJ0wnLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRU1NKCAnUicsICdMJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFTU0oICdMJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaSEVNTSggJ1InLCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpIRU1NKCAnTCcsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFTU0oICdSJywgJ0wnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaSEVNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFTU0oICdSJywgJ1UnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaSEVNTSggJ1InLCAnTCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWkhFTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaSEVNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWkhFTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaSEVNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpIRU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgWkhFTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaSEVNTSggJ1InLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDMwIElORk9UID0gMQorICAgICAgQ0FMTCBaU1lNTSggJy8nLCAnVScsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlNZTU0oICdMJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpTWU1NKCAnTCcsICdVJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWlNZTU0oICdSJywgJ1UnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lNTSggJ0wnLCAnTCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpTWU1NKCAnUicsICdMJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlNZTU0oICdMJywgJ1UnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lNTSggJ1InLCAnVScsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpTWU1NKCAnTCcsICdMJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlNZTU0oICdSJywgJ0wnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlNZTU0oICdSJywgJ1UnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpTWU1NKCAnTCcsICdMJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lNTSggJ1InLCAnTCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlNZTU0oICdMJywgJ1UnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaU1lNTSggJ0wnLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlNZTU0oICdSJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaU1lNTSggJ0wnLCAnVScsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWU1NKCAnUicsICdVJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgWlNZTU0oICdMJywgJ0wnLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaU1lNTSggJ1InLCAnTCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDQwIElORk9UID0gMQorICAgICAgQ0FMTCBaVFJNTSggJy8nLCAnVScsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpUUk1NKCAnTCcsICcvJywgJ04nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWlRSTU0oICdMJywgJ1UnLCAnLycsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdOJywgJy8nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ0MnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA1CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ1QnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ0MnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA2CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ1QnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdVJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSTU0oICdMJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdVJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSTU0oICdSJywgJ1UnLCAnQycsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUk1NKCAnTCcsICdMJywgJ04nLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSTU0oICdMJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUk1NKCAnUicsICdMJywgJ04nLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSTU0oICdSJywgJ0wnLCAnQycsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnVScsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnVScsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnTCcsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ0wnLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnTCcsICdDJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMQorICAgICAgQ0FMTCBaVFJNTSggJ1InLCAnTCcsICdUJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICA1MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlRSU00oICcvJywgJ1UnLCAnTicsICdOJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnLycsICdOJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpUUlNNKCAnTCcsICdVJywgJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnTicsICcvJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdDJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdUJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdDJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNgorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdUJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnVScsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUlNNKCAnTCcsICdVJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnVScsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUlNNKCAnUicsICdVJywgJ0MnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJTTSggJ0wnLCAnTCcsICdOJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUlNNKCAnTCcsICdMJywgJ0MnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaVFJTTSggJ1InLCAnTCcsICdOJywgJ04nLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpUUlNNKCAnUicsICdMJywgJ0MnLCAnTicsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMCwgMiwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ1UnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ1UnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ1UnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdMJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDIsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ0wnLCAnTicsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ0wnLCAnQycsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTEKKyAgICAgIENBTEwgWlRSU00oICdSJywgJ0wnLCAnVCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDEwMAorICAgNjAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpIRVJLKCAnLycsICdOJywgMCwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpIRVJLKCAnVScsICdUJywgMCwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRVJLKCAnVScsICdOJywgLTEsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaSEVSSyggJ1UnLCAnQycsIC0xLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkhFUksoICdMJywgJ04nLCAtMSwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRVJLKCAnTCcsICdDJywgLTEsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaSEVSSyggJ1UnLCAnTicsIDAsIC0xLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFUksoICdVJywgJ0MnLCAwLCAtMSwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpIRVJLKCAnTCcsICdOJywgMCwgLTEsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaSEVSSyggJ0wnLCAnQycsIDAsIC0xLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFUksoICdVJywgJ04nLCAyLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFUksoICdVJywgJ0MnLCAwLCAyLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFUksoICdMJywgJ04nLCAyLCAwLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWkhFUksoICdMJywgJ0MnLCAwLCAyLCBSQUxQSEEsIEEsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpIRVJLKCAnVScsICdOJywgMiwgMCwgUkFMUEhBLCBBLCAyLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaSEVSSyggJ1UnLCAnQycsIDIsIDAsIFJBTFBIQSwgQSwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWkhFUksoICdMJywgJ04nLCAyLCAwLCBSQUxQSEEsIEEsIDIsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpIRVJLKCAnTCcsICdDJywgMiwgMCwgUkFMUEhBLCBBLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgR08gVE8gMTAwCisgICA3MCBJTkZPVCA9IDEKKyAgICAgIENBTEwgWlNZUksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAyCisgICAgICBDQUxMIFpTWVJLKCAnVScsICdDJywgMCwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSSyggJ1UnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpTWVJLKCAnVScsICdUJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWlNZUksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSSyggJ0wnLCAnVCcsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpTWVJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWlNZUksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSSyggJ0wnLCAnTicsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpTWVJLKCAnTCcsICdUJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlNZUksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpTWVJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lSSyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlNZUksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaU1lSSyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEwCisgICAgICBDQUxMIFpTWVJLKCAnVScsICdUJywgMiwgMCwgQUxQSEEsIEEsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTAKKyAgICAgIENBTEwgWlNZUksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMAorICAgICAgQ0FMTCBaU1lSSyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBHTyBUTyAxMDAKKyAgIDgwIElORk9UID0gMQorICAgICAgQ0FMTCBaSEVSMksoICcvJywgJ04nLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMgorICAgICAgQ0FMTCBaSEVSMksoICdVJywgJ1QnLCAwLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaSEVSMksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDMKKyAgICAgIENBTEwgWkhFUjJLKCAnVScsICdDJywgLTEsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAzCisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnTicsIC0xLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaSEVSMksoICdMJywgJ0MnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFUjJLKCAnVScsICdOJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA0CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnQycsIDAsIC0xLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaSEVSMksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDQKKyAgICAgIENBTEwgWkhFUjJLKCAnTCcsICdDJywgMCwgLTEsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRVIySyggJ1UnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnQycsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaSEVSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMiwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMTIKKyAgICAgIENBTEwgWkhFUjJLKCAnVScsICdDJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIFJCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpIRVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBSQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSAxMgorICAgICAgQ0FMTCBaSEVSMksoICdMJywgJ0MnLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgUkJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIEdPIFRPIDEwMAorICAgOTAgSU5GT1QgPSAxCisgICAgICBDQUxMIFpTWVIySyggJy8nLCAnTicsIDAsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDIKKyAgICAgIENBTEwgWlNZUjJLKCAnVScsICdDJywgMCwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ04nLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gMworICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ1QnLCAtMSwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ04nLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNAorICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ1QnLCAwLCAtMSwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lSMksoICdVJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA3CisgICAgICBDQUxMIFpTWVIySyggJ1UnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDcKKyAgICAgIENBTEwgWlNZUjJLKCAnTCcsICdOJywgMiwgMCwgQUxQSEEsIEEsIDEsIEIsIDEsIEJFVEEsIEMsIDIgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gNworICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ1QnLCAwLCAyLCBBTFBIQSwgQSwgMSwgQiwgMSwgQkVUQSwgQywgMSApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAyICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDkKKyAgICAgIENBTEwgWlNZUjJLKCAnVScsICdUJywgMCwgMiwgQUxQSEEsIEEsIDIsIEIsIDEsIEJFVEEsIEMsIDEgKQorICAgICAgQ0FMTCBDSEtYRVIoIFNSTkFNVCwgSU5GT1QsIE5PVVQsIExFUlIsIE9LICkKKyAgICAgIElORk9UID0gOQorICAgICAgQ0FMTCBaU1lSMksoICdMJywgJ04nLCAyLCAwLCBBTFBIQSwgQSwgMiwgQiwgMSwgQkVUQSwgQywgMiApCisgICAgICBDQUxMIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorICAgICAgSU5GT1QgPSA5CisgICAgICBDQUxMIFpTWVIySyggJ0wnLCAnVCcsIDAsIDIsIEFMUEhBLCBBLCAyLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWVIySyggJ1UnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWVIySyggJ1UnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWVIySyggJ0wnLCAnTicsIDIsIDAsIEFMUEhBLCBBLCAyLCBCLCAyLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisgICAgICBJTkZPVCA9IDEyCisgICAgICBDQUxMIFpTWVIySyggJ0wnLCAnVCcsIDIsIDAsIEFMUEhBLCBBLCAxLCBCLCAxLCBCRVRBLCBDLCAxICkKKyAgICAgIENBTEwgQ0hLWEVSKCBTUk5BTVQsIElORk9ULCBOT1VULCBMRVJSLCBPSyApCisqCisgIDEwMCBJRiggT0sgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClTUk5BTVQKKyAgICAgIEVMU0UKKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClTUk5BTVQKKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgJywgQTYsICcgUEFTU0VEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUycgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogJywgQTYsICcgRkFJTEVEIFRIRSBURVNUUyBPRiBFUlJPUi1FWElUUyAqKioqKicsCisgICAgICQgICAgICAnKionICkKKyoKKyogICAgIEVuZCBvZiBaQ0hLRS4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBaTUFLRSggVFlQRSwgVVBMTywgRElBRywgTSwgTiwgQSwgTk1BWCwgQUEsIExEQSwgUkVTRVQsCisgICAgICQgICAgICAgICAgICAgICAgICBUUkFOU0wgKQorKgorKiAgR2VuZXJhdGVzIHZhbHVlcyBmb3IgYW4gTSBieSBOIG1hdHJpeCBBLgorKiAgU3RvcmVzIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IEFBIGluIHRoZSBkYXRhIHN0cnVjdHVyZSByZXF1aXJlZAorKiAgYnkgdGhlIHJvdXRpbmUsIHdpdGggdW53YW50ZWQgZWxlbWVudHMgc2V0IHRvIHJvZ3VlIHZhbHVlLgorKgorKiAgVFlQRSBpcyAnR0UnLCAnSEUnLCAnU1knIG9yICdUUicuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8sIE9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggWkVSTyA9ICggMC4wRDAsIDAuMEQwICksCisgICAgICQgICAgICAgICAgICAgICAgICAgT05FID0gKCAxLjBEMCwgMC4wRDAgKSApCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgUk9HVUUKKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJPR1VFID0gKCAtMS4wRDEwLCAxLjBEMTAgKSApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgUlpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFJaRVJPID0gMC4wRDAgKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIFJST0dVRQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlJPR1VFID0gLTEuMEQxMCApCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgVFJBTlNMCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOLCBOTUFYCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgUkVTRVQKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBESUFHLCBVUExPCisgICAgICBDSEFSQUNURVIqMiAgICAgICAgVFlQRQorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTk1BWCwgKiApLCBBQSggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSiwgSkoKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBHRU4sIEhFUiwgTE9XRVIsIFNZTSwgVFJJLCBVTklULCBVUFBFUgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgWkJFRworICAgICAgRVhURVJOQUwgICAgICAgICAgIFpCRUcKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBEQ01QTFgsIERDT05KRywgREJMRQorKiAgICAgLi4gRXhlY3V0YWJsZSBTdGF0ZW1lbnRzIC4uCisgICAgICBHRU4gPSBUWVBFLkVRLidHRScKKyAgICAgIEhFUiA9IFRZUEUuRVEuJ0hFJworICAgICAgU1lNID0gVFlQRS5FUS4nU1knCisgICAgICBUUkkgPSBUWVBFLkVRLidUUicKKyAgICAgIFVQUEVSID0gKCBIRVIuT1IuU1lNLk9SLlRSSSApLkFORC5VUExPLkVRLidVJworICAgICAgTE9XRVIgPSAoIEhFUi5PUi5TWU0uT1IuVFJJICkuQU5ELlVQTE8uRVEuJ0wnCisgICAgICBVTklUID0gVFJJLkFORC5ESUFHLkVRLidVJworKgorKiAgICAgR2VuZXJhdGUgZGF0YSBpbiBhcnJheSBBLgorKgorICAgICAgRE8gMjAgSiA9IDEsIE4KKyAgICAgICAgIERPIDEwIEkgPSAxLCBNCisgICAgICAgICAgICBJRiggR0VOLk9SLiggVVBQRVIuQU5ELkkuTEUuSiApLk9SLiggTE9XRVIuQU5ELkkuR0UuSiApICkKKyAgICAgJCAgICAgICAgICBUSEVOCisgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBaQkVHKCBSRVNFVCApICsgVFJBTlNMCisgICAgICAgICAgICAgICBJRiggSS5ORS5KIClUSEVOCisqICAgICAgICAgICAgICAgICBTZXQgc29tZSBlbGVtZW50cyB0byB6ZXJvCisgICAgICAgICAgICAgICAgICBJRiggTi5HVC4zLkFORC5KLkVRLk4vMiApCisgICAgICQgICAgICAgICAgICAgICBBKCBJLCBKICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBJRiggSEVSIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBEQ09OSkcoIEEoIEksIEogKSApCisgICAgICAgICAgICAgICAgICBFTFNFIElGKCBTWU0gKVRIRU4KKyAgICAgICAgICAgICAgICAgICAgIEEoIEosIEkgKSA9IEEoIEksIEogKQorICAgICAgICAgICAgICAgICAgRUxTRSBJRiggVFJJIClUSEVOCisgICAgICAgICAgICAgICAgICAgICBBKCBKLCBJICkgPSBaRVJPCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgRU5EIElGCisgICAxMCAgICBDT05USU5VRQorICAgICAgICAgSUYoIEhFUiApCisgICAgICQgICAgICBBKCBKLCBKICkgPSBEQ01QTFgoIERCTEUoIEEoIEosIEogKSApLCBSWkVSTyApCisgICAgICAgICBJRiggVFJJICkKKyAgICAgJCAgICAgIEEoIEosIEogKSA9IEEoIEosIEogKSArIE9ORQorICAgICAgICAgSUYoIFVOSVQgKQorICAgICAkICAgICAgQSggSiwgSiApID0gT05FCisgICAyMCBDT05USU5VRQorKgorKiAgICAgU3RvcmUgZWxlbWVudHMgaW4gYXJyYXkgQVMgaW4gZGF0YSBzdHJ1Y3R1cmUgcmVxdWlyZWQgYnkgcm91dGluZS4KKyoKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDUwIEogPSAxLCBOCisgICAgICAgICAgICBETyAzMCBJID0gMSwgTQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBBKCBJLCBKICkKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIRScuT1IuVFlQRS5FUS4nU1knLk9SLlRZUEUuRVEuJ1RSJyApVEhFTgorICAgICAgICAgRE8gOTAgSiA9IDEsIE4KKyAgICAgICAgICAgIElGKCBVUFBFUiApVEhFTgorICAgICAgICAgICAgICAgSUJFRyA9IDEKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJRU5EID0gSiAtIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElFTkQgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBVTklUIClUSEVOCisgICAgICAgICAgICAgICAgICBJQkVHID0gSiArIDEKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgIElFTkQgPSBOCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIERPIDYwIEkgPSAxLCBJQkVHIC0gMQorICAgICAgICAgICAgICAgQUEoIEkgKyAoIEogLSAxICkqTERBICkgPSBST0dVRQorICAgNjAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDcwIEkgPSBJQkVHLCBJRU5ECisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IEEoIEksIEogKQorICAgNzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIERPIDgwIEkgPSBJRU5EICsgMSwgTERBCisgICAgICAgICAgICAgICBBQSggSSArICggSiAtIDEgKSpMREEgKSA9IFJPR1VFCisgICA4MCAgICAgICBDT05USU5VRQorICAgICAgICAgICAgSUYoIEhFUiApVEhFTgorICAgICAgICAgICAgICAgSkogPSBKICsgKCBKIC0gMSApKkxEQQorICAgICAgICAgICAgICAgQUEoIEpKICkgPSBEQ01QTFgoIERCTEUoIEFBKCBKSiApICksIFJST0dVRSApCisgICAgICAgICAgICBFTkQgSUYKKyAgIDkwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpNQUtFLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIFpNTUNIKCBUUkFOU0EsIFRSQU5TQiwgTSwgTiwgS0ssIEFMUEhBLCBBLCBMREEsIEIsIExEQiwKKyAgICAgJCAgICAgICAgICAgICAgICAgIEJFVEEsIEMsIExEQywgQ1QsIEcsIENDLCBMRENDLCBFUFMsIEVSUiwgRkFUQUwsCisgICAgICQgICAgICAgICAgICAgICAgICBOT1VULCBNViApCisqCisqICBDaGVja3MgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXB1dGF0aW9uYWwgdGVzdHMuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIFpFUk8KKyAgICAgIFBBUkFNRVRFUiAgICAgICAgICAoIFpFUk8gPSAoIDAuMEQwLCAwLjBEMCApICkKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBSWkVSTywgUk9ORQorICAgICAgUEFSQU1FVEVSICAgICAgICAgICggUlpFUk8gPSAwLjBEMCwgUk9ORSA9IDEuMEQwICkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIENPTVBMRVgqMTYgICAgICAgICBBTFBIQSwgQkVUQQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEVQUywgRVJSCisgICAgICBJTlRFR0VSICAgICAgICAgICAgS0ssIExEQSwgTERCLCBMREMsIExEQ0MsIE0sIE4sIE5PVVQKKyAgICAgIExPR0lDQUwgICAgICAgICAgICBGQVRBTCwgTVYKKyAgICAgIENIQVJBQ1RFUioxICAgICAgICBUUkFOU0EsIFRSQU5TQgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQSggTERBLCAqICksIEIoIExEQiwgKiApLCBDKCBMREMsICogKSwKKyAgICAgJCAgICAgICAgICAgICAgICAgICBDQyggTERDQywgKiApLCBDVCggKiApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OICAgRyggKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgQ0wKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBFUlJJCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSiwgSworICAgICAgTE9HSUNBTCAgICAgICAgICAgIENUUkFOQSwgQ1RSQU5CLCBUUkFOQSwgVFJBTkIKKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyAgICAgICAgICBBQlMsIERJTUFHLCBEQ09OSkcsIE1BWCwgREJMRSwgU1FSVAorKiAgICAgLi4gU3RhdGVtZW50IEZ1bmN0aW9ucyAuLgorICAgICAgRE9VQkxFIFBSRUNJU0lPTiAgIEFCUzEKKyogICAgIC4uIFN0YXRlbWVudCBGdW5jdGlvbiBkZWZpbml0aW9ucyAuLgorICAgICAgQUJTMSggQ0wgKSA9IEFCUyggREJMRSggQ0wgKSApICsgQUJTKCBESU1BRyggQ0wgKSApCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFRSQU5BID0gVFJBTlNBLkVRLidUJy5PUi5UUkFOU0EuRVEuJ0MnCisgICAgICBUUkFOQiA9IFRSQU5TQi5FUS4nVCcuT1IuVFJBTlNCLkVRLidDJworICAgICAgQ1RSQU5BID0gVFJBTlNBLkVRLidDJworICAgICAgQ1RSQU5CID0gVFJBTlNCLkVRLidDJworKgorKiAgICAgQ29tcHV0ZSBleHBlY3RlZCByZXN1bHQsIG9uZSBjb2x1bW4gYXQgYSB0aW1lLCBpbiBDVCB1c2luZyBkYXRhCisqICAgICBpbiBBLCBCIGFuZCBDLgorKiAgICAgQ29tcHV0ZSBnYXVnZXMgaW4gRy4KKyoKKyAgICAgIERPIDIyMCBKID0gMSwgTgorKgorICAgICAgICAgRE8gMTAgSSA9IDEsIE0KKyAgICAgICAgICAgIENUKCBJICkgPSBaRVJPCisgICAgICAgICAgICBHKCBJICkgPSBSWkVSTworICAgMTAgICAgQ09OVElOVUUKKyAgICAgICAgIElGKCAuTk9ULlRSQU5BLkFORC4uTk9ULlRSQU5CIClUSEVOCisgICAgICAgICAgICBETyAzMCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEksIEsgKSpCKCBLLCBKICkKKyAgICAgICAgICAgICAgICAgIEcoIEkgKSA9IEcoIEkgKSArIEFCUzEoIEEoIEksIEsgKSApKkFCUzEoIEIoIEssIEogKSApCisgICAyMCAgICAgICAgICBDT05USU5VRQorICAgMzAgICAgICAgQ09OVElOVUUKKyAgICAgICAgIEVMU0UgSUYoIFRSQU5BLkFORC4uTk9ULlRSQU5CIClUSEVOCisgICAgICAgICAgICBJRiggQ1RSQU5BIClUSEVOCisgICAgICAgICAgICAgICBETyA1MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgIERPIDQwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIERDT05KRyggQSggSywgSSApICkqQiggSywgSiApCisgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEssIEogKSApCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgNTAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIERPIDcwIEsgPSAxLCBLSworICAgICAgICAgICAgICAgICAgRE8gNjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSywgSSApKkIoIEssIEogKQorICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBLLCBKICkgKQorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgIDcwICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgIEVMU0UgSUYoIC5OT1QuVFJBTkEuQU5ELlRSQU5CIClUSEVOCisgICAgICAgICAgICBJRiggQ1RSQU5CIClUSEVOCisgICAgICAgICAgICAgICBETyA5MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgIERPIDgwIEkgPSAxLCBNCisgICAgICAgICAgICAgICAgICAgICBDVCggSSApID0gQ1QoIEkgKSArIEEoIEksIEsgKSpEQ09OSkcoIEIoIEosIEsgKSApCisgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBJLCBLICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorICAgOTAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIERPIDExMCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgIERPIDEwMCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBJLCBLICkqQiggSiwgSyApCisgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBJLCBLICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgIDEwMCAgICAgICAgICAgICBDT05USU5VRQorICAxMTAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgRUxTRSBJRiggVFJBTkEuQU5ELlRSQU5CIClUSEVOCisgICAgICAgICAgICBJRiggQ1RSQU5BIClUSEVOCisgICAgICAgICAgICAgICBJRiggQ1RSQU5CIClUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMzAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICAgICAgICBETyAxMjAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgRENPTkpHKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ09OSkcoIEIoIEosIEsgKSApCisgICAgICAgICAgICAgICAgICAgICAgICBHKCBJICkgPSBHKCBJICkgKyBBQlMxKCBBKCBLLCBJICkgKSoKKyAgICAgJCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUzEoIEIoIEosIEsgKSApCisgIDEyMCAgICAgICAgICAgICAgICBDT05USU5VRQorICAxMzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDE1MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgICAgIERPIDE0MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBEQ09OSkcoIEEoIEssIEkgKSApKgorICAgICAkICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIoIEosIEsgKQorICAgICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBKLCBLICkgKQorICAxNDAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTUwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElGKCBDVFJBTkIgKVRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDE3MCBLID0gMSwgS0sKKyAgICAgICAgICAgICAgICAgICAgIERPIDE2MCBJID0gMSwgTQorICAgICAgICAgICAgICAgICAgICAgICAgQ1QoIEkgKSA9IENUKCBJICkgKyBBKCBLLCBJICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENPTkpHKCBCKCBKLCBLICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBKLCBLICkgKQorICAxNjAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTcwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBETyAxOTAgSyA9IDEsIEtLCisgICAgICAgICAgICAgICAgICAgICBETyAxODAgSSA9IDEsIE0KKyAgICAgICAgICAgICAgICAgICAgICAgIENUKCBJICkgPSBDVCggSSApICsgQSggSywgSSApKkIoIEosIEsgKQorICAgICAgICAgICAgICAgICAgICAgICAgRyggSSApID0gRyggSSApICsgQUJTMSggQSggSywgSSApICkqCisgICAgICQgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMxKCBCKCBKLCBLICkgKQorICAxODAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgMTkwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgRU5EIElGCisgICAgICAgICBETyAyMDAgSSA9IDEsIE0KKyAgICAgICAgICAgIENUKCBJICkgPSBBTFBIQSpDVCggSSApICsgQkVUQSpDKCBJLCBKICkKKyAgICAgICAgICAgIEcoIEkgKSA9IEFCUzEoIEFMUEhBICkqRyggSSApICsKKyAgICAgJCAgICAgICAgICAgICAgIEFCUzEoIEJFVEEgKSpBQlMxKCBDKCBJLCBKICkgKQorICAyMDAgICAgQ09OVElOVUUKKyoKKyogICAgICAgIENvbXB1dGUgdGhlIGVycm9yIHJhdGlvIGZvciB0aGlzIHJlc3VsdC4KKyoKKyAgICAgICAgIEVSUiA9IFpFUk8KKyAgICAgICAgIERPIDIxMCBJID0gMSwgTQorICAgICAgICAgICAgRVJSSSA9IEFCUzEoIENUKCBJICkgLSBDQyggSSwgSiApICkvRVBTCisgICAgICAgICAgICBJRiggRyggSSApLk5FLlJaRVJPICkKKyAgICAgJCAgICAgICAgIEVSUkkgPSBFUlJJL0coIEkgKQorICAgICAgICAgICAgRVJSID0gTUFYKCBFUlIsIEVSUkkgKQorICAgICAgICAgICAgSUYoIEVSUipTUVJUKCBFUFMgKS5HRS5ST05FICkKKyAgICAgJCAgICAgICAgIEdPIFRPIDIzMAorICAyMTAgICAgQ09OVElOVUUKKyoKKyAgMjIwIENPTlRJTlVFCisqCisqICAgICBJZiB0aGUgbG9vcCBjb21wbGV0ZXMsIGFsbCByZXN1bHRzIGFyZSBhdCBsZWFzdCBoYWxmIGFjY3VyYXRlLgorICAgICAgR08gVE8gMjUwCisqCisqICAgICBSZXBvcnQgZmF0YWwgZXJyb3IuCisqCisgIDIzMCBGQVRBTCA9IC5UUlVFLgorICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTkgKQorICAgICAgRE8gMjQwIEkgPSAxLCBNCisgICAgICAgICBJRiggTVYgKVRIRU4KKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk4IClJLCBDVCggSSApLCBDQyggSSwgSiApCisgICAgICAgICBFTFNFCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OCApSSwgQ0MoIEksIEogKSwgQ1QoIEkgKQorICAgICAgICAgRU5EIElGCisgIDI0MCBDT05USU5VRQorICAgICAgSUYoIE4uR1QuMSApCisgICAgICQgICBXUklURSggTk9VVCwgRk1UID0gOTk5NyApSgorKgorICAyNTAgQ09OVElOVUUKKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqKiogRkFUQUwgRVJST1IgLSBDT01QVVRFRCBSRVNVTFQgSVMgTEVTUyBUSEFOIEhBTCcsCisgICAgICQgICAgICAnRiBBQ0NVUkFURSAqKioqKioqJywgLycgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVEVEIFJFJywKKyAgICAgJCAgICAgICdTVUxUICAgICAgICAgICAgICAgICAgICBDT01QVVRFRCBSRVNVTFQnICkKKyA5OTk4IEZPUk1BVCggMVgsIEk3LCAyKCAnICAoJywgRzE1LjYsICcsJywgRzE1LjYsICcpJyApICkKKyA5OTk3IEZPUk1BVCggJyAgICAgIFRIRVNFIEFSRSBUSEUgUkVTVUxUUyBGT1IgQ09MVU1OICcsIEkzICkKKyoKKyogICAgIEVuZCBvZiBaTU1DSC4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMWkUoIFJJLCBSSiwgTFIgKQorKgorKiAgVGVzdHMgaWYgdHdvIGFycmF5cyBhcmUgaWRlbnRpY2FsLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBMUgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBDT01QTEVYKjE2ICAgICAgICAgUkkoICogKSwgUkooICogKQorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIEkKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgRE8gMTAgSSA9IDEsIExSCisgICAgICAgICBJRiggUkkoIEkgKS5ORS5SSiggSSApICkKKyAgICAgJCAgICAgIEdPIFRPIDIwCisgICAxMCBDT05USU5VRQorICAgICAgTFpFID0gLlRSVUUuCisgICAgICBHTyBUTyAzMAorICAgMjAgQ09OVElOVUUKKyAgICAgIExaRSA9IC5GQUxTRS4KKyAgIDMwIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIExaRS4KKyoKKyAgICAgIEVORAorICAgICAgTE9HSUNBTCBGVU5DVElPTiBMWkVSRVMoIFRZUEUsIFVQTE8sIE0sIE4sIEFBLCBBUywgTERBICkKKyoKKyogIFRlc3RzIGlmIHNlbGVjdGVkIGVsZW1lbnRzIGluIHR3byBhcnJheXMgYXJlIGVxdWFsLgorKgorKiAgVFlQRSBpcyAnR0UnIG9yICdIRScgb3IgJ1NZJy4KKyoKKyogIEF1eGlsaWFyeSByb3V0aW5lIGZvciB0ZXN0IHByb2dyYW0gZm9yIExldmVsIDMgQmxhcy4KKyoKKyogIC0tIFdyaXR0ZW4gb24gOC1GZWJydWFyeS0xOTg5LgorKiAgICAgSmFjayBEb25nYXJyYSwgQXJnb25uZSBOYXRpb25hbCBMYWJvcmF0b3J5LgorKiAgICAgSWFpbiBEdWZmLCBBRVJFIEhhcndlbGwuCisqICAgICBKZXJlbXkgRHUgQ3JveiwgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKiAgICAgU3ZlbiBIYW1tYXJsaW5nLCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgTERBLCBNLCBOCisgICAgICBDSEFSQUNURVIqMSAgICAgICAgVVBMTworICAgICAgQ0hBUkFDVEVSKjIgICAgICAgIFRZUEUKKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgQ09NUExFWCoxNiAgICAgICAgIEFBKCBMREEsICogKSwgQVMoIExEQSwgKiApCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUJFRywgSUVORCwgSgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFVQUEVSCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIFVQUEVSID0gVVBMTy5FUS4nVScKKyAgICAgIElGKCBUWVBFLkVRLidHRScgKVRIRU4KKyAgICAgICAgIERPIDIwIEogPSAxLCBOCisgICAgICAgICAgICBETyAxMCBJID0gTSArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgMTAgICAgICAgQ09OVElOVUUKKyAgIDIwICAgIENPTlRJTlVFCisgICAgICBFTFNFIElGKCBUWVBFLkVRLidIRScuT1IuVFlQRS5FUS4nU1knIClUSEVOCisgICAgICAgICBETyA1MCBKID0gMSwgTgorICAgICAgICAgICAgSUYoIFVQUEVSIClUSEVOCisgICAgICAgICAgICAgICBJQkVHID0gMQorICAgICAgICAgICAgICAgSUVORCA9IEoKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgIElCRUcgPSBKCisgICAgICAgICAgICAgICBJRU5EID0gTgorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICBETyAzMCBJID0gMSwgSUJFRyAtIDEKKyAgICAgICAgICAgICAgIElGKCBBQSggSSwgSiApLk5FLkFTKCBJLCBKICkgKQorICAgICAkICAgICAgICAgICAgR08gVE8gNzAKKyAgIDMwICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICBETyA0MCBJID0gSUVORCArIDEsIExEQQorICAgICAgICAgICAgICAgSUYoIEFBKCBJLCBKICkuTkUuQVMoIEksIEogKSApCisgICAgICQgICAgICAgICAgICBHTyBUTyA3MAorICAgNDAgICAgICAgQ09OVElOVUUKKyAgIDUwICAgIENPTlRJTlVFCisgICAgICBFTkQgSUYKKyoKKyAgIDYwIENPTlRJTlVFCisgICAgICBMWkVSRVMgPSAuVFJVRS4KKyAgICAgIEdPIFRPIDgwCisgICA3MCBDT05USU5VRQorICAgICAgTFpFUkVTID0gLkZBTFNFLgorICAgODAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgTFpFUkVTLgorKgorICAgICAgRU5ECisgICAgICBDT01QTEVYKjE2ICAgICBGVU5DVElPTiBaQkVHKCBSRVNFVCApCisqCisqICBHZW5lcmF0ZXMgY29tcGxleCBudW1iZXJzIGFzIHBhaXJzIG9mIHJhbmRvbSBudW1iZXJzIHVuaWZvcm1seQorKiAgZGlzdHJpYnV0ZWQgYmV0d2VlbiAtMC41IGFuZCAwLjUuCisqCisqICBBdXhpbGlhcnkgcm91dGluZSBmb3IgdGVzdCBwcm9ncmFtIGZvciBMZXZlbCAzIEJsYXMuCisqCisqICAtLSBXcml0dGVuIG9uIDgtRmVicnVhcnktMTk4OS4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFib3JhdG9yeS4KKyogICAgIElhaW4gRHVmZiwgQUVSRSBIYXJ3ZWxsLgorKiAgICAgSmVyZW15IER1IENyb3osIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTnVtZXJpY2FsIEFsZ29yaXRobXMgR3JvdXAgTHRkLgorKgorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgTE9HSUNBTCAgICAgICAgICAgIFJFU0VUCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBJTlRFR0VSICAgICAgICAgICAgSSwgSUMsIEosIE1JLCBNSgorKiAgICAgLi4gU2F2ZSBzdGF0ZW1lbnQgLi4KKyAgICAgIFNBVkUgICAgICAgICAgICAgICBJLCBJQywgSiwgTUksIE1KCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgICAgICAgICAgRENNUExYCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCBSRVNFVCApVEhFTgorKiAgICAgICAgSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMuCisgICAgICAgICBNSSA9IDg5MQorICAgICAgICAgTUogPSA0NTcKKyAgICAgICAgIEkgPSA3CisgICAgICAgICBKID0gNworICAgICAgICAgSUMgPSAwCisgICAgICAgICBSRVNFVCA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorKgorKiAgICAgVGhlIHNlcXVlbmNlIG9mIHZhbHVlcyBvZiBJIG9yIEogaXMgYm91bmRlZCBiZXR3ZWVuIDEgYW5kIDk5OS4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gMSwyLDMsNiw3IG9yIDksIHRoZSBwZXJpb2Qgd2lsbCBiZSA1MC4KKyogICAgIElmIGluaXRpYWwgSSBvciBKID0gNCBvciA4LCB0aGUgcGVyaW9kIHdpbGwgYmUgMjUuCisqICAgICBJZiBpbml0aWFsIEkgb3IgSiA9IDUsIHRoZSBwZXJpb2Qgd2lsbCBiZSAxMC4KKyogICAgIElDIGlzIHVzZWQgdG8gYnJlYWsgdXAgdGhlIHBlcmlvZCBieSBza2lwcGluZyAxIHZhbHVlIG9mIEkgb3IgSgorKiAgICAgaW4gNi4KKyoKKyAgICAgIElDID0gSUMgKyAxCisgICAxMCBJID0gSSpNSQorICAgICAgSiA9IEoqTUoKKyAgICAgIEkgPSBJIC0gMTAwMCooIEkvMTAwMCApCisgICAgICBKID0gSiAtIDEwMDAqKCBKLzEwMDAgKQorICAgICAgSUYoIElDLkdFLjUgKVRIRU4KKyAgICAgICAgIElDID0gMAorICAgICAgICAgR08gVE8gMTAKKyAgICAgIEVORCBJRgorICAgICAgWkJFRyA9IERDTVBMWCggKCBJIC0gNTAwICkvMTAwMS4wRDAsICggSiAtIDUwMCApLzEwMDEuMEQwICkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpCRUcuCisqCisgICAgICBFTkQKKyAgICAgIERPVUJMRSBQUkVDSVNJT04gRlVOQ1RJT04gRERJRkYoIFgsIFkgKQorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gICBYLCBZCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIERESUZGID0gWCAtIFkKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIERESUZGLgorKgorICAgICAgRU5ECisgICAgICBTVUJST1VUSU5FIENIS1hFUiggU1JOQU1ULCBJTkZPVCwgTk9VVCwgTEVSUiwgT0sgKQorKgorKiAgVGVzdHMgd2hldGhlciBYRVJCTEEgaGFzIGRldGVjdGVkIGFuIGVycm9yIHdoZW4gaXQgc2hvdWxkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPVCwgTk9VVAorICAgICAgTE9HSUNBTCAgICAgICAgICAgIExFUlIsIE9LCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1UCisqICAgICAuLiBFeGVjdXRhYmxlIFN0YXRlbWVudHMgLi4KKyAgICAgIElGKCAuTk9ULkxFUlIgKVRIRU4KKyAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk5IClJTkZPVCwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgTEVSUiA9IC5GQUxTRS4KKyAgICAgIFJFVFVSTgorKgorIDk5OTkgRk9STUFUKCAnICoqKioqIElMTEVHQUwgVkFMVUUgT0YgUEFSQU1FVEVSIE5VTUJFUiAnLCBJMiwgJyBOT1QgRCcsCisgICAgICQgICAgICAnRVRFQ1RFRCBCWSAnLCBBNiwgJyAqKioqKicgKQorKgorKiAgICAgRW5kIG9mIENIS1hFUi4KKyoKKyAgICAgIEVORAorICAgICAgU1VCUk9VVElORSBYRVJCTEEoIFNSTkFNRSwgSU5GTyApCisqCisqICBUaGlzIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIFhFUkJMQSB0byBiZSB1c2VkIG9ubHkgYXMgcGFydCBvZgorKiAgdGhlIHRlc3QgcHJvZ3JhbSBmb3IgdGVzdGluZyBlcnJvciBleGl0cyBmcm9tIHRoZSBMZXZlbCAzIEJMQVMKKyogIHJvdXRpbmVzLgorKgorKiAgWEVSQkxBICBpcyBhbiBlcnJvciBoYW5kbGVyIGZvciB0aGUgTGV2ZWwgMyBCTEFTIHJvdXRpbmVzLgorKgorKiAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBMZXZlbCAzIEJMQVMgcm91dGluZXMgaWYgYW4gaW5wdXQgcGFyYW1ldGVyIGlzCisqICBpbnZhbGlkLgorKgorKiAgQXV4aWxpYXJ5IHJvdXRpbmUgZm9yIHRlc3QgcHJvZ3JhbSBmb3IgTGV2ZWwgMyBCbGFzLgorKgorKiAgLS0gV3JpdHRlbiBvbiA4LUZlYnJ1YXJ5LTE5ODkuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYm9yYXRvcnkuCisqICAgICBJYWluIER1ZmYsIEFFUkUgSGFyd2VsbC4KKyogICAgIEplcmVteSBEdSBDcm96LCBOdW1lcmljYWwgQWxnb3JpdGhtcyBHcm91cCBMdGQuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE51bWVyaWNhbCBBbGdvcml0aG1zIEdyb3VwIEx0ZC4KKyoKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgICAgICAgICAgICBJTkZPCisgICAgICBDSEFSQUNURVIqNiAgICAgICAgU1JOQU1FCisqICAgICAuLiBTY2FsYXJzIGluIENvbW1vbiAuLgorICAgICAgSU5URUdFUiAgICAgICAgICAgIElORk9ULCBOT1VUCisgICAgICBMT0dJQ0FMICAgICAgICAgICAgTEVSUiwgT0sKKyAgICAgIENIQVJBQ1RFUio2ICAgICAgICBTUk5BTVQKKyogICAgIC4uIENvbW1vbiBibG9ja3MgLi4KKyAgICAgIENPTU1PTiAgICAgICAgICAgICAvSU5GT0MvSU5GT1QsIE5PVVQsIE9LLCBMRVJSCisgICAgICBDT01NT04gICAgICAgICAgICAgL1NSTkFNQy9TUk5BTVQKKyogICAgIC4uIEV4ZWN1dGFibGUgU3RhdGVtZW50cyAuLgorICAgICAgTEVSUiA9IC5UUlVFLgorICAgICAgSUYoIElORk8uTkUuSU5GT1QgKVRIRU4KKyAgICAgICAgIElGKCBJTkZPVC5ORS4wIClUSEVOCisgICAgICAgICAgICBXUklURSggTk9VVCwgRk1UID0gOTk5OSApSU5GTywgSU5GT1QKKyAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIFdSSVRFKCBOT1VULCBGTVQgPSA5OTk3IClJTkZPCisgICAgICAgICBFTkQgSUYKKyAgICAgICAgIE9LID0gLkZBTFNFLgorICAgICAgRU5EIElGCisgICAgICBJRiggU1JOQU1FLk5FLlNSTkFNVCApVEhFTgorICAgICAgICAgV1JJVEUoIE5PVVQsIEZNVCA9IDk5OTggKVNSTkFNRSwgU1JOQU1UCisgICAgICAgICBPSyA9IC5GQUxTRS4KKyAgICAgIEVORCBJRgorICAgICAgUkVUVVJOCisqCisgOTk5OSBGT1JNQVQoICcgKioqKioqKiBYRVJCTEEgV0FTIENBTExFRCBXSVRIIElORk8gPSAnLCBJNiwgJyBJTlNURUFEJywKKyAgICAgJCAgICAgICcgT0YgJywgSTIsICcgKioqKioqKicgKQorIDk5OTggRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBTUk5BTUUgPSAnLCBBNiwgJyBJTlNURScsCisgICAgICQgICAgICAnQUQgT0YgJywgQTYsICcgKioqKioqKicgKQorIDk5OTcgRk9STUFUKCAnICoqKioqKiogWEVSQkxBIFdBUyBDQUxMRUQgV0lUSCBJTkZPID0gJywgSTYsCisgICAgICQgICAgICAnICoqKioqKionICkKKyoKKyogICAgIEVuZCBvZiBYRVJCTEEKKyoKKyAgICAgIEVORAorCmRpZmYgLS1naXQgYS9ibGFzL3hlcmJsYS5jcHAgYi9ibGFzL3hlcmJsYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1NzcxMAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMveGVyYmxhLmNwcApAQCAtMCwwICsxLDIzIEBACisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2lmIChkZWZpbmVkIF9fR05VQ19fKQorI2RlZmluZSBFSUdFTl9XRUFLX0xJTktJTkcgX19hdHRyaWJ1dGVfXyAoKHdlYWspKQorI2Vsc2UKKyNkZWZpbmUgRUlHRU5fV0VBS19MSU5LSU5HCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworRUlHRU5fV0VBS19MSU5LSU5HIGludCB4ZXJibGFfKGNvbnN0IGNoYXIgKiBtc2csIGludCAqaW5mbywgaW50KQoreworICBzdGQ6OmNlcnIgPDwgIkVpZ2VuIEJMQVMgRVJST1IgIyIgPDwgKmluZm8gPDwgIjogIiA8PCBtc2cgPDwgIlxuIjsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ibGFzL3poYm12LmYgYi9ibGFzL3poYm12LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhMGRhNQotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvemhibXYuZgpAQCAtMCwwICsxLDMxMCBAQAorICAgICAgU1VCUk9VVElORSBaSEJNVihVUExPLE4sSyxBTFBIQSxBLExEQSxYLElOQ1gsQkVUQSxZLElOQ1kpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBBTFBIQSxCRVRBCisgICAgICBJTlRFR0VSIElOQ1gsSU5DWSxLLExEQSxOCisgICAgICBDSEFSQUNURVIgVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIENPTVBMRVggQShMREEsKiksWCgqKSxZKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgWkhCTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yICBvcGVyYXRpb24KKyoKKyogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorKgorKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAorKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIGJhbmQgbWF0cml4LCB3aXRoIGsgc3VwZXItZGlhZ29uYWxzLgorKgorKiAgQXJndW1lbnRzCisqICA9PT09PT09PT09CisqCisqICBVUExPICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBVUExPIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cHBlciBvciBsb3dlcgorKiAgICAgICAgICAgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBiYW5kIG1hdHJpeCBBIGlzIGJlaW5nIHN1cHBsaWVkIGFzCisqICAgICAgICAgICBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBUaGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgc3VwcGxpZWQuCisqCisqICAgICAgICAgICAgICBVUExPID0gJ0wnIG9yICdsJyAgIFRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBzdXBwbGllZC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgTiAgICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBOIHNwZWNpZmllcyB0aGUgb3JkZXIgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgTiBtdXN0IGJlIGF0IGxlYXN0IHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEsgICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdXBlci1kaWFnb25hbHMgb2YgdGhlCisqICAgICAgICAgICBtYXRyaXggQS4gSyBtdXN0IHNhdGlzZnkgIDAgLmxlLiBLLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBTFBIQSAgLSBDT01QTEVYKjE2ICAgICAgLgorKiAgICAgICAgICAgT24gZW50cnksIEFMUEhBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGFscGhhLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBICAgICAgLSBDT01QTEVYKjE2ICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiAoIExEQSwgbiApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdVJyBvciAndScsIHRoZSBsZWFkaW5nICggayArIDEgKQorKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhcgorKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4LCBzdXBwbGllZCBjb2x1bW4gYnkKKyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdworKiAgICAgICAgICAgKCBrICsgMSApIG9mIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1cGVyLWRpYWdvbmFsIHN0YXJ0aW5nIGF0CisqICAgICAgICAgICBwb3NpdGlvbiAyIGluIHJvdyBrLCBhbmQgc28gb24uIFRoZSB0b3AgbGVmdCBrIGJ5IGsgdHJpYW5nbGUKKyogICAgICAgICAgIG9mIHRoZSBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLgorKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciB0aGUgdXBwZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiBhIGhlcm1pdGlhbiBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbAorKiAgICAgICAgICAgZnVsbCBtYXRyaXggc3RvcmFnZSB0byBiYW5kIHN0b3JhZ2U6CisqCisqICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4KKyogICAgICAgICAgICAgICAgICAgIE0gPSBLICsgMSAtIEoKKyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gTUFYKCAxLCBKIC0gSyApLCBKCisqICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkKKyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFCisqICAgICAgICAgICAgICAyMCBDT05USU5VRQorKgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBsZWFkaW5nICggayArIDEgKQorKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhcgorKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4LCBzdXBwbGllZCBjb2x1bW4gYnkKKyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdyAxIG9mCisqICAgICAgICAgICB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdWItZGlhZ29uYWwgc3RhcnRpbmcgYXQgcG9zaXRpb24gMSBpbgorKiAgICAgICAgICAgcm93IDIsIGFuZCBzbyBvbi4gVGhlIGJvdHRvbSByaWdodCBrIGJ5IGsgdHJpYW5nbGUgb2YgdGhlCisqICAgICAgICAgICBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLgorKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciB0aGUgbG93ZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiBhIGhlcm1pdGlhbiBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbAorKiAgICAgICAgICAgZnVsbCBtYXRyaXggc3RvcmFnZSB0byBiYW5kIHN0b3JhZ2U6CisqCisqICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4KKyogICAgICAgICAgICAgICAgICAgIE0gPSAxIC0gSgorKiAgICAgICAgICAgICAgICAgICAgRE8gMTAsIEkgPSBKLCBNSU4oIE4sIEogKyBLICkKKyogICAgICAgICAgICAgICAgICAgICAgIEEoIE0gKyBJLCBKICkgPSBtYXRyaXgoIEksIEogKQorKiAgICAgICAgICAgICAgMTAgICAgQ09OVElOVUUKKyogICAgICAgICAgICAgIDIwIENPTlRJTlVFCisqCisqICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiB0aGUgZGlhZ29uYWwgZWxlbWVudHMgbmVlZAorKiAgICAgICAgICAgbm90IGJlIHNldCBhbmQgYXJlIGFzc3VtZWQgdG8gYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgTERBICAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBMREEgc3BlY2lmaWVzIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgQSBhcyBkZWNsYXJlZAorKiAgICAgICAgICAgaW4gdGhlIGNhbGxpbmcgKHN1YikgcHJvZ3JhbS4gTERBIG11c3QgYmUgYXQgbGVhc3QKKyogICAgICAgICAgICggayArIDEgKS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWCAgICAgIC0gQ09NUExFWCoxNiAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlCisqICAgICAgICAgICB2ZWN0b3IgeC4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQkVUQSAgIC0gQ09NUExFWCoxNiAgICAgIC4KKyogICAgICAgICAgIE9uIGVudHJ5LCBCRVRBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGJldGEuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFkgICAgICAtIENPTVBMRVgqMTYgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNZICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFkgbXVzdCBjb250YWluIHRoZQorKiAgICAgICAgICAgdmVjdG9yIHkuIE9uIGV4aXQsIFkgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIHVwZGF0ZWQgdmVjdG9yIHkuCisqCisqICBJTkNZICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1kgc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWS4gSU5DWSBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBPTkUKKyAgICAgIFBBUkFNRVRFUiAoT05FPSAoMS4wRCswLDAuMEQrMCkpCisgICAgICBET1VCTEUgQ09NUExFWCBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89ICgwLjBEKzAsMC4wRCswKSkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBURU1QMSxURU1QMgorICAgICAgSU5URUdFUiBJLElORk8sSVgsSVksSixKWCxKWSxLUExVUzEsS1gsS1ksTAorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCBMU0FNRQorICAgICAgRVhURVJOQUwgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgWEVSQkxBCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDIERCTEUsRENPTkpHLE1BWCxNSU4KKyogICAgIC4uCisqCisqICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorKgorICAgICAgSU5GTyA9IDAKKyAgICAgIElGICguTk9ULkxTQU1FKFVQTE8sJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKFVQTE8sJ0wnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAxCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gMgorICAgICAgRUxTRSBJRiAoSy5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDMKKyAgICAgIEVMU0UgSUYgKExEQS5MVC4gKEsrMSkpIFRIRU4KKyAgICAgICAgICBJTkZPID0gNgorICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDgKKyAgICAgIEVMU0UgSUYgKElOQ1kuRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSAxMQorICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ1pIQk1WICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKChOLkVRLjApIC5PUi4gKChBTFBIQS5FUS5aRVJPKS5BTkQuIChCRVRBLkVRLk9ORSkpKSBSRVRVUk4KKyoKKyogICAgIFNldCB1cCB0aGUgc3RhcnQgcG9pbnRzIGluICBYICBhbmQgIFkuCisqCisgICAgICBJRiAoSU5DWC5HVC4wKSBUSEVOCisgICAgICAgICAgS1ggPSAxCisgICAgICBFTFNFCisgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgRU5EIElGCisgICAgICBJRiAoSU5DWS5HVC4wKSBUSEVOCisgICAgICAgICAgS1kgPSAxCisgICAgICBFTFNFCisgICAgICAgICAgS1kgPSAxIC0gKE4tMSkqSU5DWQorICAgICAgRU5EIElGCisqCisqICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQQorKiAgICAgYXJlIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQS4KKyoKKyogICAgIEZpcnN0IGZvcm0gIHkgOj0gYmV0YSp5LgorKgorICAgICAgSUYgKEJFVEEuTkUuT05FKSBUSEVOCisgICAgICAgICAgSUYgKElOQ1kuRVEuMSkgVEhFTgorICAgICAgICAgICAgICBJRiAoQkVUQS5FUS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJKSA9IFpFUk8KKyAgIDEwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIERPIDIwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gQkVUQSpZKEkpCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIElZID0gS1kKKyAgICAgICAgICAgICAgSUYgKEJFVEEuRVEuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gWkVSTworICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICAzMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBETyA0MCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBCRVRBKlkoSVkpCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisgICAgICBJRiAoQUxQSEEuRVEuWkVSTykgUkVUVVJOCisgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisqCisqICAgICAgICBGb3JtICB5ICB3aGVuIHVwcGVyIHRyaWFuZ2xlIG9mIEEgaXMgc3RvcmVkLgorKgorICAgICAgICAgIEtQTFVTMSA9IEsgKyAxCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDYwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IE1BWCgxLEotSyksSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWShJKSArIFRFTVAxKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIERDT05KRyhBKEwrSSxKKSkqWChJKQorICAgNTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSikgPSBZKEopICsgVEVNUDEqREJMRShBKEtQTFVTMSxKKSkgKyBBTFBIQSpURU1QMgorICAgNjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICBKWSA9IEtZCisgICAgICAgICAgICAgIERPIDgwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKWCkKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgSVkgPSBLWQorICAgICAgICAgICAgICAgICAgTCA9IEtQTFVTMSAtIEoKKyAgICAgICAgICAgICAgICAgIERPIDcwIEkgPSBNQVgoMSxKLUspLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgWShJWSkgPSBZKElZKSArIFRFTVAxKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIERDT05KRyhBKEwrSSxKKSkqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICA3MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKWSkgPSBZKEpZKSArIFRFTVAxKkRCTEUoQShLUExVUzEsSikpICsgQUxQSEEqVEVNUDIKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBKWSA9IEpZICsgSU5DWQorICAgICAgICAgICAgICAgICAgSUYgKEouR1QuSykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgIEtYID0gS1ggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS1kgPSBLWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgODAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgeSAgd2hlbiBsb3dlciB0cmlhbmdsZSBvZiBBIGlzIHN0b3JlZC4KKyoKKyAgICAgICAgICBJRiAoKElOQ1guRVEuMSkgLkFORC4gKElOQ1kuRVEuMSkpIFRIRU4KKyAgICAgICAgICAgICAgRE8gMTAwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBZKEopID0gWShKKSArIFRFTVAxKkRCTEUoQSgxLEopKQorICAgICAgICAgICAgICAgICAgTCA9IDEgLSBKCisgICAgICAgICAgICAgICAgICBETyA5MCBJID0gSiArIDEsTUlOKE4sSitLKQorICAgICAgICAgICAgICAgICAgICAgIFkoSSkgPSBZKEkpICsgVEVNUDEqQShMK0ksSikKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgRENPTkpHKEEoTCtJLEopKSpYKEkpCisgICA5MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKKSA9IFkoSikgKyBBTFBIQSpURU1QMgorICAxMDAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICBKWSA9IEtZCisgICAgICAgICAgICAgIERPIDEyMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKlgoSlgpCisgICAgICAgICAgICAgICAgICBURU1QMiA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIFkoSlkpID0gWShKWSkgKyBURU1QMSpEQkxFKEEoMSxKKSkKKyAgICAgICAgICAgICAgICAgIEwgPSAxIC0gSgorICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgSVkgPSBKWQorICAgICAgICAgICAgICAgICAgRE8gMTEwIEkgPSBKICsgMSxNSU4oTixKK0spCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gWShJWSkgKyBURU1QMSpBKEwrSSxKKQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAyID0gVEVNUDIgKyBEQ09OSkcoQShMK0ksSikpKlgoSVgpCisgIDExMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgWShKWSkgPSBZKEpZKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgMTIwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgWkhCTVYgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL3pocG12LmYgYi9ibGFzL3pocG12LmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4NjEwOAotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvemhwbXYuZgpAQCAtMCwwICsxLDI3MiBAQAorICAgICAgU1VCUk9VVElORSBaSFBNVihVUExPLE4sQUxQSEEsQVAsWCxJTkNYLEJFVEEsWSxJTkNZKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIENPTVBMRVggQUxQSEEsQkVUQQorICAgICAgSU5URUdFUiBJTkNYLElOQ1ksTgorICAgICAgQ0hBUkFDVEVSIFVQTE8KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBDT01QTEVYIEFQKCopLFgoKiksWSgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIFpIUE1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb24KKyoKKyogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorKgorKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAorKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwcGVyIG9yIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBBIGlzIHN1cHBsaWVkIGluIHRoZSBwYWNrZWQKKyogICAgICAgICAgIGFycmF5IEFQIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIFRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBpbiBBUC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgVGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQUxQSEEgIC0gQ09NUExFWCoxNiAgICAgIC4KKyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQVAgICAgIC0gQ09NUExFWCoxNiAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnVScgb3IgJ3UnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKQorKiAgICAgICAgICAgYW5kIGEoIDIsIDIgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKQorKiAgICAgICAgICAgYW5kIGEoIDMsIDEgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIE5vdGUgdGhhdCB0aGUgaW1hZ2luYXJ5IHBhcnRzIG9mIHRoZSBkaWFnb25hbCBlbGVtZW50cyBuZWVkCisqICAgICAgICAgICBub3QgYmUgc2V0IGFuZCBhcmUgYXNzdW1lZCB0byBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBDT01QTEVYKjE2ICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeC4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQkVUQSAgIC0gQ09NUExFWCoxNiAgICAgIC4KKyogICAgICAgICAgIE9uIGVudHJ5LCBCRVRBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGJldGEuIFdoZW4gQkVUQSBpcworKiAgICAgICAgICAgc3VwcGxpZWQgYXMgemVybyB0aGVuIFkgbmVlZCBub3QgYmUgc2V0IG9uIGlucHV0LgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBZICAgICAgLSBDT01QTEVYKjE2ICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWSApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBZIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeS4gT24gZXhpdCwgWSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgdXBkYXRlZAorKiAgICAgICAgICAgdmVjdG9yIHkuCisqCisqICBJTkNZICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1kgc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWS4gSU5DWSBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBPTkUKKyAgICAgIFBBUkFNRVRFUiAoT05FPSAoMS4wRCswLDAuMEQrMCkpCisgICAgICBET1VCTEUgQ09NUExFWCBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89ICgwLjBEKzAsMC4wRCswKSkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBURU1QMSxURU1QMgorICAgICAgSU5URUdFUiBJLElORk8sSVgsSVksSixKWCxKWSxLLEtLLEtYLEtZCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgREJMRSxEQ09OSkcKKyogICAgIC4uCisqCisqICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorKgorICAgICAgSU5GTyA9IDAKKyAgICAgIElGICguTk9ULkxTQU1FKFVQTE8sJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKFVQTE8sJ0wnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAxCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gMgorICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDYKKyAgICAgIEVMU0UgSUYgKElOQ1kuRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA5CisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkZPLk5FLjApIFRIRU4KKyAgICAgICAgICBDQUxMIFhFUkJMQSgnWkhQTVYgJyxJTkZPKQorICAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuCisqCisgICAgICBJRiAoKE4uRVEuMCkgLk9SLiAoKEFMUEhBLkVRLlpFUk8pLkFORC4gKEJFVEEuRVEuT05FKSkpIFJFVFVSTgorKgorKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludHMgaW4gIFggIGFuZCAgWS4KKyoKKyAgICAgIElGIChJTkNYLkdULjApIFRIRU4KKyAgICAgICAgICBLWCA9IDEKKyAgICAgIEVMU0UKKyAgICAgICAgICBLWCA9IDEgLSAoTi0xKSpJTkNYCisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkNZLkdULjApIFRIRU4KKyAgICAgICAgICBLWSA9IDEKKyAgICAgIEVMU0UKKyAgICAgICAgICBLWSA9IDEgLSAoTi0xKSpJTkNZCisgICAgICBFTkQgSUYKKyoKKyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBBUAorKiAgICAgYXJlIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQVAuCisqCisqICAgICBGaXJzdCBmb3JtICB5IDo9IGJldGEqeS4KKyoKKyAgICAgIElGIChCRVRBLk5FLk9ORSkgVEhFTgorICAgICAgICAgIElGIChJTkNZLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgSUYgKEJFVEEuRVEuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSSkgPSBaRVJPCisgICAxMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBETyAyMCBJID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgWShJKSA9IEJFVEEqWShJKQorICAgMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBJWSA9IEtZCisgICAgICAgICAgICAgIElGIChCRVRBLkVRLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDMwIEkgPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IFpFUk8KKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IElZICsgSU5DWQorICAgMzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgRE8gNDAgSSA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFkoSVkpID0gQkVUQSpZKElZKQorICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICA0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorICAgICAgSUYgKEFMUEhBLkVRLlpFUk8pIFJFVFVSTgorICAgICAgS0sgPSAxCisgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisqCisqICAgICAgICBGb3JtICB5ICB3aGVuIEFQIGNvbnRhaW5zIHRoZSB1cHBlciB0cmlhbmdsZS4KKyoKKyAgICAgICAgICBJRiAoKElOQ1guRVEuMSkgLkFORC4gKElOQ1kuRVEuMSkpIFRIRU4KKyAgICAgICAgICAgICAgRE8gNjAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpYKEopCisgICAgICAgICAgICAgICAgICBURU1QMiA9IFpFUk8KKyAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IDEsSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWShJKSArIFRFTVAxKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIERDT05KRyhBUChLKSkqWChJKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgNTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSikgPSBZKEopICsgVEVNUDEqREJMRShBUChLSytKLTEpKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgNjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICBKWSA9IEtZCisgICAgICAgICAgICAgIERPIDgwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKWCkKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgSVkgPSBLWQorICAgICAgICAgICAgICAgICAgRE8gNzAgSyA9IEtLLEtLICsgSiAtIDIKKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IFkoSVkpICsgVEVNUDEqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgRENPTkpHKEFQKEspKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgIDcwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBZKEpZKSA9IFkoSlkpICsgVEVNUDEqREJMRShBUChLSytKLTEpKSArIEFMUEhBKlRFTVAyCisgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgSlkgPSBKWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICA4MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRU5EIElGCisgICAgICBFTFNFCisqCisqICAgICAgICBGb3JtICB5ICB3aGVuIEFQIGNvbnRhaW5zIHRoZSBsb3dlciB0cmlhbmdsZS4KKyoKKyAgICAgICAgICBJRiAoKElOQ1guRVEuMSkgLkFORC4gKElOQ1kuRVEuMSkpIFRIRU4KKyAgICAgICAgICAgICAgRE8gMTAwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKKQorICAgICAgICAgICAgICAgICAgVEVNUDIgPSBaRVJPCisgICAgICAgICAgICAgICAgICBZKEopID0gWShKKSArIFRFTVAxKkRCTEUoQVAoS0spKQorICAgICAgICAgICAgICAgICAgSyA9IEtLICsgMQorICAgICAgICAgICAgICAgICAgRE8gOTAgSSA9IEogKyAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBZKEkpID0gWShJKSArIFRFTVAxKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBURU1QMiArIERDT05KRyhBUChLKSkqWChJKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgOTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSikgPSBZKEopICsgQUxQSEEqVEVNUDIKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyAoTi1KKzEpCisgIDEwMCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgIEpZID0gS1kKKyAgICAgICAgICAgICAgRE8gMTIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIFRFTVAxID0gQUxQSEEqWChKWCkKKyAgICAgICAgICAgICAgICAgIFRFTVAyID0gWkVSTworICAgICAgICAgICAgICAgICAgWShKWSkgPSBZKEpZKSArIFRFTVAxKkRCTEUoQVAoS0spKQorICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgSVkgPSBKWQorICAgICAgICAgICAgICAgICAgRE8gMTEwIEsgPSBLSyArIDEsS0sgKyBOIC0gSgorICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBJWSArIElOQ1kKKyAgICAgICAgICAgICAgICAgICAgICBZKElZKSA9IFkoSVkpICsgVEVNUDEqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IFRFTVAyICsgRENPTkpHKEFQKEspKSpYKElYKQorICAxMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIFkoSlkpID0gWShKWSkgKyBBTFBIQSpURU1QMgorICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgIEpZID0gSlkgKyBJTkNZCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgKE4tSisxKQorICAxMjAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBaSFBNViAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvemhwci5mIGIvYmxhcy96aHByLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlZmJjNwotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvemhwci5mCkBAIC0wLDAgKzEsMjIwIEBACisgICAgICBTVUJST1VUSU5FIFpIUFIoVVBMTyxOLEFMUEhBLFgsSU5DWCxBUCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBQUkVDSVNJT04gQUxQSEEKKyAgICAgIElOVEVHRVIgSU5DWCxOCisgICAgICBDSEFSQUNURVIgVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIENPTVBMRVggQVAoKiksWCgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIFpIUFIgICAgcGVyZm9ybXMgdGhlIGhlcm1pdGlhbiByYW5rIDEgb3BlcmF0aW9uCisqCisqICAgICBBIDo9IGFscGhhKngqY29uamcoIHgnICkgKyBBLAorKgorKiAgd2hlcmUgYWxwaGEgaXMgYSByZWFsIHNjYWxhciwgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCBBIGlzIGFuCisqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwcGVyIG9yIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIG1hdHJpeCBBIGlzIHN1cHBsaWVkIGluIHRoZSBwYWNrZWQKKyogICAgICAgICAgIGFycmF5IEFQIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBVUExPID0gJ1UnIG9yICd1JyAgIFRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBpbiBBUC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgVGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQUxQSEEgIC0gRE9VQkxFIFBSRUNJU0lPTi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBBTFBIQSBzcGVjaWZpZXMgdGhlIHNjYWxhciBhbHBoYS4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWCAgICAgIC0gQ09NUExFWCoxNiAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1ggKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWCBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHguCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIElOQ1ggICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBYLiBJTkNYIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFQICAgICAtIENPTVBMRVgqMTYgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0CisqICAgICAgICAgICAoICggbiooIG4gKyAxICkgKS8yICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCAgVVBMTyA9ICdVJyBvciAndScsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIGhlcm1pdGlhbiBtYXRyaXgKKyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKQorKiAgICAgICAgICAgY29udGFpbnMgYSggMSwgMSApLCBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMSwgMiApCisqICAgICAgICAgICBhbmQgYSggMiwgMiApIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLiBPbiBleGl0LCB0aGUgYXJyYXkKKyogICAgICAgICAgIEFQIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlCisqICAgICAgICAgICB1cGRhdGVkIG1hdHJpeC4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKQorKiAgICAgICAgICAgYW5kIGEoIDMsIDEgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4gT24gZXhpdCwgdGhlIGFycmF5CisqICAgICAgICAgICBBUCBpcyBvdmVyd3JpdHRlbiBieSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZQorKiAgICAgICAgICAgdXBkYXRlZCBtYXRyaXguCisqICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiB0aGUgZGlhZ29uYWwgZWxlbWVudHMgbmVlZAorKiAgICAgICAgICAgbm90IGJlIHNldCwgdGhleSBhcmUgYXNzdW1lZCB0byBiZSB6ZXJvLCBhbmQgb24gZXhpdCB0aGV5CisqICAgICAgICAgICBhcmUgc2V0IHRvIHplcm8uCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89ICgwLjBEKzAsMC4wRCswKSkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBURU1QCisgICAgICBJTlRFR0VSIEksSU5GTyxJWCxKLEpYLEssS0ssS1gKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgTFNBTUUKKyAgICAgIEVYVEVSTkFMIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMIFhFUkJMQQorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyBEQkxFLERDT05KRworKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKE4uTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGIChJTkNYLkVRLjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNQorICAgICAgRU5EIElGCisgICAgICBJRiAoSU5GTy5ORS4wKSBUSEVOCisgICAgICAgICAgQ0FMTCBYRVJCTEEoJ1pIUFIgICcsSU5GTykKKyAgICAgICAgICBSRVRVUk4KKyAgICAgIEVORCBJRgorKgorKiAgICAgUXVpY2sgcmV0dXJuIGlmIHBvc3NpYmxlLgorKgorICAgICAgSUYgKChOLkVRLjApIC5PUi4gKEFMUEhBLkVRLkRCTEUoWkVSTykpKSBSRVRVUk4KKyoKKyogICAgIFNldCB0aGUgc3RhcnQgcG9pbnQgaW4gWCBpZiB0aGUgaW5jcmVtZW50IGlzIG5vdCB1bml0eS4KKyoKKyAgICAgIElGIChJTkNYLkxFLjApIFRIRU4KKyAgICAgICAgICBLWCA9IDEgLSAoTi0xKSpJTkNYCisgICAgICBFTFNFIElGIChJTkNYLk5FLjEpIFRIRU4KKyAgICAgICAgICBLWCA9IDEKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEFQCisqICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4KKyoKKyAgICAgIEtLID0gMQorICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgQSAgd2hlbiB1cHBlciB0cmlhbmdsZSBpcyBzdG9yZWQgaW4gQVAuCisqCisgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICBETyAyMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IEFMUEhBKkRDT05KRyhYKEopKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKEkpKlRFTVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICAxMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBBUChLSytKLTEpID0gREJMRShBUChLSytKLTEpKSArIERCTEUoWChKKSpURU1QKQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLK0otMSkgPSBEQkxFKEFQKEtLK0otMSkpCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgICAyMCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgIERPIDQwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IEFMUEhBKkRDT05KRyhYKEpYKSkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSyA9IEtLLEtLICsgSiAtIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVAoSykgPSBBUChLKSArIFgoSVgpKlRFTVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgIDMwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLK0otMSkgPSBEQkxFKEFQKEtLK0otMSkpICsgREJMRShYKEpYKSpURU1QKQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLK0otMSkgPSBEQkxFKEFQKEtLK0otMSkpCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgNDAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgQSAgd2hlbiBsb3dlciB0cmlhbmdsZSBpcyBzdG9yZWQgaW4gQVAuCisqCisgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICBETyA2MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IEFMUEhBKkRDT05KRyhYKEopKQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLKSA9IERCTEUoQVAoS0spKSArIERCTEUoVEVNUCpYKEopKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSyArIDEKKyAgICAgICAgICAgICAgICAgICAgICBETyA1MCBJID0gSiArIDEsTgorICAgICAgICAgICAgICAgICAgICAgICAgICBBUChLKSA9IEFQKEspICsgWChJKSpURU1QCisgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgNTAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgQVAoS0spID0gREJMRShBUChLSykpCisgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBOIC0gSiArIDEKKyAgIDYwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgRE8gODAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gQUxQSEEqRENPTkpHKFgoSlgpKQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLKSA9IERCTEUoQVAoS0spKSArIERCTEUoVEVNUCpYKEpYKSkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEpYCisgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSyA9IEtLICsgMSxLSyArIE4gLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKElYKSpURU1QCisgICA3MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICBBUChLSykgPSBEQkxFKEFQKEtLKSkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBOIC0gSiArIDEKKyAgIDgwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgWkhQUiAgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9ibGFzL3pocHIyLmYgYi9ibGFzL3pocHIyLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5Nzc0NgotLS0gL2Rldi9udWxsCisrKyBiL2JsYXMvemhwcjIuZgpAQCAtMCwwICsxLDI1NSBAQAorICAgICAgU1VCUk9VVElORSBaSFBSMihVUExPLE4sQUxQSEEsWCxJTkNYLFksSU5DWSxBUCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBDT01QTEVYIEFMUEhBCisgICAgICBJTlRFR0VSIElOQ1gsSU5DWSxOCisgICAgICBDSEFSQUNURVIgVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIENPTVBMRVggQVAoKiksWCgqKSxZKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgWkhQUjIgIHBlcmZvcm1zIHRoZSBoZXJtaXRpYW4gcmFuayAyIG9wZXJhdGlvbgorKgorKiAgICAgQSA6PSBhbHBoYSp4KmNvbmpnKCB5JyApICsgY29uamcoIGFscGhhICkqeSpjb25qZyggeCcgKSArIEEsCisqCisqICB3aGVyZSBhbHBoYSBpcyBhIHNjYWxhciwgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4KKyogIG4gYnkgbiBoZXJtaXRpYW4gbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgdXBwZXIgb3IgbG93ZXIKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4IEEgaXMgc3VwcGxpZWQgaW4gdGhlIHBhY2tlZAorKiAgICAgICAgICAgYXJyYXkgQVAgYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgVGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBBIGlzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkIGluIEFQLgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBUaGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIEEgaXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgaW4gQVAuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBTFBIQSAgLSBDT01QTEVYKjE2ICAgICAgLgorKiAgICAgICAgICAgT24gZW50cnksIEFMUEhBIHNwZWNpZmllcyB0aGUgc2NhbGFyIGFscGhhLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBYICAgICAgLSBDT01QTEVYKjE2ICAgICAgIGFycmF5IG9mIGRpbWVuc2lvbiBhdCBsZWFzdAorKiAgICAgICAgICAgKCAxICsgKCBuIC0gMSApKmFicyggSU5DWCApICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnksIHRoZSBpbmNyZW1lbnRlZCBhcnJheSBYIG11c3QgY29udGFpbiB0aGUgbgorKiAgICAgICAgICAgZWxlbWVudCB2ZWN0b3IgeC4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgWSAgICAgIC0gQ09NUExFWCoxNiAgICAgICBhcnJheSBvZiBkaW1lbnNpb24gYXQgbGVhc3QKKyogICAgICAgICAgICggMSArICggbiAtIDEgKSphYnMoIElOQ1kgKSApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5LCB0aGUgaW5jcmVtZW50ZWQgYXJyYXkgWSBtdXN0IGNvbnRhaW4gdGhlIG4KKyogICAgICAgICAgIGVsZW1lbnQgdmVjdG9yIHkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIElOQ1kgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgSU5DWSBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCBmb3IgdGhlIGVsZW1lbnRzIG9mCisqICAgICAgICAgICBZLiBJTkNZIG11c3Qgbm90IGJlIHplcm8uCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIEFQICAgICAtIENPTVBMRVgqMTYgICAgICAgYXJyYXkgb2YgRElNRU5TSU9OIGF0IGxlYXN0CisqICAgICAgICAgICAoICggbiooIG4gKyAxICkgKS8yICkuCisqICAgICAgICAgICBCZWZvcmUgZW50cnkgd2l0aCAgVVBMTyA9ICdVJyBvciAndScsIHRoZSBhcnJheSBBUCBtdXN0CisqICAgICAgICAgICBjb250YWluIHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlIGhlcm1pdGlhbiBtYXRyaXgKKyogICAgICAgICAgIHBhY2tlZCBzZXF1ZW50aWFsbHksIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKQorKiAgICAgICAgICAgY29udGFpbnMgYSggMSwgMSApLCBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMSwgMiApCisqICAgICAgICAgICBhbmQgYSggMiwgMiApIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLiBPbiBleGl0LCB0aGUgYXJyYXkKKyogICAgICAgICAgIEFQIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgdGhlCisqICAgICAgICAgICB1cGRhdGVkIG1hdHJpeC4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBoZXJtaXRpYW4gbWF0cml4CisqICAgICAgICAgICBwYWNrZWQgc2VxdWVudGlhbGx5LCBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkKKyogICAgICAgICAgIGNvbnRhaW5zIGEoIDEsIDEgKSwgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDIsIDEgKQorKiAgICAgICAgICAgYW5kIGEoIDMsIDEgKSByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4gT24gZXhpdCwgdGhlIGFycmF5CisqICAgICAgICAgICBBUCBpcyBvdmVyd3JpdHRlbiBieSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZQorKiAgICAgICAgICAgdXBkYXRlZCBtYXRyaXguCisqICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGltYWdpbmFyeSBwYXJ0cyBvZiB0aGUgZGlhZ29uYWwgZWxlbWVudHMgbmVlZAorKiAgICAgICAgICAgbm90IGJlIHNldCwgdGhleSBhcmUgYXNzdW1lZCB0byBiZSB6ZXJvLCBhbmQgb24gZXhpdCB0aGV5CisqICAgICAgICAgICBhcmUgc2V0IHRvIHplcm8uCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89ICgwLjBEKzAsMC4wRCswKSkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBURU1QMSxURU1QMgorICAgICAgSU5URUdFUiBJLElORk8sSVgsSVksSixKWCxKWSxLLEtLLEtYLEtZCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgREJMRSxEQ09OSkcKKyogICAgIC4uCisqCisqICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorKgorICAgICAgSU5GTyA9IDAKKyAgICAgIElGICguTk9ULkxTQU1FKFVQTE8sJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKFVQTE8sJ0wnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAxCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gMgorICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDUKKyAgICAgIEVMU0UgSUYgKElOQ1kuRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA3CisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkZPLk5FLjApIFRIRU4KKyAgICAgICAgICBDQUxMIFhFUkJMQSgnWkhQUjIgJyxJTkZPKQorICAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuCisqCisgICAgICBJRiAoKE4uRVEuMCkgLk9SLiAoQUxQSEEuRVEuWkVSTykpIFJFVFVSTgorKgorKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludHMgaW4gWCBhbmQgWSBpZiB0aGUgaW5jcmVtZW50cyBhcmUgbm90IGJvdGgKKyogICAgIHVuaXR5LgorKgorICAgICAgSUYgKChJTkNYLk5FLjEpIC5PUi4gKElOQ1kuTkUuMSkpIFRIRU4KKyAgICAgICAgICBJRiAoSU5DWC5HVC4wKSBUSEVOCisgICAgICAgICAgICAgIEtYID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgICAgIEVORCBJRgorICAgICAgICAgIElGIChJTkNZLkdULjApIFRIRU4KKyAgICAgICAgICAgICAgS1kgPSAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLWSA9IDEgLSAoTi0xKSpJTkNZCisgICAgICAgICAgRU5EIElGCisgICAgICAgICAgSlggPSBLWAorICAgICAgICAgIEpZID0gS1kKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IEFQCisqICAgICBhcmUgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4KKyoKKyAgICAgIEtLID0gMQorICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgQSAgd2hlbiB1cHBlciB0cmlhbmdsZSBpcyBzdG9yZWQgaW4gQVAuCisqCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDIwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGICgoWChKKS5ORS5aRVJPKSAuT1IuIChZKEopLk5FLlpFUk8pKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpEQ09OSkcoWShKKSkKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IERDT05KRyhBTFBIQSpYKEopKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSworICAgICAgICAgICAgICAgICAgICAgIERPIDEwIEkgPSAxLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKEkpKlRFTVAxICsgWShJKSpURU1QMgorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDEwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLK0otMSkgPSBEQkxFKEFQKEtLK0otMSkpICsKKyAgICAgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJMRShYKEopKlRFTVAxK1koSikqVEVNUDIpCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgQVAoS0srSi0xKSA9IERCTEUoQVAoS0srSi0xKSkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIEoKKyAgIDIwICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIERPIDQwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGICgoWChKWCkuTkUuWkVSTykgLk9SLiAoWShKWSkuTkUuWkVSTykpIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QMSA9IEFMUEhBKkRDT05KRyhZKEpZKSkKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IERDT05KRyhBTFBIQSpYKEpYKSkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgSVkgPSBLWQorICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEsgPSBLSyxLSyArIEogLSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKElYKSpURU1QMSArIFkoSVkpKlRFTVAyCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICAzMCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBBUChLSytKLTEpID0gREJMRShBUChLSytKLTEpKSArCisgICAgICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTEUoWChKWCkqVEVNUDErWShKWSkqVEVNUDIpCisgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgQVAoS0srSi0xKSA9IERCTEUoQVAoS0srSi0xKSkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgIEpZID0gSlkgKyBJTkNZCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgNDAgICAgICAgICBDT05USU5VRQorICAgICAgICAgIEVORCBJRgorICAgICAgRUxTRQorKgorKiAgICAgICAgRm9ybSAgQSAgd2hlbiBsb3dlciB0cmlhbmdsZSBpcyBzdG9yZWQgaW4gQVAuCisqCisgICAgICAgICAgSUYgKChJTkNYLkVRLjEpIC5BTkQuIChJTkNZLkVRLjEpKSBUSEVOCisgICAgICAgICAgICAgIERPIDYwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgIElGICgoWChKKS5ORS5aRVJPKSAuT1IuIChZKEopLk5FLlpFUk8pKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpEQ09OSkcoWShKKSkKKyAgICAgICAgICAgICAgICAgICAgICBURU1QMiA9IERDT05KRyhBTFBIQSpYKEopKQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLKSA9IERCTEUoQVAoS0spKSArCisgICAgICsgICAgICAgICAgICAgICAgICAgICAgICAgREJMRShYKEopKlRFTVAxK1koSikqVEVNUDIpCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLICsgMQorICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSBKICsgMSxOCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKEkpKlRFTVAxICsgWShJKSpURU1QMgorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgIDUwICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgIEFQKEtLKSA9IERCTEUoQVAoS0spKQorICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgTiAtIEogKyAxCisgICA2MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBETyA4MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICBJRiAoKFgoSlgpLk5FLlpFUk8pIC5PUi4gKFkoSlkpLk5FLlpFUk8pKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDEgPSBBTFBIQSpEQ09OSkcoWShKWSkpCisgICAgICAgICAgICAgICAgICAgICAgVEVNUDIgPSBEQ09OSkcoQUxQSEEqWChKWCkpCisgICAgICAgICAgICAgICAgICAgICAgQVAoS0spID0gREJMRShBUChLSykpICsKKyAgICAgKyAgICAgICAgICAgICAgICAgICAgICAgICBEQkxFKFgoSlgpKlRFTVAxK1koSlkpKlRFTVAyKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgICAgICBJWSA9IEpZCisgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSyA9IEtLICsgMSxLSyArIE4gLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgIElZID0gSVkgKyBJTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFQKEspID0gQVAoSykgKyBYKElYKSpURU1QMSArIFkoSVkpKlRFTVAyCisgICA3MCAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICBBUChLSykgPSBEQkxFKEFQKEtLKSkKKyAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgIEpZID0gSlkgKyBJTkNZCisgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgTiAtIEogKyAxCisgICA4MCAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpIUFIyIC4KKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy96dGJtdi5mIGIvYmxhcy96dGJtdi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODVjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3p0Ym12LmYKQEAgLTAsMCArMSwzNjYgQEAKKyAgICAgIFNVQlJPVVRJTkUgWlRCTVYoVVBMTyxUUkFOUyxESUFHLE4sSyxBLExEQSxYLElOQ1gpCisqICAgICAuLiBTY2FsYXIgQXJndW1lbnRzIC4uCisgICAgICBJTlRFR0VSIElOQ1gsSyxMREEsTgorICAgICAgQ0hBUkFDVEVSIERJQUcsVFJBTlMsVVBMTworKiAgICAgLi4KKyogICAgIC4uIEFycmF5IEFyZ3VtZW50cyAuLgorICAgICAgRE9VQkxFIENPTVBMRVggQShMREEsKiksWCgqKQorKiAgICAgLi4KKyoKKyogIFB1cnBvc2UKKyogID09PT09PT0KKyoKKyogIFpUQk1WICBwZXJmb3JtcyBvbmUgb2YgdGhlIG1hdHJpeC12ZWN0b3Igb3BlcmF0aW9ucworKgorKiAgICAgeCA6PSBBKngsICAgb3IgICB4IDo9IEEnKngsICAgb3IgICB4IDo9IGNvbmpnKCBBJyApKngsCisqCisqICB3aGVyZSB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kICBBIGlzIGFuIG4gYnkgbiB1bml0LCBvciBub24tdW5pdCwKKyogIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgYmFuZCBtYXRyaXgsIHdpdGggKCBrICsgMSApIGRpYWdvbmFscy4KKyoKKyogIEFyZ3VtZW50cworKiAgPT09PT09PT09PQorKgorKiAgVVBMTyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgVVBMTyBzcGVjaWZpZXMgd2hldGhlciB0aGUgbWF0cml4IGlzIGFuIHVwcGVyIG9yCisqICAgICAgICAgICBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBhcyBmb2xsb3dzOgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdVJyBvciAndScgICBBIGlzIGFuIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4LgorKgorKiAgICAgICAgICAgICAgVVBMTyA9ICdMJyBvciAnbCcgICBBIGlzIGEgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXguCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFRSQU5TICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFRSQU5TIHNwZWNpZmllcyB0aGUgb3BlcmF0aW9uIHRvIGJlIHBlcmZvcm1lZCBhcworKiAgICAgICAgICAgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ04nIG9yICduJyAgIHggOj0gQSp4LgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnVCcgb3IgJ3QnICAgeCA6PSBBJyp4LgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnQycgb3IgJ2MnICAgeCA6PSBjb25qZyggQScgKSp4LgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBESUFHICAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBESUFHIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBBIGlzIHVuaXQKKyogICAgICAgICAgIHRyaWFuZ3VsYXIgYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIERJQUcgPSAnVScgb3IgJ3UnICAgQSBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgdHJpYW5ndWxhci4KKyoKKyogICAgICAgICAgICAgIERJQUcgPSAnTicgb3IgJ24nICAgQSBpcyBub3QgYXNzdW1lZCB0byBiZSB1bml0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ3VsYXIuCisqCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIE4gICAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTiBzcGVjaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE4gbXVzdCBiZSBhdCBsZWFzdCB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBLICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnkgd2l0aCBVUExPID0gJ1UnIG9yICd1JywgSyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgorKiAgICAgICAgICAgc3VwZXItZGlhZ29uYWxzIG9mIHRoZSBtYXRyaXggQS4KKyogICAgICAgICAgIE9uIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIEsgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YKKyogICAgICAgICAgIHN1Yi1kaWFnb25hbHMgb2YgdGhlIG1hdHJpeCBBLgorKiAgICAgICAgICAgSyBtdXN0IHNhdGlzZnkgIDAgLmxlLiBLLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBBICAgICAgLSBDT01QTEVYKjE2ICAgICAgIGFycmF5IG9mIERJTUVOU0lPTiAoIExEQSwgbiApLgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdVJyBvciAndScsIHRoZSBsZWFkaW5nICggayArIDEgKQorKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgdXBwZXIgdHJpYW5ndWxhcgorKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBtYXRyaXggb2YgY29lZmZpY2llbnRzLCBzdXBwbGllZCBjb2x1bW4gYnkKKyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdworKiAgICAgICAgICAgKCBrICsgMSApIG9mIHRoZSBhcnJheSwgdGhlIGZpcnN0IHN1cGVyLWRpYWdvbmFsIHN0YXJ0aW5nIGF0CisqICAgICAgICAgICBwb3NpdGlvbiAyIGluIHJvdyBrLCBhbmQgc28gb24uIFRoZSB0b3AgbGVmdCBrIGJ5IGsgdHJpYW5nbGUKKyogICAgICAgICAgIG9mIHRoZSBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLgorKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciBhbiB1cHBlcgorKiAgICAgICAgICAgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCBmcm9tIGNvbnZlbnRpb25hbCBmdWxsIG1hdHJpeCBzdG9yYWdlCisqICAgICAgICAgICB0byBiYW5kIHN0b3JhZ2U6CisqCisqICAgICAgICAgICAgICAgICBETyAyMCwgSiA9IDEsIE4KKyogICAgICAgICAgICAgICAgICAgIE0gPSBLICsgMSAtIEoKKyogICAgICAgICAgICAgICAgICAgIERPIDEwLCBJID0gTUFYKCAxLCBKIC0gSyApLCBKCisqICAgICAgICAgICAgICAgICAgICAgICBBKCBNICsgSSwgSiApID0gbWF0cml4KCBJLCBKICkKKyogICAgICAgICAgICAgIDEwICAgIENPTlRJTlVFCisqICAgICAgICAgICAgICAyMCBDT05USU5VRQorKgorKiAgICAgICAgICAgQmVmb3JlIGVudHJ5IHdpdGggVVBMTyA9ICdMJyBvciAnbCcsIHRoZSBsZWFkaW5nICggayArIDEgKQorKiAgICAgICAgICAgYnkgbiBwYXJ0IG9mIHRoZSBhcnJheSBBIG11c3QgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhcgorKiAgICAgICAgICAgYmFuZCBwYXJ0IG9mIHRoZSBtYXRyaXggb2YgY29lZmZpY2llbnRzLCBzdXBwbGllZCBjb2x1bW4gYnkKKyogICAgICAgICAgIGNvbHVtbiwgd2l0aCB0aGUgbGVhZGluZyBkaWFnb25hbCBvZiB0aGUgbWF0cml4IGluIHJvdyAxIG9mCisqICAgICAgICAgICB0aGUgYXJyYXksIHRoZSBmaXJzdCBzdWItZGlhZ29uYWwgc3RhcnRpbmcgYXQgcG9zaXRpb24gMSBpbgorKiAgICAgICAgICAgcm93IDIsIGFuZCBzbyBvbi4gVGhlIGJvdHRvbSByaWdodCBrIGJ5IGsgdHJpYW5nbGUgb2YgdGhlCisqICAgICAgICAgICBhcnJheSBBIGlzIG5vdCByZWZlcmVuY2VkLgorKiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm9ncmFtIHNlZ21lbnQgd2lsbCB0cmFuc2ZlciBhIGxvd2VyCisqICAgICAgICAgICB0cmlhbmd1bGFyIGJhbmQgbWF0cml4IGZyb20gY29udmVudGlvbmFsIGZ1bGwgbWF0cml4IHN0b3JhZ2UKKyogICAgICAgICAgIHRvIGJhbmQgc3RvcmFnZToKKyoKKyogICAgICAgICAgICAgICAgIERPIDIwLCBKID0gMSwgTgorKiAgICAgICAgICAgICAgICAgICAgTSA9IDEgLSBKCisqICAgICAgICAgICAgICAgICAgICBETyAxMCwgSSA9IEosIE1JTiggTiwgSiArIEsgKQorKiAgICAgICAgICAgICAgICAgICAgICAgQSggTSArIEksIEogKSA9IG1hdHJpeCggSSwgSiApCisqICAgICAgICAgICAgICAxMCAgICBDT05USU5VRQorKiAgICAgICAgICAgICAgMjAgQ09OVElOVUUKKyoKKyogICAgICAgICAgIE5vdGUgdGhhdCB3aGVuIERJQUcgPSAnVScgb3IgJ3UnIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgQQorKiAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZGlhZ29uYWwgZWxlbWVudHMgb2YgdGhlIG1hdHJpeCBhcmUgbm90CisqICAgICAgICAgICByZWZlcmVuY2VkLCBidXQgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdHkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIExEQSAgICAtIElOVEVHRVIuCisqICAgICAgICAgICBPbiBlbnRyeSwgTERBIHNwZWNpZmllcyB0aGUgZmlyc3QgZGltZW5zaW9uIG9mIEEgYXMgZGVjbGFyZWQKKyogICAgICAgICAgIGluIHRoZSBjYWxsaW5nIChzdWIpIHByb2dyYW0uIExEQSBtdXN0IGJlIGF0IGxlYXN0CisqICAgICAgICAgICAoIGsgKyAxICkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIENPTVBMRVgqMTYgICAgICAgYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHZlY3RvciB4LiBPbiBleGl0LCBYIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlCisqICAgICAgICAgICB0cmFuZm9ybWVkIHZlY3RvciB4LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRnVydGhlciBEZXRhaWxzCisqICA9PT09PT09PT09PT09PT0KKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIENPTVBMRVggWkVSTworICAgICAgUEFSQU1FVEVSIChaRVJPPSAoMC4wRCswLDAuMEQrMCkpCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIENPTVBMRVggVEVNUAorICAgICAgSU5URUdFUiBJLElORk8sSVgsSixKWCxLUExVUzEsS1gsTAorICAgICAgTE9HSUNBTCBOT0NPTkosTk9VTklUCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgRnVuY3Rpb25zIC4uCisgICAgICBMT0dJQ0FMIExTQU1FCisgICAgICBFWFRFUk5BTCBMU0FNRQorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIFN1YnJvdXRpbmVzIC4uCisgICAgICBFWFRFUk5BTCBYRVJCTEEKKyogICAgIC4uCisqICAgICAuLiBJbnRyaW5zaWMgRnVuY3Rpb25zIC4uCisgICAgICBJTlRSSU5TSUMgRENPTkpHLE1BWCxNSU4KKyogICAgIC4uCisqCisqICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorKgorICAgICAgSU5GTyA9IDAKKyAgICAgIElGICguTk9ULkxTQU1FKFVQTE8sJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKFVQTE8sJ0wnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAxCisgICAgICBFTFNFIElGICguTk9ULkxTQU1FKFRSQU5TLCdOJykgLkFORC4gLk5PVC5MU0FNRShUUkFOUywnVCcpIC5BTkQuCisgICAgICsgICAgICAgICAuTk9ULkxTQU1FKFRSQU5TLCdDJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMgorICAgICAgRUxTRSBJRiAoLk5PVC5MU0FNRShESUFHLCdVJykgLkFORC4gLk5PVC5MU0FNRShESUFHLCdOJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMworICAgICAgRUxTRSBJRiAoTi5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDQKKyAgICAgIEVMU0UgSUYgKEsuTFQuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA1CisgICAgICBFTFNFIElGIChMREEuTFQuIChLKzEpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDcKKyAgICAgIEVMU0UgSUYgKElOQ1guRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA5CisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkZPLk5FLjApIFRIRU4KKyAgICAgICAgICBDQUxMIFhFUkJMQSgnWlRCTVYgJyxJTkZPKQorICAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuCisqCisgICAgICBJRiAoTi5FUS4wKSBSRVRVUk4KKyoKKyAgICAgIE5PQ09OSiA9IExTQU1FKFRSQU5TLCdUJykKKyAgICAgIE5PVU5JVCA9IExTQU1FKERJQUcsJ04nKQorKgorKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludCBpbiBYIGlmIHRoZSBpbmNyZW1lbnQgaXMgbm90IHVuaXR5LiBUaGlzCisqICAgICB3aWxsIGJlICAoIE4gLSAxICkqSU5DWCAgIHRvbyBzbWFsbCBmb3IgZGVzY2VuZGluZyBsb29wcy4KKyoKKyAgICAgIElGIChJTkNYLkxFLjApIFRIRU4KKyAgICAgICAgICBLWCA9IDEgLSAoTi0xKSpJTkNYCisgICAgICBFTFNFIElGIChJTkNYLk5FLjEpIFRIRU4KKyAgICAgICAgICBLWCA9IDEKKyAgICAgIEVORCBJRgorKgorKiAgICAgU3RhcnQgdGhlIG9wZXJhdGlvbnMuIEluIHRoaXMgdmVyc2lvbiB0aGUgZWxlbWVudHMgb2YgQSBhcmUKKyogICAgIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQS4KKyoKKyAgICAgIElGIChMU0FNRShUUkFOUywnTicpKSBUSEVOCisqCisqICAgICAgICAgRm9ybSAgeCA6PSBBKnguCisqCisgICAgICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorICAgICAgICAgICAgICBLUExVUzEgPSBLICsgMQorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAyMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSikuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gTUFYKDEsSi1LKSxKIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJKSA9IFgoSSkgKyBURU1QKkEoTCtJLEopCisgICAxMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSikgPSBYKEopKkEoS1BMVVMxLEopCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAyMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyA0MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTCA9IEtQTFVTMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMzAgSSA9IE1BWCgxLEotSyksSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSVgpID0gWChJWCkgKyBURU1QKkEoTCtJLEopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgMzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpKkEoS1BMVVMxLEopCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoSi5HVC5LKSBLWCA9IEtYICsgSU5DWAorICAgNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyA2MCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSikuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgICAgICBMID0gMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IE1JTihOLEorSyksSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSSkgPSBYKEkpICsgVEVNUCpBKEwrSSxKKQorICAgNTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEopID0gWChKKSpBKDEsSikKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgIDYwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEtYID0gS1ggKyAoTi0xKSpJTkNYCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyA4MCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTCA9IDEgLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDcwIEkgPSBNSU4oTixKK0spLEogKyAxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKElYKSA9IFgoSVgpICsgVEVNUCpBKEwrSSxKKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCAtIElOQ1gKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKWCkgPSBYKEpYKSpBKDEsSikKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElGICgoTi1KKS5HRS5LKSBLWCA9IEtYIC0gSU5DWAorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIElGCisgICAgICBFTFNFCisqCisqICAgICAgICBGb3JtICB4IDo9IEEnKnggIG9yICB4IDo9IGNvbmpnKCBBJyApKnguCisqCisgICAgICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorICAgICAgICAgICAgICBLUExVUzEgPSBLICsgMQorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMTAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgTCA9IEtQTFVTMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9DT05KKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkEoS1BMVVMxLEopCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDkwIEkgPSBKIC0gMSxNQVgoMSxKLUspLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEEoTCtJLEopKlgoSSkKKyAgIDkwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkRDT05KRyhBKEtQTFVTMSxKKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAwIEkgPSBKIC0gMSxNQVgoMSxKLUspLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIERDT05KRyhBKEwrSSxKKSkqWChJKQorICAxMDAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIFgoSikgPSBURU1QCisgIDExMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgKE4tMSkqSU5DWAorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMTQwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBLWCA9IEtYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICBMID0gS1BMVVMxIC0gSgorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQShLUExVUzEsSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTIwIEkgPSBKIC0gMSxNQVgoMSxKLUspLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEEoTCtJLEopKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAxMjAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqRENPTkpHKEEoS1BMVVMxLEopKQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMzAgSSA9IEogLSAxLE1BWCgxLEotSyksLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgRENPTkpHKEEoTCtJLEopKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCAtIElOQ1gKKyAgMTMwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYIC0gSU5DWAorICAxNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxNzAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgTCA9IDEgLSBKCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PQ09OSikgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpBKDEsSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTUwIEkgPSBKICsgMSxNSU4oTixKK0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEEoTCtJLEopKlgoSSkKKyAgMTUwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkRDT05KRyhBKDEsSikpCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE2MCBJID0gSiArIDEsTUlOKE4sSitLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBEQ09OSkcoQShMK0ksSikpKlgoSSkKKyAgMTYwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBYKEopID0gVEVNUAorICAxNzAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMjAwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBLWCA9IEtYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICBMID0gMSAtIEoKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9DT05KKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkEoMSxKKQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxODAgSSA9IEogKyAxLE1JTihOLEorSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgQShMK0ksSikqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgIDE4MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpEQ09OSkcoQSgxLEopKQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxOTAgSSA9IEogKyAxLE1JTihOLEorSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgRENPTkpHKEEoTCtJLEopKSpYKElYKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgMTkwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAyMDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIElGCisgICAgICBFTkQgSUYKKyoKKyAgICAgIFJFVFVSTgorKgorKiAgICAgRW5kIG9mIFpUQk1WIC4KKyoKKyAgICAgIEVORApkaWZmIC0tZ2l0IGEvYmxhcy96dHBtdi5mIGIvYmxhcy96dHBtdi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2IzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFzL3p0cG12LmYKQEAgLTAsMCArMSwzMjkgQEAKKyAgICAgIFNVQlJPVVRJTkUgWlRQTVYoVVBMTyxUUkFOUyxESUFHLE4sQVAsWCxJTkNYKQorKiAgICAgLi4gU2NhbGFyIEFyZ3VtZW50cyAuLgorICAgICAgSU5URUdFUiBJTkNYLE4KKyAgICAgIENIQVJBQ1RFUiBESUFHLFRSQU5TLFVQTE8KKyogICAgIC4uCisqICAgICAuLiBBcnJheSBBcmd1bWVudHMgLi4KKyAgICAgIERPVUJMRSBDT01QTEVYIEFQKCopLFgoKikKKyogICAgIC4uCisqCisqICBQdXJwb3NlCisqICA9PT09PT09CisqCisqICBaVFBNViAgcGVyZm9ybXMgb25lIG9mIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbnMKKyoKKyogICAgIHggOj0gQSp4LCAgIG9yICAgeCA6PSBBJyp4LCAgIG9yICAgeCA6PSBjb25qZyggQScgKSp4LAorKgorKiAgd2hlcmUgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCAgQSBpcyBhbiBuIGJ5IG4gdW5pdCwgb3Igbm9uLXVuaXQsCisqICB1cHBlciBvciBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdHJpeCBpcyBhbiB1cHBlciBvcgorKiAgICAgICAgICAgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgQSBpcyBhbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgQSBpcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBUUkFOUyAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBUUkFOUyBzcGVjaWZpZXMgdGhlIG9wZXJhdGlvbiB0byBiZSBwZXJmb3JtZWQgYXMKKyogICAgICAgICAgIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdOJyBvciAnbicgICB4IDo9IEEqeC4KKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ1QnIG9yICd0JyAgIHggOj0gQScqeC4KKyoKKyogICAgICAgICAgICAgIFRSQU5TID0gJ0MnIG9yICdjJyAgIHggOj0gY29uamcoIEEnICkqeC4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRElBRyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgRElBRyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgQSBpcyB1bml0CisqICAgICAgICAgICB0cmlhbmd1bGFyIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBESUFHID0gJ1UnIG9yICd1JyAgIEEgaXMgYXNzdW1lZCB0byBiZSB1bml0IHRyaWFuZ3VsYXIuCisqCisqICAgICAgICAgICAgICBESUFHID0gJ04nIG9yICduJyAgIEEgaXMgbm90IGFzc3VtZWQgdG8gYmUgdW5pdAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbmd1bGFyLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQVAgICAgIC0gQ09NUExFWCoxNiAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoICBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IHBhY2tlZCBzZXF1ZW50aWFsbHksCisqICAgICAgICAgICBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkgY29udGFpbnMgYSggMSwgMSApLAorKiAgICAgICAgICAgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKSBhbmQgYSggMiwgMiApCisqICAgICAgICAgICByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggcGFja2VkIHNlcXVlbnRpYWxseSwKKyogICAgICAgICAgIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSBjb250YWlucyBhKCAxLCAxICksCisqICAgICAgICAgICBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMiwgMSApIGFuZCBhKCAzLCAxICkKKyogICAgICAgICAgIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLgorKiAgICAgICAgICAgTm90ZSB0aGF0IHdoZW4gIERJQUcgPSAnVScgb3IgJ3UnLCB0aGUgZGlhZ29uYWwgZWxlbWVudHMgb2YKKyogICAgICAgICAgIEEgYXJlIG5vdCByZWZlcmVuY2VkLCBidXQgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdHkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIENPTVBMRVgqMTYgICAgICAgYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHZlY3RvciB4LiBPbiBleGl0LCBYIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlCisqICAgICAgICAgICB0cmFuZm9ybWVkIHZlY3RvciB4LgorKgorKiAgSU5DWCAgIC0gSU5URUdFUi4KKyogICAgICAgICAgIE9uIGVudHJ5LCBJTkNYIHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IGZvciB0aGUgZWxlbWVudHMgb2YKKyogICAgICAgICAgIFguIElOQ1ggbXVzdCBub3QgYmUgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRnVydGhlciBEZXRhaWxzCisqICA9PT09PT09PT09PT09PT0KKyoKKyogIExldmVsIDIgQmxhcyByb3V0aW5lLgorKgorKiAgLS0gV3JpdHRlbiBvbiAyMi1PY3RvYmVyLTE5ODYuCisqICAgICBKYWNrIERvbmdhcnJhLCBBcmdvbm5lIE5hdGlvbmFsIExhYi4KKyogICAgIEplcmVteSBEdSBDcm96LCBOYWcgQ2VudHJhbCBPZmZpY2UuCisqICAgICBTdmVuIEhhbW1hcmxpbmcsIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFJpY2hhcmQgSGFuc29uLCBTYW5kaWEgTmF0aW9uYWwgTGFicy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgICAgLi4gUGFyYW1ldGVycyAuLgorICAgICAgRE9VQkxFIENPTVBMRVggWkVSTworICAgICAgUEFSQU1FVEVSIChaRVJPPSAoMC4wRCswLDAuMEQrMCkpCisqICAgICAuLgorKiAgICAgLi4gTG9jYWwgU2NhbGFycyAuLgorICAgICAgRE9VQkxFIENPTVBMRVggVEVNUAorICAgICAgSU5URUdFUiBJLElORk8sSVgsSixKWCxLLEtLLEtYCisgICAgICBMT0dJQ0FMIE5PQ09OSixOT1VOSVQKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBGdW5jdGlvbnMgLi4KKyAgICAgIExPR0lDQUwgTFNBTUUKKyAgICAgIEVYVEVSTkFMIExTQU1FCisqICAgICAuLgorKiAgICAgLi4gRXh0ZXJuYWwgU3Vicm91dGluZXMgLi4KKyAgICAgIEVYVEVSTkFMIFhFUkJMQQorKiAgICAgLi4KKyogICAgIC4uIEludHJpbnNpYyBGdW5jdGlvbnMgLi4KKyAgICAgIElOVFJJTlNJQyBEQ09OSkcKKyogICAgIC4uCisqCisqICAgICBUZXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzLgorKgorICAgICAgSU5GTyA9IDAKKyAgICAgIElGICguTk9ULkxTQU1FKFVQTE8sJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKFVQTE8sJ0wnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAxCisgICAgICBFTFNFIElGICguTk9ULkxTQU1FKFRSQU5TLCdOJykgLkFORC4gLk5PVC5MU0FNRShUUkFOUywnVCcpIC5BTkQuCisgICAgICsgICAgICAgICAuTk9ULkxTQU1FKFRSQU5TLCdDJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMgorICAgICAgRUxTRSBJRiAoLk5PVC5MU0FNRShESUFHLCdVJykgLkFORC4gLk5PVC5MU0FNRShESUFHLCdOJykpIFRIRU4KKyAgICAgICAgICBJTkZPID0gMworICAgICAgRUxTRSBJRiAoTi5MVC4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDQKKyAgICAgIEVMU0UgSUYgKElOQ1guRVEuMCkgVEhFTgorICAgICAgICAgIElORk8gPSA3CisgICAgICBFTkQgSUYKKyAgICAgIElGIChJTkZPLk5FLjApIFRIRU4KKyAgICAgICAgICBDQUxMIFhFUkJMQSgnWlRQTVYgJyxJTkZPKQorICAgICAgICAgIFJFVFVSTgorICAgICAgRU5EIElGCisqCisqICAgICBRdWljayByZXR1cm4gaWYgcG9zc2libGUuCisqCisgICAgICBJRiAoTi5FUS4wKSBSRVRVUk4KKyoKKyAgICAgIE5PQ09OSiA9IExTQU1FKFRSQU5TLCdUJykKKyAgICAgIE5PVU5JVCA9IExTQU1FKERJQUcsJ04nKQorKgorKiAgICAgU2V0IHVwIHRoZSBzdGFydCBwb2ludCBpbiBYIGlmIHRoZSBpbmNyZW1lbnQgaXMgbm90IHVuaXR5LiBUaGlzCisqICAgICB3aWxsIGJlICAoIE4gLSAxICkqSU5DWCAgdG9vIHNtYWxsIGZvciBkZXNjZW5kaW5nIGxvb3BzLgorKgorICAgICAgSUYgKElOQ1guTEUuMCkgVEhFTgorICAgICAgICAgIEtYID0gMSAtIChOLTEpKklOQ1gKKyAgICAgIEVMU0UgSUYgKElOQ1guTkUuMSkgVEhFTgorICAgICAgICAgIEtYID0gMQorICAgICAgRU5EIElGCisqCisqICAgICBTdGFydCB0aGUgb3BlcmF0aW9ucy4gSW4gdGhpcyB2ZXJzaW9uIHRoZSBlbGVtZW50cyBvZiBBUCBhcmUKKyogICAgIGFjY2Vzc2VkIHNlcXVlbnRpYWxseSB3aXRoIG9uZSBwYXNzIHRocm91Z2ggQVAuCisqCisgICAgICBJRiAoTFNBTUUoVFJBTlMsJ04nKSkgVEhFTgorKgorKiAgICAgICAgRm9ybSAgeDo9IEEqeC4KKyoKKyAgICAgICAgICBJRiAoTFNBTUUoVVBMTywnVScpKSBUSEVOCisgICAgICAgICAgICAgIEtLID0gMQorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAyMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSikuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAgSSA9IDEsSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSSkgPSBYKEkpICsgVEVNUCpBUChLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgICAxMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSikgPSBYKEopKkFQKEtLK0otMSkKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gNDAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIElGIChYKEpYKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDMwIEsgPSBLSyxLSyArIEogLSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKElYKSA9IFgoSVgpICsgVEVNUCpBUChLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgIDMwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKWCkgPSBYKEpYKSpBUChLSytKLTEpCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAgNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLSyA9IChOKiAoTisxKSkvMgorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyA2MCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSikuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNTAgSSA9IE4sSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoSSkgPSBYKEkpICsgVEVNUCpBUChLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgLSAxCisgICA1MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSikgPSBYKEopKkFQKEtLLU4rSikKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gKE4tSisxKQorICAgNjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgS1ggPSBLWCArIChOLTEpKklOQ1gKKyAgICAgICAgICAgICAgICAgIEpYID0gS1gKKyAgICAgICAgICAgICAgICAgIERPIDgwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBLWAorICAgICAgICAgICAgICAgICAgICAgICAgICBETyA3MCBLID0gS0ssS0sgLSAoTi0gKEorMSkpLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKElYKSA9IFgoSVgpICsgVEVNUCpBUChLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCAtIElOQ1gKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKWCkgPSBYKEpYKSpBUChLSy1OK0opCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gKE4tSisxKQorICAgODAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIElGCisgICAgICBFTFNFCisqCisqICAgICAgICBGb3JtICB4IDo9IEEnKnggIG9yICB4IDo9IGNvbmpnKCBBJyApKnguCisqCisgICAgICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorICAgICAgICAgICAgICBLSyA9IChOKiAoTisxKSkvMgorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAxMTAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEopCisgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLIC0gMQorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDkwIEkgPSBKIC0gMSwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEFQKEspKlgoSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLIC0gMQorICAgOTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqRENPTkpHKEFQKEtLKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTAwIEkgPSBKIC0gMSwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIERDT05KRyhBUChLKSkqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgLSAxCisgIDEwMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgWChKKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gSgorICAxMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWCArIChOLTEpKklOQ1gKKyAgICAgICAgICAgICAgICAgIERPIDE0MCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgICAgIElGIChOT0NPTkopIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqQVAoS0spCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEyMCBLID0gS0sgLSAxLEtLIC0gSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCArIEFQKEspKlgoSVgpCisgIDEyMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpEQ09OSkcoQVAoS0spKQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMzAgSyA9IEtLIC0gMSxLSyAtIEogKyAxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBEQ09OSkcoQVAoSykpKlgoSVgpCisgIDEzMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgWChKWCkgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgSlggPSBKWCAtIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gSgorICAxNDAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICBLSyA9IDEKKyAgICAgICAgICAgICAgSUYgKElOQ1guRVEuMSkgVEhFTgorICAgICAgICAgICAgICAgICAgRE8gMTcwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgIEsgPSBLSyArIDEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9DT05KKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkFQKEtLKQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxNTAgSSA9IEogKyAxLE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgQVAoSykqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgKyAxCisgIDE1MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUCpEQ09OSkcoQVAoS0spKQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxNjAgSSA9IEogKyAxLE4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgRENPTkpHKEFQKEspKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgMTYwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBYKEopID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyAoTi1KKzEpCisgIDE3MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyAyMDAgSiA9IDEsTgorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9DT05KKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QKkFQKEtLKQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxODAgSyA9IEtLICsgMSxLSyArIE4gLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgKyBBUChLKSpYKElYKQorICAxODAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAqRENPTkpHKEFQKEtLKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTkwIEsgPSBLSyArIDEsS0sgKyBOIC0gSgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBJWCArIElOQ1gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QICsgRENPTkpHKEFQKEspKSpYKElYKQorICAxOTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIFgoSlgpID0gVEVNUAorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggKyBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyArIChOLUorMSkKKyAgMjAwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBJRgorICAgICAgRU5EIElGCisqCisgICAgICBSRVRVUk4KKyoKKyogICAgIEVuZCBvZiBaVFBNViAuCisqCisgICAgICBFTkQKZGlmZiAtLWdpdCBhL2JsYXMvenRwc3YuZiBiL2JsYXMvenRwc3YuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTZlMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYmxhcy96dHBzdi5mCkBAIC0wLDAgKzEsMzMyIEBACisgICAgICBTVUJST1VUSU5FIFpUUFNWKFVQTE8sVFJBTlMsRElBRyxOLEFQLFgsSU5DWCkKKyogICAgIC4uIFNjYWxhciBBcmd1bWVudHMgLi4KKyAgICAgIElOVEVHRVIgSU5DWCxOCisgICAgICBDSEFSQUNURVIgRElBRyxUUkFOUyxVUExPCisqICAgICAuLgorKiAgICAgLi4gQXJyYXkgQXJndW1lbnRzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBBUCgqKSxYKCopCisqICAgICAuLgorKgorKiAgUHVycG9zZQorKiAgPT09PT09PQorKgorKiAgWlRQU1YgIHNvbHZlcyBvbmUgb2YgdGhlIHN5c3RlbXMgb2YgZXF1YXRpb25zCisqCisqICAgICBBKnggPSBiLCAgIG9yICAgQScqeCA9IGIsICAgb3IgICBjb25qZyggQScgKSp4ID0gYiwKKyoKKyogIHdoZXJlIGIgYW5kIHggYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuIG4gYnkgbiB1bml0LCBvcgorKiAgbm9uLXVuaXQsIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyoKKyogIE5vIHRlc3QgZm9yIHNpbmd1bGFyaXR5IG9yIG5lYXItc2luZ3VsYXJpdHkgaXMgaW5jbHVkZWQgaW4gdGhpcworKiAgcm91dGluZS4gU3VjaCB0ZXN0cyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisqCisqICBBcmd1bWVudHMKKyogID09PT09PT09PT0KKyoKKyogIFVQTE8gICAtIENIQVJBQ1RFUioxLgorKiAgICAgICAgICAgT24gZW50cnksIFVQTE8gc3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdHJpeCBpcyBhbiB1cHBlciBvcgorKiAgICAgICAgICAgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggYXMgZm9sbG93czoKKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnVScgb3IgJ3UnICAgQSBpcyBhbiB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeC4KKyoKKyogICAgICAgICAgICAgIFVQTE8gPSAnTCcgb3IgJ2wnICAgQSBpcyBhIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBUUkFOUyAgLSBDSEFSQUNURVIqMS4KKyogICAgICAgICAgIE9uIGVudHJ5LCBUUkFOUyBzcGVjaWZpZXMgdGhlIGVxdWF0aW9ucyB0byBiZSBzb2x2ZWQgYXMKKyogICAgICAgICAgIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdOJyBvciAnbicgICBBKnggPSBiLgorKgorKiAgICAgICAgICAgICAgVFJBTlMgPSAnVCcgb3IgJ3QnICAgQScqeCA9IGIuCisqCisqICAgICAgICAgICAgICBUUkFOUyA9ICdDJyBvciAnYycgICBjb25qZyggQScgKSp4ID0gYi4KKyoKKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgRElBRyAgIC0gQ0hBUkFDVEVSKjEuCisqICAgICAgICAgICBPbiBlbnRyeSwgRElBRyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgQSBpcyB1bml0CisqICAgICAgICAgICB0cmlhbmd1bGFyIGFzIGZvbGxvd3M6CisqCisqICAgICAgICAgICAgICBESUFHID0gJ1UnIG9yICd1JyAgIEEgaXMgYXNzdW1lZCB0byBiZSB1bml0IHRyaWFuZ3VsYXIuCisqCisqICAgICAgICAgICAgICBESUFHID0gJ04nIG9yICduJyAgIEEgaXMgbm90IGFzc3VtZWQgdG8gYmUgdW5pdAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbmd1bGFyLgorKgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBOICAgICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIE4gc3BlY2lmaWVzIHRoZSBvcmRlciBvZiB0aGUgbWF0cml4IEEuCisqICAgICAgICAgICBOIG11c3QgYmUgYXQgbGVhc3QgemVyby4KKyogICAgICAgICAgIFVuY2hhbmdlZCBvbiBleGl0LgorKgorKiAgQVAgICAgIC0gQ09NUExFWCoxNiAgICAgICBhcnJheSBvZiBESU1FTlNJT04gYXQgbGVhc3QKKyogICAgICAgICAgICggKCBuKiggbiArIDEgKSApLzIgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoICBVUExPID0gJ1UnIG9yICd1JywgdGhlIGFycmF5IEFQIG11c3QKKyogICAgICAgICAgIGNvbnRhaW4gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4IHBhY2tlZCBzZXF1ZW50aWFsbHksCisqICAgICAgICAgICBjb2x1bW4gYnkgY29sdW1uLCBzbyB0aGF0IEFQKCAxICkgY29udGFpbnMgYSggMSwgMSApLAorKiAgICAgICAgICAgQVAoIDIgKSBhbmQgQVAoIDMgKSBjb250YWluIGEoIDEsIDIgKSBhbmQgYSggMiwgMiApCisqICAgICAgICAgICByZXNwZWN0aXZlbHksIGFuZCBzbyBvbi4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSB3aXRoIFVQTE8gPSAnTCcgb3IgJ2wnLCB0aGUgYXJyYXkgQVAgbXVzdAorKiAgICAgICAgICAgY29udGFpbiB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggcGFja2VkIHNlcXVlbnRpYWxseSwKKyogICAgICAgICAgIGNvbHVtbiBieSBjb2x1bW4sIHNvIHRoYXQgQVAoIDEgKSBjb250YWlucyBhKCAxLCAxICksCisqICAgICAgICAgICBBUCggMiApIGFuZCBBUCggMyApIGNvbnRhaW4gYSggMiwgMSApIGFuZCBhKCAzLCAxICkKKyogICAgICAgICAgIHJlc3BlY3RpdmVseSwgYW5kIHNvIG9uLgorKiAgICAgICAgICAgTm90ZSB0aGF0IHdoZW4gIERJQUcgPSAnVScgb3IgJ3UnLCB0aGUgZGlhZ29uYWwgZWxlbWVudHMgb2YKKyogICAgICAgICAgIEEgYXJlIG5vdCByZWZlcmVuY2VkLCBidXQgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdHkuCisqICAgICAgICAgICBVbmNoYW5nZWQgb24gZXhpdC4KKyoKKyogIFggICAgICAtIENPTVBMRVgqMTYgICAgICAgYXJyYXkgb2YgZGltZW5zaW9uIGF0IGxlYXN0CisqICAgICAgICAgICAoIDEgKyAoIG4gLSAxICkqYWJzKCBJTkNYICkgKS4KKyogICAgICAgICAgIEJlZm9yZSBlbnRyeSwgdGhlIGluY3JlbWVudGVkIGFycmF5IFggbXVzdCBjb250YWluIHRoZSBuCisqICAgICAgICAgICBlbGVtZW50IHJpZ2h0LWhhbmQgc2lkZSB2ZWN0b3IgYi4gT24gZXhpdCwgWCBpcyBvdmVyd3JpdHRlbgorKiAgICAgICAgICAgd2l0aCB0aGUgc29sdXRpb24gdmVjdG9yIHguCisqCisqICBJTkNYICAgLSBJTlRFR0VSLgorKiAgICAgICAgICAgT24gZW50cnksIElOQ1ggc3BlY2lmaWVzIHRoZSBpbmNyZW1lbnQgZm9yIHRoZSBlbGVtZW50cyBvZgorKiAgICAgICAgICAgWC4gSU5DWCBtdXN0IG5vdCBiZSB6ZXJvLgorKiAgICAgICAgICAgVW5jaGFuZ2VkIG9uIGV4aXQuCisqCisqICBGdXJ0aGVyIERldGFpbHMKKyogID09PT09PT09PT09PT09PQorKgorKiAgTGV2ZWwgMiBCbGFzIHJvdXRpbmUuCisqCisqICAtLSBXcml0dGVuIG9uIDIyLU9jdG9iZXItMTk4Ni4KKyogICAgIEphY2sgRG9uZ2FycmEsIEFyZ29ubmUgTmF0aW9uYWwgTGFiLgorKiAgICAgSmVyZW15IER1IENyb3osIE5hZyBDZW50cmFsIE9mZmljZS4KKyogICAgIFN2ZW4gSGFtbWFybGluZywgTmFnIENlbnRyYWwgT2ZmaWNlLgorKiAgICAgUmljaGFyZCBIYW5zb24sIFNhbmRpYSBOYXRpb25hbCBMYWJzLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgICAuLiBQYXJhbWV0ZXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBaRVJPCisgICAgICBQQVJBTUVURVIgKFpFUk89ICgwLjBEKzAsMC4wRCswKSkKKyogICAgIC4uCisqICAgICAuLiBMb2NhbCBTY2FsYXJzIC4uCisgICAgICBET1VCTEUgQ09NUExFWCBURU1QCisgICAgICBJTlRFR0VSIEksSU5GTyxJWCxKLEpYLEssS0ssS1gKKyAgICAgIExPR0lDQUwgTk9DT05KLE5PVU5JVAorKiAgICAgLi4KKyogICAgIC4uIEV4dGVybmFsIEZ1bmN0aW9ucyAuLgorICAgICAgTE9HSUNBTCBMU0FNRQorICAgICAgRVhURVJOQUwgTFNBTUUKKyogICAgIC4uCisqICAgICAuLiBFeHRlcm5hbCBTdWJyb3V0aW5lcyAuLgorICAgICAgRVhURVJOQUwgWEVSQkxBCisqICAgICAuLgorKiAgICAgLi4gSW50cmluc2ljIEZ1bmN0aW9ucyAuLgorICAgICAgSU5UUklOU0lDIERDT05KRworKiAgICAgLi4KKyoKKyogICAgIFRlc3QgdGhlIGlucHV0IHBhcmFtZXRlcnMuCisqCisgICAgICBJTkZPID0gMAorICAgICAgSUYgKC5OT1QuTFNBTUUoVVBMTywnVScpIC5BTkQuIC5OT1QuTFNBTUUoVVBMTywnTCcpKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDEKKyAgICAgIEVMU0UgSUYgKC5OT1QuTFNBTUUoVFJBTlMsJ04nKSAuQU5ELiAuTk9ULkxTQU1FKFRSQU5TLCdUJykgLkFORC4KKyAgICAgKyAgICAgICAgIC5OT1QuTFNBTUUoVFJBTlMsJ0MnKSkgVEhFTgorICAgICAgICAgIElORk8gPSAyCisgICAgICBFTFNFIElGICguTk9ULkxTQU1FKERJQUcsJ1UnKSAuQU5ELiAuTk9ULkxTQU1FKERJQUcsJ04nKSkgVEhFTgorICAgICAgICAgIElORk8gPSAzCisgICAgICBFTFNFIElGIChOLkxULjApIFRIRU4KKyAgICAgICAgICBJTkZPID0gNAorICAgICAgRUxTRSBJRiAoSU5DWC5FUS4wKSBUSEVOCisgICAgICAgICAgSU5GTyA9IDcKKyAgICAgIEVORCBJRgorICAgICAgSUYgKElORk8uTkUuMCkgVEhFTgorICAgICAgICAgIENBTEwgWEVSQkxBKCdaVFBTViAnLElORk8pCisgICAgICAgICAgUkVUVVJOCisgICAgICBFTkQgSUYKKyoKKyogICAgIFF1aWNrIHJldHVybiBpZiBwb3NzaWJsZS4KKyoKKyAgICAgIElGIChOLkVRLjApIFJFVFVSTgorKgorICAgICAgTk9DT05KID0gTFNBTUUoVFJBTlMsJ1QnKQorICAgICAgTk9VTklUID0gTFNBTUUoRElBRywnTicpCisqCisqICAgICBTZXQgdXAgdGhlIHN0YXJ0IHBvaW50IGluIFggaWYgdGhlIGluY3JlbWVudCBpcyBub3QgdW5pdHkuIFRoaXMKKyogICAgIHdpbGwgYmUgICggTiAtIDEgKSpJTkNYICB0b28gc21hbGwgZm9yIGRlc2NlbmRpbmcgbG9vcHMuCisqCisgICAgICBJRiAoSU5DWC5MRS4wKSBUSEVOCisgICAgICAgICAgS1ggPSAxIC0gKE4tMSkqSU5DWAorICAgICAgRUxTRSBJRiAoSU5DWC5ORS4xKSBUSEVOCisgICAgICAgICAgS1ggPSAxCisgICAgICBFTkQgSUYKKyoKKyogICAgIFN0YXJ0IHRoZSBvcGVyYXRpb25zLiBJbiB0aGlzIHZlcnNpb24gdGhlIGVsZW1lbnRzIG9mIEFQIGFyZQorKiAgICAgYWNjZXNzZWQgc2VxdWVudGlhbGx5IHdpdGggb25lIHBhc3MgdGhyb3VnaCBBUC4KKyoKKyAgICAgIElGIChMU0FNRShUUkFOUywnTicpKSBUSEVOCisqCisqICAgICAgICBGb3JtICB4IDo9IGludiggQSApKnguCisqCisgICAgICAgICAgSUYgKExTQU1FKFVQTE8sJ1UnKSkgVEhFTgorICAgICAgICAgICAgICBLSyA9IChOKiAoTisxKSkvMgorICAgICAgICAgICAgICBJRiAoSU5DWC5FUS4xKSBUSEVOCisgICAgICAgICAgICAgICAgICBETyAyMCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSikuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEopID0gWChKKS9BUChLSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEtLIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMCBJID0gSiAtIDEsMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJKSA9IFgoSSkgLSBURU1QKkFQKEspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyAtIDEKKyAgIDEwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLIC0gSgorICAgMjAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWCArIChOLTEpKklOQ1gKKyAgICAgICAgICAgICAgICAgIERPIDQwIEogPSBOLDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKWCkuTkUuWkVSTykgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBYKEpYKSA9IFgoSlgpL0FQKEtLKQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVggPSBKWAorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAzMCBLID0gS0sgLSAxLEtLIC0gSiArIDEsLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKElYKSA9IFgoSVgpIC0gVEVNUCpBUChLKQorICAgMzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEpYID0gSlggLSBJTkNYCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyAtIEoKKyAgIDQwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgS0sgPSAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDYwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBJRiAoWChKKS5ORS5aRVJPKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFgoSikgPSBYKEopL0FQKEtLKQorICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKKQorICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gS0sgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDUwIEkgPSBKICsgMSxOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKEkpID0gWChJKSAtIFRFTVAqQVAoSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgNTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyAoTi1KKzEpCisgICA2MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyA4MCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgSUYgKFgoSlgpLk5FLlpFUk8pIFRIRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgWChKWCkgPSBYKEpYKS9BUChLSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSlgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSlgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gNzAgSyA9IEtLICsgMSxLSyArIE4gLSBKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWChJWCkgPSBYKElYKSAtIFRFTVAqQVAoSykKKyAgIDcwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyAoTi1KKzEpCisgICA4MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVMU0UKKyoKKyogICAgICAgIEZvcm0gIHggOj0gaW52KCBBJyApKnggIG9yICB4IDo9IGludiggY29uamcoIEEnICkgKSp4LgorKgorICAgICAgICAgIElGIChMU0FNRShVUExPLCdVJykpIFRIRU4KKyAgICAgICAgICAgICAgS0sgPSAxCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDExMCBKID0gMSxOCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9DT05KKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDkwIEkgPSAxLEogLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCAtIEFQKEspKlgoSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBLICsgMQorICAgOTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUC9BUChLSytKLTEpCisgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMDAgSSA9IDEsSiAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QIC0gRENPTkpHKEFQKEspKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyArIDEKKyAgMTAwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAvRENPTkpHKEFQKEtLK0otMSkpCisgICAgICAgICAgICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgICAgICAgICAgICAgWChKKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBLSyA9IEtLICsgSgorICAxMTAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgSlggPSBLWAorICAgICAgICAgICAgICAgICAgRE8gMTQwIEogPSAxLE4KKyAgICAgICAgICAgICAgICAgICAgICBURU1QID0gWChKWCkKKyAgICAgICAgICAgICAgICAgICAgICBJWCA9IEtYCisgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PQ09OSikgVEhFTgorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxMjAgSyA9IEtLLEtLICsgSiAtIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBURU1QIC0gQVAoSykqWChJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYID0gSVggKyBJTkNYCisgIDEyMCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0FQKEtLK0otMSkKKyAgICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDEzMCBLID0gS0ssS0sgKyBKIC0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgLSBEQ09OSkcoQVAoSykpKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYICsgSU5DWAorICAxMzAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUC9EQ09OSkcoQVAoS0srSi0xKSkKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYICsgSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgKyBKCisgIDE0MCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgIEtLID0gKE4qIChOKzEpKS8yCisgICAgICAgICAgICAgIElGIChJTkNYLkVRLjEpIFRIRU4KKyAgICAgICAgICAgICAgICAgIERPIDE3MCBKID0gTiwxLC0xCisgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFgoSikKKyAgICAgICAgICAgICAgICAgICAgICBLID0gS0sKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9DT05KKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE1MCBJID0gTixKICsgMSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgLSBBUChLKSpYKEkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gSyAtIDEKKyAgMTUwICAgICAgICAgICAgICAgICAgICAgQ09OVElOVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgKE5PVU5JVCkgVEVNUCA9IFRFTVAvQVAoS0stTitKKQorICAgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRE8gMTYwIEkgPSBOLEogKyAxLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCAtIERDT05KRyhBUChLKSkqWChJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA9IEsgLSAxCisgIDE2MCAgICAgICAgICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgIElGIChOT1VOSVQpIFRFTVAgPSBURU1QL0RDT05KRyhBUChLSy1OK0opKQorICAgICAgICAgICAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgICAgICAgICAgICAgIFgoSikgPSBURU1QCisgICAgICAgICAgICAgICAgICAgICAgS0sgPSBLSyAtIChOLUorMSkKKyAgMTcwICAgICAgICAgICAgIENPTlRJTlVFCisgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgIEtYID0gS1ggKyAoTi0xKSpJTkNYCisgICAgICAgICAgICAgICAgICBKWCA9IEtYCisgICAgICAgICAgICAgICAgICBETyAyMDAgSiA9IE4sMSwtMQorICAgICAgICAgICAgICAgICAgICAgIFRFTVAgPSBYKEpYKQorICAgICAgICAgICAgICAgICAgICAgIElYID0gS1gKKyAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9DT05KKSBUSEVOCisgICAgICAgICAgICAgICAgICAgICAgICAgIERPIDE4MCBLID0gS0ssS0sgLSAoTi0gKEorMSkpLC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QID0gVEVNUCAtIEFQKEspKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAxODAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUC9BUChLSy1OK0opCisgICAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBETyAxOTAgSyA9IEtLLEtLIC0gKE4tIChKKzEpKSwtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUCA9IFRFTVAgLSBEQ09OSkcoQVAoSykpKlgoSVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWCA9IElYIC0gSU5DWAorICAxOTAgICAgICAgICAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRiAoTk9VTklUKSBURU1QID0gVEVNUC9EQ09OSkcoQVAoS0stTitKKSkKKyAgICAgICAgICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgICAgICAgICAgICBYKEpYKSA9IFRFTVAKKyAgICAgICAgICAgICAgICAgICAgICBKWCA9IEpYIC0gSU5DWAorICAgICAgICAgICAgICAgICAgICAgIEtLID0gS0sgLSAoTi1KKzEpCisgIDIwMCAgICAgICAgICAgICBDT05USU5VRQorICAgICAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBJRgorKgorICAgICAgUkVUVVJOCisqCisqICAgICBFbmQgb2YgWlRQU1YgLgorKgorICAgICAgRU5ECmRpZmYgLS1naXQgYS9jbWFrZS9DTWFrZURldGVybWluZVZTU2VydmljZVBhY2suY21ha2UgYi9jbWFrZS9DTWFrZURldGVybWluZVZTU2VydmljZVBhY2suY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5NDYyMwotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0NNYWtlRGV0ZXJtaW5lVlNTZXJ2aWNlUGFjay5jbWFrZQpAQCAtMCwwICsxLDEwMyBAQAorIyAtIEluY2x1ZGVzIGEgcHVibGljIGZ1bmN0aW9uIGZvciBhc3Npc3RpbmcgdXNlcnMgaW4gdHJ5aW5nIHRvIGRldGVybWluZSB0aGUKKyMgVmlzdWFsIFN0dWRpbyBzZXJ2aWNlIHBhY2sgaW4gdXNlLgorIworIyBTZXRzIHRoZSBwYXNzZWQgaW4gdmFyaWFibGUgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG9yIGFuIGVtcHR5CisjIHN0cmluZyBpZiB1bmtub3duLgorIyAgICB2YzgwCisjICAgIHZjODBzcDEKKyMgICAgdmM5MAorIyAgICB2Yzkwc3AxCisjCisjIFVzYWdlOgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICAgaWYoTVNWQykKKyMgICAgICAgaW5jbHVkZShDTWFrZURldGVybWluZVZTU2VydmljZVBhY2spCisjICAgICAgIERldGVybWluZVZTU2VydmljZVBhY2soIG15X3NlcnZpY2VfcGFjayApCisjCisjICAgICAgIGlmKCBteV9zZXJ2aWNlX3BhY2sgKQorIyAgICAgICAgICAgbWVzc2FnZShTVEFUVVMgIkRldGVjdGVkOiAke215X3NlcnZpY2VfcGFja30iKQorIyAgICAgICBlbmRpZigpCisjICAgIGVuZGlmKCkKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDb3B5cmlnaHQgMjAwOS0yMDEwIEtpdHdhcmUsIEluYy4KKyMgQ29weXJpZ2h0IDIwMDktMjAxMCBQaGlsaXAgTG93bWFuIDxwaGlsaXBAeWhidC5jb20+CisjCisjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBPU0ktYXBwcm92ZWQgQlNEIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOworIyBzZWUgYWNjb21wYW55aW5nIGZpbGUgQ29weXJpZ2h0LnR4dCBmb3IgZGV0YWlscy4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZQorIyBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIChUbyBkaXN0cmlidXRlIHRoaXMgZmlsZSBvdXRzaWRlIG9mIENNYWtlLCBzdWJzdGl0dXRlIHRoZSBmdWxsCisjICBMaWNlbnNlIHRleHQgZm9yIHRoZSBhYm92ZSByZWZlcmVuY2UuKQorCisjIFtJTlRFUk5BTF0KKyMgUGxlYXNlIGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKK2Z1bmN0aW9uKF9EZXRlcm1pbmVWU1NlcnZpY2VQYWNrRnJvbUNvbXBpbGVyIF9PVVRfVkFSIF9jbF92ZXJzaW9uKQorICAgaWYgICAgKCR7X2NsX3ZlcnNpb259IFZFUlNJT05fRVFVQUwgIjE0LjAwLjUwNzI3LjQyIikKKyAgICAgICBzZXQoX3ZlcnNpb24gInZjODAiKQorICAgZWxzZWlmKCR7X2NsX3ZlcnNpb259IFZFUlNJT05fRVFVQUwgIjE0LjAwLjUwNzI3Ljc2MiIpCisgICAgICAgc2V0KF92ZXJzaW9uICJ2Yzgwc3AxIikKKyAgIGVsc2VpZigke19jbF92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICIxNS4wMC4yMTAyMi4wOCIpCisgICAgICAgc2V0KF92ZXJzaW9uICJ2YzkwIikKKyAgIGVsc2VpZigke19jbF92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICIxNS4wMC4zMDcyOS4wMSIpCisgICAgICAgc2V0KF92ZXJzaW9uICJ2Yzkwc3AxIikKKyAgIGVsc2VpZigke19jbF92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICIxNi4wMC4zMDMxOS4wMSIpCisgICAgICAgc2V0KF92ZXJzaW9uICJ2YzEwMCIpCisgICBlbHNlKCkKKyAgICAgICBzZXQoX3ZlcnNpb24gIiIpCisgICBlbmRpZigpCisgICBzZXQoJHtfT1VUX1ZBUn0gJHtfdmVyc2lvbn0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjCisjIEEgZnVuY3Rpb24gdG8gY2FsbCB0byBkZXRlcm1pbmUgdGhlIFZpc3VhbCBTdHVkaW8gc2VydmljZSBwYWNrCisjIGluIHVzZS4gIFNlZSBkb2N1bWVudGF0aW9uIGFib3ZlLgorZnVuY3Rpb24oRGV0ZXJtaW5lVlNTZXJ2aWNlUGFjayBfcGFjaykKKyAgICBpZihOT1QgREVURVJNSU5FRF9WU19TRVJWSUNFX1BBQ0sgT1IgTk9UICR7X3BhY2t9KQorCQlpZigke0NNQUtFX0JVSUxEX1RPT0x9IFNUUkVRVUFMICJubWFrZSIpCisJCQlFWEVDVVRFX1BST0NFU1MoQ09NTUFORCAke0NNQUtFX0NYWF9DT01QSUxFUn0gIi8/IgorCQkJCUVSUk9SX1ZBUklBQkxFIF9vdXRwdXQpCisJCQlzZXQoREVURVJNSU5FRF9WU19TRVJWSUNFX1BBQ0sgJHtfb3V0cHV0fSkKKwkgICAgZWxzZSgpCQorCQkJZmlsZShXUklURSAiJHtDTUFLRV9CSU5BUllfRElSfS9yZXR1cm4wLmNjIgorCQkJCSJpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH1cbiIpCisKKwkJCXRyeV9jb21waWxlKERFVEVSTUlORURfVlNfU0VSVklDRV9QQUNLCisJCQkJIiR7Q01BS0VfQklOQVJZX0RJUn0iCisJCQkJIiR7Q01BS0VfQklOQVJZX0RJUn0vcmV0dXJuMC5jYyIKKwkJCQlPVVRQVVRfVkFSSUFCTEUgX291dHB1dAorCQkJCUNPUFlfRklMRSAiJHtDTUFLRV9CSU5BUllfRElSfS9yZXR1cm4wLmNjIikKKyAgICAgICAgCisJCQlmaWxlKFJFTU9WRSAiJHtDTUFLRV9CSU5BUllfRElSfS9yZXR1cm4wLmNjIikKKwkJZW5kaWYoKQorICAgICAgICAgICAgICAgIAorICAgICAgICBpZihERVRFUk1JTkVEX1ZTX1NFUlZJQ0VfUEFDSyBBTkQgX291dHB1dCkKKyAgICAgICAgICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiQ29tcGlsZXIgVmVyc2lvbiBbMC05XSsuWzAtOV0rLlswLTldKy5bMC05XSsiCisgICAgICAgICAgICAgICAgX2NsX3ZlcnNpb24gIiR7X291dHB1dH0iKQorICAgICAgICAgICAgaWYoX2NsX3ZlcnNpb24pCisgICAgICAgICAgICAgICAgc3RyaW5nKFJFR0VYIE1BVENIQUxMICJbMC05XSsiCisgICAgICAgICAgICAgICAgICAgIF9jbF92ZXJzaW9uX2xpc3QgIiR7X2NsX3ZlcnNpb259IikKKyAgICAgICAgICAgICAgICBsaXN0KEdFVCBfY2xfdmVyc2lvbl9saXN0IDAgX21ham9yKQorICAgICAgICAgICAgICAgIGxpc3QoR0VUIF9jbF92ZXJzaW9uX2xpc3QgMSBfbWlub3IpCisgICAgICAgICAgICAgICAgbGlzdChHRVQgX2NsX3ZlcnNpb25fbGlzdCAyIF9wYXRjaCkKKyAgICAgICAgICAgICAgICBsaXN0KEdFVCBfY2xfdmVyc2lvbl9saXN0IDMgX3R3ZWFrKQorCisgICAgICAgICAgICAgICAgc2V0KF9jbF92ZXJzaW9uX3N0cmluZyAke19tYWpvcn0uJHtfbWlub3J9LiR7X3BhdGNofS4ke190d2Vha30pCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgVlMgdmVyc2lvbgorICAgICAgICAgICAgICAgIF9EZXRlcm1pbmVWU1NlcnZpY2VQYWNrRnJvbUNvbXBpbGVyKF9zcCAiJHtfY2xfdmVyc2lvbl9zdHJpbmd9IikKKyAgICAgICAgICAgICAgICBpZihfc3ApCisgICAgICAgICAgICAgICAgICAgICNzZXQoJHtfcGFja30gIiR7X3NwfSgke19jbF92ZXJzaW9uX3N0cmluZ30pIiBDQUNIRSBJTlRFUk5BTAorCQkJCQlzZXQoJHtfcGFja30gIiR7X3NwfSIgQ0FDSEUgSU5URVJOQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgVmlzdWFsIFN0dWRpbyBSZWxlYXNlIHdpdGggU2VydmljZSBQYWNrIikKKyAgICAgICAgICAgICAgICBlbmRpZigpCisgICAgICAgICAgICBlbmRpZigpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9jbWFrZS9FaWdlbkNvbmZpZ3VyZVRlc3RpbmcuY21ha2UgYi9jbWFrZS9FaWdlbkNvbmZpZ3VyZVRlc3RpbmcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4ZjMyYwotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0VpZ2VuQ29uZmlndXJlVGVzdGluZy5jbWFrZQpAQCAtMCwwICsxLDc5IEBACitpbmNsdWRlKEVpZ2VuVGVzdGluZykKK2luY2x1ZGUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworIyBjb25maWd1cmUgdGhlICJzaXRlIiBhbmQgImJ1aWxkbmFtZSIgCitlaV9zZXRfc2l0ZW5hbWUoKQorCisjIHJldHJpZXZlIGFuZCBzdG9yZSB0aGUgYnVpbGQgc3RyaW5nCitlaV9zZXRfYnVpbGRfc3RyaW5nKCkKKworYWRkX2N1c3RvbV90YXJnZXQoYnVpbGR0ZXN0cykKK2FkZF9jdXN0b21fdGFyZ2V0KGNoZWNrIENPTU1BTkQgImN0ZXN0IikKK2FkZF9kZXBlbmRlbmNpZXMoY2hlY2sgYnVpbGR0ZXN0cykKKworIyBjaGVjayB3aGV0aGVyIC9iaW4vYmFzaCBleGlzdHMKK2ZpbmRfZmlsZShFSUdFTl9CSU5fQkFTSF9FWElTVFMgIi9iaW4vYmFzaCIgUEFUSFMgIi8iIE5PX0RFRkFVTFRfUEFUSCkKKworIyBDTWFrZS9DdGVzdCBkb2VzIG5vdCBhbGxvdyB1cyB0byBjaGFuZ2UgdGhlIGJ1aWxkIGNvbW1hbmQsCisjIHNvIHdlIGhhdmUgdG8gd29ya2Fyb3VuZCBieSBkaXJlY3RseSBlZGl0aW5nIHRoZSBnZW5lcmF0ZWQgRGFydENvbmZpZ3VyYXRpb24udGNsIGZpbGUKKyMgc2F2ZSBDTUFLRV9NQUtFX1BST0dSQU0KK3NldChDTUFLRV9NQUtFX1BST0dSQU1fU0FWRSAke0NNQUtFX01BS0VfUFJPR1JBTX0pCisjIGFuZCBzZXQgYSBmYWtlIG9uZQorc2V0KENNQUtFX01BS0VfUFJPR1JBTSAiQEVJR0VOX01BS0VDT01NQU5EX1BMQUNFSE9MREVSQCIpCisKKyMgVGhpcyBjYWxsIGFjdGl2YXRlcyB0ZXN0aW5nIGFuZCBnZW5lcmF0ZXMgdGhlIERhcnRDb25maWd1cmF0aW9uLnRjbAoraW5jbHVkZShDVGVzdCkKKworIyBvdmVyd3JpdGUgZGVmYXVsdCBEYXJ0Q29uZmlndXJhdGlvbi50Y2wKKyMgVGhlIHdvcmFyb3VuZHMgYXJlIGRpZmZlcmVudCBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBNU1ZDIElERQoraWYoTVNWQ19JREUpCisgIGlmKE1TVkNfVkVSU0lPTiBFUVVBTCAxNjAwKSAjIE1TVkMgMjAxMAorICAgIHNldChFSUdFTl9NQUtFQ09NTUFORF9QTEFDRUhPTERFUiAiJHtDTUFLRV9NQUtFX1BST0dSQU1fU0FWRX0gYnVpbGR0ZXN0cy52Y3hwcm9qIC9wOkNvbmZpZ3VyYXRpb249XCR7Q1RFU1RfQ09ORklHVVJBVElPTl9UWVBFfSBcbiMgIikKKyAgZWxzZSgpICMgTVNWQyAyMDA4IChUT0RPIGNoZWNrIE1TVkMgMjAwNSkKKyAgICBzZXQoRUlHRU5fTUFLRUNPTU1BTkRfUExBQ0VIT0xERVIgIiR7Q01BS0VfTUFLRV9QUk9HUkFNX1NBVkV9IEVpZ2VuLnNsbiAvYnVpbGQgXCJSZWxlYXNlXCIgL3Byb2plY3QgYnVpbGR0ZXN0cyBcbiMgIikKKyAgZW5kaWYoKQorZWxzZSgpCisgICMgZm9yIG1ha2UgYW5kIG5tYWtlCisgIHNldChFSUdFTl9NQUtFQ09NTUFORF9QTEFDRUhPTERFUiAiJHtDTUFLRV9NQUtFX1BST0dSQU1fU0FWRX0gYnVpbGR0ZXN0cyIpCitlbmRpZigpCisKKyMgY29weSBjdGVzdCBwcm9wZXJ0aWVzLCB3aGljaCBjdXJyZW50bHkKKyMgbyByYWlzZSB0aGUgd2FybmluZyBsZXZlbHMKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQklOQVJZX0RJUn0vRGFydENvbmZpZ3VyYXRpb24udGNsICR7Q01BS0VfQklOQVJZX0RJUn0vRGFydENvbmZpZ3VyYXRpb24udGNsKQorCisjIHJlc3RvcmUgZGVmYXVsdCBDTUFLRV9NQUtFX1BST0dSQU0KK3NldChDTUFLRV9NQUtFX1BST0dSQU0gJHtDTUFLRV9NQUtFX1BST0dSQU1fU0FWRX0pCisjIHVuLXNldCB0ZW1wb3JhcnkgdmFyaWFibGVzIHNvIHRoYXQgaXQgaXMgbGlrZSB0aGV5IG5ldmVyIGV4aXN0ZWQuIAorIyBDTWFrZSAyLjYuMyBpbnRyb2R1Y2VzIHRoZSBtb3JlIGxvZ2ljYWwgdW5zZXQoKSBzeW50YXggZm9yIHRoaXMuCitzZXQoQ01BS0VfTUFLRV9QUk9HUkFNX1NBVkUpIAorc2V0KEVJR0VOX01BS0VDT01NQU5EX1BMQUNFSE9MREVSKQorCitjb25maWd1cmVfZmlsZSgke0NNQUtFX1NPVVJDRV9ESVJ9L0NUZXN0Q3VzdG9tLmNtYWtlLmluICR7Q01BS0VfQklOQVJZX0RJUn0vQ1Rlc3RDdXN0b20uY21ha2UpCisKKyMgc29tZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gd291bGQgYmUgbmljZQorZWlfaW5pdF90ZXN0aW5nKCkKKworIyBjb25maWd1cmUgRWlnZW4gcmVsYXRlZCB0ZXN0aW5nIG9wdGlvbnMKK29wdGlvbihFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcgIkRpc2FibGUgY2hlY2tpbmcgb2YgYXNzZXJ0aW9ucyB1c2luZyBleGNlcHRpb25zIiBPRkYpCitvcHRpb24oRUlHRU5fREVCVUdfQVNTRVJUUyAiRW5hYmxlIGFkdmFuY2VkIGRlYnVnaW5nIG9mIGFzc2VydGlvbnMiIE9GRikKKworaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorICBvcHRpb24oRUlHRU5fQ09WRVJBR0VfVEVTVElORyAiRW5hYmxlL2Rpc2FibGUgZ2NvdiIgT0ZGKQorICBpZihFSUdFTl9DT1ZFUkFHRV9URVNUSU5HKQorICAgIHNldChDT1ZFUkFHRV9GTEFHUyAiLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIikKKyAgICBzZXQoQ1RFU1RfQ1VTVE9NX0NPVkVSQUdFX0VYQ0xVREUgIi90ZXN0LyIpCisgIGVsc2UoRUlHRU5fQ09WRVJBR0VfVEVTVElORykKKyAgICBzZXQoQ09WRVJBR0VfRkxBR1MgIiIpCisgIGVuZGlmKEVJR0VOX0NPVkVSQUdFX1RFU1RJTkcpCisgIGlmKEVJR0VOX1RFU1RfQysrMHgpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1zdGQ9Z251KysweCIpCisgIGVuZGlmKEVJR0VOX1RFU1RfQysrMHgpCisgIGlmKENNQUtFX1NZU1RFTV9OQU1FIE1BVENIRVMgTGludXgpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9ICR7Q09WRVJBR0VfRkxBR1N9IC1nMiIpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHU19SRUxXSVRIREVCSU5GTyAiJHtDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk99ICR7Q09WRVJBR0VfRkxBR1N9IC1PMiAtZzIiKQorICAgIHNldChDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRSAiJHtDTUFLRV9DWFhfRkxBR1NfUkVMRUFTRX0gJHtDT1ZFUkFHRV9GTEFHU30gLWZuby1pbmxpbmUtZnVuY3Rpb25zIikKKyAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHICIke0NNQUtFX0NYWF9GTEFHU19ERUJVR30gJHtDT1ZFUkFHRV9GTEFHU30gLU8wIC1nMyIpCisgIGVuZGlmKENNQUtFX1NZU1RFTV9OQU1FIE1BVENIRVMgTGludXgpCitlbHNlaWYoTVNWQykKKyAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC9EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgL0RfU0NMX1NFQ1VSRV9OT19XQVJOSU5HUyIpCitlbmRpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCmRpZmYgLS1naXQgYS9jbWFrZS9FaWdlbkRldGVybWluZU9TVmVyc2lvbi5jbWFrZSBiL2NtYWtlL0VpZ2VuRGV0ZXJtaW5lT1NWZXJzaW9uLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDhkNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9FaWdlbkRldGVybWluZU9TVmVyc2lvbi5jbWFrZQpAQCAtMCwwICsxLDQ2IEBACisjIFRoZSB1dGlsaXR5IGZ1bmN0aW9uIERldGVybWluZU9TVmVyc2lvbiBhaW1zIGF0IHByb3ZpZGluZyBhbgorIyBpbXByb3ZlZCB2ZXJzaW9uIG9mIHRoZSBDTWFrZSB2YXJpYWJsZSAke0NNQUtFX1NZU1RFTX0gb24gV2luZG93cworIyBtYWNoaW5lcy4KKyMKKyMgVXNhZ2U6CisjICBpbmNsdWRlKEVpZ2VuRGV0ZXJtaW5lT1NWZXJzaW9uKQorIyAgRGV0ZXJtaW5lT1NWZXJzaW9uKE9TX1ZFUlNJT04pCisjICBtZXNzYWdlKCJPUzogJHtPU19WRVJTSU9OfSIpCisKKyMgLSBBIGxpdHRsZSBoZWxwZXIgdmFyaWFibGUgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXJlY3RseSBjYWxsZWQKK2Z1bmN0aW9uKERldGVybWluZVNob3J0V2luZG93c05hbWUgV0lOX1ZFUlNJT04gd2luX251bV92ZXJzaW9uKQorICAgaWYgICAgKCR7d2luX251bV92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICI2LjEiKQorICAgICAgIHNldChfdmVyc2lvbiAid2luNyIpCisgICBlbHNlaWYoJHt3aW5fbnVtX3ZlcnNpb259IFZFUlNJT05fRVFVQUwgIjYuMCIpCisgICAgICAgc2V0KF92ZXJzaW9uICJ3aW5WaXN0YSIpCisgICBlbHNlaWYoJHt3aW5fbnVtX3ZlcnNpb259IFZFUlNJT05fRVFVQUwgIjUuMiIpCisgICAgICAgc2V0KF92ZXJzaW9uICJ3aW5YcFByb2YiKQorICAgZWxzZWlmKCR7d2luX251bV92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICI1LjEiKQorICAgICAgIHNldChfdmVyc2lvbiAid2luWHAiKQorICAgZWxzZWlmKCR7d2luX251bV92ZXJzaW9ufSBWRVJTSU9OX0VRVUFMICI1LjAiKQorICAgICAgIHNldChfdmVyc2lvbiAid2luMjAwMFByb2YiKQorICAgZWxzZSgpCisgICAgICAgc2V0KF92ZXJzaW9uICJ1bmtub3duV2luIikKKyAgIGVuZGlmKCkKKyAgIHNldCgke1dJTl9WRVJTSU9OfSAke192ZXJzaW9ufSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKK2Z1bmN0aW9uKERldGVybWluZU9TVmVyc2lvbiBPU19WRVJTSU9OKQorICBpZiAoV0lOMzIpCisgICAgZmlsZSAoVE9fTkFUSVZFX1BBVEggIiRFTlZ7Q09NU1BFQ30iIFNIRUxMKQorICAgIGV4ZWNfcHJvZ3JhbSggJHtTSEVMTH0gQVJHUyAiL2MiICJ2ZXIiIE9VVFBVVF9WQVJJQUJMRSB2ZXJfb3V0cHV0KQorCQkJCQorICAgICAgc3RyaW5nKFJFR0VYIE1BVENIQUxMICJbMC05XSsiCisgICAgICAgICAgIHZlcl9saXN0ICIke3Zlcl9vdXRwdXR9IikKKyAgICAgIGxpc3QoR0VUIHZlcl9saXN0IDAgX21ham9yKQkJICAgCisgICAgICBsaXN0KEdFVCB2ZXJfbGlzdCAxIF9taW5vcikKKwkJCQkKKyAgICBzZXQod2luX251bV92ZXJzaW9uICR7X21ham9yfS4ke19taW5vcn0pCisgICAgRGV0ZXJtaW5lU2hvcnRXaW5kb3dzTmFtZSh3aW5fdmVyc2lvbiAiJHt3aW5fbnVtX3ZlcnNpb259IikKKyAgICBpZih3aW5fdmVyc2lvbikKKyAgICAgIHNldCgke09TX1ZFUlNJT059ICR7d2luX3ZlcnNpb259IFBBUkVOVF9TQ09QRSkKKyAgICBlbmRpZigpCisgIGVsc2UoKQorICAgIHNldCgke09TX1ZFUlNJT059ICR7Q01BS0VfU1lTVEVNfSBQQVJFTlRfU0NPUEUpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL2NtYWtlL0VpZ2VuVGVzdGluZy5jbWFrZSBiL2NtYWtlL0VpZ2VuVGVzdGluZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjYwNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRWlnZW5UZXN0aW5nLmNtYWtlCkBAIC0wLDAgKzEsNDc3IEBACisKK21hY3JvKGVpX2FkZF9wcm9wZXJ0eSBwcm9wIHZhbHVlKQorICBnZXRfcHJvcGVydHkocHJldmlvdXMgR0xPQkFMIFBST1BFUlRZICR7cHJvcH0pICAKKyAgaWYgKChOT1QgcHJldmlvdXMpIE9SIChwcmV2aW91cyBTVFJFUVVBTCAiIikpCisgICAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSAke3Byb3B9ICIke3ZhbHVlfSIpCisgIGVsc2UoKQorICAgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgJHtwcm9wfSAiJHtwcmV2aW91c30gJHt2YWx1ZX0iKQorICBlbmRpZigpICAKK2VuZG1hY3JvKGVpX2FkZF9wcm9wZXJ0eSkKKworI2ludGVybmFsLiBTZWUgZG9jdW1lbnRhdGlvbiBvZiBlaV9hZGRfdGVzdCBmb3IgZGV0YWlscy4KK21hY3JvKGVpX2FkZF90ZXN0X2ludGVybmFsIHRlc3RuYW1lIHRlc3RuYW1lX3dpdGhfc3VmZml4KQorICBzZXQodGFyZ2V0bmFtZSAke3Rlc3RuYW1lX3dpdGhfc3VmZml4fSkKKworICBzZXQoZmlsZW5hbWUgJHt0ZXN0bmFtZX0uY3BwKQorICBhZGRfZXhlY3V0YWJsZSgke3RhcmdldG5hbWV9ICR7ZmlsZW5hbWV9KQorICBpZiAodGFyZ2V0bmFtZSBNQVRDSEVTICJeZWlnZW4yXyIpCisgICAgYWRkX2RlcGVuZGVuY2llcyhlaWdlbjJfYnVpbGR0ZXN0cyAke3RhcmdldG5hbWV9KQorICBlbHNlKCkKKyAgICBhZGRfZGVwZW5kZW5jaWVzKGJ1aWxkdGVzdHMgJHt0YXJnZXRuYW1lfSkKKyAgZW5kaWYoKQorCisgIGlmKEVJR0VOX05PX0FTU0VSVElPTl9DSEVDS0lORykKKyAgICBlaV9hZGRfdGFyZ2V0X3Byb3BlcnR5KCR7dGFyZ2V0bmFtZX0gQ09NUElMRV9GTEFHUyAiLURFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkc9MSIpCisgIGVsc2UoRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HKQorICAgIGlmKEVJR0VOX0RFQlVHX0FTU0VSVFMpCisgICAgICBlaV9hZGRfdGFyZ2V0X3Byb3BlcnR5KCR7dGFyZ2V0bmFtZX0gQ09NUElMRV9GTEFHUyAiLURFSUdFTl9ERUJVR19BU1NFUlRTPTEiKQorICAgIGVuZGlmKEVJR0VOX0RFQlVHX0FTU0VSVFMpCisgIGVuZGlmKEVJR0VOX05PX0FTU0VSVElPTl9DSEVDS0lORykKKyAgCisgIGVpX2FkZF90YXJnZXRfcHJvcGVydHkoJHt0YXJnZXRuYW1lfSBDT01QSUxFX0ZMQUdTICItREVJR0VOX1RFU1RfTUFYX1NJWkU9JHtFSUdFTl9URVNUX01BWF9TSVpFfSIpCisKKyAgZWlfYWRkX3RhcmdldF9wcm9wZXJ0eSgke3RhcmdldG5hbWV9IENPTVBJTEVfRkxBR1MgIi1ERUlHRU5fVEVTVF9GVU5DPSR7dGVzdG5hbWV9IikKKyAgCisgIGlmKE1TVkMgQU5EIE5PVCBFSUdFTl9TUExJVF9MQVJHRV9URVNUUykKKyAgICBlaV9hZGRfdGFyZ2V0X3Byb3BlcnR5KCR7dGFyZ2V0bmFtZX0gQ09NUElMRV9GTEFHUyAiL2JpZ29iaiIpCisgIGVuZGlmKCkgIAorCisgICMgbGV0IHRoZSB1c2VyIHBhc3MgZmxhZ3MuCisgIGlmKCR7QVJHQ30gR1JFQVRFUiAyKQorICAgIGVpX2FkZF90YXJnZXRfcHJvcGVydHkoJHt0YXJnZXRuYW1lfSBDT01QSUxFX0ZMQUdTICIke0FSR1YyfSIpCisgIGVuZGlmKCR7QVJHQ30gR1JFQVRFUiAyKQorICAKKyAgaWYoRUlHRU5fVEVTVF9DVVNUT01fQ1hYX0ZMQUdTKQorICAgIGVpX2FkZF90YXJnZXRfcHJvcGVydHkoJHt0YXJnZXRuYW1lfSBDT01QSUxFX0ZMQUdTICIke0VJR0VOX1RFU1RfQ1VTVE9NX0NYWF9GTEFHU30iKQorICBlbmRpZigpCisKKyAgaWYoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8pCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0bmFtZX0gJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30pCisgIGVuZGlmKCkKKyAgaWYoRVhURVJOQUxfTElCUykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXRuYW1lfSAke0VYVEVSTkFMX0xJQlN9KQorICBlbmRpZigpCisgIGlmKEVJR0VOX1RFU1RfQ1VTVE9NX0xJTktFUl9GTEFHUykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXRuYW1lfSAke0VJR0VOX1RFU1RfQ1VTVE9NX0xJTktFUl9GTEFHU30pCisgIGVuZGlmKCkKKworICBpZigke0FSR0N9IEdSRUFURVIgMykKKyAgICBzZXQobGlic190b19saW5rICR7QVJHVjN9KQorICAgICMgaXQgY291bGQgYmUgdGhhdCBzb21lIGNtYWtlIG1vZHVsZSBwcm92aWRlcyBhIGJhZCBsaWJyYXJ5IHN0cmluZyAiICIgIChqdXN0IHNwYWNlcyksCisgICAgIyBhbmQgdGhhdCBzZXZlcmVseSBicmVha3MgdGFyZ2V0X2xpbmtfbGlicmFyaWVzICgiY2FuJ3QgbGluayB0byAtbC1sc3RkYysrIiBlcnJvcnMpLgorICAgICMgc28gd2UgY2hlY2sgZm9yIHN0cmluZ3MgY29udGFpbmluZyBvbmx5IHNwYWNlcy4KKyAgICBzdHJpbmcoU1RSSVAgIiR7bGlic190b19saW5rfSIgbGlic190b19saW5rX3N0cmlwcGVkKQorICAgIHN0cmluZyhMRU5HVEggIiR7bGlic190b19saW5rX3N0cmlwcGVkfSIgbGlic190b19saW5rX3N0cmlwcGVkX2xlbmd0aCkKKyAgICBpZigke2xpYnNfdG9fbGlua19zdHJpcHBlZF9sZW5ndGh9IEdSRUFURVIgMCkKKyAgICAgICMgbm90aWNlOiBubyBkb3VibGUgcXVvdGVzIGFyb3VuZCAke2xpYnNfdG9fbGlua30gaGVyZS4gSXQgbWF5IGJlIGEgbGlzdC4KKyAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldG5hbWV9ICR7bGlic190b19saW5rfSkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkgCisKKyAgaWYoRUlHRU5fQklOX0JBU0hfRVhJU1RTKQorICAgIGFkZF90ZXN0KCR7dGVzdG5hbWVfd2l0aF9zdWZmaXh9ICIke0VpZ2VuX1NPVVJDRV9ESVJ9L3Rlc3QvcnVudGVzdC5zaCIgIiR7dGVzdG5hbWVfd2l0aF9zdWZmaXh9IikKKyAgZWxzZSgpCisgICAgYWRkX3Rlc3QoJHt0ZXN0bmFtZV93aXRoX3N1ZmZpeH0gIiR7dGFyZ2V0bmFtZX0iKQorICBlbmRpZigpCisKK2VuZG1hY3JvKGVpX2FkZF90ZXN0X2ludGVybmFsKQorCisjIE1hY3JvIHRvIGFkZCBhIHRlc3QKKyMKKyMgdGhlIHVuaXF1ZSBtYW5kYXRvcnkgcGFyYW1ldGVyIHRlc3RuYW1lIG11c3QgY29ycmVzcG9uZCB0byBhIGZpbGUKKyMgPHRlc3RuYW1lPi5jcHAgd2hpY2ggZm9sbG93cyB0aGlzIHBhdHRlcm46CisjCisjICNpbmNsdWRlICJtYWluLmgiCisjIHZvaWQgdGVzdF88dGVzdG5hbWU+KCkgeyAuLi4gfQorIworIyBEZXBlbmRpbmcgb24gdGhlIGNvbnRlbnRzIG9mIHRoYXQgZmlsZSwgdGhpcyBtYWNybyBjYW4gaGF2ZSAyIGJlaGF2aW9ycywKKyMgc2VlIGJlbG93LgorIworIyBUaGUgb3B0aW9uYWwgMm5kIHBhcmFtZXRlciBpcyBsaWJyYXJpZXMgdG8gbGluayB0by4KKyMKKyMgQS4gRGVmYXVsdCBiZWhhdmlvcgorIworIyB0aGlzIG1hY3JvIGFkZHMgYW4gZXhlY3V0YWJsZSA8dGVzdG5hbWU+IGFzIHdlbGwgYXMgYSBjdGVzdCB0ZXN0CisjIG5hbWVkIDx0ZXN0bmFtZT4gdG9vLgorIworIyBPbiBwbGF0Zm9ybXMgd2l0aCBiYXNoIHNpbXBseSBydW46CisjICAgImN0ZXN0IC1WIiBvciAiY3Rlc3QgLVYgLVIgPHRlc3RuYW1lPiIKKyMgT24gb3RoZXIgcGxhdGZvcm0gdXNlIGN0ZXN0IGFzIHVzdWFsCisjCisjIEIuIE11bHRpLXBhcnQgYmVoYXZpb3IKKyMKKyMgSWYgdGhlIHNvdXJjZSBmaWxlIG1hdGNoZXMgdGhlIHJlZ2V4cAorIyAgICBDQUxMX1NVQlRFU1RfWzAtOV0rfEVJR0VOX1RFU1RfUEFSVF9bMC05XSsKKyMgdGhlbiBpdCBpcyBpbnRlcnByZXRlZCBhcyBhIG11bHRpLXBhcnQgdGVzdC4gVGhlIGJlaGF2aW9yIHRoZW4gZGVwZW5kcyBvbiB0aGUKKyMgQ01ha2Ugb3B0aW9uIEVJR0VOX1NQTElUX0xBUkdFX1RFU1RTLCB3aGljaCBpcyBPTiBieSBkZWZhdWx0LgorIworIyBJZiBFSUdFTl9TUExJVF9MQVJHRV9URVNUUyBpcyBPRkYsIHRoZSBiZWhhdmlvciBpcyB0aGUgc2FtZSBhcyBpbiBBICh0aGUgbXVsdGktcGFydAorIyBhc3BlY3QgaXMgaWdub3JlZCkuCisjCisjIElmIEVJR0VOX1NQTElUX0xBUkdFX1RFU1RTIGlzIE9OLCB0aGUgdGVzdCBpcyBzcGxpdCBpbnRvIG11bHRpcGxlIGV4ZWN1dGFibGVzCisjICAgdGVzdF88dGVzdG5hbWU+XzxOPgorIyB3aGVyZSBOIHJ1bnMgZnJvbSAxIHRvIHRoZSBncmVhdGVzdCBvY2N1cmVuY2UgZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLiBFYWNoIG9mIHRoZXNlCisjIGV4ZWN1dGFibGVzIGlzIGJ1aWx0IHBhc3NpbmcgLURFSUdFTl9URVNUX1BBUlRfTi4gVGhpcyBhbGxvd3MgdG8gc3BsaXQgbGFyZ2UgdGVzdHMKKyMgaW50byBzbWFsbGVyIGV4ZWN1dGFibGVzLgorIworIyBNb3Jlb3ZlciwgdGFyZ2V0cyA8dGVzdG5hbWU+IGFyZSBzdGlsbCBnZW5lcmF0ZWQsIHRoZXkKKyMgaGF2ZSB0aGUgZWZmZWN0IG9mIGJ1aWxkaW5nIGFsbCB0aGUgcGFydHMgb2YgdGhlIHRlc3QuCisjCisjIEFnYWluLCBjdGVzdCAtUiBhbGxvd3MgdG8gcnVuIGFsbCBtYXRjaGluZyB0ZXN0cy4KK21hY3JvKGVpX2FkZF90ZXN0IHRlc3RuYW1lKQorICBnZXRfcHJvcGVydHkoRUlHRU5fVEVTVFNfTElTVCBHTE9CQUwgUFJPUEVSVFkgRUlHRU5fVEVTVFNfTElTVCkKKyAgc2V0KEVJR0VOX1RFU1RTX0xJU1QgIiR7RUlHRU5fVEVTVFNfTElTVH0ke3Rlc3RuYW1lfVxuIikKKyAgc2V0X3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9URVNUU19MSVNUICIke0VJR0VOX1RFU1RTX0xJU1R9IikKKworICBmaWxlKFJFQUQgIiR7dGVzdG5hbWV9LmNwcCIgdGVzdF9zb3VyY2UpCisgIHNldChwYXJ0cyAwKQorICBzdHJpbmcoUkVHRVggTUFUQ0hBTEwgIkNBTExfU1VCVEVTVF9bMC05XSt8RUlHRU5fVEVTVF9QQVJUX1swLTldK3xFSUdFTl9TVUZGSVhFUyg7WzAtOV0rKSsiCisgICAgICAgICBvY2N1cmVuY2VzICIke3Rlc3Rfc291cmNlfSIpCisgIHN0cmluZyhSRUdFWCBSRVBMQUNFICJDQUxMX1NVQlRFU1RffEVJR0VOX1RFU1RfUEFSVF98RUlHRU5fU1VGRklYRVMiICIiIHN1ZmZpeGVzICIke29jY3VyZW5jZXN9IikKKyAgbGlzdChSRU1PVkVfRFVQTElDQVRFUyBzdWZmaXhlcykKKyAgaWYoRUlHRU5fU1BMSVRfTEFSR0VfVEVTVFMgQU5EIHN1ZmZpeGVzKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KCR7dGVzdG5hbWV9KQorICAgIGZvcmVhY2goc3VmZml4ICR7c3VmZml4ZXN9KQorICAgICAgZWlfYWRkX3Rlc3RfaW50ZXJuYWwoJHt0ZXN0bmFtZX0gJHt0ZXN0bmFtZX1fJHtzdWZmaXh9CisgICAgICAgICIke0FSR1YxfSAtREVJR0VOX1RFU1RfUEFSVF8ke3N1ZmZpeH09MSIgIiR7QVJHVjJ9IikKKyAgICAgIGFkZF9kZXBlbmRlbmNpZXMoJHt0ZXN0bmFtZX0gJHt0ZXN0bmFtZX1fJHtzdWZmaXh9KQorICAgIGVuZGZvcmVhY2goc3VmZml4KQorICBlbHNlKEVJR0VOX1NQTElUX0xBUkdFX1RFU1RTIEFORCBzdWZmaXhlcykKKyAgICBzZXQoc3ltYm9sc190b19lbmFibGVfYWxsX3BhcnRzICIiKQorICAgIGZvcmVhY2goc3VmZml4ICR7c3VmZml4ZXN9KQorICAgICAgc2V0KHN5bWJvbHNfdG9fZW5hYmxlX2FsbF9wYXJ0cworICAgICAgICAiJHtzeW1ib2xzX3RvX2VuYWJsZV9hbGxfcGFydHN9IC1ERUlHRU5fVEVTVF9QQVJUXyR7c3VmZml4fT0xIikKKyAgICBlbmRmb3JlYWNoKHN1ZmZpeCkKKyAgICBlaV9hZGRfdGVzdF9pbnRlcm5hbCgke3Rlc3RuYW1lfSAke3Rlc3RuYW1lfSAiJHtBUkdWMX0gJHtzeW1ib2xzX3RvX2VuYWJsZV9hbGxfcGFydHN9IiAiJHtBUkdWMn0iKQorICBlbmRpZihFSUdFTl9TUExJVF9MQVJHRV9URVNUUyBBTkQgc3VmZml4ZXMpCitlbmRtYWNybyhlaV9hZGRfdGVzdCkKKworCisjIGFkZHMgYSBmYWlsdGVzdCwgaS5lLiBhIHRlc3QgdGhhdCBzdWNjZWVkIGlmIHRoZSBwcm9ncmFtIGZhaWxzIHRvIGNvbXBpbGUKKyMgbm90ZSB0aGF0IHRoZSB0ZXN0IHJ1bm5lciBmb3IgdGhlc2UgaXMgQ01ha2UgaXRzZWxmLCB3aGVuIHBhc3NlZCAtREVJR0VOX0ZBSUxURVNUPU9OCisjIHNvIGhlcmUgd2UncmUganVzdCBydW5uaW5nIENNYWtlIGNvbW1hbmRzIGltbWVkaWF0ZWx5LCB3ZSdyZSBub3QgYWRkaW5nIGFueSB0YXJnZXRzLgorbWFjcm8oZWlfYWRkX2ZhaWx0ZXN0IHRlc3RuYW1lKQorICBnZXRfcHJvcGVydHkoRUlHRU5fRkFJTFRFU1RfRkFJTFVSRV9DT1VOVCBHTE9CQUwgUFJPUEVSVFkgRUlHRU5fRkFJTFRFU1RfRkFJTFVSRV9DT1VOVCkKKyAgZ2V0X3Byb3BlcnR5KEVJR0VOX0ZBSUxURVNUX0NPVU5UIEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9GQUlMVEVTVF9DT1VOVCkKKworICBtZXNzYWdlKFNUQVRVUyAiQ2hlY2tpbmcgZmFpbHRlc3Q6ICR7dGVzdG5hbWV9IikKKyAgc2V0KGZpbGVuYW1lICIke3Rlc3RuYW1lfS5jcHAiKQorICBmaWxlKFJFQUQgIiR7ZmlsZW5hbWV9IiB0ZXN0X3NvdXJjZSkKKworICB0cnlfY29tcGlsZShzdWNjZWVkc193aGVuX2l0X3Nob3VsZF9mYWlsCisgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iCisgICAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtmaWxlbmFtZX0iCisgICAgICAgICAgICAgIENPTVBJTEVfREVGSU5JVElPTlMgIi1ERUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQiKQorICBpZiAoc3VjY2VlZHNfd2hlbl9pdF9zaG91bGRfZmFpbCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiRkFJTEVEOiAke3Rlc3RuYW1lfSBidWlsZCBzdWNjZWVkZWQgd2hlbiBpdCBzaG91bGQgaGF2ZSBmYWlsZWQiKQorICBlbmRpZigpCisKKyAgdHJ5X2NvbXBpbGUoc3VjY2VlZHNfd2hlbl9pdF9zaG91bGRfc3VjY2VlZAorICAgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IgorICAgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7ZmlsZW5hbWV9IgorICAgICAgICAgICAgICBDT01QSUxFX0RFRklOSVRJT05TKQorICBpZiAoTk9UIHN1Y2NlZWRzX3doZW5faXRfc2hvdWxkX3N1Y2NlZWQpCisgICAgbWVzc2FnZShTVEFUVVMgIkZBSUxFRDogJHt0ZXN0bmFtZX0gYnVpbGQgZmFpbGVkIHdoZW4gaXQgc2hvdWxkIGhhdmUgc3VjY2VlZGVkIikKKyAgZW5kaWYoKQorCisgIGlmIChzdWNjZWVkc193aGVuX2l0X3Nob3VsZF9mYWlsIE9SIE5PVCBzdWNjZWVkc193aGVuX2l0X3Nob3VsZF9zdWNjZWVkKQorICAgIG1hdGgoRVhQUiBFSUdFTl9GQUlMVEVTVF9GQUlMVVJFX0NPVU5UICR7RUlHRU5fRkFJTFRFU1RfRkFJTFVSRV9DT1VOVH0rMSkKKyAgZW5kaWYoKQorCisgIG1hdGgoRVhQUiBFSUdFTl9GQUlMVEVTVF9DT1VOVCAke0VJR0VOX0ZBSUxURVNUX0NPVU5UfSsxKQorCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fRkFJTFRFU1RfRkFJTFVSRV9DT1VOVCAke0VJR0VOX0ZBSUxURVNUX0ZBSUxVUkVfQ09VTlR9KQorICBzZXRfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIEVJR0VOX0ZBSUxURVNUX0NPVU5UICR7RUlHRU5fRkFJTFRFU1RfQ09VTlR9KQorZW5kbWFjcm8oZWlfYWRkX2ZhaWx0ZXN0KQorCisjIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgZGlmZmVyZW50IG9wdGlvbnMKK21hY3JvKGVpX3Rlc3RpbmdfcHJpbnRfc3VtbWFyeSkKKyAgbWVzc2FnZShTVEFUVVMgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpCisgIG1lc3NhZ2UoU1RBVFVTICIqKiogICAgRWlnZW4ncyB1bml0IHRlc3RzIGNvbmZpZ3VyYXRpb24gc3VtbWFyeSAgICAgICAgICAqKioiKQorICBtZXNzYWdlKFNUQVRVUyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIikKKyAgbWVzc2FnZShTVEFUVVMgIiIpCisgIG1lc3NhZ2UoU1RBVFVTICJCdWlsZCB0eXBlOiAgICAgICAgJHtDTUFLRV9CVUlMRF9UWVBFfSIpCisgIG1lc3NhZ2UoU1RBVFVTICJCdWlsZCBzaXRlOiAgICAgICAgJHtTSVRFfSIpCisgIG1lc3NhZ2UoU1RBVFVTICJCdWlsZCBzdHJpbmc6ICAgICAgJHtCVUlMRE5BTUV9IikKKyAgZ2V0X3Byb3BlcnR5KEVJR0VOX1RFU1RJTkdfU1VNTUFSWSBHTE9CQUwgUFJPUEVSVFkgRUlHRU5fVEVTVElOR19TVU1NQVJZKQorICBnZXRfcHJvcGVydHkoRUlHRU5fVEVTVEVEX0JBQ0tFTkRTIEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9URVNURURfQkFDS0VORFMpCisgIGdldF9wcm9wZXJ0eShFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTIEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTKQorICBtZXNzYWdlKFNUQVRVUyAiRW5hYmxlZCBiYWNrZW5kczogICR7RUlHRU5fVEVTVEVEX0JBQ0tFTkRTfSIpCisgIG1lc3NhZ2UoU1RBVFVTICJEaXNhYmxlZCBiYWNrZW5kczogJHtFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTfSIpCisKKyAgaWYoRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IpCisgICAgbWVzc2FnZShTVEFUVVMgIkRlZmF1bHQgb3JkZXI6ICAgICBSb3ctbWFqb3IiKQorICBlbHNlKCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiRGVmYXVsdCBvcmRlcjogICAgIENvbHVtbi1tYWpvciIpCisgIGVuZGlmKCkKKworICBpZihFSUdFTl9URVNUX05PX0VYUExJQ0lUX0FMSUdOTUVOVCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiRXhwbGljaXQgYWxpZ25tZW50IChoZW5jZSB2ZWN0b3JpemF0aW9uKSBkaXNhYmxlZCIpCisgIGVsc2VpZihFSUdFTl9URVNUX05PX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04pCisgICAgbWVzc2FnZShTVEFUVVMgIkV4cGxpY2l0IHZlY3Rvcml6YXRpb24gZGlzYWJsZWQgKGFsaWdubWVudCBrZXB0IGVuYWJsZWQpIikKKyAgZWxzZSgpCisgIAorICBtZXNzYWdlKFNUQVRVUyAiTWF4aW1hbCBtYXRyaXgvdmVjdG9yIHNpemU6ICR7RUlHRU5fVEVTVF9NQVhfU0laRX0iKQorCisgICAgaWYoRUlHRU5fVEVTVF9TU0UyKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlNTRTI6ICAgICAgICAgICAgICBPTiIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiU1NFMjogICAgICAgICAgICAgIFVzaW5nIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyIpCisgICAgZW5kaWYoKQorCisgICAgaWYoRUlHRU5fVEVTVF9TU0UzKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlNTRTM6ICAgICAgICAgICAgICBPTiIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiU1NFMzogICAgICAgICAgICAgIFVzaW5nIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyIpCisgICAgZW5kaWYoKQorCisgICAgaWYoRUlHRU5fVEVTVF9TU1NFMykKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJTU1NFMzogICAgICAgICAgICAgT04iKQorICAgIGVsc2UoKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlNTU0UzOiAgICAgICAgICAgICBVc2luZyBhcmNoaXRlY3R1cmUgZGVmYXVsdHMiKQorICAgIGVuZGlmKCkKKworICAgIGlmKEVJR0VOX1RFU1RfU1NFNF8xKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlNTRTQuMTogICAgICAgICAgICBPTiIpCisgICAgZWxzZSgpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiU1NFNC4xOiAgICAgICAgICAgIFVzaW5nIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyIpCisgICAgZW5kaWYoKQorCisgICAgaWYoRUlHRU5fVEVTVF9TU0U0XzIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiU1NFNC4yOiAgICAgICAgICAgIE9OIikKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJTU0U0LjI6ICAgICAgICAgICAgVXNpbmcgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIikKKyAgICBlbmRpZigpCisKKyAgICBpZihFSUdFTl9URVNUX0FMVElWRUMpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQWx0aXZlYzogICAgICAgICAgIE9OIikKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJBbHRpdmVjOiAgICAgICAgICAgVXNpbmcgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIikKKyAgICBlbmRpZigpCisKKyAgICBpZihFSUdFTl9URVNUX05FT04pCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQVJNIE5FT046ICAgICAgICAgIE9OIikKKyAgICBlbHNlKCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJBUk0gTkVPTjogICAgICAgICAgVXNpbmcgYXJjaGl0ZWN0dXJlIGRlZmF1bHRzIikKKyAgICBlbmRpZigpCisKKyAgZW5kaWYoKSAjIHZlY3Rvcml6YXRpb24gLyBhbGlnbm1lbnQgb3B0aW9ucworCisgIG1lc3NhZ2UoU1RBVFVTICJcbiR7RUlHRU5fVEVTVElOR19TVU1NQVJZfSIpCisKKyAgbWVzc2FnZShTVEFUVVMgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpCitlbmRtYWNybyhlaV90ZXN0aW5nX3ByaW50X3N1bW1hcnkpCisKK21hY3JvKGVpX2luaXRfdGVzdGluZykKKyAgZGVmaW5lX3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9URVNURURfQkFDS0VORFMgQlJJRUZfRE9DUyAiICIgRlVMTF9ET0NTICIgIikKKyAgZGVmaW5lX3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTIEJSSUVGX0RPQ1MgIiAiIEZVTExfRE9DUyAiICIpCisgIGRlZmluZV9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fVEVTVElOR19TVU1NQVJZIEJSSUVGX0RPQ1MgIiAiIEZVTExfRE9DUyAiICIpCisgIGRlZmluZV9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fVEVTVFNfTElTVCBCUklFRl9ET0NTICIgIiBGVUxMX0RPQ1MgIiAiKQorCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fVEVTVEVEX0JBQ0tFTkRTICIiKQorICBzZXRfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIEVJR0VOX01JU1NJTkdfQkFDS0VORFMgIiIpCisgIHNldF9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fVEVTVElOR19TVU1NQVJZICIiKQorICBzZXRfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIEVJR0VOX1RFU1RTX0xJU1QgIiIpCisKKyAgZGVmaW5lX3Byb3BlcnR5KEdMT0JBTCBQUk9QRVJUWSBFSUdFTl9GQUlMVEVTVF9GQUlMVVJFX0NPVU5UIEJSSUVGX0RPQ1MgIiAiIEZVTExfRE9DUyAiICIpCisgIGRlZmluZV9wcm9wZXJ0eShHTE9CQUwgUFJPUEVSVFkgRUlHRU5fRkFJTFRFU1RfQ09VTlQgQlJJRUZfRE9DUyAiICIgRlVMTF9ET0NTICIgIikKKworICBzZXRfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIEVJR0VOX0ZBSUxURVNUX0ZBSUxVUkVfQ09VTlQgIjAiKQorICBzZXRfcHJvcGVydHkoR0xPQkFMIFBST1BFUlRZIEVJR0VOX0ZBSUxURVNUX0NPVU5UICIwIikKKyAgCisgICMgdW5jb21tZW50IGFueXRpbWUgeW91IGNoYW5nZSB0aGUgZWlfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nIG1hY3JvCisgICMgZWlfdGVzdF9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoKQorZW5kbWFjcm8oZWlfaW5pdF90ZXN0aW5nKQorCittYWNybyhlaV9zZXRfc2l0ZW5hbWUpCisgICMgaWYgdGhlIHNpdGVuYW1lIGlzIG5vdCB5ZXQgc2V0LCB0cnkgdG8gc2V0IGl0CisgIGlmKE5PVCAke1NJVEV9IE9SICR7U0lURX0gU1RSRVFVQUwgIiIpCisgICAgc2V0KGVpZ2VuX2NvbXB1dGVybmFtZSAkRU5We0NPTVBVVEVSTkFNRX0pCisJc2V0KGVpZ2VuX2hvc3RuYW1lICRFTlZ7SE9TVE5BTUV9KQorICAgIGlmKGVpZ2VuX2hvc3RuYW1lKQorICAgICAgc2V0KFNJVEUgJHtlaWdlbl9ob3N0bmFtZX0pCisJZWxzZWlmKGVpZ2VuX2NvbXB1dGVybmFtZSkKKwkgIHNldChTSVRFICR7ZWlnZW5fY29tcHV0ZXJuYW1lfSkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgIyBpbiBjYXNlIGl0IGlzIGFscmVhZHkgc2V0LCBlbmZvcmNlIGxvd2VyIGNhc2UKKyAgaWYoU0lURSkKKyAgICBzdHJpbmcoVE9MT1dFUiAke1NJVEV9IFNJVEUpCisgIGVuZGlmKCkgIAorZW5kbWFjcm8oZWlfc2V0X3NpdGVuYW1lKQorCittYWNybyhlaV9nZXRfY29tcGlsZXJ2ZXIgVkFSKQorICBpZihNU1ZDKQorICAgICMgb24gd2luZG93cyBzeXN0ZW0sIHdlIHVzZSBhIG1vZGlmaWVkIENNYWtlIHNjcmlwdCAgCisgICAgaW5jbHVkZShDTWFrZURldGVybWluZVZTU2VydmljZVBhY2spCisgICAgRGV0ZXJtaW5lVlNTZXJ2aWNlUGFjayggbXlfc2VydmljZV9wYWNrICkKKworICAgIGlmKCBteV9zZXJ2aWNlX3BhY2sgKQorICAgICAgc2V0KCR7VkFSfSAke215X3NlcnZpY2VfcGFja30pCisgICAgZWxzZSgpCisgICAgICBzZXQoJHtWQVJ9ICJuYSIpCisgICAgZW5kaWYoKQorICBlbHNlKCkKKyAgICAjIG9uIGFsbCBvdGhlciBzeXN0ZW0gd2UgcmVseSBvbiAke0NNQUtFX0NYWF9DT01QSUxFUn0KKyAgICAjIHN1cHBvcnRpbmcgYSAiLS12ZXJzaW9uIiBmbGFnICAgIAorICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSAtLXZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgQ09NTUFORCBoZWFkIC1uIDEKKyAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1ZBUklBQkxFIGVpZ2VuX2N4eF9jb21waWxlcl92ZXJzaW9uX3N0cmluZyBPVVRQVVRfU1RSSVBfVFJBSUxJTkdfV0hJVEVTUEFDRSkKKyAgICAKKyAgICBlaV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoJHtlaWdlbl9jeHhfY29tcGlsZXJfdmVyc2lvbl9zdHJpbmd9IENOQU1FIENWRVIpCisgICAgCisgICAgc2V0KCR7VkFSfSAiJHtDTkFNRX0tJHtDVkVSfSIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKGVpX2dldF9jb21waWxlcnZlcikKKworIyBFeHRyYWN0IGNvbXBpbGVyIG5hbWUgYW5kIHZlcnNpb24gZnJvbSBhIHJhdyB2ZXJzaW9uIHN0cmluZworIyBXQVJOSU5HOiBpZiB5b3UgZWRpdCB0aGlkIG1hY3JvLCB0aGVuIHBsZWFzZSB0ZXN0IGl0IGJ5ICB1bmNvbW1lbnRpbmcKKyMgdGhlIHRlc3RpbmcgbWFjcm8gY2FsbCBpbiBlaV9pbml0X3Rlc3RpbmcoKSBvZiB0aGUgRWlnZW5UZXN0aW5nLmNtYWtlIGZpbGUuCisjIFNlZSBhbHNvIHRoZSBlaV90ZXN0X2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZyBtYWNybyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCittYWNybyhlaV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcgVkVSU1RSSU5HIENOQU1FIENWRVIpCisgICMgZXh0cmFjdCBwb3NzaWJsZSBjb21waWxlciBuYW1lcyAgCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiZ1xcK1xcKyIgICAgICBlaV9oYXNfZ3BwICAgICR7VkVSU1RSSU5HfSkKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJsbHZtfExMVk0iICAgIGVpX2hhc19sbHZtICAgJHtWRVJTVFJJTkd9KQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImdjY3xHQ0MiICAgICAgZWlfaGFzX2djYyAgICAke1ZFUlNUUklOR30pCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiaWNwY3xJQ0MiICAgICBlaV9oYXNfaWNwYyAgICR7VkVSU1RSSU5HfSkKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJjbGFuZ3xDTEFORyIgIGVpX2hhc19jbGFuZyAgJHtWRVJTVFJJTkd9KQorICAKKyAgIyBjb21iaW5lIHRoZW0KKyAgaWYoKGVpX2hhc19sbHZtKSBBTkQgKGVpX2hhc19ncHAgT1IgZWlfaGFzX2djYykpCisgICAgc2V0KCR7Q05BTUV9ICJsbHZtLWcrKyIpCisgIGVsc2VpZigoZWlfaGFzX2xsdm0pIEFORCAoZWlfaGFzX2NsYW5nKSkKKyAgICBzZXQoJHtDTkFNRX0gImxsdm0tY2xhbmcrKyIpCisgIGVsc2VpZihlaV9oYXNfaWNwYykKKyAgICBzZXQoJHtDTkFNRX0gImljcGMiKQorICBlbHNlaWYoZWlfaGFzX2dwcCBPUiBlaV9oYXNfZ2NjKQorICAgIHNldCgke0NOQU1FfSAiZysrIikKKyAgZWxzZSgpCisgICAgc2V0KCR7Q05BTUV9ICJfIikKKyAgZW5kaWYoKQorICAKKyAgIyBleHRyYWN0IHBvc3NpYmxlIHZlcnNpb24gbnVtYmVycworICAjIGZpcnN0IHRyeSB0byBleHRyYWN0IDMgaXNvbGF0ZWQgbnVtYmVyczoKKyAgc3RyaW5nKFJFR0VYIE1BVENIICIgWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rIiBlaWN2ZXIgJHtWRVJTVFJJTkd9KQorICBpZihOT1QgZWljdmVyKQorICAgICMgdHJ5IHRvIGV4dHJhY3QgMiBpc29sYXRlZCBvbmVzOgorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiIFswLTldK1xcLlswLTldKyIgZWljdmVyICR7VkVSU1RSSU5HfSkKKyAgICBpZihOT1QgZWljdmVyKQorICAgICAgIyB0cnkgdG8gZXh0cmFjdCAzOgorICAgICAgc3RyaW5nKFJFR0VYIE1BVENIICJbXjAtOV1bMC05XStcXC5bMC05XStcXC5bMC05XSsiIGVpY3ZlciAke1ZFUlNUUklOR30pCisgICAgICBpZihOT1QgZWljdmVyKQorICAgICAgICAjIHRyeSB0byBleHRyYWN0IDI6CisgICAgICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiW14wLTldWzAtOV0rXFwuWzAtOV0rIiBlaWN2ZXIgJHtWRVJTVFJJTkd9KQorICAgICAgZWxzZSgpCisgICAgICAgIHNldChlaWN2ZXIgIiBfIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKyAgCisgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIuKC4qKSIgIlxcMSIgJHtDVkVSfSAke2VpY3Zlcn0pCisgIAorZW5kbWFjcm8oZWlfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKQorCittYWNybyhlaV9nZXRfY3h4ZmxhZ3MgVkFSKQorICBzZXQoJHtWQVJ9ICIiKQorICBlaV9pc182NGJpdF9lbnYoSVNfNjRCSVRfRU5WKQorICBpZihFSUdFTl9URVNUX05FT04pCisgICAgc2V0KCR7VkFSfSBORU9OKQorICBlbHNlaWYoRUlHRU5fVEVTVF9BTFRJVkVDKQorICAgIHNldCgke1ZBUn0gQUxWRUMpCisgIGVsc2VpZihFSUdFTl9URVNUX1NTRTRfMikKKyAgICBzZXQoJHtWQVJ9IFNTRTQyKQorICBlbHNlaWYoRUlHRU5fVEVTVF9TU0U0XzEpCisgICAgc2V0KCR7VkFSfSBTU0U0MSkKKyAgZWxzZWlmKEVJR0VOX1RFU1RfU1NTRTMpCisgICAgc2V0KCR7VkFSfSBTU1NFMykKKyAgZWxzZWlmKEVJR0VOX1RFU1RfU1NFMykKKyAgICBzZXQoJHtWQVJ9IFNTRTMpCisgIGVsc2VpZihFSUdFTl9URVNUX1NTRTIgT1IgSVNfNjRCSVRfRU5WKQorICAgIHNldCgke1ZBUn0gU1NFMikgIAorICBlbmRpZigpCisKKyAgaWYoRUlHRU5fVEVTVF9PUEVOTVApCisgICAgaWYgKCR7VkFSfSBTVFJFUVVBTCAiIikKKwkgIHNldCgke1ZBUn0gT01QKQorCWVsc2UoKQorCSAgc2V0KCR7VkFSfSAkeyR7VkFSfX0tT01QKQorCWVuZGlmKCkKKyAgZW5kaWYoKQorICAKKyAgaWYoRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IpCisgICAgaWYgKCR7VkFSfSBTVFJFUVVBTCAiIikKKwkgIHNldCgke1ZBUn0gUk9XKQorCWVsc2UoKQorCSAgc2V0KCR7VkFSfSAkeyR7VkFSfX0tUk9XTUFKKQorCWVuZGlmKCkgIAorICBlbmRpZigpCitlbmRtYWNybyhlaV9nZXRfY3h4ZmxhZ3MpCisKK21hY3JvKGVpX3NldF9idWlsZF9zdHJpbmcpCisgIGVpX2dldF9jb21waWxlcnZlcihMT0NBTF9DT01QSUxFUl9WRVJTSU9OKQorICBlaV9nZXRfY3h4ZmxhZ3MoTE9DQUxfQ09NUElMRVJfRkxBR1MpCisgIAorICBpbmNsdWRlKEVpZ2VuRGV0ZXJtaW5lT1NWZXJzaW9uKQorICBEZXRlcm1pbmVPU1ZlcnNpb24oT1NfVkVSU0lPTikKKworICBzZXQoVE1QX0JVSUxEX1NUUklORyAke09TX1ZFUlNJT059LSR7TE9DQUxfQ09NUElMRVJfVkVSU0lPTn0pCisKKyAgaWYgKE5PVCAke0xPQ0FMX0NPTVBJTEVSX0ZMQUdTfSBTVFJFUVVBTCAgIiIpCisgICAgc2V0KFRNUF9CVUlMRF9TVFJJTkcgJHtUTVBfQlVJTERfU1RSSU5HfS0ke0xPQ0FMX0NPTVBJTEVSX0ZMQUdTfSkKKyAgZW5kaWYoKQorCisgIGVpX2lzXzY0Yml0X2VudihJU182NEJJVF9FTlYpCisgIGlmKE5PVCBJU182NEJJVF9FTlYpCisgICAgc2V0KFRNUF9CVUlMRF9TVFJJTkcgJHtUTVBfQlVJTERfU1RSSU5HfS0zMmJpdCkKKyAgZWxzZSgpCisgICAgc2V0KFRNUF9CVUlMRF9TVFJJTkcgJHtUTVBfQlVJTERfU1RSSU5HfS02NGJpdCkKKyAgZW5kaWYoKQorCisgIHN0cmluZyhUT0xPV0VSICR7VE1QX0JVSUxEX1NUUklOR30gQlVJTEROQU1FKQorZW5kbWFjcm8oZWlfc2V0X2J1aWxkX3N0cmluZykKKworbWFjcm8oZWlfaXNfNjRiaXRfZW52IFZBUikKKworICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaXM2NC5jcHAiCisgICAgICAiaW50IG1haW4oKSB7IHJldHVybiAoc2l6ZW9mKGludCopID09IDggPyAxIDogMCk7IH0KKyAgICAgICIpCisgIHRyeV9ydW4ocnVuX3JlcyBjb21waWxlX3JlcworICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9ICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaXM2NC5jcHAiCisgICAgICAgICAgUlVOX09VVFBVVF9WQVJJQUJMRSBydW5fb3V0cHV0KQorCisgIGlmKGNvbXBpbGVfcmVzIEFORCBydW5fcmVzKQorICAgIHNldCgke1ZBUn0gJHtydW5fcmVzfSkKKyAgZWxzZWlmKENNQUtFX0NMXzY0KQorICAgIHNldCgke1ZBUn0gMSkKKyAgZWxzZWlmKCIkRU5We1BsYXRmb3JtfSIgU1RSRVFVQUwgIlg2NCIpICMgbm1ha2UgNjQgYml0CisgICAgc2V0KCR7VkFSfSAxKQorICBlbmRpZigpCitlbmRtYWNybyhlaV9pc182NGJpdF9lbnYpCisKKworIyBoZWxwZXIgbWFjcm8gZm9yIHRlc3RpbmcgZWlfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nCisjIFNUUjogcmF3IHZlcnNpb24gc3RyaW5nCisjIFJFRk5BTUU6IGV4cGVjdGVkIGNvbXBpbGVyIG5hbWUKKyMgUkVGVkVSOiBleHBlY3RlZCBjb21waWxlciB2ZXJzaW9uCittYWNybyhlaV90ZXN0MV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcgU1RSIFJFRk5BTUUgUkVGVkVSKQorICBlaV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoJHtTVFJ9IENOQU1FIENWRVIpCisgIGlmKChOT1QgJHtSRUZOQU1FfSBTVFJFUVVBTCAke0NOQU1FfSkgT1IgKE5PVCAke1JFRlZFUn0gU1RSRVFVQUwgJHtDVkVSfSkpCisgICAgbWVzc2FnZSgiU1RBVFVTIGVpX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZyBlcnJvcjoiKQorICAgIG1lc3NhZ2UoIkV4cGVjdGVkIFwiJHtSRUZOQU1FfS0ke1JFRlZFUn1cIiwgZ290IFwiJHtDTkFNRX0tJHtDVkVSfVwiIikKKyAgZW5kaWYoKQorZW5kbWFjcm8oZWlfdGVzdDFfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKQorCisjIG1hY3JvIGZvciB0ZXN0aW5nIGVpX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZworIyBmZWVsIGZyZWUgdG8gYWRkIG1vcmUgdmVyc2lvbiBzdHJpbmdzCittYWNybyhlaV90ZXN0X2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZykKKyAgZWlfdGVzdDFfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKCJnKysgKFNVU0UgTGludXgpIDQuNS4zIDIwMTEwNDI4IFtnY2MtNF81LWJyYW5jaCByZXZpc2lvbiAxNzMxMTddIiAiZysrIiAiNC41LjMiKQorICBlaV90ZXN0MV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoImMrKyAoR0NDKSA0LjUuMSAyMDEwMDkyNCAoUmVkIEhhdCA0LjUuMS00KSIgImcrKyIgIjQuNS4xIikKKyAgZWlfdGVzdDFfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKCJpY3BjIChJQ0MpIDExLjAgMjAwODExMDUiICJpY3BjIiAiMTEuMCIpCisgIGVpX3Rlc3QxX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZygiZysrLTMuNCAoR0NDKSAzLjQuNiIgImcrKyIgIjMuNC42IikKKyAgZWlfdGVzdDFfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKCJTVVNFIExpbnV4IGNsYW5nIHZlcnNpb24gMy4wIChicmFuY2hlcy9yZWxlYXNlXzMwIDE0NTU5OCkgKGJhc2VkIG9uIExMVk0gMy4wKSIgImxsdm0tY2xhbmcrKyIgIjMuMCIpCisgIGVpX3Rlc3QxX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZygiaWNwYyAoSUNDKSAxMi4wLjUgMjAxMTA3MTkiICJpY3BjIiAiMTIuMC41IikKKyAgZWlfdGVzdDFfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKCJBcHBsZSBjbGFuZyB2ZXJzaW9uIDIuMSAodGFncy9BcHBsZS9jbGFuZy0xNjMuNy4xKSAoYmFzZWQgb24gTExWTSAzLjBzdm4pIiAibGx2bS1jbGFuZysrIiAiMi4xIikKKyAgZWlfdGVzdDFfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKCJpNjg2LWFwcGxlLWRhcndpbjExLWxsdm0tZysrLTQuMiAoR0NDKSA0LjIuMSAoQmFzZWQgb24gQXBwbGUgSW5jLiBidWlsZCA1NjU4KSAoTExWTSBidWlsZCAyMzM1LjE1LjAwKSIgImxsdm0tZysrIiAiNC4yLjEiKQorICBlaV90ZXN0MV9nZXRfY29tcGlsZXJ2ZXJfZnJvbV9jeHhfdmVyc2lvbl9zdHJpbmcoImcrKy1tcC00LjQgKEdDQykgNC40LjYiICJnKysiICI0LjQuNiIpCisgIGVpX3Rlc3QxX2dldF9jb21waWxlcnZlcl9mcm9tX2N4eF92ZXJzaW9uX3N0cmluZygiZysrLW1wLTQuNCAoR0NDKSAyMDExIiAiZysrIiAiNC40IikKK2VuZG1hY3JvKGVpX3Rlc3RfZ2V0X2NvbXBpbGVydmVyX2Zyb21fY3h4X3ZlcnNpb25fc3RyaW5nKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZEFkb2xjLmNtYWtlIGIvY21ha2UvRmluZEFkb2xjLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhN2ZmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kQWRvbGMuY21ha2UKQEAgLTAsMCArMSwyMCBAQAorCitpZiAoQURPTENfSU5DTFVERVMgQU5EIEFET0xDX0xJQlJBUklFUykKKyAgc2V0KEFET0xDX0ZJTkRfUVVJRVRMWSBUUlVFKQorZW5kaWYgKEFET0xDX0lOQ0xVREVTIEFORCBBRE9MQ19MSUJSQVJJRVMpCisKK2ZpbmRfcGF0aChBRE9MQ19JTkNMVURFUworICBOQU1FUworICBhZG9sYy9hZG91YmxlLmgKKyAgUEFUSFMKKyAgJEVOVntBRE9MQ0RJUn0KKyAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorKQorCitmaW5kX2xpYnJhcnkoQURPTENfTElCUkFSSUVTIGFkb2xjIFBBVEhTICRFTlZ7QURPTENESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhBRE9MQyBERUZBVUxUX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFET0xDX0lOQ0xVREVTIEFET0xDX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChBRE9MQ19JTkNMVURFUyBBRE9MQ19MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9jbWFrZS9GaW5kQkxBUy5jbWFrZSBiL2NtYWtlL0ZpbmRCTEFTLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YzRlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kQkxBUy5jbWFrZQpAQCAtMCwwICsxLDQxOSBAQAorIyBGaW5kIEJMQVMgbGlicmFyeQorIworIyBUaGlzIG1vZHVsZSBmaW5kcyBhbiBpbnN0YWxsZWQgbGlicmFyeSB0aGF0IGltcGxlbWVudHMgdGhlIEJMQVMKKyMgbGluZWFyLWFsZ2VicmEgaW50ZXJmYWNlIChzZWUgaHR0cDovL3d3dy5uZXRsaWIub3JnL2JsYXMvKS4KKyMgVGhlIGxpc3Qgb2YgbGlicmFyaWVzIHNlYXJjaGVkIGZvciBpcyBtYWlubHkgdGFrZW4KKyMgZnJvbSB0aGUgYXV0b2NvbmYgbWFjcm8gZmlsZSwgYWN4X2JsYXMubTQgKGRpc3RyaWJ1dGVkIGF0CisjIGh0dHA6Ly9hYy1hcmNoaXZlLnNvdXJjZWZvcmdlLm5ldC9hYy1hcmNoaXZlL2FjeF9ibGFzLmh0bWwpLgorIworIyBUaGlzIG1vZHVsZSBzZXRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorIyAgQkxBU19GT1VORCAtIHNldCB0byB0cnVlIGlmIGEgbGlicmFyeSBpbXBsZW1lbnRpbmcgdGhlIEJMQVMgaW50ZXJmYWNlCisjICAgIGlzIGZvdW5kCisjICBCTEFTX0lOQ0xVREVfRElSIC0gRGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgQkxBUyBoZWFkZXIgZmlsZXMKKyMgIEJMQVNfREVGSU5JVElPTlMgLSBDb21waWxhdGlvbiBvcHRpb25zIHRvIHVzZSBCTEFTCisjICBCTEFTX0xJTktFUl9GTEFHUyAtIExpbmtlciBmbGFncyB0byB1c2UgQkxBUyAoZXhjbHVkaW5nIC1sCisjICAgIGFuZCAtTCkuCisjICBCTEFTX0xJQlJBUklFU19ESVIgLSBEaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBCTEFTIGxpYnJhcmllcy4KKyMgICAgIE1heSBiZSBudWxsIGlmIEJMQVNfTElCUkFSSUVTIGNvbnRhaW5zIGxpYnJhcmllcyBuYW1lIHVzaW5nIGZ1bGwgcGF0aC4KKyMgIEJMQVNfTElCUkFSSUVTIC0gTGlzdCBvZiBsaWJyYXJpZXMgdG8gbGluayBhZ2FpbnN0IEJMQVMgaW50ZXJmYWNlLgorIyAgICAgTWF5IGJlIG51bGwgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGF1dG8tbGluayAoZS5nLiBWQysrKS4KKyMgIEJMQVNfVVNFX0ZJTEUgLSBUaGUgbmFtZSBvZiB0aGUgY21ha2UgbW9kdWxlIHRvIGluY2x1ZGUgdG8gY29tcGlsZQorIyAgICAgYXBwbGljYXRpb25zIG9yIGxpYnJhcmllcyB1c2luZyBCTEFTLgorIworIyBUaGlzIG1vZHVsZSB3YXMgbW9kaWZpZWQgYnkgQ0dBTCB0ZWFtOgorIyAtIGZpbmQgbGlicmFyaWVzIGZvciBhIEMrKyBjb21waWxlciwgaW5zdGVhZCBvZiBGb3J0cmFuCisjIC0gYWRkZWQgQkxBU19JTkNMVURFX0RJUiwgQkxBU19ERUZJTklUSU9OUyBhbmQgQkxBU19MSUJSQVJJRVNfRElSCisjIC0gcmVtb3ZlZCBCTEFTOTVfTElCUkFSSUVTCisKK2luY2x1ZGUoQ2hlY2tGdW5jdGlvbkV4aXN0cykKKworCisjIFRoaXMgbWFjcm8gY2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBjb21iaW5hdGlvbiBvZiBmb3J0cmFuIGxpYnJhcmllcworIyBnaXZlbiBieSBfbGlzdC4gIElmIHRoZSBjb21iaW5hdGlvbiBpcyBmb3VuZCwgdGhpcyBtYWNybyBjaGVja3MgKHVzaW5nIHRoZQorIyBjaGVja19mdW5jdGlvbl9leGlzdHMgbWFjcm8pIHdoZXRoZXIgY2FuIGxpbmsgYWdhaW5zdCB0aGF0IGxpYnJhcnkKKyMgY29tYmluYXRpb24gdXNpbmcgdGhlIG5hbWUgb2YgYSByb3V0aW5lIGdpdmVuIGJ5IF9uYW1lIHVzaW5nIHRoZSBsaW5rZXIKKyMgZmxhZ3MgZ2l2ZW4gYnkgX2ZsYWdzLiAgSWYgdGhlIGNvbWJpbmF0aW9uIG9mIGxpYnJhcmllcyBpcyBmb3VuZCBhbmQgcGFzc2VzCisjIHRoZSBsaW5rIHRlc3QsIExJQlJBUklFUyBpcyBzZXQgdG8gdGhlIGxpc3Qgb2YgY29tcGxldGUgbGlicmFyeSBwYXRocyB0aGF0CisjIGhhdmUgYmVlbiBmb3VuZCBhbmQgREVGSU5JVElPTlMgdG8gdGhlIHJlcXVpcmVkIGRlZmluaXRpb25zLgorIyBPdGhlcndpc2UsIExJQlJBUklFUyBpcyBzZXQgdG8gRkFMU0UuCisjIE4uQi4gX3ByZWZpeCBpcyB0aGUgcHJlZml4IGFwcGxpZWQgdG8gdGhlIG5hbWVzIG9mIGFsbCBjYWNoZWQgdmFyaWFibGVzIHRoYXQKKyMgYXJlIGdlbmVyYXRlZCBpbnRlcm5hbGx5IGFuZCBtYXJrZWQgYWR2YW5jZWQgYnkgdGhpcyBtYWNyby4KK21hY3JvKGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzIERFRklOSVRJT05TIExJQlJBUklFUyBfcHJlZml4IF9uYW1lIF9mbGFncyBfbGlzdCBfcGF0aCkKKyAgI21lc3NhZ2UoIkRFQlVHOiBjaGVja19mb3J0cmFuX2xpYnJhcmllcygke19saXN0fSBpbiAke19wYXRofSkiKQorCisgICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGxpYnJhcmllcyBnaXZlbiBieSBfbGlzdAorICBzZXQoX2xpYnJhcmllc19mb3VuZCBUUlVFKQorICBzZXQoX2xpYnJhcmllc193b3JrIEZBTFNFKQorICBzZXQoJHtERUZJTklUSU9OU30gIiIpCisgIHNldCgke0xJQlJBUklFU30gIiIpCisgIHNldChfY29tYmluZWRfbmFtZSkKKyAgZm9yZWFjaChfbGlicmFyeSAke19saXN0fSkKKyAgICBzZXQoX2NvbWJpbmVkX25hbWUgJHtfY29tYmluZWRfbmFtZX1fJHtfbGlicmFyeX0pCisKKyAgICBpZihfbGlicmFyaWVzX2ZvdW5kKQorICAgICAgIyBzZWFyY2ggZmlyc3QgaW4gJHtfcGF0aH0KKyAgICAgIGZpbmRfbGlicmFyeSgke19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUlkKKyAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICBQQVRIUyAke19wYXRofSBOT19ERUZBVUxUX1BBVEgKKyAgICAgICAgICAgICAgICAgICkKKyAgICAgICMgaWYgbm90IGZvdW5kLCBzZWFyY2ggaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzeXN0ZW0KKyAgICAgIGlmICggV0lOMzIgKQorICAgICAgICBmaW5kX2xpYnJhcnkoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZCisgICAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICAgIFBBVEhTIEVOViBMSUIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgZWxzZWlmICggQVBQTEUgKQorICAgICAgICBmaW5kX2xpYnJhcnkoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZCisgICAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICAgIFBBVEhTIC91c3IvbG9jYWwvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliNjQgL3Vzci9saWI2NCBFTlYgRFlMRF9MSUJSQVJZX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgZWxzZSAoKQorICAgICAgICBmaW5kX2xpYnJhcnkoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZCisgICAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICAgIFBBVEhTIC91c3IvbG9jYWwvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliNjQgL3Vzci9saWI2NCBFTlYgTERfTElCUkFSWV9QQVRICisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgIGVuZGlmKCkKKyAgICAgIG1hcmtfYXNfYWR2YW5jZWQoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZKQorICAgICAgc2V0KCR7TElCUkFSSUVTfSAkeyR7TElCUkFSSUVTfX0gJHske19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUll9KQorICAgICAgc2V0KF9saWJyYXJpZXNfZm91bmQgJHske19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUll9KQorICAgIGVuZGlmKF9saWJyYXJpZXNfZm91bmQpCisgIGVuZGZvcmVhY2goX2xpYnJhcnkgJHtfbGlzdH0pCisgIGlmKF9saWJyYXJpZXNfZm91bmQpCisgICAgc2V0KF9saWJyYXJpZXNfZm91bmQgJHske0xJQlJBUklFU319KQorICBlbmRpZigpCisKKyAgIyBUZXN0IHRoaXMgY29tYmluYXRpb24gb2YgbGlicmFyaWVzIHdpdGggdGhlIEZvcnRyYW4vZjJjIGludGVyZmFjZS4KKyAgIyBXZSB0ZXN0IHRoZSBGb3J0cmFuIGludGVyZmFjZSBmaXJzdCBhcyBpdCBpcyB3ZWxsIHN0YW5kYXJkaXplZC4KKyAgaWYoX2xpYnJhcmllc19mb3VuZCBBTkQgTk9UIF9saWJyYXJpZXNfd29yaykKKyAgICBzZXQoJHtERUZJTklUSU9OU30gICItRCR7X3ByZWZpeH1fVVNFX0YyQyIpCisgICAgc2V0KCR7TElCUkFSSUVTfSAgICAke19saWJyYXJpZXNfZm91bmR9KQorICAgICMgU29tZSBDKysgbGlua2VycyByZXF1aXJlIHRoZSBmMmMgbGlicmFyeSB0byBsaW5rIHdpdGggRm9ydHJhbiBsaWJyYXJpZXMuCisgICAgIyBJIGRvIG5vdCBrbm93IHdoaWNoIG9uZXMsIHRodXMgSSBqdXN0IGFkZCB0aGUgZjJjIGxpYnJhcnkgaWYgaXQgaXMgYXZhaWxhYmxlLgorICAgIGZpbmRfcGFja2FnZSggRjJDIFFVSUVUICkKKyAgICBpZiAoIEYyQ19GT1VORCApCisgICAgICBzZXQoJHtERUZJTklUSU9OU30gICR7JHtERUZJTklUSU9OU319ICR7RjJDX0RFRklOSVRJT05TfSkKKyAgICAgIHNldCgke0xJQlJBUklFU30gICAgJHske0xJQlJBUklFU319ICR7RjJDX0xJQlJBUklFU30pCisgICAgZW5kaWYoKQorICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAgJHske0RFRklOSVRJT05TfX0pCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAgICAke19mbGFnc30gJHske0xJQlJBUklFU319KQorICAgICNtZXNzYWdlKCJERUJVRzogQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgPSAke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSIpCisgICAgI21lc3NhZ2UoIkRFQlVHOiBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgPSAke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQorICAgICMgQ2hlY2sgaWYgZnVuY3Rpb24gZXhpc3RzIHdpdGggZjJjIGNhbGxpbmcgY29udmVudGlvbiAoaWUgYSB0cmFpbGluZyB1bmRlcnNjb3JlKQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cygke19uYW1lfV8gJHtfcHJlZml4fV8ke19uYW1lfV8ke19jb21iaW5lZF9uYW1lfV9mMmNfV09SS1MpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSAiIikKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICAgICIiKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoJHtfcHJlZml4fV8ke19uYW1lfV8ke19jb21iaW5lZF9uYW1lfV9mMmNfV09SS1MpCisgICAgc2V0KF9saWJyYXJpZXNfd29yayAkeyR7X3ByZWZpeH1fJHtfbmFtZX1fJHtfY29tYmluZWRfbmFtZX1fZjJjX1dPUktTfSkKKyAgZW5kaWYoX2xpYnJhcmllc19mb3VuZCBBTkQgTk9UIF9saWJyYXJpZXNfd29yaykKKworICAjIElmIG5vdCBmb3VuZCwgdGVzdCB0aGlzIGNvbWJpbmF0aW9uIG9mIGxpYnJhcmllcyB3aXRoIGEgQyBpbnRlcmZhY2UuCisgICMgQSBmZXcgaW1wbGVtZW50YXRpb25zIChpZSBBQ01MKSBwcm92aWRlIGEgQyBpbnRlcmZhY2UuIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHN0YW5kYXJkLgorICBpZihfbGlicmFyaWVzX2ZvdW5kIEFORCBOT1QgX2xpYnJhcmllc193b3JrKQorICAgIHNldCgke0RFRklOSVRJT05TfSAiIikKKyAgICBzZXQoJHtMSUJSQVJJRVN9ICAgJHtfbGlicmFyaWVzX2ZvdW5kfSkKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiIpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAgICR7X2ZsYWdzfSAkeyR7TElCUkFSSUVTfX0pCisgICAgI21lc3NhZ2UoIkRFQlVHOiBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgPSAke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cygke19uYW1lfSAke19wcmVmaXh9XyR7X25hbWV9JHtfY29tYmluZWRfbmFtZX1fV09SS1MpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAiIikKKyAgICBtYXJrX2FzX2FkdmFuY2VkKCR7X3ByZWZpeH1fJHtfbmFtZX0ke19jb21iaW5lZF9uYW1lfV9XT1JLUykKKyAgICBzZXQoX2xpYnJhcmllc193b3JrICR7JHtfcHJlZml4fV8ke19uYW1lfSR7X2NvbWJpbmVkX25hbWV9X1dPUktTfSkKKyAgZW5kaWYoX2xpYnJhcmllc19mb3VuZCBBTkQgTk9UIF9saWJyYXJpZXNfd29yaykKKworICAjIG9uIGZhaWx1cmUKKyAgaWYoTk9UIF9saWJyYXJpZXNfd29yaykKKyAgICBzZXQoJHtERUZJTklUSU9OU30gIiIpCisgICAgc2V0KCR7TElCUkFSSUVTfSAgIEZBTFNFKQorICBlbmRpZigpCisgICNtZXNzYWdlKCJERUJVRzogJHtERUZJTklUSU9OU30gPSAkeyR7REVGSU5JVElPTlN9fSIpCisgICNtZXNzYWdlKCJERUJVRzogJHtMSUJSQVJJRVN9ID0gJHske0xJQlJBUklFU319IikKK2VuZG1hY3JvKGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKQorCisKKyMKKyMgbWFpbgorIworCisjIElzIGl0IGFscmVhZHkgY29uZmlndXJlZD8KK2lmIChCTEFTX0xJQlJBUklFU19ESVIgT1IgQkxBU19MSUJSQVJJRVMpCisKKyAgc2V0KEJMQVNfRk9VTkQgVFJVRSkKKworZWxzZSgpCisKKyAgIyByZXNldCB2YXJpYWJsZXMKKyAgc2V0KCBCTEFTX0lOQ0xVREVfRElSICIiICkKKyAgc2V0KCBCTEFTX0RFRklOSVRJT05TICIiICkKKyAgc2V0KCBCTEFTX0xJTktFUl9GTEFHUyAiIiApCisgIHNldCggQkxBU19MSUJSQVJJRVMgIiIgKQorICBzZXQoIEJMQVNfTElCUkFSSUVTX0RJUiAiIiApCisKKyAgICAjCisgICAgIyBJZiBVbml4LCBzZWFyY2ggZm9yIEJMQVMgZnVuY3Rpb24gaW4gcG9zc2libGUgbGlicmFyaWVzCisgICAgIworCisgICAgIyBCTEFTIGluIEFUTEFTIGxpYnJhcnk/IChodHRwOi8vbWF0aC1hdGxhcy5zb3VyY2Vmb3JnZS5uZXQvKQorICAgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19ERUZJTklUSU9OUworICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgImNibGFzO2Y3N2JsYXM7YXRsYXMiCisgICAgICAiJHtDR0FMX1RBVUNTX0xJQlJBUklFU19ESVJ9IEVOViBCTEFTX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgIyBCTEFTIGluIFBoaVBBQ0sgbGlicmFyaWVzPyAocmVxdWlyZXMgZ2VuZXJpYyBCTEFTIGxpYiwgdG9vKQorICAgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19ERUZJTklUSU9OUworICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgInNnZW1tO2RnZW1tO2JsYXMiCisgICAgICAiJHtDR0FMX1RBVUNTX0xJQlJBUklFU19ESVJ9IEVOViBCTEFTX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgIyBCTEFTIGluIEFscGhhIENYTUwgbGlicmFyeT8KKyAgICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfREVGSU5JVElPTlMKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJjeG1sIgorICAgICAgIiR7Q0dBTF9UQVVDU19MSUJSQVJJRVNfRElSfSBFTlYgQkxBU19MSUJfRElSIgorICAgICAgKQorICAgIGVuZGlmKCkKKworICAgICMgQkxBUyBpbiBBbHBoYSBEWE1MIGxpYnJhcnk/IChub3cgY2FsbGVkIENYTUwsIHNlZSBhYm92ZSkKKyAgICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfREVGSU5JVElPTlMKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJkeG1sIgorICAgICAgIiR7Q0dBTF9UQVVDU19MSUJSQVJJRVNfRElSfSBFTlYgQkxBU19MSUJfRElSIgorICAgICAgKQorICAgIGVuZGlmKCkKKworICAgICMgQkxBUyBpbiBTdW4gUGVyZm9ybWFuY2UgbGlicmFyeT8KKyAgICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfREVGSU5JVElPTlMKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIi14bGljX2xpYj1zdW5wZXJmIgorICAgICAgInN1bnBlcmY7c3VubWF0aCIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIEJMQVNfTElCX0RJUiIKKyAgICAgICkKKyAgICAgIGlmKEJMQVNfTElCUkFSSUVTKQorICAgICAgICAjIEV4dHJhIGxpbmtlciBmbGFnCisgICAgICAgIHNldChCTEFTX0xJTktFUl9GTEFHUyAiLXhsaWNfbGliPXN1bnBlcmYiKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKworICAgICMgQkxBUyBpbiBTQ1NMIGxpYnJhcnk/ICAoU0dJL0NyYXkgU2NpZW50aWZpYyBMaWJyYXJ5KQorICAgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19ERUZJTklUSU9OUworICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgInNjc2wiCisgICAgICAiJHtDR0FMX1RBVUNTX0xJQlJBUklFU19ESVJ9IEVOViBCTEFTX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgIyBCTEFTIGluIFNHSU1BVEggbGlicmFyeT8KKyAgICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfREVGSU5JVElPTlMKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJjb21wbGliLnNnaW1hdGgiCisgICAgICAiJHtDR0FMX1RBVUNTX0xJQlJBUklFU19ESVJ9IEVOViBCTEFTX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgIyBCTEFTIGluIElCTSBFU1NMIGxpYnJhcnk/IChyZXF1aXJlcyBnZW5lcmljIEJMQVMgbGliLCB0b28pCisgICAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisgICAgICBCTEFTX0RFRklOSVRJT05TCisgICAgICBCTEFTX0xJQlJBUklFUworICAgICAgQkxBUworICAgICAgc2dlbW0KKyAgICAgICIiCisgICAgICAiZXNzbDtibGFzIgorICAgICAgIiR7Q0dBTF9UQVVDU19MSUJSQVJJRVNfRElSfSBFTlYgQkxBU19MSUJfRElSIgorICAgICAgKQorICAgIGVuZGlmKCkKKworICAgICNCTEFTIGluIGludGVsIG1rbCAxMCBsaWJyYXJ5PyAoZW02NHQgNjRiaXQpCisgICAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisgICAgICBCTEFTX0RFRklOSVRJT05TCisgICAgICBCTEFTX0xJQlJBUklFUworICAgICAgQkxBUworICAgICAgc2dlbW0KKyAgICAgICIiCisgICAgICAibWtsX2ludGVsX2xwNjQ7bWtsX2ludGVsX3RocmVhZDtta2xfY29yZTtndWlkZTtwdGhyZWFkIgorICAgICAgIiR7Q0dBTF9UQVVDU19MSUJSQVJJRVNfRElSfSBFTlYgQkxBU19MSUJfRElSIgorICAgICAgKQorICAgIGVuZGlmKCkKKworICAgICMjIyB3aW5kb3dzIHZlcnNpb24gb2YgaW50ZWwgbWtsIDEwPworICAgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19ERUZJTklUSU9OUworICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIFNHRU1NCisgICAgICAiIgorICAgICAgIm1rbF9jX2RsbDtta2xfaW50ZWxfdGhyZWFkX2RsbDtta2xfY29yZV9kbGw7bGliZ3VpZGU0MCIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIEJMQVNfTElCX0RJUiIKKyAgICAgICkKKyAgICBlbmRpZigpCisKKyAgICAjb2xkZXIgdmVyc2lvbnMgb2YgaW50ZWwgbWtsIGxpYnMKKworICAgICMgQkxBUyBpbiBpbnRlbCBta2wgbGlicmFyeT8gKHNoYXJlZCkKKyAgICBpZihOT1QgQkxBU19MSUJSQVJJRVMpCisgICAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfREVGSU5JVElPTlMKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJta2w7Z3VpZGU7cHRocmVhZCIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIEJMQVNfTElCX0RJUiIKKyAgICAgICkKKyAgICBlbmRpZigpCisKKyAgICAjQkxBUyBpbiBpbnRlbCBta2wgbGlicmFyeT8gKHN0YXRpYywgMzJiaXQpCisgICAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisgICAgICBCTEFTX0RFRklOSVRJT05TCisgICAgICBCTEFTX0xJQlJBUklFUworICAgICAgQkxBUworICAgICAgc2dlbW0KKyAgICAgICIiCisgICAgICAibWtsX2lhMzI7Z3VpZGU7cHRocmVhZCIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIEJMQVNfTElCX0RJUiIKKyAgICAgICkKKyAgICBlbmRpZigpCisKKyAgICAjQkxBUyBpbiBpbnRlbCBta2wgbGlicmFyeT8gKHN0YXRpYywgZW02NHQgNjRiaXQpCisgICAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisgICAgICBCTEFTX0RFRklOSVRJT05TCisgICAgICBCTEFTX0xJQlJBUklFUworICAgICAgQkxBUworICAgICAgc2dlbW0KKyAgICAgICIiCisgICAgICAibWtsX2VtNjR0O2d1aWRlO3B0aHJlYWQiCisgICAgICAiJHtDR0FMX1RBVUNTX0xJQlJBUklFU19ESVJ9IEVOViBCTEFTX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgI0JMQVMgaW4gYWNtbCBsaWJyYXJ5PworICAgIGlmKE5PVCBCTEFTX0xJQlJBUklFUykKKyAgICAgIGNoZWNrX2ZvcnRyYW5fbGlicmFyaWVzKAorICAgICAgQkxBU19ERUZJTklUSU9OUworICAgICAgQkxBU19MSUJSQVJJRVMKKyAgICAgIEJMQVMKKyAgICAgIHNnZW1tCisgICAgICAiIgorICAgICAgImFjbWwiCisgICAgICAiJHtDR0FMX1RBVUNTX0xJQlJBUklFU19ESVJ9IEVOViBCTEFTX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgIyBBcHBsZSBCTEFTIGxpYnJhcnk/CisgICAgaWYoTk9UIEJMQVNfTElCUkFSSUVTKQorICAgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisgICAgICBCTEFTX0RFRklOSVRJT05TCisgICAgICBCTEFTX0xJQlJBUklFUworICAgICAgQkxBUworICAgICAgc2dlbW0KKyAgICAgICIiCisgICAgICAiQWNjZWxlcmF0ZSIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIEJMQVNfTElCX0RJUiIKKyAgICAgICkKKyAgICBlbmRpZigpCisKKyAgICBpZiAoIE5PVCBCTEFTX0xJQlJBUklFUyApCisgICAgICBjaGVja19mb3J0cmFuX2xpYnJhcmllcygKKyAgICAgIEJMQVNfREVGSU5JVElPTlMKKyAgICAgIEJMQVNfTElCUkFSSUVTCisgICAgICBCTEFTCisgICAgICBzZ2VtbQorICAgICAgIiIKKyAgICAgICJ2ZWNMaWIiCisgICAgICAiJHtDR0FMX1RBVUNTX0xJQlJBUklFU19ESVJ9IEVOViBCTEFTX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYgKCBOT1QgQkxBU19MSUJSQVJJRVMgKQorCisgICAgIyBHZW5lcmljIEJMQVMgbGlicmFyeT8KKyAgICAjIFRoaXMgY29uZmlndXJhdGlvbiAqbXVzdCogYmUgdGhlIGxhc3QgdHJ5IGFzIHRoaXMgbGlicmFyeSBpcyBub3RhYmx5IHNsb3cuCisgICAgaWYgKCBOT1QgQkxBU19MSUJSQVJJRVMgKQorICAgICAgY2hlY2tfZm9ydHJhbl9saWJyYXJpZXMoCisgICAgICBCTEFTX0RFRklOSVRJT05TCisgICAgICBCTEFTX0xJQlJBUklFUworICAgICAgQkxBUworICAgICAgc2dlbW0KKyAgICAgICIiCisgICAgICAiYmxhcyIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIEJMQVNfTElCX0RJUiIKKyAgICAgICkKKyAgICBlbmRpZigpCisKKyAgaWYoQkxBU19MSUJSQVJJRVNfRElSIE9SIEJMQVNfTElCUkFSSUVTKQorICAgIHNldChCTEFTX0ZPVU5EIFRSVUUpCisgIGVsc2UoKQorICAgIHNldChCTEFTX0ZPVU5EIEZBTFNFKQorICBlbmRpZigpCisKKyAgaWYoTk9UIEJMQVNfRklORF9RVUlFVExZKQorICAgIGlmKEJMQVNfRk9VTkQpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiQSBsaWJyYXJ5IHdpdGggQkxBUyBBUEkgZm91bmQuIikKKyAgICBlbHNlKEJMQVNfRk9VTkQpCisgICAgICBpZihCTEFTX0ZJTkRfUkVRVUlSRUQpCisgICAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkEgcmVxdWlyZWQgbGlicmFyeSB3aXRoIEJMQVMgQVBJIG5vdCBmb3VuZC4gUGxlYXNlIHNwZWNpZnkgbGlicmFyeSBsb2NhdGlvbi4iKQorICAgICAgZWxzZSgpCisgICAgICAgIG1lc3NhZ2UoU1RBVFVTICJBIGxpYnJhcnkgd2l0aCBCTEFTIEFQSSBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IGxpYnJhcnkgbG9jYXRpb24uIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZihCTEFTX0ZPVU5EKQorICBlbmRpZihOT1QgQkxBU19GSU5EX1FVSUVUTFkpCisKKyAgIyBBZGQgdmFyaWFibGVzIHRvIGNhY2hlCisgIHNldCggQkxBU19JTkNMVURFX0RJUiAgICIke0JMQVNfSU5DTFVERV9ESVJ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRSBQQVRIICJEaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBCTEFTIGhlYWRlciBmaWxlcyIgRk9SQ0UgKQorICBzZXQoIEJMQVNfREVGSU5JVElPTlMgICAiJHtCTEFTX0RFRklOSVRJT05TfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgU1RSSU5HICJDb21waWxhdGlvbiBvcHRpb25zIHRvIHVzZSBCTEFTIiBGT1JDRSApCisgIHNldCggQkxBU19MSU5LRVJfRkxBR1MgICIke0JMQVNfTElOS0VSX0ZMQUdTfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgU1RSSU5HICJMaW5rZXIgZmxhZ3MgdG8gdXNlIEJMQVMiIEZPUkNFICkKKyAgc2V0KCBCTEFTX0xJQlJBUklFUyAgICAgIiR7QkxBU19MSUJSQVJJRVN9IgorICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRSBGSUxFUEFUSCAiQkxBUyBsaWJyYXJpZXMgbmFtZSIgRk9SQ0UgKQorICBzZXQoIEJMQVNfTElCUkFSSUVTX0RJUiAiJHtCTEFTX0xJQlJBUklFU19ESVJ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRSBQQVRIICJEaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBCTEFTIGxpYnJhcmllcyIgRk9SQ0UgKQorCisgICNtZXNzYWdlKCJERUJVRzogQkxBU19JTkNMVURFX0RJUiA9ICR7QkxBU19JTkNMVURFX0RJUn0iKQorICAjbWVzc2FnZSgiREVCVUc6IEJMQVNfREVGSU5JVElPTlMgPSAke0JMQVNfREVGSU5JVElPTlN9IikKKyAgI21lc3NhZ2UoIkRFQlVHOiBCTEFTX0xJTktFUl9GTEFHUyA9ICR7QkxBU19MSU5LRVJfRkxBR1N9IikKKyAgI21lc3NhZ2UoIkRFQlVHOiBCTEFTX0xJQlJBUklFUyA9ICR7QkxBU19MSUJSQVJJRVN9IikKKyAgI21lc3NhZ2UoIkRFQlVHOiBCTEFTX0xJQlJBUklFU19ESVIgPSAke0JMQVNfTElCUkFSSUVTX0RJUn0iKQorICAjbWVzc2FnZSgiREVCVUc6IEJMQVNfRk9VTkQgPSAke0JMQVNfRk9VTkR9IikKKworZW5kaWYoQkxBU19MSUJSQVJJRVNfRElSIE9SIEJMQVNfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZENob2xtb2QuY21ha2UgYi9jbWFrZS9GaW5kQ2hvbG1vZC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk1YmVhCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZENob2xtb2QuY21ha2UKQEAgLTAsMCArMSw4MCBAQAorIyBDaG9sbW9kIGxpYiB1c3VhbGx5IHJlcXVpcmVzIGxpbmtpbmcgdG8gYSBibGFzIGFuZCBsYXBhY2sgbGlicmFyeS4KKyMgSXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YgdGhpcyBtb2R1bGUgdG8gZmluZCBhIEJMQVMgYW5kIGxpbmsgdG8gaXQuCisKK2lmIChDSE9MTU9EX0lOQ0xVREVTIEFORCBDSE9MTU9EX0xJQlJBUklFUykKKyAgc2V0KENIT0xNT0RfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoQ0hPTE1PRF9JTkNMVURFUyBBTkQgQ0hPTE1PRF9MSUJSQVJJRVMpCisKK2ZpbmRfcGF0aChDSE9MTU9EX0lOQ0xVREVTCisgIE5BTUVTCisgIGNob2xtb2QuaAorICBQQVRIUworICAkRU5We0NIT0xNT0RESVJ9CisgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKyAgUEFUSF9TVUZGSVhFUworICBzdWl0ZXNwYXJzZQorICB1ZnNwYXJzZQorKQorCitmaW5kX2xpYnJhcnkoQ0hPTE1PRF9MSUJSQVJJRVMgY2hvbG1vZCBQQVRIUyAkRU5We0NIT0xNT0RESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworaWYoQ0hPTE1PRF9MSUJSQVJJRVMpCisKKyAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChDSE9MTU9EX0xJQkRJUiAke0NIT0xNT0RfTElCUkFSSUVTfSBQQVRIKQorCisgIGZpbmRfbGlicmFyeShBTURfTElCUkFSWSBhbWQgUEFUSFMgJHtDSE9MTU9EX0xJQkRJUn0gJEVOVntDSE9MTU9ERElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisgIGlmIChBTURfTElCUkFSWSkKKyAgICBzZXQoQ0hPTE1PRF9MSUJSQVJJRVMgJHtDSE9MTU9EX0xJQlJBUklFU30gJHtBTURfTElCUkFSWX0pCisgIGVsc2UgKCkKKyAgICBzZXQoQ0hPTE1PRF9MSUJSQVJJRVMgRkFMU0UpCisgIGVuZGlmICgpCisKK2VuZGlmKENIT0xNT0RfTElCUkFSSUVTKQorCitpZihDSE9MTU9EX0xJQlJBUklFUykKKworICBmaW5kX2xpYnJhcnkoQ09MQU1EX0xJQlJBUlkgY29sYW1kIFBBVEhTICR7Q0hPTE1PRF9MSUJESVJ9ICRFTlZ7Q0hPTE1PRERJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorICBpZiAoQ09MQU1EX0xJQlJBUlkpCisgICAgc2V0KENIT0xNT0RfTElCUkFSSUVTICR7Q0hPTE1PRF9MSUJSQVJJRVN9ICR7Q09MQU1EX0xJQlJBUll9KQorICBlbHNlICgpCisgICAgc2V0KENIT0xNT0RfTElCUkFSSUVTIEZBTFNFKQorICBlbmRpZiAoKQorCitlbmRpZihDSE9MTU9EX0xJQlJBUklFUykKKworaWYoQ0hPTE1PRF9MSUJSQVJJRVMpCisKKyAgZmluZF9saWJyYXJ5KENBTURfTElCUkFSWSBjYW1kIFBBVEhTICR7Q0hPTE1PRF9MSUJESVJ9ICRFTlZ7Q0hPTE1PRERJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorICBpZiAoQ0FNRF9MSUJSQVJZKQorICAgIHNldChDSE9MTU9EX0xJQlJBUklFUyAke0NIT0xNT0RfTElCUkFSSUVTfSAke0NBTURfTElCUkFSWX0pCisgIGVsc2UgKCkKKyAgICBzZXQoQ0hPTE1PRF9MSUJSQVJJRVMgRkFMU0UpCisgIGVuZGlmICgpCisKK2VuZGlmKENIT0xNT0RfTElCUkFSSUVTKQorCitpZihDSE9MTU9EX0xJQlJBUklFUykKKworICBmaW5kX2xpYnJhcnkoQ0NPTEFNRF9MSUJSQVJZIGNjb2xhbWQgUEFUSFMgJHtDSE9MTU9EX0xJQkRJUn0gJEVOVntDSE9MTU9ERElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisgIGlmIChDQ09MQU1EX0xJQlJBUlkpCisgICAgc2V0KENIT0xNT0RfTElCUkFSSUVTICR7Q0hPTE1PRF9MSUJSQVJJRVN9ICR7Q0NPTEFNRF9MSUJSQVJZfSkKKyAgZWxzZSAoKQorICAgIHNldChDSE9MTU9EX0xJQlJBUklFUyBGQUxTRSkKKyAgZW5kaWYgKCkKKworZW5kaWYoQ0hPTE1PRF9MSUJSQVJJRVMpCisKK2lmKENIT0xNT0RfTElCUkFSSUVTKQorCisgIGZpbmRfbGlicmFyeShDSE9MTU9EX01FVElTX0xJQlJBUlkgbWV0aXMgUEFUSFMgJHtDSE9MTU9EX0xJQkRJUn0gJEVOVntDSE9MTU9ERElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisgIGlmIChDSE9MTU9EX01FVElTX0xJQlJBUlkpCisgICAgc2V0KENIT0xNT0RfTElCUkFSSUVTICR7Q0hPTE1PRF9MSUJSQVJJRVN9ICR7Q0hPTE1PRF9NRVRJU19MSUJSQVJZfSkKKyAgZW5kaWYgKCkKKworZW5kaWYoQ0hPTE1PRF9MSUJSQVJJRVMpCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQ0hPTE1PRCBERUZBVUxUX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIT0xNT0RfSU5DTFVERVMgQ0hPTE1PRF9MSUJSQVJJRVMpCisKK21hcmtfYXNfYWR2YW5jZWQoQ0hPTE1PRF9JTkNMVURFUyBDSE9MTU9EX0xJQlJBUklFUyBBTURfTElCUkFSWSBDT0xBTURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRFaWdlbjIuY21ha2UgYi9jbWFrZS9GaW5kRWlnZW4yLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzRiODgKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kRWlnZW4yLmNtYWtlCkBAIC0wLDAgKzEsODAgQEAKKyMgLSBUcnkgdG8gZmluZCBFaWdlbjIgbGliCisjCisjIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHJlcXVpcmluZyBhIG1pbmltdW0gdmVyc2lvbiwgZS5nLiB5b3UgY2FuIGRvCisjICAgZmluZF9wYWNrYWdlKEVpZ2VuMiAyLjAuMykKKyMgdG8gcmVxdWlyZSB2ZXJzaW9uIDIuMC4zIHRvIG5ld2VyIG9mIEVpZ2VuMi4KKyMKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIEVJR0VOMl9GT1VORCAtIHN5c3RlbSBoYXMgZWlnZW4gbGliIHdpdGggY29ycmVjdCB2ZXJzaW9uCisjICBFSUdFTjJfSU5DTFVERV9ESVIgLSB0aGUgZWlnZW4gaW5jbHVkZSBkaXJlY3RvcnkKKyMgIEVJR0VOMl9WRVJTSU9OIC0gZWlnZW4gdmVyc2lvbgorCisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBNb250ZWwgTGF1cmVudCwgPG1vbnRlbEBrZGUub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgR2FlbCBHdWVubmViYXVkLCA8Zy5nYWVsQGZyZWUuZnI+CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBCU0QgbGljZW5zZS4KKworaWYoTk9UIEVpZ2VuMl9GSU5EX1ZFUlNJT04pCisgIGlmKE5PVCBFaWdlbjJfRklORF9WRVJTSU9OX01BSk9SKQorICAgIHNldChFaWdlbjJfRklORF9WRVJTSU9OX01BSk9SIDIpCisgIGVuZGlmKE5PVCBFaWdlbjJfRklORF9WRVJTSU9OX01BSk9SKQorICBpZihOT1QgRWlnZW4yX0ZJTkRfVkVSU0lPTl9NSU5PUikKKyAgICBzZXQoRWlnZW4yX0ZJTkRfVkVSU0lPTl9NSU5PUiAwKQorICBlbmRpZihOT1QgRWlnZW4yX0ZJTkRfVkVSU0lPTl9NSU5PUikKKyAgaWYoTk9UIEVpZ2VuMl9GSU5EX1ZFUlNJT05fUEFUQ0gpCisgICAgc2V0KEVpZ2VuMl9GSU5EX1ZFUlNJT05fUEFUQ0ggMCkKKyAgZW5kaWYoTk9UIEVpZ2VuMl9GSU5EX1ZFUlNJT05fUEFUQ0gpCisKKyAgc2V0KEVpZ2VuMl9GSU5EX1ZFUlNJT04gIiR7RWlnZW4yX0ZJTkRfVkVSU0lPTl9NQUpPUn0uJHtFaWdlbjJfRklORF9WRVJTSU9OX01JTk9SfS4ke0VpZ2VuMl9GSU5EX1ZFUlNJT05fUEFUQ0h9IikKK2VuZGlmKE5PVCBFaWdlbjJfRklORF9WRVJTSU9OKQorCittYWNybyhfZWlnZW4yX2NoZWNrX3ZlcnNpb24pCisgIGZpbGUoUkVBRCAiJHtFSUdFTjJfSU5DTFVERV9ESVJ9L0VpZ2VuL3NyYy9Db3JlL3V0aWwvTWFjcm9zLmgiIF9laWdlbjJfdmVyc2lvbl9oZWFkZXIpCisKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJkZWZpbmVbIFx0XStFSUdFTl9XT1JMRF9WRVJTSU9OWyBcdF0rKFswLTldKykiIF9laWdlbjJfd29ybGRfdmVyc2lvbl9tYXRjaCAiJHtfZWlnZW4yX3ZlcnNpb25faGVhZGVyfSIpCisgIHNldChFSUdFTjJfV09STERfVkVSU0lPTiAiJHtDTUFLRV9NQVRDSF8xfSIpCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiZGVmaW5lWyBcdF0rRUlHRU5fTUFKT1JfVkVSU0lPTlsgXHRdKyhbMC05XSspIiBfZWlnZW4yX21ham9yX3ZlcnNpb25fbWF0Y2ggIiR7X2VpZ2VuMl92ZXJzaW9uX2hlYWRlcn0iKQorICBzZXQoRUlHRU4yX01BSk9SX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK0VJR0VOX01JTk9SX1ZFUlNJT05bIFx0XSsoWzAtOV0rKSIgX2VpZ2VuMl9taW5vcl92ZXJzaW9uX21hdGNoICIke19laWdlbjJfdmVyc2lvbl9oZWFkZXJ9IikKKyAgc2V0KEVJR0VOMl9NSU5PUl9WRVJTSU9OICIke0NNQUtFX01BVENIXzF9IikKKworICBzZXQoRUlHRU4yX1ZFUlNJT04gJHtFSUdFTjJfV09STERfVkVSU0lPTn0uJHtFSUdFTjJfTUFKT1JfVkVSU0lPTn0uJHtFSUdFTjJfTUlOT1JfVkVSU0lPTn0pCisgIGlmKCgke0VJR0VOMl9XT1JMRF9WRVJTSU9OfSBOT1RFUVVBTCAyKSBPUiAoJHtFSUdFTjJfTUFKT1JfVkVSU0lPTn0gR1JFQVRFUiAxMCkgT1IgKCR7RUlHRU4yX1ZFUlNJT059IFZFUlNJT05fTEVTUyAke0VpZ2VuMl9GSU5EX1ZFUlNJT059KSkKKyAgICBzZXQoRUlHRU4yX1ZFUlNJT05fT0sgRkFMU0UpCisgIGVsc2UoKQorICAgIHNldChFSUdFTjJfVkVSU0lPTl9PSyBUUlVFKQorICBlbmRpZigpCisKKyAgaWYoTk9UIEVJR0VOMl9WRVJTSU9OX09LKQorCisgICAgbWVzc2FnZShTVEFUVVMgIkVpZ2VuMiB2ZXJzaW9uICR7RUlHRU4yX1ZFUlNJT059IGZvdW5kIGluICR7RUlHRU4yX0lOQ0xVREVfRElSfSwgIgorICAgICAgICAgICAgICAgICAgICJidXQgYXQgbGVhc3QgdmVyc2lvbiAke0VpZ2VuMl9GSU5EX1ZFUlNJT059IGlzIHJlcXVpcmVkIikKKyAgZW5kaWYoTk9UIEVJR0VOMl9WRVJTSU9OX09LKQorZW5kbWFjcm8oX2VpZ2VuMl9jaGVja192ZXJzaW9uKQorCitpZiAoRUlHRU4yX0lOQ0xVREVfRElSKQorCisgICMgaW4gY2FjaGUgYWxyZWFkeQorICBfZWlnZW4yX2NoZWNrX3ZlcnNpb24oKQorICBzZXQoRUlHRU4yX0ZPVU5EICR7RUlHRU4yX1ZFUlNJT05fT0t9KQorCitlbHNlIChFSUdFTjJfSU5DTFVERV9ESVIpCisKK2ZpbmRfcGF0aChFSUdFTjJfSU5DTFVERV9ESVIgTkFNRVMgRWlnZW4vQ29yZQorICAgICBQQVRIUworICAgICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9CisgICAgICR7S0RFNF9JTkNMVURFX0RJUn0KKyAgICAgUEFUSF9TVUZGSVhFUyBlaWdlbjIKKyAgICkKKworaWYoRUlHRU4yX0lOQ0xVREVfRElSKQorICBfZWlnZW4yX2NoZWNrX3ZlcnNpb24oKQorZW5kaWYoRUlHRU4yX0lOQ0xVREVfRElSKQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEVpZ2VuMiBERUZBVUxUX01TRyBFSUdFTjJfSU5DTFVERV9ESVIgRUlHRU4yX1ZFUlNJT05fT0spCisKK21hcmtfYXNfYWR2YW5jZWQoRUlHRU4yX0lOQ0xVREVfRElSKQorCitlbmRpZihFSUdFTjJfSU5DTFVERV9ESVIpCisKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRFaWdlbjMuY21ha2UgYi9jbWFrZS9GaW5kRWlnZW4zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTQ2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kRWlnZW4zLmNtYWtlCkBAIC0wLDAgKzEsODEgQEAKKyMgLSBUcnkgdG8gZmluZCBFaWdlbjMgbGliCisjCisjIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHJlcXVpcmluZyBhIG1pbmltdW0gdmVyc2lvbiwgZS5nLiB5b3UgY2FuIGRvCisjICAgZmluZF9wYWNrYWdlKEVpZ2VuMyAzLjEuMikKKyMgdG8gcmVxdWlyZSB2ZXJzaW9uIDMuMS4yIG9yIG5ld2VyIG9mIEVpZ2VuMy4KKyMKKyMgT25jZSBkb25lIHRoaXMgd2lsbCBkZWZpbmUKKyMKKyMgIEVJR0VOM19GT1VORCAtIHN5c3RlbSBoYXMgZWlnZW4gbGliIHdpdGggY29ycmVjdCB2ZXJzaW9uCisjICBFSUdFTjNfSU5DTFVERV9ESVIgLSB0aGUgZWlnZW4gaW5jbHVkZSBkaXJlY3RvcnkKKyMgIEVJR0VOM19WRVJTSU9OIC0gZWlnZW4gdmVyc2lvbgorCisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBNb250ZWwgTGF1cmVudCwgPG1vbnRlbEBrZGUub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgR2FlbCBHdWVubmViYXVkLCA8Zy5nYWVsQGZyZWUuZnI+CisjIENvcHlyaWdodCAoYykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIDItY2xhdXNlIEJTRCBsaWNlbnNlLgorCitpZihOT1QgRWlnZW4zX0ZJTkRfVkVSU0lPTikKKyAgaWYoTk9UIEVpZ2VuM19GSU5EX1ZFUlNJT05fTUFKT1IpCisgICAgc2V0KEVpZ2VuM19GSU5EX1ZFUlNJT05fTUFKT1IgMikKKyAgZW5kaWYoTk9UIEVpZ2VuM19GSU5EX1ZFUlNJT05fTUFKT1IpCisgIGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OX01JTk9SKQorICAgIHNldChFaWdlbjNfRklORF9WRVJTSU9OX01JTk9SIDkxKQorICBlbmRpZihOT1QgRWlnZW4zX0ZJTkRfVkVSU0lPTl9NSU5PUikKKyAgaWYoTk9UIEVpZ2VuM19GSU5EX1ZFUlNJT05fUEFUQ0gpCisgICAgc2V0KEVpZ2VuM19GSU5EX1ZFUlNJT05fUEFUQ0ggMCkKKyAgZW5kaWYoTk9UIEVpZ2VuM19GSU5EX1ZFUlNJT05fUEFUQ0gpCisKKyAgc2V0KEVpZ2VuM19GSU5EX1ZFUlNJT04gIiR7RWlnZW4zX0ZJTkRfVkVSU0lPTl9NQUpPUn0uJHtFaWdlbjNfRklORF9WRVJTSU9OX01JTk9SfS4ke0VpZ2VuM19GSU5EX1ZFUlNJT05fUEFUQ0h9IikKK2VuZGlmKE5PVCBFaWdlbjNfRklORF9WRVJTSU9OKQorCittYWNybyhfZWlnZW4zX2NoZWNrX3ZlcnNpb24pCisgIGZpbGUoUkVBRCAiJHtFSUdFTjNfSU5DTFVERV9ESVJ9L0VpZ2VuL3NyYy9Db3JlL3V0aWwvTWFjcm9zLmgiIF9laWdlbjNfdmVyc2lvbl9oZWFkZXIpCisKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJkZWZpbmVbIFx0XStFSUdFTl9XT1JMRF9WRVJTSU9OWyBcdF0rKFswLTldKykiIF9laWdlbjNfd29ybGRfdmVyc2lvbl9tYXRjaCAiJHtfZWlnZW4zX3ZlcnNpb25faGVhZGVyfSIpCisgIHNldChFSUdFTjNfV09STERfVkVSU0lPTiAiJHtDTUFLRV9NQVRDSF8xfSIpCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiZGVmaW5lWyBcdF0rRUlHRU5fTUFKT1JfVkVSU0lPTlsgXHRdKyhbMC05XSspIiBfZWlnZW4zX21ham9yX3ZlcnNpb25fbWF0Y2ggIiR7X2VpZ2VuM192ZXJzaW9uX2hlYWRlcn0iKQorICBzZXQoRUlHRU4zX01BSk9SX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK0VJR0VOX01JTk9SX1ZFUlNJT05bIFx0XSsoWzAtOV0rKSIgX2VpZ2VuM19taW5vcl92ZXJzaW9uX21hdGNoICIke19laWdlbjNfdmVyc2lvbl9oZWFkZXJ9IikKKyAgc2V0KEVJR0VOM19NSU5PUl9WRVJTSU9OICIke0NNQUtFX01BVENIXzF9IikKKworICBzZXQoRUlHRU4zX1ZFUlNJT04gJHtFSUdFTjNfV09STERfVkVSU0lPTn0uJHtFSUdFTjNfTUFKT1JfVkVSU0lPTn0uJHtFSUdFTjNfTUlOT1JfVkVSU0lPTn0pCisgIGlmKCR7RUlHRU4zX1ZFUlNJT059IFZFUlNJT05fTEVTUyAke0VpZ2VuM19GSU5EX1ZFUlNJT059KQorICAgIHNldChFSUdFTjNfVkVSU0lPTl9PSyBGQUxTRSkKKyAgZWxzZSgke0VJR0VOM19WRVJTSU9OfSBWRVJTSU9OX0xFU1MgJHtFaWdlbjNfRklORF9WRVJTSU9OfSkKKyAgICBzZXQoRUlHRU4zX1ZFUlNJT05fT0sgVFJVRSkKKyAgZW5kaWYoJHtFSUdFTjNfVkVSU0lPTn0gVkVSU0lPTl9MRVNTICR7RWlnZW4zX0ZJTkRfVkVSU0lPTn0pCisKKyAgaWYoTk9UIEVJR0VOM19WRVJTSU9OX09LKQorCisgICAgbWVzc2FnZShTVEFUVVMgIkVpZ2VuMyB2ZXJzaW9uICR7RUlHRU4zX1ZFUlNJT059IGZvdW5kIGluICR7RUlHRU4zX0lOQ0xVREVfRElSfSwgIgorICAgICAgICAgICAgICAgICAgICJidXQgYXQgbGVhc3QgdmVyc2lvbiAke0VpZ2VuM19GSU5EX1ZFUlNJT059IGlzIHJlcXVpcmVkIikKKyAgZW5kaWYoTk9UIEVJR0VOM19WRVJTSU9OX09LKQorZW5kbWFjcm8oX2VpZ2VuM19jaGVja192ZXJzaW9uKQorCitpZiAoRUlHRU4zX0lOQ0xVREVfRElSKQorCisgICMgaW4gY2FjaGUgYWxyZWFkeQorICBfZWlnZW4zX2NoZWNrX3ZlcnNpb24oKQorICBzZXQoRUlHRU4zX0ZPVU5EICR7RUlHRU4zX1ZFUlNJT05fT0t9KQorCitlbHNlIChFSUdFTjNfSU5DTFVERV9ESVIpCisKKyAgZmluZF9wYXRoKEVJR0VOM19JTkNMVURFX0RJUiBOQU1FUyBzaWduYXR1cmVfb2ZfZWlnZW4zX21hdHJpeF9saWJyYXJ5CisgICAgICBQQVRIUworICAgICAgJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vaW5jbHVkZQorICAgICAgJHtLREU0X0lOQ0xVREVfRElSfQorICAgICAgUEFUSF9TVUZGSVhFUyBlaWdlbjMgZWlnZW4KKyAgICApCisKKyAgaWYoRUlHRU4zX0lOQ0xVREVfRElSKQorICAgIF9laWdlbjNfY2hlY2tfdmVyc2lvbigpCisgIGVuZGlmKEVJR0VOM19JTkNMVURFX0RJUikKKworICBpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorICBmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoRWlnZW4zIERFRkFVTFRfTVNHIEVJR0VOM19JTkNMVURFX0RJUiBFSUdFTjNfVkVSU0lPTl9PSykKKworICBtYXJrX2FzX2FkdmFuY2VkKEVJR0VOM19JTkNMVURFX0RJUikKKworZW5kaWYoRUlHRU4zX0lOQ0xVREVfRElSKQorCmRpZmYgLS1naXQgYS9jbWFrZS9GaW5kRkZUVy5jbWFrZSBiL2NtYWtlL0ZpbmRGRlRXLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTk5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kRkZUVy5jbWFrZQpAQCAtMCwwICsxLDExOSBAQAorIyAtIEZpbmQgdGhlIEZGVFcgbGlicmFyeQorIworIyBVc2FnZToKKyMgICBmaW5kX3BhY2thZ2UoRkZUVyBbUkVRVUlSRURdIFtRVUlFVF0gKQorIyAgICAgCisjIEl0IHNldHMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CisjICAgRkZUV19GT1VORCAgICAgICAgICAgICAgIC4uLiB0cnVlIGlmIGZmdHcgaXMgZm91bmQgb24gdGhlIHN5c3RlbQorIyAgIEZGVFdfTElCUkFSSUVTICAgICAgICAgICAuLi4gZnVsbCBwYXRoIHRvIGZmdHcgbGlicmFyeQorIyAgIEZGVFdfSU5DTFVERVMgICAgICAgICAgICAuLi4gZmZ0dyBpbmNsdWRlIGRpcmVjdG9yeQorIworIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyB3aWxsIGJlIGNoZWNrZWQgYnkgdGhlIGZ1bmN0aW9uCisjICAgRkZUV19VU0VfU1RBVElDX0xJQlMgICAgLi4uIGlmIHRydWUsIG9ubHkgc3RhdGljIGxpYnJhcmllcyBhcmUgZm91bmQKKyMgICBGRlRXX1JPT1QgICAgICAgICAgICAgICAuLi4gaWYgc2V0LCB0aGUgbGlicmFyaWVzIGFyZSBleGNsdXNpdmVseSBzZWFyY2hlZAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciB0aGlzIHBhdGgKKyMgICBGRlRXX0xJQlJBUlkgICAgICAgICAgICAuLi4gZmZ0dyBsaWJyYXJ5IHRvIHVzZQorIyAgIEZGVFdfSU5DTFVERV9ESVIgICAgICAgIC4uLiBmZnR3IGluY2x1ZGUgZGlyZWN0b3J5CisjCisKKyNJZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBGRlRXRElSIGlzIHNwZWNpZmllZCwgaXQgaGFzIHNhbWUgZWZmZWN0IGFzIEZGVFdfUk9PVAoraWYoIE5PVCBGRlRXX1JPT1QgQU5EIEVOVntGRlRXRElSfSApCisgIHNldCggRkZUV19ST09UICRFTlZ7RkZUV0RJUn0gKQorZW5kaWYoKQorCisjIENoZWNrIGlmIHdlIGNhbiB1c2UgUGtnQ29uZmlnCitmaW5kX3BhY2thZ2UoUGtnQ29uZmlnKQorCisjRGV0ZXJtaW5lIGZyb20gUEtHCitpZiggUEtHX0NPTkZJR19GT1VORCBBTkQgTk9UIEZGVFdfUk9PVCApCisgIHBrZ19jaGVja19tb2R1bGVzKCBQS0dfRkZUVyBRVUlFVCAiZmZ0dzMiICkKK2VuZGlmKCkKKworI0NoZWNrIHdoZXRoZXIgdG8gc2VhcmNoIHN0YXRpYyBvciBkeW5hbWljIGxpYnMKK3NldCggQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTX1NBViAke0NNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFU30gKQorCitpZiggJHtGRlRXX1VTRV9TVEFUSUNfTElCU30gKQorICBzZXQoIENNQUtFX0ZJTkRfTElCUkFSWV9TVUZGSVhFUyAke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0gKQorZWxzZSgpCisgIHNldCggQ01BS0VfRklORF9MSUJSQVJZX1NVRkZJWEVTICR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfSApCitlbmRpZigpCisKK2lmKCBGRlRXX1JPT1QgKQorCisgICNmaW5kIGxpYnMKKyAgZmluZF9saWJyYXJ5KAorICAgIEZGVFdfTElCCisgICAgTkFNRVMgImZmdHczIgorICAgIFBBVEhTICR7RkZUV19ST09UfQorICAgIFBBVEhfU1VGRklYRVMgImxpYiIgImxpYjY0IgorICAgIE5PX0RFRkFVTFRfUEFUSAorICApCisKKyAgZmluZF9saWJyYXJ5KAorICAgIEZGVFdGX0xJQgorICAgIE5BTUVTICJmZnR3M2YiCisgICAgUEFUSFMgJHtGRlRXX1JPT1R9CisgICAgUEFUSF9TVUZGSVhFUyAibGliIiAibGliNjQiCisgICAgTk9fREVGQVVMVF9QQVRICisgICkKKworICBmaW5kX2xpYnJhcnkoCisgICAgRkZUV0xfTElCCisgICAgTkFNRVMgImZmdHczbCIKKyAgICBQQVRIUyAke0ZGVFdfUk9PVH0KKyAgICBQQVRIX1NVRkZJWEVTICJsaWIiICJsaWI2NCIKKyAgICBOT19ERUZBVUxUX1BBVEgKKyAgKQorCisgICNmaW5kIGluY2x1ZGVzCisgIGZpbmRfcGF0aCgKKyAgICBGRlRXX0lOQ0xVREVTCisgICAgTkFNRVMgImZmdHczLmgiCisgICAgUEFUSFMgJHtGRlRXX1JPT1R9CisgICAgUEFUSF9TVUZGSVhFUyAiaW5jbHVkZSIKKyAgICBOT19ERUZBVUxUX1BBVEgKKyAgKQorCitlbHNlKCkKKworICBmaW5kX2xpYnJhcnkoCisgICAgRkZUV19MSUIKKyAgICBOQU1FUyAiZmZ0dzMiCisgICAgUEFUSFMgJHtQS0dfRkZUV19MSUJSQVJZX0RJUlN9ICR7TElCX0lOU1RBTExfRElSfQorICApCisKKyAgZmluZF9saWJyYXJ5KAorICAgIEZGVFdGX0xJQgorICAgIE5BTUVTICJmZnR3M2YiCisgICAgUEFUSFMgJHtQS0dfRkZUV19MSUJSQVJZX0RJUlN9ICR7TElCX0lOU1RBTExfRElSfQorICApCisKKworICBmaW5kX2xpYnJhcnkoCisgICAgRkZUV0xfTElCCisgICAgTkFNRVMgImZmdHczbCIKKyAgICBQQVRIUyAke1BLR19GRlRXX0xJQlJBUllfRElSU30gJHtMSUJfSU5TVEFMTF9ESVJ9CisgICkKKworICBmaW5kX3BhdGgoCisgICAgRkZUV19JTkNMVURFUworICAgIE5BTUVTICJmZnR3My5oIgorICAgIFBBVEhTICR7UEtHX0ZGVFdfSU5DTFVERV9ESVJTfSAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9CisgICkKKworZW5kaWYoIEZGVFdfUk9PVCApCisKK3NldChGRlRXX0xJQlJBUklFUyAke0ZGVFdfTElCfSAke0ZGVFdGX0xJQn0pCisKK2lmKEZGVFdMX0xJQikKKyAgc2V0KEZGVFdfTElCUkFSSUVTICR7RkZUV19MSUJSQVJJRVN9ICR7RkZUV0xfTElCfSkKK2VuZGlmKCkKKworc2V0KCBDTUFLRV9GSU5EX0xJQlJBUllfU1VGRklYRVMgJHtDTUFLRV9GSU5EX0xJQlJBUllfU1VGRklYRVNfU0FWfSApCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoRkZUVyBERUZBVUxUX01TRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGVFdfSU5DTFVERVMgRkZUV19MSUJSQVJJRVMpCisKK21hcmtfYXNfYWR2YW5jZWQoRkZUV19JTkNMVURFUyBGRlRXX0xJQlJBUklFUykKKwpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZEdMRVcuY21ha2UgYi9jbWFrZS9GaW5kR0xFVy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRhMjBmCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZEdMRVcuY21ha2UKQEAgLTAsMCArMSwxMDUgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA5IEJvdWRld2lqbiBSZW1wdCA8Ym91ZEB2YWxkeWFzLm9yZz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgRm9yIGRldGFpbHMgc2VlIHRoZSBhY2NvbXBhbnlpbmcgQ09QWUlORy1DTUFLRS1TQ1JJUFRTIGZpbGUuIAorIyAKKyMgLSB0cnkgdG8gZmluZCBnbGV3IGxpYnJhcnkgYW5kIGluY2x1ZGUgZmlsZXMKKyMgIEdMRVdfSU5DTFVERV9ESVIsIHdoZXJlIHRvIGZpbmQgR0wvZ2xldy5oLCBldGMuCisjICBHTEVXX0xJQlJBUklFUywgdGhlIGxpYnJhcmllcyB0byBsaW5rIGFnYWluc3QKKyMgIEdMRVdfRk9VTkQsIElmIGZhbHNlLCBkbyBub3QgdHJ5IHRvIHVzZSBHTEVXLgorIyBBbHNvIGRlZmluZWQsIGJ1dCBub3QgZm9yIGdlbmVyYWwgdXNlIGFyZToKKyMgIEdMRVdfR0xFV19MSUJSQVJZID0gdGhlIGZ1bGwgcGF0aCB0byB0aGUgZ2xldyBsaWJyYXJ5LgorCitJRiAoV0lOMzIpCisKKyAgSUYoQ1lHV0lOKQorCisgICAgRklORF9QQVRIKCBHTEVXX0lOQ0xVREVfRElSIEdML2dsZXcuaCkKKworICAgIEZJTkRfTElCUkFSWSggR0xFV19HTEVXX0xJQlJBUlkgZ2xldzMyCisgICAgICAke09QRU5HTF9MSUJSQVJZX0RJUn0KKyAgICAgIC91c3IvbGliL3czMmFwaQorICAgICAgL3Vzci9YMTFSNi9saWIKKyAgICApCisKKworICBFTFNFKENZR1dJTikKKyAgCisgICAgRklORF9QQVRIKCBHTEVXX0lOQ0xVREVfRElSIEdML2dsZXcuaAorICAgICAgJEVOVntHTEVXX1JPT1RfUEFUSH0vaW5jbHVkZQorICAgICkKKworICAgIEZJTkRfTElCUkFSWSggR0xFV19HTEVXX0xJQlJBUlkKKyAgICAgIE5BTUVTIGdsZXcgZ2xldzMyCisgICAgICBQQVRIUworICAgICAgJEVOVntHTEVXX1JPT1RfUEFUSH0vbGliCisgICAgICAke09QRU5HTF9MSUJSQVJZX0RJUn0KKyAgICApCisKKyAgRU5ESUYoQ1lHV0lOKQorCitFTFNFIChXSU4zMikKKworICBJRiAoQVBQTEUpCisjIFRoZXNlIHZhbHVlcyBmb3IgQXBwbGUgY291bGQgcHJvYmFibHkgZG8gd2l0aCBpbXByb3ZlbWVudC4KKyAgICBGSU5EX1BBVEgoIEdMRVdfSU5DTFVERV9ESVIgZ2xldy5oCisgICAgICAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9HTEVXLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMKKyAgICAgICR7T1BFTkdMX0xJQlJBUllfRElSfQorICAgICkKKyAgICBTRVQoR0xFV19HTEVXX0xJQlJBUlkgIi1mcmFtZXdvcmsgR0xFVyIgQ0FDSEUgU1RSSU5HICJHTEVXIGxpYnJhcnkgZm9yIE9TWCIpCisgICAgU0VUKEdMRVdfY29jb2FfTElCUkFSWSAiLWZyYW1ld29yayBDb2NvYSIgQ0FDSEUgU1RSSU5HICJDb2NvYSBmcmFtZXdvcmsgZm9yIE9TWCIpCisgIEVMU0UgKEFQUExFKQorCisgICAgRklORF9QQVRIKCBHTEVXX0lOQ0xVREVfRElSIEdML2dsZXcuaAorICAgICAgL3Vzci9pbmNsdWRlL0dMCisgICAgICAvdXNyL29wZW53aW4vc2hhcmUvaW5jbHVkZQorICAgICAgL3Vzci9vcGVud2luL2luY2x1ZGUKKyAgICAgIC91c3IvWDExUjYvaW5jbHVkZQorICAgICAgL3Vzci9pbmNsdWRlL1gxMQorICAgICAgL29wdC9ncmFwaGljcy9PcGVuR0wvaW5jbHVkZQorICAgICAgL29wdC9ncmFwaGljcy9PcGVuR0wvY29udHJpYi9saWJnbGV3CisgICAgKQorCisgICAgRklORF9MSUJSQVJZKCBHTEVXX0dMRVdfTElCUkFSWSBHTEVXCisgICAgICAvdXNyL29wZW53aW4vbGliCisgICAgICAvdXNyL1gxMVI2L2xpYgorICAgICkKKworICBFTkRJRiAoQVBQTEUpCisKK0VORElGIChXSU4zMikKKworU0VUKCBHTEVXX0ZPVU5EICJOTyIgKQorSUYoR0xFV19JTkNMVURFX0RJUikKKyAgSUYoR0xFV19HTEVXX0xJQlJBUlkpCisgICAgIyBJcyAtbFhpIGFuZCAtbFhtdSByZXF1aXJlZCBvbiBhbGwgcGxhdGZvcm1zIHRoYXQgaGF2ZSBpdD8KKyAgICAjIElmIG5vdCwgd2UgbmVlZCBzb21lIHdheSB0byBmaWd1cmUgb3V0IHdoYXQgcGxhdGZvcm0gd2UgYXJlIG9uLgorICAgIFNFVCggR0xFV19MSUJSQVJJRVMKKyAgICAgICR7R0xFV19HTEVXX0xJQlJBUll9CisgICAgICAke0dMRVdfY29jb2FfTElCUkFSWX0KKyAgICApCisgICAgU0VUKCBHTEVXX0ZPVU5EICJZRVMiICkKKworI1RoZSBmb2xsb3dpbmcgZGVwcmVjYXRlZCBzZXR0aW5ncyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggQ01ha2UxLjQKKyAgICBTRVQgKEdMRVdfTElCUkFSWSAke0dMRVdfTElCUkFSSUVTfSkKKyAgICBTRVQgKEdMRVdfSU5DTFVERV9QQVRIICR7R0xFV19JTkNMVURFX0RJUn0pCisKKyAgRU5ESUYoR0xFV19HTEVXX0xJQlJBUlkpCitFTkRJRihHTEVXX0lOQ0xVREVfRElSKQorCitJRihHTEVXX0ZPVU5EKQorICBJRihOT1QgR0xFV19GSU5EX1FVSUVUTFkpCisgICAgTUVTU0FHRShTVEFUVVMgIkZvdW5kIEdsZXc6ICR7R0xFV19MSUJSQVJJRVN9IikKKyAgRU5ESUYoTk9UIEdMRVdfRklORF9RVUlFVExZKQorRUxTRShHTEVXX0ZPVU5EKQorICBJRihHTEVXX0ZJTkRfUkVRVUlSRUQpCisgICAgTUVTU0FHRShGQVRBTF9FUlJPUiAiQ291bGQgbm90IGZpbmQgR2xldyIpCisgIEVORElGKEdMRVdfRklORF9SRVFVSVJFRCkKK0VORElGKEdMRVdfRk9VTkQpCisKK01BUktfQVNfQURWQU5DRUQoCisgIEdMRVdfSU5DTFVERV9ESVIKKyAgR0xFV19HTEVXX0xJQlJBUlkKKyAgR0xFV19YbXVfTElCUkFSWQorICBHTEVXX1hpX0xJQlJBUlkKKykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRHTVAuY21ha2UgYi9jbWFrZS9GaW5kR01QLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDI3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kR01QLmNtYWtlCkBAIC0wLDAgKzEsMjEgQEAKKyMgVHJ5IHRvIGZpbmQgdGhlIEdOVSBNdWx0aXBsZSBQcmVjaXNpb24gQXJpdGhtZXRpYyBMaWJyYXJ5IChHTVApCisjIFNlZSBodHRwOi8vZ21wbGliLm9yZy8KKworaWYgKEdNUF9JTkNMVURFUyBBTkQgR01QX0xJQlJBUklFUykKKyAgc2V0KEdNUF9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChHTVBfSU5DTFVERVMgQU5EIEdNUF9MSUJSQVJJRVMpCisKK2ZpbmRfcGF0aChHTVBfSU5DTFVERVMKKyAgTkFNRVMKKyAgZ21wLmgKKyAgUEFUSFMKKyAgJEVOVntHTVBESVJ9CisgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKykKKworZmluZF9saWJyYXJ5KEdNUF9MSUJSQVJJRVMgZ21wIFBBVEhTICRFTlZ7R01QRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR01QIERFRkFVTFRfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01QX0lOQ0xVREVTIEdNUF9MSUJSQVJJRVMpCittYXJrX2FzX2FkdmFuY2VkKEdNUF9JTkNMVURFUyBHTVBfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZEdTTC5jbWFrZSBiL2NtYWtlL0ZpbmRHU0wuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0MTFhNwotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRHU0wuY21ha2UKQEAgLTAsMCArMSwxNzAgQEAKKyMgVHJ5IHRvIGZpbmQgZ251IHNjaWVudGlmaWMgbGlicmFyeSBHU0wKKyMgU2VlIAorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsLyAgYW5kCisjIGh0dHA6Ly9nbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQvcGFja2FnZXMvZ3NsLmh0bQorIworIyBPbmNlIHJ1biB0aGlzIHdpbGwgZGVmaW5lOiAKKyMgCisjIEdTTF9GT1VORCAgICAgICA9IHN5c3RlbSBoYXMgR1NMIGxpYgorIworIyBHU0xfTElCUkFSSUVTICAgPSBmdWxsIHBhdGggdG8gdGhlIGxpYnJhcmllcworIyAgICBvbiBVbml4L0xpbnV4IHdpdGggYWRkaXRpb25hbCBsaW5rZXIgZmxhZ3MgZnJvbSAiZ3NsLWNvbmZpZyAtLWxpYnMiCisjIAorIyBDTUFLRV9HU0xfQ1hYX0ZMQUdTICA9IFVuaXggY29tcGlsZXIgZmxhZ3MgZm9yIEdTTCwgZXNzZW50aWFsbHkgImBnc2wtY29uZmlnIC0tY3h4ZmxhZ3NgIgorIworIyBHU0xfSU5DTFVERV9ESVIgICAgICA9IHdoZXJlIHRvIGZpbmQgaGVhZGVycyAKKyMKKyMgR1NMX0xJTktfRElSRUNUT1JJRVMgPSBsaW5rIGRpcmVjdG9yaWVzLCB1c2VmdWwgZm9yIHJwYXRoIG9uIFVuaXgKKyMgR1NMX0VYRV9MSU5LRVJfRkxBR1MgPSBycGF0aCBvbiBVbml4CisjCisjIEZlbGl4IFdvZWxrIDA3LzIwMDQKKyMgSmFuIFdvZXR6ZWwKKyMKKyMgd3d3Lm1pcC5pbmZvcm1hdGlrLnVuaS1raWVsLmRlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lGKFdJTjMyKQorICAjIEpXIHRlc3RlZCB3aXRoIGdzbC0xLjgsIFdpbmRvd3MgWFAsIE1TVlMgNy4xCisgIFNFVChHU0xfUE9TU0lCTEVfUk9PVF9ESVJTCisgICAgJHtHU0xfUk9PVF9ESVJ9CisgICAgJEVOVntHU0xfUk9PVF9ESVJ9CisgICAgJHtHU0xfRElSfQorICAgICR7R1NMX0hPTUV9ICAgIAorICAgICRFTlZ7R1NMX0RJUn0KKyAgICAkRU5We0dTTF9IT01FfQorICAgICRFTlZ7RVhUUkF9CisgICAgIkM6L1Byb2dyYW0gRmlsZXMvR251V2luMzIiCisgICAgKQorICBGSU5EX1BBVEgoR1NMX0lOQ0xVREVfRElSCisgICAgTkFNRVMgZ3NsL2dzbF9jZGYuaCBnc2wvZ3NsX3JhbmRpc3QuaAorICAgIFBBVEhTICR7R1NMX1BPU1NJQkxFX1JPT1RfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGluY2x1ZGUKKyAgICBET0MgIkdTTCBoZWFkZXIgaW5jbHVkZSBkaXIiCisgICAgKQorICAKKyAgRklORF9MSUJSQVJZKEdTTF9HU0xfTElCUkFSWQorICAgIE5BTUVTIGxpYmdzbC5kbGwuYSBnc2wgbGliZ3NsCisgICAgUEFUSFMgICR7R1NMX1BPU1NJQkxFX1JPT1RfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGxpYgorICAgIERPQyAiR1NMIGxpYnJhcnkiICkKKyAgCisgIGlmKE5PVCBHU0xfR1NMX0xJQlJBUlkpCisJRklORF9GSUxFKEdTTF9HU0xfTElCUkFSWQorCQlOQU1FUyBsaWJnc2wuZGxsLmEKKwkJUEFUSFMgICR7R1NMX1BPU1NJQkxFX1JPT1RfRElSU30KKwkJUEFUSF9TVUZGSVhFUyBsaWIKKwkJRE9DICJHU0wgbGlicmFyeSIpCisgIGVuZGlmKE5PVCBHU0xfR1NMX0xJQlJBUlkpCisgIAorICBGSU5EX0xJQlJBUlkoR1NMX0dTTENCTEFTX0xJQlJBUlkKKyAgICBOQU1FUyBsaWJnc2xjYmxhcy5kbGwuYSBnc2xjYmxhcyBsaWJnc2xjYmxhcworICAgIFBBVEhTICAke0dTTF9QT1NTSUJMRV9ST09UX0RJUlN9CisgICAgUEFUSF9TVUZGSVhFUyBsaWIKKyAgICBET0MgIkdTTCBjYmxhcyBsaWJyYXJ5IGRpciIgKQorICAKKyAgaWYoTk9UIEdTTF9HU0xDQkxBU19MSUJSQVJZKQorCUZJTkRfRklMRShHU0xfR1NMQ0JMQVNfTElCUkFSWQorCQlOQU1FUyBsaWJnc2xjYmxhcy5kbGwuYQorCQlQQVRIUyAgJHtHU0xfUE9TU0lCTEVfUk9PVF9ESVJTfQorCQlQQVRIX1NVRkZJWEVTIGxpYgorCQlET0MgIkdTTCBsaWJyYXJ5IikKKyAgZW5kaWYoTk9UIEdTTF9HU0xDQkxBU19MSUJSQVJZKQorICAKKyAgU0VUKEdTTF9MSUJSQVJJRVMgJHtHU0xfR1NMX0xJQlJBUll9KQorCisgICNNRVNTQUdFKCJEQkdcbiIKKyAgIyAgIkdTTF9HU0xfTElCUkFSWT0ke0dTTF9HU0xfTElCUkFSWX1cbiIKKyAgIyAgIkdTTF9HU0xDQkxBU19MSUJSQVJZPSR7R1NMX0dTTENCTEFTX0xJQlJBUll9XG4iCisgICMgICJHU0xfTElCUkFSSUVTPSR7R1NMX0xJQlJBUklFU30iKQorCisKK0VMU0UoV0lOMzIpCisgIAorICBJRihVTklYKSAKKyAgICBTRVQoR1NMX0NPTkZJR19QUkVGRVJfUEFUSCAKKyAgICAgICIkRU5We0dTTF9ESVJ9L2JpbiIKKyAgICAgICIkRU5We0dTTF9ESVJ9IgorICAgICAgIiRFTlZ7R1NMX0hPTUV9L2JpbiIgCisgICAgICAiJEVOVntHU0xfSE9NRX0iIAorICAgICAgQ0FDSEUgU1RSSU5HICJwcmVmZXJyZWQgcGF0aCB0byBHU0wgKGdzbC1jb25maWcpIikKKyAgICBGSU5EX1BST0dSQU0oR1NMX0NPTkZJRyBnc2wtY29uZmlnCisgICAgICAke0dTTF9DT05GSUdfUFJFRkVSX1BBVEh9CisgICAgICAvdXNyL2Jpbi8KKyAgICAgICkKKyAgICAjIE1FU1NBR0UoIkRCRyBHU0xfQ09ORklHICR7R1NMX0NPTkZJR30iKQorICAgIAorICAgIElGIChHU0xfQ09ORklHKSAKKyAgICAgICMgc2V0IENYWEZMQUdTIHRvIGJlIGZlZCBpbnRvIENYWF9GTEFHUyBieSB0aGUgdXNlcjoKKyAgICAgIFNFVChHU0xfQ1hYX0ZMQUdTICJgJHtHU0xfQ09ORklHfSAtLWNmbGFnc2AiKQorICAgICAgCisgICAgICAjIHNldCBJTkNMVURFX0RJUlMgdG8gcHJlZml4K2luY2x1ZGUKKyAgICAgIEVYRUNfUFJPR1JBTSgke0dTTF9DT05GSUd9CisgICAgICAgIEFSR1MgLS1wcmVmaXgKKyAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdTTF9QUkVGSVgpCisgICAgICBTRVQoR1NMX0lOQ0xVREVfRElSICR7R1NMX1BSRUZJWH0vaW5jbHVkZSBDQUNIRSBTVFJJTkcgSU5URVJOQUwpCisKKyAgICAgICMgc2V0IGxpbmsgbGlicmFyaWVzIGFuZCBsaW5rIGZsYWdzCisgICAgICAjU0VUKEdTTF9MSUJSQVJJRVMgImAke0dTTF9DT05GSUd9IC0tbGlic2AiKQorICAgICAgRVhFQ19QUk9HUkFNKCR7R1NMX0NPTkZJR30KKyAgICAgICAgQVJHUyAtLWxpYnMKKyAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdTTF9MSUJSQVJJRVMgKQorICAgICAgICAKKyAgICAgICMgZXh0cmFjdCBsaW5rIGRpcnMgZm9yIHJwYXRoICAKKyAgICAgIEVYRUNfUFJPR1JBTSgke0dTTF9DT05GSUd9CisgICAgICAgIEFSR1MgLS1saWJzCisgICAgICAgIE9VVFBVVF9WQVJJQUJMRSBHU0xfQ09ORklHX0xJQlMgKQorICAgICAgCisgICAgICAjIGV4dHJhY3QgdmVyc2lvbgorICAgICAgRVhFQ19QUk9HUkFNKCR7R1NMX0NPTkZJR30KKyAgICAgICAgQVJHUyAtLXZlcnNpb24KKyAgICAgICAgT1VUUFVUX1ZBUklBQkxFIEdTTF9GVUxMX1ZFUlNJT04gKQorICAgICAgCisgICAgICAjIHNwbGl0IHZlcnNpb24gYXMgbWFqb3IvbWlub3IKKyAgICAgIFNUUklORyhSRUdFWCBNQVRDSCAiKC4pXFwuLioiIEdTTF9WRVJTSU9OX01BSk9SXyAiJHtHU0xfRlVMTF9WRVJTSU9OfSIpCisgICAgICBTRVQoR1NMX1ZFUlNJT05fTUFKT1IgJHtDTUFLRV9NQVRDSF8xfSkKKyAgICAgIFNUUklORyhSRUdFWCBNQVRDSCAiLlxcLiguKikiIEdTTF9WRVJTSU9OX01JTk9SXyAiJHtHU0xfRlVMTF9WRVJTSU9OfSIpCisgICAgICBTRVQoR1NMX1ZFUlNJT05fTUlOT1IgJHtDTUFLRV9NQVRDSF8xfSkKKworICAgICAgIyBzcGxpdCBvZmYgdGhlIGxpbmsgZGlycyAoZm9yIHJwYXRoKQorICAgICAgIyB1c2UgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHdpbGRjYXJkIGVxdWl2YWxlbnQgIi1MKjxlbmRjaGFyPiIKKyAgICAgICMgd2l0aCA8ZW5kY2hhcj4gaXMgYSBzcGFjZSBvciBhIHNlbWljb2xvbgorICAgICAgU1RSSU5HKFJFR0VYIE1BVENIQUxMICJbLV1bTF0oW14gO10pKyIgCisgICAgICAgIEdTTF9MSU5LX0RJUkVDVE9SSUVTX1dJVEhfUFJFRklYIAorICAgICAgICAiJHtHU0xfQ09ORklHX0xJQlN9IiApCisgICAgICAjICAgICAgTUVTU0FHRSgiREJHICBHU0xfTElOS19ESVJFQ1RPUklFU19XSVRIX1BSRUZJWD0ke0dTTF9MSU5LX0RJUkVDVE9SSUVTX1dJVEhfUFJFRklYfSIpCisKKyAgICAgICMgcmVtb3ZlIHByZWZpeCAtTCBiZWNhdXNlIHdlIG5lZWQgdGhlIHB1cmUgZGlyZWN0b3J5IGZvciBMSU5LX0RJUkVDVE9SSUVTCisgICAgICAKKyAgICAgIElGIChHU0xfTElOS19ESVJFQ1RPUklFU19XSVRIX1BSRUZJWCkKKyAgICAgICAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlstXVtMXSIgIiIgR1NMX0xJTktfRElSRUNUT1JJRVMgJHtHU0xfTElOS19ESVJFQ1RPUklFU19XSVRIX1BSRUZJWH0gKQorICAgICAgRU5ESUYgKEdTTF9MSU5LX0RJUkVDVE9SSUVTX1dJVEhfUFJFRklYKQorICAgICAgU0VUKEdTTF9FWEVfTElOS0VSX0ZMQUdTICItV2wsLXJwYXRoLCR7R1NMX0xJTktfRElSRUNUT1JJRVN9IiBDQUNIRSBTVFJJTkcgSU5URVJOQUwpCisgICAgICAjICAgICAgTUVTU0FHRSgiREJHICBHU0xfTElOS19ESVJFQ1RPUklFUz0ke0dTTF9MSU5LX0RJUkVDVE9SSUVTfSIpCisgICAgICAjICAgICAgTUVTU0FHRSgiREJHICBHU0xfRVhFX0xJTktFUl9GTEFHUz0ke0dTTF9FWEVfTElOS0VSX0ZMQUdTfSIpCisKKyAgICAgICMgICAgICBBRERfREVGSU5JVElPTlMoIi1ESEFWRV9HU0wiKQorICAgICAgIyAgICAgIFNFVChHU0xfREVGSU5JVElPTlMgIi1ESEFWRV9HU0wiKQorICAgICAgTUFSS19BU19BRFZBTkNFRCgKKyAgICAgICAgR1NMX0NYWF9GTEFHUworICAgICAgICBHU0xfSU5DTFVERV9ESVIKKyAgICAgICAgR1NMX0xJQlJBUklFUworICAgICAgICBHU0xfTElOS19ESVJFQ1RPUklFUworICAgICAgICBHU0xfREVGSU5JVElPTlMKKyAgICAgICAgKQorICAgICAgTUVTU0FHRShTVEFUVVMgIlVzaW5nIEdTTCBmcm9tICR7R1NMX1BSRUZJWH0iKQorICAgICAgCisgICAgRUxTRShHU0xfQ09ORklHKQorICAgICAgTUVTU0FHRSgiRmluZEdTTC5jbWFrZTogZ3NsLWNvbmZpZyBub3QgZm91bmQuIFBsZWFzZSBzZXQgaXQgbWFudWFsbHkuIEdTTF9DT05GSUc9JHtHU0xfQ09ORklHfSIpCisgICAgRU5ESUYoR1NMX0NPTkZJRykKKworICBFTkRJRihVTklYKQorRU5ESUYoV0lOMzIpCisKKworSUYoR1NMX0xJQlJBUklFUykKKyAgSUYoR1NMX0lOQ0xVREVfRElSIE9SIEdTTF9DWFhfRkxBR1MpCisKKyAgICBTRVQoR1NMX0ZPVU5EIDEpCisgICAgCisgIEVORElGKEdTTF9JTkNMVURFX0RJUiBPUiBHU0xfQ1hYX0ZMQUdTKQorRU5ESUYoR1NMX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRHb29nbGVIYXNoLmNtYWtlIGIvY21ha2UvRmluZEdvb2dsZUhhc2guY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhODFhMAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRHb29nbGVIYXNoLmNtYWtlCkBAIC0wLDAgKzEsMjMgQEAKKworaWYgKEdPT0dMRUhBU0hfSU5DTFVERVMgQU5EIEdPT0dMRUhBU0hfTElCUkFSSUVTKQorICBzZXQoR09PR0xFSEFTSF9GSU5EX1FVSUVUTFkgVFJVRSkKK2VuZGlmIChHT09HTEVIQVNIX0lOQ0xVREVTIEFORCBHT09HTEVIQVNIX0xJQlJBUklFUykKKworZmluZF9wYXRoKEdPT0dMRUhBU0hfSU5DTFVERVMKKyAgTkFNRVMKKyAgZ29vZ2xlL2RlbnNlX2hhc2hfbWFwCisgIFBBVEhTCisgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKykKKworaWYoR09PR0xFSEFTSF9JTkNMVURFUykKKyAgIyBsZXQncyBtYWtlIHN1cmUgaXQgY29tcGlsZXMgd2l0aCB0aGUgY3VycmVudCBjb21waWxlcgorICBmaWxlKFdSSVRFICR7Q01BS0VfQklOQVJZX0RJUn0vZ29vZ2xlaGFzaF90ZXN0LmNwcAorICAiI2luY2x1ZGUgPGdvb2dsZS9zcGFyc2VfaGFzaF9tYXA+XG4jaW5jbHVkZSA8Z29vZ2xlL2RlbnNlX2hhc2hfbWFwPlxuaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7IGdvb2dsZTo6ZGVuc2VfaGFzaF9tYXA8aW50LGZsb2F0PiBhOyBnb29nbGU6OnNwYXJzZV9oYXNoX21hcDxpbnQsZmxvYXQ+IGI7IHJldHVybiAwO31cbiIpCisgIHRyeV9jb21waWxlKEdPT0dMRUhBU0hfQ09NUElMRSAke0NNQUtFX0JJTkFSWV9ESVJ9ICR7Q01BS0VfQklOQVJZX0RJUn0vZ29vZ2xlaGFzaF90ZXN0LmNwcCBPVVRQVVRfVkFSSUFCTEUgR09PR0xFSEFTSF9DT01QSUxFX1JFU1VMVCkKK2VuZGlmKEdPT0dMRUhBU0hfSU5DTFVERVMpCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR09PR0xFSEFTSCBERUZBVUxUX01TRyBHT09HTEVIQVNIX0lOQ0xVREVTIEdPT0dMRUhBU0hfQ09NUElMRSkKKworbWFya19hc19hZHZhbmNlZChHT09HTEVIQVNIX0lOQ0xVREVTKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZExBUEFDSy5jbWFrZSBiL2NtYWtlL0ZpbmRMQVBBQ0suY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYWUyMQotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRMQVBBQ0suY21ha2UKQEAgLTAsMCArMSwyNzMgQEAKKyMgRmluZCBMQVBBQ0sgbGlicmFyeQorIworIyBUaGlzIG1vZHVsZSBmaW5kcyBhbiBpbnN0YWxsZWQgbGlicmFyeSB0aGF0IGltcGxlbWVudHMgdGhlIExBUEFDSworIyBsaW5lYXItYWxnZWJyYSBpbnRlcmZhY2UgKHNlZSBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrLykuCisjIFRoZSBhcHByb2FjaCBmb2xsb3dzIG1vc3RseSB0aGF0IHRha2VuIGZvciB0aGUgYXV0b2NvbmYgbWFjcm8gZmlsZSwgYWN4X2xhcGFjay5tNAorIyAoZGlzdHJpYnV0ZWQgYXQgaHR0cDovL2FjLWFyY2hpdmUuc291cmNlZm9yZ2UubmV0L2FjLWFyY2hpdmUvYWN4X2xhcGFjay5odG1sKS4KKyMKKyMgVGhpcyBtb2R1bGUgc2V0cyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKyMgIExBUEFDS19GT1VORCAtIHNldCB0byB0cnVlIGlmIGEgbGlicmFyeSBpbXBsZW1lbnRpbmcgdGhlIExBUEFDSyBpbnRlcmZhY2UKKyMgICAgaXMgZm91bmQKKyMgIExBUEFDS19JTkNMVURFX0RJUiAtIERpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIExBUEFDSyBoZWFkZXIgZmlsZXMKKyMgIExBUEFDS19ERUZJTklUSU9OUyAtIENvbXBpbGF0aW9uIG9wdGlvbnMgdG8gdXNlIExBUEFDSworIyAgTEFQQUNLX0xJTktFUl9GTEFHUyAtIExpbmtlciBmbGFncyB0byB1c2UgTEFQQUNLIChleGNsdWRpbmcgLWwKKyMgICAgYW5kIC1MKS4KKyMgIExBUEFDS19MSUJSQVJJRVNfRElSIC0gRGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgTEFQQUNLIGxpYnJhcmllcy4KKyMgICAgIE1heSBiZSBudWxsIGlmIExBUEFDS19MSUJSQVJJRVMgY29udGFpbnMgbGlicmFyaWVzIG5hbWUgdXNpbmcgZnVsbCBwYXRoLgorIyAgTEFQQUNLX0xJQlJBUklFUyAtIExpc3Qgb2YgbGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdCBMQVBBQ0sgaW50ZXJmYWNlLgorIyAgICAgTWF5IGJlIG51bGwgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGF1dG8tbGluayAoZS5nLiBWQysrKS4KKyMgIExBUEFDS19VU0VfRklMRSAtIFRoZSBuYW1lIG9mIHRoZSBjbWFrZSBtb2R1bGUgdG8gaW5jbHVkZSB0byBjb21waWxlCisjICAgICBhcHBsaWNhdGlvbnMgb3IgbGlicmFyaWVzIHVzaW5nIExBUEFDSy4KKyMKKyMgVGhpcyBtb2R1bGUgd2FzIG1vZGlmaWVkIGJ5IENHQUwgdGVhbToKKyMgLSBmaW5kIGxpYnJhcmllcyBmb3IgYSBDKysgY29tcGlsZXIsIGluc3RlYWQgb2YgRm9ydHJhbgorIyAtIGFkZGVkIExBUEFDS19JTkNMVURFX0RJUiwgTEFQQUNLX0RFRklOSVRJT05TIGFuZCBMQVBBQ0tfTElCUkFSSUVTX0RJUgorIyAtIHJlbW92ZWQgTEFQQUNLOTVfTElCUkFSSUVTCisKKworaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQorCisjIFRoaXMgbWFjcm8gY2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBjb21iaW5hdGlvbiBvZiBmb3J0cmFuIGxpYnJhcmllcworIyBnaXZlbiBieSBfbGlzdC4gIElmIHRoZSBjb21iaW5hdGlvbiBpcyBmb3VuZCwgdGhpcyBtYWNybyBjaGVja3MgKHVzaW5nIHRoZQorIyBjaGVja19mdW5jdGlvbl9leGlzdHMgbWFjcm8pIHdoZXRoZXIgY2FuIGxpbmsgYWdhaW5zdCB0aGF0IGxpYnJhcnkKKyMgY29tYmluYXRpb24gdXNpbmcgdGhlIG5hbWUgb2YgYSByb3V0aW5lIGdpdmVuIGJ5IF9uYW1lIHVzaW5nIHRoZSBsaW5rZXIKKyMgZmxhZ3MgZ2l2ZW4gYnkgX2ZsYWdzLiAgSWYgdGhlIGNvbWJpbmF0aW9uIG9mIGxpYnJhcmllcyBpcyBmb3VuZCBhbmQgcGFzc2VzCisjIHRoZSBsaW5rIHRlc3QsIExJQlJBUklFUyBpcyBzZXQgdG8gdGhlIGxpc3Qgb2YgY29tcGxldGUgbGlicmFyeSBwYXRocyB0aGF0CisjIGhhdmUgYmVlbiBmb3VuZCBhbmQgREVGSU5JVElPTlMgdG8gdGhlIHJlcXVpcmVkIGRlZmluaXRpb25zLgorIyBPdGhlcndpc2UsIExJQlJBUklFUyBpcyBzZXQgdG8gRkFMU0UuCisjIE4uQi4gX3ByZWZpeCBpcyB0aGUgcHJlZml4IGFwcGxpZWQgdG8gdGhlIG5hbWVzIG9mIGFsbCBjYWNoZWQgdmFyaWFibGVzIHRoYXQKKyMgYXJlIGdlbmVyYXRlZCBpbnRlcm5hbGx5IGFuZCBtYXJrZWQgYWR2YW5jZWQgYnkgdGhpcyBtYWNyby4KK21hY3JvKGNoZWNrX2xhcGFja19saWJyYXJpZXMgREVGSU5JVElPTlMgTElCUkFSSUVTIF9wcmVmaXggX25hbWUgX2ZsYWdzIF9saXN0IF9ibGFzIF9wYXRoKQorICAjbWVzc2FnZSgiREVCVUc6IGNoZWNrX2xhcGFja19saWJyYXJpZXMoJHtfbGlzdH0gaW4gJHtfcGF0aH0gd2l0aCAke19ibGFzfSkiKQorCisgICMgQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGxpYnJhcmllcyBnaXZlbiBieSBfbGlzdAorICBzZXQoX2xpYnJhcmllc19mb3VuZCBUUlVFKQorICBzZXQoX2xpYnJhcmllc193b3JrIEZBTFNFKQorICBzZXQoJHtERUZJTklUSU9OU30gIiIpCisgIHNldCgke0xJQlJBUklFU30gIiIpCisgIHNldChfY29tYmluZWRfbmFtZSkKKyAgZm9yZWFjaChfbGlicmFyeSAke19saXN0fSkKKyAgICBzZXQoX2NvbWJpbmVkX25hbWUgJHtfY29tYmluZWRfbmFtZX1fJHtfbGlicmFyeX0pCisKKyAgICBpZihfbGlicmFyaWVzX2ZvdW5kKQorICAgICAgIyBzZWFyY2ggZmlyc3QgaW4gJHtfcGF0aH0KKyAgICAgIGZpbmRfbGlicmFyeSgke19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUlkKKyAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICBQQVRIUyAke19wYXRofSBOT19ERUZBVUxUX1BBVEgKKyAgICAgICAgICAgICAgICAgICkKKyAgICAgICMgaWYgbm90IGZvdW5kLCBzZWFyY2ggaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzeXN0ZW0KKyAgICAgIGlmICggV0lOMzIgKQorICAgICAgICBmaW5kX2xpYnJhcnkoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZCisgICAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICAgIFBBVEhTIEVOViBMSUIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgZWxzZWlmICggQVBQTEUgKQorICAgICAgICBmaW5kX2xpYnJhcnkoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZCisgICAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICAgIFBBVEhTIC91c3IvbG9jYWwvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliNjQgL3Vzci9saWI2NCBFTlYgRFlMRF9MSUJSQVJZX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgZWxzZSAoKQorICAgICAgICBmaW5kX2xpYnJhcnkoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZCisgICAgICAgICAgICAgICAgICAgIE5BTUVTICR7X2xpYnJhcnl9CisgICAgICAgICAgICAgICAgICAgIFBBVEhTIC91c3IvbG9jYWwvbGliIC91c3IvbGliIC91c3IvbG9jYWwvbGliNjQgL3Vzci9saWI2NCBFTlYgTERfTElCUkFSWV9QQVRICisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgIGVuZGlmKCkKKyAgICAgIG1hcmtfYXNfYWR2YW5jZWQoJHtfcHJlZml4fV8ke19saWJyYXJ5fV9MSUJSQVJZKQorICAgICAgc2V0KCR7TElCUkFSSUVTfSAkeyR7TElCUkFSSUVTfX0gJHske19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUll9KQorICAgICAgc2V0KF9saWJyYXJpZXNfZm91bmQgJHske19wcmVmaXh9XyR7X2xpYnJhcnl9X0xJQlJBUll9KQorICAgIGVuZGlmKF9saWJyYXJpZXNfZm91bmQpCisgIGVuZGZvcmVhY2goX2xpYnJhcnkgJHtfbGlzdH0pCisgIGlmKF9saWJyYXJpZXNfZm91bmQpCisgICAgc2V0KF9saWJyYXJpZXNfZm91bmQgJHske0xJQlJBUklFU319KQorICBlbmRpZigpCisKKyAgIyBUZXN0IHRoaXMgY29tYmluYXRpb24gb2YgbGlicmFyaWVzIHdpdGggdGhlIEZvcnRyYW4vZjJjIGludGVyZmFjZS4KKyAgIyBXZSB0ZXN0IHRoZSBGb3J0cmFuIGludGVyZmFjZSBmaXJzdCBhcyBpdCBpcyB3ZWxsIHN0YW5kYXJkaXplZC4KKyAgaWYoX2xpYnJhcmllc19mb3VuZCBBTkQgTk9UIF9saWJyYXJpZXNfd29yaykKKyAgICBzZXQoJHtERUZJTklUSU9OU30gICItRCR7X3ByZWZpeH1fVVNFX0YyQyIpCisgICAgc2V0KCR7TElCUkFSSUVTfSAgICAke19saWJyYXJpZXNfZm91bmR9KQorICAgICMgU29tZSBDKysgbGlua2VycyByZXF1aXJlIHRoZSBmMmMgbGlicmFyeSB0byBsaW5rIHdpdGggRm9ydHJhbiBsaWJyYXJpZXMuCisgICAgIyBJIGRvIG5vdCBrbm93IHdoaWNoIG9uZXMsIHRodXMgSSBqdXN0IGFkZCB0aGUgZjJjIGxpYnJhcnkgaWYgaXQgaXMgYXZhaWxhYmxlLgorICAgIGZpbmRfcGFja2FnZSggRjJDIFFVSUVUICkKKyAgICBpZiAoIEYyQ19GT1VORCApCisgICAgICBzZXQoJHtERUZJTklUSU9OU30gICR7JHtERUZJTklUSU9OU319ICR7RjJDX0RFRklOSVRJT05TfSkKKyAgICAgIHNldCgke0xJQlJBUklFU30gICAgJHske0xJQlJBUklFU319ICR7RjJDX0xJQlJBUklFU30pCisgICAgZW5kaWYoKQorICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAgJHske0RFRklOSVRJT05TfX0pCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAgICAke19mbGFnc30gJHske0xJQlJBUklFU319ICR7X2JsYXN9KQorICAgICNtZXNzYWdlKCJERUJVRzogQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgPSAke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSIpCisgICAgI21lc3NhZ2UoIkRFQlVHOiBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgPSAke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQorICAgICMgQ2hlY2sgaWYgZnVuY3Rpb24gZXhpc3RzIHdpdGggZjJjIGNhbGxpbmcgY29udmVudGlvbiAoaWUgYSB0cmFpbGluZyB1bmRlcnNjb3JlKQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cygke19uYW1lfV8gJHtfcHJlZml4fV8ke19uYW1lfV8ke19jb21iaW5lZF9uYW1lfV9mMmNfV09SS1MpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSAiIikKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICAgICIiKQorICAgIG1hcmtfYXNfYWR2YW5jZWQoJHtfcHJlZml4fV8ke19uYW1lfV8ke19jb21iaW5lZF9uYW1lfV9mMmNfV09SS1MpCisgICAgc2V0KF9saWJyYXJpZXNfd29yayAkeyR7X3ByZWZpeH1fJHtfbmFtZX1fJHtfY29tYmluZWRfbmFtZX1fZjJjX1dPUktTfSkKKyAgZW5kaWYoX2xpYnJhcmllc19mb3VuZCBBTkQgTk9UIF9saWJyYXJpZXNfd29yaykKKworICAjIElmIG5vdCBmb3VuZCwgdGVzdCB0aGlzIGNvbWJpbmF0aW9uIG9mIGxpYnJhcmllcyB3aXRoIGEgQyBpbnRlcmZhY2UuCisgICMgQSBmZXcgaW1wbGVtZW50YXRpb25zIChpZSBBQ01MKSBwcm92aWRlIGEgQyBpbnRlcmZhY2UuIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHN0YW5kYXJkLgorICBpZihfbGlicmFyaWVzX2ZvdW5kIEFORCBOT1QgX2xpYnJhcmllc193b3JrKQorICAgIHNldCgke0RFRklOSVRJT05TfSAiIikKKyAgICBzZXQoJHtMSUJSQVJJRVN9ICAgJHtfbGlicmFyaWVzX2ZvdW5kfSkKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiIpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAgICR7X2ZsYWdzfSAkeyR7TElCUkFSSUVTfX0gJHtfYmxhc30pCisgICAgI21lc3NhZ2UoIkRFQlVHOiBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgPSAke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQorICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cygke19uYW1lfSAke19wcmVmaXh9XyR7X25hbWV9JHtfY29tYmluZWRfbmFtZX1fV09SS1MpCisgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAiIikKKyAgICBtYXJrX2FzX2FkdmFuY2VkKCR7X3ByZWZpeH1fJHtfbmFtZX0ke19jb21iaW5lZF9uYW1lfV9XT1JLUykKKyAgICBzZXQoX2xpYnJhcmllc193b3JrICR7JHtfcHJlZml4fV8ke19uYW1lfSR7X2NvbWJpbmVkX25hbWV9X1dPUktTfSkKKyAgZW5kaWYoX2xpYnJhcmllc19mb3VuZCBBTkQgTk9UIF9saWJyYXJpZXNfd29yaykKKworICAjIG9uIGZhaWx1cmUKKyAgaWYoTk9UIF9saWJyYXJpZXNfd29yaykKKyAgICBzZXQoJHtERUZJTklUSU9OU30gIiIpCisgICAgc2V0KCR7TElCUkFSSUVTfSAgIEZBTFNFKQorICBlbmRpZigpCisgICNtZXNzYWdlKCJERUJVRzogJHtERUZJTklUSU9OU30gPSAkeyR7REVGSU5JVElPTlN9fSIpCisgICNtZXNzYWdlKCJERUJVRzogJHtMSUJSQVJJRVN9ID0gJHske0xJQlJBUklFU319IikKK2VuZG1hY3JvKGNoZWNrX2xhcGFja19saWJyYXJpZXMpCisKKworIworIyBtYWluCisjCisKKyMgTEFQQUNLIHJlcXVpcmVzIEJMQVMKK2lmKExBUEFDS19GSU5EX1FVSUVUTFkgT1IgTk9UIExBUEFDS19GSU5EX1JFUVVJUkVEKQorICBmaW5kX3BhY2thZ2UoQkxBUykKK2Vsc2UoKQorICBmaW5kX3BhY2thZ2UoQkxBUyBSRVFVSVJFRCkKK2VuZGlmKCkKKworaWYgKE5PVCBCTEFTX0ZPVU5EKQorCisgIG1lc3NhZ2UoU1RBVFVTICJMQVBBQ0sgcmVxdWlyZXMgQkxBUy4iKQorICBzZXQoTEFQQUNLX0ZPVU5EIEZBTFNFKQorCisjIElzIGl0IGFscmVhZHkgY29uZmlndXJlZD8KK2Vsc2VpZiAoTEFQQUNLX0xJQlJBUklFU19ESVIgT1IgTEFQQUNLX0xJQlJBUklFUykKKworICBzZXQoTEFQQUNLX0ZPVU5EIFRSVUUpCisKK2Vsc2UoKQorCisgICMgcmVzZXQgdmFyaWFibGVzCisgIHNldCggTEFQQUNLX0lOQ0xVREVfRElSICIiICkKKyAgc2V0KCBMQVBBQ0tfREVGSU5JVElPTlMgIiIgKQorICBzZXQoIExBUEFDS19MSU5LRVJfRkxBR1MgIiIgKSAjIHVudXNlZCAoeWV0KQorICBzZXQoIExBUEFDS19MSUJSQVJJRVMgIiIgKQorICBzZXQoIExBUEFDS19MSUJSQVJJRVNfRElSICIiICkKKworICAgICMKKyAgICAjIElmIFVuaXgsIHNlYXJjaCBmb3IgTEFQQUNLIGZ1bmN0aW9uIGluIHBvc3NpYmxlIGxpYnJhcmllcworICAgICMKKworICAgICNpbnRlbCBta2wgbGFwYWNrPworICAgIGlmKE5PVCBMQVBBQ0tfTElCUkFSSUVTKQorICAgICAgY2hlY2tfbGFwYWNrX2xpYnJhcmllcygKKyAgICAgIExBUEFDS19ERUZJTklUSU9OUworICAgICAgTEFQQUNLX0xJQlJBUklFUworICAgICAgTEFQQUNLCisgICAgICBjaGVldgorICAgICAgIiIKKyAgICAgICJta2xfbGFwYWNrIgorICAgICAgIiR7QkxBU19MSUJSQVJJRVN9IgorICAgICAgIiR7Q0dBTF9UQVVDU19MSUJSQVJJRVNfRElSfSBFTlYgTEFQQUNLX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgI2FjbWwgbGFwYWNrPworICAgIGlmKE5PVCBMQVBBQ0tfTElCUkFSSUVTKQorICAgICAgY2hlY2tfbGFwYWNrX2xpYnJhcmllcygKKyAgICAgIExBUEFDS19ERUZJTklUSU9OUworICAgICAgTEFQQUNLX0xJQlJBUklFUworICAgICAgTEFQQUNLCisgICAgICBjaGVldgorICAgICAgIiIKKyAgICAgICJhY21sIgorICAgICAgIiR7QkxBU19MSUJSQVJJRVN9IgorICAgICAgIiR7Q0dBTF9UQVVDU19MSUJSQVJJRVNfRElSfSBFTlYgTEFQQUNLX0xJQl9ESVIiCisgICAgICApCisgICAgZW5kaWYoKQorCisgICAgIyBBcHBsZSBMQVBBQ0sgbGlicmFyeT8KKyAgICBpZihOT1QgTEFQQUNLX0xJQlJBUklFUykKKyAgICAgIGNoZWNrX2xhcGFja19saWJyYXJpZXMoCisgICAgICBMQVBBQ0tfREVGSU5JVElPTlMKKyAgICAgIExBUEFDS19MSUJSQVJJRVMKKyAgICAgIExBUEFDSworICAgICAgY2hlZXYKKyAgICAgICIiCisgICAgICAiQWNjZWxlcmF0ZSIKKyAgICAgICIke0JMQVNfTElCUkFSSUVTfSIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIExBUEFDS19MSUJfRElSIgorICAgICAgKQorICAgIGVuZGlmKCkKKworICAgIGlmICggTk9UIExBUEFDS19MSUJSQVJJRVMgKQorICAgICAgY2hlY2tfbGFwYWNrX2xpYnJhcmllcygKKyAgICAgIExBUEFDS19ERUZJTklUSU9OUworICAgICAgTEFQQUNLX0xJQlJBUklFUworICAgICAgTEFQQUNLCisgICAgICBjaGVldgorICAgICAgIiIKKyAgICAgICJ2ZWNMaWIiCisgICAgICAiJHtCTEFTX0xJQlJBUklFU30iCisgICAgICAiJHtDR0FMX1RBVUNTX0xJQlJBUklFU19ESVJ9IEVOViBMQVBBQ0tfTElCX0RJUiIKKyAgICAgICkKKyAgICBlbmRpZiAoIE5PVCBMQVBBQ0tfTElCUkFSSUVTICkKKworICAgICMgR2VuZXJpYyBMQVBBQ0sgbGlicmFyeT8KKyAgICAjIFRoaXMgY29uZmlndXJhdGlvbiAqbXVzdCogYmUgdGhlIGxhc3QgdHJ5IGFzIHRoaXMgbGlicmFyeSBpcyBub3RhYmx5IHNsb3cuCisgICAgaWYgKCBOT1QgTEFQQUNLX0xJQlJBUklFUyApCisgICAgICBjaGVja19sYXBhY2tfbGlicmFyaWVzKAorICAgICAgTEFQQUNLX0RFRklOSVRJT05TCisgICAgICBMQVBBQ0tfTElCUkFSSUVTCisgICAgICBMQVBBQ0sKKyAgICAgIGNoZWV2CisgICAgICAiIgorICAgICAgImxhcGFjayIKKyAgICAgICIke0JMQVNfTElCUkFSSUVTfSIKKyAgICAgICIke0NHQUxfVEFVQ1NfTElCUkFSSUVTX0RJUn0gRU5WIExBUEFDS19MSUJfRElSIgorICAgICAgKQorICAgIGVuZGlmKCkKKworICBpZihMQVBBQ0tfTElCUkFSSUVTX0RJUiBPUiBMQVBBQ0tfTElCUkFSSUVTKQorICAgIHNldChMQVBBQ0tfRk9VTkQgVFJVRSkKKyAgZWxzZSgpCisgICAgc2V0KExBUEFDS19GT1VORCBGQUxTRSkKKyAgZW5kaWYoKQorCisgIGlmKE5PVCBMQVBBQ0tfRklORF9RVUlFVExZKQorICAgIGlmKExBUEFDS19GT1VORCkKKyAgICAgIG1lc3NhZ2UoU1RBVFVTICJBIGxpYnJhcnkgd2l0aCBMQVBBQ0sgQVBJIGZvdW5kLiIpCisgICAgZWxzZShMQVBBQ0tfRk9VTkQpCisgICAgICBpZihMQVBBQ0tfRklORF9SRVFVSVJFRCkKKyAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQSByZXF1aXJlZCBsaWJyYXJ5IHdpdGggTEFQQUNLIEFQSSBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IGxpYnJhcnkgbG9jYXRpb24uIikKKyAgICAgIGVsc2UoKQorICAgICAgICBtZXNzYWdlKFNUQVRVUyAiQSBsaWJyYXJ5IHdpdGggTEFQQUNLIEFQSSBub3QgZm91bmQuIFBsZWFzZSBzcGVjaWZ5IGxpYnJhcnkgbG9jYXRpb24uIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbmRpZihMQVBBQ0tfRk9VTkQpCisgIGVuZGlmKE5PVCBMQVBBQ0tfRklORF9RVUlFVExZKQorCisgICMgQWRkIHZhcmlhYmxlcyB0byBjYWNoZQorICBzZXQoIExBUEFDS19JTkNMVURFX0RJUiAgICIke0xBUEFDS19JTkNMVURFX0RJUn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgUEFUSCAiRGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgTEFQQUNLIGhlYWRlciBmaWxlcyIgRk9SQ0UgKQorICBzZXQoIExBUEFDS19ERUZJTklUSU9OUyAgICIke0xBUEFDS19ERUZJTklUSU9OU30iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgU1RSSU5HICJDb21waWxhdGlvbiBvcHRpb25zIHRvIHVzZSBMQVBBQ0siIEZPUkNFICkKKyAgc2V0KCBMQVBBQ0tfTElOS0VSX0ZMQUdTICAiJHtMQVBBQ0tfTElOS0VSX0ZMQUdTfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRSBTVFJJTkcgIkxpbmtlciBmbGFncyB0byB1c2UgTEFQQUNLIiBGT1JDRSApCisgIHNldCggTEFQQUNLX0xJQlJBUklFUyAgICAgIiR7TEFQQUNLX0xJQlJBUklFU30iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgRklMRVBBVEggIkxBUEFDSyBsaWJyYXJpZXMgbmFtZSIgRk9SQ0UgKQorICBzZXQoIExBUEFDS19MSUJSQVJJRVNfRElSICIke0xBUEFDS19MSUJSQVJJRVNfRElSfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRSBQQVRIICJEaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBMQVBBQ0sgbGlicmFyaWVzIiBGT1JDRSApCisKKyAgI21lc3NhZ2UoIkRFQlVHOiBMQVBBQ0tfSU5DTFVERV9ESVIgPSAke0xBUEFDS19JTkNMVURFX0RJUn0iKQorICAjbWVzc2FnZSgiREVCVUc6IExBUEFDS19ERUZJTklUSU9OUyA9ICR7TEFQQUNLX0RFRklOSVRJT05TfSIpCisgICNtZXNzYWdlKCJERUJVRzogTEFQQUNLX0xJTktFUl9GTEFHUyA9ICR7TEFQQUNLX0xJTktFUl9GTEFHU30iKQorICAjbWVzc2FnZSgiREVCVUc6IExBUEFDS19MSUJSQVJJRVMgPSAke0xBUEFDS19MSUJSQVJJRVN9IikKKyAgI21lc3NhZ2UoIkRFQlVHOiBMQVBBQ0tfTElCUkFSSUVTX0RJUiA9ICR7TEFQQUNLX0xJQlJBUklFU19ESVJ9IikKKyAgI21lc3NhZ2UoIkRFQlVHOiBMQVBBQ0tfRk9VTkQgPSAke0xBUEFDS19GT1VORH0iKQorCitlbmRpZihOT1QgQkxBU19GT1VORCkKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRNUEZSLmNtYWtlIGIvY21ha2UvRmluZE1QRlIuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0YzJjZAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRNUEZSLmNtYWtlCkBAIC0wLDAgKzEsODMgQEAKKyMgVHJ5IHRvIGZpbmQgdGhlIE1QRlIgbGlicmFyeQorIyBTZWUgaHR0cDovL3d3dy5tcGZyLm9yZy8KKyMKKyMgVGhpcyBtb2R1bGUgc3VwcG9ydHMgcmVxdWlyaW5nIGEgbWluaW11bSB2ZXJzaW9uLCBlLmcuIHlvdSBjYW4gZG8KKyMgICBmaW5kX3BhY2thZ2UoTVBGUiAyLjMuMCkKKyMgdG8gcmVxdWlyZSB2ZXJzaW9uIDIuMy4wIHRvIG5ld2VyIG9mIE1QRlIuCisjCisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBNUEZSX0ZPVU5EIC0gc3lzdGVtIGhhcyBNUEZSIGxpYiB3aXRoIGNvcnJlY3QgdmVyc2lvbgorIyAgTVBGUl9JTkNMVURFUyAtIHRoZSBNUEZSIGluY2x1ZGUgZGlyZWN0b3J5CisjICBNUEZSX0xJQlJBUklFUyAtIHRoZSBNUEZSIGxpYnJhcnkKKyMgIE1QRlJfVkVSU0lPTiAtIE1QRlIgdmVyc2lvbgorCisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBNb250ZWwgTGF1cmVudCwgPG1vbnRlbEBrZGUub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgR2FlbCBHdWVubmViYXVkLCA8Zy5nYWVsQGZyZWUuZnI+CisjIENvcHlyaWdodCAoYykgMjAxMCBKaXRzZSBOaWVzZW4sIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpcyBhbGxvd2VkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEJTRCBsaWNlbnNlLgorCisjIFNldCBNUEZSX0lOQ0xVREVTCisKK2ZpbmRfcGF0aChNUEZSX0lOQ0xVREVTCisgIE5BTUVTCisgIG1wZnIuaAorICBQQVRIUworICAkRU5We0dNUERJUn0KKyAgJHtJTkNMVURFX0lOU1RBTExfRElSfQorKQorCisjIFNldCBNUEZSX0ZJTkRfVkVSU0lPTiB0byAxLjAuMCBpZiBubyBtaW5pbXVtIHZlcnNpb24gaXMgc3BlY2lmaWVkCisKK2lmKE5PVCBNUEZSX0ZJTkRfVkVSU0lPTikKKyAgaWYoTk9UIE1QRlJfRklORF9WRVJTSU9OX01BSk9SKQorICAgIHNldChNUEZSX0ZJTkRfVkVSU0lPTl9NQUpPUiAxKQorICBlbmRpZihOT1QgTVBGUl9GSU5EX1ZFUlNJT05fTUFKT1IpCisgIGlmKE5PVCBNUEZSX0ZJTkRfVkVSU0lPTl9NSU5PUikKKyAgICBzZXQoTVBGUl9GSU5EX1ZFUlNJT05fTUlOT1IgMCkKKyAgZW5kaWYoTk9UIE1QRlJfRklORF9WRVJTSU9OX01JTk9SKQorICBpZihOT1QgTVBGUl9GSU5EX1ZFUlNJT05fUEFUQ0gpCisgICAgc2V0KE1QRlJfRklORF9WRVJTSU9OX1BBVENIIDApCisgIGVuZGlmKE5PVCBNUEZSX0ZJTkRfVkVSU0lPTl9QQVRDSCkKKworICBzZXQoTVBGUl9GSU5EX1ZFUlNJT04gIiR7TVBGUl9GSU5EX1ZFUlNJT05fTUFKT1J9LiR7TVBGUl9GSU5EX1ZFUlNJT05fTUlOT1J9LiR7TVBGUl9GSU5EX1ZFUlNJT05fUEFUQ0h9IikKK2VuZGlmKE5PVCBNUEZSX0ZJTkRfVkVSU0lPTikKKworCitpZihNUEZSX0lOQ0xVREVTKQorCisgICMgU2V0IE1QRlJfVkVSU0lPTgorICAKKyAgZmlsZShSRUFEICIke01QRlJfSU5DTFVERVN9L21wZnIuaCIgX21wZnJfdmVyc2lvbl9oZWFkZXIpCisgIAorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK01QRlJfVkVSU0lPTl9NQUpPUlsgXHRdKyhbMC05XSspIiBfbXBmcl9tYWpvcl92ZXJzaW9uX21hdGNoICIke19tcGZyX3ZlcnNpb25faGVhZGVyfSIpCisgIHNldChNUEZSX01BSk9SX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK01QRlJfVkVSU0lPTl9NSU5PUlsgXHRdKyhbMC05XSspIiBfbXBmcl9taW5vcl92ZXJzaW9uX21hdGNoICIke19tcGZyX3ZlcnNpb25faGVhZGVyfSIpCisgIHNldChNUEZSX01JTk9SX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggImRlZmluZVsgXHRdK01QRlJfVkVSU0lPTl9QQVRDSExFVkVMWyBcdF0rKFswLTldKykiIF9tcGZyX3BhdGNobGV2ZWxfdmVyc2lvbl9tYXRjaCAiJHtfbXBmcl92ZXJzaW9uX2hlYWRlcn0iKQorICBzZXQoTVBGUl9QQVRDSExFVkVMX1ZFUlNJT04gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAKKyAgc2V0KE1QRlJfVkVSU0lPTiAke01QRlJfTUFKT1JfVkVSU0lPTn0uJHtNUEZSX01JTk9SX1ZFUlNJT059LiR7TVBGUl9QQVRDSExFVkVMX1ZFUlNJT059KQorICAKKyAgIyBDaGVjayB3aGV0aGVyIGZvdW5kIHZlcnNpb24gZXhjZWVkcyBtaW5pbXVtIHZlcnNpb24KKyAgCisgIGlmKCR7TVBGUl9WRVJTSU9OfSBWRVJTSU9OX0xFU1MgJHtNUEZSX0ZJTkRfVkVSU0lPTn0pCisgICAgc2V0KE1QRlJfVkVSU0lPTl9PSyBGQUxTRSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiTVBGUiB2ZXJzaW9uICR7TVBGUl9WRVJTSU9OfSBmb3VuZCBpbiAke01QRlJfSU5DTFVERVN9LCAiCisgICAgICAgICAgICAgICAgICAgImJ1dCBhdCBsZWFzdCB2ZXJzaW9uICR7TVBGUl9GSU5EX1ZFUlNJT059IGlzIHJlcXVpcmVkIikKKyAgZWxzZSgke01QRlJfVkVSU0lPTn0gVkVSU0lPTl9MRVNTICR7TVBGUl9GSU5EX1ZFUlNJT059KQorICAgIHNldChNUEZSX1ZFUlNJT05fT0sgVFJVRSkKKyAgZW5kaWYoJHtNUEZSX1ZFUlNJT059IFZFUlNJT05fTEVTUyAke01QRlJfRklORF9WRVJTSU9OfSkKKworZW5kaWYoTVBGUl9JTkNMVURFUykKKworIyBTZXQgTVBGUl9MSUJSQVJJRVMKKworZmluZF9saWJyYXJ5KE1QRlJfTElCUkFSSUVTIG1wZnIgUEFUSFMgJEVOVntHTVBESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworIyBFcGlsb2d1ZQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKE1QRlIgREVGQVVMVF9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEZSX0lOQ0xVREVTIE1QRlJfTElCUkFSSUVTIE1QRlJfVkVSU0lPTl9PSykKK21hcmtfYXNfYWR2YW5jZWQoTVBGUl9JTkNMVURFUyBNUEZSX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRNZXRpcy5jbWFrZSBiL2NtYWtlL0ZpbmRNZXRpcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQ2ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZE1ldGlzLmNtYWtlCkBAIC0wLDAgKzEsMjQgQEAKKyMgUGFzdGl4IHJlcXVpcmVzIE1FVElTIG9yIE1FVElTIChwYXJ0aXRpb25pbmcgYW5kIHJlb3JkZXJpbmcgdG9vbHMpCisKK2lmIChNRVRJU19JTkNMVURFUyBBTkQgTUVUSVNfTElCUkFSSUVTKQorICBzZXQoTUVUSVNfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoTUVUSVNfSU5DTFVERVMgQU5EIE1FVElTX0xJQlJBUklFUykKKworZmluZF9wYXRoKE1FVElTX0lOQ0xVREVTIAorICBOQU1FUyAKKyAgbWV0aXMuaCAKKyAgUEFUSFMgCisgICRFTlZ7TUVUSVNESVJ9IAorICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IAorICBQQVRIX1NVRkZJWEVTIAorICBtZXRpcworKQorCisKK2ZpbmRfbGlicmFyeShNRVRJU19MSUJSQVJJRVMgbWV0aXMgUEFUSFMgJEVOVntNRVRJU0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKE1FVElTIERFRkFVTFRfTVNHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSVNfSU5DTFVERVMgTUVUSVNfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKE1FVElTX0lOQ0xVREVTIE1FVElTX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRQYXN0aXguY21ha2UgYi9jbWFrZS9GaW5kUGFzdGl4LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZTZjODEKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kUGFzdGl4LmNtYWtlCkBAIC0wLDAgKzEsMjUgQEAKKyMgUGFzdGl4IGxpYiByZXF1aXJlcyBsaW5raW5nIHRvIGEgYmxhcyBsaWJyYXJ5LgorIyBJdCBpcyB1cCB0byB0aGUgdXNlciBvZiB0aGlzIG1vZHVsZSB0byBmaW5kIGEgQkxBUyBhbmQgbGluayB0byBpdC4KKyMgUGFzdGl4IHJlcXVpcmVzIFNDT1RDSCBvciBNRVRJUyAocGFydGl0aW9uaW5nIGFuZCByZW9yZGVyaW5nIHRvb2xzKSBhcyB3ZWxsCisKK2lmIChQQVNUSVhfSU5DTFVERVMgQU5EIFBBU1RJWF9MSUJSQVJJRVMpCisgIHNldChQQVNUSVhfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoUEFTVElYX0lOQ0xVREVTIEFORCBQQVNUSVhfTElCUkFSSUVTKQorCitmaW5kX3BhdGgoUEFTVElYX0lOQ0xVREVTCisgIE5BTUVTCisgIHBhc3RpeF9ub21waS5oCisgIFBBVEhTCisgICRFTlZ7UEFTVElYRElSfQorICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9CispCisKK2ZpbmRfbGlicmFyeShQQVNUSVhfTElCUkFSSUVTIHBhc3RpeCBQQVRIUyAkRU5We1BBU1RJWERJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorCisKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhQQVNUSVggREVGQVVMVF9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVNUSVhfSU5DTFVERVMgUEFTVElYX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChQQVNUSVhfSU5DTFVERVMgUEFTVElYX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRTY290Y2guY21ha2UgYi9jbWFrZS9GaW5kU2NvdGNoLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDM0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kU2NvdGNoLmNtYWtlCkBAIC0wLDAgKzEsMjQgQEAKKyMgUGFzdGl4IHJlcXVpcmVzIFNDT1RDSCBvciBNRVRJUyAocGFydGl0aW9uaW5nIGFuZCByZW9yZGVyaW5nIHRvb2xzKQorCitpZiAoU0NPVENIX0lOQ0xVREVTIEFORCBTQ09UQ0hfTElCUkFSSUVTKQorICBzZXQoU0NPVENIX0ZJTkRfUVVJRVRMWSBUUlVFKQorZW5kaWYgKFNDT1RDSF9JTkNMVURFUyBBTkQgU0NPVENIX0xJQlJBUklFUykKKworZmluZF9wYXRoKFNDT1RDSF9JTkNMVURFUyAKKyAgTkFNRVMgCisgIHNjb3RjaC5oIAorICBQQVRIUyAKKyAgJEVOVntTQ09UQ0hESVJ9IAorICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IAorICBQQVRIX1NVRkZJWEVTIAorICBzY290Y2gKKykKKworCitmaW5kX2xpYnJhcnkoU0NPVENIX0xJQlJBUklFUyBzY290Y2ggUEFUSFMgJEVOVntTQ09UQ0hESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhTQ09UQ0ggREVGQVVMVF9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ09UQ0hfSU5DTFVERVMgU0NPVENIX0xJQlJBUklFUykKKworbWFya19hc19hZHZhbmNlZChTQ09UQ0hfSU5DTFVERVMgU0NPVENIX0xJQlJBUklFUykKZGlmZiAtLWdpdCBhL2NtYWtlL0ZpbmRTdGFuZGFyZE1hdGhMaWJyYXJ5LmNtYWtlIGIvY21ha2UvRmluZFN0YW5kYXJkTWF0aExpYnJhcnkuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExYjBlNAotLS0gL2Rldi9udWxsCisrKyBiL2NtYWtlL0ZpbmRTdGFuZGFyZE1hdGhMaWJyYXJ5LmNtYWtlCkBAIC0wLDAgKzEsNjQgQEAKKyMgLSBUcnkgdG8gZmluZCBob3cgdG8gbGluayB0byB0aGUgc3RhbmRhcmQgbWF0aCBsaWJyYXJ5LCBpZiBhbnl0aGluZyBhdCBhbGwgaXMgbmVlZGVkIHRvIGRvLgorIyBPbiBtb3N0IHBsYXRmb3JtcyB0aGlzIGlzIGF1dG9tYXRpYywgYnV0IGZvciBleGFtcGxlIGl0J3Mgbm90IGF1dG9tYXRpYyBvbiBRTlguCisjCisjIE9uY2UgZG9uZSB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBTVEFOREFSRF9NQVRIX0xJQlJBUllfRk9VTkQgLSB3ZSBmb3VuZCBob3cgdG8gc3VjY2Vzc2Z1bGx5IGxpbmsgdG8gdGhlIHN0YW5kYXJkIG1hdGggbGlicmFyeQorIyAgU1RBTkRBUkRfTUFUSF9MSUJSQVJZIC0gdGhlIG5hbWUgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgdGhhdCBvbmUgaGFzIHRvIGxpbmsgdG8uCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHRoaXMgd2lsbCBiZSBsZWZ0IGVtcHR5IGlmIGl0J3MgYXV0b21hdGljIChtb3N0IHBsYXRmb3JtcykuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHRoaXMgd2lsbCBiZSBzZXQgdG8gIm0iIG9uIHBsYXRmb3JtcyB3aGVyZSBvbmUgbXVzdCBleHBsaWNpdGx5CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgdGhlICItbG0iIGxpbmtlciBmbGFnLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSAyLWNsYXVzZSBCU0QgbGljZW5zZS4KKworCitpbmNsdWRlKENoZWNrQ1hYU291cmNlQ29tcGlsZXMpCisKKyMgYSBsaXR0bGUgdGVzdCBwcm9ncmFtIGZvciBjKysgbWF0aCBmdW5jdGlvbnMuCisjIG5vdGljZSB0aGUgc3RkOjogaXMgcmVxdWlyZWQgb24gc29tZSBwbGF0Zm9ybXMgc3VjaCBhcyBRTlgKKworc2V0KGZpbmRfc3RhbmRhcmRfbWF0aF9saWJyYXJ5X3Rlc3RfcHJvZ3JhbQorIiNpbmNsdWRlPGNtYXRoPgoraW50IG1haW4oKSB7IHN0ZDo6c2luKDAuMCk7IHN0ZDo6bG9nKDAuMGYpOyB9IikKKworIyBmaXJzdCB0cnkgY29tcGlsaW5nL2xpbmtpbmcgdGhlIHRlc3QgcHJvZ3JhbSB3aXRob3V0IGFueSBsaW5rZXIgZmxhZ3MKKworc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIiKQorc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAiIikKK0NIRUNLX0NYWF9TT1VSQ0VfQ09NUElMRVMoCisgICIke2ZpbmRfc3RhbmRhcmRfbWF0aF9saWJyYXJ5X3Rlc3RfcHJvZ3JhbX0iCisgIHN0YW5kYXJkX21hdGhfbGlicmFyeV9saW5rZWRfdG9fYXV0b21hdGljYWxseQorKQorCitpZihzdGFuZGFyZF9tYXRoX2xpYnJhcnlfbGlua2VkX3RvX2F1dG9tYXRpY2FsbHkpCisKKyAgIyB0aGUgdGVzdCBwcm9ncmFtIGxpbmtlZCBzdWNjZXNzZnVsbHkgd2l0aG91dCBhbnkgbGlua2VyIGZsYWcuCisgIHNldChTVEFOREFSRF9NQVRIX0xJQlJBUlkgIiIpCisgIHNldChTVEFOREFSRF9NQVRIX0xJQlJBUllfRk9VTkQgVFJVRSkKKworZWxzZSgpCisKKyAgIyB0aGUgdGVzdCBwcm9ncmFtIGRpZCBub3QgbGluayBzdWNjZXNzZnVsbHkgd2l0aG91dCBhbnkgbGlua2VyIGZsYWcuCisgICMgVGhpcyBpcyBhIHZlcnkgdW5jb21tb24gY2FzZSB0aGF0IHNvIGZhciB3ZSBvbmx5IHNhdyBvbiBRTlguIFRoZSBuZXh0IHRyeSBpcyB0aGUKKyAgIyBzdGFuZGFyZCBuYW1lICdtJyBmb3IgdGhlIHN0YW5kYXJkIG1hdGggbGlicmFyeS4KKworICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICJtIikKKyAgQ0hFQ0tfQ1hYX1NPVVJDRV9DT01QSUxFUygKKyAgICAiJHtmaW5kX3N0YW5kYXJkX21hdGhfbGlicmFyeV90ZXN0X3Byb2dyYW19IgorICAgIHN0YW5kYXJkX21hdGhfbGlicmFyeV9saW5rZWRfdG9fYXNfbSkKKworICBpZihzdGFuZGFyZF9tYXRoX2xpYnJhcnlfbGlua2VkX3RvX2FzX20pCisKKyAgICAjIHRoZSB0ZXN0IHByb2dyYW0gbGlua2VkIHN1Y2Nlc3NmdWxseSB3aGVuIGxpbmtpbmcgdG8gdGhlICdtJyBsaWJyYXJ5CisgICAgc2V0KFNUQU5EQVJEX01BVEhfTElCUkFSWSAibSIpCisgICAgc2V0KFNUQU5EQVJEX01BVEhfTElCUkFSWV9GT1VORCBUUlVFKQorCisgIGVsc2UoKQorCisgICAgIyB0aGUgdGVzdCBwcm9ncmFtIHN0aWxsIGRvZXNuJ3QgbGluayBzdWNjZXNzZnVsbHkKKyAgICBzZXQoU1RBTkRBUkRfTUFUSF9MSUJSQVJZX0ZPVU5EIEZBTFNFKQorCisgIGVuZGlmKCkKKworZW5kaWYoKQpkaWZmIC0tZ2l0IGEvY21ha2UvRmluZFN1cGVyTFUuY21ha2UgYi9jbWFrZS9GaW5kU3VwZXJMVS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTcyYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvRmluZFN1cGVyTFUuY21ha2UKQEAgLTAsMCArMSwyNSBAQAorCisjIFVtZnBhY2sgbGliIHVzdWFsbHkgcmVxdWlyZXMgbGlua2luZyB0byBhIGJsYXMgbGlicmFyeS4KKyMgSXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YgdGhpcyBtb2R1bGUgdG8gZmluZCBhIEJMQVMgYW5kIGxpbmsgdG8gaXQuCisKK2lmIChTVVBFUkxVX0lOQ0xVREVTIEFORCBTVVBFUkxVX0xJQlJBUklFUykKKyAgc2V0KFNVUEVSTFVfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoU1VQRVJMVV9JTkNMVURFUyBBTkQgU1VQRVJMVV9MSUJSQVJJRVMpCisKK2ZpbmRfcGF0aChTVVBFUkxVX0lOQ0xVREVTCisgIE5BTUVTCisgIHN1cGVybWF0cml4LmgKKyAgUEFUSFMKKyAgJEVOVntTVVBFUkxVRElSfQorICAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9CisgIFBBVEhfU1VGRklYRVMKKyAgc3VwZXJsdQorKQorCitmaW5kX2xpYnJhcnkoU1VQRVJMVV9MSUJSQVJJRVMgc3VwZXJsdSBQQVRIUyAkRU5We1NVUEVSTFVESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKyAgCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFNVUEVSTFUgREVGQVVMVF9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVVBFUkxVX0lOQ0xVREVTIFNVUEVSTFVfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKFNVUEVSTFVfSU5DTFVERVMgU1VQRVJMVV9MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9jbWFrZS9GaW5kVW1mcGFjay5jbWFrZSBiL2NtYWtlL0ZpbmRVbWZwYWNrLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MmMzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jbWFrZS9GaW5kVW1mcGFjay5jbWFrZQpAQCAtMCwwICsxLDUwIEBACisjIFVtZnBhY2sgbGliIHVzdWFsbHkgcmVxdWlyZXMgbGlua2luZyB0byBhIGJsYXMgbGlicmFyeS4KKyMgSXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YgdGhpcyBtb2R1bGUgdG8gZmluZCBhIEJMQVMgYW5kIGxpbmsgdG8gaXQuCisKK2lmIChVTUZQQUNLX0lOQ0xVREVTIEFORCBVTUZQQUNLX0xJQlJBUklFUykKKyAgc2V0KFVNRlBBQ0tfRklORF9RVUlFVExZIFRSVUUpCitlbmRpZiAoVU1GUEFDS19JTkNMVURFUyBBTkQgVU1GUEFDS19MSUJSQVJJRVMpCisKK2ZpbmRfcGF0aChVTUZQQUNLX0lOQ0xVREVTCisgIE5BTUVTCisgIHVtZnBhY2suaAorICBQQVRIUworICAkRU5We1VNRlBBQ0tESVJ9CisgICR7SU5DTFVERV9JTlNUQUxMX0RJUn0KKyAgUEFUSF9TVUZGSVhFUworICBzdWl0ZXNwYXJzZQorICB1ZnNwYXJzZQorKQorCitmaW5kX2xpYnJhcnkoVU1GUEFDS19MSUJSQVJJRVMgdW1mcGFjayBQQVRIUyAkRU5We1VNRlBBQ0tESVJ9ICR7TElCX0lOU1RBTExfRElSfSkKKworaWYoVU1GUEFDS19MSUJSQVJJRVMpCisKKyAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChVTUZQQUNLX0xJQkRJUiAke1VNRlBBQ0tfTElCUkFSSUVTfSBQQVRIKQorCisgIGZpbmRfbGlicmFyeShBTURfTElCUkFSWSBhbWQgUEFUSFMgJHtVTUZQQUNLX0xJQkRJUn0gJEVOVntVTUZQQUNLRElSfSAke0xJQl9JTlNUQUxMX0RJUn0pCisgIGlmIChBTURfTElCUkFSWSkKKyAgICBzZXQoVU1GUEFDS19MSUJSQVJJRVMgJHtVTUZQQUNLX0xJQlJBUklFU30gJHtBTURfTElCUkFSWX0pCisgICNlbHNlIChBTURfTElCUkFSWSkKKyAgIyAgc2V0KFVNRlBBQ0tfTElCUkFSSUVTIEZBTFNFKQorICBlbmRpZiAoQU1EX0xJQlJBUlkpCisKK2VuZGlmKFVNRlBBQ0tfTElCUkFSSUVTKQorCitpZihVTUZQQUNLX0xJQlJBUklFUykKKworICBmaW5kX2xpYnJhcnkoQ09MQU1EX0xJQlJBUlkgY29sYW1kIFBBVEhTICR7VU1GUEFDS19MSUJESVJ9ICRFTlZ7VU1GUEFDS0RJUn0gJHtMSUJfSU5TVEFMTF9ESVJ9KQorICBpZiAoQ09MQU1EX0xJQlJBUlkpCisgICAgc2V0KFVNRlBBQ0tfTElCUkFSSUVTICR7VU1GUEFDS19MSUJSQVJJRVN9ICR7Q09MQU1EX0xJQlJBUll9KQorICAjZWxzZSAoQ09MQU1EX0xJQlJBUlkpCisgICMgIHNldChVTUZQQUNLX0xJQlJBUklFUyBGQUxTRSkKKyAgZW5kaWYgKENPTEFNRF9MSUJSQVJZKQorCitlbmRpZihVTUZQQUNLX0xJQlJBUklFUykKKworCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFVNRlBBQ0sgREVGQVVMVF9NU0cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTUZQQUNLX0lOQ0xVREVTIFVNRlBBQ0tfTElCUkFSSUVTKQorCittYXJrX2FzX2FkdmFuY2VkKFVNRlBBQ0tfSU5DTFVERVMgVU1GUEFDS19MSUJSQVJJRVMgQU1EX0xJQlJBUlkgQ09MQU1EX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9jbWFrZS9SZWdleFV0aWxzLmNtYWtlIGIvY21ha2UvUmVnZXhVdGlscy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTlkZmMzCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvUmVnZXhVdGlscy5jbWFrZQpAQCAtMCwwICsxLDE5IEBACitmdW5jdGlvbihlc2NhcGVfc3RyaW5nX2FzX3JlZ2V4IF9zdHJfb3V0IF9zdHJfaW4pCisgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcXFxcIiAiXFxcXFxcXFwiIEZJTEVURVNUMiAiJHtfc3RyX2lufSIpCisgIFNUUklORyhSRUdFWCBSRVBMQUNFICIoWy4kKyo/fC1dKSIgIlxcXFxcXDEiIEZJTEVURVNUMiAiJHtGSUxFVEVTVDJ9IikKKyAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlxcXiIgIlxcXFxeIiBGSUxFVEVTVDIgIiR7RklMRVRFU1QyfSIpCisgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcXCgiICJcXFxcKCIgRklMRVRFU1QyICIke0ZJTEVURVNUMn0iKQorICBTVFJJTkcoUkVHRVggUkVQTEFDRSAiXFwpIiAiXFxcXCkiIEZJTEVURVNUMiAiJHtGSUxFVEVTVDJ9IikKKyAgU1RSSU5HKFJFR0VYIFJFUExBQ0UgIlxcWyIgIlxcXFxbIiBGSUxFVEVTVDIgIiR7RklMRVRFU1QyfSIpCisgIFNUUklORyhSRUdFWCBSRVBMQUNFICJcXF0iICJcXFxcXSIgRklMRVRFU1QyICIke0ZJTEVURVNUMn0iKQorICBTRVQoJHtfc3RyX291dH0gIiR7RklMRVRFU1QyfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCitmdW5jdGlvbih0ZXN0X2VzY2FwZV9zdHJpbmdfYXNfcmVnZXgpCisgIFNFVCh0ZXN0MSAiXFwuXiQtKyooKVtdP3wiKQorICBlc2NhcGVfc3RyaW5nX2FzX3JlZ2V4KHRlc3QyICIke3Rlc3QxfSIpCisgIFNFVCh0ZXN0UmVmICJcXFxcXFwuXFxeXFwkXFwtXFwrXFwqXFwoXFwpXFxbXFxdXFw/XFx8IikKKyAgaWYoTk9UIHRlc3QyIFNUUkVRVUFMIHRlc3RSZWYpCisJbWVzc2FnZSgiRXJyb3IgaW4gdGhlIGVzY2FwZV9zdHJpbmdfZm9yX3JlZ2V4IGZ1bmN0aW9uIDogXG4gICAke3Rlc3QxfSB3YXMgZXNjYXBlZCBhcyAke3Rlc3QyfSwgc2hvdWxkIGJlICR7dGVzdFJlZn0iKQorICBlbmRpZihOT1QgdGVzdDIgU1RSRVFVQUwgdGVzdFJlZikKK2VuZGZ1bmN0aW9uKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jbWFrZS9sYW5ndWFnZV9zdXBwb3J0LmNtYWtlIGIvY21ha2UvbGFuZ3VhZ2Vfc3VwcG9ydC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDE0ZTZlCi0tLSAvZGV2L251bGwKKysrIGIvY21ha2UvbGFuZ3VhZ2Vfc3VwcG9ydC5jbWFrZQpAQCAtMCwwICsxLDY0IEBACisjIGNtYWtlL21vZHVsZXMvbGFuZ3VhZ2Vfc3VwcG9ydC5jbWFrZQorIworIyBUZW1wb3JhcnkgYWRkaXRpb25hbCBnZW5lcmFsIGxhbmd1YWdlIHN1cHBvcnQgaXMgY29udGFpbmVkIHdpdGhpbiB0aGlzCisjIGZpbGUuICAKKworIyBUaGlzIGFkZGl0aW9uYWwgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBuZWVkZWQgdG8gcHJvdmlkZSBhIHdvcmthcm91bmQgZm9yCisjIENNYWtlIGJ1ZyA5MjIwLgorCisjIE9uIGRlYmlhbiB0ZXN0aW5nIChjbWFrZSAyLjYuMiksIEkgZ2V0IHJldHVybiBjb2RlIHplcm8gd2hlbiBjYWxsaW5nIAorIyBjbWFrZSB0aGUgZmlyc3QgdGltZSwgYnV0IGNtYWtlIGNyYXNoZXMgd2hlbiBydW5uaW5nIGEgc2Vjb25kIHRpbWUKKyMgYXMgZm9sbG93czoKKyMKKyMgIC0tIFRoZSBGb3J0cmFuIGNvbXBpbGVyIGlkZW50aWZpY2F0aW9uIGlzIHVua25vd24KKyMgIENNYWtlIEVycm9yIGF0IC91c3Ivc2hhcmUvY21ha2UtMi42L01vZHVsZXMvQ01ha2VGb3J0cmFuSW5mb3JtYXRpb24uY21ha2U6NyAoR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVCk6CisjICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQgY2FsbGVkIHdpdGggaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMKKyMgIENhbGwgU3RhY2sgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOgorIyAgICBDTWFrZUxpc3RzLnR4dDozIChlbmFibGVfbGFuZ3VhZ2UpCisjCisjIE15IHdvcmthcm91bmQgaXMgdG8gaW52b2tlIGNtYWtlIHR3aWNlLiAgSWYgYm90aCByZXR1cm4gY29kZXMgYXJlIHplcm8sIAorIyBpdCBpcyBzYWZlIHRvIGludm9rZSBFTkFCTEVfTEFOR1VBR0UoRm9ydHJhbiBPUFRJT05BTCkKKworZnVuY3Rpb24od29ya2Fyb3VuZF85MjIwIGxhbmd1YWdlIGxhbmd1YWdlX3dvcmtzKQorICAjbWVzc2FnZSgiREVCVUc6IGxhbmd1YWdlID0gJHtsYW5ndWFnZX0iKQorICBzZXQodGV4dAorICAgICJwcm9qZWN0KHRlc3QgTk9ORSkKKyAgICBjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42LjApCisgICAgZW5hYmxlX2xhbmd1YWdlKCR7bGFuZ3VhZ2V9IE9QVElPTkFMKQorICAiKQorICBmaWxlKFJFTU9WRV9SRUNVUlNFICR7Q01BS0VfQklOQVJZX0RJUn0vbGFuZ3VhZ2VfdGVzdHMvJHtsYW5ndWFnZX0pCisgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9sYW5ndWFnZV90ZXN0cy8ke2xhbmd1YWdlfSkKKyAgZmlsZShXUklURSAke0NNQUtFX0JJTkFSWV9ESVJ9L2xhbmd1YWdlX3Rlc3RzLyR7bGFuZ3VhZ2V9L0NNYWtlTGlzdHMudHh0CisgICAgJHt0ZXh0fSkKKyAgZXhlY3V0ZV9wcm9jZXNzKAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAuCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9sYW5ndWFnZV90ZXN0cy8ke2xhbmd1YWdlfQorICAgIFJFU1VMVF9WQVJJQUJMRSByZXR1cm5fY29kZQorICAgIE9VVFBVVF9RVUlFVAorICAgIEVSUk9SX1FVSUVUCisgICAgKQorCisgIGlmKHJldHVybl9jb2RlIEVRVUFMIDApCisgICAgIyBTZWNvbmQgcnVuCisgICAgZXhlY3V0ZV9wcm9jZXNzICgKKyAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAuCisgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2xhbmd1YWdlX3Rlc3RzLyR7bGFuZ3VhZ2V9CisgICAgICBSRVNVTFRfVkFSSUFCTEUgcmV0dXJuX2NvZGUKKyAgICAgIE9VVFBVVF9RVUlFVAorICAgICAgRVJST1JfUVVJRVQKKyAgICAgICkKKyAgICBpZihyZXR1cm5fY29kZSBFUVVBTCAwKQorICAgICAgc2V0KCR7bGFuZ3VhZ2Vfd29ya3N9IE9OIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlKHJldHVybl9jb2RlIEVRVUFMIDApCisgICAgICBzZXQoJHtsYW5ndWFnZV93b3Jrc30gT0ZGIFBBUkVOVF9TQ09QRSkKKyAgICBlbmRpZihyZXR1cm5fY29kZSBFUVVBTCAwKQorICBlbHNlKHJldHVybl9jb2RlIEVRVUFMIDApCisgICAgc2V0KCR7bGFuZ3VhZ2Vfd29ya3N9IE9GRiBQQVJFTlRfU0NPUEUpCisgIGVuZGlmKHJldHVybl9jb2RlIEVRVUFMIDApCitlbmRmdW5jdGlvbih3b3JrYXJvdW5kXzkyMjApCisKKyMgVGVtcG9yYXJ5IHRlc3RzIG9mIHRoZSBhYm92ZSBmdW5jdGlvbi4KKyN3b3JrYXJvdW5kXzkyMjAoQ1hYIENYWF9sYW5ndWFnZV93b3JrcykKKyNtZXNzYWdlKCJDWFhfbGFuZ3VhZ2Vfd29ya3MgPSAke0NYWF9sYW5ndWFnZV93b3Jrc30iKQorI3dvcmthcm91bmRfOTIyMChDWFhwIENYWHBfbGFuZ3VhZ2Vfd29ya3MpCisjbWVzc2FnZSgiQ1hYcF9sYW5ndWFnZV93b3JrcyA9ICR7Q1hYcF9sYW5ndWFnZV93b3Jrc30iKQpkaWZmIC0tZ2l0IGEvZGVidWcvZ2RiL19faW5pdF9fLnB5IGIvZGVidWcvZ2RiL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiN2IxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Zy9nZGIvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorIyBJbnRlbnRpb25hbGx5IGVtcHR5CmRpZmYgLS1naXQgYS9kZWJ1Zy9nZGIvcHJpbnRlcnMucHkgYi9kZWJ1Zy9nZGIvcHJpbnRlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4N2FjYgotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnL2dkYi9wcmludGVycy5weQpAQCAtMCwwICsxLDIwOCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKyMgZm9yIGxpbmVhciBhbGdlYnJhLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVuamFtaW4gU2NoaW5kbGVyIDxic2NoaW5kbGVyQGluZi5ldGh6LmNoPgorIworIyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCisjIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworIyBQcmV0dHkgcHJpbnRlcnMgZm9yIEVpZ2VuOjpNYXRyaXgKKyMgVGhpcyBpcyBzdGlsbCBwcmV0dHkgYmFzaWMgYXMgdGhlIHB5dGhvbiBleHRlbnNpb24gdG8gZ2RiIGlzIHN0aWxsIHByZXR0eSBiYXNpYy4gCisjIEl0IGNhbm5vdCBoYW5kbGUgY29tcGxleCBlaWdlbiB0eXBlcyBhbmQgaXQgZG9lc24ndCBzdXBwb3J0IGFueSBvZiB0aGUgb3RoZXIgZWlnZW4gdHlwZXMKKyMgU3VjaCBhcyBxdWF0ZXJuaW9uIG9yIHNvbWUgb3RoZXIgdHlwZS4gCisjIFRoaXMgY29kZSBzdXBwb3J0cyBmaXhlZCBzaXplIGFzIHdlbGwgYXMgZHluYW1pYyBzaXplIG1hdHJpY2VzCisKKyMgVG8gdXNlIGl0OgorIworIyAqIENyZWF0ZSBhIGRpcmVjdG9yeSBhbmQgcHV0IHRoZSBmaWxlIGFzIHdlbGwgYXMgYW4gZW1wdHkgX19pbml0X18ucHkgaW4gCisjICAgdGhhdCBkaXJlY3RvcnkuCisjICogQ3JlYXRlIGEgfi8uZ2RiaW5pdCBmaWxlLCB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CisjICAgICAgcHl0aG9uCisjICAgICAgaW1wb3J0IHN5cworIyAgICAgIHN5cy5wYXRoLmluc2VydCgwLCAnL3BhdGgvdG8vZWlnZW4vcHJpbnRlci9kaXJlY3RvcnknKQorIyAgICAgIGZyb20gcHJpbnRlcnMgaW1wb3J0IHJlZ2lzdGVyX2VpZ2VuX3ByaW50ZXJzCisjICAgICAgcmVnaXN0ZXJfZWlnZW5fcHJpbnRlcnMgKE5vbmUpCisjICAgICAgZW5kCisKK2ltcG9ydCBnZGIKK2ltcG9ydCByZQoraW1wb3J0IGl0ZXJ0b29scworCisKK2NsYXNzIEVpZ2VuTWF0cml4UHJpbnRlcjoKKwkiUHJpbnQgRWlnZW4gTWF0cml4IG9yIEFycmF5IG9mIHNvbWUga2luZCIKKworCWRlZiBfX2luaXRfXyhzZWxmLCB2YXJpZXR5LCB2YWwpOgorCQkiRXh0cmFjdCBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiIKKwkJCisJCSMgU2F2ZSB0aGUgdmFyaWV0eSAocHJlc3VtYWJseSAiTWF0cml4IiBvciAiQXJyYXkiKSBmb3IgbGF0ZXIgdXNhZ2UKKwkJc2VsZi52YXJpZXR5ID0gdmFyaWV0eQorCQkKKwkJIyBUaGUgZ2RiIGV4dGVuc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHZhbHVlIHRlbXBsYXRlIGFyZ3VtZW50cyAtIG5lZWQgdG8gZXh0cmFjdCB0aGVtIGJ5IGhhbmQKKwkJdHlwZSA9IHZhbC50eXBlCisJCWlmIHR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX1JFRjoKKwkJCXR5cGUgPSB0eXBlLnRhcmdldCgpCisJCXNlbGYudHlwZSA9IHR5cGUudW5xdWFsaWZpZWQoKS5zdHJpcF90eXBlZGVmcygpCisJCXRhZyA9IHNlbGYudHlwZS50YWcKKwkJcmVnZXggPSByZS5jb21waWxlKCdcPC4qXD4nKQorCQltID0gcmVnZXguZmluZGFsbCh0YWcpWzBdWzE6LTFdCisJCXRlbXBsYXRlX3BhcmFtcyA9IG0uc3BsaXQoJywnKQorCQl0ZW1wbGF0ZV9wYXJhbXMgPSBtYXAobGFtYmRhIHg6eC5yZXBsYWNlKCIgIiwgIiIpLCB0ZW1wbGF0ZV9wYXJhbXMpCisJCQorCQlpZiB0ZW1wbGF0ZV9wYXJhbXNbMV0gPT0gJy0weDAwMDAwMDAwMDAwMDAwMDAxJyBvciB0ZW1wbGF0ZV9wYXJhbXNbMV0gPT0gJy0weDAwMDAwMDAwMSc6CisJCQlzZWxmLnJvd3MgPSB2YWxbJ21fc3RvcmFnZSddWydtX3Jvd3MnXQorCQllbHNlOgorCQkJc2VsZi5yb3dzID0gaW50KHRlbXBsYXRlX3BhcmFtc1sxXSkKKwkJCisJCWlmIHRlbXBsYXRlX3BhcmFtc1syXSA9PSAnLTB4MDAwMDAwMDAwMDAwMDAwMDEnIG9yIHRlbXBsYXRlX3BhcmFtc1syXSA9PSAnLTB4MDAwMDAwMDAxJzoKKwkJCXNlbGYuY29scyA9IHZhbFsnbV9zdG9yYWdlJ11bJ21fY29scyddCisJCWVsc2U6CisJCQlzZWxmLmNvbHMgPSBpbnQodGVtcGxhdGVfcGFyYW1zWzJdKQorCQkKKwkJc2VsZi5vcHRpb25zID0gMCAjIGRlZmF1bHQgdmFsdWUKKwkJaWYgbGVuKHRlbXBsYXRlX3BhcmFtcykgPiAzOgorCQkJc2VsZi5vcHRpb25zID0gdGVtcGxhdGVfcGFyYW1zWzNdOworCQkKKwkJc2VsZi5yb3dNYWpvciA9IChpbnQoc2VsZi5vcHRpb25zKSAmIDB4MSkKKwkJCisJCXNlbGYuaW5uZXJUeXBlID0gc2VsZi50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisJCQorCQlzZWxmLnZhbCA9IHZhbAorCQkKKwkJIyBGaXhlZCBzaXplIG1hdHJpY2VzIGhhdmUgYSBzdHJ1Y3QgYXMgdGhlaXIgc3RvcmFnZSwgc28gd2UgbmVlZCB0byB3YWxrIHRocm91Z2ggdGhpcworCQlzZWxmLmRhdGEgPSBzZWxmLnZhbFsnbV9zdG9yYWdlJ11bJ21fZGF0YSddCisJCWlmIHNlbGYuZGF0YS50eXBlLmNvZGUgPT0gZ2RiLlRZUEVfQ09ERV9TVFJVQ1Q6CisJCQlzZWxmLmRhdGEgPSBzZWxmLmRhdGFbJ2FycmF5J10KKwkJCXNlbGYuZGF0YSA9IHNlbGYuZGF0YS5jYXN0KHNlbGYuaW5uZXJUeXBlLnBvaW50ZXIoKSkKKwkJCQorCWNsYXNzIF9pdGVyYXRvcjoKKwkJZGVmIF9faW5pdF9fIChzZWxmLCByb3dzLCBjb2xzLCBkYXRhUHRyLCByb3dNYWpvcik6CisJCQlzZWxmLnJvd3MgPSByb3dzCisJCQlzZWxmLmNvbHMgPSBjb2xzCisJCQlzZWxmLmRhdGFQdHIgPSBkYXRhUHRyCisJCQlzZWxmLmN1cnJlbnRSb3cgPSAwCisJCQlzZWxmLmN1cnJlbnRDb2wgPSAwCisJCQlzZWxmLnJvd01ham9yID0gcm93TWFqb3IKKwkJCQorCQlkZWYgX19pdGVyX18gKHNlbGYpOgorCQkJcmV0dXJuIHNlbGYKKwkJCQorCQlkZWYgbmV4dChzZWxmKToKKwkJCQorCQkJcm93ID0gc2VsZi5jdXJyZW50Um93CisJCQljb2wgPSBzZWxmLmN1cnJlbnRDb2wKKwkJCWlmIHNlbGYucm93TWFqb3IgPT0gMDoKKwkJCQlpZiBzZWxmLmN1cnJlbnRDb2wgPj0gc2VsZi5jb2xzOgorCQkJCQlyYWlzZSBTdG9wSXRlcmF0aW9uCisJCQkJCQorCQkJCXNlbGYuY3VycmVudFJvdyA9IHNlbGYuY3VycmVudFJvdyArIDEKKwkJCQlpZiBzZWxmLmN1cnJlbnRSb3cgPj0gc2VsZi5yb3dzOgorCQkJCQlzZWxmLmN1cnJlbnRSb3cgPSAwCisJCQkJCXNlbGYuY3VycmVudENvbCA9IHNlbGYuY3VycmVudENvbCArIDEKKwkJCWVsc2U6CisJCQkJaWYgc2VsZi5jdXJyZW50Um93ID49IHNlbGYucm93czoKKwkJCQkJcmFpc2UgU3RvcEl0ZXJhdGlvbgorCQkJCQkKKwkJCQlzZWxmLmN1cnJlbnRDb2wgPSBzZWxmLmN1cnJlbnRDb2wgKyAxCisJCQkJaWYgc2VsZi5jdXJyZW50Q29sID49IHNlbGYuY29sczoKKwkJCQkJc2VsZi5jdXJyZW50Q29sID0gMAorCQkJCQlzZWxmLmN1cnJlbnRSb3cgPSBzZWxmLmN1cnJlbnRSb3cgKyAxCisJCQkJCisJCQkKKwkJCWl0ZW0gPSBzZWxmLmRhdGFQdHIuZGVyZWZlcmVuY2UoKQorCQkJc2VsZi5kYXRhUHRyID0gc2VsZi5kYXRhUHRyICsgMQorCQkJaWYgKHNlbGYuY29scyA9PSAxKTogI2lmIGl0J3MgYSBjb2x1bW4gdmVjdG9yCisJCQkJcmV0dXJuICgnWyVkXScgJSAocm93LCksIGl0ZW0pCisJCQllbGlmIChzZWxmLnJvd3MgPT0gMSk6ICNpZiBpdCdzIGEgcm93IHZlY3RvcgorCQkJCXJldHVybiAoJ1slZF0nICUgKGNvbCwpLCBpdGVtKQorCQkJcmV0dXJuICgnWyVkLCVkXScgJSAocm93LCBjb2wpLCBpdGVtKQorCQkJCisJZGVmIGNoaWxkcmVuKHNlbGYpOgorCQkKKwkJcmV0dXJuIHNlbGYuX2l0ZXJhdG9yKHNlbGYucm93cywgc2VsZi5jb2xzLCBzZWxmLmRhdGEsIHNlbGYucm93TWFqb3IpCisJCQorCWRlZiB0b19zdHJpbmcoc2VsZik6CisJCXJldHVybiAiRWlnZW46OiVzPCVzLCVkLCVkLCVzPiAoZGF0YSBwdHI6ICVzKSIgJSAoc2VsZi52YXJpZXR5LCBzZWxmLmlubmVyVHlwZSwgc2VsZi5yb3dzLCBzZWxmLmNvbHMsICJSb3dNYWpvciIgaWYgc2VsZi5yb3dNYWpvciBlbHNlICAiQ29sTWFqb3IiLCBzZWxmLmRhdGEpCisKK2NsYXNzIEVpZ2VuUXVhdGVybmlvblByaW50ZXI6CisJIlByaW50IGFuIEVpZ2VuIFF1YXRlcm5pb24iCisJCisJZGVmIF9faW5pdF9fKHNlbGYsIHZhbCk6CisJCSJFeHRyYWN0IGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIgorCQkjIFRoZSBnZGIgZXh0ZW5zaW9uIGRvZXMgbm90IHN1cHBvcnQgdmFsdWUgdGVtcGxhdGUgYXJndW1lbnRzIC0gbmVlZCB0byBleHRyYWN0IHRoZW0gYnkgaGFuZAorCQl0eXBlID0gdmFsLnR5cGUKKwkJaWYgdHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfUkVGOgorCQkJdHlwZSA9IHR5cGUudGFyZ2V0KCkKKwkJc2VsZi50eXBlID0gdHlwZS51bnF1YWxpZmllZCgpLnN0cmlwX3R5cGVkZWZzKCkKKwkJc2VsZi5pbm5lclR5cGUgPSBzZWxmLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkKKwkJc2VsZi52YWwgPSB2YWwKKwkJCisJCSMgUXVhdGVybmlvbnMgaGF2ZSBhIHN0cnVjdCBhcyB0aGVpciBzdG9yYWdlLCBzbyB3ZSBuZWVkIHRvIHdhbGsgdGhyb3VnaCB0aGlzCisJCXNlbGYuZGF0YSA9IHNlbGYudmFsWydtX2NvZWZmcyddWydtX3N0b3JhZ2UnXVsnbV9kYXRhJ11bJ2FycmF5J10KKwkJc2VsZi5kYXRhID0gc2VsZi5kYXRhLmNhc3Qoc2VsZi5pbm5lclR5cGUucG9pbnRlcigpKQorCQkJCisJY2xhc3MgX2l0ZXJhdG9yOgorCQlkZWYgX19pbml0X18gKHNlbGYsIGRhdGFQdHIpOgorCQkJc2VsZi5kYXRhUHRyID0gZGF0YVB0cgorCQkJc2VsZi5jdXJyZW50RWxlbWVudCA9IDAKKwkJCXNlbGYuZWxlbWVudE5hbWVzID0gWyd4JywgJ3knLCAneicsICd3J10KKwkJCQorCQlkZWYgX19pdGVyX18gKHNlbGYpOgorCQkJcmV0dXJuIHNlbGYKKwkJCQorCQlkZWYgbmV4dChzZWxmKToKKwkJCWVsZW1lbnQgPSBzZWxmLmN1cnJlbnRFbGVtZW50CisJCQkKKwkJCWlmIHNlbGYuY3VycmVudEVsZW1lbnQgPj0gNDogI3RoZXJlIGFyZSA0IGVsZW1lbnRzIGluIGEgcXVhbnRlcm5pb24KKwkJCQlyYWlzZSBTdG9wSXRlcmF0aW9uCisJCQkKKwkJCXNlbGYuY3VycmVudEVsZW1lbnQgPSBzZWxmLmN1cnJlbnRFbGVtZW50ICsgMQorCQkJCisJCQlpdGVtID0gc2VsZi5kYXRhUHRyLmRlcmVmZXJlbmNlKCkKKwkJCXNlbGYuZGF0YVB0ciA9IHNlbGYuZGF0YVB0ciArIDEKKwkJCXJldHVybiAoJ1slc10nICUgKHNlbGYuZWxlbWVudE5hbWVzW2VsZW1lbnRdLCksIGl0ZW0pCisJCQkKKwlkZWYgY2hpbGRyZW4oc2VsZik6CisJCQorCQlyZXR1cm4gc2VsZi5faXRlcmF0b3Ioc2VsZi5kYXRhKQorCQorCWRlZiB0b19zdHJpbmcoc2VsZik6CisJCXJldHVybiAiRWlnZW46OlF1YXRlcm5pb248JXM+IChkYXRhIHB0cjogJXMpIiAlIChzZWxmLmlubmVyVHlwZSwgc2VsZi5kYXRhKQorCitkZWYgYnVpbGRfZWlnZW5fZGljdGlvbmFyeSAoKToKKwlwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdeRWlnZW46OlF1YXRlcm5pb248Lio+JCcpXSA9IGxhbWJkYSB2YWw6IEVpZ2VuUXVhdGVybmlvblByaW50ZXIodmFsKQorCXByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15FaWdlbjo6TWF0cml4PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBFaWdlbk1hdHJpeFByaW50ZXIoIk1hdHJpeCIsIHZhbCkKKwlwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdeRWlnZW46OkFycmF5PC4qPiQnKV0gID0gbGFtYmRhIHZhbDogRWlnZW5NYXRyaXhQcmludGVyKCJBcnJheSIsICB2YWwpCisKK2RlZiByZWdpc3Rlcl9laWdlbl9wcmludGVycyhvYmopOgorCSJSZWdpc3RlciBlaWdlbiBwcmV0dHktcHJpbnRlcnMgd2l0aCBvYmpmaWxlIE9iaiIKKworCWlmIG9iaiA9PSBOb25lOgorCQlvYmogPSBnZGIKKwlvYmoucHJldHR5X3ByaW50ZXJzLmFwcGVuZChsb29rdXBfZnVuY3Rpb24pCisKK2RlZiBsb29rdXBfZnVuY3Rpb24odmFsKToKKwkiTG9vay11cCBhbmQgcmV0dXJuIGEgcHJldHR5LXByaW50ZXIgdGhhdCBjYW4gcHJpbnQgdmEuIgorCQorCXR5cGUgPSB2YWwudHlwZQorCQorCWlmIHR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX1JFRjoKKwkJdHlwZSA9IHR5cGUudGFyZ2V0KCkKKwkKKwl0eXBlID0gdHlwZS51bnF1YWxpZmllZCgpLnN0cmlwX3R5cGVkZWZzKCkKKwkKKwl0eXBlbmFtZSA9IHR5cGUudGFnCisJaWYgdHlwZW5hbWUgPT0gTm9uZToKKwkJcmV0dXJuIE5vbmUKKwkKKwlmb3IgZnVuY3Rpb24gaW4gcHJldHR5X3ByaW50ZXJzX2RpY3Q6CisJCWlmIGZ1bmN0aW9uLnNlYXJjaCh0eXBlbmFtZSk6CisJCQlyZXR1cm4gcHJldHR5X3ByaW50ZXJzX2RpY3RbZnVuY3Rpb25dKHZhbCkKKwkKKwlyZXR1cm4gTm9uZQorCitwcmV0dHlfcHJpbnRlcnNfZGljdCA9IHt9CisKK2J1aWxkX2VpZ2VuX2RpY3Rpb25hcnkgKCkKZGlmZiAtLWdpdCBhL2RlYnVnL21zdmMvZWlnZW5fYXV0b2V4cF9wYXJ0LmRhdCBiL2RlYnVnL21zdmMvZWlnZW5fYXV0b2V4cF9wYXJ0LmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FhNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvZGVidWcvbXN2Yy9laWdlbl9hdXRvZXhwX3BhcnQuZGF0CkBAIC0wLDAgKzEsMjk1IEBACis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKzsgKiBFaWdlbiBWaXN1YWxpemVyDQorOyAqDQorOyAqIEF1dGhvcjogSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ21haWwuY29tPg0KKzsgKg0KKzsgKiBTdXBwb3J0IHRoZSBlbmhhbmNlZCBkZWJ1Z2dpbmcgb2YgdGhlIGZvbGxvd2luZyBFaWdlbg0KKzsgKiB0eXBlcyAoKjogYW55LCArOmZpeGVkIGRpbWVuc2lvbikgOg0KKzsgKg0KKzsgKiAtIEVpZ2VuOjpNYXRyaXg8Kiw0LDEsKiwqLCo+IGFuZCBFaWdlbjo6TWF0cml4PCosMSw0LCosKiwqPg0KKzsgKiAtIEVpZ2VuOjpNYXRyaXg8KiwzLDEsKiwqLCo+IGFuZCBFaWdlbjo6TWF0cml4PCosMSwzLCosKiwqPg0KKzsgKiAtIEVpZ2VuOjpNYXRyaXg8KiwyLDEsKiwqLCo+IGFuZCBFaWdlbjo6TWF0cml4PCosMSwyLCosKiwqPg0KKzsgKiAtIEVpZ2VuOjpNYXRyaXg8KiwtMSwtMSwqLCosKj4NCis7ICogLSBFaWdlbjo6TWF0cml4PCosKywtMSwqLCosKj4NCis7ICogLSBFaWdlbjo6TWF0cml4PCosLTEsKywqLCosKj4NCis7ICogLSBFaWdlbjo6TWF0cml4PCosKywrLCosKiwqPg0KKzsgKg0KKzsgKiBNYXRyaWNlcyBhcmUgZGlzcGxheWVkIHByb3Blcmx5IGluZGVwZW5kYW50bHkgb2YgdGhlIG1lbW9yeQ0KKzsgKiBhbGlnbm1lbnQgKFJvd01ham9yIHZzLiBDb2xNYWpvcikuDQorOyAqDQorOyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gUGxlYXNlIGVuc3VyZQ0KKzsgKiB0aGF0IHlvdXIgb3JpZ2luYWwgYXV0b2V4cC5kYXQgZmlsZSBpcyBjb3BpZWQgdG8gYSBzYWZlIA0KKzsgKiBwbGFjZSBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIGl0cyBtb2RpZmljYXRpb24uDQorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisNCitbVmlzdWFsaXplcl0NCisNCis7IEZpeGVkIHNpemUgNC12ZWN0b3JzDQorRWlnZW46Ok1hdHJpeDwqLDQsMSwqLCosKj58RWlnZW46Ok1hdHJpeDwqLDEsNCwqLCosKj57DQorICAgY2hpbGRyZW4NCisgICAoDQorICAgICAgIygNCisgICAgICAgIFtpbnRlcm5hbHNdOiBbJGMsIV0sDQorICAgICAgICAgeCA6ICgkYy5tX3N0b3JhZ2UubV9kYXRhLmFycmF5KVswXSwNCisgICAgICAgICB5IDogKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWzFdLA0KKyAgICAgICAgIHogOiAoJGMubV9zdG9yYWdlLm1fZGF0YS5hcnJheSlbMl0sDQorICAgICAgICAgdyA6ICgkYy5tX3N0b3JhZ2UubV9kYXRhLmFycmF5KVszXQ0KKyAgICAgICkNCisgICApDQorDQorICAgcHJldmlldw0KKyAgICgNCisgICAgICAjKA0KKyAgICAgICAgIlsiLA0KKyAgICAgICAgNCwNCisgICAgICAgICJdKCIsDQorICAgICAgICAjYXJyYXkoZXhwcjogJGUubV9zdG9yYWdlLm1fZGF0YS5hcnJheVskaV0sIHNpemU6IDQpLA0KKyAgICAgICAgIikiDQorICAgICAgKQ0KKyAgICkNCit9DQorDQorOyBGaXhlZCBzaXplIDMtdmVjdG9ycw0KK0VpZ2VuOjpNYXRyaXg8KiwzLDEsKiwqLCo+fEVpZ2VuOjpNYXRyaXg8KiwxLDMsKiwqLCo+ew0KKyAgIGNoaWxkcmVuDQorICAgKA0KKyAgICAgICMoDQorICAgICAgICBbaW50ZXJuYWxzXTogWyRjLCFdLA0KKyAgICAgICAgIHggOiAoJGMubV9zdG9yYWdlLm1fZGF0YS5hcnJheSlbMF0sDQorICAgICAgICAgeSA6ICgkYy5tX3N0b3JhZ2UubV9kYXRhLmFycmF5KVsxXSwNCisgICAgICAgICB6IDogKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWzJdDQorICAgICAgKQ0KKyAgICkNCisNCisgICBwcmV2aWV3DQorICAgKA0KKyAgICAgICMoDQorICAgICAgICAiWyIsDQorICAgICAgICAzLA0KKyAgICAgICAgIl0oIiwNCisgICAgICAgICNhcnJheShleHByOiAkZS5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WyRpXSwgc2l6ZTogMyksDQorICAgICAgICAiKSINCisgICAgICApDQorICAgKQ0KK30NCisNCis7IEZpeGVkIHNpemUgMi12ZWN0b3JzDQorRWlnZW46Ok1hdHJpeDwqLDIsMSwqLCosKj58RWlnZW46Ok1hdHJpeDwqLDEsMiwqLCosKj57DQorICAgY2hpbGRyZW4NCisgICAoDQorICAgICAgIygNCisgICAgICAgIFtpbnRlcm5hbHNdOiBbJGMsIV0sDQorICAgICAgICAgeCA6ICgkYy5tX3N0b3JhZ2UubV9kYXRhLmFycmF5KVswXSwNCisgICAgICAgICB5IDogKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWzFdDQorICAgICAgKQ0KKyAgICkNCisNCisgICBwcmV2aWV3DQorICAgKA0KKyAgICAgICMoDQorICAgICAgICAiWyIsDQorICAgICAgICAyLA0KKyAgICAgICAgIl0oIiwNCisgICAgICAgICNhcnJheShleHByOiAkZS5tX3N0b3JhZ2UubV9kYXRhLmFycmF5WyRpXSwgc2l6ZTogMiksDQorICAgICAgICAiKSINCisgICAgICApDQorICAgKQ0KK30NCisNCis7IEZpeGVkIHNpemUgMS12ZWN0b3JzDQorRWlnZW46Ok1hdHJpeDwqLDEsMSwqLCosKj58RWlnZW46Ok1hdHJpeDwqLDEsMSwqLCosKj57DQorICAgY2hpbGRyZW4NCisgICAoDQorICAgICAgIygNCisgICAgICAgIFtpbnRlcm5hbHNdOiBbJGMsIV0sDQorICAgICAgICAgeCA6ICgkYy5tX3N0b3JhZ2UubV9kYXRhLmFycmF5KVswXQ0KKyAgICAgICkNCisgICApDQorDQorICAgcHJldmlldw0KKyAgICgNCisgICAgICAjKA0KKyAgICAgICAgIlsiLA0KKyAgICAgICAgMSwNCisgICAgICAgICJdKCIsDQorICAgICAgICAjYXJyYXkoZXhwcjogJGUubV9zdG9yYWdlLm1fZGF0YS5hcnJheVskaV0sIHNpemU6IDEpLA0KKyAgICAgICAgIikiDQorICAgICAgKQ0KKyAgICkNCit9DQorDQorOyBEeW5hbWljIG1hdHJpY2VzIChDb2xNYWpvciBhbmQgUm93TWFqb3Igc3VwcG9ydCkNCitFaWdlbjo6TWF0cml4PCosLTEsLTEsKiwqLCo+ew0KKyAgY2hpbGRyZW4NCisgICAoDQorICAgICAgIygNCisgICAgICAgICBbaW50ZXJuYWxzXTogWyRjLCFdLA0KKyAgICAgICAgIHJvd3M6ICRjLm1fc3RvcmFnZS5tX3Jvd3MsDQorICAgICAgICAgY29sczogJGMubV9zdG9yYWdlLm1fY29scywNCisgICAgICAgICA7IENoZWNrIGZvciBSb3dNYWpvckJpdA0KKyAgICAgICAgICNpZiAoJGMuRmxhZ3MgJiAweDEpICgNCisgICAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgICAgICByYW5rOiAyLA0KKyAgICAgICAgICAgICAgICBiYXNlOiAwLA0KKyAgICAgICAgICAgICAgICBleHByOiAoJGMubV9zdG9yYWdlLm1fZGF0YSlbKCRpICUgJGMubV9zdG9yYWdlLm1fcm93cykqJGMubV9zdG9yYWdlLm1fY29scyArICgoJGktICRpICUgJGMubV9zdG9yYWdlLm1fcm93cykvJGMubV9zdG9yYWdlLm1fcm93cyldLCANCisgICAgICAgICAgICAgICAgc2l6ZTogKCRyPT0xKSokYy5tX3N0b3JhZ2UubV9yb3dzKygkcj09MCkqJGMubV9zdG9yYWdlLm1fY29scw0KKyAgICAgICAgICAgICApDQorICAgICAgICAgKSAjZWxzZSAoDQorICAgICAgICAgICAgICNhcnJheSgNCisgICAgICAgICAgICAgICAgcmFuazogMiwNCisgICAgICAgICAgICAgICAgYmFzZTogMCwNCisgICAgICAgICAgICAgICAgZXhwcjogKCRjLm1fc3RvcmFnZS5tX2RhdGEpWyRpXSwNCisgICAgICAgICAgICAgICAgc2l6ZTogKCRyPT0xKSokYy5tX3N0b3JhZ2UubV9yb3dzKygkcj09MCkqJGMubV9zdG9yYWdlLm1fY29scw0KKyAgICAgICAgICAgICApDQorICAgICAgICAgKQ0KKyAgICAgICkNCisgICApDQorDQorICAgcHJldmlldw0KKyAgICgNCisgICAgICMoDQorICAgICAgICAgIlsiLA0KKyAgICAgICAgICAgJGMubV9zdG9yYWdlLm1fcm93cywNCisgICAgICAgICAiLCIsDQorICAgICAgICAgICAkYy5tX3N0b3JhZ2UubV9jb2xzLA0KKyAgICAgICAgICJdKCIsDQorICAgICAgICAgICAjYXJyYXkoDQorICAgICAgICAgICAgZXhwciA6ICAgIFsoJGMubV9zdG9yYWdlLm1fZGF0YSlbJGldLGddLA0KKyAgICAgICAgICAgIHNpemUgOiAgICAkYy5tX3N0b3JhZ2UubV9yb3dzKiRjLm1fc3RvcmFnZS5tX2NvbHMNCisgICAgICAgICAgICksDQorICAgICAgICAgIikiDQorICAgICAgKQ0KKyAgICkNCit9DQorDQorOyBGaXhlZCByb3dzLCBkeW5hbWljIGNvbHVtbnMgbWF0cml4IChDb2xNYWpvciBhbmQgUm93TWFqb3Igc3VwcG9ydCkNCitFaWdlbjo6TWF0cml4PCosKiwtMSwqLCosKj57DQorICBjaGlsZHJlbg0KKyAgICgNCisgICAgICAjKA0KKyAgICAgICAgIFtpbnRlcm5hbHNdOiBbJGMsIV0sDQorICAgICAgICAgcm93czogJGMuUm93c0F0Q29tcGlsZVRpbWUsDQorICAgICAgICAgY29sczogJGMubV9zdG9yYWdlLm1fY29scywNCisgICAgICAgICA7IENoZWNrIGZvciBSb3dNYWpvckJpdA0KKyAgICAgICAgICNpZiAoJGMuRmxhZ3MgJiAweDEpICgNCisgICAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgICAgICByYW5rOiAyLA0KKyAgICAgICAgICAgICAgICBiYXNlOiAwLA0KKyAgICAgICAgICAgICAgICBleHByOiAoJGMubV9zdG9yYWdlLm1fZGF0YSlbKCRpICUgJGMuUm93c0F0Q29tcGlsZVRpbWUpKiRjLm1fc3RvcmFnZS5tX2NvbHMgKyAoKCRpLSAkaSAlICRjLlJvd3NBdENvbXBpbGVUaW1lKS8kYy5Sb3dzQXRDb21waWxlVGltZSldLA0KKyAgICAgICAgICAgICAgICBzaXplOiAoJHI9PTEpKiRjLlJvd3NBdENvbXBpbGVUaW1lKygkcj09MCkqJGMubV9zdG9yYWdlLm1fY29scw0KKyAgICAgICAgICAgICApDQorICAgICAgICAgKSAjZWxzZSAoDQorICAgICAgICAgICAgICNhcnJheSgNCisgICAgICAgICAgICAgICAgcmFuazogMiwNCisgICAgICAgICAgICAgICAgYmFzZTogMCwNCisgICAgICAgICAgICAgICAgZXhwcjogKCRjLm1fc3RvcmFnZS5tX2RhdGEpWyRpXSwNCisgICAgICAgICAgICAgICAgc2l6ZTogKCRyPT0xKSokYy5Sb3dzQXRDb21waWxlVGltZSsoJHI9PTApKiRjLm1fc3RvcmFnZS5tX2NvbHMNCisgICAgICAgICAgICAgKQ0KKyAgICAgICAgICkNCisgICAgICApDQorICAgKQ0KKw0KKyAgIHByZXZpZXcNCisgICAoDQorICAgICAjKA0KKyAgICAgICAgICJbIiwNCisgICAgICAgICAgICRjLlJvd3NBdENvbXBpbGVUaW1lLA0KKyAgICAgICAgICIsIiwNCisgICAgICAgICAgICRjLm1fc3RvcmFnZS5tX2NvbHMsDQorICAgICAgICAgIl0oIiwNCisgICAgICAgICAgICNhcnJheSgNCisgICAgICAgICAgICBleHByIDogICAgWygkYy5tX3N0b3JhZ2UubV9kYXRhKVskaV0sZ10sDQorICAgICAgICAgICAgc2l6ZSA6ICAgICRjLlJvd3NBdENvbXBpbGVUaW1lKiRjLm1fc3RvcmFnZS5tX2NvbHMNCisgICAgICAgICAgICksDQorICAgICAgICAgIikiDQorICAgICAgKQ0KKyAgICkNCit9DQorDQorOyBEeW5hbWljIHJvd3MsIGZpeGVkIGNvbHVtbnMgbWF0cml4IChDb2xNYWpvciBhbmQgUm93TWFqb3Igc3VwcG9ydCkNCitFaWdlbjo6TWF0cml4PCosLTEsKiwqLCosKj57DQorICBjaGlsZHJlbg0KKyAgICgNCisgICAgICAjKA0KKyAgICAgICAgIFtpbnRlcm5hbHNdOiBbJGMsIV0sDQorICAgICAgICAgcm93czogJGMubV9zdG9yYWdlLm1fcm93cywNCisgICAgICAgICBjb2xzOiAkYy5Db2xzQXRDb21waWxlVGltZSwNCisgICAgICAgICA7IENoZWNrIGZvciBSb3dNYWpvckJpdA0KKyAgICAgICAgICNpZiAoJGMuRmxhZ3MgJiAweDEpICgNCisgICAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgICAgICByYW5rOiAyLA0KKyAgICAgICAgICAgICAgICBiYXNlOiAwLA0KKyAgICAgICAgICAgICAgICBleHByOiAoJGMubV9zdG9yYWdlLm1fZGF0YSlbKCRpICUgJGMubV9zdG9yYWdlLm1fcm93cykqJGMuQ29sc0F0Q29tcGlsZVRpbWUgKyAoKCRpLSAkaSAlICRjLm1fc3RvcmFnZS5tX3Jvd3MpLyRjLm1fc3RvcmFnZS5tX3Jvd3MpXSwgDQorICAgICAgICAgICAgICAgIHNpemU6ICgkcj09MSkqJGMubV9zdG9yYWdlLm1fcm93cysoJHI9PTApKiRjLkNvbHNBdENvbXBpbGVUaW1lDQorICAgICAgICAgICAgICkNCisgICAgICAgICApICNlbHNlICgNCisgICAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgICAgICByYW5rOiAyLA0KKyAgICAgICAgICAgICAgICBiYXNlOiAwLA0KKyAgICAgICAgICAgICAgICBleHByOiAoJGMubV9zdG9yYWdlLm1fZGF0YSlbJGldLA0KKyAgICAgICAgICAgICAgICBzaXplOiAoJHI9PTEpKiRjLm1fc3RvcmFnZS5tX3Jvd3MrKCRyPT0wKSokYy5Db2xzQXRDb21waWxlVGltZQ0KKyAgICAgICAgICAgICApDQorICAgICAgICAgKQ0KKyAgICAgICkNCisgICApDQorDQorICAgcHJldmlldw0KKyAgICgNCisgICAgICMoDQorICAgICAgICAgIlsiLA0KKyAgICAgICAgICAgJGMubV9zdG9yYWdlLm1fcm93cywNCisgICAgICAgICAiLCIsDQorICAgICAgICAgICAkYy5Db2xzQXRDb21waWxlVGltZSwNCisgICAgICAgICAiXSgiLA0KKyAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgIGV4cHIgOiAgICBbKCRjLm1fc3RvcmFnZS5tX2RhdGEpWyRpXSxnXSwNCisgICAgICAgICAgICBzaXplIDogICAgJGMubV9zdG9yYWdlLm1fcm93cyokYy5Db2xzQXRDb21waWxlVGltZQ0KKyAgICAgICAgICAgKSwNCisgICAgICAgICAiKSINCisgICAgICApDQorICAgKQ0KK30NCisNCis7IEZpeGVkIHNpemUgbWF0cml4IChDb2xNYWpvciBhbmQgUm93TWFqb3Igc3VwcG9ydCkNCitFaWdlbjo6TWF0cml4PCosKiwqLCosKiwqPnsNCisgIGNoaWxkcmVuDQorICAgKA0KKyAgICAgICMoDQorICAgICAgICAgW2ludGVybmFsc106IFskYywhXSwNCisgICAgICAgICByb3dzOiAkYy5Sb3dzQXRDb21waWxlVGltZSwNCisgICAgICAgICBjb2xzOiAkYy5Db2xzQXRDb21waWxlVGltZSwNCisgICAgICAgICA7IENoZWNrIGZvciBSb3dNYWpvckJpdA0KKyAgICAgICAgICNpZiAoJGMuRmxhZ3MgJiAweDEpICgNCisgICAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgICAgICByYW5rOiAyLA0KKyAgICAgICAgICAgICAgICBiYXNlOiAwLA0KKyAgICAgICAgICAgICAgICBleHByOiAoJGMubV9zdG9yYWdlLm1fZGF0YS5hcnJheSlbKCRpICUgJGMuUm93c0F0Q29tcGlsZVRpbWUpKiRjLkNvbHNBdENvbXBpbGVUaW1lICsgKCgkaS0gJGkgJSAkYy5Sb3dzQXRDb21waWxlVGltZSkvJGMuUm93c0F0Q29tcGlsZVRpbWUpXSwgDQorICAgICAgICAgICAgICAgIHNpemU6ICgkcj09MSkqJGMuUm93c0F0Q29tcGlsZVRpbWUrKCRyPT0wKSokYy5Db2xzQXRDb21waWxlVGltZQ0KKyAgICAgICAgICAgICApDQorICAgICAgICAgKSAjZWxzZSAoDQorICAgICAgICAgICAgICNhcnJheSgNCisgICAgICAgICAgICAgICAgcmFuazogMiwNCisgICAgICAgICAgICAgICAgYmFzZTogMCwNCisgICAgICAgICAgICAgICAgZXhwcjogKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWyRpXSwNCisgICAgICAgICAgICAgICAgc2l6ZTogKCRyPT0xKSokYy5Sb3dzQXRDb21waWxlVGltZSsoJHI9PTApKiRjLkNvbHNBdENvbXBpbGVUaW1lDQorICAgICAgICAgICAgICkNCisgICAgICAgICApDQorICAgICAgKQ0KKyAgICkNCisNCisgICBwcmV2aWV3DQorICAgKA0KKyAgICAgIygNCisgICAgICAgICAiWyIsDQorICAgICAgICAgICAkYy5Sb3dzQXRDb21waWxlVGltZSwNCisgICAgICAgICAiLCIsDQorICAgICAgICAgICAkYy5Db2xzQXRDb21waWxlVGltZSwNCisgICAgICAgICAiXSgiLA0KKyAgICAgICAgICAgI2FycmF5KA0KKyAgICAgICAgICAgIGV4cHIgOiAgICBbKCRjLm1fc3RvcmFnZS5tX2RhdGEuYXJyYXkpWyRpXSxnXSwNCisgICAgICAgICAgICBzaXplIDogICAgJGMuUm93c0F0Q29tcGlsZVRpbWUqJGMuQ29sc0F0Q29tcGlsZVRpbWUNCisgICAgICAgICAgICksDQorICAgICAgICAgIikiDQorICAgICAgKQ0KKyAgICkNCit9DQpkaWZmIC0tZ2l0IGEvZGVtb3MvQ01ha2VMaXN0cy50eHQgYi9kZW1vcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQyZWRkCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMyBAQAorcHJvamVjdChFaWdlbkRlbW9zKQorCithZGRfY3VzdG9tX3RhcmdldChkZW1vcykKKworaWYoTk9UIEVJR0VOX1RFU1RfTk9RVCkKKyAgZmluZF9wYWNrYWdlKFF0NCkKKyAgaWYoUVQ0X0ZPVU5EKQorICAgIGFkZF9zdWJkaXJlY3RvcnkobWFuZGVsYnJvdCkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KG9wZW5nbCkKKyAgZWxzZShRVDRfRk9VTkQpCisgICAgbWVzc2FnZShTVEFUVVMgIlF0NCBub3QgZm91bmQsIHNvIGRpc2FibGluZyB0aGUgbWFuZGVsYnJvdCBhbmQgb3BlbmdsIGRlbW9zIikKKyAgZW5kaWYoUVQ0X0ZPVU5EKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvZGVtb3MvbWFuZGVsYnJvdC9DTWFrZUxpc3RzLnR4dCBiL2RlbW9zL21hbmRlbGJyb3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1MDBlMAotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL21hbmRlbGJyb3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMSBAQAorZmluZF9wYWNrYWdlKFF0NCBSRVFVSVJFRCkKKworc2V0KENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCisKK2lmIChDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisgICBzZXQgKCBDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtTzIiKQorICAgYWRkX2RlZmluaXRpb25zICggIi1ETkRFQlVHIiApCitlbmRpZiAoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCAke1FUX0lOQ0xVREVfRElSfSApCisKK3NldChtYW5kZWxicm90X1NSQ1MKKyAgICBtYW5kZWxicm90LmNwcAorKQorCitxdDRfYXV0b21vYygke21hbmRlbGJyb3RfU1JDU30pCisKK2FkZF9leGVjdXRhYmxlKG1hbmRlbGJyb3QgJHttYW5kZWxicm90X1NSQ1N9KQorYWRkX2RlcGVuZGVuY2llcyhkZW1vcyBtYW5kZWxicm90KQorCit0YXJnZXRfbGlua19saWJyYXJpZXMobWFuZGVsYnJvdCAke1FUX1FUQ09SRV9MSUJSQVJZfSAke1FUX1FUR1VJX0xJQlJBUll9KQpkaWZmIC0tZ2l0IGEvZGVtb3MvbWFuZGVsYnJvdC9SRUFETUUgYi9kZW1vcy9tYW5kZWxicm90L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDUxZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvbWFuZGVsYnJvdC9SRUFETUUKQEAgLTAsMCArMSwxMCBAQAorKioqIE1hbmRlbGJyb3QgZGVtbyAqKioKKworQ29udHJvbHM6CisqIExlZnQgbW91c2UgYnV0dG9uIHRvIGNlbnRlciB2aWV3IGF0IGEgcG9pbnQuCisqIERyYWcgdmVydGljYWxseSB3aXRoIGxlZnQgbW91c2UgYnV0dG9uIHRvIHpvb20gaW4gYW5kIG91dC4KKworQmUgc3VyZSB0byBlbmFibGUgU1NFMiBvciBBbHRpVmVjIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCisKK1RoZSBudW1iZXIgb2YgaXRlcmF0aW9ucywgYW5kIHRoZSBjaG9pY2UgYmV0d2VlbiBzaW5nbGUgYW5kIGRvdWJsZSBwcmVjaXNpb24sIGFyZQorZGV0ZXJtaW5lZCBhdCBydW50aW1lIGRlcGVuZGluZyBvbiB0aGUgem9vbSBsZXZlbC4KZGlmZiAtLWdpdCBhL2RlbW9zL21hbmRlbGJyb3QvbWFuZGVsYnJvdC5jcHAgYi9kZW1vcy9tYW5kZWxicm90L21hbmRlbGJyb3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTc1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9tYW5kZWxicm90L21hbmRlbGJyb3QuY3BwCkBAIC0wLDAgKzEsMjEzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYW5kZWxicm90LmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZTxRdEd1aS9RUGFpbnRlcj4KKyNpbmNsdWRlPFF0R3VpL1FJbWFnZT4KKyNpbmNsdWRlPFF0R3VpL1FNb3VzZUV2ZW50PgorI2luY2x1ZGU8UXRDb3JlL1FUaW1lPgorCit2b2lkIE1hbmRlbGJyb3RXaWRnZXQ6OnJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCAqKQoreworICBpZihzaXplIDwgd2lkdGgoKSAqIGhlaWdodCgpKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJyZWFsbG9jYXRlIGJ1ZmZlciIgPDwgc3RkOjplbmRsOworICAgIHNpemUgPSB3aWR0aCgpICogaGVpZ2h0KCk7CisgICAgaWYoYnVmZmVyKSBkZWxldGVbXWJ1ZmZlcjsKKyAgICBidWZmZXIgPSBuZXcgdW5zaWduZWQgY2hhcls0KnNpemVdOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBpdGVyc19iZWZvcmVfdGVzdCB7IGVudW0geyByZXQgPSA4IH07IH07Cit0ZW1wbGF0ZTw+IHN0cnVjdCBpdGVyc19iZWZvcmVfdGVzdDxkb3VibGU+IHsgZW51bSB7IHJldCA9IDE2IH07IH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFJlYWw+IHZvaWQgTWFuZGVsYnJvdFRocmVhZDo6cmVuZGVyKGludCBpbWdfd2lkdGgsIGludCBpbWdfaGVpZ2h0KQoreworICBlbnVtIHsgcGFja2V0U2l6ZSA9IEVpZ2VuOjppbnRlcm5hbDo6cGFja2V0X3RyYWl0czxSZWFsPjo6c2l6ZSB9OyAvLyBudW1iZXIgb2YgcmVhbHMgaW4gYSBQYWNrZXQKKyAgdHlwZWRlZiBFaWdlbjo6QXJyYXk8UmVhbCwgcGFja2V0U2l6ZSwgMT4gUGFja2V0OyAvLyB3cmFwIGEgUGFja2V0IGFzIGEgdmVjdG9yCisKKyAgZW51bSB7IGl0ZXJzX2JlZm9yZV90ZXN0ID0gaXRlcnNfYmVmb3JlX3Rlc3Q8UmVhbD46OnJldCB9OworICBtYXhfaXRlciA9IChtYXhfaXRlciAvIGl0ZXJzX2JlZm9yZV90ZXN0KSAqIGl0ZXJzX2JlZm9yZV90ZXN0OworICBjb25zdCBpbnQgYWxpZ25lZFdpZHRoID0gKGltZ193aWR0aC9wYWNrZXRTaXplKSpwYWNrZXRTaXplOworICB1bnNpZ25lZCBjaGFyICpjb25zdCBidWZmZXIgPSB3aWRnZXQtPmJ1ZmZlcjsKKyAgY29uc3QgZG91YmxlIHhyYWRpdXMgPSB3aWRnZXQtPnhyYWRpdXM7CisgIGNvbnN0IGRvdWJsZSB5cmFkaXVzID0geHJhZGl1cyAqIGltZ19oZWlnaHQgLyBpbWdfd2lkdGg7CisgIGNvbnN0IGludCB0aHJlYWRjb3VudCA9IHdpZGdldC0+dGhyZWFkY291bnQ7CisgIHR5cGVkZWYgRWlnZW46OkFycmF5PFJlYWwsIDIsIDE+IFZlY3RvcjI7CisgIFZlY3RvcjIgc3RhcnQod2lkZ2V0LT5jZW50ZXIueCgpIC0gd2lkZ2V0LT54cmFkaXVzLCB3aWRnZXQtPmNlbnRlci55KCkgLSB5cmFkaXVzKTsKKyAgVmVjdG9yMiBzdGVwKDIqd2lkZ2V0LT54cmFkaXVzL2ltZ193aWR0aCwgMip5cmFkaXVzL2ltZ19oZWlnaHQpOworICB0b3RhbF9pdGVyID0gMDsKKworICBmb3IoaW50IHkgPSBpZDsgeSA8IGltZ19oZWlnaHQ7IHkgKz0gdGhyZWFkY291bnQpCisgIHsKKyAgICBpbnQgcGl4ID0geSAqIGltZ193aWR0aDsKKworICAgIC8vIGZvciBlYWNoIHBpeGVsLCB3ZSdyZSBnb2luZyB0byBkbyB0aGUgaXRlcmF0aW9uIHogOj0gel4yICsgYyB3aGVyZSB6IGFuZCBjIGFyZSBjb21wbGV4IG51bWJlcnMsIAorICAgIC8vIHN0YXJ0aW5nIHdpdGggeiA9IGMgPSBjb21wbGV4IGNvb3JkIG9mIHRoZSBwaXhlbC4gcHppIGFuZCBwenIgZGVub3RlIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgb2Ygei4KKyAgICAvLyBwY2kgYW5kIHBjciBkZW5vdGUgdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiBjLgorCisgICAgUGFja2V0IHB6aV9zdGFydCwgcGNpX3N0YXJ0OworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBwYWNrZXRTaXplOyBpKyspIHB6aV9zdGFydFtpXSA9IHBjaV9zdGFydFtpXSA9IHN0YXJ0LnkoKSArIHkgKiBzdGVwLnkoKTsKKworICAgIGZvcihpbnQgeCA9IDA7IHggPCBhbGlnbmVkV2lkdGg7IHggKz0gcGFja2V0U2l6ZSwgcGl4ICs9IHBhY2tldFNpemUpCisgICAgeworICAgICAgUGFja2V0IHBjciwgcGNpID0gcGNpX3N0YXJ0LCBwenIsIHB6aSA9IHB6aV9zdGFydCwgcHpyX2J1ZjsKKyAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBwYWNrZXRTaXplOyBpKyspIHB6cltpXSA9IHBjcltpXSA9IHN0YXJ0LngoKSArICh4K2kpICogc3RlcC54KCk7CisKKyAgICAgIC8vIGRvIHRoZSBpdGVyYXRpb25zLiBFdmVyeSBpdGVyc19iZWZvcmVfdGVzdCBpdGVyYXRpb25zIHdlIGNoZWNrIGZvciBkaXZlcmdlbmNlLAorICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBjYW4gc3RvcCBpdGVyYXRpbmcuCisgICAgICBpbnQgaiA9IDA7CisgICAgICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8aW50LCBwYWNrZXRTaXplLCAxPiBQYWNrZXRpOworICAgICAgUGFja2V0aSBwaXhfaXRlciA9IFBhY2tldGk6Olplcm8oKSwgLy8gbnVtYmVyIG9mIGl0ZXJhdGlvbiBwZXIgcGl4ZWwgaW4gdGhlIHBhY2tldAorICAgICAgICAgICAgICBwaXhfZG9udF9kaXZlcmdlOyAvLyB3aGV0aGVyIG9yIG5vdCBlYWNoIHBpeGVsIGhhcyBhbHJlYWR5IGRpdmVyZ2VkCisgICAgICBkbworICAgICAgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaXRlcnNfYmVmb3JlX3Rlc3QvNDsgaSsrKSAvLyBwZWVsIHRoZSBpbm5lciBsb29wIGJ5IDQKKyAgICAgICAgeworIyAgICAgICAgIGRlZmluZSBJVEVSQVRFIFwKKyAgICAgICAgICAgIHB6cl9idWYgPSBwenI7IFwKKyAgICAgICAgICAgIHB6ciA9IHB6ci5zcXVhcmUoKTsgXAorICAgICAgICAgICAgcHpyIC09IHB6aS5zcXVhcmUoKTsgXAorICAgICAgICAgICAgcHpyICs9IHBjcjsgXAorICAgICAgICAgICAgcHppID0gKDIqcHpyX2J1ZikqcHppOyBcCisgICAgICAgICAgICBwemkgKz0gcGNpOworICAgICAgICAgIElURVJBVEUgSVRFUkFURSBJVEVSQVRFIElURVJBVEUKKyAgICAgICAgfQorICAgICAgICBwaXhfZG9udF9kaXZlcmdlID0gKChwenIuc3F1YXJlKCkgKyBwemkuc3F1YXJlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXZhbCgpIC8vIHRlbXBvcmFyeSBmaXggYXMgd2hhdCBmb2xsb3dzIGlzIG5vdCB5ZXQgdmVjdG9yaXplZCBieSBFaWdlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gUGFja2V0OjpDb25zdGFudCg0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIDQgaGVyZSBpcyBub3QgYSBtYWdpYyB2YWx1ZSwgaXQncyBhIG1hdGggZmFjdCB0aGF0IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcXVhcmUgbW9kdWx1cyBpcyA+NCB0aGVuIGRpdmVyZ2VuY2UgaXMgaW5ldml0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSBjYXN0PGludD4oKTsKKyAgICAgICAgcGl4X2l0ZXIgKz0gaXRlcnNfYmVmb3JlX3Rlc3QgKiBwaXhfZG9udF9kaXZlcmdlOworICAgICAgICBqKys7CisgICAgICAgIHRvdGFsX2l0ZXIgKz0gaXRlcnNfYmVmb3JlX3Rlc3QgKiBwYWNrZXRTaXplOworICAgICAgfQorICAgICAgd2hpbGUoaiA8IG1heF9pdGVyL2l0ZXJzX2JlZm9yZV90ZXN0ICYmIHBpeF9kb250X2RpdmVyZ2UuYW55KCkpOyAvLyBhbnkoKSBpcyBub3QgeWV0IHZlY3Rvcml6ZWQgYnkgRWlnZW4KKworICAgICAgLy8gY29tcHV0ZSBwaXhlbCBjb2xvcnMKKyAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBwYWNrZXRTaXplOyBpKyspCisgICAgICB7CisgICAgICAgIGJ1ZmZlcls0KihwaXgraSldID0gMjU1KnBpeF9pdGVyW2ldL21heF9pdGVyOworICAgICAgICBidWZmZXJbNCoocGl4K2kpKzFdID0gMDsKKyAgICAgICAgYnVmZmVyWzQqKHBpeCtpKSsyXSA9IDA7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgdGhlIHdpZHRoIGlzIG5vdCBhIG11bHRpcGxlIG9mIHBhY2tldFNpemUsIGZpbGwgdGhlIHJlbWFpbmRlciBpbiBibGFjaworICAgIGZvcihpbnQgeCA9IGFsaWduZWRXaWR0aDsgeCA8IGltZ193aWR0aDsgeCsrLCBwaXgrKykKKyAgICAgIGJ1ZmZlcls0KnBpeF0gPSBidWZmZXJbNCpwaXgrMV0gPSBidWZmZXJbNCpwaXgrMl0gPSAwOworICB9CisgIHJldHVybjsKK30KKwordm9pZCBNYW5kZWxicm90VGhyZWFkOjpydW4oKQoreworICBzZXRUZXJtaW5hdGlvbkVuYWJsZWQodHJ1ZSk7CisgIGRvdWJsZSByZXNvbHV0aW9uID0gd2lkZ2V0LT54cmFkaXVzKjIvd2lkZ2V0LT53aWR0aCgpOworICBtYXhfaXRlciA9IDEyODsKKyAgaWYocmVzb2x1dGlvbiA8IDFlLTRmKSBtYXhfaXRlciArPSAxMjggKiAoIC0gNCAtIHN0ZDo6bG9nMTAocmVzb2x1dGlvbikpOworICBpbnQgaW1nX3dpZHRoID0gd2lkZ2V0LT53aWR0aCgpL3dpZGdldC0+ZHJhZnQ7CisgIGludCBpbWdfaGVpZ2h0ID0gd2lkZ2V0LT5oZWlnaHQoKS93aWRnZXQtPmRyYWZ0OworICBzaW5nbGVfcHJlY2lzaW9uID0gcmVzb2x1dGlvbiA+IDFlLTdmOworCisgIGlmKHNpbmdsZV9wcmVjaXNpb24pCisgICAgcmVuZGVyPGZsb2F0PihpbWdfd2lkdGgsIGltZ19oZWlnaHQpOworICBlbHNlCisgICAgcmVuZGVyPGRvdWJsZT4oaW1nX3dpZHRoLCBpbWdfaGVpZ2h0KTsKK30KKwordm9pZCBNYW5kZWxicm90V2lkZ2V0OjpwYWludEV2ZW50KFFQYWludEV2ZW50ICopCit7CisgIHN0YXRpYyBmbG9hdCBtYXhfc3BlZWQgPSAwOworICBsb25nIGxvbmcgdG90YWxfaXRlciA9IDA7CisKKyAgUVRpbWUgdGltZTsKKyAgdGltZS5zdGFydCgpOworICBmb3IoaW50IHRoID0gMDsgdGggPCB0aHJlYWRjb3VudDsgdGgrKykKKyAgICB0aHJlYWRzW3RoXS0+c3RhcnQoUVRocmVhZDo6TG93UHJpb3JpdHkpOworICBmb3IoaW50IHRoID0gMDsgdGggPCB0aHJlYWRjb3VudDsgdGgrKykKKyAgeworICAgIHRocmVhZHNbdGhdLT53YWl0KCk7CisgICAgdG90YWxfaXRlciArPSB0aHJlYWRzW3RoXS0+dG90YWxfaXRlcjsKKyAgfQorICBpbnQgZWxhcHNlZCA9IHRpbWUuZWxhcHNlZCgpOworCisgIGlmKGRyYWZ0ID09IDEpCisgIHsKKyAgICBmbG9hdCBzcGVlZCA9IGVsYXBzZWQgPyBmbG9hdCh0b3RhbF9pdGVyKSoxMDAwL2VsYXBzZWQgOiAwOworICAgIG1heF9zcGVlZCA9IHN0ZDo6bWF4KG1heF9zcGVlZCwgc3BlZWQpOworICAgIHN0ZDo6Y291dCA8PCB0aHJlYWRjb3VudCA8PCAiIHRocmVhZHMsICIKKyAgICAgICAgICAgICAgPDwgZWxhcHNlZCA8PCAiIG1zLCAiCisgICAgICAgICAgICAgIDw8IHNwZWVkIDw8ICIgaXRlcnMvcyAobWF4ICIgPDwgbWF4X3NwZWVkIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisgICAgaW50IHBhY2tldFNpemUgPSB0aHJlYWRzWzBdLT5zaW5nbGVfcHJlY2lzaW9uCisgICAgICAgICAgICAgICAgICAgPyBpbnQoRWlnZW46OmludGVybmFsOjpwYWNrZXRfdHJhaXRzPGZsb2F0Pjo6c2l6ZSkKKyAgICAgICAgICAgICAgICAgICA6IGludChFaWdlbjo6aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8ZG91YmxlPjo6c2l6ZSk7CisgICAgc2V0V2luZG93VGl0bGUoUVN0cmluZygicmVzb2x1dGlvbiAiKStRU3RyaW5nOjpudW1iZXIoeHJhZGl1cyoyL3dpZHRoKCksICdlJywgMikKKyAgICAgICAgICAgICAgICAgICtRU3RyaW5nKCIsICUxIGl0ZXJhdGlvbnMgcGVyIHBpeGVsLCAiKS5hcmcodGhyZWFkc1swXS0+bWF4X2l0ZXIpCisgICAgICAgICAgICAgICAgICArKHRocmVhZHNbMF0tPnNpbmdsZV9wcmVjaXNpb24gPyBRU3RyaW5nKCJzaW5nbGUgIikgOiBRU3RyaW5nKCJkb3VibGUgIikpCisgICAgICAgICAgICAgICAgICArUVN0cmluZygicHJlY2lzaW9uLCAiKQorICAgICAgICAgICAgICAgICAgKyhwYWNrZXRTaXplPT0xID8gUVN0cmluZygibm8gdmVjdG9yaXphdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBRU3RyaW5nKCJ2ZWN0b3JpemVkICglMSBwZXIgcGFja2V0KSIpLmFyZyhwYWNrZXRTaXplKSkpOworICB9CisgIAorICBRSW1hZ2UgaW1hZ2UoYnVmZmVyLCB3aWR0aCgpL2RyYWZ0LCBoZWlnaHQoKS9kcmFmdCwgUUltYWdlOjpGb3JtYXRfUkdCMzIpOworICBRUGFpbnRlciBwYWludGVyKHRoaXMpOworICBwYWludGVyLmRyYXdJbWFnZShRUG9pbnQoMCwgMCksIGltYWdlLnNjYWxlZCh3aWR0aCgpLCBoZWlnaHQoKSkpOworCisgIGlmKGRyYWZ0PjEpCisgIHsKKyAgICBkcmFmdCAvPSAyOworICAgIHNldFdpbmRvd1RpdGxlKFFTdHJpbmcoInJlY29tcHV0aW5nIGF0IDEvJTEgcmVzb2x1dGlvbi4uLiIpLmFyZyhkcmFmdCkpOworICAgIHVwZGF0ZSgpOworICB9Cit9CisKK3ZvaWQgTWFuZGVsYnJvdFdpZGdldDo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICpldmVudCkKK3sKKyAgaWYoIGV2ZW50LT5idXR0b25zKCkgJiBRdDo6TGVmdEJ1dHRvbiApCisgIHsKKyAgICBsYXN0cG9zID0gZXZlbnQtPnBvcygpOworICAgIGRvdWJsZSB5cmFkaXVzID0geHJhZGl1cyAqIGhlaWdodCgpIC8gd2lkdGgoKTsKKyAgICBjZW50ZXIgPSBFaWdlbjo6VmVjdG9yMmQoY2VudGVyLngoKSArIChldmVudC0+cG9zKCkueCgpIC0gd2lkdGgoKS8yKSAqIHhyYWRpdXMgKiAyIC8gd2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyLnkoKSArIChldmVudC0+cG9zKCkueSgpIC0gaGVpZ2h0KCkvMikgKiB5cmFkaXVzICogMiAvIGhlaWdodCgpKTsKKyAgICBkcmFmdCA9IDE2OworICAgIGZvcihpbnQgdGggPSAwOyB0aCA8IHRocmVhZGNvdW50OyB0aCsrKQorICAgICAgdGhyZWFkc1t0aF0tPnRlcm1pbmF0ZSgpOworICAgIHVwZGF0ZSgpOworICB9Cit9CisKK3ZvaWQgTWFuZGVsYnJvdFdpZGdldDo6bW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQgKmV2ZW50KQoreworICBRUG9pbnQgZGVsdGEgPSBldmVudC0+cG9zKCkgLSBsYXN0cG9zOworICBsYXN0cG9zID0gZXZlbnQtPnBvcygpOworICBpZiggZXZlbnQtPmJ1dHRvbnMoKSAmIFF0OjpMZWZ0QnV0dG9uICkKKyAgeworICAgIGRvdWJsZSB0ID0gMSArIDUgKiBkb3VibGUoZGVsdGEueSgpKSAvIGhlaWdodCgpOworICAgIGlmKHQgPCAwLjUpIHQgPSAwLjU7CisgICAgaWYodCA+IDIpIHQgPSAyOworICAgIHhyYWRpdXMgKj0gdDsKKyAgICBkcmFmdCA9IDE2OworICAgIGZvcihpbnQgdGggPSAwOyB0aCA8IHRocmVhZGNvdW50OyB0aCsrKQorICAgICAgdGhyZWFkc1t0aF0tPnRlcm1pbmF0ZSgpOworICAgIHVwZGF0ZSgpOworICB9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIFFBcHBsaWNhdGlvbiBhcHAoYXJnYywgYXJndik7CisgIE1hbmRlbGJyb3RXaWRnZXQgdzsKKyAgdy5zaG93KCk7CisgIHJldHVybiBhcHAuZXhlYygpOworfQorCisjaW5jbHVkZSAibWFuZGVsYnJvdC5tb2MiCmRpZmYgLS1naXQgYS9kZW1vcy9tYW5kZWxicm90L21hbmRlbGJyb3QuaCBiL2RlbW9zL21hbmRlbGJyb3QvbWFuZGVsYnJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ODdmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9tYW5kZWxicm90L21hbmRlbGJyb3QuaApAQCAtMCwwICsxLDcxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgTUFOREVMQlJPVF9ICisjZGVmaW5lIE1BTkRFTEJST1RfSAorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxRdEd1aS9RQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UXRHdWkvUVdpZGdldD4KKyNpbmNsdWRlIDxRdENvcmUvUVRocmVhZD4KKworY2xhc3MgTWFuZGVsYnJvdFdpZGdldDsKKworY2xhc3MgTWFuZGVsYnJvdFRocmVhZCA6IHB1YmxpYyBRVGhyZWFkCit7CisgICAgZnJpZW5kIGNsYXNzIE1hbmRlbGJyb3RXaWRnZXQ7CisgICAgTWFuZGVsYnJvdFdpZGdldCAqd2lkZ2V0OworICAgIGxvbmcgbG9uZyB0b3RhbF9pdGVyOworICAgIGludCBpZCwgbWF4X2l0ZXI7CisgICAgYm9vbCBzaW5nbGVfcHJlY2lzaW9uOworCisgIHB1YmxpYzoKKyAgICBNYW5kZWxicm90VGhyZWFkKE1hbmRlbGJyb3RXaWRnZXQgKncsIGludCBpKSA6IHdpZGdldCh3KSwgaWQoaSkge30KKyAgICB2b2lkIHJ1bigpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJlYWw+IHZvaWQgcmVuZGVyKGludCBpbWdfd2lkdGgsIGludCBpbWdfaGVpZ2h0KTsKK307CisKK2NsYXNzIE1hbmRlbGJyb3RXaWRnZXQgOiBwdWJsaWMgUVdpZGdldAoreworICAgIFFfT0JKRUNUCisKKyAgICBmcmllbmQgY2xhc3MgTWFuZGVsYnJvdFRocmVhZDsKKyAgICBFaWdlbjo6VmVjdG9yMmQgY2VudGVyOworICAgIGRvdWJsZSB4cmFkaXVzOworICAgIGludCBzaXplOworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgICBRUG9pbnQgbGFzdHBvczsKKyAgICBpbnQgZHJhZnQ7CisgICAgTWFuZGVsYnJvdFRocmVhZCAqKnRocmVhZHM7CisgICAgaW50IHRocmVhZGNvdW50OworCisgIHByb3RlY3RlZDoKKyAgICB2b2lkIHJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCAqKTsKKyAgICB2b2lkIHBhaW50RXZlbnQoUVBhaW50RXZlbnQgKik7CisgICAgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQgKmV2ZW50KTsKKyAgICB2b2lkIG1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICpldmVudCk7CisKKyAgcHVibGljOgorICAgIE1hbmRlbGJyb3RXaWRnZXQoKSA6IFFXaWRnZXQoKSwgY2VudGVyKDAsMCksIHhyYWRpdXMoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSgwKSwgYnVmZmVyKDApLCBkcmFmdCgxNikKKyAgICB7CisgICAgICBzZXRBdXRvRmlsbEJhY2tncm91bmQoZmFsc2UpOworICAgICAgdGhyZWFkY291bnQgPSBRVGhyZWFkOjppZGVhbFRocmVhZENvdW50KCk7CisgICAgICB0aHJlYWRzID0gbmV3IE1hbmRlbGJyb3RUaHJlYWQqW3RocmVhZGNvdW50XTsKKyAgICAgIGZvcihpbnQgdGggPSAwOyB0aCA8IHRocmVhZGNvdW50OyB0aCsrKSB0aHJlYWRzW3RoXSA9IG5ldyBNYW5kZWxicm90VGhyZWFkKHRoaXMsIHRoKTsKKyAgICB9CisgICAgfk1hbmRlbGJyb3RXaWRnZXQoKQorICAgIHsKKyAgICAgIGlmKGJ1ZmZlcikgZGVsZXRlW11idWZmZXI7CisgICAgICBmb3IoaW50IHRoID0gMDsgdGggPCB0aHJlYWRjb3VudDsgdGgrKykgZGVsZXRlIHRocmVhZHNbdGhdOworICAgICAgZGVsZXRlW10gdGhyZWFkczsKKyAgICB9Cit9OworCisjZW5kaWYgLy8gTUFOREVMQlJPVF9ICmRpZmYgLS1naXQgYS9kZW1vcy9taXhfZWlnZW5fYW5kX2MvUkVBRE1FIGIvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWRiYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL1JFQURNRQpAQCAtMCwwICsxLDkgQEAKK1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBob3cgb25lIGNhbiB3cmFwIHNvbWUgb2YgRWlnZW4gaW50byBhIEMgbGlicmFyeS4KKworVG8gdHJ5IHRoaXMgd2l0aCBHQ0MsIGRvOgorCisgIGcrKyAtYyBiaW5hcnlfbGlicmFyeS5jcHAgLU8yIC1tc3NlMiAtSSAuLi8uLgorICBnY2MgZXhhbXBsZS5jIGJpbmFyeV9saWJyYXJ5Lm8gLW8gZXhhbXBsZSAtbHN0ZGMrKworICAuL2V4YW1wbGUKKworVE9ETzogYWRkIENNYWtlTGlzdHMsIGFkZCBtb3JlIGV4cGxhbmF0aW9ucyBoZXJlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2JpbmFyeV9saWJyYXJ5LmNwcCBiL2RlbW9zL21peF9laWdlbl9hbmRfYy9iaW5hcnlfbGlicmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhMmQwMwotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL21peF9laWdlbl9hbmRfYy9iaW5hcnlfbGlicmFyeS5jcHAKQEAgLTAsMCArMSwxODUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gVGhpcyBDKysgZmlsZSBjb21waWxlcyB0byBiaW5hcnkgY29kZSB0aGF0IGNhbiBiZSBsaW5rZWQgdG8gYnkgeW91ciBDIHByb2dyYW0sCisvLyB0aGFua3MgdG8gdGhlIGV4dGVybiAiQyIgc3ludGF4IHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9ucyBpbiBiaW5hcnlfbGlicmFyeS5oLgorCisjaW5jbHVkZSAiYmluYXJ5X2xpYnJhcnkuaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogcG9pbnRlciBjb252ZXJzaW9uIG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vLy8vIGNsYXNzIE1hdHJpeFhkIC8vLy8vLworCitpbmxpbmUgTWF0cml4WGQmIGNfdG9fZWlnZW4oQ19NYXRyaXhYZCogcHRyKQoreworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4WGQqPihwdHIpOworfQorCitpbmxpbmUgY29uc3QgTWF0cml4WGQmIGNfdG9fZWlnZW4oY29uc3QgQ19NYXRyaXhYZCogcHRyKQoreworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWF0cml4WGQqPihwdHIpOworfQorCitpbmxpbmUgQ19NYXRyaXhYZCogZWlnZW5fdG9fYyhNYXRyaXhYZCYgcmVmKQoreworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDX01hdHJpeFhkKj4oJnJlZik7Cit9CisKK2lubGluZSBjb25zdCBDX01hdHJpeFhkKiBlaWdlbl90b19jKGNvbnN0IE1hdHJpeFhkJiByZWYpCit7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IENfTWF0cml4WGQqPigmcmVmKTsKK30KKworLy8vLy8vIGNsYXNzIE1hcDxNYXRyaXhYZD4gLy8vLy8vCisKK2lubGluZSBNYXA8TWF0cml4WGQ+JiBjX3RvX2VpZ2VuKENfTWFwX01hdHJpeFhkKiBwdHIpCit7CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxNYXA8TWF0cml4WGQ+Kj4ocHRyKTsKK30KKworaW5saW5lIGNvbnN0IE1hcDxNYXRyaXhYZD4mIGNfdG9fZWlnZW4oY29uc3QgQ19NYXBfTWF0cml4WGQqIHB0cikKK3sKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IE1hcDxNYXRyaXhYZD4qPihwdHIpOworfQorCitpbmxpbmUgQ19NYXBfTWF0cml4WGQqIGVpZ2VuX3RvX2MoTWFwPE1hdHJpeFhkPiYgcmVmKQoreworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDX01hcF9NYXRyaXhYZCo+KCZyZWYpOworfQorCitpbmxpbmUgY29uc3QgQ19NYXBfTWF0cml4WGQqIGVpZ2VuX3RvX2MoY29uc3QgTWFwPE1hdHJpeFhkPiYgcmVmKQoreworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDX01hcF9NYXRyaXhYZCo+KCZyZWYpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIGltcGxlbWVudGF0aW9uIG9mIGNsYXNzZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvLy8vLy8gY2xhc3MgTWF0cml4WGQgLy8vLy8vCisKKworQ19NYXRyaXhYZCogTWF0cml4WGRfbmV3KGludCByb3dzLCBpbnQgY29scykKK3sKKyAgcmV0dXJuIGVpZ2VuX3RvX2MoKm5ldyBNYXRyaXhYZChyb3dzLGNvbHMpKTsKK30KKwordm9pZCBNYXRyaXhYZF9kZWxldGUoQ19NYXRyaXhYZCAqbSkKK3sKKyAgZGVsZXRlICZjX3RvX2VpZ2VuKG0pOworfQorCitkb3VibGUqIE1hdHJpeFhkX2RhdGEoQ19NYXRyaXhYZCAqbSkKK3sKKyAgcmV0dXJuIGNfdG9fZWlnZW4obSkuZGF0YSgpOworfQorCit2b2lkIE1hdHJpeFhkX3NldF96ZXJvKENfTWF0cml4WGQgKm0pCit7CisgIGNfdG9fZWlnZW4obSkuc2V0WmVybygpOworfQorCit2b2lkIE1hdHJpeFhkX3Jlc2l6ZShDX01hdHJpeFhkICptLCBpbnQgcm93cywgaW50IGNvbHMpCit7CisgIGNfdG9fZWlnZW4obSkucmVzaXplKHJvd3MsY29scyk7Cit9CisKK3ZvaWQgTWF0cml4WGRfY29weShDX01hdHJpeFhkICpkc3QsIGNvbnN0IENfTWF0cml4WGQgKnNyYykKK3sKKyAgY190b19laWdlbihkc3QpID0gY190b19laWdlbihzcmMpOworfQorCit2b2lkIE1hdHJpeFhkX2NvcHlfbWFwKENfTWF0cml4WGQgKmRzdCwgY29uc3QgQ19NYXBfTWF0cml4WGQgKnNyYykKK3sKKyAgY190b19laWdlbihkc3QpID0gY190b19laWdlbihzcmMpOworfQorCit2b2lkIE1hdHJpeFhkX3NldF9jb2VmZihDX01hdHJpeFhkICptLCBpbnQgaSwgaW50IGosIGRvdWJsZSBjb2VmZikKK3sKKyAgY190b19laWdlbihtKShpLGopID0gY29lZmY7Cit9CisKK2RvdWJsZSBNYXRyaXhYZF9nZXRfY29lZmYoY29uc3QgQ19NYXRyaXhYZCAqbSwgaW50IGksIGludCBqKQoreworICByZXR1cm4gY190b19laWdlbihtKShpLGopOworfQorCit2b2lkIE1hdHJpeFhkX3ByaW50KGNvbnN0IENfTWF0cml4WGQgKm0pCit7CisgIHN0ZDo6Y291dCA8PCBjX3RvX2VpZ2VuKG0pIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBNYXRyaXhYZF9tdWx0aXBseShjb25zdCBDX01hdHJpeFhkICptMSwgY29uc3QgQ19NYXRyaXhYZCAqbTIsIENfTWF0cml4WGQgKnJlc3VsdCkKK3sKKyAgY190b19laWdlbihyZXN1bHQpID0gY190b19laWdlbihtMSkgKiBjX3RvX2VpZ2VuKG0yKTsKK30KKwordm9pZCBNYXRyaXhYZF9hZGQoY29uc3QgQ19NYXRyaXhYZCAqbTEsIGNvbnN0IENfTWF0cml4WGQgKm0yLCBDX01hdHJpeFhkICpyZXN1bHQpCit7CisgIGNfdG9fZWlnZW4ocmVzdWx0KSA9IGNfdG9fZWlnZW4obTEpICsgY190b19laWdlbihtMik7Cit9CisKKworCisvLy8vLy8gY2xhc3MgTWFwX01hdHJpeFhkIC8vLy8vLworCisKK0NfTWFwX01hdHJpeFhkKiBNYXBfTWF0cml4WGRfbmV3KGRvdWJsZSAqYXJyYXksIGludCByb3dzLCBpbnQgY29scykKK3sKKyAgcmV0dXJuIGVpZ2VuX3RvX2MoKm5ldyBNYXA8TWF0cml4WGQ+KGFycmF5LHJvd3MsY29scykpOworfQorCit2b2lkIE1hcF9NYXRyaXhYZF9kZWxldGUoQ19NYXBfTWF0cml4WGQgKm0pCit7CisgIGRlbGV0ZSAmY190b19laWdlbihtKTsKK30KKwordm9pZCBNYXBfTWF0cml4WGRfc2V0X3plcm8oQ19NYXBfTWF0cml4WGQgKm0pCit7CisgIGNfdG9fZWlnZW4obSkuc2V0WmVybygpOworfQorCit2b2lkIE1hcF9NYXRyaXhYZF9jb3B5KENfTWFwX01hdHJpeFhkICpkc3QsIGNvbnN0IENfTWFwX01hdHJpeFhkICpzcmMpCit7CisgIGNfdG9fZWlnZW4oZHN0KSA9IGNfdG9fZWlnZW4oc3JjKTsKK30KKwordm9pZCBNYXBfTWF0cml4WGRfY29weV9tYXRyaXgoQ19NYXBfTWF0cml4WGQgKmRzdCwgY29uc3QgQ19NYXRyaXhYZCAqc3JjKQoreworICBjX3RvX2VpZ2VuKGRzdCkgPSBjX3RvX2VpZ2VuKHNyYyk7Cit9CisKK3ZvaWQgTWFwX01hdHJpeFhkX3NldF9jb2VmZihDX01hcF9NYXRyaXhYZCAqbSwgaW50IGksIGludCBqLCBkb3VibGUgY29lZmYpCit7CisgIGNfdG9fZWlnZW4obSkoaSxqKSA9IGNvZWZmOworfQorCitkb3VibGUgTWFwX01hdHJpeFhkX2dldF9jb2VmZihjb25zdCBDX01hcF9NYXRyaXhYZCAqbSwgaW50IGksIGludCBqKQoreworICByZXR1cm4gY190b19laWdlbihtKShpLGopOworfQorCit2b2lkIE1hcF9NYXRyaXhYZF9wcmludChjb25zdCBDX01hcF9NYXRyaXhYZCAqbSkKK3sKKyAgc3RkOjpjb3V0IDw8IGNfdG9fZWlnZW4obSkgPDwgc3RkOjplbmRsOworfQorCit2b2lkIE1hcF9NYXRyaXhYZF9tdWx0aXBseShjb25zdCBDX01hcF9NYXRyaXhYZCAqbTEsIGNvbnN0IENfTWFwX01hdHJpeFhkICptMiwgQ19NYXBfTWF0cml4WGQgKnJlc3VsdCkKK3sKKyAgY190b19laWdlbihyZXN1bHQpID0gY190b19laWdlbihtMSkgKiBjX3RvX2VpZ2VuKG0yKTsKK30KKwordm9pZCBNYXBfTWF0cml4WGRfYWRkKGNvbnN0IENfTWFwX01hdHJpeFhkICptMSwgY29uc3QgQ19NYXBfTWF0cml4WGQgKm0yLCBDX01hcF9NYXRyaXhYZCAqcmVzdWx0KQoreworICBjX3RvX2VpZ2VuKHJlc3VsdCkgPSBjX3RvX2VpZ2VuKG0xKSArIGNfdG9fZWlnZW4obTIpOworfQpkaWZmIC0tZ2l0IGEvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2JpbmFyeV9saWJyYXJ5LmggYi9kZW1vcy9taXhfZWlnZW5fYW5kX2MvYmluYXJ5X2xpYnJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjk4M2FkCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2JpbmFyeV9saWJyYXJ5LmgKQEAgLTAsMCArMSw3MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBUaGlzIGlzIGEgcHVyZSBDIGhlYWRlciwgbm8gQysrIGhlcmUuCisvLyBUaGUgZnVuY3Rpb25zIGRlY2xhcmVkIGhlcmUgd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBDKysgYnV0CisvLyB3ZSBkb24ndCBoYXZlIHRvIGtub3csIGJlY2F1c2UgdGhhbmtzIHRvIHRoZSBleHRlcm4gIkMiIHN5bnRheCwKKy8vIHRoZXkgd2lsbCBiZSBjb21waWxlZCB0byBDIG9iamVjdCBjb2RlLgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisgIC8vIGp1c3QgZHVtbXkgZW1wdHkgc3RydWN0cyB0byBnaXZlIGRpZmZlcmVudCBwb2ludGVyIHR5cGVzLAorICAvLyBpbnN0ZWFkIG9mIHVzaW5nIHZvaWQqIHdoaWNoIHdvdWxkIGJlIHR5cGUgdW5zYWZlCisgIHN0cnVjdCBDX01hdHJpeFhkIHt9OworICBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQge307CisKKyAgLy8gdGhlIENfTWF0cml4WGQgY2xhc3MsIHdyYXBzIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkKKyAgLy8gb2YgRWlnZW46Ok1hdHJpeFhkLgorICBzdHJ1Y3QgQ19NYXRyaXhYZCogTWF0cml4WGRfbmV3KGludCByb3dzLCBpbnQgY29scyk7CisgIHZvaWQgICAgTWF0cml4WGRfZGVsZXRlICAgICAoc3RydWN0IENfTWF0cml4WGQgKm0pOworICBkb3VibGUqIE1hdHJpeFhkX2RhdGEgICAgICAgKHN0cnVjdCBDX01hdHJpeFhkICptKTsKKyAgdm9pZCAgICBNYXRyaXhYZF9zZXRfemVybyAgIChzdHJ1Y3QgQ19NYXRyaXhYZCAqbSk7CisgIHZvaWQgICAgTWF0cml4WGRfcmVzaXplICAgICAoc3RydWN0IENfTWF0cml4WGQgKm0sIGludCByb3dzLCBpbnQgY29scyk7CisgIHZvaWQgICAgTWF0cml4WGRfY29weSAgICAgICAoc3RydWN0IENfTWF0cml4WGQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqc3JjKTsKKyAgdm9pZCAgICBNYXRyaXhYZF9jb3B5X21hcCAgIChzdHJ1Y3QgQ19NYXRyaXhYZCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqc3JjKTsgIAorICB2b2lkICAgIE1hdHJpeFhkX3NldF9jb2VmZiAgKHN0cnVjdCBDX01hdHJpeFhkICptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgaiwgZG91YmxlIGNvZWZmKTsKKyAgZG91YmxlICBNYXRyaXhYZF9nZXRfY29lZmYgIChjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGopOworICB2b2lkICAgIE1hdHJpeFhkX3ByaW50ICAgICAgKGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICptKTsKKyAgdm9pZCAgICBNYXRyaXhYZF9hZGQgICAgICAgIChjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKm0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDX01hdHJpeFhkICpyZXN1bHQpOyAgCisgIHZvaWQgICAgTWF0cml4WGRfbXVsdGlwbHkgICAoY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKm0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICptMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ19NYXRyaXhYZCAqcmVzdWx0KTsKKyAgCisgIC8vIHRoZSBDX01hcF9NYXRyaXhYZCBjbGFzcywgd3JhcHMgc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eQorICAvLyBvZiBFaWdlbjo6TWFwPE1hdHJpeFhkPgorICBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQqIE1hcF9NYXRyaXhYZF9uZXcoZG91YmxlICphcnJheSwgaW50IHJvd3MsIGludCBjb2xzKTsKKyAgdm9pZCAgIE1hcF9NYXRyaXhYZF9kZWxldGUgICAgIChzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0pOworICB2b2lkICAgTWFwX01hdHJpeFhkX3NldF96ZXJvICAgKHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbSk7CisgIHZvaWQgICBNYXBfTWF0cml4WGRfY29weSAgICAgICAoc3RydWN0IENfTWFwX01hdHJpeFhkICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICpzcmMpOworICB2b2lkICAgTWFwX01hdHJpeFhkX2NvcHlfbWF0cml4KHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICpzcmMpOyAgCisgIHZvaWQgICBNYXBfTWF0cml4WGRfc2V0X2NvZWZmICAoc3RydWN0IENfTWFwX01hdHJpeFhkICptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgaiwgZG91YmxlIGNvZWZmKTsKKyAgZG91YmxlIE1hcF9NYXRyaXhYZF9nZXRfY29lZmYgIChjb25zdCBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBqKTsKKyAgdm9pZCAgIE1hcF9NYXRyaXhYZF9wcmludCAgICAgIChjb25zdCBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0pOworICB2b2lkICAgTWFwX01hdHJpeFhkX2FkZCAgICAgICAgKGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKnJlc3VsdCk7ICAKKyAgdm9pZCAgIE1hcF9NYXRyaXhYZF9tdWx0aXBseSAgIChjb25zdCBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENfTWFwX01hdHJpeFhkICpyZXN1bHQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZW5kIGV4dGVybiAiQyIKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RlbW9zL21peF9laWdlbl9hbmRfYy9leGFtcGxlLmMgYi9kZW1vcy9taXhfZWlnZW5fYW5kX2MvZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGViNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9taXhfZWlnZW5fYW5kX2MvZXhhbXBsZS5jCkBAIC0wLDAgKzEsNjUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgImJpbmFyeV9saWJyYXJ5LmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKwordm9pZCBkZW1vX01hdHJpeFhkKCkKK3sKKyAgc3RydWN0IENfTWF0cml4WGQgKm1hdHJpeDEsICptYXRyaXgyLCAqcmVzdWx0OworICBwcmludGYoIioqKiBkZW1vX01hdHJpeFhkICoqKlxuIik7CisgIAorICBtYXRyaXgxID0gTWF0cml4WGRfbmV3KDMsIDMpOworICBNYXRyaXhYZF9zZXRfemVybyhtYXRyaXgxKTsKKyAgTWF0cml4WGRfc2V0X2NvZWZmKG1hdHJpeDEsIDAsIDEsIDIuNSk7CisgIE1hdHJpeFhkX3NldF9jb2VmZihtYXRyaXgxLCAxLCAwLCAxLjQpOworICBwcmludGYoIkhlcmUgaXMgbWF0cml4MTpcbiIpOworICBNYXRyaXhYZF9wcmludChtYXRyaXgxKTsKKworICBtYXRyaXgyID0gTWF0cml4WGRfbmV3KDMsIDMpOworICBNYXRyaXhYZF9tdWx0aXBseShtYXRyaXgxLCBtYXRyaXgxLCBtYXRyaXgyKTsKKyAgcHJpbnRmKCJIZXJlIGlzIG1hdHJpeDEqbWF0cml4MTpcbiIpOworICBNYXRyaXhYZF9wcmludChtYXRyaXgyKTsKKworICBNYXRyaXhYZF9kZWxldGUobWF0cml4MSk7CisgIE1hdHJpeFhkX2RlbGV0ZShtYXRyaXgyKTsKK30KKworLy8gdGhpcyBoZWxwZXIgZnVuY3Rpb24gdGFrZXMgYSBwbGFpbiBDIGFycmF5IGFuZCBwcmludHMgaXQgaW4gb25lIGxpbmUKK3ZvaWQgcHJpbnRfYXJyYXkoZG91YmxlICphcnJheSwgaW50IG4pCit7CisgIHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbSA9IE1hcF9NYXRyaXhYZF9uZXcoYXJyYXksIDEsIG4pOworICBNYXBfTWF0cml4WGRfcHJpbnQobSk7CisgIE1hcF9NYXRyaXhYZF9kZWxldGUobSk7Cit9CisKK3ZvaWQgZGVtb19NYXBfTWF0cml4WGQoKQoreworICBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm1hcDsKKyAgZG91YmxlIGFycmF5WzVdOworICBpbnQgaTsKKyAgcHJpbnRmKCIqKiogZGVtb19NYXBfTWF0cml4WGQgKioqXG4iKTsKKyAgCisgIGZvcihpID0gMDsgaSA8IDU7ICsraSkgYXJyYXlbaV0gPSBpOworICBwcmludGYoIkluaXRpYWxseSwgdGhlIGFycmF5IGlzOlxuIik7CisgIHByaW50X2FycmF5KGFycmF5LCA1KTsKKyAgCisgIG1hcCA9IE1hcF9NYXRyaXhYZF9uZXcoYXJyYXksIDUsIDEpOworICBNYXBfTWF0cml4WGRfYWRkKG1hcCwgbWFwLCBtYXApOworICBNYXBfTWF0cml4WGRfZGVsZXRlKG1hcCk7CisKKyAgcHJpbnRmKCJOb3cgdGhlIGFycmF5IGlzOlxuIik7CisgIHByaW50X2FycmF5KGFycmF5LCA1KTsKK30KKworaW50IG1haW4oKQoreworICBkZW1vX01hdHJpeFhkKCk7CisgIGRlbW9fTWFwX01hdHJpeFhkKCk7Cit9CmRpZmYgLS1naXQgYS9kZW1vcy9vcGVuZ2wvQ01ha2VMaXN0cy50eHQgYi9kZW1vcy9vcGVuZ2wvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4YTMwYwotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL29wZW5nbC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIwIEBACitmaW5kX3BhY2thZ2UoUXQ0IFJFUVVJUkVEKQorZmluZF9wYWNrYWdlKE9wZW5HTCBSRVFVSVJFRCkKKworc2V0KFFUX1VTRV9RVE9QRU5HTCBUUlVFKQoraW5jbHVkZSgke1FUX1VTRV9GSUxFfSkKKworc2V0KENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoICR7UVRfSU5DTFVERV9ESVJ9ICkKKworc2V0KHF1YXRlcm5pb25fZGVtb19TUkNTICBncHVoZWxwZXIuY3BwIGljb3NwaGVyZS5jcHAgY2FtZXJhLmNwcCB0cmFja2JhbGwuY3BwIHF1YXRlcm5pb25fZGVtby5jcHApCisKK3F0NF9hdXRvbW9jKCR7cXVhdGVybmlvbl9kZW1vX1NSQ1N9KQorCithZGRfZXhlY3V0YWJsZShxdWF0ZXJuaW9uX2RlbW8gJHtxdWF0ZXJuaW9uX2RlbW9fU1JDU30pCithZGRfZGVwZW5kZW5jaWVzKGRlbW9zIHF1YXRlcm5pb25fZGVtbykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHF1YXRlcm5pb25fZGVtbworICAke1FUX1FUQ09SRV9MSUJSQVJZfSAgICAke1FUX1FUR1VJX0xJQlJBUll9CisgICR7UVRfUVRPUEVOR0xfTElCUkFSWX0gICR7T1BFTkdMX0xJQlJBUklFU30gKQpkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL1JFQURNRSBiL2RlbW9zL29wZW5nbC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiMTY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL29wZW5nbC9SRUFETUUKQEAgLTAsMCArMSwxMyBAQAorCitOYXZpZ2F0aW9uOgorIGxlZnQgYnV0dG9uOiAgICAgICAgICAgcm90YXRlIGFyb3VuZCB0aGUgdGFyZ2V0CisgbWlkZGxlIGJ1dHRvbjogICAgICAgICB6b29tCisgbGVmdCBidXR0b24gKyBjdHJsICAgICBxdWFrZSByb3RhdGUgKHJvdGF0ZSBhcm91bmQgY2FtZXJhIHBvc2l0aW9uKQorIG1pZGRsZSBidXR0b24gKyBjdHJsICAgd2FsayAocHJvZ3Jlc3MgYWxvbmcgY2FtZXJhJ3MgeiBkaXJlY3Rpb24pCisgbGVmdCBidXR0b246ICAgICAgICAgICBwYW4gKHRyYW5zbGF0ZSBpbiB0aGUgWFkgY2FtZXJhJ3MgcGxhbmUpCisKK1IgOiBtb3ZlIHRoZSBjYW1lcmEgdG8gaW5pdGlhbCBwb3NpdGlvbgorQSA6IHN0YXJ0L3N0b3AgYW5pbWF0aW9uCitDIDogY2xlYXIgdGhlIGFuaW1hdGlvbgorRyA6IGFkZCBhIGtleSBmcmFtZQorCmRpZmYgLS1naXQgYS9kZW1vcy9vcGVuZ2wvY2FtZXJhLmNwcCBiL2RlbW9zL29wZW5nbC9jYW1lcmEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjM0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9vcGVuZ2wvY2FtZXJhLmNwcApAQCAtMCwwICsxLDI2NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAiY2FtZXJhLmgiCisKKyNpbmNsdWRlICJncHVoZWxwZXIuaCIKKyNpbmNsdWRlIDxHTC9nbHUuaD4KKworI2luY2x1ZGUgIkVpZ2VuL0xVIgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitDYW1lcmE6OkNhbWVyYSgpCisgICAgOiBtVmlld0lzVXB0b2RhdGUoZmFsc2UpLCBtUHJvaklzVXB0b2RhdGUoZmFsc2UpCit7CisgICAgbVZpZXdNYXRyaXguc2V0SWRlbnRpdHkoKTsKKyAgICAKKyAgICBtRm92WSA9IE1fUEkvMy47CisgICAgbU5lYXJEaXN0ID0gMS47CisgICAgbUZhckRpc3QgPSA1MDAwMC47CisgICAgCisgICAgbVZwWCA9IDA7CisgICAgbVZwWSA9IDA7CisKKyAgICBzZXRQb3NpdGlvbihWZWN0b3IzZjo6Q29uc3RhbnQoMTAwLikpOworICAgIHNldFRhcmdldChWZWN0b3IzZjo6WmVybygpKTsKK30KKworQ2FtZXJhJiBDYW1lcmE6Om9wZXJhdG9yPShjb25zdCBDYW1lcmEmIG90aGVyKQoreworICAgIG1WaWV3SXNVcHRvZGF0ZSA9IGZhbHNlOworICAgIG1Qcm9qSXNVcHRvZGF0ZSA9IGZhbHNlOworICAgIAorICAgIG1WcFggPSBvdGhlci5tVnBYOworICAgIG1WcFkgPSBvdGhlci5tVnBZOworICAgIG1WcFdpZHRoID0gb3RoZXIubVZwV2lkdGg7CisgICAgbVZwSGVpZ2h0ID0gb3RoZXIubVZwSGVpZ2h0OworCisgICAgbVRhcmdldCA9IG90aGVyLm1UYXJnZXQ7CisgICAgbUZvdlkgPSBvdGhlci5tRm92WTsKKyAgICBtTmVhckRpc3QgPSBvdGhlci5tTmVhckRpc3Q7CisgICAgbUZhckRpc3QgPSBvdGhlci5tRmFyRGlzdDsKKyAgICAKKyAgICBtVmlld01hdHJpeCA9IG90aGVyLm1WaWV3TWF0cml4OworICAgIG1Qcm9qZWN0aW9uTWF0cml4ID0gb3RoZXIubVByb2plY3Rpb25NYXRyaXg7CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0NhbWVyYTo6Q2FtZXJhKGNvbnN0IENhbWVyYSYgb3RoZXIpCit7CisgICAgKnRoaXMgPSBvdGhlcjsKK30KKworQ2FtZXJhOjp+Q2FtZXJhKCkKK3sKK30KKworCit2b2lkIENhbWVyYTo6c2V0Vmlld3BvcnQodWludCBvZmZzZXR4LCB1aW50IG9mZnNldHksIHVpbnQgd2lkdGgsIHVpbnQgaGVpZ2h0KQoreworICAgIG1WcFggPSBvZmZzZXR4OworICAgIG1WcFkgPSBvZmZzZXR5OworICAgIG1WcFdpZHRoID0gd2lkdGg7CisgICAgbVZwSGVpZ2h0ID0gaGVpZ2h0OworICAgIAorICAgIG1Qcm9qSXNVcHRvZGF0ZSA9IGZhbHNlOworfQorCit2b2lkIENhbWVyYTo6c2V0Vmlld3BvcnQodWludCB3aWR0aCwgdWludCBoZWlnaHQpCit7CisgICAgbVZwV2lkdGggPSB3aWR0aDsKKyAgICBtVnBIZWlnaHQgPSBoZWlnaHQ7CisgICAgCisgICAgbVByb2pJc1VwdG9kYXRlID0gZmFsc2U7Cit9CisKK3ZvaWQgQ2FtZXJhOjpzZXRGb3ZZKGZsb2F0IHZhbHVlKQoreworICAgIG1Gb3ZZID0gdmFsdWU7CisgICAgbVByb2pJc1VwdG9kYXRlID0gZmFsc2U7Cit9CisKK1ZlY3RvcjNmIENhbWVyYTo6ZGlyZWN0aW9uKHZvaWQpIGNvbnN0Cit7CisgICAgcmV0dXJuIC0gKG9yaWVudGF0aW9uKCkgKiBWZWN0b3IzZjo6VW5pdFooKSk7Cit9CitWZWN0b3IzZiBDYW1lcmE6OnVwKHZvaWQpIGNvbnN0Cit7CisgICAgcmV0dXJuIG9yaWVudGF0aW9uKCkgKiBWZWN0b3IzZjo6VW5pdFkoKTsKK30KK1ZlY3RvcjNmIENhbWVyYTo6cmlnaHQodm9pZCkgY29uc3QKK3sKKyAgICByZXR1cm4gb3JpZW50YXRpb24oKSAqIFZlY3RvcjNmOjpVbml0WCgpOworfQorCit2b2lkIENhbWVyYTo6c2V0RGlyZWN0aW9uKGNvbnN0IFZlY3RvcjNmJiBuZXdEaXJlY3Rpb24pCit7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQgaXQgY29tcHV0aW5nIHRoZSByb3RhdGlvbiBiZXR3ZWVuIG5ld0RpcmVjdGlvbiBhbmQgY3VycmVudCBkaXIgPworICAgIFZlY3RvcjNmIHVwID0gdGhpcy0+dXAoKTsKKyAgICAKKyAgICBNYXRyaXgzZiBjYW1BeGVzOworCisgICAgY2FtQXhlcy5jb2woMikgPSAoLW5ld0RpcmVjdGlvbikubm9ybWFsaXplZCgpOworICAgIGNhbUF4ZXMuY29sKDApID0gdXAuY3Jvc3MoIGNhbUF4ZXMuY29sKDIpICkubm9ybWFsaXplZCgpOworICAgIGNhbUF4ZXMuY29sKDEpID0gY2FtQXhlcy5jb2woMikuY3Jvc3MoIGNhbUF4ZXMuY29sKDApICkubm9ybWFsaXplZCgpOworICAgIHNldE9yaWVudGF0aW9uKFF1YXRlcm5pb25mKGNhbUF4ZXMpKTsKKyAgICAKKyAgICBtVmlld0lzVXB0b2RhdGUgPSBmYWxzZTsKK30KKwordm9pZCBDYW1lcmE6OnNldFRhcmdldChjb25zdCBWZWN0b3IzZiYgdGFyZ2V0KQoreworICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgaWYgKCFtVGFyZ2V0LmlzQXBwcm94KHBvc2l0aW9uKCkpKQorICAgIHsKKyAgICAgICAgVmVjdG9yM2YgbmV3RGlyZWN0aW9uID0gbVRhcmdldCAtIHBvc2l0aW9uKCk7CisgICAgICAgIHNldERpcmVjdGlvbihuZXdEaXJlY3Rpb24ubm9ybWFsaXplZCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhOjpzZXRQb3NpdGlvbihjb25zdCBWZWN0b3IzZiYgcCkKK3sKKyAgICBtRnJhbWUucG9zaXRpb24gPSBwOworICAgIG1WaWV3SXNVcHRvZGF0ZSA9IGZhbHNlOworfQorCit2b2lkIENhbWVyYTo6c2V0T3JpZW50YXRpb24oY29uc3QgUXVhdGVybmlvbmYmIHEpCit7CisgICAgbUZyYW1lLm9yaWVudGF0aW9uID0gcTsKKyAgICBtVmlld0lzVXB0b2RhdGUgPSBmYWxzZTsKK30KKwordm9pZCBDYW1lcmE6OnNldEZyYW1lKGNvbnN0IEZyYW1lJiBmKQoreworICBtRnJhbWUgPSBmOworICBtVmlld0lzVXB0b2RhdGUgPSBmYWxzZTsKK30KKwordm9pZCBDYW1lcmE6OnJvdGF0ZUFyb3VuZFRhcmdldChjb25zdCBRdWF0ZXJuaW9uZiYgcSkKK3sKKyAgICBNYXRyaXg0ZiBtcm90LCBtdCwgbXRtOworICAgIAorICAgIC8vIHVwZGF0ZSB0aGUgdHJhbnNmb3JtIG1hdHJpeAorICAgIHVwZGF0ZVZpZXdNYXRyaXgoKTsKKyAgICBWZWN0b3IzZiB0ID0gbVZpZXdNYXRyaXggKiBtVGFyZ2V0OworCisgICAgbVZpZXdNYXRyaXggPSBUcmFuc2xhdGlvbjNmKHQpCisgICAgICAgICAgICAgICAgKiBxCisgICAgICAgICAgICAgICAgKiBUcmFuc2xhdGlvbjNmKC10KQorICAgICAgICAgICAgICAgICogbVZpZXdNYXRyaXg7CisgICAgCisgICAgUXVhdGVybmlvbmYgcWEobVZpZXdNYXRyaXgubGluZWFyKCkpOworICAgIHFhID0gcWEuY29uanVnYXRlKCk7CisgICAgc2V0T3JpZW50YXRpb24ocWEpOworICAgIHNldFBvc2l0aW9uKC0gKHFhICogbVZpZXdNYXRyaXgudHJhbnNsYXRpb24oKSkgKTsKKworICAgIG1WaWV3SXNVcHRvZGF0ZSA9IHRydWU7Cit9CisKK3ZvaWQgQ2FtZXJhOjpsb2NhbFJvdGF0ZShjb25zdCBRdWF0ZXJuaW9uZiYgcSkKK3sKKyAgICBmbG9hdCBkaXN0ID0gKHBvc2l0aW9uKCkgLSBtVGFyZ2V0KS5ub3JtKCk7CisgICAgc2V0T3JpZW50YXRpb24ob3JpZW50YXRpb24oKSAqIHEpOworICAgIG1UYXJnZXQgPSBwb3NpdGlvbigpICsgZGlzdCAqIGRpcmVjdGlvbigpOworICAgIG1WaWV3SXNVcHRvZGF0ZSA9IGZhbHNlOworfQorCit2b2lkIENhbWVyYTo6em9vbShmbG9hdCBkKQoreworICAgIGZsb2F0IGRpc3QgPSAocG9zaXRpb24oKSAtIG1UYXJnZXQpLm5vcm0oKTsKKyAgICBpZihkaXN0ID4gZCkKKyAgICB7CisgICAgICAgIHNldFBvc2l0aW9uKHBvc2l0aW9uKCkgKyBkaXJlY3Rpb24oKSAqIGQpOworICAgICAgICBtVmlld0lzVXB0b2RhdGUgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhOjpsb2NhbFRyYW5zbGF0ZShjb25zdCBWZWN0b3IzZiYgdCkKK3sKKyAgVmVjdG9yM2YgdHJhbnMgPSBvcmllbnRhdGlvbigpICogdDsKKyAgc2V0UG9zaXRpb24oIHBvc2l0aW9uKCkgKyB0cmFucyApOworICBzZXRUYXJnZXQoIG1UYXJnZXQgKyB0cmFucyApOworCisgIG1WaWV3SXNVcHRvZGF0ZSA9IGZhbHNlOworfQorCit2b2lkIENhbWVyYTo6dXBkYXRlVmlld01hdHJpeCh2b2lkKSBjb25zdAoreworICAgIGlmKCFtVmlld0lzVXB0b2RhdGUpCisgICAgeworICAgICAgICBRdWF0ZXJuaW9uZiBxID0gb3JpZW50YXRpb24oKS5jb25qdWdhdGUoKTsKKyAgICAgICAgbVZpZXdNYXRyaXgubGluZWFyKCkgPSBxLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgICAgICAgbVZpZXdNYXRyaXgudHJhbnNsYXRpb24oKSA9IC0gKG1WaWV3TWF0cml4LmxpbmVhcigpICogcG9zaXRpb24oKSk7CisKKyAgICAgICAgbVZpZXdJc1VwdG9kYXRlID0gdHJ1ZTsKKyAgICB9Cit9CisKK2NvbnN0IEFmZmluZTNmJiBDYW1lcmE6OnZpZXdNYXRyaXgodm9pZCkgY29uc3QKK3sKKyAgdXBkYXRlVmlld01hdHJpeCgpOworICByZXR1cm4gbVZpZXdNYXRyaXg7Cit9CisKK3ZvaWQgQ2FtZXJhOjp1cGRhdGVQcm9qZWN0aW9uTWF0cml4KHZvaWQpIGNvbnN0Cit7CisgIGlmKCFtUHJvaklzVXB0b2RhdGUpCisgIHsKKyAgICBtUHJvamVjdGlvbk1hdHJpeC5zZXRJZGVudGl0eSgpOworICAgIGZsb2F0IGFzcGVjdCA9IGZsb2F0KG1WcFdpZHRoKS9mbG9hdChtVnBIZWlnaHQpOworICAgIGZsb2F0IHRoZXRhID0gbUZvdlkqMC41OworICAgIGZsb2F0IHJhbmdlID0gbUZhckRpc3QgLSBtTmVhckRpc3Q7CisgICAgZmxvYXQgaW52dGFuID0gMS4vdGFuKHRoZXRhKTsKKworICAgIG1Qcm9qZWN0aW9uTWF0cml4KDAsMCkgPSBpbnZ0YW4gLyBhc3BlY3Q7CisgICAgbVByb2plY3Rpb25NYXRyaXgoMSwxKSA9IGludnRhbjsKKyAgICBtUHJvamVjdGlvbk1hdHJpeCgyLDIpID0gLShtTmVhckRpc3QgKyBtRmFyRGlzdCkgLyByYW5nZTsKKyAgICBtUHJvamVjdGlvbk1hdHJpeCgzLDIpID0gLTE7CisgICAgbVByb2plY3Rpb25NYXRyaXgoMiwzKSA9IC0yICogbU5lYXJEaXN0ICogbUZhckRpc3QgLyByYW5nZTsKKyAgICBtUHJvamVjdGlvbk1hdHJpeCgzLDMpID0gMDsKKyAgICAKKyAgICBtUHJvaklzVXB0b2RhdGUgPSB0cnVlOworICB9Cit9CisKK2NvbnN0IE1hdHJpeDRmJiBDYW1lcmE6OnByb2plY3Rpb25NYXRyaXgodm9pZCkgY29uc3QKK3sKKyAgdXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOworICByZXR1cm4gbVByb2plY3Rpb25NYXRyaXg7Cit9CisKK3ZvaWQgQ2FtZXJhOjphY3RpdmF0ZUdMKHZvaWQpCit7CisgIGdsVmlld3BvcnQodnBYKCksIHZwWSgpLCB2cFdpZHRoKCksIHZwSGVpZ2h0KCkpOworICBncHUubG9hZE1hdHJpeChwcm9qZWN0aW9uTWF0cml4KCksR0xfUFJPSkVDVElPTik7CisgIGdwdS5sb2FkTWF0cml4KHZpZXdNYXRyaXgoKS5tYXRyaXgoKSxHTF9NT0RFTFZJRVcpOworfQorCisKK1ZlY3RvcjNmIENhbWVyYTo6dW5Qcm9qZWN0KGNvbnN0IFZlY3RvcjJmJiB1diwgZmxvYXQgZGVwdGgpIGNvbnN0Cit7CisgICAgTWF0cml4NGYgaW52ID0gbVZpZXdNYXRyaXguaW52ZXJzZSgpLm1hdHJpeCgpOworICAgIHJldHVybiB1blByb2plY3QodXYsIGRlcHRoLCBpbnYpOworfQorCitWZWN0b3IzZiBDYW1lcmE6OnVuUHJvamVjdChjb25zdCBWZWN0b3IyZiYgdXYsIGZsb2F0IGRlcHRoLCBjb25zdCBNYXRyaXg0ZiYgaW52TW9kZWx2aWV3KSBjb25zdAoreworICAgIHVwZGF0ZVZpZXdNYXRyaXgoKTsKKyAgICB1cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisgICAgCisgICAgVmVjdG9yM2YgYSgyLip1di54KCkvZmxvYXQobVZwV2lkdGgpLTEuLCAyLip1di55KCkvZmxvYXQobVZwSGVpZ2h0KS0xLiwgMS4pOworICAgIGEueCgpICo9IGRlcHRoL21Qcm9qZWN0aW9uTWF0cml4KDAsMCk7CisgICAgYS55KCkgKj0gZGVwdGgvbVByb2plY3Rpb25NYXRyaXgoMSwxKTsKKyAgICBhLnooKSA9IC1kZXB0aDsKKyAgICAvLyBGSVhNRSAvXC98CisgICAgVmVjdG9yNGYgYiA9IGludk1vZGVsdmlldyAqIFZlY3RvcjRmKGEueCgpLCBhLnkoKSwgYS56KCksIDEuKTsKKyAgICByZXR1cm4gVmVjdG9yM2YoYi54KCksIGIueSgpLCBiLnooKSk7Cit9CmRpZmYgLS1naXQgYS9kZW1vcy9vcGVuZ2wvY2FtZXJhLmggYi9kZW1vcy9vcGVuZ2wvY2FtZXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MTRkMgotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL29wZW5nbC9jYW1lcmEuaApAQCAtMCwwICsxLDExOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0NBTUVSQV9ICisjZGVmaW5lIEVJR0VOX0NBTUVSQV9ICisKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxRT2JqZWN0PgorLy8gI2luY2x1ZGUgPGZyYW1lLmg+CisKK2NsYXNzIEZyYW1lCit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisgICAgCisgICAgaW5saW5lIEZyYW1lKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgcG9zID0gRWlnZW46OlZlY3RvcjNmOjpaZXJvKCksCisgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuOjpRdWF0ZXJuaW9uZiYgbyA9IEVpZ2VuOjpRdWF0ZXJuaW9uZigpKQorICAgICAgOiBvcmllbnRhdGlvbihvKSwgcG9zaXRpb24ocG9zKQorICAgIHt9CisgICAgRnJhbWUgbGVycChmbG9hdCBhbHBoYSwgY29uc3QgRnJhbWUmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBGcmFtZSgoMS5mLWFscGhhKSpwb3NpdGlvbiArIGFscGhhICogb3RoZXIucG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24uc2xlcnAoYWxwaGEsb3RoZXIub3JpZW50YXRpb24pKTsKKyAgICB9CisKKyAgICBFaWdlbjo6UXVhdGVybmlvbmYgb3JpZW50YXRpb247CisgICAgRWlnZW46OlZlY3RvcjNmIHBvc2l0aW9uOworfTsKKworY2xhc3MgQ2FtZXJhCit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisKKyAgICBDYW1lcmEodm9pZCk7CisgICAgCisgICAgQ2FtZXJhKGNvbnN0IENhbWVyYSYgb3RoZXIpOworICAgIAorICAgIHZpcnR1YWwgfkNhbWVyYSgpOworICAgIAorICAgIENhbWVyYSYgb3BlcmF0b3I9KGNvbnN0IENhbWVyYSYgb3RoZXIpOworICAgIAorICAgIHZvaWQgc2V0Vmlld3BvcnQodWludCBvZmZzZXR4LCB1aW50IG9mZnNldHksIHVpbnQgd2lkdGgsIHVpbnQgaGVpZ2h0KTsKKyAgICB2b2lkIHNldFZpZXdwb3J0KHVpbnQgd2lkdGgsIHVpbnQgaGVpZ2h0KTsKKyAgICAKKyAgICBpbmxpbmUgdWludCB2cFgodm9pZCkgY29uc3QgeyByZXR1cm4gbVZwWDsgfQorICAgIGlubGluZSB1aW50IHZwWSh2b2lkKSBjb25zdCB7IHJldHVybiBtVnBZOyB9CisgICAgaW5saW5lIHVpbnQgdnBXaWR0aCh2b2lkKSBjb25zdCB7IHJldHVybiBtVnBXaWR0aDsgfQorICAgIGlubGluZSB1aW50IHZwSGVpZ2h0KHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1WcEhlaWdodDsgfQorCisgICAgaW5saW5lIGZsb2F0IGZvdlkodm9pZCkgY29uc3QgeyByZXR1cm4gbUZvdlk7IH0KKyAgICB2b2lkIHNldEZvdlkoZmxvYXQgdmFsdWUpOworICAgIAorICAgIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgRWlnZW46OlZlY3RvcjNmJiBwb3MpOworICAgIGlubGluZSBjb25zdCBFaWdlbjo6VmVjdG9yM2YmIHBvc2l0aW9uKHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZS5wb3NpdGlvbjsgfQorCisgICAgdm9pZCBzZXRPcmllbnRhdGlvbihjb25zdCBFaWdlbjo6UXVhdGVybmlvbmYmIHEpOworICAgIGlubGluZSBjb25zdCBFaWdlbjo6UXVhdGVybmlvbmYmIG9yaWVudGF0aW9uKHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZS5vcmllbnRhdGlvbjsgfQorCisgICAgdm9pZCBzZXRGcmFtZShjb25zdCBGcmFtZSYgZik7CisgICAgY29uc3QgRnJhbWUmIGZyYW1lKHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZTsgfQorICAgIAorICAgIHZvaWQgc2V0RGlyZWN0aW9uKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgbmV3RGlyZWN0aW9uKTsKKyAgICBFaWdlbjo6VmVjdG9yM2YgZGlyZWN0aW9uKHZvaWQpIGNvbnN0OworICAgIHZvaWQgc2V0VXAoY29uc3QgRWlnZW46OlZlY3RvcjNmJiB2ZWN0b3JVcCk7CisgICAgRWlnZW46OlZlY3RvcjNmIHVwKHZvaWQpIGNvbnN0OworICAgIEVpZ2VuOjpWZWN0b3IzZiByaWdodCh2b2lkKSBjb25zdDsKKyAgICAKKyAgICB2b2lkIHNldFRhcmdldChjb25zdCBFaWdlbjo6VmVjdG9yM2YmIHRhcmdldCk7CisgICAgaW5saW5lIGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgdGFyZ2V0KHZvaWQpIHsgcmV0dXJuIG1UYXJnZXQ7IH0KKyAgICAKKyAgICBjb25zdCBFaWdlbjo6QWZmaW5lM2YmIHZpZXdNYXRyaXgodm9pZCkgY29uc3Q7CisgICAgY29uc3QgRWlnZW46Ok1hdHJpeDRmJiBwcm9qZWN0aW9uTWF0cml4KHZvaWQpIGNvbnN0OworICAgIAorICAgIHZvaWQgcm90YXRlQXJvdW5kVGFyZ2V0KGNvbnN0IEVpZ2VuOjpRdWF0ZXJuaW9uZiYgcSk7CisgICAgdm9pZCBsb2NhbFJvdGF0ZShjb25zdCBFaWdlbjo6UXVhdGVybmlvbmYmIHEpOworICAgIHZvaWQgem9vbShmbG9hdCBkKTsKKyAgICAKKyAgICB2b2lkIGxvY2FsVHJhbnNsYXRlKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgdCk7CisgICAgCisgICAgLyoqIFNldHVwIE9wZW5HTCBtYXRyaWNlcyBhbmQgdmlld3BvcnQgKi8KKyAgICB2b2lkIGFjdGl2YXRlR0wodm9pZCk7CisgICAgCisgICAgRWlnZW46OlZlY3RvcjNmIHVuUHJvamVjdChjb25zdCBFaWdlbjo6VmVjdG9yMmYmIHV2LCBmbG9hdCBkZXB0aCwgY29uc3QgRWlnZW46Ok1hdHJpeDRmJiBpbnZNb2RlbHZpZXcpIGNvbnN0OworICAgIEVpZ2VuOjpWZWN0b3IzZiB1blByb2plY3QoY29uc3QgRWlnZW46OlZlY3RvcjJmJiB1diwgZmxvYXQgZGVwdGgpIGNvbnN0OworICAgIAorICBwcm90ZWN0ZWQ6CisgICAgdm9pZCB1cGRhdGVWaWV3TWF0cml4KHZvaWQpIGNvbnN0OworICAgIHZvaWQgdXBkYXRlUHJvamVjdGlvbk1hdHJpeCh2b2lkKSBjb25zdDsKKworICBwcm90ZWN0ZWQ6CisKKyAgICB1aW50IG1WcFgsIG1WcFk7CisgICAgdWludCBtVnBXaWR0aCwgbVZwSGVpZ2h0OworCisgICAgRnJhbWUgbUZyYW1lOworICAgIAorICAgIG11dGFibGUgRWlnZW46OkFmZmluZTNmIG1WaWV3TWF0cml4OworICAgIG11dGFibGUgRWlnZW46Ok1hdHJpeDRmIG1Qcm9qZWN0aW9uTWF0cml4OworCisgICAgbXV0YWJsZSBib29sIG1WaWV3SXNVcHRvZGF0ZTsKKyAgICBtdXRhYmxlIGJvb2wgbVByb2pJc1VwdG9kYXRlOworCisgICAgLy8gdXNlZCBieSByb3RhdGVBcm91bmRUYXJnZXQKKyAgICBFaWdlbjo6VmVjdG9yM2YgbVRhcmdldDsKKyAgICAKKyAgICBmbG9hdCBtRm92WTsKKyAgICBmbG9hdCBtTmVhckRpc3Q7CisgICAgZmxvYXQgbUZhckRpc3Q7Cit9OworCisjZW5kaWYgLy8gRUlHRU5fQ0FNRVJBX0gKZGlmZiAtLWdpdCBhL2RlbW9zL29wZW5nbC9ncHVoZWxwZXIuY3BwIGIvZGVtb3Mvb3BlbmdsL2dwdWhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyMzZiMQotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL29wZW5nbC9ncHVoZWxwZXIuY3BwCkBAIC0wLDAgKzEsMTI2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJncHVoZWxwZXIuaCIKKyNpbmNsdWRlICJpY29zcGhlcmUuaCIKKyNpbmNsdWRlIDxHTC9nbHUuaD4KKy8vIFBMRUFTRSBkb24ndCBsb29rIGF0IHRoaXMgb2xkIGNvZGUuLi4gOykKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCitHcHVIZWxwZXIgZ3B1OworCitHcHVIZWxwZXI6OkdwdUhlbHBlcigpCit7CisgICAgbVZwV2lkdGggPSBtVnBIZWlnaHQgPSAwOworICAgIG1DdXJyZW50TWF0cml4VGFyZ2V0ID0gMDsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKK30KKworR3B1SGVscGVyOjp+R3B1SGVscGVyKCkKK3sKK30KKwordm9pZCBHcHVIZWxwZXI6OnB1c2hQcm9qZWN0aW9uTW9kZTJEKFByb2plY3Rpb25Nb2RlMkQgcG0pCit7CisgICAgLy8gc3dpdGNoIHRvIDJEIHByb2plY3Rpb24KKyAgICBwdXNoTWF0cml4KE1hdHJpeDRmOjpJZGVudGl0eSgpLEdMX1BST0pFQ1RJT04pOworCisgICAgaWYocG09PVBNX05vcm1hbGl6ZWQpCisgICAgeworICAgICAgICAvL2dsT3J0aG8oLTEuLCAxLiwgLTEuLCAxLiwgMC4sIDEuKTsKKyAgICB9CisgICAgZWxzZSBpZihwbT09UE1fVmlld3BvcnQpCisgICAgeworICAgICAgICBHTGludCB2cFs0XTsKKyAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9WSUVXUE9SVCwgdnApOworICAgICAgICBnbE9ydGhvKDAuLCB2cFsyXSwgMC4sIHZwWzNdLCAtMS4sIDEuKTsKKyAgICB9CisKKyAgICBwdXNoTWF0cml4KE1hdHJpeDRmOjpJZGVudGl0eSgpLEdMX01PREVMVklFVyk7Cit9CisKK3ZvaWQgR3B1SGVscGVyOjpwb3BQcm9qZWN0aW9uTW9kZTJEKHZvaWQpCit7CisgICAgcG9wTWF0cml4KEdMX1BST0pFQ1RJT04pOworICAgIHBvcE1hdHJpeChHTF9NT0RFTFZJRVcpOworfQorCit2b2lkIEdwdUhlbHBlcjo6ZHJhd1ZlY3Rvcihjb25zdCBWZWN0b3IzZiYgcG9zaXRpb24sIGNvbnN0IFZlY3RvcjNmJiB2ZWMsIGNvbnN0IENvbG9yJiBjb2xvciwgZmxvYXQgYXNwZWN0IC8qID0gNTAuKi8pCit7CisgICAgc3RhdGljIEdMVXF1YWRyaWNPYmogKmN5bGluZHJlID0gZ2x1TmV3UXVhZHJpYygpOworICAgIGdsQ29sb3I0ZnYoY29sb3IuZGF0YSgpKTsKKyAgICBmbG9hdCBsZW5ndGggPSB2ZWMubm9ybSgpOworICAgIHB1c2hNYXRyaXgoR0xfTU9ERUxWSUVXKTsKKyAgICBnbFRyYW5zbGF0ZWYocG9zaXRpb24ueCgpLCBwb3NpdGlvbi55KCksIHBvc2l0aW9uLnooKSk7CisgICAgVmVjdG9yM2YgYXggPSBNYXRyaXgzZjo6SWRlbnRpdHkoKS5jb2woMikuY3Jvc3ModmVjKTsKKyAgICBheC5ub3JtYWxpemUoKTsKKyAgICBWZWN0b3IzZiB0bXAgPSB2ZWM7CisgICAgdG1wLm5vcm1hbGl6ZSgpOworICAgIGZsb2F0IGFuZ2xlID0gMTgwLmYvTV9QSSAqIGFjb3ModG1wLnooKSk7CisgICAgaWYgKGFuZ2xlPjFlLTMpCisgICAgICAgIGdsUm90YXRlZihhbmdsZSwgYXgueCgpLCBheC55KCksIGF4LnooKSk7CisgICAgZ2x1Q3lsaW5kZXIoY3lsaW5kcmUsIGxlbmd0aC9hc3BlY3QsIGxlbmd0aC9hc3BlY3QsIDAuOCpsZW5ndGgsIDEwLCAxMCk7CisgICAgZ2xUcmFuc2xhdGVmKDAuMCwwLjAsMC44Kmxlbmd0aCk7CisgICAgZ2x1Q3lsaW5kZXIoY3lsaW5kcmUsIDIuMCpsZW5ndGgvYXNwZWN0LCAwLjAsIDAuMipsZW5ndGgsIDEwLCAxMCk7CisKKyAgICBwb3BNYXRyaXgoR0xfTU9ERUxWSUVXKTsKK30KKwordm9pZCBHcHVIZWxwZXI6OmRyYXdWZWN0b3JCb3goY29uc3QgVmVjdG9yM2YmIHBvc2l0aW9uLCBjb25zdCBWZWN0b3IzZiYgdmVjLCBjb25zdCBDb2xvciYgY29sb3IsIGZsb2F0IGFzcGVjdCkKK3sKKyAgICBzdGF0aWMgR0xVcXVhZHJpY09iaiAqY3lsaW5kcmUgPSBnbHVOZXdRdWFkcmljKCk7CisgICAgZ2xDb2xvcjRmdihjb2xvci5kYXRhKCkpOworICAgIGZsb2F0IGxlbmd0aCA9IHZlYy5ub3JtKCk7CisgICAgcHVzaE1hdHJpeChHTF9NT0RFTFZJRVcpOworICAgIGdsVHJhbnNsYXRlZihwb3NpdGlvbi54KCksIHBvc2l0aW9uLnkoKSwgcG9zaXRpb24ueigpKTsKKyAgICBWZWN0b3IzZiBheCA9IE1hdHJpeDNmOjpJZGVudGl0eSgpLmNvbCgyKS5jcm9zcyh2ZWMpOworICAgIGF4Lm5vcm1hbGl6ZSgpOworICAgIFZlY3RvcjNmIHRtcCA9IHZlYzsKKyAgICB0bXAubm9ybWFsaXplKCk7CisgICAgZmxvYXQgYW5nbGUgPSAxODAuZi9NX1BJICogYWNvcyh0bXAueigpKTsKKyAgICBpZiAoYW5nbGU+MWUtMykKKyAgICAgICAgZ2xSb3RhdGVmKGFuZ2xlLCBheC54KCksIGF4LnkoKSwgYXgueigpKTsKKyAgICBnbHVDeWxpbmRlcihjeWxpbmRyZSwgbGVuZ3RoL2FzcGVjdCwgbGVuZ3RoL2FzcGVjdCwgMC44Kmxlbmd0aCwgMTAsIDEwKTsKKyAgICBnbFRyYW5zbGF0ZWYoMC4wLDAuMCwwLjgqbGVuZ3RoKTsKKyAgICBnbFNjYWxlZig0LjAqbGVuZ3RoL2FzcGVjdCw0LjAqbGVuZ3RoL2FzcGVjdCw0LjAqbGVuZ3RoL2FzcGVjdCk7CisgICAgZHJhd1VuaXRDdWJlKCk7CisgICAgcG9wTWF0cml4KEdMX01PREVMVklFVyk7Cit9CisKK3ZvaWQgR3B1SGVscGVyOjpkcmF3VW5pdEN1YmUodm9pZCkKK3sKKyAgICBzdGF0aWMgZmxvYXQgdmVydGljZXNbXVszXSA9IHsKKyAgICAgICAgey0wLjUsLTAuNSwtMC41fSwKKyAgICAgICAgeyAwLjUsLTAuNSwtMC41fSwKKyAgICAgICAgey0wLjUsIDAuNSwtMC41fSwKKyAgICAgICAgeyAwLjUsIDAuNSwtMC41fSwKKyAgICAgICAgey0wLjUsLTAuNSwgMC41fSwKKyAgICAgICAgeyAwLjUsLTAuNSwgMC41fSwKKyAgICAgICAgey0wLjUsIDAuNSwgMC41fSwKKyAgICAgICAgeyAwLjUsIDAuNSwgMC41fX07CisKKyAgICBnbEJlZ2luKEdMX1FVQURTKTsKKyAgICBnbE5vcm1hbDNmKDAsMCwtMSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzBdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbMl0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1szXSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzFdKTsKKyAgICBnbE5vcm1hbDNmKDAsMCwgMSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzRdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbNV0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s3XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzZdKTsKKyAgICBnbE5vcm1hbDNmKDAsLTEsMCk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzBdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbMV0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s1XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzRdKTsKKyAgICBnbE5vcm1hbDNmKDAsIDEsMCk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzJdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbNl0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s3XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzNdKTsKKyAgICBnbE5vcm1hbDNmKC0xLDAsMCk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzBdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbNF0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s2XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzJdKTsKKyAgICBnbE5vcm1hbDNmKCAxLDAsMCk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzFdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbM10pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s3XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzVdKTsKKyAgICBnbEVuZCgpOworfQorCit2b2lkIEdwdUhlbHBlcjo6ZHJhd1VuaXRTcGhlcmUoaW50IGxldmVsKQoreworICBzdGF0aWMgSWNvU3BoZXJlIHNwaGVyZTsKKyAgc3BoZXJlLmRyYXcobGV2ZWwpOworfQorCisKZGlmZiAtLWdpdCBhL2RlbW9zL29wZW5nbC9ncHVoZWxwZXIuaCBiL2RlbW9zL29wZW5nbC9ncHVoZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmY5OGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb3BlbmdsL2dwdWhlbHBlci5oCkBAIC0wLDAgKzEsMjA3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fR1BVSEVMUEVSX0gKKyNkZWZpbmUgRUlHRU5fR1BVSEVMUEVSX0gKKworI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPEdML2dsLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3R5cGVkZWYgVmVjdG9yNGYgQ29sb3I7CisKK2NsYXNzIEdwdUhlbHBlcgoreworICBwdWJsaWM6CisKKyAgICBHcHVIZWxwZXIoKTsKKworICAgIH5HcHVIZWxwZXIoKTsKKworICAgIGVudW0gUHJvamVjdGlvbk1vZGUyRCB7IFBNX05vcm1hbGl6ZWQgPSAxLCBQTV9WaWV3cG9ydCA9IDIgfTsKKyAgICB2b2lkIHB1c2hQcm9qZWN0aW9uTW9kZTJEKFByb2plY3Rpb25Nb2RlMkQgcG0pOworICAgIHZvaWQgcG9wUHJvamVjdGlvbk1vZGUyRCgpOworCisgICAgLyoqIE11bHRpcGx5IHRoZSBPcGVuR0wgbWF0cml4IFxhIG1hdHJpeFRhcmdldCBieSB0aGUgbWF0cml4IFxhIG1hdC4KKyAgICAgICAgRXNzZW50aWFsbHksIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgY2FsbHMgZ2xNYXRyaXhNb2RlKG1hdHJpeFRhcmdldCkgaWYgcmVxdWlyZWQKKyAgICAgICAgYW5kIGRvZXMgYSBwcm9wZXIgY2FsbCB0byB0aGUgcmlnaHQgZ2xNdWx0TWF0cml4KigpIGZ1bmN0aW9uIGFjY29yZGluZyB0byB0aGUgc2NhbGFyIHR5cGUKKyAgICAgICAgYW5kIHN0b3JhZ2Ugb3JkZXIuCisgICAgICAgIFx3YXJuaW5nIGdsTWF0cml4TW9kZSgpIG11c3QgbmV2ZXIgYmUgY2FsbGVkIGRpcmVjdGx5LiBJZiB5b3VyJ3JlIHVuc3VyZSwgdXNlIGZvcmNlTWF0cml4TW9kZSgpLgorICAgICAgICBcc2EgTWF0cml4LCBsb2FkTWF0cml4KCksIGZvcmNlTWF0cml4TW9kZSgpCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfRmxhZ3M+CisgICAgdm9pZCBtdWx0TWF0cml4KGNvbnN0IE1hdHJpeDxTY2FsYXIsNCw0LCBfRmxhZ3MsIDQsND4mIG1hdCwgR0xlbnVtIG1hdHJpeFRhcmdldCk7CisKKyAgICAvKiogTG9hZCB0aGUgbWF0cml4IFxhIG1hdCB0byB0aGUgT3BlbkdMIG1hdHJpeCBcYSBtYXRyaXhUYXJnZXQuCisgICAgICAgIEVzc2VudGlhbGx5LCB0aGlzIGhlbHBlciBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGNhbGxzIGdsTWF0cml4TW9kZShtYXRyaXhUYXJnZXQpIGlmIHJlcXVpcmVkCisgICAgICAgIGFuZCBkb2VzIGEgcHJvcGVyIGNhbGwgdG8gdGhlIHJpZ2h0IGdsTG9hZE1hdHJpeCooKSBvciBnbExvYWRJZGVudGl0eSgpIGZ1bmN0aW9uIGFjY29yZGluZyB0byB0aGUgc2NhbGFyIHR5cGUKKyAgICAgICAgYW5kIHN0b3JhZ2Ugb3JkZXIuCisgICAgICAgIFx3YXJuaW5nIGdsTWF0cml4TW9kZSgpIG11c3QgbmV2ZXIgYmUgY2FsbGVkIGRpcmVjdGx5LiBJZiB5b3VyJ3JlIHVuc3VyZSwgdXNlIGZvcmNlTWF0cml4TW9kZSgpLgorICAgICAgICBcc2EgTWF0cml4LCBtdWx0TWF0cml4KCksIGZvcmNlTWF0cml4TW9kZSgpCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfRmxhZ3M+CisgICAgdm9pZCBsb2FkTWF0cml4KGNvbnN0IEVpZ2VuOjpNYXRyaXg8U2NhbGFyLDQsNCwgX0ZsYWdzLCA0LDQ+JiBtYXQsIEdMZW51bSBtYXRyaXhUYXJnZXQpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBEZXJpdmVkPgorICAgIHZvaWQgbG9hZE1hdHJpeCgKKyAgICAgICAgY29uc3QgRWlnZW46OkN3aXNlTnVsbGFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2lkZW50aXR5X29wPFNjYWxhcj4sRGVyaXZlZD4mLAorICAgICAgICBHTGVudW0gbWF0cml4VGFyZ2V0KTsKKworICAgIC8qKiBNYWtlIHRoZSBtYXRyaXggXGEgbWF0cml4VGFyZ2V0IHRoZSBjdXJyZW50IE9wZW5HTCBtYXRyaXggdGFyZ2V0LgorICAgICAgICBDYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGxvYWRNYXRyaXgoKSBvciBtdWx0TWF0cml4KCkgaWYgeW91IGNhbm5vdCBndWFyYW50ZWUgdGhhdCBnbE1hdHJpeE1vZGUoKQorICAgICAgICBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgbG9hZE1hdHJpeCgpIG9yIG11bHRNYXRyaXgoKSBjYWxscy4KKyAgICAgICAgXHRvZG8gcHJvdmlkZXMgYSBkZWJ1ZyBtb2RlIGNoZWNraW5nIHRoZSBzYW5pdHkgb2YgdGhlIGNhY2hlZCBtYXRyaXggbW9kZS4KKyAgICAqLworICAgIGlubGluZSB2b2lkIGZvcmNlTWF0cml4VGFyZ2V0KEdMZW51bSBtYXRyaXhUYXJnZXQpIHtnbE1hdHJpeE1vZGUobUN1cnJlbnRNYXRyaXhUYXJnZXQ9bWF0cml4VGFyZ2V0KTt9CisKKyAgICBpbmxpbmUgdm9pZCBzZXRNYXRyaXhUYXJnZXQoR0xlbnVtIG1hdHJpeFRhcmdldCk7CisKKyAgICAvKiogUHVzaCB0aGUgT3BlbkdMIG1hdHJpeCBcYSBtYXRyaXhUYXJnZXQgYW5kIGxvYWQgXGEgbWF0LgorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgX0ZsYWdzPgorICAgIGlubGluZSB2b2lkIHB1c2hNYXRyaXgoY29uc3QgTWF0cml4PFNjYWxhciw0LDQsIF9GbGFncywgNCw0PiYgbWF0LCBHTGVudW0gbWF0cml4VGFyZ2V0KTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGVyaXZlZD4KKyAgICB2b2lkIHB1c2hNYXRyaXgoCisgICAgICAgIGNvbnN0IEVpZ2VuOjpDd2lzZU51bGxhcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LERlcml2ZWQ+JiwKKyAgICAgICAgR0xlbnVtIG1hdHJpeFRhcmdldCk7CisKKyAgICAvKiogUHVzaCBhbmQgY2xvbmUgdGhlIE9wZW5HTCBtYXRyaXggXGEgbWF0cml4VGFyZ2V0CisgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBwdXNoTWF0cml4KEdMZW51bSBtYXRyaXhUYXJnZXQpOworCisgICAgLyoqIFBvcCB0aGUgT3BlbkdMIG1hdHJpeCBcYSBtYXRyaXhUYXJnZXQKKyAgICAqLworICAgIGlubGluZSB2b2lkIHBvcE1hdHJpeChHTGVudW0gbWF0cml4VGFyZ2V0KTsKKworICAgIHZvaWQgZHJhd1ZlY3Rvcihjb25zdCBWZWN0b3IzZiYgcG9zaXRpb24sIGNvbnN0IFZlY3RvcjNmJiB2ZWMsIGNvbnN0IENvbG9yJiBjb2xvciwgZmxvYXQgYXNwZWN0ID0gNTAuKTsKKyAgICB2b2lkIGRyYXdWZWN0b3JCb3goY29uc3QgVmVjdG9yM2YmIHBvc2l0aW9uLCBjb25zdCBWZWN0b3IzZiYgdmVjLCBjb25zdCBDb2xvciYgY29sb3IsIGZsb2F0IGFzcGVjdCA9IDUwLik7CisgICAgdm9pZCBkcmF3VW5pdEN1YmUodm9pZCk7CisgICAgdm9pZCBkcmF3VW5pdFNwaGVyZShpbnQgbGV2ZWw9MCk7CisKKyAgICAvLy8gZHJhdyB0aGUgXGEgbm9mRWxlbWVudCBmaXJzdCBlbGVtZW50cworICAgIGlubGluZSB2b2lkIGRyYXcoR0xlbnVtIG1vZGUsIHVpbnQgbm9mRWxlbWVudCk7CisKKyAgICAvLy8gZHJhdyBhIHJhbmdlIG9mIGVsZW1lbnRzCisgICAgaW5saW5lIHZvaWQgZHJhdyhHTGVudW0gbW9kZSwgdWludCBzdGFydCwgdWludCBlbmQpOworCisgICAgLy8vIGRyYXcgYW4gaW5kZXhlZCBzdWJzZXQKKyAgICBpbmxpbmUgdm9pZCBkcmF3KEdMZW51bSBtb2RlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50PiogcEluZGV4ZXMpOworCitwcm90ZWN0ZWQ6CisKKyAgICB2b2lkIHVwZGF0ZSh2b2lkKTsKKworICAgIEdMdWludCBtQ29sb3JCdWZmZXJJZDsKKyAgICBpbnQgbVZwV2lkdGgsIG1WcEhlaWdodDsKKyAgICBHTGVudW0gbUN1cnJlbnRNYXRyaXhUYXJnZXQ7CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7Cit9OworCisvKiogU2luZ2xldG9uIHNob3J0Y3V0CisqLworZXh0ZXJuIEdwdUhlbHBlciBncHU7CisKKworLyoqIFxpbnRlcm5hbAorKi8KK3RlbXBsYXRlPGJvb2wgUm93TWFqb3IsIGludCBfRmxhZ3M+IHN0cnVjdCBHbE1hdHJpeEhlbHBlcjsKKwordGVtcGxhdGU8aW50IF9GbGFncz4gc3RydWN0IEdsTWF0cml4SGVscGVyPGZhbHNlLF9GbGFncz4KK3sKKyAgICBzdGF0aWMgdm9pZCBsb2FkTWF0cml4KGNvbnN0IE1hdHJpeDxmbG9hdCwgNCw0LCBfRmxhZ3MsIDQsND4mICBtYXQpIHsgZ2xMb2FkTWF0cml4ZihtYXQuZGF0YSgpKTsgfQorICAgIHN0YXRpYyB2b2lkIGxvYWRNYXRyaXgoY29uc3QgTWF0cml4PGRvdWJsZSw0LDQsIF9GbGFncywgNCw0PiYgbWF0KSB7IGdsTG9hZE1hdHJpeGQobWF0LmRhdGEoKSk7IH0KKyAgICBzdGF0aWMgdm9pZCBtdWx0TWF0cml4KGNvbnN0IE1hdHJpeDxmbG9hdCwgNCw0LCBfRmxhZ3MsIDQsND4mICBtYXQpIHsgZ2xNdWx0TWF0cml4ZihtYXQuZGF0YSgpKTsgfQorICAgIHN0YXRpYyB2b2lkIG11bHRNYXRyaXgoY29uc3QgTWF0cml4PGRvdWJsZSw0LDQsIF9GbGFncywgNCw0PiYgbWF0KSB7IGdsTXVsdE1hdHJpeGQobWF0LmRhdGEoKSk7IH0KK307CisKK3RlbXBsYXRlPGludCBfRmxhZ3M+IHN0cnVjdCBHbE1hdHJpeEhlbHBlcjx0cnVlLF9GbGFncz4KK3sKKyAgICBzdGF0aWMgdm9pZCBsb2FkTWF0cml4KGNvbnN0IE1hdHJpeDxmbG9hdCwgNCw0LCBfRmxhZ3MsIDQsND4mICBtYXQpIHsgZ2xMb2FkTWF0cml4ZihtYXQudHJhbnNwb3NlKCkuZXZhbCgpLmRhdGEoKSk7IH0KKyAgICBzdGF0aWMgdm9pZCBsb2FkTWF0cml4KGNvbnN0IE1hdHJpeDxkb3VibGUsNCw0LCBfRmxhZ3MsIDQsND4mIG1hdCkgeyBnbExvYWRNYXRyaXhkKG1hdC50cmFuc3Bvc2UoKS5ldmFsKCkuZGF0YSgpKTsgfQorICAgIHN0YXRpYyB2b2lkIG11bHRNYXRyaXgoY29uc3QgTWF0cml4PGZsb2F0LCA0LDQsIF9GbGFncywgNCw0PiYgIG1hdCkgeyBnbE11bHRNYXRyaXhmKG1hdC50cmFuc3Bvc2UoKS5ldmFsKCkuZGF0YSgpKTsgfQorICAgIHN0YXRpYyB2b2lkIG11bHRNYXRyaXgoY29uc3QgTWF0cml4PGRvdWJsZSw0LDQsIF9GbGFncywgNCw0PiYgbWF0KSB7IGdsTXVsdE1hdHJpeGQobWF0LnRyYW5zcG9zZSgpLmV2YWwoKS5kYXRhKCkpOyB9Cit9OworCitpbmxpbmUgdm9pZCBHcHVIZWxwZXI6OnNldE1hdHJpeFRhcmdldChHTGVudW0gbWF0cml4VGFyZ2V0KQoreworICAgIGlmIChtYXRyaXhUYXJnZXQgIT0gbUN1cnJlbnRNYXRyaXhUYXJnZXQpCisgICAgICAgIGdsTWF0cml4TW9kZShtQ3VycmVudE1hdHJpeFRhcmdldD1tYXRyaXhUYXJnZXQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfRmxhZ3M+Cit2b2lkIEdwdUhlbHBlcjo6bXVsdE1hdHJpeChjb25zdCBNYXRyaXg8U2NhbGFyLDQsNCwgX0ZsYWdzLCA0LDQ+JiBtYXQsIEdMZW51bSBtYXRyaXhUYXJnZXQpCit7CisgICAgc2V0TWF0cml4VGFyZ2V0KG1hdHJpeFRhcmdldCk7CisgICAgR2xNYXRyaXhIZWxwZXI8X0ZsYWdzJkVpZ2VuOjpSb3dNYWpvckJpdCwgX0ZsYWdzPjo6bXVsdE1hdHJpeChtYXQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIEdwdUhlbHBlcjo6bG9hZE1hdHJpeCgKKyAgICBjb25zdCBFaWdlbjo6Q3dpc2VOdWxsYXJ5T3A8RWlnZW46OmludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8U2NhbGFyPixEZXJpdmVkPiYsCisgICAgR0xlbnVtIG1hdHJpeFRhcmdldCkKK3sKKyAgICBzZXRNYXRyaXhUYXJnZXQobWF0cml4VGFyZ2V0KTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfRmxhZ3M+Cit2b2lkIEdwdUhlbHBlcjo6bG9hZE1hdHJpeChjb25zdCBFaWdlbjo6TWF0cml4PFNjYWxhciw0LDQsIF9GbGFncywgNCw0PiYgbWF0LCBHTGVudW0gbWF0cml4VGFyZ2V0KQoreworICAgIHNldE1hdHJpeFRhcmdldChtYXRyaXhUYXJnZXQpOworICAgIEdsTWF0cml4SGVscGVyPChfRmxhZ3MmRWlnZW46OlJvd01ham9yQml0KSE9MCwgX0ZsYWdzPjo6bG9hZE1hdHJpeChtYXQpOworfQorCitpbmxpbmUgdm9pZCBHcHVIZWxwZXI6OnB1c2hNYXRyaXgoR0xlbnVtIG1hdHJpeFRhcmdldCkKK3sKKyAgICBzZXRNYXRyaXhUYXJnZXQobWF0cml4VGFyZ2V0KTsKKyAgICBnbFB1c2hNYXRyaXgoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgX0ZsYWdzPgoraW5saW5lIHZvaWQgR3B1SGVscGVyOjpwdXNoTWF0cml4KGNvbnN0IE1hdHJpeDxTY2FsYXIsNCw0LCBfRmxhZ3MsIDQsND4mIG1hdCwgR0xlbnVtIG1hdHJpeFRhcmdldCkKK3sKKyAgICBwdXNoTWF0cml4KG1hdHJpeFRhcmdldCk7CisgICAgR2xNYXRyaXhIZWxwZXI8X0ZsYWdzJkVpZ2VuOjpSb3dNYWpvckJpdCxfRmxhZ3M+Ojpsb2FkTWF0cml4KG1hdCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGVyaXZlZD4KK3ZvaWQgR3B1SGVscGVyOjpwdXNoTWF0cml4KAorICAgIGNvbnN0IEVpZ2VuOjpDd2lzZU51bGxhcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LERlcml2ZWQ+JiwKKyAgICBHTGVudW0gbWF0cml4VGFyZ2V0KQoreworICAgIHB1c2hNYXRyaXgobWF0cml4VGFyZ2V0KTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworfQorCitpbmxpbmUgdm9pZCBHcHVIZWxwZXI6OnBvcE1hdHJpeChHTGVudW0gbWF0cml4VGFyZ2V0KQoreworICAgIHNldE1hdHJpeFRhcmdldChtYXRyaXhUYXJnZXQpOworICAgIGdsUG9wTWF0cml4KCk7Cit9CisKK2lubGluZSB2b2lkIEdwdUhlbHBlcjo6ZHJhdyhHTGVudW0gbW9kZSwgdWludCBub2ZFbGVtZW50KQoreworICAgIGdsRHJhd0FycmF5cyhtb2RlLCAwLCBub2ZFbGVtZW50KTsKK30KKworCitpbmxpbmUgdm9pZCBHcHVIZWxwZXI6OmRyYXcoR0xlbnVtIG1vZGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ+KiBwSW5kZXhlcykKK3sKKyAgICBnbERyYXdFbGVtZW50cyhtb2RlLCBwSW5kZXhlcy0+c2l6ZSgpLCBHTF9VTlNJR05FRF9JTlQsICYocEluZGV4ZXMtPmZyb250KCkpKTsKK30KKworaW5saW5lIHZvaWQgR3B1SGVscGVyOjpkcmF3KEdMZW51bSBtb2RlLCB1aW50IHN0YXJ0LCB1aW50IGVuZCkKK3sKKyAgICBnbERyYXdBcnJheXMobW9kZSwgc3RhcnQsIGVuZC1zdGFydCk7Cit9CisKKyNlbmRpZiAvLyBFSUdFTl9HUFVIRUxQRVJfSApkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL2ljb3NwaGVyZS5jcHAgYi9kZW1vcy9vcGVuZ2wvaWNvc3BoZXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ0NGNiCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb3BlbmdsL2ljb3NwaGVyZS5jcHAKQEAgLTAsMCArMSwxMjAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgImljb3NwaGVyZS5oIgorCisjaW5jbHVkZSA8R0wvZ2wuaD4KKyNpbmNsdWRlIDxtYXA+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaWNvc2FoZWRyb24gZGF0YQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBYIC41MjU3MzExMTIxMTkxMzM2MDYKKyNkZWZpbmUgWiAuODUwNjUwODA4MzUyMDM5OTMyCisKK3N0YXRpYyBHTGZsb2F0IHZkYXRhWzEyXVszXSA9IHsKKyAgIHstWCwgMC4wLCBafSwge1gsIDAuMCwgWn0sIHstWCwgMC4wLCAtWn0sIHtYLCAwLjAsIC1afSwKKyAgIHswLjAsIFosIFh9LCB7MC4wLCBaLCAtWH0sIHswLjAsIC1aLCBYfSwgezAuMCwgLVosIC1YfSwKKyAgIHtaLCBYLCAwLjB9LCB7LVosIFgsIDAuMH0sIHtaLCAtWCwgMC4wfSwgey1aLCAtWCwgMC4wfQorfTsKKworc3RhdGljIEdMaW50IHRpbmRpY2VzWzIwXVszXSA9IHsKKyAgIHswLDQsMX0sIHswLDksNH0sIHs5LDUsNH0sIHs0LDUsOH0sIHs0LDgsMX0sCisgICB7OCwxMCwxfSwgezgsMywxMH0sIHs1LDMsOH0sIHs1LDIsM30sIHsyLDcsM30sCisgICB7NywxMCwzfSwgezcsNiwxMH0sIHs3LDExLDZ9LCB7MTEsMCw2fSwgezAsMSw2fSwKKyAgIHs2LDEsMTB9LCB7OSwwLDExfSwgezksMTEsMn0sIHs5LDIsNX0sIHs3LDIsMTF9IH07CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ljb1NwaGVyZTo6SWNvU3BoZXJlKHVuc2lnbmVkIGludCBsZXZlbHMpCit7CisgIC8vIGluaXQgd2l0aCBhbiBpY29zYWhlZHJvbgorICBmb3IgKGludCBpID0gMDsgaSA8IDEyOyBpKyspCisgICAgbVZlcnRpY2VzLnB1c2hfYmFjayhNYXA8VmVjdG9yM2Y+KHZkYXRhW2ldKSk7CisgIG1JbmRpY2VzLnB1c2hfYmFjayhuZXcgc3RkOjp2ZWN0b3I8aW50Pik7CisgIHN0ZDo6dmVjdG9yPGludD4mIGluZGljZXMgPSAqbUluZGljZXMuYmFjaygpOworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDM7IGsrKykKKyAgICAgIGluZGljZXMucHVzaF9iYWNrKHRpbmRpY2VzW2ldW2tdKTsKKyAgfQorICBtTGlzdElkcy5wdXNoX2JhY2soMCk7CisKKyAgd2hpbGUobUluZGljZXMuc2l6ZSgpPGxldmVscykKKyAgICBfc3ViZGl2aWRlKCk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPGludD4mIEljb1NwaGVyZTo6aW5kaWNlcyhpbnQgbGV2ZWwpIGNvbnN0Cit7CisgIHdoaWxlIChsZXZlbD49aW50KG1JbmRpY2VzLnNpemUoKSkpCisgICAgY29uc3RfY2FzdDxJY29TcGhlcmUqPih0aGlzKS0+X3N1YmRpdmlkZSgpOworICByZXR1cm4gKm1JbmRpY2VzW2xldmVsXTsKK30KKwordm9pZCBJY29TcGhlcmU6Ol9zdWJkaXZpZGUodm9pZCkKK3sKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgS2V5OworICBzdGQ6Om1hcDxLZXksaW50PiBlZGdlTWFwOworICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbmRpY2VzID0gKm1JbmRpY2VzLmJhY2soKTsKKyAgbUluZGljZXMucHVzaF9iYWNrKG5ldyBzdGQ6OnZlY3RvcjxpbnQ+KTsKKyAgc3RkOjp2ZWN0b3I8aW50PiYgcmVmaW5lZEluZGljZXMgPSAqbUluZGljZXMuYmFjaygpOworICBpbnQgZW5kID0gaW5kaWNlcy5zaXplKCk7CisgIGZvciAoaW50IGk9MDsgaTxlbmQ7IGkrPTMpCisgIHsKKyAgICBpbnQgaWRzMFszXSwgIC8vIGluZGljZXMgb2Ygb3V0ZXIgdmVydGljZXMKKyAgICAgICAgaWRzMVszXTsgIC8vIGluZGljZXMgb2YgZWRnZSB2ZXJ0aWNlcworICAgIGZvciAoaW50IGs9MDsgazwzOyArK2spCisgICAgeworICAgICAgaW50IGsxID0gKGsrMSklMzsKKyAgICAgIGludCBlMCA9IGluZGljZXNbaStrXTsKKyAgICAgIGludCBlMSA9IGluZGljZXNbaStrMV07CisgICAgICBpZHMwW2tdID0gZTA7CisgICAgICBpZiAoZTE+ZTApCisgICAgICAgIHN0ZDo6c3dhcChlMCxlMSk7CisgICAgICBLZXkgZWRnZUtleSA9IEtleShlMCkgfCAoS2V5KGUxKTw8MzIpOworICAgICAgc3RkOjptYXA8S2V5LGludD46Oml0ZXJhdG9yIGl0ID0gZWRnZU1hcC5maW5kKGVkZ2VLZXkpOworICAgICAgaWYgKGl0PT1lZGdlTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICBpZHMxW2tdID0gbVZlcnRpY2VzLnNpemUoKTsKKyAgICAgICAgZWRnZU1hcFtlZGdlS2V5XSA9IGlkczFba107CisgICAgICAgIG1WZXJ0aWNlcy5wdXNoX2JhY2soIChtVmVydGljZXNbZTBdK21WZXJ0aWNlc1tlMV0pLm5vcm1hbGl6ZWQoKSApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBpZHMxW2tdID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczBbMF0pOyByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVswXSk7IHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzJdKTsKKyAgICByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMFsxXSk7IHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzFdKTsgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczFbMF0pOworICAgIHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMwWzJdKTsgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczFbMl0pOyByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVsxXSk7CisgICAgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczFbMF0pOyByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVsxXSk7IHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzJdKTsKKyAgfQorICBtTGlzdElkcy5wdXNoX2JhY2soMCk7Cit9CisKK3ZvaWQgSWNvU3BoZXJlOjpkcmF3KGludCBsZXZlbCkKK3sKKyAgd2hpbGUgKGxldmVsPj1pbnQobUluZGljZXMuc2l6ZSgpKSkKKyAgICBjb25zdF9jYXN0PEljb1NwaGVyZSo+KHRoaXMpLT5fc3ViZGl2aWRlKCk7CisgIGlmIChtTGlzdElkc1tsZXZlbF09PTApCisgIHsKKyAgICBtTGlzdElkc1tsZXZlbF0gPSBnbEdlbkxpc3RzKDEpOworICAgIGdsTmV3TGlzdChtTGlzdElkc1tsZXZlbF0sIEdMX0NPTVBJTEUpOworICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMX0ZMT0FULCAwLCBtVmVydGljZXNbMF0uZGF0YSgpKTsKKyAgICAgIGdsTm9ybWFsUG9pbnRlcihHTF9GTE9BVCwgMCwgbVZlcnRpY2VzWzBdLmRhdGEoKSk7CisgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CisgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG1JbmRpY2VzW2xldmVsXS0+c2l6ZSgpLCBHTF9VTlNJR05FRF9JTlQsICYobUluZGljZXNbbGV2ZWxdLT5hdCgwKSkpOworICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKKyAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgZ2xFbmRMaXN0KCk7CisgIH0KKyAgZ2xDYWxsTGlzdChtTGlzdElkc1tsZXZlbF0pOworfQorCisKZGlmZiAtLWdpdCBhL2RlbW9zL29wZW5nbC9pY29zcGhlcmUuaCBiL2RlbW9zL29wZW5nbC9pY29zcGhlcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDIxMGVkCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb3BlbmdsL2ljb3NwaGVyZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9JQ09TUEhFUkVfSAorI2RlZmluZSBFSUdFTl9JQ09TUEhFUkVfSAorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIEljb1NwaGVyZQoreworICBwdWJsaWM6CisgICAgSWNvU3BoZXJlKHVuc2lnbmVkIGludCBsZXZlbHM9MSk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RWlnZW46OlZlY3RvcjNmPiYgdmVydGljZXMoKSBjb25zdCB7IHJldHVybiBtVmVydGljZXM7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbmRpY2VzKGludCBsZXZlbCkgY29uc3Q7CisgICAgdm9pZCBkcmF3KGludCBsZXZlbCk7CisgIHByb3RlY3RlZDoKKyAgICB2b2lkIF9zdWJkaXZpZGUoKTsKKyAgICBzdGQ6OnZlY3RvcjxFaWdlbjo6VmVjdG9yM2Y+IG1WZXJ0aWNlczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+Kj4gbUluZGljZXM7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBtTGlzdElkczsKK307CisKKyNlbmRpZiAvLyBFSUdFTl9JQ09TUEhFUkVfSApkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5jcHAgYi9kZW1vcy9vcGVuZ2wvcXVhdGVybmlvbl9kZW1vLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDE2NTYxCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5jcHAKQEAgLTAsMCArMSw2NTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgInF1YXRlcm5pb25fZGVtby5oIgorI2luY2x1ZGUgImljb3NwaGVyZS5oIgorCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxRRXZlbnQ+CisjaW5jbHVkZSA8UU1vdXNlRXZlbnQ+CisjaW5jbHVkZSA8UUlucHV0RGlhbG9nPgorI2luY2x1ZGUgPFFHcmlkTGF5b3V0PgorI2luY2x1ZGUgPFFCdXR0b25Hcm91cD4KKyNpbmNsdWRlIDxRUmFkaW9CdXR0b24+CisjaW5jbHVkZSA8UURvY2tXaWRnZXQ+CisjaW5jbHVkZSA8UVB1c2hCdXR0b24+CisjaW5jbHVkZSA8UUdyb3VwQm94PgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2NsYXNzIEZhbmN5U3BoZXJlcworeworICBwdWJsaWM6CisgICAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworICAgIAorICAgIEZhbmN5U3BoZXJlcygpCisgICAgeworICAgICAgY29uc3QgaW50IGxldmVscyA9IDQ7CisgICAgICBjb25zdCBmbG9hdCBzY2FsZSA9IDAuMzM7CisgICAgICBmbG9hdCByYWRpdXMgPSAxMDA7CisgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBhcmVudHM7CisKKyAgICAgIC8vIGxldmFsIDAKKyAgICAgIG1DZW50ZXJzLnB1c2hfYmFjayhWZWN0b3IzZjo6WmVybygpKTsKKyAgICAgIHBhcmVudHMucHVzaF9iYWNrKC0xKTsKKyAgICAgIG1SYWRpaS5wdXNoX2JhY2socmFkaXVzKTsKKworICAgICAgLy8gZ2VuZXJhdGUgbGV2ZWwgMSB1c2luZyBpY29zcGhlcmUgdmVydGljZXMKKyAgICAgIHJhZGl1cyAqPSAwLjQ1OworICAgICAgeworICAgICAgICBmbG9hdCBkaXN0ID0gbVJhZGlpWzBdKjAuOTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDEyOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICBtQ2VudGVycy5wdXNoX2JhY2sobUljb1NwaGVyZS52ZXJ0aWNlcygpW2ldICogZGlzdCk7CisgICAgICAgICAgbVJhZGlpLnB1c2hfYmFjayhyYWRpdXMpOworICAgICAgICAgIHBhcmVudHMucHVzaF9iYWNrKDApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBmbG9hdCBhbmdsZXMgWzEwXSA9IHsKKyAgICAgICAgMCwgMCwKKyAgICAgICAgTV9QSSwgMC4qTV9QSSwKKyAgICAgICAgTV9QSSwgMC41Kk1fUEksCisgICAgICAgIE1fUEksIDEuKk1fUEksCisgICAgICAgIE1fUEksIDEuNSpNX1BJCisgICAgICB9OworCisgICAgICAvLyBnZW5lcmF0ZSBvdGhlciBsZXZlbHMKKyAgICAgIGludCBzdGFydCA9IDE7CisgICAgICBmb3IgKGludCBsPTE7IGw8bGV2ZWxzOyBsKyspCisgICAgICB7CisgICAgICAgIHJhZGl1cyAqPSBzY2FsZTsKKyAgICAgICAgaW50IGVuZCA9IG1DZW50ZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaT1zdGFydDsgaTxlbmQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIFZlY3RvcjNmIGMgPSBtQ2VudGVyc1tpXTsKKyAgICAgICAgICBWZWN0b3IzZiBheDAgPSAoYyAtIG1DZW50ZXJzW3BhcmVudHNbaV1dKS5ub3JtYWxpemVkKCk7CisgICAgICAgICAgVmVjdG9yM2YgYXgxID0gYXgwLnVuaXRPcnRob2dvbmFsKCk7CisgICAgICAgICAgUXVhdGVybmlvbmYgcTsKKyAgICAgICAgICBxLnNldEZyb21Ud29WZWN0b3JzKFZlY3RvcjNmOjpVbml0WigpLCBheDApOworICAgICAgICAgIEFmZmluZTNmIHQgPSBUcmFuc2xhdGlvbjNmKGMpICogcSAqIFNjYWxpbmcobVJhZGlpW2ldK3JhZGl1cyk7CisgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPDU7ICsraikKKyAgICAgICAgICB7CisgICAgICAgICAgICBWZWN0b3IzZiBuZXdDID0gYyArICggKEFuZ2xlQXhpc2YoYW5nbGVzW2oqMisxXSwgYXgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFuZ2xlQXhpc2YoYW5nbGVzW2oqMiswXSAqIChsPT0xID8gMC4zNSA6IDAuNSksIGF4MSkpICogYXgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChtUmFkaWlbaV0gKyByYWRpdXMqMC44KTsKKyAgICAgICAgICAgIG1DZW50ZXJzLnB1c2hfYmFjayhuZXdDKTsKKyAgICAgICAgICAgIG1SYWRpaS5wdXNoX2JhY2socmFkaXVzKTsKKyAgICAgICAgICAgIHBhcmVudHMucHVzaF9iYWNrKGkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGFydCA9IGVuZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGRyYXcoKQorICAgIHsKKyAgICAgIGludCBlbmQgPSBtQ2VudGVycy5zaXplKCk7CisgICAgICBnbEVuYWJsZShHTF9OT1JNQUxJWkUpOworICAgICAgZm9yIChpbnQgaT0wOyBpPGVuZDsgKytpKQorICAgICAgeworICAgICAgICBBZmZpbmUzZiB0ID0gVHJhbnNsYXRpb24zZihtQ2VudGVyc1tpXSkgKiBTY2FsaW5nKG1SYWRpaVtpXSk7CisgICAgICAgIGdwdS5wdXNoTWF0cml4KEdMX01PREVMVklFVyk7CisgICAgICAgIGdwdS5tdWx0TWF0cml4KHQubWF0cml4KCksR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgbUljb1NwaGVyZS5kcmF3KDIpOworICAgICAgICBncHUucG9wTWF0cml4KEdMX01PREVMVklFVyk7CisgICAgICB9CisgICAgICBnbERpc2FibGUoR0xfTk9STUFMSVpFKTsKKyAgICB9CisgIHByb3RlY3RlZDoKKyAgICBzdGQ6OnZlY3RvcjxWZWN0b3IzZj4gbUNlbnRlcnM7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1SYWRpaTsKKyAgICBJY29TcGhlcmUgbUljb1NwaGVyZTsKK307CisKKworLy8gZ2VuZXJpYyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBtZXRob2QKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgbGVycChmbG9hdCB0LCBjb25zdCBUJiBhLCBjb25zdCBUJiBiKQoreworICByZXR1cm4gYSooMS10KSArIGIqdDsKK30KKworLy8gcXVhdGVybmlvbiBzbGVycAordGVtcGxhdGU8PiBRdWF0ZXJuaW9uZiBsZXJwKGZsb2F0IHQsIGNvbnN0IFF1YXRlcm5pb25mJiBhLCBjb25zdCBRdWF0ZXJuaW9uZiYgYikKK3sgcmV0dXJuIGEuc2xlcnAodCxiKTsgfQorCisvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvZiBhIGZyYW1lIHVzaW5nIHRoZSB0eXBlIE9yaWVudGF0aW9uVHlwZQorLy8gdG8gcGVyZm9ybSB0aGUgaW50ZXJwb2xhdGlvbiBvZiB0aGUgb3JpZW50YXRpb25zCit0ZW1wbGF0ZTx0eXBlbmFtZSBPcmllbnRhdGlvblR5cGU+CitpbmxpbmUgc3RhdGljIEZyYW1lIGxlcnBGcmFtZShmbG9hdCBhbHBoYSwgY29uc3QgRnJhbWUmIGEsIGNvbnN0IEZyYW1lJiBiKQoreworICByZXR1cm4gRnJhbWUobGVycChhbHBoYSxhLnBvc2l0aW9uLGIucG9zaXRpb24pLAorICAgICAgICAgICAgICAgUXVhdGVybmlvbmYobGVycChhbHBoYSxPcmllbnRhdGlvblR5cGUoYS5vcmllbnRhdGlvbiksT3JpZW50YXRpb25UeXBlKGIub3JpZW50YXRpb24pKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyPiBjbGFzcyBFdWxlckFuZ2xlcworeworcHVibGljOgorICBlbnVtIHsgRGltID0gMyB9OworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9uVHlwZTsKKworcHJvdGVjdGVkOgorCisgIFZlY3RvcjMgbV9hbmdsZXM7CisKK3B1YmxpYzoKKworICBFdWxlckFuZ2xlcygpIHt9CisgIGlubGluZSBFdWxlckFuZ2xlcyhTY2FsYXIgYTAsIFNjYWxhciBhMSwgU2NhbGFyIGEyKSA6IG1fYW5nbGVzKGEwLCBhMSwgYTIpIHt9CisgIGlubGluZSBFdWxlckFuZ2xlcyhjb25zdCBRdWF0ZXJuaW9uVHlwZSYgcSkgeyAqdGhpcyA9IHE7IH0KKworICBjb25zdCBWZWN0b3IzJiBjb2VmZnMoKSBjb25zdCB7IHJldHVybiBtX2FuZ2xlczsgfQorICBWZWN0b3IzJiBjb2VmZnMoKSB7IHJldHVybiBtX2FuZ2xlczsgfQorCisgIEV1bGVyQW5nbGVzJiBvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvblR5cGUmIHEpCisgIHsKKyAgICBNYXRyaXgzIG0gPSBxLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgICByZXR1cm4gKnRoaXMgPSBtOworICB9CisKKyAgRXVsZXJBbmdsZXMmIG9wZXJhdG9yPShjb25zdCBNYXRyaXgzJiBtKQorICB7CisgICAgLy8gbWF0ID0gIGN5KmN6ICAgICAgICAgIC1jeSpzeiAgICAgICAgICAgc3kKKyAgICAvLyAgICAgICAgY3oqc3gqc3krY3gqc3ogIGN4KmN6LXN4KnN5KnN6IC1jeSpzeAorICAgIC8vICAgICAgIC1jeCpjeipzeStzeCpzeiAgY3oqc3grY3gqc3kqc3ogIGN4KmN5CisgICAgbV9hbmdsZXMuY29lZmZSZWYoMSkgPSBzdGQ6OmFzaW4obS5jb2VmZigwLDIpKTsKKyAgICBtX2FuZ2xlcy5jb2VmZlJlZigwKSA9IHN0ZDo6YXRhbjIoLW0uY29lZmYoMSwyKSxtLmNvZWZmKDIsMikpOworICAgIG1fYW5nbGVzLmNvZWZmUmVmKDIpID0gc3RkOjphdGFuMigtbS5jb2VmZigwLDEpLG0uY29lZmYoMCwwKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTWF0cml4MyB0b1JvdGF0aW9uTWF0cml4KHZvaWQpIGNvbnN0CisgIHsKKyAgICBWZWN0b3IzIGMgPSBtX2FuZ2xlcy5hcnJheSgpLmNvcygpOworICAgIFZlY3RvcjMgcyA9IG1fYW5nbGVzLmFycmF5KCkuc2luKCk7CisgICAgTWF0cml4MyByZXM7CisgICAgcmVzIDw8ICBjLnkoKSpjLnooKSwgICAgICAgICAgICAgICAgICAgIC1jLnkoKSpzLnooKSwgICAgICAgICAgICAgICAgICAgcy55KCksCisgICAgICAgICAgICBjLnooKSpzLngoKSpzLnkoKStjLngoKSpzLnooKSwgIGMueCgpKmMueigpLXMueCgpKnMueSgpKnMueigpLCAgLWMueSgpKnMueCgpLAorICAgICAgICAgICAgLWMueCgpKmMueigpKnMueSgpK3MueCgpKnMueigpLCBjLnooKSpzLngoKStjLngoKSpzLnkoKSpzLnooKSwgIGMueCgpKmMueSgpOworICAgIHJldHVybiByZXM7CisgIH0KKworICBvcGVyYXRvciBRdWF0ZXJuaW9uVHlwZSgpIHsgcmV0dXJuIFF1YXRlcm5pb25UeXBlKHRvUm90YXRpb25NYXRyaXgoKSk7IH0KK307CisKKy8vIEV1bGVyIGFuZ2xlcyBzbGVycAordGVtcGxhdGU8PiBFdWxlckFuZ2xlczxmbG9hdD4gbGVycChmbG9hdCB0LCBjb25zdCBFdWxlckFuZ2xlczxmbG9hdD4mIGEsIGNvbnN0IEV1bGVyQW5nbGVzPGZsb2F0PiYgYikKK3sKKyAgRXVsZXJBbmdsZXM8ZmxvYXQ+IHJlczsKKyAgcmVzLmNvZWZmcygpID0gbGVycCh0LCBhLmNvZWZmcygpLCBiLmNvZWZmcygpKTsKKyAgcmV0dXJuIHJlczsKK30KKworCitSZW5kZXJpbmdXaWRnZXQ6OlJlbmRlcmluZ1dpZGdldCgpCit7CisgIG1BbmltYXRlID0gZmFsc2U7CisgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fTk9fVFJBQ0s7CisgIG1OYXZNb2RlID0gTmF2VHVybkFyb3VuZDsKKyAgbUxlcnBNb2RlID0gTGVycFF1YXRlcm5pb247CisgIG1Sb3RhdGlvbk1vZGUgPSBSb3RhdGlvblN0YWJsZTsKKyAgbVRyYWNrYmFsbC5zZXRDYW1lcmEoJm1DYW1lcmEpOworCisgIC8vIHJlcXVpcmVkIHRvIGNhcHR1cmUga2V5IHByZXNzIGV2ZW50cworICBzZXRGb2N1c1BvbGljeShRdDo6Q2xpY2tGb2N1cyk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpncmFiRnJhbWUodm9pZCkKK3sKKyAgICAvLyBhc2sgdXNlciBmb3IgYSB0aW1lCisgICAgYm9vbCBvayA9IGZhbHNlOworICAgIGRvdWJsZSB0ID0gMDsKKyAgICBpZiAoIW1fdGltZWxpbmUuZW1wdHkoKSkKKyAgICAgIHQgPSAoLS1tX3RpbWVsaW5lLmVuZCgpKS0+Zmlyc3QgKyAxLjsKKyAgICB0ID0gUUlucHV0RGlhbG9nOjpnZXREb3VibGUodGhpcywgIkVpZ2VuJ3MgUmVuZGVyaW5nV2lkZ2V0IiwgInRpbWUgdmFsdWU6ICIsCisgICAgICB0LCAwLCAxZTMsIDEsICZvayk7CisgICAgaWYgKG9rKQorICAgIHsKKyAgICAgIEZyYW1lIGF1eDsKKyAgICAgIGF1eC5vcmllbnRhdGlvbiA9IG1DYW1lcmEudmlld01hdHJpeCgpLmxpbmVhcigpOworICAgICAgYXV4LnBvc2l0aW9uID0gbUNhbWVyYS52aWV3TWF0cml4KCkudHJhbnNsYXRpb24oKTsKKyAgICAgIG1fdGltZWxpbmVbdF0gPSBhdXg7CisgICAgfQorfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6ZHJhd1NjZW5lKCkKK3sKKyAgc3RhdGljIEZhbmN5U3BoZXJlcyBzRmFuY3lTcGhlcmVzOworICBmbG9hdCBsZW5ndGggPSA1MDsKKyAgZ3B1LmRyYXdWZWN0b3IoVmVjdG9yM2Y6Olplcm8oKSwgbGVuZ3RoKlZlY3RvcjNmOjpVbml0WCgpLCBDb2xvcigxLDAsMCwxKSk7CisgIGdwdS5kcmF3VmVjdG9yKFZlY3RvcjNmOjpaZXJvKCksIGxlbmd0aCpWZWN0b3IzZjo6VW5pdFkoKSwgQ29sb3IoMCwxLDAsMSkpOworICBncHUuZHJhd1ZlY3RvcihWZWN0b3IzZjo6WmVybygpLCBsZW5ndGgqVmVjdG9yM2Y6OlVuaXRaKCksIENvbG9yKDAsMCwxLDEpKTsKKworICAvLyBkcmF3IHRoZSBmcmFjdGFsIG9iamVjdAorICBmbG9hdCBzcXJ0MyA9IGludGVybmFsOjpzcXJ0KDMuKTsKKyAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfQU1CSUVOVCwgVmVjdG9yNGYoMC41LDAuNSwwLjUsMSkuZGF0YSgpKTsKKyAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfRElGRlVTRSwgVmVjdG9yNGYoMC41LDEsMC41LDEpLmRhdGEoKSk7CisgIGdsTGlnaHRmdihHTF9MSUdIVDAsIEdMX1NQRUNVTEFSLCBWZWN0b3I0ZigxLDEsMSwxKS5kYXRhKCkpOworICBnbExpZ2h0ZnYoR0xfTElHSFQwLCBHTF9QT1NJVElPTiwgVmVjdG9yNGYoLXNxcnQzLC1zcXJ0MyxzcXJ0MywwKS5kYXRhKCkpOworCisgIGdsTGlnaHRmdihHTF9MSUdIVDEsIEdMX0FNQklFTlQsIFZlY3RvcjRmKDAsMCwwLDEpLmRhdGEoKSk7CisgIGdsTGlnaHRmdihHTF9MSUdIVDEsIEdMX0RJRkZVU0UsIFZlY3RvcjRmKDEsMC41LDAuNSwxKS5kYXRhKCkpOworICBnbExpZ2h0ZnYoR0xfTElHSFQxLCBHTF9TUEVDVUxBUiwgVmVjdG9yNGYoMSwxLDEsMSkuZGF0YSgpKTsKKyAgZ2xMaWdodGZ2KEdMX0xJR0hUMSwgR0xfUE9TSVRJT04sIFZlY3RvcjRmKC1zcXJ0MyxzcXJ0Mywtc3FydDMsMCkuZGF0YSgpKTsKKworICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0FNQklFTlQsIFZlY3RvcjRmKDAuNywgMC43LCAwLjcsIDEpLmRhdGEoKSk7CisgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRElGRlVTRSwgVmVjdG9yNGYoMC44LCAwLjc1LCAwLjYsIDEpLmRhdGEoKSk7CisgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIFZlY3RvcjRmKDEsIDEsIDEsIDEpLmRhdGEoKSk7CisgIGdsTWF0ZXJpYWxmKEdMX0ZST05UX0FORF9CQUNLLCBHTF9TSElOSU5FU1MsIDY0KTsKKworICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgIGdsRW5hYmxlKEdMX0xJR0hUMCk7CisgIGdsRW5hYmxlKEdMX0xJR0hUMSk7CisKKyAgc0ZhbmN5U3BoZXJlcy5kcmF3KCk7CisgIGdsVmVydGV4UG9pbnRlcigzLCBHTF9GTE9BVCwgMCwgbVZlcnRpY2VzWzBdLmRhdGEoKSk7CisgIGdsTm9ybWFsUG9pbnRlcihHTF9GTE9BVCwgMCwgbU5vcm1hbHNbMF0uZGF0YSgpKTsKKyAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIG1WZXJ0aWNlcy5zaXplKCkpOworICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworCisgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjphbmltYXRlKCkKK3sKKyAgbV9hbHBoYSArPSBkb3VibGUobV90aW1lci5pbnRlcnZhbCgpKSAqIDFlLTM7CisKKyAgVGltZUxpbmU6OmNvbnN0X2l0ZXJhdG9yIGhpID0gbV90aW1lbGluZS51cHBlcl9ib3VuZChtX2FscGhhKTsKKyAgVGltZUxpbmU6OmNvbnN0X2l0ZXJhdG9yIGxvID0gaGk7CisgIC0tbG87CisKKyAgRnJhbWUgY3VycmVudEZyYW1lOworCisgIGlmKGhpPT1tX3RpbWVsaW5lLmVuZCgpKQorICB7CisgICAgLy8gZW5kCisgICAgY3VycmVudEZyYW1lID0gbG8tPnNlY29uZDsKKyAgICBzdG9wQW5pbWF0aW9uKCk7CisgIH0KKyAgZWxzZSBpZihoaT09bV90aW1lbGluZS5iZWdpbigpKQorICB7CisgICAgLy8gc3RhcnQKKyAgICBjdXJyZW50RnJhbWUgPSBoaS0+c2Vjb25kOworICB9CisgIGVsc2UKKyAgeworICAgIGZsb2F0IHMgPSAobV9hbHBoYSAtIGxvLT5maXJzdCkvKGhpLT5maXJzdCAtIGxvLT5maXJzdCk7CisgICAgaWYgKG1MZXJwTW9kZT09TGVycEV1bGVyQW5nbGVzKQorICAgICAgY3VycmVudEZyYW1lID0gOjpsZXJwRnJhbWU8RXVsZXJBbmdsZXM8ZmxvYXQ+ID4ocywgbG8tPnNlY29uZCwgaGktPnNlY29uZCk7CisgICAgZWxzZSBpZiAobUxlcnBNb2RlPT1MZXJwUXVhdGVybmlvbikKKyAgICAgIGN1cnJlbnRGcmFtZSA9IDo6bGVycEZyYW1lPEVpZ2VuOjpRdWF0ZXJuaW9uZj4ocywgbG8tPnNlY29uZCwgaGktPnNlY29uZCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiSW52YWxpZCByb3RhdGlvbiBpbnRlcnBvbGF0aW9uIG1vZGUgKGFib3J0KVxuIjsKKyAgICAgIGV4aXQoMik7CisgICAgfQorICAgIGN1cnJlbnRGcmFtZS5vcmllbnRhdGlvbi5jb2VmZnMoKS5ub3JtYWxpemUoKTsKKyAgfQorCisgIGN1cnJlbnRGcmFtZS5vcmllbnRhdGlvbiA9IGN1cnJlbnRGcmFtZS5vcmllbnRhdGlvbi5pbnZlcnNlKCk7CisgIGN1cnJlbnRGcmFtZS5wb3NpdGlvbiA9IC0gKGN1cnJlbnRGcmFtZS5vcmllbnRhdGlvbiAqIGN1cnJlbnRGcmFtZS5wb3NpdGlvbik7CisgIG1DYW1lcmEuc2V0RnJhbWUoY3VycmVudEZyYW1lKTsKKworICB1cGRhdGVHTCgpOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6a2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKiBlKQoreworICAgIHN3aXRjaChlLT5rZXkoKSkKKyAgICB7CisgICAgICBjYXNlIFF0OjpLZXlfVXA6CisgICAgICAgIG1DYW1lcmEuem9vbSgyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFF0OjpLZXlfRG93bjoKKyAgICAgICAgbUNhbWVyYS56b29tKC0yKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBhZGQgYSBmcmFtZQorICAgICAgY2FzZSBRdDo6S2V5X0c6CisgICAgICAgIGdyYWJGcmFtZSgpOworICAgICAgICBicmVhazsKKyAgICAgIC8vIGNsZWFyIHRoZSB0aW1lIGxpbmUKKyAgICAgIGNhc2UgUXQ6OktleV9DOgorICAgICAgICBtX3RpbWVsaW5lLmNsZWFyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gbW92ZSB0aGUgY2FtZXJhIHRvIGluaXRpYWwgcG9zCisgICAgICBjYXNlIFF0OjpLZXlfUjoKKyAgICAgICAgcmVzZXRDYW1lcmEoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBzdGFydC9zdG9wIHRoZSBhbmltYXRpb24KKyAgICAgIGNhc2UgUXQ6OktleV9BOgorICAgICAgICBpZiAobUFuaW1hdGUpCisgICAgICAgIHsKKyAgICAgICAgICBzdG9wQW5pbWF0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbV9hbHBoYSA9IDA7CisgICAgICAgICAgY29ubmVjdCgmbV90aW1lciwgU0lHTkFMKHRpbWVvdXQoKSksIHRoaXMsIFNMT1QoYW5pbWF0ZSgpKSk7CisgICAgICAgICAgbV90aW1lci5zdGFydCgxMDAwLzMwKTsKKyAgICAgICAgICBtQW5pbWF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB1cGRhdGVHTCgpOworfQorCit2b2lkIFJlbmRlcmluZ1dpZGdldDo6c3RvcEFuaW1hdGlvbigpCit7CisgIGRpc2Nvbm5lY3QoJm1fdGltZXIsIFNJR05BTCh0aW1lb3V0KCkpLCB0aGlzLCBTTE9UKGFuaW1hdGUoKSkpOworICBtX3RpbWVyLnN0b3AoKTsKKyAgbUFuaW1hdGUgPSBmYWxzZTsKKyAgbV9hbHBoYSA9IDA7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0Ojptb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQqIGUpCit7CisgIG1Nb3VzZUNvb3JkcyA9IFZlY3RvcjJpKGUtPnBvcygpLngoKSwgZS0+cG9zKCkueSgpKTsKKyAgYm9vbCBmbHkgPSAobU5hdk1vZGU9PU5hdkZseSkgfHwgKGUtPm1vZGlmaWVycygpJlF0OjpDb250cm9sTW9kaWZpZXIpOworICBzd2l0Y2goZS0+YnV0dG9uKCkpCisgIHsKKyAgICBjYXNlIFF0OjpMZWZ0QnV0dG9uOgorICAgICAgaWYoZmx5KQorICAgICAgeworICAgICAgICBtQ3VycmVudFRyYWNraW5nTW9kZSA9IFRNX0xPQ0FMX1JPVEFURTsKKyAgICAgICAgbVRyYWNrYmFsbC5zdGFydChUcmFja2JhbGw6OkxvY2FsKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbUN1cnJlbnRUcmFja2luZ01vZGUgPSBUTV9ST1RBVEVfQVJPVU5EOworICAgICAgICBtVHJhY2tiYWxsLnN0YXJ0KFRyYWNrYmFsbDo6QXJvdW5kKTsKKyAgICAgIH0KKyAgICAgIG1UcmFja2JhbGwudHJhY2sobU1vdXNlQ29vcmRzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUXQ6Ok1pZEJ1dHRvbjoKKyAgICAgIGlmKGZseSkKKyAgICAgICAgbUN1cnJlbnRUcmFja2luZ01vZGUgPSBUTV9GTFlfWjsKKyAgICAgIGVsc2UKKyAgICAgICAgbUN1cnJlbnRUcmFja2luZ01vZGUgPSBUTV9aT09NOworICAgICAgYnJlYWs7CisgICAgY2FzZSBRdDo6UmlnaHRCdXR0b246CisgICAgICAgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fRkxZX1BBTjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQordm9pZCBSZW5kZXJpbmdXaWRnZXQ6Om1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50KikKK3sKKyAgICBtQ3VycmVudFRyYWNraW5nTW9kZSA9IFRNX05PX1RSQUNLOworICAgIHVwZGF0ZUdMKCk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0Ojptb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCogZSkKK3sKKyAgICAvLyB0cmFja2luZworICAgIGlmKG1DdXJyZW50VHJhY2tpbmdNb2RlICE9IFRNX05PX1RSQUNLKQorICAgIHsKKyAgICAgICAgZmxvYXQgZHggPSAgIGZsb2F0KGUtPngoKSAtIG1Nb3VzZUNvb3Jkcy54KCkpIC8gZmxvYXQobUNhbWVyYS52cFdpZHRoKCkpOworICAgICAgICBmbG9hdCBkeSA9IC0gZmxvYXQoZS0+eSgpIC0gbU1vdXNlQ29vcmRzLnkoKSkgLyBmbG9hdChtQ2FtZXJhLnZwSGVpZ2h0KCkpOworCisgICAgICAgIC8vIHNwZWVkdXAgdGhlIHRyYW5zZm9ybWF0aW9ucworICAgICAgICBpZihlLT5tb2RpZmllcnMoKSAmIFF0OjpTaGlmdE1vZGlmaWVyKQorICAgICAgICB7CisgICAgICAgICAgZHggKj0gMTAuOworICAgICAgICAgIGR5ICo9IDEwLjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChtQ3VycmVudFRyYWNraW5nTW9kZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgVE1fUk9UQVRFX0FST1VORDoKKyAgICAgICAgICBjYXNlIFRNX0xPQ0FMX1JPVEFURToKKyAgICAgICAgICAgIGlmIChtUm90YXRpb25Nb2RlPT1Sb3RhdGlvblN0YWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gdXNlIHRoZSBzdGFibGUgdHJhY2tiYWxsIGltcGxlbWVudGF0aW9uIG1hcHBpbmcKKyAgICAgICAgICAgICAgLy8gdGhlIDJEIGNvb3JkaW5hdGVzIHRvIDNEIHBvaW50cyBvbiBhIHNwaGVyZS4KKyAgICAgICAgICAgICAgbVRyYWNrYmFsbC50cmFjayhWZWN0b3IyaShlLT5wb3MoKS54KCksIGUtPnBvcygpLnkoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBzdGFuZGFyZCBhcHByb2FjaCBtYXBwaW5nIHRoZSB4IGFuZCB5IGRpc3BsYWNlbWVudHMgYXMgcm90YXRpb25zCisgICAgICAgICAgICAgIC8vIGFyb3VuZCB0aGUgY2FtZXJhJ3MgWCBhbmQgWSBheGVzLgorICAgICAgICAgICAgICBRdWF0ZXJuaW9uZiBxID0gQW5nbGVBeGlzZiggZHgqTV9QSSwgVmVjdG9yM2Y6OlVuaXRZKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbmdsZUF4aXNmKC1keSpNX1BJLCBWZWN0b3IzZjo6VW5pdFgoKSk7CisgICAgICAgICAgICAgIGlmIChtQ3VycmVudFRyYWNraW5nTW9kZT09VE1fTE9DQUxfUk9UQVRFKQorICAgICAgICAgICAgICAgIG1DYW1lcmEubG9jYWxSb3RhdGUocSk7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJvdGF0ZUFyb3VuZFRhcmdldChxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVE1fWk9PTSA6CisgICAgICAgICAgICBtQ2FtZXJhLnpvb20oZHkqMTAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgVE1fRkxZX1ogOgorICAgICAgICAgICAgbUNhbWVyYS5sb2NhbFRyYW5zbGF0ZShWZWN0b3IzZigwLCAwLCAtZHkqMjAwKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFRNX0ZMWV9QQU4gOgorICAgICAgICAgICAgbUNhbWVyYS5sb2NhbFRyYW5zbGF0ZShWZWN0b3IzZihkeCoyMDAsIGR5KjIwMCwgMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdXBkYXRlR0woKTsKKyAgICB9CisKKyAgICBtTW91c2VDb29yZHMgPSBWZWN0b3IyaShlLT5wb3MoKS54KCksIGUtPnBvcygpLnkoKSk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpwYWludEdMKCkKK3sKKyAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICBnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLEdMX0ZJTEwpOworICBnbERpc2FibGUoR0xfQ09MT1JfTUFURVJJQUwpOworICBnbERpc2FibGUoR0xfQkxFTkQpOworICBnbERpc2FibGUoR0xfQUxQSEFfVEVTVCk7CisgIGdsRGlzYWJsZShHTF9URVhUVVJFXzFEKTsKKyAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOworICBnbERpc2FibGUoR0xfVEVYVFVSRV8zRCk7CisKKyAgLy8gQ2xlYXIgYnVmZmVycworICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUKTsKKworICBtQ2FtZXJhLmFjdGl2YXRlR0woKTsKKworICBkcmF3U2NlbmUoKTsKK30KKwordm9pZCBSZW5kZXJpbmdXaWRnZXQ6OmluaXRpYWxpemVHTCgpCit7CisgIGdsQ2xlYXJDb2xvcigxLiwgMS4sIDEuLCAwLik7CisgIGdsTGlnaHRNb2RlbGkoR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSLCAxKTsKKyAgZ2xEZXB0aE1hc2soR0xfVFJVRSk7CisgIGdsQ29sb3JNYXNrKEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUpOworCisgIG1DYW1lcmEuc2V0UG9zaXRpb24oVmVjdG9yM2YoLTIwMCwgLTIwMCwgLTIwMCkpOworICBtQ2FtZXJhLnNldFRhcmdldChWZWN0b3IzZigwLCAwLCAwKSk7CisgIG1Jbml0RnJhbWUub3JpZW50YXRpb24gPSBtQ2FtZXJhLm9yaWVudGF0aW9uKCkuaW52ZXJzZSgpOworICBtSW5pdEZyYW1lLnBvc2l0aW9uID0gbUNhbWVyYS52aWV3TWF0cml4KCkudHJhbnNsYXRpb24oKTsKK30KKwordm9pZCBSZW5kZXJpbmdXaWRnZXQ6OnJlc2l6ZUdMKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBtQ2FtZXJhLnNldFZpZXdwb3J0KHdpZHRoLGhlaWdodCk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpzZXROYXZNb2RlKGludCBtKQoreworICBtTmF2TW9kZSA9IE5hdk1vZGUobSk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpzZXRMZXJwTW9kZShpbnQgbSkKK3sKKyAgbUxlcnBNb2RlID0gTGVycE1vZGUobSk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpzZXRSb3RhdGlvbk1vZGUoaW50IG0pCit7CisgIG1Sb3RhdGlvbk1vZGUgPSBSb3RhdGlvbk1vZGUobSk7Cit9CisKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpyZXNldENhbWVyYSgpCit7CisgIGlmIChtQW5pbWF0ZSkKKyAgICBzdG9wQW5pbWF0aW9uKCk7CisgIG1fdGltZWxpbmUuY2xlYXIoKTsKKyAgRnJhbWUgYXV4MCA9IG1DYW1lcmEuZnJhbWUoKTsKKyAgYXV4MC5vcmllbnRhdGlvbiA9IGF1eDAub3JpZW50YXRpb24uaW52ZXJzZSgpOworICBhdXgwLnBvc2l0aW9uID0gbUNhbWVyYS52aWV3TWF0cml4KCkudHJhbnNsYXRpb24oKTsKKyAgbV90aW1lbGluZVswXSA9IGF1eDA7CisKKyAgVmVjdG9yM2YgY3VycmVudFRhcmdldCA9IG1DYW1lcmEudGFyZ2V0KCk7CisgIG1DYW1lcmEuc2V0VGFyZ2V0KFZlY3RvcjNmOjpaZXJvKCkpOworCisgIC8vIGNvbXB1dGUgdGhlIHJvdGF0aW9uIGR1cmF0aW9uIHRvIG1vdmUgdGhlIGNhbWVyYSB0byB0aGUgdGFyZ2V0CisgIEZyYW1lIGF1eDEgPSBtQ2FtZXJhLmZyYW1lKCk7CisgIGF1eDEub3JpZW50YXRpb24gPSBhdXgxLm9yaWVudGF0aW9uLmludmVyc2UoKTsKKyAgYXV4MS5wb3NpdGlvbiA9IG1DYW1lcmEudmlld01hdHJpeCgpLnRyYW5zbGF0aW9uKCk7CisgIGZsb2F0IGR1cmF0aW9uID0gYXV4MC5vcmllbnRhdGlvbi5hbmd1bGFyRGlzdGFuY2UoYXV4MS5vcmllbnRhdGlvbikgKiAwLjk7CisgIGlmIChkdXJhdGlvbjwwLjEpIGR1cmF0aW9uID0gMC4xOworCisgIC8vIHB1dCB0aGUgY2FtZXJhIGF0IHRoYXQgdGltZSBzdGVwOgorICBhdXgxID0gYXV4MC5sZXJwKGR1cmF0aW9uLzIsbUluaXRGcmFtZSk7CisgIC8vIGFuZCBtYWtlIGl0IGxvb2sgYXQgdGhlIHRhcmdldCBhZ2FpbgorICBhdXgxLm9yaWVudGF0aW9uID0gYXV4MS5vcmllbnRhdGlvbi5pbnZlcnNlKCk7CisgIGF1eDEucG9zaXRpb24gPSAtIChhdXgxLm9yaWVudGF0aW9uICogYXV4MS5wb3NpdGlvbik7CisgIG1DYW1lcmEuc2V0RnJhbWUoYXV4MSk7CisgIG1DYW1lcmEuc2V0VGFyZ2V0KFZlY3RvcjNmOjpaZXJvKCkpOworCisgIC8vIGFkZCB0aGlzIGNhbWVyYSBrZXlmcmFtZQorICBhdXgxLm9yaWVudGF0aW9uID0gYXV4MS5vcmllbnRhdGlvbi5pbnZlcnNlKCk7CisgIGF1eDEucG9zaXRpb24gPSBtQ2FtZXJhLnZpZXdNYXRyaXgoKS50cmFuc2xhdGlvbigpOworICBtX3RpbWVsaW5lW2R1cmF0aW9uXSA9IGF1eDE7CisKKyAgbV90aW1lbGluZVsyXSA9IG1Jbml0RnJhbWU7CisgIG1fYWxwaGEgPSAwOworICBhbmltYXRlKCk7CisgIGNvbm5lY3QoJm1fdGltZXIsIFNJR05BTCh0aW1lb3V0KCkpLCB0aGlzLCBTTE9UKGFuaW1hdGUoKSkpOworICBtX3RpbWVyLnN0YXJ0KDEwMDAvMzApOworICBtQW5pbWF0ZSA9IHRydWU7Cit9CisKK1FXaWRnZXQqIFJlbmRlcmluZ1dpZGdldDo6Y3JlYXRlTmF2aWdhdGlvbkNvbnRyb2xXaWRnZXQoKQoreworICBRV2lkZ2V0KiBwYW5lbCA9IG5ldyBRV2lkZ2V0KCk7CisgIFFWQm94TGF5b3V0KiBsYXlvdXQgPSBuZXcgUVZCb3hMYXlvdXQoKTsKKworICB7CisgICAgUVB1c2hCdXR0b24qIGJ1dCA9IG5ldyBRUHVzaEJ1dHRvbigicmVzZXQiKTsKKyAgICBidXQtPnNldFRvb2xUaXAoIm1vdmUgdGhlIGNhbWVyYSB0byBpbml0aWFsIHBvc2l0aW9uICh3aXRoIGFuaW1hdGlvbikiKTsKKyAgICBsYXlvdXQtPmFkZFdpZGdldChidXQpOworICAgIGNvbm5lY3QoYnV0LCBTSUdOQUwoY2xpY2tlZCgpKSwgdGhpcywgU0xPVChyZXNldENhbWVyYSgpKSk7CisgIH0KKyAgeworICAgIC8vIG5hdmlnYXRpb24gbW9kZQorICAgIFFHcm91cEJveCogYm94ID0gbmV3IFFHcm91cEJveCgibmF2aWdhdGlvbiBtb2RlIik7CisgICAgUVZCb3hMYXlvdXQqIGJveExheW91dCA9IG5ldyBRVkJveExheW91dDsKKyAgICBRQnV0dG9uR3JvdXAqIGdyb3VwID0gbmV3IFFCdXR0b25Hcm91cChwYW5lbCk7CisgICAgUVJhZGlvQnV0dG9uKiBidXQ7CisgICAgYnV0ID0gbmV3IFFSYWRpb0J1dHRvbigidHVybiBhcm91bmQiKTsKKyAgICBidXQtPnNldFRvb2xUaXAoImxvb2sgYXJvdW5kIGFuIG9iamVjdCIpOworICAgIGdyb3VwLT5hZGRCdXR0b24oYnV0LCBOYXZUdXJuQXJvdW5kKTsKKyAgICBib3hMYXlvdXQtPmFkZFdpZGdldChidXQpOworICAgIGJ1dCA9IG5ldyBRUmFkaW9CdXR0b24oImZseSIpOworICAgIGJ1dC0+c2V0VG9vbFRpcCgiZnJlZSBuYXZpZ2F0aW9uIGxpa2UgYSBzcGFjZXNoaXBcbih0aGlzIG1vZGUgY2FuIGFsc28gYmUgZW5hYmxlZCBwcmVzc2luZyB0aGUgXCJzaGlmdFwiIGtleSkiKTsKKyAgICBncm91cC0+YWRkQnV0dG9uKGJ1dCwgTmF2Rmx5KTsKKyAgICBib3hMYXlvdXQtPmFkZFdpZGdldChidXQpOworICAgIGdyb3VwLT5idXR0b24obU5hdk1vZGUpLT5zZXRDaGVja2VkKHRydWUpOworICAgIGNvbm5lY3QoZ3JvdXAsIFNJR05BTChidXR0b25DbGlja2VkKGludCkpLCB0aGlzLCBTTE9UKHNldE5hdk1vZGUoaW50KSkpOworICAgIGJveC0+c2V0TGF5b3V0KGJveExheW91dCk7CisgICAgbGF5b3V0LT5hZGRXaWRnZXQoYm94KTsKKyAgfQorICB7CisgICAgLy8gdHJhY2sgYmFsbCwgcm90YXRpb24gbW9kZQorICAgIFFHcm91cEJveCogYm94ID0gbmV3IFFHcm91cEJveCgicm90YXRpb24gbW9kZSIpOworICAgIFFWQm94TGF5b3V0KiBib3hMYXlvdXQgPSBuZXcgUVZCb3hMYXlvdXQ7CisgICAgUUJ1dHRvbkdyb3VwKiBncm91cCA9IG5ldyBRQnV0dG9uR3JvdXAocGFuZWwpOworICAgIFFSYWRpb0J1dHRvbiogYnV0OworICAgIGJ1dCA9IG5ldyBRUmFkaW9CdXR0b24oInN0YWJsZSB0cmFja2JhbGwiKTsKKyAgICBncm91cC0+YWRkQnV0dG9uKGJ1dCwgUm90YXRpb25TdGFibGUpOworICAgIGJveExheW91dC0+YWRkV2lkZ2V0KGJ1dCk7CisgICAgYnV0LT5zZXRUb29sVGlwKCJ1c2UgdGhlIHN0YWJsZSB0cmFja2JhbGwgaW1wbGVtZW50YXRpb24gbWFwcGluZ1xudGhlIDJEIGNvb3JkaW5hdGVzIHRvIDNEIHBvaW50cyBvbiBhIHNwaGVyZSIpOworICAgIGJ1dCA9IG5ldyBRUmFkaW9CdXR0b24oInN0YW5kYXJkIHJvdGF0aW9uIik7CisgICAgZ3JvdXAtPmFkZEJ1dHRvbihidXQsIFJvdGF0aW9uU3RhbmRhcmQpOworICAgIGJveExheW91dC0+YWRkV2lkZ2V0KGJ1dCk7CisgICAgYnV0LT5zZXRUb29sVGlwKCJzdGFuZGFyZCBhcHByb2FjaCBtYXBwaW5nIHRoZSB4IGFuZCB5IGRpc3BsYWNlbWVudHNcbmFzIHJvdGF0aW9ucyBhcm91bmQgdGhlIGNhbWVyYSdzIFggYW5kIFkgYXhlcyIpOworICAgIGdyb3VwLT5idXR0b24obVJvdGF0aW9uTW9kZSktPnNldENoZWNrZWQodHJ1ZSk7CisgICAgY29ubmVjdChncm91cCwgU0lHTkFMKGJ1dHRvbkNsaWNrZWQoaW50KSksIHRoaXMsIFNMT1Qoc2V0Um90YXRpb25Nb2RlKGludCkpKTsKKyAgICBib3gtPnNldExheW91dChib3hMYXlvdXQpOworICAgIGxheW91dC0+YWRkV2lkZ2V0KGJveCk7CisgIH0KKyAgeworICAgIC8vIGludGVycG9sYXRpb24gbW9kZQorICAgIFFHcm91cEJveCogYm94ID0gbmV3IFFHcm91cEJveCgic3BoZXJpY2FsIGludGVycG9sYXRpb24iKTsKKyAgICBRVkJveExheW91dCogYm94TGF5b3V0ID0gbmV3IFFWQm94TGF5b3V0OworICAgIFFCdXR0b25Hcm91cCogZ3JvdXAgPSBuZXcgUUJ1dHRvbkdyb3VwKHBhbmVsKTsKKyAgICBRUmFkaW9CdXR0b24qIGJ1dDsKKyAgICBidXQgPSBuZXcgUVJhZGlvQnV0dG9uKCJxdWF0ZXJuaW9uIHNsZXJwIik7CisgICAgZ3JvdXAtPmFkZEJ1dHRvbihidXQsIExlcnBRdWF0ZXJuaW9uKTsKKyAgICBib3hMYXlvdXQtPmFkZFdpZGdldChidXQpOworICAgIGJ1dC0+c2V0VG9vbFRpcCgidXNlIHF1YXRlcm5pb24gc3BoZXJpY2FsIGludGVycG9sYXRpb25cbnRvIGludGVycG9sYXRlIG9yaWVudGF0aW9ucyIpOworICAgIGJ1dCA9IG5ldyBRUmFkaW9CdXR0b24oImV1bGVyIGFuZ2xlcyIpOworICAgIGdyb3VwLT5hZGRCdXR0b24oYnV0LCBMZXJwRXVsZXJBbmdsZXMpOworICAgIGJveExheW91dC0+YWRkV2lkZ2V0KGJ1dCk7CisgICAgYnV0LT5zZXRUb29sVGlwKCJ1c2UgRXVsZXIgYW5nbGVzIHRvIGludGVycG9sYXRlIG9yaWVudGF0aW9ucyIpOworICAgIGdyb3VwLT5idXR0b24obU5hdk1vZGUpLT5zZXRDaGVja2VkKHRydWUpOworICAgIGNvbm5lY3QoZ3JvdXAsIFNJR05BTChidXR0b25DbGlja2VkKGludCkpLCB0aGlzLCBTTE9UKHNldExlcnBNb2RlKGludCkpKTsKKyAgICBib3gtPnNldExheW91dChib3hMYXlvdXQpOworICAgIGxheW91dC0+YWRkV2lkZ2V0KGJveCk7CisgIH0KKyAgbGF5b3V0LT5hZGRJdGVtKG5ldyBRU3BhY2VySXRlbSgwLDAsUVNpemVQb2xpY3k6Ok1pbmltdW0sUVNpemVQb2xpY3k6OkV4cGFuZGluZykpOworICBwYW5lbC0+c2V0TGF5b3V0KGxheW91dCk7CisgIHJldHVybiBwYW5lbDsKK30KKworUXVhdGVybmlvbkRlbW86OlF1YXRlcm5pb25EZW1vKCkKK3sKKyAgbVJlbmRlcmluZ1dpZGdldCA9IG5ldyBSZW5kZXJpbmdXaWRnZXQoKTsKKyAgc2V0Q2VudHJhbFdpZGdldChtUmVuZGVyaW5nV2lkZ2V0KTsKKworICBRRG9ja1dpZGdldCogcGFuZWwgPSBuZXcgUURvY2tXaWRnZXQoIm5hdmlnYXRpb24iLCB0aGlzKTsKKyAgcGFuZWwtPnNldEFsbG93ZWRBcmVhcygoUUZsYWdzPFF0OjpEb2NrV2lkZ2V0QXJlYT4pKFF0OjpSaWdodERvY2tXaWRnZXRBcmVhIHwgUXQ6OkxlZnREb2NrV2lkZ2V0QXJlYSkpOworICBhZGREb2NrV2lkZ2V0KFF0OjpSaWdodERvY2tXaWRnZXRBcmVhLCBwYW5lbCk7CisgIHBhbmVsLT5zZXRXaWRnZXQobVJlbmRlcmluZ1dpZGdldC0+Y3JlYXRlTmF2aWdhdGlvbkNvbnRyb2xXaWRnZXQoKSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHN0ZDo6Y291dCA8PCAiTmF2aWdhdGlvbjpcbiI7CisgIHN0ZDo6Y291dCA8PCAiICBsZWZ0IGJ1dHRvbjogICAgICAgICAgIHJvdGF0ZSBhcm91bmQgdGhlIHRhcmdldFxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgIG1pZGRsZSBidXR0b246ICAgICAgICAgem9vbVxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgIGxlZnQgYnV0dG9uICsgY3RybCAgICAgcXVha2Ugcm90YXRlIChyb3RhdGUgYXJvdW5kIGNhbWVyYSBwb3NpdGlvbilcbiI7CisgIHN0ZDo6Y291dCA8PCAiICBtaWRkbGUgYnV0dG9uICsgY3RybCAgIHdhbGsgKHByb2dyZXNzIGFsb25nIGNhbWVyYSdzIHogZGlyZWN0aW9uKVxuIjsKKyAgc3RkOjpjb3V0IDw8ICIgIGxlZnQgYnV0dG9uOiAgICAgICAgICAgcGFuICh0cmFuc2xhdGUgaW4gdGhlIFhZIGNhbWVyYSdzIHBsYW5lKVxuXG4iOworICBzdGQ6OmNvdXQgPDwgIlIgOiBtb3ZlIHRoZSBjYW1lcmEgdG8gaW5pdGlhbCBwb3NpdGlvblxuIjsKKyAgc3RkOjpjb3V0IDw8ICJBIDogc3RhcnQvc3RvcCBhbmltYXRpb25cbiI7CisgIHN0ZDo6Y291dCA8PCAiQyA6IGNsZWFyIHRoZSBhbmltYXRpb25cbiI7CisgIHN0ZDo6Y291dCA8PCAiRyA6IGFkZCBhIGtleSBmcmFtZVxuIjsKKworICBRQXBwbGljYXRpb24gYXBwKGFyZ2MsIGFyZ3YpOworICBRdWF0ZXJuaW9uRGVtbyBkZW1vOworICBkZW1vLnJlc2l6ZSg2MDAsNTAwKTsKKyAgZGVtby5zaG93KCk7CisgIHJldHVybiBhcHAuZXhlYygpOworfQorCisjaW5jbHVkZSAicXVhdGVybmlvbl9kZW1vLm1vYyIKKwpkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5oIGIvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZmY0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9vcGVuZ2wvcXVhdGVybmlvbl9kZW1vLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9RVUFURVJOSU9OX0RFTU9fSAorI2RlZmluZSBFSUdFTl9RVUFURVJOSU9OX0RFTU9fSAorCisjaW5jbHVkZSAiZ3B1aGVscGVyLmgiCisjaW5jbHVkZSAiY2FtZXJhLmgiCisjaW5jbHVkZSAidHJhY2tiYWxsLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPFFUaW1lcj4KKyNpbmNsdWRlIDxRdEd1aS9RQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UXRPcGVuR0wvUUdMV2lkZ2V0PgorI2luY2x1ZGUgPFF0R3VpL1FNYWluV2luZG93PgorCitjbGFzcyBSZW5kZXJpbmdXaWRnZXQgOiBwdWJsaWMgUUdMV2lkZ2V0Cit7CisgIFFfT0JKRUNUCisKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPGZsb2F0LEZyYW1lPiBUaW1lTGluZTsKKyAgICBUaW1lTGluZSBtX3RpbWVsaW5lOworICAgIEZyYW1lIGxlcnBGcmFtZShmbG9hdCB0KTsKKworICAgIEZyYW1lIG1Jbml0RnJhbWU7CisgICAgYm9vbCBtQW5pbWF0ZTsKKyAgICBmbG9hdCBtX2FscGhhOworCisgICAgZW51bSBUcmFja01vZGUgeworICAgICAgVE1fTk9fVFJBQ0s9MCwgVE1fUk9UQVRFX0FST1VORCwgVE1fWk9PTSwKKyAgICAgIFRNX0xPQ0FMX1JPVEFURSwgVE1fRkxZX1osIFRNX0ZMWV9QQU4KKyAgICB9OworCisgICAgZW51bSBOYXZNb2RlIHsKKyAgICAgIE5hdlR1cm5Bcm91bmQsCisgICAgICBOYXZGbHkKKyAgICB9OworCisgICAgZW51bSBMZXJwTW9kZSB7CisgICAgICBMZXJwUXVhdGVybmlvbiwKKyAgICAgIExlcnBFdWxlckFuZ2xlcworICAgIH07CisKKyAgICBlbnVtIFJvdGF0aW9uTW9kZSB7CisgICAgICBSb3RhdGlvblN0YWJsZSwKKyAgICAgIFJvdGF0aW9uU3RhbmRhcmQKKyAgICB9OworCisgICAgQ2FtZXJhIG1DYW1lcmE7CisgICAgVHJhY2tNb2RlIG1DdXJyZW50VHJhY2tpbmdNb2RlOworICAgIE5hdk1vZGUgbU5hdk1vZGU7CisgICAgTGVycE1vZGUgbUxlcnBNb2RlOworICAgIFJvdGF0aW9uTW9kZSBtUm90YXRpb25Nb2RlOworICAgIFZlY3RvcjJpIG1Nb3VzZUNvb3JkczsKKyAgICBUcmFja2JhbGwgbVRyYWNrYmFsbDsKKworICAgIFFUaW1lciBtX3RpbWVyOworCisgICAgdm9pZCBzZXR1cENhbWVyYSgpOworCisgICAgc3RkOjp2ZWN0b3I8VmVjdG9yM2Y+IG1WZXJ0aWNlczsKKyAgICBzdGQ6OnZlY3RvcjxWZWN0b3IzZj4gbU5vcm1hbHM7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBtSW5kaWNlczsKKworICBwcm90ZWN0ZWQgc2xvdHM6CisKKyAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZSh2b2lkKTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd1NjZW5lKHZvaWQpOworCisgICAgdmlydHVhbCB2b2lkIGdyYWJGcmFtZSh2b2lkKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RvcEFuaW1hdGlvbigpOworCisgICAgdmlydHVhbCB2b2lkIHNldE5hdk1vZGUoaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TGVycE1vZGUoaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Um90YXRpb25Nb2RlKGludCk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0Q2FtZXJhKCk7CisKKyAgcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVHTCgpOworICAgIHZpcnR1YWwgdm9pZCByZXNpemVHTChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgIHZpcnR1YWwgdm9pZCBwYWludEdMKCk7CisgICAgCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZpcnR1YWwgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQgKiBlKTsKKyAgICB2aXJ0dWFsIHZvaWQgbW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQgKiBlKTsKKyAgICB2aXJ0dWFsIHZvaWQgbW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQgKiBlKTsKKyAgICB2aXJ0dWFsIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKiBlKTsKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHVibGljOiAKKyAgICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisgICAgCisgICAgUmVuZGVyaW5nV2lkZ2V0KCk7CisgICAgflJlbmRlcmluZ1dpZGdldCgpIHsgfQorCisgICAgUVdpZGdldCogY3JlYXRlTmF2aWdhdGlvbkNvbnRyb2xXaWRnZXQoKTsKK307CisKK2NsYXNzIFF1YXRlcm5pb25EZW1vIDogcHVibGljIFFNYWluV2luZG93Cit7CisgIFFfT0JKRUNUCisgIHB1YmxpYzoKKyAgICBRdWF0ZXJuaW9uRGVtbygpOworICBwcm90ZWN0ZWQ6CisgICAgUmVuZGVyaW5nV2lkZ2V0KiBtUmVuZGVyaW5nV2lkZ2V0OworfTsKKworI2VuZGlmIC8vIEVJR0VOX1FVQVRFUk5JT05fREVNT19ICmRpZmYgLS1naXQgYS9kZW1vcy9vcGVuZ2wvdHJhY2tiYWxsLmNwcCBiL2RlbW9zL29wZW5nbC90cmFja2JhbGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWM3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9vcGVuZ2wvdHJhY2tiYWxsLmNwcApAQCAtMCwwICsxLDU5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJ0cmFja2JhbGwuaCIKKyNpbmNsdWRlICJjYW1lcmEuaCIKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIFRyYWNrYmFsbDo6dHJhY2soY29uc3QgVmVjdG9yMmkmIHBvaW50MkQpCit7CisgIGlmIChtcENhbWVyYT09MCkKKyAgICByZXR1cm47CisgIFZlY3RvcjNmIG5ld1BvaW50M0Q7CisgIGJvb2wgbmV3UG9pbnRPayA9IG1hcFRvU3BoZXJlKHBvaW50MkQsIG5ld1BvaW50M0QpOworCisgIGlmIChtTGFzdFBvaW50T2sgJiYgbmV3UG9pbnRPaykKKyAgeworICAgIFZlY3RvcjNmIGF4aXMgPSBtTGFzdFBvaW50M0QuY3Jvc3MobmV3UG9pbnQzRCkubm9ybWFsaXplZCgpOworICAgIGZsb2F0IGNvc19hbmdsZSA9IG1MYXN0UG9pbnQzRC5kb3QobmV3UG9pbnQzRCk7CisgICAgaWYgKCBpbnRlcm5hbDo6YWJzKGNvc19hbmdsZSkgPCAxLjAgKQorICAgIHsKKyAgICAgIGZsb2F0IGFuZ2xlID0gMi4gKiBhY29zKGNvc19hbmdsZSk7CisgICAgICBpZiAobU1vZGU9PUFyb3VuZCkKKyAgICAgICAgbXBDYW1lcmEtPnJvdGF0ZUFyb3VuZFRhcmdldChRdWF0ZXJuaW9uZihBbmdsZUF4aXNmKGFuZ2xlLCBheGlzKSkpOworICAgICAgZWxzZQorICAgICAgICBtcENhbWVyYS0+bG9jYWxSb3RhdGUoUXVhdGVybmlvbmYoQW5nbGVBeGlzZigtYW5nbGUsIGF4aXMpKSk7CisgICAgfQorICB9CisKKyAgbUxhc3RQb2ludDNEID0gbmV3UG9pbnQzRDsKKyAgbUxhc3RQb2ludE9rID0gbmV3UG9pbnRPazsKK30KKworYm9vbCBUcmFja2JhbGw6Om1hcFRvU3BoZXJlKGNvbnN0IFZlY3RvcjJpJiBwMiwgVmVjdG9yM2YmIHYzKQoreworICBpZiAoKHAyLngoKSA+PSAwKSAmJiAocDIueCgpIDw9IGludChtcENhbWVyYS0+dnBXaWR0aCgpKSkgJiYKKyAgICAgIChwMi55KCkgPj0gMCkgJiYgKHAyLnkoKSA8PSBpbnQobXBDYW1lcmEtPnZwSGVpZ2h0KCkpKSApCisgIHsKKyAgICBkb3VibGUgeCAgPSAoZG91YmxlKShwMi54KCkgLSAwLjUqbXBDYW1lcmEtPnZwV2lkdGgoKSkgIC8gKGRvdWJsZSltcENhbWVyYS0+dnBXaWR0aCgpOworICAgIGRvdWJsZSB5ICA9IChkb3VibGUpKDAuNSptcENhbWVyYS0+dnBIZWlnaHQoKSAtIHAyLnkoKSkgLyAoZG91YmxlKW1wQ2FtZXJhLT52cEhlaWdodCgpOworICAgIGRvdWJsZSBzaW54ICAgICAgICAgPSBzaW4oTV9QSSAqIHggKiAwLjUpOworICAgIGRvdWJsZSBzaW55ICAgICAgICAgPSBzaW4oTV9QSSAqIHkgKiAwLjUpOworICAgIGRvdWJsZSBzaW54MnNpbnkyICAgPSBzaW54ICogc2lueCArIHNpbnkgKiBzaW55OworCisgICAgdjMueCgpID0gc2lueDsKKyAgICB2My55KCkgPSBzaW55OworICAgIHYzLnooKSA9IHNpbngyc2lueTIgPCAxLjAgPyBzcXJ0KDEuMCAtIHNpbngyc2lueTIpIDogMC4wOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2RlbW9zL29wZW5nbC90cmFja2JhbGwuaCBiL2RlbW9zL29wZW5nbC90cmFja2JhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWE4NDJmCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb3BlbmdsL3RyYWNrYmFsbC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9UUkFDS0JBTExfSAorI2RlZmluZSBFSUdFTl9UUkFDS0JBTExfSAorCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKK2NsYXNzIENhbWVyYTsKKworY2xhc3MgVHJhY2tiYWxsCit7CisgIHB1YmxpYzoKKworICAgIGVudW0gTW9kZSB7QXJvdW5kLCBMb2NhbH07CisKKyAgICBUcmFja2JhbGwoKSA6IG1wQ2FtZXJhKDApIHt9CisKKyAgICB2b2lkIHN0YXJ0KE1vZGUgbSA9IEFyb3VuZCkgeyBtTW9kZSA9IG07IG1MYXN0UG9pbnRPayA9IGZhbHNlOyB9CisKKyAgICB2b2lkIHNldENhbWVyYShDYW1lcmEqIHBDYW0pIHsgbXBDYW1lcmEgPSBwQ2FtOyB9CisKKyAgICB2b2lkIHRyYWNrKGNvbnN0IEVpZ2VuOjpWZWN0b3IyaSYgbmV3UG9pbnQyRCk7CisKKyAgcHJvdGVjdGVkOgorCisgICAgYm9vbCBtYXBUb1NwaGVyZSggY29uc3QgRWlnZW46OlZlY3RvcjJpJiBwMiwgRWlnZW46OlZlY3RvcjNmJiB2Myk7CisKKyAgICBDYW1lcmEqIG1wQ2FtZXJhOworICAgIEVpZ2VuOjpWZWN0b3IzZiBtTGFzdFBvaW50M0Q7CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1MYXN0UG9pbnRPazsKKworfTsKKworI2VuZGlmIC8vIEVJR0VOX1RSQUNLQkFMTF9ICmRpZmYgLS1naXQgYS9kb2MvQTA1X1BvcnRpbmdGcm9tMlRvMy5kb3ggYi9kb2MvQTA1X1BvcnRpbmdGcm9tMlRvMy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjZTk2OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9BMDVfUG9ydGluZ0Zyb20yVG8zLmRveApAQCAtMCwwICsxLDMxOSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIEVpZ2VuMlRvRWlnZW4zIFBvcnRpbmcgZnJvbSBFaWdlbjIgdG8gRWlnZW4zCisKK1RoaXMgcGFnZSBsaXN0cyB0aGUgbW9zdCBpbXBvcnRhbnQgQVBJIGNoYW5nZXMgYmV0d2VlbiBFaWdlbjIgYW5kIEVpZ2VuMywKK2FuZCBnaXZlcyB0aXBzIHRvIGhlbHAgcG9ydGluZyB5b3VyIGFwcGxpY2F0aW9uIGZyb20gRWlnZW4yIHRvIEVpZ2VuMy4KKworXGIgVGFibGUgXGIgb2YgXGIgY29udGVudHMKKyAgLSBccmVmIENvbXBhdGliaWxpdHlTdXBwb3J0CisgIC0gXHJlZiBVc2luZworICAtIFxyZWYgQ29tcGxleERvdAorICAtIFxyZWYgVmVjdG9yQmxvY2tzCisgIC0gXHJlZiBDb3JuZXJzCisgIC0gXHJlZiBDb2VmZmljaWVudFdpc2VPcGVyYXRpb25zCisgIC0gXHJlZiBQYXJ0QW5kRXh0cmFjdAorICAtIFxyZWYgVHJpYW5ndWxhclNvbHZlSW5QbGFjZQorICAtIFxyZWYgRGVjb21wb3NpdGlvbnMKKyAgLSBccmVmIExpbmVhclNvbHZlcnMKKyAgLSBccmVmIEdlb21ldHJ5TW9kdWxlCisgIC0gXHJlZiBUcmFuc2Zvcm0KKyAgLSBccmVmIExhenlWc05vYWxpYXMKKyAgLSBccmVmIEFsaWduTWFjcm9zCisgIC0gXHJlZiBBbGlnbmVkTWFwCisgIC0gXHJlZiBTdGRDb250YWluZXJzCisgIC0gXHJlZiBlaVByZWZpeAorCitcc2VjdGlvbiBDb21wYXRpYmlsaXR5U3VwcG9ydCBFaWdlbjIgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisKK0luIG9yZGVyIHRvIGVhc2UgdGhlIHN3aXRjaCBmcm9tIEVpZ2VuMiB0byBFaWdlbjMsIEVpZ2VuMyBmZWF0dXJlcyBccmVmIEVpZ2VuMlN1cHBvcnRNb2RlcyAiRWlnZW4yIHN1cHBvcnQgbW9kZXMiLgorCitUaGUgcXVpY2sgd2F5IHRvIGVuYWJsZSB0aGlzIGlzIHRvIGRlZmluZSB0aGUgXGMgRUlHRU4yX1NVUFBPUlQgcHJlcHJvY2Vzc29yIHRva2VuIFxiIGJlZm9yZSBpbmNsdWRpbmcgYW55IEVpZ2VuIGhlYWRlciAodHlwaWNhbGx5IGl0IHNob3VsZCBiZSBzZXQgaW4geW91ciBwcm9qZWN0IG9wdGlvbnMpLgorCitBIG1vcmUgcG93ZXJmdWwsIFxlbSBzdGFnZWQgbWlncmF0aW9uIHBhdGggaXMgYWxzbyBwcm92aWRlZCwgd2hpY2ggbWF5IGJlIHVzZWZ1bCB0byBtaWdyYXRlIGxhcmdlciBwcm9qZWN0cyBmcm9tIEVpZ2VuMiB0byBFaWdlbjMuIFRoaXMgaXMgZXhwbGFpbmVkIGluIHRoZSBccmVmIEVpZ2VuMlN1cHBvcnRNb2RlcyAiRWlnZW4gMiBzdXBwb3J0IG1vZGVzIiBwYWdlLiAKKworXHNlY3Rpb24gVXNpbmcgVGhlIFVTSU5HX1BBUlRfT0ZfTkFNRVNQQUNFX0VJR0VOIG1hY3JvCisKK1RoZSBVU0lOR19QQVJUX09GX05BTUVTUEFDRV9FSUdFTiBtYWNybyBoYXMgYmVlbiByZW1vdmVkLiBJbiBFaWdlbiAzLCBqdXN0IGRvOgorXGNvZGUKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK1xlbmRjb2RlCisKK1xzZWN0aW9uIENvbXBsZXhEb3QgRG90IHByb2R1Y3RzIG92ZXIgY29tcGxleCBudW1iZXJzCisKK1RoaXMgaXMgdGhlIHNpbmdsZSB0cmlja2llc3QgY2hhbmdlIGJldHdlZW4gRWlnZW4gMiBhbmQgRWlnZW4gMy4gSXQgb25seSBhZmZlY3RzIGNvZGUgdXNpbmcgXGMgc3RkOjpjb21wbGV4IG51bWJlcnMgYXMgc2NhbGFyIHR5cGUuCisKK0VpZ2VuIDIncyBkb3QgcHJvZHVjdCB3YXMgbGluZWFyIGluIHRoZSBmaXJzdCB2YXJpYWJsZS4gRWlnZW4gMydzIGRvdCBwcm9kdWN0IGlzIGxpbmVhciBpbiB0aGUgc2Vjb25kIHZhcmlhYmxlLiBJbiBvdGhlciB3b3JkcywgdGhlIEVpZ2VuIDIgY29kZSBcY29kZSB4LmRvdCh5KSBcZW5kY29kZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBFaWdlbiAzIGNvZGUgXGNvZGUgeS5kb3QoeCkgXGVuZGNvZGUgSW4geWV0IG90aGVyIHdvcmRzLCBkb3QgcHJvZHVjdHMgYXJlIGNvbXBsZXgtY29uanVnYXRlZCBpbiBFaWdlbiAzIGNvbXBhcmVkIHRvIEVpZ2VuIDIuIFRoZSBzd2l0Y2ggdG8gdGhlIG5ldyBjb252ZW50aW9uIHdhcyBjb21tYW5kZWQgYnkgY29tbW9uIHVzYWdlLCBlc3BlY2lhbGx5IHdpdGggdGhlIG5vdGF0aW9uIFxmJCB4XlR5IFxmJCBmb3IgZG90IHByb2R1Y3RzIG9mIGNvbHVtbi12ZWN0b3JzLgorCitcc2VjdGlvbiBWZWN0b3JCbG9ja3MgVmVjdG9yIGJsb2NrcworCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPkVpZ2VuIDI8L3RoPjx0aD5FaWdlbiAzPC90aD48L3RoPgorPHRyPjx0ZD5cY29kZQordmVjdG9yLnN0YXJ0KGxlbmd0aCkKK3ZlY3Rvci5zdGFydDxsZW5ndGg+KCkKK3ZlY3Rvci5lbmQobGVuZ3RoKQordmVjdG9yLmVuZDxsZW5ndGg+KCkKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK3ZlY3Rvci5oZWFkKGxlbmd0aCkKK3ZlY3Rvci5oZWFkPGxlbmd0aD4oKQordmVjdG9yLnRhaWwobGVuZ3RoKQordmVjdG9yLnRhaWw8bGVuZ3RoPigpCitcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKKworXHNlY3Rpb24gQ29ybmVycyBNYXRyaXggQ29ybmVycworCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPkVpZ2VuIDI8L3RoPjx0aD5FaWdlbiAzPC90aD48L3RoPgorPHRyPjx0ZD5cY29kZQorbWF0cml4LmNvcm5lcihUb3BMZWZ0LHIsYykKK21hdHJpeC5jb3JuZXIoVG9wUmlnaHQscixjKQorbWF0cml4LmNvcm5lcihCb3R0b21MZWZ0LHIsYykKK21hdHJpeC5jb3JuZXIoQm90dG9tUmlnaHQscixjKQorbWF0cml4LmNvcm5lcjxyLGM+KFRvcExlZnQpCittYXRyaXguY29ybmVyPHIsYz4oVG9wUmlnaHQpCittYXRyaXguY29ybmVyPHIsYz4oQm90dG9tTGVmdCkKK21hdHJpeC5jb3JuZXI8cixjPihCb3R0b21SaWdodCkKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK21hdHJpeC50b3BMZWZ0Q29ybmVyKHIsYykKK21hdHJpeC50b3BSaWdodENvcm5lcihyLGMpCittYXRyaXguYm90dG9tTGVmdENvcm5lcihyLGMpCittYXRyaXguYm90dG9tUmlnaHRDb3JuZXIocixjKQorbWF0cml4LnRvcExlZnRDb3JuZXI8cixjPigpCittYXRyaXgudG9wUmlnaHRDb3JuZXI8cixjPigpCittYXRyaXguYm90dG9tTGVmdENvcm5lcjxyLGM+KCkKK21hdHJpeC5ib3R0b21SaWdodENvcm5lcjxyLGM+KCkKK1xlbmRjb2RlPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitOb3RpY2UgdGhhdCBFaWdlbjMgYWxzbyBwcm92aWRlcyB0aGVzZSBuZXcgY29udmVuaWVuY2UgbWV0aG9kczogdG9wUm93cygpLCBib3R0b21Sb3dzKCksIGxlZnRDb2xzKCksIHJpZ2h0Q29scygpLiBTZWUgaW4gY2xhc3MgRGVuc2VCYXNlLgorCitcc2VjdGlvbiBDb2VmZmljaWVudFdpc2VPcGVyYXRpb25zIENvZWZmaWNpZW50IHdpc2Ugb3BlcmF0aW9ucworCitJbiBFaWdlbjIsIGNvZWZmaWNpZW50IHdpc2Ugb3BlcmF0aW9ucyB3aGljaCBoYXZlIG5vIHByb3BlciBtYXRoZW1hdGljYWwgZGVmaW5pdGlvbiAoYXMgYSBjb2VmZmljaWVudCB3aXNlIHByb2R1Y3QpCit3ZXJlIGFjaGlldmVkIHVzaW5nIHRoZSAuY3dpc2UoKSBwcmVmaXgsIGUuZy46CitcY29kZSBhLmN3aXNlKCkgKiBiIFxlbmRjb2RlCitJbiBFaWdlbjMgdGhpcyAuY3dpc2UoKSBwcmVmaXggaGFzIGJlZW4gc3VwZXJzZWRlZCBieSBhIG5ldyBraW5kIG9mIG1hdHJpeCB0eXBlIGNhbGxlZAorQXJyYXkgZm9yIHdoaWNoIGFsbCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgY29lZmZpY2llbnQgd2lzZS4gWW91IGNhbiBlYXNpbHkgdmlldyBhIG1hdHJpeCBhcyBhbiBhcnJheSBhbmQgdmljZSB2ZXJzYSB1c2luZwordGhlIE1hdHJpeEJhc2U6OmFycmF5KCkgYW5kIEFycmF5QmFzZTo6bWF0cml4KCkgZnVuY3Rpb25zIHJlc3BlY3RpdmVseS4gSGVyZSBpcyBhbiBleGFtcGxlOgorXGNvZGUKK1ZlY3RvcjRmIGEsIGIsIGM7CitjID0gYS5hcnJheSgpICogYi5hcnJheSgpOworXGVuZGNvZGUKK05vdGUgdGhhdCB0aGUgLmFycmF5KCkgZnVuY3Rpb24gaXMgbm90IGF0IGFsbCBhIHN5bm9ueW0gb2YgdGhlIGRlcHJlY2F0ZWQgLmN3aXNlKCkgcHJlZml4LgorV2hpbGUgdGhlIC5jd2lzZSgpIHByZWZpeCBjaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiB0aGUgZm9sbG93aW5nIG9wZXJhdG9yLCB0aGUgYXJyYXkoKSBmdW5jdGlvbiBwZXJmb3JtcworYSBwZXJtYW5lbnQgY29udmVyc2lvbiB0byB0aGUgYXJyYXkgd29ybGQuIFRoZXJlZm9yZSwgZm9yIGJpbmFyeSBvcGVyYXRpb25zIHN1Y2ggYXMgdGhlIGNvZWZmaWNpZW50IHdpc2UgcHJvZHVjdCwKK2JvdGggc2lkZXMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gYW4gXGVtIGFycmF5IGFzIGluIHRoZSBhYm92ZSBleGFtcGxlLiBPbiB0aGUgb3RoZXIgaGFuZCwgd2hlbiB5b3UKK2NvbmNhdGVuYXRlIG11bHRpcGxlIGNvZWZmaWNpZW50IHdpc2Ugb3BlcmF0aW9ucyB5b3Ugb25seSBoYXZlIHRvIGRvIHRoZSBjb252ZXJzaW9uIG9uY2UsIGUuZy46CitcY29kZQorVmVjdG9yNGYgYSwgYiwgYzsKK2MgPSBhLmFycmF5KCkuYWJzKCkucG93KDMpICogYi5hcnJheSgpLmFicygpLnNpbigpOworXGVuZGNvZGUKK1dpdGggRWlnZW4yIHlvdSB3b3VsZCBoYXZlIHdyaXR0ZW46CitcY29kZQorYyA9IChhLmN3aXNlKCkuYWJzKCkuY3dpc2UoKS5wb3coMykpLmN3aXNlKCkgKiAoYi5jd2lzZSgpLmFicygpLmN3aXNlKCkuc2luKCkpOworXGVuZGNvZGUKKworXHNlY3Rpb24gUGFydEFuZEV4dHJhY3QgVHJpYW5ndWxhciBhbmQgc2VsZi1hZGpvaW50IG1hdHJpY2VzCisKK0luIEVpZ2VuIDIgeW91IGhhZCB0byBwbGF5IHdpdGggdGhlIHBhcnQsIGV4dHJhY3QsIGFuZCBtYXJrZWQgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCB0cmlhbmd1bGFyIGFuZCBzZWxmYWRqb2ludCBtYXRyaWNlcy4gSW4gRWlnZW4gMywgYWxsIHRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBmYXZvciBvZiB0aGUgY29uY2VwdCBvZiBcZW0gdmlld3M6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+RWlnZW4gMjwvdGg+PHRoPkVpZ2VuIDM8L3RoPjwvdHI+Cis8dHI+PHRkPlxjb2RlCitBLnBhcnQ8VXBwZXJUcmlhbmd1bGFyPigpOworQS5wYXJ0PFN0cmljdGx5TG93ZXJUcmlhbmd1bGFyPigpOyBcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK0EudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKK0EudHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKVxlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZQorQS5leHRyYWN0PFVwcGVyVHJpYW5ndWxhcj4oKTsKK0EuZXh0cmFjdDxTdHJpY3RseUxvd2VyVHJpYW5ndWxhcj4oKTtcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK0EudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKK0EudHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKVxlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZQorQS5tYXJrZWQ8VXBwZXJUcmlhbmd1bGFyPigpOworQS5tYXJrZWQ8U3RyaWN0bHlMb3dlclRyaWFuZ3VsYXI+KCk7XGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCitBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCitBLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KClcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iMiI+PC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZQorQS5wYXJ0PFNlbGZBZGZqb2ludHxVcHBlclRyaWFuZ3VsYXI+KCk7CitBLmV4dHJhY3Q8U2VsZkFkZmpvaW50fExvd2VyVHJpYW5ndWxhcj4oKTtcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK0Euc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpCitBLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKVxlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZCBjb2xzcGFuPSIyIj48L3RkPjwvdHI+Cis8dHI+PHRkPlxjb2RlCitVcHBlclRyaWFuZ3VsYXIKK0xvd2VyVHJpYW5ndWxhcgorVW5pdFVwcGVyVHJpYW5ndWxhcgorVW5pdExvd2VyVHJpYW5ndWxhcgorU3RyaWN0bHlVcHBlclRyaWFuZ3VsYXIKK1N0cmljdGx5TG93ZXJUcmlhbmd1bGFyCitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCitVcHBlcgorTG93ZXIKK1VuaXRVcHBlcgorVW5pdExvd2VyCitTdHJpY3RseVVwcGVyCitTdHJpY3RseUxvd2VyCitcZW5kY29kZTwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworXHNhIGNsYXNzIFRyaWFuZ3VsYXJWaWV3LCBjbGFzcyBTZWxmQWRqb2ludFZpZXcKKworXHNlY3Rpb24gVHJpYW5ndWxhclNvbHZlSW5QbGFjZSBUcmlhbmd1bGFyIGluLXBsYWNlIHNvbHZpbmcKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5FaWdlbiAyPC90aD48dGg+RWlnZW4gMzwvdGg+PC90cj4KKzx0cj48dGQ+XGNvZGUgQS50cmlhbmd1bGFyU29sdmVJblBsYWNlPFh4eFRyaWFuZ3VsYXI+KFkpO1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUgQS50cmlhbmd1bGFyVmlldzxYeHg+KCkuc29sdmVJblBsYWNlKFkpO1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KKworCitcc2VjdGlvbiBEZWNvbXBvc2l0aW9ucyBNYXRyaXggZGVjb21wb3NpdGlvbnMKKworU29tZSBvZiBFaWdlbiAyJ3MgbWF0cml4IGRlY29tcG9zaXRpb25zIGhhdmUgYmVlbiByZW5hbWVkIGluIEVpZ2VuIDMsIHdoaWxlIHNvbWUgb3RoZXJzIGhhdmUgYmVlbiByZW1vdmVkIGFuZCBhcmUgcmVwbGFjZWQgYnkgb3RoZXIgZGVjb21wb3NpdGlvbnMgaW4gRWlnZW4gMy4KKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorICA8dHI+CisgICAgPHRoPkVpZ2VuIDI8L3RoPgorICAgIDx0aD5FaWdlbiAzPC90aD4KKyAgICA8dGg+Tm90ZXM8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPkxVPC90ZD4KKyAgICA8dGQ+RnVsbFBpdkxVPC90ZD4KKyAgICA8dGQgY2xhc3M9ImFsdCI+U2VlIGFsc28gdGhlIG5ldyBQYXJ0aWFsUGl2TFUsIGl0J3MgbXVjaCBmYXN0ZXI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPlFSPC90ZD4KKyAgICA8dGQ+SG91c2Vob2xkZXJRUjwvdGQ+CisgICAgPHRkIGNsYXNzPSJhbHQiPlNlZSBhbHNvIHRoZSBuZXcgQ29sUGl2SG91c2Vob2xkZXJRUiwgaXQncyBtb3JlIHJlbGlhYmxlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5TVkQ8L3RkPgorICAgIDx0ZD5KYWNvYmlTVkQ8L3RkPgorICAgIDx0ZCBjbGFzcz0iYWx0Ij5XZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZSBhIGJpZGlhZ29uYWxpemluZyBTVkQ7IG9mIGNvdXJzZSB0aGlzIGlzIHBsYW5uZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5FaWdlblNvbHZlciBhbmQgZnJpZW5kczwvdGQ+CisgICAgPHRkPlxjb2RlICNpbmNsdWRlPEVpZ2VuL0VpZ2VudmFsdWVzPiBcZW5kY29kZSA8L3RkPgorICAgIDx0ZCBjbGFzcz0iYWx0Ij5Nb3ZlZCB0byBzZXBhcmF0ZSBtb2R1bGU8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworXHNlY3Rpb24gTGluZWFyU29sdmVycyBMaW5lYXIgc29sdmVycworCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPkVpZ2VuIDI8L3RoPjx0aD5FaWdlbiAzPC90aD48dGg+Tm90ZXM8L3RoPjwvdHI+Cis8dHI+PHRkPlxjb2RlIEEubHUoKTtcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUgQS5mdWxsUGl2THUoKTtcZW5kY29kZTwvdGQ+Cis8dGQgY2xhc3M9ImFsdCI+Tm93IEEubHUoKSByZXR1cm5zIGEgUGFydGlhbFBpdkxVPC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZSBBLmx1KCkuc29sdmUoQiwmWCk7XGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlIFggPSBBLmx1KCkuc29sdmUoQik7CisgWCA9IEEuZnVsbFBpdkx1KCkuc29sdmUoQik7XGVuZGNvZGU8L3RkPgorPHRkIGNsYXNzPSJhbHQiPlRoZSByZXR1cm5lZCBieSB2YWx1ZSBpcyBmdWxseSBvcHRpbWl6ZWQ8L3RkPjwvdHI+Cis8dHI+PHRkPlxjb2RlIEEubGx0KCkuc29sdmUoQiwmWCk7XGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlIFggPSBBLmxsdCgpLnNvbHZlKEIpOworIFggPSBBLnNlbGZhZGpvaW50VmlldzxMb3dlcj4ubGx0KCkuc29sdmUoQik7CisgWCA9IEEuc2VsZmFkam9pbnRWaWV3PFVwcGVyPi5sbHQoKS5zb2x2ZShCKTtcZW5kY29kZTwvdGQ+Cis8dGQgY2xhc3M9ImFsdCI+VGhlIHJldHVybmVkIGJ5IHZhbHVlIGlzIGZ1bGx5IG9wdGltaXplZCBhbmQgXG4KK3RoZSBzZWxmYWRqb2ludFZpZXcgQVBJIGFsbG93cyB5b3UgdG8gc2VsZWN0IHRoZSBcbgordHJpYW5ndWxhciBwYXJ0IHRvIHdvcmsgb24gKGRlZmF1bHQgaXMgbG93ZXIgcGFydCk8L3RkPjwvdHI+Cis8dHI+PHRkPlxjb2RlIEEubGx0KCkuc29sdmVJblBsYWNlKEIpO1xlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZSBCID0gQS5sbHQoKS5zb2x2ZShCKTsKKyBCID0gQS5zZWxmYWRqb2ludFZpZXc8TG93ZXI+LmxsdCgpLnNvbHZlKEIpOworIEIgPSBBLnNlbGZhZGpvaW50VmlldzxVcHBlcj4ubGx0KCkuc29sdmUoQik7XGVuZGNvZGU8L3RkPgorPHRkIGNsYXNzPSJhbHQiPkluIHBsYWNlIHNvbHZpbmc8L3RkPjwvdHI+Cis8dHI+PHRkPlxjb2RlIEEubGRsdCgpLnNvbHZlKEIsJlgpO1xlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZSBYID0gQS5sZGx0KCkuc29sdmUoQik7CisgWCA9IEEuc2VsZmFkam9pbnRWaWV3PExvd2VyPi5sZGx0KCkuc29sdmUoQik7CisgWCA9IEEuc2VsZmFkam9pbnRWaWV3PFVwcGVyPi5sZGx0KCkuc29sdmUoQik7XGVuZGNvZGU8L3RkPgorPHRkIGNsYXNzPSJhbHQiPlRoZSByZXR1cm5lZCBieSB2YWx1ZSBpcyBmdWxseSBvcHRpbWl6ZWQgYW5kIFxuCit0aGUgc2VsZmFkam9pbnRWaWV3IEFQSSBhbGxvd3MgeW91IHRvIHNlbGVjdCB0aGUgXG4KK3RyaWFuZ3VsYXIgcGFydCB0byB3b3JrIG9uPC90ZD48L3RyPgorPC90YWJsZT4KKworXHNlY3Rpb24gR2VvbWV0cnlNb2R1bGUgQ2hhbmdlcyBpbiB0aGUgR2VvbWV0cnkgbW9kdWxlCisKK1RoZSBHZW9tZXRyeSBtb2R1bGUgaXMgdGhlIG9uZSB0aGF0IGNoYW5nZWQgdGhlIG1vc3QuIElmIHlvdSByZWx5IGhlYXZpbHkgb24gaXQsIGl0J3MgcHJvYmFibHkgYSBnb29kIGlkZWEgdG8gdXNlIHRoZSBccmVmIEVpZ2VuMlN1cHBvcnRNb2RlcyAiRWlnZW4gMiBzdXBwb3J0IG1vZGVzIiB0byBwZXJmb3JtIHlvdXIgbWlncmF0aW9uLgorCitcc2VjdGlvbiBUcmFuc2Zvcm0gVGhlIFRyYW5zZm9ybSBjbGFzcworCitJbiBFaWdlbiAyLCB0aGUgVHJhbnNmb3JtIGNsYXNzIGRpZG4ndCByZWFsbHkga25vdyB3aGV0aGVyIGl0IHdhcyBhIHByb2plY3RpdmUgb3IgYWZmaW5lIHRyYW5zZm9ybWF0aW9uLiBJbiBFaWdlbiAzLCBpdCB0YWtlcyBhIG5ldyBcYSBNb2RlIHRlbXBsYXRlIHBhcmFtZXRlciwgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgaXQncyBcYSBQcm9qZWN0aXZlIG9yIFxhIEFmZmluZSB0cmFuc2Zvcm0uIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCisKK1RoZSBUcmFuc2Zvcm0zZiAoZXRjKSB0eXBlZGVmcyBhcmUgbm8gbW9yZS4gSW4gRWlnZW4gMywgdGhlIFRyYW5zZm9ybSB0eXBlZGVmcyBleHBsaWNpdGx5IHJlZmVyIHRvIHRoZSBcYSBQcm9qZWN0aXZlIGFuZCBcYSBBZmZpbmUgbW9kZXM6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+RWlnZW4gMjwvdGg+PHRoPkVpZ2VuIDM8L3RoPjx0aD5Ob3RlczwvdGg+PC90cj4KKzx0cj4KKyAgPHRkPiBUcmFuc2Zvcm0zZiA8L3RkPgorICA8dGQ+IEFmZmluZTNmIG9yIFByb2plY3RpdmUzZiA8L3RkPgorICA8dGQ+IE9mIGNvdXJzZSAzZiBpcyBqdXN0IGFuIGV4YW1wbGUgaGVyZSA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKworXHNlY3Rpb24gTGF6eVZzTm9hbGlhcyBMYXp5IGV2YWx1YXRpb24gYW5kIG5vYWxpYXMKKworSW4gRWlnZW4gYWxsIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBpbiBhIGxhenkgZmFzaGlvbiBleGNlcHQgdGhlIG1hdHJpeCBwcm9kdWN0cyB3aGljaCBhcmUgYWx3YXlzIGV2YWx1YXRlZCBpbnRvIGEgdGVtcG9yYXJ5IGJ5IGRlZmF1bHQuCitJbiBFaWdlbjIsIGxhenkgZXZhbHVhdGlvbiBjb3VsZCBiZSBlbmZvcmNlZCBieSB0YWdnaW5nIGEgcHJvZHVjdCB1c2luZyB0aGUgLmxhenkoKSBmdW5jdGlvbi4gSG93ZXZlciwgaW4gY29tcGxleCBleHByZXNzaW9ucyBpdCB3YXMgbm90CitlYXN5IHRvIGRldGVybWluZSB3aGVyZSB0byBwdXQgdGhlIGxhenkoKSBmdW5jdGlvbi4gSW4gRWlnZW4zLCB0aGUgbGF6eSgpIGZlYXR1cmUgaGFzIGJlZW4gc3VwZXJzZWRlZCBieSB0aGUgTWF0cml4QmFzZTo6bm9hbGlhcygpIGZ1bmN0aW9uCit3aGljaCBjYW4gYmUgdXNlZCBvbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCB3aGVuIG5vIGFsaWFzaW5nIGNhbiBvY2N1ci4gSGVyZSBpcyBhbiBleGFtcGxlOgorXGNvZGUKK01hdHJpeFhmIGEsIGIsIGM7CisuLi4KK2Mubm9hbGlhcygpICs9IDIgKiBhLnRyYW5zcG9zZSgpICogYjsKK1xlbmRjb2RlCitIb3dldmVyLCB0aGUgbm9hbGlhcyBtZWNoYW5pc20gZG9lcyBub3QgY292ZXIgYWxsIHRoZSBmZWF0dXJlcyBvZiB0aGUgb2xkIC5sYXp5KCkuIEluZGVlZCwgaW4gc29tZSBleHRyZW1lbHkgcmFyZSBjYXNlcywKK2l0IG1pZ2h0IGJlIHVzZWZ1bCB0byBleHBsaWNpdCByZXF1ZXN0IGZvciBhIGxheSBwcm9kdWN0LCBpLmUuLCBmb3IgYSBwcm9kdWN0IHdoaWNoIHdpbGwgYmUgZXZhbHVhdGVkIG9uZSBjb2VmZmljaWVudCBhdCBvbmNlLCBvbiByZXF1ZXN0LAoranVzdCBsaWtlIGFueSBvdGhlciBleHByZXNzaW9ucy4gVG8gdGhpcyBlbmQgeW91IGNhbiB1c2UgdGhlIE1hdHJpeEJhc2U6OmxhenlQcm9kdWN0KCkgZnVuY3Rpb24sIGhvd2V2ZXIgd2Ugc3Ryb25nbHkgZGlzY291cmFnZSB5b3UgdG8KK3VzZSBpdCB1bmxlc3MgeW91IGFyZSBzdXJlIG9mIHdoYXQgeW91IGFyZSBkb2luZywgaS5lLiwgeW91IGhhdmUgcmlnb3Vyb3NseSBtZWFzdXJlZCBhIHNwZWVkIGltcHJvdmVtZW50LgorCitcc2VjdGlvbiBBbGlnbk1hY3JvcyBBbGlnbm1lbnQtcmVsYXRlZCBtYWNyb3MKKworVGhlIEVJR0VOX0FMSUdOXzEyOCBtYWNybyBoYXMgYmVlbiByZW5hbWVkIHRvIEVJR0VOX0FMSUdOMTYuIERvbid0IGJlIHN1cnByaXNlZCwgaXQncyBqdXN0IHRoYXQgd2Ugc3dpdGNoZWQgdG8gY291bnRpbmcgaW4gYnl0ZXMgOy0pCisKK1RoZSBFSUdFTl9ET05UX0FMSUdOIG9wdGlvbiBzdGlsbCBleGlzdHMgaW4gRWlnZW4gMywgYnV0IGl0IGhhcyBhIG5ldyBjb3VzaW46IEVJR0VOX0RPTlRfQUxJR05fU1RBVElDQUxMWS4gSXQgYWxsb3dzIHRvIGdldCByaWQgb2YgYWxsIHN0YXRpYyBhbGlnbm1lbnQgaXNzdWVzIHdoaWxlIGtlZXBpbmcgYWxpZ25tZW50IG9mIGR5bmFtaWMtc2l6ZSBoZWFwLWFsbG9jYXRlZCBhcnJheXMsIHRodXMga2VlcGluZyB2ZWN0b3JpemF0aW9uIGZvciBkeW5hbWljLXNpemUgb2JqZWN0cy4KKworXHNlY3Rpb24gQWxpZ25lZE1hcCBBbGlnbmVkIE1hcCBvYmplY3RzCisKK0EgY29tbW9uIGlzc3VlIHdpdGggRWlnZW4gMiB3YXMgdGhhdCB3aGVuIG1hcHBpbmcgYW4gYXJyYXkgd2l0aCBNYXAsIHRoZXJlIHdhcyBubyB3YXkgdG8gdGVsbCBFaWdlbiB0aGF0IHlvdXIgYXJyYXkgd2FzIGFsaWduZWQuIFRoZXJlIHdhcyBhIEZvcmNlQWxpZ25lZCBvcHRpb24gYnV0IGl0IGRpZG4ndCBtZWFuIHRoYXQ7IGl0IHdhcyBqdXN0IGNvbmZ1c2luZyBhbmQgaGFzIGJlZW4gcmVtb3ZlZC4KKworTmV3IGluIEVpZ2VuMyBpcyB0aGUgI0FsaWduZWQgb3B0aW9uLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgTWFwLiBVc2UgaXQgbGlrZSB0aGlzOgorXGNvZGUKK01hcDxWZWN0b3I0ZiwgQWxpZ25lZD4gbXlNYXBwZWRWZWN0b3Ioc29tZV9hbGlnbmVkX2FycmF5KTsKK1xlbmRjb2RlCitUaGVyZSBhbHNvIGFyZSByZWxhdGVkIGNvbnZlbmllbmNlIHN0YXRpYyBtZXRob2RzLCB3aGljaCBhY3R1YWxseSBhcmUgdGhlIHByZWZlcnJlZCB3YXkgYXMgdGhleSB0YWtlIGNhcmUgb2Ygc3VjaCB0aGluZ3MgYXMgY29uc3RuZXNzOgorXGNvZGUKK3Jlc3VsdCA9IFZlY3RvcjRmOjpNYXBBbGlnbmVkKHNvbWVfYWxpZ25lZF9hcnJheSk7CitcZW5kY29kZQorCitcc2VjdGlvbiBTdGRDb250YWluZXJzIFNUTCBDb250YWluZXJzCisKK0luIEVpZ2VuMiwgI2luY2x1ZGU8RWlnZW4vU3RkVmVjdG9yPiB0d2Vha2VkIHN0ZDo6dmVjdG9yIHRvIGF1dG9tYXRpY2FsbHkgYWxpZ24gZWxlbWVudHMuIFRoZSBwcm9ibGVtIHdhcyB0aGF0IHRoYXQgd2FzIHF1aXRlIGludmFzaXZlLiBJbiBFaWdlbjMsIHdlIG9ubHkgb3ZlcnJpZGUgc3RhbmRhcmQgYmVoYXZpb3IgaWYgeW91IHVzZSBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VD4gYXMgeW91ciBhbGxvY2F0b3IgdHlwZS4gU28gZm9yIGV4YW1wbGUsIGlmIHlvdSB1c2Ugc3RkOjp2ZWN0b3I8TWF0cml4NGY+LCB5b3UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nIGNoYW5nZSAobm90ZSB0aGF0IGFsaWduZWRfYWxsb2NhdG9yIGlzIHVuZGVyIG5hbWVzcGFjZSBFaWdlbik6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+RWlnZW4gMjwvdGg+PHRoPkVpZ2VuIDM8L3RoPjwvdHI+Cis8dHI+CisgIDx0ZD4gXGNvZGUgc3RkOjp2ZWN0b3I8TWF0cml4NGY+IFxlbmRjb2RlIDwvdGQ+CisgIDx0ZD4gXGNvZGUgc3RkOjp2ZWN0b3I8TWF0cml4NGYsIGFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeDRmPiA+IFxlbmRjb2RlIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworXHNlY3Rpb24gZWlQcmVmaXggSW50ZXJuYWwgZWlfIHByZWZpeAorCitJbiBFaWdlbjIsIGdsb2JhbCBpbnRlcm5hbCBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMgd2VyZSBwcmVmaXhlZCBieSBcYyBlaV8uIEluIEVpZ2VuMywgdGhleSBhbGwgaGF2ZSBiZWVuIG1vdmVkIGludG8gdGhlIG1vcmUgZXhwbGljaXQgXGMgaW50ZXJuYWwgbmFtZXNwYWNlLiBTbywgZS5nLiwgXGMgZWlfc3FydCh4KSBub3cgYmVjb21lcyBcYyBpbnRlcm5hbDo6c3FydCh4KS4gT2YgY291cnNlIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byByZWx5IG9uIEVpZ2VuJ3MgaW50ZXJuYWwgZmVhdHVyZXMuCisKKworCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvQTEwX0VpZ2VuMlN1cHBvcnRNb2Rlcy5kb3ggYi9kb2MvQTEwX0VpZ2VuMlN1cHBvcnRNb2Rlcy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwYjY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9BMTBfRWlnZW4yU3VwcG9ydE1vZGVzLmRveApAQCAtMCwwICsxLDEwMSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIEVpZ2VuMlN1cHBvcnRNb2RlcyBFaWdlbiAyIHN1cHBvcnQgbW9kZXMKKworVGhpcyBwYWdlIGRvY3VtZW50cyB0aGUgRWlnZW4yIHN1cHBvcnQgbW9kZXMsIGEgcG93ZXJmdWwgdG9vbCB0byBoZWxwIG1pZ3JhdGluZyB5b3VyIHByb2plY3QgZnJvbSBFaWdlbiAyIHRvIEVpZ2VuIDMuCitEb24ndCBtaXNzIG91ciBwYWdlIG9uIFxyZWYgRWlnZW4yVG9FaWdlbjMgIkFQSSBjaGFuZ2VzIiBiZXR3ZWVuIEVpZ2VuIDIgYW5kIEVpZ2VuIDMuCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzCisgIC0gXHJlZiBFSUdFTjJfU1VQUE9SVF9NYWNybworICAtIFxyZWYgU3RhZ2VkTWlncmF0aW9uUGF0aE92ZXJ2aWV3CisgIC0gXHJlZiBTdGFnZTEwCisgIC0gXHJlZiBTdGFnZTIwCisgIC0gXHJlZiBTdGFnZTMwCisgIC0gXHJlZiBTdGFnZTQwCisgIC0gXHJlZiBGaW5hbGx5RHJvcEFsbEVpZ2VuMlN1cHBvcnQKKyAgLSBccmVmIEFCSUNvbXBhdGliaWxpdHkKKworXHNlY3Rpb24gRUlHRU4yX1NVUFBPUlRfTWFjcm8gVGhlIHF1aWNrIHdheTogZGVmaW5lIEVJR0VOMl9TVVBQT1JUCisKK0J5IGRlZmluaW5nIEVJR0VOMl9TVVBQT1JUIGJlZm9yZSBpbmNsdWRpbmcgYW55IEVpZ2VuIDMgaGVhZGVyLCB5b3UgZ2V0IGJhY2sgYSBsYXJnZSBwYXJ0IG9mIHRoZSBFaWdlbiAyIEFQSSwgd2hpbGUga2VlcGluZyB0aGUgRWlnZW4gMyBBUEkgYW5kIEFCSSB1bmNoYW5nZWQuCisKK1RoaXMgZGVmYXVsdHMgdG8gdGhlIFxyZWYgU3RhZ2UzMCAic3RhZ2UgMzAiIGRlc2NyaWJlZCBiZWxvdy4KKworVGhlIHJlc3Qgb2YgdGhpcyBwYWdlIGRlc2NyaWJlcyBhbiBvcHRpb25hbCwgbW9yZSBwb3dlcmZ1bCBcZW0gc3RhZ2VkIG1pZ3JhdGlvbiBwYXRoLgorCitcc2VjdGlvbiBTdGFnZWRNaWdyYXRpb25QYXRoT3ZlcnZpZXcgT3ZlcnZpZXcgb2YgdGhlIHN0YWdlZCBtaWdyYXRpb24gcGF0aAorCitUaGUgcHJpbWFyeSByZWFzb24gd2h5IEVJR0VOMl9TVVBQT1JUIGFsb25lIG1heSBub3QgYmUgZW5vdWdoIHRvIG1pZ3JhdGUgYSBsYXJnZSBwcm9qZWN0IGZyb20gRWlnZW4gMiB0byBFaWdlbiAzIGlzIHRoYXQgc29tZSBvZiB0aGUgRWlnZW4gMiBBUEkgaXMgaW5oZXJlbnRseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgRWlnZW4gMyBBUEkuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBzYW1lIGlkZW50aWZpZXIgaXMgdXNlZCBpbiBFaWdlbiAyIGFuZCBpbiBFaWdlbiAzIHdpdGggZGlmZmVyZW50IG1lYW5pbmdzLiBUbyBoZWxwIG1pZ3JhdGUgcHJvamVjdHMgdGhhdCByZWx5IG9uIHN1Y2ggQVBJLCB3ZSBwcm92aWRlIGEgc3RhZ2VkIG1pZ3JhdGlvbiBwYXRoIGFsbG93aW5nIHRvIHBlcmZvcm0gdGhlIG1pZ3JhdGlvbiBcZW0gaW5jcmVtZW50YWxseS4KKworSXQgZ29lcyBhcyBmb2xsb3dzOgorXGxpIFN0ZXAgMDogc3RhcnQgd2l0aCBhIHByb2plY3QgdXNpbmcgRWlnZW4gMi4KK1xsaSBTdGVwIDE6IGJ1aWxkIHlvdXIgcHJvamVjdCBhZ2FpbnN0IEVpZ2VuIDMgd2l0aCBccmVmIFN0YWdlMTAgIkVpZ2VuIDIgc3VwcG9ydCBzdGFnZSAxMCIuIFRoaXMgbW9kZSBlbmFibGVzIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBFaWdlbiAyIEFQSSwgd2l0aCBqdXN0IGEgZmV3IGV4Y2VwdGlvbnMuCitcbGkgU3RlcCAyOiBidWlsZCB5b3VyIHByb2plY3QgYWdhaW5zdCBFaWdlbiAzIHdpdGggXHJlZiBTdGFnZTIwICJFaWdlbiAyIHN1cHBvcnQgc3RhZ2UgMjAiLiBUaGlzIG1vZGUgZm9yY2VzIHlvdSB0byBhZGQgZWlnZW4yXyBwcmVmaXhlcyB0byB0aGUgRWlnZW4yIGlkZW50aWZpZXJzIHRoYXQgY29uZmxpY3Qgd2l0aCBFaWdlbiAzIEFQSS4KK1xsaSBTdGVwIDM6IGJ1aWxkIHlvdXIgcHJvamVjdCBhZ2FpbnN0IEVpZ2VuIDMgd2l0aCBccmVmIFN0YWdlMzAgIkVpZ2VuIDIgc3VwcG9ydCBzdGFnZSAzMCIuIFRoaXMgbW9kZSBlbmFibGVzIHRoZSBmdWxsIEVpZ2VuIDMgQVBJLgorXGxpIFN0ZXAgNDogYnVpbGQgeW91ciBwcm9qZWN0IGFnYWluc3QgRWlnZW4gMyB3aXRoIFxyZWYgU3RhZ2U0MCAiRWlnZW4gMiBzdXBwb3J0IHN0YWdlIDQwIi4gVGhpcyBtb2RlIGVuYWJsZXMgdGhlIGZ1bGwgRWlnZW4gMyBzdHJpY3RuZXNzIG9uIG1hdHRlcnMsIHN1Y2ggYXMgY29uc3QtY29ycmVjdG5lc3MsIHdoZXJlIEVpZ2VuIDIgd2FzIGxvb3Nlci4KK1xsaSBTdGVwIDU6IGJ1aWxkIHlvdXIgcHJvamVjdCBhZ2FpbnN0IEVpZ2VuIDMgd2l0aG91dCBhbnkgRWlnZW4gMiBzdXBwb3J0IG1vZGUuCisKK1xzZWN0aW9uIFN0YWdlMTAgU3RhZ2UgMTA6IGRlZmluZSBFSUdFTjJfU1VQUE9SVF9TVEFHRTEwX0ZVTExfRUlHRU4yX0FQSQorCitFbmFibGUgdGhpcyBtb2RlIGJ5IGRlZmluaW5nIHRoZSBFSUdFTjJfU1VQUE9SVF9TVEFHRTEwX0ZVTExfRUlHRU4yX0FQSSBwcmVwcm9jZXNzb3IgbWFjcm8gYmVmb3JlIGluY2x1ZGluZyBhbnkgRWlnZW4gMyBoZWFkZXIuCisKK1RoaXMgbW9kZSBtYXhpbWl6ZXMgc3VwcG9ydCBmb3IgdGhlIEVpZ2VuIDIgQVBJLiBBcyBhIHJlc3VsdCwgaXQgZG9lcyBub3Qgb2ZmZXIgdGhlIGZ1bGwgRWlnZW4gMyBBUEkuIEFsc28sIGl0IGRvZXNuJ3Qgb2ZmZXIgcXVpdGUgMTAwJSBvZiB0aGUgRWlnZW4gMiBBUEkuCisKK1RoZSBwYXJ0IG9mIHRoZSBFaWdlbiAzIEFQSSB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHRoaXMgbW9kZSwgaXMgRWlnZW4gMydzIEdlb21ldHJ5IG1vZHVsZS4gSW5kZWVkLCB0aGlzIG1vZGUgY29tcGxldGVseSByZXBsYWNlcyBpdCBieSBhIGNvcHkgb2YgRWlnZW4gMidzIEdlb21ldHJ5IG1vZHVsZS4KKworVGhlIHBhcnRzIG9mIHRoZSBBUEkgdGhhdCBhcmUgc3RpbGwgbm90IDEwMCUgRWlnZW4gMiBjb21wYXRpYmxlIGluIHRoaXMgbW9kZSBhcmU6CitcbGkgRG90IHByb2R1Y3RzIG92ZXIgY29tcGxleCBudW1iZXJzLiBFaWdlbiAyJ3MgZG90IHByb2R1Y3Qgd2FzIGxpbmVhciBpbiB0aGUgZmlyc3QgdmFyaWFibGUuIEVpZ2VuIDMncyBkb3QgcHJvZHVjdCBpcyBsaW5lYXIgaW4gdGhlIHNlY29uZCB2YXJpYWJsZS4gSW4gb3RoZXIgd29yZHMsIHRoZSBFaWdlbiAyIGNvZGUgXGNvZGUgeC5kb3QoeSkgXGVuZGNvZGUgaXMgZXF1aXZhbGVudCB0byB0aGUgRWlnZW4gMyBjb2RlIFxjb2RlIHkuZG90KHgpIFxlbmRjb2RlIEluIHlldCBvdGhlciB3b3JkcywgZG90IHByb2R1Y3RzIGFyZSBjb21wbGV4LWNvbmp1Z2F0ZWQgaW4gRWlnZW4gMyBjb21wYXJlZCB0byBFaWdlbiAyLiBUaGUgc3dpdGNoIHRvIHRoZSBuZXcgY29udmVudGlvbiB3YXMgY29tbWFuZGVkIGJ5IGNvbW1vbiB1c2FnZSwgZXNwZWNpYWxseSB3aXRoIHRoZSBub3RhdGlvbiBcZiQgeF5UeSBcZiQgZm9yIGRvdCBwcm9kdWN0cyBvZiBjb2x1bW4tdmVjdG9ycy4KK1xsaSBUaGUgU3BhcnNlIG1vZHVsZS4KK1xsaSBDZXJ0YWluIGZpbmUgZGV0YWlscyBvZiBsaW5lYXIgYWxnZWJyYWljIGRlY29tcG9zaXRpb25zLiBGb3IgZXhhbXBsZSwgTERMVCBkZWNvbXBvc2l0aW9uIGlzIG5vdyBwaXZvdGluZyBpbiBFaWdlbiAzIHdoZXJlYXMgaXQgd2Fzbid0IGluIEVpZ2VuIDIsIHNvIGNvZGUgdGhhdCB3YXMgcmVseWluZyBvbiBpdHMgdW5kZXJseWluZyBtYXRyaXggc3RydWN0dXJlIHdpbGwgYnJlYWsuCitcbGkgVXNhZ2Ugb2YgRWlnZW4gdHlwZXMgaW4gU1RMIGNvbnRhaW5lcnMsIFxyZWYgRWlnZW4yVG9FaWdlbjMgImFzIGV4cGxhaW5lZCBvbiB0aGlzIHBhZ2UiLgorCitcc2VjdGlvbiBTdGFnZTIwIFN0YWdlIDIwOiBkZWZpbmUgRUlHRU4yX1NVUFBPUlRfU1RBR0UyMF9SRVNPTFZFX0FQSV9DT05GTElDVFMKKworRW5hYmxlIHRoaXMgbW9kZSBieSBkZWZpbmluZyB0aGUgRUlHRU4yX1NVUFBPUlRfU1RBR0UxMF9GVUxMX0VJR0VOMl9BUEkgcHJlcHJvY2Vzc29yIG1hY3JvIGJlZm9yZSBpbmNsdWRpbmcgYW55IEVpZ2VuIDMgaGVhZGVyLgorCitUaGlzIG1vZGUgcmVtb3ZlcyB0aGUgRWlnZW4gMiBBUEkgdGhhdCBpcyBkaXJlY3RseSBjb25mbGljdGluZyB3aXRoIEVpZ2VuIDMgQVBJLiBJbnN0ZWFkLCB0aGVzZSBiaXRzIG9mIEVpZ2VuIDIgQVBJIHJlbWFpbiBhdmFpbGFibGUgd2l0aCBlaWdlbjJfIHByZWZpeGVzLiBUaGUgbWFpbiBleGFtcGxlcyBvZiBzdWNoIEFQSSBhcmU6CitcbGkgdGhlIHdob2xlIEdlb21ldHJ5IG1vZHVsZS4gRm9yIGV4YW1wbGUsIHJlcGxhY2UgXGMgUXVhdGVybmlvbiBieSBcYyBlaWdlbjJfUXVhdGVybmlvbiwgcmVwbGFjZSBcYyBUcmFuc2Zvcm0zZiBieSBcYyBlaWdlbjJfVHJhbnNmb3JtM2YsIGV0Yy4KK1xsaSB0aGUgbHUoKSBtZXRob2QgdG8gb2J0YWluIGEgTFUgZGVjb21wb3NpdGlvbi4gUmVwbGFjZSBieSBlaWdlbjJfbHUoKS4KKworVGhlcmUgaXMgYWxzbyBvbmUgbW9yZSBlaWdlbjJfLXByZWZpeGVkIGlkZW50aWZpZXIgdGhhdCB5b3Ugc2hvdWxkIGtub3cgYWJvdXQsIGV2ZW4gdGhvdWdoIGl0cyB1c2UgaXMgbm90IGNoZWNrZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoaXMgbW9kZTogdGhlIGRvdCgpIG1ldGhvZC4gQXMgd2FzIGRpc2N1c3NlZCBhYm92ZSwgb3ZlciBjb21wbGV4IG51bWJlcnMsIGl0cyBtZWFuaW5nIGlzIGRpZmZlcmVudCBiZXR3ZWVuIEVpZ2VuIDIgYW5kIEVpZ2VuIDMuIFlvdSBjYW4gdXNlIGVpZ2VuMl9kb3QoKSB0byBnZXQgdGhlIEVpZ2VuIDIgYmVoYXZpb3IuCisKK1xzZWN0aW9uIFN0YWdlMzAgU3RhZ2UgMzA6IGRlZmluZSBFSUdFTjJfU1VQUE9SVF9TVEFHRTMwX0ZVTExfRUlHRU4zX0FQSQorCitFbmFibGUgdGhpcyBtb2RlIGJ5IGRlZmluaW5nIHRoZSBFSUdFTjJfU1VQUE9SVF9TVEFHRTMwX0ZVTExfRUlHRU4zX0FQSSBwcmVwcm9jZXNzb3IgbWFjcm8gYmVmb3JlIGluY2x1ZGluZyBhbnkgRWlnZW4gMyBoZWFkZXIuIEFsc28sIHRoaXMgbW9kZSBpcyB3aGF0IHlvdSBnZXQgYnkgZGVmYXVsdCB3aGVuIHlvdSBqdXN0IGRlZmluZSBFSUdFTjJfU1VQUE9SVC4KKworVGhpcyBtb2RlIGdpdmVzIHlvdSB0aGUgZnVsbCB1bmFsdGVyZWQgRWlnZW4gMyBBUEksIHdoaWxlIHN0aWxsIGtlZXBpbmcgYXMgbXVjaCBzdXBwb3J0IGFzIHBvc3NpYmxlIGZvciB0aGUgRWlnZW4gMiBBUEkuCisKK1RoZSBlaWdlbjJfLXByZWZpeGVkIGlkZW50aWZpZXJzIGFyZSBzdGlsbCBhdmFpbGFibGUsIGJ1dCBhdCB0aGlzIHN0YWdlIHlvdSBzaG91bGQgbm93IHJlcGxhY2UgdGhlbSBieSBFaWdlbiAzIGlkZW50aWZpZXJzLiBIYXZlIGEgbG9vayBhdCBvdXIgcGFnZSBvbiBccmVmIEVpZ2VuMlRvRWlnZW4zICJBUEkgY2hhbmdlcyIgYmV0d2VlbiBFaWdlbiAyIGFuZCBFaWdlbiAzLgorCitcc2VjdGlvbiBTdGFnZTQwIFN0YWdlIDQwOiBkZWZpbmUgRUlHRU4yX1NVUFBPUlRfU1RBR0U0MF9GVUxMX0VJR0VOM19TVFJJQ1RORVNTCisKK0VuYWJsZSB0aGlzIG1vZGUgYnkgZGVmaW5pbmcgdGhlIEVJR0VOMl9TVVBQT1JUX1NUQUdFNDBfRlVMTF9FSUdFTjNfU1RSSUNUTkVTUyBwcmVwcm9jZXNzb3IgbWFjcm8gYmVmb3JlIGluY2x1ZGluZyBhbnkgRWlnZW4gMyBoZWFkZXIuCisKK1RoaXMgbW9kZSB0aWdodGVucyB0aGUgbGFzdCBiaXRzIG9mIHN0cmljdG5lc3MsIGVzcGVjaWFsbHkgY29uc3QtY29ycmVjdG5lc3MsIHRoYXQgaGFkIHRvIGJlIGxvb3NlbmVkIHRvIHN1cHBvcnQgd2hhdCBFaWdlbiAyIGFsbG93ZWQuIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgY29tcGlsZWQgaW4gRWlnZW4gMjoKK1xjb2RlCitjb25zdCBmbG9hdCBhcnJheVs0XTsKK3ggPSBNYXA8VmVjdG9yNGY+KGFycmF5KTsKK1xlbmRjb2RlCitUaGF0IGFsbG93ZWQgdG8gY2lyY3VtdmVudCBjb25zdG5lc3MuIFRoaXMgaXMgbm8gbG9uZ2VyIGFsbG93ZWQgaW4gRWlnZW4gMy4gSWYgeW91IGhhdmUgdG8gbWFwIGNvbnN0IGRhdGEgaW4gRWlnZW4gMywgbWFwIGl0IGFzIGEgY29uc3QtcXVhbGlmaWVkIHR5cGUuIEhvd2V2ZXIsIHJhdGhlciB0aGFuIGV4cGxpY3RseSBjb25zdHJ1Y3RpbmcgTWFwIG9iamVjdHMsIHdlIHN0cm9uZ2x5IGVuY291cmFnZSB5b3UgdG8gdXNlIHRoZSBzdGF0aWMgTWFwIG1ldGhvZHMgaW5zdGVhZCwgYXMgdGhleSB0YWtlIGNhcmUgb2YgYWxsIG9mIHRoaXMgZm9yIHlvdToKK1xjb2RlCitjb25zdCBmbG9hdCBhcnJheVs0XTsKK3ggPSBWZWN0b3I0Zjo6TWFwKGFycmF5KTsKK1xlbmRjb2RlCitUaGlzIGxldHMgRWlnZW4gZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciB5b3UgYW5kIHdvcmtzIGVxdWFsbHkgd2VsbCBpbiBFaWdlbiAyIGFuZCBpbiBFaWdlbiAzLgorCitcc2VjdGlvbiBGaW5hbGx5RHJvcEFsbEVpZ2VuMlN1cHBvcnQgRmluYWxseSBkcm9wIGFsbCBFaWdlbiAyIHN1cHBvcnQKKworU3RhZ2UgNDAgaXMgdGhlIGZpcnN0IHdoZXJlIGl0J3MgImNvbWZvcnRhYmxlIiB0byBzdGF5IGZvciBhIGxpdHRsZSBsb25nZXIgcGVyaW9kLCBzaW5jZSBpdCBwcmVzZXJ2ZXMgMTAwJSBFaWdlbiAzIGNvbXBhdGliaWxpdHkuIEhvd2V2ZXIsIHdlIHN0aWxsIGVuY291cmFnZSB5b3UgdG8gY29tcGxldGUgeW91ciBtaWdyYXRpb24gYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gV2hpbGUgd2UgZG8gcnVuIHRoZSBFaWdlbiAyIHRlc3Qgc3VpdGUgYWdhaW5zdCBFaWdlbiAzJ3Mgc3RhZ2UgMTAgc3VwcG9ydCBtb2RlLCB3ZSBjYW4ndCBndWFyYW50ZWUgdGhlIHNhbWUgbGV2ZWwgb2Ygc3VwcG9ydCBhbmQgcXVhbGl0eSBhc3N1cmFuY2UgZm9yIEVpZ2VuIDIgc3VwcG9ydCBhcyB3ZSBkbyBmb3IgRWlnZW4gMyBpdHNlbGYsIGVzcGVjaWFsbHkgbm90IGluIHRoZSBsb25nIHRlcm0uIFxyZWYgRWlnZW4yVG9FaWdlbjMgIlRoaXMgcGFnZSIgZGVzY3JpYmVzIGEgbGFyZ2UgcGFydCBvZiB0aGUgY2hhbmdlcyB0aGF0IHlvdSBtYXkgbmVlZCB0byBwZXJmb3JtLgorCitcc2VjdGlvbiBBQklDb21wYXRpYmlsaXR5IFdoYXQgYWJvdXQgQUJJIGNvbXBhdGliaWxpdHk/CisKK0l0IGdvZXMgYXMgZm9sbG93czoKK1xsaSBTdGFnZSAxMCBhbHJlYWR5IGlzIEFCSSBjb21wYXRpYmxlIHdpdGggRWlnZW4gMyBmb3IgdGhlIGJhc2ljIChNYXRyaXgsIEFycmF5LCBTcGFyc2VNYXRyaXguLi4pIHR5cGVzLiBIb3dldmVyLCBzaW5jZSB0aGlzIHN0YWdlIHVzZXMgYSBjb3B5IG9mIEVpZ2VuIDIncyBHZW9tZXRyeSBtb2R1bGUgaW5zdGVhZCBvZiBFaWdlbiAzJ3Mgb3duIEdlb21ldHJ5IG1vZHVsZSwgdGhlIEFCSSBpbiB0aGUgR2VvbWV0cnkgbW9kdWxlIGlzIG5vdCBFaWdlbiAzIGNvbXBhdGlibGUuCitcbGkgU3RhZ2UgMjAgcmVtb3ZlcyB0aGUgRWlnZW4gMy1pbmNvbXBhdGlibGUgRWlnZW4gMiBHZW9tZXRyeSBtb2R1bGUgKGl0IHJlbWFpbnMgYXZhaWxhYmxlIHdpdGggZWlnZW4yXyBwcmVmaXgpLiBTbyBhdCB0aGlzIHN0YWdlLCBhbGwgdGhlIGlkZW50aWZpZXJzIHRoYXQgZXhpc3QgaW4gRWlnZW4gMyBoYXZlIHRoZSBFaWdlbiAzIEFCSSAoYW5kIEFQSSkuCitcbGkgU3RhZ2UgMzAgaW50cm9kdWNlcyB0aGUgcmVtYWluaW5nIEVpZ2VuIDMgaWRlbnRpZmllcnMuIFNvIGF0IHRoaXMgc3RhZ2UsIHlvdSBoYXZlIHRoZSBmdWxsIEVpZ2VuIDMgQUJJLgorXGxpIFN0YWdlIDQwIGlzIG5vIGRpZmZlcmVudCB0aGFuIFN0YWdlIDMwIGluIHRoZXNlIG1hdHRlcnMuCisKKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0FzY2lpUXVpY2tSZWZlcmVuY2UudHh0IGIvZG9jL0FzY2lpUXVpY2tSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTk3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvQXNjaWlRdWlja1JlZmVyZW5jZS50eHQKQEAgLTAsMCArMSwxNzAgQEAKKy8vIEEgc2ltcGxlIHF1aWNrcmVmIGZvciBFaWdlbi4gQWRkIGFueXRoaW5nIHRoYXQncyBtaXNzaW5nLgorLy8gTWFpbiBhdXRob3I6IEtlaXIgTWllcmxlCisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPEVpZ2VuL0FycmF5PgorCitNYXRyaXg8ZG91YmxlLCAzLCAzPiBBOyAgICAgICAgICAgICAgIC8vIEZpeGVkIHJvd3MgYW5kIGNvbHMuIFNhbWUgYXMgTWF0cml4M2QuCitNYXRyaXg8ZG91YmxlLCAzLCBEeW5hbWljPiBCOyAgICAgICAgIC8vIEZpeGVkIHJvd3MsIGR5bmFtaWMgY29scy4KK01hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWM+IEM7ICAgLy8gRnVsbCBkeW5hbWljLiBTYW1lIGFzIE1hdHJpeFhkLgorTWF0cml4PGRvdWJsZSwgMywgMywgUm93TWFqb3I+IEU7ICAgICAvLyBSb3cgbWFqb3I7IGRlZmF1bHQgaXMgY29sdW1uLW1ham9yLgorTWF0cml4M2YgUCwgUSwgUjsgICAgICAgICAgICAgICAgICAgICAvLyAzeDMgZmxvYXQgbWF0cml4LgorVmVjdG9yM2YgeCwgeSwgejsgICAgICAgICAgICAgICAgICAgICAvLyAzeDEgZmxvYXQgbWF0cml4LgorUm93VmVjdG9yM2YgYSwgYiwgYzsgICAgICAgICAgICAgICAgICAvLyAxeDMgZmxvYXQgbWF0cml4LgorZG91YmxlIHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvLyBCYXNpYyB1c2FnZQorLy8gRWlnZW4gICAgICAgICAgLy8gTWF0bGFiICAgICAgICAgICAvLyBjb21tZW50cworeC5zaXplKCkgICAgICAgICAgLy8gbGVuZ3RoKHgpICAgICAgICAvLyB2ZWN0b3Igc2l6ZQorQy5yb3dzKCkgICAgICAgICAgLy8gc2l6ZShDKSgxKSAgICAgICAvLyBudW1iZXIgb2Ygcm93cworQy5jb2xzKCkgICAgICAgICAgLy8gc2l6ZShDKSgyKSAgICAgICAvLyBudW1iZXIgb2YgY29sdW1ucworeChpKSAgICAgICAgICAgICAgLy8geChpKzEpICAgICAgICAgICAvLyBNYXRsYWIgaXMgMS1iYXNlZAorQyhpLGopICAgICAgICAgICAgLy8gQyhpKzEsaisxKSAgICAgICAvLworCitBLnJlc2l6ZSg0LCA0KTsgICAvLyBSdW50aW1lIGVycm9yIGlmIGFzc2VydGlvbnMgYXJlIG9uLgorQi5yZXNpemUoNCwgOSk7ICAgLy8gUnVudGltZSBlcnJvciBpZiBhc3NlcnRpb25zIGFyZSBvbi4KK0EucmVzaXplKDMsIDMpOyAgIC8vIE9rOyBzaXplIGRpZG4ndCBjaGFuZ2UuCitCLnJlc2l6ZSgzLCA5KTsgICAvLyBPazsgb25seSBkeW5hbWljIGNvbHMgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICAgIAorQSA8PCAxLCAyLCAzLCAgICAgLy8gSW5pdGlhbGl6ZSBBLiBUaGUgZWxlbWVudHMgY2FuIGFsc28gYmUKKyAgICAgNCwgNSwgNiwgICAgIC8vIG1hdHJpY2VzLCB3aGljaCBhcmUgc3RhY2tlZCBhbG9uZyBjb2xzCisgICAgIDcsIDgsIDk7ICAgICAvLyBhbmQgdGhlbiB0aGUgcm93cyBhcmUgc3RhY2tlZC4KK0IgPDwgQSwgQSwgQTsgICAgIC8vIEIgaXMgdGhyZWUgaG9yaXpvbnRhbGx5IHN0YWNrZWQgQSdzLgorQS5maWxsKDEwKTsgICAgICAgLy8gRmlsbCBBIHdpdGggYWxsIDEwJ3MuCitBLnNldFJhbmRvbSgpOyAgICAvLyBGaWxsIEEgd2l0aCB1bmlmb3JtIHJhbmRvbSBudW1iZXJzIGluICgtMSwgMSkuCisgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlcyAjaW5jbHVkZSA8RWlnZW4vQXJyYXk+LgorQS5zZXRJZGVudGl0eSgpOyAgLy8gRmlsbCBBIHdpdGggdGhlIGlkZW50aXR5LgorCisvLyBNYXRyaXggc2xpY2luZyBhbmQgYmxvY2tzLiBBbGwgZXhwcmVzc2lvbnMgbGlzdGVkIGhlcmUgYXJlIHJlYWQvd3JpdGUuCisvLyBUZW1wbGF0ZWQgc2l6ZSB2ZXJzaW9ucyBhcmUgZmFzdGVyLiBOb3RlIHRoYXQgTWF0bGFiIGlzIDEtYmFzZWQgKGEgc2l6ZSBOCisvLyB2ZWN0b3IgaXMgeCgxKS4uLngoTikpLgorLy8gRWlnZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRsYWIKK3guaGVhZChuKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geCgxOm4pCit4LmhlYWQ8bj4oKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHgoMTpuKQoreC50YWlsKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOID0gcm93cyh4KTsgeChOIC0gbjogTikKK3gudGFpbDxuPigpICAgICAgICAgICAgICAgICAgICAgICAgLy8gTiA9IHJvd3MoeCk7IHgoTiAtIG46IE4pCit4LnNlZ21lbnQoaSwgbikgICAgICAgICAgICAgICAgICAgIC8vIHgoaSsxIDogaStuKQoreC5zZWdtZW50PG4+KGkpICAgICAgICAgICAgICAgICAgICAvLyB4KGkrMSA6IGkrbikKK1AuYmxvY2soaSwgaiwgcm93cywgY29scykgICAgICAgICAgLy8gUChpKzEgOiBpK3Jvd3MsIGorMSA6IGorY29scykKK1AuYmxvY2s8cm93cywgY29scz4oaSwgaikgICAgICAgICAgLy8gUChpKzEgOiBpK3Jvd3MsIGorMSA6IGorY29scykKK1AudG9wTGVmdENvcm5lcihyb3dzLCBjb2xzKSAgICAgICAgLy8gUCgxOnJvd3MsIDE6Y29scykKK1AudG9wUmlnaHRDb3JuZXIocm93cywgY29scykgICAgICAgLy8gW20gbl09c2l6ZShQKTsgUCgxOnJvd3MsIG4tY29scysxOm4pCitQLmJvdHRvbUxlZnRDb3JuZXIocm93cywgY29scykgICAgIC8vIFttIG5dPXNpemUoUCk7IFAobS1yb3dzKzE6bSwgMTpjb2xzKQorUC5ib3R0b21SaWdodENvcm5lcihyb3dzLCBjb2xzKSAgICAvLyBbbSBuXT1zaXplKFApOyBQKG0tcm93cysxOm0sIG4tY29scysxOm4pCitQLnRvcExlZnRDb3JuZXI8cm93cyxjb2xzPigpICAgICAgIC8vIFAoMTpyb3dzLCAxOmNvbHMpCitQLnRvcFJpZ2h0Q29ybmVyPHJvd3MsY29scz4oKSAgICAgIC8vIFttIG5dPXNpemUoUCk7IFAoMTpyb3dzLCBuLWNvbHMrMTpuKQorUC5ib3R0b21MZWZ0Q29ybmVyPHJvd3MsY29scz4oKSAgICAvLyBbbSBuXT1zaXplKFApOyBQKG0tcm93cysxOm0sIDE6Y29scykKK1AuYm90dG9tUmlnaHRDb3JuZXI8cm93cyxjb2xzPigpICAgLy8gW20gbl09c2l6ZShQKTsgUChtLXJvd3MrMTptLCBuLWNvbHMrMTpuKQorCisvLyBPZiBwYXJ0aWN1bGFyIG5vdGUgaXMgRWlnZW4ncyBzd2FwIGZ1bmN0aW9uIHdoaWNoIGlzIGhpZ2hseSBvcHRpbWl6ZWQuCisvLyBFaWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGxhYgorUi5yb3coaSkgPSBQLmNvbChqKTsgICAgICAgICAgICAgICAvLyBSKGksIDopID0gUCg6LCBpKQorUi5jb2woajEpLnN3YXAobWF0MS5jb2woajIpKTsgICAgICAvLyBSKDosIFtqMSBqMl0pID0gUig6LCBbajIsIGoxXSkKKworLy8gVmlld3MsIHRyYW5zcG9zZSwgZXRjOyBhbGwgcmVhZC13cml0ZSBleGNlcHQgZm9yIC5hZGpvaW50KCkuCisvLyBFaWdlbiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGxhYgorUi5hZGpvaW50KCkgICAgICAgICAgICAgICAgICAgICAgICAvLyBSJworUi50cmFuc3Bvc2UoKSAgICAgICAgICAgICAgICAgICAgICAvLyBSLicgb3IgY29uaihSJykKK1IuZGlhZ29uYWwoKSAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlhZyhSKQoreC5hc0RpYWdvbmFsKCkgICAgICAgICAgICAgICAgICAgICAvLyBkaWFnKHgpCisKKy8vIEFsbCB0aGUgc2FtZSBhcyBNYXRsYWIsIGJ1dCBtYXRsYWIgZG9lc24ndCBoYXZlICo9IHN0eWxlIG9wZXJhdG9ycy4KKy8vIE1hdHJpeC12ZWN0b3IuICBNYXRyaXgtbWF0cml4LiAgIE1hdHJpeC1zY2FsYXIuCit5ICA9IE0qeDsgICAgICAgICAgUiAgPSBQKlE7ICAgICAgICBSICA9IFAqczsKK2EgID0gYipNOyAgICAgICAgICBSICA9IFAgLSBROyAgICAgIFIgID0gcypQOworYSAqPSBNOyAgICAgICAgICAgIFIgID0gUCArIFE7ICAgICAgUiAgPSBQL3M7CisgICAgICAgICAgICAgICAgICAgUiAqPSBROyAgICAgICAgICBSICA9IHMqUDsKKyAgICAgICAgICAgICAgICAgICBSICs9IFE7ICAgICAgICAgIFIgKj0gczsKKyAgICAgICAgICAgICAgICAgICBSIC09IFE7ICAgICAgICAgIFIgLz0gczsKKworIC8vIFZlY3Rvcml6ZWQgb3BlcmF0aW9ucyBvbiBlYWNoIGVsZW1lbnQgaW5kZXBlbmRlbnRseQorIC8vIChtb3N0IHJlcXVpcmUgI2luY2x1ZGUgPEVpZ2VuL0FycmF5PikKKy8vIEVpZ2VuICAgICAgICAgICAgICAgICAgLy8gTWF0bGFiCitSID0gUC5jd2lzZVByb2R1Y3QoUSk7ICAgIC8vIFIgPSBQIC4qIFEKK1IgPSBQLmFycmF5KCkgKiBzLmFycmF5KCk7Ly8gUiA9IFAgLiogcworUiA9IFAuY3dpc2VRdW90aWVudChRKTsgICAvLyBSID0gUCAuLyBRCitSID0gUC5hcnJheSgpIC8gUS5hcnJheSgpOy8vIFIgPSBQIC4vIFEKK1IgPSBQLmFycmF5KCkgKyBzLmFycmF5KCk7Ly8gUiA9IFAgKyBzCitSID0gUC5hcnJheSgpIC0gcy5hcnJheSgpOy8vIFIgPSBQIC0gcworUi5hcnJheSgpICs9IHM7ICAgICAgICAgICAvLyBSID0gUiArIHMKK1IuYXJyYXkoKSAtPSBzOyAgICAgICAgICAgLy8gUiA9IFIgLSBzCitSLmFycmF5KCkgPCBRLmFycmF5KCk7ICAgIC8vIFIgPCBRCitSLmFycmF5KCkgPD0gUS5hcnJheSgpOyAgIC8vIFIgPD0gUQorUi5jd2lzZUludmVyc2UoKTsgICAgICAgICAvLyAxIC4vIFAKK1IuYXJyYXkoKS5pbnZlcnNlKCk7ICAgICAgLy8gMSAuLyBQCitSLmFycmF5KCkuc2luKCkgICAgICAgICAgIC8vIHNpbihQKQorUi5hcnJheSgpLmNvcygpICAgICAgICAgICAvLyBjb3MoUCkKK1IuYXJyYXkoKS5wb3cocykgICAgICAgICAgLy8gUCAuXiBzCitSLmFycmF5KCkuc3F1YXJlKCkgICAgICAgIC8vIFAgLl4gMgorUi5hcnJheSgpLmN1YmUoKSAgICAgICAgICAvLyBQIC5eIDMKK1IuY3dpc2VTcXJ0KCkgICAgICAgICAgICAgLy8gc3FydChQKQorUi5hcnJheSgpLnNxcnQoKSAgICAgICAgICAvLyBzcXJ0KFApCitSLmFycmF5KCkuZXhwKCkgICAgICAgICAgIC8vIGV4cChQKQorUi5hcnJheSgpLmxvZygpICAgICAgICAgICAvLyBsb2coUCkKK1IuY3dpc2VNYXgoUCkgICAgICAgICAgICAgLy8gbWF4KFIsIFApCitSLmFycmF5KCkubWF4KFAuYXJyYXkoKSkgIC8vIG1heChSLCBQKQorUi5jd2lzZU1pbihQKSAgICAgICAgICAgICAvLyBtaW4oUiwgUCkKK1IuYXJyYXkoKS5taW4oUC5hcnJheSgpKSAgLy8gbWluKFIsIFApCitSLmN3aXNlQWJzKCkgICAgICAgICAgICAgIC8vIGFicyhQKQorUi5hcnJheSgpLmFicygpICAgICAgICAgICAvLyBhYnMoUCkKK1IuY3dpc2VBYnMyKCkgICAgICAgICAgICAgLy8gYWJzKFAuXjIpCitSLmFycmF5KCkuYWJzMigpICAgICAgICAgIC8vIGFicyhQLl4yKQorKFIuYXJyYXkoKSA8IHMpLnNlbGVjdChQLFEpOyAgLy8gKFIgPCBzID8gUCA6IFEpCisKKy8vIFJlZHVjdGlvbnMuCitpbnQgciwgYzsKKy8vIEVpZ2VuICAgICAgICAgICAgICAgICAgLy8gTWF0bGFiCitSLm1pbkNvZWZmKCkgICAgICAgICAgICAgIC8vIG1pbihSKDopKQorUi5tYXhDb2VmZigpICAgICAgICAgICAgICAvLyBtYXgoUig6KSkKK3MgPSBSLm1pbkNvZWZmKCZyLCAmYykgICAgLy8gW2FhLCBiYl0gPSBtaW4oUik7IFtjYywgZGRdID0gbWluKGFhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gciA9IGJiKGRkKTsgYyA9IGRkOyBzID0gY2MKK3MgPSBSLm1heENvZWZmKCZyLCAmYykgICAgLy8gW2FhLCBiYl0gPSBtYXgoUik7IFtjYywgZGRdID0gbWF4KGFhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm93ID0gYmIoZGQpOyBjb2wgPSBkZDsgcyA9IGNjCitSLnN1bSgpICAgICAgICAgICAgICAgICAgIC8vIHN1bShSKDopKQorUi5jb2x3aXNlLnN1bSgpICAgICAgICAgICAvLyBzdW0oUikKK1Iucm93d2lzZS5zdW0oKSAgICAgICAgICAgLy8gc3VtKFIsIDIpIG9yIHN1bShSJyknCitSLnByb2QoKSAgICAgICAgICAgICAgICAgIC8vIHByb2QoUig6KSkKK1IuY29sd2lzZS5wcm9kKCkgICAgICAgICAgLy8gcHJvZChSKQorUi5yb3d3aXNlLnByb2QoKSAgICAgICAgICAvLyBwcm9kKFIsIDIpIG9yIHByb2QoUicpJworUi50cmFjZSgpICAgICAgICAgICAgICAgICAvLyB0cmFjZShSKQorUi5hbGwoKSAgICAgICAgICAgICAgICAgICAvLyBhbGwoUig6KSkKK1IuY29sd2lzZSgpLmFsbCgpICAgICAgICAgLy8gYWxsKFIpCitSLnJvd3dpc2UoKS5hbGwoKSAgICAgICAgIC8vIGFsbChSLCAyKQorUi5hbnkoKSAgICAgICAgICAgICAgICAgICAvLyBhbnkoUig6KSkKK1IuY29sd2lzZSgpLmFueSgpICAgICAgICAgLy8gYW55KFIpCitSLnJvd3dpc2UoKS5hbnkoKSAgICAgICAgIC8vIGFueShSLCAyKQorCisvLyBEb3QgcHJvZHVjdHMsIG5vcm1zLCBldGMuCisvLyBFaWdlbiAgICAgICAgICAgICAgICAgIC8vIE1hdGxhYgoreC5ub3JtKCkgICAgICAgICAgICAgICAgICAvLyBub3JtKHgpLiAgICBOb3RlIHRoYXQgbm9ybShSKSBkb2Vzbid0IHdvcmsgaW4gRWlnZW4uCit4LnNxdWFyZWROb3JtKCkgICAgICAgICAgIC8vIGRvdCh4LCB4KSAgIE5vdGUgdGhlIGVxdWl2YWxlbmNlIGlzIG5vdCB0cnVlIGZvciBjb21wbGV4Cit4LmRvdCh5KSAgICAgICAgICAgICAgICAgIC8vIGRvdCh4LCB5KQoreC5jcm9zcyh5KSAgICAgICAgICAgICAgICAvLyBjcm9zcyh4LCB5KSBSZXF1aXJlcyAjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKKy8vIEVpZ2VuIGNhbiBtYXAgZXhpc3RpbmcgbWVtb3J5IGludG8gRWlnZW4gbWF0cmljZXMuCitmbG9hdCBhcnJheVszXTsKK01hcDxWZWN0b3IzZj4oYXJyYXksIDMpLmZpbGwoMTApOworaW50IGRhdGFbNF0gPSAxLCAyLCAzLCA0OworTWF0cml4MmkgbWF0MngyKGRhdGEpOworTWF0cml4WGkgbWF0MngyID0gTWFwPE1hdHJpeDJpPihkYXRhKTsKK01hdHJpeFhpIG1hdDJ4MiA9IE1hcDxNYXRyaXhYaT4oZGF0YSwgMiwgMik7CisKKy8vIFNvbHZlIEF4ID0gYi4gUmVzdWx0IHN0b3JlZCBpbiB4LiBNYXRsYWI6IHggPSBBIFwgYi4KK2Jvb2wgc29sdmVkOworc29sdmVkID0gQS5sZGx0KCkuc29sdmUoYiwgJngpKTsgIC8vIEEgc3ltLiBwLnMuZC4gICAgI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5Pgorc29sdmVkID0gQS5sbHQoKSAuc29sdmUoYiwgJngpKTsgIC8vIEEgc3ltLiBwLmQuICAgICAgI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5Pgorc29sdmVkID0gQS5sdSgpICAuc29sdmUoYiwgJngpKTsgIC8vIFN0YWJsZSBhbmQgZmFzdC4gI2luY2x1ZGUgPEVpZ2VuL0xVPgorc29sdmVkID0gQS5xcigpICAuc29sdmUoYiwgJngpKTsgIC8vIE5vIHBpdm90aW5nLiAgICAgI2luY2x1ZGUgPEVpZ2VuL1FSPgorc29sdmVkID0gQS5zdmQoKSAuc29sdmUoYiwgJngpKTsgIC8vIFN0YWJsZSwgc2xvd2VzdC4gI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKy8vIC5sZGx0KCkgLT4gLm1hdHJpeEwoKSBhbmQgLm1hdHJpeEQoKQorLy8gLmxsdCgpICAtPiAubWF0cml4TCgpCisvLyAubHUoKSAgIC0+IC5tYXRyaXhMKCkgYW5kIC5tYXRyaXhVKCkKKy8vIC5xcigpICAgLT4gLm1hdHJpeFEoKSBhbmQgLm1hdHJpeFIoKQorLy8gLnN2ZCgpICAtPiAubWF0cml4VSgpLCAuc2luZ3VsYXJWYWx1ZXMoKSwgYW5kIC5tYXRyaXhWKCkKKworLy8gRWlnZW52YWx1ZSBwcm9ibGVtcworLy8gRWlnZW4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGxhYgorQS5laWdlbnZhbHVlcygpOyAgICAgICAgICAgICAgICAgIC8vIGVpZyhBKTsKK0VpZ2VuU29sdmVyPE1hdHJpeDNkPiBlaWcoQSk7ICAgICAvLyBbdmVjIHZhbF0gPSBlaWcoQSkKK2VpZy5laWdlbnZhbHVlcygpOyAgICAgICAgICAgICAgICAvLyBkaWFnKHZhbCkKK2VpZy5laWdlbnZlY3RvcnMoKTsgICAgICAgICAgICAgICAvLyB2ZWMKZGlmZiAtLWdpdCBhL2RvYy9CMDFfRXhwZXJpbWVudGFsLmRveCBiL2RvYy9CMDFfRXhwZXJpbWVudGFsLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDhiOTBkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0IwMV9FeHBlcmltZW50YWwuZG94CkBAIC0wLDAgKzEsNTUgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBFeHBlcmltZW50YWwgRXhwZXJpbWVudGFsIHBhcnRzIG9mIEVpZ2VuCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzCisgIC0gXHJlZiBzdW1tYXJ5CisgIC0gXHJlZiBtb2R1bGVzCisgIC0gXHJlZiBjb3JlCisKK1xzZWN0aW9uIHN1bW1hcnkgU3VtbWFyeQorCitXaXRoIHRoZSAyLjAgcmVsZWFzZSwgRWlnZW4ncyBBUEkgaXMsIHRvIGEgbGFyZ2UgZXh0ZW50LCBzdGFibGUuIEhvd2V2ZXIsIHdlIHdpc2ggdG8gcmV0YWluIHRoZSBmcmVlZG9tIHRvIG1ha2UgQVBJIGluY29tcGF0aWJsZSBjaGFuZ2VzLiBUbyB0aGF0IGVmZmVjdCwgd2UgY2FsbCBtYW55IHBhcnRzIG9mIEVpZ2VuICJleHBlcmltZW50YWwiIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBhcmUgbm90IHN1YmplY3QgdG8gQVBJIHN0YWJpbGl0eSBndWFyYW50ZWUuCisKK091ciBnb2FsIGlzIHRoYXQgZm9yIHRoZSAyLjEgcmVsZWFzZSAoZXhwZWN0ZWQgaW4gSnVseSAyMDA5KSBtb3N0IG9mIHRoZXNlIHBhcnRzIGJlY29tZSBBUEktc3RhYmxlIHRvby4KKworV2UgYXJlIGF3YXJlIHRoYXQgQVBJIHN0YWJpbGl0eSBpcyBhIG1ham9yIGNvbmNlcm4gZm9yIG91ciB1c2Vycy4gVGhhdCdzIHdoeSBpdCdzIGEgcHJpb3JpdHkgZm9yIHVzIHRvIHJlYWNoIGl0LCBidXQgYXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBiZWluZyBzZXJpb3VzIGFib3V0IG5vdCBjYWxsaW5nIEVpZ2VuIEFQSS1zdGFibGUgdG9vIGVhcmx5LgorCitFeHBlcmltZW50YWwgZmVhdHVyZXMgbWF5IGF0IGFueSB0aW1lOgorXGxpIGJlIHJlbW92ZWQ7CitcbGkgYmUgc3ViamVjdCB0byBhbiBBUEkgaW5jb21wYXRpYmxlIGNoYW5nZTsKK1xsaSBpbnRyb2R1Y2UgQVBJIG9yIEFCSSBpbmNvbXBhdGlibGUgY2hhbmdlcyBpbiB5b3VyIG93biBjb2RlIGlmIHlvdSBsZXQgdGhlbSBhZmZlY3QgeW91ciBBUEkgb3IgQUJJLgorCitcc2VjdGlvbiBtb2R1bGVzIEV4cGVyaW1lbnRhbCBtb2R1bGVzCisKK1RoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgY29uc2lkZXJlZCBlbnRpcmVseSBleHBlcmltZW50YWwsIGFuZCB3ZSBtYWtlIG5vIGZpcm0gQVBJIHN0YWJpbGl0eSBndWFyYW50ZWUgYWJvdXQgdGhlbSBmb3IgdGhlIHRpbWUgYmVpbmc6CitcbGkgU1ZECitcbGkgUVIKK1xsaSBDaG9sZXNreQorXGxpIFNwYXJzZQorXGxpIEdlb21ldHJ5ICh0aGlzIG9uZSBzaG91bGQgYmUgbW9zdGx5IHN0YWJsZSwgYnV0IGl0J3MgYSBsaXR0bGUgdG9vIGVhcmx5IHRvIG1ha2UgYSBmb3JtYWwgZ3VhcmFudGVlKQorCitcc2VjdGlvbiBjb3JlIEV4cGVyaW1lbnRhbCBwYXJ0cyBvZiB0aGUgQ29yZSBtb2R1bGUKKworSW4gdGhlIENvcmUgbW9kdWxlLCB0aGUgb25seSBjbGFzc2VzIHN1YmplY3QgdG8gQUJJIHN0YWJpbGl0eSBndWFyYW50ZWUgKG1lYW5pbmcgdGhhdCB5b3UgY2FuIHVzZSBpdCBmb3IgZGF0YSBtZW1iZXJzIGluIHlvdXIgcHVibGljIEFCSSkgaXM6CitcbGkgTWF0cml4CitcbGkgTWFwCisKK0FsbCBvdGhlciBjbGFzc2VzIG9mZmVyIG5vIEFCSSBndWFyYW50ZWUsIGUuZy4gdGhlIGxheW91dCBvZiB0aGVpciBkYXRhIGNhbiBiZSBjaGFuZ2VkLgorCitUaGUgb25seSBjbGFzc2VzIHN1YmplY3QgdG8gKGV2ZW4gcGFydGlhbCkgQVBJIHN0YWJpbGl0eSBndWFyYW50ZWUgKG1lYW5pbmcgdGhhdCB5b3UgY2FuIHNhZmVseSBjb25zdHJ1Y3QgYW5kIHVzZSBvYmplY3RzKSBhcmU6CitcbGkgTWF0cml4QmFzZSA6IHBhcnRpYWwgQVBJIHN0YWJpbGl0eSAoc2VlIGJlbG93KQorXGxpIE1hdHJpeCA6IGZ1bGwgQVBJIHN0YWJpbGl0eSAoZXhjZXB0IGZvciBleHBlcmltZW50YWwgc3R1ZmYgaW5oZXJpdGVkIGZyb20gTWF0cml4QmFzZSkKK1xsaSBNYXAgOiBmdWxsIEFQSSBzdGFiaWxpdHkgKGV4Y2VwdCBmb3IgZXhwZXJpbWVudGFsIHN0dWZmIGluaGVyaXRlZCBmcm9tIE1hdHJpeEJhc2UpCisKK0FsbCBvdGhlciBjbGFzc2VzIG9mZmVyIG5vIGRpcmVjdCBBUEkgZ3VhcmFudGVlLCBlLmcuIHRoZWlyIG1ldGhvZHMgY2FuIGJlIGNoYW5nZWQ7IGhvd2V2ZXIgbm90aWNlIHRoYXQgbW9zdCBjbGFzc2VzIGluaGVyaXQgTWF0cml4QmFzZSBhbmQgdGhhdCB0aGlzIGlzIHdoZXJlIG1vc3Qgb2YgdGhlaXIgQVBJIGNvbWVzIGZyb20gLS0gc28gaW4gcHJhY3RpY2UgbW9zdCBvZiB0aGUgQVBJIGlzIHN0YWJsZS4KKworQSBmZXcgTWF0cml4QmFzZSBtZXRob2RzIGFyZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCwgaGVuY2Ugbm90IHBhcnQgb2YgYW55IEFQSSBzdGFiaWxpdHkgZ3VhcmFudGVlOgorXGxpIGFsbCBtZXRob2RzIGRvY3VtZW50ZWQgYXMgaW50ZXJuYWwKK1xsaSBhbGwgbWV0aG9kcyBoaWRkZW4gaW4gdGhlIERveHlnZW4gZG9jdW1lbnRhdGlvbgorXGxpIGFsbCBtZXRob2RzIG1hcmtlZCBhcyBleHBlcmltZW50YWwKK1xsaSBhbGwgbWV0aG9kcyBkZWZpbmVkIGluIGV4cGVyaW1lbnRhbCBtb2R1bGVzCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DMDBfUXVpY2tTdGFydEd1aWRlLmRveCBiL2RvYy9DMDBfUXVpY2tTdGFydEd1aWRlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTM0Y2IwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0MwMF9RdWlja1N0YXJ0R3VpZGUuZG94CkBAIC0wLDAgKzEsOTkgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBHZXR0aW5nU3RhcnRlZCBHZXR0aW5nIHN0YXJ0ZWQKKyAgICBcaW5ncm91cCBUdXRvcmlhbAorCitUaGlzIGlzIGEgdmVyeSBzaG9ydCBndWlkZSBvbiBob3cgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCBFaWdlbi4gSXQgaGFzIGEgZHVhbCBwdXJwb3NlLiBJdCBzZXJ2ZXMgYXMgYSBtaW5pbWFsIGludHJvZHVjdGlvbiB0byB0aGUgRWlnZW4gbGlicmFyeSBmb3IgcGVvcGxlIHdobyB3YW50IHRvIHN0YXJ0IGNvZGluZyBhcyBzb29uIGFzIHBvc3NpYmxlLiBZb3UgY2FuIGFsc28gcmVhZCB0aGlzIHBhZ2UgYXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFR1dG9yaWFsLCB3aGljaCBleHBsYWlucyB0aGUgbGlicmFyeSBpbiBtb3JlIGRldGFpbDsgaW4gdGhpcyBjYXNlIHlvdSB3aWxsIGNvbnRpbnVlIHdpdGggXHJlZiBUdXRvcmlhbE1hdHJpeENsYXNzLgorCitcc2VjdGlvbiBHZXR0aW5nU3RhcnRlZEluc3RhbGxhdGlvbiBIb3cgdG8gImluc3RhbGwiIEVpZ2VuPworCitJbiBvcmRlciB0byB1c2UgRWlnZW4sIHlvdSBqdXN0IG5lZWQgdG8gZG93bmxvYWQgYW5kIGV4dHJhY3QgRWlnZW4ncyBzb3VyY2UgY29kZSAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL2luZGV4LnBocD90aXRsZT1NYWluX1BhZ2UjRG93bmxvYWQiPnRoZSB3aWtpPC9hPiBmb3IgZG93bmxvYWQgaW5zdHJ1Y3Rpb25zKS4gSW4gZmFjdCwgdGhlIGhlYWRlciBmaWxlcyBpbiB0aGUgXGMgRWlnZW4gc3ViZGlyZWN0b3J5IGFyZSB0aGUgb25seSBmaWxlcyByZXF1aXJlZCB0byBjb21waWxlIHByb2dyYW1zIHVzaW5nIEVpZ2VuLiBUaGUgaGVhZGVyIGZpbGVzIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHBsYXRmb3Jtcy4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgQ01ha2Ugb3IgaW5zdGFsbCBhbnl0aGluZy4KKworCitcc2VjdGlvbiBHZXR0aW5nU3RhcnRlZEZpcnN0UHJvZ3JhbSBBIHNpbXBsZSBmaXJzdCBwcm9ncmFtCisKK0hlcmUgaXMgYSByYXRoZXIgc2ltcGxlIHByb2dyYW0gdG8gZ2V0IHlvdSBzdGFydGVkLgorCitcaW5jbHVkZSBRdWlja1N0YXJ0X2V4YW1wbGUuY3BwCisKK1dlIHdpbGwgZXhwbGFpbiB0aGUgcHJvZ3JhbSBhZnRlciB0ZWxsaW5nIHlvdSBob3cgdG8gY29tcGlsZSBpdC4KKworCitcc2VjdGlvbiBHZXR0aW5nU3RhcnRlZENvbXBpbGluZyBDb21waWxpbmcgYW5kIHJ1bm5pbmcgeW91ciBmaXJzdCBwcm9ncmFtCisKK1RoZXJlIGlzIG5vIGxpYnJhcnkgdG8gbGluayB0by4gVGhlIG9ubHkgdGhpbmcgdGhhdCB5b3UgbmVlZCB0byBrZWVwIGluIG1pbmQgd2hlbiBjb21waWxpbmcgdGhlIGFib3ZlIHByb2dyYW0gaXMgdGhhdCB0aGUgY29tcGlsZXIgbXVzdCBiZSBhYmxlIHRvIGZpbmQgdGhlIEVpZ2VuIGhlYWRlciBmaWxlcy4gVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgcGxhY2VkIEVpZ2VuJ3Mgc291cmNlIGNvZGUgbXVzdCBiZSBpbiB0aGUgaW5jbHVkZSBwYXRoLiBXaXRoIEdDQyB5b3UgdXNlIHRoZSAtSSBvcHRpb24gdG8gYWNoaWV2ZSB0aGlzLCBzbyB5b3UgY2FuIGNvbXBpbGUgdGhlIHByb2dyYW0gd2l0aCBhIGNvbW1hbmQgbGlrZSB0aGlzOgorCitcY29kZSBnKysgLUkgL3BhdGgvdG8vZWlnZW4vIG15X3Byb2dyYW0uY3BwIC1vIG15X3Byb2dyYW0gXGVuZGNvZGUKKworT24gTGludXggb3IgTWFjIE9TIFgsIGFub3RoZXIgb3B0aW9uIGlzIHRvIHN5bWxpbmsgb3IgY29weSB0aGUgRWlnZW4gZm9sZGVyIGludG8gL3Vzci9sb2NhbC9pbmNsdWRlLy4gVGhpcyB3YXksIHlvdSBjYW4gY29tcGlsZSB0aGUgcHJvZ3JhbSB3aXRoOgorCitcY29kZSBnKysgbXlfcHJvZ3JhbS5jcHAgLW8gbXlfcHJvZ3JhbSBcZW5kY29kZQorCitXaGVuIHlvdSBydW4gdGhlIHByb2dyYW0sIGl0IHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgorCitcaW5jbHVkZSBRdWlja1N0YXJ0X2V4YW1wbGUub3V0CisKKworXHNlY3Rpb24gR2V0dGluZ1N0YXJ0ZWRFeHBsYW5hdGlvbiBFeHBsYW5hdGlvbiBvZiB0aGUgZmlyc3QgcHJvZ3JhbQorCitUaGUgRWlnZW4gaGVhZGVyIGZpbGVzIGRlZmluZSBtYW55IHR5cGVzLCBidXQgZm9yIHNpbXBsZSBhcHBsaWNhdGlvbnMgaXQgbWF5IGJlIGVub3VnaCB0byB1c2Ugb25seSB0aGUgXGMgTWF0cml4WGQgdHlwZS4gVGhpcyByZXByZXNlbnRzIGEgbWF0cml4IG9mIGFyYml0cmFyeSBzaXplIChoZW5jZSB0aGUgXGMgWCBpbiBcYyBNYXRyaXhYZCksIGluIHdoaWNoIGV2ZXJ5IGVudHJ5IGlzIGEgXGMgZG91YmxlIChoZW5jZSB0aGUgXGMgZCBpbiBcYyBNYXRyaXhYZCkuIFNlZSB0aGUgXHJlZiBRdWlja1JlZl9UeXBlcyAicXVpY2sgcmVmZXJlbmNlIGd1aWRlIiBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGRpZmZlcmVudCB0eXBlcyB5b3UgY2FuIHVzZSB0byByZXByZXNlbnQgYSBtYXRyaXguCisKK1RoZSBcYyBFaWdlbi9EZW5zZSBoZWFkZXIgZmlsZSBkZWZpbmVzIGFsbCBtZW1iZXIgZnVuY3Rpb25zIGZvciB0aGUgTWF0cml4WGQgdHlwZSBhbmQgcmVsYXRlZCB0eXBlcyAoc2VlIGFsc28gdGhlIFxyZWYgUXVpY2tSZWZfSGVhZGVycyAidGFibGUgb2YgaGVhZGVyIGZpbGVzIikuIEFsbCBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGhlYWRlciBmaWxlIChhbmQgb3RoZXIgRWlnZW4gaGVhZGVyIGZpbGVzKSBhcmUgaW4gdGhlIFxjIEVpZ2VuIG5hbWVzcGFjZS4gCisKK1RoZSBmaXJzdCBsaW5lIG9mIHRoZSBcYyBtYWluIGZ1bmN0aW9uIGRlY2xhcmVzIGEgdmFyaWFibGUgb2YgdHlwZSBcYyBNYXRyaXhYZCBhbmQgc3BlY2lmaWVzIHRoYXQgaXQgaXMgYSBtYXRyaXggd2l0aCAyIHJvd3MgYW5kIDIgY29sdW1ucyAodGhlIGVudHJpZXMgYXJlIG5vdCBpbml0aWFsaXplZCkuIFRoZSBzdGF0ZW1lbnQgPHR0Pm0oMCwwKSA9IDM8L3R0PiBzZXRzIHRoZSBlbnRyeSBpbiB0aGUgdG9wLWxlZnQgY29ybmVyIHRvIDMuIFlvdSBuZWVkIHRvIHVzZSByb3VuZCBwYXJlbnRoZXNlcyB0byByZWZlciB0byBlbnRyaWVzIGluIHRoZSBtYXRyaXguIEFzIHVzdWFsIGluIGNvbXB1dGVyIHNjaWVuY2UsIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaW5kZXggaXMgMCwgYXMgb3Bwb3NlZCB0byB0aGUgY29udmVudGlvbiBpbiBtYXRoZW1hdGljcyB0aGF0IHRoZSBmaXJzdCBpbmRleCBpcyAxLgorCitUaGUgZm9sbG93aW5nIHRocmVlIHN0YXRlbWVudHMgc2V0cyB0aGUgb3RoZXIgdGhyZWUgZW50cmllcy4gVGhlIGZpbmFsIGxpbmUgb3V0cHV0cyB0aGUgbWF0cml4IFxjIG0gdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0uCisKKworXHNlY3Rpb24gR2V0dGluZ1N0YXJ0ZWRFeGFtcGxlMiBFeGFtcGxlIDI6IE1hdHJpY2VzIGFuZCB2ZWN0b3JzCisKK0hlcmUgaXMgYW5vdGhlciBleGFtcGxlLCB3aGljaCBjb21iaW5lcyBtYXRyaWNlcyB3aXRoIHZlY3RvcnMuIENvbmNlbnRyYXRlIG9uIHRoZSBsZWZ0LWhhbmQgcHJvZ3JhbSBmb3Igbm93OyB3ZSB3aWxsIHRhbGsgYWJvdXQgdGhlIHJpZ2h0LWhhbmQgcHJvZ3JhbSBsYXRlci4KKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5TaXplIHNldCBhdCBydW4gdGltZTo8L3RoPjx0aD5TaXplIHNldCBhdCBjb21waWxlIHRpbWU6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFF1aWNrU3RhcnRfZXhhbXBsZTJfZHluYW1pYy5jcHAKKzwvdGQ+Cis8dGQ+CitcaW5jbHVkZSBRdWlja1N0YXJ0X2V4YW1wbGUyX2ZpeGVkLmNwcAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBvdXRwdXQgaXMgYXMgZm9sbG93czoKKworXGluY2x1ZGUgUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLm91dAorCisKK1xzZWN0aW9uIEdldHRpbmdTdGFydGVkRXhwbGFuYXRpb24yIEV4cGxhbmF0aW9uIG9mIHRoZSBzZWNvbmQgZXhhbXBsZQorCitUaGUgc2Vjb25kIGV4YW1wbGUgc3RhcnRzIGJ5IGRlY2xhcmluZyBhIDMtYnktMyBtYXRyaXggXGMgbSB3aGljaCBpcyBpbml0aWFsaXplZCB1c2luZyB0aGUgXGxpbmsgRGVuc2VCYXNlOjpSYW5kb20oSW5kZXgsSW5kZXgpIFJhbmRvbSgpIFxlbmRsaW5rIG1ldGhvZCB3aXRoIHJhbmRvbSB2YWx1ZXMgYmV0d2VlbiAtMSBhbmQgMS4gVGhlIG5leHQgbGluZSBhcHBsaWVzIGEgbGluZWFyIG1hcHBpbmcgc3VjaCB0aGF0IHRoZSB2YWx1ZXMgYXJlIGJldHdlZW4gMTAgYW5kIDExMC4gVGhlIGZ1bmN0aW9uIGNhbGwgXGxpbmsgRGVuc2VCYXNlOjpDb25zdGFudChJbmRleCxJbmRleCxjb25zdCBTY2FsYXImKSBNYXRyaXhYZDo6Q29uc3RhbnRcZW5kbGluaygzLDMsMS4yKSByZXR1cm5zIGEgMy1ieS0zIG1hdHJpeCBleHByZXNzaW9uIGhhdmluZyBhbGwgY29lZmZpY2llbnRzIGVxdWFsIHRvIDEuMi4gVGhlIHJlc3QgaXMgc3RhbmRhcmQgYXJpdGhtZXRpY3MuCisKK1RoZSBuZXh0IGxpbmUgb2YgdGhlIFxjIG1haW4gZnVuY3Rpb24gaW50cm9kdWNlcyBhIG5ldyB0eXBlOiBcYyBWZWN0b3JYZC4gVGhpcyByZXByZXNlbnRzIGEgKGNvbHVtbikgdmVjdG9yIG9mIGFyYml0cmFyeSBzaXplLiBIZXJlLCB0aGUgdmVjdG9yIFxjIHYgaXMgY3JlYXRlZCB0byBjb250YWluIFxjIDMgY29lZmZpY2llbnRzIHdoaWNoIGFyZSBsZWZ0IHVuaXRpYWxpemVkLiBUaGUgb25lIGJ1dCBsYXN0IGxpbmUgdXNlcyB0aGUgc28tY2FsbGVkIGNvbW1hLWluaXRpYWxpemVyLCBleHBsYWluZWQgaW4gXHJlZiBUdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb24sIHRvIHNldCBhbGwgY29lZmZpY2llbnRzIG9mIHRoZSB2ZWN0b3IgXGMgdiB0byBiZSBhcyBmb2xsb3dzOgorCitcZlsKK3YgPQorXGJlZ2lue2JtYXRyaXh9CisgIDEgXFwKKyAgMiBcXAorICAzCitcZW5ke2JtYXRyaXh9LgorXGZdCisKK1RoZSBmaW5hbCBsaW5lIG9mIHRoZSBwcm9ncmFtIG11bHRpcGxpZXMgdGhlIG1hdHJpeCBcYyBtIHdpdGggdGhlIHZlY3RvciBcYyB2IGFuZCBvdXRwdXRzIHRoZSByZXN1bHQuCisKK05vdyBsb29rIGJhY2sgYXQgdGhlIHNlY29uZCBleGFtcGxlIHByb2dyYW0uIFdlIHByZXNlbnRlZCB0d28gdmVyc2lvbnMgb2YgaXQuIEluIHRoZSB2ZXJzaW9uIGluIHRoZSBsZWZ0IGNvbHVtbiwgdGhlIG1hdHJpeCBpcyBvZiB0eXBlIFxjIE1hdHJpeFhkIHdoaWNoIHJlcHJlc2VudHMgbWF0cmljZXMgb2YgYXJiaXRyYXJ5IHNpemUuIFRoZSB2ZXJzaW9uIGluIHRoZSByaWdodCBjb2x1bW4gaXMgc2ltaWxhciwgZXhjZXB0IHRoYXQgdGhlIG1hdHJpeCBpcyBvZiB0eXBlIFxjIE1hdHJpeDNkLCB3aGljaCByZXByZXNlbnRzIG1hdHJpY2VzIG9mIGEgZml4ZWQgc2l6ZSAoaGVyZSAzLWJ5LTMpLiBCZWNhdXNlIHRoZSB0eXBlIGFscmVhZHkgZW5jb2RlcyB0aGUgc2l6ZSBvZiB0aGUgbWF0cml4LCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgdGhlIHNpemUgaW4gdGhlIGNvbnN0cnVjdG9yOyBjb21wYXJlIDx0dD5NYXRyaXhYZCBtKDMsMyk8L3R0PiB3aXRoIDx0dD5NYXRyaXgzZCBtPC90dD4uIFNpbWlsYXJseSwgd2UgaGF2ZSBcYyBWZWN0b3JYZCBvbiB0aGUgbGVmdCAoYXJiaXRyYXJ5IHNpemUpIHZlcnN1cyBcYyBWZWN0b3IzZCBvbiB0aGUgcmlnaHQgKGZpeGVkIHNpemUpLiBOb3RlIHRoYXQgaGVyZSB0aGUgY29lZmZpY2llbnRzIG9mIHZlY3RvciBcYyB2IGFyZSBkaXJlY3RseSBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yLCB0aG91Z2ggdGhlIHNhbWUgc3ludGF4IG9mIHRoZSBsZWZ0IGV4YW1wbGUgY291bGQgYmUgdXNlZCB0b28uCisKK1RoZSB1c2Ugb2YgZml4ZWQtc2l6ZSBtYXRyaWNlcyBhbmQgdmVjdG9ycyBoYXMgdHdvIGFkdmFudGFnZXMuIFRoZSBjb21waWxlciBlbWl0cyBiZXR0ZXIgKGZhc3RlcikgY29kZSBiZWNhdXNlIGl0IGtub3dzIHRoZSBzaXplIG9mIHRoZSBtYXRyaWNlcyBhbmQgdmVjdG9ycy4gU3BlY2lmeWluZyB0aGUgc2l6ZSBpbiB0aGUgdHlwZSBhbHNvIGFsbG93cyBmb3IgbW9yZSByaWdvcm91cyBjaGVja2luZyBhdCBjb21waWxlLXRpbWUuIEZvciBpbnN0YW5jZSwgdGhlIGNvbXBpbGVyIHdpbGwgY29tcGxhaW4gaWYgeW91IHRyeSB0byBtdWx0aXBseSBhIFxjIE1hdHJpeDRkIChhIDQtYnktNCBtYXRyaXgpIHdpdGggYSBcYyBWZWN0b3IzZCAoYSB2ZWN0b3Igb2Ygc2l6ZSAzKS4gSG93ZXZlciwgdGhlIHVzZSBvZiBtYW55IHR5cGVzIGluY3JlYXNlcyBjb21waWxhdGlvbiB0aW1lIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZS4gVGhlIHNpemUgb2YgdGhlIG1hdHJpeCBtYXkgYWxzbyBub3QgYmUga25vd24gYXQgY29tcGlsZS10aW1lLiBBIHJ1bGUgb2YgdGh1bWIgaXMgdG8gdXNlIGZpeGVkLXNpemUgbWF0cmljZXMgZm9yIHNpemUgNC1ieS00IGFuZCBzbWFsbGVyLgorCisKK1xzZWN0aW9uIEdldHRpbmdTdGFydGVkQ29uY2x1c2lvbiBXaGVyZSB0byBnbyBmcm9tIGhlcmU/CisKK0l0J3Mgd29ydGggdGFraW5nIHRoZSB0aW1lIHRvIHJlYWQgdGhlICBccmVmIFR1dG9yaWFsTWF0cml4Q2xhc3MgImxvbmcgdHV0b3JpYWwiLgorCitIb3dldmVyIGlmIHlvdSB0aGluayB5b3UgZG9uJ3QgbmVlZCBpdCwgeW91IGNhbiBkaXJlY3RseSB1c2UgdGhlIGNsYXNzZXMgZG9jdW1lbnRhdGlvbiBhbmQgb3VyIFxyZWYgUXVpY2tSZWZQYWdlLgorCitcbGkgXGIgTmV4dDogXHJlZiBUdXRvcmlhbE1hdHJpeENsYXNzCisKKyovCisKK30KKwpkaWZmIC0tZ2l0IGEvZG9jL0MwMV9UdXRvcmlhbE1hdHJpeENsYXNzLmRveCBiL2RvYy9DMDFfVHV0b3JpYWxNYXRyaXhDbGFzcy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2MDYxNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9DMDFfVHV0b3JpYWxNYXRyaXhDbGFzcy5kb3gKQEAgLTAsMCArMSwyODQgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUdXRvcmlhbE1hdHJpeENsYXNzIFR1dG9yaWFsIHBhZ2UgMSAtIFRoZSAlTWF0cml4IGNsYXNzCisKK1xpbmdyb3VwIFR1dG9yaWFsCisKK1xsaSBcYiBQcmV2aW91czogXHJlZiBHZXR0aW5nU3RhcnRlZAorXGxpIFxiIE5leHQ6IFxyZWYgVHV0b3JpYWxNYXRyaXhBcml0aG1ldGljCisKK1dlIGFzc3VtZSB0aGF0IHlvdSBoYXZlIGFscmVhZHkgcmVhZCB0aGUgcXVpY2sgXGxpbmsgR2V0dGluZ1N0YXJ0ZWQgImdldHRpbmcgc3RhcnRlZCIgXGVuZGxpbmsgdHV0b3JpYWwuCitUaGlzIHBhZ2UgaXMgdGhlIGZpcnN0IG9uZSBpbiBhIG11Y2ggbG9uZ2VyIG11bHRpLXBhZ2UgdHV0b3JpYWwuCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzCisgIC0gXHJlZiBUdXRvcmlhbE1hdHJpeEZpcnN0M1BhcmFtcworICAtIFxyZWYgVHV0b3JpYWxNYXRyaXhWZWN0b3JzCisgIC0gXHJlZiBUdXRvcmlhbE1hdHJpeER5bmFtaWMKKyAgLSBccmVmIFR1dG9yaWFsTWF0cml4Q29uc3RydWN0b3JzCisgIC0gXHJlZiBUdXRvcmlhbE1hdHJpeENvZWZmQWNjZXNzb3JzCisgIC0gXHJlZiBUdXRvcmlhbE1hdHJpeENvbW1hSW5pdGlhbGl6ZXIKKyAgLSBccmVmIFR1dG9yaWFsTWF0cml4U2l6ZXNSZXNpemluZworICAtIFxyZWYgVHV0b3JpYWxNYXRyaXhBc3NpZ25tZW50CisgIC0gXHJlZiBUdXRvcmlhbE1hdHJpeEZpeGVkVnNEeW5hbWljCisgIC0gXHJlZiBUdXRvcmlhbE1hdHJpeE9wdFRlbXBsUGFyYW1zCisgIC0gXHJlZiBUdXRvcmlhbE1hdHJpeFR5cGVkZWZzCisKK0luIEVpZ2VuLCBhbGwgbWF0cmljZXMgYW5kIHZlY3RvcnMgYXJlIG9iamVjdHMgb2YgdGhlIE1hdHJpeCB0ZW1wbGF0ZSBjbGFzcy4KK1ZlY3RvcnMgYXJlIGp1c3QgYSBzcGVjaWFsIGNhc2Ugb2YgbWF0cmljZXMsIHdpdGggZWl0aGVyIDEgcm93IG9yIDEgY29sdW1uLgorCitcc2VjdGlvbiBUdXRvcmlhbE1hdHJpeEZpcnN0M1BhcmFtcyBUaGUgZmlyc3QgdGhyZWUgdGVtcGxhdGUgcGFyYW1ldGVycyBvZiBNYXRyaXgKKworVGhlIE1hdHJpeCBjbGFzcyB0YWtlcyBzaXggdGVtcGxhdGUgcGFyYW1ldGVycywgYnV0IGZvciBub3cgaXQncyBlbm91Z2ggdG8KK2xlYXJuIGFib3V0IHRoZSBmaXJzdCB0aHJlZSBmaXJzdCBwYXJhbWV0ZXJzLiBUaGUgdGhyZWUgcmVtYWluaW5nIHBhcmFtZXRlcnMgaGF2ZSBkZWZhdWx0Cit2YWx1ZXMsIHdoaWNoIGZvciBub3cgd2Ugd2lsbCBsZWF2ZSB1bnRvdWNoZWQsIGFuZCB3aGljaCB3ZQorXHJlZiBUdXRvcmlhbE1hdHJpeE9wdFRlbXBsUGFyYW1zICJkaXNjdXNzIGJlbG93Ii4KKworVGhlIHRocmVlIG1hbmRhdG9yeSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIG9mIE1hdHJpeCBhcmU6CitcY29kZQorTWF0cml4PHR5cGVuYW1lIFNjYWxhciwgaW50IFJvd3NBdENvbXBpbGVUaW1lLCBpbnQgQ29sc0F0Q29tcGlsZVRpbWU+CitcZW5kY29kZQorXGxpIFxjIFNjYWxhciBpcyB0aGUgc2NhbGFyIHR5cGUsIGkuZS4gdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cy4KKyAgICBUaGF0IGlzLCBpZiB5b3Ugd2FudCBhIG1hdHJpeCBvZiBmbG9hdHMsIGNob29zZSBcYyBmbG9hdCBoZXJlLgorICAgIFNlZSBccmVmIFRvcGljU2NhbGFyVHlwZXMgIlNjYWxhciB0eXBlcyIgZm9yIGEgbGlzdCBvZiBhbGwgc3VwcG9ydGVkCisgICAgc2NhbGFyIHR5cGVzIGFuZCBmb3IgaG93IHRvIGV4dGVuZCBzdXBwb3J0IHRvIG5ldyB0eXBlcy4KK1xsaSBcYyBSb3dzQXRDb21waWxlVGltZSBhbmQgXGMgQ29sc0F0Q29tcGlsZVRpbWUgYXJlIHRoZSBudW1iZXIgb2Ygcm93cworICAgIGFuZCBjb2x1bW5zIG9mIHRoZSBtYXRyaXggYXMga25vd24gYXQgY29tcGlsZSB0aW1lIChzZWUgCisgICAgXHJlZiBUdXRvcmlhbE1hdHJpeER5bmFtaWMgImJlbG93IiBmb3Igd2hhdCB0byBkbyBpZiB0aGUgbnVtYmVyIGlzIG5vdAorICAgIGtub3duIGF0IGNvbXBpbGUgdGltZSkuCisKK1dlIG9mZmVyIGEgbG90IG9mIGNvbnZlbmllbmNlIHR5cGVkZWZzIHRvIGNvdmVyIHRoZSB1c3VhbCBjYXNlcy4gRm9yIGV4YW1wbGUsIFxjIE1hdHJpeDRmIGlzCithIDR4NCBtYXRyaXggb2YgZmxvYXRzLiBIZXJlIGlzIGhvdyBpdCBpcyBkZWZpbmVkIGJ5IEVpZ2VuOgorXGNvZGUKK3R5cGVkZWYgTWF0cml4PGZsb2F0LCA0LCA0PiBNYXRyaXg0ZjsKK1xlbmRjb2RlCitXZSBkaXNjdXNzIFxyZWYgVHV0b3JpYWxNYXRyaXhUeXBlZGVmcyAiYmVsb3ciIHRoZXNlIGNvbnZlbmllbmNlIHR5cGVkZWZzLgorCitcc2VjdGlvbiBUdXRvcmlhbE1hdHJpeFZlY3RvcnMgVmVjdG9ycworCitBcyBtZW50aW9uZWQgYWJvdmUsIGluIEVpZ2VuLCB2ZWN0b3JzIGFyZSBqdXN0IGEgc3BlY2lhbCBjYXNlIG9mCittYXRyaWNlcywgd2l0aCBlaXRoZXIgMSByb3cgb3IgMSBjb2x1bW4uIFRoZSBjYXNlIHdoZXJlIHRoZXkgaGF2ZSAxIGNvbHVtbiBpcyB0aGUgbW9zdCBjb21tb247CitzdWNoIHZlY3RvcnMgYXJlIGNhbGxlZCBjb2x1bW4tdmVjdG9ycywgb2Z0ZW4gYWJicmV2aWF0ZWQgYXMganVzdCB2ZWN0b3JzLiBJbiB0aGUgb3RoZXIgY2FzZQord2hlcmUgdGhleSBoYXZlIDEgcm93LCB0aGV5IGFyZSBjYWxsZWQgcm93LXZlY3RvcnMuCisKK0ZvciBleGFtcGxlLCB0aGUgY29udmVuaWVuY2UgdHlwZWRlZiBcYyBWZWN0b3IzZiBpcyBhIChjb2x1bW4pIHZlY3RvciBvZiAzIGZsb2F0cy4gSXQgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIGJ5IEVpZ2VuOgorXGNvZGUKK3R5cGVkZWYgTWF0cml4PGZsb2F0LCAzLCAxPiBWZWN0b3IzZjsKK1xlbmRjb2RlCitXZSBhbHNvIG9mZmVyIGNvbnZlbmllbmNlIHR5cGVkZWZzIGZvciByb3ctdmVjdG9ycywgZm9yIGV4YW1wbGU6CitcY29kZQordHlwZWRlZiBNYXRyaXg8aW50LCAxLCAyPiBSb3dWZWN0b3IyaTsKK1xlbmRjb2RlCisKK1xzZWN0aW9uIFR1dG9yaWFsTWF0cml4RHluYW1pYyBUaGUgc3BlY2lhbCB2YWx1ZSBEeW5hbWljCisKK09mIGNvdXJzZSwgRWlnZW4gaXMgbm90IGxpbWl0ZWQgdG8gbWF0cmljZXMgd2hvc2UgZGltZW5zaW9ucyBhcmUga25vd24gYXQgY29tcGlsZSB0aW1lLgorVGhlIFxjIFJvd3NBdENvbXBpbGVUaW1lIGFuZCBcYyBDb2xzQXRDb21waWxlVGltZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGNhbiB0YWtlIHRoZSBzcGVjaWFsCit2YWx1ZSBcYyBEeW5hbWljIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBzaXplIGlzIHVua25vd24gYXQgY29tcGlsZSB0aW1lLCBzbyBtdXN0CitiZSBoYW5kbGVkIGFzIGEgcnVuLXRpbWUgdmFyaWFibGUuIEluIEVpZ2VuIHRlcm1pbm9sb2d5LCBzdWNoIGEgc2l6ZSBpcyByZWZlcnJlZCB0byBhcyBhCitcZW0gZHluYW1pYyBcZW0gc2l6ZTsgd2hpbGUgYSBzaXplIHRoYXQgaXMga25vd24gYXQgY29tcGlsZSB0aW1lIGlzIGNhbGxlZCBhCitcZW0gZml4ZWQgXGVtIHNpemUuIEZvciBleGFtcGxlLCB0aGUgY29udmVuaWVuY2UgdHlwZWRlZiBcYyBNYXRyaXhYZCwgbWVhbmluZworYSBtYXRyaXggb2YgZG91YmxlcyB3aXRoIGR5bmFtaWMgc2l6ZSwgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorXGNvZGUKK3R5cGVkZWYgTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYz4gTWF0cml4WGQ7CitcZW5kY29kZQorQW5kIHNpbWlsYXJseSwgd2UgZGVmaW5lIGEgc2VsZi1leHBsYW5hdG9yeSB0eXBlZGVmIFxjIFZlY3RvclhpIGFzIGZvbGxvd3M6CitcY29kZQordHlwZWRlZiBNYXRyaXg8aW50LCBEeW5hbWljLCAxPiBWZWN0b3JYaTsKK1xlbmRjb2RlCitZb3UgY2FuIHBlcmZlY3RseSBoYXZlIGUuZy4gYSBmaXhlZCBudW1iZXIgb2Ygcm93cyB3aXRoIGEgZHluYW1pYyBudW1iZXIgb2YgY29sdW1ucywgYXMgaW46CitcY29kZQorTWF0cml4PGZsb2F0LCAzLCBEeW5hbWljPgorXGVuZGNvZGUKKworXHNlY3Rpb24gVHV0b3JpYWxNYXRyaXhDb25zdHJ1Y3RvcnMgQ29uc3RydWN0b3JzCisKK0EgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBhbHdheXMgYXZhaWxhYmxlLCBuZXZlciBwZXJmb3JtcyBhbnkgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiwgYW5kIG5ldmVyIGluaXRpYWxpemVzIHRoZSBtYXRyaXggY29lZmZpY2llbnRzLiBZb3UgY2FuIGRvOgorXGNvZGUKK01hdHJpeDNmIGE7CitNYXRyaXhYZiBiOworXGVuZGNvZGUKK0hlcmUsCitcbGkgXGMgYSBpcyBhIDN4MyBtYXRyaXgsIHdpdGggYSBzdGF0aWMgZmxvYXRbOV0gYXJyYXkgb2YgdW5pbml0aWFsaXplZCBjb2VmZmljaWVudHMsCitcbGkgXGMgYiBpcyBhIGR5bmFtaWMtc2l6ZSBtYXRyaXggd2hvc2Ugc2l6ZSBpcyBjdXJyZW50bHkgMHgwLCBhbmQgd2hvc2UgYXJyYXkgb2YKK2NvZWZmaWNpZW50cyBoYXNuJ3QgeWV0IGJlZW4gYWxsb2NhdGVkIGF0IGFsbC4KKworQ29uc3RydWN0b3JzIHRha2luZyBzaXplcyBhcmUgYWxzbyBhdmFpbGFibGUuIEZvciBtYXRyaWNlcywgdGhlIG51bWJlciBvZiByb3dzIGlzIGFsd2F5cyBwYXNzZWQgZmlyc3QuCitGb3IgdmVjdG9ycywganVzdCBwYXNzIHRoZSB2ZWN0b3Igc2l6ZS4gVGhleSBhbGxvY2F0ZSB0aGUgYXJyYXkgb2YgY29lZmZpY2llbnRzCit3aXRoIHRoZSBnaXZlbiBzaXplLCBidXQgZG9uJ3QgaW5pdGlhbGl6ZSB0aGUgY29lZmZpY2llbnRzIHRoZW1zZWx2ZXM6CitcY29kZQorTWF0cml4WGYgYSgxMCwxNSk7CitWZWN0b3JYZiBiKDMwKTsKK1xlbmRjb2RlCitIZXJlLAorXGxpIFxjIGEgaXMgYSAxMHgxNSBkeW5hbWljLXNpemUgbWF0cml4LCB3aXRoIGFsbG9jYXRlZCBidXQgY3VycmVudGx5IHVuaW5pdGlhbGl6ZWQgY29lZmZpY2llbnRzLgorXGxpIFxjIGIgaXMgYSBkeW5hbWljLXNpemUgdmVjdG9yIG9mIHNpemUgMzAsIHdpdGggYWxsb2NhdGVkIGJ1dCBjdXJyZW50bHkgdW5pbml0aWFsaXplZCBjb2VmZmljaWVudHMuCisKK0luIG9yZGVyIHRvIG9mZmVyIGEgdW5pZm9ybSBBUEkgYWNyb3NzIGZpeGVkLXNpemUgYW5kIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcywgaXQgaXMgbGVnYWwgdG8gdXNlIHRoZXNlCitjb25zdHJ1Y3RvcnMgb24gZml4ZWQtc2l6ZSBtYXRyaWNlcywgZXZlbiBpZiBwYXNzaW5nIHRoZSBzaXplcyBpcyB1c2VsZXNzIGluIHRoaXMgY2FzZS4gU28gdGhpcyBpcyBsZWdhbDoKK1xjb2RlCitNYXRyaXgzZiBhKDMsMyk7CitcZW5kY29kZQorYW5kIGlzIGEgbm8tb3BlcmF0aW9uLgorCitGaW5hbGx5LCB3ZSBhbHNvIG9mZmVyIHNvbWUgY29uc3RydWN0b3JzIHRvIGluaXRpYWxpemUgdGhlIGNvZWZmaWNpZW50cyBvZiBzbWFsbCBmaXhlZC1zaXplIHZlY3RvcnMgdXAgdG8gc2l6ZSA0OgorXGNvZGUKK1ZlY3RvcjJkIGEoNS4wLCA2LjApOworVmVjdG9yM2QgYig1LjAsIDYuMCwgNy4wKTsKK1ZlY3RvcjRkIGMoNS4wLCA2LjAsIDcuMCwgOC4wKTsKK1xlbmRjb2RlCisKK1xzZWN0aW9uIFR1dG9yaWFsTWF0cml4Q29lZmZBY2Nlc3NvcnMgQ29lZmZpY2llbnQgYWNjZXNzb3JzCisKK1RoZSBwcmltYXJ5IGNvZWZmaWNpZW50IGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgaW4gRWlnZW4gYXJlIHRoZSBvdmVybG9hZGVkIHBhcmVudGhlc2lzIG9wZXJhdG9ycy4KK0ZvciBtYXRyaWNlcywgdGhlIHJvdyBpbmRleCBpcyBhbHdheXMgcGFzc2VkIGZpcnN0LiBGb3IgdmVjdG9ycywganVzdCBwYXNzIG9uZSBpbmRleC4KK1RoZSBudW1iZXJpbmcgc3RhcnRzIGF0IDAuIFRoaXMgZXhhbXBsZSBpcyBzZWxmLWV4cGxhbmF0b3J5OgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X21hdHJpeF9jb2VmZmljaWVudF9hY2Nlc3NvcnMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9tYXRyaXhfY29lZmZpY2llbnRfYWNjZXNzb3JzLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK05vdGUgdGhhdCB0aGUgc3ludGF4IDx0dD4gbShpbmRleCkgPC90dD4KK2lzIG5vdCByZXN0cmljdGVkIHRvIHZlY3RvcnMsIGl0IGlzIGFsc28gYXZhaWxhYmxlIGZvciBnZW5lcmFsIG1hdHJpY2VzLCBtZWFuaW5nIGluZGV4LWJhc2VkIGFjY2VzcworaW4gdGhlIGFycmF5IG9mIGNvZWZmaWNpZW50cy4gVGhpcyBob3dldmVyIGRlcGVuZHMgb24gdGhlIG1hdHJpeCdzIHN0b3JhZ2Ugb3JkZXIuIEFsbCBFaWdlbiBtYXRyaWNlcyBkZWZhdWx0IHRvCitjb2x1bW4tbWFqb3Igc3RvcmFnZSBvcmRlciwgYnV0IHRoaXMgY2FuIGJlIGNoYW5nZWQgdG8gcm93LW1ham9yLCBzZWUgXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnMgIlN0b3JhZ2Ugb3JkZXJzIi4KKworVGhlIG9wZXJhdG9yW10gaXMgYWxzbyBvdmVybG9hZGVkIGZvciBpbmRleC1iYXNlZCBhY2Nlc3MgaW4gdmVjdG9ycywgYnV0IGtlZXAgaW4gbWluZCB0aGF0IEMrKyBkb2Vzbid0IGFsbG93IG9wZXJhdG9yW10gdG8KK3Rha2UgbW9yZSB0aGFuIG9uZSBhcmd1bWVudC4gV2UgcmVzdHJpY3Qgb3BlcmF0b3JbXSB0byB2ZWN0b3JzLCBiZWNhdXNlIGFuIGF3a3dhcmRuZXNzIGluIHRoZSBDKysgbGFuZ3VhZ2UKK3dvdWxkIG1ha2UgbWF0cml4W2ksal0gY29tcGlsZSB0byB0aGUgc2FtZSB0aGluZyBhcyBtYXRyaXhbal0gIQorCitcc2VjdGlvbiBUdXRvcmlhbE1hdHJpeENvbW1hSW5pdGlhbGl6ZXIgQ29tbWEtaW5pdGlhbGl6YXRpb24KKworJU1hdHJpeCBhbmQgdmVjdG9yIGNvZWZmaWNpZW50cyBjYW4gYmUgY29udmVuaWVudGx5IHNldCB1c2luZyB0aGUgc28tY2FsbGVkIFxlbSBjb21tYS1pbml0aWFsaXplciBzeW50YXguCitGb3Igbm93LCBpdCBpcyBlbm91Z2ggdG8ga25vdyB0aGlzIGV4YW1wbGU6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKzx0ZD5caW5jbHVkZSBUdXRvcmlhbF9jb21tYWluaXRfMDEuY3BwIDwvdGQ+Cis8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsX2NvbW1haW5pdF8wMS5vdXQgPC90ZD4KKzwvdHI+PC90YWJsZT4KKworCitUaGUgcmlnaHQtaGFuZCBzaWRlIGNhbiBhbHNvIGNvbnRhaW4gbWF0cml4IGV4cHJlc3Npb25zIGFzIGRpc2N1c3NlZCBpbiBccmVmIFR1dG9yaWFsQWR2YW5jZWRJbml0aWFsaXphdGlvbiAidGhpcyBwYWdlIi4KKworXHNlY3Rpb24gVHV0b3JpYWxNYXRyaXhTaXplc1Jlc2l6aW5nIFJlc2l6aW5nCisKK1RoZSBjdXJyZW50IHNpemUgb2YgYSBtYXRyaXggY2FuIGJlIHJldHJpZXZlZCBieSBcbGluayBFaWdlbkJhc2U6OnJvd3MoKSByb3dzKClcZW5kbGluaywgXGxpbmsgRWlnZW5CYXNlOjpjb2xzKCkgY29scygpIFxlbmRsaW5rIGFuZCBcbGluayBFaWdlbkJhc2U6OnNpemUoKSBzaXplKClcZW5kbGluay4gVGhlc2UgbWV0aG9kcyByZXR1cm4gdGhlIG51bWJlciBvZiByb3dzLCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzLCByZXNwZWN0aXZlbHkuIFJlc2l6aW5nIGEgZHluYW1pYy1zaXplIG1hdHJpeCBpcyBkb25lIGJ5IHRoZSBcbGluayBQbGFpbk9iamVjdEJhc2U6OnJlc2l6ZShJbmRleCxJbmRleCkgcmVzaXplKCkgXGVuZGxpbmsgbWV0aG9kLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+Cis8dGQ+XGluY2x1ZGUgdHV0X21hdHJpeF9yZXNpemUuY3BwIDwvdGQ+Cis8dGQ+XHZlcmJpbmNsdWRlIHR1dF9tYXRyaXhfcmVzaXplLm91dCA8L3RkPgorPC90cj48L3RhYmxlPgorCitUaGUgcmVzaXplKCkgbWV0aG9kIGlzIGEgbm8tb3BlcmF0aW9uIGlmIHRoZSBhY3R1YWwgbWF0cml4IHNpemUgZG9lc24ndCBjaGFuZ2U7IG90aGVyd2lzZSBpdCBpcyBkZXN0cnVjdGl2ZTogdGhlIHZhbHVlcyBvZiB0aGUgY29lZmZpY2llbnRzIG1heSBjaGFuZ2UuCitJZiB5b3Ugd2FudCBhIGNvbnNlcnZhdGl2ZSB2YXJpYW50IG9mIHJlc2l6ZSgpIHdoaWNoIGRvZXMgbm90IGNoYW5nZSB0aGUgY29lZmZpY2llbnRzLCB1c2UgXGxpbmsgUGxhaW5PYmplY3RCYXNlOjpjb25zZXJ2YXRpdmVSZXNpemUoKSBjb25zZXJ2YXRpdmVSZXNpemUoKVxlbmRsaW5rLCBzZWUgXHJlZiBUb3BpY1Jlc2l6aW5nICJ0aGlzIHBhZ2UiIGZvciBtb3JlIGRldGFpbHMuCisKK0FsbCB0aGVzZSBtZXRob2RzIGFyZSBzdGlsbCBhdmFpbGFibGUgb24gZml4ZWQtc2l6ZSBtYXRyaWNlcywgZm9yIHRoZSBzYWtlIG9mIEFQSSB1bmlmb3JtaXR5LiBPZiBjb3Vyc2UsIHlvdSBjYW4ndCBhY3R1YWxseQorcmVzaXplIGEgZml4ZWQtc2l6ZSBtYXRyaXguIFRyeWluZyB0byBjaGFuZ2UgYSBmaXhlZCBzaXplIHRvIGFuIGFjdHVhbGx5IGRpZmZlcmVudCB2YWx1ZSB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0aW9uIGZhaWx1cmU7CitidXQgdGhlIGZvbGxvd2luZyBjb2RlIGlzIGxlZ2FsOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+Cis8dGQ+XGluY2x1ZGUgdHV0X21hdHJpeF9yZXNpemVfZml4ZWRfc2l6ZS5jcHAgPC90ZD4KKzx0ZD5cdmVyYmluY2x1ZGUgdHV0X21hdHJpeF9yZXNpemVfZml4ZWRfc2l6ZS5vdXQgPC90ZD4KKzwvdHI+PC90YWJsZT4KKworCitcc2VjdGlvbiBUdXRvcmlhbE1hdHJpeEFzc2lnbm1lbnQgQXNzaWdubWVudCBhbmQgcmVzaXppbmcKKworQXNzaWdubWVudCBpcyB0aGUgYWN0aW9uIG9mIGNvcHlpbmcgYSBtYXRyaXggaW50byBhbm90aGVyLCB1c2luZyBcYyBvcGVyYXRvcj0uIEVpZ2VuIHJlc2l6ZXMgdGhlIG1hdHJpeCBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgYXV0b21hdGljYWxseSBzbyB0aGF0IGl0IG1hdGNoZXMgdGhlIHNpemUgb2YgdGhlIG1hdHJpeCBvbiB0aGUgcmlnaHQtaGFuZCBzaXplLiBGb3IgZXhhbXBsZToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorPHRkPlxpbmNsdWRlIHR1dF9tYXRyaXhfYXNzaWdubWVudF9yZXNpemluZy5jcHAgPC90ZD4KKzx0ZD5cdmVyYmluY2x1ZGUgdHV0X21hdHJpeF9hc3NpZ25tZW50X3Jlc2l6aW5nLm91dCA8L3RkPgorPC90cj48L3RhYmxlPgorCitPZiBjb3Vyc2UsIGlmIHRoZSBsZWZ0LWhhbmQgc2lkZSBpcyBvZiBmaXhlZCBzaXplLCByZXNpemluZyBpdCBpcyBub3QgYWxsb3dlZC4KKworSWYgeW91IGRvIG5vdCB3YW50IHRoaXMgYXV0b21hdGljIHJlc2l6aW5nIHRvIGhhcHBlbiAoZm9yIGV4YW1wbGUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyksIHlvdSBjYW4gZGlzYWJsZSBpdCwgc2VlCitccmVmIFRvcGljUmVzaXppbmcgInRoaXMgcGFnZSIuCisKKworXHNlY3Rpb24gVHV0b3JpYWxNYXRyaXhGaXhlZFZzRHluYW1pYyBGaXhlZCB2cy4gRHluYW1pYyBzaXplCisKK1doZW4gc2hvdWxkIG9uZSB1c2UgZml4ZWQgc2l6ZXMgKGUuZy4gXGMgTWF0cml4NGYpLCBhbmQgd2hlbiBzaG91bGQgb25lIHByZWZlciBkeW5hbWljIHNpemVzIChlLmcuIFxjIE1hdHJpeFhmKT8KK1RoZSBzaW1wbGUgYW5zd2VyIGlzOiB1c2UgZml4ZWQKK3NpemVzIGZvciB2ZXJ5IHNtYWxsIHNpemVzIHdoZXJlIHlvdSBjYW4sIGFuZCB1c2UgZHluYW1pYyBzaXplcyBmb3IgbGFyZ2VyIHNpemVzIG9yIHdoZXJlIHlvdSBoYXZlIHRvLiBGb3Igc21hbGwgc2l6ZXMsCitlc3BlY2lhbGx5IGZvciBzaXplcyBzbWFsbGVyIHRoYW4gKHJvdWdobHkpIDE2LCB1c2luZyBmaXhlZCBzaXplcyBpcyBodWdlbHkgYmVuZWZpY2lhbAordG8gcGVyZm9ybWFuY2UsIGFzIGl0IGFsbG93cyBFaWdlbiB0byBhdm9pZCBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB0byB1bnJvbGwKK2xvb3BzLiBJbnRlcm5hbGx5LCBhIGZpeGVkLXNpemUgRWlnZW4gbWF0cml4IGlzIGp1c3QgYSBwbGFpbiBzdGF0aWMgYXJyYXksIGkuZS4gZG9pbmcKK1xjb2RlIE1hdHJpeDRmIG15bWF0cml4OyBcZW5kY29kZQorcmVhbGx5IGFtb3VudHMgdG8ganVzdCBkb2luZworXGNvZGUgZmxvYXQgbXltYXRyaXhbMTZdOyBcZW5kY29kZQorc28gdGhpcyByZWFsbHkgaGFzIHplcm8gcnVudGltZSBjb3N0LiBCeSBjb250cmFzdCwgdGhlIGFycmF5IG9mIGEgZHluYW1pYy1zaXplIG1hdHJpeAoraXMgYWx3YXlzIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCwgc28gZG9pbmcKK1xjb2RlIE1hdHJpeFhmIG15bWF0cml4KHJvd3MsY29sdW1ucyk7IFxlbmRjb2RlCithbW91bnRzIHRvIGRvaW5nCitcY29kZSBmbG9hdCAqbXltYXRyaXggPSBuZXcgZmxvYXRbcm93cypjb2x1bW5zXTsgXGVuZGNvZGUKK2FuZCBpbiBhZGRpdGlvbiB0byB0aGF0LCB0aGUgTWF0cml4WGYgb2JqZWN0IHN0b3JlcyBpdHMgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgYXMKK21lbWJlciB2YXJpYWJsZXMuCisKK1RoZSBsaW1pdGF0aW9uIG9mIHVzaW5nIGZpeGVkIHNpemVzLCBvZiBjb3Vyc2UsIGlzIHRoYXQgdGhpcyBpcyBvbmx5IHBvc3NpYmxlCit3aGVuIHlvdSBrbm93IHRoZSBzaXplcyBhdCBjb21waWxlIHRpbWUuIEFsc28sIGZvciBsYXJnZSBlbm91Z2ggc2l6ZXMsIHNheSBmb3Igc2l6ZXMKK2dyZWF0ZXIgdGhhbiAocm91Z2hseSkgMzIsIHRoZSBwZXJmb3JtYW5jZSBiZW5lZml0IG9mIHVzaW5nIGZpeGVkIHNpemVzIGJlY29tZXMgbmVnbGlnaWJsZS4KK1dvcnNlLCB0cnlpbmcgdG8gY3JlYXRlIGEgdmVyeSBsYXJnZSBtYXRyaXggdXNpbmcgZml4ZWQgc2l6ZXMgY291bGQgcmVzdWx0IGluIGEgc3RhY2sgb3ZlcmZsb3csCitzaW5jZSBFaWdlbiB3aWxsIHRyeSB0byBhbGxvY2F0ZSB0aGUgYXJyYXkgYXMgYSBzdGF0aWMgYXJyYXksIHdoaWNoIGJ5IGRlZmF1bHQgZ29lcyBvbiB0aGUgc3RhY2suCitGaW5hbGx5LCBkZXBlbmRpbmcgb24gY2lyY3Vtc3RhbmNlcywgRWlnZW4gY2FuIGFsc28gYmUgbW9yZSBhZ2dyZXNzaXZlIHRyeWluZyB0byB2ZWN0b3JpemUKKyh1c2UgU0lNRCBpbnN0cnVjdGlvbnMpIHdoZW4gZHluYW1pYyBzaXplcyBhcmUgdXNlZCwgc2VlIFxyZWYgVG9waWNWZWN0b3JpemF0aW9uICJWZWN0b3JpemF0aW9uIi4KKworXHNlY3Rpb24gVHV0b3JpYWxNYXRyaXhPcHRUZW1wbFBhcmFtcyBPcHRpb25hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCisKK1dlIG1lbnRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgcGFnZSB0aGF0IHRoZSBNYXRyaXggY2xhc3MgdGFrZXMgc2l4IHRlbXBsYXRlIHBhcmFtZXRlcnMsCitidXQgc28gZmFyIHdlIG9ubHkgZGlzY3Vzc2VkIHRoZSBmaXJzdCB0aHJlZS4gVGhlIHJlbWFpbmluZyB0aHJlZSBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbC4gSGVyZSBpcwordGhlIGNvbXBsZXRlIGxpc3Qgb2YgdGVtcGxhdGUgcGFyYW1ldGVyczoKK1xjb2RlCitNYXRyaXg8dHlwZW5hbWUgU2NhbGFyLAorICAgICAgIGludCBSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICBpbnQgQ29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgaW50IE9wdGlvbnMgPSAwLAorICAgICAgIGludCBNYXhSb3dzQXRDb21waWxlVGltZSA9IFJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgIGludCBNYXhDb2xzQXRDb21waWxlVGltZSA9IENvbHNBdENvbXBpbGVUaW1lPgorXGVuZGNvZGUKK1xsaSBcYyBPcHRpb25zIGlzIGEgYml0IGZpZWxkLiBIZXJlLCB3ZSBkaXNjdXNzIG9ubHkgb25lIGJpdDogXGMgUm93TWFqb3IuIEl0IHNwZWNpZmllcyB0aGF0IHRoZSBtYXRyaWNlcworICAgICAgb2YgdGhpcyB0eXBlIHVzZSByb3ctbWFqb3Igc3RvcmFnZSBvcmRlcjsgYnkgZGVmYXVsdCwgdGhlIHN0b3JhZ2Ugb3JkZXIgaXMgY29sdW1uLW1ham9yLiBTZWUgdGhlIHBhZ2Ugb24KKyAgICAgIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzICJzdG9yYWdlIG9yZGVycyIuIEZvciBleGFtcGxlLCB0aGlzIHR5cGUgbWVhbnMgcm93LW1ham9yIDN4MyBtYXRyaWNlczoKKyAgICAgIFxjb2RlCisgICAgICBNYXRyaXg8ZmxvYXQsIDMsIDMsIFJvd01ham9yPgorICAgICAgXGVuZGNvZGUKK1xsaSBcYyBNYXhSb3dzQXRDb21waWxlVGltZSBhbmQgXGMgTWF4Q29sc0F0Q29tcGlsZVRpbWUgYXJlIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhhdCwgZXZlbiB0aG91Z2gKKyAgICAgIHRoZSBleGFjdCBzaXplcyBvZiB5b3VyIG1hdHJpY2VzIGFyZSBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLCBhIGZpeGVkIHVwcGVyIGJvdW5kIGlzIGtub3duIGF0CisgICAgICBjb21waWxlIHRpbWUuIFRoZSBiaWdnZXN0IHJlYXNvbiB3aHkgeW91IG1pZ2h0IHdhbnQgdG8gZG8gdGhhdCBpcyB0byBhdm9pZCBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgICAgRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBtYXRyaXggdHlwZSB1c2VzIGEgc3RhdGljIGFycmF5IG9mIDEyIGZsb2F0cywgd2l0aG91dCBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uOgorICAgICAgXGNvZGUKKyAgICAgIE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgMCwgMywgND4KKyAgICAgIFxlbmRjb2RlCisKK1xzZWN0aW9uIFR1dG9yaWFsTWF0cml4VHlwZWRlZnMgQ29udmVuaWVuY2UgdHlwZWRlZnMKKworRWlnZW4gZGVmaW5lcyB0aGUgZm9sbG93aW5nIE1hdHJpeCB0eXBlZGVmczoKK1xsaSBNYXRyaXhOdCBmb3IgTWF0cml4PHR5cGUsIE4sIE4+LiBGb3IgZXhhbXBsZSwgTWF0cml4WGkgZm9yIE1hdHJpeDxpbnQsIER5bmFtaWMsIER5bmFtaWM+LgorXGxpIFZlY3Rvck50IGZvciBNYXRyaXg8dHlwZSwgTiwgMT4uIEZvciBleGFtcGxlLCBWZWN0b3IyZiBmb3IgTWF0cml4PGZsb2F0LCAyLCAxPi4KK1xsaSBSb3dWZWN0b3JOdCBmb3IgTWF0cml4PHR5cGUsIDEsIE4+LiBGb3IgZXhhbXBsZSwgUm93VmVjdG9yM2QgZm9yIE1hdHJpeDxkb3VibGUsIDEsIDM+LgorCitXaGVyZToKK1xsaSBOIGNhbiBiZSBhbnkgb25lIG9mIFxjIDIsIFxjIDMsIFxjIDQsIG9yIFxjIFggKG1lYW5pbmcgXGMgRHluYW1pYykuCitcbGkgdCBjYW4gYmUgYW55IG9uZSBvZiBcYyBpIChtZWFuaW5nIGludCksIFxjIGYgKG1lYW5pbmcgZmxvYXQpLCBcYyBkIChtZWFuaW5nIGRvdWJsZSksCisgICAgICBcYyBjZiAobWVhbmluZyBjb21wbGV4PGZsb2F0PiksIG9yIFxjIGNkIChtZWFuaW5nIGNvbXBsZXg8ZG91YmxlPikuIFRoZSBmYWN0IHRoYXQgdHlwZWRlZnMgYXJlIG9ubHkKKyAgICBkZWZpbmVkIGZvciB0aGVzZSBmaXZlIHR5cGVzIGRvZXNuJ3QgbWVhbiB0aGF0IHRoZXkgYXJlIHRoZSBvbmx5IHN1cHBvcnRlZCBzY2FsYXIgdHlwZXMuIEZvciBleGFtcGxlLAorICAgIGFsbCBzdGFuZGFyZCBpbnRlZ2VyIHR5cGVzIGFyZSBzdXBwb3J0ZWQsIHNlZSBccmVmIFRvcGljU2NhbGFyVHlwZXMgIlNjYWxhciB0eXBlcyIuCisKK1xsaSBcYiBOZXh0OiBccmVmIFR1dG9yaWFsTWF0cml4QXJpdGhtZXRpYworCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvQzAyX1R1dG9yaWFsTWF0cml4QXJpdGhtZXRpYy5kb3ggYi9kb2MvQzAyX1R1dG9yaWFsTWF0cml4QXJpdGhtZXRpYy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0ODIxYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9DMDJfVHV0b3JpYWxNYXRyaXhBcml0aG1ldGljLmRveApAQCAtMCwwICsxLDIyOSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFR1dG9yaWFsTWF0cml4QXJpdGhtZXRpYyBUdXRvcmlhbCBwYWdlIDIgLSAlTWF0cml4IGFuZCB2ZWN0b3IgYXJpdGhtZXRpYworICAgIFxpbmdyb3VwIFR1dG9yaWFsCisKK1xsaSBcYiBQcmV2aW91czogXHJlZiBUdXRvcmlhbE1hdHJpeENsYXNzCitcbGkgXGIgTmV4dDogXHJlZiBUdXRvcmlhbEFycmF5Q2xhc3MKKworVGhpcyB0dXRvcmlhbCBhaW1zIHRvIHByb3ZpZGUgYW4gb3ZlcnZpZXcgYW5kIHNvbWUgZGV0YWlscyBvbiBob3cgdG8gcGVyZm9ybSBhcml0aG1ldGljCitiZXR3ZWVuIG1hdHJpY2VzLCB2ZWN0b3JzIGFuZCBzY2FsYXJzIHdpdGggRWlnZW4uCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzCisgIC0gXHJlZiBUdXRvcmlhbEFyaXRobWV0aWNJbnRyb2R1Y3Rpb24KKyAgLSBccmVmIFR1dG9yaWFsQXJpdGhtZXRpY0FkZFN1YgorICAtIFxyZWYgVHV0b3JpYWxBcml0aG1ldGljU2NhbGFyTXVsRGl2CisgIC0gXHJlZiBUdXRvcmlhbEFyaXRobWV0aWNNZW50aW9uWHByVGVtcGxhdGVzCisgIC0gXHJlZiBUdXRvcmlhbEFyaXRobWV0aWNUcmFuc3Bvc2UKKyAgLSBccmVmIFR1dG9yaWFsQXJpdGhtZXRpY01hdHJpeE11bAorICAtIFxyZWYgVHV0b3JpYWxBcml0aG1ldGljRG90QW5kQ3Jvc3MKKyAgLSBccmVmIFR1dG9yaWFsQXJpdGhtZXRpY1JlZHV4CisgIC0gXHJlZiBUdXRvcmlhbEFyaXRobWV0aWNWYWxpZGl0eQorCitcc2VjdGlvbiBUdXRvcmlhbEFyaXRobWV0aWNJbnRyb2R1Y3Rpb24gSW50cm9kdWN0aW9uCisKK0VpZ2VuIG9mZmVycyBtYXRyaXgvdmVjdG9yIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBlaXRoZXIgdGhyb3VnaCBvdmVybG9hZHMgb2YgY29tbW9uIEMrKyBhcml0aG1ldGljIG9wZXJhdG9ycyBzdWNoIGFzICssIC0sICosCitvciB0aHJvdWdoIHNwZWNpYWwgbWV0aG9kcyBzdWNoIGFzIGRvdCgpLCBjcm9zcygpLCBldGMuCitGb3IgdGhlIE1hdHJpeCBjbGFzcyAobWF0cmljZXMgYW5kIHZlY3RvcnMpLCBvcGVyYXRvcnMgYXJlIG9ubHkgb3ZlcmxvYWRlZCB0byBzdXBwb3J0CitsaW5lYXItYWxnZWJyYWljIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCBcYyBtYXRyaXgxIFxjICogXGMgbWF0cml4MiBtZWFucyBtYXRyaXgtbWF0cml4IHByb2R1Y3QsCithbmQgXGMgdmVjdG9yIFxjICsgXGMgc2NhbGFyIGlzIGp1c3Qgbm90IGFsbG93ZWQuIElmIHlvdSB3YW50IHRvIHBlcmZvcm0gYWxsIGtpbmRzIG9mIGFycmF5IG9wZXJhdGlvbnMsCitub3QgbGluZWFyIGFsZ2VicmEsIHNlZSB0aGUgXHJlZiBUdXRvcmlhbEFycmF5Q2xhc3MgIm5leHQgcGFnZSIuCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJpdGhtZXRpY0FkZFN1YiBBZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24KKworVGhlIGxlZnQgaGFuZCBzaWRlIGFuZCByaWdodCBoYW5kIHNpZGUgbXVzdCwgb2YgY291cnNlLCBoYXZlIHRoZSBzYW1lIG51bWJlcnMgb2Ygcm93cyBhbmQgb2YgY29sdW1ucy4gVGhleSBtdXN0CithbHNvIGhhdmUgdGhlIHNhbWUgXGMgU2NhbGFyIHR5cGUsIGFzIEVpZ2VuIGRvZXNuJ3QgZG8gYXV0b21hdGljIHR5cGUgcHJvbW90aW9uLiBUaGUgb3BlcmF0b3JzIGF0IGhhbmQgaGVyZSBhcmU6CitcbGkgYmluYXJ5IG9wZXJhdG9yICsgYXMgaW4gXGMgYStiCitcbGkgYmluYXJ5IG9wZXJhdG9yIC0gYXMgaW4gXGMgYS1iCitcbGkgdW5hcnkgb3BlcmF0b3IgLSBhcyBpbiBcYyAtYQorXGxpIGNvbXBvdW5kIG9wZXJhdG9yICs9IGFzIGluIFxjIGErPWIKK1xsaSBjb21wb3VuZCBvcGVyYXRvciAtPSBhcyBpbiBcYyBhLT1iCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSB0dXRfYXJpdGhtZXRpY19hZGRfc3ViLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSB0dXRfYXJpdGhtZXRpY19hZGRfc3ViLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1xzZWN0aW9uIFR1dG9yaWFsQXJpdGhtZXRpY1NjYWxhck11bERpdiBTY2FsYXIgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uCisKK011bHRpcGxpY2F0aW9uIGFuZCBkaXZpc2lvbiBieSBhIHNjYWxhciBpcyB2ZXJ5IHNpbXBsZSB0b28uIFRoZSBvcGVyYXRvcnMgYXQgaGFuZCBoZXJlIGFyZToKK1xsaSBiaW5hcnkgb3BlcmF0b3IgKiBhcyBpbiBcYyBtYXRyaXgqc2NhbGFyCitcbGkgYmluYXJ5IG9wZXJhdG9yICogYXMgaW4gXGMgc2NhbGFyKm1hdHJpeAorXGxpIGJpbmFyeSBvcGVyYXRvciAvIGFzIGluIFxjIG1hdHJpeC9zY2FsYXIKK1xsaSBjb21wb3VuZCBvcGVyYXRvciAqPSBhcyBpbiBcYyBtYXRyaXgqPXNjYWxhcgorXGxpIGNvbXBvdW5kIG9wZXJhdG9yIC89IGFzIGluIFxjIG1hdHJpeC89c2NhbGFyCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSB0dXRfYXJpdGhtZXRpY19zY2FsYXJfbXVsX2Rpdi5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgdHV0X2FyaXRobWV0aWNfc2NhbGFyX211bF9kaXYub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworCitcc2VjdGlvbiBUdXRvcmlhbEFyaXRobWV0aWNNZW50aW9uWHByVGVtcGxhdGVzIEEgbm90ZSBhYm91dCBleHByZXNzaW9uIHRlbXBsYXRlcworCitUaGlzIGlzIGFuIGFkdmFuY2VkIHRvcGljIHRoYXQgd2UgZXhwbGFpbiBvbiBccmVmIFRvcGljRWlnZW5FeHByZXNzaW9uVGVtcGxhdGVzICJ0aGlzIHBhZ2UiLAorYnV0IGl0IGlzIHVzZWZ1bCB0byBqdXN0IG1lbnRpb24gaXQgbm93LiBJbiBFaWdlbiwgYXJpdGhtZXRpYyBvcGVyYXRvcnMgc3VjaCBhcyBcYyBvcGVyYXRvcisgZG9uJ3QKK3BlcmZvcm0gYW55IGNvbXB1dGF0aW9uIGJ5IHRoZW1zZWx2ZXMsIHRoZXkganVzdCByZXR1cm4gYW4gImV4cHJlc3Npb24gb2JqZWN0IiBkZXNjcmliaW5nIHRoZSBjb21wdXRhdGlvbiB0byBiZQorcGVyZm9ybWVkLiBUaGUgYWN0dWFsIGNvbXB1dGF0aW9uIGhhcHBlbnMgbGF0ZXIsIHdoZW4gdGhlIHdob2xlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCB0eXBpY2FsbHkgaW4gXGMgb3BlcmF0b3I9LgorV2hpbGUgdGhpcyBtaWdodCBzb3VuZCBoZWF2eSwgYW55IG1vZGVybiBvcHRpbWl6aW5nIGNvbXBpbGVyIGlzIGFibGUgdG8gb3B0aW1pemUgYXdheSB0aGF0IGFic3RyYWN0aW9uIGFuZAordGhlIHJlc3VsdCBpcyBwZXJmZWN0bHkgb3B0aW1pemVkIGNvZGUuIEZvciBleGFtcGxlLCB3aGVuIHlvdSBkbzoKK1xjb2RlCitWZWN0b3JYZiBhKDUwKSwgYig1MCksIGMoNTApLCBkKDUwKTsKKy4uLgorYSA9IDMqYiArIDQqYyArIDUqZDsKK1xlbmRjb2RlCitFaWdlbiBjb21waWxlcyBpdCB0byBqdXN0IG9uZSBmb3IgbG9vcCwgc28gdGhhdCB0aGUgYXJyYXlzIGFyZSB0cmF2ZXJzZWQgb25seSBvbmNlLiBTaW1wbGlmeWluZyAoZS5nLiBpZ25vcmluZworU0lNRCBvcHRpbWl6YXRpb25zKSwgdGhpcyBsb29wIGxvb2tzIGxpa2UgdGhpczoKK1xjb2RlCitmb3IoaW50IGkgPSAwOyBpIDwgNTA7ICsraSkKKyAgYVtpXSA9IDMqYltpXSArIDQqY1tpXSArIDUqZFtpXTsKK1xlbmRjb2RlCitUaHVzLCB5b3Ugc2hvdWxkIG5vdCBiZSBhZnJhaWQgb2YgdXNpbmcgcmVsYXRpdmVseSBsYXJnZSBhcml0aG1ldGljIGV4cHJlc3Npb25zIHdpdGggRWlnZW46IGl0IG9ubHkgZ2l2ZXMgRWlnZW4KK21vcmUgb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uLgorCitcc2VjdGlvbiBUdXRvcmlhbEFyaXRobWV0aWNUcmFuc3Bvc2UgVHJhbnNwb3NpdGlvbiBhbmQgY29uanVnYXRpb24KKworVGhlIHRyYW5zcG9zZSBcZiQgYV5UIFxmJCwgY29uanVnYXRlIFxmJCBcYmFye2F9IFxmJCwgYW5kIGFkam9pbnQgKGkuZS4sIGNvbmp1Z2F0ZSB0cmFuc3Bvc2UpIFxmJCBhXiogXGYkIG9mIGEgbWF0cml4IG9yIHZlY3RvciBcZiQgYSBcZiQgYXJlIG9idGFpbmVkIGJ5IHRoZSBtZW1iZXIgZnVuY3Rpb25zIFxsaW5rIERlbnNlQmFzZTo6dHJhbnNwb3NlKCkgdHJhbnNwb3NlKClcZW5kbGluaywgXGxpbmsgTWF0cml4QmFzZTo6Y29uanVnYXRlKCkgY29uanVnYXRlKClcZW5kbGluaywgYW5kIFxsaW5rIE1hdHJpeEJhc2U6OmFkam9pbnQoKSBhZGpvaW50KClcZW5kbGluaywgcmVzcGVjdGl2ZWx5LgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2Nvbmp1Z2F0ZS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2Nvbmp1Z2F0ZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitGb3IgcmVhbCBtYXRyaWNlcywgXGMgY29uanVnYXRlKCkgaXMgYSBuby1vcGVyYXRpb24sIGFuZCBzbyBcYyBhZGpvaW50KCkgaXMgZXF1aXZhbGVudCB0byBcYyB0cmFuc3Bvc2UoKS4KKworQXMgZm9yIGJhc2ljIGFyaXRobWV0aWMgb3BlcmF0b3JzLCBcYyB0cmFuc3Bvc2UoKSBhbmQgXGMgYWRqb2ludCgpIHNpbXBseSByZXR1cm4gYSBwcm94eSBvYmplY3Qgd2l0aG91dCBkb2luZyB0aGUgYWN0dWFsIHRyYW5zcG9zaXRpb24uIElmIHlvdSBkbyA8dHQ+YiA9IGEudHJhbnNwb3NlKCk8L3R0PiwgdGhlbiB0aGUgdHJhbnNwb3NlIGlzIGV2YWx1YXRlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSByZXN1bHQgaXMgd3JpdHRlbiBpbnRvIFxjIGIuIEhvd2V2ZXIsIHRoZXJlIGlzIGEgY29tcGxpY2F0aW9uIGhlcmUuIElmIHlvdSBkbyA8dHQ+YSA9IGEudHJhbnNwb3NlKCk8L3R0PiwgdGhlbiBFaWdlbiBzdGFydHMgd3JpdGluZyB0aGUgcmVzdWx0IGludG8gXGMgYSBiZWZvcmUgdGhlIGV2YWx1YXRpb24gb2YgdGhlIHRyYW5zcG9zZSBpcyBmaW5pc2hlZC4gVGhlcmVmb3JlLCB0aGUgaW5zdHJ1Y3Rpb24gPHR0PmEgPSBhLnRyYW5zcG9zZSgpPC90dD4gZG9lcyBub3QgcmVwbGFjZSBcYyBhIHdpdGggaXRzIHRyYW5zcG9zZSwgYXMgb25lIHdvdWxkIGV4cGVjdDoKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSB0dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfYWxpYXNpbmcuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9hbGlhc2luZy5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorVGhpcyBpcyB0aGUgc28tY2FsbGVkIFxyZWYgVG9waWNBbGlhc2luZyAiYWxpYXNpbmcgaXNzdWUiLiBJbiAiZGVidWcgbW9kZSIsIGkuZS4sIHdoZW4gXHJlZiBUb3BpY0Fzc2VydGlvbnMgImFzc2VydGlvbnMiIGhhdmUgbm90IGJlZW4gZGlzYWJsZWQsIHN1Y2ggY29tbW9uIHBpdGZhbGxzIGFyZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLiAKKworRm9yIFxlbSBpbi1wbGFjZSB0cmFuc3Bvc2l0aW9uLCBhcyBmb3IgaW5zdGFuY2UgaW4gPHR0PmEgPSBhLnRyYW5zcG9zZSgpPC90dD4sIHNpbXBseSB1c2UgdGhlIFxsaW5rIERlbnNlQmFzZTo6dHJhbnNwb3NlSW5QbGFjZSgpIHRyYW5zcG9zZUluUGxhY2UoKVxlbmRsaW5rICBmdW5jdGlvbjoKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSB0dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfaW5wbGFjZS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2lucGxhY2Uub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KK1RoZXJlIGlzIGFsc28gdGhlIFxsaW5rIE1hdHJpeEJhc2U6OmFkam9pbnRJblBsYWNlKCkgYWRqb2ludEluUGxhY2UoKVxlbmRsaW5rIGZ1bmN0aW9uIGZvciBjb21wbGV4IG1hdHJpY2VzLgorCitcc2VjdGlvbiBUdXRvcmlhbEFyaXRobWV0aWNNYXRyaXhNdWwgTWF0cml4LW1hdHJpeCBhbmQgbWF0cml4LXZlY3RvciBtdWx0aXBsaWNhdGlvbgorCitNYXRyaXgtbWF0cml4IG11bHRpcGxpY2F0aW9uIGlzIGFnYWluIGRvbmUgd2l0aCBcYyBvcGVyYXRvciouIFNpbmNlIHZlY3RvcnMgYXJlIGEgc3BlY2lhbAorY2FzZSBvZiBtYXRyaWNlcywgdGhleSBhcmUgaW1wbGljaXRseSBoYW5kbGVkIHRoZXJlIHRvbywgc28gbWF0cml4LXZlY3RvciBwcm9kdWN0IGlzIHJlYWxseSBqdXN0IGEgc3BlY2lhbAorY2FzZSBvZiBtYXRyaXgtbWF0cml4IHByb2R1Y3QsIGFuZCBzbyBpcyB2ZWN0b3ItdmVjdG9yIG91dGVyIHByb2R1Y3QuIFRodXMsIGFsbCB0aGVzZSBjYXNlcyBhcmUgaGFuZGxlZCBieSBqdXN0Cit0d28gb3BlcmF0b3JzOgorXGxpIGJpbmFyeSBvcGVyYXRvciAqIGFzIGluIFxjIGEqYgorXGxpIGNvbXBvdW5kIG9wZXJhdG9yICo9IGFzIGluIFxjIGEqPWIgKHRoaXMgbXVsdGlwbGllcyBvbiB0aGUgcmlnaHQ6IFxjIGEqPWIgaXMgZXF1aXZhbGVudCB0byA8dHQ+YSA9IGEqYjwvdHQ+KQorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X2FyaXRobWV0aWNfbWF0cml4X211bC5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgdHV0X2FyaXRobWV0aWNfbWF0cml4X211bC5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitOb3RlOiBpZiB5b3UgcmVhZCB0aGUgYWJvdmUgcGFyYWdyYXBoIG9uIGV4cHJlc3Npb24gdGVtcGxhdGVzIGFuZCBhcmUgd29ycmllZCB0aGF0IGRvaW5nIFxjIG09bSptIG1pZ2h0IGNhdXNlCithbGlhc2luZyBpc3N1ZXMsIGJlIHJlYXNzdXJlZCBmb3Igbm93OiBFaWdlbiB0cmVhdHMgbWF0cml4IG11bHRpcGxpY2F0aW9uIGFzIGEgc3BlY2lhbCBjYXNlIGFuZCB0YWtlcyBjYXJlIG9mCitpbnRyb2R1Y2luZyBhIHRlbXBvcmFyeSBoZXJlLCBzbyBpdCB3aWxsIGNvbXBpbGUgXGMgbT1tKm0gYXM6CitcY29kZQordG1wID0gbSptOworbSA9IHRtcDsKK1xlbmRjb2RlCitJZiB5b3Uga25vdyB5b3VyIG1hdHJpeCBwcm9kdWN0IGNhbiBiZSBzYWZlbHkgZXZhbHVhdGVkIGludG8gdGhlIGRlc3RpbmF0aW9uIG1hdHJpeCB3aXRob3V0IGFsaWFzaW5nIGlzc3VlLCB0aGVuIHlvdSBjYW4gdXNlIHRoZSBcbGluayBNYXRyaXhCYXNlOjpub2FsaWFzKCkgbm9hbGlhcygpXGVuZGxpbmsgZnVuY3Rpb24gdG8gYXZvaWQgdGhlIHRlbXBvcmFyeSwgZS5nLjoKK1xjb2RlCitjLm5vYWxpYXMoKSArPSBhICogYjsKK1xlbmRjb2RlCitGb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgdG9waWMsIHNlZSB0aGUgcGFnZSBvbiBccmVmIFRvcGljQWxpYXNpbmcgImFsaWFzaW5nIi4KKworXGIgTm90ZTogZm9yIEJMQVMgdXNlcnMgd29ycmllZCBhYm91dCBwZXJmb3JtYW5jZSwgZXhwcmVzc2lvbnMgc3VjaCBhcyA8dHQ+Yy5ub2FsaWFzKCkgLT0gMiAqIGEuYWRqb2ludCgpICogYjs8L3R0PiBhcmUgZnVsbHkgb3B0aW1pemVkIGFuZCB0cmlnZ2VyIGEgc2luZ2xlIGdlbW0tbGlrZSBmdW5jdGlvbiBjYWxsLgorCitcc2VjdGlvbiBUdXRvcmlhbEFyaXRobWV0aWNEb3RBbmRDcm9zcyBEb3QgcHJvZHVjdCBhbmQgY3Jvc3MgcHJvZHVjdAorCitGb3IgZG90IHByb2R1Y3QgYW5kIGNyb3NzIHByb2R1Y3QsIHlvdSBuZWVkIHRoZSBcbGluayBNYXRyaXhCYXNlOjpkb3QoKSBkb3QoKVxlbmRsaW5rIGFuZCBcbGluayBNYXRyaXhCYXNlOjpjcm9zcygpIGNyb3NzKClcZW5kbGluayBtZXRob2RzLiBPZiBjb3Vyc2UsIHRoZSBkb3QgcHJvZHVjdCBjYW4gYWxzbyBiZSBvYnRhaW5lZCBhcyBhIDF4MSBtYXRyaXggYXMgdS5hZGpvaW50KCkqdi4KKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSB0dXRfYXJpdGhtZXRpY19kb3RfY3Jvc3MuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9hcml0aG1ldGljX2RvdF9jcm9zcy5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitSZW1lbWJlciB0aGF0IGNyb3NzIHByb2R1Y3QgaXMgb25seSBmb3IgdmVjdG9ycyBvZiBzaXplIDMuIERvdCBwcm9kdWN0IGlzIGZvciB2ZWN0b3JzIG9mIGFueSBzaXplcy4KK1doZW4gdXNpbmcgY29tcGxleCBudW1iZXJzLCBFaWdlbidzIGRvdCBwcm9kdWN0IGlzIGNvbmp1Z2F0ZS1saW5lYXIgaW4gdGhlIGZpcnN0IHZhcmlhYmxlIGFuZCBsaW5lYXIgaW4gdGhlCitzZWNvbmQgdmFyaWFibGUuCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJpdGhtZXRpY1JlZHV4IEJhc2ljIGFyaXRobWV0aWMgcmVkdWN0aW9uIG9wZXJhdGlvbnMKK0VpZ2VuIGFsc28gcHJvdmlkZXMgc29tZSByZWR1Y3Rpb24gb3BlcmF0aW9ucyB0byByZWR1Y2UgYSBnaXZlbiBtYXRyaXggb3IgdmVjdG9yIHRvIGEgc2luZ2xlIHZhbHVlIHN1Y2ggYXMgdGhlIHN1bSAoY29tcHV0ZWQgYnkgXGxpbmsgRGVuc2VCYXNlOjpzdW0oKSBzdW0oKVxlbmRsaW5rKSwgcHJvZHVjdCAoXGxpbmsgRGVuc2VCYXNlOjpwcm9kKCkgcHJvZCgpXGVuZGxpbmspLCBvciB0aGUgbWF4aW11bSAoXGxpbmsgRGVuc2VCYXNlOjptYXhDb2VmZigpIG1heENvZWZmKClcZW5kbGluaykgYW5kIG1pbmltdW0gKFxsaW5rIERlbnNlQmFzZTo6bWluQ29lZmYoKSBtaW5Db2VmZigpXGVuZGxpbmspIG9mIGFsbCBpdHMgY29lZmZpY2llbnRzLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X2FyaXRobWV0aWNfcmVkdXhfYmFzaWMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9hcml0aG1ldGljX3JlZHV4X2Jhc2ljLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBcZW0gdHJhY2Ugb2YgYSBtYXRyaXgsIGFzIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiBcbGluayBNYXRyaXhCYXNlOjp0cmFjZSgpIHRyYWNlKClcZW5kbGluaywgaXMgdGhlIHN1bSBvZiB0aGUgZGlhZ29uYWwgY29lZmZpY2llbnRzIGFuZCBjYW4gYWxzbyBiZSBjb21wdXRlZCBhcyBlZmZpY2llbnRseSB1c2luZyA8dHQ+YS5kaWFnb25hbCgpLnN1bSgpPC90dD4sIGFzIHdlIHdpbGwgc2VlIGxhdGVyIG9uLgorCitUaGVyZSBhbHNvIGV4aXN0IHZhcmlhbnRzIG9mIHRoZSBcYyBtaW5Db2VmZiBhbmQgXGMgbWF4Q29lZmYgZnVuY3Rpb25zIHJldHVybmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHJlc3BlY3RpdmUgY29lZmZpY2llbnQgdmlhIHRoZSBhcmd1bWVudHM6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSB0dXRfYXJpdGhtZXRpY19yZWR1eF9taW5tYXguY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9hcml0aG1ldGljX3JlZHV4X21pbm1heC5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCisKK1xzZWN0aW9uIFR1dG9yaWFsQXJpdGhtZXRpY1ZhbGlkaXR5IFZhbGlkaXR5IG9mIG9wZXJhdGlvbnMKK0VpZ2VuIGNoZWNrcyB0aGUgdmFsaWRpdHkgb2YgdGhlIG9wZXJhdGlvbnMgdGhhdCB5b3UgcGVyZm9ybS4gV2hlbiBwb3NzaWJsZSwKK2l0IGNoZWNrcyB0aGVtIGF0IGNvbXBpbGUgdGltZSwgcHJvZHVjaW5nIGNvbXBpbGF0aW9uIGVycm9ycy4gVGhlc2UgZXJyb3IgbWVzc2FnZXMgY2FuIGJlIGxvbmcgYW5kIHVnbHksCitidXQgRWlnZW4gd3JpdGVzIHRoZSBpbXBvcnRhbnQgbWVzc2FnZSBpbiBVUFBFUkNBU0VfTEVUVEVSU19TT19JVF9TVEFORFNfT1VULiBGb3IgZXhhbXBsZToKK1xjb2RlCisgIE1hdHJpeDNmIG07CisgIFZlY3RvcjRmIHY7CisgIHYgPSBtKnY7ICAgICAgLy8gQ29tcGlsZS10aW1lIGVycm9yOiBZT1VfTUlYRURfTUFUUklDRVNfT0ZfRElGRkVSRU5UX1NJWkVTCitcZW5kY29kZQorCitPZiBjb3Vyc2UsIGluIG1hbnkgY2FzZXMsIGZvciBleGFtcGxlIHdoZW4gY2hlY2tpbmcgZHluYW1pYyBzaXplcywgdGhlIGNoZWNrIGNhbm5vdCBiZSBwZXJmb3JtZWQgYXQgY29tcGlsZSB0aW1lLgorRWlnZW4gdGhlbiB1c2VzIHJ1bnRpbWUgYXNzZXJ0aW9ucy4gVGhpcyBtZWFucyB0aGF0IHRoZSBwcm9ncmFtIHdpbGwgYWJvcnQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIHdoZW4gZXhlY3V0aW5nIGFuIGlsbGVnYWwgb3BlcmF0aW9uIGlmIGl0IGlzIHJ1biBpbiAiZGVidWcgbW9kZSIsIGFuZCBpdCB3aWxsIHByb2JhYmx5IGNyYXNoIGlmIGFzc2VydGlvbnMgYXJlIHR1cm5lZCBvZmYuCisKK1xjb2RlCisgIE1hdHJpeFhmIG0oMywzKTsKKyAgVmVjdG9yWGYgdig0KTsKKyAgdiA9IG0gKiB2OyAvLyBSdW4tdGltZSBhc3NlcnRpb24gZmFpbHVyZSBoZXJlOiAiaW52YWxpZCBtYXRyaXggcHJvZHVjdCIKK1xlbmRjb2RlCisKK0ZvciBtb3JlIGRldGFpbHMgb24gdGhpcyB0b3BpYywgc2VlIFxyZWYgVG9waWNBc3NlcnRpb25zICJ0aGlzIHBhZ2UiLgorCitcbGkgXGIgTmV4dDogXHJlZiBUdXRvcmlhbEFycmF5Q2xhc3MKKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0MwM19UdXRvcmlhbEFycmF5Q2xhc3MuZG94IGIvZG9jL0MwM19UdXRvcmlhbEFycmF5Q2xhc3MuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZDhkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvQzAzX1R1dG9yaWFsQXJyYXlDbGFzcy5kb3gKQEAgLTAsMCArMSwyMDUgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUdXRvcmlhbEFycmF5Q2xhc3MgVHV0b3JpYWwgcGFnZSAzIC0gVGhlICVBcnJheSBjbGFzcyBhbmQgY29lZmZpY2llbnQtd2lzZSBvcGVyYXRpb25zCisgICAgXGluZ3JvdXAgVHV0b3JpYWwKKworXGxpIFxiIFByZXZpb3VzOiBccmVmIFR1dG9yaWFsTWF0cml4QXJpdGhtZXRpYworXGxpIFxiIE5leHQ6IFxyZWYgVHV0b3JpYWxCbG9ja09wZXJhdGlvbnMKKworVGhpcyB0dXRvcmlhbCBhaW1zIHRvIHByb3ZpZGUgYW4gb3ZlcnZpZXcgYW5kIGV4cGxhbmF0aW9ucyBvbiBob3cgdG8gdXNlCitFaWdlbidzIEFycmF5IGNsYXNzLgorCitcYiBUYWJsZSBcYiBvZiBcYiBjb250ZW50cworICAtIFxyZWYgVHV0b3JpYWxBcnJheUNsYXNzSW50cm8KKyAgLSBccmVmIFR1dG9yaWFsQXJyYXlDbGFzc1R5cGVzCisgIC0gXHJlZiBUdXRvcmlhbEFycmF5Q2xhc3NBY2Nlc3MKKyAgLSBccmVmIFR1dG9yaWFsQXJyYXlDbGFzc0FkZFN1YgorICAtIFxyZWYgVHV0b3JpYWxBcnJheUNsYXNzTXVsdAorICAtIFxyZWYgVHV0b3JpYWxBcnJheUNsYXNzQ3dpc2VPdGhlcgorICAtIFxyZWYgVHV0b3JpYWxBcnJheUNsYXNzQ29udmVydAorCitcc2VjdGlvbiBUdXRvcmlhbEFycmF5Q2xhc3NJbnRybyBXaGF0IGlzIHRoZSBBcnJheSBjbGFzcz8KKworVGhlIEFycmF5IGNsYXNzIHByb3ZpZGVzIGdlbmVyYWwtcHVycG9zZSBhcnJheXMsIGFzIG9wcG9zZWQgdG8gdGhlIE1hdHJpeCBjbGFzcyB3aGljaAoraXMgaW50ZW5kZWQgZm9yIGxpbmVhciBhbGdlYnJhLiBGdXJ0aGVybW9yZSwgdGhlIEFycmF5IGNsYXNzIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvCitwZXJmb3JtIGNvZWZmaWNpZW50LXdpc2Ugb3BlcmF0aW9ucywgd2hpY2ggbWlnaHQgbm90IGhhdmUgYSBsaW5lYXIgYWxnZWJyYWljIG1lYW5pbmcsCitzdWNoIGFzIGFkZGluZyBhIGNvbnN0YW50IHRvIGV2ZXJ5IGNvZWZmaWNpZW50IGluIHRoZSBhcnJheSBvciBtdWx0aXBseWluZyB0d28gYXJyYXlzIGNvZWZmaWNpZW50LXdpc2UuCisKKworXHNlY3Rpb24gVHV0b3JpYWxBcnJheUNsYXNzVHlwZXMgQXJyYXkgdHlwZXMKK0FycmF5IGlzIGEgY2xhc3MgdGVtcGxhdGUgdGFraW5nIHRoZSBzYW1lIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXMgTWF0cml4LgorQXMgd2l0aCBNYXRyaXgsIHRoZSBmaXJzdCB0aHJlZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBtYW5kYXRvcnk6CitcY29kZQorQXJyYXk8dHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93c0F0Q29tcGlsZVRpbWUsIGludCBDb2xzQXRDb21waWxlVGltZT4KK1xlbmRjb2RlCitUaGUgbGFzdCB0aHJlZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbC4gU2luY2UgdGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvciBNYXRyaXgsCit3ZSB3b24ndCBleHBsYWluIGl0IGFnYWluIGhlcmUgYW5kIGp1c3QgcmVmZXIgdG8gXHJlZiBUdXRvcmlhbE1hdHJpeENsYXNzLgorCitFaWdlbiBhbHNvIHByb3ZpZGVzIHR5cGVkZWZzIGZvciBzb21lIGNvbW1vbiBjYXNlcywgaW4gYSB3YXkgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSBNYXRyaXggdHlwZWRlZnMKK2J1dCB3aXRoIHNvbWUgc2xpZ2h0IGRpZmZlcmVuY2VzLCBhcyB0aGUgd29yZCAiYXJyYXkiIGlzIHVzZWQgZm9yIGJvdGggMS1kaW1lbnNpb25hbCBhbmQgMi1kaW1lbnNpb25hbCBhcnJheXMuCitXZSBhZG9wdCB0aGUgY29udmVudGlvbiB0aGF0IHR5cGVkZWZzIG9mIHRoZSBmb3JtIEFycmF5TnQgc3RhbmQgZm9yIDEtZGltZW5zaW9uYWwgYXJyYXlzLCB3aGVyZSBOIGFuZCB0IGFyZQordGhlIHNpemUgYW5kIHRoZSBzY2FsYXIgdHlwZSwgYXMgaW4gdGhlIE1hdHJpeCB0eXBlZGVmcyBleHBsYWluZWQgb24gXHJlZiBUdXRvcmlhbE1hdHJpeENsYXNzICJ0aGlzIHBhZ2UiLiBGb3IgMi1kaW1lbnNpb25hbCBhcnJheXMsIHdlCit1c2UgdHlwZWRlZnMgb2YgdGhlIGZvcm0gQXJyYXlOTnQuIFNvbWUgZXhhbXBsZXMgYXJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKyAgPHRyPgorICAgIDx0aD5UeXBlIDwvdGg+CisgICAgPHRoPlR5cGVkZWYgPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD4gXGNvZGUgQXJyYXk8ZmxvYXQsRHluYW1pYywxPiBcZW5kY29kZSA8L3RkPgorICAgIDx0ZD4gXGNvZGUgQXJyYXlYZiBcZW5kY29kZSA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPiBcY29kZSBBcnJheTxmbG9hdCwzLDE+IFxlbmRjb2RlIDwvdGQ+CisgICAgPHRkPiBcY29kZSBBcnJheTNmIFxlbmRjb2RlIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+IFxjb2RlIEFycmF5PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+IFxlbmRjb2RlIDwvdGQ+CisgICAgPHRkPiBcY29kZSBBcnJheVhYZCBcZW5kY29kZSA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPiBcY29kZSBBcnJheTxkb3VibGUsMywzPiBcZW5kY29kZSA8L3RkPgorICAgIDx0ZD4gXGNvZGUgQXJyYXkzM2QgXGVuZGNvZGUgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKworXHNlY3Rpb24gVHV0b3JpYWxBcnJheUNsYXNzQWNjZXNzIEFjY2Vzc2luZyB2YWx1ZXMgaW5zaWRlIGFuIEFycmF5CisKK1RoZSBwYXJlbnRoZXNpcyBvcGVyYXRvciBpcyBvdmVybG9hZGVkIHRvIHByb3ZpZGUgd3JpdGUgYW5kIHJlYWQgYWNjZXNzIHRvIHRoZSBjb2VmZmljaWVudHMgb2YgYW4gYXJyYXksIGp1c3QgYXMgd2l0aCBtYXRyaWNlcy4KK0Z1cnRoZXJtb3JlLCB0aGUgXGMgPDwgb3BlcmF0b3IgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhcnJheXMgKHZpYSB0aGUgY29tbWEgaW5pdGlhbGl6ZXIpIG9yIHRvIHByaW50IHRoZW0uCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2FjY2Vzc29ycy5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQXJyYXlDbGFzc19hY2Nlc3NvcnMub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbW1hIGluaXRpYWxpemVyLCBzZWUgXHJlZiBUdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb24uCisKKworXHNlY3Rpb24gVHV0b3JpYWxBcnJheUNsYXNzQWRkU3ViIEFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbgorCitBZGRpbmcgYW5kIHN1YnRyYWN0aW5nIHR3byBhcnJheXMgaXMgdGhlIHNhbWUgYXMgZm9yIG1hdHJpY2VzLgorVGhlIG9wZXJhdGlvbiBpcyB2YWxpZCBpZiBib3RoIGFycmF5cyBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCB0aGUgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24gaXMgZG9uZSBjb2VmZmljaWVudC13aXNlLgorCitBcnJheXMgYWxzbyBzdXBwb3J0IGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtIDx0dD5hcnJheSArIHNjYWxhcjwvdHQ+IHdoaWNoIGFkZCBhIHNjYWxhciB0byBlYWNoIGNvZWZmaWNpZW50IGluIHRoZSBhcnJheS4KK1RoaXMgcHJvdmlkZXMgYSBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgbm90IGRpcmVjdGx5IGF2YWlsYWJsZSBmb3IgTWF0cml4IG9iamVjdHMuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2FkZGl0aW9uLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2FkZGl0aW9uLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKKworXHNlY3Rpb24gVHV0b3JpYWxBcnJheUNsYXNzTXVsdCBBcnJheSBtdWx0aXBsaWNhdGlvbgorCitGaXJzdCBvZiBhbGwsIG9mIGNvdXJzZSB5b3UgY2FuIG11bHRpcGx5IGFuIGFycmF5IGJ5IGEgc2NhbGFyLCB0aGlzIHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyBtYXRyaWNlcy4gV2hlcmUgYXJyYXlzCithcmUgZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgZnJvbSBtYXRyaWNlcywgaXMgd2hlbiB5b3UgbXVsdGlwbHkgdHdvIHRvZ2V0aGVyLiBNYXRyaWNlcyBpbnRlcnByZXQKK211bHRpcGxpY2F0aW9uIGFzIG1hdHJpeCBwcm9kdWN0IGFuZCBhcnJheXMgaW50ZXJwcmV0IG11bHRpcGxpY2F0aW9uIGFzIGNvZWZmaWNpZW50LXdpc2UgcHJvZHVjdC4gVGh1cywgdHdvIAorYXJyYXlzIGNhbiBiZSBtdWx0aXBsaWVkIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25zLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQXJyYXlDbGFzc19tdWx0LmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX211bHQub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworCitcc2VjdGlvbiBUdXRvcmlhbEFycmF5Q2xhc3NDd2lzZU90aGVyIE90aGVyIGNvZWZmaWNpZW50LXdpc2Ugb3BlcmF0aW9ucworCitUaGUgQXJyYXkgY2xhc3MgZGVmaW5lcyBvdGhlciBjb2VmZmljaWVudC13aXNlIG9wZXJhdGlvbnMgYmVzaWRlcyB0aGUgYWRkaXRpb24sIHN1YnRyYWN0aW9uIGFuZCBtdWx0aXBsaWNhdGlvbgorb3BlcmF0b3JzIGRlc2NyaWJlZCBhYm92ZS4gRm9yIGV4YW1wbGUsIHRoZSBcbGluayBBcnJheUJhc2U6OmFicygpIC5hYnMoKSBcZW5kbGluayBtZXRob2QgdGFrZXMgdGhlIGFic29sdXRlCit2YWx1ZSBvZiBlYWNoIGNvZWZmaWNpZW50LCB3aGlsZSBcbGluayBBcnJheUJhc2U6OnNxcnQoKSAuc3FydCgpIFxlbmRsaW5rIGNvbXB1dGVzIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUKK2NvZWZmaWNpZW50cy4gSWYgeW91IGhhdmUgdHdvIGFycmF5cyBvZiB0aGUgc2FtZSBzaXplLCB5b3UgY2FuIGNhbGwgXGxpbmsgQXJyYXlCYXNlOjptaW4oKSAubWluKCkgXGVuZGxpbmsgdG8KK2NvbnN0cnVjdCB0aGUgYXJyYXkgd2hvc2UgY29lZmZpY2llbnRzIGFyZSB0aGUgbWluaW11bSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2VmZmljaWVudHMgb2YgdGhlIHR3byBnaXZlbgorYXJyYXlzLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBpbGx1c3RyYXRlZCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2N3aXNlX290aGVyLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2N3aXNlX290aGVyLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK01vcmUgY29lZmZpY2llbnQtd2lzZSBvcGVyYXRpb25zIGNhbiBiZSBmb3VuZCBpbiB0aGUgXHJlZiBRdWlja1JlZlBhZ2UuCisKKworXHNlY3Rpb24gVHV0b3JpYWxBcnJheUNsYXNzQ29udmVydCBDb252ZXJ0aW5nIGJldHdlZW4gYXJyYXkgYW5kIG1hdHJpeCBleHByZXNzaW9ucworCitXaGVuIHNob3VsZCB5b3UgdXNlIG9iamVjdHMgb2YgdGhlIE1hdHJpeCBjbGFzcyBhbmQgd2hlbiBzaG91bGQgeW91IHVzZSBvYmplY3RzIG9mIHRoZSBBcnJheSBjbGFzcz8gWW91IGNhbm5vdAorYXBwbHkgTWF0cml4IG9wZXJhdGlvbnMgb24gYXJyYXlzLCBvciBBcnJheSBvcGVyYXRpb25zIG9uIG1hdHJpY2VzLiBUaHVzLCBpZiB5b3UgbmVlZCB0byBkbyBsaW5lYXIgYWxnZWJyYWljCitvcGVyYXRpb25zIHN1Y2ggYXMgbWF0cml4IG11bHRpcGxpY2F0aW9uLCB0aGVuIHlvdSBzaG91bGQgdXNlIG1hdHJpY2VzOyBpZiB5b3UgbmVlZCB0byBkbyBjb2VmZmljaWVudC13aXNlCitvcGVyYXRpb25zLCB0aGVuIHlvdSBzaG91bGQgdXNlIGFycmF5cy4gSG93ZXZlciwgc29tZXRpbWVzIGl0IGlzIG5vdCB0aGF0IHNpbXBsZSwgYnV0IHlvdSBuZWVkIHRvIHVzZSBib3RoCitNYXRyaXggYW5kIEFycmF5IG9wZXJhdGlvbnMuIEluIHRoYXQgY2FzZSwgeW91IG5lZWQgdG8gY29udmVydCBhIG1hdHJpeCB0byBhbiBhcnJheSBvciByZXZlcnNlbHkuIFRoaXMgZ2l2ZXMKK2FjY2VzcyB0byBhbGwgb3BlcmF0aW9ucyByZWdhcmRsZXNzIG9mIHRoZSBjaG9pY2Ugb2YgZGVjbGFyaW5nIG9iamVjdHMgYXMgYXJyYXlzIG9yIGFzIG1hdHJpY2VzLgorCitcbGluayBNYXRyaXhCYXNlIE1hdHJpeCBleHByZXNzaW9ucyBcZW5kbGluayBoYXZlIGFuIFxsaW5rIE1hdHJpeEJhc2U6OmFycmF5KCkgLmFycmF5KCkgXGVuZGxpbmsgbWV0aG9kIHRoYXQKKydjb252ZXJ0cycgdGhlbSBpbnRvIFxsaW5rIEFycmF5QmFzZSBhcnJheSBleHByZXNzaW9uc1xlbmRsaW5rLCBzbyB0aGF0IGNvZWZmaWNpZW50LXdpc2Ugb3BlcmF0aW9ucworY2FuIGJlIGFwcGxpZWQgZWFzaWx5LiBDb252ZXJzZWx5LCBcbGluayBBcnJheUJhc2UgYXJyYXkgZXhwcmVzc2lvbnMgXGVuZGxpbmsKK2hhdmUgYSBcbGluayBBcnJheUJhc2U6Om1hdHJpeCgpIC5tYXRyaXgoKSBcZW5kbGluayBtZXRob2QuIEFzIHdpdGggYWxsIEVpZ2VuIGV4cHJlc3Npb24gYWJzdHJhY3Rpb25zLAordGhpcyBkb2Vzbid0IGhhdmUgYW55IHJ1bnRpbWUgY29zdCAocHJvdmlkZWQgdGhhdCB5b3UgbGV0IHlvdXIgY29tcGlsZXIgb3B0aW1pemUpLgorQm90aCBcbGluayBNYXRyaXhCYXNlOjphcnJheSgpIC5hcnJheSgpIFxlbmRsaW5rIGFuZCBcbGluayBBcnJheUJhc2U6Om1hdHJpeCgpIC5tYXRyaXgoKSBcZW5kbGluayAKK2NhbiBiZSB1c2VkIGFzIHJ2YWx1ZXMgYW5kIGFzIGx2YWx1ZXMuCisKK01peGluZyBtYXRyaWNlcyBhbmQgYXJyYXlzIGluIGFuIGV4cHJlc3Npb24gaXMgZm9yYmlkZGVuIHdpdGggRWlnZW4uIEZvciBpbnN0YW5jZSwgeW91IGNhbm5vdCBhZGQgYSBtYXRyaXggYW5kCithcnJheSBkaXJlY3RseTsgdGhlIG9wZXJhbmRzIG9mIGEgXGMgKyBvcGVyYXRvciBzaG91bGQgZWl0aGVyIGJvdGggYmUgbWF0cmljZXMgb3IgYm90aCBiZSBhcnJheXMuIEhvd2V2ZXIsCitpdCBpcyBlYXN5IHRvIGNvbnZlcnQgZnJvbSBvbmUgdG8gdGhlIG90aGVyIHdpdGggXGxpbmsgTWF0cml4QmFzZTo6YXJyYXkoKSAuYXJyYXkoKSBcZW5kbGluayBhbmQgCitcbGluayBBcnJheUJhc2U6Om1hdHJpeCgpIC5tYXRyaXgoKVxlbmRsaW5rLiBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcyB0aGUgYXNzaWdubWVudCBvcGVyYXRvcjogaXQgaXMKK2FsbG93ZWQgdG8gYXNzaWduIGEgbWF0cml4IGV4cHJlc3Npb24gdG8gYW4gYXJyYXkgdmFyaWFibGUsIG9yIHRvIGFzc2lnbiBhbiBhcnJheSBleHByZXNzaW9uIHRvIGEgbWF0cml4Cit2YXJpYWJsZS4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYXJyYXkgb3BlcmF0aW9ucyBvbiBhIE1hdHJpeCBvYmplY3QgYnkgZW1wbG95aW5nIHRoZSAKK1xsaW5rIE1hdHJpeEJhc2U6OmFycmF5KCkgLmFycmF5KCkgXGVuZGxpbmsgbWV0aG9kLiBGb3IgZXhhbXBsZSwgdGhlIHN0YXRlbWVudCAKKzx0dD5yZXN1bHQgPSBtLmFycmF5KCkgKiBuLmFycmF5KCk8L3R0PiB0YWtlcyB0d28gbWF0cmljZXMgXGMgbSBhbmQgXGMgbiwgY29udmVydHMgdGhlbSBib3RoIHRvIGFuIGFycmF5LCB1c2VzCisqIHRvIG11bHRpcGx5IHRoZW0gY29lZmZpY2llbnQtd2lzZSBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBtYXRyaXggdmFyaWFibGUgXGMgcmVzdWx0ICh0aGlzIGlzIGxlZ2FsCitiZWNhdXNlIEVpZ2VuIGFsbG93cyBhc3NpZ25pbmcgYXJyYXkgZXhwcmVzc2lvbnMgdG8gbWF0cml4IHZhcmlhYmxlcykuIAorCitBcyBhIG1hdHRlciBvZiBmYWN0LCB0aGlzIHVzYWdlIGNhc2UgaXMgc28gY29tbW9uIHRoYXQgRWlnZW4gcHJvdmlkZXMgYSBcbGluayBNYXRyaXhCYXNlOjpjd2lzZVByb2R1Y3QoKQorLmN3aXNlUHJvZHVjdCgpIFxlbmRsaW5rIG1ldGhvZCBmb3IgbWF0cmljZXMgdG8gY29tcHV0ZSB0aGUgY29lZmZpY2llbnQtd2lzZSBwcm9kdWN0LiBUaGlzIGlzIGFsc28gc2hvd24gaW4KK3RoZSBleGFtcGxlIHByb2dyYW0uCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3BfbWF0cml4LmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3BfbWF0cml4Lm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1NpbWlsYXJseSwgaWYgXGMgYXJyYXkxIGFuZCBcYyBhcnJheTIgYXJlIGFycmF5cywgdGhlbiB0aGUgZXhwcmVzc2lvbiA8dHQ+YXJyYXkxLm1hdHJpeCgpICogYXJyYXkyLm1hdHJpeCgpPC90dD4KK2NvbXB1dGVzIHRoZWlyIG1hdHJpeCBwcm9kdWN0LgorCitIZXJlIGlzIGEgbW9yZSBhZHZhbmNlZCBleGFtcGxlLiBUaGUgZXhwcmVzc2lvbiA8dHQ+KG0uYXJyYXkoKSArIDQpLm1hdHJpeCgpICogbTwvdHQ+IGFkZHMgNCB0byBldmVyeQorY29lZmZpY2llbnQgaW4gdGhlIG1hdHJpeCBcYyBtIGFuZCB0aGVuIGNvbXB1dGVzIHRoZSBtYXRyaXggcHJvZHVjdCBvZiB0aGUgcmVzdWx0IHdpdGggXGMgbS4gU2ltaWxhcmx5LCB0aGUKK2V4cHJlc3Npb24gPHR0PihtLmFycmF5KCkgKiBuLmFycmF5KCkpLm1hdHJpeCgpICogbTwvdHQ+IGNvbXB1dGVzIHRoZSBjb2VmZmljaWVudC13aXNlIHByb2R1Y3Qgb2YgdGhlIG1hdHJpY2VzCitcYyBtIGFuZCBcYyBuIGFuZCB0aGVuIHRoZSBtYXRyaXggcHJvZHVjdCBvZiB0aGUgcmVzdWx0IHdpdGggXGMgbS4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX0FycmF5Q2xhc3NfaW50ZXJvcC5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQXJyYXlDbGFzc19pbnRlcm9wLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1xsaSBcYiBOZXh0OiBccmVmIFR1dG9yaWFsQmxvY2tPcGVyYXRpb25zCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DMDRfVHV0b3JpYWxCbG9ja09wZXJhdGlvbnMuZG94IGIvZG9jL0MwNF9UdXRvcmlhbEJsb2NrT3BlcmF0aW9ucy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjMGVhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9DMDRfVHV0b3JpYWxCbG9ja09wZXJhdGlvbnMuZG94CkBAIC0wLDAgKzEsMjM5IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVHV0b3JpYWxCbG9ja09wZXJhdGlvbnMgVHV0b3JpYWwgcGFnZSA0IC0gJUJsb2NrIG9wZXJhdGlvbnMKKyAgICBcaW5ncm91cCBUdXRvcmlhbAorCitcbGkgXGIgUHJldmlvdXM6IFxyZWYgVHV0b3JpYWxBcnJheUNsYXNzCitcbGkgXGIgTmV4dDogXHJlZiBUdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb24KKworVGhpcyB0dXRvcmlhbCBwYWdlIGV4cGxhaW5zIHRoZSBlc3NlbnRpYWxzIG9mIGJsb2NrIG9wZXJhdGlvbnMuCitBIGJsb2NrIGlzIGEgcmVjdGFuZ3VsYXIgcGFydCBvZiBhIG1hdHJpeCBvciBhcnJheS4gQmxvY2tzIGV4cHJlc3Npb25zIGNhbiBiZSB1c2VkIGJvdGgKK2FzIHJ2YWx1ZXMgYW5kIGFzIGx2YWx1ZXMuIEFzIHVzdWFsIHdpdGggRWlnZW4gZXhwcmVzc2lvbnMsIHRoaXMgYWJzdHJhY3Rpb24gaGFzIHplcm8gcnVudGltZSBjb3N0Citwcm92aWRlZCB0aGF0IHlvdSBsZXQgeW91ciBjb21waWxlciBvcHRpbWl6ZS4KKworXGIgVGFibGUgXGIgb2YgXGIgY29udGVudHMKKyAgLSBccmVmIFR1dG9yaWFsQmxvY2tPcGVyYXRpb25zVXNpbmcKKyAgLSBccmVmIFR1dG9yaWFsQmxvY2tPcGVyYXRpb25zU3ludGF4Q29sdW1uUm93cworICAtIFxyZWYgVHV0b3JpYWxCbG9ja09wZXJhdGlvbnNTeW50YXhDb3JuZXJzCisgIC0gXHJlZiBUdXRvcmlhbEJsb2NrT3BlcmF0aW9uc1N5bnRheFZlY3RvcnMKKworCitcc2VjdGlvbiBUdXRvcmlhbEJsb2NrT3BlcmF0aW9uc1VzaW5nIFVzaW5nIGJsb2NrIG9wZXJhdGlvbnMKKworVGhlIG1vc3QgZ2VuZXJhbCBibG9jayBvcGVyYXRpb24gaW4gRWlnZW4gaXMgY2FsbGVkIFxsaW5rIERlbnNlQmFzZTo6YmxvY2soKSAuYmxvY2soKSBcZW5kbGluay4KK1RoZXJlIGFyZSB0d28gdmVyc2lvbnMsIHdob3NlIHN5bnRheCBpcyBhcyBmb2xsb3dzOgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPlxiICVCbG9jayBcYiBvcGVyYXRpb248L3RkPgorPHRoPlZlcnNpb24gY29uc3RydWN0aW5nIGEgXG4gZHluYW1pYy1zaXplIGJsb2NrIGV4cHJlc3Npb248L3RoPgorPHRoPlZlcnNpb24gY29uc3RydWN0aW5nIGEgXG4gZml4ZWQtc2l6ZSBibG9jayBleHByZXNzaW9uPC90aD48L3RyPgorPHRyPjx0ZD4lQmxvY2sgb2Ygc2l6ZSA8dHQ+KHAscSk8L3R0Piwgc3RhcnRpbmcgYXQgPHR0PihpLGopPC90dD48L3RkPgorICAgIDx0ZD5cY29kZQorbWF0cml4LmJsb2NrKGksaixwLHEpO1xlbmRjb2RlIDwvdGQ+CisgICAgPHRkPlxjb2RlIAorbWF0cml4LmJsb2NrPHAscT4oaSxqKTtcZW5kY29kZSA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK0FzIGFsd2F5cyBpbiBFaWdlbiwgaW5kaWNlcyBzdGFydCBhdCAwLgorCitCb3RoIHZlcnNpb25zIGNhbiBiZSB1c2VkIG9uIGZpeGVkLXNpemUgYW5kIGR5bmFtaWMtc2l6ZSBtYXRyaWNlcyBhbmQgYXJyYXlzLgorVGhlc2UgdHdvIGV4cHJlc3Npb25zIGFyZSBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudC4KK1RoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgZml4ZWQtc2l6ZSB2ZXJzaW9uIHdpbGwgdHlwaWNhbGx5IGdpdmUgeW91IGZhc3RlciBjb2RlIGlmIHRoZSBibG9jayBzaXplIGlzIHNtYWxsLAorYnV0IHJlcXVpcmVzIHRoaXMgc2l6ZSB0byBiZSBrbm93biBhdCBjb21waWxlIHRpbWUuCisKK1RoZSBmb2xsb3dpbmcgcHJvZ3JhbSB1c2VzIHRoZSBkeW5hbWljLXNpemUgYW5kIGZpeGVkLXNpemUgdmVyc2lvbnMgdG8gcHJpbnQgdGhlIHZhbHVlcyBvZiBzZXZlcmFsIGJsb2NrcyBpbnNpZGUgYQorbWF0cml4LgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX3ByaW50X2Jsb2NrLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfcHJpbnRfYmxvY2sub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworSW4gdGhlIGFib3ZlIGV4YW1wbGUgdGhlIFxsaW5rIERlbnNlQmFzZTo6YmxvY2soKSAuYmxvY2soKSBcZW5kbGluayBmdW5jdGlvbiB3YXMgZW1wbG95ZWQgYXMgYSBcZW0gcnZhbHVlLCBpLmUuCitpdCB3YXMgb25seSByZWFkIGZyb20uIEhvd2V2ZXIsIGJsb2NrcyBjYW4gYWxzbyBiZSB1c2VkIGFzIFxlbSBsdmFsdWVzLCBtZWFuaW5nIHRoYXQgeW91IGNhbiBhc3NpZ24gdG8gYSBibG9jay4KKworVGhpcyBpcyBpbGx1c3RyYXRlZCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuIFRoaXMgZXhhbXBsZSBhbHNvIGRlbW9uc3RyYXRlcyBibG9ja3MgaW4gYXJyYXlzLCB3aGljaCB3b3JrcyBleGFjdGx5IGxpa2UgdGhlIGFib3ZlLWRlbW9uc3RyYXRlZCBibG9ja3MgaW4gbWF0cmljZXMuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfYmxvY2tfYXNzaWdubWVudC5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2Jsb2NrX2Fzc2lnbm1lbnQub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworV2hpbGUgdGhlIFxsaW5rIERlbnNlQmFzZTo6YmxvY2soKSAuYmxvY2soKSBcZW5kbGluayBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGFueSBibG9jayBvcGVyYXRpb24sIHRoZXJlIGFyZQorb3RoZXIgbWV0aG9kcyBmb3Igc3BlY2lhbCBjYXNlcywgcHJvdmlkaW5nIG1vcmUgc3BlY2lhbGl6ZWQgQVBJIGFuZC9vciBiZXR0ZXIgcGVyZm9ybWFuY2UuIE9uIHRoZSB0b3BpYyBvZiBwZXJmb3JtYW5jZSwgYWxsIHdoYXQKK21hdHRlcnMgaXMgdGhhdCB5b3UgZ2l2ZSBFaWdlbiBhcyBtdWNoIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGF0IGNvbXBpbGUgdGltZS4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgYmxvY2sgaXMgYSBzaW5nbGUgd2hvbGUgY29sdW1uIGluIGEgbWF0cml4LAordXNpbmcgdGhlIHNwZWNpYWxpemVkIFxsaW5rIERlbnNlQmFzZTo6Y29sKCkgLmNvbCgpIFxlbmRsaW5rIGZ1bmN0aW9uIGRlc2NyaWJlZCBiZWxvdyBsZXRzIEVpZ2VuIGtub3cgdGhhdCwgd2hpY2ggY2FuIGdpdmUgaXQgb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMuCisKK1RoZSByZXN0IG9mIHRoaXMgcGFnZSBkZXNjcmliZXMgdGhlc2Ugc3BlY2lhbGl6ZWQgbWV0aG9kcy4KKworXHNlY3Rpb24gVHV0b3JpYWxCbG9ja09wZXJhdGlvbnNTeW50YXhDb2x1bW5Sb3dzIENvbHVtbnMgYW5kIHJvd3MKKworSW5kaXZpZHVhbCBjb2x1bW5zIGFuZCByb3dzIGFyZSBzcGVjaWFsIGNhc2VzIG9mIGJsb2Nrcy4gRWlnZW4gcHJvdmlkZXMgbWV0aG9kcyB0byBlYXNpbHkgYWRkcmVzcyB0aGVtOgorXGxpbmsgRGVuc2VCYXNlOjpjb2woKSAuY29sKCkgXGVuZGxpbmsgYW5kIFxsaW5rIERlbnNlQmFzZTo6cm93KCkgLnJvdygpXGVuZGxpbmsuCisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+JUJsb2NrIG9wZXJhdGlvbjwvdGg+Cis8dGg+TWV0aG9kPC90aD4KKzx0cj48dGQ+aTxzdXA+dGg8L3N1cD4gcm93CisgICAgICAgICAgICAgICAgICAgIFxsaW5rIERlbnNlQmFzZTo6cm93KCkgKiBcZW5kbGluazwvdGQ+CisgICAgPHRkPlxjb2RlCittYXRyaXgucm93KGkpO1xlbmRjb2RlIDwvdGQ+Cis8L3RyPgorPHRyPjx0ZD5qPHN1cD50aDwvc3VwPiBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgXGxpbmsgRGVuc2VCYXNlOjpjb2woKSAqIFxlbmRsaW5rPC90ZD4KKyAgICA8dGQ+XGNvZGUKK21hdHJpeC5jb2woaik7XGVuZGNvZGUgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitUaGUgYXJndW1lbnQgZm9yIFxwIGNvbCgpIGFuZCBccCByb3coKSBpcyB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiBvciByb3cgdG8gYmUgYWNjZXNzZWQuIEFzIGFsd2F5cyBpbiBFaWdlbiwgaW5kaWNlcyBzdGFydCBhdCAwLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2NvbHJvdy5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2NvbHJvdy5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGF0IGV4YW1wbGUgYWxzbyBkZW1vbnN0cmF0ZXMgdGhhdCBibG9jayBleHByZXNzaW9ucyAoaGVyZSBjb2x1bW5zKSBjYW4gYmUgdXNlZCBpbiBhcml0aG1ldGljIGxpa2UgYW55IG90aGVyIGV4cHJlc3Npb24uCisKKworXHNlY3Rpb24gVHV0b3JpYWxCbG9ja09wZXJhdGlvbnNTeW50YXhDb3JuZXJzIENvcm5lci1yZWxhdGVkIG9wZXJhdGlvbnMKKworRWlnZW4gYWxzbyBwcm92aWRlcyBzcGVjaWFsIG1ldGhvZHMgZm9yIGJsb2NrcyB0aGF0IGFyZSBmbHVzaGVkIGFnYWluc3Qgb25lIG9mIHRoZSBjb3JuZXJzIG9yIHNpZGVzIG9mIGEKK21hdHJpeCBvciBhcnJheS4gRm9yIGluc3RhbmNlLCBcbGluayBEZW5zZUJhc2U6OnRvcExlZnRDb3JuZXIoKSAudG9wTGVmdENvcm5lcigpIFxlbmRsaW5rIGNhbiBiZSB1c2VkIHRvIHJlZmVyCit0byBhIGJsb2NrIGluIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgYSBtYXRyaXguCisKK1RoZSBkaWZmZXJlbnQgcG9zc2liaWxpdGllcyBhcmUgc3VtbWFyaXplZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPiVCbG9jayBcYiBvcGVyYXRpb248L3RkPgorPHRoPlZlcnNpb24gY29uc3RydWN0aW5nIGEgXG4gZHluYW1pYy1zaXplIGJsb2NrIGV4cHJlc3Npb248L3RoPgorPHRoPlZlcnNpb24gY29uc3RydWN0aW5nIGEgXG4gZml4ZWQtc2l6ZSBibG9jayBleHByZXNzaW9uPC90aD48L3RyPgorPHRyPjx0ZD5Ub3AtbGVmdCBwIGJ5IHEgYmxvY2sgXGxpbmsgRGVuc2VCYXNlOjp0b3BMZWZ0Q29ybmVyKCkgKiBcZW5kbGluazwvdGQ+CisgICAgPHRkPlxjb2RlCittYXRyaXgudG9wTGVmdENvcm5lcihwLHEpO1xlbmRjb2RlIDwvdGQ+CisgICAgPHRkPlxjb2RlIAorbWF0cml4LnRvcExlZnRDb3JuZXI8cCxxPigpO1xlbmRjb2RlIDwvdGQ+Cis8L3RyPgorPHRyPjx0ZD5Cb3R0b20tbGVmdCBwIGJ5IHEgYmxvY2sKKyAgICAgICAgICAgICAgXGxpbmsgRGVuc2VCYXNlOjpib3R0b21MZWZ0Q29ybmVyKCkgKiBcZW5kbGluazwvdGQ+CisgICAgPHRkPlxjb2RlCittYXRyaXguYm90dG9tTGVmdENvcm5lcihwLHEpO1xlbmRjb2RlIDwvdGQ+CisgICAgPHRkPlxjb2RlIAorbWF0cml4LmJvdHRvbUxlZnRDb3JuZXI8cCxxPigpO1xlbmRjb2RlIDwvdGQ+Cis8L3RyPgorPHRyPjx0ZD5Ub3AtcmlnaHQgcCBieSBxIGJsb2NrCisgICAgICAgICAgICAgIFxsaW5rIERlbnNlQmFzZTo6dG9wUmlnaHRDb3JuZXIoKSAqIFxlbmRsaW5rPC90ZD4KKyAgICA8dGQ+XGNvZGUKK21hdHJpeC50b3BSaWdodENvcm5lcihwLHEpO1xlbmRjb2RlIDwvdGQ+CisgICAgPHRkPlxjb2RlIAorbWF0cml4LnRvcFJpZ2h0Q29ybmVyPHAscT4oKTtcZW5kY29kZSA8L3RkPgorPC90cj4KKzx0cj48dGQ+Qm90dG9tLXJpZ2h0IHAgYnkgcSBibG9jaworICAgICAgICAgICAgICAgXGxpbmsgRGVuc2VCYXNlOjpib3R0b21SaWdodENvcm5lcigpICogXGVuZGxpbms8L3RkPgorICAgIDx0ZD5cY29kZQorbWF0cml4LmJvdHRvbVJpZ2h0Q29ybmVyKHAscSk7XGVuZGNvZGUgPC90ZD4KKyAgICA8dGQ+XGNvZGUgCittYXRyaXguYm90dG9tUmlnaHRDb3JuZXI8cCxxPigpO1xlbmRjb2RlIDwvdGQ+Cis8L3RyPgorPHRyPjx0ZD4lQmxvY2sgY29udGFpbmluZyB0aGUgZmlyc3QgcSByb3dzCisgICAgICAgICAgICAgICAgICAgXGxpbmsgRGVuc2VCYXNlOjp0b3BSb3dzKCkgKiBcZW5kbGluazwvdGQ+CisgICAgPHRkPlxjb2RlCittYXRyaXgudG9wUm93cyhxKTtcZW5kY29kZSA8L3RkPgorICAgIDx0ZD5cY29kZSAKK21hdHJpeC50b3BSb3dzPHE+KCk7XGVuZGNvZGUgPC90ZD4KKzwvdHI+Cis8dHI+PHRkPiVCbG9jayBjb250YWluaW5nIHRoZSBsYXN0IHEgcm93cworICAgICAgICAgICAgICAgICAgICBcbGluayBEZW5zZUJhc2U6OmJvdHRvbVJvd3MoKSAqIFxlbmRsaW5rPC90ZD4KKyAgICA8dGQ+XGNvZGUKK21hdHJpeC5ib3R0b21Sb3dzKHEpO1xlbmRjb2RlIDwvdGQ+CisgICAgPHRkPlxjb2RlIAorbWF0cml4LmJvdHRvbVJvd3M8cT4oKTtcZW5kY29kZSA8L3RkPgorPC90cj4KKzx0cj48dGQ+JUJsb2NrIGNvbnRhaW5pbmcgdGhlIGZpcnN0IHAgY29sdW1ucworICAgICAgICAgICAgICAgICAgICBcbGluayBEZW5zZUJhc2U6OmxlZnRDb2xzKCkgKiBcZW5kbGluazwvdGQ+CisgICAgPHRkPlxjb2RlCittYXRyaXgubGVmdENvbHMocCk7XGVuZGNvZGUgPC90ZD4KKyAgICA8dGQ+XGNvZGUgCittYXRyaXgubGVmdENvbHM8cD4oKTtcZW5kY29kZSA8L3RkPgorPC90cj4KKzx0cj48dGQ+JUJsb2NrIGNvbnRhaW5pbmcgdGhlIGxhc3QgcSBjb2x1bW5zCisgICAgICAgICAgICAgICAgICAgIFxsaW5rIERlbnNlQmFzZTo6cmlnaHRDb2xzKCkgKiBcZW5kbGluazwvdGQ+CisgICAgPHRkPlxjb2RlCittYXRyaXgucmlnaHRDb2xzKHEpO1xlbmRjb2RlIDwvdGQ+CisgICAgPHRkPlxjb2RlIAorbWF0cml4LnJpZ2h0Q29sczxxPigpO1xlbmRjb2RlIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIGlsbHVzdHJhdGluZyB0aGUgdXNlIG9mIHRoZSBvcGVyYXRpb25zIHByZXNlbnRlZCBhYm92ZToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19jb3JuZXIuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19jb3JuZXIub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworCitcc2VjdGlvbiBUdXRvcmlhbEJsb2NrT3BlcmF0aW9uc1N5bnRheFZlY3RvcnMgQmxvY2sgb3BlcmF0aW9ucyBmb3IgdmVjdG9ycworCitFaWdlbiBhbHNvIHByb3ZpZGVzIGEgc2V0IG9mIGJsb2NrIG9wZXJhdGlvbnMgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIHZlY3RvcnMgYW5kIG9uZS1kaW1lbnNpb25hbCBhcnJheXM6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+ICVCbG9jayBvcGVyYXRpb248L3RoPgorPHRoPlZlcnNpb24gY29uc3RydWN0aW5nIGEgXG4gZHluYW1pYy1zaXplIGJsb2NrIGV4cHJlc3Npb248L3RoPgorPHRoPlZlcnNpb24gY29uc3RydWN0aW5nIGEgXG4gZml4ZWQtc2l6ZSBibG9jayBleHByZXNzaW9uPC90aD48L3RyPgorPHRyPjx0ZD4lQmxvY2sgY29udGFpbmluZyB0aGUgZmlyc3QgXHAgbiBlbGVtZW50cyAKKyAgICAgICAgICAgICAgICAgICAgXGxpbmsgRGVuc2VCYXNlOjpoZWFkKCkgKiBcZW5kbGluazwvdGQ+CisgICAgPHRkPlxjb2RlCit2ZWN0b3IuaGVhZChuKTtcZW5kY29kZSA8L3RkPgorICAgIDx0ZD5cY29kZSAKK3ZlY3Rvci5oZWFkPG4+KCk7XGVuZGNvZGUgPC90ZD4KKzwvdHI+Cis8dHI+PHRkPiVCbG9jayBjb250YWluaW5nIHRoZSBsYXN0IFxwIG4gZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgXGxpbmsgRGVuc2VCYXNlOjp0YWlsKCkgKiBcZW5kbGluazwvdGQ+CisgICAgPHRkPlxjb2RlCit2ZWN0b3IudGFpbChuKTtcZW5kY29kZSA8L3RkPgorICAgIDx0ZD5cY29kZSAKK3ZlY3Rvci50YWlsPG4+KCk7XGVuZGNvZGUgPC90ZD4KKzwvdHI+Cis8dHI+PHRkPiVCbG9jayBjb250YWluaW5nIFxwIG4gZWxlbWVudHMsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIFxwIGkKKyAgICAgICAgICAgICAgICAgICAgXGxpbmsgRGVuc2VCYXNlOjpzZWdtZW50KCkgKiBcZW5kbGluazwvdGQ+CisgICAgPHRkPlxjb2RlCit2ZWN0b3Iuc2VnbWVudChpLG4pO1xlbmRjb2RlIDwvdGQ+CisgICAgPHRkPlxjb2RlIAordmVjdG9yLnNlZ21lbnQ8bj4oaSk7XGVuZGNvZGUgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCisKK0FuIGV4YW1wbGUgaXMgcHJlc2VudGVkIGJlbG93OgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc192ZWN0b3IuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc192ZWN0b3Iub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworXGxpIFxiIE5leHQ6IFxyZWYgVHV0b3JpYWxBZHZhbmNlZEluaXRpYWxpemF0aW9uCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DMDVfVHV0b3JpYWxBZHZhbmNlZEluaXRpYWxpemF0aW9uLmRveCBiL2RvYy9DMDVfVHV0b3JpYWxBZHZhbmNlZEluaXRpYWxpemF0aW9uLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjI3ZjFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0MwNV9UdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb24uZG94CkBAIC0wLDAgKzEsMTcyIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVHV0b3JpYWxBZHZhbmNlZEluaXRpYWxpemF0aW9uIFR1dG9yaWFsIHBhZ2UgNSAtIEFkdmFuY2VkIGluaXRpYWxpemF0aW9uCisgICAgXGluZ3JvdXAgVHV0b3JpYWwKKworXGxpIFxiIFByZXZpb3VzOiBccmVmIFR1dG9yaWFsQmxvY2tPcGVyYXRpb25zCitcbGkgXGIgTmV4dDogXHJlZiBUdXRvcmlhbExpbmVhckFsZ2VicmEKKworVGhpcyBwYWdlIGRpc2N1c3NlcyBzZXZlcmFsIGFkdmFuY2VkIG1ldGhvZHMgZm9yIGluaXRpYWxpemluZyBtYXRyaWNlcy4gSXQgZ2l2ZXMgbW9yZSBkZXRhaWxzIG9uIHRoZQorY29tbWEtaW5pdGlhbGl6ZXIsIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGJlZm9yZS4gSXQgYWxzbyBleHBsYWlucyBob3cgdG8gZ2V0IHNwZWNpYWwgbWF0cmljZXMgc3VjaCBhcyB0aGUKK2lkZW50aXR5IG1hdHJpeCBhbmQgdGhlIHplcm8gbWF0cml4LgorCitcYiBUYWJsZSBcYiBvZiBcYiBjb250ZW50cworICAtIFxyZWYgVHV0b3JpYWxBZHZhbmNlZEluaXRpYWxpemF0aW9uQ29tbWFJbml0aWFsaXplcgorICAtIFxyZWYgVHV0b3JpYWxBZHZhbmNlZEluaXRpYWxpemF0aW9uU3BlY2lhbE1hdHJpY2VzCisgIC0gXHJlZiBUdXRvcmlhbEFkdmFuY2VkSW5pdGlhbGl6YXRpb25UZW1wb3JhcnlPYmplY3RzCisKKworXHNlY3Rpb24gVHV0b3JpYWxBZHZhbmNlZEluaXRpYWxpemF0aW9uQ29tbWFJbml0aWFsaXplciBUaGUgY29tbWEgaW5pdGlhbGl6ZXIKKworRWlnZW4gb2ZmZXJzIGEgY29tbWEgaW5pdGlhbGl6ZXIgc3ludGF4IHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBlYXNpbHkgc2V0IGFsbCB0aGUgY29lZmZpY2llbnRzIG9mIGEgbWF0cml4LAordmVjdG9yIG9yIGFycmF5LiBTaW1wbHkgbGlzdCB0aGUgY29lZmZpY2llbnRzLCBzdGFydGluZyBhdCB0aGUgdG9wLWxlZnQgY29ybmVyIGFuZCBtb3ZpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CithbmQgZnJvbSB0aGUgdG9wIHRvIHRoZSBib3R0b20uIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIGJlZm9yZWhhbmQuIElmIHlvdSBsaXN0IHRvbyBmZXcKK29yIHRvbyBtYW55IGNvZWZmaWNpZW50cywgRWlnZW4gd2lsbCBjb21wbGFpbi4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX2NvbW1haW5pdF8wMS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfY29tbWFpbml0XzAxLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK01vcmVvdmVyLCB0aGUgZWxlbWVudHMgb2YgdGhlIGluaXRpYWxpemF0aW9uIGxpc3QgbWF5IHRoZW1zZWx2ZXMgYmUgdmVjdG9ycyBvciBtYXRyaWNlcy4gQSBjb21tb24gdXNlIGlzCit0byBqb2luIHZlY3RvcnMgb3IgbWF0cmljZXMgdG9nZXRoZXIuIEZvciBleGFtcGxlLCBoZXJlIGlzIGhvdyB0byBqb2luIHR3byByb3cgdmVjdG9ycyB0b2dldGhlci4gUmVtZW1iZXIKK3RoYXQgeW91IGhhdmUgdG8gc2V0IHRoZSBzaXplIGJlZm9yZSB5b3UgY2FuIHVzZSB0aGUgY29tbWEgaW5pdGlhbGl6ZXIuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0pvaW4uY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fSm9pbi5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitXZSBjYW4gdXNlIHRoZSBzYW1lIHRlY2huaXF1ZSB0byBpbml0aWFsaXplIG1hdHJpY2VzIHdpdGggYSBibG9jayBzdHJ1Y3R1cmUuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0Jsb2NrLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0Jsb2NrLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBjb21tYSBpbml0aWFsaXplciBjYW4gYWxzbyBiZSB1c2VkIHRvIGZpbGwgYmxvY2sgZXhwcmVzc2lvbnMgc3VjaCBhcyA8dHQ+bS5yb3coaSk8L3R0Pi4gSGVyZSBpcyBhIG1vcmUKK2NvbXBsaWNhdGVkIHdheSB0byBnZXQgdGhlIHNhbWUgcmVzdWx0IGFzIGluIHRoZSBmaXJzdCBleGFtcGxlIGFib3ZlOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfY29tbWFpbml0XzAxYi5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfY29tbWFpbml0XzAxYi5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCisKK1xzZWN0aW9uIFR1dG9yaWFsQWR2YW5jZWRJbml0aWFsaXphdGlvblNwZWNpYWxNYXRyaWNlcyBTcGVjaWFsIG1hdHJpY2VzIGFuZCBhcnJheXMKKworVGhlIE1hdHJpeCBhbmQgQXJyYXkgY2xhc3NlcyBoYXZlIHN0YXRpYyBtZXRob2RzIGxpa2UgXGxpbmsgRGVuc2VCYXNlOjpaZXJvKCkgWmVybygpXGVuZGxpbmssIHdoaWNoIGNhbiBiZQordXNlZCB0byBpbml0aWFsaXplIGFsbCBjb2VmZmljaWVudHMgdG8gemVyby4gVGhlcmUgYXJlIHRocmVlIHZhcmlhbnRzLiBUaGUgZmlyc3QgdmFyaWFudCB0YWtlcyBubyBhcmd1bWVudHMKK2FuZCBjYW4gb25seSBiZSB1c2VkIGZvciBmaXhlZC1zaXplIG9iamVjdHMuIElmIHlvdSB3YW50IHRvIGluaXRpYWxpemUgYSBkeW5hbWljLXNpemUgb2JqZWN0IHRvIHplcm8sIHlvdSBuZWVkCit0byBzcGVjaWZ5IHRoZSBzaXplLiBUaHVzLCB0aGUgc2Vjb25kIHZhcmlhbnQgcmVxdWlyZXMgb25lIGFyZ3VtZW50IGFuZCBjYW4gYmUgdXNlZCBmb3Igb25lLWRpbWVuc2lvbmFsCitkeW5hbWljLXNpemUgb2JqZWN0cywgd2hpbGUgdGhlIHRoaXJkIHZhcmlhbnQgcmVxdWlyZXMgdHdvIGFyZ3VtZW50cyBhbmQgY2FuIGJlIHVzZWQgZm9yIHR3by1kaW1lbnNpb25hbAorb2JqZWN0cy4gQWxsIHRocmVlIHZhcmlhbnRzIGFyZSBpbGx1c3RyYXRlZCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1plcm8uY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fWmVyby5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitTaW1pbGFybHksIHRoZSBzdGF0aWMgbWV0aG9kIFxsaW5rIERlbnNlQmFzZTo6Q29uc3RhbnQoKSBDb25zdGFudFxlbmRsaW5rKHZhbHVlKSBzZXRzIGFsbCBjb2VmZmljaWVudHMgdG8gXGMgdmFsdWUuCitJZiB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IG5lZWRzIHRvIGJlIHNwZWNpZmllZCwgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIGdvIGJlZm9yZSB0aGUgXGMgdmFsdWUKK2FyZ3VtZW50LCBhcyBpbiA8dHQ+TWF0cml4WGQ6OkNvbnN0YW50KHJvd3MsIGNvbHMsIHZhbHVlKTwvdHQ+LiBUaGUgbWV0aG9kIFxsaW5rIERlbnNlQmFzZTo6UmFuZG9tKCkgUmFuZG9tKCkKK1xlbmRsaW5rIGZpbGxzIHRoZSBtYXRyaXggb3IgYXJyYXkgd2l0aCByYW5kb20gY29lZmZpY2llbnRzLiBUaGUgaWRlbnRpdHkgbWF0cml4IGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nCitcbGluayBNYXRyaXhCYXNlOjpJZGVudGl0eSgpIElkZW50aXR5KClcZW5kbGluazsgdGhpcyBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIE1hdHJpeCwgbm90IGZvciBBcnJheSwKK2JlY2F1c2UgImlkZW50aXR5IG1hdHJpeCIgaXMgYSBsaW5lYXIgYWxnZWJyYSBjb25jZXB0LiAgVGhlIG1ldGhvZAorXGxpbmsgRGVuc2VCYXNlOjpMaW5TcGFjZWQgTGluU3BhY2VkXGVuZGxpbmsoc2l6ZSwgbG93LCBoaWdoKSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdmVjdG9ycyBhbmQKK29uZS1kaW1lbnNpb25hbCBhcnJheXM7IGl0IHlpZWxkcyBhIHZlY3RvciBvZiB0aGUgc3BlY2lmaWVkIHNpemUgd2hvc2UgY29lZmZpY2llbnRzIGFyZSBlcXVhbGx5IHNwYWNlZCBiZXR3ZWVuCitcYyBsb3cgYW5kIFxjIGhpZ2guIFRoZSBtZXRob2QgXGMgTGluU3BhY2VkKCkgaXMgaWxsdXN0cmF0ZWQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB3aGljaCBwcmludHMgYSB0YWJsZQord2l0aCBhbmdsZXMgaW4gZGVncmVlcywgdGhlIGNvcnJlc3BvbmRpbmcgYW5nbGUgaW4gcmFkaWFucywgYW5kIHRoZWlyIHNpbmUgYW5kIGNvc2luZS4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fTGluU3BhY2VkLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0xpblNwYWNlZC5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGlzIGV4YW1wbGUgc2hvd3MgdGhhdCBvYmplY3RzIGxpa2UgdGhlIG9uZXMgcmV0dXJuZWQgYnkgTGluU3BhY2VkKCkgY2FuIGJlIGFzc2lnbmVkIHRvIHZhcmlhYmxlcyAoYW5kCitleHByZXNzaW9ucykuIEVpZ2VuIGRlZmluZXMgdXRpbGl0eSBmdW5jdGlvbnMgbGlrZSBcbGluayBEZW5zZUJhc2U6OnNldFplcm8oKSBzZXRaZXJvKClcZW5kbGluaywgCitcbGluayBNYXRyaXhCYXNlOjpzZXRJZGVudGl0eSgpIFxlbmRsaW5rIGFuZCBcbGluayBEZW5zZUJhc2U6OnNldExpblNwYWNlZCgpIFxlbmRsaW5rIHRvIGRvIHRoaXMKK2NvbnZlbmllbnRseS4gVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvbnRyYXN0cyB0aHJlZSB3YXlzIHRvIGNvbnN0cnVjdCB0aGUgbWF0cml4CitcZiQgSiA9IFxiaWdsWyBcYmVnaW57c21hbGxtYXRyaXh9IE8gJiBJIFxcIEkgJiBPIFxlbmR7c21hbGxtYXRyaXh9IFxiaWdyXSBcZiQ6IHVzaW5nIHN0YXRpYyBtZXRob2RzIGFuZAorYXNzaWdubWVudCwgdXNpbmcgc3RhdGljIG1ldGhvZHMgYW5kIHRoZSBjb21tYS1pbml0aWFsaXplciwgb3IgdXNpbmcgdGhlIHNldFh4eCgpIG1ldGhvZHMuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1RocmVlV2F5cy5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9UaHJlZVdheXMub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworQSBzdW1tYXJ5IG9mIGFsbCBwcmUtZGVmaW5lZCBtYXRyaXgsIHZlY3RvciBhbmQgYXJyYXkgb2JqZWN0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFxyZWYgUXVpY2tSZWZQYWdlLgorCisKK1xzZWN0aW9uIFR1dG9yaWFsQWR2YW5jZWRJbml0aWFsaXphdGlvblRlbXBvcmFyeU9iamVjdHMgVXNhZ2UgYXMgdGVtcG9yYXJ5IG9iamVjdHMKKworQXMgc2hvd24gYWJvdmUsIHN0YXRpYyBtZXRob2RzIGFzIFplcm8oKSBhbmQgQ29uc3RhbnQoKSBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIHZhcmlhYmxlcyBhdCB0aGUgdGltZSBvZgorZGVjbGFyYXRpb24gb3IgYXQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiBhbiBhc3NpZ25tZW50IG9wZXJhdG9yLiBZb3UgY2FuIHRoaW5rIG9mIHRoZXNlIG1ldGhvZHMgYXMgcmV0dXJuaW5nIGEKK21hdHJpeCBvciBhcnJheTsgaW4gZmFjdCwgdGhleSByZXR1cm4gc28tY2FsbGVkIFxyZWYgVG9waWNFaWdlbkV4cHJlc3Npb25UZW1wbGF0ZXMgImV4cHJlc3Npb24gb2JqZWN0cyIgd2hpY2gKK2V2YWx1YXRlIHRvIGEgbWF0cml4IG9yIGFycmF5IHdoZW4gbmVlZGVkLCBzbyB0aGF0IHRoaXMgc3ludGF4IGRvZXMgbm90IGluY3VyIGFueSBvdmVyaGVhZC4KKworVGhlc2UgZXhwcmVzc2lvbnMgY2FuIGFsc28gYmUgdXNlZCBhcyBhIHRlbXBvcmFyeSBvYmplY3QuIFRoZSBzZWNvbmQgZXhhbXBsZSBpbgordGhlIFxyZWYgR2V0dGluZ1N0YXJ0ZWQgZ3VpZGUsIHdoaWNoIHdlIHJlcHJvZHVjZSBoZXJlLCBhbHJlYWR5IGlsbHVzdHJhdGVzIHRoaXMuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBRdWlja1N0YXJ0X2V4YW1wbGUyX2R5bmFtaWMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFF1aWNrU3RhcnRfZXhhbXBsZTJfZHluYW1pYy5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGUgZXhwcmVzc2lvbiA8dHQ+bSArIE1hdHJpeFhmOjpDb25zdGFudCgzLDMsMS4yKTwvdHQ+IGNvbnN0cnVjdHMgdGhlIDMtYnktMyBtYXRyaXggZXhwcmVzc2lvbiB3aXRoIGFsbCBpdHMgY29lZmZpY2llbnRzCitlcXVhbCB0byAxLjIgcGx1cyB0aGUgY29ycmVzcG9uZGluZyBjb2VmZmljaWVudCBvZiBcYSBtLgorCitUaGUgY29tbWEtaW5pdGlhbGl6ZXIsIHRvbywgY2FuIGFsc28gYmUgdXNlZCB0byBjb25zdHJ1Y3QgdGVtcG9yYXJ5IG9iamVjdHMuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb25zdHJ1Y3RzIGEgcmFuZG9tCittYXRyaXggb2Ygc2l6ZSAyLWJ5LTMsIGFuZCB0aGVuIG11bHRpcGxpZXMgdGhpcyBtYXRyaXggb24gdGhlIGxlZnQgd2l0aCAKK1xmJCBcYmlnbFsgXGJlZ2lue3NtYWxsbWF0cml4fSAwICYgMSBcXCAxICYgMCBcZW5ke3NtYWxsbWF0cml4fSBcYmlncl0gXGYkLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9Db21tYVRlbXBvcmFyeS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9Db21tYVRlbXBvcmFyeS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGUgXGxpbmsgQ29tbWFJbml0aWFsaXplcjo6ZmluaXNoZWQoKSBmaW5pc2hlZCgpIFxlbmRsaW5rIG1ldGhvZCBpcyBuZWNlc3NhcnkgaGVyZSB0byBnZXQgdGhlIGFjdHVhbCBtYXRyaXgKK29iamVjdCBvbmNlIHRoZSBjb21tYSBpbml0aWFsaXphdGlvbiBvZiBvdXIgdGVtcG9yYXJ5IHN1Ym1hdHJpeCBpcyBkb25lLgorCisKK1xsaSBcYiBOZXh0OiBccmVmIFR1dG9yaWFsTGluZWFyQWxnZWJyYQorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvQzA2X1R1dG9yaWFsTGluZWFyQWxnZWJyYS5kb3ggYi9kb2MvQzA2X1R1dG9yaWFsTGluZWFyQWxnZWJyYS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiM2I3OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9DMDZfVHV0b3JpYWxMaW5lYXJBbGdlYnJhLmRveApAQCAtMCwwICsxLDI2OSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFR1dG9yaWFsTGluZWFyQWxnZWJyYSBUdXRvcmlhbCBwYWdlIDYgLSBMaW5lYXIgYWxnZWJyYSBhbmQgZGVjb21wb3NpdGlvbnMKKyAgICBcaW5ncm91cCBUdXRvcmlhbAorCitcbGkgXGIgUHJldmlvdXM6IFxyZWYgVHV0b3JpYWxBZHZhbmNlZEluaXRpYWxpemF0aW9uCitcbGkgXGIgTmV4dDogXHJlZiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZworCitUaGlzIHR1dG9yaWFsIGV4cGxhaW5zIGhvdyB0byBzb2x2ZSBsaW5lYXIgc3lzdGVtcywgY29tcHV0ZSB2YXJpb3VzIGRlY29tcG9zaXRpb25zIHN1Y2ggYXMgTFUsCitRUiwgJVNWRCwgZWlnZW5kZWNvbXBvc2l0aW9ucy4uLiBmb3IgbW9yZSBhZHZhbmNlZCB0b3BpY3MsIGRvbid0IG1pc3Mgb3VyIHNwZWNpYWwgcGFnZSBvbgorXHJlZiBUb3BpY0xpbmVhckFsZ2VicmFEZWNvbXBvc2l0aW9ucyAidGhpcyB0b3BpYyIuCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzCisgIC0gXHJlZiBUdXRvcmlhbExpbkFsZ0Jhc2ljU29sdmUKKyAgLSBccmVmIFR1dG9yaWFsTGluQWxnU29sdXRpb25FeGlzdHMKKyAgLSBccmVmIFR1dG9yaWFsTGluQWxnRWlnZW5zb2x2aW5nCisgIC0gXHJlZiBUdXRvcmlhbExpbkFsZ0ludmVyc2UKKyAgLSBccmVmIFR1dG9yaWFsTGluQWxnTGVhc3RzcXVhcmVzCisgIC0gXHJlZiBUdXRvcmlhbExpbkFsZ1NlcGFyYXRlQ29tcHV0YXRpb24KKyAgLSBccmVmIFR1dG9yaWFsTGluQWxnUmFua1JldmVhbGluZworCisKK1xzZWN0aW9uIFR1dG9yaWFsTGluQWxnQmFzaWNTb2x2ZSBCYXNpYyBsaW5lYXIgc29sdmluZworCitcYiBUaGUgXGIgcHJvYmxlbTogWW91IGhhdmUgYSBzeXN0ZW0gb2YgZXF1YXRpb25zLCB0aGF0IHlvdSBoYXZlIHdyaXR0ZW4gYXMgYSBzaW5nbGUgbWF0cml4IGVxdWF0aW9uCisgICAgXGZbIEF4IFw6ID0gXDogYiBcZl0KK1doZXJlIFxhIEEgYW5kIFxhIGIgYXJlIG1hdHJpY2VzIChcYSBiIGNvdWxkIGJlIGEgdmVjdG9yLCBhcyBhIHNwZWNpYWwgY2FzZSkuIFlvdSB3YW50IHRvIGZpbmQgYSBzb2x1dGlvbiBcYSB4LgorCitcYiBUaGUgXGIgc29sdXRpb246IFlvdSBjYW4gY2hvb3NlIGJldHdlZW4gdmFyaW91cyBkZWNvbXBvc2l0aW9ucywgZGVwZW5kaW5nIG9uIHdoYXQgeW91ciBtYXRyaXggXGEgQSBsb29rcyBsaWtlLAorYW5kIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBmYXZvciBzcGVlZCBvciBhY2N1cmFjeS4gSG93ZXZlciwgbGV0J3Mgc3RhcnQgd2l0aCBhbiBleGFtcGxlIHRoYXQgd29ya3MgaW4gYWxsIGNhc2VzLAorYW5kIGlzIGEgZ29vZCBjb21wcm9taXNlOgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorICA8dGQ+XGluY2x1ZGUgVHV0b3JpYWxMaW5BbGdFeFNvbHZlQ29sUGl2SG91c2Vob2xkZXJRUi5jcHAgPC90ZD4KKyAgPHRkPlx2ZXJiaW5jbHVkZSBUdXRvcmlhbExpbkFsZ0V4U29sdmVDb2xQaXZIb3VzZWhvbGRlclFSLm91dCA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK0luIHRoaXMgZXhhbXBsZSwgdGhlIGNvbFBpdkhvdXNlaG9sZGVyUXIoKSBtZXRob2QgcmV0dXJucyBhbiBvYmplY3Qgb2YgY2xhc3MgQ29sUGl2SG91c2Vob2xkZXJRUi4gU2luY2UgaGVyZSB0aGUKK21hdHJpeCBpcyBvZiB0eXBlIE1hdHJpeDNmLCB0aGlzIGxpbmUgY291bGQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5OgorXGNvZGUKK0NvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4M2Y+IGRlYyhBKTsKK1ZlY3RvcjNmIHggPSBkZWMuc29sdmUoYik7CitcZW5kY29kZQorCitIZXJlLCBDb2xQaXZIb3VzZWhvbGRlclFSIGlzIGEgUVIgZGVjb21wb3NpdGlvbiB3aXRoIGNvbHVtbiBwaXZvdGluZy4gSXQncyBhIGdvb2QgY29tcHJvbWlzZSBmb3IgdGhpcyB0dXRvcmlhbCwgYXMgaXQKK3dvcmtzIGZvciBhbGwgbWF0cmljZXMgd2hpbGUgYmVpbmcgcXVpdGUgZmFzdC4gSGVyZSBpcyBhIHRhYmxlIG9mIHNvbWUgb3RoZXIgZGVjb21wb3NpdGlvbnMgdGhhdCB5b3UgY2FuIGNob29zZSBmcm9tLAorZGVwZW5kaW5nIG9uIHlvdXIgbWF0cml4IGFuZCB0aGUgdHJhZGUtb2ZmIHlvdSB3YW50IHRvIG1ha2U6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKyAgICA8dHI+CisgICAgICAgIDx0aD5EZWNvbXBvc2l0aW9uPC90aD4KKyAgICAgICAgPHRoPk1ldGhvZDwvdGg+CisgICAgICAgIDx0aD5SZXF1aXJlbWVudHMgb24gdGhlIG1hdHJpeDwvdGg+CisgICAgICAgIDx0aD5TcGVlZDwvdGg+CisgICAgICAgIDx0aD5BY2N1cmFjeTwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5QYXJ0aWFsUGl2TFU8L3RkPgorICAgICAgICA8dGQ+cGFydGlhbFBpdkx1KCk8L3RkPgorICAgICAgICA8dGQ+SW52ZXJ0aWJsZTwvdGQ+CisgICAgICAgIDx0ZD4rKzwvdGQ+CisgICAgICAgIDx0ZD4rPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBjbGFzcz0iYWx0Ij4KKyAgICAgICAgPHRkPkZ1bGxQaXZMVTwvdGQ+CisgICAgICAgIDx0ZD5mdWxsUGl2THUoKTwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+KysrPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPkhvdXNlaG9sZGVyUVI8L3RkPgorICAgICAgICA8dGQ+aG91c2Vob2xkZXJRcigpPC90ZD4KKyAgICAgICAgPHRkPk5vbmU8L3RkPgorICAgICAgICA8dGQ+Kys8L3RkPgorICAgICAgICA8dGQ+KzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHIgY2xhc3M9ImFsdCI+CisgICAgICAgIDx0ZD5Db2xQaXZIb3VzZWhvbGRlclFSPC90ZD4KKyAgICAgICAgPHRkPmNvbFBpdkhvdXNlaG9sZGVyUXIoKTwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPis8L3RkPgorICAgICAgICA8dGQ+Kys8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+RnVsbFBpdkhvdXNlaG9sZGVyUVI8L3RkPgorICAgICAgICA8dGQ+ZnVsbFBpdkhvdXNlaG9sZGVyUXIoKTwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+KysrPC90ZD4KKyAgICA8L3RyPgorICAgIDx0ciBjbGFzcz0iYWx0Ij4KKyAgICAgICAgPHRkPkxMVDwvdGQ+CisgICAgICAgIDx0ZD5sbHQoKTwvdGQ+CisgICAgICAgIDx0ZD5Qb3NpdGl2ZSBkZWZpbml0ZTwvdGQ+CisgICAgICAgIDx0ZD4rKys8L3RkPgorICAgICAgICA8dGQ+KzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5MRExUPC90ZD4KKyAgICAgICAgPHRkPmxkbHQoKTwvdGQ+CisgICAgICAgIDx0ZD5Qb3NpdGl2ZSBvciBuZWdhdGl2ZSBzZW1pZGVmaW5pdGU8L3RkPgorICAgICAgICA8dGQ+KysrPC90ZD4KKyAgICAgICAgPHRkPisrPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKworQWxsIG9mIHRoZXNlIGRlY29tcG9zaXRpb25zIG9mZmVyIGEgc29sdmUoKSBtZXRob2QgdGhhdCB3b3JrcyBhcyBpbiB0aGUgYWJvdmUgZXhhbXBsZS4KKworRm9yIGV4YW1wbGUsIGlmIHlvdXIgbWF0cml4IGlzIHBvc2l0aXZlIGRlZmluaXRlLCB0aGUgYWJvdmUgdGFibGUgc2F5cyB0aGF0IGEgdmVyeSBnb29kCitjaG9pY2UgaXMgdGhlbiB0aGUgTERMVCBkZWNvbXBvc2l0aW9uLiBIZXJlJ3MgYW4gZXhhbXBsZSwgYWxzbyBkZW1vbnN0cmF0aW5nIHRoYXQgdXNpbmcgYSBnZW5lcmFsCittYXRyaXggKG5vdCBhIHZlY3RvcikgYXMgcmlnaHQgaGFuZCBzaWRlIGlzIHBvc3NpYmxlLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+CisgIDx0ZD5caW5jbHVkZSBUdXRvcmlhbExpbkFsZ0V4U29sdmVMRExULmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnRXhTb2x2ZUxETFQub3V0IDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworRm9yIGEgXHJlZiBUb3BpY0xpbmVhckFsZ2VicmFEZWNvbXBvc2l0aW9ucyAibXVjaCBtb3JlIGNvbXBsZXRlIHRhYmxlIiBjb21wYXJpbmcgYWxsIGRlY29tcG9zaXRpb25zIHN1cHBvcnRlZCBieSBFaWdlbiAobm90aWNlIHRoYXQgRWlnZW4KK3N1cHBvcnRzIG1hbnkgb3RoZXIgZGVjb21wb3NpdGlvbnMpLCBzZWUgb3VyIHNwZWNpYWwgcGFnZSBvbgorXHJlZiBUb3BpY0xpbmVhckFsZ2VicmFEZWNvbXBvc2l0aW9ucyAidGhpcyB0b3BpYyIuCisKK1xzZWN0aW9uIFR1dG9yaWFsTGluQWxnU29sdXRpb25FeGlzdHMgQ2hlY2tpbmcgaWYgYSBzb2x1dGlvbiByZWFsbHkgZXhpc3RzCisKK09ubHkgeW91IGtub3cgd2hhdCBlcnJvciBtYXJnaW4geW91IHdhbnQgdG8gYWxsb3cgZm9yIGEgc29sdXRpb24gdG8gYmUgY29uc2lkZXJlZCB2YWxpZC4KK1NvIEVpZ2VuIGxldHMgeW91IGRvIHRoaXMgY29tcHV0YXRpb24gZm9yIHlvdXJzZWxmLCBpZiB5b3Ugd2FudCB0bywgYXMgaW4gdGhpcyBleGFtcGxlOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+CisgIDx0ZD5caW5jbHVkZSBUdXRvcmlhbExpbkFsZ0V4Q29tcHV0ZVNvbHZlRXJyb3IuY3BwIDwvdGQ+CisgIDx0ZD5cdmVyYmluY2x1ZGUgVHV0b3JpYWxMaW5BbGdFeENvbXB1dGVTb2x2ZUVycm9yLm91dCA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK1xzZWN0aW9uIFR1dG9yaWFsTGluQWxnRWlnZW5zb2x2aW5nIENvbXB1dGluZyBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzCisKK1lvdSBuZWVkIGFuIGVpZ2VuZGVjb21wb3NpdGlvbiBoZXJlLCBzZWUgYXZhaWxhYmxlIHN1Y2ggZGVjb21wb3NpdGlvbnMgb24gXHJlZiBUb3BpY0xpbmVhckFsZ2VicmFEZWNvbXBvc2l0aW9ucyAidGhpcyBwYWdlIi4KK01ha2Ugc3VyZSB0byBjaGVjayBpZiB5b3VyIG1hdHJpeCBpcyBzZWxmLWFkam9pbnQsIGFzIGlzIG9mdGVuIHRoZSBjYXNlIGluIHRoZXNlIHByb2JsZW1zLiBIZXJlJ3MgYW4gZXhhbXBsZSB1c2luZworU2VsZkFkam9pbnRFaWdlblNvbHZlciwgaXQgY291bGQgZWFzaWx5IGJlIGFkYXB0ZWQgdG8gZ2VuZXJhbCBtYXRyaWNlcyB1c2luZyBFaWdlblNvbHZlciBvciBDb21wbGV4RWlnZW5Tb2x2ZXIuCisKK1RoZSBjb21wdXRhdGlvbiBvZiBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvbnZlcmdlLCBidXQgc3VjaCBmYWlsdXJlIHRvIGNvbnZlcmdlIGlzCit2ZXJ5IHJhcmUuIFRoZSBjYWxsIHRvIGluZm8oKSBpcyB0byBjaGVjayBmb3IgdGhpcyBwb3NzaWJpbGl0eS4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorICA8dGQ+XGluY2x1ZGUgVHV0b3JpYWxMaW5BbGdTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnU2VsZkFkam9pbnRFaWdlblNvbHZlci5vdXQgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitcc2VjdGlvbiBUdXRvcmlhbExpbkFsZ0ludmVyc2UgQ29tcHV0aW5nIGludmVyc2UgYW5kIGRldGVybWluYW50CisKK0ZpcnN0IG9mIGFsbCwgbWFrZSBzdXJlIHRoYXQgeW91IHJlYWxseSB3YW50IHRoaXMuIFdoaWxlIGludmVyc2UgYW5kIGRldGVybWluYW50IGFyZSBmdW5kYW1lbnRhbCBtYXRoZW1hdGljYWwgY29uY2VwdHMsCitpbiBcZW0gbnVtZXJpY2FsIGxpbmVhciBhbGdlYnJhIHRoZXkgYXJlIG5vdCBhcyBwb3B1bGFyIGFzIGluIHB1cmUgbWF0aGVtYXRpY3MuIEludmVyc2UgY29tcHV0YXRpb25zIGFyZSBvZnRlbgorYWR2YW50YWdlb3VzbHkgcmVwbGFjZWQgYnkgc29sdmUoKSBvcGVyYXRpb25zLCBhbmQgdGhlIGRldGVybWluYW50IGlzIG9mdGVuIFxlbSBub3QgYSBnb29kIHdheSBvZiBjaGVja2luZyBpZiBhIG1hdHJpeAoraXMgaW52ZXJ0aWJsZS4KKworSG93ZXZlciwgZm9yIFxlbSB2ZXJ5IFxlbSBzbWFsbCBtYXRyaWNlcywgdGhlIGFib3ZlIGlzIG5vdCB0cnVlLCBhbmQgaW52ZXJzZSBhbmQgZGV0ZXJtaW5hbnQgY2FuIGJlIHZlcnkgdXNlZnVsLgorCitXaGlsZSBjZXJ0YWluIGRlY29tcG9zaXRpb25zLCBzdWNoIGFzIFBhcnRpYWxQaXZMVSBhbmQgRnVsbFBpdkxVLCBvZmZlciBpbnZlcnNlKCkgYW5kIGRldGVybWluYW50KCkgbWV0aG9kcywgeW91IGNhbiBhbHNvCitjYWxsIGludmVyc2UoKSBhbmQgZGV0ZXJtaW5hbnQoKSBkaXJlY3RseSBvbiBhIG1hdHJpeC4gSWYgeW91ciBtYXRyaXggaXMgb2YgYSB2ZXJ5IHNtYWxsIGZpeGVkIHNpemUgKGF0IG1vc3QgNHg0KSB0aGlzCithbGxvd3MgRWlnZW4gdG8gYXZvaWQgcGVyZm9ybWluZyBhIExVIGRlY29tcG9zaXRpb24sIGFuZCBpbnN0ZWFkIHVzZSBmb3JtdWxhcyB0aGF0IGFyZSBtb3JlIGVmZmljaWVudCBvbiBzdWNoIHNtYWxsIG1hdHJpY2VzLgorCitIZXJlIGlzIGFuIGV4YW1wbGU6Cis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+CisgIDx0ZD5caW5jbHVkZSBUdXRvcmlhbExpbkFsZ0ludmVyc2VEZXRlcm1pbmFudC5jcHAgPC90ZD4KKyAgPHRkPlx2ZXJiaW5jbHVkZSBUdXRvcmlhbExpbkFsZ0ludmVyc2VEZXRlcm1pbmFudC5vdXQgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitcc2VjdGlvbiBUdXRvcmlhbExpbkFsZ0xlYXN0c3F1YXJlcyBMZWFzdCBzcXVhcmVzIHNvbHZpbmcKKworVGhlIGJlc3Qgd2F5IHRvIGRvIGxlYXN0IHNxdWFyZXMgc29sdmluZyBpcyB3aXRoIGEgU1ZEIGRlY29tcG9zaXRpb24uIEVpZ2VuIHByb3ZpZGVzIG9uZSBhcyB0aGUgSmFjb2JpU1ZEIGNsYXNzLCBhbmQgaXRzIHNvbHZlKCkKK2lzIGRvaW5nIGxlYXN0LXNxdWFyZXMgc29sdmluZy4KKworSGVyZSBpcyBhbiBleGFtcGxlOgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorICA8dGQ+XGluY2x1ZGUgVHV0b3JpYWxMaW5BbGdTVkRTb2x2ZS5jcHAgPC90ZD4KKyAgPHRkPlx2ZXJiaW5jbHVkZSBUdXRvcmlhbExpbkFsZ1NWRFNvbHZlLm91dCA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK0Fub3RoZXIgd2F5LCBwb3RlbnRpYWxseSBmYXN0ZXIgYnV0IGxlc3MgcmVsaWFibGUsIGlzIHRvIHVzZSBhIExETFQgZGVjb21wb3NpdGlvbgorb2YgdGhlIG5vcm1hbCBtYXRyaXguIEluIGFueSBjYXNlLCBqdXN0IHJlYWQgYW55IHJlZmVyZW5jZSB0ZXh0IG9uIGxlYXN0IHNxdWFyZXMsIGFuZCBpdCB3aWxsIGJlIHZlcnkgZWFzeSBmb3IgeW91Cit0byBpbXBsZW1lbnQgYW55IGxpbmVhciBsZWFzdCBzcXVhcmVzIGNvbXB1dGF0aW9uIG9uIHRvcCBvZiBFaWdlbi4KKworXHNlY3Rpb24gVHV0b3JpYWxMaW5BbGdTZXBhcmF0ZUNvbXB1dGF0aW9uIFNlcGFyYXRpbmcgdGhlIGNvbXB1dGF0aW9uIGZyb20gdGhlIGNvbnN0cnVjdGlvbgorCitJbiB0aGUgYWJvdmUgZXhhbXBsZXMsIHRoZSBkZWNvbXBvc2l0aW9uIHdhcyBjb21wdXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRoYXQgdGhlIGRlY29tcG9zaXRpb24gb2JqZWN0IHdhcyBjb25zdHJ1Y3RlZC4KK1RoZXJlIGFyZSBob3dldmVyIHNpdHVhdGlvbnMgd2hlcmUgeW91IG1pZ2h0IHdhbnQgdG8gc2VwYXJhdGUgdGhlc2UgdHdvIHRoaW5ncywgZm9yIGV4YW1wbGUgaWYgeW91IGRvbid0IGtub3csCithdCB0aGUgdGltZSBvZiB0aGUgY29uc3RydWN0aW9uLCB0aGUgbWF0cml4IHRoYXQgeW91IHdpbGwgd2FudCB0byBkZWNvbXBvc2U7IG9yIGlmIHlvdSB3YW50IHRvIHJldXNlIGFuIGV4aXN0aW5nCitkZWNvbXBvc2l0aW9uIG9iamVjdC4KKworV2hhdCBtYWtlcyB0aGlzIHBvc3NpYmxlIGlzIHRoYXQ6CitcbGkgYWxsIGRlY29tcG9zaXRpb25zIGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLAorXGxpIGFsbCBkZWNvbXBvc2l0aW9ucyBoYXZlIGEgY29tcHV0ZShtYXRyaXgpIG1ldGhvZCB0aGF0IGRvZXMgdGhlIGNvbXB1dGF0aW9uLCBhbmQgdGhhdCBtYXkgYmUgY2FsbGVkIGFnYWluCisgICAgb24gYW4gYWxyZWFkeS1jb21wdXRlZCBkZWNvbXBvc2l0aW9uLCByZWluaXRpYWxpemluZyBpdC4KKworRm9yIGV4YW1wbGU6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj4KKyAgPHRkPlxpbmNsdWRlIFR1dG9yaWFsTGluQWxnQ29tcHV0ZVR3aWNlLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnQ29tcHV0ZVR3aWNlLm91dCA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK0ZpbmFsbHksIHlvdSBjYW4gdGVsbCB0aGUgZGVjb21wb3NpdGlvbiBjb25zdHJ1Y3RvciB0byBwcmVhbGxvY2F0ZSBzdG9yYWdlIGZvciBkZWNvbXBvc2luZyBtYXRyaWNlcyBvZiBhIGdpdmVuIHNpemUsCitzbyB0aGF0IHdoZW4geW91IHN1YnNlcXVlbnRseSBkZWNvbXBvc2Ugc3VjaCBtYXRyaWNlcywgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQgKG9mIGNvdXJzZSwgaWYgeW91CithcmUgdXNpbmcgZml4ZWQtc2l6ZSBtYXRyaWNlcywgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBoYXBwZW5zIGF0IGFsbCkuIFRoaXMgaXMgZG9uZSBieSBqdXN0CitwYXNzaW5nIHRoZSBzaXplIHRvIHRoZSBkZWNvbXBvc2l0aW9uIGNvbnN0cnVjdG9yLCBhcyBpbiB0aGlzIGV4YW1wbGU6CitcY29kZQorSG91c2Vob2xkZXJRUjxNYXRyaXhYZj4gcXIoNTAsNTApOworTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oNTAsNTApOworcXIuY29tcHV0ZShBKTsgLy8gbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbgorXGVuZGNvZGUKKworXHNlY3Rpb24gVHV0b3JpYWxMaW5BbGdSYW5rUmV2ZWFsaW5nIFJhbmstcmV2ZWFsaW5nIGRlY29tcG9zaXRpb25zCisKK0NlcnRhaW4gZGVjb21wb3NpdGlvbnMgYXJlIHJhbmstcmV2ZWFsaW5nLCBpLmUuIGFyZSBhYmxlIHRvIGNvbXB1dGUgdGhlIHJhbmsgb2YgYSBtYXRyaXguIFRoZXNlIGFyZSB0eXBpY2FsbHkKK2Fsc28gdGhlIGRlY29tcG9zaXRpb25zIHRoYXQgYmVoYXZlIGJlc3QgaW4gdGhlIGZhY2Ugb2YgYSBub24tZnVsbC1yYW5rIG1hdHJpeCAod2hpY2ggaW4gdGhlIHNxdWFyZSBjYXNlIG1lYW5zIGEKK3Npbmd1bGFyIG1hdHJpeCkuIE9uIFxyZWYgVG9waWNMaW5lYXJBbGdlYnJhRGVjb21wb3NpdGlvbnMgInRoaXMgdGFibGUiIHlvdSBjYW4gc2VlIGZvciBhbGwgb3VyIGRlY29tcG9zaXRpb25zCit3aGV0aGVyIHRoZXkgYXJlIHJhbmstcmV2ZWFsaW5nIG9yIG5vdC4KKworUmFuay1yZXZlYWxpbmcgZGVjb21wb3NpdGlvbnMgb2ZmZXIgYXQgbGVhc3QgYSByYW5rKCkgbWV0aG9kLiBUaGV5IGNhbiBhbHNvIG9mZmVyIGNvbnZlbmllbmNlIG1ldGhvZHMgc3VjaCBhcyBpc0ludmVydGlibGUoKSwKK2FuZCBzb21lIGFyZSBhbHNvIHByb3ZpZGluZyBtZXRob2RzIHRvIGNvbXB1dGUgdGhlIGtlcm5lbCAobnVsbC1zcGFjZSkgYW5kIGltYWdlIChjb2x1bW4tc3BhY2UpIG9mIHRoZSBtYXRyaXgsIGFzIGlzIHRoZQorY2FzZSB3aXRoIEZ1bGxQaXZMVToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorICA8dGQ+XGluY2x1ZGUgVHV0b3JpYWxMaW5BbGdSYW5rUmV2ZWFsaW5nLmNwcCA8L3RkPgorICA8dGQ+XHZlcmJpbmNsdWRlIFR1dG9yaWFsTGluQWxnUmFua1JldmVhbGluZy5vdXQgPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCitPZiBjb3Vyc2UsIGFueSByYW5rIGNvbXB1dGF0aW9uIGRlcGVuZHMgb24gdGhlIGNob2ljZSBvZiBhbiBhcmJpdHJhcnkgdGhyZXNob2xkLCBzaW5jZSBwcmFjdGljYWxseSBubworZmxvYXRpbmctcG9pbnQgbWF0cml4IGlzIFxlbSBleGFjdGx5IHJhbmstZGVmaWNpZW50LiBFaWdlbiBwaWNrcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhyZXNob2xkLCB3aGljaCBkZXBlbmRzCitvbiB0aGUgZGVjb21wb3NpdGlvbiBidXQgaXMgdHlwaWNhbGx5IHRoZSBkaWFnb25hbCBzaXplIHRpbWVzIG1hY2hpbmUgZXBzaWxvbi4gV2hpbGUgdGhpcyBpcyB0aGUgYmVzdCBkZWZhdWx0IHdlCitjb3VsZCBwaWNrLCBvbmx5IHlvdSBrbm93IHdoYXQgaXMgdGhlIHJpZ2h0IHRocmVzaG9sZCBmb3IgeW91ciBhcHBsaWNhdGlvbi4gWW91IGNhbiBzZXQgdGhpcyBieSBjYWxsaW5nIHNldFRocmVzaG9sZCgpCitvbiB5b3VyIGRlY29tcG9zaXRpb24gb2JqZWN0IGJlZm9yZSBjYWxsaW5nIHJhbmsoKSBvciBhbnkgb3RoZXIgbWV0aG9kIHRoYXQgbmVlZHMgdG8gdXNlIHN1Y2ggYSB0aHJlc2hvbGQuCitUaGUgZGVjb21wb3NpdGlvbiBpdHNlbGYsIGkuZS4gdGhlIGNvbXB1dGUoKSBtZXRob2QsIGlzIGluZGVwZW5kZW50IG9mIHRoZSB0aHJlc2hvbGQuIFlvdSBkb24ndCBuZWVkIHRvIHJlY29tcHV0ZSB0aGUKK2RlY29tcG9zaXRpb24gYWZ0ZXIgeW91J3ZlIGNoYW5nZWQgdGhlIHRocmVzaG9sZC4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorICA8dGQ+XGluY2x1ZGUgVHV0b3JpYWxMaW5BbGdTZXRUaHJlc2hvbGQuY3BwIDwvdGQ+CisgIDx0ZD5cdmVyYmluY2x1ZGUgVHV0b3JpYWxMaW5BbGdTZXRUaHJlc2hvbGQub3V0IDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworXGxpIFxiIE5leHQ6IFxyZWYgVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmcKKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0MwN19UdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZy5kb3ggYi9kb2MvQzA3X1R1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg3OWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0MwN19UdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZy5kb3gKQEAgLTAsMCArMSwyNzMgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZyBUdXRvcmlhbCBwYWdlIDcgLSBSZWR1Y3Rpb25zLCB2aXNpdG9ycyBhbmQgYnJvYWRjYXN0aW5nCisgICAgXGluZ3JvdXAgVHV0b3JpYWwKKworXGxpIFxiIFByZXZpb3VzOiBccmVmIFR1dG9yaWFsTGluZWFyQWxnZWJyYQorXGxpIFxiIE5leHQ6IFxyZWYgVHV0b3JpYWxHZW9tZXRyeQorCitUaGlzIHR1dG9yaWFsIGV4cGxhaW5zIEVpZ2VuJ3MgcmVkdWN0aW9ucywgdmlzaXRvcnMgYW5kIGJyb2FkY2FzdGluZyBhbmQgaG93IHRoZXkgYXJlIHVzZWQgd2l0aAorXGxpbmsgTWF0cml4QmFzZSBtYXRyaWNlcyBcZW5kbGluayBhbmQgXGxpbmsgQXJyYXlCYXNlIGFycmF5cyBcZW5kbGluay4KKworXGIgVGFibGUgXGIgb2YgXGIgY29udGVudHMKKyAgLSBccmVmIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nUmVkdWN0aW9ucworICAgIC0gXHJlZiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ1JlZHVjdGlvbnNOb3JtCisgICAgLSBccmVmIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nUmVkdWN0aW9uc0Jvb2wKKyAgICAtIFxyZWYgVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdSZWR1Y3Rpb25zVXNlcmRlZmluZWQKKyAgLSBccmVmIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nVmlzaXRvcnMKKyAgLSBccmVmIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nUGFydGlhbFJlZHVjdGlvbnMKKyAgICAtIFxyZWYgVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdQYXJ0aWFsUmVkdWN0aW9uc0NvbWJpbmVkCisgIC0gXHJlZiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ0Jyb2FkY2FzdGluZworICAgIC0gXHJlZiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ0Jyb2FkY2FzdGluZ0NvbWJpbmVkCisKKworXHNlY3Rpb24gVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdSZWR1Y3Rpb25zIFJlZHVjdGlvbnMKK0luIEVpZ2VuLCBhIHJlZHVjdGlvbiBpcyBhIGZ1bmN0aW9uIHRha2luZyBhIG1hdHJpeCBvciBhcnJheSwgYW5kIHJldHVybmluZyBhIHNpbmdsZQorc2NhbGFyIHZhbHVlLiBPbmUgb2YgdGhlIG1vc3QgdXNlZCByZWR1Y3Rpb25zIGlzIFxsaW5rIERlbnNlQmFzZTo6c3VtKCkgLnN1bSgpIFxlbmRsaW5rLAorcmV0dXJuaW5nIHRoZSBzdW0gb2YgYWxsIHRoZSBjb2VmZmljaWVudHMgaW5zaWRlIGEgZ2l2ZW4gbWF0cml4IG9yIGFycmF5LgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X2FyaXRobWV0aWNfcmVkdXhfYmFzaWMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9hcml0aG1ldGljX3JlZHV4X2Jhc2ljLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBcZW0gdHJhY2Ugb2YgYSBtYXRyaXgsIGFzIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiBcYyB0cmFjZSgpLCBpcyB0aGUgc3VtIG9mIHRoZSBkaWFnb25hbCBjb2VmZmljaWVudHMgYW5kIGNhbiBlcXVpdmFsZW50bHkgYmUgY29tcHV0ZWQgPHR0PmEuZGlhZ29uYWwoKS5zdW0oKTwvdHQ+LgorCisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nUmVkdWN0aW9uc05vcm0gTm9ybSBjb21wdXRhdGlvbnMKKworVGhlIChFdWNsaWRlYW4gYS5rLmEuIFxmJFxlbGxeMlxmJCkgc3F1YXJlZCBub3JtIG9mIGEgdmVjdG9yIGNhbiBiZSBvYnRhaW5lZCBcbGluayBNYXRyaXhCYXNlOjpzcXVhcmVkTm9ybSgpIHNxdWFyZWROb3JtKCkgXGVuZGxpbmsuIEl0IGlzIGVxdWFsIHRvIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgdmVjdG9yIGJ5IGl0c2VsZiwgYW5kIGVxdWl2YWxlbnRseSB0byB0aGUgc3VtIG9mIHNxdWFyZWQgYWJzb2x1dGUgdmFsdWVzIG9mIGl0cyBjb2VmZmljaWVudHMuCisKK0VpZ2VuIGFsc28gcHJvdmlkZXMgdGhlIFxsaW5rIE1hdHJpeEJhc2U6Om5vcm0oKSBub3JtKCkgXGVuZGxpbmsgbWV0aG9kLCB3aGljaCByZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiBcbGluayBNYXRyaXhCYXNlOjpzcXVhcmVkTm9ybSgpIHNxdWFyZWROb3JtKCkgXGVuZGxpbmsuCisKK1RoZXNlIG9wZXJhdGlvbnMgY2FuIGFsc28gb3BlcmF0ZSBvbiBtYXRyaWNlczsgaW4gdGhhdCBjYXNlLCBhIG4tYnktcCBtYXRyaXggaXMgc2VlbiBhcyBhIHZlY3RvciBvZiBzaXplIChuKnApLCBzbyBmb3IgZXhhbXBsZSB0aGUgXGxpbmsgTWF0cml4QmFzZTo6bm9ybSgpIG5vcm0oKSBcZW5kbGluayBtZXRob2QgcmV0dXJucyB0aGUgIkZyb2Jlbml1cyIgb3IgIkhpbGJlcnQtU2NobWlkdCIgbm9ybS4gV2UgcmVmcmFpbiBmcm9tIHNwZWFraW5nIG9mIHRoZSBcZiRcZWxsXjJcZiQgbm9ybSBvZiBhIG1hdHJpeCBiZWNhdXNlIHRoYXQgY2FuIG1lYW4gZGlmZmVyZW50IHRoaW5ncy4KKworSWYgeW91IHdhbnQgb3RoZXIgXGYkXGVsbF5wXGYkIG5vcm1zLCB1c2UgdGhlIFxsaW5rIE1hdHJpeEJhc2U6OmxwTm9ybSgpIGxwTm5vcm08cD4oKSBcZW5kbGluayBtZXRob2QuIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgcCBjYW4gdGFrZSB0aGUgc3BlY2lhbCB2YWx1ZSBcYSBJbmZpbml0eSBpZiB5b3Ugd2FudCB0aGUgXGYkXGVsbF5caW5mdHlcZiQgbm9ybSwgd2hpY2ggaXMgdGhlIG1heGltdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgY29lZmZpY2llbnRzLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZXNlIG1ldGhvZHMuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19ub3JtLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19ub3JtLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nUmVkdWN0aW9uc0Jvb2wgQm9vbGVhbiByZWR1Y3Rpb25zCisKK1RoZSBmb2xsb3dpbmcgcmVkdWN0aW9ucyBvcGVyYXRlIG9uIGJvb2xlYW4gdmFsdWVzOgorICAtIFxsaW5rIERlbnNlQmFzZTo6YWxsKCkgYWxsKCkgXGVuZGxpbmsgcmV0dXJucyBcYiB0cnVlIGlmIGFsbCBvZiB0aGUgY29lZmZpY2llbnRzIGluIGEgZ2l2ZW4gTWF0cml4IG9yIEFycmF5IGV2YWx1YXRlIHRvIFxiIHRydWUgLgorICAtIFxsaW5rIERlbnNlQmFzZTo6YW55KCkgYW55KCkgXGVuZGxpbmsgcmV0dXJucyBcYiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgY29lZmZpY2llbnRzIGluIGEgZ2l2ZW4gTWF0cml4IG9yIEFycmF5IGV2YWx1YXRlcyB0byBcYiB0cnVlIC4KKyAgLSBcbGluayBEZW5zZUJhc2U6OmNvdW50KCkgY291bnQoKSBcZW5kbGluayByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGluIGEgZ2l2ZW4gTWF0cml4IG9yIEFycmF5IHRoYXQgZXZhbHVhdGUgdG8gIFxiIHRydWUuCisKK1RoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjb2VmZmljaWVudC13aXNlIGNvbXBhcmlzb24gYW5kIGVxdWFsaXR5IG9wZXJhdG9ycyBwcm92aWRlZCBieSBBcnJheS4gRm9yIGluc3RhbmNlLCA8dHQ+YXJyYXkgPiAwPC90dD4gaXMgYW4gJUFycmF5IG9mIHRoZSBzYW1lIHNpemUgYXMgXGMgYXJyYXkgLCB3aXRoIFxiIHRydWUgYXQgdGhvc2UgcG9zaXRpb25zIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNvZWZmaWNpZW50IG9mIFxjIGFycmF5IGlzIHBvc2l0aXZlLiBUaHVzLCA8dHQ+KGFycmF5ID4gMCkuYWxsKCk8L3R0PiB0ZXN0cyB3aGV0aGVyIGFsbCBjb2VmZmljaWVudHMgb2YgXGMgYXJyYXkgYXJlIHBvc2l0aXZlLiBUaGlzIGNhbiBiZSBzZWVuIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX2Jvb2wuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX2Jvb2wub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworXHN1YnNlY3Rpb24gVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdSZWR1Y3Rpb25zVXNlcmRlZmluZWQgVXNlciBkZWZpbmVkIHJlZHVjdGlvbnMKKworVE9ETworCitJbiB0aGUgbWVhbnRpbWUgeW91IGNhbiBoYXZlIGEgbG9vayBhdCB0aGUgRGVuc2VCYXNlOjpyZWR1eCgpIGZ1bmN0aW9uLgorCitcc2VjdGlvbiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ1Zpc2l0b3JzIFZpc2l0b3JzCitWaXNpdG9ycyBhcmUgdXNlZnVsIHdoZW4gb25lIHdhbnRzIHRvIG9idGFpbiB0aGUgbG9jYXRpb24gb2YgYSBjb2VmZmljaWVudCBpbnNpZGUgCithIE1hdHJpeCBvciBBcnJheS4gVGhlIHNpbXBsZXN0IGV4YW1wbGVzIGFyZSAKK1xsaW5rIE1hdHJpeEJhc2U6Om1heENvZWZmKCkgbWF4Q29lZmYoJngsJnkpIFxlbmRsaW5rIGFuZCAKK1xsaW5rIE1hdHJpeEJhc2U6Om1pbkNvZWZmKCkgbWluQ29lZmYoJngsJnkpXGVuZGxpbmssIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbmQKK3RoZSBsb2NhdGlvbiBvZiB0aGUgZ3JlYXRlc3Qgb3Igc21hbGxlc3QgY29lZmZpY2llbnQgaW4gYSBNYXRyaXggb3IgCitBcnJheS4KKworVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSB2aXNpdG9yIGFyZSBwb2ludGVycyB0byB0aGUgdmFyaWFibGVzIHdoZXJlIHRoZQorcm93IGFuZCBjb2x1bW4gcG9zaXRpb24gYXJlIHRvIGJlIHN0b3JlZC4gVGhlc2UgdmFyaWFibGVzIHNob3VsZCBiZSBvZiB0eXBlCitcbGluayBEZW5zZUJhc2U6OkluZGV4IEluZGV4IFxlbmRsaW5rLCBhcyBzaG93biBiZWxvdzoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ192aXNpdG9ycy5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3Zpc2l0b3JzLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK05vdGUgdGhhdCBib3RoIGZ1bmN0aW9ucyBhbHNvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG1pbmltdW0gb3IgbWF4aW11bSBjb2VmZmljaWVudCBpZiBuZWVkZWQsCithcyBpZiBpdCB3YXMgYSB0eXBpY2FsIHJlZHVjdGlvbiBvcGVyYXRpb24uCisKK1xzZWN0aW9uIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nUGFydGlhbFJlZHVjdGlvbnMgUGFydGlhbCByZWR1Y3Rpb25zCitQYXJ0aWFsIHJlZHVjdGlvbnMgYXJlIHJlZHVjdGlvbnMgdGhhdCBjYW4gb3BlcmF0ZSBjb2x1bW4tIG9yIHJvdy13aXNlIG9uIGEgTWF0cml4IG9yIAorQXJyYXksIGFwcGx5aW5nIHRoZSByZWR1Y3Rpb24gb3BlcmF0aW9uIG9uIGVhY2ggY29sdW1uIG9yIHJvdyBhbmQgCityZXR1cm5pbmcgYSBjb2x1bW4gb3Igcm93LXZlY3RvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcy4gUGFydGlhbCByZWR1Y3Rpb25zIGFyZSBhcHBsaWVkIAord2l0aCBcbGluayBEZW5zZUJhc2U6OmNvbHdpc2UoKSBjb2x3aXNlKCkgXGVuZGxpbmsgb3IgXGxpbmsgRGVuc2VCYXNlOjpyb3d3aXNlKCkgcm93d2lzZSgpIFxlbmRsaW5rLgorCitBIHNpbXBsZSBleGFtcGxlIGlzIG9idGFpbmluZyB0aGUgbWF4aW11bSBvZiB0aGUgZWxlbWVudHMgCitpbiBlYWNoIGNvbHVtbiBpbiBhIGdpdmVuIG1hdHJpeCwgc3RvcmluZyB0aGUgcmVzdWx0IGluIGEgcm93LXZlY3RvcjoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19jb2x3aXNlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfY29sd2lzZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGUgc2FtZSBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCByb3ctd2lzZToKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yb3d3aXNlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3Rpbmdfcm93d2lzZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCis8Yj5Ob3RlIHRoYXQgY29sdW1uLXdpc2Ugb3BlcmF0aW9ucyByZXR1cm4gYSAncm93LXZlY3Rvcicgd2hpbGUgcm93LXdpc2Ugb3BlcmF0aW9ucworcmV0dXJuIGEgJ2NvbHVtbi12ZWN0b3InPC9iPgorCitcc3Vic2VjdGlvbiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ1BhcnRpYWxSZWR1Y3Rpb25zQ29tYmluZWQgQ29tYmluaW5nIHBhcnRpYWwgcmVkdWN0aW9ucyB3aXRoIG90aGVyIG9wZXJhdGlvbnMKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIHRoZSByZXN1bHQgb2YgYSBwYXJ0aWFsIHJlZHVjdGlvbiB0byBkbyBmdXJ0aGVyIHByb2Nlc3NpbmcuCitIZXJlIGlzIGFub3RoZXIgZXhhbXBsZSB0aGF0IGZpbmRzIHRoZSBjb2x1bW4gd2hvc2Ugc3VtIG9mIGVsZW1lbnRzIGlzIHRoZSBtYXhpbXVtCisgd2l0aGluIGEgbWF0cml4LiBXaXRoIGNvbHVtbi13aXNlIHBhcnRpYWwgcmVkdWN0aW9ucyB0aGlzIGNhbiBiZSBjb2RlZCBhczoKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19tYXhub3JtLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfbWF4bm9ybS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGUgcHJldmlvdXMgZXhhbXBsZSBhcHBsaWVzIHRoZSBcbGluayBEZW5zZUJhc2U6OnN1bSgpIHN1bSgpIFxlbmRsaW5rIHJlZHVjdGlvbiBvbiBlYWNoIGNvbHVtbgordGhvdWdoIHRoZSBcbGluayBEZW5zZUJhc2U6OmNvbHdpc2UoKSBjb2x3aXNlKCkgXGVuZGxpbmsgdmlzaXRvciwgb2J0YWluaW5nIGEgbmV3IG1hdHJpeCB3aG9zZQorc2l6ZSBpcyAxeDQuCisKK1RoZXJlZm9yZSwgaWYKK1xmWworXG1ib3h7bX0gPSBcYmVnaW57Ym1hdHJpeH0gMSAmIDIgJiA2ICYgOSBcXAorICAgICAgICAgICAgICAgICAgICAzICYgMSAmIDcgJiAyIFxlbmR7Ym1hdHJpeH0KK1xmXQorCit0aGVuCisKK1xmWworXG1ib3h7bS5jb2x3aXNlKCkuc3VtKCl9ID0gXGJlZ2lue2JtYXRyaXh9IDQgJiAzICYgMTMgJiAxMSBcZW5ke2JtYXRyaXh9CitcZl0KKworVGhlIFxsaW5rIERlbnNlQmFzZTo6bWF4Q29lZmYoKSBtYXhDb2VmZigpIFxlbmRsaW5rIHJlZHVjdGlvbiBpcyBmaW5hbGx5IGFwcGxpZWQgCit0byBvYnRhaW4gdGhlIGNvbHVtbiBpbmRleCB3aGVyZSB0aGUgbWF4aW11bSBzdW0gaXMgZm91bmQsIAord2hpY2ggaXMgdGhlIGNvbHVtbiBpbmRleCAyICh0aGlyZCBjb2x1bW4pIGluIHRoaXMgY2FzZS4KKworCitcc2VjdGlvbiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ0Jyb2FkY2FzdGluZyBCcm9hZGNhc3RpbmcKK1RoZSBjb25jZXB0IGJlaGluZCBicm9hZGNhc3RpbmcgaXMgc2ltaWxhciB0byBwYXJ0aWFsIHJlZHVjdGlvbnMsIHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCBicm9hZGNhc3RpbmcgCitjb25zdHJ1Y3RzIGFuIGV4cHJlc3Npb24gd2hlcmUgYSB2ZWN0b3IgKGNvbHVtbiBvciByb3cpIGlzIGludGVycHJldGVkIGFzIGEgbWF0cml4IGJ5IHJlcGxpY2F0aW5nIGl0IGluIAorb25lIGRpcmVjdGlvbi4KKworQSBzaW1wbGUgZXhhbXBsZSBpcyB0byBhZGQgYSBjZXJ0YWluIGNvbHVtbi12ZWN0b3IgdG8gZWFjaCBjb2x1bW4gaW4gYSBtYXRyaXguIAorVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIHdpdGg6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF9zaW1wbGUub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworV2UgY2FuIGludGVycHJldCB0aGUgaW5zdHJ1Y3Rpb24gPHR0Pm1hdC5jb2x3aXNlKCkgKz0gdjwvdHQ+IGluIHR3byBlcXVpdmFsZW50IHdheXMuIEl0IGFkZHMgdGhlIHZlY3RvciBcYyB2Cit0byBldmVyeSBjb2x1bW4gb2YgdGhlIG1hdHJpeC4gQWx0ZXJuYXRpdmVseSwgaXQgY2FuIGJlIGludGVycHJldGVkIGFzIHJlcGVhdGluZyB0aGUgdmVjdG9yIFxjIHYgZm91ciB0aW1lcyB0bworZm9ybSBhIGZvdXItYnktdHdvIG1hdHJpeCB3aGljaCBpcyB0aGVuIGFkZGVkIHRvIFxjIG1hdDoKK1xmWworXGJlZ2lue2JtYXRyaXh9IDEgJiAyICYgNiAmIDkgXFwgMyAmIDEgJiA3ICYgMiBcZW5ke2JtYXRyaXh9CisrIFxiZWdpbntibWF0cml4fSAwICYgMCAmIDAgJiAwIFxcIDEgJiAxICYgMSAmIDEgXGVuZHtibWF0cml4fQorPSBcYmVnaW57Ym1hdHJpeH0gMSAmIDIgJiA2ICYgOSBcXCA0ICYgMiAmIDggJiAzIFxlbmR7Ym1hdHJpeH0uCitcZl0KK1RoZSBvcGVyYXRvcnMgPHR0Pi09PC90dD4sIDx0dD4rPC90dD4gYW5kIDx0dD4tPC90dD4gY2FuIGFsc28gYmUgdXNlZCBjb2x1bW4td2lzZSBhbmQgcm93LXdpc2UuIE9uIGFycmF5cywgd2UgCitjYW4gYWxzbyB1c2UgdGhlIG9wZXJhdG9ycyA8dHQ+Kj08L3R0PiwgPHR0Pi89PC90dD4sIDx0dD4qPC90dD4gYW5kIDx0dD4vPC90dD4gdG8gcGVyZm9ybSBjb2VmZmljaWVudC13aXNlIAorbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGNvbHVtbi13aXNlIG9yIHJvdy13aXNlLiBUaGVzZSBvcGVyYXRvcnMgYXJlIG5vdCBhdmFpbGFibGUgb24gbWF0cmljZXMgYmVjYXVzZSBpdAoraXMgbm90IGNsZWFyIHdoYXQgdGhleSB3b3VsZCBkby4gSWYgeW91IHdhbnQgbXVsdGlwbHkgY29sdW1uIDAgb2YgYSBtYXRyaXggXGMgbWF0IHdpdGggXGMgdigwKSwgY29sdW1uIDEgd2l0aCAKK1xjIHYoMSksIGFuZCBzbyBvbiwgdGhlbiB1c2UgPHR0Pm1hdCA9IG1hdCAqIHYuYXNEaWFnb25hbCgpPC90dD4uCisKK0l0IGlzIGltcG9ydGFudCB0byBwb2ludCBvdXQgdGhhdCB0aGUgdmVjdG9yIHRvIGJlIGFkZGVkIGNvbHVtbi13aXNlIG9yIHJvdy13aXNlIG11c3QgYmUgb2YgdHlwZSBWZWN0b3IsCithbmQgY2Fubm90IGJlIGEgTWF0cml4LiBJZiB0aGlzIGlzIG5vdCBtZXQgdGhlbiB5b3Ugd2lsbCBnZXQgY29tcGlsZS10aW1lIGVycm9yLiBUaGlzIGFsc28gbWVhbnMgdGhhdAorYnJvYWRjYXN0aW5nIG9wZXJhdGlvbnMgY2FuIG9ubHkgYmUgYXBwbGllZCB3aXRoIGFuIG9iamVjdCBvZiB0eXBlIFZlY3Rvciwgd2hlbiBvcGVyYXRpbmcgd2l0aCBNYXRyaXguCitUaGUgc2FtZSBhcHBsaWVzIGZvciB0aGUgQXJyYXkgY2xhc3MsIHdoZXJlIHRoZSBlcXVpdmFsZW50IGZvciBWZWN0b3JYZiBpcyBBcnJheVhmLiBBcyBhbHdheXMsIHlvdSBzaG91bGQKK25vdCBtaXggYXJyYXlzIGFuZCBtYXRyaWNlcyBpbiB0aGUgc2FtZSBleHByZXNzaW9uLgorCitUbyBwZXJmb3JtIHRoZSBzYW1lIG9wZXJhdGlvbiByb3ctd2lzZSB3ZSBjYW4gZG86CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZV9yb3d3aXNlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZV9yb3d3aXNlLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nQnJvYWRjYXN0aW5nQ29tYmluZWQgQ29tYmluaW5nIGJyb2FkY2FzdGluZyB3aXRoIG90aGVyIG9wZXJhdGlvbnMKK0Jyb2FkY2FzdGluZyBjYW4gYWxzbyBiZSBjb21iaW5lZCB3aXRoIG90aGVyIG9wZXJhdGlvbnMsIHN1Y2ggYXMgTWF0cml4IG9yIEFycmF5IG9wZXJhdGlvbnMsIAorcmVkdWN0aW9ucyBhbmQgcGFydGlhbCByZWR1Y3Rpb25zLgorCitOb3cgdGhhdCBicm9hZGNhc3RpbmcsIHJlZHVjdGlvbnMgYW5kIHBhcnRpYWwgcmVkdWN0aW9ucyBoYXZlIGJlZW4gaW50cm9kdWNlZCwgd2UgY2FuIGRpdmUgaW50byBhIG1vcmUgYWR2YW5jZWQgZXhhbXBsZSB0aGF0IGZpbmRzCit0aGUgbmVhcmVzdCBuZWlnaGJvdXIgb2YgYSB2ZWN0b3IgPHR0PnY8L3R0PiB3aXRoaW4gdGhlIGNvbHVtbnMgb2YgbWF0cml4IDx0dD5tPC90dD4uIFRoZSBFdWNsaWRlYW4gZGlzdGFuY2Ugd2lsbCBiZSB1c2VkIGluIHRoaXMgZXhhbXBsZSwKK2NvbXB1dGluZyB0aGUgc3F1YXJlZCBFdWNsaWRlYW4gZGlzdGFuY2Ugd2l0aCB0aGUgcGFydGlhbCByZWR1Y3Rpb24gbmFtZWQgXGxpbmsgTWF0cml4QmFzZTo6c3F1YXJlZE5vcm0oKSBzcXVhcmVkTm9ybSgpIFxlbmRsaW5rOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF8xbm4uY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3RfMW5uLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK1RoZSBsaW5lIHRoYXQgZG9lcyB0aGUgam9iIGlzIAorXGNvZGUKKyAgKG0uY29sd2lzZSgpIC0gdikuY29sd2lzZSgpLnNxdWFyZWROb3JtKCkubWluQ29lZmYoJmluZGV4KTsKK1xlbmRjb2RlCisKK1dlIHdpbGwgZ28gc3RlcCBieSBzdGVwIHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBoYXBwZW5pbmc6CisKKyAgLSA8dHQ+bS5jb2x3aXNlKCkgLSB2PC90dD4gaXMgYSBicm9hZGNhc3Rpbmcgb3BlcmF0aW9uLCBzdWJ0cmFjdGluZyA8dHQ+djwvdHQ+IGZyb20gZWFjaCBjb2x1bW4gaW4gPHR0Pm08L3R0Pi4gVGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbgoraXMgYSBuZXcgbWF0cml4IHdob3NlIHNpemUgaXMgdGhlIHNhbWUgYXMgbWF0cml4IDx0dD5tPC90dD46IFxmWworICBcbWJveHttLmNvbHdpc2UoKSAtIHZ9ID0gCisgIFxiZWdpbntibWF0cml4fQorICAgIC0xICYgMjEgJiA0ICYgNyBcXAorICAgICAwICYgOCAgJiA0ICYgLTEKKyAgXGVuZHtibWF0cml4fQorXGZdCisKKyAgLSA8dHQ+KG0uY29sd2lzZSgpIC0gdikuY29sd2lzZSgpLnNxdWFyZWROb3JtKCk8L3R0PiBpcyBhIHBhcnRpYWwgcmVkdWN0aW9uLCBjb21wdXRpbmcgdGhlIHNxdWFyZWQgbm9ybSBjb2x1bW4td2lzZS4gVGhlIHJlc3VsdCBvZgordGhpcyBvcGVyYXRpb24gaXMgYSByb3ctdmVjdG9yIHdoZXJlIGVhY2ggY29lZmZpY2llbnQgaXMgdGhlIHNxdWFyZWQgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gZWFjaCBjb2x1bW4gaW4gPHR0Pm08L3R0PiBhbmQgPHR0PnY8L3R0PjogXGZbCisgIFxtYm94eyhtLmNvbHdpc2UoKSAtIHYpLmNvbHdpc2UoKS5zcXVhcmVkTm9ybSgpfSA9CisgIFxiZWdpbntibWF0cml4fQorICAgICAxICYgNTA1ICYgMzIgJiA1MAorICBcZW5ke2JtYXRyaXh9CitcZl0KKworICAtIEZpbmFsbHksIDx0dD5taW5Db2VmZigmaW5kZXgpPC90dD4gaXMgdXNlZCB0byBvYnRhaW4gdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gPHR0Pm08L3R0PiB0aGF0IGlzIGNsb3Nlc3QgdG8gPHR0PnY8L3R0PiBpbiB0ZXJtcyBvZiBFdWNsaWRlYW4KK2Rpc3RhbmNlLgorCitcbGkgXGIgTmV4dDogXHJlZiBUdXRvcmlhbEdlb21ldHJ5CisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DMDhfVHV0b3JpYWxHZW9tZXRyeS5kb3ggYi9kb2MvQzA4X1R1dG9yaWFsR2VvbWV0cnkuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTllYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvQzA4X1R1dG9yaWFsR2VvbWV0cnkuZG94CkBAIC0wLDAgKzEsMjUxIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVHV0b3JpYWxHZW9tZXRyeSBUdXRvcmlhbCBwYWdlIDggLSBHZW9tZXRyeQorICAgIFxpbmdyb3VwIFR1dG9yaWFsCisKK1xsaSBcYiBQcmV2aW91czogXHJlZiBUdXRvcmlhbFJlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZworXGxpIFxiIE5leHQ6IFxyZWYgVHV0b3JpYWxTcGFyc2UKKworSW4gdGhpcyB0dXRvcmlhbCwgd2Ugd2lsbCBicmllZmx5IGludHJvZHVjZSB0aGUgbWFueSBwb3NzaWJpbGl0aWVzIG9mZmVyZWQgYnkgdGhlIFxyZWYgR2VvbWV0cnlfTW9kdWxlICJnZW9tZXRyeSBtb2R1bGUiLCBuYW1lbHkgMkQgYW5kIDNEIHJvdGF0aW9ucyBhbmQgcHJvamVjdGl2ZSBvciBhZmZpbmUgdHJhbnNmb3JtYXRpb25zLgorCitcYiBUYWJsZSBcYiBvZiBcYiBjb250ZW50cworICAtIFxyZWYgVHV0b3JpYWxHZW9FbGVtZW50YXJ5VHJhbnNmb3JtYXRpb25zCisgIC0gXHJlZiBUdXRvcmlhbEdlb0NvbW1vbnRyYW5zZm9ybWF0aW9uQVBJCisgIC0gXHJlZiBUdXRvcmlhbEdlb1RyYW5zZm9ybQorICAtIFxyZWYgVHV0b3JpYWxHZW9FdWxlckFuZ2xlcworCitFaWdlbidzIEdlb21ldHJ5IG1vZHVsZSBwcm92aWRlcyB0d28gZGlmZmVyZW50IGtpbmRzIG9mIGdlb21ldHJpYyB0cmFuc2Zvcm1hdGlvbnM6CisgIC0gQWJzdHJhY3QgdHJhbnNmb3JtYXRpb25zLCBzdWNoIGFzIHJvdGF0aW9ucyAocmVwcmVzZW50ZWQgYnkgXHJlZiBBbmdsZUF4aXMgImFuZ2xlIGFuZCBheGlzIiBvciBieSBhIFxyZWYgUXVhdGVybmlvbiAicXVhdGVybmlvbiIpLCBccmVmIFRyYW5zbGF0aW9uICJ0cmFuc2xhdGlvbnMiLCBccmVmIFNjYWxpbmcgInNjYWxpbmdzIi4gVGhlc2UgdHJhbnNmb3JtYXRpb25zIGFyZSBOT1QgcmVwcmVzZW50ZWQgYXMgbWF0cmljZXMsIGJ1dCB5b3UgY2FuIG5ldmVydGhlbGVzcyBtaXggdGhlbSB3aXRoIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIGluIGV4cHJlc3Npb25zLCBhbmQgY29udmVydCB0aGVtIHRvIG1hdHJpY2VzIGlmIHlvdSB3aXNoLgorICAtIFByb2plY3RpdmUgb3IgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzOiBzZWUgdGhlIFRyYW5zZm9ybSBjbGFzcy4gVGhlc2UgYXJlIHJlYWxseSBtYXRyaWNlcy4KKworXG5vdGUgSWYgeW91IGFyZSB3b3JraW5nIHdpdGggT3BlbkdMIDR4NCBtYXRyaWNlcyB0aGVuIEFmZmluZTNmIGFuZCBBZmZpbmUzZCBhcmUgd2hhdCB5b3Ugd2FudC4gU2luY2UgRWlnZW4gZGVmYXVsdHMgdG8gY29sdW1uLW1ham9yIHN0b3JhZ2UsIHlvdSBjYW4gZGlyZWN0bHkgdXNlIHRoZSBUcmFuc2Zvcm06OmRhdGEoKSBtZXRob2QgdG8gcGFzcyB5b3VyIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byBPcGVuR0wuCisKK1lvdSBjYW4gY29uc3RydWN0IGEgVHJhbnNmb3JtIGZyb20gYW4gYWJzdHJhY3QgdHJhbnNmb3JtYXRpb24sIGxpa2UgdGhpczoKK1xjb2RlCisgIFRyYW5zZm9ybSB0KEFuZ2xlQXhpcyhhbmdsZSxheGlzKSk7CitcZW5kY29kZQorb3IgbGlrZSB0aGlzOgorXGNvZGUKKyAgVHJhbnNmb3JtIHQ7CisgIHQgPSBBbmdsZUF4aXMoYW5nbGUsYXhpcyk7CitcZW5kY29kZQorQnV0IG5vdGUgdGhhdCB1bmZvcnR1bmF0ZWx5LCBiZWNhdXNlIG9mIGhvdyBDKysgd29ya3MsIHlvdSBjYW4gXGIgbm90IGRvIHRoaXM6CitcY29kZQorICBUcmFuc2Zvcm0gdCA9IEFuZ2xlQXhpcyhhbmdsZSxheGlzKTsKK1xlbmRjb2RlCis8c3BhbiBjbGFzcz0ibm90ZSI+XGIgRXhwbGFuYXRpb246IEluIHRoZSBDKysgbGFuZ3VhZ2UsIHRoaXMgd291bGQgcmVxdWlyZSBUcmFuc2Zvcm0gdG8gaGF2ZSBhIG5vbi1leHBsaWNpdCBjb252ZXJzaW9uIGNvbnN0cnVjdG9yIGZyb20gQW5nbGVBeGlzLCBidXQgd2UgcmVhbGx5IGRvbid0IHdhbnQgdG8gYWxsb3cgaW1wbGljaXQgY2FzdGluZyBoZXJlLgorPC9zcGFuPgorCitcc2VjdGlvbiBUdXRvcmlhbEdlb0VsZW1lbnRhcnlUcmFuc2Zvcm1hdGlvbnMgVHJhbnNmb3JtYXRpb24gdHlwZXMKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5UcmFuc2Zvcm1hdGlvbiB0eXBlPC90aD48dGg+VHlwaWNhbCBpbml0aWFsaXphdGlvbiBjb2RlPC90aD48L3RyPgorPHRyPjx0ZD4KK1xyZWYgUm90YXRpb24yRCAiMkQgcm90YXRpb24iIGZyb20gYW4gYW5nbGU8L3RkPjx0ZD5cY29kZQorUm90YXRpb24yRDxmbG9hdD4gcm90MihhbmdsZV9pbl9yYWRpYW4pO1xlbmRjb2RlPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD4KKzNEIHJvdGF0aW9uIGFzIGFuIFxyZWYgQW5nbGVBeGlzICJhbmdsZSArIGF4aXMiPC90ZD48dGQ+XGNvZGUKK0FuZ2xlQXhpczxmbG9hdD4gYWEoYW5nbGVfaW5fcmFkaWFuLCBWZWN0b3IzZihheCxheSxheikpO1xlbmRjb2RlCis8c3BhbiBjbGFzcz0ibm90ZSI+VGhlIGF4aXMgdmVjdG9yIG11c3QgYmUgbm9ybWFsaXplZC48L3NwYW4+PC90ZD48L3RyPgorPHRyPjx0ZD4KKzNEIHJvdGF0aW9uIGFzIGEgXHJlZiBRdWF0ZXJuaW9uICJxdWF0ZXJuaW9uIjwvdGQ+PHRkPlxjb2RlCitRdWF0ZXJuaW9uPGZsb2F0PiBxOyAgcSA9IEFuZ2xlQXhpczxmbG9hdD4oYW5nbGVfaW5fcmFkaWFuLCBheGlzKTtcZW5kY29kZTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+CitOLUQgU2NhbGluZzwvdGQ+PHRkPlxjb2RlCitTY2FsaW5nKHN4LCBzeSkKK1NjYWxpbmcoc3gsIHN5LCBzeikKK1NjYWxpbmcocykKK1NjYWxpbmcodmVjTilcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+CitOLUQgVHJhbnNsYXRpb248L3RkPjx0ZD5cY29kZQorVHJhbnNsYXRpb248ZmxvYXQsMj4odHgsIHR5KQorVHJhbnNsYXRpb248ZmxvYXQsMz4odHgsIHR5LCB0eikKK1RyYW5zbGF0aW9uPGZsb2F0LE4+KHMpCitUcmFuc2xhdGlvbjxmbG9hdCxOPih2ZWNOKVxlbmRjb2RlPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD4KK04tRCBccmVmIFR1dG9yaWFsR2VvVHJhbnNmb3JtICJBZmZpbmUgdHJhbnNmb3JtYXRpb24iPC90ZD48dGQ+XGNvZGUKK1RyYW5zZm9ybTxmbG9hdCxOLEFmZmluZT4gdCA9IGNvbmNhdGVuYXRpb25fb2ZfYW55X3RyYW5zZm9ybWF0aW9uczsKK1RyYW5zZm9ybTxmbG9hdCwzLEFmZmluZT4gdCA9IFRyYW5zbGF0aW9uM2YocCkgKiBBbmdsZUF4aXNmKGEsYXhpcykgKiBTY2FsaW5nKHMpO1xlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD4KK04tRCBMaW5lYXIgdHJhbnNmb3JtYXRpb25zIFxuCis8ZW0gY2xhc3M9bm90ZT4ocHVyZSByb3RhdGlvbnMsIFxuIHNjYWxpbmcsIGV0Yy4pPC9lbT48L3RkPjx0ZD5cY29kZQorTWF0cml4PGZsb2F0LE4+IHQgPSBjb25jYXRlbmF0aW9uX29mX3JvdGF0aW9uc19hbmRfc2NhbGluZ3M7CitNYXRyaXg8ZmxvYXQsMj4gdCA9IFJvdGF0aW9uMkRmKGEpICogU2NhbGluZyhzKTsKK01hdHJpeDxmbG9hdCwzPiB0ID0gQW5nbGVBeGlzZihhLGF4aXMpICogU2NhbGluZyhzKTtcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKKzxzdHJvbmc+Tm90ZXMgb24gcm90YXRpb25zPC9zdHJvbmc+XG4gVG8gdHJhbnNmb3JtIG1vcmUgdGhhbiBhIHNpbmdsZSB2ZWN0b3IgdGhlIHByZWZlcnJlZAorcmVwcmVzZW50YXRpb25zIGFyZSByb3RhdGlvbiBtYXRyaWNlcywgd2hpbGUgZm9yIG90aGVyIHVzYWdlcyBRdWF0ZXJuaW9uIGlzIHRoZQorcmVwcmVzZW50YXRpb24gb2YgY2hvaWNlIGFzIHRoZXkgYXJlIGNvbXBhY3QsIGZhc3QgYW5kIHN0YWJsZS4gRmluYWxseSBSb3RhdGlvbjJEIGFuZAorQW5nbGVBeGlzIGFyZSBtYWlubHkgY29udmVuaWVudCB0eXBlcyB0byBjcmVhdGUgb3RoZXIgcm90YXRpb24gb2JqZWN0cy4KKworPHN0cm9uZz5Ob3RlcyBvbiBUcmFuc2xhdGlvbiBhbmQgU2NhbGluZzwvc3Ryb25nPlxuIExpa2UgQW5nbGVBeGlzLCB0aGVzZSBjbGFzc2VzIHdlcmUKK2Rlc2lnbmVkIHRvIHNpbXBsaWZ5IHRoZSBjcmVhdGlvbi9pbml0aWFsaXphdGlvbiBvZiBsaW5lYXIgKE1hdHJpeCkgYW5kIGFmZmluZSAoVHJhbnNmb3JtKQordHJhbnNmb3JtYXRpb25zLiBOZXZlcnRoZWxlc3MsIHVubGlrZSBBbmdsZUF4aXMgd2hpY2ggaXMgaW5lZmZpY2llbnQgdG8gdXNlLCB0aGVzZSBjbGFzc2VzCittaWdodCBzdGlsbCBiZSBpbnRlcmVzdGluZyB0byB3cml0ZSBnZW5lcmljIGFuZCBlZmZpY2llbnQgYWxnb3JpdGhtcyB0YWtpbmcgYXMgaW5wdXQgYW55CitraW5kIG9mIHRyYW5zZm9ybWF0aW9ucy4KKworQW55IG9mIHRoZSBhYm92ZSB0cmFuc2Zvcm1hdGlvbiB0eXBlcyBjYW4gYmUgY29udmVydGVkIHRvIGFueSBvdGhlciB0eXBlcyBvZiB0aGUgc2FtZSBuYXR1cmUsCitvciB0byBhIG1vcmUgZ2VuZXJpYyB0eXBlLiBIZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgZXhhbXBsZXM6Cis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRkPlxjb2RlCitSb3RhdGlvbjJEZiByOyAgciAgPSBNYXRyaXgyZiguLik7ICAgICAgIC8vIGFzc3VtZXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeAorQW5nbGVBeGlzZiBhYTsgIGFhID0gUXVhdGVybmlvbmYoLi4pOworQW5nbGVBeGlzZiBhYTsgIGFhID0gTWF0cml4M2YoLi4pOyAgICAgICAvLyBhc3N1bWVzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXgKK01hdHJpeDJmIG07ICAgICBtICA9IFJvdGF0aW9uMkRmKC4uKTsKK01hdHJpeDNmIG07ICAgICBtICA9IFF1YXRlcm5pb25mKC4uKTsgICAgICAgTWF0cml4M2YgbTsgICBtID0gU2NhbGluZyguLik7CitBZmZpbmUzZiBtOyAgICAgbSAgPSBBbmdsZUF4aXMzZiguLik7ICAgICAgIEFmZmluZTNmIG07ICAgbSA9IFNjYWxpbmcoLi4pOworQWZmaW5lM2YgbTsgICAgIG0gID0gVHJhbnNsYXRpb24zZiguLik7ICAgICBBZmZpbmUzZiBtOyAgIG0gPSBNYXRyaXgzZiguLik7CitcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKKworPGEgaHJlZj0iIyIgY2xhc3M9InRvcCI+dG9wPC9hPlxzZWN0aW9uIFR1dG9yaWFsR2VvQ29tbW9udHJhbnNmb3JtYXRpb25BUEkgQ29tbW9uIEFQSSBhY3Jvc3MgdHJhbnNmb3JtYXRpb24gdHlwZXMKKworVG8gc29tZSBleHRlbnQsIEVpZ2VuJ3MgXHJlZiBHZW9tZXRyeV9Nb2R1bGUgImdlb21ldHJ5IG1vZHVsZSIgYWxsb3dzIHlvdSB0byB3cml0ZQorZ2VuZXJpYyBhbGdvcml0aG1zIHdvcmtpbmcgb24gYW55IGtpbmQgb2YgdHJhbnNmb3JtYXRpb24gcmVwcmVzZW50YXRpb25zOgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD4KK0NvbmNhdGVuYXRpb24gb2YgdHdvIHRyYW5zZm9ybWF0aW9uczwvdGQ+PHRkPlxjb2RlCitnZW4xICogZ2VuMjtcZW5kY29kZTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+QXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGEgdmVjdG9yPC90ZD48dGQ+XGNvZGUKK3ZlYzIgPSBnZW4xICogdmVjMTtcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+R2V0IHRoZSBpbnZlcnNlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbjwvdGQ+PHRkPlxjb2RlCitnZW4yID0gZ2VuMS5pbnZlcnNlKCk7XGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPlNwaGVyaWNhbCBpbnRlcnBvbGF0aW9uIFxuIChSb3RhdGlvbjJEIGFuZCBRdWF0ZXJuaW9uIG9ubHkpPC90ZD48dGQ+XGNvZGUKK3JvdDMgPSByb3QxLnNsZXJwKGFscGhhLHJvdDIpO1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KKworCisKKzxhIGhyZWY9IiMiIGNsYXNzPSJ0b3AiPnRvcDwvYT5cc2VjdGlvbiBUdXRvcmlhbEdlb1RyYW5zZm9ybSBBZmZpbmUgdHJhbnNmb3JtYXRpb25zCitHZW5lcmljIGFmZmluZSB0cmFuc2Zvcm1hdGlvbnMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBUcmFuc2Zvcm0gY2xhc3Mgd2hpY2ggaW50ZXJuYWx5CitpcyBhIChEaW0rMSleMiBtYXRyaXguIEluIEVpZ2VuIHdlIGhhdmUgY2hvc2VuIHRvIG5vdCBkaXN0aW5naGlzaCBiZXR3ZWVuIHBvaW50cyBhbmQKK3ZlY3RvcnMgc3VjaCB0aGF0IGFsbCBwb2ludHMgYXJlIGFjdHVhbGx5IHJlcHJlc2VudGVkIGJ5IGRpc3BsYWNlbWVudCB2ZWN0b3JzIGZyb20gdGhlCitvcmlnaW4gKCBcZiQgXG1hdGhiZntwfSBcZXF1aXYgXG1hdGhiZntwfS0wIFxmJCApLiBXaXRoIHRoYXQgaW4gbWluZCwgcmVhbCBwb2ludHMgYW5kCit2ZWN0b3IgZGlzdGluZ3Vpc2ggd2hlbiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgYXBwbGllZC4KKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+CitBcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYSBcYiBwb2ludCA8L3RkPjx0ZD5cY29kZQorVmVjdG9yTmYgcDEsIHAyOworcDIgPSB0ICogcDE7XGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPgorQXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGEgXGIgdmVjdG9yIDwvdGQ+PHRkPlxjb2RlCitWZWN0b3JOZiB2ZWMxLCB2ZWMyOwordmVjMiA9IHQubGluZWFyKCkgKiB2ZWMxO1xlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD4KK0FwcGx5IGEgXGVtIGdlbmVyYWwgdHJhbnNmb3JtYXRpb24gXG4gdG8gYSBcYiBub3JtYWwgXGIgdmVjdG9yCisoPGEgaHJlZj0iaHR0cDovL3d3dy5jZ2FmYXEuaW5mby93aWtpL1RyYW5zZm9ybWluZ19ub3JtYWxzIj5leHBsYW5hdGlvbnM8L2E+KTwvdGQ+PHRkPlxjb2RlCitWZWN0b3JOZiBuMSwgbjI7CitNYXRyaXhOZiBub3JtYWxNYXRyaXggPSB0LmxpbmVhcigpLmludmVyc2UoKS50cmFuc3Bvc2UoKTsKK24yID0gKG5vcm1hbE1hdHJpeCAqIG4xKS5ub3JtYWxpemVkKCk7XGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPgorQXBwbHkgYSB0cmFuc2Zvcm1hdGlvbiB3aXRoIFxlbSBwdXJlIFxlbSByb3RhdGlvbiBcbiB0byBhIFxiIG5vcm1hbCBcYiB2ZWN0b3IKKyhubyBzY2FsaW5nLCBubyBzaGVhcik8L3RkPjx0ZD5cY29kZQorbjIgPSB0LmxpbmVhcigpICogbjE7XGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkPgorT3BlbkdMIGNvbXBhdGliaWxpdHkgXGIgM0QgPC90ZD48dGQ+XGNvZGUKK2dsTG9hZE1hdHJpeGYodC5kYXRhKCkpO1xlbmRjb2RlPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD4KK09wZW5HTCBjb21wYXRpYmlsaXR5IFxiIDJEIDwvdGQ+PHRkPlxjb2RlCitBZmZpbmUzZiBhdXgoQWZmaW5lM2Y6OklkZW50aXR5KCkpOworYXV4LmxpbmVhcigpLnRvcExlZnRDb3JuZXI8MiwyPigpID0gdC5saW5lYXIoKTsKK2F1eC50cmFuc2xhdGlvbigpLnN0YXJ0PDI+KCkgPSB0LnRyYW5zbGF0aW9uKCk7CitnbExvYWRNYXRyaXhmKGF1eC5kYXRhKCkpO1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KKworXGIgQ29tcG9uZW50IFxiIGFjY2Vzc29ycworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD4KK2Z1bGwgcmVhZC13cml0ZSBhY2Nlc3MgdG8gdGhlIGludGVybmFsIG1hdHJpeDwvdGQ+PHRkPlxjb2RlCit0Lm1hdHJpeCgpID0gbWF0TjF4TjE7ICAgIC8vIE4xIG1lYW5zIE4rMQorbWF0TjF4TjEgPSB0Lm1hdHJpeCgpOworXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPgorY29lZmZpY2llbnQgYWNjZXNzb3JzPC90ZD48dGQ+XGNvZGUKK3QoaSxqKSA9IHNjYWxhcjsgICA8PT4gICB0Lm1hdHJpeCgpKGksaikgPSBzY2FsYXI7CitzY2FsYXIgPSB0KGksaik7ICAgPD0+ICAgc2NhbGFyID0gdC5tYXRyaXgoKShpLGopOworXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkPgordHJhbnNsYXRpb24gcGFydDwvdGQ+PHRkPlxjb2RlCit0LnRyYW5zbGF0aW9uKCkgPSB2ZWNOOwordmVjTiA9IHQudHJhbnNsYXRpb24oKTsKK1xlbmRjb2RlPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD4KK2xpbmVhciBwYXJ0PC90ZD48dGQ+XGNvZGUKK3QubGluZWFyKCkgPSBtYXROeE47CittYXROeE4gPSB0LmxpbmVhcigpOworXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkPgorZXh0cmFjdCB0aGUgcm90YXRpb24gbWF0cml4PC90ZD48dGQ+XGNvZGUKK21hdE54TiA9IHQuZXh0cmFjdFJvdGF0aW9uKCk7CitcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKKworXGIgVHJhbnNmb3JtYXRpb24gXGIgY3JlYXRpb24gXG4KK1doaWxlIHRyYW5zZm9ybWF0aW9uIG9iamVjdHMgY2FuIGJlIGNyZWF0ZWQgYW5kIHVwZGF0ZWQgY29uY2F0ZW5hdGluZyBlbGVtZW50YXJ5IHRyYW5zZm9ybWF0aW9ucywKK3RoZSBUcmFuc2Zvcm0gY2xhc3MgYWxzbyBmZWF0dXJlcyBhIHByb2NlZHVyYWwgQVBJOgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD48L3RoPjx0aD5wcm9jZWR1cmFsIEFQSTwvdGg+PHRoPmVxdWl2YWxlbnQgbmF0dXJhbCBBUEkgPC90aD48L3RyPgorPHRyPjx0ZD5UcmFuc2xhdGlvbjwvdGQ+PHRkPlxjb2RlCit0LnRyYW5zbGF0ZShWZWN0b3JfKHR4LHR5LC4uKSk7Cit0LnByZXRyYW5zbGF0ZShWZWN0b3JfKHR4LHR5LC4uKSk7CitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCit0ICo9IFRyYW5zbGF0aW9uXyh0eCx0eSwuLik7Cit0ID0gVHJhbnNsYXRpb25fKHR4LHR5LC4uKSAqIHQ7CitcZW5kY29kZTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+XGIgUm90YXRpb24gXG4gPGVtIGNsYXNzPSJub3RlIj5JbiAyRCBhbmQgZm9yIHRoZSBwcm9jZWR1cmFsIEFQSSwgYW55X3JvdGF0aW9uIGNhbiBhbHNvIFxuIGJlIGFuIGFuZ2xlIGluIHJhZGlhbjwvZW0+PC90ZD48dGQ+XGNvZGUKK3Qucm90YXRlKGFueV9yb3RhdGlvbik7Cit0LnByZXJvdGF0ZShhbnlfcm90YXRpb24pOworXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQordCAqPSBhbnlfcm90YXRpb247Cit0ID0gYW55X3JvdGF0aW9uICogdDsKK1xlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD5TY2FsaW5nPC90ZD48dGQ+XGNvZGUKK3Quc2NhbGUoVmVjdG9yXyhzeCxzeSwuLikpOwordC5zY2FsZShzKTsKK3QucHJlc2NhbGUoVmVjdG9yXyhzeCxzeSwuLikpOwordC5wcmVzY2FsZShzKTsKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK3QgKj0gU2NhbGluZyhzeCxzeSwuLik7Cit0ICo9IFNjYWxpbmcocyk7Cit0ID0gU2NhbGluZyhzeCxzeSwuLikgKiB0OwordCA9IFNjYWxpbmcocykgKiB0OworXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPlNoZWFyIHRyYW5zZm9ybWF0aW9uIFxuICggXGIgMkQgXGIgb25seSAhICk8L3RkPjx0ZD5cY29kZQordC5zaGVhcihzeCxzeSk7Cit0LnByZXNoZWFyKHN4LHN5KTsKK1xlbmRjb2RlPC90ZD48dGQ+PC90ZD48L3RyPgorPC90YWJsZT4KKworTm90ZSB0aGF0IGluIGJvdGggQVBJLCBhbnkgbWFueSB0cmFuc2Zvcm1hdGlvbnMgY2FuIGJlIGNvbmNhdGVuYXRlZCBpbiBhIHNpbmdsZSBleHByZXNzaW9uIGFzIHNob3duIGluIHRoZSB0d28gZm9sbG93aW5nIGVxdWl2YWxlbnQgZXhhbXBsZXM6Cis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRkPlxjb2RlCit0LnByZXRyYW5zbGF0ZSguLikucm90YXRlKC4uKS50cmFuc2xhdGUoLi4pLnNjYWxlKC4uKTsKK1xlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZQordCA9IFRyYW5zbGF0aW9uXyguLikgKiB0ICogUm90YXRpb25UeXBlKC4uKSAqIFRyYW5zbGF0aW9uXyguLikgKiBTY2FsaW5nKC4uKTsKK1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KKworCisKKzxhIGhyZWY9IiMiIGNsYXNzPSJ0b3AiPnRvcDwvYT5cc2VjdGlvbiBUdXRvcmlhbEdlb0V1bGVyQW5nbGVzIEV1bGVyIGFuZ2xlcworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZCBzdHlsZT0ibWF4LXdpZHRoOjMwZW07Ij4KK0V1bGVyIGFuZ2xlcyBtaWdodCBiZSBjb252ZW5pZW50IHRvIGNyZWF0ZSByb3RhdGlvbiBvYmplY3RzLgorT24gdGhlIG90aGVyIGhhbmQsIHNpbmNlIHRoZXJlIGV4aXN0IDI0IGRpZmZlcmVudCBjb252ZW50aW9ucywgdGhleSBhcmUgcHJldHR5IGNvbmZ1c2luZyB0byB1c2UuIFRoaXMgZXhhbXBsZSBzaG93cyBob3cKK3RvIGNyZWF0ZSBhIHJvdGF0aW9uIG1hdHJpeCBhY2NvcmRpbmcgdG8gdGhlIDItMS0yIGNvbnZlbnRpb24uPC90ZD48dGQ+XGNvZGUKK01hdHJpeDNmIG07CittID0gQW5nbGVBeGlzZihhbmdsZTEsIFZlY3RvcjNmOjpVbml0WigpKQorKiAgKiBBbmdsZUF4aXNmKGFuZ2xlMiwgVmVjdG9yM2Y6OlVuaXRZKCkpCisqICAqIEFuZ2xlQXhpc2YoYW5nbGUzLCBWZWN0b3IzZjo6VW5pdFooKSk7CitcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKK1xsaSBcYiBOZXh0OiBccmVmIFR1dG9yaWFsU3BhcnNlCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DMDlfVHV0b3JpYWxTcGFyc2UuZG94IGIvZG9jL0MwOV9UdXRvcmlhbFNwYXJzZS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxNTRiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9DMDlfVHV0b3JpYWxTcGFyc2UuZG94CkBAIC0wLDAgKzEsNDU1IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVHV0b3JpYWxTcGFyc2UgVHV0b3JpYWwgcGFnZSA5IC0gU3BhcnNlIE1hdHJpeAorICAgIFxpbmdyb3VwIFR1dG9yaWFsCisKK1xsaSBcYiBQcmV2aW91czogXHJlZiBUdXRvcmlhbEdlb21ldHJ5CitcbGkgXGIgTmV4dDogXHJlZiBUdXRvcmlhbE1hcENsYXNzCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzIFxuCisgIC0gXHJlZiBUdXRvcmlhbFNwYXJzZUludHJvCisgIC0gXHJlZiBUdXRvcmlhbFNwYXJzZUV4YW1wbGUgIkV4YW1wbGUiCisgIC0gXHJlZiBUdXRvcmlhbFNwYXJzZVNwYXJzZU1hdHJpeAorICAtIFxyZWYgVHV0b3JpYWxTcGFyc2VGaWxsaW5nCisgIC0gXHJlZiBUdXRvcmlhbFNwYXJzZURpcmVjdFNvbHZlcnMKKyAgLSBccmVmIFR1dG9yaWFsU3BhcnNlRmVhdHVyZVNldAorICAgIC0gXHJlZiBUdXRvcmlhbFNwYXJzZV9CYXNpY09wcworICAgIC0gXHJlZiBUdXRvcmlhbFNwYXJzZV9Qcm9kdWN0cworICAgIC0gXHJlZiBUdXRvcmlhbFNwYXJzZV9Ucmlhbmd1bGFyU2VsZmFkam9pbnQKKyAgICAtIFxyZWYgVHV0b3JpYWxTcGFyc2VfU3VibWF0CisKKworPGhyPgorCitNYW5pcHVsYXRpbmcgYW5kIHNvbHZpbmcgc3BhcnNlIHByb2JsZW1zIGludm9sdmVzIHZhcmlvdXMgbW9kdWxlcyB3aGljaCBhcmUgc3VtbWFyaXplZCBiZWxvdzoKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5Nb2R1bGU8L3RoPjx0aD5IZWFkZXIgZmlsZTwvdGg+PHRoPkNvbnRlbnRzPC90aD48L3RyPgorPHRyPjx0ZD5cbGluayBTcGFyc2VfTW9kdWxlIFNwYXJzZUNvcmUgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9TcGFyc2VDb3JlPlxlbmRjb2RlPC90ZD48dGQ+U3BhcnNlTWF0cml4IGFuZCBTcGFyc2VWZWN0b3IgY2xhc3NlcywgbWF0cml4IGFzc2VtYmx5LCBiYXNpYyBzcGFyc2UgbGluZWFyIGFsZ2VicmEgKGluY2x1ZGluZyBzcGFyc2UgdHJpYW5ndWxhciBzb2x2ZXJzKTwvdGQ+PC90cj4KKzx0cj48dGQ+XGxpbmsgU3BhcnNlQ2hvbGVza3lfTW9kdWxlIFNwYXJzZUNob2xlc2t5IFxlbmRsaW5rPC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vU3BhcnNlQ2hvbGVza3k+XGVuZGNvZGU8L3RkPjx0ZD5EaXJlY3Qgc3BhcnNlIExMVCBhbmQgTERMVCBDaG9sZXNreSBmYWN0b3JpemF0aW9uIHRvIHNvbHZlIHNwYXJzZSBzZWxmLWFkam9pbnQgcG9zaXRpdmUgZGVmaW5pdGUgcHJvYmxlbXM8L3RkPjwvdHI+Cis8dHI+PHRkPlxsaW5rIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnMgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzPlxlbmRjb2RlPC90ZD48dGQ+SXRlcmF0aXZlIHNvbHZlcnMgdG8gc29sdmUgbGFyZ2UgZ2VuZXJhbCBsaW5lYXIgc3F1YXJlIHByb2JsZW1zIChpbmNsdWRpbmcgc2VsZi1hZGpvaW50IHBvc2l0aXZlIGRlZmluaXRlIHByb2JsZW1zKTwvdGQ+PC90cj4KKzx0cj48dGQ+PC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vU3BhcnNlPlxlbmRjb2RlPC90ZD48dGQ+SW5jbHVkZXMgYWxsIHRoZSBhYm92ZSBtb2R1bGVzPC90ZD48L3RyPgorPC90YWJsZT4KKworXHNlY3Rpb24gVHV0b3JpYWxTcGFyc2VJbnRybyBTcGFyc2UgbWF0cml4IHJlcHJlc2VudGF0aW9uCisKK0luIG1hbnkgYXBwbGljYXRpb25zIChlLmcuLCBmaW5pdGUgZWxlbWVudCBtZXRob2RzKSBpdCBpcyBjb21tb24gdG8gZGVhbCB3aXRoIHZlcnkgbGFyZ2UgbWF0cmljZXMgd2hlcmUgb25seSBhIGZldyBjb2VmZmljaWVudHMgYXJlIGRpZmZlcmVudCBmcm9tIHplcm8uICBJbiBzdWNoIGNhc2VzLCBtZW1vcnkgY29uc3VtcHRpb24gY2FuIGJlIHJlZHVjZWQgYW5kIHBlcmZvcm1hbmNlIGluY3JlYXNlZCBieSB1c2luZyBhIHNwZWNpYWxpemVkIHJlcHJlc2VudGF0aW9uIHN0b3Jpbmcgb25seSB0aGUgbm9uemVybyBjb2VmZmljaWVudHMuIFN1Y2ggYSBtYXRyaXggaXMgY2FsbGVkIGEgc3BhcnNlIG1hdHJpeC4KKworXGIgVGhlIFxiICVTcGFyc2VNYXRyaXggXGIgY2xhc3MKKworVGhlIGNsYXNzIFNwYXJzZU1hdHJpeCBpcyB0aGUgbWFpbiBzcGFyc2UgbWF0cml4IHJlcHJlc2VudGF0aW9uIG9mIEVpZ2VuJ3Mgc3BhcnNlIG1vZHVsZTsgaXQgb2ZmZXJzIGhpZ2ggcGVyZm9ybWFuY2UgYW5kIGxvdyBtZW1vcnkgdXNhZ2UuCitJdCBpbXBsZW1lbnRzIGEgbW9yZSB2ZXJzYXRpbGUgdmFyaWFudCBvZiB0aGUgd2lkZWx5LXVzZWQgQ29tcHJlc3NlZCBDb2x1bW4gKG9yIFJvdykgU3RvcmFnZSBzY2hlbWUuCitJdCBjb25zaXN0cyBvZiBmb3VyIGNvbXBhY3QgYXJyYXlzOgorIC0gXGMgVmFsdWVzOiBzdG9yZXMgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvZiB0aGUgbm9uLXplcm9zLgorIC0gXGMgSW5uZXJJbmRpY2VzOiBzdG9yZXMgdGhlIHJvdyAocmVzcC4gY29sdW1uKSBpbmRpY2VzIG9mIHRoZSBub24temVyb3MuCisgLSBcYyBPdXRlclN0YXJ0czogc3RvcmVzIGZvciBlYWNoIGNvbHVtbiAocmVzcC4gcm93KSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5vbi16ZXJvIGluIHRoZSBwcmV2aW91cyB0d28gYXJyYXlzLgorIC0gXGMgSW5uZXJOTlpzOiBzdG9yZXMgdGhlIG51bWJlciBvZiBub24temVyb3Mgb2YgZWFjaCBjb2x1bW4gKHJlc3AuIHJvdykuCitUaGUgd29yZCBcYyBpbm5lciByZWZlcnMgdG8gYW4gXGVtIGlubmVyIFxlbSB2ZWN0b3IgdGhhdCBpcyBhIGNvbHVtbiBmb3IgYSBjb2x1bW4tbWFqb3IgbWF0cml4LCBvciBhIHJvdyBmb3IgYSByb3ctbWFqb3IgbWF0cml4LgorVGhlIHdvcmQgXGMgb3V0ZXIgcmVmZXJzIHRvIHRoZSBvdGhlciBkaXJlY3Rpb24uCisKK1RoaXMgc3RvcmFnZSBzY2hlbWUgaXMgYmV0dGVyIGV4cGxhaW5lZCBvbiBhbiBleGFtcGxlLiBUaGUgZm9sbG93aW5nIG1hdHJpeAorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD4gMDwvdGQ+PHRkPjM8L3RkPjx0ZD4gMDwvdGQ+PHRkPjA8L3RkPjx0ZD4gMDwvdGQ+PC90cj4KKzx0cj48dGQ+MjI8L3RkPjx0ZD4wPC90ZD48dGQ+IDA8L3RkPjx0ZD4wPC90ZD48dGQ+MTc8L3RkPjwvdHI+Cis8dHI+PHRkPiA3PC90ZD48dGQ+NTwvdGQ+PHRkPiAwPC90ZD48dGQ+MTwvdGQ+PHRkPiAwPC90ZD48L3RyPgorPHRyPjx0ZD4gMDwvdGQ+PHRkPjA8L3RkPjx0ZD4gMDwvdGQ+PHRkPjA8L3RkPjx0ZD4gMDwvdGQ+PC90cj4KKzx0cj48dGQ+IDA8L3RkPjx0ZD4wPC90ZD48dGQ+MTQ8L3RkPjx0ZD4wPC90ZD48dGQ+IDg8L3RkPjwvdHI+Cis8L3RhYmxlPgorCithbmQgb25lIG9mIGl0cyBwb3NzaWJsZSBzcGFyc2UsIFxiIGNvbHVtbiBcYiBtYWpvciByZXByZXNlbnRhdGlvbjoKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+VmFsdWVzOjwvdGQ+ICAgICAgICA8dGQ+MjI8L3RkPjx0ZD43PC90ZD48dGQ+XzwvdGQ+PHRkPjM8L3RkPjx0ZD41PC90ZD48dGQ+MTQ8L3RkPjx0ZD5fPC90ZD48dGQ+XzwvdGQ+PHRkPjE8L3RkPjx0ZD5fPC90ZD48dGQ+MTc8L3RkPjx0ZD44PC90ZD48L3RyPgorPHRyPjx0ZD5Jbm5lckluZGljZXM6PC90ZD4gIDx0ZD4gMTwvdGQ+PHRkPjI8L3RkPjx0ZD5fPC90ZD48dGQ+MDwvdGQ+PHRkPjI8L3RkPjx0ZD4gNDwvdGQ+PHRkPl88L3RkPjx0ZD5fPC90ZD48dGQ+MjwvdGQ+PHRkPl88L3RkPjx0ZD4gMTwvdGQ+PHRkPjQ8L3RkPjwvdHI+Cis8L3RhYmxlPgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD5PdXRlclN0YXJ0czo8L3RkPjx0ZD4wPC90ZD48dGQ+MzwvdGQ+PHRkPjU8L3RkPjx0ZD44PC90ZD48dGQ+MTA8L3RkPjx0ZD5cZW0gMTIgPC90ZD48L3RyPgorPHRyPjx0ZD5Jbm5lck5OWnM6PC90ZD4gICAgPHRkPjI8L3RkPjx0ZD4yPC90ZD48dGQ+MTwvdGQ+PHRkPjE8L3RkPjx0ZD4gMjwvdGQ+PHRkPjwvdGQ+PC90cj4KKzwvdGFibGU+CisKK0N1cnJlbnRseSB0aGUgZWxlbWVudHMgb2YgYSBnaXZlbiBpbm5lciB2ZWN0b3IgYXJlIGd1YXJhbnRlZWQgdG8gYmUgYWx3YXlzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGlubmVyIGluZGljZXMuCitUaGUgXGMgIl8iIGluZGljYXRlcyBhdmFpbGFibGUgZnJlZSBzcGFjZSB0byBxdWlja2x5IGluc2VydCBuZXcgZWxlbWVudHMuCitBc3N1bWluZyBubyByZWFsbG9jYXRpb24gaXMgbmVlZGVkLCB0aGUgaW5zZXJ0aW9uIG9mIGEgcmFuZG9tIGVsZW1lbnQgaXMgdGhlcmVmb3JlIGluIE8obm56X2opIHdoZXJlIG5uel9qIGlzIHRoZSBudW1iZXIgb2Ygbm9uemVyb3Mgb2YgdGhlIHJlc3BlY3RpdmUgaW5uZXIgdmVjdG9yLgorT24gdGhlIG90aGVyIGhhbmQsIGluc2VydGluZyBlbGVtZW50cyB3aXRoIGluY3JlYXNpbmcgaW5uZXIgaW5kaWNlcyBpbiBhIGdpdmVuIGlubmVyIHZlY3RvciBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHNpbmNlIHRoaXMgb25seSByZXF1aXJlcyB0byBpbmNyZWFzZSB0aGUgcmVzcGVjdGl2ZSBcYyBJbm5lck5OWnMgZW50cnkgdGhhdCBpcyBhIE8oMSkgb3BlcmF0aW9uLgorCitUaGUgY2FzZSB3aGVyZSBubyBlbXB0eSBzcGFjZSBpcyBhdmFpbGFibGUgaXMgYSBzcGVjaWFsIGNhc2UsIGFuZCBpcyByZWZlcmVkIGFzIHRoZSBcZW0gY29tcHJlc3NlZCBtb2RlLgorSXQgY29ycmVzcG9uZHMgdG8gdGhlIHdpZGVseSB1c2VkIENvbXByZXNzZWQgQ29sdW1uIChvciBSb3cpIFN0b3JhZ2Ugc2NoZW1lcyAoQ0NTIG9yIENSUykuCitBbnkgU3BhcnNlTWF0cml4IGNhbiBiZSB0dXJuZWQgdG8gdGhpcyBmb3JtIGJ5IGNhbGxpbmcgdGhlIFNwYXJzZU1hdHJpeDo6bWFrZUNvbXByZXNzZWQoKSBmdW5jdGlvbi4KK0luIHRoaXMgY2FzZSwgb25lIGNhbiByZW1hcmsgdGhhdCB0aGUgXGMgSW5uZXJOTlpzIGFycmF5IGlzIHJlZHVuZGFudCB3aXRoIFxjIE91dGVyU3RhcnRzIGJlY2F1c2Ugd2UgdGhlIGVxdWFsaXR5OiBcYyBJbm5lck5OWnNbal0gPSBcYyBPdXRlclN0YXJ0c1tqKzFdLVxjIE91dGVyU3RhcnRzW2pdLgorVGhlcmVmb3JlLCBpbiBwcmFjdGljZSBhIGNhbGwgdG8gU3BhcnNlTWF0cml4OjptYWtlQ29tcHJlc3NlZCgpIGZyZWVzIHRoaXMgYnVmZmVyLgorCitJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBtb3N0IG9mIG91ciB3cmFwcGVycyB0byBleHRlcm5hbCBsaWJyYXJpZXMgcmVxdWlyZXMgY29tcHJlc3NlZCBtYXRyaWNlcyBhcyBpbnB1dHMuCisKK1RoZSByZXN1bHRzIG9mICVFaWdlbidzIG9wZXJhdGlvbnMgYWx3YXlzIHByb2R1Y2VzIFxiIGNvbXByZXNzZWQgc3BhcnNlIG1hdHJpY2VzLgorT24gdGhlIG90aGVyIGhhbmQsIHRoZSBpbnNlcnRpb24gb2YgYSBuZXcgZWxlbWVudCBpbnRvIGEgU3BhcnNlTWF0cml4IGNvbnZlcnRzIHRoaXMgbGF0ZXIgdG8gdGhlIFxiIHVuY29tcHJlc3NlZCBtb2RlLgorCitIZXJlIGlzIHRoZSBwcmV2aW91cyBtYXRyaXggcmVwcmVzZW50ZWQgaW4gY29tcHJlc3NlZCBtb2RlOgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD5WYWx1ZXM6PC90ZD4gICAgICAgIDx0ZD4yMjwvdGQ+PHRkPjc8L3RkPjx0ZD4zPC90ZD48dGQ+NTwvdGQ+PHRkPjE0PC90ZD48dGQ+MTwvdGQ+PHRkPjE3PC90ZD48dGQ+ODwvdGQ+PC90cj4KKzx0cj48dGQ+SW5uZXJJbmRpY2VzOjwvdGQ+ICA8dGQ+IDE8L3RkPjx0ZD4yPC90ZD48dGQ+MDwvdGQ+PHRkPjI8L3RkPjx0ZD4gNDwvdGQ+PHRkPjI8L3RkPjx0ZD4gMTwvdGQ+PHRkPjQ8L3RkPjwvdHI+Cis8L3RhYmxlPgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD5PdXRlclN0YXJ0czo8L3RkPjx0ZD4wPC90ZD48dGQ+MjwvdGQ+PHRkPjQ8L3RkPjx0ZD41PC90ZD48dGQ+NjwvdGQ+PHRkPlxlbSA4IDwvdGQ+PC90cj4KKzwvdGFibGU+CisKK0EgU3BhcnNlVmVjdG9yIGlzIGEgc3BlY2lhbCBjYXNlIG9mIGEgU3BhcnNlTWF0cml4IHdoZXJlIG9ubHkgdGhlIFxjIFZhbHVlcyBhbmQgXGMgSW5uZXJJbmRpY2VzIGFycmF5cyBhcmUgc3RvcmVkLgorVGhlcmUgaXMgbm8gbm90aW9uIG9mIGNvbXByZXNzZWQvdW5jb21wcmVzc2VkIG1vZGUgZm9yIGEgU3BhcnNlVmVjdG9yLgorCisKK1xzZWN0aW9uIFR1dG9yaWFsU3BhcnNlRXhhbXBsZSBGaXJzdCBleGFtcGxlCisKK0JlZm9yZSBkZXNjcmliaW5nIGVhY2ggaW5kaXZpZHVhbCBjbGFzcywgbGV0J3Mgc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nIHR5cGljYWwgZXhhbXBsZTogc29sdmluZyB0aGUgTGFwYWNlIGVxdWF0aW9uIFxmJCBcbmFibGEgdSA9IDAgXGYkIG9uIGEgcmVndWxhciAyRCBncmlkIHVzaW5nIGEgZmluaXRlIGRpZmZlcmVuY2Ugc2NoZW1lIGFuZCBEaXJpY2hsZXQgYm91bmRhcnkgY29uZGl0aW9ucy4KK1N1Y2ggcHJvYmxlbSBjYW4gYmUgbWF0aGVtYXRpY2FsbHkgZXhwcmVzc2VkIGFzIGEgbGluZWFyIHByb2JsZW0gb2YgdGhlIGZvcm0gXGYkIEF4PWIgXGYkIHdoZXJlIFxmJCB4IFxmJCBpcyB0aGUgdmVjdG9yIG9mIFxjIG0gdW5rbm93bnMgKGluIG91ciBjYXNlLCB0aGUgdmFsdWVzIG9mIHRoZSBwaXhlbHMpLCBcZiQgYiBcZiQgaXMgdGhlIHJpZ2h0IGhhbmQgc2lkZSB2ZWN0b3IgcmVzdWx0aW5nIGZyb20gdGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIGFuZCBcZiQgQSBcZiQgaXMgYW4gXGYkIG0gXHRpbWVzIG0gXGYkIG1hdHJpeCBjb250YWluaW5nIG9ubHkgYSBmZXcgbm9uLXplcm8gZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gdGhlIGRpc2NyZXRpemF0aW9uIG9mIHRoZSBMYXBsYWNpYW4gb3BlcmF0b3IuCisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZS5jcHAKKzwvdGQ+Cis8dGQ+CitcaW1hZ2UgaHRtbCBUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZS5qcGVnCis8L3RkPjwvdHI+PC90YWJsZT4KKworSW4gdGhpcyBleGFtcGxlLCB3ZSBzdGFydCBieSBkZWZpbmluZyBhIGNvbHVtbi1tYWpvciBzcGFyc2UgbWF0cml4IHR5cGUgb2YgZG91YmxlIFxjIFNwYXJzZU1hdHJpeDxkb3VibGU+LCBhbmQgYSB0cmlwbGV0IGxpc3Qgb2YgdGhlIHNhbWUgc2NhbGFyIHR5cGUgXGMgIFRyaXBsZXQ8ZG91YmxlPi4gQSB0cmlwbGV0IGlzIGEgc2ltcGxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBub24temVybyBlbnRyeSBhcyB0aGUgdHJpcGxldDogXGMgcm93IGluZGV4LCBcYyBjb2x1bW4gaW5kZXgsIFxjIHZhbHVlLgorCitJbiB0aGUgbWFpbiBmdW5jdGlvbiwgd2UgZGVjbGFyZSBhIGxpc3QgXGMgY29lZmZpY2llbnRzIG9mIHRyaXBsZXRzIChhcyBhIHN0ZCB2ZWN0b3IpIGFuZCB0aGUgcmlnaHQgaGFuZCBzaWRlIHZlY3RvciBcZiQgYiBcZiQgd2hpY2ggYXJlIGZpbGxlZCBieSB0aGUgXGEgYnVpbGRQcm9ibGVtIGZ1bmN0aW9uLgorVGhlIHJhdyBhbmQgZmxhdCBsaXN0IG9mIG5vbi16ZXJvIGVudHJpZXMgaXMgdGhlbiBjb252ZXJ0ZWQgdG8gYSB0cnVlIFNwYXJzZU1hdHJpeCBvYmplY3QgXGMgQS4KK05vdGUgdGhhdCB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QgZG8gbm90IGhhdmUgdG8gYmUgc29ydGVkLCBhbmQgcG9zc2libGUgZHVwbGljYXRlIGVudHJpZXMgd2lsbCBiZSBzdW1tZWQgdXAuCisKK1RoZSBsYXN0IHN0ZXAgY29uc2lzdHMgb2YgZWZmZWN0aXZlbHkgc29sdmluZyB0aGUgYXNzZW1ibGVkIHByb2JsZW0uCitTaW5jZSB0aGUgcmVzdWx0aW5nIG1hdHJpeCBcYyBBIGlzIHN5bW1ldHJpYyBieSBjb25zdHJ1Y3Rpb24sIHdlIGNhbiBwZXJmb3JtIGEgZGlyZWN0IENob2xlc2t5IGZhY3Rvcml6YXRpb24gdmlhIHRoZSBTaW1wbGljaWFsTERMVCBjbGFzcyB3aGljaCBiZWhhdmVzIGxpa2UgaXRzIExETFQgY291bnRlcnBhcnQgZm9yIGRlbnNlIG9iamVjdHMuCisKK1RoZSByZXN1bHRpbmcgdmVjdG9yIFxjIHggY29udGFpbnMgdGhlIHBpeGVsIHZhbHVlcyBhcyBhIDFEIGFycmF5IHdoaWNoIGlzIHNhdmVkIHRvIGEganBlZyBmaWxlIHNob3duIG9uIHRoZSByaWdodCBvZiB0aGUgY29kZSBhYm92ZS4KKworRGVzY3JpYmluZyB0aGUgXGEgYnVpbGRQcm9ibGVtIGFuZCBcYSBzYXZlIGZ1bmN0aW9ucyBpcyBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoaXMgdHV0b3JpYWwuIFRoZXkgYXJlIGdpdmVuIFxyZWYgVHV0b3JpYWxTcGFyc2VfZXhhbXBsZV9kZXRhaWxzICJoZXJlIiBmb3IgdGhlIGN1cmlvdXMgYW5kIHJlcHJvZHVjaWJpbGl0eSBwdXJwb3NlLgorCisKKworCitcc2VjdGlvbiBUdXRvcmlhbFNwYXJzZVNwYXJzZU1hdHJpeCBUaGUgU3BhcnNlTWF0cml4IGNsYXNzCisKK1xiICVNYXRyaXggXGIgYW5kIFxiIHZlY3RvciBcYiBwcm9wZXJ0aWVzIFxuCisKK1RoZSBTcGFyc2VNYXRyaXggYW5kIFNwYXJzZVZlY3RvciBjbGFzc2VzIHRha2UgdGhyZWUgdGVtcGxhdGUgYXJndW1lbnRzOgorICogdGhlIHNjYWxhciB0eXBlIChlLmcuLCBkb3VibGUpCisgKiB0aGUgc3RvcmFnZSBvcmRlciAoQ29sTWFqb3Igb3IgUm93TWFqb3IsIHRoZSBkZWZhdWx0IGlzIFJvd01ham9yKQorICogdGhlIGlubmVyIGluZGV4IHR5cGUgKGRlZmF1bHQgaXMgXGMgaW50KS4KKworQXMgZm9yIGRlbnNlIE1hdHJpeCBvYmplY3RzLCBjb25zdHJ1Y3RvcnMgdGFrZXMgdGhlIHNpemUgb2YgdGhlIG9iamVjdC4KK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CisKK1xjb2RlCitTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiA+IG1hdCgxMDAwLDIwMDApOyAgICAgICAgIC8vIGRlY2xhcmVzIGEgMTAwMHgyMDAwIGNvbHVtbi1tYWpvciBjb21wcmVzc2VkIHNwYXJzZSBtYXRyaXggb2YgY29tcGxleDxmbG9hdD4KK1NwYXJzZU1hdHJpeDxkb3VibGUsUm93TWFqb3I+IG1hdCgxMDAwLDIwMDApOyAgICAgICAgICAgICAgLy8gZGVjbGFyZXMgYSAxMDAweDIwMDAgcm93LW1ham9yIGNvbXByZXNzZWQgc3BhcnNlIG1hdHJpeCBvZiBkb3VibGUKK1NwYXJzZVZlY3RvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4gdmVjKDEwMDApOyAgICAgICAgICAgICAgLy8gZGVjbGFyZXMgYSBjb2x1bW4gc3BhcnNlIHZlY3RvciBvZiBjb21wbGV4PGZsb2F0PiBvZiBzaXplIDEwMDAKK1NwYXJzZVZlY3Rvcjxkb3VibGUsUm93TWFqb3I+IHZlYygxMDAwKTsgICAgICAgICAgICAgICAgICAgLy8gZGVjbGFyZXMgYSByb3cgc3BhcnNlIHZlY3RvciBvZiBkb3VibGUgb2Ygc2l6ZSAxMDAwCitcZW5kY29kZQorCitJbiB0aGUgcmVzdCBvZiB0aGUgdHV0b3JpYWwsIFxjIG1hdCBhbmQgXGMgdmVjIHJlcHJlc2VudCBhbnkgc3BhcnNlLW1hdHJpeCBhbmQgc3BhcnNlLXZlY3RvciBvYmplY3RzLCByZXNwZWN0aXZlbHkuCisKK1RoZSBkaW1lbnNpb25zIG9mIGEgbWF0cml4IGNhbiBiZSBxdWVyaWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD5TdGFuZGFyZCBcbiBkaW1lbnNpb25zPC90ZD48dGQ+XGNvZGUKK21hdC5yb3dzKCkKK21hdC5jb2xzKClcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK3ZlYy5zaXplKCkgXGVuZGNvZGU8L3RkPgorPC90cj4KKzx0cj48dGQ+U2l6ZXMgYWxvbmcgdGhlIFxuIGlubmVyL291dGVyIGRpbWVuc2lvbnM8L3RkPjx0ZD5cY29kZQorbWF0LmlubmVyU2l6ZSgpCittYXQub3V0ZXJTaXplKClcZW5kY29kZTwvdGQ+Cis8dGQ+PC90ZD4KKzwvdHI+Cis8dHI+PHRkPk51bWJlciBvZiBub24gXG4gemVybyBjb2VmZmljaWVudHM8L3RkPjx0ZD5cY29kZQorbWF0Lm5vblplcm9zKCkgXGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCit2ZWMubm9uWmVyb3MoKSBcZW5kY29kZTwvdGQ+PC90cj4KKzwvdGFibGU+CisKKworXGIgSXRlcmF0aW5nIFxiIG92ZXIgXGIgdGhlIFxiIG5vbnplcm8gXGIgY29lZmZpY2llbnRzIFxuCisKK1JhbmRvbSBhY2Nlc3MgdG8gdGhlIGVsZW1lbnRzIG9mIGEgc3BhcnNlIG9iamVjdCBjYW4gYmUgZG9uZSB0aHJvdWdoIHRoZSBcYyBjb2VmZlJlZihpLGopIGZ1bmN0aW9uLgorSG93ZXZlciwgdGhpcyBmdW5jdGlvbiBpbnZvbHZlcyBhIHF1aXRlIGV4cGVuc2l2ZSBiaW5hcnkgc2VhcmNoLgorSW4gbW9zdCBjYXNlcywgb25lIG9ubHkgd2FudHMgdG8gaXRlcmF0ZSBvdmVyIHRoZSBub24temVyb3MgZWxlbWVudHMuIFRoaXMgaXMgYWNoaWV2ZWQgYnkgYSBzdGFuZGFyZCBsb29wIG92ZXIgdGhlIG91dGVyIGRpbWVuc2lvbiwgYW5kIHRoZW4gYnkgaXRlcmF0aW5nIG92ZXIgdGhlIG5vbi16ZXJvcyBvZiB0aGUgY3VycmVudCBpbm5lciB2ZWN0b3IgdmlhIGFuIElubmVySXRlcmF0b3IuIFRodXMsIHRoZSBub24temVybyBlbnRyaWVzIGhhdmUgdG8gYmUgdmlzaXRlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGFuIHRoZSBzdG9yYWdlIG9yZGVyLgorSGVyZSBpcyBhbiBleGFtcGxlOgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD4KK1xjb2RlCitTcGFyc2VNYXRyaXg8ZG91YmxlPiBtYXQocm93cyxjb2xzKTsKK2ZvciAoaW50IGs9MDsgazxtYXQub3V0ZXJTaXplKCk7ICsraykKKyAgZm9yIChTcGFyc2VNYXRyaXg8ZG91YmxlPjo6SW5uZXJJdGVyYXRvciBpdChtYXQsayk7IGl0OyArK2l0KQorICB7CisgICAgaXQudmFsdWUoKTsKKyAgICBpdC5yb3coKTsgICAvLyByb3cgaW5kZXgKKyAgICBpdC5jb2woKTsgICAvLyBjb2wgaW5kZXggKGhlcmUgaXQgaXMgZXF1YWwgdG8gaykKKyAgICBpdC5pbmRleCgpOyAvLyBpbm5lciBpbmRleCwgaGVyZSBpdCBpcyBlcXVhbCB0byBpdC5yb3coKQorICB9CitcZW5kY29kZQorPC90ZD48dGQ+CitcY29kZQorU3BhcnNlVmVjdG9yPGRvdWJsZT4gdmVjKHNpemUpOworZm9yIChTcGFyc2VWZWN0b3I8ZG91YmxlPjo6SW5uZXJJdGVyYXRvciBpdCh2ZWMpOyBpdDsgKytpdCkKK3sKKyAgaXQudmFsdWUoKTsgLy8gPT0gdmVjWyBpdC5pbmRleCgpIF0KKyAgaXQuaW5kZXgoKTsKK30KK1xlbmRjb2RlCis8L3RkPjwvdHI+Cis8L3RhYmxlPgorRm9yIGEgd3JpdGFibGUgZXhwcmVzc2lvbiwgdGhlIHJlZmVyZW5jZWQgdmFsdWUgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHRoZSB2YWx1ZVJlZigpIGZ1bmN0aW9uLgorSWYgdGhlIHR5cGUgb2YgdGhlIHNwYXJzZSBtYXRyaXggb3IgdmVjdG9yIGRlcGVuZHMgb24gYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHRoZW4gdGhlIFxjIHR5cGVuYW1lIGtleXdvcmQgaXMKK3JlcXVpcmVkIHRvIGluZGljYXRlIHRoYXQgXGMgSW5uZXJJdGVyYXRvciBkZW5vdGVzIGEgdHlwZTsgc2VlIFxyZWYgVG9waWNUZW1wbGF0ZUtleXdvcmQgZm9yIGRldGFpbHMuCisKKworXHNlY3Rpb24gVHV0b3JpYWxTcGFyc2VGaWxsaW5nIEZpbGxpbmcgYSBzcGFyc2UgbWF0cml4CisKK0JlY2F1c2Ugb2YgdGhlIHNwZWNpYWwgc3RvcmFnZSBzY2hlbWUgb2YgYSBTcGFyc2VNYXRyaXgsIHNwZWNpYWwgY2FyZSBoYXMgdG8gYmUgdGFrZW4gd2hlbiBhZGRpbmcgbmV3IG5vbnplcm8gZW50cmllcy4KK0ZvciBpbnN0YW5jZSwgdGhlIGNvc3Qgb2YgYSBzaW5nbGUgcHVyZWx5IHJhbmRvbSBpbnNlcnRpb24gaW50byBhIFNwYXJzZU1hdHJpeCBpcyBcYyBPKG5ueiksIHdoZXJlIFxjIG5ueiBpcyB0aGUgY3VycmVudCBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzLgorCitUaGUgc2ltcGxlc3Qgd2F5IHRvIGNyZWF0ZSBhIHNwYXJzZSBtYXRyaXggd2hpbGUgZ3VhcmFudGVlaW5nIGdvb2QgcGVyZm9ybWFuY2UgaXMgdGh1cyB0byBmaXJzdCBidWlsZCBhIGxpc3Qgb2Ygc28tY2FsbGVkIFxlbSB0cmlwbGV0cywgYW5kIHRoZW4gY29udmVydCBpdCB0byBhIFNwYXJzZU1hdHJpeC4KKworSGVyZSBpcyBhIHR5cGljYWwgdXNhZ2UgZXhhbXBsZToKK1xjb2RlCit0eXBlZGVmIEVpZ2VuOjpUcmlwbGV0PGRvdWJsZT4gVDsKK3N0ZDo6dmVjdG9yPFQ+IHRyaXBsZXRMaXN0OwordHJpcGxldHMucmVzZXJ2ZShlc3RpbWF0aW9uX29mX2VudHJpZXMpOworZm9yKC4uLikKK3sKKyAgLy8gLi4uCisgIHRyaXBsZXRMaXN0LnB1c2hfYmFjayhUKGksaix2X2lqKSk7Cit9CitTcGFyc2VNYXRyaXhUeXBlIG1hdChyb3dzLGNvbHMpOworbWF0LnNldEZyb21UcmlwbGV0cyh0cmlwbGV0TGlzdC5iZWdpbigpLCB0cmlwbGV0TGlzdC5lbmQoKSk7CisvLyBtYXQgaXMgcmVhZHkgdG8gZ28hCitcZW5kY29kZQorVGhlIFxjIHN0ZDo6dmVjdG9yIG9mIHRyaXBsZXRzIG1pZ2h0IGNvbnRhaW4gdGhlIGVsZW1lbnRzIGluIGFyYml0cmFyeSBvcmRlciwgYW5kIG1pZ2h0IGV2ZW4gY29udGFpbiBkdXBsaWNhdGVkIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBzdW1tZWQgdXAgYnkgc2V0RnJvbVRyaXBsZXRzKCkuCitTZWUgdGhlIFNwYXJzZU1hdHJpeDo6c2V0RnJvbVRyaXBsZXRzKCkgZnVuY3Rpb24gYW5kIGNsYXNzIFRyaXBsZXQgZm9yIG1vcmUgZGV0YWlscy4KKworCitJbiBzb21lIGNhc2VzLCBob3dldmVyLCBzbGlnaHRseSBoaWdoZXIgcGVyZm9ybWFuY2UsIGFuZCBsb3dlciBtZW1vcnkgY29uc3VtcHRpb24gY2FuIGJlIHJlYWNoZWQgYnkgZGlyZWN0bHkgaW5zZXJ0aW5nIHRoZSBub24temVyb3MgaW50byB0aGUgZGVzdGluYXRpb24gbWF0cml4LgorQSB0eXBpY2FsIHNjZW5hcmlvIG9mIHRoaXMgYXBwcm9hY2ggaXMgaWxsdXN0cmF0ZWQgYmVsbG93OgorXGNvZGUKKzE6IFNwYXJzZU1hdHJpeDxkb3VibGU+IG1hdChyb3dzLGNvbHMpOyAgICAgICAgIC8vIGRlZmF1bHQgaXMgY29sdW1uIG1ham9yCisyOiBtYXQucmVzZXJ2ZShWZWN0b3JYaTo6Q29uc3RhbnQoY29scyw2KSk7CiszOiBmb3IgZWFjaCBpLGogc3VjaCB0aGF0IHZfaWogIT0gMAorNDogICBtYXQuaW5zZXJ0KGksaikgPSB2X2lqOyAgICAgICAgICAgICAgICAgICAgLy8gYWx0ZXJuYXRpdmU6IG1hdC5jb2VmZlJlZihpLGopICs9IHZfaWo7Cis1OiBtYXQubWFrZUNvbXByZXNzZWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAorXGVuZGNvZGUKKworLSBUaGUga2V5IGluZ3JlZGllbnQgaGVyZSBpcyB0aGUgbGluZSAyIHdoZXJlIHdlIHJlc2VydmUgcm9vbSBmb3IgNiBub24temVyb3MgcGVyIGNvbHVtbi4gSW4gbWFueSBjYXNlcywgdGhlIG51bWJlciBvZiBub24temVyb3MgcGVyIGNvbHVtbiBvciByb3cgY2FuIGVhc2lseSBiZSBrbm93biBpbiBhZHZhbmNlLiBJZiBpdCB2YXJpZXMgc2lnbmlmaWNhbnRseSBmb3IgZWFjaCBpbm5lciB2ZWN0b3IsIHRoZW4gaXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBhIHJlc2VydmUgc2l6ZSBmb3IgZWFjaCBpbm5lciB2ZWN0b3IgYnkgcHJvdmlkaW5nIGEgdmVjdG9yIG9iamVjdCB3aXRoIGFuIG9wZXJhdG9yW10oaW50IGopIHJldHVybmluZyB0aGUgcmVzZXJ2ZSBzaXplIG9mIHRoZSBcYyBqLXRoIGlubmVyIHZlY3RvciAoZS5nLiwgdmlhIGEgVmVjdG9yWGkgb3Igc3RkOjp2ZWN0b3I8aW50PikuIElmIG9ubHkgYSByb3VnaHQgZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBub256ZXJvcyBwZXIgaW5uZXItdmVjdG9yIGNhbiBiZSBvYnRhaW5lZCwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIG92ZXJlc3RpbWF0ZSBpdCByYXRoZXIgdGhhbiB0aGUgb3Bwb3NpdGUuIElmIHRoaXMgbGluZSBpcyBvbWl0dGVkLCB0aGVuIHRoZSBmaXJzdCBpbnNlcnRpb24gb2YgYSBuZXcgZWxlbWVudCB3aWxsIHJlc2VydmUgcm9vbSBmb3IgMiBlbGVtZW50cyBwZXIgaW5uZXIgdmVjdG9yLgorLSBUaGUgbGluZSA0IHBlcmZvcm1zIGEgc29ydGVkIGluc2VydGlvbi4gSW4gdGhpcyBleGFtcGxlLCB0aGUgaWRlYWwgY2FzZSBpcyB3aGVuIHRoZSBcYyBqLXRoIGNvbHVtbiBpcyBub3QgZnVsbCBhbmQgY29udGFpbnMgbm9uLXplcm9zIHdob3NlIGlubmVyLWluZGljZXMgYXJlIHNtYWxsZXIgdGhhbiBcYyBpLiBJbiB0aGlzIGNhc2UsIHRoaXMgb3BlcmF0aW9uIGJvaWxzIGRvd24gdG8gdHJpdmlhbCBPKDEpIG9wZXJhdGlvbi4KKy0gV2hlbiBjYWxsaW5nIGluc2VydChpLGopIHRoZSBlbGVtZW50IFxjIGkgXGMgLGogbXVzdCBub3QgYWxyZWFkeSBleGlzdHMsIG90aGVyd2lzZSB1c2UgdGhlIGNvZWZmUmVmKGksaikgbWV0aG9kIHRoYXQgd2lsbCBhbGxvdyB0bywgZS5nLiwgYWNjdW11bGF0ZSB2YWx1ZXMuIFRoaXMgbWV0aG9kIGZpcnN0IHBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBhbmQgZmluYWxseSBjYWxscyBpbnNlcnQoaSxqKSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBJdCBpcyBtb3JlIGZsZXhpYmxlIHRoYW4gaW5zZXJ0KCkgYnV0IGFsc28gbW9yZSBjb3N0bHkuCistIFRoZSBsaW5lIDUgc3VwcHJlc3NlcyB0aGUgcmVtYWluaW5nIGVtcHR5IHNwYWNlIGFuZCB0cmFuc2Zvcm1zIHRoZSBtYXRyaXggaW50byBhIGNvbXByZXNzZWQgY29sdW1uIHN0b3JhZ2UuCisKKworXHNlY3Rpb24gVHV0b3JpYWxTcGFyc2VEaXJlY3RTb2x2ZXJzIFNvbHZpbmcgbGluZWFyIHByb2JsZW1zCisKKyVFaWdlbiBjdXJyZW50bHkgcHJvdmlkZXMgYSBsaW1pdGVkIHNldCBvZiBidWlsdC1pbiBzb2x2ZXJzLCBhcyB3ZWxsIGFzIHdyYXBwZXJzIHRvIGV4dGVybmFsIHNvbHZlciBsaWJyYXJpZXMuCitUaGV5IGFyZSBzdW1tYXJpemVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGg+Q2xhc3M8L3RoPjx0aD5Nb2R1bGU8L3RoPjx0aD5Tb2x2ZXIga2luZDwvdGg+PHRoPk1hdHJpeCBraW5kPC90aD48dGg+RmVhdHVyZXMgcmVsYXRlZCB0byBwZXJmb3JtYW5jZTwvdGg+CisgICAgPHRoPkRlcGVuZGVuY2llcyxMaWNlbnNlPC90aD48dGggY2xhc3M9IndpZHRoMjBlbSI+PHA+Tm90ZXM8L3A+PC90aD48L3RyPgorPHRyPjx0ZD5TaW1wbGljaWFsTExUICAgIDwvdGQ+PHRkPlxsaW5rIFNwYXJzZUNob2xlc2t5X01vZHVsZSBTcGFyc2VDaG9sZXNreSBcZW5kbGluazwvdGQ+PHRkPkRpcmVjdCBMTHQgZmFjdG9yaXphdGlvbjwvdGQ+PHRkPlNQRDwvdGQ+PHRkPkZpbGwtaW4gcmVkdWNpbmc8L3RkPgorICAgIDx0ZD5idWlsdC1pbiwgTEdQTDwvdGQ+CisgICAgPHRkPlNpbXBsaWNpYWxMRExUIGlzIG9mdGVuIHByZWZlcmFibGU8L3RkPjwvdHI+Cis8dHI+PHRkPlNpbXBsaWNpYWxMRExUICAgPC90ZD48dGQ+XGxpbmsgU3BhcnNlQ2hvbGVza3lfTW9kdWxlIFNwYXJzZUNob2xlc2t5IFxlbmRsaW5rPC90ZD48dGQ+RGlyZWN0IExETHQgZmFjdG9yaXphdGlvbjwvdGQ+PHRkPlNQRDwvdGQ+PHRkPkZpbGwtaW4gcmVkdWNpbmc8L3RkPgorICAgIDx0ZD5idWlsdC1pbiwgTEdQTDwvdGQ+CisgICAgPHRkPlJlY29tbWVuZGVkIGZvciB2ZXJ5IHNwYXJzZSBhbmQgbm90IHRvbyBsYXJnZSBwcm9ibGVtcyAoZS5nLiwgMkQgUG9pc3NvbiBlcS4pPC90ZD48L3RyPgorPHRyPjx0ZD5Db25qdWdhdGVHcmFkaWVudDwvdGQ+PHRkPlxsaW5rIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnNfTW9kdWxlIEl0ZXJhdGl2ZUxpbmVhclNvbHZlcnMgXGVuZGxpbms8L3RkPjx0ZD5DbGFzc2ljIGl0ZXJhdGl2ZSBDRzwvdGQ+PHRkPlNQRDwvdGQ+PHRkPlByZWNvbmRpdGlvbm5pbmc8L3RkPgorICAgIDx0ZD5idWlsdC1pbiwgTEdQTDwvdGQ+CisgICAgPHRkPlJlY29tbWVuZGVkIGZvciBsYXJnZSBzeW1tZXRyaWMgcHJvYmxlbXMgKGUuZy4sIDNEIFBvaXNzb24gZXEuKTwvdGQ+PC90cj4KKzx0cj48dGQ+QmlDR1NUQUI8L3RkPjx0ZD5cbGluayBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzX01vZHVsZSBJdGVyYXRpdmVMaW5lYXJTb2x2ZXJzIFxlbmRsaW5rPC90ZD48dGQ+SXRlcmF0aXZlIHN0YWJpbGl6ZWQgYmktY29uanVnYXRlIGdyYWRpZW50PC90ZD48dGQ+U3F1YXJlPC90ZD48dGQ+UHJlY29uZGl0aW9ubmluZzwvdGQ+CisgICAgPHRkPmJ1aWx0LWluLCBMR1BMPC90ZD4KKyAgICA8dGQ+TWlnaHQgbm90IGFsd2F5cyBjb252ZXJnZTwvdGQ+PC90cj4KKworCis8dHI+PHRkPlBhc3RpeExMVCBcbiBQYXN0aXhMRExUIFxuIFBhc3RpeExVPC90ZD48dGQ+XGxpbmsgUGFTdGlYU3VwcG9ydF9Nb2R1bGUgUGFTdGlYU3VwcG9ydCBcZW5kbGluazwvdGQ+PHRkPkRpcmVjdCBMTHQsIExETHQsIExVIGZhY3Rvcml6YXRpb25zPC90ZD48dGQ+U1BEIFxuIFNQRCBcbiBTcXVhcmU8L3RkPjx0ZD5GaWxsLWluIHJlZHVjaW5nLCBMZXZlcmFnZSBmYXN0IGRlbnNlIGFsZ2VicmEsIE11bHRpdGhyZWFkaW5nPC90ZD4KKyAgICA8dGQ+UmVxdWlyZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9wYXN0aXguZ2ZvcmdlLmlucmlhLmZyIj5QYVN0aVg8L2E+IHBhY2thZ2UsIFxiIENlQ0lMTC1DIDwvdGQ+CisgICAgPHRkPm9wdGltaXplZCBmb3IgdG91Z2ggcHJvYmxlbXMgYW5kIHN5bW1ldHJpYyBwYXR0ZXJuczwvdGQ+PC90cj4KKzx0cj48dGQ+Q2hvbG1vZFN1cGVybm9kYWxMTFQ8L3RkPjx0ZD5cbGluayBDaG9sbW9kU3VwcG9ydF9Nb2R1bGUgQ2hvbG1vZFN1cHBvcnQgXGVuZGxpbms8L3RkPjx0ZD5EaXJlY3QgTEx0IGZhY3Rvcml6YXRpb248L3RkPjx0ZD5TUEQ8L3RkPjx0ZD5GaWxsLWluIHJlZHVjaW5nLCBMZXZlcmFnZSBmYXN0IGRlbnNlIGFsZ2VicmE8L3RkPgorICAgIDx0ZD5SZXF1aXJlcyB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5jaXNlLnVmbC5lZHUvcmVzZWFyY2gvc3BhcnNlL1N1aXRlU3BhcnNlLyI+U3VpdGVTcGFyc2U8L2E+IHBhY2thZ2UsIFxiIEdQTCA8L3RkPgorICAgIDx0ZD48L3RkPjwvdHI+Cis8dHI+PHRkPlVtZlBhY2tMVTwvdGQ+PHRkPlxsaW5rIFVtZlBhY2tTdXBwb3J0X01vZHVsZSBVbWZQYWNrU3VwcG9ydCBcZW5kbGluazwvdGQ+PHRkPkRpcmVjdCBMVSBmYWN0b3JpemF0aW9uPC90ZD48dGQ+U3F1YXJlPC90ZD48dGQ+RmlsbC1pbiByZWR1Y2luZywgTGV2ZXJhZ2UgZmFzdCBkZW5zZSBhbGdlYnJhPC90ZD4KKyAgICA8dGQ+UmVxdWlyZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2lzZS51ZmwuZWR1L3Jlc2VhcmNoL3NwYXJzZS9TdWl0ZVNwYXJzZS8iPlN1aXRlU3BhcnNlPC9hPiBwYWNrYWdlLCBcYiBHUEwgPC90ZD4KKyAgICA8dGQ+PC90ZD48L3RyPgorPHRyPjx0ZD5TdXBlckxVPC90ZD48dGQ+XGxpbmsgU3VwZXJMVVN1cHBvcnRfTW9kdWxlIFN1cGVyTFVTdXBwb3J0IFxlbmRsaW5rPC90ZD48dGQ+RGlyZWN0IExVIGZhY3Rvcml6YXRpb248L3RkPjx0ZD5TcXVhcmU8L3RkPjx0ZD5GaWxsLWluIHJlZHVjaW5nLCBMZXZlcmFnZSBmYXN0IGRlbnNlIGFsZ2VicmE8L3RkPgorICAgIDx0ZD5SZXF1aXJlcyB0aGUgPGEgaHJlZj0iaHR0cDovL2NyZC1sZWdhY3kubGJsLmdvdi9+eGlhb3llL1N1cGVyTFUvIj5TdXBlckxVPC9hPiBsaWJyYXJ5LCAoQlNELWxpa2UpPC90ZD4KKyAgICA8dGQ+PC90ZD48L3RyPgorPC90YWJsZT4KKworSGVyZSBcYyBTUEQgbWVhbnMgc3ltbWV0cmljIHBvc2l0aXZlIGRlZmluaXRlLgorCitBbGwgdGhlc2Ugc29sdmVycyBmb2xsb3cgdGhlIHNhbWUgZ2VuZXJhbCBjb25jZXB0LgorSGVyZSBpcyBhIHR5cGljYWwgYW5kIGdlbmVyYWwgZXhhbXBsZToKK1xjb2RlCisjaW5jbHVkZSA8RWlnZW4vUmVxdWlyZWRNb2R1bGVOYW1lPgorLy8gLi4uCitTcGFyc2VNYXRyaXg8ZG91YmxlPiBBOworLy8gZmlsbCBBCitWZWN0b3JYZCBiLCB4OworLy8gZmlsbCBiCisvLyBzb2x2ZSBBeCA9IGIKK1NvbHZlckNsYXNzTmFtZTxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHNvbHZlcjsKK3NvbHZlci5jb21wdXRlKEEpOworaWYoc29sdmVyLmluZm8oKSE9U3VjY2VlZGVkKSB7CisgIC8vIGRlY29tcG9zaXRpb24gZmFpbGVkCisgIHJldHVybjsKK30KK3ggPSBzb2x2ZXIuc29sdmUoYik7CitpZihzb2x2ZXIuaW5mbygpIT1TdWNjZWVkZWQpIHsKKyAgLy8gc29sdmluZyBmYWlsZWQKKyAgcmV0dXJuOworfQorLy8gc29sdmUgZm9yIGFub3RoZXIgcmlnaHQgaGFuZCBzaWRlOgoreDEgPSBzb2x2ZXIuc29sdmUoYjEpOworXGVuZGNvZGUKKworRm9yIFxjIFNQRCBzb2x2ZXJzLCBhIHNlY29uZCBvcHRpb25hbCB0ZW1wbGF0ZSBhcmd1bWVudCBhbGxvd3MgdG8gc3BlY2lmeSB3aGljaCB0cmlhbmd1bGFyIHBhcnQgaGF2ZSB0byBiZSB1c2VkLCBlLmcuOgorCitcY29kZQorI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CisKK0Nvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxkb3VibGU+LCBFaWdlbjo6VXBwZXI+IHNvbHZlcjsKK3ggPSBzb2x2ZXIuY29tcHV0ZShBKS5zb2x2ZShiKTsKK1xlbmRjb2RlCitJbiB0aGUgYWJvdmUgZXhhbXBsZSwgb25seSB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHRoZSBpbnB1dCBtYXRyaXggQSBpcyBjb25zaWRlcmVkIGZvciBzb2x2aW5nLiBUaGUgb3Bwb3NpdGUgdHJpYW5nbGUgbWlnaHQgZWl0aGVyIGJlIGVtcHR5IG9yIGNvbnRhaW4gYXJiaXRyYXJ5IHZhbHVlcy4KKworSW4gdGhlIGNhc2Ugd2hlcmUgbXVsdGlwbGUgcHJvYmxlbXMgd2l0aCB0aGUgc2FtZSBzcGFyY2l0eSBwYXR0ZXJuIGhhdmUgdG8gYmUgc29sdmVkLCB0aGVuIHRoZSAiY29tcHV0ZSIgc3RlcCBjYW4gYmUgZGVjb21wb3NlZCBhcyBmb2xsb3c6CitcY29kZQorU29sdmVyQ2xhc3NOYW1lPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc29sdmVyOworc29sdmVyLmFuYWx5emVQYXR0ZXJuKEEpOyAgIC8vIGZvciB0aGlzIHN0ZXAgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgQSBhcmUgbm90IHVzZWQKK3NvbHZlci5mYWN0b3JpemUoQSk7Cit4MSA9IHNvbHZlci5zb2x2ZShiMSk7Cit4MiA9IHNvbHZlci5zb2x2ZShiMik7CisuLi4KK0EgPSAuLi47ICAgICAgICAgICAgICAgICAgICAvLyBtb2RpZnkgdGhlIHZhbHVlcyBvZiB0aGUgbm9uemVyb3Mgb2YgQSwgdGhlIG5vbnplcm9zIHBhdHRlcm4gbXVzdCBzdGF5IHVuY2hhbmdlZAorc29sdmVyLmZhY3Rvcml6ZShBKTsKK3gxID0gc29sdmVyLnNvbHZlKGIxKTsKK3gyID0gc29sdmVyLnNvbHZlKGIyKTsKKy4uLgorXGVuZGNvZGUKK1RoZSBjb21wdXRlKCkgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBib3RoIGFuYWx5emVQYXR0ZXJuKCkgYW5kIGZhY3Rvcml6ZSgpLgorCitGaW5hbGx5LCBlYWNoIHNvbHZlciBwcm92aWRlcyBzb21lIHNwZWNpZmljIGZlYXR1cmVzLCBzdWNoIGFzIGRldGVybWluYW50LCBhY2Nlc3MgdG8gdGhlIGZhY3RvcnMsIGNvbnRyb2xzIG9mIHRoZSBpdGVyYXRpb25zLCBhbmQgc28gb24uCitNb3JlIGRldGFpbHMgYXJlIGF2YWlsYmxlIGluIHRoZSBkb2N1bWVudGF0aW9ucyBvZiB0aGUgcmVzcGVjdGl2ZSBjbGFzc2VzLgorCisKK1xzZWN0aW9uIFR1dG9yaWFsU3BhcnNlRmVhdHVyZVNldCBTdXBwb3J0ZWQgb3BlcmF0b3JzIGFuZCBmdW5jdGlvbnMKKworQmVjYXVzZSBvZiB0aGVpciBzcGVjaWFsIHN0b3JhZ2UgZm9ybWF0LCBzcGFyc2UgbWF0cmljZXMgY2Fubm90IG9mZmVyIHRoZSBzYW1lIGxldmVsIG9mIGZsZXhiaWxpdHkgdGhhbiBkZW5zZSBtYXRyaWNlcy4KK0luIEVpZ2VuJ3Mgc3BhcnNlIG1vZHVsZSB3ZSBjaG9zZSB0byBleHBvc2Ugb25seSB0aGUgc3Vic2V0IG9mIHRoZSBkZW5zZSBtYXRyaXggQVBJIHdoaWNoIGNhbiBiZSBlZmZpY2llbnRseSBpbXBsZW1lbnRlZC4KK0luIHRoZSBmb2xsb3dpbmcgXGVtIHNtIGRlbm90ZXMgYSBzcGFyc2UgbWF0cml4LCBcZW0gc3YgYSBzcGFyc2UgdmVjdG9yLCBcZW0gZG0gYSBkZW5zZSBtYXRyaXgsIGFuZCBcZW0gZHYgYSBkZW5zZSB2ZWN0b3IuCisKK1xzdWJzZWN0aW9uIFR1dG9yaWFsU3BhcnNlX0Jhc2ljT3BzIEJhc2ljIG9wZXJhdGlvbnMKKworJVNwYXJzZSBleHByZXNzaW9ucyBzdXBwb3J0IG1vc3Qgb2YgdGhlIHVuYXJ5IGFuZCBiaW5hcnkgY29lZmZpY2llbnQgd2lzZSBvcGVyYXRpb25zOgorXGNvZGUKK3NtMS5yZWFsKCkgICBzbTEuaW1hZygpICAgLXNtMSAgICAgICAgICAgICAgICAgICAgMC41KnNtMQorc20xK3NtMiAgICAgIHNtMS1zbTIgICAgICBzbTEuY3dpc2VQcm9kdWN0KHNtMikKK1xlbmRjb2RlCitIb3dldmVyLCBhIHN0cm9uZyByZXN0cmljdGlvbiBpcyB0aGF0IHRoZSBzdG9yYWdlIG9yZGVycyBtdXN0IG1hdGNoLiBGb3IgaW5zdGFuY2UsIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKK1xjb2RlCitzbTQgPSBzbTEgKyBzbTIgKyBzbTM7CitcZW5kY29kZQorc20xLCBzbTIsIGFuZCBzbTMgbXVzdCBhbGwgYmUgcm93LW1ham9yIG9yIGFsbCBjb2x1bW4gbWFqb3IuCitPbiB0aGUgb3RoZXIgaGFuZCwgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gdGhlIHRhcmdldCBtYXRyaXggc200LgorRm9yIGluc3RhbmNlLCB0aGlzIG1lYW5zIHRoYXQgZm9yIGNvbXB1dGluZyBcZiQgQV5UICsgQSBcZiQsIHRoZSBtYXRyaXggXGYkIEFeVCBcZiQgbXVzdCBiZSBldmFsdWF0ZWQgaW50byBhIHRlbXBvcmFyeSBtYXRyaXggb2YgY29tcGF0aWJsZSBzdG9yYWdlIG9yZGVyOgorXGNvZGUKK1NwYXJzZU1hdHJpeDxkb3VibGU+IEEsIEI7CitCID0gU3BhcnNlTWF0cml4PGRvdWJsZT4oQS50cmFuc3Bvc2UoKSkgKyBBOworXGVuZGNvZGUKKworQmluYXJ5IGNvZWZmaWNpZW50IHdpc2Ugb3BlcmF0b3JzIGNhbiBhbHNvIG1peCBzcGFyc2UgYW5kIGRlbnNlIGV4cHJlc3Npb25zOgorXGNvZGUKK3NtMiA9IHNtMS5jd2lzZVByb2R1Y3QoZG0xKTsKK2RtMiA9IHNtMSArIGRtMTsKK1xlbmRjb2RlCisKKworJVNwYXJzZSBleHByZXNzaW9ucyBhbHNvIHN1cHBvcnQgdHJhbnNwb3NpdGlvbjoKK1xjb2RlCitzbTEgPSBzbTIudHJhbnNwb3NlKCk7CitzbTEgPSBzbTIuYWRqb2ludCgpOworXGVuZGNvZGUKK0hvd2V2ZXIsIHRoZXJlIGlzIG5vIHRyYW5zcG9zZUluUGxhY2UoKSBtZXRob2QuCisKKworXHN1YnNlY3Rpb24gVHV0b3JpYWxTcGFyc2VfUHJvZHVjdHMgTWF0cml4IHByb2R1Y3RzCisKKyVFaWdlbiBzdXBwb3J0cyB2YXJpb3VzIGtpbmQgb2Ygc3BhcnNlIG1hdHJpeCBwcm9kdWN0cyB3aGljaCBhcmUgc3VtbWFyaXplIGJlbG93OgorICAtIFxiIHNwYXJzZS1kZW5zZToKKyAgICBcY29kZQorZHYyID0gc20xICogZHYxOworZG0yID0gZG0xICogc20xLmFkam9pbnQoKTsKK2RtMiA9IDIuICogc20xICogZG0xOworICAgIFxlbmRjb2RlCisgIC0gXGIgc3ltbWV0cmljIFxiIHNwYXJzZS1kZW5zZS4gVGhlIHByb2R1Y3Qgb2YgYSBzcGFyc2Ugc3ltbWV0cmljIG1hdHJpeCB3aXRoIGEgZGVuc2UgbWF0cml4IChvciB2ZWN0b3IpIGNhbiBhbHNvIGJlIG9wdGltaXplZCBieSBzcGVjaWZ5aW5nIHRoZSBzeW1tZXRyeSB3aXRoIHNlbGZhZGpvaW50VmlldygpOgorICAgIFxjb2RlCitkbTIgPSBzbTEuc2VsZmFkam9pbnRWaWV3PD4oKSAqIGRtMTsgICAgICAgIC8vIGlmIGFsbCBjb2VmZmljaWVudHMgb2YgQSBhcmUgc3RvcmVkCitkbTIgPSBBLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIGRtMTsgICAgIC8vIGlmIG9ubHkgdGhlIHVwcGVyIHBhcnQgb2YgQSBpcyBzdG9yZWQKK2RtMiA9IEEuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZG0xOyAgICAgLy8gaWYgb25seSB0aGUgbG93ZXIgcGFydCBvZiBBIGlzIHN0b3JlZAorICAgIFxlbmRjb2RlCisgIC0gXGIgc3BhcnNlLXNwYXJzZS4gRm9yIHNwYXJzZS1zcGFyc2UgcHJvZHVjdHMsIHR3byBkaWZmZXJlbnQgYWxnb3JpdGhtcyBhcmUgYXZhaWxhYmxlLiBUaGUgZGVmYXVsdCBvbmUgaXMgY29uc2VydmF0aXZlIGFuZCBwcmVzZXJ2ZSB0aGUgZXhwbGljaXQgemVyb3MgdGhhdCBtaWdodCBhcHBlYXI6CisgICAgXGNvZGUKK3NtMyA9IHNtMSAqIHNtMjsKK3NtMyA9IDQgKiBzbTEuYWRqb2ludCgpICogc20yOworICAgIFxlbmRjb2RlCisgICAgVGhlIHNlY29uZCBhbGdvcml0aG0gcHJ1bmVzIG9uIHRoZSBmbHkgdGhlIGV4cGxpY2l0IHplcm9zLCBvciB0aGUgdmFsdWVzIHNtYWxsZXIgdGhhbiBhIGdpdmVuIHRocmVzaG9sZC4gSXQgaXMgZW5hYmxlZCBhbmQgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBwcnVuZSgpIGZ1bmN0aW9uczoKKyAgICBcY29kZQorc20zID0gKHNtMSAqIHNtMikucHJ1bmUoKTsgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIG51bWVyaWNhbCB6ZXJvcworc20zID0gKHNtMSAqIHNtMikucHJ1bmUocmVmKTsgICAgICAgICAgICAgICAvLyByZW1vdmVzIGVsZW1lbnRzIG11Y2ggc21hbGxlciB0aGFuIHJlZgorc20zID0gKHNtMSAqIHNtMikucHJ1bmUocmVmLGVwc2lsb24pOyAgICAgICAvLyByZW1vdmVzIGVsZW1lbnRzIHNtYWxsZXIgdGhhbiByZWYqZXBzaWxvbgorICAgIFxlbmRjb2RlCisKKyAgLSBcYiBwZXJtdXRhdGlvbnMuIEZpbmFsbHksIHBlcm11dGF0aW9ucyBjYW4gYmUgYXBwbGllZCB0byBzcGFyc2UgbWF0cmljZXMgdG9vOgorICAgIFxjb2RlCitQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWM+IFAgPSAuLi47CitzbTIgPSBQICogc20xOworc20yID0gc20xICogUC5pbnZlcnNlKCk7CitzbTIgPSBzbTEudHJhbnNwb3NlKCkgKiBQOworICAgIFxlbmRjb2RlCisKKworXHN1YnNlY3Rpb24gVHV0b3JpYWxTcGFyc2VfVHJpYW5ndWxhclNlbGZhZGpvaW50IFRyaWFuZ3VsYXIgYW5kIHNlbGZhZGpvaW50IHZpZXdzCisKK0p1c3QgYXMgd2l0aCBkZW5zZSBtYXRyaWNlcywgdGhlIHRyaWFuZ3VsYXJWaWV3KCkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWRkcmVzcyBhIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4LCBhbmQgcGVyZm9ybSB0cmlhbmd1bGFyIHNvbHZlcyB3aXRoIGEgZGVuc2UgcmlnaHQgaGFuZCBzaWRlOgorXGNvZGUKK2RtMiA9IHNtMS50cmlhbmd1bGFyVmlldzxMb3dlcj4oZG0xKTsKK2R2MiA9IHNtMS50cmFuc3Bvc2UoKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oZHYxKTsKK1xlbmRjb2RlCisKK1RoZSBzZWxmYWRqb2ludFZpZXcoKSBmdW5jdGlvbiBwZXJtaXRzIHZhcmlvdXMgb3BlcmF0aW9uczoKKyAtIG9wdGltaXplZCBzcGFyc2UtZGVuc2UgbWF0cml4IHByb2R1Y3RzOgorICAgIFxjb2RlCitkbTIgPSBzbTEuc2VsZmFkam9pbnRWaWV3PD4oKSAqIGRtMTsgICAgICAgIC8vIGlmIGFsbCBjb2VmZmljaWVudHMgb2YgQSBhcmUgc3RvcmVkCitkbTIgPSBBLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIGRtMTsgICAgIC8vIGlmIG9ubHkgdGhlIHVwcGVyIHBhcnQgb2YgQSBpcyBzdG9yZWQKK2RtMiA9IEEuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZG0xOyAgICAgLy8gaWYgb25seSB0aGUgbG93ZXIgcGFydCBvZiBBIGlzIHN0b3JlZAorICAgIFxlbmRjb2RlCisgLSBjb3B5IG9mIHRyaWFuZ3VsYXIgcGFydHM6CisgICAgXGNvZGUKK3NtMiA9IHNtMS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2VzIGEgZnVsbCBzZWxmYWRqb2ludCBtYXRyaXggZnJvbSB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0CitzbTIuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gc20xLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsgICAgICAvLyBjb3BpZXMgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCB0byB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0CisgICAgXGVuZGNvZGUKKyAtIGFwcGxpY2F0aW9uIG9mIHN5bW1ldHJpYyBwZXJtdXRhdGlvbnM6CisgXGNvZGUKK1Blcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYz4gUCA9IC4uLjsKK3NtMiA9IEEuc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgUCBTIFAnIGZyb20gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvZiBBLCBhbmQgbWFrZSBpdCBhIGZ1bGwgbWF0cml4CitzbTIuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gQS5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KFApOyAgICAgICAvLyBjb21wdXRlIFAgUyBQJyBmcm9tIHRoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgb2YgQSwgYW5kIHRoZW4gb25seSBjb21wdXRlIHRoZSBsb3dlciBwYXJ0CisgXGVuZGNvZGUKKworXHN1YnNlY3Rpb24gVHV0b3JpYWxTcGFyc2VfU3VibWF0IFN1Yi1tYXRyaWNlcworCislU3BhcnNlIG1hdHJpY2VzIGRvZXMgbm90IHN1cHBvcnQgeWV0IHRoZSBhZGRyZXNzaW5nIG9mIGFyYml0cmFyeSBzdWIgbWF0cmljZXMuIEN1cnJlbnRseSwgb25lIGNhbiBvbmx5IHJlZmVyZW5jZSBhIHNldCBvZiBjb250aWd1b3VzIFxlbSBpbm5lciB2ZWN0b3JzLCBpLmUuLCBhIHNldCBvZiBjb250aWd1b3VzIHJvd3MgZm9yIGEgcm93LW1ham9yIG1hdHJpeCwgb3IgYSBzZXQgb2YgY29udGlndW91cyBjb2x1bW5zIGZvciBhIGNvbHVtbiBtYWpvciBtYXRyaXg6CitcY29kZQorICBzbTEuaW5uZXJWZWN0b3Ioaik7ICAgICAgIC8vIHJldHVybnMgYW4gZXhwcmVzc2lvbiBvZiB0aGUgai10aCBjb2x1bW4gKHJlc3AuIHJvdykgb2YgdGhlIG1hdHJpeCBpZiBzbTEgaXMgY29sLW1ham9yIChyZXNwLiByb3ctbWFqb3IpCisgIHNtMS5pbm5lclZlY3RvcnMoaiwgbmIpOyAgLy8gcmV0dXJucyBhbiBleHByZXNzaW9uIG9mIHRoZSBuYiBjb2x1bW5zIChyZXNwLiByb3cpIHN0YXJ0aW5nIGZyb20gdGhlIGotdGggY29sdW1uIChyZXNwLiByb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIG1hdHJpeCBpZiBzbTEgaXMgY29sLW1ham9yIChyZXNwLiByb3ctbWFqb3IpCisgIHNtMS5taWRkbGVSb3dzKGosIG5iKTsgICAgLy8gZm9yIHJvdyBtYWpvciBtYXRyaWNlcyBvbmx5LCBnZXQgYSByYW5nZSBvZiBuYiByb3dzCisgIHNtMS5taWRkbGVDb2xzKGosIG5iKTsgICAgLy8gZm9yIGNvbHVtbiBtYWpvciBtYXRyaWNlcyBvbmx5LCBnZXQgYSByYW5nZSBvZiBuYiBjb2x1bW5zCitcZW5kY29kZQorCitcbGkgXGIgTmV4dDogXHJlZiBUdXRvcmlhbE1hcENsYXNzCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9DMTBfVHV0b3JpYWxNYXBDbGFzcy5kb3ggYi9kb2MvQzEwX1R1dG9yaWFsTWFwQ2xhc3MuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTc5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvQzEwX1R1dG9yaWFsTWFwQ2xhc3MuZG94CkBAIC0wLDAgKzEsOTYgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUdXRvcmlhbE1hcENsYXNzIFR1dG9yaWFsIHBhZ2UgMTAgLSBJbnRlcmZhY2luZyB3aXRoIEMvQysrIGFycmF5cyBhbmQgZXh0ZXJuYWwgbGlicmFyaWVzOiB0aGUgJU1hcCBjbGFzcworCitcaW5ncm91cCBUdXRvcmlhbAorCitcbGkgXGIgUHJldmlvdXM6IFxyZWYgVHV0b3JpYWxTcGFyc2UKK1xsaSBcYiBOZXh0OiBccmVmIFRPRE8KKworVGhpcyB0dXRvcmlhbCBwYWdlIGV4cGxhaW5zIGhvdyB0byB3b3JrIHdpdGggInJhdyIgQysrIGFycmF5cy4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBhIHZhcmlldHkgb2YgY29udGV4dHMsIHBhcnRpY3VsYXJseSB3aGVuICJpbXBvcnRpbmciIHZlY3RvcnMgYW5kIG1hdHJpY2VzIGZyb20gb3RoZXIgbGlicmFyaWVzIGludG8gRWlnZW4uCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzCisgIC0gXHJlZiBUdXRvcmlhbE1hcEludHJvZHVjdGlvbgorICAtIFxyZWYgVHV0b3JpYWxNYXBUeXBlcworICAtIFxyZWYgVHV0b3JpYWxNYXBVc2luZworICAtIFxyZWYgVHV0b3JpYWxNYXBQbGFjZW1lbnROZXcKKworXHNlY3Rpb24gVHV0b3JpYWxNYXBJbnRyb2R1Y3Rpb24gSW50cm9kdWN0aW9uCisKK09jY2FzaW9uYWxseSB5b3UgbWF5IGhhdmUgYSBwcmUtZGVmaW5lZCBhcnJheSBvZiBudW1iZXJzIHRoYXQgeW91IHdhbnQgdG8gdXNlIHdpdGhpbiBFaWdlbiBhcyBhIHZlY3RvciBvciBtYXRyaXguIFdoaWxlIG9uZSBvcHRpb24gaXMgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGRhdGEsIG1vc3QgY29tbW9ubHkgeW91IHByb2JhYmx5IHdhbnQgdG8gcmUtdXNlIHRoaXMgbWVtb3J5IGFzIGFuIEVpZ2VuIHR5cGUuIEZvcnR1bmF0ZWx5LCB0aGlzIGlzIHZlcnkgZWFzeSB3aXRoIHRoZSBNYXAgY2xhc3MuCisKK1xzZWN0aW9uIFR1dG9yaWFsTWFwVHlwZXMgTWFwIHR5cGVzIGFuZCBkZWNsYXJpbmcgTWFwIHZhcmlhYmxlcworCitBIE1hcCBvYmplY3QgaGFzIGEgdHlwZSBkZWZpbmVkIGJ5IGl0cyBFaWdlbiBlcXVpdmFsZW50OgorXGNvZGUKK01hcDxNYXRyaXg8dHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93c0F0Q29tcGlsZVRpbWUsIGludCBDb2xzQXRDb21waWxlVGltZT4gPgorXGVuZGNvZGUKK05vdGUgdGhhdCwgaW4gdGhpcyBkZWZhdWx0IGNhc2UsIGEgTWFwIHJlcXVpcmVzIGp1c3QgYSBzaW5nbGUgdGVtcGxhdGUgcGFyYW1ldGVyLiAgCisKK1RvIGNvbnN0cnVjdCBhIE1hcCB2YXJpYWJsZSwgeW91IG5lZWQgdHdvIG90aGVyIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjogYSBwb2ludGVyIHRvIHRoZSByZWdpb24gb2YgbWVtb3J5IGRlZmluaW5nIHRoZSBhcnJheSBvZiBjb2VmZmljaWVudHMsIGFuZCB0aGUgZGVzaXJlZCBzaGFwZSBvZiB0aGUgbWF0cml4IG9yIHZlY3Rvci4gIEZvciBleGFtcGxlLCB0byBkZWZpbmUgYSBtYXRyaXggb2YgXGMgZmxvYXQgd2l0aCBzaXplcyBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSwgeW91IG1pZ2h0IGRvIHRoZSBmb2xsb3dpbmc6CitcY29kZQorTWFwPE1hdHJpeFhmPiBtZihwZixyb3dzLGNvbHVtbnMpOworXGVuZGNvZGUKK3doZXJlIFxjIHBmIGlzIGEgXGMgZmxvYXQgXGMgKiBwb2ludGluZyB0byB0aGUgYXJyYXkgb2YgbWVtb3J5LiAgQSBmaXhlZC1zaXplIHJlYWQtb25seSB2ZWN0b3Igb2YgaW50ZWdlcnMgbWlnaHQgYmUgZGVjbGFyZWQgYXMKK1xjb2RlCitNYXA8Y29uc3QgVmVjdG9yNGk+IG1pKHBpKTsKK1xlbmRjb2RlCit3aGVyZSBcYyBwaSBpcyBhbiBcYyBpbnQgXGMgKi4gSW4gdGhpcyBjYXNlIHRoZSBzaXplIGRvZXMgbm90IGhhdmUgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciwgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNwZWNpZmllZCBieSB0aGUgTWF0cml4L0FycmF5IHR5cGUuCisKK05vdGUgdGhhdCBNYXAgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3I7IHlvdSBcZW0gbXVzdCBwYXNzIGEgcG9pbnRlciB0byBpbnRpYWxpemUgdGhlIG9iamVjdC4gSG93ZXZlciwgeW91IGNhbiB3b3JrIGFyb3VuZCB0aGlzIHJlcXVpcmVtZW50IChzZWUgXHJlZiBUdXRvcmlhbE1hcFBsYWNlbWVudE5ldykuCisKK01hcCBpcyBmbGV4aWJsZSBlbm91Z2ggdG8gYWNjb21vZGF0ZSBhIHZhcmlldHkgb2YgZGlmZmVyZW50IGRhdGEgcmVwcmVzZW50YXRpb25zLiAgVGhlcmUgYXJlIHR3byBvdGhlciAob3B0aW9uYWwpIHRlbXBsYXRlIHBhcmFtZXRlcnM6CitcY29kZQorTWFwPHR5cGVuYW1lIE1hdHJpeFR5cGUsCisgICAgaW50IE1hcE9wdGlvbnMsCisgICAgdHlwZW5hbWUgU3RyaWRlVHlwZT4KK1xlbmRjb2RlCitcbGkgXGMgTWFwT3B0aW9ucyBzcGVjaWZpZXMgd2hldGhlciB0aGUgcG9pbnRlciBpcyBcYyAjQWxpZ25lZCwgb3IgXGMgI1VuYWxpZ25lZC4gIFRoZSBkZWZhdWx0IGlzIFxjICNVbmFsaWduZWQuCitcbGkgXGMgU3RyaWRlVHlwZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBjdXN0b20gbGF5b3V0IGZvciB0aGUgbWVtb3J5IGFycmF5LCB1c2luZyB0aGUgU3RyaWRlIGNsYXNzLiAgT25lIGV4YW1wbGUgd291bGQgYmUgdG8gc3BlY2lmeSB0aGF0IHRoZSBkYXRhIGFycmF5IGlzIG9yZ2FuaXplZCBpbiByb3ctbWFqb3IgZm9ybWF0OgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorPHRkPlxpbmNsdWRlIFR1dG9yaWFsX01hcF9yb3dtYWpvci5jcHAgPC90ZD4KKzx0ZD5cdmVyYmluY2x1ZGUgVHV0b3JpYWxfTWFwX3Jvd21ham9yLm91dCA8L3RkPgorPC90YWJsZT4KK0hvd2V2ZXIsIFN0cmlkZSBpcyBldmVuIG1vcmUgZmxleGlibGUgdGhhbiB0aGlzOyBmb3IgZGV0YWlscywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgTWFwIGFuZCBTdHJpZGUgY2xhc3Nlcy4KKworXHNlY3Rpb24gVHV0b3JpYWxNYXBVc2luZyBVc2luZyBNYXAgdmFyaWFibGVzCisKK1lvdSBjYW4gdXNlIGEgTWFwIG9iamVjdCBqdXN0IGxpa2UgYW55IG90aGVyIEVpZ2VuIHR5cGU6Cis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+Cis8dGQ+XGluY2x1ZGUgVHV0b3JpYWxfTWFwX3VzaW5nLmNwcCA8L3RkPgorPHRkPlx2ZXJiaW5jbHVkZSBUdXRvcmlhbF9NYXBfdXNpbmcub3V0IDwvdGQ+Cis8L3RhYmxlPgorCitIb3dldmVyLCB3aGVuIHdyaXRpbmcgZnVuY3Rpb25zIHRha2luZyBFaWdlbiB0eXBlcywgaXQgaXMgaW1wb3J0YW50IHRvIHJlYWxpemUgdGhhdCBhIE1hcCB0eXBlIGlzIFxlbSBub3QgaWRlbnRpY2FsIHRvIGl0cyBEZW5zZSBlcXVpdmFsZW50LiAgU2VlIFxyZWYgVG9waWNGdW5jdGlvblRha2luZ0VpZ2VuVHlwZXNNdWx0aWFyZ3VtZW50cyBmb3IgZGV0YWlscy4KKworXHNlY3Rpb24gVHV0b3JpYWxNYXBQbGFjZW1lbnROZXcgQ2hhbmdpbmcgdGhlIG1hcHBlZCBhcnJheQorCitJdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIGFycmF5IG9mIGEgTWFwIG9iamVjdCBhZnRlciBkZWNsYXJhdGlvbiwgdXNpbmcgdGhlIEMrKyAicGxhY2VtZW50IG5ldyIgc3ludGF4OgorPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTo8L3RoPjx0aD5PdXRwdXQ6PC90aD48L3RyPgorPHRyPgorPHRkPlxpbmNsdWRlIE1hcF9wbGFjZW1lbnRfbmV3LmNwcCA8L3RkPgorPHRkPlx2ZXJiaW5jbHVkZSBNYXBfcGxhY2VtZW50X25ldy5vdXQgPC90ZD4KKzwvdGFibGU+CitEZXNwaXRlIGFwcGVhcmFuY2VzLCB0aGlzIGRvZXMgbm90IGludm9rZSB0aGUgbWVtb3J5IGFsbG9jYXRvciwgYmVjYXVzZSB0aGUgc3ludGF4IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gZm9yIHN0b3JpbmcgdGhlIHJlc3VsdC4KKworVGhpcyBzeW50YXggbWFrZXMgaXQgcG9zc2libGUgdG8gZGVjbGFyZSBhIE1hcCBvYmplY3Qgd2l0aG91dCBmaXJzdCBrbm93aW5nIHRoZSBtYXBwZWQgYXJyYXkncyBsb2NhdGlvbiBpbiBtZW1vcnk6CitcY29kZQorTWFwPE1hdHJpeDNmPiBBKE5VTEwpOyAgLy8gZG9uJ3QgdHJ5IHRvIHVzZSB0aGlzIG1hdHJpeCB5ZXQhCitWZWN0b3JYZiBiKG5fbWF0cmljZXMpOworZm9yIChpbnQgaSA9IDA7IGkgPCBuX21hdHJpY2VzOyBpKyspCit7CisgIG5ldyAoJkEpIE1hcDxNYXRyaXgzZj4oZ2V0X21hdHJpeF9wb2ludGVyKGkpKTsKKyAgYihpKSA9IEEudHJhY2UoKTsKK30KK1xlbmRjb2RlCisKK1xsaSBcYiBOZXh0OiBccmVmIFRPRE8KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0NNYWtlTGlzdHMudHh0IGIvZG9jL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YmZmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw3OCBAQAorcHJvamVjdChFaWdlbkRvYykKKworc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMgRVhDTFVERV9GUk9NX0FMTCBUUlVFKQorCitwcm9qZWN0KEVpZ2VuRG9jKQorCitpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpCisgIGlmKENNQUtFX1NZU1RFTV9OQU1FIE1BVENIRVMgTGludXgpCisgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1PMSAtZzEiKQorICBlbmRpZihDTUFLRV9TWVNURU1fTkFNRSBNQVRDSEVTIExpbnV4KQorZW5kaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYKQorCitjb25maWd1cmVfZmlsZSgKKyAgJHtFaWdlbl9TT1VSQ0VfRElSfS91bnN1cHBvcnRlZC9kb2MvRG94eWZpbGUuaW4KKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L0RveHlmaWxlLXVuc3VwcG9ydGVkCispCisKK2NvbmZpZ3VyZV9maWxlKAorICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vRG94eWZpbGUuaW4KKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L0RveHlmaWxlCispCisKK2NvbmZpZ3VyZV9maWxlKAorICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZWlnZW5kb3h5X2hlYWRlci5odG1sLmluCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9laWdlbmRveHlfaGVhZGVyLmh0bWwKKykKKworY29uZmlndXJlX2ZpbGUoCisgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9laWdlbmRveHlfZm9vdGVyLmh0bWwuaW4KKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2VpZ2VuZG94eV9mb290ZXIuaHRtbAorKQorCitzZXQoZXhhbXBsZXNfdGFyZ2V0cyAiIikKK3NldChzbmlwcGV0c190YXJnZXRzICIiKQorCithZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fTUFLSU5HX0RPQ1MiKQorCithZGRfc3ViZGlyZWN0b3J5KGV4YW1wbGVzKQorYWRkX3N1YmRpcmVjdG9yeShzcGVjaWFsX2V4YW1wbGVzKQorYWRkX3N1YmRpcmVjdG9yeShzbmlwcGV0cykKKworYWRkX2N1c3RvbV90YXJnZXQoCisgIGRvYy1laWdlbi1wcmVyZXF1aXNpdGVzCisgIEFMTAorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2h0bWwvCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9laWdlbmRveHlfdGFicy5jc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2h0bWwvCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9FaWdlbl9TaWxseV9Qcm9mZXNzb3JfNjR4NjQucG5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9odG1sLworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQXNjaWlRdWlja1JlZmVyZW5jZS50eHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2h0bWwvCisgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorKQorCithZGRfY3VzdG9tX3RhcmdldCgKKyAgZG9jLXVuc3VwcG9ydGVkLXByZXJlcXVpc2l0ZXMKKyAgQUxMCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9odG1sL3Vuc3VwcG9ydGVkCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7RWlnZW5fU09VUkNFX0RJUn0vZG9jL2VpZ2VuZG94eV90YWJzLmNzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9odG1sL3Vuc3VwcG9ydGVkLworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0VpZ2VuX1NPVVJDRV9ESVJ9L2RvYy9FaWdlbl9TaWxseV9Qcm9mZXNzb3JfNjR4NjQucG5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7RWlnZW5fQklOQVJZX0RJUn0vZG9jL2h0bWwvdW5zdXBwb3J0ZWQvCisgIFdPUktJTkdfRElSRUNUT1JZICR7RWlnZW5fQklOQVJZX0RJUn0vZG9jCispCisKK2FkZF9kZXBlbmRlbmNpZXMoZG9jLWVpZ2VuLXByZXJlcXVpc2l0ZXMgYWxsX3NuaXBwZXRzIGFsbF9leGFtcGxlcykKK2FkZF9kZXBlbmRlbmNpZXMoZG9jLXVuc3VwcG9ydGVkLXByZXJlcXVpc2l0ZXMgdW5zdXBwb3J0ZWRfc25pcHBldHMgdW5zdXBwb3J0ZWRfZXhhbXBsZXMpCisKK2FkZF9jdXN0b21fdGFyZ2V0KGRvYyBBTEwKKyAgQ09NTUFORCBkb3h5Z2VuIERveHlmaWxlLXVuc3VwcG9ydGVkCisgIENPTU1BTkQgZG94eWdlbgorICBDT01NQU5EIGRveHlnZW4gRG94eWZpbGUtdW5zdXBwb3J0ZWQgIyBydW4gZG94eWdlbiB0d2ljZSB0byBnZXQgcHJvcGVyIGVpZ2VuIDw9PiB1bnN1cHBvcnRlZCBjcm9zcyByZWZlcmVuY2VzCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW5hbWUgaHRtbCBlaWdlbi1kb2MKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRhciBjdmZ6IGVpZ2VuLWRvYy9laWdlbi1kb2MudGd6IGVpZ2VuLWRvYy8qLmh0bWwgZWlnZW4tZG9jLyoubWFwIGVpZ2VuLWRvYy8qLnBuZyBlaWdlbi1kb2MvKi5jc3MgZWlnZW4tZG9jLyouanMgZWlnZW4tZG9jLyoudHh0IGVpZ2VuLWRvYy91bnN1cHBvcnRlZAorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgcmVuYW1lIGVpZ2VuLWRvYyBodG1sCisgIFdPUktJTkdfRElSRUNUT1JZICR7RWlnZW5fQklOQVJZX0RJUn0vZG9jKQorCithZGRfZGVwZW5kZW5jaWVzKGRvYyBkb2MtZWlnZW4tcHJlcmVxdWlzaXRlcyBkb2MtdW5zdXBwb3J0ZWQtcHJlcmVxdWlzaXRlcykKZGlmZiAtLWdpdCBhL2RvYy9EMDFfU3RsQ29udGFpbmVycy5kb3ggYi9kb2MvRDAxX1N0bENvbnRhaW5lcnMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGJmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvRDAxX1N0bENvbnRhaW5lcnMuZG94CkBAIC0wLDAgKzEsNjUgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY1N0bENvbnRhaW5lcnMgVXNpbmcgU1RMIENvbnRhaW5lcnMgd2l0aCBFaWdlbgorCitcYiBUYWJsZSBcYiBvZiBcYiBjb250ZW50cworICAtIFxyZWYgc3VtbWFyeQorICAtIFxyZWYgYWxsb2NhdG9yCisgIC0gXHJlZiB2ZWN0b3IKKworXHNlY3Rpb24gc3VtbWFyeSBFeGVjdXRpdmUgc3VtbWFyeQorCitVc2luZyBTVEwgY29udGFpbmVycyBvbiBccmVmIFRvcGljRml4ZWRTaXplVmVjdG9yaXphYmxlICJmaXhlZC1zaXplIHZlY3Rvcml6YWJsZSBFaWdlbiB0eXBlcyIsIG9yIGNsYXNzZXMgaGF2aW5nIG1lbWJlcnMgb2Ygc3VjaCB0eXBlcywgcmVxdWlyZXMgdGFraW5nIHRoZSBmb2xsb3dpbmcgdHdvIHN0ZXBzOgorCitcbGkgQSAxNi1ieXRlLWFsaWduZWQgYWxsb2NhdG9yIG11c3QgYmUgdXNlZC4gRWlnZW4gZG9lcyBwcm92aWRlIG9uZSByZWFkeSBmb3IgdXNlOiBhbGlnbmVkX2FsbG9jYXRvci4KK1xsaSBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIHN0ZDo6dmVjdG9yIGNvbnRhaW5lciwgeW91IG5lZWQgdG8gXCNpbmNsdWRlIDxFaWdlbi9TdGRWZWN0b3I+LgorCitUaGVzZSBpc3N1ZXMgYXJpc2Ugb25seSB3aXRoIFxyZWYgVG9waWNGaXhlZFNpemVWZWN0b3JpemFibGUgImZpeGVkLXNpemUgdmVjdG9yaXphYmxlIEVpZ2VuIHR5cGVzIiBhbmQgXHJlZiBUb3BpY1N0cnVjdEhhdmluZ0VpZ2VuTWVtYmVycyAic3RydWN0dXJlcyBoYXZpbmcgc3VjaCBFaWdlbiBvYmplY3RzIGFzIG1lbWJlciIuIEZvciBvdGhlciBFaWdlbiB0eXBlcywgc3VjaCBhcyBWZWN0b3IzZiBvciBNYXRyaXhYZCwgbm8gc3BlY2lhbCBjYXJlIGlzIG5lZWRlZCB3aGVuIHVzaW5nIFNUTCBjb250YWluZXJzLgorCitcc2VjdGlvbiBhbGxvY2F0b3IgVXNpbmcgYW4gYWxpZ25lZCBhbGxvY2F0b3IKKworU1RMIGNvbnRhaW5lcnMgdGFrZSBhbiBvcHRpb25hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHRoZSBhbGxvY2F0b3IgdHlwZS4gV2hlbiB1c2luZyBTVEwgY29udGFpbmVycyBvbiBccmVmIFRvcGljRml4ZWRTaXplVmVjdG9yaXphYmxlICJmaXhlZC1zaXplIHZlY3Rvcml6YWJsZSBFaWdlbiB0eXBlcyIsIHlvdSBuZWVkIHRlbGwgdGhlIGNvbnRhaW5lciB0byB1c2UgYW4gYWxsb2NhdG9yIHRoYXQgd2lsbCBhbHdheXMgYWxsb2NhdGUgbWVtb3J5IGF0IDE2LWJ5dGUtYWxpZ25lZCBsb2NhdGlvbnMuIEZvcnR1bmF0ZWx5LCBFaWdlbiBkb2VzIHByb3ZpZGUgc3VjaCBhbiBhbGxvY2F0b3I6IEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvci4KKworRm9yIGV4YW1wbGUsIGluc3RlYWQgb2YKK1xjb2RlCitzdGQ6Om1hcDxpbnQsIEVpZ2VuOjpWZWN0b3I0Zj4KK1xlbmRjb2RlCit5b3UgbmVlZCB0byB1c2UKK1xjb2RlCitzdGQ6Om1hcDxpbnQsIEVpZ2VuOjpWZWN0b3I0Ziwgc3RkOjpsZXNzPGludD4sIAorICAgICAgICAgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBpbnQsIEVpZ2VuOjpWZWN0b3I0Zj4gPiA+CitcZW5kY29kZQorTm90ZSB0aGF0IHRoZSB0aGlyZCBwYXJhbWV0ZXIgInN0ZDo6bGVzczxpbnQ+IiBpcyBqdXN0IHRoZSBkZWZhdWx0IHZhbHVlLCBidXQgd2UgaGF2ZSB0byBpbmNsdWRlIGl0IGJlY2F1c2Ugd2Ugd2FudCB0byBzcGVjaWZ5IHRoZSBmb3VydGggcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgYWxsb2NhdG9yIHR5cGUuCisKK1xzZWN0aW9uIHZlY3RvciBUaGUgY2FzZSBvZiBzdGQ6OnZlY3RvcgorCitUaGUgc2l0dWF0aW9uIHdpdGggc3RkOjp2ZWN0b3Igd2FzIGV2ZW4gd29yc2UgKGV4cGxhbmF0aW9uIGJlbG93KSBzbyB3ZSBoYWQgdG8gc3BlY2lhbGl6ZSBpdCBmb3IgdGhlIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvciB0eXBlLiBJbiBwcmFjdGljZSB5b3UgXGIgbXVzdCB1c2UgdGhlIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvciAobm90IGFub3RoZXIgYWxpZ25lZCBhbGxvY2F0b3IpLCBcYiBhbmQgXCNpbmNsdWRlIDxFaWdlbi9TdGRWZWN0b3I+LgorCitIZXJlIGlzIGFuIGV4YW1wbGU6CitcY29kZQorI2luY2x1ZGU8RWlnZW4vU3RkVmVjdG9yPgorXC8qIC4uLiAqXC8KK3N0ZDo6dmVjdG9yPEVpZ2VuOjpWZWN0b3I0ZixFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8RWlnZW46OlZlY3RvcjRmPiA+CitcZW5kY29kZQorCitcc3Vic2VjdGlvbiB2ZWN0b3Jfc3BlYyBBbiBhbHRlcm5hdGl2ZSAtIHNwZWNpYWxpemluZyBzdGQ6OnZlY3RvciBmb3IgRWlnZW4gdHlwZXMKKworQXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoIGRlc2NyaWJlZCBhYm92ZSwgeW91IGhhdmUgdGhlIG9wdGlvbiB0byBzcGVjaWFsaXplIHN0ZDo6dmVjdG9yIGZvciBFaWdlbiB0eXBlcyByZXF1aXJpbmcgYWxpZ25tZW50LiAKK1RoZSBhZHZhbnRhZ2UgaXMgdGhhdCB5b3Ugd29uJ3QgbmVlZCB0byBkZWNsYXJlIHN0ZDo6dmVjdG9yIGFsbCBvdmVyIHdpdGggRWlnZW46OmFsbG9jYXRvci4gT25lIGRyYXdiYWNrIG9uIHRoZSBvdGhlciBoYW5kIHNpZGUgaXMgdGhhdAordGhlIHNwZWNpYWxpemF0aW9uIG5lZWRzIHRvIGJlIGRlZmluZWQgYmVmb3JlIGFsbCBjb2RlIHBpZWNlcyBpbiB3aGljaCBlLmcuIHN0ZDo6dmVjdG9yPFZlY3RvcjJkPiBpcyB1c2VkLiBPdGhlcndpc2UsIHdpdGhvdXQga25vd2luZyB0aGUgc3BlY2lhbGl6YXRpb24KK3RoZSBjb21waWxlciB3aWxsIGNvbXBpbGUgdGhhdCBwYXJ0aWN1bGFyIGluc3RhbmNlIHdpdGggdGhlIGRlZmF1bHQgc3RkOjphbGxvY2F0b3IgYW5kIHlvdSBwcm9ncmFtIGlzIG1vc3QgbGlrZWx5IHRvIGNyYXNoLgorCitIZXJlIGlzIGFuIGV4YW1wbGU6CitcY29kZQorI2luY2x1ZGU8RWlnZW4vU3RkVmVjdG9yPgorXC8qIC4uLiAqXC8KK0VJR0VOX0RFRklORV9TVExfVkVDVE9SX1NQRUNJQUxJWkFUSU9OKE1hdHJpeDJkKQorc3RkOjp2ZWN0b3I8RWlnZW46OlZlY3RvcjJkPgorXGVuZGNvZGUKKworPHNwYW4gY2xhc3M9Im5vdGUiPlxiIEV4cGxhbmF0aW9uOiBUaGUgcmVzaXplKCkgbWV0aG9kIG9mIHN0ZDo6dmVjdG9yIHRha2VzIGEgdmFsdWVfdHlwZSBhcmd1bWVudCAoZGVmYXVsdGluZyB0byB2YWx1ZV90eXBlKCkpLiBTbyB3aXRoIHN0ZDo6dmVjdG9yPEVpZ2VuOjpWZWN0b3I0Zj4sIHNvbWUgRWlnZW46OlZlY3RvcjRmIG9iamVjdHMgd2lsbCBiZSBwYXNzZWQgYnkgdmFsdWUsIHdoaWNoIGRpc2NhcmRzIGFueSBhbGlnbm1lbnQgbW9kaWZpZXJzLCBzbyBhIEVpZ2VuOjpWZWN0b3I0ZiBjYW4gYmUgY3JlYXRlZCBhdCBhbiB1bmFsaWduZWQgbG9jYXRpb24uIEluIG9yZGVyIHRvIGF2b2lkIHRoYXQsIHRoZSBvbmx5IHNvbHV0aW9uIHdlIHNhdyB3YXMgdG8gc3BlY2lhbGl6ZSBzdGQ6OnZlY3RvciB0byBtYWtlIGl0IHdvcmsgb24gYSBzbGlnaHQgbW9kaWZpY2F0aW9uIG9mLCBoZXJlLCBFaWdlbjo6VmVjdG9yNGYsIHRoYXQgaXMgYWJsZSB0byBkZWFsIHByb3Blcmx5IHdpdGggdGhpcyBzaXR1YXRpb24uCis8L3NwYW4+CisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9EMDNfV3JvbmdTdGFja0FsaWdubWVudC5kb3ggYi9kb2MvRDAzX1dyb25nU3RhY2tBbGlnbm1lbnQuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTQyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvRDAzX1dyb25nU3RhY2tBbGlnbm1lbnQuZG94CkBAIC0wLDAgKzEsNTYgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY1dyb25nU3RhY2tBbGlnbm1lbnQgQ29tcGlsZXIgbWFraW5nIGEgd3JvbmcgYXNzdW1wdGlvbiBvbiBzdGFjayBhbGlnbm1lbnQKKworPGg0Pkl0IGFwcGVhcnMgdGhhdCB0aGlzIHdhcyBhIEdDQyBidWcgdGhhdCBoYXMgYmVlbiBmaXhlZCBpbiBHQ0MgNC41LgorSWYgeW91IGhpdCB0aGlzIGlzc3VlLCBwbGVhc2UgdXBncmFkZSB0byBHQ0MgNC41IGFuZCByZXBvcnQgdG8gdXMsIHNvIHdlIGNhbiB1cGRhdGUgdGhpcyBwYWdlLjwvaDQ+CisKK1RoaXMgaXMgYW4gaXNzdWUgdGhhdCwgc28gZmFyLCB3ZSBtZXQgb25seSB3aXRoIEdDQyBvbiBXaW5kb3dzOiBmb3IgaW5zdGFuY2UsIE1pbkdXIGFuZCBURE0tR0NDLgorCitCeSBkZWZhdWx0LCBpbiBhIGZ1bmN0aW9uIGxpa2UgdGhpcywKKworXGNvZGUKK3ZvaWQgZm9vKCkKK3sKKyAgRWlnZW46OlF1YXRlcm5pb25mIHE7CisgIC8vLi4uCit9CitcZW5kY29kZQorCitHQ0MgYXNzdW1lcyB0aGF0IHRoZSBzdGFjayBpcyBhbHJlYWR5IDE2LWJ5dGUtYWxpZ25lZCBzbyB0aGF0IHRoZSBvYmplY3QgXGEgcSB3aWxsIGJlIGNyZWF0ZWQgYXQgYSAxNi1ieXRlLWFsaWduZWQgbG9jYXRpb24uIEZvciB0aGlzIHJlYXNvbiwgaXQgZG9lc24ndCB0YWtlIGFueSBzcGVjaWFsIGNhcmUgdG8gZXhwbGljaXRseSBhbGlnbiB0aGUgb2JqZWN0IFxhIHEsIGFzIEVpZ2VuIHJlcXVpcmVzLgorCitUaGUgcHJvYmxlbSBpcyB0aGF0LCBpbiBzb21lIHBhcnRpY3VsYXIgY2FzZXMsIHRoaXMgYXNzdW1wdGlvbiBjYW4gYmUgd3Jvbmcgb24gV2luZG93cywgd2hlcmUgdGhlIHN0YWNrIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBoYXZlIDQtYnl0ZSBhbGlnbm1lbnQuIEluZGVlZCwgZXZlbiB0aG91Z2ggR0NDIHRha2VzIGNhcmUgb2YgYWxpZ25pbmcgdGhlIHN0YWNrIGluIHRoZSBtYWluIGZ1bmN0aW9uIGFuZCBkb2VzIGl0cyBiZXN0IHRvIGtlZXAgaXQgYWxpZ25lZCwgd2hlbiBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGFub3RoZXIgdGhyZWFkIG9yIGZyb20gYSBiaW5hcnkgY29tcGlsZWQgd2l0aCBhbm90aGVyIGNvbXBpbGVyLCB0aGUgc3RhY2sgYWxpZ25tZW50IGNhbiBiZSBjb3JydXB0ZWQuIFRoaXMgcmVzdWx0cyBpbiB0aGUgb2JqZWN0ICdxJyBiZWluZyBjcmVhdGVkIGF0IGFuIHVuYWxpZ25lZCBsb2NhdGlvbiwgbWFraW5nIHlvdXIgcHJvZ3JhbSBjcmFzaCB3aXRoIHRoZSBccmVmIFRvcGljVW5hbGlnbmVkQXJyYXlBc3NlcnQgImFzc2VydGlvbiBvbiB1bmFsaWduZWQgYXJyYXlzIi4gU28gZmFyIHdlIGZvdW5kIHRoZSB0aHJlZSBmb2xsb3dpbmcgc29sdXRpb25zLgorCisKK1xzZWN0aW9uIHNlY19zb2wxIExvY2FsIHNvbHV0aW9uCisKK0EgbG9jYWwgc29sdXRpb24gaXMgdG8gbWFyayBzdWNoIGEgZnVuY3Rpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZToKK1xjb2RlCitfX2F0dHJpYnV0ZV9fKChmb3JjZV9hbGlnbl9hcmdfcG9pbnRlcikpIHZvaWQgZm9vKCkKK3sKKyAgRWlnZW46OlF1YXRlcm5pb25mIHE7CisgIC8vLi4uCit9CitcZW5kY29kZQorUmVhZCA8YSBocmVmPSJodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtNC40LjAvZ2NjL0Z1bmN0aW9uLUF0dHJpYnV0ZXMuaHRtbCNGdW5jdGlvbi1BdHRyaWJ1dGVzIj50aGlzIEdDQyBkb2N1bWVudGF0aW9uPC9hPiB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBkb2VzLiBPZiBjb3Vyc2UgdGhpcyBzaG91bGQgb25seSBiZSBkb25lIG9uIEdDQyBvbiBXaW5kb3dzLCBzbyBmb3IgcG9ydGFiaWxpdHkgeW91J2xsIGhhdmUgdG8gZW5jYXBzdWxhdGUgdGhpcyBpbiBhIG1hY3JvIHdoaWNoIHlvdSBsZWF2ZSBlbXB0eSBvbiBvdGhlciBwbGF0Zm9ybXMuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBzb2x1dGlvbiBpcyB0aGF0IHlvdSBjYW4gZmluZWx5IHNlbGVjdCB3aGljaCBmdW5jdGlvbiBtaWdodCBoYXZlIGEgY29ycnVwdGVkIHN0YWNrIGFsaWdubWVudC4gT2YgY291cnNlIG9uIHRoZSBkb3duc2lkZSB0aGlzIGhhcyB0byBiZSBkb25lIGZvciBldmVyeSBzdWNoIGZ1bmN0aW9uLCBzbyB5b3UgbWF5IHByZWZlciBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gZ2xvYmFsIHNvbHV0aW9ucy4KKworCitcc2VjdGlvbiBzZWNfc29sMiBHbG9iYWwgc29sdXRpb25zCisKK0EgZ2xvYmFsIHNvbHV0aW9uIGlzIHRvIGVkaXQgeW91ciBwcm9qZWN0IHNvIHRoYXQgd2hlbiBjb21waWxpbmcgd2l0aCBHQ0Mgb24gV2luZG93cywgeW91IHBhc3MgdGhpcyBvcHRpb24gdG8gR0NDOgorXGNvZGUKKy1taW5jb21pbmctc3RhY2stYm91bmRhcnk9MgorXGVuZGNvZGUKK0V4cGxhbmF0aW9uOiB0aGlzIHRlbGxzIEdDQyB0aGF0IHRoZSBzdGFjayBpcyBvbmx5IHJlcXVpcmVkIHRvIGJlIGFsaWduZWQgdG8gMl4yPTQgYnl0ZXMsIHNvIHRoYXQgR0NDIG5vdyBrbm93cyB0aGF0IGl0IHJlYWxseSBtdXN0IHRha2UgZXh0cmEgY2FyZSB0byBob25vciB0aGUgMTYgYnl0ZSBhbGlnbm1lbnQgb2YgXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gdHlwZXMiIHdoZW4gbmVlZGVkLgorCitBbm90aGVyIGdsb2JhbCBzb2x1dGlvbiBpcyB0byBwYXNzIHRoaXMgb3B0aW9uIHRvIGdjYzoKK1xjb2RlCistbXN0YWNrcmVhbGlnbgorXGVuZGNvZGUKK3doaWNoIGhhcyB0aGUgc2FtZSBlZmZlY3QgdGhhbiBhZGRpbmcgdGhlIFxjIGZvcmNlX2FsaWduX2FyZ19wb2ludGVyIGF0dHJpYnV0ZSB0byBhbGwgZnVuY3Rpb25zLgorCitUaGVzZSBnbG9iYWwgc29sdXRpb25zIGFyZSBlYXN5IHRvIHVzZSwgYnV0IG5vdGUgdGhhdCB0aGV5IG1heSBzbG93ZG93biB5b3VyIHByb2dyYW0gYmVjYXVzZSB0aGV5IGxlYWQgdG8gZXh0cmEgcHJvbG9ndWUvZXBpbG9ndWUgaW5zdHJ1Y3Rpb25zIGZvciBldmVyeSBmdW5jdGlvbi4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0QwN19QYXNzaW5nQnlWYWx1ZS5kb3ggYi9kb2MvRDA3X1Bhc3NpbmdCeVZhbHVlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWU1ZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0QwN19QYXNzaW5nQnlWYWx1ZS5kb3gKQEAgLTAsMCArMSw0MCBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljUGFzc2luZ0J5VmFsdWUgUGFzc2luZyBFaWdlbiBvYmplY3RzIGJ5IHZhbHVlIHRvIGZ1bmN0aW9ucworCitQYXNzaW5nIG9iamVjdHMgYnkgdmFsdWUgaXMgYWxtb3N0IGFsd2F5cyBhIHZlcnkgYmFkIGlkZWEgaW4gQysrLCBhcyB0aGlzIG1lYW5zIHVzZWxlc3MgY29waWVzLCBhbmQgb25lIHNob3VsZCBwYXNzIHRoZW0gYnkgcmVmZXJlbmNlIGluc3RlYWQuCisKK1dpdGggRWlnZW4sIHRoaXMgaXMgZXZlbiBtb3JlIGltcG9ydGFudDogcGFzc2luZyBccmVmIFRvcGljRml4ZWRTaXplVmVjdG9yaXphYmxlICJmaXhlZC1zaXplIHZlY3Rvcml6YWJsZSBFaWdlbiBvYmplY3RzIiBieSB2YWx1ZSBpcyBub3Qgb25seSBpbmVmZmljaWVudCwgaXQgY2FuIGJlIGlsbGVnYWwgb3IgbWFrZSB5b3VyIHByb2dyYW0gY3Jhc2ghIEFuZCB0aGUgcmVhc29uIGlzIHRoYXQgdGhlc2UgRWlnZW4gb2JqZWN0cyBoYXZlIGFsaWdubWVudCBtb2RpZmllcnMgdGhhdCBhcmVuJ3QgcmVzcGVjdGVkIHdoZW4gdGhleSBhcmUgcGFzc2VkIGJ5IHZhbHVlLgorCitTbyBmb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBsaWtlIHRoaXMsIHdoZXJlIHYgaXMgcGFzc2VkIGJ5IHZhbHVlOgorCitcY29kZQordm9pZCBteV9mdW5jdGlvbihFaWdlbjo6VmVjdG9yMmQgdik7CitcZW5kY29kZQorCituZWVkcyB0byBiZSByZXdyaXR0ZW4gYXMgZm9sbG93cywgcGFzc2luZyB2IGJ5IHJlZmVyZW5jZToKKworXGNvZGUKK3ZvaWQgbXlfZnVuY3Rpb24oY29uc3QgRWlnZW46OlZlY3RvcjJkJiB2KTsKK1xlbmRjb2RlCisKK0xpa2V3aXNlIGlmIHlvdSBoYXZlIGEgY2xhc3MgaGF2aW5nIGEgRWlnZW4gb2JqZWN0IGFzIG1lbWJlcjoKKworXGNvZGUKK3N0cnVjdCBGb28KK3sKKyAgRWlnZW46OlZlY3RvcjJkIHY7Cit9Owordm9pZCBteV9mdW5jdGlvbihGb28gdik7CitcZW5kY29kZQorCitUaGlzIGZ1bmN0aW9uIGFsc28gbmVlZHMgdG8gYmUgcmV3cml0dGVuIGxpa2UgdGhpczoKK1xjb2RlCit2b2lkIG15X2Z1bmN0aW9uKGNvbnN0IEZvbyYgdik7CitcZW5kY29kZQorCitOb3RlIHRoYXQgb24gdGhlIG90aGVyIGhhbmQsIHRoZXJlIGlzIG5vIHByb2JsZW0gd2l0aCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gb2JqZWN0cyBieSB2YWx1ZS4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0QwOV9TdHJ1Y3RIYXZpbmdFaWdlbk1lbWJlcnMuZG94IGIvZG9jL0QwOV9TdHJ1Y3RIYXZpbmdFaWdlbk1lbWJlcnMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNzg5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvRDA5X1N0cnVjdEhhdmluZ0VpZ2VuTWVtYmVycy5kb3gKQEAgLTAsMCArMSwxOTggQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY1N0cnVjdEhhdmluZ0VpZ2VuTWVtYmVycyBTdHJ1Y3R1cmVzIEhhdmluZyBFaWdlbiBNZW1iZXJzCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzCisgIC0gXHJlZiBzdW1tYXJ5CisgIC0gXHJlZiB3aGF0CisgIC0gXHJlZiBob3cKKyAgLSBccmVmIHdoeQorICAtIFxyZWYgbW92ZXRvdG9wCisgIC0gXHJlZiBidWdpbmVpZ2VuCisgIC0gXHJlZiBjb25kaXRpb25hbAorICAtIFxyZWYgb3RoZXJzb2x1dGlvbnMKKworXHNlY3Rpb24gc3VtbWFyeSBFeGVjdXRpdmUgU3VtbWFyeQorCitJZiB5b3UgZGVmaW5lIGEgc3RydWN0dXJlIGhhdmluZyBtZW1iZXJzIG9mIFxyZWYgVG9waWNGaXhlZFNpemVWZWN0b3JpemFibGUgImZpeGVkLXNpemUgdmVjdG9yaXphYmxlIEVpZ2VuIHR5cGVzIiwgeW91IG11c3Qgb3ZlcmxvYWQgaXRzICJvcGVyYXRvciBuZXciIHNvIHRoYXQgaXQgZ2VuZXJhdGVzIDE2LWJ5dGVzLWFsaWduZWQgcG9pbnRlcnMuIEZvcnR1bmF0ZWx5LCBFaWdlbiBwcm92aWRlcyB5b3Ugd2l0aCBhIG1hY3JvIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcgdGhhdCBkb2VzIHRoYXQgZm9yIHlvdS4KKworXHNlY3Rpb24gd2hhdCBXaGF0IGtpbmQgb2YgY29kZSBuZWVkcyB0byBiZSBjaGFuZ2VkPworCitUaGUga2luZCBvZiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBpcyB0aGlzOgorCitcY29kZQorY2xhc3MgRm9vCit7CisgIC4uLgorICBFaWdlbjo6VmVjdG9yMmQgdjsKKyAgLi4uCit9OworCisuLi4KKworRm9vICpmb28gPSBuZXcgRm9vOworXGVuZGNvZGUKKworSW4gb3RoZXIgd29yZHM6IHlvdSBoYXZlIGEgY2xhc3MgdGhhdCBoYXMgYXMgYSBtZW1iZXIgYSBccmVmIFRvcGljRml4ZWRTaXplVmVjdG9yaXphYmxlICJmaXhlZC1zaXplIHZlY3Rvcml6YWJsZSBFaWdlbiBvYmplY3QiLCBhbmQgdGhlbiB5b3UgZHluYW1pY2FsbHkgY3JlYXRlIGFuIG9iamVjdCBvZiB0aGF0IGNsYXNzLgorCitcc2VjdGlvbiBob3cgSG93IHNob3VsZCBzdWNoIGNvZGUgYmUgbW9kaWZpZWQ/CisKK1ZlcnkgZWFzeSwgeW91IGp1c3QgbmVlZCB0byBwdXQgYSBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXIG1hY3JvIGluIGEgcHVibGljIHBhcnQgb2YgeW91ciBjbGFzcywgbGlrZSB0aGlzOgorCitcY29kZQorY2xhc3MgRm9vCit7CisgIC4uLgorICBFaWdlbjo6VmVjdG9yMmQgdjsKKyAgLi4uCitwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKK307CisKKy4uLgorCitGb28gKmZvbyA9IG5ldyBGb287CitcZW5kY29kZQorCitUaGlzIG1hY3JvIG1ha2VzICJuZXcgRm9vIiBhbHdheXMgcmV0dXJuIGFuIGFsaWduZWQgcG9pbnRlci4KKworSWYgdGhpcyBhcHByb2FjaCBpcyB0b28gaW50cnVzaXZlLCBzZWUgYWxzbyB0aGUgXHJlZiBvdGhlcnNvbHV0aW9ucy4KKworXHNlY3Rpb24gd2h5IFdoeSBpcyB0aGlzIG5lZWRlZD8KKworT0sgbGV0J3Mgc2F5IHRoYXQgeW91ciBjb2RlIGxvb2tzIGxpa2UgdGhpczoKKworXGNvZGUKK2NsYXNzIEZvbworeworICAuLi4KKyAgRWlnZW46OlZlY3RvcjJkIHY7CisgIC4uLgorfTsKKworLi4uCisKK0ZvbyAqZm9vID0gbmV3IEZvbzsKK1xlbmRjb2RlCisKK0EgRWlnZW46OlZlY3RvcjJkIGNvbnNpc3RzIG9mIDIgZG91Ymxlcywgd2hpY2ggaXMgMTI4IGJpdHMuIFdoaWNoIGlzIGV4YWN0bHkgdGhlIHNpemUgb2YgYSBTU0UgcGFja2V0LCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgU1NFIGZvciBhbGwgc29ydHMgb2Ygb3BlcmF0aW9ucyBvbiB0aGlzIHZlY3Rvci4gQnV0IFNTRSBpbnN0cnVjdGlvbnMgKGF0IGxlYXN0IHRoZSBvbmVzIHRoYXQgRWlnZW4gdXNlcywgd2hpY2ggYXJlIHRoZSBmYXN0IG9uZXMpIHJlcXVpcmUgMTI4LWJpdCBhbGlnbm1lbnQuIE90aGVyd2lzZSB5b3UgZ2V0IGEgc2VnbWVudGF0aW9uIGZhdWx0LgorCitGb3IgdGhpcyByZWFzb24sIEVpZ2VuIHRha2VzIGNhcmUgYnkgaXRzZWxmIHRvIHJlcXVpcmUgMTI4LWJpdCBhbGlnbm1lbnQgZm9yIEVpZ2VuOjpWZWN0b3IyZCwgYnkgZG9pbmcgdHdvIHRoaW5nczoKK1xsaSBFaWdlbiByZXF1aXJlcyAxMjgtYml0IGFsaWdubWVudCBmb3IgdGhlIEVpZ2VuOjpWZWN0b3IyZCdzIGFycmF5IChvZiAyIGRvdWJsZXMpLiBXaXRoIEdDQywgdGhpcyBpcyBkb25lIHdpdGggYSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKS4KK1xsaSBFaWdlbiBvdmVybG9hZHMgdGhlICJvcGVyYXRvciBuZXciIG9mIEVpZ2VuOjpWZWN0b3IyZCBzbyBpdCB3aWxsIGFsd2F5cyByZXR1cm4gMTI4LWJpdCBhbGlnbmVkIHBvaW50ZXJzLgorCitUaHVzLCBub3JtYWxseSwgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW55dGhpbmcsIEVpZ2VuIGhhbmRsZXMgYWxpZ25tZW50IGZvciB5b3UuLi4KKworLi4uIGV4Y2VwdCBpbiBvbmUgY2FzZS4gV2hlbiB5b3UgaGF2ZSBhIGNsYXNzIEZvbyBsaWtlIGFib3ZlLCBhbmQgeW91IGR5bmFtaWNhbGx5IGFsbG9jYXRlIGEgbmV3IEZvbyBhcyBhYm92ZSwgdGhlbiwgc2luY2UgRm9vIGRvZXNuJ3QgaGF2ZSBhbGlnbmVkICJvcGVyYXRvciBuZXciLCB0aGUgcmV0dXJuZWQgcG9pbnRlciBmb28gaXMgbm90IG5lY2Vzc2FyaWx5IDEyOC1iaXQgYWxpZ25lZC4KKworVGhlIGFsaWdubWVudCBhdHRyaWJ1dGUgb2YgdGhlIG1lbWJlciB2IGlzIHRoZW4gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjbGFzcywgZm9vLiBJZiB0aGUgZm9vIHBvaW50ZXIgd2Fzbid0IGFsaWduZWQsIHRoZW4gZm9vLT52IHdvbid0IGJlIGFsaWduZWQgZWl0aGVyIQorCitUaGUgc29sdXRpb24gaXMgdG8gbGV0IGNsYXNzIEZvbyBoYXZlIGFuIGFsaWduZWQgIm9wZXJhdG9yIG5ldyIsIGFzIHdlIHNob3dlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4KKworXHNlY3Rpb24gbW92ZXRvdG9wIFNob3VsZCBJIHRoZW4gcHV0IGFsbCB0aGUgbWVtYmVycyBvZiBFaWdlbiB0eXBlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIG15IGNsYXNzPworCitUaGF0J3Mgbm90IHJlcXVpcmVkLiBTaW5jZSBFaWdlbiB0YWtlcyBjYXJlIG9mIGRlY2xhcmluZyAxMjgtYml0IGFsaWdubWVudCwgYWxsIG1lbWJlcnMgdGhhdCBuZWVkIGl0IGFyZSBhdXRvbWF0aWNhbGx5IDEyOC1iaXQgYWxpZ25lZCByZWxhdGl2ZWx5IHRvIHRoZSBjbGFzcy4gU28gY29kZSBsaWtlIHRoaXMgd29ya3MgZmluZToKKworXGNvZGUKK2NsYXNzIEZvbworeworICBkb3VibGUgeDsKKyAgRWlnZW46OlZlY3RvcjJkIHY7CitwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKK307CitcZW5kY29kZQorCitcc2VjdGlvbiBkeW5hbWljc2l6ZSBXaGF0IGFib3V0IGR5bmFtaWMtc2l6ZSBtYXRyaWNlcyBhbmQgdmVjdG9ycz8KKworRHluYW1pYy1zaXplIG1hdHJpY2VzIGFuZCB2ZWN0b3JzLCBzdWNoIGFzIEVpZ2VuOjpWZWN0b3JYZCwgYWxsb2NhdGUgZHluYW1pY2FsbHkgdGhlaXIgb3duIGFycmF5IG9mIGNvZWZmaWNpZW50cywgc28gdGhleSB0YWtlIGNhcmUgb2YgcmVxdWlyaW5nIGFic29sdXRlIGFsaWdubWVudCBhdXRvbWF0aWNhbGx5LiBTbyB0aGV5IGRvbid0IGNhdXNlIHRoaXMgaXNzdWUuIFRoZSBpc3N1ZSBkaXNjdXNzZWQgaGVyZSBpcyBvbmx5IHdpdGggXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAgImZpeGVkLXNpemUgdmVjdG9yaXphYmxlIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIi4KKworXHNlY3Rpb24gYnVnaW5laWdlbiBTbyBpcyB0aGlzIGEgYnVnIGluIEVpZ2VuPworCitObywgaXQncyBub3Qgb3VyIGJ1Zy4gSXQncyBtb3JlIGxpa2UgYW4gaW5oZXJlbnQgcHJvYmxlbSBvZiB0aGUgQysrOTggbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvbiwgYW5kIHNlZW1zIHRvIGJlIHRha2VuIGNhcmUgb2YgaW4gdGhlIHVwY29taW5nIGxhbmd1YWdlIHJldmlzaW9uOiA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA3L24yMzQxLnBkZiI+c2VlIHRoaXMgZG9jdW1lbnQ8L2E+LgorCitcc2VjdGlvbiBjb25kaXRpb25hbCBXaGF0IGlmIEkgd2FudCB0byBkbyB0aGlzIGNvbmRpdGlvbm5hbGx5IChkZXBlbmRpbmcgb24gdGVtcGxhdGUgcGFyYW1ldGVycykgPworCitGb3IgdGhpcyBzaXR1YXRpb24sIHdlIG9mZmVyIHRoZSBtYWNybyBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGKE5lZWRzVG9BbGlnbikuIEl0IHdpbGwgZ2VuZXJhdGUgYWxpZ25lZCBvcGVyYXRvcnMgbGlrZSBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXIGlmIE5lZWRzVG9BbGlnbiBpcyB0cnVlLiBJdCB3aWxsIGdlbmVyYXRlIG9wZXJhdG9ycyB3aXRoIHRoZSBkZWZhdWx0IGFsaWdubWVudCBpZiBOZWVkc1RvQWxpZ24gaXMgZmFsc2UuCisKK0V4YW1wbGU6CisKK1xjb2RlCit0ZW1wbGF0ZTxpbnQgbj4gY2xhc3MgRm9vCit7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxmbG9hdCxuLDE+IFZlY3RvcjsKKyAgZW51bSB7IE5lZWRzVG9BbGlnbiA9IChzaXplb2YoVmVjdG9yKSUxNik9PTAgfTsKKyAgLi4uCisgIFZlY3RvciB2OworICAuLi4KK3B1YmxpYzoKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRihOZWVkc1RvQWxpZ24pCit9OworCisuLi4KKworRm9vPDQ+ICpmb280ID0gbmV3IEZvbzw0PjsgLy8gZm9vNCBpcyBndWFyYW50ZWVkIHRvIGJlIDEyOGJpdC1hbGlnbmVkCitGb288Mz4gKmZvbzMgPSBuZXcgRm9vPDM+OyAvLyBmb28zIGhhcyBvbmx5IHRoZSBzeXN0ZW0gZGVmYXVsdCBhbGlnbm1lbnQgZ3VhcmFudGVlCitcZW5kY29kZQorCisKK1xzZWN0aW9uIG90aGVyc29sdXRpb25zIE90aGVyIHNvbHV0aW9ucworCitJbiBjYXNlIHB1dHRpbmcgdGhlIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcgbWFjcm8gZXZlcnl3aGVyZSBpcyB0b28gaW50cnVzaXZlLCB0aGVyZSBleGlzdHMgYXQgbGVhc3QgdHdvIG90aGVyIHNvbHV0aW9ucy4KKworXHN1YnNlY3Rpb24gb3RoZXJzb2x1dGlvbnMxIERpc2FibGluZyBhbGlnbm1lbnQKKworVGhlIGZpcnN0IGlzIHRvIGRpc2FibGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciB0aGUgZml4ZWQgc2l6ZSBtZW1iZXJzOgorXGNvZGUKK2NsYXNzIEZvbworeworICAuLi4KKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsMiwxLEVpZ2VuOjpEb250QWxpZ24+IHY7CisgIC4uLgorfTsKK1xlbmRjb2RlCitUaGlzIGhhcyBmb3IgZWZmZWN0IHRvIGRpc2FibGUgdmVjdG9yaXphdGlvbiB3aGVuIHVzaW5nIFxjIHYuCitJZiBhIGZ1bmN0aW9uIG9mIEZvbyB1c2VzIGl0IHNldmVyYWwgdGltZXMsIHRoZW4gaXQgc3RpbGwgcG9zc2libGUgdG8gcmUtZW5hYmxlIHZlY3Rvcml6YXRpb24gYnkgY29weWluZyBpdCBpbnRvIGFuIGFsaWduZWQgdGVtcG9yYXJ5IHZlY3RvcjoKK1xjb2RlCit2b2lkIEZvbzo6YmFyKCkKK3sKKyAgRWlnZW46OlZlY3RvcjJkIGF2KHYpOworICAvLyB1c2UgYXYgaW5zdGVhZCBvZiB2CisgIC4uLgorICAvLyBpZiBhdiBjaGFuZ2VkLCB0aGVuIGRvOgorICB2ID0gYXY7Cit9CitcZW5kY29kZQorCitcc3Vic2VjdGlvbiBvdGhlcnNvbHV0aW9uczIgUHJpdmF0ZSBzdHJ1Y3R1cmUKKworVGhlIHNlY29uZCBjb25zaXN0IGluIHN0b3JpbmcgdGhlIGZpeGVkLXNpemUgb2JqZWN0cyBpbnRvIGEgcHJpdmF0ZSBzdHJ1Y3Qgd2hpY2ggd2lsbCBiZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYXQgdGhlIGNvbnN0cnVjdGlvbiB0aW1lIG9mIHRoZSBtYWluIG9iamVjdDoKKworXGNvZGUKK3N0cnVjdCBGb29fZAoreworICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisgIFZlY3RvcjJkIHY7CisgIC4uLgorfTsKKworCitzdHJ1Y3QgRm9vIHsKKyAgRm9vKCkgeyBpbml0X2QoKTsgfQorICB+Rm9vKCkgeyBkZWxldGUgZDsgfQorICB2b2lkIGJhcigpCisgIHsKKyAgICAvLyB1c2UgZC0+diBpbnN0ZWFkIG9mIHYKKyAgICAuLi4KKyAgfQorcHJpdmF0ZToKKyAgdm9pZCBpbml0X2QoKSB7IGQgPSBuZXcgRm9vX2Q7IH0KKyAgRm9vX2QqIGQ7Cit9OworXGVuZGNvZGUKKworVGhlIGNsZWFyIGFkdmFudGFnZSBoZXJlIGlzIHRoYXQgdGhlIGNsYXNzIEZvbyByZW1haW5zIHVuY2hhbmdlZCByZWdhcmRpbmcgYWxpZ25tZW50IGlzc3Vlcy4gVGhlIGRyYXdiYWNrIGlzIHRoYXQgYSBoZWFwIGFsbG9jYXRpb24gd2lsbCBiZSByZXF1aXJlZCB3aGF0c29ldmVyLgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvRDExX1VuYWxpZ25lZEFycmF5QXNzZXJ0LmRveCBiL2RvYy9EMTFfVW5hbGlnbmVkQXJyYXlBc3NlcnQuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzNlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvRDExX1VuYWxpZ25lZEFycmF5QXNzZXJ0LmRveApAQCAtMCwwICsxLDEyMSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljVW5hbGlnbmVkQXJyYXlBc3NlcnQgRXhwbGFuYXRpb24gb2YgdGhlIGFzc2VydGlvbiBvbiB1bmFsaWduZWQgYXJyYXlzCisKK0hlbGxvISBZb3UgYXJlIHNlZWluZyB0aGlzIHdlYnBhZ2UgYmVjYXVzZSB5b3VyIHByb2dyYW0gdGVybWluYXRlZCBvbiBhbiBhc3NlcnRpb24gZmFpbHVyZSBsaWtlIHRoaXMgb25lOgorPHByZT4KK215X3Byb2dyYW06IHBhdGgvdG8vZWlnZW4vRWlnZW4vc3JjL0NvcmUvRGVuc2VTdG9yYWdlLmg6NDQ6CitFaWdlbjo6aW50ZXJuYWw6Om1hdHJpeF9hcnJheTxULCBTaXplLCBNYXRyaXhPcHRpb25zLCBBbGlnbj46OmludGVybmFsOjptYXRyaXhfYXJyYXkoKQorW3dpdGggVCA9IGRvdWJsZSwgaW50IFNpemUgPSAyLCBpbnQgTWF0cml4T3B0aW9ucyA9IDIsIGJvb2wgQWxpZ24gPSB0cnVlXToKK0Fzc2VydGlvbiBgKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihhcnJheSkgJiAweGYpID09IDAgJiYgInRoaXMgYXNzZXJ0aW9uCitpcyBleHBsYWluZWQgaGVyZTogaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvZG94L1VuYWxpZ25lZEFycmF5QXNzZXJ0Lmh0bWwKKyoqKiogUkVBRCBUSElTIFdFQiBQQUdFICEhISAqKioqIicgZmFpbGVkLgorPC9wcmU+CisKK1RoZXJlIGFyZSA0IGtub3duIGNhdXNlcyBmb3IgdGhpcyBpc3N1ZS4gUGxlYXNlIHJlYWQgb24gdG8gdW5kZXJzdGFuZCB0aGVtIGFuZCBsZWFybiBob3cgdG8gZml4IHRoZW0uCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzCisgLSBccmVmIHdoZXJlCisgLSBccmVmIGMxCisgLSBccmVmIGMyCisgLSBccmVmIGMzCisgLSBccmVmIGM0CisgLSBccmVmIGV4cGxhbmF0aW9uCisgLSBccmVmIGdldHJpZAorCitcc2VjdGlvbiB3aGVyZSBXaGVyZSBpbiBteSBvd24gY29kZSBpcyB0aGUgY2F1c2Ugb2YgdGhlIHByb2JsZW0/CisKK0ZpcnN0IG9mIGFsbCwgeW91IG5lZWQgdG8gZmluZCBvdXQgd2hlcmUgaW4geW91ciBvd24gY29kZSB0aGlzIGFzc2VydGlvbiB3YXMgdHJpZ2dlcmVkIGZyb20uIEF0IGZpcnN0IGdsYW5jZSwgdGhlIGVycm9yIG1lc3NhZ2UgZG9lc24ndCBsb29rIGhlbHBmdWwsIGFzIGl0IHJlZmVycyB0byBhIGZpbGUgaW5zaWRlIEVpZ2VuISBIb3dldmVyLCBzaW5jZSB5b3VyIHByb2dyYW0gY3Jhc2hlZCwgaWYgeW91IGNhbiByZXByb2R1Y2UgdGhlIGNyYXNoLCB5b3UgY2FuIGdldCBhIGJhY2t0cmFjZSB1c2luZyBhbnkgZGVidWdnZXIuIEZvciBleGFtcGxlLCBpZiB5b3UncmUgdXNpbmcgR0NDLCB5b3UgY2FuIHVzZSB0aGUgR0RCIGRlYnVnZ2VyIGFzIGZvbGxvd3M6CitcY29kZQorJCBnZGIgLi9teV9wcm9ncmFtICAgICAgICAgICMgU3RhcnQgR0RCIG9uIHlvdXIgcHJvZ3JhbQorPiBydW4gICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgcnVubmluZyB5b3VyIHByb2dyYW0KKy4uLiAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdyByZXByb2R1Y2UgdGhlIGNyYXNoIQorPiBidCAgICAgICAgICAgICAgICAgICAgICAgICMgT2J0YWluIHRoZSBiYWNrdHJhY2UKK1xlbmRjb2RlCitOb3cgdGhhdCB5b3Uga25vdyBwcmVjaXNlbHkgd2hlcmUgaW4geW91ciBvd24gY29kZSB0aGUgcHJvYmxlbSBpcyBoYXBwZW5pbmcsIHJlYWQgb24gdG8gdW5kZXJzdGFuZCB3aGF0IHlvdSBuZWVkIHRvIGNoYW5nZS4KKworXHNlY3Rpb24gYzEgQ2F1c2UgMTogU3RydWN0dXJlcyBoYXZpbmcgRWlnZW4gb2JqZWN0cyBhcyBtZW1iZXJzCisKK0lmIHlvdSBoYXZlIGNvZGUgbGlrZSB0aGlzLAorCitcY29kZQorY2xhc3MgRm9vCit7CisgIC8vLi4uCisgIEVpZ2VuOjpWZWN0b3IyZCB2OworICAvLy4uLgorfTsKKy8vLi4uCitGb28gKmZvbyA9IG5ldyBGb287CitcZW5kY29kZQorCit0aGVuIHlvdSBuZWVkIHRvIHJlYWQgdGhpcyBzZXBhcmF0ZSBwYWdlOiBccmVmIFRvcGljU3RydWN0SGF2aW5nRWlnZW5NZW1iZXJzICJTdHJ1Y3R1cmVzIEhhdmluZyBFaWdlbiBNZW1iZXJzIi4KKworTm90ZSB0aGF0IGhlcmUsIEVpZ2VuOjpWZWN0b3IyZCBpcyBvbmx5IHVzZWQgYXMgYW4gZXhhbXBsZSwgbW9yZSBnZW5lcmFsbHkgdGhlIGlzc3VlIGFyaXNlcyBmb3IgYWxsIFxyZWYgVG9waWNGaXhlZFNpemVWZWN0b3JpemFibGUgImZpeGVkLXNpemUgdmVjdG9yaXphYmxlIEVpZ2VuIHR5cGVzIi4KKworXHNlY3Rpb24gYzIgQ2F1c2UgMjogU1RMIENvbnRhaW5lcnMKKworSWYgeW91IHVzZSBTVEwgQ29udGFpbmVycyBzdWNoIGFzIHN0ZDo6dmVjdG9yLCBzdGQ6Om1hcCwgLi4uLCB3aXRoIEVpZ2VuIG9iamVjdHMsIG9yIHdpdGggY2xhc3NlcyBjb250YWluaW5nIEVpZ2VuIG9iamVjdHMsIGxpa2UgdGhpcywKKworXGNvZGUKK3N0ZDo6dmVjdG9yPEVpZ2VuOjpNYXRyaXgyZj4gbXlfdmVjdG9yOworc3RydWN0IG15X2NsYXNzIHsgLi4uIEVpZ2VuOjpNYXRyaXgyZiBtOyAuLi4gfTsKK3N0ZDo6bWFwPGludCwgbXlfY2xhc3M+IG15X21hcDsKK1xlbmRjb2RlCisKK3RoZW4geW91IG5lZWQgdG8gcmVhZCB0aGlzIHNlcGFyYXRlIHBhZ2U6IFxyZWYgVG9waWNTdGxDb250YWluZXJzICJVc2luZyBTVEwgQ29udGFpbmVycyB3aXRoIEVpZ2VuIi4KKworTm90ZSB0aGF0IGhlcmUsIEVpZ2VuOjpNYXRyaXgyZiBpcyBvbmx5IHVzZWQgYXMgYW4gZXhhbXBsZSwgbW9yZSBnZW5lcmFsbHkgdGhlIGlzc3VlIGFyaXNlcyBmb3IgYWxsIFxyZWYgVG9waWNGaXhlZFNpemVWZWN0b3JpemFibGUgImZpeGVkLXNpemUgdmVjdG9yaXphYmxlIEVpZ2VuIHR5cGVzIiBhbmQgXHJlZiBUb3BpY1N0cnVjdEhhdmluZ0VpZ2VuTWVtYmVycyAic3RydWN0dXJlcyBoYXZpbmcgc3VjaCBFaWdlbiBvYmplY3RzIGFzIG1lbWJlciIuCisKK1xzZWN0aW9uIGMzIENhdXNlIDM6IFBhc3NpbmcgRWlnZW4gb2JqZWN0cyBieSB2YWx1ZQorCitJZiBzb21lIGZ1bmN0aW9uIGluIHlvdXIgY29kZSBpcyBnZXR0aW5nIGFuIEVpZ2VuIG9iamVjdCBwYXNzZWQgYnkgdmFsdWUsIGxpa2UgdGhpcywKKworXGNvZGUKK3ZvaWQgZnVuYyhFaWdlbjo6VmVjdG9yNGQgdik7CitcZW5kY29kZQorCit0aGVuIHlvdSBuZWVkIHRvIHJlYWQgdGhpcyBzZXBhcmF0ZSBwYWdlOiBccmVmIFRvcGljUGFzc2luZ0J5VmFsdWUgIlBhc3NpbmcgRWlnZW4gb2JqZWN0cyBieSB2YWx1ZSB0byBmdW5jdGlvbnMiLgorCitOb3RlIHRoYXQgaGVyZSwgRWlnZW46OlZlY3RvcjRkIGlzIG9ubHkgdXNlZCBhcyBhbiBleGFtcGxlLCBtb3JlIGdlbmVyYWxseSB0aGUgaXNzdWUgYXJpc2VzIGZvciBhbGwgXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gdHlwZXMiLgorCitcc2VjdGlvbiBjNCBDYXVzZSA0OiBDb21waWxlciBtYWtpbmcgYSB3cm9uZyBhc3N1bXB0aW9uIG9uIHN0YWNrIGFsaWdubWVudCAoZm9yIGluc3RhbmNlIEdDQyBvbiBXaW5kb3dzKQorCitUaGlzIGlzIGEgbXVzdC1yZWFkIGZvciBwZW9wbGUgdXNpbmcgR0NDIG9uIFdpbmRvd3MgKGxpa2UgTWluR1cgb3IgVERNLUdDQykuIElmIHlvdSBoYXZlIHRoaXMgYXNzZXJ0aW9uIGZhaWx1cmUgaW4gYW4gaW5ub2NlbnQgZnVuY3Rpb24gZGVjbGFyaW5nIGEgbG9jYWwgdmFyaWFibGUgbGlrZSB0aGlzOgorCitcY29kZQordm9pZCBmb28oKQoreworICBFaWdlbjo6UXVhdGVybmlvbmYgcTsKKyAgLy8uLi4KK30KK1xlbmRjb2RlCisKK3RoZW4geW91IG5lZWQgdG8gcmVhZCB0aGlzIHNlcGFyYXRlIHBhZ2U6IFxyZWYgVG9waWNXcm9uZ1N0YWNrQWxpZ25tZW50ICJDb21waWxlciBtYWtpbmcgYSB3cm9uZyBhc3N1bXB0aW9uIG9uIHN0YWNrIGFsaWdubWVudCIuCisKK05vdGUgdGhhdCBoZXJlLCBFaWdlbjo6UXVhdGVybmlvbmYgaXMgb25seSB1c2VkIGFzIGFuIGV4YW1wbGUsIG1vcmUgZ2VuZXJhbGx5IHRoZSBpc3N1ZSBhcmlzZXMgZm9yIGFsbCBccmVmIFRvcGljRml4ZWRTaXplVmVjdG9yaXphYmxlICJmaXhlZC1zaXplIHZlY3Rvcml6YWJsZSBFaWdlbiB0eXBlcyIuCisKK1xzZWN0aW9uIGV4cGxhbmF0aW9uIEdlbmVyYWwgZXhwbGFuYXRpb24gb2YgdGhpcyBhc3NlcnRpb24KKworXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZSAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUgRWlnZW4gb2JqZWN0cyIgbXVzdCBhYnNvbHV0ZWx5IGJlIGNyZWF0ZWQgYXQgMTYtYnl0ZS1hbGlnbmVkIGxvY2F0aW9ucywgb3RoZXJ3aXNlIFNJTUQgaW5zdHJ1Y3Rpb25zIGFkcmVzc2luZyB0aGVtIHdpbGwgY3Jhc2guCisKK0VpZ2VuIG5vcm1hbGx5IHRha2VzIGNhcmUgb2YgdGhlc2UgYWxpZ25tZW50IGlzc3VlcyBmb3IgeW91LCBieSBzZXR0aW5nIGFuIGFsaWdubWVudCBhdHRyaWJ1dGUgb24gdGhlbSBhbmQgYnkgb3ZlcmxvYWRpbmcgdGhlaXIgIm9wZXJhdG9yIG5ldyIuCisKK0hvd2V2ZXIgdGhlcmUgYXJlIGEgZmV3IGNvcm5lciBjYXNlcyB3aGVyZSB0aGVzZSBhbGlnbm1lbnQgc2V0dGluZ3MgZ2V0IG92ZXJyaWRkZW46IHRoZXkgYXJlIHRoZSBwb3NzaWJsZSBjYXVzZXMgZm9yIHRoaXMgYXNzZXJ0aW9uLgorCitcc2VjdGlvbiBnZXRyaWQgSSBkb24ndCBjYXJlIGFib3V0IHZlY3Rvcml6YXRpb24sIGhvdyBkbyBJIGdldCByaWQgb2YgdGhhdCBzdHVmZj8KKworVHdvIHBvc3NpYmlsaXRpZXM6Cis8dWw+CisgIDxsaT5EZWZpbmUgRUlHRU5fRE9OVF9BTElHTl9TVEFUSUNBTExZLiBUaGF0IGRpc2FibGVzIGFsbCAxMjgtYml0IHN0YXRpYyBhbGlnbm1lbnQgY29kZSwgd2hpbGUga2VlcGluZyAxMjgtYml0IGhlYXAgYWxpZ25tZW50LiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mCisgICAgICBkaXNhYmxpbmcgdmVjdG9yaXphdGlvbiBmb3IgZml4ZWQtc2l6ZSBvYmplY3RzIChsaWtlIE1hdHJpeDRkKSB3aGlsZSBrZWVwaW5nIHZlY3Rvcml6YXRpb24gb2YgZHluYW1pYy1zaXplIG9iamVjdHMKKyAgICAgIChsaWtlIE1hdHJpeFhkKS4gQnV0IGRvIG5vdGUgdGhhdCB0aGlzIGJyZWFrcyBBQkkgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIDEyOC1iaXQgc3RhdGljIGFsaWdubWVudC48L2xpPgorICA8bGk+T3IgZGVmaW5lIGJvdGggRUlHRU5fRE9OVF9WRUNUT1JJWkUgYW5kIEVJR0VOX0RJU0FCTEVfVU5BTElHTkVEX0FSUkFZX0FTU0VSVC4gVGhpcyBrZWVwcyB0aGUKKyAgICAgIDEyOC1iaXQgYWxpZ25tZW50IGNvZGUgYW5kIHRodXMgcHJlc2VydmVzIEFCSSBjb21wYXRpYmlsaXR5LCBidXQgY29tcGxldGVseSBkaXNhYmxlcyB2ZWN0b3JpemF0aW9uLjwvbGk+Cis8L3VsPgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9Imh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL2luZGV4LnBocD90aXRsZT1GQVEjSV9kaXNhYmxlZF92ZWN0b3JpemF0aW9uLjJDX2J1dF9JLjI3bV9zdGlsbF9nZXR0aW5nX2Fubm95ZWRfYWJvdXRfYWxpZ25tZW50X2lzc3Vlcy4yMSI+dGhpcyBGQVE8L2E+LgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvRG94eWZpbGUuaW4gYi9kb2MvRG94eWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllODlkNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9Eb3h5ZmlsZS5pbgpAQCAtMCwwICsxLDE0ODQgQEAKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0CisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZAorIyBUaGUgZm9ybWF0IGlzOgorIyAgICAgICBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyAgICAgICBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKCIgIikKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbAorIyB0ZXh0IGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUKKyMgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUKKyMgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZAorIyBieSBxdW90ZXMpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZSBwcm9qZWN0LgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gRWlnZW4KKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IKKyMgaWYgc29tZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKKyNFSUdFTl9WRVJTSU9OIGlzIHNldCBpbiB0aGUgcm9vdCBDTWFrZUxpc3RzLnR4dAorUFJPSkVDVF9OVU1CRVIgICAgICAgICA9ICIke0VJR0VOX1ZFUlNJT059IgorCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkKKyMgYmFzZSBwYXRoIHdoZXJlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9ICIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYyIKKworIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZQorIyA0MDk2IHN1Yi1kaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0CisjIGZvcm1hdCBhbmQgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4KKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mCisjIHNvdXJjZSBmaWxlcywgd2hlcmUgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZAorIyBvdGhlcndpc2UgY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKworQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZToKKyMgQWZyaWthYW5zLCBBcmFiaWMsIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwgQ2hpbmVzZS1UcmFkaXRpb25hbCwKKyMgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBGYXJzaSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLAorIyBIdW5nYXJpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKKyMgS29yZWFuLCBLb3JlYW4tZW4sIExpdGh1YW5pYW4sIE5vcndlZ2lhbiwgTWFjZWRvbmlhbiwgUGVyc2lhbiwgUG9saXNoLAorIyBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLAorIyBhbmQgVWtyYWluaWFuLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBpbmNsdWRlIGJyaWVmIG1lbWJlciBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluCisjIHRoZSBmaWxlIGFuZCBjbGFzcyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFEb2MpLgorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCBwcmVwZW5kCisjIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLgorIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvcgorIyB0aGF0IGlzIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZworIyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlCisjIHN0cmlwcGVkIGZyb20gdGhlIHRleHQgYW5kIHRoZSByZXN1bHQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMKKyMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuCisjIElmIGxlZnQgYmxhbmssIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgiJG5hbWUiIGlzIGF1dG9tYXRpY2FsbHkKKyMgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZW50aXR5KTogIlRoZSAkbmFtZSBjbGFzcyIgIlRoZSAkbmFtZSB3aWRnZXQiCisjICJUaGUgJG5hbWUgZmlsZSIgImlzIiAicHJvdmlkZXMiICJzcGVjaWZpZXMiICJjb250YWlucyIKKyMgInJlcHJlc2VudHMiICJhIiAiYW4iICJ0aGUiCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisKK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTworCisjIElmIHRoZSBJTkxJTkVfSU5IRVJJVEVEX01FTUIgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBzaG93IGFsbAorIyBpbmhlcml0ZWQgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UKKyMgbWVtYmVycyB3ZXJlIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQKKyMgb3BlcmF0b3JzIG9mIHRoZSBiYXNlIGNsYXNzZXMgd2lsbCBub3QgYmUgc2hvd24uCisKK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBZRVMKKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwKKyMgcGF0aCBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQKKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBOTworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgU1RSSVBfRlJPTV9QQVRIIHRhZworIyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLiBTdHJpcHBpbmcgaXMKKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YKKyMgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZQorIyBwYXRoIHRvIHN0cmlwLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0KKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZgorIyB0aGUgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMKKyMgdGhlIHJlYWRlciB3aGljaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLgorIyBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzCisjIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQgc3BlY2lmeSB0aGUgaW5jbHVkZSBwYXRocyB0aGF0CisjIGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyIHVzaW5nIHRoZSAtSSBmbGFnLgorCitTVFJJUF9GUk9NX0lOQ19QQVRIICAgID0KKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIKKyMgKGJ1dCBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMKKyMgZG9lc24ndCBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuCisjIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFEb2Mtc3R5bGUKKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFEb2MKKyMgY29tbWVudHMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMKKyMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbAorIyBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUKKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIGNvbW1lbnRzCisjIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZworIyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisKK1FUX0FVVE9CUklFRiAgICAgICAgICAgPSBOTworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIERveHlnZW4KKyMgdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vCisjIGNvbW1lbnRzKSBhcyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLgorIyBUaGUgbmV3IGRlZmF1bHQgaXMgdG8gdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBjb21tZW50IGJsb2NrIGFzIGEgZGV0YWlsZWQKKyMgZGVzY3JpcHRpb24uIFNldCB0aGlzIHRhZyB0byBZRVMgaWYgeW91IHByZWZlciB0aGUgb2xkIGJlaGF2aW91ciBpbnN0ZWFkLgorCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KKworIyBJZiB0aGUgREVUQUlMU19BVF9UT1AgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuCisjIHdpbGwgb3V0cHV0IHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBuZWFyIHRoZSB0b3AsIGxpa2UgSmF2YURvYy4KKyMgSWYgc2V0IHRvIE5PLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gYXBwZWFycyBhZnRlciB0aGUgbWVtYmVyCisjIGRvY3VtZW50YXRpb24uCisKK0RFVEFJTFNfQVRfVE9QICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhbiB1bmRvY3VtZW50ZWQKKyMgbWVtYmVyIGluaGVyaXRzIHRoZSBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQKKyMgcmUtaW1wbGVtZW50cy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UKKyMgYSBuZXcgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbAorIyBiZSBwYXJ0IG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0LgorCitTRVBBUkFURV9NRU1CRVJfUEFHRVMgID0gTk8KKworIyBUaGUgVEFCX1NJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBhIHRhYi4KKyMgRG94eWdlbiB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3RzCisjIGFzIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLgorIyBGb3IgZXhhbXBsZSBhZGRpbmcgInNpZGVlZmZlY3Q9XHBhciBTaWRlIEVmZmVjdHM6XG4iIHdpbGwgYWxsb3cgeW91IHRvCisjIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZSBkb2N1bWVudGF0aW9uLCB3aGljaAorIyB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nICJTaWRlIEVmZmVjdHM6Ii4KKyMgWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQgbmV3bGluZXMuCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAib25seV9mb3JfdmVjdG9ycz1UaGlzIGlzIG9ubHkgZm9yIHZlY3RvcnMgKGVpdGhlciByb3ctdmVjdG9ycyBvciBjb2x1bW4tdmVjdG9ycyksIGkuZS4gbWF0cmljZXMgd2hpY2ggYXJlIGtub3duIGF0IGNvbXBpbGUtdGltZSB0byBoYXZlIGVpdGhlciBvbmUgcm93IG9yIG9uZSBjb2x1bW4uIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5X21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVBcnJheSBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9BcnJheT4gXGVuZGNvZGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvbGVza3lfbW9kdWxlPVRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgJUNob2xlc2t5IG1vZHVsZS4gXGNvZGUgI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PiBcZW5kY29kZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJlaWdlbnZhbHVlc19tb2R1bGU9VGhpcyBpcyBkZWZpbmVkIGluIHRoZSAlRWlnZW52YWx1ZXMgbW9kdWxlLiBcY29kZSAjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+IFxlbmRjb2RlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImdlb21ldHJ5X21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVHZW9tZXRyeSBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4gXGVuZGNvZGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG91c2Vob2xkZXJfbW9kdWxlPVRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgJUhvdXNlaG9sZGVyIG1vZHVsZS4gXGNvZGUgI2luY2x1ZGUgPEVpZ2VuL0hvdXNlaG9sZGVyPiBcZW5kY29kZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJqYWNvYmlfbW9kdWxlPVRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgJUphY29iaSBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9KYWNvYmk+IFxlbmRjb2RlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImx1X21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVMVSBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9MVT4gXGVuZGNvZGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicXJfbW9kdWxlPVRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgJVFSIG1vZHVsZS4gXGNvZGUgI2luY2x1ZGUgPEVpZ2VuL1FSPiBcZW5kY29kZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdmRfbW9kdWxlPVRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgJVNWRCBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9TVkQ+IFxlbmRjb2RlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsPVxidWciIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibWF0cml4d29ybGQ9PGEgaHJlZj0nI21hdHJpeG9ubHknIHN0eWxlPSdjb2xvcjpncmVlbjt0ZXh0LWRlY29yYXRpb246IG5vbmU7Jz4qPC9hPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheXdvcmxkPTxhIGhyZWY9JyNhcnJheW9ubHknIHN0eWxlPSdjb2xvcjpibHVlO3RleHQtZGVjb3JhdGlvbjogbm9uZTsnPio8L2E+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGVfYWJvdXRfYXJiaXRyYXJ5X2Nob2ljZV9vZl9zb2x1dGlvbj1JZiB0aGVyZSBleGlzdHMgbW9yZSB0aGFuIG9uZSBzb2x1dGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBhcmJpdHJhcmlseSBjaG9vc2Ugb25lLiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJub3RlX2Fib3V0X3VzaW5nX2tlcm5lbF90b19zdHVkeV9tdWx0aXBsZV9zb2x1dGlvbnM9SWYgeW91IG5lZWQgYSBjb21wbGV0ZSBhbmFseXNpcyBvZiB0aGUgc3BhY2Ugb2Ygc29sdXRpb25zLCB0YWtlIHRoZSBvbmUgc29sdXRpb24gb2J0YWluZWQgYnkgdGhpcyBtZXRob2QgYW5kIGFkZCB0byBpdCBlbGVtZW50cyBvZiB0aGUga2VybmVsLCBhcyBkZXRlcm1pbmVkIGJ5IGtlcm5lbCgpLiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJub3RlX2Fib3V0X2NoZWNraW5nX3NvbHV0aW9ucz1UaGlzIG1ldGhvZCBqdXN0IHRyaWVzIHRvIGZpbmQgYXMgZ29vZCBhIHNvbHV0aW9uIGFzIHBvc3NpYmxlLiBJZiB5b3Ugd2FudCB0byBjaGVjayB3aGV0aGVyIGEgc29sdXRpb24gZXhpc3RzIG9yIGlmIGl0IGlzIGFjY3VyYXRlLCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgYSByZXN1bHQgYW5kIHRoZW4gY29tcHV0ZSB0aGUgZXJyb3Igb2YgdGhpcyByZXN1bHQsIG9yIHVzZSBNYXRyaXhCYXNlOjppc0FwcHJveCgpIGRpcmVjdGx5LCBmb3IgaW5zdGFuY2UgbGlrZSB0aGlzOiBcY29kZSBib29sIGFfc29sdXRpb25fZXhpc3RzID0gKEEqcmVzdWx0KS5pc0FwcHJveChiLCBwcmVjaXNpb24pOyBcZW5kY29kZSBUaGlzIG1ldGhvZCBhdm9pZHMgZGl2aWRpbmcgYnkgemVybywgc28gdGhhdCB0aGUgbm9uLWV4aXN0ZW5jZSBvZiBhIHNvbHV0aW9uIGRvZXNuJ3QgYnkgaXRzZWxmIG1lYW4gdGhhdCB5b3UnbGwgZ2V0IFxjIGluZiBvciBcYyBuYW4gdmFsdWVzLiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJub3RlX3RyeV90b19oZWxwX3J2bz1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBieSB2YWx1ZS4gSW4gb3JkZXIgdG8gbWFrZSB0aGF0IGVmZmljaWVudCwgaXQgaXMgaW1wbGVtZW50ZWQgYXMganVzdCBhIHJldHVybiBzdGF0ZW1lbnQgdXNpbmcgYSBzcGVjaWFsIGNvbnN0cnVjdG9yLCBob3BlZnVsbHkgYWxsb3dpbmcgdGhlIGNvbXBpbGVyIHRvIHBlcmZvcm0gYSBSVk8gKHJldHVybiB2YWx1ZSBvcHRpbWl6YXRpb24pLiIKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4KKyMgRm9yIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdAorIyBvZiBhbGwgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IKKyMgSmF2YS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLCBxdWFsaWZpZWQKKyMgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IKKyMgRm9ydHJhbi4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvcgorIyBWSERMLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZAorIyBzZXQgdGhpcyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOyB2LnMuCisjIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2UgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uCisjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PCisKKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgc291cmNlcyBvbmx5LgorIyBEb3h5Z2VuIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMKKyMgaW5zdGVhZCBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisKK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTworCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSBnZXR0ZXIKKyMgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIFlFUyAodGhlIGRlZmF1bHQpCisjIHdpbGwgbWFrZSBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3IKKyMgc2V0dGluZyBhIHNpbXBsZSB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUKKyMgbWV0aG9kcyBhbnl3YXksIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQworIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0CisjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdAorIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5LgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mCisjIHRoZSBzYW1lIHR5cGUgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhCisjIHN1Ymdyb3VwIG9mIHRoYXQgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvCisjIE5PIHRvIHByZXZlbnQgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nCisjIHRoZSBcbm9zdWJncm91cGluZyBjb21tYW5kLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtCisjIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5CisjIGJlIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKworVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuCisjIFByaXZhdGUgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MKKyMgdGhlIEVYVFJBQ1RfUFJJVkFURSBhbmQgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUworCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3MKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykKKyMgZGVmaW5lZCBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBJZiBzZXQgdG8gTk8gb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IE5PCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwKKyMgbWV0aG9kcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbgorIyB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQKKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZQorIyBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQKKyMgYW5vbnltb3VzIG5hbWVzcGFjZSBhcmUgaGlkZGVuLgorCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgb2YgZG9jdW1lbnRlZCBjbGFzc2VzLCBmaWxlcyBvciBuYW1lc3BhY2VzLgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisjIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGlzIGdlbmVyYXRlZC4KKyMgVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzCisjIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIGZyaWVuZCAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQorIyBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24KKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldAorIyB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBleGNsdWRlZC4KKyMgU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUKKyMgZmlsZSBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlIHNjb3BlIHdpbGwgYmUgaGlkZGVuLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIHB1dCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyBvZiB0aGF0IGZpbGUuCisKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGEgdGFnIFtpbmxpbmVdCisjIGlzIGluc2VydGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KKworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuCisjIHdpbGwgc29ydCB0aGUgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMKKyMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbgorIyBkZWNsYXJhdGlvbiBvcmRlci4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgYnJpZWYgZG9jdW1lbnRhdGlvbiBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkKKyMgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluCisjIGRlY2xhcmF0aW9uIG9yZGVyLgorCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgaGllcmFyY2h5IG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorIyB0aGUgZ3JvdXAgbmFtZXMgd2lsbCBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZQorIyBzb3J0ZWQgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvCisjIE5PICh0aGUgZGVmYXVsdCksIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwKKyMgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZQorIyBhbHBoYWJldGljYWwgbGlzdC4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0CisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gTk8KKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgYnVnIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZworIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcKKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBOTworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwKKyMgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiBzZWN0aW9ubmFtZSAuLi4gXGVuZGlmLgorCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0KKworIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcworIyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIGRlZmluZSBjb25zaXN0cyBvZiBmb3IgaXQgdG8gYXBwZWFyIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZAorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuCisjIFRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbml0aWFsaXplciBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgZGVmaW5lcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIKKyMgY29tbWFuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKworTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQKKyMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgc291cmNlcyBpbiB5b3VyIHByb2plY3QgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgbXVsdGlwbGUgZGlyZWN0b3JpZXMKKyMgdGhlbiBzZXR0aW5nIHRoZSBTSE9XX0RJUkVDVE9SSUVTIHRhZyB0byBZRVMgd2lsbCBzaG93IHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5CisjIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyBOTy4KKworU0hPV19ESVJFQ1RPUklFUyAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLgorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlCisjIE5hbWVzcGFjZXMgcGFnZS4gIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXgKKyMgYW5kIGZyb20gdGhlIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUworCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxjb21tYW5kPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxjb21tYW5kPiBpcyB0aGUgdmFsdWUgb2YKKyMgdGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUKKyMgcHJvdmlkZWQgYnkgZG94eWdlbi4gV2hhdGV2ZXIgdGhlIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dAorIyBpcyB1c2VkIGFzIHRoZSBmaWxlIHZlcnNpb24uIFNlZSB0aGUgbWFudWFsIGZvciBleGFtcGxlcy4KKworRklMRV9WRVJTSU9OX0ZJTFRFUiAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQKKyMgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK1FVSUVUICAgICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBXQVJOSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBhcmUKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuaworIyBOTyBpcyB1c2VkLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9VTkRPQ1VNRU5URUQgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MKKyMgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnIHdpbGwKKyMgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4KKworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IE5PCisKKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcgorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lCisjIHBhcmFtZXRlcnMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQKKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBhYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yCisjIGZ1bmN0aW9ucyB0aGF0IGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzCisjIG9yIHJldHVybiB2YWx1ZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dAorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mCisjIGRvY3VtZW50YXRpb24uCisKK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQKKyMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQKKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUKKyMgd2FybmluZyBvcmlnaW5hdGVkIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4KKyMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkCisjIGJlIG9idGFpbmVkIHZpYSBGSUxFX1ZFUlNJT05fRklMVEVSKQorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nCisjIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4KKyMgdG8gc3RkZXJyLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvcgorIyBkaXJlY3RvcmllcyBsaWtlICIvdXNyL3NyYy9teXByb2plY3QiLiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgd2l0aCBzcGFjZXMuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSAiJHtFaWdlbl9TT1VSQ0VfRElSfS9FaWdlbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX1NPVVJDRV9ESVJ9L2RvYyIKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzCisjIGFsc28gdGhlIGRlZmF1bHQgaW5wdXQgZW5jb2RpbmcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0CisjIGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IKKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0CisjIGJsYW5rIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDoKKyMgKi5jICouY2MgKi5jeHggKi5jcHAgKi5jKysgKi5qYXZhICouaWkgKi5peHggKi5pcHAgKi5pKysgKi5pbmwgKi5oICouaGggKi5oeHgKKyMgKi5ocHAgKi5oKysgKi5pZGwgKi5vZGwgKi5jcyAqLnBocCAqLnBocDMgKi5pbmMgKi5tICoubW0gKi5weSAqLmY5MAorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKgorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcworIyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4KKyMgSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLgorCitFWENMVURFICAgICAgICAgICAgICAgID0gIiR7RWlnZW5fU09VUkNFX0RJUn0vRWlnZW4vRWlnZW4yU3VwcG9ydCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX1NPVVJDRV9ESVJ9L0VpZ2VuL3NyYy9FaWdlbjJTdXBwb3J0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vZG9jL2V4YW1wbGVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vZG9jL3NwZWNpYWxfZXhhbXBsZXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFaWdlbl9TT1VSQ0VfRElSfS9kb2Mvc25pcHBldHMiIAorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKworRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUKKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLiBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZAorIyBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8gZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcworIyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9QQVRURVJOUyAgICAgICA9ICBDTWFrZSogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLnR4dCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICouc2ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLm9yaWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLmRpZmYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKn4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICouc2xuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKi5zZGYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAqLnRtcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICoudmN4cHJvaiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICouZmlsdGVycyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICoudXNlciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICouc3VvCisKKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKworIyBUaGlzIGNvdWxkIHVzZWQgdG8gY2xlYW4gdXAgdGhlICJjbGFzcyBoaWVyYXJjaHkiIHBhZ2UKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSBpbnRlcm5hbDo6KiBGbGFnZ2VkKiAqSW5uZXJJdGVyYXRvciogRGVuc2VTdG9yYWdlPCoKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUKKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gIiR7RWlnZW5fU09VUkNFX0RJUn0vZG9jL3NuaXBwZXRzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fQklOQVJZX0RJUn0vZG9jL3NuaXBwZXRzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vZG9jL2V4YW1wbGVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fQklOQVJZX0RJUn0vZG9jL2V4YW1wbGVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vZG9jL3NwZWNpYWxfZXhhbXBsZXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2Mvc3BlY2lhbF9leGFtcGxlcyIKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAKKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdAorIyBibGFuayBhbGwgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gKgorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW1hZ2UgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0KKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPgorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4KKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzCisjIHRvIHN0YW5kYXJkIG91dHB1dC4gIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUKKyMgaWdub3JlZC4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9CisKKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybgorIyBiYXNpcy4gIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06CisjIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSwgSU5QVVRfRklMVEVSCisjIGlzIGFwcGxpZWQgdG8gYWxsIGZpbGVzLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0KKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlCisjIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwKKyMgYmUgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgYWxzbworIyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkKKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIGluc3RydWN0CisjIGRveHlnZW4gdG8gaGlkZSBhbnkgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZQorIyBmcmFnbWVudHMuIE5vcm1hbCBDIGFuZCBDKysgY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuCisKK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUworIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQKKyMgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpCisjIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tCisjIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZCBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwKKyMgbGluayB0byB0aGUgc291cmNlIGNvZGUuICBPdGhlcndpc2UgdGhleSB3aWxsIGxpbmsgdG8gdGhlIGRvY3VtZW50c3Rpb24uCisKK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUKKyMgd2lsbCBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuCisjIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UKKyMgdGFnZ2luZyBzeXN0ZW0gKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91CisjIHdpbGwgbmVlZCB2ZXJzaW9uIDQuOC42IG9yIGhpZ2hlci4KKworVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvcgorIyB3aGljaCBhbiBpbmNsdWRlIGlzIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXgKKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QKKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBOTworCisjIElmIHRoZSBhbHBoYWJldGljYWwgaW5kZXggaXMgZW5hYmxlZCAoc2VlIEFMUEhBQkVUSUNBTF9JTkRFWCkgdGhlbgorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKKyMgaW4gd2hpY2ggdGhpcyBsaXN0IHdpbGwgYmUgc3BsaXQgKGNhbiBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEuLjIwXSkKKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsCisjIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguCisjIFRoZSBJR05PUkVfUFJFRklYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHByZWZpeGVzIHRoYXQKKyMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgSFRNTCBvdXRwdXQuCisKK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKKworIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgaHRtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLC5waHAsLmFzcCkuIElmIGl0IGlzIGxlZnQgYmxhbmsKKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGZpbGVzIHdpdGggLmh0bWwgZXh0ZW5zaW9uLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGhlYWRlciBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4KKworSFRNTF9IRUFERVIgICAgICAgICAgICAgPSAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2MvZWlnZW5kb3h5X2hlYWRlci5odG1sIgorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgZm9vdGVyIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgZm9vdGVyLgorCisjIHRoZSBmb290ZXIgaGFzIG5vdCBiZWVuIGN1c3RvbWl6ZWQgeWV0LCBzbyBsZXQncyB1c2UgdGhlIGRlZmF1bHQgb25lCisjICR7RWlnZW5fQklOQVJZX0RJUn0vZG9jL2VpZ2VuZG94eV9mb290ZXIuaHRtbAorSFRNTF9GT09URVIgICAgICAgICAgICAgPQorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nCisjIHN0eWxlIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8KKyMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuIE5vdGUgdGhhdCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIGNvcHkKKyMgdGhlIHN0eWxlIHNoZWV0IGZpbGUgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgc28gZG9uJ3QgcHV0IHlvdXIgb3duCisjIHN0eWxlc2hlZXQgaW4gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSBhcyB3ZWxsLCBvciBpdCB3aWxsIGJlIGVyYXNlZCEKKworSFRNTF9TVFlMRVNIRUVUICAgICAgICAgPSAiJHtFaWdlbl9TT1VSQ0VfRElSfS9kb2MvZWlnZW5kb3h5LmNzcyIKKworIyBJZiB0aGUgSFRNTF9BTElHTl9NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBjbGFzc2VzLAorIyBmaWxlcyBvciBuYW1lc3BhY2VzIHdpbGwgYmUgYWxpZ25lZCBpbiBIVE1MIHVzaW5nIHRhYmxlcy4gSWYgc2V0IHRvCisjIE5PIGEgYnVsbGV0IGxpc3Qgd2lsbCBiZSB1c2VkLgorCitIVE1MX0FMSUdOX01FTUJFUlMgICAgID0gWUVTCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRvb2xzIGxpa2UgdGhlCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21waWxlZCBIVE1MIGhlbHAgZmlsZSAoLmNobSkKKyMgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMKKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzCisjIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGludHJvZHVjZWQgd2l0aCBPU1ggMTAuNSAoTGVvcGFyZCkuCisjIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBNYWtlZmlsZSBpbiB0aGUKKyMgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBSdW5uaW5nIG1ha2Ugd2lsbCBwcm9kdWNlIHRoZSBkb2NzZXQgaW4gdGhhdAorIyBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcgIm1ha2UgaW5zdGFsbCIgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kCisjIGl0IGF0IHN0YXJ0dXAuCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZQorIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQorIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkKKyMgY2FuIGJlIGdyb3VwZWQuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQKKyMgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEKKyMgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbgorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKKyMgcGFnZSBoYXMgbG9hZGVkLiBGb3IgdGhpcyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzCisjIEphdmFTY3JpcHQgYW5kIERIVE1MIGlzIHJlcXVpcmVkIChmb3IgaW5zdGFuY2UgTW96aWxsYSAxLjArLCBGaXJlZm94CisjIE5ldHNjYXBlIDYuMCssIEludGVybmV0IGV4cGxvcmVyIDUuMCssIEtvbnF1ZXJvciwgb3IgU2FmYXJpKS4KKworSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IFlFUworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9GSUxFIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdQorIyBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorCitDSE1fRklMRSAgICAgICAgICAgICAgID0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKworSEhDX0xPQ0FUSU9OICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgR0VORVJBVEVfQ0hJIGZsYWcKKyMgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIHRoYXQKKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9JTkRFWF9FTkNPRElORworIyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoaGhrKSwgY29udGVudCAoaGhjKSBhbmQgcHJvamVjdCBmaWxlCisjIGNvbnRlbnQuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZworIyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZCAoWUVTKSBvciBhCisjIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuCisKK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzCisjIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4IGF0CisjIHRvcCBvZiBlYWNoIEhUTUwgcGFnZS4gVGhlIHZhbHVlIE5PICh0aGUgZGVmYXVsdCkgZW5hYmxlcyB0aGUgaW5kZXggYW5kCisjIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMgaXQuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIChyYW5nZSBbMS4uMjBdKQorIyB0aGF0IGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDEKKworIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4CisjIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLgorIyBJZiB0aGUgdGFnIHZhbHVlIGlzIHNldCB0byBGUkFNRSwgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkCisjIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0CisjIGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cworIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGZvciBpbnN0YW5jZSBNb3ppbGxhIDEuMCssCisjIE5ldHNjYXBlIDYuMCssIEludGVybmV0IGV4cGxvcmVyIDUuMCssIG9yIEtvbnF1ZXJvcikuIFdpbmRvd3MgdXNlcnMgYXJlCisjIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlIEhUTUwgaGVscCBmZWF0dXJlLiBPdGhlciBwb3NzaWJsZSB2YWx1ZXMKKyMgZm9yIHRoaXMgdGFnIGFyZTogSElFUkFSQ0hJRVMsIHdoaWNoIHdpbGwgZ2VuZXJhdGUgdGhlIEdyb3VwcywgRGlyZWN0b3JpZXMsCisjIGFuZCBDbGFzcyBIaWVyZXJhY2h5IHBhZ2VzIHVzaW5nIGEgdHJlZSB2aWV3IGluc3RlYWQgb2YgYW4gb3JkZXJlZCBsaXN0OworIyBBTEwsIHdoaWNoIGNvbWJpbmVzIHRoZSBiZWhhdmlvciBvZiBGUkFNRSBhbmQgSElFUkFSQ0hJRVM7IGFuZCBOT05FLCB3aGljaAorIyBkaXNhYmxlcyB0aGlzIGJlaGF2aW9yIGNvbXBsZXRlbHkuIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzCisjIHJlbGVhc2VzIG9mIERveHlnZW4sIHRoZSB2YWx1ZXMgWUVTIGFuZCBOTyBhcmUgZXF1aXZhbGVudCB0byBGUkFNRSBhbmQgTk9ORQorIyByZXNwZWN0aXZlbHkuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTworCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlCisjIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZQorIyBpcyBzaG93bi4KKworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYXRleCBmb3JtdWxhcyBpbmNsdWRlZAorIyBhcyBpbWFnZXMgaW4gdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gVGhlIGRlZmF1bHQgaXMgMTAuIE5vdGUgdGhhdAorIyB3aGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwgZG94eWdlbiBydW4geW91IG5lZWQKKyMgdG8gbWFudWFsbHkgcmVtb3ZlIGFueSBmb3JtXyoucG5nIGltYWdlcyBmcm9tIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkKKyMgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4KKworRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEyCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBMYXRleCBvdXRwdXQuCisKK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0bworIyBnZW5lcmF0ZSBpbmRleCBmb3IgTGFUZVguIElmIGxlZnQgYmxhbmsgYG1ha2VpbmRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZQorIyBkZWZhdWx0IGNvbW1hbmQgbmFtZS4KKworTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdAorIyBMYVRlWCBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZAorIyBieSB0aGUgcHJpbnRlci4gUG9zc2libGUgdmFsdWVzIGFyZTogYTQsIGE0d2lkZSwgbGV0dGVyLCBsZWdhbCBhbmQKKyMgZXhlY3V0aXZlLiBJZiBsZWZ0IGJsYW5rIGE0d2lkZSB3aWxsIGJlIHVzZWQuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUKKworIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG5hbWVzIG9mIExhVGVYCisjIHBhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuCisKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPSBhbXNzeW1iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbXNtYXRoCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IKKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPQorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBwZGZsYXRleCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZgorIyBwbGFpbiBsYXRleCBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcXGJhdGNobW9kZS4KKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcAorIyBydW5uaW5nIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuCisjIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90CisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKQorIyBpbiB0aGUgb3V0cHV0LgorCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aAorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0CisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLgorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBXT1JEIG9yIG90aGVyCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLgorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCisKKyMgTG9hZCBzdHlsZXNoZWV0IGRlZmluaXRpb25zIGZyb20gZmlsZS4gU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzCisjIGNvbmZpZyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUKKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9CisKKyMgU2V0IG9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIGFuIHJ0ZiBkb2N1bWVudC4KKyMgU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBtYW4gcGFnZXMKKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0bworIyB0aGUgZ2VuZXJhdGVkIG1hbiBwYWdlcyAoZGVmYXVsdCBpcyB0aGUgc3Vicm91dGluZSdzIHNlY3Rpb24gLjMpCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIERveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsCisjIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkKKyMgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbCBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcworIyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQgdGhlbSB0aGUgbWFuIGNvbW1hbmQKKyMgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4gVGhlIGRlZmF1bHQgaXMgTk8uCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgeG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBzY2hlbWEsCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKworWE1MX1NDSEVNQSAgICAgICAgICAgICA9CisKKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIERURCwKKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlCisjIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgorCitYTUxfRFREICAgICAgICAgICAgICAgID0KKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZworIyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQKKyMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzCisjIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZQorIyBtb21lbnQuCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB0aGUgbmVjZXNzYXJ5IE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZQorIyB0byBnZW5lcmF0ZSBQREYgYW5kIERWSSBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlCisjIG5pY2VseSBmb3JtYXR0ZWQgc28gaXQgY2FuIGJlIHBhcnNlZCBieSBhIGh1bWFuIHJlYWRlci4gIFRoaXMgaXMgdXNlZnVsCisjIGlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzCisjIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlcgorIyBhbmQgUGVybCB3aWxsIHBhcnNlIGl0IGp1c3QgdGhlIHNhbWUuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZQorIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLgorIyBUaGlzIGlzIHVzZWZ1bCBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUKKyMgTWFrZWZpbGUgZG9uJ3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZXZhbHVhdGUgYWxsIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUKKyMgZmlsZXMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvCisjIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBjb25kaXRpb25hbAorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZAorIyB3YXkgYnkgc2V0dGluZyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUworIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZQorIyBQUkVERUZJTkVEIGFuZCBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZSBpbmNsdWRlcyBmaWxlcworIyBpbiB0aGUgSU5DTFVERV9QQVRIIChzZWUgYmVsb3cpIHdpbGwgYmUgc2VhcmNoIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieQorIyB0aGUgcHJlcHJvY2Vzc29yLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gIiR7RWlnZW5fU09VUkNFX0RJUn0vRWlnZW4vc3JjL3BsdWdpbnMiIAorCisjIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQKKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZQorIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbAorIyBiZSB1c2VkLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0KKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0CisjIGFyZSBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lCisjIG9yIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSA9IGFyZQorIyBvbWl0dGVkID0xIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcKKyMgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvcgorIyBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gRUlHRU5fRU1QVFlfU1RSVUNUIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9QQVJTRURfQllfRE9YWUdFTiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fVkVDVE9SSVpFIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9RVF9TVVBQT1JUIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9TVFJPTkdfSU5MSU5FPWlubGluZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU4yX1NVUFBPUlRfU1RBR0U9OTkKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCisjIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLgorIyBUaGUgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4KKyMgVXNlIHRoZSBQUkVERUZJTkVEIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbi4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IEVJR0VOX01BS0VfVFlQRURFRlMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX01BS0VfRklYRURfVFlQRURFRlMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX01BS0VfVFlQRURFRlNfQUxMX1NJWkVTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9NQUtFX0NXSVNFX0JJTkFSWV9PUCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fQ1dJU0VfVU5PUF9SRVRVUk5fVFlQRSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fQ1dJU0VfQklOT1BfUkVUVVJOX1RZUEUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX0NXSVNFX1BST0RVQ1RfUkVUVVJOX1RZUEUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX0NVUlJFTlRfU1RPUkFHRV9CQVNFX0NMQVNTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfRUlHRU5fR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTjJfU1VQUE9SVAorCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4KKyMgZG94eWdlbidzIHByZXByb2Nlc3NvciB3aWxsIHJlbW92ZSBhbGwgZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUKKyMgb24gYSBsaW5lLCBoYXZlIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaAorIyBmdW5jdGlvbiBtYWNyb3MgYXJlIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZQorIyB0aGUgcGFyc2VyIGlmIG5vdCByZW1vdmVkLgorCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBUQUdGSUxFUyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWdmaWxlcy4KKyMgT3B0aW9uYWxseSBhbiBpbml0aWFsIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uCisjIGNhbiBiZSBhZGRlZCBmb3IgZWFjaCB0YWdmaWxlLiBUaGUgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dAorIyB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjICAgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4KKyMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czoKKyMgICBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCisjIHdoZXJlICJsb2MxIiBhbmQgImxvYzIiIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRocyBvcgorIyBVUkxzLiBJZiBhIGxvY2F0aW9uIGlzIHByZXNlbnQgZm9yIGVhY2ggdGFnLCB0aGUgaW5zdGFsbGRveCB0b29sCisjIGRvZXMgbm90IGhhdmUgdG8gYmUgcnVuIHRvIGNvcnJlY3QgdGhlIGxpbmtzLgorIyBOb3RlIHRoYXQgZWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZQorIyAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcGF0aCkKKyMgSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4KKyMgaXMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9ICIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9laWdlbi11bnN1cHBvcnRlZC5kb3h5dGFncyI9dW5zdXBwb3J0ZWQKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2MvZWlnZW4uZG94eXRhZ3MiCisKKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcworIyB3aWxsIGJlIGxpc3RlZC4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsCisjIGJlIGxpc3RlZC4KKworRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgaW5oZXJpdGFuY2UgZGlhZ3JhbSAoaW4gSFRNTCwgUlRGIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlCisjIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0byBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQKKyMgdGhpcyBvcHRpb24gaXMgc3VwZXJzZWRlZCBieSB0aGUgSEFWRV9ET1Qgb3B0aW9uIGJlbG93LiBUaGlzIGlzIG9ubHkgYQorIyBmYWxsYmFjay4gSXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlCisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0KKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZQorIyBpbmhlcml0YW5jZSBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkCisjIG9yIGlzIG5vdCBhIGNsYXNzLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gTk8KKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6LCBhIGdyYXBoIHZpc3VhbGl6YXRpb24KKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbgorIyBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gWUVTCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgd3JpdGUgYSBmb250IGNhbGxlZCBGcmVlU2Fucy50dGYgdG8gdGhlIG91dHB1dAorIyBkaXJlY3RvcnkgYW5kIHJlZmVyZW5jZSBpdCBpbiBhbGwgZG90IGZpbGVzIHRoYXQgZG94eWdlbiBnZW5lcmF0ZXMuIFRoaXMKKyMgZm9udCBkb2VzIG5vdCBpbmNsdWRlIGFsbCBwb3NzaWJsZSB1bmljb2RlIGNoYXJhY3RlcnMgaG93ZXZlciwgc28gd2hlbiB5b3UgbmVlZAorIyB0aGVzZSAob3IganVzdCB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250KSB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZQorIyB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIG5lZWQgdG8gbWFrZSBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsCisjIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYSBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nIHRoZQorIyBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5CisjIGNvbnRhaW5pbmcgdGhlIGZvbnQuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBGcmVlU2FucworCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSB0byBsb29rIGZvciB0aGUKKyMgRnJlZVNhbnMudHRmIGZvbnQgKHdoaWNoIGRveHlnZW4gd2lsbCBwdXQgdGhlcmUgaXRzZWxmKS4gSWYgeW91IHNwZWNpZnkgYQorIyBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQgdGhlIHBhdGggd2hlcmUgZG90CisjIGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorCitET1RfRk9OVFBBVEggICAgICAgICAgID0KKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLiBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZQorIyB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZAorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gTk8KKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMKKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUKKyMgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpciBpbnN0YW5jZXMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFX0dSQVBILCBhbmQgSEFWRV9ET1QKKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQKKyMgZmlsZSBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGgKKyMgb3RoZXIgZG9jdW1lbnRlZCBmaWxlcy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVEX0JZX0dSQVBILCBhbmQKKyMgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoCisjIGRvY3VtZW50ZWQgaGVhZGVyIGZpbGUgc2hvd2luZyB0aGUgZG9jdW1lbnRlZCBmaWxlcyB0aGF0IGRpcmVjdGx5IG9yCisjIGluZGlyZWN0bHkgaW5jbHVkZSB0aGlzIGZpbGUuCisKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBOTworCisjIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCBvcHRpb25zIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbCBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocworIyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4KKworQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBTExFUl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIKKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdyYXBoaWNhbCBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gTk8KKworIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBILCBTSE9XX0RJUkVDVE9SSUVTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTCisjIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMKKyMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisKK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBOTworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgcG5nLCBqcGcsIG9yIGdpZgorIyBJZiBsZWZ0IGJsYW5rIHBuZyB3aWxsIGJlIHVzZWQuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBUaGUgdGFnIERPVF9QQVRIIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorCitET1RfUEFUSCAgICAgICAgICAgICAgID0KKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGRvdGZpbGUgY29tbWFuZCkuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPQorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mCisjIG5vZGVzIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaAorIyBiZWNvbWVzIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzCisjIHZpc3VhbGl6ZWQgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZQorIyBudW1iZXIgb2YgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUKKyMgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUKKyMgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlCisjIGZyb20gdGhlIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzCisjIHRoYXQgbGF5IGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcworIyBvcHRpb24gdG8gMSBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlCisjIGNvZGUgYmFzZXMuIEFsc28gbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisKK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAwCisKKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50CisjIGJhY2tncm91bmQuIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCB3aGljaCByZXN1bHRzIGluIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLCBlbmFibGluZyB0aGlzIG9wdGlvbgorIyBtYXkgbGVhZCB0byBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZiBhIGdyYXBoIChpLmUuIHRoZXkKKyMgYmVjb21lIGhhcmQgdG8gcmVhZCkuCisKK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0CisjIGZpbGVzIGluIG9uZSBydW4gKGkuZS4gbXVsdGlwbGUgLW8gYW5kIC1UIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSkuIFRoaXMKKyMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkKKyMgc3VwcG9ydCB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKworRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kCisjIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZCBncmFwaHMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90IGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUKKyMgdGhlIHZhcmlvdXMgZ3JhcGhzLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gdGhlIHNlYXJjaCBlbmdpbmUKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgU0VBUkNIRU5HSU5FIHRhZyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgYSBzZWFyY2ggZW5naW5lIHNob3VsZCBiZQorIyB1c2VkLiBJZiBzZXQgdG8gTk8gdGhlIHZhbHVlcyBvZiBhbGwgdGFncyBiZWxvdyB0aGlzIG9uZSB3aWxsIGJlIGlnbm9yZWQuCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBOTwpkaWZmIC0tZ2l0IGEvZG9jL0VpZ2VuX1NpbGx5X1Byb2Zlc3Nvcl82NHg2NC5wbmcgYi9kb2MvRWlnZW5fU2lsbHlfUHJvZmVzc29yXzY0eDY0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzlkNDViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0VpZ2VuX1NpbGx5X1Byb2Zlc3Nvcl82NHg2NC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL0kwMF9DdXN0b21pemluZ0VpZ2VuLmRveCBiL2RvYy9JMDBfQ3VzdG9taXppbmdFaWdlbi5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0NTE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9JMDBfQ3VzdG9taXppbmdFaWdlbi5kb3gKQEAgLTAsMCArMSwxOTEgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0N1c3RvbWl6aW5nRWlnZW4gQ3VzdG9taXppbmcvRXh0ZW5kaW5nIEVpZ2VuCisKK0VpZ2VuIGNhbiBiZSBleHRlbmRlZCBpbiBzZXZlcmFsIHdheXMsIGZvciBpbnN0YW5jZSwgYnkgZGVmaW5pbmcgZ2xvYmFsIG1ldGhvZHMsIFxyZWYgRXh0ZW5kaW5nTWF0cml4QmFzZSAiYnkgYWRkaW5nIGN1c3RvbSBtZXRob2RzIHRvIE1hdHJpeEJhc2UiLCBhZGRpbmcgc3VwcG9ydCB0byBccmVmIEN1c3RvbVNjYWxhclR5cGUgImN1c3RvbSB0eXBlcyIgZXRjLgorCitcYiBUYWJsZSBcYiBvZiBcYiBjb250ZW50cworICAtIFxyZWYgRXh0ZW5kaW5nTWF0cml4QmFzZQorICAtIFxyZWYgSW5oZXJpdGluZ0Zyb21NYXRyaXgKKyAgLSBccmVmIEN1c3RvbVNjYWxhclR5cGUKKworXHNlY3Rpb24gRXh0ZW5kaW5nTWF0cml4QmFzZSBFeHRlbmRpbmcgTWF0cml4QmFzZSAoYW5kIG90aGVyIGNsYXNzZXMpCisKK0luIHRoaXMgc2VjdGlvbiB3ZSB3aWxsIHNlZSBob3cgdG8gYWRkIGN1c3RvbSBtZXRob2RzIHRvIE1hdHJpeEJhc2UuIFNpbmNlIGFsbCBleHByZXNzaW9ucyBhbmQgbWF0cml4IHR5cGVzIGluaGVyaXQgTWF0cml4QmFzZSwgYWRkaW5nIGEgbWV0aG9kIHRvIE1hdHJpeEJhc2UgbWFrZSBpdCBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYWxsIGV4cHJlc3Npb25zICEgQSB0eXBpY2FsIHVzZSBjYXNlIGlzLCBmb3IgaW5zdGFuY2UsIHRvIG1ha2UgRWlnZW4gY29tcGF0aWJsZSB3aXRoIGFub3RoZXIgQVBJLgorCitZb3UgY2VydGFpbmx5IGtub3cgdGhhdCBpbiBDKysgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFkZCBtZXRob2RzIHRvIGFuIGV4aXN0aW5nIGNsYXNzLiBTbyBob3cgdGhhdCdzIHBvc3NpYmxlID8gSGVyZSB0aGUgdHJpY2sgaXMgdG8gaW5jbHVkZSBpbiB0aGUgZGVjbGFyYXRpb24gb2YgTWF0cml4QmFzZSBhIGZpbGUgZGVmaW5lZCBieSB0aGUgcHJlcHJvY2Vzc29yIHRva2VuIFxjIEVJR0VOX01BVFJJWEJBU0VfUExVR0lOOgorXGNvZGUKK2NsYXNzIE1hdHJpeEJhc2UgeworICAvLyAuLi4KKyAgI2lmZGVmIEVJR0VOX01BVFJJWEJBU0VfUExVR0lOCisgICNpbmNsdWRlIEVJR0VOX01BVFJJWEJBU0VfUExVR0lOCisgICNlbmRpZgorfTsKK1xlbmRjb2RlCitUaGVyZWZvcmUgdG8gZXh0ZW5kIE1hdHJpeEJhc2Ugd2l0aCB5b3VyIG93biBtZXRob2RzIHlvdSBqdXN0IGhhdmUgdG8gY3JlYXRlIGEgZmlsZSB3aXRoIHlvdXIgbWV0aG9kIGRlY2xhcmF0aW9uIGFuZCBkZWZpbmUgRUlHRU5fTUFUUklYQkFTRV9QTFVHSU4gYmVmb3JlIHlvdSBpbmNsdWRlIGFueSBFaWdlbidzIGhlYWRlciBmaWxlLgorCitZb3UgY2FuIGV4dGVuZCBtYW55IG9mIHRoZSBvdGhlciBjbGFzc2VzIHVzZWQgaW4gRWlnZW4gYnkgZGVmaW5pbmcgc2ltaWxhcmx5IG5hbWVkIHByZXByb2Nlc3NvciBzeW1ib2xzLiBGb3IgaW5zdGFuY2UsIGRlZmluZSBcYyBFSUdFTl9BUlJBWUJBU0VfUExVR0lOIGlmIHlvdSB3YW50IHRvIGV4dGVuZCB0aGUgQXJyYXlCYXNlIGNsYXNzLiBBIGZ1bGwgbGlzdCBvZiBjbGFzc2VzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIGluIHRoaXMgd2F5IGFuZCB0aGUgY29ycmVzcG9uZGluZyBwcmVwcm9jZXNzb3Igc3ltYm9scyBjYW4gYmUgZm91bmQgb24gb3VyIHBhZ2UgXHJlZiBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXMuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBhbiBleHRlbnNpb24gZmlsZSBmb3IgYWRkaW5nIG1ldGhvZHMgdG8gTWF0cml4QmFzZTogXG4KK1xiIE1hdHJpeEJhc2VBZGRvbnMuaAorXGNvZGUKK2lubGluZSBTY2FsYXIgYXQodWludCBpLCB1aW50IGopIGNvbnN0IHsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoaSxqKTsgfQoraW5saW5lIFNjYWxhciYgYXQodWludCBpLCB1aW50IGopIHsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoaSxqKTsgfQoraW5saW5lIFNjYWxhciBhdCh1aW50IGkpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yW10oaSk7IH0KK2lubGluZSBTY2FsYXImIGF0KHVpbnQgaSkgeyByZXR1cm4gdGhpcy0+b3BlcmF0b3JbXShpKTsgfQorCitpbmxpbmUgUmVhbFNjYWxhciBzcXVhcmVkTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gc3F1YXJlZE5vcm0oKTsgfQoraW5saW5lIFJlYWxTY2FsYXIgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbm9ybSgpOyB9CitpbmxpbmUgUmVhbFNjYWxhciBpbnZMZW5ndGgodm9pZCkgY29uc3QgeyByZXR1cm4gZmFzdF9pbnZfc3FydChzcXVhcmVkTm9ybSgpKTsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitpbmxpbmUgU2NhbGFyIHNxdWFyZWREaXN0YW5jZVRvKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIGNvbnN0Cit7IHJldHVybiAoZGVyaXZlZCgpIC0gb3RoZXIuZGVyaXZlZCgpKS5zcXVhcmVkTm9ybSgpOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBSZWFsU2NhbGFyIGRpc3RhbmNlVG8oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgY29uc3QKK3sgcmV0dXJuIGludGVybmFsOjpzcXJ0KGRlcml2ZWQoKS5zcXVhcmVkRGlzdGFuY2VUbyhvdGhlcikpOyB9CisKK2lubGluZSB2b2lkIHNjYWxlVG8oUmVhbFNjYWxhciBsKSB7IFJlYWxTY2FsYXIgdmwgPSBub3JtKCk7IGlmICh2bD4xZS05KSBkZXJpdmVkKCkgKj0gKGwvdmwpOyB9CisKK2lubGluZSBUcmFuc3Bvc2U8RGVyaXZlZD4gdHJhbnNwb3NlZCgpIHtyZXR1cm4gdGhpcy0+dHJhbnNwb3NlKCk7fQoraW5saW5lIGNvbnN0IFRyYW5zcG9zZTxEZXJpdmVkPiB0cmFuc3Bvc2VkKCkgY29uc3Qge3JldHVybiB0aGlzLT50cmFuc3Bvc2UoKTt9CisKK2lubGluZSB1aW50IG1pbkNvbXBvbmVudElkKHZvaWQpIGNvbnN0ICB7IGludCBpOyB0aGlzLT5taW5Db2VmZigmaSk7IHJldHVybiBpOyB9CitpbmxpbmUgdWludCBtYXhDb21wb25lbnRJZCh2b2lkKSBjb25zdCAgeyBpbnQgaTsgdGhpcy0+bWF4Q29lZmYoJmkpOyByZXR1cm4gaTsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Cit2b2lkIG1ha2VGbG9vcihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSB7IGRlcml2ZWQoKSA9IGRlcml2ZWQoKS5jd2lzZU1pbihvdGhlci5kZXJpdmVkKCkpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Cit2b2lkIG1ha2VDZWlsKGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIHsgZGVyaXZlZCgpID0gZGVyaXZlZCgpLmN3aXNlTWF4KG90aGVyLmRlcml2ZWQoKSk7IH0KKworY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYWRkX29wPFNjYWxhcj4sIERlcml2ZWQ+CitvcGVyYXRvcisoY29uc3QgU2NhbGFyJiBzY2FsYXIpIGNvbnN0Cit7IHJldHVybiBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9hZGRfb3A8U2NhbGFyPiwgRGVyaXZlZD4oZGVyaXZlZCgpLCBpbnRlcm5hbDo6c2NhbGFyX2FkZF9vcDxTY2FsYXI+KHNjYWxhcikpOyB9CisKK2ZyaWVuZCBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9hZGRfb3A8U2NhbGFyPiwgRGVyaXZlZD4KK29wZXJhdG9yKyhjb25zdCBTY2FsYXImIHNjYWxhciwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbWF0KQoreyByZXR1cm4gQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYWRkX29wPFNjYWxhcj4sIERlcml2ZWQ+KG1hdC5kZXJpdmVkKCksIGludGVybmFsOjpzY2FsYXJfYWRkX29wPFNjYWxhcj4oc2NhbGFyKSk7IH0KK1xlbmRjb2RlCisKK1RoZW4gb25lIGNhbiB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIGluIHRoZSBjb25maWcuaCBvciB3aGF0ZXZlciBwcmVyZXF1aXNpdGVzIGhlYWRlciBmaWxlIG9mIGhpcyBwcm9qZWN0OgorXGNvZGUKKyNkZWZpbmUgRUlHRU5fTUFUUklYQkFTRV9QTFVHSU4gIk1hdHJpeEJhc2VBZGRvbnMuaCIKK1xlbmRjb2RlCisKK1xzZWN0aW9uIEluaGVyaXRpbmdGcm9tTWF0cml4IEluaGVyaXRpbmcgZnJvbSBNYXRyaXgKKworQmVmb3JlIGluaGVyaXRpbmcgZnJvbSBNYXRyaXgsIGJlIHJlYWxseSwgaSBtZWFuIFJFQUxMWSBzdXJlIHRoYXQgdXNpbmcKK0VJR0VOX01BVFJJWF9QTFVHSU4gaXMgbm90IHdoYXQgeW91IHJlYWxseSB3YW50IChzZWUgcHJldmlvdXMgc2VjdGlvbikuCitJZiB5b3UganVzdCBuZWVkIHRvIGFkZCBmZXcgbWVtYmVycyB0byBNYXRyaXgsIHRoaXMgaXMgdGhlIHdheSB0byBnby4KKworQW4gZXhhbXBsZSBvZiB3aGVuIHlvdSBhY3R1YWxseSBuZWVkIHRvIGluaGVyaXQgTWF0cml4LCBpcyB3aGVuIHlvdSBoYXZlCitzZXZlcmFsIGxheWVycyBvZiBoZXJpdGFnZSBzdWNoIGFzICBNeVZlcnlTcGVjaWZpY1ZlY3RvcjEsTXlWZXJ5U3BlY2lmaWNWZWN0b3IxIC0+IE15VmVjdG9yMSAtPiBNYXRyaXggYW5kLgorTXlWZXJ5U3BlY2lmaWNWZWN0b3IzLE15VmVyeVNwZWNpZmljVmVjdG9yNCAtPiBNeVZlY3RvcjIgLT4gTWF0cml4LgorCitJbiBvcmRlciBmb3IgeW91ciBvYmplY3QgdG8gd29yayB3aXRoaW4gdGhlICVFaWdlbiBmcmFtZXdvcmssIHlvdSBuZWVkIHRvCitkZWZpbmUgYSBmZXcgbWVtYmVycyBpbiB5b3VyIGluaGVyaXRlZCBjbGFzcy4KKworSGVyZSBpcyBhIG1pbmltYWxpc3RpYyBleGFtcGxlOlxuCitcY29kZQorY2xhc3MgTXlWZWN0b3JUeXBlIDogcHVibGljICBFaWdlbjo6VmVjdG9yWGQKK3sKK3B1YmxpYzoKKyAgICBNeVZlY3RvclR5cGUodm9pZCk6RWlnZW46OlZlY3RvclhkKCkge30KKworICAgIHR5cGVkZWYgRWlnZW46OlZlY3RvclhkIEJhc2U7CisKKyAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB5b3UgdG8gY29uc3RydWN0IE15VmVjdG9yVHlwZSBmcm9tIEVpZ2VuIGV4cHJlc3Npb25zCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIE15VmVjdG9yVHlwZShjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICAgICAgOiBFaWdlbjo6VmVjdG9yM2Qob3RoZXIpCisgICAgeyB9CisKKyAgICAvLyBUaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIGFzc2lnbiBFaWdlbiBleHByZXNzaW9ucyB0byBNeVZlY3RvclR5cGUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgTXlWZWN0b3JUeXBlICYgb3BlcmF0b3I9IChjb25zdCBFaWdlbjo6TWF0cml4QmFzZSA8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgeworICAgICAgICB0aGlzLT5CYXNlOjpvcGVyYXRvcj0ob3RoZXIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorfTsKK1xlbmRjb2RlCisKK1RoaXMgaXMgdGhlIGtpbmQgb2YgZXJyb3IgeW91IGNhbiBnZXQgaWYgeW91IGRvbid0IHByb3ZpZGUgdGhvc2UgbWV0aG9kcworXGNvZGUKK2Vycm9yOiBubyBtYXRjaCBmb3Ig4oCYb3BlcmF0b3I94oCZIGluIOKAmGRlbHRhID0KKygoKEVpZ2VuOjpNYXRyaXhCYXNlPEVpZ2VuOjpNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMTAwMDAsIDEsIDIsIDEwMDAwLAorMT4gPiopKCYgZGVsdGEpKSArIDh1KS0+RWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD46OmN3aXNlIFt3aXRoIERlcml2ZWQgPQorRWlnZW46Ok1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxMDAwMCwgMSwgMiwgMTAwMDAsCisxPl0oKS5FaWdlbjo6Q3dpc2U8RXhwcmVzc2lvblR5cGU+OjpvcGVyYXRvciogW3dpdGggT3RoZXJEZXJpdmVkID0KK0VpZ2VuOjpNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMTAwMDAsIDEsIDIsIDEwMDAwLCAxPiwgRXhwcmVzc2lvblR5cGUgPQorRWlnZW46Ok1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxMDAwMCwgMSwgMiwgMTAwMDAsIDE+XSgoKGNvbnN0CitFaWdlbjo6TWF0cml4QmFzZTxFaWdlbjo6TWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sIDEwMDAwLCAxLCAyLCAxMDAwMCwgMT4KKz4mKSgoKGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlPEVpZ2VuOjpNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMTAwMDAsIDEsCis+MiwgMTAwMDAsIDE+ID4qKSgoY29uc3Qgc3BlY3RyYWwxZCopd2hlcmUpKSArIDh1KSkp4oCZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorXGVuZGNvZGUKKworXGFuY2hvciB1c2VyX2RlZmluZWRfc2NhbGFycyBcc2VjdGlvbiBDdXN0b21TY2FsYXJUeXBlIFVzaW5nIGN1c3RvbSBzY2FsYXIgdHlwZXMKKworQnkgZGVmYXVsdCwgRWlnZW4gY3VycmVudGx5IHN1cHBvcnRzIHN0YW5kYXJkIGZsb2F0aW5nLXBvaW50IHR5cGVzIChcYyBmbG9hdCwgXGMgZG91YmxlLCBcYyBzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBcYyBzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgXGMgbG9uZyBcYyBkb3VibGUpLCBhcyB3ZWxsIGFzIGFsbCBpbnRlZ3JhbGUgdHlwZXMgKGUuZy4sIFxjIGludCwgXGMgdW5zaWduZWQgXGMgaW50LCBcYyBzaG9ydCwgZXRjLiksIGFuZCBcYyBib29sLgorT24geDg2LTY0IHN5c3RlbXMsIFxjIGxvbmcgXGMgZG91YmxlIHBlcm1pdHMgdG8gbG9jYWxseSBlbmZvcmNlcyB0aGUgdXNlIG9mIHg4NyByZWdpc3RlcnMgd2l0aCBleHRlbmRlZCBhY2N1cmFjeSAoaW4gY29tcGFyaXNvbiB0byBTU0UpLgorCitJbiBvcmRlciB0byBhZGQgc3VwcG9ydCBmb3IgYSBjdXN0b20gdHlwZSBcYyBUIHlvdSBuZWVkOgorLSMgbWFrZSBzdXJlIHRoZSBjb21tb24gb3BlcmF0b3IgKCssLSwqLC8sZXRjLikgYXJlIHN1cHBvcnRlZCBieSB0aGUgdHlwZSBcYyBUCistIyBhZGQgYSBzcGVjaWFsaXphdGlvbiBvZiBzdHJ1Y3QgRWlnZW46Ok51bVRyYWl0czxUPiAoc2VlIFxyZWYgTnVtVHJhaXRzKQorLSMgZGVmaW5lIHRoZSBtYXRoIGZ1bmN0aW9ucyB0aGF0IG1ha2VzIHNlbnNlIGZvciB5b3VyIHR5cGUuIFRoaXMgaW5jbHVkZXMgc3RhbmRhcmQgb25lcyBsaWtlIHNxcnQsIHBvdywgc2luLCB0YW4sIGNvbmosIHJlYWwsIGltYWcsIGV0YywgYXMgd2VsbCBhcyBhYnMyIHdoaWNoIGlzIEVpZ2VuIHNwZWNpZmljLgorICAgICAoc2VlIHRoZSBmaWxlIEVpZ2VuL3NyYy9Db3JlL01hdGhGdW5jdGlvbnMuaCkKKworVGhlIG1hdGggZnVuY3Rpb24gc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIHRoYW4gXGMgVCwgb3IgaW4gdGhlIFxjIHN0ZCBuYW1lc3BhY2UgdGhvdWdoIHRoYXQgc2Vjb25kIGFwcHJhb2NoIGlzIG5vdCByZWNvbW1lbmRlZC4KKworSGVyZSBpcyBhIGNvbmNyZXRlIGV4YW1wbGUgYWRkaW5nIHN1cHBvcnQgZm9yIHRoZSBBZG9sYydzIFxjIGFkb3VibGUgdHlwZS4gPGEgaHJlZj0iaHR0cHM6Ly9wcm9qZWN0cy5jb2luLW9yLm9yZy9BRE9MLUMiPkFkb2xjPC9hPiBpcyBhbiBhdXRvbWF0aWMgZGlmZmVyZW50aWF0aW9uIGxpYnJhcnkuIFRoZSB0eXBlIFxjIGFkb3VibGUgaXMgYmFzaWNhbGx5IGEgcmVhbCB2YWx1ZSB0cmFja2luZyB0aGUgdmFsdWVzIG9mIGFueSBudW1iZXIgb2YgcGFydGlhbCBkZXJpdmF0aXZlcy4KKworXGNvZGUKKyNpZm5kZWYgQURPTENTVVBQT1JUX0gKKyNkZWZpbmUgQURPTENTVVBQT1JUX0gKKworI2RlZmluZSBBRE9MQ19UQVBFTEVTUworI2luY2x1ZGUgPGFkb2xjL2Fkb3VibGUuaD4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCituYW1lc3BhY2UgRWlnZW4geworCit0ZW1wbGF0ZTw+IHN0cnVjdCBOdW1UcmFpdHM8YWR0bDo6YWRvdWJsZT4KKyA6IE51bVRyYWl0czxkb3VibGU+IC8vIHBlcm1pdHMgdG8gZ2V0IHRoZSBlcHNpbG9uLCBkdW1teV9wcmVjaXNpb24sIGxvd2VzdCwgaGlnaGVzdCBmdW5jdGlvbnMKK3sKKyAgdHlwZWRlZiBhZHRsOjphZG91YmxlIFJlYWw7CisgIHR5cGVkZWYgYWR0bDo6YWRvdWJsZSBOb25JbnRlZ2VyOworICB0eXBlZGVmIGFkdGw6OmFkb3VibGUgTmVzdGVkOworCisgIGVudW0geworICAgIElzQ29tcGxleCA9IDAsCisgICAgSXNJbnRlZ2VyID0gMCwKKyAgICBJc1NpZ25lZCA9IDEsCisgICAgUmVxdWlyZUluaXRpYWxpemF0aW9uID0gMSwKKyAgICBSZWFkQ29zdCA9IDEsCisgICAgQWRkQ29zdCA9IDMsCisgICAgTXVsQ29zdCA9IDMKKyAgfTsKK307CisKK30KKworbmFtZXNwYWNlIGFkdGwgeworCitpbmxpbmUgY29uc3QgYWRvdWJsZSYgY29uaihjb25zdCBhZG91YmxlJiB4KSAgeyByZXR1cm4geDsgfQoraW5saW5lIGNvbnN0IGFkb3VibGUmIHJlYWwoY29uc3QgYWRvdWJsZSYgeCkgIHsgcmV0dXJuIHg7IH0KK2lubGluZSBhZG91YmxlIGltYWcoY29uc3QgYWRvdWJsZSYpICAgIHsgcmV0dXJuIDAuOyB9CitpbmxpbmUgYWRvdWJsZSBhYnMoY29uc3QgYWRvdWJsZSYgIHgpICB7IHJldHVybiBmYWJzKHgpOyB9CitpbmxpbmUgYWRvdWJsZSBhYnMyKGNvbnN0IGFkb3VibGUmIHgpICB7IHJldHVybiB4Kng7IH0KKworfQorCisjZW5kaWYgLy8gQURPTENTVVBQT1JUX0gKK1xlbmRjb2RlCisKKworXHNhIFxyZWYgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9JMDFfVG9waWNMYXp5RXZhbHVhdGlvbi5kb3ggYi9kb2MvSTAxX1RvcGljTGF6eUV2YWx1YXRpb24uZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5M2JjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSTAxX1RvcGljTGF6eUV2YWx1YXRpb24uZG94CkBAIC0wLDAgKzEsNjUgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0xhenlFdmFsdWF0aW9uIExhenkgRXZhbHVhdGlvbiBhbmQgQWxpYXNpbmcKKworRXhlY3V0aXZlIHN1bW1hcnk6IEVpZ2VuIGhhcyBpbnRlbGxpZ2VudCBjb21waWxlLXRpbWUgbWVjaGFuaXNtcyB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uIGFuZCByZW1vdmluZyB0ZW1wb3JhcmllcyB3aGVyZSBhcHByb3ByaWF0ZS4KK0l0IHdpbGwgaGFuZGxlIGFsaWFzaW5nIGF1dG9tYXRpY2FsbHkgaW4gbW9zdCBjYXNlcywgZm9yIGV4YW1wbGUgd2l0aCBtYXRyaXggcHJvZHVjdHMuIFRoZSBhdXRvbWF0aWMgYmVoYXZpb3IgY2FuIGJlIG92ZXJyaWRkZW4KK21hbnVhbGx5IGJ5IHVzaW5nIHRoZSBNYXRyaXhCYXNlOjpldmFsKCkgYW5kIE1hdHJpeEJhc2U6Om5vYWxpYXMoKSBtZXRob2RzLgorCitXaGVuIHlvdSB3cml0ZSBhIGxpbmUgb2YgY29kZSBpbnZvbHZpbmcgYSBjb21wbGV4IGV4cHJlc3Npb24gc3VjaCBhcworCitcY29kZSBtYXQxID0gbWF0MiArIG1hdDMgKiAobWF0NCArIG1hdDUpOyBcZW5kY29kZQorCitFaWdlbiBkZXRlcm1pbmVzIGF1dG9tYXRpY2FsbHksIGZvciBlYWNoIHN1Yi1leHByZXNzaW9uLCB3aGV0aGVyIHRvIGV2YWx1YXRlIGl0IGludG8gYSB0ZW1wb3JhcnkgdmFyaWFibGUuIEluZGVlZCwgaW4gY2VydGFpbiBjYXNlcyBpdCBpcyBiZXR0ZXIgdG8gZXZhbHVhdGUgaW1tZWRpYXRlbHkgYSBzdWItZXhwcmVzc2lvbiBpbnRvIGEgdGVtcG9yYXJ5IHZhcmlhYmxlLCB3aGlsZSBpbiBvdGhlciBjYXNlcyBpdCBpcyBiZXR0ZXIgdG8gYXZvaWQgdGhhdC4KKworQSB0cmFkaXRpb25hbCBtYXRoIGxpYnJhcnkgd2l0aG91dCBleHByZXNzaW9uIHRlbXBsYXRlcyBhbHdheXMgZXZhbHVhdGVzIGFsbCBzdWItZXhwcmVzc2lvbnMgaW50byB0ZW1wb3Jhcmllcy4gU28gd2l0aCB0aGlzIGNvZGUsCisKK1xjb2RlIHZlYzEgPSB2ZWMyICsgdmVjMzsgXGVuZGNvZGUKKworYSB0cmFkaXRpb25hbCBsaWJyYXJ5IHdvdWxkIGV2YWx1YXRlIFxjIHZlYzIgKyB2ZWMzIGludG8gYSB0ZW1wb3JhcnkgXGMgdmVjNCBhbmQgdGhlbiBjb3B5IFxjIHZlYzQgIGludG8gXGMgdmVjMS4gVGhpcyBpcyBvZiBjb3Vyc2UgaW5lZmZpY2llbnQ6IHRoZSBhcnJheXMgYXJlIHRyYXZlcnNlZCB0d2ljZSwgc28gdGhlcmUgYXJlIGEgbG90IG9mIHVzZWxlc3MgbG9hZC9zdG9yZSBvcGVyYXRpb25zLgorCitFeHByZXNzaW9uLXRlbXBsYXRlcy1iYXNlZCBsaWJyYXJpZXMgY2FuIGF2b2lkIGV2YWx1YXRpbmcgc3ViLWV4cHJlc3Npb25zIGludG8gdGVtcG9yYXJpZXMsIHdoaWNoIGluIG1hbnkgY2FzZXMgcmVzdWx0cyBpbiBsYXJnZSBzcGVlZCBpbXByb3ZlbWVudHMuIFRoaXMgaXMgY2FsbGVkIDxpPmxhenkgZXZhbHVhdGlvbjwvaT4gYXMgYW4gZXhwcmVzc2lvbiBpcyBnZXR0aW5nIGV2YWx1YXRlZCBhcyBsYXRlIGFzIHBvc3NpYmxlLCBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5LiBIb3dldmVyLCBtb3N0IG90aGVyIGV4cHJlc3Npb24tdGVtcGxhdGVzLWJhc2VkIGxpYnJhcmllcyA8aT5hbHdheXM8L2k+IGNob29zZSBsYXp5IGV2YWx1YXRpb24uIFRoZXJlIGFyZSB0d28gcHJvYmxlbXMgd2l0aCB0aGF0OiBmaXJzdCwgbGF6eSBldmFsdWF0aW9uIGlzIG5vdCBhbHdheXMgYSBnb29kIGNob2ljZSBmb3IgcGVyZm9ybWFuY2U7IHNlY29uZCwgbGF6eSBldmFsdWF0aW9uIGNhbiBiZSB2ZXJ5IGRhbmdlcm91cywgZm9yIGV4YW1wbGUgd2l0aCBtYXRyaXggcHJvZHVjdHM6IGRvaW5nIDx0dD5tYXRyaXggPSBtYXRyaXgqbWF0cml4PC90dD4gZ2l2ZXMgYSB3cm9uZyByZXN1bHQgaWYgdGhlIG1hdHJpeCBwcm9kdWN0IGlzIGxhenktZXZhbHVhdGVkLCBiZWNhdXNlIG9mIHRoZSB3YXkgbWF0cml4IHByb2R1Y3Qgd29ya3MuCisKK0ZvciB0aGVzZSByZWFzb25zLCBFaWdlbiBoYXMgaW50ZWxsaWdlbnQgY29tcGlsZS10aW1lIG1lY2hhbmlzbXMgdG8gZGV0ZXJtaW5lIGF1dG9tYXRpY2FsbHkgd2hlbiB0byB1c2UgbGF6eSBldmFsdWF0aW9uLCBhbmQgd2hlbiBvbiB0aGUgY29udHJhcnkgaXQgc2hvdWxkIGV2YWx1YXRlIGltbWVkaWF0ZWx5IGludG8gYSB0ZW1wb3JhcnkgdmFyaWFibGUuCisKK1NvIGluIHRoZSBiYXNpYyBleGFtcGxlLAorCitcY29kZSBtYXRyaXgxID0gbWF0cml4MiArIG1hdHJpeDM7IFxlbmRjb2RlCisKK0VpZ2VuIGNob29zZXMgbGF6eSBldmFsdWF0aW9uLiBUaHVzIHRoZSBhcnJheXMgYXJlIHRyYXZlcnNlZCBvbmx5IG9uY2UsIHByb2R1Y2luZyBvcHRpbWl6ZWQgY29kZS4gSWYgeW91IHJlYWxseSB3YW50IHRvIGZvcmNlIGltbWVkaWF0ZSBldmFsdWF0aW9uLCB1c2UgXGxpbmsgTWF0cml4QmFzZTo6ZXZhbCgpIGV2YWwoKVxlbmRsaW5rOgorCitcY29kZSBtYXRyaXgxID0gKG1hdHJpeDIgKyBtYXRyaXgzKS5ldmFsKCk7IFxlbmRjb2RlCisKK0hlcmUgaXMgbm93IGEgbW9yZSBpbnZvbHZlZCBleGFtcGxlOgorCitcY29kZSBtYXRyaXgxID0gLW1hdHJpeDIgKyBtYXRyaXgzICsgNSAqIG1hdHJpeDQ7IFxlbmRjb2RlCisKK0VpZ2VuIGNob29zZXMgbGF6eSBldmFsdWF0aW9uIGF0IGV2ZXJ5IHN0YWdlIGluIHRoYXQgZXhhbXBsZSwgd2hpY2ggaXMgY2xlYXJseSB0aGUgY29ycmVjdCBjaG9pY2UuIEluIGZhY3QsIGxhenkgZXZhbHVhdGlvbiBpcyB0aGUgImRlZmF1bHQgY2hvaWNlIiBhbmQgRWlnZW4gd2lsbCBjaG9vc2UgaXQgZXhjZXB0IGluIGEgZmV3IGNpcmN1bXN0YW5jZXMuCisKKzxiPlRoZSBmaXJzdCBjaXJjdW1zdGFuY2U8L2I+IGluIHdoaWNoIEVpZ2VuIGNob29zZXMgaW1tZWRpYXRlIGV2YWx1YXRpb24sIGlzIHdoZW4gaXQgc2VlcyBhbiBhc3NpZ25tZW50IDx0dD5hID0gYjs8L3R0PiBhbmQgdGhlIGV4cHJlc3Npb24gXGMgYiBoYXMgdGhlIGV2YWx1YXRlLWJlZm9yZS1hc3NpZ25pbmcgXGxpbmsgZmxhZ3MgZmxhZ1xlbmRsaW5rLiBUaGUgbW9zdCBpbXBvcnRhbnQgZXhhbXBsZSBvZiBzdWNoIGFuIGV4cHJlc3Npb24gaXMgdGhlIFxsaW5rIEdlbmVyYWxQcm9kdWN0IG1hdHJpeCBwcm9kdWN0IGV4cHJlc3Npb25cZW5kbGluay4gRm9yIGV4YW1wbGUsIHdoZW4geW91IGRvCisKK1xjb2RlIG1hdHJpeCA9IG1hdHJpeCAqIG1hdHJpeDsgXGVuZGNvZGUKKworRWlnZW4gZmlyc3QgZXZhbHVhdGVzIDx0dD5tYXRyaXggKiBtYXRyaXg8L3R0PiBpbnRvIGEgdGVtcG9yYXJ5IG1hdHJpeCwgYW5kIHRoZW4gY29waWVzIGl0IGludG8gdGhlIG9yaWdpbmFsIFxjIG1hdHJpeC4gVGhpcyBndWFyYW50ZWVzIGEgY29ycmVjdCByZXN1bHQgYXMgd2Ugc2F3IGFib3ZlIHRoYXQgbGF6eSBldmFsdWF0aW9uIGdpdmVzIHdyb25nIHJlc3VsdHMgd2l0aCBtYXRyaXggcHJvZHVjdHMuIEl0IGFsc28gZG9lc24ndCBjb3N0IG11Y2gsIGFzIHRoZSBjb3N0IG9mIHRoZSBtYXRyaXggcHJvZHVjdCBpdHNlbGYgaXMgbXVjaCBoaWdoZXIuCisKK1doYXQgaWYgeW91IGtub3cgdGhhdCB0aGUgcmVzdWx0IGRvZXMgbm8gYWxpYXMgdGhlIG9wZXJhbmQgb2YgdGhlIHByb2R1Y3QgYW5kIHdhbnQgdG8gZm9yY2UgbGF6eSBldmFsdWF0aW9uPyBUaGVuIHVzZSBcbGluayBNYXRyaXhCYXNlOjpub2FsaWFzKCkgLm5vYWxpYXMoKVxlbmRsaW5rIGluc3RlYWQuIEhlcmUgaXMgYW4gZXhhbXBsZToKKworXGNvZGUgbWF0cml4MS5ub2FsaWFzKCkgPSBtYXRyaXgyICogbWF0cml4MjsgXGVuZGNvZGUKKworSGVyZSwgc2luY2Ugd2Uga25vdyB0aGF0IG1hdHJpeDIgaXMgbm90IHRoZSBzYW1lIG1hdHJpeCBhcyBtYXRyaXgxLCB3ZSBrbm93IHRoYXQgbGF6eSBldmFsdWF0aW9uIGlzIG5vdCBkYW5nZXJvdXMsIHNvIHdlIG1heSBmb3JjZSBsYXp5IGV2YWx1YXRpb24uIENvbmNyZXRlbHksIHRoZSBlZmZlY3Qgb2Ygbm9hbGlhcygpIGhlcmUgaXMgdG8gYnlwYXNzIHRoZSBldmFsdWF0ZS1iZWZvcmUtYXNzaWduaW5nIFxsaW5rIGZsYWdzIGZsYWdcZW5kbGluay4KKworPGI+VGhlIHNlY29uZCBjaXJjdW1zdGFuY2U8L2I+IGluIHdoaWNoIEVpZ2VuIGNob29zZXMgaW1tZWRpYXRlIGV2YWx1YXRpb24sIGlzIHdoZW4gaXQgc2VlcyBhIG5lc3RlZCBleHByZXNzaW9uIHN1Y2ggYXMgPHR0PmEgKyBiPC90dD4gd2hlcmUgXGMgYiBpcyBhbHJlYWR5IGFuIGV4cHJlc3Npb24gaGF2aW5nIHRoZSBldmFsdWF0ZS1iZWZvcmUtbmVzdGluZyBcbGluayBmbGFncyBmbGFnXGVuZGxpbmsuIEFnYWluLCB0aGUgbW9zdCBpbXBvcnRhbnQgZXhhbXBsZSBvZiBzdWNoIGFuIGV4cHJlc3Npb24gaXMgdGhlIFxsaW5rIEdlbmVyYWxQcm9kdWN0IG1hdHJpeCBwcm9kdWN0IGV4cHJlc3Npb25cZW5kbGluay4gRm9yIGV4YW1wbGUsIHdoZW4geW91IGRvCisKK1xjb2RlIG1hdHJpeDEgPSBtYXRyaXgyICsgbWF0cml4MyAqIG1hdHJpeDQ7IFxlbmRjb2RlCisKK3RoZSBwcm9kdWN0IDx0dD5tYXRyaXgzICogbWF0cml4NDwvdHQ+IGdldHMgZXZhbHVhdGVkIGltbWVkaWF0ZWx5IGludG8gYSB0ZW1wb3JhcnkgbWF0cml4LiBJbmRlZWQsIGV4cGVyaW1lbnRzIHNob3dlZCB0aGF0IGl0IGlzIG9mdGVuIGJlbmVmaWNpYWwgZm9yIHBlcmZvcm1hbmNlIHRvIGV2YWx1YXRlIGltbWVkaWF0ZWx5IG1hdHJpeCBwcm9kdWN0cyB3aGVuIHRoZXkgYXJlIG5lc3RlZCBpbnRvIGJpZ2dlciBleHByZXNzaW9ucy4KKworPGI+VGhlIHRoaXJkIGNpcmN1bXN0YW5jZTwvYj4gaW4gd2hpY2ggRWlnZW4gY2hvb3NlcyBpbW1lZGlhdGUgZXZhbHVhdGlvbiwgaXMgd2hlbiBpdHMgY29zdCBtb2RlbCBzaG93cyB0aGF0IHRoZSB0b3RhbCBjb3N0IG9mIGFuIG9wZXJhdGlvbiBpcyByZWR1Y2VkIGlmIGEgc3ViLWV4cHJlc3Npb24gZ2V0cyBldmFsdWF0ZWQgaW50byBhIHRlbXBvcmFyeS4gSW5kZWVkLCBpbiBjZXJ0YWluIGNhc2VzLCBhbiBpbnRlcm1lZGlhdGUgcmVzdWx0IGlzIHN1ZmZpY2llbnRseSBjb3N0bHkgdG8gY29tcHV0ZSBhbmQgaXMgcmV1c2VkIHN1ZmZpY2llbnRseSBtYW55IHRpbWVzLCB0aGF0IGlzIHdvcnRoICJjYWNoaW5nIi4gSGVyZSBpcyBhbiBleGFtcGxlOgorCitcY29kZSBtYXRyaXgxID0gbWF0cml4MiAqIChtYXRyaXgzICsgbWF0cml4NCk7IFxlbmRjb2RlCisKK0hlcmUsIHByb3ZpZGVkIHRoZSBtYXRyaWNlcyBoYXZlIGF0IGxlYXN0IDIgcm93cyBhbmQgMiBjb2x1bW5zLCBlYWNoIGNvZWZmaWNpZW5jdCBvZiB0aGUgZXhwcmVzc2lvbiA8dHQ+bWF0cml4MyArIG1hdHJpeDQ8L3R0PiBpcyBnb2luZyB0byBiZSB1c2VkIHNldmVyYWwgdGltZXMgaW4gdGhlIG1hdHJpeCBwcm9kdWN0LiBJbnN0ZWFkIG9mIGNvbXB1dGluZyB0aGUgc3VtIGV2ZXJ5dGltZSwgaXQgaXMgbXVjaCBiZXR0ZXIgdG8gY29tcHV0ZSBpdCBvbmNlIGFuZCBzdG9yZSBpdCBpbiBhIHRlbXBvcmFyeSB2YXJpYWJsZS4gRWlnZW4gdW5kZXJzdGFuZHMgdGhpcyBhbmQgZXZhbHVhdGVzIDx0dD5tYXRyaXgzICsgbWF0cml4NDwvdHQ+IGludG8gYSB0ZW1wb3JhcnkgdmFyaWFibGUgYmVmb3JlIGV2YWx1YXRpbmcgdGhlIHByb2R1Y3QuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9JMDJfSGlQZXJmb3JtYW5jZS5kb3ggYi9kb2MvSTAyX0hpUGVyZm9ybWFuY2UuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWMyY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSTAyX0hpUGVyZm9ybWFuY2UuZG94CkBAIC0wLDAgKzEsMTI4IEBACisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY1dyaXRpbmdFZmZpY2llbnRQcm9kdWN0RXhwcmVzc2lvbiBXcml0aW5nIGVmZmljaWVudCBtYXRyaXggcHJvZHVjdCBleHByZXNzaW9ucworCitJbiBnZW5lcmFsIGFjaGlldmluZyBnb29kIHBlcmZvcm1hbmNlIHdpdGggRWlnZW4gZG9lcyBubyByZXF1aXJlIGFueSBzcGVjaWFsIGVmZm9ydDoKK3NpbXBseSB3cml0ZSB5b3VyIGV4cHJlc3Npb25zIGluIHRoZSBtb3N0IGhpZ2ggbGV2ZWwgd2F5LiBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZQorZm9yIHNtYWxsIGZpeGVkIHNpemUgbWF0cmljZXMuIEZvciBsYXJnZSBtYXRyaWNlcywgaG93ZXZlciwgaXQgbWlnaHQgYmUgdXNlZnVsIHRvCit0YWtlIHNvbWUgY2FyZSB3aGVuIHdyaXRpbmcgeW91ciBleHByZXNzaW9ucyBpbiBvcmRlciB0byBtaW5pbWl6ZSB1c2VsZXNzIGV2YWx1YXRpb25zCithbmQgb3B0aW1pemUgdGhlIHBlcmZvcm1hbmNlLgorSW4gdGhpcyBwYWdlIHdlIHdpbGwgZ2l2ZSBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBFaWdlbidzIGludGVybmFsIG1lY2hhbmlzbSB0byBzaW1wbGlmeQorYW5kIGV2YWx1YXRlIGNvbXBsZXggcHJvZHVjdCBleHByZXNzaW9ucywgYW5kIGRpc2N1c3MgdGhlIGN1cnJlbnQgbGltaXRhdGlvbnMuCitJbiBwYXJ0aWN1bGFyIHdlIHdpbGwgZm9jdXMgb24gZXhwcmVzc2lvbnMgbWF0Y2hpbmcgbGV2ZWwgMiBhbmQgMyBCTEFTIHJvdXRpbmVzLCBpLmUsCithbGwga2luZCBvZiBtYXRyaXggcHJvZHVjdHMgYW5kIHRyaWFuZ3VsYXIgc29sdmVycy4KKworSW5kZWVkLCBpbiBFaWdlbiB3ZSBoYXZlIGltcGxlbWVudGVkIGEgc2V0IG9mIGhpZ2hseSBvcHRpbWl6ZWQgcm91dGluZXMgd2hpY2ggYXJlIHZlcnkgc2ltaWxhcgordG8gQkxBUydzIG9uZXMuIFVubGlrZSBCTEFTLCB0aG9zZSByb3V0aW5lcyBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdXNlciB2aWEgYSBoaWdoIGxldmVsIGFuZAorbmF0dXJhbCBBUEkuIEVhY2ggb2YgdGhlc2Ugcm91dGluZXMgY2FuIGNvbXB1dGUgaW4gYSBzaW5nbGUgZXZhbHVhdGlvbiBhIHdpZGUgdmFyaWV0eSBvZiBleHByZXNzaW9ucy4KK0dpdmVuIGFuIGV4cHJlc3Npb24sIHRoZSBjaGFsbGVuZ2UgaXMgdGhlbiB0byBtYXAgaXQgdG8gYSBtaW5pbWFsIHNldCBvZiByb3V0aW5lcy4KK0FzIGV4cGxhaW5lZCBsYXR0ZXIsIHRoaXMgbWVjaGFuaXNtIGhhcyBzb21lIGxpbWl0YXRpb25zLCBhbmQga25vd2luZyB0aGVtIHdpbGwgYWxsb3cKK3lvdSB0byB3cml0ZSBmYXN0ZXIgY29kZSBieSBtYWtpbmcgeW91ciBleHByZXNzaW9ucyBtb3JlIEVpZ2VuIGZyaWVuZGx5LgorCitcc2VjdGlvbiBHRU1NIEdlbmVyYWwgTWF0cml4LU1hdHJpeCBwcm9kdWN0IChHRU1NKQorCitMZXQncyBzdGFydCB3aXRoIHRoZSBtb3N0IGNvbW1vbiBwcmltaXRpdmU6IHRoZSBtYXRyaXggcHJvZHVjdCBvZiBnZW5lcmFsIGRlbnNlIG1hdHJpY2VzLgorSW4gdGhlIEJMQVMgd29ybGQgdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgR0VNTSByb3V0aW5lLiBPdXIgZXF1aXZhbGVudCBwcmltaXRpdmUgY2FuCitwZXJmb3JtIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uOgorXGYkIEMubm9hbGlhcygpICs9IFxhbHBoYSBvcDEoQSkgb3AyKEIpIFxmJAord2hlcmUgQSwgQiwgYW5kIEMgYXJlIGNvbHVtbiBhbmQvb3Igcm93IG1ham9yIG1hdHJpY2VzIChvciBzdWItbWF0cmljZXMpLAorYWxwaGEgaXMgYSBzY2FsYXIgdmFsdWUsIGFuZCBvcDEsIG9wMiBjYW4gYmUgdHJhbnNwb3NlLCBhZGpvaW50LCBjb25qdWdhdGUsIG9yIHRoZSBpZGVudGl0eS4KK1doZW4gRWlnZW4gZGV0ZWN0cyBhIG1hdHJpeCBwcm9kdWN0LCBpdCBhbmFseXplcyBib3RoIHNpZGVzIG9mIHRoZSBwcm9kdWN0IHRvIGV4dHJhY3QgYQordW5pcXVlIHNjYWxhciBmYWN0b3IgYWxwaGEsIGFuZCBmb3IgZWFjaCBzaWRlLCBpdHMgZWZmZWN0aXZlIHN0b3JhZ2Ugb3JkZXIsIHNoYXBlLCBhbmQgY29uanVnYXRpb24gc3RhdGVzLgorTW9yZSBwcmVjaXNlbHkgZWFjaCBzaWRlIGlzIHNpbXBsaWZpZWQgYnkgaXRlcmF0aXZlbHkgcmVtb3ZpbmcgdHJpdmlhbCBleHByZXNzaW9ucyBzdWNoIGFzIHNjYWxhciBtdWx0aXBsZSwKK25lZ2F0aW9uIGFuZCBjb25qdWdhdGlvbi4gVHJhbnNwb3NlIGFuZCBCbG9jayBleHByZXNzaW9ucyBhcmUgbm90IGV2YWx1YXRlZCBhbmQgdGhleSBvbmx5IG1vZGlmeSB0aGUgc3RvcmFnZSBvcmRlcgorYW5kIHNoYXBlLiBBbGwgb3RoZXIgZXhwcmVzc2lvbnMgYXJlIGltbWVkaWF0ZWx5IGV2YWx1YXRlZC4KK0ZvciBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBleHByZXNzaW9uOgorXGNvZGUgbTEubm9hbGlhcygpIC09IHM0ICogKHMxICogbTIuYWRqb2ludCgpICogKC0oczMqbTMpLmNvbmp1Z2F0ZSgpKnMyKSkgIFxlbmRjb2RlCitpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZWQgdG86CitcY29kZSBtMS5ub2FsaWFzKCkgKz0gKHMxKnMyKmNvbmooczMpKnM0KSAqIG0yLmFkam9pbnQoKSAqIG0zLmNvbmp1Z2F0ZSgpIFxlbmRjb2RlCit3aGljaCBleGFjdGx5IG1hdGNoZXMgb3VyIEdFTU0gcm91dGluZS4KKworXHN1YnNlY3Rpb24gR0VNTV9MaW1pdGF0aW9ucyBMaW1pdGF0aW9ucworVW5mb3J0dW5hdGVseSwgdGhpcyBzaW1wbGlmaWNhdGlvbiBtZWNoYW5pc20gaXMgbm90IHBlcmZlY3QgeWV0IGFuZCBub3QgYWxsIGV4cHJlc3Npb25zIHdoaWNoIGNvdWxkIGJlCitoYW5kbGVkIGJ5IGEgc2luZ2xlIEdFTU0tbGlrZSBjYWxsIGFyZSBjb3JyZWN0bHkgZGV0ZWN0ZWQuCis8dGFibGUgY2xhc3M9Im1hbnVhbCIgc3R5bGU9IndpZHRoOjEwMCUiPgorPHRyPgorPHRoPk5vdCBvcHRpbWFsIGV4cHJlc3Npb248L3RoPgorPHRoPkV2YWx1YXRlZCBhczwvdGg+Cis8dGg+T3B0aW1hbCB2ZXJzaW9uIChzaW5nbGUgZXZhbHVhdGlvbik8L3RoPgorPHRoPkNvbW1lbnRzPC90aD4KKzwvdHI+Cis8dHI+Cis8dGQ+XGNvZGUKK20xICs9IG0yICogbTM7IFxlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZQordGVtcCA9IG0yICogbTM7CittMSArPSB0ZW1wOyBcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK20xLm5vYWxpYXMoKSArPSBtMiAqIG0zOyBcZW5kY29kZTwvdGQ+Cis8dGQ+VXNlIC5ub2FsaWFzKCkgdG8gdGVsbCBFaWdlbiB0aGUgcmVzdWx0IGFuZCByaWdodC1oYW5kLXNpZGVzIGRvIG5vdCBhbGlhcy4gCisgICAgT3RoZXJ3aXNlIHRoZSBwcm9kdWN0IG0yICogbTMgaXMgZXZhbHVhdGVkIGludG8gYSB0ZW1wb3JhcnkuPC90ZD4KKzwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+Cis8dGQ+PC90ZD4KKzx0ZD48L3RkPgorPHRkPlxjb2RlCittMS5ub2FsaWFzKCkgKz0gczEgKiAobTIgKiBtMyk7IFxlbmRjb2RlPC90ZD4KKzx0ZD5UaGlzIGlzIGEgc3BlY2lhbCBmZWF0dXJlIG9mIEVpZ2VuLiBIZXJlIHRoZSBwcm9kdWN0IGJldHdlZW4gYSBzY2FsYXIKKyAgICBhbmQgYSBtYXRyaXggcHJvZHVjdCBkb2VzIG5vdCBldmFsdWF0ZSB0aGUgbWF0cml4IHByb2R1Y3QgYnV0IGluc3RlYWQgaXQKKyAgICByZXR1cm5zIGEgbWF0cml4IHByb2R1Y3QgZXhwcmVzc2lvbiB0cmFja2luZyB0aGUgc2NhbGFyIHNjYWxpbmcgZmFjdG9yLiA8YnI+CisgICAgV2l0aG91dCB0aGlzIG9wdGltaXphdGlvbiwgdGhlIG1hdHJpeCBwcm9kdWN0IHdvdWxkIGJlIGV2YWx1YXRlZCBpbnRvIGEKKyAgICB0ZW1wb3JhcnkgYXMgaW4gdGhlIG5leHQgZXhhbXBsZS48L3RkPgorPC90cj4KKzx0cj4KKzx0ZD5cY29kZQorbTEubm9hbGlhcygpICs9IChtMiAqIG0zKS5hZGpvaW50KCk7IFxlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZQordGVtcCA9IG0yICogbTM7CittMSArPSB0ZW1wLmFkam9pbnQoKTsgXGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCittMS5ub2FsaWFzKCkgKz0gbTMuYWRqb2ludCgpCisgICAgICAgICAgICAgICogbTIuYWRqb2ludCgpOyBcZW5kY29kZTwvdGQ+Cis8dGQ+VGhpcyBpcyBiZWNhdXNlIHRoZSBwcm9kdWN0IGV4cHJlc3Npb24gaGFzIHRoZSBFdmFsQmVmb3JlTmVzdGluZyBiaXQgd2hpY2gKKyAgICBlbmZvcmNlcyB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgcHJvZHVjdCBieSB0aGUgVHJhbnBvc2UgZXhwcmVzc2lvbi48L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iYWx0Ij4KKzx0ZD5cY29kZQorbTEgPSBtMSArIG0yICogbTM7IFxlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZQordGVtcCA9IG0yICogbTM7CittMSA9IG0xICsgdGVtcDsgXGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlIG0xLm5vYWxpYXMoKSArPSBtMiAqIG0zOyBcZW5kY29kZTwvdGQ+Cis8dGQ+SGVyZSB0aGVyZSBpcyBubyB3YXkgdG8gZGV0ZWN0IGF0IGNvbXBpbGUgdGltZSB0aGF0IHRoZSB0d28gbTEgYXJlIHRoZSBzYW1lLAorICAgIGFuZCBzbyB0aGUgbWF0cml4IHByb2R1Y3Qgd2lsbCBiZSBpbW1lZGlhdGVseSBldmFsdWF0ZWQuPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+XGNvZGUKK20xLm5vYWxpYXMoKSA9IG00ICsgbTIgKiBtMzsgXGVuZGNvZGU8L3RkPgorPHRkPlxjb2RlCit0ZW1wID0gbTIgKiBtMzsKK20xID0gbTQgKyB0ZW1wOyBcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK20xID0gbTQ7CittMS5ub2FsaWFzKCkgKz0gbTIgKiBtMzsgXGVuZGNvZGU8L3RkPgorPHRkPkZpcnN0IG9mIGFsbCwgaGVyZSB0aGUgLm5vYWxpYXMoKSBpbiB0aGUgZmlyc3QgZXhwcmVzc2lvbiBpcyB1c2VsZXNzIGJlY2F1c2UKKyAgICBtMiptMyB3aWxsIGJlIGV2YWx1YXRlZCBhbnl3YXkuIEhvd2V2ZXIsIG5vdGUgaG93IHRoaXMgZXhwcmVzc2lvbiBjYW4gYmUgcmV3cml0dGVuCisgICAgc28gdGhhdCBubyB0ZW1wb3JhcnkgaXMgcmVxdWlyZWQuICh0aXA6IGZvciB2ZXJ5IHNtYWxsIGZpeGVkIHNpemUgbWF0cml4CisgICAgaXQgaXMgc2xpZ2hsdHkgYmV0dGVyIHRvIHJld3JpdGUgaXQgbGlrZSB0aGlzOiBtMS5ub2FsaWFzKCkgPSBtMiAqIG0zOyBtMSArPSBtNDs8L3RkPgorPC90cj4KKzx0ciBjbGFzcz0iYWx0Ij4KKzx0ZD5cY29kZQorbTEubm9hbGlhcygpICs9IChzMSptMikuYmxvY2soLi4pICogbTM7IFxlbmRjb2RlPC90ZD4KKzx0ZD5cY29kZQordGVtcCA9IChzMSptMikuYmxvY2soLi4pOworbTEgKz0gdGVtcCAqIG0zOyBcZW5kY29kZTwvdGQ+Cis8dGQ+XGNvZGUKK20xLm5vYWxpYXMoKSArPSBzMSAqIG0yLmJsb2NrKC4uKSAqIG0zOyBcZW5kY29kZTwvdGQ+Cis8dGQ+VGhpcyBpcyBiZWNhdXNlIG91ciBleHByZXNzaW9uIGFuYWx5emVyIGlzIGN1cnJlbnRseSBub3QgYWJsZSB0byBleHRyYWN0IHRyaXZpYWwKKyAgICBleHByZXNzaW9ucyBuZXN0ZWQgaW4gYSBCbG9jayBleHByZXNzaW9uLiBUaGVyZWZvcmUgdGhlIG5lc3RlZCBzY2FsYXIKKyAgICBtdWx0aXBsZSBjYW5ub3QgYmUgcHJvcGVybHkgZXh0cmFjdGVkLjwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworT2YgY291cnNlIGFsbCB0aGVzZSByZW1hcmtzIGhvbGQgZm9yIGFsbCBvdGhlciBraW5kIG9mIHByb2R1Y3RzIGludm9sdmluZyB0cmlhbmd1bGFyIG9yIHNlbGZhZGpvaW50IG1hdHJpY2VzLgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvSTAzX0luc2lkZUVpZ2VuRXhhbXBsZS5kb3ggYi9kb2MvSTAzX0luc2lkZUVpZ2VuRXhhbXBsZS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0NWEwMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9JMDNfSW5zaWRlRWlnZW5FeGFtcGxlLmRveApAQCAtMCwwICsxLDUwMCBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljSW5zaWRlRWlnZW5FeGFtcGxlIFdoYXQgaGFwcGVucyBpbnNpZGUgRWlnZW4sIG9uIGEgc2ltcGxlIGV4YW1wbGUKKworXGIgVGFibGUgXGIgb2YgXGIgY29udGVudHMKKyAgLSBccmVmIFdoeUludGVyZXN0aW5nCisgIC0gXHJlZiBDb25zdHJ1Y3RpbmdWZWN0b3JzCisgIC0gXHJlZiBDb25zdHJ1Y3Rpb25PZlN1bVhwcgorICAtIFxyZWYgQXNzaWdubWVudAorXG4KKworPGhyPgorCisKK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBwcm9ncmFtOgorCitcY29kZQorI2luY2x1ZGU8RWlnZW4vQ29yZT4KKworaW50IG1haW4oKQoreworICBpbnQgc2l6ZSA9IDUwOworICAvLyBWZWN0b3JYZiBpcyBhIHZlY3RvciBvZiBmbG9hdHMsIHdpdGggZHluYW1pYyBzaXplLgorICBFaWdlbjo6VmVjdG9yWGYgdShzaXplKSwgdihzaXplKSwgdyhzaXplKTsKKyAgdSA9IHYgKyB3OworfQorXGVuZGNvZGUKKworVGhlIGdvYWwgb2YgdGhpcyBwYWdlIGlzIHRvIHVuZGVyc3RhbmQgaG93IEVpZ2VuIGNvbXBpbGVzIGl0LCBhc3N1bWluZyB0aGF0IFNTRTIgdmVjdG9yaXphdGlvbiBpcyBlbmFibGVkIChHQ0Mgb3B0aW9uIC1tc3NlMikuCisKK1xzZWN0aW9uIFdoeUludGVyZXN0aW5nIFdoeSBpdCdzIGludGVyZXN0aW5nCisKK01heWJlIHlvdSB0aGluaywgdGhhdCB0aGUgYWJvdmUgZXhhbXBsZSBwcm9ncmFtIGlzIHNvIHNpbXBsZSwgdGhhdCBjb21waWxpbmcgaXQgc2hvdWxkbid0IGludm9sdmUgYW55dGhpbmcgaW50ZXJlc3RpbmcuIFNvIGJlZm9yZSBzdGFydGluZywgbGV0IHVzIGV4cGxhaW4gd2hhdCBpcyBub250cml2aWFsIGluIGNvbXBpbGluZyBpdCBjb3JyZWN0bHkgLS0gdGhhdCBpcywgcHJvZHVjaW5nIG9wdGltaXplZCBjb2RlIC0tIHNvIHRoYXQgdGhlIGNvbXBsZXhpdHkgb2YgRWlnZW4sIHRoYXQgd2UnbGwgZXhwbGFpbiBoZXJlLCBpcyByZWFsbHkgdXNlZnVsLgorCitMb29rIGF0IHRoZSBsaW5lIG9mIGNvZGUKK1xjb2RlCisgIHUgPSB2ICsgdzsgICAvLyAgICgqKQorXGVuZGNvZGUKKworVGhlIGZpcnN0IGltcG9ydGFudCB0aGluZyBhYm91dCBjb21waWxpbmcgaXQsIGlzIHRoYXQgdGhlIGFycmF5cyBzaG91bGQgYmUgdHJhdmVyc2VkIG9ubHkgb25jZSwgbGlrZQorXGNvZGUKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgdVtpXSA9IHZbaV0gKyB3W2ldOworXGVuZGNvZGUKK1RoZSBwcm9ibGVtIGlzIHRoYXQgaWYgd2UgbWFrZSBhIG5haXZlIEMrKyBsaWJyYXJ5IHdoZXJlIHRoZSBWZWN0b3JYZiBjbGFzcyBoYXMgYW4gb3BlcmF0b3IrIHJldHVybmluZyBhIFZlY3RvclhmLCB0aGVuIHRoZSBsaW5lIG9mIGNvZGUgKCopIHdpbGwgYW1vdW50IHRvOgorXGNvZGUKKyAgVmVjdG9yWGYgdG1wID0gdiArIHc7CisgIFZlY3RvclhmIHUgPSB0bXA7CitcZW5kY29kZQorT2J2aW91c2x5LCB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSB0ZW1wb3JhcnkgXGEgdG1wIGhlcmUgaXMgdXNlbGVzcy4gSXQgaGFzIGEgdmVyeSBiYWQgZWZmZWN0IG9uIHBlcmZvcm1hbmNlLCBmaXJzdCBiZWNhdXNlIHRoZSBjcmVhdGlvbiBvZiBcYSB0bXAgcmVxdWlyZXMgYSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGluIHRoaXMgY29udGV4dCwgYW5kIHNlY29uZCBhcyB0aGVyZSBhcmUgbm93IHR3byBmb3IgbG9vcHM6CitcY29kZQorICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB0bXBbaV0gPSB2W2ldICsgd1tpXTsKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgdVtpXSA9IHRtcFtpXTsKK1xlbmRjb2RlCitUcmF2ZXJzaW5nIHRoZSBhcnJheXMgdHdpY2UgaW5zdGVhZCBvZiBvbmNlIGlzIHRlcnJpYmxlIGZvciBwZXJmb3JtYW5jZSwgYXMgaXQgbWVhbnMgdGhhdCB3ZSBkbyBtYW55IHJlZHVuZGFudCBtZW1vcnkgYWNjZXNzZXMuCisKK1RoZSBzZWNvbmQgaW1wb3J0YW50IHRoaW5nIGFib3V0IGNvbXBpbGluZyB0aGUgYWJvdmUgcHJvZ3JhbSwgaXMgdG8gbWFrZSBjb3JyZWN0IHVzZSBvZiBTU0UyIGluc3RydWN0aW9ucy4gTm90aWNlIHRoYXQgRWlnZW4gYWxzbyBzdXBwb3J0cyBBbHRpVmVjIGFuZCB0aGF0IGFsbCB0aGUgZGlzY3Vzc2lvbiB0aGF0IHdlIG1ha2UgaGVyZSBhcHBsaWVzIGFsc28gdG8gQWx0aVZlYy4KKworU1NFMiwgbGlrZSBBbHRpVmVjLCBpcyBhIHNldCBvZiBpbnN0cnVjdGlvbnMgYWxsb3dpbmcgdG8gcGVyZm9ybSBjb21wdXRhdGlvbnMgb24gcGFja2V0cyBvZiAxMjggYml0cyBhdCBvbmNlLiBTaW5jZSBhIGZsb2F0IGlzIDMyIGJpdHMsIHRoaXMgbWVhbnMgdGhhdCBTU0UyIGluc3RydWN0aW9ucyBjYW4gaGFuZGxlIDQgZmxvYXRzIGF0IG9uY2UuIFRoaXMgbWVhbnMgdGhhdCwgaWYgY29ycmVjdGx5IHVzZWQsIHRoZXkgY2FuIG1ha2Ugb3VyIGNvbXB1dGF0aW9uIGdvIHVwIHRvIDR4IGZhc3Rlci4KKworSG93ZXZlciwgaW4gdGhlIGFib3ZlIHByb2dyYW0sIHdlIGhhdmUgY2hvc2VuIHNpemU9NTAsIHNvIG91ciB2ZWN0b3JzIGNvbnNpc3Qgb2YgNTAgZmxvYXQncywgYW5kIDUwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW5ub3QgaG9wZSB0byBkbyBhbGwgb2YgdGhhdCBjb21wdXRhdGlvbiB1c2luZyBTU0UyIGluc3RydWN0aW9ucy4gVGhlIHNlY29uZCBiZXN0IHRoaW5nLCB0byB3aGljaCB3ZSBzaG91bGQgYWltLCBpcyB0byBoYW5kbGUgdGhlIDQ4IGZpcnN0IGNvZWZmaWNpZW50cyB3aXRoIFNTRTIgaW5zdHJ1Y3Rpb25zLCBzaW5jZSA0OCBpcyB0aGUgYmlnZ2VzdCBtdWx0aXBsZSBvZiA0IGJlbG93IDUwLCBhbmQgdGhlbiBoYW5kbGUgc2VwYXJhdGVseSwgd2l0aG91dCBTU0UyLCB0aGUgNDl0aCBhbmQgNTB0aCBjb2VmZmljaWVudHMuIFNvbWV0aGluZyBsaWtlIHRoaXM6CisKK1xjb2RlCisgIGZvcihpbnQgaSA9IDA7IGkgPCA0KihzaXplLzQpOyBpKz00KSB1LnBhY2tldChpKSAgPSB2LnBhY2tldChpKSArIHcucGFja2V0KGkpOworICBmb3IoaW50IGkgPSA0KihzaXplLzQpOyBpIDwgc2l6ZTsgaSsrKSB1W2ldID0gdltpXSArIHdbaV07CitcZW5kY29kZQorCitTbyBsZXQgdXMgbG9vayBsaW5lIGJ5IGxpbmUgYXQgb3VyIGV4YW1wbGUgcHJvZ3JhbSwgYW5kIGxldCdzIGZvbGxvdyBFaWdlbiBhcyBpdCBjb21waWxlcyBpdC4KKworXHNlY3Rpb24gQ29uc3RydWN0aW5nVmVjdG9ycyBDb25zdHJ1Y3RpbmcgdmVjdG9ycworCitMZXQncyBhbmFseXplIHRoZSBmaXJzdCBsaW5lOgorCitcY29kZQorICBFaWdlbjo6VmVjdG9yWGYgdShzaXplKSwgdihzaXplKSwgdyhzaXplKTsKK1xlbmRjb2RlCisKK0ZpcnN0IG9mIGFsbCwgVmVjdG9yWGYgaXMgdGhlIGZvbGxvd2luZyB0eXBlZGVmOgorXGNvZGUKKyAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIDE+IFZlY3RvclhmOworXGVuZGNvZGUKKworVGhlIGNsYXNzIHRlbXBsYXRlIE1hdHJpeCBpcyBkZWNsYXJlZCBpbiBzcmMvQ29yZS91dGlsL0ZvcndhcmREZWNsYXJhdGlvbnMuaCB3aXRoIDYgdGVtcGxhdGUgcGFyYW1ldGVycywgYnV0IHRoZSBsYXN0IDMgYXJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgMy4gU28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlbSBmb3Igbm93LiBIZXJlLCBNYXRyaXhcPGZsb2F0LCBEeW5hbWljLCAxXD4gbWVhbnMgYSBtYXRyaXggb2YgZmxvYXRzLCB3aXRoIGEgZHluYW1pYyBudW1iZXIgb2Ygcm93cyBhbmQgMSBjb2x1bW4uCisKK1RoZSBNYXRyaXggY2xhc3MgaW5oZXJpdHMgYSBiYXNlIGNsYXNzLCBNYXRyaXhCYXNlLiBEb24ndCB3b3JyeSBhYm91dCBpdCwgZm9yIG5vdyBpdCBzdWZmaWNlcyB0byBzYXkgdGhhdCBNYXRyaXhCYXNlIGlzIHdoYXQgdW5pZmllcyBtYXRyaWNlcy92ZWN0b3JzIGFuZCBhbGwgdGhlIGV4cHJlc3Npb25zIHR5cGVzIC0tIG1vcmUgb24gdGhhdCBiZWxvdy4KKworV2hlbiB3ZSBkbworXGNvZGUKKyAgRWlnZW46OlZlY3RvclhmIHUoc2l6ZSk7CitcZW5kY29kZQordGhlIGNvbnN0cnVjdG9yIHRoYXQgaXMgY2FsbGVkIGlzIE1hdHJpeDo6TWF0cml4KGludCksIGluIHNyYy9Db3JlL01hdHJpeC5oLiBCZXNpZGVzIHNvbWUgYXNzZXJ0aW9ucywgYWxsIGl0IGRvZXMgaXMgdG8gY29uc3RydWN0IHRoZSBcYSBtX3N0b3JhZ2UgbWVtYmVyLCB3aGljaCBpcyBvZiB0eXBlIERlbnNlU3RvcmFnZVw8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIDFcPi4KKworWW91IG1heSB3b25kZXIsIGlzbid0IGl0IG92ZXJlbmdpbmVlcmluZyB0byBoYXZlIHRoZSBzdG9yYWdlIGluIGEgc2VwYXJhdGUgY2xhc3M/IFRoZSByZWFzb24gaXMgdGhhdCB0aGUgTWF0cml4IGNsYXNzIHRlbXBsYXRlIGNvdmVycyBhbGwga2luZHMgb2YgbWF0cmljZXMgYW5kIHZlY3RvcjogYm90aCBmaXhlZC1zaXplIGFuZCBkeW5hbWljLXNpemUuIFRoZSBzdG9yYWdlIG1ldGhvZCBpcyBub3QgdGhlIHNhbWUgaW4gdGhlc2UgdHdvIGNhc2VzLiBGb3IgZml4ZWQtc2l6ZSwgdGhlIG1hdHJpeCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyBhIHBsYWluIG1lbWJlciBhcnJheS4gRm9yIGR5bmFtaWMtc2l6ZSwgdGhlIGNvZWZmaWNpZW50cyB3aWxsIGJlIHN0b3JlZCBhcyBhIHBvaW50ZXIgdG8gYSBkeW5hbWljYWxseS1hbGxvY2F0ZWQgYXJyYXkuIEJlY2F1c2Ugb2YgdGhpcywgd2UgbmVlZCB0byBhYnN0cmFjdCBzdG9yYWdlIGF3YXkgZnJvbSB0aGUgTWF0cml4IGNsYXNzLiBUaGF0J3MgRGVuc2VTdG9yYWdlLgorCitMZXQncyBsb29rIGF0IHRoaXMgY29uc3RydWN0b3IsIGluIHNyYy9Db3JlL0RlbnNlU3RvcmFnZS5oLiBZb3UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSBtYW55IHBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIG9mIERlbnNlU3RvcmFnZXMgaGVyZSwgdHJlYXRpbmcgc2VwYXJhdGVseSB0aGUgY2FzZXMgd2hlcmUgZGltZW5zaW9ucyBhcmUgRHluYW1pYyBvciBmaXhlZCBhdCBjb21waWxlLXRpbWUuIFRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHRoYXQgd2UgYXJlIGxvb2tpbmcgYXQgaXM6CitcY29kZQordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IF9Db2xzPiBjbGFzcyBEZW5zZVN0b3JhZ2U8VCwgRHluYW1pYywgRHluYW1pYywgX0NvbHM+CitcZW5kY29kZQorCitIZXJlLCB0aGUgY29uc3RydWN0b3IgY2FsbGVkIGlzIERlbnNlU3RvcmFnZTo6RGVuc2VTdG9yYWdlKGludCBzaXplLCBpbnQgcm93cywgaW50IGNvbHVtbnMpCit3aXRoIHNpemU9NTAsIHJvd3M9NTAsIGNvbHVtbnM9MS4KKworSGVyZSBpcyB0aGlzIGNvbnN0cnVjdG9yOgorXGNvZGUKK2lubGluZSBEZW5zZVN0b3JhZ2UoaW50IHNpemUsIGludCByb3dzLCBpbnQpIDogbV9kYXRhKGludGVybmFsOjphbGlnbmVkX25ldzxUPihzaXplKSksIG1fcm93cyhyb3dzKSB7fQorXGVuZGNvZGUKKworSGVyZSwgdGhlIFxhIG1fZGF0YSBtZW1iZXIgaXMgdGhlIGFjdHVhbCBhcnJheSBvZiBjb2VmZmljaWVudHMgb2YgdGhlIG1hdHJpeC4gQXMgeW91IHNlZSwgaXQgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiBSYXRoZXIgdGhhbiBjYWxsaW5nIG5ld1tdIG9yIG1hbGxvYygpLCBhcyB5b3UgY2FuIHNlZSwgd2UgaGF2ZSBvdXIgb3duIGludGVybmFsOjphbGlnbmVkX25ldyBkZWZpbmVkIGluIHNyYy9Db3JlL3V0aWwvTWVtb3J5LmguIFdoYXQgaXQgZG9lcyBpcyB0aGF0IGlmIHZlY3Rvcml6YXRpb24gaXMgZW5hYmxlZCwgdGhlbiBpdCB1c2VzIGEgcGxhdGZvcm0tc3BlY2lmaWMgY2FsbCB0byBhbGxvY2F0ZSBhIDEyOC1iaXQtYWxpZ25lZCBhcnJheSwgYXMgdGhhdCBpcyB2ZXJ5IHVzZWZ1bCBmb3IgdmVjdG9yaXphdGlvbiB3aXRoIGJvdGggU1NFMiBhbmQgQWx0aVZlYy4gSWYgdmVjdG9yaXphdGlvbiBpcyBkaXNhYmxlZCwgaXQgYW1vdW50cyB0byB0aGUgc3RhbmRhcmQgbmV3W10uCisKK0FzIHlvdSBjYW4gc2VlLCB0aGUgY29uc3RydWN0b3IgYWxzbyBzZXRzIHRoZSBcYSBtX3Jvd3MgbWVtYmVyIHRvIFxhIHNpemUuIE5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIFxhIG1fY29sdW1ucyBtZW1iZXI6IGluZGVlZCwgaW4gdGhpcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIERlbnNlU3RvcmFnZSwgd2Uga25vdyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYXQgY29tcGlsZS10aW1lLCBzaW5jZSB0aGUgX0NvbHMgdGVtcGxhdGUgcGFyYW1ldGVyIGlzIGRpZmZlcmVudCBmcm9tIER5bmFtaWMuIE5hbWVseSwgaW4gb3VyIGNhc2UsIF9Db2xzIGlzIDEsIHdoaWNoIGlzIHRvIHNheSB0aGF0IG91ciB2ZWN0b3IgaXMganVzdCBhIG1hdHJpeCB3aXRoIDEgY29sdW1uLiBIZW5jZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYXMgYSBydW50aW1lIHZhcmlhYmxlLgorCitXaGVuIHlvdSBjYWxsIFZlY3RvclhmOjpkYXRhKCkgdG8gZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBjb2VmZmljaWVudHMsIGl0IHJldHVybnMgRGVuc2VTdG9yYWdlOjpkYXRhKCkgd2hpY2ggcmV0dXJucyB0aGUgXGEgbV9kYXRhIG1lbWJlci4KKworV2hlbiB5b3UgY2FsbCBWZWN0b3JYZjo6c2l6ZSgpIHRvIGdldCB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yLCB0aGlzIGlzIGFjdHVhbGx5IGEgbWV0aG9kIGluIHRoZSBiYXNlIGNsYXNzIE1hdHJpeEJhc2UuIEl0IGRldGVybWluZXMgdGhhdCB0aGUgdmVjdG9yIGlzIGEgY29sdW1uLXZlY3Rvciwgc2luY2UgQ29sc0F0Q29tcGlsZVRpbWU9PTEgKHRoaXMgY29tZXMgZnJvbSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBpbiB0aGUgdHlwZWRlZiBWZWN0b3JYZikuIEl0IGRlZHVjZXMgdGhhdCB0aGUgc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIHJvd3MsIHNvIGl0IHJldHVybnMgVmVjdG9yWGY6OnJvd3MoKSwgd2hpY2ggcmV0dXJucyBEZW5zZVN0b3JhZ2U6OnJvd3MoKSwgd2hpY2ggcmV0dXJucyB0aGUgXGEgbV9yb3dzIG1lbWJlciwgd2hpY2ggd2FzIHNldCB0byBcYSBzaXplIGJ5IHRoZSBjb25zdHJ1Y3Rvci4KKworXHNlY3Rpb24gQ29uc3RydWN0aW9uT2ZTdW1YcHIgQ29uc3RydWN0aW9uIG9mIHRoZSBzdW0gZXhwcmVzc2lvbgorCitOb3cgdGhhdCBvdXIgdmVjdG9ycyBhcmUgY29uc3RydWN0ZWQsIGxldCdzIG1vdmUgb24gdG8gdGhlIG5leHQgbGluZToKKworXGNvZGUKK3UgPSB2ICsgdzsKK1xlbmRjb2RlCisKK1RoZSBleGVjdXRpdmUgc3VtbWFyeSBpcyB0aGF0IG9wZXJhdG9yKyByZXR1cm5zIGEgInN1bSBvZiB2ZWN0b3JzIiBleHByZXNzaW9uLCBidXQgZG9lc24ndCBhY3R1YWxseSBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbi4gSXQgaXMgdGhlIG9wZXJhdG9yPSwgd2hvc2UgY2FsbCBvY2N1cnMgdGhlcmVhZnRlciwgdGhhdCBkb2VzIHRoZSBjb21wdXRhdGlvbi4KKworTGV0IHVzIG5vdyBzZWUgd2hhdCBFaWdlbiBkb2VzIHdoZW4gaXQgc2VlcyB0aGlzOgorCitcY29kZQordiArIHcKK1xlbmRjb2RlCisKK0hlcmUsIHYgYW5kIHcgYXJlIG9mIHR5cGUgVmVjdG9yWGYsIHdoaWNoIGlzIGEgdHlwZWRlZiBmb3IgYSBzcGVjaWFsaXphdGlvbiBvZiBNYXRyaXggKGFzIHdlIGV4cGxhaW5lZCBhYm92ZSksIHdoaWNoIGlzIGEgc3ViY2xhc3Mgb2YgTWF0cml4QmFzZS4gU28gd2hhdCBpcyBiZWluZyBjYWxsZWQgaXMKKworXGNvZGUKK01hdHJpeEJhc2U6Om9wZXJhdG9yKyhjb25zdCBNYXRyaXhCYXNlJikKK1xlbmRjb2RlCisKK1RoZSByZXR1cm4gdHlwZSBvZiB0aGlzIG9wZXJhdG9yIGlzCitcY29kZQorQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxmbG9hdD4sIFZlY3RvclhmLCBWZWN0b3JYZj4KK1xlbmRjb2RlCitUaGUgQ3dpc2VCaW5hcnlPcCBjbGFzcyBpcyBvdXIgZmlyc3QgZW5jb3VudGVyIHdpdGggYW4gZXhwcmVzc2lvbiB0ZW1wbGF0ZS4gQXMgd2Ugc2FpZCwgdGhlIG9wZXJhdG9yKyBkb2Vzbid0IGJ5IGl0c2VsZiBwZXJmb3JtIGFueSBjb21wdXRhdGlvbiwgaXQganVzdCByZXR1cm5zIGFuIGFic3RyYWN0ICJzdW0gb2YgdmVjdG9ycyIgZXhwcmVzc2lvbi4gU2luY2UgdGhlcmUgYXJlIGFsc28gImRpZmZlcmVuY2Ugb2YgdmVjdG9ycyIgYW5kICJjb2VmZmljaWVudC13aXNlIHByb2R1Y3Qgb2YgdmVjdG9ycyIgZXhwcmVzc2lvbnMsIHdlIHVuaWZ5IHRoZW0gYWxsIGFzICJjb2VmZmljaWVudC13aXNlIGJpbmFyeSBvcGVyYXRpb25zIiwgd2hpY2ggd2UgYWJicmV2aWF0ZSBhcyAiQ3dpc2VCaW5hcnlPcCIuICJDb2VmZmljaWVudC13aXNlIiBtZWFucyB0aGF0IHRoZSBvcGVyYXRpb25zIGlzIHBlcmZvcm1lZCBjb2VmZmljaWVudCBieSBjb2VmZmljaWVudC4gImJpbmFyeSIgbWVhbnMgdGhhdCB0aGVyZSBhcmUgdHdvIG9wZXJhbmRzIC0tIHdlIGFyZSBhZGRpbmcgdHdvIHZlY3RvcnMgd2l0aCBvbmUgYW5vdGhlci4KKworTm93IHlvdSBtaWdodCBhc2ssIHdoYXQgaWYgd2UgZGlkIHNvbWV0aGluZyBsaWtlCisKK1xjb2RlCit2ICsgdyArIHU7CitcZW5kY29kZQorCitUaGUgZmlyc3QgdiArIHcgd291bGQgcmV0dXJuIGEgQ3dpc2VCaW5hcnlPcCBhcyBhYm92ZSwgc28gaW4gb3JkZXIgZm9yIHRoaXMgdG8gY29tcGlsZSwgd2UnZCBuZWVkIHRvIGRlZmluZSBhbiBvcGVyYXRvcisgYWxzbyBpbiB0aGUgY2xhc3MgQ3dpc2VCaW5hcnlPcC4uLiBhdCB0aGlzIHBvaW50IGl0IHN0YXJ0cyBsb29raW5nIGxpa2UgYSBuaWdodG1hcmU6IGFyZSB3ZSBnb2luZyB0byBoYXZlIHRvIGRlZmluZSBhbGwgb3BlcmF0b3JzIGluIGVhY2ggb2YgdGhlIGV4cHJlc3Npb24gY2xhc3NlcyAoYXMgeW91IGd1ZXNzZWQsIEN3aXNlQmluYXJ5T3AgaXMgb25seSBvbmUgb2YgbWFueSkgPyBUaGlzIGxvb2tzIGxpa2UgYSBkZWFkIGVuZCEKKworVGhlIHNvbHV0aW9uIGlzIHRoYXQgQ3dpc2VCaW5hcnlPcCBpdHNlbGYsIGFzIHdlbGwgYXMgTWF0cml4IGFuZCBhbGwgdGhlIG90aGVyIGV4cHJlc3Npb24gdHlwZXMsIGlzIGEgc3ViY2xhc3Mgb2YgTWF0cml4QmFzZS4gU28gaXQgaXMgZW5vdWdoIHRvIGRlZmluZSBvbmNlIGFuZCBmb3IgYWxsIHRoZSBvcGVyYXRvcnMgaW4gY2xhc3MgTWF0cml4QmFzZS4KKworU2luY2UgTWF0cml4QmFzZSBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3Mgb2YgZGlmZmVyZW50IHN1YmNsYXNzZXMsIHRoZSBhc3BlY3RzIHRoYXQgZGVwZW5kIG9uIHRoZSBzdWJjbGFzcyBtdXN0IGJlIGFic3RyYWN0ZWQgZnJvbSBNYXRyaXhCYXNlLiBUaGlzIGlzIGNhbGxlZCBwb2x5bW9ycGhpc20uCisKK1RoZSBjbGFzc2ljYWwgYXBwcm9hY2ggdG8gcG9seW1vcnBoaXNtIGluIEMrKyBpcyBieSBtZWFucyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucy4gVGhpcyBpcyBkeW5hbWljIHBvbHltb3JwaGlzbS4gSGVyZSB3ZSBkb24ndCB3YW50IGR5bmFtaWMgcG9seW1vcnBoaXNtIGJlY2F1c2UgdGhlIHdob2xlIGRlc2lnbiBvZiBFaWdlbiBpcyBiYXNlZCBhcm91bmQgdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgdGhlIGNvbXBsZXhpdHksIGFsbCB0aGUgYWJzdHJhY3Rpb24sIGdldHMgcmVzb2x2ZWQgYXQgY29tcGlsZS10aW1lLiBUaGlzIGlzIGNydWNpYWw6IGlmIHRoZSBhYnN0cmFjdGlvbiBjYW4ndCBnZXQgcmVzb2x2ZWQgYXQgY29tcGlsZS10aW1lLCBFaWdlbidzIGNvbXBpbGUtdGltZSBvcHRpbWl6YXRpb24gbWVjaGFuaXNtcyBiZWNvbWUgdXNlbGVzcywgbm90IHRvIG1lbnRpb24gdGhhdCBpZiB0aGF0IGFic3RyYWN0aW9uIGhhcyB0byBiZSByZXNvbHZlZCBhdCBydW50aW1lIGl0J2xsIGluY3VyIGFuIG92ZXJoZWFkIGJ5IGl0c2VsZi4KKworSGVyZSwgd2hhdCB3ZSB3YW50IGlzIHRvIGhhdmUgYSBzaW5nbGUgY2xhc3MgTWF0cml4QmFzZSBhcyB0aGUgYmFzZSBvZiBtYW55IHN1YmNsYXNzZXMsIGluIHN1Y2ggYSB3YXkgdGhhdCBlYWNoIE1hdHJpeEJhc2Ugb2JqZWN0IChiZSBpdCBhIG1hdHJpeCwgb3IgdmVjdG9yLCBvciBhbnkga2luZCBvZiBleHByZXNzaW9uKSBrbm93cyBhdCBjb21waWxlLXRpbWUgKGFzIG9wcG9zZWQgdG8gcnVuLXRpbWUpIG9mIHdoaWNoIHBhcnRpY3VsYXIgc3ViY2xhc3MgaXQgaXMgYW4gb2JqZWN0IChpLmUuIHdoZXRoZXIgaXQgaXMgYSBtYXRyaXgsIG9yIGFuIGV4cHJlc3Npb24sIGFuZCB3aGF0IGtpbmQgb2YgZXhwcmVzc2lvbikuCisKK1RoZSBzb2x1dGlvbiBpcyB0aGUgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdXJpb3VzbHlfUmVjdXJyaW5nX1RlbXBsYXRlX1BhdHRlcm4iPkN1cmlvdXNseSBSZWN1cnJpbmcgVGVtcGxhdGUgUGF0dGVybjwvYT4uIExldCdzIGRvIHRoZSBicmVhayBub3cuIEhvcGVmdWxseSB5b3UgY2FuIHJlYWQgdGhpcyB3aWtpcGVkaWEgcGFnZSBkdXJpbmcgdGhlIGJyZWFrIGlmIG5lZWRlZCwgYnV0IGl0IHdvbid0IGJlIGFsbG93ZWQgZHVyaW5nIHRoZSBleGFtLgorCitJbiBzaG9ydCwgTWF0cml4QmFzZSB0YWtlcyBhIHRlbXBsYXRlIHBhcmFtZXRlciBcYSBEZXJpdmVkLiBXaGVuZXZlciB3ZSBkZWZpbmUgYSBzdWJjbGFzcyBTdWJjbGFzcywgd2UgYWN0dWFsbHkgbWFrZSBTdWJjbGFzcyBpbmhlcml0IE1hdHJpeEJhc2VcPFN1YmNsYXNzXD4uIFRoZSBwb2ludCBpcyB0aGF0IGRpZmZlcmVudCBzdWJjbGFzc2VzIGluaGVyaXQgZGlmZmVyZW50IE1hdHJpeEJhc2UgdHlwZXMuIFRoYW5rcyB0byB0aGlzLCB3aGVuZXZlciB3ZSBoYXZlIGFuIG9iamVjdCBvZiBhIHN1YmNsYXNzLCBhbmQgd2UgY2FsbCBvbiBpdCBzb21lIE1hdHJpeEJhc2UgbWV0aG9kLCB3ZSBzdGlsbCByZW1lbWJlciBldmVuIGZyb20gaW5zaWRlIHRoZSBNYXRyaXhCYXNlIG1ldGhvZCB3aGljaCBwYXJ0aWN1bGFyIHN1YmNsYXNzIHdlJ3JlIHRhbGtpbmcgYWJvdXQuCisKK1RoaXMgbWVhbnMgdGhhdCB3ZSBjYW4gcHV0IGFsbW9zdCBhbGwgdGhlIG1ldGhvZHMgYW5kIG9wZXJhdG9ycyBpbiB0aGUgYmFzZSBjbGFzcyBNYXRyaXhCYXNlLCBhbmQgaGF2ZSBvbmx5IHRoZSBiYXJlIG1pbmltdW0gaW4gdGhlIHN1YmNsYXNzZXMuIElmIHlvdSBsb29rIGF0IHRoZSBzdWJjbGFzc2VzIGluIEVpZ2VuLCBsaWtlIGZvciBpbnN0YW5jZSB0aGUgQ3dpc2VCaW5hcnlPcCBjbGFzcywgdGhleSBoYXZlIHZlcnkgZmV3IG1ldGhvZHMuIFRoZXJlIGFyZSBjb2VmZigpIGFuZCBzb21ldGltZXMgY29lZmZSZWYoKSBtZXRob2RzIGZvciBhY2Nlc3MgdG8gdGhlIGNvZWZmaWNpZW50cywgdGhlcmUgYXJlIHJvd3MoKSBhbmQgY29scygpIG1ldGhvZHMgcmV0dXJuaW5nIHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucywgYnV0IHRoZXJlIGlzbid0IG11Y2ggbW9yZSB0aGFuIHRoYXQuIEFsbCB0aGUgbWVhdCBpcyBpbiBNYXRyaXhCYXNlLCBzbyBpdCBvbmx5IG5lZWRzIHRvIGJlIGNvZGVkIG9uY2UgZm9yIGFsbCBraW5kcyBvZiBleHByZXNzaW9ucywgbWF0cmljZXMsIGFuZCB2ZWN0b3JzLgorCitTbyBsZXQncyBlbmQgdGhpcyBkaWdyZXNzaW9uIGFuZCBjb21lIGJhY2sgdG8gdGhlIHBpZWNlIG9mIGNvZGUgZnJvbSBvdXIgZXhhbXBsZSBwcm9ncmFtIHRoYXQgd2Ugd2VyZSBjdXJyZW50bHkgYW5hbHl6aW5nLAorCitcY29kZQordiArIHcKK1xlbmRjb2RlCisKK05vdyB0aGF0IE1hdHJpeEJhc2UgaXMgYSBnb29kIGZyaWVuZCwgbGV0J3Mgd3JpdGUgZnVsbHkgdGhlIHByb3RvdHlwZSBvZiB0aGUgb3BlcmF0b3IrIHRoYXQgZ2V0cyBjYWxsZWQgaGVyZSAodGhpcyBjb2RlIGlzIGZyb20gc3JjL0NvcmUvTWF0cml4QmFzZS5oKToKKworXGNvZGUKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBNYXRyaXhCYXNlCit7CisgIC8vIC4uLgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+LCBEZXJpdmVkLCBPdGhlckRlcml2ZWQ+CisgIG9wZXJhdG9yKyhjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdDsKKworICAvLyAuLi4KK307CitcZW5kY29kZQorCitIZXJlIG9mIGNvdXJzZSwgXGEgRGVyaXZlZCBhbmQgXGEgT3RoZXJEZXJpdmVkIGFyZSBWZWN0b3JYZi4KKworQXMgd2Ugc2FpZCwgQ3dpc2VCaW5hcnlPcCBpcyBhbHNvIHVzZWQgZm9yIG90aGVyIG9wZXJhdGlvbnMgc3VjaCBhcyBzdWJzdHJhdGlvbiwgc28gaXQgdGFrZXMgYW5vdGhlciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGV0ZXJtaW5pbmcgdGhlIG9wZXJhdGlvbiB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byBjb2VmZmljaWVudHMuIFRoaXMgdGVtcGxhdGUgcGFyYW1ldGVyIGlzIGEgZnVuY3RvciwgdGhhdCBpcywgYSBjbGFzcyBpbiB3aGljaCB3ZSBoYXZlIGFuIG9wZXJhdG9yKCkgc28gaXQgYmVoYXZlcyBsaWtlIGEgZnVuY3Rpb24uIEhlcmUsIHRoZSBmdW5jdG9yIHVzZWQgaXMgaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3AuIEl0IGlzIGRlZmluZWQgaW4gc3JjL0NvcmUvRnVuY3RvcnMuaC4KKworTGV0IHVzIG5vdyBleHBsYWluIHRoZSBpbnRlcm5hbDo6dHJhaXRzIGhlcmUuIFRoZSBpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcCBjbGFzcyB0YWtlcyBvbmUgdGVtcGxhdGUgcGFyYW1ldGVyOiB0aGUgdHlwZSBvZiB0aGUgbnVtYmVycyB0byBoYW5kbGUuIEhlcmUgb2YgY291cnNlIHdlIHdhbnQgdG8gcGFzcyB0aGUgc2NhbGFyIHR5cGUgKGEuay5hLiBudW1lcmljIHR5cGUpIG9mIFZlY3RvclhmLCB3aGljaCBpcyBcYyBmbG9hdC4gSG93IGRvIHdlIGRldGVybWluZSB3aGljaCBpcyB0aGUgc2NhbGFyIHR5cGUgb2YgXGEgRGVyaXZlZCA/IFRocm91Z2hvdXQgRWlnZW4sIGFsbCBtYXRyaXggYW5kIGV4cHJlc3Npb24gdHlwZXMgZGVmaW5lIGEgdHlwZWRlZiBcYSBTY2FsYXIgd2hpY2ggZ2l2ZXMgaXRzIHNjYWxhciB0eXBlLiBGb3IgZXhhbXBsZSwgVmVjdG9yWGY6OlNjYWxhciBpcyBhIHR5cGVkZWYgZm9yIFxjIGZsb2F0LiBTbyBoZXJlLCBpZiBsaWZlIHdhcyBlYXN5LCB3ZSBjb3VsZCBmaW5kIHRoZSBudW1lcmljIHR5cGUgb2YgXGEgRGVyaXZlZCBhcyBqdXN0CitcY29kZQordHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyCitcZW5kY29kZQorVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgZG8gdGhhdCBoZXJlLCBhcyB0aGUgY29tcGlsZXIgd291bGQgY29tcGxhaW4gdGhhdCB0aGUgdHlwZSBEZXJpdmVkIGhhc24ndCB5ZXQgYmVlbiBkZWZpbmVkLiBTbyB3ZSB1c2UgYSB3b3JrYXJvdW5kOiBpbiBzcmMvQ29yZS91dGlsL0ZvcndhcmREZWNsYXJhdGlvbnMuaCwgd2UgZGVjbGFyZWQgKG5vdCBkZWZpbmVkISkgYWxsIG91ciBzdWJjbGFzc2VzLCBsaWtlIE1hdHJpeCwgYW5kIHdlIGFsc28gZGVjbGFyZWQgdGhlIGZvbGxvd2luZyBjbGFzcyB0ZW1wbGF0ZToKK1xjb2RlCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaW50ZXJuYWw6OnRyYWl0czsKK1xlbmRjb2RlCitJbiBzcmMvQ29yZS9NYXRyaXguaCwgcmlnaHQgXGVtIGJlZm9yZSB0aGUgZGVmaW5pdGlvbiBvZiBjbGFzcyBNYXRyaXgsIHdlIGRlZmluZSBhIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2YgaW50ZXJuYWw6OnRyYWl0cyBmb3IgVD1NYXRyaXhcPGFueSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzXD4uIEluIHRoaXMgc3BlY2lhbGl6YXRpb24gb2YgaW50ZXJuYWw6OnRyYWl0cywgd2UgZGVmaW5lIHRoZSBTY2FsYXIgdHlwZWRlZi4gU28gd2hlbiB3ZSBhY3R1YWxseSBkZWZpbmUgTWF0cml4LCBpdCBpcyBsZWdhbCB0byByZWZlciB0byAidHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0c1w8TWF0cml4XD46OlNjYWxhciIuCisKK0FueXdheSwgd2UgaGF2ZSBkZWNsYXJlZCBvdXIgb3BlcmF0b3IrLiBJbiBvdXIgY2FzZSwgd2hlcmUgXGEgRGVyaXZlZCBhbmQgXGEgT3RoZXJEZXJpdmVkIGFyZSBWZWN0b3JYZiwgdGhlIGFib3ZlIGRlY2xhcmF0aW9uIGFtb3VudHMgdG86CitcY29kZQorY2xhc3MgTWF0cml4QmFzZTxWZWN0b3JYZj4KK3sKKyAgLy8gLi4uCisKKyAgY29uc3QgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxmbG9hdD4sIFZlY3RvclhmLCBWZWN0b3JYZj4KKyAgb3BlcmF0b3IrKGNvbnN0IE1hdHJpeEJhc2U8VmVjdG9yWGY+ICZvdGhlcikgY29uc3Q7CisKKyAgLy8gLi4uCit9OworXGVuZGNvZGUKKworTGV0J3Mgbm93IGp1bXAgdG8gc3JjL0NvcmUvQ3dpc2VCaW5hcnlPcC5oIHRvIHNlZSBob3cgaXQgaXMgZGVmaW5lZC4gQXMgeW91IGNhbiBzZWUgdGhlcmUsIGFsbCBpdCBkb2VzIGlzIHRvIHJldHVybiBhIEN3aXNlQmluYXJ5T3Agb2JqZWN0LCBhbmQgdGhpcyBvYmplY3QgaXMganVzdCBzdG9yaW5nIHJlZmVyZW5jZXMgdG8gdGhlIGxlZnQtaGFuZC1zaWRlIGFuZCByaWdodC1oYW5kLXNpZGUgZXhwcmVzc2lvbnMgLS0gaGVyZSwgdGhlc2UgYXJlIHRoZSB2ZWN0b3JzIFxhIHYgYW5kIFxhIHcuIFdlbGwsIHRoZSBDd2lzZUJpbmFyeU9wIG9iamVjdCBpcyBhbHNvIHN0b3JpbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIChlbXB0eSkgZnVuY3RvciBjbGFzcywgYnV0IHlvdSBzaG91bGRuJ3Qgd29ycnkgYWJvdXQgaXQgYXMgdGhhdCBpcyBhIG1pbm9yIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKworVGh1cywgdGhlIG9wZXJhdG9yKyBoYXNuJ3QgcGVyZm9ybWVkIGFueSBhY3R1YWwgY29tcHV0YXRpb24uIFRvIHN1bW1hcml6ZSwgdGhlIG9wZXJhdGlvbiBcYSB2ICsgXGEgdyBqdXN0IHJldHVybmVkIGFuIG9iamVjdCBvZiB0eXBlIEN3aXNlQmluYXJ5T3Agd2hpY2ggZGlkIG5vdGhpbmcgZWxzZSB0aGFuIGp1c3Qgc3RvcmluZyByZWZlcmVuY2VzIHRvIFxhIHYgYW5kIFxhIHcuCisKK1xzZWN0aW9uIEFzc2lnbm1lbnQgVGhlIGFzc2lnbm1lbnQKKworQXQgdGhpcyBwb2ludCwgdGhlIGV4cHJlc3Npb24gXGEgdiArIFxhIHcgaGFzIGZpbmlzaGVkIGV2YWx1YXRpbmcsIHNvLCBpbiB0aGUgcHJvY2VzcyBvZiBjb21waWxpbmcgdGhlIGxpbmUgb2YgY29kZQorXGNvZGUKK3UgPSB2ICsgdzsKK1xlbmRjb2RlCit3ZSBub3cgZW50ZXIgdGhlIG9wZXJhdG9yPS4KKworV2hhdCBvcGVyYXRvcj0gaXMgYmVpbmcgY2FsbGVkIGhlcmU/IFRoZSB2ZWN0b3IgdSBpcyBhbiBvYmplY3Qgb2YgY2xhc3MgVmVjdG9yWGYsIGkuZS4gTWF0cml4LiBJbiBzcmMvQ29yZS9NYXRyaXguaCwgaW5zaWRlIHRoZSBkZWZpbml0aW9uIG9mIGNsYXNzIE1hdHJpeCwgd2Ugc2VlIHRoaXM6CitcY29kZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBpbmxpbmUgTWF0cml4JiBvcGVyYXRvcj0oY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9zdG9yYWdlLmRhdGEoKSE9MCAmJiAieW91IGNhbm5vdCB1c2Ugb3BlcmF0b3I9IHdpdGggYSBub24gaW5pdGlhbGl6ZWQgbWF0cml4IChpbnN0ZWFkIHVzZSBzZXQoKSIpOworICAgICAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yPShvdGhlci5kZXJpdmVkKCkpOworICAgIH0KK1xlbmRjb2RlCitIZXJlLCBCYXNlIGlzIGEgdHlwZWRlZiBmb3IgTWF0cml4QmFzZVw8TWF0cml4XD4uIFNvLCB3aGF0IGlzIGJlaW5nIGNhbGxlZCBpcyB0aGUgb3BlcmF0b3I9IG9mIE1hdHJpeEJhc2UuIExldCdzIHNlZSBpdHMgcHJvdG90eXBlIGluIHNyYy9Db3JlL01hdHJpeEJhc2UuaDoKK1xjb2RlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgIERlcml2ZWQmIG9wZXJhdG9yPShjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKTsKK1xlbmRjb2RlCitIZXJlLCBcYSBEZXJpdmVkIGlzIFZlY3RvclhmIChzaW5jZSB1IGlzIGEgVmVjdG9yWGYpIGFuZCBcYSBPdGhlckRlcml2ZWQgaXMgQ3dpc2VCaW5hcnlPcC4gTW9yZSBzcGVjaWZpY2FsbHksIGFzIGV4cGxhaW5lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgXGEgT3RoZXJEZXJpdmVkIGlzOgorXGNvZGUKK0N3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8ZmxvYXQ+LCBWZWN0b3JYZiwgVmVjdG9yWGY+CitcZW5kY29kZQorU28gdGhlIGZ1bGwgcHJvdG90eXBlIG9mIHRoZSBvcGVyYXRvcj0gYmVpbmcgY2FsbGVkIGlzOgorXGNvZGUKK1ZlY3RvclhmJiBNYXRyaXhCYXNlPFZlY3RvclhmPjo6b3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2U8Q3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxmbG9hdD4sIFZlY3RvclhmLCBWZWN0b3JYZj4gPiAmIG90aGVyKTsKK1xlbmRjb2RlCitUaGlzIG9wZXJhdG9yPSBsaXRlcmFsbHkgcmVhZHMgImNvcHlpbmcgYSBzdW0gb2YgdHdvIFZlY3RvclhmJ3MgaW50byBhbm90aGVyIFZlY3RvclhmIi4KKworTGV0J3Mgbm93IGxvb2sgYXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgb3BlcmF0b3I9LiBJdCByZXNpZGVzIGluIHRoZSBmaWxlIHNyYy9Db3JlL0Fzc2lnbi5oLgorCitXaGF0IHdlIGNhbiBzZWUgdGhlcmUgaXM6CitcY29kZQordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBEZXJpdmVkJiBNYXRyaXhCYXNlPERlcml2ZWQ+CisgIDo6b3BlcmF0b3I9KGNvbnN0IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCit7CisgIHJldHVybiBpbnRlcm5hbDo6YXNzaWduX3NlbGVjdG9yPERlcml2ZWQsT3RoZXJEZXJpdmVkPjo6cnVuKGRlcml2ZWQoKSwgb3RoZXIuZGVyaXZlZCgpKTsKK30KK1xlbmRjb2RlCisKK09LIHNvIG91ciBuZXh0IHRhc2sgaXMgdG8gdW5kZXJzdGFuZCBpbnRlcm5hbDo6YXNzaWduX3NlbGVjdG9yIDopCisKK0hlcmUgaXMgaXRzIGRlY2xhcmF0aW9uIChhbGwgdGhhdCBpcyBzdGlsbCBpbiB0aGUgc2FtZSBmaWxlIHNyYy9Db3JlL0Fzc2lnbi5oKQorXGNvZGUKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZCwKKyAgICAgICAgIGJvb2wgRXZhbEJlZm9yZUFzc2lnbmluZyA9IGludChPdGhlckRlcml2ZWQ6OkZsYWdzKSAmIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQsCisgICAgICAgICBib29sIE5lZWRUb1RyYW5zcG9zZSA9IERlcml2ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZQorICAgICAgICAgICAgICAgICYmIE90aGVyRGVyaXZlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lCisgICAgICAgICAgICAgICAgJiYgaW50KERlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKSA9PSBpbnQoT3RoZXJEZXJpdmVkOjpDb2xzQXRDb21waWxlVGltZSkKKyAgICAgICAgICAgICAgICAmJiBpbnQoRGVyaXZlZDo6Q29sc0F0Q29tcGlsZVRpbWUpID09IGludChPdGhlckRlcml2ZWQ6OlJvd3NBdENvbXBpbGVUaW1lKQorICAgICAgICAgICAgICAgICYmIGludChEZXJpdmVkOjpTaXplQXRDb21waWxlVGltZSkgIT0gMT4KK3N0cnVjdCBpbnRlcm5hbDo6YXNzaWduX3NlbGVjdG9yOworXGVuZGNvZGUKKworU28gaW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvciB0YWtlcyA0IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGJ1dCB0aGUgMiBsYXN0IG9uZXMgYXJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBieSB0aGUgMiBmaXJzdCBvbmVzLgorCitFdmFsQmVmb3JlQXNzaWduaW5nIGlzIGhlcmUgdG8gZW5mb3JjZSB0aGUgRXZhbEJlZm9yZUFzc2lnbmluZ0JpdC4gQXMgZXhwbGFpbmVkIDxhIGhyZWY9IlRvcGljTGF6eUV2YWx1YXRpb24uaHRtbCI+aGVyZTwvYT4sIGNlcnRhaW4gZXhwcmVzc2lvbnMgaGF2ZSB0aGlzIGZsYWcgd2hpY2ggbWFrZXMgdGhlbSBhdXRvbWF0aWNhbGx5IGV2YWx1YXRlIGludG8gdGVtcG9yYXJpZXMgYmVmb3JlIGFzc2lnbmluZyB0aGVtIHRvIGFub3RoZXIgZXhwcmVzc2lvbi4gVGhpcyBpcyB0aGUgY2FzZSBvZiB0aGUgUHJvZHVjdCBleHByZXNzaW9uLCBpbiBvcmRlciB0byBhdm9pZCBzdHJhbmdlIGFsaWFzaW5nIGVmZmVjdHMgd2hlbiBkb2luZyAibSA9IG0gKiBtOyIgSG93ZXZlciwgb2YgY291cnNlIGhlcmUgb3VyIEN3aXNlQmluYXJ5T3AgZXhwcmVzc2lvbiBkb2Vzbid0IGhhdmUgdGhlIEV2YWxCZWZvcmVBc3NpZ25pbmdCaXQ6IHdlIHNhaWQgc2luY2UgdGhlIGJlZ2lubmluZyB0aGF0IHdlIGRpZG4ndCB3YW50IGEgdGVtcG9yYXJ5IHRvIGJlIGludHJvZHVjZWQgaGVyZS4gU28gaWYgeW91IGdvIHRvIHNyYy9Db3JlL0N3aXNlQmluYXJ5T3AuaCwgeW91J2xsIHNlZSB0aGF0IHRoZSBGbGFncyBpbiBpbnRlcm5hbDo6dHJhaXRzXDxDd2lzZUJpbmFyeU9wXD4gZG9uJ3QgaW5jbHVkZSB0aGUgRXZhbEJlZm9yZUFzc2lnbmluZ0JpdC4gVGhlIEZsYWdzIG1lbWJlciBvZiBDd2lzZUJpbmFyeU9wIGlzIHRoZW4gaW1wb3J0ZWQgZnJvbSB0aGUgaW50ZXJuYWw6OnRyYWl0cyBieSB0aGUgRUlHRU5fR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFIG1hY3JvLiBBbnl3YXksIGhlcmUgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBFdmFsQmVmb3JlQXNzaWduaW5nIGhhcyB0aGUgdmFsdWUgXGMgZmFsc2UuCisKK05lZWRUb1RyYW5zcG9zZSBpcyBoZXJlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciB3YW50cyB0byBjb3B5IGEgcm93LXZlY3RvciBpbnRvIGEgY29sdW1uLXZlY3Rvci4gV2UgYWxsb3cgdGhpcyBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBnZW5lcmFsIHJ1bGUgdGhhdCBpbiBhc3NpZ25tZW50cyB3ZSByZXF1aXJlIHRoZSBkaW1lc2lvbnMgdG8gbWF0Y2guIEFueXdheSwgaGVyZSBib3RoIHRoZSBsZWZ0LWhhbmQgYW5kIHJpZ2h0LWhhbmQgc2lkZXMgYXJlIGNvbHVtbiB2ZWN0b3JzLCBpbiB0aGUgc2Vuc2UgdGhhdCBDb2xzQXRDb21waWxlVGltZSBpcyBlcXVhbCB0byAxLiBTbyBOZWVkVG9UcmFuc3Bvc2UgaXMgXGMgZmFsc2UgdG9vLgorCitTbywgaGVyZSB3ZSBhcmUgaW4gdGhlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb246CitcY29kZQoraW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvcjxEZXJpdmVkLCBPdGhlckRlcml2ZWQsIGZhbHNlLCBmYWxzZT4KK1xlbmRjb2RlCisKK0hlcmUncyBob3cgaXQgaXMgZGVmaW5lZDoKK1xjb2RlCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CitzdHJ1Y3QgaW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvcjxEZXJpdmVkLE90aGVyRGVyaXZlZCxmYWxzZSxmYWxzZT4geworICBzdGF0aWMgRGVyaXZlZCYgcnVuKERlcml2ZWQmIGRzdCwgY29uc3QgT3RoZXJEZXJpdmVkJiBvdGhlcikgeyByZXR1cm4gZHN0LmxhenlBc3NpZ24ob3RoZXIuZGVyaXZlZCgpKTsgfQorfTsKK1xlbmRjb2RlCisKK09LIHNvIG5vdyBvdXIgbmV4dCBqb2IgaXMgdG8gdW5kZXJzdGFuZCBob3cgbGF6eUFzc2lnbiB3b3JrcyA6KQorCitcY29kZQordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2lubGluZSBEZXJpdmVkJiBNYXRyaXhCYXNlPERlcml2ZWQ+CisgIDo6bGF6eUFzc2lnbihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfTUFUUklYX1NJWkUoRGVyaXZlZCxPdGhlckRlcml2ZWQpCisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gb3RoZXIucm93cygpICYmIGNvbHMoKSA9PSBvdGhlci5jb2xzKCkpOworICBpbnRlcm5hbDo6YXNzaWduX2ltcGw8RGVyaXZlZCwgT3RoZXJEZXJpdmVkPjo6cnVuKGRlcml2ZWQoKSxvdGhlci5kZXJpdmVkKCkpOworICByZXR1cm4gZGVyaXZlZCgpOworfQorXGVuZGNvZGUKKworV2hhdCBkbyB3ZSBzZWUgaGVyZT8gU29tZSBhc3NlcnRpb25zLCBhbmQgdGhlbiB0aGUgb25seSBpbnRlcmVzdGluZyBsaW5lIGlzOgorXGNvZGUKKyAgaW50ZXJuYWw6OmFzc2lnbl9pbXBsPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OnJ1bihkZXJpdmVkKCksb3RoZXIuZGVyaXZlZCgpKTsKK1xlbmRjb2RlCisKK09LIHNvIG5vdyB3ZSB3YW50IHRvIGtub3cgd2hhdCBpcyBpbnNpZGUgaW50ZXJuYWw6OmFzc2lnbl9pbXBsLgorCitIZXJlIGlzIGl0cyBkZWNsYXJhdGlvbjoKK1xjb2RlCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDIsCisgICAgICAgICBpbnQgVmVjdG9yaXphdGlvbiA9IGludGVybmFsOjphc3NpZ25fdHJhaXRzPERlcml2ZWQxLCBEZXJpdmVkMj46OlZlY3Rvcml6YXRpb24sCisgICAgICAgICBpbnQgVW5yb2xsaW5nID0gaW50ZXJuYWw6OmFzc2lnbl90cmFpdHM8RGVyaXZlZDEsIERlcml2ZWQyPjo6VW5yb2xsaW5nPgorc3RydWN0IGludGVybmFsOjphc3NpZ25faW1wbDsKK1xlbmRjb2RlCitBZ2FpbiwgaW50ZXJuYWw6OmFzc2lnbl9zZWxlY3RvciB0YWtlcyA0IHRlbXBsYXRlIHBhcmFtZXRlcnMsIGJ1dCB0aGUgMiBsYXN0IG9uZXMgYXJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBieSB0aGUgMiBmaXJzdCBvbmVzLgorCitUaGVzZSB0d28gcGFyYW1ldGVycyBcYSBWZWN0b3JpemF0aW9uIGFuZCBcYSBVbnJvbGxpbmcgYXJlIGRldGVybWluZWQgYnkgYSBoZWxwZXIgY2xhc3MgaW50ZXJuYWw6OmFzc2lnbl90cmFpdHMuIEl0cyBqb2IgaXMgdG8gZGV0ZXJtaW5lIHdoaWNoIHZlY3Rvcml6YXRpb24gc3RyYXRlZ3kgdG8gdXNlICh0aGF0IGlzIFxhIFZlY3Rvcml6YXRpb24pIGFuZCB3aGljaCB1bnJvbGxpbmcgc3RyYXRlZ3kgdG8gdXNlICh0aGF0IGlzIFxhIFVucm9sbGluZykuCisKK1dlJ2xsIG5vdCBlbnRlciBpbnRvIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGVzZSBzdHJhdGVnaWVzIGFyZSBjaG9zZW4gKHRoaXMgaXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIGludGVybmFsOjphc3NpZ25fdHJhaXRzIGF0IHRoZSB0b3Agb2YgdGhlIHNhbWUgZmlsZSkuIExldCdzIGp1c3Qgc2F5IHRoYXQgaGVyZSBcYSBWZWN0b3JpemF0aW9uIGhhcyB0aGUgdmFsdWUgXGEgTGluZWFyVmVjdG9yaXphdGlvbiwgYW5kIFxhIFVucm9sbGluZyBoYXMgdGhlIHZhbHVlIFxhIE5vVW5yb2xsaW5nICh0aGUgbGF0dGVyIGlzIG9idmlvdXMgc2luY2Ugb3VyIHZlY3RvcnMgaGF2ZSBkeW5hbWljIHNpemUgc28gdGhlcmUncyBubyB3YXkgdG8gdW5yb2xsIHRoZSBsb29wIGF0IGNvbXBpbGUtdGltZSkuCisKK1NvIHRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIGludGVybmFsOjphc3NpZ25faW1wbCB0aGF0IHdlJ3JlIGxvb2tpbmcgYXQgaXM6CitcY29kZQoraW50ZXJuYWw6OmFzc2lnbl9pbXBsPERlcml2ZWQxLCBEZXJpdmVkMiwgTGluZWFyVmVjdG9yaXphdGlvbiwgTm9VbnJvbGxpbmc+CitcZW5kY29kZQorCitIZXJlIGlzIGhvdyBpdCdzIGRlZmluZWQ6CitcY29kZQordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgorc3RydWN0IGludGVybmFsOjphc3NpZ25faW1wbDxEZXJpdmVkMSwgRGVyaXZlZDIsIExpbmVhclZlY3Rvcml6YXRpb24sIE5vVW5yb2xsaW5nPgoreworICBzdGF0aWMgdm9pZCBydW4oRGVyaXZlZDEgJmRzdCwgY29uc3QgRGVyaXZlZDIgJnNyYykKKyAgeworICAgIGNvbnN0IGludCBzaXplID0gZHN0LnNpemUoKTsKKyAgICBjb25zdCBpbnQgcGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPHR5cGVuYW1lIERlcml2ZWQxOjpTY2FsYXI+OjpzaXplOworICAgIGNvbnN0IGludCBhbGlnbmVkU3RhcnQgPSBpbnRlcm5hbDo6YXNzaWduX3RyYWl0czxEZXJpdmVkMSxEZXJpdmVkMj46OkRzdElzQWxpZ25lZCA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50ZXJuYWw6OmZpcnN0X2FsaWduZWQoJmRzdC5jb2VmZlJlZigwKSwgc2l6ZSk7CisgICAgY29uc3QgaW50IGFsaWduZWRFbmQgPSBhbGlnbmVkU3RhcnQgKyAoKHNpemUtYWxpZ25lZFN0YXJ0KS9wYWNrZXRTaXplKSpwYWNrZXRTaXplOworCisgICAgZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgYWxpZ25lZFN0YXJ0OyBpbmRleCsrKQorICAgICAgZHN0LmNvcHlDb2VmZihpbmRleCwgc3JjKTsKKworICAgIGZvcihpbnQgaW5kZXggPSBhbGlnbmVkU3RhcnQ7IGluZGV4IDwgYWxpZ25lZEVuZDsgaW5kZXggKz0gcGFja2V0U2l6ZSkKKyAgICB7CisgICAgICBkc3QudGVtcGxhdGUgY29weVBhY2tldDxEZXJpdmVkMiwgQWxpZ25lZCwgaW50ZXJuYWw6OmFzc2lnbl90cmFpdHM8RGVyaXZlZDEsRGVyaXZlZDI+OjpTcmNBbGlnbm1lbnQ+KGluZGV4LCBzcmMpOworICAgIH0KKworICAgIGZvcihpbnQgaW5kZXggPSBhbGlnbmVkRW5kOyBpbmRleCA8IHNpemU7IGluZGV4KyspCisgICAgICBkc3QuY29weUNvZWZmKGluZGV4LCBzcmMpOworICB9Cit9OworXGVuZGNvZGUKKworSGVyZSdzIGhvdyBpdCB3b3Jrcy4gXGEgTGluZWFyVmVjdG9yaXphdGlvbiBtZWFucyB0aGF0IHRoZSBsZWZ0LWhhbmQgYW5kIHJpZ2h0LWhhbmQgc2lkZSBleHByZXNzaW9uIGNhbiBiZSBhY2Nlc3NlZCBsaW5lYXJseSBpLmUuIHlvdSBjYW4gcmVmZXIgdG8gdGhlaXIgY29lZmZpY2llbnRzIGJ5IG9uZSBpbnRlZ2VyIFxhIGluZGV4LCBhcyBvcHBvc2VkIHRvIGhhdmluZyB0byByZWZlciB0byBpdHMgY29lZmZpY2llbnRzIGJ5IHR3byBpbnRlZ2VycyBcYSByb3csIFxhIGNvbHVtbi4KKworQXMgd2Ugc2FpZCBhdCB0aGUgYmVnaW5uaW5nLCB2ZWN0b3JpemF0aW9uIHdvcmtzIHdpdGggYmxvY2tzIG9mIDQgZmxvYXRzLiBIZXJlLCBcYSBQYWNrZXRTaXplIGlzIDQuCisKK1RoZXJlIGFyZSB0d28gcG90ZW50aWFsIHByb2JsZW1zIHRoYXQgd2UgbmVlZCB0byBkZWFsIHdpdGg6CitcbGkgZmlyc3QsIHZlY3Rvcml6YXRpb24gd29ya3MgbXVjaCBiZXR0ZXIgaWYgdGhlIHBhY2tldHMgYXJlIDEyOC1iaXQtYWxpZ25lZC4gVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3Igd3JpdGUgYWNjZXNzLiBTbyB3aGVuIHdyaXRpbmcgdG8gdGhlIGNvZWZmaWNpZW50cyBvZiBcYSBkc3QsIHdlIHdhbnQgdG8gZ3JvdXAgdGhlc2UgY29lZmZpY2llbnRzIGJ5IHBhY2tldHMgb2YgNCBzdWNoIHRoYXQgZWFjaCBvZiB0aGVzZSBwYWNrZXRzIGlzIDEyOC1iaXQtYWxpZ25lZC4gSW4gZ2VuZXJhbCwgdGhpcyByZXF1aXJlcyB0byBza2lwIGEgZmV3IGNvZWZmaWNpZW50cyBhdCB0aGUgYmVnaW5uaW5nIG9mIFxhIGRzdC4gVGhpcyBpcyB0aGUgcHVycG9zZSBvZiBcYSBhbGlnbmVkU3RhcnQuIFdlIHRoZW4gY29weSB0aGVzZSBmaXJzdCBmZXcgY29lZmZpY2llbnRzIG9uZSBieSBvbmUsIG5vdCBieSBwYWNrZXRzLiBIb3dldmVyLCBpbiBvdXIgY2FzZSwgdGhlIFxhIGRzdCBleHByZXNzaW9uIGlzIGEgVmVjdG9yWGYgYW5kIHJlbWVtYmVyIHRoYXQgaW4gdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgdmVjdG9ycyB3ZSBhbGxvY2F0ZWQgYWxpZ25lZCBhcnJheXMuIFRoYW5rcyB0byBcYSBEc3RJc0FsaWduZWQsIEVpZ2VuIHJlbWVtYmVycyB0aGF0IHdpdGhvdXQgaGF2aW5nIHRvIGRvIGFueSBydW50aW1lIGNoZWNrLCBzbyBcYSBhbGlnbmVkU3RhcnQgaXMgemVybyBhbmQgdGhpcyBwYXJ0IGlzIGF2b2lkZWQgYWx0b2dldGhlci4KK1xsaSBzZWNvbmQsIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIHRvIGNvcHkgaXMgbm90IGluIGdlbmVyYWwgYSBtdWx0aXBsZSBvZiBcYSBwYWNrZXRTaXplLiBIZXJlLCB0aGVyZSBhcmUgNTAgY29lZmZpY2llbnRzIHRvIGNvcHkgYW5kIFxhIHBhY2tldFNpemUgaXMgNC4gU28gd2UnbGwgaGF2ZSB0byBjb3B5IHRoZSBsYXN0IDIgY29lZmZpY2llbnRzIG9uZSBieSBvbmUsIG5vdCBieSBwYWNrZXRzLiBIZXJlLCBcYSBhbGlnbmVkRW5kIGlzIDQ4LgorCitOb3cgY29tZSB0aGUgYWN0dWFsIGxvb3BzLgorCitGaXJzdCwgdGhlIHZlY3Rvcml6ZWQgcGFydDogdGhlIDQ4IGZpcnN0IGNvZWZmaWNpZW50cyBvdXQgb2YgNTAgd2lsbCBiZSBjb3BpZWQgYnkgcGFja2V0cyBvZiA0OgorXGNvZGUKKyAgZm9yKGludCBpbmRleCA9IGFsaWduZWRTdGFydDsgaW5kZXggPCBhbGlnbmVkRW5kOyBpbmRleCArPSBwYWNrZXRTaXplKQorICB7CisgICAgZHN0LnRlbXBsYXRlIGNvcHlQYWNrZXQ8RGVyaXZlZDIsIEFsaWduZWQsIGludGVybmFsOjphc3NpZ25fdHJhaXRzPERlcml2ZWQxLERlcml2ZWQyPjo6U3JjQWxpZ25tZW50PihpbmRleCwgc3JjKTsKKyAgfQorXGVuZGNvZGUKKworV2hhdCBpcyBjb3B5UGFja2V0PyBJdCBpcyBkZWZpbmVkIGluIHNyYy9Db3JlL0NvZWZmcy5oOgorXGNvZGUKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQsIGludCBTdG9yZU1vZGUsIGludCBMb2FkTW9kZT4KK2lubGluZSB2b2lkIE1hdHJpeEJhc2U8RGVyaXZlZD46OmNvcHlQYWNrZXQoaW50IGluZGV4LCBjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQoreworICBlaWdlbl9pbnRlcm5hbF9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNpemUoKSk7CisgIGRlcml2ZWQoKS50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KGluZGV4LAorICAgIG90aGVyLmRlcml2ZWQoKS50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4KSk7Cit9CitcZW5kY29kZQorCitPSywgd2hhdCBhcmUgd3JpdGVQYWNrZXQoKSBhbmQgcGFja2V0KCkgaGVyZT8KKworRmlyc3QsIHdyaXRlUGFja2V0KCkgaGVyZSBpcyBhIG1ldGhvZCBvbiB0aGUgbGVmdC1oYW5kIHNpZGUgVmVjdG9yWGYuIFNvIHdlIGdvIHRvIHNyYy9Db3JlL01hdHJpeC5oIHRvIGxvb2sgYXQgaXRzIGRlZmluaXRpb246CitcY29kZQordGVtcGxhdGU8aW50IFN0b3JlTW9kZT4KK2lubGluZSB2b2lkIHdyaXRlUGFja2V0KGludCBpbmRleCwgY29uc3QgUGFja2V0U2NhbGFyJiB4KQoreworICBpbnRlcm5hbDo6cHN0b3JldDxTY2FsYXIsIFBhY2tldFNjYWxhciwgU3RvcmVNb2RlPihtX3N0b3JhZ2UuZGF0YSgpICsgaW5kZXgsIHgpOworfQorXGVuZGNvZGUKK0hlcmUsIFxhIFN0b3JlTW9kZSBpcyBcYSAjQWxpZ25lZCwgaW5kaWNhdGluZyB0aGF0IHdlIGFyZSBkb2luZyBhIDEyOC1iaXQtYWxpZ25lZCB3cml0ZSBhY2Nlc3MsIFxhIFBhY2tldFNjYWxhciBpcyBhIHR5cGUgcmVwcmVzZW50aW5nIGEgIlNTRSBwYWNrZXQgb2YgNCBmbG9hdHMiIGFuZCBpbnRlcm5hbDo6cHN0b3JldCBpcyBhIGZ1bmN0aW9uIHdyaXRpbmcgc3VjaCBhIHBhY2tldCBpbiBtZW1vcnkuIFRoZWlyIGRlZmluaXRpb25zIGFyZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMsIHdlIGZpbmQgdGhlbSBpbiBzcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmg6CisKK1RoZSBsaW5lIGluIHNyYy9Db3JlL2FyY2gvU1NFL1BhY2tldE1hdGguaCB0aGF0IGRldGVybWluZXMgdGhlIFBhY2tldFNjYWxhciB0eXBlICh2aWEgYSB0eXBlZGVmIGluIE1hdHJpeC5oKSBpczoKK1xjb2RlCit0ZW1wbGF0ZTw+IHN0cnVjdCBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxmbG9hdD4gIHsgdHlwZWRlZiBfX20xMjggIHR5cGU7IGVudW0ge3NpemU9NH07IH07CitcZW5kY29kZQorSGVyZSwgX19tMTI4IGlzIGEgU1NFLXNwZWNpZmljIHR5cGUuIE5vdGljZSB0aGF0IHRoZSBlbnVtIFxhIHNpemUgaGVyZSBpcyB3aGF0IHdhcyB1c2VkIHRvIGRlZmluZSBcYSBwYWNrZXRTaXplIGFib3ZlLgorCitBbmQgaGVyZSBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJuYWw6OnBzdG9yZXQ6CitcY29kZQordGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBpbnRlcm5hbDo6cHN0b3JlKGZsb2F0KiAgdG8sIGNvbnN0IF9fbTEyOCYgIGZyb20pIHsgX21tX3N0b3JlX3BzKHRvLCBmcm9tKTsgfQorXGVuZGNvZGUKK0hlcmUsIF9fbW1fc3RvcmVfcHMgaXMgYSBTU0Utc3BlY2lmaWMgaW50cmluc2ljIGZ1bmN0aW9uLCByZXByZXNlbnRpbmcgYSBzaW5nbGUgU1NFIGluc3RydWN0aW9uLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGludGVybmFsOjpwc3RvcmUgYW5kIGludGVybmFsOjpwc3RvcmV0IGlzIHRoYXQgaW50ZXJuYWw6OnBzdG9yZXQgaXMgYSBkaXNwYXRjaGVyIGhhbmRsaW5nIGJvdGggdGhlIGFsaWduZWQgYW5kIHVuYWxpZ25lZCBjYXNlcywgeW91IGZpbmQgaXRzIGRlZmluaXRpb24gaW4gc3JjL0NvcmUvR2VuZXJpY1BhY2tldE1hdGguaDoKK1xjb2RlCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldCwgaW50IExvYWRNb2RlPgoraW5saW5lIHZvaWQgaW50ZXJuYWw6OnBzdG9yZXQoU2NhbGFyKiB0bywgY29uc3QgUGFja2V0JiBmcm9tKQoreworICBpZihMb2FkTW9kZSA9PSBBbGlnbmVkKQorICAgIGludGVybmFsOjpwc3RvcmUodG8sIGZyb20pOworICBlbHNlCisgICAgaW50ZXJuYWw6OnBzdG9yZXUodG8sIGZyb20pOworfQorXGVuZGNvZGUKKworT0ssIHRoYXQgZXhwbGFpbnMgaG93IHdyaXRlUGFja2V0KCkgd29ya3MuIE5vdyBsZXQncyBsb29rIGludG8gdGhlIHBhY2tldCgpIGNhbGwuIFJlbWVtYmVyIHRoYXQgd2UgYXJlIGFuYWx5emluZyB0aGlzIGxpbmUgb2YgY29kZSBpbnNpZGUgY29weVBhY2tldCgpOgorXGNvZGUKK2Rlcml2ZWQoKS50ZW1wbGF0ZSB3cml0ZVBhY2tldDxTdG9yZU1vZGU+KGluZGV4LAorICAgIG90aGVyLmRlcml2ZWQoKS50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4KSk7CitcZW5kY29kZQorCitIZXJlLCBcYSBvdGhlciBpcyBvdXIgc3VtIGV4cHJlc3Npb24gXGEgdiArIFxhIHcuIFRoZSAuZGVyaXZlZCgpIGlzIGp1c3QgY2FzdGluZyBmcm9tIE1hdHJpeEJhc2UgdG8gdGhlIHN1YmNsYXNzIHdoaWNoIGhlcmUgaXMgQ3dpc2VCaW5hcnlPcC4gU28gbGV0J3MgZ28gdG8gc3JjL0NvcmUvQ3dpc2VCaW5hcnlPcC5oOgorXGNvZGUKK2NsYXNzIEN3aXNlQmluYXJ5T3AKK3sKKyAgLy8gLi4uCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBQYWNrZXRTY2FsYXIgcGFja2V0KGludCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV9mdW5jdG9yLnBhY2tldE9wKG1fbGhzLnRlbXBsYXRlIHBhY2tldDxMb2FkTW9kZT4oaW5kZXgpLCBtX3Jocy50ZW1wbGF0ZSBwYWNrZXQ8TG9hZE1vZGU+KGluZGV4KSk7CisgICAgfQorfTsKK1xlbmRjb2RlCitIZXJlLCBcYSBtX2xocyBpcyB0aGUgdmVjdG9yIFxhIHYsIGFuZCBcYSBtX3JocyBpcyB0aGUgdmVjdG9yIFxhIHcuIFNvIHRoZSBwYWNrZXQoKSBmdW5jdGlvbiBoZXJlIGlzIE1hdHJpeDo6cGFja2V0KCkuIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGEgTG9hZE1vZGUgaXMgXGEgI0FsaWduZWQuIFNvIHdlJ3JlIGxvb2tpbmcgYXQKK1xjb2RlCitjbGFzcyBNYXRyaXgKK3sKKyAgLy8gLi4uCisgICAgdGVtcGxhdGU8aW50IExvYWRNb2RlPgorICAgIGlubGluZSBQYWNrZXRTY2FsYXIgcGFja2V0KGludCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkdDxTY2FsYXIsIExvYWRNb2RlPihtX3N0b3JhZ2UuZGF0YSgpICsgaW5kZXgpOworICAgIH0KK307CitcZW5kY29kZQorV2UgbGV0IHlvdSBsb29rIHVwIHRoZSBkZWZpbml0aW9uIG9mIGludGVybmFsOjpwbG9hZHQgaW4gR2VuZXJpY1BhY2tldE1hdGguaCBhbmQgdGhlIGludGVybmFsOjpwbG9hZCBpbiBzcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmguIEl0IGlzIHZlcnkgc2ltaWxhciB0byB0aGUgYWJvdmUgZm9yIGludGVybmFsOjpwc3RvcmUuCisKK0xldCdzIGdvIGJhY2sgdG8gQ3dpc2VCaW5hcnlPcDo6cGFja2V0KCkuIE9uY2UgdGhlIHBhY2tldHMgZnJvbSB0aGUgdmVjdG9ycyBcYSB2IGFuZCBcYSB3IGhhdmUgYmVlbiByZXR1cm5lZCwgd2hhdCBkb2VzIHRoaXMgZnVuY3Rpb24gZG8/IEl0IGNhbGxzIG1fZnVuY3Rvci5wYWNrZXRPcCgpIG9uIHRoZW0uIFdoYXQgaXMgbV9mdW5jdG9yPyBIZXJlIHdlIG11c3QgcmVtZW1iZXIgd2hhdCBwYXJ0aWN1bGFyIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9mIEN3aXNlQmluYXJ5T3Agd2UncmUgZGVhbGluZyB3aXRoOgorXGNvZGUKK0N3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8ZmxvYXQ+LCBWZWN0b3JYZiwgVmVjdG9yWGY+CitcZW5kY29kZQorU28gbV9mdW5jdG9yIGlzIGFuIG9iamVjdCBvZiB0aGUgZW1wdHkgY2xhc3MgaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8ZmxvYXQ+LiBBcyB3ZSBtZW50aW9uZWQgYWJvdmUsIGRvbid0IHdvcnJ5IGFib3V0IHdoeSB3ZSBjb25zdHJ1Y3RlZCBhbiBvYmplY3Qgb2YgdGhpcyBlbXB0eSBjbGFzcyBhdCBhbGwgLS0gaXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHRoZSBwb2ludCBpcyB0aGF0IHNvbWUgb3RoZXIgZnVuY3RvcnMgbmVlZCB0byBzdG9yZSBtZW1iZXIgZGF0YS4KKworQW55d2F5LCBpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcCBpcyBkZWZpbmVkIGluIHNyYy9Db3JlL0Z1bmN0b3JzLmg6CitcY29kZQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3AgRUlHRU5fRU1QVFlfU1RSVUNUIHsKKyAgaW5saW5lIGNvbnN0IFNjYWxhciBvcGVyYXRvcigpIChjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYikgY29uc3QgeyByZXR1cm4gYSArIGI7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0U2NhbGFyPgorICBpbmxpbmUgY29uc3QgUGFja2V0U2NhbGFyIHBhY2tldE9wKGNvbnN0IFBhY2tldFNjYWxhciYgYSwgY29uc3QgUGFja2V0U2NhbGFyJiBiKSBjb25zdAorICB7IHJldHVybiBpbnRlcm5hbDo6cGFkZChhLGIpOyB9Cit9OworXGVuZGNvZGUKK0FzIHlvdSBjYW4gc2VlLCBhbGwgd2hhdCBwYWNrZXRPcCgpIGRvZXMgaXMgdG8gY2FsbCBpbnRlcm5hbDo6cGFkZCBvbiB0aGUgdHdvIHBhY2tldHMuIEhlcmUgaXMgdGhlIGRlZmluaXRpb24gb2YgaW50ZXJuYWw6OnBhZGQgZnJvbSBzcmMvQ29yZS9hcmNoL1NTRS9QYWNrZXRNYXRoLmg6CitcY29kZQordGVtcGxhdGU8PiBpbmxpbmUgX19tMTI4ICBpbnRlcm5hbDo6cGFkZChjb25zdCBfX20xMjgmICBhLCBjb25zdCBfX20xMjgmICBiKSB7IHJldHVybiBfbW1fYWRkX3BzKGEsYik7IH0KK1xlbmRjb2RlCitIZXJlLCBfbW1fYWRkX3BzIGlzIGEgU1NFLXNwZWNpZmljIGludHJpbnNpYyBmdW5jdGlvbiwgcmVwcmVzZW50aW5nIGEgc2luZ2xlIFNTRSBpbnN0cnVjdGlvbi4KKworVG8gc3VtbWFyaXplLCB0aGUgbG9vcAorXGNvZGUKKyAgZm9yKGludCBpbmRleCA9IGFsaWduZWRTdGFydDsgaW5kZXggPCBhbGlnbmVkRW5kOyBpbmRleCArPSBwYWNrZXRTaXplKQorICB7CisgICAgZHN0LnRlbXBsYXRlIGNvcHlQYWNrZXQ8RGVyaXZlZDIsIEFsaWduZWQsIGludGVybmFsOjphc3NpZ25fdHJhaXRzPERlcml2ZWQxLERlcml2ZWQyPjo6U3JjQWxpZ25tZW50PihpbmRleCwgc3JjKTsKKyAgfQorXGVuZGNvZGUKK2hhcyBiZWVuIGNvbXBpbGVkIHRvIHRoZSBmb2xsb3dpbmcgY29kZTogZm9yIFxhIGluZGV4IGdvaW5nIGZyb20gMCB0byB0aGUgMTEgKCA9IDQ4LzQgLSAxKSwgcmVhZCB0aGUgaS10aCBwYWNrZXQgKG9mIDQgZmxvYXRzKSBmcm9tIHRoZSB2ZWN0b3IgdiBhbmQgdGhlIGktdGggcGFja2V0IGZyb20gdGhlIHZlY3RvciB3IHVzaW5nIHR3byBfX21tX2xvYWRfcHMgU1NFIGluc3RydWN0aW9ucywgdGhlbiBhZGQgdGhlbSB0b2dldGhlciB1c2luZyBhIF9fbW1fYWRkX3BzIGluc3RydWN0aW9uLCB0aGVuIHN0b3JlIHRoZSByZXN1bHQgdXNpbmcgYSBfX21tX3N0b3JlX3BzIGluc3RydWN0aW9uLgorCitUaGVyZSByZW1haW5zIHRoZSBzZWNvbmQgbG9vcCBoYW5kbGluZyB0aGUgbGFzdCBmZXcgKGhlcmUsIHRoZSBsYXN0IDIpIGNvZWZmaWNpZW50czoKK1xjb2RlCisgIGZvcihpbnQgaW5kZXggPSBhbGlnbmVkRW5kOyBpbmRleCA8IHNpemU7IGluZGV4KyspCisgICAgZHN0LmNvcHlDb2VmZihpbmRleCwgc3JjKTsKK1xlbmRjb2RlCitIb3dldmVyLCBpdCB3b3JrcyBqdXN0IGxpa2UgdGhlIG9uZSB3ZSBqdXN0IGV4cGxhaW5lZCwgaXQgaXMganVzdCBzaW1wbGVyIGJlY2F1c2UgdGhlcmUgaXMgbm8gU1NFIHZlY3Rvcml6YXRpb24gaW52b2x2ZWQgaGVyZS4gY29weVBhY2tldCgpIGJlY29tZXMgY29weUNvZWZmKCksIHBhY2tldCgpIGJlY29tZXMgY29lZmYoKSwgd3JpdGVQYWNrZXQoKSBiZWNvbWVzIGNvZWZmUmVmKCkuIElmIHlvdSBmb2xsb3dlZCB1cyB0aGlzIGZhciwgeW91IGNhbiBwcm9iYWJseSB1bmRlcnN0YW5kIHRoaXMgcGFydCBieSB5b3Vyc2VsZi4KKworV2Ugc2VlIHRoYXQgYWxsIHRoZSBDKysgYWJzdHJhY3Rpb24gb2YgRWlnZW4gZ29lcyBhd2F5IGR1cmluZyBjb21waWxhdGlvbiBhbmQgdGhhdCB3ZSBpbmRlZWQgYXJlIHByZWNpc2VseSBjb250cm9sbGluZyB3aGljaCBhc3NlbWJseSBpbnN0cnVjdGlvbnMgd2UgZW1pdC4gU3VjaCBpcyB0aGUgYmVhdXR5IG9mIEMrKyEgU2luY2Ugd2UgaGF2ZSBzdWNoIHByZWNpc2UgY29udHJvbCBvdmVyIHRoZSBlbWl0dGVkIGFzc2VtYmx5IGluc3RydWN0aW9ucywgYnV0IHN1Y2ggY29tcGxleCBsb2dpYyB0byBjaG9vc2UgdGhlIHJpZ2h0IGluc3RydWN0aW9ucywgd2UgY2FuIHNheSB0aGF0IEVpZ2VuIHJlYWxseSBiZWhhdmVzIGxpa2UgYW4gb3B0aW1pemluZyBjb21waWxlci4gSWYgeW91IHByZWZlciwgeW91IGNvdWxkIHNheSB0aGF0IEVpZ2VuIGJlaGF2ZXMgbGlrZSBhIHNjcmlwdCBmb3IgdGhlIGNvbXBpbGVyLiBJbiBhIHNlbnNlLCBDKysgdGVtcGxhdGUgbWV0YXByb2dyYW1taW5nIGlzIHNjcmlwdGluZyB0aGUgY29tcGlsZXIgLS0gYW5kIGl0J3MgYmVlbiBzaG93biB0aGF0IHRoaXMgc2NyaXB0aW5nIGxhbmd1YWdlIGlzIFR1cmluZy1jb21wbGV0ZS4gU2VlIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGVtcGxhdGVfbWV0YXByb2dyYW1taW5nIj4gV2lraXBlZGlhPC9hPi4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0kwNV9GaXhlZFNpemVWZWN0b3JpemFibGUuZG94IGIvZG9jL0kwNV9GaXhlZFNpemVWZWN0b3JpemFibGUuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmVhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSTA1X0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZS5kb3gKQEAgLTAsMCArMSwzOCBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljRml4ZWRTaXplVmVjdG9yaXphYmxlIEZpeGVkLXNpemUgdmVjdG9yaXphYmxlIEVpZ2VuIG9iamVjdHMKKworVGhlIGdvYWwgb2YgdGhpcyBwYWdlIGlzIHRvIGV4cGxhaW4gd2hhdCB3ZSBtZWFuIGJ5ICJmaXhlZC1zaXplIHZlY3Rvcml6YWJsZSIuCisKK1xzZWN0aW9uIHN1bW1hcnkgRXhlY3V0aXZlIFN1bW1hcnkKKworQW4gRWlnZW4gb2JqZWN0IGlzIGNhbGxlZCAiZml4ZWQtc2l6ZSB2ZWN0b3JpemFibGUiIGlmIGl0IGhhcyBmaXhlZCBzaXplIGFuZCB0aGF0IHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNiBieXRlcy4KKworRXhhbXBsZXMgaW5jbHVkZToKK1xsaSBFaWdlbjo6VmVjdG9yMmQKK1xsaSBFaWdlbjo6VmVjdG9yNGQKK1xsaSBFaWdlbjo6VmVjdG9yNGYKK1xsaSBFaWdlbjo6TWF0cml4MmQKK1xsaSBFaWdlbjo6TWF0cml4MmYKK1xsaSBFaWdlbjo6TWF0cml4NGQKK1xsaSBFaWdlbjo6TWF0cml4NGYKK1xsaSBFaWdlbjo6QWZmaW5lM2QKK1xsaSBFaWdlbjo6QWZmaW5lM2YKK1xsaSBFaWdlbjo6UXVhdGVybmlvbmQKK1xsaSBFaWdlbjo6UXVhdGVybmlvbmYKKworXHNlY3Rpb24gZXhwbGFuYXRpb24gRXhwbGFuYXRpb24KKworRmlyc3QsICJmaXhlZC1zaXplIiBzaG91bGQgYmUgY2xlYXI6IGFuIEVpZ2VuIG9iamVjdCBoYXMgZml4ZWQgc2l6ZSBpZiBpdHMgbnVtYmVyIG9mIHJvd3MgYW5kIGl0cyBudW1iZXIgb2YgY29sdW1ucyBhcmUgZml4ZWQgYXQgY29tcGlsZS10aW1lLiBTbyBmb3IgZXhhbXBsZSBNYXRyaXgzZiBoYXMgZml4ZWQgc2l6ZSwgYnV0IE1hdHJpeFhmIGRvZXNuJ3QgKHRoZSBvcHBvc2l0ZSBvZiBmaXhlZC1zaXplIGlzIGR5bmFtaWMtc2l6ZSkuCisKK1RoZSBhcnJheSBvZiBjb2VmZmljaWVudHMgb2YgYSBmaXhlZC1zaXplIEVpZ2VuIG9iamVjdCBpcyBhIHBsYWluICJzdGF0aWMgYXJyYXkiLCBpdCBpcyBub3QgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiBGb3IgZXhhbXBsZSwgdGhlIGRhdGEgYmVoaW5kIGEgTWF0cml4NGYgaXMganVzdCBhICJmbG9hdCBhcnJheVsxNl0iLgorCitGaXhlZC1zaXplIG9iamVjdHMgYXJlIHR5cGljYWxseSB2ZXJ5IHNtYWxsLCB3aGljaCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gaGFuZGxlIHRoZW0gd2l0aCB6ZXJvIHJ1bnRpbWUgb3ZlcmhlYWQgLS0gYm90aCBpbiB0ZXJtcyBvZiBtZW1vcnkgdXNhZ2UgYW5kIG9mIHNwZWVkLgorCitOb3csIHZlY3Rvcml6YXRpb24gKGJvdGggU1NFIGFuZCBBbHRpVmVjKSB3b3JrcyB3aXRoIDEyOC1iaXQgcGFja2V0cy4gTW9yZW92ZXIsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGVzZSBwYWNrZXRzIG5lZWQgdG8gYmUgaGF2ZSAxMjgtYml0IGFsaWdubWVudC4KKworU28gaXQgdHVybnMgb3V0IHRoYXQgdGhlIG9ubHkgd2F5IHRoYXQgZml4ZWQtc2l6ZSBFaWdlbiBvYmplY3RzIGNhbiBiZSB2ZWN0b3JpemVkLCBpcyBpZiB0aGVpciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTI4IGJpdHMsIG9yIDE2IGJ5dGVzLiBFaWdlbiB3aWxsIHRoZW4gcmVxdWVzdCAxNi1ieXRlIGFsaWdubWVudCBmb3IgdGhlc2Ugb2JqZWN0cywgYW5kIGhlbmNlZm9ydGggcmVseSBvbiB0aGVzZSBvYmplY3RzIGJlaW5nIGFsaWduZWQgc28gbm8gcnVudGltZSBjaGVjayBmb3IgYWxpZ25tZW50IGlzIHBlcmZvcm1lZC4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0kwNl9Ub3BpY0VpZ2VuRXhwcmVzc2lvblRlbXBsYXRlcy5kb3ggYi9kb2MvSTA2X1RvcGljRWlnZW5FeHByZXNzaW9uVGVtcGxhdGVzLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFmZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0kwNl9Ub3BpY0VpZ2VuRXhwcmVzc2lvblRlbXBsYXRlcy5kb3gKQEAgLTAsMCArMSwxMiBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljRWlnZW5FeHByZXNzaW9uVGVtcGxhdGVzIEV4cHJlc3Npb24gdGVtcGxhdGVzIGluIEVpZ2VuCisKKworVE9ETzogd3JpdGUgdGhpcyBkb3ggcGFnZSEKKworSXMgbGlua2VkIGZyb20gdGhlIHR1dG9yaWFsIG9uIGFyaXRobWV0aWMgb3BzLgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvSTA3X1RvcGljU2NhbGFyVHlwZXMuZG94IGIvZG9jL0kwN19Ub3BpY1NjYWxhclR5cGVzLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmYwM2MxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0kwN19Ub3BpY1NjYWxhclR5cGVzLmRveApAQCAtMCwwICsxLDEyIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNTY2FsYXJUeXBlcyBTY2FsYXIgdHlwZXMKKworCitUT0RPOiB3cml0ZSB0aGlzIGRveCBwYWdlIQorCitJcyBsaW5rZWQgZnJvbSB0aGUgdHV0b3JpYWwgb24gdGhlIE1hdHJpeCBjbGFzcy4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL0kwOF9SZXNpemluZy5kb3ggYi9kb2MvSTA4X1Jlc2l6aW5nLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzIzZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL0kwOF9SZXNpemluZy5kb3gKQEAgLTAsMCArMSwxMSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljUmVzaXppbmcgUmVzaXppbmcKKworCitUT0RPOiB3cml0ZSB0aGlzIGRveCBwYWdlIQorCitJcyBsaW5rZWQgZnJvbSB0aGUgdHV0b3JpYWwgb24gdGhlIE1hdHJpeCBjbGFzcy4KKworKi8KK30KZGlmZiAtLWdpdCBhL2RvYy9JMDlfVmVjdG9yaXphdGlvbi5kb3ggYi9kb2MvSTA5X1ZlY3Rvcml6YXRpb24uZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NGQwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSTA5X1ZlY3Rvcml6YXRpb24uZG94CkBAIC0wLDAgKzEsOSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljVmVjdG9yaXphdGlvbiBWZWN0b3JpemF0aW9uCisKKworVE9ETzogd3JpdGUgdGhpcyBkb3ggcGFnZSEKKworKi8KK30KZGlmZiAtLWdpdCBhL2RvYy9JMTBfQXNzZXJ0aW9ucy5kb3ggYi9kb2MvSTEwX0Fzc2VydGlvbnMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Njk3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSTEwX0Fzc2VydGlvbnMuZG94CkBAIC0wLDAgKzEsMTMgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY0Fzc2VydGlvbnMgQXNzZXJ0aW9ucworCisKK1RPRE86IHdyaXRlIHRoaXMgZG94IHBhZ2UhCisKK0lzIGxpbmtlZCBmcm9tIHRoZSB0dXRvcmlhbCBvbiBtYXRyaXggYXJpdGhtZXRpYy4KKworXHNhIFNlY3Rpb24gXHJlZiBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXNBc3NlcnRpb25zIG9uIHBhZ2UgXHJlZiBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXMuCisKKyovCit9CmRpZmYgLS1naXQgYS9kb2MvSTExX0FsaWFzaW5nLmRveCBiL2RvYy9JMTFfQWxpYXNpbmcuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTExOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSTExX0FsaWFzaW5nLmRveApAQCAtMCwwICsxLDIxNCBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljQWxpYXNpbmcgQWxpYXNpbmcKKworSW4gRWlnZW4sIGFsaWFzaW5nIHJlZmVycyB0byBhc3NpZ25tZW50IHN0YXRlbWVudCBpbiB3aGljaCB0aGUgc2FtZSBtYXRyaXggKG9yIGFycmF5IG9yIHZlY3RvcikgYXBwZWFycyBvbiB0aGUKK2xlZnQgYW5kIG9uIHRoZSByaWdodCBvZiB0aGUgYXNzaWdubWVudCBvcGVyYXRvcnMuIFN0YXRlbWVudHMgbGlrZSA8dHQ+bWF0ID0gMiAqIG1hdDs8L3R0PiBvciA8dHQ+bWF0ID0KK21hdC50cmFuc3Bvc2UoKTs8L3R0PiBleGhpYml0IGFsaWFzaW5nLiBUaGUgYWxpYXNpbmcgaW4gdGhlIGZpcnN0IGV4YW1wbGUgaXMgaGFybWxlc3MsIGJ1dCB0aGUgYWxpYXNpbmcgaW4gdGhlCitzZWNvbmQgZXhhbXBsZSBsZWFkcyB0byB1bmV4cGVjdGVkIHJlc3VsdHMuIFRoaXMgcGFnZSBleHBsYWlucyB3aGF0IGFsaWFzaW5nIGlzLCB3aGVuIGl0IGlzIGhhcm1mdWwsIGFuZCB3aGF0Cit0byBkbyBhYm91dCBpdC4KKworPGI+VGFibGUgb2YgY29udGVudHM8L2I+CisgIC0gXHJlZiBUb3BpY0FsaWFzaW5nRXhhbXBsZXMKKyAgLSBccmVmIFRvcGljQWxpYXNpbmdTb2x1dGlvbgorICAtIFxyZWYgVG9waWNBbGlhc2luZ0N3aXNlCisgIC0gXHJlZiBUb3BpY0FsaWFzaW5nTWF0cml4TXVsdAorICAtIFxyZWYgVG9waWNBbGlhc2luZ1N1bW1hcnkKKworCitcc2VjdGlvbiBUb3BpY0FsaWFzaW5nRXhhbXBsZXMgRXhhbXBsZXMKKworSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIGV4aGliaXRpbmcgYWxpYXNpbmc6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVG9waWNBbGlhc2luZ19ibG9jay5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVG9waWNBbGlhc2luZ19ibG9jay5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGUgb3V0cHV0IGlzIG5vdCB3aGF0IG9uZSB3b3VsZCBleHBlY3QuIFRoZSBwcm9ibGVtIGlzIHRoZSBhc3NpZ25tZW50CitcY29kZQorbWF0LmJvdHRvbVJpZ2h0Q29ybmVyKDIsMikgPSBtYXQudG9wTGVmdENvcm5lcigyLDIpOworXGVuZGNvZGUKK1RoaXMgYXNzaWdubWVudCBleGhpYml0cyBhbGlhc2luZzogdGhlIGNvZWZmaWNpZW50IFxjIG1hdCgxLDEpIGFwcGVhcnMgYm90aCBpbiB0aGUgYmxvY2sKKzx0dD5tYXQuYm90dG9tUmlnaHRDb3JuZXIoMiwyKTwvdHQ+IG9uIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgYXNzaWdubWVudCBhbmQgdGhlIGJsb2NrCis8dHQ+bWF0LnRvcExlZnRDb3JuZXIoMiwyKTwvdHQ+IG9uIHRoZSByaWdodC1oYW5kIHNpZGUuIEFmdGVyIHRoZSBhc3NpZ25tZW50LCB0aGUgKDIsMikgZW50cnkgaW4gdGhlIGJvdHRvbQorcmlnaHQgY29ybmVyIHNob3VsZCBoYXZlIHRoZSB2YWx1ZSBvZiBcYyBtYXQoMSwxKSBiZWZvcmUgdGhlIGFzc2lnbm1lbnQsIHdoaWNoIGlzIDUuIEhvd2V2ZXIsIHRoZSBvdXRwdXQgc2hvd3MKK3RoYXQgXGMgbWF0KDIsMikgaXMgYWN0dWFsbHkgMS4gVGhlIHByb2JsZW0gaXMgdGhhdCBFaWdlbiB1c2VzIGxhenkgZXZhbHVhdGlvbiAoc2VlIAorXHJlZiBUb3BpY0VpZ2VuRXhwcmVzc2lvblRlbXBsYXRlcykgZm9yIDx0dD5tYXQudG9wTGVmdENvcm5lcigyLDIpPC90dD4uIFRoZSByZXN1bHQgaXMgc2ltaWxhciB0bworXGNvZGUKK21hdCgxLDEpID0gbWF0KDAsMCk7CittYXQoMSwyKSA9IG1hdCgwLDEpOworbWF0KDIsMSkgPSBtYXQoMSwwKTsKK21hdCgyLDIpID0gbWF0KDEsMSk7CitcZW5kY29kZQorVGh1cywgXGMgbWF0KDIsMikgaXMgYXNzaWduZWQgdGhlIFxlIG5ldyB2YWx1ZSBvZiBcYyBtYXQoMSwxKSBpbnN0ZWFkIG9mIHRoZSBvbGQgdmFsdWUuIFRoZSBuZXh0IHNlY3Rpb24KK2V4cGxhaW5zIGhvdyB0byBzb2x2ZSB0aGlzIHByb2JsZW0gYnkgY2FsbGluZyBcbGluayBEZW5zZUJhc2U6OmV2YWwoKSBldmFsKClcZW5kbGluay4KKworTm90ZSB0aGF0IGlmIFxjIG1hdCB3ZXJlIGEgYmlnZ2VyLCB0aGVuIHRoZSBibG9ja3Mgd291bGQgbm90IG92ZXJsYXAsIGFuZCB0aGVyZSB3b3VsZCBiZSBubyBhbGlhc2luZworcHJvYmxlbS4gVGhpcyBtZWFucyB0aGF0IGluIGdlbmVyYWwgYWxpYXNpbmcgY2Fubm90IGJlIGRldGVjdGVkIGF0IGNvbXBpbGUgdGltZS4gSG93ZXZlciwgRWlnZW4gZG9lcyBkZXRlY3QKK3NvbWUgaW5zdGFuY2VzIG9mIGFsaWFzaW5nLCBhbGJlaXQgYXQgcnVuIHRpbWUuICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZXhoaWJpdGluZyBhbGlhc2luZyB3YXMgbWVudGlvbmVkIGluCitccmVmIFR1dG9yaWFsTWF0cml4QXJpdGhtZXRpYyA6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2FsaWFzaW5nLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSB0dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfYWxpYXNpbmcub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworQWdhaW4sIHRoZSBvdXRwdXQgc2hvd3MgdGhlIGFsaWFzaW5nIGlzc3VlLiBIb3dldmVyLCBieSBkZWZhdWx0IEVpZ2VuIHVzZXMgYSBydW4tdGltZSBhc3NlcnRpb24gdG8gZGV0ZWN0IHRoaXMKK2FuZCBleGl0cyB3aXRoIGEgbWVzc2FnZSBsaWtlCisKK1x2ZXJiYXRpbQordm9pZCBFaWdlbjo6RGVuc2VCYXNlPERlcml2ZWQ+OjpjaGVja1RyYW5zcG9zZUFsaWFzaW5nKGNvbnN0IE90aGVyRGVyaXZlZCYpIGNvbnN0IAorW3dpdGggT3RoZXJEZXJpdmVkID0gRWlnZW46OlRyYW5zcG9zZTxFaWdlbjo6TWF0cml4PGludCwgMiwgMiwgMCwgMiwgMj4gPiwgRGVyaXZlZCA9IEVpZ2VuOjpNYXRyaXg8aW50LCAyLCAyLCAwLCAyLCAyPl06IAorQXNzZXJ0aW9uIGAoIWludGVybmFsOjpjaGVja190cmFuc3Bvc2VfYWxpYXNpbmdfc2VsZWN0b3I8U2NhbGFyLGludGVybmFsOjpibGFzX3RyYWl0czxEZXJpdmVkPjo6SXNUcmFuc3Bvc2VkLE90aGVyRGVyaXZlZD46OnJ1bihpbnRlcm5hbDo6ZXh0cmFjdF9kYXRhKGRlcml2ZWQoKSksIG90aGVyKSkgCismJiAiYWxpYXNpbmcgZGV0ZWN0ZWQgZHVyaW5nIHRyYW5wb3NpdGlvbiwgdXNlIHRyYW5zcG9zZUluUGxhY2UoKSBvciBldmFsdWF0ZSB0aGUgcmhzIGludG8gYSB0ZW1wb3JhcnkgdXNpbmcgLmV2YWwoKSInIGZhaWxlZC4KK1xlbmR2ZXJiYXRpbQorCitUaGUgdXNlciBjYW4gdHVybiBFaWdlbidzIHJ1bi10aW1lIGFzc2VydGlvbnMgbGlrZSB0aGUgb25lIHRvIGRldGVjdCB0aGlzIGFsaWFzaW5nIHByb2JsZW0gb2ZmIGJ5IGRlZmluaW5nIHRoZQorRUlHRU5fTk9fREVCVUcgbWFjcm8sIGFuZCB0aGUgYWJvdmUgcHJvZ3JhbSB3YXMgY29tcGlsZWQgd2l0aCB0aGlzIG1hY3JvIHR1cm5lZCBvZmYgaW4gb3JkZXIgdG8gaWxsdXN0cmF0ZSB0aGUKK2FsaWFzaW5nIHByb2JsZW0uIFNlZSBccmVmIFRvcGljQXNzZXJ0aW9ucyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBFaWdlbidzIHJ1bi10aW1lIGFzc2VydGlvbnMuCisKKworXHNlY3Rpb24gVG9waWNBbGlhc2luZ1NvbHV0aW9uIFJlc29sdmluZyBhbGlhc2luZyBpc3N1ZXMKKworSWYgeW91IHVuZGVyc3RhbmQgdGhlIGNhdXNlIG9mIHRoZSBhbGlhc2luZyBpc3N1ZSwgdGhlbiBpdCBpcyBvYnZpb3VzIHdoYXQgbXVzdCBoYXBwZW4gdG8gc29sdmUgaXQ6IEVpZ2VuIGhhcwordG8gZXZhbHVhdGUgdGhlIHJpZ2h0LWhhbmQgc2lkZSBmdWxseSBpbnRvIGEgdGVtcG9yYXJ5IG1hdHJpeC9hcnJheSBhbmQgdGhlbiBhc3NpZ24gaXQgdG8gdGhlIGxlZnQtaGFuZAorc2lkZS4gVGhlIGZ1bmN0aW9uIFxsaW5rIERlbnNlQmFzZTo6ZXZhbCgpIGV2YWwoKSBcZW5kbGluayBkb2VzIHByZWNpc2VseSB0aGF0LgorCitGb3IgZXhhbXBsZSwgaGVyZSBpcyB0aGUgY29ycmVjdGVkIHZlcnNpb24gb2YgdGhlIGZpcnN0IGV4YW1wbGUgYWJvdmU6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVG9waWNBbGlhc2luZ19ibG9ja19jb3JyZWN0LmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUb3BpY0FsaWFzaW5nX2Jsb2NrX2NvcnJlY3Qub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworTm93LCBcYyBtYXQoMiwyKSBlcXVhbHMgNSBhZnRlciB0aGUgYXNzaWdubWVudCwgYXMgaXQgc2hvdWxkIGJlLgorCitUaGUgc2FtZSBzb2x1dGlvbiBhbHNvIHdvcmtzIGZvciB0aGUgc2Vjb25kIGV4YW1wbGUsIHdpdGggdGhlIHRyYW5zcG9zZTogc2ltcGx5IHJlcGxhY2UgdGhlIGxpbmUgCis8dHQ+YSA9IGEudHJhbnNwb3NlKCk7PC90dD4gd2l0aCA8dHQ+YSA9IGEudHJhbnNwb3NlKCkuZXZhbCgpOzwvdHQ+LiBIb3dldmVyLCBpbiB0aGlzIGNvbW1vbiBjYXNlIHRoZXJlIGlzIGEKK2JldHRlciBzb2x1dGlvbi4gRWlnZW4gcHJvdmlkZXMgdGhlIHNwZWNpYWwtcHVycG9zZSBmdW5jdGlvbiAKK1xsaW5rIERlbnNlQmFzZTo6dHJhbnNwb3NlSW5QbGFjZSgpIHRyYW5zcG9zZUluUGxhY2UoKSBcZW5kbGluayB3aGljaCByZXBsYWNlcyBhIG1hdHJpeCBieSBpdHMgdHJhbnNwb3NlLiAKK1RoaXMgaXMgc2hvd24gYmVsb3c6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2lucGxhY2UuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIHR1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9pbnBsYWNlLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK0lmIGFuIHh4eEluUGxhY2UoKSBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRoZW4gaXQgaXMgYmVzdCB0byB1c2UgaXQsIGJlY2F1c2UgaXQgaW5kaWNhdGVzIG1vcmUgY2xlYXJseSB3aGF0IHlvdQorYXJlIGRvaW5nLiBUaGlzIG1heSBhbHNvIGFsbG93IEVpZ2VuIHRvIG9wdGltaXplIG1vcmUgYWdncmVzc2l2ZWx5LiBUaGVzZSBhcmUgc29tZSBvZiB0aGUgeHh4SW5QbGFjZSgpCitmdW5jdGlvbnMgcHJvdmlkZWQ6IAorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPk9yaWdpbmFsIGZ1bmN0aW9uPC90aD48dGg+SW4tcGxhY2UgZnVuY3Rpb248L3RoPjwvdHI+Cis8dHI+IDx0ZD4gTWF0cml4QmFzZTo6YWRqb2ludCgpIDwvdGQ+IDx0ZD4gTWF0cml4QmFzZTo6YWRqb2ludEluUGxhY2UoKSA8L3RkPiA8L3RyPgorPHRyIGNsYXNzPSJhbHQiPiA8dGQ+IERlbnNlQmFzZTo6cmV2ZXJzZSgpIDwvdGQ+IDx0ZD4gRGVuc2VCYXNlOjpyZXZlcnNlSW5QbGFjZSgpIDwvdGQ+IDwvdHI+Cis8dHI+IDx0ZD4gTERMVDo6c29sdmUoKSA8L3RkPiA8dGQ+IExETFQ6OnNvbHZlSW5QbGFjZSgpIDwvdGQ+IDwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+IDx0ZD4gTExUOjpzb2x2ZSgpIDwvdGQ+IDx0ZD4gTExUOjpzb2x2ZUluUGxhY2UoKSA8L3RkPiA8L3RyPgorPHRyPiA8dGQ+IFRyaWFuZ3VsYXJWaWV3Ojpzb2x2ZSgpIDwvdGQ+IDx0ZD4gVHJpYW5ndWxhclZpZXc6OnNvbHZlSW5QbGFjZSgpIDwvdGQ+IDwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+IDx0ZD4gRGVuc2VCYXNlOjp0cmFuc3Bvc2UoKSA8L3RkPiA8dGQ+IERlbnNlQmFzZTo6dHJhbnNwb3NlSW5QbGFjZSgpIDwvdGQ+IDwvdHI+Cis8L3RhYmxlPgorCisKK1xzZWN0aW9uIFRvcGljQWxpYXNpbmdDd2lzZSBBbGlhc2luZyBhbmQgY29tcG9uZW50LXdpc2Ugb3BlcmF0aW9ucworCitBcyBleHBsYWluZWQgYWJvdmUsIGl0IG1heSBiZSBkYW5nZXJvdXMgaWYgdGhlIHNhbWUgbWF0cml4IG9yIGFycmF5IG9jY3VycyBvbiBib3RoIHRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgdGhlCityaWdodC1oYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCBvcGVyYXRvciwgYW5kIGl0IGlzIHRoZW4gb2Z0ZW4gbmVjZXNzYXJ5IHRvIGV2YWx1YXRlIHRoZSByaWdodC1oYW5kIHNpZGUKK2V4cGxpY2l0bHkuIEhvd2V2ZXIsIGFwcGx5aW5nIGNvbXBvbmVudC13aXNlIG9wZXJhdGlvbnMgKHN1Y2ggYXMgbWF0cml4IGFkZGl0aW9uLCBzY2FsYXIgbXVsdGlwbGljYXRpb24gYW5kCithcnJheSBtdWx0aXBsaWNhdGlvbikgaXMgc2FmZS4gCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBoYXMgb25seSBjb21wb25lbnQtd2lzZSBvcGVyYXRpb25zLiBUaHVzLCB0aGVyZSBpcyBubyBuZWVkIGZvciAuZXZhbCgpIGV2ZW4gdGhvdWdoCit0aGUgc2FtZSBtYXRyaXggYXBwZWFycyBvbiBib3RoIHNpZGVzIG9mIHRoZSBhc3NpZ25tZW50cy4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+RXhhbXBsZTwvdGg+PHRoPk91dHB1dDwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUb3BpY0FsaWFzaW5nX2N3aXNlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUb3BpY0FsaWFzaW5nX2N3aXNlLm91dAorPC90ZD48L3RyPjwvdGFibGU+CisKK0luIGdlbmVyYWwsIGFuIGFzc2lnbm1lbnQgaXMgc2FmZSBpZiB0aGUgKGksaikgZW50cnkgb2YgdGhlIGV4cHJlc3Npb24gb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBkZXBlbmRzIG9ubHkgb24KK3RoZSAoaSxqKSBlbnRyeSBvZiB0aGUgbWF0cml4IG9yIGFycmF5IG9uIHRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgbm90IG9uIGFueSBvdGhlciBlbnRyaWVzLiBJbiB0aGF0IGNhc2UgaXQgaXMKK25vdCBuZWNlc3NhcnkgdG8gZXZhbHVhdGUgdGhlIHJpZ2h0LWhhbmQgc2lkZSBleHBsaWNpdGx5LgorCisKK1xzZWN0aW9uIFRvcGljQWxpYXNpbmdNYXRyaXhNdWx0IEFsaWFzaW5nIGFuZCBtYXRyaXggbXVsdGlwbGljYXRpb24KKworTWF0cml4IG11bHRpcGxpY2F0aW9uIGlzIHRoZSBvbmx5IG9wZXJhdGlvbiBpbiBFaWdlbiB0aGF0IGFzc3VtZXMgYWxpYXNpbmcgYnkgZGVmYXVsdC4gVGh1cywgaWYgXGMgbWF0QSBpcyBhCittYXRyaXgsIHRoZW4gdGhlIHN0YXRlbWVudCA8dHQ+bWF0QSA9IG1hdEEgKiBtYXRBOzwvdHQ+IGlzIHNhZmUuIEFsbCBvdGhlciBvcGVyYXRpb25zIGluIEVpZ2VuIGFzc3VtZSB0aGF0Cit0aGVyZSBhcmUgbm8gYWxpYXNpbmcgcHJvYmxlbXMsIGVpdGhlciBiZWNhdXNlIHRoZSByZXN1bHQgaXMgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgbWF0cml4IG9yIGJlY2F1c2UgaXQgaXMgYQorY29tcG9uZW50LXdpc2Ugb3BlcmF0aW9uLgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlPC90aD48dGg+T3V0cHV0PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFRvcGljQWxpYXNpbmdfbXVsdDEuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFRvcGljQWxpYXNpbmdfbXVsdDEub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworSG93ZXZlciwgdGhpcyBjb21lcyBhdCBhIHByaWNlLiBXaGVuIGV4ZWN1dGluZyB0aGUgZXhwcmVzc2lvbiA8dHQ+bWF0QSA9IG1hdEEgKiBtYXRBPC90dD4sIEVpZ2VuIGV2YWx1YXRlcyB0aGUKK3Byb2R1Y3QgaW4gYSB0ZW1wb3JhcnkgbWF0cml4IHdoaWNoIGlzIGFzc2lnbmVkIHRvIFxjIG1hdEEgYWZ0ZXIgdGhlIGNvbXB1dGF0aW9uLiBUaGlzIGlzIGZpbmUuIEJ1dCBFaWdlbiBkb2VzCit0aGUgc2FtZSB3aGVuIHRoZSBwcm9kdWN0IGlzIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG1hdHJpeCAoZS5nLiwgPHR0Pm1hdEIgPSBtYXRBICogbWF0QTwvdHQ+KS4gSW4gdGhhdCBjYXNlLAoraXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gZXZhbHVhdGUgdGhlIHByb2R1Y3QgZGlyZWN0bHkgaW50byBcYyBtYXRCIGluc3RlYWQgb2YgZXZhbHVhdGluZyBpdCBmaXJzdCBpbnRvIGEKK3RlbXBvcmFyeSBtYXRyaXggYW5kIGNvcHlpbmcgdGhhdCBtYXRyaXggdG8gXGMgbWF0Qi4KKworVGhlIHVzZXIgY2FuIGluZGljYXRlIHdpdGggdGhlIFxsaW5rIE1hdHJpeEJhc2U6Om5vYWxpYXMoKSBub2FsaWFzKClcZW5kbGluayBmdW5jdGlvbiB0aGF0IHRoZXJlIGlzIG5vCithbGlhc2luZywgYXMgZm9sbG93czogPHR0Pm1hdEIubm9hbGlhcygpID0gbWF0QSAqIG1hdEE8L3R0Pi4gVGhpcyBhbGxvd3MgRWlnZW4gdG8gZXZhbHVhdGUgdGhlIG1hdHJpeCBwcm9kdWN0Cis8dHQ+bWF0QSAqIG1hdEE8L3R0PiBkaXJlY3RseSBpbnRvIFxjIG1hdEIuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU8L3RoPjx0aD5PdXRwdXQ8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVG9waWNBbGlhc2luZ19tdWx0Mi5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVG9waWNBbGlhc2luZ19tdWx0Mi5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitPZiBjb3Vyc2UsIHlvdSBzaG91bGQgbm90IHVzZSBcYyBub2FsaWFzKCkgd2hlbiB0aGVyZSBpcyBpbiBmYWN0IGFsaWFzaW5nIHRha2luZyBwbGFjZS4gSWYgeW91IGRvLCB0aGVuIHlvdQorbWF5IGdldCB3cm9uZyByZXN1bHRzOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlPC90aD48dGg+T3V0cHV0PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFRvcGljQWxpYXNpbmdfbXVsdDMuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFRvcGljQWxpYXNpbmdfbXVsdDMub3V0Cis8L3RkPjwvdHI+PC90YWJsZT4KKworCitcc2VjdGlvbiBUb3BpY0FsaWFzaW5nU3VtbWFyeSBTdW1tYXJ5CisKK0FsaWFzaW5nIG9jY3VycyB3aGVuIHRoZSBzYW1lIG1hdHJpeCBvciBhcnJheSBjb2VmZmljaWVudHMgYXBwZWFyIGJvdGggb24gdGhlIGxlZnQtIGFuZCB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mCithbiBhc3NpZ25tZW50IG9wZXJhdG9yLgorIC0gQWxpYXNpbmcgaXMgaGFybWxlc3Mgd2l0aCBjb2VmZmljaWVudC13aXNlIGNvbXB1dGF0aW9uczsgdGhpcyBpbmNsdWRlcyBzY2FsYXIgbXVsdGlwbGljYXRpb24gYW5kIG1hdHJpeCBvcgorICAgYXJyYXkgYWRkaXRpb24uCisgLSBXaGVuIHlvdSBtdWx0aXBseSB0d28gbWF0cmljZXMsIEVpZ2VuIGFzc3VtZXMgdGhhdCBhbGlhc2luZyBvY2N1cnMuIElmIHlvdSBrbm93IHRoYXQgdGhlcmUgaXMgbm8gYWxpYXNpbmcsCisgICB0aGVuIHlvdSBjYW4gdXNlIFxsaW5rIE1hdHJpeEJhc2U6Om5vYWxpYXMoKSBub2FsaWFzKClcZW5kbGluay4KKyAtIEluIGFsbCBvdGhlciBzaXR1YXRpb25zLCBFaWdlbiBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgbm8gYWxpYXNpbmcgaXNzdWUgYW5kIHRodXMgZ2l2ZXMgdGhlIHdyb25nIHJlc3VsdCBpZgorICAgYWxpYXNpbmcgZG9lcyBpbiBmYWN0IG9jY3VyLiBUbyBwcmV2ZW50IHRoaXMsIHlvdSBoYXZlIHRvIHVzZSBcbGluayBEZW5zZUJhc2U6OmV2YWwoKSBldmFsKCkgXGVuZGxpbmsgb3IKKyAgIG9uZSBvZiB0aGUgeHh4SW5QbGFjZSgpIGZ1bmN0aW9ucy4KKworKi8KK30KZGlmZiAtLWdpdCBhL2RvYy9JMTJfQ2xhc3NIaWVyYXJjaHkuZG94IGIvZG9jL0kxMl9DbGFzc0hpZXJhcmNoeS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwZDAxOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9JMTJfQ2xhc3NIaWVyYXJjaHkuZG94CkBAIC0wLDAgKzEsMTMzIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNDbGFzc0hpZXJhcmNoeSBUaGUgY2xhc3MgaGllcmFyY2h5CisKK1RoaXMgcGFnZSBleHBsYWlucyB0aGUgZGVzaWduIG9mIHRoZSBjb3JlIGNsYXNzZXMgaW4gRWlnZW4ncyBjbGFzcyBoaWVyYXJjaHkgYW5kIGhvdyB0aGV5IGZpdCB0b2dldGhlci4gQ2FzdWFsCit1c2VycyBwcm9iYWJseSBuZWVkIG5vdCBjb25jZXJuIHRoZW1zZWx2ZXMgd2l0aCB0aGVzZSBkZXRhaWxzLCBidXQgaXQgbWF5IGJlIHVzZWZ1bCBmb3IgYm90aCBhZHZhbmNlZCB1c2VycworYW5kIEVpZ2VuIGRldmVsb3BlcnMuCisKKzxiPlRhYmxlIG9mIGNvbnRlbnRzPC9iPgorICAtIFxyZWYgVG9waWNDbGFzc0hpZXJhcmNoeVByaW5jaXBsZXMKKyAgLSBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHlDb3JlQ2xhc3NlcworICAtIFxyZWYgVG9waWNDbGFzc0hpZXJhcmNoeUJhc2VDbGFzc2VzCisgIC0gXHJlZiBUb3BpY0NsYXNzSGllcmFyY2h5SW5oZXJpdGFuY2VEaWFncmFtcyAKKworCitcc2VjdGlvbiBUb3BpY0NsYXNzSGllcmFyY2h5UHJpbmNpcGxlcyBQcmluY2lwbGVzCisKK0VpZ2VuJ3MgY2xhc3MgaGllcmFyY2h5IGlzIGRlc2lnbmVkIHNvIHRoYXQgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGF2b2lkZWQgd2hlcmUgdGhlaXIgb3ZlcmhlYWQgd291bGQKK3NpZ25pZmljYW50bHkgaW1wYWlyIHBlcmZvcm1hbmNlLiBJbnN0ZWFkLCBFaWdlbiBhY2hpZXZlcyBwb2x5bW9ycGhpc20gd2l0aCB0aGUgQ3VyaW91c2x5IFJlY3VycmluZyBUZW1wbGF0ZQorUGF0dGVybiAoQ1JUUCkuIEluIHRoaXMgcGF0dGVybiwgdGhlIGJhc2UgY2xhc3MgKGZvciBpbnN0YW5jZSwgXGMgTWF0cml4QmFzZSkgaXMgaW4gZmFjdCBhIHRlbXBsYXRlIGNsYXNzLCBhbmQKK3RoZSBkZXJpdmVkIGNsYXNzIChmb3IgaW5zdGFuY2UsIFxjIE1hdHJpeCkgaW5oZXJpdHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCB0aGUgZGVyaXZlZCBjbGFzcyBpdHNlbGYgYXMgYQordGVtcGxhdGUgYXJndW1lbnQgKGluIHRoaXMgY2FzZSwgXGMgTWF0cml4IGluaGVyaXRzIGZyb20gXGMgTWF0cml4QmFzZSZsdDtNYXRyaXgmZ3Q7KS4gVGhpcyBhbGxvd3MgRWlnZW4gdG8KK3Jlc29sdmUgdGhlIHBvbHltb3JwaGljIGZ1bmN0aW9uIGNhbGxzIGF0IGNvbXBpbGUgdGltZS4KKworSW4gYWRkaXRpb24sIHRoZSBkZXNpZ24gYXZvaWRzIG11bHRpcGxlIGluaGVyaXRhbmNlLiBPbmUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgaW4gb3VyIGV4cGVyaWVuY2UsIHNvbWUKK2NvbXBpbGVycyAobGlrZSBNU1ZDKSBmYWlsIHRvIHBlcmZvcm0gZW1wdHkgYmFzZSBjbGFzcyBvcHRpbWl6YXRpb24sIHdoaWNoIGlzIGNydWNpYWwgZm9yIG91ciBmaXhlZC1zaXplCit0eXBlcy4KKworCitcc2VjdGlvbiBUb3BpY0NsYXNzSGllcmFyY2h5Q29yZUNsYXNzZXMgVGhlIGNvcmUgY2xhc3NlcworCitUaGVzZSBhcmUgdGhlIGNsYXNzZXMgdGhhdCB5b3UgbmVlZCB0byBrbm93IGFib3V0IGlmIHlvdSB3YW50IHRvIHdyaXRlIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBvciByZXR1cm4gRWlnZW4KK29iamVjdHMuCisKKyAgLSBNYXRyaXggbWVhbnMgcGxhaW4gZGVuc2UgbWF0cml4LiBJZiBcYyBtIGlzIGEgXGMgJU1hdHJpeCwgdGhlbiwgZm9yIGluc3RhbmNlLCBcYyBtK20gaXMgbm8gbG9uZ2VyIGEgCisgICAgXGMgJU1hdHJpeCwgaXQgaXMgYSAibWF0cml4IGV4cHJlc3Npb24iLgorICAtIE1hdHJpeEJhc2UgbWVhbnMgZGVuc2UgbWF0cml4IGV4cHJlc3Npb24uIFRoaXMgbWVhbnMgdGhhdCBhIFxjICVNYXRyaXhCYXNlIGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZQorICAgIGFkZGVkLCBtYXRyaXgtbXVsdGlwbGllZCwgTFUtZGVjb21wb3NlZCwgUVItZGVjb21wb3NlZC4uLiBBbGwgbWF0cml4IGV4cHJlc3Npb24gY2xhc3NlcywgaW5jbHVkaW5nIAorICAgIFxjICVNYXRyaXggaXRzZWxmLCBpbmhlcml0IFxjICVNYXRyaXhCYXNlLgorICAtIEFycmF5IG1lYW5zIHBsYWluIGRlbnNlIGFycmF5LiBJZiBcYyB4IGlzIGFuIFxjICVBcnJheSwgdGhlbiwgZm9yIGluc3RhbmNlLCBcYyB4K3ggaXMgbm8gbG9uZ2VyIGFuIAorICAgIFxjICVBcnJheSwgaXQgaXMgYW4gImFycmF5IGV4cHJlc3Npb24iLgorICAtIEFycmF5QmFzZSBtZWFucyBkZW5zZSBhcnJheSBleHByZXNzaW9uLiBUaGlzIG1lYW5zIHRoYXQgYW4gXGMgJUFycmF5QmFzZSBpcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUKKyAgICBhZGRlZCwgYXJyYXktbXVsdGlwbGllZCwgYW5kIG9uIHdoaWNoIHlvdSBjYW4gcGVyZm9ybSBhbGwgc29ydHMgb2YgYXJyYXkgb3BlcmF0aW9ucy4uLiBBbGwgYXJyYXkKKyAgICBleHByZXNzaW9uIGNsYXNzZXMsIGluY2x1ZGluZyBcYyAlQXJyYXkgaXRzZWxmLCBpbmhlcml0IFxjICVBcnJheUJhc2UuCisgIC0gRGVuc2VCYXNlIG1lYW5zIGRlbnNlIChtYXRyaXggb3IgYXJyYXkpIGV4cHJlc3Npb24uIEJvdGggXGMgJUFycmF5QmFzZSBhbmQgXGMgJU1hdHJpeEJhc2UgaW5oZXJpdAorICAgIFxjICVEZW5zZUJhc2UuIFxjICVEZW5zZUJhc2UgaXMgd2hlcmUgYWxsIHRoZSBtZXRob2RzIGdvIHRoYXQgYXBwbHkgdG8gZGVuc2UgZXhwcmVzc2lvbnMgcmVnYXJkbGVzcyBvZgorICAgIHdoZXRoZXIgdGhleSBhcmUgbWF0cml4IG9yIGFycmF5IGV4cHJlc3Npb25zLiBGb3IgZXhhbXBsZSwgdGhlIFxsaW5rIERlbnNlQmFzZTo6YmxvY2soKSBibG9jayguLi4pIFxlbmRsaW5rCisgICAgbWV0aG9kcyBhcmUgaW4gXGMgJURlbnNlQmFzZS4KKworXHNlY3Rpb24gVG9waWNDbGFzc0hpZXJhcmNoeUJhc2VDbGFzc2VzIEJhc2UgY2xhc3NlcworCitUaGVzZSBjbGFzc2VzIHNlcnZlIGFzIGJhc2UgY2xhc3NlcyBmb3IgdGhlIGZpdmUgY29yZSBjbGFzc2VzIG1lbnRpb25lZCBhYm92ZS4gVGhleSBhcmUgbW9yZSBpbnRlcm5hbCBhbmQgc28KK2xlc3MgaW50ZXJlc3RpbmcgZm9yIHVzZXJzIG9mIHRoZSBFaWdlbiBsaWJyYXJ5LgorCisgIC0gUGxhaW5PYmplY3RCYXNlIG1lYW5zIGRlbnNlIChtYXRyaXggb3IgYXJyYXkpIHBsYWluIG9iamVjdCwgaS5lLiBzb21ldGhpbmcgdGhhdCBzdG9yZXMgaXRzIG93biBkZW5zZQorICAgIGFycmF5IG9mIGNvZWZmaWNpZW50cy4gVGhpcyBpcyB3aGVyZSwgZm9yIGluc3RhbmNlLCB0aGUgXGxpbmsgUGxhaW5PYmplY3RCYXNlOjpyZXNpemUoKSByZXNpemUoKSBcZW5kbGluaworICAgIG1ldGhvZHMgZ28uIFxjICVQbGFpbk9iamVjdEJhc2UgaXMgaW5oZXJpdGVkIGJ5IFxjICVNYXRyaXggYW5kIGJ5IFxjICVBcnJheS4gQnV0IGFib3ZlLCB3ZSBzYWlkIHRoYXQgCisgICAgXGMgJU1hdHJpeCBpbmhlcml0cyBcYyAlTWF0cml4QmFzZSBhbmQgXGMgJUFycmF5IGluaGVyaXRzIFxjICVBcnJheUJhc2UuIFNvIGRvZXMgdGhhdCBtZWFuIG11bHRpcGxlCisgICAgaW5oZXJpdGFuY2U/IE5vLCBiZWNhdXNlIFxjICVQbGFpbk9iamVjdEJhc2UgXGUgaXRzZWxmIGluaGVyaXRzIFxjICVNYXRyaXhCYXNlIG9yIFxjICVBcnJheUJhc2UgZGVwZW5kaW5nCisgICAgb24gd2hldGhlciB3ZSBhcmUgaW4gdGhlIG1hdHJpeCBvciBhcnJheSBjYXNlLiBXaGVuIHdlIHNhaWQgYWJvdmUgdGhhdCBcYyAlTWF0cml4IGluaGVyaXRlZCAKKyAgICBcYyAlTWF0cml4QmFzZSwgd2Ugb21pdHRlZCB0byBzYXkgaXQgZG9lcyBzbyBpbmRpcmVjdGx5IHZpYSBcYyAlUGxhaW5PYmplY3RCYXNlLiBTYW1lIGZvciBcYyAlQXJyYXkuCisgIC0gRGVuc2VDb2VmZnNCYXNlIG1lYW5zIHNvbWV0aGluZyB0aGF0IGhhcyBkZW5zZSBjb2VmZmljaWVudCBhY2Nlc3NvcnMuIEl0IGlzIGEgYmFzZSBjbGFzcyBmb3IKKyAgICBcYyAlRGVuc2VCYXNlLiBUaGUgcmVhc29uIGZvciBcYyAlRGVuc2VDb2VmZnNCYXNlIHRvIGV4aXN0IGlzIHRoYXQgdGhlIHNldCBvZiBhdmFpbGFibGUgY29lZmZpY2llbnQKKyAgICBhY2Nlc3NvcnMgaXMgdmVyeSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBkZW5zZSBleHByZXNzaW9uIGhhcyBkaXJlY3QgbWVtb3J5IGFjY2VzcyBvciBub3QgKHRoZQorICAgIFxjIERpcmVjdEFjY2Vzc0JpdCBmbGFnKS4gRm9yIGV4YW1wbGUsIGlmIFxjIHggaXMgYSBwbGFpbiBtYXRyaXgsIHRoZW4gXGMgeCBoYXMgZGlyZWN0IGFjY2VzcywgYW5kIAorICAgIFxjIHgudHJhbnNwb3NlKCkgYW5kIFxjIHguYmxvY2soLi4uKSBhbHNvIGhhdmUgZGlyZWN0IGFjY2VzcywgYmVjYXVzZSB0aGVpciBjb2VmZmljaWVudHMgY2FuIGJlIHJlYWQgcmlnaHQKKyAgICBvZmYgbWVtb3J5LCBidXQgZm9yIGV4YW1wbGUsIFxjIHgreCBkb2VzIG5vdCBoYXZlIGRpcmVjdCBtZW1vcnkgYWNjZXNzLCBiZWNhdXNlIG9idGFpbmluZyBhbnkgb2YgaXRzCisgICAgY29lZmZpY2llbnRzIHJlcXVpcmVzIGEgY29tcHV0YXRpb24gKGFuIGFkZGl0aW9uKSwgaXQgY2FuJ3QgYmUganVzdCByZWFkIG9mZiBtZW1vcnkuCisgIC0gRWlnZW5CYXNlIG1lYW5zIGFueXRoaW5nIHRoYXQgY2FuIGJlIGV2YWx1YXRlZCBpbnRvIGEgcGxhaW4gZGVuc2UgbWF0cml4IG9yIGFycmF5IChldmVuIGlmIHRoYXQgd291bGQKKyAgICBiZSBhIGJhZCBpZGVhKS4gXGMgJUVpZ2VuQmFzZSBpcyByZWFsbHkgdGhlIGFic29sdXRlIGJhc2UgY2xhc3MgZm9yIGFueXRoaW5nIHRoYXQgcmVtb3RlbHkgbG9va3MgbGlrZSBhCisgICAgbWF0cml4IG9yIGFycmF5LiBJdCBpcyBhIGJhc2UgY2xhc3MgZm9yIFxjICVEZW5zZUNvZWZmc0Jhc2UsIHNvIGl0IHNpdHMgYmVsb3cgYWxsIG91ciBkZW5zZSBjbGFzcworICAgIGhpZXJhcmNoeSwgYnV0IGl0IGlzIG5vdCBsaW1pdGVkIHRvIGRlbnNlIGV4cHJlc3Npb25zLiBGb3IgZXhhbXBsZSwgXGMgJUVpZ2VuQmFzZSBpcyBhbHNvIGluaGVyaXRlZCBieQorICAgIGRpYWdvbmFsIG1hdHJpY2VzLCBzcGFyc2UgbWF0cmljZXMsIGV0Yy4uLgorCisKK1xzZWN0aW9uIFRvcGljQ2xhc3NIaWVyYXJjaHlJbmhlcml0YW5jZURpYWdyYW1zIEluaGVyaXRhbmNlIGRpYWdyYW1zCisKK1RoZSBpbmhlcml0YW5jZSBkaWFncmFtIGZvciBNYXRyaXggbG9va3MgYXMgZm9sbG93czoKKworPHByZT4KK0VpZ2VuQmFzZSZsdDslTWF0cml4Jmd0OworICA8LS0gRGVuc2VDb2VmZnNCYXNlJmx0OyVNYXRyaXgmZ3Q7ICAgIChkaXJlY3QgYWNjZXNzIGNhc2UpCisgICAgPC0tIERlbnNlQmFzZSZsdDslTWF0cml4Jmd0OworICAgICAgPC0tIE1hdHJpeEJhc2UmbHQ7JU1hdHJpeCZndDsKKyAgICAgICAgPC0tIFBsYWluT2JqZWN0QmFzZSZsdDslTWF0cml4Jmd0OyAgICAobWF0cml4IGNhc2UpCisgICAgICAgICAgPC0tIE1hdHJpeAorPC9wcmU+CisKK1RoZSBpbmhlcml0YW5jZSBkaWFncmFtIGZvciBBcnJheSBsb29rcyBhcyBmb2xsb3dzOgorCis8cHJlPgorRWlnZW5CYXNlJmx0OyVBcnJheSZndDsKKyAgPC0tIERlbnNlQ29lZmZzQmFzZSZsdDslQXJyYXkmZ3Q7ICAgIChkaXJlY3QgYWNjZXNzIGNhc2UpCisgICAgPC0tIERlbnNlQmFzZSZsdDslQXJyYXkmZ3Q7CisgICAgICA8LS0gQXJyYXlCYXNlJmx0OyVBcnJheSZndDsKKyAgICAgICAgPC0tIFBsYWluT2JqZWN0QmFzZSZsdDslQXJyYXkmZ3Q7ICAgIChhcnJheSBjYXNlKQorICAgICAgICAgIDwtLSBBcnJheQorPC9wcmU+CisKK1RoZSBpbmhlcml0YW5jZSBkaWFncmFtIGZvciBzb21lIG90aGVyIG1hdHJpeCBleHByZXNzaW9uIGNsYXNzLCBoZXJlIGRlbm90ZWQgYnkgXGMgU29tZU1hdHJpeFhwciwgbG9va3MgYXMKK2ZvbGxvd3M6CisKKzxwcmU+CitFaWdlbkJhc2UmbHQ7U29tZU1hdHJpeFhwciZndDsKKyAgPC0tIERlbnNlQ29lZmZzQmFzZSZsdDtTb21lTWF0cml4WHByJmd0OyAgICAoZGlyZWN0IGFjY2VzcyBvciBubyBkaXJlY3QgYWNjZXNzIGNhc2UpCisgICAgPC0tIERlbnNlQmFzZSZsdDtTb21lTWF0cml4WHByJmd0OworICAgICAgPC0tIE1hdHJpeEJhc2UmbHQ7U29tZU1hdHJpeFhwciZndDsKKyAgICAgICAgPC0tIFNvbWVNYXRyaXhYcHIKKzwvcHJlPgorCitUaGUgaW5oZXJpdGFuY2UgZGlhZ3JhbSBmb3Igc29tZSBvdGhlciBhcnJheSBleHByZXNzaW9uIGNsYXNzLCBoZXJlIGRlbm90ZWQgYnkgXGMgU29tZUFycmF5WHByLCBsb29rcyBhcworZm9sbG93czoKKworPHByZT4KK0VpZ2VuQmFzZSZsdDtTb21lQXJyYXlYcHImZ3Q7CisgIDwtLSBEZW5zZUNvZWZmc0Jhc2UmbHQ7U29tZUFycmF5WHByJmd0OyAgICAoZGlyZWN0IGFjY2VzcyBvciBubyBkaXJlY3QgYWNjZXNzIGNhc2UpCisgICAgPC0tIERlbnNlQmFzZSZsdDtTb21lQXJyYXlYcHImZ3Q7CisgICAgICA8LS0gQXJyYXlCYXNlJmx0O1NvbWVBcnJheVhwciZndDsKKyAgICAgICAgPC0tIFNvbWVBcnJheVhwcgorPC9wcmU+CisKK0ZpbmFsbHksIGNvbnNpZGVyIGFuIGV4YW1wbGUgb2Ygc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgZGVuc2UgZXhwcmVzc2lvbiwgZm9yIGluc3RhbmNlIGEgZGlhZ29uYWwgbWF0cml4LiBUaGUKK2NvcnJlc3BvbmRpbmcgaW5oZXJpdGFuY2UgZGlhZ3JhbSBpczoKKworPHByZT4KK0VpZ2VuQmFzZSZsdDslRGlhZ29uYWxNYXRyaXgmZ3Q7CisgIDwtLSBEaWFnb25hbEJhc2UmbHQ7JURpYWdvbmFsTWF0cml4Jmd0OworICAgIDwtLSBEaWFnb25hbE1hdHJpeAorPC9wcmU+CisKKworKi8KK30KZGlmZiAtLWdpdCBhL2RvYy9JMTNfRnVuY3Rpb25zVGFraW5nRWlnZW5UeXBlcy5kb3ggYi9kb2MvSTEzX0Z1bmN0aW9uc1Rha2luZ0VpZ2VuVHlwZXMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTZmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSTEzX0Z1bmN0aW9uc1Rha2luZ0VpZ2VuVHlwZXMuZG94CkBAIC0wLDAgKzEsMTg4IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNGdW5jdGlvblRha2luZ0VpZ2VuVHlwZXMgV3JpdGluZyBGdW5jdGlvbnMgVGFraW5nIEVpZ2VuIFR5cGVzIGFzIFBhcmFtZXRlcnMKKworRWlnZW4ncyB1c2Ugb2YgZXhwcmVzc2lvbiB0ZW1wbGF0ZXMgcmVzdWx0cyBpbiBwb3RlbnRpYWxseSBldmVyeSBleHByZXNzaW9uIGJlaW5nIG9mIGEgZGlmZmVyZW50IHR5cGUuIElmIHlvdSBwYXNzIHN1Y2ggYW4gZXhwcmVzc2lvbiB0byBhIGZ1bmN0aW9uIHRha2luZyBhIHBhcmFtZXRlciBvZiB0eXBlIE1hdHJpeCwgeW91ciBleHByZXNzaW9uIHdpbGwgaW1wbGljaXRseSBiZSBldmFsdWF0ZWQgaW50byBhIHRlbXBvcmFyeSBNYXRyaXgsIHdoaWNoIHdpbGwgdGhlbiBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiBUaGlzIG1lYW5zIHRoYXQgeW91IGxvc2UgdGhlIGJlbmVmaXQgb2YgZXhwcmVzc2lvbiB0ZW1wbGF0ZXMuIENvbmNyZXRlbHksIHRoaXMgaGFzIHR3byBkcmF3YmFja3M6CisgXGxpIFRoZSBldmFsdWF0aW9uIGludG8gYSB0ZW1wb3JhcnkgbWF5IGJlIHVzZWxlc3MgYW5kIGluZWZmaWNpZW50OworIFxsaSBUaGlzIG9ubHkgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byByZWFkIGZyb20gdGhlIGV4cHJlc3Npb24sIG5vdCB0byB3cml0ZSB0byBpdC4KKworRm9ydHVuYXRlbHksIGFsbCB0aGlzIG15cmlhZCBvZiBleHByZXNzaW9uIHR5cGVzIGhhdmUgaW4gY29tbW9uIHRoYXQgdGhleSBhbGwgaW5oZXJpdCBhIGZldyBjb21tb24sIHRlbXBsYXRlZCBiYXNlIGNsYXNzZXMuIEJ5IGxldHRpbmcgeW91ciBmdW5jdGlvbiB0YWtlIHRlbXBsYXRlZCBwYXJhbWV0ZXJzIG9mIHRoZXNlIGJhc2UgdHlwZXMsIHlvdSBjYW4gbGV0IHRoZW0gcGxheSBuaWNlbHkgd2l0aCBFaWdlbidzIGV4cHJlc3Npb24gdGVtcGxhdGVzLgorCis8Yj5UYWJsZSBvZiBjb250ZW50czwvYj4KKyAgLSBccmVmIFRvcGljRmlyc3RFeGFtcGxlcworICAtIFxyZWYgVG9waWNQbGFpbkZ1bmN0aW9uc1dvcmtpbmcKKyAgLSBccmVmIFRvcGljUGxhaW5GdW5jdGlvbnNGYWlsaW5nCisgIC0gXHJlZiBUb3BpY1Jlc2l6aW5nSW5HZW5lcmljSW1wbGVtZW50YXRpb25zCisgIC0gXHJlZiBUb3BpY1N1bW1hcnkKKworXHNlY3Rpb24gVG9waWNGaXJzdEV4YW1wbGVzIFNvbWUgRmlyc3QgRXhhbXBsZXMKKworVGhpcyBzZWN0aW9uIHdpbGwgcHJvdmlkZSBzaW1wbGUgZXhhbXBsZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBvYmplY3RzIEVpZ2VuIGlzIG9mZmVyaW5nLiBCZWZvcmUgc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGV4YW1wbGVzLCB3ZSBuZWVkIHRvIHJlY2FwaXR1bGF0ZSB3aGljaCBiYXNlIG9iamVjdHMgd2UgY2FuIHdvcmsgd2l0aCAoc2VlIGFsc28gXHJlZiBUb3BpY0NsYXNzSGllcmFyY2h5KS4KKworIFxsaSBNYXRyaXhCYXNlOiBUaGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBkZW5zZSBtYXRyaXggZXhwcmVzc2lvbnMgKGFzIG9wcG9zZWQgdG8gYXJyYXkgZXhwcmVzc2lvbnMsIGFzIG9wcG9zZWQgdG8gc3BhcnNlIGFuZCBzcGVjaWFsIG1hdHJpeCBjbGFzc2VzKS4gVXNlIGl0IGluIGZ1bmN0aW9ucyB0aGF0IGFyZSBtZWFudCB0byB3b3JrIG9ubHkgb24gZGVuc2UgbWF0cmljZXMuCisgXGxpIEFycmF5QmFzZTogVGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZGVuc2UgYXJyYXkgZXhwcmVzc2lvbnMgKGFzIG9wcG9zZWQgdG8gbWF0cml4IGV4cHJlc3Npb25zLCBldGMpLiBVc2UgaXQgaW4gZnVuY3Rpb25zIHRoYXQgYXJlIG1lYW50IHRvIHdvcmsgb25seSBvbiBhcnJheXMuCisgXGxpIERlbnNlQmFzZTogVGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZGVuc2UgbWF0cml4IGV4cHJlc3Npb24sIHRoYXQgaXMsIHRoZSBiYXNlIGNsYXNzIGZvciBib3RoIFxjIE1hdHJpeEJhc2UgYW5kIFxjIEFycmF5QmFzZS4gSXQgY2FuIGJlIHVzZWQgaW4gZnVuY3Rpb25zIHRoYXQgYXJlIG1lYW50IHRvIHdvcmsgb24gYm90aCBtYXRyaWNlcyBhbmQgYXJyYXlzLgorIFxsaSBFaWdlbkJhc2U6IFRoZSBiYXNlIGNsYXNzIHVuaWZ5aW5nIGFsbCB0eXBlcyBvZiBvYmplY3RzIHRoYXQgY2FuIGJlIGV2YWx1YXRlZCBpbnRvIGRlbnNlIG1hdHJpY2VzIG9yIGFycmF5cywgZm9yIGV4YW1wbGUgc3BlY2lhbCBtYXRyaXggY2xhc3NlcyBzdWNoIGFzIGRpYWdvbmFsIG1hdHJpY2VzLCBwZXJtdXRhdGlvbiBtYXRyaWNlcywgZXRjLiBJdCBjYW4gYmUgdXNlZCBpbiBmdW5jdGlvbnMgdGhhdCBhcmUgbWVhbnQgdG8gd29yayBvbiBhbnkgc3VjaCBnZW5lcmFsIHR5cGUuCisKKzxiPiAlRWlnZW5CYXNlIEV4YW1wbGUgPC9iPjxici8+PGJyLz4KK1ByaW50cyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgbW9zdCBnZW5lcmljIG9iamVjdCBwcmVzZW50IGluIEVpZ2VuLiBJdCBjb3VsZGUgYmUgYW55IG1hdHJpeCBleHByZXNzaW9ucywgYW55IGRlbnNlIG9yIHNwYXJzZSBtYXRyaXggYW5kIGFueSBhcnJheS4KKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBmdW5jdGlvbl90YWtpbmdfZWlnZW5iYXNlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBmdW5jdGlvbl90YWtpbmdfZWlnZW5iYXNlLm91dAorPC90ZD48L3RyPjwvdGFibGU+Cis8Yj4gJURlbnNlQmFzZSBFeGFtcGxlIDwvYj48YnIvPjxici8+CitQcmludHMgYSBzdWItYmxvY2sgb2YgdGhlIGRlbnNlIGV4cHJlc3Npb24uIEFjY2VwdHMgYW55IGRlbnNlIG1hdHJpeCBvciBhcnJheSBleHByZXNzaW9uLCBidXQgbm8gc3BhcnNlIG9iamVjdHMgYW5kIG5vIHNwZWNpYWwgbWF0cml4IGNsYXNzZXMgc3VjaCBhcyBEaWFnb25hbE1hdHJpeC4KK1xjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK3ZvaWQgcHJpbnRfYmxvY2soY29uc3QgRGVuc2VCYXNlPERlcml2ZWQ+JiBiLCBpbnQgeCwgaW50IHksIGludCByLCBpbnQgYykKK3sKKyAgc3RkOjpjb3V0IDw8ICJibG9jazogIiA8PCBiLmJsb2NrKHgseSxyLGMpIDw8IHN0ZDo6ZW5kbDsKK30KK1xlbmRjb2RlCis8Yj4gJUFycmF5QmFzZSBFeGFtcGxlIDwvYj48YnIvPjxici8+CitQcmludHMgdGhlIG1heGltdW0gY29lZmZpY2llbnQgb2YgdGhlIGFycmF5IG9yIGFycmF5LWV4cHJlc3Npb24uCitcY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIHByaW50X21heF9jb2VmZihjb25zdCBBcnJheUJhc2U8RGVyaXZlZD4gJmEpCit7CisgIHN0ZDo6Y291dCA8PCAibWF4OiAiIDw8IGEubWF4Q29lZmYoKSA8PCBzdGQ6OmVuZGw7Cit9CitcZW5kY29kZQorPGI+ICVNYXRyaXhCYXNlIEV4YW1wbGUgPC9iPjxici8+PGJyLz4KK1ByaW50cyB0aGUgaW52ZXJzZSBjb25kaXRpb24gbnVtYmVyIG9mIHRoZSBnaXZlbiBtYXRyaXggb3IgbWF0cml4LWV4cHJlc3Npb24uCitcY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIHByaW50X2ludl9jb25kKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIGEpCit7CisgIGNvbnN0IHR5cGVuYW1lIEphY29iaVNWRDx0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdD46OlNpbmd1bGFyVmFsdWVzVHlwZSYKKyAgICBzaW5nX3ZhbHMgPSBhLmphY29iaVN2ZCgpLnNpbmd1bGFyVmFsdWVzKCk7CisgIHN0ZDo6Y291dCA8PCAiaW52IGNvbmQ6ICIgPDwgc2luZ192YWxzKHNpbmdfdmFscy5zaXplKCktMSkgLyBzaW5nX3ZhbHMoMCkgPDwgc3RkOjplbmRsOworfQorXGVuZGNvZGUKKzxiPiBNdWx0aXBsZSB0ZW1wbGF0ZWQgYXJndW1lbnRzIGV4YW1wbGUgPC9iPjxici8+PGJyLz4KK0NhbGN1bGF0ZSB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cy4KK1xjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZEEsdHlwZW5hbWUgRGVyaXZlZEI+Cit0eXBlbmFtZSBEZXJpdmVkQTo6U2NhbGFyIHNxdWFyZWRpc3QoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkQT4mIHAxLGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZEI+JiBwMikKK3sKKyAgcmV0dXJuIChwMS1wMikuc3F1YXJlZE5vcm0oKTsKK30KK1xlbmRjb2RlCitOb3RpY2UgdGhhdCB3ZSB1c2VkIHR3byB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBvbmUgcGVyIGFyZ3VtZW50LiBUaGlzIHBlcm1pdHMgdGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBpbnB1dHMgb2YgZGlmZmVyZW50IHR5cGVzLCBlLmcuLAorXGNvZGUKK3NxdWFyZWRpc3QodjEsMip2MikKK1xlbmRjb2RlCit3aGVyZSB0aGUgZmlyc3QgYXJndW1lbnQgXGMgdjEgaXMgYSB2ZWN0b3IgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgXGMgMip2MiBpcyBhbiBleHByZXNzaW9uLgorPGJyLz48YnIvPgorCitUaGVzZSBleGFtcGxlcyBhcmUganVzdCBpbnRlbmRlZCB0byBnaXZlIHRoZSByZWFkZXIgYSBmaXJzdCBpbXByZXNzaW9uIG9mIGhvdyBmdW5jdGlvbnMgY2FuIGJlIHdyaXR0ZW4gd2hpY2ggdGFrZSBhIHBsYWluIGFuZCBjb25zdGFudCBNYXRyaXggb3IgQXJyYXkgYXJndW1lbnQuIFRoZXkgYXJlIGFsc28gaW50ZW5kZWQgdG8gZ2l2ZSB0aGUgcmVhZGVyIGFuIGlkZWEgYWJvdXQgdGhlIG1vc3QgY29tbW9uIGJhc2UgY2xhc3NlcyBiZWluZyB0aGUgb3B0aW1hbCBjYW5kaWRhdGVzIGZvciBmdW5jdGlvbnMuIEluIHRoZSBuZXh0IHNlY3Rpb24gd2Ugd2lsbCBsb29rIGluIG1vcmUgZGV0YWlsIGF0IGFuIGV4YW1wbGUgYW5kIHRoZSBkaWZmZXJlbnQgd2F5cyBpdCBjYW4gYmUgaW1wbGVtZW50ZWQsIHdoaWxlIGRpc2N1c3NpbmcgZWFjaCBpbXBsZW1lbnRhdGlvbidzIHByb2JsZW1zIGFuZCBhZHZhbnRhZ2VzLiBGb3IgdGhlIGRpc2N1c3Npb24gYmVsb3csIE1hdHJpeCBhbmQgQXJyYXkgYXMgd2VsbCBhcyBNYXRyaXhCYXNlIGFuZCBBcnJheUJhc2UgY2FuIGJlIGV4Y2hhbmdlZCBhbmQgYWxsIGFyZ3VtZW50cyBzdGlsbCBob2xkLgorCitcc2VjdGlvbiBUb3BpY1BsYWluRnVuY3Rpb25zV29ya2luZyBJbiB3aGljaCBjYXNlcyBkbyBmdW5jdGlvbnMgdGFraW5nIHBsYWluIE1hdHJpeCBvciBBcnJheSBhcmd1bWVudHMgd29yaz8KKworTGV0J3MgYXNzdW1lIG9uZSB3YW50cyB0byB3cml0ZSBhIGZ1bmN0aW9uIGNvbXB1dGluZyB0aGUgY292YXJpYW5jZSBtYXRyaXggb2YgdHdvIGlucHV0IG1hdHJpY2VzIHdoZXJlIGVhY2ggcm93IGlzIGFuIG9ic2VydmF0aW9uLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBtaWdodCBsb29rIGxpa2UgdGhpcworXGNvZGUKK01hdHJpeFhmIGNvdihjb25zdCBNYXRyaXhYZiYgeCwgY29uc3QgTWF0cml4WGYmIHkpCit7CisgIGNvbnN0IGZsb2F0IG51bV9vYnNlcnZhdGlvbnMgPSBzdGF0aWNfY2FzdDxmbG9hdD4oeC5yb3dzKCkpOworICBjb25zdCBSb3dWZWN0b3JYZiB4X21lYW4gPSB4LmNvbHdpc2UoKS5zdW0oKSAvIG51bV9vYnNlcnZhdGlvbnM7CisgIGNvbnN0IFJvd1ZlY3RvclhmIHlfbWVhbiA9IHkuY29sd2lzZSgpLnN1bSgpIC8gbnVtX29ic2VydmF0aW9uczsKKyAgcmV0dXJuICh4LnJvd3dpc2UoKSAtIHhfbWVhbikudHJhbnNwb3NlKCkgKiAoeS5yb3d3aXNlKCkgLSB5X21lYW4pIC8gbnVtX29ic2VydmF0aW9uczsKK30KK1xlbmRjb2RlCithbmQgY29udHJhcnkgdG8gd2hhdCBvbmUgbWlnaHQgdGhpbmsgYXQgZmlyc3QsIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgZmluZSB1bmxlc3MgeW91IHJlcXVpcmUgYSBnZW5yaWMgaW1wbGVtZW50YXRpb24gdGhhdCB3b3JrcyB3aXRoIGRvdWJsZSBtYXRyaWNlcyB0b28gYW5kIHVubGVzcyB5b3UgZG8gbm90IGNhcmUgYWJvdXQgdGVtcG9yYXJ5IG9iamVjdHMuIFdoeSBpcyB0aGF0IHRoZSBjYXNlPyBXaGVyZSBhcmUgdGVtcG9yYXJpZXMgaW52b2x2ZWQ/IEhvdyBjYW4gY29kZSBhcyBnaXZlbiBiZWxvdyBjb21waWxlPworXGNvZGUKK01hdHJpeFhmIHgseSx6OworTWF0cml4WGYgQyA9IGNvdih4LHkreik7CitcZW5kY29kZQorSW4gdGhpcyBzcGVjaWFsIGNhc2UsIHRoZSBleGFtcGxlIGlzIGZpbmUgYW5kIHdpbGwgYmUgd29ya2luZyBiZWNhdXNlIGJvdGggcGFyYW1ldGVycyBhcmUgZGVjbGFyZWQgYXMgXGUgY29uc3QgcmVmZXJlbmNlcy4gVGhlIGNvbXBpbGVyIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgYW5kIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiB4K3ogaW50byB0aGlzIHRlbXBvcmFyeS4gT25jZSB0aGUgZnVuY3Rpb24gaXMgcHJvY2Vzc2VkLCB0aGUgdGVtcG9yYXJ5IGlzIHJlbGVhc2VkIGFuZCB0aGUgcmVzdWx0IGlzIGFzc2lnbmVkIHRvIEMuCisKK1xiIE5vdGU6IEZ1bmN0aW9ucyB0YWtpbmcgXGUgY29uc3QgcmVmZXJlbmNlcyB0byBNYXRyaXggKG9yIEFycmF5KSBjYW4gcHJvY2VzcyBleHByZXNzaW9ucyBhdCB0aGUgY29zdCBvZiB0ZW1wb3Jhcmllcy4KKworXHNlY3Rpb24gVG9waWNQbGFpbkZ1bmN0aW9uc0ZhaWxpbmcgSW4gd2hpY2ggY2FzZXMgZG8gZnVuY3Rpb25zIHRha2luZyBhIHBsYWluIE1hdHJpeCBvciBBcnJheSBhcmd1bWVudCBmYWlsPworCitIZXJlLCB3ZSBjb25zaWRlciBhIHNsaWdodGx5IG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGdpdmVuIGFib3ZlLiBUaGlzIHRpbWUsIHdlIGRvIG5vdCB3YW50IHRvIHJldHVybiB0aGUgcmVzdWx0IGJ1dCBwYXNzIGFuIGFkZGl0aW9uYWwgbm9uLWNvbnN0IHBhcmFtdGVyIHdoaWNoIGFsbG93cyB1cyB0byBzdG9yZSB0aGUgcmVzdWx0LiBBIGZpcnN0IG5haXZlIGltcGxlbWVudGF0aW9uIG1pZ2h0IGxvb2sgYXMgZm9sbG93cy4KK1xjb2RlCisvLyBOb3RlOiBUaGlzIGNvZGUgaXMgZmxhd2VkIQordm9pZCBjb3YoY29uc3QgTWF0cml4WGYmIHgsIGNvbnN0IE1hdHJpeFhmJiB5LCBNYXRyaXhYZiYgQykKK3sKKyAgY29uc3QgZmxvYXQgbnVtX29ic2VydmF0aW9ucyA9IHN0YXRpY19jYXN0PGZsb2F0Pih4LnJvd3MoKSk7CisgIGNvbnN0IFJvd1ZlY3RvclhmIHhfbWVhbiA9IHguY29sd2lzZSgpLnN1bSgpIC8gbnVtX29ic2VydmF0aW9uczsKKyAgY29uc3QgUm93VmVjdG9yWGYgeV9tZWFuID0geS5jb2x3aXNlKCkuc3VtKCkgLyBudW1fb2JzZXJ2YXRpb25zOworICBDID0gKHgucm93d2lzZSgpIC0geF9tZWFuKS50cmFuc3Bvc2UoKSAqICh5LnJvd3dpc2UoKSAtIHlfbWVhbikgLyBudW1fb2JzZXJ2YXRpb25zOworfQorXGVuZGNvZGUKK1doZW4gdHJ5aW5nIHRvIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb2RlCitcY29kZQorTWF0cml4WGYgQyA9IE1hdHJpeFhmOjpaZXJvKDMsNik7Citjb3YoeCx5LCBDLmJsb2NrKDAsMCwzLDMpKTsKK1xlbmRjb2RlCit0aGUgY29tcGlsZXIgd2lsbCBmYWlsLCBiZWNhdXNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjb252ZXJ0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGJ5IFxjIE1hdHJpeFhmOjpibG9jaygpIGludG8gYSBub24tY29uc3QgXGMgTWF0cml4WGYmLiBUaGlzIGlzIHRoZSBjYXNlIGJlY2F1c2UgdGhlIGNvbXBpbGVyIHdhbnRzIHRvIHByb3RlY3QgeW91IGZyb20gd3JpdGluZyB5b3VyIHJlc3VsdCB0byBhIHRlbXBvcmFyeSBvYmplY3QuIEluIHRoaXMgc3BlY2lhbCBjYXNlIHRoaXMgcHJvdGVjdGlvbiBpcyBub3QgaW50ZW5kZWQgLS0gd2Ugd2FudCB0byB3cml0ZSB0byBhIHRlbXBvcmFyeSBvYmplY3QuIFNvIGhvdyBjYW4gd2Ugb3ZlcmNvbWUgdGhpcyBwcm9ibGVtPyAKKworVGhlIHNvbHV0aW9uIHdoaWNoIGlzIHByZWZlcnJlZCBhdCB0aGUgbW9tZW50IGlzIGJhc2VkIG9uIGEgbGl0dGxlIFxlbSBoYWNrLiBPbmUgbmVlZHMgdG8gcGFzcyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IGFuZCBpbnRlcm5hbGx5IHRoZSBjb25zdG5lc3MgbmVlZHMgdG8gYmUgY2FzdCBhd2F5LiBUaGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBmb3IgQzk4IGNvbXBsaWFudCBjb21waWxlcnMgd291bGQgYmUKK1xjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBjb3YoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgeCwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgeSwgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+IGNvbnN0ICYgQykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwbGFpbl9yb3dfdHlwZTxEZXJpdmVkPjo6dHlwZSBSb3dWZWN0b3JUeXBlOworCisgIGNvbnN0IFNjYWxhciBudW1fb2JzZXJ2YXRpb25zID0gc3RhdGljX2Nhc3Q8U2NhbGFyPih4LnJvd3MoKSk7CisKKyAgY29uc3QgUm93VmVjdG9yVHlwZSB4X21lYW4gPSB4LmNvbHdpc2UoKS5zdW0oKSAvIG51bV9vYnNlcnZhdGlvbnM7CisgIGNvbnN0IFJvd1ZlY3RvclR5cGUgeV9tZWFuID0geS5jb2x3aXNlKCkuc3VtKCkgLyBudW1fb2JzZXJ2YXRpb25zOworCisgIGNvbnN0X2Nhc3Q8IE1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgPihDKSA9CisgICAgKHgucm93d2lzZSgpIC0geF9tZWFuKS50cmFuc3Bvc2UoKSAqICh5LnJvd3dpc2UoKSAtIHlfbWVhbikgLyBudW1fb2JzZXJ2YXRpb25zOworfQorXGVuZGNvZGUKK1RoZSBpbXBsZW1lbnRhdGlvbiBhYm92ZSBkb2VzIG5vdyBub3Qgb25seSB3b3JrIHdpdGggdGVtcG9yYXJ5IGV4cHJlc3Npb25zIGJ1dCBpdCBhbHNvIGFsbG93cyB0byB1c2UgdGhlIGZ1bmN0aW9uIHdpdGggbWF0cmljZXMgb2YgYXJiaXRyYXJ5IGZsb2F0aW5nIHBvaW50IHNjYWxhciB0eXBlcy4KKworXGIgTm90ZTogVGhlIGNvbnN0IGNhc3QgaGFjayB3aWxsIG9ubHkgd29yayB3aXRoIHRlbXBsYXRlZCBmdW5jdGlvbnMuIEl0IHdpbGwgbm90IHdvcmsgd2l0aCB0aGUgTWF0cml4WGYgaW1wbGVtZW50YXRpb24gYmVjYXVzZSBpdCBpcyBub3QgcG9zc2libGUgdG8gY2FzdCBhIEJsb2NrIGV4cHJlc3Npb24gdG8gYSBNYXRyaXggcmVmZXJlbmNlIQorCisKKworXHNlY3Rpb24gVG9waWNSZXNpemluZ0luR2VuZXJpY0ltcGxlbWVudGF0aW9ucyBIb3cgdG8gcmVzaXplIG1hdHJpY2VzIGluIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zPworCitPbmUgbWlnaHQgdGhpbmsgd2UgYXJlIGRvbmUgbm93LCByaWdodD8gVGhpcyBpcyBub3QgY29tcGxldGVseSB0cnVlIGJlY2F1c2UgaW4gb3JkZXIgZm9yIG91ciBjb3ZhcmlhbmNlIGZ1bmN0aW9uIHRvIGJlIGdlbmVyaWNhbGx5IGFwcGxpY2FibGUsIHdlIHdhbnQgdGhlIGZvbGx3aW5nIGNvZGUgdG8gd29yaworXGNvZGUKK01hdHJpeFhmIHggPSBNYXRyaXhYZjo6UmFuZG9tKDEwMCwzKTsKK01hdHJpeFhmIHkgPSBNYXRyaXhYZjo6UmFuZG9tKDEwMCwzKTsKK01hdHJpeFhmIEM7Citjb3YoeCwgeSwgQyk7CitcZW5kY29kZQorVGhpcyBpcyBub3QgdGhlIGNhc2UgYW55bW9yZSwgd2hlbiB3ZSBhcmUgdXNpbmcgYW4gaW1wbGVtZW50YXRpb24gdGFraW5nIE1hdHJpeEJhc2UgYXMgYSBwYXJhbWV0ZXIuIEluIGdlbmVyYWwsIEVpZ2VuIHN1cHBvcnRzIGF1dG9tYXRpYyByZXNpemluZyBidXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRvIHNvIG9uIGV4cHJlc3Npb25zLiBXaHkgc2hvdWxkIHJlc2l6aW5nIG9mIGEgbWF0cml4IEJsb2NrIGJlIGFsbG93ZWQ/IEl0IGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ViLW1hdHJpeCBhbmQgd2UgZGVmaW5pdGVseSBkb24ndCB3YW50IHRvIHJlc2l6ZSB0aGF0LiBTbyBob3cgY2FuIHdlIGluY29ycG9yYXRlIHJlc2l6aW5nIGlmIHdlIGNhbm5vdCByZXNpemUgb24gTWF0cml4QmFzZT8gVGhlIHNvbHV0aW9uIGlzIHRvIHJlc2l6ZSB0aGUgZGVyaXZlZCBvYmplY3QgYXMgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KK1xjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgordm9pZCBjb3YoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgeCwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgeSwgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+IGNvbnN0ICYgQ18pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGxhaW5fcm93X3R5cGU8RGVyaXZlZD46OnR5cGUgUm93VmVjdG9yVHlwZTsKKworICBjb25zdCBTY2FsYXIgbnVtX29ic2VydmF0aW9ucyA9IHN0YXRpY19jYXN0PFNjYWxhcj4oeC5yb3dzKCkpOworCisgIGNvbnN0IFJvd1ZlY3RvclR5cGUgeF9tZWFuID0geC5jb2x3aXNlKCkuc3VtKCkgLyBudW1fb2JzZXJ2YXRpb25zOworICBjb25zdCBSb3dWZWN0b3JUeXBlIHlfbWVhbiA9IHkuY29sd2lzZSgpLnN1bSgpIC8gbnVtX29ic2VydmF0aW9uczsKKworICBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIEMgPSBjb25zdF9jYXN0PCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mID4oQ18pOworICAKKyAgQy5kZXJpdmVkKCkucmVzaXplKHguY29scygpLHguY29scygpKTsgLy8gcmVzaXplIHRoZSBkZXJpdmVkIG9iamVjdAorICBDID0gKHgucm93d2lzZSgpIC0geF9tZWFuKS50cmFuc3Bvc2UoKSAqICh5LnJvd3dpc2UoKSAtIHlfbWVhbikgLyBudW1fb2JzZXJ2YXRpb25zOworfQorXGVuZGNvZGUKK1RoaXMgaW1wbGVtZW50YXRpb24gaXMgbm93IHdvcmtpbmcgZm9yIHBhcmFtZXRlcnMgYmVpbmcgZXhwcmVzc2lvbnMgYW5kIGZvciBwYXJhbWV0ZXJzIGJlaW5nIG1hdHJpY2VzIGFuZCBoYXZpbmcgdGhlIHdyb25nIHNpemUuIFJlc2l6aW5nIHRoZSBleHByZXNzaW9ucyBkb2VzIG5vdCBkbyBhbnkgaGFybSBpbiB0aGlzIGNhc2UgdW5sZXNzIHRoZXkgYWN0dWFsbHkgcmVxdWlyZSByZXNpemluZy4gVGhhdCBtZWFucywgcGFzc2luZyBhbiBleHByZXNzaW9uIHdpdGggdGhlIHdyb25nIGRpbWVuc2lvbnMgd2lsbCByZXN1bHQgaW4gYSBydW4tdGltZSBlcnJvciAoaW4gZGVidWcgbW9kZSBvbmx5KSB3aGlsZSBwYXNzaW5nIGV4cHJlc3Npb25zIG9mIHRoZSBjb3JyZWN0IHNpemUgd2lsbCBqdXN0IHdvcmsgZmluZS4KKworXGIgTm90ZTogSW4gdGhlIGFib3ZlIGRpc2N1c3Npb24gdGhlIHRlcm1zIE1hdHJpeCBhbmQgQXJyYXkgYW5kIE1hdHJpeEJhc2UgYW5kIEFycmF5QmFzZSBjYW4gYmUgZXhjaGFuZ2VkIGFuZCBhbGwgYXJndW1lbnRzIHN0aWxsIGhvbGQuCisKK1xzZWN0aW9uIFRvcGljU3VtbWFyeSBTdW1tYXJ5CisKKyAgLSBUbyBzdW1tYXJpemUsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgdGFraW5nIG5vbi13cml0YWJsZSAoY29uc3QgcmVmZXJlbmNlZCkgb2JqZWN0cyBpcyBub3QgYSBiaWcgaXNzdWUgYW5kIGRvZXMgbm90IGxlYWQgdG8gcHJvYmxlbWF0aWMgc2l0dWF0aW9ucyBpbiB0ZXJtcyBvZiBjb21waWxpbmcgYW5kIHJ1bm5pbmcgeW91ciBwcm9ncmFtLiBIb3dldmVyLCBhIG5haXZlIGltcGxlbWVudGF0aW9uIGlzIGxpa2VseSB0byBpbnRyb2R1Y2UgdW5uZWNlc3NhcnkgdGVtcG9yYXJ5IG9iamVjdHMgaW4geW91ciBjb2RlLiBJbiBvcmRlciB0byBhdm9pZCBldmFsdWF0aW5nIHBhcmFtZXRlcnMgaW50byB0ZW1wb3JhcmllcywgcGFzcyB0aGVtIGFzIChjb25zdCkgcmVmZXJlbmNlcyB0byBNYXRyaXhCYXNlIG9yIEFycmF5QmFzZSAoc28gdGVtcGxhdGl6ZSB5b3VyIGZ1bmN0aW9uKS4KKworICAtIEZ1bmN0aW9ucyB0YWtpbmcgd3JpdGFibGUgKG5vbi1jb25zdCkgcGFyYW1ldGVycyBtdXN0IHRha2UgY29uc3QgcmVmZXJlbmNlcyBhbmQgY2FzdCBhd2F5IGNvbnN0bmVzcyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGJvZHkuCisKKyAgLSBGdW5jdGlvbnMgdGhhdCB0YWtlIGFzIHBhcmFtZXRlcnMgTWF0cml4QmFzZSAob3IgQXJyYXlCYXNlKSBvYmplY3RzLCBhbmQgcG90ZW50aWFsbHkgbmVlZCB0byByZXNpemUgdGhlbSAoaW4gdGhlIGNhc2Ugd2hlcmUgdGhleSBhcmUgcmVzaXphYmxlKSwgbXVzdCBjYWxsIHJlc2l6ZSgpIG9uIHRoZSBkZXJpdmVkIGNsYXNzLCBhcyByZXR1cm5lZCBieSBkZXJpdmVkKCkuCisqLworfQpkaWZmIC0tZ2l0IGEvZG9jL0kxNF9QcmVwcm9jZXNzb3JEaXJlY3RpdmVzLmRveCBiL2RvYy9JMTRfUHJlcHJvY2Vzc29yRGlyZWN0aXZlcy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5ZjA3MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9JMTRfUHJlcHJvY2Vzc29yRGlyZWN0aXZlcy5kb3gKQEAgLTAsMCArMSwxMTIgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXMgUHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMKKworWW91IGNhbiBjb250cm9sIHNvbWUgYXNwZWN0cyBvZiAlRWlnZW4gYnkgZGVmaW5pbmcgdGhlIHByZXByb2Nlc3NvciB0b2tlbnMgdXNpbmcgXGMgXCNkZWZpbmUuIFRoZXNlIG1hY3Jvcworc2hvdWxkIGJlIGRlZmluZWQgYmVmb3JlIGFueSAlRWlnZW4gaGVhZGVycyBhcmUgaW5jbHVkZWQuIE9mdGVuIHRoZXkgYXJlIGJlc3Qgc2V0IGluIHRoZSBwcm9qZWN0IG9wdGlvbnMuCisKK1RoaXMgcGFnZSBsaXN0cyB0aGUgcHJlcHJvY2Vzb3IgdG9rZW5zIHJlY29nbmlzZWQgYnkgJUVpZ2VuLgorCis8Yj5UYWJsZSBvZiBjb250ZW50czwvYj4KKyAgLSBccmVmIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc01ham9yCisgIC0gXHJlZiBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXNBc3NlcnRpb25zCisgIC0gXHJlZiBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXNQZXJmb3JtYW5jZQorICAtIFxyZWYgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzUGx1Z2lucworICAtIFxyZWYgVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzRGV2ZWxvcGVycworCisKK1xzZWN0aW9uIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc01ham9yIE1hY3JvcyB3aXRoIG1ham9yIGVmZmVjdHMKKworVGhlc2UgbWFjcm9zIGhhdmUgYSBtYWpvciBlZmZlY3QgYW5kIHR5cGljYWxseSBicmVhayB0aGUgQVBJIChBcHBsaWNhdGlvbiBQcm9ncmFtbWluZyBJbnRlcmZhY2UpIGFuZC9vciB0aGUKK0FCSSAoQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSkuIFRoaXMgY2FuIGJlIHJhdGhlciBkYW5nZXJvdXM6IGlmIHBhcnRzIG9mIHlvdXIgcHJvZ3JhbSBhcmUgY29tcGlsZWQgd2l0aAorb25lIG9wdGlvbiwgYW5kIG90aGVyIHBhcnRzIChvciBsaWJyYXJpZXMgdGhhdCB5b3UgdXNlKSBhcmUgY29tcGlsZWQgd2l0aCBhbm90aGVyIG9wdGlvbiwgeW91ciBwcm9ncmFtIG1heQorZmFpbCB0byBsaW5rIG9yIGV4aGliaXQgc3VidGxlIGJ1Z3MuIE5ldmVydGhlbGVzcywgdGhlc2Ugb3B0aW9ucyBjYW4gYmUgdXNlZnVsIGZvciBwZW9wbGUgd2hvIGtub3cgd2hhdCB0aGV5CithcmUgZG9pbmcuCisKKyAtIFxiIEVJR0VOMl9TVVBQT1JUIC0gaWYgZGVmaW5lZCwgZW5hYmxlcyB0aGUgRWlnZW4yIGNvbXBhdGliaWxpdHkgbW9kZS4gVGhpcyBpcyBtZWFudCB0byBlYXNlIHRoZSB0cmFuc2l0aW9uCisgICBvZiBFaWdlbjIgdG8gRWlnZW4zIChzZWUgXHJlZiBFaWdlbjJUb0VpZ2VuMykuIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuCisgLSBcYiBFSUdFTjJfU1VQUE9SVF9TVEFHRW5uX3h4eCAoZm9yIHZhcmlvdXMgdmFsdWVzIG9mIG5uIGFuZCB4eHgpIC0gc3RhZ2VkIG1pZ3JhdGlvbiBwYXRoIGZyb20gRWlnZW4yIHRvCisgICBFaWdlbjM7IHNlZSBccmVmIEVpZ2VuMlN1cHBvcnRNb2Rlcy4KKyAtIFxiIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSAtIHRoZSB0eXBlIGZvciBjb2x1bW4gYW5kIHJvdyBpbmRpY2VzIGluIG1hdHJpY2VzLCB2ZWN0b3JzIGFuZCBhcnJheQorICAgKERlbnNlQmFzZTo6SW5kZXgpLiBTZXQgdG8gXGMgc3RkOjpwdHJkaWZmX3QgYnkgZGVmYXVsdC4KKyAtIFxiIEVJR0VOX0RFRkFVTFRfSU9fRk9STUFUIC0gdGhlIElPRm9ybWF0IHRvIHVzZSB3aGVuIHByaW50aW5nIGEgbWF0cml4IGlmIG5vICNJT0Zvcm1hdCBpcyBzcGVjaWZpZWQuCisgICBEZWZhdWx0cyB0byB0aGUgI0lPRm9ybWF0IGNvbnN0cnVjdGVkIGJ5IHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIElPRm9ybWF0KCkuCisgLSBcYiBFSUdFTl9JTklUSUFMSVpFX01BVFJJQ0VTX0JZX1pFUk8gLSBpZiBkZWZpbmVkLCBhbGwgZW50cmllcyBvZiBuZXdseSBjb25zdHJ1Y3RlZCBtYXRyaWNlcyBhbmQgYXJyYXlzIGFyZQorICAgaW5pdGlhbGl6ZXMgdG8gemVybywgYXMgYXJlIG5ldyBlbnRyaWVzIGluIG1hdHJpY2VzIGFuZCBhcnJheXMgYWZ0ZXIgcmVzaXppbmcuIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuCisgLSBcYiBFSUdFTl9OT19BVVRPTUFUSUNfUkVTSVpJTkcgLSBpZiBkZWZpbmVkLCB0aGUgbWF0cmljZXMgKG9yIGFycmF5cykgb24gYm90aCBzaWRlcyBvZiBhbiBhc3NpZ25tZW50IAorICAgPHR0PmEgPSBiPC90dD4gaGF2ZSB0byBiZSBvZiB0aGUgc2FtZSBzaXplOyBvdGhlcndpc2UsICVFaWdlbiBhdXRvbWF0aWNhbGx5IHJlc2l6ZXMgXGMgYSBzbyB0aGF0IGl0IGlzIG9mCisgICB0aGUgY29ycmVjdCBzaXplLiBOb3QgZGVmaW5lZCBieSBkZWZhdWx0LgorCisKK1xzZWN0aW9uIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc0Fzc2VydGlvbnMgQXNzZXJ0aW9ucworCitUaGUgJUVpZ2VuIGxpYnJhcnkgY29udGFpbnMgbWFueSBhc3NlcnRpb25zIHRvIGd1YXJkIGFnYWluc3QgcHJvZ3JhbW1pbmcgZXJyb3JzLCBib3RoIGF0IGNvbXBpbGUgdGltZSBhbmQgYXQKK3J1biB0aW1lLiBIb3dldmVyLCB0aGVzZSBhc3NlcnRpb25zIGRvIGNvc3QgdGltZSBhbmQgY2FuIHRodXMgYmUgdHVybmVkIG9mZi4KKworIC0gXGIgRUlHRU5fTk9fREVCVUcgLSBkaXNhYmxlcyAlRWlnZW4ncyBhc3NlcnRpb25zIGlmIGRlZmluZWQuIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQsIHVubGVzcyB0aGUKKyAgIFxjIE5ERUJVRyBtYWNybyBpcyBkZWZpbmVkICh0aGlzIGlzIGEgc3RhbmRhcmQgQysrIG1hY3JvIHdoaWNoIGRpc2FibGVzIGFsbCBhc3NlcnRzKS4gCisgLSBcYiBFSUdFTl9OT19TVEFUSUNfQVNTRVJUIC0gaWYgZGVmaW5lZCwgY29tcGlsZS10aW1lIHN0YXRpYyBhc3NlcnRpb25zIGFyZSByZXBsYWNlZCBieSBydW50aW1lIGFzc2VydGlvbnM7IAorICAgdGhpcyBzYXZlcyBjb21waWxhdGlvbiB0aW1lLiBOb3QgZGVmaW5lZCBieSBkZWZhdWx0LgorIC0gXGIgZWlnZW5fYXNzZXJ0IC0gbWFjcm8gd2l0aCBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkIGluc2lkZSAlRWlnZW4gZm9yIGFzc2VydGlvbnMuIEJ5IGRlZmF1bHQsIGl0IGlzCisgICBiYXNpY2FsbHkgZGVmaW5lZCB0byBiZSBcYyBhc3NlcnQsIHdoaWNoIGFib3J0cyB0aGUgcHJvZ3JhbSBpZiB0aGUgYXNzZXJ0aW9uIGlzIHZpb2xhdGVkLiBSZWRlZmluZSB0aGlzCisgICBtYWNybyBpZiB5b3Ugd2FudCB0byBkbyBzb21ldGhpbmcgZWxzZSwgbGlrZSB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgLSBcYiBFSUdFTl9NUEwyX09OTFkgLSBkaXNhYmxlIG5vbiBNUEwyIGNvbXBhdGlibGUgZmVhdHVyZXMsIG9yIGluIG90aGVyIHdvcmRzIGRpc2FibGUgdGhlIGZlYXR1cmVzIHdoaWNoCisgICBhcmUgc3RpbGwgdW5kZXIgdGhlIExHUEwuCisKKworXHNlY3Rpb24gVG9waWNQcmVwcm9jZXNzb3JEaXJlY3RpdmVzUGVyZm9ybWFuY2UgQWxpZ25tZW50LCB2ZWN0b3JpemF0aW9uIGFuZCBwZXJmb3JtYW5jZSB0d2Vha2luZworCisgLSBcYiBFSUdFTl9ET05UX0FMSUdOIC0gZGlzYWJsZXMgYWxpZ25tZW50IGNvbXBsZXRlbHkuICVFaWdlbiB3aWxsIG5vdCB0cnkgdG8gYWxpZ24gaXRzIG9iamVjdHMgYW5kIGRvZXMgbm90CisgICBleHBlY3QgdGhhdCBhbnkgb2JqZWN0cyBwYXNzZWQgdG8gaXQgYXJlIGFsaWduZWQuIFRoaXMgd2lsbCB0dXJuIG9mZiB2ZWN0b3JpemF0aW9uLiBOb3QgZGVmaW5lZCBieSBkZWZhdWx0LgorIC0gXGIgRUlHRU5fRE9OVF9BTElHTl9TVEFUSUNBTExZIC0gZGlzYWJsZXMgYWxpZ25tZW50IG9mIGFycmF5cyBvbiB0aGUgc3RhY2suIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQsIHVubGVzcworICAgXGMgRUlHRU5fRE9OVF9BTElHTiBpcyBkZWZpbmVkLgorIC0gXGIgRUlHRU5fRE9OVF9WRUNUT1JJWkUgLSBkaXNhYmxlcyBleHBsaWNpdCB2ZWN0b3JpemF0aW9uIHdoZW4gZGVmaW5lZC4gTm90IGRlZmluZWQgYnkgZGVmYXVsdCwgdW5sZXNzIAorICAgYWxpZ25tZW50IGlzIGRpc2FibGVkIGJ5ICVFaWdlbidzIHBsYXRmb3JtIHRlc3Qgb3IgdGhlIHVzZXIgZGVmaW5pbmcgXGMgRUlHRU5fRE9OVF9BTElHTi4KKyAtIFxiIEVJR0VOX0ZBU1RfTUFUSCAtIGVuYWJsZXMgc29tZSBvcHRpbWl6YXRpb25zIHdoaWNoIG1pZ2h0IGFmZmVjdCB0aGUgYWNjdXJhY3kgb2YgdGhlIHJlc3VsdC4gVGhlIG9ubHkKKyAgIG9wdGltaXphdGlvbiB0aGlzIGN1cnJlbnRseSBpbmNsdWRlcyBpcyBzaW5nbGUgcHJlY2lzaW9uIHNpbigpIGFuZCBjb3MoKSBpbiB0aGUgcHJlc2VudCBvZiBTU0UKKyAgIHZlY3Rvcml6YXRpb24uIERlZmluZWQgYnkgZGVmYXVsdC4gCisgLSBcYiBFSUdFTl9VTlJPTExJTkdfTElNSVQgLSBkZWZpbmVzIHRoZSBzaXplIG9mIGEgbG9vcCB0byBlbmFibGUgbWV0YSB1bnJvbGxpbmcuIFNldCBpdCB0byB6ZXJvIHRvIGRpc2FibGUKKyAgIHVucm9sbGluZy4gVGhlIHNpemUgb2YgYSBsb29wIGhlcmUgaXMgZXhwcmVzc2VkIGluICVFaWdlbidzIG93biBub3Rpb24gb2YgIm51bWJlciBvZiBGTE9QUyIsIGl0IGRvZXMgbm90CisgICBjb3JyZXNwb25kIHRvIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvciB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gVGhlIGRlZmF1bHQgaXMgdmFsdWUgMTAwLiAKKworCitcc2VjdGlvbiBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXNQbHVnaW5zIFBsdWdpbnMKKworSXQgaXMgcG9zc2libGUgdG8gYWRkIG5ldyBtZXRob2RzIHRvIG1hbnkgZnVuZGFtZW50YWwgY2xhc3NlcyBpbiAlRWlnZW4gYnkgd3JpdGluZyBhIHBsdWdpbi4gQXMgZXhwbGFpbmVkIGluCit0aGUgc2VjdGlvbiBccmVmIEV4dGVuZGluZ01hdHJpeEJhc2UsIHRoZSBwbHVnaW4gaXMgc3BlY2lmaWVkIGJ5IGRlZmluaW5nIGEgXGMgRUlHRU5feHh4X1BMVUdJTiBtYWNyby4gVGhlCitmb2xsb3dpbmcgbWFjcm9zIGFyZSBzdXBwb3J0ZWQ7IG5vbmUgb2YgdGhlbSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0LgorCisgLSBcYiBFSUdFTl9BUlJBWV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgQXJyYXkgY2xhc3MuCisgLSBcYiBFSUdFTl9BUlJBWUJBU0VfUExVR0lOIC0gZmlsZW5hbWUgb2YgcGx1Z2luIGZvciBleHRlbmRpbmcgdGhlIEFycmF5QmFzZSBjbGFzcy4KKyAtIFxiIEVJR0VOX0NXSVNFX1BMVUdJTiAtIGZpbGVuYW1lIG9mIHBsdWdpbiBmb3IgZXh0ZW5kaW5nIHRoZSBDd2lzZSBjbGFzcy4KKyAtIFxiIEVJR0VOX0RFTlNFQkFTRV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgRGVuc2VCYXNlIGNsYXNzLgorIC0gXGIgRUlHRU5fRFlOQU1JQ1NQQVJTRU1BVFJJWF9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgRHluYW1pY1NwYXJzZU1hdHJpeCBjbGFzcy4KKyAtIFxiIEVJR0VOX01BVFJJWF9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgTWF0cml4IGNsYXNzLgorIC0gXGIgRUlHRU5fTUFUUklYQkFTRV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgTWF0cml4QmFzZSBjbGFzcy4KKyAtIFxiIEVJR0VOX1BMQUlOT0JKRUNUQkFTRV9QTFVHSU4gLSBmaWxlbmFtZSBvZiBwbHVnaW4gZm9yIGV4dGVuZGluZyB0aGUgUGxhaW5PYmplY3RCYXNlIGNsYXNzLgorIC0gXGIgRUlHRU5fUVVBVEVSTklPTkJBU0VfUExVR0lOIC0gZmlsZW5hbWUgb2YgcGx1Z2luIGZvciBleHRlbmRpbmcgdGhlIFF1YXRlcm5pb25CYXNlIGNsYXNzLgorIC0gXGIgRUlHRU5fU1BBUlNFTUFUUklYX1BMVUdJTiAtIGZpbGVuYW1lIG9mIHBsdWdpbiBmb3IgZXh0ZW5kaW5nIHRoZSBTcGFyc2VNYXRyaXggY2xhc3MuCisgLSBcYiBFSUdFTl9TUEFSU0VNQVRSSVhCQVNFX1BMVUdJTiAtIGZpbGVuYW1lIG9mIHBsdWdpbiBmb3IgZXh0ZW5kaW5nIHRoZSBTcGFyc2VNYXRyaXhCYXNlIGNsYXNzLgorIC0gXGIgRUlHRU5fU1BBUlNFVkVDVE9SX1BMVUdJTiAtIGZpbGVuYW1lIG9mIHBsdWdpbiBmb3IgZXh0ZW5kaW5nIHRoZSBTcGFyc2VWZWN0b3IgY2xhc3MuCisgLSBcYiBFSUdFTl9UUkFOU0ZPUk1fUExVR0lOIC0gZmlsZW5hbWUgb2YgcGx1Z2luIGZvciBleHRlbmRpbmcgdGhlIFRyYW5zZm9ybSBjbGFzcy4KKyAtIFxiIEVJR0VOX0ZVTkNUT1JTX1BMVUdJTiAtIGZpbGVuYW1lIG9mIHBsdWdpbiBmb3IgYWRkaW5nIG5ldyBmdW5jdG9ycyBhbmQgc3BlY2lhbGl6YXRpb25zIG9mIGZ1bmN0b3JfdHJhaXRzLgorCisKK1xzZWN0aW9uIFRvcGljUHJlcHJvY2Vzc29yRGlyZWN0aXZlc0RldmVsb3BlcnMgTWFjcm9zIGZvciBFaWdlbiBkZXZlbG9wZXJzCisKK1RoZXNlIG1hY3JvcyBhcmUgbWFpbmx5IG1lYW50IGZvciBwZW9wbGUgZGV2ZWxvcGluZyAlRWlnZW4gYW5kIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBFdmVuIHRob3VnaCwgdGhleSBtaWdodCBiZSB1c2VmdWwgZm9yIHBvd2VyIHVzZXJzIGFuZCB0aGUgY3VyaW91cyBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nIHB1cnBvc2UsIHRoZXkgXGIgc2hvdWxkIFxiIG5vdCBcYiBiZSBcYiB1c2VkIGJ5IHJlYWwtd29yZCBjb2RlLgorCisgLSBcYiBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUiAtIHdoZW4gZGVmaW5lZCwgdGhlIGRlZmF1bHQgc3RvcmFnZSBvcmRlciBmb3IgbWF0cmljZXMgYmVjb21lcyByb3ctbWFqb3IKKyAgIGluc3RlYWQgb2YgY29sdW1uLW1ham9yLiBOb3QgZGVmaW5lZCBieSBkZWZhdWx0LgorIC0gXGIgRUlHRU5fSU5URVJOQUxfREVCVUdHSU5HIC0gaWYgZGVmaW5lZCwgZW5hYmxlcyBhc3NlcnRpb25zIGluICVFaWdlbidzIGludGVybmFsIHJvdXRpbmVzLiBUaGlzIGlzIHVzZWZ1bAorICAgZm9yIGRlYnVnZ2luZyAlRWlnZW4gaXRzZWxmLiBOb3QgZGVmaW5lZCBieSBkZWZhdWx0LgorIC0gXGIgRUlHRU5fTk9fTUFMTE9DIC0gaWYgZGVmaW5lZCwgYW55IHJlcXVlc3QgZnJvbSBpbnNpZGUgdGhlICVFaWdlbiB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSB0aGUgaGVhcAorICAgcmVzdWx0cyBpbiBhbiBhc3NlcnRpb24gZmFpbHVyZS4gVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgdGhhdCBzb21lIHJvdXRpbmUgZG9lcyBub3QgYWxsb2NhdGUgbWVtb3J5CisgICBkeW5hbWljYWxseS4gTm90IGRlZmluZWQgYnkgZGVmYXVsdC4KKyAtIFxiIEVJR0VOX1JVTlRJTUVfTk9fTUFMTE9DIC0gaWYgZGVmaW5lZCwgYSBuZXcgc3dpdGNoIGlzIGludHJvZHVjZWQgd2hpY2ggY2FuIGJlIHR1cm5lZCBvbiBhbmQgb2ZmIGJ5CisgICBjYWxsaW5nIDx0dD5zZXRfaXNfbWFsbG9jX2FsbG93ZWQoYm9vbCk8L3R0Pi4gSWYgbWFsbG9jIGlzIG5vdCBhbGxvd2VkIGFuZCAlRWlnZW4gdHJpZXMgdG8gYWxsb2NhdGUgbWVtb3J5CisgICBkeW5hbWljYWxseSBhbnl3YXksIGFuIGFzc2VydGlvbiBmYWlsdXJlIHJlc3VsdHMuIE5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuCisKKyovCisKK30KZGlmZiAtLWdpdCBhL2RvYy9JMTVfU3RvcmFnZU9yZGVycy5kb3ggYi9kb2MvSTE1X1N0b3JhZ2VPcmRlcnMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTg5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSTE1X1N0b3JhZ2VPcmRlcnMuZG94CkBAIC0wLDAgKzEsODkgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBUb3BpY1N0b3JhZ2VPcmRlcnMgU3RvcmFnZSBvcmRlcnMKKworVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgc3RvcmFnZSBvcmRlcnMgZm9yIG1hdHJpY2VzIGFuZCB0d28tZGltZW5zaW9uYWwgYXJyYXlzOiBjb2x1bW4tbWFqb3IgYW5kIHJvdy1tYWpvci4KK1RoaXMgcGFnZSBleHBsYWlucyB0aGVzZSBzdG9yYWdlIG9yZGVycyBhbmQgaG93IHRvIHNwZWNpZnkgd2hpY2ggb25lIHNob3VsZCBiZSB1c2VkLgorCis8Yj5UYWJsZSBvZiBjb250ZW50czwvYj4KKyAgLSBccmVmIFRvcGljU3RvcmFnZU9yZGVyc0ludHJvCisgIC0gXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnNJbkVpZ2VuCisgIC0gXHJlZiBUb3BpY1N0b3JhZ2VPcmRlcnNXaGljaAorCisKK1xzZWN0aW9uIFRvcGljU3RvcmFnZU9yZGVyc0ludHJvIENvbHVtbi1tYWpvciBhbmQgcm93LW1ham9yIHN0b3JhZ2UKKworVGhlIGVudHJpZXMgb2YgYSBtYXRyaXggZm9ybSBhIHR3by1kaW1lbnNpb25hbCBncmlkLiBIb3dldmVyLCB3aGVuIHRoZSBtYXRyaXggaXMgc3RvcmVkIGluIG1lbW9yeSwgdGhlIGVudHJpZXMKK2hhdmUgdG8gc29tZWhvdyBiZSBsYWlkIG91dCBsaW5lYXJseS4gVGhlcmUgYXJlIHR3byBtYWluIHdheXMgdG8gZG8gdGhpcywgYnkgcm93IGFuZCBieSBjb2x1bW4uCisKK1dlIHNheSB0aGF0IGEgbWF0cml4IGlzIHN0b3JlZCBpbiBcYiByb3ctbWFqb3Igb3JkZXIgaWYgaXQgaXMgc3RvcmVkIHJvdyBieSByb3cuIFRoZSBlbnRpcmUgZmlyc3Qgcm93IGlzCitzdG9yZWQgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBlbnRpcmUgc2Vjb25kIHJvdywgYW5kIHNvIG9uLiBDb25zaWRlciBmb3IgZXhhbXBsZSB0aGUgbWF0cml4CisKK1xmWworQSA9IFxiZWdpbntibWF0cml4fQorOCAmIDIgJiAyICYgOSBcXAorOSAmIDEgJiA0ICYgNCBcXAorMyAmIDUgJiA0ICYgNQorXGVuZHtibWF0cml4fS4KK1xmXQorCitJZiB0aGlzIG1hdHJpeCBpcyBzdG9yZWQgaW4gcm93LW1ham9yIG9yZGVyLCB0aGVuIHRoZSBlbnRyaWVzIGFyZSBsYWlkIG91dCBpbiBtZW1vcnkgYXMgZm9sbG93czoKKworXGNvZGUgOCAyIDIgOSA5IDEgNCA0IDMgNSA0IDUgXGVuZGNvZGUKKworT24gdGhlIG90aGVyIGhhbmQsIGEgbWF0cml4IGlzIHN0b3JlZCBpbiBcYiBjb2x1bW4tbWFqb3Igb3JkZXIgaWYgaXQgaXMgc3RvcmVkIGNvbHVtbiBieSBjb2x1bW4sIHN0YXJ0aW5nIHdpdGgKK3RoZSBlbnRpcmUgZmlyc3QgY29sdW1uLCBmb2xsb3dlZCBieSB0aGUgZW50aXJlIHNlY29uZCBjb2x1bW4sIGFuZCBzbyBvbi4gSWYgdGhlIGFib3ZlIG1hdHJpeCBpcyBzdG9yZWQgaW4KK2NvbHVtbi1tYWpvciBvcmRlciwgaXQgaXMgbGFpZCBvdXQgYXMgZm9sbG93czoKKworXGNvZGUgOCA5IDMgMiAxIDUgMiA0IDQgOSA0IDUgXGVuZGNvZGUKKworVGhpcyBleGFtcGxlIGlzIGlsbHVzdHJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgRWlnZW4gY29kZS4gSXQgdXNlcyB0aGUgUGxhaW5PYmplY3RCYXNlOjpkYXRhKCkgZnVuY3Rpb24sIHdoaWNoCityZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5IGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgbWF0cml4LgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlPC90aD48dGg+T3V0cHV0PC90aD48L3RyPgorPHRyPjx0ZD4KK1xpbmNsdWRlIFRvcGljU3RvcmFnZU9yZGVyc19leGFtcGxlLmNwcAorPC90ZD4KKzx0ZD4KK1x2ZXJiaW5jbHVkZSBUb3BpY1N0b3JhZ2VPcmRlcnNfZXhhbXBsZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCisKK1xzZWN0aW9uIFRvcGljU3RvcmFnZU9yZGVyc0luRWlnZW4gU3RvcmFnZSBvcmRlcnMgaW4gRWlnZW4KKworVGhlIHN0b3JhZ2Ugb3JkZXIgb2YgYSBtYXRyaXggb3IgYSB0d28tZGltZW5zaW9uYWwgYXJyYXkgY2FuIGJlIHNldCBieSBzcGVjaWZ5aW5nIHRoZSBcYyBPcHRpb25zIHRlbXBsYXRlCitwYXJhbWV0ZXIgZm9yIE1hdHJpeCBvciBBcnJheS4gQXMgXHJlZiBUdXRvcmlhbE1hdHJpeENsYXNzIGV4cGxhaW5zLCB0aGUgJU1hdHJpeCBjbGFzcyB0ZW1wbGF0ZSBoYXMgc2l4Cit0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBvZiB3aGljaCB0aHJlZSBhcmUgY29tcHVsc29yeSAoXGMgU2NhbGFyLCBcYyBSb3dzQXRDb21waWxlVGltZSBhbmQgXGMgQ29sc0F0Q29tcGlsZVRpbWUpCithbmQgdGhyZWUgYXJlIG9wdGlvbmFsIChcYyBPcHRpb25zLCBcYyBNYXhSb3dzQXRDb21waWxlVGltZSBhbmQgXGMgTWF4Q29sc0F0Q29tcGlsZVRpbWUpLiBJZiB0aGUgXGMgT3B0aW9ucworcGFyYW1ldGVyIGlzIHNldCB0byBcYyBSb3dNYWpvciwgdGhlbiB0aGUgbWF0cml4IG9yIGFycmF5IGlzIHN0b3JlZCBpbiByb3ctbWFqb3Igb3JkZXI7IGlmIGl0IGlzIHNldCB0byAKK1xjIENvbE1ham9yLCB0aGVuIGl0IGlzIHN0b3JlZCBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgaW4gdGhlIGFib3ZlIEVpZ2VuIHByb2dyYW0gdG8KK3NwZWNpZnkgdGhlIHN0b3JhZ2Ugb3JkZXIuCisKK0lmIHRoZSBzdG9yYWdlIG9yZGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gRWlnZW4gZGVmYXVsdHMgdG8gc3RvcmluZyB0aGUgZW50cnkgaW4gY29sdW1uLW1ham9yLiBUaGlzIGlzIGFsc28KK3RoZSBjYXNlIGlmIG9uZSBvZiB0aGUgY29udmVuaWVuY2UgdHlwZWRlZnMgKFxjIE1hdHJpeDNmLCBcYyBBcnJheVhYZCwgZXRjLikgaXMgdXNlZC4KKworTWF0cmljZXMgYW5kIGFycmF5cyB1c2luZyBvbmUgc3RvcmFnZSBvcmRlciBjYW4gYmUgYXNzaWduZWQgdG8gbWF0cmljZXMgYW5kIGFycmF5cyB1c2luZyB0aGUgb3RoZXIgc3RvcmFnZQorb3JkZXIsIGFzIGhhcHBlbnMgaW4gdGhlIGFib3ZlIHByb2dyYW0gd2hlbiBcYyBBcm93bWFqb3IgaXMgaW5pdGlhbGl6ZWQgdXNpbmcgXGMgQWNvbG1ham9yLiBFaWdlbiB3aWxsIHJlb3JkZXIKK3RoZSBlbnRyaWVzIGF1dG9tYXRpY2FsbHkuIE1vcmUgZ2VuZXJhbGx5LCByb3ctbWFqb3IgYW5kIGNvbHVtbi1tYWpvciBtYXRyaWNlcyBjYW4gYmUgbWl4ZWQgaW4gYW4gZXhwcmVzc2lvbgorYXMgd2Ugd2FudC4KKworCitcc2VjdGlvbiBUb3BpY1N0b3JhZ2VPcmRlcnNXaGljaCBXaGljaCBzdG9yYWdlIG9yZGVyIHRvIGNob29zZT8KKworU28sIHdoaWNoIHN0b3JhZ2Ugb3JkZXIgc2hvdWxkIHlvdSB1c2UgaW4geW91ciBwcm9ncmFtPyBUaGVyZSBpcyBubyBzaW1wbGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb247IGl0IGRlcGVuZHMKK29uIHlvdXIgYXBwbGljYXRpb24uIEhlcmUgYXJlIHNvbWUgcG9pbnRzIHRvIGtlZXAgaW4gbWluZDoKKworICAtIFlvdXIgdXNlcnMgbWF5IGV4cGVjdCB5b3UgdG8gdXNlIGEgc3BlY2lmaWMgc3RvcmFnZSBvcmRlci4gQWx0ZXJuYXRpdmVseSwgeW91IG1heSB1c2Ugb3RoZXIgbGlicmFyaWVzIHRoYW4KKyAgICBFaWdlbiwgYW5kIHRoZXNlIG90aGVyIGxpYnJhcmllcyBtYXkgZXhwZWN0IGEgY2VydGFpbiBzdG9yYWdlIG9yZGVyLiBJbiB0aGVzZSBjYXNlcyBpdCBtYXkgYmUgZWFzaWVzdCBhbmQKKyAgICBmYXN0ZXN0IHRvIHVzZSB0aGlzIHN0b3JhZ2Ugb3JkZXIgaW4geW91ciB3aG9sZSBwcm9ncmFtLgorICAtIEFsZ29yaXRobXMgdGhhdCB0cmF2ZXJzZSBhIG1hdHJpeCByb3cgYnkgcm93IHdpbGwgZ28gZmFzdGVyIHdoZW4gdGhlIG1hdHJpeCBpcyBzdG9yZWQgaW4gcm93LW1ham9yIG9yZGVyCisgICAgYmVjYXVzZSBvZiBiZXR0ZXIgZGF0YSBsb2NhbGl0eS4gU2ltaWxhcmx5LCBjb2x1bW4tYnktY29sdW1uIHRyYXZlcnNhbCBpcyBmYXN0ZXIgZm9yIGNvbHVtbi1tYWpvcgorICAgIG1hdHJpY2VzLiBJdCBtYXkgYmUgd29ydGh3aGlsZSB0byBleHBlcmltZW50IGEgYml0IHRvIGZpbmQgb3V0IHdoYXQgaXMgZmFzdGVyIGZvciB5b3VyIHBhcnRpY3VsYXIKKyAgICBhcHBsaWNhdGlvbi4KKyAgLSBUaGUgZGVmYXVsdCBpbiBFaWdlbiBpcyBjb2x1bW4tbWFqb3IuIE5hdHVyYWxseSwgbW9zdCBvZiB0aGUgZGV2ZWxvcG1lbnQgYW5kIHRlc3Rpbmcgb2YgdGhlIEVpZ2VuIGxpYnJhcnkKKyAgICBpcyB0aHVzIGRvbmUgd2l0aCBjb2x1bW4tbWFqb3IgbWF0cmljZXMuIFRoaXMgbWVhbnMgdGhhdCwgZXZlbiB0aG91Z2ggd2UgYWltIHRvIHN1cHBvcnQgY29sdW1uLW1ham9yIGFuZAorICAgIHJvdy1tYWpvciBzdG9yYWdlIG9yZGVycyB0cmFuc3BhcmVudGx5LCB0aGUgRWlnZW4gbGlicmFyeSBtYXkgd2VsbCB3b3JrIGJlc3Qgd2l0aCBjb2x1bW4tbWFqb3IgbWF0cmljZXMuCisKKyovCit9CmRpZmYgLS1naXQgYS9kb2MvSTE2X1RlbXBsYXRlS2V5d29yZC5kb3ggYi9kb2MvSTE2X1RlbXBsYXRlS2V5d29yZC5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0NTMyMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9JMTZfVGVtcGxhdGVLZXl3b3JkLmRveApAQCAtMCwwICsxLDEzNiBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljVGVtcGxhdGVLZXl3b3JkIFRoZSB0ZW1wbGF0ZSBhbmQgdHlwZW5hbWUga2V5d29yZHMgaW4gQysrCisKK1RoZXJlIGFyZSB0d28gdXNlcyBmb3IgdGhlIFxjIHRlbXBsYXRlIGFuZCBcYyB0eXBlbmFtZSBrZXl3b3JkcyBpbiBDKysuIE9uZSBvZiB0aGVtIGlzIGZhaXJseSB3ZWxsIGtub3duCithbW9uZ3N0IHByb2dyYW1tZXJzOiB0byBkZWZpbmUgdGVtcGxhdGVzLiBUaGUgb3RoZXIgdXNlIGlzIG1vcmUgb2JzY3VyZTogdG8gc3BlY2lmeSB0aGF0IGFuIGV4cHJlc3Npb24gcmVmZXJzCit0byBhIHRlbXBsYXRlIGZ1bmN0aW9uIG9yIGEgdHlwZS4gVGhpcyByZWd1bGFybHkgdHJpcHMgdXAgcHJvZ3JhbW1lcnMgdGhhdCB1c2UgdGhlICVFaWdlbiBsaWJyYXJ5LCBvZnRlbgorbGVhZGluZyB0byBlcnJvciBtZXNzYWdlcyBmcm9tIHRoZSBjb21waWxlciB0aGF0IGFyZSBkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZC4KKworPGI+VGFibGUgb2YgY29udGVudHM8L2I+CisgIC0gXHJlZiBUb3BpY1RlbXBsYXRlS2V5d29yZFRvRGVmaW5lVGVtcGxhdGVzCisgIC0gXHJlZiBUb3BpY1RlbXBsYXRlS2V5d29yZEV4YW1wbGUKKyAgLSBccmVmIFRvcGljVGVtcGxhdGVLZXl3b3JkRXhwbGFuYXRpb24KKyAgLSBccmVmIFRvcGljVGVtcGxhdGVLZXl3b3JkUmVzb3VyY2VzCisKKworXHNlY3Rpb24gVG9waWNUZW1wbGF0ZUtleXdvcmRUb0RlZmluZVRlbXBsYXRlcyBVc2luZyB0aGUgdGVtcGxhdGUgYW5kIHR5cGVuYW1lIGtleXdvcmRzIHRvIGRlZmluZSB0ZW1wbGF0ZXMKKworVGhlIFxjIHRlbXBsYXRlIGFuZCBcYyB0eXBlbmFtZSBrZXl3b3JkcyBhcmUgcm91dGluZWx5IHVzZWQgdG8gZGVmaW5lIHRlbXBsYXRlcy4gVGhpcyBpcyBub3QgdGhlIHRvcGljIG9mIHRoaXMKK3BhZ2UgYXMgd2UgYXNzdW1lIHRoYXQgdGhlIHJlYWRlciBpcyBhd2FyZSBvZiB0aGlzIChvdGhlcndpc2UgY29uc3VsdCBhIEMrKyBib29rKS4gVGhlIGZvbGxvd2luZyBleGFtcGxlCitzaG91bGQgaWxsdXN0cmF0ZSB0aGlzIHVzZSBvZiB0aGUgXGMgdGVtcGxhdGUga2V5d29yZC4KKworXGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBpc1Bvc2l0aXZlKFQgeCkKK3sKKyAgICByZXR1cm4geCA+IDA7Cit9CitcZW5kY29kZQorCitXZSBjb3VsZCBqdXN0IGFzIHdlbGwgaGF2ZSB3cml0dGVuIDx0dD50ZW1wbGF0ZSAmbHQ7Y2xhc3MgVCZndDs8L3R0PjsgdGhlIGtleXdvcmRzIFxjIHR5cGVuYW1lIGFuZCBcYyBjbGFzcyBoYXZlIHRoZQorc2FtZSBtZWFuaW5nIGluIHRoaXMgY29udGV4dC4KKworCitcc2VjdGlvbiBUb3BpY1RlbXBsYXRlS2V5d29yZEV4YW1wbGUgQW4gZXhhbXBsZSBzaG93aW5nIHRoZSBzZWNvbmQgdXNlIG9mIHRoZSB0ZW1wbGF0ZSBrZXl3b3JkCisKK0xldCB1cyBpbGx1c3RyYXRlIHRoZSBzZWNvbmQgdXNlIG9mIHRoZSBcYyB0ZW1wbGF0ZSBrZXl3b3JkIHdpdGggYW4gZXhhbXBsZS4gU3VwcG9zZSB3ZSB3YW50IHRvIHdyaXRlIGEKK2Z1bmN0aW9uIHdoaWNoIGNvcGllcyBhbGwgZW50cmllcyBpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IG9mIGEgbWF0cml4IGludG8gYW5vdGhlciBtYXRyaXgsIHdoaWxlIGtlZXBpbmcKK3RoZSBsb3dlciB0cmlhbmd1bGFyIHBhcnQgdW5jaGFuZ2VkLiBBIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZSBhcyBmb2xsb3dzOgorCis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5FeGFtcGxlOjwvdGg+PHRoPk91dHB1dDo8L3RoPjwvdHI+Cis8dHI+PHRkPgorXGluY2x1ZGUgVGVtcGxhdGVLZXl3b3JkX3NpbXBsZS5jcHAKKzwvdGQ+Cis8dGQ+CitcdmVyYmluY2x1ZGUgVGVtcGxhdGVLZXl3b3JkX3NpbXBsZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGF0IHdvcmtzIGZpbmUsIGJ1dCBpdCBpcyBub3QgdmVyeSBmbGV4aWJsZS4gRmlyc3QsIGl0IG9ubHkgd29ya3Mgd2l0aCBkeW5hbWljLXNpemUgbWF0cmljZXMgb2YKK3NpbmdsZS1wcmVjaXNpb24gZmxvYXRzOyB0aGUgZnVuY3Rpb24gXGMgY29weVVwcGVyVHJpYW5ndWxhclBhcnQoKSBkb2VzIG5vdCBhY2NlcHQgc3RhdGljLXNpemUgbWF0cmljZXMgb3IKK21hdHJpY2VzIHdpdGggZG91YmxlLXByZWNpc2lvbiBudW1iZXJzLiBTZWNvbmQsIGlmIHlvdSB1c2UgYW4gZXhwcmVzc2lvbiBzdWNoIGFzCis8dHQ+bWF0LnRvcExlZnRDb3JuZXIoMywzKTwvdHQ+IGFzIHRoZSBwYXJhbWV0ZXIgXGMgc3JjLCB0aGVuIHRoaXMgaXMgY29waWVkIGludG8gYSB0ZW1wb3JhcnkgdmFyaWFibGUgb2YgdHlwZQorTWF0cml4WGY7IHRoaXMgY29weSBjYW4gYmUgYXZvaWRlZC4KKworQXMgZXhwbGFpbmVkIGluIFxyZWYgVG9waWNGdW5jdGlvblRha2luZ0VpZ2VuVHlwZXMsIGJvdGggaXNzdWVzIGNhbiBiZSByZXNvbHZlZCBieSBtYWtpbmcgCitcYyBjb3B5VXBwZXJUcmlhbmd1bGFyUGFydCgpIGFjY2VwdCBhbnkgb2JqZWN0IG9mIHR5cGUgTWF0cml4QmFzZS4gVGhpcyBsZWFkcyB0byB0aGUgZm9sbG93aW5nIGNvZGU6CisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPkV4YW1wbGU6PC90aD48dGg+T3V0cHV0OjwvdGg+PC90cj4KKzx0cj48dGQ+CitcaW5jbHVkZSBUZW1wbGF0ZUtleXdvcmRfZmxleGlibGUuY3BwCis8L3RkPgorPHRkPgorXHZlcmJpbmNsdWRlIFRlbXBsYXRlS2V5d29yZF9mbGV4aWJsZS5vdXQKKzwvdGQ+PC90cj48L3RhYmxlPgorCitUaGUgb25lIGxpbmUgaW4gdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIFxjIGNvcHlVcHBlclRyaWFuZ3VsYXJQYXJ0KCkgc2hvd3MgdGhlIHNlY29uZCwgbW9yZSBvYnNjdXJlIHVzZSBvZgordGhlIFxjIHRlbXBsYXRlIGtleXdvcmQgaW4gQysrLiAgRXZlbiB0aG91Z2ggaXQgbWF5IGxvb2sgc3RyYW5nZSwgdGhlIFxjIHRlbXBsYXRlIGtleXdvcmRzIGFyZSBuZWNlc3NhcnkKK2FjY29yZGluZyB0byB0aGUgc3RhbmRhcmQuIFdpdGhvdXQgaXQsIHRoZSBjb21waWxlciBtYXkgcmVqZWN0IHRoZSBjb2RlIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBsaWtlICJubyBtYXRjaAorZm9yIG9wZXJhdG9yPCIuCisKKworXHNlY3Rpb24gVG9waWNUZW1wbGF0ZUtleXdvcmRFeHBsYW5hdGlvbiBFeHBsYW5hdGlvbgorCitUaGUgcmVhc29uIHRoYXQgdGhlIFxjIHRlbXBsYXRlIGtleXdvcmQgaXMgbmVjZXNzYXJ5IGluIHRoZSBsYXN0IGV4YW1wbGUgaGFzIHRvIGRvIHdpdGggdGhlIHJ1bGVzIGZvciBob3cKK3RlbXBsYXRlcyBhcmUgc3VwcG9zZWQgdG8gYmUgY29tcGlsZWQgaW4gQysrLiBUaGUgY29tcGlsZXIgaGFzIHRvIGNoZWNrIHRoZSBjb2RlIGZvciBjb3JyZWN0IHN5bnRheCBhdCB0aGUKK3BvaW50IHdoZXJlIHRoZSB0ZW1wbGF0ZSBpcyBkZWZpbmVkLCB3aXRob3V0IGtub3dpbmcgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIChcYyBEZXJpdmVkMQorYW5kIFxjIERlcml2ZWQyIGluIHRoZSBleGFtcGxlKS4gVGhhdCBtZWFucyB0aGF0IHRoZSBjb21waWxlciBjYW5ub3Qga25vdyB0aGF0IDx0dD5kc3QudHJpYW5ndWxhclBhcnQ8L3R0PiBpcworYSBtZW1iZXIgdGVtcGxhdGUgYW5kIHRoYXQgdGhlIGZvbGxvd2luZyAmbHQ7IHN5bWJvbCBpcyBwYXJ0IG9mIHRoZSBkZWxpbWl0ZXIgZm9yIHRoZSB0ZW1wbGF0ZQorcGFyYW1ldGVyLiBBbm90aGVyIHBvc3NpYmlsaXR5IHdvdWxkIGJlIHRoYXQgPHR0PmRzdC50cmlhbmd1bGFyUGFydDwvdHQ+IGlzIGEgbWVtYmVyIHZhcmlhYmxlIHdpdGggdGhlICZsdDsKK3N5bWJvbCByZWZlcmluZyB0byB0aGUgPHR0Pm9wZXJhdG9yJmx0OygpPC90dD4gZnVuY3Rpb24uIEluIGZhY3QsIHRoZSBjb21waWxlciBzaG91bGQgY2hvb3NlIHRoZSBzZWNvbmQKK3Bvc3NpYmlsaXR5LCBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkLiBJZiA8dHQ+ZHN0LnRyaWFuZ3VsYXJQYXJ0PC90dD4gaXMgYSBtZW1iZXIgdGVtcGxhdGUgKGFzIGluIG91ciBjYXNlKSwKK3RoZSBwcm9ncmFtbWVyIHNob3VsZCBzcGVjaWZ5IHRoaXMgZXhwbGljaXRseSB3aXRoIHRoZSBcYyB0ZW1wbGF0ZSBrZXl3b3JkIGFuZCB3cml0ZSA8dHQ+ZHN0LnRlbXBsYXRlCit0cmlhbmd1bGFyUGFydDwvdHQ+LgorCitUaGUgcHJlY2lzZSBydWxlcyBhcmUgcmF0aGVyIGNvbXBsaWNhdGVkLCBidXQgaWdub3Jpbmcgc29tZSBzdWJ0bGV0aWVzIHdlIGNhbiBzdW1tYXJpemUgdGhlbSBhcyBmb2xsb3dzOgorLSBBIDxlbT5kZXBlbmRlbnQgbmFtZTwvZW0+IGlzIG5hbWUgdGhhdCBkZXBlbmRzIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBvbiBhIHRlbXBsYXRlIHBhcmFtZXRlci4gSW4gdGhlCisgIGV4YW1wbGUsIFxjIGRzdCBpcyBhIGRlcGVuZGVudCBuYW1lIGJlY2F1c2UgaXQgaXMgb2YgdHlwZSA8dHQ+TWF0cml4QmFzZSZsdDtEZXJpdmVkMSZndDs8L3R0PiB3aGljaCBkZXBlbmRzCisgIG9uIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgXGMgRGVyaXZlZDEuCistIElmIHRoZSBjb2RlIGNvbnRhaW5zIGVpdGhlciBvbmUgb2YgdGhlIGNvbnRydWN0aW9ucyA8dHQ+eHh4Lnl5eTwvdHQ+IG9yIDx0dD54eHgtJmd0O3l5eTwvdHQ+IGFuZCBcYyB4eHggaXMgYQorICBkZXBlbmRlbnQgbmFtZSBhbmQgXGMgeXl5IHJlZmVycyB0byBhIG1lbWJlciB0ZW1wbGF0ZSwgdGhlbiB0aGUgXGMgdGVtcGxhdGUga2V5d29yZCBtdXN0IGJlIHVzZWQgYmVmb3JlIAorICBcYyB5eXksIGxlYWRpbmcgdG8gPHR0Pnh4eC50ZW1wbGF0ZSB5eXk8L3R0PiBvciA8dHQ+eHh4LSZndDt0ZW1wbGF0ZSB5eXk8L3R0Pi4KKy0gSWYgdGhlIGNvZGUgY29udGFpbnMgdGhlIGNvbnRydWN0aW9uIDx0dD54eHg6Onl5eTwvdHQ+IGFuZCBcYyB4eHggaXMgYSBkZXBlbmRlbnQgbmFtZSBhbmQgXGMgeXl5IHJlZmVycyB0byBhCisgIG1lbWJlciB0eXBlZGVmLCB0aGVuIHRoZSBcYyB0eXBlbmFtZSBrZXl3b3JkIG11c3QgYmUgdXNlZCBiZWZvcmUgdGhlIHdob2xlIGNvbnN0cnVjdGlvbiwgbGVhZGluZyB0bworICA8dHQ+dHlwZW5hbWUgeHh4Ojp5eXk8L3R0Pi4KKworQXMgYW4gZXhhbXBsZSB3aGVyZSB0aGUgXGMgdHlwZW5hbWUga2V5d29yZCBpcyByZXF1aXJlZCwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBjb2RlIGluIFxyZWYgVHV0b3JpYWxTcGFyc2UKK2ZvciBpdGVyYXRpbmcgb3ZlciB0aGUgbm9uLXplcm8gZW50cmllcyBvZiBhIHNwYXJzZSBtYXRyaXggdHlwZToKKworXGNvZGUKK1NwYXJzZU1hdHJpeFR5cGUgbWF0KHJvd3MsY29scyk7Citmb3IgKGludCBrPTA7IGs8bWF0Lm91dGVyU2l6ZSgpOyArK2spCisgIGZvciAoU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtYXQsayk7IGl0OyArK2l0KQorICB7CisgICAgLyogLi4uICovCisgIH0KK1xlbmRjb2RlCisKK0lmIFxjIFNwYXJzZU1hdHJpeFR5cGUgZGVwZW5kcyBvbiBhIHRlbXBsYXRlIHBhcmFtZXRlciwgdGhlbiB0aGUgXGMgdHlwZW5hbWUga2V5d29yZCBpcyByZXF1aXJlZDoKKworXGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBpdGVyYXRlT3ZlclNwYXJzZU1hdHJpeChjb25zdCBTcGFyc2VNYXRyaXg8VD4mIG1hdDsKK3sKKyAgZm9yIChpbnQgaz0wOyBrPG0xLm91dGVyU2l6ZSgpOyArK2spCisgICAgZm9yICh0eXBlbmFtZSBTcGFyc2VNYXRyaXg8VD46OklubmVySXRlcmF0b3IgaXQobWF0LGspOyBpdDsgKytpdCkKKyAgICB7CisgICAgICAvKiAuLi4gKi8KKyAgICB9Cit9CitcZW5kY29kZQorCisKK1xzZWN0aW9uIFRvcGljVGVtcGxhdGVLZXl3b3JkUmVzb3VyY2VzIFJlc291cmNlcyBmb3IgZnVydGhlciByZWFkaW5nCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBhIGZ1bGxlciBleHBsYW5hdGlvbiBvZiB0aGlzIHRvcGljLCB0aGUgcmVhZGVyIG1heSBjb25zdWx0IHRoZSBmb2xsb3dpbmcgc291cmNlczoKKy0gVGhlIGJvb2sgIkMrKyBUZW1wbGF0ZSBNZXRhcHJvZ3JhbW1pbmciIGJ5IERhdmlkIEFicmFoYW1zIGFuZCBBbGVrc2V5IEd1cnRvdm95IGNvbnRhaW5zIGEgdmVyeSBnb29kCisgIGV4cGxhbmF0aW9uIGluIEFwcGVuZGl4IEIgKCJUaGUgdHlwZW5hbWUgYW5kIHRlbXBsYXRlIEtleXdvcmRzIikgd2hpY2ggZm9ybWVkIHRoZSBiYXNpcyBmb3IgdGhpcyBwYWdlLgorLSBodHRwOi8vcGFnZXMuY3Mud2lzYy5lZHUvfmRyaXNjb2xsL3R5cGVuYW1lLmh0bWwKKy0gaHR0cDovL3d3dy5wYXJhc2hpZnQuY29tL2MrKy1mYXEtbGl0ZS90ZW1wbGF0ZXMuaHRtbCNmYXEtMzUuMTgKKy0gaHR0cDovL3d3dy5jb21lYXVjb21wdXRpbmcuY29tL3RlY2h0YWxrL3RlbXBsYXRlcy8jdGVtcGxhdGVwcmVmaXgKKy0gaHR0cDovL3d3dy5jb21lYXVjb21wdXRpbmcuY29tL3RlY2h0YWxrL3RlbXBsYXRlcy8jdHlwZW5hbWUKKworKi8KK30KZGlmZiAtLWdpdCBhL2RvYy9PdmVydmlldy5kb3ggYi9kb2MvT3ZlcnZpZXcuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTdjODUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvT3ZlcnZpZXcuZG94CkBAIC0wLDAgKzEsNjAgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKK28gLyoqIFxtYWlucGFnZSBFaWdlbgorCis8ZGl2IGNsYXNzPSJlaW1haW5tZW51Ij4KKyAgICBccmVmIEdldHRpbmdTdGFydGVkICAgICAgICJHZXR0aW5nIHN0YXJ0ZWQiCisgIHwgXHJlZiBUdXRvcmlhbE1hdHJpeENsYXNzICAiVHV0b3JpYWwiCisgIHwgXHJlZiBRdWlja1JlZlBhZ2UgICAgICAgICAiU2hvcnQgcmVmZXJlbmNlIgorPC9kaXY+CisKK1RoaXMgaXMgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGZvciBFaWdlbjMuIFlvdSBjYW4gPGEgaHJlZj0iZWlnZW4tZG9jLnRneiI+ZG93bmxvYWQ8L2E+IGl0IGFzIGEgdGd6IGFyY2hpdmUgZm9yIG9mZmxpbmUgcmVhZGluZy4KKworRWlnZW4yIHVzZXJzOiBoZXJlIGlzIGEgXHJlZiBFaWdlbjJUb0VpZ2VuMyBndWlkZSB0byBoZWxwIHBvcnRpbmcgeW91ciBhcHBsaWNhdGlvbi4KKworRm9yIGEgZmlyc3QgY29udGFjdCB3aXRoIEVpZ2VuLCB0aGUgYmVzdCBwbGFjZSBpcyB0byBoYXZlIGEgbG9vayBhdCB0aGUgXHJlZiBHZXR0aW5nU3RhcnRlZCAidHV0b3JpYWwiLiBUaGUgXHJlZiBRdWlja1JlZlBhZ2UgInNob3J0IHJlZmVyZW5jZSIgcGFnZSBnaXZlcyB5b3UgYSBxdWl0ZSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVBJIGluIGEgdmVyeSBjb25kZW5zZWQgZm9ybWF0IHRoYXQgaXMgc3BlY2lhbGx5IHVzZWZ1bCB0byByZWNhbGwgdGhlIHN5bnRheCBvZiBhIHBhcnRpY3VsYXIgZmVhdHVyZSwgb3IgdG8gaGF2ZSBhIHF1aWNrIGxvb2sgYXQgdGhlIEFQSS4gRm9yIE1hdGxhYiB1c2VycywgdGhlcmUgaXMgYWxzbyBhIDxhIGhyZWY9IkFzY2lpUXVpY2tSZWZlcmVuY2UudHh0Ij5BU0NJSSBxdWljayByZWZlcmVuY2U8L2E+IHdpdGggTWF0bGFiIHRyYW5zbGF0aW9ucy4gVGhlIFxlIE1vZHVsZXMgYW5kIFxlIENsYXNzZXMgdGFicyBhdCB0aGUgdG9wIG9mIHRoaXMgcGFnZSBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhlIEFQSSBkb2N1bWVudGF0aW9uIG9mIGluZGl2aWR1YWwgY2xhc3NlcyBhbmQgZnVuY3Rpb25zLgorCitcYiBUYWJsZSBcYiBvZiBcYiBjb250ZW50cworICAtIFxyZWYgRWlnZW4yVG9FaWdlbjMKKyAgLSBccmVmIEdldHRpbmdTdGFydGVkCisgIC0gXGIgVHV0b3JpYWwKKyAgICAtIFxyZWYgVHV0b3JpYWxNYXRyaXhDbGFzcworICAgIC0gXHJlZiBUdXRvcmlhbE1hdHJpeEFyaXRobWV0aWMKKyAgICAtIFxyZWYgVHV0b3JpYWxBcnJheUNsYXNzCisgICAgLSBccmVmIFR1dG9yaWFsQmxvY2tPcGVyYXRpb25zCisgICAgLSBccmVmIFR1dG9yaWFsQWR2YW5jZWRJbml0aWFsaXphdGlvbgorICAgIC0gXHJlZiBUdXRvcmlhbExpbmVhckFsZ2VicmEKKyAgICAtIFxyZWYgVHV0b3JpYWxSZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmcKKyAgICAtIFxyZWYgVHV0b3JpYWxHZW9tZXRyeQorICAgIC0gXHJlZiBUdXRvcmlhbFNwYXJzZQorICAgIC0gXHJlZiBUdXRvcmlhbE1hcENsYXNzCisgIC0gXHJlZiBRdWlja1JlZlBhZ2UKKyAgLSA8Yj5BZHZhbmNlZCB0b3BpY3M8L2I+CisgICAgLSBccmVmIFRvcGljQWxpYXNpbmcKKyAgICAtIFxyZWYgVG9waWNMYXp5RXZhbHVhdGlvbgorICAgIC0gXHJlZiBUb3BpY0xpbmVhckFsZ2VicmFEZWNvbXBvc2l0aW9ucworICAgIC0gXHJlZiBUb3BpY0N1c3RvbWl6aW5nRWlnZW4KKyAgICAtIFxyZWYgVG9waWNNdWx0aVRocmVhZGluZworICAgIC0gXHJlZiBUb3BpY1ByZXByb2Nlc3NvckRpcmVjdGl2ZXMKKyAgICAtIFxyZWYgVG9waWNTdG9yYWdlT3JkZXJzCisgICAgLSBccmVmIFRvcGljSW5zaWRlRWlnZW5FeGFtcGxlCisgICAgLSBccmVmIFRvcGljV3JpdGluZ0VmZmljaWVudFByb2R1Y3RFeHByZXNzaW9uCisgICAgLSBccmVmIFRvcGljQ2xhc3NIaWVyYXJjaHkKKyAgICAtIFxyZWYgVG9waWNGdW5jdGlvblRha2luZ0VpZ2VuVHlwZXMKKyAgICAtIFxyZWYgVG9waWNUZW1wbGF0ZUtleXdvcmQKKyAgICAtIFxyZWYgVG9waWNVc2luZ0ludGVsTUtMCisgIC0gPGI+VG9waWNzIHJlbGF0ZWQgdG8gYWxpZ25tZW50IGlzc3VlczwvYj4KKyAgICAtIFxyZWYgVG9waWNVbmFsaWduZWRBcnJheUFzc2VydAorICAgIC0gXHJlZiBUb3BpY0ZpeGVkU2l6ZVZlY3Rvcml6YWJsZQorICAgIC0gXHJlZiBUb3BpY1N0bENvbnRhaW5lcnMKKyAgICAtIFxyZWYgVG9waWNTdHJ1Y3RIYXZpbmdFaWdlbk1lbWJlcnMKKyAgICAtIFxyZWYgVG9waWNQYXNzaW5nQnlWYWx1ZQorICAgIC0gXHJlZiBUb3BpY1dyb25nU3RhY2tBbGlnbm1lbnQKKyAgCisgICAKKworV2FudCBtb3JlPyBDaGVja291dCB0aGUgXHJlZiBVbnN1cHBvcnRlZF9tb2R1bGVzICJ1bnN1cHBvcnRlZCBtb2R1bGVzIiA8YSBocmVmPSJ1bnN1cHBvcnRlZC9pbmRleC5odG1sIj5kb2N1bWVudGF0aW9uPC9hPi4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1F1aWNrUmVmZXJlbmNlLmRveCBiL2RvYy9RdWlja1JlZmVyZW5jZS5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxMGQzOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9RdWlja1JlZmVyZW5jZS5kb3gKQEAgLTAsMCArMSw3MzcgQEAKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBccGFnZSBRdWlja1JlZlBhZ2UgUXVpY2sgcmVmZXJlbmNlIGd1aWRlCisKK1xiIFRhYmxlIFxiIG9mIFxiIGNvbnRlbnRzCisgIC0gXHJlZiBRdWlja1JlZl9IZWFkZXJzCisgIC0gXHJlZiBRdWlja1JlZl9UeXBlcworICAtIFxyZWYgUXVpY2tSZWZfTWFwCisgIC0gXHJlZiBRdWlja1JlZl9Bcml0aG1ldGljT3BlcmF0b3JzCisgIC0gXHJlZiBRdWlja1JlZl9Db2VmZndpc2UKKyAgLSBccmVmIFF1aWNrUmVmX1JlZHVjdGlvbnMKKyAgLSBccmVmIFF1aWNrUmVmX0Jsb2NrcworICAtIFxyZWYgUXVpY2tSZWZfTWlzYworICAtIFxyZWYgUXVpY2tSZWZfRGlhZ1RyaVN5bW0KK1xuCisKKzxocj4KKworPGEgaHJlZj0iIyIgY2xhc3M9InRvcCI+dG9wPC9hPgorXHNlY3Rpb24gUXVpY2tSZWZfSGVhZGVycyBNb2R1bGVzIGFuZCBIZWFkZXIgZmlsZXMKKworVGhlIEVpZ2VuIGxpYnJhcnkgaXMgZGl2aWRlZCBpbiBhIENvcmUgbW9kdWxlIGFuZCBzZXZlcmFsIGFkZGl0aW9uYWwgbW9kdWxlcy4gRWFjaCBtb2R1bGUgaGFzIGEgY29ycmVzcG9uZGluZyBoZWFkZXIgZmlsZSB3aGljaCBoYXMgdG8gYmUgaW5jbHVkZWQgaW4gb3JkZXIgdG8gdXNlIHRoZSBtb2R1bGUuIFRoZSBcYyAlRGVuc2UgYW5kIFxjIEVpZ2VuIGhlYWRlciBmaWxlcyBhcmUgcHJvdmlkZWQgdG8gY29udmVuaWVudGx5IGdhaW4gYWNjZXNzIHRvIHNldmVyYWwgbW9kdWxlcyBhdCBvbmNlLgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPk1vZHVsZTwvdGg+PHRoPkhlYWRlciBmaWxlPC90aD48dGg+Q29udGVudHM8L3RoPjwvdHI+Cis8dHI+PHRkPlxsaW5rIENvcmVfTW9kdWxlIENvcmUgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9Db3JlPlxlbmRjb2RlPC90ZD48dGQ+TWF0cml4IGFuZCBBcnJheSBjbGFzc2VzLCBiYXNpYyBsaW5lYXIgYWxnZWJyYSAoaW5jbHVkaW5nIHRyaWFuZ3VsYXIgYW5kIHNlbGZhZGpvaW50IHByb2R1Y3RzKSwgYXJyYXkgbWFuaXB1bGF0aW9uPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD5cbGluayBHZW9tZXRyeV9Nb2R1bGUgR2VvbWV0cnkgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT5cZW5kY29kZTwvdGQ+PHRkPlRyYW5zZm9ybSwgVHJhbnNsYXRpb24sIFNjYWxpbmcsIFJvdGF0aW9uMkQgYW5kIDNEIHJvdGF0aW9ucyAoUXVhdGVybmlvbiwgQW5nbGVBeGlzKTwvdGQ+PC90cj4KKzx0cj48dGQ+XGxpbmsgTFVfTW9kdWxlIExVIFxlbmRsaW5rPC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vTFU+XGVuZGNvZGU8L3RkPjx0ZD5JbnZlcnNlLCBkZXRlcm1pbmFudCwgTFUgZGVjb21wb3NpdGlvbnMgd2l0aCBzb2x2ZXIgKEZ1bGxQaXZMVSwgUGFydGlhbFBpdkxVKTwvdGQ+PC90cj4KKzx0cj48dGQ+XGxpbmsgQ2hvbGVza3lfTW9kdWxlIENob2xlc2t5IFxlbmRsaW5rPC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+XGVuZGNvZGU8L3RkPjx0ZD5MTFQgYW5kIExETFQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiB3aXRoIHNvbHZlcjwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+XGxpbmsgSG91c2Vob2xkZXJfTW9kdWxlIEhvdXNlaG9sZGVyIFxlbmRsaW5rPC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vSG91c2Vob2xkZXI+XGVuZGNvZGU8L3RkPjx0ZD5Ib3VzZWhvbGRlciB0cmFuc2Zvcm1hdGlvbnM7IHRoaXMgbW9kdWxlIGlzIHVzZWQgYnkgc2V2ZXJhbCBsaW5lYXIgYWxnZWJyYSBtb2R1bGVzPC90ZD48L3RyPgorPHRyPjx0ZD5cbGluayBTVkRfTW9kdWxlIFNWRCBcZW5kbGluazwvdGQ+PHRkPlxjb2RlI2luY2x1ZGUgPEVpZ2VuL1NWRD5cZW5kY29kZTwvdGQ+PHRkPlNWRCBkZWNvbXBvc2l0aW9uIHdpdGggbGVhc3Qtc3F1YXJlcyBzb2x2ZXIgKEphY29iaVNWRCk8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPlxsaW5rIFFSX01vZHVsZSBRUiBcZW5kbGluazwvdGQ+PHRkPlxjb2RlI2luY2x1ZGUgPEVpZ2VuL1FSPlxlbmRjb2RlPC90ZD48dGQ+UVIgZGVjb21wb3NpdGlvbiB3aXRoIHNvbHZlciAoSG91c2Vob2xkZXJRUiwgQ29sUGl2SG91c2Vob2xkZXJRUiwgRnVsbFBpdkhvdXNlaG9sZGVyUVIpPC90ZD48L3RyPgorPHRyPjx0ZD5cbGluayBFaWdlbnZhbHVlc19Nb2R1bGUgRWlnZW52YWx1ZXMgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz5cZW5kY29kZTwvdGQ+PHRkPkVpZ2VudmFsdWUsIGVpZ2VudmVjdG9yIGRlY29tcG9zaXRpb25zIChFaWdlblNvbHZlciwgU2VsZkFkam9pbnRFaWdlblNvbHZlciwgQ29tcGxleEVpZ2VuU29sdmVyKTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+XGxpbmsgU3BhcnNlX01vZHVsZSBTcGFyc2UgXGVuZGxpbms8L3RkPjx0ZD5cY29kZSNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+XGVuZGNvZGU8L3RkPjx0ZD4lU3BhcnNlIG1hdHJpeCBzdG9yYWdlIGFuZCByZWxhdGVkIGJhc2ljIGxpbmVhciBhbGdlYnJhIChTcGFyc2VNYXRyaXgsIER5bmFtaWNTcGFyc2VNYXRyaXgsIFNwYXJzZVZlY3Rvcik8L3RkPjwvdHI+Cis8dHI+PHRkPjwvdGQ+PHRkPlxjb2RlI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPlxlbmRjb2RlPC90ZD48dGQ+SW5jbHVkZXMgQ29yZSwgR2VvbWV0cnksIExVLCBDaG9sZXNreSwgU1ZELCBRUiwgYW5kIEVpZ2VudmFsdWVzIGhlYWRlciBmaWxlczwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+PC90ZD48dGQ+XGNvZGUjaW5jbHVkZSA8RWlnZW4vRWlnZW4+XGVuZGNvZGU8L3RkPjx0ZD5JbmNsdWRlcyAlRGVuc2UgYW5kICVTcGFyc2UgaGVhZGVyIGZpbGVzICh0aGUgd2hvbGUgRWlnZW4gbGlicmFyeSk8L3RkPjwvdHI+Cis8L3RhYmxlPgorCis8YSBocmVmPSIjIiBjbGFzcz0idG9wIj50b3A8L2E+Citcc2VjdGlvbiBRdWlja1JlZl9UeXBlcyBBcnJheSwgbWF0cml4IGFuZCB2ZWN0b3IgdHlwZXMKKworCitcYiBSZWNhbGw6IEVpZ2VuIHByb3ZpZGVzIHR3byBraW5kcyBvZiBkZW5zZSBvYmplY3RzOiBtYXRoZW1hdGljYWwgbWF0cmljZXMgYW5kIHZlY3RvcnMgd2hpY2ggYXJlIGJvdGggcmVwcmVzZW50ZWQgYnkgdGhlIHRlbXBsYXRlIGNsYXNzIE1hdHJpeCwgYW5kIGdlbmVyYWwgMUQgYW5kIDJEIGFycmF5cyByZXByZXNlbnRlZCBieSB0aGUgdGVtcGxhdGUgY2xhc3MgQXJyYXk6CitcY29kZQordHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIE9wdGlvbnM+IE15TWF0cml4VHlwZTsKK3R5cGVkZWYgQXJyYXk8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIE9wdGlvbnM+IE15QXJyYXlUeXBlOworXGVuZGNvZGUKKworXGxpIFxjIFNjYWxhciBpcyB0aGUgc2NhbGFyIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cyAoZS5nLiwgXGMgZmxvYXQsIFxjIGRvdWJsZSwgXGMgYm9vbCwgXGMgaW50LCBldGMuKS4KK1xsaSBcYyBSb3dzQXRDb21waWxlVGltZSBhbmQgXGMgQ29sc0F0Q29tcGlsZVRpbWUgYXJlIHRoZSBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyBvZiB0aGUgbWF0cml4IGFzIGtub3duIGF0IGNvbXBpbGUtdGltZSBvciBcYyBEeW5hbWljLgorXGxpIFxjIE9wdGlvbnMgY2FuIGJlIFxjIENvbE1ham9yIG9yIFxjIFJvd01ham9yLCBkZWZhdWx0IGlzIFxjIENvbE1ham9yLiAoc2VlIGNsYXNzIE1hdHJpeCBmb3IgbW9yZSBvcHRpb25zKQorCitBbGwgY29tYmluYXRpb25zIGFyZSBhbGxvd2VkOiB5b3UgY2FuIGhhdmUgYSBtYXRyaXggd2l0aCBhIGZpeGVkIG51bWJlciBvZiByb3dzIGFuZCBhIGR5bmFtaWMgbnVtYmVyIG9mIGNvbHVtbnMsIGV0Yy4gVGhlIGZvbGxvd2luZyBhcmUgYWxsIHZhbGlkOgorXGNvZGUKK01hdHJpeDxkb3VibGUsIDYsIER5bmFtaWM+ICAgICAgICAgICAgICAgICAgLy8gRHluYW1pYyBudW1iZXIgb2YgY29sdW1ucyAoaGVhcCBhbGxvY2F0aW9uKQorTWF0cml4PGRvdWJsZSwgRHluYW1pYywgMj4gICAgICAgICAgICAgICAgICAvLyBEeW5hbWljIG51bWJlciBvZiByb3dzIChoZWFwIGFsbG9jYXRpb24pCitNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4gIC8vIEZ1bGx5IGR5bmFtaWMsIHJvdyBtYWpvciAoaGVhcCBhbGxvY2F0aW9uKQorTWF0cml4PGRvdWJsZSwgMTMsIDM+ICAgICAgICAgICAgICAgICAgICAgICAvLyBGdWxseSBmaXhlZCAoc3RhdGljIGFsbG9jYXRpb24pCitcZW5kY29kZQorCitJbiBtb3N0IGNhc2VzLCB5b3UgY2FuIHNpbXBseSB1c2Ugb25lIG9mIHRoZSBjb252ZW5pZW5jZSB0eXBlZGVmcyBmb3IgXHJlZiBtYXRyaXh0eXBlZGVmcyAibWF0cmljZXMiIGFuZCBccmVmIGFycmF5dHlwZWRlZnMgImFycmF5cyIuIFNvbWUgZXhhbXBsZXM6Cis8dGFibGUgY2xhc3M9ImV4YW1wbGUiPgorPHRyPjx0aD5NYXRyaWNlczwvdGg+PHRoPkFycmF5czwvdGg+PC90cj4KKzx0cj48dGQ+XGNvZGUKK01hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWM+ICAgPD0+ICAgTWF0cml4WGYKK01hdHJpeDxkb3VibGUsRHluYW1pYywxPiAgICAgICAgPD0+ICAgVmVjdG9yWGQKK01hdHJpeDxpbnQsMSxEeW5hbWljPiAgICAgICAgICAgPD0+ICAgUm93VmVjdG9yWGkKK01hdHJpeDxmbG9hdCwzLDM+ICAgICAgICAgICAgICAgPD0+ICAgTWF0cml4M2YKK01hdHJpeDxmbG9hdCw0LDE+ICAgICAgICAgICAgICAgPD0+ICAgVmVjdG9yNGYKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK0FycmF5PGZsb2F0LER5bmFtaWMsRHluYW1pYz4gICAgPD0+ICAgQXJyYXlYWGYKK0FycmF5PGRvdWJsZSxEeW5hbWljLDE+ICAgICAgICAgPD0+ICAgQXJyYXlYZAorQXJyYXk8aW50LDEsRHluYW1pYz4gICAgICAgICAgICA8PT4gICBSb3dBcnJheVhpCitBcnJheTxmbG9hdCwzLDM+ICAgICAgICAgICAgICAgIDw9PiAgIEFycmF5MzNmCitBcnJheTxmbG9hdCw0LDE+ICAgICAgICAgICAgICAgIDw9PiAgIEFycmF5NGYKK1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KKworQ29udmVyc2lvbiBiZXR3ZWVuIHRoZSBtYXRyaXggYW5kIGFycmF5IHdvcmxkczoKK1xjb2RlCitBcnJheTQ0ZiBhMSwgYTE7CitNYXRyaXg0ZiBtMSwgbTI7CittMSA9IGExICogYTI7ICAgICAgICAgICAgICAgICAgICAgLy8gY29lZmZ3aXNlIHByb2R1Y3QsIGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBhcnJheSB0byBtYXRyaXguCithMSA9IG0xICogbTI7ICAgICAgICAgICAgICAgICAgICAgLy8gbWF0cml4IHByb2R1Y3QsIGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBtYXRyaXggdG8gYXJyYXkuCithMiA9IGExICsgbTEuYXJyYXkoKTsgICAgICAgICAgICAgLy8gbWl4aW5nIGFycmF5IGFuZCBtYXRyaXggaXMgZm9yYmlkZGVuCittMiA9IGExLm1hdHJpeCgpICsgbTE7ICAgICAgICAgICAgLy8gYW5kIGV4cGxpY2l0IGNvbnZlcnNpb24gaXMgcmVxdWlyZWQuCitBcnJheVdyYXBwZXI8TWF0cml4NGY+IG0xYShtMSk7ICAgLy8gbTFhIGlzIGFuIGFsaWFzIGZvciBtMS5hcnJheSgpLCB0aGV5IHNoYXJlIHRoZSBzYW1lIGNvZWZmaWNpZW50cworTWF0cml4V3JhcHBlcjxBcnJheTQ0Zj4gYTFtKGExKTsKK1xlbmRjb2RlCisKK0luIHRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQgd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBzeW1ib2xzIHRvIGVtcGhhc2l6ZSB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlIHNwZWNpZmljcyB0byBhIGdpdmVuIGtpbmQgb2Ygb2JqZWN0OgorXGxpIDxhIG5hbWU9Im1hdHJpeG9ubHkiPjxhLz5cbWF0cml4d29ybGQgbGluZWFyIGFsZ2VicmEgbWF0cml4IGFuZCB2ZWN0b3Igb25seQorXGxpIDxhIG5hbWU9ImFycmF5b25seSI+PGEvPlxhcnJheXdvcmxkIGFycmF5IG9iamVjdHMgb25seQorCitcc3Vic2VjdGlvbiBRdWlja1JlZl9CYXNpY3MgQmFzaWMgbWF0cml4IG1hbmlwdWxhdGlvbgorCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPjwvdGg+PHRoPjFEIG9iamVjdHM8L3RoPjx0aD4yRCBvYmplY3RzPC90aD48dGg+Tm90ZXM8L3RoPjwvdHI+Cis8dHI+PHRkPkNvbnN0cnVjdG9yczwvdGQ+Cis8dGQ+XGNvZGUKK1ZlY3RvcjRkICB2NDsKK1ZlY3RvcjJmICB2MSh4LCB5KTsKK0FycmF5M2kgICB2Mih4LCB5LCB6KTsKK1ZlY3RvcjRkICB2Myh4LCB5LCB6LCB3KTsKKworVmVjdG9yWGYgIHY1OyAvLyBlbXB0eSBvYmplY3QKK0FycmF5WGYgICB2NihzaXplKTsKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK01hdHJpeDRmICBtMTsKKworCisKKworTWF0cml4WGYgIG01OyAvLyBlbXB0eSBvYmplY3QKK01hdHJpeFhmICBtNihuYl9yb3dzLCBuYl9jb2x1bW5zKTsKK1xlbmRjb2RlPC90ZD48dGQgY2xhc3M9Im5vdGUiPgorQnkgZGVmYXVsdCwgdGhlIGNvZWZmaWNpZW50cyBcbiBhcmUgbGVmdCB1bmluaXRpYWxpemVkPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD5Db21tYSBpbml0aWFsaXplcjwvdGQ+Cis8dGQ+XGNvZGUKK1ZlY3RvcjNmICB2MTsgICAgIHYxIDw8IHgsIHksIHo7CitBcnJheVhmICAgdjIoNCk7ICB2MiA8PCAxLCAyLCAzLCA0OworCitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCitNYXRyaXgzZiAgbTE7ICAgbTEgPDwgMSwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICA0LCA1LCA2LAorICAgICAgICAgICAgICAgICAgICAgIDcsIDgsIDk7CitcZW5kY29kZTwvdGQ+PHRkPjwvdGQ+PC90cj4KKworPHRyPjx0ZD5Db21tYSBpbml0aWFsaXplciAoYmlzKTwvdGQ+Cis8dGQgY29sc3Bhbj0iMiI+CitcaW5jbHVkZSBUdXRvcmlhbF9jb21tYWluaXRfMDIuY3BwCis8L3RkPgorPHRkPgorb3V0cHV0OgorXHZlcmJpbmNsdWRlIFR1dG9yaWFsX2NvbW1haW5pdF8wMi5vdXQKKzwvdGQ+Cis8L3RyPgorCis8dHIgY2xhc3M9ImFsdCI+PHRkPlJ1bnRpbWUgaW5mbzwvdGQ+Cis8dGQ+XGNvZGUKK3ZlY3Rvci5zaXplKCk7CisKK3ZlY3Rvci5pbm5lclN0cmlkZSgpOwordmVjdG9yLmRhdGEoKTsKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK21hdHJpeC5yb3dzKCk7ICAgICAgICAgIG1hdHJpeC5jb2xzKCk7CittYXRyaXguaW5uZXJTaXplKCk7ICAgICBtYXRyaXgub3V0ZXJTaXplKCk7CittYXRyaXguaW5uZXJTdHJpZGUoKTsgICBtYXRyaXgub3V0ZXJTdHJpZGUoKTsKK21hdHJpeC5kYXRhKCk7CitcZW5kY29kZTwvdGQ+PHRkIGNsYXNzPSJub3RlIj5Jbm5lci9PdXRlciogYXJlIHN0b3JhZ2Ugb3JkZXIgZGVwZW5kZW50PC90ZD48L3RyPgorPHRyPjx0ZD5Db21waWxlLXRpbWUgaW5mbzwvdGQ+Cis8dGQgY29sc3Bhbj0iMiI+XGNvZGUKK09iamVjdFR5cGU6OlNjYWxhciAgICAgICAgICAgICAgT2JqZWN0VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUKK09iamVjdFR5cGU6OlJlYWxTY2FsYXIgICAgICAgICAgT2JqZWN0VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKK09iamVjdFR5cGU6OkluZGV4ICAgICAgICAgICAgICAgT2JqZWN0VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUKK1xlbmRjb2RlPC90ZD48dGQ+PC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD5SZXNpemluZzwvdGQ+Cis8dGQ+XGNvZGUKK3ZlY3Rvci5yZXNpemUoc2l6ZSk7CisKKwordmVjdG9yLnJlc2l6ZUxpa2Uob3RoZXJfdmVjdG9yKTsKK3ZlY3Rvci5jb25zZXJ2YXRpdmVSZXNpemUoc2l6ZSk7CitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCittYXRyaXgucmVzaXplKG5iX3Jvd3MsIG5iX2NvbHMpOworbWF0cml4LnJlc2l6ZShFaWdlbjo6Tm9DaGFuZ2UsIG5iX2NvbHMpOworbWF0cml4LnJlc2l6ZShuYl9yb3dzLCBFaWdlbjo6Tm9DaGFuZ2UpOworbWF0cml4LnJlc2l6ZUxpa2Uob3RoZXJfbWF0cml4KTsKK21hdHJpeC5jb25zZXJ2YXRpdmVSZXNpemUobmJfcm93cywgbmJfY29scyk7CitcZW5kY29kZTwvdGQ+PHRkIGNsYXNzPSJub3RlIj5uby1vcCBpZiB0aGUgbmV3IHNpemVzIG1hdGNoLDxici8+b3RoZXJ3aXNlIGRhdGEgYXJlIGxvc3Q8YnIvPjxici8+cmVzaXppbmcgd2l0aCBkYXRhIHByZXNlcnZhdGlvbjwvdGQ+PC90cj4KKworPHRyPjx0ZD5Db2VmZiBhY2Nlc3Mgd2l0aCBcbiByYW5nZSBjaGVja2luZzwvdGQ+Cis8dGQ+XGNvZGUKK3ZlY3RvcihpKSAgICAgdmVjdG9yLngoKQordmVjdG9yW2ldICAgICB2ZWN0b3IueSgpCisgICAgICAgICAgICAgIHZlY3Rvci56KCkKKyAgICAgICAgICAgICAgdmVjdG9yLncoKQorXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQorbWF0cml4KGksaikKK1xlbmRjb2RlPC90ZD48dGQgY2xhc3M9Im5vdGUiPlJhbmdlIGNoZWNraW5nIGlzIGRpc2FibGVkIGlmIFxuIE5ERUJVRyBvciBFSUdFTl9OT19ERUJVRyBpcyBkZWZpbmVkPC90ZD48L3RyPgorCis8dHIgY2xhc3M9ImFsdCI+PHRkPkNvZWZmIGFjY2VzcyB3aXRob3V0IFxuIHJhbmdlIGNoZWNraW5nPC90ZD4KKzx0ZD5cY29kZQordmVjdG9yLmNvZWZmKGkpCit2ZWN0b3IuY29lZmZSZWYoaSkKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKK21hdHJpeC5jb2VmZihpLGopCittYXRyaXguY29lZmZSZWYoaSxqKQorXGVuZGNvZGU8L3RkPjx0ZD48L3RkPjwvdHI+CisKKzx0cj48dGQ+QXNzaWdubWVudC9jb3B5PC90ZD4KKzx0ZCBjb2xzcGFuPSIyIj5cY29kZQorb2JqZWN0ID0gZXhwcmVzc2lvbjsKK29iamVjdF9vZl9mbG9hdCA9IGV4cHJlc3Npb25fb2ZfZG91YmxlLmNhc3Q8ZmxvYXQ+KCk7CitcZW5kY29kZTwvdGQ+PHRkIGNsYXNzPSJub3RlIj50aGUgZGVzdGluYXRpb24gaXMgYXV0b21hdGljYWxseSByZXNpemVkIChpZiBwb3NzaWJsZSk8L3RkPjwvdHI+CisKKzwvdGFibGU+CisKK1xzdWJzZWN0aW9uIFF1aWNrUmVmX1ByZWRlZk1hdCBQcmVkZWZpbmVkIE1hdHJpY2VzCisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj4KKyAgPHRoPkZpeGVkLXNpemUgbWF0cml4IG9yIHZlY3RvcjwvdGg+CisgIDx0aD5EeW5hbWljLXNpemUgbWF0cml4PC90aD4KKyAgPHRoPkR5bmFtaWMtc2l6ZSB2ZWN0b3I8L3RoPgorPC90cj4KKzx0ciBzdHlsZT0iYm9yZGVyLWJvdHRvbS1zdHlsZTogbm9uZTsiPgorICA8dGQ+CitcY29kZQordHlwZWRlZiB7TWF0cml4M2Z8QXJyYXkzM2Z9IEZpeGVkWEQ7CitGaXhlZFhEIHg7CisKK3ggPSBGaXhlZFhEOjpaZXJvKCk7Cit4ID0gRml4ZWRYRDo6T25lcygpOworeCA9IEZpeGVkWEQ6OkNvbnN0YW50KHZhbHVlKTsKK3ggPSBGaXhlZFhEOjpSYW5kb20oKTsKK3ggPSBGaXhlZFhEOjpMaW5TcGFjZWQoc2l6ZSwgbG93LCBoaWdoKTsKKworeC5zZXRaZXJvKCk7Cit4LnNldE9uZXMoKTsKK3guc2V0Q29uc3RhbnQodmFsdWUpOworeC5zZXRSYW5kb20oKTsKK3guc2V0TGluU3BhY2VkKHNpemUsIGxvdywgaGlnaCk7CitcZW5kY29kZQorICA8L3RkPgorICA8dGQ+CitcY29kZQordHlwZWRlZiB7TWF0cml4WGZ8QXJyYXlYWGZ9IER5bmFtaWMyRDsKK0R5bmFtaWMyRCB4OworCit4ID0gRHluYW1pYzJEOjpaZXJvKHJvd3MsIGNvbHMpOworeCA9IER5bmFtaWMyRDo6T25lcyhyb3dzLCBjb2xzKTsKK3ggPSBEeW5hbWljMkQ6OkNvbnN0YW50KHJvd3MsIGNvbHMsIHZhbHVlKTsKK3ggPSBEeW5hbWljMkQ6OlJhbmRvbShyb3dzLCBjb2xzKTsKK04vQQorCit4LnNldFplcm8ocm93cywgY29scyk7Cit4LnNldE9uZXMocm93cywgY29scyk7Cit4LnNldENvbnN0YW50KHJvd3MsIGNvbHMsIHZhbHVlKTsKK3guc2V0UmFuZG9tKHJvd3MsIGNvbHMpOworTi9BCitcZW5kY29kZQorICA8L3RkPgorICA8dGQ+CitcY29kZQordHlwZWRlZiB7VmVjdG9yWGZ8QXJyYXlYZn0gRHluYW1pYzFEOworRHluYW1pYzFEIHg7CisKK3ggPSBEeW5hbWljMUQ6Olplcm8oc2l6ZSk7Cit4ID0gRHluYW1pYzFEOjpPbmVzKHNpemUpOworeCA9IER5bmFtaWMxRDo6Q29uc3RhbnQoc2l6ZSwgdmFsdWUpOworeCA9IER5bmFtaWMxRDo6UmFuZG9tKHNpemUpOworeCA9IER5bmFtaWMxRDo6TGluU3BhY2VkKHNpemUsIGxvdywgaGlnaCk7CisKK3guc2V0WmVybyhzaXplKTsKK3guc2V0T25lcyhzaXplKTsKK3guc2V0Q29uc3RhbnQoc2l6ZSwgdmFsdWUpOworeC5zZXRSYW5kb20oc2l6ZSk7Cit4LnNldExpblNwYWNlZChzaXplLCBsb3csIGhpZ2gpOworXGVuZGNvZGUKKyAgPC90ZD4KKzwvdHI+CisKKzx0cj48dGQgY29sc3Bhbj0iMyI+SWRlbnRpdHkgYW5kIFxsaW5rIE1hdHJpeEJhc2U6OlVuaXQgYmFzaXMgdmVjdG9ycyBcZW5kbGluayBcbWF0cml4d29ybGQ8L3RkPjwvdHI+Cis8dHIgc3R5bGU9ImJvcmRlci1ib3R0b20tc3R5bGU6IG5vbmU7Ij4KKyAgPHRkPgorXGNvZGUKK3ggPSBGaXhlZFhEOjpJZGVudGl0eSgpOworeC5zZXRJZGVudGl0eSgpOworCitWZWN0b3IzZjo6VW5pdFgoKSAvLyAxIDAgMAorVmVjdG9yM2Y6OlVuaXRZKCkgLy8gMCAxIDAKK1ZlY3RvcjNmOjpVbml0WigpIC8vIDAgMCAxCitcZW5kY29kZQorICA8L3RkPgorICA8dGQ+CitcY29kZQoreCA9IER5bmFtaWMyRDo6SWRlbnRpdHkocm93cywgY29scyk7Cit4LnNldElkZW50aXR5KHJvd3MsIGNvbHMpOworCisKKworTi9BCitcZW5kY29kZQorICA8L3RkPgorICA8dGQ+XGNvZGUKK04vQQorCisKK1ZlY3RvclhmOjpVbml0KHNpemUsaSkKK1ZlY3RvclhmOjpVbml0KDQsMSkgPT0gVmVjdG9yNGYoMCwxLDAsMCkKKyAgICAgICAgICAgICAgICAgICAgPT0gVmVjdG9yNGY6OlVuaXRZKCkKK1xlbmRjb2RlCisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworCisKK1xzdWJzZWN0aW9uIFF1aWNrUmVmX01hcCBNYXBwaW5nIGV4dGVybmFsIGFycmF5cworCis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+Cis8dGQ+Q29udGlndW91cyBcbiBtZW1vcnk8L3RkPgorPHRkPlxjb2RlCitmbG9hdCBkYXRhW10gPSB7MSwyLDMsNH07CitNYXA8VmVjdG9yM2Y+IHYxKGRhdGEpOyAgICAgICAvLyB1c2VzIHYxIGFzIGEgVmVjdG9yM2Ygb2JqZWN0CitNYXA8QXJyYXlYZj4gIHYyKGRhdGEsMyk7ICAgICAvLyB1c2VzIHYyIGFzIGEgQXJyYXlYZiBvYmplY3QKK01hcDxBcnJheTIyZj4gbTEoZGF0YSk7ICAgICAgIC8vIHVzZXMgbTEgYXMgYSBBcnJheTIyZiBvYmplY3QKK01hcDxNYXRyaXhYZj4gbTIoZGF0YSwyLDIpOyAgIC8vIHVzZXMgbTIgYXMgYSBNYXRyaXhYZiBvYmplY3QKK1xlbmRjb2RlPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+VHlwaWNhbCB1c2FnZSBcbiBvZiBzdHJpZGVzPC90ZD4KKzx0ZD5cY29kZQorZmxvYXQgZGF0YVtdID0gezEsMiwzLDQsNSw2LDcsOCw5fTsKK01hcDxWZWN0b3JYZiwwLElubmVyU3RyaWRlPDI+ID4gIHYxKGRhdGEsMyk7ICAgICAgICAgICAgICAgICAgICAgIC8vID0gWzEsMyw1XQorTWFwPFZlY3RvclhmLDAsSW5uZXJTdHJpZGU8PiA+ICAgdjIoZGF0YSwzLElubmVyU3RyaWRlPD4oMykpOyAgICAgLy8gPSBbMSw0LDddCitNYXA8TWF0cml4WGYsMCxPdXRlclN0cmlkZTwzPiA+ICBtMihkYXRhLDIsMyk7ICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGxpbmVzICAgICB8MSw0LDd8CitNYXA8TWF0cml4WGYsMCxPdXRlclN0cmlkZTw+ID4gICBtMShkYXRhLDIsMyxPdXRlclN0cmlkZTw+KDMpKTsgICAvLyBhcmUgZXF1YWwgdG86ICB8Miw1LDh8CitcZW5kY29kZTwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworCis8YSBocmVmPSIjIiBjbGFzcz0idG9wIj50b3A8L2E+Citcc2VjdGlvbiBRdWlja1JlZl9Bcml0aG1ldGljT3BlcmF0b3JzIEFyaXRobWV0aWMgT3BlcmF0b3JzCisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+CithZGQgXG4gc3VidHJhY3Q8L3RkPjx0ZD5cY29kZQorbWF0MyA9IG1hdDEgKyBtYXQyOyAgICAgICAgICAgbWF0MyArPSBtYXQxOworbWF0MyA9IG1hdDEgLSBtYXQyOyAgICAgICAgICAgbWF0MyAtPSBtYXQxO1xlbmRjb2RlCis8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPgorc2NhbGFyIHByb2R1Y3Q8L3RkPjx0ZD5cY29kZQorbWF0MyA9IG1hdDEgKiBzMTsgICAgICAgICAgICAgbWF0MyAqPSBzMTsgICAgICAgICAgIG1hdDMgPSBzMSAqIG1hdDE7CittYXQzID0gbWF0MSAvIHMxOyAgICAgICAgICAgICBtYXQzIC89IHMxO1xlbmRjb2RlCis8L3RkPjwvdHI+Cis8dHI+PHRkPgorbWF0cml4L3ZlY3RvciBcbiBwcm9kdWN0cyBcbWF0cml4d29ybGQ8L3RkPjx0ZD5cY29kZQorY29sMiA9IG1hdDEgKiBjb2wxOworcm93MiA9IHJvdzEgKiBtYXQxOyAgICAgICAgICAgcm93MSAqPSBtYXQxOworbWF0MyA9IG1hdDEgKiBtYXQyOyAgICAgICAgICAgbWF0MyAqPSBtYXQxOyBcZW5kY29kZQorPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD4KK3RyYW5zcG9zaXRpb24gXG4gYWRqb2ludCBcbWF0cml4d29ybGQ8L3RkPjx0ZD5cY29kZQorbWF0MSA9IG1hdDIudHJhbnNwb3NlKCk7ICAgICAgbWF0MS50cmFuc3Bvc2VJblBsYWNlKCk7CittYXQxID0gbWF0Mi5hZGpvaW50KCk7ICAgICAgICBtYXQxLmFkam9pbnRJblBsYWNlKCk7CitcZW5kY29kZQorPC90ZD48L3RyPgorPHRyPjx0ZD4KK1xsaW5rIE1hdHJpeEJhc2U6OmRvdCgpIGRvdCBcZW5kbGluayBwcm9kdWN0IFxuIGlubmVyIHByb2R1Y3QgXG1hdHJpeHdvcmxkPC90ZD48dGQ+XGNvZGUKK3NjYWxhciA9IHZlYzEuZG90KHZlYzIpOworc2NhbGFyID0gY29sMS5hZGpvaW50KCkgKiBjb2wyOworc2NhbGFyID0gKGNvbDEuYWRqb2ludCgpICogY29sMikudmFsdWUoKTtcZW5kY29kZQorPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD4KK291dGVyIHByb2R1Y3QgXG1hdHJpeHdvcmxkPC90ZD48dGQ+XGNvZGUKK21hdCA9IGNvbDEgKiBjb2wyLnRyYW5zcG9zZSgpO1xlbmRjb2RlCis8L3RkPjwvdHI+CisKKzx0cj48dGQ+CitcbGluayBNYXRyaXhCYXNlOjpub3JtKCkgbm9ybSBcZW5kbGluayBcbiBcbGluayBNYXRyaXhCYXNlOjpub3JtYWxpemVkKCkgbm9ybWFsaXphdGlvbiBcZW5kbGluayBcbWF0cml4d29ybGQ8L3RkPjx0ZD5cY29kZQorc2NhbGFyID0gdmVjMS5ub3JtKCk7ICAgICAgICAgc2NhbGFyID0gdmVjMS5zcXVhcmVkTm9ybSgpCit2ZWMyID0gdmVjMS5ub3JtYWxpemVkKCk7ICAgICB2ZWMxLm5vcm1hbGl6ZSgpOyAvLyBpbnBsYWNlIFxlbmRjb2RlCis8L3RkPjwvdHI+CisKKzx0ciBjbGFzcz0iYWx0Ij48dGQ+CitcbGluayBNYXRyaXhCYXNlOjpjcm9zcygpIGNyb3NzIHByb2R1Y3QgXGVuZGxpbmsgXG1hdHJpeHdvcmxkPC90ZD48dGQ+XGNvZGUKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KK3ZlYzMgPSB2ZWMxLmNyb3NzKHZlYzIpO1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KKworPGEgaHJlZj0iIyIgY2xhc3M9InRvcCI+dG9wPC9hPgorXHNlY3Rpb24gUXVpY2tSZWZfQ29lZmZ3aXNlIENvZWZmaWNpZW50LXdpc2UgXCYgQXJyYXkgb3BlcmF0b3JzCitDb2VmZmljaWVudC13aXNlIG9wZXJhdG9ycyBmb3IgbWF0cmljZXMgYW5kIHZlY3RvcnM6Cis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRoPk1hdHJpeCBBUEkgXG1hdHJpeHdvcmxkPC90aD48dGg+VmlhIEFycmF5IGNvbnZlcnNpb25zPC90aD48L3RyPgorPHRyPjx0ZD5cY29kZQorbWF0MS5jd2lzZU1pbihtYXQyKQorbWF0MS5jd2lzZU1heChtYXQyKQorbWF0MS5jd2lzZUFiczIoKQorbWF0MS5jd2lzZUFicygpCittYXQxLmN3aXNlU3FydCgpCittYXQxLmN3aXNlUHJvZHVjdChtYXQyKQorbWF0MS5jd2lzZVF1b3RpZW50KG1hdDIpXGVuZGNvZGUKKzwvdGQ+PHRkPlxjb2RlCittYXQxLmFycmF5KCkubWluKG1hdDIuYXJyYXkoKSkKK21hdDEuYXJyYXkoKS5tYXgobWF0Mi5hcnJheSgpKQorbWF0MS5hcnJheSgpLmFiczIoKQorbWF0MS5hcnJheSgpLmFicygpCittYXQxLmFycmF5KCkuc3FydCgpCittYXQxLmFycmF5KCkgKiBtYXQyLmFycmF5KCkKK21hdDEuYXJyYXkoKSAvIG1hdDIuYXJyYXkoKQorXGVuZGNvZGU8L3RkPjwvdHI+Cis8L3RhYmxlPgorCitJdCBpcyBhbHNvIHZlcnkgc2ltcGxlIHRvIGFwcGx5IGFueSB1c2VyIGRlZmluZWQgZnVuY3Rpb24gXGMgZm9vIHVzaW5nIERlbnNlQmFzZTo6dW5hcnlFeHByIHRvZ2V0aGVyIHdpdGggc3RkOjpwdHJfZnVuOgorXGNvZGUgbWF0MS51bmFyeUV4cHIoc3RkOjpwdHJfZnVuKGZvbykpXGVuZGNvZGUKKworQXJyYXkgb3BlcmF0b3JzOlxhcnJheXdvcmxkCisKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj48dGQ+QXJpdGhtZXRpYyBvcGVyYXRvcnM8L3RkPjx0ZD5cY29kZQorYXJyYXkxICogYXJyYXkyICAgICBhcnJheTEgLyBhcnJheTIgICAgIGFycmF5MSAqPSBhcnJheTIgICAgYXJyYXkxIC89IGFycmF5MgorYXJyYXkxICsgc2NhbGFyICAgICBhcnJheTEgLSBzY2FsYXIgICAgIGFycmF5MSArPSBzY2FsYXIgICAgYXJyYXkxIC09IHNjYWxhcgorXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkPkNvbXBhcmlzb25zPC90ZD48dGQ+XGNvZGUKK2FycmF5MSA8IGFycmF5MiAgICAgYXJyYXkxID4gYXJyYXkyICAgICBhcnJheTEgPCBzY2FsYXIgICAgIGFycmF5MSA+IHNjYWxhcgorYXJyYXkxIDw9IGFycmF5MiAgICBhcnJheTEgPj0gYXJyYXkyICAgIGFycmF5MSA8PSBzY2FsYXIgICAgYXJyYXkxID49IHNjYWxhcgorYXJyYXkxID09IGFycmF5MiAgICBhcnJheTEgIT0gYXJyYXkyICAgIGFycmF5MSA9PSBzY2FsYXIgICAgYXJyYXkxICE9IHNjYWxhcgorXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkPlRyaWdvLCBwb3dlciwgYW5kIFxuIG1pc2MgZnVuY3Rpb25zIFxuIGFuZCB0aGUgU1RMIHZhcmlhbnRzPC90ZD48dGQ+XGNvZGUKK2FycmF5MS5taW4oYXJyYXkyKSAgICAgICAgICAgIAorYXJyYXkxLm1heChhcnJheTIpICAgICAgICAgICAgCithcnJheTEuYWJzMigpCithcnJheTEuYWJzKCkgICAgICAgICAgICAgICAgICBzdGQ6OmFicyhhcnJheTEpCithcnJheTEuc3FydCgpICAgICAgICAgICAgICAgICBzdGQ6OnNxcnQoYXJyYXkxKQorYXJyYXkxLmxvZygpICAgICAgICAgICAgICAgICAgc3RkOjpsb2coYXJyYXkxKQorYXJyYXkxLmV4cCgpICAgICAgICAgICAgICAgICAgc3RkOjpleHAoYXJyYXkxKQorYXJyYXkxLnBvdyhleHBvbmVudCkgICAgICAgICAgc3RkOjpwb3coYXJyYXkxLGV4cG9uZW50KQorYXJyYXkxLnNxdWFyZSgpCithcnJheTEuY3ViZSgpCithcnJheTEuaW52ZXJzZSgpCithcnJheTEuc2luKCkgICAgICAgICAgICAgICAgICBzdGQ6OnNpbihhcnJheTEpCithcnJheTEuY29zKCkgICAgICAgICAgICAgICAgICBzdGQ6OmNvcyhhcnJheTEpCithcnJheTEudGFuKCkgICAgICAgICAgICAgICAgICBzdGQ6OnRhbihhcnJheTEpCithcnJheTEuYXNpbigpICAgICAgICAgICAgICAgICBzdGQ6OmFzaW4oYXJyYXkxKQorYXJyYXkxLmFjb3MoKSAgICAgICAgICAgICAgICAgc3RkOjphY29zKGFycmF5MSkKK1xlbmRjb2RlCis8L3RkPjwvdHI+Cis8L3RhYmxlPgorCis8YSBocmVmPSIjIiBjbGFzcz0idG9wIj50b3A8L2E+Citcc2VjdGlvbiBRdWlja1JlZl9SZWR1Y3Rpb25zIFJlZHVjdGlvbnMKKworRWlnZW4gcHJvdmlkZXMgc2V2ZXJhbCByZWR1Y3Rpb24gbWV0aG9kcyBzdWNoIGFzOgorXGxpbmsgRGVuc2VCYXNlOjptaW5Db2VmZigpIG1pbkNvZWZmKCkgXGVuZGxpbmssIFxsaW5rIERlbnNlQmFzZTo6bWF4Q29lZmYoKSBtYXhDb2VmZigpIFxlbmRsaW5rLAorXGxpbmsgRGVuc2VCYXNlOjpzdW0oKSBzdW0oKSBcZW5kbGluaywgXGxpbmsgRGVuc2VCYXNlOjpwcm9kKCkgcHJvZCgpIFxlbmRsaW5rLAorXGxpbmsgTWF0cml4QmFzZTo6dHJhY2UoKSB0cmFjZSgpIFxlbmRsaW5rIFxtYXRyaXh3b3JsZCwKK1xsaW5rIE1hdHJpeEJhc2U6Om5vcm0oKSBub3JtKCkgXGVuZGxpbmsgXG1hdHJpeHdvcmxkLCBcbGluayBNYXRyaXhCYXNlOjpzcXVhcmVkTm9ybSgpIHNxdWFyZWROb3JtKCkgXGVuZGxpbmsgXG1hdHJpeHdvcmxkLAorXGxpbmsgRGVuc2VCYXNlOjphbGwoKSBhbGwoKSBcZW5kbGluaywgYW5kIFxsaW5rIERlbnNlQmFzZTo6YW55KCkgYW55KCkgXGVuZGxpbmsuCitBbGwgcmVkdWN0aW9uIG9wZXJhdGlvbnMgY2FuIGJlIGRvbmUgbWF0cml4LXdpc2UsCitcbGluayBEZW5zZUJhc2U6OmNvbHdpc2UoKSBjb2x1bW4td2lzZSBcZW5kbGluayBvcgorXGxpbmsgRGVuc2VCYXNlOjpyb3d3aXNlKCkgcm93LXdpc2UgXGVuZGxpbmsuIFVzYWdlIGV4YW1wbGU6Cis8dGFibGUgY2xhc3M9Im1hbnVhbCI+Cis8dHI+PHRkIHJvd3NwYW49IjMiIHN0eWxlPSJib3JkZXItcmlnaHQtc3R5bGU6ZGFzaGVkO3ZlcnRpY2FsLWFsaWduOm1pZGRsZSI+XGNvZGUKKyAgICAgIDUgMyAxCittYXQgPSAyIDcgOAorICAgICAgOSA0IDYgXGVuZGNvZGUKKzwvdGQ+IDx0ZD5cY29kZSBtYXQubWluQ29lZmYoKTsgXGVuZGNvZGU8L3RkPjx0ZD5cY29kZSAxIFxlbmRjb2RlPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD5cY29kZSBtYXQuY29sd2lzZSgpLm1pbkNvZWZmKCk7IFxlbmRjb2RlPC90ZD48dGQ+XGNvZGUgMiAzIDEgXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSI+PHRkPlxjb2RlIG1hdC5yb3d3aXNlKCkubWluQ29lZmYoKTsgXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQorMQorMgorNAorXGVuZGNvZGU8L3RkPjwvdHI+Cis8L3RhYmxlPgorCitTcGVjaWFsIHZlcnNpb25zIG9mIFxsaW5rIERlbnNlQmFzZTo6bWluQ29lZmYoSW5kZXgqLEluZGV4KikgbWluQ29lZmYgXGVuZGxpbmsgYW5kIFxsaW5rIERlbnNlQmFzZTo6bWF4Q29lZmYoSW5kZXgqLEluZGV4KikgbWF4Q29lZmYgXGVuZGxpbms6CitcY29kZQoraW50IGksIGo7CitzID0gdmVjdG9yLm1pbkNvZWZmKCZpKTsgICAgICAgIC8vIHMgPT0gdmVjdG9yW2ldCitzID0gbWF0cml4Lm1heENvZWZmKCZpLCAmaik7ICAgIC8vIHMgPT0gbWF0cml4KGksaikKK1xlbmRjb2RlCitUeXBpY2FsIHVzZSBjYXNlcyBvZiBhbGwoKSBhbmQgYW55KCk6CitcY29kZQoraWYoKGFycmF5MSA+IDApLmFsbCgpKSAuLi4gICAgICAvLyBpZiBhbGwgY29lZmZpY2llbnRzIG9mIGFycmF5MSBhcmUgZ3JlYXRlciB0aGFuIDAgLi4uCitpZigoYXJyYXkxIDwgYXJyYXkyKS5hbnkoKSkgLi4uIC8vIGlmIHRoZXJlIGV4aXN0IGEgcGFpciBpLGogc3VjaCB0aGF0IGFycmF5MShpLGopIDwgYXJyYXkyKGksaikgLi4uCitcZW5kY29kZQorCisKKzxhIGhyZWY9IiMiIGNsYXNzPSJ0b3AiPnRvcDwvYT5cc2VjdGlvbiBRdWlja1JlZl9CbG9ja3MgU3ViLW1hdHJpY2VzCisKK1JlYWQtd3JpdGUgYWNjZXNzIHRvIGEgXGxpbmsgRGVuc2VCYXNlOjpjb2woSW5kZXgpIGNvbHVtbiBcZW5kbGluaworb3IgYSBcbGluayBEZW5zZUJhc2U6OnJvdyhJbmRleCkgcm93IFxlbmRsaW5rIG9mIGEgbWF0cml4IChvciBhcnJheSk6CitcY29kZQorbWF0MS5yb3coaSkgPSBtYXQyLmNvbChqKTsKK21hdDEuY29sKGoxKS5zd2FwKG1hdDEuY29sKGoyKSk7CitcZW5kY29kZQorCitSZWFkLXdyaXRlIGFjY2VzcyB0byBzdWItdmVjdG9yczoKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj4KKzx0aD5EZWZhdWx0IHZlcnNpb25zPC90aD4KKzx0aD5PcHRpbWl6ZWQgdmVyc2lvbnMgd2hlbiB0aGUgc2l6ZSBcbiBpcyBrbm93biBhdCBjb21waWxlIHRpbWU8L3RoPjwvdHI+Cis8dGg+PC90aD4KKworPHRyPjx0ZD5cY29kZSB2ZWMxLmhlYWQobilcZW5kY29kZTwvdGQ+PHRkPlxjb2RlIHZlYzEuaGVhZDxuPigpXGVuZGNvZGU8L3RkPjx0ZD50aGUgZmlyc3QgXGMgbiBjb2VmZnMgPC90ZD48L3RyPgorPHRyPjx0ZD5cY29kZSB2ZWMxLnRhaWwobilcZW5kY29kZTwvdGQ+PHRkPlxjb2RlIHZlYzEudGFpbDxuPigpXGVuZGNvZGU8L3RkPjx0ZD50aGUgbGFzdCBcYyBuIGNvZWZmcyA8L3RkPjwvdHI+Cis8dHI+PHRkPlxjb2RlIHZlYzEuc2VnbWVudChwb3MsbilcZW5kY29kZTwvdGQ+PHRkPlxjb2RlIHZlYzEuc2VnbWVudDxuPihwb3MpXGVuZGNvZGU8L3RkPgorICAgIDx0ZD50aGUgXGMgbiBjb2VmZnMgaW4gXG4gdGhlIHJhbmdlIFtcYyBwb3MgOiBcYyBwb3MgKyBcYyBuIFs8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkIGNvbHNwYW49IjMiPgorCitSZWFkLXdyaXRlIGFjY2VzcyB0byBzdWItbWF0cmljZXM6PC90ZD48L3RyPgorPHRyPgorICA8dGQ+XGNvZGUgbWF0MS5ibG9jayhpLGoscm93cyxjb2xzKVxlbmRjb2RlCisgICAgICBcbGluayBEZW5zZUJhc2U6OmJsb2NrKEluZGV4LEluZGV4LEluZGV4LEluZGV4KSAobW9yZSkgXGVuZGxpbms8L3RkPgorICA8dGQ+XGNvZGUgbWF0MS5ibG9jazxyb3dzLGNvbHM+KGksailcZW5kY29kZQorICAgICAgXGxpbmsgRGVuc2VCYXNlOjpibG9jayhJbmRleCxJbmRleCkgKG1vcmUpIFxlbmRsaW5rPC90ZD4KKyAgPHRkPnRoZSBcYyByb3dzIHggXGMgY29scyBzdWItbWF0cml4IFxuIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gKFxjIGksXGMgaik8L3RkPjwvdHI+Cis8dHI+PHRkPlxjb2RlCisgbWF0MS50b3BMZWZ0Q29ybmVyKHJvd3MsY29scykKKyBtYXQxLnRvcFJpZ2h0Q29ybmVyKHJvd3MsY29scykKKyBtYXQxLmJvdHRvbUxlZnRDb3JuZXIocm93cyxjb2xzKQorIG1hdDEuYm90dG9tUmlnaHRDb3JuZXIocm93cyxjb2xzKVxlbmRjb2RlCisgPHRkPlxjb2RlCisgbWF0MS50b3BMZWZ0Q29ybmVyPHJvd3MsY29scz4oKQorIG1hdDEudG9wUmlnaHRDb3JuZXI8cm93cyxjb2xzPigpCisgbWF0MS5ib3R0b21MZWZ0Q29ybmVyPHJvd3MsY29scz4oKQorIG1hdDEuYm90dG9tUmlnaHRDb3JuZXI8cm93cyxjb2xzPigpXGVuZGNvZGUKKyA8dGQ+dGhlIFxjIHJvd3MgeCBcYyBjb2xzIHN1Yi1tYXRyaXggXG4gdGFrZW4gaW4gb25lIG9mIHRoZSBmb3VyIGNvcm5lcnM8L3RkPjwvdHI+CisgPHRyPjx0ZD5cY29kZQorIG1hdDEudG9wUm93cyhyb3dzKQorIG1hdDEuYm90dG9tUm93cyhyb3dzKQorIG1hdDEubGVmdENvbHMoY29scykKKyBtYXQxLnJpZ2h0Q29scyhjb2xzKVxlbmRjb2RlCisgPHRkPlxjb2RlCisgbWF0MS50b3BSb3dzPHJvd3M+KCkKKyBtYXQxLmJvdHRvbVJvd3M8cm93cz4oKQorIG1hdDEubGVmdENvbHM8Y29scz4oKQorIG1hdDEucmlnaHRDb2xzPGNvbHM+KClcZW5kY29kZQorIDx0ZD5zcGVjaWFsaXplZCB2ZXJzaW9ucyBvZiBibG9jaygpIFxuIHdoZW4gdGhlIGJsb2NrIGZpdCB0d28gY29ybmVyczwvdGQ+PC90cj4KKzwvdGFibGU+CisKKworCis8YSBocmVmPSIjIiBjbGFzcz0idG9wIj50b3A8L2E+XHNlY3Rpb24gUXVpY2tSZWZfTWlzYyBNaXNjZWxsYW5lb3VzIG9wZXJhdGlvbnMKKworXHN1YnNlY3Rpb24gUXVpY2tSZWZfUmV2ZXJzZSBSZXZlcnNlCitWZWN0b3JzLCByb3dzLCBhbmQvb3IgY29sdW1ucyBvZiBhIG1hdHJpeCBjYW4gYmUgcmV2ZXJzZWQgKHNlZSBEZW5zZUJhc2U6OnJldmVyc2UoKSwgRGVuc2VCYXNlOjpyZXZlcnNlSW5QbGFjZSgpLCBWZWN0b3J3aXNlT3A6OnJldmVyc2UoKSkuCitcY29kZQordmVjLnJldmVyc2UoKSAgICAgICAgICAgbWF0LmNvbHdpc2UoKS5yZXZlcnNlKCkgICBtYXQucm93d2lzZSgpLnJldmVyc2UoKQordmVjLnJldmVyc2VJblBsYWNlKCkKK1xlbmRjb2RlCisKK1xzdWJzZWN0aW9uIFF1aWNrUmVmX1JlcGxpY2F0ZSBSZXBsaWNhdGUKK1ZlY3RvcnMsIG1hdHJpY2VzLCByb3dzLCBhbmQvb3IgY29sdW1ucyBjYW4gYmUgcmVwbGljYXRlZCBpbiBhbnkgZGlyZWN0aW9uIChzZWUgRGVuc2VCYXNlOjpyZXBsaWNhdGUoKSwgVmVjdG9yd2lzZU9wOjpyZXBsaWNhdGUoKSkKK1xjb2RlCit2ZWMucmVwbGljYXRlKHRpbWVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYy5yZXBsaWNhdGU8VGltZXM+CittYXQucmVwbGljYXRlKHZlcnRpY2FsX3RpbWVzLCBob3Jpem9udGFsX3RpbWVzKSAgICAgICAgICAgICAgIG1hdC5yZXBsaWNhdGU8VmVydGljYWxUaW1lcywgSG9yaXpvbnRhbFRpbWVzPigpCittYXQuY29sd2lzZSgpLnJlcGxpY2F0ZSh2ZXJ0aWNhbF90aW1lcywgaG9yaXpvbnRhbF90aW1lcykgICAgIG1hdC5jb2x3aXNlKCkucmVwbGljYXRlPFZlcnRpY2FsVGltZXMsIEhvcml6b250YWxUaW1lcz4oKQorbWF0LnJvd3dpc2UoKS5yZXBsaWNhdGUodmVydGljYWxfdGltZXMsIGhvcml6b250YWxfdGltZXMpICAgICBtYXQucm93d2lzZSgpLnJlcGxpY2F0ZTxWZXJ0aWNhbFRpbWVzLCBIb3Jpem9udGFsVGltZXM+KCkKK1xlbmRjb2RlCisKKworPGEgaHJlZj0iIyIgY2xhc3M9InRvcCI+dG9wPC9hPlxzZWN0aW9uIFF1aWNrUmVmX0RpYWdUcmlTeW1tIERpYWdvbmFsLCBUcmlhbmd1bGFyLCBhbmQgU2VsZi1hZGpvaW50IG1hdHJpY2VzCisobWF0cml4IHdvcmxkIFxtYXRyaXh3b3JsZCkKKworXHN1YnNlY3Rpb24gUXVpY2tSZWZfRGlhZ29uYWwgRGlhZ29uYWwgbWF0cmljZXMKKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+T3BlcmF0aW9uPC90aD48dGg+Q29kZTwvdGg+PC90cj4KKzx0cj48dGQ+Cit2aWV3IGEgdmVjdG9yIFxsaW5rIE1hdHJpeEJhc2U6OmFzRGlhZ29uYWwoKSBhcyBhIGRpYWdvbmFsIG1hdHJpeCBcZW5kbGluayBcbiA8L3RkPjx0ZD5cY29kZQorbWF0MSA9IHZlYzEuYXNEaWFnb25hbCgpO1xlbmRjb2RlCis8L3RkPjwvdHI+Cis8dHI+PHRkPgorRGVjbGFyZSBhIGRpYWdvbmFsIG1hdHJpeDwvdGQ+PHRkPlxjb2RlCitEaWFnb25hbE1hdHJpeDxTY2FsYXIsU2l6ZUF0Q29tcGlsZVRpbWU+IGRpYWcxKHNpemUpOworZGlhZzEuZGlhZ29uYWwoKSA9IHZlY3RvcjtcZW5kY29kZQorPC90ZD48L3RyPgorPHRyPjx0ZD5BY2Nlc3MgdGhlIFxsaW5rIE1hdHJpeEJhc2U6OmRpYWdvbmFsKCkgZGlhZ29uYWwgXGVuZGxpbmsgYW5kIFxsaW5rIE1hdHJpeEJhc2U6OmRpYWdvbmFsKEluZGV4KSBzdXBlci9zdWIgZGlhZ29uYWxzIFxlbmRsaW5rIG9mIGEgbWF0cml4IGFzIGEgdmVjdG9yIChyZWFkL3dyaXRlKTwvdGQ+CisgPHRkPlxjb2RlCit2ZWMxID0gbWF0MS5kaWFnb25hbCgpOyAgICAgICAgbWF0MS5kaWFnb25hbCgpID0gdmVjMTsgICAgICAvLyBtYWluIGRpYWdvbmFsCit2ZWMxID0gbWF0MS5kaWFnb25hbCgrbik7ICAgICAgbWF0MS5kaWFnb25hbCgrbikgPSB2ZWMxOyAgICAvLyBuLXRoIHN1cGVyIGRpYWdvbmFsCit2ZWMxID0gbWF0MS5kaWFnb25hbCgtbik7ICAgICAgbWF0MS5kaWFnb25hbCgtbikgPSB2ZWMxOyAgICAvLyBuLXRoIHN1YiBkaWFnb25hbAordmVjMSA9IG1hdDEuZGlhZ29uYWw8MT4oKTsgICAgIG1hdDEuZGlhZ29uYWw8MT4oKSA9IHZlYzE7ICAgLy8gZmlyc3Qgc3VwZXIgZGlhZ29uYWwKK3ZlYzEgPSBtYXQxLmRpYWdvbmFsPC0yPigpOyAgICBtYXQxLmRpYWdvbmFsPC0yPigpID0gdmVjMTsgIC8vIHNlY29uZCBzdWIgZGlhZ29uYWwKK1xlbmRjb2RlPC90ZD4KKzwvdHI+CisKKzx0cj48dGQ+T3B0aW1pemVkIHByb2R1Y3RzIGFuZCBpbnZlcnNlPC90ZD4KKyA8dGQ+XGNvZGUKK21hdDMgID0gc2NhbGFyICogZGlhZzEgKiBtYXQxOworbWF0MyArPSBzY2FsYXIgKiBtYXQxICogdmVjMS5hc0RpYWdvbmFsKCk7CittYXQzID0gdmVjMS5hc0RpYWdvbmFsKCkuaW52ZXJzZSgpICogbWF0MQorbWF0MyA9IG1hdDEgKiBkaWFnMS5pbnZlcnNlKCkKK1xlbmRjb2RlPC90ZD4KKzwvdHI+CisKKzwvdGFibGU+CisKK1xzdWJzZWN0aW9uIFF1aWNrUmVmX1RyaWFuZ3VsYXJWaWV3IFRyaWFuZ3VsYXIgdmlld3MKKworVHJpYW5ndWxhclZpZXcgZ2l2ZXMgYSB2aWV3IG9uIGEgdHJpYW5ndWxhciBwYXJ0IG9mIGEgZGVuc2UgbWF0cml4IGFuZCBhbGxvd3MgdG8gcGVyZm9ybSBvcHRpbWl6ZWQgb3BlcmF0aW9ucyBvbiBpdC4gVGhlIG9wcG9zaXRlIHRyaWFuZ3VsYXIgcGFydCBpcyBuZXZlciByZWZlcmVuY2VkIGFuZCBjYW4gYmUgdXNlZCB0byBzdG9yZSBvdGhlciBpbmZvcm1hdGlvbi4KKworXG5vdGUgVGhlIC50cmlhbmd1bGFyVmlldygpIHRlbXBsYXRlIG1lbWJlciBmdW5jdGlvbiByZXF1aXJlcyB0aGUgXGMgdGVtcGxhdGUga2V5d29yZCBpZiBpdCBpcyB1c2VkIG9uIGFuCitvYmplY3Qgb2YgYSB0eXBlIHRoYXQgZGVwZW5kcyBvbiBhIHRlbXBsYXRlIHBhcmFtZXRlcjsgc2VlIFxyZWYgVG9waWNUZW1wbGF0ZUtleXdvcmQgZm9yIGRldGFpbHMuCisKKzx0YWJsZSBjbGFzcz0iZXhhbXBsZSI+Cis8dHI+PHRoPk9wZXJhdGlvbjwvdGg+PHRoPkNvZGU8L3RoPjwvdHI+Cis8dHI+PHRkPgorUmVmZXJlbmNlIHRvIGEgdHJpYW5ndWxhciB3aXRoIG9wdGlvbmFsIFxuCit1bml0IG9yIG51bGwgZGlhZ29uYWwgKHJlYWQvd3JpdGUpOgorPC90ZD48dGQ+XGNvZGUKK20udHJpYW5ndWxhclZpZXc8WHh4PigpCitcZW5kY29kZSBcbgorXGMgWHh4ID0gOjpVcHBlciwgOjpMb3dlciwgOjpTdHJpY3RseVVwcGVyLCA6OlN0cmljdGx5TG93ZXIsIDo6VW5pdFVwcGVyLCA6OlVuaXRMb3dlcgorPC90ZD48L3RyPgorPHRyPjx0ZD4KK1dyaXRpbmcgdG8gYSBzcGVjaWZpYyB0cmlhbmd1bGFyIHBhcnQ6XG4gKG9ubHkgdGhlIHJlZmVyZW5jZWQgdHJpYW5ndWxhciBwYXJ0IGlzIGV2YWx1YXRlZCkKKzwvdGQ+PHRkPlxjb2RlCittMS50cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgPSBtMiArIG0zIFxlbmRjb2RlCis8L3RkPjwvdHI+Cis8dHI+PHRkPgorQ29udmVyc2lvbiB0byBhIGRlbnNlIG1hdHJpeCBzZXR0aW5nIHRoZSBvcHBvc2l0ZSB0cmlhbmd1bGFyIHBhcnQgdG8gemVybzoKKzwvdGQ+PHRkPlxjb2RlCittMiA9IG0xLnRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVbml0VXBwZXI+KClcZW5kY29kZQorPC90ZD48L3RyPgorPHRyPjx0ZD4KK1Byb2R1Y3RzOgorPC90ZD48dGQ+XGNvZGUKK20zICs9IHMxICogbTEuYWRqb2ludCgpLnRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVbml0VXBwZXI+KCkgKiBtMgorbTMgLT0gczEgKiBtMi5jb25qdWdhdGUoKSAqIG0xLmFkam9pbnQoKS50cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgXGVuZGNvZGUKKzwvdGQ+PC90cj4KKzx0cj48dGQ+CitTb2x2aW5nIGxpbmVhciBlcXVhdGlvbnM6XG4KK1xmJCBNXzIgOj0gTF8xXnstMX0gTV8yIFxmJCBcbgorXGYkIE1fMyA6PSB7TF8xXip9XnstMX0gTV8zIFxmJCBcbgorXGYkIE1fNCA6PSBNXzQgVV8xXnstMX0gXGYkCis8L3RkPjx0ZD5cbiBcY29kZQorTDEudHJpYW5ndWxhclZpZXc8RWlnZW46OlVuaXRMb3dlcj4oKS5zb2x2ZUluUGxhY2UoTTIpCitMMS50cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkuYWRqb2ludCgpLnNvbHZlSW5QbGFjZShNMykKK1UxLnRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKS5zb2x2ZUluUGxhY2U8T25UaGVSaWdodD4oTTQpXGVuZGNvZGUKKzwvdGQ+PC90cj4KKzwvdGFibGU+CisKK1xzdWJzZWN0aW9uIFF1aWNrUmVmX1NlbGZhZGpvaW50TWF0cml4IFN5bW1ldHJpYy9zZWxmYWRqb2ludCB2aWV3cworCitKdXN0IGFzIGZvciB0cmlhbmd1bGFyIG1hdHJpeCwgeW91IGNhbiByZWZlcmVuY2UgYW55IHRyaWFuZ3VsYXIgcGFydCBvZiBhIHNxdWFyZSBtYXRyaXggdG8gc2VlIGl0IGFzIGEgc2VsZmFkam9pbnQKK21hdHJpeCBhbmQgcGVyZm9ybSBzcGVjaWFsIGFuZCBvcHRpbWl6ZWQgb3BlcmF0aW9ucy4gQWdhaW4gdGhlIG9wcG9zaXRlIHRyaWFuZ3VsYXIgcGFydCBpcyBuZXZlciByZWZlcmVuY2VkIGFuZCBjYW4gYmUKK3VzZWQgdG8gc3RvcmUgb3RoZXIgaW5mb3JtYXRpb24uCisKK1xub3RlIFRoZSAuc2VsZmFkam9pbnRWaWV3KCkgdGVtcGxhdGUgbWVtYmVyIGZ1bmN0aW9uIHJlcXVpcmVzIHRoZSBcYyB0ZW1wbGF0ZSBrZXl3b3JkIGlmIGl0IGlzIHVzZWQgb24gYW4KK29iamVjdCBvZiBhIHR5cGUgdGhhdCBkZXBlbmRzIG9uIGEgdGVtcGxhdGUgcGFyYW1ldGVyOyBzZWUgXHJlZiBUb3BpY1RlbXBsYXRlS2V5d29yZCBmb3IgZGV0YWlscy4KKworPHRhYmxlIGNsYXNzPSJleGFtcGxlIj4KKzx0cj48dGg+T3BlcmF0aW9uPC90aD48dGg+Q29kZTwvdGg+PC90cj4KKzx0cj48dGQ+CitDb252ZXJzaW9uIHRvIGEgZGVuc2UgbWF0cml4OgorPC90ZD48dGQ+XGNvZGUKK20yID0gbS5zZWxmYWRqb2ludFZpZXc8RWlnZW46Okxvd2VyPigpO1xlbmRjb2RlCis8L3RkPjwvdHI+Cis8dHI+PHRkPgorUHJvZHVjdCB3aXRoIGFub3RoZXIgZ2VuZXJhbCBtYXRyaXggb3IgdmVjdG9yOgorPC90ZD48dGQ+XGNvZGUKK20zICA9IHMxICogbTEuY29uanVnYXRlKCkuc2VsZmFkam9pbnRWaWV3PEVpZ2VuOjpVcHBlcj4oKSAqIG0zOworbTMgLT0gczEgKiBtMy5hZGpvaW50KCkgKiBtMS5zZWxmYWRqb2ludFZpZXc8RWlnZW46Okxvd2VyPigpO1xlbmRjb2RlCis8L3RkPjwvdHI+Cis8dHI+PHRkPgorUmFuayAxIGFuZCByYW5rIEsgdXBkYXRlOiBcbgorXGYkIHVwcGVyKE1fMSkgXG1hdGhyZWx7eyt9ez19fSBzXzEgTV8yIE1fMl4qIFxmJCBcbgorXGYkIGxvd2VyKE1fMSkgXG1hdGhiaW57ey19ez19fSBNXzJeKiBNXzIgXGYkCis8L3RkPjx0ZD5cbiBcY29kZQorTTEuc2VsZmFkam9pbnRWaWV3PEVpZ2VuOjpVcHBlcj4oKS5yYW5rVXBkYXRlKE0yLHMxKTsKK00xLnNlbGZhZGpvaW50VmlldzxFaWdlbjo6TG93ZXI+KCkucmFua1VwZGF0ZShNMi5hZGpvaW50KCksLTEpOyBcZW5kY29kZQorPC90ZD48L3RyPgorPHRyPjx0ZD4KK1JhbmsgMiB1cGRhdGU6IChcZiQgTSBcbWF0aHJlbHt7K317PX19IHMgdSB2XiogKyBzIHYgdV4qIFxmJCkKKzwvdGQ+PHRkPlxjb2RlCitNLnNlbGZhZGpvaW50VmlldzxFaWdlbjo6VXBwZXI+KCkucmFua1VwZGF0ZSh1LHYscyk7CitcZW5kY29kZQorPC90ZD48L3RyPgorPHRyPjx0ZD4KK1NvbHZpbmcgbGluZWFyIGVxdWF0aW9uczpcbihcZiQgTV8yIDo9IE1fMV57LTF9IE1fMiBcZiQpCis8L3RkPjx0ZD5cY29kZQorLy8gdmlhIGEgc3RhbmRhcmQgQ2hvbGVza3kgZmFjdG9yaXphdGlvbgorbTIgPSBtMS5zZWxmYWRqb2ludFZpZXc8RWlnZW46OlVwcGVyPigpLmxsdCgpLnNvbHZlKG0yKTsKKy8vIHZpYSBhIENob2xlc2t5IGZhY3Rvcml6YXRpb24gd2l0aCBwaXZvdGluZworbTIgPSBtMS5zZWxmYWRqb2ludFZpZXc8RWlnZW46Okxvd2VyPigpLmxkbHQoKS5zb2x2ZShtMik7CitcZW5kY29kZQorPC90ZD48L3RyPgorPC90YWJsZT4KKworKi8KKworLyoKKzx0YWJsZSBjbGFzcz0idHV0b3JpYWxfY29kZSI+Cis8dHI+PHRkPgorXGxpbmsgTWF0cml4QmFzZTo6YXNEaWFnb25hbCgpIG1ha2UgYSBkaWFnb25hbCBtYXRyaXggXGVuZGxpbmsgXG4gZnJvbSBhIHZlY3RvciA8L3RkPjx0ZD5cY29kZQorbWF0MSA9IHZlYzEuYXNEaWFnb25hbCgpO1xlbmRjb2RlCis8L3RkPjwvdHI+Cis8dHI+PHRkPgorRGVjbGFyZSBhIGRpYWdvbmFsIG1hdHJpeDwvdGQ+PHRkPlxjb2RlCitEaWFnb25hbE1hdHJpeDxTY2FsYXIsU2l6ZUF0Q29tcGlsZVRpbWU+IGRpYWcxKHNpemUpOworZGlhZzEuZGlhZ29uYWwoKSA9IHZlY3RvcjtcZW5kY29kZQorPC90ZD48L3RyPgorPHRyPjx0ZD5BY2Nlc3MgXGxpbmsgTWF0cml4QmFzZTo6ZGlhZ29uYWwoKSB0aGUgZGlhZ29uYWwgYW5kIHN1cGVyL3N1YiBkaWFnb25hbHMgb2YgYSBtYXRyaXggXGVuZGxpbmsgYXMgYSB2ZWN0b3IgKHJlYWQvd3JpdGUpPC90ZD4KKyA8dGQ+XGNvZGUKK3ZlYzEgPSBtYXQxLmRpYWdvbmFsKCk7ICAgICAgICAgICAgbWF0MS5kaWFnb25hbCgpID0gdmVjMTsgICAgICAvLyBtYWluIGRpYWdvbmFsCit2ZWMxID0gbWF0MS5kaWFnb25hbCgrbik7ICAgICAgICAgIG1hdDEuZGlhZ29uYWwoK24pID0gdmVjMTsgICAgLy8gbi10aCBzdXBlciBkaWFnb25hbAordmVjMSA9IG1hdDEuZGlhZ29uYWwoLW4pOyAgICAgICAgICBtYXQxLmRpYWdvbmFsKC1uKSA9IHZlYzE7ICAgIC8vIG4tdGggc3ViIGRpYWdvbmFsCit2ZWMxID0gbWF0MS5kaWFnb25hbDwxPigpOyAgICAgICAgIG1hdDEuZGlhZ29uYWw8MT4oKSA9IHZlYzE7ICAgLy8gZmlyc3Qgc3VwZXIgZGlhZ29uYWwKK3ZlYzEgPSBtYXQxLmRpYWdvbmFsPC0yPigpOyAgICAgICAgbWF0MS5kaWFnb25hbDwtMj4oKSA9IHZlYzE7ICAvLyBzZWNvbmQgc3ViIGRpYWdvbmFsCitcZW5kY29kZTwvdGQ+Cis8L3RyPgorCis8dHI+PHRkPlZpZXcgb24gYSB0cmlhbmd1bGFyIHBhcnQgb2YgYSBtYXRyaXggKHJlYWQvd3JpdGUpPC90ZD4KKyA8dGQ+XGNvZGUKK21hdDIgPSBtYXQxLnRyaWFuZ3VsYXJWaWV3PFh4eD4oKTsKKy8vIFh4eCA9IFVwcGVyLCBMb3dlciwgU3RyaWN0bHlVcHBlciwgU3RyaWN0bHlMb3dlciwgVW5pdFVwcGVyLCBVbml0TG93ZXIKK21hdDEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBtYXQyICsgbWF0MzsgLy8gb25seSB0aGUgdXBwZXIgcGFydCBpcyBldmFsdWF0ZWQgYW5kIHJlZmVyZW5jZWQKK1xlbmRjb2RlPC90ZD48L3RyPgorCis8dHI+PHRkPlZpZXcgYSB0cmlhbmd1bGFyIHBhcnQgYXMgYSBzeW1tZXRyaWMvc2VsZi1hZGpvaW50IG1hdHJpeCAocmVhZC93cml0ZSk8L3RkPgorIDx0ZD5cY29kZQorbWF0MiA9IG1hdDEuc2VsZmFkam9pbnRWaWV3PFh4eD4oKTsgICAgIC8vIFh4eCA9IFVwcGVyIG9yIExvd2VyCittYXQxLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSA9IG1hdDIgKyBtYXQyLmFkam9pbnQoKTsgIC8vIGV2YWx1YXRlZCBhbmQgd3JpdGUgdG8gdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCBvbmx5CitcZW5kY29kZTwvdGQ+PC90cj4KKworPC90YWJsZT4KKworT3B0aW1pemVkIHByb2R1Y3RzOgorXGNvZGUKK21hdDMgKz0gc2NhbGFyICogdmVjMS5hc0RpYWdvbmFsKCkgKiBtYXQxCittYXQzICs9IHNjYWxhciAqIG1hdDEgKiB2ZWMxLmFzRGlhZ29uYWwoKQorbWF0My5ub2FsaWFzKCkgKz0gc2NhbGFyICogbWF0MS50cmlhbmd1bGFyVmlldzxYeHg+KCkgKiBtYXQyCittYXQzLm5vYWxpYXMoKSArPSBzY2FsYXIgKiBtYXQyICogbWF0MS50cmlhbmd1bGFyVmlldzxYeHg+KCkKK21hdDMubm9hbGlhcygpICs9IHNjYWxhciAqIG1hdDEuc2VsZmFkam9pbnRWaWV3PFVwcGVyIG9yIExvd2VyPigpICogbWF0MgorbWF0My5ub2FsaWFzKCkgKz0gc2NhbGFyICogbWF0MiAqIG1hdDEuc2VsZmFkam9pbnRWaWV3PFVwcGVyIG9yIExvd2VyPigpCittYXQxLnNlbGZhZGpvaW50VmlldzxVcHBlciBvciBMb3dlcj4oKS5yYW5rVXBkYXRlKG1hdDIpOworbWF0MS5zZWxmYWRqb2ludFZpZXc8VXBwZXIgb3IgTG93ZXI+KCkucmFua1VwZGF0ZShtYXQyLmFkam9pbnQoKSwgc2NhbGFyKTsKK1xlbmRjb2RlCisKK0ludmVyc2UgcHJvZHVjdHM6IChhbGwgYXJlIG9wdGltaXplZCkKK1xjb2RlCittYXQzID0gdmVjMS5hc0RpYWdvbmFsKCkuaW52ZXJzZSgpICogbWF0MQorbWF0MyA9IG1hdDEgKiBkaWFnMS5pbnZlcnNlKCkKK21hdDEudHJpYW5ndWxhclZpZXc8WHh4PigpLnNvbHZlSW5QbGFjZShtYXQyKQorbWF0MS50cmlhbmd1bGFyVmlldzxYeHg+KCkuc29sdmVJblBsYWNlPE9uVGhlUmlnaHQ+KG1hdDIpCittYXQyID0gbWF0MS5zZWxmYWRqb2ludFZpZXc8VXBwZXIgb3IgTG93ZXI+KCkubGx0KCkuc29sdmUobWF0MikKK1xlbmRjb2RlCisKKyovCit9CmRpZmYgLS1naXQgYS9kb2MvU3BhcnNlUXVpY2tSZWZlcmVuY2UuZG94IGIvZG9jL1NwYXJzZVF1aWNrUmVmZXJlbmNlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDZlYjBmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1NwYXJzZVF1aWNrUmVmZXJlbmNlLmRveApAQCAtMCwwICsxLDE5OCBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKy8qKiBccGFnZSBTcGFyc2VRdWlja1JlZlBhZ2UgUXVpY2sgcmVmZXJlbmNlIGd1aWRlIGZvciBzcGFyc2UgbWF0cmljZXMKKworXGIgVGFibGUgXGIgb2YgXGIgY29udGVudHMKKyAgLSBccmVmIENvbnN0cnVjdG9ycworICAtIFxyZWYgU3BhcnNlTWF0cml4SW5zZXJ0aW9uCisgIC0gXHJlZiBTcGFyc2VCYXNpY0luZm9zCisgIC0gXHJlZiBTcGFyc2VCYXNpY09wcworICAtIFxyZWYgU3BhcnNlSW50ZXJvcHMKKyAgLSBccmVmIHNwYXJzZXBlcm11dGF0aW9uCisgIC0gXHJlZiBzcGFyc2VzdWJtYXRyaWNlcworICAtIFxyZWYgc3BhcnNlc2VsZmFkam9pbnR2aWV3CitcbiAKKworPGhyPgorCitJbiB0aGlzIHBhZ2UsIHdlIGdpdmUgYSBxdWljayBzdW1tYXJ5IG9mIHRoZSBtYWluIG9wZXJhdGlvbnMgYXZhaWxhYmxlIGZvciBzcGFyc2UgbWF0cmljZXMgaW4gdGhlIGNsYXNzIFNwYXJzZU1hdHJpeC4gRmlyc3QsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHJlYWQgZmlyc3QgdGhlIGludHJvZHVjdG9yeSB0dXRvcmlhbCBhdCBccmVmIFR1dG9yaWFsU3BhcnNlLiBUaGUgaW1wb3J0YW50IHBvaW50IHRvIGhhdmUgaW4gbWluZCB3aGVuIHdvcmtpbmcgb24gc3BhcnNlIG1hdHJpY2VzIGlzIGhvdyB0aGV5IGFyZSBzdG9yZWQgOiAKK2kuZSBlaXRoZXIgcm93IG1ham9yIG9yIGNvbHVtbiBtYWpvci4gVGhlIGRlZmF1bHQgaXMgY29sdW1uIG1ham9yLiBNb3N0IGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvbiBzcGFyc2UgbWF0cmljZXMgd2lsbCBhc3NlcnQgdGhhdCB0aGV5IGhhdmUgdGhlIHNhbWUgc3RvcmFnZSBvcmRlci4gTW9yZW92ZXIsIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBleHRlcm5hbCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IHlldCBzdXBwb3J0ZWQgYnkgRWlnZW4sIGl0IGlzIGltcG9ydGFudCB0byBrbm93IGhvdyB0byBzZW5kIHRoZSByZXF1aXJlZCBtYXRyaXggcG9pbnRlcnMuIAorCitcc2VjdGlvbiBDb25zdHJ1Y3RvcnMgQ29uc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50cworU3BhcnNlTWF0cml4IGlzIHRoZSBjb3JlIGNsYXNzIHRvIGJ1aWxkIGFuZCBtYW5pcHVsYXRlIHNwYXJzZSBtYXRyaWNlcyBpbiBFaWdlbi4gSXQgdGFrZXMgYXMgdGVtcGxhdGUgcGFyYW1ldGVycyB0aGUgU2NhbGFyIHR5cGUgYW5kIHRoZSBzdG9yYWdlIG9yZGVyLCBlaXRoZXIgUm93TWFqb3Igb3IgQ29sdW1uTWFqb3IuIFRoZSBkZWZhdWx0IGlzIENvbHVtbk1ham9yLgorCitcY29kZQorICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBzbTEoMTAwMCwxMDAwKTsgICAgICAgICAgICAgIC8vIDEwMDB4MTAwMCBjb21wcmVzc2VkIHNwYXJzZSBtYXRyaXggb2YgZG91YmxlLiAKKyAgU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LFJvd01ham9yPiBzbTI7IC8vIENvbXByZXNzZWQgcm93IG1ham9yIG1hdHJpeCBvZiBjb21wbGV4IGRvdWJsZS4KK1xlbmRjb2RlCitUaGUgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IG1hdHJpY2VzIGZyb20gYSBzdG9yYWdlIG9yZGVyIHRvIGFub3RoZXIKK1xjb2RlIAorICBTcGFyc2VNYXRyaXg8ZG91YmxlLENvbG1ham9yPiBzbTE7CisgIC8vIEV2ZW50dWFsbHkgZmlsbCB0aGUgbWF0cml4IHNtMSAuLi4KKyAgU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dtYWpvcj4gc20yKHNtMSksIHNtMzsgICAgICAgICAvLyBJbml0aWFsaXplIHNtMiB3aXRoIHNtMS4KKyAgc20zID0gc20xOyAvLyBBc3NpZ25tZW50IGFuZCBldmFsdWF0aW9ucyBtb2RpZnkgdGhlIHN0b3JhZ2Ugb3JkZXIuCisgXGVuZGNvZGUKKworXHNlY3Rpb24gU3BhcnNlTWF0cml4SW5zZXJ0aW9uICBBbGxvY2F0aW5nIGFuZCBpbnNlcnRpbmcgdmFsdWVzCityZXNpemUoKSBhbmQgcmVzZXJ2ZSgpIGFyZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSBhbmQgYWxsb2NhdGUgc3BhY2UgZm9yIG5vbnplcm8gZWxlbWVudHMKKyBcY29kZQorICAgIHNtMS5yZXNpemUobSxuKTsgICAgICAvL0NoYW5nZSBzbSB0byBhIG14biBtYXRyaXguIAorICAgIHNtMS5yZXNlcnZlKG5ueik7ICAgICAvLyBBbGxvY2F0ZSAgcm9vbSBmb3Igbm56IG5vbnplcm9zIGVsZW1lbnRzLiAgIAorICBcZW5kY29kZSAKK05vdGUgdGhhdCB3aGVuIGNhbGxpbmcgcmVzZXJ2ZSgpLCBpdCBpcyBub3QgcmVxdWlyZWQgdGhhdCBubnogaXMgdGhlIGV4YWN0IG51bWJlciBvZiBub256ZXJvIGVsZW1lbnRzIGluIHRoZSBmaW5hbCBtYXRyaXguIEhvd2V2ZXIsIGFuIGV4YWN0IGVzdGltYXRpb24gd2lsbCBhdm9pZCBtdWx0aXBsZSByZWFsbG9jYXRpb25zIGR1cmluZyB0aGUgaW5zZXJ0aW9uIHBoYXNlLiAKKworSW5zZXJ0aW9ucyBvZiB2YWx1ZXMgaW4gdGhlIHNwYXJzZSBtYXRyaXggY2FuIGJlIGRvbmUgZGlyZWN0bHkgYnkgbG9vcGluZyBvdmVyIG5vbnplcm8gZWxlbWVudHMgYW5kIHVzZSB0aGUgaW5zZXJ0KCkgZnVuY3Rpb24KK1xjb2RlIAorLy8gRGlyZWN0IGluc2VydGlvbiBvZiB0aGUgdmFsdWUgdl9pajsgCisgIHNtMS5pbnNlcnQoaSwgaikgPSB2X2lqOyAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCB2X2lqIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIG1hdHJpeC4gCitcZW5kY29kZQorCitBZnRlciBpbnNlcnRpb24sIGEgdmFsdWUgYXQgKGksaikgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIGNvZWZmUmVmKCkKK1xjb2RlCisgIC8vIFVwZGF0ZSB0aGUgdmFsdWUgdl9pagorICBzbTEuY29lZmZSZWYoaSxqKSA9IHZfaWo7CisgIHNtMS5jb2VmZlJlZihpLGopICs9IHZfaWo7CisgIHNtMS5jb2VmZlJlZihpLGopIC09IHZfaWo7CisgIC4uLgorXGVuZGNvZGUKKworVGhlIHJlY29tbWVuZGVkIHdheSB0byBpbnNlcnQgdmFsdWVzIGlzIHRvIGJ1aWxkIGEgbGlzdCBvZiB0cmlwbGV0cyAocm93LCBjb2wsIHZhbCkgYW5kIHRoZW4gY2FsbCBzZXRGcm9tVHJpcGxldHMoKS4gCitcY29kZQorICBzbTEuc2V0RnJvbVRyaXBsZXRzKFRyaXBsZXRMaXN0LmJlZ2luKCksIFRyaXBsZXRMaXN0LmVuZCgpKTsKK1xlbmRjb2RlCitBIGNvbXBsZXRlIGV4YW1wbGUgaXMgYXZhaWxhYmxlIGF0IFxyZWYgVHV0b3JpYWxTcGFyc2VGaWxsaW5nLgorCitUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBzZXQgY29uc3RhbnQgb3IgcmFuZG9tIHZhbHVlcyBpbiB0aGUgbWF0cml4LgorXGNvZGUKKyAgc20xLnNldFplcm8oKTsgLy8gUmVzZXQgdGhlIG1hdHJpeCB3aXRoIHplcm8gZWxlbWVudHMKKyAgLi4uCitcZW5kY29kZQorCitcc2VjdGlvbiBTcGFyc2VCYXNpY0luZm9zIE1hdHJpeCBwcm9wZXJ0aWVzCitCZXlvbmQgdGhlIGZ1bmN0aW9ucyByb3dzKCkgYW5kIGNvbHMoKSB0aGF0IGFyZSB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMsIHRoZXJlIGFyZSBzb21lIHVzZWZ1bCBmdW5jdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIGVhc2lseSBnZXQgc29tZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgbWF0cml4LiAKKzx0YWJsZSBjbGFzcz0ibWFudWFsIj4KKzx0cj4KKyAgPHRkPiBcY29kZQorICBzbTEucm93cygpOyAgICAgICAgIC8vIE51bWJlciBvZiByb3dzCisgIHNtMS5jb2xzKCk7ICAgICAgICAgLy8gTnVtYmVyIG9mIGNvbHVtbnMgCisgIHNtMS5ub25aZXJvcygpOyAgICAgLy8gTnVtYmVyIG9mIG5vbiB6ZXJvIHZhbHVlcyAgIAorICBzbTEub3V0ZXJTaXplKCk7ICAgIC8vIE51bWJlciBvZiBjb2x1bW5zIChyZXNwLiByb3dzKSBmb3IgYSBjb2x1bW4gbWFqb3IgKHJlc3AuIHJvdyBtYWpvciApCisgIHNtMS5pbm5lclNpemUoKTsgICAgLy8gTnVtYmVyIG9mIHJvd3MgKHJlc3AuIGNvbHVtbnMpIGZvciBhIHJvdyBtYWpvciAocmVzcC4gY29sdW1uIG1ham9yKQorICBzbTEubm9ybSgpOyAgICAgICAgIC8vIChFdWNsaWRpYW4gPz8pIG5vcm0gb2YgdGhlIG1hdHJpeAorICBzbTEuc3F1YXJlZE5vcm0oKTsgIC8vIAorICBzbTEuaXNWZWN0b3IoKTsgICAgIC8vIENoZWNrIGlmIHNtMSBpcyBhIHNwYXJzZSB2ZWN0b3Igb3IgYSBzcGFyc2UgbWF0cml4CisgIC4uLgorICBcZW5kY29kZSA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKK1xzZWN0aW9uIFNwYXJzZUJhc2ljT3BzIEFyaXRobWV0aWMgb3BlcmF0aW9ucworSXQgaXMgZWFzeSB0byBwZXJmb3JtIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvbiBzcGFyc2UgbWF0cmljZXMgcHJvdmlkZWQgdGhhdCB0aGUgZGltZW5zaW9ucyBhcmUgYWRlcXVhdGUgYW5kIHRoYXQgdGhlIG1hdHJpY2VzIGhhdmUgdGhlIHNhbWUgc3RvcmFnZSBvcmRlci4gTm90ZSB0aGF0IHRoZSBldmFsdWF0aW9uIGNhbiBhbHdheXMgYmUgZG9uZSBpbiBhIG1hdHJpeCB3aXRoIGEgZGlmZmVyZW50IHN0b3JhZ2Ugb3JkZXIuIAorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD4gT3BlcmF0aW9ucyA8L3RoPiA8dGg+IENvZGUgPC90aD4gPHRoPiBOb3RlcyA8L3RoPjwvdHI+CisKKzx0cj4KKyAgPHRkPiBhZGQgc3VidHJhY3QgPC90ZD4gCisgIDx0ZD4gXGNvZGUKKyAgc20zID0gc20xICsgc20yOyAKKyAgc20zID0gc20xIC0gc20yOworICBzbTIgKz0gc20xOyAKKyAgc20yIC09IHNtMTsgXGVuZGNvZGUKKyAgPC90ZD4KKyAgPHRkPiAKKyAgc20xIGFuZCBzbTIgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc3RvcmFnZSBvcmRlcgorICA8L3RkPiAKKzwvdHI+CisKKzx0ciBjbGFzcz0iYWx0Ij48dGQ+CisgIHNjYWxhciBwcm9kdWN0PC90ZD48dGQ+XGNvZGUKKyAgc20zID0gc20xICogczE7ICAgc20zICo9IHMxOyAKKyAgc20zID0gczEgKiBzbTEgKyBzMiAqIHNtMjsgc20zIC89IHMxO1xlbmRjb2RlCisgIDwvdGQ+CisgIDx0ZD4KKyAgICBNYW55IGNvbWJpbmF0aW9ucyBhcmUgcG9zc2libGUgaWYgdGhlIGRpbWVuc2lvbnMgYW5kIHRoZSBzdG9yYWdlIG9yZGVyIGFncmVlLgorPC90cj4KKworPHRyPgorICA8dGQ+IFByb2R1Y3QgPC90ZD4KKyAgPHRkPiBcY29kZQorICBzbTMgPSBzbTEgKiBzbTI7CisgIGRtMiA9IHNtMSAqIGRtMTsKKyAgZHYyID0gc20xICogZHYxOworICBcZW5kY29kZSA8L3RkPgorICA8dGQ+CisgIDwvdGQ+Cis8L3RyPiAKKworPHRyIGNsYXNzPSdhbHQnPgorICA8dGQ+IHRyYW5zcG9zaXRpb24sIGFkam9pbnQ8L3RkPgorICA8dGQ+IFxjb2RlCisgIHNtMiA9IHNtMS50cmFuc3Bvc2UoKTsKKyAgc20yID0gc20xLmFkam9pbnQoKTsKKyAgXGVuZGNvZGUgPC90ZD4KKyAgPHRkPgorICBOb3RlIHRoYXQgdGhlIHRyYW5zcG9zaXRpb24gY2hhbmdlIHRoZSBzdG9yYWdlIG9yZGVyLiBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciB0cmFuc3Bvc2VJblBsYWNlKCkuCisgIDwvdGQ+Cis8L3RyPiAKKworPHRyPgorICA8dGQ+CisgIENvbXBvbmVudC13aXNlIG9wcworICA8L3RkPgorICA8dGQ+XGNvZGUgCisgIHNtMS5jd2lzZVByb2R1Y3Qoc20yKTsKKyAgc20xLmN3aXNlUXVvdGllbnQoc20yKTsKKyAgc20xLmN3aXNlTWluKHNtMik7CisgIHNtMS5jd2lzZU1heChzbTIpOworICBzbTEuY3dpc2VBYnMoKTsKKyAgc20xLmN3aXNlU3FydCgpOworICBcZW5kY29kZTwvdGQ+CisgIDx0ZD4KKyAgc20xIGFuZCBzbTIgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc3RvcmFnZSBvcmRlcgorICA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKworXHNlY3Rpb24gU3BhcnNlSW50ZXJvcHMgTG93LWxldmVsIHN0b3JhZ2UKK1RoZXJlIGFyZSBhIHNldCBvZiBsb3ctbGV2ZWxzIGZ1bmN0aW9ucyB0byBnZXQgdGhlIHN0YW5kYXJkIGNvbXByZXNzZWQgc3RvcmFnZSBwb2ludGVycy4gVGhlIG1hdHJpeCBzaG91bGQgYmUgaW4gY29tcHJlc3NlZCBtb2RlIHdoaWNoIGNhbiBiZSBjaGVja2VkIGJ5IGNhbGxpbmcgaXNDb21wcmVzc2VkKCk7IG1ha2VDb21wcmVzc2VkKCkgc2hvdWxkIGRvIHRoZSBqb2Igb3RoZXJ3aXNlLiAKK1xjb2RlCisgIC8vIFNjYWxhciBwb2ludGVyIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIG1hdHJpeCwgc2l6ZSBubnoKKyAgc20xLnZhbHVlUHRyKCk7ICAKKyAgLy8gSW5kZXggcG9pbnRlciB0byBnZXQgdGhlIHJvdyBpbmRpY2VzIChyZXNwLiBjb2x1bW4gaW5kaWNlcykgZm9yIGNvbHVtbiBtYWpvciAocmVzcC4gcm93IG1ham9yKSBtYXRyaXgsIHNpemUgbm56CisgIHNtMS5pbm5lckluZGV4UHRyKCk7CisgIC8vIEluZGV4IHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJvdyAocmVzcC4gY29sdW1uKSBpbiB2YWx1ZVB0cigpIGFuZCBpbm5lckluZGV4UHRyKCkgZm9yIGNvbHVtbiBtYWpvciAocm93IG1ham9yKS4gVGhlIHNpemUgaXMgb3V0ZXJzaXplKCkrMTsgCisgIHNtMS5vdXRlckluZGV4UHRyKCk7ICAKK1xlbmRjb2RlCitUaGVzZSBwb2ludGVycyBjYW4gdGhlcmVmb3JlIGJlIGVhc2lseSB1c2VkIHRvIHNlbmQgdGhlIG1hdHJpeCB0byBzb21lIGV4dGVybmFsIGxpYnJhcmllcy9zb2x2ZXJzIHRoYXQgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IEVpZ2VuLgorCitcc2VjdGlvbiBzcGFyc2VwZXJtdXRhdGlvbiBQZXJtdXRhdGlvbnMsIHN1Ym1hdHJpY2VzIGFuZCBTZWxmYWRqb2ludCBWaWV3cworSW4gbWFueSBjYXNlcywgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlb3JkZXIgdGhlIHJvd3MgYW5kL29yIHRoZSBjb2x1bW5zIG9mIHRoZSBzcGFyc2UgbWF0cml4IGZvciBzZXZlcmFsIHB1cnBvc2VzIDogZmlsbC1pbiByZWR1Y2luZyBkdXJpbmcgbWF0cml4IGRlY29tcG9zaXRpb24sIGJldHRlciBkYXRhIGxvY2FsaXR5IGZvciBzcGFyc2UgbWF0cml4LXZlY3RvciBwcm9kdWN0cy4uLiBUaGUgY2xhc3MgUGVybXV0YXRpb25NYXRyaXggaXMgYXZhaWxhYmxlIHRvIHRoaXMgZW5kLiAKKyBcY29kZQorICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLCBEeW5hbWljLCBpbnQ+IHBlcm07CisgIC8vIFJlc2VydmUgYW5kIGZpbGwgdGhlIHZhbHVlcyBvZiBwZXJtOyAKKyAgcGVybS5pbnZlcnNlKG4pOyAvLyBDb21wdXRlIGV2ZW50dWFsbHkgdGhlIGludmVyc2UgcGVybXV0YXRpb24KKyAgc20xLnR3aXN0ZWRCeShwZXJtKSAvL0FwcGx5IHRoZSBwZXJtdXRhdGlvbiBvbiByb3dzIGFuZCBjb2x1bW5zIAorICBzbTIgPSBzbTEgKiBwZXJtOyAvLyA/Pz8gQXBwbHkgdGhlIHBlcm11dGF0aW9uIG9uIGNvbHVtbnMgPz8/OyAKKyAgc20yID0gcGVybSAqIHNtMTsgLy8gPz8/IEFwcGx5IHRoZSBwZXJtdXRhdGlvbiBvbiByb3dzID8/PzsgCisgIFxlbmRjb2RlCisKK1xzZWN0aW9uIHNwYXJzZXN1Ym1hdHJpY2VzIFN1Yi1tYXRyaWNlcworVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWZ1bCB0byBleHRyYWN0IGEgYmxvY2sgb2Ygcm93cyAocmVzcC4gY29sdW1ucykgZnJvbSBhIHJvdy1tYWpvciAocmVzcC4gY29sdW1uIG1ham9yKSBzcGFyc2UgbWF0cml4LiBOb3RlIHRoYXQgYmVjYXVzZSBvZiB0aGUgcGFydGljdWxhciBzdG9yYWdlLCBpdCBpcyBub3QgPz8gZWZmaWNpZW50ID8/IHRvIGV4dHJhY3QgYSBzdWJtYXRyaXggY29tcHJpc2luZyBhIGNlcnRhaW4gbnVtYmVyIG9mIHN1YnJvd3MgYW5kIHN1YmNvbHVtbnMuCisgXGNvZGUKKyAgc20xLmlubmVyVmVjdG9yKG91dGVyKTsgLy8gUmV0dXJucyB0aGUgb3V0ZXIgLXRoIGNvbHVtbiAocmVzcC4gcm93KSBvZiB0aGUgbWF0cml4IGlmIHNtIGlzIGNvbC1tYWpvciAocmVzcC4gcm93LW1ham9yKQorICBzbTEuaW5uZXJWZWN0b3JzKG91dGVyKTsgLy8gUmV0dXJucyB0aGUgb3V0ZXIgLXRoIGNvbHVtbiAocmVzcC4gcm93KSBvZiB0aGUgbWF0cml4IGlmIG1hdCBpcyBjb2wtbWFqb3IgKHJlc3AuIHJvdy1tYWpvcikKKyAgc20xLm1pZGRsZVJvd3Moc3RhcnQsIG51bVJvd3MpOyAvLyBGb3Igcm93IG1ham9yIG1hdHJpY2VzLCBnZXQgYSByYW5nZSBvZiBudW1Sb3dzIHJvd3MKKyAgc20xLm1pZGRsZUNvbHMoc3RhcnQsIG51bUNvbHMpOyAvLyBGb3IgY29sdW1uIG1ham9yIG1hdHJpY2VzLCBnZXQgYSByYW5nZSBvZiBudW1Db2xzIGNvbHMKKyBcZW5kY29kZSAKKyBFeGFtcGxlcyA6IAorCitcc2VjdGlvbiBzcGFyc2VzZWxmYWRqb2ludHZpZXcgU3BhcnNlIHRyaWFuZ3VsYXIgYW5kIHNlbGZhZGpvaW50IFZpZXdzCisgXGNvZGUKKyAgc20yID0gc20xLnRyaWFuZ3VsYXJ2aWV3PExvd2VyPigpOyAvLyBHZXQgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgcGFydCBvZiB0aGUgbWF0cml4LiAKKyAgZHYyID0gc20xLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKGR2MSk7IC8vIFNvbHZlIHRoZSBsaW5lYXIgc3lzdGVtIHdpdGggdGhlIHVwcHBlciB0cmlhbmd1bGFyIHBhcnQuIAorICBzbTIgPSBzbTEuc2VsZmFkam9pbnR2aWV3PExvd2VyPigpOyAvLyBCdWlsZCBhIHNlbGZhZGpvaW50IG1hdHJpeCBmcm9tIHRoZSBsb3dlciBwYXJ0IG9mIHNtMS4gCisgIFxlbmRjb2RlCisKKworKi8KK30KZGlmZiAtLWdpdCBhL2RvYy9Ub3BpY0xpbmVhckFsZ2VicmFEZWNvbXBvc2l0aW9ucy5kb3ggYi9kb2MvVG9waWNMaW5lYXJBbGdlYnJhRGVjb21wb3NpdGlvbnMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTU2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvVG9waWNMaW5lYXJBbGdlYnJhRGVjb21wb3NpdGlvbnMuZG94CkBAIC0wLDAgKzEsMjYwIEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNMaW5lYXJBbGdlYnJhRGVjb21wb3NpdGlvbnMgTGluZWFyIGFsZ2VicmEgYW5kIGRlY29tcG9zaXRpb25zCisKKworXHNlY3Rpb24gVG9waWNMaW5BbGdCaWdUYWJsZSBDYXRhbG9ndWUgb2YgZGVjb21wb3NpdGlvbnMgb2ZmZXJlZCBieSBFaWdlbgorCis8dGFibGUgY2xhc3M9Im1hbnVhbC12bCI+CisKKyAgICA8dHI+CisgICAgICAgIDx0aCBjbGFzcz0ibWV0YSI+PC90aD4KKyAgICAgICAgPHRoIGNsYXNzPSJtZXRhIiBjb2xzcGFuPSI1Ij5HZW5lcmljIGluZm9ybWF0aW9uLCBub3QgRWlnZW4tc3BlY2lmaWM8L3RoPgorICAgICAgICA8dGggY2xhc3M9Im1ldGEiIGNvbHNwYW49IjMiPkVpZ2VuLXNwZWNpZmljPC90aD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgICA8dGg+RGVjb21wb3NpdGlvbjwvdGg+CisgICAgICAgIDx0aD5SZXF1aXJlbWVudHMgb24gdGhlIG1hdHJpeDwvdGg+CisgICAgICAgIDx0aD5TcGVlZDwvdGg+CisgICAgICAgIDx0aD5BbGdvcml0aG0gcmVsaWFiaWxpdHkgYW5kIGFjY3VyYWN5PC90aD4KKyAgICAgICAgPHRoPlJhbmstcmV2ZWFsaW5nPC90aD4KKyAgICAgICAgPHRoPkFsbG93cyB0byBjb21wdXRlIChiZXNpZGVzIGxpbmVhciBzb2x2aW5nKTwvdGg+CisgICAgICAgIDx0aD5MaW5lYXIgc29sdmVyIHByb3ZpZGVkIGJ5IEVpZ2VuPC90aD4KKyAgICAgICAgPHRoPk1hdHVyaXR5IG9mIEVpZ2VuJ3MgaW1wbGVtZW50YXRpb248L3RoPgorICAgICAgICA8dGg+T3B0aW1pemF0aW9uczwvdGg+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRkPlBhcnRpYWxQaXZMVTwvdGQ+CisgICAgICAgIDx0ZD5JbnZlcnRpYmxlPC90ZD4KKyAgICAgICAgPHRkPkZhc3Q8L3RkPgorICAgICAgICA8dGQ+RGVwZW5kcyBvbiBjb25kaXRpb24gbnVtYmVyPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+RXhjZWxsZW50PC90ZD4KKyAgICAgICAgPHRkPkJsb2NraW5nLCBJbXBsaWNpdCBNVDwvdGQ+CisgICAgPC90cj4KKworICAgIDx0ciBjbGFzcz0iYWx0Ij4KKyAgICAgICAgPHRkPkZ1bGxQaXZMVTwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPlNsb3c8L3RkPgorICAgICAgICA8dGQ+UHJvdmVuPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD5FeGNlbGxlbnQ8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRkPkhvdXNlaG9sZGVyUVI8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5GYXN0PC90ZD4KKyAgICAgICAgPHRkPkRlcGVuZHMgb24gY29uZGl0aW9uIG51bWJlcjwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPk9ydGhvZ29uYWxpemF0aW9uPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD5FeGNlbGxlbnQ8L3RkPgorICAgICAgICA8dGQ+QmxvY2tpbmc8L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHIgY2xhc3M9ImFsdCI+CisgICAgICAgIDx0ZD5Db2xQaXZIb3VzZWhvbGRlclFSPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+RmFzdDwvdGQ+CisgICAgICAgIDx0ZD5Hb29kPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD5PcnRob2dvbmFsaXphdGlvbjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+RXhjZWxsZW50PC90ZD4KKyAgICAgICAgPHRkPjxlbT5Tb29uOiBibG9ja2luZzwvZW0+PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgICA8dGQ+RnVsbFBpdkhvdXNlaG9sZGVyUVI8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5TbG93PC90ZD4KKyAgICAgICAgPHRkPlByb3ZlbjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+T3J0aG9nb25hbGl6YXRpb248L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPHRkPkF2ZXJhZ2U8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgPC90cj4KKworICAgIDx0ciBjbGFzcz0iYWx0Ij4KKyAgICAgICAgPHRkPkxMVDwvdGQ+CisgICAgICAgIDx0ZD5Qb3NpdGl2ZSBkZWZpbml0ZTwvdGQ+CisgICAgICAgIDx0ZD5WZXJ5IGZhc3Q8L3RkPgorICAgICAgICA8dGQ+RGVwZW5kcyBvbiBjb25kaXRpb24gbnVtYmVyPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+RXhjZWxsZW50PC90ZD4KKyAgICAgICAgPHRkPkJsb2NraW5nPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgICA8dGQ+TERMVDwvdGQ+CisgICAgICAgIDx0ZD5Qb3NpdGl2ZSBvciBuZWdhdGl2ZSBzZW1pZGVmaW5pdGU8c3VwPjxhIGhyZWY9IiNub3RlMSI+MTwvYT48L3N1cD48L3RkPgorICAgICAgICA8dGQ+VmVyeSBmYXN0PC90ZD4KKyAgICAgICAgPHRkPkdvb2Q8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD5FeGNlbGxlbnQ8L3RkPgorICAgICAgICA8dGQ+PGVtPlNvb246IGJsb2NraW5nPC9lbT48L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+PHRoIGNsYXNzPSJpbnRlciIgY29sc3Bhbj0iOSI+XG4gU2luZ3VsYXIgdmFsdWVzIGFuZCBlaWdlbnZhbHVlcyBkZWNvbXBvc2l0aW9uczwvdGg+PC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRkPkphY29iaVNWRCAodHdvLXNpZGVkKTwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPlNsb3cgKGJ1dCBmYXN0IGZvciBzbWFsbCBtYXRyaWNlcyk8L3RkPgorICAgICAgICA8dGQ+RXhjZWxsZW50LVByb3ZlbjxzdXA+PGEgaHJlZj0iI25vdGUzIj4zPC9hPjwvc3VwPjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+U2luZ3VsYXIgdmFsdWVzL3ZlY3RvcnMsIGxlYXN0IHNxdWFyZXM8L3RkPgorICAgICAgICA8dGQ+WWVzIChhbmQgZG9lcyBsZWFzdCBzcXVhcmVzKTwvdGQ+CisgICAgICAgIDx0ZD5FeGNlbGxlbnQ8L3RkPgorICAgICAgICA8dGQ+Ui1TVkQ8L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHIgY2xhc3M9ImFsdCI+CisgICAgICAgIDx0ZD5TZWxmQWRqb2ludEVpZ2VuU29sdmVyPC90ZD4KKyAgICAgICAgPHRkPlNlbGYtYWRqb2ludDwvdGQ+CisgICAgICAgIDx0ZD5GYXN0LWF2ZXJhZ2U8c3VwPjxhIGhyZWY9IiNub3RlMiI+MjwvYT48L3N1cD48L3RkPgorICAgICAgICA8dGQ+R29vZDwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+RWlnZW52YWx1ZXMvdmVjdG9yczwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPkdvb2Q8L3RkPgorICAgICAgICA8dGQ+PGVtPkNsb3NlZCBmb3JtcyBmb3IgMngyIGFuZCAzeDM8L2VtPjwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRkPkNvbXBsZXhFaWdlblNvbHZlcjwvdGQ+CisgICAgICAgIDx0ZD5TcXVhcmU8L3RkPgorICAgICAgICA8dGQ+U2xvdy12ZXJ5IHNsb3c8c3VwPjxhIGhyZWY9IiNub3RlMiI+MjwvYT48L3N1cD48L3RkPgorICAgICAgICA8dGQ+RGVwZW5kcyBvbiBjb25kaXRpb24gbnVtYmVyPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD5FaWdlbnZhbHVlcy92ZWN0b3JzPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+QXZlcmFnZTwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyIGNsYXNzPSJhbHQiPgorICAgICAgICA8dGQ+RWlnZW5Tb2x2ZXI8L3RkPgorICAgICAgICA8dGQ+U3F1YXJlIGFuZCByZWFsPC90ZD4KKyAgICAgICAgPHRkPkF2ZXJhZ2Utc2xvdzxzdXA+PGEgaHJlZj0iI25vdGUyIj4yPC9hPjwvc3VwPjwvdGQ+CisgICAgICAgIDx0ZD5EZXBlbmRzIG9uIGNvbmRpdGlvbiBudW1iZXI8L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPHRkPkVpZ2VudmFsdWVzL3ZlY3RvcnM8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5BdmVyYWdlPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICAgIDx0ZD5HZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8L3RkPgorICAgICAgICA8dGQ+U3F1YXJlPC90ZD4KKyAgICAgICAgPHRkPkZhc3QtYXZlcmFnZTxzdXA+PGEgaHJlZj0iI25vdGUyIj4yPC9hPjwvc3VwPjwvdGQ+CisgICAgICAgIDx0ZD5EZXBlbmRzIG9uIGNvbmRpdGlvbiBudW1iZXI8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD5HZW5lcmFsaXplZCBlaWdlbnZhbHVlcy92ZWN0b3JzPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+R29vZDwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPjx0aCBjbGFzcz0iaW50ZXIiIGNvbHNwYW49IjkiPlxuIEhlbHBlciBkZWNvbXBvc2l0aW9uczwvdGg+PC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRkPlJlYWxTY2h1cjwvdGQ+CisgICAgICAgIDx0ZD5TcXVhcmUgYW5kIHJlYWw8L3RkPgorICAgICAgICA8dGQ+QXZlcmFnZS1zbG93PHN1cD48YSBocmVmPSIjbm90ZTIiPjI8L2E+PC9zdXA+PC90ZD4KKyAgICAgICAgPHRkPkRlcGVuZHMgb24gY29uZGl0aW9uIG51bWJlcjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPkF2ZXJhZ2U8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgPC90cj4KKworICAgIDx0ciBjbGFzcz0iYWx0Ij4KKyAgICAgICAgPHRkPkNvbXBsZXhTY2h1cjwvdGQ+CisgICAgICAgIDx0ZD5TcXVhcmU8L3RkPgorICAgICAgICA8dGQ+U2xvdy12ZXJ5IHNsb3c8c3VwPjxhIGhyZWY9IiNub3RlMiI+MjwvYT48L3N1cD48L3RkPgorICAgICAgICA8dGQ+RGVwZW5kcyBvbiBjb25kaXRpb24gbnVtYmVyPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+QXZlcmFnZTwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyIGNsYXNzPSJhbHQiPgorICAgICAgICA8dGQ+VHJpZGlhZ29uYWxpemF0aW9uPC90ZD4KKyAgICAgICAgPHRkPlNlbGYtYWRqb2ludDwvdGQ+CisgICAgICAgIDx0ZD5GYXN0PC90ZD4KKyAgICAgICAgPHRkPkdvb2Q8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+R29vZDwvdGQ+CisgICAgICAgIDx0ZD48ZW0+U29vbjogYmxvY2tpbmc8L2VtPjwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgICAgPHRkPkhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPC90ZD4KKyAgICAgICAgPHRkPlNxdWFyZTwvdGQ+CisgICAgICAgIDx0ZD5BdmVyYWdlPC90ZD4KKyAgICAgICAgPHRkPkdvb2Q8L3RkPgorICAgICAgICA8dGQ+LTwvdGQ+CisgICAgICAgIDx0ZD4tPC90ZD4KKyAgICAgICAgPHRkPi08L3RkPgorICAgICAgICA8dGQ+R29vZDwvdGQ+CisgICAgICAgIDx0ZD48ZW0+U29vbjogYmxvY2tpbmc8L2VtPjwvdGQ+CisgICAgPC90cj4KKworPC90YWJsZT4KKworXGIgTm90ZXM6Cis8dWw+Cis8bGk+PGEgbmFtZT0ibm90ZTEiPlxiIDE6IDwvYT5UaGVyZSBleGlzdCB0d28gdmFyaWFudHMgb2YgdGhlIExETFQgYWxnb3JpdGhtLiBFaWdlbidzIG9uZSBwcm9kdWNlcyBhIHB1cmUgZGlhZ29uYWwgRCBtYXRyaXgsIGFuZCB0aGVyZWZvcmUgaXQgY2Fubm90IGhhbmRsZSBpbmRlZmluaXRlIG1hdHJpY2VzLCB1bmxpa2UgTGFwYWNrJ3Mgb25lIHdoaWNoIHByb2R1Y2VzIGEgYmxvY2sgZGlhZ29uYWwgRCBtYXRyaXguPC9saT4KKzxsaT48YSBuYW1lPSJub3RlMiI+XGIgMjogPC9hPkVpZ2VudmFsdWVzLCBTVkQgYW5kIFNjaHVyIGRlY29tcG9zaXRpb25zIHJlbHkgb24gaXRlcmF0aXZlIGFsZ29yaXRobXMuIFRoZWlyIGNvbnZlcmdlbmNlIHNwZWVkIGRlcGVuZHMgb24gaG93IHdlbGwgdGhlIGVpZ2VudmFsdWVzIGFyZSBzZXBhcmF0ZWQuPC9saT4KKzxsaT48YSBuYW1lPSJub3RlMyI+XGIgMzogPC9hPk91ciBKYWNvYmlTVkQgaXMgdHdvLXNpZGVkLCBtYWtpbmcgZm9yIHByb3ZlbiBhbmQgb3B0aW1hbCBwcmVjaXNpb24gZm9yIHNxdWFyZSBtYXRyaWNlcy4gRm9yIG5vbi1zcXVhcmUgbWF0cmljZXMsIHdlIGhhdmUgdG8gdXNlIGEgUVIgcHJlY29uZGl0aW9uZXIgZmlyc3QuIFRoZSBkZWZhdWx0IGNob2ljZSwgQ29sUGl2SG91c2Vob2xkZXJRUiwgaXMgYWxyZWFkeSB2ZXJ5IHJlbGlhYmxlLCBidXQgaWYgeW91IHdhbnQgaXQgdG8gYmUgcHJvdmVuLCB1c2UgRnVsbFBpdkhvdXNlaG9sZGVyUVIgaW5zdGVhZC4KKzwvdWw+CisKK1xzZWN0aW9uIFRvcGljTGluQWxnVGVybWlub2xvZ3kgVGVybWlub2xvZ3kKKworPGRsPgorICA8ZHQ+PGI+U2VsZmFkam9pbnQ8L2I+PC9kdD4KKyAgICA8ZGQ+Rm9yIGEgcmVhbCBtYXRyaXgsIHNlbGZhZGpvaW50IGlzIGEgc3lub255bSBmb3Igc3ltbWV0cmljLiBGb3IgYSBjb21wbGV4IG1hdHJpeCwgc2VsZmFkam9pbnQgaXMgYSBzeW5vbnltIGZvciBcZW0gaGVybWl0aWFuLgorICAgICAgICBNb3JlIGdlbmVyYWxseSwgYSBtYXRyaXggXGYkIEEgXGYkIGlzIHNlbGZhZGpvaW50IGlmIGFuZCBvbmx5IGlmIGl0IGlzIGVxdWFsIHRvIGl0cyBhZGpvaW50IFxmJCBBXiogXGYkLiBUaGUgYWRqb2ludCBpcyBhbHNvIGNhbGxlZCB0aGUgXGVtIGNvbmp1Z2F0ZSBcZW0gdHJhbnNwb3NlLiA8L2RkPgorICA8ZHQ+PGI+UG9zaXRpdmUvbmVnYXRpdmUgZGVmaW5pdGU8L2I+PC9kdD4KKyAgICA8ZGQ+QSBzZWxmYWRqb2ludCBtYXRyaXggXGYkIEEgXGYkIGlzIHBvc2l0aXZlIGRlZmluaXRlIGlmIFxmJCB2XiogQSB2ID4gMCBcZiQgZm9yIGFueSBub24gemVybyB2ZWN0b3IgXGYkIHYgXGYkLgorICAgICAgICBJbiB0aGUgc2FtZSB2ZWluLCBpdCBpcyBuZWdhdGl2ZSBkZWZpbml0ZSBpZiBcZiQgdl4qIEEgdiA8IDAgXGYkIGZvciBhbnkgbm9uIHplcm8gdmVjdG9yIFxmJCB2IFxmJCA8L2RkPgorICA8ZHQ+PGI+UG9zaXRpdmUvbmVnYXRpdmUgc2VtaWRlZmluaXRlPC9iPjwvZHQ+CisgICAgPGRkPkEgc2VsZmFkam9pbnQgbWF0cml4IFxmJCBBIFxmJCBpcyBwb3NpdGl2ZSBzZW1pLWRlZmluaXRlIGlmIFxmJCB2XiogQSB2IFxnZSAwIFxmJCBmb3IgYW55IG5vbiB6ZXJvIHZlY3RvciBcZiQgdiBcZiQuCisgICAgICAgIEluIHRoZSBzYW1lIHZlaW4sIGl0IGlzIG5lZ2F0aXZlIHNlbWktZGVmaW5pdGUgaWYgXGYkIHZeKiBBIHYgXGxlIDAgXGYkIGZvciBhbnkgbm9uIHplcm8gdmVjdG9yIFxmJCB2IFxmJCA8L2RkPgorCisgIDxkdD48Yj5CbG9ja2luZzwvYj48L2R0PgorICAgIDxkZD5NZWFucyB0aGUgYWxnb3JpdGhtIGNhbiB3b3JrIHBlciBibG9jaywgd2hlbmNlIGd1YXJhbnRlZWluZyBhIGdvb2Qgc2NhbGluZyBvZiB0aGUgcGVyZm9ybWFuY2UgZm9yIGxhcmdlIG1hdHJpY2VzLjwvZGQ+CisgIDxkdD48Yj5JbXBsaWNpdCBNdWx0aSBUaHJlYWRpbmcgKE1UKTwvYj48L2R0PgorICAgIDxkZD5NZWFucyB0aGUgYWxnb3JpdGhtIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBtdWx0aWNvcmUgcHJvY2Vzc29ycyB2aWEgT3Blbk1QLiAiSW1wbGljaXQiIG1lYW5zIHRoZSBhbGdvcnRpaG0gaXRzZWxmIGlzIG5vdCBwYXJhbGxlbGl6ZWQsIGJ1dCB0aGF0IGl0IHJlbGllcyBvbiBwYXJhbGxlbGl6ZWQgbWF0cml4LW1hdHJpeCBwcm9kdWN0IHJvdW50aW5lcy48L2RkPgorICA8ZHQ+PGI+RXhwbGljaXQgTXVsdGkgVGhyZWFkaW5nIChNVCk8L2I+PC9kdD4KKyAgICA8ZGQ+TWVhbnMgdGhlIGFsZ29yaXRobSBpcyBleHBsaWNpdGVseSBwYXJhbGxlbGl6ZWQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbXVsdGljb3JlIHByb2Nlc3NvcnMgdmlhIE9wZW5NUC48L2RkPgorICA8ZHQ+PGI+TWV0YS11bnJvbGxlcjwvYj48L2R0PgorICAgIDxkZD5NZWFucyB0aGUgYWxnb3JpdGhtIGlzIGF1dG9tYXRpY2FsbHkgYW5kIGV4cGxpY2l0bHkgdW5yb2xsZWQgZm9yIHZlcnkgc21hbGwgZml4ZWQgc2l6ZSBtYXRyaWNlcy48L2RkPgorICA8ZHQ+PGI+PC9iPjwvZHQ+CisgICAgPGRkPjwvZGQ+Cis8L2RsPgorCisqLworCit9CmRpZmYgLS1naXQgYS9kb2MvVG9waWNNdWx0aXRocmVhZGluZy5kb3ggYi9kb2MvVG9waWNNdWx0aXRocmVhZGluZy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkMDgyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9Ub3BpY011bHRpdGhyZWFkaW5nLmRveApAQCAtMCwwICsxLDQ2IEBACituYW1lc3BhY2UgRWlnZW4geworCisvKiogXHBhZ2UgVG9waWNNdWx0aVRocmVhZGluZyBFaWdlbiBhbmQgbXVsdGktdGhyZWFkaW5nCisKK1xzZWN0aW9uIFRvcGljTXVsdGlUaHJlYWRpbmdfTWFraW5nRWlnZW5NVCBNYWtlIEVpZ2VuIHJ1biBpbiBwYXJhbGxlbAorCitTb21lIEVpZ2VuJ3MgYWxnb3JpdGhtcyBjYW4gZXhwbG9pdCB0aGUgbXVsdGlwbGUgY29yZXMgcHJlc2VudCBpbiB5b3VyIGhhcmR3YXJlLiBUbyB0aGlzIGVuZCwgaXQgaXMgZW5vdWdoIHRvIGVuYWJsZSBPcGVuTVAgb24geW91ciBjb21waWxlciwgZm9yIGluc3RhbmNlOgorICogR0NDOiBcYyAtZm9wZW5tcAorICogSUNDOiBcYyAtb3Blbm1wCisgKiBNU1ZDOiBjaGVjayB0aGUgcmVzcGVjdGl2ZSBvcHRpb24gaW4gdGhlIGJ1aWxkIHByb3BlcnRpZXMuCitZb3UgY2FuIGNvbnRyb2wgdGhlIG51bWJlciBvZiB0aHJlYWQgdGhhdCB3aWxsIGJlIHVzZWQgdXNpbmcgZWl0aGVyIHRoZSBPcGVuTVAgQVBJIG9yIEVpZWduJ3MgQVBJIHVzaW5nIHRoZSBmb2xsb3dpbmcgcHJpb3JpdHk6CitcY29kZQorIE9NUF9OVU1fVEhSRUFEUz1uIC4vbXlfcHJvZ3JhbQorIG9tcF9zZXRfbnVtX3RocmVhZHMobik7CisgRWlnZW46OnNldE5iVGhyZWFkcyhuKTsKK1xlbmRjb2RlCitVbmxlc3Mgc2V0TmJUaHJlYWRzIGhhcyBiZWVuIGNhbGxlZCwgRWlnZW4gdXNlcyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgc3BlY2lmaWVkIGJ5IE9wZW5NUC4gWW91IGNhbiByZXN0b3JlIHRoaXMgYmFoYXZpb3IgYnkgY2FsbGluZyBcY29kZSBzZXROYlRocmVhZHMoMCk7IFxlbmRjb2RlCitZb3UgY2FuIHF1ZXJ5IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoOgorXGNvZGUKK24gPSBFaWdlbjo6bmJUaHJlYWRzKG4pOworXGVuZGNvZGUKK1lvdSBjYW4gZGlzYWJsZSBFaWdlbidzIG11bHRpIHRocmVhZGluZyBhdCBjb21waWxlIHRpbWUgYnkgZGVmaW5pbmcgdGhlIEVJR0VOX0RPTlRfUEFSQUxMRUxJWkUgcHJlcHJvY2Vzc29yIHRva2VuLgorCitDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtcyBjYW4gbWFrZSB1c2Ugb2YgbXVsdGktdGhyZWFkaW5nOgorICogZ2VuZXJhbCBtYXRyaXggLSBtYXRyaXggcHJvZHVjdHMKKyAqIFBhcnRpYWxQaXZMVQorCitcc2VjdGlvbiBUb3BpY011bHRpVGhyZWFkaW5nX1VzaW5nRWlnZW5XaXRoTVQgVXNpbmcgRWlnZW4gaW4gYSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbgorCitJbiB0aGUgY2FzZSB5b3VyIG93biBhcHBsaWNhdGlvbiBpcyBtdWx0aXRocmVhZGVkLCBhbmQgbXVsdGlwbGUgdGhyZWFkcyBtYWtlIGNhbGxzIHRvIEVpZ2VuLCB0aGVuIHlvdSBoYXZlIHRvIGluaXRpYWxpemUgRWlnZW4gYnkgY2FsbGluZyB0aGUgZm9sbG93aW5nIHJvdXRpbmUgXGIgYmVmb3JlIGNyZWF0aW5nIHRoZSB0aHJlYWRzOgorXGNvZGUKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIEVpZ2VuOjppbml0UGFyYWxsZWwoKTsKKyAgCisgIC4uLgorfQorXGVuZGNvZGUKKworSW4gdGhlIGNhc2UgeW91ciBhcHBsaWNhdGlvbiBpcyBwYXJhbGxlbGl6ZWQgd2l0aCBPcGVuTVAsIHlvdSBtaWdodCB3YW50IHRvIGRpc2FibGUgRWlnZW4ncyBvd24gcGFyYWxsaXphdGlvbiBhcyBkZXRhaWxlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL1R1dG9yaWFsU3BhcnNlX2V4YW1wbGVfZGV0YWlscy5kb3ggYi9kb2MvVHV0b3JpYWxTcGFyc2VfZXhhbXBsZV9kZXRhaWxzLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDM4ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1R1dG9yaWFsU3BhcnNlX2V4YW1wbGVfZGV0YWlscy5kb3gKQEAgLTAsMCArMSw0IEBACisvKioKK1xwYWdlIFR1dG9yaWFsU3BhcnNlX2V4YW1wbGVfZGV0YWlscworXGluY2x1ZGUgVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGVfZGV0YWlscy5jcHAKKyovCmRpZmYgLS1naXQgYS9kb2MvVXNpbmdJbnRlbE1LTC5kb3ggYi9kb2MvVXNpbmdJbnRlbE1LTC5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5ZWUzZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9Vc2luZ0ludGVsTUtMLmRveApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIENvcHlyaWdodCAoQykgMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvbnRlbnQgOiBEb2N1bWVudGF0aW9uIG9uIHRoZSB1c2Ugb2YgSW50ZWwgTUtMIHRocm91Z2ggRWlnZW4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxwYWdlIFRvcGljVXNpbmdJbnRlbE1LTCBVc2luZyBJbnRlbMKuIE1hdGggS2VybmVsIExpYnJhcnkgZnJvbSBFaWdlbgorCitcc2VjdGlvbiBUb3BpY1VzaW5nSW50ZWxNS0xfSW50cm8gRWlnZW4gYW5kIEludGVswq4gTWF0aCBLZXJuZWwgTGlicmFyeSAoSW50ZWzCriBNS0wpCisKK1NpbmNlIEVpZ2VuIHZlcnNpb24gMy4xIGFuZCBsYXRlciwgdXNlcnMgY2FuIGJlbmVmaXQgZnJvbSBidWlsdC1pbiBJbnRlbCBNS0wgb3B0aW1pemF0aW9ucyB3aXRoIGFuIGluc3RhbGxlZCBjb3B5IG9mIEludGVsIE1LTCAxMC4zIChvciBsYXRlcikuCis8YSBocmVmPSJodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy9Db3VudGVyL3JlZGlyZWN0X3RvX21rbC5waHAiPiBJbnRlbCBNS0wgPC9hPiBwcm92aWRlcyBoaWdobHkgb3B0aW1pemVkIG11bHRpLXRocmVhZGVkIG1hdGhlbWF0aWNhbCByb3V0aW5lcyBmb3LCoHg4Ni1jb21wYXRpYmxlIGFyY2hpdGVjdHVyZXMuCitJbnRlbCBNS0wgaXMgYXZhaWxhYmxlIG9uIExpbnV4LCBNYWMgYW5kIFdpbmRvd3MgZm9yIGJvdGggSW50ZWw2NCBhbmQgSUEzMiBhcmNoaXRlY3R1cmVzLgorCitcd2FybmluZyBCZSBhd2FyZSB0aGF0IEludGVswq4gTUtMIGlzIGEgcHJvcHJpZXRhcnkgc29mdHdhcmUuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlcnMgdG8gYnV5IE1LTCBsaWNlbnNlcyBmb3IgdGhlaXIgcHJvZHVjdHMuIE1vcmVvdmVyLCB0aGUgbGljZW5zZSBvZiB0aGUgdXNlciBwcm9kdWN0IGhhcyB0byBhbGxvdyBsaW5raW5nIHRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlIHRoYXQgZXhjbHVkZXMgYW55IHVubW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEdQTC4gQXMgYSBjb25zZXF1ZW5jZSwgdGhpcyBhbHNvIG1lYW5zIHRoYXQgRWlnZW4gaGFzIHRvIGJlIHVzZWQgdGhyb3VnaCB0aGUgTEdQTDMrIGxpY2Vuc2UuCisKK1VzaW5nIEludGVsIE1LTCB0aHJvdWdoIEVpZ2VuIGlzIGVhc3k6CistIyBkZWZpbmUgdGhlIFxjIEVJR0VOX1VTRV9NS0xfQUxMIG1hY3JvIGJlZm9yZSBpbmNsdWRpbmcgYW55IEVpZ2VuJ3MgaGVhZGVyCistIyBsaW5rIHlvdXIgcHJvZ3JhbSB0byBNS0wgbGlicmFyaWVzIChzZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvYXJ0aWNsZXMvaW50ZWwtbWtsLWxpbmstbGluZS1hZHZpc29yLyI+TUtMIGxpbmtpbmcgYWR2aXNvcjwvYT4pCistIyBvbiBhIDY0Yml0cyBzeXN0ZW0sIHlvdSBtdXN0IHVzZSB0aGUgTFA2NCBpbnRlcmZhY2UgKG5vdCB0aGUgSUxQNjQgb25lKQorCitXaGVuIGRvaW5nIHNvLCBhIG51bWJlciBvZiBFaWdlbidzIGFsZ29yaXRobXMgYXJlIHNpbGVudGx5IHN1YnN0aXR1dGVkIHdpdGggY2FsbHMgdG8gSW50ZWwgTUtMIHJvdXRpbmVzLgorVGhlc2Ugc3Vic3RpdHV0aW9ucyBhcHBseSBvbmx5IGZvciBcYiBEeW5hbWljIFxiIG9yIFxiIGxhcmdlIGVub3VnaCBvYmplY3RzIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgZm91ciBzdGFuZGFyZCBzY2FsYXIgdHlwZXM6IFxjIGZsb2F0LCBcYyBkb3VibGUsIFxjIGNvbXBsZXg8ZmxvYXQ+LCBhbmQgXGMgY29tcGxleDxkb3VibGU+LgorT3BlcmF0aW9ucyBvbiBvdGhlciBzY2FsYXIgdHlwZXMgb3IgbWl4aW5nIHJlYWxzIGFuZCBjb21wbGV4ZXMgd2lsbCBjb250aW51ZSB0byB1c2UgdGhlIGJ1aWx0LWluIGFsZ29yaXRobXMuCisKK0luIGFkZGl0aW9uIHlvdSBjYW4gY29hcnNlbHkgc2VsZWN0IGNob29zZSB3aGljaCBwYXJ0cyB3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IGRlZmluaW5nIG9uZSBvciBtdWx0aXBsZSBvZiB0aGUgZm9sbG93aW5nIG1hY3JvczoKKworPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0ZD5cYyBFSUdFTl9VU0VfQkxBUyA8L3RkPjx0ZD5FbmFibGVzIHRoZSB1c2Ugb2YgZXh0ZXJuYWwgQkxBUyBsZXZlbCAyIGFuZCAzIHJvdXRpbmVzIChjdXJyZW50bHkgd29ya3Mgd2l0aCBJbnRlbCBNS0wgb25seSk8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPlxjIEVJR0VOX1VTRV9MQVBBQ0tFIDwvdGQ+PHRkPkVuYWJsZXMgdGhlIHVzZSBvZiBleHRlcm5hbCBMYXBhY2sgcm91dGluZXMgdmlhIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2xhcGFja2UuaHRtbCI+SW50ZWwgTGFwYWNrZTwvYT4gQyBpbnRlcmZhY2UgdG8gTGFwYWNrIChjdXJyZW50bHkgd29ya3Mgd2l0aCBJbnRlbCBNS0wgb25seSk8L3RkPjwvdHI+Cis8dHI+PHRkPlxjIEVJR0VOX1VTRV9MQVBBQ0tFX1NUUklDVCA8L3RkPjx0ZD5TYW1lIGFzIFxjIEVJR0VOX1VTRV9MQVBBQ0tFIGJ1dCBhbGdvcml0aG0gb2YgbG93ZXIgcm9idXN0bmVzcyBhcmUgZGlzYWJsZWQuIFRoaXMgY3VycmVudGx5IGNvbmNlcm5zIG9ubHkgSmFjb2JpU1ZEIHdoaWNoIG90aGVyd2lzZSB3b3VsZCBiZSByZXBsYWNlZCBieSBcYyBnZXN2ZCB0aGF0IGlzIGxlc3Mgcm9idXN0IHRoYW4gSmFjb2JpIHJvdGF0aW9ucy48L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPlxjIEVJR0VOX1VTRV9NS0xfVk1MIDwvdGQ+PHRkPkVuYWJsZXMgdGhlIHVzZSBvZiBJbnRlbCBWTUwgKHZlY3RvciBvcGVyYXRpb25zKTwvdGQ+PC90cj4KKzx0cj48dGQ+XGMgRUlHRU5fVVNFX01LTF9BTEwgPC90ZD48dGQ+RGVmaW5lcyBcYyBFSUdFTl9VU0VfQkxBUywgXGMgRUlHRU5fVVNFX0xBUEFDS0UsIGFuZCBcYyBFSUdFTl9VU0VfTUtMX1ZNTCA8L3RkPjwvdHI+Cis8L3RhYmxlPgorCitGaW5hbGx5LCB0aGUgUEFSRElTTyBzcGFyc2Ugc29sdmVyIHNoaXBwZWQgd2l0aCBJbnRlbCBNS0wgY2FuIGJlIHVzZWQgdGhyb3VnaCB0aGUgXHJlZiBQYXJkaXNvTFUsIFxyZWYgUGFyZGlzb0xMVCBhbmQgXHJlZiBQYXJkaXNvTERMVCBjbGFzc2VzIG9mIHRoZSBccmVmIFBBUkRJU09TdXBwb3J0X01vZHVsZS4KKworCitcc2VjdGlvbiBUb3BpY1VzaW5nSW50ZWxNS0xfU3VwcG9ydGVkRmVhdHVyZXMgTGlzdCBvZiBzdXBwb3J0ZWQgZmVhdHVyZXMKKworVGhlIGJyZWFkdGggb2YgRWlnZW4gZnVuY3Rpb25hbGl0eSBjb3ZlcmVkIGJ5IEludGVsIE1LTCBpcyBsaXN0ZWQgaW4gdGhlIHRhYmxlIGJlbG93LgorPHRhYmxlIGNsYXNzPSJtYW51YWwiPgorPHRyPjx0aD5GdW5jdGlvbmFsIGRvbWFpbjwvdGg+PHRoPkNvZGUgZXhhbXBsZTwvdGg+PHRoPk1LTCByb3V0aW5lczwvdGg+PC90cj4KKzx0cj48dGQ+TWF0cml4LW1hdHJpeCBvcGVyYXRpb25zIFxuIFxjIEVJR0VOX1VTRV9CTEFTIDwvdGQ+PHRkPlxjb2RlCittMSptMi50cmFuc3Bvc2UoKTsKK20xLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSptMjsKK20xKm0yLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworbTEuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUobTIsMS4wKTsKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKKz9nZW1tCis/c3ltbS8/aGVtbQorP3RybW0KK2RzeXJrL3NzeXJrCitcZW5kY29kZTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+TWF0cml4LXZlY3RvciBvcGVyYXRpb25zIFxuIFxjIEVJR0VOX1VTRV9CTEFTIDwvdGQ+PHRkPlxjb2RlCittMS5hZGpvaW50KCkqYjsKK20xLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSpiOworbTEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkqYjsKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKKz9nZW12Cis/c3ltdi8/aGVtdgorP3RybXYKK1xlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD5MVSBkZWNvbXBvc2l0aW9uIFxuIFxjIEVJR0VOX1VTRV9MQVBBQ0tFIFxuIFxjIEVJR0VOX1VTRV9MQVBBQ0tFX1NUUklDVCA8L3RkPjx0ZD5cY29kZQordjEgPSBtMS5sdSgpLnNvbHZlKHYyKTsKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKKz9nZXRyZgorXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHIgY2xhc3M9ImFsdCI+PHRkPkNob2xlc2t5IGRlY29tcG9zaXRpb24gXG4gXGMgRUlHRU5fVVNFX0xBUEFDS0UgXG4gXGMgRUlHRU5fVVNFX0xBUEFDS0VfU1RSSUNUIDwvdGQ+PHRkPlxjb2RlCit2MSA9IG0yLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS5sbHQoKS5zb2x2ZSh2Mik7CitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCis/cG90cmYKK1xlbmRjb2RlPC90ZD48L3RyPgorPHRyPjx0ZD5RUiBkZWNvbXBvc2l0aW9uIFxuIFxjIEVJR0VOX1VTRV9MQVBBQ0tFIFxuIFxjIEVJR0VOX1VTRV9MQVBBQ0tFX1NUUklDVCA8L3RkPjx0ZD5cY29kZQorbTEuaG91c2Vob2xkZXJRcigpOworbTEuY29sUGl2SG91c2Vob2xkZXJRcigpOworXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQorP2dlcXJmCis/Z2VxcDMKK1xlbmRjb2RlPC90ZD48L3RyPgorPHRyIGNsYXNzPSJhbHQiPjx0ZD5TaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uIFxuIFxjIEVJR0VOX1VTRV9MQVBBQ0tFIDwvdGQ+PHRkPlxjb2RlCitKYWNvYmlTVkQ8TWF0cml4WGQ+IHN2ZDsKK3N2ZC5jb21wdXRlKG0xLCBDb21wdXRlVGhpblYpOworXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQorP2dlc3ZkCitcZW5kY29kZTwvdGQ+PC90cj4KKzx0cj48dGQ+RWlnZW4tdmFsdWUgZGVjb21wb3NpdGlvbnMgXG4gXGMgRUlHRU5fVVNFX0xBUEFDS0UgXG4gXGMgRUlHRU5fVVNFX0xBUEFDS0VfU1RSSUNUIDwvdGQ+PHRkPlxjb2RlCitFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMobTEpOworQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFhjZD4gY2VzKG0xKTsKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IHNhZXMobTErbTEudHJhbnNwb3NlKCkpOworR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhkPgorICAgIGdzYWVzKG0xK20xLnRyYW5zcG9zZSgpLG0yK20yLnRyYW5zcG9zZSgpKTsKK1xlbmRjb2RlPC90ZD48dGQ+XGNvZGUKKz9nZWVzCis/Z2VlcworP3N5ZXYvP2hlZXYKKz9zeWV2Lz9oZWV2LAorP3BvdHJmCitcZW5kY29kZTwvdGQ+PC90cj4KKzx0ciBjbGFzcz0iYWx0Ij48dGQ+U2NodXIgZGVjb21wb3NpdGlvbiBcbiBcYyBFSUdFTl9VU0VfTEFQQUNLRSBcbiBcYyBFSUdFTl9VU0VfTEFQQUNLRV9TVFJJQ1QgPC90ZD48dGQ+XGNvZGUKK1JlYWxTY2h1cjxNYXRyaXhYZD4gc2NodXJSKG0xKTsKK0NvbXBsZXhTY2h1cjxNYXRyaXhYY2Q+IHNjaHVyQyhtMSk7CitcZW5kY29kZTwvdGQ+PHRkPlxjb2RlCis/Z2VlcworXGVuZGNvZGU8L3RkPjwvdHI+Cis8dHI+PHRkPlZlY3RvciBNYXRoIFxuIFxjIEVJR0VOX1VTRV9NS0xfVk1MIDwvdGQ+PHRkPlxjb2RlCit2Mj12MS5hcnJheSgpLnNpbigpOwordjI9djEuYXJyYXkoKS5hc2luKCk7Cit2Mj12MS5hcnJheSgpLmNvcygpOwordjI9djEuYXJyYXkoKS5hY29zKCk7Cit2Mj12MS5hcnJheSgpLnRhbigpOwordjI9djEuYXJyYXkoKS5leHAoKTsKK3YyPXYxLmFycmF5KCkubG9nKCk7Cit2Mj12MS5hcnJheSgpLnNxcnQoKTsKK3YyPXYxLmFycmF5KCkuc3F1YXJlKCk7Cit2Mj12MS5hcnJheSgpLnBvdygxLjUpOworXGVuZGNvZGU8L3RkPjx0ZD5cY29kZQordj9TaW4KK3Y/QXNpbgordj9Db3MKK3Y/QWNvcwordj9UYW4KK3Y/RXhwCit2P0xuCit2P1NxcnQKK3Y/U3FyCit2P1Bvd3gKK1xlbmRjb2RlPC90ZD48L3RyPgorPC90YWJsZT4KK0luIHRoZSBleGFtcGxlcywgbTEgYW5kIG0yIGFyZSBkZW5zZSBtYXRyaWNlcyBhbmQgdjEgYW5kIHYyIGFyZSBkZW5zZSB2ZWN0b3JzLgorCisKK1xzZWN0aW9uIFRvcGljVXNpbmdJbnRlbE1LTF9MaW5rcyBMaW5rcworLSBJbnRlbCBNS0wgY2FuIGJlIHB1cmNoYXNlZCBhbmQgZG93bmxvYWRlZCA8YSBocmVmPSJodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy9Db3VudGVyL3JlZGlyZWN0X3RvX21rbC5waHAiPmhlcmU8L2E+LgorLSBJbnRlbCBNS0wgaXMgYWxzbyBidW5kbGVkIHdpdGggPGEgaHJlZj0iaHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbnRlbC1jb21wb3Nlci14ZS8iPkludGVsIENvbXBvc2VyIFhFPC9hPi4KKworCisqLworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2VpZ2VuZG94eS5jc3MgYi9kb2MvZWlnZW5kb3h5LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmMxNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VpZ2VuZG94eS5jc3MKQEAgLTAsMCArMSw5MTEgQEAKKy8qIFRoZSBzdGFuZGFyZCBDU1MgZm9yIGRveHlnZW4gKi8KKworYm9keSwgdGFibGUsIGRpdiwgcCwgZGwgeworICBmb250LWZhbWlseTogTHVjaWRhIEdyYW5kZSwgVmVyZGFuYSwgR2VuZXZhLCBBcmlhbCwgc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiAxMnB4OworfQorCisvKiBAZ3JvdXAgSGVhZGluZyBMZXZlbHMgKi8KKworaDEgeworICBmb250LXNpemU6IDE1MCU7Cit9CisKK2gyIHsKKyAgZm9udC1zaXplOiAxMjAlOworfQorCitoMyB7CisgIGZvbnQtc2l6ZTogMTAwJTsKK30KKworZHQgeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworZGl2Lm11bHRpY29sIHsKKyAgLW1vei1jb2x1bW4tZ2FwOiAxZW07CisgIC13ZWJraXQtY29sdW1uLWdhcDogMWVtOworICAtbW96LWNvbHVtbi1jb3VudDogMzsKKyAgLXdlYmtpdC1jb2x1bW4tY291bnQ6IDM7Cit9CisKK3Auc3RhcnRsaSwgcC5zdGFydGRkLCBwLnN0YXJ0dGQgeworICBtYXJnaW4tdG9wOiAycHg7Cit9CisKK3AuZW5kbGkgeworICBtYXJnaW4tYm90dG9tOiAwcHg7Cit9CisKK3AuZW5kZGQgeworICBtYXJnaW4tYm90dG9tOiA0cHg7Cit9CisKK3AuZW5kdGQgeworICBtYXJnaW4tYm90dG9tOiAycHg7Cit9CisKKy8qIEBlbmQgKi8KKworY2FwdGlvbiB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitzcGFuLmxlZ2VuZCB7CisgICAgICAgIGZvbnQtc2l6ZTogNzAlOworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKK2gzLnZlcnNpb24geworICAgICAgICBmb250LXNpemU6IDkwJTsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCitkaXYucWluZGV4LCBkaXYubmF2dGFieworICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUJFRkY2OworICBib3JkZXI6IDFweCBzb2xpZCAjQTNCNEQ3OworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIG1hcmdpbjogMnB4OworICBwYWRkaW5nOiAycHg7Cit9CisKK2Rpdi5xaW5kZXgsIGRpdi5uYXZwYXRoIHsKKyAgd2lkdGg6IDEwMCU7CisgIGxpbmUtaGVpZ2h0OiAxNDAlOworfQorCitkaXYubmF2dGFiIHsKKyAgbWFyZ2luLXJpZ2h0OiAxNXB4OworfQorCisvKiBAZ3JvdXAgTGluayBTdHlsaW5nICovCisKK2EgeworICBjb2xvcjogIzNENTc4QzsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuY29udGVudHMgYTp2aXNpdGVkIHsKKyAgY29sb3I6ICM0NjY1QTI7Cit9CisKK2E6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworYS5xaW5kZXggeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworYS5xaW5kZXhITCB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjOUNBRkQ0OworICBjb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyOiAxcHggZG91YmxlICM4NjlEQ0E7Cit9CisKKy5jb250ZW50cyBhLnFpbmRleEhMOnZpc2l0ZWQgeworICAgICAgICBjb2xvcjogI2ZmZmZmZjsKK30KKworYS5lbCB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCithLmVsUmVmIHsKK30KKworYS5jb2RlIHsKKyAgY29sb3I6ICM0NjY1QTI7Cit9CisKK2EuY29kZVJlZiB7CisgIGNvbG9yOiAjNDY2NUEyOworfQorCisvKiBAZW5kICovCisKK2RsLmVsIHsKKyAgbWFyZ2luLWxlZnQ6IC0xY207Cit9CisKKy5mcmFnbWVudCB7CisgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIGZpeGVkOworICBmb250LXNpemU6IDEwNSU7Cit9CisKK3ByZS5mcmFnbWVudCB7CisgIGJvcmRlcjogMXB4IHNvbGlkICNDNENGRTU7CisgIGJhY2tncm91bmQtY29sb3I6ICNGQkZDRkQ7CisgIHBhZGRpbmc6IDRweCA2cHg7CisgIG1hcmdpbjogNHB4IDhweCA0cHggMnB4OworICBvdmVyZmxvdzogYXV0bzsKKyAgLyp3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Ki8KKyAgZm9udC1zaXplOiAgOXB0OworICBsaW5lLWhlaWdodDogMTI1JTsKK30KKworZGl2LmFoIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBjb2xvcjogI2ZmZmZmZjsKKyAgbWFyZ2luLWJvdHRvbTogM3B4OworICBtYXJnaW4tdG9wOiAzcHg7CisgIHBhZGRpbmc6IDAuMmVtOworICBib3JkZXI6IHNvbGlkIHRoaW4gIzMzMzsKKyAgYm9yZGVyLXJhZGl1czogMC41ZW07CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogLjVlbTsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiAuNWVtOworICBib3gtc2hhZG93OiAycHggMnB4IDNweCAjOTk5OworICAtd2Via2l0LWJveC1zaGFkb3c6IDJweCAycHggM3B4ICM5OTk7CisgIC1tb3otYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjE1KSAycHggMnB4IDJweDsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSgjZWVlKSwgdG8oIzAwMCksY29sb3Itc3RvcCgwLjMsICM0NDQpKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoY2VudGVyIHRvcCwgI2VlZSAwJSwgIzQ0NCA0MCUsICMwMDApOworfQorCitkaXYuZ3JvdXBIZWFkZXIgeworICBtYXJnaW4tbGVmdDogMTZweDsKKyAgbWFyZ2luLXRvcDogMTJweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2Rpdi5ncm91cFRleHQgeworICBtYXJnaW4tbGVmdDogMTZweDsKKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorCitib2R5IHsKKyAgYmFja2dyb3VuZDogd2hpdGU7CisgIGNvbG9yOiBibGFjazsKKyAgICAgICAgbWFyZ2luOiAwOworfQorCitkaXYuY29udGVudHMgeworICBtYXJnaW4tdG9wOiAxMHB4OworICBtYXJnaW4tbGVmdDogMTBweDsKKyAgbWFyZ2luLXJpZ2h0OiAxMHB4OworfQorCit0ZC5pbmRleGtleSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNFQkVGRjY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBib3JkZXI6IDFweCBzb2xpZCAjQzRDRkU1OworICBtYXJnaW46IDJweCAwcHggMnB4IDA7CisgIHBhZGRpbmc6IDJweCAxMHB4OworfQorCit0ZC5pbmRleHZhbHVlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0VCRUZGNjsKKyAgYm9yZGVyOiAxcHggc29saWQgI0M0Q0ZFNTsKKyAgcGFkZGluZzogMnB4IDEwcHg7CisgIG1hcmdpbjogMnB4IDBweDsKK30KKwordHIubWVtbGlzdCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNFRUYxRjc7Cit9CisKK3AuZm9ybXVsYURzcCB7CisgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworaW1nLmZvcm11bGFEc3AgeworICAKK30KKworaW1nLmZvcm11bGFJbmwgeworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCitkaXYuY2VudGVyIHsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgICBtYXJnaW4tdG9wOiAwcHg7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDBweDsKKyAgICAgICAgcGFkZGluZzogMHB4OworfQorCitkaXYuY2VudGVyIGltZyB7CisgIGJvcmRlcjogMHB4OworfQorCithZGRyZXNzLmZvb3RlciB7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICBwYWRkaW5nLXJpZ2h0OiAxMnB4OworfQorCitpbWcuZm9vdGVyIHsKKyAgYm9yZGVyOiAwcHg7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy8qIEBncm91cCBDb2RlIENvbG9yaXphdGlvbiAqLworCitzcGFuLmtleXdvcmQgeworICBjb2xvcjogIzAwODAwMAorfQorCitzcGFuLmtleXdvcmR0eXBlIHsKKyAgY29sb3I6ICM2MDQwMjAKK30KKworc3Bhbi5rZXl3b3JkZmxvdyB7CisgIGNvbG9yOiAjZTA4MDAwCit9CisKK3NwYW4uY29tbWVudCB7CisgIGNvbG9yOiAjODAwMDAwCit9CisKK3NwYW4ucHJlcHJvY2Vzc29yIHsKKyAgY29sb3I6ICM4MDYwMjAKK30KKworc3Bhbi5zdHJpbmdsaXRlcmFsIHsKKyAgY29sb3I6ICMwMDIwODAKK30KKworc3Bhbi5jaGFybGl0ZXJhbCB7CisgIGNvbG9yOiAjMDA4MDgwCit9CisKK3NwYW4udmhkbGRpZ2l0IHsgCisgIGNvbG9yOiAjZmYwMGZmIAorfQorCitzcGFuLnZoZGxjaGFyIHsgCisgIGNvbG9yOiAjMDAwMDAwIAorfQorCitzcGFuLnZoZGxrZXl3b3JkIHsgCisgIGNvbG9yOiAjNzAwMDcwIAorfQorCitzcGFuLnZoZGxsb2dpYyB7IAorICBjb2xvcjogI2ZmMDAwMCAKK30KKworLyogQGVuZCAqLworCisvKgorLnNlYXJjaCB7CisgIGNvbG9yOiAjMDAzMzk5OworICBmb250LXdlaWdodDogYm9sZDsKK30KKworZm9ybS5zZWFyY2ggeworICBtYXJnaW4tYm90dG9tOiAwcHg7CisgIG1hcmdpbi10b3A6IDBweDsKK30KKworaW5wdXQuc2VhcmNoIHsKKyAgZm9udC1zaXplOiA3NSU7CisgIGNvbG9yOiAjMDAwMDgwOworICBmb250LXdlaWdodDogbm9ybWFsOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlZWYyOworfQorKi8KKwordGQudGlueSB7CisgIGZvbnQtc2l6ZTogNzUlOworfQorCisuZGlydGFiIHsKKyAgcGFkZGluZzogNHB4OworICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICBib3JkZXI6IDFweCBzb2xpZCAjQTNCNEQ3OworfQorCit0aC5kaXJ0YWIgeworICBiYWNrZ3JvdW5kOiAjRUJFRkY2OworICBmb250LXdlaWdodDogYm9sZDsKK30KKworaHIgeworICBoZWlnaHQ6IDBweDsKKyAgYm9yZGVyOiBub25lOworICBib3JkZXItdG9wOiAxcHggc29saWQgIzRBNkFBQTsKK30KKworaHIuZm9vdGVyIHsKKyAgaGVpZ2h0OiAxcHg7Cit9CisKKy8qIEBncm91cCBNZW1iZXIgRGVzY3JpcHRpb25zICovCisKK3RhYmxlLm1lbWJlcmRlY2xzIHsKKyAgYm9yZGVyLXNwYWNpbmc6IDBweDsKKyAgcGFkZGluZzogMHB4OworfQorCisubWRlc2NMZWZ0LCAubWRlc2NSaWdodCwKKy5tZW1JdGVtTGVmdCwgLm1lbUl0ZW1SaWdodCwKKy5tZW1UZW1wbEl0ZW1MZWZ0LCAubWVtVGVtcGxJdGVtUmlnaHQsIC5tZW1UZW1wbFBhcmFtcyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNGOUZBRkM7CisgIGJvcmRlcjogbm9uZTsKKyAgbWFyZ2luOiA0cHg7CisgIHBhZGRpbmc6IDFweCAwIDAgOHB4OworfQorCisubWRlc2NMZWZ0LCAubWRlc2NSaWdodCB7CisgIHBhZGRpbmc6IDBweCA4cHggNHB4IDhweDsKKyAgY29sb3I6ICM1NTU7Cit9CisKKy5tZW1JdGVtTGVmdCwgLm1lbUl0ZW1SaWdodCwgLm1lbVRlbXBsUGFyYW1zIHsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNDNENGRTU7Cit9CisKKy5tZW1JdGVtTGVmdCwgLm1lbVRlbXBsSXRlbUxlZnQgeworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisubWVtVGVtcGxQYXJhbXMgeworICBjb2xvcjogIzQ2NjVBMjsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLyogQGVuZCAqLworCisvKiBAZ3JvdXAgTWVtYmVyIERldGFpbHMgKi8KKworLyogU3R5bGVzIGZvciBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbiAqLworCisubWVtdGVtcGxhdGUgeworICBmb250LXNpemU6IDgwJTsKKyAgY29sb3I6ICM0NjY1QTI7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIG1hcmdpbi1sZWZ0OiA5cHg7Cit9CisKKy5tZW1uYXYgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUJFRkY2OworICBib3JkZXI6IDFweCBzb2xpZCAjQTNCNEQ3OworICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIG1hcmdpbjogMnB4OworICBtYXJnaW4tcmlnaHQ6IDE1cHg7CisgIHBhZGRpbmc6IDJweDsKK30KKworLm1lbWl0ZW0geworICBwYWRkaW5nOiAwOworICBtYXJnaW4tYm90dG9tOiAxMHB4OworfQorCisubWVtbmFtZSB7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICBtYXJnaW4tbGVmdDogNnB4OworfQorCisubWVtcHJvdG8geworICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI0E4QjhEOTsKKyAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjQThCOEQ5OworICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjQThCOEQ5OworICAgICAgICBwYWRkaW5nOiA2cHggMHB4IDZweCAwcHg7CisgICAgICAgIGNvbG9yOiAjMjUzNTU1OworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgdGV4dC1zaGFkb3c6IDBweCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKKyAgICAgICAgLyogb3BlcmEgc3BlY2lmaWMgbWFya3VwICovCisgICAgICAgIGJveC1zaGFkb3c6IDVweCA1cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CisgICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA4cHg7CisgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDhweDsKKyAgICAgICAgLyogZmlyZWZveCBzcGVjaWZpYyBtYXJrdXAgKi8KKyAgICAgICAgLW1vei1ib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMTUpIDVweCA1cHggNXB4OworICAgICAgICAtbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IDhweDsKKyAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDhweDsKKyAgICAgICAgLyogd2Via2l0IHNwZWNpZmljIG1hcmt1cCAqLworICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IDVweCA1cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CisgICAgICAgIC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDhweDsKKyAgICAgICAgLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA4cHg7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKCduYXZfZi5wbmcnKTsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNFMkU4RjI7CisKK30KKworLm1lbWRvYyB7CisgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQThCOEQ5OyAgICAgIAorICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNBOEI4RDk7ICAgICAgCisgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNBOEI4RDk7IAorICAgICAgICBwYWRkaW5nOiAycHggNXB4OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkJGQ0ZEOworICAgICAgICBib3JkZXItdG9wLXdpZHRoOiAwOworICAgICAgICAvKiBvcGVyYSBzcGVjaWZpYyBtYXJrdXAgKi8KKyAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogOHB4OworICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogOHB4OworICAgICAgICBib3gtc2hhZG93OiA1cHggNXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTUpOworICAgICAgICAvKiBmaXJlZm94IHNwZWNpZmljIG1hcmt1cCAqLworICAgICAgICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogOHB4OworICAgICAgICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDhweDsKKyAgICAgICAgLW1vei1ib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMTUpIDVweCA1cHggNXB4OworICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudChjZW50ZXIgdG9wLCAjRkZGRkZGIDAlLCAjRkZGRkZGIDYwJSwgI0Y3RjhGQiA5NSUsICNFRUYxRjcpOworICAgICAgICAvKiB3ZWJraXQgc3BlY2lmaWMgbWFya3VwICovCisgICAgICAgIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogOHB4OworICAgICAgICAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA4cHg7CisgICAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCA1cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKKyAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsY2VudGVyIHRvcCxjZW50ZXIgYm90dG9tLGZyb20oI0ZGRkZGRiksIGNvbG9yLXN0b3AoMC42LCNGRkZGRkYpLCBjb2xvci1zdG9wKDAuNjAsI0ZGRkZGRiksIGNvbG9yLXN0b3AoMC45NSwjRjdGOEZCKSwgdG8oI0VFRjFGNykpOworfQorCisucGFyYW1rZXkgeworICB0ZXh0LWFsaWduOiByaWdodDsKK30KKworLnBhcmFtdHlwZSB7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKy5wYXJhbW5hbWUgeworICBjb2xvcjogIzYwMjAyMDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKy5wYXJhbW5hbWUgZW0geworICBmb250LXN0eWxlOiBub3JtYWw7Cit9CisKKy5wYXJhbXMsIC5yZXR2YWwsIC5leGNlcHRpb24sIC50cGFyYW1zIHsKKyAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDZweCAycHg7Cit9ICAgICAgIAorCisucGFyYW1zIC5wYXJhbW5hbWUsIC5yZXR2YWwgLnBhcmFtbmFtZSB7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorICAgICAgICAKKy5wYXJhbXMgLnBhcmFtdHlwZSB7CisgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKK30gICAgICAgCisgICAgICAgIAorLnBhcmFtcyAucGFyYW1kaXIgeworICAgICAgICBmb250LWZhbWlseTogImNvdXJpZXIgbmV3Iixjb3VyaWVyLG1vbm9zcGFjZTsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworCisKKworLyogQGVuZCAqLworCisvKiBAZ3JvdXAgRGlyZWN0b3J5ICh0cmVlKSAqLworCisvKiBmb3IgdGhlIHRyZWUgdmlldyAqLworCisuZnR2dHJlZSB7CisgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworICBtYXJnaW46IDBweDsKK30KKworLyogdGhlc2UgYXJlIGZvciB0cmVlIHZpZXcgd2hlbiB1c2VkIGFzIG1haW4gaW5kZXggKi8KKworLmRpcmVjdG9yeSB7CisgIGZvbnQtc2l6ZTogOXB0OworICBmb250LXdlaWdodDogYm9sZDsKKyAgbWFyZ2luOiA1cHg7Cit9CisKKy5kaXJlY3RvcnkgaDMgeworICBtYXJnaW46IDBweDsKKyAgbWFyZ2luLXRvcDogMWVtOworICBmb250LXNpemU6IDExcHQ7Cit9CisKKy8qCitUaGUgZm9sbG93aW5nIHR3byBzdHlsZXMgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgcm9vdCBub2RlIHRpdGxlCit3aXRoIGFuIGltYWdlIG9mIHlvdXIgY2hvaWNlLiAgU2ltcGx5IHVuY29tbWVudCB0aGUgbmV4dCB0d28gc3R5bGVzLAorc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIGltYWdlIGFuZCBiZSBzdXJlIHRvIHNldCAnaGVpZ2h0JyB0byB0aGUKK3Byb3BlciBwaXhlbCBoZWlnaHQgb2YgeW91ciBpbWFnZS4KKyovCisKKy8qCisuZGlyZWN0b3J5IGgzLnN3YXAgeworICBoZWlnaHQ6IDYxcHg7CisgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgieW91cmltYWdlLmdpZiIpOworfQorLmRpcmVjdG9yeSBoMy5zd2FwIHNwYW4geworICBkaXNwbGF5OiBub25lOworfQorKi8KKworLmRpcmVjdG9yeSA+IGgzIHsKKyAgbWFyZ2luLXRvcDogMDsKK30KKworLmRpcmVjdG9yeSBwIHsKKyAgbWFyZ2luOiAwcHg7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKy5kaXJlY3RvcnkgZGl2IHsKKyAgZGlzcGxheTogbm9uZTsKKyAgbWFyZ2luOiAwcHg7Cit9CisKKy5kaXJlY3RvcnkgaW1nIHsKKyAgdmVydGljYWwtYWxpZ246IC0zMCU7Cit9CisKKy8qIHRoZXNlIGFyZSBmb3IgdHJlZSB2aWV3IHdoZW4gbm90IHVzZWQgYXMgbWFpbiBpbmRleCAqLworCisuZGlyZWN0b3J5LWFsdCB7CisgIGZvbnQtc2l6ZTogMTAwJTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5kaXJlY3RvcnktYWx0IGgzIHsKKyAgbWFyZ2luOiAwcHg7CisgIG1hcmdpbi10b3A6IDFlbTsKKyAgZm9udC1zaXplOiAxMXB0OworfQorCisuZGlyZWN0b3J5LWFsdCA+IGgzIHsKKyAgbWFyZ2luLXRvcDogMDsKK30KKworLmRpcmVjdG9yeS1hbHQgcCB7CisgIG1hcmdpbjogMHB4OworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisuZGlyZWN0b3J5LWFsdCBkaXYgeworICBkaXNwbGF5OiBub25lOworICBtYXJnaW46IDBweDsKK30KKworLmRpcmVjdG9yeS1hbHQgaW1nIHsKKyAgdmVydGljYWwtYWxpZ246IC0zMCU7Cit9CisKKy8qIEBlbmQgKi8KKworZGl2LmR5bmhlYWRlciB7CisgICAgICAgIG1hcmdpbi10b3A6IDhweDsKK30KKworYWRkcmVzcyB7CisgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgY29sb3I6ICMyQTNENjE7Cit9CisKK3RhYmxlLmRveHRhYmxlIHsKKyAgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOworfQorCit0YWJsZS5kb3h0YWJsZSB0ZCwgdGFibGUuZG94dGFibGUgdGggeworICBib3JkZXI6IDFweCBzb2xpZCAjMkQ0MDY4OworICBwYWRkaW5nOiAzcHggN3B4IDJweDsKK30KKwordGFibGUuZG94dGFibGUgdGggeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzc0RjdGOworICBjb2xvcjogI0ZGRkZGRjsKKyAgZm9udC1zaXplOiAxMTAlOworICBwYWRkaW5nLWJvdHRvbTogNHB4OworICBwYWRkaW5nLXRvcDogNXB4OworICB0ZXh0LWFsaWduOmxlZnQ7Cit9CisKKy50YWJzZWFyY2ggeworICB0b3A6IDBweDsKKyAgbGVmdDogMTBweDsKKyAgaGVpZ2h0OiAzNnB4OworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ3RhYl9iLnBuZycpOworICB6LWluZGV4OiAxMDE7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGZvbnQtc2l6ZTogMTNweDsKK30KKworLm5hdnBhdGggdWwKK3sKKyAgZm9udC1zaXplOiAxMXB4OworICBiYWNrZ3JvdW5kLWltYWdlOnVybCgndGFiX2IucG5nJyk7CisgIGJhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OworICBoZWlnaHQ6MzBweDsKKyAgbGluZS1oZWlnaHQ6MzBweDsKKyAgY29sb3I6IzhBQTBDQzsKKyAgYm9yZGVyOnNvbGlkIDFweCAjQzJDREU0OworICBvdmVyZmxvdzpoaWRkZW47CisgIG1hcmdpbjowcHg7CisgIHBhZGRpbmc6MHB4OworfQorCisubmF2cGF0aCBsaQoreworICBsaXN0LXN0eWxlLXR5cGU6bm9uZTsKKyAgZmxvYXQ6bGVmdDsKKyAgcGFkZGluZy1sZWZ0OjEwcHg7CisgIHBhZGRpbmctcmlnaHQ6IDE1cHg7CisgIGJhY2tncm91bmQtaW1hZ2U6dXJsKCdiY19zLnBuZycpOworICBiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7CisgIGJhY2tncm91bmQtcG9zaXRpb246cmlnaHQ7CisgIGNvbG9yOiMzNjREN0M7Cit9CisKKy5uYXZwYXRoIGEKK3sKKyAgaGVpZ2h0OjMycHg7CisgIGRpc3BsYXk6YmxvY2s7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgb3V0bGluZTogbm9uZTsKK30KKworLm5hdnBhdGggYTpob3ZlcgoreworICBjb2xvcjojNjg4NEJEOworfQorCitkaXYuc3VtbWFyeQoreworICBmbG9hdDogcmlnaHQ7CisgIGZvbnQtc2l6ZTogOHB0OworICBwYWRkaW5nLXJpZ2h0OiA1cHg7CisgIHdpZHRoOiA1MCU7CisgIHRleHQtYWxpZ246IHJpZ2h0OworfSAgICAgICAKKworZGl2LnN1bW1hcnkgYQoreworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCitkaXYuaGVhZGVyCit7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKCduYXZfaC5wbmcnKTsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7CisgIGJhY2tncm91bmQtY29sb3I6ICNGOUZBRkM7CisgIG1hcmdpbjogIDBweDsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNDNENGRTU7Cit9CisKK2Rpdi5oZWFkZXJ0aXRsZQoreworICBwYWRkaW5nOiA1cHggNXB4IDVweCAxMHB4OworfQorCisKKworLyoqKioqKioqIEVpZ2VuIHNwZWNpZmljIENTUyBjb2RlICoqKioqKioqKioqKi8KKworCitib2R5IHsKKyAgbWF4LXdpZHRoOjYwZW07CisgIG1hcmdpbi1sZWZ0OjUlOworICBtYXJnaW4tdG9wOjIlOworICBmb250LWZhbWlseTogTHVjaWRhIEdyYW5kZSwgVmVyZGFuYSwgR2VuZXZhLCBBcmlhbCwgc2Fucy1zZXJpZjsKK30KKworaW1nIHsKKyAgICBib3JkZXI6IDA7Cit9CisKK2EubG9nbyB7CisgIGZsb2F0OnJpZ2h0OworICBtYXJnaW46MTBweDsKK30KKworZGl2LmZyYWdtZW50IHsKKyAgZGlzcGxheTp0YWJsZTsgLyogdGhpcyBhbGxvd3MgdGhlIGVsZW1lbnQgdG8gYmUgbGFyZ2VyIHRoYW4gaXRzIHBhcmVudCAqLworICBwYWRkaW5nOiAwcHQ7Cit9CitwcmUuZnJhZ21lbnQgeworICBib3JkZXI6IDFweCBzb2xpZCAjY2NjY2NjOworCisgIG1hcmdpbjogMnB4IDBweCAycHggMHB4IDsKKyAgcGFkZGluZzogM3B4IDVweCAzcHggNXB4OworfQorCisvKiBDb21tb24gc3R5bGUgZm9yIGFsbCBFaWdlbidzIHRhYmxlcyAqLworCit0YWJsZS5leGFtcGxlLCB0YWJsZS5tYW51YWwsIHRhYmxlLm1hbnVhbC12bCB7CisgICAgbWF4LXdpZHRoOjEwMCU7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXItc3R5bGU6IHNvbGlkOworICAgIGJvcmRlci13aWR0aDogMXB4OworICAgIGJvcmRlci1jb2xvcjogI2NjY2NjYzsKKyAgICBmb250LXNpemU6IDFlbTsKKyAgICAKKyAgICBib3gtc2hhZG93OiA1cHggNXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTUpOworICAgIC1tb3otYm94LXNoYWRvdzogNXB4IDVweCA1cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKKyAgICAtd2Via2l0LWJveC1zaGFkb3c6IDVweCA1cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7Cit9CisKK3RhYmxlLmV4YW1wbGUgdGgsIHRhYmxlLm1hbnVhbCB0aCwgdGFibGUubWFudWFsLXZsIHRoIHsKKyAgcGFkZGluZzogMC41ZW0gMC41ZW0gMC41ZW0gMC41ZW07CisgIHRleHQtYWxpZ246IGxlZnQ7CisgIHBhZGRpbmctcmlnaHQ6IDFlbTsKKyAgY29sb3I6ICM1NTU1NTU7CisgIGJhY2tncm91bmQtY29sb3I6ICNGNEY0RTU7CisgIAorICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhcixjZW50ZXIgdG9wLGNlbnRlciBib3R0b20sZnJvbSgjRkZGRkZGKSwgY29sb3Itc3RvcCgwLjMsI0ZGRkZGRiksIGNvbG9yLXN0b3AoMC4zMCwjRkZGRkZGKSwgY29sb3Itc3RvcCgwLjk4LCNGNEY0RTUpLCB0bygjRUNFQ0RFKSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KGNlbnRlciB0b3AsICNGRkZGRkYgMCUsICNGRkZGRkYgMzAlLCAjRjRGNEU1IDk4JSwgI0VDRUNERSk7CisgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNGRkZGRkYnLCBlbmRDb2xvcnN0cj0nI0Y0RjRFNScpOworfQorCit0YWJsZS5leGFtcGxlIHRkLCB0YWJsZS5tYW51YWwgdGQsIHRhYmxlLm1hbnVhbC12bCB0ZCB7CisgIHZlcnRpY2FsLWFsaWduOnRvcDsKKyAgYm9yZGVyLXdpZHRoOiAxcHg7CisgIGJvcmRlci1jb2xvcjogI2NjY2NjYzsKK30KKworLyogaGVhZGVyIG9mIGhlYWRlcnMgKi8KK3RhYmxlIHRoLm1ldGEgeworICB0ZXh0LWFsaWduOmNlbnRlcjsKKyAgZm9udC1zaXplOiAxLjJlbTsKKyAgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOworfQorCisvKiBpbnRlcm1lZGlhdGUgaGVhZGVyICovCit0YWJsZSB0aC5pbnRlciB7CisgIHRleHQtYWxpZ246bGVmdDsKKyAgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOworICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7CisgIGJvcmRlci1zdHlsZTpzb2xpZCBzb2xpZCBzb2xpZCBzb2xpZDsKKyAgYm9yZGVyLXdpZHRoOiAxcHg7CisJYm9yZGVyLWNvbG9yOiAjY2NjY2NjOworfQorCisvKiogY2xhc3MgZm9yIGV4ZW1wbGUgLyBvdXRwdXQgdGFibGVzICoqLworCit0YWJsZS5leGFtcGxlIHsKK30KKwordGFibGUuZXhhbXBsZSB0aCB7Cit9CisKK3RhYmxlLmV4YW1wbGUgdGQgeworICBwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKKyAgdmVydGljYWwtYWxpZ246dG9wOworfQorCisvKiBzdGFuZGFyZCBjbGFzcyBmb3IgdGhlIG1hbnVhbCAqLworCit0YWJsZS5tYW51YWwsIHRhYmxlLm1hbnVhbC12bCB7CisgICAgcGFkZGluZzogMC4yZW0gMGVtIDAuNWVtIDBlbTsKK30KKwordGFibGUubWFudWFsIHRoLCB0YWJsZS5tYW51YWwtdmwgdGggeworICBtYXJnaW46IDBlbSAwZW0gMC4zZW0gMGVtOworfQorCit0YWJsZS5tYW51YWwgdGQsIHRhYmxlLm1hbnVhbC12bCB0ZCB7CisgIHBhZGRpbmc6IDAuM2VtIDAuNWVtIDAuM2VtIDAuNWVtOworICB2ZXJ0aWNhbC1hbGlnbjp0b3A7CisgIGJvcmRlci13aWR0aDogMXB4OworfQorCit0YWJsZS5tYW51YWwgdGQuYWx0LCB0YWJsZS5tYW51YWwgdHIuYWx0LCB0YWJsZS5tYW51YWwtdmwgdGQuYWx0LCB0YWJsZS5tYW51YWwtdmwgdHIuYWx0IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0Y0RjRFNTsKK30KKwordGFibGUubWFudWFsLXZsIHRoLCB0YWJsZS5tYW51YWwtdmwgdGQsIHRhYmxlLm1hbnVhbC12bCB0ZC5hbHQgeworICBib3JkZXItY29sb3I6ICNjY2NjY2M7CisgIGJvcmRlci13aWR0aDogMXB4OworICBib3JkZXItc3R5bGU6IG5vbmUgc29saWQgbm9uZSBzb2xpZDsKK30KKwordGFibGUubWFudWFsLXZsIHRoLmludGVyIHsKKyAgYm9yZGVyLXN0eWxlOiBzb2xpZCBzb2xpZCBzb2xpZCBzb2xpZDsKK30KKworaDIgeworICBtYXJnaW4tdG9wOjJlbTsKKyAgYm9yZGVyLXN0eWxlOiBub25lIG5vbmUgc29saWQgbm9uZTsKKyAgYm9yZGVyLXdpZHRoOiAxcHg7CisgIGJvcmRlci1jb2xvcjogI2NjY2NjYzsKK30KKworCisvKioqKiBvbGQgRWlnZW4ncyBzdHlsZXMgKioqKi8KKwordGggeworICAgIC8qdGV4dC1hbGlnbjogbGVmdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxZW07Ki8KKyAgICAvKiBib3JkZXI6ICNjY2NjY2MgZGFzaGVkOyAqLworICAgIC8qIGJvcmRlci1zdHlsZTogZGFzaGVkOyAqLworICAgIC8qIGJvcmRlci13aWR0aDogMCAwIDNweCAwOyAqLworfQorLyoKK3RhYmxlLm5vYm9yZGVyIHsKKyAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKKyAgYm9yZGVyLWJvdHRvbS1zdHlsZSA6IG5vbmU7CisgIGJvcmRlci1sZWZ0LXN0eWxlICAgOiBub25lOworICBib3JkZXItcmlnaHQtc3R5bGUgIDogbm9uZTsKKyAgYm9yZGVyLXRvcC1zdHlsZSA6IG5vbmUgOworICBib3JkZXItc3BhY2luZyA6IDBweCAwcHg7CisgIG1hcmdpbjogNHB0IDAgMCAwOworICBwYWRkaW5nOiAwIDAgMCAwOworICAKKyAgICAtd2Via2l0LWJveC1zaGFkb3c6IDVweCA1cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CisgICAgLW1vei1ib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMTUpIDVweCA1cHggNXB4OworfQorCit0YWJsZS5ub2JvcmRlciB0ZCB7CisgIGJvcmRlci1ib3R0b20tc3R5bGUgOiBub25lOworICBib3JkZXItbGVmdC1zdHlsZSAgIDogbm9uZTsKKyAgYm9yZGVyLXJpZ2h0LXN0eWxlICA6IG5vbmU7CisgIGJvcmRlci10b3Atc3R5bGUgOiBub25lOworICBib3JkZXItc3BhY2luZyA6IDBweCAwcHg7CisgIG1hcmdpbjogMCAwIDAgMDsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKwordGFibGUudHV0b3JpYWxfY29kZSB7CisgIHdpZHRoOiA5MCU7CisgICAgLXdlYmtpdC1ib3gtc2hhZG93OiA1cHggNXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTUpOworICAgIC1tb3otYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjE1KSA1cHggNXB4IDVweDsKK30KKwordGFibGUudHV0b3JpYWxfY29kZSB0ciB7CisgIGJvcmRlcjogMXB4IGRhc2hlZCAjODg4ODg4OworfQorKi8KKwordGFibGUudHV0b3JpYWxfY29kZSB0ZCB7CisgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7IC8qIHJlcXVpcmVkIGZvciBGaXJlZm94ICovCisgIHBhZGRpbmc6IDNwdCA1cHQgM3B0IDVwdDsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworCisvKiBXaGVuZXZlciBkb3h5Z2VuIG1lZXRzIGEgJ1xuJyBvciBhICc8QlIvPicsIGl0IHdpbGwgcHV0IAorICogdGhlIHRleHQgY29udGFpbmluZyB0aGUgY2hhcmFjdGVkIGludG8gYSA8cCBjbGFzcz0ic3RhcnR0ZCI+LgorICogVGhpcyBsaXR0bGUgaGFjayB0b2dlaHRlciB3aXRoIHRhYmxlLnR1dG9yaWFsX2NvZGUgdGQubm90ZQorICogYWltcyBhdCBmaXhpbmcgdGhpcyBpc3N1ZS4gKi8KK3RhYmxlLnR1dG9yaWFsX2NvZGUgdGQubm90ZSBwLnN0YXJ0dGQgeworICBtYXJnaW46IDBweDsKKyAgYm9yZGVyOiBub25lOworICBwYWRkaW5nOiAwcHg7Cit9CisvKgorZGl2LmZyYWdtZW50IHsKKyAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgZml4ZWQ7CisgIGZvbnQtc2l6ZTogOTUlOworICAKKyAgYm9yZGVyOiBub25lOworICBwYWRkaW5nOiAwcHQ7Cit9CisKK3ByZS5mcmFnbWVudCB7CisgIG1hcmdpbjogMHB0OworICBib3JkZXI6IDFweCBzb2xpZCAjY2NjY2NjOworICBwYWRkaW5nOiAycHggNXB4IDJweCA1cHg7CisgIAorICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OworfQorKi8KKworZGl2LmVpbWFpbm1lbnUgeworICB0ZXh0LWFsaWduOiAgICAgY2VudGVyOworfQorCisvKiBjZW50ZXIgdmVyc2lvbiBudW1iZXIgb24gbWFpbiBwYWdlICovCitoMy52ZXJzaW9uIHsgCisgIHRleHQtYWxpZ246ICAgICBjZW50ZXI7Cit9CisKKwordGQud2lkdGgyMGVtIHAuZW5kdGQgeworICB3aWR0aDogIDIwZW07Cit9CmRpZmYgLS1naXQgYS9kb2MvZWlnZW5kb3h5X2Zvb3Rlci5odG1sLmluIGIvZG9jL2VpZ2VuZG94eV9mb290ZXIuaHRtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzA4MjlmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2VpZ2VuZG94eV9mb290ZXIuaHRtbC5pbgpAQCAtMCwwICsxLDUgQEAKKworPGhyIGNsYXNzPSJmb290ZXIiLz48YWRkcmVzcyBjbGFzcz0iZm9vdGVyIj48c21hbGw+Cis8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPjxpbWcgY2xhc3M9ImZvb3RlciIgc3JjPSIkcmVscGF0aCRkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIi8+PC9hPjwvc21hbGw+PC9hZGRyZXNzPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9laWdlbmRveHlfaGVhZGVyLmh0bWwuaW4gYi9kb2MvZWlnZW5kb3h5X2hlYWRlci5odG1sLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZmU0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWlnZW5kb3h5X2hlYWRlci5odG1sLmluCkBAIC0wLDAgKzEsMTQgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L3hodG1sO2NoYXJzZXQ9VVRGLTgiLz4KKzx0aXRsZT4kdGl0bGU8L3RpdGxlPgorPGxpbmsgaHJlZj0iJHJlbHBhdGgkZWlnZW5kb3h5X3RhYnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KKzxsaW5rIGhyZWY9IiRyZWxwYXRoJHNlYXJjaC9zZWFyY2guY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YVNjcmlwdCIgc3JjPSIkcmVscGF0aCRzZWFyY2gvc2VhcmNoLmpzIj48L3NjcmlwdD4KKzxsaW5rIGhyZWY9IiRyZWxwYXRoJGVpZ2VuZG94eS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPC9oZWFkPgorPGJvZHkgb25sb2FkPSdzZWFyY2hCb3guT25TZWxlY3RJdGVtKDApOyc+Cis8YSBuYW1lPSJ0b3AiPjwvYT4KKzxhIGNsYXNzPSJsb2dvIiBocmVmPSJodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy8iPgorPGltZyBjbGFzcz0ibG9nbyIgc3JjPSJFaWdlbl9TaWxseV9Qcm9mZXNzb3JfNjR4NjQucG5nIiB3aWR0aD02NCBoZWlnaHQ9NjQgYWx0PSJFaWdlbidzIHNpbGx5IHByb2Zlc3NvciIvPjwvYT4KZGlmZiAtLWdpdCBhL2RvYy9laWdlbmRveHlfdGFicy5jc3MgYi9kb2MvZWlnZW5kb3h5X3RhYnMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTIwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZWlnZW5kb3h5X3RhYnMuY3NzCkBAIC0wLDAgKzEsNTkgQEAKKy50YWJzLCAudGFiczIsIC50YWJzMyB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCd0YWJfYi5wbmcnKTsKKyAgICB3aWR0aDogMTAwJTsKKyAgICB6LWluZGV4OiAxMDE7CisgICAgZm9udC1zaXplOiAxM3B4OworfQorCisudGFiczIgeworICAgIGZvbnQtc2l6ZTogMTBweDsKK30KKy50YWJzMyB7CisgICAgZm9udC1zaXplOiA5cHg7Cit9CisKKy50YWJsaXN0IHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBkaXNwbGF5OiB0YWJsZTsKK30KKworLnRhYmxpc3QgbGkgeworICAgIGZsb2F0OiBsZWZ0OworICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCd0YWJfYi5wbmcnKTsKKyAgICBsaW5lLWhlaWdodDogMzZweDsKKyAgICBsaXN0LXN0eWxlOiBub25lOworfQorCisudGFibGlzdCBhIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBwYWRkaW5nOiAwIDIwcHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoJ3RhYl9zLnBuZycpOworICAgIGJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0OworICAgIGNvbG9yOiAjMjgzQTVEOworICAgIHRleHQtc2hhZG93OiAwcHggMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIG91dGxpbmU6IG5vbmU7Cit9CisKKy50YWJzMyAudGFibGlzdCBhIHsKKyAgICBwYWRkaW5nOiAwIDEwcHg7Cit9CisKKy50YWJsaXN0IGE6aG92ZXIgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgndGFiX2gucG5nJyk7CisgICAgYmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7CisgICAgY29sb3I6ICNmZmY7CisgICAgdGV4dC1zaGFkb3c6IDBweCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMS4wKTsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy50YWJsaXN0IGxpLmN1cnJlbnQgYSB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCd0YWJfYS5wbmcnKTsKKyAgICBiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsKKyAgICBjb2xvcjogI2ZmZjsKKyAgICB0ZXh0LXNoYWRvdzogMHB4IDFweCAxcHggcmdiYSgwLCAwLCAwLCAxLjApOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzLy5rcmF6eSBiL2RvYy9leGFtcGxlcy8ua3JhenkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiOTk0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy8ua3JhenkKQEAgLTAsMCArMSwyIEBACitFWENMVURFIGNvcHlyaWdodAorRVhDTFVERSBsaWNlbnNlCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvQ01ha2VMaXN0cy50eHQgYi9kb2MvZXhhbXBsZXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlYzBjMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIwIEBACitmaWxlKEdMT0IgZXhhbXBsZXNfU1JDUyAiKi5jcHAiKQorCithZGRfY3VzdG9tX3RhcmdldChhbGxfZXhhbXBsZXMpCisKK2ZvcmVhY2goZXhhbXBsZV9zcmMgJHtleGFtcGxlc19TUkNTfSkKKyAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChleGFtcGxlICR7ZXhhbXBsZV9zcmN9IE5BTUVfV0UpCisgIGFkZF9leGVjdXRhYmxlKCR7ZXhhbXBsZX0gJHtleGFtcGxlX3NyY30pCisgIGlmKEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke2V4YW1wbGV9ICR7RUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE99KQorICBlbmRpZigpCisgIGdldF90YXJnZXRfcHJvcGVydHkoZXhhbXBsZV9leGVjdXRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgJHtleGFtcGxlfSBMT0NBVElPTikKKyAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIFRBUkdFVCAke2V4YW1wbGV9CisgICAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtleGFtcGxlX2V4ZWN1dGFibGV9CisgICAgQVJHUyA+JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7ZXhhbXBsZX0ub3V0CisgICkKKyAgYWRkX2RlcGVuZGVuY2llcyhhbGxfZXhhbXBsZXMgJHtleGFtcGxlfSkKK2VuZGZvcmVhY2goZXhhbXBsZV9zcmMpCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX21pZGRsZUNvbHNfaW50LmNwcCBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfbWlkZGxlQ29sc19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmQ5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX21pZGRsZUNvbHNfaW50LmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgY29uc3QgTiA9IDU7CisgICAgTWF0cml4WGkgQShOLE4pOworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgY291dCA8PCAiQSA9XG4iIDw8IEEgPDwgJ1xuJyA8PCBlbmRsOworICAgIGNvdXQgPDwgIkEoMS4uMyw6KSA9XG4iIDw8IEEubWlkZGxlQ29scygxLDMpIDw8IGVuZGw7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX21pZGRsZVJvd3NfaW50LmNwcCBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfbWlkZGxlUm93c19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZmU5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX21pZGRsZVJvd3NfaW50LmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgY29uc3QgTiA9IDU7CisgICAgTWF0cml4WGkgQShOLE4pOworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgY291dCA8PCAiQSA9XG4iIDw8IEEgPDwgJ1xuJyA8PCBlbmRsOworICAgIGNvdXQgPDwgIkEoMi4uMyw6KSA9XG4iIDw8IEEubWlkZGxlUm93cygyLDIpIDw8IGVuZGw7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVDb2xzLmNwcCBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfdGVtcGxhdGVfaW50X21pZGRsZUNvbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTFkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVDb2xzLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgY29uc3QgTiA9IDU7CisgICAgTWF0cml4WGkgQShOLE4pOworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgY291dCA8PCAiQSA9XG4iIDw8IEEgPDwgJ1xuJyA8PCBlbmRsOworICAgIGNvdXQgPDwgIkEoOiwxLi4zKSA9XG4iIDw8IEEubWlkZGxlQ29sczwzPigxKSA8PCBlbmRsOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL0RlbnNlQmFzZV90ZW1wbGF0ZV9pbnRfbWlkZGxlUm93cy5jcHAgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVSb3dzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThiNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL0RlbnNlQmFzZV90ZW1wbGF0ZV9pbnRfbWlkZGxlUm93cy5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGNvbnN0IE4gPSA1OworICAgIE1hdHJpeFhpIEEoTixOKTsKKyAgICBBLnNldFJhbmRvbSgpOworICAgIGNvdXQgPDwgIkEgPVxuIiA8PCBBIDw8ICdcbicgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJBKDEuLjMsOikgPVxuIiA8PCBBLm1pZGRsZVJvd3M8Mz4oMSkgPDwgZW5kbDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9NYXRyaXhCYXNlX2N3aXNlX2NvbnN0LmNwcCBiL2RvYy9leGFtcGxlcy9NYXRyaXhCYXNlX2N3aXNlX2NvbnN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzcwMGUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL01hdHJpeEJhc2VfY3dpc2VfY29uc3QuY3BwCkBAIC0wLDAgKzEsMTggQEAKKyNkZWZpbmUgRUlHRU4yX1NVUFBPUlQKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeDNpIG0gPSBNYXRyaXgzaTo6UmFuZG9tKCk7CisgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CisgIE1hdHJpeDNpIG4gPSBNYXRyaXgzaTo6UmFuZG9tKCk7CisgIGNvdXQgPDwgIkFuZCBoZXJlIGlzIHRoZSBtYXRyaXggbjoiIDw8IGVuZGwgPDwgbiA8PCBlbmRsOworICBjb3V0IDw8ICJUaGUgY29lZmZpY2llbnQtd2lzZSBwcm9kdWN0IG9mIG0gYW5kIG4gaXM6IiA8PCBlbmRsOworICBjb3V0IDw8IG0uY3dpc2UoKSAqIG4gPDwgZW5kbDsKKyAgY291dCA8PCAiVGFraW5nIHRoZSBjdWJlIG9mIHRoZSBjb2VmZmljaWVudHMgb2YgbSB5aWVsZHM6IiA8PCBlbmRsOworICBjb3V0IDw8IG0uY3dpc2UoKS5wb3coMykgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUuY3BwIGIvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzOGMwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgRWlnZW46Ok1hdHJpeFhkOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeFhkIG0oMiwyKTsKKyAgbSgwLDApID0gMzsKKyAgbSgxLDApID0gMi41OworICBtKDAsMSkgPSAtMTsKKyAgbSgxLDEpID0gbSgxLDApICsgbSgwLDEpOworICBzdGQ6OmNvdXQgPDwgbSA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLmNwcCBiL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUyX2R5bmFtaWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MmFjODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGYgbSA9IE1hdHJpeFhmOjpSYW5kb20oMywzKTsKKyAgbSA9IChtICsgTWF0cml4WGY6OkNvbnN0YW50KDMsMywxLjIpKSAqIDUwOworICBjb3V0IDw8ICJtID0iIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworICBWZWN0b3JYZiB2KDMpOworICB2IDw8IDEsIDIsIDM7CisgIGNvdXQgPDwgIm0gKiB2ID0iIDw8IGVuZGwgPDwgbSAqIHYgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUyX2ZpeGVkLmNwcCBiL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUyX2ZpeGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGYzMjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZTJfZml4ZWQuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBNYXRyaXgzZiBtID0gTWF0cml4M2Y6OlJhbmRvbSgpOworICBtID0gKG0gKyBNYXRyaXgzZjo6Q29uc3RhbnQoMS4yKSkgKiA1MDsKKyAgY291dCA8PCAibSA9IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKKyAgVmVjdG9yM2YgdigxLDIsMyk7CisgIAorICBjb3V0IDw8ICJtICogdiA9IiA8PCBlbmRsIDw8IG0gKiB2IDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX2ZsZXhpYmxlLmNwcCBiL2RvYy9leGFtcGxlcy9UZW1wbGF0ZUtleXdvcmRfZmxleGlibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkODUyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX2ZsZXhpYmxlLmNwcApAQCAtMCwwICsxLDIyIEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMj4KK3ZvaWQgY29weVVwcGVyVHJpYW5ndWxhclBhcnQoTWF0cml4QmFzZTxEZXJpdmVkMT4mIGRzdCwgY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMj4mIHNyYykKK3sKKyAgLyogTm90ZSB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkcyBpbiB0aGUgZm9sbG93aW5nIGxpbmUhICovCisgIGRzdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IHNyYy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKK30KKworaW50IG1haW4oKQoreworICBNYXRyaXhYaSBtMSA9IE1hdHJpeFhpOjpPbmVzKDUsNSk7CisgIE1hdHJpeFhpIG0yID0gTWF0cml4WGk6OlJhbmRvbSg0LDQpOworICBzdGQ6OmNvdXQgPDwgIm0yIGJlZm9yZSBjb3B5OiIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgbTIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgY29weVVwcGVyVHJpYW5ndWxhclBhcnQobTIsIG0xLnRvcExlZnRDb3JuZXIoNCw0KSk7CisgIHN0ZDo6Y291dCA8PCAibTIgYWZ0ZXIgY29weToiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IG0yIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX3NpbXBsZS5jcHAgYi9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX3NpbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5OGMxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UZW1wbGF0ZUtleXdvcmRfc2ltcGxlLmNwcApAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBjb3B5VXBwZXJUcmlhbmd1bGFyUGFydChNYXRyaXhYZiYgZHN0LCBjb25zdCBNYXRyaXhYZiYgc3JjKQoreworICBkc3QudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBzcmMudHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGYgbTEgPSBNYXRyaXhYZjo6T25lcyg0LDQpOworICBNYXRyaXhYZiBtMiA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKKyAgc3RkOjpjb3V0IDw8ICJtMiBiZWZvcmUgY29weToiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IG0yIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgIGNvcHlVcHBlclRyaWFuZ3VsYXJQYXJ0KG0yLCBtMSk7CisgIHN0ZDo6Y291dCA8PCAibTIgYWZ0ZXIgY29weToiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IG0yIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdDb21wdXRlVHdpY2UuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnQ29tcHV0ZVR3aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmJhNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnQ29tcHV0ZVR3aWNlLmNwcApAQCAtMCwwICsxLDIzIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeDJmIEEsIGI7CisgICBMTFQ8TWF0cml4MmY+IGxsdDsKKyAgIEEgPDwgMiwgLTEsIC0xLCAzOworICAgYiA8PCAxLCAyLCAzLCAxOworICAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgZW5kbDsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIHJpZ2h0IGhhbmQgc2lkZSBiOlxuIiA8PCBiIDw8IGVuZGw7CisgICBjb3V0IDw8ICJDb21wdXRpbmcgTExUIGRlY29tcG9zaXRpb24uLi4iIDw8IGVuZGw7CisgICBsbHQuY29tcHV0ZShBKTsKKyAgIGNvdXQgPDwgIlRoZSBzb2x1dGlvbiBpczpcbiIgPDwgbGx0LnNvbHZlKGIpIDw8IGVuZGw7CisgICBBKDEsMSkrKzsKKyAgIGNvdXQgPDwgIlRoZSBtYXRyaXggQSBpcyBub3c6XG4iIDw8IEEgPDwgZW5kbDsKKyAgIGNvdXQgPDwgIkNvbXB1dGluZyBMTFQgZGVjb21wb3NpdGlvbi4uLiIgPDwgZW5kbDsKKyAgIGxsdC5jb21wdXRlKEEpOworICAgY291dCA8PCAiVGhlIHNvbHV0aW9uIGlzIG5vdzpcbiIgPDwgbGx0LnNvbHZlKGIpIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeENvbXB1dGVTb2x2ZUVycm9yLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0V4Q29tcHV0ZVNvbHZlRXJyb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjJmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeENvbXB1dGVTb2x2ZUVycm9yLmNwcApAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDEwMCwxMDApOworICAgTWF0cml4WGQgYiA9IE1hdHJpeFhkOjpSYW5kb20oMTAwLDUwKTsKKyAgIE1hdHJpeFhkIHggPSBBLmZ1bGxQaXZMdSgpLnNvbHZlKGIpOworICAgZG91YmxlIHJlbGF0aXZlX2Vycm9yID0gKEEqeCAtIGIpLm5vcm0oKSAvIGIubm9ybSgpOyAvLyBub3JtKCkgaXMgTDIgbm9ybQorICAgY291dCA8PCAiVGhlIHJlbGF0aXZlIGVycm9yIGlzOlxuIiA8PCByZWxhdGl2ZV9lcnJvciA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnRXhTb2x2ZUNvbFBpdkhvdXNlaG9sZGVyUVIuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnRXhTb2x2ZUNvbFBpdkhvdXNlaG9sZGVyUVIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTlhOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeFNvbHZlQ29sUGl2SG91c2Vob2xkZXJRUi5jcHAKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgICBNYXRyaXgzZiBBOworICAgVmVjdG9yM2YgYjsKKyAgIEEgPDwgMSwyLDMsICA0LDUsNiwgIDcsOCwxMDsKKyAgIGIgPDwgMywgMywgNDsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IGVuZGw7CisgICBjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgYjpcbiIgPDwgYiA8PCBlbmRsOworICAgVmVjdG9yM2YgeCA9IEEuY29sUGl2SG91c2Vob2xkZXJRcigpLnNvbHZlKGIpOworICAgY291dCA8PCAiVGhlIHNvbHV0aW9uIGlzOlxuIiA8PCB4IDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeFNvbHZlTERMVC5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeFNvbHZlTERMVC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiZWFjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0V4U29sdmVMRExULmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeDJmIEEsIGI7CisgICBBIDw8IDIsIC0xLCAtMSwgMzsKKyAgIGIgPDwgMSwgMiwgMywgMTsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IGVuZGw7CisgICBjb3V0IDw8ICJIZXJlIGlzIHRoZSByaWdodCBoYW5kIHNpZGUgYjpcbiIgPDwgYiA8PCBlbmRsOworICAgTWF0cml4MmYgeCA9IEEubGRsdCgpLnNvbHZlKGIpOworICAgY291dCA8PCAiVGhlIHNvbHV0aW9uIGlzOlxuIiA8PCB4IDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdJbnZlcnNlRGV0ZXJtaW5hbnQuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnSW52ZXJzZURldGVybWluYW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk3MGZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnSW52ZXJzZURldGVybWluYW50LmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgIE1hdHJpeDNmIEE7CisgICBBIDw8IDEsIDIsIDEsCisgICAgICAgIDIsIDEsIDAsCisgICAgICAgIC0xLCAxLCAyOworICAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgZW5kbDsKKyAgIGNvdXQgPDwgIlRoZSBkZXRlcm1pbmFudCBvZiBBIGlzICIgPDwgQS5kZXRlcm1pbmFudCgpIDw8IGVuZGw7CisgICBjb3V0IDw8ICJUaGUgaW52ZXJzZSBvZiBBIGlzOlxuIiA8PCBBLmludmVyc2UoKSA8PCBlbmRsOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ1JhbmtSZXZlYWxpbmcuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnUmFua1JldmVhbGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxNjUwNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ1JhbmtSZXZlYWxpbmcuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICAgTWF0cml4M2YgQTsKKyAgIEEgPDwgMSwgMiwgNSwKKyAgICAgICAgMiwgMSwgNCwKKyAgICAgICAgMywgMCwgMzsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IGVuZGw7CisgICBGdWxsUGl2TFU8TWF0cml4M2Y+IGx1X2RlY29tcChBKTsKKyAgIGNvdXQgPDwgIlRoZSByYW5rIG9mIEEgaXMgIiA8PCBsdV9kZWNvbXAucmFuaygpIDw8IGVuZGw7CisgICBjb3V0IDw8ICJIZXJlIGlzIGEgbWF0cml4IHdob3NlIGNvbHVtbnMgZm9ybSBhIGJhc2lzIG9mIHRoZSBudWxsLXNwYWNlIG9mIEE6XG4iCisgICAgICAgIDw8IGx1X2RlY29tcC5rZXJuZWwoKSA8PCBlbmRsOworICAgY291dCA8PCAiSGVyZSBpcyBhIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGZvcm0gYSBiYXNpcyBvZiB0aGUgY29sdW1uLXNwYWNlIG9mIEE6XG4iCisgICAgICAgIDw8IGx1X2RlY29tcC5pbWFnZShBKSA8PCBlbmRsOyAvLyB5ZXMsIGhhdmUgdG8gcGFzcyB0aGUgb3JpZ2luYWwgQQorfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU1ZEU29sdmUuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU1ZEU29sdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYmMwMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTVkRTb2x2ZS5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgICBNYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSgzLCAyKTsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IGVuZGw7CisgICBWZWN0b3JYZiBiID0gVmVjdG9yWGY6OlJhbmRvbSgzKTsKKyAgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIHJpZ2h0IGhhbmQgc2lkZSBiOlxuIiA8PCBiIDw8IGVuZGw7CisgICBjb3V0IDw8ICJUaGUgbGVhc3Qtc3F1YXJlcyBzb2x1dGlvbiBpczpcbiIKKyAgICAgICAgPDwgQS5qYWNvYmlTdmQoQ29tcHV0ZVRoaW5VIHwgQ29tcHV0ZVRoaW5WKS5zb2x2ZShiKSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU2VsZkFkam9pbnRFaWdlblNvbHZlci5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDFkMWVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU2VsZkFkam9pbnRFaWdlblNvbHZlci5jcHAKQEAgLTAsMCArMSwxOCBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgICBNYXRyaXgyZiBBOworICAgQSA8PCAxLCAyLCAyLCAzOworICAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgZW5kbDsKKyAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4MmY+IGVpZ2Vuc29sdmVyKEEpOworICAgaWYgKGVpZ2Vuc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKSBhYm9ydCgpOworICAgY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEEgYXJlOlxuIiA8PCBlaWdlbnNvbHZlci5laWdlbnZhbHVlcygpIDw8IGVuZGw7CisgICBjb3V0IDw8ICJIZXJlJ3MgYSBtYXRyaXggd2hvc2UgY29sdW1ucyBhcmUgZWlnZW52ZWN0b3JzIG9mIEEgXG4iCisgICAgICAgIDw8ICJjb3JyZXNwb25kaW5nIHRvIHRoZXNlIGVpZ2VudmFsdWVzOlxuIgorICAgICAgICA8PCBlaWdlbnNvbHZlci5laWdlbnZlY3RvcnMoKSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU2V0VGhyZXNob2xkLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ1NldFRocmVzaG9sZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1NmIxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ1NldFRocmVzaG9sZC5jcHAKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgICBNYXRyaXgyZCBBOworICAgQSA8PCAyLCAxLAorICAgICAgICAyLCAwLjk5OTk5OTk5OTk7CisgICBGdWxsUGl2TFU8TWF0cml4MmQ+IGx1KEEpOworICAgY291dCA8PCAiQnkgZGVmYXVsdCwgdGhlIHJhbmsgb2YgQSBpcyBmb3VuZCB0byBiZSAiIDw8IGx1LnJhbmsoKSA8PCBlbmRsOworICAgbHUuc2V0VGhyZXNob2xkKDFlLTUpOworICAgY291dCA8PCAiV2l0aCB0aHJlc2hvbGQgMWUtNSwgdGhlIHJhbmsgb2YgQSBpcyBmb3VuZCB0byBiZSAiIDw8IGx1LnJhbmsoKSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfYWNjZXNzb3JzLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2FjY2Vzc29ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3MjBmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2FjY2Vzc29ycy5jcHAKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbigpCit7CisgIEFycmF5WFhmICBtKDIsMik7CisgIAorICAvLyBhc3NpZ24gc29tZSB2YWx1ZXMgY29lZmZpY2llbnQgYnkgY29lZmZpY2llbnQKKyAgbSgwLDApID0gMS4wOyBtKDAsMSkgPSAyLjA7CisgIG0oMSwwKSA9IDMuMDsgbSgxLDEpID0gbSgwLDEpICsgbSgxLDApOworICAKKyAgLy8gcHJpbnQgdmFsdWVzIHRvIHN0YW5kYXJkIG91dHB1dAorICBjb3V0IDw8IG0gPDwgZW5kbCA8PCBlbmRsOworIAorICAvLyB1c2luZyB0aGUgY29tbWEtaW5pdGlhbGl6ZXIgaXMgYWxzbyBhbGxvd2VkCisgIG0gPDwgMS4wLDIuMCwKKyAgICAgICAzLjAsNC4wOworICAgICAKKyAgLy8gcHJpbnQgdmFsdWVzIHRvIHN0YW5kYXJkIG91dHB1dAorICBjb3V0IDw8IG0gPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2FkZGl0aW9uLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2FkZGl0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBmZmIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfYWRkaXRpb24uY3BwCkBAIC0wLDAgKzEsMjMgQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBBcnJheVhYZiBhKDMsMyk7CisgIEFycmF5WFhmIGIoMywzKTsKKyAgYSA8PCAxLDIsMywKKyAgICAgICA0LDUsNiwKKyAgICAgICA3LDgsOTsKKyAgYiA8PCAxLDIsMywKKyAgICAgICAxLDIsMywKKyAgICAgICAxLDIsMzsKKyAgICAgICAKKyAgLy8gQWRkaW5nIHR3byBhcnJheXMKKyAgY291dCA8PCAiYSArIGIgPSAiIDw8IGVuZGwgPDwgYSArIGIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIFN1YnRyYWN0aW5nIGEgc2NhbGFyIGZyb20gYW4gYXJyYXkKKyAgY291dCA8PCAiYSAtIDIgPSAiIDw8IGVuZGwgPDwgYSAtIDIgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2N3aXNlX290aGVyLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2N3aXNlX290aGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA0NmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfY3dpc2Vfb3RoZXIuY3BwCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBBcnJheVhmIGEgPSBBcnJheVhmOjpSYW5kb20oNSk7CisgIGEgKj0gMjsKKyAgY291dCA8PCAiYSA9IiA8PCBlbmRsIAorICAgICAgIDw8IGEgPDwgZW5kbDsKKyAgY291dCA8PCAiYS5hYnMoKSA9IiA8PCBlbmRsIAorICAgICAgIDw8IGEuYWJzKCkgPDwgZW5kbDsKKyAgY291dCA8PCAiYS5hYnMoKS5zcXJ0KCkgPSIgPDwgZW5kbCAKKyAgICAgICA8PCBhLmFicygpLnNxcnQoKSA8PCBlbmRsOworICBjb3V0IDw8ICJhLm1pbihhLmFicygpLnNxcnQoKSkgPSIgPDwgZW5kbCAKKyAgICAgICA8PCBhLm1pbihhLmFicygpLnNxcnQoKSkgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3AuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfaW50ZXJvcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxZjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3AuY3BwCkBAIC0wLDAgKzEsMjIgQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBNYXRyaXhYZiBtKDIsMik7CisgIE1hdHJpeFhmIG4oMiwyKTsKKyAgTWF0cml4WGYgcmVzdWx0KDIsMik7CisKKyAgbSA8PCAxLDIsCisgICAgICAgMyw0OworICBuIDw8IDUsNiwKKyAgICAgICA3LDg7CisgIAorICByZXN1bHQgPSAobS5hcnJheSgpICsgNCkubWF0cml4KCkgKiBtOworICBjb3V0IDw8ICItLSBDb21iaW5hdGlvbiAxOiAtLSIgPDwgZW5kbCA8PCByZXN1bHQgPDwgZW5kbCA8PCBlbmRsOworICByZXN1bHQgPSAobS5hcnJheSgpICogbi5hcnJheSgpKS5tYXRyaXgoKSAqIG07CisgIGNvdXQgPDwgIi0tIENvbWJpbmF0aW9uIDI6IC0tIiA8PCBlbmRsIDw8IHJlc3VsdCA8PCBlbmRsIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19pbnRlcm9wX21hdHJpeC5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19pbnRlcm9wX21hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxNDI3NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3BfbWF0cml4LmNwcApAQCAtMCwwICsxLDI2IEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGYgbSgyLDIpOworICBNYXRyaXhYZiBuKDIsMik7CisgIE1hdHJpeFhmIHJlc3VsdCgyLDIpOworCisgIG0gPDwgMSwyLAorICAgICAgIDMsNDsKKyAgbiA8PCA1LDYsCisgICAgICAgNyw4OworCisgIHJlc3VsdCA9IG0gKiBuOworICBjb3V0IDw8ICItLSBNYXRyaXggbSpuOiAtLSIgPDwgZW5kbCA8PCByZXN1bHQgPDwgZW5kbCA8PCBlbmRsOworICByZXN1bHQgPSBtLmFycmF5KCkgKiBuLmFycmF5KCk7CisgIGNvdXQgPDwgIi0tIEFycmF5IG0qbjogLS0iIDw8IGVuZGwgPDwgcmVzdWx0IDw8IGVuZGwgPDwgZW5kbDsKKyAgcmVzdWx0ID0gbS5jd2lzZVByb2R1Y3Qobik7CisgIGNvdXQgPDwgIi0tIFdpdGggY3dpc2VQcm9kdWN0OiAtLSIgPDwgZW5kbCA8PCByZXN1bHQgPDwgZW5kbCA8PCBlbmRsOworICByZXN1bHQgPSBtLmFycmF5KCkgKyA0OworICBjb3V0IDw8ICItLSBBcnJheSBtICsgNDogLS0iIDw8IGVuZGwgPDwgcmVzdWx0IDw8IGVuZGwgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX211bHQuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfbXVsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiNDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX211bHQuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICBBcnJheVhYZiBhKDIsMik7CisgIEFycmF5WFhmIGIoMiwyKTsKKyAgYSA8PCAxLDIsCisgICAgICAgMyw0OworICBiIDw8IDUsNiwKKyAgICAgICA3LDg7CisgIGNvdXQgPDwgImEgKiBiID0gIiA8PCBlbmRsIDw8IGEgKiBiIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2Jsb2NrX2Fzc2lnbm1lbnQuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19ibG9ja19hc3NpZ25tZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmY0OWYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19ibG9ja19hc3NpZ25tZW50LmNwcApAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgQXJyYXkyMmYgbTsKKyAgbSA8PCAxLDIsCisgICAgICAgMyw0OworICBBcnJheTQ0ZiBhID0gQXJyYXk0NGY6OkNvbnN0YW50KDAuNik7CisgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIGFycmF5IGE6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbCA8PCBlbmRsOworICBhLmJsb2NrPDIsMj4oMSwxKSA9IG07CisgIGNvdXQgPDwgIkhlcmUgaXMgbm93IGEgd2l0aCBtIGNvcGllZCBpbnRvIGl0cyBjZW50cmFsIDJ4MiBibG9jazoiIDw8IGVuZGwgPDwgYSA8PCBlbmRsIDw8IGVuZGw7CisgIGEuYmxvY2soMCwwLDIsMykgPSBhLmJsb2NrKDIsMSwyLDMpOworICBjb3V0IDw8ICJIZXJlIGlzIG5vdyBhIHdpdGggYm90dG9tLXJpZ2h0IDJ4MyBibG9jayBjb3BpZWQgaW50byB0b3AtbGVmdCAyeDIgYmxvY2s6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbCA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19jb2xyb3cuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19jb2xyb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2ViMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2NvbHJvdy5jcHAKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbigpCit7CisgIEVpZ2VuOjpNYXRyaXhYZiBtKDMsMyk7CisgIG0gPDwgMSwyLDMsCisgICAgICAgNCw1LDYsCisgICAgICAgNyw4LDk7CisgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CisgIGNvdXQgPDwgIjJuZCBSb3c6ICIgPDwgbS5yb3coMSkgPDwgZW5kbDsKKyAgbS5jb2woMikgKz0gMyAqIG0uY29sKDApOworICBjb3V0IDw8ICJBZnRlciBhZGRpbmcgMyB0aW1lcyB0aGUgZmlyc3QgY29sdW1uIGludG8gdGhlIHRoaXJkIGNvbHVtbiwgdGhlIG1hdHJpeCBtIGlzOlxuIjsKKyAgY291dCA8PCBtIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2Nvcm5lci5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2Nvcm5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzMTUwNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfY29ybmVyLmNwcApAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgRWlnZW46Ok1hdHJpeDRmIG07CisgIG0gPDwgMSwgMiwgMywgNCwKKyAgICAgICA1LCA2LCA3LCA4LAorICAgICAgIDksIDEwLDExLDEyLAorICAgICAgIDEzLDE0LDE1LDE2OworICBjb3V0IDw8ICJtLmxlZnRDb2xzKDIpID0iIDw8IGVuZGwgPDwgbS5sZWZ0Q29scygyKSA8PCBlbmRsIDw8IGVuZGw7CisgIGNvdXQgPDwgIm0uYm90dG9tUm93czwyPigpID0iIDw8IGVuZGwgPDwgbS5ib3R0b21Sb3dzPDI+KCkgPDwgZW5kbCA8PCBlbmRsOworICBtLnRvcExlZnRDb3JuZXIoMSwzKSA9IG0uYm90dG9tUmlnaHRDb3JuZXIoMywxKS50cmFuc3Bvc2UoKTsKKyAgY291dCA8PCAiQWZ0ZXIgYXNzaWdubWVudCwgbSA9ICIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX3ByaW50X2Jsb2NrLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfcHJpbnRfYmxvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZWE0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX3ByaW50X2Jsb2NrLmNwcApAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgRWlnZW46Ok1hdHJpeFhmIG0oNCw0KTsKKyAgbSA8PCAgMSwgMiwgMywgNCwKKyAgICAgICAgNSwgNiwgNywgOCwKKyAgICAgICAgOSwxMCwxMSwxMiwKKyAgICAgICAxMywxNCwxNSwxNjsKKyAgY291dCA8PCAiQmxvY2sgaW4gdGhlIG1pZGRsZSIgPDwgZW5kbDsKKyAgY291dCA8PCBtLmJsb2NrPDIsMj4oMSwxKSA8PCBlbmRsIDw8IGVuZGw7CisgIGZvciAoaW50IGkgPSAxOyBpIDw9IDM7ICsraSkKKyAgeworICAgIGNvdXQgPDwgIkJsb2NrIG9mIHNpemUgIiA8PCBpIDw8ICJ4IiA8PCBpIDw8IGVuZGw7CisgICAgY291dCA8PCBtLmJsb2NrKDAsMCxpLGkpIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc192ZWN0b3IuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc192ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGIwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX3ZlY3Rvci5jcHAKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbigpCit7CisgIEVpZ2VuOjpBcnJheVhmIHYoNik7CisgIHYgPDwgMSwgMiwgMywgNCwgNSwgNjsKKyAgY291dCA8PCAidi5oZWFkKDMpID0iIDw8IGVuZGwgPDwgdi5oZWFkKDMpIDw8IGVuZGwgPDwgZW5kbDsKKyAgY291dCA8PCAidi50YWlsPDM+KCkgPSAiIDw8IGVuZGwgPDwgdi50YWlsPDM+KCkgPDwgZW5kbCA8PCBlbmRsOworICB2LnNlZ21lbnQoMSw0KSAqPSAyOworICBjb3V0IDw8ICJhZnRlciAndi5zZWdtZW50KDEsNCkgKj0gMicsIHYgPSIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUGFydGlhbExVX3NvbHZlLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9QYXJ0aWFsTFVfc29sdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjA4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUGFydGlhbExVX3NvbHZlLmNwcApAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICAgTWF0cml4M2YgQTsKKyAgIFZlY3RvcjNmIGI7CisgICBBIDw8IDEsMiwzLCAgNCw1LDYsICA3LDgsMTA7CisgICBiIDw8IDMsIDMsIDQ7CisgICBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOworICAgY291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIGI6IiA8PCBlbmRsIDw8IGIgPDwgZW5kbDsKKyAgIFZlY3RvcjNmIHggPSBBLmx1KCkuc29sdmUoYik7CisgICBjb3V0IDw8ICJUaGUgc29sdXRpb24gaXM6IiA8PCBlbmRsIDw8IHggPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0XzFubi5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF8xbm4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNGI0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF8xbm4uY3BwCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBFaWdlbjo6TWF0cml4WGYgbSgyLDQpOworICBFaWdlbjo6VmVjdG9yWGYgdigyKTsKKyAgCisgIG0gPDwgMSwgMjMsIDYsIDksCisgICAgICAgMywgMTEsIDcsIDI7CisgICAgICAgCisgIHYgPDwgMiwKKyAgICAgICAzOworCisgIE1hdHJpeFhmOjpJbmRleCBpbmRleDsKKyAgLy8gZmluZCBuZWFyZXN0IG5laWdoYm91cgorICAobS5jb2x3aXNlKCkgLSB2KS5jb2x3aXNlKCkuc3F1YXJlZE5vcm0oKS5taW5Db2VmZigmaW5kZXgpOworCisgIGNvdXQgPDwgIk5lYXJlc3QgbmVpZ2hib3VyIGlzIGNvbHVtbiAiIDw8IGluZGV4IDw8ICI6IiA8PCBlbmRsOworICBjb3V0IDw8IG0uY29sKGluZGV4KSA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3Rfc2ltcGxlLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjODdjNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZS5jcHAKQEAgLTAsMCArMSwyMSBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworaW50IG1haW4oKQoreworICBFaWdlbjo6TWF0cml4WGYgbWF0KDIsNCk7CisgIEVpZ2VuOjpWZWN0b3JYZiB2KDIpOworICAKKyAgbWF0IDw8IDEsIDIsIDYsIDksCisgICAgICAgICAzLCAxLCA3LCAyOworICAgICAgICAgCisgIHYgPDwgMCwKKyAgICAgICAxOworICAgICAgIAorICAvL2FkZCB2IHRvIGVhY2ggY29sdW1uIG9mIG0KKyAgbWF0LmNvbHdpc2UoKSArPSB2OworICAKKyAgc3RkOjpjb3V0IDw8ICJCcm9hZGNhc3RpbmcgcmVzdWx0OiAiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IG1hdCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF9zaW1wbGVfcm93d2lzZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF9zaW1wbGVfcm93d2lzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3Yzk2YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZV9yb3d3aXNlLmNwcApAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CitpbnQgbWFpbigpCit7CisgIEVpZ2VuOjpNYXRyaXhYZiBtYXQoMiw0KTsKKyAgRWlnZW46OlZlY3RvclhmIHYoNCk7CisgIAorICBtYXQgPDwgMSwgMiwgNiwgOSwKKyAgICAgICAgIDMsIDEsIDcsIDI7CisgICAgICAgICAKKyAgdiA8PCAwLDEsMiwzOworICAgICAgIAorICAvL2FkZCB2IHRvIGVhY2ggcm93IG9mIG0KKyAgbWF0LnJvd3dpc2UoKSArPSB2LnRyYW5zcG9zZSgpOworICAKKyAgc3RkOjpjb3V0IDw8ICJCcm9hZGNhc3RpbmcgcmVzdWx0OiAiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IG1hdCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2NvbHdpc2UuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19jb2x3aXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjY4MjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19jb2x3aXNlLmNwcApAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CitpbnQgbWFpbigpCit7CisgIEVpZ2VuOjpNYXRyaXhYZiBtYXQoMiw0KTsKKyAgbWF0IDw8IDEsIDIsIDYsIDksCisgICAgICAgICAzLCAxLCA3LCAyOworICAKKyAgc3RkOjpjb3V0IDw8ICJDb2x1bW4ncyBtYXhpbXVtOiAiIDw8IHN0ZDo6ZW5kbAorICAgPDwgbWF0LmNvbHdpc2UoKS5tYXhDb2VmZigpIDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfbWF4bm9ybS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX21heG5vcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OWM3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX21heG5vcm0uY3BwCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGYgbWF0KDIsNCk7CisgIG1hdCA8PCAxLCAyLCA2LCA5LAorICAgICAgICAgMywgMSwgNywgMjsKKyAgCisgIE1hdHJpeFhmOjpJbmRleCAgIG1heEluZGV4OworICBmbG9hdCBtYXhOb3JtID0gbWF0LmNvbHdpc2UoKS5zdW0oKS5tYXhDb2VmZigmbWF4SW5kZXgpOworICAKKyAgc3RkOjpjb3V0IDw8ICJNYXhpbXVtIHN1bSBhdCBwb3NpdGlvbiAiIDw8IG1heEluZGV4IDw8IHN0ZDo6ZW5kbDsKKworICBzdGQ6OmNvdXQgPDwgIlRoZSBjb3JyZXNwb25kaW5nIHZlY3RvciBpczogIiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCBtYXQuY29sKCBtYXhJbmRleCApIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJBbmQgaXRzIHN1bSBpcyBpczogIiA8PCBtYXhOb3JtIDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19ib29sLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19ib29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2NhMzdmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX2Jvb2wuY3BwCkBAIC0wLDAgKzEsMjEgQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBBcnJheVhYZiBhKDIsMik7CisgIAorICBhIDw8IDEsMiwKKyAgICAgICAzLDQ7CisKKyAgY291dCA8PCAiKGEgPiAwKS5hbGwoKSAgID0gIiA8PCAoYSA+IDApLmFsbCgpIDw8IGVuZGw7CisgIGNvdXQgPDwgIihhID4gMCkuYW55KCkgICA9ICIgPDwgKGEgPiAwKS5hbnkoKSA8PCBlbmRsOworICBjb3V0IDw8ICIoYSA+IDApLmNvdW50KCkgPSAiIDw8IChhID4gMCkuY291bnQoKSA8PCBlbmRsOworICBjb3V0IDw8IGVuZGw7CisgIGNvdXQgPDwgIihhID4gMikuYWxsKCkgICA9ICIgPDwgKGEgPiAyKS5hbGwoKSA8PCBlbmRsOworICBjb3V0IDw8ICIoYSA+IDIpLmFueSgpICAgPSAiIDw8IChhID4gMikuYW55KCkgPDwgZW5kbDsKKyAgY291dCA8PCAiKGEgPiAyKS5jb3VudCgpID0gIiA8PCAoYSA+IDIpLmNvdW50KCkgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19ub3JtLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19ub3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA0MzlmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX25vcm0uY3BwCkBAIC0wLDAgKzEsMjggQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBWZWN0b3JYZiB2KDIpOworICBNYXRyaXhYZiBtKDIsMiksIG4oMiwyKTsKKyAgCisgIHYgPDwgLTEsCisgICAgICAgMjsKKyAgCisgIG0gPDwgMSwtMiwKKyAgICAgICAtMyw0OworCisgIGNvdXQgPDwgInYuc3F1YXJlZE5vcm0oKSA9ICIgPDwgdi5zcXVhcmVkTm9ybSgpIDw8IGVuZGw7CisgIGNvdXQgPDwgInYubm9ybSgpID0gIiA8PCB2Lm5vcm0oKSA8PCBlbmRsOworICBjb3V0IDw8ICJ2LmxwTm9ybTwxPigpID0gIiA8PCB2LmxwTm9ybTwxPigpIDw8IGVuZGw7CisgIGNvdXQgPDwgInYubHBOb3JtPEluZmluaXR5PigpID0gIiA8PCB2LmxwTm9ybTxJbmZpbml0eT4oKSA8PCBlbmRsOworCisgIGNvdXQgPDwgZW5kbDsKKyAgY291dCA8PCAibS5zcXVhcmVkTm9ybSgpID0gIiA8PCBtLnNxdWFyZWROb3JtKCkgPDwgZW5kbDsKKyAgY291dCA8PCAibS5ub3JtKCkgPSAiIDw8IG0ubm9ybSgpIDw8IGVuZGw7CisgIGNvdXQgPDwgIm0ubHBOb3JtPDE+KCkgPSAiIDw8IG0ubHBOb3JtPDE+KCkgPDwgZW5kbDsKKyAgY291dCA8PCAibS5scE5vcm08SW5maW5pdHk+KCkgPSAiIDw8IG0ubHBOb3JtPEluZmluaXR5PigpIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3Jvd3dpc2UuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yb3d3aXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQyN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yb3d3aXNlLmNwcApAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CitpbnQgbWFpbigpCit7CisgIEVpZ2VuOjpNYXRyaXhYZiBtYXQoMiw0KTsKKyAgbWF0IDw8IDEsIDIsIDYsIDksCisgICAgICAgICAzLCAxLCA3LCAyOworICAKKyAgc3RkOjpjb3V0IDw8ICJSb3cncyBtYXhpbXVtOiAiIDw8IHN0ZDo6ZW5kbAorICAgPDwgbWF0LnJvd3dpc2UoKS5tYXhDb2VmZigpIDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfdmlzaXRvcnMuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ192aXNpdG9ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0ZTlhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfdmlzaXRvcnMuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBFaWdlbjo6TWF0cml4WGYgbSgyLDIpOworICAKKyAgbSA8PCAxLCAyLAorICAgICAgIDMsIDQ7CisKKyAgLy9nZXQgbG9jYXRpb24gb2YgbWF4aW11bQorICBNYXRyaXhYZjo6SW5kZXggbWF4Um93LCBtYXhDb2w7CisgIGZsb2F0IG1heCA9IG0ubWF4Q29lZmYoJm1heFJvdywgJm1heENvbCk7CisKKyAgLy9nZXQgbG9jYXRpb24gb2YgbWluaW11bQorICBNYXRyaXhYZjo6SW5kZXggbWluUm93LCBtaW5Db2w7CisgIGZsb2F0IG1pbiA9IG0ubWluQ29lZmYoJm1pblJvdywgJm1pbkNvbCk7CisKKyAgY291dCA8PCAiTWF4OiAiIDw8IG1heCA8PCAgIiwgYXQ6ICIgPDwKKyAgICAgbWF4Um93IDw8ICIsIiA8PCBtYXhDb2wgPDwgZW5kbDsKKyAgY291dCA8PCAiTWluOiAiIDw8IG1pbiA8PCAiLCBhdDogIiA8PAorICAgICBtaW5Sb3cgPDwgIiwiIDw8IG1pbkNvbCA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX3NpbXBsZV9leGFtcGxlX2R5bmFtaWNfc2l6ZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfc2ltcGxlX2V4YW1wbGVfZHluYW1pY19zaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjAyODBlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX3NpbXBsZV9leGFtcGxlX2R5bmFtaWNfc2l6ZS5jcHAKQEAgLTAsMCArMSwyMiBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBmb3IgKGludCBzaXplPTE7IHNpemU8PTQ7ICsrc2l6ZSkKKyAgeworICAgIE1hdHJpeFhpIG0oc2l6ZSxzaXplKzEpOyAgICAgICAgIC8vIGEgKHNpemUpeChzaXplKzEpLW1hdHJpeCBvZiBpbnQncworICAgIGZvciAoaW50IGo9MDsgajxtLmNvbHMoKTsgKytqKSAgIC8vIGxvb3Agb3ZlciBjb2x1bW5zCisgICAgICBmb3IgKGludCBpPTA7IGk8bS5yb3dzKCk7ICsraSkgLy8gbG9vcCBvdmVyIHJvd3MKKyAgICAgICAgbShpLGopID0gaStqKm0ucm93cygpOyAgICAgICAvLyB0byBhY2Nlc3MgbWF0cml4IGNvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2Ugb3BlcmF0b3IoKShpbnQsaW50KQorICAgIHN0ZDo6Y291dCA8PCBtIDw8ICJcblxuIjsKKyAgfQorCisgIFZlY3RvclhmIHYoNCk7IC8vIGEgdmVjdG9yIG9mIDQgZmxvYXQncworICAvLyB0byBhY2Nlc3MgdmVjdG9yIGNvZWZmaWNpZW50cywgdXNlIGVpdGhlciBvcGVyYXRvciAoKSBvciBvcGVyYXRvciBbXQorICB2WzBdID0gMTsgdlsxXSA9IDI7IHYoMikgPSAzOyB2KDMpID0gNDsKKyAgc3RkOjpjb3V0IDw8ICJcbnY6XG4iIDw8IHYgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX3NpbXBsZV9leGFtcGxlX2ZpeGVkX3NpemUuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX3NpbXBsZV9leGFtcGxlX2ZpeGVkX3NpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGY5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfc2ltcGxlX2V4YW1wbGVfZml4ZWRfc2l6ZS5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBNYXRyaXgzZiBtMzsKKyAgbTMgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOTsKKyAgTWF0cml4NGYgbTQgPSBNYXRyaXg0Zjo6SWRlbnRpdHkoKTsKKyAgVmVjdG9yNGkgdjQoMSwgMiwgMywgNCk7CisKKyAgc3RkOjpjb3V0IDw8ICJtM1xuIiA8PCBtMyA8PCAiXG5tNDpcbiIKKyAgICA8PCBtNCA8PCAiXG52NDpcbiIgPDwgdjQgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NsYXNzX0Jsb2NrLmNwcCBiL2RvYy9leGFtcGxlcy9jbGFzc19CbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlNzE5YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9jbGFzc19CbG9jay5jcHAKQEAgLTAsMCArMSwyNyBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRWlnZW46OkJsb2NrPERlcml2ZWQ+Cit0b3BMZWZ0Q29ybmVyKE1hdHJpeEJhc2U8RGVyaXZlZD4mIG0sIGludCByb3dzLCBpbnQgY29scykKK3sKKyAgcmV0dXJuIEVpZ2VuOjpCbG9jazxEZXJpdmVkPihtLmRlcml2ZWQoKSwgMCwgMCwgcm93cywgY29scyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBFaWdlbjo6QmxvY2s8Y29uc3QgRGVyaXZlZD4KK3RvcExlZnRDb3JuZXIoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSwgaW50IHJvd3MsIGludCBjb2xzKQoreworICByZXR1cm4gRWlnZW46OkJsb2NrPGNvbnN0IERlcml2ZWQ+KG0uZGVyaXZlZCgpLCAwLCAwLCByb3dzLCBjb2xzKTsKK30KKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIE1hdHJpeDRkIG0gPSBNYXRyaXg0ZDo6SWRlbnRpdHkoKTsKKyAgY291dCA8PCB0b3BMZWZ0Q29ybmVyKDQqbSwgMiwgMykgPDwgZW5kbDsgLy8gY2FsbHMgdGhlIGNvbnN0IHZlcnNpb24KKyAgdG9wTGVmdENvcm5lcihtLCAyLCAzKSAqPSA1OyAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5vbi1jb25zdCB2ZXJzaW9uCisgIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2xhc3NfQ3dpc2VCaW5hcnlPcC5jcHAgYi9kb2MvZXhhbXBsZXMvY2xhc3NfQ3dpc2VCaW5hcnlPcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyYWY0NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZUJpbmFyeU9wLmNwcApAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8vIGRlZmluZSBhIGN1c3RvbSB0ZW1wbGF0ZSBiaW5hcnkgZnVuY3RvcgordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgTWFrZUNvbXBsZXhPcCB7CisgIEVJR0VOX0VNUFRZX1NUUlVDVF9DVE9SKE1ha2VDb21wbGV4T3ApCisgIHR5cGVkZWYgY29tcGxleDxTY2FsYXI+IHJlc3VsdF90eXBlOworICBjb21wbGV4PFNjYWxhcj4gb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYikgY29uc3QgeyByZXR1cm4gY29tcGxleDxTY2FsYXI+KGEsYik7IH0KK307CisKK2ludCBtYWluKGludCwgY2hhcioqKQoreworICBNYXRyaXg0ZCBtMSA9IE1hdHJpeDRkOjpSYW5kb20oKSwgbTIgPSBNYXRyaXg0ZDo6UmFuZG9tKCk7CisgIGNvdXQgPDwgbTEuYmluYXJ5RXhwcihtMiwgTWFrZUNvbXBsZXhPcDxkb3VibGU+KCkpIDw8IGVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlVW5hcnlPcC5jcHAgYi9kb2MvZXhhbXBsZXMvY2xhc3NfQ3dpc2VVbmFyeU9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZjYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlVW5hcnlPcC5jcHAKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvLyBkZWZpbmUgYSBjdXN0b20gdGVtcGxhdGUgdW5hcnkgZnVuY3RvcgordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IEN3aXNlQ2xhbXBPcCB7CisgIEN3aXNlQ2xhbXBPcChjb25zdCBTY2FsYXImIGluZiwgY29uc3QgU2NhbGFyJiBzdXApIDogbV9pbmYoaW5mKSwgbV9zdXAoc3VwKSB7fQorICBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIHgpIGNvbnN0IHsgcmV0dXJuIHg8bV9pbmYgPyBtX2luZiA6ICh4Pm1fc3VwID8gbV9zdXAgOiB4KTsgfQorICBTY2FsYXIgbV9pbmYsIG1fc3VwOworfTsKKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIE1hdHJpeDRkIG0xID0gTWF0cml4NGQ6OlJhbmRvbSgpOworICBjb3V0IDw8IG0xIDw8IGVuZGwgPDwgImJlY29tZXM6ICIgPDwgZW5kbCA8PCBtMS51bmFyeUV4cHIoQ3dpc2VDbGFtcE9wPGRvdWJsZT4oLTAuNSwwLjUpKSA8PCBlbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZVVuYXJ5T3BfcHRyZnVuLmNwcCBiL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZVVuYXJ5T3BfcHRyZnVuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjcwNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlVW5hcnlPcF9wdHJmdW4uY3BwCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLy8gZGVmaW5lIGZ1bmN0aW9uIHRvIGJlIGFwcGxpZWQgY29lZmZpY2llbnQtd2lzZQorZG91YmxlIHJhbXAoZG91YmxlIHgpCit7CisgIGlmICh4ID4gMCkKKyAgICByZXR1cm4geDsKKyAgZWxzZSAKKyAgICByZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIE1hdHJpeDRkIG0xID0gTWF0cml4NGQ6OlJhbmRvbSgpOworICBjb3V0IDw8IG0xIDw8IGVuZGwgPDwgImJlY29tZXM6ICIgPDwgZW5kbCA8PCBtMS51bmFyeUV4cHIocHRyX2Z1bihyYW1wKSkgPDwgZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2xhc3NfRml4ZWRCbG9jay5jcHAgYi9kb2MvZXhhbXBsZXMvY2xhc3NfRml4ZWRCbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3OGIzMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9jbGFzc19GaXhlZEJsb2NrLmNwcApAQCAtMCwwICsxLDI3IEBACisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitFaWdlbjo6QmxvY2s8RGVyaXZlZCwgMiwgMj4KK3RvcExlZnQyeDJDb3JuZXIoTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKK3sKKyAgcmV0dXJuIEVpZ2VuOjpCbG9jazxEZXJpdmVkLCAyLCAyPihtLmRlcml2ZWQoKSwgMCwgMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBFaWdlbjo6QmxvY2s8Y29uc3QgRGVyaXZlZCwgMiwgMj4KK3RvcExlZnQyeDJDb3JuZXIoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKK3sKKyAgcmV0dXJuIEVpZ2VuOjpCbG9jazxjb25zdCBEZXJpdmVkLCAyLCAyPihtLmRlcml2ZWQoKSwgMCwgMCk7Cit9CisKK2ludCBtYWluKGludCwgY2hhcioqKQoreworICBNYXRyaXgzZCBtID0gTWF0cml4M2Q6OklkZW50aXR5KCk7CisgIGNvdXQgPDwgdG9wTGVmdDJ4MkNvcm5lcig0Km0pIDw8IGVuZGw7IC8vIGNhbGxzIHRoZSBjb25zdCB2ZXJzaW9uCisgIHRvcExlZnQyeDJDb3JuZXIobSkgKj0gMjsgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBub24tY29uc3QgdmVyc2lvbgorICBjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NsYXNzX0ZpeGVkVmVjdG9yQmxvY2suY3BwIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0ZpeGVkVmVjdG9yQmxvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGM5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvY2xhc3NfRml4ZWRWZWN0b3JCbG9jay5jcHAKQEAgLTAsMCArMSwyNyBAQAorI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8aW9zdHJlYW0+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorRWlnZW46OlZlY3RvckJsb2NrPERlcml2ZWQsIDI+CitmaXJzdFR3byhNYXRyaXhCYXNlPERlcml2ZWQ+JiB2KQoreworICByZXR1cm4gRWlnZW46OlZlY3RvckJsb2NrPERlcml2ZWQsIDI+KHYuZGVyaXZlZCgpLCAwKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IEVpZ2VuOjpWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkLCAyPgorZmlyc3RUd28oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgdikKK3sKKyAgcmV0dXJuIEVpZ2VuOjpWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkLCAyPih2LmRlcml2ZWQoKSwgMCk7Cit9CisKK2ludCBtYWluKGludCwgY2hhcioqKQoreworICBNYXRyaXg8aW50LDEsNj4gdjsgdiA8PCAxLDIsMyw0LDUsNjsKKyAgY291dCA8PCBmaXJzdFR3byg0KnYpIDw8IGVuZGw7IC8vIGNhbGxzIHRoZSBjb25zdCB2ZXJzaW9uCisgIGZpcnN0VHdvKHYpICo9IDI7ICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbm9uLWNvbnN0IHZlcnNpb24KKyAgY291dCA8PCAiTm93IHRoZSB2ZWN0b3IgdiBpczoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jbGFzc19WZWN0b3JCbG9jay5jcHAgYi9kb2MvZXhhbXBsZXMvY2xhc3NfVmVjdG9yQmxvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMjEzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvY2xhc3NfVmVjdG9yQmxvY2suY3BwCkBAIC0wLDAgKzEsMjcgQEAKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPGlvc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK0VpZ2VuOjpWZWN0b3JCbG9jazxEZXJpdmVkPgorc2VnbWVudEZyb21SYW5nZShNYXRyaXhCYXNlPERlcml2ZWQ+JiB2LCBpbnQgc3RhcnQsIGludCBlbmQpCit7CisgIHJldHVybiBFaWdlbjo6VmVjdG9yQmxvY2s8RGVyaXZlZD4odi5kZXJpdmVkKCksIHN0YXJ0LCBlbmQtc3RhcnQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgRWlnZW46OlZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQ+CitzZWdtZW50RnJvbVJhbmdlKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIHYsIGludCBzdGFydCwgaW50IGVuZCkKK3sKKyAgcmV0dXJuIEVpZ2VuOjpWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkPih2LmRlcml2ZWQoKSwgc3RhcnQsIGVuZC1zdGFydCk7Cit9CisKK2ludCBtYWluKGludCwgY2hhcioqKQoreworICBNYXRyaXg8aW50LDEsNj4gdjsgdiA8PCAxLDIsMyw0LDUsNjsKKyAgY291dCA8PCBzZWdtZW50RnJvbVJhbmdlKDIqdiwgMiwgNCkgPDwgZW5kbDsgLy8gY2FsbHMgdGhlIGNvbnN0IHZlcnNpb24KKyAgc2VnbWVudEZyb21SYW5nZSh2LCAxLCAzKSAqPSA1OyAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5vbi1jb25zdCB2ZXJzaW9uCisgIGNvdXQgPDwgIk5vdyB0aGUgdmVjdG9yIHYgaXM6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZnVuY3Rpb25fdGFraW5nX2VpZ2VuYmFzZS5jcHAgYi9kb2MvZXhhbXBsZXMvZnVuY3Rpb25fdGFraW5nX2VpZ2VuYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkOTRiMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9mdW5jdGlvbl90YWtpbmdfZWlnZW5iYXNlLmNwcApAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIHByaW50X3NpemUoY29uc3QgRWlnZW5CYXNlPERlcml2ZWQ+JiBiKQoreworICBzdGQ6OmNvdXQgPDwgInNpemUgKHJvd3MsIGNvbHMpOiAiIDw8IGIuc2l6ZSgpIDw8ICIgKCIgPDwgYi5yb3dzKCkKKyAgICAgICAgICAgIDw8ICIsICIgPDwgYi5jb2xzKCkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKK30KKworaW50IG1haW4oKQoreworICAgIFZlY3RvcjNmIHY7CisgICAgcHJpbnRfc2l6ZSh2KTsKKyAgICAvLyB2LmFzRGlhZ29uYWwoKSByZXR1cm5zIGEgM3gzIGRpYWdvbmFsIG1hdHJpeCBwc2V1ZG8tZXhwcmVzc2lvbgorICAgIHByaW50X3NpemUodi5hc0RpYWdvbmFsKCkpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2FkZF9zdWIuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2FkZF9zdWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NzQ3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfYWRkX3N1Yi5jcHAKQEAgLTAsMCArMSwyMiBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4MmQgYTsKKyAgYSA8PCAxLCAyLAorICAgICAgIDMsIDQ7CisgIE1hdHJpeFhkIGIoMiwyKTsKKyAgYiA8PCAyLCAzLAorICAgICAgIDEsIDQ7CisgIHN0ZDo6Y291dCA8PCAiYSArIGIgPVxuIiA8PCBhICsgYiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiYSAtIGIgPVxuIiA8PCBhIC0gYiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiRG9pbmcgYSArPSBiOyIgPDwgc3RkOjplbmRsOworICBhICs9IGI7CisgIHN0ZDo6Y291dCA8PCAiTm93IGEgPVxuIiA8PCBhIDw8IHN0ZDo6ZW5kbDsKKyAgVmVjdG9yM2QgdigxLDIsMyk7CisgIFZlY3RvcjNkIHcoMSwwLDApOworICBzdGQ6OmNvdXQgPDwgIi12ICsgdyAtIHYgPVxuIiA8PCAtdiArIHcgLSB2IDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19kb3RfY3Jvc3MuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2RvdF9jcm9zcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxYzlhNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19kb3RfY3Jvc3MuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK2ludCBtYWluKCkKK3sKKyAgVmVjdG9yM2QgdigxLDIsMyk7CisgIFZlY3RvcjNkIHcoMCwxLDIpOworCisgIGNvdXQgPDwgIkRvdCBwcm9kdWN0OiAiIDw8IHYuZG90KHcpIDw8IGVuZGw7CisgIGRvdWJsZSBkcCA9IHYuYWRqb2ludCgpKnc7IC8vIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIHRoZSBpbm5lciBwcm9kdWN0IHRvIGEgc2NhbGFyCisgIGNvdXQgPDwgIkRvdCBwcm9kdWN0IHZpYSBhIG1hdHJpeCBwcm9kdWN0OiAiIDw8IGRwIDw8IGVuZGw7CisgIGNvdXQgPDwgIkNyb3NzIHByb2R1Y3Q6XG4iIDw8IHYuY3Jvc3ModykgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19tYXRyaXhfbXVsLmNwcCBiL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19tYXRyaXhfbXVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjEzOTAyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX21hdHJpeF9tdWwuY3BwCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworaW50IG1haW4oKQoreworICBNYXRyaXgyZCBtYXQ7CisgIG1hdCA8PCAxLCAyLAorICAgICAgICAgMywgNDsKKyAgVmVjdG9yMmQgdSgtMSwxKSwgdigyLDApOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgbWF0Km1hdDpcbiIgPDwgbWF0Km1hdCA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyBtYXQqdTpcbiIgPDwgbWF0KnUgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdV5UKm1hdDpcbiIgPDwgdS50cmFuc3Bvc2UoKSptYXQgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdV5UKnY6XG4iIDw8IHUudHJhbnNwb3NlKCkqdiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB1KnZeVDpcbiIgPDwgdSp2LnRyYW5zcG9zZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJMZXQncyBtdWx0aXBseSBtYXQgYnkgaXRzZWxmIiA8PCBzdGQ6OmVuZGw7CisgIG1hdCA9IG1hdCptYXQ7CisgIHN0ZDo6Y291dCA8PCAiTm93IG1hdCBpcyBtYXQ6XG4iIDw8IG1hdCA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfcmVkdXhfYmFzaWMuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX3JlZHV4X2Jhc2ljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMyZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX3JlZHV4X2Jhc2ljLmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CitpbnQgbWFpbigpCit7CisgIEVpZ2VuOjpNYXRyaXgyZCBtYXQ7CisgIG1hdCA8PCAxLCAyLAorICAgICAgICAgMywgNDsKKyAgY291dCA8PCAiSGVyZSBpcyBtYXQuc3VtKCk6ICAgICAgICIgPDwgbWF0LnN1bSgpICAgICAgIDw8IGVuZGw7CisgIGNvdXQgPDwgIkhlcmUgaXMgbWF0LnByb2QoKTogICAgICAiIDw8IG1hdC5wcm9kKCkgICAgICA8PCBlbmRsOworICBjb3V0IDw8ICJIZXJlIGlzIG1hdC5tZWFuKCk6ICAgICAgIiA8PCBtYXQubWVhbigpICAgICAgPDwgZW5kbDsKKyAgY291dCA8PCAiSGVyZSBpcyBtYXQubWluQ29lZmYoKTogICIgPDwgbWF0Lm1pbkNvZWZmKCkgIDw8IGVuZGw7CisgIGNvdXQgPDwgIkhlcmUgaXMgbWF0Lm1heENvZWZmKCk6ICAiIDw8IG1hdC5tYXhDb2VmZigpICA8PCBlbmRsOworICBjb3V0IDw8ICJIZXJlIGlzIG1hdC50cmFjZSgpOiAgICAgIiA8PCBtYXQudHJhY2UoKSAgICAgPDwgZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19zY2FsYXJfbXVsX2Rpdi5jcHAgYi9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfc2NhbGFyX211bF9kaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjY1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfc2NhbGFyX211bF9kaXYuY3BwCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIE1hdHJpeDJkIGE7CisgIGEgPDwgMSwgMiwKKyAgICAgICAzLCA0OworICBWZWN0b3IzZCB2KDEsMiwzKTsKKyAgc3RkOjpjb3V0IDw8ICJhICogMi41ID1cbiIgPDwgYSAqIDIuNSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiMC4xICogdiA9XG4iIDw8IDAuMSAqIHYgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkRvaW5nIHYgKj0gMjsiIDw8IHN0ZDo6ZW5kbDsKKyAgdiAqPSAyOworICBzdGQ6OmNvdXQgPDwgIk5vdyB2ID1cbiIgPDwgdiA8PCBzdGQ6OmVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9jb2VmZmljaWVudF9hY2Nlc3NvcnMuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfY29lZmZpY2llbnRfYWNjZXNzb3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmRhMTcxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfY29lZmZpY2llbnRfYWNjZXNzb3JzLmNwcApAQCAtMCwwICsxLDE4IEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworaW50IG1haW4oKQoreworICBNYXRyaXhYZCBtKDIsMik7CisgIG0oMCwwKSA9IDM7CisgIG0oMSwwKSA9IDIuNTsKKyAgbSgwLDEpID0gLTE7CisgIG0oMSwxKSA9IG0oMSwwKSArIG0oMCwxKTsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbTpcbiIgPDwgbSA8PCBzdGQ6OmVuZGw7CisgIFZlY3RvclhkIHYoMik7CisgIHYoMCkgPSA0OworICB2KDEpID0gdigwKSAtIDE7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIHY6XG4iIDw8IHYgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfcmVzaXplLmNwcCBiL2RvYy9leGFtcGxlcy90dXRfbWF0cml4X3Jlc2l6ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5MmMzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy90dXRfbWF0cml4X3Jlc2l6ZS5jcHAKQEAgLTAsMCArMSwxOCBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGQgbSgyLDUpOworICBtLnJlc2l6ZSg0LDMpOworICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggbSBpcyBvZiBzaXplICIKKyAgICAgICAgICAgIDw8IG0ucm93cygpIDw8ICJ4IiA8PCBtLmNvbHMoKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiSXQgaGFzICIgPDwgbS5zaXplKCkgPDwgIiBjb2VmZmljaWVudHMiIDw8IHN0ZDo6ZW5kbDsKKyAgVmVjdG9yWGQgdigyKTsKKyAgdi5yZXNpemUoNSk7CisgIHN0ZDo6Y291dCA8PCAiVGhlIHZlY3RvciB2IGlzIG9mIHNpemUgIiA8PCB2LnNpemUoKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiQXMgYSBtYXRyaXgsIHYgaXMgb2Ygc2l6ZSAiCisgICAgICAgICAgICA8PCB2LnJvd3MoKSA8PCAieCIgPDwgdi5jb2xzKCkgPDwgc3RkOjplbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfcmVzaXplX2ZpeGVkX3NpemUuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfcmVzaXplX2ZpeGVkX3NpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYmRmYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9yZXNpemVfZml4ZWRfc2l6ZS5jcHAKQEAgLTAsMCArMSwxMiBAQAorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4NGQgbTsKKyAgbS5yZXNpemUoNCw0KTsgLy8gbm8gb3BlcmF0aW9uCisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBtIGlzIG9mIHNpemUgIgorICAgICAgICAgICAgPDwgbS5yb3dzKCkgPDwgIngiIDw8IG0uY29scygpIDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy8ua3JhenkgYi9kb2Mvc25pcHBldHMvLmtyYXp5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjk5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvLmtyYXp5CkBAIC0wLDAgKzEsMiBAQAorRVhDTFVERSBjb3B5cmlnaHQKK0VYQ0xVREUgbGljZW5zZQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0FuZ2xlQXhpc19taW1pY19ldWxlci5jcHAgYi9kb2Mvc25pcHBldHMvQW5nbGVBeGlzX21pbWljX2V1bGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTZkZTdmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0FuZ2xlQXhpc19taW1pY19ldWxlci5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXgzZiBtOworbSA9IEFuZ2xlQXhpc2YoMC4yNSpNX1BJLCBWZWN0b3IzZjo6VW5pdFgoKSkKKyAgKiBBbmdsZUF4aXNmKDAuNSpNX1BJLCAgVmVjdG9yM2Y6OlVuaXRZKCkpCisgICogQW5nbGVBeGlzZigwLjMzKk1fUEksIFZlY3RvcjNmOjpVbml0WigpKTsKK2NvdXQgPDwgbSA8PCBlbmRsIDw8ICJpcyB1bml0YXJ5OiAiIDw8IG0uaXNVbml0YXJ5KCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9DTWFrZUxpc3RzLnR4dCBiL2RvYy9zbmlwcGV0cy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmEyMmVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzAgQEAKK2ZpbGUoR0xPQiBzbmlwcGV0c19TUkNTICIqLmNwcCIpCisKK2FkZF9jdXN0b21fdGFyZ2V0KGFsbF9zbmlwcGV0cykKKworZm9yZWFjaChzbmlwcGV0X3NyYyAke3NuaXBwZXRzX1NSQ1N9KQorICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KHNuaXBwZXQgJHtzbmlwcGV0X3NyY30gTkFNRV9XRSkKKyAgc2V0KGNvbXBpbGVfc25pcHBldF90YXJnZXQgY29tcGlsZV8ke3NuaXBwZXR9KQorICBzZXQoY29tcGlsZV9zbmlwcGV0X3NyYyAke2NvbXBpbGVfc25pcHBldF90YXJnZXR9LmNwcCkKKyAgZmlsZShSRUFEICR7c25pcHBldF9zcmN9IHNuaXBwZXRfc291cmNlX2NvZGUpCisgIGNvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb21waWxlX3NuaXBwZXQuY3BwLmluCisgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke2NvbXBpbGVfc25pcHBldF9zcmN9KQorICBhZGRfZXhlY3V0YWJsZSgke2NvbXBpbGVfc25pcHBldF90YXJnZXR9CisgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke2NvbXBpbGVfc25pcHBldF9zcmN9KQorICBpZihFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UTykKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtjb21waWxlX3NuaXBwZXRfdGFyZ2V0fSAke0VJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPfSkKKyAgZW5kaWYoKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KGNvbXBpbGVfc25pcHBldF9leGVjdXRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgJHtjb21waWxlX3NuaXBwZXRfdGFyZ2V0fSBMT0NBVElPTikKKyAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIFRBUkdFVCAke2NvbXBpbGVfc25pcHBldF90YXJnZXR9CisgICAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtjb21waWxlX3NuaXBwZXRfZXhlY3V0YWJsZX0KKyAgICBBUkdTID4ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtzbmlwcGV0fS5vdXQKKyAgKQorICBhZGRfZGVwZW5kZW5jaWVzKGFsbF9zbmlwcGV0cyAke2NvbXBpbGVfc25pcHBldF90YXJnZXR9KQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7Y29tcGlsZV9zbmlwcGV0X3NyY30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRJRVMgT0JKRUNUX0RFUEVORFMgJHtzbmlwcGV0X3NyY30pCitlbmRmb3JlYWNoKHNuaXBwZXRfc3JjKQorCitlaV9hZGRfdGFyZ2V0X3Byb3BlcnR5KGNvbXBpbGVfdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2FsaWFzaW5nIENPTVBJTEVfRkxBR1MgLURFSUdFTl9OT19ERUJVRykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ29sUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAgYi9kb2Mvc25pcHBldHMvQ29sUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiMjA0YQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Db2xQaXZIb3VzZWhvbGRlclFSX3NvbHZlLmNwcApAQCAtMCwwICsxLDggQEAKK01hdHJpeDNmIG0gPSBNYXRyaXgzZjo6UmFuZG9tKCk7CitNYXRyaXgzZiB5ID0gTWF0cml4M2Y6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCB5OiIgPDwgZW5kbCA8PCB5IDw8IGVuZGw7CitNYXRyaXgzZiB4OworeCA9IG0uY29sUGl2SG91c2Vob2xkZXJRcigpLnNvbHZlKHkpOworYXNzZXJ0KHkuaXNBcHByb3gobSp4KSk7Citjb3V0IDw8ICJIZXJlIGlzIGEgc29sdXRpb24geCB0byB0aGUgZXF1YXRpb24gbXg9eToiIDw8IGVuZGwgPDwgeCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0NvbXBsZXhFaWdlblNvbHZlcl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfY29tcHV0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkNmJkMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfY29tcHV0ZS5jcHAKQEAgLTAsMCArMSwxNiBAQAorTWF0cml4WGNmIEEgPSBNYXRyaXhYY2Y6OlJhbmRvbSg0LDQpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSA0eDQgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKKworQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFhjZj4gY2VzOworY2VzLmNvbXB1dGUoQSk7Citjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQSBhcmU6IiA8PCBlbmRsIDw8IGNlcy5laWdlbnZhbHVlcygpIDw8IGVuZGw7Citjb3V0IDw8ICJUaGUgbWF0cml4IG9mIGVpZ2VudmVjdG9ycywgViwgaXM6IiA8PCBlbmRsIDw8IGNlcy5laWdlbnZlY3RvcnMoKSA8PCBlbmRsIDw8IGVuZGw7CisKK2NvbXBsZXg8ZmxvYXQ+IGxhbWJkYSA9IGNlcy5laWdlbnZhbHVlcygpWzBdOworY291dCA8PCAiQ29uc2lkZXIgdGhlIGZpcnN0IGVpZ2VudmFsdWUsIGxhbWJkYSA9ICIgPDwgbGFtYmRhIDw8IGVuZGw7CitWZWN0b3JYY2YgdiA9IGNlcy5laWdlbnZlY3RvcnMoKS5jb2woMCk7Citjb3V0IDw8ICJJZiB2IGlzIHRoZSBjb3JyZXNwb25kaW5nIGVpZ2VudmVjdG9yLCB0aGVuIGxhbWJkYSAqIHYgPSAiIDw8IGVuZGwgPDwgbGFtYmRhICogdiA8PCBlbmRsOworY291dCA8PCAiLi4uIGFuZCBBICogdiA9ICIgPDwgZW5kbCA8PCBBICogdiA8PCBlbmRsIDw8IGVuZGw7CisKK2NvdXQgPDwgIkZpbmFsbHksIFYgKiBEICogVl4oLTEpID0gIiA8PCBlbmRsCisgICAgIDw8IGNlcy5laWdlbnZlY3RvcnMoKSAqIGNlcy5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSAqIGNlcy5laWdlbnZlY3RvcnMoKS5pbnZlcnNlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwIGIvZG9jL3NuaXBwZXRzL0NvbXBsZXhFaWdlblNvbHZlcl9laWdlbnZhbHVlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwOWJkOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGNmIG9uZXMgPSBNYXRyaXhYY2Y6Ok9uZXMoMywzKTsKK0NvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhYY2Y+IGNlcyhvbmVzLCAvKiBjb21wdXRlRWlnZW52ZWN0b3JzID0gKi8gZmFsc2UpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgYXJlOiIgCisgICAgIDw8IGVuZGwgPDwgY2VzLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcCBiL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFjMmNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0NvbXBsZXhFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGNmIG9uZXMgPSBNYXRyaXhYY2Y6Ok9uZXMoMywzKTsKK0NvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhYY2Y+IGNlcyhvbmVzKTsKK2NvdXQgPDwgIlRoZSBmaXJzdCBlaWdlbnZlY3RvciBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGlzOiIgCisgICAgIDw8IGVuZGwgPDwgY2VzLmVpZ2VudmVjdG9ycygpLmNvbCgxKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0NvbXBsZXhTY2h1cl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfY29tcHV0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1MTcwMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfY29tcHV0ZS5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXhYY2YgQSA9IE1hdHJpeFhjZjo6UmFuZG9tKDQsNCk7CitDb21wbGV4U2NodXI8TWF0cml4WGNmPiBzY2h1cig0KTsKK3NjaHVyLmNvbXB1dGUoQSk7Citjb3V0IDw8ICJUaGUgbWF0cml4IFQgaW4gdGhlIGRlY29tcG9zaXRpb24gb2YgQSBpczoiIDw8IGVuZGwgPDwgc2NodXIubWF0cml4VCgpIDw8IGVuZGw7CitzY2h1ci5jb21wdXRlKEEuaW52ZXJzZSgpKTsKK2NvdXQgPDwgIlRoZSBtYXRyaXggVCBpbiB0aGUgZGVjb21wb3NpdGlvbiBvZiBBXigtMSkgaXM6IiA8PCBlbmRsIDw8IHNjaHVyLm1hdHJpeFQoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0NvbXBsZXhTY2h1cl9tYXRyaXhULmNwcCBiL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfbWF0cml4VC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4MDU3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfbWF0cml4VC5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYY2YgQSA9IE1hdHJpeFhjZjo6UmFuZG9tKDQsNCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDR4NCBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOworQ29tcGxleFNjaHVyPE1hdHJpeFhjZj4gc2NodXJPZkEoQSwgZmFsc2UpOyAvLyBmYWxzZSBtZWFucyBkbyBub3QgY29tcHV0ZSBVCitjb3V0IDw8ICJUaGUgdHJpYW5ndWxhciBtYXRyaXggVCBpczoiIDw8IGVuZGwgPDwgc2NodXJPZkEubWF0cml4VCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ29tcGxleFNjaHVyX21hdHJpeFUuY3BwIGIvZG9jL3NuaXBwZXRzL0NvbXBsZXhTY2h1cl9tYXRyaXhVLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTNkOWMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0NvbXBsZXhTY2h1cl9tYXRyaXhVLmNwcApAQCAtMCwwICsxLDQgQEAKK01hdHJpeFhjZiBBID0gTWF0cml4WGNmOjpSYW5kb20oNCw0KTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gNHg0IG1hdHJpeCwgQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CitDb21wbGV4U2NodXI8TWF0cml4WGNmPiBzY2h1ck9mQShBKTsKK2NvdXQgPDwgIlRoZSB1bml0YXJ5IG1hdHJpeCBVIGlzOiIgPDwgZW5kbCA8PCBzY2h1ck9mQS5tYXRyaXhVKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9hYnMuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2Ficy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlZWMzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hYnMuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDEsLTIsLTMpOworY291dCA8PCB2LmFicygpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYWJzMi5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYWJzMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0ZjliMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hYnMyLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLC0yLC0zKTsKK2NvdXQgPDwgdi5hYnMyKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9hY29zLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hY29zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQzMmNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2Fjb3MuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDAsIHNxcnQoMi4pLzIsIDEpOworY291dCA8PCB2LmFjb3MoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Jvb2xlYW5fYW5kLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX2FuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2YjYwZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX2FuZC5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoLTEsMiwxKSwgdygtMywyLDMpOworY291dCA8PCAoKHY8dykgJiYgKHY8MCkpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYm9vbGVhbl9vci5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYm9vbGVhbl9vci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlYjAwNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX29yLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigtMSwyLDEpLCB3KC0zLDIsMyk7Citjb3V0IDw8ICgodjx3KSB8fCAodjwwKSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9jb3MuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2Nvcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4OWYwNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9jb3MuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KE1fUEksIE1fUEkvMiwgTV9QSS8zKTsKK2NvdXQgPDwgdi5jb3MoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2N1YmUuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2N1YmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTQxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfY3ViZS5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMiwzLDQpOworY291dCA8PCB2LmN1YmUoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2VxdWFsX2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9lcXVhbF9lcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhOTZmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9lcXVhbF9lcXVhbC5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMSwyLDMpLCB3KDMsMiwxKTsKK2NvdXQgPDwgKHY9PXcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfZXhwLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9leHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjM2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfZXhwLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLDIsMyk7Citjb3V0IDw8IHYuZXhwKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9ncmVhdGVyLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ncmVhdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGFkMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2dyZWF0ZXIuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDEsMiwzKSwgdygzLDIsMSk7Citjb3V0IDw8ICh2PncpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfZ3JlYXRlcl9lcXVhbC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfZ3JlYXRlcl9lcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwOGY4OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ncmVhdGVyX2VxdWFsLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLDIsMyksIHcoMywyLDEpOworY291dCA8PCAodj49dykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9pbnZlcnNlLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pbnZlcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTY3YTdlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2ludmVyc2UuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDIsMyw0KTsKK2NvdXQgPDwgdi5pbnZlcnNlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9sZXNzLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9sZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWZkM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2xlc3MuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDEsMiwzKSwgdygzLDIsMSk7Citjb3V0IDw8ICh2PHcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfbGVzc19lcXVhbC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbGVzc19lcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwMGUzOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9sZXNzX2VxdWFsLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLDIsMyksIHcoMywyLDEpOworY291dCA8PCAodjw9dykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9sb2cuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2xvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhY2E3MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9sb2cuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDEsMiwzKTsKK2NvdXQgPDwgdi5sb2coKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX21heC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbWF4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjAyODgxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX21heC5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoMiwzLDQpLCB3KDQsMiwzKTsKK2NvdXQgPDwgdi5tYXgodykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW4uY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX21pbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwMWM3NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW4uY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDIsMyw0KSwgdyg0LDIsMyk7Citjb3V0IDw8IHYubWluKHcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfbWludXMuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX21pbnVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODliOWZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX21pbnVzLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLDIsMyk7Citjb3V0IDw8IHYtNSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX21pbnVzX2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW51c19lcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkZTQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW51c19lcXVhbC5jcHAKQEAgLTAsMCArMSwzIEBACitBcnJheTNkIHYoMSwyLDMpOwordiAtPSA1OworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfbm90X2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ub3RfZXF1YWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTQwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfbm90X2VxdWFsLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLDIsMyksIHcoMywyLDEpOworY291dCA8PCAodiE9dykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9wbHVzLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9wbHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDQ3MzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3BsdXMuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDEsMiwzKTsKK2NvdXQgPDwgdis1IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfcGx1c19lcXVhbC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcGx1c19lcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc0NGIxZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9wbHVzX2VxdWFsLmNwcApAQCAtMCwwICsxLDMgQEAKK0FycmF5M2QgdigxLDIsMyk7Cit2ICs9IDU7Citjb3V0IDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9wb3cuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Bvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyM2VkOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9wb3cuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDgsMjcsNjQpOworY291dCA8PCB2LnBvdygwLjMzMzMzMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9wcm9kdWN0LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9wcm9kdWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTRkNjZkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Byb2R1Y3QuY3BwCkBAIC0wLDAgKzEsNCBAQAorQXJyYXkzM2kgYSA9IEFycmF5MzNpOjpSYW5kb20oKSwgYiA9IEFycmF5MzNpOjpSYW5kb20oKTsKK0FycmF5MzNpIGMgPSBhICogYjsKK2NvdXQgPDwgImE6XG4iIDw8IGEgPDwgIlxuYjpcbiIgPDwgYiA8PCAiXG5jOlxuIiA8PCBjIDw8IGVuZGw7CisKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9xdW90aWVudC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcXVvdGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYjlmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcXVvdGllbnQuY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KDIsMyw0KSwgdyg0LDIsMyk7Citjb3V0IDw8IHYvdyA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3Npbi5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmZhOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Npbi5jcHAKQEAgLTAsMCArMSwyIEBACitBcnJheTNkIHYoTV9QSSwgTV9QSS8yLCBNX1BJLzMpOworY291dCA8PCB2LnNpbigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc2xhc2hfZXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NsYXNoX2VxdWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWZkMzJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NsYXNoX2VxdWFsLmNwcApAQCAtMCwwICsxLDMgQEAKK0FycmF5M2QgdigzLDIsNCksIHcoNSw0LDIpOwordiAvPSB3OworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc3FydC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc3FydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiYWZlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zcXJ0LmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigxLDIsNCk7Citjb3V0IDw8IHYuc3FydCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc3F1YXJlLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zcXVhcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDRjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc3F1YXJlLmNwcApAQCAtMCwwICsxLDIgQEAKK0FycmF5M2QgdigyLDMsNCk7Citjb3V0IDw8IHYuc3F1YXJlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV90YW4uY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Rhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1OGVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV90YW4uY3BwCkBAIC0wLDAgKzEsMiBAQAorQXJyYXkzZCB2KE1fUEksIE1fUEkvMiwgTV9QSS8zKTsKK2NvdXQgPDwgdi50YW4oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3RpbWVzX2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV90aW1lc19lcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NTU2YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV90aW1lc19lcXVhbC5jcHAKQEAgLTAsMCArMSwzIEBACitBcnJheTNkIHYoMSwyLDMpLCB3KDIsMywwKTsKK3YgKj0gdzsKK2NvdXQgPDwgdiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9MaW5TcGFjZWQuY3BwIGIvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9MaW5TcGFjZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNTRiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZC5jcHAKQEAgLTAsMCArMSwyIEBACitjb3V0IDw8IFZlY3RvclhpOjpMaW5TcGFjZWQoNCw3LDEwKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYZDo6TGluU3BhY2VkKDUsMC4wLDEuMCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9EZW5zZUJhc2VfTGluU3BhY2VkX3NlcS5jcHAgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZF9zZXEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NWM1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZF9zZXEuY3BwCkBAIC0wLDAgKzEsMiBAQAorY291dCA8PCBWZWN0b3JYaTo6TGluU3BhY2VkKFNlcXVlbnRpYWwsNCw3LDEwKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYZDo6TGluU3BhY2VkKFNlcXVlbnRpYWwsNSwwLjAsMS4wKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9zZXRMaW5TcGFjZWQuY3BwIGIvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9zZXRMaW5TcGFjZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODcxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX3NldExpblNwYWNlZC5jcHAKQEAgLTAsMCArMSwzIEBACitWZWN0b3JYZiB2Owordi5zZXRMaW5TcGFjZWQoNSwwLjVmLDEuNWYpLnRyYW5zcG9zZSgpOworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRGlyZWN0aW9uV2lzZV9yZXBsaWNhdGUuY3BwIGIvZG9jL3NuaXBwZXRzL0RpcmVjdGlvbldpc2VfcmVwbGljYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJkNGEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0RpcmVjdGlvbldpc2VfcmVwbGljYXRlLmNwcApAQCAtMCwwICsxLDQgQEAKK01hdHJpeFhpIG0gPSBNYXRyaXhYaTo6UmFuZG9tKDIsMyk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAibS5jb2x3aXNlKCkucmVwbGljYXRlPDM+KCkgPSAuLi4iIDw8IGVuZGw7Citjb3V0IDw8IG0uY29sd2lzZSgpLnJlcGxpY2F0ZTwzPigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRGlyZWN0aW9uV2lzZV9yZXBsaWNhdGVfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9EaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZV9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjFiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRGlyZWN0aW9uV2lzZV9yZXBsaWNhdGVfaW50LmNwcApAQCAtMCwwICsxLDQgQEAKK1ZlY3RvcjNpIHYgPSBWZWN0b3IzaTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAidi5yb3d3aXNlKCkucmVwbGljYXRlKDUpID0gLi4uIiA8PCBlbmRsOworY291dCA8PCB2LnJvd3dpc2UoKS5yZXBsaWNhdGUoNSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9FaWdlblNvbHZlcl9NYXRyaXhUeXBlLmNwcCBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9FaWdlblNvbHZlcl9NYXRyaXhUeXBlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQ5ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX0VpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwCkBAIC0wLDAgKzEsMTYgQEAKK01hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsNik7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDZ4NiBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOworCitFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMoQSk7Citjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQSBhcmU6IiA8PCBlbmRsIDw8IGVzLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSBtYXRyaXggb2YgZWlnZW52ZWN0b3JzLCBWLCBpczoiIDw8IGVuZGwgPDwgZXMuZWlnZW52ZWN0b3JzKCkgPDwgZW5kbCA8PCBlbmRsOworCitjb21wbGV4PGRvdWJsZT4gbGFtYmRhID0gZXMuZWlnZW52YWx1ZXMoKVswXTsKK2NvdXQgPDwgIkNvbnNpZGVyIHRoZSBmaXJzdCBlaWdlbnZhbHVlLCBsYW1iZGEgPSAiIDw8IGxhbWJkYSA8PCBlbmRsOworVmVjdG9yWGNkIHYgPSBlcy5laWdlbnZlY3RvcnMoKS5jb2woMCk7Citjb3V0IDw8ICJJZiB2IGlzIHRoZSBjb3JyZXNwb25kaW5nIGVpZ2VudmVjdG9yLCB0aGVuIGxhbWJkYSAqIHYgPSAiIDw8IGVuZGwgPDwgbGFtYmRhICogdiA8PCBlbmRsOworY291dCA8PCAiLi4uIGFuZCBBICogdiA9ICIgPDwgZW5kbCA8PCBBLmNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKSAqIHYgPDwgZW5kbCA8PCBlbmRsOworCitNYXRyaXhYY2QgRCA9IGVzLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpOworTWF0cml4WGNkIFYgPSBlcy5laWdlbnZlY3RvcnMoKTsKK2NvdXQgPDwgIkZpbmFsbHksIFYgKiBEICogVl4oLTEpID0gIiA8PCBlbmRsIDw8IFYgKiBEICogVi5pbnZlcnNlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9jb21wdXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWM5NmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2NvbXB1dGUuY3BwCkBAIC0wLDAgKzEsNiBAQAorRWlnZW5Tb2x2ZXI8TWF0cml4WGY+IGVzOworTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKK2VzLmNvbXB1dGUoQSwgLyogY29tcHV0ZUVpZ2VudmVjdG9ycyA9ICovIGZhbHNlKTsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiBBIGFyZTogIiA8PCBlcy5laWdlbnZhbHVlcygpLnRyYW5zcG9zZSgpIDw8IGVuZGw7Citlcy5jb21wdXRlKEEgKyBNYXRyaXhYZjo6SWRlbnRpdHkoNCw0KSwgZmFsc2UpOyAvLyByZS11c2UgZXMgdG8gY29tcHV0ZSBlaWdlbnZhbHVlcyBvZiBBK0kKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiBBK0kgYXJlOiAiIDw8IGVzLmVpZ2VudmFsdWVzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9laWdlbnZhbHVlcy5jcHAgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjg4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7CitFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMob25lcywgZmFsc2UpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgYXJlOiIgCisgICAgIDw8IGVuZGwgPDwgZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmFkNGRhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywzKTsKK0VpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhvbmVzKTsKK2NvdXQgPDwgIlRoZSBmaXJzdCBlaWdlbnZlY3RvciBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGlzOiIgCisgICAgIDw8IGVuZGwgPDwgZXMuZWlnZW52ZWN0b3JzKCkuY29sKDEpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfcHNldWRvRWlnZW52ZWN0b3JzLmNwcCBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9wc2V1ZG9FaWdlbnZlY3RvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTI1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfcHNldWRvRWlnZW52ZWN0b3JzLmNwcApAQCAtMCwwICsxLDkgQEAKK01hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsNik7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDZ4NiBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOworCitFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMoQSk7CitNYXRyaXhYZCBEID0gZXMucHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpOworTWF0cml4WGQgViA9IGVzLnBzZXVkb0VpZ2VudmVjdG9ycygpOworY291dCA8PCAiVGhlIHBzZXVkby1laWdlbnZhbHVlIG1hdHJpeCBEIGlzOiIgPDwgZW5kbCA8PCBEIDw8IGVuZGw7Citjb3V0IDw8ICJUaGUgcHNldWRvLWVpZ2VudmVjdG9yIG1hdHJpeCBWIGlzOiIgPDwgZW5kbCA8PCBWIDw8IGVuZGw7Citjb3V0IDw8ICJGaW5hbGx5LCBWICogRCAqIFZeKC0xKSA9ICIgPDwgZW5kbCA8PCBWICogRCAqIFYuaW52ZXJzZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRnVsbFBpdkhvdXNlaG9sZGVyUVJfc29sdmUuY3BwIGIvZG9jL3NuaXBwZXRzL0Z1bGxQaXZIb3VzZWhvbGRlclFSX3NvbHZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2JjMDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0Z1bGxQaXZIb3VzZWhvbGRlclFSX3NvbHZlLmNwcApAQCAtMCwwICsxLDggQEAKK01hdHJpeDNmIG0gPSBNYXRyaXgzZjo6UmFuZG9tKCk7CitNYXRyaXgzZiB5ID0gTWF0cml4M2Y6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCB5OiIgPDwgZW5kbCA8PCB5IDw8IGVuZGw7CitNYXRyaXgzZiB4OworeCA9IG0uZnVsbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZSh5KTsKK2Fzc2VydCh5LmlzQXBwcm94KG0qeCkpOworY291dCA8PCAiSGVyZSBpcyBhIHNvbHV0aW9uIHggdG8gdGhlIGVxdWF0aW9uIG14PXk6IiA8PCBlbmRsIDw8IHggPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9GdWxsUGl2TFVfaW1hZ2UuY3BwIGIvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9pbWFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3YmMxZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9GdWxsUGl2TFVfaW1hZ2UuY3BwCkBAIC0wLDAgKzEsOSBAQAorTWF0cml4M2QgbTsKK20gPDwgMSwxLDAsCisgICAgIDEsMywyLAorICAgICAwLDEsMTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJOb3RpY2UgdGhhdCB0aGUgbWlkZGxlIGNvbHVtbiBpcyB0aGUgc3VtIG9mIHRoZSB0d28gb3RoZXJzLCBzbyB0aGUgIgorICAgICA8PCAiY29sdW1ucyBhcmUgbGluZWFybHkgZGVwZW5kZW50LiIgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgYSBtYXRyaXggd2hvc2UgY29sdW1ucyBoYXZlIHRoZSBzYW1lIHNwYW4gYnV0IGFyZSBsaW5lYXJseSBpbmRlcGVuZGVudDoiCisgICAgIDw8IGVuZGwgPDwgbS5mdWxsUGl2THUoKS5pbWFnZShtKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9rZXJuZWwuY3BwIGIvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9rZXJuZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODZlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX2tlcm5lbC5jcHAKQEAgLTAsMCArMSw3IEBACitNYXRyaXhYZiBtID0gTWF0cml4WGY6OlJhbmRvbSgzLDUpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK01hdHJpeFhmIGtlciA9IG0uZnVsbFBpdkx1KCkua2VybmVsKCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgbWF0cml4IHdob3NlIGNvbHVtbnMgZm9ybSBhIGJhc2lzIG9mIHRoZSBrZXJuZWwgb2YgbToiCisgICAgIDw8IGVuZGwgPDwga2VyIDw8IGVuZGw7Citjb3V0IDw8ICJCeSBkZWZpbml0aW9uIG9mIHRoZSBrZXJuZWwsIG0qa2VyIGlzIHplcm86IgorICAgICA8PCBlbmRsIDw8IG0qa2VyIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX3NvbHZlLmNwcCBiL2RvYy9zbmlwcGV0cy9GdWxsUGl2TFVfc29sdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjg4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX3NvbHZlLmNwcApAQCAtMCwwICsxLDExIEBACitNYXRyaXg8ZmxvYXQsMiwzPiBtID0gTWF0cml4PGZsb2F0LDIsMz46OlJhbmRvbSgpOworTWF0cml4MmYgeSA9IE1hdHJpeDJmOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggeToiIDw8IGVuZGwgPDwgeSA8PCBlbmRsOworTWF0cml4PGZsb2F0LDMsMj4geCA9IG0uZnVsbFBpdkx1KCkuc29sdmUoeSk7CitpZigobSp4KS5pc0FwcHJveCh5KSkKK3sKKyAgY291dCA8PCAiSGVyZSBpcyBhIHNvbHV0aW9uIHggdG8gdGhlIGVxdWF0aW9uIG14PXk6IiA8PCBlbmRsIDw8IHggPDwgZW5kbDsKK30KK2Vsc2UKKyAgY291dCA8PCAiVGhlIGVxdWF0aW9uIG14PXkgZG9lcyBub3QgaGF2ZSBhbnkgc29sdXRpb24uIiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX2NvbXB1dGUuY3BwIGIvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX2NvbXB1dGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTM3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fY29tcHV0ZS5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXhYY2YgQSA9IE1hdHJpeFhjZjo6UmFuZG9tKDQsNCk7CitIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhYY2Y+IGhkKDQpOworaGQuY29tcHV0ZShBKTsKK2NvdXQgPDwgIlRoZSBtYXRyaXggSCBpbiB0aGUgZGVjb21wb3NpdGlvbiBvZiBBIGlzOiIgPDwgZW5kbCA8PCBoZC5tYXRyaXhIKCkgPDwgZW5kbDsKK2hkLmNvbXB1dGUoMipBKTsgLy8gcmUtdXNlIGhkIHRvIGNvbXB1dGUgYW5kIHN0b3JlIGRlY29tcG9zaXRpb24gb2YgMkEKK2NvdXQgPDwgIlRoZSBtYXRyaXggSCBpbiB0aGUgZGVjb21wb3NpdGlvbiBvZiAyQSBpczoiIDw8IGVuZGwgPDwgaGQubWF0cml4SCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fbWF0cml4SC5jcHAgYi9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fbWF0cml4SC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwMTM2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbl9tYXRyaXhILmNwcApAQCAtMCwwICsxLDggQEAKK01hdHJpeDRmIEEgPSBNYXRyaXhYZjo6UmFuZG9tKDQsNCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDR4NCBtYXRyaXg6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFhmPiBoZXNzT2ZBKEEpOworTWF0cml4WGYgSCA9IGhlc3NPZkEubWF0cml4SCgpOworY291dCA8PCAiVGhlIEhlc3NlbmJlcmcgbWF0cml4IEggaXM6IiA8PCBlbmRsIDw8IEggPDwgZW5kbDsKK01hdHJpeFhmIFEgPSBoZXNzT2ZBLm1hdHJpeFEoKTsKK2NvdXQgPDwgIlRoZSBvcnRob2dvbmFsIG1hdHJpeCBRIGlzOiIgPDwgZW5kbCA8PCBRIDw8IGVuZGw7Citjb3V0IDw8ICJRIEggUV5UIGlzOiIgPDwgZW5kbCA8PCBRICogSCAqIFEudHJhbnNwb3NlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbl9wYWNrZWRNYXRyaXguY3BwIGIvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX3BhY2tlZE1hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhNTk1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbl9wYWNrZWRNYXRyaXguY3BwCkBAIC0wLDAgKzEsOSBAQAorTWF0cml4NGQgQSA9IE1hdHJpeDRkOjpSYW5kb20oNCw0KTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gNHg0IG1hdHJpeDoiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOworSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248TWF0cml4NGQ+IGhlc3NPZkEoQSk7CitNYXRyaXg0ZCBwbSA9IGhlc3NPZkEucGFja2VkTWF0cml4KCk7Citjb3V0IDw8ICJUaGUgcGFja2VkIG1hdHJpeCBNIGlzOiIgPDwgZW5kbCA8PCBwbSA8PCBlbmRsOworY291dCA8PCAiVGhlIHVwcGVyIEhlc3NlbmJlcmcgcGFydCBjb3JyZXNwb25kcyB0byB0aGUgbWF0cml4IEgsIHdoaWNoIGlzOiIgCisgICAgIDw8IGVuZGwgPDwgaGVzc09mQS5tYXRyaXhIKCkgPDwgZW5kbDsKK1ZlY3RvcjNkIGhjID0gaGVzc09mQS5ob3VzZWhvbGRlckNvZWZmaWNpZW50cygpOworY291dCA8PCAiVGhlIHZlY3RvciBvZiBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMgaXM6IiA8PCBlbmRsIDw8IGhjIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAgYi9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjZTZjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclFSX3NvbHZlLmNwcApAQCAtMCwwICsxLDkgQEAKK3R5cGVkZWYgTWF0cml4PGZsb2F0LDMsMz4gTWF0cml4M3gzOworTWF0cml4M3gzIG0gPSBNYXRyaXgzeDM6OlJhbmRvbSgpOworTWF0cml4M2YgeSA9IE1hdHJpeDNmOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggeToiIDw8IGVuZGwgPDwgeSA8PCBlbmRsOworTWF0cml4M2YgeDsKK3ggPSBtLmhvdXNlaG9sZGVyUXIoKS5zb2x2ZSh5KTsKK2Fzc2VydCh5LmlzQXBwcm94KG0qeCkpOworY291dCA8PCAiSGVyZSBpcyBhIHNvbHV0aW9uIHggdG8gdGhlIGVxdWF0aW9uIG14PXk6IiA8PCBlbmRsIDw8IHggPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclNlcXVlbmNlX0hvdXNlaG9sZGVyU2VxdWVuY2UuY3BwIGIvZG9jL3NuaXBwZXRzL0hvdXNlaG9sZGVyU2VxdWVuY2VfSG91c2Vob2xkZXJTZXF1ZW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzMmI4MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclNlcXVlbmNlX0hvdXNlaG9sZGVyU2VxdWVuY2UuY3BwCkBAIC0wLDAgKzEsMzEgQEAKK01hdHJpeDNkIHYgPSBNYXRyaXgzZDo6UmFuZG9tKCk7Citjb3V0IDw8ICJUaGUgbWF0cml4IHYgaXM6IiA8PCBlbmRsOworY291dCA8PCB2IDw8IGVuZGw7CisKK1ZlY3RvcjNkIHYwKDEsIHYoMSwwKSwgdigyLDApKTsKK2NvdXQgPDwgIlRoZSBmaXJzdCBIb3VzZWhvbGRlciB2ZWN0b3IgaXM6IHZfMCA9ICIgPDwgdjAudHJhbnNwb3NlKCkgPDwgZW5kbDsKK1ZlY3RvcjNkIHYxKDAsIDEsIHYoMiwxKSk7Citjb3V0IDw8ICJUaGUgc2Vjb25kIEhvdXNlaG9sZGVyIHZlY3RvciBpczogdl8xID0gIiA8PCB2MS50cmFuc3Bvc2UoKSAgPDwgZW5kbDsKK1ZlY3RvcjNkIHYyKDAsIDAsIDEpOworY291dCA8PCAiVGhlIHRoaXJkIEhvdXNlaG9sZGVyIHZlY3RvciBpczogdl8yID0gIiA8PCB2Mi50cmFuc3Bvc2UoKSA8PCBlbmRsOworCitWZWN0b3IzZCBoID0gVmVjdG9yM2Q6OlJhbmRvbSgpOworY291dCA8PCAiVGhlIEhvdXNlaG9sZGVyIGNvZWZmaWNpZW50cyBhcmU6IGggPSAiIDw8IGgudHJhbnNwb3NlKCkgPDwgZW5kbDsKKworTWF0cml4M2QgSDAgPSBNYXRyaXgzZDo6SWRlbnRpdHkoKSAtIGgoMCkgKiB2MCAqIHYwLmFkam9pbnQoKTsKK2NvdXQgPDwgIlRoZSBmaXJzdCBIb3VzZWhvbGRlciByZWZsZWN0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IEhfMCA9ICIgPDwgZW5kbDsKK2NvdXQgPDwgSDAgPDwgZW5kbDsKK01hdHJpeDNkIEgxID0gTWF0cml4M2Q6OklkZW50aXR5KCkgLSBoKDEpICogdjEgKiB2MS5hZGpvaW50KCk7Citjb3V0IDw8ICJUaGUgc2Vjb25kIEhvdXNlaG9sZGVyIHJlZmxlY3Rpb24gaXMgcmVwcmVzZW50ZWQgYnkgSF8xID0gIiA8PCBlbmRsOworY291dCA8PCBIMSA8PCBlbmRsOworTWF0cml4M2QgSDIgPSBNYXRyaXgzZDo6SWRlbnRpdHkoKSAtIGgoMikgKiB2MiAqIHYyLmFkam9pbnQoKTsKK2NvdXQgPDwgIlRoZSB0aGlyZCBIb3VzZWhvbGRlciByZWZsZWN0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IEhfMiA9ICIgPDwgZW5kbDsKK2NvdXQgPDwgSDIgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZWlyIHByb2R1Y3QgaXMgSF8wIEhfMSBIXzIgPSAiIDw8IGVuZGw7Citjb3V0IDw8IEgwICogSDEgKiBIMiA8PCBlbmRsOworCitIb3VzZWhvbGRlclNlcXVlbmNlPE1hdHJpeDNkLCBWZWN0b3IzZD4gaGhTZXEodiwgaCk7CitNYXRyaXgzZCBoaFNlcUFzTWF0cml4KGhoU2VxKTsKK2NvdXQgPDwgIklmIHdlIGNvbnN0cnVjdCBhIEhvdXNlaG9sZGVyU2VxdWVuY2UgZnJvbSB2IGFuZCBoIiA8PCBlbmRsOworY291dCA8PCAiYW5kIGNvbnZlcnQgaXQgdG8gYSBtYXRyaXgsIHdlIGdldDoiIDw8IGVuZGw7Citjb3V0IDw8IGhoU2VxQXNNYXRyaXggPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9JT0Zvcm1hdC5jcHAgYi9kb2Mvc25pcHBldHMvSU9Gb3JtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNWY1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvSU9Gb3JtYXQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKK3N0ZDo6c3RyaW5nIHNlcCA9ICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CitNYXRyaXgzZCBtMTsKK20xIDw8IDEuMTExMTExLCAyLCAzLjMzMzMzLCA0LCA1LCA2LCA3LCA4Ljg4ODg4OCwgOTsKKworSU9Gb3JtYXQgQ29tbWFJbml0Rm10KFN0cmVhbVByZWNpc2lvbiwgRG9udEFsaWduQ29scywgIiwgIiwgIiwgIiwgIiIsICIiLCAiIDw8ICIsICI7Iik7CitJT0Zvcm1hdCBDbGVhbkZtdCg0LCAwLCAiLCAiLCAiXG4iLCAiWyIsICJdIik7CitJT0Zvcm1hdCBPY3RhdmVGbXQoU3RyZWFtUHJlY2lzaW9uLCAwLCAiLCAiLCAiO1xuIiwgIiIsICIiLCAiWyIsICJdIik7CitJT0Zvcm1hdCBIZWF2eUZtdChGdWxsUHJlY2lzaW9uLCAwLCAiLCAiLCAiO1xuIiwgIlsiLCAiXSIsICJbIiwgIl0iKTsKKworc3RkOjpjb3V0IDw8IG0xIDw8IHNlcDsKK3N0ZDo6Y291dCA8PCBtMS5mb3JtYXQoQ29tbWFJbml0Rm10KSA8PCBzZXA7CitzdGQ6OmNvdXQgPDwgbTEuZm9ybWF0KENsZWFuRm10KSA8PCBzZXA7CitzdGQ6OmNvdXQgPDwgbTEuZm9ybWF0KE9jdGF2ZUZtdCkgPDwgc2VwOworc3RkOjpjb3V0IDw8IG0xLmZvcm1hdChIZWF2eUZtdCkgPDwgc2VwOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0phY29iaVNWRF9iYXNpYy5jcHAgYi9kb2Mvc25pcHBldHMvSmFjb2JpU1ZEX2Jhc2ljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjI0YjliCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL0phY29iaVNWRF9iYXNpYy5jcHAKQEAgLTAsMCArMSw5IEBACitNYXRyaXhYZiBtID0gTWF0cml4WGY6OlJhbmRvbSgzLDIpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK0phY29iaVNWRDxNYXRyaXhYZj4gc3ZkKG0sIENvbXB1dGVUaGluVSB8IENvbXB1dGVUaGluVik7Citjb3V0IDw8ICJJdHMgc2luZ3VsYXIgdmFsdWVzIGFyZToiIDw8IGVuZGwgPDwgc3ZkLnNpbmd1bGFyVmFsdWVzKCkgPDwgZW5kbDsKK2NvdXQgPDwgIkl0cyBsZWZ0IHNpbmd1bGFyIHZlY3RvcnMgYXJlIHRoZSBjb2x1bW5zIG9mIHRoZSB0aGluIFUgbWF0cml4OiIgPDwgZW5kbCA8PCBzdmQubWF0cml4VSgpIDw8IGVuZGw7Citjb3V0IDw8ICJJdHMgcmlnaHQgc2luZ3VsYXIgdmVjdG9ycyBhcmUgdGhlIGNvbHVtbnMgb2YgdGhlIHRoaW4gViBtYXRyaXg6IiA8PCBlbmRsIDw8IHN2ZC5tYXRyaXhWKCkgPDwgZW5kbDsKK1ZlY3RvcjNmIHJocygxLCAwLCAwKTsKK2NvdXQgPDwgIk5vdyBjb25zaWRlciB0aGlzIHJocyB2ZWN0b3I6IiA8PCBlbmRsIDw8IHJocyA8PCBlbmRsOworY291dCA8PCAiQSBsZWFzdC1zcXVhcmVzIHNvbHV0aW9uIG9mIG0qeCA9IHJocyBpczoiIDw8IGVuZGwgPDwgc3ZkLnNvbHZlKHJocykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9KYWNvYmlfbWFrZUdpdmVucy5jcHAgYi9kb2Mvc25pcHBldHMvSmFjb2JpX21ha2VHaXZlbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzMzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvSmFjb2JpX21ha2VHaXZlbnMuY3BwCkBAIC0wLDAgKzEsNiBAQAorVmVjdG9yMmYgdiA9IFZlY3RvcjJmOjpSYW5kb20oKTsKK0phY29iaVJvdGF0aW9uPGZsb2F0PiBHOworRy5tYWtlR2l2ZW5zKHYueCgpLCB2LnkoKSk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOwordi5hcHBseU9uVGhlTGVmdCgwLCAxLCBHLmFkam9pbnQoKSk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgSicgKiB2OiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0phY29iaV9tYWtlSmFjb2JpLmNwcCBiL2RvYy9zbmlwcGV0cy9KYWNvYmlfbWFrZUphY29iaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjMzMxZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9KYWNvYmlfbWFrZUphY29iaS5jcHAKQEAgLTAsMCArMSw4IEBACitNYXRyaXgyZiBtID0gTWF0cml4MmY6OlJhbmRvbSgpOworbSA9IChtICsgbS5hZGpvaW50KCkpLmV2YWwoKTsKK0phY29iaVJvdGF0aW9uPGZsb2F0PiBKOworSi5tYWtlSmFjb2JpKG0sIDAsIDEpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK20uYXBwbHlPblRoZUxlZnQoMCwgMSwgSi5hZGpvaW50KCkpOworbS5hcHBseU9uVGhlUmlnaHQoMCwgMSwgSik7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggSicgKiBtICogSjoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9MTFRfZXhhbXBsZS5jcHAgYi9kb2Mvc25pcHBldHMvTExUX2V4YW1wbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZmI0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTExUX2V4YW1wbGUuY3BwCkBAIC0wLDAgKzEsMTIgQEAKK01hdHJpeFhkIEEoMywzKTsKK0EgPDwgNCwtMSwyLCAtMSw2LDAsIDIsMCw1OworY291dCA8PCAiVGhlIG1hdHJpeCBBIGlzIiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKKworTExUPE1hdHJpeFhkPiBsbHRPZkEoQSk7IC8vIGNvbXB1dGUgdGhlIENob2xlc2t5IGRlY29tcG9zaXRpb24gb2YgQQorTWF0cml4WGQgTCA9IGxsdE9mQS5tYXRyaXhMKCk7IC8vIHJldHJpZXZlIGZhY3RvciBMICBpbiB0aGUgZGVjb21wb3NpdGlvbgorLy8gVGhlIHByZXZpb3VzIHR3byBsaW5lcyBjYW4gYWxzbyBiZSB3cml0dGVuIGFzICJMID0gQS5sbHQoKS5tYXRyaXhMKCkiCisKK2NvdXQgPDwgIlRoZSBDaG9sZXNreSBmYWN0b3IgTCBpcyIgPDwgZW5kbCA8PCBMIDw8IGVuZGw7Citjb3V0IDw8ICJUbyBjaGVjayB0aGlzLCBsZXQgdXMgY29tcHV0ZSBMICogTC50cmFuc3Bvc2UoKSIgPDwgZW5kbDsKK2NvdXQgPDwgTCAqIEwudHJhbnNwb3NlKCkgPDwgZW5kbDsKK2NvdXQgPDwgIlRoaXMgc2hvdWxkIGVxdWFsIHRoZSBtYXRyaXggQSIgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9MTFRfc29sdmUuY3BwIGIvZG9jL3NuaXBwZXRzL0xMVF9zb2x2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5NWQyYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9MTFRfc29sdmUuY3BwCkBAIC0wLDAgKzEsOCBAQAordHlwZWRlZiBNYXRyaXg8ZmxvYXQsRHluYW1pYywyPiBEYXRhTWF0cml4OworLy8gbGV0J3MgZ2VuZXJhdGUgc29tZSBzYW1wbGVzIG9uIHRoZSAzRCBwbGFuZSBvZiBlcXVhdGlvbiB6ID0gMngrM3kgKHdpdGggc29tZSBub2lzZSkKK0RhdGFNYXRyaXggc2FtcGxlcyA9IERhdGFNYXRyaXg6OlJhbmRvbSgxMiwyKTsKK1ZlY3RvclhmIGVsZXZhdGlvbnMgPSAyKnNhbXBsZXMuY29sKDApICsgMypzYW1wbGVzLmNvbCgxKSArIFZlY3RvclhmOjpSYW5kb20oMTIpKjAuMTsKKy8vIGFuZCBsZXQncyBzb2x2ZSBzYW1wbGVzICogW3ggeV1eVCA9IGVsZXZhdGlvbnMgaW4gbGVhc3Qgc3F1YXJlIHNlbnNlOgorTWF0cml4PGZsb2F0LDIsMT4geHkKKyA9IChzYW1wbGVzLmFkam9pbnQoKSAqIHNhbXBsZXMpLmxsdCgpLnNvbHZlKChzYW1wbGVzLmFkam9pbnQoKSplbGV2YXRpb25zKSk7Citjb3V0IDw8IHh5IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWFwX2dlbmVyYWxfc3RyaWRlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXBfZ2VuZXJhbF9zdHJpZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NTdlN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWFwX2dlbmVyYWxfc3RyaWRlLmNwcApAQCAtMCwwICsxLDUgQEAKK2ludCBhcnJheVsyNF07Citmb3IoaW50IGkgPSAwOyBpIDwgMjQ7ICsraSkgYXJyYXlbaV0gPSBpOworY291dCA8PCBNYXA8TWF0cml4WGksIDAsIFN0cmlkZTxEeW5hbWljLDI+ID4KKyAgICAgICAgIChhcnJheSwgMywgMywgU3RyaWRlPER5bmFtaWMsMj4oOCwgMikpCisgICAgIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWFwX2lubmVyX3N0cmlkZS5jcHAgYi9kb2Mvc25pcHBldHMvTWFwX2lubmVyX3N0cmlkZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1YWU5YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXBfaW5uZXJfc3RyaWRlLmNwcApAQCAtMCwwICsxLDUgQEAKK2ludCBhcnJheVsxMl07Citmb3IoaW50IGkgPSAwOyBpIDwgMTI7ICsraSkgYXJyYXlbaV0gPSBpOworY291dCA8PCBNYXA8VmVjdG9yWGksIDAsIElubmVyU3RyaWRlPDI+ID4KKyAgICAgICAgIChhcnJheSwgNikgLy8gdGhlIGlubmVyIHN0cmlkZSBoYXMgYWxyZWFkeSBiZWVuIHBhc3NlZCBhcyB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICAgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXBfb3V0ZXJfc3RyaWRlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXBfb3V0ZXJfc3RyaWRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZmMDUyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hcF9vdXRlcl9zdHJpZGUuY3BwCkBAIC0wLDAgKzEsMyBAQAoraW50IGFycmF5WzEyXTsKK2ZvcihpbnQgaSA9IDA7IGkgPCAxMjsgKytpKSBhcnJheVtpXSA9IGk7Citjb3V0IDw8IE1hcDxNYXRyaXhYaSwgMCwgT3V0ZXJTdHJpZGU8PiA+KGFycmF5LCAzLCAzLCBPdXRlclN0cmlkZTw+KDQpKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hcF9wbGFjZW1lbnRfbmV3LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXBfcGxhY2VtZW50X25ldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU0MGVjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXBfcGxhY2VtZW50X25ldy5jcHAKQEAgLTAsMCArMSw1IEBACitpbnQgZGF0YVtdID0gezEsMiwzLDQsNSw2LDcsOCw5fTsKK01hcDxSb3dWZWN0b3JYaT4gdihkYXRhLDQpOworY291dCA8PCAiVGhlIG1hcHBlZCB2ZWN0b3IgdiBpczogIiA8PCB2IDw8ICJcbiI7CituZXcgKCZ2KSBNYXA8Um93VmVjdG9yWGk+KGRhdGErNCw1KTsKK2NvdXQgPDwgIk5vdyB2IGlzOiAiIDw8IHYgPDwgIlxuIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWFwX3NpbXBsZS5jcHAgYi9kb2Mvc25pcHBldHMvTWFwX3NpbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzYmI1MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXBfc2ltcGxlLmNwcApAQCAtMCwwICsxLDMgQEAKK2ludCBhcnJheVs5XTsKK2ZvcihpbnQgaSA9IDA7IGkgPCA5OyArK2kpIGFycmF5W2ldID0gaTsKK2NvdXQgPDwgTWFwPE1hdHJpeDNpPihhcnJheSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2Fkam9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYWRqb2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4MGQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2Fkam9pbnQuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4MmNmIG0gPSBNYXRyaXgyY2Y6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgMngyIGNvbXBsZXggbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGFkam9pbnQgb2YgbToiIDw8IGVuZGwgPDwgbS5hZGpvaW50KCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FsbC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hbGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjI2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hbGwuY3BwCkBAIC0wLDAgKzEsNyBAQAorVmVjdG9yM2YgYm94TWluKFZlY3RvcjNmOjpaZXJvKCkpLCBib3hNYXgoVmVjdG9yM2Y6Ok9uZXMoKSk7CitWZWN0b3IzZiBwMCA9IFZlY3RvcjNmOjpSYW5kb20oKSwgcDEgPSBWZWN0b3IzZjo6UmFuZG9tKCkuY3dpc2VBYnMoKTsKKy8vIGxldCdzIGNoZWNrIGlmIHAwIGFuZCBwMSBhcmUgaW5zaWRlIHRoZSBheGlzIGFsaWduZWQgYm94IGRlZmluZWQgYnkgdGhlIGNvcm5lcnMgYm94TWluLGJveE1heDoKK2NvdXQgPDwgIklzICgiIDw8IHAwLnRyYW5zcG9zZSgpIDw8ICIpIGluc2lkZSB0aGUgYm94OiAiCisgICAgIDw8ICgoYm94TWluLmFycmF5KCk8cDAuYXJyYXkoKSkuYWxsKCkgJiYgKGJveE1heC5hcnJheSgpPnAwLmFycmF5KCkpLmFsbCgpKSA8PCBlbmRsOworY291dCA8PCAiSXMgKCIgPDwgcDEudHJhbnNwb3NlKCkgPDwgIikgaW5zaWRlIHRoZSBib3g6ICIKKyAgICAgPDwgKChib3hNaW4uYXJyYXkoKTxwMS5hcnJheSgpKS5hbGwoKSAmJiAoYm94TWF4LmFycmF5KCk+cDEuYXJyYXkoKSkuYWxsKCkpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcnJheS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxNTA4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FycmF5LmNwcApAQCAtMCwwICsxLDQgQEAKK1ZlY3RvcjNkIHYoMSwyLDMpOwordi5hcnJheSgpICs9IDM7Cit2LmFycmF5KCkgLT0gMjsKK2NvdXQgPDwgdiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXJyYXlfY29uc3QuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXJyYXlfY29uc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkM2IyNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcnJheV9jb25zdC5jcHAKQEAgLTAsMCArMSw0IEBACitWZWN0b3IzZCB2KC0xLDIsLTMpOworY291dCA8PCAidGhlIGFic29sdXRlIHZhbHVlczoiIDw8IGVuZGwgPDwgdi5hcnJheSgpLmFicygpIDw8IGVuZGw7Citjb3V0IDw8ICJ0aGUgYWJzb2x1dGUgdmFsdWVzIHBsdXMgb25lOiIgPDwgZW5kbCA8PCB2LmFycmF5KCkuYWJzKCkrMSA8PCBlbmRsOworY291dCA8PCAic3VtIG9mIHRoZSBzcXVhcmVzOiAiIDw8IHYuYXJyYXkoKS5zcXVhcmUoKS5zdW0oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXNEaWFnb25hbC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hc0RpYWdvbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDEwODJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXNEaWFnb25hbC5jcHAKQEAgLTAsMCArMSBAQAorY291dCA8PCBNYXRyaXgzaShWZWN0b3IzaSgyLDUsNikuYXNEaWFnb25hbCgpKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYmxvY2tfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ibG9ja19pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTliNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYmxvY2tfaW50X2ludC5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS5ibG9jazwyLDI+KDEsMSk6IiA8PCBlbmRsIDw8IG0uYmxvY2s8MiwyPigxLDEpIDw8IGVuZGw7CittLmJsb2NrPDIsMj4oMSwxKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ibG9ja19pbnRfaW50X2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYmxvY2tfaW50X2ludF9pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM4Y2JiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYmxvY2tfaW50X2ludF9pbnRfaW50LmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBtLmJsb2NrKDEsIDEsIDIsIDIpOiIgPDwgZW5kbCA8PCBtLmJsb2NrKDEsIDEsIDIsIDIpIDw8IGVuZGw7CittLmJsb2NrKDEsIDEsIDIsIDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2JvdHRvbUxlZnRDb3JuZXJfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ib3R0b21MZWZ0Q29ybmVyX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWU5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ib3R0b21MZWZ0Q29ybmVyX2ludF9pbnQuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIG0uYm90dG9tTGVmdENvcm5lcigyLCAyKToiIDw8IGVuZGw7Citjb3V0IDw8IG0uYm90dG9tTGVmdENvcm5lcigyLCAyKSA8PCBlbmRsOworbS5ib3R0b21MZWZ0Q29ybmVyKDIsIDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2JvdHRvbVJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYm90dG9tUmlnaHRDb3JuZXJfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwNTA5MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2JvdHRvbVJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIG0uYm90dG9tUmlnaHRDb3JuZXIoMiwgMik6IiA8PCBlbmRsOworY291dCA8PCBtLmJvdHRvbVJpZ2h0Q29ybmVyKDIsIDIpIDw8IGVuZGw7CittLmJvdHRvbVJpZ2h0Q29ybmVyKDIsIDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2JvdHRvbVJvd3NfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2JvdHRvbVJvd3NfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2NhOTJlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYm90dG9tUm93c19pbnQuY3BwCkBAIC0wLDAgKzEsNiBAQAorQXJyYXk0NGkgYSA9IEFycmF5NDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGFycmF5IGE6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgYS5ib3R0b21Sb3dzKDIpOiIgPDwgZW5kbDsKK2NvdXQgPDwgYS5ib3R0b21Sb3dzKDIpIDw8IGVuZGw7CithLmJvdHRvbVJvd3MoMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBhcnJheSBhIGlzOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jYXN0LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2Nhc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjg4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jYXN0LmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeDJkIG1kID0gTWF0cml4MmQ6OklkZW50aXR5KCkgKiAwLjQ1OworTWF0cml4MmYgbWYgPSBNYXRyaXgyZjo6SWRlbnRpdHkoKTsKK2NvdXQgPDwgbWQgKyBtZi5jYXN0PGRvdWJsZT4oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29sLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjOTFiMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbC5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OklkZW50aXR5KCk7CittLmNvbCgxKSA9IFZlY3RvcjNkKDQsNSw2KTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29sd2lzZS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb2x3aXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ4YmVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29sd2lzZS5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHN1bSBvZiBlYWNoIGNvbHVtbjoiIDw8IGVuZGwgPDwgbS5jb2x3aXNlKCkuc3VtKCkgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1heGltdW0gYWJzb2x1dGUgdmFsdWUgb2YgZWFjaCBjb2x1bW46IgorICAgICA8PCBlbmRsIDw8IG0uY3dpc2VBYnMoKS5jb2x3aXNlKCkubWF4Q29lZmYoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2suY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjA4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjay5jcHAKQEAgLTAsMCArMSwxMyBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CitNYXRyaXgzZCBpbnZlcnNlOworYm9vbCBpbnZlcnRpYmxlOworZG91YmxlIGRldGVybWluYW50OworbS5jb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjayhpbnZlcnNlLGRldGVybWluYW50LGludmVydGlibGUpOworY291dCA8PCAiSXRzIGRldGVybWluYW50IGlzICIgPDwgZGV0ZXJtaW5hbnQgPDwgZW5kbDsKK2lmKGludmVydGlibGUpIHsKKyAgY291dCA8PCAiSXQgaXMgaW52ZXJ0aWJsZSwgYW5kIGl0cyBpbnZlcnNlIGlzOiIgPDwgZW5kbCA8PCBpbnZlcnNlIDw8IGVuZGw7Cit9CitlbHNlIHsKKyAgY291dCA8PCAiSXQgaXMgbm90IGludmVydGlibGUuIiA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VXaXRoQ2hlY2suY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VXaXRoQ2hlY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3M2E5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb21wdXRlSW52ZXJzZVdpdGhDaGVjay5jcHAKQEAgLTAsMCArMSwxMSBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CitNYXRyaXgzZCBpbnZlcnNlOworYm9vbCBpbnZlcnRpYmxlOworbS5jb21wdXRlSW52ZXJzZVdpdGhDaGVjayhpbnZlcnNlLGludmVydGlibGUpOworaWYoaW52ZXJ0aWJsZSkgeworICBjb3V0IDw8ICJJdCBpcyBpbnZlcnRpYmxlLCBhbmQgaXRzIGludmVyc2UgaXM6IiA8PCBlbmRsIDw8IGludmVyc2UgPDwgZW5kbDsKK30KK2Vsc2UgeworICBjb3V0IDw8ICJJdCBpcyBub3QgaW52ZXJ0aWJsZS4iIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUFicy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUFicy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhMzE2MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlQWJzLmNwcApAQCAtMCwwICsxLDQgQEAKK01hdHJpeFhkIG0oMiwzKTsKK20gPDwgMiwgLTQsIDYsICAgCisgICAgIC01LCAxLCAwOworY291dCA8PCBtLmN3aXNlQWJzKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlQWJzMi5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUFiczIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWEyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUFiczIuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGQgbSgyLDMpOworbSA8PCAyLCAtNCwgNiwgICAKKyAgICAgLTUsIDEsIDA7Citjb3V0IDw8IG0uY3dpc2VBYnMyKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlRXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VFcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzNjU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlRXF1YWwuY3BwCkBAIC0wLDAgKzEsNyBAQAorTWF0cml4WGkgbSgyLDIpOworbSA8PCAxLCAwLAorICAgICAxLCAxOworY291dCA8PCAiQ29tcGFyaW5nIG0gd2l0aCBpZGVudGl0eSBtYXRyaXg6IiA8PCBlbmRsOworY291dCA8PCBtLmN3aXNlRXF1YWwoTWF0cml4WGk6OklkZW50aXR5KDIsMikpIDw8IGVuZGw7CitpbnQgY291bnQgPSBtLmN3aXNlRXF1YWwoTWF0cml4WGk6OklkZW50aXR5KDIsMikpLmNvdW50KCk7Citjb3V0IDw8ICJOdW1iZXIgb2YgY29lZmZpY2llbnRzIHRoYXQgYXJlIGVxdWFsOiAiIDw8IGNvdW50IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUludmVyc2UuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VJbnZlcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2UwOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VJbnZlcnNlLmNwcApAQCAtMCwwICsxLDQgQEAKK01hdHJpeFhkIG0oMiwzKTsKK20gPDwgMiwgMC41LCAxLCAgIAorICAgICAzLCAwLjI1LCAxOworY291dCA8PCBtLmN3aXNlSW52ZXJzZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU1heC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU1heC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5NTY4MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlTWF4LmNwcApAQCAtMCwwICsxLDIgQEAKK1ZlY3RvcjNkIHYoMiwzLDQpLCB3KDQsMiwzKTsKK2NvdXQgPDwgdi5jd2lzZU1heCh3KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VNaW4uY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VNaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmM3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU1pbi5jcHAKQEAgLTAsMCArMSwyIEBACitWZWN0b3IzZCB2KDIsMyw0KSwgdyg0LDIsMyk7Citjb3V0IDw8IHYuY3dpc2VNaW4odykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlTm90RXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VOb3RFcXVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyZTRmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlTm90RXF1YWwuY3BwCkBAIC0wLDAgKzEsNyBAQAorTWF0cml4WGkgbSgyLDIpOworbSA8PCAxLCAwLAorICAgICAxLCAxOworY291dCA8PCAiQ29tcGFyaW5nIG0gd2l0aCBpZGVudGl0eSBtYXRyaXg6IiA8PCBlbmRsOworY291dCA8PCBtLmN3aXNlTm90RXF1YWwoTWF0cml4WGk6OklkZW50aXR5KDIsMikpIDw8IGVuZGw7CitpbnQgY291bnQgPSBtLmN3aXNlTm90RXF1YWwoTWF0cml4WGk6OklkZW50aXR5KDIsMikpLmNvdW50KCk7Citjb3V0IDw8ICJOdW1iZXIgb2YgY29lZmZpY2llbnRzIHRoYXQgYXJlIG5vdCBlcXVhbDogIiA8PCBjb3VudCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VQcm9kdWN0LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUHJvZHVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiM2ExMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUHJvZHVjdC5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXgzaSBhID0gTWF0cml4M2k6OlJhbmRvbSgpLCBiID0gTWF0cml4M2k6OlJhbmRvbSgpOworTWF0cml4M2kgYyA9IGEuY3dpc2VQcm9kdWN0KGIpOworY291dCA8PCAiYTpcbiIgPDwgYSA8PCAiXG5iOlxuIiA8PCBiIDw8ICJcbmM6XG4iIDw8IGMgPDwgZW5kbDsKKwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VRdW90aWVudC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVF1b3RpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjkxMjEyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VRdW90aWVudC5jcHAKQEAgLTAsMCArMSwyIEBACitWZWN0b3IzZCB2KDIsMyw0KSwgdyg0LDIsMyk7Citjb3V0IDw8IHYuY3dpc2VRdW90aWVudCh3KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VTcXJ0LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlU3FydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlU3FydC5jcHAKQEAgLTAsMCArMSwyIEBACitWZWN0b3IzZCB2KDEsMiw0KTsKK2NvdXQgPDwgdi5jd2lzZVNxcnQoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjM0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9kaWFnb25hbC5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXgzaSBtID0gTWF0cml4M2k6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgYXJlIHRoZSBjb2VmZmljaWVudHMgb24gdGhlIG1haW4gZGlhZ29uYWwgb2YgbToiIDw8IGVuZGwKKyAgICAgPDwgbS5kaWFnb25hbCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9kaWFnb25hbF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWxfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjY2YWJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWxfaW50LmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBhcmUgdGhlIGNvZWZmaWNpZW50cyBvbiB0aGUgMXN0IHN1cGVyLWRpYWdvbmFsIGFuZCAybmQgc3ViLWRpYWdvbmFsIG9mIG06IiA8PCBlbmRsCisgICAgIDw8IG0uZGlhZ29uYWwoMSkudHJhbnNwb3NlKCkgPDwgZW5kbAorICAgICA8PCBtLmRpYWdvbmFsKC0yKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWxfdGVtcGxhdGVfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2RpYWdvbmFsX3RlbXBsYXRlX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3M2QxYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2RpYWdvbmFsX3RlbXBsYXRlX2ludC5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgYXJlIHRoZSBjb2VmZmljaWVudHMgb24gdGhlIDFzdCBzdXBlci1kaWFnb25hbCBhbmQgMm5kIHN1Yi1kaWFnb25hbCBvZiBtOiIgPDwgZW5kbAorICAgICA8PCBtLmRpYWdvbmFsPDE+KCkudHJhbnNwb3NlKCkgPDwgZW5kbAorICAgICA8PCBtLmRpYWdvbmFsPC0yPigpLnRyYW5zcG9zZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9laWdlbnZhbHVlcy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9laWdlbnZhbHVlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5Zjg4NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2VpZ2VudmFsdWVzLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLDMpOworVmVjdG9yWGNkIGVpdmFscyA9IG9uZXMuZWlnZW52YWx1ZXMoKTsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGFyZToiIDw8IGVuZGwgPDwgZWl2YWxzIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9lbmRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2VuZF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzU0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9lbmRfaW50LmNwcApAQCAtMCwwICsxLDUgQEAKK1Jvd1ZlY3RvcjRpIHYgPSBSb3dWZWN0b3I0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB2LnRhaWwoMik6IiA8PCBlbmRsIDw8IHYudGFpbCgyKSA8PCBlbmRsOwordi50YWlsKDIpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgdmVjdG9yIHYgaXM6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2V2YWwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZXZhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmM2FhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2V2YWwuY3BwCkBAIC0wLDAgKzEsMTIgQEAKK01hdHJpeDJmIE0gPSBNYXRyaXgyZjo6UmFuZG9tKCk7CitNYXRyaXgyZiBtOworbSA9IE07Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiTm93IHdlIHdhbnQgdG8gY29weSBhIGNvbHVtbiBpbnRvIGEgcm93LiIgPDwgZW5kbDsKK2NvdXQgPDwgIklmIHdlIGRvIG0uY29sKDEpID0gbS5yb3coMCksIHRoZW4gbSBiZWNvbWVzOiIgPDwgZW5kbDsKK20uY29sKDEpID0gbS5yb3coMCk7Citjb3V0IDw8IG0gPDwgZW5kbCA8PCAid2hpY2ggaXMgd3JvbmchIiA8PCBlbmRsOworY291dCA8PCAiTm93IGxldCB1cyBpbnN0ZWFkIGRvIG0uY29sKDEpID0gbS5yb3coMCkuZXZhbCgpLiBUaGVuIG0gYmVjb21lcyIgPDwgZW5kbDsKK20gPSBNOworbS5jb2woMSkgPSBtLnJvdygwKS5ldmFsKCk7Citjb3V0IDw8IG0gPDwgZW5kbCA8PCAid2hpY2ggaXMgcmlnaHQuIiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZXh0cmFjdC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9leHRyYWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTYyMjBmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZXh0cmFjdC5jcHAKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfTVNDX1ZFUgorICAjd2FybmluZyBkZXByZWNhdGVkCisjZW5kaWYKKy8qIGRlcHJlY2F0ZWQKK01hdHJpeDNpIG0gPSBNYXRyaXgzaTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgdXBwZXItdHJpYW5ndWxhciBtYXRyaXggZXh0cmFjdGVkIGZyb20gbToiIDw8IGVuZGwKKyAgICAgPDwgbS5wYXJ0PEVpZ2VuOjpVcHBlclRyaWFuZ3VsYXI+KCkgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHN0cmljdGx5LXVwcGVyLXRyaWFuZ3VsYXIgbWF0cml4IGV4dHJhY3RlZCBmcm9tIG06IiA8PCBlbmRsCisgICAgIDw8IG0ucGFydDxFaWdlbjo6U3RyaWN0bHlVcHBlclRyaWFuZ3VsYXI+KCkgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHVuaXQtbG93ZXItdHJpYW5ndWxhciBtYXRyaXggZXh0cmFjdGVkIGZyb20gbToiIDw8IGVuZGwKKyAgICAgPDwgbS5wYXJ0PEVpZ2VuOjpVbml0TG93ZXJUcmlhbmd1bGFyPigpIDw8IGVuZGw7CisqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2ZpeGVkQmxvY2tfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9maXhlZEJsb2NrX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDExMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9maXhlZEJsb2NrX2ludF9pbnQuY3BwCkBAIC0wLDAgKzEsNSBAQAorTWF0cml4NGQgbSA9IFZlY3RvcjRkKDEsMiwzLDQpLmFzRGlhZ29uYWwoKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIG0uZml4ZWQ8MiwgMj4oMiwgMik6IiA8PCBlbmRsIDw8IG0uYmxvY2s8MiwgMj4oMiwgMikgPDwgZW5kbDsKK20uYmxvY2s8MiwgMj4oMiwgMCkgPSBtLmJsb2NrPDIsIDI+KDIsIDIpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaWRlbnRpdHkuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaWRlbnRpdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzFlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pZGVudGl0eS5jcHAKQEAgLTAsMCArMSBAQAorY291dCA8PCBNYXRyaXg8ZG91YmxlLCAzLCA0Pjo6SWRlbnRpdHkoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaWRlbnRpdHlfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pZGVudGl0eV9pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTg2NDlkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaWRlbnRpdHlfaW50X2ludC5jcHAKQEAgLTAsMCArMSBAQAorY291dCA8PCBNYXRyaXhYZDo6SWRlbnRpdHkoNCwgMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2ludmVyc2UuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaW52ZXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2MTQyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2ludmVyc2UuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJJdHMgaW52ZXJzZSBpczoiIDw8IGVuZGwgPDwgbS5pbnZlcnNlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzRGlhZ29uYWwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNEaWFnb25hbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZDU5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzRGlhZ29uYWwuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4M2QgbSA9IDEwMDAwICogTWF0cml4M2Q6OklkZW50aXR5KCk7CittKDAsMikgPSAxOworY291dCA8PCAiSGVyZSdzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAibS5pc0RpYWdvbmFsKCkgcmV0dXJuczogIiA8PCBtLmlzRGlhZ29uYWwoKSA8PCBlbmRsOworY291dCA8PCAibS5pc0RpYWdvbmFsKDFlLTMpIHJldHVybnM6ICIgPDwgbS5pc0RpYWdvbmFsKDFlLTMpIDw8IGVuZGw7CisKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzSWRlbnRpdHkuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNJZGVudGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiNzU2YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzSWRlbnRpdHkuY3BwCkBAIC0wLDAgKzEsNSBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpJZGVudGl0eSgpOworbSgwLDIpID0gMWUtNDsKK2NvdXQgPDwgIkhlcmUncyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIm0uaXNJZGVudGl0eSgpIHJldHVybnM6ICIgPDwgbS5pc0lkZW50aXR5KCkgPDwgZW5kbDsKK2NvdXQgPDwgIm0uaXNJZGVudGl0eSgxZS0zKSByZXR1cm5zOiAiIDw8IG0uaXNJZGVudGl0eSgxZS0zKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNPbmVzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzT25lcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyZjYyOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzT25lcy5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6Ok9uZXMoKTsKK20oMCwyKSArPSAxZS00OworY291dCA8PCAiSGVyZSdzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAibS5pc09uZXMoKSByZXR1cm5zOiAiIDw8IG0uaXNPbmVzKCkgPDwgZW5kbDsKK2NvdXQgPDwgIm0uaXNPbmVzKDFlLTMpIHJldHVybnM6ICIgPDwgbS5pc09uZXMoMWUtMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzT3J0aG9nb25hbC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc09ydGhvZ29uYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMmFmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc09ydGhvZ29uYWwuY3BwCkBAIC0wLDAgKzEsNiBAQAorVmVjdG9yM2QgdigxLDAsMCk7CitWZWN0b3IzZCB3KDFlLTQsMCwxKTsKK2NvdXQgPDwgIkhlcmUncyB0aGUgdmVjdG9yIHY6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUncyB0aGUgdmVjdG9yIHc6IiA8PCBlbmRsIDw8IHcgPDwgZW5kbDsKK2NvdXQgPDwgInYuaXNPcnRob2dvbmFsKHcpIHJldHVybnM6ICIgPDwgdi5pc09ydGhvZ29uYWwodykgPDwgZW5kbDsKK2NvdXQgPDwgInYuaXNPcnRob2dvbmFsKHcsMWUtMykgcmV0dXJuczogIiA8PCB2LmlzT3J0aG9nb25hbCh3LDFlLTMpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc1VuaXRhcnkuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNVbml0YXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODc3ZGEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNVbml0YXJ5LmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6SWRlbnRpdHkoKTsKK20oMCwyKSA9IDFlLTQ7Citjb3V0IDw8ICJIZXJlJ3MgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJtLmlzVW5pdGFyeSgpIHJldHVybnM6ICIgPDwgbS5pc1VuaXRhcnkoKSA8PCBlbmRsOworY291dCA8PCAibS5pc1VuaXRhcnkoMWUtMykgcmV0dXJuczogIiA8PCBtLmlzVW5pdGFyeSgxZS0zKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNaZXJvLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzWmVyby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjZmUyMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzWmVyby5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6Olplcm8oKTsKK20oMCwyKSA9IDFlLTQ7Citjb3V0IDw8ICJIZXJlJ3MgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJtLmlzWmVybygpIHJldHVybnM6ICIgPDwgbS5pc1plcm8oKSA8PCBlbmRsOworY291dCA8PCAibS5pc1plcm8oMWUtMykgcmV0dXJuczogIiA8PCBtLmlzWmVybygxZS0zKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfbGVmdENvbHNfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2xlZnRDb2xzX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhOTg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2xlZnRDb2xzX2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitBcnJheTQ0aSBhID0gQXJyYXk0NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgYXJyYXkgYToiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBhLmxlZnRDb2xzKDIpOiIgPDwgZW5kbDsKK2NvdXQgPDwgYS5sZWZ0Q29scygyKSA8PCBlbmRsOworYS5sZWZ0Q29scygyKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIGFycmF5IGEgaXM6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX21hcmtlZC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9tYXJrZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDcxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9tYXJrZWQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX01TQ19WRVIKKyAgI3dhcm5pbmcgZGVwcmVjYXRlZAorI2VuZGlmCisvKgorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpaZXJvKCk7CittLnBhcnQ8RWlnZW46OlVwcGVyVHJpYW5ndWxhcj4oKS5zZXRPbmVzKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworTWF0cml4M2QgbiA9IE1hdHJpeDNkOjpPbmVzKCk7CituLnBhcnQ8RWlnZW46Okxvd2VyVHJpYW5ndWxhcj4oKSAqPSAyOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG46IiA8PCBlbmRsIDw8IG4gPDwgZW5kbDsKK2NvdXQgPDwgIkFuZCBub3cgaGVyZSBpcyBtLmludmVyc2UoKSpuLCB0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQiCisgICAgICAgICIgbSBpcyB1cHBlci10cmlhbmd1bGFyOiIgPDwgZW5kbAorICAgICA8PCBtLm1hcmtlZDxFaWdlbjo6VXBwZXJUcmlhbmd1bGFyPigpLnNvbHZlVHJpYW5ndWxhcihuKTsKKyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfbm9hbGlhcy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ub2FsaWFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjU0YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfbm9hbGlhcy5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgyZCBhLCBiLCBjOyBhIDw8IDEsMiwzLDQ7IGIgPDwgNSw2LDcsODsKK2Mubm9hbGlhcygpID0gYSAqIGI7IC8vIHRoaXMgY29tcHV0ZXMgdGhlIHByb2R1Y3QgZGlyZWN0bHkgdG8gYworY291dCA8PCBjIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vbmVzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX29uZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzc2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vbmVzLmNwcApAQCAtMCwwICsxLDIgQEAKK2NvdXQgPDwgTWF0cml4MmQ6Ok9uZXMoKSA8PCBlbmRsOworY291dCA8PCA2ICogUm93VmVjdG9yNGk6Ok9uZXMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb25lc19pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb25lc19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjE4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vbmVzX2ludC5jcHAKQEAgLTAsMCArMSwyIEBACitjb3V0IDw8IDYgKiBSb3dWZWN0b3JYaTo6T25lcyg0KSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYZjo6T25lcygyKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb25lc19pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX29uZXNfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmNWEzMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX29uZXNfaW50X2ludC5jcHAKQEAgLTAsMCArMSBAQAorY291dCA8PCBNYXRyaXhYaTo6T25lcygyLDMpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vcGVyYXRvck5vcm0uY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb3BlcmF0b3JOb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTUyNDZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb3BlcmF0b3JOb3JtLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLDMpOworY291dCA8PCAiVGhlIG9wZXJhdG9yIG5vcm0gb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpcyAiCisgICAgIDw8IG9uZXMub3BlcmF0b3JOb3JtKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3BhcnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcGFydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlN2Y0OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3BhcnQuY3BwCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX01TQ19WRVIKKyAgI3dhcm5pbmcgZGVwcmVjYXRlZAorI2VuZGlmCisvKgorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpaZXJvKCk7CittLnBhcnQ8RWlnZW46OlN0cmljdGx5VXBwZXJUcmlhbmd1bGFyPigpLnNldE9uZXMoKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJBbmQgbGV0IHVzIG5vdyBjb21wdXRlIG0qbS5hZGpvaW50KCkgaW4gYSB2ZXJ5IG9wdGltaXplZCB3YXkiIDw8IGVuZGwKKyAgICAgPDwgInRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIHN5bW1ldHJ5LiIgPDwgZW5kbDsKK01hdHJpeDNkIG47CituLnBhcnQ8RWlnZW46OlNlbGZBZGpvaW50PigpID0gKG0qbS5hZGpvaW50KCkpLmxhenkoKTsKK2NvdXQgPDwgIlRoZSByZXN1bHQgaXM6IiA8PCBlbmRsIDw8IG4gPDwgZW5kbDsKKyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcHJvZC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9wcm9kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmYyN2JkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcHJvZC5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHByb2R1Y3Qgb2YgYWxsIHRoZSBjb2VmZmljaWVudHM6IiA8PCBlbmRsIDw8IG0ucHJvZCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yYW5kb20uY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmFuZG9tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWZjNTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmFuZG9tLmNwcApAQCAtMCwwICsxIEBACitjb3V0IDw8IDEwMCAqIE1hdHJpeDJpOjpSYW5kb20oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmFuZG9tX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yYW5kb21faW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTYxZDAzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmFuZG9tX2ludC5jcHAKQEAgLTAsMCArMSBAQAorY291dCA8PCBWZWN0b3JYaTo6UmFuZG9tKDIpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yYW5kb21faW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yYW5kb21faW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwZjdkZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JhbmRvbV9pbnRfaW50LmNwcApAQCAtMCwwICsxIEBACitjb3V0IDw8IE1hdHJpeFhpOjpSYW5kb20oMiwzKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmVwbGljYXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JlcGxpY2F0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlNTJiYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JlcGxpY2F0ZS5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYaSBtID0gTWF0cml4WGk6OlJhbmRvbSgyLDMpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIm0ucmVwbGljYXRlPDMsMj4oKSA9IC4uLiIgPDwgZW5kbDsKK2NvdXQgPDwgbS5yZXBsaWNhdGU8MywyPigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXBsaWNhdGVfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXBsaWNhdGVfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkYmM3MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JlcGxpY2F0ZV9pbnRfaW50LmNwcApAQCAtMCwwICsxLDQgQEAKK1ZlY3RvcjNpIHYgPSBWZWN0b3IzaTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAidi5yZXBsaWNhdGUoMiw1KSA9IC4uLiIgPDwgZW5kbDsKK2NvdXQgPDwgdi5yZXBsaWNhdGUoMiw1KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmV2ZXJzZS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXZlcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTQ1YTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmV2ZXJzZS5jcHAKQEAgLTAsMCArMSw4IEBACitNYXRyaXhYaSBtID0gTWF0cml4WGk6OlJhbmRvbSgzLDQpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHJldmVyc2Ugb2YgbToiIDw8IGVuZGwgPDwgbS5yZXZlcnNlKCkgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGNvZWZmaWNpZW50ICgxLDApIGluIHRoZSByZXZlcnNlIG9mIG06IiA8PCBlbmRsCisgICAgIDw8IG0ucmV2ZXJzZSgpKDEsMCkgPDwgZW5kbDsKK2NvdXQgPDwgIkxldCB1cyBvdmVyd3JpdGUgdGhpcyBjb2VmZmljaWVudCB3aXRoIHRoZSB2YWx1ZSA0LiIgPDwgZW5kbDsKK20ucmV2ZXJzZSgpKDEsMCkgPSA0OworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmlnaHRDb2xzX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yaWdodENvbHNfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjUxMzQwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmlnaHRDb2xzX2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitBcnJheTQ0aSBhID0gQXJyYXk0NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgYXJyYXkgYToiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBhLnJpZ2h0Q29scygyKToiIDw8IGVuZGw7Citjb3V0IDw8IGEucmlnaHRDb2xzKDIpIDw8IGVuZGw7CithLnJpZ2h0Q29scygyKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIGFycmF5IGEgaXM6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3Jvdy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNWU2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yb3cuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpJZGVudGl0eSgpOworbS5yb3coMSkgPSBWZWN0b3IzZCg0LDUsNik7Citjb3V0IDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3Jvd3dpc2UuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfcm93d2lzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5Mzk2NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3Jvd3dpc2UuY3BwCkBAIC0wLDAgKzEsNSBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBzdW0gb2YgZWFjaCByb3c6IiA8PCBlbmRsIDw8IG0ucm93d2lzZSgpLnN1bSgpIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIGVhY2ggcm93OiIKKyAgICAgPDwgZW5kbCA8PCBtLmN3aXNlQWJzKCkucm93d2lzZSgpLm1heENvZWZmKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NlZ21lbnRfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZWdtZW50X2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwY2Q2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZWdtZW50X2ludF9pbnQuY3BwCkBAIC0wLDAgKzEsNSBAQAorUm93VmVjdG9yNGkgdiA9IFJvd1ZlY3RvcjRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciB2OiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHYuc2VnbWVudCgxLCAyKToiIDw8IGVuZGwgPDwgdi5zZWdtZW50KDEsIDIpIDw8IGVuZGw7Cit2LnNlZ21lbnQoMSwgMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSB2ZWN0b3IgdiBpczoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2VsZWN0LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NlbGVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1NDc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NlbGVjdC5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXhYaSBtKDMsIDMpOworbSA8PCAxLCAyLCAzLAorICAgICA0LCA1LCA2LAorICAgICA3LCA4LCA5OworbSA9IChtLmFycmF5KCkgPj0gNSkuc2VsZWN0KC1tLCBtKTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlY2Y1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldC5jcHAKQEAgLTAsMCArMSwxMyBAQAorTWF0cml4M2kgbTE7CittMSA8PCAxLCAyLCAzLAorICAgICAgNCwgNSwgNiwKKyAgICAgIDcsIDgsIDk7Citjb3V0IDw8IG0xIDw8IGVuZGwgPDwgZW5kbDsKK01hdHJpeDNpIG0yID0gTWF0cml4M2k6OklkZW50aXR5KCk7CittMi5ibG9jaygwLDAsIDIsMikgPDwgMTAsIDExLCAxMiwgMTM7Citjb3V0IDw8IG0yIDw8IGVuZGwgPDwgZW5kbDsKK1ZlY3RvcjJpIHYxOwordjEgPDwgMTQsIDE1OworbTIgPDwgdjEudHJhbnNwb3NlKCksIDE2LAorICAgICAgdjEsIG0xLmJsb2NrKDEsMSwyLDIpOworY291dCA8PCBtMiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0SWRlbnRpdHkuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0SWRlbnRpdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDBhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXRJZGVudGl0eS5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6Olplcm8oKTsKK20uYmxvY2s8MywzPigxLDApLnNldElkZW50aXR5KCk7Citjb3V0IDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldE9uZXMuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0T25lcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlZjljMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldE9uZXMuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpSYW5kb20oKTsKK20ucm93KDEpLnNldE9uZXMoKTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0UmFuZG9tLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldFJhbmRvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjMjU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldFJhbmRvbS5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6Olplcm8oKTsKK20uY29sKDEpLnNldFJhbmRvbSgpOworY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXRaZXJvLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldFplcm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNWI5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXRaZXJvLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7CittLnJvdygxKS5zZXRaZXJvKCk7Citjb3V0IDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3N0YXJ0X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zdGFydF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjFkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zdGFydF9pbnQuY3BwCkBAIC0wLDAgKzEsNSBAQAorUm93VmVjdG9yNGkgdiA9IFJvd1ZlY3RvcjRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciB2OiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHYuaGVhZCgyKToiIDw8IGVuZGwgPDwgdi5oZWFkKDIpIDw8IGVuZGw7Cit2LmhlYWQoMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSB2ZWN0b3IgdiBpczoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2JvdHRvbVJvd3MuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2JvdHRvbVJvd3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZWE4OTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfYm90dG9tUm93cy5jcHAKQEAgLTAsMCArMSw2IEBACitBcnJheTQ0aSBhID0gQXJyYXk0NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgYXJyYXkgYToiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBhLmJvdHRvbVJvd3M8Mj4oKToiIDw8IGVuZGw7Citjb3V0IDw8IGEuYm90dG9tUm93czwyPigpIDw8IGVuZGw7CithLmJvdHRvbVJvd3M8Mj4oKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIGFycmF5IGEgaXM6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9lbmQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2VuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjY2IwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9lbmQuY3BwCkBAIC0wLDAgKzEsNSBAQAorUm93VmVjdG9yNGkgdiA9IFJvd1ZlY3RvcjRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciB2OiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHYudGFpbCgyKToiIDw8IGVuZGwgPDwgdi50YWlsPDI+KCkgPDwgZW5kbDsKK3YudGFpbDwyPigpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgdmVjdG9yIHYgaXM6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tTGVmdENvcm5lci5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbUxlZnRDb3JuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0Nzg5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbUxlZnRDb3JuZXIuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIG0uYm90dG9tTGVmdENvcm5lcjwyLDI+KCk6IiA8PCBlbmRsOworY291dCA8PCBtLmJvdHRvbUxlZnRDb3JuZXI8MiwyPigpIDw8IGVuZGw7CittLmJvdHRvbUxlZnRDb3JuZXI8MiwyPigpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tUmlnaHRDb3JuZXIuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhY2IwMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tUmlnaHRDb3JuZXIuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIG0uYm90dG9tUmlnaHRDb3JuZXI8MiwyPigpOiIgPDwgZW5kbDsKK2NvdXQgPDwgbS5ib3R0b21SaWdodENvcm5lcjwyLDI+KCkgPDwgZW5kbDsKK20uYm90dG9tUmlnaHRDb3JuZXI8MiwyPigpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wTGVmdENvcm5lci5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcExlZnRDb3JuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OTlkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcExlZnRDb3JuZXIuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIG0udG9wTGVmdENvcm5lcjwyLDI+KCk6IiA8PCBlbmRsOworY291dCA8PCBtLnRvcExlZnRDb3JuZXI8MiwyPigpIDw8IGVuZGw7CittLnRvcExlZnRDb3JuZXI8MiwyPigpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wUmlnaHRDb3JuZXIuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhMTc3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wUmlnaHRDb3JuZXIuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4NGkgbSA9IE1hdHJpeDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIG0udG9wUmlnaHRDb3JuZXI8MiwyPigpOiIgPDwgZW5kbDsKK2NvdXQgPDwgbS50b3BSaWdodENvcm5lcjwyLDI+KCkgPDwgZW5kbDsKK20udG9wUmlnaHRDb3JuZXI8MiwyPigpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9sZWZ0Q29scy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfbGVmdENvbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDI1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfbGVmdENvbHMuY3BwCkBAIC0wLDAgKzEsNiBAQAorQXJyYXk0NGkgYSA9IEFycmF5NDRpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGFycmF5IGE6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgYS5sZWZ0Q29sczwyPigpOiIgPDwgZW5kbDsKK2NvdXQgPDwgYS5sZWZ0Q29sczwyPigpIDw8IGVuZGw7CithLmxlZnRDb2xzPDI+KCkuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBhcnJheSBhIGlzOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfcmlnaHRDb2xzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9yaWdodENvbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOGMwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfcmlnaHRDb2xzLmNwcApAQCAtMCwwICsxLDYgQEAKK0FycmF5NDRpIGEgPSBBcnJheTQ0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBhcnJheSBhOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIGEucmlnaHRDb2xzPDI+KCk6IiA8PCBlbmRsOworY291dCA8PCBhLnJpZ2h0Q29sczwyPigpIDw8IGVuZGw7CithLnJpZ2h0Q29sczwyPigpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgYXJyYXkgYSBpczoiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3NlZ21lbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3NlZ21lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDhiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc2VnbWVudC5jcHAKQEAgLTAsMCArMSw1IEBACitSb3dWZWN0b3I0aSB2ID0gUm93VmVjdG9yNGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIHY6IiA8PCBlbmRsIDw8IHYgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdi5zZWdtZW50PDI+KDEpOiIgPDwgZW5kbCA8PCB2LnNlZ21lbnQ8Mj4oMSkgPDwgZW5kbDsKK3Yuc2VnbWVudDwyPigyKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIHZlY3RvciB2IGlzOiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfc3RhcnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3N0YXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzM2YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X3N0YXJ0LmNwcApAQCAtMCwwICsxLDUgQEAKK1Jvd1ZlY3RvcjRpIHYgPSBSb3dWZWN0b3I0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB2LmhlYWQoMik6IiA8PCBlbmRsIDw8IHYuaGVhZDwyPigpIDw8IGVuZGw7Cit2LmhlYWQ8Mj4oKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIHZlY3RvciB2IGlzOiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfdG9wUm93cy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfdG9wUm93cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExMDI1MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF90b3BSb3dzLmNwcApAQCAtMCwwICsxLDYgQEAKK0FycmF5NDRpIGEgPSBBcnJheTQ0aTo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBhcnJheSBhOiIgPDwgZW5kbCA8PCBhIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIGEudG9wUm93czwyPigpOiIgPDwgZW5kbDsKK2NvdXQgPDwgYS50b3BSb3dzPDI+KCkgPDwgZW5kbDsKK2EudG9wUm93czwyPigpLnNldFplcm8oKTsKK2NvdXQgPDwgIk5vdyB0aGUgYXJyYXkgYSBpczoiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdG9wTGVmdENvcm5lcl9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RvcExlZnRDb3JuZXJfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyY2IzYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RvcExlZnRDb3JuZXJfaW50X2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS50b3BMZWZ0Q29ybmVyKDIsIDIpOiIgPDwgZW5kbDsKK2NvdXQgPDwgbS50b3BMZWZ0Q29ybmVyKDIsIDIpIDw8IGVuZGw7CittLnRvcExlZnRDb3JuZXIoMiwgMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdG9wUmlnaHRDb3JuZXJfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90b3BSaWdodENvcm5lcl9pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTFmYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdG9wUmlnaHRDb3JuZXJfaW50X2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgbS50b3BSaWdodENvcm5lcigyLCAyKToiIDw8IGVuZGw7Citjb3V0IDw8IG0udG9wUmlnaHRDb3JuZXIoMiwgMikgPDwgZW5kbDsKK20udG9wUmlnaHRDb3JuZXIoMiwgMikuc2V0WmVybygpOworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdG9wUm93c19pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdG9wUm93c19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZDc1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90b3BSb3dzX2ludC5jcHAKQEAgLTAsMCArMSw2IEBACitBcnJheTQ0aSBhID0gQXJyYXk0NGk6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgYXJyYXkgYToiIDw8IGVuZGwgPDwgYSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyBhLnRvcFJvd3MoMik6IiA8PCBlbmRsOworY291dCA8PCBhLnRvcFJvd3MoMikgPDwgZW5kbDsKK2EudG9wUm93cygyKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJOb3cgdGhlIGFycmF5IGEgaXM6IiA8PCBlbmRsIDw8IGEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RyYW5zcG9zZS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90cmFuc3Bvc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZWVhODMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90cmFuc3Bvc2UuY3BwCkBAIC0wLDAgKzEsOCBAQAorTWF0cml4MmkgbSA9IE1hdHJpeDJpOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB0cmFuc3Bvc2Ugb2YgbToiIDw8IGVuZGwgPDwgbS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgY29lZmZpY2llbnQgKDEsMCkgaW4gdGhlIHRyYW5zcG9zZSBvZiBtOiIgPDwgZW5kbAorICAgICA8PCBtLnRyYW5zcG9zZSgpKDEsMCkgPDwgZW5kbDsKK2NvdXQgPDwgIkxldCB1cyBvdmVyd3JpdGUgdGhpcyBjb2VmZmljaWVudCB3aXRoIHRoZSB2YWx1ZSAwLiIgPDwgZW5kbDsKK20udHJhbnNwb3NlKCkoMSwwKSA9IDA7Citjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3plcm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjQ5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvLmNwcApAQCAtMCwwICsxLDIgQEAKK2NvdXQgPDwgTWF0cml4MmQ6Olplcm8oKSA8PCBlbmRsOworY291dCA8PCBSb3dWZWN0b3I0aTo6WmVybygpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwYTliYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3plcm9faW50LmNwcApAQCAtMCwwICsxLDIgQEAKK2NvdXQgPDwgUm93VmVjdG9yWGk6Olplcm8oNCkgPDwgZW5kbDsKK2NvdXQgPDwgVmVjdG9yWGY6Olplcm8oMikgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3plcm9faW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvX2ludF9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOTljNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvX2ludF9pbnQuY3BwCkBAIC0wLDAgKzEgQEAKK2NvdXQgPDwgTWF0cml4WGk6Olplcm8oMiwzKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfTm9DaGFuZ2VfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX05vQ2hhbmdlX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkZjE4YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX05vQ2hhbmdlX2ludC5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXhYZCBtKDMsNCk7CittLnJlc2l6ZShOb0NoYW5nZSwgNSk7Citjb3V0IDw8ICJtOiAiIDw8IG0ucm93cygpIDw8ICIgcm93cywgIiA8PCBtLmNvbHMoKSA8PCAiIGNvbHMiIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDRjNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50LmNwcApAQCAtMCwwICsxLDYgQEAKK1ZlY3RvclhkIHYoMTApOwordi5yZXNpemUoMyk7CitSb3dWZWN0b3IzZCB3Owordy5yZXNpemUoMyk7IC8vIHRoaXMgaXMgbGVnYWwsIGJ1dCBoYXMgbm8gZWZmZWN0Citjb3V0IDw8ICJ2OiAiIDw8IHYucm93cygpIDw8ICIgcm93cywgIiA8PCB2LmNvbHMoKSA8PCAiIGNvbHMiIDw8IGVuZGw7Citjb3V0IDw8ICJ3OiAiIDw8IHcucm93cygpIDw8ICIgcm93cywgIiA8PCB3LmNvbHMoKSA8PCAiIGNvbHMiIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnRfTm9DaGFuZ2UuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50X05vQ2hhbmdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM3YzkwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50X05vQ2hhbmdlLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhkIG0oMyw0KTsKK20ucmVzaXplKDUsIE5vQ2hhbmdlKTsKK2NvdXQgPDwgIm06ICIgPDwgbS5yb3dzKCkgPDwgIiByb3dzLCAiIDw8IG0uY29scygpIDw8ICIgY29scyIgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkNDc0MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludF9pbnQuY3BwCkBAIC0wLDAgKzEsOSBAQAorTWF0cml4WGQgbSgyLDMpOworbSA8PCAxLDIsMyw0LDUsNjsKK2NvdXQgPDwgImhlcmUncyB0aGUgMngzIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJsZXQncyByZXNpemUgbSB0byAzeDIuIFRoaXMgaXMgYSBjb25zZXJ2YXRpdmUgcmVzaXppbmcgYmVjYXVzZSAyKjM9PTMqMi4iIDw8IGVuZGw7CittLnJlc2l6ZSgzLDIpOworY291dCA8PCAiaGVyZSdzIHRoZSAzeDIgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIm5vdyBsZXQncyByZXNpemUgbSB0byBzaXplIDJ4Mi4gVGhpcyBpcyBOT1QgYSBjb25zZXJ2YXRpdmUgcmVzaXppbmcsIHNvIGl0IGJlY29tZXMgdW5pbml0aWFsaXplZDoiIDw8IGVuZGw7CittLnJlc2l6ZSgyLDIpOworY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3NldENvbnN0YW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldENvbnN0YW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1YTg2YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0Q29uc3RhbnRfaW50LmNwcApAQCAtMCwwICsxLDMgQEAKK1ZlY3RvclhmIHY7Cit2LnNldENvbnN0YW50KDMsIDUpOworY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3NldENvbnN0YW50X2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRDb25zdGFudF9pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmI5NTBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRDb25zdGFudF9pbnRfaW50LmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhmIG07CittLnNldENvbnN0YW50KDMsIDMsIDUpOworY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3NldElkZW50aXR5X2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRJZGVudGl0eV9pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjU5NjcxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRJZGVudGl0eV9pbnRfaW50LmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeFhmIG07CittLnNldElkZW50aXR5KDMsIDMpOworY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3NldE9uZXNfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0T25lc19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmNiMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldE9uZXNfaW50LmNwcApAQCAtMCwwICsxLDMgQEAKK1ZlY3RvclhmIHY7Cit2LnNldE9uZXMoMyk7Citjb3V0IDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0T25lc19pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0T25lc19pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmZiNjZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRPbmVzX2ludF9pbnQuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4WGYgbTsKK20uc2V0T25lcygzLCAzKTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRSYW5kb21faW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0UmFuZG9tX2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2MGRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0UmFuZG9tX2ludC5jcHAKQEAgLTAsMCArMSwzIEBACitWZWN0b3JYZiB2Owordi5zZXRSYW5kb20oMyk7Citjb3V0IDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0UmFuZG9tX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRSYW5kb21faW50X2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjZGExMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0UmFuZG9tX2ludF9pbnQuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4WGYgbTsKK20uc2V0UmFuZG9tKDMsIDMpOworY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3NldFplcm9faW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0WmVyb19pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjE2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4X3NldFplcm9faW50LmNwcApAQCAtMCwwICsxLDMgQEAKK1ZlY3RvclhmIHY7Cit2LnNldFplcm8oMyk7Citjb3V0IDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0WmVyb19pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfc2V0WmVyb19pbnRfaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDg4M2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9zZXRaZXJvX2ludF9pbnQuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4WGYgbTsKK20uc2V0WmVybygzLCAzKTsKK2NvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1BhcnRpYWxQaXZMVV9zb2x2ZS5jcHAgYi9kb2Mvc25pcHBldHMvUGFydGlhbFBpdkxVX3NvbHZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTM1NzBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1BhcnRpYWxQaXZMVV9zb2x2ZS5jcHAKQEAgLTAsMCArMSw3IEBACitNYXRyaXhYZCBBID0gTWF0cml4WGQ6OlJhbmRvbSgzLDMpOworTWF0cml4WGQgQiA9IE1hdHJpeFhkOjpSYW5kb20oMywyKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGludmVydGlibGUgbWF0cml4IEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBCOiIgPDwgZW5kbCA8PCBCIDw8IGVuZGw7CitNYXRyaXhYZCBYID0gQS5sdSgpLnNvbHZlKEIpOworY291dCA8PCAiSGVyZSBpcyB0aGUgKHVuaXF1ZSkgc29sdXRpb24gWCB0byB0aGUgZXF1YXRpb24gQVg9QjoiIDw8IGVuZGwgPDwgWCA8PCBlbmRsOworY291dCA8PCAiUmVsYXRpdmUgZXJyb3I6ICIgPDwgKEEqWC1CKS5ub3JtKCkgLyBCLm5vcm0oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9jb3VudC5jcHAgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X2NvdW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2IzMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9jb3VudC5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGNvdW50IG9mIGVsZW1lbnRzIGxhcmdlciBvciBlcXVhbCB0aGFuIDAuNSBvZiBlYWNoIHJvdzoiIDw8IGVuZGwgPDwgKG0uYXJyYXkoKSA+PSAwLjUpLnJvd3dpc2UoKS5jb3VudCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X21heENvZWZmLmNwcCBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfbWF4Q29lZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZmQzODIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X21heENvZWZmLmNwcApAQCAtMCwwICsxLDMgQEAKK01hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF4aW11bSBvZiBlYWNoIGNvbHVtbjoiIDw8IGVuZGwgPDwgbS5jb2x3aXNlKCkubWF4Q29lZmYoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9taW5Db2VmZi5jcHAgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X21pbkNvZWZmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzE3YmMwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9taW5Db2VmZi5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1pbmltdW0gb2YgZWFjaCBjb2x1bW46IiA8PCBlbmRsIDw8IG0uY29sd2lzZSgpLm1pbkNvZWZmKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfbm9ybS5jcHAgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X25vcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiY2YyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X25vcm0uY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBub3JtIG9mIGVhY2ggY29sdW1uOiIgPDwgZW5kbCA8PCBtLmNvbHdpc2UoKS5ub3JtKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfcHJvZC5jcHAgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X3Byb2QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhY2YwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X3Byb2QuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBwcm9kdWN0IG9mIGVhY2ggcm93OiIgPDwgZW5kbCA8PCBtLnJvd3dpc2UoKS5wcm9kKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfc3F1YXJlZE5vcm0uY3BwIGIvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9zcXVhcmVkTm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzMjkzZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUmVkdXhfc3F1YXJlZE5vcm0uY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBzcXVhcmUgbm9ybSBvZiBlYWNoIHJvdzoiIDw8IGVuZGwgPDwgbS5yb3d3aXNlKCkuc3F1YXJlZE5vcm0oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9zdW0uY3BwIGIvZG9jL3NuaXBwZXRzL1BhcnRpYWxSZWR1eF9zdW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODJkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvUGFydGlhbFJlZHV4X3N1bS5jcHAKQEAgLTAsMCArMSwzIEBACitNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHN1bSBvZiBlYWNoIHJvdzoiIDw8IGVuZGwgPDwgbS5yb3d3aXNlKCkuc3VtKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9SZWFsU2NodXJfUmVhbFNjaHVyX01hdHJpeFR5cGUuY3BwIGIvZG9jL3NuaXBwZXRzL1JlYWxTY2h1cl9SZWFsU2NodXJfTWF0cml4VHlwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1MzBkYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9SZWFsU2NodXJfUmVhbFNjaHVyX01hdHJpeFR5cGUuY3BwCkBAIC0wLDAgKzEsMTAgQEAKK01hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsNik7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDZ4NiBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOworCitSZWFsU2NodXI8TWF0cml4WGQ+IHNjaHVyKEEpOworY291dCA8PCAiVGhlIG9ydGhvZ29uYWwgbWF0cml4IFUgaXM6IiA8PCBlbmRsIDw8IHNjaHVyLm1hdHJpeFUoKSA8PCBlbmRsOworY291dCA8PCAiVGhlIHF1YXNpLXRyaWFuZ3VsYXIgbWF0cml4IFQgaXM6IiA8PCBlbmRsIDw8IHNjaHVyLm1hdHJpeFQoKSA8PCBlbmRsIDw8IGVuZGw7CisKK01hdHJpeFhkIFUgPSBzY2h1ci5tYXRyaXhVKCk7CitNYXRyaXhYZCBUID0gc2NodXIubWF0cml4VCgpOworY291dCA8PCAiVSAqIFQgKiBVXlQgPSAiIDw8IGVuZGwgPDwgVSAqIFQgKiBVLnRyYW5zcG9zZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvUmVhbFNjaHVyX2NvbXB1dGUuY3BwIGIvZG9jL3NuaXBwZXRzL1JlYWxTY2h1cl9jb21wdXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGMyNjExCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1JlYWxTY2h1cl9jb21wdXRlLmNwcApAQCAtMCwwICsxLDYgQEAKK01hdHJpeFhmIEEgPSBNYXRyaXhYZjo6UmFuZG9tKDQsNCk7CitSZWFsU2NodXI8TWF0cml4WGY+IHNjaHVyKDQpOworc2NodXIuY29tcHV0ZShBLCAvKiBjb21wdXRlVSA9ICovIGZhbHNlKTsKK2NvdXQgPDwgIlRoZSBtYXRyaXggVCBpbiB0aGUgZGVjb21wb3NpdGlvbiBvZiBBIGlzOiIgPDwgZW5kbCA8PCBzY2h1ci5tYXRyaXhUKCkgPDwgZW5kbDsKK3NjaHVyLmNvbXB1dGUoQS5pbnZlcnNlKCksIC8qIGNvbXB1dGVVID0gKi8gZmFsc2UpOworY291dCA8PCAiVGhlIG1hdHJpeCBUIGluIHRoZSBkZWNvbXBvc2l0aW9uIG9mIEFeKC0xKSBpczoiIDw8IGVuZGwgPDwgc2NodXIubWF0cml4VCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTdmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcApAQCAtMCwwICsxLDcgQEAKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4NGY+IGVzOworTWF0cml4NGYgWCA9IE1hdHJpeDRmOjpSYW5kb20oNCw0KTsKK01hdHJpeDRmIEEgPSBYICsgWC50cmFuc3Bvc2UoKTsKK2VzLmNvbXB1dGUoQSk7Citjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQSBhcmU6ICIgPDwgZXMuZWlnZW52YWx1ZXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworZXMuY29tcHV0ZShBICsgTWF0cml4NGY6OklkZW50aXR5KDQsNCkpOyAvLyByZS11c2UgZXMgdG8gY29tcHV0ZSBlaWdlbnZhbHVlcyBvZiBBK0kKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiBBK0kgYXJlOiAiIDw8IGVzLmVpZ2VudmFsdWVzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfTWF0cml4VHlwZS5jcHAgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTliMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwCkBAIC0wLDAgKzEsMTcgQEAKK01hdHJpeFhkIFggPSBNYXRyaXhYZDo6UmFuZG9tKDUsNSk7CitNYXRyaXhYZCBBID0gWCArIFgudHJhbnNwb3NlKCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHN5bW1ldHJpYyA1eDUgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKKworU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMoQSk7Citjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQSBhcmU6IiA8PCBlbmRsIDw8IGVzLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSBtYXRyaXggb2YgZWlnZW52ZWN0b3JzLCBWLCBpczoiIDw8IGVuZGwgPDwgZXMuZWlnZW52ZWN0b3JzKCkgPDwgZW5kbCA8PCBlbmRsOworCitkb3VibGUgbGFtYmRhID0gZXMuZWlnZW52YWx1ZXMoKVswXTsKK2NvdXQgPDwgIkNvbnNpZGVyIHRoZSBmaXJzdCBlaWdlbnZhbHVlLCBsYW1iZGEgPSAiIDw8IGxhbWJkYSA8PCBlbmRsOworVmVjdG9yWGQgdiA9IGVzLmVpZ2VudmVjdG9ycygpLmNvbCgwKTsKK2NvdXQgPDwgIklmIHYgaXMgdGhlIGNvcnJlc3BvbmRpbmcgZWlnZW52ZWN0b3IsIHRoZW4gbGFtYmRhICogdiA9ICIgPDwgZW5kbCA8PCBsYW1iZGEgKiB2IDw8IGVuZGw7Citjb3V0IDw8ICIuLi4gYW5kIEEgKiB2ID0gIiA8PCBlbmRsIDw8IEEgKiB2IDw8IGVuZGwgPDwgZW5kbDsKKworTWF0cml4WGQgRCA9IGVzLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpOworTWF0cml4WGQgViA9IGVzLmVpZ2VudmVjdG9ycygpOworY291dCA8PCAiRmluYWxseSwgViAqIEQgKiBWXigtMSkgPSAiIDw8IGVuZGwgPDwgViAqIEQgKiBWLmludmVyc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlMi5jcHAgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI4MjFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlMi5jcHAKQEAgLTAsMCArMSwxNiBAQAorTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNSw1KTsKK01hdHJpeFhkIEEgPSBYICsgWC50cmFuc3Bvc2UoKTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gc3ltbWV0cmljIG1hdHJpeCwgQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOworWCA9IE1hdHJpeFhkOjpSYW5kb20oNSw1KTsKK01hdHJpeFhkIEIgPSBYICogWC50cmFuc3Bvc2UoKTsKK2NvdXQgPDwgImFuZCBhIHJhbmRvbSBwb3N0aXZlLWRlZmluaXRlIG1hdHJpeCwgQjoiIDw8IGVuZGwgPDwgQiA8PCBlbmRsIDw8IGVuZGw7CisKK0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMoQSxCKTsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgcGVuY2lsIChBLEIpIGFyZToiIDw8IGVuZGwgPDwgZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOworY291dCA8PCAiVGhlIG1hdHJpeCBvZiBlaWdlbnZlY3RvcnMsIFYsIGlzOiIgPDwgZW5kbCA8PCBlcy5laWdlbnZlY3RvcnMoKSA8PCBlbmRsIDw8IGVuZGw7CisKK2RvdWJsZSBsYW1iZGEgPSBlcy5laWdlbnZhbHVlcygpWzBdOworY291dCA8PCAiQ29uc2lkZXIgdGhlIGZpcnN0IGVpZ2VudmFsdWUsIGxhbWJkYSA9ICIgPDwgbGFtYmRhIDw8IGVuZGw7CitWZWN0b3JYZCB2ID0gZXMuZWlnZW52ZWN0b3JzKCkuY29sKDApOworY291dCA8PCAiSWYgdiBpcyB0aGUgY29ycmVzcG9uZGluZyBlaWdlbnZlY3RvciwgdGhlbiBBICogdiA9ICIgPDwgZW5kbCA8PCBBICogdiA8PCBlbmRsOworY291dCA8PCAiLi4uIGFuZCBsYW1iZGEgKiBCICogdiA9ICIgPDwgZW5kbCA8PCBsYW1iZGEgKiBCICogdiA8PCBlbmRsIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfY29tcHV0ZV9NYXRyaXhUeXBlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTc1Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfY29tcHV0ZV9NYXRyaXhUeXBlLmNwcApAQCAtMCwwICsxLDcgQEAKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGY+IGVzKDQpOworTWF0cml4WGYgWCA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKK01hdHJpeFhmIEEgPSBYICsgWC50cmFuc3Bvc2UoKTsKK2VzLmNvbXB1dGUoQSk7Citjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQSBhcmU6ICIgPDwgZXMuZWlnZW52YWx1ZXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworZXMuY29tcHV0ZShBICsgTWF0cml4WGY6OklkZW50aXR5KDQsNCkpOyAvLyByZS11c2UgZXMgdG8gY29tcHV0ZSBlaWdlbnZhbHVlcyBvZiBBK0kKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiBBK0kgYXJlOiAiIDw8IGVzLmVpZ2VudmFsdWVzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2NvbXB1dGVfTWF0cml4VHlwZTIuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfY29tcHV0ZV9NYXRyaXhUeXBlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjOTJhMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2NvbXB1dGVfTWF0cml4VHlwZTIuY3BwCkBAIC0wLDAgKzEsOSBAQAorTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNSw1KTsKK01hdHJpeFhkIEEgPSBYICogWC50cmFuc3Bvc2UoKTsKK1ggPSBNYXRyaXhYZDo6UmFuZG9tKDUsNSk7CitNYXRyaXhYZCBCID0gWCAqIFgudHJhbnNwb3NlKCk7CisKK0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMoQSxCLEVpZ2VudmFsdWVzT25seSk7Citjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgdGhlIHBlbmNpbCAoQSxCKSBhcmU6IiA8PCBlbmRsIDw8IGVzLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKK2VzLmNvbXB1dGUoQixBLGZhbHNlKTsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgcGVuY2lsIChCLEEpIGFyZToiIDw8IGVuZGwgPDwgZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZjMzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9laWdlbnZhbHVlcy5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywzKTsKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKG9uZXMpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgYXJlOiIgCisgICAgIDw8IGVuZGwgPDwgZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjOGIwZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywzKTsKK1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKG9uZXMpOworY291dCA8PCAiVGhlIGZpcnN0IGVpZ2VudmVjdG9yIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgaXM6IiAKKyAgICAgPDwgZW5kbCA8PCBlcy5laWdlbnZlY3RvcnMoKS5jb2woMSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9ySW52ZXJzZVNxcnQuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfb3BlcmF0b3JJbnZlcnNlU3FydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0YzY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9ySW52ZXJzZVNxcnQuY3BwCkBAIC0wLDAgKzEsOSBAQAorTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNCw0KTsKK01hdHJpeFhkIEEgPSBYICogWC50cmFuc3Bvc2UoKTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gcG9zaXRpdmUtZGVmaW5pdGUgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKKworU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMoQSk7Citjb3V0IDw8ICJUaGUgaW52ZXJzZSBzcXVhcmUgcm9vdCBvZiBBIGlzOiAiIDw8IGVuZGw7Citjb3V0IDw8IGVzLm9wZXJhdG9ySW52ZXJzZVNxcnQoKSA8PCBlbmRsOworY291dCA8PCAiV2UgY2FuIGFsc28gY29tcHV0ZSBpdCB3aXRoIG9wZXJhdG9yU3FydCgpIGFuZCBpbnZlcnNlKCkuIFRoYXQgeWllbGRzOiAiIDw8IGVuZGw7Citjb3V0IDw8IGVzLm9wZXJhdG9yU3FydCgpLmludmVyc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfb3BlcmF0b3JTcXJ0LmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9yU3FydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhY2NhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9yU3FydC5jcHAKQEAgLTAsMCArMSw4IEBACitNYXRyaXhYZCBYID0gTWF0cml4WGQ6OlJhbmRvbSg0LDQpOworTWF0cml4WGQgQSA9IFggKiBYLnRyYW5zcG9zZSgpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBwb3NpdGl2ZS1kZWZpbml0ZSBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOworCitTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhBKTsKK01hdHJpeFhkIHNxcnRBID0gZXMub3BlcmF0b3JTcXJ0KCk7Citjb3V0IDw8ICJUaGUgc3F1YXJlIHJvb3Qgb2YgQSBpczogIiA8PCBlbmRsIDw8IHNxcnRBIDw8IGVuZGw7Citjb3V0IDw8ICJJZiB3ZSBzcXVhcmUgdGhpcywgd2UgZ2V0OiAiIDw8IGVuZGwgPDwgc3FydEEqc3FydEEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludFZpZXdfZWlnZW52YWx1ZXMuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50Vmlld19laWdlbnZhbHVlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxOTg2NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludFZpZXdfZWlnZW52YWx1ZXMuY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7CitWZWN0b3JYZCBlaXZhbHMgPSBvbmVzLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5laWdlbnZhbHVlcygpOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgYXJlOiIgPDwgZW5kbCA8PCBlaXZhbHMgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludFZpZXdfb3BlcmF0b3JOb3JtLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludFZpZXdfb3BlcmF0b3JOb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzgwZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50Vmlld19vcGVyYXRvck5vcm0uY3BwCkBAIC0wLDAgKzEsMyBAQAorTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7Citjb3V0IDw8ICJUaGUgb3BlcmF0b3Igbm9ybSBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGlzICIKKyAgICAgPDwgb25lcy5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkub3BlcmF0b3JOb3JtKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzI4MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfYmxvY2suY3BwCkBAIC0wLDAgKzEsNyBAQAorTWF0cml4WGkgbWF0KDMsMyk7IAorbWF0IDw8IDEsIDIsIDMsICAgNCwgNSwgNiwgICA3LCA4LCA5OworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG1hdDpcbiIgPDwgbWF0IDw8IGVuZGw7CisKKy8vIFRoaXMgYXNzaWdubWVudCBzaG93cyB0aGUgYWxpYXNpbmcgcHJvYmxlbQorbWF0LmJvdHRvbVJpZ2h0Q29ybmVyKDIsMikgPSBtYXQudG9wTGVmdENvcm5lcigyLDIpOworY291dCA8PCAiQWZ0ZXIgdGhlIGFzc2lnbm1lbnQsIG1hdCA9IFxuIiA8PCBtYXQgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrX2NvcnJlY3QuY3BwIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfYmxvY2tfY29ycmVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlZTU4MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrX2NvcnJlY3QuY3BwCkBAIC0wLDAgKzEsNyBAQAorTWF0cml4WGkgbWF0KDMsMyk7IAorbWF0IDw8IDEsIDIsIDMsICAgNCwgNSwgNiwgICA3LCA4LCA5OworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG1hdDpcbiIgPDwgbWF0IDw8IGVuZGw7CisKKy8vIFRoZSBldmFsKCkgc29sdmVzIHRoZSBhbGlhc2luZyBwcm9ibGVtCittYXQuYm90dG9tUmlnaHRDb3JuZXIoMiwyKSA9IG1hdC50b3BMZWZ0Q29ybmVyKDIsMikuZXZhbCgpOworY291dCA8PCAiQWZ0ZXIgdGhlIGFzc2lnbm1lbnQsIG1hdCA9IFxuIiA8PCBtYXQgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2N3aXNlLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2N3aXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQ5ZjZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfY3dpc2UuY3BwCkBAIC0wLDAgKzEsMjAgQEAKK01hdHJpeFhmIG1hdCgyLDIpOyAKK21hdCA8PCAxLCAyLCAgNCwgNzsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtYXQ6XG4iIDw8IG1hdCA8PCBlbmRsIDw8IGVuZGw7CisKK21hdCA9IDIgKiBtYXQ7Citjb3V0IDw8ICJBZnRlciAnbWF0ID0gMiAqIG1hdCcsIG1hdCA9IFxuIiA8PCBtYXQgPDwgZW5kbCA8PCBlbmRsOworCisKK21hdCA9IG1hdCAtIE1hdHJpeFhmOjpJZGVudGl0eSgyLDIpOworY291dCA8PCAiQWZ0ZXIgdGhlIHN1YnRyYWN0aW9uLCBpdCBiZWNvbWVzXG4iIDw8IG1hdCA8PCBlbmRsIDw8IGVuZGw7CisKKworQXJyYXlYWGYgYXJyID0gbWF0OworYXJyID0gYXJyLnNxdWFyZSgpOworY291dCA8PCAiQWZ0ZXIgc3F1YXJpbmcsIGl0IGJlY29tZXNcbiIgPDwgYXJyIDw8IGVuZGwgPDwgZW5kbDsKKworLy8gQ29tYmluaW5nIGFsbCBvcGVyYXRpb25zIGluIG9uZSBzdGF0ZW1lbnQ6CittYXQgPDwgMSwgMiwgIDQsIDc7CittYXQgPSAoMiAqIG1hdCAtIE1hdHJpeFhmOjpJZGVudGl0eSgyLDIpKS5hcnJheSgpLnNxdWFyZSgpOworY291dCA8PCAiRG9pbmcgZXZlcnl0aGluZyBhdCBvbmNlIHlpZWxkc1xuIiA8PCBtYXQgPDwgZW5kbCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDEuY3BwIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkN2U5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0MS5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZiBtYXRBKDIsMik7IAorbWF0QSA8PCAyLCAwLCAgMCwgMjsKK21hdEEgPSBtYXRBICogbWF0QTsKK2NvdXQgPDwgbWF0QTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQyLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZmNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDIuY3BwCkBAIC0wLDAgKzEsMTAgQEAKK01hdHJpeFhmIG1hdEEoMiwyKSwgbWF0QigyLDIpOyAKK21hdEEgPDwgMiwgMCwgIDAsIDI7CisKKy8vIFNpbXBsZSBidXQgbm90IHF1aXRlIGFzIGVmZmljaWVudAorbWF0QiA9IG1hdEEgKiBtYXRBOworY291dCA8PCBtYXRCIDw8IGVuZGwgPDwgZW5kbDsKKworLy8gTW9yZSBjb21wbGljYXRlZCBidXQgYWxzbyBtb3JlIGVmZmljaWVudAorbWF0Qi5ub2FsaWFzKCkgPSBtYXRBICogbWF0QTsKK2NvdXQgPDwgbWF0QjsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQzLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDEyYTZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDMuY3BwCkBAIC0wLDAgKzEsNCBAQAorTWF0cml4WGYgbWF0QSgyLDIpOyAKK21hdEEgPDwgMiwgMCwgIDAsIDI7CittYXRBLm5vYWxpYXMoKSA9IG1hdEEgKiBtYXRBOworY291dCA8PCBtYXRBOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RvcGljU3RvcmFnZU9yZGVyc19leGFtcGxlLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY1N0b3JhZ2VPcmRlcnNfZXhhbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyM2VmMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9Ub3BpY1N0b3JhZ2VPcmRlcnNfZXhhbXBsZS5jcHAKQEAgLTAsMCArMSwxOCBAQAorTWF0cml4PGludCwgMywgNCwgQ29sTWFqb3I+IEFjb2xtYWpvcjsKK0Fjb2xtYWpvciA8PCA4LCAyLCAyLCA5LAorICAgICAgICAgICAgIDksIDEsIDQsIDQsCisJICAgICAzLCA1LCA0LCA1OworY291dCA8PCAiVGhlIG1hdHJpeCBBOiIgPDwgZW5kbDsKK2NvdXQgPDwgQWNvbG1ham9yIDw8IGVuZGwgPDwgZW5kbDsgCisKK2NvdXQgPDwgIkluIG1lbW9yeSAoY29sdW1uLW1ham9yKToiIDw8IGVuZGw7Citmb3IgKGludCBpID0gMDsgaSA8IEFjb2xtYWpvci5zaXplKCk7IGkrKykKKyAgY291dCA8PCAqKEFjb2xtYWpvci5kYXRhKCkgKyBpKSA8PCAiICAiOworY291dCA8PCBlbmRsIDw8IGVuZGw7CisKK01hdHJpeDxpbnQsIDMsIDQsIFJvd01ham9yPiBBcm93bWFqb3IgPSBBY29sbWFqb3I7Citjb3V0IDw8ICJJbiBtZW1vcnkgKHJvdy1tYWpvcik6IiA8PCBlbmRsOworZm9yIChpbnQgaSA9IDA7IGkgPCBBcm93bWFqb3Iuc2l6ZSgpOyBpKyspCisgIGNvdXQgPDwgKihBcm93bWFqb3IuZGF0YSgpICsgaSkgPDwgIiAgIjsKK2NvdXQgPDwgZW5kbDsKKwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9UcmlkaWFnb25hbGl6YXRpb25fTWF0cml4VHlwZS5jcHAgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX1RyaWRpYWdvbmFsaXphdGlvbl9NYXRyaXhUeXBlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjYwMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9UcmlkaWFnb25hbGl6YXRpb25fTWF0cml4VHlwZS5jcHAKQEAgLTAsMCArMSw5IEBACitNYXRyaXhYZCBYID0gTWF0cml4WGQ6OlJhbmRvbSg1LDUpOworTWF0cml4WGQgQSA9IFggKyBYLnRyYW5zcG9zZSgpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBzeW1tZXRyaWMgNXg1IG1hdHJpeDoiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CitUcmlkaWFnb25hbGl6YXRpb248TWF0cml4WGQ+IHRyaU9mQShBKTsKK01hdHJpeFhkIFEgPSB0cmlPZkEubWF0cml4USgpOworY291dCA8PCAiVGhlIG9ydGhvZ29uYWwgbWF0cml4IFEgaXM6IiA8PCBlbmRsIDw8IFEgPDwgZW5kbDsKK01hdHJpeFhkIFQgPSB0cmlPZkEubWF0cml4VCgpOworY291dCA8PCAiVGhlIHRyaWRpYWdvbmFsIG1hdHJpeCBUIGlzOiIgPDwgZW5kbCA8PCBUIDw8IGVuZGwgPDwgZW5kbDsKK2NvdXQgPDwgIlEgKiBUICogUV5UID0gIiA8PCBlbmRsIDw8IFEgKiBUICogUS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fY29tcHV0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2MmE5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fY29tcHV0ZS5jcHAKQEAgLTAsMCArMSw5IEBACitUcmlkaWFnb25hbGl6YXRpb248TWF0cml4WGY+IHRyaTsKK01hdHJpeFhmIFggPSBNYXRyaXhYZjo6UmFuZG9tKDQsNCk7CitNYXRyaXhYZiBBID0gWCArIFgudHJhbnNwb3NlKCk7Cit0cmkuY29tcHV0ZShBKTsKK2NvdXQgPDwgIlRoZSBtYXRyaXggVCBpbiB0aGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBBIGlzOiAiIDw8IGVuZGw7Citjb3V0IDw8IHRyaS5tYXRyaXhUKCkgPDwgZW5kbDsKK3RyaS5jb21wdXRlKDIqQSk7IC8vIHJlLXVzZSB0cmkgdG8gY29tcHV0ZSBlaWdlbnZhbHVlcyBvZiAyQQorY291dCA8PCAiVGhlIG1hdHJpeCBUIGluIHRoZSB0cmlkaWFnb25hbCBkZWNvbXBvc2l0aW9uIG9mIDJBIGlzOiAiIDw8IGVuZGw7Citjb3V0IDw8IHRyaS5tYXRyaXhUKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fZGVjb21wb3NlSW5QbGFjZS5jcHAgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2RlY29tcG9zZUluUGxhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGNmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2RlY29tcG9zZUluUGxhY2UuY3BwCkBAIC0wLDAgKzEsMTAgQEAKK01hdHJpeFhkIFggPSBNYXRyaXhYZDo6UmFuZG9tKDUsNSk7CitNYXRyaXhYZCBBID0gWCArIFgudHJhbnNwb3NlKCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHN5bW1ldHJpYyA1eDUgbWF0cml4OiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKKworVmVjdG9yWGQgZGlhZyg1KTsKK1ZlY3RvclhkIHN1YmRpYWcoNCk7CitpbnRlcm5hbDo6dHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2UoQSwgZGlhZywgc3ViZGlhZywgdHJ1ZSk7Citjb3V0IDw8ICJUaGUgb3J0aG9nb25hbCBtYXRyaXggUSBpczoiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOworY291dCA8PCAiVGhlIGRpYWdvbmFsIG9mIHRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpczoiIDw8IGVuZGwgPDwgZGlhZyA8PCBlbmRsOworY291dCA8PCAiVGhlIHN1YmRpYWdvbmFsIG9mIHRoZSB0cmlkaWFnb25hbCBtYXRyaXggVCBpczoiIDw8IGVuZGwgPDwgc3ViZGlhZyA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kaWFnb25hbC5jcHAgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2RpYWdvbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWVjODIxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kaWFnb25hbC5jcHAKQEAgLTAsMCArMSwxMyBAQAorTWF0cml4WGNkIFggPSBNYXRyaXhYY2Q6OlJhbmRvbSg0LDQpOworTWF0cml4WGNkIEEgPSBYICsgWC5hZGpvaW50KCk7Citjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHNlbGYtYWRqb2ludCA0eDQgbWF0cml4OiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKKworVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFhjZD4gdHJpT2ZBKEEpOworTWF0cml4WGQgVCA9IHRyaU9mQS5tYXRyaXhUKCk7Citjb3V0IDw8ICJUaGUgdHJpZGlhZ29uYWwgbWF0cml4IFQgaXM6IiA8PCBlbmRsIDw8IFQgPDwgZW5kbCA8PCBlbmRsOworCitjb3V0IDw8ICJXZSBjYW4gYWxzbyBleHRyYWN0IHRoZSBkaWFnb25hbHMgb2YgVCBkaXJlY3RseSAuLi4iIDw8IGVuZGw7CitWZWN0b3JYZCBkaWFnID0gdHJpT2ZBLmRpYWdvbmFsKCk7Citjb3V0IDw8ICJUaGUgZGlhZ29uYWwgaXM6IiA8PCBlbmRsIDw8IGRpYWcgPDwgZW5kbDsgCitWZWN0b3JYZCBzdWJkaWFnID0gdHJpT2ZBLnN1YkRpYWdvbmFsKCk7Citjb3V0IDw8ICJUaGUgc3ViZGlhZ29uYWwgaXM6IiA8PCBlbmRsIDw8IHN1YmRpYWcgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25faG91c2Vob2xkZXJDb2VmZmljaWVudHMuY3BwIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9ob3VzZWhvbGRlckNvZWZmaWNpZW50cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkODcyOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25faG91c2Vob2xkZXJDb2VmZmljaWVudHMuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4NGQgWCA9IE1hdHJpeDRkOjpSYW5kb20oNCw0KTsKK01hdHJpeDRkIEEgPSBYICsgWC50cmFuc3Bvc2UoKTsKK2NvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gc3ltbWV0cmljIDR4NCBtYXRyaXg6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK1RyaWRpYWdvbmFsaXphdGlvbjxNYXRyaXg0ZD4gdHJpT2ZBKEEpOworVmVjdG9yM2QgaGMgPSB0cmlPZkEuaG91c2Vob2xkZXJDb2VmZmljaWVudHMoKTsKK2NvdXQgPDwgIlRoZSB2ZWN0b3Igb2YgSG91c2Vob2xkZXIgY29lZmZpY2llbnRzIGlzOiIgPDwgZW5kbCA8PCBoYyA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9wYWNrZWRNYXRyaXguY3BwIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9wYWNrZWRNYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNTVkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX3BhY2tlZE1hdHJpeC5jcHAKQEAgLTAsMCArMSw4IEBACitNYXRyaXg0ZCBYID0gTWF0cml4NGQ6OlJhbmRvbSg0LDQpOworTWF0cml4NGQgQSA9IFggKyBYLnRyYW5zcG9zZSgpOworY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBzeW1tZXRyaWMgNHg0IG1hdHJpeDoiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOworVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeDRkPiB0cmlPZkEoQSk7CitNYXRyaXg0ZCBwbSA9IHRyaU9mQS5wYWNrZWRNYXRyaXgoKTsKK2NvdXQgPDwgIlRoZSBwYWNrZWQgbWF0cml4IE0gaXM6IiA8PCBlbmRsIDw8IHBtIDw8IGVuZGw7Citjb3V0IDw8ICJUaGUgZGlhZ29uYWwgYW5kIHN1YmRpYWdvbmFsIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXRyaXggVCwgd2hpY2ggaXM6IiAKKyAgICAgPDwgZW5kbCA8PCB0cmlPZkEubWF0cml4VCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9CbG9jay5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9CbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlNDBhYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0Jsb2NrLmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeFhmIG1hdEEoMiwgMik7CittYXRBIDw8IDEsIDIsIDMsIDQ7CitNYXRyaXhYZiBtYXRCKDQsIDQpOworbWF0QiA8PCBtYXRBLCBtYXRBLzEwLCBtYXRBLzEwLCBtYXRBOworc3RkOjpjb3V0IDw8IG1hdEIgPDwgc3RkOjplbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQ29tbWFUZW1wb3JhcnkuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQ29tbWFUZW1wb3JhcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2ZmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9Db21tYVRlbXBvcmFyeS5jcHAKQEAgLTAsMCArMSw0IEBACitNYXRyaXhYZiBtYXQgPSBNYXRyaXhYZjo6UmFuZG9tKDIsIDMpOworc3RkOjpjb3V0IDw8IG1hdCA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworbWF0ID0gKE1hdHJpeFhmKDIsMikgPDwgMCwgMSwgMSwgMCkuZmluaXNoZWQoKSAqIG1hdDsKK3N0ZDo6Y291dCA8PCBtYXQgPDwgc3RkOjplbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fSm9pbi5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9Kb2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGU4NzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fSm9pbi5jcHAKQEAgLTAsMCArMSwxMSBAQAorUm93VmVjdG9yWGQgdmVjMSgzKTsKK3ZlYzEgPDwgMSwgMiwgMzsKK3N0ZDo6Y291dCA8PCAidmVjMSA9ICIgPDwgdmVjMSA8PCBzdGQ6OmVuZGw7CisKK1Jvd1ZlY3RvclhkIHZlYzIoNCk7Cit2ZWMyIDw8IDEsIDQsIDksIDE2OzsKK3N0ZDo6Y291dCA8PCAidmVjMiA9ICIgPDwgdmVjMiA8PCBzdGQ6OmVuZGw7CisKK1Jvd1ZlY3RvclhkIGpvaW5lZCg3KTsKK2pvaW5lZCA8PCB2ZWMxLCB2ZWMyOworc3RkOjpjb3V0IDw8ICJqb2luZWQgPSAiIDw8IGpvaW5lZCA8PCBzdGQ6OmVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9MaW5TcGFjZWQuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fTGluU3BhY2VkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmE3M2FiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fTGluU3BhY2VkLmNwcApAQCAtMCwwICsxLDcgQEAKK0FycmF5WFhmIHRhYmxlKDEwLCA0KTsKK3RhYmxlLmNvbCgwKSA9IEFycmF5WGY6OkxpblNwYWNlZCgxMCwgMCwgOTApOwordGFibGUuY29sKDEpID0gTV9QSSAvIDE4MCAqIHRhYmxlLmNvbCgwKTsKK3RhYmxlLmNvbCgyKSA9IHRhYmxlLmNvbCgxKS5zaW4oKTsKK3RhYmxlLmNvbCgzKSA9IHRhYmxlLmNvbCgxKS5jb3MoKTsKK3N0ZDo6Y291dCA8PCAiICBEZWdyZWVzICAgUmFkaWFucyAgICAgIFNpbmUgICAgQ29zaW5lXG4iOworc3RkOjpjb3V0IDw8IHRhYmxlIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1RocmVlV2F5cy5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9UaHJlZVdheXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzQ1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9UaHJlZVdheXMuY3BwCkBAIC0wLDAgKzEsMjAgQEAKK2NvbnN0IGludCBzaXplID0gNjsKK01hdHJpeFhkIG1hdDEoc2l6ZSwgc2l6ZSk7CittYXQxLnRvcExlZnRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpICAgICA9IE1hdHJpeFhkOjpaZXJvKHNpemUvMiwgc2l6ZS8yKTsKK21hdDEudG9wUmlnaHRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpICAgID0gTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKTsKK21hdDEuYm90dG9tTGVmdENvcm5lcihzaXplLzIsIHNpemUvMikgID0gTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKTsKK21hdDEuYm90dG9tUmlnaHRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpID0gTWF0cml4WGQ6Olplcm8oc2l6ZS8yLCBzaXplLzIpOworc3RkOjpjb3V0IDw8IG1hdDEgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworTWF0cml4WGQgbWF0MihzaXplLCBzaXplKTsKK21hdDIudG9wTGVmdENvcm5lcihzaXplLzIsIHNpemUvMikuc2V0WmVybygpOworbWF0Mi50b3BSaWdodENvcm5lcihzaXplLzIsIHNpemUvMikuc2V0SWRlbnRpdHkoKTsKK21hdDIuYm90dG9tTGVmdENvcm5lcihzaXplLzIsIHNpemUvMikuc2V0SWRlbnRpdHkoKTsKK21hdDIuYm90dG9tUmlnaHRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpLnNldFplcm8oKTsKK3N0ZDo6Y291dCA8PCBtYXQyIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKK01hdHJpeFhkIG1hdDMoc2l6ZSwgc2l6ZSk7CittYXQzIDw8IE1hdHJpeFhkOjpaZXJvKHNpemUvMiwgc2l6ZS8yKSwgTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKSwKKyAgICAgICAgTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKSwgTWF0cml4WGQ6Olplcm8oc2l6ZS8yLCBzaXplLzIpOworc3RkOjpjb3V0IDw8IG1hdDMgPDwgc3RkOjplbmRsOworCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9aZXJvLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1plcm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTM2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9aZXJvLmNwcApAQCAtMCwwICsxLDEzIEBACitzdGQ6OmNvdXQgPDwgIkEgZml4ZWQtc2l6ZSBhcnJheTpcbiI7CitBcnJheTMzZiBhMSA9IEFycmF5MzNmOjpaZXJvKCk7CitzdGQ6OmNvdXQgPDwgYTEgPDwgIlxuXG4iOworCisKK3N0ZDo6Y291dCA8PCAiQSBvbmUtZGltZW5zaW9uYWwgZHluYW1pYy1zaXplIGFycmF5OlxuIjsKK0FycmF5WGYgYTIgPSBBcnJheVhmOjpaZXJvKDMpOworc3RkOjpjb3V0IDw8IGEyIDw8ICJcblxuIjsKKworCitzdGQ6OmNvdXQgPDwgIkEgdHdvLWRpbWVuc2lvbmFsIGR5bmFtaWMtc2l6ZSBhcnJheTpcbiI7CitBcnJheVhYZiBhMyA9IEFycmF5WFhmOjpaZXJvKDMsIDQpOworc3RkOjpjb3V0IDw8IGEzIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfTWFwX3Jvd21ham9yLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfcm93bWFqb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNDVhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfTWFwX3Jvd21ham9yLmNwcApAQCAtMCwwICsxLDcgQEAKK2ludCBhcnJheVs4XTsKK2ZvcihpbnQgaSA9IDA7IGkgPCA4OyArK2kpIGFycmF5W2ldID0gaTsKK2NvdXQgPDwgIkNvbHVtbi1tYWpvcjpcbiIgPDwgTWFwPE1hdHJpeDxpbnQsMiw0PiA+KGFycmF5KSA8PCBlbmRsOworY291dCA8PCAiUm93LW1ham9yOlxuIiA8PCBNYXA8TWF0cml4PGludCwyLDQsUm93TWFqb3I+ID4oYXJyYXkpIDw8IGVuZGw7Citjb3V0IDw8ICJSb3ctbWFqb3IgdXNpbmcgc3RyaWRlOlxuIiA8PAorICBNYXA8TWF0cml4PGludCwyLDQ+LCBVbmFsaWduZWQsIFN0cmlkZTwxLDQ+ID4oYXJyYXkpIDw8IGVuZGw7CisKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfdXNpbmcuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX01hcF91c2luZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlNDk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfdXNpbmcuY3BwCkBAIC0wLDAgKzEsMjEgQEAKK3R5cGVkZWYgTWF0cml4PGZsb2F0LDEsRHluYW1pYz4gTWF0cml4VHlwZTsKK3R5cGVkZWYgTWFwPE1hdHJpeFR5cGU+IE1hcFR5cGU7Cit0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXhUeXBlPiBNYXBUeXBlQ29uc3Q7ICAgLy8gYSByZWFkLW9ubHkgbWFwCitjb25zdCBpbnQgbl9kaW1zID0gNTsKKyAgCitNYXRyaXhUeXBlIG0xKG5fZGltcyksIG0yKG5fZGltcyk7CittMS5zZXRSYW5kb20oKTsKK20yLnNldFJhbmRvbSgpOworZmxvYXQgKnAgPSAmbTIoMCk7ICAvLyBnZXQgdGhlIGFkZHJlc3Mgc3RvcmluZyB0aGUgZGF0YSBmb3IgbTIKK01hcFR5cGUgbTJtYXAocCxtMi5zaXplKCkpOyAgIC8vIG0ybWFwIHNoYXJlcyBkYXRhIHdpdGggbTIKK01hcFR5cGVDb25zdCBtMm1hcGNvbnN0KHAsbTIuc2l6ZSgpKTsgIC8vIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciBtMgorCitjb3V0IDw8ICJtMTogIiA8PCBtMSA8PCBlbmRsOworY291dCA8PCAibTI6ICIgPDwgbTIgPDwgZW5kbDsKK2NvdXQgPDwgIlNxdWFyZWQgZXVjbGlkZWFuIGRpc3RhbmNlOiAiIDw8IChtMS1tMikuc3F1YXJlZE5vcm0oKSA8PCBlbmRsOworY291dCA8PCAiU3F1YXJlZCBldWNsaWRlYW4gZGlzdGFuY2UsIHVzaW5nIG1hcDogIiA8PAorICAobTEtbTJtYXApLnNxdWFyZWROb3JtKCkgPDwgZW5kbDsKK20ybWFwKDMpID0gNzsgICAvLyB0aGlzIHdpbGwgY2hhbmdlIG0yLCBzaW5jZSB0aGV5IHNoYXJlIHRoZSBzYW1lIGFycmF5Citjb3V0IDw8ICJVcGRhdGVkIG0yOiAiIDw8IG0yIDw8IGVuZGw7Citjb3V0IDw8ICJtMiBjb2VmZmljaWVudCAyLCBjb25zdGFudCBhY2Nlc3NvcjogIiA8PCBtMm1hcGNvbnN0KDIpIDw8IGVuZGw7CisvKiBtMm1hcGNvbnN0KDIpID0gNTsgKi8gICAvLyB0aGlzIHlpZWxkcyBhIGNvbXBpbGUtdGltZSBlcnJvcgpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX2NvbW1haW5pdF8wMS5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2JhMzFkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX2NvbW1haW5pdF8wMS5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXgzZiBtOworbSA8PCAxLCAyLCAzLAorICAgICA0LCA1LCA2LAorICAgICA3LCA4LCA5Oworc3RkOjpjb3V0IDw8IG07CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAxYi5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAxYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkYjJlMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDFiLmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeDNmIG07CittLnJvdygwKSA8PCAxLCAyLCAzOworbS5ibG9jaygxLDAsMiwyKSA8PCA0LCA1LCA3LCA4OworbS5jb2woMikudGFpbCgyKSA8PCA2LCA5OwkJICAgIAorc3RkOjpjb3V0IDw8IG07CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAyLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjBkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAyLmNwcApAQCAtMCwwICsxLDcgQEAKK2ludCByb3dzPTUsIGNvbHM9NTsKK01hdHJpeFhmIG0ocm93cyxjb2xzKTsKK20gPDwgKE1hdHJpeDNmKCkgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSkuZmluaXNoZWQoKSwKKyAgICAgTWF0cml4WGY6Olplcm8oMyxjb2xzLTMpLAorICAgICBNYXRyaXhYZjo6WmVybyhyb3dzLTMsMyksCisgICAgIE1hdHJpeFhmOjpJZGVudGl0eShyb3dzLTMsY29scy0zKTsKK2NvdXQgPDwgbTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9tYXRyaXhfaW52ZXJzZS5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfbWF0cml4X2ludmVyc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjMyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfbWF0cml4X2ludmVyc2UuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4M2YgQTsKK1ZlY3RvcjNmIGI7CitBIDw8IDEsMiwzLCAgNCw1LDYsICA3LDgsMTA7CitiIDw8IDMsIDMsIDQ7CitWZWN0b3IzZiB4ID0gQS5pbnZlcnNlKCkgKiBiOworY291dCA8PCAiVGhlIHNvbHV0aW9uIGlzOiIgPDwgZW5kbCA8PCB4IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfbXVsdGlwbGVfcmhzLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9tdWx0aXBsZV9yaHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTFhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfbXVsdGlwbGVfcmhzLmNwcApAQCAtMCwwICsxLDEwIEBACitNYXRyaXgzZiBBKDMsMyk7CitBIDw8IDEsMiwzLCAgNCw1LDYsICA3LDgsMTA7CitNYXRyaXg8ZmxvYXQsMywyPiBCOworQiA8PCAzLDEsIDMsMSwgNCwxOworTWF0cml4PGZsb2F0LDMsMj4gWDsKK1ggPSBBLmZ1bGxQaXZMdSgpLnNvbHZlKEIpOworY291dCA8PCAiVGhlIHNvbHV0aW9uIHdpdGggcmlnaHQtaGFuZCBzaWRlICgzLDMsNCkgaXM6IiA8PCBlbmRsOworY291dCA8PCBYLmNvbCgwKSA8PCBlbmRsOworY291dCA8PCAiVGhlIHNvbHV0aW9uIHdpdGggcmlnaHQtaGFuZCBzaWRlICgxLDEsMSkgaXM6IiA8PCBlbmRsOworY291dCA8PCBYLmNvbCgxKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3JldXNlX2RlY29tcG9zaXRpb24uY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3JldXNlX2RlY29tcG9zaXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTA2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfcmV1c2VfZGVjb21wb3NpdGlvbi5jcHAKQEAgLTAsMCArMSwxMyBAQAorTWF0cml4M2YgQSgzLDMpOworQSA8PCAxLDIsMywgIDQsNSw2LCAgNyw4LDEwOworUGFydGlhbFBpdkxVPE1hdHJpeDNmPiBsdU9mQShBKTsgLy8gY29tcHV0ZSBMVSBkZWNvbXBvc2l0aW9uIG9mIEEKK1ZlY3RvcjNmIGI7CitiIDw8IDMsMyw0OworVmVjdG9yM2YgeDsKK3ggPSBsdU9mQS5zb2x2ZShiKTsKK2NvdXQgPDwgIlRoZSBzb2x1dGlvbiB3aXRoIHJpZ2h0LWhhbmQgc2lkZSAoMywzLDQpIGlzOiIgPDwgZW5kbDsKK2NvdXQgPDwgeCA8PCBlbmRsOworYiA8PCAxLDEsMTsKK3ggPSBsdU9mQS5zb2x2ZShiKTsKK2NvdXQgPDwgIlRoZSBzb2x1dGlvbiB3aXRoIHJpZ2h0LWhhbmQgc2lkZSAoMSwxLDEpIGlzOiIgPDwgZW5kbDsKK2NvdXQgPDwgeCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3Npbmd1bGFyLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9zaW5ndWxhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmZjFlZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9zaW5ndWxhci5jcHAKQEAgLTAsMCArMSw5IEBACitNYXRyaXgzZiBBOworVmVjdG9yM2YgYjsKK0EgPDwgMSwyLDMsICA0LDUsNiwgIDcsOCw5OworYiA8PCAzLCAzLCA0OworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciBiOiIgPDwgZW5kbCA8PCBiIDw8IGVuZGw7CitWZWN0b3IzZiB4OworeCA9IEEubHUoKS5zb2x2ZShiKTsKK2NvdXQgPDwgIlRoZSBzb2x1dGlvbiBpczoiIDw8IGVuZGwgPDwgeCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3RyaWFuZ3VsYXIuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3RyaWFuZ3VsYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTNmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfdHJpYW5ndWxhci5jcHAKQEAgLTAsMCArMSw4IEBACitNYXRyaXgzZiBBOworVmVjdG9yM2YgYjsKK0EgPDwgMSwyLDMsICAwLDUsNiwgIDAsMCwxMDsKK2IgPDwgMywgMywgNDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgYjoiIDw8IGVuZGwgPDwgYiA8PCBlbmRsOworVmVjdG9yM2YgeCA9IEEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUoYik7Citjb3V0IDw8ICJUaGUgc29sdXRpb24gaXM6IiA8PCBlbmRsIDw8IHggPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV90cmlhbmd1bGFyX2lucGxhY2UuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3RyaWFuZ3VsYXJfaW5wbGFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhZTYzMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV90cmlhbmd1bGFyX2lucGxhY2UuY3BwCkBAIC0wLDAgKzEsNiBAQAorTWF0cml4M2YgQTsKK1ZlY3RvcjNmIGI7CitBIDw8IDEsMiwzLCAgMCw1LDYsICAwLDAsMTA7CitiIDw8IDMsIDMsIDQ7CitBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlSW5QbGFjZShiKTsKK2NvdXQgPDwgIlRoZSBzb2x1dGlvbiBpczoiIDw8IGVuZGwgPDwgYiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1ZlY3Rvcndpc2VfcmV2ZXJzZS5jcHAgYi9kb2Mvc25pcHBldHMvVmVjdG9yd2lzZV9yZXZlcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZhMzUwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL1ZlY3Rvcndpc2VfcmV2ZXJzZS5jcHAKQEAgLTAsMCArMSwxMCBAQAorTWF0cml4WGkgbSA9IE1hdHJpeFhpOjpSYW5kb20oMyw0KTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSByb3d3aXNlIHJldmVyc2Ugb2YgbToiIDw8IGVuZGwgPDwgbS5yb3d3aXNlKCkucmV2ZXJzZSgpIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBjb2x3aXNlIHJldmVyc2Ugb2YgbToiIDw8IGVuZGwgPDwgbS5jb2x3aXNlKCkucmV2ZXJzZSgpIDw8IGVuZGw7CisKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGNvZWZmaWNpZW50ICgxLDApIGluIHRoZSByb3dpc2UgcmV2ZXJzZSBvZiBtOiIgPDwgZW5kbAorPDwgbS5yb3d3aXNlKCkucmV2ZXJzZSgpKDEsMCkgPDwgZW5kbDsKK2NvdXQgPDwgIkxldCB1cyBvdmVyd3JpdGUgdGhpcyBjb2VmZmljaWVudCB3aXRoIHRoZSB2YWx1ZSA0LiIgPDwgZW5kbDsKKy8vbS5jb2x3aXNlKCkucmV2ZXJzZSgpKDEsMCkgPSA0OworY291dCA8PCAiTm93IHRoZSBtYXRyaXggbSBpczoiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL2NsYXNzX0Z1bGxQaXZMVS5jcHAgYi9kb2Mvc25pcHBldHMvY2xhc3NfRnVsbFBpdkxVLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U3ZmFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL2NsYXNzX0Z1bGxQaXZMVS5jcHAKQEAgLTAsMCArMSwxNiBAQAordHlwZWRlZiBNYXRyaXg8ZG91YmxlLCA1LCAzPiBNYXRyaXg1eDM7Cit0eXBlZGVmIE1hdHJpeDxkb3VibGUsIDUsIDU+IE1hdHJpeDV4NTsKK01hdHJpeDV4MyBtID0gTWF0cml4NXgzOjpSYW5kb20oKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CitFaWdlbjo6RnVsbFBpdkxVPE1hdHJpeDV4Mz4gbHUobSk7Citjb3V0IDw8ICJIZXJlIGlzLCB1cCB0byBwZXJtdXRhdGlvbnMsIGl0cyBMVSBkZWNvbXBvc2l0aW9uIG1hdHJpeDoiCisgICAgIDw8IGVuZGwgPDwgbHUubWF0cml4TFUoKSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcyB0aGUgTCBwYXJ0OiIgPDwgZW5kbDsKK01hdHJpeDV4NSBsID0gTWF0cml4NXg1OjpJZGVudGl0eSgpOworbC5ibG9jazw1LDM+KDAsMCkudHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKSA9IGx1Lm1hdHJpeExVKCk7Citjb3V0IDw8IGwgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIFUgcGFydDoiIDw8IGVuZGw7CitNYXRyaXg1eDMgdSA9IGx1Lm1hdHJpeExVKCkudHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7Citjb3V0IDw8IHUgPDwgZW5kbDsKK2NvdXQgPDwgIkxldCB1cyBub3cgcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIG1hdHJpeCBtOiIgPDwgZW5kbDsKK2NvdXQgPDwgbHUucGVybXV0YXRpb25QKCkuaW52ZXJzZSgpICogbCAqIHUgKiBsdS5wZXJtdXRhdGlvblEoKS5pbnZlcnNlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9jb21waWxlX3NuaXBwZXQuY3BwLmluIGIvZG9jL3NuaXBwZXRzL2NvbXBpbGVfc25pcHBldC5jcHAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0Y2Q1MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zbmlwcGV0cy9jb21waWxlX3NuaXBwZXQuY3BwLmluCkBAIC0wLDAgKzEsMTIgQEAKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oaW50LCBjaGFyKiopCit7CisgIGNvdXQucHJlY2lzaW9uKDMpOworICAke3NuaXBwZXRfc291cmNlX2NvZGV9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3JlZHV4X21pbm1heC5jcHAgYi9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfcmVkdXhfbWlubWF4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGFlN2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3JlZHV4X21pbm1heC5jcHAKQEAgLTAsMCArMSwxMiBAQAorICBNYXRyaXgzZiBtID0gTWF0cml4M2Y6OlJhbmRvbSgpOworICBzdGQ6OnB0cmRpZmZfdCBpLCBqOworICBmbG9hdCBtaW5PZk0gPSBtLm1pbkNvZWZmKCZpLCZqKTsKKyAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06XG4iIDw8IG0gPDwgZW5kbDsKKyAgY291dCA8PCAiSXRzIG1pbmltdW0gY29lZmZpY2llbnQgKCIgPDwgbWluT2ZNIAorICAgICAgIDw8ICIpIGlzIGF0IHBvc2l0aW9uICgiIDw8IGkgPDwgIiwiIDw8IGogPDwgIilcblxuIjsKKworICBSb3dWZWN0b3I0aSB2ID0gUm93VmVjdG9yNGk6OlJhbmRvbSgpOworICBpbnQgbWF4T2ZWID0gdi5tYXhDb2VmZigmaSk7CisgIGNvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciB2OiAiIDw8IHYgPDwgZW5kbDsKKyAgY291dCA8PCAiSXRzIG1heGltdW0gY29lZmZpY2llbnQgKCIgPDwgbWF4T2ZWIAorICAgICAgIDw8ICIpIGlzIGF0IHBvc2l0aW9uICIgPDwgaSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9hbGlhc2luZy5jcHAgYi9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2FsaWFzaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU0NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9hbGlhc2luZy5jcHAKQEAgLTAsMCArMSw1IEBACitNYXRyaXgyaSBhOyBhIDw8IDEsIDIsIDMsIDQ7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggYTpcbiIgPDwgYSA8PCBlbmRsOworCithID0gYS50cmFuc3Bvc2UoKTsgLy8gISEhIGRvIE5PVCBkbyB0aGlzICEhIQorY291dCA8PCAiYW5kIHRoZSByZXN1bHQgb2YgdGhlIGFsaWFzaW5nIGVmZmVjdDpcbiIgPDwgYSA8PCBlbmRsOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfY29uanVnYXRlLmNwcCBiL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfY29uanVnYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQ5NmIyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9jb25qdWdhdGUuY3BwCkBAIC0wLDAgKzEsMTIgQEAKK01hdHJpeFhjZiBhID0gTWF0cml4WGNmOjpSYW5kb20oMiwyKTsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBhXG4iIDw8IGEgPDwgZW5kbDsKKworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IGFeVFxuIiA8PCBhLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisKKworY291dCA8PCAiSGVyZSBpcyB0aGUgY29uanVnYXRlIG9mIGFcbiIgPDwgYS5jb25qdWdhdGUoKSA8PCBlbmRsOworCisKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBhXipcbiIgPDwgYS5hZGpvaW50KCkgPDwgZW5kbDsKKworCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2lucGxhY2UuY3BwIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9pbnBsYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTA2OWZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9pbnBsYWNlLmNwcApAQCAtMCwwICsxLDYgQEAKK01hdHJpeFhmIGEoMiwzKTsgYSA8PCAxLCAyLCAzLCA0LCA1LCA2OworY291dCA8PCAiSGVyZSBpcyB0aGUgaW5pdGlhbCBtYXRyaXggYTpcbiIgPDwgYSA8PCBlbmRsOworCisKK2EudHJhbnNwb3NlSW5QbGFjZSgpOworY291dCA8PCAiYW5kIGFmdGVyIGJlaW5nIHRyYW5zcG9zZWQ6XG4iIDw8IGEgPDwgZW5kbDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvdHV0X21hdHJpeF9hc3NpZ25tZW50X3Jlc2l6aW5nLmNwcCBiL2RvYy9zbmlwcGV0cy90dXRfbWF0cml4X2Fzc2lnbm1lbnRfcmVzaXppbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTg5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc25pcHBldHMvdHV0X21hdHJpeF9hc3NpZ25tZW50X3Jlc2l6aW5nLmNwcApAQCAtMCwwICsxLDUgQEAKK01hdHJpeFhmIGEoMiwyKTsKK3N0ZDo6Y291dCA8PCAiYSBpcyBvZiBzaXplICIgPDwgYS5yb3dzKCkgPDwgIngiIDw8IGEuY29scygpIDw8IHN0ZDo6ZW5kbDsKK01hdHJpeFhmIGIoMywzKTsKK2EgPSBiOworc3RkOjpjb3V0IDw8ICJhIGlzIG5vdyBvZiBzaXplICIgPDwgYS5yb3dzKCkgPDwgIngiIDw8IGEuY29scygpIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zcGVjaWFsX2V4YW1wbGVzL0NNYWtlTGlzdHMudHh0IGIvZG9jL3NwZWNpYWxfZXhhbXBsZXMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlYWUxZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjAgQEAKKworaWYoTk9UIEVJR0VOX1RFU1RfTk9RVCkKKyAgZmluZF9wYWNrYWdlKFF0NCkKKyAgaWYoUVQ0X0ZPVU5EKQorICAgIGluY2x1ZGUoJHtRVF9VU0VfRklMRX0pCisgIGVuZGlmKCkKK2VuZGlmKE5PVCBFSUdFTl9URVNUX05PUVQpCisKKworaWYoUVQ0X0ZPVU5EKQorICBhZGRfZXhlY3V0YWJsZShUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZSBUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZS5jcHAgVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGVfZGV0YWlscy5jcHApCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZSAke0VJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPfSAke1FUX1FUQ09SRV9MSUJSQVJZfSAke1FUX1FUR1VJX0xJQlJBUll9KQorCisgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgIFRBUkdFVCBUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZQorICAgICAgUE9TVF9CVUlMRAorICAgICAgQ09NTUFORCBUdXRvcmlhbF9zcGFyc2VfZXhhbXBsZQorICAgICAgQVJHUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4vaHRtbC9UdXRvcmlhbF9zcGFyc2VfZXhhbXBsZS5qcGVnCisgICkKK2VuZGlmKFFUNF9GT1VORCkKZGlmZiAtLWdpdCBhL2RvYy9zcGVjaWFsX2V4YW1wbGVzL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlLmNwcCBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJmMTlmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNpYWxfZXhhbXBsZXMvVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGUuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+CisjaW5jbHVkZSA8dmVjdG9yPgorCit0eXBlZGVmIEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiBTcE1hdDsgLy8gZGVjbGFyZXMgYSBjb2x1bW4tbWFqb3Igc3BhcnNlIG1hdHJpeCB0eXBlIG9mIGRvdWJsZQordHlwZWRlZiBFaWdlbjo6VHJpcGxldDxkb3VibGU+IFQ7CisKK3ZvaWQgYnVpbGRQcm9ibGVtKHN0ZDo6dmVjdG9yPFQ+JiBjb2VmZmljaWVudHMsIEVpZ2VuOjpWZWN0b3JYZCYgYiwgaW50IG4pOwordm9pZCBzYXZlQXNCaXRtYXAoY29uc3QgRWlnZW46OlZlY3RvclhkJiB4LCBpbnQgbiwgY29uc3QgY2hhciogZmlsZW5hbWUpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIGludCBuID0gMzAwOyAgLy8gc2l6ZSBvZiB0aGUgaW1hZ2UKKyAgaW50IG0gPSBuKm47ICAvLyBudW1iZXIgb2YgdW5rbm93cyAoPW51bWJlciBvZiBwaXhlbHMpCisKKyAgLy8gQXNzZW1ibHk6CisgIHN0ZDo6dmVjdG9yPFQ+IGNvZWZmaWNpZW50czsgICAgICAgICAgICAvLyBsaXN0IG9mIG5vbi16ZXJvcyBjb2VmZmljaWVudHMKKyAgRWlnZW46OlZlY3RvclhkIGIobSk7ICAgICAgICAgICAgICAgICAgIC8vIHRoZSByaWdodCBoYW5kIHNpZGUtdmVjdG9yIHJlc3VsdGluZyBmcm9tIHRoZSBjb25zdHJhaW50cworICBidWlsZFByb2JsZW0oY29lZmZpY2llbnRzLCBiLCBuKTsKKworICBTcE1hdCBBKG0sbSk7CisgIEEuc2V0RnJvbVRyaXBsZXRzKGNvZWZmaWNpZW50cy5iZWdpbigpLCBjb2VmZmljaWVudHMuZW5kKCkpOworCisgIC8vIFNvbHZpbmc6CisgIEVpZ2VuOjpTaW1wbGljaWFsQ2hvbGVza3k8U3BNYXQ+IGNob2woQSk7ICAvLyBwZXJmb3JtcyBhIENob2xlc2t5IGZhY3Rvcml6YXRpb24gb2YgQQorICBFaWdlbjo6VmVjdG9yWGQgeCA9IGNob2wuc29sdmUoYik7ICAgICAgICAgLy8gdXNlIHRoZSBmYWN0b3JpemF0aW9uIHRvIHNvbHZlIGZvciB0aGUgZ2l2ZW4gcmlnaHQgaGFuZCBzaWRlCisKKyAgLy8gRXhwb3J0IHRoZSByZXN1bHQgdG8gYSBmaWxlOgorICBzYXZlQXNCaXRtYXAoeCwgbiwgYXJndlsxXSk7CisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RvYy9zcGVjaWFsX2V4YW1wbGVzL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlX2RldGFpbHMuY3BwIGIvZG9jL3NwZWNpYWxfZXhhbXBsZXMvVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGVfZGV0YWlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzMDIwYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlX2RldGFpbHMuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPFFJbWFnZT4KKwordHlwZWRlZiBFaWdlbjo6U3BhcnNlTWF0cml4PGRvdWJsZT4gU3BNYXQ7IC8vIGRlY2xhcmVzIGEgY29sdW1uLW1ham9yIHNwYXJzZSBtYXRyaXggdHlwZSBvZiBkb3VibGUKK3R5cGVkZWYgRWlnZW46OlRyaXBsZXQ8ZG91YmxlPiBUOworCit2b2lkIGluc2VydENvZWZmaWNpZW50KGludCBpZCwgaW50IGksIGludCBqLCBkb3VibGUgdywgc3RkOjp2ZWN0b3I8VD4mIGNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46OlZlY3RvclhkJiBiLCBjb25zdCBFaWdlbjo6VmVjdG9yWGQmIGJvdW5kYXJ5KQoreworICBpbnQgbiA9IGJvdW5kYXJ5LnNpemUoKTsKKyAgaW50IGlkMSA9IGkraipuOworCisgICAgICAgIGlmKGk9PS0xIHx8IGk9PW4pIGIoaWQpIC09IHcgKiBib3VuZGFyeShqKTsgLy8gY29uc3RyYWluZWQgY29lZmZjaWVpbnQKKyAgZWxzZSAgaWYoaj09LTEgfHwgaj09bikgYihpZCkgLT0gdyAqIGJvdW5kYXJ5KGkpOyAvLyBjb25zdHJhaW5lZCBjb2VmZmNpZWludAorICBlbHNlICBjb2VmZnMucHVzaF9iYWNrKFQoaWQsaWQxLHcpKTsgICAgICAgICAgICAgIC8vIHVua25vd24gY29lZmZpY2llbnQKK30KKwordm9pZCBidWlsZFByb2JsZW0oc3RkOjp2ZWN0b3I8VD4mIGNvZWZmaWNpZW50cywgRWlnZW46OlZlY3RvclhkJiBiLCBpbnQgbikKK3sKKyAgYi5zZXRaZXJvKCk7CisgIEVpZ2VuOjpBcnJheVhkIGJvdW5kYXJ5ID0gRWlnZW46OkFycmF5WGQ6OkxpblNwYWNlZChuLCAwLE1fUEkpLnNpbigpLnBvdygyKTsKKyAgZm9yKGludCBqPTA7IGo8bjsgKytqKQorICB7CisgICAgZm9yKGludCBpPTA7IGk8bjsgKytpKQorICAgIHsKKyAgICAgIGludCBpZCA9IGkraipuOworICAgICAgaW5zZXJ0Q29lZmZpY2llbnQoaWQsIGktMSxqLCAtMSwgY29lZmZpY2llbnRzLCBiLCBib3VuZGFyeSk7CisgICAgICBpbnNlcnRDb2VmZmljaWVudChpZCwgaSsxLGosIC0xLCBjb2VmZmljaWVudHMsIGIsIGJvdW5kYXJ5KTsKKyAgICAgIGluc2VydENvZWZmaWNpZW50KGlkLCBpLGotMSwgLTEsIGNvZWZmaWNpZW50cywgYiwgYm91bmRhcnkpOworICAgICAgaW5zZXJ0Q29lZmZpY2llbnQoaWQsIGksaisxLCAtMSwgY29lZmZpY2llbnRzLCBiLCBib3VuZGFyeSk7CisgICAgICBpbnNlcnRDb2VmZmljaWVudChpZCwgaSxqLCAgICA0LCBjb2VmZmljaWVudHMsIGIsIGJvdW5kYXJ5KTsKKyAgICB9CisgIH0KK30KKwordm9pZCBzYXZlQXNCaXRtYXAoY29uc3QgRWlnZW46OlZlY3RvclhkJiB4LCBpbnQgbiwgY29uc3QgY2hhciogZmlsZW5hbWUpCit7CisgIEVpZ2VuOjpBcnJheTx1bnNpZ25lZCBjaGFyLEVpZ2VuOjpEeW5hbWljLEVpZ2VuOjpEeW5hbWljPiBiaXRzID0gKHgqMjU1KS5jYXN0PHVuc2lnbmVkIGNoYXI+KCk7CisgIFFJbWFnZSBpbWcoYml0cy5kYXRhKCksIG4sbixRSW1hZ2U6OkZvcm1hdF9JbmRleGVkOCk7CisgIGltZy5zZXRDb2xvckNvdW50KDI1Nik7CisgIGZvcihpbnQgaT0wO2k8MjU2O2krKykgaW1nLnNldENvbG9yKGkscVJnYihpLGksaSkpOworICBpbWcuc2F2ZShmaWxlbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvdHV0b3JpYWwuY3BwIGIvZG9jL3R1dG9yaWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJlN2MyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3R1dG9yaWFsLmNwcApAQCAtMCwwICsxLDYyIEBACisjaW5jbHVkZSA8RWlnZW4vQXJyYXk+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIHN0ZDo6Y291dC5wcmVjaXNpb24oMik7CisKKyAgLy8gZGVtbyBzdGF0aWMgZnVuY3Rpb25zCisgIEVpZ2VuOjpNYXRyaXgzZiBtMyA9IEVpZ2VuOjpNYXRyaXgzZjo6UmFuZG9tKCk7CisgIEVpZ2VuOjpNYXRyaXg0ZiBtNCA9IEVpZ2VuOjpNYXRyaXg0Zjo6SWRlbnRpdHkoKTsKKworICBzdGQ6OmNvdXQgPDwgIioqKiBTdGVwIDEgKioqXG5tMzpcbiIgPDwgbTMgPDwgIlxubTQ6XG4iIDw8IG00IDw8IHN0ZDo6ZW5kbDsKKworICAvLyBkZW1vIG5vbi1zdGF0aWMgc2V0Li4uIGZ1bmN0aW9ucworICBtNC5zZXRaZXJvKCk7CisgIG0zLmRpYWdvbmFsKCkuc2V0T25lcygpOworICAKKyAgc3RkOjpjb3V0IDw8ICIqKiogU3RlcCAyICoqKlxubTM6XG4iIDw8IG0zIDw8ICJcbm00OlxuIiA8PCBtNCA8PCBzdGQ6OmVuZGw7CisKKyAgLy8gZGVtbyBmaXhlZC1zaXplIGJsb2NrKCkgZXhwcmVzc2lvbiBhcyBsdmFsdWUgYW5kIGFzIHJ2YWx1ZQorICBtNC5ibG9jazwzLDM+KDAsMSkgPSBtMzsKKyAgbTMucm93KDIpID0gbTQuYmxvY2s8MSwzPigyLDApOworCisgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgMyAqKipcbm0zOlxuIiA8PCBtMyA8PCAiXG5tNDpcbiIgPDwgbTQgPDwgc3RkOjplbmRsOworCisgIC8vIGRlbW8gZHluYW1pYy1zaXplIGJsb2NrKCkKKyAgeworICAgIGludCByb3dzID0gMywgY29scyA9IDM7CisgICAgbTQuYmxvY2soMCwxLDMsMykuc2V0SWRlbnRpdHkoKTsKKyAgICBzdGQ6OmNvdXQgPDwgIioqKiBTdGVwIDQgKioqXG5tNDpcbiIgPDwgbTQgPDwgc3RkOjplbmRsOworICB9CisKKyAgLy8gZGVtbyB2ZWN0b3IgYmxvY2tzCisgIG00LmRpYWdvbmFsKCkuYmxvY2soMSwyKS5zZXRPbmVzKCk7CisgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgNSAqKipcbm00LmRpYWdvbmFsKCk6XG4iIDw8IG00LmRpYWdvbmFsKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIm00LmRpYWdvbmFsKCkuc3RhcnQoMylcbiIgPDwgbTQuZGlhZ29uYWwoKS5zdGFydCgzKSA8PCBzdGQ6OmVuZGw7CisKKyAgLy8gZGVtbyBjb2VmZi13aXNlIG9wZXJhdGlvbnMKKyAgbTQgPSBtNC5jd2lzZSgpKm00OworICBtMyA9IG0zLmN3aXNlKCkuY29zKCk7CisgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgNiAqKipcbm0zOlxuIiA8PCBtMyA8PCAiXG5tNDpcbiIgPDwgbTQgPDwgc3RkOjplbmRsOworCisgIC8vIHN1bXMgb2YgY29lZmZpY2llbnRzCisgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgNyAqKipcbiBtNC5zdW0oKTogIiA8PCBtNC5zdW0oKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAibTQuY29sKDIpLnN1bSgpOiAiIDw8IG00LmNvbCgyKS5zdW0oKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAibTQuY29sd2lzZSgpLnN1bSgpOlxuIiA8PCBtNC5jb2x3aXNlKCkuc3VtKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIm00LnJvd3dpc2UoKS5zdW0oKTpcbiIgPDwgbTQucm93d2lzZSgpLnN1bSgpIDw8IHN0ZDo6ZW5kbDsKKworICAvLyBkZW1vIGludGVsbGlnZW50IGF1dG8tZXZhbHVhdGlvbgorICBtNCA9IG00ICogbTQ7IC8vIGF1dG8tZXZhbHVhdGVzIHNvIG5vIGFsaWFzaW5nIHByb2JsZW0gKHBlcmZvcm1hbmNlIHBlbmFsdHkgaXMgbG93KQorICBFaWdlbjo6TWF0cml4NGYgb3RoZXIgPSAobTQgKiBtNCkubGF6eSgpOyAvLyBmb3JjZXMgbGF6eSBldmFsdWF0aW9uCisgIG00ID0gbTQgKyBtNDsgLy8gaGVyZSBFaWdlbiBnb2VzIGZvciBsYXp5IGV2YWx1YXRpb24sIGFzIHdpdGggbW9zdCBleHByZXNzaW9ucworICBtNCA9IC1tNCArIG00ICsgNSAqIG00OyAvLyBzYW1lIGhlcmUsIEVpZ2VuIGNob29zZXMgbGF6eSBldmFsdWF0aW9uIGZvciBhbGwgdGhhdC4KKyAgbTQgPSBtNCAqIChtNCArIG00KTsgLy8gaGVyZSBFaWdlbiBjaG9vc2VzIHRvIGZpcnN0IGV2YWx1YXRlIG00ICsgbTQgaW50byBhIHRlbXBvcmFyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZWVkLCBoZXJlIGl0IGlzIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSB0aGlzIGludGVybWVkaWF0ZSByZXN1bHQuCisgIG0zID0gbTMgKiBtNC5ibG9jazwzLDM+KDEsMSk7IC8vIGhlcmUgRWlnZW4gY2hvb3NlcyBOT1QgdG8gZXZhbHVhdGUgYmxvY2soKSBpbnRvIGEgdGVtcG9yYXJ5CisgICAgLy8gYmVjYXVzZSBhY2Nlc3NpbmcgY29lZmZpY2llbnRzIG9mIHRoYXQgYmxvY2sgZXhwcmVzc2lvbiBpcyBub3QgbW9yZSBjb3N0bHkgdGhhbiBhY2Nlc3NpbmcKKyAgICAvLyBjb2VmZmljaWVudHMgb2YgYSBwbGFpbiBtYXRyaXguCisgIG00ID0gbTQgKiBtNC50cmFuc3Bvc2UoKTsgLy8gc2FtZSBoZXJlLCBsYXp5IGV2YWx1YXRpb24gb2YgdGhlIHRyYW5zcG9zZS4KKyAgbTQgPSBtNCAqIG00LnRyYW5zcG9zZSgpLmV2YWwoKTsgLy8gZm9yY2VzIGltbWVkaWF0ZSBldmFsdWF0aW9uIG9mIHRoZSB0cmFuc3Bvc2UKKworICBzdGQ6OmNvdXQgPDwgIioqKiBTdGVwIDggKioqXG5tMzpcbiIgPDwgbTMgPDwgIlxubTQ6XG4iIDw8IG00IDw8IHN0ZDo6ZW5kbDsKK30KZGlmZiAtLWdpdCBhL2VpZ2VuMy5wYy5pbiBiL2VpZ2VuMy5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTg1NWRlCi0tLSAvZGV2L251bGwKKysrIGIvZWlnZW4zLnBjLmluCkBAIC0wLDAgKzEsNiBAQAorTmFtZTogRWlnZW4zCitEZXNjcmlwdGlvbjogQSBDKysgdGVtcGxhdGUgbGlicmFyeSBmb3IgbGluZWFyIGFsZ2VicmE6IHZlY3RvcnMsIG1hdHJpY2VzLCBhbmQgcmVsYXRlZCBhbGdvcml0aG1zCitSZXF1aXJlczoKK1ZlcnNpb246ICR7RUlHRU5fVkVSU0lPTl9OVU1CRVJ9CitMaWJzOgorQ2ZsYWdzOiAtSSR7SU5DTFVERV9JTlNUQUxMX0RJUn0KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L0NNYWtlTGlzdHMudHh0IGIvZmFpbHRlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmYTJhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzcgQEAKK21lc3NhZ2UoU1RBVFVTICJSdW5uaW5nIHRoZSBmYWlsdGVzdHMiKQorCitlaV9hZGRfZmFpbHRlc3QoImZhaWx0ZXN0X3Nhbml0eV9jaGVjayIpCisKK2VpX2FkZF9mYWlsdGVzdCgiYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMCIpCitlaV9hZGRfZmFpbHRlc3QoImJsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzEiKQorZWlfYWRkX2ZhaWx0ZXN0KCJibG9ja19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwcl8yIikKK2VpX2FkZF9mYWlsdGVzdCgidHJhbnNwb3NlX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByIikKK2VpX2FkZF9mYWlsdGVzdCgiZGlhZ29uYWxfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIiKQorCitlaV9hZGRfZmFpbHRlc3QoImNvbnN0X3F1YWxpZmllZF9ibG9ja19tZXRob2RfcmV0dmFsXzAiKQorZWlfYWRkX2ZhaWx0ZXN0KCJjb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8xIikKK2VpX2FkZF9mYWlsdGVzdCgiY29uc3RfcXVhbGlmaWVkX3RyYW5zcG9zZV9tZXRob2RfcmV0dmFsIikKK2VpX2FkZF9mYWlsdGVzdCgiY29uc3RfcXVhbGlmaWVkX2RpYWdvbmFsX21ldGhvZF9yZXR2YWwiKQorCitlaV9hZGRfZmFpbHRlc3QoIm1hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8wIikKK2VpX2FkZF9mYWlsdGVzdCgibWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzEiKQorZWlfYWRkX2ZhaWx0ZXN0KCJtYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMiIpCitlaV9hZGRfZmFpbHRlc3QoIm1hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8zIikKK2VpX2FkZF9mYWlsdGVzdCgibWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzQiKQorCitlaV9hZGRfZmFpbHRlc3QoIm1hcF9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzAiKQorZWlfYWRkX2ZhaWx0ZXN0KCJtYXBfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xIikKK2VpX2FkZF9mYWlsdGVzdCgiYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8wIikKK2VpX2FkZF9mYWlsdGVzdCgiYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xIikKK2VpX2FkZF9mYWlsdGVzdCgidHJhbnNwb3NlX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QiKQorZWlfYWRkX2ZhaWx0ZXN0KCJkaWFnb25hbF9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0IikKKworaWYgKEVJR0VOX0ZBSUxURVNUX0ZBSUxVUkVfQ09VTlQpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IKKyAgICAgICAgICAiJHtFSUdFTl9GQUlMVEVTVF9GQUlMVVJFX0NPVU5UfSBvdXQgb2YgJHtFSUdFTl9GQUlMVEVTVF9DT1VOVH0gZmFpbHRlc3RzIEZBSUxFRC4gIgorICAgICAgICAgICJUbyBkZWJ1ZyB0aGVzZSBmYWlsdXJlcywgbWFudWFsbHkgY29tcGlsZSB0aGVzZSBwcm9ncmFtcyBpbiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0sICIKKyAgICAgICAgICAid2l0aCBhbmQgd2l0aG91dCAjZGVmaW5lIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxELiIpCitlbHNlKCkKKyAgbWVzc2FnZShTVEFUVVMgIkZhaWx0ZXN0IFNVQ0NFU1M6IGFsbCAke0VJR0VOX0ZBSUxURVNUX0NPVU5UfSBmYWlsdGVzdHMgcGFzc2VkLiIpCisgIG1lc3NhZ2UoU1RBVFVTICIiKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMC5jcHAgYi9mYWlsdGVzdC9ibG9ja19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwcl8wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGI4MjAxCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMC5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKKyAgICBCbG9jazxNYXRyaXgzZCwzLDM+IGIobSwwLDApOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9ibG9ja19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwcl8xLmNwcCBiL2ZhaWx0ZXN0L2Jsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNmQ1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9ibG9ja19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwcl8xLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0peworICAgIEJsb2NrPE1hdHJpeDNkPiBiKG0sMCwwLDMsMyk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2Jsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzIuY3BwIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmMThhZQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2Jsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzIuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7CisgICAgLy8gcm93L2NvbHVtbiBjb25zdHJ1Y3RvcgorICAgIEJsb2NrPE1hdHJpeDNkLDMsMT4gYihtLDApOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9ibG9ja19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzAuY3BwIGIvZmFpbHRlc3QvYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDliZWJlCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8wLmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbygpeworICAgIE1hdHJpeDNmIG07CisgICAgQmxvY2s8Q1ZfUVVBTElGSUVSIE1hdHJpeDNmPihtLCAwLCAwLCAzLCAzKS5jb2VmZlJlZigwLCAwKSA9IDEuMGY7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2Jsb2NrX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMS5jcHAgYi9mYWlsdGVzdC9ibG9ja19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2U5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9ibG9ja19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzEuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKCl7CisgICAgTWF0cml4WGYgbTsKKyAgICBCbG9jazxDVl9RVUFMSUZJRVIgTWF0cml4WGYsIDMsIDM+KG0sIDAsIDApLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvY29uc3RfcXVhbGlmaWVkX2Jsb2NrX21ldGhvZF9yZXR2YWxfMC5jcHAgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmJkNWZlCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvY29uc3RfcXVhbGlmaWVkX2Jsb2NrX21ldGhvZF9yZXR2YWxfMC5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKKyAgICBCbG9jazxNYXRyaXgzZCwzLDM+IGIobS5ibG9jazwzLDM+KDAsMCkpOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8xLmNwcCBiL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF9ibG9ja19tZXRob2RfcmV0dmFsXzEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDBjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8xLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0peworICAgIEJsb2NrPE1hdHJpeDNkPiBiKG0uYmxvY2soMCwwLDMsMykpOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfZGlhZ29uYWxfbWV0aG9kX3JldHZhbC5jcHAgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfZGlhZ29uYWxfbWV0aG9kX3JldHZhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5NTk0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF9kaWFnb25hbF9tZXRob2RfcmV0dmFsLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0peworICAgIERpYWdvbmFsPE1hdHJpeDNkPiBiKG0uZGlhZ29uYWwoKSk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF90cmFuc3Bvc2VfbWV0aG9kX3JldHZhbC5jcHAgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfdHJhbnNwb3NlX21ldGhvZF9yZXR2YWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkN2YxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfdHJhbnNwb3NlX21ldGhvZF9yZXR2YWwuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7CisgICAgVHJhbnNwb3NlPE1hdHJpeDNkPiBiKG0udHJhbnNwb3NlKCkpOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9kaWFnb25hbF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAgYi9mYWlsdGVzdC9kaWFnb25hbF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzOThhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L2RpYWdvbmFsX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0peworICAgIERpYWdvbmFsPE1hdHJpeDNkPiBkKG0pOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9kaWFnb25hbF9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcCBiL2ZhaWx0ZXN0L2RpYWdvbmFsX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9kaWFnb25hbF9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbygpeworICAgIE1hdHJpeFhmIG07CisgICAgRGlhZ29uYWw8Q1ZfUVVBTElGSUVSIE1hdHJpeFhmPihtKS5jb2VmZlJlZigwKSA9IDEuMGY7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2ZhaWx0ZXN0X3Nhbml0eV9jaGVjay5jcHAgYi9mYWlsdGVzdC9mYWlsdGVzdF9zYW5pdHlfY2hlY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OWZhOTQKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9mYWlsdGVzdF9zYW5pdHlfY2hlY2suY3BwCkBAIC0wLDAgKzEsNSBAQAorI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECitUaGlzIGlzIGp1c3Qgc29tZSB0ZXh0IHRoYXQgd29uJ3QgY29tcGlsZSBhcyBhIEMrKyBmaWxlLCBhcyBhIGJhc2ljIHNhbml0eSBjaGVjayBmb3IgZmFpbHRlc3QuCisjZWxzZQoraW50IG1haW4oKSB7fQorI2VuZGlmCmRpZmYgLS1naXQgYS9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMC5jcHAgYi9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1Njg2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8wLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgZmxvYXQgKnB0cil7CisgICAgTWFwPE1hdHJpeDNmPiBtKHB0cik7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8xLmNwcCBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8xLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGExMzRkCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzEuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBmbG9hdCAqcHRyLCBEZW5zZUluZGV4IHNpemUpeworICAgIE1hcDxBcnJheVhmPiBtKHB0ciwgc2l6ZSk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8yLmNwcCBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmI0YjYyCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBmbG9hdCAqcHRyLCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scyl7CisgICAgTWFwPE1hdHJpeFhmPiBtKHB0ciwgcm93cywgY29scyk7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8zLmNwcCBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBmNmYwCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzMuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBmbG9hdCAqcHRyLCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scyl7CisgICAgTWFwPE1hdHJpeFhmLCBBbGlnbmVkLCBJbm5lclN0cmlkZTwyPiA+IG0ocHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTwyPigpKTsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzQuY3BwIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZThjOTUKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfNC5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oY29uc3QgZmxvYXQgKnB0ciwgRGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4IGNvbHMpeworICAgIE1hcDxDVl9RVUFMSUZJRVIgTWF0cml4WGYsIFVuYWxpZ25lZCwgT3V0ZXJTdHJpZGU8PiA+IG0ocHRyLCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTw+KDIpKTsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAgYi9mYWlsdGVzdC9tYXBfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2I2YWEwCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oZmxvYXQgKnB0cil7CisgICAgTWFwPENWX1FVQUxJRklFUiBNYXRyaXhYZj4ocHRyLCAxLCAxKS5jb2VmZlJlZigwLDApID0gMS4wZjsKK30KKworaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMS5jcHAgYi9mYWlsdGVzdC9tYXBfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGUwNjdjCi0tLSAvZGV2L251bGwKKysrIGIvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMS5jcHAKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgIi4uL0VpZ2VuL0NvcmUiCisKKyNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRAorI2RlZmluZSBDVl9RVUFMSUZJRVIgY29uc3QKKyNlbHNlCisjZGVmaW5lIENWX1FVQUxJRklFUgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordm9pZCBmb28oZmxvYXQgKnB0cil7CisgICAgTWFwPENWX1FVQUxJRklFUiBWZWN0b3IzZj4ocHRyKS5jb2VmZlJlZigwKSA9IDEuMGY7Cit9CisKK2ludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3RyYW5zcG9zZV9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAgYi9mYWlsdGVzdC90cmFuc3Bvc2Vfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjNlN2YKLS0tIC9kZXYvbnVsbAorKysgYi9mYWlsdGVzdC90cmFuc3Bvc2Vfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgorCisjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSIGNvbnN0CisjZWxzZQorI2RlZmluZSBDVl9RVUFMSUZJRVIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7CisgICAgVHJhbnNwb3NlPE1hdHJpeDNkPiB0KG0pOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC90cmFuc3Bvc2Vfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdC5jcHAgYi9mYWlsdGVzdC90cmFuc3Bvc2Vfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiN2QwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZhaWx0ZXN0L3RyYW5zcG9zZV9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSAiLi4vRWlnZW4vQ29yZSIKKworI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECisjZGVmaW5lIENWX1FVQUxJRklFUiBjb25zdAorI2Vsc2UKKyNkZWZpbmUgQ1ZfUVVBTElGSUVSCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIGZvbygpeworICAgIE1hdHJpeFhmIG07CisgICAgVHJhbnNwb3NlPENWX1FVQUxJRklFUiBNYXRyaXhYZj4obSkuY29lZmZSZWYoMCwgMCkgPSAxLjBmOworfQorCitpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9sYXBhY2svQ01ha2VMaXN0cy50eHQgYi9sYXBhY2svQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyODQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDM3NCBAQAorCitwcm9qZWN0KEVpZ2VuTGFwYWNrIENYWCkKKworaW5jbHVkZSgiLi4vY21ha2UvbGFuZ3VhZ2Vfc3VwcG9ydC5jbWFrZSIpCisKK3dvcmthcm91bmRfOTIyMChGb3J0cmFuIEVJR0VOX0ZvcnRyYW5fQ09NUElMRVJfV09SS1MpCisKK2lmKEVJR0VOX0ZvcnRyYW5fQ09NUElMRVJfV09SS1MpCisgIGVuYWJsZV9sYW5ndWFnZShGb3J0cmFuIE9QVElPTkFMKQorZW5kaWYoKQorCithZGRfY3VzdG9tX3RhcmdldChsYXBhY2spCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uL2JsYXMpCisKK3NldChFaWdlbkxhcGFja19TUkNTCitzaW5nbGUuY3BwIGRvdWJsZS5jcHAgY29tcGxleF9zaW5nbGUuY3BwIGNvbXBsZXhfZG91YmxlLmNwcCAuLi9ibGFzL3hlcmJsYS5jcHAKKykKKworaWYoRUlHRU5fRm9ydHJhbl9DT01QSUxFUl9XT1JLUykKKworZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChlaWdlbl9mdWxsX3BhdGhfdG9fcmVmZXJlbmNlX3RvX3JlZmVyZW5jZV9sYXBhY2sgIi4vcmVmZXJlbmNlLyIgQUJTT0xVVEUpCitpZihFWElTVFMgJHtlaWdlbl9mdWxsX3BhdGhfdG9fcmVmZXJlbmNlX3RvX3JlZmVyZW5jZV9sYXBhY2t9KQorc2V0KEVpZ2VuTGFwYWNrX1NSQ1MgJHtFaWdlbkxhcGFja19TUkNTfQorIyByZWZlcmVuY2UvZHBvdHJmLmYgcmVmZXJlbmNlL3pwb3RyZi5mIHJlZmVyZW5jZS9jcG90cmYuZiByZWZlcmVuY2Uvc3BvdHJmLmYKKyMgcmVmZXJlbmNlL2Rwb3Rycy5mIHJlZmVyZW5jZS9zcG90cnMuZiByZWZlcmVuY2UvenBvdHJzLmYgcmVmZXJlbmNlL2Nwb3Rycy5mCisjIHJlZmVyZW5jZS9kZ2V0cmYuZiByZWZlcmVuY2UvY2dldHJmLmYgcmVmZXJlbmNlL3NnZXRyZi5mIHJlZmVyZW5jZS96Z2V0cmYuZgorIyByZWZlcmVuY2UvY2dldHJzLmYgcmVmZXJlbmNlL2RnZXRycy5mIHJlZmVyZW5jZS9zZ2V0cnMuZiByZWZlcmVuY2UvemdldHJzLmYKKyMgcmVmZXJlbmNlL2RzeWV2LmYgIHJlZmVyZW5jZS9zc3lldi5mCisKK3JlZmVyZW5jZS9kbGFtY2guZiAgcmVmZXJlbmNlL2lsYXZlci5mICByZWZlcmVuY2UvbHNhbWUuZiAgcmVmZXJlbmNlL3NsYW1jaC5mICByZWZlcmVuY2Uvc2Vjb25kX05PTkUuZiAgcmVmZXJlbmNlL2RzZWNuZF9OT05FLmYKK3JlZmVyZW5jZS9jYmRzcXIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdGJyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kb3JtbDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFfcG9yZnN4X2V4dGVuZGVkLmYgIHJlZmVyZW5jZS96Z2dnbG0uZgorcmVmZXJlbmNlL2NnYmJyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N0YnRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rvcm1scS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYV9wb3Jwdmdydy5mICAgICAgICAgcmVmZXJlbmNlL3pnZ2hyZC5mCityZWZlcmVuY2UvY2diY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3Rmc20uZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZG9ybXFsLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcHkyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdnbHNlLmYKK3JlZmVyZW5jZS9jZ2JlcXViLmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdGZ0cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kb3JtcXIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFweTMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2dxcmYuZgorcmVmZXJlbmNlL2NnYmVxdS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N0ZnR0cC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rvcm1yMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXFnYi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZ3JxZi5mCityZWZlcmVuY2UvY2dicmZzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3RmdHRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZG9ybXIzLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcWdlLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemdnc3ZkLmYKK3JlZmVyZW5jZS9jZ2JyZnN4LmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdGdldmMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kb3JtcnEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFxcDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2dzdnAuZgorcmVmZXJlbmNlL2NnYnN2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N0Z2V4Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rvcm1yei5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXFwcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pndGNvbi5mCityZWZlcmVuY2UvY2dic3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3RnZXhjLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZG9ybXRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcXIwLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemd0cmZzLmYKK3JlZmVyZW5jZS9jZ2Jzdnh4LmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdGdzZW4uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcGJjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFxcjEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z3Rzdi5mCityZWZlcmVuY2UvY2didGYyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3Rnc2phLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBiZXF1LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcXIyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemd0c3Z4LmYKK3JlZmVyZW5jZS9jZ2J0cmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdGdzbmEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcGJyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFxcjMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z3R0cmYuZgorcmVmZXJlbmNlL2NnYnRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N0Z3N5Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RwYnN0Zi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXFyNC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pndHRycy5mCityZWZlcmVuY2UvY2dlYmFrLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3Rnc3lsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBic3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcXI1LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemd0dHMyLmYKK3JlZmVyZW5jZS9jZ2ViYWwuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdHBjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcGJzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFxc2IuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGJldmQuZgorcmVmZXJlbmNlL2NnZWJkMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N0cHJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RwYnRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXFzcC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3poYmV2LmYKK3JlZmVyZW5jZS9jZ2VicmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdHB0cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcGJ0cmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFxc3kuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGJldnguZgorcmVmZXJlbmNlL2NnZWNvbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N0cHRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RwYnRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXF0ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3poYmdzdC5mCityZWZlcmVuY2UvY2dlZXF1Yi5mICAgICAgICAgICAgICByZWZlcmVuY2UvY3RwdHRmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBmdHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcjF2LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhiZ3ZkLmYKK3JlZmVyZW5jZS9jZ2VlcXUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdHB0dHIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcGZ0cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFyMnYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGJndi5mCityZWZlcmVuY2UvY2dlZXMuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvY3RyY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBmdHJzLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcmZiLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhiZ3Z4LmYKK3JlZmVyZW5jZS9jZ2Vlc3guZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdHJldmMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcG9jb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFyZi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGJ0cmQuZgorcmVmZXJlbmNlL2NnZWV2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N0cmV4Yy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rwb2VxdWIuZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXJmZy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3poZWNvbi5mCityZWZlcmVuY2UvY2dlZXZ4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3RycmZzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBvZXF1LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcmZwLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhlZXF1Yi5mCityZWZlcmVuY2UvY2dlZ3MuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvY3Ryc2VuLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBvcmZzLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcmZ0LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhlZXZkLmYKK3JlZmVyZW5jZS9jZ2Vndi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdHJzbmEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcG9yZnN4LmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFyZnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGVldi5mCityZWZlcmVuY2UvY2dlaGQyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3Ryc3lsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBvc3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcmd2LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhlZXZyLmYKK3JlZmVyZW5jZS9jZ2VocmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdHJ0aTIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcG9zdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFybnYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGVldnguZgorcmVmZXJlbmNlL2NnZWxxMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N0cnRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rwb3N2eHguZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYV9ycHZncncuZiAgICAgICAgICAgcmVmZXJlbmNlL3poZWdzMi5mCityZWZlcmVuY2UvY2dlbHFmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3RydHJzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBvdGYyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcnJhLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhlZ3N0LmYKK3JlZmVyZW5jZS9jZ2Vsc2QuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdHJ0dGYuZgorcmVmZXJlbmNlL3NsYXJyYi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3poZWd2ZC5mCityZWZlcmVuY2UvY2dlbHMuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvY3RydHRwLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBvdHJpLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcnJjLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhlZ3YuZgorcmVmZXJlbmNlL2NnZWxzcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N0enJxZi5mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXJyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3poZWd2eC5mCityZWZlcmVuY2UvY2dlbHN4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3R6cnpmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBwY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcnJlLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhlcmZzLmYKK3JlZmVyZW5jZS9jZ2Vsc3kuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdW5nMmwuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcHBlcXUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFycmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGVyZnN4LmYKK3JlZmVyZW5jZS9jZ2VxbDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdW5nMnIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcHByZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFycmouZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGVzdi5mCityZWZlcmVuY2UvY2dlcWxmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3VuZ2JyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBwc3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcnJrLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemhlc3Z4LmYKK3JlZmVyZW5jZS9jZ2VxcDMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdW5naHIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcHBzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFycnIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGVzdnh4LmYKK3JlZmVyZW5jZS9jZ2VxcGYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdW5nbDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcHB0cmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFycnYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGV0ZDIuZgorcmVmZXJlbmNlL2NnZXFyMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N1bmdscS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RwcHRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXJzY2wyLmYgICAgICAgICAgICAgcmVmZXJlbmNlL3poZXRmMi5mCityZWZlcmVuY2UvY2dlcXJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3VuZ3FsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHBwdHJzLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcnRnLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhldHJkLmYKK3JlZmVyZW5jZS9jZ2VyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdW5ncXIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcHN0ZjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFydHYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGV0cmYuZgorcmVmZXJlbmNlL2NnZXJmc3guZiAgICAgICAgICAgICAgcmVmZXJlbmNlL2N1bmdyMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rwc3RyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXJ1di5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3poZXRyaS5mCityZWZlcmVuY2UvY2dlcnEyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3VuZ3JxLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHB0Y29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcnpiLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhldHJzLmYKK3JlZmVyZW5jZS9jZ2VycWYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdW5ndHIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcHRlcXIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFyei5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aGZyay5mCityZWZlcmVuY2UvY2dlc2MyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3VubTJsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHB0cmZzLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhcnp0LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhnZXF6LmYKK3JlZmVyZW5jZS9jZ2VzZGQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdW5tMnIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcHRzdi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFzMi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aHBjb24uZgorcmVmZXJlbmNlL2NnZXN2ZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N1bm1ici5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RwdHN2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXNjbDIuZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3pocGV2ZC5mCityZWZlcmVuY2UvY2dlc3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvY3VubWhyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHB0dHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc2NsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhwZXYuZgorcmVmZXJlbmNlL2NnZXN2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N1bm1sMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RwdHRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXNkMC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pocGV2eC5mCityZWZlcmVuY2UvY2dlc3Z4eC5mICAgICAgICAgICAgICByZWZlcmVuY2UvY3VubWxxLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHB0dHMyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc2QxLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhwZ3N0LmYKK3JlZmVyZW5jZS9jZ2V0YzIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdW5tcWwuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kcnNjbC5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFzZDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aHBndmQuZgorcmVmZXJlbmNlL2NnZXRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N1bm1xci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzYmV2ZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXNkMy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pocGd2LmYKK3JlZmVyZW5jZS9jdW5tcjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc2Jldi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFzZDQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aHBndnguZgorcmVmZXJlbmNlL2NnZXRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N1bm1yMy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzYmV2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXNkNS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pocHJmcy5mCisgICAgICAgICAgICAgICByZWZlcmVuY2UvY3VubXJxLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHNiZ3N0LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc2Q2LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemhwc3YuZgorcmVmZXJlbmNlL2NnZ2Jhay5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N1bm1yei5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzYmd2ZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXNkNy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pocHN2eC5mCityZWZlcmVuY2UvY2dnYmFsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvY3VubXRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHNiZ3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc2Q4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhwdHJkLmYKK3JlZmVyZW5jZS9jZ2dlcy5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9jdXBndHIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc2JndnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFzZGEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aHB0cmYuZgorcmVmZXJlbmNlL2NnZ2VzeC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2N1cG10ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzYnRyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXNkcS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pocHRyaS5mCityZWZlcmVuY2UvY2dnZXYuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZGJkc2RjLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHNmcmsuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc2R0LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemhwdHJzLmYKK3JlZmVyZW5jZS9jZ2dldnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kYmRzcXIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc2dlc3YuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFzZXQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96aHNlaW4uZgorcmVmZXJlbmNlL2NnZ2dsbS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RkaXNuYS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzcGNvbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXNxMS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3poc2Vxci5mCityZWZlcmVuY2UvY2dnaHJkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdiYnJkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHNwZXZkLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc3EyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhYnJkLmYKK3JlZmVyZW5jZS9jZ2dsc2UuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2Jjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3Bldi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFzcTMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFjZ3YuZgorcmVmZXJlbmNlL2NnZ3FyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnYmVxdWIuZiAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzcGV2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXNxNC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYWNuMi5mCityZWZlcmVuY2UvY2dncnFmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdiZXF1LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHNwZ3N0LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc3E1LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhY29uLmYKK3JlZmVyZW5jZS9jZ2dzdmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2JyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3BndmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFzcTYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFjcDIuZgorcmVmZXJlbmNlL2NnZ3N2cC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnYnJmc3guZiAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzcGd2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXNyLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYWNweS5mCityZWZlcmVuY2UvY2d0Y29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdic3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZHNwZ3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc3J0LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhY3JtLmYKK3JlZmVyZW5jZS9jZ3RyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2JzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3Bvc3YuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFzc3EuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFjcnQuZgorcmVmZXJlbmNlL2NndHN2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnYnN2eHguZiAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzcHJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXN2Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYWRpdi5mCityZWZlcmVuY2UvY2d0c3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdidGYyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHNwc3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc3dwLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhZWQwLmYKK3JlZmVyZW5jZS9jZ3R0cmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2J0cmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3BzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFzeTIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFlZDcuZgorcmVmZXJlbmNlL2NndHRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnYnRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzcHRyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYV9zeWFtdi5mICAgICAgICAgICAgcmVmZXJlbmNlL3psYWVkOC5mCityZWZlcmVuY2UvY2d0dHMyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlYmFrLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHNwdHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhc3lmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhZWluLmYKK3JlZmVyZW5jZS9jaGJldmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2ViYWwuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3B0cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFfc3lyY29uZC5mICAgICAgICAgIHJlZmVyZW5jZS96bGFlc3kuZgorcmVmZXJlbmNlL2NoYmV2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWJkMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzcHRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYV9zeXJmc3hfZXh0ZW5kZWQuZiAgcmVmZXJlbmNlL3psYWV2Mi5mCityZWZlcmVuY2UvY2hiZXZ4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlYnJkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHN0ZWJ6LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhX3N5cnB2Z3J3LmYgICAgICAgICByZWZlcmVuY2UvemxhZzJjLmYKK3JlZmVyZW5jZS9jaGJnc3QuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2Vjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3RlZGMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGF0YnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFfZ2JhbXYuZgorcmVmZXJlbmNlL2NoYmd2ZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWVxdWIuZiAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzdGVnci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXRkZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9nYnJjb25kX2MuZgorcmVmZXJlbmNlL2NoYmd2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWVxdS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzdGVpbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXRwcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9nYnJjb25kX3guZgorcmVmZXJlbmNlL2NoYmd2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWVzLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzdGVtci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXRyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9nYnJmc3hfZXh0ZW5kZWQuZgorcmVmZXJlbmNlL2NoYnRyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWVzeC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzdGVxci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9nYnJwdmdydy5mCityZWZlcmVuY2UvY2hlY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlZXYuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZHN0ZXJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhdHJ6LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhX2dlYW12LmYKK3JlZmVyZW5jZS9jaGVlcXViLmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2VldnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3RldmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGF0em0uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFfZ2VyY29uZF9jLmYKK3JlZmVyZW5jZS9jaGVldmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2Vncy5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3Rldi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGF1dTIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFfZ2VyY29uZF94LmYKK3JlZmVyZW5jZS9jaGVldi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2Vndi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3RldnIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGF1dW0uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFfZ2VyZnN4X2V4dGVuZGVkLmYKK3JlZmVyZW5jZS9jaGVldnIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2VoZDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3RldnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFfd3dhZGR3LmYgICAgICAgICAgIHJlZmVyZW5jZS96bGFnczIuZgorcmVmZXJlbmNlL2NoZWV2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWhyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzeWNvbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NvcGd0ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYWd0bS5mCityZWZlcmVuY2UvY2hlZ3MyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlanN2LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHN5ZXF1Yi5mICAgICAgICAgICAgICByZWZlcmVuY2Uvc29wbXRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhX2hlYW12LmYKK3JlZmVyZW5jZS9jaGVnc3QuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2VscTIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3lldmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zb3JnMmwuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFoZWYuZgorcmVmZXJlbmNlL2NoZWd2ZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWxxZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nvcmcyci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9oZXJjb25kX2MuZgorcmVmZXJlbmNlL2NoZWd2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWxzZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzeWV2ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nvcmdici5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9oZXJjb25kX3guZgorcmVmZXJlbmNlL2NoZWd2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWxzLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzeWV2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nvcmdoci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9oZXJmc3hfZXh0ZW5kZWQuZgorcmVmZXJlbmNlL2NoZXJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZWxzcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzeWdzMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NvcmdsMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9oZXJwdmdydy5mCityZWZlcmVuY2UvY2hlcmZzeC5mICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlbHN4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHN5Z3N0LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc29yZ2xxLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhaHFyLmYKK3JlZmVyZW5jZS9jaGVzdi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2Vsc3kuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3lndmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zb3JncWwuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFocjIuZgorcmVmZXJlbmNlL2NoZXN2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZXFsMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzeWd2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nvcmdxci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYWhyZC5mCityZWZlcmVuY2UvY2hlc3Z4eC5mICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlcWxmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHN5Z3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc29yZ3IyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhaWMxLmYKK3JlZmVyZW5jZS9jaGV0ZDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2VxcDMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3lyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zb3JncnEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFfbGluX2JlcnIuZgorcmVmZXJlbmNlL2NoZXRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZXFwZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzeXJmc3guZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nvcmd0ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYWxzMC5mCityZWZlcmVuY2UvY2hldHJkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlcXIyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHN5c3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc29ybTJsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhbHNhLmYKK3JlZmVyZW5jZS9jaGV0cmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2VxcmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3lzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zb3JtMnIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFsc2QuZgorcmVmZXJlbmNlL2NoZXRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZXJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzeXN2eHguZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nvcm1ici5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYW5nYi5mCityZWZlcmVuY2UvY2hldHJzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlcmZzeC5mICAgICAgICAgICAgICByZWZlcmVuY2UvZHN5dGQyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc29ybWhyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhbmdlLmYKK3JlZmVyZW5jZS9jaGZyay5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2VycTIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3l0ZjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zb3JtbDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFuZ3QuZgorcmVmZXJlbmNlL2NoZ2Vxei5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZXJxZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzeXRyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nvcm1scS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYW5oYi5mCityZWZlcmVuY2UvY2hsYV90cmFuc3R5cGUuZiAgICAgICByZWZlcmVuY2UvZGdlc2MyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHN5dHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc29ybXFsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhbmhlLmYKK3JlZmVyZW5jZS9jaHBjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2VzZGQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kc3l0cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zb3JtcXIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFuaGYuZgorcmVmZXJlbmNlL2NocGV2ZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZXN2ZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RzeXRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nvcm1yMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYW5ocC5mCityZWZlcmVuY2UvY2hwZXYuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlc3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZHRiY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc29ybXIzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhbmhzLmYKK3JlZmVyZW5jZS9jaHBldnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2VzdmouZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdGJyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zb3JtcnEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFuaHQuZgorcmVmZXJlbmNlL2NocGdzdC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZXN2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0YnRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nvcm1yei5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYW5zYi5mCityZWZlcmVuY2UvY2hwZ3ZkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdlc3Z4eC5mICAgICAgICAgICAgICByZWZlcmVuY2UvZHRmc20uZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc29ybXRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhbnNwLmYKK3JlZmVyZW5jZS9jaHBndi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2V0YzIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdGZ0cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcGJjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFuc3kuZgorcmVmZXJlbmNlL2NocGd2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZXRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0ZnR0cC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwYmVxdS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYW50Yi5mCityZWZlcmVuY2UvY2hwcmZzLmYKK3JlZmVyZW5jZS9kdGZ0dHIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcGJyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFudHAuZgorcmVmZXJlbmNlL2NocHN2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZXRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0Z2V2Yy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwYnN0Zi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYW50ci5mCityZWZlcmVuY2UvY2hwc3Z4LmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UvZHRnZXgyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3Bic3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcGxsLmYKK3JlZmVyZW5jZS9jaHB0cmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2diYWsuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdGdleGMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcGJzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFwbXQuZgorcmVmZXJlbmNlL2NocHRyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZ2JhbC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0Z3Nlbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwYnRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9wb3Jjb25kX2MuZgorcmVmZXJlbmNlL2NocHRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZ2VzLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0Z3NqYS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwYnRyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9wb3Jjb25kX3guZgorcmVmZXJlbmNlL2NocHRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZ2VzeC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0Z3NuYS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwYnRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9wb3Jmc3hfZXh0ZW5kZWQuZgorcmVmZXJlbmNlL2Noc2Vpbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZ2V2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0Z3N5Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwZnRyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9wb3Jwdmdydy5mCityZWZlcmVuY2UvY2hzZXFyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdnZXZ4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHRnc3lsLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3BmdHJpLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcWdiLmYKK3JlZmVyZW5jZS9jbGFicmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2dnbG0uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdHBjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcGZ0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFxZ2UuZgorcmVmZXJlbmNlL2NsYWNndi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZ2hyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0cHJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nwb2Nvbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXFoYi5mCityZWZlcmVuY2UvY2xhY24yLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdnbHNlLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHRwdHJpLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3BvZXF1Yi5mICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcWhlLmYKK3JlZmVyZW5jZS9jbGFjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2dxcmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdHB0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcG9lcXUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFxaHAuZgorcmVmZXJlbmNlL2NsYWNwMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RnZ3JxZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0cHR0Zi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nwb3Jmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXFwMi5mCityZWZlcmVuY2UvY2xhY3B5LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdnc3ZkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHRwdHRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3BvcmZzeC5mICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcXBzLmYKK3JlZmVyZW5jZS9jbGFjcm0uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ2dzdnAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdHJjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcG9zdi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFxcjAuZgorcmVmZXJlbmNlL2NsYWNydC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rnc3ZqMC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0cmV2Yy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nwb3N2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXFyMS5mCityZWZlcmVuY2UvY2xhZGl2LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGdzdmoxLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHRyZXhjLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3Bvc3Z4eC5mICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcXIyLmYKK3JlZmVyZW5jZS9jbGFlZDAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ3Rjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdHJyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcG90ZjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFxcjMuZgorcmVmZXJlbmNlL2NsYWVkNy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RndHJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0cnNlbi5mCityZWZlcmVuY2UvemxhcXI0LmYKK3JlZmVyZW5jZS9jbGFlZDguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ3Rzdi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdHJzbmEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcG90cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFxcjUuZgorcmVmZXJlbmNlL2NsYWVpbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RndHN2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0cnN5bC5mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXFzYi5mCityZWZlcmVuY2UvY2xhZXN5LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGd0dHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHRydGkyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3BwY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcXNwLmYKK3JlZmVyZW5jZS9jbGFldjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kZ3R0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdHJ0cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcHBlcXUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFxc3kuZgorcmVmZXJlbmNlL2NsYWcyei5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RndHRzMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0cnRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwcHJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXIxdi5mCityZWZlcmVuY2UvY2xhX2diYW12LmYgICAgICAgICAgICByZWZlcmVuY2UvZGhnZXF6LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHRydHRmLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3Bwc3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcjJ2LmYKK3JlZmVyZW5jZS9jbGFfZ2JyY29uZF9jLmYgICAgICAgIHJlZmVyZW5jZS9kaHNlaW4uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kdHJ0dHAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcHBzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFyY20uZgorcmVmZXJlbmNlL2NsYV9nYnJjb25kX3guZiAgICAgICAgcmVmZXJlbmNlL2Roc2Vxci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R0enJxZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwcHRyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXJmYi5mCityZWZlcmVuY2UvY2xhX2dicmZzeF9leHRlbmRlZC5mICByZWZlcmVuY2UvZGlzbmFuLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZHR6cnpmLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3BwdHJpLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcmYuZgorcmVmZXJlbmNlL2NsYV9nYnJwdmdydy5mICAgICAgICAgcmVmZXJlbmNlL2RsYWJhZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2R6c3VtMS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwcHRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXJmZy5mCityZWZlcmVuY2UvY2xhX2dlYW12LmYgICAgICAgICAgICByZWZlcmVuY2UvZGxhYnJkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvaWNtYXgxLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3BzdGYyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcmZwLmYKK3JlZmVyZW5jZS9jbGFfZ2VyY29uZF9jLmYgICAgICAgIHJlZmVyZW5jZS9kbGFjbjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9pZWVlY2suZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcHN0cmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFyZnQuZgorcmVmZXJlbmNlL2NsYV9nZXJjb25kX3guZiAgICAgICAgcmVmZXJlbmNlL2RsYWNvbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2lsYWNsYy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwdGNvbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXJmeC5mCityZWZlcmVuY2UvY2xhX2dlcmZzeF9leHRlbmRlZC5mICByZWZlcmVuY2UvZGxhY3B5LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvaWxhY2xyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3B0ZXFyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemxhcmd2LmYKK3JlZmVyZW5jZS9jbGFnczIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFkaXYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9pbGFkaWFnLmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcHRyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFybnYuZgorcmVmZXJlbmNlL2NsYWd0bS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYWUyLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2lsYWRsYy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwdHN2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9ycHZncncuZgorcmVmZXJlbmNlL2NsYV9oZWFtdi5mICAgICAgICAgICAgcmVmZXJlbmNlL2RsYWViei5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2lsYWRsci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwdHN2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXJydi5mCityZWZlcmVuY2UvY2xhaGVmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhZWQwLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvaWxhZW52LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3B0dHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcnNjbDIuZgorcmVmZXJlbmNlL2NsYV9oZXJjb25kX2MuZiAgICAgICAgcmVmZXJlbmNlL2RsYWVkMS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2lsYXByZWMuZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3NwdHRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXJ0Zy5mCityZWZlcmVuY2UvY2xhX2hlcmNvbmRfeC5mICAgICAgICByZWZlcmVuY2UvZGxhZWQyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvaWxhc2xjLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3B0dHMyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhcnR2LmYKK3JlZmVyZW5jZS9jbGFfaGVyZnN4X2V4dGVuZGVkLmYgIHJlZmVyZW5jZS9kbGFlZDMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9pbGFzbHIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zcnNjbC5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFyemIuZgorcmVmZXJlbmNlL2NsYV9oZXJwdmdydy5mICAgICAgICAgcmVmZXJlbmNlL2RsYWVkNC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2lsYXRyYW5zLmYgICAgICAgICAgICAgcmVmZXJlbmNlL3NzYmV2ZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXJ6LmYKK3JlZmVyZW5jZS9jbGFocXIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFlZDUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9pbGF1cGxvLmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc2Jldi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFyenQuZgorcmVmZXJlbmNlL2NsYWhyMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYWVkNi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2lsYXZlci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzYmV2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXNjbDIuZgorcmVmZXJlbmNlL2NsYWhyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYWVkNy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2lsYXpsYy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzYmdzdC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXNjbC5mCityZWZlcmVuY2UvY2xhaWMxLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhZWQ4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvaWxhemxyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3NiZ3ZkLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemxhc2V0LmYKK3JlZmVyZW5jZS9jbGFfbGluX2JlcnIuZiAgICAgICAgIHJlZmVyZW5jZS9kbGFlZDkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9pcGFybXEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc2Jndi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFzci5mCityZWZlcmVuY2UvY2xhbHMwLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhZWRhLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvaXptYXgxLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3NiZ3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemxhc3NxLmYKK3JlZmVyZW5jZS9jbGFsc2EuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFlaW4uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9sc2FtZW4uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc2J0cmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFzd3AuZgorcmVmZXJlbmNlL2NsYWxzZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYWV2Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NiZHNkYy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzZnJrLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYV9zeWFtdi5mCityZWZlcmVuY2UvY2xhbmdiLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhZXhjLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2Jkc3FyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3NwY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemxhc3lmLmYKK3JlZmVyZW5jZS9jbGFuZ2UuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFnMi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zY3N1bTEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3BldmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFfc3lyY29uZF9jLmYKK3JlZmVyZW5jZS9jbGFuZ3QuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFnMnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZGlzbmEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3Bldi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFfc3lyY29uZF94LmYKK3JlZmVyZW5jZS9jbGFuaGIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFfZ2JhbXYuZiAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2JicmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3BldnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFfc3lyZnN4X2V4dGVuZGVkLmYKK3JlZmVyZW5jZS9jbGFuaGUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFfZ2JyY29uZC5mICAgICAgICAgIHJlZmVyZW5jZS9zZ2Jjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3Bnc3QuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGFfc3lycHZncncuZgorcmVmZXJlbmNlL2NsYW5oZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYV9nYnJmc3hfZXh0ZW5kZWQuZiAgcmVmZXJlbmNlL3NnYmVxdWIuZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzcGd2ZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXQyYy5mCityZWZlcmVuY2UvY2xhbmhwLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhX2dicnB2Z3J3LmYgICAgICAgICByZWZlcmVuY2Uvc2diZXF1LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3NwZ3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhdGJzLmYKK3JlZmVyZW5jZS9jbGFuaHMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFfZ2VhbXYuZiAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2JyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3BndnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGF0ZGYuZgorcmVmZXJlbmNlL2NsYW5odC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYV9nZXJjb25kLmYgICAgICAgICAgcmVmZXJlbmNlL3NnYnJmc3guZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzcHJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXRwcy5mCityZWZlcmVuY2UvY2xhbnNiLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhX2dlcmZzeF9leHRlbmRlZC5mICByZWZlcmVuY2Uvc2dic3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3Nwc3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhdHJkLmYKK3JlZmVyZW5jZS9jbGFuc3AuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFnczIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2JzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3BzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGF0cnMuZgorcmVmZXJlbmNlL2NsYW5zeS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYWd0Zi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnYnN2eHguZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzcHRyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXRyei5mCityZWZlcmVuY2UvY2xhbnRiLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhZ3RtLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2didGYyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3NwdHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhdHptLmYKK3JlZmVyZW5jZS9jbGFudHAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFndHMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2J0cmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3B0cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96bGF1dTIuZgorcmVmZXJlbmNlL2NsYW50ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYWd2Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnYnRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzcHRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3psYXV1bS5mCityZWZlcmVuY2UvY2xhcGxsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhaHFyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlYmFrLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N0ZWJ6LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemxhX3d3YWRkdy5mCityZWZlcmVuY2UvY2xhcG10LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhaHIyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlYmFsLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N0ZWRjLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenBiY29uLmYKK3JlZmVyZW5jZS9jbGFfcG9yY29uZF9jLmYgICAgICAgIHJlZmVyZW5jZS9kbGFocmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2ViZDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3RlZ3IuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cGJlcXUuZgorcmVmZXJlbmNlL2NsYV9wb3Jjb25kX3guZiAgICAgICAgcmVmZXJlbmNlL2RsYWljMS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZWJyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzdGVpbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwYnJmcy5mCityZWZlcmVuY2UvY2xhX3BvcmZzeF9leHRlbmRlZC5mICByZWZlcmVuY2UvZGxhaXNuYW4uZiAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N0ZW1yLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenBic3RmLmYKK3JlZmVyZW5jZS9jbGFfcG9ycHZncncuZiAgICAgICAgIHJlZmVyZW5jZS9kbGFfbGluX2JlcnIuZiAgICAgICAgIHJlZmVyZW5jZS9zZ2VlcXViLmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3RlcXIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cGJzdi5mCityZWZlcmVuY2UvY2xhcWdiLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhbG4yLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlZXF1LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N0ZXJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenBic3Z4LmYKK3JlZmVyZW5jZS9jbGFxZ2UuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFsczAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2Vlcy5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3RldmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cGJ0ZjIuZgorcmVmZXJlbmNlL2NsYXFoYi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYWxzYS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZWVzeC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzdGV2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwYnRyZi5mCityZWZlcmVuY2UvY2xhcWhlLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhbHNkLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlZXYuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N0ZXZyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenBidHJzLmYKK3JlZmVyZW5jZS9jbGFxaHAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFtcmcuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2VldnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3RldnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cGZ0cmYuZgorcmVmZXJlbmNlL2NsYXFwMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYW5lZy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZWdzLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzeWNvbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwZnRyaS5mCityZWZlcmVuY2UvY2xhcXBzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhbmdiLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlZ3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N5ZXF1Yi5mICAgICAgICAgICAgICByZWZlcmVuY2UvenBmdHJzLmYKK3JlZmVyZW5jZS9jbGFxcjAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFuZ2UuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2VoZDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3lldmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cG9jb24uZgorcmVmZXJlbmNlL2NsYXFyMS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYW5ndC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZWhyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwb2VxdWIuZgorcmVmZXJlbmNlL2NsYXFyMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYW5ocy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZWpzdi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzeWV2ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwb2VxdS5mCityZWZlcmVuY2UvY2xhcXIzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhbnNiLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlbHEyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N5ZXZ4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenBvcmZzLmYKK3JlZmVyZW5jZS9jbGFxcjQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFuc2YuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2VscWYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3lnczIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cG9yZnN4LmYKK3JlZmVyZW5jZS9jbGFxcjUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFuc3AuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2Vsc2QuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3lnc3QuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cG9zdi5mCityZWZlcmVuY2UvY2xhcXNiLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhbnN0LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlbHMuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N5Z3ZkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenBvc3Z4LmYKK3JlZmVyZW5jZS9jbGFxc3AuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFuc3kuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2Vsc3MuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3lndi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cG9zdnh4LmYKK3JlZmVyZW5jZS9jbGFxc3kuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFudGIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2Vsc3guZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3lndnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cG90ZjIuZgorcmVmZXJlbmNlL2NsYXIxdi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYW50cC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZWxzeS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzeXJmcy5mCityZWZlcmVuY2UvY2xhcjJ2LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhbnRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlcWwyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N5cmZzeC5mICAgICAgICAgICAgICByZWZlcmVuY2UvenBvdHJpLmYKK3JlZmVyZW5jZS9jbGFyY20uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFudjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2VxbGYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3lzdi5mICAgICAgICAgICAgICAgIAorcmVmZXJlbmNlL2NsYXJmYi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXBsbC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZXFwMy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzeXN2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwcGNvbi5mCityZWZlcmVuY2UvY2xhcmYuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcG10LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlcXBmLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N5c3Z4eC5mICAgICAgICAgICAgICByZWZlcmVuY2UvenBwZXF1LmYKK3JlZmVyZW5jZS9jbGFyZmcuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFfcG9yY29uZC5mICAgICAgICAgIHJlZmVyZW5jZS9zZ2VxcjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3l0ZDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cHByZnMuZgorcmVmZXJlbmNlL2NsYXJmcC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYV9wb3Jmc3hfZXh0ZW5kZWQuZiAgcmVmZXJlbmNlL3NnZXFyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzeXRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwcHN2LmYKK3JlZmVyZW5jZS9jbGFyZnQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFfcG9ycHZncncuZiAgICAgICAgIHJlZmVyZW5jZS9zZ2VyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3l0cmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cHBzdnguZgorcmVmZXJlbmNlL2NsYXJmeC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXB5Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZXJmc3guZiAgICAgICAgICAgICAgcmVmZXJlbmNlL3NzeXRyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwcHRyZi5mCityZWZlcmVuY2UvY2xhcmd2LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcHkzLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlcnEyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3N5dHJpLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenBwdHJpLmYKK3JlZmVyZW5jZS9jbGFybnYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFxZ2IuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2VycWYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zc3l0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cHB0cnMuZgorcmVmZXJlbmNlL2NsYV9ycHZncncuZiAgICAgICAgICAgcmVmZXJlbmNlL2RsYXFnZS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZXNjMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0YmNvbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwc3RmMi5mCityZWZlcmVuY2UvY2xhcnJ2LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcXAyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlc2RkLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3RicmZzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenBzdHJmLmYKK3JlZmVyZW5jZS9jbGFyc2NsMi5mICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFxcHMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2VzdmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zdGJ0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cHRjb24uZgorcmVmZXJlbmNlL2NsYXJ0Zy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXFyMC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZXN2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0ZnNtLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwdGVxci5mCityZWZlcmVuY2UvY2xhcnR2LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcXIxLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlc3ZqLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3RmdHJpLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenB0cmZzLmYKK3JlZmVyZW5jZS9jbGFyemIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFxcjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2VzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zdGZ0dHAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cHRzdi5mCityZWZlcmVuY2UvY2xhcnouZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcXIzLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dlc3Z4eC5mICAgICAgICAgICAgICByZWZlcmVuY2Uvc3RmdHRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenB0c3Z4LmYKK3JlZmVyZW5jZS9jbGFyenQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFxcjQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2V0YzIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zdGdldmMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cHR0cmYuZgorcmVmZXJlbmNlL2NsYXNjbDIuZiAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXFyNS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZXRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0Z2V4Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pwdHRycy5mCityZWZlcmVuY2UvY2xhc2NsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcXNiLmYKK3JlZmVyZW5jZS9zdGdleGMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96cHR0czIuZgorcmVmZXJlbmNlL2NsYXNldC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXFzcC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZXRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0Z3Nlbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pyb3QuZgorcmVmZXJlbmNlL2NsYXNyLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXFzeS5mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0Z3NqYS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzcGNvbi5mCityZWZlcmVuY2UvY2xhc3NxLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcXRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dnYmFrLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3Rnc25hLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenNwbXYuZgorcmVmZXJlbmNlL2NsYXN3cC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXIxdi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZ2JhbC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0Z3N5Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzcHIuZgorcmVmZXJlbmNlL2NsYV9zeWFtdi5mICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXIydi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZ2VzLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0Z3N5bC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzcHJmcy5mCityZWZlcmVuY2UvY2xhc3lmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcmZiLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dnZXN4LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3RwY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenNwc3YuZgorcmVmZXJlbmNlL2NsYV9zeXJjb25kX2MuZiAgICAgICAgcmVmZXJlbmNlL2RsYXJmLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZ2V2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0cHJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzcHN2eC5mCityZWZlcmVuY2UvY2xhX3N5cmNvbmRfeC5mICAgICAgICByZWZlcmVuY2UvZGxhcmZnLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dnZXZ4LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3RwdHJpLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenNwdHJmLmYKK3JlZmVyZW5jZS9jbGFfc3lyZnN4X2V4dGVuZGVkLmYgIHJlZmVyZW5jZS9kbGFyZnAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2dnbG0uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zdHB0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96c3B0cmkuZgorcmVmZXJlbmNlL2NsYV9zeXJwdmdydy5mICAgICAgICAgcmVmZXJlbmNlL2RsYXJmdC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZ2hyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0cHR0Zi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzcHRycy5mCityZWZlcmVuY2UvY2xhdGJzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcmZ4LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dnbHNlLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3RwdHRyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenN0ZWRjLmYKK3JlZmVyZW5jZS9jbGF0ZGYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFyZ3YuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2dxcmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zdHJjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96c3RlZ3IuZgorcmVmZXJlbmNlL2NsYXRwcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXJudi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NnZ3JxZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0cmV2Yy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzdGVpbi5mCityZWZlcmVuY2UvY2xhdHJkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhX3Jwdmdydy5mICAgICAgICAgICByZWZlcmVuY2Uvc2dnc3ZkLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3RyZXhjLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenN0ZW1yLmYKK3JlZmVyZW5jZS9jbGF0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFycmEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zZ2dzdnAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zdHJyZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96c3RlcXIuZgorcmVmZXJlbmNlL2NsYXRyei5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXJyYi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Nnc3ZqMC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0cnNlbi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzeWNvbi5mCityZWZlcmVuY2UvY2xhdHptLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcnJjLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2dzdmoxLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3Ryc25hLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenN5ZXF1Yi5mCityZWZlcmVuY2UvY2xhdXUyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcnJkLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2d0Y29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3Ryc3lsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenN5bXYuZgorcmVmZXJlbmNlL2NsYXV1bS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXJyZS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NndHJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0cnRpMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzeXIuZgorcmVmZXJlbmNlL2NsYV93d2FkZHcuZiAgICAgICAgICAgcmVmZXJlbmNlL2RsYXJyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NndHN2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0cnRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzeXJmcy5mCityZWZlcmVuY2UvY3BiY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcnJqLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2d0c3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3RydHJzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenN5cmZzeC5mCityZWZlcmVuY2UvY3BiZXF1LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcnJrLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2d0dHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3RydHRmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenN5c3YuZgorcmVmZXJlbmNlL2NwYnJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXJyci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NndHRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3N0cnR0cC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzeXN2eC5mCityZWZlcmVuY2UvY3Bic3RmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcnJ2LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2d0dHMyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3R6cnFmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenN5c3Z4eC5mCityZWZlcmVuY2UvY3Bic3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcnNjbDIuZiAgICAgICAgICAgICByZWZlcmVuY2Uvc2hnZXF6LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc3R6cnpmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenN5dGYyLmYKK3JlZmVyZW5jZS9jcGJzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFydGcuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zaHNlaW4uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS94ZXJibGFfYXJyYXkuZiAgICAgICAgIHJlZmVyZW5jZS96c3l0cmYuZgorcmVmZXJlbmNlL2NwYnRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXJ0di5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3Noc2Vxci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3hlcmJsYS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pzeXRyaS5mCityZWZlcmVuY2UvY3BidHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcnV2LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2lzbmFuLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemJkc3FyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenN5dHJzLmYKK3JlZmVyZW5jZS9jcGJ0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFyemIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFiYWQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Y2dlc3YuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dGJjb24uZgorcmVmZXJlbmNlL2NwZnRyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXJ6LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWJyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pjcG9zdi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0YnJmcy5mCityZWZlcmVuY2UvY3BmdHJpLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhcnp0LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhY24yLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemRyc2NsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRidHJzLmYKK3JlZmVyZW5jZS9jcGZ0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzMi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2JicmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dGZzbS5mCityZWZlcmVuY2UvY3BvY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhc2NsMi5mICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhY3B5LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdiY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRmdHJpLmYKK3JlZmVyZW5jZS9jcG9lcXViLmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzY2wuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFkaXYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2JlcXViLmYgICAgICAgICAgICAgIHJlZmVyZW5jZS96dGZ0dHAuZgorcmVmZXJlbmNlL2Nwb2VxdS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXNkMC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWUyLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnYmVxdS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0ZnR0ci5mCityZWZlcmVuY2UvY3BvcmZzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhc2QxLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhZWJ6LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdicmZzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRnZXZjLmYKK3JlZmVyZW5jZS9jcG9yZnN4LmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzZDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFlZDAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2JyZnN4LmYgICAgICAgICAgICAgIHJlZmVyZW5jZS96dGdleDIuZgorcmVmZXJlbmNlL2Nwb3N2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXNkMy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWVkMS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnYnN2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0Z2V4Yy5mCityZWZlcmVuY2UvY3Bvc3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhc2Q0LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhZWQyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemdic3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRnc2VuLmYKK3JlZmVyZW5jZS9jcG9zdnh4LmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzZDUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFlZDMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2Jzdnh4LmYgICAgICAgICAgICAgIHJlZmVyZW5jZS96dGdzamEuZgorcmVmZXJlbmNlL2Nwb3RmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXNkNi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWVkNC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnYnRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0Z3NuYS5mCityZWZlcmVuY2UvZGxhc2Q3LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhZWQ1LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdidHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRnc3kyLmYKK3JlZmVyZW5jZS9jcG90cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzZDguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFlZDYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2J0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dGdzeWwuZgorICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXNkYS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWVkNy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZWJhay5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0cGNvbi5mCityZWZlcmVuY2UvY3BwY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhc2RxLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhZWQ4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdlYmFsLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRwcmZzLmYKK3JlZmVyZW5jZS9jcHBlcXUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzZHQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFlZDkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2ViZDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dHB0cmkuZgorcmVmZXJlbmNlL2NwcHJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXNldC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWVkYS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZWJyZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0cHRycy5mCityZWZlcmVuY2UvY3Bwc3YuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhc3ExLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhZWluLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdlY29uLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRwdHRmLmYKK3JlZmVyZW5jZS9jcHBzdnguZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzcTIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFldjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2VlcXViLmYgICAgICAgICAgICAgIHJlZmVyZW5jZS96dHB0dHIuZgorcmVmZXJlbmNlL2NwcHRyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXNxMy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWV4Yy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZWVxdS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0cmNvbi5mCityZWZlcmVuY2UvY3BwdHJpLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhc3E0LmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhZzJkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdlZXMuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvenRyZXZjLmYKK3JlZmVyZW5jZS9jcHB0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzcTUuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFnMi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2Vlc3guZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dHJleGMuZgorcmVmZXJlbmNlL2Nwc3RmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXNxNi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYV9nYmFtdi5mICAgICAgICAgICAgcmVmZXJlbmNlL3pnZWV2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0cnJmcy5mCityZWZlcmVuY2UvY3BzdHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhc3IuZiAgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhX2dicmNvbmQuZiAgICAgICAgICByZWZlcmVuY2UvemdlZXZ4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRyc2VuLmYKK3JlZmVyZW5jZS9jcHRjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzcnQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFfZ2JyZnN4X2V4dGVuZGVkLmYgIHJlZmVyZW5jZS96Z2Vncy5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dHJzbmEuZgorcmVmZXJlbmNlL2NwdGVxci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXNzcS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYV9nYnJwdmdydy5mICAgICAgICAgcmVmZXJlbmNlL3pnZWd2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0cnN5bC5mCityZWZlcmVuY2UvY3B0cmZzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhc3YyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhX2dlYW12LmYgICAgICAgICAgICByZWZlcmVuY2UvemdlaGQyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRydGkyLmYKK3JlZmVyZW5jZS9jcHRzdi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzd3AuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFfZ2VyY29uZC5mICAgICAgICAgIHJlZmVyZW5jZS96Z2VocmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dHJ0cmkuZgorcmVmZXJlbmNlL2NwdHN2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXN5Mi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYV9nZXJmc3hfZXh0ZW5kZWQuZiAgcmVmZXJlbmNlL3pnZWxxMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0cnRycy5mCityZWZlcmVuY2UvY3B0dHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhX3N5YW12LmYgICAgICAgICAgICByZWZlcmVuY2Uvc2xhZ3MyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdlbHFmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenRydHRmLmYKK3JlZmVyZW5jZS9jcHR0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFzeWYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFndGYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2Vsc2QuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dHJ0dHAuZgorcmVmZXJlbmNlL2NwdHRzMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYV9zeXJjb25kLmYgICAgICAgICAgcmVmZXJlbmNlL3NsYWd0bS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZWxzLmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p0enJxZi5mCityZWZlcmVuY2UvY3JvdC5mICAgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhX3N5cmZzeF9leHRlbmRlZC5mICByZWZlcmVuY2Uvc2xhZ3RzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdlbHNzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenR6cnpmLmYKK3JlZmVyZW5jZS9jc3Bjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGFfc3lycHZncncuZiAgICAgICAgIHJlZmVyZW5jZS9zbGFndjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2Vsc3guZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dW5nMmwuZgorcmVmZXJlbmNlL2NzcG12LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXQycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWhxci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZWxzeS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p1bmcyci5mCityZWZlcmVuY2UvY3Nwci5mICAgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhdGJzLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhaHIyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdlcWwyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenVuZ2JyLmYKK3JlZmVyZW5jZS9jc3ByZnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGF0ZGYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFocmQuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2VxbGYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dW5naHIuZgorcmVmZXJlbmNlL2NzcHN2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXRwcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWljMS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZXFwMy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p1bmdsMi5mCityZWZlcmVuY2UvY3Nwc3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhdHJkLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhaXNuYW4uZiAgICAgICAgICAgICByZWZlcmVuY2UvemdlcXBmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenVuZ2xxLmYKK3JlZmVyZW5jZS9jc3B0cmYuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGF0cnMuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFfbGluX2JlcnIuZiAgICAgICAgIHJlZmVyZW5jZS96Z2VxcjIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dW5ncWwuZgorcmVmZXJlbmNlL2NzcHRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXRyei5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWxuMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZXFyZi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p1bmdxci5mCityZWZlcmVuY2UvY3NwdHJzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhdHptLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhbHMwLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdlcmZzLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenVuZ3IyLmYKK3JlZmVyZW5jZS9jc3JzY2wuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kbGF1dTIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFsc2EuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2VyZnN4LmYgICAgICAgICAgICAgIHJlZmVyZW5jZS96dW5ncnEuZgorcmVmZXJlbmNlL2NzdGVkYy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RsYXV1bS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYWxzZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZXJxMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p1bmd0ci5mCityZWZlcmVuY2UvY3N0ZWdyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZGxhX3d3YWRkdy5mICAgICAgICAgICByZWZlcmVuY2Uvc2xhbXJnLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdlcnFmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenVubTJsLmYKK3JlZmVyZW5jZS9jc3RlaW4uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kb3BndHIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFuZWcuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2VzYzIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dW5tMnIuZgorcmVmZXJlbmNlL2NzdGVtci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RvcG10ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYW5nYi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZXNkZC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p1bm1ici5mCityZWZlcmVuY2UvY3N0ZXFyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZG9yZzJsLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhbmdlLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemdlc3ZkLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvenVubWhyLmYKK3JlZmVyZW5jZS9jc3ljb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kb3JnMnIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFuZ3QuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2Vzdi5mICAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dW5tbDIuZgorcmVmZXJlbmNlL2NzeWVxdWIuZiAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rvcmdici5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYW5ocy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZXN2eC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p1bm1scS5mCityZWZlcmVuY2UvY3N5bXYuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvZG9yZ2hyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhbnNiLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvemdlc3Z4eC5mICAgICAgICAgICAgICByZWZlcmVuY2UvenVubXFsLmYKK3JlZmVyZW5jZS9jc3lyLmYgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kb3JnbDIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFuc2YuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2V0YzIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dW5tcXIuZgorcmVmZXJlbmNlL2NzeXJmcy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2RvcmdscS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYW5zcC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZXRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p1bm1yMi5mCityZWZlcmVuY2UvY3N5cmZzeC5mICAgICAgICAgICAgICByZWZlcmVuY2UvZG9yZ3FsLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhbnN0LmYKK3JlZmVyZW5jZS96dW5tcjMuZgorcmVmZXJlbmNlL2NzeXN2LmYgICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rvcmdxci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYW5zeS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZXRyaS5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p1bm1ycS5mCityZWZlcmVuY2UvY3N5c3Z4LmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZG9yZ3IyLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhbnRiLmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UvenVubXJ6LmYKK3JlZmVyZW5jZS9jc3lzdnh4LmYgICAgICAgICAgICAgIHJlZmVyZW5jZS9kb3JncnEuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFudHAuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2diYWsuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96dW5tdHIuZgorcmVmZXJlbmNlL2NzeXRmMi5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rvcmd0ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYW50ci5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZ2JhbC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3p1cGd0ci5mCityZWZlcmVuY2UvY3N5dHJmLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvZG9ybTJsLmYgICAgICAgICAgICAgICByZWZlcmVuY2Uvc2xhbnYyLmYgICAgICAgICAgICAgICByZWZlcmVuY2UvemdnZXMuZiAgICAgICAgICAgICAgICByZWZlcmVuY2UvenVwbXRyLmYKK3JlZmVyZW5jZS9jc3l0cmkuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kb3JtMnIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFwbGwuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS96Z2dlc3guZgorcmVmZXJlbmNlL2NzeXRycy5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL2Rvcm1ici5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3NsYXBtdC5mICAgICAgICAgICAgICAgcmVmZXJlbmNlL3pnZ2V2LmYKK3JlZmVyZW5jZS9jdGJjb24uZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9kb3JtaHIuZiAgICAgICAgICAgICAgIHJlZmVyZW5jZS9zbGFfcG9yY29uZC5mICAgICAgICAgIHJlZmVyZW5jZS96Z2dldnguZgorKQorZW5kaWYoKQorCitlbmRpZihFSUdFTl9Gb3J0cmFuX0NPTVBJTEVSX1dPUktTKQorCithZGRfbGlicmFyeShlaWdlbl9sYXBhY2tfc3RhdGljICR7RWlnZW5MYXBhY2tfU1JDU30pCithZGRfbGlicmFyeShlaWdlbl9sYXBhY2sgU0hBUkVEICR7RWlnZW5MYXBhY2tfU1JDU30pCisKK2lmKEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoZWlnZW5fbGFwYWNrX3N0YXRpYyAke0VJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGVpZ2VuX2xhcGFjayAgICAgICAgJHtFSUdFTl9TVEFOREFSRF9MSUJSQVJJRVNfVE9fTElOS19UT30pCitlbmRpZigpCisKK2FkZF9kZXBlbmRlbmNpZXMobGFwYWNrIGVpZ2VuX2xhcGFjayBlaWdlbl9sYXBhY2tfc3RhdGljKQorCitpbnN0YWxsKFRBUkdFVFMgZWlnZW5fbGFwYWNrIGVpZ2VuX2xhcGFja19zdGF0aWMKKyAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4KKyAgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiBsaWIKKyAgICAgICAgQVJDSElWRSBERVNUSU5BVElPTiBsaWIpCisKKyMgICBhZGRfc3ViZGlyZWN0b3J5KHRlc3RpbmcpCisKZGlmZiAtLWdpdCBhL2xhcGFjay9jaG9sZXNreS5jcHAgYi9sYXBhY2svY2hvbGVza3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNGZhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svY2hvbGVza3kuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibGFwYWNrX2NvbW1vbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PgorCisvLyBQT1RSRiBjb21wdXRlcyB0aGUgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiBvZiBhIHJlYWwgc3ltbWV0cmljIHBvc2l0aXZlIGRlZmluaXRlIG1hdHJpeCBBLgorRUlHRU5fTEFQQUNLX0ZVTkMocG90cmYsKGNoYXIqIHVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhLCBpbnQgKmluZm8pKQoreworICAqaW5mbyA9IDA7CisgICAgICAgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAqaW5mbyA9IC0xOworICBlbHNlICBpZigqbjwwKSAgICAgICAgICAgICAgICAgKmluZm8gPSAtMjsKKyAgZWxzZSAgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICppbmZvID0gLTQ7CisgIGlmKCppbmZvIT0wKQorICB7CisgICAgaW50IGUgPSAtKmluZm87CisgICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJQT1RSRiIsICZlLCA2KTsKKyAgfQorCisgIFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGEpOworICBNYXRyaXhUeXBlIEEoYSwqbiwqbiwqbGRhKTsKKyAgaW50IHJldDsKKyAgaWYoVVBMTygqdXBsbyk9PVVQKSByZXQgPSBpbnRlcm5hbDo6bGx0X2lucGxhY2U8U2NhbGFyLCBVcHBlcj46OmJsb2NrZWQoQSk7CisgIGVsc2UgICAgICAgICAgICAgICAgcmV0ID0gaW50ZXJuYWw6OmxsdF9pbnBsYWNlPFNjYWxhciwgTG93ZXI+OjpibG9ja2VkKEEpOworCisgIGlmKHJldD49MCkKKyAgICAqaW5mbyA9IHJldCsxOworICAKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFBPVFJTIHNvbHZlcyBhIHN5c3RlbSBvZiBsaW5lYXIgZXF1YXRpb25zIEEqWCA9IEIgd2l0aCBhIHN5bW1ldHJpYworLy8gcG9zaXRpdmUgZGVmaW5pdGUgbWF0cml4IEEgdXNpbmcgdGhlIENob2xlc2t5IGZhY3Rvcml6YXRpb24KKy8vIEEgPSBVKipUKlUgb3IgQSA9IEwqTCoqVCBjb21wdXRlZCBieSBEUE9UUkYuCitFSUdFTl9MQVBBQ0tfRlVOQyhwb3RycywoY2hhciogdXBsbywgaW50ICpuLCBpbnQgKm5yaHMsIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcGIsIGludCAqbGRiLCBpbnQgKmluZm8pKQoreworICAqaW5mbyA9IDA7CisgICAgICAgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAqaW5mbyA9IC0xOworICBlbHNlICBpZigqbjwwKSAgICAgICAgICAgICAgICAgKmluZm8gPSAtMjsKKyAgZWxzZSAgaWYoKm5yaHM8MCkgICAgICAgICAgICAgICppbmZvID0gLTM7CisgIGVsc2UgIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAqaW5mbyA9IC01OworICBlbHNlICBpZigqbGRiPHN0ZDo6bWF4KDEsKm4pKSAgKmluZm8gPSAtNzsKKyAgaWYoKmluZm8hPTApCisgIHsKKyAgICBpbnQgZSA9IC0qaW5mbzsKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlBPVFJTIiwgJmUsIDYpOworICB9CisKKyAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7CisgIFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGIpOworICBNYXRyaXhUeXBlIEEoYSwqbiwqbiwqbGRhKTsKKyAgTWF0cml4VHlwZSBCKGIsKm4sKm5yaHMsKmxkYik7CisKKyAgaWYoVVBMTygqdXBsbyk9PVVQKQorICB7CisgICAgQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5hZGpvaW50KCkuc29sdmVJblBsYWNlKEIpOworICAgIEEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKEIpOworICB9CisgIGVsc2UKKyAgeworICAgIEEudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmVJblBsYWNlKEIpOworICAgIEEudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuYWRqb2ludCgpLnNvbHZlSW5QbGFjZShCKTsKKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGFwYWNrL2NvbXBsZXhfZG91YmxlLmNwcCBiL2xhcGFjay9jb21wbGV4X2RvdWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0ZDJiOAotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9jb21wbGV4X2RvdWJsZS5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgU0NBTEFSICAgICAgICBzdGQ6OmNvbXBsZXg8ZG91YmxlPgorI2RlZmluZSBTQ0FMQVJfU1VGRklYIHoKKyNkZWZpbmUgU0NBTEFSX1NVRkZJWF9VUCAiWiIKKyNkZWZpbmUgUkVBTF9TQ0FMQVJfU1VGRklYIGQKKyNkZWZpbmUgSVNDT01QTEVYICAgICAxCisKKyNpbmNsdWRlICJjaG9sZXNreS5jcHAiCisjaW5jbHVkZSAibHUuY3BwIgpkaWZmIC0tZ2l0IGEvbGFwYWNrL2NvbXBsZXhfc2luZ2xlLmNwcCBiL2xhcGFjay9jb21wbGV4X3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiMmQyOQotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9jb21wbGV4X3NpbmdsZS5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgU0NBTEFSICAgICAgICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+CisjZGVmaW5lIFNDQUxBUl9TVUZGSVggYworI2RlZmluZSBTQ0FMQVJfU1VGRklYX1VQICJDIgorI2RlZmluZSBSRUFMX1NDQUxBUl9TVUZGSVggcworI2RlZmluZSBJU0NPTVBMRVggICAgIDEKKworI2luY2x1ZGUgImNob2xlc2t5LmNwcCIKKyNpbmNsdWRlICJsdS5jcHAiCmRpZmYgLS1naXQgYS9sYXBhY2svZG91YmxlLmNwcCBiL2xhcGFjay9kb3VibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjU0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svZG91YmxlLmNwcApAQCAtMCwwICsxLDE3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBTQ0FMQVIgICAgICAgIGRvdWJsZQorI2RlZmluZSBTQ0FMQVJfU1VGRklYIGQKKyNkZWZpbmUgU0NBTEFSX1NVRkZJWF9VUCAiRCIKKyNkZWZpbmUgSVNDT01QTEVYICAgICAwCisKKyNpbmNsdWRlICJjaG9sZXNreS5jcHAiCisjaW5jbHVkZSAibHUuY3BwIgorI2luY2x1ZGUgImVpZ2VudmFsdWVzLmNwcCIKZGlmZiAtLWdpdCBhL2xhcGFjay9laWdlbnZhbHVlcy5jcHAgYi9sYXBhY2svZWlnZW52YWx1ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNTI2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svZWlnZW52YWx1ZXMuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgorCisvLyBjb21wdXRlcyBhbiBMVSBmYWN0b3JpemF0aW9uIG9mIGEgZ2VuZXJhbCBNLWJ5LU4gbWF0cml4IEEgdXNpbmcgcGFydGlhbCBwaXZvdGluZyB3aXRoIHJvdyBpbnRlcmNoYW5nZXMKK0VJR0VOX0xBUEFDS19GVU5DKHN5ZXYsKGNoYXIgKmpvYnosIGNoYXIgKnVwbG8sIGludCogbiwgU2NhbGFyKiBhLCBpbnQgKmxkYSwgU2NhbGFyKiB3LCBTY2FsYXIqIC8qd29yayovLCBpbnQqIGx3b3JrLCBpbnQgKmluZm8pKQoreworICAvLyBUT0RPIGV4cGxvaXQgdGhlIHdvcmsgYnVmZmVyCisgIGJvb2wgcXVlcnlfc2l6ZSA9ICpsd29yaz09LTE7CisgIAorICAqaW5mbyA9IDA7CisgICAgICAgIGlmKCpqb2J6IT0nTicgJiYgKmpvYnohPSdWJykgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTE7CisgIGVsc2UgIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTI7CisgIGVsc2UgIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTM7CisgIGVsc2UgIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvID0gLTU7CisgIGVsc2UgIGlmKCghcXVlcnlfc2l6ZSkgJiYgKmx3b3JrPHN0ZDo6bWF4KDEsMyoqbi0xKSkgICppbmZvID0gLTg7CisgIAorLy8gICBpZigqaW5mbz09MCkKKy8vICAgeworLy8gICAgIGludCBuYiA9IElMQUVOViggMSwgJ1NTWVRSRCcsIFVQTE8sIE4sIC0xLCAtMSwgLTEgKQorLy8gICAgICAgICAgTFdLT1BUID0gTUFYKCAxLCAoIE5CKzIgKSpOICkKKy8vICAgICAgICAgIFdPUksoIDEgKSA9IExXS09QVAorLy8gKgorLy8gICAgICAgICAgSUYoIExXT1JLLkxULk1BWCggMSwgMypOLTEgKSAuQU5ELiAuTk9ULkxRVUVSWSApCisvLyAgICAgICQgICAgICBJTkZPID0gLTgKKy8vICAgICAgIEVORCBJRgorLy8gKgorLy8gICAgICAgSUYoIElORk8uTkUuMCApIFRIRU4KKy8vICAgICAgICAgIENBTEwgWEVSQkxBKCAnU1NZRVYgJywgLUlORk8gKQorLy8gICAgICAgICAgUkVUVVJOCisvLyAgICAgICBFTFNFIElGKCBMUVVFUlkgKSBUSEVOCisvLyAgICAgICAgICBSRVRVUk4KKy8vICAgICAgIEVORCBJRgorICAKKyAgaWYoKmluZm8hPTApCisgIHsKKyAgICBpbnQgZSA9IC0qaW5mbzsKKyAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlNZRVYgIiwgJmUsIDYpOworICB9CisgIAorICBpZihxdWVyeV9zaXplKQorICB7CisgICAgKmx3b3JrID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaWYoKm49PTApCisgICAgcmV0dXJuIDA7CisgIAorICBQbGFpbk1hdHJpeFR5cGUgbWF0KCpuLCpuKTsKKyAgaWYoVVBMTygqdXBsbyk9PVVQKSBtYXQgPSBtYXRyaXgoYSwqbiwqbiwqbGRhKS5hZGpvaW50KCk7CisgIGVsc2UgICAgICAgICAgICAgICAgbWF0ID0gbWF0cml4KGEsKm4sKm4sKmxkYSk7CisgIAorICBib29sIGNvbXB1dGVWZWN0b3JzID0gKmpvYno9PSdWJyB8fCAqam9iej09J3YnOworICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPFBsYWluTWF0cml4VHlwZT4gZWlnKG1hdCxjb21wdXRlVmVjdG9ycz9Db21wdXRlRWlnZW52ZWN0b3JzOkVpZ2VudmFsdWVzT25seSk7CisgIAorICBpZihlaWcuaW5mbygpPT1Ob0NvbnZlcmdlbmNlKQorICB7CisgICAgdmVjdG9yKHcsKm4pLnNldFplcm8oKTsKKyAgICBpZihjb21wdXRlVmVjdG9ycykKKyAgICAgIG1hdHJpeChhLCpuLCpuLCpsZGEpLnNldElkZW50aXR5KCk7CisgICAgLy8qaW5mbyA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIHZlY3Rvcih3LCpuKSA9IGVpZy5laWdlbnZhbHVlcygpOworICBpZihjb21wdXRlVmVjdG9ycykKKyAgICBtYXRyaXgoYSwqbiwqbiwqbGRhKSA9IGVpZy5laWdlbnZlY3RvcnMoKTsKKyAgCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGFwYWNrL2xhcGFja19jb21tb24uaCBiL2xhcGFjay9sYXBhY2tfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1OGMxNAotLS0gL2Rldi9udWxsCisrKyBiL2xhcGFjay9sYXBhY2tfY29tbW9uLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTEFQQUNLX0NPTU1PTl9ICisjZGVmaW5lIEVJR0VOX0xBUEFDS19DT01NT05fSAorCisjaW5jbHVkZSAiLi4vYmxhcy9jb21tb24uaCIKKworI2RlZmluZSBFSUdFTl9MQVBBQ0tfRlVOQyhGVU5DLEFSR0xJU1QpICAgICAgICAgICAgICAgXAorICBleHRlcm4gIkMiIHsgaW50IEVJR0VOX0JMQVNfRlVOQyhGVU5DKSBBUkdMSVNUOyB9ICAgXAorICBpbnQgRUlHRU5fQkxBU19GVU5DKEZVTkMpIEFSR0xJU1QKKwordHlwZWRlZiBFaWdlbjo6TWFwPEVpZ2VuOjpUcmFuc3Bvc2l0aW9uczxFaWdlbjo6RHluYW1pYyxFaWdlbjo6RHluYW1pYyxpbnQ+ID4gUGl2b3RzVHlwZTsKKworCisKKyNlbmRpZiAvLyBFSUdFTl9MQVBBQ0tfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL2xhcGFjay9sdS5jcHAgYi9sYXBhY2svbHUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMTUxMTYKLS0tIC9kZXYvbnVsbAorKysgYi9sYXBhY2svbHUuY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSA8RWlnZW4vTFU+CisKKy8vIGNvbXB1dGVzIGFuIExVIGZhY3Rvcml6YXRpb24gb2YgYSBnZW5lcmFsIE0tYnktTiBtYXRyaXggQSB1c2luZyBwYXJ0aWFsIHBpdm90aW5nIHdpdGggcm93IGludGVyY2hhbmdlcworRUlHRU5fTEFQQUNLX0ZVTkMoZ2V0cmYsKGludCAqbSwgaW50ICpuLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIGludCAqaXBpdiwgaW50ICppbmZvKSkKK3sKKyAgKmluZm8gPSAwOworICAgICAgICBpZigqbTwwKSAgICAgICAgICAgICAgICAgICppbmZvID0gLTE7CisgIGVsc2UgIGlmKCpuPDApICAgICAgICAgICAgICAgICAgKmluZm8gPSAtMjsKKyAgZWxzZSAgaWYoKmxkYTxzdGQ6Om1heCgxLCptKSkgICAqaW5mbyA9IC00OworICBpZigqaW5mbyE9MCkKKyAgeworICAgIGludCBlID0gLSppbmZvOworICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiR0VUUkYiLCAmZSwgNik7CisgIH0KKworICBpZigqbT09MCB8fCAqbj09MCkKKyAgICByZXR1cm4gMDsKKworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgaW50IG5iX3RyYW5zcG9zaXRpb25zOworICBpbnQgcmV0ID0gRWlnZW46OmludGVybmFsOjpwYXJ0aWFsX2x1X2ltcGw8U2NhbGFyLENvbE1ham9yLGludD4KKyAgICAgICAgICAgICAgICAgOjpibG9ja2VkX2x1KCptLCAqbiwgYSwgKmxkYSwgaXBpdiwgbmJfdHJhbnNwb3NpdGlvbnMpOworCisgIGZvcihpbnQgaT0wOyBpPHN0ZDo6bWluKCptLCpuKTsgKytpKQorICAgIGlwaXZbaV0rKzsKKworICBpZihyZXQ+PTApCisgICAgKmluZm8gPSByZXQrMTsKKworICByZXR1cm4gMDsKK30KKworLy9HRVRSUyBzb2x2ZXMgYSBzeXN0ZW0gb2YgbGluZWFyIGVxdWF0aW9ucworLy8gICAgQSAqIFggPSBCICBvciAgQScgKiBYID0gQgorLy8gIHdpdGggYSBnZW5lcmFsIE4tYnktTiBtYXRyaXggQSB1c2luZyB0aGUgTFUgZmFjdG9yaXphdGlvbiBjb21wdXRlZCAgYnkgR0VUUkYKK0VJR0VOX0xBUEFDS19GVU5DKGdldHJzLChjaGFyICp0cmFucywgaW50ICpuLCBpbnQgKm5yaHMsIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwgaW50ICppcGl2LCBSZWFsU2NhbGFyICpwYiwgaW50ICpsZGIsIGludCAqaW5mbykpCit7CisgICppbmZvID0gMDsKKyAgICAgICAgaWYoT1AoKnRyYW5zKT09SU5WQUxJRCkgICppbmZvID0gLTE7CisgIGVsc2UgIGlmKCpuPDApICAgICAgICAgICAgICAgICAqaW5mbyA9IC0yOworICBlbHNlICBpZigqbnJoczwwKSAgICAgICAgICAgICAgKmluZm8gPSAtMzsKKyAgZWxzZSAgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICppbmZvID0gLTU7CisgIGVsc2UgIGlmKCpsZGI8c3RkOjptYXgoMSwqbikpICAqaW5mbyA9IC04OworICBpZigqaW5mbyE9MCkKKyAgeworICAgIGludCBlID0gLSppbmZvOworICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiR0VUUlMiLCAmZSwgNik7CisgIH0KKworICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKKyAgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYik7CisgIE1hdHJpeFR5cGUgbHUoYSwqbiwqbiwqbGRhKTsKKyAgTWF0cml4VHlwZSBCKGIsKm4sKm5yaHMsKmxkYik7CisKKyAgZm9yKGludCBpPTA7IGk8Km47ICsraSkKKyAgICBpcGl2W2ldLS07CisgIGlmKE9QKCp0cmFucyk9PU5PVFIpCisgIHsKKyAgICBCID0gUGl2b3RzVHlwZShpcGl2LCpuKSAqIEI7CisgICAgbHUudHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLnNvbHZlSW5QbGFjZShCKTsKKyAgICBsdS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZUluUGxhY2UoQik7CisgIH0KKyAgZWxzZSBpZihPUCgqdHJhbnMpPT1UUikKKyAgeworICAgIGx1LnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRyYW5zcG9zZSgpLnNvbHZlSW5QbGFjZShCKTsKKyAgICBsdS50cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkudHJhbnNwb3NlKCkuc29sdmVJblBsYWNlKEIpOworICAgIEIgPSBQaXZvdHNUeXBlKGlwaXYsKm4pLnRyYW5zcG9zZSgpICogQjsKKyAgfQorICBlbHNlIGlmKE9QKCp0cmFucyk9PUFESikKKyAgeworICAgIGx1LnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLmFkam9pbnQoKS5zb2x2ZUluUGxhY2UoQik7CisgICAgbHUudHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLmFkam9pbnQoKS5zb2x2ZUluUGxhY2UoQik7CisgICAgQiA9IFBpdm90c1R5cGUoaXBpdiwqbikudHJhbnNwb3NlKCkgKiBCOworICB9CisgIGZvcihpbnQgaT0wOyBpPCpuOyArK2kpCisgICAgaXBpdltpXSsrOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGFwYWNrL3NpbmdsZS5jcHAgYi9sYXBhY2svc2luZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRlZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGFwYWNrL3NpbmdsZS5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgU0NBTEFSICAgICAgICBmbG9hdAorI2RlZmluZSBTQ0FMQVJfU1VGRklYIHMKKyNkZWZpbmUgU0NBTEFSX1NVRkZJWF9VUCAiUyIKKyNkZWZpbmUgSVNDT01QTEVYICAgICAwCisKKyNpbmNsdWRlICJjaG9sZXNreS5jcHAiCisjaW5jbHVkZSAibHUuY3BwIgorI2luY2x1ZGUgImVpZ2VudmFsdWVzLmNwcCIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvQ01ha2VMaXN0cy50eHQgYi9zY3JpcHRzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWE2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorZ2V0X3Byb3BlcnR5KEVJR0VOX1RFU1RTX0xJU1QgR0xPQkFMIFBST1BFUlRZIEVJR0VOX1RFU1RTX0xJU1QpCitjb25maWd1cmVfZmlsZShidWlsZHRlc3RzLmluICR7Q01BS0VfQklOQVJZX0RJUn0vYnVpbGR0ZXN0cy5zaCBAT05MWSkKKworY29uZmlndXJlX2ZpbGUoY2hlY2suaW4gJHtDTUFLRV9CSU5BUllfRElSfS9jaGVjay5zaCBDT1BZT05MWSkKK2NvbmZpZ3VyZV9maWxlKGRlYnVnLmluICR7Q01BS0VfQklOQVJZX0RJUn0vZGVidWcuc2ggQ09QWU9OTFkpCitjb25maWd1cmVfZmlsZShyZWxlYXNlLmluICR7Q01BS0VfQklOQVJZX0RJUn0vcmVsZWFzZS5zaCBDT1BZT05MWSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYnVpbGR0ZXN0cy5pbiBiL3NjcmlwdHMvYnVpbGR0ZXN0cy5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MDI2MzczCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9idWlsZHRlc3RzLmluCkBAIC0wLDAgKzEsMjIgQEAKKyMhL2Jpbi9iYXNoCisKK2lmIFtbICQjICE9IDEgfHwgJDEgPT0gKmhlbHAgXV0KK3RoZW4KKyAgZWNobyAidXNhZ2U6IC4vY2hlY2sgcmVnZXhwIgorICBlY2hvICIgIEJ1aWxkcyB0ZXN0cyBtYXRjaGluZyB0aGUgcmVnZXhwLiIKKyAgZWNobyAiICBUaGUgRUlHRU5fTUFLRV9BUkdTIGVudmlyb25tZW50IHZhcmlhYmxlIGFsbG93cyB0byBwYXNzIGFyZ3MgdG8gJ21ha2UnLiIKKyAgZWNobyAiICAgIEZvciBleGFtcGxlLCB0byBsYXVuY2ggNSBjb25jdXJyZW50IGJ1aWxkcywgdXNlIEVJR0VOX01BS0VfQVJHUz0nLWo1JyIKKyAgZXhpdCAwCitmaQorCitURVNUU0xJU1Q9IkBFSUdFTl9URVNUU19MSVNUQCIKK3RhcmdldHNfdG9fbWFrZT1gZWNobyAiJFRFU1RTTElTVCIgfCBlZ3JlcCAiJDEiIHwgeGFyZ3MgZWNob2AKKworaWYgWyAtbiAiJHtFSUdFTl9NQUtFX0FSR1M6K3h9IiBdCit0aGVuCisgIG1ha2UgJHRhcmdldHNfdG9fbWFrZSAke0VJR0VOX01BS0VfQVJHU30KK2Vsc2UKKyAgbWFrZSAkdGFyZ2V0c190b19tYWtlCitmaQorZXhpdCAkPworCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrLmluIGIvc2NyaXB0cy9jaGVjay5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTAwNjFhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jaGVjay5pbgpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vYmFzaAorIyBjaGVjayA6IHNob3J0aGFuZCBmb3IgbWFrZSBhbmQgY3Rlc3QgLVIKKworaWYgW1sgJCMgIT0gMSB8fCAkMSA9PSAqaGVscCBdXQordGhlbgorICBlY2hvICJ1c2FnZTogLi9jaGVjayByZWdleHAiCisgIGVjaG8gIiAgQnVpbGRzIGFuZCBydW5zIHRlc3RzIG1hdGNoaW5nIHRoZSByZWdleHAuIgorICBlY2hvICIgIFRoZSBFSUdFTl9NQUtFX0FSR1MgZW52aXJvbm1lbnQgdmFyaWFibGUgYWxsb3dzIHRvIHBhc3MgYXJncyB0byAnbWFrZScuIgorICBlY2hvICIgICAgRm9yIGV4YW1wbGUsIHRvIGxhdW5jaCA1IGNvbmN1cnJlbnQgYnVpbGRzLCB1c2UgRUlHRU5fTUFLRV9BUkdTPSctajUnIgorICBlY2hvICIgIFRoZSBFSUdFTl9DVEVTVF9BUkdTIGVudmlyb25tZW50IHZhcmlhYmxlIGFsbG93cyB0byBwYXNzIGFyZ3MgdG8gJ2N0ZXN0Jy4iCisgIGVjaG8gIiAgICBGb3IgZXhhbXBsZSwgd2l0aCBDVGVzdCAyLjgsIHlvdSBjYW4gdXNlIEVJR0VOX0NURVNUX0FSR1M9Jy1qNScuIgorICBleGl0IDAKK2ZpCisKK2lmIFsgLW4gIiR7RUlHRU5fQ1RFU1RfQVJHUzoreH0iIF0KK3RoZW4KKyAgLi9idWlsZHRlc3RzLnNoICIkMSIgJiYgY3Rlc3QgLVIgIiQxIiAke0VJR0VOX0NURVNUX0FSR1N9CitlbHNlCisgIC4vYnVpbGR0ZXN0cy5zaCAiJDEiICYmIGN0ZXN0IC1SICIkMSIKK2ZpCitleGl0ICQ/CmRpZmYgLS1naXQgYS9zY3JpcHRzL2RlYnVnLmluIGIvc2NyaXB0cy9kZWJ1Zy5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMzM5ZDNkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9kZWJ1Zy5pbgpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCitjbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9laWdlbl9nZW5fY3JlZGl0cy5jcHAgYi9zY3JpcHRzL2VpZ2VuX2dlbl9jcmVkaXRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmU4MTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9laWdlbl9nZW5fY3JlZGl0cy5jcHAKQEAgLTAsMCArMSwyMzIgQEAKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGxpc3Q+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8vIHRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsaW5lIHRoYXQgbWF5IGNvbnRhaW4gYSBuYW1lIGFuZC9vciBlbWFpbCBhZGRyZXNzLAorLy8gYW5kIHJldHVybnMganVzdCB0aGUgbmFtZSwgd2hpbGUgZml4aW5nIHRoZSAiYmFkIGNhc2VzIi4KK3N0ZDo6c3RyaW5nIGNvbnRyaWJ1dG9yX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUpCit7CisgIHN0cmluZyByZXN1bHQ7CisKKyAgLy8gbGV0J3MgZmlyc3QgdGFrZSBjYXJlIG9mIHRoZSBjYXNlIG9mIGlzb2xhdGVkIGVtYWlsIGFkZHJlc3NlcywgbGlrZQorICAvLyAidXNlckBsb2NhbGhvc3QubG9jYWxkb21haW4iIGVudHJpZXMKKyAgaWYobGluZS5maW5kKCJtYXJrYkBsb2NhbGhvc3QubG9jYWxkb21haW4iKSAhPSBzdHJpbmc6Om5wb3MpCisgIHsKKyAgICByZXR1cm4gIk1hcmsgQm9yZ2VyZGluZyI7CisgIH0KKworICBpZihsaW5lLmZpbmQoImtheWhtYW5AY29udGFjdC5pbnRyYS5jZWEuZnIiKSAhPSBzdHJpbmc6Om5wb3MpCisgIHsKKyAgICByZXR1cm4gIkd1aWxsYXVtZSBTYXVwaW4iOworICB9CisKKyAgLy8gZnJvbSB0aGVyZSBvbiB3ZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgZW50cnkgb2YgdGhlIGZvcm0KKyAgLy8gZWl0aGVyOgorICAvLyAgIEJsYSBibGkgQmx1cnAKKyAgLy8gb3I6CisgIC8vICAgQmxhIGJsaSBCbHVycCA8YmJsdXJwQGVtYWlsLmNvbT4KKyAgCisgIHNpemVfdCBwb3NpdGlvbl9vZl9lbWFpbF9hZGRyZXNzID0gbGluZS5maW5kX2ZpcnN0X29mKCc8Jyk7CisgIGlmKHBvc2l0aW9uX29mX2VtYWlsX2FkZHJlc3MgIT0gc3RyaW5nOjpucG9zKQorICB7CisgICAgLy8gdGhlcmUgaXMgYW4gZS1tYWlsIGFkZHJlc3MgaW4gPC4uLj4uCisgICAgCisgICAgLy8gSGF1a2Ugb25jZSBjb21taXR0ZWQgYXMgIkpvaG4gU21pdGgiLCBmaXggdGhhdC4KKyAgICBpZihsaW5lLmZpbmQoImhhdWtlLmhlaWJlbCIpICE9IHN0cmluZzo6bnBvcykKKyAgICAgIHJlc3VsdCA9ICJIYXVrZSBIZWliZWwiOworICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBqdXN0IHJlbW92ZSB0aGUgZS1tYWlsIGFkZHJlc3MKKyAgICAgIHJlc3VsdCA9IGxpbmUuc3Vic3RyKDAsIHBvc2l0aW9uX29mX2VtYWlsX2FkZHJlc3MpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyB0aGVyZSBpcyBubyBlLW1haWwgYWRkcmVzcyBpbiA8Li4uPi4KKyAgICAKKyAgICBpZihsaW5lLmZpbmQoImNvbnZlcnQtcmVwbyIpICE9IHN0cmluZzo6bnBvcykKKyAgICAgIHJlc3VsdCA9ICIiOworICAgIGVsc2UKKyAgICAgIHJlc3VsdCA9IGxpbmU7CisgIH0KKworICAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCisgIHNpemVfdCBsZW5ndGggPSByZXN1bHQubGVuZ3RoKCk7CisgIHdoaWxlKGxlbmd0aCA+PSAxICYmIHJlc3VsdFtsZW5ndGgtMV0gPT0gJyAnKSByZXN1bHQuZXJhc2UoLS1sZW5ndGgpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHBhcnNlcyBoZyBjaHVybiBvdXRwdXQgdG8gZ2VuZXJhdGUgYSBjb250cmlidXRvcnMgbWFwLgorbWFwPHN0cmluZyxpbnQ+IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIG1hcDxzdHJpbmcsaW50PiBjb250cmlidXRvcnNfbWFwOworCisgIHN0cmluZyBsaW5lOworICBpZnN0cmVhbSBjaHVybl9vdXQ7CisgIGNodXJuX291dC5vcGVuKGZpbGVuYW1lLCBpb3M6OmluKTsKKyAgd2hpbGUoIWdldGxpbmUoY2h1cm5fb3V0LGxpbmUpLmVvZigpKQorICB7CisgICAgLy8gcmVtb3ZlIHRoZSBoaXN0b2dyYW1zICIqKioqKioiIHRoYXQgaGcgY2h1cm4gbWF5IGRyYXcgYXQgdGhlIGVuZCBvZiBzb21lIGxpbmVzCisgICAgc2l6ZV90IGZpcnN0X3N0YXIgPSBsaW5lLmZpbmRfZmlyc3Rfb2YoJyonKTsKKyAgICBpZihmaXJzdF9zdGFyICE9IHN0cmluZzo6bnBvcykgbGluZS5lcmFzZShmaXJzdF9zdGFyKTsKKyAgICAKKyAgICAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCisgICAgc2l6ZV90IGxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7CisgICAgd2hpbGUobGVuZ3RoID49IDEgJiYgbGluZVtsZW5ndGgtMV0gPT0gJyAnKSBsaW5lLmVyYXNlKC0tbGVuZ3RoKTsKKworICAgIC8vIG5vdyB0aGUgbGFzdCBzcGFjZSBpbmRpY2F0ZXMgd2hlcmUgdGhlIG51bWJlciBzdGFydHMKKyAgICBzaXplX3QgbGFzdF9zcGFjZSA9IGxpbmUuZmluZF9sYXN0X29mKCcgJyk7CisgICAgCisgICAgLy8gZ2V0IHRoZSBudW1iZXIgKG9mIGNoYW5nZXNldHMgb3Igb2YgbW9kaWZpZWQgbGluZXMgZm9yIGVhY2ggY29udHJpYnV0b3IpCisgICAgaW50IG51bWJlcjsKKyAgICBpc3RyaW5nc3RyZWFtKGxpbmUuc3Vic3RyKGxhc3Rfc3BhY2UrMSkpID4+IG51bWJlcjsKKworICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgY29udHJpYnV0b3IKKyAgICBsaW5lLmVyYXNlKGxhc3Rfc3BhY2UpOyAgICAKKyAgICBzdHJpbmcgbmFtZSA9IGNvbnRyaWJ1dG9yX25hbWUobGluZSk7CisgICAgCisgICAgbWFwPHN0cmluZyxpbnQ+OjppdGVyYXRvciBpdCA9IGNvbnRyaWJ1dG9yc19tYXAuZmluZChuYW1lKTsKKyAgICAvLyBpZiBuZXcgY29udHJpYnV0b3IsIGluc2VydAorICAgIGlmKGl0ID09IGNvbnRyaWJ1dG9yc19tYXAuZW5kKCkpCisgICAgICBjb250cmlidXRvcnNfbWFwLmluc2VydChwYWlyPHN0cmluZyxpbnQ+KG5hbWUsIG51bWJlcikpOworICAgIC8vIGlmIGR1cGxpY2F0ZSwganVzdCBhZGQgdGhlIG51bWJlcgorICAgIGVsc2UKKyAgICAgIGl0LT5zZWNvbmQgKz0gbnVtYmVyOworICB9CisgIGNodXJuX291dC5jbG9zZSgpOworCisgIHJldHVybiBjb250cmlidXRvcnNfbWFwOworfQorCisvLyBmaW5kIHRoZSBsYXN0IG5hbWUsIGkuZS4gdGhlIGxhc3Qgd29yZC4KKy8vIGZvciAidmFuIGRlbiBTY2hibGluZyIgdHlwZXMgb2YgbGFzdCBuYW1lcywgdGhhdCdzIG5vdCBhIHByb2JsZW0sIHRoYXQncyBhY3R1YWxseSB3aGF0IHdlIHdhbnQuCitzdHJpbmcgbGFzdG5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKQoreworICBzaXplX3QgbGFzdF9zcGFjZSA9IG5hbWUuZmluZF9sYXN0X29mKCcgJyk7CisgIGlmKGxhc3Rfc3BhY2UgPj0gbmFtZS5sZW5ndGgoKS0xKSByZXR1cm4gbmFtZTsKKyAgZWxzZSByZXR1cm4gbmFtZS5zdWJzdHIobGFzdF9zcGFjZSsxKTsKK30KKworc3RydWN0IGNvbnRyaWJ1dG9yCit7CisgIHN0cmluZyBuYW1lOworICBpbnQgY2hhbmdlZGxpbmVzOworICBpbnQgY2hhbmdlc2V0czsKKyAgc3RyaW5nIHVybDsKKyAgc3RyaW5nIG1pc2M7CisgIAorICBjb250cmlidXRvcigpIDogY2hhbmdlZGxpbmVzKDApLCBjaGFuZ2VzZXRzKDApIHt9CisgIAorICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IGNvbnRyaWJ1dG9yJiBvdGhlcikKKyAgeworICAgIHJldHVybiBsYXN0bmFtZShuYW1lKS5jb21wYXJlKGxhc3RuYW1lKG90aGVyLm5hbWUpKSA8IDA7CisgIH0KK307CisKK3ZvaWQgYWRkX29ubGluZV9pbmZvX2ludG9fY29udHJpYnV0b3JzX2xpc3QobGlzdDxjb250cmlidXRvcj4mIGNvbnRyaWJ1dG9yc19saXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgc3RyaW5nIGxpbmU7CisgIGlmc3RyZWFtIG9ubGluZV9pbmZvOworICBvbmxpbmVfaW5mby5vcGVuKGZpbGVuYW1lLCBpb3M6OmluKTsKKyAgd2hpbGUoIWdldGxpbmUob25saW5lX2luZm8sbGluZSkuZW9mKCkpCisgIHsKKyAgICBzdHJpbmcgaGduYW1lLCByZWFsbmFtZSwgdXJsLCBtaXNjOworICAgIAorICAgIHNpemVfdCBsYXN0X2JhciA9IGxpbmUuZmluZF9sYXN0X29mKCd8Jyk7CisgICAgaWYobGFzdF9iYXIgPT0gc3RyaW5nOjpucG9zKSBjb250aW51ZTsKKyAgICBpZihsYXN0X2JhciA8IGxpbmUubGVuZ3RoKCkpCisgICAgICBtaXNjID0gbGluZS5zdWJzdHIobGFzdF9iYXIrMSk7CisgICAgbGluZS5lcmFzZShsYXN0X2Jhcik7CisgICAgCisgICAgbGFzdF9iYXIgPSBsaW5lLmZpbmRfbGFzdF9vZignfCcpOworICAgIGlmKGxhc3RfYmFyID09IHN0cmluZzo6bnBvcykgY29udGludWU7CisgICAgaWYobGFzdF9iYXIgPCBsaW5lLmxlbmd0aCgpKQorICAgICAgdXJsID0gbGluZS5zdWJzdHIobGFzdF9iYXIrMSk7CisgICAgbGluZS5lcmFzZShsYXN0X2Jhcik7CisKKyAgICBsYXN0X2JhciA9IGxpbmUuZmluZF9sYXN0X29mKCd8Jyk7CisgICAgaWYobGFzdF9iYXIgPT0gc3RyaW5nOjpucG9zKSBjb250aW51ZTsKKyAgICBpZihsYXN0X2JhciA8IGxpbmUubGVuZ3RoKCkpCisgICAgICByZWFsbmFtZSA9IGxpbmUuc3Vic3RyKGxhc3RfYmFyKzEpOworICAgIGxpbmUuZXJhc2UobGFzdF9iYXIpOworCisgICAgaGduYW1lID0gbGluZTsKKyAgICAKKyAgICAvLyByZW1vdmUgdGhlIGV4YW1wbGUgbGluZQorICAgIGlmKGhnbmFtZS5maW5kKCJNZXJjdXJpYWxOYW1lIikgIT0gc3RyaW5nOjpucG9zKSBjb250aW51ZTsKKyAgICAKKyAgICBsaXN0PGNvbnRyaWJ1dG9yPjo6aXRlcmF0b3IgaXQ7CisgICAgZm9yKGl0PWNvbnRyaWJ1dG9yc19saXN0LmJlZ2luKCk7IGl0ICE9IGNvbnRyaWJ1dG9yc19saXN0LmVuZCgpICYmIGl0LT5uYW1lICE9IGhnbmFtZTsgKytpdCkKKyAgICB7fQorICAgIAorICAgIGlmKGl0ID09IGNvbnRyaWJ1dG9yc19saXN0LmVuZCgpKQorICAgIHsKKyAgICAgIGNvbnRyaWJ1dG9yIGM7CisgICAgICBjLm5hbWUgPSByZWFsbmFtZTsKKyAgICAgIGMudXJsID0gdXJsOworICAgICAgYy5taXNjID0gbWlzYzsKKyAgICAgIGNvbnRyaWJ1dG9yc19saXN0LnB1c2hfYmFjayhjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGl0LT5uYW1lID0gcmVhbG5hbWU7CisgICAgICBpdC0+dXJsID0gdXJsOworICAgICAgaXQtPm1pc2MgPSBtaXNjOworICAgIH0KKyAgfQorfQorCitpbnQgbWFpbigpCit7CisgIC8vIHBhcnNlIHRoZSBoZyBjaHVybiBvdXRwdXQgZmlsZXMKKyAgbWFwPHN0cmluZyxpbnQ+IGNvbnRyaWJ1dG9yc19tYXBfZm9yX2NoYW5nZWRsaW5lcyA9IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoImNodXJuLWNoYW5nZWRsaW5lcy5vdXQiKTsKKyAgLy9tYXA8c3RyaW5nLGludD4gY29udHJpYnV0b3JzX21hcF9mb3JfY2hhbmdlc2V0cyA9IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoImNodXJuLWNoYW5nZXNldHMub3V0Iik7CisgIAorICAvLyBtZXJnZSBpbnRvIHRoZSBjb250cmlidXRvcnMgbGlzdAorICBsaXN0PGNvbnRyaWJ1dG9yPiBjb250cmlidXRvcnNfbGlzdDsKKyAgbWFwPHN0cmluZyxpbnQ+OjppdGVyYXRvciBpdDsKKyAgZm9yKGl0PWNvbnRyaWJ1dG9yc19tYXBfZm9yX2NoYW5nZWRsaW5lcy5iZWdpbigpOyBpdCAhPSBjb250cmlidXRvcnNfbWFwX2Zvcl9jaGFuZ2VkbGluZXMuZW5kKCk7ICsraXQpCisgIHsKKyAgICBjb250cmlidXRvciBjOworICAgIGMubmFtZSA9IGl0LT5maXJzdDsKKyAgICBjLmNoYW5nZWRsaW5lcyA9IGl0LT5zZWNvbmQ7CisgICAgYy5jaGFuZ2VzZXRzID0gMDsgLy9jb250cmlidXRvcnNfbWFwX2Zvcl9jaGFuZ2VzZXRzLmZpbmQoaXQtPmZpcnN0KS0+c2Vjb25kOworICAgIGNvbnRyaWJ1dG9yc19saXN0LnB1c2hfYmFjayhjKTsKKyAgfQorICAKKyAgYWRkX29ubGluZV9pbmZvX2ludG9fY29udHJpYnV0b3JzX2xpc3QoY29udHJpYnV0b3JzX2xpc3QsICJvbmxpbmUtaW5mby5vdXQiKTsKKyAgCisgIGNvbnRyaWJ1dG9yc19saXN0LnNvcnQoKTsKKyAgCisgIGNvdXQgPDwgInt8IGNlbGxwYWRkaW5nPVwiNVwiXG4iOworICBjb3V0IDw8ICIhXG4iOworICBjb3V0IDw8ICIhIExpbmVzIGNoYW5nZWRcbiI7CisgIGNvdXQgPDwgIiFcbiI7CisKKyAgbGlzdDxjb250cmlidXRvcj46Oml0ZXJhdG9yIGl0YzsKKyAgaW50IGkgPSAwOworICBmb3IoaXRjPWNvbnRyaWJ1dG9yc19saXN0LmJlZ2luKCk7IGl0YyAhPSBjb250cmlidXRvcnNfbGlzdC5lbmQoKTsgKytpdGMpCisgIHsKKyAgICBpZihpdGMtPm5hbWUubGVuZ3RoKCkgPT0gMCkgY29udGludWU7CisgICAgaWYoaSUyKSBjb3V0IDw8ICJ8LVxuIjsKKyAgICBlbHNlIGNvdXQgPDwgInwtIHN0eWxlPVwiYmFja2dyb3VuZDojRkZGRkQwXCJcbiI7CisgICAgaWYoaXRjLT51cmwubGVuZ3RoKCkpCisgICAgICBjb3V0IDw8ICJ8IFsiIDw8IGl0Yy0+dXJsIDw8ICIgIiA8PCBpdGMtPm5hbWUgPDwgIl1cbiI7CisgICAgZWxzZQorICAgICAgY291dCA8PCAifCAiIDw8IGl0Yy0+bmFtZSA8PCAiXG4iOworICAgIGlmKGl0Yy0+Y2hhbmdlZGxpbmVzKQorICAgICAgY291dCA8PCAifCAiIDw8IGl0Yy0+Y2hhbmdlZGxpbmVzIDw8ICJcbiI7CisgICAgZWxzZQorICAgICAgY291dCA8PCAifCAobm8gaW5mb3JtYXRpb24pXG4iOworICAgIGNvdXQgPDwgInwgIiA8PCBpdGMtPm1pc2MgPDwgIlxuIjsKKyAgICBpKys7CisgIH0KKyAgY291dCA8PCAifH0iIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2VpZ2VuX2dlbl9kb2NzIGIvc2NyaXB0cy9laWdlbl9nZW5fZG9jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjFkNjAwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9laWdlbl9nZW5fZG9jcwpAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKworIyBjb25maWd1cmF0aW9uCisjIFlvdSBzaG91bGQgY2FsbCB0aGlzIHNjcmlwdCB3aXRoIFVTRVIgc2V0IGFzIHlvdSB3YW50LCBlbHNlIHNvbWUgZGVmYXVsdAorIyB3aWxsIGJlIHVzZWQKK1VTRVI9JHtVU0VSOi0nb3J6ZWwnfQorCisjdWxpbWl0IC12IDEwMjQwMDAKKworIyBzdGVwIDEgOiBidWlsZAorbWtkaXIgYnVpbGQgLXAKKyhjZCBidWlsZCAmJiBjbWFrZSAuLiAmJiBtYWtlIGRvYykgfHwgeyBlY2hvICJtYWtlIGZhaWxlZCI7IGV4aXQgMTsgfQorCisjc3RlcCAyIDogdXBsb2FkCisjICh0aGUgJy8nIGF0IHRoZSBlbmQgb2YgcGF0aCBpcyB2ZXJ5IGltcG9ydGFudCwgc2VlIHJzeW5jIGRvY3VtZW50YXRpb24pCityc3luYyAtYXogLS1uby1wIC0tZGVsZXRlIGJ1aWxkL2RvYy9odG1sLyAkVVNFUkBzc2gudHV4ZmFtaWx5Lm9yZzplaWdlbi9laWdlbi50dXhmYW1pbHkub3JnLXdlYi9odGRvY3MvZG94LWRldmVsLyB8fCB7IGVjaG8gInVwbG9hZCBmYWlsZWQiOyBleGl0IDE7IH0KKworI3N0ZXAgMyA6IGZpeCB0aGUgcGVybQorc3NoICRVU0VSQHNzaC50dXhmYW1pbHkub3JnICdjaG1vZCAtUiBnK3cgL2hvbWUvZWlnZW4vZWlnZW4udHV4ZmFtaWx5Lm9yZy13ZWIvaHRkb2NzL2RveC1kZXZlbCcgfHwgeyBlY2hvICJwZXJtIGZhaWxlZCI7IGV4aXQgMTsgfQorCitlY2hvICJVcGxvYWRlZCBzdWNjZXNzZnVsbHkiCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVsZWFzZS5pbiBiL3NjcmlwdHMvcmVsZWFzZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYjJkOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9yZWxlYXNlLmluCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL3NoCisKK2NtYWtlIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVsaWNlbnNlLnB5IGIvc2NyaXB0cy9yZWxpY2Vuc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1MjY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcmVsaWNlbnNlLnB5CkBAIC0wLDAgKzEsNjkgQEAKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKyMgZm9yIGxpbmVhciBhbGdlYnJhLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgS2VpciBNaWVybGUgPG1pZXJsZUBnbWFpbC5jb20+CisjCisjIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorIyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKyMgd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisjCisjIEF1dGhvcjogbWllcmxlQGdtYWlsLmNvbSAoS2VpciBNaWVybGUpCisjCisjIE1ha2UgdGhlIGxvbmctYXdhaXRlZCBjb252ZXJzaW9uIHRvIE1QTC4KKworbGdwbDNfaGVhZGVyID0gJycnCisvLyBFaWdlbiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKy8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorLy8gdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKy8vIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisvLyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBFaWdlbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKy8vIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKKy8vIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgYW5kIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorLy8gRWlnZW4uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKycnJworCittcGwyX2hlYWRlciA9ICIiIgorLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitleGNsdXNpb25zID0gc2V0KFsncmVsaWNlbnNlLnB5J10pCisKK2RlZiB1cGRhdGUodGV4dCk6CisgIGlmIHRleHQuZmluZChsZ3BsM19oZWFkZXIpID09IC0xOgorICAgIHJldHVybiB0ZXh0LCBGYWxzZQorICByZXR1cm4gdGV4dC5yZXBsYWNlKGxncGwzX2hlYWRlciwgbXBsMl9oZWFkZXIpLCBUcnVlCisKK3Jvb3RkaXIgPSBzeXMuYXJndlsxXQorZm9yIHJvb3QsIHN1Yl9mb2xkZXJzLCBmaWxlcyBpbiBvcy53YWxrKHJvb3RkaXIpOgorICAgIGZvciBiYXNlbmFtZSBpbiBmaWxlczoKKyAgICAgICAgaWYgYmFzZW5hbWUgaW4gZXhjbHVzaW9uczoKKyAgICAgICAgICBwcmludCAnU0tJUFBFRCcsIGZpbGVuYW1lCisgICAgICAgICAgY29udGludWUKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgYmFzZW5hbWUpCisgICAgICAgIGZvID0gZmlsZShmaWxlbmFtZSkKKyAgICAgICAgdGV4dCA9IGZvLnJlYWQoKQorICAgICAgICBmby5jbG9zZSgpCisKKyAgICAgICAgdGV4dCwgdXBkYXRlZCA9IHVwZGF0ZSh0ZXh0KQorICAgICAgICBpZiB1cGRhdGVkOgorICAgICAgICAgIGZvID0gZmlsZShmaWxlbmFtZSwgInciKQorICAgICAgICAgIGZvLndyaXRlKHRleHQpCisgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgIHByaW50ICdVUERBVEVEJywgZmlsZW5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBwcmludCAnICAgICAgICcsIGZpbGVuYW1lCmRpZmYgLS1naXQgYS9zaWduYXR1cmVfb2ZfZWlnZW4zX21hdHJpeF9saWJyYXJ5IGIvc2lnbmF0dXJlX29mX2VpZ2VuM19tYXRyaXhfbGlicmFyeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGFhZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2lnbmF0dXJlX29mX2VpZ2VuM19tYXRyaXhfbGlicmFyeQpAQCAtMCwwICsxIEBACitUaGlzIGZpbGUgaXMganVzdCB0aGVyZSBhcyBhIHNpZ25hdHVyZSB0byBoZWxwIGlkZW50aWZ5IGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgRWlnZW4zLiBXaGVuIHdyaXRpbmcgYSBzY3JpcHQgbG9va2luZyBmb3IgRWlnZW4zLCBqdXN0IGxvb2sgZm9yIHRoaXMgZmlsZS4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB0byBoZWxwIGRpc2FtYmlndWF0ZSB3aXRoIEVpZ2VuMi4uLgpkaWZmIC0tZ2l0IGEvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4ZmM0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNDMgQEAKKworIyBnZW5lcmF0ZSBzcGxpdCB0ZXN0IGhlYWRlciBmaWxlCittZXNzYWdlKFNUQVRVUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCitmaWxlKFdSSVRFICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcGxpdF90ZXN0X2hlbHBlci5oICIiKQorZm9yZWFjaChpIFJBTkdFIDEgOTk5KQorICBmaWxlKEFQUEVORCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3BsaXRfdGVzdF9oZWxwZXIuaAorICAgICIjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXyR7aX1cbiIKKyAgICAiI2RlZmluZSBDQUxMX1NVQlRFU1RfJHtpfShGVU5DKSBDQUxMX1NVQlRFU1QoRlVOQylcbiIKKyAgICAiI2Vsc2VcbiIKKyAgICAiI2RlZmluZSBDQUxMX1NVQlRFU1RfJHtpfShGVU5DKVxuIgorICAgICIjZW5kaWZcblxuIgorICAgICkKK2VuZGZvcmVhY2goKQorCisjIGNvbmZpZ3VyZSBibGFzL2xhcGFjayAodXNlIEVpZ2VuJ3Mgb25lcykKK3NldChCTEFTX0ZPVU5EIFRSVUUpCitzZXQoTEFQQUNLX0ZPVU5EIFRSVUUpCitzZXQoQkxBU19MSUJSQVJJRVMgZWlnZW5fYmxhcykKK3NldChMQVBBQ0tfTElCUkFSSUVTIGVpZ2VuX2xhcGFjaykKKworc2V0KEVJR0VOX1RFU1RfTUFUUklYX0RJUiAiIiBDQUNIRSBTVFJJTkcgIkVuYWJsZSB0ZXN0aW5nIG9mIHJlYWx3b3JkIHNwYXJzZSBtYXRyaWNlcyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBwYXRoIikKK2lmKEVJR0VOX1RFU1RfTUFUUklYX0RJUikKKyAgaWYoTk9UIFdJTjMyKQorICAgIG1lc3NhZ2UoU1RBVFVTICJUZXN0IHJlYWx3b3JsZCBzcGFyc2UgbWF0cmljZXM6ICR7RUlHRU5fVEVTVF9NQVRSSVhfRElSfSIpCisgICAgYWRkX2RlZmluaXRpb25zKCAtRFRFU1RfUkVBTF9DQVNFUz0iJHtFSUdFTl9URVNUX01BVFJJWF9ESVJ9IiApCisgIGVsc2UoTk9UIFdJTjMyKQorICAgIG1lc3NhZ2UoU1RBVFVTICJSRUFMIENBU0VTIENBTiBOT1QgQkUgQ1VSUkVOVExZIFRFU1RFRCBPTiBXSU4zMiIpCisgIGVuZGlmKE5PVCBXSU4zMikKK2VuZGlmKEVJR0VOX1RFU1RfTUFUUklYX0RJUikKKworc2V0KFNQQVJTRV9MSUJTICIgIikKKworZmluZF9wYWNrYWdlKENob2xtb2QpCitpZihDSE9MTU9EX0ZPVU5EIEFORCBCTEFTX0ZPVU5EIEFORCBMQVBBQ0tfRk9VTkQpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9DSE9MTU9EX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q0hPTE1PRF9JTkNMVURFU30pCisgIHNldChTUEFSU0VfTElCUyAke1NQQVJTRV9MSUJTfSAke0NIT0xNT0RfTElCUkFSSUVTfSAke0JMQVNfTElCUkFSSUVTfSAke0xBUEFDS19MSUJSQVJJRVN9KQorICBzZXQoQ0hPTE1PRF9BTExfTElCUyAgJHtDSE9MTU9EX0xJQlJBUklFU30gJHtCTEFTX0xJQlJBUklFU30gJHtMQVBBQ0tfTElCUkFSSUVTfSkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX1RFU1RFRF9CQUNLRU5EUyAiQ2hvbG1vZCwgIikKK2Vsc2UoKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAiQ2hvbG1vZCwgIikKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKFVtZnBhY2spCitpZihVTUZQQUNLX0ZPVU5EIEFORCBCTEFTX0ZPVU5EKQorICBhZGRfZGVmaW5pdGlvbnMoIi1ERUlHRU5fVU1GUEFDS19TVVBQT1JUIikKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1VNRlBBQ0tfSU5DTFVERVN9KQorICBzZXQoU1BBUlNFX0xJQlMgJHtTUEFSU0VfTElCU30gJHtVTUZQQUNLX0xJQlJBUklFU30gJHtCTEFTX0xJQlJBUklFU30pCisgIHNldChVTUZQQUNLX0FMTF9MSUJTICR7VU1GUEFDS19MSUJSQVJJRVN9ICR7QkxBU19MSUJSQVJJRVN9KQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVEVEX0JBQ0tFTkRTICJVbWZQYWNrLCAiKQorZWxzZSgpCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTICJVbWZQYWNrLCAiKQorZW5kaWYoKQorCitmaW5kX3BhY2thZ2UoU3VwZXJMVSkKK2lmKFNVUEVSTFVfRk9VTkQgQU5EIEJMQVNfRk9VTkQpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9TVVBFUkxVX1NVUFBPUlQiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7U1VQRVJMVV9JTkNMVURFU30pCisgIHNldChTUEFSU0VfTElCUyAke1NQQVJTRV9MSUJTfSAke1NVUEVSTFVfTElCUkFSSUVTfSAke0JMQVNfTElCUkFSSUVTfSkKKyAgc2V0KFNVUEVSTFVfQUxMX0xJQlMgJHtTVVBFUkxVX0xJQlJBUklFU30gJHtCTEFTX0xJQlJBUklFU30pCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNURURfQkFDS0VORFMgICJTdXBlckxVLCAiKQorZWxzZSgpCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTICAiU3VwZXJMVSwgIikKK2VuZGlmKCkKKworCitmaW5kX3BhY2thZ2UoUGFzdGl4KQorZmluZF9wYWNrYWdlKFNjb3RjaCkKK2ZpbmRfcGFja2FnZShNZXRpcykKK2lmKFBBU1RJWF9GT1VORCBBTkQgQkxBU19GT1VORCkKKyAgYWRkX2RlZmluaXRpb25zKCItREVJR0VOX1BBU1RJWF9TVVBQT1JUIikKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1BBU1RJWF9JTkNMVURFU30pCisgIGlmKFNDT1RDSF9GT1VORCkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7U0NPVENIX0lOQ0xVREVTfSkKKyAgICBzZXQoUEFTVElYX0xJQlJBUklFUyAke1BBU1RJWF9MSUJSQVJJRVN9ICR7U0NPVENIX0xJQlJBUklFU30pCisgIGVsc2VpZihNRVRJU19GT1VORCkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7TUVUSVNfSU5DTFVERVN9KQorICAgIHNldChQQVNUSVhfTElCUkFSSUVTICR7UEFTVElYX0xJQlJBUklFU30gJHtNRVRJU19MSUJSQVJJRVN9KQorICBlbHNlKFNDT1RDSF9GT1VORCkKKyAgICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAgIlBhU3RpWCwgIikKKyAgZW5kaWYoU0NPVENIX0ZPVU5EKQorICBzZXQoU1BBUlNFX0xJQlMgJHtTUEFSU0VfTElCU30gJHtQQVNUSVhfTElCUkFSSUVTfSAke09SREVSSU5HX0xJQlJBUklFU30gJHtCTEFTX0xJQlJBUklFU30pCisgIHNldChQQVNUSVhfQUxMX0xJQlMgJHtQQVNUSVhfTElCUkFSSUVTfSAke0JMQVNfTElCUkFSSUVTfSkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX1RFU1RFRF9CQUNLRU5EUyAgIlBhU3RpWCwgIikKK2Vsc2UoKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAgIlBhU3RpWCwgIikKK2VuZGlmKCkKKworb3B0aW9uKEVJR0VOX1RFU1RfTk9RVCAiRGlzYWJsZSBRdCBzdXBwb3J0IGluIHVuaXQgdGVzdHMiIE9GRikKK2lmKE5PVCBFSUdFTl9URVNUX05PUVQpCisgIGZpbmRfcGFja2FnZShRdDQpCisgIGlmKFFUNF9GT1VORCkKKyAgICBpbmNsdWRlKCR7UVRfVVNFX0ZJTEV9KQorICAgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNURURfQkFDS0VORFMgICJRdDQgc3VwcG9ydCwgIikKKyAgZWxzZSgpCisgICAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgICJRdDQgc3VwcG9ydCwgIikKKyAgZW5kaWYoKQorZW5kaWYoTk9UIEVJR0VOX1RFU1RfTk9RVCkKKworaWYoVEVTVF9MSUIpCisgIGFkZF9kZWZpbml0aW9ucygiLURFSUdFTl9FWFRFUk5fSU5TVEFOVElBVElPTlM9MSIpCitlbmRpZihURVNUX0xJQikKKworZWlfYWRkX3Rlc3QobWV0YSkKK2VpX2FkZF90ZXN0KHNpemVvZikKK2VpX2FkZF90ZXN0KGR5bmFsbG9jKQorZWlfYWRkX3Rlc3Qobm9tYWxsb2MpCitlaV9hZGRfdGVzdChmaXJzdF9hbGlnbmVkKQorZWlfYWRkX3Rlc3QobWl4aW5ndHlwZXMpCitlaV9hZGRfdGVzdChwYWNrZXRtYXRoKQorZWlfYWRkX3Rlc3QodW5hbGlnbmVkYXNzZXJ0KQorZWlfYWRkX3Rlc3QodmVjdG9yaXphdGlvbl9sb2dpYykKK2VpX2FkZF90ZXN0KGJhc2ljc3R1ZmYpCitlaV9hZGRfdGVzdChsaW5lYXJzdHJ1Y3R1cmUpCitlaV9hZGRfdGVzdChpbnRlZ2VyX3R5cGVzKQorZWlfYWRkX3Rlc3QoY3dpc2VvcCkKK2VpX2FkZF90ZXN0KHVuYWxpZ25lZGNvdW50KQorZWlfYWRkX3Rlc3QoZXhjZXB0aW9ucykKK2VpX2FkZF90ZXN0KHJlZHV4KQorZWlfYWRkX3Rlc3QodmlzaXRvcikKK2VpX2FkZF90ZXN0KGJsb2NrKQorZWlfYWRkX3Rlc3QoY29ybmVycykKK2VpX2FkZF90ZXN0KHByb2R1Y3Rfc21hbGwpCitlaV9hZGRfdGVzdChwcm9kdWN0X2xhcmdlKQorZWlfYWRkX3Rlc3QocHJvZHVjdF9leHRyYSkKK2VpX2FkZF90ZXN0KGRpYWdvbmFsbWF0cmljZXMpCitlaV9hZGRfdGVzdChhZGpvaW50KQorZWlfYWRkX3Rlc3QoZGlhZ29uYWwpCitlaV9hZGRfdGVzdChtaXNjbWF0cmljZXMpCitlaV9hZGRfdGVzdChjb21tYWluaXRpYWxpemVyKQorZWlfYWRkX3Rlc3Qoc21hbGx2ZWN0b3JzKQorZWlfYWRkX3Rlc3QobWFwKQorZWlfYWRkX3Rlc3QobWFwc3RyaWRlKQorZWlfYWRkX3Rlc3QobWFwc3RhdGljbWV0aG9kcykKK2VpX2FkZF90ZXN0KGFycmF5KQorZWlfYWRkX3Rlc3QoYXJyYXlfZm9yX21hdHJpeCkKK2VpX2FkZF90ZXN0KGFycmF5X3JlcGxpY2F0ZSkKK2VpX2FkZF90ZXN0KGFycmF5X3JldmVyc2UpCitlaV9hZGRfdGVzdCh0cmlhbmd1bGFyKQorZWlfYWRkX3Rlc3Qoc2VsZmFkam9pbnQpCitlaV9hZGRfdGVzdChwcm9kdWN0X3NlbGZhZGpvaW50KQorZWlfYWRkX3Rlc3QocHJvZHVjdF9zeW1tKQorZWlfYWRkX3Rlc3QocHJvZHVjdF9zeXJrKQorZWlfYWRkX3Rlc3QocHJvZHVjdF90cm12KQorZWlfYWRkX3Rlc3QocHJvZHVjdF90cm1tKQorZWlfYWRkX3Rlc3QocHJvZHVjdF90cnNvbHZlKQorZWlfYWRkX3Rlc3QocHJvZHVjdF9tbXRyKQorZWlfYWRkX3Rlc3QocHJvZHVjdF9ub3RlbXBvcmFyeSkKK2VpX2FkZF90ZXN0KHN0YWJsZV9ub3JtKQorZWlfYWRkX3Rlc3QoYmFuZG1hdHJpeCkKK2VpX2FkZF90ZXN0KGNob2xlc2t5KQorZWlfYWRkX3Rlc3QobHUpCitlaV9hZGRfdGVzdChkZXRlcm1pbmFudCkKK2VpX2FkZF90ZXN0KGludmVyc2UpCitlaV9hZGRfdGVzdChxcikKK2VpX2FkZF90ZXN0KHFyX2NvbHBpdm90aW5nKQorZWlfYWRkX3Rlc3QocXJfZnVsbHBpdm90aW5nKQorZWlfYWRkX3Rlc3QodXBwZXJiaWRpYWdvbmFsaXphdGlvbikKK2VpX2FkZF90ZXN0KGhlc3NlbmJlcmcpCitlaV9hZGRfdGVzdChzY2h1cl9yZWFsKQorZWlfYWRkX3Rlc3Qoc2NodXJfY29tcGxleCkKK2VpX2FkZF90ZXN0KGVpZ2Vuc29sdmVyX3NlbGZhZGpvaW50KQorZWlfYWRkX3Rlc3QoZWlnZW5zb2x2ZXJfZ2VuZXJpYykKK2VpX2FkZF90ZXN0KGVpZ2Vuc29sdmVyX2NvbXBsZXgpCitlaV9hZGRfdGVzdChqYWNvYmkpCitlaV9hZGRfdGVzdChqYWNvYmlzdmQpCitlaV9hZGRfdGVzdChnZW9fb3J0aG9tZXRob2RzKQorZWlfYWRkX3Rlc3QoZ2VvX2hvbW9nZW5lb3VzKQorZWlfYWRkX3Rlc3QoZ2VvX3F1YXRlcm5pb24pCitlaV9hZGRfdGVzdChnZW9fdHJhbnNmb3JtYXRpb25zKQorZWlfYWRkX3Rlc3QoZ2VvX2V1bGVyYW5nbGVzKQorZWlfYWRkX3Rlc3QoZ2VvX2h5cGVycGxhbmUpCitlaV9hZGRfdGVzdChnZW9fcGFyYW1ldHJpemVkbGluZSkKK2VpX2FkZF90ZXN0KGdlb19hbGlnbmVkYm94KQorZWlfYWRkX3Rlc3Qoc3RkdmVjdG9yKQorZWlfYWRkX3Rlc3Qoc3RkdmVjdG9yX292ZXJsb2FkKQorZWlfYWRkX3Rlc3Qoc3RkbGlzdCkKK2VpX2FkZF90ZXN0KHN0ZGRlcXVlKQorZWlfYWRkX3Rlc3QocmVzaXplKQoraWYoUVQ0X0ZPVU5EKQorICBlaV9hZGRfdGVzdChxdHZlY3RvciAiIiAiJHtRVF9RVENPUkVfTElCUkFSWX0iKQorZW5kaWYoUVQ0X0ZPVU5EKQorZWlfYWRkX3Rlc3Qoc3BhcnNlX3ZlY3RvcikKK2VpX2FkZF90ZXN0KHNwYXJzZV9iYXNpYykKK2VpX2FkZF90ZXN0KHNwYXJzZV9wcm9kdWN0KQorZWlfYWRkX3Rlc3Qoc3BhcnNlX3NvbHZlcnMpCitlaV9hZGRfdGVzdCh1bWV5YW1hKQorZWlfYWRkX3Rlc3QoaG91c2Vob2xkZXIpCitlaV9hZGRfdGVzdChzd2FwKQorZWlfYWRkX3Rlc3QoY29uc2VydmF0aXZlX3Jlc2l6ZSkKK2VpX2FkZF90ZXN0KHBlcm11dGF0aW9ubWF0cmljZXMpCitlaV9hZGRfdGVzdChzcGFyc2VfcGVybXV0YXRpb25zKQorZWlfYWRkX3Rlc3QoZWlnZW4yc3VwcG9ydCkKK2VpX2FkZF90ZXN0KG51bGxhcnkpCitlaV9hZGRfdGVzdChuZXN0aW5nX29wcyAiJHtDTUFLRV9DWFhfRkxBR1NfREVCVUd9IikKK2VpX2FkZF90ZXN0KHplcm9zaXplZCkKK2VpX2FkZF90ZXN0KGRvbnRhbGlnbikKK2VpX2FkZF90ZXN0KHNpemVvdmVyZmxvdykKK2VpX2FkZF90ZXN0KHByZWNfaW52ZXJzZV80eDQpCitlaV9hZGRfdGVzdCh2ZWN0b3J3aXNlb3ApCisKK2VpX2FkZF90ZXN0KHNpbXBsaWNpYWxfY2hvbGVza3kpCitlaV9hZGRfdGVzdChjb25qdWdhdGVfZ3JhZGllbnQpCitlaV9hZGRfdGVzdChiaWNnc3RhYikKKworCitpZihVTUZQQUNLX0ZPVU5EKQorICBlaV9hZGRfdGVzdCh1bWZwYWNrX3N1cHBvcnQgIiIgIiR7VU1GUEFDS19BTExfTElCU30iKQorZW5kaWYoKQorCitpZihTVVBFUkxVX0ZPVU5EKQorICBlaV9hZGRfdGVzdChzdXBlcmx1X3N1cHBvcnQgIiIgIiR7U1VQRVJMVV9BTExfTElCU30iKQorZW5kaWYoKQorCitpZihDSE9MTU9EX0ZPVU5EKQorICBlaV9hZGRfdGVzdChjaG9sbW9kX3N1cHBvcnQgIiIgIiR7Q0hPTE1PRF9BTExfTElCU30iKQorZW5kaWYoKQorCitpZihQQVJESVNPX0ZPVU5EKQorICBlaV9hZGRfdGVzdChwYXJkaXNvX3N1cHBvcnQgIiIgIiR7UEFSRElTT19BTExfTElCU30iKQorZW5kaWYoKQorCitpZihQQVNUSVhfRk9VTkQgQU5EIChTQ09UQ0hfRk9VTkQgT1IgTUVUSVNfRk9VTkQpKQorICBlaV9hZGRfdGVzdChwYXN0aXhfc3VwcG9ydCAiIiAiJHtQQVNUSVhfQUxMX0xJQlN9IikKK2VuZGlmKCkKKworc3RyaW5nKFRPTE9XRVIgIiR7Q01BS0VfQ1hYX0NPTVBJTEVSfSIgY21ha2VfY3h4X2NvbXBpbGVyX3RvbG93ZXIpCitpZihjbWFrZV9jeHhfY29tcGlsZXJfdG9sb3dlciBNQVRDSEVTICJxY2MiKQorICBzZXQoQ1hYX0lTX1FDQyAiT04iKQorZW5kaWYoKQorCitlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVElOR19TVU1NQVJZICJDWFg6ICAgICAgICAgICAgICAgJHtDTUFLRV9DWFhfQ09NUElMRVJ9XG4iKQoraWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYIEFORCBOT1QgQ1hYX0lTX1FDQykKKyAgZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtDTUFLRV9DWFhfQ09NUElMRVJ9IC0tdmVyc2lvbiBDT01NQU5EIGhlYWQgLW4gMSBPVVRQVVRfVkFSSUFCTEUgRUlHRU5fQ1hYX1ZFUlNJT05fU1RSSU5HIE9VVFBVVF9TVFJJUF9UUkFJTElOR19XSElURVNQQUNFKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVElOR19TVU1NQVJZICJDWFhfVkVSU0lPTjogICAgICAgJHtFSUdFTl9DWFhfVkVSU0lPTl9TVFJJTkd9XG4iKQorZW5kaWYoKQorZWlfYWRkX3Byb3BlcnR5KEVJR0VOX1RFU1RJTkdfU1VNTUFSWSAiQ1hYX0ZMQUdTOiAgICAgICAgICR7Q01BS0VfQ1hYX0ZMQUdTfVxuIikKK2VpX2FkZF9wcm9wZXJ0eShFSUdFTl9URVNUSU5HX1NVTU1BUlkgIlNwYXJzZSBsaWIgZmxhZ3M6ICAke1NQQVJTRV9MSUJTfVxuIikKKworb3B0aW9uKEVJR0VOX1RFU1RfRUlHRU4yICJSdW4gd2hvbGUgRWlnZW4yIHRlc3Qgc3VpdGUgYWdhaW5zdCBFSUdFTjJfU1VQUE9SVCIgT0ZGKQoraWYoRUlHRU5fVEVTVF9FSUdFTjIpCisgIGFkZF9zdWJkaXJlY3RvcnkoZWlnZW4yKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvdGVzdC9hZGpvaW50LmNwcCBiL3Rlc3QvYWRqb2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjZjBhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYWRqb2ludC5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQKKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBhZGpvaW50KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgVHJhbnNwb3NlLmggQ29uanVnYXRlLmggRG90LmgKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOworICAKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBzcXVhcmUgPSBTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgcm93cyk7CisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdjMgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdnplcm8gPSBWZWN0b3JUeXBlOjpaZXJvKHJvd3MpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICAvLyBjaGVjayBiYXNpYyBjb21wYXRpYmlsaXR5IG9mIGFkam9pbnQsIHRyYW5zcG9zZSwgY29uanVnYXRlCisgIFZFUklGWV9JU19BUFBST1gobTEudHJhbnNwb3NlKCkuY29uanVnYXRlKCkuYWRqb2ludCgpLCAgICBtMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYWRqb2ludCgpLmNvbmp1Z2F0ZSgpLnRyYW5zcG9zZSgpLCAgICBtMSk7CisKKyAgLy8gY2hlY2sgbXVsdGlwbGljYXRpdmUgYmVoYXZpb3IKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEuYWRqb2ludCgpICogbTIpLmFkam9pbnQoKSwgICAgICAgICAgIG0yLmFkam9pbnQoKSAqIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiBtMSkuYWRqb2ludCgpLCAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpjb25qKHMxKSAqIG0xLmFkam9pbnQoKSk7CisKKyAgLy8gY2hlY2sgYmFzaWMgcHJvcGVydGllcyBvZiBkb3QsIG5vcm0sIG5vcm0yCisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgCisgIFJlYWxTY2FsYXIgcmVmID0gTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciA/IFJlYWxTY2FsYXIoMCkgOiAoc3RkOjptYXgpKChzMSAqIHYxICsgczIgKiB2Mikubm9ybSgpLHYzLm5vcm0oKSk7CisgIFZFUklGWSh0ZXN0X2lzQXBwcm94V2l0aFJlZigoczEgKiB2MSArIHMyICogdjIpLmRvdCh2MyksICAgICBpbnRlcm5hbDo6Y29uaihzMSkgKiB2MS5kb3QodjMpICsgaW50ZXJuYWw6OmNvbmooczIpICogdjIuZG90KHYzKSwgcmVmKSk7CisgIFZFUklGWSh0ZXN0X2lzQXBwcm94V2l0aFJlZih2My5kb3QoczEgKiB2MSArIHMyICogdjIpLCAgICAgICBzMSp2My5kb3QodjEpK3MyKnYzLmRvdCh2MiksIHJlZikpOworICBWRVJJRllfSVNfQVBQUk9YKGludGVybmFsOjpjb25qKHYxLmRvdCh2MikpLCAgICAgICAgICAgICAgIHYyLmRvdCh2MSkpOworICBWRVJJRllfSVNfQVBQUk9YKGludGVybmFsOjpyZWFsKHYxLmRvdCh2MSkpLCAgICAgICAgICAgICAgICB2MS5zcXVhcmVkTm9ybSgpKTsKKyAgaWYoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLnNxdWFyZWROb3JtKCksICAgICAgICAgICAgICAgIHYxLm5vcm0oKSAqIHYxLm5vcm0oKSk7CisgICAgLy8gY2hlY2sgbm9ybWFsaXplZCgpIGFuZCBub3JtYWxpemUoKQorICAgIFZFUklGWV9JU19BUFBST1godjEsIHYxLm5vcm0oKSAqIHYxLm5vcm1hbGl6ZWQoKSk7CisgICAgdjMgPSB2MTsKKyAgICB2My5ub3JtYWxpemUoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLCB2MS5ub3JtKCkgKiB2Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2MywgdjEubm9ybWFsaXplZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYzLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CisgIH0KKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGludGVybmFsOjphYnModnplcm8uZG90KHYxKSksICBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKSk7CisgIAorICAvLyBjaGVjayBjb21wYXRpYmlsaXR5IG9mIGRvdCBhbmQgYWRqb2ludAorICAKKyAgcmVmID0gTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciA/IDAgOiAoc3RkOjptYXgpKChzdGQ6Om1heCkodjEubm9ybSgpLHYyLm5vcm0oKSksKHN0ZDo6bWF4KSgoc3F1YXJlICogdjIpLm5vcm0oKSwoc3F1YXJlLmFkam9pbnQoKSAqIHYxKS5ub3JtKCkpKTsKKyAgVkVSSUZZKHRlc3RfaXNBcHByb3hXaXRoUmVmKHYxLmRvdChzcXVhcmUgKiB2MiksIChzcXVhcmUuYWRqb2ludCgpICogdjEpLmRvdCh2MiksIHJlZikpOworCisgIC8vIGxpa2UgaW4gdGVzdEJhc2ljU3R1ZmYsIHRlc3Qgb3BlcmF0b3IoKSB0byBjaGVjayBjb25zdC1xdWFsaWZpY2F0aW9uCisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAorICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY29uanVnYXRlKCkocixjKSwgaW50ZXJuYWw6OmNvbmoobTEocixjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFkam9pbnQoKShjLHIpLCBpbnRlcm5hbDo6Y29uaihtMShyLGMpKSk7CisKKyAgaWYoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpCisgIHsKKyAgICAvLyBjaGVjayB0aGF0IFJhbmRvbSgpLm5vcm1hbGl6ZWQoKSB3b3JrczogdHJpY2t5IGFzIHRoZSByYW5kb20geHByIG11c3QgYmUgZXZhbHVhdGVkIGJ5CisgICAgLy8gbm9ybWFsaXplZCgpIGluIG9yZGVyIHRvIHByb2R1Y2UgYSBjb25zaXN0ZW50IHJlc3VsdC4KKyAgICBWRVJJRllfSVNfQVBQUk9YKFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKS5ub3JtYWxpemVkKCkubm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKKyAgfQorCisgIC8vIGNoZWNrIGlucGxhY2UgdHJhbnNwb3NlCisgIG0zID0gbTE7CisgIG0zLnRyYW5zcG9zZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMS50cmFuc3Bvc2UoKSk7CisgIG0zLnRyYW5zcG9zZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMSk7CisKKyAgLy8gY2hlY2sgaW5wbGFjZSBhZGpvaW50CisgIG0zID0gbTE7CisgIG0zLmFkam9pbnRJblBsYWNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTMsbTEuYWRqb2ludCgpKTsKKyAgbTMudHJhbnNwb3NlSW5QbGFjZSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLG0xLmNvbmp1Z2F0ZSgpKTsKKworICAvLyBjaGVjayBtaXhlZCBkb3QgcHJvZHVjdAorICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gUmVhbFZlY3RvclR5cGU7CisgIFJlYWxWZWN0b3JUeXBlIHJ2MSA9IFJlYWxWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIFZFUklGWV9JU19BUFBST1godjEuZG90KHJ2MS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSksIHYxLmRvdChydjEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChydjEudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkuZG90KHYxKSwgcnYxLmRvdCh2MSkpOworfQorCit2b2lkIHRlc3RfYWRqb2ludCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGFkam9pbnQoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBhZGpvaW50KE1hdHJpeDNkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGFkam9pbnQoTWF0cml4NGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggYWRqb2ludChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGFkam9pbnQoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggYWRqb2ludChNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisgIC8vIHRlc3QgYSBsYXJnZSBzdGF0aWMgbWF0cml4IG9ubHkgb25jZQorICBDQUxMX1NVQlRFU1RfNyggYWRqb2ludChNYXRyaXg8ZmxvYXQsIDEwMCwgMTAwPigpKSApOworCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzQKKyAgeworICAgIE1hdHJpeFhjZiBhKDEwLDEwKSwgYigxMCwxMCk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSA9IGEudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEgPSBhLnRyYW5zcG9zZSgpICsgYik7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSA9IGIgKyBhLnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChhID0gYS5jb25qdWdhdGUoKS50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSA9IGEuYWRqb2ludCgpKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChhID0gYS5hZGpvaW50KCkgKyBiKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChhID0gYiArIGEuYWRqb2ludCgpKTsKKworICAgIC8vIG5vIGFzc2VydGlvbiBzaG91bGQgYmUgdHJpZ2dlcmVkIGZvciB0aGVzZSBjYXNlczoKKyAgICBhLnRyYW5zcG9zZSgpID0gYS50cmFuc3Bvc2UoKTsKKyAgICBhLnRyYW5zcG9zZSgpICs9IGEudHJhbnNwb3NlKCk7CisgICAgYS50cmFuc3Bvc2UoKSArPSBhLnRyYW5zcG9zZSgpICsgYjsKKyAgICBhLnRyYW5zcG9zZSgpID0gYS5hZGpvaW50KCk7CisgICAgYS50cmFuc3Bvc2UoKSArPSBhLmFkam9pbnQoKTsKKyAgICBhLnRyYW5zcG9zZSgpICs9IGEuYWRqb2ludCgpICsgYjsKKyAgfQorI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvYXJyYXkuY3BwIGIvdGVzdC9hcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0OGZhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXJyYXkuY3BwCkBAIC0wLDAgKzEsMzAzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIGFycmF5KGNvbnN0IEFycmF5VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIEFycmF5PFNjYWxhciwgQXJyYXlUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gQ29sVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIDEsIEFycmF5VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IFJvd1ZlY3RvclR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7IAorCisgIEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyk7CisKKyAgQ29sVmVjdG9yVHlwZSBjdjEgPSBDb2xWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIFJvd1ZlY3RvclR5cGUgcnYxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKGNvbHMpOworCisgIFNjYWxhciAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIC8vIHNjYWxhciBhZGRpdGlvbgorICBWRVJJRllfSVNfQVBQUk9YKG0xICsgczEsIHMxICsgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xICsgczEsIEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMxKSArIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzMSAtIG0xLCAoLW0xKStzMSApOworICBWRVJJRllfSVNfQVBQUk9YKG0xIC0gczEsIG0xIC0gQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzMSAtIG0xLCBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxzMSkgLSBtMSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xKlNjYWxhcigyKSkgLSBzMiwgKG0xK20xKSAtIEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMyKSApOworICBtMyA9IG0xOworICBtMyArPSBzMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEgKyBzMik7CisgIG0zID0gbTE7CisgIG0zIC09IHMxOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSAtIHMxKTsgIAorICAKKyAgLy8gc2NhbGFyIG9wZXJhdG9ycyB2aWEgTWFwcworICBtMyA9IG0xOworICBBcnJheVR5cGU6Ok1hcChtMS5kYXRhKCksIG0xLnJvd3MoKSwgbTEuY29scygpKSAtPSBBcnJheVR5cGU6Ok1hcChtMi5kYXRhKCksIG0yLnJvd3MoKSwgbTIuY29scygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTMgLSBtMik7CisgIAorICBtMyA9IG0xOworICBBcnJheVR5cGU6Ok1hcChtMS5kYXRhKCksIG0xLnJvd3MoKSwgbTEuY29scygpKSArPSBBcnJheVR5cGU6Ok1hcChtMi5kYXRhKCksIG0yLnJvd3MoKSwgbTIuY29scygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTMgKyBtMik7CisgIAorICBtMyA9IG0xOworICBBcnJheVR5cGU6Ok1hcChtMS5kYXRhKCksIG0xLnJvd3MoKSwgbTEuY29scygpKSAqPSBBcnJheVR5cGU6Ok1hcChtMi5kYXRhKCksIG0yLnJvd3MoKSwgbTIuY29scygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTMgKiBtMik7CisgIAorICBtMyA9IG0xOworICBtMiA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIG0yID0gKG0yPT0wKS5zZWxlY3QoMSxtMik7CisgIEFycmF5VHlwZTo6TWFwKG0xLmRhdGEoKSwgbTEucm93cygpLCBtMS5jb2xzKCkpIC89IEFycmF5VHlwZTo6TWFwKG0yLmRhdGEoKSwgbTIucm93cygpLCBtMi5jb2xzKCkpOyAgCisgIFZFUklGWV9JU19BUFBST1gobTEsIG0zIC8gbTIpOworCisgIC8vIHJlZHVjdGlvbnMKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2x3aXNlKCkuc3VtKCkuc3VtKCksIG0xLnN1bSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5yb3d3aXNlKCkuc3VtKCkuc3VtKCksIG0xLnN1bSgpKTsKKyAgaWYgKCFpbnRlcm5hbDo6aXNBcHByb3gobTEuc3VtKCksIChtMSttMikuc3VtKCksIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpCisgICAgICBWRVJJRllfSVNfTk9UX0FQUFJPWCgoKG0xK20yKS5yb3d3aXNlKCkuc3VtKCkpLnN1bSgpLCBtMS5zdW0oKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY29sd2lzZSgpLnN1bSgpLCBtMS5jb2x3aXNlKCkucmVkdXgoaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPigpKSk7CisKKyAgLy8gdmVjdG9yLXdpc2Ugb3BzCisgIG0zID0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMuY29sd2lzZSgpICs9IGN2MSwgbTEuY29sd2lzZSgpICsgY3YxKTsKKyAgbTMgPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5jb2x3aXNlKCkgLT0gY3YxLCBtMS5jb2x3aXNlKCkgLSBjdjEpOworICBtMyA9IG0xOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnJvd3dpc2UoKSArPSBydjEsIG0xLnJvd3dpc2UoKSArIHJ2MSk7CisgIG0zID0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMucm93d2lzZSgpIC09IHJ2MSwgbTEucm93d2lzZSgpIC0gcnYxKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIGNvbXBhcmlzb25zKGNvbnN0IEFycmF5VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIEFycmF5PFNjYWxhciwgQXJyYXlUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKKyAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisKKyAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsgICAgICAgICAgICAKKworICBWRVJJRlkoKChtMSArIFNjYWxhcigxKSkgPiBtMSkuYWxsKCkpOworICBWRVJJRlkoKChtMSAtIFNjYWxhcigxKSkgPCBtMSkuYWxsKCkpOworICBpZiAocm93cypjb2xzPjEpCisgIHsKKyAgICBtMyA9IG0xOworICAgIG0zKHIsYykgKz0gMTsKKyAgICBWRVJJRlkoISAobTEgPCBtMykuYWxsKCkgKTsKKyAgICBWRVJJRlkoISAobTEgPiBtMykuYWxsKCkgKTsKKyAgfQorCisgIC8vIGNvbXBhcmlzb25zIHRvIHNjYWxhcgorICBWRVJJRlkoIChtMSAhPSAobTEocixjKSsxKSApLmFueSgpICk7CisgIFZFUklGWSggKG0xID4gKG0xKHIsYyktMSkgKS5hbnkoKSApOworICBWRVJJRlkoIChtMSA8IChtMShyLGMpKzEpICkuYW55KCkgKTsKKyAgVkVSSUZZKCAobTEgPT0gbTEocixjKSApLmFueSgpICk7CisKKyAgLy8gdGVzdCBTZWxlY3QKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xPG0yKS5zZWxlY3QobTEsbTIpLCBtMS5jd2lzZU1pbihtMikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xPm0yKS5zZWxlY3QobTEsbTIpLCBtMS5jd2lzZU1heChtMikgKTsKKyAgU2NhbGFyIG1pZCA9IChtMS5jd2lzZUFicygpLm1pbkNvZWZmKCkgKyBtMS5jd2lzZUFicygpLm1heENvZWZmKCkpL1NjYWxhcigyKTsKKyAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKKyAgZm9yIChpbnQgaT0wOyBpPHJvd3M7ICsraSkKKyAgICBtMyhpLGopID0gaW50ZXJuYWw6OmFicyhtMShpLGopKTxtaWQgPyAwIDogbTEoaSxqKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFicygpPEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLG1pZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KEFycmF5VHlwZTo6WmVybyhyb3dzLGNvbHMpLG0xKSwgbTMpOworICAvLyBzaG9ydGVyIHZlcnNpb25zOgorICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYWJzKCk8QXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsbWlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoMCxtMSksIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFicygpPj1BcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxtaWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChtMSwwKSwgbTMpOworICAvLyBldmVuIHNob3J0ZXIgdmVyc2lvbjoKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFicygpPG1pZCkuc2VsZWN0KDAsbTEpLCBtMyk7CisKKyAgLy8gY291bnQKKyAgVkVSSUZZKCgobTEuYWJzKCkrMSk+UmVhbFNjYWxhcigwLjEpKS5jb3VudCgpID09IHJvd3MqY29scyk7CisKKyAgLy8gYW5kL29yCisgIFZFUklGWSggKG0xPFJlYWxTY2FsYXIoMCkgJiYgbTE+UmVhbFNjYWxhcigwKSkuY291bnQoKSA9PSAwKTsKKyAgVkVSSUZZKCAobTE8UmVhbFNjYWxhcigwKSB8fCBtMT49UmVhbFNjYWxhcigwKSkuY291bnQoKSA9PSByb3dzKmNvbHMpOworICBSZWFsU2NhbGFyIGEgPSBtMS5hYnMoKS5tZWFuKCk7CisgIFZFUklGWSggKG0xPC1hIHx8IG0xPmEpLmNvdW50KCkgPT0gKG0xLmFicygpPmEpLmNvdW50KCkpOworCisgIHR5cGVkZWYgQXJyYXk8dHlwZW5hbWUgQXJyYXlUeXBlOjpJbmRleCwgRHluYW1pYywgMT4gQXJyYXlPZkluZGljZXM7CisKKyAgLy8gVE9ETyBhbGxvd3MgY29sd2lzZS9yb3d3aXNlIGZvciBhcnJheQorICBWRVJJRllfSVNfQVBQUk9YKCgobTEuYWJzKCkrMSk+UmVhbFNjYWxhcigwLjEpKS5jb2x3aXNlKCkuY291bnQoKSwgQXJyYXlPZkluZGljZXM6OkNvbnN0YW50KGNvbHMscm93cykudHJhbnNwb3NlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCgobTEuYWJzKCkrMSk+UmVhbFNjYWxhcigwLjEpKS5yb3d3aXNlKCkuY291bnQoKSwgQXJyYXlPZkluZGljZXM6OkNvbnN0YW50KHJvd3MsIGNvbHMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIGFycmF5X3JlYWwoY29uc3QgQXJyYXlUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJyYXlUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKworICBTY2FsYXIgIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgLy8gdGhlc2UgdGVzdHMgYXJlIG1vc3RseSB0byBjaGVjayBwb3NzaWJsZSBjb21waWxhdGlvbiBpc3N1ZXMuCisgIFZFUklGWV9JU19BUFBST1gobTEuc2luKCksIHN0ZDo6c2luKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuc2luKCksIGludGVybmFsOjpzaW4obTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb3MoKSwgc3RkOjpjb3MobTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb3MoKSwgaW50ZXJuYWw6OmNvcyhtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFzaW4oKSwgc3RkOjphc2luKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYXNpbigpLCBpbnRlcm5hbDo6YXNpbihtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFjb3MoKSwgc3RkOjphY29zKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYWNvcygpLCBpbnRlcm5hbDo6YWNvcyhtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnRhbigpLCBzdGQ6OnRhbihtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnRhbigpLCBpbnRlcm5hbDo6dGFuKG0xKSk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKGludGVybmFsOjpjb3MobTErUmVhbFNjYWxhcigzKSptMiksIGludGVybmFsOjpjb3MoKG0xK1JlYWxTY2FsYXIoMykqbTIpLmV2YWwoKSkpOworICBWRVJJRllfSVNfQVBQUk9YKHN0ZDo6Y29zKG0xK1JlYWxTY2FsYXIoMykqbTIpLCBzdGQ6OmNvcygobTErUmVhbFNjYWxhcigzKSptMikuZXZhbCgpKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hYnMoKS5zcXJ0KCksIHN0ZDo6c3FydChzdGQ6OmFicyhtMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hYnMoKS5zcXJ0KCksIGludGVybmFsOjpzcXJ0KGludGVybmFsOjphYnMobTEpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYWJzKCksIGludGVybmFsOjpzcXJ0KGludGVybmFsOjphYnMyKG0xKSkpOworCisgIFZFUklGWV9JU19BUFBST1goaW50ZXJuYWw6OmFiczIoaW50ZXJuYWw6OnJlYWwobTEpKSArIGludGVybmFsOjphYnMyKGludGVybmFsOjppbWFnKG0xKSksIGludGVybmFsOjphYnMyKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1goaW50ZXJuYWw6OmFiczIoc3RkOjpyZWFsKG0xKSkgKyBpbnRlcm5hbDo6YWJzMihzdGQ6OmltYWcobTEpKSwgaW50ZXJuYWw6OmFiczIobTEpKTsKKyAgaWYoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgICAgVkVSSUZZX0lTX0FQUFJPWChpbnRlcm5hbDo6cmVhbChtMSksIG0xKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFicygpLmxvZygpLCBzdGQ6OmxvZyhzdGQ6OmFicyhtMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hYnMoKS5sb2coKSwgaW50ZXJuYWw6OmxvZyhpbnRlcm5hbDo6YWJzKG0xKSkpOworCisgIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCksIHN0ZDo6ZXhwKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCkgKiBtMi5leHAoKSwgc3RkOjpleHAobTErbTIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5leHAoKSwgaW50ZXJuYWw6OmV4cChtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmV4cCgpIC8gbTIuZXhwKCksIHN0ZDo6ZXhwKG0xLW0yKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5wb3coMiksIG0xLnNxdWFyZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdGQ6OnBvdyhtMSwyKSwgbTEuc3F1YXJlKCkpOworCisgIEFycmF5VHlwZSBleHBvbmVudHMgPSBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIFJlYWxTY2FsYXIoMikpOworICBWRVJJRllfSVNfQVBQUk9YKHN0ZDo6cG93KG0xLGV4cG9uZW50cyksIG0xLnNxdWFyZSgpKTsKKworICBtMyA9IG0xLmFicygpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnBvdyhSZWFsU2NhbGFyKDAuNSkpLCBtMy5zcXJ0KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHN0ZDo6cG93KG0zLFJlYWxTY2FsYXIoMC41KSksIG0zLnNxcnQoKSk7CisKKyAgLy8gc2NhbGFyIGJ5IGFycmF5IGRpdmlzaW9uCisgIGNvbnN0IFJlYWxTY2FsYXIgdGlueSA9IHN0ZDo6c3FydChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkpOworICBzMSArPSBTY2FsYXIodGlueSk7CisgIG0xICs9IEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLFNjYWxhcih0aW55KSk7CisgIFZFUklGWV9JU19BUFBST1goczEvbTEsIHMxICogbTEuaW52ZXJzZSgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIGFycmF5X2NvbXBsZXgoY29uc3QgQXJyYXlUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICBtMihyb3dzLCBjb2xzKTsKKworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbS5yb3dzKCk7ICsraSkKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbS5jb2xzKCk7ICsraikKKyAgICAgIG0yKGksaikgPSBzdGQ6OnNxcnQobTEoaSxqKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5zcXJ0KCksIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5zcXJ0KCksIHN0ZDo6c3FydChtMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnNxcnQoKSwgaW50ZXJuYWw6OnNxcnQobTEpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIG1pbl9tYXgoY29uc3QgQXJyYXlUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJyYXlUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworCisgIC8vIG1pbi9tYXggd2l0aCBhcnJheQorICBTY2FsYXIgbWF4TTEgPSBtMS5tYXhDb2VmZigpOworICBTY2FsYXIgbWluTTEgPSBtMS5taW5Db2VmZigpOworCisgIFZFUklGWV9JU19BUFBST1goQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSwgKG0xLm1pbikoQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCAobTEubWluKShBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpLCAobTEubWF4KShBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIChtMS5tYXgpKEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtaW5NMSkpKTsKKworICAvLyBtaW4vbWF4IHdpdGggc2NhbGFyIGlucHV0CisgIFZFUklGWV9JU19BUFBST1goQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSwgKG0xLm1pbikoIG1pbk0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIChtMS5taW4pKCBtYXhNMSkpOworCisgIFZFUklGWV9JU19BUFBST1goQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1heE0xKSwgKG0xLm1heCkoIG1heE0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIChtMS5tYXgpKCBtaW5NMSkpOworCit9CisKK3ZvaWQgdGVzdF9hcnJheSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGFycmF5KEFycmF5PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBhcnJheShBcnJheTIyZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBhcnJheShBcnJheTQ0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBhcnJheShBcnJheVhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggYXJyYXkoQXJyYXlYWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggYXJyYXkoQXJyYXlYWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgfQorICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBjb21wYXJpc29ucyhBcnJheTxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggY29tcGFyaXNvbnMoQXJyYXkyMmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggY29tcGFyaXNvbnMoQXJyYXk0NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggY29tcGFyaXNvbnMoQXJyYXlYWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggY29tcGFyaXNvbnMoQXJyYXlYWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgfQorICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBtaW5fbWF4KEFycmF5PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtaW5fbWF4KEFycmF5MjJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1pbl9tYXgoQXJyYXk0NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbWluX21heChBcnJheVhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBtaW5fbWF4KEFycmF5WFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggYXJyYXlfcmVhbChBcnJheTxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggYXJyYXlfcmVhbChBcnJheTIyZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBhcnJheV9yZWFsKEFycmF5NDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGFycmF5X3JlYWwoQXJyYXlYWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgfQorICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF80KCBhcnJheV9jb21wbGV4KEFycmF5WFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6Omdsb2JhbF9tYXRoX2Z1bmN0aW9uc19maWx0ZXJpbmdfYmFzZTxpbnQ+Ojp0eXBlLCBpbnQgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6Omdsb2JhbF9tYXRoX2Z1bmN0aW9uc19maWx0ZXJpbmdfYmFzZTxmbG9hdD46OnR5cGUsIGZsb2F0ID46OnZhbHVlKSk7CisgIFZFUklGWSgoaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjpnbG9iYWxfbWF0aF9mdW5jdGlvbnNfZmlsdGVyaW5nX2Jhc2U8QXJyYXkyaT46OnR5cGUsIEFycmF5QmFzZTxBcnJheTJpPiA+Ojp2YWx1ZSkpOworICB0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxkb3VibGU+LCBBcnJheVhkID4gWHByOworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6Z2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPFhwcj46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUJhc2U8WHByPgorICAgICAgICAgICAgICAgICAgICAgICAgID46OnZhbHVlKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2FycmF5X2Zvcl9tYXRyaXguY3BwIGIvdGVzdC9hcnJheV9mb3JfbWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjYzN2MzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hcnJheV9mb3JfbWF0cml4LmNwcApAQCAtMCwwICsxLDIwNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgYXJyYXlfZm9yX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gQ29sVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsgCisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKworICBDb2xWZWN0b3JUeXBlIGN2MSA9IENvbFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgUm93VmVjdG9yVHlwZSBydjEgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyk7CisKKyAgU2NhbGFyICBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgLy8gc2NhbGFyIGFkZGl0aW9uCisgIFZFUklGWV9JU19BUFBST1gobTEuYXJyYXkoKSArIHMxLCBzMSArIG0xLmFycmF5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMS5hcnJheSgpICsgczEpLm1hdHJpeCgpLCBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczEpICsgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKCgobTEqU2NhbGFyKDIpKS5hcnJheSgpIC0gczIpLm1hdHJpeCgpLCAobTErbTEpIC0gTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMyKSApOworICBtMyA9IG0xOworICBtMy5hcnJheSgpICs9IHMyOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCAobTEuYXJyYXkoKSArIHMyKS5tYXRyaXgoKSk7CisgIG0zID0gbTE7CisgIG0zLmFycmF5KCkgLT0gczE7CisgIFZFUklGWV9JU19BUFBST1gobTMsIChtMS5hcnJheSgpIC0gczEpLm1hdHJpeCgpKTsKKworICAvLyByZWR1Y3Rpb25zCisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihtMS5jb2x3aXNlKCkuc3VtKCkuc3VtKCkgLSBtMS5zdW0oKSwgbTEuY3dpc2VBYnMoKS5tYXhDb2VmZigpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKG0xLnJvd3dpc2UoKS5zdW0oKS5zdW0oKSAtIG0xLnN1bSgpLCBtMS5jd2lzZUFicygpLm1heENvZWZmKCkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obTEuY29sd2lzZSgpLnN1bSgpICsgbTIuY29sd2lzZSgpLnN1bSgpIC0gKG0xK20yKS5jb2x3aXNlKCkuc3VtKCksIChtMSttMikuY3dpc2VBYnMoKS5tYXhDb2VmZigpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKG0xLnJvd3dpc2UoKS5zdW0oKSAtIG0yLnJvd3dpc2UoKS5zdW0oKSAtIChtMS1tMikucm93d2lzZSgpLnN1bSgpLCAobTEtbTIpLmN3aXNlQWJzKCkubWF4Q29lZmYoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY29sd2lzZSgpLnN1bSgpLCBtMS5jb2x3aXNlKCkucmVkdXgoaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPigpKSk7CisKKyAgLy8gdmVjdG9yLXdpc2Ugb3BzCisgIG0zID0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMuY29sd2lzZSgpICs9IGN2MSwgbTEuY29sd2lzZSgpICsgY3YxKTsKKyAgbTMgPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5jb2x3aXNlKCkgLT0gY3YxLCBtMS5jb2x3aXNlKCkgLSBjdjEpOworICBtMyA9IG0xOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnJvd3dpc2UoKSArPSBydjEsIG0xLnJvd3dpc2UoKSArIHJ2MSk7CisgIG0zID0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMucm93d2lzZSgpIC09IHJ2MSwgbTEucm93d2lzZSgpIC0gcnYxKTsKKyAgCisgIC8vIGVtcHR5IG9iamVjdHMKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jaygwLDAsMCxjb2xzKS5jb2x3aXNlKCkuc3VtKCksICBSb3dWZWN0b3JUeXBlOjpaZXJvKGNvbHMpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jaygwLDAscm93cywwKS5yb3d3aXNlKCkucHJvZCgpLCBDb2xWZWN0b3JUeXBlOjpPbmVzKHJvd3MpKTsKKyAgCisgIC8vIHZlcmlmeSB0aGUgY29uc3QgYWNjZXNzb3JzIGV4aXN0CisgIGNvbnN0IFNjYWxhciYgcmVmX20xID0gbS5tYXRyaXgoKS5hcnJheSgpLmNvZWZmUmVmKDApOworICBjb25zdCBTY2FsYXImIHJlZl9tMiA9IG0ubWF0cml4KCkuYXJyYXkoKS5jb2VmZlJlZigwLDApOworICBjb25zdCBTY2FsYXImIHJlZl9hMSA9IG0uYXJyYXkoKS5tYXRyaXgoKS5jb2VmZlJlZigwKTsKKyAgY29uc3QgU2NhbGFyJiByZWZfYTIgPSBtLmFycmF5KCkubWF0cml4KCkuY29lZmZSZWYoMCwwKTsKKyAgVkVSSUZZKCZyZWZfYTEgPT0gJnJlZl9tMSk7CisgIFZFUklGWSgmcmVmX2EyID09ICZyZWZfbTIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNvbXBhcmlzb25zKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAorICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworCisgIFZFUklGWSgoKG0xLmFycmF5KCkgKyBTY2FsYXIoMSkpID4gbTEuYXJyYXkoKSkuYWxsKCkpOworICBWRVJJRlkoKChtMS5hcnJheSgpIC0gU2NhbGFyKDEpKSA8IG0xLmFycmF5KCkpLmFsbCgpKTsKKyAgaWYgKHJvd3MqY29scz4xKQorICB7CisgICAgbTMgPSBtMTsKKyAgICBtMyhyLGMpICs9IDE7CisgICAgVkVSSUZZKCEgKG0xLmFycmF5KCkgPCBtMy5hcnJheSgpKS5hbGwoKSApOworICAgIFZFUklGWSghIChtMS5hcnJheSgpID4gbTMuYXJyYXkoKSkuYWxsKCkgKTsKKyAgfQorCisgIC8vIGNvbXBhcmlzb25zIHRvIHNjYWxhcgorICBWRVJJRlkoIChtMS5hcnJheSgpICE9IChtMShyLGMpKzEpICkuYW55KCkgKTsKKyAgVkVSSUZZKCAobTEuYXJyYXkoKSA+IChtMShyLGMpLTEpICkuYW55KCkgKTsKKyAgVkVSSUZZKCAobTEuYXJyYXkoKSA8IChtMShyLGMpKzEpICkuYW55KCkgKTsKKyAgVkVSSUZZKCAobTEuYXJyYXkoKSA9PSBtMShyLGMpICkuYW55KCkgKTsKKworICAvLyB0ZXN0IFNlbGVjdAorICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYXJyYXkoKTxtMi5hcnJheSgpKS5zZWxlY3QobTEsbTIpLCBtMS5jd2lzZU1pbihtMikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFycmF5KCk+bTIuYXJyYXkoKSkuc2VsZWN0KG0xLG0yKSwgbTEuY3dpc2VNYXgobTIpICk7CisgIFNjYWxhciBtaWQgPSAobTEuY3dpc2VBYnMoKS5taW5Db2VmZigpICsgbTEuY3dpc2VBYnMoKS5tYXhDb2VmZigpKS9TY2FsYXIoMik7CisgIGZvciAoaW50IGo9MDsgajxjb2xzOyArK2opCisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCisgICAgbTMoaSxqKSA9IGludGVybmFsOjphYnMobTEoaSxqKSk8bWlkID8gMCA6IG0xKGksaik7CisgIFZFUklGWV9JU19BUFBST1goIChtMS5hcnJheSgpLmFicygpPE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxtaWQpLmFycmF5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKSxtMSksIG0zKTsKKyAgLy8gc2hvcnRlciB2ZXJzaW9uczoKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFycmF5KCkuYWJzKCk8TWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLG1pZCkuYXJyYXkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoMCxtMSksIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFycmF5KCkuYWJzKCk+PU1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxtaWQpLmFycmF5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KG0xLDApLCBtMyk7CisgIC8vIGV2ZW4gc2hvcnRlciB2ZXJzaW9uOgorICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYXJyYXkoKS5hYnMoKTxtaWQpLnNlbGVjdCgwLG0xKSwgbTMpOworCisgIC8vIGNvdW50CisgIFZFUklGWSgoKG0xLmFycmF5KCkuYWJzKCkrMSk+UmVhbFNjYWxhcigwLjEpKS5jb3VudCgpID09IHJvd3MqY29scyk7CisKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXgsIER5bmFtaWMsIDE+IFZlY3Rvck9mSW5kaWNlczsKKworICAvLyBUT0RPIGFsbG93cyBjb2x3aXNlL3Jvd3dpc2UgZm9yIGFycmF5CisgIFZFUklGWV9JU19BUFBST1goKChtMS5hcnJheSgpLmFicygpKzEpPlJlYWxTY2FsYXIoMC4xKSkubWF0cml4KCkuY29sd2lzZSgpLmNvdW50KCksIFZlY3Rvck9mSW5kaWNlczo6Q29uc3RhbnQoY29scyxyb3dzKS50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1goKChtMS5hcnJheSgpLmFicygpKzEpPlJlYWxTY2FsYXIoMC4xKSkubWF0cml4KCkucm93d2lzZSgpLmNvdW50KCksIFZlY3Rvck9mSW5kaWNlczo6Q29uc3RhbnQocm93cywgY29scykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIGxwTm9ybShjb25zdCBWZWN0b3JUeXBlJiB2KQoreworICBWZWN0b3JUeXBlIHUgPSBWZWN0b3JUeXBlOjpSYW5kb20odi5zaXplKCkpOworCisgIFZFUklGWV9JU19BUFBST1godS50ZW1wbGF0ZSBscE5vcm08SW5maW5pdHk+KCksIHUuY3dpc2VBYnMoKS5tYXhDb2VmZigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh1LnRlbXBsYXRlIGxwTm9ybTwxPigpLCB1LmN3aXNlQWJzKCkuc3VtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHUudGVtcGxhdGUgbHBOb3JtPDI+KCksIGludGVybmFsOjpzcXJ0KHUuYXJyYXkoKS5hYnMoKS5zcXVhcmUoKS5zdW0oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKGludGVybmFsOjpwb3codS50ZW1wbGF0ZSBscE5vcm08NT4oKSwgdHlwZW5hbWUgVmVjdG9yVHlwZTo6UmVhbFNjYWxhcig1KSksIHUuYXJyYXkoKS5hYnMoKS5wb3coNSkuc3VtKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGN3aXNlX21pbl9tYXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisKKyAgLy8gbWluL21heCB3aXRoIGFycmF5CisgIFNjYWxhciBtYXhNMSA9IG0xLm1heENvZWZmKCk7CisgIFNjYWxhciBtaW5NMSA9IG0xLm1pbkNvZWZmKCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSwgbTEuY3dpc2VNaW4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtaW5NMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTEuY3dpc2VNaW4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSkpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpLCBtMS5jd2lzZU1heChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1heE0xKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMS5jd2lzZU1heChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSkpOworCisgIC8vIG1pbi9tYXggd2l0aCBzY2FsYXIgaW5wdXQKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSwgbTEuY3dpc2VNaW4oIG1pbk0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0xLmN3aXNlTWluKCBtYXhNMSkpOworCisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSksIG0xLmN3aXNlTWF4KCBtYXhNMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMS5jd2lzZU1heCggbWluTTEpKTsKKworfQorCit2b2lkIHRlc3RfYXJyYXlfZm9yX21hdHJpeCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGFycmF5X2Zvcl9tYXRyaXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBhcnJheV9mb3JfbWF0cml4KE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGFycmF5X2Zvcl9tYXRyaXgoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggYXJyYXlfZm9yX21hdHJpeChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggYXJyYXlfZm9yX21hdHJpeChNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBhcnJheV9mb3JfbWF0cml4KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggY29tcGFyaXNvbnMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBjb21wYXJpc29ucyhNYXRyaXgyZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBjb21wYXJpc29ucyhNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF81KCBjb21wYXJpc29ucyhNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBjb21wYXJpc29ucyhNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGN3aXNlX21pbl9tYXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBjd2lzZV9taW5fbWF4KE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGN3aXNlX21pbl9tYXgoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggY3dpc2VfbWluX21heChNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBjd2lzZV9taW5fbWF4KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggbHBOb3JtKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbHBOb3JtKFZlY3RvcjJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIGxwTm9ybShWZWN0b3IzZCgpKSApOworICAgIENBTExfU1VCVEVTVF84KCBscE5vcm0oVmVjdG9yNGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbHBOb3JtKFZlY3RvclhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbHBOb3JtKFZlY3RvclhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXJyYXlfcmVwbGljYXRlLmNwcCBiL3Rlc3QvYXJyYXlfcmVwbGljYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRhNzQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hcnJheV9yZXBsaWNhdGUuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCByZXBsaWNhdGUoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBSZXBsaWNhdGUuY3BwCisgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gVmVjdG9yWDsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworCisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisKKyAgTWF0cml4WCB4MSwgeDI7CisgIFZlY3RvclggdngxOworCisgIGludCAgZjEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCksCisgICAgICAgZjIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCk7CisKKyAgeDEucmVzaXplKHJvd3MqZjEsY29scypmMik7CisgIGZvcihpbnQgaj0wOyBqPGYyOyBqKyspCisgIGZvcihpbnQgaT0wOyBpPGYxOyBpKyspCisgICAgeDEuYmxvY2soaSpyb3dzLGoqY29scyxyb3dzLGNvbHMpID0gbTE7CisgIFZFUklGWV9JU19BUFBST1goeDEsIG0xLnJlcGxpY2F0ZShmMSxmMikpOworCisgIHgyLnJlc2l6ZSgyKnJvd3MsMypjb2xzKTsKKyAgeDIgPDwgbTIsIG0yLCBtMiwKKyAgICAgICAgbTIsIG0yLCBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MiwgKG0yLnRlbXBsYXRlIHJlcGxpY2F0ZTwyLDM+KCkpKTsKKworICB4Mi5yZXNpemUocm93cyxmMSk7CisgIGZvciAoaW50IGo9MDsgajxmMTsgKytqKQorICAgIHgyLmNvbChqKSA9IHYxOworICBWRVJJRllfSVNfQVBQUk9YKHgyLCB2MS5yb3d3aXNlKCkucmVwbGljYXRlKGYxKSk7CisKKyAgdngxLnJlc2l6ZShyb3dzKmYyKTsKKyAgZm9yIChpbnQgaj0wOyBqPGYyOyArK2opCisgICAgdngxLnNlZ21lbnQoaipyb3dzLHJvd3MpID0gdjE7CisgIFZFUklGWV9JU19BUFBST1godngxLCB2MS5jb2x3aXNlKCkucmVwbGljYXRlKGYyKSk7Cit9CisKK3ZvaWQgdGVzdF9hcnJheV9yZXBsaWNhdGUoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCByZXBsaWNhdGUoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCByZXBsaWNhdGUoVmVjdG9yMmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcmVwbGljYXRlKFZlY3RvcjNkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHJlcGxpY2F0ZShWZWN0b3I0ZigpKSApOworICAgIENBTExfU1VCVEVTVF81KCByZXBsaWNhdGUoVmVjdG9yWGYoMTYpKSApOworICAgIENBTExfU1VCVEVTVF82KCByZXBsaWNhdGUoVmVjdG9yWGNkKDEwKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hcnJheV9yZXZlcnNlLmNwcCBiL3Rlc3QvYXJyYXlfcmV2ZXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlN2E5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXJyYXlfcmV2ZXJzZS5jcHAKQEAgLTAsMCArMSwxMjggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgUmljYXJkIE1hcnhlciA8ZW1haWxAcmljYXJkbWFyeGVyLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcmV2ZXJzZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworCisgIE1hdHJpeFR5cGUgbTFfciA9IG0xLnJldmVyc2UoKTsKKyAgLy8gVmVyaWZ5IHRoYXQgTWF0cml4QmFzZTo6cmV2ZXJzZSgpIHdvcmtzCisgIGZvciAoIGludCBpID0gMDsgaSA8IHJvd3M7IGkrKyApIHsKKyAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysgKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xX3IoaSwgaiksIG0xKHJvd3MgLSAxIC0gaSwgY29scyAtIDEgLSBqKSk7CisgICAgfQorICB9CisKKyAgUmV2ZXJzZTxNYXRyaXhUeXBlPiBtMV9yZChtMSk7CisgIC8vIFZlcmlmeSB0aGF0IGEgUmV2ZXJzZSBkZWZhdWx0IChpbiBib3RoIGRpcmVjdGlvbnMpIG9mIGFuIGV4cHJlc3Npb24gd29ya3MKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgeworICAgIGZvciAoIGludCBqID0gMDsgaiA8IGNvbHM7IGorKyApIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTFfcmQoaSwgaiksIG0xKHJvd3MgLSAxIC0gaSwgY29scyAtIDEgLSBqKSk7CisgICAgfQorICB9CisKKyAgUmV2ZXJzZTxNYXRyaXhUeXBlLCBCb3RoRGlyZWN0aW9ucz4gbTFfcmIobTEpOworICAvLyBWZXJpZnkgdGhhdCBhIFJldmVyc2UgaW4gYm90aCBkaXJlY3Rpb25zIG9mIGFuIGV4cHJlc3Npb24gd29ya3MKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgeworICAgIGZvciAoIGludCBqID0gMDsgaiA8IGNvbHM7IGorKyApIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTFfcmIoaSwgaiksIG0xKHJvd3MgLSAxIC0gaSwgY29scyAtIDEgLSBqKSk7CisgICAgfQorICB9CisKKyAgUmV2ZXJzZTxNYXRyaXhUeXBlLCBWZXJ0aWNhbD4gbTFfcnYobTEpOworICAvLyBWZXJpZnkgdGhhdCBhIFJldmVyc2UgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbnMgb2YgYW4gZXhwcmVzc2lvbiB3b3JrcworICBmb3IgKCBpbnQgaSA9IDA7IGkgPCByb3dzOyBpKysgKSB7CisgICAgZm9yICggaW50IGogPSAwOyBqIDwgY29sczsgaisrICkgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMV9ydihpLCBqKSwgbTEocm93cyAtIDEgLSBpLCBqKSk7CisgICAgfQorICB9CisKKyAgUmV2ZXJzZTxNYXRyaXhUeXBlLCBIb3Jpem9udGFsPiBtMV9yaChtMSk7CisgIC8vIFZlcmlmeSB0aGF0IGEgUmV2ZXJzZSBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb25zIG9mIGFuIGV4cHJlc3Npb24gd29ya3MKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgeworICAgIGZvciAoIGludCBqID0gMDsgaiA8IGNvbHM7IGorKyApIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTFfcmgoaSwgaiksIG0xKGksIGNvbHMgLSAxIC0gaikpOworICAgIH0KKyAgfQorCisgIFZlY3RvclR5cGUgdjFfciA9IHYxLnJldmVyc2UoKTsKKyAgLy8gVmVyaWZ5IHRoYXQgYSBWZWN0b3JUeXBlOjpyZXZlcnNlKCkgb2YgYW4gZXhwcmVzc2lvbiB3b3JrcworICBmb3IgKCBpbnQgaSA9IDA7IGkgPCByb3dzOyBpKysgKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2MV9yKGkpLCB2MShyb3dzIC0gMSAtIGkpKTsKKyAgfQorCisgIE1hdHJpeFR5cGUgbTFfY3IgPSBtMS5jb2x3aXNlKCkucmV2ZXJzZSgpOworICAvLyBWZXJpZnkgdGhhdCBQYXJ0aWFsUmVkdXg6OnJldmVyc2UoKSB3b3JrcyAoZm9yIGNvbHdpc2UoKSkKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgeworICAgIGZvciAoIGludCBqID0gMDsgaiA8IGNvbHM7IGorKyApIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTFfY3IoaSwgaiksIG0xKHJvd3MgLSAxIC0gaSwgaikpOworICAgIH0KKyAgfQorCisgIE1hdHJpeFR5cGUgbTFfcnIgPSBtMS5yb3d3aXNlKCkucmV2ZXJzZSgpOworICAvLyBWZXJpZnkgdGhhdCBQYXJ0aWFsUmVkdXg6OnJldmVyc2UoKSB3b3JrcyAoZm9yIHJvd3dpc2UoKSkKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgeworICAgIGZvciAoIGludCBqID0gMDsgaiA8IGNvbHM7IGorKyApIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTFfcnIoaSwgaiksIG0xKGksIGNvbHMgLSAxIC0gaikpOworICAgIH0KKyAgfQorCisgIFNjYWxhciB4ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCisgICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworCisgIG0xLnJldmVyc2UoKShyLCBjKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgbTEocm93cyAtIDEgLSByLCBjb2xzIC0gMSAtIGMpKTsKKworICAvKgorICBtMS5jb2x3aXNlKCkucmV2ZXJzZSgpKHIsIGMpID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCBtMShyb3dzIC0gMSAtIHIsIGMpKTsKKworICBtMS5yb3d3aXNlKCkucmV2ZXJzZSgpKHIsIGMpID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCBtMShyLCBjb2xzIC0gMSAtIGMpKTsKKyAgKi8KK30KKwordm9pZCB0ZXN0X2FycmF5X3JldmVyc2UoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCByZXZlcnNlKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcmV2ZXJzZShNYXRyaXgyZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCByZXZlcnNlKE1hdHJpeDRmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHJldmVyc2UoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggcmV2ZXJzZShNYXRyaXhYY2YoMywgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIHJldmVyc2UoTWF0cml4WGkoNiwgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIHJldmVyc2UoTWF0cml4WGNkKDIwLCAyMCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIHJldmVyc2UoTWF0cml4PGZsb2F0LCAxMDAsIDEwMD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOSggcmV2ZXJzZShNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPig2LDMpKSApOworICB9CisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzMKKyAgVmVjdG9yNGYgeDsgeCA8PCAxLCAyLCAzLCA0OworICBWZWN0b3I0ZiB5OyB5IDw8IDQsIDMsIDIsIDE7CisgIFZFUklGWSh4LnJldmVyc2UoKVsxXSA9PSAzKTsKKyAgVkVSSUZZKHgucmV2ZXJzZSgpID09IHkpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L2JhbmRtYXRyaXguY3BwIGIvdGVzdC9iYW5kbWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTRlOGUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9iYW5kbWF0cml4LmNwcApAQCAtMCwwICsxLDc0IEBACisvLyBUaGlzIGZpbGUgaXMgdHJpYW5ndWxhclZpZXcgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgYmFuZG1hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBfbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4VHlwZTsKKworICBJbmRleCByb3dzID0gX20ucm93cygpOworICBJbmRleCBjb2xzID0gX20uY29scygpOworICBJbmRleCBzdXBlcnMgPSBfbS5zdXBlcnMoKTsKKyAgSW5kZXggc3VicyA9IF9tLnN1YnMoKTsKKworICBNYXRyaXhUeXBlIG0ocm93cyxjb2xzLHN1cGVycyxzdWJzKTsKKworICBEZW5zZU1hdHJpeFR5cGUgZG0xKHJvd3MsY29scyk7CisgIGRtMS5zZXRaZXJvKCk7CisKKyAgbS5kaWFnb25hbCgpLnNldENvbnN0YW50KDEyMyk7CisgIGRtMS5kaWFnb25hbCgpLnNldENvbnN0YW50KDEyMyk7CisgIGZvciAoaW50IGk9MTsgaTw9bS5zdXBlcnMoKTsrK2kpCisgIHsKKyAgICBtLmRpYWdvbmFsKGkpLnNldENvbnN0YW50KHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KGkpKTsKKyAgICBkbTEuZGlhZ29uYWwoaSkuc2V0Q29uc3RhbnQoc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oaSkpOworICB9CisgIGZvciAoaW50IGk9MTsgaTw9bS5zdWJzKCk7KytpKQorICB7CisgICAgbS5kaWFnb25hbCgtaSkuc2V0Q29uc3RhbnQoLXN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KGkpKTsKKyAgICBkbTEuZGlhZ29uYWwoLWkpLnNldENvbnN0YW50KC1zdGF0aWNfY2FzdDxSZWFsU2NhbGFyPihpKSk7CisgIH0KKyAgLy9zdGQ6OmNlcnIgPDwgbS5tX2RhdGEgPDwgIlxuXG4iIDw8IG0udG9EZW5zZSgpIDw8ICJcblxuIiA8PCBkbTEgPDwgIlxuXG5cblxuIjsKKyAgVkVSSUZZX0lTX0FQUFJPWChkbTEsbS50b0RlbnNlTWF0cml4KCkpOworCisgIGZvciAoaW50IGk9MDsgaTxjb2xzOyArK2kpCisgIHsKKyAgICBtLmNvbChpKS5zZXRDb25zdGFudChzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPihpKzEpKTsKKyAgICBkbTEuY29sKGkpLnNldENvbnN0YW50KHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KGkrMSkpOworICB9CisgIEluZGV4IGQgPSAoc3RkOjptaW4pKHJvd3MsY29scyk7CisgIEluZGV4IGEgPSBzdGQ6Om1heDxJbmRleD4oMCxjb2xzLWQtc3VwZXJzKTsKKyAgSW5kZXggYiA9IHN0ZDo6bWF4PEluZGV4PigwLHJvd3MtZC1zdWJzKTsKKyAgaWYoYT4wKSBkbTEuYmxvY2soMCxkK3N1cGVycyxyb3dzLGEpLnNldFplcm8oKTsKKyAgZG0xLmJsb2NrKDAsc3VwZXJzKzEsY29scy1zdXBlcnMtMS1hLGNvbHMtc3VwZXJzLTEtYSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0WmVybygpOworICBkbTEuYmxvY2soc3VicysxLDAscm93cy1zdWJzLTEtYixyb3dzLXN1YnMtMS1iKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgIGlmKGI+MCkgZG0xLmJsb2NrKGQrc3VicywwLGIsY29scykuc2V0WmVybygpOworICAvL3N0ZDo6Y2VyciA8PCBtLm1fZGF0YSA8PCAiXG5cbiIgPDwgbS50b0RlbnNlKCkgPDwgIlxuXG4iIDw8IGRtMSA8PCAiXG5cbiI7CisgIFZFUklGWV9JU19BUFBST1goZG0xLG0udG9EZW5zZU1hdHJpeCgpKTsKKworfQorCit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OkJhbmRNYXRyaXg7CisKK3ZvaWQgdGVzdF9iYW5kbWF0cml4KCkKK3sKKyAgdHlwZWRlZiBCYW5kTWF0cml4PGZsb2F0Pjo6SW5kZXggSW5kZXg7CisKKyAgZm9yKGludCBpID0gMDsgaSA8IDEwKmdfcmVwZWF0IDsgaSsrKSB7CisgICAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMTApOworICAgIEluZGV4IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDEwKTsKKyAgICBJbmRleCBzdXBzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworICAgIEluZGV4IHN1YnMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7CisgICAgQ0FMTF9TVUJURVNUKGJhbmRtYXRyaXgoQmFuZE1hdHJpeDxmbG9hdD4ocm93cyxjb2xzLHN1cHMsc3VicykpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvYmFzaWNzdHVmZi5jcHAgYi90ZXN0L2Jhc2ljc3R1ZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZGI1MzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Jhc2ljc3R1ZmYuY3BwCkBAIC0wLDAgKzEsMjE1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgYmFzaWNTdHVmZihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIC8vIHRoaXMgdGVzdCByZWxpZXMgYSBsb3Qgb24gUmFuZG9tLmgsIGFuZCB0aGVyZSdzIG5vdCBtdWNoIG1vcmUgdGhhdCB3ZSBjYW4gZG8KKyAgLy8gdG8gdGVzdCBpdCwgaGVuY2UgSSBjb25zaWRlciB0aGF0IHdlIHdpbGwgaGF2ZSB0ZXN0ZWQgUmFuZG9tLmgKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtemVybyA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyksCisgICAgICAgICAgICAgc3F1YXJlID0gTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjo6UmFuZG9tKHJvd3MsIHJvd3MpOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHZ6ZXJvID0gVmVjdG9yVHlwZTo6WmVybyhyb3dzKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBzbTEgPSBTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxyb3dzKSwgc20yKHJvd3Mscm93cyk7CisKKyAgU2NhbGFyIHggPSAwOworICB3aGlsZSh4ID09IFNjYWxhcigwKSkgeCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAorICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKworICBtMS5jb2VmZlJlZihyLGMpID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCBtMS5jb2VmZihyLGMpKTsKKyAgbTEocixjKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgbTEocixjKSk7CisgIHYxLmNvZWZmUmVmKHIpID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB2MS5jb2VmZihyKSk7CisgIHYxKHIpID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB2MShyKSk7CisgIHYxW3JdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB2MVtyXSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICB2MSwgICAgdjEpOworICBWRVJJRllfSVNfTk9UX0FQUFJPWCggICAgICAgICAgIHYxLCAgICAyKnYxKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCAgICB2emVybywgdjEpOworICBpZighTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oICB2emVybywgdjEubm9ybSgpKTsKKyAgVkVSSUZZX0lTX05PVF9NVUNIX1NNQUxMRVJfVEhBTih2MSwgICAgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKCAgICAgICAgICAgICAgIHZ6ZXJvLCB2MS12MSk7CisgIFZFUklGWV9JU19BUFBST1goICAgICAgICAgICAgICAgbTEsICAgIG0xKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1goICAgICAgICAgICBtMSwgICAgMiptMSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggICAgbXplcm8sIG0xKTsKKyAgVkVSSUZZX0lTX05PVF9NVUNIX1NNQUxMRVJfVEhBTihtMSwgICAgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKCAgICAgICAgICAgICAgIG16ZXJvLCBtMS1tMSk7CisKKyAgLy8gYWx3YXlzIHRlc3Qgb3BlcmF0b3IoKSBvbiBlYWNoIHJlYWQtb25seSBleHByZXNzaW9uIGNsYXNzLAorICAvLyBpbiBvcmRlciB0byBjaGVjayBjb25zdC1xdWFsaWZpZXJzLgorICAvLyBpbmRlZWQsIGlmIGFuIGV4cHJlc3Npb24gY2xhc3MgKGhlcmUgWmVybykgaXMgbWVhbnQgdG8gYmUgcmVhZC1vbmx5LAorICAvLyBoZW5jZSBoYXMgbm8gX3dyaXRlKCkgbWV0aG9kLCB0aGUgY29ycmVzcG9uZGluZyBNYXRyaXhCYXNlIG1ldGhvZCAoaGVyZSB6ZXJvKCkpCisgIC8vIHNob3VsZCByZXR1cm4gYSBjb25zdC1xdWFsaWZpZWQgb2JqZWN0IHNvIHRoYXQgaXQgaXMgdGhlIGNvbnN0LXF1YWxpZmllZAorICAvLyBvcGVyYXRvcigpIHRoYXQgZ2V0cyBjYWxsZWQsIHdoaWNoIGluIHR1cm4gY2FsbHMgX3JlYWQoKS4KKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKShyLGMpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpKTsKKworICAvLyBub3cgdGVzdCBjb3B5aW5nIGEgcm93LXZlY3RvciBpbnRvIGEgKGNvbHVtbi0pdmVjdG9yIGFuZCBjb252ZXJzZWx5LgorICBzcXVhcmUuY29sKHIpID0gc3F1YXJlLnJvdyhyKS5ldmFsKCk7CisgIE1hdHJpeDxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBydihyb3dzKTsKKyAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IGN2KHJvd3MpOworICBydiA9IHNxdWFyZS5yb3cocik7CisgIGN2ID0gc3F1YXJlLmNvbChyKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1gocnYsIGN2LnRyYW5zcG9zZSgpKTsKKworICBpZihjb2xzIT0xICYmIHJvd3MhPTEgJiYgTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUR5bmFtaWMpCisgIHsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMSA9IChtMi5ibG9jaygwLDAsIHJvd3MtMSwgY29scy0xKSkpOworICB9CisKKyAgaWYoY29scyE9MSAmJiByb3dzIT0xKQorICB7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTFbMF0pOworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChtMSttMSlbMF0pOworICB9CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyA9IG0xLG0xKTsKKyAgTWF0cml4VHlwZSBtNDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IG0xLG0xKTsKKworICBtMy5yZWFsKCkgPSBtMS5yZWFsKCk7CisgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4VHlwZSY+KG0zKS5yZWFsKCksIHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihtMSkucmVhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4obTMpLnJlYWwoKSwgbTEucmVhbCgpKTsKKworICAvLyBjaGVjayA9PSAvICE9IG9wZXJhdG9ycworICBWRVJJRlkobTE9PW0xKTsKKyAgVkVSSUZZKG0xIT1tMik7CisgIFZFUklGWSghKG0xPT1tMikpOworICBWRVJJRlkoIShtMSE9bTEpKTsKKyAgbTEgPSBtMjsKKyAgVkVSSUZZKG0xPT1tMik7CisgIFZFUklGWSghKG0xIT1tMikpOworICAKKyAgLy8gY2hlY2sgYXV0b21hdGljIHRyYW5zcG9zaXRpb24KKyAgc20yLnNldFplcm8oKTsKKyAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGk9MDtpPHJvd3M7KytpKQorICAgIHNtMi5jb2woaSkgPSBzbTEucm93KGkpOworICBWRVJJRllfSVNfQVBQUk9YKHNtMixzbTEudHJhbnNwb3NlKCkpOworICAKKyAgc20yLnNldFplcm8oKTsKKyAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGk9MDtpPHJvd3M7KytpKQorICAgIHNtMi5jb2woaSkubm9hbGlhcygpID0gc20xLnJvdyhpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzbTIsc20xLnRyYW5zcG9zZSgpKTsKKyAgCisgIHNtMi5zZXRaZXJvKCk7CisgIGZvcih0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBpPTA7aTxyb3dzOysraSkKKyAgICBzbTIuY29sKGkpLm5vYWxpYXMoKSArPSBzbTEucm93KGkpOworICBWRVJJRllfSVNfQVBQUk9YKHNtMixzbTEudHJhbnNwb3NlKCkpOworICAKKyAgc20yLnNldFplcm8oKTsKKyAgZm9yKHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGk9MDtpPHJvd3M7KytpKQorICAgIHNtMi5jb2woaSkubm9hbGlhcygpIC09IHNtMS5yb3coaSk7CisgIFZFUklGWV9JU19BUFBST1goc20yLC1zbTEudHJhbnNwb3NlKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGJhc2ljU3R1ZmZDb21wbGV4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IFJlYWxNYXRyaXhUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICBWRVJJRlkoaW50ZXJuYWw6OnJlYWwoczEpPT1pbnRlcm5hbDo6cmVhbF9yZWYoczEpKTsKKyAgVkVSSUZZKGludGVybmFsOjppbWFnKHMxKT09aW50ZXJuYWw6OmltYWdfcmVmKHMxKSk7CisgIGludGVybmFsOjpyZWFsX3JlZihzMSkgPSBpbnRlcm5hbDo6cmVhbChzMik7CisgIGludGVybmFsOjppbWFnX3JlZihzMSkgPSBpbnRlcm5hbDo6aW1hZyhzMik7CisgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3goczEsIHMyLCBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSkpOworICAvLyBleHRlbmRlZCBwcmVjaXNpb24gaW4gSW50ZWwgRlBVcyBtZWFucyB0aGF0IHMxID09IHMyIGluIHRoZSBsaW5lIGFib3ZlIGlzIG5vdCBndWFyYW50ZWVkLgorCisgIFJlYWxNYXRyaXhUeXBlIHJtMSA9IFJlYWxNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwKKyAgICAgICAgICAgICAgICAgcm0yID0gUmVhbE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIGNtKHJvd3MsY29scyk7CisgIGNtLnJlYWwoKSA9IHJtMTsKKyAgY20uaW1hZygpID0gcm0yOworICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihjbSkucmVhbCgpLCBybTEpOworICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihjbSkuaW1hZygpLCBybTIpOworICBybTEuc2V0WmVybygpOworICBybTIuc2V0WmVybygpOworICBybTEgPSBjbS5yZWFsKCk7CisgIHJtMiA9IGNtLmltYWcoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4oY20pLnJlYWwoKSwgcm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4oY20pLmltYWcoKSwgcm0yKTsKKyAgY20ucmVhbCgpLnNldFplcm8oKTsKKyAgVkVSSUZZKHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihjbSkucmVhbCgpLmlzWmVybygpKTsKKyAgVkVSSUZZKCFzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4oY20pLmltYWcoKS5pc1plcm8oKSk7Cit9CisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMgordm9pZCBjYXN0aW5nKCkKK3sKKyAgTWF0cml4NGYgbSA9IE1hdHJpeDRmOjpSYW5kb20oKSwgbTI7CisgIE1hdHJpeDRkIG4gPSBtLmNhc3Q8ZG91YmxlPigpOworICBWRVJJRlkobS5pc0FwcHJveChuLmNhc3Q8ZmxvYXQ+KCkpKTsKKyAgbTIgPSBtLmNhc3Q8ZmxvYXQ+KCk7IC8vIGNoZWNrIHRoZSBzcGVjaWFsaXphdGlvbiB3aGVuIE5ld1R5cGUgPT0gVHlwZQorICBWRVJJRlkobS5pc0FwcHJveChtMikpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGZpeGVkU2l6ZU1hdHJpeENvbnN0cnVjdGlvbigpCit7CisgIGNvbnN0IFNjYWxhciByYXdbM10gPSB7MSwyLDN9OworICBNYXRyaXg8U2NhbGFyLDMsMT4gbShyYXcpOworICBBcnJheTxTY2FsYXIsMywxPiBhKHJhdyk7CisgIFZFUklGWShtKDApID09IDEpOworICBWRVJJRlkobSgxKSA9PSAyKTsKKyAgVkVSSUZZKG0oMikgPT0gMyk7CisgIFZFUklGWShhKDApID09IDEpOworICBWRVJJRlkoYSgxKSA9PSAyKTsKKyAgVkVSSUZZKGEoMikgPT0gMyk7ICAKK30KKwordm9pZCB0ZXN0X2Jhc2ljc3R1ZmYoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBiYXNpY1N0dWZmKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggYmFzaWNTdHVmZihNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBiYXNpY1N0dWZmKE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF80KCBiYXNpY1N0dWZmKE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGJhc2ljU3R1ZmYoTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGJhc2ljU3R1ZmYoTWF0cml4PGZsb2F0LCAxMDAsIDEwMD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggYmFzaWNTdHVmZihNYXRyaXg8bG9uZyBkb3VibGUsRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMyggYmFzaWNTdHVmZkNvbXBsZXgoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGJhc2ljU3R1ZmZDb21wbGV4KE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisKKyAgQ0FMTF9TVUJURVNUXzEoZml4ZWRTaXplTWF0cml4Q29uc3RydWN0aW9uPHVuc2lnbmVkIGNoYXI+KCkpOworICBDQUxMX1NVQlRFU1RfMShmaXhlZFNpemVNYXRyaXhDb25zdHJ1Y3Rpb248ZG91YmxlPigpKTsKKyAgQ0FMTF9TVUJURVNUXzEoZml4ZWRTaXplTWF0cml4Q29uc3RydWN0aW9uPGRvdWJsZT4oKSk7CisKKyAgQ0FMTF9TVUJURVNUXzIoY2FzdGluZygpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYmljZ3N0YWIuY3BwIGIvdGVzdC9iaWNnc3RhYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyN2UyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYmljZ3N0YWIuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9iaWNnc3RhYl9UKCkKK3sKKyAgQmlDR1NUQUI8U3BhcnNlTWF0cml4PFQ+LCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gYmljZ3N0YWJfY29sbWFqb3JfZGlhZzsKKyAgQmlDR1NUQUI8U3BhcnNlTWF0cml4PFQ+LCBJZGVudGl0eVByZWNvbmRpdGlvbmVyICAgID4gYmljZ3N0YWJfY29sbWFqb3JfSTsKKyAgQmlDR1NUQUI8U3BhcnNlTWF0cml4PFQ+LCBJbmNvbXBsZXRlTFVUPFQ+ID4gICAgICAgICAgIGJpY2dzdGFiX2NvbG1ham9yX2lsdXQ7CisgIC8vQmlDR1NUQUI8U3BhcnNlTWF0cml4PFQ+LCBTU09SUHJlY29uZGl0aW9uZXI8VD4gPiAgICAgYmljZ3N0YWJfY29sbWFqb3Jfc3NvcjsKKworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhiaWNnc3RhYl9jb2xtYWpvcl9kaWFnKSAgKTsKKy8vICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoYmljZ3N0YWJfY29sbWFqb3JfSSkgICAgICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGJpY2dzdGFiX2NvbG1ham9yX2lsdXQpICAgICApOworICAvL0NBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGJpY2dzdGFiX2NvbG1ham9yX3Nzb3IpICAgICApOworfQorCit2b2lkIHRlc3RfYmljZ3N0YWIoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2JpY2dzdGFiX1Q8ZG91YmxlPigpKTsKKyAgQ0FMTF9TVUJURVNUXzIodGVzdF9iaWNnc3RhYl9UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Jsb2NrLmNwcCBiL3Rlc3QvYmxvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjkyNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Jsb2NrLmNwcApAQCAtMCwwICsxLDIyMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fTk9fU1RBVElDX0FTU0VSVCAvLyBvdGhlcndpc2Ugd2UgZmFpbCBhdCBjb21waWxlIHRpbWUgb24gdW51c2VkIHBhdGhzCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGJsb2NrKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IFJvd1ZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gRHluYW1pY01hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gRHluYW1pY1ZlY3RvclR5cGU7CisgIAorICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0xX2NvcHkgPSBtMSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBvbmVzID0gTWF0cml4VHlwZTo6T25lcyhyb3dzLCBjb2xzKTsKKyAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKKyAgSW5kZXggcjIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihyMSxyb3dzLTEpOworICBJbmRleCBjMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKKyAgSW5kZXggYzIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihjMSxjb2xzLTEpOworCisgIC8vY2hlY2sgcm93KCkgYW5kIGNvbCgpCisgIFZFUklGWV9JU19FUVVBTChtMS5jb2woYzEpLnRyYW5zcG9zZSgpLCBtMS50cmFuc3Bvc2UoKS5yb3coYzEpKTsKKyAgLy9jaGVjayBvcGVyYXRvcigpLCBib3RoIGNvbnN0YW50IGFuZCBub24tY29uc3RhbnQsIG9uIHJvdygpIGFuZCBjb2woKQorICBtMSA9IG0xX2NvcHk7CisgIG0xLnJvdyhyMSkgKz0gczEgKiBtMV9jb3B5LnJvdyhyMik7CisgIFZFUklGWV9JU19BUFBST1gobTEucm93KHIxKSwgbTFfY29weS5yb3cocjEpICsgczEgKiBtMV9jb3B5LnJvdyhyMikpOworICAvLyBjaGVjayBuZXN0ZWQgYmxvY2sgeHByIG9uIGxocworICBtMS5yb3cocjEpLnJvdygwKSArPSBzMSAqIG0xX2NvcHkucm93KHIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5yb3cocjEpLCBtMV9jb3B5LnJvdyhyMSkgKyBTY2FsYXIoMikgKiBzMSAqIG0xX2NvcHkucm93KHIyKSk7CisgIG0xID0gbTFfY29weTsKKyAgbTEuY29sKGMxKSArPSBzMSAqIG0xX2NvcHkuY29sKGMyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2woYzEpLCBtMV9jb3B5LmNvbChjMSkgKyBzMSAqIG0xX2NvcHkuY29sKGMyKSk7CisgIG0xLmNvbChjMSkuY29sKDApICs9IHMxICogbTFfY29weS5jb2woYzIpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChjMSksIG0xX2NvcHkuY29sKGMxKSArIFNjYWxhcigyKSAqIHMxICogbTFfY29weS5jb2woYzIpKTsKKworICAvL2NoZWNrIGJsb2NrKCkKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGIxKDEsMSk7IGIxKDAsMCkgPSBtMShyMSxjMSk7CisKKyAgUm93VmVjdG9yVHlwZSBicjEobTEuYmxvY2socjEsMCwxLGNvbHMpKTsKKyAgVmVjdG9yVHlwZSBiYzEobTEuYmxvY2soMCxjMSxyb3dzLDEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGIxLCBtMS5ibG9jayhyMSxjMSwxLDEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLnJvdyhyMSksIGJyMSk7CisgIFZFUklGWV9JU19FUVVBTChtMS5jb2woYzEpLCBiYzEpOworICAvL2NoZWNrIG9wZXJhdG9yKCksIGJvdGggY29uc3RhbnQgYW5kIG5vbi1jb25zdGFudCwgb24gYmxvY2soKQorICBtMS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpID0gczEgKiBtMi5ibG9jaygwLCAwLCByMi1yMSsxLGMyLWMxKzEpOworICBtMS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpKHIyLXIxLGMyLWMxKSA9IG0yLmJsb2NrKDAsIDAsIHIyLXIxKzEsYzItYzErMSkoMCwwKTsKKworICBlbnVtIHsKKyAgICBCbG9ja1Jvd3MgPSAyLAorICAgIEJsb2NrQ29scyA9IDUKKyAgfTsKKyAgaWYgKHJvd3M+PTUgJiYgY29scz49OCkKKyAgeworICAgIC8vIHRlc3QgZml4ZWQgYmxvY2soKSBhcyBsdmFsdWUKKyAgICBtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsQmxvY2tDb2xzPigxLDEpICo9IHMxOworICAgIC8vIHRlc3Qgb3BlcmF0b3IoKSBvbiBmaXhlZCBibG9jaygpIGJvdGggYXMgY29uc3RhbnQgYW5kIG5vbi1jb25zdGFudAorICAgIG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cyxCbG9ja0NvbHM+KDEsMSkoMCwgMykgPSBtMS50ZW1wbGF0ZSBibG9jazwyLDU+KDEsMSkoMSwyKTsKKyAgICAvLyBjaGVjayB0aGF0IGZpeGVkIGJsb2NrKCkgYW5kIGJsb2NrKCkgYWdyZWUKKyAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gYiA9IG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cyxCbG9ja0NvbHM+KDMsMyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGIsIG0xLmJsb2NrKDMsMyxCbG9ja1Jvd3MsQmxvY2tDb2xzKSk7CisgIH0KKworICBpZiAocm93cz4yKQorICB7CisgICAgLy8gdGVzdCBzdWIgdmVjdG9ycworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSBoZWFkPDI+KCksIHYxLmJsb2NrKDAsMCwyLDEpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodjEudGVtcGxhdGUgaGVhZDwyPigpLCB2MS5oZWFkKDIpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodjEudGVtcGxhdGUgaGVhZDwyPigpLCB2MS5zZWdtZW50KDAsMikpOworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSBoZWFkPDI+KCksIHYxLnRlbXBsYXRlIHNlZ21lbnQ8Mj4oMCkpOworICAgIEluZGV4IGkgPSByb3dzLTI7CisgICAgVkVSSUZZX0lTX0VRVUFMKHYxLnRlbXBsYXRlIHRhaWw8Mj4oKSwgdjEuYmxvY2soaSwwLDIsMSkpOworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSB0YWlsPDI+KCksIHYxLnRhaWwoMikpOworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSB0YWlsPDI+KCksIHYxLnNlZ21lbnQoaSwyKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHYxLnRlbXBsYXRlIHRhaWw8Mj4oKSwgdjEudGVtcGxhdGUgc2VnbWVudDwyPihpKSk7CisgICAgaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0yKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodjEuc2VnbWVudChpLDIpLCB2MS50ZW1wbGF0ZSBzZWdtZW50PDI+KGkpKTsKKyAgfQorCisgIC8vIHN0cmVzcyBzb21lIGJhc2ljIHN0dWZmcyB3aXRoIGJsb2NrIG1hdHJpY2VzCisgIFZFUklGWShpbnRlcm5hbDo6cmVhbChvbmVzLmNvbChjMSkuc3VtKCkpID09IFJlYWxTY2FsYXIocm93cykpOworICBWRVJJRlkoaW50ZXJuYWw6OnJlYWwob25lcy5yb3cocjEpLnN1bSgpKSA9PSBSZWFsU2NhbGFyKGNvbHMpKTsKKworICBWRVJJRlkoaW50ZXJuYWw6OnJlYWwob25lcy5jb2woYzEpLmRvdChvbmVzLmNvbChjMikpKSA9PSBSZWFsU2NhbGFyKHJvd3MpKTsKKyAgVkVSSUZZKGludGVybmFsOjpyZWFsKG9uZXMucm93KHIxKS5kb3Qob25lcy5yb3cocjIpKSkgPT0gUmVhbFNjYWxhcihjb2xzKSk7CisKKyAgLy8gbm93IHRlc3Qgc29tZSBibG9jay1pbnNpZGUtb2YtYmxvY2suCisgIAorICAvLyBleHByZXNzaW9ucyB3aXRoIGRpcmVjdCBhY2Nlc3MKKyAgVkVSSUZZX0lTX0VRVUFMKCAobTEuYmxvY2socjEsYzEscm93cy1yMSxjb2xzLWMxKS5ibG9jayhyMi1yMSxjMi1jMSxyb3dzLXIyLGNvbHMtYzIpKSAsIChtMS5ibG9jayhyMixjMixyb3dzLXIyLGNvbHMtYzIpKSApOworICBWRVJJRllfSVNfRVFVQUwoIChtMS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLnJvdygwKSkgLCAobTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpKSApOworICBWRVJJRllfSVNfRVFVQUwoIChtMS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLmNvbCgwKSkgLCAobTEuY29sKGMxKS5zZWdtZW50KHIxLHIyLXIxKzEpKSApOworICBWRVJJRllfSVNfRVFVQUwoIChtMS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLnRyYW5zcG9zZSgpLmNvbCgwKSkgLCAobTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpKS50cmFuc3Bvc2UoKSApOworICBWRVJJRllfSVNfRVFVQUwoIChtMS50cmFuc3Bvc2UoKS5ibG9jayhjMSxyMSxjMi1jMSsxLHIyLXIxKzEpLmNvbCgwKSkgLCAobTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpKS50cmFuc3Bvc2UoKSApOworCisgIC8vIGV4cHJlc3Npb25zIHdpdGhvdXQgZGlyZWN0IGFjY2VzcworICBWRVJJRllfSVNfRVFVQUwoICgobTErbTIpLmJsb2NrKHIxLGMxLHJvd3MtcjEsY29scy1jMSkuYmxvY2socjItcjEsYzItYzEscm93cy1yMixjb2xzLWMyKSkgLCAoKG0xK20yKS5ibG9jayhyMixjMixyb3dzLXIyLGNvbHMtYzIpKSApOworICBWRVJJRllfSVNfRVFVQUwoICgobTErbTIpLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkucm93KDApKSAsICgobTErbTIpLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkgKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCAoKG0xK20yKS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLmNvbCgwKSkgLCAoKG0xK20yKS5jb2woYzEpLnNlZ21lbnQocjEscjItcjErMSkpICk7CisgIFZFUklGWV9JU19FUVVBTCggKChtMSttMikuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS50cmFuc3Bvc2UoKS5jb2woMCkpICwgKChtMSttMikucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpKS50cmFuc3Bvc2UoKSApOworICBWRVJJRllfSVNfRVFVQUwoICgobTErbTIpLnRyYW5zcG9zZSgpLmJsb2NrKGMxLHIxLGMyLWMxKzEscjItcjErMSkuY29sKDApKSAsICgobTErbTIpLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkudHJhbnNwb3NlKCkgKTsKKworICAvLyBldmFsdWF0aW9uIGludG8gcGxhaW4gbWF0cmljZXMgZnJvbSBleHByZXNzaW9ucyB3aXRoIGRpcmVjdCBhY2Nlc3MgKHN0cmVzcyBNYXBCYXNlKQorICBEeW5hbWljTWF0cml4VHlwZSBkbTsKKyAgRHluYW1pY1ZlY3RvclR5cGUgZHY7CisgIGRtLnNldFplcm8oKTsKKyAgZG0gPSBtMS5ibG9jayhyMSxjMSxyb3dzLXIxLGNvbHMtYzEpLmJsb2NrKHIyLXIxLGMyLWMxLHJvd3MtcjIsY29scy1jMik7CisgIFZFUklGWV9JU19FUVVBTChkbSwgKG0xLmJsb2NrKHIyLGMyLHJvd3MtcjIsY29scy1jMikpKTsKKyAgZG0uc2V0WmVybygpOworICBkdi5zZXRaZXJvKCk7CisgIGRtID0gbTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5yb3coMCkudHJhbnNwb3NlKCk7CisgIGR2ID0gbTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpOworICBWRVJJRllfSVNfRVFVQUwoZHYsIGRtKTsKKyAgZG0uc2V0WmVybygpOworICBkdi5zZXRaZXJvKCk7CisgIGRtID0gbTEuY29sKGMxKS5zZWdtZW50KHIxLHIyLXIxKzEpOworICBkdiA9IG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkuY29sKDApOworICBWRVJJRllfSVNfRVFVQUwoZHYsIGRtKTsKKyAgZG0uc2V0WmVybygpOworICBkdi5zZXRaZXJvKCk7CisgIGRtID0gbTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS50cmFuc3Bvc2UoKS5jb2woMCk7CisgIGR2ID0gbTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpOworICBWRVJJRllfSVNfRVFVQUwoZHYsIGRtKTsKKyAgZG0uc2V0WmVybygpOworICBkdi5zZXRaZXJvKCk7CisgIGRtID0gbTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpLnRyYW5zcG9zZSgpOworICBkdiA9IG0xLnRyYW5zcG9zZSgpLmJsb2NrKGMxLHIxLGMyLWMxKzEscjItcjErMSkuY29sKDApOworICBWRVJJRllfSVNfRVFVQUwoZHYsIGRtKTsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjb21wYXJlX3VzaW5nX2RhdGFfYW5kX3N0cmlkZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKyAgSW5kZXggc2l6ZSA9IG0uc2l6ZSgpOworICBJbmRleCBpbm5lclN0cmlkZSA9IG0uaW5uZXJTdHJpZGUoKTsKKyAgSW5kZXggb3V0ZXJTdHJpZGUgPSBtLm91dGVyU3RyaWRlKCk7CisgIEluZGV4IHJvd1N0cmlkZSA9IG0ucm93U3RyaWRlKCk7CisgIEluZGV4IGNvbFN0cmlkZSA9IG0uY29sU3RyaWRlKCk7CisgIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciogZGF0YSA9IG0uZGF0YSgpOworCisgIGZvcihpbnQgaj0wO2o8Y29sczsrK2opCisgICAgZm9yKGludCBpPTA7aTxyb3dzOysraSkKKyAgICAgIFZFUklGWShtLmNvZWZmKGksaikgPT0gZGF0YVtpKnJvd1N0cmlkZSArIGoqY29sU3RyaWRlXSk7CisKKyAgaWYoIU1hdHJpeFR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSkKKyAgeworICAgIGZvcihpbnQgaj0wO2o8Y29sczsrK2opCisgICAgICBmb3IoaW50IGk9MDtpPHJvd3M7KytpKQorICAgICAgICBWRVJJRlkobS5jb2VmZihpLGopID09IGRhdGFbKE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaSpvdXRlclN0cmlkZSArIGoqaW5uZXJTdHJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGoqb3V0ZXJTdHJpZGUgKyBpKmlubmVyU3RyaWRlXSk7CisgIH0KKworICBpZihNYXRyaXhUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUpCisgIHsKKyAgICBWRVJJRlkoaW5uZXJTdHJpZGUgPT0gaW50KCgmbS5jb2VmZigxKSktKCZtLmNvZWZmKDApKSkpOworICAgIGZvciAoaW50IGk9MDtpPHNpemU7KytpKQorICAgICAgVkVSSUZZKG0uY29lZmYoaSkgPT0gZGF0YVtpKmlubmVyU3RyaWRlXSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgZGF0YV9hbmRfc3RyaWRlKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIEluZGV4IHIxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOworICBJbmRleCByMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KHIxLHJvd3MtMSk7CisgIEluZGV4IGMxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworICBJbmRleCBjMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KGMxLGNvbHMtMSk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgY29tcGFyZV91c2luZ19kYXRhX2FuZF9zdHJpZGUobTEuYmxvY2socjEsIGMxLCByMi1yMSsxLCBjMi1jMSsxKSk7CisgIGNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKG0xLnRyYW5zcG9zZSgpLmJsb2NrKGMxLCByMSwgYzItYzErMSwgcjItcjErMSkpOworICBjb21wYXJlX3VzaW5nX2RhdGFfYW5kX3N0cmlkZShtMS5yb3cocjEpKTsKKyAgY29tcGFyZV91c2luZ19kYXRhX2FuZF9zdHJpZGUobTEuY29sKGMxKSk7CisgIGNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKG0xLnJvdyhyMSkudHJhbnNwb3NlKCkpOworICBjb21wYXJlX3VzaW5nX2RhdGFfYW5kX3N0cmlkZShtMS5jb2woYzEpLnRyYW5zcG9zZSgpKTsKK30KKwordm9pZCB0ZXN0X2Jsb2NrKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggYmxvY2soTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBibG9jayhNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBibG9jayhNYXRyaXhYY2YoMywgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGJsb2NrKE1hdHJpeFhpKDgsIDEyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggYmxvY2soTWF0cml4WGNkKDIwLCAyMCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGJsb2NrKE1hdHJpeFhmKDIwLCAyMCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfOCggYmxvY2soTWF0cml4PGZsb2F0LER5bmFtaWMsND4oMywgNCkpICk7CisKKyNpZm5kZWYgRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IKKyAgICBDQUxMX1NVQlRFU1RfNiggZGF0YV9hbmRfc3RyaWRlKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb20oNSw1MCksIGludGVybmFsOjpyYW5kb20oNSw1MCkpKSApOworICAgIENBTExfU1VCVEVTVF83KCBkYXRhX2FuZF9zdHJpZGUoTWF0cml4PGludCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KGludGVybmFsOjpyYW5kb20oNSw1MCksIGludGVybmFsOjpyYW5kb20oNSw1MCkpKSApOworI2VuZGlmCisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY2hvbGVza3kuY3BwIGIvdGVzdC9jaG9sZXNreS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlMDFjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2hvbGVza3kuY3BwCkBAIC0wLDAgKzEsMzEwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HCisjZGVmaW5lIEVJR0VOX05PX0FTU0VSVElPTl9DSEVDS0lORworI2VuZGlmCisKK3N0YXRpYyBpbnQgbmJfdGVtcG9yYXJpZXM7CisKKyNkZWZpbmUgRUlHRU5fREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTiB7IGlmKHNpemUhPTApIG5iX3RlbXBvcmFyaWVzKys7IH0KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9DaG9sZXNreT4KKyNpbmNsdWRlIDxFaWdlbi9RUj4KKworI2RlZmluZSBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChYUFIsTikge1wKKyAgICBuYl90ZW1wb3JhcmllcyA9IDA7IFwKKyAgICBYUFI7IFwKKyAgICBpZihuYl90ZW1wb3JhcmllcyE9Tikgc3RkOjpjZXJyIDw8ICJuYl90ZW1wb3JhcmllcyA9PSAiIDw8IG5iX3RlbXBvcmFyaWVzIDw8ICJcbiI7IFwKKyAgICBWRVJJRlkoICgjWFBSKSAmJiBuYl90ZW1wb3Jhcmllcz09TiApOyBcCisgIH0KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSx0ZW1wbGF0ZSA8dHlwZW5hbWUsaW50PiBjbGFzcyBDaG9sVHlwZT4gdm9pZCB0ZXN0X2Nob2xfdXBkYXRlKGNvbnN0IE1hdHJpeFR5cGUmIHN5bW0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgTWF0cml4VHlwZSBzeW1tTG8gPSBzeW1tLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBNYXRyaXhUeXBlIHN5bW1VcCA9IHN5bW0udGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIE1hdHJpeFR5cGUgc3ltbUNweSA9IHN5bW07CisKKyAgQ2hvbFR5cGU8TWF0cml4VHlwZSxMb3dlcj4gY2hvbGxvKHN5bW1Mbyk7CisgIENob2xUeXBlPE1hdHJpeFR5cGUsVXBwZXI+IGNob2x1cChzeW1tVXApOworCisgIGZvciAoaW50IGs9MDsgazwxMDsgKytrKQorICB7CisgICAgVmVjdG9yVHlwZSB2ZWMgPSBWZWN0b3JUeXBlOjpSYW5kb20oc3ltbS5yb3dzKCkpOworICAgIFJlYWxTY2FsYXIgc2lnbWEgPSBpbnRlcm5hbDo6cmFuZG9tPFJlYWxTY2FsYXI+KCk7CisgICAgc3ltbUNweSArPSBzaWdtYSAqIHZlYyAqIHZlYy5hZGpvaW50KCk7CisKKyAgICAvLyB3ZSBhcmUgZG9pbmcgc29tZSBkb3duZGF0ZXMsIHNvIGl0IG1pZ2h0IGJlIHRoZSBjYXNlIHRoYXQgdGhlIG1hdHJpeCBpcyBub3QgU1BEIGFueW1vcmUKKyAgICBDaG9sVHlwZTxNYXRyaXhUeXBlLExvd2VyPiBjaG9sKHN5bW1DcHkpOworICAgIGlmKGNob2wuaW5mbygpIT1TdWNjZXNzKQorICAgICAgYnJlYWs7CisKKyAgICBjaG9sbG8ucmFua1VwZGF0ZSh2ZWMsIHNpZ21hKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW1DcHksIGNob2xsby5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworCisgICAgY2hvbHVwLnJhbmtVcGRhdGUodmVjLCBzaWdtYSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tQ3B5LCBjaG9sdXAucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNob2xlc2t5KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgTExULmggTERMVC5oCisgICovCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gU3F1YXJlTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBNYXRyaXhUeXBlIGEwID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIFZlY3RvclR5cGUgdmVjQiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwgdmVjWChyb3dzKTsKKyAgTWF0cml4VHlwZSBtYXRCID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIG1hdFgocm93cyxjb2xzKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBzeW1tID0gIGEwICogYTAuYWRqb2ludCgpOworICAvLyBsZXQncyBtYWtlIHN1cmUgdGhlIG1hdHJpeCBpcyBub3Qgc2luZ3VsYXIgb3IgbmVhciBzaW5ndWxhcgorICBmb3IgKGludCBrPTA7IGs8MzsgKytrKQorICB7CisgICAgTWF0cml4VHlwZSBhMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICAgIHN5bW0gKz0gYTEgKiBhMS5hZGpvaW50KCk7CisgIH0KKworICBTcXVhcmVNYXRyaXhUeXBlIHN5bW1VcCA9IHN5bW0udGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFNxdWFyZU1hdHJpeFR5cGUgc3ltbUxvID0gc3ltbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKworICAvLyB0byB0ZXN0IGlmIHJlYWxseSBDaG9sZXNreSBvbmx5IHVzZXMgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgcGFydCwgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcKKyAgLy8gRklYTUU6IGN1cnJlbnRseSB0aGF0IGZhaWxzICEhCisgIC8vc3ltbS50ZW1wbGF0ZSBwYXJ0PFN0cmljdGx5TG93ZXI+KCkuc2V0WmVybygpOworCisgIHsKKyAgICBMTFQ8U3F1YXJlTWF0cml4VHlwZSxMb3dlcj4gY2hvbGxvKHN5bW1Mbyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tLCBjaG9sbG8ucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICB2ZWNYID0gY2hvbGxvLnNvbHZlKHZlY0IpOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbSAqIHZlY1gsIHZlY0IpOworICAgIG1hdFggPSBjaG9sbG8uc29sdmUobWF0Qik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogbWF0WCwgbWF0Qik7CisKKyAgICAvLyB0ZXN0IHRoZSB1cHBlciBtb2RlCisgICAgTExUPFNxdWFyZU1hdHJpeFR5cGUsVXBwZXI+IGNob2x1cChzeW1tVXApOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbSwgY2hvbHVwLnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgICAgdmVjWCA9IGNob2x1cC5zb2x2ZSh2ZWNCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiB2ZWNYLCB2ZWNCKTsKKyAgICBtYXRYID0gY2hvbHVwLnNvbHZlKG1hdEIpOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbSAqIG1hdFgsIG1hdEIpOworCisgICAgTWF0cml4VHlwZSBuZWcgPSAtc3ltbUxvOworICAgIGNob2xsby5jb21wdXRlKG5lZyk7CisgICAgVkVSSUZZKGNob2xsby5pbmZvKCk9PU51bWVyaWNhbElzc3VlKTsKKworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShjaG9sbG8ubWF0cml4TCgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShjaG9sbG8ubWF0cml4VSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKGNob2xsby5tYXRyaXhVKCkudHJhbnNwb3NlKCkuY29uanVnYXRlKCkpLCBNYXRyaXhUeXBlKGNob2xsby5tYXRyaXhMKCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUoY2hvbHVwLm1hdHJpeEwoKS50cmFuc3Bvc2UoKS5jb25qdWdhdGUoKSksIE1hdHJpeFR5cGUoY2hvbHVwLm1hdHJpeFUoKSkpOworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShjaG9sdXAubWF0cml4VSgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShjaG9sdXAubWF0cml4TCgpKSk7CisgIH0KKworICAvLyBMRExUCisgIHsKKyAgICBpbnQgc2lnbiA9IGludGVybmFsOjpyYW5kb208aW50PigpJTIgPyAxIDogLTE7CisKKyAgICBpZihzaWduID09IC0xKQorICAgIHsKKyAgICAgIHN5bW0gPSAtc3ltbTsgLy8gdGVzdCBhIG5lZ2F0aXZlIG1hdHJpeAorICAgIH0KKworICAgIFNxdWFyZU1hdHJpeFR5cGUgc3ltbVVwID0gc3ltbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgICBTcXVhcmVNYXRyaXhUeXBlIHN5bW1MbyA9IHN5bW0udGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisKKyAgICBMRExUPFNxdWFyZU1hdHJpeFR5cGUsTG93ZXI+IGxkbHRsbyhzeW1tTG8pOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbSwgbGRsdGxvLnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgICAgdmVjWCA9IGxkbHRsby5zb2x2ZSh2ZWNCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiB2ZWNYLCB2ZWNCKTsKKyAgICBtYXRYID0gbGRsdGxvLnNvbHZlKG1hdEIpOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbSAqIG1hdFgsIG1hdEIpOworCisgICAgTERMVDxTcXVhcmVNYXRyaXhUeXBlLFVwcGVyPiBsZGx0dXAoc3ltbVVwKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0sIGxkbHR1cC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIHZlY1ggPSBsZGx0dXAuc29sdmUodmVjQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogdmVjWCwgdmVjQik7CisgICAgbWF0WCA9IGxkbHR1cC5zb2x2ZShtYXRCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiBtYXRYLCBtYXRCKTsKKworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShsZGx0bG8ubWF0cml4TCgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShsZGx0bG8ubWF0cml4VSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKGxkbHRsby5tYXRyaXhVKCkudHJhbnNwb3NlKCkuY29uanVnYXRlKCkpLCBNYXRyaXhUeXBlKGxkbHRsby5tYXRyaXhMKCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUobGRsdHVwLm1hdHJpeEwoKS50cmFuc3Bvc2UoKS5jb25qdWdhdGUoKSksIE1hdHJpeFR5cGUobGRsdHVwLm1hdHJpeFUoKSkpOworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShsZGx0dXAubWF0cml4VSgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShsZGx0dXAubWF0cml4TCgpKSk7CisKKyAgICBpZihNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgICB7CisgICAgICAvLyBub3RlIDogZWFjaCBpbnBsYWNlIHBlcm11dGF0aW9uIHJlcXVpcmVzIGEgc21hbGwgdGVtcG9yYXJ5IHZlY3RvciAobWFzaykKKworICAgICAgLy8gY2hlY2sgaW5wbGFjZSBzb2x2ZQorICAgICAgbWF0WCA9IG1hdEI7CisgICAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtYXRYID0gbGRsdGxvLnNvbHZlKG1hdFgpLCAwKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobWF0WCwgbGRsdGxvLnNvbHZlKG1hdEIpLmV2YWwoKSk7CisKKworICAgICAgbWF0WCA9IG1hdEI7CisgICAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtYXRYID0gbGRsdHVwLnNvbHZlKG1hdFgpLCAwKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobWF0WCwgbGRsdHVwLnNvbHZlKG1hdEIpLmV2YWwoKSk7CisgICAgfQorCisgICAgLy8gcmVzdG9yZQorICAgIGlmKHNpZ24gPT0gLTEpCisgICAgICBzeW1tID0gLXN5bW07CisgIH0KKworICAvLyB0ZXN0IHNvbWUgc3BlY2lhbCB1c2UgY2FzZXMgb2YgU2VsZkN3aXNlQmluYXJ5T3A6CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwgbTIocm93cyxjb2xzKTsKKyAgbTIgPSBtMTsKKyAgbTIgKz0gc3ltbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5sbHQoKS5zb2x2ZShtYXRCKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEgKyBzeW1tTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmxsdCgpLnNvbHZlKG1hdEIpKTsKKyAgbTIgPSBtMTsKKyAgbTIgLT0gc3ltbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5sbHQoKS5zb2x2ZShtYXRCKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEgLSBzeW1tTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmxsdCgpLnNvbHZlKG1hdEIpKTsKKyAgbTIgPSBtMTsKKyAgbTIubm9hbGlhcygpICs9IHN5bW1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkubGx0KCkuc29sdmUobWF0Qik7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xICsgc3ltbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5sbHQoKS5zb2x2ZShtYXRCKSk7CisgIG0yID0gbTE7CisgIG0yLm5vYWxpYXMoKSAtPSBzeW1tTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmxsdCgpLnNvbHZlKG1hdEIpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMSAtIHN5bW1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkubGx0KCkuc29sdmUobWF0QikpOworCisgIC8vIHVwZGF0ZS9kb3duZGF0ZQorICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2Nob2xfdXBkYXRlPFNxdWFyZU1hdHJpeFR5cGUsTExUPihzeW1tKSAgKSk7CisgIENBTExfU1VCVEVTVCgoIHRlc3RfY2hvbF91cGRhdGU8U3F1YXJlTWF0cml4VHlwZSxMRExUPihzeW1tKSApKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjaG9sZXNreV9jcGx4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8vIGNsYXNzaWMgdGVzdAorICBjaG9sZXNreShtKTsKKworICAvLyB0ZXN0IG1peGluZyByZWFsL3NjYWxhciB0eXBlcworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gUmVhbE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgUmVhbE1hdHJpeFR5cGUgYTAgPSBSZWFsTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIFZlY3RvclR5cGUgdmVjQiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwgdmVjWChyb3dzKTsKKyAgTWF0cml4VHlwZSBtYXRCID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIG1hdFgocm93cyxjb2xzKTsKKyAgUmVhbE1hdHJpeFR5cGUgc3ltbSA9ICBhMCAqIGEwLmFkam9pbnQoKTsKKyAgLy8gbGV0J3MgbWFrZSBzdXJlIHRoZSBtYXRyaXggaXMgbm90IHNpbmd1bGFyIG9yIG5lYXIgc2luZ3VsYXIKKyAgZm9yIChpbnQgaz0wOyBrPDM7ICsraykKKyAgeworICAgIFJlYWxNYXRyaXhUeXBlIGExID0gUmVhbE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICAgIHN5bW0gKz0gYTEgKiBhMS5hZGpvaW50KCk7CisgIH0KKworICB7CisgICAgUmVhbE1hdHJpeFR5cGUgc3ltbUxvID0gc3ltbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKworICAgIExMVDxSZWFsTWF0cml4VHlwZSxMb3dlcj4gY2hvbGxvKHN5bW1Mbyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tLCBjaG9sbG8ucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICB2ZWNYID0gY2hvbGxvLnNvbHZlKHZlY0IpOworICAgIFZFUklGWV9JU19BUFBST1goc3ltbSAqIHZlY1gsIHZlY0IpOworLy8gICAgIG1hdFggPSBjaG9sbG8uc29sdmUobWF0Qik7CisvLyAgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogbWF0WCwgbWF0Qik7CisgIH0KKworICAvLyBMRExUCisgIHsKKyAgICBpbnQgc2lnbiA9IGludGVybmFsOjpyYW5kb208aW50PigpJTIgPyAxIDogLTE7CisKKyAgICBpZihzaWduID09IC0xKQorICAgIHsKKyAgICAgIHN5bW0gPSAtc3ltbTsgLy8gdGVzdCBhIG5lZ2F0aXZlIG1hdHJpeAorICAgIH0KKworICAgIFJlYWxNYXRyaXhUeXBlIHN5bW1MbyA9IHN5bW0udGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisKKyAgICBMRExUPFJlYWxNYXRyaXhUeXBlLExvd2VyPiBsZGx0bG8oc3ltbUxvKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0sIGxkbHRsby5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIHZlY1ggPSBsZGx0bG8uc29sdmUodmVjQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogdmVjWCwgdmVjQik7CisvLyAgICAgbWF0WCA9IGxkbHRsby5zb2x2ZShtYXRCKTsKKy8vICAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiBtYXRYLCBtYXRCKTsKKyAgfQorfQorCisvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyNDEKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgY2hvbGVza3lfYnVnMjQxKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIGVpZ2VuX2Fzc2VydChtLnJvd3MoKSA9PSAyICYmIG0uY29scygpID09IDIpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBNYXRyaXhUeXBlIG1hdEE7CisgIG1hdEEgPDwgMSwgMSwgMSwgMTsKKyAgVmVjdG9yVHlwZSB2ZWNCOworICB2ZWNCIDw8IDEsIDE7CisgIFZlY3RvclR5cGUgdmVjWCA9IG1hdEEubGRsdCgpLnNvbHZlKHZlY0IpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdEEgKiB2ZWNYLCB2ZWNCKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjaG9sZXNreV92ZXJpZnlfYXNzZXJ0KCkKK3sKKyAgTWF0cml4VHlwZSB0bXA7CisKKyAgTExUPE1hdHJpeFR5cGU+IGxsdDsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobGx0Lm1hdHJpeEwoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobGx0Lm1hdHJpeFUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobGx0LnNvbHZlKHRtcCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGxsdC5zb2x2ZUluUGxhY2UoJnRtcCkpCisKKyAgTERMVDxNYXRyaXhUeXBlPiBsZGx0OworICBWRVJJRllfUkFJU0VTX0FTU0VSVChsZGx0Lm1hdHJpeEwoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobGRsdC5wZXJtdXRhdGlvblAoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobGRsdC52ZWN0b3JEKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGxkbHQuaXNQb3NpdGl2ZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsZGx0LmlzTmVnYXRpdmUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobGRsdC5zb2x2ZSh0bXApKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsZGx0LnNvbHZlSW5QbGFjZSgmdG1wKSkKK30KKwordm9pZCB0ZXN0X2Nob2xlc2t5KCkKK3sKKyAgaW50IHM7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGNob2xlc2t5KE1hdHJpeDxkb3VibGUsMSwxPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBjaG9sZXNreShNYXRyaXgyZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBjaG9sZXNreV9idWcyNDEoTWF0cml4MmQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggY2hvbGVza3koTWF0cml4M2YoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggY2hvbGVza3koTWF0cml4NGQoKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGNob2xlc2t5KE1hdHJpeFhkKHMscykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7CisgICAgQ0FMTF9TVUJURVNUXzYoIGNob2xlc2t5X2NwbHgoTWF0cml4WGNkKHMscykpICk7CisgIH0KKworICBDQUxMX1NVQlRFU1RfNCggY2hvbGVza3lfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZj4oKSApOworICBDQUxMX1NVQlRFU1RfNyggY2hvbGVza3lfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZD4oKSApOworICBDQUxMX1NVQlRFU1RfOCggY2hvbGVza3lfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZj4oKSApOworICBDQUxMX1NVQlRFU1RfMiggY2hvbGVza3lfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZD4oKSApOworCisgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICBDQUxMX1NVQlRFU1RfOSggTExUPE1hdHJpeFhmPigxMCkgKTsKKyAgQ0FMTF9TVUJURVNUXzkoIExETFQ8TWF0cml4WGY+KDEwKSApOworICAKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHMpCit9CmRpZmYgLS1naXQgYS90ZXN0L2Nob2xtb2Rfc3VwcG9ydC5jcHAgYi90ZXN0L2Nob2xtb2Rfc3VwcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4YmUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2hvbG1vZF9zdXBwb3J0LmNwcApAQCAtMCwwICsxLDU2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgInNwYXJzZV9zb2x2ZXIuaCIKKworI2luY2x1ZGUgPEVpZ2VuL0Nob2xtb2RTdXBwb3J0PgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfY2hvbG1vZF9UKCkKK3sKKyAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BhcnNlTWF0cml4PFQ+LCBMb3dlcj4gZ19jaG9sX2NvbG1ham9yX2xvd2VyOyBnX2Nob2xfY29sbWFqb3JfbG93ZXIuc2V0TW9kZShDaG9sbW9kU3VwZXJub2RhbExMdCk7CisgIENob2xtb2REZWNvbXBvc2l0aW9uPFNwYXJzZU1hdHJpeDxUPiwgVXBwZXI+IGdfY2hvbF9jb2xtYWpvcl91cHBlcjsgZ19jaG9sX2NvbG1ham9yX3VwcGVyLnNldE1vZGUoQ2hvbG1vZFN1cGVybm9kYWxMTHQpOworICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBnX2xsdF9jb2xtYWpvcl9sb3dlcjsgIGdfbGx0X2NvbG1ham9yX2xvd2VyLnNldE1vZGUoQ2hvbG1vZFNpbXBsaWNpYWxMTHQpOworICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VNYXRyaXg8VD4sIFVwcGVyPiBnX2xsdF9jb2xtYWpvcl91cHBlcjsgIGdfbGx0X2NvbG1ham9yX3VwcGVyLnNldE1vZGUoQ2hvbG1vZFNpbXBsaWNpYWxMTHQpOworICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBnX2xkbHRfY29sbWFqb3JfbG93ZXI7IGdfbGRsdF9jb2xtYWpvcl9sb3dlci5zZXRNb2RlKENob2xtb2RMREx0KTsKKyAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BhcnNlTWF0cml4PFQ+LCBVcHBlcj4gZ19sZGx0X2NvbG1ham9yX3VwcGVyOyBnX2xkbHRfY29sbWFqb3JfdXBwZXIuc2V0TW9kZShDaG9sbW9kTERMdCk7CisgIAorICBDaG9sbW9kU3VwZXJub2RhbExMVDxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBjaG9sX2NvbG1ham9yX2xvd2VyOworICBDaG9sbW9kU3VwZXJub2RhbExMVDxTcGFyc2VNYXRyaXg8VD4sIFVwcGVyPiBjaG9sX2NvbG1ham9yX3VwcGVyOworICBDaG9sbW9kU2ltcGxpY2lhbExMVDxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBsbHRfY29sbWFqb3JfbG93ZXI7CisgIENob2xtb2RTaW1wbGljaWFsTExUPFNwYXJzZU1hdHJpeDxUPiwgVXBwZXI+IGxsdF9jb2xtYWpvcl91cHBlcjsKKyAgQ2hvbG1vZFNpbXBsaWNpYWxMRExUPFNwYXJzZU1hdHJpeDxUPiwgTG93ZXI+IGxkbHRfY29sbWFqb3JfbG93ZXI7CisgIENob2xtb2RTaW1wbGljaWFsTERMVDxTcGFyc2VNYXRyaXg8VD4sIFVwcGVyPiBsZGx0X2NvbG1ham9yX3VwcGVyOworCisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhnX2Nob2xfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoZ19jaG9sX2NvbG1ham9yX3VwcGVyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGdfbGx0X2NvbG1ham9yX2xvd2VyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGdfbGx0X2NvbG1ham9yX3VwcGVyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGdfbGRsdF9jb2xtYWpvcl9sb3dlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhnX2xkbHRfY29sbWFqb3JfdXBwZXIpOworICAKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNob2xfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2hvbF9jb2xtYWpvcl91cHBlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhsbHRfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGx0X2NvbG1ham9yX3VwcGVyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGxkbHRfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl91cHBlcik7CisgIAorLy8gIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQoY2hvbF9jb2xtYWpvcl9sb3dlcik7CisvLyAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChjaG9sX2NvbG1ham9yX3VwcGVyKTsKKy8vICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGxsdF9jb2xtYWpvcl9sb3dlcik7CisvLyAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChsbHRfY29sbWFqb3JfdXBwZXIpOworLy8gIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQobGRsdF9jb2xtYWpvcl9sb3dlcik7CisvLyAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChsZGx0X2NvbG1ham9yX3VwcGVyKTsKK30KKwordm9pZCB0ZXN0X2Nob2xtb2Rfc3VwcG9ydCgpCit7CisgIENBTExfU1VCVEVTVF8xKHRlc3RfY2hvbG1vZF9UPGRvdWJsZT4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfY2hvbG1vZF9UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NvbW1haW5pdGlhbGl6ZXIuY3BwIGIvdGVzdC9jb21tYWluaXRpYWxpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTEwMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb21tYWluaXRpYWxpemVyLmNwcApAQCAtMCwwICsxLDQ2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3ZvaWQgdGVzdF9jb21tYWluaXRpYWxpemVyKCkKK3sKKyAgTWF0cml4M2QgbTM7CisgIE1hdHJpeDRkIG00OworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCAobTMgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCkgKTsKKyAgCisgICNpZm5kZWYgX01TQ19WRVIKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIChtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkgKTsKKyAgI2VuZGlmCisKKyAgZG91YmxlIGRhdGFbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5fTsKKyAgTWF0cml4M2QgcmVmID0gTWFwPE1hdHJpeDxkb3VibGUsMywzLFJvd01ham9yPiA+KGRhdGEpOworCisgIG0zID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5OworICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWYgKTsKKworICBWZWN0b3IzZCB2ZWNbM107CisgIHZlY1swXSA8PCAxLCA0LCA3OworICB2ZWNbMV0gPDwgMiwgNSwgODsKKyAgdmVjWzJdIDw8IDMsIDYsIDk7CisgIG0zID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtMyA8PCB2ZWNbMF0sIHZlY1sxXSwgdmVjWzJdOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWYpOworCisgIHZlY1swXSA8PCAxLCAyLCAzOworICB2ZWNbMV0gPDwgNCwgNSwgNjsKKyAgdmVjWzJdIDw8IDcsIDgsIDk7CisgIG0zID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtMyA8PCB2ZWNbMF0udHJhbnNwb3NlKCksCisgICAgICAgIDQsIDUsIDYsCisgICAgICAgIHZlY1syXS50cmFuc3Bvc2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY29uanVnYXRlX2dyYWRpZW50LmNwcCBiL3Rlc3QvY29uanVnYXRlX2dyYWRpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjkwNTFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb25qdWdhdGVfZ3JhZGllbnQuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9jb25qdWdhdGVfZ3JhZGllbnRfVCgpCit7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxUPiwgTG93ZXI+IGNnX2NvbG1ham9yX2xvd2VyX2RpYWc7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxUPiwgVXBwZXI+IGNnX2NvbG1ham9yX3VwcGVyX2RpYWc7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxUPiwgTG93ZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXI+IGNnX2NvbG1ham9yX2xvd2VyX0k7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxUPiwgVXBwZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXI+IGNnX2NvbG1ham9yX3VwcGVyX0k7CisKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfY29sbWFqb3JfbG93ZXJfZGlhZykgICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2NvbG1ham9yX3VwcGVyX2RpYWcpICApOworICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19jb2xtYWpvcl9sb3dlcl9JKSAgICAgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfY29sbWFqb3JfdXBwZXJfSSkgICAgICk7Cit9CisKK3ZvaWQgdGVzdF9jb25qdWdhdGVfZ3JhZGllbnQoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2Nvbmp1Z2F0ZV9ncmFkaWVudF9UPGRvdWJsZT4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfY29uanVnYXRlX2dyYWRpZW50X1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY29uc2VydmF0aXZlX3Jlc2l6ZS5jcHAgYi90ZXN0L2NvbnNlcnZhdGl2ZV9yZXNpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTFlNDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbnNlcnZhdGl2ZV9yZXNpemUuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgU3RvcmFnZT4KK3ZvaWQgcnVuX21hdHJpeF90ZXN0cygpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljLCBTdG9yYWdlPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIE1hdHJpeFR5cGUgbSwgbjsKKworICAvLyBib3VuZGFyeSBjYXNlcyAuLi4KKyAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZSgxLDUwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLmJsb2NrKDAsMCwxLDUwKSk7CisKKyAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZSg1MCwxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLmJsb2NrKDAsMCw1MCwxKSk7CisKKyAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZSg1MCw1MCk7CisgIFZFUklGWV9JU19BUFBST1gobSwgbi5ibG9jaygwLDAsNTAsNTApKTsKKworICAvLyByYW5kb20gc2hyaW5raW5nIC4uLgorICBmb3IgKGludCBpPTA7IGk8MjU7ICsraSkKKyAgeworICAgIGNvbnN0IEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDUwKTsKKyAgICBjb25zdCBJbmRleCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSw1MCk7CisgICAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplKHJvd3MsY29scyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLmJsb2NrKDAsMCxyb3dzLGNvbHMpKTsKKyAgfQorCisgIC8vIHJhbmRvbSBncm93aW5nIHdpdGggemVyb2luZyAuLi4KKyAgZm9yIChpbnQgaT0wOyBpPDI1OyArK2kpCisgIHsKKyAgICBjb25zdCBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oNTAsNzUpOworICAgIGNvbnN0IEluZGV4IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig1MCw3NSk7CisgICAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplTGlrZShNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykpOworICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jaygwLDAsbi5yb3dzKCksbi5jb2xzKCkpLCBuKTsKKyAgICBWRVJJRlkoIHJvd3M8PTUwIHx8IG0uYmxvY2soNTAsMCxyb3dzLTUwLGNvbHMpLnN1bSgpID09IFNjYWxhcigwKSApOworICAgIFZFUklGWSggY29sczw9NTAgfHwgbS5ibG9jaygwLDUwLHJvd3MsY29scy01MCkuc3VtKCkgPT0gU2NhbGFyKDApICk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgcnVuX3ZlY3Rvcl90ZXN0cygpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgRWlnZW46OkR5bmFtaWM+IE1hdHJpeFR5cGU7CisKKyAgTWF0cml4VHlwZSBtLCBuOworCisgIC8vIGJvdW5kYXJ5IGNhc2VzIC4uLgorICBtID0gbiA9IE1hdHJpeFR5cGU6OlJhbmRvbSg1MCk7CisgIG0uY29uc2VydmF0aXZlUmVzaXplKDEpOworICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uc2VnbWVudCgwLDEpKTsKKworICBtID0gbiA9IE1hdHJpeFR5cGU6OlJhbmRvbSg1MCk7CisgIG0uY29uc2VydmF0aXZlUmVzaXplKDUwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLnNlZ21lbnQoMCw1MCkpOworCisgIC8vIHJhbmRvbSBzaHJpbmtpbmcgLi4uCisgIGZvciAoaW50IGk9MDsgaTw1MDsgKytpKQorICB7CisgICAgY29uc3QgaW50IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSw1MCk7CisgICAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplKHNpemUpOworICAgIFZFUklGWV9JU19BUFBST1gobSwgbi5zZWdtZW50KDAsc2l6ZSkpOworICB9CisKKyAgLy8gcmFuZG9tIGdyb3dpbmcgd2l0aCB6ZXJvaW5nIC4uLgorICBmb3IgKGludCBpPTA7IGk8NTA7ICsraSkKKyAgeworICAgIGNvbnN0IGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDUwLDEwMCk7CisgICAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplTGlrZShNYXRyaXhUeXBlOjpaZXJvKHNpemUpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0uc2VnbWVudCgwLDUwKSwgbik7CisgICAgVkVSSUZZKCBzaXplPD01MCB8fCBtLnNlZ21lbnQoNTAsc2l6ZS01MCkuc3VtKCkgPT0gU2NhbGFyKDApICk7CisgIH0KK30KKwordm9pZCB0ZXN0X2NvbnNlcnZhdGl2ZV9yZXNpemUoKQoreworICBDQUxMX1NVQlRFU1RfMSgocnVuX21hdHJpeF90ZXN0czxpbnQsIEVpZ2VuOjpSb3dNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfMSgocnVuX21hdHJpeF90ZXN0czxpbnQsIEVpZ2VuOjpDb2xNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfMigocnVuX21hdHJpeF90ZXN0czxmbG9hdCwgRWlnZW46OlJvd01ham9yPigpKSk7CisgIENBTExfU1VCVEVTVF8yKChydW5fbWF0cml4X3Rlc3RzPGZsb2F0LCBFaWdlbjo6Q29sTWFqb3I+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKHJ1bl9tYXRyaXhfdGVzdHM8ZG91YmxlLCBFaWdlbjo6Um93TWFqb3I+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKHJ1bl9tYXRyaXhfdGVzdHM8ZG91YmxlLCBFaWdlbjo6Q29sTWFqb3I+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQoKHJ1bl9tYXRyaXhfdGVzdHM8c3RkOjpjb21wbGV4PGZsb2F0PiwgRWlnZW46OlJvd01ham9yPigpKSk7CisgIENBTExfU1VCVEVTVF80KChydW5fbWF0cml4X3Rlc3RzPHN0ZDo6Y29tcGxleDxmbG9hdD4sIEVpZ2VuOjpDb2xNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfNSgocnVuX21hdHJpeF90ZXN0czxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgRWlnZW46OlJvd01ham9yPigpKSk7CisgIENBTExfU1VCVEVTVF82KChydW5fbWF0cml4X3Rlc3RzPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBFaWdlbjo6Q29sTWFqb3I+KCkpKTsKKworICBDQUxMX1NVQlRFU1RfMSgocnVuX3ZlY3Rvcl90ZXN0czxpbnQ+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoKHJ1bl92ZWN0b3JfdGVzdHM8ZmxvYXQ+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKHJ1bl92ZWN0b3JfdGVzdHM8ZG91YmxlPigpKSk7CisgIENBTExfU1VCVEVTVF80KChydW5fdmVjdG9yX3Rlc3RzPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpKSk7CisgIENBTExfU1VCVEVTVF81KChydW5fdmVjdG9yX3Rlc3RzPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JuZXJzLmNwcCBiL3Rlc3QvY29ybmVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwNWM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29ybmVycy5jcHAKQEAgLTAsMCArMSw5OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNkZWZpbmUgQ09NUEFSRV9DT1JORVIoQSxCKSBcCisgIFZFUklGWV9JU19FUVVBTChtYXRyaXguQSwgbWF0cml4LkIpOyBcCisgIFZFUklGWV9JU19FUVVBTChjb25zdF9tYXRyaXguQSwgY29uc3RfbWF0cml4LkIpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNvcm5lcnMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEscm93cyk7CisgIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLGNvbHMpOworCisgIE1hdHJpeFR5cGUgbWF0cml4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIGNvbnN0IE1hdHJpeFR5cGUgY29uc3RfbWF0cml4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisKKyAgQ09NUEFSRV9DT1JORVIodG9wTGVmdENvcm5lcihyLGMpLCBibG9jaygwLDAscixjKSk7CisgIENPTVBBUkVfQ09STkVSKHRvcFJpZ2h0Q29ybmVyKHIsYyksIGJsb2NrKDAsY29scy1jLHIsYykpOworICBDT01QQVJFX0NPUk5FUihib3R0b21MZWZ0Q29ybmVyKHIsYyksIGJsb2NrKHJvd3MtciwwLHIsYykpOworICBDT01QQVJFX0NPUk5FUihib3R0b21SaWdodENvcm5lcihyLGMpLCBibG9jayhyb3dzLXIsY29scy1jLHIsYykpOworCisgIEluZGV4IHNyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxyb3dzKSAtIDE7CisgIEluZGV4IG5yID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxyb3dzLXNyKTsKKyAgSW5kZXggc2MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLGNvbHMpIC0gMTsKKyAgSW5kZXggbmMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLGNvbHMtc2MpOworCisgIENPTVBBUkVfQ09STkVSKHRvcFJvd3MociksIGJsb2NrKDAsMCxyLGNvbHMpKTsKKyAgQ09NUEFSRV9DT1JORVIobWlkZGxlUm93cyhzcixuciksIGJsb2NrKHNyLDAsbnIsY29scykpOworICBDT01QQVJFX0NPUk5FUihib3R0b21Sb3dzKHIpLCBibG9jayhyb3dzLXIsMCxyLGNvbHMpKTsKKyAgQ09NUEFSRV9DT1JORVIobGVmdENvbHMoYyksIGJsb2NrKDAsMCxyb3dzLGMpKTsKKyAgQ09NUEFSRV9DT1JORVIobWlkZGxlQ29scyhzYyxuYyksIGJsb2NrKDAsc2Mscm93cyxuYykpOworICBDT01QQVJFX0NPUk5FUihyaWdodENvbHMoYyksIGJsb2NrKDAsY29scy1jLHJvd3MsYykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgQ1Jvd3MsIGludCBDQ29scywgaW50IFNSb3dzLCBpbnQgU0NvbHM+IHZvaWQgY29ybmVyc19maXhlZHNpemUoKQoreworICBNYXRyaXhUeXBlIG1hdHJpeCA9IE1hdHJpeFR5cGU6OlJhbmRvbSgpOworICBjb25zdCBNYXRyaXhUeXBlIGNvbnN0X21hdHJpeCA9IE1hdHJpeFR5cGU6OlJhbmRvbSgpOworCisgIGVudW0geworICAgIHJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBjb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgciA9IENSb3dzLAorICAgIGMgPSBDQ29scywKKwlzciA9IFNSb3dzLAorCXNjID0gU0NvbHMKKyAgfTsKKworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjPigwLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIHRvcFJpZ2h0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjPigwLGNvbHMtYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxyLGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsYz4ocm93cy1yLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjPihyb3dzLXIsY29scy1jKSkpOworCisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIHRvcFJvd3M8cj4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjb2xzPigwLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIG1pZGRsZVJvd3M8cj4oc3IpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGNvbHM+KHNyLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGJvdHRvbVJvd3M8cj4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjb2xzPihyb3dzLXIsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgbGVmdENvbHM8Yz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cm93cyxjPigwLDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIG1pZGRsZUNvbHM8Yz4oc2MpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyb3dzLGM+KDAsc2MpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIHJpZ2h0Q29sczxjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyb3dzLGM+KDAsY29scy1jKSkpOworCisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KDAsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KDAsY29scy1jKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjPihyb3dzLXIsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KHJvd3Mtcixjb2xzLWMpKSk7CisKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wUm93czxyPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGNvbHM+KDAsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgbWlkZGxlUm93czxyPihzcikpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsY29scz4oc3IsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tUm93czxyPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGNvbHM+KHJvd3MtciwwKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBsZWZ0Q29sczxjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyb3dzLGM+KDAsMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgbWlkZGxlQ29sczxjPihzYykpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsYz4oMCxzYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgcmlnaHRDb2xzPGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsYz4oMCxjb2xzLWMpKSk7Cit9CisKK3ZvaWQgdGVzdF9jb3JuZXJzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggY29ybmVycyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGNvcm5lcnMoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggY29ybmVycyhNYXRyaXg8aW50LDEwLDEyPigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBjb3JuZXJzKE1hdHJpeFhjZig1LCA3KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggY29ybmVycyhNYXRyaXhYZigyMSwgMjApKSApOworCisgICAgQ0FMTF9TVUJURVNUXzEoKCBjb3JuZXJzX2ZpeGVkc2l6ZTxNYXRyaXg8ZmxvYXQsIDEsIDE+LCAxLCAxLCAwLCAwPigpICkpOworICAgIENBTExfU1VCVEVTVF8yKCggY29ybmVyc19maXhlZHNpemU8TWF0cml4NGQsMiwyLDEsMT4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoIGNvcm5lcnNfZml4ZWRzaXplPE1hdHJpeDxpbnQsMTAsMTI+LDQsNyw1LDI+KCkgKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3dpc2VvcC5jcHAgYi90ZXN0L2N3aXNlb3AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNmU0MjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2N3aXNlb3AuY3BwCkBAIC0wLDAgKzEsMTY1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTjJfU1VQUE9SVAorI2RlZmluZSBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpZmRlZiBtaW4KKyN1bmRlZiBtaW4KKyNlbmRpZgorCisjaWZkZWYgbWF4CisjdW5kZWYgbWF4CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgQWRkSWZOdWxsIHsKKyAgICBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyIGEsIGNvbnN0IFNjYWxhciBiKSBjb25zdCB7cmV0dXJuIGE8PTFlLTMgPyBiIDogYTt9CisgICAgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjd2lzZW9wcyhjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG00KHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtb25lcyA9IE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scyksCisgICAgICAgICAgICAgaWRlbnRpdHkgPSBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OklkZW50aXR5KHJvd3MsIHJvd3MpOworICBWZWN0b3JUeXBlIHZ6ZXJvID0gVmVjdG9yVHlwZTo6WmVybyhyb3dzKSwKKyAgICAgICAgICAgICB2b25lcyA9IFZlY3RvclR5cGU6Ok9uZXMocm93cyksCisgICAgICAgICAgICAgdjMocm93cyk7CisKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCisgICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIC8vIHRlc3QgWmVybywgT25lcywgQ29uc3RhbnQsIGFuZCB0aGUgc2V0KiB2YXJpYW50cworICBtMyA9IE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIHMxKTsKKyAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKKyAgICBmb3IgKGludCBpPTA7IGk8cm93czsgKytpKQorICAgIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobXplcm8oaSxqKSwgU2NhbGFyKDApKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobW9uZXMoaSxqKSwgU2NhbGFyKDEpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTMoaSxqKSwgczEpOworICAgIH0KKyAgVkVSSUZZKG16ZXJvLmlzWmVybygpKTsKKyAgVkVSSUZZKG1vbmVzLmlzT25lcygpKTsKKyAgVkVSSUZZKG0zLmlzQ29uc3RhbnQoczEpKTsKKyAgVkVSSUZZKGlkZW50aXR5LmlzSWRlbnRpdHkoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTQuc2V0Q29uc3RhbnQoczEpLCBtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTQuc2V0Q29uc3RhbnQocm93cyxjb2xzLHMxKSwgbTMpOworICBWRVJJRllfSVNfQVBQUk9YKG00LnNldFplcm8oKSwgbXplcm8pOworICBWRVJJRllfSVNfQVBQUk9YKG00LnNldFplcm8ocm93cyxjb2xzKSwgbXplcm8pOworICBWRVJJRllfSVNfQVBQUk9YKG00LnNldE9uZXMoKSwgbW9uZXMpOworICBWRVJJRllfSVNfQVBQUk9YKG00LnNldE9uZXMocm93cyxjb2xzKSwgbW9uZXMpOworICBtNC5maWxsKHMxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNCwgbTMpOworCisgIFZFUklGWV9JU19BUFBST1godjMuc2V0Q29uc3RhbnQocm93cywgczEpLCBWZWN0b3JUeXBlOjpDb25zdGFudChyb3dzLHMxKSk7CisgIFZFUklGWV9JU19BUFBST1godjMuc2V0WmVybyhyb3dzKSwgdnplcm8pOworICBWRVJJRllfSVNfQVBQUk9YKHYzLnNldE9uZXMocm93cyksIHZvbmVzKTsKKworICBtMiA9IG0yLnRlbXBsYXRlIGJpbmFyeUV4cHI8QWRkSWZOdWxsPFNjYWxhcj4gPihtb25lcyk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpLnBvdygyKSwgbTEuY3dpc2UoKS5hYnMyKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlKCkucG93KDIpLCBtMS5jd2lzZSgpLnNxdWFyZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpLnBvdygzKSwgbTEuY3dpc2UoKS5jdWJlKCkpOworCisgIFZFUklGWV9JU19BUFBST1gobTEgKyBtb25lcywgbTEuY3dpc2UoKStTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xIC0gbW9uZXMsIG0xLmN3aXNlKCktU2NhbGFyKDEpKTsKKyAgbTMgPSBtMTsgbTMuY3dpc2UoKSArPSAxOworICBWRVJJRllfSVNfQVBQUk9YKG0xICsgbW9uZXMsIG0zKTsKKyAgbTMgPSBtMTsgbTMuY3dpc2UoKSAtPSAxOworICBWRVJJRllfSVNfQVBQUk9YKG0xIC0gbW9uZXMsIG0zKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMi5jd2lzZSgpICogbW9uZXMpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlKCkgKiBtMiwgIG0yLmN3aXNlKCkgKiBtMSk7CisgIG0zID0gbTE7CisgIG0zLmN3aXNlKCkgKj0gbTI7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xLmN3aXNlKCkgKiBtMik7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtb25lcywgICAgbTIuY3dpc2UoKS9tMik7CisgIGlmKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpIC8gbTIsICAgIG0xLmN3aXNlKCkgKiAobTIuY3dpc2UoKS5pbnZlcnNlKCkpKTsKKyAgICBtMyA9IG0xLmN3aXNlKCkuYWJzKCkuY3dpc2UoKS5zcXJ0KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMy5jd2lzZSgpLnNxdWFyZSgpLCBtMS5jd2lzZSgpLmFicygpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlKCkuc3F1YXJlKCkuY3dpc2UoKS5zcXJ0KCksIG0xLmN3aXNlKCkuYWJzKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKS5hYnMoKS5jd2lzZSgpLmxvZygpLmN3aXNlKCkuZXhwKCkgLCBtMS5jd2lzZSgpLmFicygpKTsKKworICAgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKS5wb3coMiksIG0xLmN3aXNlKCkuc3F1YXJlKCkpOworICAgIG0zID0gKG0xLmN3aXNlKCkuYWJzKCkuY3dpc2UoKTw9UmVhbFNjYWxhcigwLjAxKSkuc2VsZWN0KG1vbmVzLG0xKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlKCkucG93KC0xKSwgbTMuY3dpc2UoKS5pbnZlcnNlKCkpOworICAgIG0zID0gbTEuY3dpc2UoKS5hYnMoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlKCkucG93KFJlYWxTY2FsYXIoMC41KSksIG0zLmN3aXNlKCkuc3FydCgpKTsKKworLy8gICAgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKS50YW4oKSwgbTEuY3dpc2UoKS5zaW4oKS5jd2lzZSgpIC8gbTEuY3dpc2UoKS5jb3MoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtb25lcywgbTEuY3dpc2UoKS5zaW4oKS5jd2lzZSgpLnNxdWFyZSgpICsgbTEuY3dpc2UoKS5jb3MoKS5jd2lzZSgpLnNxdWFyZSgpKTsKKyAgICBtMyA9IG0xOworICAgIG0zLmN3aXNlKCkgLz0gbTI7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEuY3dpc2UoKSAvIG0yKTsKKyAgfQorCisgIC8vIGNoZWNrIG1pbgorICBWRVJJRllfSVNfQVBQUk9YKCBtMS5jd2lzZSgpLm1pbihtMiksIG0yLmN3aXNlKCkubWluKG0xKSApOworICBWRVJJRllfSVNfQVBQUk9YKCBtMS5jd2lzZSgpLm1pbihtMSttb25lcyksIG0xICk7CisgIFZFUklGWV9JU19BUFBST1goIG0xLmN3aXNlKCkubWluKG0xLW1vbmVzKSwgbTEtbW9uZXMgKTsKKworICAvLyBjaGVjayBtYXgKKyAgVkVSSUZZX0lTX0FQUFJPWCggbTEuY3dpc2UoKS5tYXgobTIpLCBtMi5jd2lzZSgpLm1heChtMSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggbTEuY3dpc2UoKS5tYXgobTEtbW9uZXMpLCBtMSApOworICBWRVJJRllfSVNfQVBQUk9YKCBtMS5jd2lzZSgpLm1heChtMSttb25lcyksIG0xK21vbmVzICk7CisKKyAgVkVSSUZZKCAobTEuY3dpc2UoKSA9PSBtMSkuYWxsKCkgKTsKKyAgVkVSSUZZKCAobTEuY3dpc2UoKSAhPSBtMikuYW55KCkgKTsKKyAgVkVSSUZZKCEobTEuY3dpc2UoKSA9PSAobTErbW9uZXMpKS5hbnkoKSApOworICBpZiAocm93cypjb2xzPjEpCisgIHsKKyAgICBtMyA9IG0xOworICAgIG0zKHIsYykgKz0gMTsKKyAgICBWRVJJRlkoIChtMS5jd2lzZSgpID09IG0zKS5hbnkoKSApOworICAgIFZFUklGWSggIShtMS5jd2lzZSgpID09IG0zKS5hbGwoKSApOworICB9CisgIFZFUklGWSggKG0xLmN3aXNlKCkubWluKG0yKS5jd2lzZSgpIDw9IG0yKS5hbGwoKSApOworICBWRVJJRlkoIChtMS5jd2lzZSgpLm1heChtMikuY3dpc2UoKSA+PSBtMikuYWxsKCkgKTsKKyAgVkVSSUZZKCAobTEuY3dpc2UoKS5taW4obTIpLmN3aXNlKCkgPCAobTErbW9uZXMpKS5hbGwoKSApOworICBWRVJJRlkoIChtMS5jd2lzZSgpLm1heChtMikuY3dpc2UoKSA+IChtMS1tb25lcykpLmFsbCgpICk7CisKKyAgVkVSSUZZKCAobTEuY3dpc2UoKTxtMS51bmFyeUV4cHIoYmluZDJuZChwbHVzPFNjYWxhcj4oKSwgU2NhbGFyKDEpKSkpLmFsbCgpICk7CisgIFZFUklGWSggIShtMS5jd2lzZSgpPG0xLnVuYXJ5RXhwcihiaW5kMm5kKG1pbnVzPFNjYWxhcj4oKSwgU2NhbGFyKDEpKSkpLmFsbCgpICk7CisgIFZFUklGWSggIShtMS5jd2lzZSgpPm0xLnVuYXJ5RXhwcihiaW5kMm5kKHBsdXM8U2NhbGFyPigpLCBTY2FsYXIoMSkpKSkuYW55KCkgKTsKK30KKwordm9pZCB0ZXN0X2N3aXNlb3AoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgOyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggY3dpc2VvcHMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBjd2lzZW9wcyhNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBjd2lzZW9wcyhNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF80KCBjd2lzZW9wcyhNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF81KCBjd2lzZW9wcyhNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBjd2lzZW9wcyhNYXRyaXhYZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2RldGVybWluYW50LmNwcCBiL3Rlc3QvZGV0ZXJtaW5hbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5M2YyZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RldGVybWluYW50LmNwcApAQCAtMCwwICsxLDY3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vTFU+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZGV0ZXJtaW5hbnQoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBEZXRlcm1pbmFudC5oCisgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIEluZGV4IHNpemUgPSBtLnJvd3MoKTsKKworICBNYXRyaXhUeXBlIG0xKHNpemUsIHNpemUpLCBtMihzaXplLCBzaXplKTsKKyAgbTEuc2V0UmFuZG9tKCk7CisgIG0yLnNldFJhbmRvbSgpOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIFNjYWxhciB4ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6SWRlbnRpdHkoc2l6ZSwgc2l6ZSkuZGV0ZXJtaW5hbnQoKSwgU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEqbTIpLmV2YWwoKS5kZXRlcm1pbmFudCgpLCBtMS5kZXRlcm1pbmFudCgpICogbTIuZGV0ZXJtaW5hbnQoKSk7CisgIGlmKHNpemU9PTEpIHJldHVybjsKKyAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNpemUtMSk7CisgIEluZGV4IGo7CisgIGRvIHsKKyAgICBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgc2l6ZS0xKTsKKyAgfSB3aGlsZShqPT1pKTsKKyAgbTIgPSBtMTsKKyAgbTIucm93KGkpLnN3YXAobTIucm93KGopKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5kZXRlcm1pbmFudCgpLCAtbTEuZGV0ZXJtaW5hbnQoKSk7CisgIG0yID0gbTE7CisgIG0yLmNvbChpKS5zd2FwKG0yLmNvbChqKSk7CisgIFZFUklGWV9JU19BUFBST1gobTIuZGV0ZXJtaW5hbnQoKSwgLW0xLmRldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLmRldGVybWluYW50KCksIG0yLnRyYW5zcG9zZSgpLmRldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKGludGVybmFsOjpjb25qKG0yLmRldGVybWluYW50KCkpLCBtMi5hZGpvaW50KCkuZGV0ZXJtaW5hbnQoKSk7CisgIG0yID0gbTE7CisgIG0yLnJvdyhpKSArPSB4Km0yLnJvdyhqKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5kZXRlcm1pbmFudCgpLCBtMS5kZXRlcm1pbmFudCgpKTsKKyAgbTIgPSBtMTsKKyAgbTIucm93KGkpICo9IHg7CisgIFZFUklGWV9JU19BUFBST1gobTIuZGV0ZXJtaW5hbnQoKSwgbTEuZGV0ZXJtaW5hbnQoKSAqIHgpOworICAKKyAgLy8gY2hlY2sgZW1wdHkgbWF0cml4CisgIFZFUklGWV9JU19BUFBST1gobTIuYmxvY2soMCwwLDAsMCkuZGV0ZXJtaW5hbnQoKSwgU2NhbGFyKDEpKTsKK30KKwordm9pZCB0ZXN0X2RldGVybWluYW50KCkKK3sKKyAgaW50IHM7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGRldGVybWluYW50KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZGV0ZXJtaW5hbnQoTWF0cml4PGRvdWJsZSwgMiwgMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggZGV0ZXJtaW5hbnQoTWF0cml4PGRvdWJsZSwgMywgMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggZGV0ZXJtaW5hbnQoTWF0cml4PGRvdWJsZSwgNCwgND4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggZGV0ZXJtaW5hbnQoTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCAxMCwgMTA+KCkpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGRldGVybWluYW50KE1hdHJpeFhkKHMsIHMpKSApOworICB9CisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShzKQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaWFnb25hbC5jcHAgYi90ZXN0L2RpYWdvbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNkMTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaWFnb25hbC5jcHAKQEAgLTAsMCArMSw4MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZGlhZ29uYWwoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworCisgIC8vY2hlY2sgZGlhZ29uYWwoKQorICBWRVJJRllfSVNfQVBQUk9YKG0xLmRpYWdvbmFsKCksIG0xLnRyYW5zcG9zZSgpLmRpYWdvbmFsKCkpOworICBtMi5kaWFnb25hbCgpID0gMiAqIG0xLmRpYWdvbmFsKCk7CisgIG0yLmRpYWdvbmFsKClbMF0gKj0gMzsKKworICBpZiAocm93cz4yKQorICB7CisgICAgZW51bSB7CisgICAgICBOMSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjEgPyAgMSA6IDAsCisgICAgICBOMiA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjIgPyAtMiA6IDAKKyAgICB9OworCisgICAgLy8gY2hlY2sgc3ViL3N1cGVyIGRpYWdvbmFsCisgICAgaWYobTEudGVtcGxhdGUgZGlhZ29uYWw8TjE+KCkuUm93c0F0Q29tcGlsZVRpbWUhPUR5bmFtaWMpCisgICAgeworICAgICAgVkVSSUZZKG0xLnRlbXBsYXRlIGRpYWdvbmFsPE4xPigpLlJvd3NBdENvbXBpbGVUaW1lID09IG0xLmRpYWdvbmFsKE4xKS5zaXplKCkpOworICAgIH0KKyAgICBpZihtMS50ZW1wbGF0ZSBkaWFnb25hbDxOMj4oKS5Sb3dzQXRDb21waWxlVGltZSE9RHluYW1pYykKKyAgICB7CisgICAgICBWRVJJRlkobTEudGVtcGxhdGUgZGlhZ29uYWw8TjI+KCkuUm93c0F0Q29tcGlsZVRpbWUgPT0gbTEuZGlhZ29uYWwoTjIpLnNpemUoKSk7CisgICAgfQorCisgICAgbTIudGVtcGxhdGUgZGlhZ29uYWw8TjE+KCkgPSAyICogbTEudGVtcGxhdGUgZGlhZ29uYWw8TjE+KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBkaWFnb25hbDxOMT4oKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigyKSAqIG0xLmRpYWdvbmFsKE4xKSk7CisgICAgbTIudGVtcGxhdGUgZGlhZ29uYWw8TjE+KClbMF0gKj0gMzsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLnRlbXBsYXRlIGRpYWdvbmFsPE4xPigpWzBdLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDYpICogbTEudGVtcGxhdGUgZGlhZ29uYWw8TjE+KClbMF0pOworCisKKyAgICBtMi50ZW1wbGF0ZSBkaWFnb25hbDxOMj4oKSA9IDIgKiBtMS50ZW1wbGF0ZSBkaWFnb25hbDxOMj4oKTsKKyAgICBtMi50ZW1wbGF0ZSBkaWFnb25hbDxOMj4oKVswXSAqPSAzOworICAgIFZFUklGWV9JU19BUFBST1gobTIudGVtcGxhdGUgZGlhZ29uYWw8TjI+KClbMF0sIHN0YXRpY19jYXN0PFNjYWxhcj4oNikgKiBtMS50ZW1wbGF0ZSBkaWFnb25hbDxOMj4oKVswXSk7CisKKyAgICBtMi5kaWFnb25hbChOMSkgPSAyICogbTEuZGlhZ29uYWwoTjEpOworICAgIFZFUklGWV9JU19BUFBST1gobTIuZGlhZ29uYWw8TjE+KCksIHN0YXRpY19jYXN0PFNjYWxhcj4oMikgKiBtMS5kaWFnb25hbChOMSkpOworICAgIG0yLmRpYWdvbmFsKE4xKVswXSAqPSAzOworICAgIFZFUklGWV9JU19BUFBST1gobTIuZGlhZ29uYWwoTjEpWzBdLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDYpICogbTEuZGlhZ29uYWwoTjEpWzBdKTsKKworICAgIG0yLmRpYWdvbmFsKE4yKSA9IDIgKiBtMS5kaWFnb25hbChOMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5kaWFnb25hbDxOMj4oKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigyKSAqIG0xLmRpYWdvbmFsKE4yKSk7CisgICAgbTIuZGlhZ29uYWwoTjIpWzBdICo9IDM7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5kaWFnb25hbChOMilbMF0sIHN0YXRpY19jYXN0PFNjYWxhcj4oNikgKiBtMS5kaWFnb25hbChOMilbMF0pOworICB9Cit9CisKK3ZvaWQgdGVzdF9kaWFnb25hbCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGRpYWdvbmFsKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggZGlhZ29uYWwoTWF0cml4PGZsb2F0LCA0LCA5PigpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBkaWFnb25hbChNYXRyaXg8ZmxvYXQsIDcsIDM+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGRpYWdvbmFsKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGRpYWdvbmFsKE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBkaWFnb25hbChNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBkaWFnb25hbChNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggZGlhZ29uYWwoTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggZGlhZ29uYWwoTWF0cml4PGZsb2F0LER5bmFtaWMsND4oMywgNCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlhZ29uYWxtYXRyaWNlcy5jcHAgYi90ZXN0L2RpYWdvbmFsbWF0cmljZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTc3NmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RpYWdvbmFsbWF0cmljZXMuY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGRpYWdvbmFsbWF0cmljZXMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93cywgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBDb2xzPiBSb3dWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3MsIFJvd3M+IFNxdWFyZU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLCBSb3dzPiBMZWZ0RGlhZ29uYWxNYXRyaXg7CisgIHR5cGVkZWYgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLCBDb2xzPiBSaWdodERpYWdvbmFsTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3M9PUR5bmFtaWM/RHluYW1pYzoyKlJvd3MsIENvbHM9PUR5bmFtaWM/RHluYW1pYzoyKkNvbHM+IEJpZ01hdHJpeDsKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKKyAgICAgICAgICAgICB2MiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgUm93VmVjdG9yVHlwZSBydjEgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyksCisgICAgICAgICAgICAgcnYyID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKGNvbHMpOworICBMZWZ0RGlhZ29uYWxNYXRyaXggbGRtMSh2MSksIGxkbTIodjIpOworICBSaWdodERpYWdvbmFsTWF0cml4IHJkbTEocnYxKSwgcmRtMihydjIpOworCisgIFNxdWFyZU1hdHJpeFR5cGUgc3FfbTEgKHYxLmFzRGlhZ29uYWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goc3FfbTEsIHYxLmFzRGlhZ29uYWwoKS50b0RlbnNlTWF0cml4KCkpOworICBzcV9tMSA9IHYxLmFzRGlhZ29uYWwoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzcV9tMSwgdjEuYXNEaWFnb25hbCgpLnRvRGVuc2VNYXRyaXgoKSk7CisgIFNxdWFyZU1hdHJpeFR5cGUgc3FfbTIgPSB2MS5hc0RpYWdvbmFsKCk7CisgIFZFUklGWV9JU19BUFBST1goc3FfbTEsIHNxX20yKTsKKyAgCisgIGxkbTEgPSB2MS5hc0RpYWdvbmFsKCk7CisgIExlZnREaWFnb25hbE1hdHJpeCBsZG0zKHYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChsZG0xLmRpYWdvbmFsKCksIGxkbTMuZGlhZ29uYWwoKSk7CisgIExlZnREaWFnb25hbE1hdHJpeCBsZG00ID0gdjEuYXNEaWFnb25hbCgpOworICBWRVJJRllfSVNfQVBQUk9YKGxkbTEuZGlhZ29uYWwoKSwgbGRtNC5kaWFnb25hbCgpKTsKKyAgCisgIHNxX20xLmJsb2NrKDAsMCxyb3dzLHJvd3MpID0gbGRtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzcV9tMSwgbGRtMS50b0RlbnNlTWF0cml4KCkpOworICBzcV9tMS50cmFuc3Bvc2UoKSA9IGxkbTE7CisgIFZFUklGWV9JU19BUFBST1goc3FfbTEsIGxkbTEudG9EZW5zZU1hdHJpeCgpKTsKKyAgCisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpOworICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goICgobGRtMSAqIG0xKShpLGopKSAgLCBsZG0xLmRpYWdvbmFsKCkoaSkgKiBtMShpLGopICk7CisgIFZFUklGWV9JU19BUFBST1goICgobGRtMSAqIChtMSttMikpKGksaikpICAsIGxkbTEuZGlhZ29uYWwoKShpKSAqIChtMSttMikoaSxqKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAoKG0xICogcmRtMSkoaSxqKSkgICwgcmRtMS5kaWFnb25hbCgpKGopICogbTEoaSxqKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAoKHYxLmFzRGlhZ29uYWwoKSAqIG0xKShpLGopKSAgLCB2MShpKSAqIG0xKGksaikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSAqIHJ2MS5hc0RpYWdvbmFsKCkpKGksaikpICAsIHJ2MShqKSAqIG0xKGksaikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKCgodjErdjIpLmFzRGlhZ29uYWwoKSAqIG0xKShpLGopKSAgLCAodjErdjIpKGkpICogbTEoaSxqKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAoKCh2MSt2MikuYXNEaWFnb25hbCgpICogKG0xK20yKSkoaSxqKSkgICwgKHYxK3YyKShpKSAqIChtMSttMikoaSxqKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAoKG0xICogKHJ2MStydjIpLmFzRGlhZ29uYWwoKSkoaSxqKSkgICwgKHJ2MStydjIpKGopICogbTEoaSxqKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAoKChtMSttMikgKiAocnYxK3J2MikuYXNEaWFnb25hbCgpKShpLGopKSAgLCAocnYxK3J2MikoaikgKiAobTErbTIpKGksaikgKTsKKworICBCaWdNYXRyaXggYmlnOworICBiaWcuc2V0WmVybygyKnJvd3MsIDIqY29scyk7CisgIAorICBiaWcuYmxvY2soaSxqLHJvd3MsY29scykgPSBtMTsKKyAgYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpID0gdjEuYXNEaWFnb25hbCgpICogYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpKSAsIHYxLmFzRGlhZ29uYWwoKSAqIG0xICk7CisgIAorICBiaWcuYmxvY2soaSxqLHJvd3MsY29scykgPSBtMTsKKyAgYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpID0gYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpICogcnYxLmFzRGlhZ29uYWwoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpKSAsIG0xICogcnYxLmFzRGlhZ29uYWwoKSApOworICAKK30KKwordm9pZCB0ZXN0X2RpYWdvbmFsbWF0cmljZXMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBkaWFnb25hbG1hdHJpY2VzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXgzZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBkaWFnb25hbG1hdHJpY2VzKE1hdHJpeDxkb3VibGUsMywzLFJvd01ham9yPigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBkaWFnb25hbG1hdHJpY2VzKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGRpYWdvbmFsbWF0cmljZXMoTWF0cml4PGZsb2F0LDQsNCxSb3dNYWpvcj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF84KCBkaWFnb25hbG1hdHJpY2VzKE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF85KCBkaWFnb25hbG1hdHJpY2VzKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZG9udGFsaWduLmNwcCBiL3Rlc3QvZG9udGFsaWduLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQzY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kb250YWxpZ24uY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmIGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzEgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfMiB8fCBkZWZpbmVkIEVJR0VOX1RFU1RfUEFSVF8zIHx8IGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzQKKyNkZWZpbmUgRUlHRU5fRE9OVF9BTElHTgorI2VsaWYgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfNSB8fCBkZWZpbmVkIEVJR0VOX1RFU1RfUEFSVF82IHx8IGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzcgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfOAorI2RlZmluZSBFSUdFTl9ET05UX0FMSUdOX1NUQVRJQ0FMTFkKKyNlbmRpZgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBkb250YWxpZ24oY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gU3F1YXJlTWF0cml4VHlwZTsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBzcXVhcmUgPSBTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxyb3dzKTsKKyAgVmVjdG9yVHlwZSB2ID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworCisgIFZFUklGWV9JU19BUFBST1godiwgc3F1YXJlICogc3F1YXJlLmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZSh2KSk7CisgIHNxdWFyZSA9IHNxdWFyZS5pbnZlcnNlKCkuZXZhbCgpOworICBhID0gc3F1YXJlICogYTsKKyAgc3F1YXJlID0gc3F1YXJlKnNxdWFyZTsKKyAgdiA9IHNxdWFyZSAqIHY7CisgIHYgPSBhLmFkam9pbnQoKSAqIHY7CisgIFZFUklGWShzcXVhcmUuZGV0ZXJtaW5hbnQoKSAhPSBTY2FsYXIoMCkpOworCisgIC8vIGJ1ZyAyMTk6IE1hcEFsaWduZWQoKSB3YXMgZ2l2aW5nIGFuIGFzc2VydCB3aXRoIEVJR0VOX0RPTlRfQUxJR04sIGJlY2F1c2UgTWFwIEZsYWdzIHdlcmUgbWlzY29tcHV0ZWQKKyAgU2NhbGFyKiBhcnJheSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHJvd3MpOworICB2ID0gVmVjdG9yVHlwZTo6TWFwQWxpZ25lZChhcnJheSwgcm93cyk7CisgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShhcnJheSwgcm93cyk7Cit9CisKK3ZvaWQgdGVzdF9kb250YWxpZ24oKQoreworI2lmIGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzEgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfNQorICBkb250YWxpZ24oTWF0cml4M2QoKSk7CisgIGRvbnRhbGlnbihNYXRyaXg0ZigpKTsKKyNlbGlmIGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzIgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfNgorICBkb250YWxpZ24oTWF0cml4M2NkKCkpOworICBkb250YWxpZ24oTWF0cml4NGNmKCkpOworI2VsaWYgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfMyB8fCBkZWZpbmVkIEVJR0VOX1RFU1RfUEFSVF83CisgIGRvbnRhbGlnbihNYXRyaXg8ZmxvYXQsIDMyLCAzMj4oKSk7CisgIGRvbnRhbGlnbihNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMzIsIDMyPigpKTsKKyNlbGlmIGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzQgfHwgZGVmaW5lZCBFSUdFTl9URVNUX1BBUlRfOAorICBkb250YWxpZ24oTWF0cml4WGQoMzIsIDMyKSk7CisgIGRvbnRhbGlnbihNYXRyaXhYY2YoMzIsIDMyKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZHluYWxsb2MuY3BwIGIvdGVzdC9keW5hbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjY2JmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZHluYWxsb2MuY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNpZiBFSUdFTl9BTElHTgorI2RlZmluZSBBTElHTk1FTlQgMTYKKyNlbHNlCisjZGVmaW5lIEFMSUdOTUVOVCAxCisjZW5kaWYKKwordm9pZCBjaGVja19oYW5kbWFkZV9hbGlnbmVkX21hbGxvYygpCit7CisgIGZvcihpbnQgaSA9IDE7IGkgPCAxMDAwOyBpKyspCisgIHsKKyAgICBjaGFyICpwID0gKGNoYXIqKWludGVybmFsOjpoYW5kbWFkZV9hbGlnbmVkX21hbGxvYyhpKTsKKyAgICBWRVJJRlkoc2l6ZV90KHApJUFMSUdOTUVOVD09MCk7CisgICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyB3cm9uZ2x5IGFsbG9jYXRlZCB0aGlzIHdpbGwgZ2l2ZSBhIGJhZCB3cml0ZSAtLT4gY2hlY2sgd2l0aCB2YWxncmluZAorICAgIGZvcihpbnQgaiA9IDA7IGogPCBpOyBqKyspIHBbal09MDsKKyAgICBpbnRlcm5hbDo6aGFuZG1hZGVfYWxpZ25lZF9mcmVlKHApOworICB9Cit9CisKK3ZvaWQgY2hlY2tfYWxpZ25lZF9tYWxsb2MoKQoreworICBmb3IoaW50IGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorICB7CisgICAgY2hhciAqcCA9IChjaGFyKilpbnRlcm5hbDo6YWxpZ25lZF9tYWxsb2MoaSk7CisgICAgVkVSSUZZKHNpemVfdChwKSVBTElHTk1FTlQ9PTApOworICAgIC8vIGlmIHRoZSBidWZmZXIgaXMgd3JvbmdseSBhbGxvY2F0ZWQgdGhpcyB3aWxsIGdpdmUgYSBiYWQgd3JpdGUgLS0+IGNoZWNrIHdpdGggdmFsZ3JpbmQKKyAgICBmb3IoaW50IGogPSAwOyBqIDwgaTsgaisrKSBwW2pdPTA7CisgICAgaW50ZXJuYWw6OmFsaWduZWRfZnJlZShwKTsKKyAgfQorfQorCit2b2lkIGNoZWNrX2FsaWduZWRfbmV3KCkKK3sKKyAgZm9yKGludCBpID0gMTsgaSA8IDEwMDA7IGkrKykKKyAgeworICAgIGZsb2F0ICpwID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PGZsb2F0PihpKTsKKyAgICBWRVJJRlkoc2l6ZV90KHApJUFMSUdOTUVOVD09MCk7CisgICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyB3cm9uZ2x5IGFsbG9jYXRlZCB0aGlzIHdpbGwgZ2l2ZSBhIGJhZCB3cml0ZSAtLT4gY2hlY2sgd2l0aCB2YWxncmluZAorICAgIGZvcihpbnQgaiA9IDA7IGogPCBpOyBqKyspIHBbal09MDsKKyAgICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUocCxpKTsKKyAgfQorfQorCit2b2lkIGNoZWNrX2FsaWduZWRfc3RhY2tfYWxsb2MoKQoreworICBmb3IoaW50IGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorICB7CisgICAgZWlfZGVjbGFyZV9hbGlnbmVkX3N0YWNrX2NvbnN0cnVjdGVkX3ZhcmlhYmxlKGZsb2F0LHAsaSwwKTsKKyAgICBWRVJJRlkoc2l6ZV90KHApJUFMSUdOTUVOVD09MCk7CisgICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyB3cm9uZ2x5IGFsbG9jYXRlZCB0aGlzIHdpbGwgZ2l2ZSBhIGJhZCB3cml0ZSAtLT4gY2hlY2sgd2l0aCB2YWxncmluZAorICAgIGZvcihpbnQgaiA9IDA7IGogPCBpOyBqKyspIHBbal09MDsKKyAgfQorfQorCisKKy8vIHRlc3QgY29tcGlsYXRpb24gd2l0aCBib3RoIGEgc3RydWN0IGFuZCBhIGNsYXNzLi4uCitzdHJ1Y3QgTXlTdHJ1Y3QKK3sKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworICBjaGFyIGR1bW15Y2hhcjsKKyAgVmVjdG9yNGYgYXZlYzsKK307CisKK2NsYXNzIE15Q2xhc3NBCit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisgICAgY2hhciBkdW1teWNoYXI7CisgICAgVmVjdG9yNGYgYXZlYzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgY2hlY2tfZHluYWxpZ25lZCgpCit7CisgIFQqIG9iaiA9IG5ldyBUOworICBWRVJJRlkoc2l6ZV90KG9iaiklQUxJR05NRU5UPT0wKTsKKyAgZGVsZXRlIG9iajsKK30KKwordm9pZCB0ZXN0X2R5bmFsbG9jKCkKK3sKKyAgLy8gbG93IGxldmVsIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24KKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2hhbmRtYWRlX2FsaWduZWRfbWFsbG9jKCkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxpZ25lZF9tYWxsb2MoKSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGlnbmVkX25ldygpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsaWduZWRfc3RhY2tfYWxsb2MoKSk7CisKKyAgZm9yIChpbnQgaT0wOyBpPGdfcmVwZWF0KjEwMDsgKytpKQorICB7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2R5bmFsaWduZWQ8VmVjdG9yNGY+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3IyZD4oKSApOworICAgIENBTExfU1VCVEVTVChjaGVja19keW5hbGlnbmVkPE1hdHJpeDRmPigpICk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2R5bmFsaWduZWQ8VmVjdG9yNGQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3I0aT4oKSApOworICB9CisgIAorICAvLyBjaGVjayBzdGF0aWMgYWxsb2NhdGlvbiwgd2hvIGtub3dzID8KKyAgI2lmIEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkKKyAgeworICAgIE15U3RydWN0IGZvbzA7ICBWRVJJRlkoc2l6ZV90KGZvbzAuYXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7CisgICAgTXlDbGFzc0EgZm9vQTsgIFZFUklGWShzaXplX3QoZm9vQS5hdmVjLmRhdGEoKSklQUxJR05NRU5UPT0wKTsKKyAgfQorICAKKyAgLy8gZHluYW1pYyBhbGxvY2F0aW9uLCBzaW5nbGUgb2JqZWN0CisgIGZvciAoaW50IGk9MDsgaTxnX3JlcGVhdCoxMDA7ICsraSkKKyAgeworICAgIE15U3RydWN0ICpmb28wID0gbmV3IE15U3RydWN0KCk7ICBWRVJJRlkoc2l6ZV90KGZvbzAtPmF2ZWMuZGF0YSgpKSVBTElHTk1FTlQ9PTApOworICAgIE15Q2xhc3NBICpmb29BID0gbmV3IE15Q2xhc3NBKCk7ICBWRVJJRlkoc2l6ZV90KGZvb0EtPmF2ZWMuZGF0YSgpKSVBTElHTk1FTlQ9PTApOworICAgIGRlbGV0ZSBmb28wOworICAgIGRlbGV0ZSBmb29BOworICB9CisKKyAgLy8gZHluYW1pYyBhbGxvY2F0aW9uLCBhcnJheQorICBjb25zdCBpbnQgTiA9IDEwOworICBmb3IgKGludCBpPTA7IGk8Z19yZXBlYXQqMTAwOyArK2kpCisgIHsKKyAgICBNeVN0cnVjdCAqZm9vMCA9IG5ldyBNeVN0cnVjdFtOXTsgIFZFUklGWShzaXplX3QoZm9vMC0+YXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7CisgICAgTXlDbGFzc0EgKmZvb0EgPSBuZXcgTXlDbGFzc0FbTl07ICBWRVJJRlkoc2l6ZV90KGZvb0EtPmF2ZWMuZGF0YSgpKSVBTElHTk1FTlQ9PTApOworICAgIGRlbGV0ZVtdIGZvbzA7CisgICAgZGVsZXRlW10gZm9vQTsKKyAgfQorICAjZW5kaWYKKyAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvZWlnZW4yL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTMxZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYwIEBACithZGRfY3VzdG9tX3RhcmdldChlaWdlbjJfYnVpbGR0ZXN0cykKK2FkZF9jdXN0b21fdGFyZ2V0KGVpZ2VuMl9jaGVjayBDT01NQU5EICJjdGVzdCAtUiBlaWdlbjIiKQorYWRkX2RlcGVuZGVuY2llcyhlaWdlbjJfY2hlY2sgZWlnZW4yX2J1aWxkdGVzdHMpCithZGRfZGVwZW5kZW5jaWVzKGJ1aWxkdGVzdHMgZWlnZW4yX2J1aWxkdGVzdHMpCisKK2FkZF9kZWZpbml0aW9ucygiLURFSUdFTjJfU1VQUE9SVF9TVEFHRTEwX0ZVTExfRUlHRU4yX0FQSSIpCisKK2VpX2FkZF90ZXN0KGVpZ2VuMl9tZXRhKQorZWlfYWRkX3Rlc3QoZWlnZW4yX3NpemVvZikKK2VpX2FkZF90ZXN0KGVpZ2VuMl9keW5hbGxvYykKK2VpX2FkZF90ZXN0KGVpZ2VuMl9ub21hbGxvYykKKyNlaV9hZGRfdGVzdChlaWdlbjJfZmlyc3RfYWxpZ25lZCkKK2VpX2FkZF90ZXN0KGVpZ2VuMl9taXhpbmd0eXBlcykKKyNlaV9hZGRfdGVzdChlaWdlbjJfcGFja2V0bWF0aCkKK2VpX2FkZF90ZXN0KGVpZ2VuMl91bmFsaWduZWRhc3NlcnQpCisjZWlfYWRkX3Rlc3QoZWlnZW4yX3ZlY3Rvcml6YXRpb25fbG9naWMpCitlaV9hZGRfdGVzdChlaWdlbjJfYmFzaWNzdHVmZikKK2VpX2FkZF90ZXN0KGVpZ2VuMl9saW5lYXJzdHJ1Y3R1cmUpCitlaV9hZGRfdGVzdChlaWdlbjJfY3dpc2VvcCkKK2VpX2FkZF90ZXN0KGVpZ2VuMl9zdW0pCitlaV9hZGRfdGVzdChlaWdlbjJfcHJvZHVjdF9zbWFsbCkKK2VpX2FkZF90ZXN0KGVpZ2VuMl9wcm9kdWN0X2xhcmdlICR7RUlfT0ZMQUd9KQorZWlfYWRkX3Rlc3QoZWlnZW4yX2Fkam9pbnQpCitlaV9hZGRfdGVzdChlaWdlbjJfc3VibWF0cmljZXMpCitlaV9hZGRfdGVzdChlaWdlbjJfbWlzY21hdHJpY2VzKQorZWlfYWRkX3Rlc3QoZWlnZW4yX2NvbW1haW5pdGlhbGl6ZXIpCitlaV9hZGRfdGVzdChlaWdlbjJfc21hbGx2ZWN0b3JzKQorZWlfYWRkX3Rlc3QoZWlnZW4yX21hcCkKK2VpX2FkZF90ZXN0KGVpZ2VuMl9hcnJheSkKK2VpX2FkZF90ZXN0KGVpZ2VuMl90cmlhbmd1bGFyKQorZWlfYWRkX3Rlc3QoZWlnZW4yX2Nob2xlc2t5ICIgIiAiJHtHU0xfTElCUkFSSUVTfSIpCitlaV9hZGRfdGVzdChlaWdlbjJfbHUgJHtFSV9PRkxBR30pCitlaV9hZGRfdGVzdChlaWdlbjJfZGV0ZXJtaW5hbnQgJHtFSV9PRkxBR30pCitlaV9hZGRfdGVzdChlaWdlbjJfaW52ZXJzZSkKK2VpX2FkZF90ZXN0KGVpZ2VuMl9xcikKK2VpX2FkZF90ZXN0KGVpZ2VuMl9laWdlbnNvbHZlciAiICIgIiR7R1NMX0xJQlJBUklFU30iKQorZWlfYWRkX3Rlc3QoZWlnZW4yX3N2ZCkKK2VpX2FkZF90ZXN0KGVpZ2VuMl9nZW9tZXRyeSkKK2VpX2FkZF90ZXN0KGVpZ2VuMl9nZW9tZXRyeV93aXRoX2VpZ2VuMl9wcmVmaXgpCitlaV9hZGRfdGVzdChlaWdlbjJfaHlwZXJwbGFuZSkKK2VpX2FkZF90ZXN0KGVpZ2VuMl9wYXJhbWV0cml6ZWRsaW5lKQorZWlfYWRkX3Rlc3QoZWlnZW4yX2FsaWduZWRib3gpCitlaV9hZGRfdGVzdChlaWdlbjJfcmVncmVzc2lvbikKK2VpX2FkZF90ZXN0KGVpZ2VuMl9zdGR2ZWN0b3IpCitlaV9hZGRfdGVzdChlaWdlbjJfbmV3c3RkdmVjdG9yKQoraWYoUVQ0X0ZPVU5EKQorICBlaV9hZGRfdGVzdChlaWdlbjJfcXR2ZWN0b3IgIiAiICIke1FUX1FUQ09SRV9MSUJSQVJZfSIpCitlbmRpZihRVDRfRk9VTkQpCisjIG5vIHN1cHBvcnQgZm9yIGVpZ2VuMiBzcGFyc2UgbW9kdWxlCisjIGlmKE5PVCBFSUdFTl9ERUZBVUxUX1RPX1JPV19NQUpPUikKKyMgICBlaV9hZGRfdGVzdChlaWdlbjJfc3BhcnNlX3ZlY3RvcikKKyMgICBlaV9hZGRfdGVzdChlaWdlbjJfc3BhcnNlX2Jhc2ljKQorIyAgIGVpX2FkZF90ZXN0KGVpZ2VuMl9zcGFyc2Vfc29sdmVycyAiICIgIiR7U1BBUlNFX0xJQlN9IikKKyMgICBlaV9hZGRfdGVzdChlaWdlbjJfc3BhcnNlX3Byb2R1Y3QpCisjIGVuZGlmKCkKK2VpX2FkZF90ZXN0KGVpZ2VuMl9zd2FwKQorZWlfYWRkX3Rlc3QoZWlnZW4yX3Zpc2l0b3IpCitlaV9hZGRfdGVzdChlaWdlbjJfYnVnXzEzMikKKworZWlfYWRkX3Rlc3QoZWlnZW4yX3ByZWNfaW52ZXJzZV80eDQgJHtFSV9PRkxBR30pCmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfYWRqb2ludC5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfYWRqb2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjOWM5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9hZGpvaW50LmNwcApAQCAtMCwwICsxLDEwMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBhZGpvaW50KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgVHJhbnNwb3NlLmggQ29uanVnYXRlLmggRG90LmgKKyAgKi8KKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFNxdWFyZU1hdHJpeFR5cGU7CisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgUmVhbFNjYWxhciBsYXJnZXJFcHMgPSB0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpOworICBpZiAoZWlfaXNfc2FtZV90eXBlPFJlYWxTY2FsYXIsZmxvYXQ+OjpyZXQpCisgICAgbGFyZ2VyRXBzID0gUmVhbFNjYWxhcigxZS0zZik7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtemVybyA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyksCisgICAgICAgICAgICAgaWRlbnRpdHkgPSBTcXVhcmVNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKSwKKyAgICAgICAgICAgICBzcXVhcmUgPSBTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgcm93cyk7CisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdjMgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdnplcm8gPSBWZWN0b3JUeXBlOjpaZXJvKHJvd3MpOworCisgIFNjYWxhciBzMSA9IGVpX3JhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICBzMiA9IGVpX3JhbmRvbTxTY2FsYXI+KCk7CisKKyAgLy8gY2hlY2sgYmFzaWMgY29tcGF0aWJpbGl0eSBvZiBhZGpvaW50LCB0cmFuc3Bvc2UsIGNvbmp1Z2F0ZQorICBWRVJJRllfSVNfQVBQUk9YKG0xLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpLmFkam9pbnQoKSwgICAgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFkam9pbnQoKS5jb25qdWdhdGUoKS50cmFuc3Bvc2UoKSwgICAgbTEpOworCisgIC8vIGNoZWNrIG11bHRpcGxpY2F0aXZlIGJlaGF2aW9yCisgIFZFUklGWV9JU19BUFBST1goKG0xLmFkam9pbnQoKSAqIG0yKS5hZGpvaW50KCksICAgICAgICAgICBtMi5hZGpvaW50KCkgKiBtMSk7CisgIFZFUklGWV9JU19BUFBST1goKHMxICogbTEpLmFkam9pbnQoKSwgICAgICAgICAgICAgICAgICAgICBlaV9jb25qKHMxKSAqIG0xLmFkam9pbnQoKSk7CisKKyAgLy8gY2hlY2sgYmFzaWMgcHJvcGVydGllcyBvZiBkb3QsIG5vcm0sIG5vcm0yCisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgVkVSSUZZKGVpX2lzQXBwcm94KChzMSAqIHYxICsgczIgKiB2MikuZWlnZW4yX2RvdCh2MyksICAgczEgKiB2MS5laWdlbjJfZG90KHYzKSArIHMyICogdjIuZWlnZW4yX2RvdCh2MyksIGxhcmdlckVwcykpOworICBWRVJJRlkoZWlfaXNBcHByb3godjMuZWlnZW4yX2RvdChzMSAqIHYxICsgczIgKiB2MiksICAgICBlaV9jb25qKHMxKSp2My5laWdlbjJfZG90KHYxKStlaV9jb25qKHMyKSp2My5laWdlbjJfZG90KHYyKSwgbGFyZ2VyRXBzKSk7CisgIFZFUklGWV9JU19BUFBST1goZWlfY29uaih2MS5laWdlbjJfZG90KHYyKSksICAgICAgICAgICAgICAgdjIuZWlnZW4yX2RvdCh2MSkpOworICBWRVJJRllfSVNfQVBQUk9YKGVpX3JlYWwodjEuZWlnZW4yX2RvdCh2MSkpLCAgICAgICAgICAgICAgIHYxLnNxdWFyZWROb3JtKCkpOworICBpZihOdW1UcmFpdHM8U2NhbGFyPjo6SGFzRmxvYXRpbmdQb2ludCkKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLnNxdWFyZWROb3JtKCksICAgICAgICAgICAgICAgICAgICAgIHYxLm5vcm0oKSAqIHYxLm5vcm0oKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihlaV9hYnModnplcm8uZWlnZW4yX2RvdCh2MSkpLCAgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMSkpOworICBpZihOdW1UcmFpdHM8U2NhbGFyPjo6SGFzRmxvYXRpbmdQb2ludCkKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odnplcm8ubm9ybSgpLCAgICAgICAgIHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDEpKTsKKworICAvLyBjaGVjayBjb21wYXRpYmlsaXR5IG9mIGRvdCBhbmQgYWRqb2ludAorICBWRVJJRlkoZWlfaXNBcHByb3godjEuZWlnZW4yX2RvdChzcXVhcmUgKiB2MiksIChzcXVhcmUuYWRqb2ludCgpICogdjEpLmVpZ2VuMl9kb3QodjIpLCBsYXJnZXJFcHMpKTsKKworICAvLyBsaWtlIGluIHRlc3RCYXNpY1N0dWZmLCB0ZXN0IG9wZXJhdG9yKCkgdG8gY2hlY2sgY29uc3QtcXVhbGlmaWNhdGlvbgorICBpbnQgciA9IGVpX3JhbmRvbTxpbnQ+KDAsIHJvd3MtMSksCisgICAgICBjID0gZWlfcmFuZG9tPGludD4oMCwgY29scy0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb25qdWdhdGUoKShyLGMpLCBlaV9jb25qKG0xKHIsYykpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hZGpvaW50KCkoYyxyKSwgZWlfY29uaihtMShyLGMpKSk7CisKKyAgaWYoTnVtVHJhaXRzPFNjYWxhcj46Okhhc0Zsb2F0aW5nUG9pbnQpCisgIHsKKyAgICAvLyBjaGVjayB0aGF0IFJhbmRvbSgpLm5vcm1hbGl6ZWQoKSB3b3JrczogdHJpY2t5IGFzIHRoZSByYW5kb20geHByIG11c3QgYmUgZXZhbHVhdGVkIGJ5CisgICAgLy8gbm9ybWFsaXplZCgpIGluIG9yZGVyIHRvIHByb2R1Y2UgYSBjb25zaXN0ZW50IHJlc3VsdC4KKyAgICBWRVJJRllfSVNfQVBQUk9YKFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKS5ub3JtYWxpemVkKCkubm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKKyAgfQorCisgIC8vIGNoZWNrIGlucGxhY2UgdHJhbnNwb3NlCisgIG0zID0gbTE7CisgIG0zLnRyYW5zcG9zZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMS50cmFuc3Bvc2UoKSk7CisgIG0zLnRyYW5zcG9zZUluUGxhY2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMSk7CisgIAorfQorCit2b2lkIHRlc3RfZWlnZW4yX2Fkam9pbnQoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBhZGpvaW50KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggYWRqb2ludChNYXRyaXgzZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBhZGpvaW50KE1hdHJpeDRmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGFkam9pbnQoTWF0cml4WGNmKDQsIDQpKSApOworICAgIENBTExfU1VCVEVTVF81KCBhZGpvaW50KE1hdHJpeFhpKDgsIDEyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggYWRqb2ludChNYXRyaXhYZigyMSwgMjEpKSApOworICB9CisgIC8vIHRlc3QgYSBsYXJnZSBtYXRyaXggb25seSBvbmNlCisgIENBTExfU1VCVEVTVF83KCBhZGpvaW50KE1hdHJpeDxmbG9hdCwgMTAwLCAxMDA+KCkpICk7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9hbGlnbmVkYm94LmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9hbGlnbmVkYm94LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA0M2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX2FsaWduZWRib3guY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK3RlbXBsYXRlPHR5cGVuYW1lIEJveFR5cGU+IHZvaWQgYWxpZ25lZGJveChjb25zdCBCb3hUeXBlJiBfYm94KQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIEFsaWduZWRCb3guaAorICAqLworCisgIGNvbnN0IGludCBkaW0gPSBfYm94LmRpbSgpOworICB0eXBlZGVmIHR5cGVuYW1lIEJveFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBCb3hUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBWZWN0b3JUeXBlIHAwID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CisgIFZlY3RvclR5cGUgcDEgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKyAgUmVhbFNjYWxhciBzMSA9IGVpX3JhbmRvbTxSZWFsU2NhbGFyPigwLDEpOworCisgIEJveFR5cGUgYjAoZGltKTsKKyAgQm94VHlwZSBiMShWZWN0b3JUeXBlOjpSYW5kb20oZGltKSxWZWN0b3JUeXBlOjpSYW5kb20oZGltKSk7CisgIEJveFR5cGUgYjI7CisKKyAgYjAuZXh0ZW5kKHAwKTsKKyAgYjAuZXh0ZW5kKHAxKTsKKyAgVkVSSUZZKGIwLmNvbnRhaW5zKHAwKnMxKyhTY2FsYXIoMSktczEpKnAxKSk7CisgIFZFUklGWSghYjAuY29udGFpbnMocDAgKyAoMStzMSkqKHAxLXAwKSkpOworCisgIChiMiA9IGIwKS5leHRlbmQoYjEpOworICBWRVJJRlkoYjIuY29udGFpbnMoYjApKTsKKyAgVkVSSUZZKGIyLmNvbnRhaW5zKGIxKSk7CisgIFZFUklGWV9JU19BUFBST1goYjIuY2xhbXAoYjApLCBiMCk7CisKKyAgLy8gY2FzdGluZworICBjb25zdCBpbnQgRGltID0gQm94VHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWU7CisgIHR5cGVkZWYgdHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxTY2FsYXI+Ojp0eXBlIE90aGVyU2NhbGFyOworICBBbGlnbmVkQm94PE90aGVyU2NhbGFyLERpbT4gaHAxZiA9IGIwLnRlbXBsYXRlIGNhc3Q8T3RoZXJTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxiMCk7CisgIEFsaWduZWRCb3g8U2NhbGFyLERpbT4gaHAxZCA9IGIwLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YKGhwMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksYjApOworfQorCit2b2lkIHRlc3RfZWlnZW4yX2FsaWduZWRib3goKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBhbGlnbmVkYm94KEFsaWduZWRCb3g8ZmxvYXQsMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggYWxpZ25lZGJveChBbGlnbmVkQm94PGZsb2F0LDM+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGFsaWduZWRib3goQWxpZ25lZEJveDxkb3VibGUsND4oKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2FycmF5LmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9hcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmZjQwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9hcnJheS5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vQXJyYXk+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgYXJyYXkoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBBcnJheS5jcHAKKyAgKi8KKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBpbnQgcm93cyA9IG0ucm93cygpOworICBpbnQgY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyk7CisKKyAgU2NhbGFyICBzMSA9IGVpX3JhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICAgczIgPSBlaV9yYW5kb208U2NhbGFyPigpOworCisgIC8vIHNjYWxhciBhZGRpdGlvbgorICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlKCkgKyBzMSwgczEgKyBtMS5jd2lzZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpICsgczEsIE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxzMSkgKyBtMSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xKlNjYWxhcigyKSkuY3dpc2UoKSAtIHMyLCAobTErbTEpIC0gTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMyKSApOworICBtMyA9IG0xOworICBtMy5jd2lzZSgpICs9IHMyOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMS5jd2lzZSgpICsgczIpOworICBtMyA9IG0xOworICBtMy5jd2lzZSgpIC09IHMxOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMS5jd2lzZSgpIC0gczEpOworCisgIC8vIHJlZHVjdGlvbnMKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2x3aXNlKCkuc3VtKCkuc3VtKCksIG0xLnN1bSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5yb3d3aXNlKCkuc3VtKCkuc3VtKCksIG0xLnN1bSgpKTsKKyAgaWYgKCFlaV9pc0FwcHJveChtMS5zdW0oKSwgKG0xK20yKS5zdW0oKSkpCisgICAgVkVSSUZZX0lTX05PVF9BUFBST1goKChtMSttMikucm93d2lzZSgpLnN1bSgpKS5zdW0oKSwgbTEuc3VtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbHdpc2UoKS5zdW0oKSwgbTEuY29sd2lzZSgpLnJlZHV4KGludGVybmFsOjpzY2FsYXJfc3VtX29wPFNjYWxhcj4oKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNvbXBhcmlzb25zKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgaW50IHIgPSBlaV9yYW5kb208aW50PigwLCByb3dzLTEpLAorICAgICAgYyA9IGVpX3JhbmRvbTxpbnQ+KDAsIGNvbHMtMSk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKworICBWRVJJRlkoKChtMS5jd2lzZSgpICsgU2NhbGFyKDEpKS5jd2lzZSgpID4gbTEpLmFsbCgpKTsKKyAgVkVSSUZZKCgobTEuY3dpc2UoKSAtIFNjYWxhcigxKSkuY3dpc2UoKSA8IG0xKS5hbGwoKSk7CisgIGlmIChyb3dzKmNvbHM+MSkKKyAgeworICAgIG0zID0gbTE7CisgICAgbTMocixjKSArPSAxOworICAgIFZFUklGWSghIChtMS5jd2lzZSgpIDwgbTMpLmFsbCgpICk7CisgICAgVkVSSUZZKCEgKG0xLmN3aXNlKCkgPiBtMykuYWxsKCkgKTsKKyAgfQorICAKKyAgLy8gY29tcGFyaXNvbnMgdG8gc2NhbGFyCisgIFZFUklGWSggKG0xLmN3aXNlKCkgIT0gKG0xKHIsYykrMSkgKS5hbnkoKSApOworICBWRVJJRlkoIChtMS5jd2lzZSgpID4gKG0xKHIsYyktMSkgKS5hbnkoKSApOworICBWRVJJRlkoIChtMS5jd2lzZSgpIDwgKG0xKHIsYykrMSkgKS5hbnkoKSApOworICBWRVJJRlkoIChtMS5jd2lzZSgpID09IG0xKHIsYykgKS5hbnkoKSApOworICAKKyAgLy8gdGVzdCBTZWxlY3QKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmN3aXNlKCk8bTIpLnNlbGVjdChtMSxtMiksIG0xLmN3aXNlKCkubWluKG0yKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAobTEuY3dpc2UoKT5tMikuc2VsZWN0KG0xLG0yKSwgbTEuY3dpc2UoKS5tYXgobTIpICk7CisgIFNjYWxhciBtaWQgPSAobTEuY3dpc2UoKS5hYnMoKS5taW5Db2VmZigpICsgbTEuY3dpc2UoKS5hYnMoKS5tYXhDb2VmZigpKS9TY2FsYXIoMik7CisgIGZvciAoaW50IGo9MDsgajxjb2xzOyArK2opCisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCisgICAgbTMoaSxqKSA9IGVpX2FicyhtMShpLGopKTxtaWQgPyAwIDogbTEoaSxqKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmN3aXNlKCkuYWJzKCkuY3dpc2UoKTxNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsbWlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpLG0xKSwgbTMpOworICAvLyBzaG9ydGVyIHZlcnNpb25zOgorICBWRVJJRllfSVNfQVBQUk9YKCAobTEuY3dpc2UoKS5hYnMoKS5jd2lzZSgpPE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxtaWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgwLG0xKSwgbTMpOworICBWRVJJRllfSVNfQVBQUk9YKCAobTEuY3dpc2UoKS5hYnMoKS5jd2lzZSgpPj1NYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsbWlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QobTEsMCksIG0zKTsKKyAgLy8gZXZlbiBzaG9ydGVyIHZlcnNpb246CisgIFZFUklGWV9JU19BUFBST1goIChtMS5jd2lzZSgpLmFicygpLmN3aXNlKCk8bWlkKS5zZWxlY3QoMCxtMSksIG0zKTsKKyAgCisgIC8vIGNvdW50CisgIFZFUklGWSgoKG0xLmN3aXNlKCkuYWJzKCkuY3dpc2UoKSsxKS5jd2lzZSgpPlJlYWxTY2FsYXIoMC4xKSkuY291bnQoKSA9PSByb3dzKmNvbHMpOworICBWRVJJRllfSVNfQVBQUk9YKCgobTEuY3dpc2UoKS5hYnMoKS5jd2lzZSgpKzEpLmN3aXNlKCk+UmVhbFNjYWxhcigwLjEpKS5jb2x3aXNlKCkuY291bnQoKS50ZW1wbGF0ZSBjYXN0PGludD4oKSwgUm93VmVjdG9yWGk6OkNvbnN0YW50KGNvbHMscm93cykpOworICBWRVJJRllfSVNfQVBQUk9YKCgobTEuY3dpc2UoKS5hYnMoKS5jd2lzZSgpKzEpLmN3aXNlKCk+UmVhbFNjYWxhcigwLjEpKS5yb3d3aXNlKCkuY291bnQoKS50ZW1wbGF0ZSBjYXN0PGludD4oKSwgVmVjdG9yWGk6OkNvbnN0YW50KHJvd3MsIGNvbHMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4gdm9pZCBscE5vcm0oY29uc3QgVmVjdG9yVHlwZSYgdikKK3sKKyAgVmVjdG9yVHlwZSB1ID0gVmVjdG9yVHlwZTo6UmFuZG9tKHYuc2l6ZSgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHUudGVtcGxhdGUgbHBOb3JtPEluZmluaXR5PigpLCB1LmN3aXNlKCkuYWJzKCkubWF4Q29lZmYoKSk7CisgIFZFUklGWV9JU19BUFBST1godS50ZW1wbGF0ZSBscE5vcm08MT4oKSwgdS5jd2lzZSgpLmFicygpLnN1bSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh1LnRlbXBsYXRlIGxwTm9ybTwyPigpLCBlaV9zcXJ0KHUuY3dpc2UoKS5hYnMoKS5jd2lzZSgpLnNxdWFyZSgpLnN1bSgpKSk7CisgIFZFUklGWV9JU19BUFBST1goZWlfcG93KHUudGVtcGxhdGUgbHBOb3JtPDU+KCksIHR5cGVuYW1lIFZlY3RvclR5cGU6OlJlYWxTY2FsYXIoNSkpLCB1LmN3aXNlKCkuYWJzKCkuY3dpc2UoKS5wb3coNSkuc3VtKCkpOworfQorCit2b2lkIHRlc3RfZWlnZW4yX2FycmF5KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggYXJyYXkoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBhcnJheShNYXRyaXgyZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBhcnJheShNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBhcnJheShNYXRyaXhYY2YoMywgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGFycmF5KE1hdHJpeFhmKDgsIDEyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggYXJyYXkoTWF0cml4WGkoOCwgMTIpKSApOworICB9CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGNvbXBhcmlzb25zKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggY29tcGFyaXNvbnMoTWF0cml4MmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggY29tcGFyaXNvbnMoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggY29tcGFyaXNvbnMoTWF0cml4WGYoOCwgMTIpKSApOworICAgIENBTExfU1VCVEVTVF82KCBjb21wYXJpc29ucyhNYXRyaXhYaSg4LCAxMikpICk7CisgIH0KKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggbHBOb3JtKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbHBOb3JtKFZlY3RvcjJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGxwTm9ybShWZWN0b3IzZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBscE5vcm0oVmVjdG9yNGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbHBOb3JtKFZlY3RvclhmKDE2KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggbHBOb3JtKFZlY3RvclhjZCgxMCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9iYXNpY3N0dWZmLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9iYXNpY3N0dWZmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmExNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX2Jhc2ljc3R1ZmYuY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGJhc2ljU3R1ZmYoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBpZGVudGl0eSA9IE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6SWRlbnRpdHkocm93cywgcm93cyksCisgICAgICAgICAgICAgc3F1YXJlID0gTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjo6UmFuZG9tKHJvd3MsIHJvd3MpOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHYyID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHZ6ZXJvID0gVmVjdG9yVHlwZTo6WmVybyhyb3dzKTsKKworICBTY2FsYXIgeCA9IGVpX3JhbmRvbTxTY2FsYXI+KCk7CisKKyAgaW50IHIgPSBlaV9yYW5kb208aW50PigwLCByb3dzLTEpLAorICAgICAgYyA9IGVpX3JhbmRvbTxpbnQ+KDAsIGNvbHMtMSk7CisKKyAgbTEuY29lZmZSZWYocixjKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgbTEuY29lZmYocixjKSk7CisgIG0xKHIsYykgPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHgsIG0xKHIsYykpOworICB2MS5jb2VmZlJlZihyKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgdjEuY29lZmYocikpOworICB2MShyKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgdjEocikpOworICB2MVtyXSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgdjFbcl0pOworCisgIFZFUklGWV9JU19BUFBST1goICAgICAgICAgICAgICAgdjEsICAgIHYxKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1goICAgICAgICAgICB2MSwgICAgMip2MSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggICAgdnplcm8sIHYxKTsKKyAgaWYoTnVtVHJhaXRzPFNjYWxhcj46Okhhc0Zsb2F0aW5nUG9pbnQpCisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCAgdnplcm8sIHYxLm5vcm0oKSk7CisgIFZFUklGWV9JU19OT1RfTVVDSF9TTUFMTEVSX1RIQU4odjEsICAgIHYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICB2emVybywgdjEtdjEpOworICBWRVJJRllfSVNfQVBQUk9YKCAgICAgICAgICAgICAgIG0xLCAgICBtMSk7CisgIFZFUklGWV9JU19OT1RfQVBQUk9YKCAgICAgICAgICAgbTEsICAgIDIqbTEpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oICAgIG16ZXJvLCBtMSk7CisgIFZFUklGWV9JU19OT1RfTVVDSF9TTUFMTEVSX1RIQU4obTEsICAgIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICBtemVybywgbTEtbTEpOworCisgIC8vIGFsd2F5cyB0ZXN0IG9wZXJhdG9yKCkgb24gZWFjaCByZWFkLW9ubHkgZXhwcmVzc2lvbiBjbGFzcywKKyAgLy8gaW4gb3JkZXIgdG8gY2hlY2sgY29uc3QtcXVhbGlmaWVycy4KKyAgLy8gaW5kZWVkLCBpZiBhbiBleHByZXNzaW9uIGNsYXNzIChoZXJlIFplcm8pIGlzIG1lYW50IHRvIGJlIHJlYWQtb25seSwKKyAgLy8gaGVuY2UgaGFzIG5vIF93cml0ZSgpIG1ldGhvZCwgdGhlIGNvcnJlc3BvbmRpbmcgTWF0cml4QmFzZSBtZXRob2QgKGhlcmUgemVybygpKQorICAvLyBzaG91bGQgcmV0dXJuIGEgY29uc3QtcXVhbGlmaWVkIG9iamVjdCBzbyB0aGF0IGl0IGlzIHRoZSBjb25zdC1xdWFsaWZpZWQKKyAgLy8gb3BlcmF0b3IoKSB0aGF0IGdldHMgY2FsbGVkLCB3aGljaCBpbiB0dXJuIGNhbGxzIF9yZWFkKCkuCisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykocixjKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigxKSk7CisKKyAgLy8gbm93IHRlc3QgY29weWluZyBhIHJvdy12ZWN0b3IgaW50byBhIChjb2x1bW4tKXZlY3RvciBhbmQgY29udmVyc2VseS4KKyAgc3F1YXJlLmNvbChyKSA9IHNxdWFyZS5yb3cocikuZXZhbCgpOworICBNYXRyaXg8U2NhbGFyLCAxLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gcnYocm93cyk7CisgIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBjdihyb3dzKTsKKyAgcnYgPSBzcXVhcmUucm93KHIpOworICBjdiA9IHNxdWFyZS5jb2wocik7CisgIFZFUklGWV9JU19BUFBST1gocnYsIGN2LnRyYW5zcG9zZSgpKTsKKworICBpZihjb2xzIT0xICYmIHJvd3MhPTEgJiYgTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUR5bmFtaWMpCisgIHsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMSA9IChtMi5ibG9jaygwLDAsIHJvd3MtMSwgY29scy0xKSkpOworICB9CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyA9IG0xLG0xKTsKKyAgTWF0cml4VHlwZSBtNDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IG0xLG0xKTsKKworICAvLyB0ZXN0IHN3YXAKKyAgbTMgPSBtMTsKKyAgbTEuc3dhcChtMik7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0yKTsKKyAgaWYocm93cypjb2xzPj0zKQorICB7CisgICAgVkVSSUZZX0lTX05PVF9BUFBST1gobTMsIG0xKTsKKyAgfQorfQorCit2b2lkIHRlc3RfZWlnZW4yX2Jhc2ljc3R1ZmYoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBiYXNpY1N0dWZmKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggYmFzaWNTdHVmZihNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBiYXNpY1N0dWZmKE1hdHJpeFhjZigzLCAzKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggYmFzaWNTdHVmZihNYXRyaXhYaSg4LCAxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGJhc2ljU3R1ZmYoTWF0cml4WGNkKDIwLCAyMCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGJhc2ljU3R1ZmYoTWF0cml4PGZsb2F0LCAxMDAsIDEwMD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggYmFzaWNTdHVmZihNYXRyaXg8bG9uZyBkb3VibGUsRHluYW1pYyxEeW5hbWljPigxMCwxMCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9idWdfMTMyLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9idWdfMTMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmUzNjEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX2J1Z18xMzIuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit2b2lkIHRlc3RfZWlnZW4yX2J1Z18xMzIoKSB7CisgIGludCBzaXplID0gMTAwOworICBNYXRyaXhYZCBBKHNpemUsIHNpemUpOworICBWZWN0b3JYZCBiKHNpemUpLCBjKHNpemUpOworICB7CisgICAgVmVjdG9yWGQgeSA9IEEudHJhbnNwb3NlKCkgKiAoYi1jKTsgIC8vIGJ1ZyAxMzI6IGluZmluaXRlIHJlY3Vyc2lvbiBpbiBjb2VmZlJlZgorICAgIFZlY3RvclhkIHogPSAoYi1jKS50cmFuc3Bvc2UoKSAqIEE7ICAvLyBidWcgMTMyOiBpbmZpbml0ZSByZWN1cnNpb24gaW4gY29lZmZSZWYKKyAgfQorCisgIC8vIHRoZSBmb2xsb3dpbmcgb25lcyB3ZXJlbid0IGZhaWxpbmcsIGJ1dCBsZXQncyBpbmNsdWRlIHRoZW0gZm9yIGNvbXBsZXRlbmVzczoKKyAgeworICAgIFZlY3RvclhkIHkgPSBBICogKGItYyk7CisgICAgVmVjdG9yWGQgeiA9IChiLWMpLnRyYW5zcG9zZSgpICogQS50cmFuc3Bvc2UoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2Nob2xlc2t5LmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9jaG9sZXNreS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0YjZmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9jaG9sZXNreS5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorCisjaWZkZWYgSEFTX0dTTAorI2luY2x1ZGUgImdzbF9oZWxwZXIuaCIKKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNob2xlc2t5KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgTExULmggTERMVC5oCisgICovCisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIE1hdHJpeFR5cGUgYTAgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgVmVjdG9yVHlwZSB2ZWNCID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCB2ZWNYKHJvd3MpOworICBNYXRyaXhUeXBlIG1hdEIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwgbWF0WChyb3dzLGNvbHMpOworICBTcXVhcmVNYXRyaXhUeXBlIHN5bW0gPSAgYTAgKiBhMC5hZGpvaW50KCk7CisgIC8vIGxldCdzIG1ha2Ugc3VyZSB0aGUgbWF0cml4IGlzIG5vdCBzaW5ndWxhciBvciBuZWFyIHNpbmd1bGFyCisgIE1hdHJpeFR5cGUgYTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgc3ltbSArPSBhMSAqIGExLmFkam9pbnQoKTsKKworICAjaWZkZWYgSEFTX0dTTAorICBpZiAoZWlfaXNfc2FtZV90eXBlPFJlYWxTY2FsYXIsZG91YmxlPjo6cmV0KQorICB7CisgICAgdHlwZWRlZiBHc2xUcmFpdHM8U2NhbGFyPiBHc2w7CisgICAgdHlwZW5hbWUgR3NsOjpNYXRyaXggZ01hdEE9MCwgZ1N5bW09MDsKKyAgICB0eXBlbmFtZSBHc2w6OlZlY3RvciBnVmVjQj0wLCBnVmVjWD0wOworICAgIGNvbnZlcnQ8TWF0cml4VHlwZT4oc3ltbSwgZ1N5bW0pOworICAgIGNvbnZlcnQ8TWF0cml4VHlwZT4oc3ltbSwgZ01hdEEpOworICAgIGNvbnZlcnQ8VmVjdG9yVHlwZT4odmVjQiwgZ1ZlY0IpOworICAgIGNvbnZlcnQ8VmVjdG9yVHlwZT4odmVjQiwgZ1ZlY1gpOworICAgIEdzbDo6Y2hvbGVza3koZ01hdEEpOworICAgIEdzbDo6Y2hvbGVza3lfc29sdmUoZ01hdEEsIGdWZWNCLCBnVmVjWCk7CisgICAgVmVjdG9yVHlwZSB2ZWNYKHJvd3MpLCBfdmVjWCwgX3ZlY0I7CisgICAgY29udmVydChnVmVjWCwgX3ZlY1gpOworICAgIHN5bW0ubGx0KCkuc29sdmUodmVjQiwgJnZlY1gpOworICAgIEdzbDo6cHJvZChnU3ltbSwgZ1ZlY1gsIGdWZWNCKTsKKyAgICBjb252ZXJ0KGdWZWNCLCBfdmVjQik7CisgICAgLy8gdGVzdCBnc2wgaXRzZWxmICEKKyAgICBWRVJJRllfSVNfQVBQUk9YKHZlY0IsIF92ZWNCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHZlY1gsIF92ZWNYKTsKKworICAgIEdzbDo6ZnJlZShnTWF0QSk7CisgICAgR3NsOjpmcmVlKGdTeW1tKTsKKyAgICBHc2w6OmZyZWUoZ1ZlY0IpOworICAgIEdzbDo6ZnJlZShnVmVjWCk7CisgIH0KKyAgI2VuZGlmCisKKyAgeworICAgIExETFQ8U3F1YXJlTWF0cml4VHlwZT4gbGRsdChzeW1tKTsKKyAgICBWRVJJRlkobGRsdC5pc1Bvc2l0aXZlRGVmaW5pdGUoKSk7CisgICAgLy8gaW4gZWlnZW4zLCBMRExUIGlzIHBpdm90aW5nCisgICAgLy9WRVJJRllfSVNfQVBQUk9YKHN5bW0sIGxkbHQubWF0cml4TCgpICogbGRsdC52ZWN0b3JEKCkuYXNEaWFnb25hbCgpICogbGRsdC5tYXRyaXhMKCkuYWRqb2ludCgpKTsKKyAgICBsZGx0LnNvbHZlKHZlY0IsICZ2ZWNYKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiB2ZWNYLCB2ZWNCKTsKKyAgICBsZGx0LnNvbHZlKG1hdEIsICZtYXRYKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiBtYXRYLCBtYXRCKTsKKyAgfQorCisgIHsKKyAgICBMTFQ8U3F1YXJlTWF0cml4VHlwZT4gY2hvbChzeW1tKTsKKyAgICBWRVJJRlkoY2hvbC5pc1Bvc2l0aXZlRGVmaW5pdGUoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tLCBjaG9sLm1hdHJpeEwoKSAqIGNob2wubWF0cml4TCgpLmFkam9pbnQoKSk7CisgICAgY2hvbC5zb2x2ZSh2ZWNCLCAmdmVjWCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogdmVjWCwgdmVjQik7CisgICAgY2hvbC5zb2x2ZShtYXRCLCAmbWF0WCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tICogbWF0WCwgbWF0Qik7CisgIH0KKworI2lmIDAgLy8gY2hvbGVza3kgaXMgbm90IHJhbmstcmV2ZWFsaW5nIGFueXdheQorICAvLyB0ZXN0IGlzUG9zaXRpdmVEZWZpbml0ZSBvbiBub24gZGVmaW5pdGUgbWF0cml4CisgIGlmIChyb3dzPjQpCisgIHsKKyAgICBTcXVhcmVNYXRyaXhUeXBlIHN5bW0gPSAgYTAuYmxvY2soMCwwLHJvd3MsY29scy00KSAqIGEwLmJsb2NrKDAsMCxyb3dzLGNvbHMtNCkuYWRqb2ludCgpOworICAgIExMVDxTcXVhcmVNYXRyaXhUeXBlPiBjaG9sKHN5bW0pOworICAgIFZFUklGWSghY2hvbC5pc1Bvc2l0aXZlRGVmaW5pdGUoKSk7CisgICAgTERMVDxTcXVhcmVNYXRyaXhUeXBlPiBjaG9sbm9zcXJ0KHN5bW0pOworICAgIFZFUklGWSghY2hvbG5vc3FydC5pc1Bvc2l0aXZlRGVmaW5pdGUoKSk7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIHRlc3RfZWlnZW4yX2Nob2xlc2t5KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggY2hvbGVza3koTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGNob2xlc2t5KE1hdHJpeDJkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGNob2xlc2t5KE1hdHJpeDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGNob2xlc2t5KE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGNob2xlc2t5KE1hdHJpeFhjZCg3LDcpKSApOworICAgIENBTExfU1VCVEVTVF82KCBjaG9sZXNreShNYXRyaXhYZigxNywxNykpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIGNob2xlc2t5KE1hdHJpeFhkKDMzLDMzKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2NvbW1haW5pdGlhbGl6ZXIuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX2NvbW1haW5pdGlhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjkwMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfY29tbWFpbml0aWFsaXplci5jcHAKQEAgLTAsMCArMSw0NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordm9pZCB0ZXN0X2VpZ2VuMl9jb21tYWluaXRpYWxpemVyKCkKK3sKKyAgTWF0cml4M2QgbTM7CisgIE1hdHJpeDRkIG00OworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCAobTMgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCkgKTsKKyAgCisgICNpZm5kZWYgX01TQ19WRVIKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIChtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkgKTsKKyAgI2VuZGlmCisKKyAgZG91YmxlIGRhdGFbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5fTsKKyAgTWF0cml4M2QgcmVmID0gTWFwPE1hdHJpeDxkb3VibGUsMywzLFJvd01ham9yPiA+KGRhdGEpOworCisgIG0zID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5OworICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWYgKTsKKworICBWZWN0b3IzZCB2ZWNbM107CisgIHZlY1swXSA8PCAxLCA0LCA3OworICB2ZWNbMV0gPDwgMiwgNSwgODsKKyAgdmVjWzJdIDw8IDMsIDYsIDk7CisgIG0zID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtMyA8PCB2ZWNbMF0sIHZlY1sxXSwgdmVjWzJdOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWYpOworCisgIHZlY1swXSA8PCAxLCAyLCAzOworICB2ZWNbMV0gPDwgNCwgNSwgNjsKKyAgdmVjWzJdIDw8IDcsIDgsIDk7CisgIG0zID0gTWF0cml4M2Q6OlJhbmRvbSgpOworICBtMyA8PCB2ZWNbMF0udHJhbnNwb3NlKCksCisgICAgICAgIDQsIDUsIDYsCisgICAgICAgIHZlY1syXS50cmFuc3Bvc2UoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9jd2lzZW9wLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9jd2lzZW9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzkxZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX2N3aXNlb3AuY3BwCkBAIC0wLDAgKzEsMTU4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxFaWdlbi9BcnJheT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgQWRkSWZOdWxsIHsKKyAgICBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyIGEsIGNvbnN0IFNjYWxhciBiKSBjb25zdCB7cmV0dXJuIGE8PTFlLTMgPyBiIDogYTt9CisgICAgZW51bSB7IENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6QWRkQ29zdCB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjd2lzZW9wcyhjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBpbnQgcm93cyA9IG0ucm93cygpOworICBpbnQgY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyksCisgICAgICAgICAgICAgbTQocm93cywgY29scyksCisgICAgICAgICAgICAgbXplcm8gPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG1vbmVzID0gTWF0cml4VHlwZTo6T25lcyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBpZGVudGl0eSA9IE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6SWRlbnRpdHkocm93cywgcm93cyksCisgICAgICAgICAgICAgc3F1YXJlID0gTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjo6UmFuZG9tKHJvd3MsIHJvd3MpOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHYyID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHZ6ZXJvID0gVmVjdG9yVHlwZTo6WmVybyhyb3dzKSwKKyAgICAgICAgICAgICB2b25lcyA9IFZlY3RvclR5cGU6Ok9uZXMocm93cyksCisgICAgICAgICAgICAgdjMocm93cyk7CisKKyAgaW50IHIgPSBlaV9yYW5kb208aW50PigwLCByb3dzLTEpLAorICAgICAgYyA9IGVpX3JhbmRvbTxpbnQ+KDAsIGNvbHMtMSk7CisgIAorICBTY2FsYXIgczEgPSBlaV9yYW5kb208U2NhbGFyPigpOworICAKKyAgLy8gdGVzdCBaZXJvLCBPbmVzLCBDb25zdGFudCwgYW5kIHRoZSBzZXQqIHZhcmlhbnRzCisgIG0zID0gTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgczEpOworICBmb3IgKGludCBqPTA7IGo8Y29sczsgKytqKQorICAgIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCisgICAgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtemVybyhpLGopLCBTY2FsYXIoMCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtb25lcyhpLGopLCBTY2FsYXIoMSkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMyhpLGopLCBzMSk7CisgICAgfQorICBWRVJJRlkobXplcm8uaXNaZXJvKCkpOworICBWRVJJRlkobW9uZXMuaXNPbmVzKCkpOworICBWRVJJRlkobTMuaXNDb25zdGFudChzMSkpOworICBWRVJJRlkoaWRlbnRpdHkuaXNJZGVudGl0eSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNC5zZXRDb25zdGFudChzMSksIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNC5zZXRDb25zdGFudChyb3dzLGNvbHMsczEpLCBtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTQuc2V0WmVybygpLCBtemVybyk7CisgIFZFUklGWV9JU19BUFBST1gobTQuc2V0WmVybyhyb3dzLGNvbHMpLCBtemVybyk7CisgIFZFUklGWV9JU19BUFBST1gobTQuc2V0T25lcygpLCBtb25lcyk7CisgIFZFUklGWV9JU19BUFBST1gobTQuc2V0T25lcyhyb3dzLGNvbHMpLCBtb25lcyk7CisgIG00LmZpbGwoczEpOworICBWRVJJRllfSVNfQVBQUk9YKG00LCBtMyk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKHYzLnNldENvbnN0YW50KHJvd3MsIHMxKSwgVmVjdG9yVHlwZTo6Q29uc3RhbnQocm93cyxzMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHYzLnNldFplcm8ocm93cyksIHZ6ZXJvKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2My5zZXRPbmVzKHJvd3MpLCB2b25lcyk7CisKKyAgbTIgPSBtMi50ZW1wbGF0ZSBiaW5hcnlFeHByPEFkZElmTnVsbDxTY2FsYXI+ID4obW9uZXMpOworCisgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKS5wb3coMiksIG0xLmN3aXNlKCkuYWJzMigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpLnBvdygyKSwgbTEuY3dpc2UoKS5zcXVhcmUoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKS5wb3coMyksIG0xLmN3aXNlKCkuY3ViZSgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xICsgbW9uZXMsIG0xLmN3aXNlKCkrU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSAtIG1vbmVzLCBtMS5jd2lzZSgpLVNjYWxhcigxKSk7CisgIG0zID0gbTE7IG0zLmN3aXNlKCkgKz0gMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSArIG1vbmVzLCBtMyk7CisgIG0zID0gbTE7IG0zLmN3aXNlKCkgLT0gMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSAtIG1vbmVzLCBtMyk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTIuY3dpc2UoKSAqIG1vbmVzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpICogbTIsICBtMi5jd2lzZSgpICogbTEpOworICBtMyA9IG0xOworICBtMy5jd2lzZSgpICo9IG0yOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMS5jd2lzZSgpICogbTIpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWChtb25lcywgICAgbTIuY3dpc2UoKS9tMik7CisgIGlmKE51bVRyYWl0czxTY2FsYXI+OjpIYXNGbG9hdGluZ1BvaW50KQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpIC8gbTIsICAgIG0xLmN3aXNlKCkgKiAobTIuY3dpc2UoKS5pbnZlcnNlKCkpKTsKKyAgICBtMyA9IG0xLmN3aXNlKCkuYWJzKCkuY3dpc2UoKS5zcXJ0KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMy5jd2lzZSgpLnNxdWFyZSgpLCBtMS5jd2lzZSgpLmFicygpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlKCkuc3F1YXJlKCkuY3dpc2UoKS5zcXJ0KCksIG0xLmN3aXNlKCkuYWJzKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKS5hYnMoKS5jd2lzZSgpLmxvZygpLmN3aXNlKCkuZXhwKCkgLCBtMS5jd2lzZSgpLmFicygpKTsKKworICAgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKS5wb3coMiksIG0xLmN3aXNlKCkuc3F1YXJlKCkpOworICAgIG0zID0gKG0xLmN3aXNlKCkuYWJzKCkuY3dpc2UoKTw9UmVhbFNjYWxhcigwLjAxKSkuc2VsZWN0KG1vbmVzLG0xKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlKCkucG93KC0xKSwgbTMuY3dpc2UoKS5pbnZlcnNlKCkpOworICAgIG0zID0gbTEuY3dpc2UoKS5hYnMoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlKCkucG93KFJlYWxTY2FsYXIoMC41KSksIG0zLmN3aXNlKCkuc3FydCgpKTsKKyAgICAKKy8vICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlKCkudGFuKCksIG0xLmN3aXNlKCkuc2luKCkuY3dpc2UoKSAvIG0xLmN3aXNlKCkuY29zKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobW9uZXMsIG0xLmN3aXNlKCkuc2luKCkuY3dpc2UoKS5zcXVhcmUoKSArIG0xLmN3aXNlKCkuY29zKCkuY3dpc2UoKS5zcXVhcmUoKSk7CisgICAgbTMgPSBtMTsKKyAgICBtMy5jd2lzZSgpIC89IG0yOworICAgIFZFUklGWV9JU19BUFBST1gobTMsIG0xLmN3aXNlKCkgLyBtMik7CisgIH0KKworICAvLyBjaGVjayBtaW4KKyAgVkVSSUZZX0lTX0FQUFJPWCggbTEuY3dpc2UoKS5taW4obTIpLCBtMi5jd2lzZSgpLm1pbihtMSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggbTEuY3dpc2UoKS5taW4obTErbW9uZXMpLCBtMSApOworICBWRVJJRllfSVNfQVBQUk9YKCBtMS5jd2lzZSgpLm1pbihtMS1tb25lcyksIG0xLW1vbmVzICk7CisKKyAgLy8gY2hlY2sgbWF4CisgIFZFUklGWV9JU19BUFBST1goIG0xLmN3aXNlKCkubWF4KG0yKSwgbTIuY3dpc2UoKS5tYXgobTEpICk7CisgIFZFUklGWV9JU19BUFBST1goIG0xLmN3aXNlKCkubWF4KG0xLW1vbmVzKSwgbTEgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggbTEuY3dpc2UoKS5tYXgobTErbW9uZXMpLCBtMSttb25lcyApOworICAKKyAgVkVSSUZZKCAobTEuY3dpc2UoKSA9PSBtMSkuYWxsKCkgKTsKKyAgVkVSSUZZKCAobTEuY3dpc2UoKSAhPSBtMikuYW55KCkgKTsKKyAgVkVSSUZZKCEobTEuY3dpc2UoKSA9PSAobTErbW9uZXMpKS5hbnkoKSApOworICBpZiAocm93cypjb2xzPjEpCisgIHsKKyAgICBtMyA9IG0xOworICAgIG0zKHIsYykgKz0gMTsKKyAgICBWRVJJRlkoIChtMS5jd2lzZSgpID09IG0zKS5hbnkoKSApOworICAgIFZFUklGWSggIShtMS5jd2lzZSgpID09IG0zKS5hbGwoKSApOworICB9CisgIFZFUklGWSggKG0xLmN3aXNlKCkubWluKG0yKS5jd2lzZSgpIDw9IG0yKS5hbGwoKSApOworICBWRVJJRlkoIChtMS5jd2lzZSgpLm1heChtMikuY3dpc2UoKSA+PSBtMikuYWxsKCkgKTsKKyAgVkVSSUZZKCAobTEuY3dpc2UoKS5taW4obTIpLmN3aXNlKCkgPCAobTErbW9uZXMpKS5hbGwoKSApOworICBWRVJJRlkoIChtMS5jd2lzZSgpLm1heChtMikuY3dpc2UoKSA+IChtMS1tb25lcykpLmFsbCgpICk7CisKKyAgVkVSSUZZKCAobTEuY3dpc2UoKTxtMS51bmFyeUV4cHIoYmluZDJuZChwbHVzPFNjYWxhcj4oKSwgU2NhbGFyKDEpKSkpLmFsbCgpICk7CisgIFZFUklGWSggIShtMS5jd2lzZSgpPG0xLnVuYXJ5RXhwcihiaW5kMm5kKG1pbnVzPFNjYWxhcj4oKSwgU2NhbGFyKDEpKSkpLmFsbCgpICk7CisgIFZFUklGWSggIShtMS5jd2lzZSgpPm0xLnVuYXJ5RXhwcihiaW5kMm5kKHBsdXM8U2NhbGFyPigpLCBTY2FsYXIoMSkpKSkuYW55KCkgKTsKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9jd2lzZW9wKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGN3aXNlb3BzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggY3dpc2VvcHMoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggY3dpc2VvcHMoTWF0cml4WGYoMywgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGN3aXNlb3BzKE1hdHJpeFhmKDIyLCAyMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGN3aXNlb3BzKE1hdHJpeFhpKDgsIDEyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggY3dpc2VvcHMoTWF0cml4WGQoMjAsIDIwKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2RldGVybWluYW50LmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9kZXRlcm1pbmFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiNGFkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9kZXRlcm1pbmFudC5jcHAKQEAgLTAsMCArMSw2MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9MVT4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBkZXRlcm1pbmFudChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIERldGVybWluYW50LmgKKyAgKi8KKyAgaW50IHNpemUgPSBtLnJvd3MoKTsKKworICBNYXRyaXhUeXBlIG0xKHNpemUsIHNpemUpLCBtMihzaXplLCBzaXplKTsKKyAgbTEuc2V0UmFuZG9tKCk7CisgIG0yLnNldFJhbmRvbSgpOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIFNjYWxhciB4ID0gZWlfcmFuZG9tPFNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpJZGVudGl0eShzaXplLCBzaXplKS5kZXRlcm1pbmFudCgpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSptMikuZGV0ZXJtaW5hbnQoKSwgbTEuZGV0ZXJtaW5hbnQoKSAqIG0yLmRldGVybWluYW50KCkpOworICBpZihzaXplPT0xKSByZXR1cm47CisgIGludCBpID0gZWlfcmFuZG9tPGludD4oMCwgc2l6ZS0xKTsKKyAgaW50IGo7CisgIGRvIHsKKyAgICBqID0gZWlfcmFuZG9tPGludD4oMCwgc2l6ZS0xKTsKKyAgfSB3aGlsZShqPT1pKTsKKyAgbTIgPSBtMTsKKyAgbTIucm93KGkpLnN3YXAobTIucm93KGopKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5kZXRlcm1pbmFudCgpLCAtbTEuZGV0ZXJtaW5hbnQoKSk7CisgIG0yID0gbTE7CisgIG0yLmNvbChpKS5zd2FwKG0yLmNvbChqKSk7CisgIFZFUklGWV9JU19BUFBST1gobTIuZGV0ZXJtaW5hbnQoKSwgLW0xLmRldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLmRldGVybWluYW50KCksIG0yLnRyYW5zcG9zZSgpLmRldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKGVpX2NvbmoobTIuZGV0ZXJtaW5hbnQoKSksIG0yLmFkam9pbnQoKS5kZXRlcm1pbmFudCgpKTsKKyAgbTIgPSBtMTsKKyAgbTIucm93KGkpICs9IHgqbTIucm93KGopOworICBWRVJJRllfSVNfQVBQUk9YKG0yLmRldGVybWluYW50KCksIG0xLmRldGVybWluYW50KCkpOworICBtMiA9IG0xOworICBtMi5yb3coaSkgKj0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5kZXRlcm1pbmFudCgpLCBtMS5kZXRlcm1pbmFudCgpICogeCk7Cit9CisKK3ZvaWQgdGVzdF9laWdlbjJfZGV0ZXJtaW5hbnQoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBkZXRlcm1pbmFudChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGRldGVybWluYW50KE1hdHJpeDxkb3VibGUsIDIsIDI+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGRldGVybWluYW50KE1hdHJpeDxkb3VibGUsIDMsIDM+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGRldGVybWluYW50KE1hdHJpeDxkb3VibGUsIDQsIDQ+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGRldGVybWluYW50KE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgMTAsIDEwPigpKSApOworICAgIENBTExfU1VCVEVTVF82KCBkZXRlcm1pbmFudChNYXRyaXhYZCgyMCwgMjApKSApOworICB9CisgIENBTExfU1VCVEVTVF82KCBkZXRlcm1pbmFudChNYXRyaXhYZCgyMDAsIDIwMCkpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfZHluYWxsb2MuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX2R5bmFsbG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODkxYTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX2R5bmFsbG9jLmNwcApAQCAtMCwwICsxLDEzMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2lmIEVJR0VOX0FSQ0hfV0FOVFNfQUxJR05NRU5UCisjZGVmaW5lIEFMSUdOTUVOVCAxNgorI2Vsc2UKKyNkZWZpbmUgQUxJR05NRU5UIDEKKyNlbmRpZgorCit2b2lkIGNoZWNrX2hhbmRtYWRlX2FsaWduZWRfbWFsbG9jKCkKK3sKKyAgZm9yKGludCBpID0gMTsgaSA8IDEwMDA7IGkrKykKKyAgeworICAgIGNoYXIgKnAgPSAoY2hhciopZWlfaGFuZG1hZGVfYWxpZ25lZF9tYWxsb2MoaSk7CisgICAgVkVSSUZZKHN0ZDo6c2l6ZV90KHApJUFMSUdOTUVOVD09MCk7CisgICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyB3cm9uZ2x5IGFsbG9jYXRlZCB0aGlzIHdpbGwgZ2l2ZSBhIGJhZCB3cml0ZSAtLT4gY2hlY2sgd2l0aCB2YWxncmluZAorICAgIGZvcihpbnQgaiA9IDA7IGogPCBpOyBqKyspIHBbal09MDsKKyAgICBlaV9oYW5kbWFkZV9hbGlnbmVkX2ZyZWUocCk7CisgIH0KK30KKwordm9pZCBjaGVja19hbGlnbmVkX21hbGxvYygpCit7CisgIGZvcihpbnQgaSA9IDE7IGkgPCAxMDAwOyBpKyspCisgIHsKKyAgICBjaGFyICpwID0gKGNoYXIqKWVpX2FsaWduZWRfbWFsbG9jKGkpOworICAgIFZFUklGWShzdGQ6OnNpemVfdChwKSVBTElHTk1FTlQ9PTApOworICAgIC8vIGlmIHRoZSBidWZmZXIgaXMgd3JvbmdseSBhbGxvY2F0ZWQgdGhpcyB3aWxsIGdpdmUgYSBiYWQgd3JpdGUgLS0+IGNoZWNrIHdpdGggdmFsZ3JpbmQKKyAgICBmb3IoaW50IGogPSAwOyBqIDwgaTsgaisrKSBwW2pdPTA7CisgICAgZWlfYWxpZ25lZF9mcmVlKHApOworICB9Cit9CisKK3ZvaWQgY2hlY2tfYWxpZ25lZF9uZXcoKQoreworICBmb3IoaW50IGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorICB7CisgICAgZmxvYXQgKnAgPSBlaV9hbGlnbmVkX25ldzxmbG9hdD4oaSk7CisgICAgVkVSSUZZKHN0ZDo6c2l6ZV90KHApJUFMSUdOTUVOVD09MCk7CisgICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyB3cm9uZ2x5IGFsbG9jYXRlZCB0aGlzIHdpbGwgZ2l2ZSBhIGJhZCB3cml0ZSAtLT4gY2hlY2sgd2l0aCB2YWxncmluZAorICAgIGZvcihpbnQgaiA9IDA7IGogPCBpOyBqKyspIHBbal09MDsKKyAgICBlaV9hbGlnbmVkX2RlbGV0ZShwLGkpOworICB9Cit9CisKK3ZvaWQgY2hlY2tfYWxpZ25lZF9zdGFja19hbGxvYygpCit7CisgIGZvcihpbnQgaSA9IDE7IGkgPCAxMDAwOyBpKyspCisgIHsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoZmxvYXQsIHAsIGksIDApOworICAgIFZFUklGWShzdGQ6OnNpemVfdChwKSVBTElHTk1FTlQ9PTApOworICAgIC8vIGlmIHRoZSBidWZmZXIgaXMgd3JvbmdseSBhbGxvY2F0ZWQgdGhpcyB3aWxsIGdpdmUgYSBiYWQgd3JpdGUgLS0+IGNoZWNrIHdpdGggdmFsZ3JpbmQKKyAgICBmb3IoaW50IGogPSAwOyBqIDwgaTsgaisrKSBwW2pdPTA7CisgIH0KK30KKworCisvLyB0ZXN0IGNvbXBpbGF0aW9uIHdpdGggYm90aCBhIHN0cnVjdCBhbmQgYSBjbGFzcy4uLgorc3RydWN0IE15U3RydWN0Cit7CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKKyAgY2hhciBkdW1teWNoYXI7CisgIFZlY3RvcjRmIGF2ZWM7Cit9OworCitjbGFzcyBNeUNsYXNzQQoreworICBwdWJsaWM6CisgICAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworICAgIGNoYXIgZHVtbXljaGFyOworICAgIFZlY3RvcjRmIGF2ZWM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGNoZWNrX2R5bmFsaWduZWQoKQoreworICBUKiBvYmogPSBuZXcgVDsKKyAgVkVSSUZZKHN0ZDo6c2l6ZV90KG9iaiklQUxJR05NRU5UPT0wKTsKKyAgZGVsZXRlIG9iajsKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9keW5hbGxvYygpCit7CisgIC8vIGxvdyBsZXZlbCBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uCisgIENBTExfU1VCVEVTVChjaGVja19oYW5kbWFkZV9hbGlnbmVkX21hbGxvYygpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsaWduZWRfbWFsbG9jKCkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxpZ25lZF9uZXcoKSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGlnbmVkX3N0YWNrX2FsbG9jKCkpOworCisgIGZvciAoaW50IGk9MDsgaTxnX3JlcGVhdCoxMDA7ICsraSkKKyAgeworICAgIENBTExfU1VCVEVTVCggY2hlY2tfZHluYWxpZ25lZDxWZWN0b3I0Zj4oKSApOworICAgIENBTExfU1VCVEVTVCggY2hlY2tfZHluYWxpZ25lZDxWZWN0b3IyZD4oKSApOworICAgIENBTExfU1VCVEVTVCggY2hlY2tfZHluYWxpZ25lZDxNYXRyaXg0Zj4oKSApOworICAgIENBTExfU1VCVEVTVCggY2hlY2tfZHluYWxpZ25lZDxWZWN0b3I0ZD4oKSApOworICAgIENBTExfU1VCVEVTVCggY2hlY2tfZHluYWxpZ25lZDxWZWN0b3I0aT4oKSApOworICB9CisgIAorICAvLyBjaGVjayBzdGF0aWMgYWxsb2NhdGlvbiwgd2hvIGtub3dzID8KKyAgeworICAgIE15U3RydWN0IGZvbzA7ICBWRVJJRlkoc3RkOjpzaXplX3QoZm9vMC5hdmVjLmRhdGEoKSklQUxJR05NRU5UPT0wKTsKKyAgICBNeUNsYXNzQSBmb29BOyAgVkVSSUZZKHN0ZDo6c2l6ZV90KGZvb0EuYXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7CisgIH0KKworICAvLyBkeW5hbWljIGFsbG9jYXRpb24sIHNpbmdsZSBvYmplY3QKKyAgZm9yIChpbnQgaT0wOyBpPGdfcmVwZWF0KjEwMDsgKytpKQorICB7CisgICAgTXlTdHJ1Y3QgKmZvbzAgPSBuZXcgTXlTdHJ1Y3QoKTsgIFZFUklGWShzdGQ6OnNpemVfdChmb28wLT5hdmVjLmRhdGEoKSklQUxJR05NRU5UPT0wKTsKKyAgICBNeUNsYXNzQSAqZm9vQSA9IG5ldyBNeUNsYXNzQSgpOyAgVkVSSUZZKHN0ZDo6c2l6ZV90KGZvb0EtPmF2ZWMuZGF0YSgpKSVBTElHTk1FTlQ9PTApOworICAgIGRlbGV0ZSBmb28wOworICAgIGRlbGV0ZSBmb29BOworICB9CisKKyAgLy8gZHluYW1pYyBhbGxvY2F0aW9uLCBhcnJheQorICBjb25zdCBpbnQgTiA9IDEwOworICBmb3IgKGludCBpPTA7IGk8Z19yZXBlYXQqMTAwOyArK2kpCisgIHsKKyAgICBNeVN0cnVjdCAqZm9vMCA9IG5ldyBNeVN0cnVjdFtOXTsgIFZFUklGWShzdGQ6OnNpemVfdChmb28wLT5hdmVjLmRhdGEoKSklQUxJR05NRU5UPT0wKTsKKyAgICBNeUNsYXNzQSAqZm9vQSA9IG5ldyBNeUNsYXNzQVtOXTsgIFZFUklGWShzdGQ6OnNpemVfdChmb29BLT5hdmVjLmRhdGEoKSklQUxJR05NRU5UPT0wKTsKKyAgICBkZWxldGVbXSBmb28wOworICAgIGRlbGV0ZVtdIGZvb0E7CisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfZWlnZW5zb2x2ZXIuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX2VpZ2Vuc29sdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGI0YWNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX2VpZ2Vuc29sdmVyLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9RUj4KKworI2lmZGVmIEhBU19HU0wKKyNpbmNsdWRlICJnc2xfaGVscGVyLmgiCisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgRWlnZW5Tb2x2ZXIuaCwgU2VsZkFkam9pbnRFaWdlblNvbHZlci5oIChhbmQgaW5kaXJlY3RseTogVHJpZGlhZ29uYWxpemF0aW9uLmgpCisgICovCisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBSZWFsVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWw+IENvbXBsZXg7CisKKyAgUmVhbFNjYWxhciBsYXJnZXJFcHMgPSAxMCp0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpOworCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIGExID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgc3ltbUEgPSAgYS5hZGpvaW50KCkgKiBhICsgYTEuYWRqb2ludCgpICogYTE7CisKKyAgTWF0cml4VHlwZSBiID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgYjEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBzeW1tQiA9IGIuYWRqb2ludCgpICogYiArIGIxLmFkam9pbnQoKSAqIGIxOworCisgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlTeW1tKHN5bW1BKTsKKyAgLy8gZ2VuZXJhbGl6ZWQgZWlnZW4gcGIKKyAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaVN5bW1HZW4oc3ltbUEsIHN5bW1CKTsKKworICAjaWZkZWYgSEFTX0dTTAorICBpZiAoZWlfaXNfc2FtZV90eXBlPFJlYWxTY2FsYXIsZG91YmxlPjo6cmV0KQorICB7CisgICAgdHlwZWRlZiBHc2xUcmFpdHM8U2NhbGFyPiBHc2w7CisgICAgdHlwZW5hbWUgR3NsOjpNYXRyaXggZ0V2ZWM9MCwgZ1N5bW1BPTAsIGdTeW1tQj0wOworICAgIHR5cGVuYW1lIEdzbFRyYWl0czxSZWFsU2NhbGFyPjo6VmVjdG9yIGdFdmFsPTA7CisgICAgUmVhbFZlY3RvclR5cGUgX2V2YWw7CisgICAgTWF0cml4VHlwZSBfZXZlYzsKKyAgICBjb252ZXJ0PE1hdHJpeFR5cGU+KHN5bW1BLCBnU3ltbUEpOworICAgIGNvbnZlcnQ8TWF0cml4VHlwZT4oc3ltbUIsIGdTeW1tQik7CisgICAgY29udmVydDxNYXRyaXhUeXBlPihzeW1tQSwgZ0V2ZWMpOworICAgIGdFdmFsID0gR3NsVHJhaXRzPFJlYWxTY2FsYXI+OjpjcmVhdGVWZWN0b3Iocm93cyk7CisKKyAgICBHc2w6OmVpZ2VuX3N5bW0oZ1N5bW1BLCBnRXZhbCwgZ0V2ZWMpOworICAgIGNvbnZlcnQoZ0V2YWwsIF9ldmFsKTsKKyAgICBjb252ZXJ0KGdFdmVjLCBfZXZlYyk7CisKKyAgICAvLyB0ZXN0IGdzbCBpdHNlbGYgIQorICAgIFZFUklGWSgoc3ltbUEgKiBfZXZlYykuaXNBcHByb3goX2V2ZWMgKiBfZXZhbC5hc0RpYWdvbmFsKCksIGxhcmdlckVwcykpOworCisgICAgLy8gY29tcGFyZSB3aXRoIGVpZ2VuCisgICAgVkVSSUZZX0lTX0FQUFJPWChfZXZhbCwgZWlTeW1tLmVpZ2VudmFsdWVzKCkpOworICAgIFZFUklGWV9JU19BUFBST1goX2V2ZWMuY3dpc2UoKS5hYnMoKSwgZWlTeW1tLmVpZ2VudmVjdG9ycygpLmN3aXNlKCkuYWJzKCkpOworCisgICAgLy8gZ2VuZXJhbGl6ZWQgcGIKKyAgICBHc2w6OmVpZ2VuX3N5bW1fZ2VuKGdTeW1tQSwgZ1N5bW1CLCBnRXZhbCwgZ0V2ZWMpOworICAgIGNvbnZlcnQoZ0V2YWwsIF9ldmFsKTsKKyAgICBjb252ZXJ0KGdFdmVjLCBfZXZlYyk7CisgICAgLy8gdGVzdCBHU0wgaXRzZWxmOgorICAgIFZFUklGWSgoc3ltbUEgKiBfZXZlYykuaXNBcHByb3goc3ltbUIgKiAoX2V2ZWMgKiBfZXZhbC5hc0RpYWdvbmFsKCkpLCBsYXJnZXJFcHMpKTsKKworICAgIC8vIGNvbXBhcmUgd2l0aCBlaWdlbgorICAgIE1hdHJpeFR5cGUgbm9ybWFsaXplZF9laXZlYyA9IGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSplaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkuY29sd2lzZSgpLm5vcm0oKS5hc0RpYWdvbmFsKCkuaW52ZXJzZSgpOworICAgIFZFUklGWV9JU19BUFBST1goX2V2YWwsIGVpU3ltbUdlbi5laWdlbnZhbHVlcygpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKF9ldmVjLmN3aXNlQWJzKCksIG5vcm1hbGl6ZWRfZWl2ZWMuY3dpc2VBYnMoKSk7CisKKyAgICBHc2w6OmZyZWUoZ1N5bW1BKTsKKyAgICBHc2w6OmZyZWUoZ1N5bW1CKTsKKyAgICBHc2xUcmFpdHM8UmVhbFNjYWxhcj46OmZyZWUoZ0V2YWwpOworICAgIEdzbDo6ZnJlZShnRXZlYyk7CisgIH0KKyAgI2VuZGlmCisKKyAgVkVSSUZZKChzeW1tQSAqIGVpU3ltbS5laWdlbnZlY3RvcnMoKSkuaXNBcHByb3goCisgICAgICAgICAgZWlTeW1tLmVpZ2VudmVjdG9ycygpICogZWlTeW1tLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpLCBsYXJnZXJFcHMpKTsKKworICAvLyBnZW5lcmFsaXplZCBlaWdlbiBwcm9ibGVtIEF4ID0gbEJ4CisgIFZFUklGWSgoc3ltbUEgKiBlaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkpLmlzQXBwcm94KAorICAgICAgICAgIHN5bW1CICogKGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSAqIGVpU3ltbUdlbi5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSksIGxhcmdlckVwcykpOworCisgIE1hdHJpeFR5cGUgc3FydFN5bW1BID0gZWlTeW1tLm9wZXJhdG9yU3FydCgpOworICBWRVJJRllfSVNfQVBQUk9YKHN5bW1BLCBzcXJ0U3ltbUEqc3FydFN5bW1BKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzcXJ0U3ltbUEsIHN5bW1BKmVpU3ltbS5vcGVyYXRvckludmVyc2VTcXJ0KCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGVpZ2Vuc29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgRWlnZW5Tb2x2ZXIuaAorICAqLworICBpbnQgcm93cyA9IG0ucm93cygpOworICBpbnQgY29scyA9IG0uY29scygpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gUmVhbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb21wbGV4PHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZWFsPiBDb21wbGV4OworCisgIC8vIFJlYWxTY2FsYXIgbGFyZ2VyRXBzID0gMTAqdGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKTsKKworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBhMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIHN5bW1BID0gIGEuYWRqb2ludCgpICogYSArIGExLmFkam9pbnQoKSAqIGExOworCisgIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpMChzeW1tQSk7CisgIFZFUklGWV9JU19BUFBST1goc3ltbUEgKiBlaTAucHNldWRvRWlnZW52ZWN0b3JzKCksIGVpMC5wc2V1ZG9FaWdlbnZlY3RvcnMoKSAqIGVpMC5wc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKChzeW1tQS50ZW1wbGF0ZSBjYXN0PENvbXBsZXg+KCkpICogKGVpMC5wc2V1ZG9FaWdlbnZlY3RvcnMoKS50ZW1wbGF0ZSBjYXN0PENvbXBsZXg+KCkpLAorICAgIChlaTAucHNldWRvRWlnZW52ZWN0b3JzKCkudGVtcGxhdGUgY2FzdDxDb21wbGV4PigpKSAqIChlaTAuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpKTsKKworICBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaTEoYSk7CisgIFZFUklGWV9JU19BUFBST1goYSAqIGVpMS5wc2V1ZG9FaWdlbnZlY3RvcnMoKSwgZWkxLnBzZXVkb0VpZ2VudmVjdG9ycygpICogZWkxLnBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1goYS50ZW1wbGF0ZSBjYXN0PENvbXBsZXg+KCkgKiBlaTEuZWlnZW52ZWN0b3JzKCksCisgICAgICAgICAgICAgICAgICAgZWkxLmVpZ2VudmVjdG9ycygpICogZWkxLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKTsKKworfQorCit2b2lkIHRlc3RfZWlnZW4yX2VpZ2Vuc29sdmVyKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICAvLyB2ZXJ5IGltcG9ydGFudCB0byB0ZXN0IGEgM3gzIG1hdHJpeCBzaW5jZSB3ZSBwcm92aWRlIGEgc3BlY2lhbCBwYXRoIGZvciBpdAorICAgIENBTExfU1VCVEVTVF8xKCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYZig3LDcpKSApOworICAgIENBTExfU1VCVEVTVF80KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeFhjZCg1LDUpKSApOworICAgIENBTExfU1VCVEVTVF81KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeFhkKDE5LDE5KSkgKTsKKworICAgIENBTExfU1VCVEVTVF82KCBlaWdlbnNvbHZlcihNYXRyaXg0ZigpKSApOworICAgIENBTExfU1VCVEVTVF81KCBlaWdlbnNvbHZlcihNYXRyaXhYZCgxNywxNykpICk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2ZpcnN0X2FsaWduZWQuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX2ZpcnN0X2FsaWduZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmIzY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfZmlyc3RfYWxpZ25lZC5jcHAKQEAgLTAsMCArMSw0OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIHRlc3RfZWlnZW4yX2ZpcnN0X2FsaWduZWRfaGVscGVyKFNjYWxhciAqYXJyYXksIGludCBzaXplKQoreworICBjb25zdCBpbnQgcGFja2V0X3NpemUgPSBzaXplb2YoU2NhbGFyKSAqIGVpX3BhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZTsKKyAgVkVSSUZZKCgoc3RkOjpzaXplX3QoYXJyYXkpICsgc2l6ZW9mKFNjYWxhcikgKiBlaV9hbGlnbm1lbnRPZmZzZXQoYXJyYXksIHNpemUpKSAlIHBhY2tldF9zaXplKSA9PSAwKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB0ZXN0X2VpZ2VuMl9ub25lX2FsaWduZWRfaGVscGVyKFNjYWxhciAqYXJyYXksIGludCBzaXplKQoreworICBWRVJJRlkoZWlfcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplID09IDEgfHwgZWlfYWxpZ25tZW50T2Zmc2V0KGFycmF5LCBzaXplKSA9PSBzaXplKTsKK30KKworc3RydWN0IHNvbWVfbm9uX3ZlY3Rvcml6YWJsZV90eXBlIHsgZmxvYXQgeDsgfTsKKwordm9pZCB0ZXN0X2VpZ2VuMl9maXJzdF9hbGlnbmVkKCkKK3sKKyAgRUlHRU5fQUxJR05fMTI4IGZsb2F0IGFycmF5X2Zsb2F0WzEwMF07CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQsIDUwKTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9mbG9hdCsxLCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQrMiwgNTApOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2Zsb2F0KzMsIDUwKTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9mbG9hdCs0LCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQrNSwgNTApOworICAKKyAgRUlHRU5fQUxJR05fMTI4IGRvdWJsZSBhcnJheV9kb3VibGVbMTAwXTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9kb3VibGUsIDUwKTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9kb3VibGUrMSwgNTApOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZSsyLCA1MCk7CisgIAorICBkb3VibGUgKmFycmF5X2RvdWJsZV9wbHVzXzRfYnl0ZXMgPSAoZG91YmxlKikoc3RkOjpzaXplX3QoYXJyYXlfZG91YmxlKSs0KTsKKyAgdGVzdF9ub25lX2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZV9wbHVzXzRfYnl0ZXMsIDUwKTsKKyAgdGVzdF9ub25lX2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZV9wbHVzXzRfYnl0ZXMrMSwgNTApOworICAKKyAgc29tZV9ub25fdmVjdG9yaXphYmxlX3R5cGUgYXJyYXlfbm9udmVjWzEwMF07CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfbm9udmVjLCAxMDApOworICB0ZXN0X25vbmVfYWxpZ25lZF9oZWxwZXIoYXJyYXlfbm9udmVjLCAxMDApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2dlb21ldHJ5LmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9nZW9tZXRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiNGFiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9nZW9tZXRyeS5jcHAKQEAgLTAsMCArMSw0MzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vU1ZEPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZ2VvbWV0cnkodm9pZCkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBDcm9zcy5oIFF1YXRlcm5pb24uaCwgVHJhbnNmb3JtLmNwcAorICAqLworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwyLDI+IE1hdHJpeDI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDM+IE1hdHJpeDM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciw0LDQ+IE1hdHJpeDQ7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwyLDE+IFZlY3RvcjI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciw0LDE+IFZlY3RvcjQ7CisgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXI+IFF1YXRlcm5pb254OworICB0eXBlZGVmIEFuZ2xlQXhpczxTY2FsYXI+IEFuZ2xlQXhpc3g7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwyPiBUcmFuc2Zvcm0yOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMz4gVHJhbnNmb3JtMzsKKyAgdHlwZWRlZiBTY2FsaW5nPFNjYWxhciwyPiBTY2FsaW5nMjsKKyAgdHlwZWRlZiBTY2FsaW5nPFNjYWxhciwzPiBTY2FsaW5nMzsKKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsMj4gVHJhbnNsYXRpb24yOworICB0eXBlZGVmIFRyYW5zbGF0aW9uPFNjYWxhciwzPiBUcmFuc2xhdGlvbjM7CisKKyAgU2NhbGFyIGxhcmdlRXBzID0gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpOworICBpZiAoZWlfaXNfc2FtZV90eXBlPFNjYWxhcixmbG9hdD46OnJldCkKKyAgICBsYXJnZUVwcyA9IDFlLTJmOworCisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKKyAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpLAorICAgIHYyID0gVmVjdG9yMzo6UmFuZG9tKCk7CisgIFZlY3RvcjIgdTAgPSBWZWN0b3IyOjpSYW5kb20oKTsKKyAgTWF0cml4MyBtYXRyb3QxOworCisgIFNjYWxhciBhID0gZWlfcmFuZG9tPFNjYWxhcj4oLVNjYWxhcihNX1BJKSwgU2NhbGFyKE1fUEkpKTsKKworICAvLyBjcm9zcyBwcm9kdWN0CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MS5jcm9zcyh2MikuZWlnZW4yX2RvdCh2MSksIFNjYWxhcigxKSk7CisgIE1hdHJpeDMgbTsKKyAgbSA8PCB2MC5ub3JtYWxpemVkKCksCisgICAgICAodjAuY3Jvc3ModjEpKS5ub3JtYWxpemVkKCksCisgICAgICAodjAuY3Jvc3ModjEpLmNyb3NzKHYwKSkubm9ybWFsaXplZCgpOworICBWRVJJRlkobS5pc1VuaXRhcnkoKSk7CisKKyAgLy8gUXVhdGVybmlvbjogSWRlbnRpdHkoKSwgc2V0SWRlbnRpdHkoKTsKKyAgUXVhdGVybmlvbnggcTEsIHEyOworICBxMi5zZXRJZGVudGl0eSgpOworICBWRVJJRllfSVNfQVBQUk9YKFF1YXRlcm5pb254KFF1YXRlcm5pb254OjpJZGVudGl0eSgpKS5jb2VmZnMoKSwgcTIuY29lZmZzKCkpOworICBxMS5jb2VmZnMoKS5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMS5jb2VmZnMoKSwgKHExKnEyKS5jb2VmZnMoKSk7CisKKyAgLy8gdW5pdE9ydGhvZ29uYWwKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHUwLnVuaXRPcnRob2dvbmFsKCkuZWlnZW4yX2RvdCh1MCksIFNjYWxhcigxKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MC51bml0T3J0aG9nb25hbCgpLmVpZ2VuMl9kb3QodjApLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHUwLnVuaXRPcnRob2dvbmFsKCkubm9ybSgpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHYwLnVuaXRPcnRob2dvbmFsKCkubm9ybSgpLCBTY2FsYXIoMSkpOworCisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MCwgQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpICogdjApOworICBWRVJJRllfSVNfQVBQUk9YKC12MCwgQW5nbGVBeGlzeChTY2FsYXIoTV9QSSksIHYwLnVuaXRPcnRob2dvbmFsKCkpICogdjApOworICBWRVJJRllfSVNfQVBQUk9YKGVpX2NvcyhhKSp2MC5zcXVhcmVkTm9ybSgpLCB2MC5laWdlbjJfZG90KEFuZ2xlQXhpc3goYSwgdjAudW5pdE9ydGhvZ29uYWwoKSkgKiB2MCkpOworICBtID0gQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpLnRvUm90YXRpb25NYXRyaXgoKS5hZGpvaW50KCk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4Mzo6SWRlbnRpdHkoKSwgbSAqIEFuZ2xlQXhpc3goYSwgdjAubm9ybWFsaXplZCgpKSk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4Mzo6SWRlbnRpdHkoKSwgQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpICogbSk7CisKKyAgcTEgPSBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSk7CisgIHEyID0gQW5nbGVBeGlzeChhLCB2MS5ub3JtYWxpemVkKCkpOworCisgIC8vIGFuZ3VsYXIgZGlzdGFuY2UKKyAgU2NhbGFyIHJlZmFuZ2xlID0gZWlfYWJzKEFuZ2xlQXhpc3gocTEuaW52ZXJzZSgpKnEyKS5hbmdsZSgpKTsKKyAgaWYgKHJlZmFuZ2xlPlNjYWxhcihNX1BJKSkKKyAgICByZWZhbmdsZSA9IFNjYWxhcigyKSpTY2FsYXIoTV9QSSkgLSByZWZhbmdsZTsKKyAgCisgIGlmKChxMS5jb2VmZnMoKS1xMi5jb2VmZnMoKSkubm9ybSgpID4gMTAqbGFyZ2VFcHMpCisgIHsKKyAgICBWRVJJRlkoZWlfaXNBcHByb3gocTEuYW5ndWxhckRpc3RhbmNlKHEyKSwgcmVmYW5nbGUsIGxhcmdlRXBzKSk7CisgIH0KKworICAvLyByb3RhdGlvbiBtYXRyaXggY29udmVyc2lvbgorICBWRVJJRllfSVNfQVBQUk9YKHExICogdjIsIHExLnRvUm90YXRpb25NYXRyaXgoKSAqIHYyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHEyICogdjIsCisgICAgcTEudG9Sb3RhdGlvbk1hdHJpeCgpICogcTIudG9Sb3RhdGlvbk1hdHJpeCgpICogdjIpOworCisgIFZFUklGWSggKHEyKnExKS5pc0FwcHJveChxMSpxMiwgbGFyZ2VFcHMpIHx8ICEocTIgKiBxMSAqIHYyKS5pc0FwcHJveCgKKyAgICBxMS50b1JvdGF0aW9uTWF0cml4KCkgKiBxMi50b1JvdGF0aW9uTWF0cml4KCkgKiB2MikpOworCisgIHEyID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworICBWRVJJRllfSVNfQVBQUk9YKHExKnYxLHEyKnYxKTsKKworICBtYXRyb3QxID0gQW5nbGVBeGlzeChTY2FsYXIoMC4xKSwgVmVjdG9yMzo6VW5pdFgoKSkKKyAgICAgICAgICAqIEFuZ2xlQXhpc3goU2NhbGFyKDAuMiksIFZlY3RvcjM6OlVuaXRZKCkpCisgICAgICAgICAgKiBBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzOjpVbml0WigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRyb3QxICogdjEsCisgICAgICAgQW5nbGVBeGlzeChTY2FsYXIoMC4xKSwgVmVjdG9yMygxLDAsMCkpLnRvUm90YXRpb25NYXRyaXgoKQorICAgICogKEFuZ2xlQXhpc3goU2NhbGFyKDAuMiksIFZlY3RvcjMoMCwxLDApKS50b1JvdGF0aW9uTWF0cml4KCkKKyAgICAqIChBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzKDAsMCwxKSkudG9Sb3RhdGlvbk1hdHJpeCgpICogdjEpKSk7CisKKyAgLy8gYW5nbGUtYXhpcyBjb252ZXJzaW9uCisgIEFuZ2xlQXhpc3ggYWEgPSBxMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHYxLCBRdWF0ZXJuaW9ueChhYSkgKiB2MSk7CisgIFZFUklGWV9JU19OT1RfQVBQUk9YKHExICogdjEsIFF1YXRlcm5pb254KEFuZ2xlQXhpc3goYWEuYW5nbGUoKSoyLGFhLmF4aXMoKSkpICogdjEpOworCisgIC8vIGZyb20gdHdvIHZlY3RvciBjcmVhdGlvbgorICBWRVJJRllfSVNfQVBQUk9YKHYyLm5vcm1hbGl6ZWQoKSwocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsdjIpKnYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHYyLm5vcm1hbGl6ZWQoKSwocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsdjIpKnYxKS5ub3JtYWxpemVkKCkpOworCisgIC8vIGludmVyc2UgYW5kIGNvbmp1Z2F0ZQorICBWRVJJRllfSVNfQVBQUk9YKHExICogKHExLmludmVyc2UoKSAqIHYxKSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHExICogKHExLmNvbmp1Z2F0ZSgpICogdjEpLCB2MSk7CisKKyAgLy8gQW5nbGVBeGlzCisgIFZFUklGWV9JU19BUFBST1goQW5nbGVBeGlzeChhLHYxLm5vcm1hbGl6ZWQoKSkudG9Sb3RhdGlvbk1hdHJpeCgpLAorICAgIFF1YXRlcm5pb254KEFuZ2xlQXhpc3goYSx2MS5ub3JtYWxpemVkKCkpKS50b1JvdGF0aW9uTWF0cml4KCkpOworCisgIEFuZ2xlQXhpc3ggYWExOworICBtID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworICBhYTEgPSBtOworICBWRVJJRllfSVNfQVBQUk9YKEFuZ2xlQXhpc3gobSkudG9Sb3RhdGlvbk1hdHJpeCgpLAorICAgIFF1YXRlcm5pb254KG0pLnRvUm90YXRpb25NYXRyaXgoKSk7CisKKyAgLy8gVHJhbnNmb3JtCisgIC8vIFRPRE8gY29tcGxldGUgdGhlIHRlc3RzICEKKyAgYSA9IDA7CisgIHdoaWxlIChlaV9hYnMoYSk8U2NhbGFyKDAuMSkpCisgICAgYSA9IGVpX3JhbmRvbTxTY2FsYXI+KC1TY2FsYXIoMC40KSpTY2FsYXIoTV9QSSksIFNjYWxhcigwLjQpKlNjYWxhcihNX1BJKSk7CisgIHExID0gQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpOworICBUcmFuc2Zvcm0zIHQwLCB0MSwgdDI7CisgIC8vIGZpcnN0IHRlc3Qgc2V0SWRlbnRpdHkoKSBhbmQgSWRlbnRpdHkoKQorICB0MC5zZXRJZGVudGl0eSgpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCBUcmFuc2Zvcm0zOjpNYXRyaXhUeXBlOjpJZGVudGl0eSgpKTsKKyAgdDAubWF0cml4KCkuc2V0WmVybygpOworICB0MCA9IFRyYW5zZm9ybTM6OklkZW50aXR5KCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIFRyYW5zZm9ybTM6Ok1hdHJpeFR5cGU6OklkZW50aXR5KCkpOworCisgIHQwLmxpbmVhcigpID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworICB0MS5zZXRJZGVudGl0eSgpOworICB0MS5saW5lYXIoKSA9IHExLnRvUm90YXRpb25NYXRyaXgoKTsKKworICB2MCA8PCA1MCwgMiwgMTsvLz0gZWlfcmFuZG9tX21hdHJpeDxWZWN0b3IzPigpLmN3aXNlUHJvZHVjdChWZWN0b3IzKDEwLDIsMC41KSk7CisgIHQwLnNjYWxlKHYwKTsKKyAgdDEucHJlc2NhbGUodjApOworCisgIFZFUklGWV9JU19BUFBST1goICh0MCAqIFZlY3RvcjMoMSwwLDApKS5ub3JtKCksIHYwLngoKSk7CisgIC8vVkVSSUZZKCFlaV9pc0FwcHJveCgodDEgKiBWZWN0b3IzKDEsMCwwKSkubm9ybSgpLCB2MC54KCkpKTsKKworICB0MC5zZXRJZGVudGl0eSgpOworICB0MS5zZXRJZGVudGl0eSgpOworICB2MSA8PCAxLCAyLCAzOworICB0MC5saW5lYXIoKSA9IHExLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgdDAucHJldHJhbnNsYXRlKHYwKTsKKyAgdDAuc2NhbGUodjEpOworICB0MS5saW5lYXIoKSA9IHExLmNvbmp1Z2F0ZSgpLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgdDEucHJlc2NhbGUodjEuY3dpc2UoKS5pbnZlcnNlKCkpOworICB0MS50cmFuc2xhdGUoLXYwKTsKKworICBWRVJJRlkoKHQwLm1hdHJpeCgpICogdDEubWF0cml4KCkpLmlzSWRlbnRpdHkodGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisKKyAgdDEuZnJvbVBvc2l0aW9uT3JpZW50YXRpb25TY2FsZSh2MCwgcTEsIHYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MS5tYXRyaXgoKSwgdDAubWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHQxKnYxLCB0MCp2MSk7CisKKyAgdDAuc2V0SWRlbnRpdHkoKTsgdDAuc2NhbGUodjApLnJvdGF0ZShxMS50b1JvdGF0aW9uTWF0cml4KCkpOworICB0MS5zZXRJZGVudGl0eSgpOyB0MS5zY2FsZSh2MCkucm90YXRlKHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIHQwLnNldElkZW50aXR5KCk7IHQwLnNjYWxlKHYwKS5yb3RhdGUoQW5nbGVBeGlzeChxMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5zY2FsZShhKS5tYXRyaXgoKSwgdDEuc2NhbGUoVmVjdG9yMzo6Q29uc3RhbnQoYSkpLm1hdHJpeCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5wcmVzY2FsZShhKS5tYXRyaXgoKSwgdDEucHJlc2NhbGUoVmVjdG9yMzo6Q29uc3RhbnQoYSkpLm1hdHJpeCgpKTsKKworICAvLyBNb3JlIHRyYW5zZm9ybSBjb25zdHJ1Y3RvcnMsIG9wZXJhdG9yPSwgb3BlcmF0b3IqPQorCisgIE1hdHJpeDMgbWF0MyA9IE1hdHJpeDM6OlJhbmRvbSgpOworICBNYXRyaXg0IG1hdDQ7CisgIG1hdDQgPDwgbWF0MyAsIFZlY3RvcjM6Olplcm8oKSAsIFZlY3RvcjQ6Olplcm8oKS50cmFuc3Bvc2UoKTsKKyAgVHJhbnNmb3JtMyB0bWF0MyhtYXQzKSwgdG1hdDQobWF0NCk7CisgIHRtYXQ0Lm1hdHJpeCgpKDMsMykgPSBTY2FsYXIoMSk7CisgIFZFUklGWV9JU19BUFBST1godG1hdDMubWF0cml4KCksIHRtYXQ0Lm1hdHJpeCgpKTsKKworICBTY2FsYXIgYTMgPSBlaV9yYW5kb208U2NhbGFyPigtU2NhbGFyKE1fUEkpLCBTY2FsYXIoTV9QSSkpOworICBWZWN0b3IzIHYzID0gVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpOworICBBbmdsZUF4aXN4IGFhMyhhMywgdjMpOworICBUcmFuc2Zvcm0zIHQzKGFhMyk7CisgIFRyYW5zZm9ybTMgdDQ7CisgIHQ0ID0gYWEzOworICBWRVJJRllfSVNfQVBQUk9YKHQzLm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisgIHQ0LnJvdGF0ZShBbmdsZUF4aXN4KC1hMyx2MykpOworICBWRVJJRllfSVNfQVBQUk9YKHQ0Lm1hdHJpeCgpLCBNYXRyaXg0OjpJZGVudGl0eSgpKTsKKyAgdDQgKj0gYWEzOworICBWRVJJRllfSVNfQVBQUk9YKHQzLm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisKKyAgdjMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgVHJhbnNsYXRpb24zIHR2Myh2Myk7CisgIFRyYW5zZm9ybTMgdDUodHYzKTsKKyAgdDQgPSB0djM7CisgIFZFUklGWV9JU19BUFBST1godDUubWF0cml4KCksIHQ0Lm1hdHJpeCgpKTsKKyAgdDQudHJhbnNsYXRlKC12Myk7CisgIFZFUklGWV9JU19BUFBST1godDQubWF0cml4KCksIE1hdHJpeDQ6OklkZW50aXR5KCkpOworICB0NCAqPSB0djM7CisgIFZFUklGWV9JU19BUFBST1godDUubWF0cml4KCksIHQ0Lm1hdHJpeCgpKTsKKworICBTY2FsaW5nMyBzdjModjMpOworICBUcmFuc2Zvcm0zIHQ2KHN2Myk7CisgIHQ0ID0gc3YzOworICBWRVJJRllfSVNfQVBQUk9YKHQ2Lm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisgIHQ0LnNjYWxlKHYzLmN3aXNlKCkuaW52ZXJzZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0NC5tYXRyaXgoKSwgTWF0cml4NDo6SWRlbnRpdHkoKSk7CisgIHQ0ICo9IHN2MzsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0Ni5tYXRyaXgoKSwgdDQubWF0cml4KCkpOworCisgIC8vIG1hdHJpeCAqIHRyYW5zZm9ybQorICBWRVJJRllfSVNfQVBQUk9YKFRyYW5zZm9ybTModDMubWF0cml4KCkqdDQpLm1hdHJpeCgpLCBUcmFuc2Zvcm0zKHQzKnQ0KS5tYXRyaXgoKSk7CisKKyAgLy8gY2hhaW5lZCBUcmFuc2Zvcm0gcHJvZHVjdAorICBWRVJJRllfSVNfQVBQUk9YKCgodDMqdDQpKnQ1KS5tYXRyaXgoKSwgKHQzKih0NCp0NSkpLm1hdHJpeCgpKTsKKworICAvLyBjaGVjayB0aGF0IFRyYW5zZm9ybSBwcm9kdWN0IGRvZXNuJ3QgaGF2ZSBhbGlhc2luZyBwcm9ibGVtcworICB0NSA9IHQ0OworICB0NSA9IHQ1KnQ1OworICBWRVJJRllfSVNfQVBQUk9YKHQ1LCB0NCp0NCk7CisKKyAgLy8gMkQgdHJhbnNmb3JtYXRpb24KKyAgVHJhbnNmb3JtMiB0MjAsIHQyMTsKKyAgVmVjdG9yMiB2MjAgPSBWZWN0b3IyOjpSYW5kb20oKTsKKyAgVmVjdG9yMiB2MjEgPSBWZWN0b3IyOjpSYW5kb20oKTsKKyAgZm9yIChpbnQgaz0wOyBrPDI7ICsraykKKyAgICBpZiAoZWlfYWJzKHYyMVtrXSk8U2NhbGFyKDFlLTMpKSB2MjFba10gPSBTY2FsYXIoMWUtMyk7CisgIHQyMS5zZXRJZGVudGl0eSgpOworICB0MjEubGluZWFyKCkgPSBSb3RhdGlvbjJEPFNjYWxhcj4oYSkudG9Sb3RhdGlvbk1hdHJpeCgpOworICBWRVJJRllfSVNfQVBQUk9YKHQyMC5mcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKHYyMCxhLHYyMSkubWF0cml4KCksCisgICAgdDIxLnByZXRyYW5zbGF0ZSh2MjApLnNjYWxlKHYyMSkubWF0cml4KCkpOworCisgIHQyMS5zZXRJZGVudGl0eSgpOworICB0MjEubGluZWFyKCkgPSBSb3RhdGlvbjJEPFNjYWxhcj4oLWEpLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgVkVSSUZZKCAodDIwLmZyb21Qb3NpdGlvbk9yaWVudGF0aW9uU2NhbGUodjIwLGEsdjIxKQorICAgICAgICAqICh0MjEucHJlc2NhbGUodjIxLmN3aXNlKCkuaW52ZXJzZSgpKS50cmFuc2xhdGUoLXYyMCkpKS5tYXRyaXgoKS5pc0lkZW50aXR5KHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgKTsKKworICAvLyBUcmFuc2Zvcm0gLSBuZXcgQVBJCisgIC8vIDNECisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnJvdGF0ZShxMSkuc2NhbGUodjApLnRyYW5zbGF0ZSh2MCk7CisgIC8vIG1hdCAqIHNjYWxpbmcgYW5kIG1hdCAqIHRyYW5zbGF0aW9uCisgIHQxID0gKE1hdHJpeDMocTEpICogU2NhbGluZzModjApKSAqIFRyYW5zbGF0aW9uMyh2MCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgLy8gbWF0ICogdHJhbnNmb3JtYXRpb24gYW5kIHNjYWxpbmcgKiB0cmFuc2xhdGlvbgorICB0MSA9IE1hdHJpeDMocTEpICogKFNjYWxpbmczKHYwKSAqIFRyYW5zbGF0aW9uMyh2MCkpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAucHJlcm90YXRlKHExKS5wcmVzY2FsZSh2MCkucHJldHJhbnNsYXRlKHYwKTsKKyAgLy8gdHJhbnNsYXRpb24gKiBzY2FsaW5nIGFuZCB0cmFuc2Zvcm1hdGlvbiAqIG1hdAorICB0MSA9IChUcmFuc2xhdGlvbjModjApICogU2NhbGluZzModjApKSAqIE1hdHJpeDMocTEpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisgIC8vIHNjYWxpbmcgKiBtYXQgYW5kIHRyYW5zbGF0aW9uICogbWF0CisgIHQxID0gVHJhbnNsYXRpb24zKHYwKSAqIChTY2FsaW5nMyh2MCkgKiBNYXRyaXgzKHExKSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICB0MC5zZXRJZGVudGl0eSgpOworICB0MC5zY2FsZSh2MCkudHJhbnNsYXRlKHYwKS5yb3RhdGUocTEpOworICAvLyB0cmFuc2xhdGlvbiAqIG1hdCBhbmQgc2NhbGluZyAqIHRyYW5zZm9ybWF0aW9uCisgIHQxID0gU2NhbGluZzModjApICogKFRyYW5zbGF0aW9uMyh2MCkgKiBNYXRyaXgzKHExKSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgLy8gdHJhbnNmb3JtYXRpb24gKiBzY2FsaW5nCisgIHQwLnNjYWxlKHYwKTsKKyAgdDEgPSB0MSAqIFNjYWxpbmczKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICAvLyB0cmFuc2Zvcm1hdGlvbiAqIHRyYW5zbGF0aW9uCisgIHQwLnRyYW5zbGF0ZSh2MCk7CisgIHQxID0gdDEgKiBUcmFuc2xhdGlvbjModjApOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisgIC8vIHRyYW5zbGF0aW9uICogdHJhbnNmb3JtYXRpb24KKyAgdDAucHJldHJhbnNsYXRlKHYwKTsKKyAgdDEgPSBUcmFuc2xhdGlvbjModjApICogdDE7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICAvLyB0cmFuc2Zvcm0gKiBxdWF0ZXJuaW9uCisgIHQwLnJvdGF0ZShxMSk7CisgIHQxID0gdDEgKiBxMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHRyYW5zbGF0aW9uICogcXVhdGVybmlvbgorICB0MC50cmFuc2xhdGUodjEpLnJvdGF0ZShxMSk7CisgIHQxID0gdDEgKiAoVHJhbnNsYXRpb24zKHYxKSAqIHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHNjYWxpbmcgKiBxdWF0ZXJuaW9uCisgIHQwLnNjYWxlKHYxKS5yb3RhdGUocTEpOworICB0MSA9IHQxICogKFNjYWxpbmczKHYxKSAqIHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHF1YXRlcm5pb24gKiB0cmFuc2Zvcm0KKyAgdDAucHJlcm90YXRlKHExKTsKKyAgdDEgPSBxMSAqIHQxOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgLy8gcXVhdGVybmlvbiAqIHRyYW5zbGF0aW9uCisgIHQwLnJvdGF0ZShxMSkudHJhbnNsYXRlKHYxKTsKKyAgdDEgPSB0MSAqIChxMSAqIFRyYW5zbGF0aW9uMyh2MSkpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgLy8gcXVhdGVybmlvbiAqIHNjYWxpbmcKKyAgdDAucm90YXRlKHExKS5zY2FsZSh2MSk7CisgIHQxID0gdDEgKiAocTEgKiBTY2FsaW5nMyh2MSkpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgLy8gdHJhbnNsYXRpb24gKiB2ZWN0b3IKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAudHJhbnNsYXRlKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MCAqIHYxLCBUcmFuc2xhdGlvbjModjApICogdjEpOworCisgIC8vIHNjYWxpbmcgKiB2ZWN0b3IKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAuc2NhbGUodjApOworICBWRVJJRllfSVNfQVBQUk9YKHQwICogdjEsIFNjYWxpbmczKHYwKSAqIHYxKTsKKworICAvLyB0ZXN0IHRyYW5zZm9ybSBpbnZlcnNpb24KKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAudHJhbnNsYXRlKHYwKTsKKyAgdDAubGluZWFyKCkuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1godDAuaW52ZXJzZShBZmZpbmUpLCB0MC5tYXRyaXgoKS5pbnZlcnNlKCkpOworICB0MC5zZXRJZGVudGl0eSgpOworICB0MC50cmFuc2xhdGUodjApLnJvdGF0ZShxMSk7CisgIFZFUklGWV9JU19BUFBST1godDAuaW52ZXJzZShJc29tZXRyeSksIHQwLm1hdHJpeCgpLmludmVyc2UoKSk7CisKKyAgLy8gdGVzdCBleHRyYWN0IHJvdGF0aW9uIGFuZCBzY2FsaW5nCisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnRyYW5zbGF0ZSh2MCkucm90YXRlKHExKS5zY2FsZSh2MSk7CisgIFZFUklGWV9JU19BUFBST1godDAucm90YXRpb24oKSAqIHYxLCBNYXRyaXgzKHExKSAqIHYxKTsKKworICBNYXRyaXgzIG1hdF9yb3RhdGlvbiwgbWF0X3NjYWxpbmc7CisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnRyYW5zbGF0ZSh2MCkucm90YXRlKHExKS5zY2FsZSh2MSk7CisgIHQwLmNvbXB1dGVSb3RhdGlvblNjYWxpbmcoJm1hdF9yb3RhdGlvbiwgJm1hdF9zY2FsaW5nKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5saW5lYXIoKSwgbWF0X3JvdGF0aW9uICogbWF0X3NjYWxpbmcpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdF9yb3RhdGlvbiptYXRfcm90YXRpb24uYWRqb2ludCgpLCBNYXRyaXgzOjpJZGVudGl0eSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRfcm90YXRpb24uZGV0ZXJtaW5hbnQoKSwgU2NhbGFyKDEpKTsKKyAgdDAuY29tcHV0ZVNjYWxpbmdSb3RhdGlvbigmbWF0X3NjYWxpbmcsICZtYXRfcm90YXRpb24pOworICBWRVJJRllfSVNfQVBQUk9YKHQwLmxpbmVhcigpLCBtYXRfc2NhbGluZyAqIG1hdF9yb3RhdGlvbik7CisgIFZFUklGWV9JU19BUFBST1gobWF0X3JvdGF0aW9uKm1hdF9yb3RhdGlvbi5hZGpvaW50KCksIE1hdHJpeDM6OklkZW50aXR5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdF9yb3RhdGlvbi5kZXRlcm1pbmFudCgpLCBTY2FsYXIoMSkpOworCisgIC8vIHRlc3QgY2FzdGluZworICBUcmFuc2Zvcm08ZmxvYXQsMz4gdDFmID0gdDEudGVtcGxhdGUgY2FzdDxmbG9hdD4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksdDEpOworICBUcmFuc2Zvcm08ZG91YmxlLDM+IHQxZCA9IHQxLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKHQxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSx0MSk7CisKKyAgVHJhbnNsYXRpb24zIHRyMSh2MCk7CisgIFRyYW5zbGF0aW9uPGZsb2F0LDM+IHRyMWYgPSB0cjEudGVtcGxhdGUgY2FzdDxmbG9hdD4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0cjFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHRyMSk7CisgIFRyYW5zbGF0aW9uPGRvdWJsZSwzPiB0cjFkID0gdHIxLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKHRyMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksdHIxKTsKKworICBTY2FsaW5nMyBzYzEodjApOworICBTY2FsaW5nPGZsb2F0LDM+IHNjMWYgPSBzYzEudGVtcGxhdGUgY2FzdDxmbG9hdD4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzYzFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHNjMSk7CisgIFNjYWxpbmc8ZG91YmxlLDM+IHNjMWQgPSBzYzEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7CisgIFZFUklGWV9JU19BUFBST1goc2MxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxzYzEpOworCisgIFF1YXRlcm5pb248ZmxvYXQ+IHExZiA9IHExLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1gocTFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHExKTsKKyAgUXVhdGVybmlvbjxkb3VibGU+IHExZCA9IHExLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKHExZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxxMSk7CisKKyAgQW5nbGVBeGlzPGZsb2F0PiBhYTFmID0gYWExLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1goYWExZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxhYTEpOworICBBbmdsZUF4aXM8ZG91YmxlPiBhYTFkID0gYWExLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKGFhMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksYWExKTsKKworICBSb3RhdGlvbjJEPFNjYWxhcj4gcjJkMShlaV9yYW5kb208U2NhbGFyPigpKTsKKyAgUm90YXRpb24yRDxmbG9hdD4gcjJkMWYgPSByMmQxLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1gocjJkMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkscjJkMSk7CisgIFJvdGF0aW9uMkQ8ZG91YmxlPiByMmQxZCA9IHIyZDEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7CisgIFZFUklGWV9JU19BUFBST1gocjJkMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkscjJkMSk7CisKKyAgbSA9IHExOworLy8gICBtLmNvbCgxKSA9IFZlY3RvcjMoMCxlaV9yYW5kb208U2NhbGFyPigpLGVpX3JhbmRvbTxTY2FsYXI+KCkpLm5vcm1hbGl6ZWQoKTsKKy8vICAgbS5jb2woMCkgPSBWZWN0b3IzKC0xLDAsMCkubm9ybWFsaXplZCgpOworLy8gICBtLmNvbCgyKSA9IG0uY29sKDApLmNyb3NzKG0uY29sKDEpKTsKKyAgI2RlZmluZSBWRVJJRllfRVVMRVIoSSxKLEssIFgsWSxaKSB7IFwKKyAgICBWZWN0b3IzIGVhID0gbS5ldWxlckFuZ2xlcyhJLEosSyk7IFwKKyAgICBNYXRyaXgzIG0xID0gTWF0cml4MyhBbmdsZUF4aXN4KGVhWzBdLCBWZWN0b3IzOjpVbml0IyNYKCkpICogQW5nbGVBeGlzeChlYVsxXSwgVmVjdG9yMzo6VW5pdCMjWSgpKSAqIEFuZ2xlQXhpc3goZWFbMl0sIFZlY3RvcjM6OlVuaXQjI1ooKSkpOyBcCisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCAgTWF0cml4MyhBbmdsZUF4aXN4KGVhWzBdLCBWZWN0b3IzOjpVbml0IyNYKCkpICogQW5nbGVBeGlzeChlYVsxXSwgVmVjdG9yMzo6VW5pdCMjWSgpKSAqIEFuZ2xlQXhpc3goZWFbMl0sIFZlY3RvcjM6OlVuaXQjI1ooKSkpKTsgXAorICB9CisgIFZFUklGWV9FVUxFUigwLDEsMiwgWCxZLFopOworICBWRVJJRllfRVVMRVIoMCwxLDAsIFgsWSxYKTsKKyAgVkVSSUZZX0VVTEVSKDAsMiwxLCBYLFosWSk7CisgIFZFUklGWV9FVUxFUigwLDIsMCwgWCxaLFgpOworCisgIFZFUklGWV9FVUxFUigxLDIsMCwgWSxaLFgpOworICBWRVJJRllfRVVMRVIoMSwyLDEsIFksWixZKTsKKyAgVkVSSUZZX0VVTEVSKDEsMCwyLCBZLFgsWik7CisgIFZFUklGWV9FVUxFUigxLDAsMSwgWSxYLFkpOworCisgIFZFUklGWV9FVUxFUigyLDAsMSwgWixYLFkpOworICBWRVJJRllfRVVMRVIoMiwwLDIsIFosWCxaKTsKKyAgVkVSSUZZX0VVTEVSKDIsMSwwLCBaLFksWCk7CisgIFZFUklGWV9FVUxFUigyLDEsMiwgWixZLFopOworCisgIC8vIGNvbHdpc2Uvcm93d2lzZSBjcm9zcyBwcm9kdWN0CisgIG1hdDMuc2V0UmFuZG9tKCk7CisgIFZlY3RvcjMgdmVjMyA9IFZlY3RvcjM6OlJhbmRvbSgpOworICBNYXRyaXgzIG1jcm9zczsKKyAgaW50IGkgPSBlaV9yYW5kb208aW50PigwLDIpOworICBtY3Jvc3MgPSBtYXQzLmNvbHdpc2UoKS5jcm9zcyh2ZWMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtY3Jvc3MuY29sKGkpLCBtYXQzLmNvbChpKS5jcm9zcyh2ZWMzKSk7CisgIG1jcm9zcyA9IG1hdDMucm93d2lzZSgpLmNyb3NzKHZlYzMpOworICBWRVJJRllfSVNfQVBQUk9YKG1jcm9zcy5yb3coaSksIG1hdDMucm93KGkpLmNyb3NzKHZlYzMpKTsKKworCit9CisKK3ZvaWQgdGVzdF9laWdlbjJfZ2VvbWV0cnkoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBnZW9tZXRyeTxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBnZW9tZXRyeTxkb3VibGU+KCkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2dlb21ldHJ5X3dpdGhfZWlnZW4yX3ByZWZpeC5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfZ2VvbWV0cnlfd2l0aF9laWdlbjJfcHJlZml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODNiNTcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX2dlb21ldHJ5X3dpdGhfZWlnZW4yX3ByZWZpeC5jcHAKQEAgLTAsMCArMSw0MzQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU4yX1NVUFBPUlRfU1RBR0UxNV9SRVNPTFZFX0FQSV9DT05GTElDVFNfV0FSTgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGdlb21ldHJ5KHZvaWQpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgQ3Jvc3MuaCBRdWF0ZXJuaW9uLmgsIFRyYW5zZm9ybS5jcHAKKyAgKi8KKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwyPiBNYXRyaXgyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsNCw0PiBNYXRyaXg0OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwxPiBWZWN0b3IyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsNCwxPiBWZWN0b3I0OworICB0eXBlZGVmIGVpZ2VuMl9RdWF0ZXJuaW9uPFNjYWxhcj4gUXVhdGVybmlvbng7CisgIHR5cGVkZWYgZWlnZW4yX0FuZ2xlQXhpczxTY2FsYXI+IEFuZ2xlQXhpc3g7CisgIHR5cGVkZWYgZWlnZW4yX1RyYW5zZm9ybTxTY2FsYXIsMj4gVHJhbnNmb3JtMjsKKyAgdHlwZWRlZiBlaWdlbjJfVHJhbnNmb3JtPFNjYWxhciwzPiBUcmFuc2Zvcm0zOworICB0eXBlZGVmIGVpZ2VuMl9TY2FsaW5nPFNjYWxhciwyPiBTY2FsaW5nMjsKKyAgdHlwZWRlZiBlaWdlbjJfU2NhbGluZzxTY2FsYXIsMz4gU2NhbGluZzM7CisgIHR5cGVkZWYgZWlnZW4yX1RyYW5zbGF0aW9uPFNjYWxhciwyPiBUcmFuc2xhdGlvbjI7CisgIHR5cGVkZWYgZWlnZW4yX1RyYW5zbGF0aW9uPFNjYWxhciwzPiBUcmFuc2xhdGlvbjM7CisKKyAgU2NhbGFyIGxhcmdlRXBzID0gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpOworICBpZiAoZWlfaXNfc2FtZV90eXBlPFNjYWxhcixmbG9hdD46OnJldCkKKyAgICBsYXJnZUVwcyA9IDFlLTJmOworCisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKKyAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpLAorICAgIHYyID0gVmVjdG9yMzo6UmFuZG9tKCk7CisgIFZlY3RvcjIgdTAgPSBWZWN0b3IyOjpSYW5kb20oKTsKKyAgTWF0cml4MyBtYXRyb3QxOworCisgIFNjYWxhciBhID0gZWlfcmFuZG9tPFNjYWxhcj4oLVNjYWxhcihNX1BJKSwgU2NhbGFyKE1fUEkpKTsKKworICAvLyBjcm9zcyBwcm9kdWN0CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MS5jcm9zcyh2MikuZWlnZW4yX2RvdCh2MSksIFNjYWxhcigxKSk7CisgIE1hdHJpeDMgbTsKKyAgbSA8PCB2MC5ub3JtYWxpemVkKCksCisgICAgICAodjAuY3Jvc3ModjEpKS5ub3JtYWxpemVkKCksCisgICAgICAodjAuY3Jvc3ModjEpLmNyb3NzKHYwKSkubm9ybWFsaXplZCgpOworICBWRVJJRlkobS5pc1VuaXRhcnkoKSk7CisKKyAgLy8gUXVhdGVybmlvbjogSWRlbnRpdHkoKSwgc2V0SWRlbnRpdHkoKTsKKyAgUXVhdGVybmlvbnggcTEsIHEyOworICBxMi5zZXRJZGVudGl0eSgpOworICBWRVJJRllfSVNfQVBQUk9YKFF1YXRlcm5pb254KFF1YXRlcm5pb254OjpJZGVudGl0eSgpKS5jb2VmZnMoKSwgcTIuY29lZmZzKCkpOworICBxMS5jb2VmZnMoKS5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMS5jb2VmZnMoKSwgKHExKnEyKS5jb2VmZnMoKSk7CisKKyAgLy8gdW5pdE9ydGhvZ29uYWwKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHUwLnVuaXRPcnRob2dvbmFsKCkuZWlnZW4yX2RvdCh1MCksIFNjYWxhcigxKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MC51bml0T3J0aG9nb25hbCgpLmVpZ2VuMl9kb3QodjApLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHUwLnVuaXRPcnRob2dvbmFsKCkubm9ybSgpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHYwLnVuaXRPcnRob2dvbmFsKCkubm9ybSgpLCBTY2FsYXIoMSkpOworCisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MCwgQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpICogdjApOworICBWRVJJRllfSVNfQVBQUk9YKC12MCwgQW5nbGVBeGlzeChTY2FsYXIoTV9QSSksIHYwLnVuaXRPcnRob2dvbmFsKCkpICogdjApOworICBWRVJJRllfSVNfQVBQUk9YKGVpX2NvcyhhKSp2MC5zcXVhcmVkTm9ybSgpLCB2MC5laWdlbjJfZG90KEFuZ2xlQXhpc3goYSwgdjAudW5pdE9ydGhvZ29uYWwoKSkgKiB2MCkpOworICBtID0gQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpLnRvUm90YXRpb25NYXRyaXgoKS5hZGpvaW50KCk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4Mzo6SWRlbnRpdHkoKSwgbSAqIEFuZ2xlQXhpc3goYSwgdjAubm9ybWFsaXplZCgpKSk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4Mzo6SWRlbnRpdHkoKSwgQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpICogbSk7CisKKyAgcTEgPSBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSk7CisgIHEyID0gQW5nbGVBeGlzeChhLCB2MS5ub3JtYWxpemVkKCkpOworCisgIC8vIGFuZ3VsYXIgZGlzdGFuY2UKKyAgU2NhbGFyIHJlZmFuZ2xlID0gZWlfYWJzKEFuZ2xlQXhpc3gocTEuaW52ZXJzZSgpKnEyKS5hbmdsZSgpKTsKKyAgaWYgKHJlZmFuZ2xlPlNjYWxhcihNX1BJKSkKKyAgICByZWZhbmdsZSA9IFNjYWxhcigyKSpTY2FsYXIoTV9QSSkgLSByZWZhbmdsZTsKKyAgCisgIGlmKChxMS5jb2VmZnMoKS1xMi5jb2VmZnMoKSkubm9ybSgpID4gMTAqbGFyZ2VFcHMpCisgIHsKKyAgICBWRVJJRlkoZWlfaXNBcHByb3gocTEuYW5ndWxhckRpc3RhbmNlKHEyKSwgcmVmYW5nbGUsIGxhcmdlRXBzKSk7CisgIH0KKworICAvLyByb3RhdGlvbiBtYXRyaXggY29udmVyc2lvbgorICBWRVJJRllfSVNfQVBQUk9YKHExICogdjIsIHExLnRvUm90YXRpb25NYXRyaXgoKSAqIHYyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHEyICogdjIsCisgICAgcTEudG9Sb3RhdGlvbk1hdHJpeCgpICogcTIudG9Sb3RhdGlvbk1hdHJpeCgpICogdjIpOworCisgIFZFUklGWSggKHEyKnExKS5pc0FwcHJveChxMSpxMiwgbGFyZ2VFcHMpIHx8ICEocTIgKiBxMSAqIHYyKS5pc0FwcHJveCgKKyAgICBxMS50b1JvdGF0aW9uTWF0cml4KCkgKiBxMi50b1JvdGF0aW9uTWF0cml4KCkgKiB2MikpOworCisgIHEyID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworICBWRVJJRllfSVNfQVBQUk9YKHExKnYxLHEyKnYxKTsKKworICBtYXRyb3QxID0gQW5nbGVBeGlzeChTY2FsYXIoMC4xKSwgVmVjdG9yMzo6VW5pdFgoKSkKKyAgICAgICAgICAqIEFuZ2xlQXhpc3goU2NhbGFyKDAuMiksIFZlY3RvcjM6OlVuaXRZKCkpCisgICAgICAgICAgKiBBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzOjpVbml0WigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRyb3QxICogdjEsCisgICAgICAgQW5nbGVBeGlzeChTY2FsYXIoMC4xKSwgVmVjdG9yMygxLDAsMCkpLnRvUm90YXRpb25NYXRyaXgoKQorICAgICogKEFuZ2xlQXhpc3goU2NhbGFyKDAuMiksIFZlY3RvcjMoMCwxLDApKS50b1JvdGF0aW9uTWF0cml4KCkKKyAgICAqIChBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzKDAsMCwxKSkudG9Sb3RhdGlvbk1hdHJpeCgpICogdjEpKSk7CisKKyAgLy8gYW5nbGUtYXhpcyBjb252ZXJzaW9uCisgIEFuZ2xlQXhpc3ggYWEgPSBxMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHYxLCBRdWF0ZXJuaW9ueChhYSkgKiB2MSk7CisgIFZFUklGWV9JU19OT1RfQVBQUk9YKHExICogdjEsIFF1YXRlcm5pb254KEFuZ2xlQXhpc3goYWEuYW5nbGUoKSoyLGFhLmF4aXMoKSkpICogdjEpOworCisgIC8vIGZyb20gdHdvIHZlY3RvciBjcmVhdGlvbgorICBWRVJJRllfSVNfQVBQUk9YKHYyLm5vcm1hbGl6ZWQoKSwocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsdjIpKnYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHYyLm5vcm1hbGl6ZWQoKSwocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsdjIpKnYxKS5ub3JtYWxpemVkKCkpOworCisgIC8vIGludmVyc2UgYW5kIGNvbmp1Z2F0ZQorICBWRVJJRllfSVNfQVBQUk9YKHExICogKHExLmludmVyc2UoKSAqIHYxKSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHExICogKHExLmNvbmp1Z2F0ZSgpICogdjEpLCB2MSk7CisKKyAgLy8gQW5nbGVBeGlzCisgIFZFUklGWV9JU19BUFBST1goQW5nbGVBeGlzeChhLHYxLm5vcm1hbGl6ZWQoKSkudG9Sb3RhdGlvbk1hdHJpeCgpLAorICAgIFF1YXRlcm5pb254KEFuZ2xlQXhpc3goYSx2MS5ub3JtYWxpemVkKCkpKS50b1JvdGF0aW9uTWF0cml4KCkpOworCisgIEFuZ2xlQXhpc3ggYWExOworICBtID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworICBhYTEgPSBtOworICBWRVJJRllfSVNfQVBQUk9YKEFuZ2xlQXhpc3gobSkudG9Sb3RhdGlvbk1hdHJpeCgpLAorICAgIFF1YXRlcm5pb254KG0pLnRvUm90YXRpb25NYXRyaXgoKSk7CisKKyAgLy8gVHJhbnNmb3JtCisgIC8vIFRPRE8gY29tcGxldGUgdGhlIHRlc3RzICEKKyAgYSA9IDA7CisgIHdoaWxlIChlaV9hYnMoYSk8U2NhbGFyKDAuMSkpCisgICAgYSA9IGVpX3JhbmRvbTxTY2FsYXI+KC1TY2FsYXIoMC40KSpTY2FsYXIoTV9QSSksIFNjYWxhcigwLjQpKlNjYWxhcihNX1BJKSk7CisgIHExID0gQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpOworICBUcmFuc2Zvcm0zIHQwLCB0MSwgdDI7CisgIC8vIGZpcnN0IHRlc3Qgc2V0SWRlbnRpdHkoKSBhbmQgSWRlbnRpdHkoKQorICB0MC5zZXRJZGVudGl0eSgpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCBUcmFuc2Zvcm0zOjpNYXRyaXhUeXBlOjpJZGVudGl0eSgpKTsKKyAgdDAubWF0cml4KCkuc2V0WmVybygpOworICB0MCA9IFRyYW5zZm9ybTM6OklkZW50aXR5KCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIFRyYW5zZm9ybTM6Ok1hdHJpeFR5cGU6OklkZW50aXR5KCkpOworCisgIHQwLmxpbmVhcigpID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworICB0MS5zZXRJZGVudGl0eSgpOworICB0MS5saW5lYXIoKSA9IHExLnRvUm90YXRpb25NYXRyaXgoKTsKKworICB2MCA8PCA1MCwgMiwgMTsvLz0gZWlfcmFuZG9tX21hdHJpeDxWZWN0b3IzPigpLmN3aXNlUHJvZHVjdChWZWN0b3IzKDEwLDIsMC41KSk7CisgIHQwLnNjYWxlKHYwKTsKKyAgdDEucHJlc2NhbGUodjApOworCisgIFZFUklGWV9JU19BUFBST1goICh0MCAqIFZlY3RvcjMoMSwwLDApKS5ub3JtKCksIHYwLngoKSk7CisgIC8vVkVSSUZZKCFlaV9pc0FwcHJveCgodDEgKiBWZWN0b3IzKDEsMCwwKSkubm9ybSgpLCB2MC54KCkpKTsKKworICB0MC5zZXRJZGVudGl0eSgpOworICB0MS5zZXRJZGVudGl0eSgpOworICB2MSA8PCAxLCAyLCAzOworICB0MC5saW5lYXIoKSA9IHExLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgdDAucHJldHJhbnNsYXRlKHYwKTsKKyAgdDAuc2NhbGUodjEpOworICB0MS5saW5lYXIoKSA9IHExLmNvbmp1Z2F0ZSgpLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgdDEucHJlc2NhbGUodjEuY3dpc2UoKS5pbnZlcnNlKCkpOworICB0MS50cmFuc2xhdGUoLXYwKTsKKworICBWRVJJRlkoKHQwLm1hdHJpeCgpICogdDEubWF0cml4KCkpLmlzSWRlbnRpdHkodGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisKKyAgdDEuZnJvbVBvc2l0aW9uT3JpZW50YXRpb25TY2FsZSh2MCwgcTEsIHYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MS5tYXRyaXgoKSwgdDAubWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHQxKnYxLCB0MCp2MSk7CisKKyAgdDAuc2V0SWRlbnRpdHkoKTsgdDAuc2NhbGUodjApLnJvdGF0ZShxMS50b1JvdGF0aW9uTWF0cml4KCkpOworICB0MS5zZXRJZGVudGl0eSgpOyB0MS5zY2FsZSh2MCkucm90YXRlKHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIHQwLnNldElkZW50aXR5KCk7IHQwLnNjYWxlKHYwKS5yb3RhdGUoQW5nbGVBeGlzeChxMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5zY2FsZShhKS5tYXRyaXgoKSwgdDEuc2NhbGUoVmVjdG9yMzo6Q29uc3RhbnQoYSkpLm1hdHJpeCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5wcmVzY2FsZShhKS5tYXRyaXgoKSwgdDEucHJlc2NhbGUoVmVjdG9yMzo6Q29uc3RhbnQoYSkpLm1hdHJpeCgpKTsKKworICAvLyBNb3JlIHRyYW5zZm9ybSBjb25zdHJ1Y3RvcnMsIG9wZXJhdG9yPSwgb3BlcmF0b3IqPQorCisgIE1hdHJpeDMgbWF0MyA9IE1hdHJpeDM6OlJhbmRvbSgpOworICBNYXRyaXg0IG1hdDQ7CisgIG1hdDQgPDwgbWF0MyAsIFZlY3RvcjM6Olplcm8oKSAsIFZlY3RvcjQ6Olplcm8oKS50cmFuc3Bvc2UoKTsKKyAgVHJhbnNmb3JtMyB0bWF0MyhtYXQzKSwgdG1hdDQobWF0NCk7CisgIHRtYXQ0Lm1hdHJpeCgpKDMsMykgPSBTY2FsYXIoMSk7CisgIFZFUklGWV9JU19BUFBST1godG1hdDMubWF0cml4KCksIHRtYXQ0Lm1hdHJpeCgpKTsKKworICBTY2FsYXIgYTMgPSBlaV9yYW5kb208U2NhbGFyPigtU2NhbGFyKE1fUEkpLCBTY2FsYXIoTV9QSSkpOworICBWZWN0b3IzIHYzID0gVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpOworICBBbmdsZUF4aXN4IGFhMyhhMywgdjMpOworICBUcmFuc2Zvcm0zIHQzKGFhMyk7CisgIFRyYW5zZm9ybTMgdDQ7CisgIHQ0ID0gYWEzOworICBWRVJJRllfSVNfQVBQUk9YKHQzLm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisgIHQ0LnJvdGF0ZShBbmdsZUF4aXN4KC1hMyx2MykpOworICBWRVJJRllfSVNfQVBQUk9YKHQ0Lm1hdHJpeCgpLCBNYXRyaXg0OjpJZGVudGl0eSgpKTsKKyAgdDQgKj0gYWEzOworICBWRVJJRllfSVNfQVBQUk9YKHQzLm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisKKyAgdjMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgVHJhbnNsYXRpb24zIHR2Myh2Myk7CisgIFRyYW5zZm9ybTMgdDUodHYzKTsKKyAgdDQgPSB0djM7CisgIFZFUklGWV9JU19BUFBST1godDUubWF0cml4KCksIHQ0Lm1hdHJpeCgpKTsKKyAgdDQudHJhbnNsYXRlKC12Myk7CisgIFZFUklGWV9JU19BUFBST1godDQubWF0cml4KCksIE1hdHJpeDQ6OklkZW50aXR5KCkpOworICB0NCAqPSB0djM7CisgIFZFUklGWV9JU19BUFBST1godDUubWF0cml4KCksIHQ0Lm1hdHJpeCgpKTsKKworICBTY2FsaW5nMyBzdjModjMpOworICBUcmFuc2Zvcm0zIHQ2KHN2Myk7CisgIHQ0ID0gc3YzOworICBWRVJJRllfSVNfQVBQUk9YKHQ2Lm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisgIHQ0LnNjYWxlKHYzLmN3aXNlKCkuaW52ZXJzZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0NC5tYXRyaXgoKSwgTWF0cml4NDo6SWRlbnRpdHkoKSk7CisgIHQ0ICo9IHN2MzsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0Ni5tYXRyaXgoKSwgdDQubWF0cml4KCkpOworCisgIC8vIG1hdHJpeCAqIHRyYW5zZm9ybQorICBWRVJJRllfSVNfQVBQUk9YKFRyYW5zZm9ybTModDMubWF0cml4KCkqdDQpLm1hdHJpeCgpLCBUcmFuc2Zvcm0zKHQzKnQ0KS5tYXRyaXgoKSk7CisKKyAgLy8gY2hhaW5lZCBUcmFuc2Zvcm0gcHJvZHVjdAorICBWRVJJRllfSVNfQVBQUk9YKCgodDMqdDQpKnQ1KS5tYXRyaXgoKSwgKHQzKih0NCp0NSkpLm1hdHJpeCgpKTsKKworICAvLyBjaGVjayB0aGF0IFRyYW5zZm9ybSBwcm9kdWN0IGRvZXNuJ3QgaGF2ZSBhbGlhc2luZyBwcm9ibGVtcworICB0NSA9IHQ0OworICB0NSA9IHQ1KnQ1OworICBWRVJJRllfSVNfQVBQUk9YKHQ1LCB0NCp0NCk7CisKKyAgLy8gMkQgdHJhbnNmb3JtYXRpb24KKyAgVHJhbnNmb3JtMiB0MjAsIHQyMTsKKyAgVmVjdG9yMiB2MjAgPSBWZWN0b3IyOjpSYW5kb20oKTsKKyAgVmVjdG9yMiB2MjEgPSBWZWN0b3IyOjpSYW5kb20oKTsKKyAgZm9yIChpbnQgaz0wOyBrPDI7ICsraykKKyAgICBpZiAoZWlfYWJzKHYyMVtrXSk8U2NhbGFyKDFlLTMpKSB2MjFba10gPSBTY2FsYXIoMWUtMyk7CisgIHQyMS5zZXRJZGVudGl0eSgpOworICB0MjEubGluZWFyKCkgPSBSb3RhdGlvbjJEPFNjYWxhcj4oYSkudG9Sb3RhdGlvbk1hdHJpeCgpOworICBWRVJJRllfSVNfQVBQUk9YKHQyMC5mcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKHYyMCxhLHYyMSkubWF0cml4KCksCisgICAgdDIxLnByZXRyYW5zbGF0ZSh2MjApLnNjYWxlKHYyMSkubWF0cml4KCkpOworCisgIHQyMS5zZXRJZGVudGl0eSgpOworICB0MjEubGluZWFyKCkgPSBSb3RhdGlvbjJEPFNjYWxhcj4oLWEpLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgVkVSSUZZKCAodDIwLmZyb21Qb3NpdGlvbk9yaWVudGF0aW9uU2NhbGUodjIwLGEsdjIxKQorICAgICAgICAqICh0MjEucHJlc2NhbGUodjIxLmN3aXNlKCkuaW52ZXJzZSgpKS50cmFuc2xhdGUoLXYyMCkpKS5tYXRyaXgoKS5pc0lkZW50aXR5KHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgKTsKKworICAvLyBUcmFuc2Zvcm0gLSBuZXcgQVBJCisgIC8vIDNECisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnJvdGF0ZShxMSkuc2NhbGUodjApLnRyYW5zbGF0ZSh2MCk7CisgIC8vIG1hdCAqIHNjYWxpbmcgYW5kIG1hdCAqIHRyYW5zbGF0aW9uCisgIHQxID0gKE1hdHJpeDMocTEpICogU2NhbGluZzModjApKSAqIFRyYW5zbGF0aW9uMyh2MCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgLy8gbWF0ICogdHJhbnNmb3JtYXRpb24gYW5kIHNjYWxpbmcgKiB0cmFuc2xhdGlvbgorICB0MSA9IE1hdHJpeDMocTEpICogKFNjYWxpbmczKHYwKSAqIFRyYW5zbGF0aW9uMyh2MCkpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAucHJlcm90YXRlKHExKS5wcmVzY2FsZSh2MCkucHJldHJhbnNsYXRlKHYwKTsKKyAgLy8gdHJhbnNsYXRpb24gKiBzY2FsaW5nIGFuZCB0cmFuc2Zvcm1hdGlvbiAqIG1hdAorICB0MSA9IChUcmFuc2xhdGlvbjModjApICogU2NhbGluZzModjApKSAqIE1hdHJpeDMocTEpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisgIC8vIHNjYWxpbmcgKiBtYXQgYW5kIHRyYW5zbGF0aW9uICogbWF0CisgIHQxID0gVHJhbnNsYXRpb24zKHYwKSAqIChTY2FsaW5nMyh2MCkgKiBNYXRyaXgzKHExKSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICB0MC5zZXRJZGVudGl0eSgpOworICB0MC5zY2FsZSh2MCkudHJhbnNsYXRlKHYwKS5yb3RhdGUocTEpOworICAvLyB0cmFuc2xhdGlvbiAqIG1hdCBhbmQgc2NhbGluZyAqIHRyYW5zZm9ybWF0aW9uCisgIHQxID0gU2NhbGluZzModjApICogKFRyYW5zbGF0aW9uMyh2MCkgKiBNYXRyaXgzKHExKSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgLy8gdHJhbnNmb3JtYXRpb24gKiBzY2FsaW5nCisgIHQwLnNjYWxlKHYwKTsKKyAgdDEgPSB0MSAqIFNjYWxpbmczKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICAvLyB0cmFuc2Zvcm1hdGlvbiAqIHRyYW5zbGF0aW9uCisgIHQwLnRyYW5zbGF0ZSh2MCk7CisgIHQxID0gdDEgKiBUcmFuc2xhdGlvbjModjApOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisgIC8vIHRyYW5zbGF0aW9uICogdHJhbnNmb3JtYXRpb24KKyAgdDAucHJldHJhbnNsYXRlKHYwKTsKKyAgdDEgPSBUcmFuc2xhdGlvbjModjApICogdDE7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICAvLyB0cmFuc2Zvcm0gKiBxdWF0ZXJuaW9uCisgIHQwLnJvdGF0ZShxMSk7CisgIHQxID0gdDEgKiBxMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHRyYW5zbGF0aW9uICogcXVhdGVybmlvbgorICB0MC50cmFuc2xhdGUodjEpLnJvdGF0ZShxMSk7CisgIHQxID0gdDEgKiAoVHJhbnNsYXRpb24zKHYxKSAqIHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHNjYWxpbmcgKiBxdWF0ZXJuaW9uCisgIHQwLnNjYWxlKHYxKS5yb3RhdGUocTEpOworICB0MSA9IHQxICogKFNjYWxpbmczKHYxKSAqIHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHF1YXRlcm5pb24gKiB0cmFuc2Zvcm0KKyAgdDAucHJlcm90YXRlKHExKTsKKyAgdDEgPSBxMSAqIHQxOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgLy8gcXVhdGVybmlvbiAqIHRyYW5zbGF0aW9uCisgIHQwLnJvdGF0ZShxMSkudHJhbnNsYXRlKHYxKTsKKyAgdDEgPSB0MSAqIChxMSAqIFRyYW5zbGF0aW9uMyh2MSkpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgLy8gcXVhdGVybmlvbiAqIHNjYWxpbmcKKyAgdDAucm90YXRlKHExKS5zY2FsZSh2MSk7CisgIHQxID0gdDEgKiAocTEgKiBTY2FsaW5nMyh2MSkpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgLy8gdHJhbnNsYXRpb24gKiB2ZWN0b3IKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAudHJhbnNsYXRlKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MCAqIHYxLCBUcmFuc2xhdGlvbjModjApICogdjEpOworCisgIC8vIHNjYWxpbmcgKiB2ZWN0b3IKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAuc2NhbGUodjApOworICBWRVJJRllfSVNfQVBQUk9YKHQwICogdjEsIFNjYWxpbmczKHYwKSAqIHYxKTsKKworICAvLyB0ZXN0IHRyYW5zZm9ybSBpbnZlcnNpb24KKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAudHJhbnNsYXRlKHYwKTsKKyAgdDAubGluZWFyKCkuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1godDAuaW52ZXJzZShBZmZpbmUpLCB0MC5tYXRyaXgoKS5pbnZlcnNlKCkpOworICB0MC5zZXRJZGVudGl0eSgpOworICB0MC50cmFuc2xhdGUodjApLnJvdGF0ZShxMSk7CisgIFZFUklGWV9JU19BUFBST1godDAuaW52ZXJzZShJc29tZXRyeSksIHQwLm1hdHJpeCgpLmludmVyc2UoKSk7CisKKyAgLy8gdGVzdCBleHRyYWN0IHJvdGF0aW9uIGFuZCBzY2FsaW5nCisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnRyYW5zbGF0ZSh2MCkucm90YXRlKHExKS5zY2FsZSh2MSk7CisgIFZFUklGWV9JU19BUFBST1godDAucm90YXRpb24oKSAqIHYxLCBNYXRyaXgzKHExKSAqIHYxKTsKKworICBNYXRyaXgzIG1hdF9yb3RhdGlvbiwgbWF0X3NjYWxpbmc7CisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnRyYW5zbGF0ZSh2MCkucm90YXRlKHExKS5zY2FsZSh2MSk7CisgIHQwLmNvbXB1dGVSb3RhdGlvblNjYWxpbmcoJm1hdF9yb3RhdGlvbiwgJm1hdF9zY2FsaW5nKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5saW5lYXIoKSwgbWF0X3JvdGF0aW9uICogbWF0X3NjYWxpbmcpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdF9yb3RhdGlvbiptYXRfcm90YXRpb24uYWRqb2ludCgpLCBNYXRyaXgzOjpJZGVudGl0eSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRfcm90YXRpb24uZGV0ZXJtaW5hbnQoKSwgU2NhbGFyKDEpKTsKKyAgdDAuY29tcHV0ZVNjYWxpbmdSb3RhdGlvbigmbWF0X3NjYWxpbmcsICZtYXRfcm90YXRpb24pOworICBWRVJJRllfSVNfQVBQUk9YKHQwLmxpbmVhcigpLCBtYXRfc2NhbGluZyAqIG1hdF9yb3RhdGlvbik7CisgIFZFUklGWV9JU19BUFBST1gobWF0X3JvdGF0aW9uKm1hdF9yb3RhdGlvbi5hZGpvaW50KCksIE1hdHJpeDM6OklkZW50aXR5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdF9yb3RhdGlvbi5kZXRlcm1pbmFudCgpLCBTY2FsYXIoMSkpOworCisgIC8vIHRlc3QgY2FzdGluZworICBlaWdlbjJfVHJhbnNmb3JtPGZsb2F0LDM+IHQxZiA9IHQxLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1godDFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHQxKTsKKyAgZWlnZW4yX1RyYW5zZm9ybTxkb3VibGUsMz4gdDFkID0gdDEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7CisgIFZFUklGWV9JU19BUFBST1godDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHQxKTsKKworICBUcmFuc2xhdGlvbjMgdHIxKHYwKTsKKyAgZWlnZW4yX1RyYW5zbGF0aW9uPGZsb2F0LDM+IHRyMWYgPSB0cjEudGVtcGxhdGUgY2FzdDxmbG9hdD4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0cjFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHRyMSk7CisgIGVpZ2VuMl9UcmFuc2xhdGlvbjxkb3VibGUsMz4gdHIxZCA9IHRyMS50ZW1wbGF0ZSBjYXN0PGRvdWJsZT4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0cjFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHRyMSk7CisKKyAgU2NhbGluZzMgc2MxKHYwKTsKKyAgZWlnZW4yX1NjYWxpbmc8ZmxvYXQsMz4gc2MxZiA9IHNjMS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpOworICBWRVJJRllfSVNfQVBQUk9YKHNjMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksc2MxKTsKKyAgZWlnZW4yX1NjYWxpbmc8ZG91YmxlLDM+IHNjMWQgPSBzYzEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7CisgIFZFUklGWV9JU19BUFBST1goc2MxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxzYzEpOworCisgIGVpZ2VuMl9RdWF0ZXJuaW9uPGZsb2F0PiBxMWYgPSBxMS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpOworICBWRVJJRllfSVNfQVBQUk9YKHExZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxxMSk7CisgIGVpZ2VuMl9RdWF0ZXJuaW9uPGRvdWJsZT4gcTFkID0gcTEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7CisgIFZFUklGWV9JU19BUFBST1gocTFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHExKTsKKworICBlaWdlbjJfQW5nbGVBeGlzPGZsb2F0PiBhYTFmID0gYWExLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1goYWExZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxhYTEpOworICBlaWdlbjJfQW5nbGVBeGlzPGRvdWJsZT4gYWExZCA9IGFhMS50ZW1wbGF0ZSBjYXN0PGRvdWJsZT4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYTFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLGFhMSk7CisKKyAgZWlnZW4yX1JvdGF0aW9uMkQ8U2NhbGFyPiByMmQxKGVpX3JhbmRvbTxTY2FsYXI+KCkpOworICBlaWdlbjJfUm90YXRpb24yRDxmbG9hdD4gcjJkMWYgPSByMmQxLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1gocjJkMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkscjJkMSk7CisgIGVpZ2VuMl9Sb3RhdGlvbjJEPGRvdWJsZT4gcjJkMWQgPSByMmQxLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKHIyZDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHIyZDEpOworCisgIG0gPSBxMTsKKy8vICAgbS5jb2woMSkgPSBWZWN0b3IzKDAsZWlfcmFuZG9tPFNjYWxhcj4oKSxlaV9yYW5kb208U2NhbGFyPigpKS5ub3JtYWxpemVkKCk7CisvLyAgIG0uY29sKDApID0gVmVjdG9yMygtMSwwLDApLm5vcm1hbGl6ZWQoKTsKKy8vICAgbS5jb2woMikgPSBtLmNvbCgwKS5jcm9zcyhtLmNvbCgxKSk7CisgICNkZWZpbmUgVkVSSUZZX0VVTEVSKEksSixLLCBYLFksWikgeyBcCisgICAgVmVjdG9yMyBlYSA9IG0uZXVsZXJBbmdsZXMoSSxKLEspOyBcCisgICAgTWF0cml4MyBtMSA9IE1hdHJpeDMoQW5nbGVBeGlzeChlYVswXSwgVmVjdG9yMzo6VW5pdCMjWCgpKSAqIEFuZ2xlQXhpc3goZWFbMV0sIFZlY3RvcjM6OlVuaXQjI1koKSkgKiBBbmdsZUF4aXN4KGVhWzJdLCBWZWN0b3IzOjpVbml0IyNaKCkpKTsgXAorICAgIFZFUklGWV9JU19BUFBST1gobSwgIE1hdHJpeDMoQW5nbGVBeGlzeChlYVswXSwgVmVjdG9yMzo6VW5pdCMjWCgpKSAqIEFuZ2xlQXhpc3goZWFbMV0sIFZlY3RvcjM6OlVuaXQjI1koKSkgKiBBbmdsZUF4aXN4KGVhWzJdLCBWZWN0b3IzOjpVbml0IyNaKCkpKSk7IFwKKyAgfQorICBWRVJJRllfRVVMRVIoMCwxLDIsIFgsWSxaKTsKKyAgVkVSSUZZX0VVTEVSKDAsMSwwLCBYLFksWCk7CisgIFZFUklGWV9FVUxFUigwLDIsMSwgWCxaLFkpOworICBWRVJJRllfRVVMRVIoMCwyLDAsIFgsWixYKTsKKworICBWRVJJRllfRVVMRVIoMSwyLDAsIFksWixYKTsKKyAgVkVSSUZZX0VVTEVSKDEsMiwxLCBZLFosWSk7CisgIFZFUklGWV9FVUxFUigxLDAsMiwgWSxYLFopOworICBWRVJJRllfRVVMRVIoMSwwLDEsIFksWCxZKTsKKworICBWRVJJRllfRVVMRVIoMiwwLDEsIFosWCxZKTsKKyAgVkVSSUZZX0VVTEVSKDIsMCwyLCBaLFgsWik7CisgIFZFUklGWV9FVUxFUigyLDEsMCwgWixZLFgpOworICBWRVJJRllfRVVMRVIoMiwxLDIsIFosWSxaKTsKKworICAvLyBjb2x3aXNlL3Jvd3dpc2UgY3Jvc3MgcHJvZHVjdAorICBtYXQzLnNldFJhbmRvbSgpOworICBWZWN0b3IzIHZlYzMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgTWF0cml4MyBtY3Jvc3M7CisgIGludCBpID0gZWlfcmFuZG9tPGludD4oMCwyKTsKKyAgbWNyb3NzID0gbWF0My5jb2x3aXNlKCkuY3Jvc3ModmVjMyk7CisgIFZFUklGWV9JU19BUFBST1gobWNyb3NzLmNvbChpKSwgbWF0My5jb2woaSkuY3Jvc3ModmVjMykpOworICBtY3Jvc3MgPSBtYXQzLnJvd3dpc2UoKS5jcm9zcyh2ZWMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtY3Jvc3Mucm93KGkpLCBtYXQzLnJvdyhpKS5jcm9zcyh2ZWMzKSk7CisKKworfQorCit2b2lkIHRlc3RfZWlnZW4yX2dlb21ldHJ5X3dpdGhfZWlnZW4yX3ByZWZpeCgpCit7CisgIHN0ZDo6Y291dCA8PCAiZWlnZW4yIHN1cHBvcnQ6ICIgPDwgRUlHRU4yX1NVUFBPUlRfU1RBR0UgPDwgc3RkOjplbmRsOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBnZW9tZXRyeTxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBnZW9tZXRyeTxkb3VibGU+KCkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2h5cGVycGxhbmUuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX2h5cGVycGxhbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjg1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfaHlwZXJwbGFuZS5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK3RlbXBsYXRlPHR5cGVuYW1lIEh5cGVycGxhbmVUeXBlPiB2b2lkIGh5cGVycGxhbmUoY29uc3QgSHlwZXJwbGFuZVR5cGUmIF9wbGFuZSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBIeXBlcnBsYW5lLmgKKyAgKi8KKworICBjb25zdCBpbnQgZGltID0gX3BsYW5lLmRpbSgpOworICB0eXBlZGVmIHR5cGVuYW1lIEh5cGVycGxhbmVUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgSHlwZXJwbGFuZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWU+IE1hdHJpeFR5cGU7CisKKyAgVmVjdG9yVHlwZSBwMCA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOworICBWZWN0b3JUeXBlIHAxID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CisKKyAgVmVjdG9yVHlwZSBuMCA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pLm5vcm1hbGl6ZWQoKTsKKyAgVmVjdG9yVHlwZSBuMSA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pLm5vcm1hbGl6ZWQoKTsKKworICBIeXBlcnBsYW5lVHlwZSBwbDAobjAsIHAwKTsKKyAgSHlwZXJwbGFuZVR5cGUgcGwxKG4xLCBwMSk7CisgIEh5cGVycGxhbmVUeXBlIHBsMiA9IHBsMTsKKworICBTY2FsYXIgczAgPSBlaV9yYW5kb208U2NhbGFyPigpOworICBTY2FsYXIgczEgPSBlaV9yYW5kb208U2NhbGFyPigpOworCisgIFZFUklGWV9JU19BUFBST1goIG4xLmVpZ2VuMl9kb3QobjEpLCBTY2FsYXIoMSkgKTsKKworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHBsMC5hYnNEaXN0YW5jZShwMCksIFNjYWxhcigxKSApOworICBWRVJJRllfSVNfQVBQUk9YKCBwbDEuc2lnbmVkRGlzdGFuY2UocDEgKyBuMSAqIHMwKSwgczAgKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDEuc2lnbmVkRGlzdGFuY2UocGwxLnByb2plY3Rpb24ocDApKSwgU2NhbGFyKDEpICk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwxLmFic0Rpc3RhbmNlKHAxICsgIHBsMS5ub3JtYWwoKS51bml0T3J0aG9nb25hbCgpICogczEpLCBTY2FsYXIoMSkgKTsKKworICAvLyB0cmFuc2Zvcm0KKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4KQorICB7CisgICAgTWF0cml4VHlwZSByb3QgPSBNYXRyaXhUeXBlOjpSYW5kb20oZGltLGRpbSkucXIoKS5tYXRyaXhRKCk7CisgICAgU2NhbGluZzxTY2FsYXIsSHlwZXJwbGFuZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiBzY2FsaW5nKFZlY3RvclR5cGU6OlJhbmRvbSgpKTsKKyAgICBUcmFuc2xhdGlvbjxTY2FsYXIsSHlwZXJwbGFuZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiB0cmFuc2xhdGlvbihWZWN0b3JUeXBlOjpSYW5kb20oKSk7CisKKyAgICBwbDIgPSBwbDE7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCkuYWJzRGlzdGFuY2Uocm90ICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBwbDIgPSBwbDE7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCxJc29tZXRyeSkuYWJzRGlzdGFuY2Uocm90ICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBwbDIgPSBwbDE7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCpzY2FsaW5nKS5hYnNEaXN0YW5jZSgocm90KnNjYWxpbmcpICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBwbDIgPSBwbDE7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCpzY2FsaW5nKnRyYW5zbGF0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFic0Rpc3RhbmNlKChyb3Qqc2NhbGluZyp0cmFuc2xhdGlvbikgKiBwMSksIFNjYWxhcigxKSApOworICAgIHBsMiA9IHBsMTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHBsMi50cmFuc2Zvcm0ocm90KnRyYW5zbGF0aW9uLElzb21ldHJ5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFic0Rpc3RhbmNlKChyb3QqdHJhbnNsYXRpb24pICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgfQorCisgIC8vIGNhc3RpbmcKKyAgY29uc3QgaW50IERpbSA9IEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBHZXREaWZmZXJlbnRUeXBlPFNjYWxhcj46OnR5cGUgT3RoZXJTY2FsYXI7CisgIEh5cGVycGxhbmU8T3RoZXJTY2FsYXIsRGltPiBocDFmID0gcGwxLnRlbXBsYXRlIGNhc3Q8T3RoZXJTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxwbDEpOworICBIeXBlcnBsYW5lPFNjYWxhcixEaW0+IGhwMWQgPSBwbDEudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxwbDEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgbGluZXMoKQoreworICB0eXBlZGVmIEh5cGVycGxhbmU8U2NhbGFyLCAyPiBITGluZTsKKyAgdHlwZWRlZiBQYXJhbWV0cml6ZWRMaW5lPFNjYWxhciwgMj4gUExpbmU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwyLDE+IFZlY3RvcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gQ29lZmZzVHlwZTsKKworICBmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgeworICAgIFZlY3RvciBjZW50ZXIgPSBWZWN0b3I6OlJhbmRvbSgpOworICAgIFZlY3RvciB1ID0gVmVjdG9yOjpSYW5kb20oKTsKKyAgICBWZWN0b3IgdiA9IFZlY3Rvcjo6UmFuZG9tKCk7CisgICAgU2NhbGFyIGEgPSBlaV9yYW5kb208U2NhbGFyPigpOworICAgIHdoaWxlIChlaV9hYnMoYS0xKSA8IDFlLTQpIGEgPSBlaV9yYW5kb208U2NhbGFyPigpOworICAgIHdoaWxlICh1Lm5vcm0oKSA8IDFlLTQpIHUgPSBWZWN0b3I6OlJhbmRvbSgpOworICAgIHdoaWxlICh2Lm5vcm0oKSA8IDFlLTQpIHYgPSBWZWN0b3I6OlJhbmRvbSgpOworCisgICAgSExpbmUgbGluZV91ID0gSExpbmU6OlRocm91Z2goY2VudGVyICsgdSwgY2VudGVyICsgYSp1KTsKKyAgICBITGluZSBsaW5lX3YgPSBITGluZTo6VGhyb3VnaChjZW50ZXIgKyB2LCBjZW50ZXIgKyBhKnYpOworCisgICAgLy8gdGhlIGxpbmUgZXF1YXRpb25zIHNob3VsZCBiZSBub3JtYWxpemVkIHNvIHRoYXQgYV4yK2JeMj0xCisgICAgVkVSSUZZX0lTX0FQUFJPWChsaW5lX3Uubm9ybWFsKCkubm9ybSgpLCBTY2FsYXIoMSkpOworICAgIFZFUklGWV9JU19BUFBST1gobGluZV92Lm5vcm1hbCgpLm5vcm0oKSwgU2NhbGFyKDEpKTsKKworICAgIFZlY3RvciByZXN1bHQgPSBsaW5lX3UuaW50ZXJzZWN0aW9uKGxpbmVfdik7CisKKyAgICAvLyB0aGUgbGluZXMgc2hvdWxkIGludGVyc2VjdCBhdCB0aGUgcG9pbnQgd2UgY2FsbGVkICJjZW50ZXIiCisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQsIGNlbnRlcik7CisKKyAgICAvLyBjaGVjayBjb252ZXJzaW9ucyBiZXR3ZWVuIHR3byB0eXBlcyBvZiBsaW5lcworICAgIFBMaW5lIHBsKGxpbmVfdSk7IC8vIGdjYyAzLjMgd2lsbCBjb21taXQgc3VpY2lkZSBpZiB3ZSBkb24ndCBuYW1lIHRoaXMgdmFyaWFibGUKKyAgICBDb2VmZnNUeXBlIGNvbnZlcnRlZF9jb2VmZnMoSExpbmUocGwpLmNvZWZmcygpKTsKKyAgICBjb252ZXJ0ZWRfY29lZmZzICo9IGxpbmVfdS5jb2VmZnMoKSgwKS9jb252ZXJ0ZWRfY29lZmZzKDApOworICAgIFZFUklGWShsaW5lX3UuY29lZmZzKCkuaXNBcHByb3goY29udmVydGVkX2NvZWZmcykpOworICB9Cit9CisKK3ZvaWQgdGVzdF9laWdlbjJfaHlwZXJwbGFuZSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGh5cGVycGxhbmUoSHlwZXJwbGFuZTxmbG9hdCwyPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBoeXBlcnBsYW5lKEh5cGVycGxhbmU8ZmxvYXQsMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggaHlwZXJwbGFuZShIeXBlcnBsYW5lPGRvdWJsZSw0PigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBoeXBlcnBsYW5lKEh5cGVycGxhbmU8c3RkOjpjb21wbGV4PGRvdWJsZT4sNT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbGluZXM8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbGluZXM8ZG91YmxlPigpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9pbnZlcnNlLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9pbnZlcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGUxZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX2ludmVyc2UuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vTFU+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgaW52ZXJzZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIEludmVyc2UuaAorICAqLworICBpbnQgcm93cyA9IG0ucm93cygpOworICBpbnQgY29scyA9IG0uY29scygpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIocm93cywgY29scyksCisgICAgICAgICAgICAgbXplcm8gPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIGlkZW50aXR5ID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgcm93cyk7CisKKyAgd2hpbGUoZWlfYWJzKG0xLmRldGVybWluYW50KCkpIDwgUmVhbFNjYWxhcigwLjEpICYmIHJvd3MgPD0gOCkKKyAgeworICAgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICB9CisKKyAgbTIgPSBtMS5pbnZlcnNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0yLmludmVyc2UoKSApOworCisgIG0xLmNvbXB1dGVJbnZlcnNlKCZtMik7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0yLmludmVyc2UoKSApOworCisgIFZFUklGWV9JU19BUFBST1goKFNjYWxhcigyKSptMikuaW52ZXJzZSgpLCBtMi5pbnZlcnNlKCkqU2NhbGFyKDAuNSkpOworCisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xLmludmVyc2UoKSAqIG0xICk7CisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xICogbTEuaW52ZXJzZSgpICk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTEuaW52ZXJzZSgpLmludmVyc2UoKSApOworCisgIC8vIHNpbmNlIGZvciB0aGUgZ2VuZXJhbCBjYXNlIHdlIGltcGxlbWVudCBzZXBhcmF0ZWx5IHJvdy1tYWpvciBhbmQgY29sLW1ham9yLCB0ZXN0IHRoYXQKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS50cmFuc3Bvc2UoKS5pbnZlcnNlKCksIG0xLmludmVyc2UoKS50cmFuc3Bvc2UoKSk7Cit9CisKK3ZvaWQgdGVzdF9laWdlbjJfaW52ZXJzZSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGludmVyc2UoTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGludmVyc2UoTWF0cml4MmQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggaW52ZXJzZShNYXRyaXgzZigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBpbnZlcnNlKE1hdHJpeDRmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGludmVyc2UoTWF0cml4WGYoOCw4KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggaW52ZXJzZShNYXRyaXhYY2QoNyw3KSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2xpbmVhcnN0cnVjdHVyZS5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfbGluZWFyc3RydWN0dXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmYwMmMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX2xpbmVhcnN0cnVjdHVyZS5jcHAKQEAgLTAsMCArMSw4NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBsaW5lYXJTdHJ1Y3R1cmUoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBTdW0uaCBEaWZmZXJlbmNlLmggT3Bwb3NpdGUuaCBTY2FsYXJNdWx0aXBsZS5oCisgICovCisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKTsKKworICBTY2FsYXIgczEgPSBlaV9yYW5kb208U2NhbGFyPigpOworICB3aGlsZSAoZWlfYWJzKHMxKTwxZS0zKSBzMSA9IGVpX3JhbmRvbTxTY2FsYXI+KCk7CisKKyAgaW50IHIgPSBlaV9yYW5kb208aW50PigwLCByb3dzLTEpLAorICAgICAgYyA9IGVpX3JhbmRvbTxpbnQ+KDAsIGNvbHMtMSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgtKC1tMSksICAgICAgICAgICAgICAgICAgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xK20xLCAgICAgICAgICAgICAgICAgICAyKm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSttMi1tMSwgICAgICAgICAgICAgICAgbTIpOworICBWRVJJRllfSVNfQVBQUk9YKC1tMittMSttMiwgICAgICAgICAgICAgICBtMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEqczEsICAgICAgICAgICAgICAgICAgIHMxKm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTErbTIpKnMxLCAgICAgICAgICAgICAgczEqbTErczEqbTIpOworICBWRVJJRllfSVNfQVBQUk9YKCgtbTErbTIpKnMxLCAgICAgICAgICAgICAtczEqbTErczEqbTIpOworICBtMyA9IG0yOyBtMyArPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgbTErbTIpOworICBtMyA9IG0yOyBtMyAtPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgbTItbTEpOworICBtMyA9IG0yOyBtMyAqPSBzMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgczEqbTIpOworICBpZihOdW1UcmFpdHM8U2NhbGFyPjo6SGFzRmxvYXRpbmdQb2ludCkKKyAgeworICAgIG0zID0gbTI7IG0zIC89IHMxOworICAgIFZFUklGWV9JU19BUFBST1gobTMsICAgICAgICAgICAgICAgICAgICBtMi9zMSk7CisgIH0KKworICAvLyBhZ2FpbiwgdGVzdCBvcGVyYXRvcigpIHRvIGNoZWNrIGNvbnN0LXF1YWxpZmljYXRpb24KKyAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xKShyLGMpLCAtKG0xKHIsYykpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEtbTIpKHIsYyksIChtMShyLGMpKS0obTIocixjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSttMikocixjKSwgKG0xKHIsYykpKyhtMihyLGMpKSk7CisgIFZFUklGWV9JU19BUFBST1goKHMxKm0xKShyLGMpLCBzMSoobTEocixjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSpzMSkocixjKSwgKG0xKHIsYykpKnMxKTsKKyAgaWYoTnVtVHJhaXRzPFNjYWxhcj46Okhhc0Zsb2F0aW5nUG9pbnQpCisgICAgVkVSSUZZX0lTX0FQUFJPWCgobTEvczEpKHIsYyksIChtMShyLGMpKS9zMSk7CisKKyAgLy8gdXNlIC5ibG9jayB0byBkaXNhYmxlIHZlY3Rvcml6YXRpb24gYW5kIGNvbXBhcmUgdG8gdGhlIHZlY3Rvcml6ZWQgdmVyc2lvbgorICBWRVJJRllfSVNfQVBQUk9YKG0xK20xLmJsb2NrKDAsMCxyb3dzLGNvbHMpLCBtMSttMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKSAqIG0xLmJsb2NrKDAsMCxyb3dzLGNvbHMpLCBtMS5jd2lzZSgpICogbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xIC0gbTEuYmxvY2soMCwwLHJvd3MsY29scyksIG0xIC0gbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKDAsMCxyb3dzLGNvbHMpICogczEsIG0xICogczEpOworfQorCit2b2lkIHRlc3RfZWlnZW4yX2xpbmVhcnN0cnVjdHVyZSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGxpbmVhclN0cnVjdHVyZShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGxpbmVhclN0cnVjdHVyZShNYXRyaXgyZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBsaW5lYXJTdHJ1Y3R1cmUoVmVjdG9yM2QoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbGluZWFyU3RydWN0dXJlKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGxpbmVhclN0cnVjdHVyZShNYXRyaXhYY2YoMywgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGxpbmVhclN0cnVjdHVyZShNYXRyaXhYZig4LCAxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIGxpbmVhclN0cnVjdHVyZShNYXRyaXhYaSg4LCAxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIGxpbmVhclN0cnVjdHVyZShNYXRyaXhYY2QoMjAsIDIwKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX2x1LmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9sdS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5M2IxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9sdS5jcHAKQEAgLTAsMCArMSwxMjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordm9pZCBkb1NvbWVSYW5rUHJlc2VydmluZ09wZXJhdGlvbnMoRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD4mIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBmb3IoaW50IGEgPSAwOyBhIDwgMyoobS5yb3dzKCkrbS5jb2xzKCkpOyBhKyspCisgIHsKKyAgICBSZWFsU2NhbGFyIGQgPSBFaWdlbjo6ZWlfcmFuZG9tPFJlYWxTY2FsYXI+KC0xLDEpOworICAgIGludCBpID0gRWlnZW46OmVpX3JhbmRvbTxpbnQ+KDAsbS5yb3dzKCktMSk7IC8vIGkgaXMgYSByYW5kb20gcm93IG51bWJlcgorICAgIGludCBqOworICAgIGRvIHsKKyAgICAgIGogPSBFaWdlbjo6ZWlfcmFuZG9tPGludD4oMCxtLnJvd3MoKS0xKTsKKyAgICB9IHdoaWxlIChpPT1qKTsgLy8gaiBpcyBhbm90aGVyIG9uZSAobXVzdCBiZSBkaWZmZXJlbnQpCisgICAgbS5yb3coaSkgKz0gZCAqIG0ucm93KGopOworCisgICAgaSA9IEVpZ2VuOjplaV9yYW5kb208aW50PigwLG0uY29scygpLTEpOyAvLyBpIGlzIGEgcmFuZG9tIGNvbHVtbiBudW1iZXIKKyAgICBkbyB7CisgICAgICBqID0gRWlnZW46OmVpX3JhbmRvbTxpbnQ+KDAsbS5jb2xzKCktMSk7CisgICAgfSB3aGlsZSAoaT09aik7IC8vIGogaXMgYW5vdGhlciBvbmUgKG11c3QgYmUgZGlmZmVyZW50KQorICAgIG0uY29sKGkpICs9IGQgKiBtLmNvbChqKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGx1X25vbl9pbnZlcnRpYmxlKCkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBMVS5oCisgICovCisgIC8vIE5PVEUgdGhlcmUgc2VlbXMgdG8gYmUgYSBwcm9ibGVtIHdpdGggdG9vIHNtYWxsIHNpemVzIC0tIGNvdWxkIGVhc2lseSBsaWUgaW4gdGhlIGRvU29tZVJhbmtQcmVzZXJ2aW5nT3BlcmF0aW9ucyBmdW5jdGlvbgorICBpbnQgcm93cyA9IGVpX3JhbmRvbTxpbnQ+KDIwLDIwMCksIGNvbHMgPSBlaV9yYW5kb208aW50PigyMCwyMDApLCBjb2xzMiA9IGVpX3JhbmRvbTxpbnQ+KDIwLDIwMCk7CisgIGludCByYW5rID0gZWlfcmFuZG9tPGludD4oMSwgc3RkOjptaW4ocm93cywgY29scyktMSk7CisKKyAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwgbTIoY29scywgY29sczIpLCBtMyhyb3dzLCBjb2xzMiksIGsoMSwxKTsKKyAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgaWYocm93cyA8PSBjb2xzKQorICAgIGZvcihpbnQgaSA9IHJhbms7IGkgPCByb3dzOyBpKyspIG0xLnJvdyhpKS5zZXRaZXJvKCk7CisgIGVsc2UKKyAgICBmb3IoaW50IGkgPSByYW5rOyBpIDwgY29sczsgaSsrKSBtMS5jb2woaSkuc2V0WmVybygpOworICBkb1NvbWVSYW5rUHJlc2VydmluZ09wZXJhdGlvbnMobTEpOworCisgIExVPE1hdHJpeFR5cGU+IGx1KG0xKTsKKyAgdHlwZW5hbWUgTFU8TWF0cml4VHlwZT46Oktlcm5lbFJlc3VsdFR5cGUgbTFrZXJuZWwgPSBsdS5rZXJuZWwoKTsKKyAgdHlwZW5hbWUgTFU8TWF0cml4VHlwZT46OkltYWdlUmVzdWx0VHlwZSBtMWltYWdlID0gbHUuaW1hZ2UoKTsKKworICBWRVJJRlkocmFuayA9PSBsdS5yYW5rKCkpOworICBWRVJJRlkoY29scyAtIGx1LnJhbmsoKSA9PSBsdS5kaW1lbnNpb25PZktlcm5lbCgpKTsKKyAgVkVSSUZZKCFsdS5pc0luamVjdGl2ZSgpKTsKKyAgVkVSSUZZKCFsdS5pc0ludmVydGlibGUoKSk7CisgIFZFUklGWShsdS5pc1N1cmplY3RpdmUoKSA9PSAobHUucmFuaygpID09IHJvd3MpKTsKKyAgVkVSSUZZKChtMSAqIG0xa2VybmVsKS5pc011Y2hTbWFsbGVyVGhhbihtMSkpOworICBWRVJJRlkobTFpbWFnZS5sdSgpLnJhbmsoKSA9PSByYW5rKTsKKyAgTWF0cml4VHlwZSBzaWRlYnlzaWRlKG0xLnJvd3MoKSwgbTEuY29scygpICsgbTFpbWFnZS5jb2xzKCkpOworICBzaWRlYnlzaWRlIDw8IG0xLCBtMWltYWdlOworICBWRVJJRlkoc2lkZWJ5c2lkZS5sdSgpLnJhbmsoKSA9PSByYW5rKTsKKyAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIG0zID0gbTEqbTI7CisgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsY29sczIpOworICBsdS5zb2x2ZShtMywgJm0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworICAvKiBzb2x2ZSBub3cgYWx3YXlzIHJldHVybnMgdHJ1ZQorICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMyKTsKKyAgVkVSSUZZKCFsdS5zb2x2ZShtMywgJm0yKSk7CisgICovCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbHVfaW52ZXJ0aWJsZSgpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgTFUuaAorICAqLworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIGludCBzaXplID0gZWlfcmFuZG9tPGludD4oMTAsMjAwKTsKKworICBNYXRyaXhUeXBlIG0xKHNpemUsIHNpemUpLCBtMihzaXplLCBzaXplKSwgbTMoc2l6ZSwgc2l6ZSk7CisgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisKKyAgaWYgKGVpX2lzX3NhbWVfdHlwZTxSZWFsU2NhbGFyLGZsb2F0Pjo6cmV0KQorICB7CisgICAgLy8gbGV0J3MgYnVpbGQgYSBtYXRyaXggbW9yZSBzdGFibGUgdG8gaW52ZXJzZQorICAgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUqMik7CisgICAgbTEgKz0gYSAqIGEuYWRqb2ludCgpOworICB9CisKKyAgTFU8TWF0cml4VHlwZT4gbHUobTEpOworICBWRVJJRlkoMCA9PSBsdS5kaW1lbnNpb25PZktlcm5lbCgpKTsKKyAgVkVSSUZZKHNpemUgPT0gbHUucmFuaygpKTsKKyAgVkVSSUZZKGx1LmlzSW5qZWN0aXZlKCkpOworICBWRVJJRlkobHUuaXNTdXJqZWN0aXZlKCkpOworICBWRVJJRlkobHUuaXNJbnZlcnRpYmxlKCkpOworICBWRVJJRlkobHUuaW1hZ2UoKS5sdSgpLmlzSW52ZXJ0aWJsZSgpKTsKKyAgbTMgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKTsKKyAgbHUuc29sdmUobTMsICZtMik7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xKm0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbHUuaW52ZXJzZSgpKm0zKTsKKyAgbTMgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKTsKKyAgVkVSSUZZKGx1LnNvbHZlKG0zLCAmbTIpKTsKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9sdSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeFhmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeFhkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSApOworICAgIENBTExfU1VCVEVTVF80KCBsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggbHVfaW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBsdV9pbnZlcnRpYmxlPE1hdHJpeFhkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGx1X2ludmVydGlibGU8TWF0cml4WGNmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGx1X2ludmVydGlibGU8TWF0cml4WGNkPigpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9tYXAuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX21hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExYzRlMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9tYXAuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIG1hcF9jbGFzc192ZWN0b3IoY29uc3QgVmVjdG9yVHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIGludCBzaXplID0gbS5zaXplKCk7CisKKyAgLy8gdGVzdCBNYXAuaAorICBTY2FsYXIqIGFycmF5MSA9IGVpX2FsaWduZWRfbmV3PFNjYWxhcj4oc2l6ZSk7CisgIFNjYWxhciogYXJyYXkyID0gZWlfYWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKKyAgU2NhbGFyKiBhcnJheTMgPSBuZXcgU2NhbGFyW3NpemUrMV07CisgIFNjYWxhciogYXJyYXkzdW5hbGlnbmVkID0gc3RkOjpzaXplX3QoYXJyYXkzKSUxNiA9PSAwID8gYXJyYXkzKzEgOiBhcnJheTM7CisgIAorICBNYXA8VmVjdG9yVHlwZSwgQWxpZ25lZD4oYXJyYXkxLCBzaXplKSA9IFZlY3RvclR5cGU6OlJhbmRvbShzaXplKTsKKyAgTWFwPFZlY3RvclR5cGU+KGFycmF5Miwgc2l6ZSkgPSBNYXA8VmVjdG9yVHlwZT4oYXJyYXkxLCBzaXplKTsKKyAgTWFwPFZlY3RvclR5cGU+KGFycmF5M3VuYWxpZ25lZCwgc2l6ZSkgPSBNYXA8VmVjdG9yVHlwZT4oKGNvbnN0IFNjYWxhciopYXJyYXkxLCBzaXplKTsgLy8gdGVzdCBub24tY29uc3QtY29ycmVjdG5lc3Mgc3VwcG9ydCBpbiBlaWdlbjIKKyAgVmVjdG9yVHlwZSBtYTEgPSBNYXA8VmVjdG9yVHlwZT4oYXJyYXkxLCBzaXplKTsKKyAgVmVjdG9yVHlwZSBtYTIgPSBNYXA8VmVjdG9yVHlwZSwgQWxpZ25lZD4oYXJyYXkyLCBzaXplKTsKKyAgVmVjdG9yVHlwZSBtYTMgPSBNYXA8VmVjdG9yVHlwZT4oYXJyYXkzdW5hbGlnbmVkLCBzaXplKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYTEsIG1hMik7CisgIFZFUklGWV9JU19BUFBST1gobWExLCBtYTMpOworICAKKyAgZWlfYWxpZ25lZF9kZWxldGUoYXJyYXkxLCBzaXplKTsKKyAgZWlfYWxpZ25lZF9kZWxldGUoYXJyYXkyLCBzaXplKTsKKyAgZGVsZXRlW10gYXJyYXkzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIG1hcF9jbGFzc19tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIGludCByb3dzID0gbS5yb3dzKCksIGNvbHMgPSBtLmNvbHMoKSwgc2l6ZSA9IHJvd3MqY29sczsKKworICAvLyB0ZXN0IE1hcC5oCisgIFNjYWxhciogYXJyYXkxID0gZWlfYWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgYXJyYXkxW2ldID0gU2NhbGFyKDEpOworICBTY2FsYXIqIGFycmF5MiA9IGVpX2FsaWduZWRfbmV3PFNjYWxhcj4oc2l6ZSk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIGFycmF5MltpXSA9IFNjYWxhcigxKTsKKyAgU2NhbGFyKiBhcnJheTMgPSBuZXcgU2NhbGFyW3NpemUrMV07CisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplKzE7IGkrKykgYXJyYXkzW2ldID0gU2NhbGFyKDEpOworICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IHN0ZDo6c2l6ZV90KGFycmF5MyklMTYgPT0gMCA/IGFycmF5MysxIDogYXJyYXkzOworICBNYXA8TWF0cml4VHlwZSwgQWxpZ25lZD4oYXJyYXkxLCByb3dzLCBjb2xzKSA9IE1hdHJpeFR5cGU6Ok9uZXMocm93cyxjb2xzKTsKKyAgTWFwPE1hdHJpeFR5cGU+KGFycmF5Miwgcm93cywgY29scykgPSBNYXA8TWF0cml4VHlwZT4oKGNvbnN0IFNjYWxhciopYXJyYXkxLCByb3dzLCBjb2xzKTsgLy8gdGVzdCBub24tY29uc3QtY29ycmVjdG5lc3Mgc3VwcG9ydCBpbiBlaWdlbjIKKyAgTWFwPE1hdHJpeFR5cGU+KGFycmF5M3VuYWxpZ25lZCwgcm93cywgY29scykgPSBNYXA8TWF0cml4VHlwZT4oYXJyYXkxLCByb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBtYTEgPSBNYXA8TWF0cml4VHlwZT4oYXJyYXkxLCByb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBtYTIgPSBNYXA8TWF0cml4VHlwZSwgQWxpZ25lZD4oYXJyYXkyLCByb3dzLCBjb2xzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYTEsIG1hMik7CisgIE1hdHJpeFR5cGUgbWEzID0gTWFwPE1hdHJpeFR5cGU+KGFycmF5M3VuYWxpZ25lZCwgcm93cywgY29scyk7CisgIFZFUklGWV9JU19BUFBST1gobWExLCBtYTMpOworICAKKyAgZWlfYWxpZ25lZF9kZWxldGUoYXJyYXkxLCBzaXplKTsKKyAgZWlfYWxpZ25lZF9kZWxldGUoYXJyYXkyLCBzaXplKTsKKyAgZGVsZXRlW10gYXJyYXkzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIG1hcF9zdGF0aWNfbWV0aG9kcyhjb25zdCBWZWN0b3JUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgaW50IHNpemUgPSBtLnNpemUoKTsKKworICAvLyB0ZXN0IE1hcC5oCisgIFNjYWxhciogYXJyYXkxID0gZWlfYWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKKyAgU2NhbGFyKiBhcnJheTIgPSBlaV9hbGlnbmVkX25ldzxTY2FsYXI+KHNpemUpOworICBTY2FsYXIqIGFycmF5MyA9IG5ldyBTY2FsYXJbc2l6ZSsxXTsKKyAgU2NhbGFyKiBhcnJheTN1bmFsaWduZWQgPSBzdGQ6OnNpemVfdChhcnJheTMpJTE2ID09IDAgPyBhcnJheTMrMSA6IGFycmF5MzsKKyAgCisgIFZlY3RvclR5cGU6Ok1hcEFsaWduZWQoYXJyYXkxLCBzaXplKSA9IFZlY3RvclR5cGU6OlJhbmRvbShzaXplKTsKKyAgVmVjdG9yVHlwZTo6TWFwKGFycmF5Miwgc2l6ZSkgPSBWZWN0b3JUeXBlOjpNYXAoYXJyYXkxLCBzaXplKTsKKyAgVmVjdG9yVHlwZTo6TWFwKGFycmF5M3VuYWxpZ25lZCwgc2l6ZSkgPSBWZWN0b3JUeXBlOjpNYXAoYXJyYXkxLCBzaXplKTsKKyAgVmVjdG9yVHlwZSBtYTEgPSBWZWN0b3JUeXBlOjpNYXAoYXJyYXkxLCBzaXplKTsKKyAgVmVjdG9yVHlwZSBtYTIgPSBWZWN0b3JUeXBlOjpNYXBBbGlnbmVkKGFycmF5Miwgc2l6ZSk7CisgIFZlY3RvclR5cGUgbWEzID0gVmVjdG9yVHlwZTo6TWFwKGFycmF5M3VuYWxpZ25lZCwgc2l6ZSk7CisgIFZFUklGWV9JU19BUFBST1gobWExLCBtYTIpOworICBWRVJJRllfSVNfQVBQUk9YKG1hMSwgbWEzKTsKKyAgCisgIGVpX2FsaWduZWRfZGVsZXRlKGFycmF5MSwgc2l6ZSk7CisgIGVpX2FsaWduZWRfZGVsZXRlKGFycmF5Miwgc2l6ZSk7CisgIGRlbGV0ZVtdIGFycmF5MzsKK30KKworCit2b2lkIHRlc3RfZWlnZW4yX21hcCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIG1hcF9jbGFzc192ZWN0b3IoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfdmVjdG9yKFZlY3RvcjRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1hcF9jbGFzc192ZWN0b3IoUm93VmVjdG9yNGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWFwX2NsYXNzX3ZlY3RvcihWZWN0b3JYY2YoOCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1hcF9jbGFzc192ZWN0b3IoVmVjdG9yWGkoMTIpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzEoIG1hcF9jbGFzc19tYXRyaXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfbWF0cml4KE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIG1hcF9jbGFzc19tYXRyaXgoTWF0cml4PGZsb2F0LDMsNT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWFwX2NsYXNzX21hdHJpeChNYXRyaXhYY2YoZWlfcmFuZG9tPGludD4oMSwxMCksZWlfcmFuZG9tPGludD4oMSwxMCkpKSApOworICAgIENBTExfU1VCVEVTVF81KCBtYXBfY2xhc3NfbWF0cml4KE1hdHJpeFhpKGVpX3JhbmRvbTxpbnQ+KDEsMTApLGVpX3JhbmRvbTxpbnQ+KDEsMTApKSkgKTsKKworICAgIENBTExfU1VCVEVTVF8xKCBtYXBfc3RhdGljX21ldGhvZHMoTWF0cml4PGRvdWJsZSwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbWFwX3N0YXRpY19tZXRob2RzKFZlY3RvcjNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIG1hcF9zdGF0aWNfbWV0aG9kcyhSb3dWZWN0b3IzZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBtYXBfc3RhdGljX21ldGhvZHMoVmVjdG9yWGNkKDgpKSApOworICAgIENBTExfU1VCVEVTVF81KCBtYXBfc3RhdGljX21ldGhvZHMoVmVjdG9yWGYoMTIpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfbWV0YS5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfbWV0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwMWJkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9tZXRhLmNwcApAQCAtMCwwICsxLDYwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit2b2lkIHRlc3RfZWlnZW4yX21ldGEoKQoreworICB0eXBlZGVmIGZsb2F0ICYgRmxvYXRSZWY7CisgIHR5cGVkZWYgY29uc3QgZmxvYXQgJiBDb25zdEZsb2F0UmVmOworICAKKyAgVkVSSUZZKChlaV9tZXRhX2lmPCgzPDQpLGVpX21ldGFfdHJ1ZSwgZWlfbWV0YV9mYWxzZT46OnJldDo6cmV0KSk7CisgIFZFUklGWSgoIGVpX2lzX3NhbWVfdHlwZTxmbG9hdCxmbG9hdD46OnJldCkpOworICBWRVJJRlkoKCFlaV9pc19zYW1lX3R5cGU8ZmxvYXQsZG91YmxlPjo6cmV0KSk7CisgIFZFUklGWSgoIWVpX2lzX3NhbWVfdHlwZTxmbG9hdCxmbG9hdCY+OjpyZXQpKTsKKyAgVkVSSUZZKCghZWlfaXNfc2FtZV90eXBlPGZsb2F0LGNvbnN0IGZsb2F0Jj46OnJldCkpOworICAKKyAgVkVSSUZZKCggZWlfaXNfc2FtZV90eXBlPGZsb2F0LGVpX2NsZWFudHlwZTxjb25zdCBmbG9hdCY+Ojp0eXBlID46OnJldCkpOworICBWRVJJRlkoKCBlaV9pc19zYW1lX3R5cGU8ZmxvYXQsZWlfY2xlYW50eXBlPGNvbnN0IGZsb2F0Kj46OnR5cGUgPjo6cmV0KSk7CisgIFZFUklGWSgoIGVpX2lzX3NhbWVfdHlwZTxmbG9hdCxlaV9jbGVhbnR5cGU8Y29uc3QgZmxvYXQqJj46OnR5cGUgPjo6cmV0KSk7CisgIFZFUklGWSgoIGVpX2lzX3NhbWVfdHlwZTxmbG9hdCxlaV9jbGVhbnR5cGU8ZmxvYXQqKj46OnR5cGUgPjo6cmV0KSk7CisgIFZFUklGWSgoIGVpX2lzX3NhbWVfdHlwZTxmbG9hdCxlaV9jbGVhbnR5cGU8ZmxvYXQqKiY+Ojp0eXBlID46OnJldCkpOworICBWRVJJRlkoKCBlaV9pc19zYW1lX3R5cGU8ZmxvYXQsZWlfY2xlYW50eXBlPGZsb2F0KiBjb25zdCAqJj46OnR5cGUgPjo6cmV0KSk7CisgIFZFUklGWSgoIGVpX2lzX3NhbWVfdHlwZTxmbG9hdCxlaV9jbGVhbnR5cGU8ZmxvYXQqIGNvbnN0Pjo6dHlwZSA+OjpyZXQpKTsKKworICBWRVJJRlkoKCBlaV9pc19zYW1lX3R5cGU8ZmxvYXQqLGVpX3VuY29uc3Q8Y29uc3QgZmxvYXQqPjo6dHlwZSA+OjpyZXQpKTsKKyAgVkVSSUZZKCggZWlfaXNfc2FtZV90eXBlPGZsb2F0JixlaV91bmNvbnN0PGNvbnN0IGZsb2F0Jj46OnR5cGUgPjo6cmV0KSk7CisgIFZFUklGWSgoIGVpX2lzX3NhbWVfdHlwZTxmbG9hdCYsZWlfdW5jb25zdDxDb25zdEZsb2F0UmVmPjo6dHlwZSA+OjpyZXQpKTsKKyAgCisgIFZFUklGWSgoIGVpX2lzX3NhbWVfdHlwZTxmbG9hdCYsZWlfdW5jb25zdDxmbG9hdCY+Ojp0eXBlID46OnJldCkpOworICBWRVJJRlkoKCBlaV9pc19zYW1lX3R5cGU8ZmxvYXQsZWlfdW5yZWY8ZmxvYXQmPjo6dHlwZSA+OjpyZXQpKTsKKyAgVkVSSUZZKCggZWlfaXNfc2FtZV90eXBlPGNvbnN0IGZsb2F0LGVpX3VucmVmPGNvbnN0IGZsb2F0Jj46OnR5cGUgPjo6cmV0KSk7CisgIFZFUklGWSgoIGVpX2lzX3NhbWVfdHlwZTxmbG9hdCxlaV91bnBvaW50ZXI8ZmxvYXQqPjo6dHlwZSA+OjpyZXQpKTsKKyAgVkVSSUZZKCggZWlfaXNfc2FtZV90eXBlPGNvbnN0IGZsb2F0LGVpX3VucG9pbnRlcjxjb25zdCBmbG9hdCo+Ojp0eXBlID46OnJldCkpOworICBWRVJJRlkoKCBlaV9pc19zYW1lX3R5cGU8ZmxvYXQsZWlfdW5wb2ludGVyPGZsb2F0KiBjb25zdCA+Ojp0eXBlID46OnJldCkpOworICAKKyAgVkVSSUZZKGVpX21ldGFfc3FydDwxPjo6cmV0ID09IDEpOworICAjZGVmaW5lIFZFUklGWV9NRVRBX1NRUlQoWCkgVkVSSUZZKGVpX21ldGFfc3FydDxYPjo6cmV0ID09IGludChlaV9zcXJ0KGRvdWJsZShYKSkpKQorICBWRVJJRllfTUVUQV9TUVJUKDIpOworICBWRVJJRllfTUVUQV9TUVJUKDMpOworICBWRVJJRllfTUVUQV9TUVJUKDQpOworICBWRVJJRllfTUVUQV9TUVJUKDUpOworICBWRVJJRllfTUVUQV9TUVJUKDYpOworICBWRVJJRllfTUVUQV9TUVJUKDgpOworICBWRVJJRllfTUVUQV9TUVJUKDkpOworICBWRVJJRllfTUVUQV9TUVJUKDE1KTsKKyAgVkVSSUZZX01FVEFfU1FSVCgxNik7CisgIFZFUklGWV9NRVRBX1NRUlQoMTcpOworICBWRVJJRllfTUVUQV9TUVJUKDI1NSk7CisgIFZFUklGWV9NRVRBX1NRUlQoMjU2KTsKKyAgVkVSSUZZX01FVEFfU1FSVCgyNTcpOworICBWRVJJRllfTUVUQV9TUVJUKDEwMjMpOworICBWRVJJRllfTUVUQV9TUVJUKDEwMjQpOworICBWRVJJRllfTUVUQV9TUVJUKDEwMjUpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX21pc2NtYXRyaWNlcy5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfbWlzY21hdHJpY2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmJiMjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX21pc2NtYXRyaWNlcy5jcHAKQEAgLTAsMCArMSw0OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtaXNjTWF0cmljZXMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBEaWFnb25hbE1hdHJpeC5oIE9uZXMuaAorICAqLworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsKKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKworICBpbnQgciA9IGVpX3JhbmRvbTxpbnQ+KDAsIHJvd3MtMSksIHIyID0gZWlfcmFuZG9tPGludD4oMCwgcm93cy0xKSwgYyA9IGVpX3JhbmRvbTxpbnQ+KDAsIGNvbHMtMSk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6T25lcyhyb3dzLGNvbHMpKHIsYyksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6T25lcyhyb3dzLGNvbHMpOworICBWRVJJRllfSVNfQVBQUk9YKG0xKHIsYyksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICB2MVswXTsKKyAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPgorICBzcXVhcmUgPSB2MS5hc0RpYWdvbmFsKCk7CisgIGlmKHI9PXIyKSBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZShyLHIyKSwgdjFbcl0pOworICBlbHNlIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihzcXVhcmUocixyMiksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOworICBzcXVhcmUgPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIHJvd3MpOworICBzcXVhcmUuZGlhZ29uYWwoKSA9IFZlY3RvclR5cGU6Ok9uZXMocm93cyk7CisgIFZFUklGWV9JU19BUFBST1goc3F1YXJlLCBNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKSk7Cit9CisKK3ZvaWQgdGVzdF9laWdlbjJfbWlzY21hdHJpY2VzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggbWlzY01hdHJpY2VzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbWlzY01hdHJpY2VzKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1pc2NNYXRyaWNlcyhNYXRyaXhYY2YoMywgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIG1pc2NNYXRyaWNlcyhNYXRyaXhYaSg4LCAxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1pc2NNYXRyaWNlcyhNYXRyaXhYY2QoMjAsIDIwKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX21peGluZ3R5cGVzLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9taXhpbmd0eXBlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1YWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9taXhpbmd0eXBlcy5jcHAKQEAgLTAsMCArMSw3NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisjZGVmaW5lIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQgLy8gdHVybiBzdGF0aWMgYXNzZXJ0cyBpbnRvIHJ1bnRpbWUgYXNzZXJ0cyBpbiBvcmRlciB0byBjaGVjayB0aGVtCisjZW5kaWYKKworI2lmbmRlZiBFSUdFTl9ET05UX1ZFQ1RPUklaRQorI2RlZmluZSBFSUdFTl9ET05UX1ZFQ1RPUklaRSAvLyBTU0UgaW50cmluc2ljcyBhcmVuJ3QgZGVzaWduZWQgdG8gYWxsb3cgbWl4aW5nIHR5cGVzCisjZW5kaWYKKworI2luY2x1ZGUgIm1haW4uaCIKKworCit0ZW1wbGF0ZTxpbnQgU2l6ZUF0Q29tcGlsZVR5cGU+IHZvaWQgbWl4aW5ndHlwZXMoaW50IHNpemUgPSBTaXplQXRDb21waWxlVHlwZSkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsIFNpemVBdENvbXBpbGVUeXBlLCBTaXplQXRDb21waWxlVHlwZT4gTWF0X2Y7CisgIHR5cGVkZWYgTWF0cml4PGRvdWJsZSwgU2l6ZUF0Q29tcGlsZVR5cGUsIFNpemVBdENvbXBpbGVUeXBlPiBNYXRfZDsKKyAgdHlwZWRlZiBNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgU2l6ZUF0Q29tcGlsZVR5cGUsIFNpemVBdENvbXBpbGVUeXBlPiBNYXRfY2Y7CisgIHR5cGVkZWYgTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBTaXplQXRDb21waWxlVHlwZSwgU2l6ZUF0Q29tcGlsZVR5cGU+IE1hdF9jZDsKKyAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsIFNpemVBdENvbXBpbGVUeXBlLCAxPiBWZWNfZjsKKyAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCBTaXplQXRDb21waWxlVHlwZSwgMT4gVmVjX2Q7CisgIHR5cGVkZWYgTWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sIFNpemVBdENvbXBpbGVUeXBlLCAxPiBWZWNfY2Y7CisgIHR5cGVkZWYgTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBTaXplQXRDb21waWxlVHlwZSwgMT4gVmVjX2NkOworCisgIE1hdF9mIG1mKHNpemUsc2l6ZSk7CisgIE1hdF9kIG1kKHNpemUsc2l6ZSk7CisgIE1hdF9jZiBtY2Yoc2l6ZSxzaXplKTsKKyAgTWF0X2NkIG1jZChzaXplLHNpemUpOworICBWZWNfZiB2ZihzaXplLDEpOworICBWZWNfZCB2ZChzaXplLDEpOworICBWZWNfY2YgdmNmKHNpemUsMSk7CisgIFZlY19jZCB2Y2Qoc2l6ZSwxKTsKKworICBtZittZjsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobWYrbWQpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtZittY2YpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCh2Zj12ZCk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHZmKz12ZCk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG1jZD1tZCk7CisKKyAgbWYqbWY7CisgIG1kKm1jZDsKKyAgbWNkKm1kOworICBtZip2Y2Y7CisgIG1jZip2ZjsKKyAgbWNmICo9IG1mOworICB2Y2QgPSBtZCp2Y2Q7CisgIHZjZiA9IG1jZip2ZjsKKyNpZiAwCisgIC8vIHRoZXNlIGFyZSBrbm93IGdlbmVyYXRpbmcgaGFyZCBidWlsZCBlcnJvcnMgaW4gZWlnZW4zCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG1mKm1kKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobWNmKm1jZCk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG1jZip2Y2QpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCh2Y2YgPSBtZip2Zik7CisKKyAgdmYuZWlnZW4yX2RvdCh2Zik7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHZkLmVpZ2VuMl9kb3QodmYpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQodmNmLmVpZ2VuMl9kb3QodmYpKTsgLy8geWVhaCBldmVudHVhbGx5IHdlIHNob3VsZCBhbGxvdyB0aGlzIGJ1dCBpJ20gdG9vIGxhenkgdG8gbWFrZSB0aGF0IGNoYW5nZSBub3cgaW4gRG90LmgKKyAgLy8gZXNwZWNpYWxseSBhcyB0aGF0IG1pZ2h0IGJlIHJld3JpdHRlbiBhcyBjd2lzZSBwcm9kdWN0IC5zdW0oKSB3aGljaCB3b3VsZCBtYWtlIHRoYXQgYXV0b21hdGljLgorI2VuZGlmCit9CisKK3ZvaWQgdGVzdF9laWdlbjJfbWl4aW5ndHlwZXMoKQoreworICAvLyBjaGVjayB0aGF0IG91ciBvcGVyYXRvciBuZXcgaXMgaW5kZWVkIGNhbGxlZDoKKyAgQ0FMTF9TVUJURVNUXzEobWl4aW5ndHlwZXM8Mz4oKSk7CisgIENBTExfU1VCVEVTVF8yKG1peGluZ3R5cGVzPDQ+KCkpOworICBDQUxMX1NVQlRFU1RfMyhtaXhpbmd0eXBlczxEeW5hbWljPigyMCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX25ld3N0ZHZlY3Rvci5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfbmV3c3RkdmVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjkwMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX25ld3N0ZHZlY3Rvci5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9VU0VfTkVXX1NURFZFQ1RPUgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9TdGRWZWN0b3I+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgc3RkOjp2ZWN0b3I8TWF0cml4VHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPiB2KDEwLCBNYXRyaXhUeXBlKHJvd3MsY29scykpLCB3KDIwLCB5KTsKKyAgdls1XSA9IHg7CisgIHdbNl0gPSB2WzVdOworICBWRVJJRllfSVNfQVBQUk9YKHdbNl0sIHZbNV0pOworICB2ID0gdzsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOworICB9CisKKyAgdi5yZXNpemUoMjEpOworICB2WzIwXSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKKyAgVkVSSUZZKChzdGQ6OnNpemVfdCkmKHZbMjJdKSA9PSAoc3RkOjpzaXplX3QpJih2WzIxXSkgKyBzaXplb2YoTWF0cml4VHlwZSkpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAorICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQorICBNYXRyaXhUeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXT09d1soaS0yMykldy5zaXplKCldKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgordm9pZCBjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSk7CisgIHN0ZDo6dmVjdG9yPFRyYW5zZm9ybVR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFRyYW5zZm9ybVR5cGU+ID4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKHN0ZDo6c2l6ZV90KSYodlsyMl0pID09IChzdGQ6OnNpemVfdCkmKHZbMjFdKSArIHNpemVvZihUcmFuc2Zvcm1UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpPT13WyhpLTIzKSV3LnNpemUoKV0ubWF0cml4KCkpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgordm9pZCBjaGVja19zdGR2ZWN0b3JfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUXVhdGVybmlvblR5cGU6OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7CisgIFF1YXRlcm5pb25UeXBlIHgoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHkoQ29lZmZpY2llbnRzOjpSYW5kb20oKSk7CisgIHN0ZDo6dmVjdG9yPFF1YXRlcm5pb25UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxRdWF0ZXJuaW9uVHlwZT4gPiB2KDEwKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7CisgIFZFUklGWSgoc3RkOjpzaXplX3QpJih2WzIyXSkgPT0gKHN0ZDo6c2l6ZV90KSYodlsyMV0pICsgc2l6ZW9mKFF1YXRlcm5pb25UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFF1YXRlcm5pb25UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXS5jb2VmZnMoKT09d1soaS0yMykldy5zaXplKCldLmNvZWZmcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3RfZWlnZW4yX25ld3N0ZHZlY3RvcigpCit7CisgIC8vIHNvbWUgbm9uIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGR2ZWN0b3JfbWF0cml4KFZlY3RvcjJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXgzZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4M2QoKSkpOworCisgIC8vIHNvbWUgdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4MmYoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGR2ZWN0b3JfbWF0cml4KFZlY3RvcjRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXg0ZigpKSk7CisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4NGQoKSkpOworCisgIC8vIHNvbWUgZHluYW1pYyBzaXplcworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeFhkKDEsMSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChWZWN0b3JYZCgyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChSb3dWZWN0b3JYZigyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXhYY2YoMTAsMTApKSk7CisKKyAgLy8gc29tZSBUcmFuc2Zvcm0KKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShUcmFuc2Zvcm0yZigpKSk7CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oVHJhbnNmb3JtM2YoKSkpOworICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKFRyYW5zZm9ybTNkKCkpKTsKKyAgLy9DQUxMX1NVQlRFU1QoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShUcmFuc2Zvcm00ZCgpKSk7CisKKyAgLy8gc29tZSBRdWF0ZXJuaW9uCisgIENBTExfU1VCVEVTVF81KGNoZWNrX3N0ZHZlY3Rvcl9xdWF0ZXJuaW9uKFF1YXRlcm5pb25mKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkdmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmQoKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX25vbWFsbG9jLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9ub21hbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzNGFiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9ub21hbGxvYy5jcHAKQEAgLTAsMCArMSw2MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyB0aGlzIGhhY2sgaXMgbmVlZGVkIHRvIG1ha2UgdGhpcyBmaWxlIGNvbXBpbGVzIHdpdGggLXBlZGFudGljIChnY2MpCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgdGhyb3coWCkKKyNlbmRpZgorLy8gZGlzY2FyZCBzdGFjayBhbGxvY2F0aW9uIGFzIHRoYXQgdG9vIGJ5cGFzc2VzIG1hbGxvYworI2RlZmluZSBFSUdFTl9TVEFDS19BTExPQ0FUSU9OX0xJTUlUIDAKKy8vIGFueSBoZWFwIGFsbG9jYXRpb24gd2lsbCByYWlzZSBhbiBhc3NlcnQKKyNkZWZpbmUgRUlHRU5fTk9fTUFMTE9DCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbm9tYWxsb2MoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNoZWNrIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gYXJlIGlzc3VlZCB3aXRoIGZpeGVkLXNpemUgbWF0cmljZXMKKyAgKi8KKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBpZGVudGl0eSA9IE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6SWRlbnRpdHkocm93cywgcm93cyksCisgICAgICAgICAgICAgc3F1YXJlID0gTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpSYW5kb20ocm93cywgcm93cyk7CisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdnplcm8gPSBWZWN0b3JUeXBlOjpaZXJvKHJvd3MpOworCisgIFNjYWxhciBzMSA9IGVpX3JhbmRvbTxTY2FsYXI+KCk7CisKKyAgaW50IHIgPSBlaV9yYW5kb208aW50PigwLCByb3dzLTEpLAorICAgICAgYyA9IGVpX3JhbmRvbTxpbnQ+KDAsIGNvbHMtMSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTErbTIpKnMxLCAgICAgICAgICAgICAgczEqbTErczEqbTIpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSttMikocixjKSwgKG0xKHIsYykpKyhtMihyLGMpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKSAqIG0xLmJsb2NrKDAsMCxyb3dzLGNvbHMpLCBtMS5jd2lzZSgpICogbTEpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSptMS50cmFuc3Bvc2UoKSkqbTIsICBtMSoobTEudHJhbnNwb3NlKCkqbTIpKTsKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9ub21hbGxvYygpCit7CisgIC8vIGNoZWNrIHRoYXQgb3VyIG9wZXJhdG9yIG5ldyBpcyBpbmRlZWQgY2FsbGVkOgorICBWRVJJRllfUkFJU0VTX0FTU0VSVChNYXRyaXhYZCBkdW1teSA9IE1hdHJpeFhkOjpSYW5kb20oMywzKSk7CisgIENBTExfU1VCVEVTVF8xKCBub21hbGxvYyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVF8yKCBub21hbGxvYyhNYXRyaXg0ZCgpKSApOworICBDQUxMX1NVQlRFU1RfMyggbm9tYWxsb2MoTWF0cml4PGZsb2F0LDMyLDMyPigpKSApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX3BhY2tldG1hdGguY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX3BhY2tldG1hdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjMyNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfcGFja2V0bWF0aC5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKy8vIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBib29sIGFyZUFwcHJveChjb25zdCBTY2FsYXIqIGEsIGNvbnN0IFNjYWxhciogYiwgaW50IHNpemUpCit7CisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgICAgaWYgKCFlaV9pc0FwcHJveChhW2ldLGJbaV0pKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIENIRUNLX0NXSVNFKFJFRk9QLCBQT1ApIHsgXAorICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKSBcCisgICAgcmVmW2ldID0gUkVGT1AoZGF0YTFbaV0sIGRhdGExW2krUGFja2V0U2l6ZV0pOyBcCisgIGVpX3BzdG9yZShkYXRhMiwgUE9QKGVpX3Bsb2FkKGRhdGExKSwgZWlfcGxvYWQoZGF0YTErUGFja2V0U2l6ZSkpKTsgXAorICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICNQT1ApOyBcCit9CisKKyNkZWZpbmUgUkVGX0FERChhLGIpICgoYSkrKGIpKQorI2RlZmluZSBSRUZfU1VCKGEsYikgKChhKS0oYikpCisjZGVmaW5lIFJFRl9NVUwoYSxiKSAoKGEpKihiKSkKKyNkZWZpbmUgUkVGX0RJVihhLGIpICgoYSkvKGIpKQorCituYW1lc3BhY2Ugc3RkIHsKKwordGVtcGxhdGU8PiBjb25zdCBjb21wbGV4PGZsb2F0PiYgbWluKGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBhLCBjb25zdCBjb21wbGV4PGZsb2F0PiYgYikKK3sgcmV0dXJuIGEucmVhbCgpIDwgYi5yZWFsKCkgPyBhIDogYjsgfQorCit0ZW1wbGF0ZTw+IGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBtYXgoY29uc3QgY29tcGxleDxmbG9hdD4mIGEsIGNvbnN0IGNvbXBsZXg8ZmxvYXQ+JiBiKQoreyByZXR1cm4gYS5yZWFsKCkgPCBiLnJlYWwoKSA/IGIgOiBhOyB9CisKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHBhY2tldG1hdGgoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIGVpX3BhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIGNvbnN0IGludCBQYWNrZXRTaXplID0gZWlfcGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOworCisgIGNvbnN0IGludCBzaXplID0gUGFja2V0U2l6ZSo0OworICBFSUdFTl9BTElHTl8xMjggU2NhbGFyIGRhdGExW2VpX3BhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSo0XTsKKyAgRUlHRU5fQUxJR05fMTI4IFNjYWxhciBkYXRhMltlaV9wYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUqNF07CisgIEVJR0VOX0FMSUdOXzEyOCBQYWNrZXQgcGFja2V0c1tQYWNrZXRTaXplKjJdOworICBFSUdFTl9BTElHTl8xMjggU2NhbGFyIHJlZltlaV9wYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUqNF07CisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgIHsKKyAgICBkYXRhMVtpXSA9IGVpX3JhbmRvbTxTY2FsYXI+KCk7CisgICAgZGF0YTJbaV0gPSBlaV9yYW5kb208U2NhbGFyPigpOworICB9CisKKyAgZWlfcHN0b3JlKGRhdGEyLCBlaV9wbG9hZChkYXRhMSkpOworICBWRVJJRlkoYXJlQXBwcm94KGRhdGExLCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgImFsaWduZWQgbG9hZC9zdG9yZSIpOworCisgIGZvciAoaW50IG9mZnNldD0wOyBvZmZzZXQ8UGFja2V0U2l6ZTsgKytvZmZzZXQpCisgIHsKKyAgICBlaV9wc3RvcmUoZGF0YTIsIGVpX3Bsb2FkdShkYXRhMStvZmZzZXQpKTsKKyAgICBWRVJJRlkoYXJlQXBwcm94KGRhdGExK29mZnNldCwgZGF0YTIsIFBhY2tldFNpemUpICYmICJlaV9wbG9hZHUiKTsKKyAgfQorCisgIGZvciAoaW50IG9mZnNldD0wOyBvZmZzZXQ8UGFja2V0U2l6ZTsgKytvZmZzZXQpCisgIHsKKyAgICBlaV9wc3RvcmV1KGRhdGEyK29mZnNldCwgZWlfcGxvYWQoZGF0YTEpKTsKKyAgICBWRVJJRlkoYXJlQXBwcm94KGRhdGExLCBkYXRhMitvZmZzZXQsIFBhY2tldFNpemUpICYmICJlaV9wc3RvcmV1Iik7CisgIH0KKworICBmb3IgKGludCBvZmZzZXQ9MDsgb2Zmc2V0PFBhY2tldFNpemU7ICsrb2Zmc2V0KQorICB7CisgICAgcGFja2V0c1swXSA9IGVpX3Bsb2FkKGRhdGExKTsKKyAgICBwYWNrZXRzWzFdID0gZWlfcGxvYWQoZGF0YTErUGFja2V0U2l6ZSk7CisgICAgICAgICBpZiAob2Zmc2V0PT0wKSBlaV9wYWxpZ248MD4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0xKSBlaV9wYWxpZ248MT4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0yKSBlaV9wYWxpZ248Mj4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0zKSBlaV9wYWxpZ248Mz4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWlfcHN0b3JlKGRhdGEyLCBwYWNrZXRzWzBdKTsKKworICAgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgICByZWZbaV0gPSBkYXRhMVtpK29mZnNldF07CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFBhY2tldFNpemUsIDE+IFZlY3RvcjsKKyAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICJlaV9wYWxpZ24iKTsKKyAgfQorCisgIENIRUNLX0NXSVNFKFJFRl9BREQsICBlaV9wYWRkKTsKKyAgQ0hFQ0tfQ1dJU0UoUkVGX1NVQiwgIGVpX3BzdWIpOworICBDSEVDS19DV0lTRShSRUZfTVVMLCAgZWlfcG11bCk7CisgICNpZm5kZWYgRUlHRU5fVkVDVE9SSVpFX0FMVElWRUMKKyAgaWYgKCFlaV9pc19zYW1lX3R5cGU8U2NhbGFyLGludD46OnJldCkKKyAgICBDSEVDS19DV0lTRShSRUZfRElWLCAgZWlfcGRpdik7CisgICNlbmRpZgorICBDSEVDS19DV0lTRShzdGQ6Om1pbiwgZWlfcG1pbik7CisgIENIRUNLX0NXSVNFKHN0ZDo6bWF4LCBlaV9wbWF4KTsKKworICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgIHJlZltpXSA9IGRhdGExWzBdOworICBlaV9wc3RvcmUoZGF0YTIsIGVpX3BzZXQxKGRhdGExWzBdKSk7CisgIFZFUklGWShhcmVBcHByb3gocmVmLCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgImVpX3BzZXQxIik7CisKKyAgVkVSSUZZKGVpX2lzQXBwcm94KGRhdGExWzBdLCBlaV9wZmlyc3QoZWlfcGxvYWQoZGF0YTEpKSkgJiYgImVpX3BmaXJzdCIpOworCisgIHJlZlswXSA9IDA7CisgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgcmVmWzBdICs9IGRhdGExW2ldOworICBWRVJJRlkoZWlfaXNBcHByb3gocmVmWzBdLCBlaV9wcmVkdXgoZWlfcGxvYWQoZGF0YTEpKSkgJiYgImVpX3ByZWR1eCIpOworCisgIGZvciAoaW50IGo9MDsgajxQYWNrZXRTaXplOyArK2opCisgIHsKKyAgICByZWZbal0gPSAwOworICAgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgICByZWZbal0gKz0gZGF0YTFbaStqKlBhY2tldFNpemVdOworICAgIHBhY2tldHNbal0gPSBlaV9wbG9hZChkYXRhMStqKlBhY2tldFNpemUpOworICB9CisgIGVpX3BzdG9yZShkYXRhMiwgZWlfcHJlZHV4cChwYWNrZXRzKSk7CisgIFZFUklGWShhcmVBcHByb3gocmVmLCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgImVpX3ByZWR1eHAiKTsKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9wYWNrZXRtYXRoKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcGFja2V0bWF0aDxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwYWNrZXRtYXRoPGRvdWJsZT4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBwYWNrZXRtYXRoPGludD4oKSApOworICAgIENBTExfU1VCVEVTVF80KCBwYWNrZXRtYXRoPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9wYXJhbWV0cml6ZWRsaW5lLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9wYXJhbWV0cml6ZWRsaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQ3Mjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX3BhcmFtZXRyaXplZGxpbmUuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK3RlbXBsYXRlPHR5cGVuYW1lIExpbmVUeXBlPiB2b2lkIHBhcmFtZXRyaXplZGxpbmUoY29uc3QgTGluZVR5cGUmIF9saW5lKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIFBhcmFtZXRyaXplZExpbmUuaAorICAqLworCisgIGNvbnN0IGludCBkaW0gPSBfbGluZS5kaW0oKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaW5lVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIExpbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBMaW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTGluZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiBNYXRyaXhUeXBlOworCisgIFZlY3RvclR5cGUgcDAgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKyAgVmVjdG9yVHlwZSBwMSA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOworCisgIFZlY3RvclR5cGUgZDAgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKS5ub3JtYWxpemVkKCk7CisKKyAgTGluZVR5cGUgbDAocDAsIGQwKTsKKworICBTY2FsYXIgczAgPSBlaV9yYW5kb208U2NhbGFyPigpOworICBTY2FsYXIgczEgPSBlaV9hYnMoZWlfcmFuZG9tPFNjYWxhcj4oKSk7CisKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBsMC5kaXN0YW5jZShwMCksIFJlYWxTY2FsYXIoMSkgKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBsMC5kaXN0YW5jZShwMCtzMCpkMCksIFJlYWxTY2FsYXIoMSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggKGwwLnByb2plY3Rpb24ocDEpLXAxKS5ub3JtKCksIGwwLmRpc3RhbmNlKHAxKSApOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIGwwLmRpc3RhbmNlKGwwLnByb2plY3Rpb24ocDEpKSwgUmVhbFNjYWxhcigxKSApOworICBWRVJJRllfSVNfQVBQUk9YKCBTY2FsYXIobDAuZGlzdGFuY2UoKHAwK3MwKmQwKSArIGQwLnVuaXRPcnRob2dvbmFsKCkgKiBzMSkpLCBzMSApOworCisgIC8vIGNhc3RpbmcKKyAgY29uc3QgaW50IERpbSA9IExpbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBHZXREaWZmZXJlbnRUeXBlPFNjYWxhcj46OnR5cGUgT3RoZXJTY2FsYXI7CisgIFBhcmFtZXRyaXplZExpbmU8T3RoZXJTY2FsYXIsRGltPiBocDFmID0gbDAudGVtcGxhdGUgY2FzdDxPdGhlclNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChocDFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLGwwKTsKKyAgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsRGltPiBocDFkID0gbDAudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxsMCk7Cit9CisKK3ZvaWQgdGVzdF9laWdlbjJfcGFyYW1ldHJpemVkbGluZSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHBhcmFtZXRyaXplZGxpbmUoUGFyYW1ldHJpemVkTGluZTxmbG9hdCwyPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwYXJhbWV0cml6ZWRsaW5lKFBhcmFtZXRyaXplZExpbmU8ZmxvYXQsMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcGFyYW1ldHJpemVkbGluZShQYXJhbWV0cml6ZWRMaW5lPGRvdWJsZSw0PigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBwYXJhbWV0cml6ZWRsaW5lKFBhcmFtZXRyaXplZExpbmU8c3RkOjpjb21wbGV4PGRvdWJsZT4sNT4oKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX3ByZWNfaW52ZXJzZV80eDQuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX3ByZWNfaW52ZXJzZV80eDQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZmE1NTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfcHJlY19pbnZlcnNlXzR4NC5jcHAKQEAgLTAsMCArMSw4NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lKCkgeyByZXR1cm4gIm90aGVyIjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8ZmxvYXQ+KCkgeyByZXR1cm4gImZsb2F0IjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8ZG91YmxlPigpIHsgcmV0dXJuICJkb3VibGUiOyB9Cit0ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHR5cGVfbmFtZTxpbnQ+KCkgeyByZXR1cm4gImludCI7IH0KK3RlbXBsYXRlPD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpIHsgcmV0dXJuICJjb21wbGV4PGZsb2F0PiI7IH0KK3RlbXBsYXRlPD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSB7IHJldHVybiAiY29tcGxleDxkb3VibGU+IjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8c3RkOjpjb21wbGV4PGludD4gPigpIHsgcmV0dXJuICJjb21wbGV4PGludD4iOyB9CisKKyNkZWZpbmUgRUlHRU5fREVCVUdfVkFSKHgpIHN0ZDo6Y2VyciA8PCAjeCA8PCAiID0gIiA8PCB4IDw8IHN0ZDo6ZW5kbDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCBlcHNpbG9uKCkKK3sKKyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWw+OjplcHNpbG9uKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgaW52ZXJzZV9wZXJtdXRhdGlvbl80eDQoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICBWZWN0b3I0aSBpbmRpY2VzKDAsMSwyLDMpOworICBmb3IoaW50IGkgPSAwOyBpIDwgMjQ7ICsraSkKKyAgeworICAgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6Olplcm8oKTsKKyAgICBtKGluZGljZXMoMCksMCkgPSAxOworICAgIG0oaW5kaWNlcygxKSwxKSA9IDE7CisgICAgbShpbmRpY2VzKDIpLDIpID0gMTsKKyAgICBtKGluZGljZXMoMyksMykgPSAxOworICAgIE1hdHJpeFR5cGUgaW52ID0gbS5pbnZlcnNlKCk7CisgICAgZG91YmxlIGVycm9yID0gZG91YmxlKCAobSppbnYtTWF0cml4VHlwZTo6SWRlbnRpdHkoKSkubm9ybSgpIC8gZXBzaWxvbjxTY2FsYXI+KCkgKTsKKyAgICBWRVJJRlkoZXJyb3IgPT0gMC4wKTsKKyAgICBzdGQ6Om5leHRfcGVybXV0YXRpb24oaW5kaWNlcy5kYXRhKCksaW5kaWNlcy5kYXRhKCkrNCk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbnZlcnNlX2dlbmVyYWxfNHg0KGludCByZXBlYXQpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIGRvdWJsZSBlcnJvcl9zdW0gPSAwLiwgZXJyb3JfbWF4ID0gMC47CisgIGZvcihpbnQgaSA9IDA7IGkgPCByZXBlYXQ7ICsraSkKKyAgeworICAgIE1hdHJpeFR5cGUgbTsKKyAgICBSZWFsU2NhbGFyIGFic2RldDsKKyAgICBkbyB7CisgICAgICBtID0gTWF0cml4VHlwZTo6UmFuZG9tKCk7CisgICAgICBhYnNkZXQgPSBlaV9hYnMobS5kZXRlcm1pbmFudCgpKTsKKyAgICB9IHdoaWxlKGFic2RldCA8IDEwICogZXBzaWxvbjxTY2FsYXI+KCkpOworICAgIE1hdHJpeFR5cGUgaW52ID0gbS5pbnZlcnNlKCk7CisgICAgZG91YmxlIGVycm9yID0gZG91YmxlKCAobSppbnYtTWF0cml4VHlwZTo6SWRlbnRpdHkoKSkubm9ybSgpICogYWJzZGV0IC8gZXBzaWxvbjxTY2FsYXI+KCkgKTsKKyAgICBlcnJvcl9zdW0gKz0gZXJyb3I7CisgICAgZXJyb3JfbWF4ID0gc3RkOjptYXgoZXJyb3JfbWF4LCBlcnJvcik7CisgIH0KKyAgc3RkOjpjZXJyIDw8ICJpbnZlcnNlX2dlbmVyYWxfNHg0LCBTY2FsYXIgPSAiIDw8IHR5cGVfbmFtZTxTY2FsYXI+KCkgPDwgc3RkOjplbmRsOworICBkb3VibGUgZXJyb3JfYXZnID0gZXJyb3Jfc3VtIC8gcmVwZWF0OworICBFSUdFTl9ERUJVR19WQVIoZXJyb3JfYXZnKTsKKyAgRUlHRU5fREVCVUdfVkFSKGVycm9yX21heCk7CisgIFZFUklGWShlcnJvcl9hdmcgPCAoTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCA/IDguMCA6IDEuMjUpKTsKKyAgVkVSSUZZKGVycm9yX21heCA8IChOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ID8gNjQuMCA6IDIwLjApKTsKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9wcmVjX2ludmVyc2VfNHg0KCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEoKGludmVyc2VfcGVybXV0YXRpb25fNHg0PE1hdHJpeDRmPigpKSk7CisgIENBTExfU1VCVEVTVF8xKCggaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg0Zj4oMjAwMDAwICogZ19yZXBlYXQpICkpOworCisgIENBTExfU1VCVEVTVF8yKChpbnZlcnNlX3Blcm11dGF0aW9uXzR4NDxNYXRyaXg8ZG91YmxlLDQsNCxSb3dNYWpvcj4gPigpKSk7CisgIENBTExfU1VCVEVTVF8yKCggaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg8ZG91YmxlLDQsNCxSb3dNYWpvcj4gPigyMDAwMDAgKiBnX3JlcGVhdCkgKSk7CisKKyAgQ0FMTF9TVUJURVNUXzMoKGludmVyc2VfcGVybXV0YXRpb25fNHg0PE1hdHJpeDRjZj4oKSkpOworICBDQUxMX1NVQlRFU1RfMygoaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg0Y2Y+KDUwMDAwICogZ19yZXBlYXQpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfcHJvZHVjdF9sYXJnZS5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfcHJvZHVjdF9sYXJnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0OWVmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9wcm9kdWN0X2xhcmdlLmNwcApAQCAtMCwwICsxLDQ1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAicHJvZHVjdC5oIgorCit2b2lkIHRlc3RfZWlnZW4yX3Byb2R1Y3RfbGFyZ2UoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBwcm9kdWN0KE1hdHJpeFhmKGVpX3JhbmRvbTxpbnQ+KDEsMzIwKSwgZWlfcmFuZG9tPGludD4oMSwzMjApKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcHJvZHVjdChNYXRyaXhYZChlaV9yYW5kb208aW50PigxLDMyMCksIGVpX3JhbmRvbTxpbnQ+KDEsMzIwKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHByb2R1Y3QoTWF0cml4WGkoZWlfcmFuZG9tPGludD4oMSwzMjApLCBlaV9yYW5kb208aW50PigxLDMyMCkpKSApOworICAgIENBTExfU1VCVEVTVF80KCBwcm9kdWN0KE1hdHJpeFhjZihlaV9yYW5kb208aW50PigxLDUwKSwgZWlfcmFuZG9tPGludD4oMSw1MCkpKSApOworICAgIENBTExfU1VCVEVTVF81KCBwcm9kdWN0KE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KGVpX3JhbmRvbTxpbnQ+KDEsMzIwKSwgZWlfcmFuZG9tPGludD4oMSwzMjApKSkgKTsKKyAgfQorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzYKKyAgeworICAgIC8vIHRlc3QgYSBzcGVjaWZpYyBpc3N1ZSBpbiBEaWFnb25hbFByb2R1Y3QKKyAgICBpbnQgTiA9IDEwMDAwMDA7CisgICAgVmVjdG9yWGYgdiA9IFZlY3RvclhmOjpPbmVzKE4pOworICAgIE1hdHJpeFhmIG0gPSBNYXRyaXhYZjo6T25lcyhOLDMpOworICAgIG0gPSAodit2KS5hc0RpYWdvbmFsKCkgKiBtOworICAgIFZFUklGWV9JU19BUFBST1gobSwgTWF0cml4WGY6OkNvbnN0YW50KE4sMywyKSk7CisgIH0KKworICB7CisgICAgLy8gdGVzdCBkZWZlcnJlZCByZXNpemluZyBpbiBNYXRyaXg6Om9wZXJhdG9yPQorICAgIE1hdHJpeFhmIGEgPSBNYXRyaXhYZjo6UmFuZG9tKDEwLDQpLCBiID0gTWF0cml4WGY6OlJhbmRvbSg0LDEwKSwgYyA9IGE7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoYSA9IGEgKiBiKSwgKGMgKiBiKS5ldmFsKCkpOworICB9CisKKyAgeworICAgIE1hdHJpeFhmIG1hdDEoMTAsMTApOyBtYXQxLnNldFJhbmRvbSgpOworICAgIE1hdHJpeFhmIG1hdDIoMzIsMTApOyBtYXQyLnNldFJhbmRvbSgpOworICAgIE1hdHJpeFhmIHJlc3VsdCA9IG1hdDEucm93KDIpKm1hdDIudHJhbnNwb3NlKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQsIChtYXQxLnJvdygyKSptYXQyLnRyYW5zcG9zZSgpKS5ldmFsKCkpOworICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9wcm9kdWN0X3NtYWxsLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9wcm9kdWN0X3NtYWxsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q4YzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX3Byb2R1Y3Rfc21hbGwuY3BwCkBAIC0wLDAgKzEsMjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fTk9fU1RBVElDX0FTU0VSVAorI2luY2x1ZGUgInByb2R1Y3QuaCIKKwordm9pZCB0ZXN0X2VpZ2VuMl9wcm9kdWN0X3NtYWxsKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcHJvZHVjdChNYXRyaXg8ZmxvYXQsIDMsIDI+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHByb2R1Y3QoTWF0cml4PGludCwgMywgNT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcHJvZHVjdChNYXRyaXgzZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBwcm9kdWN0KE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHByb2R1Y3QoTWF0cml4NGYoKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX3FyLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9xci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5NzdlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9xci5jcHAKQEAgLTAsMCArMSw2OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9RUj4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIFFSLmgKKyAgKi8KKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBRUjxNYXRyaXhUeXBlPiBxck9mQShhKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhLCBxck9mQS5tYXRyaXhRKCkgKiBxck9mQS5tYXRyaXhSKCkpOworICBWRVJJRllfSVNfTk9UX0FQUFJPWChhK01hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpLCBxck9mQS5tYXRyaXhRKCkgKiBxck9mQS5tYXRyaXhSKCkpOworCisgICNpZiAwIC8vIGVpZ2VudmFsdWVzIG1vZHVsZSBub3QgeWV0IHJlYWR5CisgIFNxdWFyZU1hdHJpeFR5cGUgYiA9IGEuYWRqb2ludCgpICogYTsKKworICAvLyBjaGVjayB0cmlkaWFnb25hbGl6YXRpb24KKyAgVHJpZGlhZ29uYWxpemF0aW9uPFNxdWFyZU1hdHJpeFR5cGU+IHRyaWRpYWcoYik7CisgIFZFUklGWV9JU19BUFBST1goYiwgdHJpZGlhZy5tYXRyaXhRKCkgKiB0cmlkaWFnLm1hdHJpeFQoKSAqIHRyaWRpYWcubWF0cml4USgpLmFkam9pbnQoKSk7CisKKyAgLy8gY2hlY2sgaGVzc2VuYmVyZyBkZWNvbXBvc2l0aW9uCisgIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPFNxdWFyZU1hdHJpeFR5cGU+IGhlc3MoYik7CisgIFZFUklGWV9JU19BUFBST1goYiwgaGVzcy5tYXRyaXhRKCkgKiBoZXNzLm1hdHJpeEgoKSAqIGhlc3MubWF0cml4USgpLmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1godHJpZGlhZy5tYXRyaXhUKCksIGhlc3MubWF0cml4SCgpKTsKKyAgYiA9IFNxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShjb2xzLGNvbHMpOworICBoZXNzLmNvbXB1dGUoYik7CisgIFZFUklGWV9JU19BUFBST1goYiwgaGVzcy5tYXRyaXhRKCkgKiBoZXNzLm1hdHJpeEgoKSAqIGhlc3MubWF0cml4USgpLmFkam9pbnQoKSk7CisgICNlbmRpZgorfQorCit2b2lkIHRlc3RfZWlnZW4yX3FyKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IDE7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBxcihNYXRyaXgyZigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBxcihNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBxcihNYXRyaXhYZigxMiw4KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggcXIoTWF0cml4WGNkKDUsNSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHFyKE1hdHJpeFhjZCg3LDMpKSApOworICB9CisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfNQorICAvLyBzbWFsbCBpc0Z1bGxSYW5rIHRlc3QKKyAgeworICAgIE1hdHJpeDNkIG1hdDsKKyAgICBtYXQgPDwgMSwgNDUsIDEsIDIsIDIsIDIsIDEsIDIsIDM7CisgICAgVkVSSUZZKG1hdC5xcigpLmlzRnVsbFJhbmsoKSk7CisgICAgbWF0IDw8IDEsIDEsIDEsIDIsIDIsIDIsIDEsIDIsIDM7CisgICAgLy9hbHdheXMgcmV0dXJucyB0cnVlIGluIGVpZ2VuMnN1cHBvcnQKKyAgICAvL1ZFUklGWSghbWF0LnFyKCkuaXNGdWxsUmFuaygpKTsKKyAgfQorCisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9xdHZlY3Rvci5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfcXR2ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZmI1OGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfcXR2ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMTU4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX1dPUktfQVJPVU5EX1FUX0JVR19DQUxMSU5HX1dST05HX09QRVJBVE9SX05FV19GSVhFRF9JTl9RVF80XzUKKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPEVpZ2VuL1F0QWxpZ25lZE1hbGxvYz4KKworI2luY2x1ZGUgPFF0Q29yZS9RVmVjdG9yPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaGVja19xdHZlY3Rvcl9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgUVZlY3RvcjxNYXRyaXhUeXBlPiB2KDEwLCBNYXRyaXhUeXBlKHJvd3MsY29scykpLCB3KDIwLCB5KTsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHkpOworICB9CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5maWxsKHksMjIpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKHNpemVfdCkmKHZbMjJdKSA9PSAoc2l6ZV90KSYodlsyMV0pICsgc2l6ZW9mKE1hdHJpeFR5cGUpKTsKKworICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSB2ZWN0b3IgZ2V0cyBpbnRlcm5hbGx5IHJlc2l6ZWQKKyAgLy8gKHdpdGggbWVtb3J5IHJlYWxsb2NhdGlvbikKKyAgTWF0cml4VHlwZSogcmVmID0gJndbMF07CisgIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCisgICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7CisgIGZvcihpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZKHZbaV09PXdbKGktMjMpJXcuc2l6ZSgpXSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfcXR2ZWN0b3JfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSk7CisgIFFWZWN0b3I8VHJhbnNmb3JtVHlwZT4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYuZmlsbCh5LDIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKKyAgVkVSSUZZKChzaXplX3QpJih2WzIyXSkgPT0gKHNpemVfdCkmKHZbMjFdKSArIHNpemVvZihUcmFuc2Zvcm1UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGludChpKTx2LnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZKHZbaV0ubWF0cml4KCk9PXdbKGktMjMpJXcuc2l6ZSgpXS5tYXRyaXgoKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUXVhdGVybmlvblR5cGU+Cit2b2lkIGNoZWNrX3F0dmVjdG9yX3F1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvblR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlOjpDb2VmZmljaWVudHMgQ29lZmZpY2llbnRzOworICBRdWF0ZXJuaW9uVHlwZSB4KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCB5KENvZWZmaWNpZW50czo6UmFuZG9tKCkpOworICBRVmVjdG9yPFF1YXRlcm5pb25UeXBlPiB2KDEwKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5maWxsKHksMjIpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKHNpemVfdCkmKHZbMjJdKSA9PSAoc2l6ZV90KSYodlsyMV0pICsgc2l6ZW9mKFF1YXRlcm5pb25UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFF1YXRlcm5pb25UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpbnQoaSk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldLmNvZWZmcygpPT13WyhpLTIzKSV3LnNpemUoKV0uY29lZmZzKCkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9laWdlbjJfcXR2ZWN0b3IoKQoreworICAvLyBzb21lIG5vbiB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KFZlY3RvcjJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KE1hdHJpeDNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KE1hdHJpeDNkKCkpKTsKKworICAvLyBzb21lIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1RfMihjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4MmYoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19xdHZlY3Rvcl9tYXRyaXgoVmVjdG9yNGYoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4NGYoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4NGQoKSkpOworCisgIC8vIHNvbWUgZHluYW1pYyBzaXplcworICBDQUxMX1NVQlRFU1RfMyhjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4WGQoMSwxKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19xdHZlY3Rvcl9tYXRyaXgoVmVjdG9yWGQoMjApKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3F0dmVjdG9yX21hdHJpeChSb3dWZWN0b3JYZigyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KE1hdHJpeFhjZigxMCwxMCkpKTsKKworICAvLyBzb21lIFRyYW5zZm9ybQorICBDQUxMX1NVQlRFU1RfNChjaGVja19xdHZlY3Rvcl90cmFuc2Zvcm0oVHJhbnNmb3JtMmYoKSkpOworICBDQUxMX1NVQlRFU1RfNChjaGVja19xdHZlY3Rvcl90cmFuc2Zvcm0oVHJhbnNmb3JtM2YoKSkpOworICBDQUxMX1NVQlRFU1RfNChjaGVja19xdHZlY3Rvcl90cmFuc2Zvcm0oVHJhbnNmb3JtM2QoKSkpOworICAvL0NBTExfU1VCVEVTVF80KGNoZWNrX3F0dmVjdG9yX3RyYW5zZm9ybShUcmFuc2Zvcm00ZCgpKSk7CisKKyAgLy8gc29tZSBRdWF0ZXJuaW9uCisgIENBTExfU1VCVEVTVF81KGNoZWNrX3F0dmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmYoKSkpOworICBDQUxMX1NVQlRFU1RfNShjaGVja19xdHZlY3Rvcl9xdWF0ZXJuaW9uKFF1YXRlcm5pb25mKCkpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9yZWdyZXNzaW9uLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9yZWdyZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhiNThkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX3JlZ3Jlc3Npb24uY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9MZWFzdFNxdWFyZXM+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGUsCisgICAgICAgICB0eXBlbmFtZSBIeXBlcnBsYW5lVHlwZT4KK3ZvaWQgbWFrZU5vaXN5Q29oeXBlcnBsYW5hclBvaW50cyhpbnQgbnVtUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUgKipwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHlwZXJwbGFuZVR5cGUgKmh5cGVycGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIG5vaXNlQW1wbGl0dWRlKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGNvbnN0IGludCBzaXplID0gcG9pbnRzWzBdLT5zaXplKCk7CisgIC8vIHBpY2sgYSByYW5kb20gaHlwZXJwbGFuZSwgc3RvcmUgdGhlIGNvZWZmaWNpZW50cyBvZiBpdHMgZXF1YXRpb24KKyAgaHlwZXJwbGFuZS0+Y29lZmZzKCkucmVzaXplKHNpemUgKyAxKTsKKyAgZm9yKGludCBqID0gMDsgaiA8IHNpemUgKyAxOyBqKyspCisgIHsKKyAgICBkbyB7CisgICAgICBoeXBlcnBsYW5lLT5jb2VmZnMoKS5jb2VmZlJlZihqKSA9IGVpX3JhbmRvbTxTY2FsYXI+KCk7CisgICAgfSB3aGlsZShlaV9hYnMoaHlwZXJwbGFuZS0+Y29lZmZzKCkuY29lZmYoaikpIDwgMC41KTsKKyAgfQorCisgIC8vIG5vdyBwaWNrIG51bVBvaW50cyByYW5kb20gcG9pbnRzIG9uIHRoaXMgaHlwZXJwbGFuZQorICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKyspCisgIHsKKyAgICBWZWN0b3JUeXBlJiBjdXJfcG9pbnQgPSAqKHBvaW50c1tpXSk7CisgICAgZG8KKyAgICB7CisgICAgICBjdXJfcG9pbnQgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSkvKi5ub3JtYWxpemVkKCkqLzsKKyAgICAgIC8vIHByb2plY3QgY3VyX3BvaW50IG9udG8gdGhlIGh5cGVycGxhbmUKKyAgICAgIFNjYWxhciB4ID0gLSAoaHlwZXJwbGFuZS0+Y29lZmZzKCkuc3RhcnQoc2l6ZSkuY3dpc2UoKSpjdXJfcG9pbnQpLnN1bSgpOworICAgICAgY3VyX3BvaW50ICo9IGh5cGVycGxhbmUtPmNvZWZmcygpLmNvZWZmKHNpemUpIC8geDsKKyAgICB9IHdoaWxlKCBjdXJfcG9pbnQubm9ybSgpIDwgMC41CisgICAgICAgICAgfHwgY3VyX3BvaW50Lm5vcm0oKSA+IDIuMCApOworICB9CisKKyAgLy8gYWRkIHNvbWUgbm9pc2UgdG8gdGhlc2UgcG9pbnRzCisgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKyApCisgICAgKihwb2ludHNbaV0pICs9IG5vaXNlQW1wbGl0dWRlICogVmVjdG9yVHlwZTo6UmFuZG9tKHNpemUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCBjaGVja19saW5lYXJSZWdyZXNzaW9uKGludCBudW1Qb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqKnBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3JUeXBlJiBvcmlnaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgdG9sZXJhbmNlKQoreworICBpbnQgc2l6ZSA9IHBvaW50c1swXS0+c2l6ZSgpOworICBhc3NlcnQoc2l6ZT09Mik7CisgIFZlY3RvclR5cGUgcmVzdWx0KHNpemUpOworICBsaW5lYXJSZWdyZXNzaW9uKG51bVBvaW50cywgcG9pbnRzLCAmcmVzdWx0LCAxKTsKKyAgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIGVycm9yID0gKHJlc3VsdCAtIG9yaWdpbmFsKS5ub3JtKCkgLyBvcmlnaW5hbC5ub3JtKCk7CisgIFZFUklGWShlaV9hYnMoZXJyb3IpIDwgZWlfYWJzKHRvbGVyYW5jZSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlLAorICAgICAgICAgdHlwZW5hbWUgSHlwZXJwbGFuZVR5cGU+Cit2b2lkIGNoZWNrX2ZpdEh5cGVycGxhbmUoaW50IG51bVBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICoqcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh5cGVycGxhbmVUeXBlJiBvcmlnaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgdG9sZXJhbmNlKQoreworICBpbnQgc2l6ZSA9IHBvaW50c1swXS0+c2l6ZSgpOworICBIeXBlcnBsYW5lVHlwZSByZXN1bHQoc2l6ZSk7CisgIGZpdEh5cGVycGxhbmUobnVtUG9pbnRzLCBwb2ludHMsICZyZXN1bHQpOworICByZXN1bHQuY29lZmZzKCkgKj0gb3JpZ2luYWwuY29lZmZzKCkuY29lZmYoc2l6ZSkvcmVzdWx0LmNvZWZmcygpLmNvZWZmKHNpemUpOworICB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgZXJyb3IgPSAocmVzdWx0LmNvZWZmcygpIC0gb3JpZ2luYWwuY29lZmZzKCkpLm5vcm0oKSAvIG9yaWdpbmFsLmNvZWZmcygpLm5vcm0oKTsKKyAgc3RkOjpjb3V0IDw8IGVpX2FicyhlcnJvcikgPDwgIiAgeHh4ICAgIiA8PCBlaV9hYnModG9sZXJhbmNlKSA8PCBzdGQ6OmVuZGw7CisgIFZFUklGWShlaV9hYnMoZXJyb3IpIDwgZWlfYWJzKHRvbGVyYW5jZSkpOworfQorCit2b2lkIHRlc3RfZWlnZW4yX3JlZ3Jlc3Npb24oKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykKKyAgeworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8xCisgICAgeworICAgICAgVmVjdG9yMmYgcG9pbnRzMmYgWzEwMDBdOworICAgICAgVmVjdG9yMmYgKnBvaW50czJmX3B0cnMgWzEwMDBdOworICAgICAgZm9yKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgcG9pbnRzMmZfcHRyc1tpXSA9ICYocG9pbnRzMmZbaV0pOworICAgICAgVmVjdG9yMmYgY29lZmZzMmY7CisgICAgICBIeXBlcnBsYW5lPGZsb2F0LDI+IGNvZWZmczNmOworICAgICAgbWFrZU5vaXN5Q29oeXBlcnBsYW5hclBvaW50cygxMDAwLCBwb2ludHMyZl9wdHJzLCAmY29lZmZzM2YsIDAuMDFmKTsKKyAgICAgIGNvZWZmczJmWzBdID0gLWNvZWZmczNmLmNvZWZmcygpWzBdL2NvZWZmczNmLmNvZWZmcygpWzFdOworICAgICAgY29lZmZzMmZbMV0gPSAtY29lZmZzM2YuY29lZmZzKClbMl0vY29lZmZzM2YuY29lZmZzKClbMV07CisgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfbGluZWFyUmVncmVzc2lvbigxMCwgcG9pbnRzMmZfcHRycywgY29lZmZzMmYsIDAuMDVmKSk7CisgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfbGluZWFyUmVncmVzc2lvbigxMDAsIHBvaW50czJmX3B0cnMsIGNvZWZmczJmLCAwLjAxZikpOworICAgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2xpbmVhclJlZ3Jlc3Npb24oMTAwMCwgcG9pbnRzMmZfcHRycywgY29lZmZzMmYsIDAuMDAyZikpOworICAgIH0KKyNlbmRpZgorI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8yCisgICAgeworICAgICAgVmVjdG9yMmYgcG9pbnRzMmYgWzEwMDBdOworICAgICAgVmVjdG9yMmYgKnBvaW50czJmX3B0cnMgWzEwMDBdOworICAgICAgZm9yKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgcG9pbnRzMmZfcHRyc1tpXSA9ICYocG9pbnRzMmZbaV0pOworICAgICAgSHlwZXJwbGFuZTxmbG9hdCwyPiBjb2VmZnMzZjsKKyAgICAgIG1ha2VOb2lzeUNvaHlwZXJwbGFuYXJQb2ludHMoMTAwMCwgcG9pbnRzMmZfcHRycywgJmNvZWZmczNmLCAwLjAxZik7CisgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZml0SHlwZXJwbGFuZSgxMCwgcG9pbnRzMmZfcHRycywgY29lZmZzM2YsIDAuMDVmKSk7CisgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZml0SHlwZXJwbGFuZSgxMDAsIHBvaW50czJmX3B0cnMsIGNvZWZmczNmLCAwLjAxZikpOworICAgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2ZpdEh5cGVycGxhbmUoMTAwMCwgcG9pbnRzMmZfcHRycywgY29lZmZzM2YsIDAuMDAyZikpOworICAgIH0KKyNlbmRpZgorI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8zCisgICAgeworICAgICAgVmVjdG9yNGQgcG9pbnRzNGQgWzEwMDBdOworICAgICAgVmVjdG9yNGQgKnBvaW50czRkX3B0cnMgWzEwMDBdOworICAgICAgZm9yKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgcG9pbnRzNGRfcHRyc1tpXSA9ICYocG9pbnRzNGRbaV0pOworICAgICAgSHlwZXJwbGFuZTxkb3VibGUsND4gY29lZmZzNWQ7CisgICAgICBtYWtlTm9pc3lDb2h5cGVycGxhbmFyUG9pbnRzKDEwMDAsIHBvaW50czRkX3B0cnMsICZjb2VmZnM1ZCwgMC4wMSk7CisgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZml0SHlwZXJwbGFuZSgxMCwgcG9pbnRzNGRfcHRycywgY29lZmZzNWQsIDAuMDUpKTsKKyAgICAgIENBTExfU1VCVEVTVChjaGVja19maXRIeXBlcnBsYW5lKDEwMCwgcG9pbnRzNGRfcHRycywgY29lZmZzNWQsIDAuMDEpKTsKKyAgICAgIENBTExfU1VCVEVTVChjaGVja19maXRIeXBlcnBsYW5lKDEwMDAsIHBvaW50czRkX3B0cnMsIGNvZWZmczVkLCAwLjAwMikpOworICAgIH0KKyNlbmRpZgorI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF80CisgICAgeworICAgICAgVmVjdG9yWGNkICpwb2ludHMxMWNkX3B0cnNbMTAwMF07CisgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSBwb2ludHMxMWNkX3B0cnNbaV0gPSBuZXcgVmVjdG9yWGNkKDExKTsKKyAgICAgIEh5cGVycGxhbmU8c3RkOjpjb21wbGV4PGRvdWJsZT4sRHluYW1pYz4gKmNvZWZmczEyY2QgPSBuZXcgSHlwZXJwbGFuZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljPigxMSk7CisgICAgICBtYWtlTm9pc3lDb2h5cGVycGxhbmFyUG9pbnRzKDEwMDAsIHBvaW50czExY2RfcHRycywgY29lZmZzMTJjZCwgMC4wMSk7CisgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZml0SHlwZXJwbGFuZSgxMDAsIHBvaW50czExY2RfcHRycywgKmNvZWZmczEyY2QsIDAuMDI1KSk7CisgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZml0SHlwZXJwbGFuZSgxMDAwLCBwb2ludHMxMWNkX3B0cnMsICpjb2VmZnMxMmNkLCAwLjAwNikpOworICAgICAgZGVsZXRlIGNvZWZmczEyY2Q7CisgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSBkZWxldGUgcG9pbnRzMTFjZF9wdHJzW2ldOworICAgIH0KKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfc2l6ZW9mLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zaXplb2YuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMWFmNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfc2l6ZW9mLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHZlcmlmeVNpemVPZihjb25zdCBNYXRyaXhUeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUhPUR5bmFtaWMgJiYgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUhPUR5bmFtaWMpCisgICAgVkVSSUZZKHNpemVvZihNYXRyaXhUeXBlKT09c2l6ZW9mKFNjYWxhcikqTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUpOworICBlbHNlCisgICAgVkVSSUZZKHNpemVvZihNYXRyaXhUeXBlKT09c2l6ZW9mKFNjYWxhciopICsgMiAqIHNpemVvZih0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCkpOworfQorCit2b2lkIHRlc3RfZWlnZW4yX3NpemVvZigpCit7CisgIENBTExfU1VCVEVTVCggdmVyaWZ5U2l6ZU9mKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB2ZXJpZnlTaXplT2YoTWF0cml4NGQoKSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB2ZXJpZnlTaXplT2YoTWF0cml4PGRvdWJsZSwgNCwgMj4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB2ZXJpZnlTaXplT2YoTWF0cml4PGJvb2wsIDcsIDU+KCkpICk7CisgIENBTExfU1VCVEVTVCggdmVyaWZ5U2l6ZU9mKE1hdHJpeFhjZigzLCAzKSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB2ZXJpZnlTaXplT2YoTWF0cml4WGkoOCwgMTIpKSApOworICBDQUxMX1NVQlRFU1QoIHZlcmlmeVNpemVPZihNYXRyaXhYY2QoMjAsIDIwKSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB2ZXJpZnlTaXplT2YoTWF0cml4PGZsb2F0LCAxMDAsIDEwMD4oKSkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zbWFsbHZlY3RvcnMuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX3NtYWxsdmVjdG9ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5NjJiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zbWFsbHZlY3RvcnMuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBzbWFsbFZlY3RvcnMoKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIDI+IFYyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDE+IFYzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIDQ+IFY0OworICBTY2FsYXIgeDEgPSBlaV9yYW5kb208U2NhbGFyPigpLAorICAgICAgICAgeDIgPSBlaV9yYW5kb208U2NhbGFyPigpLAorICAgICAgICAgeDMgPSBlaV9yYW5kb208U2NhbGFyPigpLAorICAgICAgICAgeDQgPSBlaV9yYW5kb208U2NhbGFyPigpOworICBWMiB2Mih4MSwgeDIpOworICBWMyB2Myh4MSwgeDIsIHgzKTsKKyAgVjQgdjQoeDEsIHgyLCB4MywgeDQpOworICBWRVJJRllfSVNfQVBQUk9YKHgxLCB2Mi54KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgxLCB2My54KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgxLCB2NC54KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgyLCB2Mi55KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgyLCB2My55KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgyLCB2NC55KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgzLCB2My56KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgzLCB2NC56KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHg0LCB2NC53KCkpOworfQorCit2b2lkIHRlc3RfZWlnZW4yX3NtYWxsdmVjdG9ycygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUKCBzbWFsbFZlY3RvcnM8aW50PigpICk7CisgICAgQ0FMTF9TVUJURVNUKCBzbWFsbFZlY3RvcnM8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1QoIHNtYWxsVmVjdG9yczxkb3VibGU+KCkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX3NwYXJzZV9iYXNpYy5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfc3BhcnNlX2Jhc2ljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkwNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX3NwYXJzZV9iYXNpYy5jcHAKQEAgLTAsMCArMSwzMTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggRGFuaWVsIEdvbWV6IEZlcnJvIDxkZ29tZXpmZXJyb0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNldHRlclR5cGUsdHlwZW5hbWUgRGVuc2VUeXBlLCB0eXBlbmFtZSBTY2FsYXIsIGludCBPcHRpb25zPgorYm9vbCB0ZXN0X3JhbmRvbV9zZXR0ZXIoU3BhcnNlTWF0cml4PFNjYWxhcixPcHRpb25zPiYgc20sIGNvbnN0IERlbnNlVHlwZSYgcmVmLCBjb25zdCBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4mIG5vbnplcm9Db29yZHMpCit7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixPcHRpb25zPiBTcGFyc2VUeXBlOworICB7CisgICAgc20uc2V0WmVybygpOworICAgIFNldHRlclR5cGUgdyhzbSk7CisgICAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHJlbWFpbmluZyA9IG5vbnplcm9Db29yZHM7CisgICAgd2hpbGUoIXJlbWFpbmluZy5lbXB0eSgpKQorICAgIHsKKyAgICAgIGludCBpID0gZWlfcmFuZG9tPGludD4oMCxyZW1haW5pbmcuc2l6ZSgpLTEpOworICAgICAgdyhyZW1haW5pbmdbaV0ueCgpLHJlbWFpbmluZ1tpXS55KCkpID0gcmVmLmNvZWZmKHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSk7CisgICAgICByZW1haW5pbmdbaV0gPSByZW1haW5pbmcuYmFjaygpOworICAgICAgcmVtYWluaW5nLnBvcF9iYWNrKCk7CisgICAgfQorICB9CisgIHJldHVybiBzbS5pc0FwcHJveChyZWYpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTZXR0ZXJUeXBlLHR5cGVuYW1lIERlbnNlVHlwZSwgdHlwZW5hbWUgVD4KK2Jvb2wgdGVzdF9yYW5kb21fc2V0dGVyKER5bmFtaWNTcGFyc2VNYXRyaXg8VD4mIHNtLCBjb25zdCBEZW5zZVR5cGUmIHJlZiwgY29uc3Qgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+JiBub256ZXJvQ29vcmRzKQoreworICBzbS5zZXRaZXJvKCk7CisgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiByZW1haW5pbmcgPSBub256ZXJvQ29vcmRzOworICB3aGlsZSghcmVtYWluaW5nLmVtcHR5KCkpCisgIHsKKyAgICBpbnQgaSA9IGVpX3JhbmRvbTxpbnQ+KDAscmVtYWluaW5nLnNpemUoKS0xKTsKKyAgICBzbS5jb2VmZlJlZihyZW1haW5pbmdbaV0ueCgpLHJlbWFpbmluZ1tpXS55KCkpID0gcmVmLmNvZWZmKHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSk7CisgICAgcmVtYWluaW5nW2ldID0gcmVtYWluaW5nLmJhY2soKTsKKyAgICByZW1haW5pbmcucG9wX2JhY2soKTsKKyAgfQorICByZXR1cm4gc20uaXNBcHByb3gocmVmKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZT4gdm9pZCBzcGFyc2VfYmFzaWMoY29uc3QgU3BhcnNlTWF0cml4VHlwZSYgcmVmKQoreworICBjb25zdCBpbnQgcm93cyA9IHJlZi5yb3dzKCk7CisgIGNvbnN0IGludCBjb2xzID0gcmVmLmNvbHMoKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBlbnVtIHsgRmxhZ3MgPSBTcGFyc2VNYXRyaXhUeXBlOjpGbGFncyB9OworICAKKyAgZG91YmxlIGRlbnNpdHkgPSBzdGQ6Om1heCg4Li8ocm93cypjb2xzKSwgMC4wMSk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgU2NhbGFyIGVwcyA9IDFlLTY7CisKKyAgU3BhcnNlTWF0cml4VHlwZSBtKHJvd3MsIGNvbHMpOworICBEZW5zZU1hdHJpeCByZWZNYXQgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgRGVuc2VWZWN0b3IgdmVjMSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7CisgIFNjYWxhciBzMSA9IGVpX3JhbmRvbTxTY2FsYXI+KCk7CisKKyAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHplcm9Db29yZHM7CisgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiBub256ZXJvQ29vcmRzOworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0LCBtLCAwLCAmemVyb0Nvb3JkcywgJm5vbnplcm9Db29yZHMpOworICAKKyAgaWYgKHplcm9Db29yZHMuc2l6ZSgpPT0wIHx8IG5vbnplcm9Db29yZHMuc2l6ZSgpPT0wKQorICAgIHJldHVybjsKKworICAvLyB0ZXN0IGNvZWZmIGFuZCBjb2VmZlJlZgorICBmb3IgKGludCBpPTA7IGk8KGludCl6ZXJvQ29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBtLmNvZWZmKHplcm9Db29yZHNbaV0ueCgpLHplcm9Db29yZHNbaV0ueSgpKSwgZXBzICk7CisgICAgaWYoZWlfaXNfc2FtZV90eXBlPFNwYXJzZU1hdHJpeFR5cGUsU3BhcnNlTWF0cml4PFNjYWxhcixGbGFncz4gPjo6cmV0KQorICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0uY29lZmZSZWYoemVyb0Nvb3Jkc1swXS54KCksemVyb0Nvb3Jkc1swXS55KCkpID0gNSApOworICB9CisgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0KTsKKworICBtLmNvZWZmUmVmKG5vbnplcm9Db29yZHNbMF0ueCgpLCBub256ZXJvQ29vcmRzWzBdLnkoKSkgPSBTY2FsYXIoNSk7CisgIHJlZk1hdC5jb2VmZlJlZihub256ZXJvQ29vcmRzWzBdLngoKSwgbm9uemVyb0Nvb3Jkc1swXS55KCkpID0gU2NhbGFyKDUpOworCisgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0KTsKKyAgLyoKKyAgLy8gdGVzdCBJbm5lckl0ZXJhdG9ycyBhbmQgQmxvY2sgZXhwcmVzc2lvbnMKKyAgZm9yIChpbnQgdD0wOyB0PDEwOyArK3QpCisgIHsKKyAgICBpbnQgaiA9IGVpX3JhbmRvbTxpbnQ+KDAsY29scy0xKTsKKyAgICBpbnQgaSA9IGVpX3JhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgICBpbnQgdyA9IGVpX3JhbmRvbTxpbnQ+KDEsY29scy1qLTEpOworICAgIGludCBoID0gZWlfcmFuZG9tPGludD4oMSxyb3dzLWktMSk7CisKKy8vICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSxqLGgsdyksIHJlZk1hdC5ibG9jayhpLGosaCx3KSk7CisgICAgZm9yKGludCBjPTA7IGM8dzsgYysrKQorICAgIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jayhpLGosaCx3KS5jb2woYyksIHJlZk1hdC5ibG9jayhpLGosaCx3KS5jb2woYykpOworICAgICAgZm9yKGludCByPTA7IHI8aDsgcisrKQorICAgICAgeworLy8gICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSxqLGgsdykuY29sKGMpLmNvZWZmKHIpLCByZWZNYXQuYmxvY2soaSxqLGgsdykuY29sKGMpLmNvZWZmKHIpKTsKKyAgICAgIH0KKyAgICB9CisvLyAgICAgZm9yKGludCByPTA7IHI8aDsgcisrKQorLy8gICAgIHsKKy8vICAgICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jayhpLGosaCx3KS5yb3cociksIHJlZk1hdC5ibG9jayhpLGosaCx3KS5yb3cocikpOworLy8gICAgICAgZm9yKGludCBjPTA7IGM8dzsgYysrKQorLy8gICAgICAgeworLy8gICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSxqLGgsdykucm93KHIpLmNvZWZmKGMpLCByZWZNYXQuYmxvY2soaSxqLGgsdykucm93KHIpLmNvZWZmKGMpKTsKKy8vICAgICAgIH0KKy8vICAgICB9CisgIH0KKworICBmb3IoaW50IGM9MDsgYzxjb2xzOyBjKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0uY29sKGMpICsgbS5jb2woYyksIChtICsgbSkuY29sKGMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0uY29sKGMpICsgbS5jb2woYyksIHJlZk1hdC5jb2woYykgKyByZWZNYXQuY29sKGMpKTsKKyAgfQorCisgIGZvcihpbnQgcj0wOyByPHJvd3M7IHIrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1gobS5yb3cocikgKyBtLnJvdyhyKSwgKG0gKyBtKS5yb3cocikpOworICAgIFZFUklGWV9JU19BUFBST1gobS5yb3cocikgKyBtLnJvdyhyKSwgcmVmTWF0LnJvdyhyKSArIHJlZk1hdC5yb3cocikpOworICB9CisgICovCisKKyAgLy8gdGVzdCBTcGFyc2VTZXR0ZXJzCisgIC8vIGNvaGVyZW50IHNldHRlcgorICAvLyBUT0RPIGV4dGVuZCB0aGUgTWF0cml4U2V0dGVyCisvLyAgIHsKKy8vICAgICBtLnNldFplcm8oKTsKKy8vICAgICBWRVJJRllfSVNfTk9UX0FQUFJPWChtLCByZWZNYXQpOworLy8gICAgIFNwYXJzZVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlLCBGdWxseUNvaGVyZW50QWNjZXNzUGF0dGVybj4gdyhtKTsKKy8vICAgICBmb3IgKGludCBpPTA7IGk8bm9uemVyb0Nvb3Jkcy5zaXplKCk7ICsraSkKKy8vICAgICB7CisvLyAgICAgICB3LT5jb2VmZlJlZihub256ZXJvQ29vcmRzW2ldLngoKSxub256ZXJvQ29vcmRzW2ldLnkoKSkgPSByZWZNYXQuY29lZmYobm9uemVyb0Nvb3Jkc1tpXS54KCksbm9uemVyb0Nvb3Jkc1tpXS55KCkpOworLy8gICAgIH0KKy8vICAgfQorLy8gICBWRVJJRllfSVNfQVBQUk9YKG0sIHJlZk1hdCk7CisKKyAgLy8gcmFuZG9tIHNldHRlcgorLy8gICB7CisvLyAgICAgbS5zZXRaZXJvKCk7CisvLyAgICAgVkVSSUZZX0lTX05PVF9BUFBST1gobSwgcmVmTWF0KTsKKy8vICAgICBTcGFyc2VTZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSwgUmFuZG9tQWNjZXNzUGF0dGVybj4gdyhtKTsKKy8vICAgICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4gcmVtYWluaW5nID0gbm9uemVyb0Nvb3JkczsKKy8vICAgICB3aGlsZSghcmVtYWluaW5nLmVtcHR5KCkpCisvLyAgICAgeworLy8gICAgICAgaW50IGkgPSBlaV9yYW5kb208aW50PigwLHJlbWFpbmluZy5zaXplKCktMSk7CisvLyAgICAgICB3LT5jb2VmZlJlZihyZW1haW5pbmdbaV0ueCgpLHJlbWFpbmluZ1tpXS55KCkpID0gcmVmTWF0LmNvZWZmKHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSk7CisvLyAgICAgICByZW1haW5pbmdbaV0gPSByZW1haW5pbmcuYmFjaygpOworLy8gICAgICAgcmVtYWluaW5nLnBvcF9iYWNrKCk7CisvLyAgICAgfQorLy8gICB9CisvLyAgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0KTsKKworICAgIFZFUklGWSgoIHRlc3RfcmFuZG9tX3NldHRlcjxSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSwgU3RkTWFwVHJhaXRzPiA+KG0scmVmTWF0LG5vbnplcm9Db29yZHMpICkpOworICAgICNpZmRlZiBFSUdFTl9VTk9SREVSRURfTUFQX1NVUFBPUlQKKyAgICBWRVJJRlkoKCB0ZXN0X3JhbmRvbV9zZXR0ZXI8UmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeFR5cGUsIFN0ZFVub3JkZXJlZE1hcFRyYWl0cz4gPihtLHJlZk1hdCxub256ZXJvQ29vcmRzKSApKTsKKyAgICAjZW5kaWYKKyAgICAjaWZkZWYgX0RFTlNFX0hBU0hfTUFQX0hfCisgICAgVkVSSUZZKCggdGVzdF9yYW5kb21fc2V0dGVyPFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlLCBHb29nbGVEZW5zZUhhc2hNYXBUcmFpdHM+ID4obSxyZWZNYXQsbm9uemVyb0Nvb3JkcykgKSk7CisgICAgI2VuZGlmCisgICAgI2lmZGVmIF9TUEFSU0VfSEFTSF9NQVBfSF8KKyAgICBWRVJJRlkoKCB0ZXN0X3JhbmRvbV9zZXR0ZXI8UmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeFR5cGUsIEdvb2dsZVNwYXJzZUhhc2hNYXBUcmFpdHM+ID4obSxyZWZNYXQsbm9uemVyb0Nvb3JkcykgKSk7CisgICAgI2VuZGlmCisKKyAgICAvLyB0ZXN0IGZpbGxyYW5kCisgICAgeworICAgICAgRGVuc2VNYXRyaXggbTEocm93cyxjb2xzKTsKKyAgICAgIG0xLnNldFplcm8oKTsKKyAgICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cyxjb2xzKTsKKyAgICAgIG0yLnN0YXJ0RmlsbCgpOworICAgICAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKKyAgICAgIHsKKyAgICAgICAgZm9yIChpbnQgaz0wOyBrPHJvd3MvMjsgKytrKQorICAgICAgICB7CisgICAgICAgICAgaW50IGkgPSBlaV9yYW5kb208aW50PigwLHJvd3MtMSk7CisgICAgICAgICAgaWYgKG0xLmNvZWZmKGksaik9PVNjYWxhcigwKSkKKyAgICAgICAgICAgIG0yLmZpbGxyYW5kKGksaikgPSBtMShpLGopID0gZWlfcmFuZG9tPFNjYWxhcj4oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbTIuZW5kRmlsbCgpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMixtMSk7CisgICAgfQorICAKKyAgLy8gdGVzdCBSYW5kb21TZXR0ZXIKKyAgLyp7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMShyb3dzLGNvbHMpLCBtMihyb3dzLGNvbHMpOworICAgIERlbnNlTWF0cml4IHJlZk0xID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk0xLCBtMSk7CisgICAgeworICAgICAgRWlnZW46OlJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlID4gc2V0dGVyKG0yKTsKKyAgICAgIGZvciAoaW50IGo9MDsgajxtMS5vdXRlclNpemUoKTsgKytqKQorICAgICAgICBmb3IgKHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaShtMSxqKTsgaTsgKytpKQorICAgICAgICAgIHNldHRlcihpLmluZGV4KCksIGopID0gaS52YWx1ZSgpOworICAgIH0KKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMik7CisgIH0qLworLy8gICBzdGQ6OmNlcnIgPDwgbS50cmFuc3Bvc2UoKSA8PCAiXG5cbiIgIDw8IHJlZk1hdC50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7CisvLyAgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0KTsKKworICAvLyB0ZXN0IGJhc2ljIGNvbXB1dGF0aW9ucworICB7CisgICAgRGVuc2VNYXRyaXggcmVmTTEgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNMiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZk0zID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgRGVuc2VNYXRyaXggcmVmTTQgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0xKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgcm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG00KHJvd3MsIHJvd3MpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNMSwgbTEpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNMiwgbTIpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNMywgbTMpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNNCwgbTQpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSttMiwgcmVmTTErcmVmTTIpOworICAgIFZFUklGWV9JU19BUFBST1gobTErbTIrbTMsIHJlZk0xK3JlZk0yK3JlZk0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlKCkqKG0xK20yKSwgcmVmTTMuY3dpc2UoKSoocmVmTTErcmVmTTIpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xKnMxLW0yLCByZWZNMSpzMS1yZWZNMik7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xKj1zMSwgcmVmTTEqPXMxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLz1zMSwgcmVmTTEvPXMxKTsKKyAgICAKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xKz1tMiwgcmVmTTErPXJlZk0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLT1tMiwgcmVmTTEtPXJlZk0yKTsKKyAgICAKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbCgwKS5laWdlbjJfZG90KHJlZk0yLnJvdygwKSksIHJlZk0xLmNvbCgwKS5laWdlbjJfZG90KHJlZk0yLnJvdygwKSkpOworICAgIAorICAgIHJlZk00LnNldFJhbmRvbSgpOworICAgIC8vIHNwYXJzZSBjd2lzZSogZGVuc2UKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlKCkqcmVmTTQsIHJlZk0zLmN3aXNlKCkqcmVmTTQpOworLy8gICAgIFZFUklGWV9JU19BUFBST1gobTMuY3dpc2UoKS9yZWZNNCwgcmVmTTMuY3dpc2UoKS9yZWZNNCk7CisgIH0KKworICAvLyB0ZXN0IGlubmVyVmVjdG9yKCkKKyAgeworICAgIERlbnNlTWF0cml4IHJlZk1hdDIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIHJvd3MpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgaW50IGowID0gZWlfcmFuZG9tKDAscm93cy0xKTsKKyAgICBpbnQgajEgPSBlaV9yYW5kb20oMCxyb3dzLTEpOworICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3IoajApLCByZWZNYXQyLmNvbChqMCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3IoajApK20yLmlubmVyVmVjdG9yKGoxKSwgcmVmTWF0Mi5jb2woajApK3JlZk1hdDIuY29sKGoxKSk7CisgICAgLy9tMi5pbm5lclZlY3RvcihqMCkgPSAyKm0yLmlubmVyVmVjdG9yKGoxKTsKKyAgICAvL3JlZk1hdDIuY29sKGowKSA9IDIqcmVmTWF0Mi5jb2woajEpOworICAgIC8vVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CisgIH0KKyAgCisgIC8vIHRlc3QgaW5uZXJWZWN0b3JzKCkKKyAgeworICAgIERlbnNlTWF0cml4IHJlZk1hdDIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIHJvd3MpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgaW50IGowID0gZWlfcmFuZG9tKDAscm93cy0yKTsKKyAgICBpbnQgajEgPSBlaV9yYW5kb20oMCxyb3dzLTIpOworICAgIGludCBuMCA9IGVpX3JhbmRvbTxpbnQ+KDEscm93cy1zdGQ6Om1heChqMCxqMSkpOworICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3JzKGowLG4wKSwgcmVmTWF0Mi5ibG9jaygwLGowLHJvd3MsbjApKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmlubmVyVmVjdG9ycyhqMCxuMCkrbTIuaW5uZXJWZWN0b3JzKGoxLG4wKSwKKyAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDIuYmxvY2soMCxqMCxyb3dzLG4wKStyZWZNYXQyLmJsb2NrKDAsajEscm93cyxuMCkpOworICAgIC8vbTIuaW5uZXJWZWN0b3JzKGowLG4wKSA9IG0yLmlubmVyVmVjdG9ycyhqMCxuMCkgKyBtMi5pbm5lclZlY3RvcnMoajEsbjApOworICAgIC8vcmVmTWF0Mi5ibG9jaygwLGowLHJvd3MsbjApID0gcmVmTWF0Mi5ibG9jaygwLGowLHJvd3MsbjApICsgcmVmTWF0Mi5ibG9jaygwLGoxLHJvd3MsbjApOworICB9CisKKyAgLy8gdGVzdCB0cmFuc3Bvc2UKKyAgeworICAgIERlbnNlTWF0cml4IHJlZk1hdDIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIHJvd3MpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi50cmFuc3Bvc2UoKS5ldmFsKCksIHJlZk1hdDIudHJhbnNwb3NlKCkuZXZhbCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLnRyYW5zcG9zZSgpLCByZWZNYXQyLnRyYW5zcG9zZSgpKTsKKyAgfQorICAKKyAgLy8gdGVzdCBwcnVuZQorICB7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNMihyb3dzLCByb3dzKTsKKyAgICByZWZNMi5zZXRaZXJvKCk7CisgICAgaW50IGNvdW50RmFsc2VOb25aZXJvID0gMDsKKyAgICBpbnQgY291bnRUcnVlTm9uWmVybyA9IDA7CisgICAgbTIuc3RhcnRGaWxsKCk7CisgICAgZm9yIChpbnQgaj0wOyBqPG0yLm91dGVyU2l6ZSgpOyArK2opCisgICAgICBmb3IgKGludCBpPTA7IGk8bTIuaW5uZXJTaXplKCk7ICsraSkKKyAgICAgIHsKKyAgICAgICAgZmxvYXQgeCA9IGVpX3JhbmRvbTxmbG9hdD4oMCwxKTsKKyAgICAgICAgaWYgKHg8MC4xKQorICAgICAgICB7CisgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHg8MC41KQorICAgICAgICB7CisgICAgICAgICAgY291bnRGYWxzZU5vblplcm8rKzsKKyAgICAgICAgICBtMi5maWxsKGksaikgPSBTY2FsYXIoMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY291bnRUcnVlTm9uWmVybysrOworICAgICAgICAgIG0yLmZpbGwoaSxqKSA9IHJlZk0yKGksaikgPSBTY2FsYXIoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBtMi5lbmRGaWxsKCk7CisgICAgVkVSSUZZKGNvdW50RmFsc2VOb25aZXJvK2NvdW50VHJ1ZU5vblplcm8gPT0gbTIubm9uWmVyb3MoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTTIpOworICAgIG0yLnBydW5lKDEpOworICAgIFZFUklGWShjb3VudFRydWVOb25aZXJvPT1tMi5ub25aZXJvcygpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNMik7CisgIH0KK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9zcGFyc2VfYmFzaWMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZT4oOCwgOCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigxNiwgMTYpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZT4oMzMsIDMzKSkgKTsKKyAgICAKKyAgICBDQUxMX1NVQlRFU1RfMyggc3BhcnNlX2Jhc2ljKER5bmFtaWNTcGFyc2VNYXRyaXg8ZG91YmxlPig4LCA4KSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX3NwYXJzZV9wcm9kdWN0LmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zcGFyc2VfcHJvZHVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4ZTc2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zcGFyc2VfcHJvZHVjdC5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggRGFuaWVsIEdvbWV6IEZlcnJvIDxkZ29tZXpmZXJyb0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+IHZvaWQgc3BhcnNlX3Byb2R1Y3QoY29uc3QgU3BhcnNlTWF0cml4VHlwZSYgcmVmKQoreworICBjb25zdCBpbnQgcm93cyA9IHJlZi5yb3dzKCk7CisgIGNvbnN0IGludCBjb2xzID0gcmVmLmNvbHMoKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBlbnVtIHsgRmxhZ3MgPSBTcGFyc2VNYXRyaXhUeXBlOjpGbGFncyB9OworCisgIGRvdWJsZSBkZW5zaXR5ID0gc3RkOjptYXgoOC4vKHJvd3MqY29scyksIDAuMDEpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisKKyAgLy8gdGVzdCBtYXRyaXgtbWF0cml4IHByb2R1Y3QKKyAgeworICAgIERlbnNlTWF0cml4IHJlZk1hdDIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQzID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0NCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IGRtNCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgcm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG00KHJvd3MsIHJvd3MpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDMsIG0zKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0NCwgbTQpOworICAgIFZFUklGWV9JU19BUFBST1gobTQ9bTIqbTMsIHJlZk1hdDQ9cmVmTWF0MipyZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00PW0yLnRyYW5zcG9zZSgpKm0zLCByZWZNYXQ0PXJlZk1hdDIudHJhbnNwb3NlKCkqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND1tMi50cmFuc3Bvc2UoKSptMy50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyLnRyYW5zcG9zZSgpKnJlZk1hdDMudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTQ9bTIqbTMudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0MipyZWZNYXQzLnRyYW5zcG9zZSgpKTsKKworICAgIC8vIHNwYXJzZSAqIGRlbnNlCisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTIqcmVmTWF0MywgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PW0yKnJlZk1hdDMudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0MipyZWZNYXQzLnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1tMi50cmFuc3Bvc2UoKSpyZWZNYXQzLCByZWZNYXQ0PXJlZk1hdDIudHJhbnNwb3NlKCkqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTIudHJhbnNwb3NlKCkqcmVmTWF0My50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyLnRyYW5zcG9zZSgpKnJlZk1hdDMudHJhbnNwb3NlKCkpOworCisgICAgLy8gZGVuc2UgKiBzcGFyc2UKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1yZWZNYXQyKm0zLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9cmVmTWF0MiptMy50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PXJlZk1hdDIudHJhbnNwb3NlKCkqbTMsIHJlZk1hdDQ9cmVmTWF0Mi50cmFuc3Bvc2UoKSpyZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1yZWZNYXQyLnRyYW5zcG9zZSgpKm0zLnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIudHJhbnNwb3NlKCkqcmVmTWF0My50cmFuc3Bvc2UoKSk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zPW0zKm0zLCByZWZNYXQzPXJlZk1hdDMqcmVmTWF0Myk7CisgIH0KKworICAvLyB0ZXN0IG1hdHJpeCAtIGRpYWdvbmFsIHByb2R1Y3QKKyAgaWYoZmFsc2UpIC8vIGl0IGNvbXBpbGVzLCBidXQgdGhlIHByZWNpc2lvbiBpcyB0ZXJyaWJsZS4gcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgaW4gdGhpcyBicmFuY2guLi4uCisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNMiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZk0zID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgRGlhZ29uYWxNYXRyaXg8RGVuc2VWZWN0b3I+IGQxKERlbnNlVmVjdG9yOjpSYW5kb20ocm93cykpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgcm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMyhyb3dzLCByb3dzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTTIsIG0yKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTTMsIG0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zPW0yKmQxLCByZWZNMz1yZWZNMipkMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMz1tMi50cmFuc3Bvc2UoKSpkMSwgcmVmTTM9cmVmTTIudHJhbnNwb3NlKCkqZDEpOworICAgIFZFUklGWV9JU19BUFBST1gobTM9ZDEqbTIsIHJlZk0zPWQxKnJlZk0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zPWQxKm0yLnRyYW5zcG9zZSgpLCByZWZNMz1kMSAqIHJlZk0yLnRyYW5zcG9zZSgpKTsKKyAgfQorCisgIC8vIHRlc3Qgc2VsZiBhZGpvaW50IHByb2R1Y3RzCisgIHsKKyAgICBEZW5zZU1hdHJpeCBiID0gRGVuc2VNYXRyaXg6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCB4ID0gRGVuc2VNYXRyaXg6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZYID0gRGVuc2VNYXRyaXg6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZVcCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZkxvID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgRGVuc2VNYXRyaXggcmVmUyA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbVVwKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbUxvKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbVMocm93cywgcm93cyk7CisgICAgZG8geworICAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZlVwLCBtVXAsIEZvcmNlUmVhbERpYWd8LypGb3JjZU5vblplcm9EaWFnfCovTWFrZVVwcGVyVHJpYW5ndWxhcik7CisgICAgfSB3aGlsZSAocmVmVXAuaXNaZXJvKCkpOworICAgIHJlZkxvID0gcmVmVXAudHJhbnNwb3NlKCkuY29uanVnYXRlKCk7CisgICAgbUxvID0gbVVwLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpOworICAgIHJlZlMgPSByZWZVcCArIHJlZkxvOworICAgIHJlZlMuZGlhZ29uYWwoKSAqPSAwLjU7CisgICAgbVMgPSBtVXAgKyBtTG87CisgICAgZm9yIChpbnQgaz0wOyBrPG1TLm91dGVyU2l6ZSgpOyArK2spCisgICAgICBmb3IgKHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobVMsayk7IGl0OyArK2l0KQorICAgICAgICBpZiAoaXQuaW5kZXgoKSA9PSBrKQorICAgICAgICAgIGl0LnZhbHVlUmVmKCkgKj0gMC41OworCisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZTLmFkam9pbnQoKSwgcmVmUyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtUy50cmFuc3Bvc2UoKS5jb25qdWdhdGUoKSwgbVMpOworICAgIFZFUklGWV9JU19BUFBST1gobVMsIHJlZlMpOworICAgIFZFUklGWV9JU19BUFBST1goeD1tUypiLCByZWZYPXJlZlMqYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh4PW1VcC50ZW1wbGF0ZSBtYXJrZWQ8VXBwZXJUcmlhbmd1bGFyfFNlbGZBZGpvaW50PigpKmIsIHJlZlg9cmVmUypiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHg9bUxvLnRlbXBsYXRlIG1hcmtlZDxMb3dlclRyaWFuZ3VsYXJ8U2VsZkFkam9pbnQ+KCkqYiwgcmVmWD1yZWZTKmIpOworICAgIFZFUklGWV9JU19BUFBST1goeD1tUy50ZW1wbGF0ZSBtYXJrZWQ8U2VsZkFkam9pbnQ+KCkqYiwgcmVmWD1yZWZTKmIpOworICB9CisKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9zcGFyc2VfcHJvZHVjdCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHNwYXJzZV9wcm9kdWN0KFNwYXJzZU1hdHJpeDxkb3VibGU+KDgsIDgpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBzcGFyc2VfcHJvZHVjdChTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigxNiwgMTYpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBzcGFyc2VfcHJvZHVjdChTcGFyc2VNYXRyaXg8ZG91YmxlPigzMywgMzMpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzMoIHNwYXJzZV9wcm9kdWN0KER5bmFtaWNTcGFyc2VNYXRyaXg8ZG91YmxlPig4LCA4KSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX3NwYXJzZV9zb2x2ZXJzLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zcGFyc2Vfc29sdmVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlZjI3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zcGFyc2Vfc29sdmVycy5jcHAKQEAgLTAsMCArMSwyMDAgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggRGFuaWVsIEdvbWV6IEZlcnJvIDxkZ29tZXpmZXJyb0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZAoraW5pdFNQRChkb3VibGUgZGVuc2l0eSwKKyAgICAgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+JiByZWZNYXQsCisgICAgICAgIFNwYXJzZU1hdHJpeDxTY2FsYXI+JiBzcGFyc2VNYXQpCit7CisgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBhdXgocmVmTWF0LnJvd3MoKSxyZWZNYXQuY29scygpKTsKKyAgaW5pdFNwYXJzZShkZW5zaXR5LHJlZk1hdCxzcGFyc2VNYXQpOworICByZWZNYXQgPSByZWZNYXQgKiByZWZNYXQuYWRqb2ludCgpOworICBmb3IgKGludCBrPTA7IGs8MjsgKytrKQorICB7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LGF1eCxzcGFyc2VNYXQsRm9yY2VOb25aZXJvRGlhZyk7CisgICAgcmVmTWF0ICs9IGF1eCAqIGF1eC5hZGpvaW50KCk7CisgIH0KKyAgc3BhcnNlTWF0LnN0YXJ0RmlsbCgpOworICBmb3IgKGludCBqPTAgOyBqPHNwYXJzZU1hdC5jb2xzKCk7ICsraikKKyAgICBmb3IgKGludCBpPWogOyBpPHNwYXJzZU1hdC5yb3dzKCk7ICsraSkKKyAgICAgIGlmIChyZWZNYXQoaSxqKSE9U2NhbGFyKDApKQorICAgICAgICBzcGFyc2VNYXQuZmlsbChpLGopID0gcmVmTWF0KGksaik7CisgIHNwYXJzZU1hdC5lbmRGaWxsKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBzcGFyc2Vfc29sdmVycyhpbnQgcm93cywgaW50IGNvbHMpCit7CisgIGRvdWJsZSBkZW5zaXR5ID0gc3RkOjptYXgoOC4vKHJvd3MqY29scyksIDAuMDEpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisgIC8vIFNjYWxhciBlcHMgPSAxZS02OworCisgIERlbnNlVmVjdG9yIHZlYzEgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpOworCisgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiB6ZXJvQ29vcmRzOworICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4gbm9uemVyb0Nvb3JkczsKKworICAvLyB0ZXN0IHRyaWFuZ3VsYXIgc29sdmVyCisgIHsKKyAgICBEZW5zZVZlY3RvciB2ZWMyID0gdmVjMSwgdmVjMyA9IHZlYzE7CisgICAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbTIocm93cywgY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0MiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworCisgICAgLy8gbG93ZXIKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIsIEZvcmNlTm9uWmVyb0RpYWd8TWFrZUxvd2VyVHJpYW5ndWxhciwgJnplcm9Db29yZHMsICZub256ZXJvQ29vcmRzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk1hdDIudGVtcGxhdGUgbWFya2VkPExvd2VyVHJpYW5ndWxhcj4oKS5zb2x2ZVRyaWFuZ3VsYXIodmVjMiksCisgICAgICAgICAgICAgICAgICAgICBtMi50ZW1wbGF0ZSBtYXJrZWQ8TG93ZXJUcmlhbmd1bGFyPigpLnNvbHZlVHJpYW5ndWxhcih2ZWMzKSk7CisKKyAgICAvLyBsb3dlciAtIHRyYW5zcG9zZQorICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZ3xNYWtlTG93ZXJUcmlhbmd1bGFyLCAmemVyb0Nvb3JkcywgJm5vbnplcm9Db29yZHMpOworICAgIFZFUklGWV9JU19BUFBST1gocmVmTWF0Mi50ZW1wbGF0ZSBtYXJrZWQ8TG93ZXJUcmlhbmd1bGFyPigpLnRyYW5zcG9zZSgpLnNvbHZlVHJpYW5ndWxhcih2ZWMyKSwKKyAgICAgICAgICAgICAgICAgICAgIG0yLnRlbXBsYXRlIG1hcmtlZDxMb3dlclRyaWFuZ3VsYXI+KCkudHJhbnNwb3NlKCkuc29sdmVUcmlhbmd1bGFyKHZlYzMpKTsKKworICAgIC8vIHVwcGVyCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VVcHBlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLnRlbXBsYXRlIG1hcmtlZDxVcHBlclRyaWFuZ3VsYXI+KCkuc29sdmVUcmlhbmd1bGFyKHZlYzIpLAorICAgICAgICAgICAgICAgICAgICAgbTIudGVtcGxhdGUgbWFya2VkPFVwcGVyVHJpYW5ndWxhcj4oKS5zb2x2ZVRyaWFuZ3VsYXIodmVjMykpOworCisgICAgLy8gdXBwZXIgLSB0cmFuc3Bvc2UKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIsIEZvcmNlTm9uWmVyb0RpYWd8TWFrZVVwcGVyVHJpYW5ndWxhciwgJnplcm9Db29yZHMsICZub256ZXJvQ29vcmRzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk1hdDIudGVtcGxhdGUgbWFya2VkPFVwcGVyVHJpYW5ndWxhcj4oKS50cmFuc3Bvc2UoKS5zb2x2ZVRyaWFuZ3VsYXIodmVjMiksCisgICAgICAgICAgICAgICAgICAgICBtMi50ZW1wbGF0ZSBtYXJrZWQ8VXBwZXJUcmlhbmd1bGFyPigpLnRyYW5zcG9zZSgpLnNvbHZlVHJpYW5ndWxhcih2ZWMzKSk7CisgIH0KKworICAvLyB0ZXN0IExMVAorICB7CisgICAgLy8gVE9ETyBmaXggdGhlIGlzc3VlIHdpdGggY29tcGxleCAoc2VlIFNwYXJzZUxMVDo6c29sdmVJblBsYWNlKQorICAgIFNwYXJzZU1hdHJpeDxTY2FsYXI+IG0yKHJvd3MsIGNvbHMpOworICAgIERlbnNlTWF0cml4IHJlZk1hdDIocm93cywgY29scyk7CisKKyAgICBEZW5zZVZlY3RvciBiID0gRGVuc2VWZWN0b3I6OlJhbmRvbShjb2xzKTsKKyAgICBEZW5zZVZlY3RvciByZWZYKGNvbHMpLCB4KGNvbHMpOworCisgICAgaW5pdFNQRChkZW5zaXR5LCByZWZNYXQyLCBtMik7CisKKyAgICByZWZNYXQyLmxsdCgpLnNvbHZlKGIsICZyZWZYKTsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsTG93ZXJUcmlhbmd1bGFyfFNlbGZBZGpvaW50PiBTcGFyc2VTZWxmQWRqb2ludE1hdHJpeDsKKyAgICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgICAgeworICAgICAgeCA9IGI7CisgICAgICBTcGFyc2VMTFQ8U3BhcnNlU2VsZkFkam9pbnRNYXRyaXg+IChtMikuc29sdmVJblBsYWNlKHgpOworICAgICAgVkVSSUZZKHJlZlguaXNBcHByb3goeCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpICYmICJMTFQ6IGRlZmF1bHQiKTsKKyAgICB9CisgICAgI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAorICAgIHggPSBiOworICAgIFNwYXJzZUxMVDxTcGFyc2VTZWxmQWRqb2ludE1hdHJpeCxDaG9sbW9kPihtMikuc29sdmVJblBsYWNlKHgpOworICAgIFZFUklGWShyZWZYLmlzQXBwcm94KHgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSAmJiAiTExUOiBjaG9sbW9kIik7CisgICAgI2VuZGlmCisgICAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4KQorICAgIHsKKyAgICAgICNpZmRlZiBFSUdFTl9UQVVDU19TVVBQT1JUCisgICAgICB4ID0gYjsKKyAgICAgIFNwYXJzZUxMVDxTcGFyc2VTZWxmQWRqb2ludE1hdHJpeCxUYXVjcz4obTIsSW5jb21wbGV0ZUZhY3Rvcml6YXRpb24pLnNvbHZlSW5QbGFjZSh4KTsKKyAgICAgIFZFUklGWShyZWZYLmlzQXBwcm94KHgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSAmJiAiTExUOiB0YXVjcyAoSW5jb21wbGV0ZUZhY3Rvcml6YXRpb24pIik7CisgICAgICB4ID0gYjsKKyAgICAgIFNwYXJzZUxMVDxTcGFyc2VTZWxmQWRqb2ludE1hdHJpeCxUYXVjcz4obTIsU3VwZXJub2RhbE11bHRpZnJvbnRhbCkuc29sdmVJblBsYWNlKHgpOworICAgICAgVkVSSUZZKHJlZlguaXNBcHByb3goeCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpICYmICJMTFQ6IHRhdWNzIChTdXBlcm5vZGFsTXVsdGlmcm9udGFsKSIpOworICAgICAgeCA9IGI7CisgICAgICBTcGFyc2VMTFQ8U3BhcnNlU2VsZkFkam9pbnRNYXRyaXgsVGF1Y3M+KG0yLFN1cGVybm9kYWxMZWZ0TG9va2luZykuc29sdmVJblBsYWNlKHgpOworICAgICAgVkVSSUZZKHJlZlguaXNBcHByb3goeCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpICYmICJMTFQ6IHRhdWNzIChTdXBlcm5vZGFsTGVmdExvb2tpbmcpIik7CisgICAgICAjZW5kaWYKKyAgICB9CisgIH0KKworICAvLyB0ZXN0IExETFQKKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4KQorICB7CisgICAgLy8gVE9ETyBmaXggdGhlIGlzc3VlIHdpdGggY29tcGxleCAoc2VlIFNwYXJzZUxETFQ6OnNvbHZlSW5QbGFjZSkKKyAgICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtMihyb3dzLCBjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyKHJvd3MsIGNvbHMpOworCisgICAgRGVuc2VWZWN0b3IgYiA9IERlbnNlVmVjdG9yOjpSYW5kb20oY29scyk7CisgICAgRGVuc2VWZWN0b3IgcmVmWChjb2xzKSwgeChjb2xzKTsKKworICAgIC8vaW5pdFNQRChkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VVcHBlclRyaWFuZ3VsYXIsIDAsIDApOworICAgIHJlZk1hdDIgKz0gcmVmTWF0Mi5hZGpvaW50KCk7CisgICAgcmVmTWF0Mi5kaWFnb25hbCgpICo9IDAuNTsKKworICAgIHJlZk1hdDIubGRsdCgpLnNvbHZlKGIsICZyZWZYKTsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsVXBwZXJUcmlhbmd1bGFyfFNlbGZBZGpvaW50PiBTcGFyc2VTZWxmQWRqb2ludE1hdHJpeDsKKyAgICB4ID0gYjsKKyAgICBTcGFyc2VMRExUPFNwYXJzZVNlbGZBZGpvaW50TWF0cml4PiBsZGx0KG0yKTsKKyAgICBpZiAobGRsdC5zdWNjZWVkZWQoKSkKKyAgICAgIGxkbHQuc29sdmVJblBsYWNlKHgpOworICAgIFZFUklGWShyZWZYLmlzQXBwcm94KHgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSAmJiAiTERMVDogZGVmYXVsdCIpOworICB9CisKKyAgLy8gdGVzdCBMVQorICB7CisgICAgc3RhdGljIGludCBjb3VudCA9IDA7CisgICAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbTIocm93cywgY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0Mihyb3dzLCBjb2xzKTsKKworICAgIERlbnNlVmVjdG9yIGIgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKGNvbHMpOworICAgIERlbnNlVmVjdG9yIHJlZlgoY29scyksIHgoY29scyk7CisKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIsIEZvcmNlTm9uWmVyb0RpYWcsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisKKyAgICBMVTxEZW5zZU1hdHJpeD4gcmVmTHUocmVmTWF0Mik7CisgICAgcmVmTHUuc29sdmUoYiwgJnJlZlgpOworICAgICNpZiBkZWZpbmVkKEVJR0VOX1NVUEVSTFVfU1VQUE9SVCkgfHwgZGVmaW5lZChFSUdFTl9VTUZQQUNLX1NVUFBPUlQpCisgICAgU2NhbGFyIHJlZkRldCA9IHJlZkx1LmRldGVybWluYW50KCk7CisgICAgI2VuZGlmCisgICAgeC5zZXRaZXJvKCk7CisgICAgLy8gLy8gU3BhcnNlTFU8U3BhcnNlTWF0cml4PFNjYWxhcj4gPiAobTIpLnNvbHZlKGIsJngpOworICAgIC8vIC8vIFZFUklGWShyZWZYLmlzQXBwcm94KHgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSAmJiAiTFU6IGRlZmF1bHQiKTsKKyAgICAjaWZkZWYgRUlHRU5fU1VQRVJMVV9TVVBQT1JUCisgICAgeworICAgICAgeC5zZXRaZXJvKCk7CisgICAgICBTcGFyc2VMVTxTcGFyc2VNYXRyaXg8U2NhbGFyPixTdXBlckxVPiBzbHUobTIpOworICAgICAgaWYgKHNsdS5zdWNjZWVkZWQoKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHNsdS5zb2x2ZShiLCZ4KSkgeworICAgICAgICAgIFZFUklGWShyZWZYLmlzQXBwcm94KHgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSAmJiAiTFU6IFN1cGVyTFUiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzdGQ6OmNlcnIgPDwgcmVmRGV0IDw8ICIgPT0gIiA8PCBzbHUuZGV0ZXJtaW5hbnQoKSA8PCAiXG4iOworICAgICAgICBpZiAoY291bnQ9PTApIHsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlZkRldCxzbHUuZGV0ZXJtaW5hbnQoKSk7IC8vIEZJWE1FIGRldCBpcyBub3QgdmVyeSBzdGFibGUgZm9yIGNvbXBsZXgKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKKyAgICAjaWZkZWYgRUlHRU5fVU1GUEFDS19TVVBQT1JUCisgICAgeworICAgICAgLy8gY2hlY2sgc29sdmUKKyAgICAgIHguc2V0WmVybygpOworICAgICAgU3BhcnNlTFU8U3BhcnNlTWF0cml4PFNjYWxhcj4sVW1mUGFjaz4gc2x1KG0yKTsKKyAgICAgIGlmIChzbHUuc3VjY2VlZGVkKCkpIHsKKyAgICAgICAgaWYgKHNsdS5zb2x2ZShiLCZ4KSkgeworICAgICAgICAgIGlmIChjb3VudD09MCkgeworICAgICAgICAgICAgVkVSSUZZKHJlZlguaXNBcHByb3goeCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpICYmICJMVTogdW1mcGFjayIpOyAgLy8gRklYTUUgc29sdmUgaXMgbm90IHZlcnkgc3RhYmxlIGZvciBjb21wbGV4CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFZFUklGWV9JU19BUFBST1gocmVmRGV0LHNsdS5kZXRlcm1pbmFudCgpKTsKKyAgICAgICAgLy8gVE9ETyBjaGVjayB0aGUgZXh0cmFjdGVkIGRhdGEKKyAgICAgICAgLy9zdGQ6OmNlcnIgPDwgc2x1Lm1hdHJpeEwoKSA8PCAiXG4iOworICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKKyAgICBjb3VudCsrOworICB9CisKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9zcGFyc2Vfc29sdmVycygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHNwYXJzZV9zb2x2ZXJzPGRvdWJsZT4oOCwgOCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggc3BhcnNlX3NvbHZlcnM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigxNiwgMTYpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIHNwYXJzZV9zb2x2ZXJzPGRvdWJsZT4oMTAxLCAxMDEpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zcGFyc2VfdmVjdG9yLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zcGFyc2VfdmVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQyZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX3NwYXJzZV92ZWN0b3IuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggRGFuaWVsIEdvbWV6IEZlcnJvIDxkZ29tZXpmZXJyb0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBzcGFyc2VfdmVjdG9yKGludCByb3dzLCBpbnQgY29scykKK3sKKyAgZG91YmxlIGRlbnNpdHlNYXQgPSBzdGQ6Om1heCg4Li8ocm93cypjb2xzKSwgMC4wMSk7CisgIGRvdWJsZSBkZW5zaXR5VmVjID0gc3RkOjptYXgoOC4vZmxvYXQocm93cyksIDAuMSk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8U2NhbGFyPiBTcGFyc2VWZWN0b3JUeXBlOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXI+IFNwYXJzZU1hdHJpeFR5cGU7CisgIFNjYWxhciBlcHMgPSAxZS02OworCisgIFNwYXJzZU1hdHJpeFR5cGUgbTEocm93cyxjb2xzKTsKKyAgU3BhcnNlVmVjdG9yVHlwZSB2MShyb3dzKSwgdjIocm93cyksIHYzKHJvd3MpOworICBEZW5zZU1hdHJpeCByZWZNMSA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICBEZW5zZVZlY3RvciByZWZWMSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyksCisgICAgcmVmVjIgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpLAorICAgIHJlZlYzID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKTsKKworICBzdGQ6OnZlY3RvcjxpbnQ+IHplcm9jb29yZHMsIG5vbnplcm9jb29yZHM7CisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5VmVjLCByZWZWMSwgdjEsICZ6ZXJvY29vcmRzLCAmbm9uemVyb2Nvb3Jkcyk7CisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5TWF0LCByZWZNMSwgbTEpOworCisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5VmVjLCByZWZWMiwgdjIpOworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eVZlYywgcmVmVjMsIHYzKTsKKworICBTY2FsYXIgczEgPSBlaV9yYW5kb208U2NhbGFyPigpOworCisgIC8vIHRlc3QgY29lZmYgYW5kIGNvZWZmUmVmCisgIGZvciAodW5zaWduZWQgaW50IGk9MDsgaTx6ZXJvY29vcmRzLnNpemUoKTsgKytpKQorICB7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCB2MS5jb2VmZih6ZXJvY29vcmRzW2ldKSwgZXBzICk7CisgICAgLy9WRVJJRllfUkFJU0VTX0FTU0VSVCggdjEuY29lZmZSZWYoemVyb2Nvb3Jkc1tpXSkgPSA1ICk7CisgIH0KKyAgeworICAgIFZFUklGWShpbnQobm9uemVyb2Nvb3Jkcy5zaXplKCkpID09IHYxLm5vblplcm9zKCkpOworICAgIGludCBqPTA7CisgICAgZm9yICh0eXBlbmFtZSBTcGFyc2VWZWN0b3JUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KHYxKTsgaXQ7ICsraXQsKytqKQorICAgIHsKKyAgICAgIFZFUklGWShub256ZXJvY29vcmRzW2pdPT1pdC5pbmRleCgpKTsKKyAgICAgIFZFUklGWShpdC52YWx1ZSgpPT12MS5jb2VmZihpdC5pbmRleCgpKSk7CisgICAgICBWRVJJRlkoaXQudmFsdWUoKT09cmVmVjEuY29lZmYoaXQuaW5kZXgoKSkpOworICAgIH0KKyAgfQorICBWRVJJRllfSVNfQVBQUk9YKHYxLCByZWZWMSk7CisKKyAgdjEuY29lZmZSZWYobm9uemVyb2Nvb3Jkc1swXSkgPSBTY2FsYXIoNSk7CisgIHJlZlYxLmNvZWZmUmVmKG5vbnplcm9jb29yZHNbMF0pID0gU2NhbGFyKDUpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLCByZWZWMSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSt2MiwgcmVmVjErcmVmVjIpOworICBWRVJJRllfSVNfQVBQUk9YKHYxK3YyK3YzLCByZWZWMStyZWZWMityZWZWMyk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSpzMS12MiwgcmVmVjEqczEtcmVmVjIpOworCisgIFZFUklGWV9JU19BUFBST1godjEqPXMxLCByZWZWMSo9czEpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLz1zMSwgcmVmVjEvPXMxKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1godjErPXYyLCByZWZWMSs9cmVmVjIpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLT12MiwgcmVmVjEtPXJlZlYyKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHYxLmVpZ2VuMl9kb3QodjIpLCByZWZWMS5laWdlbjJfZG90KHJlZlYyKSk7CisgIFZFUklGWV9JU19BUFBST1godjEuZWlnZW4yX2RvdChyZWZWMiksIHJlZlYxLmVpZ2VuMl9kb3QocmVmVjIpKTsKKworfQorCit2b2lkIHRlc3RfZWlnZW4yX3NwYXJzZV92ZWN0b3IoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBzcGFyc2VfdmVjdG9yPGRvdWJsZT4oOCwgOCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggc3BhcnNlX3ZlY3RvcjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KDE2LCAxNikgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggc3BhcnNlX3ZlY3Rvcjxkb3VibGU+KDI5OSwgNTM1KSApOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zdGR2ZWN0b3IuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX3N0ZHZlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiMDVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zdGR2ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgPEVpZ2VuL1N0ZFZlY3Rvcj4KKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgc3RkOjp2ZWN0b3I8TWF0cml4VHlwZSwgYWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPiB2KDEwLCBNYXRyaXhUeXBlKHJvd3MsY29scykpLCB3KDIwLCB5KTsKKyAgdls1XSA9IHg7CisgIHdbNl0gPSB2WzVdOworICBWRVJJRllfSVNfQVBQUk9YKHdbNl0sIHZbNV0pOworICB2ID0gdzsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOworICB9CisKKyAgdi5yZXNpemUoMjEpOworICB2WzIwXSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKKyAgVkVSSUZZKChzdGQ6OnNpemVfdCkmKHZbMjJdKSA9PSAoc3RkOjpzaXplX3QpJih2WzIxXSkgKyBzaXplb2YoTWF0cml4VHlwZSkpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAorICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQorICBNYXRyaXhUeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXT09d1soaS0yMykldy5zaXplKCldKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgordm9pZCBjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSk7CisgIHN0ZDo6dmVjdG9yPFRyYW5zZm9ybVR5cGUsIGFsaWduZWRfYWxsb2NhdG9yPFRyYW5zZm9ybVR5cGU+ID4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKHN0ZDo6c2l6ZV90KSYodlsyMl0pID09IChzdGQ6OnNpemVfdCkmKHZbMjFdKSArIHNpemVvZihUcmFuc2Zvcm1UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpPT13WyhpLTIzKSV3LnNpemUoKV0ubWF0cml4KCkpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgordm9pZCBjaGVja19zdGR2ZWN0b3JfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUXVhdGVybmlvblR5cGU6OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7CisgIFF1YXRlcm5pb25UeXBlIHgoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHkoQ29lZmZpY2llbnRzOjpSYW5kb20oKSk7CisgIHN0ZDo6dmVjdG9yPFF1YXRlcm5pb25UeXBlLCBhbGlnbmVkX2FsbG9jYXRvcjxRdWF0ZXJuaW9uVHlwZT4gPiB2KDEwKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7CisgIFZFUklGWSgoc3RkOjpzaXplX3QpJih2WzIyXSkgPT0gKHN0ZDo6c2l6ZV90KSYodlsyMV0pICsgc2l6ZW9mKFF1YXRlcm5pb25UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFF1YXRlcm5pb25UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXS5jb2VmZnMoKT09d1soaS0yMykldy5zaXplKCldLmNvZWZmcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3RfZWlnZW4yX3N0ZHZlY3RvcigpCit7CisgIC8vIHNvbWUgbm9uIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGR2ZWN0b3JfbWF0cml4KFZlY3RvcjJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXgzZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4M2QoKSkpOworCisgIC8vIHNvbWUgdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4MmYoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGR2ZWN0b3JfbWF0cml4KFZlY3RvcjRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXg0ZigpKSk7CisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4NGQoKSkpOworCisgIC8vIHNvbWUgZHluYW1pYyBzaXplcworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeFhkKDEsMSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChWZWN0b3JYZCgyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChSb3dWZWN0b3JYZigyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXhYY2YoMTAsMTApKSk7CisKKyAgLy8gc29tZSBUcmFuc2Zvcm0KKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShUcmFuc2Zvcm0yZigpKSk7CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oVHJhbnNmb3JtM2YoKSkpOworICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKFRyYW5zZm9ybTNkKCkpKTsKKyAgLy9DQUxMX1NVQlRFU1RfNChjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKFRyYW5zZm9ybTRkKCkpKTsKKworICAvLyBzb21lIFF1YXRlcm5pb24KKyAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkdmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmYoKSkpOworICBDQUxMX1NVQlRFU1RfNShjaGVja19zdGR2ZWN0b3JfcXVhdGVybmlvbihRdWF0ZXJuaW9uZigpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfc3VibWF0cmljZXMuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX3N1Ym1hdHJpY2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQzZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvZWlnZW4yX3N1Ym1hdHJpY2VzLmNwcApAQCAtMCwwICsxLDE0OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworLy8gY2hlY2sgbWlub3Igc2VwYXJhdGVseSBpbiBvcmRlciB0byBhdm9pZCB0aGUgcG9zc2libGUgY3JlYXRpb24gb2YgYSB6ZXJvLXNpemVkCisvLyBhcnJheS4gQ29tZXMgZnJvbSBhIGNvbXBpbGF0aW9uIGVycm9yIHdpdGggZ2NjLTMuNCBvciBnY2MtNCB3aXRoIC1hbnNpIC1wZWRhbnRpYy4KKy8vIEFub3RoZXIgc29sdXRpb24gd291bGQgYmUgdG8gZGVjbGFyZSB0aGUgYXJyYXkgbGlrZSB0aGlzOiBUIG1fZGF0YVtTaXplPT0wPzE6U2l6ZV07IGluIGVpX21hdHJpeF9zdG9yYWdlCisvLyBidXQgdGhpcyBpcyBwcm9iYWJseSBub3QgYmFkIHRvIHJhaXNlIHN1Y2ggYW4gZXJyb3IgYXQgY29tcGlsZSB0aW1lLi4uCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfUm93cywgaW50IF9Db2xzPiBzdHJ1Y3QgQ2hlY2tNaW5vcgoreworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgX1Jvd3MsIF9Db2xzPiBNYXRyaXhUeXBlOworICAgIENoZWNrTWlub3IoTWF0cml4VHlwZSYgbTEsIGludCByMSwgaW50IGMxKQorICAgIHsKKyAgICAgICAgaW50IHJvd3MgPSBtMS5yb3dzKCk7CisgICAgICAgIGludCBjb2xzID0gbTEuY29scygpOworCisgICAgICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IG1pID0gbTEubWlub3IoMCwwKS5ldmFsKCk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWksIG0xLmJsb2NrKDEsMSxyb3dzLTEsY29scy0xKSk7CisgICAgICAgIG1pID0gbTEubWlub3IocjEsYzEpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1pLnRyYW5zcG9zZSgpLCBtMS50cmFuc3Bvc2UoKS5taW5vcihjMSxyMSkpOworICAgICAgICAvL2NoZWNrIG9wZXJhdG9yKCksIGJvdGggY29uc3RhbnQgYW5kIG5vbi1jb25zdGFudCwgb24gbWlub3IoKQorICAgICAgICBtMS5taW5vcihyMSxjMSkoMCwwKSA9IG0xLm1pbm9yKDAsMCkoMCwwKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBDaGVja01pbm9yPFNjYWxhciwxLDE+Cit7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCAxPiBNYXRyaXhUeXBlOworICAgIENoZWNrTWlub3IoTWF0cml4VHlwZSYsIGludCwgaW50KSB7fQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzdWJtYXRyaWNlcyhjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIFJvdy5oIENvbHVtbi5oIEJsb2NrLmggTWlub3IuaCBEaWFnb25hbENvZWZmcy5oCisgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IFJvd1ZlY3RvclR5cGU7CisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtemVybyA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyksCisgICAgICAgICAgICAgb25lcyA9IE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scyksCisgICAgICAgICAgICAgaWRlbnRpdHkgPSBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OklkZW50aXR5KHJvd3MsIHJvd3MpLAorICAgICAgICAgICAgIHNxdWFyZSA9IE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6UmFuZG9tKHJvd3MsIHJvd3MpOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHYyID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHYzID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHZ6ZXJvID0gVmVjdG9yVHlwZTo6WmVybyhyb3dzKTsKKworICBTY2FsYXIgczEgPSBlaV9yYW5kb208U2NhbGFyPigpOworCisgIGludCByMSA9IGVpX3JhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgaW50IHIyID0gZWlfcmFuZG9tPGludD4ocjEscm93cy0xKTsKKyAgaW50IGMxID0gZWlfcmFuZG9tPGludD4oMCxjb2xzLTEpOworICBpbnQgYzIgPSBlaV9yYW5kb208aW50PihjMSxjb2xzLTEpOworCisgIC8vY2hlY2sgcm93KCkgYW5kIGNvbCgpCisgIFZFUklGWV9JU19BUFBST1gobTEuY29sKGMxKS50cmFuc3Bvc2UoKSwgbTEudHJhbnNwb3NlKCkucm93KGMxKSk7CisgIFZFUklGWV9JU19BUFBST1goc3F1YXJlLnJvdyhyMSkuZWlnZW4yX2RvdChtMS5jb2woYzEpKSwgKHNxdWFyZS5sYXp5KCkgKiBtMS5jb25qdWdhdGUoKSkocjEsYzEpKTsKKyAgLy9jaGVjayBvcGVyYXRvcigpLCBib3RoIGNvbnN0YW50IGFuZCBub24tY29uc3RhbnQsIG9uIHJvdygpIGFuZCBjb2woKQorICBtMS5yb3cocjEpICs9IHMxICogbTEucm93KHIyKTsKKyAgbTEuY29sKGMxKSArPSBzMSAqIG0xLmNvbChjMik7CisKKyAgLy9jaGVjayBibG9jaygpCisgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBiMSgxLDEpOyBiMSgwLDApID0gbTEocjEsYzEpOworICBSb3dWZWN0b3JUeXBlIGJyMShtMS5ibG9jayhyMSwwLDEsY29scykpOworICBWZWN0b3JUeXBlIGJjMShtMS5ibG9jaygwLGMxLHJvd3MsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKGIxLCBtMS5ibG9jayhyMSxjMSwxLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5yb3cocjEpLCBicjEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChjMSksIGJjMSk7CisgIC8vY2hlY2sgb3BlcmF0b3IoKSwgYm90aCBjb25zdGFudCBhbmQgbm9uLWNvbnN0YW50LCBvbiBibG9jaygpCisgIG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkgPSBzMSAqIG0yLmJsb2NrKDAsIDAsIHIyLXIxKzEsYzItYzErMSk7CisgIG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkocjItcjEsYzItYzEpID0gbTIuYmxvY2soMCwgMCwgcjItcjErMSxjMi1jMSsxKSgwLDApOworCisgIC8vY2hlY2sgbWlub3IoKQorICBDaGVja01pbm9yPFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBjaGVja21pbm9yKG0xLHIxLGMxKTsKKworICAvL2NoZWNrIGRpYWdvbmFsKCkKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5kaWFnb25hbCgpLCBtMS50cmFuc3Bvc2UoKS5kaWFnb25hbCgpKTsKKyAgbTIuZGlhZ29uYWwoKSA9IDIgKiBtMS5kaWFnb25hbCgpOworICBtMi5kaWFnb25hbCgpWzBdICo9IDM7CisgIFZFUklGWV9JU19BUFBST1gobTIuZGlhZ29uYWwoKVswXSwgc3RhdGljX2Nhc3Q8U2NhbGFyPig2KSAqIG0xLmRpYWdvbmFsKClbMF0pOworCisgIGVudW0geworICAgIEJsb2NrUm93cyA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwyKSwKKyAgICBCbG9ja0NvbHMgPSBFSUdFTl9TSVpFX01JTl9QUkVGRVJfRklYRUQoTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsNSkKKyAgfTsKKyAgaWYgKHJvd3M+PTUgJiYgY29scz49OCkKKyAgeworICAgIC8vIHRlc3QgZml4ZWQgYmxvY2soKSBhcyBsdmFsdWUKKyAgICBtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsQmxvY2tDb2xzPigxLDEpICo9IHMxOworICAgIC8vIHRlc3Qgb3BlcmF0b3IoKSBvbiBmaXhlZCBibG9jaygpIGJvdGggYXMgY29uc3RhbnQgYW5kIG5vbi1jb25zdGFudAorICAgIG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cyxCbG9ja0NvbHM+KDEsMSkoMCwgMykgPSBtMS50ZW1wbGF0ZSBibG9jazwyLDU+KDEsMSkoMSwyKTsKKyAgICAvLyBjaGVjayB0aGF0IGZpeGVkIGJsb2NrKCkgYW5kIGJsb2NrKCkgYWdyZWUKKyAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gYiA9IG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cyxCbG9ja0NvbHM+KDMsMyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChiLCBtMS5ibG9jaygzLDMsQmxvY2tSb3dzLEJsb2NrQ29scykpOworICB9CisKKyAgaWYgKHJvd3M+MikKKyAgeworICAgIC8vIHRlc3Qgc3ViIHZlY3RvcnMKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLnRlbXBsYXRlIHN0YXJ0PDI+KCksIHYxLmJsb2NrKDAsMCwyLDEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLnRlbXBsYXRlIHN0YXJ0PDI+KCksIHYxLnN0YXJ0KDIpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLnRlbXBsYXRlIHN0YXJ0PDI+KCksIHYxLnNlZ21lbnQoMCwyKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2MS50ZW1wbGF0ZSBzdGFydDwyPigpLCB2MS50ZW1wbGF0ZSBzZWdtZW50PDI+KDApKTsKKyAgICBpbnQgaSA9IHJvd3MtMjsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLnRlbXBsYXRlIGVuZDwyPigpLCB2MS5ibG9jayhpLDAsMiwxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2MS50ZW1wbGF0ZSBlbmQ8Mj4oKSwgdjEuZW5kKDIpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLnRlbXBsYXRlIGVuZDwyPigpLCB2MS5zZWdtZW50KGksMikpOworICAgIFZFUklGWV9JU19BUFBST1godjEudGVtcGxhdGUgZW5kPDI+KCksIHYxLnRlbXBsYXRlIHNlZ21lbnQ8Mj4oaSkpOworICAgIGkgPSBlaV9yYW5kb20oMCxyb3dzLTIpOworICAgIFZFUklGWV9JU19BUFBST1godjEuc2VnbWVudChpLDIpLCB2MS50ZW1wbGF0ZSBzZWdtZW50PDI+KGkpKTsKKyAgfQorCisgIC8vIHN0cmVzcyBzb21lIGJhc2ljIHN0dWZmcyB3aXRoIGJsb2NrIG1hdHJpY2VzCisgIFZFUklGWShlaV9yZWFsKG9uZXMuY29sKGMxKS5zdW0oKSkgPT0gUmVhbFNjYWxhcihyb3dzKSk7CisgIFZFUklGWShlaV9yZWFsKG9uZXMucm93KHIxKS5zdW0oKSkgPT0gUmVhbFNjYWxhcihjb2xzKSk7CisKKyAgVkVSSUZZKGVpX3JlYWwob25lcy5jb2woYzEpLmVpZ2VuMl9kb3Qob25lcy5jb2woYzIpKSkgPT0gUmVhbFNjYWxhcihyb3dzKSk7CisgIFZFUklGWShlaV9yZWFsKG9uZXMucm93KHIxKS5laWdlbjJfZG90KG9uZXMucm93KHIyKSkpID09IFJlYWxTY2FsYXIoY29scykpOworfQorCit2b2lkIHRlc3RfZWlnZW4yX3N1Ym1hdHJpY2VzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggc3VibWF0cmljZXMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBzdWJtYXRyaWNlcyhNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBzdWJtYXRyaWNlcyhNYXRyaXhYY2YoMywgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHN1Ym1hdHJpY2VzKE1hdHJpeFhpKDgsIDEyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggc3VibWF0cmljZXMoTWF0cml4WGNkKDIwLCAyMCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIHN1Ym1hdHJpY2VzKE1hdHJpeFhmKDIwLCAyMCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zdW0uY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX3N1bS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3MDU3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zdW0uY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIG1hdHJpeFN1bShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworCisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLnN1bSgpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scykuc3VtKCksIFNjYWxhcihmbG9hdChyb3dzKmNvbHMpKSk7IC8vIHRoZSBmbG9hdCgpIGhlcmUgdG8gc2h1dCB1cCBleGNlc3NpdmUgTVNWQyB3YXJuaW5nIGFib3V0IGludC0+Y29tcGxleCBjb252ZXJzaW9uIGJlaW5nIGxvc3N5CisgIFNjYWxhciB4ID0gU2NhbGFyKDApOworICBmb3IoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSBmb3IoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB4ICs9IG0xKGksaik7CisgIFZFUklGWV9JU19BUFBST1gobTEuc3VtKCksIHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIHZlY3RvclN1bShjb25zdCBWZWN0b3JUeXBlJiB3KQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGludCBzaXplID0gdy5zaXplKCk7CisKKyAgVmVjdG9yVHlwZSB2ID0gVmVjdG9yVHlwZTo6UmFuZG9tKHNpemUpOworICBmb3IoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorICB7CisgICAgU2NhbGFyIHMgPSBTY2FsYXIoMCk7CisgICAgZm9yKGludCBqID0gMDsgaiA8IGk7IGorKykgcyArPSB2W2pdOworICAgIFZFUklGWV9JU19BUFBST1gocywgdi5zdGFydChpKS5zdW0oKSk7CisgIH0KKworICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZS0xOyBpKyspCisgIHsKKyAgICBTY2FsYXIgcyA9IFNjYWxhcigwKTsKKyAgICBmb3IoaW50IGogPSBpOyBqIDwgc2l6ZTsgaisrKSBzICs9IHZbal07CisgICAgVkVSSUZZX0lTX0FQUFJPWChzLCB2LmVuZChzaXplLWkpLnN1bSgpKTsKKyAgfQorCisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplLzI7IGkrKykKKyAgeworICAgIFNjYWxhciBzID0gU2NhbGFyKDApOworICAgIGZvcihpbnQgaiA9IGk7IGogPCBzaXplLWk7IGorKykgcyArPSB2W2pdOworICAgIFZFUklGWV9JU19BUFBST1gocywgdi5zZWdtZW50KGksIHNpemUtMippKS5zdW0oKSk7CisgIH0KK30KKwordm9pZCB0ZXN0X2VpZ2VuMl9zdW0oKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBtYXRyaXhTdW0oTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXRyaXhTdW0oTWF0cml4MmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWF0cml4U3VtKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIG1hdHJpeFN1bShNYXRyaXhYY2YoMywgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1hdHJpeFN1bShNYXRyaXhYZig4LCAxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIG1hdHJpeFN1bShNYXRyaXhYaSg4LCAxMikpICk7CisgIH0KKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfNSggdmVjdG9yU3VtKFZlY3RvclhmKDUpKSApOworICAgIENBTExfU1VCVEVTVF83KCB2ZWN0b3JTdW0oVmVjdG9yWGQoMTApKSApOworICAgIENBTExfU1VCVEVTVF81KCB2ZWN0b3JTdW0oVmVjdG9yWGYoMzMpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfc3ZkLmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zdmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Njg5YTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfc3ZkLmNwcApAQCAtMCwwICsxLDg3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiBFaWdlbiBpdHNlbGYgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzdmQoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBTVkQuaAorICAqLworICBpbnQgcm93cyA9IG0ucm93cygpOworICBpbnQgY29scyA9IG0uY29scygpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IGIgPQorICAgIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPjo6UmFuZG9tKHJvd3MsMSk7CisgIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAxPiB4KGNvbHMsMSksIHgyKGNvbHMsMSk7CisKKyAgUmVhbFNjYWxhciBsYXJnZXJFcHMgPSB0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpOworICBpZiAoZWlfaXNfc2FtZV90eXBlPFJlYWxTY2FsYXIsZmxvYXQ+OjpyZXQpCisgICAgbGFyZ2VyRXBzID0gMWUtM2Y7CisKKyAgeworICAgIFNWRDxNYXRyaXhUeXBlPiBzdmQoYSk7CisgICAgTWF0cml4VHlwZSBzaWdtYSA9IE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKTsKKyAgICBNYXRyaXhUeXBlIG1hdFUgID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLHJvd3MpOworICAgIHNpZ21hLmJsb2NrKDAsMCxjb2xzLGNvbHMpID0gc3ZkLnNpbmd1bGFyVmFsdWVzKCkuYXNEaWFnb25hbCgpOworICAgIG1hdFUuYmxvY2soMCwwLHJvd3MsY29scykgPSBzdmQubWF0cml4VSgpOworICAgIFZFUklGWV9JU19BUFBST1goYSwgbWF0VSAqIHNpZ21hICogc3ZkLm1hdHJpeFYoKS50cmFuc3Bvc2UoKSk7CisgIH0KKworCisgIGlmIChyb3dzPT1jb2xzKQorICB7CisgICAgaWYgKGVpX2lzX3NhbWVfdHlwZTxSZWFsU2NhbGFyLGZsb2F0Pjo6cmV0KQorICAgIHsKKyAgICAgIE1hdHJpeFR5cGUgYTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgICAgIGEgKz0gYSAqIGEuYWRqb2ludCgpICsgYTEgKiBhMS5hZGpvaW50KCk7CisgICAgfQorICAgIFNWRDxNYXRyaXhUeXBlPiBzdmQoYSk7CisgICAgc3ZkLnNvbHZlKGIsICZ4KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGEgKiB4LGIpOworICB9CisKKworICBpZihyb3dzPT1jb2xzKQorICB7CisgICAgU1ZEPE1hdHJpeFR5cGU+IHN2ZChhKTsKKyAgICBNYXRyaXhUeXBlIHVuaXRhcnksIHBvc2l0aXZlOworICAgIHN2ZC5jb21wdXRlVW5pdGFyeVBvc2l0aXZlKCZ1bml0YXJ5LCAmcG9zaXRpdmUpOworICAgIFZFUklGWV9JU19BUFBST1godW5pdGFyeSAqIHVuaXRhcnkuYWRqb2ludCgpLCBNYXRyaXhUeXBlOjpJZGVudGl0eSh1bml0YXJ5LnJvd3MoKSx1bml0YXJ5LnJvd3MoKSkpOworICAgIFZFUklGWV9JU19BUFBST1gocG9zaXRpdmUsIHBvc2l0aXZlLmFkam9pbnQoKSk7CisgICAgZm9yKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgVkVSSUZZKHBvc2l0aXZlLmRpYWdvbmFsKClbaV0gPj0gMCk7IC8vIGNoZWFwIG5lY2Vzc2FyeSAobm90IHN1ZmZpY2llbnQpIGNvbmRpdGlvbiBmb3IgcG9zaXRpdml0eQorICAgIFZFUklGWV9JU19BUFBST1godW5pdGFyeSpwb3NpdGl2ZSwgYSk7CisKKyAgICBzdmQuY29tcHV0ZVBvc2l0aXZlVW5pdGFyeSgmcG9zaXRpdmUsICZ1bml0YXJ5KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHVuaXRhcnkgKiB1bml0YXJ5LmFkam9pbnQoKSwgTWF0cml4VHlwZTo6SWRlbnRpdHkodW5pdGFyeS5yb3dzKCksdW5pdGFyeS5yb3dzKCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHBvc2l0aXZlLCBwb3NpdGl2ZS5hZGpvaW50KCkpOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIFZFUklGWShwb3NpdGl2ZS5kaWFnb25hbCgpW2ldID49IDApOyAvLyBjaGVhcCBuZWNlc3NhcnkgKG5vdCBzdWZmaWNpZW50KSBjb25kaXRpb24gZm9yIHBvc2l0aXZpdHkKKyAgICBWRVJJRllfSVNfQVBQUk9YKHBvc2l0aXZlKnVuaXRhcnksIGEpOworICB9Cit9CisKK3ZvaWQgdGVzdF9laWdlbjJfc3ZkKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggc3ZkKE1hdHJpeDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHN2ZChNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBzdmQoTWF0cml4WGYoNyw3KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggc3ZkKE1hdHJpeFhkKDE0LDcpKSApOworICAgIC8vIGNvbXBsZXggYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKy8vICAgICBDQUxMX1NVQlRFU1QoIHN2ZChNYXRyaXhYY2QoNiw2KSkgKTsKKy8vICAgICBDQUxMX1NVQlRFU1QoIHN2ZChNYXRyaXhYY2YoMywzKSkgKTsKKyAgICBTVkQ8TWF0cml4WGY+IHM7CisgICAgTWF0cml4WGYgbSA9IE1hdHJpeFhmOjpSYW5kb20oMTAsMSk7CisgICAgcy5jb21wdXRlKG0pOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfc3dhcC5jcHAgYi90ZXN0L2VpZ2VuMi9laWdlbjJfc3dhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhODg0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl9zd2FwLmNwcApAQCAtMCwwICsxLDgzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fTk9fU1RBVElDX0FTU0VSVAorI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBvdGhlcl9tYXRyaXhfdHlwZQoreworICB0eXBlZGVmIGludCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucywgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+CitzdHJ1Y3Qgb3RoZXJfbWF0cml4X3R5cGU8TWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4gPgoreworICB0eXBlZGVmIE1hdHJpeDxfU2NhbGFyLCBfUm93cywgX0NvbHMsIF9PcHRpb25zXlJvd01ham9yLCBfTWF4Um93cywgX01heENvbHM+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHN3YXAoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBvdGhlcl9tYXRyaXhfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBPdGhlck1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBlaV9hc3NlcnQoKCFlaV9pc19zYW1lX3R5cGU8TWF0cml4VHlwZSxPdGhlck1hdHJpeFR5cGU+OjpyZXQpKTsKKyAgaW50IHJvd3MgPSBtLnJvd3MoKTsKKyAgaW50IGNvbHMgPSBtLmNvbHMoKTsKKyAgCisgIC8vIGNvbnN0cnVjdCAzIG1hdHJpeCBndWFyYW50ZWVkIHRvIGJlIGRpc3RpbmN0CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpICsgU2NhbGFyKDEwMCkgKiBNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLGNvbHMpOworICBPdGhlck1hdHJpeFR5cGUgbTMgPSBPdGhlck1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpICsgU2NhbGFyKDIwMCkgKiBPdGhlck1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsY29scyk7CisgIAorICBNYXRyaXhUeXBlIG0xX2NvcHkgPSBtMTsKKyAgTWF0cml4VHlwZSBtMl9jb3B5ID0gbTI7CisgIE90aGVyTWF0cml4VHlwZSBtM19jb3B5ID0gbTM7CisgIAorICAvLyB0ZXN0IHN3YXBwaW5nIDIgbWF0cmljZXMgb2Ygc2FtZSB0eXBlCisgIG0xLnN3YXAobTIpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLG0yX2NvcHkpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0xX2NvcHkpOworICBtMSA9IG0xX2NvcHk7CisgIG0yID0gbTJfY29weTsKKyAgCisgIC8vIHRlc3Qgc3dhcHBpbmcgMiBtYXRyaWNlcyBvZiBkaWZmZXJlbnQgdHlwZXMKKyAgbTEuc3dhcChtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTEsbTNfY29weSk7CisgIFZFUklGWV9JU19BUFBST1gobTMsbTFfY29weSk7CisgIG0xID0gbTFfY29weTsKKyAgbTMgPSBtM19jb3B5OworICAKKyAgLy8gdGVzdCBzd2FwcGluZyBtYXRyaXggd2l0aCBleHByZXNzaW9uCisgIG0xLnN3YXAobTIuYmxvY2soMCwwLHJvd3MsY29scykpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLG0yX2NvcHkpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0xX2NvcHkpOworICBtMSA9IG0xX2NvcHk7CisgIG0yID0gbTJfY29weTsKKworICAvLyB0ZXN0IHN3YXBwaW5nIHR3byBleHByZXNzaW9ucyBvZiBkaWZmZXJlbnQgdHlwZXMKKyAgbTEudHJhbnNwb3NlKCkuc3dhcChtMy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsbTNfY29weSk7CisgIFZFUklGWV9JU19BUFBST1gobTMsbTFfY29weSk7CisgIG0xID0gbTFfY29weTsKKyAgbTMgPSBtM19jb3B5OworICAKKyAgLy8gdGVzdCBhc3NlcnRpb24gb24gbWlzbWF0Y2hpbmcgc2l6ZSAtLSBtYXRyaXggY2FzZQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMS5zd2FwKG0xLnJvdygwKSkpOworICAvLyB0ZXN0IGFzc2VydGlvbiBvbiBtaXNtYXRjaGluZyBzaXplIC0tIHhwciBjYXNlCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLnJvdygwKS5zd2FwKG0xKSk7Cit9CisKK3ZvaWQgdGVzdF9laWdlbjJfc3dhcCgpCit7CisgIENBTExfU1VCVEVTVF8xKCBzd2FwKE1hdHJpeDNmKCkpICk7IC8vIGZpeGVkIHNpemUsIG5vIHZlY3Rvcml6YXRpb24gCisgIENBTExfU1VCVEVTVF8xKCBzd2FwKE1hdHJpeDRkKCkpICk7IC8vIGZpeGVkIHNpemUsIHBvc3NpYmxlIHZlY3Rvcml6YXRpb24gCisgIENBTExfU1VCVEVTVF8xKCBzd2FwKE1hdHJpeFhkKDMsMykpICk7IC8vIGR5biBzaXplLCBubyB2ZWN0b3JpemF0aW9uIAorICBDQUxMX1NVQlRFU1RfMSggc3dhcChNYXRyaXhYZigzMCwzMCkpICk7IC8vIGR5biBzaXplLCBwb3NzaWJsZSB2ZWN0b3JpemF0aW9uIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX3RyaWFuZ3VsYXIuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX3RyaWFuZ3VsYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDhjN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfdHJpYW5ndWxhci5jcHAKQEAgLTAsMCArMSwxNTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB0cmlhbmd1bGFyKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIFJlYWxTY2FsYXIgbGFyZ2VyRXBzID0gMTAqdGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKTsKKworICBpbnQgcm93cyA9IG0ucm93cygpOworICBpbnQgY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICAgbTMocm93cywgY29scyksCisgICAgICAgICAgICAgbTQocm93cywgY29scyksCisgICAgICAgICAgICAgcjEocm93cywgY29scyksCisgICAgICAgICAgICAgcjIocm93cywgY29scyksCisgICAgICAgICAgICAgbXplcm8gPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG1vbmVzID0gTWF0cml4VHlwZTo6T25lcyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBpZGVudGl0eSA9IE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6SWRlbnRpdHkocm93cywgcm93cyksCisgICAgICAgICAgICAgc3F1YXJlID0gTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpSYW5kb20ocm93cywgcm93cyk7CisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCisgICAgICAgICAgICAgdnplcm8gPSBWZWN0b3JUeXBlOjpaZXJvKHJvd3MpOworCisgIE1hdHJpeFR5cGUgbTF1cCA9IG0xLnRlbXBsYXRlIHBhcnQ8RWlnZW46OlVwcGVyVHJpYW5ndWxhcj4oKTsKKyAgTWF0cml4VHlwZSBtMnVwID0gbTIudGVtcGxhdGUgcGFydDxFaWdlbjo6VXBwZXJUcmlhbmd1bGFyPigpOworCisgIGlmIChyb3dzKmNvbHM+MSkKKyAgeworICAgIFZFUklGWShtMXVwLmlzVXBwZXJUcmlhbmd1bGFyKCkpOworICAgIFZFUklGWShtMnVwLnRyYW5zcG9zZSgpLmlzTG93ZXJUcmlhbmd1bGFyKCkpOworICAgIFZFUklGWSghbTIuaXNMb3dlclRyaWFuZ3VsYXIoKSk7CisgIH0KKworLy8gICBWRVJJRllfSVNfQVBQUk9YKG0xdXAudHJhbnNwb3NlKCkgKiBtMiwgbTEudXBwZXIoKS50cmFuc3Bvc2UoKS5sb3dlcigpICogbTIpOworCisgIC8vIHRlc3Qgb3ZlcmxvYWRlZCBvcGVyYXRvcis9CisgIHIxLnNldFplcm8oKTsKKyAgcjIuc2V0WmVybygpOworICByMS50ZW1wbGF0ZSBwYXJ0PEVpZ2VuOjpVcHBlclRyaWFuZ3VsYXI+KCkgKz0gIG0xOworICByMiArPSBtMXVwOworICBWRVJJRllfSVNfQVBQUk9YKHIxLHIyKTsKKworICAvLyB0ZXN0IG92ZXJsb2FkZWQgb3BlcmF0b3I9CisgIG0xLnNldFplcm8oKTsKKyAgbTEudGVtcGxhdGUgcGFydDxFaWdlbjo6VXBwZXJUcmlhbmd1bGFyPigpID0gKG0yLnRyYW5zcG9zZSgpICogbTIpLmxhenkoKTsKKyAgbTMgPSBtMi50cmFuc3Bvc2UoKSAqIG0yOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHBhcnQ8RWlnZW46Okxvd2VyVHJpYW5ndWxhcj4oKS50cmFuc3Bvc2UoKSwgbTEpOworCisgIC8vIHRlc3Qgb3ZlcmxvYWRlZCBvcGVyYXRvcj0KKyAgbTEuc2V0WmVybygpOworICBtMS50ZW1wbGF0ZSBwYXJ0PEVpZ2VuOjpMb3dlclRyaWFuZ3VsYXI+KCkgPSAobTIudHJhbnNwb3NlKCkgKiBtMikubGF6eSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHBhcnQ8RWlnZW46Okxvd2VyVHJpYW5ndWxhcj4oKSwgbTEpOworCisgIFZFUklGWV9JU19BUFBST1gobTMudGVtcGxhdGUgcGFydDxEaWFnb25hbD4oKSwgbTMuZGlhZ29uYWwoKS5hc0RpYWdvbmFsKCkpOworCisgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBmb3IgKGludCBpPTA7IGk8cm93czsgKytpKQorICAgIHdoaWxlIChlaV9hYnMyKG0xKGksaSkpPDFlLTMpIG0xKGksaSkgPSBlaV9yYW5kb208U2NhbGFyPigpOworCisgIFRyYW5zcG9zZTxNYXRyaXhUeXBlPiB0cm00KG00KTsKKyAgLy8gdGVzdCBiYWNrIGFuZCBmb3J3YXJkIHN1YnNpdHV0aW9uCisgIG0zID0gbTEudGVtcGxhdGUgcGFydDxFaWdlbjo6TG93ZXJUcmlhbmd1bGFyPigpOworICBWRVJJRlkobTMudGVtcGxhdGUgbWFya2VkPEVpZ2VuOjpMb3dlclRyaWFuZ3VsYXI+KCkuc29sdmVUcmlhbmd1bGFyKG0zKS5jd2lzZSgpLmFicygpLmlzSWRlbnRpdHkodGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKSkpOworICBWRVJJRlkobTMudHJhbnNwb3NlKCkudGVtcGxhdGUgbWFya2VkPEVpZ2VuOjpVcHBlclRyaWFuZ3VsYXI+KCkKKyAgICAuc29sdmVUcmlhbmd1bGFyKG0zLnRyYW5zcG9zZSgpKS5jd2lzZSgpLmFicygpLmlzSWRlbnRpdHkodGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKSkpOworICAvLyBjaGVjayBNICogaW52KEwpIHVzaW5nIGluIHBsYWNlIEFQSQorICBtNCA9IG0zOworICBtMy50cmFuc3Bvc2UoKS50ZW1wbGF0ZSBtYXJrZWQ8RWlnZW46OlVwcGVyVHJpYW5ndWxhcj4oKS5zb2x2ZVRyaWFuZ3VsYXJJblBsYWNlKHRybTQpOworICBWRVJJRlkobTQuY3dpc2UoKS5hYnMoKS5pc0lkZW50aXR5KHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkpKTsKKworICBtMyA9IG0xLnRlbXBsYXRlIHBhcnQ8RWlnZW46OlVwcGVyVHJpYW5ndWxhcj4oKTsKKyAgVkVSSUZZKG0zLnRlbXBsYXRlIG1hcmtlZDxFaWdlbjo6VXBwZXJUcmlhbmd1bGFyPigpLnNvbHZlVHJpYW5ndWxhcihtMykuY3dpc2UoKS5hYnMoKS5pc0lkZW50aXR5KHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkpKTsKKyAgVkVSSUZZKG0zLnRyYW5zcG9zZSgpLnRlbXBsYXRlIG1hcmtlZDxFaWdlbjo6TG93ZXJUcmlhbmd1bGFyPigpCisgICAgLnNvbHZlVHJpYW5ndWxhcihtMy50cmFuc3Bvc2UoKSkuY3dpc2UoKS5hYnMoKS5pc0lkZW50aXR5KHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkpKTsKKyAgLy8gY2hlY2sgTSAqIGludihVKSB1c2luZyBpbiBwbGFjZSBBUEkKKyAgbTQgPSBtMzsKKyAgbTMudHJhbnNwb3NlKCkudGVtcGxhdGUgbWFya2VkPEVpZ2VuOjpMb3dlclRyaWFuZ3VsYXI+KCkuc29sdmVUcmlhbmd1bGFySW5QbGFjZSh0cm00KTsKKyAgVkVSSUZZKG00LmN3aXNlKCkuYWJzKCkuaXNJZGVudGl0eSh0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpKSk7CisKKyAgbTMgPSBtMS50ZW1wbGF0ZSBwYXJ0PEVpZ2VuOjpVcHBlclRyaWFuZ3VsYXI+KCk7CisgIFZFUklGWShtMi5pc0FwcHJveChtMyAqIChtMy50ZW1wbGF0ZSBtYXJrZWQ8RWlnZW46OlVwcGVyVHJpYW5ndWxhcj4oKS5zb2x2ZVRyaWFuZ3VsYXIobTIpKSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgcGFydDxFaWdlbjo6TG93ZXJUcmlhbmd1bGFyPigpOworICBWRVJJRlkobTIuaXNBcHByb3gobTMgKiAobTMudGVtcGxhdGUgbWFya2VkPEVpZ2VuOjpMb3dlclRyaWFuZ3VsYXI+KCkuc29sdmVUcmlhbmd1bGFyKG0yKSksIGxhcmdlckVwcykpOworCisgIFZFUklGWSgobTEudGVtcGxhdGUgcGFydDxFaWdlbjo6VXBwZXJUcmlhbmd1bGFyPigpICogbTIudGVtcGxhdGUgcGFydDxFaWdlbjo6VXBwZXJUcmlhbmd1bGFyPigpKS5pc1VwcGVyVHJpYW5ndWxhcigpKTsKKworICAvLyB0ZXN0IHN3YXAKKyAgbTEuc2V0T25lcygpOworICBtMi5zZXRaZXJvKCk7CisgIG0yLnRlbXBsYXRlIHBhcnQ8RWlnZW46OlVwcGVyVHJpYW5ndWxhcj4oKS5zd2FwKG0xKTsKKyAgbTMuc2V0WmVybygpOworICBtMy50ZW1wbGF0ZSBwYXJ0PEVpZ2VuOjpVcHBlclRyaWFuZ3VsYXI+KCkuc2V0T25lcygpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0zKTsKKworfQorCit2b2lkIHNlbGZhZGpvaW50KCkKK3sKKyAgTWF0cml4MmkgbTsKKyAgbSA8PCAxLCAyLAorICAgICAgIDMsIDQ7CisKKyAgTWF0cml4MmkgbTEgPSBNYXRyaXgyaTo6WmVybygpOworICBtMS5wYXJ0PFNlbGZBZGpvaW50PigpID0gbTsKKyAgTWF0cml4MmkgcmVmMTsKKyAgcmVmMSA8PCAxLCAyLAorICAgICAgICAgIDIsIDQ7CisgIFZFUklGWShtMSA9PSByZWYxKTsKKyAgCisgIE1hdHJpeDJpIG0yID0gTWF0cml4Mmk6Olplcm8oKTsKKyAgbTIucGFydDxTZWxmQWRqb2ludD4oKSA9IG0ucGFydDxVcHBlclRyaWFuZ3VsYXI+KCk7CisgIE1hdHJpeDJpIHJlZjI7CisgIHJlZjIgPDwgMSwgMiwKKyAgICAgICAgICAyLCA0OworICBWRVJJRlkobTIgPT0gcmVmMik7CisgCisgIE1hdHJpeDJpIG0zID0gTWF0cml4Mmk6Olplcm8oKTsKKyAgbTMucGFydDxTZWxmQWRqb2ludD4oKSA9IG0ucGFydDxMb3dlclRyaWFuZ3VsYXI+KCk7CisgIE1hdHJpeDJpIHJlZjM7CisgIHJlZjMgPDwgMSwgMCwKKyAgICAgICAgICAwLCA0OworICBWRVJJRlkobTMgPT0gcmVmMyk7CisgIAorICAvLyBleGFtcGxlIGluc3BpcmVkIGZyb20gYnVnIDE1OQorICBpbnQgYXJyYXlbXSA9IHsxLCAyLCAzLCA0fTsKKyAgTWF0cml4Mmk6Ok1hcChhcnJheSkucGFydDxTZWxmQWRqb2ludD4oKSA9IE1hdHJpeDJpOjpSYW5kb20oKS5wYXJ0PExvd2VyVHJpYW5ndWxhcj4oKTsKKyAgCisgIHN0ZDo6Y291dCA8PCAiaGVsbG9cbiIgPDwgYXJyYXkgPDwgc3RkOjplbmRsOworfQorCit2b2lkIHRlc3RfZWlnZW4yX3RyaWFuZ3VsYXIoKQoreworICBDQUxMX1NVQlRFU1RfOCggc2VsZmFkam9pbnQoKSApOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgOyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggdHJpYW5ndWxhcihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHRyaWFuZ3VsYXIoTWF0cml4PGZsb2F0LCAyLCAyPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCB0cmlhbmd1bGFyKE1hdHJpeDNkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHRyaWFuZ3VsYXIoTWF0cml4WGNmKDQsIDQpKSApOworICAgIENBTExfU1VCVEVTVF81KCB0cmlhbmd1bGFyKE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LDgsIDg+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIHRyaWFuZ3VsYXIoTWF0cml4WGQoMTcsMTcpKSApOworICAgIENBTExfU1VCVEVTVF83KCB0cmlhbmd1bGFyKE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KDUsIDUpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9laWdlbjJfdW5hbGlnbmVkYXNzZXJ0LmNwcCBiL3Rlc3QvZWlnZW4yL2VpZ2VuMl91bmFsaWduZWRhc3NlcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMGI2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfdW5hbGlnbmVkYXNzZXJ0LmNwcApAQCAtMCwwICsxLDExNiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3N0cnVjdCBHb29kMQoreworICBNYXRyaXhYZCBtOyAvLyBnb29kOiBtIHdpbGwgYWxsb2NhdGUgaXRzIG93biBhcnJheSwgdGFraW5nIGNhcmUgb2YgYWxpZ25tZW50LgorICBHb29kMSgpIDogbSgyMCwyMCkge30KK307CisKK3N0cnVjdCBHb29kMgoreworICBNYXRyaXgzZCBtOyAvLyBnb29kOiBtJ3Mgc2l6ZSBpc24ndCBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLCBzbyBtIGRvZXNuJ3QgaGF2ZSB0byBiZSBhbGlnbmVkCit9OworCitzdHJ1Y3QgR29vZDMKK3sKKyAgVmVjdG9yMmYgbTsgLy8gZ29vZDogc2FtZSByZWFzb24KK307CisKK3N0cnVjdCBCYWQ0Cit7CisgIFZlY3RvcjJkIG07IC8vIGJhZDogc2l6ZW9mKG0pJTE2PT0wIHNvIGFsaWdubWVudCBpcyByZXF1aXJlZAorfTsKKworc3RydWN0IEJhZDUKK3sKKyAgTWF0cml4PGZsb2F0LCAyLCA2PiBtOyAvLyBiYWQ6IHNhbWUgcmVhc29uCit9OworCitzdHJ1Y3QgQmFkNgoreworICBNYXRyaXg8ZG91YmxlLCAzLCA0PiBtOyAvLyBiYWQ6IHNhbWUgcmVhc29uCit9OworCitzdHJ1Y3QgR29vZDcKK3sKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworICBWZWN0b3IyZCBtOworICBmbG9hdCBmOyAvLyBtYWtlIHRoZSBzdHJ1Y3QgaGF2ZSBzaXplb2YlMTYhPTAgdG8gbWFrZSBpdCBhIGxpdHRsZSBtb3JlIHRyaWNreSB3aGVuIHdlIGFsbG93IGFuIGFycmF5IG9mIDIgc3VjaCBvYmplY3RzCit9OworCitzdHJ1Y3QgR29vZDgKK3sKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVworICBmbG9hdCBmOyAvLyB0cnkgdGhlIGYgYXQgZmlyc3QgLS0gdGhlIEVJR0VOX0FMSUdOXzEyOCBhdHRyaWJ1dGUgb2YgbSBzaG91bGQgbWFrZSB0aGF0IHN0aWxsIHdvcmsKKyAgTWF0cml4NGYgbTsKK307CisKK3N0cnVjdCBHb29kOQoreworICBNYXRyaXg8ZmxvYXQsMiwyLERvbnRBbGlnbj4gbTsgLy8gZ29vZDogbm8gYWxpZ25tZW50IHJlcXVlc3RlZAorICBmbG9hdCBmOworfTsKKwordGVtcGxhdGU8Ym9vbCBBbGlnbj4gc3RydWN0IERlcGVuZHMKK3sKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRihBbGlnbikKKyAgVmVjdG9yMmQgbTsKKyAgZmxvYXQgZjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGNoZWNrX3VuYWxpZ25lZGFzc2VydF9nb29kKCkKK3sKKyAgVCAqeCwgKnk7CisgIHggPSBuZXcgVDsKKyAgZGVsZXRlIHg7CisgIHkgPSBuZXcgVFsyXTsKKyAgZGVsZXRlW10geTsKK30KKworI2lmIEVJR0VOX0FSQ0hfV0FOVFNfQUxJR05NRU5UCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBjaGVja191bmFsaWduZWRhc3NlcnRfYmFkKCkKK3sKKyAgZmxvYXQgYnVmW3NpemVvZihUKSsxNl07CisgIGZsb2F0ICp1bmFsaWduZWQgPSBidWY7CisgIHdoaWxlKChyZWludGVycHJldF9jYXN0PHN0ZDo6c2l6ZV90Pih1bmFsaWduZWQpJjB4Zik9PTApICsrdW5hbGlnbmVkOyAvLyBtYWtlIHN1cmUgdW5hbGlnbmVkIGlzIHJlYWxseSB1bmFsaWduZWQKKyAgVCAqeCA9IDo6bmV3KHN0YXRpY19jYXN0PHZvaWQqPih1bmFsaWduZWQpKSBUOworICB4LT5+VCgpOworfQorI2VuZGlmCisKK3ZvaWQgdW5hbGlnbmVkYXNzZXJ0KCkKK3sKKyAgY2hlY2tfdW5hbGlnbmVkYXNzZXJ0X2dvb2Q8R29vZDE+KCk7CisgIGNoZWNrX3VuYWxpZ25lZGFzc2VydF9nb29kPEdvb2QyPigpOworICBjaGVja191bmFsaWduZWRhc3NlcnRfZ29vZDxHb29kMz4oKTsKKyNpZiBFSUdFTl9BUkNIX1dBTlRTX0FMSUdOTUVOVAorICBWRVJJRllfUkFJU0VTX0FTU0VSVChjaGVja191bmFsaWduZWRhc3NlcnRfYmFkPEJhZDQ+KCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChjaGVja191bmFsaWduZWRhc3NlcnRfYmFkPEJhZDU+KCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChjaGVja191bmFsaWduZWRhc3NlcnRfYmFkPEJhZDY+KCkpOworI2VuZGlmCisKKyAgY2hlY2tfdW5hbGlnbmVkYXNzZXJ0X2dvb2Q8R29vZDc+KCk7CisgIGNoZWNrX3VuYWxpZ25lZGFzc2VydF9nb29kPEdvb2Q4PigpOworICBjaGVja191bmFsaWduZWRhc3NlcnRfZ29vZDxHb29kOT4oKTsKKyAgY2hlY2tfdW5hbGlnbmVkYXNzZXJ0X2dvb2Q8RGVwZW5kczx0cnVlPiA+KCk7CisKKyNpZiBFSUdFTl9BUkNIX1dBTlRTX0FMSUdOTUVOVAorICBWRVJJRllfUkFJU0VTX0FTU0VSVChjaGVja191bmFsaWduZWRhc3NlcnRfYmFkPERlcGVuZHM8ZmFsc2U+ID4oKSk7CisjZW5kaWYKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl91bmFsaWduZWRhc3NlcnQoKQoreworICBDQUxMX1NVQlRFU1QodW5hbGlnbmVkYXNzZXJ0KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvZWlnZW4yX3Zpc2l0b3IuY3BwIGIvdGVzdC9laWdlbjIvZWlnZW4yX3Zpc2l0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ODE5OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9laWdlbjJfdmlzaXRvci5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtYXRyaXhWaXNpdG9yKGNvbnN0IE1hdHJpeFR5cGUmIHApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBpbnQgcm93cyA9IHAucm93cygpOworICBpbnQgY29scyA9IHAuY29scygpOworCisgIC8vIGNvbnN0cnVjdCBhIHJhbmRvbSBtYXRyaXggd2hlcmUgYWxsIGNvZWZmaWNpZW50cyBhcmUgZGlmZmVyZW50CisgIE1hdHJpeFR5cGUgbTsKKyAgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IG0uc2l6ZSgpOyBpKyspCisgICAgZm9yKGludCBpMiA9IDA7IGkyIDwgaTsgaTIrKykKKyAgICAgIHdoaWxlKG0oaSkgPT0gbShpMikpIC8vIHllcywgPT0KKyAgICAgICAgbShpKSA9IGVpX3JhbmRvbTxTY2FsYXI+KCk7CisgIAorICBTY2FsYXIgbWluYyA9IFNjYWxhcigxMDAwKSwgbWF4YyA9IFNjYWxhcigtMTAwMCk7CisgIGludCBtaW5yb3c9MCxtaW5jb2w9MCxtYXhyb3c9MCxtYXhjb2w9MDsKKyAgZm9yKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykKKyAgZm9yKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykKKyAgeworICAgIGlmKG0oaSxqKSA8IG1pbmMpCisgICAgeworICAgICAgbWluYyA9IG0oaSxqKTsKKyAgICAgIG1pbnJvdyA9IGk7CisgICAgICBtaW5jb2wgPSBqOworICAgIH0KKyAgICBpZihtKGksaikgPiBtYXhjKQorICAgIHsKKyAgICAgIG1heGMgPSBtKGksaik7CisgICAgICBtYXhyb3cgPSBpOworICAgICAgbWF4Y29sID0gajsKKyAgICB9CisgIH0KKyAgaW50IGVpZ2VuX21pbnJvdywgZWlnZW5fbWluY29sLCBlaWdlbl9tYXhyb3csIGVpZ2VuX21heGNvbDsKKyAgU2NhbGFyIGVpZ2VuX21pbmMsIGVpZ2VuX21heGM7CisgIGVpZ2VuX21pbmMgPSBtLm1pbkNvZWZmKCZlaWdlbl9taW5yb3csJmVpZ2VuX21pbmNvbCk7CisgIGVpZ2VuX21heGMgPSBtLm1heENvZWZmKCZlaWdlbl9tYXhyb3csJmVpZ2VuX21heGNvbCk7CisgIFZFUklGWShtaW5yb3cgPT0gZWlnZW5fbWlucm93KTsKKyAgVkVSSUZZKG1heHJvdyA9PSBlaWdlbl9tYXhyb3cpOworICBWRVJJRlkobWluY29sID09IGVpZ2VuX21pbmNvbCk7CisgIFZFUklGWShtYXhjb2wgPT0gZWlnZW5fbWF4Y29sKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtaW5jLCBlaWdlbl9taW5jKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXhjLCBlaWdlbl9tYXhjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtaW5jLCBtLm1pbkNvZWZmKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1heGMsIG0ubWF4Q29lZmYoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgdmVjdG9yVmlzaXRvcihjb25zdCBWZWN0b3JUeXBlJiB3KQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgaW50IHNpemUgPSB3LnNpemUoKTsKKworICAvLyBjb25zdHJ1Y3QgYSByYW5kb20gdmVjdG9yIHdoZXJlIGFsbCBjb2VmZmljaWVudHMgYXJlIGRpZmZlcmVudAorICBWZWN0b3JUeXBlIHY7CisgIHYgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgZm9yKGludCBpMiA9IDA7IGkyIDwgaTsgaTIrKykKKyAgICAgIHdoaWxlKHYoaSkgPT0gdihpMikpIC8vIHllcywgPT0KKyAgICAgICAgdihpKSA9IGVpX3JhbmRvbTxTY2FsYXI+KCk7CisgIAorICBTY2FsYXIgbWluYyA9IFNjYWxhcigxMDAwKSwgbWF4YyA9IFNjYWxhcigtMTAwMCk7CisgIGludCBtaW5pZHg9MCxtYXhpZHg9MDsKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgeworICAgIGlmKHYoaSkgPCBtaW5jKQorICAgIHsKKyAgICAgIG1pbmMgPSB2KGkpOworICAgICAgbWluaWR4ID0gaTsKKyAgICB9CisgICAgaWYodihpKSA+IG1heGMpCisgICAgeworICAgICAgbWF4YyA9IHYoaSk7CisgICAgICBtYXhpZHggPSBpOworICAgIH0KKyAgfQorICBpbnQgZWlnZW5fbWluaWR4LCBlaWdlbl9tYXhpZHg7CisgIFNjYWxhciBlaWdlbl9taW5jLCBlaWdlbl9tYXhjOworICBlaWdlbl9taW5jID0gdi5taW5Db2VmZigmZWlnZW5fbWluaWR4KTsKKyAgZWlnZW5fbWF4YyA9IHYubWF4Q29lZmYoJmVpZ2VuX21heGlkeCk7CisgIFZFUklGWShtaW5pZHggPT0gZWlnZW5fbWluaWR4KTsKKyAgVkVSSUZZKG1heGlkeCA9PSBlaWdlbl9tYXhpZHgpOworICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIGVpZ2VuX21pbmMpOworICBWRVJJRllfSVNfQVBQUk9YKG1heGMsIGVpZ2VuX21heGMpOworICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIHYubWluQ29lZmYoKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF4Yywgdi5tYXhDb2VmZigpKTsKK30KKwordm9pZCB0ZXN0X2VpZ2VuMl92aXNpdG9yKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggbWF0cml4VmlzaXRvcihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hdHJpeFZpc2l0b3IoTWF0cml4MmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWF0cml4VmlzaXRvcihNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBtYXRyaXhWaXNpdG9yKE1hdHJpeFhkKDgsIDEyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbWF0cml4VmlzaXRvcihNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4oMjAsIDIwKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbWF0cml4VmlzaXRvcihNYXRyaXhYaSg4LCAxMikpICk7CisgIH0KKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfNyggdmVjdG9yVmlzaXRvcihWZWN0b3I0ZigpKSApOworICAgIENBTExfU1VCVEVTVF80KCB2ZWN0b3JWaXNpdG9yKFZlY3RvclhkKDEwKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggdmVjdG9yVmlzaXRvcihSb3dWZWN0b3JYZCgxMCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIHZlY3RvclZpc2l0b3IoVmVjdG9yWGYoMzMpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9nc2xfaGVscGVyLmggYi90ZXN0L2VpZ2VuMi9nc2xfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkODU0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL2dzbF9oZWxwZXIuaApAQCAtMCwwICsxLDE3NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9HU0xfSEVMUEVSCisjZGVmaW5lIEVJR0VOX0dTTF9IRUxQRVIKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKKyNpbmNsdWRlIDxnc2wvZ3NsX2JsYXMuaD4KKyNpbmNsdWRlIDxnc2wvZ3NsX211bHRpZml0Lmg+CisjaW5jbHVkZSA8Z3NsL2dzbF9laWdlbi5oPgorI2luY2x1ZGUgPGdzbC9nc2xfbGluYWxnLmg+CisjaW5jbHVkZSA8Z3NsL2dzbF9jb21wbGV4Lmg+CisjaW5jbHVkZSA8Z3NsL2dzbF9jb21wbGV4X21hdGguaD4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBib29sIElzQ29tcGxleCA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+IHN0cnVjdCBHc2xUcmFpdHMKK3sKKyAgdHlwZWRlZiBnc2xfbWF0cml4KiBNYXRyaXg7CisgIHR5cGVkZWYgZ3NsX3ZlY3RvciogVmVjdG9yOworICBzdGF0aWMgTWF0cml4IGNyZWF0ZU1hdHJpeChpbnQgcm93cywgaW50IGNvbHMpIHsgcmV0dXJuIGdzbF9tYXRyaXhfYWxsb2Mocm93cyxjb2xzKTsgfQorICBzdGF0aWMgVmVjdG9yIGNyZWF0ZVZlY3RvcihpbnQgc2l6ZSkgeyByZXR1cm4gZ3NsX3ZlY3Rvcl9hbGxvYyhzaXplKTsgfQorICBzdGF0aWMgdm9pZCBmcmVlKE1hdHJpeCYgbSkgeyBnc2xfbWF0cml4X2ZyZWUobSk7IG09MDsgfQorICBzdGF0aWMgdm9pZCBmcmVlKFZlY3RvciYgbSkgeyBnc2xfdmVjdG9yX2ZyZWUobSk7IG09MDsgfQorICBzdGF0aWMgdm9pZCBwcm9kKGNvbnN0IE1hdHJpeCYgbSwgY29uc3QgVmVjdG9yJiB2LCBWZWN0b3ImIHgpIHsgZ3NsX2JsYXNfZGdlbXYoQ2JsYXNOb1RyYW5zLDEsbSx2LDAseCk7IH0KKyAgc3RhdGljIHZvaWQgY2hvbGVza3koTWF0cml4JiBtKSB7IGdzbF9saW5hbGdfY2hvbGVza3lfZGVjb21wKG0pOyB9CisgIHN0YXRpYyB2b2lkIGNob2xlc2t5X3NvbHZlKGNvbnN0IE1hdHJpeCYgbSwgY29uc3QgVmVjdG9yJiBiLCBWZWN0b3ImIHgpIHsgZ3NsX2xpbmFsZ19jaG9sZXNreV9zb2x2ZShtLGIseCk7IH0KKyAgc3RhdGljIHZvaWQgZWlnZW5fc3ltbShjb25zdCBNYXRyaXgmIG0sIFZlY3RvciYgZXZhbCwgTWF0cml4JiBldmVjKQorICB7CisgICAgZ3NsX2VpZ2VuX3N5bW12X3dvcmtzcGFjZSAqIHcgPSBnc2xfZWlnZW5fc3ltbXZfYWxsb2MobS0+c2l6ZTEpOworICAgIE1hdHJpeCBhID0gY3JlYXRlTWF0cml4KG0tPnNpemUxLCBtLT5zaXplMik7CisgICAgZ3NsX21hdHJpeF9tZW1jcHkoYSwgbSk7CisgICAgZ3NsX2VpZ2VuX3N5bW12KGEsZXZhbCxldmVjLHcpOworICAgIGdzbF9laWdlbl9zeW1tdl9zb3J0KGV2YWwsIGV2ZWMsIEdTTF9FSUdFTl9TT1JUX1ZBTF9BU0MpOworICAgIGdzbF9laWdlbl9zeW1tdl9mcmVlKHcpOworICAgIGZyZWUoYSk7CisgIH0KKyAgc3RhdGljIHZvaWQgZWlnZW5fc3ltbV9nZW4oY29uc3QgTWF0cml4JiBtLCBjb25zdCBNYXRyaXgmIF9iLCBWZWN0b3ImIGV2YWwsIE1hdHJpeCYgZXZlYykKKyAgeworICAgIGdzbF9laWdlbl9nZW5zeW1tdl93b3Jrc3BhY2UgKiB3ID0gZ3NsX2VpZ2VuX2dlbnN5bW12X2FsbG9jKG0tPnNpemUxKTsKKyAgICBNYXRyaXggYSA9IGNyZWF0ZU1hdHJpeChtLT5zaXplMSwgbS0+c2l6ZTIpOworICAgIE1hdHJpeCBiID0gY3JlYXRlTWF0cml4KF9iLT5zaXplMSwgX2ItPnNpemUyKTsKKyAgICBnc2xfbWF0cml4X21lbWNweShhLCBtKTsKKyAgICBnc2xfbWF0cml4X21lbWNweShiLCBfYik7CisgICAgZ3NsX2VpZ2VuX2dlbnN5bW12KGEsYixldmFsLGV2ZWMsdyk7CisgICAgZ3NsX2VpZ2VuX3N5bW12X3NvcnQoZXZhbCwgZXZlYywgR1NMX0VJR0VOX1NPUlRfVkFMX0FTQyk7CisgICAgZ3NsX2VpZ2VuX2dlbnN5bW12X2ZyZWUodyk7CisgICAgZnJlZShhKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgR3NsVHJhaXRzPFNjYWxhcix0cnVlPgoreworICB0eXBlZGVmIGdzbF9tYXRyaXhfY29tcGxleCogTWF0cml4OworICB0eXBlZGVmIGdzbF92ZWN0b3JfY29tcGxleCogVmVjdG9yOworICBzdGF0aWMgTWF0cml4IGNyZWF0ZU1hdHJpeChpbnQgcm93cywgaW50IGNvbHMpIHsgcmV0dXJuIGdzbF9tYXRyaXhfY29tcGxleF9hbGxvYyhyb3dzLGNvbHMpOyB9CisgIHN0YXRpYyBWZWN0b3IgY3JlYXRlVmVjdG9yKGludCBzaXplKSB7IHJldHVybiBnc2xfdmVjdG9yX2NvbXBsZXhfYWxsb2Moc2l6ZSk7IH0KKyAgc3RhdGljIHZvaWQgZnJlZShNYXRyaXgmIG0pIHsgZ3NsX21hdHJpeF9jb21wbGV4X2ZyZWUobSk7IG09MDsgfQorICBzdGF0aWMgdm9pZCBmcmVlKFZlY3RvciYgbSkgeyBnc2xfdmVjdG9yX2NvbXBsZXhfZnJlZShtKTsgbT0wOyB9CisgIHN0YXRpYyB2b2lkIGNob2xlc2t5KE1hdHJpeCYgbSkgeyBnc2xfbGluYWxnX2NvbXBsZXhfY2hvbGVza3lfZGVjb21wKG0pOyB9CisgIHN0YXRpYyB2b2lkIGNob2xlc2t5X3NvbHZlKGNvbnN0IE1hdHJpeCYgbSwgY29uc3QgVmVjdG9yJiBiLCBWZWN0b3ImIHgpIHsgZ3NsX2xpbmFsZ19jb21wbGV4X2Nob2xlc2t5X3NvbHZlKG0sYix4KTsgfQorICBzdGF0aWMgdm9pZCBwcm9kKGNvbnN0IE1hdHJpeCYgbSwgY29uc3QgVmVjdG9yJiB2LCBWZWN0b3ImIHgpCisgIHsgZ3NsX2JsYXNfemdlbXYoQ2JsYXNOb1RyYW5zLGdzbF9jb21wbGV4X3JlY3QoMSwwKSxtLHYsZ3NsX2NvbXBsZXhfcmVjdCgwLDApLHgpOyB9CisgIHN0YXRpYyB2b2lkIGVpZ2VuX3N5bW0oY29uc3QgTWF0cml4JiBtLCBnc2xfdmVjdG9yKiAmZXZhbCwgTWF0cml4JiBldmVjKQorICB7CisgICAgZ3NsX2VpZ2VuX2hlcm12X3dvcmtzcGFjZSAqIHcgPSBnc2xfZWlnZW5faGVybXZfYWxsb2MobS0+c2l6ZTEpOworICAgIE1hdHJpeCBhID0gY3JlYXRlTWF0cml4KG0tPnNpemUxLCBtLT5zaXplMik7CisgICAgZ3NsX21hdHJpeF9jb21wbGV4X21lbWNweShhLCBtKTsKKyAgICBnc2xfZWlnZW5faGVybXYoYSxldmFsLGV2ZWMsdyk7CisgICAgZ3NsX2VpZ2VuX2hlcm12X3NvcnQoZXZhbCwgZXZlYywgR1NMX0VJR0VOX1NPUlRfVkFMX0FTQyk7CisgICAgZ3NsX2VpZ2VuX2hlcm12X2ZyZWUodyk7CisgICAgZnJlZShhKTsKKyAgfQorICBzdGF0aWMgdm9pZCBlaWdlbl9zeW1tX2dlbihjb25zdCBNYXRyaXgmIG0sIGNvbnN0IE1hdHJpeCYgX2IsIGdzbF92ZWN0b3IqICZldmFsLCBNYXRyaXgmIGV2ZWMpCisgIHsKKyAgICBnc2xfZWlnZW5fZ2VuaGVybXZfd29ya3NwYWNlICogdyA9IGdzbF9laWdlbl9nZW5oZXJtdl9hbGxvYyhtLT5zaXplMSk7CisgICAgTWF0cml4IGEgPSBjcmVhdGVNYXRyaXgobS0+c2l6ZTEsIG0tPnNpemUyKTsKKyAgICBNYXRyaXggYiA9IGNyZWF0ZU1hdHJpeChfYi0+c2l6ZTEsIF9iLT5zaXplMik7CisgICAgZ3NsX21hdHJpeF9jb21wbGV4X21lbWNweShhLCBtKTsKKyAgICBnc2xfbWF0cml4X2NvbXBsZXhfbWVtY3B5KGIsIF9iKTsKKyAgICBnc2xfZWlnZW5fZ2VuaGVybXYoYSxiLGV2YWwsZXZlYyx3KTsKKyAgICBnc2xfZWlnZW5faGVybXZfc29ydChldmFsLCBldmVjLCBHU0xfRUlHRU5fU09SVF9WQUxfQVNDKTsKKyAgICBnc2xfZWlnZW5fZ2VuaGVybXZfZnJlZSh3KTsKKyAgICBmcmVlKGEpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjb252ZXJ0KGNvbnN0IE1hdHJpeFR5cGUmIG0sIGdzbF9tYXRyaXgqICZyZXMpCit7CisvLyAgIGlmIChyZXMpCisvLyAgICAgZ3NsX21hdHJpeF9mcmVlKHJlcyk7CisgIHJlcyA9IGdzbF9tYXRyaXhfYWxsb2MobS5yb3dzKCksIG0uY29scygpKTsKKyAgZm9yIChpbnQgaT0wIDsgaTxtLnJvd3MoKSA7ICsraSkKKyAgICBmb3IgKGludCBqPTAgOyBqPG0uY29scygpOyArK2opCisgICAgICBnc2xfbWF0cml4X3NldChyZXMsIGksIGosIG0oaSxqKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNvbnZlcnQoY29uc3QgZ3NsX21hdHJpeCogbSwgTWF0cml4VHlwZSYgcmVzKQoreworICByZXMucmVzaXplKGludChtLT5zaXplMSksIGludChtLT5zaXplMikpOworICBmb3IgKGludCBpPTAgOyBpPHJlcy5yb3dzKCkgOyArK2kpCisgICAgZm9yIChpbnQgaj0wIDsgajxyZXMuY29scygpOyArK2opCisgICAgICByZXMoaSxqKSA9IGdzbF9tYXRyaXhfZ2V0KG0saSxqKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgY29udmVydChjb25zdCBWZWN0b3JUeXBlJiBtLCBnc2xfdmVjdG9yKiAmcmVzKQoreworICBpZiAocmVzKSBnc2xfdmVjdG9yX2ZyZWUocmVzKTsKKyAgcmVzID0gZ3NsX3ZlY3Rvcl9hbGxvYyhtLnNpemUoKSk7CisgIGZvciAoaW50IGk9MCA7IGk8bS5zaXplKCkgOyArK2kpCisgICAgICBnc2xfdmVjdG9yX3NldChyZXMsIGksIG1baV0pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCBjb252ZXJ0KGNvbnN0IGdzbF92ZWN0b3IqIG0sIFZlY3RvclR5cGUmIHJlcykKK3sKKyAgcmVzLnJlc2l6ZSAobS0+c2l6ZSk7CisgIGZvciAoaW50IGk9MCA7IGk8cmVzLnJvd3MoKSA7ICsraSkKKyAgICByZXNbaV0gPSBnc2xfdmVjdG9yX2dldChtLCBpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY29udmVydChjb25zdCBNYXRyaXhUeXBlJiBtLCBnc2xfbWF0cml4X2NvbXBsZXgqICZyZXMpCit7CisgIHJlcyA9IGdzbF9tYXRyaXhfY29tcGxleF9hbGxvYyhtLnJvd3MoKSwgbS5jb2xzKCkpOworICBmb3IgKGludCBpPTAgOyBpPG0ucm93cygpIDsgKytpKQorICAgIGZvciAoaW50IGo9MCA7IGo8bS5jb2xzKCk7ICsraikKKyAgICB7CisgICAgICBnc2xfbWF0cml4X2NvbXBsZXhfc2V0KHJlcywgaSwgaiwKKyAgICAgICAgZ3NsX2NvbXBsZXhfcmVjdChtKGksaikucmVhbCgpLCBtKGksaikuaW1hZygpKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjb252ZXJ0KGNvbnN0IGdzbF9tYXRyaXhfY29tcGxleCogbSwgTWF0cml4VHlwZSYgcmVzKQoreworICByZXMucmVzaXplKGludChtLT5zaXplMSksIGludChtLT5zaXplMikpOworICBmb3IgKGludCBpPTAgOyBpPHJlcy5yb3dzKCkgOyArK2kpCisgICAgZm9yIChpbnQgaj0wIDsgajxyZXMuY29scygpOyArK2opCisgICAgICByZXMoaSxqKSA9IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcigKKyAgICAgICAgR1NMX1JFQUwoZ3NsX21hdHJpeF9jb21wbGV4X2dldChtLGksaikpLAorICAgICAgICBHU0xfSU1BRyhnc2xfbWF0cml4X2NvbXBsZXhfZ2V0KG0saSxqKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCBjb252ZXJ0KGNvbnN0IFZlY3RvclR5cGUmIG0sIGdzbF92ZWN0b3JfY29tcGxleCogJnJlcykKK3sKKyAgcmVzID0gZ3NsX3ZlY3Rvcl9jb21wbGV4X2FsbG9jKG0uc2l6ZSgpKTsKKyAgZm9yIChpbnQgaT0wIDsgaTxtLnNpemUoKSA7ICsraSkKKyAgICAgIGdzbF92ZWN0b3JfY29tcGxleF9zZXQocmVzLCBpLCBnc2xfY29tcGxleF9yZWN0KG1baV0ucmVhbCgpLCBtW2ldLmltYWcoKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCBjb252ZXJ0KGNvbnN0IGdzbF92ZWN0b3JfY29tcGxleCogbSwgVmVjdG9yVHlwZSYgcmVzKQoreworICByZXMucmVzaXplKG0tPnNpemUpOworICBmb3IgKGludCBpPTAgOyBpPHJlcy5yb3dzKCkgOyArK2kpCisgICAgcmVzW2ldID0gdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyKAorICAgICAgICBHU0xfUkVBTChnc2xfdmVjdG9yX2NvbXBsZXhfZ2V0KG0sIGkpKSwKKyAgICAgICAgR1NMX0lNQUcoZ3NsX3ZlY3Rvcl9jb21wbGV4X2dldChtLCBpKSkpOworfQorCit9CisKKyNlbmRpZiAvLyBFSUdFTl9HU0xfSEVMUEVSCmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9tYWluLmggYi90ZXN0L2VpZ2VuMi9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyYmExOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL21haW4uaApAQCAtMCwwICsxLDM5OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWZuZGVmIEVJR0VOX1RFU1RfRlVOQworI2Vycm9yIEVJR0VOX1RFU1RfRlVOQyBtdXN0IGJlIGRlZmluZWQKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfUkVQRUFUIDEwCisKK25hbWVzcGFjZSBFaWdlbgoreworICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdfdGVzdF9zdGFjazsKKyAgc3RhdGljIGludCBnX3JlcGVhdDsKK30KKworI2RlZmluZSBFSV9QUF9NQUtFX1NUUklORzIoUykgI1MKKyNkZWZpbmUgRUlfUFBfTUFLRV9TVFJJTkcoUykgRUlfUFBfTUFLRV9TVFJJTkcyKFMpCisKKyNkZWZpbmUgRUlfUFBfQ0FUMihhLGIpIGEgIyMgYgorI2RlZmluZSBFSV9QUF9DQVQoYSxiKSBFSV9QUF9DQVQyKGEsYikKKworI2lmbmRlZiBFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcKKworICBuYW1lc3BhY2UgRWlnZW4KKyAgeworICAgIHN0YXRpYyBjb25zdCBib29sIHNob3VsZF9yYWlzZV9hbl9hc3NlcnQgPSBmYWxzZTsKKworICAgIC8vIFVzZWQgdG8gYXZvaWQgdG8gcmFpc2UgdHdvIGV4Y2VwdGlvbnMgYXQgYSB0aW1lIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgZXhjZXB0aW9uIGlzIG5vdCBwcm9wZXJseSBjYXVnaHQuCisgICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYSBzZWNvbmQgZXhjZXB0aW9ucyBpcyByYWlzZSBpbiBhIGRlc3RydWN0b3IuCisgICAgc3RhdGljIGJvb2wgbm9fbW9yZV9hc3NlcnQgPSBmYWxzZTsKKworICAgIHN0cnVjdCBlaWdlbl9hc3NlcnRfZXhjZXB0aW9uCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0X2V4Y2VwdGlvbih2b2lkKSB7fQorICAgICAgfmVpZ2VuX2Fzc2VydF9leGNlcHRpb24oKSB7IEVpZ2VuOjpub19tb3JlX2Fzc2VydCA9IGZhbHNlOyB9CisgICAgfTsKKyAgfQorCisgIC8vIElmIEVJR0VOX0RFQlVHX0FTU0VSVFMgaXMgZGVmaW5lZCBhbmQgaWYgbm8gYXNzZXJ0aW9uIGlzIHJhaXNlZCB3aGlsZQorICAvLyBvbmUgc2hvdWxkIGhhdmUgYmVlbiwgdGhlbiB0aGUgbGlzdCBvZiBleGNlY3V0ZWQgYXNzZXJ0aW9ucyBpcyBwcmludGVkIG91dC4KKyAgLy8KKyAgLy8gRUlHRU5fREVCVUdfQVNTRVJUUyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0IGFzIGl0CisgIC8vIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIHRoZSBjb21waWxhdGlvbiB0aW1lCisgIC8vIGFuZCBtaWdodCBldmVuIGludHJvZHVjZSBzaWRlIGVmZmVjdHMgdGhhdCB3b3VsZCBoaWRlCisgIC8vIHNvbWUgbWVtb3J5IGVycm9ycy4KKyAgI2lmZGVmIEVJR0VOX0RFQlVHX0FTU0VSVFMKKworICAgIG5hbWVzcGFjZSBFaWdlbgorICAgIHsKKyAgICAgIHN0YXRpYyBib29sIGVpX3B1c2hfYXNzZXJ0ID0gZmFsc2U7CisgICAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVpZ2VuX2Fzc2VydF9saXN0OworICAgIH0KKworICAgICNkZWZpbmUgZWlnZW5fYXNzZXJ0KGEpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiggKCEoYSkpICYmICghbm9fbW9yZV9hc3NlcnQpICkgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBFaWdlbjo6bm9fbW9yZV9hc3NlcnQgPSB0cnVlOyAgICAgICBcCisgICAgICAgIHRocm93IEVpZ2VuOjplaWdlbl9hc3NlcnRfZXhjZXB0aW9uKCk7IFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSBpZiAoRWlnZW46OmVpX3B1c2hfYXNzZXJ0KSAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWlnZW5fYXNzZXJ0X2xpc3QucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKEVJX1BQX01BS0VfU1RSSU5HKF9fRklMRV9fKSIgKCJFSV9QUF9NQUtFX1NUUklORyhfX0xJTkVfXykiKSA6ICIjYSkgKTsgXAorICAgICAgfQorCisgICAgI2RlZmluZSBWRVJJRllfUkFJU0VTX0FTU0VSVChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEVpZ2VuOjplaWdlbl9hc3NlcnRfbGlzdC5jbGVhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBFaWdlbjo6ZWlfcHVzaF9hc3NlcnQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEVpZ2VuOjplaV9wdXNoX2Fzc2VydCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIk9uZSBvZiB0aGUgZm9sbG93aW5nIGFzc2VydHMgc2hvdWxkIGhhdmUgYmVlbiByYWlzZWQ6XG4iOyBcCisgICAgICAgICAgZm9yICh1aW50IGFpPTAgOyBhaTxlaWdlbl9hc3NlcnRfbGlzdC5zaXplKCkgOyArK2FpKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICIgICIgPDwgZWlnZW5fYXNzZXJ0X2xpc3RbYWldIDw8ICJcbiI7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBWRVJJRlkoRWlnZW46OnNob3VsZF9yYWlzZV9hbl9hc3NlcnQgJiYgIyBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gY2F0Y2ggKEVpZ2VuOjplaWdlbl9hc3NlcnRfZXhjZXB0aW9uIGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEVpZ2VuOjplaV9wdXNoX2Fzc2VydCA9IGZhbHNlOyBWRVJJRlkodHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9CisKKyAgI2Vsc2UgLy8gRUlHRU5fREVCVUdfQVNTRVJUUworCisgICAgI3VuZGVmIGVpZ2VuX2Fzc2VydAorCisgICAgLy8gc2VlIGJ1ZyA4OS4gVGhlIGNvcHlfYm9vbCBoZXJlIGlzIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIGdjYyA8PSA0LjMKKyAgICAjZGVmaW5lIGVpZ2VuX2Fzc2VydChhKSBcCisgICAgICBpZiggKCFFaWdlbjo6aW50ZXJuYWw6OmNvcHlfYm9vbChhKSkgJiYgKCFub19tb3JlX2Fzc2VydCkgKQlcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gdHJ1ZTsgICAgICAgXAorICAgICAgICB0aHJvdyBFaWdlbjo6ZWlnZW5fYXNzZXJ0X2V4Y2VwdGlvbigpOyBcCisgICAgICB9CisKKyAgICAjZGVmaW5lIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdHJ5IHsgYTsgVkVSSUZZKEVpZ2VuOjpzaG91bGRfcmFpc2VfYW5fYXNzZXJ0ICYmICMgYSk7IH0gIFwKKyAgICAgICAgY2F0Y2ggKEVpZ2VuOjplaWdlbl9hc3NlcnRfZXhjZXB0aW9uIGUpIHsgVkVSSUZZKHRydWUpOyB9ICAgIFwKKyAgICAgIH0KKworICAjZW5kaWYgLy8gRUlHRU5fREVCVUdfQVNTRVJUUworCisgICNkZWZpbmUgRUlHRU5fVVNFX0NVU1RPTV9BU1NFUlQKKworI2Vsc2UgLy8gRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HCisKKyAgI2RlZmluZSBWRVJJRllfUkFJU0VTX0FTU0VSVChhKSB7fQorCisjZW5kaWYgLy8gRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HCisKKworI2RlZmluZSBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcKKyNkZWZpbmUgRUlHRU5fTklDRV9SQU5ET00KKyNpbmNsdWRlIDxFaWdlbi9BcnJheT4KKworCisjZGVmaW5lIFZFUklGWShhKSBkbyB7IGlmICghKGEpKSB7IFwKKyAgICBzdGQ6OmNlcnIgPDwgIlRlc3QgIiA8PCBnX3Rlc3Rfc3RhY2suYmFjaygpIDw8ICIgZmFpbGVkIGluICJFSV9QUF9NQUtFX1NUUklORyhfX0ZJTEVfXykgPDwgIiAoIiA8PCBFSV9QUF9NQUtFX1NUUklORyhfX0xJTkVfXykgPDwgIikiIFwKKyAgICAgIDw8IHN0ZDo6ZW5kbCA8PCAiICAgICIgPDwgRUlfUFBfTUFLRV9TVFJJTkcoYSkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsgXAorICAgIGFib3J0KCk7IFwKKyAgfSB9IHdoaWxlICgwKQorCisjZGVmaW5lIFZFUklGWV9JU19BUFBST1goYSwgYikgVkVSSUZZKHRlc3RfZWlfaXNBcHByb3goYSwgYikpCisjZGVmaW5lIFZFUklGWV9JU19OT1RfQVBQUk9YKGEsIGIpIFZFUklGWSghdGVzdF9laV9pc0FwcHJveChhLCBiKSkKKyNkZWZpbmUgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGEsIGIpIFZFUklGWSh0ZXN0X2VpX2lzTXVjaFNtYWxsZXJUaGFuKGEsIGIpKQorI2RlZmluZSBWRVJJRllfSVNfTk9UX01VQ0hfU01BTExFUl9USEFOKGEsIGIpIFZFUklGWSghdGVzdF9laV9pc011Y2hTbWFsbGVyVGhhbihhLCBiKSkKKyNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWF9PUl9MRVNTX1RIQU4oYSwgYikgVkVSSUZZKHRlc3RfZWlfaXNBcHByb3hPckxlc3NUaGFuKGEsIGIpKQorI2RlZmluZSBWRVJJRllfSVNfTk9UX0FQUFJPWF9PUl9MRVNTX1RIQU4oYSwgYikgVkVSSUZZKCF0ZXN0X2VpX2lzQXBwcm94T3JMZXNzVGhhbihhLCBiKSkKKworI2RlZmluZSBDQUxMX1NVQlRFU1QoRlVOQykgZG8geyBcCisgICAgZ190ZXN0X3N0YWNrLnB1c2hfYmFjayhFSV9QUF9NQUtFX1NUUklORyhGVU5DKSk7IFwKKyAgICBGVU5DOyBcCisgICAgZ190ZXN0X3N0YWNrLnBvcF9iYWNrKCk7IFwKKyAgfSB3aGlsZSAoMCkKKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCB0ZXN0X3ByZWNpc2lvbigpOwordGVtcGxhdGU8PiBpbmxpbmUgaW50IHRlc3RfcHJlY2lzaW9uPGludD4oKSB7IHJldHVybiAwOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBmbG9hdCB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKSB7IHJldHVybiAxZS0zZjsgfQordGVtcGxhdGU8PiBpbmxpbmUgZG91YmxlIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKSB7IHJldHVybiAxZS02OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBmbG9hdCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKTsgfQordGVtcGxhdGU8PiBpbmxpbmUgZG91YmxlIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxkb3VibGU+KCk7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGxvbmcgZG91YmxlIHRlc3RfcHJlY2lzaW9uPGxvbmcgZG91YmxlPigpIHsgcmV0dXJuIDFlLTY7IH0KKworaW5saW5lIGJvb2wgdGVzdF9laV9pc0FwcHJveChjb25zdCBpbnQmIGEsIGNvbnN0IGludCYgYikKK3sgcmV0dXJuIGVpX2lzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPGludD4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfZWlfaXNNdWNoU21hbGxlclRoYW4oY29uc3QgaW50JiBhLCBjb25zdCBpbnQmIGIpCit7IHJldHVybiBlaV9pc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxpbnQ+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2VpX2lzQXBwcm94T3JMZXNzVGhhbihjb25zdCBpbnQmIGEsIGNvbnN0IGludCYgYikKK3sgcmV0dXJuIGVpX2lzQXBwcm94T3JMZXNzVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxpbnQ+KCkpOyB9CisKK2lubGluZSBib29sIHRlc3RfZWlfaXNBcHByb3goY29uc3QgZmxvYXQmIGEsIGNvbnN0IGZsb2F0JiBiKQoreyByZXR1cm4gZWlfaXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248ZmxvYXQ+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2VpX2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IGZsb2F0JiBhLCBjb25zdCBmbG9hdCYgYikKK3sgcmV0dXJuIGVpX2lzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9laV9pc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgZmxvYXQmIGEsIGNvbnN0IGZsb2F0JiBiKQoreyByZXR1cm4gZWlfaXNBcHByb3hPckxlc3NUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpKTsgfQorCitpbmxpbmUgYm9vbCB0ZXN0X2VpX2lzQXBwcm94KGNvbnN0IGRvdWJsZSYgYSwgY29uc3QgZG91YmxlJiBiKQoreyByZXR1cm4gZWlfaXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248ZG91YmxlPigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9laV9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBkb3VibGUmIGEsIGNvbnN0IGRvdWJsZSYgYikKK3sgcmV0dXJuIGVpX2lzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfZWlfaXNBcHByb3hPckxlc3NUaGFuKGNvbnN0IGRvdWJsZSYgYSwgY29uc3QgZG91YmxlJiBiKQoreyByZXR1cm4gZWlfaXNBcHByb3hPckxlc3NUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKSk7IH0KKworaW5saW5lIGJvb2wgdGVzdF9laV9pc0FwcHJveChjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBiKQoreyByZXR1cm4gZWlfaXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2VpX2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4mIGIpCit7IHJldHVybiBlaV9pc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7IH0KKworaW5saW5lIGJvb2wgdGVzdF9laV9pc0FwcHJveChjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mIGIpCit7IHJldHVybiBlaV9pc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2VpX2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYikKK3sgcmV0dXJuIGVpX2lzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7IH0KKworaW5saW5lIGJvb2wgdGVzdF9laV9pc0FwcHJveChjb25zdCBsb25nIGRvdWJsZSYgYSwgY29uc3QgbG9uZyBkb3VibGUmIGIpCit7IHJldHVybiBlaV9pc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxsb25nIGRvdWJsZT4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfZWlfaXNNdWNoU21hbGxlclRoYW4oY29uc3QgbG9uZyBkb3VibGUmIGEsIGNvbnN0IGxvbmcgZG91YmxlJiBiKQoreyByZXR1cm4gZWlfaXNNdWNoU21hbGxlclRoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248bG9uZyBkb3VibGU+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2VpX2lzQXBwcm94T3JMZXNzVGhhbihjb25zdCBsb25nIGRvdWJsZSYgYSwgY29uc3QgbG9uZyBkb3VibGUmIGIpCit7IHJldHVybiBlaV9pc0FwcHJveE9yTGVzc1RoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248bG9uZyBkb3VibGU+KCkpOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFR5cGUxLCB0eXBlbmFtZSBUeXBlMj4KK2lubGluZSBib29sIHRlc3RfZWlfaXNBcHByb3goY29uc3QgVHlwZTEmIGEsIGNvbnN0IFR5cGUyJiBiKQoreworICByZXR1cm4gYS5pc0FwcHJveChiLCB0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBUeXBlMTo6U2NhbGFyPigpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgoraW5saW5lIGJvb2wgdGVzdF9laV9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZDI+JiBtMikKK3sKKyAgcmV0dXJuIG0xLmlzTXVjaFNtYWxsZXJUaGFuKG0yLCB0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBlaV90cmFpdHM8RGVyaXZlZDE+OjpTY2FsYXI+KCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGJvb2wgdGVzdF9laV9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+JiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgZWlfdHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsJiBzKQoreworICByZXR1cm4gbS5pc011Y2hTbWFsbGVyVGhhbihzLCB0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBlaV90cmFpdHM8RGVyaXZlZD46OlNjYWxhcj4oKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTxmbG9hdD4geyB0eXBlZGVmIGRvdWJsZSB0eXBlOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTxkb3VibGU+IHsgdHlwZWRlZiBmbG9hdCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEdldERpZmZlcmVudFR5cGU8c3RkOjpjb21wbGV4PFQ+ID4KK3sgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxUPjo6dHlwZT4gdHlwZTsgfTsKKworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgbWFpbiB0ZXN0IGZ1bmN0aW9uCit2b2lkIEVJX1BQX0NBVCh0ZXN0XyxFSUdFTl9URVNUX0ZVTkMpKCk7CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8xCisjZGVmaW5lIENBTExfU1VCVEVTVF8xKEZVTkMpIENBTExfU1VCVEVTVChGVU5DKQorI2Vsc2UKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzEoRlVOQykKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzIKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzIoRlVOQykgQ0FMTF9TVUJURVNUKEZVTkMpCisjZWxzZQorI2RlZmluZSBDQUxMX1NVQlRFU1RfMihGVU5DKQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMworI2RlZmluZSBDQUxMX1NVQlRFU1RfMyhGVU5DKSBDQUxMX1NVQlRFU1QoRlVOQykKKyNlbHNlCisjZGVmaW5lIENBTExfU1VCVEVTVF8zKEZVTkMpCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF80CisjZGVmaW5lIENBTExfU1VCVEVTVF80KEZVTkMpIENBTExfU1VCVEVTVChGVU5DKQorI2Vsc2UKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzQoRlVOQykKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzUKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzUoRlVOQykgQ0FMTF9TVUJURVNUKEZVTkMpCisjZWxzZQorI2RlZmluZSBDQUxMX1NVQlRFU1RfNShGVU5DKQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfNgorI2RlZmluZSBDQUxMX1NVQlRFU1RfNihGVU5DKSBDQUxMX1NVQlRFU1QoRlVOQykKKyNlbHNlCisjZGVmaW5lIENBTExfU1VCVEVTVF82KEZVTkMpCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF83CisjZGVmaW5lIENBTExfU1VCVEVTVF83KEZVTkMpIENBTExfU1VCVEVTVChGVU5DKQorI2Vsc2UKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzcoRlVOQykKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzgKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzgoRlVOQykgQ0FMTF9TVUJURVNUKEZVTkMpCisjZWxzZQorI2RlZmluZSBDQUxMX1NVQlRFU1RfOChGVU5DKQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfOQorI2RlZmluZSBDQUxMX1NVQlRFU1RfOShGVU5DKSBDQUxMX1NVQlRFU1QoRlVOQykKKyNlbHNlCisjZGVmaW5lIENBTExfU1VCVEVTVF85KEZVTkMpCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8xMAorI2RlZmluZSBDQUxMX1NVQlRFU1RfMTAoRlVOQykgQ0FMTF9TVUJURVNUKEZVTkMpCisjZWxzZQorI2RlZmluZSBDQUxMX1NVQlRFU1RfMTAoRlVOQykKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzExCisjZGVmaW5lIENBTExfU1VCVEVTVF8xMShGVU5DKSBDQUxMX1NVQlRFU1QoRlVOQykKKyNlbHNlCisjZGVmaW5lIENBTExfU1VCVEVTVF8xMShGVU5DKQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMTIKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzEyKEZVTkMpIENBTExfU1VCVEVTVChGVU5DKQorI2Vsc2UKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzEyKEZVTkMpCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8xMworI2RlZmluZSBDQUxMX1NVQlRFU1RfMTMoRlVOQykgQ0FMTF9TVUJURVNUKEZVTkMpCisjZWxzZQorI2RlZmluZSBDQUxMX1NVQlRFU1RfMTMoRlVOQykKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzE0CisjZGVmaW5lIENBTExfU1VCVEVTVF8xNChGVU5DKSBDQUxMX1NVQlRFU1QoRlVOQykKKyNlbHNlCisjZGVmaW5lIENBTExfU1VCVEVTVF8xNChGVU5DKQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMTUKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzE1KEZVTkMpIENBTExfU1VCVEVTVChGVU5DKQorI2Vsc2UKKyNkZWZpbmUgQ0FMTF9TVUJURVNUXzE1KEZVTkMpCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8xNgorI2RlZmluZSBDQUxMX1NVQlRFU1RfMTYoRlVOQykgQ0FMTF9TVUJURVNUKEZVTkMpCisjZWxzZQorI2RlZmluZSBDQUxMX1NVQlRFU1RfMTYoRlVOQykKKyNlbmRpZgorCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBib29sIGhhc19zZXRfcmVwZWF0ID0gZmFsc2U7CisgICAgYm9vbCBoYXNfc2V0X3NlZWQgPSBmYWxzZTsKKyAgICBib29sIG5lZWRfaGVscCA9IGZhbHNlOworICAgIHVuc2lnbmVkIGludCBzZWVkID0gMDsKKyAgICBpbnQgcmVwZWF0ID0gREVGQVVMVF9SRVBFQVQ7CisKKyAgICBmb3IoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgIGlmKGFyZ3ZbaV1bMF0gPT0gJ3InKQorICAgICAgeworICAgICAgICBpZihoYXNfc2V0X3JlcGVhdCkKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiQXJndW1lbnQgIiA8PCBhcmd2W2ldIDw8ICIgY29uZmxpY3Rpbmcgd2l0aCBhIGZvcm1lciBhcmd1bWVudCIgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJlcGVhdCA9IHN0ZDo6YXRvaShhcmd2W2ldKzEpOworICAgICAgICBoYXNfc2V0X3JlcGVhdCA9IHRydWU7CisgICAgICAgIGlmKHJlcGVhdCA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpjb3V0IDw8ICJJbnZhbGlkIFwncmVwZWF0XCcgdmFsdWUgIiA8PCBhcmd2W2ldKzEgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmKGFyZ3ZbaV1bMF0gPT0gJ3MnKQorICAgICAgeworICAgICAgICBpZihoYXNfc2V0X3NlZWQpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkFyZ3VtZW50ICIgPDwgYXJndltpXSA8PCAiIGNvbmZsaWN0aW5nIHdpdGggYSBmb3JtZXIgYXJndW1lbnQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBzZWVkID0gaW50KHN0ZDo6c3RydG91bChhcmd2W2ldKzEsIDAsIDEwKSk7CisgICAgICAgIGhhc19zZXRfc2VlZCA9IHRydWU7CisgICAgICAgIGJvb2wgb2sgPSBzZWVkIT0wOworICAgICAgICBpZighb2spCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkludmFsaWQgXCdzZWVkXCcgdmFsdWUgIiA8PCBhcmd2W2ldKzEgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG5lZWRfaGVscCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYobmVlZF9oZWxwKQorICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiVGhpcyB0ZXN0IGFwcGxpY2F0aW9uIHRha2VzIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgYXJndW1lbnRzOiIgPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICIgIHJOICAgICBSZXBlYXQgZWFjaCB0ZXN0IE4gdGltZXMgKGRlZmF1bHQ6ICIgPDwgREVGQVVMVF9SRVBFQVQgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICBzTiAgICAgVXNlIE4gYXMgc2VlZCBmb3IgcmFuZG9tIG51bWJlcnMgKGRlZmF1bHQ6IGJhc2VkIG9uIGN1cnJlbnQgdGltZSkiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKCFoYXNfc2V0X3NlZWQpIHNlZWQgPSAodW5zaWduZWQgaW50KSBzdGQ6OnRpbWUoTlVMTCk7CisgICAgaWYoIWhhc19zZXRfcmVwZWF0KSByZXBlYXQgPSBERUZBVUxUX1JFUEVBVDsKKworICAgIHN0ZDo6Y291dCA8PCAiSW5pdGlhbGl6aW5nIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHdpdGggc2VlZCAiIDw8IHNlZWQgPDwgc3RkOjplbmRsOworCXN0ZDo6c3JhbmQoc2VlZCk7CisgICAgc3RkOjpjb3V0IDw8ICJSZXBlYXRpbmcgZWFjaCB0ZXN0ICIgPDwgcmVwZWF0IDw8ICIgdGltZXMiIDw8IHN0ZDo6ZW5kbDsKKworICAgIEVpZ2VuOjpnX3JlcGVhdCA9IHJlcGVhdDsKKyAgICBFaWdlbjo6Z190ZXN0X3N0YWNrLnB1c2hfYmFjayhFSV9QUF9NQUtFX1NUUklORyhFSUdFTl9URVNUX0ZVTkMpKTsKKworICAgIEVJX1BQX0NBVCh0ZXN0XyxFSUdFTl9URVNUX0ZVTkMpKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworCmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMi9wcm9kdWN0LmggYi90ZXN0L2VpZ2VuMi9wcm9kdWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5NjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZWlnZW4yL3Byb2R1Y3QuaApAQCAtMCwwICsxLDEzMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gRWlnZW4gaXRzZWxmIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0LgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9BcnJheT4KKyNpbmNsdWRlIDxFaWdlbi9RUj4KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgorYm9vbCBhcmVOb3RBcHByb3goY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMT4mIG0xLCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQyPiYgbTIsIHR5cGVuYW1lIERlcml2ZWQxOjpSZWFsU2NhbGFyIGVwc2lsb24gPSBwcmVjaXNpb248dHlwZW5hbWUgRGVyaXZlZDE6OlJlYWxTY2FsYXI+KCkpCit7CisgIHJldHVybiAhKChtMS1tMikuY3dpc2UoKS5hYnMyKCkubWF4Q29lZmYoKSA8IGVwc2lsb24gKiBlcHNpbG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjptYXgobTEuY3dpc2UoKS5hYnMyKCkubWF4Q29lZmYoKSwgbTIuY3dpc2UoKS5hYnMyKCkubWF4Q29lZmYoKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHByb2R1Y3QoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBJZGVudGl0eS5oIFByb2R1Y3QuaAorICAqLworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6RmxvYXRpbmdQb2ludCBGbG9hdGluZ1BvaW50OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBSb3dWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAxPiBDb2xWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gUm93U3F1YXJlTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IENvbFNxdWFyZU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6Ok9wdGlvbnNeUm93TWFqb3I+IE90aGVyTWFqb3JNYXRyaXhUeXBlOworCisgIGludCByb3dzID0gbS5yb3dzKCk7CisgIGludCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKTsKKyAgUm93U3F1YXJlTWF0cml4VHlwZQorICAgICAgICAgICAgIGlkZW50aXR5ID0gUm93U3F1YXJlTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgcm93cyksCisgICAgICAgICAgICAgc3F1YXJlID0gUm93U3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpLAorICAgICAgICAgICAgIHJlcyA9IFJvd1NxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgQ29sU3F1YXJlTWF0cml4VHlwZQorICAgICAgICAgICAgIHNxdWFyZTIgPSBDb2xTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20oY29scywgY29scyksCisgICAgICAgICAgICAgcmVzMiA9IENvbFNxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShjb2xzLCBjb2xzKTsKKyAgUm93VmVjdG9yVHlwZSB2MSA9IFJvd1ZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKKyAgICAgICAgICAgICB2MiA9IFJvd1ZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKKyAgICAgICAgICAgICB2emVybyA9IFJvd1ZlY3RvclR5cGU6Olplcm8ocm93cyk7CisgIENvbFZlY3RvclR5cGUgdmMyID0gQ29sVmVjdG9yVHlwZTo6UmFuZG9tKGNvbHMpLCB2Y3Jlcyhjb2xzKTsKKyAgT3RoZXJNYWpvck1hdHJpeFR5cGUgdG0xID0gbTE7CisKKyAgU2NhbGFyIHMxID0gZWlfcmFuZG9tPFNjYWxhcj4oKTsKKworICBpbnQgciA9IGVpX3JhbmRvbTxpbnQ+KDAsIHJvd3MtMSksCisgICAgICBjID0gZWlfcmFuZG9tPGludD4oMCwgY29scy0xKTsKKworICAvLyBiZWdpbiB0ZXN0aW5nIFByb2R1Y3QuaDogb25seSBhc3NvY2lhdGl2aXR5IGZvciBub3cKKyAgLy8gKHdlIHVzZSBUcmFuc3Bvc2UuaCBidXQgdGhpcyBkb2Vzbid0IGNvdW50IGFzIGEgdGVzdCBmb3IgaXQpCisKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEqbTEudHJhbnNwb3NlKCkpKm0yLCAgbTEqKG0xLnRyYW5zcG9zZSgpKm0yKSk7CisgIG0zID0gbTE7CisgIG0zICo9IG0xLnRyYW5zcG9zZSgpICogbTI7CisgIFZFUklGWV9JU19BUFBST1gobTMsICAgICAgICAgICAgICAgICAgICAgIG0xICogKG0xLnRyYW5zcG9zZSgpKm0yKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMsICAgICAgICAgICAgICAgICAgICAgIG0xLmxhenkoKSAqIChtMS50cmFuc3Bvc2UoKSptMikpOworCisgIC8vIGNvbnRpbnVlIHRlc3RpbmcgUHJvZHVjdC5oOiBkaXN0cmlidXRpdml0eQorICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZSoobTEgKyBtMiksICAgICAgICBzcXVhcmUqbTErc3F1YXJlKm0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUqKG0xIC0gbTIpLCAgICAgICAgc3F1YXJlKm0xLXNxdWFyZSptMik7CisKKyAgLy8gY29udGludWUgdGVzdGluZyBQcm9kdWN0Lmg6IGNvbXBhdGliaWxpdHkgd2l0aCBTY2FsYXJNdWx0aXBsZS5oCisgIFZFUklGWV9JU19BUFBST1goczEqKHNxdWFyZSptMSksICAgICAgICAgIChzMSpzcXVhcmUpKm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzMSooc3F1YXJlKm0xKSwgICAgICAgICAgc3F1YXJlKihtMSpzMSkpOworCisgIC8vIGFnYWluLCB0ZXN0IG9wZXJhdG9yKCkgdG8gY2hlY2sgY29uc3QtcXVhbGlmaWNhdGlvbgorICBzMSArPSAoc3F1YXJlLmxhenkoKSAqIG0xKShyLGMpOworCisgIC8vIHRlc3QgUHJvZHVjdC5oIHRvZ2V0aGVyIHdpdGggSWRlbnRpdHkuaAorICBWRVJJRllfSVNfQVBQUk9YKHYxLCAgICAgICAgICAgICAgICAgICAgICBpZGVudGl0eSp2MSk7CisgIFZFUklGWV9JU19BUFBST1godjEudHJhbnNwb3NlKCksICAgICAgICAgIHYxLnRyYW5zcG9zZSgpICogaWRlbnRpdHkpOworICAvLyBhZ2FpbiwgdGVzdCBvcGVyYXRvcigpIHRvIGNoZWNrIGNvbnN0LXF1YWxpZmljYXRpb24KKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCBjb2xzKShyLGMpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KHI9PWMpKTsKKworICBpZiAocm93cyE9Y29scykKKyAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTMgPSBtMSptMSk7CisKKyAgLy8gdGVzdCB0aGUgcHJldmlvdXMgdGVzdHMgd2VyZSBub3Qgc2NyZXdlZCB1cCBiZWNhdXNlIG9wZXJhdG9yKiByZXR1cm5zIDAKKyAgLy8gKHdlIHVzZSB0aGUgbW9yZSBhY2N1cmF0ZSBkZWZhdWx0IGVwc2lsb24pCisgIGlmIChOdW1UcmFpdHM8U2NhbGFyPjo6SGFzRmxvYXRpbmdQb2ludCAmJiBzdGQ6Om1pbihyb3dzLGNvbHMpPjEpCisgIHsKKyAgICBWRVJJRlkoYXJlTm90QXBwcm94KG0xLnRyYW5zcG9zZSgpKm0yLG0yLnRyYW5zcG9zZSgpKm0xKSk7CisgIH0KKworICAvLyB0ZXN0IG9wdGltaXplZCBvcGVyYXRvcis9IHBhdGgKKyAgcmVzID0gc3F1YXJlOworICByZXMgKz0gKG0xICogbTIudHJhbnNwb3NlKCkpLmxhenkoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIHNxdWFyZSArIG0xICogbTIudHJhbnNwb3NlKCkpOworICBpZiAoTnVtVHJhaXRzPFNjYWxhcj46Okhhc0Zsb2F0aW5nUG9pbnQgJiYgc3RkOjptaW4ocm93cyxjb2xzKT4xKQorICB7CisgICAgVkVSSUZZKGFyZU5vdEFwcHJveChyZXMsc3F1YXJlICsgbTIgKiBtMS50cmFuc3Bvc2UoKSkpOworICB9CisgIHZjcmVzID0gdmMyOworICB2Y3JlcyArPSAobTEudHJhbnNwb3NlKCkgKiB2MSkubGF6eSgpOworICBWRVJJRllfSVNfQVBQUk9YKHZjcmVzLCB2YzIgKyBtMS50cmFuc3Bvc2UoKSAqIHYxKTsKKyAgdG0xID0gbTE7CisgIFZFUklGWV9JU19BUFBST1godG0xLnRyYW5zcG9zZSgpICogdjEsIG0xLnRyYW5zcG9zZSgpICogdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLnRyYW5zcG9zZSgpICogdG0xLCB2MS50cmFuc3Bvc2UoKSAqIG0xKTsKKworICAvLyB0ZXN0IHN1Ym1hdHJpeCBhbmQgbWF0cml4L3ZlY3RvciBwcm9kdWN0CisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCisgICAgcmVzLnJvdyhpKSA9IG0xLnJvdyhpKSAqIG0yLnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgbTEgKiBtMi50cmFuc3Bvc2UoKSk7CisgIC8vIHRoZSBvdGhlciB3YXkgcm91bmQ6CisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCisgICAgcmVzLmNvbChpKSA9IG0xICogbTIudHJhbnNwb3NlKCkuY29sKGkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgbTEgKiBtMi50cmFuc3Bvc2UoKSk7CisKKyAgcmVzMiA9IHNxdWFyZTI7CisgIHJlczIgKz0gKG0xLnRyYW5zcG9zZSgpICogbTIpLmxhenkoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMyLCBzcXVhcmUyICsgbTEudHJhbnNwb3NlKCkgKiBtMik7CisKKyAgaWYgKE51bVRyYWl0czxTY2FsYXI+OjpIYXNGbG9hdGluZ1BvaW50ICYmIHN0ZDo6bWluKHJvd3MsY29scyk+MSkKKyAgeworICAgIFZFUklGWShhcmVOb3RBcHByb3gocmVzMixzcXVhcmUyICsgbTIudHJhbnNwb3NlKCkgKiBtMSkpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL3J1bnRlc3Quc2ggYi90ZXN0L2VpZ2VuMi9ydW50ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjNjkzYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2VuMi9ydW50ZXN0LnNoCkBAIC0wLDAgKzEsMjggQEAKKyMhL2Jpbi9iYXNoCisKK2JsYWNrPSdcRVszMG0nCityZWQ9J1xFWzMxbScKK2dyZWVuPSdcRVszMm0nCit5ZWxsb3c9J1xFWzMzbScKK2JsdWU9J1xFWzM0bScKK21hZ2VudGE9J1xFWzM1bScKK2N5YW49J1xFWzM2bScKK3doaXRlPSdcRVszN20nCisKK2lmIG1ha2UgdGVzdF8kMSA+IC9kZXYvbnVsbCAgMj4gLnJ1bnRlc3QubG9nIDsgdGhlbgorICBpZiAhIC4vdGVzdF8kMSByMjAgPiAvZGV2L251bGwgMj4gLnJ1bnRlc3QubG9nIDsgdGhlbgorICAgIGVjaG8gLWUgICRyZWQgVGVzdCAkMSBmYWlsZWQ6ICRibGFjaworICAgIGVjaG8gLWUgJGJsdWUKKyAgICBjYXQgLnJ1bnRlc3QubG9nCisgICAgZWNobyAtZSAkYmxhY2sKKyAgICBleGl0IDEKKyAgZWxzZQorICBlY2hvIC1lICRncmVlbiBUZXN0ICQxIHBhc3NlZCRibGFjaworICBmaQorZWxzZQorICBlY2hvIC1lICAkcmVkIEJ1aWxkIG9mIHRhcmdldCAkMSBmYWlsZWQ6ICRibGFjaworICBlY2hvIC1lICRibHVlCisgIGNhdCAucnVudGVzdC5sb2cKKyAgZWNobyAtZSAkYmxhY2sKKyAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvdGVzdC9laWdlbjIvc3BhcnNlLmggYi90ZXN0L2VpZ2VuMi9zcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTJmODk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvc3BhcnNlLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuIEVpZ2VuIGl0c2VsZiBpcyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggRGFuaWVsIEdvbWV6IEZlcnJvIDxkZ29tZXpmZXJyb0BnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1RFU1RTUEFSU0VfSAorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaWYgRUlHRU5fR05VQ19BVF9MRUFTVCg0LDApICYmICFkZWZpbmVkIF9fSUNDCisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9tYXA+CisjZGVmaW5lIEVJR0VOX1VOT1JERVJFRF9NQVBfU1VQUE9SVAorbmFtZXNwYWNlIHN0ZCB7CisgIHVzaW5nIHN0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwOworfQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9HT09HTEVIQVNIX1NVUFBPUlQKKyAgI2luY2x1ZGUgPGdvb2dsZS9zcGFyc2VfaGFzaF9tYXA+CisjZW5kaWYKKworI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KKworZW51bSB7CisgIEZvcmNlTm9uWmVyb0RpYWcgPSAxLAorICBNYWtlTG93ZXJUcmlhbmd1bGFyID0gMiwKKyAgTWFrZVVwcGVyVHJpYW5ndWxhciA9IDQsCisgIEZvcmNlUmVhbERpYWcgPSA4Cit9OworCisvKiBJbml0aWFsaXplcyBib3RoIGEgc3BhcnNlIGFuZCBkZW5zZSBtYXRyaXggd2l0aCBzYW1lIHJhbmRvbSB2YWx1ZXMsCisgKiBhbmQgYSByYXRpbyBvZiBcYSBkZW5zaXR5IG5vbiB6ZXJvIGVudHJpZXMuCisgKiBccGFyYW0gZmxhZ3MgaXMgYSB1bmlvbiBvZiBGb3JjZU5vblplcm9EaWFnLCBNYWtlTG93ZXJUcmlhbmd1bGFyIGFuZCBNYWtlVXBwZXJUcmlhbmd1bGFyCisgKiAgICAgICAgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgc2hhcGUgb2YgdGhlIG1hdHJpeC4KKyAqIFxwYXJhbSB6ZXJvQ29vcmRzIGFuZCBub256ZXJvQ29vcmRzIGFsbG93cyB0byBnZXQgdGhlIGNvb3JkaW5hdGUgbGlzdHMgb2YgdGhlIG5vbiB6ZXJvLAorICogICAgICAgIGFuZCB6ZXJvIGNvZWZmaWNpZW50cyByZXNwZWN0aXZlbHkuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZAoraW5pdFNwYXJzZShkb3VibGUgZGVuc2l0eSwKKyAgICAgICAgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+JiByZWZNYXQsCisgICAgICAgICAgIFNwYXJzZU1hdHJpeDxTY2FsYXI+JiBzcGFyc2VNYXQsCisgICAgICAgICAgIGludCBmbGFncyA9IDAsCisgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiogemVyb0Nvb3JkcyA9IDAsCisgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiogbm9uemVyb0Nvb3JkcyA9IDApCit7CisgIHNwYXJzZU1hdC5zdGFydEZpbGwoaW50KHJlZk1hdC5yb3dzKCkqcmVmTWF0LmNvbHMoKSpkZW5zaXR5KSk7CisgIGZvcihpbnQgaj0wOyBqPHJlZk1hdC5jb2xzKCk7IGorKykKKyAgeworICAgIGZvcihpbnQgaT0wOyBpPHJlZk1hdC5yb3dzKCk7IGkrKykKKyAgICB7CisgICAgICBTY2FsYXIgdiA9IChlaV9yYW5kb208ZG91YmxlPigwLDEpIDwgZGVuc2l0eSkgPyBlaV9yYW5kb208U2NhbGFyPigpIDogU2NhbGFyKDApOworICAgICAgaWYgKChmbGFncyZGb3JjZU5vblplcm9EaWFnKSAmJiAoaT09aikpCisgICAgICB7CisgICAgICAgIHYgPSBlaV9yYW5kb208U2NhbGFyPigpKlNjYWxhcigzLik7CisgICAgICAgIHYgPSB2KnYgKyBTY2FsYXIoNS4pOworICAgICAgfQorICAgICAgaWYgKChmbGFncyAmIE1ha2VMb3dlclRyaWFuZ3VsYXIpICYmIGo+aSkKKyAgICAgICAgdiA9IFNjYWxhcigwKTsKKyAgICAgIGVsc2UgaWYgKChmbGFncyAmIE1ha2VVcHBlclRyaWFuZ3VsYXIpICYmIGo8aSkKKyAgICAgICAgdiA9IFNjYWxhcigwKTsKKyAgICAgIAorICAgICAgaWYgKChmbGFncyZGb3JjZVJlYWxEaWFnKSAmJiAoaT09aikpCisgICAgICAgIHYgPSBlaV9yZWFsKHYpOworICAgICAgICAKKyAgICAgIGlmICh2IT1TY2FsYXIoMCkpCisgICAgICB7CisgICAgICAgIHNwYXJzZU1hdC5maWxsKGksaikgPSB2OworICAgICAgICBpZiAobm9uemVyb0Nvb3JkcykKKyAgICAgICAgICBub256ZXJvQ29vcmRzLT5wdXNoX2JhY2soVmVjdG9yMmkoaSxqKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICh6ZXJvQ29vcmRzKQorICAgICAgeworICAgICAgICB6ZXJvQ29vcmRzLT5wdXNoX2JhY2soVmVjdG9yMmkoaSxqKSk7CisgICAgICB9CisgICAgICByZWZNYXQoaSxqKSA9IHY7CisgICAgfQorICB9CisgIHNwYXJzZU1hdC5lbmRGaWxsKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZAoraW5pdFNwYXJzZShkb3VibGUgZGVuc2l0eSwKKyAgICAgICAgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+JiByZWZNYXQsCisgICAgICAgICAgIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyPiYgc3BhcnNlTWF0LAorICAgICAgICAgICBpbnQgZmxhZ3MgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4qIHplcm9Db29yZHMgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4qIG5vbnplcm9Db29yZHMgPSAwKQoreworICBzcGFyc2VNYXQuc3RhcnRGaWxsKGludChyZWZNYXQucm93cygpKnJlZk1hdC5jb2xzKCkqZGVuc2l0eSkpOworICBmb3IoaW50IGo9MDsgajxyZWZNYXQuY29scygpOyBqKyspCisgIHsKKyAgICBmb3IoaW50IGk9MDsgaTxyZWZNYXQucm93cygpOyBpKyspCisgICAgeworICAgICAgU2NhbGFyIHYgPSAoZWlfcmFuZG9tPGRvdWJsZT4oMCwxKSA8IGRlbnNpdHkpID8gZWlfcmFuZG9tPFNjYWxhcj4oKSA6IFNjYWxhcigwKTsKKyAgICAgIGlmICgoZmxhZ3MmRm9yY2VOb25aZXJvRGlhZykgJiYgKGk9PWopKQorICAgICAgeworICAgICAgICB2ID0gZWlfcmFuZG9tPFNjYWxhcj4oKSpTY2FsYXIoMy4pOworICAgICAgICB2ID0gdip2ICsgU2NhbGFyKDUuKTsKKyAgICAgIH0KKyAgICAgIGlmICgoZmxhZ3MgJiBNYWtlTG93ZXJUcmlhbmd1bGFyKSAmJiBqPmkpCisgICAgICAgIHYgPSBTY2FsYXIoMCk7CisgICAgICBlbHNlIGlmICgoZmxhZ3MgJiBNYWtlVXBwZXJUcmlhbmd1bGFyKSAmJiBqPGkpCisgICAgICAgIHYgPSBTY2FsYXIoMCk7CisgICAgICAKKyAgICAgIGlmICgoZmxhZ3MmRm9yY2VSZWFsRGlhZykgJiYgKGk9PWopKQorICAgICAgICB2ID0gZWlfcmVhbCh2KTsKKyAgICAgICAgCisgICAgICBpZiAodiE9U2NhbGFyKDApKQorICAgICAgeworICAgICAgICBzcGFyc2VNYXQuZmlsbChpLGopID0gdjsKKyAgICAgICAgaWYgKG5vbnplcm9Db29yZHMpCisgICAgICAgICAgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKFZlY3RvcjJpKGksaikpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoemVyb0Nvb3JkcykKKyAgICAgIHsKKyAgICAgICAgemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKFZlY3RvcjJpKGksaikpOworICAgICAgfQorICAgICAgcmVmTWF0KGksaikgPSB2OworICAgIH0KKyAgfQorICBzcGFyc2VNYXQuZW5kRmlsbCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQKK2luaXRTcGFyc2UoZG91YmxlIGRlbnNpdHksCisgICAgICAgICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiYgcmVmVmVjLAorICAgICAgICAgICBTcGFyc2VWZWN0b3I8U2NhbGFyPiYgc3BhcnNlVmVjLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiB6ZXJvQ29vcmRzID0gMCwKKyAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50Piogbm9uemVyb0Nvb3JkcyA9IDApCit7CisgIHNwYXJzZVZlYy5yZXNlcnZlKGludChyZWZWZWMuc2l6ZSgpKmRlbnNpdHkpKTsKKyAgc3BhcnNlVmVjLnNldFplcm8oKTsKKyAgZm9yKGludCBpPTA7IGk8cmVmVmVjLnNpemUoKTsgaSsrKQorICB7CisgICAgU2NhbGFyIHYgPSAoZWlfcmFuZG9tPGRvdWJsZT4oMCwxKSA8IGRlbnNpdHkpID8gZWlfcmFuZG9tPFNjYWxhcj4oKSA6IFNjYWxhcigwKTsKKyAgICBpZiAodiE9U2NhbGFyKDApKQorICAgIHsKKyAgICAgIHNwYXJzZVZlYy5maWxsKGkpID0gdjsKKyAgICAgIGlmIChub256ZXJvQ29vcmRzKQorICAgICAgICBub256ZXJvQ29vcmRzLT5wdXNoX2JhY2soaSk7CisgICAgfQorICAgIGVsc2UgaWYgKHplcm9Db29yZHMpCisgICAgICAgIHplcm9Db29yZHMtPnB1c2hfYmFjayhpKTsKKyAgICByZWZWZWNbaV0gPSB2OworICB9Cit9CisKKyNlbmRpZiAvLyBFSUdFTl9URVNUU1BBUlNFX0gKZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW4yL3Rlc3RzdWl0ZS5jbWFrZSBiL3Rlc3QvZWlnZW4yL3Rlc3RzdWl0ZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmI2YmZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjIvdGVzdHN1aXRlLmNtYWtlCkBAIC0wLDAgKzEsMTk3IEBACisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFVzYWdlOgorIyAgLSBjcmVhdGUgYSBuZXcgZm9sZGVyLCBsZXQncyBjYWxsIGl0IGNkYXNoCisjICAtIGluIHRoYXQgZm9sZGVyLCBkbzoKKyMgICAgY3Rlc3QgLVMgcGF0aC90by9laWdlbjIvdGVzdC90ZXN0c3VpdGUuY21ha2VbLG9wdGlvbjE9dmFsdWUxWyxvcHRpb24yPXZhbHVlMl1dCisjCisjIE9wdGlvbnM6CisjICAtIEVJR0VOX0NYWDogY29tcGlsZXIsIGVnLjogZysrLTQuMgorIyAgICAgIGRlZmF1bHQ6IGRlZmF1bHQgYysrIGNvbXBpbGVyCisjICAtIEVJR0VOX1NJVEU6IGVnLCBJTlJJQS1CZHhfcGMtZ2FlbCwgb3IgdGhlIG5hbWUgb2YgdGhlIGNvbnRyaWJ1dG9yLCBldGMuCisjICAgICAgZGVmYXVsdDogaG9zdG5hbWUKKyMgIC0gRUlHRU5fQlVJTERfU1RSSU5HOiBhIHN0cmluZyB3aGljaCBpZGVudGlmeSB0aGUgc3lzdGVtL2NvbXBpbGVyLiBJdCBzaG91bGQgYmUgZm9ybWVkIGxpa2UgdGhhdDoKKyMgICAgICAgIDxPU19uYW1lPi08T1NfdmVyc2lvbj4tPGFyY2g+LTxjb21waWxlci12ZXJzaW9uPgorIyAgICAgIHdpdGg6CisjICAgICAgICA8T1NfbmFtZT4gPSBvcGVuc3VzZSwgZGViaWFuLCBvc3gsIHdpbmRvd3MsIGN5Z3dpbiwgZnJlZWJzZCwgc29sYXJpcywgZXRjLgorIyAgICAgICAgPE9TX3ZlcnNpb24+ID0gMTEuMSwgWFAsIHZpc3RhLCBsZW9wYXJkLCBldGMuCisjICAgICAgICA8YXJjaD4gPSBpMzg2LCB4ODZfNjQsIGlhNjQsIHBvd2VycGMsIGV0Yy4KKyMgICAgICAgIDxjb21waWxlci12ZXJzaW9uPiA9IGdjYy00LjMuMiwgaWNjLTExLjAsIE1TVkMtMjAwOCwgZXRjLgorIyAgLSBFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OOiBub3ZlYywgU1NFMiwgQWx0aXZlYworIyAgICAgICBkZWZhdWx0OiBTU0UyIGZvciB4ODZfNjQgc3lzdGVtcywgbm92ZWMgb3RoZXJ3aXNlCisjICAgICAgIEl0cyB2YWx1ZSBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIEVJR0VOX0JVSUxEX1NUUklORworIyAgLSBFSUdFTl9DTUFLRV9ESVI6IHBhdGggdG8gY21ha2UgZXhlY3V0YWJsZQorIyAgLSBFSUdFTl9NT0RFOiBkYXNoYm9hcmQgbW9kZWwsIGNhbiBiZSBFeHBlcmltZW50YWwsIE5pZ2h0bHksIG9yIENvbnRpbnVvdXMKKyMgICAgICBkZWZhdWx0OiBOaWdodGx5CisjICAtIEVJR0VOX1dPUktfRElSOiBkaXJlY3RvcnkgdXNlZCB0byBkb3dubG9hZCB0aGUgc291cmNlIGZpbGVzIGFuZCBtYWtlIHRoZSBidWlsZHMKKyMgICAgICBkZWZhdWx0OiBmb2xkZXIgd2hpY2ggY29udGFpbnMgdGhpcyBzY3JpcHQKKyMgIC0gRUlHRU5fQ01BS0VfQVJHUzogYWRkaXRpb25hbCBhcmd1bWVudHMgcGFzc2VkIHRvIGNtYWtlCisjICAtIENURVNUX1NPVVJDRV9ESVJFQ1RPUlk6IHBhdGggdG8gZWlnZW4ncyBzcmMgKHVzZSBhIG5ldyBhbmQgZW1wdHkgZm9sZGVyLCBub3QgdGhlIG9uZSB5b3UgYXJlIHdvcmtpbmcgb24pCisjICAgICAgZGVmYXVsdDogPEVJR0VOX1dPUktfRElSPi9zcmMKKyMgIC0gQ1RFU1RfQklOQVJZX0RJUkVDVE9SWTogYnVpbGQgZGlyZWN0b3J5CisjICAgICAgZGVmYXVsdDogPEVJR0VOX1dPUktfRElSPi9uaWdodGx5LTxFSUdFTl9DWFg+CisjCisjIEhlcmUgaXMgYW4gZXhhbXBsZSBydW5uaW5nIHNldmVyYWwgY29tcGlsZXJzIG9uIGEgbGludXggc3lzdGVtOgorIyAjIS9iaW4vYmFzaAorIyBBUkNIPWB1bmFtZSAtbWAKKyMgU0lURT1gaG9zdG5hbWVgCisjIFZFUlNJT049b3BlbnN1c2UtMTEuMQorIyBXT1JLX0RJUj0vaG9tZS9nYWVsL0NvZGluZy9laWdlbjIvY2Rhc2gKKyMgIyBnZXQgdGhlIGxhc3QgdmVyc2lvbiBvZiB0aGUgc2NyaXB0CisjIHdnZXQgaHR0cDovL2JpdGJ1Y2tldC5vcmcvZWlnZW4vZWlnZW4vcmF3L3RpcC90ZXN0L3Rlc3RzdWl0ZS5jbWFrZSAtbyAkV09SS19ESVIvdGVzdHN1aXRlLmNtYWtlCisjIENPTU1PTj0iY3Rlc3QgLVMgJFdPUktfRElSL3Rlc3RzdWl0ZS5jbWFrZSxFSUdFTl9XT1JLX0RJUj0kV09SS19ESVIsRUlHRU5fU0lURT0kU0lURSxFSUdFTl9NT0RFPSQxLEVJR0VOX0JVSUxEX1NUUklORz0kT1NfVkVSU0lPTi0kQVJDSCIKKyMgJENPTU1PTi1nY2MtMy40LjYsRUlHRU5fQ1hYPWcrKy0zLjQKKyMgJENPTU1PTi1nY2MtNC4wLjEsRUlHRU5fQ1hYPWcrKy00LjAuMQorIyAkQ09NTU9OLWdjYy00LjMuMixFSUdFTl9DWFg9ZysrLTQuMyxFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OPW5vdmVjCisjICRDT01NT04tZ2NjLTQuMy4yLEVJR0VOX0NYWD1nKystNC4zLEVJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT049U1NFMgorIyAkQ09NTU9OLWljYy0xMS4wLEVJR0VOX0NYWD1pY3BjCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHByb2Nlc3MgdGhlIGFyZ3VtZW50cworCitzZXQoQVJHTElTVCAke0NURVNUX1NDUklQVF9BUkd9KQord2hpbGUoJHtBUkdMSVNUfSBNQVRDSEVTICAiLisuKiIpCisKKyAgIyBwaWNrIGZpcnN0CisgIHN0cmluZyhSRUdFWCBNQVRDSCAiKFteLF0qKSgsLiopPyIgRFVNTVkgJHtBUkdMSVNUfSkKKyAgU0VUKFRPUCAke0NNQUtFX01BVENIXzF9KQorCisgICMgcmVtb3ZlIGZpcnN0CisgIHN0cmluZyhSRUdFWCBNQVRDSEFMTCAiW14sXSosKC4qKSIgRFVNTVkgJHtBUkdMSVNUfSkKKyAgU0VUKEFSR0xJU1QgJHtDTUFLRV9NQVRDSF8xfSkKKworICAjIGRlY29tcG9zZSBhcyBhIHBhaXIga2V5PXZhbHVlCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiKFtePV0qKSg9LiopPyIgRFVNTVkgJHtUT1B9KQorICBTRVQoS0VZICR7Q01BS0VfTUFUQ0hfMX0pCisKKyAgc3RyaW5nKFJFR0VYIE1BVENIICJbXj1dKj0oLiopIiBEVU1NWSAke1RPUH0pCisgIFNFVChWQUxVRSAke0NNQUtFX01BVENIXzF9KQorCisgICMgc2V0IHRoZSB2YXJpYWJsZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlCisgIGlmKFZBTFVFKQorICAgIFNFVCgke0tFWX0gJHtWQUxVRX0pCisgIGVsc2UoVkFMVUUpCisgICAgU0VUKCR7S0VZfSBPTikKKyAgZW5kaWYoVkFMVUUpCisKK2VuZHdoaWxlKCR7QVJHTElTVH0gTUFUQ0hFUyAiLisuKiIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEF1dG9tYXRpY2FsbHkgc2V0IHNvbWUgdXNlciB2YXJpYWJsZXMgaWYgdGhleSBoYXZlIG5vdCBiZWVuIGRlZmluZWQgbWFudWFsbHkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42IEZBVEFMX0VSUk9SKQorCitpZihOT1QgRUlHRU5fU0lURSkKKyAgc2l0ZV9uYW1lKEVJR0VOX1NJVEUpCitlbmRpZihOT1QgRUlHRU5fU0lURSkKKworaWYoTk9UIEVJR0VOX0NNQUtFX0RJUikKKyAgU0VUKEVJR0VOX0NNQUtFX0RJUiAiIikKK2VuZGlmKE5PVCBFSUdFTl9DTUFLRV9ESVIpCisKK2lmKE5PVCBFSUdFTl9CVUlMRF9TVFJJTkcpCisKKyAgIyBsZXQncyB0cnkgdG8gZmluZCBhbGwgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBtYWtlIHRoZSBidWlsZCBzdHJpbmcgb3Vyc2VsZgorCisgICMgT1MKKyAgYnVpbGRfbmFtZShFSUdFTl9PU19WRVJTSU9OKQorCisgICMgYXJjaAorICBzZXQoRUlHRU5fQVJDSCAke0NNQUtFX1NZU1RFTV9QUk9DRVNTT1J9KQorICBpZihXSU4zMikKKyAgICBzZXQoRUlHRU5fQVJDSCAkRU5We1BST0NFU1NPUl9BUkNISVRFQ1RVUkV9KQorICBlbHNlKFdJTjMyKQorICAgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EIHVuYW1lIC1tIE9VVFBVVF9WQVJJQUJMRSBFSUdFTl9BUkNIIE9VVFBVVF9TVFJJUF9UUkFJTElOR19XSElURVNQQUNFKQorICBlbmRpZihXSU4zMikKKworICBzZXQoRUlHRU5fQlVJTERfU1RSSU5HICR7RUlHRU5fT1NfVkVSU0lPTn0ke0VJR0VOX0FSQ0h9LSR7RUlHRU5fQ1hYfSkKKworZW5kaWYoTk9UIEVJR0VOX0JVSUxEX1NUUklORykKKworaWYoREVGSU5FRCBFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OKQorICBzZXQoRUlHRU5fQlVJTERfU1RSSU5HICR7RUlHRU5fQlVJTERfU1RSSU5HfS0ke0VJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT059KQorZW5kaWYoREVGSU5FRCBFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OKQorCitpZihOT1QgRUlHRU5fV09SS19ESVIpCisgIHNldChFSUdFTl9XT1JLX0RJUiAke0NURVNUX1NDUklQVF9ESVJFQ1RPUll9KQorZW5kaWYoTk9UIEVJR0VOX1dPUktfRElSKQorCitpZihOT1QgQ1RFU1RfU09VUkNFX0RJUkVDVE9SWSkKKyAgU0VUIChDVEVTVF9TT1VSQ0VfRElSRUNUT1JZICIke0VJR0VOX1dPUktfRElSfS9zcmMiKQorZW5kaWYoTk9UIENURVNUX1NPVVJDRV9ESVJFQ1RPUlkpCisKK2lmKE5PVCBDVEVTVF9CSU5BUllfRElSRUNUT1JZKQorICBTRVQgKENURVNUX0JJTkFSWV9ESVJFQ1RPUlkgIiR7RUlHRU5fV09SS19ESVJ9L25pZ2h0bHlfJHtFSUdFTl9DWFh9IikKK2VuZGlmKE5PVCBDVEVTVF9CSU5BUllfRElSRUNUT1JZKQorCitpZihOT1QgRUlHRU5fTU9ERSkKKyAgc2V0KEVJR0VOX01PREUgTmlnaHRseSkKK2VuZGlmKE5PVCBFSUdFTl9NT0RFKQorCisjIyBtYW5kYXRvcnkgdmFyaWFibGVzICh0aGUgZGVmYXVsdCBzaG91bGQgYmUgb2sgaW4gbW9zdCBjYXNlcyk6CisKK1NFVCAoQ1RFU1RfQ1ZTX0NPTU1BTkQgImhnIikKK1NFVCAoQ1RFU1RfQ1ZTX0NIRUNLT1VUICIke0NURVNUX0NWU19DT01NQU5EfSBjbG9uZSAtciAyLjAgaHR0cDovL2JpdGJ1Y2tldC5vcmcvZWlnZW4vZWlnZW4gXCIke0NURVNUX1NPVVJDRV9ESVJFQ1RPUll9XCIiKQorCisjIHdoaWNoIGN0ZXN0IGNvbW1hbmQgdG8gdXNlIGZvciBydW5uaW5nIHRoZSBkYXNoYm9hcmQKK1NFVCAoQ1RFU1RfQ09NTUFORCAiJHtFSUdFTl9DTUFLRV9ESVJ9Y3Rlc3QgLUQgJHtFSUdFTl9NT0RFfSIpCisKKyMgd2hhdCBjbWFrZSBjb21tYW5kIHRvIHVzZSBmb3IgY29uZmlndXJpbmcgdGhpcyBkYXNoYm9hcmQKK1NFVCAoQ1RFU1RfQ01BS0VfQ09NTUFORCAiJHtFSUdFTl9DTUFLRV9ESVJ9Y21ha2UgLURFSUdFTl9CVUlMRF9URVNUUz1vbiAiKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGUgdmFsdWVzIGluIHRoaXMgc2VjdGlvbiBhcmUgb3B0aW9uYWwgeW91IGNhbiBlaXRoZXIKKyMgaGF2ZSB0aGVtIG9yIGxlYXZlIHRoZW0gY29tbWVudGVkIG91dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyB0aGlzIG1ha2Ugc3VyZSB3ZSBnZXQgY29uc2lzdGVudCBvdXRwdXRzCitTRVQoJEVOVntMQ19NRVNTQUdFU30gImVuX0VOIikKKworIyBzaG91bGQgY3Rlc3Qgd2lwZSB0aGUgYmluYXJ5IHRyZWUgYmVmb3JlIHJ1bm5pbmcKK1NFVChDVEVTVF9TVEFSVF9XSVRIX0VNUFRZX0JJTkFSWV9ESVJFQ1RPUlkgVFJVRSkKK1NFVChDVEVTVF9CQUNLVVBfQU5EX1JFU1RPUkUgVFJVRSkKKworIyB0aGlzIGlzIHRoZSBpbml0aWFsIGNhY2hlIHRvIHVzZSBmb3IgdGhlIGJpbmFyeSB0cmVlLCBiZSBjYXJlZnVsIHRvIGVzY2FwZQorIyBhbnkgcXVvdGVzIGluc2lkZSBvZiB0aGlzIHN0cmluZyBpZiB5b3UgdXNlIGl0CitpZihXSU4zMiBBTkQgTk9UIFVOSVgpCisgICNtZXNzYWdlKFNFTkRfRVJST1IgIndpbjMyIikKKyAgc2V0KENURVNUX0NNQUtFX0NPTU1BTkQgIiR7Q1RFU1RfQ01BS0VfQ09NTUFORH0gLUcgXCJOTWFrZSBNYWtlZmlsZXNcIiAtRENNQUtFX01BS0VfUFJPR1JBTT1ubWFrZSIpCisgIFNFVCAoQ1RFU1RfSU5JVElBTF9DQUNIRSAiCisgICAgTUFLRUNPTU1BTkQ6U1RSSU5HPW5tYWtlIC1pCisgICAgQ01BS0VfTUFLRV9QUk9HUkFNOkZJTEVQQVRIPW5tYWtlCisgICAgQ01BS0VfR0VORVJBVE9SOklOVEVSTkFMPU5NYWtlIE1ha2VmaWxlcworICAgIEJVSUxETkFNRTpTVFJJTkc9JHtFSUdFTl9CVUlMRF9TVFJJTkd9CisgICAgU0lURTpTVFJJTkc9JHtFSUdFTl9TSVRFfQorICAiKQorZWxzZShXSU4zMiBBTkQgTk9UIFVOSVgpCisgIFNFVCAoQ1RFU1RfSU5JVElBTF9DQUNIRSAiCisgICAgQlVJTEROQU1FOlNUUklORz0ke0VJR0VOX0JVSUxEX1NUUklOR30KKyAgICBTSVRFOlNUUklORz0ke0VJR0VOX1NJVEV9CisgICIpCitlbmRpZihXSU4zMiBBTkQgTk9UIFVOSVgpCisKKyMgc2V0IGFueSBleHRyYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gdXNlIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzY3JpcHQgaGVyZToKKworaWYoRUlHRU5fQ1hYKQorICBzZXQoQ1RFU1RfRU5WSVJPTk1FTlQgIkNYWD0ke0VJR0VOX0NYWH0iKQorZW5kaWYoRUlHRU5fQ1hYKQorCitpZihERUZJTkVEIEVJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04pCisgIGlmKEVJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04gTUFUQ0hFUyBTU0UyKQorICAgIHNldChDVEVTVF9DTUFLRV9DT01NQU5EICIke0NURVNUX0NNQUtFX0NPTU1BTkR9IC1ERUlHRU5fVEVTVF9TU0UyPU9OIikKKyAgZWxzZWlmKEVJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04gTUFUQ0hFUyBTU0UzKQorICAgIHNldChDVEVTVF9DTUFLRV9DT01NQU5EICIke0NURVNUX0NNQUtFX0NPTU1BTkR9IC1ERUlHRU5fVEVTVF9TU0UyPU9OIC1ERUlHRU5fVEVTVF9TU0UzPU9OIikKKyAgZWxzZWlmKEVJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04gTUFUQ0hFUyBBbHRpdmVjKQorICAgIHNldChDVEVTVF9DTUFLRV9DT01NQU5EICIke0NURVNUX0NNQUtFX0NPTU1BTkR9IC1ERUlHRU5fVEVTVF9BTFRJVkVDPU9OIikKKyAgZWxzZWlmKEVJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04gTUFUQ0hFUyBub3ZlYykKKyAgICBzZXQoQ1RFU1RfQ01BS0VfQ09NTUFORCAiJHtDVEVTVF9DTUFLRV9DT01NQU5EfSAtREVJR0VOX1RFU1RfTk9fRVhQTElDSVRfVkVDVE9SSVpBVElPTj1PTiIpCisgIGVsc2UoRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTiBNQVRDSEVTIFNTRTIpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiSW52YWxpZCB2YWx1ZSBmb3IgRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTiAoJHtFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OfSksIG11c3QgYmU6IG5vdmVjLCBTU0UyLCBTU0UzLCBBbHRpdmVjIikKKyAgZW5kaWYoRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTiBNQVRDSEVTIFNTRTIpCitlbmRpZihERUZJTkVEIEVJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT04pCisKK2lmKERFRklORUQgRUlHRU5fQ01BS0VfQVJHUykKKyAgc2V0KENURVNUX0NNQUtFX0NPTU1BTkQgIiR7Q1RFU1RfQ01BS0VfQ09NTUFORH0gJHtFSUdFTl9DTUFLRV9BUkdTfSIpCitlbmRpZihERUZJTkVEIEVJR0VOX0NNQUtFX0FSR1MpCmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMnN1cHBvcnQuY3BwIGIvdGVzdC9laWdlbjJzdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTAyYmRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbjJzdXBwb3J0LmNwcApAQCAtMCwwICsxLDY0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU4yX1NVUFBPUlQKKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBlaWdlbjJzdXBwb3J0KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworCisgIFNjYWxhciAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIC8vIHNjYWxhciBhZGRpdGlvbgorICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlKCkgKyBzMSwgczEgKyBtMS5jd2lzZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpICsgczEsIE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxzMSkgKyBtMSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xKlNjYWxhcigyKSkuY3dpc2UoKSAtIHMyLCAobTErbTEpIC0gTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMyKSApOworICBtMyA9IG0xOworICBtMy5jd2lzZSgpICs9IHMyOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMS5jd2lzZSgpICsgczIpOworICBtMyA9IG0xOworICBtMy5jd2lzZSgpIC09IHMxOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMS5jd2lzZSgpIC0gczEpOworCisgIFZFUklGWV9JU19FUVVBTCgobTEuY29ybmVyKFRvcExlZnQsMSwxKSksIChtMS5ibG9jaygwLDAsMSwxKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG0xLnRlbXBsYXRlIGNvcm5lcjwxLDE+KFRvcExlZnQpKSwgKG0xLnRlbXBsYXRlIGJsb2NrPDEsMT4oMCwwKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG0xLmNvbCgwKS5zdGFydCgxKSksIChtMS5jb2woMCkuc2VnbWVudCgwLDEpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobTEuY29sKDApLnRlbXBsYXRlIHN0YXJ0PDE+KCkpLCAobTEuY29sKDApLnNlZ21lbnQoMCwxKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG0xLmNvbCgwKS5lbmQoMSkpLCAobTEuY29sKDApLnNlZ21lbnQocm93cy0xLDEpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobTEuY29sKDApLnRlbXBsYXRlIGVuZDwxPigpKSwgKG0xLmNvbCgwKS5zZWdtZW50KHJvd3MtMSwxKSkpOworICAKKyAgdXNpbmcgbmFtZXNwYWNlIGludGVybmFsOworICBWRVJJRllfSVNfRVFVQUwoZWlfY29zKHMxKSwgY29zKHMxKSk7CisgIFZFUklGWV9JU19FUVVBTChlaV9yZWFsKHMxKSwgcmVhbChzMSkpOworICBWRVJJRllfSVNfRVFVQUwoZWlfYWJzMihzMSksIGFiczIoczEpKTsKKworICBtMS5taW5vcigwLDApOworfQorCit2b2lkIHRlc3RfZWlnZW4yc3VwcG9ydCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGVpZ2VuMnN1cHBvcnQoTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGVpZ2VuMnN1cHBvcnQoTWF0cml4WGQoMSwxKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggZWlnZW4yc3VwcG9ydChNYXRyaXgzZigpKSApOworICAgIENBTExfU1VCVEVTVF81KCBlaWdlbjJzdXBwb3J0KE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGVpZ2VuMnN1cHBvcnQoTWF0cml4WGYoMjAwLDIwMCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGVpZ2VuMnN1cHBvcnQoTWF0cml4WGNkKDEwMCwxMDApKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2Vuc29sdmVyX2NvbXBsZXguY3BwIGIvdGVzdC9laWdlbnNvbHZlcl9jb21wbGV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzIwNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbnNvbHZlcl9jb21wbGV4LmNwcApAQCAtMCwwICsxLDExNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisKKy8qIENoZWNrIHRoYXQgdHdvIGNvbHVtbiB2ZWN0b3JzIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsIHVwdG8gcGVybXV0YXRpb25zLAorICAgYnkgY2hlY2tpbmcgdGhhdCB0aGUgay10aCBwb3dlciBzdW1zIGFyZSBlcXVhbCBmb3IgayA9IDEsIC4uLiwgdmVjMS5yb3dzKCkgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+Cit2b2lkIHZlcmlmeV9pc19hcHByb3hfdXB0b19wZXJtdXRhdGlvbihjb25zdCBWZWN0b3JUeXBlJiB2ZWMxLCBjb25zdCBWZWN0b3JUeXBlJiB2ZWMyKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgVkVSSUZZKHZlYzEuY29scygpID09IDEpOworICBWRVJJRlkodmVjMi5jb2xzKCkgPT0gMSk7CisgIFZFUklGWSh2ZWMxLnJvd3MoKSA9PSB2ZWMyLnJvd3MoKSk7CisgIGZvciAoaW50IGsgPSAxOyBrIDw9IHZlYzEucm93cygpOyArK2spCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHZlYzEuYXJyYXkoKS5wb3coUmVhbFNjYWxhcihrKSkuc3VtKCksIHZlYzIuYXJyYXkoKS5wb3coUmVhbFNjYWxhcihrKSkuc3VtKCkpOworICB9Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBlaWdlbnNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIENvbXBsZXhFaWdlblNvbHZlci5oLCBhbmQgaW5kaXJlY3RseSBDb21wbGV4U2NodXIuaAorICAqLworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFJlYWxWZWN0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbD4gQ29tcGxleDsKKworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBzeW1tQSA9ICBhLmFkam9pbnQoKSAqIGE7CisKKyAgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpMChzeW1tQSk7CisgIFZFUklGWV9JU19FUVVBTChlaTAuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzeW1tQSAqIGVpMC5laWdlbnZlY3RvcnMoKSwgZWkwLmVpZ2VudmVjdG9ycygpICogZWkwLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKTsKKworICBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWkxKGEpOworICBWRVJJRllfSVNfRVFVQUwoZWkxLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19BUFBST1goYSAqIGVpMS5laWdlbnZlY3RvcnMoKSwgZWkxLmVpZ2VudmVjdG9ycygpICogZWkxLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKTsKKyAgLy8gTm90ZTogSWYgTWF0cml4VHlwZSBpcyByZWFsIHRoZW4gYS5laWdlbnZhbHVlcygpIHVzZXMgRWlnZW5Tb2x2ZXIgYW5kIHRodXMKKyAgLy8gYW5vdGhlciBhbGdvcml0aG0gc28gcmVzdWx0cyBtYXkgZGlmZmVyIHNsaWdodGx5CisgIHZlcmlmeV9pc19hcHByb3hfdXB0b19wZXJtdXRhdGlvbihhLmVpZ2VudmFsdWVzKCksIGVpMS5laWdlbnZhbHVlcygpKTsKKworICBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlOb0VpdmVjcyhhLCBmYWxzZSk7CisgIFZFUklGWV9JU19FUVVBTChlaU5vRWl2ZWNzLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19BUFBST1goZWkxLmVpZ2VudmFsdWVzKCksIGVpTm9FaXZlY3MuZWlnZW52YWx1ZXMoKSk7CisKKyAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBpc3N1ZSAjNjYKKyAgTWF0cml4VHlwZSB6ID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpOworICBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWl6KHopOworICBWRVJJRlkoKGVpei5laWdlbnZhbHVlcygpLmN3aXNlRXF1YWwoMCkpLmFsbCgpKTsKKworICBNYXRyaXhUeXBlIGlkID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scyk7CisgIFZFUklGWV9JU19BUFBST1goaWQub3BlcmF0b3JOb3JtKCksIFJlYWxTY2FsYXIoMSkpOworCisgIGlmIChyb3dzID4gMSkKKyAgeworICAgIC8vIFRlc3QgbWF0cml4IHdpdGggTmFOCisgICAgYSgwLDApID0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyPjo6cXVpZXRfTmFOKCk7CisgICAgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpTmFOKGEpOworICAgIFZFUklGWV9JU19FUVVBTChlaU5hTi5pbmZvKCksIE5vQ29udmVyZ2VuY2UpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlnOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuZWlnZW52ZWN0b3JzKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuZWlnZW52YWx1ZXMoKSk7CisKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKG0ucm93cygpLG0uY29scygpKTsKKyAgZWlnLmNvbXB1dGUoYSwgZmFsc2UpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuZWlnZW52ZWN0b3JzKCkpOworfQorCit2b2lkIHRlc3RfZWlnZW5zb2x2ZXJfY29tcGxleCgpCit7CisgIGludCBzOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBlaWdlbnNvbHZlcihNYXRyaXg0Y2YoKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS80KTsKKyAgICBDQUxMX1NVQlRFU1RfMiggZWlnZW5zb2x2ZXIoTWF0cml4WGNkKHMscykpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGVpZ2Vuc29sdmVyKE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBlaWdlbnNvbHZlcihNYXRyaXgzZigpKSApOworICB9CisKKyAgQ0FMTF9TVUJURVNUXzEoIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4NGNmKCkpICk7CisgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOworICBDQUxMX1NVQlRFU1RfMiggZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXhYY2QocyxzKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzMoIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sIDEsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVF80KCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KE1hdHJpeDNmKCkpICk7CisKKyAgLy8gVGVzdCBwcm9ibGVtIHNpemUgY29uc3RydWN0b3JzCisgIENBTExfU1VCVEVTVF81KENvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhYZj4ocykpOworICAKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHMpCit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2Vuc29sdmVyX2dlbmVyaWMuY3BwIGIvdGVzdC9laWdlbnNvbHZlcl9nZW5lcmljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU1Y2NkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9laWdlbnNvbHZlcl9nZW5lcmljLmNwcApAQCAtMCwwICsxLDExNSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGVpZ2Vuc29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgRWlnZW5Tb2x2ZXIuaAorICAqLworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFJlYWxWZWN0b3JUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbD4gQ29tcGxleDsKKworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBhMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIHN5bW1BID0gIGEuYWRqb2ludCgpICogYSArIGExLmFkam9pbnQoKSAqIGExOworCisgIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpMChzeW1tQSk7CisgIFZFUklGWV9JU19FUVVBTChlaTAuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzeW1tQSAqIGVpMC5wc2V1ZG9FaWdlbnZlY3RvcnMoKSwgZWkwLnBzZXVkb0VpZ2VudmVjdG9ycygpICogZWkwLnBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1goKHN5bW1BLnRlbXBsYXRlIGNhc3Q8Q29tcGxleD4oKSkgKiAoZWkwLnBzZXVkb0VpZ2VudmVjdG9ycygpLnRlbXBsYXRlIGNhc3Q8Q29tcGxleD4oKSksCisgICAgKGVpMC5wc2V1ZG9FaWdlbnZlY3RvcnMoKS50ZW1wbGF0ZSBjYXN0PENvbXBsZXg+KCkpICogKGVpMC5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSkpOworCisgIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpMShhKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVpMS5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRllfSVNfQVBQUk9YKGEgKiBlaTEucHNldWRvRWlnZW52ZWN0b3JzKCksIGVpMS5wc2V1ZG9FaWdlbnZlY3RvcnMoKSAqIGVpMS5wc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKGEudGVtcGxhdGUgY2FzdDxDb21wbGV4PigpICogZWkxLmVpZ2VudmVjdG9ycygpLAorICAgICAgICAgICAgICAgICAgIGVpMS5laWdlbnZlY3RvcnMoKSAqIGVpMS5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goZWkxLmVpZ2VudmVjdG9ycygpLmNvbHdpc2UoKS5ub3JtKCksIFJlYWxWZWN0b3JUeXBlOjpPbmVzKHJvd3MpLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhLmVpZ2VudmFsdWVzKCksIGVpMS5laWdlbnZhbHVlcygpKTsKKworICBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaU5vRWl2ZWNzKGEsIGZhbHNlKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVpTm9FaXZlY3MuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChlaTEuZWlnZW52YWx1ZXMoKSwgZWlOb0VpdmVjcy5laWdlbnZhbHVlcygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChlaTEucHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpLCBlaU5vRWl2ZWNzLnBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSk7CisKKyAgTWF0cml4VHlwZSBpZCA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpOworICBWRVJJRllfSVNfQVBQUk9YKGlkLm9wZXJhdG9yTm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKKworICBpZiAocm93cyA+IDIpCisgIHsKKyAgICAvLyBUZXN0IG1hdHJpeCB3aXRoIE5hTgorICAgIGEoMCwwKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhcj46OnF1aWV0X05hTigpOworICAgIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpTmFOKGEpOworICAgIFZFUklGWV9JU19FUVVBTChlaU5hTi5pbmZvKCksIE5vQ29udmVyZ2VuY2UpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaWc7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZlY3RvcnMoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5wc2V1ZG9FaWdlbnZlY3RvcnMoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5wc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuZWlnZW52YWx1ZXMoKSk7CisKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKG0ucm93cygpLG0uY29scygpKTsKKyAgZWlnLmNvbXB1dGUoYSwgZmFsc2UpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuZWlnZW52ZWN0b3JzKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcucHNldWRvRWlnZW52ZWN0b3JzKCkpOworfQorCit2b2lkIHRlc3RfZWlnZW5zb2x2ZXJfZ2VuZXJpYygpCit7CisgIGludCBzOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBlaWdlbnNvbHZlcihNYXRyaXg0ZigpKSApOworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOworICAgIENBTExfU1VCVEVTVF8yKCBlaWdlbnNvbHZlcihNYXRyaXhYZChzLHMpKSApOworCisgICAgLy8gc29tZSB0cml2aWFsIGJ1dCBpbXBsZW1lbnRhdGlvbi13aXNlIHRyaWNreSBjYXNlcworICAgIENBTExfU1VCVEVTVF8yKCBlaWdlbnNvbHZlcihNYXRyaXhYZCgxLDEpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBlaWdlbnNvbHZlcihNYXRyaXhYZCgyLDIpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBlaWdlbnNvbHZlcihNYXRyaXg8ZG91YmxlLDEsMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggZWlnZW5zb2x2ZXIoTWF0cml4MmQoKSkgKTsKKyAgfQorCisgIENBTExfU1VCVEVTVF8xKCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KE1hdHJpeDRmKCkpICk7CisgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOworICBDQUxMX1NVQlRFU1RfMiggZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXhYZChzLHMpKSApOworICBDQUxMX1NVQlRFU1RfMyggZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXg8ZG91YmxlLDEsMT4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzQoIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4MmQoKSkgKTsKKworICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKKyAgQ0FMTF9TVUJURVNUXzUoRWlnZW5Tb2x2ZXI8TWF0cml4WGY+KHMpKTsKKworICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA0MTAKKyAgQ0FMTF9TVUJURVNUXzIoCisgIHsKKyAgICAgTWF0cml4WGQgQSgxLDEpOworICAgICBBKDAsMCkgPSBzdGQ6OnNxcnQoLTEuKTsKKyAgICAgRWlnZW46OkVpZ2VuU29sdmVyPE1hdHJpeFhkPiBzb2x2ZXIoQSk7CisgICAgIE1hdHJpeFhkIFYoMSwgMSk7CisgICAgIFYoMCwwKSA9IHNvbHZlci5laWdlbnZlY3RvcnMoKSgwLDApLnJlYWwoKTsKKyAgfQorICApOworICAKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHMpCit9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2Vuc29sdmVyX3NlbGZhZGpvaW50LmNwcCBiL3Rlc3QvZWlnZW5zb2x2ZXJfc2VsZmFkam9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGJkYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VpZ2Vuc29sdmVyX3NlbGZhZGpvaW50LmNwcApAQCAtMCwwICsxLDE0NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBFaWdlblNvbHZlci5oLCBTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmggKGFuZCBpbmRpcmVjdGx5OiBUcmlkaWFnb25hbGl6YXRpb24uaCkKKyAgKi8KKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBSZWFsVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWw+IENvbXBsZXg7CisKKyAgUmVhbFNjYWxhciBsYXJnZXJFcHMgPSAxMCp0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpOworCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIGExID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgc3ltbUEgPSAgYS5hZGpvaW50KCkgKiBhICsgYTEuYWRqb2ludCgpICogYTE7CisgIHN5bW1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkuc2V0WmVybygpOworCisgIE1hdHJpeFR5cGUgYiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIGIxID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgc3ltbUIgPSBiLmFkam9pbnQoKSAqIGIgKyBiMS5hZGpvaW50KCkgKiBiMTsKKyAgc3ltbUIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlVcHBlcj4oKS5zZXRaZXJvKCk7CisKKyAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaVN5bW0oc3ltbUEpOworICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpRGlyZWN0OworICBlaURpcmVjdC5jb21wdXRlRGlyZWN0KHN5bW1BKTsKKyAgLy8gZ2VuZXJhbGl6ZWQgZWlnZW4gcGIKKyAgR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpU3ltbUdlbihzeW1tQSwgc3ltbUIpOworCisgIFZFUklGWV9JU19FUVVBTChlaVN5bW0uaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZKChzeW1tQS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBlaVN5bW0uZWlnZW52ZWN0b3JzKCkpLmlzQXBwcm94KAorICAgICAgICAgIGVpU3ltbS5laWdlbnZlY3RvcnMoKSAqIGVpU3ltbS5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSwgbGFyZ2VyRXBzKSk7CisgIFZFUklGWV9JU19BUFBST1goc3ltbUEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmVpZ2VudmFsdWVzKCksIGVpU3ltbS5laWdlbnZhbHVlcygpKTsKKyAgCisgIFZFUklGWV9JU19FUVVBTChlaURpcmVjdC5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRlkoKHN5bW1BLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGVpRGlyZWN0LmVpZ2VudmVjdG9ycygpKS5pc0FwcHJveCgKKyAgICAgICAgICBlaURpcmVjdC5laWdlbnZlY3RvcnMoKSAqIGVpRGlyZWN0LmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpLCBsYXJnZXJFcHMpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzeW1tQS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuZWlnZW52YWx1ZXMoKSwgZWlEaXJlY3QuZWlnZW52YWx1ZXMoKSk7CisKKyAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaVN5bW1Ob0VpdmVjcyhzeW1tQSwgZmFsc2UpOworICBWRVJJRllfSVNfRVFVQUwoZWlTeW1tTm9FaXZlY3MuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChlaVN5bW0uZWlnZW52YWx1ZXMoKSwgZWlTeW1tTm9FaXZlY3MuZWlnZW52YWx1ZXMoKSk7CisgIAorICAvLyBnZW5lcmFsaXplZCBlaWdlbiBwcm9ibGVtIEF4ID0gbEJ4CisgIGVpU3ltbUdlbi5jb21wdXRlKHN5bW1BLCBzeW1tQixBeF9sQngpOworICBWRVJJRllfSVNfRVFVQUwoZWlTeW1tR2VuLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWSgoc3ltbUEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlTeW1tR2VuLmVpZ2VudmVjdG9ycygpKS5pc0FwcHJveCgKKyAgICAgICAgICBzeW1tQi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoZWlTeW1tR2VuLmVpZ2VudmVjdG9ycygpICogZWlTeW1tR2VuLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKSwgbGFyZ2VyRXBzKSk7CisKKyAgLy8gZ2VuZXJhbGl6ZWQgZWlnZW4gcHJvYmxlbSBCQXggPSBseAorICBlaVN5bW1HZW4uY29tcHV0ZShzeW1tQSwgc3ltbUIsQkF4X2x4KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVpU3ltbUdlbi5pbmZvKCksIFN1Y2Nlc3MpOworICBWRVJJRlkoKHN5bW1CLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzeW1tQS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBlaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkpKS5pc0FwcHJveCgKKyAgICAgICAgIChlaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkgKiBlaVN5bW1HZW4uZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpLCBsYXJnZXJFcHMpKTsKKworICAvLyBnZW5lcmFsaXplZCBlaWdlbiBwcm9ibGVtIEFCeCA9IGx4CisgIGVpU3ltbUdlbi5jb21wdXRlKHN5bW1BLCBzeW1tQixBQnhfbHgpOworICBWRVJJRllfSVNfRVFVQUwoZWlTeW1tR2VuLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWSgoc3ltbUEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHN5bW1CLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSkpLmlzQXBwcm94KAorICAgICAgICAgKGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSAqIGVpU3ltbUdlbi5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSksIGxhcmdlckVwcykpOworCisKKyAgTWF0cml4VHlwZSBzcXJ0U3ltbUEgPSBlaVN5bW0ub3BlcmF0b3JTcXJ0KCk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShzeW1tQS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpLCBzcXJ0U3ltbUEqc3FydFN5bW1BKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzcXJ0U3ltbUEsIHN5bW1BLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSplaVN5bW0ub3BlcmF0b3JJbnZlcnNlU3FydCgpKTsKKworICBNYXRyaXhUeXBlIGlkID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scyk7CisgIFZFUklGWV9JU19BUFBST1goaWQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLm9wZXJhdG9yTm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKKworICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpU3ltbVVuaW5pdGlhbGl6ZWQ7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpU3ltbVVuaW5pdGlhbGl6ZWQuaW5mbygpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlTeW1tVW5pbml0aWFsaXplZC5laWdlbnZhbHVlcygpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlTeW1tVW5pbml0aWFsaXplZC5laWdlbnZlY3RvcnMoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpU3ltbVVuaW5pdGlhbGl6ZWQub3BlcmF0b3JTcXJ0KCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaVN5bW1VbmluaXRpYWxpemVkLm9wZXJhdG9ySW52ZXJzZVNxcnQoKSk7CisKKyAgZWlTeW1tVW5pbml0aWFsaXplZC5jb21wdXRlKHN5bW1BLCBmYWxzZSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpU3ltbVVuaW5pdGlhbGl6ZWQuZWlnZW52ZWN0b3JzKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaVN5bW1VbmluaXRpYWxpemVkLm9wZXJhdG9yU3FydCgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlTeW1tVW5pbml0aWFsaXplZC5vcGVyYXRvckludmVyc2VTcXJ0KCkpOworCisgIC8vIHRlc3QgVHJpZGlhZ29uYWxpemF0aW9uJ3MgbWV0aG9kcworICBUcmlkaWFnb25hbGl6YXRpb248TWF0cml4VHlwZT4gdHJpZGlhZyhzeW1tQSk7CisgIC8vIEZJWE1FIHRyaWRpYWcubWF0cml4USgpLmFkam9pbnQoKSBkb2VzIG5vdCB3b3JrCisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShzeW1tQS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpLCB0cmlkaWFnLm1hdHJpeFEoKSAqIHRyaWRpYWcubWF0cml4VCgpLmV2YWwoKSAqIE1hdHJpeFR5cGUodHJpZGlhZy5tYXRyaXhRKCkpLmFkam9pbnQoKSk7CisgIAorICBpZiAocm93cyA+IDEpCisgIHsKKyAgICAvLyBUZXN0IG1hdHJpeCB3aXRoIE5hTgorICAgIHN5bW1BKDAsMCkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpU3ltbU5hTihzeW1tQSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGVpU3ltbU5hTi5pbmZvKCksIE5vQ29udmVyZ2VuY2UpOworICB9Cit9CisKK3ZvaWQgdGVzdF9laWdlbnNvbHZlcl9zZWxmYWRqb2ludCgpCit7CisgIGludCBzOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIC8vIHZlcnkgaW1wb3J0YW50IHRvIHRlc3QgM3gzIGFuZCAyeDIgbWF0cmljZXMgc2luY2Ugd2UgcHJvdmlkZSBzcGVjaWFsIHBhdGhzIGZvciB0aGVtCisgICAgQ0FMTF9TVUJURVNUXzEoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4MmQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXgzZigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDRkKCkpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4WGYocyxzKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS80KTsKKyAgICBDQUxMX1NVQlRFU1RfNCggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYZChzLHMpKSApOworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOworICAgIENBTExfU1VCVEVTVF81KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeFhjZChzLHMpKSApOworICAgIAorICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOworICAgIENBTExfU1VCVEVTVF85KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KHMscykpICk7CisKKyAgICAvLyBzb21lIHRyaXZpYWwgYnV0IGltcGxlbWVudGF0aW9uLXdpc2UgdHJpY2t5IGNhc2VzCisgICAgQ0FMTF9TVUJURVNUXzQoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4WGQoMSwxKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYZCgyLDIpKSApOworICAgIENBTExfU1VCVEVTVF82KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxkb3VibGUsMSwxPigpKSApOworICAgIENBTExfU1VCVEVTVF83KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxkb3VibGUsMiwyPigpKSApOworICB9CisKKyAgLy8gVGVzdCBwcm9ibGVtIHNpemUgY29uc3RydWN0b3JzCisgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOworICBDQUxMX1NVQlRFU1RfOChTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhmPihzKSk7CisgIENBTExfU1VCVEVTVF84KFRyaWRpYWdvbmFsaXphdGlvbjxNYXRyaXhYZj4ocykpOworICAKKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHMpCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvZXhjZXB0aW9ucy5jcHAgYi90ZXN0L2V4Y2VwdGlvbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDhiMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2V4Y2VwdGlvbnMuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKworLy8gVmFyaW91cyBzYW5pdHkgdGVzdHMgd2l0aCBleGNlcHRpb25zOgorLy8gIC0gbm8gbWVtb3J5IGxlYWsgd2hlbiBhIGN1c3RvbSBzY2FsYXIgdHlwZSB0cm93IGFuIGV4Y2VwdGlvbnMKKy8vICAtIHRvZG86IGNvbXBsZXRlIHRoZSBsaXN0IG9mIHRlc3RzIQorCisjZGVmaW5lIEVJR0VOX1NUQUNLX0FMTE9DQVRJT05fTElNSVQgMTAwMDAwMDAwCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3N0cnVjdCBteV9leGNlcHRpb24KK3sKKyAgbXlfZXhjZXB0aW9uKCkge30KKyAgfm15X2V4Y2VwdGlvbigpIHt9Cit9OworICAgIAorY2xhc3MgU2NhbGFyV2l0aEV4Y2VwdGlvbnMKK3sKKyAgcHVibGljOgorICAgIFNjYWxhcldpdGhFeGNlcHRpb25zKCkgeyBpbml0KCk7IH0KKyAgICBTY2FsYXJXaXRoRXhjZXB0aW9ucyhjb25zdCBmbG9hdCYgX3YpIHsgaW5pdCgpOyAqdiA9IF92OyB9CisgICAgU2NhbGFyV2l0aEV4Y2VwdGlvbnMoY29uc3QgU2NhbGFyV2l0aEV4Y2VwdGlvbnMmIG90aGVyKSB7IGluaXQoKTsgKnYgPSAqKG90aGVyLnYpOyB9CisgICAgflNjYWxhcldpdGhFeGNlcHRpb25zKCkgeworICAgICAgZGVsZXRlIHY7CisgICAgICBpbnN0YW5jZXMtLTsKKyAgICB9CisKKyAgICB2b2lkIGluaXQoKSB7CisgICAgICB2ID0gbmV3IGZsb2F0OworICAgICAgaW5zdGFuY2VzKys7CisgICAgfQorCisgICAgU2NhbGFyV2l0aEV4Y2VwdGlvbnMgb3BlcmF0b3IrKGNvbnN0IFNjYWxhcldpdGhFeGNlcHRpb25zJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBjb3VudGRvd24tLTsKKyAgICAgIGlmKGNvdW50ZG93bjw9MCkKKyAgICAgICAgdGhyb3cgbXlfZXhjZXB0aW9uKCk7CisgICAgICByZXR1cm4gU2NhbGFyV2l0aEV4Y2VwdGlvbnMoKnYrKm90aGVyLnYpOworICAgIH0KKyAgICAKKyAgICBTY2FsYXJXaXRoRXhjZXB0aW9ucyBvcGVyYXRvci0oY29uc3QgU2NhbGFyV2l0aEV4Y2VwdGlvbnMmIG90aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIFNjYWxhcldpdGhFeGNlcHRpb25zKCp2LSpvdGhlci52KTsgfQorICAgIAorICAgIFNjYWxhcldpdGhFeGNlcHRpb25zIG9wZXJhdG9yKihjb25zdCBTY2FsYXJXaXRoRXhjZXB0aW9ucyYgb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gU2NhbGFyV2l0aEV4Y2VwdGlvbnMoKCp2KSooKm90aGVyLnYpKTsgfQorICAgIAorICAgIFNjYWxhcldpdGhFeGNlcHRpb25zJiBvcGVyYXRvcis9KGNvbnN0IFNjYWxhcldpdGhFeGNlcHRpb25zJiBvdGhlcikKKyAgICB7ICp2Kz0qb3RoZXIudjsgcmV0dXJuICp0aGlzOyB9CisgICAgU2NhbGFyV2l0aEV4Y2VwdGlvbnMmIG9wZXJhdG9yLT0oY29uc3QgU2NhbGFyV2l0aEV4Y2VwdGlvbnMmIG90aGVyKQorICAgIHsgKnYtPSpvdGhlci52OyByZXR1cm4gKnRoaXM7IH0KKyAgICBTY2FsYXJXaXRoRXhjZXB0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IFNjYWxhcldpdGhFeGNlcHRpb25zJiBvdGhlcikKKyAgICB7ICp2ID0gKihvdGhlci52KTsgcmV0dXJuICp0aGlzOyB9CisgIAorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTY2FsYXJXaXRoRXhjZXB0aW9ucyYgb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gKnY9PSpvdGhlci52OyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNjYWxhcldpdGhFeGNlcHRpb25zJiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiAqdiE9Km90aGVyLnY7IH0KKyAgICAKKyAgICBmbG9hdCogdjsKKyAgICBzdGF0aWMgaW50IGluc3RhbmNlczsKKyAgICBzdGF0aWMgaW50IGNvdW50ZG93bjsKK307CisKK2ludCBTY2FsYXJXaXRoRXhjZXB0aW9uczo6aW5zdGFuY2VzID0gMDsKK2ludCBTY2FsYXJXaXRoRXhjZXB0aW9uczo6Y291bnRkb3duID0gMDsKKworCisjZGVmaW5lIENIRUNLX01FTUxFQUsoT1ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU2NhbGFyV2l0aEV4Y2VwdGlvbnM6OmNvdW50ZG93biA9IDEwMDsgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGJlZm9yZSA9IFNjYWxhcldpdGhFeGNlcHRpb25zOjppbnN0YW5jZXM7ICAgICAgICAgICBcCisgICAgYm9vbCBleGNlcHRpb25fdGhyb3duID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0cnkgeyBPUDsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXRjaCAobXlfZXhjZXB0aW9uKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGV4Y2VwdGlvbl90aHJvd24gPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFZFUklGWShTY2FsYXJXaXRoRXhjZXB0aW9uczo6aW5zdGFuY2VzPT1iZWZvcmUgJiYgIm1lbW9yeSBsZWFrIGRldGVjdGVkIGluICIgJiYgRUlHRU5fTUFLRVNUUklORyhPUCkpOyBcCisgICAgfSBcCisgICAgVkVSSUZZKGV4Y2VwdGlvbl90aHJvd24gJiYgIiBubyBleGNlcHRpb24gdGhyb3duIGluICIgJiYgRUlHRU5fTUFLRVNUUklORyhPUCkpOyBcCisgIH0KKwordm9pZCBtZW1vcnlsZWFrKCkKK3sKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhcldpdGhFeGNlcHRpb25zLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhcldpdGhFeGNlcHRpb25zLER5bmFtaWMsRHluYW1pYz4gTWF0cml4VHlwZTsKKyAgCisgIHsKKyAgICBpbnQgbiA9IDUwOworICAgIFZlY3RvclR5cGUgdjAobiksIHYxKG4pOworICAgIE1hdHJpeFR5cGUgbTAobixuKSwgbTEobixuKSwgbTIobixuKTsKKyAgICB2MC5zZXRPbmVzKCk7IHYxLnNldE9uZXMoKTsKKyAgICBtMC5zZXRPbmVzKCk7IG0xLnNldE9uZXMoKTsgbTIuc2V0T25lcygpOworICAgIENIRUNLX01FTUxFQUsodjAgPSBtMCAqIG0xICogdjEpOworICAgIENIRUNLX01FTUxFQUsobTIgPSBtMCAqIG0xICogbTIpOworICAgIENIRUNLX01FTUxFQUsoKHYwK3YxKS5kb3QodjArdjEpKTsKKyAgfQorICBWRVJJRlkoU2NhbGFyV2l0aEV4Y2VwdGlvbnM6Omluc3RhbmNlcz09MCAmJiAiZ2xvYmFsIG1lbW9yeSBsZWFrIGRldGVjdGVkIGluICIgJiYgRUlHRU5fTUFLRVNUUklORyhPUCkpOyBcCit9CisKK3ZvaWQgdGVzdF9leGNlcHRpb25zKCkKK3sKKyAgQ0FMTF9TVUJURVNUKCBtZW1vcnlsZWFrKCkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZmlyc3RfYWxpZ25lZC5jcHAgYi90ZXN0L2ZpcnN0X2FsaWduZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2Y5NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZpcnN0X2FsaWduZWQuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKFNjYWxhciAqYXJyYXksIGludCBzaXplKQoreworICBjb25zdCBpbnQgcGFja2V0X3NpemUgPSBzaXplb2YoU2NhbGFyKSAqIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgIFZFUklGWSgoKHNpemVfdChhcnJheSkgKyBzaXplb2YoU2NhbGFyKSAqIGludGVybmFsOjpmaXJzdF9hbGlnbmVkKGFycmF5LCBzaXplKSkgJSBwYWNrZXRfc2l6ZSkgPT0gMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdGVzdF9ub25lX2FsaWduZWRfaGVscGVyKFNjYWxhciAqYXJyYXksIGludCBzaXplKQoreworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoYXJyYXkpOworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoc2l6ZSk7CisgIFZFUklGWShpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplID09IDEgfHwgaW50ZXJuYWw6OmZpcnN0X2FsaWduZWQoYXJyYXksIHNpemUpID09IHNpemUpOworfQorCitzdHJ1Y3Qgc29tZV9ub25fdmVjdG9yaXphYmxlX3R5cGUgeyBmbG9hdCB4OyB9OworCit2b2lkIHRlc3RfZmlyc3RfYWxpZ25lZCgpCit7CisgIEVJR0VOX0FMSUdOMTYgZmxvYXQgYXJyYXlfZmxvYXRbMTAwXTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9mbG9hdCwgNTApOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2Zsb2F0KzEsIDUwKTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9mbG9hdCsyLCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQrMywgNTApOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2Zsb2F0KzQsIDUwKTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9mbG9hdCs1LCA1MCk7CisgIAorICBFSUdFTl9BTElHTjE2IGRvdWJsZSBhcnJheV9kb3VibGVbMTAwXTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9kb3VibGUsIDUwKTsKKyAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9kb3VibGUrMSwgNTApOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZSsyLCA1MCk7CisgIAorICBkb3VibGUgKmFycmF5X2RvdWJsZV9wbHVzXzRfYnl0ZXMgPSAoZG91YmxlKikoc2l6ZV90KGFycmF5X2RvdWJsZSkrNCk7CisgIHRlc3Rfbm9uZV9hbGlnbmVkX2hlbHBlcihhcnJheV9kb3VibGVfcGx1c180X2J5dGVzLCA1MCk7CisgIHRlc3Rfbm9uZV9hbGlnbmVkX2hlbHBlcihhcnJheV9kb3VibGVfcGx1c180X2J5dGVzKzEsIDUwKTsKKyAgCisgIHNvbWVfbm9uX3ZlY3Rvcml6YWJsZV90eXBlIGFycmF5X25vbnZlY1sxMDBdOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X25vbnZlYywgMTAwKTsKKyAgdGVzdF9ub25lX2FsaWduZWRfaGVscGVyKGFycmF5X25vbnZlYywgMTAwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ2VvX2FsaWduZWRib3guY3BwIGIvdGVzdC9nZW9fYWxpZ25lZGJveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4NmY5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ2VvX2FsaWduZWRib3guY3BwCkBAIC0wLDAgKzEsMTcxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9RUj4KKworI2luY2x1ZGU8aW9zdHJlYW0+Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCb3hUeXBlPiB2b2lkIGFsaWduZWRib3goY29uc3QgQm94VHlwZSYgX2JveCkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBBbGlnbmVkQm94LmgKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBCb3hUeXBlOjpJbmRleCBJbmRleDsgIAorICB0eXBlZGVmIHR5cGVuYW1lIEJveFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBCb3hUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBjb25zdCBJbmRleCBkaW0gPSBfYm94LmRpbSgpOworCisgIFZlY3RvclR5cGUgcDAgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKyAgVmVjdG9yVHlwZSBwMSA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOworICB3aGlsZSggcDEgPT0gcDAgKXsKKyAgICAgIHAxID0gIFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOyB9CisgIFJlYWxTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFJlYWxTY2FsYXI+KDAsMSk7CisKKyAgQm94VHlwZSBiMChkaW0pOworICBCb3hUeXBlIGIxKFZlY3RvclR5cGU6OlJhbmRvbShkaW0pLFZlY3RvclR5cGU6OlJhbmRvbShkaW0pKTsKKyAgQm94VHlwZSBiMjsKKworICBiMC5leHRlbmQocDApOworICBiMC5leHRlbmQocDEpOworICBWRVJJRlkoYjAuY29udGFpbnMocDAqczErKFNjYWxhcigxKS1zMSkqcDEpKTsKKworICAoYjIgPSBiMCkuZXh0ZW5kKGIxKTsKKyAgVkVSSUZZKGIyLmNvbnRhaW5zKGIwKSk7CisgIFZFUklGWShiMi5jb250YWlucyhiMSkpOworICBWRVJJRllfSVNfQVBQUk9YKGIyLmNsYW1wKGIwKSwgYjApOworCisKKyAgLy8gYWxpZ25tZW50IC0tIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBtZW1vcnkgYWxpZ25tZW50IGFzc2VydGlvbgorICBCb3hUeXBlICpicDAgPSBuZXcgQm94VHlwZShkaW0pOworICBCb3hUeXBlICpicDEgPSBuZXcgQm94VHlwZShkaW0pOworICBicDAtPmV4dGVuZCgqYnAxKTsKKyAgZGVsZXRlIGJwMDsKKyAgZGVsZXRlIGJwMTsKKworICAvLyBzYW1wbGluZworICBmb3IoIGludCBpPTA7IGk8MTA7ICsraSApCisgIHsKKyAgICAgIFZlY3RvclR5cGUgciA9IGIwLnNhbXBsZSgpOworICAgICAgVkVSSUZZKGIwLmNvbnRhaW5zKHIpKTsKKyAgfQorCit9CisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCb3hUeXBlPgordm9pZCBhbGlnbmVkYm94Q2FzdFRlc3RzKGNvbnN0IEJveFR5cGUmIF9ib3gpCit7CisgIC8vIGNhc3RpbmcgIAorICB0eXBlZGVmIHR5cGVuYW1lIEJveFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIEJveFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBCb3hUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBjb25zdCBJbmRleCBkaW0gPSBfYm94LmRpbSgpOworCisgIFZlY3RvclR5cGUgcDAgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKyAgVmVjdG9yVHlwZSBwMSA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOworCisgIEJveFR5cGUgYjAoZGltKTsKKworICBiMC5leHRlbmQocDApOworICBiMC5leHRlbmQocDEpOworCisgIGNvbnN0IGludCBEaW0gPSBCb3hUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBHZXREaWZmZXJlbnRUeXBlPFNjYWxhcj46OnR5cGUgT3RoZXJTY2FsYXI7CisgIEFsaWduZWRCb3g8T3RoZXJTY2FsYXIsRGltPiBocDFmID0gYjAudGVtcGxhdGUgY2FzdDxPdGhlclNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChocDFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLGIwKTsKKyAgQWxpZ25lZEJveDxTY2FsYXIsRGltPiBocDFkID0gYjAudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxiMCk7Cit9CisKKwordm9pZCBzcGVjaWZpY1Rlc3QxKCkKK3sKKyAgICBWZWN0b3IyZiBtOyBtIDw8IC0xLjBmLCAtMi4wZjsKKyAgICBWZWN0b3IyZiBNOyBNIDw8ICAxLjBmLCAgNS4wZjsKKworICAgIHR5cGVkZWYgQWxpZ25lZEJveDJmICBCb3hUeXBlOworICAgIEJveFR5cGUgYm94KCBtLCBNICk7CisKKyAgICBWZWN0b3IyZiBzaWRlcyA9IE0tbTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzLCBib3guc2l6ZXMoKSApOworICAgIFZFUklGWV9JU19BUFBST1goc2lkZXNbMV0sIGJveC5zaXplcygpWzFdICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzaWRlc1sxXSwgYm94LnNpemVzKCkubWF4Q29lZmYoKSApOworICAgIFZFUklGWV9JU19BUFBST1goc2lkZXNbMF0sIGJveC5zaXplcygpLm1pbkNvZWZmKCkgKTsKKworICAgIFZFUklGWV9JU19BUFBST1goIDE0LjBmLCBib3gudm9sdW1lKCkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCA1My4wZiwgYm94LmRpYWdvbmFsKCkuc3F1YXJlZE5vcm0oKSApOworICAgIFZFUklGWV9JU19BUFBST1goIGludGVybmFsOjpzcXJ0KCA1My4wZiApLCBib3guZGlhZ29uYWwoKS5ub3JtKCkgKTsKKworICAgIFZFUklGWV9JU19BUFBST1goIG0sIGJveC5jb3JuZXIoIEJveFR5cGU6OkJvdHRvbUxlZnQgKSApOworICAgIFZFUklGWV9JU19BUFBST1goIE0sIGJveC5jb3JuZXIoIEJveFR5cGU6OlRvcFJpZ2h0ICkgKTsKKyAgICBWZWN0b3IyZiBib3R0b21SaWdodDsgYm90dG9tUmlnaHQgPDwgTVswXSwgbVsxXTsKKyAgICBWZWN0b3IyZiB0b3BMZWZ0OyB0b3BMZWZ0IDw8IG1bMF0sIE1bMV07CisgICAgVkVSSUZZX0lTX0FQUFJPWCggYm90dG9tUmlnaHQsIGJveC5jb3JuZXIoIEJveFR5cGU6OkJvdHRvbVJpZ2h0ICkgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCB0b3BMZWZ0LCBib3guY29ybmVyKCBCb3hUeXBlOjpUb3BMZWZ0ICkgKTsKK30KKworCit2b2lkIHNwZWNpZmljVGVzdDIoKQoreworICAgIFZlY3RvcjNpIG07IG0gPDwgLTEsIC0yLCAwOworICAgIFZlY3RvcjNpIE07IE0gPDwgIDEsICA1LCAzOworCisgICAgdHlwZWRlZiBBbGlnbmVkQm94M2kgIEJveFR5cGU7CisgICAgQm94VHlwZSBib3goIG0sIE0gKTsKKworICAgIFZlY3RvcjNpIHNpZGVzID0gTS1tOworICAgIFZFUklGWV9JU19BUFBST1goc2lkZXMsIGJveC5zaXplcygpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzaWRlc1sxXSwgYm94LnNpemVzKClbMV0gKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzFdLCBib3guc2l6ZXMoKS5tYXhDb2VmZigpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzaWRlc1swXSwgYm94LnNpemVzKCkubWluQ29lZmYoKSApOworCisgICAgVkVSSUZZX0lTX0FQUFJPWCggNDIsIGJveC52b2x1bWUoKSApOworICAgIFZFUklGWV9JU19BUFBST1goIDYyLCBib3guZGlhZ29uYWwoKS5zcXVhcmVkTm9ybSgpICk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKCBtLCBib3guY29ybmVyKCBCb3hUeXBlOjpCb3R0b21MZWZ0Rmxvb3IgKSApOworICAgIFZFUklGWV9JU19BUFBST1goIE0sIGJveC5jb3JuZXIoIEJveFR5cGU6OlRvcFJpZ2h0Q2VpbCApICk7CisgICAgVmVjdG9yM2kgYm90dG9tUmlnaHRGbG9vcjsgYm90dG9tUmlnaHRGbG9vciA8PCBNWzBdLCBtWzFdLCBtWzJdOworICAgIFZlY3RvcjNpIHRvcExlZnRGbG9vcjsgdG9wTGVmdEZsb29yIDw8IG1bMF0sIE1bMV0sIG1bMl07CisgICAgVkVSSUZZX0lTX0FQUFJPWCggYm90dG9tUmlnaHRGbG9vciwgYm94LmNvcm5lciggQm94VHlwZTo6Qm90dG9tUmlnaHRGbG9vciApICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCggdG9wTGVmdEZsb29yLCBib3guY29ybmVyKCBCb3hUeXBlOjpUb3BMZWZ0Rmxvb3IgKSApOworfQorCisKK3ZvaWQgdGVzdF9nZW9fYWxpZ25lZGJveCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKQorICB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGFsaWduZWRib3goQWxpZ25lZEJveDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGFsaWduZWRib3hDYXN0VGVzdHMoQWxpZ25lZEJveDJmKCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMyggYWxpZ25lZGJveChBbGlnbmVkQm94M2YoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggYWxpZ25lZGJveENhc3RUZXN0cyhBbGlnbmVkQm94M2YoKSkgKTsKKworICAgIENBTExfU1VCVEVTVF81KCBhbGlnbmVkYm94KEFsaWduZWRCb3g0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF82KCBhbGlnbmVkYm94Q2FzdFRlc3RzKEFsaWduZWRCb3g0ZCgpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzcoIGFsaWduZWRib3goQWxpZ25lZEJveDFkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIGFsaWduZWRib3hDYXN0VGVzdHMoQWxpZ25lZEJveDFkKCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfOSggYWxpZ25lZGJveChBbGlnbmVkQm94MWkoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAoIGFsaWduZWRib3goQWxpZ25lZEJveDJpKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzExKCBhbGlnbmVkYm94KEFsaWduZWRCb3gzaSgpKSApOworICB9CisgIENBTExfU1VCVEVTVF8xMiggc3BlY2lmaWNUZXN0MSgpICk7CisgIENBTExfU1VCVEVTVF8xMyggc3BlY2lmaWNUZXN0MigpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dlb19ldWxlcmFuZ2xlcy5jcHAgYi90ZXN0L2dlb19ldWxlcmFuZ2xlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmMTQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ2VvX2V1bGVyYW5nbGVzLmNwcApAQCAtMCwwICsxLDU0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9TVkQ+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBldWxlcmFuZ2xlcyh2b2lkKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9ueDsKKyAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXN4OworCisgIFNjYWxhciBhID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC1TY2FsYXIoTV9QSSksIFNjYWxhcihNX1BJKSk7CisgIFF1YXRlcm5pb254IHExOworICBxMSA9IEFuZ2xlQXhpc3goYSwgVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpKTsKKyAgTWF0cml4MyBtOworICBtID0gcTE7CisKKyAgI2RlZmluZSBWRVJJRllfRVVMRVIoSSxKLEssIFgsWSxaKSB7IFwKKyAgICBWZWN0b3IzIGVhID0gbS5ldWxlckFuZ2xlcyhJLEosSyk7IFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sICBNYXRyaXgzKEFuZ2xlQXhpc3goZWFbMF0sIFZlY3RvcjM6OlVuaXQjI1goKSkgKiBBbmdsZUF4aXN4KGVhWzFdLCBWZWN0b3IzOjpVbml0IyNZKCkpICogQW5nbGVBeGlzeChlYVsyXSwgVmVjdG9yMzo6VW5pdCMjWigpKSkpOyBcCisgIH0KKyAgVkVSSUZZX0VVTEVSKDAsMSwyLCBYLFksWik7CisgIFZFUklGWV9FVUxFUigwLDEsMCwgWCxZLFgpOworICBWRVJJRllfRVVMRVIoMCwyLDEsIFgsWixZKTsKKyAgVkVSSUZZX0VVTEVSKDAsMiwwLCBYLFosWCk7CisKKyAgVkVSSUZZX0VVTEVSKDEsMiwwLCBZLFosWCk7CisgIFZFUklGWV9FVUxFUigxLDIsMSwgWSxaLFkpOworICBWRVJJRllfRVVMRVIoMSwwLDIsIFksWCxaKTsKKyAgVkVSSUZZX0VVTEVSKDEsMCwxLCBZLFgsWSk7CisKKyAgVkVSSUZZX0VVTEVSKDIsMCwxLCBaLFgsWSk7CisgIFZFUklGWV9FVUxFUigyLDAsMiwgWixYLFopOworICBWRVJJRllfRVVMRVIoMiwxLDAsIFosWSxYKTsKKyAgVkVSSUZZX0VVTEVSKDIsMSwyLCBaLFksWik7Cit9CisKK3ZvaWQgdGVzdF9nZW9fZXVsZXJhbmdsZXMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBldWxlcmFuZ2xlczxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBldWxlcmFuZ2xlczxkb3VibGU+KCkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nZW9faG9tb2dlbmVvdXMuY3BwIGIvdGVzdC9nZW9faG9tb2dlbmVvdXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MWJkZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dlb19ob21vZ2VuZW91cy5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBTaXplPiB2b2lkIGhvbW9nZW5lb3VzKHZvaWQpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgSG9tb2dlbmVvdXMuaAorICAqLworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplLFNpemU+IE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplLDEsIENvbE1ham9yPiBWZWN0b3JUeXBlOworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplKzEsU2l6ZT4gSE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplKzEsMT4gSFZlY3RvclR5cGU7CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUsU2l6ZSsxPiAgIFQxTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUrMSxTaXplKzE+IFQyTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUrMSxTaXplPiBUM01hdHJpeFR5cGU7CisKKyAgVmVjdG9yVHlwZSB2MCA9IFZlY3RvclR5cGU6OlJhbmRvbSgpLAorICAgICAgICAgICAgIG9uZXMgPSBWZWN0b3JUeXBlOjpPbmVzKCk7CisKKyAgSFZlY3RvclR5cGUgaHYwID0gSFZlY3RvclR5cGU6OlJhbmRvbSgpOworCisgIE1hdHJpeFR5cGUgbTAgPSBNYXRyaXhUeXBlOjpSYW5kb20oKTsKKworICBITWF0cml4VHlwZSBobTAgPSBITWF0cml4VHlwZTo6UmFuZG9tKCk7CisKKyAgaHYwIDw8IHYwLCAxOworICBWRVJJRllfSVNfQVBQUk9YKHYwLmhvbW9nZW5lb3VzKCksIGh2MCk7CisgIFZFUklGWV9JU19BUFBST1godjAsIGh2MC5obm9ybWFsaXplZCgpKTsKKworICBobTAgPDwgbTAsIG9uZXMudHJhbnNwb3NlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTAuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCksIGhtMCk7CisgIFZFUklGWV9JU19BUFBST1gobTAsIGhtMC5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSk7CisgIGhtMC5yb3coU2l6ZS0xKS5zZXRSYW5kb20oKTsKKyAgZm9yKGludCBqPTA7IGo8U2l6ZTsgKytqKQorICAgIG0wLmNvbChqKSA9IGhtMC5jb2woaikuaGVhZChTaXplKSAvIGhtMChTaXplLGopOworICBWRVJJRllfSVNfQVBQUk9YKG0wLCBobTAuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpOworCisgIFQxTWF0cml4VHlwZSB0MSA9IFQxTWF0cml4VHlwZTo6UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1godDEgKiAodjAuaG9tb2dlbmVvdXMoKS5ldmFsKCkpLCB0MSAqIHYwLmhvbW9nZW5lb3VzKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHQxICogKG0wLmNvbHdpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKSksIHQxICogbTAuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkpOworCisgIFQyTWF0cml4VHlwZSB0MiA9IFQyTWF0cml4VHlwZTo6UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1godDIgKiAodjAuaG9tb2dlbmVvdXMoKS5ldmFsKCkpLCB0MiAqIHYwLmhvbW9nZW5lb3VzKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHQyICogKG0wLmNvbHdpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKSksIHQyICogbTAuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkpOworCisgIFZFUklGWV9JU19BUFBST1goKHYwLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKSkgKiB0MiwKKyAgICAgICAgICAgICAgICAgICAgdjAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkgKiB0Mik7CisgICAgICAgICAgICAgICAgICAgIG0wLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkuZXZhbCgpKSAqIHQyLAorICAgICAgICAgICAgICAgICAgICBtMC50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKSAqIHQyKTsKKworICBUM01hdHJpeFR5cGUgdDMgPSBUM01hdHJpeFR5cGU6OlJhbmRvbSgpOworICBWRVJJRllfSVNfQVBQUk9YKCh2MC50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKS5ldmFsKCkpICogdDMsCisgICAgICAgICAgICAgICAgICAgIHYwLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpICogdDMpOworICBWRVJJRllfSVNfQVBQUk9YKChtMC50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKS5ldmFsKCkpICogdDMsCisgICAgICAgICAgICAgICAgICAgIG0wLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpICogdDMpOworCisgIC8vIHRlc3QgcHJvZHVjdCB3aXRoIGEgVHJhbnNmb3JtIG9iamVjdAorICBUcmFuc2Zvcm08U2NhbGFyLCBTaXplLCBBZmZpbmU+IGFmZjsKKyAgVHJhbnNmb3JtPFNjYWxhciwgU2l6ZSwgQWZmaW5lQ29tcGFjdD4gY2FmZjsKKyAgVHJhbnNmb3JtPFNjYWxhciwgU2l6ZSwgUHJvamVjdGl2ZT4gcHJvajsKKyAgTWF0cml4PFNjYWxhciwgU2l6ZSwgRHluYW1pYz4gICBwdHM7CisgIE1hdHJpeDxTY2FsYXIsIFNpemUrMSwgRHluYW1pYz4gcHRzMSwgcHRzMjsKKworICBhZmYuYWZmaW5lKCkuc2V0UmFuZG9tKCk7CisgIHByb2ogPSBjYWZmID0gYWZmOworICBwdHMuc2V0UmFuZG9tKFNpemUsaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMjApKTsKKyAgCisgIHB0czEgPSBwdHMuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCk7CisgIFZFUklGWV9JU19BUFBST1goYWZmICAqIHB0cy5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSwgKGFmZiAgKiBwdHMxKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1goY2FmZiAqIHB0cy5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSwgKGNhZmYgKiBwdHMxKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1gocHJvaiAqIHB0cy5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSwgKHByb2ogKiBwdHMxKSk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKChhZmYgICogcHRzMSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCksICBhZmYgICogcHRzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoY2FmZiAqIHB0czEpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpLCBjYWZmICogcHRzKTsKKyAgCisgIHB0czIgPSBwdHMxOworICBwdHMyLnJvdyhTaXplKS5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYWZmICAqIHB0czIpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpLCBhZmYgICogcHRzMi5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1goKGNhZmYgKiBwdHMyKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSwgY2FmZiAqIHB0czIuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKChwcm9qICogcHRzMikuY29sd2lzZSgpLmhub3JtYWxpemVkKCksIChwcm9qICogcHRzMi5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpOworfQorCit2b2lkIHRlc3RfZ2VvX2hvbW9nZW5lb3VzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSgoIGhvbW9nZW5lb3VzPGZsb2F0LDE+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCBob21vZ2VuZW91czxkb3VibGUsMz4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoIGhvbW9nZW5lb3VzPGRvdWJsZSw4PigpICkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dlb19oeXBlcnBsYW5lLmNwcCBiL3Rlc3QvZ2VvX2h5cGVycGxhbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzgwYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dlb19oeXBlcnBsYW5lLmNwcApAQCAtMCwwICsxLDE1NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL1FSPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBIeXBlcnBsYW5lVHlwZT4gdm9pZCBoeXBlcnBsYW5lKGNvbnN0IEh5cGVycGxhbmVUeXBlJiBfcGxhbmUpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgSHlwZXJwbGFuZS5oCisgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgSHlwZXJwbGFuZVR5cGU6OkluZGV4IEluZGV4OworICBjb25zdCBJbmRleCBkaW0gPSBfcGxhbmUuZGltKCk7CisgIGVudW0geyBPcHRpb25zID0gSHlwZXJwbGFuZVR5cGU6Ok9wdGlvbnMgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBIeXBlcnBsYW5lVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgSHlwZXJwbGFuZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiBNYXRyaXhUeXBlOworCisgIFZlY3RvclR5cGUgcDAgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKyAgVmVjdG9yVHlwZSBwMSA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOworCisgIFZlY3RvclR5cGUgbjAgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKS5ub3JtYWxpemVkKCk7CisgIFZlY3RvclR5cGUgbjEgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKS5ub3JtYWxpemVkKCk7CisKKyAgSHlwZXJwbGFuZVR5cGUgcGwwKG4wLCBwMCk7CisgIEh5cGVycGxhbmVUeXBlIHBsMShuMSwgcDEpOworICBIeXBlcnBsYW5lVHlwZSBwbDIgPSBwbDE7CisKKyAgU2NhbGFyIHMwID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIFZFUklGWV9JU19BUFBST1goIG4xLmRvdChuMSksIFNjYWxhcigxKSApOworCisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwwLmFic0Rpc3RhbmNlKHAwKSwgU2NhbGFyKDEpICk7CisgIFZFUklGWV9JU19BUFBST1goIHBsMS5zaWduZWREaXN0YW5jZShwMSArIG4xICogczApLCBzMCApOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHBsMS5zaWduZWREaXN0YW5jZShwbDEucHJvamVjdGlvbihwMCkpLCBTY2FsYXIoMSkgKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDEuYWJzRGlzdGFuY2UocDEgKyAgcGwxLm5vcm1hbCgpLnVuaXRPcnRob2dvbmFsKCkgKiBzMSksIFNjYWxhcigxKSApOworCisgIC8vIHRyYW5zZm9ybQorICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgIHsKKyAgICBNYXRyaXhUeXBlIHJvdCA9IE1hdHJpeFR5cGU6OlJhbmRvbShkaW0sZGltKS5ob3VzZWhvbGRlclFyKCkuaG91c2Vob2xkZXJRKCk7CisgICAgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gc2NhbGluZyhWZWN0b3JUeXBlOjpSYW5kb20oKSk7CisgICAgVHJhbnNsYXRpb248U2NhbGFyLEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gdHJhbnNsYXRpb24oVmVjdG9yVHlwZTo6UmFuZG9tKCkpOworCisgICAgcGwyID0gcGwxOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwyLnRyYW5zZm9ybShyb3QpLmFic0Rpc3RhbmNlKHJvdCAqIHAxKSwgU2NhbGFyKDEpICk7CisgICAgcGwyID0gcGwxOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwyLnRyYW5zZm9ybShyb3QsSXNvbWV0cnkpLmFic0Rpc3RhbmNlKHJvdCAqIHAxKSwgU2NhbGFyKDEpICk7CisgICAgcGwyID0gcGwxOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwyLnRyYW5zZm9ybShyb3Qqc2NhbGluZykuYWJzRGlzdGFuY2UoKHJvdCpzY2FsaW5nKSAqIHAxKSwgU2NhbGFyKDEpICk7CisgICAgcGwyID0gcGwxOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwyLnRyYW5zZm9ybShyb3Qqc2NhbGluZyp0cmFuc2xhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hYnNEaXN0YW5jZSgocm90KnNjYWxpbmcqdHJhbnNsYXRpb24pICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBwbDIgPSBwbDE7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCp0cmFuc2xhdGlvbixJc29tZXRyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hYnNEaXN0YW5jZSgocm90KnRyYW5zbGF0aW9uKSAqIHAxKSwgU2NhbGFyKDEpICk7CisgIH0KKworICAvLyBjYXN0aW5nCisgIGNvbnN0IGludCBEaW0gPSBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWU7CisgIHR5cGVkZWYgdHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxTY2FsYXI+Ojp0eXBlIE90aGVyU2NhbGFyOworICBIeXBlcnBsYW5lPE90aGVyU2NhbGFyLERpbSxPcHRpb25zPiBocDFmID0gcGwxLnRlbXBsYXRlIGNhc3Q8T3RoZXJTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxwbDEpOworICBIeXBlcnBsYW5lPFNjYWxhcixEaW0sT3B0aW9ucz4gaHAxZCA9IHBsMS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChocDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHBsMSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBsaW5lcygpCit7CisgIHR5cGVkZWYgSHlwZXJwbGFuZTxTY2FsYXIsIDI+IEhMaW5lOworICB0eXBlZGVmIFBhcmFtZXRyaXplZExpbmU8U2NhbGFyLCAyPiBQTGluZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMT4gVmVjdG9yOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBDb2VmZnNUeXBlOworCisgIGZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICB7CisgICAgVmVjdG9yIGNlbnRlciA9IFZlY3Rvcjo6UmFuZG9tKCk7CisgICAgVmVjdG9yIHUgPSBWZWN0b3I6OlJhbmRvbSgpOworICAgIFZlY3RvciB2ID0gVmVjdG9yOjpSYW5kb20oKTsKKyAgICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgIHdoaWxlIChpbnRlcm5hbDo6YWJzKGEtMSkgPCAxZS00KSBhID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgICAgd2hpbGUgKHUubm9ybSgpIDwgMWUtNCkgdSA9IFZlY3Rvcjo6UmFuZG9tKCk7CisgICAgd2hpbGUgKHYubm9ybSgpIDwgMWUtNCkgdiA9IFZlY3Rvcjo6UmFuZG9tKCk7CisKKyAgICBITGluZSBsaW5lX3UgPSBITGluZTo6VGhyb3VnaChjZW50ZXIgKyB1LCBjZW50ZXIgKyBhKnUpOworICAgIEhMaW5lIGxpbmVfdiA9IEhMaW5lOjpUaHJvdWdoKGNlbnRlciArIHYsIGNlbnRlciArIGEqdik7CisKKyAgICAvLyB0aGUgbGluZSBlcXVhdGlvbnMgc2hvdWxkIGJlIG5vcm1hbGl6ZWQgc28gdGhhdCBhXjIrYl4yPTEKKyAgICBWRVJJRllfSVNfQVBQUk9YKGxpbmVfdS5ub3JtYWwoKS5ub3JtKCksIFNjYWxhcigxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChsaW5lX3Yubm9ybWFsKCkubm9ybSgpLCBTY2FsYXIoMSkpOworCisgICAgVmVjdG9yIHJlc3VsdCA9IGxpbmVfdS5pbnRlcnNlY3Rpb24obGluZV92KTsKKworICAgIC8vIHRoZSBsaW5lcyBzaG91bGQgaW50ZXJzZWN0IGF0IHRoZSBwb2ludCB3ZSBjYWxsZWQgImNlbnRlciIKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCwgY2VudGVyKTsKKworICAgIC8vIGNoZWNrIGNvbnZlcnNpb25zIGJldHdlZW4gdHdvIHR5cGVzIG9mIGxpbmVzCisgICAgUExpbmUgcGwobGluZV91KTsgLy8gZ2NjIDMuMyB3aWxsIGNvbW1pdCBzdWljaWRlIGlmIHdlIGRvbid0IG5hbWUgdGhpcyB2YXJpYWJsZQorICAgIENvZWZmc1R5cGUgY29udmVydGVkX2NvZWZmcyA9IEhMaW5lKHBsKS5jb2VmZnMoKTsKKyAgICBjb252ZXJ0ZWRfY29lZmZzICo9IChsaW5lX3UuY29lZmZzKClbMF0pLyhjb252ZXJ0ZWRfY29lZmZzWzBdKTsKKyAgICBWRVJJRlkobGluZV91LmNvZWZmcygpLmlzQXBwcm94KGNvbnZlcnRlZF9jb2VmZnMpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgaHlwZXJwbGFuZV9hbGlnbm1lbnQoKQoreworICB0eXBlZGVmIEh5cGVycGxhbmU8U2NhbGFyLDMsQXV0b0FsaWduPiBQbGFuZTNhOworICB0eXBlZGVmIEh5cGVycGxhbmU8U2NhbGFyLDMsRG9udEFsaWduPiBQbGFuZTN1OworCisgIEVJR0VOX0FMSUdOMTYgU2NhbGFyIGFycmF5MVs0XTsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgYXJyYXkyWzRdOworICBFSUdFTl9BTElHTjE2IFNjYWxhciBhcnJheTNbNCsxXTsKKyAgU2NhbGFyKiBhcnJheTN1ID0gYXJyYXkzKzE7CisKKyAgUGxhbmUzYSAqcDEgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTEpKSBQbGFuZTNhOworICBQbGFuZTN1ICpwMiA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5MikpIFBsYW5lM3U7CisgIFBsYW5lM3UgKnAzID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkzdSkpIFBsYW5lM3U7CisgIAorICBwMS0+Y29lZmZzKCkuc2V0UmFuZG9tKCk7CisgICpwMiA9ICpwMTsKKyAgKnAzID0gKnAxOworCisgIFZFUklGWV9JU19BUFBST1gocDEtPmNvZWZmcygpLCBwMi0+Y29lZmZzKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHAxLT5jb2VmZnMoKSwgcDMtPmNvZWZmcygpKTsKKyAgCisgICNpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRSkgJiYgRUlHRU5fQUxJR05fU1RBVElDQUxMWQorICBpZihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpWZWN0b3JpemFibGUpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoKDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5M3UpKSBQbGFuZTNhKSk7CisgICNlbmRpZgorfQorCisKK3ZvaWQgdGVzdF9nZW9faHlwZXJwbGFuZSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGh5cGVycGxhbmUoSHlwZXJwbGFuZTxmbG9hdCwyPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBoeXBlcnBsYW5lKEh5cGVycGxhbmU8ZmxvYXQsMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggaHlwZXJwbGFuZShIeXBlcnBsYW5lPGZsb2F0LDMsRG9udEFsaWduPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBoeXBlcnBsYW5lX2FsaWdubWVudDxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBoeXBlcnBsYW5lKEh5cGVycGxhbmU8ZG91YmxlLDQ+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGh5cGVycGxhbmUoSHlwZXJwbGFuZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiw1PigpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBsaW5lczxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBsaW5lczxkb3VibGU+KCkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nZW9fb3J0aG9tZXRob2RzLmNwcCBiL3Rlc3QvZ2VvX29ydGhvbWV0aG9kcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzNmRhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ2VvX29ydGhvbWV0aG9kcy5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKworLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgR2VvbWV0cnkvT3J0aG9NZXRob2RzLmgKKyovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBvcnRob21ldGhvZHNfMygpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsNCwxPiBWZWN0b3I0OworCisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKKyAgICAgICAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpLAorICAgICAgICAgIHYyID0gVmVjdG9yMzo6UmFuZG9tKCk7CisKKyAgLy8gY3Jvc3MgcHJvZHVjdAorICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjEuY3Jvc3ModjIpLmRvdCh2MSksIFNjYWxhcigxKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MS5kb3QodjEuY3Jvc3ModjIpKSwgU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYxLmNyb3NzKHYyKS5kb3QodjIpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjIuZG90KHYxLmNyb3NzKHYyKSksIFNjYWxhcigxKSk7CisgIE1hdHJpeDMgbWF0MzsKKyAgbWF0MyA8PCB2MC5ub3JtYWxpemVkKCksCisgICAgICAgICAodjAuY3Jvc3ModjEpKS5ub3JtYWxpemVkKCksCisgICAgICAgICAodjAuY3Jvc3ModjEpLmNyb3NzKHYwKSkubm9ybWFsaXplZCgpOworICBWRVJJRlkobWF0My5pc1VuaXRhcnkoKSk7CisKKworICAvLyBjb2x3aXNlL3Jvd3dpc2UgY3Jvc3MgcHJvZHVjdAorICBtYXQzLnNldFJhbmRvbSgpOworICBWZWN0b3IzIHZlYzMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgTWF0cml4MyBtY3Jvc3M7CisgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsMik7CisgIG1jcm9zcyA9IG1hdDMuY29sd2lzZSgpLmNyb3NzKHZlYzMpOworICBWRVJJRllfSVNfQVBQUk9YKG1jcm9zcy5jb2woaSksIG1hdDMuY29sKGkpLmNyb3NzKHZlYzMpKTsKKyAgbWNyb3NzID0gbWF0My5yb3d3aXNlKCkuY3Jvc3ModmVjMyk7CisgIFZFUklGWV9JU19BUFBST1gobWNyb3NzLnJvdyhpKSwgbWF0My5yb3coaSkuY3Jvc3ModmVjMykpOworCisgIC8vIGNyb3NzMworICBWZWN0b3I0IHY0MCA9IFZlY3RvcjQ6OlJhbmRvbSgpLAorICAgICAgICAgIHY0MSA9IFZlY3RvcjQ6OlJhbmRvbSgpLAorICAgICAgICAgIHY0MiA9IFZlY3RvcjQ6OlJhbmRvbSgpOworICB2NDAudygpID0gdjQxLncoKSA9IHY0Mi53KCkgPSAwOworICB2NDIudGVtcGxhdGUgaGVhZDwzPigpID0gdjQwLnRlbXBsYXRlIGhlYWQ8Mz4oKS5jcm9zcyh2NDEudGVtcGxhdGUgaGVhZDwzPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2NDAuY3Jvc3MzKHY0MSksIHY0Mik7CisgIAorICAvLyBjaGVjayBtaXhlZCBwcm9kdWN0CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIDMsIDE+IFJlYWxWZWN0b3IzOworICBSZWFsVmVjdG9yMyBydjEgPSBSZWFsVmVjdG9yMzo6UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1godjEuY3Jvc3MocnYxLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpKSwgdjEuY3Jvc3MocnYxKSk7CisgIFZFUklGWV9JU19BUFBST1gocnYxLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLmNyb3NzKHYxKSwgcnYxLmNyb3NzKHYxKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFNpemU+IHZvaWQgb3J0aG9tZXRob2RzKGludCBzaXplPVNpemUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUsMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsU2l6ZT4gTWF0cml4M047CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplLDM+IE1hdHJpeE4zOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworCisgIFZlY3RvclR5cGUgdjAgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSk7CisKKyAgLy8gdW5pdE9ydGhvZ29uYWwKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYwLnVuaXRPcnRob2dvbmFsKCkuZG90KHYwKSwgU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MC51bml0T3J0aG9nb25hbCgpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CisKKyAgaWYgKHNpemU+PTMpCisgIHsKKyAgICB2MC50ZW1wbGF0ZSBoZWFkPDI+KCkuc2V0WmVybygpOworICAgIHYwLnRhaWwoc2l6ZS0yKS5zZXRSYW5kb20oKTsKKworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MC51bml0T3J0aG9nb25hbCgpLmRvdCh2MCksIFNjYWxhcigxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2MC51bml0T3J0aG9nb25hbCgpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CisgIH0KKworICAvLyBjb2x3aXNlL3Jvd3dpc2UgY3Jvc3MgcHJvZHVjdAorICBWZWN0b3IzIHZlYzMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxzaXplLTEpOworCisgIE1hdHJpeDNOIG1hdDNOKDMsc2l6ZSksIG1jcm9zczNOKDMsc2l6ZSk7CisgIG1hdDNOLnNldFJhbmRvbSgpOworICBtY3Jvc3MzTiA9IG1hdDNOLmNvbHdpc2UoKS5jcm9zcyh2ZWMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtY3Jvc3MzTi5jb2woaSksIG1hdDNOLmNvbChpKS5jcm9zcyh2ZWMzKSk7CisKKyAgTWF0cml4TjMgbWF0TjMoc2l6ZSwzKSwgbWNyb3NzTjMoc2l6ZSwzKTsKKyAgbWF0TjMuc2V0UmFuZG9tKCk7CisgIG1jcm9zc04zID0gbWF0TjMucm93d2lzZSgpLmNyb3NzKHZlYzMpOworICBWRVJJRllfSVNfQVBQUk9YKG1jcm9zc04zLnJvdyhpKSwgbWF0TjMucm93KGkpLmNyb3NzKHZlYzMpKTsKK30KKwordm9pZCB0ZXN0X2dlb19vcnRob21ldGhvZHMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBvcnRob21ldGhvZHNfMzxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBvcnRob21ldGhvZHNfMzxkb3VibGU+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggb3J0aG9tZXRob2RzXzM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIChvcnRob21ldGhvZHM8ZmxvYXQsMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggKG9ydGhvbWV0aG9kczxkb3VibGUsMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggKG9ydGhvbWV0aG9kczxmbG9hdCwzPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCAob3J0aG9tZXRob2RzPGRvdWJsZSwzPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCAob3J0aG9tZXRob2RzPGZsb2F0LDc+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIChvcnRob21ldGhvZHM8c3RkOjpjb21wbGV4PGRvdWJsZT4sOD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggKG9ydGhvbWV0aG9kczxmbG9hdCxEeW5hbWljPigzNikpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIChvcnRob21ldGhvZHM8ZG91YmxlLER5bmFtaWM+KDM1KSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nZW9fcGFyYW1ldHJpemVkbGluZS5jcHAgYi90ZXN0L2dlb19wYXJhbWV0cml6ZWRsaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFmODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nZW9fcGFyYW1ldHJpemVkbGluZS5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9RUj4KKwordGVtcGxhdGU8dHlwZW5hbWUgTGluZVR5cGU+IHZvaWQgcGFyYW1ldHJpemVkbGluZShjb25zdCBMaW5lVHlwZSYgX2xpbmUpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgUGFyYW1ldHJpemVkTGluZS5oCisgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgTGluZVR5cGU6OkluZGV4IEluZGV4OworICBjb25zdCBJbmRleCBkaW0gPSBfbGluZS5kaW0oKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBMaW5lVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIExpbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBMaW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTGluZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIEh5cGVycGxhbmU8U2NhbGFyLExpbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gSHlwZXJwbGFuZVR5cGU7CisKKyAgVmVjdG9yVHlwZSBwMCA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOworICBWZWN0b3JUeXBlIHAxID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CisKKyAgVmVjdG9yVHlwZSBkMCA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pLm5vcm1hbGl6ZWQoKTsKKworICBMaW5lVHlwZSBsMChwMCwgZDApOworCisgIFNjYWxhciBzMCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6YWJzKGludGVybmFsOjpyYW5kb208U2NhbGFyPigpKTsKKworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIGwwLmRpc3RhbmNlKHAwKSwgUmVhbFNjYWxhcigxKSApOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIGwwLmRpc3RhbmNlKHAwK3MwKmQwKSwgUmVhbFNjYWxhcigxKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAobDAucHJvamVjdGlvbihwMSktcDEpLm5vcm0oKSwgbDAuZGlzdGFuY2UocDEpICk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggbDAuZGlzdGFuY2UobDAucHJvamVjdGlvbihwMSkpLCBSZWFsU2NhbGFyKDEpICk7CisgIFZFUklGWV9JU19BUFBST1goIFNjYWxhcihsMC5kaXN0YW5jZSgocDArczAqZDApICsgZDAudW5pdE9ydGhvZ29uYWwoKSAqIHMxKSksIHMxICk7CisKKyAgLy8gY2FzdGluZworICBjb25zdCBpbnQgRGltID0gTGluZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lOworICB0eXBlZGVmIHR5cGVuYW1lIEdldERpZmZlcmVudFR5cGU8U2NhbGFyPjo6dHlwZSBPdGhlclNjYWxhcjsKKyAgUGFyYW1ldHJpemVkTGluZTxPdGhlclNjYWxhcixEaW0+IGhwMWYgPSBsMC50ZW1wbGF0ZSBjYXN0PE90aGVyU2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YKGhwMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksbDApOworICBQYXJhbWV0cml6ZWRMaW5lPFNjYWxhcixEaW0+IGhwMWQgPSBsMC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChocDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLGwwKTsKKworICAvLyBpbnRlcnNlY3Rpb25zCisgIFZlY3RvclR5cGUgcDIgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKKyAgVmVjdG9yVHlwZSBuMiA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pLm5vcm1hbGl6ZWQoKTsKKyAgSHlwZXJwbGFuZVR5cGUgaHAocDIsbjIpOworICBTY2FsYXIgdCA9IGwwLmludGVyc2VjdGlvblBhcmFtZXRlcihocCk7CisgIFZlY3RvclR5cGUgcGkgPSBsMC5wb2ludEF0KHQpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oaHAuc2lnbmVkRGlzdGFuY2UocGkpLCBSZWFsU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGwwLmRpc3RhbmNlKHBpKSwgUmVhbFNjYWxhcigxKSk7CisgIFZFUklGWV9JU19BUFBST1gobDAuaW50ZXJzZWN0aW9uUG9pbnQoaHApLCBwaSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBwYXJhbWV0cml6ZWRsaW5lX2FsaWdubWVudCgpCit7CisgIHR5cGVkZWYgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsNCxBdXRvQWxpZ24+IExpbmU0YTsKKyAgdHlwZWRlZiBQYXJhbWV0cml6ZWRMaW5lPFNjYWxhciw0LERvbnRBbGlnbj4gTGluZTR1OworCisgIEVJR0VOX0FMSUdOMTYgU2NhbGFyIGFycmF5MVs4XTsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgYXJyYXkyWzhdOworICBFSUdFTl9BTElHTjE2IFNjYWxhciBhcnJheTNbOCsxXTsKKyAgU2NhbGFyKiBhcnJheTN1ID0gYXJyYXkzKzE7CisKKyAgTGluZTRhICpwMSA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5MSkpIExpbmU0YTsKKyAgTGluZTR1ICpwMiA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5MikpIExpbmU0dTsKKyAgTGluZTR1ICpwMyA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5M3UpKSBMaW5lNHU7CisgIAorICBwMS0+b3JpZ2luKCkuc2V0UmFuZG9tKCk7CisgIHAxLT5kaXJlY3Rpb24oKS5zZXRSYW5kb20oKTsKKyAgKnAyID0gKnAxOworICAqcDMgPSAqcDE7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChwMS0+b3JpZ2luKCksIHAyLT5vcmlnaW4oKSk7CisgIFZFUklGWV9JU19BUFBST1gocDEtPm9yaWdpbigpLCBwMy0+b3JpZ2luKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHAxLT5kaXJlY3Rpb24oKSwgcDItPmRpcmVjdGlvbigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChwMS0+ZGlyZWN0aW9uKCksIHAzLT5kaXJlY3Rpb24oKSk7CisgIAorICAjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkUpICYmIEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkKKyAgaWYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCg6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTN1KSkgTGluZTRhKSk7CisgICNlbmRpZgorfQorCit2b2lkIHRlc3RfZ2VvX3BhcmFtZXRyaXplZGxpbmUoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBwYXJhbWV0cml6ZWRsaW5lKFBhcmFtZXRyaXplZExpbmU8ZmxvYXQsMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcGFyYW1ldHJpemVkbGluZShQYXJhbWV0cml6ZWRMaW5lPGZsb2F0LDM+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHBhcmFtZXRyaXplZGxpbmVfYWxpZ25tZW50PGZsb2F0PigpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHBhcmFtZXRyaXplZGxpbmUoUGFyYW1ldHJpemVkTGluZTxkb3VibGUsND4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcGFyYW1ldHJpemVkbGluZV9hbGlnbm1lbnQ8ZG91YmxlPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHBhcmFtZXRyaXplZGxpbmUoUGFyYW1ldHJpemVkTGluZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiw1PigpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dlb19xdWF0ZXJuaW9uLmNwcCBiL3Rlc3QvZ2VvX3F1YXRlcm5pb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjkyMjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dlb19xdWF0ZXJuaW9uLmNwcApAQCAtMCwwICsxLDI1NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBNYXRoaWV1IEdhdXRpZXIgPG1hdGhpZXUuZ2F1dGllckBjZWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBib3VuZGVkX2Fjb3MoVCB2KQoreworICB1c2luZyBzdGQ6OmFjb3M7CisgIHVzaW5nIHN0ZDo6bWluOworICB1c2luZyBzdGQ6Om1heDsKKyAgcmV0dXJuIGFjb3MoKG1heCkoVCgtMSksKG1pbikodixUKDEpKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0VHlwZT4gdm9pZCBjaGVja19zbGVycChjb25zdCBRdWF0VHlwZSYgcTAsIGNvbnN0IFF1YXRUeXBlJiBxMSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBRdWF0VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBQTsKKworICBTY2FsYXIgbGFyZ2VFcHMgPSB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCk7CisKKyAgU2NhbGFyIHRoZXRhX3RvdCA9IEFBKHExKnEwLmludmVyc2UoKSkuYW5nbGUoKTsKKyAgaWYodGhldGFfdG90Pk1fUEkpCisgICAgdGhldGFfdG90ID0gMi4qTV9QSS10aGV0YV90b3Q7CisgIGZvcihTY2FsYXIgdD0wOyB0PD0xLjAwMTsgdCs9MC4xKQorICB7CisgICAgUXVhdFR5cGUgcSA9IHEwLnNsZXJwKHQscTEpOworICAgIFNjYWxhciB0aGV0YSA9IEFBKHEqcTAuaW52ZXJzZSgpKS5hbmdsZSgpOworICAgIFZFUklGWShpbnRlcm5hbDo6YWJzKHEubm9ybSgpIC0gMSkgPCBsYXJnZUVwcyk7CisgICAgaWYodGhldGFfdG90PT0wKSAgVkVSSUZZKHRoZXRhX3RvdD09MCk7CisgICAgZWxzZSAgICAgICAgICAgICAgVkVSSUZZKGludGVybmFsOjphYnModGhldGEvdGhldGFfdG90IC0gdCkgPCBsYXJnZUVwcyk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucz4gdm9pZCBxdWF0ZXJuaW9uKHZvaWQpCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgUXVhdGVybmlvbi5oCisgICovCisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQsMT4gVmVjdG9yNDsKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcixPcHRpb25zPiBRdWF0ZXJuaW9ueDsKKyAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXN4OworCisgIFNjYWxhciBsYXJnZUVwcyA9IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKTsKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhcixmbG9hdD46OnZhbHVlKQorICAgIGxhcmdlRXBzID0gMWUtM2Y7CisKKyAgU2NhbGFyIGVwcyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKDFlLTIpOworCisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKKyAgICAgICAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpLAorICAgICAgICAgIHYyID0gVmVjdG9yMzo6UmFuZG9tKCksCisgICAgICAgICAgdjMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKworICBTY2FsYXIgIGEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLVNjYWxhcihNX1BJKSwgU2NhbGFyKE1fUEkpKSwKKyAgICAgICAgICBiID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC1TY2FsYXIoTV9QSSksIFNjYWxhcihNX1BJKSk7CisKKyAgLy8gUXVhdGVybmlvbjogSWRlbnRpdHkoKSwgc2V0SWRlbnRpdHkoKTsKKyAgUXVhdGVybmlvbnggcTEsIHEyOworICBxMi5zZXRJZGVudGl0eSgpOworICBWRVJJRllfSVNfQVBQUk9YKFF1YXRlcm5pb254KFF1YXRlcm5pb254OjpJZGVudGl0eSgpKS5jb2VmZnMoKSwgcTIuY29lZmZzKCkpOworICBxMS5jb2VmZnMoKS5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMS5jb2VmZnMoKSwgKHExKnEyKS5jb2VmZnMoKSk7CisKKyAgLy8gY29uY2F0ZW5hdGlvbgorICBxMSAqPSBxMjsKKworICBxMSA9IEFuZ2xlQXhpc3goYSwgdjAubm9ybWFsaXplZCgpKTsKKyAgcTIgPSBBbmdsZUF4aXN4KGEsIHYxLm5vcm1hbGl6ZWQoKSk7CisKKyAgLy8gYW5ndWxhciBkaXN0YW5jZQorICBTY2FsYXIgcmVmYW5nbGUgPSBpbnRlcm5hbDo6YWJzKEFuZ2xlQXhpc3gocTEuaW52ZXJzZSgpKnEyKS5hbmdsZSgpKTsKKyAgaWYgKHJlZmFuZ2xlPlNjYWxhcihNX1BJKSkKKyAgICByZWZhbmdsZSA9IFNjYWxhcigyKSpTY2FsYXIoTV9QSSkgLSByZWZhbmdsZTsKKworICBpZigocTEuY29lZmZzKCktcTIuY29lZmZzKCkpLm5vcm0oKSA+IDEwKmxhcmdlRXBzKQorICB7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGludGVybmFsOjphYnMocTEuYW5ndWxhckRpc3RhbmNlKHEyKSAtIHJlZmFuZ2xlKSwgU2NhbGFyKDEpKTsKKyAgfQorCisgIC8vIHJvdGF0aW9uIG1hdHJpeCBjb252ZXJzaW9uCisgIFZFUklGWV9JU19BUFBST1gocTEgKiB2MiwgcTEudG9Sb3RhdGlvbk1hdHJpeCgpICogdjIpOworICBWRVJJRllfSVNfQVBQUk9YKHExICogcTIgKiB2MiwKKyAgICBxMS50b1JvdGF0aW9uTWF0cml4KCkgKiBxMi50b1JvdGF0aW9uTWF0cml4KCkgKiB2Mik7CisKKyAgVkVSSUZZKCAgKHEyKnExKS5pc0FwcHJveChxMSpxMiwgbGFyZ2VFcHMpCisgICAgICAgIHx8ICEocTIgKiBxMSAqIHYyKS5pc0FwcHJveChxMS50b1JvdGF0aW9uTWF0cml4KCkgKiBxMi50b1JvdGF0aW9uTWF0cml4KCkgKiB2MikpOworCisgIHEyID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworICBWRVJJRllfSVNfQVBQUk9YKHExKnYxLHEyKnYxKTsKKworCisgIC8vIGFuZ2xlLWF4aXMgY29udmVyc2lvbgorICBBbmdsZUF4aXN4IGFhID0gQW5nbGVBeGlzeChxMSk7CisgIFZFUklGWV9JU19BUFBST1gocTEgKiB2MSwgUXVhdGVybmlvbngoYWEpICogdjEpOworCisgIC8vIERvIG5vdCBleGVjdXRlIHRoZSB0ZXN0IGlmIHRoZSByb3RhdGlvbiBhbmdsZSBpcyBhbG1vc3QgemVybywgb3IKKyAgLy8gdGhlIHJvdGF0aW9uIGF4aXMgYW5kIHYxIGFyZSBhbG1vc3QgcGFyYWxsZWwuCisgIGlmIChpbnRlcm5hbDo6YWJzKGFhLmFuZ2xlKCkpID4gNSp0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkKKyAgICAgICYmIChhYS5heGlzKCkgLSB2MS5ub3JtYWxpemVkKCkpLm5vcm0oKSA8IDEuOTkKKyAgICAgICYmIChhYS5heGlzKCkgKyB2MS5ub3JtYWxpemVkKCkpLm5vcm0oKSA8IDEuOTkpIAorICB7CisgICAgVkVSSUZZX0lTX05PVF9BUFBST1gocTEgKiB2MSwgUXVhdGVybmlvbngoQW5nbGVBeGlzeChhYS5hbmdsZSgpKjIsYWEuYXhpcygpKSkgKiB2MSk7CisgIH0KKworICAvLyBmcm9tIHR3byB2ZWN0b3IgY3JlYXRpb24KKyAgVkVSSUZZX0lTX0FQUFJPWCggdjIubm9ybWFsaXplZCgpLChxMi5zZXRGcm9tVHdvVmVjdG9ycyh2MSwgdjIpKnYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCB2MS5ub3JtYWxpemVkKCksKHEyLnNldEZyb21Ud29WZWN0b3JzKHYxLCB2MSkqdjEpLm5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1goLXYxLm5vcm1hbGl6ZWQoKSwocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsLXYxKSp2MSkubm9ybWFsaXplZCgpKTsKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhcixkb3VibGU+Ojp2YWx1ZSkKKyAgeworICAgIHYzID0gKHYxLmFycmF5KCkrZXBzKS5tYXRyaXgoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCB2My5ub3JtYWxpemVkKCksKHEyLnNldEZyb21Ud29WZWN0b3JzKHYxLCB2MykqdjEpLm5vcm1hbGl6ZWQoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgtdjMubm9ybWFsaXplZCgpLChxMi5zZXRGcm9tVHdvVmVjdG9ycyh2MSwtdjMpKnYxKS5ub3JtYWxpemVkKCkpOworICB9CisKKyAgLy8gZnJvbSB0d28gdmVjdG9yIGNyZWF0aW9uIHN0YXRpYyBmdW5jdGlvbgorICBWRVJJRllfSVNfQVBQUk9YKCB2Mi5ub3JtYWxpemVkKCksKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwgdjIpKnYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCB2MS5ub3JtYWxpemVkKCksKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwgdjEpKnYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKC12MS5ub3JtYWxpemVkKCksKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwtdjEpKnYxKS5ub3JtYWxpemVkKCkpOworICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLGRvdWJsZT46OnZhbHVlKQorICB7CisgICAgdjMgPSAodjEuYXJyYXkoKStlcHMpLm1hdHJpeCgpOworICAgIFZFUklGWV9JU19BUFBST1goIHYzLm5vcm1hbGl6ZWQoKSwoUXVhdGVybmlvbng6OkZyb21Ud29WZWN0b3JzKHYxLCB2MykqdjEpLm5vcm1hbGl6ZWQoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgtdjMubm9ybWFsaXplZCgpLChRdWF0ZXJuaW9ueDo6RnJvbVR3b1ZlY3RvcnModjEsLXYzKSp2MSkubm9ybWFsaXplZCgpKTsKKyAgfQorCisgIC8vIGludmVyc2UgYW5kIGNvbmp1Z2F0ZQorICBWRVJJRllfSVNfQVBQUk9YKHExICogKHExLmludmVyc2UoKSAqIHYxKSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHExICogKHExLmNvbmp1Z2F0ZSgpICogdjEpLCB2MSk7CisKKyAgLy8gdGVzdCBjYXN0aW5nCisgIFF1YXRlcm5pb248ZmxvYXQ+IHExZiA9IHExLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1gocTFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHExKTsKKyAgUXVhdGVybmlvbjxkb3VibGU+IHExZCA9IHExLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKHExZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxxMSk7CisKKyAgLy8gdGVzdCBidWcgMzY5IC0gaW1wcm9wZXIgYWxpZ25tZW50LgorICBRdWF0ZXJuaW9ueCAqcSA9IG5ldyBRdWF0ZXJuaW9ueDsKKyAgZGVsZXRlIHE7CisKKyAgcTEgPSBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSk7CisgIHEyID0gQW5nbGVBeGlzeChiLCB2MS5ub3JtYWxpemVkKCkpOworICBjaGVja19zbGVycChxMSxxMik7CisKKyAgcTEgPSBBbmdsZUF4aXN4KGIsIHYxLm5vcm1hbGl6ZWQoKSk7CisgIHEyID0gQW5nbGVBeGlzeChiK01fUEksIHYxLm5vcm1hbGl6ZWQoKSk7CisgIGNoZWNrX3NsZXJwKHExLHEyKTsKKworICBxMSA9IEFuZ2xlQXhpc3goYiwgIHYxLm5vcm1hbGl6ZWQoKSk7CisgIHEyID0gQW5nbGVBeGlzeCgtYiwgLXYxLm5vcm1hbGl6ZWQoKSk7CisgIGNoZWNrX3NsZXJwKHExLHEyKTsKKworICBxMS5jb2VmZnMoKSA9IFZlY3RvcjQ6OlJhbmRvbSgpLm5vcm1hbGl6ZWQoKTsKKyAgcTIuY29lZmZzKCkgPSAtcTEuY29lZmZzKCk7CisgIGNoZWNrX3NsZXJwKHExLHEyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIG1hcFF1YXRlcm5pb24odm9pZCl7CisgIHR5cGVkZWYgTWFwPFF1YXRlcm5pb248U2NhbGFyPiwgQWxpZ25lZD4gTVF1YXRlcm5pb25BOworICB0eXBlZGVmIE1hcDxRdWF0ZXJuaW9uPFNjYWxhcj4gPiBNUXVhdGVybmlvblVBOworICB0eXBlZGVmIE1hcDxjb25zdCBRdWF0ZXJuaW9uPFNjYWxhcj4gPiBNQ1F1YXRlcm5pb25VQTsKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcj4gUXVhdGVybmlvbng7CisKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgYXJyYXkxWzRdOworICBFSUdFTl9BTElHTjE2IFNjYWxhciBhcnJheTJbNF07CisgIEVJR0VOX0FMSUdOMTYgU2NhbGFyIGFycmF5M1s0KzFdOworICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IGFycmF5MysxOworCisvLyAgc3RkOjpjZXJyIDw8IGFycmF5MSA8PCAiICIgPDwgYXJyYXkyIDw8ICIgIiA8PCBhcnJheTMgPDwgIlxuIjsKKyAgTVF1YXRlcm5pb25BKGFycmF5MSkuY29lZmZzKCkuc2V0UmFuZG9tKCk7CisgIChNUXVhdGVybmlvbkEoYXJyYXkyKSkgPSBNUXVhdGVybmlvbkEoYXJyYXkxKTsKKyAgKE1RdWF0ZXJuaW9uVUEoYXJyYXkzdW5hbGlnbmVkKSkgPSBNUXVhdGVybmlvbkEoYXJyYXkxKTsKKworICBRdWF0ZXJuaW9ueCBxMSA9IE1RdWF0ZXJuaW9uQShhcnJheTEpOworICBRdWF0ZXJuaW9ueCBxMiA9IE1RdWF0ZXJuaW9uQShhcnJheTIpOworICBRdWF0ZXJuaW9ueCBxMyA9IE1RdWF0ZXJuaW9uVUEoYXJyYXkzdW5hbGlnbmVkKTsKKyAgUXVhdGVybmlvbnggcTQgPSBNQ1F1YXRlcm5pb25VQShhcnJheTN1bmFsaWduZWQpOworCisgIFZFUklGWV9JU19BUFBST1gocTEuY29lZmZzKCksIHEyLmNvZWZmcygpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMS5jb2VmZnMoKSwgcTMuY29lZmZzKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHE0LmNvZWZmcygpLCBxMy5jb2VmZnMoKSk7CisgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkUKKyAgaWYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChNUXVhdGVybmlvbkEoYXJyYXkzdW5hbGlnbmVkKSkpOworICAjZW5kaWYKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHF1YXRlcm5pb25BbGlnbm1lbnQodm9pZCl7CisgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXIsQXV0b0FsaWduPiBRdWF0ZXJuaW9uQTsKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcixEb250QWxpZ24+IFF1YXRlcm5pb25VQTsKKworICBFSUdFTl9BTElHTjE2IFNjYWxhciBhcnJheTFbNF07CisgIEVJR0VOX0FMSUdOMTYgU2NhbGFyIGFycmF5Mls0XTsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgYXJyYXkzWzQrMV07CisgIFNjYWxhciogYXJyYXl1bmFsaWduZWQgPSBhcnJheTMrMTsKKworICBRdWF0ZXJuaW9uQSAqcTEgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTEpKSBRdWF0ZXJuaW9uQTsKKyAgUXVhdGVybmlvblVBICpxMiA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5MikpIFF1YXRlcm5pb25VQTsKKyAgUXVhdGVybmlvblVBICpxMyA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5dW5hbGlnbmVkKSkgUXVhdGVybmlvblVBOworCisgIHExLT5jb2VmZnMoKS5zZXRSYW5kb20oKTsKKyAgKnEyID0gKnExOworICAqcTMgPSAqcTE7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChxMS0+Y29lZmZzKCksIHEyLT5jb2VmZnMoKSk7CisgIFZFUklGWV9JU19BUFBST1gocTEtPmNvZWZmcygpLCBxMy0+Y29lZmZzKCkpOworICAjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkUpICYmIEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkKKyAgaWYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCg6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheXVuYWxpZ25lZCkpIFF1YXRlcm5pb25BKSk7CisgICNlbmRpZgorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+IHZvaWQgY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoY29uc3QgUGxhaW5PYmplY3RUeXBlJikKK3sKKyAgLy8gdGhlcmUncyBhIGxvdCB0aGF0IHdlIGNhbid0IHRlc3QgaGVyZSB3aGlsZSBzdGlsbCBoYXZpbmcgdGhpcyB0ZXN0IGNvbXBpbGUhCisgIC8vIHRoZSBvbmx5IHBvc3NpYmxlIGFwcHJvYWNoIHdvdWxkIGJlIHRvIHJ1biBhIHNjcmlwdCB0cnlpbmcgdG8gY29tcGlsZSBzdHVmZiBhbmQgY2hlY2tpbmcgdGhhdCBpdCBmYWlscy4KKyAgLy8gQ01ha2UgY2FuIGhlbHAgd2l0aCB0aGF0LgorCisgIC8vIHZlcmlmeSB0aGF0IG1hcC10by1jb25zdCBkb24ndCBoYXZlIEx2YWx1ZUJpdAorICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Q8UGxhaW5PYmplY3RUeXBlPjo6dHlwZSBDb25zdFBsYWluT2JqZWN0VHlwZTsKKyAgVkVSSUZZKCAhKGludGVybmFsOjp0cmFpdHM8TWFwPENvbnN0UGxhaW5PYmplY3RUeXBlPiA+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKKyAgVkVSSUZZKCAhKGludGVybmFsOjp0cmFpdHM8TWFwPENvbnN0UGxhaW5PYmplY3RUeXBlLCBBbGlnbmVkPiA+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKKyAgVkVSSUZZKCAhKE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZT46OkZsYWdzICYgTHZhbHVlQml0KSApOworICBWRVJJRlkoICEoTWFwPENvbnN0UGxhaW5PYmplY3RUeXBlLCBBbGlnbmVkPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7Cit9CisKK3ZvaWQgdGVzdF9nZW9fcXVhdGVybmlvbigpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoKCBxdWF0ZXJuaW9uPGZsb2F0LEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoUXVhdGVybmlvbmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoIHF1YXRlcm5pb248ZG91YmxlLEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoUXVhdGVybmlvbmQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoIHF1YXRlcm5pb248ZmxvYXQsRG9udEFsaWduPigpICkpOworICAgIENBTExfU1VCVEVTVF80KCggcXVhdGVybmlvbjxkb3VibGUsRG9udEFsaWduPigpICkpOworICAgIENBTExfU1VCVEVTVF81KCggcXVhdGVybmlvbkFsaWdubWVudDxmbG9hdD4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoIHF1YXRlcm5pb25BbGlnbm1lbnQ8ZG91YmxlPigpICkpOworICAgIENBTExfU1VCVEVTVF8xKCBtYXBRdWF0ZXJuaW9uPGZsb2F0PigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hcFF1YXRlcm5pb248ZG91YmxlPigpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ2VvX3RyYW5zZm9ybWF0aW9ucy5jcHAgYi90ZXN0L2dlb190cmFuc2Zvcm1hdGlvbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDY1YWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dlb190cmFuc2Zvcm1hdGlvbnMuY3BwCkBAIC0wLDAgKzEsNDg3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxFaWdlbi9MVT4KKyNpbmNsdWRlIDxFaWdlbi9TVkQ+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGUsIGludCBPcHRpb25zPiB2b2lkIG5vbl9wcm9qZWN0aXZlX29ubHkoKQoreworICAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgQ3Jvc3MuaCBRdWF0ZXJuaW9uLmgsIFRyYW5zZm9ybS5jcHAKKyAgKi8KKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMj4gTWF0cml4MjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQsND4gTWF0cml4NDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMT4gVmVjdG9yMjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQsMT4gVmVjdG9yNDsKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcj4gUXVhdGVybmlvbng7CisgIHR5cGVkZWYgQW5nbGVBeGlzPFNjYWxhcj4gQW5nbGVBeGlzeDsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLDIsTW9kZSxPcHRpb25zPiBUcmFuc2Zvcm0yOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMyxNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybTM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwyLElzb21ldHJ5LE9wdGlvbnM+IElzb21ldHJ5MjsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLDMsSXNvbWV0cnksT3B0aW9ucz4gSXNvbWV0cnkzOworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybTM6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBEaWFnb25hbE1hdHJpeDxTY2FsYXIsMj4gQWxpZ25lZFNjYWxpbmcyOworICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhciwzPiBBbGlnbmVkU2NhbGluZzM7CisgIHR5cGVkZWYgVHJhbnNsYXRpb248U2NhbGFyLDI+IFRyYW5zbGF0aW9uMjsKKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsMz4gVHJhbnNsYXRpb24zOworCisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKKyAgICAgICAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpOworCisgIFRyYW5zZm9ybTMgdDAsIHQxLCB0MjsKKworICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKE1fUEkpLCBTY2FsYXIoTV9QSSkpOworCisgIFF1YXRlcm5pb254IHExLCBxMjsKKworICBxMSA9IEFuZ2xlQXhpc3goYSwgdjAubm9ybWFsaXplZCgpKTsKKworICB0MCA9IFRyYW5zZm9ybTM6OklkZW50aXR5KCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIFRyYW5zZm9ybTM6Ok1hdHJpeFR5cGU6OklkZW50aXR5KCkpOworCisgIHQwLmxpbmVhcigpID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworCisgIHYwIDw8IDUwLCAyLCAxOworICB0MC5zY2FsZSh2MCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCggKHQwICogVmVjdG9yMygxLDAsMCkpLnRlbXBsYXRlIGhlYWQ8Mz4oKS5ub3JtKCksIHYwLngoKSk7CisKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDEuc2V0SWRlbnRpdHkoKTsKKyAgdjEgPDwgMSwgMiwgMzsKKyAgdDAubGluZWFyKCkgPSBxMS50b1JvdGF0aW9uTWF0cml4KCk7CisgIHQwLnByZXRyYW5zbGF0ZSh2MCk7CisgIHQwLnNjYWxlKHYxKTsKKyAgdDEubGluZWFyKCkgPSBxMS5jb25qdWdhdGUoKS50b1JvdGF0aW9uTWF0cml4KCk7CisgIHQxLnByZXNjYWxlKHYxLmN3aXNlSW52ZXJzZSgpKTsKKyAgdDEudHJhbnNsYXRlKC12MCk7CisKKyAgVkVSSUZZKCh0MCAqIHQxKS5tYXRyaXgoKS5pc0lkZW50aXR5KHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworCisgIHQxLmZyb21Qb3NpdGlvbk9yaWVudGF0aW9uU2NhbGUodjAsIHExLCB2MSk7CisgIFZFUklGWV9JU19BUFBST1godDEubWF0cml4KCksIHQwLm1hdHJpeCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MSp2MSwgdDAqdjEpOworCisgIC8vIHRyYW5zbGF0aW9uICogdmVjdG9yCisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnRyYW5zbGF0ZSh2MCk7CisgIFZFUklGWV9JU19BUFBST1goKHQwICogdjEpLnRlbXBsYXRlIGhlYWQ8Mz4oKSwgVHJhbnNsYXRpb24zKHYwKSAqIHYxKTsKKworICAvLyBBbGlnbmVkU2NhbGluZyAqIHZlY3RvcgorICB0MC5zZXRJZGVudGl0eSgpOworICB0MC5zY2FsZSh2MCk7CisgIFZFUklGWV9JU19BUFBST1goKHQwICogdjEpLnRlbXBsYXRlIGhlYWQ8Mz4oKSwgQWxpZ25lZFNjYWxpbmczKHYwKSAqIHYxKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+IHZvaWQgdHJhbnNmb3JtYXRpb25zKCkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBDcm9zcy5oIFF1YXRlcm5pb24uaCwgVHJhbnNmb3JtLmNwcAorICAqLworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwyPiBNYXRyaXgyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsNCw0PiBNYXRyaXg0OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwxPiBWZWN0b3IyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsNCwxPiBWZWN0b3I0OworICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9ueDsKKyAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXN4OworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMixNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybTI7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwzLE1vZGUsT3B0aW9ucz4gVHJhbnNmb3JtMzsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLDIsSXNvbWV0cnksT3B0aW9ucz4gSXNvbWV0cnkyOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMyxJc29tZXRyeSxPcHRpb25zPiBJc29tZXRyeTM7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtMzo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhciwyPiBBbGlnbmVkU2NhbGluZzI7CisgIHR5cGVkZWYgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLDM+IEFsaWduZWRTY2FsaW5nMzsKKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsMj4gVHJhbnNsYXRpb24yOworICB0eXBlZGVmIFRyYW5zbGF0aW9uPFNjYWxhciwzPiBUcmFuc2xhdGlvbjM7CisKKyAgVmVjdG9yMyB2MCA9IFZlY3RvcjM6OlJhbmRvbSgpLAorICAgICAgICAgIHYxID0gVmVjdG9yMzo6UmFuZG9tKCk7CisgIE1hdHJpeDMgbWF0cm90MSwgbTsKKworICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKE1fUEkpLCBTY2FsYXIoTV9QSSkpOworICBTY2FsYXIgczAgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHYwLCBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSkgKiB2MCk7CisgIFZFUklGWV9JU19BUFBST1goLXYwLCBBbmdsZUF4aXN4KFNjYWxhcihNX1BJKSwgdjAudW5pdE9ydGhvZ29uYWwoKSkgKiB2MCk7CisgIFZFUklGWV9JU19BUFBST1goaW50ZXJuYWw6OmNvcyhhKSp2MC5zcXVhcmVkTm9ybSgpLCB2MC5kb3QoQW5nbGVBeGlzeChhLCB2MC51bml0T3J0aG9nb25hbCgpKSAqIHYwKSk7CisgIG0gPSBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSkudG9Sb3RhdGlvbk1hdHJpeCgpLmFkam9pbnQoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXgzOjpJZGVudGl0eSgpLCBtICogQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXgzOjpJZGVudGl0eSgpLCBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSkgKiBtKTsKKworICBRdWF0ZXJuaW9ueCBxMSwgcTI7CisgIHExID0gQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpOworICBxMiA9IEFuZ2xlQXhpc3goYSwgdjEubm9ybWFsaXplZCgpKTsKKworICAvLyByb3RhdGlvbiBtYXRyaXggY29udmVyc2lvbgorICBtYXRyb3QxID0gQW5nbGVBeGlzeChTY2FsYXIoMC4xKSwgVmVjdG9yMzo6VW5pdFgoKSkKKyAgICAgICAgICAqIEFuZ2xlQXhpc3goU2NhbGFyKDAuMiksIFZlY3RvcjM6OlVuaXRZKCkpCisgICAgICAgICAgKiBBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzOjpVbml0WigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRyb3QxICogdjEsCisgICAgICAgQW5nbGVBeGlzeChTY2FsYXIoMC4xKSwgVmVjdG9yMygxLDAsMCkpLnRvUm90YXRpb25NYXRyaXgoKQorICAgICogKEFuZ2xlQXhpc3goU2NhbGFyKDAuMiksIFZlY3RvcjMoMCwxLDApKS50b1JvdGF0aW9uTWF0cml4KCkKKyAgICAqIChBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzKDAsMCwxKSkudG9Sb3RhdGlvbk1hdHJpeCgpICogdjEpKSk7CisKKyAgLy8gYW5nbGUtYXhpcyBjb252ZXJzaW9uCisgIEFuZ2xlQXhpc3ggYWEgPSBBbmdsZUF4aXN4KHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHYxLCBRdWF0ZXJuaW9ueChhYSkgKiB2MSk7CisgIFZFUklGWV9JU19OT1RfQVBQUk9YKHExICogdjEsIFF1YXRlcm5pb254KEFuZ2xlQXhpc3goYWEuYW5nbGUoKSoyLGFhLmF4aXMoKSkpICogdjEpOworCisgIGFhLmZyb21Sb3RhdGlvbk1hdHJpeChhYS50b1JvdGF0aW9uTWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHExICogdjEsIFF1YXRlcm5pb254KGFhKSAqIHYxKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1gocTEgKiB2MSwgUXVhdGVybmlvbngoQW5nbGVBeGlzeChhYS5hbmdsZSgpKjIsYWEuYXhpcygpKSkgKiB2MSk7CisKKyAgLy8gQW5nbGVBeGlzCisgIFZFUklGWV9JU19BUFBST1goQW5nbGVBeGlzeChhLHYxLm5vcm1hbGl6ZWQoKSkudG9Sb3RhdGlvbk1hdHJpeCgpLAorICAgIFF1YXRlcm5pb254KEFuZ2xlQXhpc3goYSx2MS5ub3JtYWxpemVkKCkpKS50b1JvdGF0aW9uTWF0cml4KCkpOworCisgIEFuZ2xlQXhpc3ggYWExOworICBtID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOworICBhYTEgPSBtOworICBWRVJJRllfSVNfQVBQUk9YKEFuZ2xlQXhpc3gobSkudG9Sb3RhdGlvbk1hdHJpeCgpLAorICAgIFF1YXRlcm5pb254KG0pLnRvUm90YXRpb25NYXRyaXgoKSk7CisKKyAgLy8gVHJhbnNmb3JtCisgIC8vIFRPRE8gY29tcGxldGUgdGhlIHRlc3RzICEKKyAgYSA9IDA7CisgIHdoaWxlIChpbnRlcm5hbDo6YWJzKGEpPFNjYWxhcigwLjEpKQorICAgIGEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLVNjYWxhcigwLjQpKlNjYWxhcihNX1BJKSwgU2NhbGFyKDAuNCkqU2NhbGFyKE1fUEkpKTsKKyAgcTEgPSBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSk7CisgIFRyYW5zZm9ybTMgdDAsIHQxLCB0MjsKKworICAvLyBmaXJzdCB0ZXN0IHNldElkZW50aXR5KCkgYW5kIElkZW50aXR5KCkKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgVHJhbnNmb3JtMzo6TWF0cml4VHlwZTo6SWRlbnRpdHkoKSk7CisgIHQwLm1hdHJpeCgpLnNldFplcm8oKTsKKyAgdDAgPSBUcmFuc2Zvcm0zOjpJZGVudGl0eSgpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCBUcmFuc2Zvcm0zOjpNYXRyaXhUeXBlOjpJZGVudGl0eSgpKTsKKworICB0MC5zZXRJZGVudGl0eSgpOworICB0MS5zZXRJZGVudGl0eSgpOworICB2MSA8PCAxLCAyLCAzOworICB0MC5saW5lYXIoKSA9IHExLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgdDAucHJldHJhbnNsYXRlKHYwKTsKKyAgdDAuc2NhbGUodjEpOworICB0MS5saW5lYXIoKSA9IHExLmNvbmp1Z2F0ZSgpLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgdDEucHJlc2NhbGUodjEuY3dpc2VJbnZlcnNlKCkpOworICB0MS50cmFuc2xhdGUoLXYwKTsKKworICBWRVJJRlkoKHQwICogdDEpLm1hdHJpeCgpLmlzSWRlbnRpdHkodGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisKKyAgdDEuZnJvbVBvc2l0aW9uT3JpZW50YXRpb25TY2FsZSh2MCwgcTEsIHYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MS5tYXRyaXgoKSwgdDAubWF0cml4KCkpOworCisgIHQwLnNldElkZW50aXR5KCk7IHQwLnNjYWxlKHYwKS5yb3RhdGUocTEudG9Sb3RhdGlvbk1hdHJpeCgpKTsKKyAgdDEuc2V0SWRlbnRpdHkoKTsgdDEuc2NhbGUodjApLnJvdGF0ZShxMSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICB0MC5zZXRJZGVudGl0eSgpOyB0MC5zY2FsZSh2MCkucm90YXRlKEFuZ2xlQXhpc3gocTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIFZFUklGWV9JU19BUFBST1godDAuc2NhbGUoYSkubWF0cml4KCksIHQxLnNjYWxlKFZlY3RvcjM6OkNvbnN0YW50KGEpKS5tYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1godDAucHJlc2NhbGUoYSkubWF0cml4KCksIHQxLnByZXNjYWxlKFZlY3RvcjM6OkNvbnN0YW50KGEpKS5tYXRyaXgoKSk7CisKKyAgLy8gTW9yZSB0cmFuc2Zvcm0gY29uc3RydWN0b3JzLCBvcGVyYXRvcj0sIG9wZXJhdG9yKj0KKworICBNYXRyaXgzIG1hdDMgPSBNYXRyaXgzOjpSYW5kb20oKTsKKyAgTWF0cml4NCBtYXQ0OworICBtYXQ0IDw8IG1hdDMgLCBWZWN0b3IzOjpaZXJvKCkgLCBWZWN0b3I0OjpaZXJvKCkudHJhbnNwb3NlKCk7CisgIFRyYW5zZm9ybTMgdG1hdDMobWF0MyksIHRtYXQ0KG1hdDQpOworICBpZihNb2RlIT1pbnQoQWZmaW5lQ29tcGFjdCkpCisgICAgdG1hdDQubWF0cml4KCkoMywzKSA9IFNjYWxhcigxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0bWF0My5tYXRyaXgoKSwgdG1hdDQubWF0cml4KCkpOworCisgIFNjYWxhciBhMyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKE1fUEkpLCBTY2FsYXIoTV9QSSkpOworICBWZWN0b3IzIHYzID0gVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpOworICBBbmdsZUF4aXN4IGFhMyhhMywgdjMpOworICBUcmFuc2Zvcm0zIHQzKGFhMyk7CisgIFRyYW5zZm9ybTMgdDQ7CisgIHQ0ID0gYWEzOworICBWRVJJRllfSVNfQVBQUk9YKHQzLm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisgIHQ0LnJvdGF0ZShBbmdsZUF4aXN4KC1hMyx2MykpOworICBWRVJJRllfSVNfQVBQUk9YKHQ0Lm1hdHJpeCgpLCBNYXRyaXhUeXBlOjpJZGVudGl0eSgpKTsKKyAgdDQgKj0gYWEzOworICBWRVJJRllfSVNfQVBQUk9YKHQzLm1hdHJpeCgpLCB0NC5tYXRyaXgoKSk7CisKKyAgdjMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgVHJhbnNsYXRpb24zIHR2Myh2Myk7CisgIFRyYW5zZm9ybTMgdDUodHYzKTsKKyAgdDQgPSB0djM7CisgIFZFUklGWV9JU19BUFBST1godDUubWF0cml4KCksIHQ0Lm1hdHJpeCgpKTsKKyAgdDQudHJhbnNsYXRlKC12Myk7CisgIFZFUklGWV9JU19BUFBST1godDQubWF0cml4KCksIE1hdHJpeFR5cGU6OklkZW50aXR5KCkpOworICB0NCAqPSB0djM7CisgIFZFUklGWV9JU19BUFBST1godDUubWF0cml4KCksIHQ0Lm1hdHJpeCgpKTsKKworICBBbGlnbmVkU2NhbGluZzMgc3YzKHYzKTsKKyAgVHJhbnNmb3JtMyB0NihzdjMpOworICB0NCA9IHN2MzsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0Ni5tYXRyaXgoKSwgdDQubWF0cml4KCkpOworICB0NC5zY2FsZSh2My5jd2lzZUludmVyc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1godDQubWF0cml4KCksIE1hdHJpeFR5cGU6OklkZW50aXR5KCkpOworICB0NCAqPSBzdjM7CisgIFZFUklGWV9JU19BUFBST1godDYubWF0cml4KCksIHQ0Lm1hdHJpeCgpKTsKKworICAvLyBtYXRyaXggKiB0cmFuc2Zvcm0KKyAgVkVSSUZZX0lTX0FQUFJPWCgodDMubWF0cml4KCkqdDQpLm1hdHJpeCgpLCAodDMqdDQpLm1hdHJpeCgpKTsKKworICAvLyBjaGFpbmVkIFRyYW5zZm9ybSBwcm9kdWN0CisgIFZFUklGWV9JU19BUFBST1goKCh0Myp0NCkqdDUpLm1hdHJpeCgpLCAodDMqKHQ0KnQ1KSkubWF0cml4KCkpOworCisgIC8vIGNoZWNrIHRoYXQgVHJhbnNmb3JtIHByb2R1Y3QgZG9lc24ndCBoYXZlIGFsaWFzaW5nIHByb2JsZW1zCisgIHQ1ID0gdDQ7CisgIHQ1ID0gdDUqdDU7CisgIFZFUklGWV9JU19BUFBST1godDUsIHQ0KnQ0KTsKKworICAvLyAyRCB0cmFuc2Zvcm1hdGlvbgorICBUcmFuc2Zvcm0yIHQyMCwgdDIxOworICBWZWN0b3IyIHYyMCA9IFZlY3RvcjI6OlJhbmRvbSgpOworICBWZWN0b3IyIHYyMSA9IFZlY3RvcjI6OlJhbmRvbSgpOworICBmb3IgKGludCBrPTA7IGs8MjsgKytrKQorICAgIGlmIChpbnRlcm5hbDo6YWJzKHYyMVtrXSk8U2NhbGFyKDFlLTMpKSB2MjFba10gPSBTY2FsYXIoMWUtMyk7CisgIHQyMS5zZXRJZGVudGl0eSgpOworICB0MjEubGluZWFyKCkgPSBSb3RhdGlvbjJEPFNjYWxhcj4oYSkudG9Sb3RhdGlvbk1hdHJpeCgpOworICBWRVJJRllfSVNfQVBQUk9YKHQyMC5mcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKHYyMCxhLHYyMSkubWF0cml4KCksCisgICAgdDIxLnByZXRyYW5zbGF0ZSh2MjApLnNjYWxlKHYyMSkubWF0cml4KCkpOworCisgIHQyMS5zZXRJZGVudGl0eSgpOworICB0MjEubGluZWFyKCkgPSBSb3RhdGlvbjJEPFNjYWxhcj4oLWEpLnRvUm90YXRpb25NYXRyaXgoKTsKKyAgVkVSSUZZKCAodDIwLmZyb21Qb3NpdGlvbk9yaWVudGF0aW9uU2NhbGUodjIwLGEsdjIxKQorICAgICAgICAqICh0MjEucHJlc2NhbGUodjIxLmN3aXNlSW52ZXJzZSgpKS50cmFuc2xhdGUoLXYyMCkpKS5tYXRyaXgoKS5pc0lkZW50aXR5KHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgKTsKKworICAvLyBUcmFuc2Zvcm0gLSBuZXcgQVBJCisgIC8vIDNECisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnJvdGF0ZShxMSkuc2NhbGUodjApLnRyYW5zbGF0ZSh2MCk7CisgIC8vIG1hdCAqIGFsaWduZWQgc2NhbGluZyBhbmQgbWF0ICogdHJhbnNsYXRpb24KKyAgdDEgPSAoTWF0cml4MyhxMSkgKiBBbGlnbmVkU2NhbGluZzModjApKSAqIFRyYW5zbGF0aW9uMyh2MCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgdDEgPSAoTWF0cml4MyhxMSkgKiBFaWdlbjo6U2NhbGluZyh2MCkpICogVHJhbnNsYXRpb24zKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICB0MSA9IChxMSAqIEVpZ2VuOjpTY2FsaW5nKHYwKSkgKiBUcmFuc2xhdGlvbjModjApOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisgIC8vIG1hdCAqIHRyYW5zZm9ybWF0aW9uIGFuZCBhbGlnbmVkIHNjYWxpbmcgKiB0cmFuc2xhdGlvbgorICB0MSA9IE1hdHJpeDMocTEpICogKEFsaWduZWRTY2FsaW5nMyh2MCkgKiBUcmFuc2xhdGlvbjModjApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisKKyAgdDAuc2V0SWRlbnRpdHkoKTsKKyAgdDAuc2NhbGUoczApLnRyYW5zbGF0ZSh2MCk7CisgIHQxID0gRWlnZW46OlNjYWxpbmcoczApICogVHJhbnNsYXRpb24zKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICB0MC5wcmVzY2FsZShzMCk7CisgIHQxID0gRWlnZW46OlNjYWxpbmcoczApICogdDE7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgCisgIHQwID0gdDM7CisgIHQwLnNjYWxlKHMwKTsKKyAgdDEgPSB0MyAqIEVpZ2VuOjpTY2FsaW5nKHMwLHMwLHMwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICB0MC5wcmVzY2FsZShzMCk7CisgIHQxID0gRWlnZW46OlNjYWxpbmcoczAsczAsczApICogdDE7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworCisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnByZXJvdGF0ZShxMSkucHJlc2NhbGUodjApLnByZXRyYW5zbGF0ZSh2MCk7CisgIC8vIHRyYW5zbGF0aW9uICogYWxpZ25lZCBzY2FsaW5nIGFuZCB0cmFuc2Zvcm1hdGlvbiAqIG1hdAorICB0MSA9IChUcmFuc2xhdGlvbjModjApICogQWxpZ25lZFNjYWxpbmczKHYwKSkgKiBUcmFuc2Zvcm0zKHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICAvLyBzY2FsaW5nICogbWF0IGFuZCB0cmFuc2xhdGlvbiAqIG1hdAorICB0MSA9IFRyYW5zbGF0aW9uMyh2MCkgKiAoQWxpZ25lZFNjYWxpbmczKHYwKSAqIFRyYW5zZm9ybTMocTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnNjYWxlKHYwKS50cmFuc2xhdGUodjApLnJvdGF0ZShxMSk7CisgIC8vIHRyYW5zbGF0aW9uICogbWF0IGFuZCBhbGlnbmVkIHNjYWxpbmcgKiB0cmFuc2Zvcm1hdGlvbgorICB0MSA9IEFsaWduZWRTY2FsaW5nMyh2MCkgKiAoVHJhbnNsYXRpb24zKHYwKSAqIFRyYW5zZm9ybTMocTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICAvLyB0cmFuc2Zvcm1hdGlvbiAqIGFsaWduZWQgc2NhbGluZworICB0MC5zY2FsZSh2MCk7CisgIHQxICo9IEFsaWduZWRTY2FsaW5nMyh2MCk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKyAgLy8gdHJhbnNmb3JtYXRpb24gKiB0cmFuc2xhdGlvbgorICB0MC50cmFuc2xhdGUodjApOworICB0MSA9IHQxICogVHJhbnNsYXRpb24zKHYwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworICAvLyB0cmFuc2xhdGlvbiAqIHRyYW5zZm9ybWF0aW9uCisgIHQwLnByZXRyYW5zbGF0ZSh2MCk7CisgIHQxID0gVHJhbnNsYXRpb24zKHYwKSAqIHQxOworICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CisKKyAgLy8gdHJhbnNmb3JtICogcXVhdGVybmlvbgorICB0MC5yb3RhdGUocTEpOworICB0MSA9IHQxICogcTE7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICAvLyB0cmFuc2xhdGlvbiAqIHF1YXRlcm5pb24KKyAgdDAudHJhbnNsYXRlKHYxKS5yb3RhdGUocTEpOworICB0MSA9IHQxICogKFRyYW5zbGF0aW9uMyh2MSkgKiBxMSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICAvLyBhbGlnbmVkIHNjYWxpbmcgKiBxdWF0ZXJuaW9uCisgIHQwLnNjYWxlKHYxKS5yb3RhdGUocTEpOworICB0MSA9IHQxICogKEFsaWduZWRTY2FsaW5nMyh2MSkgKiBxMSk7CisgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKKworICAvLyBxdWF0ZXJuaW9uICogdHJhbnNmb3JtCisgIHQwLnByZXJvdGF0ZShxMSk7CisgIHQxID0gcTEgKiB0MTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHF1YXRlcm5pb24gKiB0cmFuc2xhdGlvbgorICB0MC5yb3RhdGUocTEpLnRyYW5zbGF0ZSh2MSk7CisgIHQxID0gdDEgKiAocTEgKiBUcmFuc2xhdGlvbjModjEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHF1YXRlcm5pb24gKiBhbGlnbmVkIHNjYWxpbmcKKyAgdDAucm90YXRlKHExKS5zY2FsZSh2MSk7CisgIHQxID0gdDEgKiAocTEgKiBBbGlnbmVkU2NhbGluZzModjEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5tYXRyaXgoKSwgdDEubWF0cml4KCkpOworCisgIC8vIHRlc3QgdHJhbnNmb3JtIGludmVyc2lvbgorICB0MC5zZXRJZGVudGl0eSgpOworICB0MC50cmFuc2xhdGUodjApOworICB0MC5saW5lYXIoKS5zZXRSYW5kb20oKTsKKyAgTWF0cml4NCB0MDQ0ID0gTWF0cml4NDo6WmVybygpOworICB0MDQ0KDMsMykgPSAxOworICB0MDQ0LmJsb2NrKDAsMCx0MC5tYXRyaXgoKS5yb3dzKCksNCkgPSB0MC5tYXRyaXgoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5pbnZlcnNlKEFmZmluZSkubWF0cml4KCksIHQwNDQuaW52ZXJzZSgpLmJsb2NrKDAsMCx0MC5tYXRyaXgoKS5yb3dzKCksNCkpOworICB0MC5zZXRJZGVudGl0eSgpOworICB0MC50cmFuc2xhdGUodjApLnJvdGF0ZShxMSk7CisgIHQwNDQgPSBNYXRyaXg0OjpaZXJvKCk7CisgIHQwNDQoMywzKSA9IDE7CisgIHQwNDQuYmxvY2soMCwwLHQwLm1hdHJpeCgpLnJvd3MoKSw0KSA9IHQwLm1hdHJpeCgpOworICBWRVJJRllfSVNfQVBQUk9YKHQwLmludmVyc2UoSXNvbWV0cnkpLm1hdHJpeCgpLCB0MDQ0LmludmVyc2UoKS5ibG9jaygwLDAsdDAubWF0cml4KCkucm93cygpLDQpKTsKKworICBNYXRyaXgzIG1hdF9yb3RhdGlvbiwgbWF0X3NjYWxpbmc7CisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnRyYW5zbGF0ZSh2MCkucm90YXRlKHExKS5zY2FsZSh2MSk7CisgIHQwLmNvbXB1dGVSb3RhdGlvblNjYWxpbmcoJm1hdF9yb3RhdGlvbiwgJm1hdF9zY2FsaW5nKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5saW5lYXIoKSwgbWF0X3JvdGF0aW9uICogbWF0X3NjYWxpbmcpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdF9yb3RhdGlvbiptYXRfcm90YXRpb24uYWRqb2ludCgpLCBNYXRyaXgzOjpJZGVudGl0eSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRfcm90YXRpb24uZGV0ZXJtaW5hbnQoKSwgU2NhbGFyKDEpKTsKKyAgdDAuY29tcHV0ZVNjYWxpbmdSb3RhdGlvbigmbWF0X3NjYWxpbmcsICZtYXRfcm90YXRpb24pOworICBWRVJJRllfSVNfQVBQUk9YKHQwLmxpbmVhcigpLCBtYXRfc2NhbGluZyAqIG1hdF9yb3RhdGlvbik7CisgIFZFUklGWV9JU19BUFBST1gobWF0X3JvdGF0aW9uKm1hdF9yb3RhdGlvbi5hZGpvaW50KCksIE1hdHJpeDM6OklkZW50aXR5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdF9yb3RhdGlvbi5kZXRlcm1pbmFudCgpLCBTY2FsYXIoMSkpOworCisgIC8vIHRlc3QgY2FzdGluZworICBUcmFuc2Zvcm08ZmxvYXQsMyxNb2RlPiB0MWYgPSB0MS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpOworICBWRVJJRllfSVNfQVBQUk9YKHQxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSx0MSk7CisgIFRyYW5zZm9ybTxkb3VibGUsMyxNb2RlPiB0MWQgPSB0MS50ZW1wbGF0ZSBjYXN0PGRvdWJsZT4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksdDEpOworCisgIFRyYW5zbGF0aW9uMyB0cjEodjApOworICBUcmFuc2xhdGlvbjxmbG9hdCwzPiB0cjFmID0gdHIxLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1godHIxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSx0cjEpOworICBUcmFuc2xhdGlvbjxkb3VibGUsMz4gdHIxZCA9IHRyMS50ZW1wbGF0ZSBjYXN0PGRvdWJsZT4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0cjFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHRyMSk7CisKKyAgQW5nbGVBeGlzPGZsb2F0PiBhYTFmID0gYWExLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7CisgIFZFUklGWV9JU19BUFBST1goYWExZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxhYTEpOworICBBbmdsZUF4aXM8ZG91YmxlPiBhYTFkID0gYWExLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKGFhMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksYWExKTsKKworICBSb3RhdGlvbjJEPFNjYWxhcj4gcjJkMShpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSk7CisgIFJvdGF0aW9uMkQ8ZmxvYXQ+IHIyZDFmID0gcjJkMS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpOworICBWRVJJRllfSVNfQVBQUk9YKHIyZDFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHIyZDEpOworICBSb3RhdGlvbjJEPGRvdWJsZT4gcjJkMWQgPSByMmQxLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWRVJJRllfSVNfQVBQUk9YKHIyZDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHIyZDEpOworCisgIHQyMCA9IFRyYW5zbGF0aW9uMih2MjApICogKFJvdGF0aW9uMkQ8U2NhbGFyPihzMCkgKiBTY2FsaW5nKHMwKSk7CisgIHQyMSA9IFRyYW5zbGF0aW9uMih2MjApICogUm90YXRpb24yRDxTY2FsYXI+KHMwKSAqIFNjYWxpbmcoczApOworICBWRVJJRllfSVNfQVBQUk9YKHQyMCx0MjEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgdHJhbnNmb3JtX2FsaWdubWVudCgpCit7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwzLFByb2plY3RpdmUsQXV0b0FsaWduPiBQcm9qZWN0aXZlM2E7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwzLFByb2plY3RpdmUsRG9udEFsaWduPiBQcm9qZWN0aXZlM3U7CisKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgYXJyYXkxWzE2XTsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgYXJyYXkyWzE2XTsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgYXJyYXkzWzE2KzFdOworICBTY2FsYXIqIGFycmF5M3UgPSBhcnJheTMrMTsKKworICBQcm9qZWN0aXZlM2EgKnAxID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkxKSkgUHJvamVjdGl2ZTNhOworICBQcm9qZWN0aXZlM3UgKnAyID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkyKSkgUHJvamVjdGl2ZTN1OworICBQcm9qZWN0aXZlM3UgKnAzID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkzdSkpIFByb2plY3RpdmUzdTsKKyAgCisgIHAxLT5tYXRyaXgoKS5zZXRSYW5kb20oKTsKKyAgKnAyID0gKnAxOworICAqcDMgPSAqcDE7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChwMS0+bWF0cml4KCksIHAyLT5tYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1gocDEtPm1hdHJpeCgpLCBwMy0+bWF0cml4KCkpOworICAKKyAgVkVSSUZZX0lTX0FQUFJPWCggKCpwMSkgKiAoKnAxKSwgKCpwMikqKCpwMykpOworICAKKyAgI2lmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFKSAmJiBFSUdFTl9BTElHTl9TVEFUSUNBTExZCisgIGlmKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCgoOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkzdSkpIFByb2plY3RpdmUzYSkpOworICAjZW5kaWYKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgT3B0aW9ucz4gdm9pZCB0cmFuc2Zvcm1fcHJvZHVjdHMoKQoreworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGltKzEsRGltKzE+IE1hdDsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlLE9wdGlvbnM+IFByb2o7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lLE9wdGlvbnM+IEFmZjsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LE9wdGlvbnM+IEFmZkM7CisKKyAgUHJvaiBwOyBwLm1hdHJpeCgpLnNldFJhbmRvbSgpOworICBBZmYgYTsgYS5saW5lYXIoKS5zZXRSYW5kb20oKTsgYS50cmFuc2xhdGlvbigpLnNldFJhbmRvbSgpOworICBBZmZDIGFjID0gYTsKKworICBNYXQgcF9tKHAubWF0cml4KCkpLCBhX20oYS5tYXRyaXgoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgocCpwKS5tYXRyaXgoKSwgcF9tKnBfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGEqYSkubWF0cml4KCksIGFfbSphX20pOworICBWRVJJRllfSVNfQVBQUk9YKChwKmEpLm1hdHJpeCgpLCBwX20qYV9tKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYSpwKS5tYXRyaXgoKSwgYV9tKnBfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGFjKmEpLm1hdHJpeCgpLCBhX20qYV9tKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYSphYykubWF0cml4KCksIGFfbSphX20pOworICBWRVJJRllfSVNfQVBQUk9YKChwKmFjKS5tYXRyaXgoKSwgcF9tKmFfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGFjKnApLm1hdHJpeCgpLCBhX20qcF9tKTsKK30KKwordm9pZCB0ZXN0X2dlb190cmFuc2Zvcm1hdGlvbnMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCggdHJhbnNmb3JtYXRpb25zPGRvdWJsZSxBZmZpbmUsQXV0b0FsaWduPigpICkpOworICAgIENBTExfU1VCVEVTVF8xKCggbm9uX3Byb2plY3RpdmVfb25seTxkb3VibGUsQWZmaW5lLEF1dG9BbGlnbj4oKSApKTsKKyAgICAKKyAgICBDQUxMX1NVQlRFU1RfMigoIHRyYW5zZm9ybWF0aW9uczxmbG9hdCxBZmZpbmVDb21wYWN0LEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoIG5vbl9wcm9qZWN0aXZlX29ubHk8ZmxvYXQsQWZmaW5lQ29tcGFjdCxBdXRvQWxpZ24+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCB0cmFuc2Zvcm1fYWxpZ25tZW50PGZsb2F0PigpICkpOworICAgIAorICAgIENBTExfU1VCVEVTVF8zKCggdHJhbnNmb3JtYXRpb25zPGRvdWJsZSxQcm9qZWN0aXZlLEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoIHRyYW5zZm9ybWF0aW9uczxkb3VibGUsUHJvamVjdGl2ZSxEb250QWxpZ24+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKCB0cmFuc2Zvcm1fYWxpZ25tZW50PGRvdWJsZT4oKSApKTsKKyAgICAKKyAgICBDQUxMX1NVQlRFU1RfNCgoIHRyYW5zZm9ybWF0aW9uczxmbG9hdCxBZmZpbmUsUm93TWFqb3J8QXV0b0FsaWduPigpICkpOworICAgIENBTExfU1VCVEVTVF80KCggbm9uX3Byb2plY3RpdmVfb25seTxmbG9hdCxBZmZpbmUsUm93TWFqb3I+KCkgKSk7CisgICAgCisgICAgQ0FMTF9TVUJURVNUXzUoKCB0cmFuc2Zvcm1hdGlvbnM8ZG91YmxlLEFmZmluZUNvbXBhY3QsUm93TWFqb3J8QXV0b0FsaWduPigpICkpOworICAgIENBTExfU1VCVEVTVF81KCggbm9uX3Byb2plY3RpdmVfb25seTxkb3VibGUsQWZmaW5lQ29tcGFjdCxSb3dNYWpvcj4oKSApKTsKKworICAgIENBTExfU1VCVEVTVF82KCggdHJhbnNmb3JtYXRpb25zPGRvdWJsZSxQcm9qZWN0aXZlLFJvd01ham9yfEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoIHRyYW5zZm9ybWF0aW9uczxkb3VibGUsUHJvamVjdGl2ZSxSb3dNYWpvcnxEb250QWxpZ24+KCkgKSk7CisKKworICAgIENBTExfU1VCVEVTVF83KCggdHJhbnNmb3JtX3Byb2R1Y3RzPGRvdWJsZSwzLFJvd01ham9yfEF1dG9BbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNygoIHRyYW5zZm9ybV9wcm9kdWN0czxmbG9hdCwyLEF1dG9BbGlnbj4oKSApKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9oZXNzZW5iZXJnLmNwcCBiL3Rlc3QvaGVzc2VuYmVyZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiYzE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGVzc2VuYmVyZy5jcHAKQEAgLTAsMCArMSw2MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgU2l6ZT4gdm9pZCBoZXNzZW5iZXJnKGludCBzaXplID0gU2l6ZSkKK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUsU2l6ZT4gTWF0cml4VHlwZTsKKworICAvLyBUZXN0IGJhc2ljIGZ1bmN0aW9uYWxpdHk6IEEgPSBVIEggVSogYW5kIEggaXMgSGVzc2VuYmVyZworICBmb3IoaW50IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgZ19yZXBlYXQ7ICsrY291bnRlcikgeworICAgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICAgIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+IGhlc3MobSk7CisgICAgTWF0cml4VHlwZSBRID0gaGVzcy5tYXRyaXhRKCk7CisgICAgTWF0cml4VHlwZSBIID0gaGVzcy5tYXRyaXhIKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBRICogSCAqIFEuYWRqb2ludCgpKTsKKyAgICBmb3IoaW50IHJvdyA9IDI7IHJvdyA8IHNpemU7ICsrcm93KSB7CisgICAgICBmb3IoaW50IGNvbCA9IDA7IGNvbCA8IHJvdy0xOyArK2NvbCkgeworCVZFUklGWShIKHJvdyxjb2wpID09ICh0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIpMCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVGVzdCB3aGV0aGVyIGNvbXB1dGUoKSBhbmQgY29uc3RydWN0b3IgcmV0dXJucyBzYW1lIHJlc3VsdAorICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CisgIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+IGNzMTsKKyAgY3MxLmNvbXB1dGUoQSk7CisgIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+IGNzMihBKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNzMS5tYXRyaXhIKCkuZXZhbCgpLCBjczIubWF0cml4SCgpLmV2YWwoKSk7CisgIE1hdHJpeFR5cGUgY3MxUSA9IGNzMS5tYXRyaXhRKCk7CisgIE1hdHJpeFR5cGUgY3MyUSA9IGNzMi5tYXRyaXhRKCk7ICAKKyAgVkVSSUZZX0lTX0VRVUFMKGNzMVEsIGNzMlEpOworCisgIC8vIFRlc3QgYXNzZXJ0aW9ucyBmb3Igd2hlbiB1c2VkIHVuaW5pdGlhbGl6ZWQKKyAgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248TWF0cml4VHlwZT4gaGVzc1VuaW5pdGlhbGl6ZWQ7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBoZXNzVW5pbml0aWFsaXplZC5tYXRyaXhIKCkgKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIGhlc3NVbmluaXRpYWxpemVkLm1hdHJpeFEoKSApOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCggaGVzc1VuaW5pdGlhbGl6ZWQuaG91c2Vob2xkZXJDb2VmZmljaWVudHMoKSApOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCggaGVzc1VuaW5pdGlhbGl6ZWQucGFja2VkTWF0cml4KCkgKTsKKworICAvLyBUT0RPOiBBZGQgdGVzdHMgZm9yIHBhY2tlZE1hdHJpeCgpIGFuZCBob3VzZWhvbGRlckNvZWZmaWNpZW50cygpCit9CisKK3ZvaWQgdGVzdF9oZXNzZW5iZXJnKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEoKCBoZXNzZW5iZXJnPHN0ZDo6Y29tcGxleDxkb3VibGU+LDE+KCkgKSk7CisgIENBTExfU1VCVEVTVF8yKCggaGVzc2VuYmVyZzxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwyPigpICkpOworICBDQUxMX1NVQlRFU1RfMygoIGhlc3NlbmJlcmc8c3RkOjpjb21wbGV4PGZsb2F0Piw0PigpICkpOworICBDQUxMX1NVQlRFU1RfNCgoIGhlc3NlbmJlcmc8ZmxvYXQsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpICkpOworICBDQUxMX1NVQlRFU1RfNSgoIGhlc3NlbmJlcmc8c3RkOjpjb21wbGV4PGRvdWJsZT4sRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpICkpOworCisgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICBDQUxMX1NVQlRFU1RfNihIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhYZj4oMTApKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvaG91c2Vob2xkZXIuY3BwIGIvdGVzdC9ob3VzZWhvbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzZGNlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaG91c2Vob2xkZXIuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9RUj4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBob3VzZWhvbGRlcihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICBzdGF0aWMgYm9vbCBldmVuID0gdHJ1ZTsKKyAgZXZlbiA9ICFldmVuOworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIEhvdXNlaG9sZGVyLmgKKyAgKi8KKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgaW50ZXJuYWw6OmRlY3JlbWVudF9zaXplPE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjo6cmV0LCAxPiBFc3NlbnRpYWxWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gU3F1YXJlTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gSEJsb2NrTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBIQ29lZmZzVmVjdG9yVHlwZTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gUmlnaHRTcXVhcmVNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBEeW5hbWljPiBWQmxvY2tNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gVE1hdHJpeFR5cGU7CisgIAorICBNYXRyaXg8U2NhbGFyLCBFSUdFTl9TSVpFX01BWChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSxNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSksIDE+IF90bXAoKHN0ZDo6bWF4KShyb3dzLGNvbHMpKTsKKyAgU2NhbGFyKiB0bXAgPSAmX3RtcC5jb2VmZlJlZigwLDApOworCisgIFNjYWxhciBiZXRhOworICBSZWFsU2NhbGFyIGFscGhhOworICBFc3NlbnRpYWxWZWN0b3JUeXBlIGVzc2VudGlhbDsKKworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCB2MjsKKyAgdjIgPSB2MTsKKyAgdjEubWFrZUhvdXNlaG9sZGVyKGVzc2VudGlhbCwgYmV0YSwgYWxwaGEpOworICB2MS5hcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KGVzc2VudGlhbCxiZXRhLHRtcCk7CisgIFZFUklGWV9JU19BUFBST1godjEubm9ybSgpLCB2Mi5ub3JtKCkpOworICBpZihyb3dzPj0yKSBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjEudGFpbChyb3dzLTEpLm5vcm0oKSwgdjEubm9ybSgpKTsKKyAgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIHYyID0gdjE7CisgIHYxLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoZXNzZW50aWFsLGJldGEsdG1wKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MS5ub3JtKCksIHYyLm5vcm0oKSk7CisKKyAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMihyb3dzLCBjb2xzKTsKKworICB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgaWYoZXZlbikgdjEudGFpbChyb3dzLTEpLnNldFplcm8oKTsKKyAgbTEuY29sd2lzZSgpID0gdjE7CisgIG0yID0gbTE7CisgIG0xLmNvbCgwKS5tYWtlSG91c2Vob2xkZXIoZXNzZW50aWFsLCBiZXRhLCBhbHBoYSk7CisgIG0xLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoZXNzZW50aWFsLGJldGEsdG1wKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5ub3JtKCksIG0yLm5vcm0oKSk7CisgIGlmKHJvd3M+PTIpIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihtMS5ibG9jaygxLDAscm93cy0xLGNvbHMpLm5vcm0oKSwgbTEubm9ybSgpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGludGVybmFsOjppbWFnKG0xKDAsMCkpLCBpbnRlcm5hbDo6cmVhbChtMSgwLDApKSk7CisgIFZFUklGWV9JU19BUFBST1goaW50ZXJuYWw6OnJlYWwobTEoMCwwKSksIGFscGhhKTsKKworICB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgaWYoZXZlbikgdjEudGFpbChyb3dzLTEpLnNldFplcm8oKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBtMyhyb3dzLHJvd3MpLCBtNChyb3dzLHJvd3MpOworICBtMy5yb3d3aXNlKCkgPSB2MS50cmFuc3Bvc2UoKTsKKyAgbTQgPSBtMzsKKyAgbTMucm93KDApLm1ha2VIb3VzZWhvbGRlcihlc3NlbnRpYWwsIGJldGEsIGFscGhhKTsKKyAgbTMuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoZXNzZW50aWFsLGJldGEsdG1wKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub3JtKCksIG00Lm5vcm0oKSk7CisgIGlmKHJvd3M+PTIpIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihtMy5ibG9jaygwLDEscm93cyxyb3dzLTEpLm5vcm0oKSwgbTMubm9ybSgpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGludGVybmFsOjppbWFnKG0zKDAsMCkpLCBpbnRlcm5hbDo6cmVhbChtMygwLDApKSk7CisgIFZFUklGWV9JU19BUFBST1goaW50ZXJuYWw6OnJlYWwobTMoMCwwKSksIGFscGhhKTsKKworICAvLyB0ZXN0IGhvdXNlaG9sZGVyIHNlcXVlbmNlIG9uIHRoZSBsZWZ0IHdpdGggYSBzaGlmdAorCisgIEluZGV4IHNoaWZ0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgc3RkOjptYXg8SW5kZXg+KHJvd3MtMiwwKSk7CisgIEluZGV4IGJyb3dzID0gcm93cyAtIHNoaWZ0OworICBtMS5zZXRSYW5kb20ocm93cywgY29scyk7CisgIEhCbG9ja01hdHJpeFR5cGUgaGJtID0gbTEuYmxvY2soc2hpZnQsMCxicm93cyxjb2xzKTsKKyAgSG91c2Vob2xkZXJRUjxIQmxvY2tNYXRyaXhUeXBlPiBxcihoYm0pOworICBtMiA9IG0xOworICBtMi5ibG9jayhzaGlmdCwwLGJyb3dzLGNvbHMpID0gcXIubWF0cml4UVIoKTsKKyAgSENvZWZmc1ZlY3RvclR5cGUgaGMgPSBxci5oQ29lZmZzKCkuY29uanVnYXRlKCk7CisgIEhvdXNlaG9sZGVyU2VxdWVuY2U8TWF0cml4VHlwZSwgSENvZWZmc1ZlY3RvclR5cGU+IGhzZXEobTIsIGhjKTsKKyAgaHNlcS5zZXRMZW5ndGgoaGMuc2l6ZSgpKS5zZXRTaGlmdChzaGlmdCk7CisgIFZFUklGWShoc2VxLmxlbmd0aCgpID09IGhjLnNpemUoKSk7CisgIFZFUklGWShoc2VxLnNoaWZ0KCkgPT0gc2hpZnQpOworCisgIE1hdHJpeFR5cGUgbTUgPSBtMjsKKyAgbTUuYmxvY2soc2hpZnQsMCxicm93cyxjb2xzKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChoc2VxICogbTUsIG0xKTsgLy8gdGVzdCBhcHBseWluZyBoc2VxIGRpcmVjdGx5CisgIG0zID0gaHNlcTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyAqIG01LCBtMSk7IC8vIHRlc3QgZXZhbHVhdGluZyBoc2VxIHRvIGEgZGVuc2UgbWF0cml4LCB0aGVuIGFwcGx5aW5nCisKKyAgLy8gdGVzdCBob3VzZWhvbGRlciBzZXF1ZW5jZSBvbiB0aGUgcmlnaHQgd2l0aCBhIHNoaWZ0CisKKyAgVE1hdHJpeFR5cGUgdG0yID0gbTIudHJhbnNwb3NlKCk7CisgIEhvdXNlaG9sZGVyU2VxdWVuY2U8VE1hdHJpeFR5cGUsIEhDb2VmZnNWZWN0b3JUeXBlLCBPblRoZVJpZ2h0PiByaHNlcSh0bTIsIGhjKTsKKyAgcmhzZXEuc2V0TGVuZ3RoKGhjLnNpemUoKSkuc2V0U2hpZnQoc2hpZnQpOworICBWRVJJRllfSVNfQVBQUk9YKHJoc2VxICogbTUsIG0xKTsgLy8gdGVzdCBhcHBseWluZyByaHNlcSBkaXJlY3RseQorICBtMyA9IHJoc2VxOworICBWRVJJRllfSVNfQVBQUk9YKG0zICogbTUsIG0xKTsgLy8gdGVzdCBldmFsdWF0aW5nIHJoc2VxIHRvIGEgZGVuc2UgbWF0cml4LCB0aGVuIGFwcGx5aW5nCit9CisKK3ZvaWQgdGVzdF9ob3VzZWhvbGRlcigpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGhvdXNlaG9sZGVyKE1hdHJpeDxkb3VibGUsMiwyPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBob3VzZWhvbGRlcihNYXRyaXg8ZmxvYXQsMiwzPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBob3VzZWhvbGRlcihNYXRyaXg8ZG91YmxlLDMsNT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggaG91c2Vob2xkZXIoTWF0cml4PGZsb2F0LDQsND4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggaG91c2Vob2xkZXIoTWF0cml4WGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF82KCBob3VzZWhvbGRlcihNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF83KCBob3VzZWhvbGRlcihNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIGhvdXNlaG9sZGVyKE1hdHJpeDxkb3VibGUsMSwxPigpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2ludGVnZXJfdHlwZXMuY3BwIGIvdGVzdC9pbnRlZ2VyX3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBmOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbnRlZ2VyX3R5cGVzLmNwcApAQCAtMCwwICsxLDE2MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQKKworI2luY2x1ZGUgIm1haW4uaCIKKworI3VuZGVmIFZFUklGWV9JU19BUFBST1gKKyNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWChhLCBiKSBWRVJJRlkoKGEpPT0oYikpOworI3VuZGVmIFZFUklGWV9JU19OT1RfQVBQUk9YCisjZGVmaW5lIFZFUklGWV9JU19OT1RfQVBQUk9YKGEsIGIpIFZFUklGWSgoYSkhPShiKSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgc2lnbmVkX2ludGVnZXJfdHlwZV90ZXN0cyhjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgZW51bSB7IGlzX3NpZ25lZCA9IChTY2FsYXIoLTEpID4gU2NhbGFyKDApKSA/IDAgOiAxIH07CisgIFZFUklGWShpc19zaWduZWQgPT0gMSk7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtemVybyA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyk7CisKKyAgZG8geworICAgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICB9IHdoaWxlKG0xID09IG16ZXJvIHx8IG0xID09IG0yKTsKKworICAvLyBjaGVjayBsaW5lYXIgc3RydWN0dXJlCisKKyAgU2NhbGFyIHMxOworICBkbyB7CisgICAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgfSB3aGlsZShzMSA9PSAwKTsKKworICBWRVJJRllfSVNfRVFVQUwoLSgtbTEpLCAgICAgICAgICAgICAgICAgIG0xKTsKKyAgVkVSSUZZX0lTX0VRVUFMKC1tMittMSttMiwgICAgICAgICAgICAgICBtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoLW0xK20yKSpzMSwgICAgICAgICAgICAgLXMxKm0xK3MxKm0yKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbnRlZ2VyX3R5cGVfdGVzdHMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIFZFUklGWShOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKTsKKyAgZW51bSB7IGlzX3NpZ25lZCA9IChTY2FsYXIoLTEpID4gU2NhbGFyKDApKSA/IDAgOiAxIH07CisgIFZFUklGWShpbnQoTnVtVHJhaXRzPFNjYWxhcj46OklzU2lnbmVkKSA9PSBpc19zaWduZWQpOworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gU3F1YXJlTWF0cml4VHlwZTsKKyAgU3F1YXJlTWF0cml4VHlwZSBpZGVudGl0eSA9IFNxdWFyZU1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpLAorICAgICAgICAgICAgICAgICAgIHNxdWFyZSA9IFNxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgVmVjdG9yVHlwZSB2MShyb3dzKSwKKyAgICAgICAgICAgICB2MiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKKyAgICAgICAgICAgICB2emVybyA9IFZlY3RvclR5cGU6Olplcm8ocm93cyk7CisKKyAgZG8geworICAgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICB9IHdoaWxlKG0xID09IG16ZXJvIHx8IG0xID09IG0yKTsKKworICBkbyB7CisgICAgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIH0gd2hpbGUodjEgPT0gdnplcm8gfHwgdjEgPT0gdjIpOworCisgIFZFUklGWV9JU19BUFBST1goICAgICAgICAgICAgICAgdjEsICAgIHYxKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1goICAgICAgICAgICB2MSwgICAgMip2MSk7CisgIFZFUklGWV9JU19BUFBST1goICAgICAgICAgICAgICAgdnplcm8sIHYxLXYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICBtMSwgICAgbTEpOworICBWRVJJRllfSVNfTk9UX0FQUFJPWCggICAgICAgICAgIG0xLCAgICAyKm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICBtemVybywgbTEtbTEpOworCisgIFZFUklGWV9JU19BUFBST1gobTMgPSBtMSxtMSk7CisgIE1hdHJpeFR5cGUgbTQ7CisgIFZFUklGWV9JU19BUFBST1gobTQgPSBtMSxtMSk7CisKKyAgbTMucmVhbCgpID0gbTEucmVhbCgpOworICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihtMykucmVhbCgpLCBzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4obTEpLnJlYWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4VHlwZSY+KG0zKS5yZWFsKCksIG0xLnJlYWwoKSk7CisKKyAgLy8gY2hlY2sgPT0gLyAhPSBvcGVyYXRvcnMKKyAgVkVSSUZZKG0xPT1tMSk7CisgIFZFUklGWShtMSE9bTIpOworICBWRVJJRlkoIShtMT09bTIpKTsKKyAgVkVSSUZZKCEobTEhPW0xKSk7CisgIG0xID0gbTI7CisgIFZFUklGWShtMT09bTIpOworICBWRVJJRlkoIShtMSE9bTIpKTsKKworICAvLyBjaGVjayBsaW5lYXIgc3RydWN0dXJlCisKKyAgU2NhbGFyIHMxOworICBkbyB7CisgICAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgfSB3aGlsZShzMSA9PSAwKTsKKworICBWRVJJRllfSVNfRVFVQUwobTErbTEsICAgICAgICAgICAgICAgICAgIDIqbTEpOworICBWRVJJRllfSVNfRVFVQUwobTErbTItbTEsICAgICAgICAgICAgICAgIG0yKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xKnMxLCAgICAgICAgICAgICAgICAgICBzMSptMSk7CisgIFZFUklGWV9JU19FUVVBTCgobTErbTIpKnMxLCAgICAgICAgICAgICAgczEqbTErczEqbTIpOworICBtMyA9IG0yOyBtMyArPSBtMTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0zLCAgICAgICAgICAgICAgICAgICAgICBtMSttMik7CisgIG0zID0gbTI7IG0zIC09IG0xOworICBWRVJJRllfSVNfRVFVQUwobTMsICAgICAgICAgICAgICAgICAgICAgIG0yLW0xKTsKKyAgbTMgPSBtMjsgbTMgKj0gczE7CisgIFZFUklGWV9JU19FUVVBTChtMywgICAgICAgICAgICAgICAgICAgICAgczEqbTIpOworCisgIC8vIGNoZWNrIG1hdHJpeCBwcm9kdWN0LgorCisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHkgKiBtMSwgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZSAqIChtMSArIG0yKSwgc3F1YXJlICogbTEgKyBzcXVhcmUgKiBtMik7CisgIFZFUklGWV9JU19BUFBST1goKG0xICsgbTIpLnRyYW5zcG9zZSgpICogc3F1YXJlLCBtMS50cmFuc3Bvc2UoKSAqIHNxdWFyZSArIG0yLnRyYW5zcG9zZSgpICogc3F1YXJlKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKiBtMi50cmFuc3Bvc2UoKSkgKiBtMSwgbTEgKiAobTIudHJhbnNwb3NlKCkgKiBtMSkpOworfQorCit2b2lkIHRlc3RfaW50ZWdlcl90eXBlcygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8dW5zaWduZWQgaW50LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PHVuc2lnbmVkIGxvbmcsIDMsIDQ+KCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMiggaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxsb25nLCAyLCAyPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxsb25nLCAyLCAyPigpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzMoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8Y2hhciwgMiwgRHluYW1pYz4oMiwgMTApKSApOworICAgIENBTExfU1VCVEVTVF8zKCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxzaWduZWQgY2hhciwgMiwgRHluYW1pYz4oMiwgMTApKSApOworCisgICAgQ0FMTF9TVUJURVNUXzQoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8dW5zaWduZWQgY2hhciwgMywgMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDx1bnNpZ25lZCBjaGFyLCBEeW5hbWljLCBEeW5hbWljPigyMCwgMjApKSApOworCisgICAgQ0FMTF9TVUJURVNUXzUoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8c2hvcnQsIER5bmFtaWMsIDQ+KDcsIDQpKSApOworICAgIENBTExfU1VCVEVTVF81KCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxzaG9ydCwgRHluYW1pYywgND4oNywgNCkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfNiggaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDx1bnNpZ25lZCBzaG9ydCwgNCwgND4oKSkgKTsKKworICAgIENBTExfU1VCVEVTVF83KCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PGxvbmcgbG9uZywgMTEsIDEzPigpKSApOworICAgIENBTExfU1VCVEVTVF83KCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxsb25nIGxvbmcsIDExLCAxMz4oKSkgKTsKKworICAgIENBTExfU1VCVEVTVF84KCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PHVuc2lnbmVkIGxvbmcgbG9uZywgRHluYW1pYywgNT4oMSwgNSkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaW52ZXJzZS5jcHAgYi90ZXN0L2ludmVyc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjQyZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ludmVyc2UuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vTFU+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgaW52ZXJzZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIEludmVyc2UuaAorICAqLworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBNYXRyaXhUeXBlIG0xKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIGlkZW50aXR5ID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgcm93cyk7CisgIGNyZWF0ZVJhbmRvbVBJTWF0cml4T2ZSYW5rKHJvd3Mscm93cyxyb3dzLG0xKTsKKyAgbTIgPSBtMS5pbnZlcnNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0yLmludmVyc2UoKSApOworCisgIFZFUklGWV9JU19BUFBST1goKFNjYWxhcigyKSptMikuaW52ZXJzZSgpLCBtMi5pbnZlcnNlKCkqU2NhbGFyKDAuNSkpOworCisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xLmludmVyc2UoKSAqIG0xICk7CisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xICogbTEuaW52ZXJzZSgpICk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTEuaW52ZXJzZSgpLmludmVyc2UoKSApOworCisgIC8vIHNpbmNlIGZvciB0aGUgZ2VuZXJhbCBjYXNlIHdlIGltcGxlbWVudCBzZXBhcmF0ZWx5IHJvdy1tYWpvciBhbmQgY29sLW1ham9yLCB0ZXN0IHRoYXQKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKG0xLnRyYW5zcG9zZSgpLmludmVyc2UoKSksIE1hdHJpeFR5cGUobTEuaW52ZXJzZSgpLnRyYW5zcG9zZSgpKSk7CisKKyNpZiAhZGVmaW5lZChFSUdFTl9URVNUX1BBUlRfNSkgJiYgIWRlZmluZWQoRUlHRU5fVEVTVF9QQVJUXzYpCisgIC8vY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2sgdGVzdHMKKyAgLy9GaXJzdDogYW4gaW52ZXJ0aWJsZSBtYXRyaXgKKyAgYm9vbCBpbnZlcnRpYmxlOworICBSZWFsU2NhbGFyIGRldDsKKworICBtMi5zZXRaZXJvKCk7CisgIG0xLmNvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrKG0yLCBkZXQsIGludmVydGlibGUpOworICBWRVJJRlkoaW52ZXJ0aWJsZSk7CisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xKm0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkZXQsIG0xLmRldGVybWluYW50KCkpOworCisgIG0yLnNldFplcm8oKTsKKyAgbTEuY29tcHV0ZUludmVyc2VXaXRoQ2hlY2sobTIsIGludmVydGlibGUpOworICBWRVJJRlkoaW52ZXJ0aWJsZSk7CisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xKm0yKTsKKworICAvL1NlY29uZDogYSByYW5rIG9uZSBtYXRyaXggKG5vdCBpbnZlcnRpYmxlLCBleGNlcHQgZm9yIDF4MSBtYXRyaWNlcykKKyAgVmVjdG9yVHlwZSB2MyA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgTWF0cml4VHlwZSBtMyA9IHYzKnYzLnRyYW5zcG9zZSgpLCBtNChyb3dzLGNvbHMpOworICBtMy5jb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjayhtNCwgZGV0LCBpbnZlcnRpYmxlKTsKKyAgVkVSSUZZKCByb3dzPT0xID8gaW52ZXJ0aWJsZSA6ICFpbnZlcnRpYmxlICk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihpbnRlcm5hbDo6YWJzKGRldC1tMy5kZXRlcm1pbmFudCgpKSwgUmVhbFNjYWxhcigxKSk7CisgIG0zLmNvbXB1dGVJbnZlcnNlV2l0aENoZWNrKG00LCBpbnZlcnRpYmxlKTsKKyAgVkVSSUZZKCByb3dzPT0xID8gaW52ZXJ0aWJsZSA6ICFpbnZlcnRpYmxlICk7CisjZW5kaWYKKworICAvLyBjaGVjayBpbi1wbGFjZSBpbnZlcnNpb24KKyAgaWYoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+PTIgJiYgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU8PTQpCisgIHsKKyAgICAvLyBpbi1wbGFjZSBpcyBmb3JiaWRkZW4KKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMSA9IG0xLmludmVyc2UoKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgbTIgPSBtMS5pbnZlcnNlKCk7CisgICAgbTEgPSBtMS5pbnZlcnNlKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSxtMik7CisgIH0KK30KKwordm9pZCB0ZXN0X2ludmVyc2UoKQoreworICBpbnQgczsKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggaW52ZXJzZShNYXRyaXg8ZG91YmxlLDEsMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggaW52ZXJzZShNYXRyaXgyZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBpbnZlcnNlKE1hdHJpeDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGludmVyc2UoTWF0cml4NGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggaW52ZXJzZShNYXRyaXg8ZmxvYXQsNCw0LERvbnRBbGlnbj4oKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDUwLDMyMCk7CisgICAgQ0FMTF9TVUJURVNUXzUoIGludmVyc2UoTWF0cml4WGYocyxzKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDI1LDEwMCk7CisgICAgQ0FMTF9TVUJURVNUXzYoIGludmVyc2UoTWF0cml4WGNkKHMscykpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIGludmVyc2UoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggaW52ZXJzZShNYXRyaXg8ZG91YmxlLDQsNCxEb250QWxpZ24+KCkpICk7CisgIH0KKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHMpCit9CmRpZmYgLS1naXQgYS90ZXN0L2phY29iaS5jcHAgYi90ZXN0L2phY29iaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0ZjVkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvamFjb2JpLmNwcApAQCAtMCwwICsxLDgxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vU1ZEPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBKYWNvYmlTY2FsYXI+Cit2b2lkIGphY29iaShjb25zdCBNYXRyaXhUeXBlJiBtID0gTWF0cml4VHlwZSgpKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIGVudW0geworICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZQorICB9OworCisgIHR5cGVkZWYgTWF0cml4PEphY29iaVNjYWxhciwgMiwgMT4gSmFjb2JpVmVjdG9yOworCisgIGNvbnN0IE1hdHJpeFR5cGUgYShNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scykpOworCisgIEphY29iaVZlY3RvciB2ID0gSmFjb2JpVmVjdG9yOjpSYW5kb20oKS5ub3JtYWxpemVkKCk7CisgIEphY29iaVNjYWxhciBjID0gdi54KCksIHMgPSB2LnkoKTsKKyAgSmFjb2JpUm90YXRpb248SmFjb2JpU2NhbGFyPiByb3QoYywgcyk7CisKKyAgeworICAgIEluZGV4IHAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpOworICAgIEluZGV4IHE7CisgICAgZG8geworICAgICAgcSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSk7CisgICAgfSB3aGlsZSAocSA9PSBwKTsKKworICAgIE1hdHJpeFR5cGUgYiA9IGE7CisgICAgYi5hcHBseU9uVGhlTGVmdChwLCBxLCByb3QpOworICAgIFZFUklGWV9JU19BUFBST1goYi5yb3cocCksIGMgKiBhLnJvdyhwKSArIGludGVybmFsOjpjb25qKHMpICogYS5yb3cocSkpOworICAgIFZFUklGWV9JU19BUFBST1goYi5yb3cocSksIC1zICogYS5yb3cocCkgKyBpbnRlcm5hbDo6Y29uaihjKSAqIGEucm93KHEpKTsKKyAgfQorCisgIHsKKyAgICBJbmRleCBwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKyAgICBJbmRleCBxOworICAgIGRvIHsKKyAgICAgIHEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworICAgIH0gd2hpbGUgKHEgPT0gcCk7CisKKyAgICBNYXRyaXhUeXBlIGIgPSBhOworICAgIGIuYXBwbHlPblRoZVJpZ2h0KHAsIHEsIHJvdCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChiLmNvbChwKSwgYyAqIGEuY29sKHApIC0gcyAqIGEuY29sKHEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGIuY29sKHEpLCBpbnRlcm5hbDo6Y29uaihzKSAqIGEuY29sKHApICsgaW50ZXJuYWw6OmNvbmooYykgKiBhLmNvbChxKSk7CisgIH0KK30KKwordm9pZCB0ZXN0X2phY29iaSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoKCBqYWNvYmk8TWF0cml4M2YsIGZsb2F0PigpICkpOworICAgIENBTExfU1VCVEVTVF8yKCggamFjb2JpPE1hdHJpeDRkLCBkb3VibGU+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKCBqYWNvYmk8TWF0cml4NGNmLCBmbG9hdD4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoIGphY29iaTxNYXRyaXg0Y2YsIHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpICkpOworCisgICAgaW50IHIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkvMiksCisgICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkvMik7CisgICAgQ0FMTF9TVUJURVNUXzQoKCBqYWNvYmk8TWF0cml4WGYsIGZsb2F0PihNYXRyaXhYZihyLGMpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoIGphY29iaTxNYXRyaXhYY2QsIGRvdWJsZT4oTWF0cml4WGNkKHIsYykpICkpOworICAgIENBTExfU1VCVEVTVF81KCggamFjb2JpPE1hdHJpeFhjZCwgc3RkOjpjb21wbGV4PGRvdWJsZT4gPihNYXRyaXhYY2QocixjKSkgKSk7CisgICAgLy8gY29tcGxleDxmbG9hdD4gaXMgcmVhbGx5IGltcG9ydGFudCB0byB0ZXN0IGFzIGl0IGlzIHRoZSBvbmx5IHdheSB0byBjb3ZlciBjb25qdWdhdGlvbiBpc3N1ZXMgaW4gY2VydGFpbiB1bmFsaWduZWQgcGF0aHMKKyAgICBDQUxMX1NVQlRFU1RfNigoIGphY29iaTxNYXRyaXhYY2YsIGZsb2F0PihNYXRyaXhYY2YocixjKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKCBqYWNvYmk8TWF0cml4WGNmLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oTWF0cml4WGNmKHIsYykpICkpOworICAgICh2b2lkKSByOworICAgICh2b2lkKSBjOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2phY29iaXN2ZC5jcHAgYi90ZXN0L2phY29iaXN2ZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjNTY3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvamFjb2Jpc3ZkLmNwcApAQCAtMCwwICsxLDM1MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyBkaXNjYXJkIHN0YWNrIGFsbG9jYXRpb24gYXMgdGhhdCB0b28gYnlwYXNzZXMgbWFsbG9jCisjZGVmaW5lIEVJR0VOX1NUQUNLX0FMTE9DQVRJT05fTElNSVQgMAorI2RlZmluZSBFSUdFTl9SVU5USU1FX05PX01BTExPQworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9TVkQ+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBRUlByZWNvbmRpdGlvbmVyPgordm9pZCBqYWNvYmlzdmRfY2hlY2tfZnVsbChjb25zdCBNYXRyaXhUeXBlJiBtLCBjb25zdCBKYWNvYmlTVkQ8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj4mIHN2ZCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lCisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIFJvd3NBdENvbXBpbGVUaW1lPiBNYXRyaXhVVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBDb2xzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWU+IE1hdHJpeFZUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCAxPiBDb2xWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCAxPiBJbnB1dFZlY3RvclR5cGU7CisKKyAgTWF0cml4VHlwZSBzaWdtYSA9IE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKTsKKyAgc2lnbWEuZGlhZ29uYWwoKSA9IHN2ZC5zaW5ndWxhclZhbHVlcygpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICBNYXRyaXhVVHlwZSB1ID0gc3ZkLm1hdHJpeFUoKTsKKyAgTWF0cml4VlR5cGUgdiA9IHN2ZC5tYXRyaXhWKCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCB1ICogc2lnbWEgKiB2LmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19VTklUQVJZKHUpOworICBWRVJJRllfSVNfVU5JVEFSWSh2KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXI+Cit2b2lkIGphY29iaXN2ZF9jb21wYXJlX3RvX2Z1bGwoY29uc3QgTWF0cml4VHlwZSYgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29tcHV0YXRpb25PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEphY29iaVNWRDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPiYgcmVmZXJlbmNlU3ZkKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKyAgSW5kZXggZGlhZ1NpemUgPSAoc3RkOjptaW4pKHJvd3MsIGNvbHMpOworCisgIEphY29iaVNWRDxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPiBzdmQobSwgY29tcHV0YXRpb25PcHRpb25zKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHN2ZC5zaW5ndWxhclZhbHVlcygpLCByZWZlcmVuY2VTdmQuc2luZ3VsYXJWYWx1ZXMoKSk7CisgIGlmKGNvbXB1dGF0aW9uT3B0aW9ucyAmIENvbXB1dGVGdWxsVSkKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN2ZC5tYXRyaXhVKCksIHJlZmVyZW5jZVN2ZC5tYXRyaXhVKCkpOworICBpZihjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlVGhpblUpCisgICAgVkVSSUZZX0lTX0FQUFJPWChzdmQubWF0cml4VSgpLCByZWZlcmVuY2VTdmQubWF0cml4VSgpLmxlZnRDb2xzKGRpYWdTaXplKSk7CisgIGlmKGNvbXB1dGF0aW9uT3B0aW9ucyAmIENvbXB1dGVGdWxsVikKKyAgICBWRVJJRllfSVNfQVBQUk9YKHN2ZC5tYXRyaXhWKCksIHJlZmVyZW5jZVN2ZC5tYXRyaXhWKCkpOworICBpZihjb21wdXRhdGlvbk9wdGlvbnMgJiBDb21wdXRlVGhpblYpCisgICAgVkVSSUZZX0lTX0FQUFJPWChzdmQubWF0cml4VigpLCByZWZlcmVuY2VTdmQubWF0cml4VigpLmxlZnRDb2xzKGRpYWdTaXplKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBRUlByZWNvbmRpdGlvbmVyPgordm9pZCBqYWNvYmlzdmRfc29sdmUoY29uc3QgTWF0cml4VHlwZSYgbSwgdW5zaWduZWQgaW50IGNvbXB1dGF0aW9uT3B0aW9ucykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCBEeW5hbWljPiBSaHNUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBEeW5hbWljPiBTb2x1dGlvblR5cGU7CisKKyAgUmhzVHlwZSByaHMgPSBSaHNUeXBlOjpSYW5kb20ocm93cywgaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgY29scykpOworICBKYWNvYmlTVkQ8TWF0cml4VHlwZSwgUVJQcmVjb25kaXRpb25lcj4gc3ZkKG0sIGNvbXB1dGF0aW9uT3B0aW9ucyk7CisgIFNvbHV0aW9uVHlwZSB4ID0gc3ZkLnNvbHZlKHJocyk7CisgIC8vIGV2YWx1YXRlIG5vcm1hbCBlcXVhdGlvbiB3aGljaCB3b3JrcyBhbHNvIGZvciBsZWFzdC1zcXVhcmVzIHNvbHV0aW9ucworICBWRVJJRllfSVNfQVBQUk9YKG0uYWRqb2ludCgpKm0qeCxtLmFkam9pbnQoKSpyaHMpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgUVJQcmVjb25kaXRpb25lcj4KK3ZvaWQgamFjb2Jpc3ZkX3Rlc3RfYWxsX2NvbXB1dGF0aW9uX29wdGlvbnMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgaWYgKFFSUHJlY29uZGl0aW9uZXIgPT0gTm9RUlByZWNvbmRpdGlvbmVyICYmIG0ucm93cygpICE9IG0uY29scygpKQorICAgIHJldHVybjsKKyAgSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXI+IGZ1bGxTdmQobSwgQ29tcHV0ZUZ1bGxVfENvbXB1dGVGdWxsVik7CisKKyAgamFjb2Jpc3ZkX2NoZWNrX2Z1bGwobSwgZnVsbFN2ZCk7CisgIGphY29iaXN2ZF9zb2x2ZTxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPihtLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOworCisgIGlmKFFSUHJlY29uZGl0aW9uZXIgPT0gRnVsbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcikKKyAgICByZXR1cm47CisKKyAgamFjb2Jpc3ZkX2NvbXBhcmVfdG9fZnVsbChtLCBDb21wdXRlRnVsbFUsIGZ1bGxTdmQpOworICBqYWNvYmlzdmRfY29tcGFyZV90b19mdWxsKG0sIENvbXB1dGVGdWxsViwgZnVsbFN2ZCk7CisgIGphY29iaXN2ZF9jb21wYXJlX3RvX2Z1bGwobSwgMCwgZnVsbFN2ZCk7CisKKyAgaWYgKE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMpIHsKKyAgICAvLyB0aGluIFUvViBhcmUgb25seSBhdmFpbGFibGUgd2l0aCBkeW5hbWljIG51bWJlciBvZiBjb2x1bW5zCisgICAgamFjb2Jpc3ZkX2NvbXBhcmVfdG9fZnVsbChtLCBDb21wdXRlRnVsbFV8Q29tcHV0ZVRoaW5WLCBmdWxsU3ZkKTsKKyAgICBqYWNvYmlzdmRfY29tcGFyZV90b19mdWxsKG0sICAgICAgICAgICAgICBDb21wdXRlVGhpblYsIGZ1bGxTdmQpOworICAgIGphY29iaXN2ZF9jb21wYXJlX3RvX2Z1bGwobSwgQ29tcHV0ZVRoaW5VfENvbXB1dGVGdWxsViwgZnVsbFN2ZCk7CisgICAgamFjb2Jpc3ZkX2NvbXBhcmVfdG9fZnVsbChtLCBDb21wdXRlVGhpblUgICAgICAgICAgICAgLCBmdWxsU3ZkKTsKKyAgICBqYWNvYmlzdmRfY29tcGFyZV90b19mdWxsKG0sIENvbXB1dGVUaGluVXxDb21wdXRlVGhpblYsIGZ1bGxTdmQpOworICAgIGphY29iaXN2ZF9zb2x2ZTxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPihtLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlVGhpblYpOworICAgIGphY29iaXN2ZF9zb2x2ZTxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPihtLCBDb21wdXRlVGhpblUgfCBDb21wdXRlRnVsbFYpOworICAgIGphY29iaXN2ZF9zb2x2ZTxNYXRyaXhUeXBlLCBRUlByZWNvbmRpdGlvbmVyPihtLCBDb21wdXRlVGhpblUgfCBDb21wdXRlVGhpblYpOworCisgICAgLy8gdGVzdCByZWNvbnN0cnVjdGlvbgorICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgSW5kZXggZGlhZ1NpemUgPSAoc3RkOjptaW4pKG0ucm93cygpLCBtLmNvbHMoKSk7CisgICAgSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXI+IHN2ZChtLCBDb21wdXRlVGhpblUgfCBDb21wdXRlVGhpblYpOworICAgIFZFUklGWV9JU19BUFBST1gobSwgc3ZkLm1hdHJpeFUoKS5sZWZ0Q29scyhkaWFnU2l6ZSkgKiBzdmQuc2luZ3VsYXJWYWx1ZXMoKS5hc0RpYWdvbmFsKCkgKiBzdmQubWF0cml4VigpLmxlZnRDb2xzKGRpYWdTaXplKS5hZGpvaW50KCkpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGphY29iaXN2ZChjb25zdCBNYXRyaXhUeXBlJiBhID0gTWF0cml4VHlwZSgpLCBib29sIHBpY2tyYW5kb20gPSB0cnVlKQoreworICBNYXRyaXhUeXBlIG0gPSBwaWNrcmFuZG9tID8gTWF0cml4VHlwZTo6UmFuZG9tKGEucm93cygpLCBhLmNvbHMoKSkgOiBhOworCisgIGphY29iaXN2ZF90ZXN0X2FsbF9jb21wdXRhdGlvbl9vcHRpb25zPE1hdHJpeFR5cGUsIEZ1bGxQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+KG0pOworICBqYWNvYmlzdmRfdGVzdF9hbGxfY29tcHV0YXRpb25fb3B0aW9uczxNYXRyaXhUeXBlLCBDb2xQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+KG0pOworICBqYWNvYmlzdmRfdGVzdF9hbGxfY29tcHV0YXRpb25fb3B0aW9uczxNYXRyaXhUeXBlLCBIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+KG0pOworICBqYWNvYmlzdmRfdGVzdF9hbGxfY29tcHV0YXRpb25fb3B0aW9uczxNYXRyaXhUeXBlLCBOb1FSUHJlY29uZGl0aW9uZXI+KG0pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGphY29iaXN2ZF92ZXJpZnlfYXNzZXJ0KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgZW51bSB7CisgICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lCisgIH07CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgMT4gUmhzVHlwZTsKKworICBSaHNUeXBlIHJocyhyb3dzKTsKKworICBKYWNvYmlTVkQ8TWF0cml4VHlwZT4gc3ZkOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQubWF0cml4VSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQuc2luZ3VsYXJWYWx1ZXMoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLm1hdHJpeFYoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLnNvbHZlKHJocykpCisKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKTsKKyAgYS5zZXRaZXJvKCk7CisgIHN2ZC5jb21wdXRlKGEsIDApOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQubWF0cml4VSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQubWF0cml4VigpKQorICBzdmQuc2luZ3VsYXJWYWx1ZXMoKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLnNvbHZlKHJocykpCisKKyAgaWYgKENvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMpCisgIHsKKyAgICBzdmQuY29tcHV0ZShhLCBDb21wdXRlVGhpblUpOworICAgIHN2ZC5tYXRyaXhVKCk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLm1hdHJpeFYoKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQuc29sdmUocmhzKSkKKworICAgIHN2ZC5jb21wdXRlKGEsIENvbXB1dGVUaGluVik7CisgICAgc3ZkLm1hdHJpeFYoKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQubWF0cml4VSgpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHN2ZC5zb2x2ZShyaHMpKQorCisgICAgSmFjb2JpU1ZEPE1hdHJpeFR5cGUsIEZ1bGxQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+IHN2ZF9mdWxscXI7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkX2Z1bGxxci5jb21wdXRlKGEsIENvbXB1dGVGdWxsVXxDb21wdXRlVGhpblYpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHN2ZF9mdWxscXIuY29tcHV0ZShhLCBDb21wdXRlVGhpblV8Q29tcHV0ZVRoaW5WKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmRfZnVsbHFyLmNvbXB1dGUoYSwgQ29tcHV0ZVRoaW5VfENvbXB1dGVGdWxsVikpCisgIH0KKyAgZWxzZQorICB7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkLmNvbXB1dGUoYSwgQ29tcHV0ZVRoaW5VKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChzdmQuY29tcHV0ZShhLCBDb21wdXRlVGhpblYpKQorICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGphY29iaXN2ZF9tZXRob2QoKQoreworICBlbnVtIHsgU2l6ZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBTaXplLCAxPiBSZWFsVmVjVHlwZTsKKyAgTWF0cml4VHlwZSBtID0gTWF0cml4VHlwZTo6SWRlbnRpdHkoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLmphY29iaVN2ZCgpLnNpbmd1bGFyVmFsdWVzKCksIFJlYWxWZWNUeXBlOjpPbmVzKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtLmphY29iaVN2ZCgpLm1hdHJpeFUoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0uamFjb2JpU3ZkKCkubWF0cml4VigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLmphY29iaVN2ZChDb21wdXRlRnVsbFV8Q29tcHV0ZUZ1bGxWKS5zb2x2ZShtKSwgbSk7Cit9CisKKy8vIHdvcmsgYXJvdW5kIHN0dXBpZCBtc3ZjIGVycm9yIHdoZW4gY29uc3RydWN0aW5nIGF0IGNvbXBpbGUgdGltZSBhbiBleHByZXNzaW9uIHRoYXQgaW52b2x2ZXMKKy8vIGEgZGl2aXNpb24gYnkgemVybywgZXZlbiBpZiB0aGUgbnVtZXJpYyB0eXBlIGhhcyBmbG9hdGluZyBwb2ludAordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyIHplcm8oKSB7IHJldHVybiBTY2FsYXIoMCk7IH0KKworLy8gd29ya2Fyb3VuZCBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbiBpbiBJQ0MKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IEVJR0VOX0RPTlRfSU5MSU5FICBUIHN1YihUIGEsIFQgYikgeyByZXR1cm4gYSAtIGI7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgamFjb2Jpc3ZkX2luZl9uYW4oKQoreworICAvLyBhbGwgdGhpcyBmdW5jdGlvbiBkb2VzIGlzIHZlcmlmeSB3ZSBkb24ndCBpdGVyYXRlIGluZmluaXRlbHkgb24gbmFuL2luZiB2YWx1ZXMKKworICBKYWNvYmlTVkQ8TWF0cml4VHlwZT4gc3ZkOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIFNjYWxhciBzb21lX2luZiA9IFNjYWxhcigxKSAvIHplcm88U2NhbGFyPigpOworICBWRVJJRlkoc3ViKHNvbWVfaW5mLCBzb21lX2luZikgIT0gc3ViKHNvbWVfaW5mLCBzb21lX2luZikpOworICBzdmQuY29tcHV0ZShNYXRyaXhUeXBlOjpDb25zdGFudCgxMCwxMCxzb21lX2luZiksIENvbXB1dGVGdWxsVSB8IENvbXB1dGVGdWxsVik7CisKKyAgU2NhbGFyIHNvbWVfbmFuID0gemVybzxTY2FsYXI+KCkgLyB6ZXJvPFNjYWxhcj4oKTsKKyAgVkVSSUZZKHNvbWVfbmFuICE9IHNvbWVfbmFuKTsKKyAgc3ZkLmNvbXB1dGUoTWF0cml4VHlwZTo6Q29uc3RhbnQoMTAsMTAsc29tZV9uYW4pLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOworCisgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6Olplcm8oMTAsMTApOworICBtKGludGVybmFsOjpyYW5kb208aW50PigwLDkpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCw5KSkgPSBzb21lX2luZjsKKyAgc3ZkLmNvbXB1dGUobSwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWKTsKKworICBtID0gTWF0cml4VHlwZTo6WmVybygxMCwxMCk7CisgIG0oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsOSksIGludGVybmFsOjpyYW5kb208aW50PigwLDkpKSA9IHNvbWVfbmFuOworICBzdmQuY29tcHV0ZShtLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOworfQorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyODY6IEphY29iaVNWRCBsb29wcyBpbmRlZmluaXRlbHkgd2l0aCBzb21lCisvLyBtYXRyaWNlcyBjb250YWluaW5nIGRlbm9ybWFsIG51bWJlcnMuCit2b2lkIGphY29iaXN2ZF9idWcyODYoKQoreworI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorLy8gc2h1dCB1cCB3YXJuaW5nICMyMzk6IGZsb2F0aW5nIHBvaW50IHVuZGVyZmxvdworI3ByYWdtYSB3YXJuaW5nIHB1c2gKKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDIzOQorI2VuZGlmCisgIE1hdHJpeDJkIE07CisgIE0gPDwgLTcuOTA4ODRlLTMxMywgLTQuOTRlLTMyNCwKKyAgICAgICAgICAgICAgICAgMCwgNS42MDg0NGUtMzEzOworI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorI3ByYWdtYSB3YXJuaW5nIHBvcAorI2VuZGlmCisgIEphY29iaVNWRDxNYXRyaXgyZD4gc3ZkOworICBzdmQuY29tcHV0ZShNKTsgLy8ganVzdCBjaGVjayB3ZSBkb24ndCBsb29wIGluZGVmaW5pdGVseQorfQorCit2b2lkIGphY29iaXN2ZF9wcmVhbGxvY2F0ZSgpCit7CisgIFZlY3RvcjNmIHYoMy5mLCAyLmYsIDEuZik7CisgIE1hdHJpeFhmIG0gPSB2LmFzRGlhZ29uYWwoKTsKKworICBpbnRlcm5hbDo6c2V0X2lzX21hbGxvY19hbGxvd2VkKGZhbHNlKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVmVjdG9yWGYgdigxMCk7KQorICBKYWNvYmlTVkQ8TWF0cml4WGY+IHN2ZDsKKyAgaW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZCh0cnVlKTsKKyAgc3ZkLmNvbXB1dGUobSk7CisgIFZFUklGWV9JU19BUFBST1goc3ZkLnNpbmd1bGFyVmFsdWVzKCksIHYpOworCisgIEphY29iaVNWRDxNYXRyaXhYZj4gc3ZkMigzLDMpOworICBpbnRlcm5hbDo6c2V0X2lzX21hbGxvY19hbGxvd2VkKGZhbHNlKTsKKyAgc3ZkMi5jb21wdXRlKG0pOworICBpbnRlcm5hbDo6c2V0X2lzX21hbGxvY19hbGxvd2VkKHRydWUpOworICBWRVJJRllfSVNfQVBQUk9YKHN2ZDIuc2luZ3VsYXJWYWx1ZXMoKSwgdik7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHN2ZDIubWF0cml4VSgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoc3ZkMi5tYXRyaXhWKCkpOworICBzdmQyLmNvbXB1dGUobSwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdmQyLm1hdHJpeFUoKSwgTWF0cml4M2Y6OklkZW50aXR5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHN2ZDIubWF0cml4VigpLCBNYXRyaXgzZjo6SWRlbnRpdHkoKSk7CisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQoZmFsc2UpOworICBzdmQyLmNvbXB1dGUobSk7CisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQodHJ1ZSk7CisKKyAgSmFjb2JpU1ZEPE1hdHJpeFhmPiBzdmQzKDMsMyxDb21wdXRlRnVsbFV8Q29tcHV0ZUZ1bGxWKTsKKyAgaW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7CisgIHN2ZDIuY29tcHV0ZShtKTsKKyAgaW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZCh0cnVlKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzdmQyLnNpbmd1bGFyVmFsdWVzKCksIHYpOworICBWRVJJRllfSVNfQVBQUk9YKHN2ZDIubWF0cml4VSgpLCBNYXRyaXgzZjo6SWRlbnRpdHkoKSk7CisgIFZFUklGWV9JU19BUFBST1goc3ZkMi5tYXRyaXhWKCksIE1hdHJpeDNmOjpJZGVudGl0eSgpKTsKKyAgaW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7CisgIHN2ZDIuY29tcHV0ZShtLCBDb21wdXRlRnVsbFV8Q29tcHV0ZUZ1bGxWKTsKKyAgaW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZCh0cnVlKTsKK30KKwordm9pZCB0ZXN0X2phY29iaXN2ZCgpCit7CisgIENBTExfU1VCVEVTVF8zKCggamFjb2Jpc3ZkX3ZlcmlmeV9hc3NlcnQoTWF0cml4M2YoKSkgKSk7CisgIENBTExfU1VCVEVTVF80KCggamFjb2Jpc3ZkX3ZlcmlmeV9hc3NlcnQoTWF0cml4NGQoKSkgKSk7CisgIENBTExfU1VCVEVTVF83KCggamFjb2Jpc3ZkX3ZlcmlmeV9hc3NlcnQoTWF0cml4WGYoMTAsMTIpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzgoKCBqYWNvYmlzdmRfdmVyaWZ5X2Fzc2VydChNYXRyaXhYY2QoNyw1KSkgKSk7CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBNYXRyaXgyY2QgbTsKKyAgICBtIDw8IDAsIDEsCisgICAgICAgICAwLCAxOworICAgIENBTExfU1VCVEVTVF8xKCggamFjb2Jpc3ZkKG0sIGZhbHNlKSApKTsKKyAgICBtIDw8IDEsIDAsCisgICAgICAgICAxLCAwOworICAgIENBTExfU1VCVEVTVF8xKCggamFjb2Jpc3ZkKG0sIGZhbHNlKSApKTsKKworICAgIE1hdHJpeDJkIG47CisgICAgbiA8PCAwLCAwLAorICAgICAgICAgMCwgMDsKKyAgICBDQUxMX1NVQlRFU1RfMigoIGphY29iaXN2ZChuLCBmYWxzZSkgKSk7CisgICAgbiA8PCAwLCAwLAorICAgICAgICAgMCwgMTsKKyAgICBDQUxMX1NVQlRFU1RfMigoIGphY29iaXN2ZChuLCBmYWxzZSkgKSk7CisgICAgCisgICAgQ0FMTF9TVUJURVNUXzMoKCBqYWNvYmlzdmQ8TWF0cml4M2Y+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKCBqYWNvYmlzdmQ8TWF0cml4NGQ+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKCBqYWNvYmlzdmQ8TWF0cml4PGZsb2F0LDMsNT4gPigpICkpOworICAgIENBTExfU1VCVEVTVF82KCggamFjb2Jpc3ZkPE1hdHJpeDxkb3VibGUsRHluYW1pYywyPiA+KE1hdHJpeDxkb3VibGUsRHluYW1pYywyPigxMCwyKSkgKSk7CisKKyAgICBpbnQgciA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAzMCksCisgICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMzApOworICAgIENBTExfU1VCVEVTVF83KCggamFjb2Jpc3ZkPE1hdHJpeFhmPihNYXRyaXhYZihyLGMpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfOCgoIGphY29iaXN2ZDxNYXRyaXhYY2Q+KE1hdHJpeFhjZChyLGMpKSApKTsKKyAgICAodm9pZCkgcjsKKyAgICAodm9pZCkgYzsKKworICAgIC8vIFRlc3Qgb24gaW5mL25hbiBtYXRyaXgKKyAgICBDQUxMX1NVQlRFU1RfNyggamFjb2Jpc3ZkX2luZl9uYW48TWF0cml4WGY+KCkgKTsKKyAgfQorCisgIENBTExfU1VCVEVTVF83KCggamFjb2Jpc3ZkPE1hdHJpeFhmPihNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oRUlHRU5fVEVTVF9NQVhfU0laRS80LCBFSUdFTl9URVNUX01BWF9TSVpFLzIpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oRUlHRU5fVEVTVF9NQVhfU0laRS80LCBFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKSk7CisgIENBTExfU1VCVEVTVF84KCggamFjb2Jpc3ZkPE1hdHJpeFhjZD4oTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFLzQsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMyksIGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFLzQsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMykpKSApKTsKKworICAvLyB0ZXN0IG1hdHJpeGJhc2UgbWV0aG9kCisgIENBTExfU1VCVEVTVF8xKCggamFjb2Jpc3ZkX21ldGhvZDxNYXRyaXgyY2Q+KCkgKSk7CisgIENBTExfU1VCVEVTVF8zKCggamFjb2Jpc3ZkX21ldGhvZDxNYXRyaXgzZj4oKSApKTsKKworICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKKyAgQ0FMTF9TVUJURVNUXzcoIEphY29iaVNWRDxNYXRyaXhYZj4oMTAsMTApICk7CisKKyAgLy8gQ2hlY2sgdGhhdCBwcmVhbGxvY2F0aW9uIGF2b2lkcyBzdWJzZXF1ZW50IG1hbGxvY3MKKyAgQ0FMTF9TVUJURVNUXzkoIGphY29iaXN2ZF9wcmVhbGxvY2F0ZSgpICk7CisKKyAgLy8gUmVncmVzc2lvbiBjaGVjayBmb3IgYnVnIDI4NgorICBDQUxMX1NVQlRFU1RfMiggamFjb2Jpc3ZkX2J1ZzI4NigpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2xpbmVhcnN0cnVjdHVyZS5jcHAgYi90ZXN0L2xpbmVhcnN0cnVjdHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwNzFjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbGluZWFyc3RydWN0dXJlLmNwcApAQCAtMCwwICsxLDgzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBsaW5lYXJTdHJ1Y3R1cmUoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBDd2lzZVVuYXJ5T3AuaCwgQ3dpc2VCaW5hcnlPcC5oLCBTZWxmQ3dpc2VCaW5hcnlPcC5oIAorICAqLworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICB3aGlsZSAoaW50ZXJuYWw6OmFicyhzMSk8MWUtMykgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKKyAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgtKC1tMSksICAgICAgICAgICAgICAgICAgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xK20xLCAgICAgICAgICAgICAgICAgICAyKm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSttMi1tMSwgICAgICAgICAgICAgICAgbTIpOworICBWRVJJRllfSVNfQVBQUk9YKC1tMittMSttMiwgICAgICAgICAgICAgICBtMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEqczEsICAgICAgICAgICAgICAgICAgIHMxKm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTErbTIpKnMxLCAgICAgICAgICAgICAgczEqbTErczEqbTIpOworICBWRVJJRllfSVNfQVBQUk9YKCgtbTErbTIpKnMxLCAgICAgICAgICAgICAtczEqbTErczEqbTIpOworICBtMyA9IG0yOyBtMyArPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgbTErbTIpOworICBtMyA9IG0yOyBtMyAtPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgbTItbTEpOworICBtMyA9IG0yOyBtMyAqPSBzMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgczEqbTIpOworICBpZighTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikKKyAgeworICAgIG0zID0gbTI7IG0zIC89IHMxOworICAgIFZFUklGWV9JU19BUFBST1gobTMsICAgICAgICAgICAgICAgICAgICBtMi9zMSk7CisgIH0KKworICAvLyBhZ2FpbiwgdGVzdCBvcGVyYXRvcigpIHRvIGNoZWNrIGNvbnN0LXF1YWxpZmljYXRpb24KKyAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xKShyLGMpLCAtKG0xKHIsYykpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEtbTIpKHIsYyksIChtMShyLGMpKS0obTIocixjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSttMikocixjKSwgKG0xKHIsYykpKyhtMihyLGMpKSk7CisgIFZFUklGWV9JU19BUFBST1goKHMxKm0xKShyLGMpLCBzMSoobTEocixjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSpzMSkocixjKSwgKG0xKHIsYykpKnMxKTsKKyAgaWYoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpCisgICAgVkVSSUZZX0lTX0FQUFJPWCgobTEvczEpKHIsYyksIChtMShyLGMpKS9zMSk7CisKKyAgLy8gdXNlIC5ibG9jayB0byBkaXNhYmxlIHZlY3Rvcml6YXRpb24gYW5kIGNvbXBhcmUgdG8gdGhlIHZlY3Rvcml6ZWQgdmVyc2lvbgorICBWRVJJRllfSVNfQVBQUk9YKG0xK20xLmJsb2NrKDAsMCxyb3dzLGNvbHMpLCBtMSttMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2VQcm9kdWN0KG0xLmJsb2NrKDAsMCxyb3dzLGNvbHMpKSwgbTEuY3dpc2VQcm9kdWN0KG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEgLSBtMS5ibG9jaygwLDAscm93cyxjb2xzKSwgbTEgLSBtMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2soMCwwLHJvd3MsY29scykgKiBzMSwgbTEgKiBzMSk7Cit9CisKK3ZvaWQgdGVzdF9saW5lYXJzdHJ1Y3R1cmUoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBsaW5lYXJTdHJ1Y3R1cmUoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBsaW5lYXJTdHJ1Y3R1cmUoTWF0cml4MmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbGluZWFyU3RydWN0dXJlKFZlY3RvcjNkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGxpbmVhclN0cnVjdHVyZShNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF81KCBsaW5lYXJTdHJ1Y3R1cmUoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSApOworICAgIENBTExfU1VCVEVTVF82KCBsaW5lYXJTdHJ1Y3R1cmUoTWF0cml4WGYgKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIGxpbmVhclN0cnVjdHVyZShNYXRyaXhYaSAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOCggbGluZWFyU3RydWN0dXJlKE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOSggbGluZWFyU3RydWN0dXJlKEFycmF5WFhmIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2x1LmNwcCBiL3Rlc3QvbHUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmNiMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2x1LmNwcApAQCAtMCwwICsxLDIwNyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vTFU+Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGx1X25vbl9pbnZlcnRpYmxlKCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBMVS5oCisgICovCisgIEluZGV4IHJvd3MsIGNvbHMsIGNvbHMyOworICBpZihNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgeworICAgIHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICB9CisgIGVsc2UKKyAgeworICAgIHJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZTsKKyAgfQorICBpZihNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgeworICAgIGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIGNvbHMyID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgY29sczIgPSBjb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU7CisgIH0KKworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6a2VybmVsX3JldHZhbF9iYXNlPEZ1bGxQaXZMVTxNYXRyaXhUeXBlPiA+OjpSZXR1cm5UeXBlIEtlcm5lbE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmltYWdlX3JldHZhbF9iYXNlPEZ1bGxQaXZMVTxNYXRyaXhUeXBlPiA+OjpSZXR1cm5UeXBlIEltYWdlTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBDb2xzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWU+CisgICAgICAgICAgQ01hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIFJvd3NBdENvbXBpbGVUaW1lPgorICAgICAgICAgIFJNYXRyaXhUeXBlOworCisgIEluZGV4IHJhbmsgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpLTEpOworCisgIC8vIFRoZSBpbWFnZSBvZiB0aGUgemVybyBtYXRyaXggc2hvdWxkIGNvbnNpc3Qgb2YgYSBzaW5nbGUgKHplcm8pIGNvbHVtbiB2ZWN0b3IKKyAgVkVSSUZZKChNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykuZnVsbFBpdkx1KCkuaW1hZ2UoTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpKS5jb2xzKCkgPT0gMSkpOworCisgIE1hdHJpeFR5cGUgbTEocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMyKTsKKyAgQ01hdHJpeFR5cGUgbTIoY29scywgY29sczIpOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLCByb3dzLCBjb2xzLCBtMSk7CisKKyAgRnVsbFBpdkxVPE1hdHJpeFR5cGU+IGx1OworCisgIC8vIFRoZSBzcGVjaWFsIHZhbHVlIDAuMDEgYmVsb3cgd29ya3Mgd2VsbCBpbiB0ZXN0cy4gS2VlcCBpbiBtaW5kIHRoYXQgd2UncmUgb25seSBjb21wdXRpbmcgdGhlIHJhbmsKKyAgLy8gb2Ygc2luZ3VsYXIgdmFsdWVzIGFyZSBlaXRoZXIgMCBvciAxLgorICAvLyBTbyBpdCdzIG5vdCBjbGVhciBhdCBhbGwgdGhhdCB0aGUgZXBzaWxvbiBzaG91bGQgcGxheSBhbnkgcm9sZSB0aGVyZS4KKyAgbHUuc2V0VGhyZXNob2xkKFJlYWxTY2FsYXIoMC4wMSkpOworICBsdS5jb21wdXRlKG0xKTsKKworICBNYXRyaXhUeXBlIHUocm93cyxjb2xzKTsKKyAgdSA9IGx1Lm1hdHJpeExVKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFJNYXRyaXhUeXBlIGwgPSBSTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cyxyb3dzKTsKKyAgbC5ibG9jaygwLDAscm93cywoc3RkOjptaW4pKHJvd3MsY29scykpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkKKyAgICA9IGx1Lm1hdHJpeExVKCkuYmxvY2soMCwwLHJvd3MsKHN0ZDo6bWluKShyb3dzLGNvbHMpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKGx1LnBlcm11dGF0aW9uUCgpICogbTEgKiBsdS5wZXJtdXRhdGlvblEoKSwgbCp1KTsKKworICBLZXJuZWxNYXRyaXhUeXBlIG0xa2VybmVsID0gbHUua2VybmVsKCk7CisgIEltYWdlTWF0cml4VHlwZSBtMWltYWdlID0gbHUuaW1hZ2UobTEpOworCisgIFZFUklGWV9JU19BUFBST1gobTEsIGx1LnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgIFZFUklGWShyYW5rID09IGx1LnJhbmsoKSk7CisgIFZFUklGWShjb2xzIC0gbHUucmFuaygpID09IGx1LmRpbWVuc2lvbk9mS2VybmVsKCkpOworICBWRVJJRlkoIWx1LmlzSW5qZWN0aXZlKCkpOworICBWRVJJRlkoIWx1LmlzSW52ZXJ0aWJsZSgpKTsKKyAgVkVSSUZZKCFsdS5pc1N1cmplY3RpdmUoKSk7CisgIFZFUklGWSgobTEgKiBtMWtlcm5lbCkuaXNNdWNoU21hbGxlclRoYW4obTEpKTsKKyAgVkVSSUZZKG0xaW1hZ2UuZnVsbFBpdkx1KCkucmFuaygpID09IHJhbmspOworICBWRVJJRllfSVNfQVBQUk9YKG0xICogbTEuYWRqb2ludCgpICogbTFpbWFnZSwgbTFpbWFnZSk7CisKKyAgbTIgPSBDTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsY29sczIpOworICBtMyA9IG0xKm0yOworICBtMiA9IENNYXRyaXhUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIC8vIHRlc3QgdGhhdCB0aGUgY29kZSwgd2hpY2ggZG9lcyByZXNpemUoKSwgbWF5IGJlIGFwcGxpZWQgdG8gYW4geHByCisgIG0yLmJsb2NrKDAsMCxtMi5yb3dzKCksbTIuY29scygpKSA9IGx1LnNvbHZlKG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGx1X2ludmVydGlibGUoKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIExVLmgKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisKKyAgTWF0cml4VHlwZSBtMShzaXplLCBzaXplKSwgbTIoc2l6ZSwgc2l6ZSksIG0zKHNpemUsIHNpemUpOworICBGdWxsUGl2TFU8TWF0cml4VHlwZT4gbHU7CisgIGx1LnNldFRocmVzaG9sZChSZWFsU2NhbGFyKDAuMDEpKTsKKyAgZG8geworICAgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgICAgbHUuY29tcHV0ZShtMSk7CisgIH0gd2hpbGUoIWx1LmlzSW52ZXJ0aWJsZSgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBsdS5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICBWRVJJRlkoMCA9PSBsdS5kaW1lbnNpb25PZktlcm5lbCgpKTsKKyAgVkVSSUZZKGx1Lmtlcm5lbCgpLmNvbHMoKSA9PSAxKTsgLy8gdGhlIGtlcm5lbCgpIHNob3VsZCBjb25zaXN0IG9mIGEgc2luZ2xlICh6ZXJvKSBjb2x1bW4gdmVjdG9yCisgIFZFUklGWShzaXplID09IGx1LnJhbmsoKSk7CisgIFZFUklGWShsdS5pc0luamVjdGl2ZSgpKTsKKyAgVkVSSUZZKGx1LmlzU3VyamVjdGl2ZSgpKTsKKyAgVkVSSUZZKGx1LmlzSW52ZXJ0aWJsZSgpKTsKKyAgVkVSSUZZKGx1LmltYWdlKG0xKS5mdWxsUGl2THUoKS5pc0ludmVydGlibGUoKSk7CisgIG0zID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIG0yID0gbHUuc29sdmUobTMpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSptMik7CisgIFZFUklGWV9JU19BUFBST1gobTIsIGx1LmludmVyc2UoKSptMyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbHVfcGFydGlhbF9waXYoKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIFBhcnRpYWxQaXZMVS5oCisgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSw0KTsKKyAgSW5kZXggY29scyA9IHJvd3M7CisKKyAgTWF0cml4VHlwZSBtMShjb2xzLCByb3dzKTsKKyAgbTEuc2V0UmFuZG9tKCk7CisgIFBhcnRpYWxQaXZMVTxNYXRyaXhUeXBlPiBwbHUobTEpOworCisgIFZFUklGWV9JU19BUFBST1gobTEsIHBsdS5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGx1X3ZlcmlmeV9hc3NlcnQoKQoreworICBNYXRyaXhUeXBlIHRtcDsKKworICBGdWxsUGl2TFU8TWF0cml4VHlwZT4gbHU7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGx1Lm1hdHJpeExVKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGx1LnBlcm11dGF0aW9uUCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsdS5wZXJtdXRhdGlvblEoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUua2VybmVsKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGx1LmltYWdlKHRtcCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGx1LnNvbHZlKHRtcCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGx1LmRldGVybWluYW50KCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGx1LnJhbmsoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUuZGltZW5zaW9uT2ZLZXJuZWwoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUuaXNJbmplY3RpdmUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobHUuaXNTdXJqZWN0aXZlKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGx1LmlzSW52ZXJ0aWJsZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChsdS5pbnZlcnNlKCkpCisKKyAgUGFydGlhbFBpdkxVPE1hdHJpeFR5cGU+IHBsdTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocGx1Lm1hdHJpeExVKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHBsdS5wZXJtdXRhdGlvblAoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocGx1LnNvbHZlKHRtcCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHBsdS5kZXRlcm1pbmFudCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChwbHUuaW52ZXJzZSgpKQorfQorCit2b2lkIHRlc3RfbHUoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXgzZj4oKSApOworICAgIENBTExfU1VCVEVTVF8xKCBsdV92ZXJpZnlfYXNzZXJ0PE1hdHJpeDNmPigpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMiggKGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeDxkb3VibGUsIDQsIDY+ID4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggKGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4PGRvdWJsZSwgNCwgNj4gPigpKSApOworCisgICAgQ0FMTF9TVUJURVNUXzMoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeFhmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIGx1X2ludmVydGlibGU8TWF0cml4WGY+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbHVfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZj4oKSApOworCisgICAgQ0FMTF9TVUJURVNUXzQoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeFhkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIGx1X2ludmVydGlibGU8TWF0cml4WGQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbHVfcGFydGlhbF9waXY8TWF0cml4WGQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbHVfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZD4oKSApOworCisgICAgQ0FMTF9TVUJURVNUXzUoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSApOworICAgIENBTExfU1VCVEVTVF81KCBsdV9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSApOworICAgIENBTExfU1VCVEVTVF81KCBsdV92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhjZj4oKSApOworCisgICAgQ0FMTF9TVUJURVNUXzYoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeFhjZD4oKSApOworICAgIENBTExfU1VCVEVTVF82KCBsdV9pbnZlcnRpYmxlPE1hdHJpeFhjZD4oKSApOworICAgIENBTExfU1VCVEVTVF82KCBsdV9wYXJ0aWFsX3BpdjxNYXRyaXhYY2Q+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbHVfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYY2Q+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF83KCggbHVfbm9uX2ludmVydGlibGU8TWF0cml4PGZsb2F0LER5bmFtaWMsMTY+ID4oKSApKTsKKworICAgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICAgIENBTExfU1VCVEVTVF85KCBQYXJ0aWFsUGl2TFU8TWF0cml4WGY+KDEwKSApOworICAgIENBTExfU1VCVEVTVF85KCBGdWxsUGl2TFU8TWF0cml4WGY+KDEwLCAyMCk7ICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbWFpbi5oIGIvdGVzdC9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhMzI3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFpbi5oCkBAIC0wLDAgKzEsNDcyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8Y29tcGxleD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxxdWV1ZT4KKworI2RlZmluZSBtaW4oQSxCKSBwbGVhc2VfcHJvdGVjdF95b3VyX21pbl93aXRoX3BhcmVudGhlc2VzCisjZGVmaW5lIG1heChBLEIpIHBsZWFzZV9wcm90ZWN0X3lvdXJfbWF4X3dpdGhfcGFyZW50aGVzZXMKKworI2RlZmluZSBGT1JCSURERU5fSURFTlRJRklFUiAodGhpc19pZGVudGlmaWVyX2lzX2ZvcmJpZGRlbl90b19hdm9pZF9jbGFzaGVzKSB0aGlzX2lkZW50aWZpZXJfaXNfZm9yYmlkZGVuX3RvX2F2b2lkX2NsYXNoZXMKKy8vIEIwIGlzIGRlZmluZWQgaW4gUE9TSVggaGVhZGVyIHRlcm1pb3MuaAorI2RlZmluZSBCMCBGT1JCSURERU5fSURFTlRJRklFUgorCisvLyB0aGUgZm9sbG93aW5nIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY21ha2UKKyNpbmNsdWRlICJzcGxpdF90ZXN0X2hlbHBlci5oIgorCisjaWZkZWYgTkRFQlVHCisjdW5kZWYgTkRFQlVHCisjZW5kaWYKKworLy8gYm91bmRzIGludGVnZXIgdmFsdWVzIGZvciBBbHRpVmVjCisjaWZkZWYgX19BTFRJVkVDX18KKyNkZWZpbmUgRUlHRU5fTUFLSU5HX0RPQ1MKKyNlbmRpZgorCisjaWZuZGVmIEVJR0VOX1RFU1RfRlVOQworI2Vycm9yIEVJR0VOX1RFU1RfRlVOQyBtdXN0IGJlIGRlZmluZWQKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfUkVQRUFUIDEwCisKKyNpZmRlZiBfX0lDQworLy8gZGlzYWJsZSB3YXJuaW5nICMyNzk6IGNvbnRyb2xsaW5nIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDI3OQorI2VuZGlmCisKK25hbWVzcGFjZSBFaWdlbgoreworICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdfdGVzdF9zdGFjazsKKyAgc3RhdGljIGludCBnX3JlcGVhdDsKKyAgc3RhdGljIHVuc2lnbmVkIGludCBnX3NlZWQ7CisgIHN0YXRpYyBib29sIGdfaGFzX3NldF9yZXBlYXQsIGdfaGFzX3NldF9zZWVkOworfQorCisjZGVmaW5lIEVJX1BQX01BS0VfU1RSSU5HMihTKSAjUworI2RlZmluZSBFSV9QUF9NQUtFX1NUUklORyhTKSBFSV9QUF9NQUtFX1NUUklORzIoUykKKworI2RlZmluZSBFSUdFTl9ERUZBVUxUX0lPX0ZPUk1BVCBJT0Zvcm1hdCg0LCAwLCAiICAiLCAiXG4iLCAiIiwgIiIsICIiLCAiIikKKworI2lmbmRlZiBFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcKKworICBuYW1lc3BhY2UgRWlnZW4KKyAgeworICAgIHN0YXRpYyBjb25zdCBib29sIHNob3VsZF9yYWlzZV9hbl9hc3NlcnQgPSBmYWxzZTsKKworICAgIC8vIFVzZWQgdG8gYXZvaWQgdG8gcmFpc2UgdHdvIGV4Y2VwdGlvbnMgYXQgYSB0aW1lIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgZXhjZXB0aW9uIGlzIG5vdCBwcm9wZXJseSBjYXVnaHQuCisgICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYSBzZWNvbmQgZXhjZXB0aW9ucyBpcyB0cmlnZ2VyZWQgaW4gYSBkZXN0cnVjdG9yLgorICAgIHN0YXRpYyBib29sIG5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7CisgICAgc3RhdGljIGJvb2wgcmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUgPSB0cnVlOworCisgICAgc3RydWN0IGVpZ2VuX2Fzc2VydF9leGNlcHRpb24KKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnRfZXhjZXB0aW9uKHZvaWQpIHt9CisgICAgICB+ZWlnZW5fYXNzZXJ0X2V4Y2VwdGlvbigpIHsgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7IH0KKyAgICB9OworICB9CisgIC8vIElmIEVJR0VOX0RFQlVHX0FTU0VSVFMgaXMgZGVmaW5lZCBhbmQgaWYgbm8gYXNzZXJ0aW9uIGlzIHRyaWdnZXJlZCB3aGlsZQorICAvLyBvbmUgc2hvdWxkIGhhdmUgYmVlbiwgdGhlbiB0aGUgbGlzdCBvZiBleGNlY3V0ZWQgYXNzZXJ0aW9ucyBpcyBwcmludGVkIG91dC4KKyAgLy8KKyAgLy8gRUlHRU5fREVCVUdfQVNTRVJUUyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0IGFzIGl0CisgIC8vIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIHRoZSBjb21waWxhdGlvbiB0aW1lCisgIC8vIGFuZCBtaWdodCBldmVuIGludHJvZHVjZSBzaWRlIGVmZmVjdHMgdGhhdCB3b3VsZCBoaWRlCisgIC8vIHNvbWUgbWVtb3J5IGVycm9ycy4KKyAgI2lmZGVmIEVJR0VOX0RFQlVHX0FTU0VSVFMKKworICAgIG5hbWVzcGFjZSBFaWdlbgorICAgIHsKKyAgICAgIG5hbWVzcGFjZSBpbnRlcm5hbAorICAgICAgeworICAgICAgICBzdGF0aWMgYm9vbCBwdXNoX2Fzc2VydCA9IGZhbHNlOworICAgICAgfQorICAgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlaWdlbl9hc3NlcnRfbGlzdDsKKyAgICB9CisgICAgI2RlZmluZSBlaWdlbl9hc3NlcnQoYSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmKCAoIShhKSkgJiYgKCFub19tb3JlX2Fzc2VydCkgKSAgICAgXAorICAgICAgeyBcCisgICAgICAgIGlmKHJlcG9ydF9vbl9jZXJyX29uX2Fzc2VydF9mYWlsdXJlKSBcCisgICAgICAgICAgc3RkOjpjZXJyIDw8ICAjYSA8PCAiICIgX19GSUxFX18gPDwgIigiIDw8IF9fTElORV9fIDw8ICIpXG4iOyBcCisgICAgICAgIEVpZ2VuOjpub19tb3JlX2Fzc2VydCA9IHRydWU7ICAgICAgIFwKKyAgICAgICAgdGhyb3cgRWlnZW46OmVpZ2VuX2Fzc2VydF9leGNlcHRpb24oKTsgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlIGlmIChFaWdlbjo6aW50ZXJuYWw6OnB1c2hfYXNzZXJ0KSAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWlnZW5fYXNzZXJ0X2xpc3QucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKEVJX1BQX01BS0VfU1RSSU5HKF9fRklMRV9fKSAiICgiIEVJX1BQX01BS0VfU1RSSU5HKF9fTElORV9fKSAiKSA6ICIgI2EpICk7IFwKKyAgICAgIH0KKworICAgICNkZWZpbmUgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBFaWdlbjo6ZWlnZW5fYXNzZXJ0X2xpc3QuY2xlYXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVpZ2VuOjppbnRlcm5hbDo6cHVzaF9hc3NlcnQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVpZ2VuOjpyZXBvcnRfb25fY2Vycl9vbl9hc3NlcnRfZmFpbHVyZSA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc3RkOjpjZXJyIDw8ICJPbmUgb2YgdGhlIGZvbGxvd2luZyBhc3NlcnRzIHNob3VsZCBoYXZlIGJlZW4gdHJpZ2dlcmVkOlxuIjsgIFwKKyAgICAgICAgICBmb3IgKHVpbnQgYWk9MCA7IGFpPGVpZ2VuX2Fzc2VydF9saXN0LnNpemUoKSA7ICsrYWkpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICIgICIgPDwgZWlnZW5fYXNzZXJ0X2xpc3RbYWldIDw8ICJcbiI7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgVkVSSUZZKEVpZ2VuOjpzaG91bGRfcmFpc2VfYW5fYXNzZXJ0ICYmICMgYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBjYXRjaCAoRWlnZW46OmVpZ2VuX2Fzc2VydF9leGNlcHRpb24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEVpZ2VuOjppbnRlcm5hbDo6cHVzaF9hc3NlcnQgPSBmYWxzZTsgVkVSSUZZKHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVpZ2VuOjpyZXBvcnRfb25fY2Vycl9vbl9hc3NlcnRfZmFpbHVyZSA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWlnZW46OmludGVybmFsOjpwdXNoX2Fzc2VydCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0KKworICAjZWxzZSAvLyBFSUdFTl9ERUJVR19BU1NFUlRTCisgICAgLy8gc2VlIGJ1ZyA4OS4gVGhlIGNvcHlfYm9vbCBoZXJlIGlzIHdvcmtpbmcgYXJvdW5kIGEgYnVnIGluIGdjYyA8PSA0LjMKKyAgICAjZGVmaW5lIGVpZ2VuX2Fzc2VydChhKSBcCisgICAgICBpZiggKCFFaWdlbjo6aW50ZXJuYWw6OmNvcHlfYm9vbChhKSkgJiYgKCFub19tb3JlX2Fzc2VydCkgKVwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEVpZ2VuOjpub19tb3JlX2Fzc2VydCA9IHRydWU7ICAgICAgICAgXAorICAgICAgICBpZihyZXBvcnRfb25fY2Vycl9vbl9hc3NlcnRfZmFpbHVyZSkgIFwKKyAgICAgICAgICBlaWdlbl9wbGFpbl9hc3NlcnQoYSk7ICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRocm93IEVpZ2VuOjplaWdlbl9hc3NlcnRfZXhjZXB0aW9uKCk7IFwKKyAgICAgIH0KKyAgICAjZGVmaW5lIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWlnZW46OnJlcG9ydF9vbl9jZXJyX29uX2Fzc2VydF9mYWlsdXJlID0gZmFsc2U7ICAgICAgICAgIFwKKyAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBWRVJJRlkoRWlnZW46OnNob3VsZF9yYWlzZV9hbl9hc3NlcnQgJiYgIyBhKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2F0Y2ggKEVpZ2VuOjplaWdlbl9hc3NlcnRfZXhjZXB0aW9uJikgeyBWRVJJRlkodHJ1ZSk7IH0gICAgIFwKKyAgICAgICAgRWlnZW46OnJlcG9ydF9vbl9jZXJyX29uX2Fzc2VydF9mYWlsdXJlID0gdHJ1ZTsgICAgICAgICAgIFwKKyAgICAgIH0KKworICAjZW5kaWYgLy8gRUlHRU5fREVCVUdfQVNTRVJUUworCisgICNkZWZpbmUgRUlHRU5fVVNFX0NVU1RPTV9BU1NFUlQKKworI2Vsc2UgLy8gRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HCisKKyAgI2RlZmluZSBWRVJJRllfUkFJU0VTX0FTU0VSVChhKSB7fQorCisjZW5kaWYgLy8gRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HCisKKworI2RlZmluZSBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcKKyNpbmNsdWRlIDxFaWdlbi9RUj4gLy8gcmVxdWlyZWQgZm9yIGNyZWF0ZVJhbmRvbVBJTWF0cml4T2ZSYW5rCisKK3N0YXRpYyB2b2lkIHZlcmlmeV9pbXBsKGJvb2wgY29uZGl0aW9uLCBjb25zdCBjaGFyICp0ZXN0bmFtZSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmNvbmRpdGlvbl9hc19zdHJpbmcpCit7CisgIGlmICghY29uZGl0aW9uKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJUZXN0ICIgPDwgdGVzdG5hbWUgPDwgIiBmYWlsZWQgaW4gIiA8PCBmaWxlIDw8ICIgKCIgPDwgbGluZSA8PCAiKSIgXAorICAgICAgPDwgc3RkOjplbmRsIDw8ICIgICAgIiA8PCBjb25kaXRpb25fYXNfc3RyaW5nIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7IFwKKyAgICBhYm9ydCgpOworICB9Cit9CisKKyNkZWZpbmUgVkVSSUZZKGEpIDo6dmVyaWZ5X2ltcGwoYSwgZ190ZXN0X3N0YWNrLmJhY2soKS5jX3N0cigpLCBfX0ZJTEVfXywgX19MSU5FX18sIEVJX1BQX01BS0VfU1RSSU5HKGEpKQorCisjZGVmaW5lIFZFUklGWV9JU19FUVVBTChhLCBiKSBWRVJJRlkodGVzdF9pc19lcXVhbChhLCBiKSkKKyNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWChhLCBiKSBWRVJJRlkodGVzdF9pc0FwcHJveChhLCBiKSkKKyNkZWZpbmUgVkVSSUZZX0lTX05PVF9BUFBST1goYSwgYikgVkVSSUZZKCF0ZXN0X2lzQXBwcm94KGEsIGIpKQorI2RlZmluZSBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYSwgYikgVkVSSUZZKHRlc3RfaXNNdWNoU21hbGxlclRoYW4oYSwgYikpCisjZGVmaW5lIFZFUklGWV9JU19OT1RfTVVDSF9TTUFMTEVSX1RIQU4oYSwgYikgVkVSSUZZKCF0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGEsIGIpKQorI2RlZmluZSBWRVJJRllfSVNfQVBQUk9YX09SX0xFU1NfVEhBTihhLCBiKSBWRVJJRlkodGVzdF9pc0FwcHJveE9yTGVzc1RoYW4oYSwgYikpCisjZGVmaW5lIFZFUklGWV9JU19OT1RfQVBQUk9YX09SX0xFU1NfVEhBTihhLCBiKSBWRVJJRlkoIXRlc3RfaXNBcHByb3hPckxlc3NUaGFuKGEsIGIpKQorCisjZGVmaW5lIFZFUklGWV9JU19VTklUQVJZKGEpIFZFUklGWSh0ZXN0X2lzVW5pdGFyeShhKSkKKworI2RlZmluZSBDQUxMX1NVQlRFU1QoRlVOQykgZG8geyBcCisgICAgZ190ZXN0X3N0YWNrLnB1c2hfYmFjayhFSV9QUF9NQUtFX1NUUklORyhGVU5DKSk7IFwKKyAgICBGVU5DOyBcCisgICAgZ190ZXN0X3N0YWNrLnBvcF9iYWNrKCk7IFwKKyAgfSB3aGlsZSAoMCkKKworCituYW1lc3BhY2UgRWlnZW4geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbmxpbmUgdHlwZW5hbWUgTnVtVHJhaXRzPFQ+OjpSZWFsIHRlc3RfcHJlY2lzaW9uKCkgeyByZXR1cm4gTnVtVHJhaXRzPFQ+OjpkdW1teV9wcmVjaXNpb24oKTsgfQordGVtcGxhdGU8PiBpbmxpbmUgZmxvYXQgdGVzdF9wcmVjaXNpb248ZmxvYXQ+KCkgeyByZXR1cm4gMWUtM2Y7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGRvdWJsZSB0ZXN0X3ByZWNpc2lvbjxkb3VibGU+KCkgeyByZXR1cm4gMWUtNjsgfQordGVtcGxhdGU8PiBpbmxpbmUgZmxvYXQgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkgeyByZXR1cm4gdGVzdF9wcmVjaXNpb248ZmxvYXQ+KCk7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGRvdWJsZSB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgeyByZXR1cm4gdGVzdF9wcmVjaXNpb248ZG91YmxlPigpOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBsb25nIGRvdWJsZSB0ZXN0X3ByZWNpc2lvbjxsb25nIGRvdWJsZT4oKSB7IHJldHVybiAxZS02OyB9CisKK2lubGluZSBib29sIHRlc3RfaXNBcHByb3goY29uc3QgaW50JiBhLCBjb25zdCBpbnQmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248aW50PigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBpbnQmIGEsIGNvbnN0IGludCYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxpbnQ+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94T3JMZXNzVGhhbihjb25zdCBpbnQmIGEsIGNvbnN0IGludCYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc0FwcHJveE9yTGVzc1RoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248aW50PigpKTsgfQorCitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IGZsb2F0JiBhLCBjb25zdCBmbG9hdCYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfaXNNdWNoU21hbGxlclRoYW4oY29uc3QgZmxvYXQmIGEsIGNvbnN0IGZsb2F0JiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgZmxvYXQmIGEsIGNvbnN0IGZsb2F0JiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94T3JMZXNzVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfaXNBcHByb3goY29uc3QgZG91YmxlJiBhLCBjb25zdCBkb3VibGUmIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248ZG91YmxlPigpKTsgfQorCitpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IGRvdWJsZSYgYSwgY29uc3QgZG91YmxlJiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfaXNBcHByb3hPckxlc3NUaGFuKGNvbnN0IGRvdWJsZSYgYSwgY29uc3QgZG91YmxlJiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94T3JMZXNzVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxkb3VibGU+KCkpOyB9CisKK2lubGluZSBib29sIHRlc3RfaXNBcHByb3goY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7IH0KK2lubGluZSBib29sIHRlc3RfaXNNdWNoU21hbGxlclRoYW4oY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiYgYikKK3sgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7IH0KKworaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYSwgY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4mIGIpCit7IHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsgfQorCitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IGxvbmcgZG91YmxlJiBhLCBjb25zdCBsb25nIGRvdWJsZSYgYikKK3sKKyAgICBib29sIHJldCA9IGludGVybmFsOjppc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxsb25nIGRvdWJsZT4oKSk7CisgICAgaWYgKCFyZXQpIHN0ZDo6Y2VycgorICAgICAgICA8PCBzdGQ6OmVuZGwgPDwgIiAgICBhY3R1YWwgICA9ICIgPDwgYQorICAgICAgICA8PCBzdGQ6OmVuZGwgPDwgIiAgICBleHBlY3RlZCA9ICIgPDwgYiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgIHJldHVybiByZXQ7Cit9CisKK2lubGluZSBib29sIHRlc3RfaXNNdWNoU21hbGxlclRoYW4oY29uc3QgbG9uZyBkb3VibGUmIGEsIGNvbnN0IGxvbmcgZG91YmxlJiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPGxvbmcgZG91YmxlPigpKTsgfQoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgbG9uZyBkb3VibGUmIGEsIGNvbnN0IGxvbmcgZG91YmxlJiBiKQoreyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94T3JMZXNzVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxsb25nIGRvdWJsZT4oKSk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZTEsIHR5cGVuYW1lIFR5cGUyPgoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBUeXBlMSYgYSwgY29uc3QgVHlwZTImIGIpCit7CisgIHJldHVybiBhLmlzQXBwcm94KGIsIHRlc3RfcHJlY2lzaW9uPHR5cGVuYW1lIFR5cGUxOjpTY2FsYXI+KCkpOworfQorCisvLyBUaGUgaWRlYSBiZWhpbmQgdGhpcyBmdW5jdGlvbiBpcyB0byBjb21wYXJlIHRoZSB0d28gc2NhbGFycyBhIGFuZCBiIHdoZXJlCisvLyB0aGUgc2NhbGFyIHJlZiBpcyBhIGhpbnQgYWJvdXQgdGhlIGV4cGVjdGVkIG9yZGVyIG9mIG1hZ25pdHVkZSBvZiBhIGFuZCBiLgorLy8gVGhlcmVmb3JlLCBpZiBmb3Igc29tZSByZWFzb24gYSBhbmQgYiBhcmUgdmVyeSBzbWFsbCBjb21wYXJlZCB0byByZWYsCisvLyB3ZSB3b24ndCBpc3N1ZSBhIGZhbHNlIG5lZ2F0aXZlLgorLy8gVGhpcyB0ZXN0IGNvdWxkIGJlOiBhYnMoYS1iKSA8PSBlcHMgKiByZWYKKy8vIEhvd2V2ZXIsIGl0IHNlZW1zIHRoYXQgc2ltcGx5IGNvbXBhcmluZyBhK3JlZiBhbmQgYityZWYgaXMgbW9yZSBzZW5zaXRpdmUgdG8gdHJ1ZSBlcnJvci4KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBTY2FsYXJSZWY+CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94V2l0aFJlZihjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYiwgY29uc3QgU2NhbGFyUmVmJiByZWYpCit7CisgIHJldHVybiB0ZXN0X2lzQXBwcm94KGErcmVmLCBiK3JlZik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMj4KK2lubGluZSBib29sIHRlc3RfaXNNdWNoU21hbGxlclRoYW4oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMT4mIG0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQyPiYgbTIpCit7CisgIHJldHVybiBtMS5pc011Y2hTbWFsbGVyVGhhbihtMiwgdGVzdF9wcmVjaXNpb248dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkMT46OlNjYWxhcj4oKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsJiBzKQoreworICByZXR1cm4gbS5pc011Y2hTbWFsbGVyVGhhbihzLCB0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+KCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGJvb2wgdGVzdF9pc1VuaXRhcnkoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKK3sKKyAgcmV0dXJuIG0uaXNVbml0YXJ5KHRlc3RfcHJlY2lzaW9uPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhcj4oKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIHRlc3RfaXNfZXF1YWwoY29uc3QgVCYgYWN0dWFsLCBjb25zdCBVJiBleHBlY3RlZCkKK3sKKyAgICBpZiAoYWN0dWFsPT1leHBlY3RlZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gZmFsc2U6CisgICAgc3RkOjpjZXJyCisgICAgICAgIDw8IHN0ZDo6ZW5kbCA8PCAiICAgIGFjdHVhbCAgID0gIiA8PCBhY3R1YWwKKyAgICAgICAgPDwgc3RkOjplbmRsIDw8ICIgICAgZXhwZWN0ZWQgPSAiIDw8IGV4cGVjdGVkIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiogQ3JlYXRlcyBhIHJhbmRvbSBQYXJ0aWFsIElzb21ldHJ5IG1hdHJpeCBvZiBnaXZlbiByYW5rLgorICAqCisgICogQSBwYXJ0aWFsIGlzb21ldHJ5IGlzIGEgbWF0cml4IGFsbCBvZiB3aG9zZSBzaW5ndWxhciB2YWx1ZXMgYXJlIGVpdGhlciAwIG9yIDEuCisgICogVGhpcyBpcyB2ZXJ5IHVzZWZ1bCB0byB0ZXN0IHJhbmstcmV2ZWFsaW5nIGFsZ29yaXRobXMuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayh0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBkZXNpcmVkX3JhbmssIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHJvd3MsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGNvbHMsIE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3MsIFJvd3M+IE1hdHJpeEFUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHMsIENvbHM+IE1hdHJpeEJUeXBlOworCisgIGlmKGRlc2lyZWRfcmFuayA9PSAwKQorICB7CisgICAgbS5zZXRaZXJvKHJvd3MsY29scyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYoZGVzaXJlZF9yYW5rID09IDEpCisgIHsKKyAgICAvLyBoZXJlIHdlIG5vcm1hbGl6ZSB0aGUgdmVjdG9ycyB0byBnZXQgYSBwYXJ0aWFsIGlzb21ldHJ5CisgICAgbSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKS5ub3JtYWxpemVkKCkgKiBWZWN0b3JUeXBlOjpSYW5kb20oY29scykubm9ybWFsaXplZCgpLnRyYW5zcG9zZSgpOworICAgIHJldHVybjsKKyAgfQorCisgIE1hdHJpeEFUeXBlIGEgPSBNYXRyaXhBVHlwZTo6UmFuZG9tKHJvd3Mscm93cyk7CisgIE1hdHJpeFR5cGUgZCA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsY29scyk7CisgIE1hdHJpeEJUeXBlICBiID0gTWF0cml4QlR5cGU6OlJhbmRvbShjb2xzLGNvbHMpOworCisgIC8vIHNldCB0aGUgZGlhZ29uYWwgc3VjaCB0aGF0IG9ubHkgZGVzaXJlZF9yYW5rIG5vbi16ZXJvIGVudHJpZXMgcmVhbWFpbgorICBjb25zdCBJbmRleCBkaWFnX3NpemUgPSAoc3RkOjptaW4pKGQucm93cygpLGQuY29scygpKTsKKyAgaWYoZGlhZ19zaXplICE9IGRlc2lyZWRfcmFuaykKKyAgICBkLmRpYWdvbmFsKCkuc2VnbWVudChkZXNpcmVkX3JhbmssIGRpYWdfc2l6ZS1kZXNpcmVkX3JhbmspID0gVmVjdG9yVHlwZTo6WmVybyhkaWFnX3NpemUtZGVzaXJlZF9yYW5rKTsKKworICBIb3VzZWhvbGRlclFSPE1hdHJpeEFUeXBlPiBxcmEoYSk7CisgIEhvdXNlaG9sZGVyUVI8TWF0cml4QlR5cGU+IHFyYihiKTsKKyAgbSA9IHFyYS5ob3VzZWhvbGRlclEoKSAqIGQgKiBxcmIuaG91c2Vob2xkZXJRKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBlcm11dGF0aW9uVmVjdG9yVHlwZT4KK3ZvaWQgcmFuZG9tUGVybXV0YXRpb25WZWN0b3IoUGVybXV0YXRpb25WZWN0b3JUeXBlJiB2LCB0eXBlbmFtZSBQZXJtdXRhdGlvblZlY3RvclR5cGU6OkluZGV4IHNpemUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGVybXV0YXRpb25WZWN0b3JUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQZXJtdXRhdGlvblZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHYucmVzaXplKHNpemUpOworICBmb3IoSW5kZXggaSA9IDA7IGkgPCBzaXplOyArK2kpIHYoaSkgPSBTY2FsYXIoaSk7CisgIGlmKHNpemUgPT0gMSkgcmV0dXJuOworICBmb3IoSW5kZXggbiA9IDA7IG4gPCAzICogc2l6ZTsgKytuKQorICB7CisgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNpemUtMSk7CisgICAgSW5kZXggajsKKyAgICBkbyBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgc2l6ZS0xKTsgd2hpbGUoaj09aSk7CisgICAgc3RkOjpzd2FwKHYoaSksIHYoaikpOworICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTxmbG9hdD4geyB0eXBlZGVmIGRvdWJsZSB0eXBlOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTxkb3VibGU+IHsgdHlwZWRlZiBmbG9hdCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEdldERpZmZlcmVudFR5cGU8c3RkOjpjb21wbGV4PFQ+ID4KK3sgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxUPjo6dHlwZT4gdHlwZTsgfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lKCkgeyByZXR1cm4gIm90aGVyIjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8ZmxvYXQ+KCkgeyByZXR1cm4gImZsb2F0IjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8ZG91YmxlPigpIHsgcmV0dXJuICJkb3VibGUiOyB9Cit0ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHR5cGVfbmFtZTxpbnQ+KCkgeyByZXR1cm4gImludCI7IH0KK3RlbXBsYXRlPD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpIHsgcmV0dXJuICJjb21wbGV4PGZsb2F0PiI7IH0KK3RlbXBsYXRlPD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSB7IHJldHVybiAiY29tcGxleDxkb3VibGU+IjsgfQordGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8c3RkOjpjb21wbGV4PGludD4gPigpIHsgcmV0dXJuICJjb21wbGV4PGludD4iOyB9CisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIG1haW4gdGVzdCBmdW5jdGlvbgordm9pZCBFSUdFTl9DQVQodGVzdF8sRUlHRU5fVEVTVF9GVU5DKSgpOworCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3ZvaWQgc2V0X3JlcGVhdF9mcm9tX3N0cmluZyhjb25zdCBjaGFyICpzdHIpCit7CisgIGVycm5vID0gMDsKKyAgZ19yZXBlYXQgPSBpbnQoc3RydG91bChzdHIsIDAsIDEwKSk7CisgIGlmKGVycm5vIHx8IGdfcmVwZWF0IDw9IDApCisgIHsKKyAgICBzdGQ6OmNvdXQgPDwgIkludmFsaWQgcmVwZWF0IHZhbHVlICIgPDwgc3RyIDw8IHN0ZDo6ZW5kbDsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyAgZ19oYXNfc2V0X3JlcGVhdCA9IHRydWU7Cit9CisKK3ZvaWQgc2V0X3NlZWRfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKQoreworICBlcnJubyA9IDA7CisgIGdfc2VlZCA9IHN0cnRvdWwoc3RyLCAwLCAxMCk7CisgIGlmKGVycm5vIHx8IGdfc2VlZCA9PSAwKQorICB7CisgICAgc3RkOjpjb3V0IDw8ICJJbnZhbGlkIHNlZWQgdmFsdWUgIiA8PCBzdHIgPDwgc3RkOjplbmRsOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICBnX2hhc19zZXRfc2VlZCA9IHRydWU7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgZ19oYXNfc2V0X3JlcGVhdCA9IGZhbHNlOworICAgIGdfaGFzX3NldF9zZWVkID0gZmFsc2U7CisgICAgYm9vbCBuZWVkX2hlbHAgPSBmYWxzZTsKKworICAgIGZvcihpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgaWYoYXJndltpXVswXSA9PSAncicpCisgICAgICB7CisgICAgICAgIGlmKGdfaGFzX3NldF9yZXBlYXQpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkFyZ3VtZW50ICIgPDwgYXJndltpXSA8PCAiIGNvbmZsaWN0aW5nIHdpdGggYSBmb3JtZXIgYXJndW1lbnQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBzZXRfcmVwZWF0X2Zyb21fc3RyaW5nKGFyZ3ZbaV0rMSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKGFyZ3ZbaV1bMF0gPT0gJ3MnKQorICAgICAgeworICAgICAgICBpZihnX2hhc19zZXRfc2VlZCkKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiQXJndW1lbnQgIiA8PCBhcmd2W2ldIDw8ICIgY29uZmxpY3Rpbmcgd2l0aCBhIGZvcm1lciBhcmd1bWVudCIgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICBzZXRfc2VlZF9mcm9tX3N0cmluZyhhcmd2W2ldKzEpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBuZWVkX2hlbHAgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmKG5lZWRfaGVscCkKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgIlRoaXMgdGVzdCBhcHBsaWNhdGlvbiB0YWtlcyB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIGFyZ3VtZW50czoiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICByTiAgICAgUmVwZWF0IGVhY2ggdGVzdCBOIHRpbWVzIChkZWZhdWx0OiAiIDw8IERFRkFVTFRfUkVQRUFUIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgc04gICAgIFVzZSBOIGFzIHNlZWQgZm9yIHJhbmRvbSBudW1iZXJzIChkZWZhdWx0OiBiYXNlZCBvbiBjdXJyZW50IHRpbWUpIiA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJJZiBkZWZpbmVkLCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIEVJR0VOX1JFUEVBVCBhbmQgRUlHRU5fU0VFRCIgPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJ3aWxsIGJlIHVzZWQgYXMgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlIHBhcmFtZXRlcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBjaGFyICplbnZfRUlHRU5fUkVQRUFUID0gZ2V0ZW52KCJFSUdFTl9SRVBFQVQiKTsKKyAgICBpZighZ19oYXNfc2V0X3JlcGVhdCAmJiBlbnZfRUlHRU5fUkVQRUFUKQorICAgICAgc2V0X3JlcGVhdF9mcm9tX3N0cmluZyhlbnZfRUlHRU5fUkVQRUFUKTsKKyAgICBjaGFyICplbnZfRUlHRU5fU0VFRCA9IGdldGVudigiRUlHRU5fU0VFRCIpOworICAgIGlmKCFnX2hhc19zZXRfc2VlZCAmJiBlbnZfRUlHRU5fU0VFRCkKKyAgICAgIHNldF9zZWVkX2Zyb21fc3RyaW5nKGVudl9FSUdFTl9TRUVEKTsKKworICAgIGlmKCFnX2hhc19zZXRfc2VlZCkgZ19zZWVkID0gKHVuc2lnbmVkIGludCkgdGltZShOVUxMKTsKKyAgICBpZighZ19oYXNfc2V0X3JlcGVhdCkgZ19yZXBlYXQgPSBERUZBVUxUX1JFUEVBVDsKKworICAgIHN0ZDo6Y291dCA8PCAiSW5pdGlhbGl6aW5nIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHdpdGggc2VlZCAiIDw8IGdfc2VlZCA8PCBzdGQ6OmVuZGw7CisgICAgc3JhbmQoZ19zZWVkKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlJlcGVhdGluZyBlYWNoIHRlc3QgIiA8PCBnX3JlcGVhdCA8PCAiIHRpbWVzIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBFaWdlbjo6Z190ZXN0X3N0YWNrLnB1c2hfYmFjayhFSV9QUF9NQUtFX1NUUklORyhFSUdFTl9URVNUX0ZVTkMpKTsKKworICAgIEVJR0VOX0NBVCh0ZXN0XyxFSUdFTl9URVNUX0ZVTkMpKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L21hcC5jcHAgYi90ZXN0L21hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5ODNlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFwLmNwcApAQCAtMCwwICsxLDE0NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTk9fU1RBVElDX0FTU0VSVAorI2RlZmluZSBFSUdFTl9OT19TVEFUSUNfQVNTRVJUIC8vIHR1cm4gc3RhdGljIGFzc2VydHMgaW50byBydW50aW1lIGFzc2VydHMgaW4gb3JkZXIgdG8gY2hlY2sgdGhlbQorI2VuZGlmCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgbWFwX2NsYXNzX3ZlY3Rvcihjb25zdCBWZWN0b3JUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggc2l6ZSA9IG0uc2l6ZSgpOworCisgIC8vIHRlc3QgTWFwLmgKKyAgU2NhbGFyKiBhcnJheTEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKKyAgU2NhbGFyKiBhcnJheTIgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKKyAgU2NhbGFyKiBhcnJheTMgPSBuZXcgU2NhbGFyW3NpemUrMV07CisgIFNjYWxhciogYXJyYXkzdW5hbGlnbmVkID0gc2l6ZV90KGFycmF5MyklMTYgPT0gMCA/IGFycmF5MysxIDogYXJyYXkzOworCisgIE1hcDxWZWN0b3JUeXBlLCBBbGlnbmVkPihhcnJheTEsIHNpemUpID0gVmVjdG9yVHlwZTo6UmFuZG9tKHNpemUpOworICBNYXA8VmVjdG9yVHlwZSwgQWxpZ25lZD4oYXJyYXkyLCBzaXplKSA9IE1hcDxWZWN0b3JUeXBlLEFsaWduZWQ+KGFycmF5MSwgc2l6ZSk7CisgIE1hcDxWZWN0b3JUeXBlPihhcnJheTN1bmFsaWduZWQsIHNpemUpID0gTWFwPFZlY3RvclR5cGU+KGFycmF5MSwgc2l6ZSk7CisgIFZlY3RvclR5cGUgbWExID0gTWFwPFZlY3RvclR5cGUsIEFsaWduZWQ+KGFycmF5MSwgc2l6ZSk7CisgIFZlY3RvclR5cGUgbWEyID0gTWFwPFZlY3RvclR5cGUsIEFsaWduZWQ+KGFycmF5Miwgc2l6ZSk7CisgIFZlY3RvclR5cGUgbWEzID0gTWFwPFZlY3RvclR5cGU+KGFycmF5M3VuYWxpZ25lZCwgc2l6ZSk7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMik7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMyk7CisgICNpZmRlZiBFSUdFTl9WRUNUT1JJWkUKKyAgaWYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChNYXA8VmVjdG9yVHlwZSxBbGlnbmVkPihhcnJheTN1bmFsaWduZWQsIHNpemUpKSkKKyAgI2VuZGlmCisKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFycmF5MSwgc2l6ZSk7CisgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShhcnJheTIsIHNpemUpOworICBkZWxldGVbXSBhcnJheTM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbWFwX2NsYXNzX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpLCBjb2xzID0gbS5jb2xzKCksIHNpemUgPSByb3dzKmNvbHM7CisKKyAgLy8gdGVzdCBNYXAuaAorICBTY2FsYXIqIGFycmF5MSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUpOworICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSBhcnJheTFbaV0gPSBTY2FsYXIoMSk7CisgIFNjYWxhciogYXJyYXkyID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PFNjYWxhcj4oc2l6ZSk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIGFycmF5MltpXSA9IFNjYWxhcigxKTsKKyAgU2NhbGFyKiBhcnJheTMgPSBuZXcgU2NhbGFyW3NpemUrMV07CisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplKzE7IGkrKykgYXJyYXkzW2ldID0gU2NhbGFyKDEpOworICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IHNpemVfdChhcnJheTMpJTE2ID09IDAgPyBhcnJheTMrMSA6IGFycmF5MzsKKyAgTWFwPE1hdHJpeFR5cGUsIEFsaWduZWQ+KGFycmF5MSwgcm93cywgY29scykgPSBNYXRyaXhUeXBlOjpPbmVzKHJvd3MsY29scyk7CisgIE1hcDxNYXRyaXhUeXBlPihhcnJheTIsIHJvd3MsIGNvbHMpID0gTWFwPE1hdHJpeFR5cGU+KGFycmF5MSwgcm93cywgY29scyk7CisgIE1hcDxNYXRyaXhUeXBlPihhcnJheTN1bmFsaWduZWQsIHJvd3MsIGNvbHMpID0gTWFwPE1hdHJpeFR5cGU+KGFycmF5MSwgcm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgbWExID0gTWFwPE1hdHJpeFR5cGU+KGFycmF5MSwgcm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgbWEyID0gTWFwPE1hdHJpeFR5cGUsIEFsaWduZWQ+KGFycmF5Miwgcm93cywgY29scyk7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMik7CisgIE1hdHJpeFR5cGUgbWEzID0gTWFwPE1hdHJpeFR5cGU+KGFycmF5M3VuYWxpZ25lZCwgcm93cywgY29scyk7CisgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMyk7CisKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFycmF5MSwgc2l6ZSk7CisgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShhcnJheTIsIHNpemUpOworICBkZWxldGVbXSBhcnJheTM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgbWFwX3N0YXRpY19tZXRob2RzKGNvbnN0IFZlY3RvclR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBJbmRleCBzaXplID0gbS5zaXplKCk7CisKKyAgLy8gdGVzdCBNYXAuaAorICBTY2FsYXIqIGFycmF5MSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUpOworICBTY2FsYXIqIGFycmF5MiA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUpOworICBTY2FsYXIqIGFycmF5MyA9IG5ldyBTY2FsYXJbc2l6ZSsxXTsKKyAgU2NhbGFyKiBhcnJheTN1bmFsaWduZWQgPSBzaXplX3QoYXJyYXkzKSUxNiA9PSAwID8gYXJyYXkzKzEgOiBhcnJheTM7CisKKyAgVmVjdG9yVHlwZTo6TWFwQWxpZ25lZChhcnJheTEsIHNpemUpID0gVmVjdG9yVHlwZTo6UmFuZG9tKHNpemUpOworICBWZWN0b3JUeXBlOjpNYXAoYXJyYXkyLCBzaXplKSA9IFZlY3RvclR5cGU6Ok1hcChhcnJheTEsIHNpemUpOworICBWZWN0b3JUeXBlOjpNYXAoYXJyYXkzdW5hbGlnbmVkLCBzaXplKSA9IFZlY3RvclR5cGU6Ok1hcChhcnJheTEsIHNpemUpOworICBWZWN0b3JUeXBlIG1hMSA9IFZlY3RvclR5cGU6Ok1hcChhcnJheTEsIHNpemUpOworICBWZWN0b3JUeXBlIG1hMiA9IFZlY3RvclR5cGU6Ok1hcEFsaWduZWQoYXJyYXkyLCBzaXplKTsKKyAgVmVjdG9yVHlwZSBtYTMgPSBWZWN0b3JUeXBlOjpNYXAoYXJyYXkzdW5hbGlnbmVkLCBzaXplKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hMSwgbWEyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hMSwgbWEzKTsKKworICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUoYXJyYXkxLCBzaXplKTsKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFycmF5Miwgc2l6ZSk7CisgIGRlbGV0ZVtdIGFycmF5MzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPiB2b2lkIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgLy8gdGhlcmUncyBhIGxvdCB0aGF0IHdlIGNhbid0IHRlc3QgaGVyZSB3aGlsZSBzdGlsbCBoYXZpbmcgdGhpcyB0ZXN0IGNvbXBpbGUhCisgIC8vIHRoZSBvbmx5IHBvc3NpYmxlIGFwcHJvYWNoIHdvdWxkIGJlIHRvIHJ1biBhIHNjcmlwdCB0cnlpbmcgdG8gY29tcGlsZSBzdHVmZiBhbmQgY2hlY2tpbmcgdGhhdCBpdCBmYWlscy4KKyAgLy8gQ01ha2UgY2FuIGhlbHAgd2l0aCB0aGF0LgorCisgIC8vIHZlcmlmeSB0aGF0IG1hcC10by1jb25zdCBkb24ndCBoYXZlIEx2YWx1ZUJpdAorICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjphZGRfY29uc3Q8UGxhaW5PYmplY3RUeXBlPjo6dHlwZSBDb25zdFBsYWluT2JqZWN0VHlwZTsKKyAgVkVSSUZZKCAhKGludGVybmFsOjp0cmFpdHM8TWFwPENvbnN0UGxhaW5PYmplY3RUeXBlPiA+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKKyAgVkVSSUZZKCAhKGludGVybmFsOjp0cmFpdHM8TWFwPENvbnN0UGxhaW5PYmplY3RUeXBlLCBBbGlnbmVkPiA+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKKyAgVkVSSUZZKCAhKE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZT46OkZsYWdzICYgTHZhbHVlQml0KSApOworICBWRVJJRlkoICEoTWFwPENvbnN0UGxhaW5PYmplY3RUeXBlLCBBbGlnbmVkPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7Cit9CisKK3ZvaWQgdGVzdF9tYXAoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBtYXBfY2xhc3NfdmVjdG9yKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfdmVjdG9yKFZlY3RvcjRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1hcF9jbGFzc192ZWN0b3IoUm93VmVjdG9yNGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWFwX2NsYXNzX3ZlY3RvcihWZWN0b3JYY2YoOCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1hcF9jbGFzc192ZWN0b3IoVmVjdG9yWGkoMTIpKSApOworICAgIENBTExfU1VCVEVTVF81KCBjaGVja19jb25zdF9jb3JyZWN0bmVzcyhWZWN0b3JYaSgxMikpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMSggbWFwX2NsYXNzX21hdHJpeChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hcF9jbGFzc19tYXRyaXgoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTEoIG1hcF9jbGFzc19tYXRyaXgoTWF0cml4PGZsb2F0LDMsNT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWFwX2NsYXNzX21hdHJpeChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTApLGludGVybmFsOjpyYW5kb208aW50PigxLDEwKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1hcF9jbGFzc19tYXRyaXgoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTApLGludGVybmFsOjpyYW5kb208aW50PigxLDEwKSkpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfNiggbWFwX3N0YXRpY19tZXRob2RzKE1hdHJpeDxkb3VibGUsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIG1hcF9zdGF0aWNfbWV0aG9kcyhWZWN0b3IzZigpKSApOworICAgIENBTExfU1VCVEVTVF84KCBtYXBfc3RhdGljX21ldGhvZHMoUm93VmVjdG9yM2QoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOSggbWFwX3N0YXRpY19tZXRob2RzKFZlY3RvclhjZCg4KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAoIG1hcF9zdGF0aWNfbWV0aG9kcyhWZWN0b3JYZigxMikpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbWFwc3RhdGljbWV0aG9kcy5jcHAgYi90ZXN0L21hcHN0YXRpY21ldGhvZHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTEyYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L21hcHN0YXRpY21ldGhvZHMuY3BwCkBAIC0wLDAgKzEsMTczIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK2Zsb2F0ICpwdHI7Citjb25zdCBmbG9hdCAqY29uc3RfcHRyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGUsCisgICAgICAgICBib29sIElzRHluYW1pY1NpemUgPSBQbGFpbk9iamVjdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMsCisgICAgICAgICBib29sIElzVmVjdG9yID0gUGxhaW5PYmplY3RUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUKKz4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGwge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgYm9vbCBJc1ZlY3Rvcj4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCBmYWxzZSwgSXNWZWN0b3I+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBQbGFpbk9iamVjdFR5cGUmIG0pCisgIHsKKyAgICBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCB0cnVlLCBJc1ZlY3Rvcj46OnJ1bihtKTsKKworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsNSksIGogPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiw1KTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0cikuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBJbm5lclN0cmlkZTw+KGkpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgSW5uZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgSW5uZXJTdHJpZGU8PihpKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgSW5uZXJTdHJpZGU8PihpKSkuc3VtKCk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIElubmVyU3RyaWRlPDI+KCkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQocHRyLCBJbm5lclN0cmlkZTwzPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAoY29uc3RfcHRyLCBJbm5lclN0cmlkZTw0PigpKS5zdW0oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQoY29uc3RfcHRyLCBJbm5lclN0cmlkZTw1PigpKS5zdW0oKTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgT3V0ZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIE91dGVyU3RyaWRlPD4oaSkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIE91dGVyU3RyaWRlPD4oaSkpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIE91dGVyU3RyaWRlPD4oaSkpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBPdXRlclN0cmlkZTwyPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgT3V0ZXJTdHJpZGU8Mz4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgT3V0ZXJTdHJpZGU8ND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgT3V0ZXJTdHJpZGU8NT4oKSkuc3VtKCk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPihpLGopKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgU3RyaWRlPDIsRHluYW1pYz4oMixpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgU3RyaWRlPER5bmFtaWMsMz4oaSwzKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+KGksaikpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBTdHJpZGU8MiwzPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgU3RyaWRlPDMsND4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgU3RyaWRlPDIsND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgU3RyaWRlPDUsMz4oKSkuc3VtKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCB0cnVlLCBmYWxzZT4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYgbSkKKyAgeworICAgIGludCByb3dzID0gbS5yb3dzKCksIGNvbHMgPSBtLmNvbHMoKTsKKworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsNSksIGogPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiw1KTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgcm93cywgY29scykuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHJvd3MsIGNvbHMpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIHJvd3MsIGNvbHMpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIHJvd3MsIGNvbHMpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTw+KGkpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgcm93cywgY29scywgSW5uZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgSW5uZXJTdHJpZGU8PihpKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgSW5uZXJTdHJpZGU8PihpKSkuc3VtKCk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIHJvd3MsIGNvbHMsIElubmVyU3RyaWRlPDI+KCkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQocHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTwzPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAoY29uc3RfcHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTw0PigpKS5zdW0oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQoY29uc3RfcHRyLCByb3dzLCBjb2xzLCBJbm5lclN0cmlkZTw1PigpKS5zdW0oKTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPD4oaSkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPD4oaSkpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPD4oaSkpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTwyPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8Mz4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8ND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8NT4oKSkuc3VtKCk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIHJvd3MsIGNvbHMsIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPihpLGopKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgcm93cywgY29scywgU3RyaWRlPDIsRHluYW1pYz4oMixpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPER5bmFtaWMsMz4oaSwzKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+KGksaikpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCByb3dzLCBjb2xzLCBTdHJpZGU8MiwzPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgcm93cywgY29scywgU3RyaWRlPDMsND4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPDIsND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPDUsMz4oKSkuc3VtKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCB0cnVlLCB0cnVlPgoreworICBzdGF0aWMgdm9pZCBydW4oY29uc3QgUGxhaW5PYmplY3RUeXBlJiB2KQorICB7CisgICAgaW50IHNpemUgPSB2LnNpemUoKTsKKworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsNSk7CisKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIHNpemUpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQocHRyLCBzaXplKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAoY29uc3RfcHRyLCBzaXplKS5zdW0oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQoY29uc3RfcHRyLCBzaXplKS5zdW0oKTsKKworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgc2l6ZSwgSW5uZXJTdHJpZGU8PihpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHNpemUsIElubmVyU3RyaWRlPD4oaSkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIHNpemUsIElubmVyU3RyaWRlPD4oaSkpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIHNpemUsIElubmVyU3RyaWRlPD4oaSkpLnN1bSgpOworCisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBzaXplLCBJbm5lclN0cmlkZTwyPigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgc2l6ZSwgSW5uZXJTdHJpZGU8Mz4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgc2l6ZSwgSW5uZXJTdHJpZGU8ND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgc2l6ZSwgSW5uZXJTdHJpZGU8NT4oKSkuc3VtKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3ZvaWQgbWFwc3RhdGljbWV0aG9kcyhjb25zdCBQbGFpbk9iamVjdFR5cGUmIG0pCit7CisgIG1hcHN0YXRpY21ldGhvZHNfaW1wbDxQbGFpbk9iamVjdFR5cGU+OjpydW4obSk7CisgIFZFUklGWSh0cnVlKTsgLy8ganVzdCB0byBhdm9pZCAndW51c2VkIGZ1bmN0aW9uJyB3YXJuaW5nCit9CisKK3ZvaWQgdGVzdF9tYXBzdGF0aWNtZXRob2RzKCkKK3sKKyAgcHRyID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PGZsb2F0PigxMDAwKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgcHRyW2ldID0gZmxvYXQoaSk7CisKKyAgY29uc3RfcHRyID0gcHRyOworCisgIENBTExfU1VCVEVTVF8xKCggbWFwc3RhdGljbWV0aG9kcyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICkpOworICBDQUxMX1NVQlRFU1RfMSgoIG1hcHN0YXRpY21ldGhvZHMoVmVjdG9yMmYoKSkgKSk7CisgIENBTExfU1VCVEVTVF8yKCggbWFwc3RhdGljbWV0aG9kcyhWZWN0b3IzZigpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzIoKCBtYXBzdGF0aWNtZXRob2RzKE1hdHJpeDJmKCkpICkpOworICBDQUxMX1NVQlRFU1RfMygoIG1hcHN0YXRpY21ldGhvZHMoTWF0cml4NGYoKSkgKSk7CisgIENBTExfU1VCVEVTVF8zKCggbWFwc3RhdGljbWV0aG9kcyhBcnJheTRmKCkpICkpOworICBDQUxMX1NVQlRFU1RfNCgoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXkzZigpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzQoKCBtYXBzdGF0aWNtZXRob2RzKEFycmF5MzNmKCkpICkpOworICBDQUxMX1NVQlRFU1RfNSgoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXk0NGYoKSkgKSk7CisgIENBTExfU1VCVEVTVF81KCggbWFwc3RhdGljbWV0aG9kcyhWZWN0b3JYZigxKSkgKSk7CisgIENBTExfU1VCVEVTVF81KCggbWFwc3RhdGljbWV0aG9kcyhWZWN0b3JYZig4KSkgKSk7CisgIENBTExfU1VCVEVTVF82KCggbWFwc3RhdGljbWV0aG9kcyhNYXRyaXhYZigxLDEpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzYoKCBtYXBzdGF0aWNtZXRob2RzKE1hdHJpeFhmKDUsNykpICkpOworICBDQUxMX1NVQlRFU1RfNygoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXlYZigxKSkgKSk7CisgIENBTExfU1VCVEVTVF83KCggbWFwc3RhdGljbWV0aG9kcyhBcnJheVhmKDUpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzgoKCBtYXBzdGF0aWNtZXRob2RzKEFycmF5WFhmKDEsMSkpICkpOworICBDQUxMX1NVQlRFU1RfOCgoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXlYWGYoOCw2KSkgKSk7CisKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKHB0ciwgMTAwMCk7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvbWFwc3RyaWRlLmNwcCBiL3Rlc3QvbWFwc3RyaWRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTM1YjlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tYXBzdHJpZGUuY3BwCkBAIC0wLDAgKzEsMTQ2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPGludCBBbGlnbm1lbnQsdHlwZW5hbWUgVmVjdG9yVHlwZT4gdm9pZCBtYXBfY2xhc3NfdmVjdG9yKGNvbnN0IFZlY3RvclR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBJbmRleCBzaXplID0gbS5zaXplKCk7CisKKyAgVmVjdG9yVHlwZSB2ID0gVmVjdG9yVHlwZTo6UmFuZG9tKHNpemUpOworCisgIEluZGV4IGFycmF5c2l6ZSA9IDMqc2l6ZTsKKyAgCisgIFNjYWxhciogYV9hcnJheSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KGFycmF5c2l6ZSsxKTsKKyAgU2NhbGFyKiBhcnJheSA9IGFfYXJyYXk7CisgIGlmKEFsaWdubWVudCE9QWxpZ25lZCkKKyAgICBhcnJheSA9IChTY2FsYXIqKShwdHJkaWZmX3QoYV9hcnJheSkgKyAoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6QWxpZ25lZE9uU2NhbGFyP3NpemVvZihTY2FsYXIpOnNpemVvZih0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCkpKTsKKworICB7CisgICAgTWFwPFZlY3RvclR5cGUsIEFsaWdubWVudCwgSW5uZXJTdHJpZGU8Mz4gPiBtYXAoYXJyYXksIHNpemUpOworICAgIG1hcCA9IHY7CisgICAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICB7CisgICAgICBWRVJJRlkoYXJyYXlbMyppXSA9PSB2W2ldKTsKKyAgICAgIFZFUklGWShtYXBbaV0gPT0gdltpXSk7CisgICAgfQorICB9CisKKyAgeworICAgIE1hcDxWZWN0b3JUeXBlLCBVbmFsaWduZWQsIElubmVyU3RyaWRlPER5bmFtaWM+ID4gbWFwKGFycmF5LCBzaXplLCBJbm5lclN0cmlkZTxEeW5hbWljPigyKSk7CisgICAgbWFwID0gdjsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgIHsKKyAgICAgIFZFUklGWShhcnJheVsyKmldID09IHZbaV0pOworICAgICAgVkVSSUZZKG1hcFtpXSA9PSB2W2ldKTsKKyAgICB9CisgIH0KKworICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUoYV9hcnJheSwgYXJyYXlzaXplKzEpOworfQorCit0ZW1wbGF0ZTxpbnQgQWxpZ25tZW50LHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbWFwX2NsYXNzX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBfbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBfbS5yb3dzKCksIGNvbHMgPSBfbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisKKyAgSW5kZXggYXJyYXlzaXplID0gMioocm93cys0KSooY29scys0KTsKKworICBTY2FsYXIqIGFfYXJyYXkgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihhcnJheXNpemUrMSk7CisgIFNjYWxhciogYXJyYXkgPSBhX2FycmF5OworICBpZihBbGlnbm1lbnQhPUFsaWduZWQpCisgICAgYXJyYXkgPSAoU2NhbGFyKikocHRyZGlmZl90KGFfYXJyYXkpICsgKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OkFsaWduZWRPblNjYWxhcj9zaXplb2YoU2NhbGFyKTpzaXplb2YodHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwpKSk7CisKKyAgLy8gdGVzdCBubyBpbm5lciBzdHJpZGUgYW5kIHNvbWUgZHluYW1pYyBvdXRlciBzdHJpZGUKKyAgeworICAgIE1hcDxNYXRyaXhUeXBlLCBBbGlnbm1lbnQsIE91dGVyU3RyaWRlPER5bmFtaWM+ID4gbWFwKGFycmF5LCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTxEeW5hbWljPihtLmlubmVyU2l6ZSgpKzEpKTsKKyAgICBtYXAgPSBtOworICAgIFZFUklGWShtYXAub3V0ZXJTdHJpZGUoKSA9PSBtYXAuaW5uZXJTaXplKCkrMSk7CisgICAgZm9yKGludCBpID0gMDsgaSA8IG0ub3V0ZXJTaXplKCk7ICsraSkKKyAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opCisgICAgICB7CisgICAgICAgIFZFUklGWShhcnJheVttYXAub3V0ZXJTdHJpZGUoKSppK2pdID09IG0uY29lZmZCeU91dGVySW5uZXIoaSxqKSk7CisgICAgICAgIFZFUklGWShtYXAuY29lZmZCeU91dGVySW5uZXIoaSxqKSA9PSBtLmNvZWZmQnlPdXRlcklubmVyKGksaikpOworICAgICAgfQorICB9CisKKyAgLy8gdGVzdCBubyBpbm5lciBzdHJpZGUgYW5kIGFuIG91dGVyIHN0cmlkZSBvZiArNC4gVGhpcyBpcyBxdWl0ZSBpbXBvcnRhbnQgYXMgZm9yIGZpeGVkLXNpemUgbWF0cmljZXMsCisgIC8vIHRoaXMgYWxsb3dzIHRvIGhpdCB0aGUgc3BlY2lhbCBjYXNlIHdoZXJlIGl0J3MgdmVjdG9yaXphYmxlLgorICB7CisgICAgZW51bSB7CisgICAgICBJbm5lclNpemUgPSBNYXRyaXhUeXBlOjpJbm5lclNpemVBdENvbXBpbGVUaW1lLAorICAgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gSW5uZXJTaXplPT1EeW5hbWljID8gRHluYW1pYyA6IElubmVyU2l6ZSs0CisgICAgfTsKKyAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBPdXRlclN0cmlkZTxPdXRlclN0cmlkZUF0Q29tcGlsZVRpbWU+ID4KKyAgICAgIG1hcChhcnJheSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lPihtLmlubmVyU2l6ZSgpKzQpKTsKKyAgICBtYXAgPSBtOworICAgIFZFUklGWShtYXAub3V0ZXJTdHJpZGUoKSA9PSBtYXAuaW5uZXJTaXplKCkrNCk7CisgICAgZm9yKGludCBpID0gMDsgaSA8IG0ub3V0ZXJTaXplKCk7ICsraSkKKyAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opCisgICAgICB7CisgICAgICAgIFZFUklGWShhcnJheVttYXAub3V0ZXJTdHJpZGUoKSppK2pdID09IG0uY29lZmZCeU91dGVySW5uZXIoaSxqKSk7CisgICAgICAgIFZFUklGWShtYXAuY29lZmZCeU91dGVySW5uZXIoaSxqKSA9PSBtLmNvZWZmQnlPdXRlcklubmVyKGksaikpOworICAgICAgfQorICB9CisKKyAgLy8gdGVzdCBib3RoIGlubmVyIHN0cmlkZSBhbmQgb3V0ZXIgc3RyaWRlCisgIHsKKyAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBTdHJpZGU8RHluYW1pYyxEeW5hbWljPiA+IG1hcChhcnJheSwgcm93cywgY29scywgU3RyaWRlPER5bmFtaWMsRHluYW1pYz4oMiptLmlubmVyU2l6ZSgpKzEsIDIpKTsKKyAgICBtYXAgPSBtOworICAgIFZFUklGWShtYXAub3V0ZXJTdHJpZGUoKSA9PSAyKm1hcC5pbm5lclNpemUoKSsxKTsKKyAgICBWRVJJRlkobWFwLmlubmVyU3RyaWRlKCkgPT0gMik7CisgICAgZm9yKGludCBpID0gMDsgaSA8IG0ub3V0ZXJTaXplKCk7ICsraSkKKyAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opCisgICAgICB7CisgICAgICAgIFZFUklGWShhcnJheVttYXAub3V0ZXJTdHJpZGUoKSppK21hcC5pbm5lclN0cmlkZSgpKmpdID09IG0uY29lZmZCeU91dGVySW5uZXIoaSxqKSk7CisgICAgICAgIFZFUklGWShtYXAuY29lZmZCeU91dGVySW5uZXIoaSxqKSA9PSBtLmNvZWZmQnlPdXRlcklubmVyKGksaikpOworICAgICAgfQorICB9CisKKyAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFfYXJyYXksIGFycmF5c2l6ZSsxKTsKK30KKwordm9pZCB0ZXN0X21hcHN0cmlkZSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgRUlHRU5fVU5VU0VEIGludCBtYXhuID0gMzA7CisgICAgQ0FMTF9TVUJURVNUXzEoIG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8xKCBtYXBfY2xhc3NfdmVjdG9yPFVuYWxpZ25lZD4oTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfdmVjdG9yPEFsaWduZWQ+KFZlY3RvcjRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hcF9jbGFzc192ZWN0b3I8VW5hbGlnbmVkPihWZWN0b3I0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBtYXBfY2xhc3NfdmVjdG9yPEFsaWduZWQ+KFJvd1ZlY3RvcjRmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1hcF9jbGFzc192ZWN0b3I8VW5hbGlnbmVkPihSb3dWZWN0b3I0ZigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBtYXBfY2xhc3NfdmVjdG9yPEFsaWduZWQ+KFZlY3RvclhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIG1hcF9jbGFzc192ZWN0b3I8VW5hbGlnbmVkPihWZWN0b3JYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4bikpKSApOworICAgIENBTExfU1VCVEVTVF81KCBtYXBfY2xhc3NfdmVjdG9yPEFsaWduZWQ+KFZlY3RvclhpKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFZlY3RvclhpKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKKworICAgIENBTExfU1VCVEVTVF8xKCBtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggbWFwX2NsYXNzX21hdHJpeDxVbmFsaWduZWQ+KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXg8ZmxvYXQsMyw1PigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4PGZsb2F0LDMsNT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXg8ZmxvYXQsNCw4PigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4PGZsb2F0LDQsOD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4biksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4bikpKSApOworICAgIENBTExfU1VCVEVTVF80KCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pLGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1hcF9jbGFzc19tYXRyaXg8VW5hbGlnbmVkPihNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIG1hcF9jbGFzc19tYXRyaXg8QWxpZ25lZD4oTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pLGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbWFwX2NsYXNzX21hdHJpeDxVbmFsaWduZWQ+KE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbWV0YS5jcHAgYi90ZXN0L21ldGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMWQxMjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L21ldGEuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordm9pZCB0ZXN0X21ldGEoKQoreworICB0eXBlZGVmIGZsb2F0ICYgRmxvYXRSZWY7CisgIHR5cGVkZWYgY29uc3QgZmxvYXQgJiBDb25zdEZsb2F0UmVmOworICAKKyAgVkVSSUZZKChpbnRlcm5hbDo6Y29uZGl0aW9uYWw8KDM8NCksaW50ZXJuYWw6OnRydWVfdHlwZSwgaW50ZXJuYWw6OmZhbHNlX3R5cGU+Ojp0eXBlOjp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxmbG9hdD46OnZhbHVlKSk7CisgIFZFUklGWSgoIWludGVybmFsOjppc19zYW1lPGZsb2F0LGRvdWJsZT46OnZhbHVlKSk7CisgIFZFUklGWSgoIWludGVybmFsOjppc19zYW1lPGZsb2F0LGZsb2F0Jj46OnZhbHVlKSk7CisgIFZFUklGWSgoIWludGVybmFsOjppc19zYW1lPGZsb2F0LGNvbnN0IGZsb2F0Jj46OnZhbHVlKSk7CisgIAorICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX2FsbDxjb25zdCBmbG9hdCY+Ojp0eXBlID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGZsb2F0LGludGVybmFsOjpyZW1vdmVfYWxsPGNvbnN0IGZsb2F0Kj46OnR5cGUgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9hbGw8Y29uc3QgZmxvYXQqJj46OnR5cGUgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9hbGw8ZmxvYXQqKj46OnR5cGUgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9hbGw8ZmxvYXQqKiY+Ojp0eXBlID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGZsb2F0LGludGVybmFsOjpyZW1vdmVfYWxsPGZsb2F0KiBjb25zdCAqJj46OnR5cGUgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9hbGw8ZmxvYXQqIGNvbnN0Pjo6dHlwZSA+Ojp2YWx1ZSkpOworCisgIC8vIHRlc3QgYWRkX2NvbnN0CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6YWRkX2NvbnN0PGZsb2F0Pjo6dHlwZSwgY29uc3QgZmxvYXQgPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Q8ZmxvYXQqPjo6dHlwZSwgZmxvYXQqIGNvbnN0Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Q8ZmxvYXQgY29uc3QqPjo6dHlwZSwgZmxvYXQgY29uc3QqIGNvbnN0Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Q8ZmxvYXQmPjo6dHlwZSwgZmxvYXQmID46OnZhbHVlKSk7CisKKyAgLy8gdGVzdCByZW1vdmVfY29uc3QKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjpyZW1vdmVfY29uc3Q8ZmxvYXQgY29uc3QqIGNvbnN0Pjo6dHlwZSwgZmxvYXQgY29uc3QqID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6cmVtb3ZlX2NvbnN0PGZsb2F0IGNvbnN0Kj46OnR5cGUsIGZsb2F0IGNvbnN0KiA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OnJlbW92ZV9jb25zdDxmbG9hdCogY29uc3Q+Ojp0eXBlLCBmbG9hdCogPjo6dmFsdWUpKTsKKworICAvLyB0ZXN0IGFkZF9jb25zdF9vbl92YWx1ZV90eXBlCisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8ZmxvYXQmPjo6dHlwZSwgZmxvYXQgY29uc3QmID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8ZmxvYXQqPjo6dHlwZSwgZmxvYXQgY29uc3QqID46OnZhbHVlKSk7CisKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxmbG9hdD46OnR5cGUsIGNvbnN0IGZsb2F0ID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8Y29uc3QgZmxvYXQ+Ojp0eXBlLCBjb25zdCBmbG9hdCA+Ojp2YWx1ZSkpOworCisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGU8Y29uc3QgZmxvYXQqIGNvbnN0Pjo6dHlwZSwgY29uc3QgZmxvYXQqIGNvbnN0Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZTxmbG9hdCogY29uc3Q+Ojp0eXBlLCBjb25zdCBmbG9hdCogY29uc3Q+Ojp2YWx1ZSkpOworICAKKyAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9yZWZlcmVuY2U8ZmxvYXQmPjo6dHlwZSA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxjb25zdCBmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX3JlZmVyZW5jZTxjb25zdCBmbG9hdCY+Ojp0eXBlID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGZsb2F0LGludGVybmFsOjpyZW1vdmVfcG9pbnRlcjxmbG9hdCo+Ojp0eXBlID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGNvbnN0IGZsb2F0LGludGVybmFsOjpyZW1vdmVfcG9pbnRlcjxjb25zdCBmbG9hdCo+Ojp0eXBlID46OnZhbHVlKSk7CisgIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGZsb2F0LGludGVybmFsOjpyZW1vdmVfcG9pbnRlcjxmbG9hdCogY29uc3QgPjo6dHlwZSA+Ojp2YWx1ZSkpOworICAKKyAgVkVSSUZZKGludGVybmFsOjptZXRhX3NxcnQ8MT46OnJldCA9PSAxKTsKKyAgI2RlZmluZSBWRVJJRllfTUVUQV9TUVJUKFgpIFZFUklGWShpbnRlcm5hbDo6bWV0YV9zcXJ0PFg+OjpyZXQgPT0gaW50KGludGVybmFsOjpzcXJ0KGRvdWJsZShYKSkpKQorICBWRVJJRllfTUVUQV9TUVJUKDIpOworICBWRVJJRllfTUVUQV9TUVJUKDMpOworICBWRVJJRllfTUVUQV9TUVJUKDQpOworICBWRVJJRllfTUVUQV9TUVJUKDUpOworICBWRVJJRllfTUVUQV9TUVJUKDYpOworICBWRVJJRllfTUVUQV9TUVJUKDgpOworICBWRVJJRllfTUVUQV9TUVJUKDkpOworICBWRVJJRllfTUVUQV9TUVJUKDE1KTsKKyAgVkVSSUZZX01FVEFfU1FSVCgxNik7CisgIFZFUklGWV9NRVRBX1NRUlQoMTcpOworICBWRVJJRllfTUVUQV9TUVJUKDI1NSk7CisgIFZFUklGWV9NRVRBX1NRUlQoMjU2KTsKKyAgVkVSSUZZX01FVEFfU1FSVCgyNTcpOworICBWRVJJRllfTUVUQV9TUVJUKDEwMjMpOworICBWRVJJRllfTUVUQV9TUVJUKDEwMjQpOworICBWRVJJRllfTUVUQV9TUVJUKDEwMjUpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9taXNjbWF0cmljZXMuY3BwIGIvdGVzdC9taXNjbWF0cmljZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDQ4MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L21pc2NtYXRyaWNlcy5jcHAKQEAgLTAsMCArMSw0OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbWlzY01hdHJpY2VzKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgICAgRGlhZ29uYWxNYXRyaXguaCBPbmVzLmgKKyAgKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwgcjIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLCBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpPbmVzKHJvd3MsY29scykocixjKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigxKSk7CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpPbmVzKHJvd3MsY29scyk7CisgIFZFUklGWV9JU19BUFBST1gobTEocixjKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigxKSk7CisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIHYxWzBdOworICBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+CisgIHNxdWFyZSh2MS5hc0RpYWdvbmFsKCkpOworICBpZihyPT1yMikgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUocixyMiksIHYxW3JdKTsKKyAgZWxzZSBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oc3F1YXJlKHIscjIpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpKTsKKyAgc3F1YXJlID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCByb3dzKTsKKyAgc3F1YXJlLmRpYWdvbmFsKCkgPSBWZWN0b3JUeXBlOjpPbmVzKHJvd3MpOworICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZSwgTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgcm93cykpOworfQorCit2b2lkIHRlc3RfbWlzY21hdHJpY2VzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggbWlzY01hdHJpY2VzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggbWlzY01hdHJpY2VzKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1pc2NNYXRyaWNlcyhNYXRyaXhYY2YoMywgMykpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIG1pc2NNYXRyaWNlcyhNYXRyaXhYaSg4LCAxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1pc2NNYXRyaWNlcyhNYXRyaXhYY2QoMjAsIDIwKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9taXhpbmd0eXBlcy5jcHAgYi90ZXN0L21peGluZ3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJmNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9taXhpbmd0eXBlcy5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworLy8gd29yayBhcm91bmQgInVuaW5pdGlhbGl6ZWQiIHdhcm5pbmdzIGFuZCBnaXZlIHRoYXQgb3B0aW9uIHNvbWUgdGVzdGluZworI2RlZmluZSBFSUdFTl9JTklUSUFMSVpFX01BVFJJQ0VTX0JZX1pFUk8KKworI2lmbmRlZiBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisjZGVmaW5lIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQgLy8gdHVybiBzdGF0aWMgYXNzZXJ0cyBpbnRvIHJ1bnRpbWUgYXNzZXJ0cyBpbiBvcmRlciB0byBjaGVjayB0aGVtCisjZW5kaWYKKworLy8gI2lmbmRlZiBFSUdFTl9ET05UX1ZFQ1RPUklaRQorLy8gI2RlZmluZSBFSUdFTl9ET05UX1ZFQ1RPUklaRSAvLyBTU0UgaW50cmluc2ljcyBhcmVuJ3QgZGVzaWduZWQgdG8gYWxsb3cgbWl4aW5nIHR5cGVzCisvLyAjZW5kaWYKKworI2luY2x1ZGUgIm1haW4uaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUeXBlPiB2b2lkIG1peGluZ3R5cGVzKGludCBzaXplID0gU2l6ZUF0Q29tcGlsZVR5cGUpCit7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PGZsb2F0PiAgIENGOworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxkb3VibGU+ICBDRDsKKyAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsIFNpemVBdENvbXBpbGVUeXBlLCBTaXplQXRDb21waWxlVHlwZT4gTWF0X2Y7CisgIHR5cGVkZWYgTWF0cml4PGRvdWJsZSwgU2l6ZUF0Q29tcGlsZVR5cGUsIFNpemVBdENvbXBpbGVUeXBlPiBNYXRfZDsKKyAgdHlwZWRlZiBNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgU2l6ZUF0Q29tcGlsZVR5cGUsIFNpemVBdENvbXBpbGVUeXBlPiBNYXRfY2Y7CisgIHR5cGVkZWYgTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBTaXplQXRDb21waWxlVHlwZSwgU2l6ZUF0Q29tcGlsZVR5cGU+IE1hdF9jZDsKKyAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsIFNpemVBdENvbXBpbGVUeXBlLCAxPiBWZWNfZjsKKyAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCBTaXplQXRDb21waWxlVHlwZSwgMT4gVmVjX2Q7CisgIHR5cGVkZWYgTWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sIFNpemVBdENvbXBpbGVUeXBlLCAxPiBWZWNfY2Y7CisgIHR5cGVkZWYgTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBTaXplQXRDb21waWxlVHlwZSwgMT4gVmVjX2NkOworCisgIE1hdF9mIG1mICAgID0gTWF0X2Y6OlJhbmRvbShzaXplLHNpemUpOworICBNYXRfZCBtZCAgICA9IG1mLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBNYXRfY2YgbWNmICA9IE1hdF9jZjo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIE1hdF9jZCBtY2QgID0gbWNmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKTsKKyAgVmVjX2YgdmYgICAgPSBWZWNfZjo6UmFuZG9tKHNpemUsMSk7CisgIFZlY19kIHZkICAgID0gdmYudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7CisgIFZlY19jZiB2Y2YgID0gVmVjX2NmOjpSYW5kb20oc2l6ZSwxKTsKKyAgVmVjX2NkIHZjZCAgPSB2Y2YudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpOworICBmbG9hdCAgICAgICAgICAgc2YgID0gaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oKTsKKyAgZG91YmxlICAgICAgICAgIHNkICA9IGludGVybmFsOjpyYW5kb208ZG91YmxlPigpOworICBjb21wbGV4PGZsb2F0PiAgc2NmID0gaW50ZXJuYWw6OnJhbmRvbTxjb21wbGV4PGZsb2F0PiA+KCk7CisgIGNvbXBsZXg8ZG91YmxlPiBzY2QgPSBpbnRlcm5hbDo6cmFuZG9tPGNvbXBsZXg8ZG91YmxlPiA+KCk7CisKKworICBtZittZjsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobWYrbWQpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtZittY2YpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCh2Zj12ZCk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHZmKz12ZCk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG1jZD1tZCk7CisKKyAgLy8gY2hlY2sgc2NhbGFyIHByb2R1Y3RzCisgIFZFUklGWV9JU19BUFBST1godmNmICogc2YgLCB2Y2YgKiBjb21wbGV4PGZsb2F0PihzZikpOworICBWRVJJRllfSVNfQVBQUk9YKHNkICogdmNkLCBjb21wbGV4PGRvdWJsZT4oc2QpICogdmNkKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2ZiAqIHNjZiAsIHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpICogc2NmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QgKiB2ZCwgc2NkICogdmQudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpKTsKKworICAvLyBjaGVjayBkb3QgcHJvZHVjdAorICB2Zi5kb3QodmYpOworI2lmIDAgLy8gd2UgZ2V0IG90aGVyIGNvbXBpbGF0aW9uIGVycm9ycyBoZXJlIHRoYW4ganVzdCBzdGF0aWMgYXNzZXJ0cworICBWRVJJRllfUkFJU0VTX0FTU0VSVCh2ZC5kb3QodmYpKTsKKyNlbmRpZgorICBWRVJJRllfSVNfQVBQUk9YKHZjZi5kb3QodmYpLCB2Y2YuZG90KHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpKSk7CisKKyAgLy8gY2hlY2sgZGlhZ29uYWwgcHJvZHVjdAorICBWRVJJRllfSVNfQVBQUk9YKHZmLmFzRGlhZ29uYWwoKSAqIG1jZiwgdmYudGVtcGxhdGUgY2FzdDxjb21wbGV4PGZsb2F0PiA+KCkuYXNEaWFnb25hbCgpICogbWNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2Y2QuYXNEaWFnb25hbCgpICogbWQsIHZjZC5hc0RpYWdvbmFsKCkgKiBtZC50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZG91YmxlPiA+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1jZiAqIHZmLmFzRGlhZ29uYWwoKSwgbWNmICogdmYudGVtcGxhdGUgY2FzdDxjb21wbGV4PGZsb2F0PiA+KCkuYXNEaWFnb25hbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtZCAqIHZjZC5hc0RpYWdvbmFsKCksIG1kLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKSAqIHZjZC5hc0RpYWdvbmFsKCkpOworLy8gICB2ZC5hc0RpYWdvbmFsKCkgKiBtZjsgICAgLy8gZG9lcyBub3QgZXZlbiBjb21waWxlCisvLyAgIHZjZC5hc0RpYWdvbmFsKCkgKiBtZjsgICAvLyBkb2VzIG5vdCBldmVuIGNvbXBpbGUKKworICAvLyBjaGVjayBpbm5lciBwcm9kdWN0CisgIFZFUklGWV9JU19BUFBST1goKHZmLnRyYW5zcG9zZSgpICogdmNmKS52YWx1ZSgpLCAodmYudGVtcGxhdGUgY2FzdDxjb21wbGV4PGZsb2F0PiA+KCkudHJhbnNwb3NlKCkgKiB2Y2YpLnZhbHVlKCkpOworCisgIC8vIGNoZWNrIG91dGVyIHByb2R1Y3QKKyAgVkVSSUZZX0lTX0FQUFJPWCgodmYgKiB2Y2YudHJhbnNwb3NlKCkpLmV2YWwoKSwgKHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpICogdmNmLnRyYW5zcG9zZSgpKS5ldmFsKCkpOworCisgIC8vIGNvZWZmIHdpc2UgcHJvZHVjdAorCisgIFZFUklGWV9JU19BUFBST1goKHZmICogdmNmLnRyYW5zcG9zZSgpKS5ldmFsKCksICh2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKSAqIHZjZi50cmFuc3Bvc2UoKSkuZXZhbCgpKTsKKworICBNYXRfY2QgbWNkMiA9IG1jZDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtY2QuYXJyYXkoKSAqPSBtZC5hcnJheSgpLCBtY2QyLmFycmF5KCkgKj0gbWQuYXJyYXkoKS50ZW1wbGF0ZSBjYXN0PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CisgIAorICAvLyBjaGVjayBtYXRyaXgtbWF0cml4IHByb2R1Y3RzCisKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCptZCptY2QsIChzZCptZCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCptY2QqbWQsIHNkKm1jZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QqbWQqbWNkLCBzY2QqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QqbWNkKm1kLCBzY2QqbWNkKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpOworCisgIFZFUklGWV9JU19BUFBST1goc2YqbWYqbWNmLCBzZiptZi50ZW1wbGF0ZSBjYXN0PENGPigpKm1jZik7CisgIFZFUklGWV9JU19BUFBST1goc2YqbWNmKm1mLCBzZiptY2YqbWYudGVtcGxhdGUgY2FzdDxDRj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2NmKm1mKm1jZiwgc2NmKm1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkqbWNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2YqbWNmKm1mLCBzY2YqbWNmKm1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkpOworCisgIFZFUklGWV9JU19BUFBST1goc2YqbWYqdmNmLCAoc2YqbWYpLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpKnZjZik7CisgIFZFUklGWV9JU19BUFBST1goc2NmKm1mKnZjZiwoc2NmKm1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkpLmV2YWwoKSp2Y2YpOworICBWRVJJRllfSVNfQVBQUk9YKHNmKm1jZip2Ziwgc2YqbWNmKnZmLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZiptY2YqdmYsc2NmKm1jZip2Zi50ZW1wbGF0ZSBjYXN0PENGPigpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHNmKnZjZi5hZGpvaW50KCkqbWYsICBzZip2Y2YuYWRqb2ludCgpKm1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2YqdmNmLmFkam9pbnQoKSptZiwgc2NmKnZjZi5hZGpvaW50KCkqbWYudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNmKnZmLmFkam9pbnQoKSptY2YsICBzZip2Zi5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkqbWNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2YqdmYuYWRqb2ludCgpKm1jZiwgc2NmKnZmLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENGPigpLmV2YWwoKSptY2YpOworCisgIFZFUklGWV9JU19BUFBST1goc2QqbWQqdmNkLCAoc2QqbWQpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKnZjZCk7CisgIFZFUklGWV9JU19BUFBST1goc2NkKm1kKnZjZCwoc2NkKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpLmV2YWwoKSp2Y2QpOworICBWRVJJRllfSVNfQVBQUk9YKHNkKm1jZCp2ZCwgc2QqbWNkKnZkLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QqbWNkKnZkLHNjZCptY2QqdmQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkpOworCisgIFZFUklGWV9JU19BUFBST1goc2QqdmNkLmFkam9pbnQoKSptZCwgIHNkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2Y2QuYWRqb2ludCgpKm1kLCBzY2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2QqdmQuYWRqb2ludCgpKm1jZCwgIHNkKnZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2ZC5hZGpvaW50KCkqbWNkLCBzY2QqdmQuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZCk7Cit9CisKK3ZvaWQgdGVzdF9taXhpbmd0eXBlcygpCit7CisgIENBTExfU1VCVEVTVF8xKG1peGluZ3R5cGVzPDM+KCkpOworICBDQUxMX1NVQlRFU1RfMihtaXhpbmd0eXBlczw0PigpKTsKKyAgQ0FMTF9TVUJURVNUXzMobWl4aW5ndHlwZXM8RHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmVzdGluZ19vcHMuY3BwIGIvdGVzdC9uZXN0aW5nX29wcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4ZWJjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmVzdGluZ19vcHMuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHJ1bl9uZXN0aW5nX29wcyhjb25zdCBNYXRyaXhUeXBlJiBfbSkKK3sKKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6TmVzdGVkIG0oX20pOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyNpZmRlZiBOREVCVUcKKyAgY29uc3QgYm9vbCBpc19kZWJ1ZyA9IGZhbHNlOworI2Vsc2UKKyAgY29uc3QgYm9vbCBpc19kZWJ1ZyA9IHRydWU7CisjZW5kaWYKKworICAvLyBNYWtlIHJlYWxseSBzdXJlIHRoYXQgd2UgYXJlIGluIGRlYnVnIG1vZGUhIFdlIGRvbid0IHdhbnQgYW55IHR5cGUgb2YKKyAgLy8gaW5saW5pbmcgZm9yIHRoZXNlIHRlc3RzIHRvIHBhc3MuCisgIFZFUklGWShpc19kZWJ1Zyk7CisKKyAgLy8gVGhlIG9ubHkgaW50ZW50aW9uIG9mIHRoZXNlIHRlc3RzIGlzIHRvIGVuc3VyZSB0aGF0IHRoaXMgY29kZSBkb2VzCisgIC8vIG5vdCB0cmlnZ2VyIGFueSBhc3NlcnRzIG9yIHNlZ21lbnRhdGlvbiBmYXVsdHMuLi4gbW9yZSB0byBjb21lLgorICBWRVJJRllfSVNfQVBQUk9YKCAobS50cmFuc3Bvc2UoKSAqIG0pLmRpYWdvbmFsKCkuc3VtKCksIChtLnRyYW5zcG9zZSgpICogbSkuZGlhZ29uYWwoKS5zdW0oKSApOworICBWRVJJRllfSVNfQVBQUk9YKCAobS50cmFuc3Bvc2UoKSAqIG0pLmRpYWdvbmFsKCkuYXJyYXkoKS5hYnMoKS5zdW0oKSwgKG0udHJhbnNwb3NlKCkgKiBtKS5kaWFnb25hbCgpLmFycmF5KCkuYWJzKCkuc3VtKCkgKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCAobS50cmFuc3Bvc2UoKSAqIG0pLmFycmF5KCkuYWJzKCkuc3VtKCksIChtLnRyYW5zcG9zZSgpICogbSkuYXJyYXkoKS5hYnMoKS5zdW0oKSApOworfQorCit2b2lkIHRlc3RfbmVzdGluZ19vcHMoKQoreworICBDQUxMX1NVQlRFU1RfMShydW5fbmVzdGluZ19vcHMoTWF0cml4WGY6OlJhbmRvbSgyNSwyNSkpKTsKKyAgQ0FMTF9TVUJURVNUXzIocnVuX25lc3Rpbmdfb3BzKE1hdHJpeFhkOjpSYW5kb20oMjUsMjUpKSk7CisgIENBTExfU1VCVEVTVF8zKHJ1bl9uZXN0aW5nX29wcyhNYXRyaXg0Zjo6UmFuZG9tKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQocnVuX25lc3Rpbmdfb3BzKE1hdHJpeDRkOjpSYW5kb20oKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9ub21hbGxvYy5jcHAgYi90ZXN0L25vbWFsbG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGZmY2VmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ub21hbGxvYy5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvLyB0aGlzIGhhY2sgaXMgbmVlZGVkIHRvIG1ha2UgdGhpcyBmaWxlIGNvbXBpbGVzIHdpdGggLXBlZGFudGljIChnY2MpCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgdGhyb3coWCkKKyNlbmRpZgorLy8gZGlzY2FyZCBzdGFjayBhbGxvY2F0aW9uIGFzIHRoYXQgdG9vIGJ5cGFzc2VzIG1hbGxvYworI2RlZmluZSBFSUdFTl9TVEFDS19BTExPQ0FUSU9OX0xJTUlUIDAKKy8vIGFueSBoZWFwIGFsbG9jYXRpb24gd2lsbCByYWlzZSBhbiBhc3NlcnQKKyNkZWZpbmUgRUlHRU5fTk9fTUFMTE9DCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+CisjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisjaW5jbHVkZSA8RWlnZW4vU1ZEPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIG5vbWFsbG9jKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIC8qIHRoaXMgdGVzdCBjaGVjayBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGFyZSBpc3N1ZWQgd2l0aCBmaXhlZC1zaXplIG1hdHJpY2VzCisgICovCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAorICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKworICBWRVJJRllfSVNfQVBQUk9YKChtMSttMikqczEsICAgICAgICAgICAgICBzMSptMStzMSptMik7CisgIFZFUklGWV9JU19BUFBST1goKG0xK20yKShyLGMpLCAobTEocixjKSkrKG0yKHIsYykpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZVByb2R1Y3QobTEuYmxvY2soMCwwLHJvd3MsY29scykpLCAobTEuYXJyYXkoKSptMS5hcnJheSgpKS5tYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xKm0xLnRyYW5zcG9zZSgpKSptMiwgIG0xKihtMS50cmFuc3Bvc2UoKSptMikpOworICAKKyAgbTIuY29sKDApLm5vYWxpYXMoKSA9IG0xICogbTEuY29sKDApOworICBtMi5jb2woMCkubm9hbGlhcygpIC09IG0xLmFkam9pbnQoKSAqIG0xLmNvbCgwKTsKKyAgbTIuY29sKDApLm5vYWxpYXMoKSAtPSBtMSAqIG0xLnJvdygwKS5hZGpvaW50KCk7CisgIG0yLmNvbCgwKS5ub2FsaWFzKCkgLT0gbTEuYWRqb2ludCgpICogbTEucm93KDApLmFkam9pbnQoKTsKKworICBtMi5yb3coMCkubm9hbGlhcygpID0gbTEucm93KDApICogbTE7CisgIG0yLnJvdygwKS5ub2FsaWFzKCkgLT0gbTEucm93KDApICogbTEuYWRqb2ludCgpOworICBtMi5yb3coMCkubm9hbGlhcygpIC09IG0xLmNvbCgwKS5hZGpvaW50KCkgKiBtMTsKKyAgbTIucm93KDApLm5vYWxpYXMoKSAtPSBtMS5jb2woMCkuYWRqb2ludCgpICogbTEuYWRqb2ludCgpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLG0yKTsKKyAgCisgIG0yLmNvbCgwKS5ub2FsaWFzKCkgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIG0xLmNvbCgwKTsKKyAgbTIuY29sKDApLm5vYWxpYXMoKSAtPSBtMS5hZGpvaW50KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBtMS5jb2woMCk7CisgIG0yLmNvbCgwKS5ub2FsaWFzKCkgLT0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBtMS5yb3coMCkuYWRqb2ludCgpOworICBtMi5jb2woMCkubm9hbGlhcygpIC09IG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIG0xLnJvdygwKS5hZGpvaW50KCk7CisKKyAgbTIucm93KDApLm5vYWxpYXMoKSA9IG0xLnJvdygwKSAqIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBtMi5yb3coMCkubm9hbGlhcygpIC09IG0xLnJvdygwKSAqIG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgbTIucm93KDApLm5vYWxpYXMoKSAtPSBtMS5jb2woMCkuYWRqb2ludCgpICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIG0yLnJvdygwKS5ub2FsaWFzKCkgLT0gbTEuY29sKDApLmFkam9pbnQoKSAqIG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMixtMik7CisgIAorICBtMi5jb2woMCkubm9hbGlhcygpID0gbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogbTEuY29sKDApOworICBtMi5jb2woMCkubm9hbGlhcygpIC09IG0xLmFkam9pbnQoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiBtMS5jb2woMCk7CisgIG0yLmNvbCgwKS5ub2FsaWFzKCkgLT0gbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogbTEucm93KDApLmFkam9pbnQoKTsKKyAgbTIuY29sKDApLm5vYWxpYXMoKSAtPSBtMS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogbTEucm93KDApLmFkam9pbnQoKTsKKworICBtMi5yb3coMCkubm9hbGlhcygpID0gbTEucm93KDApICogbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOworICBtMi5yb3coMCkubm9hbGlhcygpIC09IG0xLnJvdygwKSAqIG0xLmFkam9pbnQoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CisgIG0yLnJvdygwKS5ub2FsaWFzKCkgLT0gbTEuY29sKDApLmFkam9pbnQoKSAqIG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgbTIucm93KDApLm5vYWxpYXMoKSAtPSBtMS5jb2woMCkuYWRqb2ludCgpICogbTEuYWRqb2ludCgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMixtMik7CisgIAorICBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMS5jb2woMCksLTEpOworICBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMS5yb3coMCksLTEpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgZmFuY3kgbWF0cml4LW1hdHJpeCBwcm9kdWN0cyBhcmUgbm90IHNhZmUgeWV0IHJlZ2FyZGluZyBzdGF0aWMgYWxsb2NhdGlvbgorLy8gICBtMSArPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIG0yLmNvbCg7CisvLyAgIG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0yKTsKKy8vICAgbTEgKz0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBtMjsKKy8vICAgbTEgKz0gbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogbTI7CisvLyAgIFZFUklGWV9JU19BUFBST1gobTEsbTEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGN0bXNfZGVjb21wb3NpdGlvbnMoKQoreworICBjb25zdCBpbnQgbWF4U2l6ZSA9IDE2OworICBjb25zdCBpbnQgc2l6ZSAgICA9IDEyOworCisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSwgbWF4U2l6ZT4gTWF0cml4OworCisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6RHluYW1pYywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplLCAxPiBWZWN0b3I7CisKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHN0ZDo6Y29tcGxleDxTY2FsYXI+LAorICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsIG1heFNpemU+IENvbXBsZXhNYXRyaXg7CisKKyAgY29uc3QgTWF0cml4IEEoTWF0cml4OjpSYW5kb20oc2l6ZSwgc2l6ZSkpLCBCKE1hdHJpeDo6UmFuZG9tKHNpemUsIHNpemUpKTsKKyAgTWF0cml4IFgoc2l6ZSxzaXplKTsKKyAgY29uc3QgQ29tcGxleE1hdHJpeCBjb21wbGV4QShDb21wbGV4TWF0cml4OjpSYW5kb20oc2l6ZSwgc2l6ZSkpOworICBjb25zdCBNYXRyaXggc2FBID0gQS5hZGpvaW50KCkgKiBBOworICBjb25zdCBWZWN0b3IgYihWZWN0b3I6OlJhbmRvbShzaXplKSk7CisgIFZlY3RvciB4KHNpemUpOworCisgIC8vIENob2xlc2t5IG1vZHVsZQorICBFaWdlbjo6TExUPE1hdHJpeD4gIExMVDsgIExMVC5jb21wdXRlKEEpOworICBYID0gTExULnNvbHZlKEIpOworICB4ID0gTExULnNvbHZlKGIpOworICBFaWdlbjo6TERMVDxNYXRyaXg+IExETFQ7IExETFQuY29tcHV0ZShBKTsKKyAgWCA9IExETFQuc29sdmUoQik7CisgIHggPSBMRExULnNvbHZlKGIpOworCisgIC8vIEVpZ2VudmFsdWVzIG1vZHVsZQorICBFaWdlbjo6SGVzc2VuYmVyZ0RlY29tcG9zaXRpb248Q29tcGxleE1hdHJpeD4gaGVzc0RlY29tcDsgICAgICAgIGhlc3NEZWNvbXAuY29tcHV0ZShjb21wbGV4QSk7CisgIEVpZ2VuOjpDb21wbGV4U2NodXI8Q29tcGxleE1hdHJpeD4gICAgICAgICAgICBjU2NodXIoc2l6ZSk7ICAgICAgY1NjaHVyLmNvbXB1dGUoY29tcGxleEEpOworICBFaWdlbjo6Q29tcGxleEVpZ2VuU29sdmVyPENvbXBsZXhNYXRyaXg+ICAgICAgY0VpZ1NvbHZlcjsgICAgICAgIGNFaWdTb2x2ZXIuY29tcHV0ZShjb21wbGV4QSk7CisgIEVpZ2VuOjpFaWdlblNvbHZlcjxNYXRyaXg+ICAgICAgICAgICAgICAgICAgICBlaWdTb2x2ZXI7ICAgICAgICAgZWlnU29sdmVyLmNvbXB1dGUoQSk7CisgIEVpZ2VuOjpTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeD4gICAgICAgICBzYUVpZ1NvbHZlcihzaXplKTsgc2FFaWdTb2x2ZXIuY29tcHV0ZShzYUEpOworICBFaWdlbjo6VHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeD4gICAgICAgICAgICAgdHJpZGlhZzsgICAgICAgICAgIHRyaWRpYWcuY29tcHV0ZShzYUEpOworCisgIC8vIExVIG1vZHVsZQorICBFaWdlbjo6UGFydGlhbFBpdkxVPE1hdHJpeD4gcHBMVTsgcHBMVS5jb21wdXRlKEEpOworICBYID0gcHBMVS5zb2x2ZShCKTsKKyAgeCA9IHBwTFUuc29sdmUoYik7CisgIEVpZ2VuOjpGdWxsUGl2TFU8TWF0cml4PiAgICBmcExVOyBmcExVLmNvbXB1dGUoQSk7CisgIFggPSBmcExVLnNvbHZlKEIpOworICB4ID0gZnBMVS5zb2x2ZShiKTsKKworICAvLyBRUiBtb2R1bGUKKyAgRWlnZW46OkhvdXNlaG9sZGVyUVI8TWF0cml4PiAgICAgICAgaFFSOyAgaFFSLmNvbXB1dGUoQSk7CisgIFggPSBoUVIuc29sdmUoQik7CisgIHggPSBoUVIuc29sdmUoYik7CisgIEVpZ2VuOjpDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeD4gIGNwUVI7IGNwUVIuY29tcHV0ZShBKTsKKyAgWCA9IGNwUVIuc29sdmUoQik7CisgIHggPSBjcFFSLnNvbHZlKGIpOworICBFaWdlbjo6RnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PiBmcFFSOyBmcFFSLmNvbXB1dGUoQSk7CisgIC8vIEZJWE1FIFggPSBmcFFSLnNvbHZlKEIpOworICB4ID0gZnBRUi5zb2x2ZShiKTsKKworICAvLyBTVkQgbW9kdWxlCisgIEVpZ2VuOjpKYWNvYmlTVkQ8TWF0cml4PiBqU1ZEOyBqU1ZELmNvbXB1dGUoQSwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWKTsKK30KKwordm9pZCB0ZXN0X25vbWFsbG9jKCkKK3sKKyAgLy8gY2hlY2sgdGhhdCBvdXIgb3BlcmF0b3IgbmV3IGlzIGluZGVlZCBjYWxsZWQ6CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKE1hdHJpeFhkIGR1bW15KE1hdHJpeFhkOjpSYW5kb20oMywzKSkpOworICBDQUxMX1NVQlRFU1RfMShub21hbGxvYyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgIENBTExfU1VCVEVTVF8yKG5vbWFsbG9jKE1hdHJpeDRkKCkpICk7CisgIENBTExfU1VCVEVTVF8zKG5vbWFsbG9jKE1hdHJpeDxmbG9hdCwzMiwzMj4oKSkgKTsKKyAgCisgIC8vIENoZWNrIGRlY29tcG9zaXRpb24gbW9kdWxlcyB3aXRoIGR5bmFtaWMgbWF0cmljZXMgdGhhdCBoYXZlIGEga25vd24gY29tcGlsZS10aW1lIG1heCBzaXplIChjdG1zKQorICBDQUxMX1NVQlRFU1RfNChjdG1zX2RlY29tcG9zaXRpb25zPGZsb2F0PigpKTsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9udWxsYXJ5LmNwcCBiL3Rlc3QvbnVsbGFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyMGUzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbnVsbGFyeS5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Citib29sIGVxdWFsc0lkZW50aXR5KGNvbnN0IE1hdHJpeFR5cGUmIEEpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgU2NhbGFyIHplcm8gPSBzdGF0aWNfY2FzdDxTY2FsYXI+KDApOworCisgIGJvb2wgb2ZmRGlhZ09LID0gdHJ1ZTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IEEucm93cygpOyArK2kpIHsKKyAgICBmb3IgKEluZGV4IGogPSBpKzE7IGogPCBBLmNvbHMoKTsgKytqKSB7CisgICAgICBvZmZEaWFnT0sgPSBvZmZEaWFnT0sgJiYgKEEoaSxqKSA9PSB6ZXJvKTsKKyAgICB9CisgIH0KKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IEEucm93cygpOyArK2kpIHsKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgKHN0ZDo6bWluKShpLCBBLmNvbHMoKSk7ICsraikgeworICAgICAgb2ZmRGlhZ09LID0gb2ZmRGlhZ09LICYmIChBKGksaikgPT0gemVybyk7CisgICAgfQorICB9CisKKyAgYm9vbCBkaWFnT0sgPSAoQS5kaWFnb25hbCgpLmFycmF5KCkgPT0gMSkuYWxsKCk7CisgIHJldHVybiBvZmZEaWFnT0sgJiYgZGlhZ09LOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCB0ZXN0VmVjdG9yVHlwZShjb25zdCBWZWN0b3JUeXBlJiBiYXNlKQoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VmVjdG9yVHlwZT46OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8VmVjdG9yVHlwZT46OlNjYWxhciBTY2FsYXI7CisKKyAgY29uc3QgSW5kZXggc2l6ZSA9IGJhc2Uuc2l6ZSgpOworICAKKyAgU2NhbGFyIGhpZ2ggPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTUwMCw1MDApOworICBTY2FsYXIgbG93ID0gKHNpemUgPT0gMSA/IGhpZ2ggOiBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTUwMCw1MDApKTsKKyAgaWYgKGxvdz5oaWdoKSBzdGQ6OnN3YXAobG93LGhpZ2gpOworCisgIGNvbnN0IFNjYWxhciBzdGVwID0gKChzaXplID09IDEpID8gMSA6IChoaWdoLWxvdykvKHNpemUtMSkpOworCisgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHJlc3VsdCB5aWVsZHMgd2hhdCB3ZSBleHBlY3QgaXQgdG8gZG8KKyAgVmVjdG9yVHlwZSBtKGJhc2UpOworICBtLnNldExpblNwYWNlZChzaXplLGxvdyxoaWdoKTsKKworICBWZWN0b3JUeXBlIG4oc2l6ZSk7CisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgICAgbihpKSA9IGxvdytpKnN0ZXA7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtLG4pOworCisgIC8vIHJhbmRvbSBhY2Nlc3MgdmVyc2lvbgorICBtID0gVmVjdG9yVHlwZTo6TGluU3BhY2VkKHNpemUsbG93LGhpZ2gpOworICBWRVJJRllfSVNfQVBQUk9YKG0sbik7CisKKyAgLy8gQXNzaWdubWVudCBvZiBhIFJvd1ZlY3RvclhkIHRvIGEgTWF0cml4WGQgKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnICM3OSkuCisgIFZFUklGWSggKE1hdHJpeFhkKFJvd1ZlY3RvclhkOjpMaW5TcGFjZWQoMywgMCwgMSkpIC0gUm93VmVjdG9yM2QoMCwgMC41LCAxKSkubm9ybSgpIDwgc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKTsKKworICAvLyBUaGVzZSBndXlzIHNvbWV0aW1lcyBmYWlsISBUaGlzIGlzIG5vdCBnb29kLiBBbnkgaWRlYXMgaG93IHRvIGZpeCB0aGVtIT8KKyAgLy9WRVJJRlkoIG0obS5zaXplKCktMSkgPT0gaGlnaCApOworICAvL1ZFUklGWSggbSgwKSA9PSBsb3cgKTsKKworICAvLyBzZXF1ZW50aWFsIGFjY2VzcyB2ZXJzaW9uCisgIG0gPSBWZWN0b3JUeXBlOjpMaW5TcGFjZWQoU2VxdWVudGlhbCxzaXplLGxvdyxoaWdoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLG4pOworCisgIC8vIFRoZXNlIGd1eXMgc29tZXRpbWVzIGZhaWwhIFRoaXMgaXMgbm90IGdvb2QuIEFueSBpZGVhcyBob3cgdG8gZml4IHRoZW0hPworICAvL1ZFUklGWSggbShtLnNpemUoKS0xKSA9PSBoaWdoICk7CisgIC8vVkVSSUZZKCBtKDApID09IGxvdyApOworCisgIC8vIGNoZWNrIHdoZXRoZXIgZXZlcnl0aGluZyB3b3JrcyB3aXRoIHJvdyBhbmQgY29sIG1ham9yIHZlY3RvcnMKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IHJvd192ZWN0b3Ioc2l6ZSk7CisgIE1hdHJpeDxTY2FsYXIsMSxEeW5hbWljPiBjb2xfdmVjdG9yKHNpemUpOworICByb3dfdmVjdG9yLnNldExpblNwYWNlZChzaXplLGxvdyxoaWdoKTsKKyAgY29sX3ZlY3Rvci5zZXRMaW5TcGFjZWQoc2l6ZSxsb3csaGlnaCk7CisgIFZFUklGWSggcm93X3ZlY3Rvci5pc0FwcHJveChjb2xfdmVjdG9yLnRyYW5zcG9zZSgpLCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKSk7CisKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IHNpemVfY2hhbmdlcihzaXplKzUwKTsKKyAgc2l6ZV9jaGFuZ2VyLnNldExpblNwYWNlZChzaXplLGxvdyxoaWdoKTsKKyAgVkVSSUZZKCBzaXplX2NoYW5nZXIuc2l6ZSgpID09IHNpemUgKTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMSwxPiBTY2FsYXJNYXRyaXg7CisgIFNjYWxhck1hdHJpeCBzY2FsYXI7CisgIHNjYWxhci5zZXRMaW5TcGFjZWQoMSxsb3csaGlnaCk7CisgIFZFUklGWV9JU19BUFBST1goIHNjYWxhciwgU2NhbGFyTWF0cml4OjpDb25zdGFudChoaWdoKSApOworICBWRVJJRllfSVNfQVBQUk9YKCBTY2FsYXJNYXRyaXg6OkxpblNwYWNlZCgxLGxvdyxoaWdoKSwgU2NhbGFyTWF0cml4OjpDb25zdGFudChoaWdoKSApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TWF0cml4VHlwZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICBjb25zdCBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIGNvbnN0IEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIEE7CisgIEEuc2V0SWRlbnRpdHkocm93cywgY29scyk7CisgIFZFUklGWShlcXVhbHNJZGVudGl0eShBKSk7CisgIFZFUklGWShlcXVhbHNJZGVudGl0eShNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCBjb2xzKSkpOworfQorCit2b2lkIHRlc3RfbnVsbGFyeSgpCit7CisgIENBTExfU1VCVEVTVF8xKCB0ZXN0TWF0cml4VHlwZShNYXRyaXgyZCgpKSApOworICBDQUxMX1NVQlRFU1RfMiggdGVzdE1hdHJpeFR5cGUoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLDMwMCksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKSkpICk7CisgIENBTExfU1VCVEVTVF8zKCB0ZXN0TWF0cml4VHlwZShNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwzMDApLGludGVybmFsOjpyYW5kb208aW50PigxLDMwMCkpKSApOworICAKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfNCggdGVzdFZlY3RvclR5cGUoVmVjdG9yWGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHRlc3RWZWN0b3JUeXBlKFZlY3RvcjRkKCkpICk7ICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMzIKKyAgICBDQUxMX1NVQlRFU1RfNiggdGVzdFZlY3RvclR5cGUoVmVjdG9yM2QoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggdGVzdFZlY3RvclR5cGUoVmVjdG9yWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIHRlc3RWZWN0b3JUeXBlKFZlY3RvcjNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIHRlc3RWZWN0b3JUeXBlKE1hdHJpeDxmbG9hdCwxLDE+KCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcGFja2V0bWF0aC5jcHAgYi90ZXN0L3BhY2tldG1hdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDY0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BhY2tldG1hdGguY3BwCkBAIC0wLDAgKzEsMzQ1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisvLyB1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK25hbWVzcGFjZSBFaWdlbiB7CituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBuZWdhdGUoY29uc3QgVCYgeCkgeyByZXR1cm4gLXg7IH0KK30KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBib29sIGlzQXBwcm94QWJzKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgU2NhbGFyJiBiLCBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCYgcmVmdmFsdWUpCit7CisgIHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYS1iLCByZWZ2YWx1ZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gYm9vbCBhcmVBcHByb3hBYnMoY29uc3QgU2NhbGFyKiBhLCBjb25zdCBTY2FsYXIqIGIsIGludCBzaXplLCBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCYgcmVmdmFsdWUpCit7CisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgIHsKKyAgICBpZiAoIWlzQXBwcm94QWJzKGFbaV0sYltpXSxyZWZ2YWx1ZSkpCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJbIiA8PCBNYXA8Y29uc3QgTWF0cml4PFNjYWxhciwxLER5bmFtaWM+ID4oYSxzaXplKSA8PCAiXSIgPDwgIiAhPSAiIDw8IE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLDEsRHluYW1pYz4gPihiLHNpemUpIDw8ICJcbiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IGJvb2wgYXJlQXBwcm94KGNvbnN0IFNjYWxhciogYSwgY29uc3QgU2NhbGFyKiBiLCBpbnQgc2l6ZSkKK3sKKyAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgeworICAgIGlmICghaW50ZXJuYWw6OmlzQXBwcm94KGFbaV0sYltpXSkpCisgICAgeworICAgICAgc3RkOjpjb3V0IDw8ICJbIiA8PCBNYXA8Y29uc3QgTWF0cml4PFNjYWxhciwxLER5bmFtaWM+ID4oYSxzaXplKSA8PCAiXSIgPDwgIiAhPSAiIDw8IE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLDEsRHluYW1pYz4gPihiLHNpemUpIDw8ICJcbiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisKKyNkZWZpbmUgQ0hFQ0tfQ1dJU0UyKFJFRk9QLCBQT1ApIHsgXAorICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKSBcCisgICAgcmVmW2ldID0gUkVGT1AoZGF0YTFbaV0sIGRhdGExW2krUGFja2V0U2l6ZV0pOyBcCisgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsIFBPUChpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSksIGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExK1BhY2tldFNpemUpKSk7IFwKKyAgVkVSSUZZKGFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgXAorfQorCisjZGVmaW5lIENIRUNLX0NXSVNFMShSRUZPUCwgUE9QKSB7IFwKKyAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkgXAorICAgIHJlZltpXSA9IFJFRk9QKGRhdGExW2ldKTsgXAorICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBQT1AoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSk7IFwKKyAgVkVSSUZZKGFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgXAorfQorCit0ZW1wbGF0ZTxib29sIENvbmQsdHlwZW5hbWUgUGFja2V0Pgorc3RydWN0IHBhY2tldF9oZWxwZXIKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIFBhY2tldCBsb2FkKGNvbnN0IFQqIGZyb20pIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGZyb20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIHZvaWQgc3RvcmUoVCogdG8sIGNvbnN0IFBhY2tldCYgeCkgY29uc3QgeyBpbnRlcm5hbDo6cHN0b3JlKHRvLHgpOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+CitzdHJ1Y3QgcGFja2V0X2hlbHBlcjxmYWxzZSxQYWNrZXQ+Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSBUIGxvYWQoY29uc3QgVCogZnJvbSkgY29uc3QgeyByZXR1cm4gKmZyb207IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBpbmxpbmUgdm9pZCBzdG9yZShUKiB0bywgY29uc3QgVCYgeCkgY29uc3QgeyAqdG8gPSB4OyB9Cit9OworCisjZGVmaW5lIENIRUNLX0NXSVNFMV9JRihDT05ELCBSRUZPUCwgUE9QKSBpZihDT05EKSB7IFwKKyAgcGFja2V0X2hlbHBlcjxDT05ELFBhY2tldD4gaDsgXAorICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKSBcCisgICAgcmVmW2ldID0gUkVGT1AoZGF0YTFbaV0pOyBcCisgIGguc3RvcmUoZGF0YTIsIFBPUChoLmxvYWQoZGF0YTEpKSk7IFwKKyAgVkVSSUZZKGFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgXAorfQorCisjZGVmaW5lIFJFRl9BREQoYSxiKSAoKGEpKyhiKSkKKyNkZWZpbmUgUkVGX1NVQihhLGIpICgoYSktKGIpKQorI2RlZmluZSBSRUZfTVVMKGEsYikgKChhKSooYikpCisjZGVmaW5lIFJFRl9ESVYoYSxiKSAoKGEpLyhiKSkKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHBhY2tldG1hdGgoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICBjb25zdCBpbnQgc2l6ZSA9IFBhY2tldFNpemUqNDsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgZGF0YTFbaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSo0XTsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgZGF0YTJbaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSo0XTsKKyAgRUlHRU5fQUxJR04xNiBQYWNrZXQgcGFja2V0c1tQYWNrZXRTaXplKjJdOworICBFSUdFTl9BTElHTjE2IFNjYWxhciByZWZbaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSo0XTsKKyAgUmVhbFNjYWxhciByZWZ2YWx1ZSA9IDA7CisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgIHsKKyAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpL1JlYWxTY2FsYXIoUGFja2V0U2l6ZSk7CisgICAgZGF0YTJbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKS9SZWFsU2NhbGFyKFBhY2tldFNpemUpOworICAgIHJlZnZhbHVlID0gKHN0ZDo6bWF4KShyZWZ2YWx1ZSxpbnRlcm5hbDo6YWJzKGRhdGExW2ldKSk7CisgIH0KKworICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpOworICBWRVJJRlkoYXJlQXBwcm94KGRhdGExLCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgImFsaWduZWQgbG9hZC9zdG9yZSIpOworCisgIGZvciAoaW50IG9mZnNldD0wOyBvZmZzZXQ8UGFja2V0U2l6ZTsgKytvZmZzZXQpCisgIHsKKyAgICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGxvYWR1PFBhY2tldD4oZGF0YTErb2Zmc2V0KSk7CisgICAgVkVSSUZZKGFyZUFwcHJveChkYXRhMStvZmZzZXQsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAiaW50ZXJuYWw6OnBsb2FkdSIpOworICB9CisKKyAgZm9yIChpbnQgb2Zmc2V0PTA7IG9mZnNldDxQYWNrZXRTaXplOyArK29mZnNldCkKKyAgeworICAgIGludGVybmFsOjpwc3RvcmV1KGRhdGEyK29mZnNldCwgaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKTsKKyAgICBWRVJJRlkoYXJlQXBwcm94KGRhdGExLCBkYXRhMitvZmZzZXQsIFBhY2tldFNpemUpICYmICJpbnRlcm5hbDo6cHN0b3JldSIpOworICB9CisKKyAgZm9yIChpbnQgb2Zmc2V0PTA7IG9mZnNldDxQYWNrZXRTaXplOyArK29mZnNldCkKKyAgeworICAgIHBhY2tldHNbMF0gPSBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSk7CisgICAgcGFja2V0c1sxXSA9IGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExK1BhY2tldFNpemUpOworICAgICAgICAgaWYgKG9mZnNldD09MCkgaW50ZXJuYWw6OnBhbGlnbjwwPihwYWNrZXRzWzBdLCBwYWNrZXRzWzFdKTsKKyAgICBlbHNlIGlmIChvZmZzZXQ9PTEpIGludGVybmFsOjpwYWxpZ248MT4ocGFja2V0c1swXSwgcGFja2V0c1sxXSk7CisgICAgZWxzZSBpZiAob2Zmc2V0PT0yKSBpbnRlcm5hbDo6cGFsaWduPDI+KHBhY2tldHNbMF0sIHBhY2tldHNbMV0pOworICAgIGVsc2UgaWYgKG9mZnNldD09MykgaW50ZXJuYWw6OnBhbGlnbjwzPihwYWNrZXRzWzBdLCBwYWNrZXRzWzFdKTsKKyAgICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBwYWNrZXRzWzBdKTsKKworICAgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgICByZWZbaV0gPSBkYXRhMVtpK29mZnNldF07CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFBhY2tldFNpemUsIDE+IFZlY3RvcjsKKyAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICJpbnRlcm5hbDo6cGFsaWduIik7CisgIH0KKworICBDSEVDS19DV0lTRTIoUkVGX0FERCwgIGludGVybmFsOjpwYWRkKTsKKyAgQ0hFQ0tfQ1dJU0UyKFJFRl9TVUIsICBpbnRlcm5hbDo6cHN1Yik7CisgIENIRUNLX0NXSVNFMihSRUZfTVVMLCAgaW50ZXJuYWw6OnBtdWwpOworICAjaWZuZGVmIEVJR0VOX1ZFQ1RPUklaRV9BTFRJVkVDCisgIGlmICghaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLGludD46OnZhbHVlKQorICAgIENIRUNLX0NXSVNFMihSRUZfRElWLCAgaW50ZXJuYWw6OnBkaXYpOworICAjZW5kaWYKKyAgQ0hFQ0tfQ1dJU0UxKGludGVybmFsOjpuZWdhdGUsIGludGVybmFsOjpwbmVnYXRlKTsKKyAgQ0hFQ0tfQ1dJU0UxKGludGVybmFsOjpjb25qLCBpbnRlcm5hbDo6cGNvbmopOworCisgIGZvcihpbnQgb2Zmc2V0PTA7b2Zmc2V0PDM7KytvZmZzZXQpCisgIHsKKyAgICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgICAgcmVmW2ldID0gZGF0YTFbb2Zmc2V0XTsKKyAgICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cHNldDE8UGFja2V0PihkYXRhMVtvZmZzZXRdKSk7CisgICAgVkVSSUZZKGFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAiaW50ZXJuYWw6OnBzZXQxIik7CisgIH0KKyAgCisgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3goZGF0YTFbMF0sIGludGVybmFsOjpwZmlyc3QoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSkgJiYgImludGVybmFsOjpwZmlyc3QiKTsKKyAgCisgIGlmKFBhY2tldFNpemU+MSkKKyAgeworICAgIGZvcihpbnQgb2Zmc2V0PTA7b2Zmc2V0PDQ7KytvZmZzZXQpCisgICAgeworICAgICAgZm9yKGludCBpPTA7aTxQYWNrZXRTaXplLzI7KytpKQorICAgICAgICByZWZbMippKzBdID0gcmVmWzIqaSsxXSA9IGRhdGExW29mZnNldCtpXTsKKyAgICAgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsaW50ZXJuYWw6OnBsb2FkZHVwPFBhY2tldD4oZGF0YTErb2Zmc2V0KSk7CisgICAgICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICJwbG9hZGR1cCIpOworICAgIH0KKyAgfQorCisgIHJlZlswXSA9IDA7CisgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgcmVmWzBdICs9IGRhdGExW2ldOworICBWRVJJRlkoaXNBcHByb3hBYnMocmVmWzBdLCBpbnRlcm5hbDo6cHJlZHV4KGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSksIHJlZnZhbHVlKSAmJiAiaW50ZXJuYWw6OnByZWR1eCIpOworCisgIHJlZlswXSA9IDE7CisgIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpCisgICAgcmVmWzBdICo9IGRhdGExW2ldOworICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KHJlZlswXSwgaW50ZXJuYWw6OnByZWR1eF9tdWwoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSkgJiYgImludGVybmFsOjpwcmVkdXhfbXVsIik7CisKKyAgZm9yIChpbnQgaj0wOyBqPFBhY2tldFNpemU7ICsraikKKyAgeworICAgIHJlZltqXSA9IDA7CisgICAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkKKyAgICAgIHJlZltqXSArPSBkYXRhMVtpK2oqUGFja2V0U2l6ZV07CisgICAgcGFja2V0c1tqXSA9IGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExK2oqUGFja2V0U2l6ZSk7CisgIH0KKyAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMiwgaW50ZXJuYWw6OnByZWR1eHAocGFja2V0cykpOworICBWRVJJRlkoYXJlQXBwcm94QWJzKHJlZiwgZGF0YTIsIFBhY2tldFNpemUsIHJlZnZhbHVlKSAmJiAiaW50ZXJuYWw6OnByZWR1eHAiKTsKKworICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgIHJlZltpXSA9IGRhdGExW1BhY2tldFNpemUtaS0xXTsKKyAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMiwgaW50ZXJuYWw6OnByZXZlcnNlKGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSkpOworICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICJpbnRlcm5hbDo6cHJldmVyc2UiKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHBhY2tldG1hdGhfcmVhbCgpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7CisgIGNvbnN0IGludCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZTsKKworICBjb25zdCBpbnQgc2l6ZSA9IFBhY2tldFNpemUqNDsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgZGF0YTFbaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSo0XTsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgZGF0YTJbaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSo0XTsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgcmVmW2ludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemUqNF07CisKKyAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgeworICAgIGRhdGExW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC0xZTMsMWUzKTsKKyAgICBkYXRhMltpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMWUzLDFlMyk7CisgIH0KKyAgQ0hFQ0tfQ1dJU0UxX0lGKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc1NpbiwgaW50ZXJuYWw6OnNpbiwgaW50ZXJuYWw6OnBzaW4pOworICBDSEVDS19DV0lTRTFfSUYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQ29zLCBpbnRlcm5hbDo6Y29zLCBpbnRlcm5hbDo6cGNvcyk7CisgIENIRUNLX0NXSVNFMV9JRihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNUYW4sIGludGVybmFsOjp0YW4sIGludGVybmFsOjpwdGFuKTsKKyAgCisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgIHsKKyAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMSwxKTsKKyAgICBkYXRhMltpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMSwxKTsKKyAgfQorICBDSEVDS19DV0lTRTFfSUYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzQVNpbiwgaW50ZXJuYWw6OmFzaW4sIGludGVybmFsOjpwYXNpbik7CisgIENIRUNLX0NXSVNFMV9JRihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNBQ29zLCBpbnRlcm5hbDo6YWNvcywgaW50ZXJuYWw6OnBhY29zKTsKKworICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQorICB7CisgICAgZGF0YTFbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTg3LDg4KTsKKyAgICBkYXRhMltpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtODcsODgpOworICB9CisgIENIRUNLX0NXSVNFMV9JRihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNFeHAsIGludGVybmFsOjpleHAsIGludGVybmFsOjpwZXhwKTsKKworICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQorICB7CisgICAgZGF0YTFbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMCwxZTYpOworICAgIGRhdGEyW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KDAsMWU2KTsKKyAgfQorICBDSEVDS19DV0lTRTFfSUYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTG9nLCBpbnRlcm5hbDo6bG9nLCBpbnRlcm5hbDo6cGxvZyk7CisgIENIRUNLX0NXSVNFMV9JRihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNTcXJ0LCBpbnRlcm5hbDo6c3FydCwgaW50ZXJuYWw6OnBzcXJ0KTsKKworICByZWZbMF0gPSBkYXRhMVswXTsKKyAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkKKyAgICByZWZbMF0gPSAoc3RkOjptaW4pKHJlZlswXSxkYXRhMVtpXSk7CisgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocmVmWzBdLCBpbnRlcm5hbDo6cHJlZHV4X21pbihpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKSAmJiAiaW50ZXJuYWw6OnByZWR1eF9taW4iKTsKKworICBDSEVDS19DV0lTRTIoKHN0ZDo6bWluKSwgaW50ZXJuYWw6OnBtaW4pOworICBDSEVDS19DV0lTRTIoKHN0ZDo6bWF4KSwgaW50ZXJuYWw6OnBtYXgpOworICBDSEVDS19DV0lTRTEoaW50ZXJuYWw6OmFicywgaW50ZXJuYWw6OnBhYnMpOworCisgIHJlZlswXSA9IGRhdGExWzBdOworICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKQorICAgIHJlZlswXSA9IChzdGQ6Om1heCkocmVmWzBdLGRhdGExW2ldKTsKKyAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChyZWZbMF0sIGludGVybmFsOjpwcmVkdXhfbWF4KGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSkpICYmICJpbnRlcm5hbDo6cHJlZHV4X21heCIpOworICAKKyAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkKKyAgICByZWZbaV0gPSBkYXRhMVswXStTY2FsYXIoaSk7CisgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsIGludGVybmFsOjpwbHNldChkYXRhMVswXSkpOworICBWRVJJRlkoYXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICJpbnRlcm5hbDo6cGxzZXQiKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGJvb2wgQ29uakxocyxib29sIENvbmpSaHM+IHZvaWQgdGVzdF9jb25qX2hlbHBlcihTY2FsYXIqIGRhdGExLCBTY2FsYXIqIGRhdGEyLCBTY2FsYXIqIHJlZiwgU2NhbGFyKiBwdmFsKQoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0OworICBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgIAorICBpbnRlcm5hbDo6Y29ual9pZjxDb25qTGhzPiBjajA7CisgIGludGVybmFsOjpjb25qX2lmPENvbmpSaHM+IGNqMTsKKyAgaW50ZXJuYWw6OmNvbmpfaGVscGVyPFNjYWxhcixTY2FsYXIsQ29uakxocyxDb25qUmhzPiBjajsKKyAgaW50ZXJuYWw6OmNvbmpfaGVscGVyPFBhY2tldCxQYWNrZXQsQ29uakxocyxDb25qUmhzPiBwY2o7CisgIAorICBmb3IoaW50IGk9MDtpPFBhY2tldFNpemU7KytpKQorICB7CisgICAgcmVmW2ldID0gY2owKGRhdGExW2ldKSAqIGNqMShkYXRhMltpXSk7CisgICAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChyZWZbaV0sIGNqLnBtdWwoZGF0YTFbaV0sZGF0YTJbaV0pKSAmJiAiY29ual9oZWxwZXIgcG11bCIpOworICB9CisgIGludGVybmFsOjpwc3RvcmUocHZhbCxwY2oucG11bChpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSksaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTIpKSk7CisgIFZFUklGWShhcmVBcHByb3gocmVmLCBwdmFsLCBQYWNrZXRTaXplKSAmJiAiY29ual9oZWxwZXIgcG11bCIpOworICAKKyAgZm9yKGludCBpPTA7aTxQYWNrZXRTaXplOysraSkKKyAgeworICAgIFNjYWxhciB0bXAgPSByZWZbaV07CisgICAgcmVmW2ldICs9IGNqMChkYXRhMVtpXSkgKiBjajEoZGF0YTJbaV0pOworICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocmVmW2ldLCBjai5wbWFkZChkYXRhMVtpXSxkYXRhMltpXSx0bXApKSAmJiAiY29ual9oZWxwZXIgcG1hZGQiKTsKKyAgfQorICBpbnRlcm5hbDo6cHN0b3JlKHB2YWwscGNqLnBtYWRkKGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSxpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMiksaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4ocHZhbCkpKTsKKyAgVkVSSUZZKGFyZUFwcHJveChyZWYsIHB2YWwsIFBhY2tldFNpemUpICYmICJjb25qX2hlbHBlciBwbWFkZCIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgcGFja2V0bWF0aF9jb21wbGV4KCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKKyAgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOworCisgIGNvbnN0IGludCBzaXplID0gUGFja2V0U2l6ZSo0OworICBFSUdFTl9BTElHTjE2IFNjYWxhciBkYXRhMVtQYWNrZXRTaXplKjRdOworICBFSUdFTl9BTElHTjE2IFNjYWxhciBkYXRhMltQYWNrZXRTaXplKjRdOworICBFSUdFTl9BTElHTjE2IFNjYWxhciByZWZbUGFja2V0U2l6ZSo0XTsKKyAgRUlHRU5fQUxJR04xNiBTY2FsYXIgcHZhbFtQYWNrZXRTaXplKjRdOworCisgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCisgIHsKKyAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKDFlMik7CisgICAgZGF0YTJbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSAqIFNjYWxhcigxZTIpOworICB9CisgIAorICB0ZXN0X2NvbmpfaGVscGVyPFNjYWxhcixmYWxzZSxmYWxzZT4gKGRhdGExLGRhdGEyLHJlZixwdmFsKTsKKyAgdGVzdF9jb25qX2hlbHBlcjxTY2FsYXIsZmFsc2UsdHJ1ZT4gIChkYXRhMSxkYXRhMixyZWYscHZhbCk7CisgIHRlc3RfY29ual9oZWxwZXI8U2NhbGFyLHRydWUsZmFsc2U+ICAoZGF0YTEsZGF0YTIscmVmLHB2YWwpOworICB0ZXN0X2NvbmpfaGVscGVyPFNjYWxhcix0cnVlLHRydWU+ICAgKGRhdGExLGRhdGEyLHJlZixwdmFsKTsKKyAgCisgIHsKKyAgICBmb3IoaW50IGk9MDtpPFBhY2tldFNpemU7KytpKQorICAgICAgcmVmW2ldID0gU2NhbGFyKHN0ZDo6aW1hZyhkYXRhMVtpXSksc3RkOjpyZWFsKGRhdGExW2ldKSk7CisgICAgaW50ZXJuYWw6OnBzdG9yZShwdmFsLGludGVybmFsOjpwY3BseGZsaXAoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSk7CisgICAgVkVSSUZZKGFyZUFwcHJveChyZWYsIHB2YWwsIFBhY2tldFNpemUpICYmICJwY3BseGZsaXAiKTsKKyAgfQorICAKKyAgCit9CisKK3ZvaWQgdGVzdF9wYWNrZXRtYXRoKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcGFja2V0bWF0aDxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwYWNrZXRtYXRoPGRvdWJsZT4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBwYWNrZXRtYXRoPGludD4oKSApOworICAgIENBTExfU1VCVEVTVF8xKCBwYWNrZXRtYXRoPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHBhY2tldG1hdGg8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICk7CisKKyAgICBDQUxMX1NVQlRFU1RfMSggcGFja2V0bWF0aF9yZWFsPGZsb2F0PigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHBhY2tldG1hdGhfcmVhbDxkb3VibGU+KCkgKTsKKworICAgIENBTExfU1VCVEVTVF8xKCBwYWNrZXRtYXRoX2NvbXBsZXg8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcGFja2V0bWF0aF9jb21wbGV4PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3BhcmRpc29fc3VwcG9ydC5jcHAgYi90ZXN0L3BhcmRpc29fc3VwcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlZmFkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGFyZGlzb19zdXBwb3J0LmNwcApAQCAtMCwwICsxLDI5IEBACisvKiAKKyAgIEludGVsIENvcHlyaWdodCAoQykgLi4uLgorKi8KKworI2luY2x1ZGUgInNwYXJzZV9zb2x2ZXIuaCIKKyNpbmNsdWRlIDxFaWdlbi9QYXJkaXNvU3VwcG9ydD4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0X3BhcmRpc29fVCgpCit7CisgIFBhcmRpc29MTFQgPCBTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+LCBMb3dlcj4gcGFyZGlzb19sbHRfbG93ZXI7CisgIFBhcmRpc29MTFQgPCBTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+LCBVcHBlcj4gcGFyZGlzb19sbHRfdXBwZXI7CisgIFBhcmRpc29MRExUIDwgU3BhcnNlTWF0cml4PFQsIFJvd01ham9yPiwgTG93ZXI+IHBhcmRpc29fbGRsdF9sb3dlcjsKKyAgUGFyZGlzb0xETFQgPCBTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+LCBVcHBlcj4gcGFyZGlzb19sZGx0X3VwcGVyOworICBQYXJkaXNvTFUgIDwgU3BhcnNlTWF0cml4PFQsIFJvd01ham9yPiA+IHBhcmRpc29fbHU7CisKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKHBhcmRpc29fbGx0X2xvd2VyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKHBhcmRpc29fbGx0X3VwcGVyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKHBhcmRpc29fbGRsdF9sb3dlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhwYXJkaXNvX2xkbHRfdXBwZXIpOworICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcocGFyZGlzb19sdSk7Cit9CisKK3ZvaWQgdGVzdF9wYXJkaXNvX3N1cHBvcnQoKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0X3BhcmRpc29fVDxmbG9hdD4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfcGFyZGlzb19UPGRvdWJsZT4oKSk7CisgIENBTExfU1VCVEVTVF8zKHRlc3RfcGFyZGlzb19UPCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RfcGFyZGlzb19UPCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9wYXN0aXhfc3VwcG9ydC5jcHAgYi90ZXN0L3Bhc3RpeF9zdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTU3MjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wYXN0aXhfc3VwcG9ydC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMiBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEw6lzaXLDqSBOdWVudHNhLVdha2FtIDxkZXNpcmUubnVlbnRzYV93YWthbUBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorI2luY2x1ZGUgPEVpZ2VuL1BhU3RpWFN1cHBvcnQ+CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BhcnNlRXh0cmE+CisKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0X3Bhc3RpeF9UKCkKK3sKKyAgUGFzdGl4TExUPCBTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+LCBFaWdlbjo6TG93ZXIgPiBwYXN0aXhfbGx0X2xvd2VyOworICBQYXN0aXhMRExUPCBTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+LCBFaWdlbjo6TG93ZXIgPiBwYXN0aXhfbGRsdF9sb3dlcjsKKyAgUGFzdGl4TExUPCBTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+LCBFaWdlbjo6VXBwZXIgPiBwYXN0aXhfbGx0X3VwcGVyOworICBQYXN0aXhMRExUPCBTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+LCBFaWdlbjo6VXBwZXIgPiBwYXN0aXhfbGRsdF91cHBlcjsKKyAgUGFzdGl4TFU8IFNwYXJzZU1hdHJpeDxULCBDb2xNYWpvcj4gPiBwYXN0aXhfbHU7CisKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKHBhc3RpeF9sbHRfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcocGFzdGl4X2xkbHRfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcocGFzdGl4X2xsdF91cHBlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhwYXN0aXhfbGRsdF91cHBlcik7CisgIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhwYXN0aXhfbHUpOworfQorCisvLyBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZWxmYWRqb2ludCBtYXRyaWNlcyB3aXRoIFBhU3RpWC4gCisvLyBDb21wbGV4IHN5bW1ldHJpYyBtYXRyaWNlcyBzaG91bGQgcGFzcyB0aG91Z2gKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9wYXN0aXhfVF9MVSgpCit7CisgIFBhc3RpeExVPCBTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+ID4gcGFzdGl4X2x1OworICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcocGFzdGl4X2x1KTsKK30KKwordm9pZCB0ZXN0X3Bhc3RpeF9zdXBwb3J0KCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9wYXN0aXhfVDxmbG9hdD4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RfcGFzdGl4X1Q8ZG91YmxlPigpKTsKKyAgQ0FMTF9TVUJURVNUXzMoICh0ZXN0X3Bhc3RpeF9UX0xVPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpKSApOworICBDQUxMX1NVQlRFU1RfNCh0ZXN0X3Bhc3RpeF9UX0xVPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvcGVybXV0YXRpb25tYXRyaWNlcy5jcHAgYi90ZXN0L3Blcm11dGF0aW9ubWF0cmljZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjY2NmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Blcm11dGF0aW9ubWF0cmljZXMuY3BwCkBAIC0wLDAgKzEsMTE3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHBlcm11dGF0aW9ubWF0cmljZXMoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAorICAgICAgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMgfTsKKyAgdHlwZWRlZiBQZXJtdXRhdGlvbk1hdHJpeDxSb3dzPiBMZWZ0UGVybXV0YXRpb25UeXBlOworICB0eXBlZGVmIE1hdHJpeDxpbnQsIFJvd3MsIDE+IExlZnRQZXJtdXRhdGlvblZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWFwPExlZnRQZXJtdXRhdGlvblR5cGU+IE1hcExlZnRQZXJtOworICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PENvbHM+IFJpZ2h0UGVybXV0YXRpb25UeXBlOworICB0eXBlZGVmIE1hdHJpeDxpbnQsIENvbHMsIDE+IFJpZ2h0UGVybXV0YXRpb25WZWN0b3JUeXBlOworICB0eXBlZGVmIE1hcDxSaWdodFBlcm11dGF0aW9uVHlwZT4gTWFwUmlnaHRQZXJtOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbV9vcmlnaW5hbCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBMZWZ0UGVybXV0YXRpb25WZWN0b3JUeXBlIGx2OworICByYW5kb21QZXJtdXRhdGlvblZlY3Rvcihsdiwgcm93cyk7CisgIExlZnRQZXJtdXRhdGlvblR5cGUgbHAobHYpOworICBSaWdodFBlcm11dGF0aW9uVmVjdG9yVHlwZSBydjsKKyAgcmFuZG9tUGVybXV0YXRpb25WZWN0b3IocnYsIGNvbHMpOworICBSaWdodFBlcm11dGF0aW9uVHlwZSBycChydik7CisgIE1hdHJpeFR5cGUgbV9wZXJtdXRlZCA9IGxwICogbV9vcmlnaW5hbCAqIHJwOworCisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyBpKyspCisgICAgZm9yIChpbnQgaj0wOyBqPGNvbHM7IGorKykKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkKGx2KGkpLGopLCBtX29yaWdpbmFsKGkscnYoaikpKTsKKworICBNYXRyaXg8U2NhbGFyLFJvd3MsUm93cz4gbG0obHApOworICBNYXRyaXg8U2NhbGFyLENvbHMsQ29scz4gcm0ocnApOworCisgIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZCwgbG0qbV9vcmlnaW5hbCpybSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChscC5pbnZlcnNlKCkqbV9wZXJtdXRlZCpycC5pbnZlcnNlKCksIG1fb3JpZ2luYWwpOworICBWRVJJRllfSVNfQVBQUk9YKGx2LmFzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkqbV9wZXJtdXRlZCpydi5hc1Blcm11dGF0aW9uKCkuaW52ZXJzZSgpLCBtX29yaWdpbmFsKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXBMZWZ0UGVybShsdi5kYXRhKCksbHYuc2l6ZSgpKS5pbnZlcnNlKCkqbV9wZXJtdXRlZCpNYXBSaWdodFBlcm0ocnYuZGF0YSgpLHJ2LnNpemUoKSkuaW52ZXJzZSgpLCBtX29yaWdpbmFsKTsKKyAgCisgIFZFUklGWSgobHAqbHAuaW52ZXJzZSgpKS50b0RlbnNlTWF0cml4KCkuaXNJZGVudGl0eSgpKTsKKyAgVkVSSUZZKChsdi5hc1Blcm11dGF0aW9uKCkqbHYuYXNQZXJtdXRhdGlvbigpLmludmVyc2UoKSkudG9EZW5zZU1hdHJpeCgpLmlzSWRlbnRpdHkoKSk7CisgIFZFUklGWSgoTWFwTGVmdFBlcm0obHYuZGF0YSgpLGx2LnNpemUoKSkqTWFwTGVmdFBlcm0obHYuZGF0YSgpLGx2LnNpemUoKSkuaW52ZXJzZSgpKS50b0RlbnNlTWF0cml4KCkuaXNJZGVudGl0eSgpKTsKKworICBMZWZ0UGVybXV0YXRpb25WZWN0b3JUeXBlIGx2MjsKKyAgcmFuZG9tUGVybXV0YXRpb25WZWN0b3IobHYyLCByb3dzKTsKKyAgTGVmdFBlcm11dGF0aW9uVHlwZSBscDIobHYyKTsKKyAgTWF0cml4PFNjYWxhcixSb3dzLFJvd3M+IGxtMihscDIpOworICBWRVJJRllfSVNfQVBQUk9YKChscCpscDIpLnRvRGVuc2VNYXRyaXgoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwgbG0qbG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobHYuYXNQZXJtdXRhdGlvbigpKmx2Mi5hc1Blcm11dGF0aW9uKCkpLnRvRGVuc2VNYXRyaXgoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwgbG0qbG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoTWFwTGVmdFBlcm0obHYuZGF0YSgpLGx2LnNpemUoKSkqTWFwTGVmdFBlcm0obHYyLmRhdGEoKSxsdjIuc2l6ZSgpKSkudG9EZW5zZU1hdHJpeCgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBsbSpsbTIpOworCisgIExlZnRQZXJtdXRhdGlvblR5cGUgaWRlbnRpdHlwOworICBpZGVudGl0eXAuc2V0SWRlbnRpdHkocm93cyk7CisgIFZFUklGWV9JU19BUFBST1gobV9vcmlnaW5hbCwgaWRlbnRpdHlwKm1fb3JpZ2luYWwpOworCisgIC8vIGNoZWNrIGlucGxhY2UgcGVybXV0YXRpb25zCisgIG1fcGVybXV0ZWQgPSBtX29yaWdpbmFsOworICBtX3Blcm11dGVkID0gbHAuaW52ZXJzZSgpICogbV9wZXJtdXRlZDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBscC5pbnZlcnNlKCkqbV9vcmlnaW5hbCk7CisKKyAgbV9wZXJtdXRlZCA9IG1fb3JpZ2luYWw7CisgIG1fcGVybXV0ZWQgPSBtX3Blcm11dGVkICogcnAuaW52ZXJzZSgpOworICBWRVJJRllfSVNfQVBQUk9YKG1fcGVybXV0ZWQsIG1fb3JpZ2luYWwqcnAuaW52ZXJzZSgpKTsKKworICBtX3Blcm11dGVkID0gbV9vcmlnaW5hbDsKKyAgbV9wZXJtdXRlZCA9IGxwICogbV9wZXJtdXRlZDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBscCptX29yaWdpbmFsKTsKKworICBtX3Blcm11dGVkID0gbV9vcmlnaW5hbDsKKyAgbV9wZXJtdXRlZCA9IG1fcGVybXV0ZWQgKiBycDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBtX29yaWdpbmFsKnJwKTsKKworICBpZihyb3dzPjEgJiYgY29scz4xKQorICB7CisgICAgbHAyID0gbHA7CisgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSk7CisgICAgSW5kZXggajsKKyAgICBkbyBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKTsgd2hpbGUoaj09aSk7CisgICAgbHAyLmFwcGx5VHJhbnNwb3NpdGlvbk9uVGhlTGVmdChpLCBqKTsKKyAgICBsbSA9IGxwOworICAgIGxtLnJvdyhpKS5zd2FwKGxtLnJvdyhqKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChsbSwgbHAyLnRvRGVuc2VNYXRyaXgoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSk7CisKKyAgICBSaWdodFBlcm11dGF0aW9uVHlwZSBycDIgPSBycDsKKyAgICBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKyAgICBkbyBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsgd2hpbGUoaj09aSk7CisgICAgcnAyLmFwcGx5VHJhbnNwb3NpdGlvbk9uVGhlUmlnaHQoaSwgaik7CisgICAgcm0gPSBycDsKKyAgICBybS5jb2woaSkuc3dhcChybS5jb2woaikpOworICAgIFZFUklGWV9JU19BUFBST1gocm0sIHJwMi50b0RlbnNlTWF0cml4KCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkpOworICB9ICAKK30KKwordm9pZCB0ZXN0X3Blcm11dGF0aW9ubWF0cmljZXMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBwZXJtdXRhdGlvbm1hdHJpY2VzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXgzZigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBwZXJtdXRhdGlvbm1hdHJpY2VzKE1hdHJpeDxkb3VibGUsMywzLFJvd01ham9yPigpKSApOworICAgIENBTExfU1VCVEVTVF80KCBwZXJtdXRhdGlvbm1hdHJpY2VzKE1hdHJpeDRkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHBlcm11dGF0aW9ubWF0cmljZXMoTWF0cml4PGRvdWJsZSw0MCw2MD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggcGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4oMjAsIDMwKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggcGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXhYY2YoMTUsIDEwKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcmVjX2ludmVyc2VfNHg0LmNwcCBiL3Rlc3QvcHJlY19pbnZlcnNlXzR4NC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkMGFmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHJlY19pbnZlcnNlXzR4NC5jcHAKQEAgLTAsMCArMSw2OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbnZlcnNlX3Blcm11dGF0aW9uXzR4NCgpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIFZlY3RvcjRpIGluZGljZXMoMCwxLDIsMyk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyNDsgKytpKQorICB7CisgICAgTWF0cml4VHlwZSBtID0gUGVybXV0YXRpb25NYXRyaXg8ND4oaW5kaWNlcyk7CisgICAgTWF0cml4VHlwZSBpbnYgPSBtLmludmVyc2UoKTsKKyAgICBkb3VibGUgZXJyb3IgPSBkb3VibGUoIChtKmludi1NYXRyaXhUeXBlOjpJZGVudGl0eSgpKS5ub3JtKCkgLyBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICk7CisgICAgRUlHRU5fREVCVUdfVkFSKGVycm9yKQorICAgIFZFUklGWShlcnJvciA9PSAwLjApOworICAgIHN0ZDo6bmV4dF9wZXJtdXRhdGlvbihpbmRpY2VzLmRhdGEoKSxpbmRpY2VzLmRhdGEoKSs0KTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGludmVyc2VfZ2VuZXJhbF80eDQoaW50IHJlcGVhdCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgZG91YmxlIGVycm9yX3N1bSA9IDAuLCBlcnJvcl9tYXggPSAwLjsKKyAgZm9yKGludCBpID0gMDsgaSA8IHJlcGVhdDsgKytpKQorICB7CisgICAgTWF0cml4VHlwZSBtOworICAgIFJlYWxTY2FsYXIgYWJzZGV0OworICAgIGRvIHsKKyAgICAgIG0gPSBNYXRyaXhUeXBlOjpSYW5kb20oKTsKKyAgICAgIGFic2RldCA9IGludGVybmFsOjphYnMobS5kZXRlcm1pbmFudCgpKTsKKyAgICB9IHdoaWxlKGFic2RldCA8IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpOworICAgIE1hdHJpeFR5cGUgaW52ID0gbS5pbnZlcnNlKCk7CisgICAgZG91YmxlIGVycm9yID0gZG91YmxlKCAobSppbnYtTWF0cml4VHlwZTo6SWRlbnRpdHkoKSkubm9ybSgpICogYWJzZGV0IC8gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSApOworICAgIGVycm9yX3N1bSArPSBlcnJvcjsKKyAgICBlcnJvcl9tYXggPSAoc3RkOjptYXgpKGVycm9yX21heCwgZXJyb3IpOworICB9CisgIHN0ZDo6Y2VyciA8PCAiaW52ZXJzZV9nZW5lcmFsXzR4NCwgU2NhbGFyID0gIiA8PCB0eXBlX25hbWU8U2NhbGFyPigpIDw8IHN0ZDo6ZW5kbDsKKyAgZG91YmxlIGVycm9yX2F2ZyA9IGVycm9yX3N1bSAvIHJlcGVhdDsKKyAgRUlHRU5fREVCVUdfVkFSKGVycm9yX2F2Zyk7CisgIEVJR0VOX0RFQlVHX1ZBUihlcnJvcl9tYXgpOworICAgLy8gRklYTUUgdGhhdCAxLjI1IHVzZWQgdG8gYmUgYSAxLjAgdW50aWwgdGhlIE51bVRyYWl0cyBjaGFuZ2VzIG9uIDI4IEFwcmlsIDIwMTAsIHdoYXQncyBnb2luZyB3cm9uZz8/CisgICAvLyBGSVhNRSB0aGF0IDEuMjUgdXNlZCB0byBiZSAxLjIgdW50aWwgd2UgdGVzdGVkIGdjYyA0LjEgb24gMzAgSnVuZSAyMDEwIGFuZCBnb3QgMS4yMS4KKyAgVkVSSUZZKGVycm9yX2F2ZyA8IChOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ID8gOC4wIDogMS4yNSkpOworICBWRVJJRlkoZXJyb3JfbWF4IDwgKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggPyA2NC4wIDogMjAuMCkpOworfQorCit2b2lkIHRlc3RfcHJlY19pbnZlcnNlXzR4NCgpCit7CisgIENBTExfU1VCVEVTVF8xKChpbnZlcnNlX3Blcm11dGF0aW9uXzR4NDxNYXRyaXg0Zj4oKSkpOworICBDQUxMX1NVQlRFU1RfMSgoIGludmVyc2VfZ2VuZXJhbF80eDQ8TWF0cml4NGY+KDIwMDAwMCAqIGdfcmVwZWF0KSApKTsKKworICBDQUxMX1NVQlRFU1RfMigoaW52ZXJzZV9wZXJtdXRhdGlvbl80eDQ8TWF0cml4PGRvdWJsZSw0LDQsUm93TWFqb3I+ID4oKSkpOworICBDQUxMX1NVQlRFU1RfMigoIGludmVyc2VfZ2VuZXJhbF80eDQ8TWF0cml4PGRvdWJsZSw0LDQsUm93TWFqb3I+ID4oMjAwMDAwICogZ19yZXBlYXQpICkpOworCisgIENBTExfU1VCVEVTVF8zKChpbnZlcnNlX3Blcm11dGF0aW9uXzR4NDxNYXRyaXg0Y2Y+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKGludmVyc2VfZ2VuZXJhbF80eDQ8TWF0cml4NGNmPig1MDAwMCAqIGdfcmVwZWF0KSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0LmggYi90ZXN0L3Byb2R1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWE5ZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0LmgKQEAgLTAsMCArMSwxNDMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1FSPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDI+Citib29sIGFyZU5vdEFwcHJveChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgbTEsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZDI+JiBtMiwgdHlwZW5hbWUgRGVyaXZlZDE6OlJlYWxTY2FsYXIgZXBzaWxvbiA9IE51bVRyYWl0czx0eXBlbmFtZSBEZXJpdmVkMTo6UmVhbFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKQoreworICByZXR1cm4gISgobTEtbTIpLmN3aXNlQWJzMigpLm1heENvZWZmKCkgPCBlcHNpbG9uICogZXBzaWxvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAqIChzdGQ6Om1heCkobTEuY3dpc2VBYnMyKCkubWF4Q29lZmYoKSwgbTIuY3dpc2VBYnMyKCkubWF4Q29lZmYoKSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHByb2R1Y3QoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICBJZGVudGl0eS5oIFByb2R1Y3QuaAorICAqLworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46Ok5vbkludGVnZXIgTm9uSW50ZWdlcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gUm93VmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgMT4gQ29sVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFJvd1NxdWFyZU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBDb2xTcXVhcmVNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdD9Db2xNYWpvcjpSb3dNYWpvcj4gT3RoZXJNYWpvck1hdHJpeFR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbworICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworICBSb3dTcXVhcmVNYXRyaXhUeXBlCisgICAgICAgICAgICAgaWRlbnRpdHkgPSBSb3dTcXVhcmVNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKSwKKyAgICAgICAgICAgICBzcXVhcmUgPSBSb3dTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgcm93cyksCisgICAgICAgICAgICAgcmVzID0gUm93U3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpOworICBDb2xTcXVhcmVNYXRyaXhUeXBlCisgICAgICAgICAgICAgc3F1YXJlMiA9IENvbFNxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShjb2xzLCBjb2xzKSwKKyAgICAgICAgICAgICByZXMyID0gQ29sU3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMpOworICBSb3dWZWN0b3JUeXBlIHYxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICBDb2xWZWN0b3JUeXBlIHZjMiA9IENvbFZlY3RvclR5cGU6OlJhbmRvbShjb2xzKSwgdmNyZXMoY29scyk7CisgIE90aGVyTWFqb3JNYXRyaXhUeXBlIHRtMSA9IG0xOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIEluZGV4IHIgID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKKyAgICAgICAgYyAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpLAorICAgICAgICBjMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisKKyAgLy8gYmVnaW4gdGVzdGluZyBQcm9kdWN0Lmg6IG9ubHkgYXNzb2NpYXRpdml0eSBmb3Igbm93CisgIC8vICh3ZSB1c2UgVHJhbnNwb3NlLmggYnV0IHRoaXMgZG9lc24ndCBjb3VudCBhcyBhIHRlc3QgZm9yIGl0KQorICBWRVJJRllfSVNfQVBQUk9YKChtMSptMS50cmFuc3Bvc2UoKSkqbTIsICBtMSoobTEudHJhbnNwb3NlKCkqbTIpKTsKKyAgbTMgPSBtMTsKKyAgbTMgKj0gbTEudHJhbnNwb3NlKCkgKiBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgbTEgKiAobTEudHJhbnNwb3NlKCkqbTIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgICAgbTEgKiAobTEudHJhbnNwb3NlKCkqbTIpKTsKKworICAvLyBjb250aW51ZSB0ZXN0aW5nIFByb2R1Y3QuaDogZGlzdHJpYnV0aXZpdHkKKyAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUqKG0xICsgbTIpLCAgICAgICAgc3F1YXJlKm0xK3NxdWFyZSptMik7CisgIFZFUklGWV9JU19BUFBST1goc3F1YXJlKihtMSAtIG0yKSwgICAgICAgIHNxdWFyZSptMS1zcXVhcmUqbTIpOworCisgIC8vIGNvbnRpbnVlIHRlc3RpbmcgUHJvZHVjdC5oOiBjb21wYXRpYmlsaXR5IHdpdGggU2NhbGFyTXVsdGlwbGUuaAorICBWRVJJRllfSVNfQVBQUk9YKHMxKihzcXVhcmUqbTEpLCAgICAgICAgICAoczEqc3F1YXJlKSptMSk7CisgIFZFUklGWV9JU19BUFBST1goczEqKHNxdWFyZSptMSksICAgICAgICAgIHNxdWFyZSoobTEqczEpKTsKKworICAvLyB0ZXN0IFByb2R1Y3QuaCB0b2dldGhlciB3aXRoIElkZW50aXR5LmgKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSwgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkqdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLnRyYW5zcG9zZSgpLCAgICAgICAgICB2MS50cmFuc3Bvc2UoKSAqIGlkZW50aXR5KTsKKyAgLy8gYWdhaW4sIHRlc3Qgb3BlcmF0b3IoKSB0byBjaGVjayBjb25zdC1xdWFsaWZpY2F0aW9uCisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scykocixjKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPihyPT1jKSk7CisKKyAgaWYgKHJvd3MhPWNvbHMpCisgICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0zID0gbTEqbTEpOworCisgIC8vIHRlc3QgdGhlIHByZXZpb3VzIHRlc3RzIHdlcmUgbm90IHNjcmV3ZWQgdXAgYmVjYXVzZSBvcGVyYXRvciogcmV0dXJucyAwCisgIC8vICh3ZSB1c2UgdGhlIG1vcmUgYWNjdXJhdGUgZGVmYXVsdCBlcHNpbG9uKQorICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgJiYgKHN0ZDo6bWluKShyb3dzLGNvbHMpPjEpCisgIHsKKyAgICBWRVJJRlkoYXJlTm90QXBwcm94KG0xLnRyYW5zcG9zZSgpKm0yLG0yLnRyYW5zcG9zZSgpKm0xKSk7CisgIH0KKworICAvLyB0ZXN0IG9wdGltaXplZCBvcGVyYXRvcis9IHBhdGgKKyAgcmVzID0gc3F1YXJlOworICByZXMubm9hbGlhcygpICs9IG0xICogbTIudHJhbnNwb3NlKCk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLCBzcXVhcmUgKyBtMSAqIG0yLnRyYW5zcG9zZSgpKTsKKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyICYmIChzdGQ6Om1pbikocm93cyxjb2xzKT4xKQorICB7CisgICAgVkVSSUZZKGFyZU5vdEFwcHJveChyZXMsc3F1YXJlICsgbTIgKiBtMS50cmFuc3Bvc2UoKSkpOworICB9CisgIHZjcmVzID0gdmMyOworICB2Y3Jlcy5ub2FsaWFzKCkgKz0gbTEudHJhbnNwb3NlKCkgKiB2MTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2Y3JlcywgdmMyICsgbTEudHJhbnNwb3NlKCkgKiB2MSk7CisKKyAgLy8gdGVzdCBvcHRpbWl6ZWQgb3BlcmF0b3ItPSBwYXRoCisgIHJlcyA9IHNxdWFyZTsKKyAgcmVzLm5vYWxpYXMoKSAtPSBtMSAqIG0yLnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgc3F1YXJlIC0gKG0xICogbTIudHJhbnNwb3NlKCkpKTsKKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyICYmIChzdGQ6Om1pbikocm93cyxjb2xzKT4xKQorICB7CisgICAgVkVSSUZZKGFyZU5vdEFwcHJveChyZXMsc3F1YXJlIC0gbTIgKiBtMS50cmFuc3Bvc2UoKSkpOworICB9CisgIHZjcmVzID0gdmMyOworICB2Y3Jlcy5ub2FsaWFzKCkgLT0gbTEudHJhbnNwb3NlKCkgKiB2MTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2Y3JlcywgdmMyIC0gbTEudHJhbnNwb3NlKCkgKiB2MSk7CisKKyAgdG0xID0gbTE7CisgIFZFUklGWV9JU19BUFBST1godG0xLnRyYW5zcG9zZSgpICogdjEsIG0xLnRyYW5zcG9zZSgpICogdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLnRyYW5zcG9zZSgpICogdG0xLCB2MS50cmFuc3Bvc2UoKSAqIG0xKTsKKworICAvLyB0ZXN0IHN1Ym1hdHJpeCBhbmQgbWF0cml4L3ZlY3RvciBwcm9kdWN0CisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCisgICAgcmVzLnJvdyhpKSA9IG0xLnJvdyhpKSAqIG0yLnRyYW5zcG9zZSgpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgbTEgKiBtMi50cmFuc3Bvc2UoKSk7CisgIC8vIHRoZSBvdGhlciB3YXkgcm91bmQ6CisgIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCisgICAgcmVzLmNvbChpKSA9IG0xICogbTIudHJhbnNwb3NlKCkuY29sKGkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgbTEgKiBtMi50cmFuc3Bvc2UoKSk7CisKKyAgcmVzMiA9IHNxdWFyZTI7CisgIHJlczIubm9hbGlhcygpICs9IG0xLnRyYW5zcG9zZSgpICogbTI7CisgIFZFUklGWV9JU19BUFBST1gocmVzMiwgc3F1YXJlMiArIG0xLnRyYW5zcG9zZSgpICogbTIpOworICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgJiYgKHN0ZDo6bWluKShyb3dzLGNvbHMpPjEpCisgIHsKKyAgICBWRVJJRlkoYXJlTm90QXBwcm94KHJlczIsc3F1YXJlMiArIG0yLnRyYW5zcG9zZSgpICogbTEpKTsKKyAgfQorCisgIFZFUklGWV9JU19BUFBST1gocmVzLmNvbChyKS5ub2FsaWFzKCkgPSBzcXVhcmUuYWRqb2ludCgpICogc3F1YXJlLmNvbChyKSwgKHNxdWFyZS5hZGpvaW50KCkgKiBzcXVhcmUuY29sKHIpKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcy5jb2wocikubm9hbGlhcygpID0gc3F1YXJlICogc3F1YXJlLmNvbChyKSwgKHNxdWFyZSAqIHNxdWFyZS5jb2wocikpLmV2YWwoKSk7CisKKyAgLy8gaW5uZXIgcHJvZHVjdAorICBTY2FsYXIgeCA9IHNxdWFyZTIucm93KGMpICogc3F1YXJlMi5jb2woYzIpOworICBWRVJJRllfSVNfQVBQUk9YKHgsIHNxdWFyZTIucm93KGMpLnRyYW5zcG9zZSgpLmN3aXNlUHJvZHVjdChzcXVhcmUyLmNvbChjMikpLnN1bSgpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcHJvZHVjdF9leHRyYS5jcHAgYi90ZXN0L3Byb2R1Y3RfZXh0cmEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmJmMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Byb2R1Y3RfZXh0cmEuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBwcm9kdWN0X2V4dHJhKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6Tm9uSW50ZWdlciBOb25JbnRlZ2VyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIER5bmFtaWM+IFJvd1ZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gQ29sVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6OkZsYWdzJlJvd01ham9yQml0PiBPdGhlck1ham9yTWF0cml4VHlwZTsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBpZGVudGl0eSA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpLAorICAgICAgICAgICAgIHNxdWFyZSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCByb3dzKSwKKyAgICAgICAgICAgICByZXMgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgcm93cyksCisgICAgICAgICAgICAgc3F1YXJlMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShjb2xzLCBjb2xzKSwKKyAgICAgICAgICAgICByZXMyID0gTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMpOworICBSb3dWZWN0b3JUeXBlIHYxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCB2cnJlcyhyb3dzKTsKKyAgQ29sVmVjdG9yVHlwZSB2YzIgPSBDb2xWZWN0b3JUeXBlOjpSYW5kb20oY29scyksIHZjcmVzKGNvbHMpOworICBPdGhlck1ham9yTWF0cml4VHlwZSB0bTEgPSBtMTsKKworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICBzMyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gbTEgKiBtMi5hZGpvaW50KCksICAgICAgICAgICAgICAgICBtMSAqIG0yLmFkam9pbnQoKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9IG0xLmFkam9pbnQoKSAqIHNxdWFyZS5hZGpvaW50KCksICAgbTEuYWRqb2ludCgpLmV2YWwoKSAqIHNxdWFyZS5hZGpvaW50KCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSBtMS5hZGpvaW50KCkgKiBtMiwgICAgICAgICAgICAgICAgIG0xLmFkam9pbnQoKS5ldmFsKCkgKiBtMik7CisgIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gKHMxICogbTEuYWRqb2ludCgpKSAqIG0yLCAgICAgICAgICAoczEgKiBtMS5hZGpvaW50KCkpLmV2YWwoKSAqIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSAoKHMxICogbTEpLmFkam9pbnQoKSkgKiBtMiwgICAgICAgIChpbnRlcm5hbDo6Y29uaihzMSkgKiBtMS5hZGpvaW50KCkpLmV2YWwoKSAqIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSAoLSBtMS5hZGpvaW50KCkgKiBzMSkgKiAoczMgKiBtMiksICgtIG0xLmFkam9pbnQoKSAgKiBzMSkuZXZhbCgpICogKHMzICogbTIpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gKHMyICogbTEuYWRqb2ludCgpICogczEpICogbTIsICAgICAoczIgKiBtMS5hZGpvaW50KCkgICogczEpLmV2YWwoKSAqIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSAoLW0xKnMyKSAqIHMxKm0yLmFkam9pbnQoKSwgICAgICAgICgtbTEqczIpLmV2YWwoKSAqIChzMSptMi5hZGpvaW50KCkpLmV2YWwoKSk7CisKKyAgLy8gYSB2ZXJ5IHRyaWNreSBjYXNlIHdoZXJlIGEgc2NhbGUgZmFjdG9yIGhhcyB0byBiZSBhdXRvbWF0aWNhbGx5IGNvbmp1Z2F0ZWQ6CisgIFZFUklGWV9JU19BUFBST1goIG0xLmFkam9pbnQoKSAqIChzMSptMikuY29uanVnYXRlKCksIChtMS5hZGpvaW50KCkpLmV2YWwoKSAqICgoczEqbTIpLmNvbmp1Z2F0ZSgpKS5ldmFsKCkpOworCisKKyAgLy8gdGVzdCBhbGwgcG9zc2libGUgY29uanVnYXRlIGNvbWJpbmF0aW9ucyBmb3IgdGhlIGZvdXIgbWF0cml4LXZlY3RvciBwcm9kdWN0IGNhc2VzOgorCisgIFZFUklGWV9JU19BUFBST1goKC1tMS5jb25qdWdhdGUoKSAqIHMyKSAqIChzMSAqIHZjMiksCisgICAgICAgICAgICAgICAgICAgKC1tMS5jb25qdWdhdGUoKSpzMikuZXZhbCgpICogKHMxICogdmMyKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCgtbTEgKiBzMikgKiAoczEgKiB2YzIuY29uanVnYXRlKCkpLAorICAgICAgICAgICAgICAgICAgICgtbTEqczIpLmV2YWwoKSAqIChzMSAqIHZjMi5jb25qdWdhdGUoKSkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xLmNvbmp1Z2F0ZSgpICogczIpICogKHMxICogdmMyLmNvbmp1Z2F0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAoLW0xLmNvbmp1Z2F0ZSgpKnMyKS5ldmFsKCkgKiAoczEgKiB2YzIuY29uanVnYXRlKCkpLmV2YWwoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2YzIudHJhbnNwb3NlKCkpICogKC1tMS5hZGpvaW50KCkgKiBzMiksCisgICAgICAgICAgICAgICAgICAgKHMxICogdmMyLnRyYW5zcG9zZSgpKS5ldmFsKCkgKiAoLW0xLmFkam9pbnQoKSpzMikuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2YzIuYWRqb2ludCgpKSAqICgtbTEudHJhbnNwb3NlKCkgKiBzMiksCisgICAgICAgICAgICAgICAgICAgKHMxICogdmMyLmFkam9pbnQoKSkuZXZhbCgpICogKC1tMS50cmFuc3Bvc2UoKSpzMikuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2YzIuYWRqb2ludCgpKSAqICgtbTEuYWRqb2ludCgpICogczIpLAorICAgICAgICAgICAgICAgICAgIChzMSAqIHZjMi5hZGpvaW50KCkpLmV2YWwoKSAqICgtbTEuYWRqb2ludCgpKnMyKS5ldmFsKCkpOworCisgIFZFUklGWV9JU19BUFBST1goKC1tMS5hZGpvaW50KCkgKiBzMikgKiAoczEgKiB2MS50cmFuc3Bvc2UoKSksCisgICAgICAgICAgICAgICAgICAgKC1tMS5hZGpvaW50KCkqczIpLmV2YWwoKSAqIChzMSAqIHYxLnRyYW5zcG9zZSgpKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCgtbTEudHJhbnNwb3NlKCkgKiBzMikgKiAoczEgKiB2MS5hZGpvaW50KCkpLAorICAgICAgICAgICAgICAgICAgICgtbTEudHJhbnNwb3NlKCkqczIpLmV2YWwoKSAqIChzMSAqIHYxLmFkam9pbnQoKSkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xLmFkam9pbnQoKSAqIHMyKSAqIChzMSAqIHYxLmFkam9pbnQoKSksCisgICAgICAgICAgICAgICAgICAgKC1tMS5hZGpvaW50KCkqczIpLmV2YWwoKSAqIChzMSAqIHYxLmFkam9pbnQoKSkuZXZhbCgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKChzMSAqIHYxKSAqICgtbTEuY29uanVnYXRlKCkgKiBzMiksCisgICAgICAgICAgICAgICAgICAgKHMxICogdjEpLmV2YWwoKSAqICgtbTEuY29uanVnYXRlKCkqczIpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goKHMxICogdjEuY29uanVnYXRlKCkpICogKC1tMSAqIHMyKSwKKyAgICAgICAgICAgICAgICAgICAoczEgKiB2MS5jb25qdWdhdGUoKSkuZXZhbCgpICogKC1tMSpzMikuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2MS5jb25qdWdhdGUoKSkgKiAoLW0xLmNvbmp1Z2F0ZSgpICogczIpLAorICAgICAgICAgICAgICAgICAgIChzMSAqIHYxLmNvbmp1Z2F0ZSgpKS5ldmFsKCkgKiAoLW0xLmNvbmp1Z2F0ZSgpKnMyKS5ldmFsKCkpOworCisgIFZFUklGWV9JU19BUFBST1goKC1tMS5hZGpvaW50KCkgKiBzMikgKiAoczEgKiB2MS5hZGpvaW50KCkpLAorICAgICAgICAgICAgICAgICAgICgtbTEuYWRqb2ludCgpKnMyKS5ldmFsKCkgKiAoczEgKiB2MS5hZGpvaW50KCkpLmV2YWwoKSk7CisKKyAgLy8gdGVzdCB0aGUgdmVjdG9yLW1hdHJpeCBwcm9kdWN0IHdpdGggbm9uIGFsaWduZWQgc3RhcnRzCisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLnJvd3MoKS0yKTsKKyAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsbTEuY29scygpLTIpOworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxtMS5yb3dzKCktaSk7CisgIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLG0xLmNvbHMoKS1qKTsKKyAgSW5kZXggaTIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLnJvd3MoKS0xKTsKKyAgSW5kZXggajIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLmNvbHMoKS0xKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChqMikuYWRqb2ludCgpICogbTEuYmxvY2soMCxqLG0xLnJvd3MoKSxjKSwgbTEuY29sKGoyKS5hZGpvaW50KCkuZXZhbCgpICogbTEuYmxvY2soMCxqLG0xLnJvd3MoKSxjKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKGksMCxyLG0xLmNvbHMoKSkgKiBtMS5yb3coaTIpLmFkam9pbnQoKSwgbTEuYmxvY2soaSwwLHIsbTEuY29scygpKS5ldmFsKCkgKiBtMS5yb3coaTIpLmFkam9pbnQoKS5ldmFsKCkpOworICAKKyAgLy8gcmVncmVzc2lvbiB0ZXN0CisgIE1hdHJpeFR5cGUgdG1wID0gbTEgKiBtMS5hZGpvaW50KCkgKiBzMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0bXAsIG0xICogbTEuYWRqb2ludCgpICogczEpOworfQorCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyByZXBvcnRlZCBhdCBodHRwOi8vZm9ydW0ua2RlLm9yZy92aWV3dG9waWMucGhwP2Y9NzQmdD05Njk0Nwordm9pZCBtYXRfbWF0X3NjYWxhcl9zY2FsYXJfcHJvZHVjdCgpCit7CisgIEVpZ2VuOjpNYXRyaXgyWGQgZE5keHkoMiwgMyk7CisgIGROZHh5IDw8IC0wLjUsIDAuNSwgMCwKKyAgICAgICAgICAgLTAuMywgMCwgMC4zOworICBkb3VibGUgZGV0ID0gNi4wLCB3dCA9IDAuNTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkTmR4eS50cmFuc3Bvc2UoKSpkTmR4eSpkZXQqd3QsIGRldCp3dCpkTmR4eS50cmFuc3Bvc2UoKSpkTmR4eSk7Cit9CisgIAordm9pZCB6ZXJvX3NpemVkX29iamVjdHMoKQoreworICAvLyBCdWcgMTI3CisgIC8vCisgIC8vIGEgcHJvZHVjdCBvZiB0aGUgZm9ybSBsaHMqcmhzIHdpdGgKKyAgLy8KKyAgLy8gbGhzOgorICAvLyByb3dzID0gMSwgY29scyA9IDQKKyAgLy8gUm93c0F0Q29tcGlsZVRpbWUgPSAxLCBDb2xzQXRDb21waWxlVGltZSA9IC0xCisgIC8vIE1heFJvd3NBdENvbXBpbGVUaW1lID0gMSwgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSA1CisgIC8vCisgIC8vIHJoczoKKyAgLy8gcm93cyA9IDQsIGNvbHMgPSAwCisgIC8vIFJvd3NBdENvbXBpbGVUaW1lID0gLTEsIENvbHNBdENvbXBpbGVUaW1lID0gLTEKKyAgLy8gTWF4Um93c0F0Q29tcGlsZVRpbWUgPSA1LCBNYXhDb2xzQXRDb21waWxlVGltZSA9IDEKKyAgLy8KKyAgLy8gd2FzIGZhaWxpbmcgb24gYSBydW50aW1lIGFzc2VydGlvbiwgYmVjYXVzZSBpdCBoYWQgYmVlbiBtaXMtY29tcGlsZWQgYXMgYSBkb3QgcHJvZHVjdCBiZWNhdXNlIFByb2R1Y3QuaCB3YXMgdXNpbmcgdGhlCisgIC8vIG1heC1zaXplcyB0byBkZXRlY3Qgc2l6ZSAxIGluZGljYXRpbmcgdmVjdG9ycywgYW5kIHRoYXQgZGlkbid0IGFjY291bnQgZm9yIDAtc2l6ZWQgb2JqZWN0IHdpdGggbWF4LXNpemUgMS4KKworICBNYXRyaXg8ZmxvYXQsMSxEeW5hbWljLFJvd01ham9yLDEsNT4gYSgxLDQpOworICBNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLENvbE1ham9yLDUsMT4gYig0LDApOworICBhKmI7Cit9CisKK3ZvaWQgdGVzdF9wcm9kdWN0X2V4dHJhKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcHJvZHVjdF9leHRyYShNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwcm9kdWN0X2V4dHJhKE1hdHJpeFhkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hdF9tYXRfc2NhbGFyX3NjYWxhcl9wcm9kdWN0KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcHJvZHVjdF9leHRyYShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHByb2R1Y3RfZXh0cmEoTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSApOworICAgIENBTExfU1VCVEVTVF81KCB6ZXJvX3NpemVkX29iamVjdHMoKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfbGFyZ2UuY3BwIGIvdGVzdC9wcm9kdWN0X2xhcmdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Q3YmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0X2xhcmdlLmNwcApAQCAtMCwwICsxLDY0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgInByb2R1Y3QuaCIKKwordm9pZCB0ZXN0X3Byb2R1Y3RfbGFyZ2UoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBwcm9kdWN0KE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHByb2R1Y3QoTWF0cml4WGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcHJvZHVjdChNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF80KCBwcm9kdWN0KE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggcHJvZHVjdChNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICB9CisKKyNpZiBkZWZpbmVkIEVJR0VOX1RFU1RfUEFSVF82CisgIHsKKyAgICAvLyB0ZXN0IGEgc3BlY2lmaWMgaXNzdWUgaW4gRGlhZ29uYWxQcm9kdWN0CisgICAgaW50IE4gPSAxMDAwMDAwOworICAgIFZlY3RvclhmIHYgPSBWZWN0b3JYZjo6T25lcyhOKTsKKyAgICBNYXRyaXhYZiBtID0gTWF0cml4WGY6Ok9uZXMoTiwzKTsKKyAgICBtID0gKHYrdikuYXNEaWFnb25hbCgpICogbTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sIE1hdHJpeFhmOjpDb25zdGFudChOLDMsMikpOworICB9CisKKyAgeworICAgIC8vIHRlc3QgZGVmZXJyZWQgcmVzaXppbmcgaW4gTWF0cml4OjpvcGVyYXRvcj0KKyAgICBNYXRyaXhYZiBhID0gTWF0cml4WGY6OlJhbmRvbSgxMCw0KSwgYiA9IE1hdHJpeFhmOjpSYW5kb20oNCwxMCksIGMgPSBhOworICAgIFZFUklGWV9JU19BUFBST1goKGEgPSBhICogYiksIChjICogYikuZXZhbCgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBjaGVjayB0aGUgZnVuY3Rpb25zIHRvIHNldHVwIGJsb2NraW5nIHNpemVzIGNvbXBpbGUgYW5kIGRvIG5vdCBzZWdmYXVsdAorICAgIC8vIEZJWE1FIGNoZWNrIHRoZXkgZG8gd2hhdCB0aGV5IGFyZSBzdXBwb3NlZCB0byBkbyAhIQorICAgIHN0ZDo6cHRyZGlmZl90IGwxID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMDAwLDIwMDAwKTsKKyAgICBzdGQ6OnB0cmRpZmZfdCBsMiA9IGludGVybmFsOjpyYW5kb208aW50PigxMDAwMDAwLDIwMDAwMDApOworICAgIHNldENwdUNhY2hlU2l6ZXMobDEsbDIpOworICAgIFZFUklGWShsMT09bDFDYWNoZVNpemUoKSk7CisgICAgVkVSSUZZKGwyPT1sMkNhY2hlU2l6ZSgpKTsKKyAgICBzdGQ6OnB0cmRpZmZfdCBrMSA9IGludGVybmFsOjpyYW5kb208aW50PigxMCwxMDApKjE2OworICAgIHN0ZDo6cHRyZGlmZl90IG0xID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDEwMCkqMTY7CisgICAgc3RkOjpwdHJkaWZmX3QgbjEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsMTAwKSoxNjsKKyAgICAvLyBvbmx5IG1ha2VzIHN1cmUgaXQgY29tcGlsZXMgZmluZQorICAgIGludGVybmFsOjpjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8ZmxvYXQsZmxvYXQ+KGsxLG0xLG4xKTsKKyAgfQorCisgIHsKKyAgICAvLyB0ZXN0IHJlZ3Jlc3Npb24gaW4gcm93LXZlY3RvciBieSBtYXRyaXggKGJhZCBNYXAgdHlwZSkKKyAgICBNYXRyaXhYZiBtYXQxKDEwLDMyKTsgbWF0MS5zZXRSYW5kb20oKTsKKyAgICBNYXRyaXhYZiBtYXQyKDMyLDMyKTsgbWF0Mi5zZXRSYW5kb20oKTsKKyAgICBNYXRyaXhYZiByMSA9IG1hdDEucm93KDIpKm1hdDIudHJhbnNwb3NlKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyMSwgKG1hdDEucm93KDIpKm1hdDIudHJhbnNwb3NlKCkpLmV2YWwoKSk7CisKKyAgICBNYXRyaXhYZiByMiA9IG1hdDEucm93KDIpKm1hdDI7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyMiwgKG1hdDEucm93KDIpKm1hdDIpLmV2YWwoKSk7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X21tdHIuY3BwIGIvdGVzdC9wcm9kdWN0X21tdHIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OWNmZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Byb2R1Y3RfbW10ci5jcHAKQEAgLTAsMCArMSw2NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjZGVmaW5lIENIRUNLX01NVFIoREVTVCwgVFJJLCBPUCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmMiA9IHJlZjEgPSBERVNUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVTVC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxUUkk+KCkgT1A7ICAgICAgICAgICBcCisgICAgcmVmMSBPUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxUUkk+KCkgPSByZWYxOyAgICAgICBcCisgICAgVkVSSUZZX0lTX0FQUFJPWChERVNULHJlZjIpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIG1tdHIoaW50IHNpemUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiBNYXRyaXhDb2xNYWo7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+IE1hdHJpeFJvd01hajsKKworICBEZW5zZUluZGV4IG90aGVyc2l6ZSA9IGludGVybmFsOjpyYW5kb208RGVuc2VJbmRleD4oMSwyMDApOworICAKKyAgTWF0cml4Q29sTWFqIG1hdGMoc2l6ZSwgc2l6ZSk7CisgIE1hdHJpeFJvd01haiBtYXRyKHNpemUsIHNpemUpOworICBNYXRyaXhDb2xNYWogcmVmMShzaXplLCBzaXplKSwgcmVmMihzaXplLCBzaXplKTsKKyAgCisgIE1hdHJpeENvbE1haiBzb2Moc2l6ZSxvdGhlcnNpemUpOyBzb2Muc2V0UmFuZG9tKCk7CisgIE1hdHJpeENvbE1haiBvc2Mob3RoZXJzaXplLHNpemUpOyBvc2Muc2V0UmFuZG9tKCk7CisgIE1hdHJpeFJvd01haiBzb3Ioc2l6ZSxvdGhlcnNpemUpOyBzb3Iuc2V0UmFuZG9tKCk7CisgIE1hdHJpeFJvd01haiBvc3Iob3RoZXJzaXplLHNpemUpOyBvc3Iuc2V0UmFuZG9tKCk7CisgIAorICBTY2FsYXIgcyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAKKyAgQ0hFQ0tfTU1UUihtYXRjLCBMb3dlciwgPSBzKnNvYypzb3IuYWRqb2ludCgpKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBVcHBlciwgPSBzKihzb2Mqc29jLmFkam9pbnQoKSkpOworICBDSEVDS19NTVRSKG1hdHIsIExvd2VyLCA9IHMqc29jKnNvYy5hZGpvaW50KCkpOworICBDSEVDS19NTVRSKG1hdHIsIFVwcGVyLCA9IHNvYyoocypzb3IuYWRqb2ludCgpKSk7CisgIAorICBDSEVDS19NTVRSKG1hdGMsIExvd2VyLCArPSBzKnNvYypzb2MuYWRqb2ludCgpKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBVcHBlciwgKz0gcyooc29jKnNvci50cmFuc3Bvc2UoKSkpOworICBDSEVDS19NTVRSKG1hdHIsIExvd2VyLCArPSBzKnNvcipzb2MuYWRqb2ludCgpKTsKKyAgQ0hFQ0tfTU1UUihtYXRyLCBVcHBlciwgKz0gc29jKihzKnNvYy5hZGpvaW50KCkpKTsKKyAgCisgIENIRUNLX01NVFIobWF0YywgTG93ZXIsIC09IHMqc29jKnNvYy5hZGpvaW50KCkpOworICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCAtPSBzKihvc2MudHJhbnNwb3NlKCkqb3NjLmNvbmp1Z2F0ZSgpKSk7CisgIENIRUNLX01NVFIobWF0ciwgTG93ZXIsIC09IHMqc29jKnNvYy5hZGpvaW50KCkpOworICBDSEVDS19NTVRSKG1hdHIsIFVwcGVyLCAtPSBzb2MqKHMqc29jLmFkam9pbnQoKSkpOworfQorCit2b2lkIHRlc3RfcHJvZHVjdF9tbXRyKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQorICB7CisgICAgQ0FMTF9TVUJURVNUXzEoKG1tdHI8ZmxvYXQ+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF8yKChtbXRyPGRvdWJsZT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKG1tdHI8c3RkOjpjb21wbGV4PGZsb2F0PiA+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKG1tdHI8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3Rfbm90ZW1wb3JhcnkuY3BwIGIvdGVzdC9wcm9kdWN0X25vdGVtcG9yYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjlkYmRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0X25vdGVtcG9yYXJ5LmNwcApAQCAtMCwwICsxLDEzOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKK3N0YXRpYyBpbnQgbmJfdGVtcG9yYXJpZXM7CisKK3ZvaWQgb25fdGVtcG9yYXJ5X2NyZWF0aW9uKGludCBzaXplKSB7CisgIC8vIGhlcmUncyBhIGdyZWF0IHBsYWNlIHRvIHNldCBhIGJyZWFrcG9pbnQgd2hlbiBkZWJ1Z2dpbmcgZmFpbHVyZXMgaW4gdGhpcyB0ZXN0IQorICBpZihzaXplIT0wKSBuYl90ZW1wb3JhcmllcysrOworfQorICAKKworI2RlZmluZSBFSUdFTl9ERU5TRV9TVE9SQUdFX0NUT1JfUExVR0lOIHsgb25fdGVtcG9yYXJ5X2NyZWF0aW9uKHNpemUpOyB9CisKKyNpbmNsdWRlICJtYWluLmgiCisKKyNkZWZpbmUgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoWFBSLE4pIHtcCisgICAgbmJfdGVtcG9yYXJpZXMgPSAwOyBcCisgICAgWFBSOyBcCisgICAgaWYobmJfdGVtcG9yYXJpZXMhPU4pIHN0ZDo6Y2VyciA8PCAibmJfdGVtcG9yYXJpZXMgPT0gIiA8PCBuYl90ZW1wb3JhcmllcyA8PCAiXG4iOyBcCisgICAgVkVSSUZZKCAoI1hQUikgJiYgbmJfdGVtcG9yYXJpZXM9PU4gKTsgXAorICB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcHJvZHVjdF9ub3RlbXBvcmFyeShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiBUaGlzIHRlc3QgY2hlY2tzIHRoZSBudW1iZXIgb2YgdGVtcG9yYXJpZXMgY3JlYXRlZAorICAgKiBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgYSBjb21wbGV4IGV4cHJlc3Npb24gKi8KKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBEeW5hbWljPiBSb3dWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IENvbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgQ29sTWFqb3I+IENvbE1ham9yTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4gUm93TWFqb3JNYXRyaXhUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIENvbE1ham9yTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgICAgICAgICAgbTMocm93cywgY29scyk7CisgIFJvd1ZlY3RvclR5cGUgcnYxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCBydnJlcyhyb3dzKTsKKyAgQ29sVmVjdG9yVHlwZSBjdjEgPSBDb2xWZWN0b3JUeXBlOjpSYW5kb20oY29scyksIGN2cmVzKGNvbHMpOworICBSb3dNYWpvck1hdHJpeFR5cGUgcm0zKHJvd3MsIGNvbHMpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgIHMzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgSW5kZXggYzAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig0LGNvbHMtOCksCisgICAgICAgIGMxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oOCxjb2xzLWMwKSwKKyAgICAgICAgcjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig0LGNvbHMtOCksCisgICAgICAgIHIxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oOCxyb3dzLXIwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMgPSAobTEgKiBtMi5hZGpvaW50KCkpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IG0xICogbTIuYWRqb2ludCgpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpID0gczEgKiAobTEgKiBtMi50cmFuc3Bvc2UoKSksIDApOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBzMSAqIG0xICogczIgKiBtMi5hZGpvaW50KCksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpID0gczEgKiBtMSAqIHMyICogKG0xKnMzK20yKnMyKS5hZGpvaW50KCksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpID0gKHMxICogbTEpLmFkam9pbnQoKSAqIHMyICogbTIsIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpICs9IHMxICogKC1tMSpzMykuYWRqb2ludCgpICogKHMyICogbTIgKiBzMyksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpIC09IHMxICogKG0xLnRyYW5zcG9zZSgpICogbTIpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCgoIG0zLmJsb2NrKHIwLHIwLHIxLHIxKS5ub2FsaWFzKCkgKz0gLW0xLmJsb2NrKHIwLGMwLHIxLGMxKSAqIChzMiptMi5ibG9jayhyMCxjMCxyMSxjMSkpLmFkam9pbnQoKSApLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoKCBtMy5ibG9jayhyMCxyMCxyMSxyMSkubm9hbGlhcygpIC09IHMxICogbTEuYmxvY2socjAsYzAscjEsYzEpICogbTIuYmxvY2soYzAscjAsYzEscjEpICksIDApOworCisgIC8vIE5PVEUgdGhpcyBpcyBiZWNhdXNlIHRoZSBCbG9jayBleHByZXNzaW9uIGlzIG5vdCBoYW5kbGVkIHlldCBieSBvdXIgZXhwcmVzc2lvbiBhbmFseXNlcgorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCgoIG0zLmJsb2NrKHIwLHIwLHIxLHIxKS5ub2FsaWFzKCkgPSBzMSAqIG0xLmJsb2NrKHIwLGMwLHIxLGMxKSAqIChzMSptMikuYmxvY2soYzAscjAsYzEscjEpICksIDEpOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgLT0gKHMxICogbTEpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICogbTIsIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggcm0zLm5vYWxpYXMoKSA9IChzMSAqIG0xLmFkam9pbnQoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiAobTIrbTIpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIHJtMy5ub2FsaWFzKCkgPSAoczEgKiBtMS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSAqIG0yLmFkam9pbnQoKSwgMCk7CisKKyAgLy8gTk9URSB0aGlzIGlzIGJlY2F1c2UgdGhlIGJsYXNfdHJhaXRzIHJlcXVpcmUgaW5uZXJzdHJpZGU9PTEgdG8gYXZvaWQgYSB0ZW1wb3JhcnksIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbSB0byBiZSBhY3R1YWxseSBuZWVkZWQgZm9yIHRoZSB0cmlhbmd1bGFyIHByb2R1Y3RzCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBybTMuY29sKGMwKS5ub2FsaWFzKCkgPSAoczEgKiBtMS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSAqIChzMiptMi5yb3coYzApKS5hZGpvaW50KCksIDEpOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UobTMpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UobTMudHJhbnNwb3NlKCkpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpIC09IChzMSAqIG0xKS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKC1tMipzMykuYWRqb2ludCgpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IHMyICogbTIuYWRqb2ludCgpICogKHMxICogbTEuYWRqb2ludCgpKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggcm0zLm5vYWxpYXMoKSA9IChzMSAqIG0xLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogbTIuYWRqb2ludCgpLCAwKTsKKworICAvLyBOT1RFIHRoaXMgaXMgYmVjYXVzZSB0aGUgYmxhc190cmFpdHMgcmVxdWlyZSBpbm5lcnN0cmlkZT09MSB0byBhdm9pZCBhIHRlbXBvcmFyeSwgYnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIGJlIGFjdHVhbGx5IG5lZWRlZCBmb3IgdGhlIHRyaWFuZ3VsYXIgcHJvZHVjdHMKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLmNvbChjMCkubm9hbGlhcygpID0gKHMxICogbTEpLmFkam9pbnQoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoLW0yLnJvdyhjMCkqczMpLmFkam9pbnQoKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5jb2woYzApLm5vYWxpYXMoKSAtPSAoczEgKiBtMSkuYWRqb2ludCgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqICgtbTIucm93KGMwKSpzMykuYWRqb2ludCgpLCAxKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMuYmxvY2socjAsYzAscjEsYzEpLm5vYWxpYXMoKSArPSBtMS5ibG9jayhyMCxyMCxyMSxyMSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKHMxKm0yLmJsb2NrKHIwLGMwLHIxLGMxKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMuYmxvY2socjAsYzAscjEsYzEpLm5vYWxpYXMoKSA9IG0xLmJsb2NrKHIwLHIwLHIxLHIxKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiBtMi5ibG9jayhyMCxjMCxyMSxjMSksIDApOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMi5hZGpvaW50KCkpLCAwKTsKKworICAvLyBIZXJlIHdlIHdpbGwgZ2V0IDEgdGVtcG9yYXJ5IGZvciBlYWNoIHJlc2l6ZSBvcGVyYXRpb24gb2YgdGhlIGxocyBvcGVyYXRvcjsgcmVzaXplKHIxLGMxKSB3b3VsZCBsZWFkIHRvIHplcm8gdGVtcG9yYXJpZXMKKyAgbTMucmVzaXplKDEsMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMS5ibG9jayhyMCxyMCxyMSxyMSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogbTIuYmxvY2socjAsYzAscjEsYzEpLCAxKTsKKyAgbTMucmVzaXplKDEsMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMS5ibG9jayhyMCxyMCxyMSxyMSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpICAqIG0yLmJsb2NrKHIwLGMwLHIxLGMxKSwgMSk7CisKKyAgLy8gWmVybyB0ZW1wb3JhcmllcyBmb3IgbGF6eSBwcm9kdWN0cyAuLi4KKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIFNjYWxhciB0bXAgPSAwOyB0bXAgKz0gU2NhbGFyKFJlYWxTY2FsYXIoMSkpIC8gIChtMy50cmFuc3Bvc2UoKS5sYXp5UHJvZHVjdChtMykpLmRpYWdvbmFsKCkuc3VtKCksIDAgKTsKKworICAvLyAuLi4gYW5kIGV2ZW4gbm8gdGVtcG9yYXJ5IGZvciBldmVuIGRlZXBseSAoPj0yKSBuZXN0ZWQgcHJvZHVjdHMKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIFNjYWxhciB0bXAgPSAwOyB0bXAgKz0gU2NhbGFyKFJlYWxTY2FsYXIoMSkpIC8gIChtMy50cmFuc3Bvc2UoKSAqIG0zKS5kaWFnb25hbCgpLnN1bSgpLCAwICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBTY2FsYXIgdG1wID0gMDsgdG1wICs9IFNjYWxhcihSZWFsU2NhbGFyKDEpKSAvICAobTMudHJhbnNwb3NlKCkgKiBtMykuZGlhZ29uYWwoKS5hcnJheSgpLmFicygpLnN1bSgpLCAwICk7CisKKyAgLy8gWmVybyB0ZW1wb3JhcmllcyBmb3IgLi4uIENvZWZmQmFzZWRQcm9kdWN0TW9kZQorICAvLyAtIGRvZXMgbm90IHdvcmsgd2l0aCBHQ0MgYmVjYXVzZSBvZiB0aGUgPC4uPiwgd2UnbGQgbmVlZCB2YXJpYWRpYyBtYWNyb3MgLi4uCisgIC8vVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLmNvbCgwKS5oZWFkPDU+KCkgKiBtMy5jb2woMCkudHJhbnNwb3NlKCkgKyBtMy5jb2woMCkuaGVhZDw1PigpICogbTMuY29sKDApLnRyYW5zcG9zZSgpLCAwICk7CisKKyAgLy8gQ2hlY2sgbWF0cml4ICogdmVjdG9ycworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY3ZyZXMubm9hbGlhcygpID0gbTEgKiBjdjEsIDAgKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGN2cmVzLm5vYWxpYXMoKSAtPSBtMSAqIGN2MSwgMCApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY3ZyZXMubm9hbGlhcygpIC09IG0xICogbTIuY29sKDApLCAwICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjdnJlcy5ub2FsaWFzKCkgLT0gbTEgKiBydjEuYWRqb2ludCgpLCAwICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjdnJlcy5ub2FsaWFzKCkgLT0gbTEgKiBtMi5yb3coMCkudHJhbnNwb3NlKCksIDAgKTsKK30KKwordm9pZCB0ZXN0X3Byb2R1Y3Rfbm90ZW1wb3JhcnkoKQoreworICBpbnQgczsKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDE2LEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIENBTExfU1VCVEVTVF8xKCBwcm9kdWN0X25vdGVtcG9yYXJ5KE1hdHJpeFhmKHMsIHMpKSApOworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTYsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHByb2R1Y3Rfbm90ZW1wb3JhcnkoTWF0cml4WGQocywgcykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxNixFSUdFTl9URVNUX01BWF9TSVpFLzIpOworICAgIENBTExfU1VCVEVTVF8zKCBwcm9kdWN0X25vdGVtcG9yYXJ5KE1hdHJpeFhjZihzLHMpKSApOworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTYsRUlHRU5fVEVTVF9NQVhfU0laRS8yKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggcHJvZHVjdF9ub3RlbXBvcmFyeShNYXRyaXhYY2QocyxzKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X3NlbGZhZGpvaW50LmNwcCBiL3Rlc3QvcHJvZHVjdF9zZWxmYWRqb2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2OTNiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHJvZHVjdF9zZWxmYWRqb2ludC5jcHAKQEAgLTAsMCArMSw4MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcHJvZHVjdF9zZWxmYWRqb2ludChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsKKworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBEeW5hbWljLCBSb3dNYWpvcj4gUmhzTWF0cml4VHlwZTsKKworICBJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHYyID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgIHYzKHJvd3MpOworICBSb3dWZWN0b3JUeXBlIHIxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAorICAgICAgICAgICAgICAgIHIyID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICBSaHNNYXRyaXhUeXBlIG00ID0gUmhzTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsMTApOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgIHMzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgbTEgPSAobTEuYWRqb2ludCgpICsgbTEpLmV2YWwoKTsKKworICAvLyByYW5rMiB1cGRhdGUKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUodjEsdjIpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCAobTEgKyB2MSAqIHYyLmFkam9pbnQoKSsgdjIgKiB2MS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSk7CisKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUoLXYxLHMyKnYyLHMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgKG0xICsgKHMzKigtdjEpKihzMip2MikuYWRqb2ludCgpK2ludGVybmFsOjpjb25qKHMzKSooczIqdjIpKigtdjEpLmFkam9pbnQoKSkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSk7CisKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUoLXMyKnIxLmFkam9pbnQoKSxyMi5hZGpvaW50KCkqczMsczEpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCAobTEgKyBzMSooLXMyKnIxLmFkam9pbnQoKSkqKHIyLmFkam9pbnQoKSpzMykuYWRqb2ludCgpICsgaW50ZXJuYWw6OmNvbmooczEpKihyMi5hZGpvaW50KCkqczMpICogKC1zMipyMS5hZGpvaW50KCkpLmFkam9pbnQoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKKworICBpZiAocm93cz4xKQorICB7CisgICAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgICBtMi5ibG9jaygxLDEscm93cy0xLGNvbHMtMSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUodjEudGFpbChyb3dzLTEpLHYyLmhlYWQoY29scy0xKSk7CisgICAgbTMgPSBtMTsKKyAgICBtMy5ibG9jaygxLDEscm93cy0xLGNvbHMtMSkgKz0gdjEudGFpbChyb3dzLTEpICogdjIuaGVhZChjb2xzLTEpLmFkam9pbnQoKSsgdjIuaGVhZChjb2xzLTEpICogdjEudGFpbChyb3dzLTEpLmFkam9pbnQoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9wcm9kdWN0X3NlbGZhZGpvaW50KCkKK3sKKyAgaW50IHM7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdCA7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKCBwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcHJvZHVjdF9zZWxmYWRqb2ludChNYXRyaXg8ZmxvYXQsIDIsIDI+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHByb2R1Y3Rfc2VsZmFkam9pbnQoTWF0cml4M2QoKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggcHJvZHVjdF9zZWxmYWRqb2ludChNYXRyaXhYY2YocywgcykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7CisgICAgQ0FMTF9TVUJURVNUXzUoIHByb2R1Y3Rfc2VsZmFkam9pbnQoTWF0cml4WGNkKHMscykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIENBTExfU1VCVEVTVF82KCBwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeFhkKHMscykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIENBTExfU1VCVEVTVF83KCBwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KHMscykpICk7CisgIH0KKyAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHMpCit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3Rfc21hbGwuY3BwIGIvdGVzdC9wcm9kdWN0X3NtYWxsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0X3NtYWxsLmNwcApAQCAtMCwwICsxLDUwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2RlZmluZSBFSUdFTl9OT19TVEFUSUNfQVNTRVJUCisjaW5jbHVkZSAicHJvZHVjdC5oIgorCisvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA0NDcKK3ZvaWQgcHJvZHVjdDF4MSgpCit7CisgIE1hdHJpeDxmbG9hdCwxLDM+IG1hdEFzdGF0aWM7CisgIE1hdHJpeDxmbG9hdCwzLDE+IG1hdEJzdGF0aWM7CisgIG1hdEFzdGF0aWMuc2V0UmFuZG9tKCk7CisgIG1hdEJzdGF0aWMuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9JU19BUFBST1goIChtYXRBc3RhdGljICogbWF0QnN0YXRpYykuY29lZmYoMCwwKSwgCisgICAgICAgICAgICAgICAgICAgIG1hdEFzdGF0aWMuY3dpc2VQcm9kdWN0KG1hdEJzdGF0aWMudHJhbnNwb3NlKCkpLnN1bSgpICk7CisKKyAgTWF0cml4WGYgbWF0QWR5bmFtaWMoMSwzKTsKKyAgTWF0cml4WGYgbWF0QmR5bmFtaWMoMywxKTsKKyAgbWF0QWR5bmFtaWMuc2V0UmFuZG9tKCk7CisgIG1hdEJkeW5hbWljLnNldFJhbmRvbSgpOworICBWRVJJRllfSVNfQVBQUk9YKCAobWF0QWR5bmFtaWMgKiBtYXRCZHluYW1pYykuY29lZmYoMCwwKSwgCisgICAgICAgICAgICAgICAgICAgIG1hdEFkeW5hbWljLmN3aXNlUHJvZHVjdChtYXRCZHluYW1pYy50cmFuc3Bvc2UoKSkuc3VtKCkgKTsKK30KKworCit2b2lkIHRlc3RfcHJvZHVjdF9zbWFsbCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHByb2R1Y3QoTWF0cml4PGZsb2F0LCAzLCAyPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBwcm9kdWN0KE1hdHJpeDxpbnQsIDMsIDU+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHByb2R1Y3QoTWF0cml4M2QoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggcHJvZHVjdChNYXRyaXg0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF81KCBwcm9kdWN0KE1hdHJpeDRmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIHByb2R1Y3QxeDEoKSApOworICB9CisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfNgorICB7CisgICAgLy8gdGVzdCBjb21waWxhdGlvbiBvZiAob3V0ZXJfcHJvZHVjdCkgKiB2ZWN0b3IKKyAgICBWZWN0b3IzZiB2ID0gVmVjdG9yM2Y6OlJhbmRvbSgpOworICAgIFZFUklGWV9JU19BUFBST1goICh2ICogdi50cmFuc3Bvc2UoKSkgKiB2LCAodiAqIHYudHJhbnNwb3NlKCkpLmV2YWwoKSAqIHYpOworICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcHJvZHVjdF9zeW1tLmNwcCBiL3Rlc3QvcHJvZHVjdF9zeW1tLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjdhMGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0X3N5bW0uY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBTaXplLCBpbnQgT3RoZXJTaXplPiB2b2lkIHN5bW0oaW50IHNpemUgPSBTaXplLCBpbnQgb3RoZXJzaXplID0gT3RoZXJTaXplKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplLCBTaXplPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFNpemUsIE90aGVyU2l6ZT4gUmhzMTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBPdGhlclNpemUsIFNpemU+IFJoczI7CisgIGVudW0geyBvcmRlciA9IE90aGVyU2l6ZT09MSA/IDAgOiBSb3dNYWpvciB9OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFNpemUsIE90aGVyU2l6ZSxvcmRlcj4gUmhzMzsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICBJbmRleCByb3dzID0gc2l6ZTsKKyAgSW5kZXggY29scyA9IHNpemU7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTM7CisKKyAgbTEgPSAobTErbTEuYWRqb2ludCgpKS5ldmFsKCk7CisKKyAgUmhzMSByaHMxID0gUmhzMTo6UmFuZG9tKGNvbHMsIG90aGVyc2l6ZSksIHJoczEyKGNvbHMsIG90aGVyc2l6ZSksIHJoczEzKGNvbHMsIG90aGVyc2l6ZSk7CisgIFJoczIgcmhzMiA9IFJoczI6OlJhbmRvbShvdGhlcnNpemUsIHJvd3MpLCByaHMyMihvdGhlcnNpemUsIHJvd3MpLCByaHMyMyhvdGhlcnNpemUsIHJvd3MpOworICBSaHMzIHJoczMgPSBSaHMzOjpSYW5kb20oY29scywgb3RoZXJzaXplKSwgcmhzMzIoY29scywgb3RoZXJzaXplKSwgcmhzMzMoY29scywgb3RoZXJzaXplKTsKKworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgbTMgPSBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgIFZFUklGWV9JU19FUVVBTChtMSwgbTMpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoczIqcmhzMSksCisgICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEqbTEpICogKHMyKnJoczEpKTsKKworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOyByaHMxMi5zZXRSYW5kb20oKTsgcmhzMTMgPSByaHMxMjsKKyAgbTMgPSBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CisgIFZFUklGWV9JU19FUVVBTChtMSwgbTMpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyICs9IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKHMyKnJoczEpLAorICAgICAgICAgICAgICAgICAgIHJoczEzICs9IChzMSptMSkgKiAoczIqcmhzMSkpOworCisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgIFZFUklGWV9JU19BUFBST1gocmhzMTIgPSAoczEqbTIpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzMipyaHMyLmFkam9pbnQoKSksCisgICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEqbTEpICogKHMyKnJoczIuYWRqb2ludCgpKSk7CisKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKHMyKnJoczIuYWRqb2ludCgpKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMSkgKiAoczIqcmhzMi5hZGpvaW50KCkpKTsKKworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczIuYWRqb2ludCgpKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMS5hZGpvaW50KCkpICogKHMyKnJoczIuYWRqb2ludCgpKSk7CisKKyAgLy8gdGVzdCByb3cgbWFqb3IgPSA8Li4uPgorICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOyByaHMxMi5zZXRSYW5kb20oKTsgcmhzMTMgPSByaHMxMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiAtPSAoczEqbTIpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzMipyaHMzKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyAtPSAoczEqbTEpICogKHMyICogcmhzMykpOworCisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWV9JU19BUFBST1gocmhzMTIgPSAoczEqbTIuYWRqb2ludCgpKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoczIqcmhzMykuY29uanVnYXRlKCksCisgICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEqbTEuYWRqb2ludCgpKSAqIChzMipyaHMzKS5jb25qdWdhdGUoKSk7CisKKworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOyByaHMxMyA9IHJoczEyOworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyLm5vYWxpYXMoKSArPSBzMSAqICgobTIuYWRqb2ludCgpKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoczIqcmhzMykuY29uanVnYXRlKCkpLAorICAgICAgICAgICAgICAgICAgIHJoczEzICs9IChzMSptMS5hZGpvaW50KCkpICogKHMyKnJoczMpLmNvbmp1Z2F0ZSgpKTsKKworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczIyID0gKHJoczIpICogKG0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCksIHJoczIzID0gKHJoczIpICogKG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gocmhzMjIgPSAoczIqcmhzMikgKiAoczEqbTIpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwgcmhzMjMgPSAoczIqcmhzMikgKiAoczEqbTEpKTsKKworfQorCit2b2lkIHRlc3RfcHJvZHVjdF9zeW1tKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQorICB7CisgICAgQ0FMTF9TVUJURVNUXzEoKCBzeW1tPGZsb2F0LER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpICkpOworICAgIENBTExfU1VCVEVTVF8yKCggc3ltbTxkb3VibGUsRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKCBzeW1tPHN0ZDo6Y29tcGxleDxmbG9hdD4sRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpLGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpICkpOworICAgIENBTExfU1VCVEVTVF80KCggc3ltbTxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkgKSk7CisKKyAgICBDQUxMX1NVQlRFU1RfNSgoIHN5bW08ZmxvYXQsRHluYW1pYywxPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKCBzeW1tPGRvdWJsZSxEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNygoIHN5bW08c3RkOjpjb21wbGV4PGZsb2F0PixEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfOCgoIHN5bW08c3RkOjpjb21wbGV4PGRvdWJsZT4sRHluYW1pYywxPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcHJvZHVjdF9zeXJrLmNwcCBiL3Rlc3QvcHJvZHVjdF9zeXJrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU1YzIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0X3N5cmsuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHN5cmsoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIER5bmFtaWM+IFJoczE7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFJoczI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIER5bmFtaWMsUm93TWFqb3I+IFJoczM7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKworICBSaHMxIHJoczEgPSBSaHMxOjpSYW5kb20oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzIwKSwgY29scyk7CisgIFJoczIgcmhzMiA9IFJoczI6OlJhbmRvbShyb3dzLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwzMjApKTsKKyAgUmhzMyByaHMzID0gUmhzMzo6UmFuZG9tKGludGVybmFsOjpyYW5kb208aW50PigxLDMyMCksIHJvd3MpOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAKKyAgSW5kZXggYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKKworICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKHJoczIsczEpLl9leHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiByaHMyICogcmhzMi5hZGpvaW50KCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpKTsKKworICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUocmhzMixzMSkuX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoczEgKiByaHMyICogcmhzMi5hZGpvaW50KCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCkpOworCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShyaHMxLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoczEgKiByaHMxLmFkam9pbnQoKSAqIHJoczEpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpOworCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShyaHMxLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoczEgKiByaHMxLmFkam9pbnQoKSAqIHJoczEpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCkpOworCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShyaHMzLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoczEgKiByaHMzLmFkam9pbnQoKSAqIHJoczMpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpOworCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShyaHMzLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoczEgKiByaHMzLmFkam9pbnQoKSAqIHJoczMpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCkpOworICAgICAgICAgICAgICAgICAgIAorICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xLmNvbChjKSxzMSkuX2V4cHJlc3Npb24oKSksCisgICAgICAgICAgICAgICAgICAgKChzMSAqIG0xLmNvbChjKSAqIG0xLmNvbChjKS5hZGpvaW50KCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpKTsKKyAgICAgICAgICAgICAgICAgICAKKyAgbTIuc2V0WmVybygpOworICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShtMS5jb2woYyksczEpLl9leHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5jb2woYykgKiBtMS5jb2woYykuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgIAorICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xLmNvbChjKS5jb25qdWdhdGUoKSxzMSkuX2V4cHJlc3Npb24oKSksCisgICAgICAgICAgICAgICAgICAgKChzMSAqIG0xLmNvbChjKS5jb25qdWdhdGUoKSAqIG0xLmNvbChjKS5jb25qdWdhdGUoKS5hZGpvaW50KCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpKTsKKyAgICAgICAgICAgICAgICAgICAKKyAgbTIuc2V0WmVybygpOworICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShtMS5jb2woYykuY29uanVnYXRlKCksczEpLl9leHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5jb2woYykuY29uanVnYXRlKCkgKiBtMS5jb2woYykuY29uanVnYXRlKCkuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgIAorICBtMi5zZXRaZXJvKCk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xLnJvdyhjKSxzMSkuX2V4cHJlc3Npb24oKSksCisgICAgICAgICAgICAgICAgICAgKChzMSAqIG0xLnJvdyhjKS50cmFuc3Bvc2UoKSAqIG0xLnJvdyhjKS50cmFuc3Bvc2UoKS5hZGpvaW50KCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpKTsKKyAgCisgIG0yLnNldFplcm8oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUobTEucm93KGMpLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSksCisgICAgICAgICAgICAgICAgICAgKChzMSAqIG0xLnJvdyhjKS5hZGpvaW50KCkgKiBtMS5yb3coYykuYWRqb2ludCgpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworfQorCit2b2lkIHRlc3RfcHJvZHVjdF9zeXJrKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQorICB7CisgICAgaW50IHM7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIENBTExfU1VCVEVTVF8xKCBzeXJrKE1hdHJpeFhmKHMsIHMpKSApOworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggc3lyayhNYXRyaXhYZChzLCBzKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggc3lyayhNYXRyaXhYY2YocywgcykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7CisgICAgQ0FMTF9TVUJURVNUXzQoIHN5cmsoTWF0cml4WGNkKHMsIHMpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfdHJtbS5jcHAgYi90ZXN0L3Byb2R1Y3RfdHJtbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyNDRjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHJvZHVjdF90cm1tLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGUsIGludCBUcmlPcmRlciwgaW50IE90aGVyT3JkZXIsIGludCBSZXNPcmRlciwgaW50IE90aGVyQ29scz4KK3ZvaWQgdHJtbShpbnQgcm93cz1pbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwKKyAgICAgICAgICBpbnQgY29scz1pbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwKKyAgICAgICAgICBpbnQgb3RoZXJDb2xzID0gT3RoZXJDb2xzPT1EeW5hbWljP2ludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOk90aGVyQ29scykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsVHJpT3JkZXI+IFRyaU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsT3RoZXJDb2xzLE90aGVyQ29scz09MT9Db2xNYWpvcjpPdGhlck9yZGVyPiBPblRoZVJpZ2h0OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsT3RoZXJDb2xzLER5bmFtaWMsT3RoZXJDb2xzPT0xP1Jvd01ham9yOk90aGVyT3JkZXI+IE9uVGhlTGVmdDsKKyAgCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLE90aGVyQ29scyxPdGhlckNvbHM9PTE/Q29sTWFqb3I6UmVzT3JkZXI+IFJlc1hTOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsT3RoZXJDb2xzLER5bmFtaWMsT3RoZXJDb2xzPT0xP1Jvd01ham9yOlJlc09yZGVyPiBSZXNTWDsKKworICBUcmlNYXRyaXggIG1hdChyb3dzLGNvbHMpLCB0cmkocm93cyxjb2xzKSwgdHJpVHIoY29scyxyb3dzKTsKKyAgCisgIE9uVGhlUmlnaHQgIGdlX3JpZ2h0KGNvbHMsb3RoZXJDb2xzKTsKKyAgT25UaGVMZWZ0ICAgZ2VfbGVmdChvdGhlckNvbHMscm93cyk7CisgIFJlc1NYICAgICAgIGdlX3N4LCBnZV9zeF9zYXZlOworICBSZXNYUyAgICAgICBnZV94cywgZ2VfeHNfc2F2ZTsKKworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgbWF0LnNldFJhbmRvbSgpOworICB0cmkgPSBtYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKTsKKyAgdHJpVHIgPSBtYXQudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKTsKKyAgZ2VfcmlnaHQuc2V0UmFuZG9tKCk7CisgIGdlX2xlZnQuc2V0UmFuZG9tKCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCggZ2VfeHMgPSBtYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSAqIGdlX3JpZ2h0LCB0cmkgKiBnZV9yaWdodCk7CisgIFZFUklGWV9JU19BUFBST1goIGdlX3N4ID0gZ2VfbGVmdCAqIG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLCBnZV9sZWZ0ICogdHJpKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goIGdlX3hzLm5vYWxpYXMoKSA9IG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogZ2VfcmlnaHQsIHRyaSAqIGdlX3JpZ2h0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggZ2Vfc3gubm9hbGlhcygpID0gZ2VfbGVmdCAqIG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLCBnZV9sZWZ0ICogdHJpKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goIGdlX3hzLm5vYWxpYXMoKSA9IChzMSptYXQuYWRqb2ludCgpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogKHMyKmdlX2xlZnQudHJhbnNwb3NlKCkpLCBzMSp0cmlUci5jb25qdWdhdGUoKSAqIChzMipnZV9sZWZ0LnRyYW5zcG9zZSgpKSk7CisgIFZFUklGWV9JU19BUFBST1goIGdlX3N4Lm5vYWxpYXMoKSA9IGdlX3JpZ2h0LnRyYW5zcG9zZSgpICogbWF0LmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLCBnZV9yaWdodC50cmFuc3Bvc2UoKSAqIHRyaVRyLmNvbmp1Z2F0ZSgpKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goIGdlX3hzLm5vYWxpYXMoKSA9IChzMSptYXQuYWRqb2ludCgpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogKHMyKmdlX2xlZnQuYWRqb2ludCgpKSwgczEqdHJpVHIuY29uanVnYXRlKCkgKiAoczIqZ2VfbGVmdC5hZGpvaW50KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggZ2Vfc3gubm9hbGlhcygpID0gZ2VfcmlnaHQuYWRqb2ludCgpICogbWF0LmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLCBnZV9yaWdodC5hZGpvaW50KCkgKiB0cmlUci5jb25qdWdhdGUoKSk7CisgIAorICBnZV94c19zYXZlID0gZ2VfeHM7CisgIFZFUklGWV9JU19BUFBST1goIChnZV94c19zYXZlICsgczEqdHJpVHIuY29uanVnYXRlKCkgKiAoczIqZ2VfbGVmdC5hZGpvaW50KCkpKS5ldmFsKCksIGdlX3hzLm5vYWxpYXMoKSArPSAoczEqbWF0LmFkam9pbnQoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSAqIChzMipnZV9sZWZ0LmFkam9pbnQoKSkgKTsKKyAgZ2Vfc3hfc2F2ZSA9IGdlX3N4OworICBWRVJJRllfSVNfQVBQUk9YKCBnZV9zeF9zYXZlIC0gKGdlX3JpZ2h0LmFkam9pbnQoKSAqICgtczEgKiB0cmlUcikuY29uanVnYXRlKCkpLmV2YWwoKSwgZ2Vfc3gubm9hbGlhcygpIC09IChnZV9yaWdodC5hZGpvaW50KCkgKiAoLXMxICogbWF0KS5hZGpvaW50KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSkuZXZhbCgpKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goIGdlX3hzID0gKHMxKm1hdCkuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiBnZV9sZWZ0LmFkam9pbnQoKSwgaW50ZXJuYWw6OmNvbmooczEpICogdHJpVHIuY29uanVnYXRlKCkgKiBnZV9sZWZ0LmFkam9pbnQoKSk7CisgIAorICAvLyBUT0RPIGNoZWNrIHdpdGggc3ViLW1hdHJpeCBleHByZXNzaW9ucyA/Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGUsIGludCBUcmlPcmRlcj4KK3ZvaWQgdHJtdihpbnQgcm93cz1pbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50IGNvbHM9aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpCit7CisgIHRybW08U2NhbGFyLE1vZGUsVHJpT3JkZXIsQ29sTWFqb3IsQ29sTWFqb3IsMT4ocm93cyxjb2xzLDEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlLCBpbnQgVHJpT3JkZXIsIGludCBPdGhlck9yZGVyLCBpbnQgUmVzT3JkZXI+Cit2b2lkIHRybW0oaW50IHJvd3M9aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludCBjb2xzPWludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnQgb3RoZXJDb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpCit7CisgIHRybW08U2NhbGFyLE1vZGUsVHJpT3JkZXIsT3RoZXJPcmRlcixSZXNPcmRlcixEeW5hbWljPihyb3dzLGNvbHMsb3RoZXJDb2xzKTsKK30KKworI2RlZmluZSBDQUxMX0FMTF9PUkRFUlMoTkIsU0NBTEFSLE1PREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAorICBcCisgIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfMSxOQikoKHRybXY8U0NBTEFSLCBNT0RFLCBDb2xNYWpvcj4oKSkpOyAgICAgICAgICAgICAgICAgICBcCisgIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfMSxOQikoKHRybXY8U0NBTEFSLCBNT0RFLCBSb3dNYWpvcj4oKSkpOworCisgIAorI2RlZmluZSBDQUxMX0FMTChOQixTQ0FMQVIpICAgICAgICAgICAgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMSxOQiksU0NBTEFSLFVwcGVyKSAgICAgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMixOQiksU0NBTEFSLFVuaXRVcHBlcikgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMyxOQiksU0NBTEFSLFN0cmljdGx5VXBwZXIpICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMSxOQiksU0NBTEFSLExvd2VyKSAgICAgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMixOQiksU0NBTEFSLFVuaXRMb3dlcikgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMyxOQiksU0NBTEFSLFN0cmljdGx5TG93ZXIpCisgIAorCit2b2lkIHRlc3RfcHJvZHVjdF90cm1tKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQorICB7CisgICAgQ0FMTF9BTEwoMSxmbG9hdCk7ICAgICAgICAgICAgICAgIC8vICBFSUdFTl9TVUZGSVhFUzsxMTsxMTE7MjE7MTIxOzMxOzEzMQorICAgIENBTExfQUxMKDIsZG91YmxlKTsgICAgICAgICAgICAgICAvLyAgRUlHRU5fU1VGRklYRVM7MTI7MTEyOzIyOzEyMjszMjsxMzIKKyAgICBDQUxMX0FMTCgzLHN0ZDo6Y29tcGxleDxmbG9hdD4pOyAgLy8gIEVJR0VOX1NVRkZJWEVTOzEzOzExMzsyMzsxMjM7MzM7MTMzCisgICAgQ0FMTF9BTEwoNCxzdGQ6OmNvbXBsZXg8ZG91YmxlPik7IC8vICBFSUdFTl9TVUZGSVhFUzsxNDsxMTQ7MjQ7MTI0OzM0OzEzNAorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfdHJtdi5jcHAgYi90ZXN0L3Byb2R1Y3RfdHJtdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1MDE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHJvZHVjdF90cm12LmNwcApAQCAtMCwwICsxLDg5IEBACisvLyBUaGlzIGZpbGUgaXMgdHJpYW5ndWxhclZpZXcgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgdHJtdihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKKworICBSZWFsU2NhbGFyIGxhcmdlckVwcyA9IDEwKnRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCk7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKyAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKworICAvLyBjaGVjayB3aXRoIGEgY29sdW1uLW1ham9yIG1hdHJpeAorICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKTsKKyAgVkVSSUZZKChtMyAqIHYxKS5pc0FwcHJveChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVwcGVyPigpOworICBWRVJJRlkoKG0zICogdjEpLmlzQXBwcm94KG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKSAqIHYxLCBsYXJnZXJFcHMpKTsKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VW5pdExvd2VyPigpOworICBWRVJJRlkoKG0zICogdjEpLmlzQXBwcm94KG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVbml0TG93ZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVuaXRVcHBlcj4oKTsKKyAgVkVSSUZZKChtMyAqIHYxKS5pc0FwcHJveChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VW5pdFVwcGVyPigpICogdjEsIGxhcmdlckVwcykpOworCisgIC8vIGNoZWNrIGNvbmp1Z2F0ZWQgYW5kIHNjYWxhciBtdWx0aXBsZSBleHByZXNzaW9ucyAoY29sLW1ham9yKQorICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKTsKKyAgVkVSSUZZKCgoczEqbTMpLmNvbmp1Z2F0ZSgpICogdjEpLmlzQXBwcm94KChzMSptMSkuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpICogdjEsIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKTsKKyAgVkVSSUZZKChtMy5jb25qdWdhdGUoKSAqIHYxLmNvbmp1Z2F0ZSgpKS5pc0FwcHJveChtMS5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkgKiB2MS5jb25qdWdhdGUoKSwgbGFyZ2VyRXBzKSk7CisKKyAgLy8gY2hlY2sgd2l0aCBhIHJvdy1tYWpvciBtYXRyaXgKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCk7CisgIFZFUklGWSgobTMudHJhbnNwb3NlKCkgKiB2MSkuaXNBcHByb3gobTEudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpICogdjEsIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKTsKKyAgVkVSSUZZKChtMy50cmFuc3Bvc2UoKSAqIHYxKS5pc0FwcHJveChtMS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVuaXRVcHBlcj4oKTsKKyAgVkVSSUZZKChtMy50cmFuc3Bvc2UoKSAqIHYxKS5pc0FwcHJveChtMS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VW5pdExvd2VyPigpICogdjEsIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVbml0TG93ZXI+KCk7CisgIFZFUklGWSgobTMudHJhbnNwb3NlKCkgKiB2MSkuaXNBcHByb3gobTEudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVuaXRVcHBlcj4oKSAqIHYxLCBsYXJnZXJFcHMpKTsKKworICAvLyBjaGVjayBjb25qdWdhdGVkIGFuZCBzY2FsYXIgbXVsdGlwbGUgZXhwcmVzc2lvbnMgKHJvdy1tYWpvcikKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCk7CisgIFZFUklGWSgobTMuYWRqb2ludCgpICogdjEpLmlzQXBwcm94KG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpOworICBWRVJJRlkoKG0zLmFkam9pbnQoKSAqIChzMSp2MS5jb25qdWdhdGUoKSkpLmlzQXBwcm94KG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkgKiAoczEqdjEuY29uanVnYXRlKCkpLCBsYXJnZXJFcHMpKTsKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VW5pdFVwcGVyPigpOworCisgIC8vIGNoZWNrIHRyYW5zcG9zZWQgY2FzZXM6CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpOworICBWRVJJRlkoKHYxLnRyYW5zcG9zZSgpICogbTMpLmlzQXBwcm94KHYxLnRyYW5zcG9zZSgpICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpLCBsYXJnZXJFcHMpKTsKKyAgVkVSSUZZKCh2MS5hZGpvaW50KCkgKiBtMykuaXNBcHByb3godjEuYWRqb2ludCgpICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpLCBsYXJnZXJFcHMpKTsKKyAgVkVSSUZZKCh2MS5hZGpvaW50KCkgKiBtMy5hZGpvaW50KCkpLmlzQXBwcm94KHYxLmFkam9pbnQoKSAqIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKS5hZGpvaW50KCksIGxhcmdlckVwcykpOworCisgIC8vIFRPRE8gY2hlY2sgd2l0aCBzdWItbWF0cmljZXMKK30KKwordm9pZCB0ZXN0X3Byb2R1Y3RfdHJtdigpCit7CisgIGludCBzOworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgOyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggdHJtdihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHRybXYoTWF0cml4PGZsb2F0LCAyLCAyPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCB0cm12KE1hdHJpeDNkKCkpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7CisgICAgQ0FMTF9TVUJURVNUXzQoIHRybXYoTWF0cml4WGNmKHMscykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7CisgICAgQ0FMTF9TVUJURVNUXzUoIHRybXYoTWF0cml4WGNkKHMscykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIENBTExfU1VCVEVTVF82KCB0cm12KE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KHMsIHMpKSApOworICB9CisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShzKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcHJvZHVjdF90cnNvbHZlLmNwcCBiL3Rlc3QvcHJvZHVjdF90cnNvbHZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg5MmIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9wcm9kdWN0X3Ryc29sdmUuY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjZGVmaW5lIFZFUklGWV9UUlNNKFRSSSxYQikgeyBcCisgICAgKFhCKS5zZXRSYW5kb20oKTsgcmVmID0gKFhCKTsgXAorICAgIChUUkkpLnNvbHZlSW5QbGFjZShYQik7IFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKChUUkkpLnRvRGVuc2VNYXRyaXgoKSAqIChYQiksIHJlZik7IFwKKyAgICAoWEIpLnNldFJhbmRvbSgpOyByZWYgPSAoWEIpOyBcCisgICAgKFhCKSA9IChUUkkpLnNvbHZlKFhCKTsgXAorICAgIFZFUklGWV9JU19BUFBST1goKFRSSSkudG9EZW5zZU1hdHJpeCgpICogKFhCKSwgcmVmKTsgXAorICB9CisKKyNkZWZpbmUgVkVSSUZZX1RSU01fT05USEVSSUdIVChUUkksWEIpIHsgXAorICAgIChYQikuc2V0UmFuZG9tKCk7IHJlZiA9IChYQik7IFwKKyAgICAoVFJJKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSBzb2x2ZUluUGxhY2U8T25UaGVSaWdodD4oWEIudHJhbnNwb3NlKCkpOyBcCisgICAgVkVSSUZZX0lTX0FQUFJPWCgoWEIpLnRyYW5zcG9zZSgpICogKFRSSSkudHJhbnNwb3NlKCkudG9EZW5zZU1hdHJpeCgpLCByZWYudHJhbnNwb3NlKCkpOyBcCisgICAgKFhCKS5zZXRSYW5kb20oKTsgcmVmID0gKFhCKTsgXAorICAgIChYQikudHJhbnNwb3NlKCkgPSAoVFJJKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSBzb2x2ZTxPblRoZVJpZ2h0PihYQi50cmFuc3Bvc2UoKSk7IFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKChYQikudHJhbnNwb3NlKCkgKiAoVFJJKS50cmFuc3Bvc2UoKS50b0RlbnNlTWF0cml4KCksIHJlZi50cmFuc3Bvc2UoKSk7IFwKKyAgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IFNpemUsIGludCBDb2xzPiB2b2lkIHRyc29sdmUoaW50IHNpemU9U2l6ZSxpbnQgY29scz1Db2xzKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgTWF0cml4PFNjYWxhcixTaXplLFNpemUsQ29sTWFqb3I+IGNtTGhzKHNpemUsc2l6ZSk7CisgIE1hdHJpeDxTY2FsYXIsU2l6ZSxTaXplLFJvd01ham9yPiBybUxocyhzaXplLHNpemUpOworCisgIGVudW0geyAgY29sbWFqb3IgPSBTaXplPT0xID8gUm93TWFqb3IgOiBDb2xNYWpvciwKKyAgICAgICAgICByb3dtYWpvciA9IENvbHM9PTEgPyBDb2xNYWpvciA6IFJvd01ham9yIH07CisgIE1hdHJpeDxTY2FsYXIsU2l6ZSxDb2xzLGNvbG1ham9yPiBjbVJocyhzaXplLGNvbHMpOworICBNYXRyaXg8U2NhbGFyLFNpemUsQ29scyxyb3dtYWpvcj4gcm1SaHMoc2l6ZSxjb2xzKTsKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsY29sbWFqb3I+IHJlZihzaXplLGNvbHMpOworCisgIGNtTGhzLnNldFJhbmRvbSgpOyBjbUxocyAqPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigwLjEpOyBjbUxocy5kaWFnb25hbCgpLmFycmF5KCkgKz0gc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMSk7CisgIHJtTGhzLnNldFJhbmRvbSgpOyBybUxocyAqPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigwLjEpOyBybUxocy5kaWFnb25hbCgpLmFycmF5KCkgKz0gc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMSk7CisKKyAgVkVSSUZZX1RSU00oY21MaHMuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU00oY21MaHMuYWRqb2ludCgpICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU00oY21MaHMgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU00oY21MaHMgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIHJtUmhzKTsKKyAgVkVSSUZZX1RSU00oY21MaHMuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHJtUmhzKTsKKyAgVkVSSUZZX1RSU00oY21MaHMuYWRqb2ludCgpICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHJtUmhzKTsKKworICBWRVJJRllfVFJTTShjbUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU00oY21MaHMgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpLCBybVJocyk7CisKKyAgVkVSSUZZX1RSU00ocm1MaHMgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU00ocm1MaHMuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpLCBybVJocyk7CisKKworICBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKGNtTGhzLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBjbVJocyk7CisgIFZFUklGWV9UUlNNX09OVEhFUklHSFQoY21MaHMgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU01fT05USEVSSUdIVChjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgcm1SaHMpOworICBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKGNtTGhzLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBybVJocyk7CisKKyAgVkVSSUZZX1RSU01fT05USEVSSUdIVChjbUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU01fT05USEVSSUdIVChjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCksIHJtUmhzKTsKKworICBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKHJtTGhzICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBjbVJocyk7CisgIFZFUklGWV9UUlNNX09OVEhFUklHSFQocm1MaHMuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpLCBybVJocyk7CisKKyAgaW50IGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpOworICBWRVJJRllfVFJTTShybUxocy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgcm1SaHMuY29sKGMpKTsKKyAgVkVSSUZZX1RSU00oY21MaHMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIHJtUmhzLmNvbChjKSk7Cit9CisKK3ZvaWQgdGVzdF9wcm9kdWN0X3Ryc29sdmUoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgOyBpKyspCisgIHsKKyAgICAvLyBtYXRyaWNlcworICAgIENBTExfU1VCVEVTVF8xKCh0cnNvbHZlPGZsb2F0LER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHRyc29sdmU8ZG91YmxlLER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKHRyc29sdmU8c3RkOjpjb21wbGV4PGZsb2F0PixEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgodHJzb2x2ZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpKTsKKworICAgIC8vIHZlY3RvcnMKKyAgICBDQUxMX1NVQlRFU1RfMSgodHJzb2x2ZTxmbG9hdCxEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF81KCh0cnNvbHZlPHN0ZDo6Y29tcGxleDxkb3VibGU+LER5bmFtaWMsMT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKHRyc29sdmU8ZmxvYXQsMSwxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoKHRyc29sdmU8ZmxvYXQsMSwyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgoKHRyc29sdmU8c3RkOjpjb21wbGV4PGZsb2F0Piw0LDE+KCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9xci5jcHAgYi90ZXN0L3FyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2ZiN2FhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9xci5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDxFaWdlbi9RUj4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcihjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IE1hdHJpeFFUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyT2ZBKGEpOworCisgIE1hdHJpeFFUeXBlIHEgPSBxck9mQS5ob3VzZWhvbGRlclEoKTsKKyAgVkVSSUZZX0lTX1VOSVRBUlkocSk7CisKKyAgTWF0cml4VHlwZSByID0gcXJPZkEubWF0cml4UVIoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhLCBxck9mQS5ob3VzZWhvbGRlclEoKSAqIHIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgQ29sczI+IHZvaWQgcXJfZml4ZWRzaXplKCkKK3sKKyAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgTWF0cml4PFNjYWxhcixSb3dzLENvbHM+IG0xID0gTWF0cml4PFNjYWxhcixSb3dzLENvbHM+OjpSYW5kb20oKTsKKyAgSG91c2Vob2xkZXJRUjxNYXRyaXg8U2NhbGFyLFJvd3MsQ29scz4gPiBxcihtMSk7CisKKyAgTWF0cml4PFNjYWxhcixSb3dzLENvbHM+IHIgPSBxci5tYXRyaXhRUigpOworICAvLyBGSVhNRSBuZWVkIGJldHRlciB3YXkgdG8gY29uc3RydWN0IHRyYXBlem9pZAorICBmb3IoaW50IGkgPSAwOyBpIDwgUm93czsgaSsrKSBmb3IoaW50IGogPSAwOyBqIDwgQ29sczsgaisrKSBpZihpPmopIHIoaSxqKSA9IFNjYWxhcigwKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBxci5ob3VzZWhvbGRlclEoKSAqIHIpOworCisgIE1hdHJpeDxTY2FsYXIsQ29scyxDb2xzMj4gbTIgPSBNYXRyaXg8U2NhbGFyLENvbHMsQ29sczI+OjpSYW5kb20oQ29scyxDb2xzMik7CisgIE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzMj4gbTMgPSBtMSptMjsKKyAgbTIgPSBNYXRyaXg8U2NhbGFyLENvbHMsQ29sczI+OjpSYW5kb20oQ29scyxDb2xzMik7CisgIG0yID0gcXIuc29sdmUobTMpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSptMik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfaW52ZXJ0aWJsZSgpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDUwKTsKKworICBNYXRyaXhUeXBlIG0xKHNpemUsIHNpemUpLCBtMihzaXplLCBzaXplKSwgbTMoc2l6ZSwgc2l6ZSk7CisgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkKKyAgeworICAgIC8vIGxldCdzIGJ1aWxkIGEgbWF0cml4IG1vcmUgc3RhYmxlIHRvIGludmVyc2UKKyAgICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKjIpOworICAgIG0xICs9IGEgKiBhLmFkam9pbnQoKTsKKyAgfQorCisgIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXIobTEpOworICBtMyA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICBtMiA9IHFyLnNvbHZlKG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworCisgIC8vIG5vdyBjb25zdHJ1Y3QgYSBtYXRyaXggd2l0aCBwcmVzY3JpYmVkIGRldGVybWluYW50CisgIG0xLnNldFplcm8oKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgbTEoaSxpKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBSZWFsU2NhbGFyIGFic2RldCA9IGludGVybmFsOjphYnMobTEuZGlhZ29uYWwoKS5wcm9kKCkpOworICBtMyA9IHFyLmhvdXNlaG9sZGVyUSgpOyAvLyBnZXQgYSB1bml0YXJ5CisgIG0xID0gbTMgKiBtMSAqIG0zOworICBxci5jb21wdXRlKG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYnNkZXQsIHFyLmFic0RldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKGludGVybmFsOjpsb2coYWJzZGV0KSwgcXIubG9nQWJzRGV0ZXJtaW5hbnQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpCit7CisgIE1hdHJpeFR5cGUgdG1wOworCisgIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXI7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLm1hdHJpeFFSKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLnNvbHZlKHRtcCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmhvdXNlaG9sZGVyUSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5hYnNEZXRlcm1pbmFudCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5sb2dBYnNEZXRlcm1pbmFudCgpKQorfQorCit2b2lkIHRlc3RfcXIoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgQ0FMTF9TVUJURVNUXzEoIHFyKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgIENBTExfU1VCVEVTVF8yKCBxcihNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKTsKKyAgIENBTExfU1VCVEVTVF8zKCggcXJfZml4ZWRzaXplPE1hdHJpeDxmbG9hdCwzLDQ+LCAyID4oKSApKTsKKyAgIENBTExfU1VCVEVTVF80KCggcXJfZml4ZWRzaXplPE1hdHJpeDxkb3VibGUsNiwyPiwgNCA+KCkgKSk7CisgICBDQUxMX1NVQlRFU1RfNSgoIHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZG91YmxlLDIsNT4sIDcgPigpICkpOworICAgQ0FMTF9TVUJURVNUXzExKCBxcihNYXRyaXg8ZmxvYXQsMSwxPigpKSApOworICB9CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSApOworICAgIENBTExfU1VCVEVTVF82KCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIHFyX2ludmVydGlibGU8TWF0cml4WGNmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIHFyX2ludmVydGlibGU8TWF0cml4WGNkPigpICk7CisgIH0KKworICBDQUxMX1NVQlRFU1RfOShxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeDNmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzEwKHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Q+KCkpOworICBDQUxMX1NVQlRFU1RfMShxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzYocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZD4oKSk7CisgIENBTExfU1VCVEVTVF83KHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGNmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzgocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYY2Q+KCkpOworCisgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICBDQUxMX1NVQlRFU1RfMTIoSG91c2Vob2xkZXJRUjxNYXRyaXhYZj4oMTAsIDIwKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3FyX2NvbHBpdm90aW5nLmNwcCBiL3Rlc3QvcXJfY29scGl2b3RpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDgxMjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3FyX2NvbHBpdm90aW5nLmNwcApAQCAtMCwwICsxLDE1MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1FSPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHFyKCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKworICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMixFSUdFTl9URVNUX01BWF9TSVpFKSwgY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDIsRUlHRU5fVEVTVF9NQVhfU0laRSksIGNvbHMyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMixFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgSW5kZXggcmFuayA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIChzdGQ6Om1pbikocm93cywgY29scyktMSk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IE1hdHJpeFFUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICBNYXRyaXhUeXBlIG0xOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLHJvd3MsY29scyxtMSk7CisgIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXIobTEpOworICBWRVJJRlkocmFuayA9PSBxci5yYW5rKCkpOworICBWRVJJRlkoY29scyAtIHFyLnJhbmsoKSA9PSBxci5kaW1lbnNpb25PZktlcm5lbCgpKTsKKyAgVkVSSUZZKCFxci5pc0luamVjdGl2ZSgpKTsKKyAgVkVSSUZZKCFxci5pc0ludmVydGlibGUoKSk7CisgIFZFUklGWSghcXIuaXNTdXJqZWN0aXZlKCkpOworCisgIE1hdHJpeFFUeXBlIHEgPSBxci5ob3VzZWhvbGRlclEoKTsKKyAgVkVSSUZZX0lTX1VOSVRBUlkocSk7CisKKyAgTWF0cml4VHlwZSByID0gcXIubWF0cml4UVIoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgTWF0cml4VHlwZSBjID0gcSAqIHIgKiBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIGMpOworCisgIE1hdHJpeFR5cGUgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIE1hdHJpeFR5cGUgbTMgPSBtMSptMjsKKyAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIG0yID0gcXIuc29sdmUobTMpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSptMik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBDb2xzMj4gdm9pZCBxcl9maXhlZHNpemUoKQoreworICBlbnVtIHsgUm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBDb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBpbnQgcmFuayA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAoc3RkOjptaW4pKGludChSb3dzKSwgaW50KENvbHMpKS0xKTsKKyAgTWF0cml4PFNjYWxhcixSb3dzLENvbHM+IG0xOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLFJvd3MsQ29scyxtMSk7CisgIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PFNjYWxhcixSb3dzLENvbHM+ID4gcXIobTEpOworICBWRVJJRlkocmFuayA9PSBxci5yYW5rKCkpOworICBWRVJJRlkoQ29scyAtIHFyLnJhbmsoKSA9PSBxci5kaW1lbnNpb25PZktlcm5lbCgpKTsKKyAgVkVSSUZZKHFyLmlzSW5qZWN0aXZlKCkgPT0gKHJhbmsgPT0gUm93cykpOworICBWRVJJRlkocXIuaXNTdXJqZWN0aXZlKCkgPT0gKHJhbmsgPT0gQ29scykpOworICBWRVJJRlkocXIuaXNJbnZlcnRpYmxlKCkgPT0gKHFyLmlzSW5qZWN0aXZlKCkgJiYgcXIuaXNTdXJqZWN0aXZlKCkpKTsKKworICBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scz4gciA9IHFyLm1hdHJpeFFSKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzPiBjID0gcXIuaG91c2Vob2xkZXJRKCkgKiByICogcXIuY29sc1Blcm11dGF0aW9uKCkuaW52ZXJzZSgpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBjKTsKKworICBNYXRyaXg8U2NhbGFyLENvbHMsQ29sczI+IG0yID0gTWF0cml4PFNjYWxhcixDb2xzLENvbHMyPjo6UmFuZG9tKENvbHMsQ29sczIpOworICBNYXRyaXg8U2NhbGFyLFJvd3MsQ29sczI+IG0zID0gbTEqbTI7CisgIG0yID0gTWF0cml4PFNjYWxhcixDb2xzLENvbHMyPjo6UmFuZG9tKENvbHMsQ29sczIpOworICBtMiA9IHFyLnNvbHZlKG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHFyX2ludmVydGlibGUoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBpbnQgc2l6ZSA9IGludGVybmFsOjpyYW5kb208aW50PigxMCw1MCk7CisKKyAgTWF0cml4VHlwZSBtMShzaXplLCBzaXplKSwgbTIoc2l6ZSwgc2l6ZSksIG0zKHNpemUsIHNpemUpOworICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworCisgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLGZsb2F0Pjo6dmFsdWUpCisgIHsKKyAgICAvLyBsZXQncyBidWlsZCBhIG1hdHJpeCBtb3JlIHN0YWJsZSB0byBpbnZlcnNlCisgICAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSoyKTsKKyAgICBtMSArPSBhICogYS5hZGpvaW50KCk7CisgIH0KKworICBDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyKG0xKTsKKyAgbTMgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKTsKKyAgbTIgPSBxci5zb2x2ZShtMyk7CisgIC8vVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworCisgIC8vIG5vdyBjb25zdHJ1Y3QgYSBtYXRyaXggd2l0aCBwcmVzY3JpYmVkIGRldGVybWluYW50CisgIG0xLnNldFplcm8oKTsKKyAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgbTEoaSxpKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBSZWFsU2NhbGFyIGFic2RldCA9IGludGVybmFsOjphYnMobTEuZGlhZ29uYWwoKS5wcm9kKCkpOworICBtMyA9IHFyLmhvdXNlaG9sZGVyUSgpOyAvLyBnZXQgYSB1bml0YXJ5CisgIG0xID0gbTMgKiBtMSAqIG0zOworICBxci5jb21wdXRlKG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYnNkZXQsIHFyLmFic0RldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKGludGVybmFsOjpsb2coYWJzZGV0KSwgcXIubG9nQWJzRGV0ZXJtaW5hbnQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpCit7CisgIE1hdHJpeFR5cGUgdG1wOworCisgIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXI7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLm1hdHJpeFFSKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLnNvbHZlKHRtcCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmhvdXNlaG9sZGVyUSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5kaW1lbnNpb25PZktlcm5lbCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5pc0luamVjdGl2ZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5pc1N1cmplY3RpdmUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIuaXNJbnZlcnRpYmxlKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmludmVyc2UoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIuYWJzRGV0ZXJtaW5hbnQoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIubG9nQWJzRGV0ZXJtaW5hbnQoKSkKK30KKwordm9pZCB0ZXN0X3FyX2NvbHBpdm90aW5nKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcXI8TWF0cml4WGY+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcXI8TWF0cml4WGQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggcXI8TWF0cml4WGNkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoKCBxcl9maXhlZHNpemU8TWF0cml4PGZsb2F0LDMsNT4sIDQgPigpICkpOworICAgIENBTExfU1VCVEVTVF81KCggcXJfZml4ZWRzaXplPE1hdHJpeDxkb3VibGUsNiwyPiwgMyA+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKCBxcl9maXhlZHNpemU8TWF0cml4PGRvdWJsZSwxLDE+LCAxID4oKSApKTsKKyAgfQorCisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHFyX2ludmVydGlibGU8TWF0cml4WGY+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYZD4oKSApOworICAgIENBTExfU1VCVEVTVF82KCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSApOworICAgIENBTExfU1VCVEVTVF8zKCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhjZD4oKSApOworICB9CisKKyAgQ0FMTF9TVUJURVNUXzcocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZj4oKSk7CisgIENBTExfU1VCVEVTVF84KHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Q+KCkpOworICBDQUxMX1NVQlRFU1RfMShxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzIocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZD4oKSk7CisgIENBTExfU1VCVEVTVF82KHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGNmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzMocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYY2Q+KCkpOworCisgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycworICBDQUxMX1NVQlRFU1RfOShDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFhmPigxMCwgMjApKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcXJfZnVsbHBpdm90aW5nLmNwcCBiL3Rlc3QvcXJfZnVsbHBpdm90aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWM5NzkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9xcl9mdWxscGl2b3RpbmcuY3BwCkBAIC0wLDAgKzEsMTMyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXIoKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyMCwyMDApLCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIwLDIwMCksIGNvbHMyID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIwLDIwMCk7CisgIEluZGV4IHJhbmsgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpLTEpOworCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IE1hdHJpeFFUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworICBNYXRyaXhUeXBlIG0xOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLHJvd3MsY29scyxtMSk7CisgIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyKG0xKTsKKyAgVkVSSUZZKHJhbmsgPT0gcXIucmFuaygpKTsKKyAgVkVSSUZZKGNvbHMgLSBxci5yYW5rKCkgPT0gcXIuZGltZW5zaW9uT2ZLZXJuZWwoKSk7CisgIFZFUklGWSghcXIuaXNJbmplY3RpdmUoKSk7CisgIFZFUklGWSghcXIuaXNJbnZlcnRpYmxlKCkpOworICBWRVJJRlkoIXFyLmlzU3VyamVjdGl2ZSgpKTsKKworICBNYXRyaXhUeXBlIHIgPSBxci5tYXRyaXhRUigpOworICAKKyAgTWF0cml4UVR5cGUgcSA9IHFyLm1hdHJpeFEoKTsKKyAgVkVSSUZZX0lTX1VOSVRBUlkocSk7CisgIAorICAvLyBGSVhNRSBuZWVkIGJldHRlciB3YXkgdG8gY29uc3RydWN0IHRyYXBlem9pZAorICBmb3IoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSBmb3IoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSBpZihpPmopIHIoaSxqKSA9IFNjYWxhcigwKTsKKworICBNYXRyaXhUeXBlIGMgPSBxci5tYXRyaXhRKCkgKiByICogcXIuY29sc1Blcm11dGF0aW9uKCkuaW52ZXJzZSgpOworCisgIFZFUklGWV9JU19BUFBST1gobTEsIGMpOworCisgIE1hdHJpeFR5cGUgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIE1hdHJpeFR5cGUgbTMgPSBtMSptMjsKKyAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIG0yID0gcXIuc29sdmUobTMpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSptMik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfaW52ZXJ0aWJsZSgpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDUwKTsKKworICBNYXRyaXhUeXBlIG0xKHNpemUsIHNpemUpLCBtMihzaXplLCBzaXplKSwgbTMoc2l6ZSwgc2l6ZSk7CisgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkKKyAgeworICAgIC8vIGxldCdzIGJ1aWxkIGEgbWF0cml4IG1vcmUgc3RhYmxlIHRvIGludmVyc2UKKyAgICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKjIpOworICAgIG0xICs9IGEgKiBhLmFkam9pbnQoKTsKKyAgfQorCisgIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyKG0xKTsKKyAgVkVSSUZZKHFyLmlzSW5qZWN0aXZlKCkpOworICBWRVJJRlkocXIuaXNJbnZlcnRpYmxlKCkpOworICBWRVJJRlkocXIuaXNTdXJqZWN0aXZlKCkpOworCisgIG0zID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIG0yID0gcXIuc29sdmUobTMpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSptMik7CisKKyAgLy8gbm93IGNvbnN0cnVjdCBhIG1hdHJpeCB3aXRoIHByZXNjcmliZWQgZGV0ZXJtaW5hbnQKKyAgbTEuc2V0WmVybygpOworICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSBtMShpLGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIFJlYWxTY2FsYXIgYWJzZGV0ID0gaW50ZXJuYWw6OmFicyhtMS5kaWFnb25hbCgpLnByb2QoKSk7CisgIG0zID0gcXIubWF0cml4USgpOyAvLyBnZXQgYSB1bml0YXJ5CisgIG0xID0gbTMgKiBtMSAqIG0zOworICBxci5jb21wdXRlKG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYnNkZXQsIHFyLmFic0RldGVybWluYW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKGludGVybmFsOjpsb2coYWJzZGV0KSwgcXIubG9nQWJzRGV0ZXJtaW5hbnQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpCit7CisgIE1hdHJpeFR5cGUgdG1wOworCisgIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5tYXRyaXhRUigpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5zb2x2ZSh0bXApKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5tYXRyaXhRKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmRpbWVuc2lvbk9mS2VybmVsKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmlzSW5qZWN0aXZlKCkpCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmlzU3VyamVjdGl2ZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5pc0ludmVydGlibGUoKSkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocXIuaW52ZXJzZSgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5hYnNEZXRlcm1pbmFudCgpKQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5sb2dBYnNEZXRlcm1pbmFudCgpKQorfQorCit2b2lkIHRlc3RfcXJfZnVsbHBpdm90aW5nKCkKK3sKKyBmb3IoaW50IGkgPSAwOyBpIDwgMTsgaSsrKSB7CisgICAgLy8gRklYTUUgOiB2ZXJ5IHdlaXJkIGJ1ZyBoZXJlCisvLyAgICAgQ0FMTF9TVUJURVNUKHFyKE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIHFyPE1hdHJpeFhmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHFyPE1hdHJpeFhkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHFyPE1hdHJpeFhjZD4oKSApOworICB9CisKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSApOworICAgIENBTExfU1VCVEVTVF8yKCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhkPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHFyX2ludmVydGlibGU8TWF0cml4WGNmPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHFyX2ludmVydGlibGU8TWF0cml4WGNkPigpICk7CisgIH0KKworICBDQUxMX1NVQlRFU1RfNShxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeDNmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzYocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZD4oKSk7CisgIENBTExfU1VCVEVTVF8xKHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGY+KCkpOworICBDQUxMX1NVQlRFU1RfMihxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhkPigpKTsKKyAgQ0FMTF9TVUJURVNUXzQocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYY2Y+KCkpOworICBDQUxMX1NVQlRFU1RfMyhxcl92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhjZD4oKSk7CisKKyAgLy8gVGVzdCBwcm9ibGVtIHNpemUgY29uc3RydWN0b3JzCisgIENBTExfU1VCVEVTVF83KEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFhmPigxMCwgMjApKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcXR2ZWN0b3IuY3BwIGIvdGVzdC9xdHZlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlODg1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcXR2ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMTU4IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fV09SS19BUk9VTkRfUVRfQlVHX0NBTExJTkdfV1JPTkdfT1BFUkFUT1JfTkVXX0ZJWEVEX0lOX1FUXzRfNQorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPFF0Q29yZS9RVmVjdG9yPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPEVpZ2VuL1F0QWxpZ25lZE1hbGxvYz4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfcXR2ZWN0b3JfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIE1hdHJpeFR5cGUgeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIFFWZWN0b3I8TWF0cml4VHlwZT4gdigxMCwgTWF0cml4VHlwZShyb3dzLGNvbHMpKSwgdygyMCwgeSk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB5KTsKKyAgfQorICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYuZmlsbCh5LDIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKKyAgVkVSSUZZKChzaXplX3QpJih2WzIyXSkgPT0gKHNpemVfdCkmKHZbMjFdKSArIHNpemVvZihNYXRyaXhUeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIE1hdHJpeFR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IoaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldPT13WyhpLTIzKSV3LnNpemUoKV0pOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU+Cit2b2lkIGNoZWNrX3F0dmVjdG9yX3RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1UeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIFRyYW5zZm9ybVR5cGUgeChNYXRyaXhUeXBlOjpSYW5kb20oKSksIHkoTWF0cml4VHlwZTo6UmFuZG9tKCkpOworICBRVmVjdG9yPFRyYW5zZm9ybVR5cGU+IHYoMTApLCB3KDIwLCB5KTsKKyAgdls1XSA9IHg7CisgIHdbNl0gPSB2WzVdOworICBWRVJJRllfSVNfQVBQUk9YKHdbNl0sIHZbNV0pOworICB2ID0gdzsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOworICB9CisKKyAgdi5yZXNpemUoMjEpOworICB2WzIwXSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOworICB2LmZpbGwoeSwyMik7CisgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7CisgIFZFUklGWSgoc2l6ZV90KSYodlsyMl0pID09IChzaXplX3QpJih2WzIxXSkgKyBzaXplb2YoVHJhbnNmb3JtVHlwZSkpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAorICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQorICBUcmFuc2Zvcm1UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpbnQoaSk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpPT13WyhpLTIzKSV3LnNpemUoKV0ubWF0cml4KCkpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgordm9pZCBjaGVja19xdHZlY3Rvcl9xdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZTo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKKyAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKTsKKyAgUVZlY3RvcjxRdWF0ZXJuaW9uVHlwZT4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYuZmlsbCh5LDIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKKyAgVkVSSUZZKChzaXplX3QpJih2WzIyXSkgPT0gKHNpemVfdCkmKHZbMjFdKSArIHNpemVvZihRdWF0ZXJuaW9uVHlwZSkpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAorICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQorICBRdWF0ZXJuaW9uVHlwZSogcmVmID0gJndbMF07CisgIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCisgICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7CisgIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaW50KGkpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXS5jb2VmZnMoKT09d1soaS0yMykldy5zaXplKCldLmNvZWZmcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3RfcXR2ZWN0b3IoKQoreworICAvLyBzb21lIG5vbiB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChWZWN0b3IyZigpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4M2YoKSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KE1hdHJpeDNkKCkpKTsKKworICAvLyBzb21lIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KE1hdHJpeDJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChWZWN0b3I0ZigpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4NGYoKSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KE1hdHJpeDRkKCkpKTsKKworICAvLyBzb21lIGR5bmFtaWMgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChNYXRyaXhYZCgxLDEpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoVmVjdG9yWGQoMjApKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoUm93VmVjdG9yWGYoMjApKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4WGNmKDEwLDEwKSkpOworCisgIC8vIHNvbWUgVHJhbnNmb3JtCisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl90cmFuc2Zvcm0oQWZmaW5lMmYoKSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfdHJhbnNmb3JtKEFmZmluZTNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX3RyYW5zZm9ybShBZmZpbmUzZCgpKSk7CisgIC8vQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX3RyYW5zZm9ybShUcmFuc2Zvcm00ZCgpKSk7CisKKyAgLy8gc29tZSBRdWF0ZXJuaW9uCisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9xdWF0ZXJuaW9uKFF1YXRlcm5pb25mKCkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmYoKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9yZWR1eC5jcHAgYi90ZXN0L3JlZHV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdkNGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yZWR1eC5jcHAKQEAgLTAsMCArMSwxNTggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtYXRyaXhSZWR1eChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisKKyAgLy8gVGhlIGVudHJpZXMgb2YgbTEgYXJlIHVuaWZvcm1seSBkaXN0cmlidXRlZCBpbiBbMCwxXSwgc28gbTEucHJvZCgpIGlzIHZlcnkgc21hbGwuIFRoaXMgbWF5IGxlYWQgdG8gdGVzdAorICAvLyBmYWlsdXJlcyBpZiB3ZSB1bmRlcmZsb3cgaW50byBkZW5vcm1hbHMuIFRodXMsIHdlIHNjYWxlIHNvIHRoYXQgZW50aXJlcyBhcmUgY2xvc2UgdG8gMS4KKyAgTWF0cml4VHlwZSBtMV9mb3JfcHJvZCA9IE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scykgKyBTY2FsYXIoMC4yKSAqIG0xOworCisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLnN1bSgpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scykuc3VtKCksIFNjYWxhcihmbG9hdChyb3dzKmNvbHMpKSk7IC8vIHRoZSBmbG9hdCgpIGhlcmUgdG8gc2h1dCB1cCBleGNlc3NpdmUgTVNWQyB3YXJuaW5nIGFib3V0IGludC0+Y29tcGxleCBjb252ZXJzaW9uIGJlaW5nIGxvc3N5CisgIFNjYWxhciBzKDApLCBwKDEpLCBtaW5jKGludGVybmFsOjpyZWFsKG0xLmNvZWZmKDApKSksIG1heGMoaW50ZXJuYWw6OnJlYWwobTEuY29lZmYoMCkpKTsKKyAgZm9yKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykKKyAgZm9yKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykKKyAgeworICAgIHMgKz0gbTEoaSxqKTsKKyAgICBwICo9IG0xX2Zvcl9wcm9kKGksaik7CisgICAgbWluYyA9IChzdGQ6Om1pbikoaW50ZXJuYWw6OnJlYWwobWluYyksIGludGVybmFsOjpyZWFsKG0xKGksaikpKTsKKyAgICBtYXhjID0gKHN0ZDo6bWF4KShpbnRlcm5hbDo6cmVhbChtYXhjKSwgaW50ZXJuYWw6OnJlYWwobTEoaSxqKSkpOworICB9CisgIGNvbnN0IFNjYWxhciBtZWFuID0gcy9TY2FsYXIoUmVhbFNjYWxhcihyb3dzKmNvbHMpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0xLnN1bSgpLCBzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5tZWFuKCksIG1lYW4pOworICBWRVJJRllfSVNfQVBQUk9YKG0xX2Zvcl9wcm9kLnByb2QoKSwgcCk7CisgIFZFUklGWV9JU19BUFBST1gobTEucmVhbCgpLm1pbkNvZWZmKCksIGludGVybmFsOjpyZWFsKG1pbmMpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5yZWFsKCkubWF4Q29lZmYoKSwgaW50ZXJuYWw6OnJlYWwobWF4YykpOworCisgIC8vIHRlc3Qgc2xpY2UgdmVjdG9yaXphdGlvbiBhc3N1bWluZyBhc3NpZ24gaXMgb2sKKyAgSW5kZXggcjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7CisgIEluZGV4IGMwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KHIwKzEscm93cyktcjA7CisgIEluZGV4IGMxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oYzArMSxjb2xzKS1jMDsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jayhyMCxjMCxyMSxjMSkuc3VtKCksIG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5ldmFsKCkuc3VtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5tZWFuKCksIG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5ldmFsKCkubWVhbigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMV9mb3JfcHJvZC5ibG9jayhyMCxjMCxyMSxjMSkucHJvZCgpLCBtMV9mb3JfcHJvZC5ibG9jayhyMCxjMCxyMSxjMSkuZXZhbCgpLnByb2QoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjAsYzAscjEsYzEpLnJlYWwoKS5taW5Db2VmZigpLCBtMS5ibG9jayhyMCxjMCxyMSxjMSkucmVhbCgpLmV2YWwoKS5taW5Db2VmZigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jayhyMCxjMCxyMSxjMSkucmVhbCgpLm1heENvZWZmKCksIG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5yZWFsKCkuZXZhbCgpLm1heENvZWZmKCkpOworICAKKyAgLy8gdGVzdCBlbXB0eSBvYmplY3RzCisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjAsYzAsMCwwKS5zdW0oKSwgICBTY2FsYXIoMCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIwLGMwLDAsMCkucHJvZCgpLCAgU2NhbGFyKDEpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4gdm9pZCB2ZWN0b3JSZWR1eChjb25zdCBWZWN0b3JUeXBlJiB3KQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgSW5kZXggc2l6ZSA9IHcuc2l6ZSgpOworCisgIFZlY3RvclR5cGUgdiA9IFZlY3RvclR5cGU6OlJhbmRvbShzaXplKTsKKyAgVmVjdG9yVHlwZSB2X2Zvcl9wcm9kID0gVmVjdG9yVHlwZTo6T25lcyhzaXplKSArIFNjYWxhcigwLjIpICogdjsgLy8gc2VlIGNvbW1lbnQgYWJvdmUgZGVjbGFyYXRpb24gb2YgbTFfZm9yX3Byb2QKKworICBmb3IoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorICB7CisgICAgU2NhbGFyIHMoMCksIHAoMSk7CisgICAgUmVhbFNjYWxhciBtaW5jKGludGVybmFsOjpyZWFsKHYuY29lZmYoMCkpKSwgbWF4YyhpbnRlcm5hbDo6cmVhbCh2LmNvZWZmKDApKSk7CisgICAgZm9yKGludCBqID0gMDsgaiA8IGk7IGorKykKKyAgICB7CisgICAgICBzICs9IHZbal07CisgICAgICBwICo9IHZfZm9yX3Byb2Rbal07CisgICAgICBtaW5jID0gKHN0ZDo6bWluKShtaW5jLCBpbnRlcm5hbDo6cmVhbCh2W2pdKSk7CisgICAgICBtYXhjID0gKHN0ZDo6bWF4KShtYXhjLCBpbnRlcm5hbDo6cmVhbCh2W2pdKSk7CisgICAgfQorICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihpbnRlcm5hbDo6YWJzKHMgLSB2LmhlYWQoaSkuc3VtKCkpLCBTY2FsYXIoMSkpOworICAgIFZFUklGWV9JU19BUFBST1gocCwgdl9mb3JfcHJvZC5oZWFkKGkpLnByb2QoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtaW5jLCB2LnJlYWwoKS5oZWFkKGkpLm1pbkNvZWZmKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobWF4Yywgdi5yZWFsKCkuaGVhZChpKS5tYXhDb2VmZigpKTsKKyAgfQorCisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplLTE7IGkrKykKKyAgeworICAgIFNjYWxhciBzKDApLCBwKDEpOworICAgIFJlYWxTY2FsYXIgbWluYyhpbnRlcm5hbDo6cmVhbCh2LmNvZWZmKGkpKSksIG1heGMoaW50ZXJuYWw6OnJlYWwodi5jb2VmZihpKSkpOworICAgIGZvcihpbnQgaiA9IGk7IGogPCBzaXplOyBqKyspCisgICAgeworICAgICAgcyArPSB2W2pdOworICAgICAgcCAqPSB2X2Zvcl9wcm9kW2pdOworICAgICAgbWluYyA9IChzdGQ6Om1pbikobWluYywgaW50ZXJuYWw6OnJlYWwodltqXSkpOworICAgICAgbWF4YyA9IChzdGQ6Om1heCkobWF4YywgaW50ZXJuYWw6OnJlYWwodltqXSkpOworICAgIH0KKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oaW50ZXJuYWw6OmFicyhzIC0gdi50YWlsKHNpemUtaSkuc3VtKCkpLCBTY2FsYXIoMSkpOworICAgIFZFUklGWV9JU19BUFBST1gocCwgdl9mb3JfcHJvZC50YWlsKHNpemUtaSkucHJvZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIHYucmVhbCgpLnRhaWwoc2l6ZS1pKS5taW5Db2VmZigpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1heGMsIHYucmVhbCgpLnRhaWwoc2l6ZS1pKS5tYXhDb2VmZigpKTsKKyAgfQorCisgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplLzI7IGkrKykKKyAgeworICAgIFNjYWxhciBzKDApLCBwKDEpOworICAgIFJlYWxTY2FsYXIgbWluYyhpbnRlcm5hbDo6cmVhbCh2LmNvZWZmKGkpKSksIG1heGMoaW50ZXJuYWw6OnJlYWwodi5jb2VmZihpKSkpOworICAgIGZvcihpbnQgaiA9IGk7IGogPCBzaXplLWk7IGorKykKKyAgICB7CisgICAgICBzICs9IHZbal07CisgICAgICBwICo9IHZfZm9yX3Byb2Rbal07CisgICAgICBtaW5jID0gKHN0ZDo6bWluKShtaW5jLCBpbnRlcm5hbDo6cmVhbCh2W2pdKSk7CisgICAgICBtYXhjID0gKHN0ZDo6bWF4KShtYXhjLCBpbnRlcm5hbDo6cmVhbCh2W2pdKSk7CisgICAgfQorICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihpbnRlcm5hbDo6YWJzKHMgLSB2LnNlZ21lbnQoaSwgc2l6ZS0yKmkpLnN1bSgpKSwgU2NhbGFyKDEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHAsIHZfZm9yX3Byb2Quc2VnbWVudChpLCBzaXplLTIqaSkucHJvZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIHYucmVhbCgpLnNlZ21lbnQoaSwgc2l6ZS0yKmkpLm1pbkNvZWZmKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobWF4Yywgdi5yZWFsKCkuc2VnbWVudChpLCBzaXplLTIqaSkubWF4Q29lZmYoKSk7CisgIH0KKyAgCisgIC8vIHRlc3QgZW1wdHkgb2JqZWN0cworICBWRVJJRllfSVNfQVBQUk9YKHYuaGVhZCgwKS5zdW0oKSwgICBTY2FsYXIoMCkpOworICBWRVJJRllfSVNfQVBQUk9YKHYudGFpbCgwKS5wcm9kKCksICBTY2FsYXIoMSkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCh2LmhlYWQoMCkubWVhbigpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQodi5oZWFkKDApLm1pbkNvZWZmKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCh2LmhlYWQoMCkubWF4Q29lZmYoKSk7Cit9CisKK3ZvaWQgdGVzdF9yZWR1eCgpCit7CisgIC8vIHRoZSBtYXggc2l6ZSBjYW5ub3QgYmUgdG9vIGxhcmdlLCBvdGhlcndpc2UgcmVkdXhpb24gb3BlcmF0aW9ucyBvYnZpb3VzbHkgZ2VuZXJhdGUgbGFyZ2UgZXJyb3JzLgorICBpbnQgbWF4c2l6ZSA9IChzdGQ6Om1pbikoMTAwLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobWF4c2l6ZSk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIG1hdHJpeFJlZHV4KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggbWF0cml4UmVkdXgoQXJyYXk8ZmxvYXQsIDEsIDE+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hdHJpeFJlZHV4KE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIG1hdHJpeFJlZHV4KEFycmF5MmYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWF0cml4UmVkdXgoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggbWF0cml4UmVkdXgoQXJyYXk0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF80KCBtYXRyaXhSZWR1eChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSksIGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWF0cml4UmVkdXgoQXJyYXlYWGNmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1hdHJpeFJlZHV4KE1hdHJpeFhkIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOworICAgIENBTExfU1VCVEVTVF81KCBtYXRyaXhSZWR1eChBcnJheVhYZCAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSksIGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggbWF0cml4UmVkdXgoTWF0cml4WGkgKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIG1hdHJpeFJlZHV4KEFycmF5WFhpIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOworICB9CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzcoIHZlY3RvclJlZHV4KFZlY3RvcjRmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcoIHZlY3RvclJlZHV4KEFycmF5NGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggdmVjdG9yUmVkdXgoVmVjdG9yWGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOworICAgIENBTExfU1VCVEVTVF81KCB2ZWN0b3JSZWR1eChBcnJheVhkKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOCggdmVjdG9yUmVkdXgoVmVjdG9yWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOworICAgIENBTExfU1VCVEVTVF84KCB2ZWN0b3JSZWR1eChBcnJheVhmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9yZXNpemUuY3BwIGIvdGVzdC9yZXNpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZGFhZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Jlc2l6ZS5jcHAKQEAgLTAsMCArMSw0MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgS2VpciBNaWVybGUgPG1pZXJsZUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTxEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scz4KK3ZvaWQgcmVzaXplTGlrZVRlc3QoKQoreworICBNYXRyaXhYZiBBKHJvd3MsIGNvbHMpOworICBNYXRyaXhYZiBCOworICBNYXRyaXg8ZG91YmxlLCByb3dzLCBjb2xzPiBDOworICBCLnJlc2l6ZUxpa2UoQSk7CisgIEMucmVzaXplTGlrZShCKTsgIC8vIFNob3VsZG4ndCBjcmFzaC4KKyAgVkVSSUZZKEIucm93cygpID09IHJvd3MgJiYgQi5jb2xzKCkgPT0gY29scyk7CisKKyAgVmVjdG9yWGYgeChyb3dzKTsKKyAgUm93VmVjdG9yWGYgeTsKKyAgeS5yZXNpemVMaWtlKHgpOworICBWRVJJRlkoeS5yb3dzKCkgPT0gMSAmJiB5LmNvbHMoKSA9PSByb3dzKTsKKworICB5LnJlc2l6ZShjb2xzKTsKKyAgeC5yZXNpemVMaWtlKHkpOworICBWRVJJRlkoeC5yb3dzKCkgPT0gY29scyAmJiB4LmNvbHMoKSA9PSAxKTsKK30KKwordm9pZCByZXNpemVMaWtlVGVzdDEyKCkgeyByZXNpemVMaWtlVGVzdDwxLDI+KCk7IH0KK3ZvaWQgcmVzaXplTGlrZVRlc3QxMDIwKCkgeyByZXNpemVMaWtlVGVzdDwxMCwyMD4oKTsgfQordm9pZCByZXNpemVMaWtlVGVzdDMxKCkgeyByZXNpemVMaWtlVGVzdDwzLDE+KCk7IH0KKwordm9pZCB0ZXN0X3Jlc2l6ZSgpCit7CisgIENBTExfU1VCVEVTVChyZXNpemVMaWtlVGVzdDEyKCkgKTsKKyAgQ0FMTF9TVUJURVNUKHJlc2l6ZUxpa2VUZXN0MTAyMCgpICk7CisgIENBTExfU1VCVEVTVChyZXNpemVMaWtlVGVzdDMxKCkgKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcnVudGVzdC5zaCBiL3Rlc3QvcnVudGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYmUyNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ydW50ZXN0LnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9iYXNoCisKK2JsYWNrPSdcRVszMG0nCityZWQ9J1xFWzMxbScKK2dyZWVuPSdcRVszMm0nCit5ZWxsb3c9J1xFWzMzbScKK2JsdWU9J1xFWzM0bScKK21hZ2VudGE9J1xFWzM1bScKK2N5YW49J1xFWzM2bScKK3doaXRlPSdcRVszN20nCisKK2lmICEgLi8kMSA+IC9kZXYvbnVsbCAyPiAucnVudGVzdC5sb2cgOyB0aGVuCisgIGVjaG8gLWUgICRyZWQgVGVzdCAkMSBmYWlsZWQ6ICRibGFjaworICBlY2hvIC1lICRibHVlCisgIGNhdCAucnVudGVzdC5sb2cKKyAgZWNobyAtZSAkYmxhY2sKKyAgZXhpdCAxCitlbHNlCitlY2hvIC1lICRncmVlbiBUZXN0ICQxIHBhc3NlZCRibGFjaworZmkKZGlmZiAtLWdpdCBhL3Rlc3Qvc2NodXJfY29tcGxleC5jcHAgYi90ZXN0L3NjaHVyX2NvbXBsZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjY2YWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaHVyX2NvbXBsZXguY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzY2h1cihpbnQgc2l6ZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKQoreworICB0eXBlZGVmIHR5cGVuYW1lIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPjo6Q29tcGxleFNjYWxhciBDb21wbGV4U2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPjo6Q29tcGxleE1hdHJpeFR5cGUgQ29tcGxleE1hdHJpeFR5cGU7CisKKyAgLy8gVGVzdCBiYXNpYyBmdW5jdGlvbmFsaXR5OiBUIGlzIHRyaWFuZ3VsYXIgYW5kIEEgPSBVIFQgVSoKKyAgZm9yKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IGdfcmVwZWF0OyArK2NvdW50ZXIpIHsKKyAgICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CisgICAgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+IHNjaHVyT2ZBKEEpOworICAgIFZFUklGWV9JU19FUVVBTChzY2h1ck9mQS5pbmZvKCksIFN1Y2Nlc3MpOworICAgIENvbXBsZXhNYXRyaXhUeXBlIFUgPSBzY2h1ck9mQS5tYXRyaXhVKCk7CisgICAgQ29tcGxleE1hdHJpeFR5cGUgVCA9IHNjaHVyT2ZBLm1hdHJpeFQoKTsKKyAgICBmb3IoaW50IHJvdyA9IDE7IHJvdyA8IHNpemU7ICsrcm93KSB7CisgICAgICBmb3IoaW50IGNvbCA9IDA7IGNvbCA8IHJvdzsgKytjb2wpIHsKKwlWRVJJRlkoVChyb3csY29sKSA9PSAodHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyKTApOworICAgICAgfQorICAgIH0KKyAgICBWRVJJRllfSVNfQVBQUk9YKEEudGVtcGxhdGUgY2FzdDxDb21wbGV4U2NhbGFyPigpLCBVICogVCAqIFUuYWRqb2ludCgpKTsKKyAgfQorCisgIC8vIFRlc3QgYXNzZXJ0cyB3aGVuIG5vdCBpbml0aWFsaXplZAorICBDb21wbGV4U2NodXI8TWF0cml4VHlwZT4gY3NVbmluaXRpYWxpemVkOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChjc1VuaW5pdGlhbGl6ZWQubWF0cml4VCgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY3NVbmluaXRpYWxpemVkLm1hdHJpeFUoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNzVW5pbml0aWFsaXplZC5pbmZvKCkpOworICAKKyAgLy8gVGVzdCB3aGV0aGVyIGNvbXB1dGUoKSBhbmQgY29uc3RydWN0b3IgcmV0dXJucyBzYW1lIHJlc3VsdAorICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CisgIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBjczE7CisgIGNzMS5jb21wdXRlKEEpOworICBDb21wbGV4U2NodXI8TWF0cml4VHlwZT4gY3MyKEEpOworICBWRVJJRllfSVNfRVFVQUwoY3MxLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19FUVVBTChjczIuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNzMS5tYXRyaXhUKCksIGNzMi5tYXRyaXhUKCkpOworICBWRVJJRllfSVNfRVFVQUwoY3MxLm1hdHJpeFUoKSwgY3MyLm1hdHJpeFUoKSk7CisKKyAgLy8gVGVzdCBjb21wdXRhdGlvbiBvZiBvbmx5IFQsIG5vdCBVCisgIENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBjc09ubHlUKEEsIGZhbHNlKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNzT25seVQuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGNzMS5tYXRyaXhUKCksIGNzT25seVQubWF0cml4VCgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY3NPbmx5VC5tYXRyaXhVKCkpOworCisgIGlmIChzaXplID4gMSkKKyAgeworICAgIC8vIFRlc3QgbWF0cml4IHdpdGggTmFOCisgICAgQSgwLDApID0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyPjo6cXVpZXRfTmFOKCk7CisgICAgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+IGNzTmFOKEEpOworICAgIFZFUklGWV9JU19FUVVBTChjc05hTi5pbmZvKCksIE5vQ29udmVyZ2VuY2UpOworICB9Cit9CisKK3ZvaWQgdGVzdF9zY2h1cl9jb21wbGV4KCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEoKCBzY2h1cjxNYXRyaXg0Y2Q+KCkgKSk7CisgIENBTExfU1VCVEVTVF8yKCggc2NodXI8TWF0cml4WGNmPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzMoKCBzY2h1cjxNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgMT4gPigpICkpOworICBDQUxMX1NVQlRFU1RfNCgoIHNjaHVyPE1hdHJpeDxmbG9hdCwgMywgMywgRWlnZW46OlJvd01ham9yPiA+KCkgKSk7CisKKyAgLy8gVGVzdCBwcm9ibGVtIHNpemUgY29uc3RydWN0b3JzCisgIENBTExfU1VCVEVTVF81KENvbXBsZXhTY2h1cjxNYXRyaXhYZj4oMTApKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc2NodXJfcmVhbC5jcHAgYi90ZXN0L3NjaHVyX3JlYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzUxZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NjaHVyX3JlYWwuY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB2ZXJpZnlJc1F1YXNpVHJpYW5ndWxhcihjb25zdCBNYXRyaXhUeXBlJiBUKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIGNvbnN0IEluZGV4IHNpemUgPSBULmNvbHMoKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworCisgIC8vIENoZWNrIFQgaXMgbG93ZXIgSGVzc2VuYmVyZworICBmb3IoaW50IHJvdyA9IDI7IHJvdyA8IHNpemU7ICsrcm93KSB7CisgICAgZm9yKGludCBjb2wgPSAwOyBjb2wgPCByb3cgLSAxOyArK2NvbCkgeworICAgICAgVkVSSUZZKFQocm93LGNvbCkgPT0gU2NhbGFyKDApKTsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayB0aGF0IGFueSBub24temVybyBvbiB0aGUgc3ViZGlhZ29uYWwgaXMgZm9sbG93ZWQgYnkgYSB6ZXJvIGFuZCBpcworICAvLyBwYXJ0IG9mIGEgMngyIGRpYWdvbmFsIGJsb2NrIHdpdGggaW1hZ2luYXJ5IGVpZ2VudmFsdWVzLgorICBmb3IoaW50IHJvdyA9IDE7IHJvdyA8IHNpemU7ICsrcm93KSB7CisgICAgaWYgKFQocm93LHJvdy0xKSAhPSBTY2FsYXIoMCkpIHsKKyAgICAgIFZFUklGWShyb3cgPT0gc2l6ZS0xIHx8IFQocm93KzEscm93KSA9PSAwKTsKKyAgICAgIFNjYWxhciB0ciA9IFQocm93LTEscm93LTEpICsgVChyb3cscm93KTsKKyAgICAgIFNjYWxhciBkZXQgPSBUKHJvdy0xLHJvdy0xKSAqIFQocm93LHJvdykgLSBUKHJvdy0xLHJvdykgKiBUKHJvdyxyb3ctMSk7CisgICAgICBWRVJJRlkoNCAqIGRldCA+IHRyICogdHIpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHNjaHVyKGludCBzaXplID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpCit7CisgIC8vIFRlc3QgYmFzaWMgZnVuY3Rpb25hbGl0eTogVCBpcyBxdWFzaS10cmlhbmd1bGFyIGFuZCBBID0gVSBUIFUqCisgIGZvcihpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBnX3JlcGVhdDsgKytjb3VudGVyKSB7CisgICAgTWF0cml4VHlwZSBBID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOworICAgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiBzY2h1ck9mQShBKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2NodXJPZkEuaW5mbygpLCBTdWNjZXNzKTsKKyAgICBNYXRyaXhUeXBlIFUgPSBzY2h1ck9mQS5tYXRyaXhVKCk7CisgICAgTWF0cml4VHlwZSBUID0gc2NodXJPZkEubWF0cml4VCgpOworICAgIHZlcmlmeUlzUXVhc2lUcmlhbmd1bGFyKFQpOworICAgIFZFUklGWV9JU19BUFBST1goQSwgVSAqIFQgKiBVLnRyYW5zcG9zZSgpKTsKKyAgfQorCisgIC8vIFRlc3QgYXNzZXJ0cyB3aGVuIG5vdCBpbml0aWFsaXplZAorICBSZWFsU2NodXI8TWF0cml4VHlwZT4gcnNVbmluaXRpYWxpemVkOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChyc1VuaW5pdGlhbGl6ZWQubWF0cml4VCgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocnNVbmluaXRpYWxpemVkLm1hdHJpeFUoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHJzVW5pbml0aWFsaXplZC5pbmZvKCkpOworICAKKyAgLy8gVGVzdCB3aGV0aGVyIGNvbXB1dGUoKSBhbmQgY29uc3RydWN0b3IgcmV0dXJucyBzYW1lIHJlc3VsdAorICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CisgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiByczE7CisgIHJzMS5jb21wdXRlKEEpOworICBSZWFsU2NodXI8TWF0cml4VHlwZT4gcnMyKEEpOworICBWRVJJRllfSVNfRVFVQUwocnMxLmluZm8oKSwgU3VjY2Vzcyk7CisgIFZFUklGWV9JU19FUVVBTChyczIuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJzMS5tYXRyaXhUKCksIHJzMi5tYXRyaXhUKCkpOworICBWRVJJRllfSVNfRVFVQUwocnMxLm1hdHJpeFUoKSwgcnMyLm1hdHJpeFUoKSk7CisKKyAgLy8gVGVzdCBjb21wdXRhdGlvbiBvZiBvbmx5IFQsIG5vdCBVCisgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiByc09ubHlUKEEsIGZhbHNlKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJzT25seVQuaW5mbygpLCBTdWNjZXNzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHJzMS5tYXRyaXhUKCksIHJzT25seVQubWF0cml4VCgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQocnNPbmx5VC5tYXRyaXhVKCkpOworCisgIGlmIChzaXplID4gMikKKyAgeworICAgIC8vIFRlc3QgbWF0cml4IHdpdGggTmFOCisgICAgQSgwLDApID0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBSZWFsU2NodXI8TWF0cml4VHlwZT4gcnNOYU4oQSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHJzTmFOLmluZm8oKSwgTm9Db252ZXJnZW5jZSk7CisgIH0KK30KKwordm9pZCB0ZXN0X3NjaHVyX3JlYWwoKQoreworICBDQUxMX1NVQlRFU1RfMSgoIHNjaHVyPE1hdHJpeDRmPigpICkpOworICBDQUxMX1NVQlRFU1RfMigoIHNjaHVyPE1hdHJpeFhkPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzMoKCBzY2h1cjxNYXRyaXg8ZmxvYXQsIDEsIDE+ID4oKSApKTsKKyAgQ0FMTF9TVUJURVNUXzQoKCBzY2h1cjxNYXRyaXg8ZG91YmxlLCAzLCAzLCBFaWdlbjo6Um93TWFqb3I+ID4oKSApKTsKKworICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKKyAgQ0FMTF9TVUJURVNUXzUoUmVhbFNjaHVyPE1hdHJpeFhmPigxMCkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zZWxmYWRqb2ludC5jcHAgYi90ZXN0L3NlbGZhZGpvaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDNlYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zZWxmYWRqb2ludC5jcHAKQEAgLTAsMCArMSw2MiBAQAorLy8gVGhpcyBmaWxlIGlzIHRyaWFuZ3VsYXJWaWV3IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworLy8gVGhpcyBmaWxlIHRlc3RzIHRoZSBiYXNpYyBzZWxmYWRqb2ludFZpZXcgQVBJLAorLy8gdGhlIHJlbGF0ZWQgcHJvZHVjdHMgYW5kIGRlY29tcG9zaXRpb25zIGFyZSB0ZXN0ZWQgaW4gc3BlY2lmaWMgZmlsZXMuCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgc2VsZmFkam9pbnQoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKworICBtMS5kaWFnb25hbCgpID0gbTEuZGlhZ29uYWwoKS5yZWFsKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisKKyAgLy8gY2hlY2sgc2VsZmFkam9pbnQgdG8gZGVuc2UKKyAgbTMgPSBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSksIE1hdHJpeFR5cGUobTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTMuYWRqb2ludCgpKTsKKworCisgIG0zID0gbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpLCBNYXRyaXhUeXBlKG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0zLmFkam9pbnQoKSk7Cit9CisKK3ZvaWQgYnVnXzE1OSgpCit7CisgIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCkuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobSkKK30KKwordm9pZCB0ZXN0X3NlbGZhZGpvaW50KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQorICB7CisgICAgaW50IHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHMpOworCisgICAgQ0FMTF9TVUJURVNUXzEoIHNlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggc2VsZmFkam9pbnQoTWF0cml4PGZsb2F0LCAyLCAyPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKCBzZWxmYWRqb2ludChNYXRyaXgzY2YoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggc2VsZmFkam9pbnQoTWF0cml4WGNkKHMscykpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHNlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KHMsIHMpKSApOworICAgIAorICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShzKQorICB9CisgIAorICBDQUxMX1NVQlRFU1RfMSggYnVnXzE1OSgpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NpbXBsaWNpYWxfY2hvbGVza3kuY3BwIGIvdGVzdC9zaW1wbGljaWFsX2Nob2xlc2t5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTNhNTJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zaW1wbGljaWFsX2Nob2xlc2t5LmNwcApAQCAtMCwwICsxLDQwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgInNwYXJzZV9zb2x2ZXIuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0X3NpbXBsaWNpYWxfY2hvbGVza3lfVCgpCit7CisgIFNpbXBsaWNpYWxDaG9sZXNreTxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBjaG9sX2NvbG1ham9yX2xvd2VyOworICBTaW1wbGljaWFsQ2hvbGVza3k8U3BhcnNlTWF0cml4PFQ+LCBVcHBlcj4gY2hvbF9jb2xtYWpvcl91cHBlcjsKKyAgU2ltcGxpY2lhbExMVDxTcGFyc2VNYXRyaXg8VD4sIExvd2VyPiBsbHRfY29sbWFqb3JfbG93ZXI7CisgIFNpbXBsaWNpYWxMRExUPFNwYXJzZU1hdHJpeDxUPiwgVXBwZXI+IGxsdF9jb2xtYWpvcl91cHBlcjsKKyAgU2ltcGxpY2lhbExETFQ8U3BhcnNlTWF0cml4PFQ+LCBMb3dlcj4gbGRsdF9jb2xtYWpvcl9sb3dlcjsKKyAgU2ltcGxpY2lhbExETFQ8U3BhcnNlTWF0cml4PFQ+LCBVcHBlcj4gbGRsdF9jb2xtYWpvcl91cHBlcjsKKworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2hvbF9jb2xtYWpvcl9sb3dlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjaG9sX2NvbG1ham9yX3VwcGVyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGxsdF9jb2xtYWpvcl9sb3dlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhsbHRfY29sbWFqb3JfdXBwZXIpOworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl9sb3dlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhsZGx0X2NvbG1ham9yX3VwcGVyKTsKKyAgCisgIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQoY2hvbF9jb2xtYWpvcl9sb3dlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQoY2hvbF9jb2xtYWpvcl91cHBlcik7CisgIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQobGx0X2NvbG1ham9yX2xvd2VyKTsKKyAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChsbHRfY29sbWFqb3JfdXBwZXIpOworICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGxkbHRfY29sbWFqb3JfbG93ZXIpOworICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGxkbHRfY29sbWFqb3JfdXBwZXIpOworfQorCit2b2lkIHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreSgpCit7CisgIENBTExfU1VCVEVTVF8xKHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPGRvdWJsZT4oKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NpemVvZi5jcHAgYi90ZXN0L3NpemVvZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0NjNjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc2l6ZW9mLmNwcApAQCAtMCwwICsxLDM0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgdmVyaWZ5U2l6ZU9mKGNvbnN0IE1hdHJpeFR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSE9RHluYW1pYyAmJiBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSE9RHluYW1pYykKKyAgICBWRVJJRlkoc2l6ZW9mKE1hdHJpeFR5cGUpPT1zaXplb2YoU2NhbGFyKSpzaXplX3QoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUpKTsKKyAgZWxzZQorICAgIFZFUklGWShzaXplb2YoTWF0cml4VHlwZSk9PXNpemVvZihTY2FsYXIqKSArIDIgKiBzaXplb2YodHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXgpKTsKK30KKwordm9pZCB0ZXN0X3NpemVvZigpCit7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKE1hdHJpeDRkKCkpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4PGRvdWJsZSwgNCwgMj4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXg8Ym9vbCwgNywgNT4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXhYY2YoMywgMykpICk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4WGkoOCwgMTIpKSApOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKE1hdHJpeFhjZCgyMCwgMjApKSApOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKE1hdHJpeDxmbG9hdCwgMTAwLCAxMDA+KCkpICk7CisgIAorICBWRVJJRlkoc2l6ZW9mKHN0ZDo6Y29tcGxleDxmbG9hdD4pID09IDIqc2l6ZW9mKGZsb2F0KSk7CisgIFZFUklGWShzaXplb2Yoc3RkOjpjb21wbGV4PGRvdWJsZT4pID09IDIqc2l6ZW9mKGRvdWJsZSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zaXplb3ZlcmZsb3cuY3BwIGIvdGVzdC9zaXplb3ZlcmZsb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDZmOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NpemVvdmVyZmxvdy5jcHAKQEAgLTAsMCArMSw2NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjZGVmaW5lIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoYSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIHRocmV3ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhdGNoIChzdGQ6OmJhZF9hbGxvYyYpIHsgdGhyZXcgPSB0cnVlOyB9ICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZKHRocmV3ICYmICJzaG91bGQgaGF2ZSB0aHJvd24gYmFkX2FsbG9jOiAiICNhKTsgICAgIFwKKyAgfQorCit0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRyaWdnZXJNYXRyaXhCYWRBbGxvYyhJbmRleCByb3dzLCBJbmRleCBjb2xzKQoreworICBWRVJJRllfVEhST1dTX0JBREFMTE9DKCBNYXRyaXhUeXBlIG0ocm93cywgY29scykgKTsKKyAgVkVSSUZZX1RIUk9XU19CQURBTExPQyggTWF0cml4VHlwZSBtOyBtLnJlc2l6ZShyb3dzLCBjb2xzKSApOworICBWRVJJRllfVEhST1dTX0JBREFMTE9DKCBNYXRyaXhUeXBlIG07IG0uY29uc2VydmF0aXZlUmVzaXplKHJvd3MsIGNvbHMpICk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+Cit2b2lkIHRyaWdnZXJWZWN0b3JCYWRBbGxvYyhJbmRleCBzaXplKQoreworICBWRVJJRllfVEhST1dTX0JBREFMTE9DKCBWZWN0b3JUeXBlIHYoc2l6ZSkgKTsKKyAgVkVSSUZZX1RIUk9XU19CQURBTExPQyggVmVjdG9yVHlwZSB2OyB2LnJlc2l6ZShzaXplKSApOworICBWRVJJRllfVEhST1dTX0JBREFMTE9DKCBWZWN0b3JUeXBlIHY7IHYuY29uc2VydmF0aXZlUmVzaXplKHNpemUpICk7Cit9CisKK3ZvaWQgdGVzdF9zaXplb3ZlcmZsb3coKQoreworICAvLyB0aGVyZSBhcmUgMiBsZXZlbHMgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcuIGZpcnN0IGluIFBsYWluT2JqZWN0QmFzZS5oIHdlIGNoZWNrIGZvciBvdmVyZmxvdyBpbiByb3dzKmNvbHMgY29tcHV0YXRpb25zLgorICAvLyB0aGlzIGlzIHRlc3RlZCBpbiB0ZXN0cyBvZiB0aGUgZm9ybSB0aW1lc19pdHNlbGZfZ2l2ZXNfMCAqIHRpbWVzX2l0c2VsZl9naXZlc18wCisgIC8vIFRoZW4gaW4gTWVtb3J5Lmggd2UgY2hlY2sgZm9yIG92ZXJmbG93IGluIHNpemUgKiBzaXplb2YoVCkgY29tcHV0YXRpb25zLgorICAvLyB0aGlzIGlzIHRlc3RlZCBpbiB0ZXN0cyBvZiB0aGUgZm9ybSB0aW1lc180X2dpdmVzXzAgKiBzaXplb2YoZmxvYXQpCisgIAorICBzaXplX3QgdGltZXNfaXRzZWxmX2dpdmVzXzAgPSBzaXplX3QoMSkgPDwgKDggKiBzaXplb2YoSW5kZXgpIC8gMik7CisgIFZFUklGWSh0aW1lc19pdHNlbGZfZ2l2ZXNfMCAqIHRpbWVzX2l0c2VsZl9naXZlc18wID09IDApOworCisgIHNpemVfdCB0aW1lc180X2dpdmVzXzAgPSBzaXplX3QoMSkgPDwgKDggKiBzaXplb2YoSW5kZXgpIC0gMik7CisgIFZFUklGWSh0aW1lc180X2dpdmVzXzAgKiA0ID09IDApOworCisgIHNpemVfdCB0aW1lc184X2dpdmVzXzAgPSBzaXplX3QoMSkgPDwgKDggKiBzaXplb2YoSW5kZXgpIC0gMyk7CisgIFZFUklGWSh0aW1lc184X2dpdmVzXzAgKiA4ID09IDApOworCisgIHRyaWdnZXJNYXRyaXhCYWRBbGxvYzxNYXRyaXhYZj4odGltZXNfaXRzZWxmX2dpdmVzXzAsIHRpbWVzX2l0c2VsZl9naXZlc18wKTsKKyAgdHJpZ2dlck1hdHJpeEJhZEFsbG9jPE1hdHJpeFhmPih0aW1lc19pdHNlbGZfZ2l2ZXNfMCAvIDQsIHRpbWVzX2l0c2VsZl9naXZlc18wKTsKKyAgdHJpZ2dlck1hdHJpeEJhZEFsbG9jPE1hdHJpeFhmPih0aW1lc180X2dpdmVzXzAsIDEpOworCisgIHRyaWdnZXJNYXRyaXhCYWRBbGxvYzxNYXRyaXhYZD4odGltZXNfaXRzZWxmX2dpdmVzXzAsIHRpbWVzX2l0c2VsZl9naXZlc18wKTsKKyAgdHJpZ2dlck1hdHJpeEJhZEFsbG9jPE1hdHJpeFhkPih0aW1lc19pdHNlbGZfZ2l2ZXNfMCAvIDgsIHRpbWVzX2l0c2VsZl9naXZlc18wKTsKKyAgdHJpZ2dlck1hdHJpeEJhZEFsbG9jPE1hdHJpeFhkPih0aW1lc184X2dpdmVzXzAsIDEpOworICAKKyAgdHJpZ2dlclZlY3RvckJhZEFsbG9jPFZlY3RvclhmPih0aW1lc180X2dpdmVzXzApOworICAKKyAgdHJpZ2dlclZlY3RvckJhZEFsbG9jPFZlY3RvclhkPih0aW1lc184X2dpdmVzXzApOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zbWFsbHZlY3RvcnMuY3BwIGIvdGVzdC9zbWFsbHZlY3RvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MTUxMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NtYWxsdmVjdG9ycy5jcHAKQEAgLTAsMCArMSw2NyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fTk9fU1RBVElDX0FTU0VSVAorI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHNtYWxsVmVjdG9ycygpCit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgMj4gVjI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMT4gVjM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgND4gVjQ7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gVlg7CisgIFNjYWxhciB4MSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAorICAgICAgICAgeDIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgICAgICAgIHgzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCisgICAgICAgICB4NCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBWMiB2Mih4MSwgeDIpOworICBWMyB2Myh4MSwgeDIsIHgzKTsKKyAgVjQgdjQoeDEsIHgyLCB4MywgeDQpOworICBWRVJJRllfSVNfQVBQUk9YKHgxLCB2Mi54KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgxLCB2My54KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgxLCB2NC54KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgyLCB2Mi55KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgyLCB2My55KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgyLCB2NC55KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgzLCB2My56KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHgzLCB2NC56KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHg0LCB2NC53KCkpOworCisgIGlmICghTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikKKyAgeworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFYzKDIsIDEpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFYzKDMsIDIpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFYzKFNjYWxhcigzKSwgMSkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVjMoMywgU2NhbGFyKDEpKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWMyhTY2FsYXIoMyksIFNjYWxhcigxKSkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVjMoU2NhbGFyKDEyMyksIFNjYWxhcigxMjMpKSkKKworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFY0KDEsIDMpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFY0KDIsIDQpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFY0KDEsIFNjYWxhcig0KSkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVjQoU2NhbGFyKDEpLCA0KSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWNChTY2FsYXIoMSksIFNjYWxhcig0KSkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVjQoU2NhbGFyKDEyMyksIFNjYWxhcigxMjMpKSkKKworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFZYKDMsIDIpKQorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFZYKFNjYWxhcigzKSwgMSkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVlgoMywgU2NhbGFyKDEpKSkKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChWWChTY2FsYXIoMyksIFNjYWxhcigxKSkpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoVlgoU2NhbGFyKDEyMyksIFNjYWxhcigxMjMpKSkKKyAgfQorfQorCit2b2lkIHRlc3Rfc21hbGx2ZWN0b3JzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1Qoc21hbGxWZWN0b3JzPGludD4oKSApOworICAgIENBTExfU1VCVEVTVChzbWFsbFZlY3RvcnM8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1Qoc21hbGxWZWN0b3JzPGRvdWJsZT4oKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZS5oIGIvdGVzdC9zcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGIwMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcGFyc2UuaApAQCAtMCwwICsxLDE4MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fVEVTVFNQQVJTRV9ICisjZGVmaW5lIEVJR0VOX1RFU1RTUEFSU0VfSAorCisjZGVmaW5lIEVJR0VOX1lFU19JX0tOT1dfU1BBUlNFX01PRFVMRV9JU19OT1RfU1RBQkxFX1lFVAorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaWYgRUlHRU5fR05VQ19BVF9MRUFTVCg0LDApICYmICFkZWZpbmVkIF9fSUNDICYmICFkZWZpbmVkKF9fY2xhbmdfXykKKworI2lmZGVmIG1pbgorI3VuZGVmIG1pbgorI2VuZGlmCisKKyNpZmRlZiBtYXgKKyN1bmRlZiBtYXgKKyNlbmRpZgorCisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9tYXA+CisjZGVmaW5lIEVJR0VOX1VOT1JERVJFRF9NQVBfU1VQUE9SVAorbmFtZXNwYWNlIHN0ZCB7CisgIHVzaW5nIHN0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwOworfQorI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9HT09HTEVIQVNIX1NVUFBPUlQKKyAgI2luY2x1ZGUgPGdvb2dsZS9zcGFyc2VfaGFzaF9tYXA+CisjZW5kaWYKKworI2luY2x1ZGUgPEVpZ2VuL0Nob2xlc2t5PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KKworZW51bSB7CisgIEZvcmNlTm9uWmVyb0RpYWcgPSAxLAorICBNYWtlTG93ZXJUcmlhbmd1bGFyID0gMiwKKyAgTWFrZVVwcGVyVHJpYW5ndWxhciA9IDQsCisgIEZvcmNlUmVhbERpYWcgPSA4Cit9OworCisvKiBJbml0aWFsaXplcyBib3RoIGEgc3BhcnNlIGFuZCBkZW5zZSBtYXRyaXggd2l0aCBzYW1lIHJhbmRvbSB2YWx1ZXMsCisgKiBhbmQgYSByYXRpbyBvZiBcYSBkZW5zaXR5IG5vbiB6ZXJvIGVudHJpZXMuCisgKiBccGFyYW0gZmxhZ3MgaXMgYSB1bmlvbiBvZiBGb3JjZU5vblplcm9EaWFnLCBNYWtlTG93ZXJUcmlhbmd1bGFyIGFuZCBNYWtlVXBwZXJUcmlhbmd1bGFyCisgKiAgICAgICAgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgc2hhcGUgb2YgdGhlIG1hdHJpeC4KKyAqIFxwYXJhbSB6ZXJvQ29vcmRzIGFuZCBub256ZXJvQ29vcmRzIGFsbG93cyB0byBnZXQgdGhlIGNvb3JkaW5hdGUgbGlzdHMgb2YgdGhlIG5vbiB6ZXJvLAorICogICAgICAgIGFuZCB6ZXJvIGNvZWZmaWNpZW50cyByZXNwZWN0aXZlbHkuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgT3B0MSxpbnQgT3B0Mix0eXBlbmFtZSBJbmRleD4gdm9pZAoraW5pdFNwYXJzZShkb3VibGUgZGVuc2l0eSwKKyAgICAgICAgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsT3B0MT4mIHJlZk1hdCwKKyAgICAgICAgICAgU3BhcnNlTWF0cml4PFNjYWxhcixPcHQyLEluZGV4PiYgc3BhcnNlTWF0LAorICAgICAgICAgICBpbnQgZmxhZ3MgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4qIHplcm9Db29yZHMgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4qIG5vbnplcm9Db29yZHMgPSAwKQoreworICBlbnVtIHsgSXNSb3dNYWpvciA9IFNwYXJzZU1hdHJpeDxTY2FsYXIsT3B0MixJbmRleD46OklzUm93TWFqb3IgfTsKKyAgc3BhcnNlTWF0LnNldFplcm8oKTsKKyAgLy9zcGFyc2VNYXQucmVzZXJ2ZShpbnQocmVmTWF0LnJvd3MoKSpyZWZNYXQuY29scygpKmRlbnNpdHkpKTsKKyAgc3BhcnNlTWF0LnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KElzUm93TWFqb3IgPyByZWZNYXQucm93cygpIDogcmVmTWF0LmNvbHMoKSwgaW50KCgxLjUqZGVuc2l0eSkqKElzUm93TWFqb3I/cmVmTWF0LmNvbHMoKTpyZWZNYXQucm93cygpKSkpKTsKKyAgCisgIGZvcihpbnQgaj0wOyBqPHNwYXJzZU1hdC5vdXRlclNpemUoKTsgaisrKQorICB7CisgICAgLy9zcGFyc2VNYXQuc3RhcnRWZWMoaik7CisgICAgZm9yKGludCBpPTA7IGk8c3BhcnNlTWF0LmlubmVyU2l6ZSgpOyBpKyspCisgICAgeworICAgICAgaW50IGFpKGkpLCBhaihqKTsKKyAgICAgIGlmKElzUm93TWFqb3IpCisgICAgICAgIHN0ZDo6c3dhcChhaSxhaik7CisgICAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMCwxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiBTY2FsYXIoMCk7CisgICAgICBpZiAoKGZsYWdzJkZvcmNlTm9uWmVyb0RpYWcpICYmIChpPT1qKSkKKyAgICAgIHsKKyAgICAgICAgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpKlNjYWxhcigzLik7CisgICAgICAgIHYgPSB2KnYgKyBTY2FsYXIoNS4pOworICAgICAgfQorICAgICAgaWYgKChmbGFncyAmIE1ha2VMb3dlclRyaWFuZ3VsYXIpICYmIGFqPmFpKQorICAgICAgICB2ID0gU2NhbGFyKDApOworICAgICAgZWxzZSBpZiAoKGZsYWdzICYgTWFrZVVwcGVyVHJpYW5ndWxhcikgJiYgYWo8YWkpCisgICAgICAgIHYgPSBTY2FsYXIoMCk7CisKKyAgICAgIGlmICgoZmxhZ3MmRm9yY2VSZWFsRGlhZykgJiYgKGk9PWopKQorICAgICAgICB2ID0gaW50ZXJuYWw6OnJlYWwodik7CisKKyAgICAgIGlmICh2IT1TY2FsYXIoMCkpCisgICAgICB7CisgICAgICAgIC8vc3BhcnNlTWF0Lmluc2VydEJhY2tCeU91dGVySW5uZXIoaixpKSA9IHY7CisgICAgICAgIHNwYXJzZU1hdC5pbnNlcnRCeU91dGVySW5uZXIoaixpKSA9IHY7CisgICAgICAgIGlmIChub256ZXJvQ29vcmRzKQorICAgICAgICAgIG5vbnplcm9Db29yZHMtPnB1c2hfYmFjayhWZWN0b3IyaShhaSxhaikpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoemVyb0Nvb3JkcykKKyAgICAgIHsKKyAgICAgICAgemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKFZlY3RvcjJpKGFpLGFqKSk7CisgICAgICB9CisgICAgICByZWZNYXQoYWksYWopID0gdjsKKyAgICB9CisgIH0KKyAgLy9zcGFyc2VNYXQuZmluYWxpemUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBPcHQxLGludCBPcHQyLHR5cGVuYW1lIEluZGV4PiB2b2lkCitpbml0U3BhcnNlKGRvdWJsZSBkZW5zaXR5LAorICAgICAgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYywgT3B0MT4mIHJlZk1hdCwKKyAgICAgICAgICAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXIsIE9wdDIsIEluZGV4PiYgc3BhcnNlTWF0LAorICAgICAgICAgICBpbnQgZmxhZ3MgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4qIHplcm9Db29yZHMgPSAwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4qIG5vbnplcm9Db29yZHMgPSAwKQoreworICBlbnVtIHsgSXNSb3dNYWpvciA9IER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyLE9wdDIsSW5kZXg+OjpJc1Jvd01ham9yIH07CisgIHNwYXJzZU1hdC5zZXRaZXJvKCk7CisgIHNwYXJzZU1hdC5yZXNlcnZlKGludChyZWZNYXQucm93cygpKnJlZk1hdC5jb2xzKCkqZGVuc2l0eSkpOworICBmb3IoaW50IGo9MDsgajxzcGFyc2VNYXQub3V0ZXJTaXplKCk7IGorKykKKyAgeworICAgIHNwYXJzZU1hdC5zdGFydFZlYyhqKTsgLy8gbm90IG5lZWRlZCBmb3IgRHluYW1pY1NwYXJzZU1hdHJpeAorICAgIGZvcihpbnQgaT0wOyBpPHNwYXJzZU1hdC5pbm5lclNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgIGludCBhaShpKSwgYWooaik7CisgICAgICBpZihJc1Jvd01ham9yKQorICAgICAgICBzdGQ6OnN3YXAoYWksYWopOworICAgICAgU2NhbGFyIHYgPSAoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsMSkgPCBkZW5zaXR5KSA/IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpIDogU2NhbGFyKDApOworICAgICAgaWYgKChmbGFncyZGb3JjZU5vblplcm9EaWFnKSAmJiAoaT09aikpCisgICAgICB7CisgICAgICAgIHYgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSpTY2FsYXIoMy4pOworICAgICAgICB2ID0gdip2ICsgU2NhbGFyKDUuKTsKKyAgICAgIH0KKyAgICAgIGlmICgoZmxhZ3MgJiBNYWtlTG93ZXJUcmlhbmd1bGFyKSAmJiBhaj5haSkKKyAgICAgICAgdiA9IFNjYWxhcigwKTsKKyAgICAgIGVsc2UgaWYgKChmbGFncyAmIE1ha2VVcHBlclRyaWFuZ3VsYXIpICYmIGFqPGFpKQorICAgICAgICB2ID0gU2NhbGFyKDApOworCisgICAgICBpZiAoKGZsYWdzJkZvcmNlUmVhbERpYWcpICYmIChpPT1qKSkKKyAgICAgICAgdiA9IGludGVybmFsOjpyZWFsKHYpOworCisgICAgICBpZiAodiE9U2NhbGFyKDApKQorICAgICAgeworICAgICAgICBzcGFyc2VNYXQuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihqLGkpID0gdjsKKyAgICAgICAgaWYgKG5vbnplcm9Db29yZHMpCisgICAgICAgICAgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKFZlY3RvcjJpKGFpLGFqKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICh6ZXJvQ29vcmRzKQorICAgICAgeworICAgICAgICB6ZXJvQ29vcmRzLT5wdXNoX2JhY2soVmVjdG9yMmkoYWksYWopKTsKKyAgICAgIH0KKyAgICAgIHJlZk1hdChhaSxhaikgPSB2OworICAgIH0KKyAgfQorICBzcGFyc2VNYXQuZmluYWxpemUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkCitpbml0U3BhcnNlKGRvdWJsZSBkZW5zaXR5LAorICAgICAgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4mIHJlZlZlYywKKyAgICAgICAgICAgU3BhcnNlVmVjdG9yPFNjYWxhcj4mIHNwYXJzZVZlYywKKyAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiogemVyb0Nvb3JkcyA9IDAsCisgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIG5vbnplcm9Db29yZHMgPSAwKQoreworICBzcGFyc2VWZWMucmVzZXJ2ZShpbnQocmVmVmVjLnNpemUoKSpkZW5zaXR5KSk7CisgIHNwYXJzZVZlYy5zZXRaZXJvKCk7CisgIGZvcihpbnQgaT0wOyBpPHJlZlZlYy5zaXplKCk7IGkrKykKKyAgeworICAgIFNjYWxhciB2ID0gKGludGVybmFsOjpyYW5kb208ZG91YmxlPigwLDEpIDwgZGVuc2l0eSkgPyBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSA6IFNjYWxhcigwKTsKKyAgICBpZiAodiE9U2NhbGFyKDApKQorICAgIHsKKyAgICAgIHNwYXJzZVZlYy5pbnNlcnRCYWNrKGkpID0gdjsKKyAgICAgIGlmIChub256ZXJvQ29vcmRzKQorICAgICAgICBub256ZXJvQ29vcmRzLT5wdXNoX2JhY2soaSk7CisgICAgfQorICAgIGVsc2UgaWYgKHplcm9Db29yZHMpCisgICAgICAgIHplcm9Db29yZHMtPnB1c2hfYmFjayhpKTsKKyAgICByZWZWZWNbaV0gPSB2OworICB9Cit9CisKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9TcGFyc2VFeHRyYT4KKyNlbmRpZiAvLyBFSUdFTl9URVNUU1BBUlNFX0gKZGlmZiAtLWdpdCBhL3Rlc3Qvc3BhcnNlX2Jhc2ljLmNwcCBiL3Rlc3Qvc3BhcnNlX2Jhc2ljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk3YTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcGFyc2VfYmFzaWMuY3BwCkBAIC0wLDAgKzEsMzk1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDA4IERhbmllbCBHb21leiBGZXJybyA8ZGdvbWV6ZmVycm9AZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgInNwYXJzZS5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlPiB2b2lkIHNwYXJzZV9iYXNpYyhjb25zdCBTcGFyc2VNYXRyaXhUeXBlJiByZWYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisKKyAgY29uc3QgSW5kZXggcm93cyA9IHJlZi5yb3dzKCk7CisgIGNvbnN0IEluZGV4IGNvbHMgPSByZWYuY29scygpOworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIGVudW0geyBGbGFncyA9IFNwYXJzZU1hdHJpeFR5cGU6OkZsYWdzIH07CisKKyAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguLyhyb3dzKmNvbHMpLCAwLjAxKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IERlbnNlVmVjdG9yOworICBTY2FsYXIgZXBzID0gMWUtNjsKKworICBTcGFyc2VNYXRyaXhUeXBlIG0ocm93cywgY29scyk7CisgIERlbnNlTWF0cml4IHJlZk1hdCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICBEZW5zZVZlY3RvciB2ZWMxID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKTsKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHplcm9Db29yZHM7CisgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiBub256ZXJvQ29vcmRzOworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0LCBtLCAwLCAmemVyb0Nvb3JkcywgJm5vbnplcm9Db29yZHMpOworCisgIGlmICh6ZXJvQ29vcmRzLnNpemUoKT09MCB8fCBub256ZXJvQ29vcmRzLnNpemUoKT09MCkKKyAgICByZXR1cm47CisKKyAgLy8gdGVzdCBjb2VmZiBhbmQgY29lZmZSZWYKKyAgZm9yIChpbnQgaT0wOyBpPChpbnQpemVyb0Nvb3Jkcy5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggbS5jb2VmZih6ZXJvQ29vcmRzW2ldLngoKSx6ZXJvQ29vcmRzW2ldLnkoKSksIGVwcyApOworICAgIGlmKGludGVybmFsOjppc19zYW1lPFNwYXJzZU1hdHJpeFR5cGUsU3BhcnNlTWF0cml4PFNjYWxhcixGbGFncz4gPjo6dmFsdWUpCisgICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbS5jb2VmZlJlZih6ZXJvQ29vcmRzWzBdLngoKSx6ZXJvQ29vcmRzWzBdLnkoKSkgPSA1ICk7CisgIH0KKyAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOworCisgIG0uY29lZmZSZWYobm9uemVyb0Nvb3Jkc1swXS54KCksIG5vbnplcm9Db29yZHNbMF0ueSgpKSA9IFNjYWxhcig1KTsKKyAgcmVmTWF0LmNvZWZmUmVmKG5vbnplcm9Db29yZHNbMF0ueCgpLCBub256ZXJvQ29vcmRzWzBdLnkoKSkgPSBTY2FsYXIoNSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOworICAvKgorICAvLyB0ZXN0IElubmVySXRlcmF0b3JzIGFuZCBCbG9jayBleHByZXNzaW9ucworICBmb3IgKGludCB0PTA7IHQ8MTA7ICsrdCkKKyAgeworICAgIGludCBqID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKTsKKyAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSk7CisgICAgaW50IHcgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxjb2xzLWotMSk7CisgICAgaW50IGggPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxyb3dzLWktMSk7CisKKy8vICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSxqLGgsdyksIHJlZk1hdC5ibG9jayhpLGosaCx3KSk7CisgICAgZm9yKGludCBjPTA7IGM8dzsgYysrKQorICAgIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jayhpLGosaCx3KS5jb2woYyksIHJlZk1hdC5ibG9jayhpLGosaCx3KS5jb2woYykpOworICAgICAgZm9yKGludCByPTA7IHI8aDsgcisrKQorICAgICAgeworLy8gICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSxqLGgsdykuY29sKGMpLmNvZWZmKHIpLCByZWZNYXQuYmxvY2soaSxqLGgsdykuY29sKGMpLmNvZWZmKHIpKTsKKyAgICAgIH0KKyAgICB9CisvLyAgICAgZm9yKGludCByPTA7IHI8aDsgcisrKQorLy8gICAgIHsKKy8vICAgICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jayhpLGosaCx3KS5yb3cociksIHJlZk1hdC5ibG9jayhpLGosaCx3KS5yb3cocikpOworLy8gICAgICAgZm9yKGludCBjPTA7IGM8dzsgYysrKQorLy8gICAgICAgeworLy8gICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSxqLGgsdykucm93KHIpLmNvZWZmKGMpLCByZWZNYXQuYmxvY2soaSxqLGgsdykucm93KHIpLmNvZWZmKGMpKTsKKy8vICAgICAgIH0KKy8vICAgICB9CisgIH0KKworICBmb3IoaW50IGM9MDsgYzxjb2xzOyBjKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0uY29sKGMpICsgbS5jb2woYyksIChtICsgbSkuY29sKGMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0uY29sKGMpICsgbS5jb2woYyksIHJlZk1hdC5jb2woYykgKyByZWZNYXQuY29sKGMpKTsKKyAgfQorCisgIGZvcihpbnQgcj0wOyByPHJvd3M7IHIrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1gobS5yb3cocikgKyBtLnJvdyhyKSwgKG0gKyBtKS5yb3cocikpOworICAgIFZFUklGWV9JU19BUFBST1gobS5yb3cocikgKyBtLnJvdyhyKSwgcmVmTWF0LnJvdyhyKSArIHJlZk1hdC5yb3cocikpOworICB9CisgICovCisKKyAgICAvLyB0ZXN0IGluc2VydCAoaW5uZXIgcmFuZG9tKQorICAgIHsKKyAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyk7CisgICAgICBtMS5zZXRaZXJvKCk7CisgICAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsY29scyk7CisgICAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGludD4oKSUyKQorICAgICAgICBtMi5yZXNlcnZlKFZlY3RvclhpOjpDb25zdGFudChtMi5vdXRlclNpemUoKSwgMikpOworICAgICAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKKyAgICAgIHsKKyAgICAgICAgZm9yIChpbnQgaz0wOyBrPHJvd3MvMjsgKytrKQorICAgICAgICB7CisgICAgICAgICAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpOworICAgICAgICAgIGlmIChtMS5jb2VmZihpLGopPT1TY2FsYXIoMCkpCisgICAgICAgICAgICBtMi5pbnNlcnQoaSxqKSA9IG0xKGksaikgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbTIuZmluYWxpemUoKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIsbTEpOworICAgIH0KKworICAgIC8vIHRlc3QgaW5zZXJ0IChmdWxseSByYW5kb20pCisgICAgeworICAgICAgRGVuc2VNYXRyaXggbTEocm93cyxjb2xzKTsKKyAgICAgIG0xLnNldFplcm8oKTsKKyAgICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cyxjb2xzKTsKKyAgICAgIGlmKGludGVybmFsOjpyYW5kb208aW50PigpJTIpCisgICAgICAgIG0yLnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KG0yLm91dGVyU2l6ZSgpLCAyKSk7CisgICAgICBmb3IgKGludCBrPTA7IGs8cm93cypjb2xzOyArK2spCisgICAgICB7CisgICAgICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgICAgICAgaW50IGogPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpOworICAgICAgICBpZiAoKG0xLmNvZWZmKGksaik9PVNjYWxhcigwKSkgJiYgKGludGVybmFsOjpyYW5kb208aW50PigpJTIpKQorICAgICAgICAgIG0yLmluc2VydChpLGopID0gbTEoaSxqKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBTY2FsYXIgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICAgIG0yLmNvZWZmUmVmKGksaikgKz0gdjsKKyAgICAgICAgICBtMShpLGopICs9IHY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIsbTEpOworICAgIH0KKyAgICAKKyAgICAvLyB0ZXN0IGluc2VydCAodW4tY29tcHJlc3NlZCkKKyAgICBmb3IoaW50IG1vZGU9MDttb2RlPDQ7Kyttb2RlKQorICAgIHsKKyAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyk7CisgICAgICBtMS5zZXRaZXJvKCk7CisgICAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsY29scyk7CisgICAgICBWZWN0b3JYaSByKFZlY3RvclhpOjpDb25zdGFudChtMi5vdXRlclNpemUoKSwgKChtb2RlJTIpPT0wKSA/IG0yLmlubmVyU2l6ZSgpIDogc3RkOjptYXg8aW50PigxLG0yLmlubmVyU2l6ZSgpLzgpKSk7CisgICAgICBtMi5yZXNlcnZlKHIpOworICAgICAgZm9yIChpbnQgaz0wOyBrPHJvd3MqY29sczsgKytrKQorICAgICAgeworICAgICAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSk7CisgICAgICAgIGludCBqID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKTsKKyAgICAgICAgaWYgKG0xLmNvZWZmKGksaik9PVNjYWxhcigwKSkKKyAgICAgICAgICBtMi5pbnNlcnQoaSxqKSA9IG0xKGksaikgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICAgICAgaWYobW9kZT09MykKKyAgICAgICAgICBtMi5yZXNlcnZlKHIpOworICAgICAgfQorICAgICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KCklMikKKyAgICAgICAgbTIubWFrZUNvbXByZXNzZWQoKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIsbTEpOworICAgIH0KKworICAvLyB0ZXN0IGJhc2ljIGNvbXB1dGF0aW9ucworICB7CisgICAgRGVuc2VNYXRyaXggcmVmTTEgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNMiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZk0zID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgRGVuc2VNYXRyaXggcmVmTTQgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0xKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgcm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMyhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG00KHJvd3MsIHJvd3MpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNMSwgbTEpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNMiwgbTIpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNMywgbTMpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNNCwgbTQpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSttMiwgcmVmTTErcmVmTTIpOworICAgIFZFUklGWV9JU19BUFBST1gobTErbTIrbTMsIHJlZk0xK3JlZk0yK3JlZk0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlUHJvZHVjdChtMSttMiksIHJlZk0zLmN3aXNlUHJvZHVjdChyZWZNMStyZWZNMikpOworICAgIFZFUklGWV9JU19BUFBST1gobTEqczEtbTIsIHJlZk0xKnMxLXJlZk0yKTsKKworICAgIFZFUklGWV9JU19BUFBST1gobTEqPXMxLCByZWZNMSo9czEpOworICAgIFZFUklGWV9JU19BUFBST1gobTEvPXMxLCByZWZNMS89czEpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSs9bTIsIHJlZk0xKz1yZWZNMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS09bTIsIHJlZk0xLT1yZWZNMik7CisKKyAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5pbm5lclZlY3RvcigwKS5kb3QocmVmTTIucm93KDApKSwgcmVmTTEucm93KDApLmRvdChyZWZNMi5yb3coMCkpKTsKKyAgICBlbHNlCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmlubmVyVmVjdG9yKDApLmRvdChyZWZNMi5yb3coMCkpLCByZWZNMS5jb2woMCkuZG90KHJlZk0yLnJvdygwKSkpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb25qdWdhdGUoKSwgcmVmTTEuY29uanVnYXRlKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTEucmVhbCgpLCByZWZNMS5yZWFsKCkpOworCisgICAgcmVmTTQuc2V0UmFuZG9tKCk7CisgICAgLy8gc3BhcnNlIGN3aXNlKiBkZW5zZQorICAgIFZFUklGWV9JU19BUFBST1gobTMuY3dpc2VQcm9kdWN0KHJlZk00KSwgcmVmTTMuY3dpc2VQcm9kdWN0KHJlZk00KSk7CisvLyAgICAgVkVSSUZZX0lTX0FQUFJPWChtMy5jd2lzZSgpL3JlZk00LCByZWZNMy5jd2lzZSgpL3JlZk00KTsKKyAgfQorCisgIC8vIHRlc3QgdHJhbnNwb3NlCisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCByb3dzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOworICAgIFZFUklGWV9JU19BUFBST1gobTIudHJhbnNwb3NlKCkuZXZhbCgpLCByZWZNYXQyLnRyYW5zcG9zZSgpLmV2YWwoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi50cmFuc3Bvc2UoKSwgcmVmTWF0Mi50cmFuc3Bvc2UoKSk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKFNwYXJzZU1hdHJpeFR5cGUobTIuYWRqb2ludCgpKSwgcmVmTWF0Mi5hZGpvaW50KCkpOworICB9CisKKyAgLy8gdGVzdCBpbm5lclZlY3RvcigpCisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCByb3dzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOworICAgIGludCBqMCA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSk7CisgICAgaW50IGoxID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcihqMCksIHJlZk1hdDIucm93KGowKSk7CisgICAgZWxzZQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcihqMCksIHJlZk1hdDIuY29sKGowKSk7CisKKyAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcihqMCkrbTIuaW5uZXJWZWN0b3IoajEpLCByZWZNYXQyLnJvdyhqMCkrcmVmTWF0Mi5yb3coajEpKTsKKyAgICBlbHNlCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmlubmVyVmVjdG9yKGowKSttMi5pbm5lclZlY3RvcihqMSksIHJlZk1hdDIuY29sKGowKStyZWZNYXQyLmNvbChqMSkpOworCisgICAgU3BhcnNlTWF0cml4VHlwZSBtMyhyb3dzLHJvd3MpOworICAgIG0zLnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KHJvd3Mscm93cy8yKSk7CisgICAgZm9yKGludCBqPTA7IGo8cm93czsgKytqKQorICAgICAgZm9yKGludCBrPTA7IGs8ajsgKytrKQorICAgICAgICBtMy5pbnNlcnRCeU91dGVySW5uZXIoaixrKSA9IGsrMTsKKyAgICBmb3IoaW50IGo9MDsgajxyb3dzOyArK2opCisgICAgeworICAgICAgVkVSSUZZKGo9PWludGVybmFsOjpyZWFsKG0zLmlubmVyVmVjdG9yKGopLm5vblplcm9zKCkpKTsKKyAgICAgIGlmKGo+MCkKKyAgICAgICAgVkVSSUZZKGo9PWludGVybmFsOjpyZWFsKG0zLmlubmVyVmVjdG9yKGopLmxhc3RDb2VmZigpKSk7CisgICAgfQorICAgIG0zLm1ha2VDb21wcmVzc2VkKCk7CisgICAgZm9yKGludCBqPTA7IGo8cm93czsgKytqKQorICAgIHsKKyAgICAgIFZFUklGWShqPT1pbnRlcm5hbDo6cmVhbChtMy5pbm5lclZlY3RvcihqKS5ub25aZXJvcygpKSk7CisgICAgICBpZihqPjApCisgICAgICAgIFZFUklGWShqPT1pbnRlcm5hbDo6cmVhbChtMy5pbm5lclZlY3RvcihqKS5sYXN0Q29lZmYoKSkpOworICAgIH0KKworICAgIC8vbTIuaW5uZXJWZWN0b3IoajApID0gMiptMi5pbm5lclZlY3RvcihqMSk7CisgICAgLy9yZWZNYXQyLmNvbChqMCkgPSAyKnJlZk1hdDIuY29sKGoxKTsKKyAgICAvL1ZFUklGWV9JU19BUFBST1gobTIsIHJlZk1hdDIpOworICB9CisKKyAgLy8gdGVzdCBpbm5lclZlY3RvcnMoKQorICB7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0MiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgcm93cyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yKTsKKyAgICBpbnQgajAgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTIpOworICAgIGludCBqMSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMik7CisgICAgaW50IG4wID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEscm93cy0oc3RkOjptYXgpKGowLGoxKSk7CisgICAgaWYoU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3JzKGowLG4wKSwgcmVmTWF0Mi5ibG9jayhqMCwwLG4wLGNvbHMpKTsKKyAgICBlbHNlCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmlubmVyVmVjdG9ycyhqMCxuMCksIHJlZk1hdDIuYmxvY2soMCxqMCxyb3dzLG4wKSk7CisgICAgaWYoU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3JzKGowLG4wKSttMi5pbm5lclZlY3RvcnMoajEsbjApLAorICAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDIuYmxvY2soajAsMCxuMCxjb2xzKStyZWZNYXQyLmJsb2NrKGoxLDAsbjAsY29scykpOworICAgIGVsc2UKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3JzKGowLG4wKSttMi5pbm5lclZlY3RvcnMoajEsbjApLAorICAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDIuYmxvY2soMCxqMCxyb3dzLG4wKStyZWZNYXQyLmJsb2NrKDAsajEscm93cyxuMCkpOworICAgIC8vbTIuaW5uZXJWZWN0b3JzKGowLG4wKSA9IG0yLmlubmVyVmVjdG9ycyhqMCxuMCkgKyBtMi5pbm5lclZlY3RvcnMoajEsbjApOworICAgIC8vcmVmTWF0Mi5ibG9jaygwLGowLHJvd3MsbjApID0gcmVmTWF0Mi5ibG9jaygwLGowLHJvd3MsbjApICsgcmVmTWF0Mi5ibG9jaygwLGoxLHJvd3MsbjApOworICB9CisKKyAgLy8gdGVzdCBwcnVuZQorICB7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNMihyb3dzLCByb3dzKTsKKyAgICByZWZNMi5zZXRaZXJvKCk7CisgICAgaW50IGNvdW50RmFsc2VOb25aZXJvID0gMDsKKyAgICBpbnQgY291bnRUcnVlTm9uWmVybyA9IDA7CisgICAgZm9yIChpbnQgaj0wOyBqPG0yLm91dGVyU2l6ZSgpOyArK2opCisgICAgeworICAgICAgbTIuc3RhcnRWZWMoaik7CisgICAgICBmb3IgKGludCBpPTA7IGk8bTIuaW5uZXJTaXplKCk7ICsraSkKKyAgICAgIHsKKyAgICAgICAgZmxvYXQgeCA9IGludGVybmFsOjpyYW5kb208ZmxvYXQ+KDAsMSk7CisgICAgICAgIGlmICh4PDAuMSkKKyAgICAgICAgeworICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh4PDAuNSkKKyAgICAgICAgeworICAgICAgICAgIGNvdW50RmFsc2VOb25aZXJvKys7CisgICAgICAgICAgbTIuaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihqLGkpID0gU2NhbGFyKDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvdW50VHJ1ZU5vblplcm8rKzsKKyAgICAgICAgICBtMi5pbnNlcnRCYWNrQnlPdXRlcklubmVyKGosaSkgPSBTY2FsYXIoMSk7CisgICAgICAgICAgaWYoU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKKyAgICAgICAgICAgIHJlZk0yKGosaSkgPSBTY2FsYXIoMSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVmTTIoaSxqKSA9IFNjYWxhcigxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBtMi5maW5hbGl6ZSgpOworICAgIFZFUklGWShjb3VudEZhbHNlTm9uWmVybytjb3VudFRydWVOb25aZXJvID09IG0yLm5vblplcm9zKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTIsIHJlZk0yKTsKKyAgICBtMi5wcnVuZShTY2FsYXIoMSkpOworICAgIFZFUklGWShjb3VudFRydWVOb25aZXJvPT1tMi5ub25aZXJvcygpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNMik7CisgIH0KKworICAvLyB0ZXN0IHNldEZyb21UcmlwbGV0cworICB7CisgICAgdHlwZWRlZiBUcmlwbGV0PFNjYWxhcixJbmRleD4gVHJpcGxldFR5cGU7CisgICAgc3RkOjp2ZWN0b3I8VHJpcGxldFR5cGU+IHRyaXBsZXRzOworICAgIGludCBudHJpcGxldHMgPSByb3dzKmNvbHM7CisgICAgdHJpcGxldHMucmVzZXJ2ZShudHJpcGxldHMpOworICAgIERlbnNlTWF0cml4IHJlZk1hdChyb3dzLGNvbHMpOworICAgIHJlZk1hdC5zZXRaZXJvKCk7CisgICAgZm9yKGludCBpPTA7aTxudHJpcGxldHM7KytpKQorICAgIHsKKyAgICAgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKTsKKyAgICAgIGludCBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKTsKKyAgICAgIFNjYWxhciB2ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgICAgICB0cmlwbGV0cy5wdXNoX2JhY2soVHJpcGxldFR5cGUocixjLHYpKTsKKyAgICAgIHJlZk1hdChyLGMpICs9IHY7CisgICAgfQorICAgIFNwYXJzZU1hdHJpeFR5cGUgbShyb3dzLGNvbHMpOworICAgIG0uc2V0RnJvbVRyaXBsZXRzKHRyaXBsZXRzLmJlZ2luKCksIHRyaXBsZXRzLmVuZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sIHJlZk1hdCk7CisgIH0KKworICAvLyB0ZXN0IHRyaWFuZ3VsYXJWaWV3CisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyKHJvd3MsIHJvd3MpLCByZWZNYXQzKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgcm93cyksIG0zKHJvd3MsIHJvd3MpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CisgICAgcmVmTWF0MyA9IHJlZk1hdDIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgICAgbTMgPSBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWZNYXQzKTsKKworICAgIHJlZk1hdDMgPSByZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICAgIG0zID0gbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmTWF0Myk7CisKKyAgICByZWZNYXQzID0gcmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCk7CisgICAgbTMgPSBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmTWF0Myk7CisKKyAgICByZWZNYXQzID0gcmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCk7CisgICAgbTMgPSBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmTWF0Myk7CisgIH0KKyAgCisgIC8vIHRlc3Qgc2VsZmFkam9pbnRWaWV3CisgIGlmKCFTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICB7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0Mihyb3dzLCByb3dzKSwgcmVmTWF0Myhyb3dzLCByb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIHJvd3MpLCBtMyhyb3dzLCByb3dzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOworICAgIHJlZk1hdDMgPSByZWZNYXQyLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgICBtMyA9IG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWZNYXQzKTsKKyAgfQorICAKKyAgLy8gdGVzdCBzcGFyc2VWaWV3CisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCByb3dzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOworICAgIFZFUklGWV9JU19BUFBST1gobTIuZXZhbCgpLCByZWZNYXQyLnNwYXJzZVZpZXcoKS5ldmFsKCkpOworICB9CisKKyAgLy8gdGVzdCBkaWFnb25hbAorICB7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0MiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgcm93cyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmRpYWdvbmFsKCksIHJlZk1hdDIuZGlhZ29uYWwoKS5ldmFsKCkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9zcGFyc2VfYmFzaWMoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCBzID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDUwKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoIHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlPig4LCA4KSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBDb2xNYWpvcj4ocywgcykpICkpOworICAgIENBTExfU1VCVEVTVF8yKCggc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgUm93TWFqb3I+KHMsIHMpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoIHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlPihzLCBzKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZSxDb2xNYWpvcixsb25nIGludD4ocywgcykpICkpOworICAgIENBTExfU1VCVEVTVF8xKCggc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxkb3VibGUsUm93TWFqb3IsbG9uZyBpbnQ+KHMsIHMpKSApKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2VfcGVybXV0YXRpb25zLmNwcCBiL3Rlc3Qvc3BhcnNlX3Blcm11dGF0aW9ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjZTFkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3BhcnNlX3Blcm11dGF0aW9ucy5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgInNwYXJzZS5oIgorCit0ZW1wbGF0ZTxpbnQgT3RoZXJTdG9yYWdlLCB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlPiB2b2lkIHNwYXJzZV9wZXJtdXRhdGlvbnMoY29uc3QgU3BhcnNlTWF0cml4VHlwZSYgcmVmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIGNvbnN0IEluZGV4IHJvd3MgPSByZWYucm93cygpOworICBjb25zdCBJbmRleCBjb2xzID0gcmVmLmNvbHMoKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIE90aGVyU3RvcmFnZSwgSW5kZXg+IE90aGVyU3BhcnNlTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PEluZGV4LER5bmFtaWMsMT4gVmVjdG9ySTsKKyAgCisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8ocm93cypjb2xzKSwgMC4wMSk7CisgIAorICBTcGFyc2VNYXRyaXhUeXBlIG1hdChyb3dzLCBjb2xzKSwgdXAocm93cyxjb2xzKSwgbG8ocm93cyxjb2xzKTsKKyAgT3RoZXJTcGFyc2VNYXRyaXhUeXBlIHJlczsKKyAgRGVuc2VNYXRyaXggbWF0X2QgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKSwgdXBfc3ltX2QsIGxvX3N5bV9kLCByZXNfZDsKKyAgCisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCBtYXRfZCwgbWF0LCAwKTsKKworICB1cCA9IG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgbG8gPSBtYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgIAorICB1cF9zeW1fZCA9IG1hdF9kLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgbG9fc3ltX2QgPSBtYXRfZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKG1hdCwgbWF0X2QpOworICBWRVJJRllfSVNfQVBQUk9YKHVwLCBEZW5zZU1hdHJpeChtYXRfZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKGxvLCBEZW5zZU1hdHJpeChtYXRfZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSkpOworICAKKyAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYz4gcCwgcF9udWxsOworICBWZWN0b3JJIHBpOworICByYW5kb21QZXJtdXRhdGlvblZlY3RvcihwaSwgY29scyk7CisgIHAuaW5kaWNlcygpID0gcGk7CisKKyAgcmVzID0gbWF0KnA7CisgIHJlc19kID0gbWF0X2QqcDsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgIm1hdCpwIik7CisKKyAgcmVzID0gcCptYXQ7CisgIHJlc19kID0gcCptYXRfZDsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInAqbWF0Iik7CisKKyAgcmVzID0gbWF0KnAuaW52ZXJzZSgpOworICByZXNfZCA9IG1hdCpwLmludmVyc2UoKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgIm1hdCppbnYocCkiKTsKKworICByZXMgPSBwLmludmVyc2UoKSptYXQ7CisgIHJlc19kID0gcC5pbnZlcnNlKCkqbWF0X2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJpbnYocCkqbWF0Iik7CisKKyAgcmVzID0gbWF0LnR3aXN0ZWRCeShwKTsKKyAgcmVzX2QgPSAocCAqIG1hdF9kKSAqIHAuaW52ZXJzZSgpOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAicCptYXQqaW52KHApIik7CisKKyAgCisgIHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkudHdpc3RlZEJ5KHBfbnVsbCk7CisgIHJlc19kID0gdXBfc3ltX2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJmdWxsIHNlbGZhZGpvaW50IHVwcGVyIHRvIGZ1bGwiKTsKKyAgCisgIHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHBfbnVsbCk7CisgIHJlc19kID0gbG9fc3ltX2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJmdWxsIHNlbGZhZGpvaW50IGxvd2VyIHRvIGZ1bGwiKTsKKyAgCisgIAorICByZXMgPSB1cC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkudHdpc3RlZEJ5KHBfbnVsbCk7CisgIHJlc19kID0gdXBfc3ltX2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJ1cHBlciBzZWxmYWRqb2ludCB0byBmdWxsIik7CisgIAorICByZXMgPSBsby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHBfbnVsbCk7CisgIHJlc19kID0gbG9fc3ltX2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJsb3dlciBzZWxmYWRqb2ludCBmdWxsIik7CisKKworICByZXMgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOworICByZXNfZCA9IHVwX3N5bV9kOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCB1cHBlciB0byBmdWxsIik7CisKKyAgcmVzID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgcmVzX2QgPSBsb19zeW1fZDsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdG8gZnVsbCIpOworCisgIHJlcyA9IHVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgcmVzX2QgPSB1cF9zeW1fZDsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInVwcGVyIHNlbGZhZGpvaW50IHRvIGZ1bGwiKTsKKworICByZXMgPSBsby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CisgIHJlc19kID0gbG9fc3ltX2Q7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJsb3dlciBzZWxmYWRqb2ludCBmdWxsIik7CisKKworICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgcmVzX2QgPSB1cF9zeW1fZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgdXBwZXIgdG8gdXBwZXIiKTsKKworICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKKyAgcmVzX2QgPSB1cF9zeW1fZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgdXBwZXIgdG8gbG93ZXIiKTsKKworICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgcmVzX2QgPSBsb19zeW1fZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdG8gdXBwZXIiKTsKKworICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgcmVzX2QgPSBsb19zeW1fZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdG8gbG93ZXIiKTsKKworICAKKyAgCisgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwKTsKKyAgcmVzX2QgPSAoKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCB1cHBlciB0d2lzdGVkIHRvIHVwcGVyIik7CisgIAorICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS50d2lzdGVkQnkocCk7CisgIHJlc19kID0gKChwICogbG9fc3ltX2QpICogcC5pbnZlcnNlKCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdHdpc3RlZCB0byB1cHBlciIpOworICAKKyAgcmVzLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHApOworICByZXNfZCA9ICgocCAqIGxvX3N5bV9kKSAqIHAuaW52ZXJzZSgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJmdWxsIHNlbGZhZGpvaW50IGxvd2VyIHR3aXN0ZWQgdG8gbG93ZXIiKTsKKyAgCisgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwKTsKKyAgcmVzX2QgPSAoKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCB1cHBlciB0d2lzdGVkIHRvIGxvd2VyIik7CisgIAorICAKKyAgcmVzLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSA9IHVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCk7CisgIHJlc19kID0gKChwICogdXBfc3ltX2QpICogcC5pbnZlcnNlKCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInVwcGVyIHNlbGZhZGpvaW50IHR3aXN0ZWQgdG8gdXBwZXIiKTsKKyAgCisgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBsby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHApOworICByZXNfZCA9ICgocCAqIGxvX3N5bV9kKSAqIHAuaW52ZXJzZSgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJsb3dlciBzZWxmYWRqb2ludCB0d2lzdGVkIHRvIHVwcGVyIik7CisgIAorICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gbG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKTsKKyAgcmVzX2QgPSAoKHAgKiBsb19zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAibG93ZXIgc2VsZmFkam9pbnQgdHdpc3RlZCB0byBsb3dlciIpOworICAKKyAgcmVzLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSA9IHVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCk7CisgIHJlc19kID0gKChwICogdXBfc3ltX2QpICogcC5pbnZlcnNlKCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInVwcGVyIHNlbGZhZGpvaW50IHR3aXN0ZWQgdG8gbG93ZXIiKTsKKworICAKKyAgcmVzID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCk7CisgIHJlc19kID0gKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgdXBwZXIgdHdpc3RlZCB0byBmdWxsIik7CisgIAorICByZXMgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKTsKKyAgcmVzX2QgPSAocCAqIGxvX3N5bV9kKSAqIHAuaW52ZXJzZSgpOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCBsb3dlciB0d2lzdGVkIHRvIGZ1bGwiKTsKKyAgCisgIHJlcyA9IHVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCk7CisgIHJlc19kID0gKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKTsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInVwcGVyIHNlbGZhZGpvaW50IHR3aXN0ZWQgdG8gZnVsbCIpOworICAKKyAgcmVzID0gbG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKTsKKyAgcmVzX2QgPSAocCAqIGxvX3N5bV9kKSAqIHAuaW52ZXJzZSgpOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAibG93ZXIgc2VsZmFkam9pbnQgdHdpc3RlZCB0byBmdWxsIik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBzcGFyc2VfcGVybXV0YXRpb25zX2FsbChpbnQgc2l6ZSkKK3sKKyAgQ0FMTF9TVUJURVNUKCggc3BhcnNlX3Blcm11dGF0aW9uczxDb2xNYWpvcj4oU3BhcnNlTWF0cml4PFNjYWxhciwgQ29sTWFqb3I+KHNpemUsc2l6ZSkpICkpOworICBDQUxMX1NVQlRFU1QoKCBzcGFyc2VfcGVybXV0YXRpb25zPENvbE1ham9yPihTcGFyc2VNYXRyaXg8U2NhbGFyLCBSb3dNYWpvcj4oc2l6ZSxzaXplKSkgKSk7CisgIENBTExfU1VCVEVTVCgoIHNwYXJzZV9wZXJtdXRhdGlvbnM8Um93TWFqb3I+KFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yPihzaXplLHNpemUpKSApKTsKKyAgQ0FMTF9TVUJURVNUKCggc3BhcnNlX3Blcm11dGF0aW9uczxSb3dNYWpvcj4oU3BhcnNlTWF0cml4PFNjYWxhciwgUm93TWFqb3I+KHNpemUsc2l6ZSkpICkpOworfQorCit2b2lkIHRlc3Rfc3BhcnNlX3Blcm11dGF0aW9ucygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgaW50IHMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsNTApOworICAgIENBTExfU1VCVEVTVF8xKCggIHNwYXJzZV9wZXJtdXRhdGlvbnNfYWxsPGRvdWJsZT4ocykgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKCAgc3BhcnNlX3Blcm11dGF0aW9uc19hbGw8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihzKSApKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2VfcHJvZHVjdC5jcHAgYi90ZXN0L3NwYXJzZV9wcm9kdWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2E5NTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zcGFyc2VfcHJvZHVjdC5jcHAKQEAgLTAsMCArMSwyMDQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlLmgiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGUsIHR5cGVuYW1lIERlbnNlTWF0cml4LCBib29sIElzUm93TWFqb3I9U3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcj4gc3RydWN0IHRlc3Rfb3V0ZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGUsIHR5cGVuYW1lIERlbnNlTWF0cml4PiBzdHJ1Y3QgdGVzdF9vdXRlcjxTcGFyc2VNYXRyaXhUeXBlLERlbnNlTWF0cml4LGZhbHNlPiB7CisgIHN0YXRpYyB2b2lkIHJ1bihTcGFyc2VNYXRyaXhUeXBlJiBtMiwgU3BhcnNlTWF0cml4VHlwZSYgbTQsIERlbnNlTWF0cml4JiByZWZNYXQyLCBEZW5zZU1hdHJpeCYgcmVmTWF0NCkgeworICAgIGludCBjICA9IGludGVybmFsOjpyYW5kb20oMCxtMi5jb2xzKCktMSk7CisgICAgaW50IGMxID0gaW50ZXJuYWw6OnJhbmRvbSgwLG0yLmNvbHMoKS0xKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00PW0yLmNvbChjKSpyZWZNYXQyLmNvbChjMSkudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0Mi5jb2woYykqcmVmTWF0Mi5jb2woYzEpLnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00PXJlZk1hdDIuY29sKGMxKSptMi5jb2woYykudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0Mi5jb2woYzEpKnJlZk1hdDIuY29sKGMpLnRyYW5zcG9zZSgpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZSwgdHlwZW5hbWUgRGVuc2VNYXRyaXg+IHN0cnVjdCB0ZXN0X291dGVyPFNwYXJzZU1hdHJpeFR5cGUsRGVuc2VNYXRyaXgsdHJ1ZT4geworICBzdGF0aWMgdm9pZCBydW4oU3BhcnNlTWF0cml4VHlwZSYgbTIsIFNwYXJzZU1hdHJpeFR5cGUmIG00LCBEZW5zZU1hdHJpeCYgcmVmTWF0MiwgRGVuc2VNYXRyaXgmIHJlZk1hdDQpIHsKKyAgICBpbnQgciAgPSBpbnRlcm5hbDo6cmFuZG9tKDAsbTIucm93cygpLTEpOworICAgIGludCBjMSA9IGludGVybmFsOjpyYW5kb20oMCxtMi5jb2xzKCktMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND1tMi5yb3cocikudHJhbnNwb3NlKCkqcmVmTWF0Mi5jb2woYzEpLnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIucm93KHIpLnRyYW5zcG9zZSgpKnJlZk1hdDIuY29sKGMxKS50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND1yZWZNYXQyLmNvbChjMSkqbTIucm93KHIpLCByZWZNYXQ0PXJlZk1hdDIuY29sKGMxKSpyZWZNYXQyLnJvdyhyKSk7CisgIH0KK307CisKKy8vIChtMixtNCxyZWZNYXQyLHJlZk1hdDQsZHYxKTsKKy8vICAgICBWRVJJRllfSVNfQVBQUk9YKG00PW0yLmlubmVyVmVjdG9yKGMpKmR2MS50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyLmNvbFZlY3RvcihjKSpkdjEudHJhbnNwb3NlKCkpOworLy8gICAgIFZFUklGWV9JU19BUFBST1gobTQ9ZHYxKm1jbS5jb2woYykudHJhbnNwb3NlKCksIHJlZk1hdDQ9ZHYxKnJlZk1hdDIuY29sKGMpLnRyYW5zcG9zZSgpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZT4gdm9pZCBzcGFyc2VfcHJvZHVjdCgpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIEluZGV4IG4gPSAxMDA7CisgIGNvbnN0IEluZGV4IHJvd3MgID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbik7CisgIGNvbnN0IEluZGV4IGNvbHMgID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbik7CisgIGNvbnN0IEluZGV4IGRlcHRoID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbik7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7IEZsYWdzID0gU3BhcnNlTWF0cml4VHlwZTo6RmxhZ3MgfTsKKworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMDEpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7CisKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIFNjYWxhciBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworCisgIC8vIHRlc3QgbWF0cml4LW1hdHJpeCBwcm9kdWN0CisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyICA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGRlcHRoKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQydCA9IERlbnNlTWF0cml4OjpaZXJvKGRlcHRoLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQzICA9IERlbnNlTWF0cml4OjpaZXJvKGRlcHRoLCBjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQzdCA9IERlbnNlTWF0cml4OjpaZXJvKGNvbHMsIGRlcHRoKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQ0ICA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICAgIERlbnNlTWF0cml4IHJlZk1hdDR0ID0gRGVuc2VNYXRyaXg6Olplcm8oY29scywgcm93cyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0NSAgPSBEZW5zZU1hdHJpeDo6UmFuZG9tKGRlcHRoLCBjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQ2ICA9IERlbnNlTWF0cml4OjpSYW5kb20ocm93cywgcm93cyk7CisgICAgRGVuc2VNYXRyaXggZG00ID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisvLyAgICAgRGVuc2VWZWN0b3IgZHYxID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yIChyb3dzLCBkZXB0aCk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMnQoZGVwdGgsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTMgKGRlcHRoLCBjb2xzKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0zdChjb2xzLCBkZXB0aCk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtNCAocm93cywgY29scyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtNHQoY29scywgcm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtNihyb3dzLCByb3dzKTsKKyAgICBpbml0U3BhcnNlKGRlbnNpdHksIHJlZk1hdDIsICBtMik7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQydCwgbTJ0KTsKKyAgICBpbml0U3BhcnNlKGRlbnNpdHksIHJlZk1hdDMsICBtMyk7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQzdCwgbTN0KTsKKyAgICBpbml0U3BhcnNlKGRlbnNpdHksIHJlZk1hdDQsICBtNCk7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQ0dCwgbTR0KTsKKyAgICBpbml0U3BhcnNlKGRlbnNpdHksIHJlZk1hdDYsIG02KTsKKworLy8gICAgIGludCBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsZGVwdGgtMSk7CisKKyAgICAvLyBzcGFyc2UgKiBzcGFyc2UKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00PW0yKm0zLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND1tMnQudHJhbnNwb3NlKCkqbTMsIHJlZk1hdDQ9cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND1tMnQudHJhbnNwb3NlKCkqbTN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00PW0yKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKworICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBtMiptMy9zMSwgcmVmTWF0NCA9IHJlZk1hdDIqcmVmTWF0My9zMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IG0yKm0zKnMxLCByZWZNYXQ0ID0gcmVmTWF0MipyZWZNYXQzKnMxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gczIqbTIqbTMqczEsIHJlZk1hdDQgPSBzMipyZWZNYXQyKnJlZk1hdDMqczEpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtND0obTIqbTMpLnBydW5lZCgwKSwgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gobTQ9KG0ydC50cmFuc3Bvc2UoKSptMykucHJ1bmVkKDApLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gobTQ9KG0ydC50cmFuc3Bvc2UoKSptM3QudHJhbnNwb3NlKCkpLnBydW5lZCgwKSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND0obTIqbTN0LnRyYW5zcG9zZSgpKS5wcnVuZWQoMCksIHJlZk1hdDQ9cmVmTWF0MipyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisKKyAgICAvLyB0ZXN0IGFsaWFzaW5nCisgICAgbTQgPSBtMjsgcmVmTWF0NCA9IHJlZk1hdDI7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtND1tNCptMywgcmVmTWF0ND1yZWZNYXQ0KnJlZk1hdDMpOworCisgICAgLy8gc3BhcnNlICogZGVuc2UKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1tMipyZWZNYXQzLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTIqcmVmTWF0M3QudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0MipyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMsIHJlZk1hdDQ9cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTJ0LnRyYW5zcG9zZSgpKnJlZk1hdDN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKworICAgIFZFUklGWV9JU19BUFBST1goZG00PW0yKihyZWZNYXQzK3JlZk1hdDMpLCByZWZNYXQ0PXJlZk1hdDIqKHJlZk1hdDMrcmVmTWF0MykpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PW0ydC50cmFuc3Bvc2UoKSoocmVmTWF0MytyZWZNYXQ1KSowLjUsIHJlZk1hdDQ9cmVmTWF0MnQudHJhbnNwb3NlKCkqKHJlZk1hdDMrcmVmTWF0NSkqMC41KTsKKworICAgIC8vIGRlbnNlICogc3BhcnNlCisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9cmVmTWF0MiptMywgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PXJlZk1hdDIqbTN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0M3QudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKm0zLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisKKyAgICAvLyBzcGFyc2UgKiBkZW5zZSBhbmQgZGVuc2UgKiBzcGFyc2Ugb3V0ZXIgcHJvZHVjdAorICAgIHRlc3Rfb3V0ZXI8U3BhcnNlTWF0cml4VHlwZSxEZW5zZU1hdHJpeD46OnJ1bihtMixtNCxyZWZNYXQyLHJlZk1hdDQpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtNj1tNiptNiwgcmVmTWF0Nj1yZWZNYXQ2KnJlZk1hdDYpOworICB9CisKKyAgLy8gdGVzdCBtYXRyaXggLSBkaWFnb25hbCBwcm9kdWN0CisgIHsKKyAgICBEZW5zZU1hdHJpeCByZWZNMiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZk0zID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLER5bmFtaWM+IGQxKERlbnNlVmVjdG9yOjpSYW5kb20ocm93cykpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgcm93cyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMyhyb3dzLCByb3dzKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTTIsIG0yKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTTMsIG0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zPW0yKmQxLCByZWZNMz1yZWZNMipkMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMz1tMi50cmFuc3Bvc2UoKSpkMSwgcmVmTTM9cmVmTTIudHJhbnNwb3NlKCkqZDEpOworICAgIFZFUklGWV9JU19BUFBST1gobTM9ZDEqbTIsIHJlZk0zPWQxKnJlZk0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zPWQxKm0yLnRyYW5zcG9zZSgpLCByZWZNMz1kMSAqIHJlZk0yLnRyYW5zcG9zZSgpKTsKKyAgfQorCisgIC8vIHRlc3Qgc2VsZiBhZGpvaW50IHByb2R1Y3RzCisgIHsKKyAgICBEZW5zZU1hdHJpeCBiID0gRGVuc2VNYXRyaXg6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCB4ID0gRGVuc2VNYXRyaXg6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZYID0gRGVuc2VNYXRyaXg6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZVcCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZkxvID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CisgICAgRGVuc2VNYXRyaXggcmVmUyA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbVVwKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbUxvKHJvd3MsIHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbVMocm93cywgcm93cyk7CisgICAgZG8geworICAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZlVwLCBtVXAsIEZvcmNlUmVhbERpYWd8LypGb3JjZU5vblplcm9EaWFnfCovTWFrZVVwcGVyVHJpYW5ndWxhcik7CisgICAgfSB3aGlsZSAocmVmVXAuaXNaZXJvKCkpOworICAgIHJlZkxvID0gcmVmVXAuYWRqb2ludCgpOworICAgIG1MbyA9IG1VcC5hZGpvaW50KCk7CisgICAgcmVmUyA9IHJlZlVwICsgcmVmTG87CisgICAgcmVmUy5kaWFnb25hbCgpICo9IDAuNTsKKyAgICBtUyA9IG1VcCArIG1MbzsKKyAgICAvLyBUT0RPIGJlIGFibGUgdG8gYWRkcmVzcyB0aGUgZGlhZ29uYWwuLi4uCisgICAgZm9yIChpbnQgaz0wOyBrPG1TLm91dGVyU2l6ZSgpOyArK2spCisgICAgICBmb3IgKHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobVMsayk7IGl0OyArK2l0KQorICAgICAgICBpZiAoaXQuaW5kZXgoKSA9PSBrKQorICAgICAgICAgIGl0LnZhbHVlUmVmKCkgKj0gMC41OworCisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZTLmFkam9pbnQoKSwgcmVmUyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtUy5hZGpvaW50KCksIG1TKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1TLCByZWZTKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHg9bVMqYiwgcmVmWD1yZWZTKmIpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWCh4PW1VcC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkqYiwgcmVmWD1yZWZTKmIpOworICAgIFZFUklGWV9JU19BUFBST1goeD1tTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKmIsIHJlZlg9cmVmUypiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHg9bVMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyfExvd2VyPigpKmIsIHJlZlg9cmVmUypiKTsKKyAgfQorfQorCisvLyBOZXcgdGVzdCBmb3IgQnVnIGluIFNwYXJzZVRpbWVEZW5zZVByb2R1Y3QKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGUsIHR5cGVuYW1lIERlbnNlTWF0cml4VHlwZT4gdm9pZCBzcGFyc2VfcHJvZHVjdF9yZWdyZXNzaW9uX3Rlc3QoKQoreworICAvLyBUaGlzIGNvZGUgZG9lcyBub3QgY29tcGlsZSB3aXRoIGFmZmxpY3RlZCB2ZXJzaW9ucyBvZiB0aGUgYnVnCisgIFNwYXJzZU1hdHJpeFR5cGUgc20xKDMsMik7CisgIERlbnNlTWF0cml4VHlwZSBtMigyLDIpOworICBzbTEuc2V0WmVybygpOworICBtMi5zZXRaZXJvKCk7CisKKyAgRGVuc2VNYXRyaXhUeXBlIG0zID0gc20xKm0yOworCisKKyAgLy8gVGhpcyBjb2RlIHByb2R1Y2VzIGEgc2VnZmF1bHQgd2l0aCBhZmZsaWN0ZWQgdmVyc2lvbnMgb2YgYW5vdGhlciBTcGFyc2VUaW1lRGVuc2VQcm9kdWN0CisgIC8vIGJ1ZworCisgIFNwYXJzZU1hdHJpeFR5cGUgc20yKDIwMDAwLDIpOworICBzbTIuc2V0WmVybygpOworICBEZW5zZU1hdHJpeFR5cGUgbTQoc20yKm0yKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCBtNCgwLDApLCAwLjAgKTsKK30KKwordm9pZCB0ZXN0X3NwYXJzZV9wcm9kdWN0KCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggKHNwYXJzZV9wcm9kdWN0PFNwYXJzZU1hdHJpeDxkb3VibGUsQ29sTWFqb3I+ID4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggKHNwYXJzZV9wcm9kdWN0PFNwYXJzZU1hdHJpeDxkb3VibGUsUm93TWFqb3I+ID4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggKHNwYXJzZV9wcm9kdWN0PFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgQ29sTWFqb3IgPiA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIChzcGFyc2VfcHJvZHVjdDxTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFJvd01ham9yID4gPigpKSApOworICAgIENBTExfU1VCVEVTVF80KCAoc3BhcnNlX3Byb2R1Y3RfcmVncmVzc2lvbl90ZXN0PFNwYXJzZU1hdHJpeDxkb3VibGUsUm93TWFqb3I+LCBNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4gPigpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9zb2x2ZXIuaCBiL3Rlc3Qvc3BhcnNlX3NvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZmE4NTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NwYXJzZV9zb2x2ZXIuaApAQCAtMCwwICsxLDMwOSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJzcGFyc2UuaCIKKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2VDb3JlPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVuc2VNYXQsIHR5cGVuYW1lIERlbnNlUmhzPgordm9pZCBjaGVja19zcGFyc2Vfc29sdmluZyhTb2x2ZXImIHNvbHZlciwgY29uc3QgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBBLCBjb25zdCBSaHMmIGIsIGNvbnN0IERlbnNlTWF0JiBkQSwgY29uc3QgRGVuc2VSaHMmIGRiKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSBNYXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpTY2FsYXIgU2NhbGFyOworCisgIERlbnNlUmhzIHJlZlggPSBkQS5sdSgpLnNvbHZlKGRiKTsKKworICBSaHMgeChiLnJvd3MoKSwgYi5jb2xzKCkpOworICBSaHMgb2xkYiA9IGI7CisKKyAgc29sdmVyLmNvbXB1dGUoQSk7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogZmFjdG9yaXphdGlvbiBmYWlsZWQgKGNoZWNrX3NwYXJzZV9zb2x2aW5nKVxuIjsKKyAgICBleGl0KDApOworICAgIHJldHVybjsKKyAgfQorICB4ID0gc29sdmVyLnNvbHZlKGIpOworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHNvbHZpbmcgZmFpbGVkXG4iOworICAgIHJldHVybjsKKyAgfQorICBWRVJJRlkob2xkYi5pc0FwcHJveChiKSAmJiAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiB0aGUgcmhzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQhIik7CisKKyAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgCisgIHguc2V0WmVybygpOworICAvLyB0ZXN0IHRoZSBhbmFseXplL2ZhY3Rvcml6ZSBBUEkKKyAgc29sdmVyLmFuYWx5emVQYXR0ZXJuKEEpOworICBzb2x2ZXIuZmFjdG9yaXplKEEpOworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IGZhY3Rvcml6YXRpb24gZmFpbGVkIChjaGVja19zcGFyc2Vfc29sdmluZylcbiI7CisgICAgZXhpdCgwKTsKKyAgICByZXR1cm47CisgIH0KKyAgeCA9IHNvbHZlci5zb2x2ZShiKTsKKyAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiBzb2x2aW5nIGZhaWxlZFxuIjsKKyAgICByZXR1cm47CisgIH0KKyAgVkVSSUZZKG9sZGIuaXNBcHByb3goYikgJiYgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogdGhlIHJocyBzaG91bGQgbm90IGJlIG1vZGlmaWVkISIpOworCisgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgIAorICAvLyB0ZXN0IEJsb2NrIGFzIHRoZSByZXN1bHQgYW5kIHJoczoKKyAgeworICAgIERlbnNlUmhzIHgoZGIucm93cygpLCBkYi5jb2xzKCkpOworICAgIERlbnNlUmhzIGIoZGIpLCBvbGRiKGRiKTsKKyAgICB4LnNldFplcm8oKTsKKyAgICB4LmJsb2NrKDAsMCx4LnJvd3MoKSx4LmNvbHMoKSkgPSBzb2x2ZXIuc29sdmUoYi5ibG9jaygwLDAsYi5yb3dzKCksYi5jb2xzKCkpKTsKKyAgICBWRVJJRlkob2xkYi5pc0FwcHJveChiKSAmJiAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiB0aGUgcmhzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQhIik7CisgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIFJocz4KK3ZvaWQgY2hlY2tfc3BhcnNlX3NvbHZpbmdfcmVhbF9jYXNlcyhTb2x2ZXImIHNvbHZlciwgY29uc3QgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBBLCBjb25zdCBSaHMmIGIsIGNvbnN0IFJocyYgcmVmWCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgCisgIFJocyB4KGIucm93cygpLCBiLmNvbHMoKSk7CisgIAorICBzb2x2ZXIuY29tcHV0ZShBKTsKKyAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiBmYWN0b3JpemF0aW9uIGZhaWxlZCAoY2hlY2tfc3BhcnNlX3NvbHZpbmdfcmVhbF9jYXNlcylcbiI7CisgICAgZXhpdCgwKTsKKyAgICByZXR1cm47CisgIH0KKyAgeCA9IHNvbHZlci5zb2x2ZShiKTsKKyAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiBzb2x2aW5nIGZhaWxlZFxuIjsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIFJlYWxTY2FsYXIgcmVzX2Vycm9yOworICAvLyBDb21wdXRlIHRoZSBub3JtIG9mIHRoZSByZWxhdGl2ZSBlcnJvcgorICBpZihyZWZYLnNpemUoKSAhPSAwKQorICAgIHJlc19lcnJvciA9IChyZWZYIC0geCkubm9ybSgpL3JlZlgubm9ybSgpOworICBlbHNlCisgIHsgCisgICAgLy8gQ29tcHV0ZSB0aGUgcmVsYXRpdmUgcmVzaWR1YWwgbm9ybQorICAgIHJlc19lcnJvciA9IChiIC0gQSAqIHgpLm5vcm0oKS9iLm5vcm0oKTsKKyAgfQorICBpZiAocmVzX2Vycm9yID4gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpICl7CisgICAgc3RkOjpjZXJyIDw8ICJUZXN0ICIgPDwgZ190ZXN0X3N0YWNrLmJhY2soKSA8PCAiIGZhaWxlZCBpbiAiRUlfUFBfTUFLRV9TVFJJTkcoX19GSUxFX18pIAorICAgIDw8ICIgKCIgPDwgRUlfUFBfTUFLRV9TVFJJTkcoX19MSU5FX18pIDw8ICIpIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgIGFib3J0KCk7CisgIH0KKyAgCit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIERlbnNlTWF0Pgordm9pZCBjaGVja19zcGFyc2VfZGV0ZXJtaW5hbnQoU29sdmVyJiBzb2x2ZXIsIGNvbnN0IHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgY29uc3QgRGVuc2VNYXQmIGRBKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSBNYXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOworICAKKyAgc29sdmVyLmNvbXB1dGUoQSk7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogZmFjdG9yaXphdGlvbiBmYWlsZWQgKGNoZWNrX3NwYXJzZV9kZXRlcm1pbmFudClcbiI7CisgICAgcmV0dXJuOworICB9CisKKyAgU2NhbGFyIHJlZkRldCA9IGRBLmRldGVybWluYW50KCk7CisgIFZFUklGWV9JU19BUFBST1gocmVmRGV0LHNvbHZlci5kZXRlcm1pbmFudCgpKTsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIERlbnNlTWF0PgoraW50IGdlbmVyYXRlX3NwYXJzZV9zcGRfcHJvYmxlbShTb2x2ZXImICwgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBBLCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIGhhbGZBLCBEZW5zZU1hdCYgZEEsIGludCBtYXhTaXplID0gMzAwKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSBNYXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKKworICBpbnQgc2l6ZSA9IGludGVybmFsOjpyYW5kb208aW50PigxLG1heFNpemUpOworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHNpemUqc2l6ZSksIDAuMDEpOworCisgIE1hdCBNKHNpemUsIHNpemUpOworICBEZW5zZU1hdHJpeCBkTShzaXplLCBzaXplKTsKKworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZE0sIE0sIEZvcmNlTm9uWmVyb0RpYWcpOworCisgIEEgPSBNICogTS5hZGpvaW50KCk7CisgIGRBID0gZE0gKiBkTS5hZGpvaW50KCk7CisgIAorICBoYWxmQS5yZXNpemUoc2l6ZSxzaXplKTsKKyAgaGFsZkEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFNvbHZlcjo6VXBMbz4oKS5yYW5rVXBkYXRlKE0pOworICAKKyAgcmV0dXJuIHNpemU7Cit9CisKKworI2lmZGVmIFRFU1RfUkVBTF9DQVNFUwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgoraW5saW5lIHN0ZDo6c3RyaW5nIGdldF9tYXRyaXhmb2xkZXIoKQoreworICBzdGQ6OnN0cmluZyBtYXRfZm9sZGVyID0gVEVTVF9SRUFMX0NBU0VTOyAKKyAgaWYoIGludGVybmFsOjppc19zYW1lPFNjYWxhciwgc3RkOjpjb21wbGV4PGZsb2F0PiA+Ojp2YWx1ZSB8fCBpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnZhbHVlICkKKyAgICBtYXRfZm9sZGVyICA9IG1hdF9mb2xkZXIgKyBzdGF0aWNfY2FzdDxzdHJpbmc+KCIvY29tcGxleC8iKTsKKyAgZWxzZQorICAgIG1hdF9mb2xkZXIgPSBtYXRfZm9sZGVyICsgc3RhdGljX2Nhc3Q8c3RyaW5nPigiL3JlYWwvIik7CisgIHJldHVybiBtYXRfZm9sZGVyOworfQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlcj4gdm9pZCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoU29sdmVyJiBzb2x2ZXIpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpJbmRleCBJbmRleDsgCisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcj4gU3BNYXQ7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKworICAvLyBnZW5lcmF0ZSB0aGUgcHJvYmxlbQorICBNYXQgQSwgaGFsZkE7CisgIERlbnNlTWF0cml4IGRBOworICBpbnQgc2l6ZSA9IGdlbmVyYXRlX3NwYXJzZV9zcGRfcHJvYmxlbShzb2x2ZXIsIEEsIGhhbGZBLCBkQSk7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHJpZ2h0IGhhbmQgc2lkZXMKKyAgaW50IHJoc0NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxNik7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8oc2l6ZSpyaHNDb2xzKSwgMC4xKTsKKyAgU3BNYXQgQihzaXplLHJoc0NvbHMpOworICBEZW5zZVZlY3RvciBiID0gRGVuc2VWZWN0b3I6OlJhbmRvbShzaXplKTsKKyAgRGVuc2VNYXRyaXggZEIoc2l6ZSxyaHNDb2xzKTsKKyAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIGRCLCBCLCBGb3JjZU5vblplcm9EaWFnKTsKKyAgCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgICAgIGIsICBkQSwgYik7CisgICAgY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBoYWxmQSwgYiwgIGRBLCBiKTsKKyAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsICAgICBkQiwgZEEsIGRCKTsKKyAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIGhhbGZBLCBkQiwgZEEsIGRCKTsKKyAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsICAgICBCLCAgZEEsIGRCKTsKKyAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIGhhbGZBLCBCLCAgZEEsIGRCKTsKKyAgfQorCisgIC8vIEZpcnN0LCBnZXQgdGhlIGZvbGRlciAKKyNpZmRlZiBURVNUX1JFQUxfQ0FTRVMgIAorICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBmbG9hdD46OnZhbHVlIAorICAgICAgfHwgaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID46OnZhbHVlKQorICAgIHJldHVybiA7CisgIAorICBzdGQ6OnN0cmluZyBtYXRfZm9sZGVyID0gZ2V0X21hdHJpeGZvbGRlcjxTY2FsYXI+KCk7CisgIE1hdHJpeE1hcmtldEl0ZXJhdG9yPFNjYWxhcj4gaXQobWF0X2ZvbGRlcik7CisgIGZvciAoOyBpdDsgKytpdCkKKyAgeworICAgIGlmIChpdC5zeW0oKSA9PSBTUEQpeworICAgICAgTWF0IGhhbGZBOworICAgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYywgRHluYW1pYywgSW5kZXg+IHBudWxsOworICAgICAgaGFsZkEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFNvbHZlcjo6VXBMbz4oKSA9IGl0Lm1hdHJpeCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKS50d2lzdGVkQnkocG51bGwpOworICAgICAgCisgICAgICBzdGQ6OmNvdXQ8PCAiID09PT0gU09MVklORyBXSVRIIE1BVFJJWCAiIDw8IGl0Lm1hdG5hbWUoKSA8PCAiID09PT0gXG4iOworICAgICAgY2hlY2tfc3BhcnNlX3NvbHZpbmdfcmVhbF9jYXNlcyhzb2x2ZXIsIGl0Lm1hdHJpeCgpLCBpdC5yaHMoKSwgaXQucmVmWCgpKTsKKyAgICAgIGNoZWNrX3NwYXJzZV9zb2x2aW5nX3JlYWxfY2FzZXMoc29sdmVyLCBoYWxmQSwgaXQucmhzKCksIGl0LnJlZlgoKSk7CisgICAgfQorICB9CisjZW5kaWYKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyPiB2b2lkIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQoU29sdmVyJiBzb2x2ZXIpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworCisgIC8vIGdlbmVyYXRlIHRoZSBwcm9ibGVtCisgIE1hdCBBLCBoYWxmQTsKKyAgRGVuc2VNYXRyaXggZEE7CisgIGdlbmVyYXRlX3NwYXJzZV9zcGRfcHJvYmxlbShzb2x2ZXIsIEEsIGhhbGZBLCBkQSwgMzApOworICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgY2hlY2tfc3BhcnNlX2RldGVybWluYW50KHNvbHZlciwgQSwgICAgIGRBKTsKKyAgICBjaGVja19zcGFyc2VfZGV0ZXJtaW5hbnQoc29sdmVyLCBoYWxmQSwgZEEgKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIERlbnNlTWF0PgoraW50IGdlbmVyYXRlX3NwYXJzZV9zcXVhcmVfcHJvYmxlbShTb2x2ZXImLCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIERlbnNlTWF0JiBkQSwgaW50IG1heFNpemUgPSAzMDApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworCisgIGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4U2l6ZSk7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8oc2l6ZSpzaXplKSwgMC4wMSk7CisgIAorICBBLnJlc2l6ZShzaXplLHNpemUpOworICBkQS5yZXNpemUoc2l6ZSxzaXplKTsKKworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZEEsIEEsIEZvcmNlTm9uWmVyb0RpYWcpOworICAKKyAgcmV0dXJuIHNpemU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlcj4gdm9pZCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoU29sdmVyJiBzb2x2ZXIpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKworICBpbnQgcmhzQ29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDE2KTsKKworICBNYXQgQTsKKyAgRGVuc2VNYXRyaXggZEE7CisgIGludCBzaXplID0gZ2VuZXJhdGVfc3BhcnNlX3NxdWFyZV9wcm9ibGVtKHNvbHZlciwgQSwgZEEpOworCisgIERlbnNlVmVjdG9yIGIgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHNpemUpOworICBEZW5zZU1hdHJpeCBkQiA9IERlbnNlTWF0cml4OjpSYW5kb20oc2l6ZSxyaHNDb2xzKTsKKyAgQS5tYWtlQ29tcHJlc3NlZCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIGIsICBkQSwgYik7CisgICAgY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCBkQiwgZEEsIGRCKTsKKyAgfQorICAgCisgIC8vIEZpcnN0LCBnZXQgdGhlIGZvbGRlciAKKyNpZmRlZiBURVNUX1JFQUxfQ0FTRVMKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgZmxvYXQ+Ojp2YWx1ZSAKKyAgICAgIHx8IGludGVybmFsOjppc19zYW1lPFNjYWxhciwgc3RkOjpjb21wbGV4PGZsb2F0PiA+Ojp2YWx1ZSkKKyAgICByZXR1cm4gOworICAKKyAgc3RkOjpzdHJpbmcgbWF0X2ZvbGRlciA9IGdldF9tYXRyaXhmb2xkZXI8U2NhbGFyPigpOworICBNYXRyaXhNYXJrZXRJdGVyYXRvcjxTY2FsYXI+IGl0KG1hdF9mb2xkZXIpOworICBmb3IgKDsgaXQ7ICsraXQpCisgIHsKKyAgICBzdGQ6OmNvdXQ8PCAiID09PT0gU09MVklORyBXSVRIIE1BVFJJWCAiIDw8IGl0Lm1hdG5hbWUoKSA8PCAiID09PT0gXG4iOworICAgIGNoZWNrX3NwYXJzZV9zb2x2aW5nX3JlYWxfY2FzZXMoc29sdmVyLCBpdC5tYXRyaXgoKSwgaXQucmhzKCksIGl0LnJlZlgoKSk7CisgIH0KKyNlbmRpZgorCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNvbHZlcj4gdm9pZCBjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KFNvbHZlciYgc29sdmVyKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSBNYXQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKKworICAvLyBnZW5lcmF0ZSB0aGUgcHJvYmxlbQorICBNYXQgQTsKKyAgRGVuc2VNYXRyaXggZEE7CisgIGdlbmVyYXRlX3NwYXJzZV9zcXVhcmVfcHJvYmxlbShzb2x2ZXIsIEEsIGRBLCAzMCk7CisgIEEubWFrZUNvbXByZXNzZWQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgY2hlY2tfc3BhcnNlX2RldGVybWluYW50KHNvbHZlciwgQSwgZEEpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9zb2x2ZXJzLmNwcCBiL3Rlc3Qvc3BhcnNlX3NvbHZlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODg3M2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NwYXJzZV9zb2x2ZXJzLmNwcApAQCAtMCwwICsxLDExMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJzcGFyc2UuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkCitpbml0U1BEKGRvdWJsZSBkZW5zaXR5LAorICAgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4mIHJlZk1hdCwKKyAgICAgICAgU3BhcnNlTWF0cml4PFNjYWxhcj4mIHNwYXJzZU1hdCkKK3sKKyAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGF1eChyZWZNYXQucm93cygpLHJlZk1hdC5jb2xzKCkpOworICBpbml0U3BhcnNlKGRlbnNpdHkscmVmTWF0LHNwYXJzZU1hdCk7CisgIHJlZk1hdCA9IHJlZk1hdCAqIHJlZk1hdC5hZGpvaW50KCk7CisgIGZvciAoaW50IGs9MDsgazwyOyArK2spCisgIHsKKyAgICBpbml0U3BhcnNlKGRlbnNpdHksYXV4LHNwYXJzZU1hdCxGb3JjZU5vblplcm9EaWFnKTsKKyAgICByZWZNYXQgKz0gYXV4ICogYXV4LmFkam9pbnQoKTsKKyAgfQorICBzcGFyc2VNYXQuc2V0WmVybygpOworICBmb3IgKGludCBqPTAgOyBqPHNwYXJzZU1hdC5jb2xzKCk7ICsraikKKyAgICBmb3IgKGludCBpPWogOyBpPHNwYXJzZU1hdC5yb3dzKCk7ICsraSkKKyAgICAgIGlmIChyZWZNYXQoaSxqKSE9U2NhbGFyKDApKQorICAgICAgICBzcGFyc2VNYXQuaW5zZXJ0KGksaikgPSByZWZNYXQoaSxqKTsKKyAgc3BhcnNlTWF0LmZpbmFsaXplKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBzcGFyc2Vfc29sdmVycyhpbnQgcm93cywgaW50IGNvbHMpCit7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8ocm93cypjb2xzKSwgMC4wMSk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgLy8gU2NhbGFyIGVwcyA9IDFlLTY7CisKKyAgRGVuc2VWZWN0b3IgdmVjMSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7CisKKyAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHplcm9Db29yZHM7CisgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiBub256ZXJvQ29vcmRzOworCisgIC8vIHRlc3QgdHJpYW5ndWxhciBzb2x2ZXIKKyAgeworICAgIERlbnNlVmVjdG9yIHZlYzIgPSB2ZWMxLCB2ZWMzID0gdmVjMTsKKyAgICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtMihyb3dzLCBjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisKKyAgICAvLyBsb3dlciAtIGRlbnNlCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHZlYzIpLAorICAgICAgICAgICAgICAgICAgICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUodmVjMykpOworCisgICAgLy8gdXBwZXIgLSBkZW5zZQorICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZ3xNYWtlVXBwZXJUcmlhbmd1bGFyLCAmemVyb0Nvb3JkcywgJm5vbnplcm9Db29yZHMpOworICAgIFZFUklGWV9JU19BUFBST1gocmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh2ZWMyKSwKKyAgICAgICAgICAgICAgICAgICAgIG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKHZlYzMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk1hdDIuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMiksCisgICAgICAgICAgICAgICAgICAgICBtMi5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh2ZWMzKSk7CisgICAgeworICAgICAgU3BhcnNlTWF0cml4PFNjYWxhcj4gY20yKG0yKTsKKyAgICAgIC8vSW5kZXggcm93cywgSW5kZXggY29scywgSW5kZXggbm56LCBJbmRleCogb3V0ZXJJbmRleFB0ciwgSW5kZXgqIGlubmVySW5kZXhQdHIsIFNjYWxhciogdmFsdWVQdHIKKyAgICAgIE1hcHBlZFNwYXJzZU1hdHJpeDxTY2FsYXI+IG1tMihyb3dzLCBjb2xzLCBjbTIubm9uWmVyb3MoKSwgY20yLm91dGVySW5kZXhQdHIoKSwgY20yLmlubmVySW5kZXhQdHIoKSwgY20yLnZhbHVlUHRyKCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKHZlYzIpLAorICAgICAgICAgICAgICAgICAgICAgICBtbTIuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMykpOworICAgIH0KKworICAgIC8vIGxvd2VyIC0gdHJhbnNwb3NlCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKHZlYzIpLAorICAgICAgICAgICAgICAgICAgICAgbTIudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMykpOworCisgICAgLy8gdXBwZXIgLSB0cmFuc3Bvc2UKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIsIEZvcmNlTm9uWmVyb0RpYWd8TWFrZVVwcGVyVHJpYW5ndWxhciwgJnplcm9Db29yZHMsICZub256ZXJvQ29vcmRzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk1hdDIudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUodmVjMiksCisgICAgICAgICAgICAgICAgICAgICBtMi50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZSh2ZWMzKSk7CisKKyAgICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXRCKHJvd3MsIHJvd3MpOworICAgIERlbnNlTWF0cml4IHJlZk1hdEIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCByb3dzKTsKKworICAgIC8vIGxvd2VyIC0gc3BhcnNlCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXRCLCBtYXRCKTsKKyAgICByZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlSW5QbGFjZShyZWZNYXRCKTsKKyAgICBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UobWF0Qik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXRCLnRvRGVuc2UoKSwgcmVmTWF0Qik7CisKKyAgICAvLyB1cHBlciAtIHNwYXJzZQorICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZ3xNYWtlVXBwZXJUcmlhbmd1bGFyKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0QiwgbWF0Qik7CisgICAgcmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZUluUGxhY2UocmVmTWF0Qik7CisgICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKG1hdEIpOworICAgIFZFUklGWV9JU19BUFBST1gobWF0QiwgcmVmTWF0Qik7CisKKyAgICAvLyB0ZXN0IGRlcHJlY2F0ZWQgQVBJCisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHZlYzIpLAorICAgICAgICAgICAgICAgICAgICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUodmVjMykpOworICB9Cit9CisKK3ZvaWQgdGVzdF9zcGFyc2Vfc29sdmVycygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoc3BhcnNlX3NvbHZlcnM8ZG91YmxlPig4LCA4KSApOworICAgIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKTsKKyAgICBDQUxMX1NVQlRFU1RfMihzcGFyc2Vfc29sdmVyczxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHMscykgKTsKKyAgICBDQUxMX1NVQlRFU1RfMShzcGFyc2Vfc29sdmVyczxkb3VibGU+KHMscykgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2VfdmVjdG9yLmNwcCBiL3Rlc3Qvc3BhcnNlX3ZlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwMWFmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3BhcnNlX3ZlY3Rvci5jcHAKQEAgLTAsMCArMSw5MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJzcGFyc2UuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHNwYXJzZV92ZWN0b3IoaW50IHJvd3MsIGludCBjb2xzKQoreworICBkb3VibGUgZGVuc2l0eU1hdCA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMDEpOworICBkb3VibGUgZGVuc2l0eVZlYyA9IChzdGQ6Om1heCkoOC4vZmxvYXQocm93cyksIDAuMSk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8U2NhbGFyPiBTcGFyc2VWZWN0b3JUeXBlOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXI+IFNwYXJzZU1hdHJpeFR5cGU7CisgIFNjYWxhciBlcHMgPSAxZS02OworCisgIFNwYXJzZU1hdHJpeFR5cGUgbTEocm93cyxyb3dzKTsKKyAgU3BhcnNlVmVjdG9yVHlwZSB2MShyb3dzKSwgdjIocm93cyksIHYzKHJvd3MpOworICBEZW5zZU1hdHJpeCByZWZNMSA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICBEZW5zZVZlY3RvciByZWZWMSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyksCisgICAgcmVmVjIgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpLAorICAgIHJlZlYzID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKTsKKworICBzdGQ6OnZlY3RvcjxpbnQ+IHplcm9jb29yZHMsIG5vbnplcm9jb29yZHM7CisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5VmVjLCByZWZWMSwgdjEsICZ6ZXJvY29vcmRzLCAmbm9uemVyb2Nvb3Jkcyk7CisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5TWF0LCByZWZNMSwgbTEpOworCisgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5VmVjLCByZWZWMiwgdjIpOworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eVZlYywgcmVmVjMsIHYzKTsKKworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKworICAvLyB0ZXN0IGNvZWZmIGFuZCBjb2VmZlJlZgorICBmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8emVyb2Nvb3Jkcy5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggdjEuY29lZmYoemVyb2Nvb3Jkc1tpXSksIGVwcyApOworICAgIC8vVkVSSUZZX1JBSVNFU19BU1NFUlQoIHYxLmNvZWZmUmVmKHplcm9jb29yZHNbaV0pID0gNSApOworICB9CisgIHsKKyAgICBWRVJJRlkoaW50KG5vbnplcm9jb29yZHMuc2l6ZSgpKSA9PSB2MS5ub25aZXJvcygpKTsKKyAgICBpbnQgaj0wOworICAgIGZvciAodHlwZW5hbWUgU3BhcnNlVmVjdG9yVHlwZTo6SW5uZXJJdGVyYXRvciBpdCh2MSk7IGl0OyArK2l0LCsraikKKyAgICB7CisgICAgICBWRVJJRlkobm9uemVyb2Nvb3Jkc1tqXT09aXQuaW5kZXgoKSk7CisgICAgICBWRVJJRlkoaXQudmFsdWUoKT09djEuY29lZmYoaXQuaW5kZXgoKSkpOworICAgICAgVkVSSUZZKGl0LnZhbHVlKCk9PXJlZlYxLmNvZWZmKGl0LmluZGV4KCkpKTsKKyAgICB9CisgIH0KKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSwgcmVmVjEpOworCisgIHYxLmNvZWZmUmVmKG5vbnplcm9jb29yZHNbMF0pID0gU2NhbGFyKDUpOworICByZWZWMS5jb2VmZlJlZihub256ZXJvY29vcmRzWzBdKSA9IFNjYWxhcig1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSwgcmVmVjEpOworCisgIFZFUklGWV9JU19BUFBST1godjErdjIsIHJlZlYxK3JlZlYyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSt2Mit2MywgcmVmVjErcmVmVjIrcmVmVjMpOworCisgIFZFUklGWV9JU19BUFBST1godjEqczEtdjIsIHJlZlYxKnMxLXJlZlYyKTsKKworICBWRVJJRllfSVNfQVBQUk9YKHYxKj1zMSwgcmVmVjEqPXMxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MS89czEsIHJlZlYxLz1zMSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSs9djIsIHJlZlYxKz1yZWZWMik7CisgIFZFUklGWV9JU19BUFBST1godjEtPXYyLCByZWZWMS09cmVmVjIpOworCisgIFZFUklGWV9JU19BUFBST1godjEuZG90KHYyKSwgcmVmVjEuZG90KHJlZlYyKSk7CisgIFZFUklGWV9JU19BUFBST1godjEuZG90KHJlZlYyKSwgcmVmVjEuZG90KHJlZlYyKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MS5kb3QobTEqdjIpLCByZWZWMS5kb3QocmVmTTEqcmVmVjIpKTsKKyAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLmRvdChtMS5jb2woaSkpLCByZWZWMS5kb3QocmVmTTEuY29sKGkpKSk7CisKKworICBWRVJJRllfSVNfQVBQUk9YKHYxLnNxdWFyZWROb3JtKCksIHJlZlYxLnNxdWFyZWROb3JtKCkpOworCit9CisKK3ZvaWQgdGVzdF9zcGFyc2VfdmVjdG9yKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggc3BhcnNlX3ZlY3Rvcjxkb3VibGU+KDgsIDgpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIHNwYXJzZV92ZWN0b3I8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigxNiwgMTYpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIHNwYXJzZV92ZWN0b3I8ZG91YmxlPigyOTksIDUzNSkgKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0L3N0YWJsZV9ub3JtLmNwcCBiL3Rlc3Qvc3RhYmxlX25vcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNWRiZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0YWJsZV9ub3JtLmNwcApAQCAtMCwwICsxLDExMCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIGlzTm90TmFOKGNvbnN0IFQmIHgpCit7CisgIHJldHVybiB4PT14OworfQorCisvLyB3b3JrYXJvdW5kIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9uIGluIElDQwordGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fRE9OVF9JTkxJTkUgIFQgc3ViKFQgYSwgVCBiKSB7IHJldHVybiBhIC0gYjsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIGlzRmluaXRlKGNvbnN0IFQmIHgpCit7CisgIHJldHVybiBpc05vdE5hTihzdWIoeCx4KSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IEVJR0VOX0RPTlRfSU5MSU5FIFQgY29weShjb25zdCBUJiB4KQoreworICByZXR1cm4geDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzdGFibGVfbm9ybShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIFN0YWJsZU5vcm0uaAorICAqLworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKworICAvLyBDaGVjayB0aGUgYmFzaWMgbWFjaGluZS1kZXBlbmRlbnQgY29uc3RhbnRzLgorICB7CisgICAgaW50IGliZXRhLCBpdCwgaWVtaW4sIGllbWF4OworCisgICAgaWJldGEgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpyYWRpeDsgICAgICAgICAvLyBiYXNlIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzCisgICAgaXQgICAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpkaWdpdHM7ICAgICAgICAvLyBudW1iZXIgb2YgYmFzZS1iZXRhIGRpZ2l0cyBpbiBtYW50aXNzYQorICAgIGllbWluID0gc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluX2V4cG9uZW50OyAgLy8gbWluaW11bSBleHBvbmVudAorICAgIGllbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWF4X2V4cG9uZW50OyAgLy8gbWF4aW11bSBleHBvbmVudAorCisgICAgVkVSSUZZKCAoIShpZW1pbiA+IDEgLSAyKml0IHx8IDEraXQ+aWVtYXggfHwgKGl0PT0yICYmIGliZXRhPDUpIHx8IChpdDw9NCAmJiBpYmV0YSA8PSAzICkgfHwgaXQ8MikpCisgICAgICAgICAgICYmICJ0aGUgc3RhYmxlIG5vcm0gYWxnb3JpdGhtIGNhbm5vdCBiZSBndWFyYW50ZWVkIG9uIHRoaXMgY29tcHV0ZXIiKTsKKyAgfQorCisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgU2NhbGFyIGJpZyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogKChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptYXgpKCkgKiBSZWFsU2NhbGFyKDFlLTQpKTsKKyAgU2NhbGFyIHNtYWxsID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgKiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKSAqIFJlYWxTY2FsYXIoMWU0KSk7CisKKyAgTWF0cml4VHlwZSAgdnplcm8gPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgICB2cmFuZCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICAgdmJpZyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICAgdnNtYWxsKHJvd3MsY29scyk7CisKKyAgdmJpZy5maWxsKGJpZyk7CisgIHZzbWFsbC5maWxsKHNtYWxsKTsKKworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odnplcm8ubm9ybSgpLCBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKSk7CisgIFZFUklGWV9JU19BUFBST1godnJhbmQuc3RhYmxlTm9ybSgpLCAgICAgIHZyYW5kLm5vcm0oKSk7CisgIFZFUklGWV9JU19BUFBST1godnJhbmQuYmx1ZU5vcm0oKSwgICAgICAgIHZyYW5kLm5vcm0oKSk7CisgIFZFUklGWV9JU19BUFBST1godnJhbmQuaHlwb3ROb3JtKCksICAgICAgIHZyYW5kLm5vcm0oKSk7CisKKyAgUmVhbFNjYWxhciBzaXplID0gc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4obS5zaXplKCkpOworCisgIC8vIHRlc3QgaXNGaW5pdGUKKyAgVkVSSUZZKCFpc0Zpbml0ZSggc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6aW5maW5pdHkoKSkpOworICBWRVJJRlkoIWlzRmluaXRlKGludGVybmFsOjpzcXJ0KC1pbnRlcm5hbDo6YWJzKGJpZykpKSk7CisKKyAgLy8gdGVzdCBvdmVyZmxvdworICBWRVJJRlkoaXNGaW5pdGUoaW50ZXJuYWw6OnNxcnQoc2l6ZSkqaW50ZXJuYWw6OmFicyhiaWcpKSk7CisgIFZFUklGWV9JU19OT1RfQVBQUk9YKGludGVybmFsOjpzcXJ0KGNvcHkodmJpZy5zcXVhcmVkTm9ybSgpKSksICAgaW50ZXJuYWw6OmFicyhpbnRlcm5hbDo6c3FydChzaXplKSpiaWcpKTsgLy8gaGVyZSB0aGUgZGVmYXVsdCBub3JtIG11c3QgZmFpbAorICBWRVJJRllfSVNfQVBQUk9YKHZiaWcuc3RhYmxlTm9ybSgpLCBpbnRlcm5hbDo6c3FydChzaXplKSppbnRlcm5hbDo6YWJzKGJpZykpOworICBWRVJJRllfSVNfQVBQUk9YKHZiaWcuYmx1ZU5vcm0oKSwgICBpbnRlcm5hbDo6c3FydChzaXplKSppbnRlcm5hbDo6YWJzKGJpZykpOworICBWRVJJRllfSVNfQVBQUk9YKHZiaWcuaHlwb3ROb3JtKCksICBpbnRlcm5hbDo6c3FydChzaXplKSppbnRlcm5hbDo6YWJzKGJpZykpOworCisgIC8vIHRlc3QgdW5kZXJmbG93CisgIFZFUklGWShpc0Zpbml0ZShpbnRlcm5hbDo6c3FydChzaXplKSppbnRlcm5hbDo6YWJzKHNtYWxsKSkpOworICBWRVJJRllfSVNfTk9UX0FQUFJPWChpbnRlcm5hbDo6c3FydChjb3B5KHZzbWFsbC5zcXVhcmVkTm9ybSgpKSksICAgaW50ZXJuYWw6OmFicyhpbnRlcm5hbDo6c3FydChzaXplKSpzbWFsbCkpOyAvLyBoZXJlIHRoZSBkZWZhdWx0IG5vcm0gbXVzdCBmYWlsCisgIFZFUklGWV9JU19BUFBST1godnNtYWxsLnN0YWJsZU5vcm0oKSwgaW50ZXJuYWw6OnNxcnQoc2l6ZSkqaW50ZXJuYWw6OmFicyhzbWFsbCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZzbWFsbC5ibHVlTm9ybSgpLCAgIGludGVybmFsOjpzcXJ0KHNpemUpKmludGVybmFsOjphYnMoc21hbGwpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2c21hbGwuaHlwb3ROb3JtKCksICBpbnRlcm5hbDo6c3FydChzaXplKSppbnRlcm5hbDo6YWJzKHNtYWxsKSk7CisKKy8vIFRlc3QgY29tcGlsYXRpb24gb2YgY3dpc2UoKSB2ZXJzaW9uCisgIFZFUklGWV9JU19BUFBST1godnJhbmQuY29sd2lzZSgpLnN0YWJsZU5vcm0oKSwgICAgICB2cmFuZC5jb2x3aXNlKCkubm9ybSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2cmFuZC5jb2x3aXNlKCkuYmx1ZU5vcm0oKSwgICAgICAgIHZyYW5kLmNvbHdpc2UoKS5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLmNvbHdpc2UoKS5oeXBvdE5vcm0oKSwgICAgICAgdnJhbmQuY29sd2lzZSgpLm5vcm0oKSk7CisgIFZFUklGWV9JU19BUFBST1godnJhbmQucm93d2lzZSgpLnN0YWJsZU5vcm0oKSwgICAgICB2cmFuZC5yb3d3aXNlKCkubm9ybSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2cmFuZC5yb3d3aXNlKCkuYmx1ZU5vcm0oKSwgICAgICAgIHZyYW5kLnJvd3dpc2UoKS5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLnJvd3dpc2UoKS5oeXBvdE5vcm0oKSwgICAgICAgdnJhbmQucm93d2lzZSgpLm5vcm0oKSk7Cit9CisKK3ZvaWQgdGVzdF9zdGFibGVfbm9ybSgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIHN0YWJsZV9ub3JtKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMiggc3RhYmxlX25vcm0oVmVjdG9yNGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggc3RhYmxlX25vcm0oVmVjdG9yWGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDIwMDApKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggc3RhYmxlX25vcm0oVmVjdG9yWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDIwMDApKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggc3RhYmxlX25vcm0oVmVjdG9yWGNkKGludGVybmFsOjpyYW5kb208aW50PigxMCwyMDAwKSkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RkZGVxdWUuY3BwIGIvdGVzdC9zdGRkZXF1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0YjQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RkZGVxdWUuY3BwCkBAIC0wLDAgKzEsMTMyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAxMCBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1N0ZERlcXVlPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaGVja19zdGRkZXF1ZV9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworICBNYXRyaXhUeXBlIHggPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwgeSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBzdGQ6OmRlcXVlPE1hdHJpeFR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeFR5cGU+ID4gdigxMCwgTWF0cml4VHlwZShyb3dzLGNvbHMpKSwgdygyMCwgeSk7CisgIHYuZnJvbnQoKSA9IHg7CisgIHcuZnJvbnQoKSA9IHcuYmFjaygpOworICBWRVJJRllfSVNfQVBQUk9YKHcuZnJvbnQoKSwgdy5iYWNrKCkpOworICB2ID0gdzsKKworICB0eXBlbmFtZSBzdGQ6OmRlcXVlPE1hdHJpeFR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeFR5cGU+ID46Oml0ZXJhdG9yIHZpID0gdi5iZWdpbigpOworICB0eXBlbmFtZSBzdGQ6OmRlcXVlPE1hdHJpeFR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeFR5cGU+ID46Oml0ZXJhdG9yIHdpID0gdy5iZWdpbigpOworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1goKnZpLCAqd2kpOworICAgICsrdmk7CisgICAgKyt3aTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsgIAorICB2LmJhY2soKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfc3RkZGVxdWVfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSk7CisgIHN0ZDo6ZGVxdWU8VHJhbnNmb3JtVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VHJhbnNmb3JtVHlwZT4gPiB2KDEwKSwgdygyMCwgeSk7CisgIHYuZnJvbnQoKSA9IHg7CisgIHcuZnJvbnQoKSA9IHcuYmFjaygpOworICBWRVJJRllfSVNfQVBQUk9YKHcuZnJvbnQoKSwgdy5iYWNrKCkpOworICB2ID0gdzsKKworICB0eXBlbmFtZSBzdGQ6OmRlcXVlPFRyYW5zZm9ybVR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFRyYW5zZm9ybVR5cGU+ID46Oml0ZXJhdG9yIHZpID0gdi5iZWdpbigpOworICB0eXBlbmFtZSBzdGQ6OmRlcXVlPFRyYW5zZm9ybVR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFRyYW5zZm9ybVR5cGU+ID46Oml0ZXJhdG9yIHdpID0gdy5iZWdpbigpOworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1goKnZpLCAqd2kpOworICAgICsrdmk7CisgICAgKyt3aTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdi5iYWNrKCkgPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgordm9pZCBjaGVja19zdGRkZXF1ZV9xdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJikKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZTo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKKyAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKTsKKyAgc3RkOjpkZXF1ZTxRdWF0ZXJuaW9uVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID4gdigxMCksIHcoMjAsIHkpOworICB2LmZyb250KCkgPSB4OworICB3LmZyb250KCkgPSB3LmJhY2soKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3LmZyb250KCksIHcuYmFjaygpKTsKKyAgdiA9IHc7CisKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxRdWF0ZXJuaW9uVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID46Oml0ZXJhdG9yIHZpID0gdi5iZWdpbigpOworICB0eXBlbmFtZSBzdGQ6OmRlcXVlPFF1YXRlcm5pb25UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxRdWF0ZXJuaW9uVHlwZT4gPjo6aXRlcmF0b3Igd2kgPSB3LmJlZ2luKCk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgqdmksICp3aSk7CisgICAgKyt2aTsKKyAgICArK3dpOworICB9CisKKyAgdi5yZXNpemUoMjEpOworICB2LmJhY2soKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKK30KKwordm9pZCB0ZXN0X3N0ZGRlcXVlKCkKK3sKKyAgLy8gc29tZSBub24gdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChWZWN0b3IyZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXgzZigpKSk7CisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXgzZCgpKSk7CisKKyAgLy8gc29tZSB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeDJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkZGVxdWVfbWF0cml4KFZlY3RvcjRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeDRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeDRkKCkpKTsKKworICAvLyBzb21lIGR5bmFtaWMgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeFhkKDEsMSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkZGVxdWVfbWF0cml4KFZlY3RvclhkKDIwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRkZXF1ZV9tYXRyaXgoUm93VmVjdG9yWGYoMjApKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXhYY2YoMTAsMTApKSk7CisKKyAgLy8gc29tZSBUcmFuc2Zvcm0KKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkZGVxdWVfdHJhbnNmb3JtKEFmZmluZTJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkZGVxdWVfdHJhbnNmb3JtKEFmZmluZTNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkZGVxdWVfdHJhbnNmb3JtKEFmZmluZTNkKCkpKTsKKworICAvLyBzb21lIFF1YXRlcm5pb24KKyAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkZGVxdWVfcXVhdGVybmlvbihRdWF0ZXJuaW9uZigpKSk7CisgIENBTExfU1VCVEVTVF81KGNoZWNrX3N0ZGRlcXVlX3F1YXRlcm5pb24oUXVhdGVybmlvbmQoKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdGRsaXN0LmNwcCBiL3Rlc3Qvc3RkbGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjY2U3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RkbGlzdC5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8gQ29weXJpZ2h0IChDKSAyMDEwIEhhdWtlIEhlaWJlbCA8aGF1a2UuaGVpYmVsQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vU3RkTGlzdD4KKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfc3RkbGlzdF9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworICBNYXRyaXhUeXBlIHggPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwgeSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBzdGQ6Omxpc3Q8TWF0cml4VHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPiB2KDEwLCBNYXRyaXhUeXBlKHJvd3MsY29scykpLCB3KDIwLCB5KTsKKyAgdi5mcm9udCgpID0geDsKKyAgdy5mcm9udCgpID0gdy5iYWNrKCk7CisgIFZFUklGWV9JU19BUFBST1gody5mcm9udCgpLCB3LmJhY2soKSk7CisgIHYgPSB3OworCisgIHR5cGVuYW1lIHN0ZDo6bGlzdDxNYXRyaXhUeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PE1hdHJpeFR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeFR5cGU+ID46Oml0ZXJhdG9yIHdpID0gdy5iZWdpbigpOworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1goKnZpLCAqd2kpOworICAgICsrdmk7CisgICAgKyt3aTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsgIAorICB2LmJhY2soKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICBUcmFuc2Zvcm1UeXBlIHgoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB5KE1hdHJpeFR5cGU6OlJhbmRvbSgpKTsKKyAgc3RkOjpsaXN0PFRyYW5zZm9ybVR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFRyYW5zZm9ybVR5cGU+ID4gdigxMCksIHcoMjAsIHkpOworICB2LmZyb250KCkgPSB4OworICB3LmZyb250KCkgPSB3LmJhY2soKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3LmZyb250KCksIHcuYmFjaygpKTsKKyAgdiA9IHc7CisKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PFRyYW5zZm9ybVR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFRyYW5zZm9ybVR5cGU+ID46Oml0ZXJhdG9yIHZpID0gdi5iZWdpbigpOworICB0eXBlbmFtZSBzdGQ6Omxpc3Q8VHJhbnNmb3JtVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VHJhbnNmb3JtVHlwZT4gPjo6aXRlcmF0b3Igd2kgPSB3LmJlZ2luKCk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgqdmksICp3aSk7CisgICAgKyt2aTsKKyAgICArK3dpOworICB9CisKKyAgdi5yZXNpemUoMjEpOworICB2LmJhY2soKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUXVhdGVybmlvblR5cGU+Cit2b2lkIGNoZWNrX3N0ZGxpc3RfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUXVhdGVybmlvblR5cGU6OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7CisgIFF1YXRlcm5pb25UeXBlIHgoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHkoQ29lZmZpY2llbnRzOjpSYW5kb20oKSk7CisgIHN0ZDo6bGlzdDxRdWF0ZXJuaW9uVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID4gdigxMCksIHcoMjAsIHkpOworICB2LmZyb250KCkgPSB4OworICB3LmZyb250KCkgPSB3LmJhY2soKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3LmZyb250KCksIHcuYmFjaygpKTsKKyAgdiA9IHc7CisKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PFF1YXRlcm5pb25UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxRdWF0ZXJuaW9uVHlwZT4gPjo6aXRlcmF0b3IgdmkgPSB2LmJlZ2luKCk7CisgIHR5cGVuYW1lIHN0ZDo6bGlzdDxRdWF0ZXJuaW9uVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID46Oml0ZXJhdG9yIHdpID0gdy5iZWdpbigpOworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1goKnZpLCAqd2kpOworICAgICsrdmk7CisgICAgKyt3aTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdi5iYWNrKCkgPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7Cit9CisKK3ZvaWQgdGVzdF9zdGRsaXN0KCkKK3sKKyAgLy8gc29tZSBub24gdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGxpc3RfbWF0cml4KFZlY3RvcjJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4M2YoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXgzZCgpKSk7CisKKyAgLy8gc29tZSB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4MmYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRsaXN0X21hdHJpeChWZWN0b3I0ZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeDRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4NGQoKSkpOworCisgIC8vIHNvbWUgZHluYW1pYyBzaXplcworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXhYZCgxLDEpKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGxpc3RfbWF0cml4KFZlY3RvclhkKDIwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRsaXN0X21hdHJpeChSb3dWZWN0b3JYZigyMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4WGNmKDEwLDEwKSkpOworCisgIC8vIHNvbWUgVHJhbnNmb3JtCisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZGxpc3RfdHJhbnNmb3JtKEFmZmluZTJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oQWZmaW5lM2YoKSkpOworICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGRsaXN0X3RyYW5zZm9ybShBZmZpbmUzZCgpKSk7CisKKyAgLy8gc29tZSBRdWF0ZXJuaW9uCisgIENBTExfU1VCVEVTVF81KGNoZWNrX3N0ZGxpc3RfcXVhdGVybmlvbihRdWF0ZXJuaW9uZigpKSk7CisgIENBTExfU1VCVEVTVF81KGNoZWNrX3N0ZGxpc3RfcXVhdGVybmlvbihRdWF0ZXJuaW9uZCgpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3N0ZHZlY3Rvci5jcHAgYi90ZXN0L3N0ZHZlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxNzNjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RkdmVjdG9yLmNwcApAQCAtMCwwICsxLDE0OCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1N0ZFZlY3Rvcj4KKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfc3RkdmVjdG9yX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgc3RkOjp2ZWN0b3I8TWF0cml4VHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPiB2KDEwLCBNYXRyaXhUeXBlKHJvd3MsY29scykpLCB3KDIwLCB5KTsKKyAgdls1XSA9IHg7CisgIHdbNl0gPSB2WzVdOworICBWRVJJRllfSVNfQVBQUk9YKHdbNl0sIHZbNV0pOworICB2ID0gdzsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOworICB9CisKKyAgdi5yZXNpemUoMjEpOworICB2WzIwXSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKKyAgVkVSSUZZKChzaXplX3QpJih2WzIyXSkgPT0gKHNpemVfdCkmKHZbMjFdKSArIHNpemVvZihNYXRyaXhUeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIE1hdHJpeFR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldPT13WyhpLTIzKSV3LnNpemUoKV0pOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOworICBUcmFuc2Zvcm1UeXBlIHgoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB5KE1hdHJpeFR5cGU6OlJhbmRvbSgpKTsKKyAgc3RkOjp2ZWN0b3I8VHJhbnNmb3JtVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VHJhbnNmb3JtVHlwZT4gPiB2KDEwKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7CisgIFZFUklGWSgoc2l6ZV90KSYodlsyMl0pID09IChzaXplX3QpJih2WzIxXSkgKyBzaXplb2YoVHJhbnNmb3JtVHlwZSkpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAorICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQorICBUcmFuc2Zvcm1UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXS5tYXRyaXgoKT09d1soaS0yMykldy5zaXplKCldLm1hdHJpeCgpKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZT4KK3ZvaWQgY2hlY2tfc3RkdmVjdG9yX3F1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvblR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlOjpDb2VmZmljaWVudHMgQ29lZmZpY2llbnRzOworICBRdWF0ZXJuaW9uVHlwZSB4KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCB5KENvZWZmaWNpZW50czo6UmFuZG9tKCkpOworICBzdGQ6OnZlY3RvcjxRdWF0ZXJuaW9uVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID4gdigxMCksIHcoMjAsIHkpOworICB2WzVdID0geDsKKyAgd1s2XSA9IHZbNV07CisgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CisgIHYgPSB3OworICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKKyAgeworICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CisgIH0KKworICB2LnJlc2l6ZSgyMSk7CisgIHZbMjBdID0geDsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7CisgIHYucmVzaXplKDIyLHkpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKKyAgdi5wdXNoX2JhY2soeCk7CisgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOworICBWRVJJRlkoKHNpemVfdCkmKHZbMjJdKSA9PSAoc2l6ZV90KSYodlsyMV0pICsgc2l6ZW9mKFF1YXRlcm5pb25UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFF1YXRlcm5pb25UeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXS5jb2VmZnMoKT09d1soaS0yMykldy5zaXplKCldLmNvZWZmcygpKTsKKyAgfQorfQorCit2b2lkIHRlc3Rfc3RkdmVjdG9yKCkKK3sKKyAgLy8gc29tZSBub24gdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoVmVjdG9yMmYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeDNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXgzZCgpKSk7CisKKyAgLy8gc29tZSB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXgyZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoVmVjdG9yNGYoKSkpOworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeDRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXg0ZCgpKSk7CisKKyAgLy8gc29tZSBkeW5hbWljIHNpemVzCisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4WGQoMSwxKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KFZlY3RvclhkKDIwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KFJvd1ZlY3RvclhmKDIwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeFhjZigxMCwxMCkpKTsKKworICAvLyBzb21lIFRyYW5zZm9ybQorICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKFByb2plY3RpdmUyZigpKSk7CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oUHJvamVjdGl2ZTNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShQcm9qZWN0aXZlM2QoKSkpOworICAvL0NBTExfU1VCVEVTVChoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oUHJvamVjdGl2ZTRkKCkpKTsKKworICAvLyBzb21lIFF1YXRlcm5pb24KKyAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkdmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmYoKSkpOworICBDQUxMX1NVQlRFU1RfNShjaGVja19zdGR2ZWN0b3JfcXVhdGVybmlvbihRdWF0ZXJuaW9uZCgpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3N0ZHZlY3Rvcl9vdmVybG9hZC5jcHAgYi90ZXN0L3N0ZHZlY3Rvcl9vdmVybG9hZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2ZmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RkdmVjdG9yX292ZXJsb2FkLmNwcApAQCAtMCwwICsxLDE2MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL1N0ZFZlY3Rvcj4KKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKworRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oVmVjdG9yNGYpCisKK0VJR0VOX0RFRklORV9TVExfVkVDVE9SX1NQRUNJQUxJWkFUSU9OKE1hdHJpeDJmKQorRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oTWF0cml4NGYpCitFSUdFTl9ERUZJTkVfU1RMX1ZFQ1RPUl9TUEVDSUFMSVpBVElPTihNYXRyaXg0ZCkKKworRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oQWZmaW5lM2YpCitFSUdFTl9ERUZJTkVfU1RMX1ZFQ1RPUl9TUEVDSUFMSVpBVElPTihBZmZpbmUzZCkKKworRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oUXVhdGVybmlvbmYpCitFSUdFTl9ERUZJTkVfU1RMX1ZFQ1RPUl9TUEVDSUFMSVpBVElPTihRdWF0ZXJuaW9uZCkKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfc3RkdmVjdG9yX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgc3RkOjp2ZWN0b3I8TWF0cml4VHlwZT4gdigxMCwgTWF0cml4VHlwZShyb3dzLGNvbHMpKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7CisgIFZFUklGWSgoc2l6ZV90KSYodlsyMl0pID09IChzaXplX3QpJih2WzIxXSkgKyBzaXplb2YoTWF0cml4VHlwZSkpOworCisgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAorICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQorICBNYXRyaXhUeXBlKiByZWYgPSAmd1swXTsKKyAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKKyAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKKyAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCisgIHsKKyAgICBWRVJJRlkodltpXT09d1soaS0yMykldy5zaXplKCldKTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgordm9pZCBjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSk7CisgIHN0ZDo6dmVjdG9yPFRyYW5zZm9ybVR5cGU+IHYoMTApLCB3KDIwLCB5KTsKKyAgdls1XSA9IHg7CisgIHdbNl0gPSB2WzVdOworICBWRVJJRllfSVNfQVBQUk9YKHdbNl0sIHZbNV0pOworICB2ID0gdzsKKyAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCisgIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOworICB9CisKKyAgdi5yZXNpemUoMjEpOworICB2WzIwXSA9IHg7CisgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOworICB2LnJlc2l6ZSgyMix5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CisgIHYucHVzaF9iYWNrKHgpOworICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKKyAgVkVSSUZZKChzaXplX3QpJih2WzIyXSkgPT0gKHNpemVfdCkmKHZbMjFdKSArIHNpemVvZihUcmFuc2Zvcm1UeXBlKSk7CisKKyAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCisgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCisgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpPT13WyhpLTIzKSV3LnNpemUoKV0ubWF0cml4KCkpOworICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgordm9pZCBjaGVja19zdGR2ZWN0b3JfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUXVhdGVybmlvblR5cGU6OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7CisgIFF1YXRlcm5pb25UeXBlIHgoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHkoQ29lZmZpY2llbnRzOjpSYW5kb20oKSk7CisgIHN0ZDo6dmVjdG9yPFF1YXRlcm5pb25UeXBlPiB2KDEwKSwgdygyMCwgeSk7CisgIHZbNV0gPSB4OworICB3WzZdID0gdls1XTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKKyAgdiA9IHc7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQorICB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKKyAgfQorCisgIHYucmVzaXplKDIxKTsKKyAgdlsyMF0gPSB4OworICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKKyAgdi5yZXNpemUoMjIseSk7CisgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOworICB2LnB1c2hfYmFjayh4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7CisgIFZFUklGWSgoc2l6ZV90KSYodlsyMl0pID09IChzaXplX3QpJih2WzIxXSkgKyBzaXplb2YoUXVhdGVybmlvblR5cGUpKTsKKworICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSB2ZWN0b3IgZ2V0cyBpbnRlcm5hbGx5IHJlc2l6ZWQKKyAgLy8gKHdpdGggbWVtb3J5IHJlYWxsb2NhdGlvbikKKyAgUXVhdGVybmlvblR5cGUqIHJlZiA9ICZ3WzBdOworICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQorICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOworICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWSh2W2ldLmNvZWZmcygpPT13WyhpLTIzKSV3LnNpemUoKV0uY29lZmZzKCkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9zdGR2ZWN0b3Jfb3ZlcmxvYWQoKQoreworICAvLyBzb21lIG5vbiB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChWZWN0b3IyZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4M2YoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeDNkKCkpKTsKKworICAvLyBzb21lIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcworICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeDJmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChWZWN0b3I0ZigpKSk7CisgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4NGYoKSkpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeDRkKCkpKTsKKworICAvLyBzb21lIGR5bmFtaWMgc2l6ZXMKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXhYZCgxLDEpKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoVmVjdG9yWGQoMjApKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoUm93VmVjdG9yWGYoMjApKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4WGNmKDEwLDEwKSkpOworCisgIC8vIHNvbWUgVHJhbnNmb3JtCisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oQWZmaW5lMmYoKSkpOyAvLyBkb2VzIG5vdCBuZWVkIHRoZSBzcGVjaWFsaXphdGlvbiAoMisxKV4yID0gOQorICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKEFmZmluZTNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShBZmZpbmUzZCgpKSk7CisKKyAgLy8gc29tZSBRdWF0ZXJuaW9uCisgIENBTExfU1VCVEVTVF81KGNoZWNrX3N0ZHZlY3Rvcl9xdWF0ZXJuaW9uKFF1YXRlcm5pb25mKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkdmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmQoKSkpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdXBlcmx1X3N1cHBvcnQuY3BwIGIvdGVzdC9zdXBlcmx1X3N1cHBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTYxMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N1cGVybHVfc3VwcG9ydC5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJzcGFyc2Vfc29sdmVyLmgiCisKKyNpbmNsdWRlIDxFaWdlbi9TdXBlckxVU3VwcG9ydD4KKwordm9pZCB0ZXN0X3N1cGVybHVfc3VwcG9ydCgpCit7CisgIFN1cGVyTFU8U3BhcnNlTWF0cml4PGRvdWJsZT4gPiBzdXBlcmx1X2RvdWJsZV9jb2xtYWpvcjsKKyAgU3VwZXJMVTxTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4gPiA+IHN1cGVybHVfY3BseGRvdWJsZV9jb2xtYWpvcjsKKyAgQ0FMTF9TVUJURVNUXzEoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhzdXBlcmx1X2RvdWJsZV9jb2xtYWpvcikgICAgICApOworICBDQUxMX1NVQlRFU1RfMiggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHN1cGVybHVfY3BseGRvdWJsZV9jb2xtYWpvcikgICk7CisgIENBTExfU1VCVEVTVF8xKCBjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHN1cGVybHVfZG91YmxlX2NvbG1ham9yKSAgICAgICk7CisgIENBTExfU1VCVEVTVF8yKCBjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHN1cGVybHVfY3BseGRvdWJsZV9jb2xtYWpvcikgICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3N3YXAuY3BwIGIvdGVzdC9zd2FwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmIzNTMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zd2FwLmNwcApAQCAtMCwwICsxLDgzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fTk9fU1RBVElDX0FTU0VSVAorI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBvdGhlcl9tYXRyaXhfdHlwZQoreworICB0eXBlZGVmIGludCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9Sb3dzLCBpbnQgX0NvbHMsIGludCBfT3B0aW9ucywgaW50IF9NYXhSb3dzLCBpbnQgX01heENvbHM+CitzdHJ1Y3Qgb3RoZXJfbWF0cml4X3R5cGU8TWF0cml4PF9TY2FsYXIsIF9Sb3dzLCBfQ29scywgX09wdGlvbnMsIF9NYXhSb3dzLCBfTWF4Q29scz4gPgoreworICB0eXBlZGVmIE1hdHJpeDxfU2NhbGFyLCBfUm93cywgX0NvbHMsIF9PcHRpb25zXlJvd01ham9yLCBfTWF4Um93cywgX01heENvbHM+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHN3YXAoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBvdGhlcl9tYXRyaXhfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBPdGhlck1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICBlaWdlbl9hc3NlcnQoKCFpbnRlcm5hbDo6aXNfc2FtZTxNYXRyaXhUeXBlLE90aGVyTWF0cml4VHlwZT46OnZhbHVlKSk7CisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggY29scyA9IG0uY29scygpOworICAKKyAgLy8gY29uc3RydWN0IDMgbWF0cml4IGd1YXJhbnRlZWQgdG8gYmUgZGlzdGluY3QKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scykgKyBTY2FsYXIoMTAwKSAqIE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsY29scyk7CisgIE90aGVyTWF0cml4VHlwZSBtMyA9IE90aGVyTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scykgKyBTY2FsYXIoMjAwKSAqIE90aGVyTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cyxjb2xzKTsKKyAgCisgIE1hdHJpeFR5cGUgbTFfY29weSA9IG0xOworICBNYXRyaXhUeXBlIG0yX2NvcHkgPSBtMjsKKyAgT3RoZXJNYXRyaXhUeXBlIG0zX2NvcHkgPSBtMzsKKyAgCisgIC8vIHRlc3Qgc3dhcHBpbmcgMiBtYXRyaWNlcyBvZiBzYW1lIHR5cGUKKyAgbTEuc3dhcChtMik7CisgIFZFUklGWV9JU19BUFBST1gobTEsbTJfY29weSk7CisgIFZFUklGWV9JU19BUFBST1gobTIsbTFfY29weSk7CisgIG0xID0gbTFfY29weTsKKyAgbTIgPSBtMl9jb3B5OworICAKKyAgLy8gdGVzdCBzd2FwcGluZyAyIG1hdHJpY2VzIG9mIGRpZmZlcmVudCB0eXBlcworICBtMS5zd2FwKG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSxtM19jb3B5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMV9jb3B5KTsKKyAgbTEgPSBtMV9jb3B5OworICBtMyA9IG0zX2NvcHk7CisgIAorICAvLyB0ZXN0IHN3YXBwaW5nIG1hdHJpeCB3aXRoIGV4cHJlc3Npb24KKyAgbTEuc3dhcChtMi5ibG9jaygwLDAscm93cyxjb2xzKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsbTJfY29weSk7CisgIFZFUklGWV9JU19BUFBST1gobTIsbTFfY29weSk7CisgIG0xID0gbTFfY29weTsKKyAgbTIgPSBtMl9jb3B5OworCisgIC8vIHRlc3Qgc3dhcHBpbmcgdHdvIGV4cHJlc3Npb25zIG9mIGRpZmZlcmVudCB0eXBlcworICBtMS50cmFuc3Bvc2UoKS5zd2FwKG0zLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSxtM19jb3B5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMV9jb3B5KTsKKyAgbTEgPSBtMV9jb3B5OworICBtMyA9IG0zX2NvcHk7CisgIAorICAvLyB0ZXN0IGFzc2VydGlvbiBvbiBtaXNtYXRjaGluZyBzaXplIC0tIG1hdHJpeCBjYXNlCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLnN3YXAobTEucm93KDApKSk7CisgIC8vIHRlc3QgYXNzZXJ0aW9uIG9uIG1pc21hdGNoaW5nIHNpemUgLS0geHByIGNhc2UKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEucm93KDApLnN3YXAobTEpKTsKK30KKwordm9pZCB0ZXN0X3N3YXAoKQoreworICBDQUxMX1NVQlRFU1RfMSggc3dhcChNYXRyaXgzZigpKSApOyAvLyBmaXhlZCBzaXplLCBubyB2ZWN0b3JpemF0aW9uIAorICBDQUxMX1NVQlRFU1RfMiggc3dhcChNYXRyaXg0ZCgpKSApOyAvLyBmaXhlZCBzaXplLCBwb3NzaWJsZSB2ZWN0b3JpemF0aW9uIAorICBDQUxMX1NVQlRFU1RfMyggc3dhcChNYXRyaXhYZCgzLDMpKSApOyAvLyBkeW4gc2l6ZSwgbm8gdmVjdG9yaXphdGlvbiAKKyAgQ0FMTF9TVUJURVNUXzQoIHN3YXAoTWF0cml4WGYoMzAsMzApKSApOyAvLyBkeW4gc2l6ZSwgcG9zc2libGUgdmVjdG9yaXphdGlvbiAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdHN1aXRlLmNtYWtlIGIvdGVzdC90ZXN0c3VpdGUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlYzU2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdHN1aXRlLmNtYWtlCkBAIC0wLDAgKzEsMjI5IEBACisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFVzYWdlOgorIyAgLSBjcmVhdGUgYSBuZXcgZm9sZGVyLCBsZXQncyBjYWxsIGl0IGNkYXNoCisjICAtIGluIHRoYXQgZm9sZGVyLCBkbzoKKyMgICAgY3Rlc3QgLVMgcGF0aC90by9laWdlbi90ZXN0L3Rlc3RzdWl0ZS5jbWFrZVssb3B0aW9uMT12YWx1ZTFbLG9wdGlvbjI9dmFsdWUyXV0KKyMKKyMgT3B0aW9uczoKKyMgIC0gRUlHRU5fQ1hYOiBjb21waWxlciwgZWcuOiBnKystNC4yCisjICAgICAgZGVmYXVsdDogZGVmYXVsdCBjKysgY29tcGlsZXIKKyMgIC0gRUlHRU5fU0lURTogZWcsIElOUklBLUJkeF9wYy1nYWVsLCBvciB0aGUgbmFtZSBvZiB0aGUgY29udHJpYnV0b3IsIGV0Yy4KKyMgICAgICBkZWZhdWx0OiBob3N0bmFtZQorIyAgLSBFSUdFTl9CVUlMRF9TVFJJTkc6IGEgc3RyaW5nIHdoaWNoIGlkZW50aWZ5IHRoZSBzeXN0ZW0vY29tcGlsZXIuIEl0IHNob3VsZCBiZSBmb3JtZWQgbGlrZSB0aGF0OgorIyAgICAgICAgPE9TX25hbWU+LTxPU192ZXJzaW9uPi08YXJjaD4tPGNvbXBpbGVyLXZlcnNpb24+CisjICAgICAgd2l0aDoKKyMgICAgICAgIDxPU19uYW1lPiA9IG9wZW5zdXNlLCBkZWJpYW4sIG9zeCwgd2luZG93cywgY3lnd2luLCBmcmVlYnNkLCBzb2xhcmlzLCBldGMuCisjICAgICAgICA8T1NfdmVyc2lvbj4gPSAxMS4xLCBYUCwgdmlzdGEsIGxlb3BhcmQsIGV0Yy4KKyMgICAgICAgIDxhcmNoPiA9IGkzODYsIHg4Nl82NCwgaWE2NCwgcG93ZXJwYywgZXRjLgorIyAgICAgICAgPGNvbXBpbGVyLXZlcnNpb24+ID0gZ2NjLTQuMy4yLCBpY2MtMTEuMCwgTVNWQy0yMDA4LCBldGMuCisjICAtIEVJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT046IG5vdmVjLCBTU0UyLCBBbHRpdmVjCisjICAgICAgIGRlZmF1bHQ6IFNTRTIgZm9yIHg4Nl82NCBzeXN0ZW1zLCBub3ZlYyBvdGhlcndpc2UKKyMgICAgICAgSXRzIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgdG8gRUlHRU5fQlVJTERfU1RSSU5HCisjICAtIEVJR0VOX0NNQUtFX0RJUjogcGF0aCB0byBjbWFrZSBleGVjdXRhYmxlCisjICAtIEVJR0VOX01PREU6IGRhc2hib2FyZCBtb2RlbCwgY2FuIGJlIEV4cGVyaW1lbnRhbCwgTmlnaHRseSwgb3IgQ29udGludW91cworIyAgICAgIGRlZmF1bHQ6IE5pZ2h0bHkKKyMgIC0gRUlHRU5fV09SS19ESVI6IGRpcmVjdG9yeSB1c2VkIHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZmlsZXMgYW5kIG1ha2UgdGhlIGJ1aWxkcworIyAgICAgIGRlZmF1bHQ6IGZvbGRlciB3aGljaCBjb250YWlucyB0aGlzIHNjcmlwdAorIyAgLSBFSUdFTl9DTUFLRV9BUkdTOiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwYXNzZWQgdG8gY21ha2UKKyMgIC0gRUlHRU5fR0VORVJBVE9SX1RZUEU6IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGdlbmVyYXRvciB0eXBlCisjICAgICAgZGVmYXVsdDogbm1ha2UgKHdpbmRvd3MKKyMgICAgICBTZWUgaHR0cDovL3d3dy5jbWFrZS5vcmcvY21ha2UvaGVscC9jbWFrZTIuNmRvY3MuaHRtbCNzZWN0aW9uX0dlbmVyYXRvcnMgZm9yIGEgY29tcGxldGUKKyMgICAgICBsaXN0IG9mIHN1cHBvcnRlZCBnZW5lcmF0b3JzLgorIyAgLSBFSUdFTl9OT19VUERBVEU6IGFsbG93cyB0byBzdWJtaXQgZGFzaCBib2FyZHMgZnJvbSBsb2NhbCByZXBvc2l0b3JpZXMKKyMgICAgICBUaGlzIG1pZ2h0IGJlIGludGVyZXN0aW5nIGluIGNhc2UgeW91IHdhbnQgdG8gc3VibWl0IGRhc2hib2FyZHMKKyMgICAgICBpbmNsdWRpbmcgbG9jYWwgY2hhbmdlcy4KKyMgIC0gQ1RFU1RfU09VUkNFX0RJUkVDVE9SWTogcGF0aCB0byBlaWdlbidzIHNyYyAodXNlIGEgbmV3IGFuZCBlbXB0eSBmb2xkZXIsIG5vdCB0aGUgb25lIHlvdSBhcmUgd29ya2luZyBvbikKKyMgICAgICBkZWZhdWx0OiA8RUlHRU5fV09SS19ESVI+L3NyYworIyAgLSBDVEVTVF9CSU5BUllfRElSRUNUT1JZOiBidWlsZCBkaXJlY3RvcnkKKyMgICAgICBkZWZhdWx0OiA8RUlHRU5fV09SS19ESVI+L25pZ2h0bHktPEVJR0VOX0NYWD4KKyMKKyMgSGVyZSBpcyBhbiBleGFtcGxlIHJ1bm5pbmcgc2V2ZXJhbCBjb21waWxlcnMgb24gYSBsaW51eCBzeXN0ZW06CisjICMhL2Jpbi9iYXNoCisjIEFSQ0g9YHVuYW1lIC1tYAorIyBTSVRFPWBob3N0bmFtZWAKKyMgVkVSU0lPTj1vcGVuc3VzZS0xMS4xCisjIFdPUktfRElSPS9ob21lL2dhZWwvQ29kaW5nL2VpZ2VuL2NkYXNoCisjICMgZ2V0IHRoZSBsYXN0IHZlcnNpb24gb2YgdGhlIHNjcmlwdAorIyB3Z2V0IGh0dHA6Ly9iaXRidWNrZXQub3JnL2VpZ2VuL2VpZ2VuL3Jhdy90aXAvdGVzdC90ZXN0c3VpdGUuY21ha2UgLW8gJFdPUktfRElSL3Rlc3RzdWl0ZS5jbWFrZQorIyBDT01NT049ImN0ZXN0IC1TICRXT1JLX0RJUi90ZXN0c3VpdGUuY21ha2UsRUlHRU5fV09SS19ESVI9JFdPUktfRElSLEVJR0VOX1NJVEU9JFNJVEUsRUlHRU5fTU9ERT0kMSxFSUdFTl9CVUlMRF9TVFJJTkc9JE9TX1ZFUlNJT04tJEFSQ0giCisjICRDT01NT04tZ2NjLTMuNC42LEVJR0VOX0NYWD1nKystMy40CisjICRDT01NT04tZ2NjLTQuMC4xLEVJR0VOX0NYWD1nKystNC4wLjEKKyMgJENPTU1PTi1nY2MtNC4zLjIsRUlHRU5fQ1hYPWcrKy00LjMsRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTj1ub3ZlYworIyAkQ09NTU9OLWdjYy00LjMuMixFSUdFTl9DWFg9ZysrLTQuMyxFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OPVNTRTIKKyMgJENPTU1PTi1pY2MtMTEuMCxFSUdFTl9DWFg9aWNwYworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBwcm9jZXNzIHRoZSBhcmd1bWVudHMKKworc2V0KEFSR0xJU1QgJHtDVEVTVF9TQ1JJUFRfQVJHfSkKK3doaWxlKCR7QVJHTElTVH0gTUFUQ0hFUyAgIi4rLioiKQorCisgICMgcGljayBmaXJzdAorICBzdHJpbmcoUkVHRVggTUFUQ0ggIihbXixdKikoLC4qKT8iIERVTU1ZICR7QVJHTElTVH0pCisgIFNFVChUT1AgJHtDTUFLRV9NQVRDSF8xfSkKKworICAjIHJlbW92ZSBmaXJzdAorICBzdHJpbmcoUkVHRVggTUFUQ0hBTEwgIlteLF0qLCguKikiIERVTU1ZICR7QVJHTElTVH0pCisgIFNFVChBUkdMSVNUICR7Q01BS0VfTUFUQ0hfMX0pCisKKyAgIyBkZWNvbXBvc2UgYXMgYSBwYWlyIGtleT12YWx1ZQorICBzdHJpbmcoUkVHRVggTUFUQ0ggIihbXj1dKikoPS4qKT8iIERVTU1ZICR7VE9QfSkKKyAgU0VUKEtFWSAke0NNQUtFX01BVENIXzF9KQorCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiW149XSo9KC4qKSIgRFVNTVkgJHtUT1B9KQorICBTRVQoVkFMVUUgJHtDTUFLRV9NQVRDSF8xfSkKKworICAjIHNldCB0aGUgdmFyaWFibGUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZQorICBpZihWQUxVRSkKKyAgICBTRVQoJHtLRVl9ICR7VkFMVUV9KQorICBlbHNlKFZBTFVFKQorICAgIFNFVCgke0tFWX0gT04pCisgIGVuZGlmKFZBTFVFKQorCitlbmR3aGlsZSgke0FSR0xJU1R9IE1BVENIRVMgIi4rLioiKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBdXRvbWF0aWNhbGx5IHNldCBzb21lIHVzZXIgdmFyaWFibGVzIGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBkZWZpbmVkIG1hbnVhbGx5CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNiBGQVRBTF9FUlJPUikKKworaWYoTk9UIEVJR0VOX1NJVEUpCisgIHNpdGVfbmFtZShFSUdFTl9TSVRFKQorZW5kaWYoTk9UIEVJR0VOX1NJVEUpCisKK2lmKE5PVCBFSUdFTl9DTUFLRV9ESVIpCisgIFNFVChFSUdFTl9DTUFLRV9ESVIgIiIpCitlbmRpZihOT1QgRUlHRU5fQ01BS0VfRElSKQorCitpZihOT1QgRUlHRU5fQlVJTERfU1RSSU5HKQorCisgICMgbGV0J3MgdHJ5IHRvIGZpbmQgYWxsIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gbWFrZSB0aGUgYnVpbGQgc3RyaW5nIG91cnNlbGYKKworICAjIE9TCisgIGJ1aWxkX25hbWUoRUlHRU5fT1NfVkVSU0lPTikKKworICAjIGFyY2gKKyAgc2V0KEVJR0VOX0FSQ0ggJHtDTUFLRV9TWVNURU1fUFJPQ0VTU09SfSkKKyAgaWYoV0lOMzIpCisgICAgc2V0KEVJR0VOX0FSQ0ggJEVOVntQUk9DRVNTT1JfQVJDSElURUNUVVJFfSkKKyAgZWxzZShXSU4zMikKKyAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCB1bmFtZSAtbSBPVVRQVVRfVkFSSUFCTEUgRUlHRU5fQVJDSCBPVVRQVVRfU1RSSVBfVFJBSUxJTkdfV0hJVEVTUEFDRSkKKyAgZW5kaWYoV0lOMzIpCisKKyAgc2V0KEVJR0VOX0JVSUxEX1NUUklORyAke0VJR0VOX09TX1ZFUlNJT059JHtFSUdFTl9BUkNIfS0ke0VJR0VOX0NYWH0pCisKK2VuZGlmKE5PVCBFSUdFTl9CVUlMRF9TVFJJTkcpCisKK2lmKERFRklORUQgRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTikKKyAgc2V0KEVJR0VOX0JVSUxEX1NUUklORyAke0VJR0VOX0JVSUxEX1NUUklOR30tJHtFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OfSkKK2VuZGlmKERFRklORUQgRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTikKKworaWYoTk9UIEVJR0VOX1dPUktfRElSKQorICBzZXQoRUlHRU5fV09SS19ESVIgJHtDVEVTVF9TQ1JJUFRfRElSRUNUT1JZfSkKK2VuZGlmKE5PVCBFSUdFTl9XT1JLX0RJUikKKworaWYoTk9UIENURVNUX1NPVVJDRV9ESVJFQ1RPUlkpCisgIFNFVCAoQ1RFU1RfU09VUkNFX0RJUkVDVE9SWSAiJHtFSUdFTl9XT1JLX0RJUn0vc3JjIikKK2VuZGlmKE5PVCBDVEVTVF9TT1VSQ0VfRElSRUNUT1JZKQorCitpZihOT1QgQ1RFU1RfQklOQVJZX0RJUkVDVE9SWSkKKyAgU0VUIChDVEVTVF9CSU5BUllfRElSRUNUT1JZICIke0VJR0VOX1dPUktfRElSfS9uaWdodGx5XyR7RUlHRU5fQ1hYfSIpCitlbmRpZihOT1QgQ1RFU1RfQklOQVJZX0RJUkVDVE9SWSkKKworaWYoTk9UIEVJR0VOX01PREUpCisgIHNldChFSUdFTl9NT0RFIE5pZ2h0bHkpCitlbmRpZihOT1QgRUlHRU5fTU9ERSkKKworIyMgbWFuZGF0b3J5IHZhcmlhYmxlcyAodGhlIGRlZmF1bHQgc2hvdWxkIGJlIG9rIGluIG1vc3QgY2FzZXMpOgorCitpZihOT1QgRUlHRU5fTk9fVVBEQVRFKQorICBTRVQgKENURVNUX0NWU19DT01NQU5EICJoZyIpCisgIFNFVCAoQ1RFU1RfQ1ZTX0NIRUNLT1VUICIke0NURVNUX0NWU19DT01NQU5EfSBjbG9uZSBodHRwOi8vYml0YnVja2V0Lm9yZy9laWdlbi9laWdlbiBcIiR7Q1RFU1RfU09VUkNFX0RJUkVDVE9SWX1cIiIpCisgIFNFVChDVEVTVF9CQUNLVVBfQU5EX1JFU1RPUkUgVFJVRSkgIyB0aGUgYmFja3VwIGlzIENWUyByZWxhdGVkIC4uLgorZW5kaWYoTk9UIEVJR0VOX05PX1VQREFURSkKKworIyB3aGljaCBjdGVzdCBjb21tYW5kIHRvIHVzZSBmb3IgcnVubmluZyB0aGUgZGFzaGJvYXJkCitTRVQgKENURVNUX0NPTU1BTkQgIiR7RUlHRU5fQ01BS0VfRElSfWN0ZXN0IC1EICR7RUlHRU5fTU9ERX0gLS1uby1jb21wcmVzcy1vdXRwdXQiKQoraWYoJEVOVntFSUdFTl9DVEVTVF9BUkdTfSkKK1NFVCAoQ1RFU1RfQ09NTUFORCAiJHtDVEVTVF9DT01NQU5EfSAkRU5We0VJR0VOX0NURVNUX0FSR1N9IikKK2VuZGlmKCRFTlZ7RUlHRU5fQ1RFU1RfQVJHU30pCisjIHdoYXQgY21ha2UgY29tbWFuZCB0byB1c2UgZm9yIGNvbmZpZ3VyaW5nIHRoaXMgZGFzaGJvYXJkCitTRVQgKENURVNUX0NNQUtFX0NPTU1BTkQgIiR7RUlHRU5fQ01BS0VfRElSfWNtYWtlIC1ERUlHRU5fTEVBVkVfVEVTVF9JTl9BTExfVEFSR0VUPU9OIikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIHZhbHVlcyBpbiB0aGlzIHNlY3Rpb24gYXJlIG9wdGlvbmFsIHlvdSBjYW4gZWl0aGVyCisjIGhhdmUgdGhlbSBvciBsZWF2ZSB0aGVtIGNvbW1lbnRlZCBvdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgdGhpcyBtYWtlIHN1cmUgd2UgZ2V0IGNvbnNpc3RlbnQgb3V0cHV0cworU0VUKCRFTlZ7TENfTUVTU0FHRVN9ICJlbl9FTiIpCisKKyMgc2hvdWxkIGN0ZXN0IHdpcGUgdGhlIGJpbmFyeSB0cmVlIGJlZm9yZSBydW5uaW5nCitTRVQoQ1RFU1RfU1RBUlRfV0lUSF9FTVBUWV9CSU5BUllfRElSRUNUT1JZIFRSVUUpCisKKyMgcmFpc2UgdGhlIHdhcm5pbmcvZXJyb3IgbGltaXQKK3NldChDVEVTVF9DVVNUT01fTUFYSU1VTV9OVU1CRVJfT0ZfV0FSTklOR1MgIjMzMzMxIikKK3NldChDVEVTVF9DVVNUT01fTUFYSU1VTV9OVU1CRVJfT0ZfRVJST1JTICIzMzMzMSIpCisKKyMgdGhpcyBpcyB0aGUgaW5pdGlhbCBjYWNoZSB0byB1c2UgZm9yIHRoZSBiaW5hcnkgdHJlZSwgYmUgY2FyZWZ1bCB0byBlc2NhcGUKKyMgYW55IHF1b3RlcyBpbnNpZGUgb2YgdGhpcyBzdHJpbmcgaWYgeW91IHVzZSBpdAoraWYoV0lOMzIgQU5EIE5PVCBVTklYKQorICAjbWVzc2FnZShTRU5EX0VSUk9SICJ3aW4zMiIpCisgIGlmKEVJR0VOX0dFTkVSQVRPUl9UWVBFKQorICAgIHNldChDVEVTVF9DTUFLRV9DT01NQU5EICIke0NURVNUX0NNQUtFX0NPTU1BTkR9IC1HIFwiJHtFSUdFTl9HRU5FUkFUT1JfVFlQRX1cIiIpCisgICAgU0VUIChDVEVTVF9JTklUSUFMX0NBQ0hFICIKKyAgICAgIENNQUtFX0JVSUxEX1RZUEU6U1RSSU5HPVJlbGVhc2UKKyAgICAgIEJVSUxETkFNRTpTVFJJTkc9JHtFSUdFTl9CVUlMRF9TVFJJTkd9CisgICAgICBTSVRFOlNUUklORz0ke0VJR0VOX1NJVEV9CisgICAgIikKKyAgZWxzZShFSUdFTl9HRU5FUkFUT1JfVFlQRSkKKyAgICBzZXQoQ1RFU1RfQ01BS0VfQ09NTUFORCAiJHtDVEVTVF9DTUFLRV9DT01NQU5EfSAtRyBcIk5NYWtlIE1ha2VmaWxlc1wiIC1EQ01BS0VfTUFLRV9QUk9HUkFNPW5tYWtlIikKKyAgICBTRVQgKENURVNUX0lOSVRJQUxfQ0FDSEUgIgorICAgICAgTUFLRUNPTU1BTkQ6U1RSSU5HPW5tYWtlIC9pCisgICAgICBDTUFLRV9NQUtFX1BST0dSQU06RklMRVBBVEg9bm1ha2UKKyAgICAgIENNQUtFX0dFTkVSQVRPUjpJTlRFUk5BTD1OTWFrZSBNYWtlZmlsZXMKKyAgICAgIENNQUtFX0JVSUxEX1RZUEU6U1RSSU5HPVJlbGVhc2UKKyAgICAgIEJVSUxETkFNRTpTVFJJTkc9JHtFSUdFTl9CVUlMRF9TVFJJTkd9CisgICAgICBTSVRFOlNUUklORz0ke0VJR0VOX1NJVEV9CisgICAgIikKKyAgZW5kaWYoRUlHRU5fR0VORVJBVE9SX1RZUEUpCitlbHNlKFdJTjMyIEFORCBOT1QgVU5JWCkKKyAgU0VUIChDVEVTVF9JTklUSUFMX0NBQ0hFICIKKyAgICBCVUlMRE5BTUU6U1RSSU5HPSR7RUlHRU5fQlVJTERfU1RSSU5HfQorICAgIFNJVEU6U1RSSU5HPSR7RUlHRU5fU0lURX0KKyAgIikKK2VuZGlmKFdJTjMyIEFORCBOT1QgVU5JWCkKKworIyBzZXQgYW55IGV4dHJhIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byB1c2UgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIHNjcmlwdCBoZXJlOgorIyBzZXR0aW5nIHRoaXMgdmFyaWFibGUgb24gd2luZG93cyBtYWNoaW5lcyBjYXVzZXMgdHJvdWJsZSAuLi4KKworaWYoRUlHRU5fQ1hYIEFORCBOT1QgV0lOMzIpCisgIHNldChDVEVTVF9FTlZJUk9OTUVOVCAiQ1hYPSR7RUlHRU5fQ1hYfSIpCitlbmRpZihFSUdFTl9DWFggQU5EIE5PVCBXSU4zMikKKworaWYoREVGSU5FRCBFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OKQorICBpZihFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OIE1BVENIRVMgU1NFMikKKyAgICBzZXQoQ1RFU1RfQ01BS0VfQ09NTUFORCAiJHtDVEVTVF9DTUFLRV9DT01NQU5EfSAtREVJR0VOX1RFU1RfU1NFMj1PTiIpCisgIGVsc2VpZihFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OIE1BVENIRVMgU1NFMykKKyAgICBzZXQoQ1RFU1RfQ01BS0VfQ09NTUFORCAiJHtDVEVTVF9DTUFLRV9DT01NQU5EfSAtREVJR0VOX1RFU1RfU1NFMj1PTiAtREVJR0VOX1RFU1RfU1NFMz1PTiIpCisgIGVsc2VpZihFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OIE1BVENIRVMgU1NTRTMpCisgICAgc2V0KENURVNUX0NNQUtFX0NPTU1BTkQgIiR7Q1RFU1RfQ01BS0VfQ09NTUFORH0gLURFSUdFTl9URVNUX1NTRTI9T04gLURFSUdFTl9URVNUX1NTRTM9T04gLURFSUdFTl9URVNUX1NTU0UzPU9OIikgIAorICBlbHNlaWYoRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTiBNQVRDSEVTIFNTRTRfMSkKKyAgICBzZXQoQ1RFU1RfQ01BS0VfQ09NTUFORCAiJHtDVEVTVF9DTUFLRV9DT01NQU5EfSAtREVJR0VOX1RFU1RfU1NFMj1PTiAtREVJR0VOX1RFU1RfU1NFMz1PTiAtREVJR0VOX1RFU1RfU1NTRTM9T04gLURFSUdFTl9URVNUX1NTRTRfMT1PTiIpCisgIGVsc2VpZihFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OIE1BVENIRVMgU1NFNF8yKQorICAgIHNldChDVEVTVF9DTUFLRV9DT01NQU5EICIke0NURVNUX0NNQUtFX0NPTU1BTkR9IC1ERUlHRU5fVEVTVF9TU0UyPU9OIC1ERUlHRU5fVEVTVF9TU0UzPU9OIC1ERUlHRU5fVEVTVF9TU1NFMz1PTiAtREVJR0VOX1RFU1RfU1NFNF8xPU9OIC1ERUlHRU5fVEVTVF9TU0U0XzI9T04iKQorICBlbHNlaWYoRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTiBNQVRDSEVTIEFsdGl2ZWMpCisgICAgc2V0KENURVNUX0NNQUtFX0NPTU1BTkQgIiR7Q1RFU1RfQ01BS0VfQ09NTUFORH0gLURFSUdFTl9URVNUX0FMVElWRUM9T04iKQorICBlbHNlaWYoRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTiBNQVRDSEVTIG5vdmVjKQorICAgIHNldChDVEVTVF9DTUFLRV9DT01NQU5EICIke0NURVNUX0NNQUtFX0NPTU1BTkR9IC1ERUlHRU5fVEVTVF9OT19FWFBMSUNJVF9WRUNUT1JJWkFUSU9OPU9OIikKKyAgZWxzZShFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OIE1BVENIRVMgU1NFMikKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJJbnZhbGlkIHZhbHVlIGZvciBFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OICgke0VJR0VOX0VYUExJQ0lUX1ZFQ1RPUklaQVRJT059KSwgbXVzdCBiZTogbm92ZWMsIFNTRTIsIFNTRTMsIEFsdGl2ZWMiKQorICBlbmRpZihFSUdFTl9FWFBMSUNJVF9WRUNUT1JJWkFUSU9OIE1BVENIRVMgU1NFMikKK2VuZGlmKERFRklORUQgRUlHRU5fRVhQTElDSVRfVkVDVE9SSVpBVElPTikKKworaWYoREVGSU5FRCBFSUdFTl9DTUFLRV9BUkdTKQorICBzZXQoQ1RFU1RfQ01BS0VfQ09NTUFORCAiJHtDVEVTVF9DTUFLRV9DT01NQU5EfSAke0VJR0VOX0NNQUtFX0FSR1N9IikKK2VuZGlmKERFRklORUQgRUlHRU5fQ01BS0VfQVJHUykKZGlmZiAtLWdpdCBhL3Rlc3QvdHJpYW5ndWxhci5jcHAgYi90ZXN0L3RyaWFuZ3VsYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOGVlNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3RyaWFuZ3VsYXIuY3BwCkBAIC0wLDAgKzEsMjM1IEBACisvLyBUaGlzIGZpbGUgaXMgdHJpYW5ndWxhclZpZXcgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHRyaWFuZ3VsYXJfc3F1YXJlKGNvbnN0IE1hdHJpeFR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIFJlYWxTY2FsYXIgbGFyZ2VyRXBzID0gMTAqdGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKTsKKworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG00KHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIHIxKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIHIyKHJvd3MsIGNvbHMpOworICBWZWN0b3JUeXBlIHYyID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworCisgIE1hdHJpeFR5cGUgbTF1cCA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBNYXRyaXhUeXBlIG0ydXAgPSBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKworICBpZiAocm93cypjb2xzPjEpCisgIHsKKyAgICBWRVJJRlkobTF1cC5pc1VwcGVyVHJpYW5ndWxhcigpKTsKKyAgICBWRVJJRlkobTJ1cC50cmFuc3Bvc2UoKS5pc0xvd2VyVHJpYW5ndWxhcigpKTsKKyAgICBWRVJJRlkoIW0yLmlzTG93ZXJUcmlhbmd1bGFyKCkpOworICB9CisKKy8vICAgVkVSSUZZX0lTX0FQUFJPWChtMXVwLnRyYW5zcG9zZSgpICogbTIsIG0xLnVwcGVyKCkudHJhbnNwb3NlKCkubG93ZXIoKSAqIG0yKTsKKworICAvLyB0ZXN0IG92ZXJsb2FkZWQgb3BlcmF0b3IrPQorICByMS5zZXRaZXJvKCk7CisgIHIyLnNldFplcm8oKTsKKyAgcjEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKz0gIG0xOworICByMiArPSBtMXVwOworICBWRVJJRllfSVNfQVBQUk9YKHIxLHIyKTsKKworICAvLyB0ZXN0IG92ZXJsb2FkZWQgb3BlcmF0b3I9CisgIG0xLnNldFplcm8oKTsKKyAgbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBtMi50cmFuc3Bvc2UoKSArIG0yOworICBtMyA9IG0yLnRyYW5zcG9zZSgpICsgbTI7CisgIFZFUklGWV9JU19BUFBST1gobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudHJhbnNwb3NlKCkudG9EZW5zZU1hdHJpeCgpLCBtMSk7CisKKyAgLy8gdGVzdCBvdmVybG9hZGVkIG9wZXJhdG9yPQorICBtMS5zZXRaZXJvKCk7CisgIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpID0gbTIudHJhbnNwb3NlKCkgKyBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCksIG0xKTsKKworICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLmNvbmp1Z2F0ZSgpLnRvRGVuc2VNYXRyaXgoKSwKKyAgICAgICAgICAgICAgICAgICBtMy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpOworCisgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBmb3IgKGludCBpPTA7IGk8cm93czsgKytpKQorICAgIHdoaWxlIChpbnRlcm5hbDo6YWJzMihtMShpLGkpKTwxZS0xKSBtMShpLGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisKKyAgVHJhbnNwb3NlPE1hdHJpeFR5cGU+IHRybTQobTQpOworICAvLyB0ZXN0IGJhY2sgYW5kIGZvcndhcmQgc3Vic2l0dXRpb24gd2l0aCBhIHZlY3RvciBhcyB0aGUgcmhzCisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWSh2Mi5pc0FwcHJveChtMy5hZGpvaW50KCkgKiAobTEuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHYyKSksIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRlkodjIuaXNBcHByb3gobTMudHJhbnNwb3NlKCkgKiAobTEudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodjIpKSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWSh2Mi5pc0FwcHJveChtMyAqIChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh2MikpLCBsYXJnZXJFcHMpKTsKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKKyAgVkVSSUZZKHYyLmlzQXBwcm94KG0zLmNvbmp1Z2F0ZSgpICogKG0xLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHYyKSksIGxhcmdlckVwcykpOworCisgIC8vIHRlc3QgYmFjayBhbmQgZm9yd2FyZCBzdWJzaXR1dGlvbiB3aXRoIGEgbWF0cml4IGFzIHRoZSByaHMKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKG0yLmlzQXBwcm94KG0zLmFkam9pbnQoKSAqIChtMS5hZGpvaW50KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUobTIpKSwgbGFyZ2VyRXBzKSk7CisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgIFZFUklGWShtMi5pc0FwcHJveChtMy50cmFuc3Bvc2UoKSAqIChtMS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShtMikpLCBsYXJnZXJFcHMpKTsKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgVkVSSUZZKG0yLmlzQXBwcm94KG0zICogKG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKG0yKSksIGxhcmdlckVwcykpOworICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRlkobTIuaXNBcHByb3gobTMuY29uanVnYXRlKCkgKiAobTEuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUobTIpKSwgbGFyZ2VyRXBzKSk7CisKKyAgLy8gY2hlY2sgTSAqIGludihMKSB1c2luZyBpbiBwbGFjZSBBUEkKKyAgbTQgPSBtMzsKKyAgbTEudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVwcGVyPigpLnNvbHZlSW5QbGFjZSh0cm00KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNCAqIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKSwgbTMpOworCisgIC8vIGNoZWNrIE0gKiBpbnYoVSkgdXNpbmcgaW4gcGxhY2UgQVBJCisgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIG00ID0gbTM7CisgIG0zLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpMb3dlcj4oKS5zb2x2ZUluUGxhY2UodHJtNCk7CisgIFZFUklGWV9JU19BUFBST1gobTQgKiBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCksIG0zKTsKKworICAvLyBjaGVjayBzb2x2ZSB3aXRoIHVuaXQgZGlhZ29uYWwKKyAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCk7CisgIFZFUklGWShtMi5pc0FwcHJveChtMyAqIChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCkuc29sdmUobTIpKSwgbGFyZ2VyRXBzKSk7CisKKy8vICAgVkVSSUZZKCggIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisvLyAgICAgICAgICAgKiBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSkuaXNVcHBlclRyaWFuZ3VsYXIoKSk7CisKKyAgLy8gdGVzdCBzd2FwCisgIG0xLnNldE9uZXMoKTsKKyAgbTIuc2V0WmVybygpOworICBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zd2FwKG0xKTsKKyAgbTMuc2V0WmVybygpOworICBtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRPbmVzKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIsbTMpOworCit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB0cmlhbmd1bGFyX3JlY3QoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIGVudW0geyBSb3dzID0gIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBDb2xzID0gIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93cywgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzLCBSb3dzPiBSTWF0cml4VHlwZTsKKyAgCisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICBtNChyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICByMShyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgICByMihyb3dzLCBjb2xzKTsKKworICBNYXRyaXhUeXBlIG0xdXAgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgTWF0cml4VHlwZSBtMnVwID0gbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisKKyAgaWYgKHJvd3M+MSAmJiBjb2xzPjEpCisgIHsKKyAgICBWRVJJRlkobTF1cC5pc1VwcGVyVHJpYW5ndWxhcigpKTsKKyAgICBWRVJJRlkobTJ1cC50cmFuc3Bvc2UoKS5pc0xvd2VyVHJpYW5ndWxhcigpKTsKKyAgICBWRVJJRlkoIW0yLmlzTG93ZXJUcmlhbmd1bGFyKCkpOworICB9CisKKyAgLy8gdGVzdCBvdmVybG9hZGVkIG9wZXJhdG9yKz0KKyAgcjEuc2V0WmVybygpOworICByMi5zZXRaZXJvKCk7CisgIHIxLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICs9ICBtMTsKKyAgcjIgKz0gbTF1cDsKKyAgVkVSSUZZX0lTX0FQUFJPWChyMSxyMik7CisKKyAgLy8gdGVzdCBvdmVybG9hZGVkIG9wZXJhdG9yPQorICBtMS5zZXRaZXJvKCk7CisgIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpID0gMyAqIG0yOworICBtMyA9IDMgKiBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCksIG0xKTsKKworCisgIG0xLnNldFplcm8oKTsKKyAgbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgPSAzICogbTI7CisgIFZFUklGWV9JU19BUFBST1gobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMSk7CisKKyAgbTEuc2V0WmVybygpOworICBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpID0gMyAqIG0yOworICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMSk7CisKKworICBtMS5zZXRaZXJvKCk7CisgIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkgPSAzICogbTI7CisgIFZFUklGWV9JU19BUFBST1gobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKS50b0RlbnNlTWF0cml4KCksIG0xKTsKKyAgbTEuc2V0UmFuZG9tKCk7CisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIFZFUklGWShtMi5pc1VwcGVyVHJpYW5ndWxhcigpKTsKKyAgVkVSSUZZKCFtMi5pc0xvd2VyVHJpYW5ndWxhcigpKTsKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpOworICBWRVJJRlkobTIuaXNVcHBlclRyaWFuZ3VsYXIoKSk7CisgIFZFUklGWShtMi5kaWFnb25hbCgpLmlzTXVjaFNtYWxsZXJUaGFuKFJlYWxTY2FsYXIoMSkpKTsKKyAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCk7CisgIFZFUklGWShtMi5pc1VwcGVyVHJpYW5ndWxhcigpKTsKKyAgbTIuZGlhZ29uYWwoKS5hcnJheSgpIC09IFNjYWxhcigxKTsKKyAgVkVSSUZZKG0yLmRpYWdvbmFsKCkuaXNNdWNoU21hbGxlclRoYW4oUmVhbFNjYWxhcigxKSkpOworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBWRVJJRlkobTIuaXNMb3dlclRyaWFuZ3VsYXIoKSk7CisgIFZFUklGWSghbTIuaXNVcHBlclRyaWFuZ3VsYXIoKSk7CisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKTsKKyAgVkVSSUZZKG0yLmlzTG93ZXJUcmlhbmd1bGFyKCkpOworICBWRVJJRlkobTIuZGlhZ29uYWwoKS5pc011Y2hTbWFsbGVyVGhhbihSZWFsU2NhbGFyKDEpKSk7CisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpOworICBWRVJJRlkobTIuaXNMb3dlclRyaWFuZ3VsYXIoKSk7CisgIG0yLmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBTY2FsYXIoMSk7CisgIFZFUklGWShtMi5kaWFnb25hbCgpLmlzTXVjaFNtYWxsZXJUaGFuKFJlYWxTY2FsYXIoMSkpKTsKKyAgLy8gdGVzdCBzd2FwCisgIG0xLnNldE9uZXMoKTsKKyAgbTIuc2V0WmVybygpOworICBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zd2FwKG0xKTsKKyAgbTMuc2V0WmVybygpOworICBtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRPbmVzKCk7CisgIFZFUklGWV9JU19BUFBST1gobTIsbTMpOworfQorCit2b2lkIGJ1Z18xNTkoKQoreworICBNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOworICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobSkKK30KKwordm9pZCB0ZXN0X3RyaWFuZ3VsYXIoKQoreworICBpbnQgbWF4c2l6ZSA9IChzdGQ6Om1pbikoRUlHRU5fVEVTVF9NQVhfU0laRSwyMCk7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdCA7IGkrKykKKyAgeworICAgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsbWF4c2l6ZSk7IEVJR0VOX1VOVVNFRF9WQVJJQUJMRShyKTsKKyAgICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigyLG1heHNpemUpOyBFSUdFTl9VTlVTRURfVkFSSUFCTEUoYyk7CisKKyAgICBDQUxMX1NVQlRFU1RfMSggdHJpYW5ndWxhcl9zcXVhcmUoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCB0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXg8ZmxvYXQsIDIsIDI+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIHRyaWFuZ3VsYXJfc3F1YXJlKE1hdHJpeDNkKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoIHRyaWFuZ3VsYXJfc3F1YXJlKE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LDgsIDg+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIHRyaWFuZ3VsYXJfc3F1YXJlKE1hdHJpeFhjZChyLHIpKSApOworICAgIENBTExfU1VCVEVTVF82KCB0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihyLCByKSkgKTsKKworICAgIENBTExfU1VCVEVTVF83KCB0cmlhbmd1bGFyX3JlY3QoTWF0cml4PGZsb2F0LCA0LCA1PigpKSApOworICAgIENBTExfU1VCVEVTVF84KCB0cmlhbmd1bGFyX3JlY3QoTWF0cml4PGRvdWJsZSwgNiwgMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOSggdHJpYW5ndWxhcl9yZWN0KE1hdHJpeFhjZihyLCBjKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggdHJpYW5ndWxhcl9yZWN0KE1hdHJpeFhjZChyLCBjKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNiggdHJpYW5ndWxhcl9yZWN0KE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KHIsIGMpKSApOworICB9CisgIAorICBDQUxMX1NVQlRFU1RfMSggYnVnXzE1OSgpICk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VtZXlhbWEuY3BwIGIvdGVzdC91bWV5YW1hLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmM5YmUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bWV5YW1hLmNwcApAQCAtMCwwICsxLDE4MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKKyNpbmNsdWRlIDxFaWdlbi9MVT4gLy8gcmVxdWlyZWQgZm9yIE1hdHJpeEJhc2U6OmRldGVybWluYW50CisjaW5jbHVkZSA8RWlnZW4vU1ZEPiAvLyByZXF1aXJlZCBmb3IgU1ZECisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKworLy8gIENvbnN0cnVjdHMgYSByYW5kb20gbWF0cml4IGZyb20gdGhlIHVuaXRhcnkgZ3JvdXAgVShzaXplKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRWlnZW46Ok1hdHJpeDxULCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWM+IHJhbmRNYXRyaXhVbml0YXJ5KGludCBzaXplKQoreworICB0eXBlZGVmIFQgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljPiBNYXRyaXhUeXBlOworCisgIE1hdHJpeFR5cGUgUTsKKworICBpbnQgbWF4X3RyaWVzID0gNDA7CisgIGRvdWJsZSBpc191bml0YXJ5ID0gZmFsc2U7CisKKyAgd2hpbGUgKCFpc191bml0YXJ5ICYmIG1heF90cmllcyA+IDApCisgIHsKKyAgICAvLyBpbml0aWFsaXplIHJhbmRvbSBtYXRyaXgKKyAgICBRID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOworCisgICAgLy8gb3J0aG9nb25hbGl6ZSBjb2x1bW5zIHVzaW5nIHRoZSBHcmFtLVNjaG1pZHQgYWxnb3JpdGhtCisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgc2l6ZTsgKytjb2wpCisgICAgeworICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6Q29sWHByIGNvbFZlYyA9IFEuY29sKGNvbCk7CisgICAgICBmb3IgKGludCBwcmV2Q29sID0gMDsgcHJldkNvbCA8IGNvbDsgKytwcmV2Q29sKQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpDb2xYcHIgcHJldkNvbFZlYyA9IFEuY29sKHByZXZDb2wpOworICAgICAgICBjb2xWZWMgLT0gY29sVmVjLmRvdChwcmV2Q29sVmVjKSpwcmV2Q29sVmVjOworICAgICAgfQorICAgICAgUS5jb2woY29sKSA9IGNvbFZlYy5ub3JtYWxpemVkKCk7CisgICAgfQorCisgICAgLy8gdGhpcyBhZGRpdGlvbmFsIG9ydGhvZ29uYWxpemF0aW9uIGlzIG5vdCBuZWNlc3NhcnkgaW4gdGhlb3J5IGJ1dCBzaG91bGQgZW5oYW5jZQorICAgIC8vIHRoZSBudW1lcmljYWwgb3J0aG9nb25hbGl0eSBvZiB0aGUgbWF0cml4CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgc2l6ZTsgKytyb3cpCisgICAgeworICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6Um93WHByIHJvd1ZlYyA9IFEucm93KHJvdyk7CisgICAgICBmb3IgKGludCBwcmV2Um93ID0gMDsgcHJldlJvdyA8IHJvdzsgKytwcmV2Um93KQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSb3dYcHIgcHJldlJvd1ZlYyA9IFEucm93KHByZXZSb3cpOworICAgICAgICByb3dWZWMgLT0gcm93VmVjLmRvdChwcmV2Um93VmVjKSpwcmV2Um93VmVjOworICAgICAgfQorICAgICAgUS5yb3cocm93KSA9IHJvd1ZlYy5ub3JtYWxpemVkKCk7CisgICAgfQorCisgICAgLy8gZmluYWwgY2hlY2sKKyAgICBpc191bml0YXJ5ID0gUS5pc1VuaXRhcnkoKTsKKyAgICAtLW1heF90cmllczsKKyAgfQorCisgIGlmIChtYXhfdHJpZXMgPT0gMCkKKyAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgInJhbmRNYXRyaXhVbml0YXJ5OiBDb3VsZCBub3QgY29uc3RydWN0IHVuaXRhcnkgbWF0cml4ISIpOworCisgIHJldHVybiBROworfQorCisvLyAgQ29uc3RydWN0cyBhIHJhbmRvbSBtYXRyaXggZnJvbSB0aGUgc3BlY2lhbCB1bml0YXJ5IGdyb3VwIFNVKHNpemUpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFaWdlbjo6TWF0cml4PFQsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gcmFuZE1hdHJpeFNwZWNpYWxVbml0YXJ5KGludCBzaXplKQoreworICB0eXBlZGVmIFQgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljPiBNYXRyaXhUeXBlOworCisgIC8vIGluaXRpYWxpemUgdW5pdGFyeSBtYXRyaXgKKyAgTWF0cml4VHlwZSBRID0gcmFuZE1hdHJpeFVuaXRhcnk8U2NhbGFyPihzaXplKTsKKworICAvLyB0d2VhayB0aGUgZmlyc3QgY29sdW1uIHRvIG1ha2UgdGhlIGRldGVybWluYW50IGJlIDEKKyAgUS5jb2woMCkgKj0gaW50ZXJuYWw6OmNvbmooUS5kZXRlcm1pbmFudCgpKTsKKworICByZXR1cm4gUTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHJ1bl90ZXN0KGludCBkaW0sIGludCBudW1fZWxlbWVudHMpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWM+IE1hdHJpeFg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIDE+IFZlY3Rvclg7CisKKyAgLy8gTVVTVCBiZSBwb3NpdGl2ZSBiZWNhdXNlIGluIGFueSBvdGhlciBjYXNlIGRldChjUl90KSBtYXkgYmVjb21lIG5lZ2F0aXZlIGZvcgorICAvLyBvZGQgZGltZW5zaW9ucyEKKyAgY29uc3QgU2NhbGFyIGMgPSBpbnRlcm5hbDo6YWJzKGludGVybmFsOjpyYW5kb208U2NhbGFyPigpKTsKKworICBNYXRyaXhYIFIgPSByYW5kTWF0cml4U3BlY2lhbFVuaXRhcnk8U2NhbGFyPihkaW0pOworICBWZWN0b3JYIHQgPSBTY2FsYXIoNTApKlZlY3Rvclg6OlJhbmRvbShkaW0sMSk7CisKKyAgTWF0cml4WCBjUl90ID0gTWF0cml4WDo6SWRlbnRpdHkoZGltKzEsZGltKzEpOworICBjUl90LmJsb2NrKDAsMCxkaW0sZGltKSA9IGMqUjsKKyAgY1JfdC5ibG9jaygwLGRpbSxkaW0sMSkgPSB0OworCisgIE1hdHJpeFggc3JjID0gTWF0cml4WDo6UmFuZG9tKGRpbSsxLCBudW1fZWxlbWVudHMpOworICBzcmMucm93KGRpbSkgPSBNYXRyaXg8U2NhbGFyLCAxLCBEeW5hbWljPjo6Q29uc3RhbnQobnVtX2VsZW1lbnRzLCBTY2FsYXIoMSkpOworCisgIE1hdHJpeFggZHN0ID0gY1JfdCpzcmM7CisKKyAgTWF0cml4WCBjUl90X3VtZXlhbWEgPSB1bWV5YW1hKHNyYy5ibG9jaygwLDAsZGltLG51bV9lbGVtZW50cyksIGRzdC5ibG9jaygwLDAsZGltLG51bV9lbGVtZW50cykpOworCisgIGNvbnN0IFNjYWxhciBlcnJvciA9ICggY1JfdF91bWV5YW1hKnNyYyAtIGRzdCApLm5vcm0oKSAvIGRzdC5ub3JtKCk7CisgIFZFUklGWShlcnJvciA8IFNjYWxhcig0MCkqc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW1lbnNpb24+Cit2b2lkIHJ1bl9maXhlZF9zaXplX3Rlc3QoaW50IG51bV9lbGVtZW50cykKK3sKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEaW1lbnNpb24rMSwgRHluYW1pYz4gTWF0cml4WDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEaW1lbnNpb24rMSwgRGltZW5zaW9uKzE+IEhvbU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEaW1lbnNpb24sIERpbWVuc2lvbj4gRml4ZWRNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltZW5zaW9uLCAxPiBGaXhlZFZlY3RvcjsKKworICBjb25zdCBpbnQgZGltID0gRGltZW5zaW9uOworCisgIC8vIE1VU1QgYmUgcG9zaXRpdmUgYmVjYXVzZSBpbiBhbnkgb3RoZXIgY2FzZSBkZXQoY1JfdCkgbWF5IGJlY29tZSBuZWdhdGl2ZSBmb3IKKyAgLy8gb2RkIGRpbWVuc2lvbnMhCisgIGNvbnN0IFNjYWxhciBjID0gaW50ZXJuYWw6OmFicyhpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSk7CisKKyAgRml4ZWRNYXRyaXggUiA9IHJhbmRNYXRyaXhTcGVjaWFsVW5pdGFyeTxTY2FsYXI+KGRpbSk7CisgIEZpeGVkVmVjdG9yIHQgPSBTY2FsYXIoNTApKkZpeGVkVmVjdG9yOjpSYW5kb20oZGltLDEpOworCisgIEhvbU1hdHJpeCBjUl90ID0gSG9tTWF0cml4OjpJZGVudGl0eShkaW0rMSxkaW0rMSk7CisgIGNSX3QuYmxvY2soMCwwLGRpbSxkaW0pID0gYypSOworICBjUl90LmJsb2NrKDAsZGltLGRpbSwxKSA9IHQ7CisKKyAgTWF0cml4WCBzcmMgPSBNYXRyaXhYOjpSYW5kb20oZGltKzEsIG51bV9lbGVtZW50cyk7CisgIHNyYy5yb3coZGltKSA9IE1hdHJpeDxTY2FsYXIsIDEsIER5bmFtaWM+OjpDb25zdGFudChudW1fZWxlbWVudHMsIFNjYWxhcigxKSk7CisKKyAgTWF0cml4WCBkc3QgPSBjUl90KnNyYzsKKworICBCbG9jazxNYXRyaXhYLCBEaW1lbnNpb24sIER5bmFtaWM+IHNyY19ibG9jayhzcmMsMCwwLGRpbSxudW1fZWxlbWVudHMpOworICBCbG9jazxNYXRyaXhYLCBEaW1lbnNpb24sIER5bmFtaWM+IGRzdF9ibG9jayhkc3QsMCwwLGRpbSxudW1fZWxlbWVudHMpOworCisgIEhvbU1hdHJpeCBjUl90X3VtZXlhbWEgPSB1bWV5YW1hKHNyY19ibG9jaywgZHN0X2Jsb2NrKTsKKworICBjb25zdCBTY2FsYXIgZXJyb3IgPSAoIGNSX3RfdW1leWFtYSpzcmMgLSBkc3QgKS5hcnJheSgpLnNxdWFyZSgpLnN1bSgpOworCisgIFZFUklGWShlcnJvciA8IFNjYWxhcigxMCkqc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCkpOworfQorCit2b2lkIHRlc3RfdW1leWFtYSgpCit7CisgIGZvciAoaW50IGk9MDsgaTxnX3JlcGVhdDsgKytpKQorICB7CisgICAgY29uc3QgaW50IG51bV9lbGVtZW50cyA9IGludGVybmFsOjpyYW5kb208aW50Pig0MCw1MDApOworCisgICAgLy8gd29ya3MgYWxzbyBmb3IgZGltZW5zaW9ucyBiaWdnZXIgdGhhbiAzLi4uCisgICAgZm9yIChpbnQgZGltPTI7IGRpbTw4OyArK2RpbSkKKyAgICB7CisgICAgICBDQUxMX1NVQlRFU1RfMShydW5fdGVzdDxNYXRyaXhYZD4oZGltLCBudW1fZWxlbWVudHMpKTsKKyAgICAgIENBTExfU1VCVEVTVF8yKHJ1bl90ZXN0PE1hdHJpeFhmPihkaW0sIG51bV9lbGVtZW50cykpOworICAgIH0KKworICAgIENBTExfU1VCVEVTVF8zKChydW5fZml4ZWRfc2l6ZV90ZXN0PGZsb2F0LCAyPihudW1fZWxlbWVudHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKHJ1bl9maXhlZF9zaXplX3Rlc3Q8ZmxvYXQsIDM+KG51bV9lbGVtZW50cykpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgocnVuX2ZpeGVkX3NpemVfdGVzdDxmbG9hdCwgND4obnVtX2VsZW1lbnRzKSkpOworCisgICAgQ0FMTF9TVUJURVNUXzYoKHJ1bl9maXhlZF9zaXplX3Rlc3Q8ZG91YmxlLCAyPihudW1fZWxlbWVudHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoKHJ1bl9maXhlZF9zaXplX3Rlc3Q8ZG91YmxlLCAzPihudW1fZWxlbWVudHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgoKHJ1bl9maXhlZF9zaXplX3Rlc3Q8ZG91YmxlLCA0PihudW1fZWxlbWVudHMpKSk7CisgIH0KKworICAvLyBUaG9zZSB0d28gY2FsbHMgZG9uJ3QgY29tcGlsZSBhbmQgcmVzdWx0IGluIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZXMhCisgIC8vIHVtZXlhbWEoTWF0cml4WGNmKCksTWF0cml4WGNmKCkpOworICAvLyB1bWV5YW1hKE1hdHJpeFhjZCgpLE1hdHJpeFhjZCgpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW1mcGFja19zdXBwb3J0LmNwcCBiL3Rlc3QvdW1mcGFja19zdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI4NGMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bWZwYWNrX3N1cHBvcnQuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgorCisjaW5jbHVkZSA8RWlnZW4vVW1mUGFja1N1cHBvcnQ+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF91bWZwYWNrX3N1cHBvcnRfVCgpCit7CisgIFVtZlBhY2tMVTxTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+ID4gdW1mcGFja19jb2xtYWpvcjsKKyAgVW1mUGFja0xVPFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4gPiB1bWZwYWNrX3Jvd21ham9yOworICAKKyAgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHVtZnBhY2tfY29sbWFqb3IpOworICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcodW1mcGFja19yb3dtYWpvcik7CisgIAorICBjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHVtZnBhY2tfY29sbWFqb3IpOworICBjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHVtZnBhY2tfcm93bWFqb3IpOworfQorCit2b2lkIHRlc3RfdW1mcGFja19zdXBwb3J0KCkKK3sKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF91bWZwYWNrX3N1cHBvcnRfVDxkb3VibGU+KCkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0X3VtZnBhY2tfc3VwcG9ydF9UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvdW5hbGlnbmVkYXNzZXJ0LmNwcCBiL3Rlc3QvdW5hbGlnbmVkYXNzZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFkYmYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bmFsaWduZWRhc3NlcnQuY3BwCkBAIC0wLDAgKzEsMTI3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisKK3N0cnVjdCBUZXN0TmV3MQoreworICBNYXRyaXhYZCBtOyAvLyBnb29kOiBtIHdpbGwgYWxsb2NhdGUgaXRzIG93biBhcnJheSwgdGFraW5nIGNhcmUgb2YgYWxpZ25tZW50LgorICBUZXN0TmV3MSgpIDogbSgyMCwyMCkge30KK307CisKK3N0cnVjdCBUZXN0TmV3MgoreworICBNYXRyaXgzZCBtOyAvLyBnb29kOiBtJ3Mgc2l6ZSBpc24ndCBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLCBzbyBtIGRvZXNuJ3QgaGF2ZSB0byBiZSAxNi1ieXRlIGFsaWduZWQsCisgICAgICAgICAgICAgIC8vIDgtYnl0ZSBhbGlnbm1lbnQgaXMgZ29vZCBlbm91Z2ggaGVyZSwgd2hpY2ggd2UnbGwgZ2V0IGF1dG9tYXRpY2FsbHkKK307CisKK3N0cnVjdCBUZXN0TmV3MworeworICBWZWN0b3IyZiBtOyAvLyBnb29kOiBtJ3Mgc2l6ZSBpc24ndCBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLCBzbyBtIGRvZXNuJ3QgaGF2ZSB0byBiZSAxNi1ieXRlIGFsaWduZWQKK307CisKK3N0cnVjdCBUZXN0TmV3NAoreworICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisgIFZlY3RvcjJkIG07CisgIGZsb2F0IGY7IC8vIG1ha2UgdGhlIHN0cnVjdCBoYXZlIHNpemVvZiUxNiE9MCB0byBtYWtlIGl0IGEgbGl0dGxlIG1vcmUgdHJpY2t5IHdoZW4gd2UgYWxsb3cgYW4gYXJyYXkgb2YgMiBzdWNoIG9iamVjdHMKK307CisKK3N0cnVjdCBUZXN0TmV3NQoreworICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisgIGZsb2F0IGY7IC8vIHRyeSB0aGUgZiBhdCBmaXJzdCAtLSB0aGUgRUlHRU5fQUxJR04xNiBhdHRyaWJ1dGUgb2YgbSBzaG91bGQgbWFrZSB0aGF0IHN0aWxsIHdvcmsKKyAgTWF0cml4NGYgbTsKK307CisKK3N0cnVjdCBUZXN0TmV3NgoreworICBNYXRyaXg8ZmxvYXQsMiwyLERvbnRBbGlnbj4gbTsgLy8gZ29vZDogbm8gYWxpZ25tZW50IHJlcXVlc3RlZAorICBmbG9hdCBmOworfTsKKwordGVtcGxhdGU8Ym9vbCBBbGlnbj4gc3RydWN0IERlcGVuZHMKK3sKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRihBbGlnbikKKyAgVmVjdG9yMmQgbTsKKyAgZmxvYXQgZjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGNoZWNrX3VuYWxpZ25lZGFzc2VydF9nb29kKCkKK3sKKyAgVCAqeCwgKnk7CisgIHggPSBuZXcgVDsKKyAgZGVsZXRlIHg7CisgIHkgPSBuZXcgVFsyXTsKKyAgZGVsZXRlW10geTsKK30KKworI2lmIEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGNvbnN0cnVjdF9hdF9ib3VuZGFyeShpbnQgYm91bmRhcnkpCit7CisgIGNoYXIgYnVmW3NpemVvZihUKSsyNTZdOworICBzaXplX3QgX2J1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihidWYpOworICBfYnVmICs9ICgxNiAtIChfYnVmICUgMTYpKTsgLy8gbWFrZSAxNi1ieXRlIGFsaWduZWQKKyAgX2J1ZiArPSBib3VuZGFyeTsgLy8gbWFrZSBleGFjdCBib3VuZGFyeS1hbGlnbmVkCisgIFQgKnggPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihfYnVmKSkgVDsKKyAgeFswXS5zZXRaZXJvKCk7IC8vIGp1c3QgaW4gb3JkZXIgdG8gc2lsZW5jZSB3YXJuaW5ncworICB4LT5+VCgpOworfQorI2VuZGlmCisKK3ZvaWQgdW5hbGlnbmVkYXNzZXJ0KCkKK3sKKyAgI2lmIEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjJmPig0KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjNmPig0KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjRmPigxNik7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxNYXRyaXgyZj4oMTYpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8TWF0cml4M2Y+KDQpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8TWF0cml4NGY+KDE2KTsKKworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yMmQ+KDE2KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjNkPig0KTsKKyAgY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjRkPigxNik7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxNYXRyaXgyZD4oMTYpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8TWF0cml4M2Q+KDQpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8TWF0cml4NGQ+KDE2KTsKKworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yMmNmPigxNik7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3IzY2Y+KDQpOworICBjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yMmNkPigxNik7CisgIGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxWZWN0b3IzY2Q+KDE2KTsKKyAgI2VuZGlmCisKKyAgY2hlY2tfdW5hbGlnbmVkYXNzZXJ0X2dvb2Q8VGVzdE5ldzE+KCk7CisgIGNoZWNrX3VuYWxpZ25lZGFzc2VydF9nb29kPFRlc3ROZXcyPigpOworICBjaGVja191bmFsaWduZWRhc3NlcnRfZ29vZDxUZXN0TmV3Mz4oKTsKKworICBjaGVja191bmFsaWduZWRhc3NlcnRfZ29vZDxUZXN0TmV3ND4oKTsKKyAgY2hlY2tfdW5hbGlnbmVkYXNzZXJ0X2dvb2Q8VGVzdE5ldzU+KCk7CisgIGNoZWNrX3VuYWxpZ25lZGFzc2VydF9nb29kPFRlc3ROZXc2PigpOworICBjaGVja191bmFsaWduZWRhc3NlcnRfZ29vZDxEZXBlbmRzPHRydWU+ID4oKTsKKworI2lmIEVJR0VOX0FMSUdOX1NUQVRJQ0FMTFkKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjRmPig4KSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxNYXRyaXg0Zj4oOCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yMmQ+KDgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjRkPig4KSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNvbnN0cnVjdF9hdF9ib3VuZGFyeTxNYXRyaXgyZD4oOCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChjb25zdHJ1Y3RfYXRfYm91bmRhcnk8TWF0cml4NGQ+KDgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY29uc3RydWN0X2F0X2JvdW5kYXJ5PFZlY3RvcjJjZj4oOCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChjb25zdHJ1Y3RfYXRfYm91bmRhcnk8VmVjdG9yMmNkPig4KSk7CisjZW5kaWYKK30KKwordm9pZCB0ZXN0X3VuYWxpZ25lZGFzc2VydCgpCit7CisgIENBTExfU1VCVEVTVCh1bmFsaWduZWRhc3NlcnQoKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuYWxpZ25lZGNvdW50LmNwcCBiL3Rlc3QvdW5hbGlnbmVkY291bnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTExNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuYWxpZ25lZGNvdW50LmNwcApAQCAtMCwwICsxLDQ0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKK3N0YXRpYyBpbnQgbmJfbG9hZDsKK3N0YXRpYyBpbnQgbmJfbG9hZHU7CitzdGF0aWMgaW50IG5iX3N0b3JlOworc3RhdGljIGludCBuYl9zdG9yZXU7CisKKyNkZWZpbmUgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEICAgIHsgbmJfbG9hZCsrOyAgICB9CisjZGVmaW5lIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FEICB7IG5iX2xvYWR1Kys7ICAgfQorI2RlZmluZSBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFICAgeyBuYl9zdG9yZSsrOyAgIH0KKyNkZWZpbmUgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIHsgbmJfc3RvcmV1Kys7ICB9CisKKyNkZWZpbmUgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKFhQUixBTCxVTCxBUyxVUykge1wKKyAgICBuYl9sb2FkID0gbmJfbG9hZHUgPSBuYl9zdG9yZSA9IG5iX3N0b3JldSA9IDA7IFwKKyAgICBYUFI7IFwKKyAgICBpZighKG5iX2xvYWQ9PUFMICYmIG5iX2xvYWR1PT1VTCAmJiBuYl9zdG9yZT09QVMgJiYgbmJfc3RvcmV1PT1VUykpIFwKKyAgICAgIHN0ZDo6Y2VyciA8PCAiID4+ICIgPDwgbmJfbG9hZCA8PCAiLCAiIDw8IG5iX2xvYWR1IDw8ICIsICIgPDwgbmJfc3RvcmUgPDwgIiwgIiA8PCBuYl9zdG9yZXUgPDwgIlxuIjsgXAorICAgIFZFUklGWSggKCNYUFIpICYmIG5iX2xvYWQ9PUFMICYmIG5iX2xvYWR1PT1VTCAmJiBuYl9zdG9yZT09QVMgJiYgbmJfc3RvcmV1PT1VUyApOyBcCisgIH0KKworCisjaW5jbHVkZSAibWFpbi5oIgorCit2b2lkIHRlc3RfdW5hbGlnbmVkY291bnQoKQoreworICAjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX1NTRQorICBWZWN0b3JYZiBhKDQwKSwgYig0MCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhICs9IGIsIDIwLCAwLCAxMCwgMCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0MCkgKz0gYi5zZWdtZW50KDAsNDApLCAxMCwgMTAsIDEwLCAwKTsKKyAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLDQwKSAtPSBiLnNlZ21lbnQoMCw0MCksIDEwLCAxMCwgMTAsIDApOworICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYS5zZWdtZW50KDAsNDApICo9IDMuNSwgMTAsIDAsIDEwLCAwKTsKKyAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLDQwKSAvPSAzLjUsIDEwLCAwLCAxMCwgMCk7CisgICNlbHNlCisgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBpcyB0byBlbGltaW5hdGUgInZhcmlhYmxlIG5vdCB1c2VkIiB3YXJuaW5ncworICBuYl9sb2FkID0gbmJfbG9hZHUgPSBuYl9zdG9yZSA9IG5iX3N0b3JldSA9IDA7CisgICNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC91cHBlcmJpZGlhZ29uYWxpemF0aW9uLmNwcCBiL3Rlc3QvdXBwZXJiaWRpYWdvbmFsaXphdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2Y2UzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdXBwZXJiaWRpYWdvbmFsaXphdGlvbi5jcHAKQEAgLTAsMCArMSw0MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL1NWRD4KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB1cHBlcmJpZGlhZyhjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IFJlYWxNYXRyaXhUeXBlOworCisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBpbnRlcm5hbDo6VXBwZXJCaWRpYWdvbmFsaXphdGlvbjxNYXRyaXhUeXBlPiB1YmQoYSk7CisgIFJlYWxNYXRyaXhUeXBlIGIocm93cywgY29scyk7CisgIGIuc2V0WmVybygpOworICBiLmJsb2NrKDAsMCxjb2xzLGNvbHMpID0gdWJkLmJpZGlhZ29uYWwoKTsKKyAgTWF0cml4VHlwZSBjID0gdWJkLmhvdXNlaG9sZGVyVSgpICogYiAqIHViZC5ob3VzZWhvbGRlclYoKS5hZGpvaW50KCk7CisgIFZFUklGWV9JU19BUFBST1goYSxjKTsKK30KKwordm9pZCB0ZXN0X3VwcGVyYmlkaWFnb25hbGl6YXRpb24oKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgQ0FMTF9TVUJURVNUXzEoIHVwcGVyYmlkaWFnKE1hdHJpeFhmKDMsMykpICk7CisgICBDQUxMX1NVQlRFU1RfMiggdXBwZXJiaWRpYWcoTWF0cml4WGQoMTcsMTIpKSApOworICAgQ0FMTF9TVUJURVNUXzMoIHVwcGVyYmlkaWFnKE1hdHJpeFhjZigyMCwyMCkpICk7CisgICBDQUxMX1NVQlRFU1RfNCggdXBwZXJiaWRpYWcoTWF0cml4WGNkKDE2LDE1KSkgKTsKKyAgIENBTExfU1VCVEVTVF81KCB1cHBlcmJpZGlhZyhNYXRyaXg8ZmxvYXQsNiw0PigpKSApOworICAgQ0FMTF9TVUJURVNUXzYoIHVwcGVyYmlkaWFnKE1hdHJpeDxmbG9hdCw1LDU+KCkpICk7CisgICBDQUxMX1NVQlRFU1RfNyggdXBwZXJiaWRpYWcoTWF0cml4PGRvdWJsZSw0LDM+KCkpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdmVjdG9yaXphdGlvbl9sb2dpYy5jcHAgYi90ZXN0L3ZlY3Rvcml6YXRpb25fbG9naWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTY4YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3ZlY3Rvcml6YXRpb25fbG9naWMuY3BwCkBAIC0wLDAgKzEsMjM1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNkZWZpbmUgRUlHRU5fREVCVUdfQVNTSUdOCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHR5cGVpbmZvPgorCitzdGQ6OnN0cmluZyBkZW1hbmdsZV90cmF2ZXJzYWwoaW50IHQpCit7CisgIGlmKHQ9PURlZmF1bHRUcmF2ZXJzYWwpIHJldHVybiAiRGVmYXVsdFRyYXZlcnNhbCI7CisgIGlmKHQ9PUxpbmVhclRyYXZlcnNhbCkgcmV0dXJuICJMaW5lYXJUcmF2ZXJzYWwiOworICBpZih0PT1Jbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwpIHJldHVybiAiSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIjsKKyAgaWYodD09TGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCkgcmV0dXJuICJMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsIjsKKyAgaWYodD09U2xpY2VWZWN0b3JpemVkVHJhdmVyc2FsKSByZXR1cm4gIlNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCI7CisgIHJldHVybiAiPyI7Cit9CitzdGQ6OnN0cmluZyBkZW1hbmdsZV91bnJvbGxpbmcoaW50IHQpCit7CisgIGlmKHQ9PU5vVW5yb2xsaW5nKSByZXR1cm4gIk5vVW5yb2xsaW5nIjsKKyAgaWYodD09SW5uZXJVbnJvbGxpbmcpIHJldHVybiAiSW5uZXJVbnJvbGxpbmciOworICBpZih0PT1Db21wbGV0ZVVucm9sbGluZykgcmV0dXJuICJDb21wbGV0ZVVucm9sbGluZyI7CisgIHJldHVybiAiPyI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjPgorYm9vbCB0ZXN0X2Fzc2lnbihjb25zdCBEc3QmLCBjb25zdCBTcmMmLCBpbnQgdHJhdmVyc2FsLCBpbnQgdW5yb2xsaW5nKQoreworICBpbnRlcm5hbDo6YXNzaWduX3RyYWl0czxEc3QsU3JjPjo6ZGVidWcoKTsKKyAgYm9vbCByZXMgPSBpbnRlcm5hbDo6YXNzaWduX3RyYWl0czxEc3QsU3JjPjo6VHJhdmVyc2FsPT10cmF2ZXJzYWwKKyAgICAgICAgICAmJiBpbnRlcm5hbDo6YXNzaWduX3RyYWl0czxEc3QsU3JjPjo6VW5yb2xsaW5nPT11bnJvbGxpbmc7CisgIGlmKCFyZXMpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBUcmF2ZXJzYWwgPT0gIiA8PCBkZW1hbmdsZV90cmF2ZXJzYWwodHJhdmVyc2FsKQorICAgICAgICAgICAgICA8PCAiIGdvdCAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbChpbnRlcm5hbDo6YXNzaWduX3RyYWl0czxEc3QsU3JjPjo6VHJhdmVyc2FsKSA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFVucm9sbGluZyA9PSAiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh1bnJvbGxpbmcpCisgICAgICAgICAgICAgIDw8ICIgZ290ICIgPDwgZGVtYW5nbGVfdW5yb2xsaW5nKGludGVybmFsOjphc3NpZ25fdHJhaXRzPERzdCxTcmM+OjpVbnJvbGxpbmcpIDw8ICJcbiI7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBTcmM+Citib29sIHRlc3RfYXNzaWduKGludCB0cmF2ZXJzYWwsIGludCB1bnJvbGxpbmcpCit7CisgIGludGVybmFsOjphc3NpZ25fdHJhaXRzPERzdCxTcmM+OjpkZWJ1ZygpOworICBib29sIHJlcyA9IGludGVybmFsOjphc3NpZ25fdHJhaXRzPERzdCxTcmM+OjpUcmF2ZXJzYWw9PXRyYXZlcnNhbAorICAgICAgICAgICYmIGludGVybmFsOjphc3NpZ25fdHJhaXRzPERzdCxTcmM+OjpVbnJvbGxpbmc9PXVucm9sbGluZzsKKyAgaWYoIXJlcykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFRyYXZlcnNhbCA9PSAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmF2ZXJzYWwpCisgICAgICAgICAgICAgIDw8ICIgZ290ICIgPDwgZGVtYW5nbGVfdHJhdmVyc2FsKGludGVybmFsOjphc3NpZ25fdHJhaXRzPERzdCxTcmM+OjpUcmF2ZXJzYWwpIDw8ICJcbiI7CisgICAgc3RkOjpjZXJyIDw8ICIgRXhwZWN0ZWQgVW5yb2xsaW5nID09ICIgPDwgZGVtYW5nbGVfdW5yb2xsaW5nKHVucm9sbGluZykKKyAgICAgICAgICAgICAgPDwgIiBnb3QgIiA8PCBkZW1hbmdsZV91bnJvbGxpbmcoaW50ZXJuYWw6OmFzc2lnbl90cmFpdHM8RHN0LFNyYz46OlVucm9sbGluZykgPDwgIlxuIjsKKyAgfQorICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBYcHI+Citib29sIHRlc3RfcmVkdXgoY29uc3QgWHByJiwgaW50IHRyYXZlcnNhbCwgaW50IHVucm9sbGluZykKK3sKKyAgdHlwZWRlZiBpbnRlcm5hbDo6cmVkdXhfdHJhaXRzPGludGVybmFsOjpzY2FsYXJfc3VtX29wPHR5cGVuYW1lIFhwcjo6U2NhbGFyPixYcHI+IHRyYWl0czsKKyAgYm9vbCByZXMgPSB0cmFpdHM6OlRyYXZlcnNhbD09dHJhdmVyc2FsICYmIHRyYWl0czo6VW5yb2xsaW5nPT11bnJvbGxpbmc7CisgIGlmKCFyZXMpCisgIHsKKyAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBUcmF2ZXJzYWwgPT0gIiA8PCBkZW1hbmdsZV90cmF2ZXJzYWwodHJhdmVyc2FsKQorICAgICAgICAgICAgICA8PCAiIGdvdCAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmFpdHM6OlRyYXZlcnNhbCkgPDwgIlxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBVbnJvbGxpbmcgPT0gIiA8PCBkZW1hbmdsZV91bnJvbGxpbmcodW5yb2xsaW5nKQorICAgICAgICAgICAgICA8PCAiIGdvdCAiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh0cmFpdHM6OlVucm9sbGluZykgPDwgIlxuIjsKKyAgfQorICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGJvb2wgRW5hYmxlID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlPiBzdHJ1Y3QgdmVjdG9yaXphdGlvbl9sb2dpYworeworICBlbnVtIHsKKyAgICBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZQorICB9OworICBzdGF0aWMgdm9pZCBydW4oKQorICB7CisgICAgCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFBhY2tldFNpemUsMT4gVmVjdG9yMTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3JYOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdHJpeFhYOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixQYWNrZXRTaXplLFBhY2tldFNpemU+IE1hdHJpeDExOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwyKlBhY2tldFNpemUsMipQYWNrZXRTaXplPiBNYXRyaXgyMjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/MTY6NCpQYWNrZXRTaXplLChNYXRyaXgxMTo6RmxhZ3MmUm93TWFqb3JCaXQpPzQqUGFja2V0U2l6ZToxNj4gTWF0cml4NDQ7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLChNYXRyaXgxMTo6RmxhZ3MmUm93TWFqb3JCaXQpPzE2OjQqUGFja2V0U2l6ZSwoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT80KlBhY2tldFNpemU6MTYsRG9udEFsaWdufEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OPiBNYXRyaXg0NHU7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQqUGFja2V0U2l6ZSwxNixDb2xNYWpvcj4gTWF0cml4NDRjOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciw0KlBhY2tldFNpemUsMTYsUm93TWFqb3I+IE1hdHJpeDQ0cjsKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwKKyAgICAgICAgKFBhY2tldFNpemU9PTggPyA0IDogUGFja2V0U2l6ZT09NCA/IDIgOiBQYWNrZXRTaXplPT0yID8gMSA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMSksCisgICAgICAgIChQYWNrZXRTaXplPT04ID8gMiA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/IDIgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpCisgICAgICA+IE1hdHJpeDE7CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsCisgICAgICAgIChQYWNrZXRTaXplPT04ID8gNCA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/IDEgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpLAorICAgICAgICAoUGFja2V0U2l6ZT09OCA/IDIgOiBQYWNrZXRTaXplPT00ID8gMiA6IFBhY2tldFNpemU9PTIgPyAyIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKKyAgICAgIERvbnRBbGlnbnwoKE1hdHJpeDE6OkZsYWdzJlJvd01ham9yQml0KT9Sb3dNYWpvcjpDb2xNYWpvcik+IE1hdHJpeDF1OworCisgICAgLy8gdGhpcyB0eXBlIGlzIG1hZGUgc3VjaCB0aGF0IGl0IGNhbiBvbmx5IGJlIHZlY3Rvcml6ZWQgd2hlbiB2aWV3ZWQgYXMgYSBsaW5lYXIgMUQgdmVjdG9yCisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLAorICAgICAgICAoUGFja2V0U2l6ZT09OCA/IDQgOiBQYWNrZXRTaXplPT00ID8gNiA6IFBhY2tldFNpemU9PTIgPyAoKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/MjozKSA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMSksCisgICAgICAgIChQYWNrZXRTaXplPT04ID8gNiA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/ICgoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT8zOjIpIDogLypQYWNrZXRTaXplPT0xID8qLyAzKQorICAgICAgPiBNYXRyaXgzOworICAgIAorICAgICNpZiAhRUlHRU5fR0NDX0FORF9BUkNIX0RPRVNOVF9XQU5UX1NUQUNLX0FMSUdOTUVOVAorICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkrVmVjdG9yMSgpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkuY3dpc2VQcm9kdWN0KFZlY3RvcjEoKSksCisgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLFZlY3RvcjEoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLFZlY3RvcjEoKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpK1ZlY3RvcjEoKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpLmN3aXNlUHJvZHVjdChWZWN0b3IxKCkpLAorICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4NDQoKSxNYXRyaXg0NCgpK01hdHJpeDQ0KCksCisgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsSW5uZXJVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg0NHUoKSxNYXRyaXg0NCgpK01hdHJpeDQ0KCksCisgICAgICBMaW5lYXJUcmF2ZXJzYWwsTm9VbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgxdSgpLE1hdHJpeDEoKStNYXRyaXgxKCksCisgICAgICBMaW5lYXJUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg0NGMoKS5jb2woMSksTWF0cml4NDRjKCkuY29sKDIpK01hdHJpeDQ0YygpLmNvbCgzKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIAorICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg0NHIoKS5yb3coMiksTWF0cml4NDRyKCkucm93KDEpK01hdHJpeDQ0cigpLnJvdygxKSwKKyAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgICAgICAKKyAgICBpZihQYWNrZXRTaXplPjEpCisgICAgeworICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMyxDb2xNYWpvcj4gTWF0cml4MzNjOworICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDMzYygpLnJvdygyKSxNYXRyaXgzM2MoKS5yb3coMSkrTWF0cml4MzNjKCkucm93KDEpLAorICAgICAgICBMaW5lYXJUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgzM2MoKS5jb2woMCksTWF0cml4MzNjKCkuY29sKDEpK01hdHJpeDMzYygpLmNvbCgxKSwKKyAgICAgICAgTGluZWFyVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICAKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgzKCksTWF0cml4MygpLmN3aXNlUXVvdGllbnQoTWF0cml4MygpKSwKKyAgICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4PFNjYWxhciwxNywxNz4oKSxNYXRyaXg8U2NhbGFyLDE3LDE3PigpK01hdHJpeDxTY2FsYXIsMTcsMTc+KCksCisgICAgICAgIExpbmVhclRyYXZlcnNhbCxOb1Vucm9sbGluZykpOworCisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MTEoKSxNYXRyaXg8U2NhbGFyLDE3LDE3PigpLnRlbXBsYXRlIGJsb2NrPFBhY2tldFNpemUsUGFja2V0U2l6ZT4oMiwzKStNYXRyaXg8U2NhbGFyLDE3LDE3PigpLnRlbXBsYXRlIGJsb2NrPFBhY2tldFNpemUsUGFja2V0U2l6ZT4oMTAsNCksCisgICAgICBEZWZhdWx0VHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgfQorICAgIAorICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDMoKSwKKyAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDQ0KCksCisgICAgICBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLE5vVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg0NCgpLnRlbXBsYXRlIGJsb2NrPChNYXRyaXgxOjpGbGFncyZSb3dNYWpvckJpdCk/NDpQYWNrZXRTaXplLChNYXRyaXgxOjpGbGFncyZSb3dNYWpvckJpdCk/UGFja2V0U2l6ZTo0PigxLDIpLAorICAgICAgRGVmYXVsdFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworCisgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4NDRjKCkudGVtcGxhdGUgYmxvY2s8MipQYWNrZXRTaXplLDE+KDEsMiksCisgICAgICBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg0NHIoKS50ZW1wbGF0ZSBibG9jazwxLDIqUGFja2V0U2l6ZT4oMiwxKSwKKyAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICAKKyAgICBWRVJJRlkoKHRlc3RfYXNzaWduPAorICAgICAgICAgICAgTWFwPE1hdHJpeDIyLCBBbGlnbmVkLCBPdXRlclN0cmlkZTwzKlBhY2tldFNpemU+ID4sCisgICAgICAgICAgICBNYXRyaXgyMgorICAgICAgICAgICAgPihJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKSk7CisKKyAgICBWRVJJRlkoKHRlc3RfYXNzaWduPAorICAgICAgICAgICAgTWFwPE1hdHJpeDIyLCBBbGlnbmVkLCBJbm5lclN0cmlkZTwzKlBhY2tldFNpemU+ID4sCisgICAgICAgICAgICBNYXRyaXgyMgorICAgICAgICAgICAgPihEZWZhdWx0VHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSkpOworCisgICAgVkVSSUZZKCh0ZXN0X2Fzc2lnbihNYXRyaXgxMSgpLCBNYXRyaXgxMSgpKk1hdHJpeDExKCksIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKSk7CisgICAgI2VuZGlmCisKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4WFgoMTAsMTApLE1hdHJpeFhYKDIwLDIwKS5ibG9jaygxMCwxMCwyLDMpLAorICAgICAgU2xpY2VWZWN0b3JpemVkVHJhdmVyc2FsLE5vVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9yZWR1eChWZWN0b3JYKDEwKSwKKyAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsTm9VbnJvbGxpbmcpKTsKKworICAgIAorICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCB2ZWN0b3JpemF0aW9uX2xvZ2ljPFNjYWxhcixmYWxzZT4KK3sKKyAgc3RhdGljIHZvaWQgcnVuKCkge30KK307CisKK3ZvaWQgdGVzdF92ZWN0b3JpemF0aW9uX2xvZ2ljKCkKK3sKKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRQorCisgIENBTExfU1VCVEVTVCggdmVjdG9yaXphdGlvbl9sb2dpYzxmbG9hdD46OnJ1bigpICk7CisgIENBTExfU1VCVEVTVCggdmVjdG9yaXphdGlvbl9sb2dpYzxkb3VibGU+OjpydW4oKSApOworICBDQUxMX1NVQlRFU1QoIHZlY3Rvcml6YXRpb25fbG9naWM8c3RkOjpjb21wbGV4PGZsb2F0PiA+OjpydW4oKSApOworICBDQUxMX1NVQlRFU1QoIHZlY3Rvcml6YXRpb25fbG9naWM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPjo6cnVuKCkgKTsKKyAgCisgIGlmKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPGZsb2F0Pjo6VmVjdG9yaXphYmxlKQorICB7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDxmbG9hdCwzLDM+KCksTWF0cml4PGZsb2F0LDMsMz4oKStNYXRyaXg8ZmxvYXQsMywzPigpLAorICAgICAgTGluZWFyVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICAKKyAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg8ZmxvYXQsNSwyPigpLAorICAgICAgRGVmYXVsdFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICB9CisgIAorICBpZihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxkb3VibGU+OjpWZWN0b3JpemFibGUpCisgIHsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4PGRvdWJsZSwzLDM+KCksTWF0cml4PGRvdWJsZSwzLDM+KCkrTWF0cml4PGRvdWJsZSwzLDM+KCksCisgICAgICBMaW5lYXJUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICAKKyAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg8ZG91YmxlLDcsMz4oKSwKKyAgICAgIERlZmF1bHRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgfQorI2VuZGlmIC8vIEVJR0VOX1ZFQ1RPUklaRQorCit9CmRpZmYgLS1naXQgYS90ZXN0L3ZlY3Rvcndpc2VvcC5jcHAgYi90ZXN0L3ZlY3Rvcndpc2VvcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzOGUzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdmVjdG9yd2lzZW9wLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjZGVmaW5lIEVJR0VOX05PX1NUQVRJQ19BU1NFUlQKKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIHZlY3Rvcndpc2VvcF9hcnJheShjb25zdCBBcnJheVR5cGUmIG0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXJyYXlUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIEFycmF5VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IENvbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLCAxLCBBcnJheVR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOworCisgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IG0uY29scygpOworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKKyAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisKKyAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCisgICAgICAgICAgICBtMihyb3dzLCBjb2xzKSwKKyAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworCisgIENvbFZlY3RvclR5cGUgY29sdmVjID0gQ29sVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOworICBSb3dWZWN0b3JUeXBlIHJvd3ZlYyA9IFJvd1ZlY3RvclR5cGU6OlJhbmRvbShjb2xzKTsKKworICAvLyB0ZXN0IGFkZGl0aW9uCisKKyAgbTIgPSBtMTsKKyAgbTIuY29sd2lzZSgpICs9IGNvbHZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEuY29sd2lzZSgpICsgY29sdmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5jb2woYyksIG0xLmNvbChjKSArIGNvbHZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIuY29sd2lzZSgpICs9IGNvbHZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLmNvbHdpc2UoKSArIGNvbHZlYy50cmFuc3Bvc2UoKSk7CisKKyAgbTIgPSBtMTsKKyAgbTIucm93d2lzZSgpICs9IHJvd3ZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucm93d2lzZSgpICsgcm93dmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5yb3cociksIG0xLnJvdyhyKSArIHJvd3ZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIucm93d2lzZSgpICs9IHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLnJvd3dpc2UoKSArIHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisKKyAgLy8gdGVzdCBzdWJzdHJhY3Rpb24KKworICBtMiA9IG0xOworICBtMi5jb2x3aXNlKCkgLT0gY29sdmVjOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5jb2x3aXNlKCkgLSBjb2x2ZWMpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLmNvbChjKSwgbTEuY29sKGMpIC0gY29sdmVjKTsKKworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMi5jb2x3aXNlKCkgLT0gY29sdmVjLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEuY29sd2lzZSgpIC0gY29sdmVjLnRyYW5zcG9zZSgpKTsKKworICBtMiA9IG0xOworICBtMi5yb3d3aXNlKCkgLT0gcm93dmVjOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5yb3d3aXNlKCkgLSByb3d2ZWMpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLnJvdyhyKSwgbTEucm93KHIpIC0gcm93dmVjKTsKKworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMi5yb3d3aXNlKCkgLT0gcm93dmVjLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEucm93d2lzZSgpIC0gcm93dmVjLnRyYW5zcG9zZSgpKTsKKworICAvLyB0ZXN0IG11bHRpcGxpY2F0aW9uCisKKyAgbTIgPSBtMTsKKyAgbTIuY29sd2lzZSgpICo9IGNvbHZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEuY29sd2lzZSgpICogY29sdmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5jb2woYyksIG0xLmNvbChjKSAqIGNvbHZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIuY29sd2lzZSgpICo9IGNvbHZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLmNvbHdpc2UoKSAqIGNvbHZlYy50cmFuc3Bvc2UoKSk7CisKKyAgbTIgPSBtMTsKKyAgbTIucm93d2lzZSgpICo9IHJvd3ZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucm93d2lzZSgpICogcm93dmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5yb3cociksIG0xLnJvdyhyKSAqIHJvd3ZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIucm93d2lzZSgpICo9IHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLnJvd3dpc2UoKSAqIHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisKKyAgLy8gdGVzdCBxdW90aWVudAorCisgIG0yID0gbTE7CisgIG0yLmNvbHdpc2UoKSAvPSBjb2x2ZWM7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLmNvbHdpc2UoKSAvIGNvbHZlYyk7CisgIFZFUklGWV9JU19BUFBST1gobTIuY29sKGMpLCBtMS5jb2woYykgLyBjb2x2ZWMpOworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0yLmNvbHdpc2UoKSAvPSBjb2x2ZWMudHJhbnNwb3NlKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMS5jb2x3aXNlKCkgLyBjb2x2ZWMudHJhbnNwb3NlKCkpOworCisgIG0yID0gbTE7CisgIG0yLnJvd3dpc2UoKSAvPSByb3d2ZWM7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLnJvd3dpc2UoKSAvIHJvd3ZlYyk7CisgIFZFUklGWV9JU19BUFBST1gobTIucm93KHIpLCBtMS5yb3cocikgLyByb3d2ZWMpOworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0yLnJvd3dpc2UoKSAvPSByb3d2ZWMudHJhbnNwb3NlKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMS5yb3d3aXNlKCkgLyByb3d2ZWMudHJhbnNwb3NlKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHZlY3Rvcndpc2VvcF9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IENvbFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IFJvd1ZlY3RvclR5cGU7CisKKyAgSW5kZXggcm93cyA9IG0ucm93cygpOworICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAorICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgbTIocm93cywgY29scyksCisgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKworICBDb2xWZWN0b3JUeXBlIGNvbHZlYyA9IENvbFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgUm93VmVjdG9yVHlwZSByb3d2ZWMgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyk7CisKKyAgLy8gdGVzdCBhZGRpdGlvbgorCisgIG0yID0gbTE7CisgIG0yLmNvbHdpc2UoKSArPSBjb2x2ZWM7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLmNvbHdpc2UoKSArIGNvbHZlYyk7CisgIFZFUklGWV9JU19BUFBST1gobTIuY29sKGMpLCBtMS5jb2woYykgKyBjb2x2ZWMpOworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0yLmNvbHdpc2UoKSArPSBjb2x2ZWMudHJhbnNwb3NlKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMS5jb2x3aXNlKCkgKyBjb2x2ZWMudHJhbnNwb3NlKCkpOworCisgIG0yID0gbTE7CisgIG0yLnJvd3dpc2UoKSArPSByb3d2ZWM7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLnJvd3dpc2UoKSArIHJvd3ZlYyk7CisgIFZFUklGWV9JU19BUFBST1gobTIucm93KHIpLCBtMS5yb3cocikgKyByb3d2ZWMpOworCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0yLnJvd3dpc2UoKSArPSByb3d2ZWMudHJhbnNwb3NlKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMS5yb3d3aXNlKCkgKyByb3d2ZWMudHJhbnNwb3NlKCkpOworCisgIC8vIHRlc3Qgc3Vic3RyYWN0aW9uCisKKyAgbTIgPSBtMTsKKyAgbTIuY29sd2lzZSgpIC09IGNvbHZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEuY29sd2lzZSgpIC0gY29sdmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5jb2woYyksIG0xLmNvbChjKSAtIGNvbHZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIuY29sd2lzZSgpIC09IGNvbHZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLmNvbHdpc2UoKSAtIGNvbHZlYy50cmFuc3Bvc2UoKSk7CisKKyAgbTIgPSBtMTsKKyAgbTIucm93d2lzZSgpIC09IHJvd3ZlYzsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucm93d2lzZSgpIC0gcm93dmVjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5yb3cociksIG0xLnJvdyhyKSAtIHJvd3ZlYyk7CisKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTIucm93d2lzZSgpIC09IHJvd3ZlYy50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xLnJvd3dpc2UoKSAtIHJvd3ZlYy50cmFuc3Bvc2UoKSk7Cit9CisKK3ZvaWQgdGVzdF92ZWN0b3J3aXNlb3AoKQoreworICBDQUxMX1NVQlRFU1RfMSh2ZWN0b3J3aXNlb3BfYXJyYXkoQXJyYXkyMmNkKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIodmVjdG9yd2lzZW9wX2FycmF5KEFycmF5PGRvdWJsZSwgMywgMj4oKSkpOworICBDQUxMX1NVQlRFU1RfMyh2ZWN0b3J3aXNlb3BfYXJyYXkoQXJyYXlYWGYoMywgNCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQodmVjdG9yd2lzZW9wX21hdHJpeChNYXRyaXg0Y2YoKSkpOworICBDQUxMX1NVQlRFU1RfNSh2ZWN0b3J3aXNlb3BfbWF0cml4KE1hdHJpeDxmbG9hdCw0LDU+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzYodmVjdG9yd2lzZW9wX21hdHJpeChNYXRyaXhYZCg3LDIpKSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3Zpc2l0b3IuY3BwIGIvdGVzdC92aXNpdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODczMDYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC92aXNpdG9yLmNwcApAQCAtMCwwICsxLDExOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggQmVub2l0IEphY29iIDxqYWNvYi5iZW5vaXQuMUBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIG1hdHJpeFZpc2l0b3IoY29uc3QgTWF0cml4VHlwZSYgcCkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIEluZGV4IHJvd3MgPSBwLnJvd3MoKTsKKyAgSW5kZXggY29scyA9IHAuY29scygpOworCisgIC8vIGNvbnN0cnVjdCBhIHJhbmRvbSBtYXRyaXggd2hlcmUgYWxsIGNvZWZmaWNpZW50cyBhcmUgZGlmZmVyZW50CisgIE1hdHJpeFR5cGUgbTsKKyAgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgZm9yKEluZGV4IGkgPSAwOyBpIDwgbS5zaXplKCk7IGkrKykKKyAgICBmb3IoSW5kZXggaTIgPSAwOyBpMiA8IGk7IGkyKyspCisgICAgICB3aGlsZShtKGkpID09IG0oaTIpKSAvLyB5ZXMsID09CisgICAgICAgIG0oaSkgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgCisgIFNjYWxhciBtaW5jID0gU2NhbGFyKDEwMDApLCBtYXhjID0gU2NhbGFyKC0xMDAwKTsKKyAgSW5kZXggbWlucm93PTAsbWluY29sPTAsbWF4cm93PTAsbWF4Y29sPTA7CisgIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHM7IGorKykKKyAgZm9yKEluZGV4IGkgPSAwOyBpIDwgcm93czsgaSsrKQorICB7CisgICAgaWYobShpLGopIDwgbWluYykKKyAgICB7CisgICAgICBtaW5jID0gbShpLGopOworICAgICAgbWlucm93ID0gaTsKKyAgICAgIG1pbmNvbCA9IGo7CisgICAgfQorICAgIGlmKG0oaSxqKSA+IG1heGMpCisgICAgeworICAgICAgbWF4YyA9IG0oaSxqKTsKKyAgICAgIG1heHJvdyA9IGk7CisgICAgICBtYXhjb2wgPSBqOworICAgIH0KKyAgfQorICBJbmRleCBlaWdlbl9taW5yb3csIGVpZ2VuX21pbmNvbCwgZWlnZW5fbWF4cm93LCBlaWdlbl9tYXhjb2w7CisgIFNjYWxhciBlaWdlbl9taW5jLCBlaWdlbl9tYXhjOworICBlaWdlbl9taW5jID0gbS5taW5Db2VmZigmZWlnZW5fbWlucm93LCZlaWdlbl9taW5jb2wpOworICBlaWdlbl9tYXhjID0gbS5tYXhDb2VmZigmZWlnZW5fbWF4cm93LCZlaWdlbl9tYXhjb2wpOworICBWRVJJRlkobWlucm93ID09IGVpZ2VuX21pbnJvdyk7CisgIFZFUklGWShtYXhyb3cgPT0gZWlnZW5fbWF4cm93KTsKKyAgVkVSSUZZKG1pbmNvbCA9PSBlaWdlbl9taW5jb2wpOworICBWRVJJRlkobWF4Y29sID09IGVpZ2VuX21heGNvbCk7CisgIFZFUklGWV9JU19BUFBST1gobWluYywgZWlnZW5fbWluYyk7CisgIFZFUklGWV9JU19BUFBST1gobWF4YywgZWlnZW5fbWF4Yyk7CisgIFZFUklGWV9JU19BUFBST1gobWluYywgbS5taW5Db2VmZigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXhjLCBtLm1heENvZWZmKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIHZlY3RvclZpc2l0b3IoY29uc3QgVmVjdG9yVHlwZSYgdykKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OkluZGV4IEluZGV4OworCisgIEluZGV4IHNpemUgPSB3LnNpemUoKTsKKworICAvLyBjb25zdHJ1Y3QgYSByYW5kb20gdmVjdG9yIHdoZXJlIGFsbCBjb2VmZmljaWVudHMgYXJlIGRpZmZlcmVudAorICBWZWN0b3JUeXBlIHY7CisgIHYgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSk7CisgIGZvcihJbmRleCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICBmb3IoSW5kZXggaTIgPSAwOyBpMiA8IGk7IGkyKyspCisgICAgICB3aGlsZSh2KGkpID09IHYoaTIpKSAvLyB5ZXMsID09CisgICAgICAgIHYoaSkgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgCisgIFNjYWxhciBtaW5jID0gU2NhbGFyKDEwMDApLCBtYXhjID0gU2NhbGFyKC0xMDAwKTsKKyAgSW5kZXggbWluaWR4PTAsbWF4aWR4PTA7CisgIGZvcihJbmRleCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgeworICAgIGlmKHYoaSkgPCBtaW5jKQorICAgIHsKKyAgICAgIG1pbmMgPSB2KGkpOworICAgICAgbWluaWR4ID0gaTsKKyAgICB9CisgICAgaWYodihpKSA+IG1heGMpCisgICAgeworICAgICAgbWF4YyA9IHYoaSk7CisgICAgICBtYXhpZHggPSBpOworICAgIH0KKyAgfQorICBJbmRleCBlaWdlbl9taW5pZHgsIGVpZ2VuX21heGlkeDsKKyAgU2NhbGFyIGVpZ2VuX21pbmMsIGVpZ2VuX21heGM7CisgIGVpZ2VuX21pbmMgPSB2Lm1pbkNvZWZmKCZlaWdlbl9taW5pZHgpOworICBlaWdlbl9tYXhjID0gdi5tYXhDb2VmZigmZWlnZW5fbWF4aWR4KTsKKyAgVkVSSUZZKG1pbmlkeCA9PSBlaWdlbl9taW5pZHgpOworICBWRVJJRlkobWF4aWR4ID09IGVpZ2VuX21heGlkeCk7CisgIFZFUklGWV9JU19BUFBST1gobWluYywgZWlnZW5fbWluYyk7CisgIFZFUklGWV9JU19BUFBST1gobWF4YywgZWlnZW5fbWF4Yyk7CisgIFZFUklGWV9JU19BUFBST1gobWluYywgdi5taW5Db2VmZigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXhjLCB2Lm1heENvZWZmKCkpOworfQorCit2b2lkIHRlc3RfdmlzaXRvcigpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoIG1hdHJpeFZpc2l0b3IoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBtYXRyaXhWaXNpdG9yKE1hdHJpeDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIG1hdHJpeFZpc2l0b3IoTWF0cml4NGQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNCggbWF0cml4VmlzaXRvcihNYXRyaXhYZCg4LCAxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoIG1hdHJpeFZpc2l0b3IoTWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KDIwLCAyMCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoIG1hdHJpeFZpc2l0b3IoTWF0cml4WGkoOCwgMTIpKSApOworICB9CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzcoIHZlY3RvclZpc2l0b3IoVmVjdG9yNGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOCggdmVjdG9yVmlzaXRvcihWZWN0b3JYZCgxMCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzkoIHZlY3RvclZpc2l0b3IoUm93VmVjdG9yWGQoMTApKSApOworICAgIENBTExfU1VCVEVTVF8xMCggdmVjdG9yVmlzaXRvcihWZWN0b3JYZigzMykpICk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvemVyb3NpemVkLmNwcCBiL3Rlc3QvemVyb3NpemVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA1ZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC96ZXJvc2l6ZWQuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEJlbm9pdCBKYWNvYiA8amFjb2IuYmVub2l0LjFAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB6ZXJvU2l6ZWRNYXRyaXgoKQoreworICBNYXRyaXhUeXBlIHQxOworCisgIGlmIChNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljKQorICB7CisgICAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpCisgICAgICBWRVJJRlkodDEucm93cygpID09IDApOworICAgIGlmIChNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKQorICAgICAgVkVSSUZZKHQxLmNvbHMoKSA9PSAwKTsKKworICAgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljICYmIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMpCisgICAgeworICAgICAgTWF0cml4VHlwZSB0MigwLCAwKTsKKyAgICAgIFZFUklGWSh0Mi5yb3dzKCkgPT0gMCk7CisgICAgICBWRVJJRlkodDIuY29scygpID09IDApOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIHplcm9TaXplZFZlY3RvcigpCit7CisgIFZlY3RvclR5cGUgdDE7CisKKyAgaWYgKFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMpCisgIHsKKyAgICBWRVJJRlkodDEuc2l6ZSgpID09IDApOworICAgIFZlY3RvclR5cGUgdDIoRGVuc2VJbmRleCgwKSk7IC8vIERlbnNlSW5kZXggZGlzYW1iaWd1YXRlcyB3aXRoIDAtdGhlLW51bGwtcG9pbnRlciAoZXJyb3Igd2l0aCBnY2MgNC40IGFuZCBNU1ZDOCkKKyAgICBWRVJJRlkodDIuc2l6ZSgpID09IDApOworICB9Cit9CisKK3ZvaWQgdGVzdF96ZXJvc2l6ZWQoKQoreworICB6ZXJvU2l6ZWRNYXRyaXg8TWF0cml4MmQ+KCk7CisgIHplcm9TaXplZE1hdHJpeDxNYXRyaXgzaT4oKTsKKyAgemVyb1NpemVkTWF0cml4PE1hdHJpeDxmbG9hdCwgMiwgRHluYW1pYz4gPigpOworICB6ZXJvU2l6ZWRNYXRyaXg8TWF0cml4WGY+KCk7CisgIHplcm9TaXplZE1hdHJpeDxNYXRyaXg8ZmxvYXQsIDAsIDA+ID4oKTsKKyAgemVyb1NpemVkTWF0cml4PE1hdHJpeDxmbG9hdCwgRHluYW1pYywgMCwgMCwgMCwgMD4gPigpOworICB6ZXJvU2l6ZWRNYXRyaXg8TWF0cml4PGZsb2F0LCAwLCBEeW5hbWljLCAwLCAwLCAwPiA+KCk7CisgIHplcm9TaXplZE1hdHJpeDxNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIDAsIDAsIDA+ID4oKTsKKyAgCisgIHplcm9TaXplZFZlY3RvcjxWZWN0b3IyZD4oKTsKKyAgemVyb1NpemVkVmVjdG9yPFZlY3RvcjNpPigpOworICB6ZXJvU2l6ZWRWZWN0b3I8VmVjdG9yWGY+KCk7CisgIHplcm9TaXplZFZlY3RvcjxNYXRyaXg8ZmxvYXQsIDAsIDE+ID4oKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZjQwYQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNyBAQAorYWRkX3N1YmRpcmVjdG9yeShFaWdlbikKK2FkZF9zdWJkaXJlY3RvcnkoZG9jIEVYQ0xVREVfRlJPTV9BTEwpCitpZihFSUdFTl9MRUFWRV9URVNUX0lOX0FMTF9UQVJHRVQpCisgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkgIyBjYW4ndCBkbyBFWENMVURFX0ZST01fQUxMIGhlcmUsIGJyZWFrcyBDVGVzdAorZWxzZSgpCisgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCBFWENMVURFX0ZST01fQUxMKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQWRvbGNGb3J3YXJkIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQWRvbGNGb3J3YXJkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NmY5NDUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9BZG9sY0ZvcndhcmQKQEAgLTAsMCArMSwxNTYgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQURMT0NfRk9SV0FSRAorI2RlZmluZSBFSUdFTl9BRExPQ19GT1JXQVJECisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYWRvbGMncyBhZG91YmxlIHR5cGUgaW4gZm9yd2FyZCBtb2RlLgorLy8gQURPTC1DIGlzIGEgQysrIGF1dG9tYXRpYyBkaWZmZXJlbnRpYXRpb24gbGlicmFyeSwKKy8vIHNlZSBodHRwczovL3Byb2plY3RzLmNvaW4tb3Iub3JnL0FET0wtQyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIG1heGltYWwgbnVtYmVyIG9mIGRpcmVjdGlvbnMgaXMgY29udHJvbGxlZCBieQorLy8gdGhlIHByZXByb2Nlc3NvciB0b2tlbiBOVU1CRVJfRElSRUNUSU9OUy4gVGhlIGRlZmF1bHQgaXMgMi4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQURPTENfVEFQRUxFU1MKKyNpZm5kZWYgTlVNQkVSX0RJUkVDVElPTlMKKyMgZGVmaW5lIE5VTUJFUl9ESVJFQ1RJT05TIDIKKyNlbmRpZgorI2luY2x1ZGUgPGFkb2xjL2Fkb3VibGUuaD4KKworLy8gYWRvbGMgZGVmaW5lcyBzb21lIHZlcnkgc3R1cGlkIG1hY3JvczoKKyNpZiBkZWZpbmVkKG1hbGxvYykKKyMgdW5kZWYgbWFsbG9jCisjZW5kaWYKKworI2lmIGRlZmluZWQoY2FsbG9jKQorIyB1bmRlZiBjYWxsb2MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChyZWFsbG9jKQorIyB1bmRlZiByZWFsbG9jCisjZW5kaWYKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcaW5ncm91cCBVbnN1cHBvcnRlZF9tb2R1bGVzCisgICogXGRlZmdyb3VwIEFkb2xjRm9yd2FyZF9Nb2R1bGUgQWRvbGMgZm9yd2FyZCBtb2R1bGUKKyAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBzdXBwb3J0IGZvciBhZG9sYydzIGFkb3VibGUgdHlwZSBpbiBmb3J3YXJkIG1vZGUuCisgICogQURPTC1DIGlzIGEgQysrIGF1dG9tYXRpYyBkaWZmZXJlbnRpYXRpb24gbGlicmFyeSwKKyAgKiBzZWUgaHR0cHM6Ly9wcm9qZWN0cy5jb2luLW9yLm9yZy9BRE9MLUMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICogSXQgbWFpbmx5IGNvbnNpc3RzIGluOgorICAqICAtIGEgc3RydWN0IEVpZ2VuOjpOdW1UcmFpdHM8YWR0bDo6YWRvdWJsZT4gc3BlY2lhbGl6YXRpb24KKyAgKiAgLSBvdmVybG9hZHMgb2YgaW50ZXJuYWw6OiogbWF0aCBmdW5jdGlvbiBmb3IgYWR0bDo6YWRvdWJsZSB0eXBlLgorICAqCisgICogTm90ZSB0aGF0IHRoZSBtYXhpbWFsIG51bWJlciBvZiBkaXJlY3Rpb25zIGlzIGNvbnRyb2xsZWQgYnkKKyAgKiB0aGUgcHJlcHJvY2Vzc29yIHRva2VuIE5VTUJFUl9ESVJFQ1RJT05TLiBUaGUgZGVmYXVsdCBpcyAyLgorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQWRvbGNTdXBwb3J0PgorICAqIFxlbmRjb2RlCisgICovCisgIC8vQHsKKworfSAvLyBuYW1lc3BhY2UgRWlnZW4KKworLy8gRWlnZW4ncyByZXF1aXJlIGEgZmV3IGFkZGl0aW9uYWwgZnVuY3Rpb25zIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UKKy8vIHRoYW4gdGhlIGN1c3RvbSBzY2FsYXIgdHlwZSBvd24gbmFtZXNwYWNlCituYW1lc3BhY2UgYWR0bCB7CisKK2lubGluZSBjb25zdCBhZG91YmxlJiBjb25qKGNvbnN0IGFkb3VibGUmIHgpICB7IHJldHVybiB4OyB9CitpbmxpbmUgY29uc3QgYWRvdWJsZSYgcmVhbChjb25zdCBhZG91YmxlJiB4KSAgeyByZXR1cm4geDsgfQoraW5saW5lIGFkb3VibGUgaW1hZyhjb25zdCBhZG91YmxlJikgICAgeyByZXR1cm4gMC47IH0KK2lubGluZSBhZG91YmxlIGFicyhjb25zdCBhZG91YmxlJiAgeCkgIHsgcmV0dXJuIGZhYnMoeCk7IH0KK2lubGluZSBhZG91YmxlIGFiczIoY29uc3QgYWRvdWJsZSYgeCkgIHsgcmV0dXJuIHgqeDsgfQorCit9CisKK25hbWVzcGFjZSBFaWdlbiB7CisKK3RlbXBsYXRlPD4gc3RydWN0IE51bVRyYWl0czxhZHRsOjphZG91YmxlPgorICAgIDogTnVtVHJhaXRzPGRvdWJsZT4KK3sKKyAgdHlwZWRlZiBhZHRsOjphZG91YmxlIFJlYWw7CisgIHR5cGVkZWYgYWR0bDo6YWRvdWJsZSBOb25JbnRlZ2VyOworICB0eXBlZGVmIGFkdGw6OmFkb3VibGUgTmVzdGVkOworICBlbnVtIHsKKyAgICBJc0NvbXBsZXggPSAwLAorICAgIElzSW50ZWdlciA9IDAsCisgICAgSXNTaWduZWQgPSAxLAorICAgIFJlcXVpcmVJbml0aWFsaXphdGlvbiA9IDEsCisgICAgUmVhZENvc3QgPSAxLAorICAgIEFkZENvc3QgPSAxLAorICAgIE11bENvc3QgPSAxCisgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPiBjbGFzcyBBZG9sY0ZvcndhcmRKYWNvYmlhbiA6IHB1YmxpYyBGdW5jdG9yCit7CisgIHR5cGVkZWYgYWR0bDo6YWRvdWJsZSBBY3RpdmVTY2FsYXI7CitwdWJsaWM6CisKKyAgQWRvbGNGb3J3YXJkSmFjb2JpYW4oKSA6IEZ1bmN0b3IoKSB7fQorICBBZG9sY0ZvcndhcmRKYWNvYmlhbihjb25zdCBGdW5jdG9yJiBmKSA6IEZ1bmN0b3IoZikge30KKworICAvLyBmb3J3YXJkIGNvbnN0cnVjdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMD4KKyAgQWRvbGNGb3J3YXJkSmFjb2JpYW4oY29uc3QgVDAmIGEwKSA6IEZ1bmN0b3IoYTApIHt9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMT4KKyAgQWRvbGNGb3J3YXJkSmFjb2JpYW4oY29uc3QgVDAmIGEwLCBjb25zdCBUMSYgYTEpIDogRnVuY3RvcihhMCwgYTEpIHt9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIEFkb2xjRm9yd2FyZEphY29iaWFuKGNvbnN0IFQwJiBhMCwgY29uc3QgVDEmIGExLCBjb25zdCBUMSYgYTIpIDogRnVuY3RvcihhMCwgYTEsIGEyKSB7fQorCisgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rvcjo6SW5wdXRUeXBlIElucHV0VHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yOjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0b3I6OkphY29iaWFuVHlwZSBKYWNvYmlhblR5cGU7CisKKyAgdHlwZWRlZiBNYXRyaXg8QWN0aXZlU2NhbGFyLCBJbnB1dFR5cGU6OlNpemVBdENvbXBpbGVUaW1lLCAxPiBBY3RpdmVJbnB1dDsKKyAgdHlwZWRlZiBNYXRyaXg8QWN0aXZlU2NhbGFyLCBWYWx1ZVR5cGU6OlNpemVBdENvbXBpbGVUaW1lLCAxPiBBY3RpdmVWYWx1ZTsKKworICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IElucHV0VHlwZSYgeCwgVmFsdWVUeXBlKiB2LCBKYWNvYmlhblR5cGUqIF9qYWMpIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQodiE9MCk7CisgICAgaWYgKCFfamFjKQorICAgIHsKKyAgICAgIEZ1bmN0b3I6Om9wZXJhdG9yKCkoeCwgdik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgSmFjb2JpYW5UeXBlJiBqYWMgPSAqX2phYzsKKworICAgIEFjdGl2ZUlucHV0IGF4ID0geC50ZW1wbGF0ZSBjYXN0PEFjdGl2ZVNjYWxhcj4oKTsKKyAgICBBY3RpdmVWYWx1ZSBhdihqYWMucm93cygpKTsKKworICAgIGZvciAoaW50IGo9MDsgajxqYWMuY29scygpOyBqKyspCisgICAgICBmb3IgKGludCBpPTA7IGk8amFjLmNvbHMoKTsgaSsrKQorICAgICAgICBheFtpXS5zZXRBRFZhbHVlKGosIGk9PWogPyAxIDogMCk7CisKKyAgICBGdW5jdG9yOjpvcGVyYXRvcigpKGF4LCAmYXYpOworCisgICAgZm9yIChpbnQgaT0wOyBpPGphYy5yb3dzKCk7IGkrKykKKyAgICB7CisgICAgICAoKnYpW2ldID0gYXZbaV0uZ2V0VmFsdWUoKTsKKyAgICAgIGZvciAoaW50IGo9MDsgajxqYWMuY29scygpOyBqKyspCisgICAgICAgIGphYy5jb2VmZlJlZihpLGopID0gYXZbaV0uZ2V0QURWYWx1ZShqKTsKKyAgICB9CisgIH0KK3Byb3RlY3RlZDoKKworfTsKKworLy9AfQorCit9CisKKyNlbmRpZiAvLyBFSUdFTl9BRExPQ19GT1JXQVJECmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9BbGlnbmVkVmVjdG9yMyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0FsaWduZWRWZWN0b3IzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZDBlYjQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9BbGlnbmVkVmVjdG9yMwpAQCAtMCwwICsxLDE4OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQUxJR05FRF9WRUNUT1IzCisjZGVmaW5lIEVJR0VOX0FMSUdORURfVkVDVE9SMworCisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcaW5ncm91cCBVbnN1cHBvcnRlZF9tb2R1bGVzCisgICogXGRlZmdyb3VwIEFsaWduZWRWZWN0b3IzX01vZHVsZSBBbGlnbmVkIHZlY3RvcjMgbW9kdWxlCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9BbGlnbmVkVmVjdG9yMz4KKyAgKiBcZW5kY29kZQorICAqLworICAvL0B7CisKKworLyoqIFxjbGFzcyBBbGlnbmVkVmVjdG9yMworICAqCisgICogXGJyaWVmIEEgdmVjdG9yaXphdGlvbiBmcmllbmRseSAzRCB2ZWN0b3IKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIDNEIHZlY3RvciBpbnRlcm5hbGx5IHVzaW5nIGEgNEQgdmVjdG9yCisgICogc3VjaCB0aGF0IHZlY3Rvcml6YXRpb24gY2FuIGJlIHNlYW1sZXNzbHkgZW5hYmxlZC4gT2YgY291cnNlLAorICAqIHRoZSBzYW1lIHJlc3VsdCBjYW4gYmUgYWNoaWV2ZWQgYnkgZGlyZWN0bHkgdXNpbmcgYSA0RCB2ZWN0b3IuCisgICogVGhpcyBjbGFzcyBtYWtlcyB0aGlzIHByb2Nlc3Mgc2ltcGxlci4KKyAgKgorICAqLworLy8gVE9ETyBzcGVjaWFsaXplIEN3aXNlCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyPiBjbGFzcyBBbGlnbmVkVmVjdG9yMzsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+IHN0cnVjdCB0cmFpdHM8QWxpZ25lZFZlY3RvcjM8X1NjYWxhcj4gPgorICA6IHRyYWl0czxNYXRyaXg8X1NjYWxhciwzLDEsMCw0LDE+ID4KK3sKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+IGNsYXNzIEFsaWduZWRWZWN0b3IzCisgIDogcHVibGljIE1hdHJpeEJhc2U8QWxpZ25lZFZlY3RvcjM8X1NjYWxhcj4gPgoreworICAgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsNCwxPiBDb2VmZlR5cGU7CisgICAgQ29lZmZUeXBlIG1fY29lZmZzOworICBwdWJsaWM6CisKKyAgICB0eXBlZGVmIE1hdHJpeEJhc2U8QWxpZ25lZFZlY3RvcjM8X1NjYWxhcj4gPiBCYXNlOwkKKyAgICBFSUdFTl9ERU5TRV9QVUJMSUNfSU5URVJGQUNFKEFsaWduZWRWZWN0b3IzKQorICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKjsKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeyByZXR1cm4gMzsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0CisgICAgeyByZXR1cm4gbV9jb2VmZnMuY29lZmYocm93LCBjb2wpOyB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7IHJldHVybiBtX2NvZWZmcy5jb2VmZlJlZihyb3csIGNvbCk7IH0KKworICAgIGlubGluZSBjb25zdCBTY2FsYXImIGNvZWZmKEluZGV4IGluZGV4KSBjb25zdAorICAgIHsgcmV0dXJuIG1fY29lZmZzLmNvZWZmKGluZGV4KTsgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWYoSW5kZXggaW5kZXgpCisgICAgeyByZXR1cm4gbV9jb2VmZnMuY29lZmZSZWYoaW5kZXgpO30KKworCisgICAgaW5saW5lIEFsaWduZWRWZWN0b3IzKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5LCBjb25zdCBTY2FsYXImIHopCisgICAgICA6IG1fY29lZmZzKHgsIHksIHosIFNjYWxhcigwKSkKKyAgICB7fQorCisgICAgaW5saW5lIEFsaWduZWRWZWN0b3IzKGNvbnN0IEFsaWduZWRWZWN0b3IzJiBvdGhlcikKKyAgICAgIDogQmFzZSgpLCBtX2NvZWZmcyhvdGhlci5tX2NvZWZmcykKKyAgICB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgaW50IFNpemU9WHByVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU+CisgICAgc3RydWN0IGdlbmVyaWNfYXNzaWduX3NlbGVjdG9yIHt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4gc3RydWN0IGdlbmVyaWNfYXNzaWduX3NlbGVjdG9yPFhwclR5cGUsND4KKyAgICB7CisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQgcnVuKEFsaWduZWRWZWN0b3IzJiBkZXN0LCBjb25zdCBYcHJUeXBlJiBzcmMpCisgICAgICB7CisgICAgICAgIGRlc3QubV9jb2VmZnMgPSBzcmM7CisgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+IHN0cnVjdCBnZW5lcmljX2Fzc2lnbl9zZWxlY3RvcjxYcHJUeXBlLDM+CisgICAgeworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkIHJ1bihBbGlnbmVkVmVjdG9yMyYgZGVzdCwgY29uc3QgWHByVHlwZSYgc3JjKQorICAgICAgeworICAgICAgICBkZXN0Lm1fY29lZmZzLnRlbXBsYXRlIGhlYWQ8Mz4oKSA9IHNyYzsKKyAgICAgICAgZGVzdC5tX2NvZWZmcy53KCkgPSBTY2FsYXIoMCk7CisgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CisgICAgaW5saW5lIGV4cGxpY2l0IEFsaWduZWRWZWN0b3IzKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIGdlbmVyaWNfYXNzaWduX3NlbGVjdG9yPERlcml2ZWQ+OjpydW4oKnRoaXMsb3RoZXIuZGVyaXZlZCgpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMmIG9wZXJhdG9yPShjb25zdCBBbGlnbmVkVmVjdG9yMyYgb3RoZXIpCisgICAgeyBtX2NvZWZmcyA9IG90aGVyLm1fY29lZmZzOyByZXR1cm4gKnRoaXM7IH0KKworCisgICAgaW5saW5lIEFsaWduZWRWZWN0b3IzIG9wZXJhdG9yKyhjb25zdCBBbGlnbmVkVmVjdG9yMyYgb3RoZXIpIGNvbnN0CisgICAgeyByZXR1cm4gQWxpZ25lZFZlY3RvcjMobV9jb2VmZnMgKyBvdGhlci5tX2NvZWZmcyk7IH0KKworICAgIGlubGluZSBBbGlnbmVkVmVjdG9yMyYgb3BlcmF0b3IrPShjb25zdCBBbGlnbmVkVmVjdG9yMyYgb3RoZXIpCisgICAgeyBtX2NvZWZmcyArPSBvdGhlci5tX2NvZWZmczsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMgb3BlcmF0b3ItKGNvbnN0IEFsaWduZWRWZWN0b3IzJiBvdGhlcikgY29uc3QKKyAgICB7IHJldHVybiBBbGlnbmVkVmVjdG9yMyhtX2NvZWZmcyAtIG90aGVyLm1fY29lZmZzKTsgfQorCisgICAgaW5saW5lIEFsaWduZWRWZWN0b3IzIG9wZXJhdG9yLT0oY29uc3QgQWxpZ25lZFZlY3RvcjMmIG90aGVyKQorICAgIHsgbV9jb2VmZnMgLT0gb3RoZXIubV9jb2VmZnM7IHJldHVybiAqdGhpczsgfQorCisgICAgaW5saW5lIEFsaWduZWRWZWN0b3IzIG9wZXJhdG9yKihjb25zdCBTY2FsYXImIHMpIGNvbnN0CisgICAgeyByZXR1cm4gQWxpZ25lZFZlY3RvcjMobV9jb2VmZnMgKiBzKTsgfQorCisgICAgaW5saW5lIGZyaWVuZCBBbGlnbmVkVmVjdG9yMyBvcGVyYXRvciooY29uc3QgU2NhbGFyJiBzLGNvbnN0IEFsaWduZWRWZWN0b3IzJiB2ZWMpCisgICAgeyByZXR1cm4gQWxpZ25lZFZlY3RvcjMocyAqIHZlYy5tX2NvZWZmcyk7IH0KKworICAgIGlubGluZSBBbGlnbmVkVmVjdG9yMyYgb3BlcmF0b3IqPShjb25zdCBTY2FsYXImIHMpCisgICAgeyBtX2NvZWZmcyAqPSBzOyByZXR1cm4gKnRoaXM7IH0KKworICAgIGlubGluZSBBbGlnbmVkVmVjdG9yMyBvcGVyYXRvci8oY29uc3QgU2NhbGFyJiBzKSBjb25zdAorICAgIHsgcmV0dXJuIEFsaWduZWRWZWN0b3IzKG1fY29lZmZzIC8gcyk7IH0KKworICAgIGlubGluZSBBbGlnbmVkVmVjdG9yMyYgb3BlcmF0b3IvPShjb25zdCBTY2FsYXImIHMpCisgICAgeyBtX2NvZWZmcyAvPSBzOyByZXR1cm4gKnRoaXM7IH0KKworICAgIGlubGluZSBTY2FsYXIgZG90KGNvbnN0IEFsaWduZWRWZWN0b3IzJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9jb2VmZnMudygpPT1TY2FsYXIoMCkpOworICAgICAgZWlnZW5fYXNzZXJ0KG90aGVyLm1fY29lZmZzLncoKT09U2NhbGFyKDApKTsKKyAgICAgIHJldHVybiBtX2NvZWZmcy5kb3Qob3RoZXIubV9jb2VmZnMpOworICAgIH0KKworICAgIGlubGluZSB2b2lkIG5vcm1hbGl6ZSgpCisgICAgeworICAgICAgbV9jb2VmZnMgLz0gbm9ybSgpOworICAgIH0KKworICAgIGlubGluZSBBbGlnbmVkVmVjdG9yMyBub3JtYWxpemVkKCkKKyAgICB7CisgICAgICByZXR1cm4gQWxpZ25lZFZlY3RvcjMobV9jb2VmZnMgLyBub3JtKCkpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXIgc3VtKCkgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9jb2VmZnMudygpPT1TY2FsYXIoMCkpOworICAgICAgcmV0dXJuIG1fY29lZmZzLnN1bSgpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXIgc3F1YXJlZE5vcm0oKSBjb25zdAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX2NvZWZmcy53KCk9PVNjYWxhcigwKSk7CisgICAgICByZXR1cm4gbV9jb2VmZnMuc3F1YXJlZE5vcm0oKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyIG5vcm0oKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6c3FydChzcXVhcmVkTm9ybSgpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQWxpZ25lZFZlY3RvcjMgY3Jvc3MoY29uc3QgQWxpZ25lZFZlY3RvcjMmIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBBbGlnbmVkVmVjdG9yMyhtX2NvZWZmcy5jcm9zczMob3RoZXIubV9jb2VmZnMpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICAgIGlubGluZSBib29sIGlzQXBwcm94KGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG90aGVyLCBSZWFsU2NhbGFyIGVwcz1OdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fY29lZmZzLnRlbXBsYXRlIGhlYWQ8Mz4oKS5pc0FwcHJveChvdGhlcixlcHMpOworICAgIH0KK307CisKKy8vQH0KKworfQorCisjZW5kaWYgLy8gRUlHRU5fQUxJR05FRF9WRUNUT1IzCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9BdXRvRGlmZiBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0F1dG9EaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzNiNDIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9BdXRvRGlmZgpAQCAtMCwwICsxLDQwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FVVE9ESUZGX01PRFVMRQorI2RlZmluZSBFSUdFTl9BVVRPRElGRl9NT0RVTEUKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxpbmdyb3VwIFVuc3VwcG9ydGVkX21vZHVsZXMKKyAgKiBcZGVmZ3JvdXAgQXV0b0RpZmZfTW9kdWxlIEF1dG8gRGlmZiBtb2R1bGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIGZlYXR1cmVzIGZvcndhcmQgYXV0b21hdGljIGRpZmZlcmVudGF0aW9uIHZpYSBhIHNpbXBsZQorICAqIHRlbXBsYXRlZCBzY2FsYXIgdHlwZSB3cmFwcGVyIEF1dG9EaWZmU2NhbGFyLgorICAqCisgICogV2FybmluZyA6IHRoaXMgc2hvdWxkIE5PVCBiZSBjb25mdXNlZCB3aXRoIG51bWVyaWNhbCBkaWZmZXJlbnRpYXRpb24sIHdoaWNoCisgICogaXMgYSBkaWZmZXJlbnQgbWV0aG9kIGFuZCBoYXMgaXRzIG93biBtb2R1bGUgaW4gRWlnZW4gOiBccmVmIE51bWVyaWNhbERpZmZfTW9kdWxlLgorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQXV0b0RpZmY+CisgICogXGVuZGNvZGUKKyAgKi8KKy8vQHsKKworfQorCisjaW5jbHVkZSAic3JjL0F1dG9EaWZmL0F1dG9EaWZmU2NhbGFyLmgiCisvLyAjaW5jbHVkZSAic3JjL0F1dG9EaWZmL0F1dG9EaWZmVmVjdG9yLmgiCisjaW5jbHVkZSAic3JjL0F1dG9EaWZmL0F1dG9EaWZmSmFjb2JpYW4uaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsKKy8vQH0KK30KKworI2VuZGlmIC8vIEVJR0VOX0FVVE9ESUZGX01PRFVMRQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vQlZIIGIvdW5zdXBwb3J0ZWQvRWlnZW4vQlZICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGE3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9CVkgKQEAgLTAsMCArMSw5NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSWx5YSBCYXJhbiA8aWJhcmFuQG1pdC5lZHU+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0JWSF9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9CVkhfTU9EVUxFX0gKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CisjaW5jbHVkZSA8RWlnZW4vU3RkVmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxxdWV1ZT4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxpbmdyb3VwIFVuc3VwcG9ydGVkX21vZHVsZXMKKyAgKiBcZGVmZ3JvdXAgQlZIX01vZHVsZSBCVkggbW9kdWxlCisgICogXGJyaWVmIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMgYm91bmRpbmcgdm9sdW1lIGhpZXJhcmNoeSBhbGdvcml0aG1zCisgICogYW5kIHJlZmVyZW5jZSB0cmVlIGltcGxlbWVudGF0aW9ucy4KKyAgKgorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQlZIPgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBBIGJvdW5kaW5nIHZvbHVtZSBoaWVyYXJjaHkgKEJWSCkgY2FuIGFjY2VsZXJhdGUgbWFueSBnZW9tZXRyaWMgcXVlcmllcy4gIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbgorICAqIG9mIHRoZSB0d28gYmFzaWMgYWxnb3JpdGhtcyBvdmVyIGEgQlZIOiBpbnRlcnNlY3Rpb24gb2YgYSBxdWVyeSBvYmplY3QgYWdhaW5zdCBhbGwgb2JqZWN0cyBpbiB0aGUgaGllcmFyY2h5IGFuZCBtaW5pbWl6YXRpb24KKyAgKiBvZiBhIGZ1bmN0aW9uIG92ZXIgdGhlIG9iamVjdHMgaW4gdGhlIGhpZXJhcmNoeS4gIEl0IGFsc28gcHJvdmlkZXMgaW50ZXJzZWN0aW9uIGFuZCBtaW5pbWl6YXRpb24gb3ZlciBhIGNhcnRlc2lhbiBwcm9kdWN0IG9mCisgICogdHdvIEJWSCdzLiAgQSBCVkggYWNjZWxlcmF0ZXMgaW50ZXJzZWN0aW9uIGJ5IHVzaW5nIHRoZSBmYWN0IHRoYXQgaWYgYSBxdWVyeSBvYmplY3QgZG9lcyBub3QgaW50ZXJzZWN0IGEgdm9sdW1lLCB0aGVuIGl0IGNhbm5vdAorICAqIGludGVyc2VjdCBhbnkgb2JqZWN0IGNvbnRhaW5lZCBpbiB0aGF0IHZvbHVtZS4gIFNpbWlsYXJseSwgYSBCVkggYWNjZWxlcmF0ZXMgbWluaW1pemF0aW9uIGJlY2F1c2UgdGhlIG1pbmltdW0gb2YgYSBmdW5jdGlvbgorICAqIG92ZXIgYSB2b2x1bWUgaXMgbm8gZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIG9mIGEgZnVuY3Rpb24gb3ZlciBhbnkgb2JqZWN0IGNvbnRhaW5lZCBpbiBpdC4KKyAgKgorICAqIFNvbWUgc2FtcGxlIHF1ZXJpZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiBpbiB0ZXJtcyBvZiBpbnRlcnNlY3Rpb24gYXJlOgorICAqICAgLSBEZXRlcm1pbmUgYWxsIHBvaW50cyB3aGVyZSBhIHJheSBpbnRlcnNlY3RzIGEgdHJpYW5nbGUgbWVzaAorICAqICAgLSBHaXZlbiBhIHNldCBvZiBwb2ludHMsIGRldGVybWluZSB3aGljaCBhcmUgY29udGFpbmVkIGluIGEgcXVlcnkgc3BoZXJlCisgICogICAtIEdpdmVuIGEgc2V0IG9mIHNwaGVyZXMsIGRldGVybWluZSB3aGljaCBjb250YWluIHRoZSBxdWVyeSBwb2ludAorICAqICAgLSBHaXZlbiBhIHNldCBvZiBkaXNrcywgZGV0ZXJtaW5lIGlmIGFueSBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCBpbiBhIHF1ZXJ5IHJlY3RhbmdsZSAocmVwcmVzZW50IGVhY2ggMkQgZGlzayBhcyBhIHBvaW50IFxmJCh4LHkscilcZiQKKyAgKiAgICAgaW4gM0QgYW5kIHJlcHJlc2VudCB0aGUgcmVjdGFuZ2xlIGFzIGEgcHlyYW1pZCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlIGFuZCBzaHJpbmtpbmcgaW4gdGhlIFxmJHJcZiQgZGlyZWN0aW9uKQorICAqICAgLSBHaXZlbiBhIHNldCBvZiBwb2ludHMsIGNvdW50IGhvdyBtYW55IHBhaXJzIGFyZSBcZiRkXHBtXGVwc2lsb25cZiQgYXBhcnQgKGRvbmUgYnkgbG9va2luZyBhdCB0aGUgY2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhlIHNldAorICAqICAgICBvZiBwb2ludHMgd2l0aCBpdHNlbGYpCisgICoKKyAgKiBTb21lIHNhbXBsZSBxdWVyaWVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gaW4gdGVybXMgb2YgZnVuY3Rpb24gbWluaW1pemF0aW9uIG92ZXIgYSBzZXQgb2Ygb2JqZWN0cyBhcmU6CisgICogICAtIEZpbmQgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIGEgcmF5IGFuZCBhIHRyaWFuZ2xlIG1lc2ggY2xvc2VzdCB0byB0aGUgcmF5IG9yaWdpbiAoZnVuY3Rpb24gaXMgaW5maW5pdGUgb2ZmIHRoZSByYXkpCisgICogICAtIEdpdmVuIGEgcG9seWxpbmUgYW5kIGEgcXVlcnkgcG9pbnQsIGRldGVybWluZSB0aGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgcG9seWxpbmUgdG8gdGhlIHF1ZXJ5CisgICogICAtIEZpbmQgdGhlIGRpYW1ldGVyIG9mIGEgcG9pbnQgY2xvdWQgKGRvbmUgYnkgbG9va2luZyBhdCB0aGUgY2FydGVzaWFuIHByb2R1Y3QgYW5kIHVzaW5nIG5lZ2F0aXZlIGRpc3RhbmNlIGFzIHRoZSBmdW5jdGlvbikKKyAgKiAgIC0gRGV0ZXJtaW5lIGhvdyBmYXIgdHdvIG1lc2hlcyBhcmUgZnJvbSBjb2xsaWRpbmcgKHRoaXMgaXMgYWxzbyBhIGNhcnRlc2lhbiBwcm9kdWN0IHF1ZXJ5KQorICAqCisgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkZWNvdXBsZXMgdGhlIGJhc2ljIGFsZ29yaXRobXMgYm90aCBmcm9tIHRoZSB0eXBlIG9mIGhpZXJhcmNoeSAoYW5kIHRoZSB0eXBlcyBvZiB0aGUgYm91bmRpbmcgdm9sdW1lcykgYW5kCisgICogZnJvbSB0aGUgcGFydGljdWxhcnMgb2YgdGhlIHF1ZXJ5LiAgVG8gZW5hYmxlIGFic3RyYWN0aW9uIGZyb20gdGhlIEJWSCwgdGhlIEJWSCBpcyByZXF1aXJlZCB0byBpbXBsZW1lbnQgYSBnZW5lcmljIG1lY2hhbmlzbQorICAqIGZvciB0cmF2ZXJzYWwuICBUbyBhYnN0cmFjdCBmcm9tIHRoZSBxdWVyeSwgdGhlIHF1ZXJ5IGlzIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRyYWNrIG9mIHJlc3VsdHMuCisgICoKKyAgKiBUbyBiZSB1c2VkIGluIHRoZSBhbGdvcml0aG1zLCBhIGhpZXJhcmNoeSBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHRyYXZlcnNhbCBtZWNoYW5pc20gKHNlZSBLZEJWSCBmb3IgYSBzYW1wbGUgaW1wbGVtZW50YXRpb24pOiBcY29kZQorICAgICAgdHlwZWRlZiBWb2x1bWUgIC8vdGhlIHR5cGUgb2YgYm91bmRpbmcgdm9sdW1lCisgICAgICB0eXBlZGVmIE9iamVjdCAgLy90aGUgdHlwZSBvZiBvYmplY3QgaW4gdGhlIGhpZXJhcmNoeQorICAgICAgdHlwZWRlZiBJbmRleCAgIC8vYSByZWZlcmVuY2UgdG8gYSBub2RlIGluIHRoZSBoaWVyYXJjaHktLXR5cGljYWxseSBhbiBpbnQgb3IgYSBwb2ludGVyCisgICAgICB0eXBlZGVmIFZvbHVtZUl0ZXJhdG9yIC8vYW4gaXRlcmF0b3IgdHlwZSBvdmVyIG5vZGUgY2hpbGRyZW4tLXJldHVybnMgSW5kZXgKKyAgICAgIHR5cGVkZWYgT2JqZWN0SXRlcmF0b3IgLy9hbiBpdGVyYXRvciBvdmVyIG9iamVjdCAobGVhZikgY2hpbGRyZW4tLXJldHVybnMgY29uc3QgT2JqZWN0ICYKKyAgICAgIEluZGV4IGdldFJvb3RJbmRleCgpIGNvbnN0IC8vcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGhpZXJhcmNoeSByb290CisgICAgICBjb25zdCBWb2x1bWUgJmdldFZvbHVtZShJbmRleCBpbmRleCkgY29uc3QgLy9yZXR1cm5zIHRoZSBib3VuZGluZyB2b2x1bWUgb2YgdGhlIG5vZGUgYXQgZ2l2ZW4gaW5kZXgKKyAgICAgIHZvaWQgZ2V0Q2hpbGRyZW4oSW5kZXggaW5kZXgsIFZvbHVtZUl0ZXJhdG9yICZvdXRWQmVnaW4sIFZvbHVtZUl0ZXJhdG9yICZvdXRWRW5kLAorICAgICAgICAgICAgICAgICAgICAgIE9iamVjdEl0ZXJhdG9yICZvdXRPQmVnaW4sIE9iamVjdEl0ZXJhdG9yICZvdXRPRW5kKSBjb25zdAorICAgICAgLy9nZXRDaGlsZHJlbiB0YWtlcyBhIG5vZGUgaW5kZXggYW5kIG1ha2VzIFtvdXRWQmVnaW4sIG91dFZFbmQpIHJhbmdlIG92ZXIgaXRzIG5vZGUgY2hpbGRyZW4KKyAgICAgIC8vYW5kIFtvdXRPQmVnaW4sIG91dE9FbmQpIHJhbmdlIG92ZXIgaXRzIG9iamVjdCBjaGlsZHJlbgorICAgIFxlbmRjb2RlCisgICoKKyAgKiBUbyB1c2UgdGhlIGhpZXJhcmNoeSwgY2FsbCBCVkludGVyc2VjdCBvciBCVk1pbmltaXplLCBwYXNzaW5nIGl0IGEgQlZIIChvciB0d28sIGZvciBjYXJ0ZXNpYW4gcHJvZHVjdCkgYW5kIGEgbWluaW1pemVyIG9yIGludGVyc2VjdG9yLgorICAqIEZvciBhbiBpbnRlcnNlY3Rpb24gcXVlcnkgb24gYSBzaW5nbGUgQlZILCB0aGUgaW50ZXJzZWN0b3IgZW5jYXBzdWxhdGVzIHRoZSBxdWVyeSBhbmQgbXVzdCBwcm92aWRlIHR3byBmdW5jdGlvbnM6CisgICogXGNvZGUKKyAgICAgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lKGNvbnN0IFZvbHVtZSAmdm9sdW1lKSAvL3JldHVybnMgdHJ1ZSBpZiB0aGUgcXVlcnkgaW50ZXJzZWN0cyB0aGUgdm9sdW1lCisgICAgICBib29sIGludGVyc2VjdE9iamVjdChjb25zdCBPYmplY3QgJm9iamVjdCkgLy9yZXR1cm5zIHRydWUgaWYgdGhlIGludGVyc2VjdGlvbiBzZWFyY2ggc2hvdWxkIHRlcm1pbmF0ZSBpbW1lZGlhdGVseQorICAgIFxlbmRjb2RlCisgICogVGhlIGd1YXJhbnRlZSB0aGF0IEJWSW50ZXJzZWN0IHByb3ZpZGVzIGlzIHRoYXQgaW50ZXJzZWN0T2JqZWN0IHdpbGwgYmUgY2FsbGVkIG9uIGV2ZXJ5IG9iamVjdCB3aG9zZSBib3VuZGluZyB2b2x1bWUKKyAgKiBpbnRlcnNlY3RzIHRoZSBxdWVyeSAoYnV0IHBvc3NpYmx5IG9uIG90aGVyIG9iamVjdHMgdG9vKSB1bmxlc3MgdGhlIHNlYXJjaCBpcyB0ZXJtaW5hdGVkIHByZW1hdHVyZWx5LiAgSXQgaXMgdGhlCisgICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGludGVyc2VjdE9iamVjdCBmdW5jdGlvbiB0byBrZWVwIHRyYWNrIG9mIHRoZSByZXN1bHRzIGluIHdoYXRldmVyIG1hbm5lciBpcyBhcHByb3ByaWF0ZS4KKyAgKiBUaGUgY2FydGVzaWFuIHByb2R1Y3QgaW50ZXJzZWN0aW9uIGFuZCB0aGUgQlZNaW5pbWl6ZSBxdWVyaWVzIGFyZSBzaW1pbGFyLS1zZWUgdGhlaXIgaW5kaXZpZHVhbCBkb2N1bWVudGF0aW9uLgorICAqCisgICogVGhlIGZvbGxvd2luZyBpcyBhIHNpbXBsZSBidXQgY29tcGxldGUgZXhhbXBsZSBmb3IgaG93IHRvIHVzZSB0aGUgQlZIIHRvIGFjY2VsZXJhdGUgdGhlIHNlYXJjaCBmb3IgYSBjbG9zZXN0IHJlZC1ibHVlIHBvaW50IHBhaXI6CisgICogXGluY2x1ZGUgQlZIX0V4YW1wbGUuY3BwCisgICogT3V0cHV0OiBcdmVyYmluY2x1ZGUgQlZIX0V4YW1wbGUub3V0CisgICovCit9CisKKy8vQHsKKworI2luY2x1ZGUgInNyYy9CVkgvQlZBbGdvcml0aG1zLmgiCisjaW5jbHVkZSAic3JjL0JWSC9LZEJWSC5oIgorCisvL0B9CisKKyNlbmRpZiAvLyBFSUdFTl9CVkhfTU9EVUxFX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvRWlnZW4vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2MWU3MgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTEgQEAKK3NldChFaWdlbl9IRUFERVJTIEFkb2xjRm9yd2FyZCBCVkggSXRlcmF0aXZlU29sdmVycyBNYXRyaXhGdW5jdGlvbnMgTW9yZVZlY3Rvcml6YXRpb24gQXV0b0RpZmYgQWxpZ25lZFZlY3RvcjMgUG9seW5vbWlhbHMKKyAgICAgICAgICAgICAgICAgIEZGVCBOb25MaW5lYXJPcHRpbWl6YXRpb24gU3BhcnNlRXh0cmEgSXRlcmF0aXZlU29sdmVycworICAgICAgICAgICAgICAgICAgTnVtZXJpY2FsRGlmZiBTa3lsaW5lIE1QUmVhbFN1cHBvcnQgT3BlbkdMU3VwcG9ydCBLcm9uZWNrZXJQcm9kdWN0IFNwbGluZXMKKyAgICkKKworaW5zdGFsbChGSUxFUworICAke0VpZ2VuX0hFQURFUlN9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdW5zdXBwb3J0ZWQvRWlnZW4gQ09NUE9ORU5UIERldmVsCisgICkKKworYWRkX3N1YmRpcmVjdG9yeShzcmMpCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9GRlQgYi91bnN1cHBvcnRlZC9FaWdlbi9GRlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzM2M2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL0ZGVApAQCAtMCwwICsxLDQxOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4gCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IE1hcmsgQm9yZ2VyZGluZyBtYXJrIGEgYm9yZ2VyZGluZyBuZXQKKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fRkZUX0gKKyNkZWZpbmUgRUlHRU5fRkZUX0gKKworI2luY2x1ZGUgPGNvbXBsZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorCisKKy8qKiBcaW5ncm91cCBVbnN1cHBvcnRlZF9tb2R1bGVzCisgICogXGRlZmdyb3VwIEZGVF9Nb2R1bGUgRmFzdCBGb3VyaWVyIFRyYW5zZm9ybSBtb2R1bGUKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0ZGVD4KKyAgKiBcZW5kY29kZQorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgRmFzdCBGb3VyaWVyIHRyYW5zZm9ybWF0aW9uLCB3aXRoIGEgY29uZmlndXJhYmxlIGJhY2tlbmQKKyAgKiBpbXBsZW1lbnRhdGlvbi4KKyAgKgorICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGtpc3NmZnQuIEl0IGlzIGEgc21hbGwsIGZyZWUsIGFuZAorICAqIHJlYXNvbmFibHkgZWZmaWNpZW50IGRlZmF1bHQuCisgICoKKyAgKiBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbXBsZW1lbnRhdGlvbiBiYWNrZW5kOgorICAqCisgICogLSBmZnR3IChodHRwOi8vd3d3LmZmdHcub3JnKSA6IGZhc3RlciwgR1BMIC0tIGluY29tcGF0aWJsZSB3aXRoIEVpZ2VuIGluIExHUEwgZm9ybSwgYmlnZ2VyIGNvZGUgc2l6ZS4KKyAgKiAtIE1LTCAoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYXRoX0tlcm5lbF9MaWJyYXJ5KSA6IGZhc3Rlc3QsIGNvbW1lcmNpYWwgLS0gbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIEVpZ2VuIGluIEdQTCBmb3JtLgorICAqCisgICogXHNlY3Rpb24gRkZURGVzaWduIERlc2lnbgorICAqCisgICogVGhlIGZvbGxvd2luZyBkZXNpZ24gZGVjaXNpb25zIHdlcmUgbWFkZSBjb25jZXJuaW5nIHNjYWxpbmcgYW5kCisgICogaGFsZi1zcGVjdHJ1bSBmb3IgcmVhbCBGRlQuCisgICoKKyAgKiBUaGUgaW50ZW50IGlzIHRvIGZhY2lsaXRhdGUgZ2VuZXJpYyBwcm9ncmFtbWluZyBhbmQgZWFzZSBtaWdyYXRpbmcgY29kZQorICAqIGZyb20gIE1hdGxhYi9vY3RhdmUuCisgICogV2UgdGhpbmsgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgRWlnZW4vRkZUIHNob3VsZCBmYXZvciBjb3JyZWN0bmVzcyBhbmQKKyAgKiBnZW5lcmFsaXR5IG92ZXIgc3BlZWQuIE9mIGNvdXJzZSwgdGhlIGNhbGxlciBzaG91bGQgYmUgYWJsZSB0byAib3B0LW91dCIgZnJvbSB0aGlzCisgICogYmVoYXZpb3IgYW5kIGdldCB0aGUgc3BlZWQgaW5jcmVhc2UgaWYgdGhleSB3YW50IGl0LgorICAqCisgICogMSkgJVNjYWxpbmc6CisgICogT3RoZXIgbGlicmFyaWVzIChGRlRXLElNS0wsS0lTU0ZGVCkgIGRvIG5vdCBwZXJmb3JtIHNjYWxpbmcsIHNvIHRoZXJlCisgICogaXMgYSBjb25zdGFudCBnYWluIGluY3VycmVkIGFmdGVyIHRoZSBmb3J3YXJkJmludmVyc2UgdHJhbnNmb3JtcyAsIHNvIAorICAqIElGRlQoRkZUKHgpKSA9IEt4OyAgdGhpcyBpcyBkb25lIHRvIGF2b2lkIGEgdmVjdG9yLWJ5LXZhbHVlIG11bHRpcGx5LiAgCisgICogVGhlIGRvd25zaWRlIGlzIHRoYXQgYWxnb3JpdGhtcyB0aGF0IHdvcmtlZCBjb3JyZWN0bHkgaW4gTWF0bGFiL29jdGF2ZSAKKyAgKiBkb24ndCBiZWhhdmUgdGhlIHNhbWUgd2F5IG9uY2UgaW1wbGVtZW50ZWQgaW4gQysrLgorICAqCisgICogSG93IEVpZ2VuL0ZGVCBkaWZmZXJzOiBpbnZlcnRpYmxlIHNjYWxpbmcgaXMgcGVyZm9ybWVkIHNvIElGRlQoIEZGVCh4KSApID0geC4gCisgICoKKyAgKiAyKSBSZWFsIEZGVCBoYWxmLXNwZWN0cnVtCisgICogT3RoZXIgbGlicmFyaWVzIHVzZSBvbmx5IGhhbGYgdGhlIGZyZXF1ZW5jeSBzcGVjdHJ1bSAocGx1cyBvbmUgZXh0cmEgCisgICogc2FtcGxlIGZvciB0aGUgTnlxdWlzdCBiaW4pIGZvciBhIHJlYWwgRkZULCB0aGUgb3RoZXIgaGFsZiBpcyB0aGUgCisgICogY29uanVnYXRlLXN5bW1ldHJpYyBvZiB0aGUgZmlyc3QgaGFsZi4gIFRoaXMgc2F2ZXMgdGhlbSBhIGNvcHkgYW5kIHNvbWUgCisgICogbWVtb3J5LiAgVGhlIGRvd25zaWRlIGlzIHRoZSBjYWxsZXIgbmVlZHMgdG8gaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciB0aGUgCisgICogbnVtYmVyIG9mIGJpbnMgaW4gY29tcGxleCB2cyByZWFsLgorICAqCisgICogSG93IEVpZ2VuL0ZGVCBkaWZmZXJzOiBUaGUgZnVsbCBzcGVjdHJ1bSBpcyByZXR1cm5lZCBmcm9tIHRoZSBmb3J3YXJkIAorICAqIHRyYW5zZm9ybS4gIFRoaXMgZmFjaWxpdGF0ZXMgZ2VuZXJpYyB0ZW1wbGF0ZSBwcm9ncmFtbWluZyBieSBvYnZpYXRpbmcgCisgICogc2VwYXJhdGUgc3BlY2lhbGl6YXRpb25zIGZvciByZWFsIHZzIGNvbXBsZXguICBPbiB0aGUgaW52ZXJzZQorICAqIHRyYW5zZm9ybSwgb25seSBoYWxmIHRoZSBzcGVjdHJ1bSBpcyBhY3R1YWxseSB1c2VkIGlmIHRoZSBvdXRwdXQgdHlwZSBpcyByZWFsLgorICAqLworIAorCisjaWZkZWYgRUlHRU5fRkZUV19ERUZBVUxUCisvLyBGRlRXOiBmYXN0ZXIsIEdQTCAtLSBpbmNvbXBhdGlibGUgd2l0aCBFaWdlbiBpbiBMR1BMIGZvcm0sIGJpZ2dlciBjb2RlIHNpemUKKyMgIGluY2x1ZGUgPGZmdHczLmg+CisjICBpbmNsdWRlICJzcmMvRkZUL2VpX2ZmdHdfaW1wbC5oIgorICAgbmFtZXNwYWNlIEVpZ2VuIHsKKyAgICAgLy90ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdHlwZWRlZiBzdHJ1Y3QgaW50ZXJuYWw6OmZmdHdfaW1wbCAgZGVmYXVsdF9mZnRfaW1wbDsgdGhpcyBkb2VzIG5vdCB3b3JrCisgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgZGVmYXVsdF9mZnRfaW1wbCA6IHB1YmxpYyBpbnRlcm5hbDo6ZmZ0d19pbXBsPFQ+IHt9OworICAgfQorI2VsaWYgZGVmaW5lZCBFSUdFTl9NS0xfREVGQVVMVAorLy8gVE9ETyAKKy8vIGludGVsIE1hdGggS2VybmVsIExpYnJhcnk6IGZhc3Rlc3QsIGNvbW1lcmNpYWwgLS0gbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIEVpZ2VuIGluIEdQTCBmb3JtCisjICBpbmNsdWRlICJzcmMvRkZUL2VpX2lta2xmZnRfaW1wbC5oIgorICAgbmFtZXNwYWNlIEVpZ2VuIHsKKyAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBkZWZhdWx0X2ZmdF9pbXBsIDogcHVibGljIGludGVybmFsOjppbWtsZmZ0X2ltcGwge307CisgICB9CisjZWxzZQorLy8gaW50ZXJuYWw6Omtpc3NmZnRfaW1wbDogIHNtYWxsLCBmcmVlLCByZWFzb25hYmx5IGVmZmljaWVudCBkZWZhdWx0LCBkZXJpdmVkIGZyb20ga2lzc2ZmdAorLy8KKyMgaW5jbHVkZSAic3JjL0ZGVC9laV9raXNzZmZ0X2ltcGwuaCIKKyAgbmFtZXNwYWNlIEVpZ2VuIHsKKyAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IAorICAgICAgIHN0cnVjdCBkZWZhdWx0X2ZmdF9pbXBsIDogcHVibGljIGludGVybmFsOjpraXNzZmZ0X2ltcGw8VD4ge307CisgIH0KKyNlbmRpZgorCituYW1lc3BhY2UgRWlnZW4geworCisgCisvLyAKK3RlbXBsYXRlPHR5cGVuYW1lIFRfU3JjTWF0LHR5cGVuYW1lIFRfRmZ0SWZjPiBzdHJ1Y3QgZmZ0X2Z3ZF9wcm94eTsKK3RlbXBsYXRlPHR5cGVuYW1lIFRfU3JjTWF0LHR5cGVuYW1lIFRfRmZ0SWZjPiBzdHJ1Y3QgZmZ0X2ludl9wcm94eTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFRfU3JjTWF0LHR5cGVuYW1lIFRfRmZ0SWZjPgorc3RydWN0IHRyYWl0czwgZmZ0X2Z3ZF9wcm94eTxUX1NyY01hdCxUX0ZmdElmYz4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFRfU3JjTWF0OjpQbGFpbk9iamVjdCBSZXR1cm5UeXBlOworfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFRfU3JjTWF0LHR5cGVuYW1lIFRfRmZ0SWZjPgorc3RydWN0IHRyYWl0czwgZmZ0X2ludl9wcm94eTxUX1NyY01hdCxUX0ZmdElmYz4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIFRfU3JjTWF0OjpQbGFpbk9iamVjdCBSZXR1cm5UeXBlOworfTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVF9TcmNNYXQsdHlwZW5hbWUgVF9GZnRJZmM+IAorc3RydWN0IGZmdF9md2RfcHJveHkKKyA6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPGZmdF9md2RfcHJveHk8VF9TcmNNYXQsVF9GZnRJZmM+ID4KK3sKKyAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworCisgIGZmdF9md2RfcHJveHkoY29uc3QgVF9TcmNNYXQmIHNyYyxUX0ZmdElmYyAmIGZmdCwgSW5kZXggbmZmdCkgOiBtX3NyYyhzcmMpLG1faWZjKGZmdCksIG1fbmZmdChuZmZ0KSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFRfRGVzdE1hdD4gdm9pZCBldmFsVG8oVF9EZXN0TWF0JiBkc3QpIGNvbnN0OworCisgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3NyYy5yb3dzKCk7IH0KKyAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fc3JjLmNvbHMoKTsgfQorcHJvdGVjdGVkOgorICBjb25zdCBUX1NyY01hdCAmIG1fc3JjOworICBUX0ZmdElmYyAmIG1faWZjOworICBJbmRleCBtX25mZnQ7Citwcml2YXRlOgorICBmZnRfZndkX3Byb3h5JiBvcGVyYXRvcj0oY29uc3QgZmZ0X2Z3ZF9wcm94eSYpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVF9TcmNNYXQsdHlwZW5hbWUgVF9GZnRJZmM+IAorc3RydWN0IGZmdF9pbnZfcHJveHkKKyA6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPGZmdF9pbnZfcHJveHk8VF9TcmNNYXQsVF9GZnRJZmM+ID4KK3sKKyAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworCisgIGZmdF9pbnZfcHJveHkoY29uc3QgVF9TcmNNYXQmIHNyYyxUX0ZmdElmYyAmIGZmdCwgSW5kZXggbmZmdCkgOiBtX3NyYyhzcmMpLG1faWZjKGZmdCksIG1fbmZmdChuZmZ0KSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFRfRGVzdE1hdD4gdm9pZCBldmFsVG8oVF9EZXN0TWF0JiBkc3QpIGNvbnN0OworCisgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3NyYy5yb3dzKCk7IH0KKyAgSW5kZXggY29scygpIGNvbnN0IHsgcmV0dXJuIG1fc3JjLmNvbHMoKTsgfQorcHJvdGVjdGVkOgorICBjb25zdCBUX1NyY01hdCAmIG1fc3JjOworICBUX0ZmdElmYyAmIG1faWZjOworICBJbmRleCBtX25mZnQ7Citwcml2YXRlOgorICBmZnRfaW52X3Byb3h5JiBvcGVyYXRvcj0oY29uc3QgZmZ0X2ludl9wcm94eSYpOworfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVF9TY2FsYXIsCisgICAgICAgICB0eXBlbmFtZSBUX0ltcGw9ZGVmYXVsdF9mZnRfaW1wbDxUX1NjYWxhcj4gPgorY2xhc3MgRkZUCit7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFRfSW1wbCBpbXBsX3R5cGU7CisgICAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW1wbF90eXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW1wbF90eXBlOjpDb21wbGV4IENvbXBsZXg7CisKKyAgICBlbnVtIEZsYWcgeworICAgICAgRGVmYXVsdD0wLCAvLyBnb29mIHByb29mCisgICAgICBVbnNjYWxlZD0xLAorICAgICAgSGFsZlNwZWN0cnVtPTIsCisgICAgICAvLyBTb21lT3RoZXJTcGVlZE9wdGltaXphdGlvbj00CisgICAgICBTcGVlZHk9MzI3NjcKKyAgICB9OworCisgICAgRkZUKCBjb25zdCBpbXBsX3R5cGUgJiBpbXBsPWltcGxfdHlwZSgpICwgRmxhZyBmbGFncz1EZWZhdWx0ICkgOm1faW1wbChpbXBsKSxtX2ZsYWcoZmxhZ3MpIHsgfQorCisgICAgaW5saW5lCisgICAgYm9vbCBIYXNGbGFnKEZsYWcgZikgY29uc3QgeyByZXR1cm4gKG1fZmxhZyAmIChpbnQpZikgPT0gZjt9CisKKyAgICBpbmxpbmUKKyAgICB2b2lkIFNldEZsYWcoRmxhZyBmKSB7IG1fZmxhZyB8PSAoaW50KWY7fQorCisgICAgaW5saW5lCisgICAgdm9pZCBDbGVhckZsYWcoRmxhZyBmKSB7IG1fZmxhZyAmPSAofihpbnQpZik7fQorCisgICAgaW5saW5lCisgICAgdm9pZCBmd2QoIENvbXBsZXggKiBkc3QsIGNvbnN0IFNjYWxhciAqIHNyYywgSW5kZXggbmZmdCkKKyAgICB7CisgICAgICAgIG1faW1wbC5md2QoZHN0LHNyYyxzdGF0aWNfY2FzdDxpbnQ+KG5mZnQpKTsKKyAgICAgICAgaWYgKCBIYXNGbGFnKEhhbGZTcGVjdHJ1bSkgPT0gZmFsc2UpCisgICAgICAgICAgUmVmbGVjdFNwZWN0cnVtKGRzdCxuZmZ0KTsKKyAgICB9CisKKyAgICBpbmxpbmUKKyAgICB2b2lkIGZ3ZCggQ29tcGxleCAqIGRzdCwgY29uc3QgQ29tcGxleCAqIHNyYywgSW5kZXggbmZmdCkKKyAgICB7CisgICAgICAgIG1faW1wbC5md2QoZHN0LHNyYyxzdGF0aWNfY2FzdDxpbnQ+KG5mZnQpKTsKKyAgICB9CisKKyAgICAvKgorICAgIGlubGluZSAKKyAgICB2b2lkIGZ3ZDIoQ29tcGxleCAqIGRzdCwgY29uc3QgQ29tcGxleCAqIHNyYywgaW50IG4wLGludCBuMSkKKyAgICB7CisgICAgICBtX2ltcGwuZndkMihkc3Qsc3JjLG4wLG4xKTsKKyAgICB9CisgICAgKi8KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSW5wdXQ+CisgICAgaW5saW5lCisgICAgdm9pZCBmd2QoIHN0ZDo6dmVjdG9yPENvbXBsZXg+ICYgZHN0LCBjb25zdCBzdGQ6OnZlY3RvcjxfSW5wdXQ+ICYgc3JjKSAKKyAgICB7CisgICAgICBpZiAoIE51bVRyYWl0czxfSW5wdXQ+OjpJc0NvbXBsZXggPT0gMCAmJiBIYXNGbGFnKEhhbGZTcGVjdHJ1bSkgKQorICAgICAgICBkc3QucmVzaXplKCAoc3JjLnNpemUoKT4+MSkrMSk7IC8vIGhhbGYgdGhlIGJpbnMgKyBOeXF1aXN0IGJpbgorICAgICAgZWxzZQorICAgICAgICBkc3QucmVzaXplKHNyYy5zaXplKCkpOworICAgICAgZndkKCZkc3RbMF0sJnNyY1swXSxzcmMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dERlcml2ZWQsIHR5cGVuYW1lIENvbXBsZXhEZXJpdmVkPgorICAgIGlubGluZQorICAgIHZvaWQgZndkKCBNYXRyaXhCYXNlPENvbXBsZXhEZXJpdmVkPiAmIGRzdCwgY29uc3QgTWF0cml4QmFzZTxJbnB1dERlcml2ZWQ+ICYgc3JjLCBJbmRleCBuZmZ0PS0xKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQ29tcGxleERlcml2ZWQ6OlNjYWxhciBkc3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5wdXREZXJpdmVkOjpTY2FsYXIgc3JjX3R5cGU7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKElucHV0RGVyaXZlZCkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlRfVkVDVE9SX09OTFkoQ29tcGxleERlcml2ZWQpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfVkVDVE9SX1NJWkUoQ29tcGxleERlcml2ZWQsSW5wdXREZXJpdmVkKSAvLyBzaXplIGF0IGNvbXBpbGUtdGltZQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmlzX3NhbWU8ZHN0X3R5cGUsIENvbXBsZXg+Ojp2YWx1ZSksCisgICAgICAgICAgICBZT1VfTUlYRURfRElGRkVSRU5UX05VTUVSSUNfVFlQRVNfX1lPVV9ORUVEX1RPX1VTRV9USEVfQ0FTVF9NRVRIT0RfT0ZfTUFUUklYQkFTRV9UT19DQVNUX05VTUVSSUNfVFlQRVNfRVhQTElDSVRMWSkKKyAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoaW50KElucHV0RGVyaXZlZDo6RmxhZ3MpJmludChDb21wbGV4RGVyaXZlZDo6RmxhZ3MpJkRpcmVjdEFjY2Vzc0JpdCwKKyAgICAgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0VYUFJFU1NJT05TX1dJVEhfRElSRUNUX01FTU9SWV9BQ0NFU1NfU1VDSF9BU19NQVBfT1JfUExBSU5fTUFUUklDRVMpCisKKyAgICAgIGlmIChuZmZ0PDEpCisgICAgICAgIG5mZnQgPSBzcmMuc2l6ZSgpOworCisgICAgICBpZiAoIE51bVRyYWl0czwgc3JjX3R5cGUgPjo6SXNDb21wbGV4ID09IDAgJiYgSGFzRmxhZyhIYWxmU3BlY3RydW0pICkKKyAgICAgICAgZHN0LmRlcml2ZWQoKS5yZXNpemUoIChuZmZ0Pj4xKSsxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZHN0LmRlcml2ZWQoKS5yZXNpemUobmZmdCk7CisKKyAgICAgIGlmICggc3JjLmlubmVyU3RyaWRlKCkgIT0gMSB8fCBzcmMuc2l6ZSgpIDwgbmZmdCApIHsKKyAgICAgICAgTWF0cml4PHNyY190eXBlLDEsRHluYW1pYz4gdG1wOworICAgICAgICBpZiAoc3JjLnNpemUoKTxuZmZ0KSB7CisgICAgICAgICAgdG1wLnNldFplcm8obmZmdCk7CisgICAgICAgICAgdG1wLmJsb2NrKDAsMCxzcmMuc2l6ZSgpLDEgKSA9IHNyYzsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgdG1wID0gc3JjOworICAgICAgICB9CisgICAgICAgIGZ3ZCggJmRzdFswXSwmdG1wWzBdLG5mZnQgKTsKKyAgICAgIH1lbHNleworICAgICAgICBmd2QoICZkc3RbMF0sJnNyY1swXSxuZmZ0ICk7CisgICAgICB9CisgICAgfQorIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0RGVyaXZlZD4KKyAgICBpbmxpbmUKKyAgICBmZnRfZndkX3Byb3h5PCBNYXRyaXhCYXNlPElucHV0RGVyaXZlZD4sIEZGVDxUX1NjYWxhcixUX0ltcGw+ID4KKyAgICBmd2QoIGNvbnN0IE1hdHJpeEJhc2U8SW5wdXREZXJpdmVkPiAmIHNyYywgSW5kZXggbmZmdD0tMSkKKyAgICB7CisgICAgICByZXR1cm4gZmZ0X2Z3ZF9wcm94eTwgTWF0cml4QmFzZTxJbnB1dERlcml2ZWQ+ICxGRlQ8VF9TY2FsYXIsVF9JbXBsPiA+KCBzcmMsICp0aGlzLG5mZnQgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dERlcml2ZWQ+CisgICAgaW5saW5lCisgICAgZmZ0X2ludl9wcm94eTwgTWF0cml4QmFzZTxJbnB1dERlcml2ZWQ+LCBGRlQ8VF9TY2FsYXIsVF9JbXBsPiA+CisgICAgaW52KCBjb25zdCBNYXRyaXhCYXNlPElucHV0RGVyaXZlZD4gJiBzcmMsIEluZGV4IG5mZnQ9LTEpCisgICAgeworICAgICAgcmV0dXJuICBmZnRfaW52X3Byb3h5PCBNYXRyaXhCYXNlPElucHV0RGVyaXZlZD4gLEZGVDxUX1NjYWxhcixUX0ltcGw+ID4oIHNyYywgKnRoaXMsbmZmdCApOworICAgIH0KKworICAgIGlubGluZQorICAgIHZvaWQgaW52KCBDb21wbGV4ICogZHN0LCBjb25zdCBDb21wbGV4ICogc3JjLCBJbmRleCBuZmZ0KQorICAgIHsKKyAgICAgIG1faW1wbC5pbnYoIGRzdCxzcmMsc3RhdGljX2Nhc3Q8aW50PihuZmZ0KSApOworICAgICAgaWYgKCBIYXNGbGFnKCBVbnNjYWxlZCApID09IGZhbHNlKQorICAgICAgICBzY2FsZShkc3QsU2NhbGFyKDEuL25mZnQpLG5mZnQpOyAvLyBzY2FsZSB0aGUgdGltZSBzZXJpZXMKKyAgICB9CisKKyAgICBpbmxpbmUKKyAgICB2b2lkIGludiggU2NhbGFyICogZHN0LCBjb25zdCBDb21wbGV4ICogc3JjLCBJbmRleCBuZmZ0KQorICAgIHsKKyAgICAgIG1faW1wbC5pbnYoIGRzdCxzcmMsc3RhdGljX2Nhc3Q8aW50PihuZmZ0KSApOworICAgICAgaWYgKCBIYXNGbGFnKCBVbnNjYWxlZCApID09IGZhbHNlKQorICAgICAgICBzY2FsZShkc3QsU2NhbGFyKDEuL25mZnQpLG5mZnQpOyAvLyBzY2FsZSB0aGUgdGltZSBzZXJpZXMKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXREZXJpdmVkLCB0eXBlbmFtZSBDb21wbGV4RGVyaXZlZD4KKyAgICBpbmxpbmUKKyAgICB2b2lkIGludiggTWF0cml4QmFzZTxPdXRwdXREZXJpdmVkPiAmIGRzdCwgY29uc3QgTWF0cml4QmFzZTxDb21wbGV4RGVyaXZlZD4gJiBzcmMsIEluZGV4IG5mZnQ9LTEpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBDb21wbGV4RGVyaXZlZDo6U2NhbGFyIHNyY190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBPdXRwdXREZXJpdmVkOjpTY2FsYXIgZHN0X3R5cGU7CisgICAgICBjb25zdCBib29sIHJlYWxmZnQ9IChOdW1UcmFpdHM8ZHN0X3R5cGU+OjpJc0NvbXBsZXggPT0gMCk7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKE91dHB1dERlcml2ZWQpCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKENvbXBsZXhEZXJpdmVkKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX1ZFQ1RPUl9TSVpFKENvbXBsZXhEZXJpdmVkLE91dHB1dERlcml2ZWQpIC8vIHNpemUgYXQgY29tcGlsZS10aW1lCisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxzcmNfdHlwZSwgQ29tcGxleD46OnZhbHVlKSwKKyAgICAgICAgICAgIFlPVV9NSVhFRF9ESUZGRVJFTlRfTlVNRVJJQ19UWVBFU19fWU9VX05FRURfVE9fVVNFX1RIRV9DQVNUX01FVEhPRF9PRl9NQVRSSVhCQVNFX1RPX0NBU1RfTlVNRVJJQ19UWVBFU19FWFBMSUNJVExZKQorICAgICAgRUlHRU5fU1RBVElDX0FTU0VSVChpbnQoT3V0cHV0RGVyaXZlZDo6RmxhZ3MpJmludChDb21wbGV4RGVyaXZlZDo6RmxhZ3MpJkRpcmVjdEFjY2Vzc0JpdCwKKyAgICAgICAgICAgIFRISVNfTUVUSE9EX0lTX09OTFlfRk9SX0VYUFJFU1NJT05TX1dJVEhfRElSRUNUX01FTU9SWV9BQ0NFU1NfU1VDSF9BU19NQVBfT1JfUExBSU5fTUFUUklDRVMpCisKKyAgICAgIGlmIChuZmZ0PDEpIHsgLy9hdXRvbWF0aWMgRkZUIHNpemUgZGV0ZXJtaW5hdGlvbgorICAgICAgICBpZiAoIHJlYWxmZnQgJiYgSGFzRmxhZyhIYWxmU3BlY3RydW0pICkgCisgICAgICAgICAgbmZmdCA9IDIqKHNyYy5zaXplKCktMSk7IC8vYXNzdW1lIGV2ZW4gZmZ0IHNpemUKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5mZnQgPSBzcmMuc2l6ZSgpOworICAgICAgfQorICAgICAgZHN0LmRlcml2ZWQoKS5yZXNpemUoIG5mZnQgKTsKKworICAgICAgLy8gY2hlY2sgZm9yIG5mZnQgdGhhdCBkb2VzIG5vdCBmaXQgdGhlIGlucHV0IGRhdGEgc2l6ZQorICAgICAgSW5kZXggcmVzaXplX2lucHV0PSAoIHJlYWxmZnQgJiYgSGFzRmxhZyhIYWxmU3BlY3RydW0pICkKKyAgICAgICAgPyAoIChuZmZ0LzIrMSkgLSBzcmMuc2l6ZSgpICkKKyAgICAgICAgOiAoIG5mZnQgLSBzcmMuc2l6ZSgpICk7CisKKyAgICAgIGlmICggc3JjLmlubmVyU3RyaWRlKCkgIT0gMSB8fCByZXNpemVfaW5wdXQgKSB7CisgICAgICAgIC8vIGlmIHRoZSB2ZWN0b3IgaXMgc3RyaWRlZCwgdGhlbiB3ZSBuZWVkIHRvIGNvcHkgaXQgdG8gYSBwYWNrZWQgdGVtcG9yYXJ5CisgICAgICAgIE1hdHJpeDxzcmNfdHlwZSwxLER5bmFtaWM+IHRtcDsKKyAgICAgICAgaWYgKCByZXNpemVfaW5wdXQgKSB7CisgICAgICAgICAgc2l6ZV90IG5jb3B5ID0gKHN0ZDo6bWluKShzcmMuc2l6ZSgpLHNyYy5zaXplKCkgKyByZXNpemVfaW5wdXQpOworICAgICAgICAgIHRtcC5zZXRaZXJvKHNyYy5zaXplKCkgKyByZXNpemVfaW5wdXQpOworICAgICAgICAgIGlmICggcmVhbGZmdCAmJiBIYXNGbGFnKEhhbGZTcGVjdHJ1bSkgKSB7CisgICAgICAgICAgICAvLyBwYWQgYXQgdGhlIE55cXVpc3QgYmluCisgICAgICAgICAgICB0bXAuaGVhZChuY29weSkgPSBzcmMuaGVhZChuY29weSk7CisgICAgICAgICAgICB0bXAobmNvcHktMSkgPSByZWFsKHRtcChuY29weS0xKSk7IC8vIGVuZm9yY2UgcmVhbC1vbmx5IE55cXVpc3QgYmluCisgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBzaXplX3QgbmhlYWQsbnRhaWw7CisgICAgICAgICAgICBuaGVhZCA9IDErbmNvcHkvMi0xOyAvLyByYW5nZSAgWzA6cGkpCisgICAgICAgICAgICBudGFpbCA9IG5jb3B5LzItMTsgICAvLyByYW5nZSAoLXBpOjApCisgICAgICAgICAgICB0bXAuaGVhZChuaGVhZCkgPSBzcmMuaGVhZChuaGVhZCk7CisgICAgICAgICAgICB0bXAudGFpbChudGFpbCkgPSBzcmMudGFpbChudGFpbCk7CisgICAgICAgICAgICBpZiAocmVzaXplX2lucHV0PDApIHsgLy9zaHJpbmtpbmcgLS0gY3JlYXRlIHRoZSBOeXF1aXN0IGJpbiBhcyB0aGUgYXZlcmFnZSBvZiB0aGUgdHdvIGJpbnMgdGhhdCBmb2xkIGludG8gaXQKKyAgICAgICAgICAgICAgdG1wKG5oZWFkKSA9ICggc3JjKG5mZnQvMikgKyBzcmMoIHNyYy5zaXplKCkgLSBuZmZ0LzIgKSApKnNyY190eXBlKC41KTsKKyAgICAgICAgICAgIH1lbHNleyAvLyBleHBhbmRpbmcgLS0gc3BsaXQgdGhlIG9sZCBOeXF1aXN0IGJpbiBpbnRvIHR3byBoYWx2ZXMKKyAgICAgICAgICAgICAgdG1wKG5oZWFkKSA9IHNyYyhuaGVhZCkgKiBzcmNfdHlwZSguNSk7CisgICAgICAgICAgICAgIHRtcCh0bXAuc2l6ZSgpLW5oZWFkKSA9IHRtcChuaGVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICB0bXAgPSBzcmM7CisgICAgICAgIH0KKyAgICAgICAgaW52KCAmZHN0WzBdLCZ0bXBbMF0sIG5mZnQpOworICAgICAgfWVsc2V7CisgICAgICAgIGludiggJmRzdFswXSwmc3JjWzBdLCBuZmZ0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX091dHB1dD4KKyAgICBpbmxpbmUKKyAgICB2b2lkIGludiggc3RkOjp2ZWN0b3I8X091dHB1dD4gJiBkc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPENvbXBsZXg+ICYgc3JjLEluZGV4IG5mZnQ9LTEpCisgICAgeworICAgICAgaWYgKG5mZnQ8MSkKKyAgICAgICAgbmZmdCA9ICggTnVtVHJhaXRzPF9PdXRwdXQ+OjpJc0NvbXBsZXggPT0gMCAmJiBIYXNGbGFnKEhhbGZTcGVjdHJ1bSkgKSA/IDIqKHNyYy5zaXplKCktMSkgOiBzcmMuc2l6ZSgpOworICAgICAgZHN0LnJlc2l6ZSggbmZmdCApOworICAgICAgaW52KCAmZHN0WzBdLCZzcmNbMF0sbmZmdCk7CisgICAgfQorCisKKyAgICAvKgorICAgIC8vIFRPRE86IG11bHRpLWRpbWVuc2lvbmFsIEZGVHMKKyAgICBpbmxpbmUgCisgICAgdm9pZCBpbnYyKENvbXBsZXggKiBkc3QsIGNvbnN0IENvbXBsZXggKiBzcmMsIGludCBuMCxpbnQgbjEpCisgICAgeworICAgICAgbV9pbXBsLmludjIoZHN0LHNyYyxuMCxuMSk7CisgICAgICBpZiAoIEhhc0ZsYWcoIFVuc2NhbGVkICkgPT0gZmFsc2UpCisgICAgICAgICAgc2NhbGUoZHN0LDEuLyhuMCpuMSksbjAqbjEpOworICAgIH0KKyAgKi8KKworICAgIGlubGluZQorICAgIGltcGxfdHlwZSAmIGltcGwoKSB7cmV0dXJuIG1faW1wbDt9CisgIHByaXZhdGU6CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVF9EYXRhPgorICAgIGlubGluZQorICAgIHZvaWQgc2NhbGUoVF9EYXRhICogeCxTY2FsYXIgcyxJbmRleCBueCkKKyAgICB7CisjaWYgMQorICAgICAgZm9yIChpbnQgaz0wO2s8bng7KytrKQorICAgICAgICAqeCsrICo9IHM7CisjZWxzZQorICAgICAgaWYgKCAoKHB0cmRpZmZfdCl4KSAmIDE1ICkKKyAgICAgICAgTWF0cml4PFRfRGF0YSwgRHluYW1pYywgMT46Ok1hcCh4LG54KSAqPSBzOworICAgICAgZWxzZQorICAgICAgICBNYXRyaXg8VF9EYXRhLCBEeW5hbWljLCAxPjo6TWFwQWxpZ25lZCh4LG54KSAqPSBzOworICAgICAgICAgLy9NYXRyaXg8VF9EYXRhLCBEeW5hbWljLCBEeW5hbWljPjo6TWFwKHgsbngpICogczsKKyNlbmRpZiAgCisgICAgfQorCisgICAgaW5saW5lCisgICAgdm9pZCBSZWZsZWN0U3BlY3RydW0oQ29tcGxleCAqIGZyZXEsIEluZGV4IG5mZnQpCisgICAgeworICAgICAgLy8gY3JlYXRlIHRoZSBpbXBsaWNpdCByaWdodC1oYWxmIHNwZWN0cnVtIChjb25qdWdhdGUtbWlycm9yIG9mIHRoZSBsZWZ0LWhhbGYpCisgICAgICBJbmRleCBuaGJpbnM9KG5mZnQ+PjEpKzE7CisgICAgICBmb3IgKEluZGV4IGs9bmhiaW5zO2sgPCBuZmZ0OyArK2sgKQorICAgICAgICBmcmVxW2tdID0gY29uaihmcmVxW25mZnQta10pOworICAgIH0KKworICAgIGltcGxfdHlwZSBtX2ltcGw7CisgICAgaW50IG1fZmxhZzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRfU3JjTWF0LHR5cGVuYW1lIFRfRmZ0SWZjPiAKK3RlbXBsYXRlPHR5cGVuYW1lIFRfRGVzdE1hdD4gaW5saW5lIAordm9pZCBmZnRfZndkX3Byb3h5PFRfU3JjTWF0LFRfRmZ0SWZjPjo6ZXZhbFRvKFRfRGVzdE1hdCYgZHN0KSBjb25zdAoreworICAgIG1faWZjLmZ3ZCggZHN0LCBtX3NyYywgbV9uZmZ0KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVF9TcmNNYXQsdHlwZW5hbWUgVF9GZnRJZmM+IAordGVtcGxhdGU8dHlwZW5hbWUgVF9EZXN0TWF0PiBpbmxpbmUgCit2b2lkIGZmdF9pbnZfcHJveHk8VF9TcmNNYXQsVF9GZnRJZmM+OjpldmFsVG8oVF9EZXN0TWF0JiBkc3QpIGNvbnN0Cit7CisgICAgbV9pZmMuaW52KCBkc3QsIG1fc3JjLCBtX25mZnQpOworfQorCit9CisjZW5kaWYKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9JdGVyYXRpdmVTb2x2ZXJzIGIvdW5zdXBwb3J0ZWQvRWlnZW4vSXRlcmF0aXZlU29sdmVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzY5NDZkCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vSXRlcmF0aXZlU29sdmVycwpAQCAtMCwwICsxLDQwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0lURVJBVElWRV9TT0xWRVJTX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX0lURVJBVElWRV9TT0xWRVJTX01PRFVMRV9ICisKKyNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+CisKKy8qKiBcaW5ncm91cCBVbnN1cHBvcnRlZF9tb2R1bGVzCisgICogXGRlZmdyb3VwIEl0ZXJhdGl2ZVNvbHZlcnNfTW9kdWxlIEl0ZXJhdGl2ZSBzb2x2ZXJzIG1vZHVsZQorICAqIFRoaXMgbW9kdWxlIGFpbXMgdG8gcHJvdmlkZSB2YXJpb3VzIGl0ZXJhdGl2ZSBsaW5lYXIgYW5kIG5vbiBsaW5lYXIgc29sdmVyIGFsZ29yaXRobXMuCisgICogSXQgY3VycmVudGx5IHByb3ZpZGVzOgorICAqICAtIGEgY29uc3RyYWluZWQgY29uanVnYXRlIGdyYWRpZW50CisgICogIC0gYSBIb3VzZWhvbGRlciBHTVJFUyBpbXBsZW1lbnRhdGlvbgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0l0ZXJhdGl2ZVNvbHZlcnM+CisgICogXGVuZGNvZGUKKyAgKi8KKy8vQHsKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL3NyYy9taXNjL1NvbHZlLmgiCisjaW5jbHVkZSAiLi4vLi4vRWlnZW4vc3JjL21pc2MvU3BhcnNlU29sdmUuaCIKKworI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVTb2x2ZXJzL0l0ZXJhdGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJzcmMvSXRlcmF0aXZlU29sdmVycy9Db25zdHJhaW5lZENvbmpHcmFkLmgiCisjaW5jbHVkZSAic3JjL0l0ZXJhdGl2ZVNvbHZlcnMvSW5jb21wbGV0ZUxVLmgiCisjaW5jbHVkZSAiLi4vLi4vRWlnZW4vSmFjb2JpIgorI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL0hvdXNlaG9sZGVyIgorI2luY2x1ZGUgInNyYy9JdGVyYXRpdmVTb2x2ZXJzL0dNUkVTLmgiCisvLyNpbmNsdWRlICJzcmMvSXRlcmF0aXZlU29sdmVycy9TU09SUHJlY29uZGl0aW9uZXIuaCIKKworLy9AfQorCisjZW5kaWYgLy8gRUlHRU5fSVRFUkFUSVZFX1NPTFZFUlNfTU9EVUxFX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL0tyb25lY2tlclByb2R1Y3QgYi91bnN1cHBvcnRlZC9FaWdlbi9Lcm9uZWNrZXJQcm9kdWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NmUzODYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9Lcm9uZWNrZXJQcm9kdWN0CkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgRUlHRU5fS1JPTkVDS0VSX1BST0RVQ1RfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fS1JPTkVDS0VSX1BST0RVQ1RfTU9EVUxFX0gKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL0NvcmUiCisKKyNpbmNsdWRlICIuLi8uLi9FaWdlbi9zcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGluZ3JvdXAgVW5zdXBwb3J0ZWRfbW9kdWxlcworICAqIFxkZWZncm91cCBLcm9uZWNrZXJQcm9kdWN0X01vZHVsZSBLcm9uZWNrZXJQcm9kdWN0IG1vZHVsZQorICAqCisgICogVGhpcyBtb2R1bGUgY29udGFpbnMgYW4gZXhwZXJpbWVudGFsIEtyb25lY2tlciBwcm9kdWN0IGltcGxlbWVudGF0aW9uLgorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8RWlnZW4vS3JvbmVja2VyUHJvZHVjdD4KKyAgKiBcZW5kY29kZQorICAqLworCit9IC8vIG5hbWVzcGFjZSBFaWdlbgorCisjaW5jbHVkZSAic3JjL0tyb25lY2tlclByb2R1Y3QvS3JvbmVja2VyVGVuc29yUHJvZHVjdC5oIgorCisjaW5jbHVkZSAiLi4vLi4vRWlnZW4vc3JjL0NvcmUvdXRpbC9SZWVuYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNlbmRpZiAvLyBFSUdFTl9LUk9ORUNLRVJfUFJPRFVDVF9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vTVBSZWFsU3VwcG9ydCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL01QUmVhbFN1cHBvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5NTYyMwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL01QUmVhbFN1cHBvcnQKQEAgLTAsMCArMSwxNDggQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGEgam9pbnQgZWZmb3J0IGJldHdlZW4gRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYSwgYW5kIE1QRlIgQysrLCBhIEMrKyBpbnRlcmZhY2UgdG8gTVBGUiBsaWJyYXJ5IChodHRwOi8vd3d3LmhvbG9ib3JvZGtvLmNvbS9wYXZlbC8pCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIFBhdmVsIEhvbG9ib3JvZGtvIDxwYXZlbEBob2xvYm9yb2Rrby5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgS29uc3RhbnRpbiBIb2xvYm9yb2RrbyA8a29uc3RhbnRpbkBob2xvYm9yb2Rrby5jb20+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorLy8gCisvLyBDb250cmlidXRvcnM6CisvLyBCcmlhbiBHbGFkbWFuLCBIZWxtdXQgSmFyYXVzY2gsIEZva2tvIEJlZWtob2YsIFVscmljaCBNdXR6ZSwgSGVpbnogdmFuIFNhYW5lbiwgUGVyZSBDb25zdGFucworCisjaWZuZGVmIEVJR0VOX01QUkVBTFNVUFBPUlRfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fTVBSRUFMU1VQUE9SVF9NT0RVTEVfSAorCisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8bXByZWFsLmg+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKyAgCisgIC8qKiBcaW5ncm91cCBVbnN1cHBvcnRlZF9tb2R1bGVzCisgICAgKiBcZGVmZ3JvdXAgTVBSZWFsU3VwcG9ydF9Nb2R1bGUgTVBGUkMrKyBTdXBwb3J0IG1vZHVsZQorICAgICoKKyAgICAqIFxjb2RlCisgICAgKiAjaW5jbHVkZSA8RWlnZW4vTVBSZWFsU3VwcG9ydD4KKyAgICAqIFxlbmRjb2RlCisgICAgKgorICAgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3VwcG9ydCBmb3IgbXVsdGkgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKKyAgICAqIHZpYSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5ob2xvYm9yb2Rrby5jb20vcGF2ZWwvbXBmciI+TVBGUiBDKys8L2E+CisgICAgKiBsaWJyYXJ5IHdoaWNoIGl0c2VsZiBpcyBidWlsdCB1cG9uIDxhIGhyZWY9Imh0dHA6Ly93d3cubXBmci5vcmcvIj5NUEZSPC9hPi88YSBocmVmPSJodHRwOi8vZ21wbGliLm9yZy8iPkdNUDwvYT4uCisgICAgKgorICAgICogWW91IGNhbiBmaW5kIGEgY29weSBvZiBNUEZSIEMrKyB0aGF0IGlzIGtub3duIHRvIGJlIGNvbXBhdGlibGUgaW4gdGhlIHVuc3VwcG9ydGVkL3Rlc3QvbXByZWFsIGZvbGRlci4KKyAgICAqCisgICAgKiBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgKgorXGNvZGUKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxFaWdlbi9NUFJlYWxTdXBwb3J0PgorI2luY2x1ZGUgPEVpZ2VuL0xVPgordXNpbmcgbmFtZXNwYWNlIG1wZnI7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CitpbnQgbWFpbigpCit7CisgIC8vIHNldCBwcmVjaXNpb24gdG8gMjU2IGJpdHMgKGRvdWJsZSBoYXMgb25seSA1MyBiaXRzKQorICBtcHJlYWw6OnNldF9kZWZhdWx0X3ByZWMoMjU2KTsKKyAgLy8gRGVjbGFyZSBtYXRyaXggYW5kIHZlY3RvciB0eXBlcyB3aXRoIG11bHRpLXByZWNpc2lvbiBzY2FsYXIgdHlwZQorICB0eXBlZGVmIE1hdHJpeDxtcHJlYWwsRHluYW1pYyxEeW5hbWljPiAgTWF0cml4WG1wOworICB0eXBlZGVmIE1hdHJpeDxtcHJlYWwsRHluYW1pYywxPiAgICAgICAgVmVjdG9yWG1wOworCisgIE1hdHJpeFhtcCBBID0gTWF0cml4WG1wOjpSYW5kb20oMTAwLDEwMCk7CisgIFZlY3RvclhtcCBiID0gVmVjdG9yWG1wOjpSYW5kb20oMTAwKTsKKworICAvLyBTb2x2ZSBBeD1iIHVzaW5nIExVCisgIFZlY3RvclhtcCB4ID0gQS5sdSgpLnNvbHZlKGIpOworICBzdGQ6OmNvdXQgPDwgInJlbGF0aXZlIGVycm9yOiAiIDw8IChBKnggLSBiKS5ub3JtKCkgLyBiLm5vcm0oKSA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOworfQorXGVuZGNvZGUKKyAgICAqCisgICAgKi8KKworICB0ZW1wbGF0ZTw+IHN0cnVjdCBOdW1UcmFpdHM8bXBmcjo6bXByZWFsPgorICAgIDogR2VuZXJpY051bVRyYWl0czxtcGZyOjptcHJlYWw+CisgIHsKKyAgICBlbnVtIHsKKyAgICAgIElzSW50ZWdlciA9IDAsCisgICAgICBJc1NpZ25lZCA9IDEsCisgICAgICBJc0NvbXBsZXggPSAwLAorICAgICAgUmVxdWlyZUluaXRpYWxpemF0aW9uID0gMSwKKyAgICAgIFJlYWRDb3N0ID0gMTAsCisgICAgICBBZGRDb3N0ID0gMTAsCisgICAgICBNdWxDb3N0ID0gNDAKKyAgICB9OworCisgICAgdHlwZWRlZiBtcGZyOjptcHJlYWwgUmVhbDsKKyAgICB0eXBlZGVmIG1wZnI6Om1wcmVhbCBOb25JbnRlZ2VyOworCisgICAgaW5saW5lIHN0YXRpYyBtcGZyOjptcHJlYWwgaGlnaGVzdCgpIHsgcmV0dXJuICBtcGZyOjptcHJlYWxfbWF4KG1wZnI6Om1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpKTsgfQorICAgIGlubGluZSBzdGF0aWMgbXBmcjo6bXByZWFsIGxvd2VzdCgpICB7IHJldHVybiAtbXBmcjo6bXByZWFsX21heChtcGZyOjptcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSk7IH0KKworICAgIGlubGluZSBzdGF0aWMgUmVhbCBlcHNpbG9uKCkKKyAgICB7CisgICAgICByZXR1cm4gbXBmcjo6bWFjaGluZV9lcHNpbG9uKG1wZnI6Om1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpKTsKKyAgICB9CisgICAgaW5saW5lIHN0YXRpYyBSZWFsIGR1bW15X3ByZWNpc2lvbigpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHdlYWtfcHJlYyA9ICgobXBmcjo6bXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCktMSkqOTApLzEwMDsKKyAgICAgIHJldHVybiBtcGZyOjptYWNoaW5lX2Vwc2lsb24od2Vha19wcmVjKTsKKyAgICB9CisgIH07CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgdGVtcGxhdGU8PiBtcGZyOjptcHJlYWwgcmFuZG9tPG1wZnI6Om1wcmVhbD4oKQorICB7CisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDMsMCwwKSkKKyAgICBzdGF0aWMgZ21wX3JhbmRzdGF0ZV90IHN0YXRlOworICAgIHN0YXRpYyBib29sIGlzRmlyc3RUaW1lID0gdHJ1ZTsKKworICAgIGlmKGlzRmlyc3RUaW1lKQorICAgIHsKKyAgICAgIGdtcF9yYW5kaW5pdF9kZWZhdWx0KHN0YXRlKTsKKyAgICAgIGdtcF9yYW5kc2VlZF91aShzdGF0ZSwodW5zaWduZWQpdGltZShOVUxMKSk7CisgICAgICBpc0ZpcnN0VGltZSA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBtcGZyOjp1cmFuZG9tKHN0YXRlKSoyLTE7CisjZWxzZQorICAgIHJldHVybiBtcGZyOjptcHJlYWwocmFuZG9tPGRvdWJsZT4oKSk7CisjZW5kaWYKKyAgfQorCisgIHRlbXBsYXRlPD4gbXBmcjo6bXByZWFsIHJhbmRvbTxtcGZyOjptcHJlYWw+KGNvbnN0IG1wZnI6Om1wcmVhbCYgYSwgY29uc3QgbXBmcjo6bXByZWFsJiBiKQorICB7CisgICAgcmV0dXJuIGEgKyAoYi1hKSAqIHJhbmRvbTxtcGZyOjptcHJlYWw+KCk7CisgIH0KKworICBib29sIGlzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IG1wZnI6Om1wcmVhbCYgYSwgY29uc3QgbXBmcjo6bXByZWFsJiBiLCBjb25zdCBtcGZyOjptcHJlYWwmIHByZWMpCisgIHsKKyAgICByZXR1cm4gbXBmcjo6YWJzKGEpIDw9IG1wZnI6OmFicyhiKSAqIHByZWM7CisgIH0KKworICBpbmxpbmUgYm9vbCBpc0FwcHJveChjb25zdCBtcGZyOjptcHJlYWwmIGEsIGNvbnN0IG1wZnI6Om1wcmVhbCYgYiwgY29uc3QgbXBmcjo6bXByZWFsJiBwcmVjKQorICB7CisgICAgcmV0dXJuIG1wZnI6OmFicyhhIC0gYikgPD0gKG1wZnI6Om1pbikobXBmcjo6YWJzKGEpLCBtcGZyOjphYnMoYikpICogcHJlYzsKKyAgfQorCisgIGlubGluZSBib29sIGlzQXBwcm94T3JMZXNzVGhhbihjb25zdCBtcGZyOjptcHJlYWwmIGEsIGNvbnN0IG1wZnI6Om1wcmVhbCYgYiwgY29uc3QgbXBmcjo6bXByZWFsJiBwcmVjKQorICB7CisgICAgcmV0dXJuIGEgPD0gYiB8fCBpc0FwcHJveChhLCBiLCBwcmVjKTsKKyAgfQorICAKKyAgdGVtcGxhdGU8PiBpbmxpbmUgbG9uZyBkb3VibGUgY2FzdDxtcGZyOjptcHJlYWwsbG9uZyBkb3VibGU+KGNvbnN0IG1wZnI6Om1wcmVhbCYgeCkKKyAgeyByZXR1cm4geC50b0xEb3VibGUoKTsgfQorICB0ZW1wbGF0ZTw+IGlubGluZSBkb3VibGUgY2FzdDxtcGZyOjptcHJlYWwsZG91YmxlPihjb25zdCBtcGZyOjptcHJlYWwmIHgpCisgIHsgcmV0dXJuIHgudG9Eb3VibGUoKTsgfQorICB0ZW1wbGF0ZTw+IGlubGluZSBsb25nIGNhc3Q8bXBmcjo6bXByZWFsLGxvbmc+KGNvbnN0IG1wZnI6Om1wcmVhbCYgeCkKKyAgeyByZXR1cm4geC50b0xvbmcoKTsgfQorICB0ZW1wbGF0ZTw+IGlubGluZSBpbnQgY2FzdDxtcGZyOjptcHJlYWwsaW50Pihjb25zdCBtcGZyOjptcHJlYWwmIHgpCisgIHsgcmV0dXJuIGludCh4LnRvTG9uZygpKTsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30KKworI2VuZGlmIC8vIEVJR0VOX01QUkVBTFNVUFBPUlRfTU9EVUxFX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL01hdHJpeEZ1bmN0aW9ucyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL01hdHJpeEZ1bmN0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFiNzFjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zCkBAIC0wLDAgKzEsMzgwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NQVRSSVhfRlVOQ1RJT05TCisjZGVmaW5lIEVJR0VOX01BVFJJWF9GVU5DVElPTlMKKworI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKKyNpbmNsdWRlIDxFaWdlbi9Db3JlPgorI2luY2x1ZGUgPEVpZ2VuL0xVPgorI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgorCisvKiogXGluZ3JvdXAgVW5zdXBwb3J0ZWRfbW9kdWxlcworICAqIFxkZWZncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlIE1hdHJpeCBmdW5jdGlvbnMgbW9kdWxlCisgICogXGJyaWVmIFRoaXMgbW9kdWxlIGFpbXMgdG8gcHJvdmlkZSB2YXJpb3VzIG1ldGhvZHMgZm9yIHRoZSBjb21wdXRhdGlvbiBvZgorICAqIG1hdHJpeCBmdW5jdGlvbnMuIAorICAqCisgICogVG8gdXNlIHRoaXMgbW9kdWxlLCBhZGQgCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zPgorICAqIFxlbmRjb2RlCisgICogYXQgdGhlIHN0YXJ0IG9mIHlvdXIgc291cmNlIGZpbGUuCisgICoKKyAgKiBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgTWF0cml4QmFzZSBtZXRob2RzLgorICAqICAtIFxyZWYgbWF0cml4YmFzZV9jb3MgIk1hdHJpeEJhc2U6OmNvcygpIiwgZm9yIGNvbXB1dGluZyB0aGUgbWF0cml4IGNvc2luZQorICAqICAtIFxyZWYgbWF0cml4YmFzZV9jb3NoICJNYXRyaXhCYXNlOjpjb3NoKCkiLCBmb3IgY29tcHV0aW5nIHRoZSBtYXRyaXggaHlwZXJib2xpYyBjb3NpbmUKKyAgKiAgLSBccmVmIG1hdHJpeGJhc2VfZXhwICJNYXRyaXhCYXNlOjpleHAoKSIsIGZvciBjb21wdXRpbmcgdGhlIG1hdHJpeCBleHBvbmVudGlhbAorICAqICAtIFxyZWYgbWF0cml4YmFzZV9sb2cgIk1hdHJpeEJhc2U6OmxvZygpIiwgZm9yIGNvbXB1dGluZyB0aGUgbWF0cml4IGxvZ2FyaXRobQorICAqICAtIFxyZWYgbWF0cml4YmFzZV9tYXRyaXhmdW5jdGlvbiAiTWF0cml4QmFzZTo6bWF0cml4RnVuY3Rpb24oKSIsIGZvciBjb21wdXRpbmcgZ2VuZXJhbCBtYXRyaXggZnVuY3Rpb25zCisgICogIC0gXHJlZiBtYXRyaXhiYXNlX3NpbiAiTWF0cml4QmFzZTo6c2luKCkiLCBmb3IgY29tcHV0aW5nIHRoZSBtYXRyaXggc2luZQorICAqICAtIFxyZWYgbWF0cml4YmFzZV9zaW5oICJNYXRyaXhCYXNlOjpzaW5oKCkiLCBmb3IgY29tcHV0aW5nIHRoZSBtYXRyaXggaHlwZXJib2xpYyBzaW5lCisgICogIC0gXHJlZiBtYXRyaXhiYXNlX3NxcnQgIk1hdHJpeEJhc2U6OnNxcnQoKSIsIGZvciBjb21wdXRpbmcgdGhlIG1hdHJpeCBzcXVhcmUgcm9vdAorICAqCisgICogVGhlc2UgbWV0aG9kcyBhcmUgdGhlIG1haW4gZW50cnkgcG9pbnRzIHRvIHRoaXMgbW9kdWxlLiAKKyAgKgorICAqICVNYXRyaXggZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3MuICBTdXBwb3NlIHRoYXQgXGYkIGYgXGYkCisgICogaXMgYW4gZW50aXJlIGZ1bmN0aW9uICh0aGF0IGlzLCBhIGZ1bmN0aW9uIG9uIHRoZSBjb21wbGV4IHBsYW5lCisgICogdGhhdCBpcyBldmVyeXdoZXJlIGNvbXBsZXggZGlmZmVyZW50aWFibGUpLiAgVGhlbiBpdHMgVGF5bG9yCisgICogc2VyaWVzCisgICogXGZbIGYoMCkgKyBmJygwKSB4ICsgXGZyYWN7ZicnKDApfXsyfSB4XjIgKyBcZnJhY3tmJycnKDApfXszIX0geF4zICsgXGNkb3RzIFxmXQorICAqIGNvbnZlcmdlcyB0byBcZiQgZih4KSBcZiQuIEluIHRoaXMgY2FzZSwgd2UgY2FuIGRlZmluZSB0aGUgbWF0cml4CisgICogZnVuY3Rpb24gYnkgdGhlIHNhbWUgc2VyaWVzOgorICAqIFxmWyBmKE0pID0gZigwKSArIGYnKDApIE0gKyBcZnJhY3tmJycoMCl9ezJ9IE1eMiArIFxmcmFje2YnJycoMCl9ezMhfSBNXjMgKyBcY2RvdHMgXGZdCisgICoKKyAgKi8KKworI2luY2x1ZGUgInNyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4RXhwb25lbnRpYWwuaCIKKyNpbmNsdWRlICJzcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeEZ1bmN0aW9uLmgiCisjaW5jbHVkZSAic3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhTcXVhcmVSb290LmgiCisjaW5jbHVkZSAic3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhMb2dhcml0aG0uaCIKKworCisKKy8qKiAKK1xwYWdlIG1hdHJpeGJhc2VleHRyYSBNYXRyaXhCYXNlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgTWF0cml4RnVuY3Rpb25zIG1vZHVsZQorXGluZ3JvdXAgTWF0cml4RnVuY3Rpb25zX01vZHVsZQorCitUaGUgcmVtYWluZGVyIG9mIHRoZSBwYWdlIGRvY3VtZW50cyB0aGUgZm9sbG93aW5nIE1hdHJpeEJhc2UgbWV0aG9kcword2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIE1hdHJpeEZ1bmN0aW9ucyBtb2R1bGUuCisKKworCitcc2VjdGlvbiBtYXRyaXhiYXNlX2NvcyBNYXRyaXhCYXNlOjpjb3MoKQorCitDb21wdXRlIHRoZSBtYXRyaXggY29zaW5lLgorCitcY29kZQorY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+Ojpjb3MoKSBjb25zdAorXGVuZGNvZGUKKworXHBhcmFtW2luXSAgTSAgYSBzcXVhcmUgbWF0cml4LgorXHJldHVybnMgIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIFxmJCBcY29zKE0pIFxmJC4KKworVGhpcyBmdW5jdGlvbiBjYWxscyBccmVmIG1hdHJpeGJhc2VfbWF0cml4ZnVuY3Rpb24gIm1hdHJpeEZ1bmN0aW9uKCkiIHdpdGggU3RkU3RlbUZ1bmN0aW9uczo6Y29zKCkuCisKK1xzYSBccmVmIG1hdHJpeGJhc2Vfc2luICJzaW4oKSIgZm9yIGFuIGV4YW1wbGUuCisKKworCitcc2VjdGlvbiBtYXRyaXhiYXNlX2Nvc2ggTWF0cml4QmFzZTo6Y29zaCgpCisKK0NvbXB1dGUgdGhlIG1hdHJpeCBoeWJlcmJvbGljIGNvc2luZS4KKworXGNvZGUKK2NvbnN0IE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6Y29zaCgpIGNvbnN0CitcZW5kY29kZQorCitccGFyYW1baW5dICBNICBhIHNxdWFyZSBtYXRyaXguCitccmV0dXJucyAgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgXGYkIFxjb3NoKE0pIFxmJAorCitUaGlzIGZ1bmN0aW9uIGNhbGxzIFxyZWYgbWF0cml4YmFzZV9tYXRyaXhmdW5jdGlvbiAibWF0cml4RnVuY3Rpb24oKSIgd2l0aCBTdGRTdGVtRnVuY3Rpb25zOjpjb3NoKCkuCisKK1xzYSBccmVmIG1hdHJpeGJhc2Vfc2luaCAic2luaCgpIiBmb3IgYW4gZXhhbXBsZS4KKworCisKK1xzZWN0aW9uIG1hdHJpeGJhc2VfZXhwIE1hdHJpeEJhc2U6OmV4cCgpCisKK0NvbXB1dGUgdGhlIG1hdHJpeCBleHBvbmVudGlhbC4KKworXGNvZGUKK2NvbnN0IE1hdHJpeEV4cG9uZW50aWFsUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6ZXhwKCkgY29uc3QKK1xlbmRjb2RlCisKK1xwYXJhbVtpbl0gIE0gIG1hdHJpeCB3aG9zZSBleHBvbmVudGlhbCBpcyB0byBiZSBjb21wdXRlZC4KK1xyZXR1cm5zICAgIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBtYXRyaXggZXhwb25lbnRpYWwgb2YgXHAgTS4KKworVGhlIG1hdHJpeCBleHBvbmVudGlhbCBvZiBcZiQgTSBcZiQgaXMgZGVmaW5lZCBieQorXGZbIFxleHAoTSkgPSBcc3VtX3trPTB9XlxpbmZ0eSBcZnJhY3tNXmt9e2shfS4gXGZdCitUaGUgbWF0cml4IGV4cG9uZW50aWFsIGNhbiBiZSB1c2VkIHRvIHNvbHZlIGxpbmVhciBvcmRpbmFyeQorZGlmZmVyZW50aWFsIGVxdWF0aW9uczogdGhlIHNvbHV0aW9uIG9mIFxmJCB5JyA9IE15IFxmJCB3aXRoIHRoZQoraW5pdGlhbCBjb25kaXRpb24gXGYkIHkoMCkgPSB5XzAgXGYkIGlzIGdpdmVuIGJ5CitcZiQgeSh0KSA9IFxleHAoTSkgeV8wIFxmJC4KKworVGhlIGNvc3Qgb2YgdGhlIGNvbXB1dGF0aW9uIGlzIGFwcHJveGltYXRlbHkgXGYkIDIwIG5eMyBcZiQgZm9yCittYXRyaWNlcyBvZiBzaXplIFxmJCBuIFxmJC4gVGhlIG51bWJlciAyMCBkZXBlbmRzIHdlYWtseSBvbiB0aGUKK25vcm0gb2YgdGhlIG1hdHJpeC4KKworVGhlIG1hdHJpeCBleHBvbmVudGlhbCBpcyBjb21wdXRlZCB1c2luZyB0aGUgc2NhbGluZy1hbmQtc3F1YXJpbmcKK21ldGhvZCBjb21iaW5lZCB3aXRoIFBhZCZlYWN1dGU7IGFwcHJveGltYXRpb24uIFRoZSBtYXRyaXggaXMgZmlyc3QKK3Jlc2NhbGVkLCB0aGVuIHRoZSBleHBvbmVudGlhbCBvZiB0aGUgcmVkdWNlZCBtYXRyaXggaXMgY29tcHV0ZWQKK2FwcHJveGltYW50LCBhbmQgdGhlbiB0aGUgcmVzY2FsaW5nIGlzIHVuZG9uZSBieSByZXBlYXRlZAorc3F1YXJpbmcuIFRoZSBkZWdyZWUgb2YgdGhlIFBhZCZlYWN1dGU7IGFwcHJveGltYW50IGlzIGNob3NlbiBzdWNoCit0aGF0IHRoZSBhcHByb3hpbWF0aW9uIGVycm9yIGlzIGxlc3MgdGhhbiB0aGUgcm91bmQtb2ZmCitlcnJvci4gSG93ZXZlciwgZXJyb3JzIG1heSBhY2N1bXVsYXRlIGR1cmluZyB0aGUgc3F1YXJpbmcgcGhhc2UuCisKK0RldGFpbHMgb2YgdGhlIGFsZ29yaXRobSBjYW4gYmUgZm91bmQgaW46IE5pY2hvbGFzIEouIEhpZ2hhbSwgIlRoZQorc2NhbGluZyBhbmQgc3F1YXJpbmcgbWV0aG9kIGZvciB0aGUgbWF0cml4IGV4cG9uZW50aWFsIHJldmlzaXRlZCwiCis8ZW0+U0lBTSBKLiAlTWF0cml4IEFuYWwuIEFwcGxpYy48L2VtPiwgPGI+MjY8L2I+OjExNzkmbmRhc2g7MTE5MywKKzIwMDUuCisKK0V4YW1wbGU6IFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjaGVja3MgdGhhdAorXGZbIFxleHAgXGxlZnRbIFxiZWdpbnthcnJheX17Y2NjfQorICAgICAgMCAmIFxmcmFjMTRccGkgJiAwIFxcCisgICAgICAtXGZyYWMxNFxwaSAmIDAgJiAwIFxcCisgICAgICAwICYgMCAmIDAKKyAgICBcZW5ke2FycmF5fSBccmlnaHRdID0gXGxlZnRbIFxiZWdpbnthcnJheX17Y2NjfQorICAgICAgXGZyYWMxMlxzcXJ0MiAmIC1cZnJhYzEyXHNxcnQyICYgMCBcXAorICAgICAgXGZyYWMxMlxzcXJ0MiAmIFxmcmFjMTJcc3FydDIgJiAwIFxcCisgICAgICAwICYgMCAmIDEKKyAgICBcZW5ke2FycmF5fSBccmlnaHRdLiBcZl0KK1RoaXMgY29ycmVzcG9uZHMgdG8gYSByb3RhdGlvbiBvZiBcZiQgXGZyYWMxNFxwaSBcZiQgcmFkaWFucyBhcm91bmQKK3RoZSB6LWF4aXMuCisKK1xpbmNsdWRlIE1hdHJpeEV4cG9uZW50aWFsLmNwcAorT3V0cHV0OiBcdmVyYmluY2x1ZGUgTWF0cml4RXhwb25lbnRpYWwub3V0CisKK1xub3RlIFxwIE0gaGFzIHRvIGJlIGEgbWF0cml4IG9mIFxjIGZsb2F0LCBcYyBkb3VibGUsIFxjIGxvbmcgZG91YmxlCitcYyBjb21wbGV4PGZsb2F0PiwgXGMgY29tcGxleDxkb3VibGU+LCBvciBcYyBjb21wbGV4PGxvbmcgZG91YmxlPiAuCisKKworXHNlY3Rpb24gbWF0cml4YmFzZV9sb2cgTWF0cml4QmFzZTo6bG9nKCkKKworQ29tcHV0ZSB0aGUgbWF0cml4IGxvZ2FyaXRobS4KKworXGNvZGUKK2NvbnN0IE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OmxvZygpIGNvbnN0CitcZW5kY29kZQorCitccGFyYW1baW5dICBNICBpbnZlcnRpYmxlIG1hdHJpeCB3aG9zZSBsb2dhcml0aG0gaXMgdG8gYmUgY29tcHV0ZWQuCitccmV0dXJucyAgICBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgbWF0cml4IGxvZ2FyaXRobSByb290IG9mIFxwIE0uCisKK1RoZSBtYXRyaXggbG9nYXJpdGhtIG9mIFxmJCBNIFxmJCBpcyBhIG1hdHJpeCBcZiQgWCBcZiQgc3VjaCB0aGF0IAorXGYkIFxleHAoWCkgPSBNIFxmJCB3aGVyZSBleHAgZGVub3RlcyB0aGUgbWF0cml4IGV4cG9uZW50aWFsLiBBcyBmb3IKK3RoZSBzY2FsYXIgbG9nYXJpdGhtLCB0aGUgZXF1YXRpb24gXGYkIFxleHAoWCkgPSBNIFxmJCBtYXkgaGF2ZQorbXVsdGlwbGUgc29sdXRpb25zOyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBtYXRyaXggd2hvc2UgZWlnZW52YWx1ZXMKK2hhdmUgaW1hZ2luYXJ5IHBhcnQgaW4gdGhlIGludGVydmFsIFxmJCAoLVxwaSxccGldIFxmJC4KKworSW4gdGhlIHJlYWwgY2FzZSwgdGhlIG1hdHJpeCBcZiQgTSBcZiQgc2hvdWxkIGJlIGludmVydGlibGUgYW5kCitpdCBzaG91bGQgaGF2ZSBubyBlaWdlbnZhbHVlcyB3aGljaCBhcmUgcmVhbCBhbmQgbmVnYXRpdmUgKHBhaXJzIG9mCitjb21wbGV4IGNvbmp1Z2F0ZSBlaWdlbnZhbHVlcyBhcmUgYWxsb3dlZCkuIEluIHRoZSBjb21wbGV4IGNhc2UsIGl0Citvbmx5IG5lZWRzIHRvIGJlIGludmVydGlibGUuCisKK1RoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIG1hdHJpeCBsb2dhcml0aG0gdXNpbmcgdGhlIFNjaHVyLVBhcmxldHQKK2FsZ29yaXRobSBhcyBpbXBsZW1lbnRlZCBieSBNYXRyaXhCYXNlOjptYXRyaXhGdW5jdGlvbigpLiBUaGUKK2xvZ2FyaXRobSBvZiBhbiBhdG9taWMgYmxvY2sgaXMgY29tcHV0ZWQgYnkgTWF0cml4TG9nYXJpdGhtQXRvbWljLAord2hpY2ggdXNlcyBkaXJlY3QgY29tcHV0YXRpb24gZm9yIDEtYnktMSBhbmQgMi1ieS0yIGJsb2NrcyBhbmQgYW4KK2ludmVyc2Ugc2NhbGluZy1hbmQtc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBiaWdnZXIgYmxvY2tzLCB3aXRoIHRoZQorc3F1YXJlIHJvb3RzIGNvbXB1dGVkIGJ5IE1hdHJpeEJhc2U6OnNxcnQoKS4KKworRGV0YWlscyBvZiB0aGUgYWxnb3JpdGhtIGNhbiBiZSBmb3VuZCBpbiBTZWN0aW9uIDExLjYuMiBvZjoKK05pY2hvbGFzIEouIEhpZ2hhbSwKKzxlbT5GdW5jdGlvbnMgb2YgTWF0cmljZXM6IFRoZW9yeSBhbmQgQ29tcHV0YXRpb248L2VtPiwKK1NJQU0gMjAwOC4gSVNCTiA5NzgtMC04OTg3MTYtNDYtNy4KKworRXhhbXBsZTogVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNoZWNrcyB0aGF0CitcZlsgXGxvZyBcbGVmdFsgXGJlZ2lue2FycmF5fXtjY2N9IAorICAgICAgXGZyYWMxMlxzcXJ0MiAmIC1cZnJhYzEyXHNxcnQyICYgMCBcXAorICAgICAgXGZyYWMxMlxzcXJ0MiAmIFxmcmFjMTJcc3FydDIgJiAwIFxcCisgICAgICAwICYgMCAmIDEKKyAgICBcZW5ke2FycmF5fSBccmlnaHRdID0gXGxlZnRbIFxiZWdpbnthcnJheX17Y2NjfQorICAgICAgMCAmIFxmcmFjMTRccGkgJiAwIFxcIAorICAgICAgLVxmcmFjMTRccGkgJiAwICYgMCBcXAorICAgICAgMCAmIDAgJiAwIAorICAgIFxlbmR7YXJyYXl9IFxyaWdodF0uIFxmXQorVGhpcyBjb3JyZXNwb25kcyB0byBhIHJvdGF0aW9uIG9mIFxmJCBcZnJhYzE0XHBpIFxmJCByYWRpYW5zIGFyb3VuZAordGhlIHotYXhpcy4gVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgZXhhbXBsZSB1c2VkIGluIHRoZQorZG9jdW1lbnRhdGlvbiBvZiBccmVmIG1hdHJpeGJhc2VfZXhwICJleHAoKSIuCisKK1xpbmNsdWRlIE1hdHJpeExvZ2FyaXRobS5jcHAKK091dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeExvZ2FyaXRobS5vdXQKKworXG5vdGUgXHAgTSBoYXMgdG8gYmUgYSBtYXRyaXggb2YgXGMgZmxvYXQsIFxjIGRvdWJsZSwgXGMgbG9uZyBkb3VibGUKK1xjIGNvbXBsZXg8ZmxvYXQ+LCBcYyBjb21wbGV4PGRvdWJsZT4sIG9yIFxjIGNvbXBsZXg8bG9uZyBkb3VibGU+IC4KKworXHNhIE1hdHJpeEJhc2U6OmV4cCgpLCBNYXRyaXhCYXNlOjptYXRyaXhGdW5jdGlvbigpLCAKKyAgICBjbGFzcyBNYXRyaXhMb2dhcml0aG1BdG9taWMsIE1hdHJpeEJhc2U6OnNxcnQoKS4KKworCitcc2VjdGlvbiBtYXRyaXhiYXNlX21hdHJpeGZ1bmN0aW9uIE1hdHJpeEJhc2U6Om1hdHJpeEZ1bmN0aW9uKCkKKworQ29tcHV0ZSBhIG1hdHJpeCBmdW5jdGlvbi4KKworXGNvZGUKK2NvbnN0IE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6bWF0cml4RnVuY3Rpb24odHlwZW5hbWUgaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb248dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6dHlwZSBmKSBjb25zdAorXGVuZGNvZGUKKworXHBhcmFtW2luXSAgTSAgYXJndW1lbnQgb2YgbWF0cml4IGZ1bmN0aW9uLCBzaG91bGQgYmUgYSBzcXVhcmUgbWF0cml4LgorXHBhcmFtW2luXSAgZiAgYW4gZW50aXJlIGZ1bmN0aW9uOyBcYyBmKHgsbikgc2hvdWxkIGNvbXB1dGUgdGhlIG4tdGgKK2Rlcml2YXRpdmUgb2YgZiBhdCB4LgorXHJldHVybnMgIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIFxwIGYgYXBwbGllZCB0byBccCBNLgorCitTdXBwb3NlIHRoYXQgXHAgTSBpcyBhIG1hdHJpeCB3aG9zZSBlbnRyaWVzIGhhdmUgdHlwZSBcYyBTY2FsYXIuIAorVGhlbiwgdGhlIHNlY29uZCBhcmd1bWVudCwgXHAgZiwgc2hvdWxkIGJlIGEgZnVuY3Rpb24gd2l0aCBwcm90b3R5cGUKK1xjb2RlIAorQ29tcGxleFNjYWxhciBmKENvbXBsZXhTY2FsYXIsIGludCkgCitcZW5kY29kZQord2hlcmUgXGMgQ29tcGxleFNjYWxhciA9IFxjIHN0ZDo6Y29tcGxleDxTY2FsYXI+IGlmIFxjIFNjYWxhciBpcworcmVhbCAoZS5nLiwgXGMgZmxvYXQgb3IgXGMgZG91YmxlKSBhbmQgXGMgQ29tcGxleFNjYWxhciA9CitcYyBTY2FsYXIgaWYgXGMgU2NhbGFyIGlzIGNvbXBsZXguIFRoZSByZXR1cm4gdmFsdWUgb2YgXGMgZih4LG4pCitzaG91bGQgYmUgXGYkIGZeeyhuKX0oeCkgXGYkLCB0aGUgbi10aCBkZXJpdmF0aXZlIG9mIGYgYXQgeC4KKworVGhpcyByb3V0aW5lIHVzZXMgdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgaW46CitQaGlsaXAgRGF2aWVzIGFuZCBOaWNob2xhcyBKLiBIaWdoYW0sIAorIkEgU2NodXItUGFybGV0dCBhbGdvcml0aG0gZm9yIGNvbXB1dGluZyBtYXRyaXggZnVuY3Rpb25zIiwgCis8ZW0+U0lBTSBKLiAlTWF0cml4IEFuYWwuIEFwcGxpYy48L2VtPiwgPGI+MjU8L2I+OjQ2NCZuZGFzaDs0ODUsIDIwMDMuCisKK1RoZSBhY3R1YWwgd29yayBpcyBkb25lIGJ5IHRoZSBNYXRyaXhGdW5jdGlvbiBjbGFzcy4KKworRXhhbXBsZTogVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNoZWNrcyB0aGF0CitcZlsgXGV4cCBcbGVmdFsgXGJlZ2lue2FycmF5fXtjY2N9IAorICAgICAgMCAmIFxmcmFjMTRccGkgJiAwIFxcIAorICAgICAgLVxmcmFjMTRccGkgJiAwICYgMCBcXAorICAgICAgMCAmIDAgJiAwIAorICAgIFxlbmR7YXJyYXl9IFxyaWdodF0gPSBcbGVmdFsgXGJlZ2lue2FycmF5fXtjY2N9CisgICAgICBcZnJhYzEyXHNxcnQyICYgLVxmcmFjMTJcc3FydDIgJiAwIFxcCisgICAgICBcZnJhYzEyXHNxcnQyICYgXGZyYWMxMlxzcXJ0MiAmIDAgXFwKKyAgICAgIDAgJiAwICYgMQorICAgIFxlbmR7YXJyYXl9IFxyaWdodF0uIFxmXQorVGhpcyBjb3JyZXNwb25kcyB0byBhIHJvdGF0aW9uIG9mIFxmJCBcZnJhYzE0XHBpIFxmJCByYWRpYW5zIGFyb3VuZAordGhlIHotYXhpcy4gVGhpcyBpcyB0aGUgc2FtZSBleGFtcGxlIGFzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24KK29mIFxyZWYgbWF0cml4YmFzZV9leHAgImV4cCgpIi4KKworXGluY2x1ZGUgTWF0cml4RnVuY3Rpb24uY3BwCitPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhGdW5jdGlvbi5vdXQKKworTm90ZSB0aGF0IHRoZSBmdW5jdGlvbiBcYyBleHBmbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMgCitcYyB4LCBldmVuIHRob3VnaCB0aGUgbWF0cml4IFxjIEEgaXMgb3ZlciB0aGUgcmVhbHMuIEluc3RlYWQgb2YKK1xjIGV4cGZuLCB3ZSBjb3VsZCBhbHNvIGhhdmUgdXNlZCBTdGRTdGVtRnVuY3Rpb25zOjpleHA6CitcY29kZQorQS5tYXRyaXhGdW5jdGlvbihTdGRTdGVtRnVuY3Rpb25zPHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OmV4cCwgJkIpOworXGVuZGNvZGUKKworCisKK1xzZWN0aW9uIG1hdHJpeGJhc2Vfc2luIE1hdHJpeEJhc2U6OnNpbigpCisKK0NvbXB1dGUgdGhlIG1hdHJpeCBzaW5lLgorCitcY29kZQorY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpzaW4oKSBjb25zdAorXGVuZGNvZGUKKworXHBhcmFtW2luXSAgTSAgYSBzcXVhcmUgbWF0cml4LgorXHJldHVybnMgIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIFxmJCBcc2luKE0pIFxmJC4KKworVGhpcyBmdW5jdGlvbiBjYWxscyBccmVmIG1hdHJpeGJhc2VfbWF0cml4ZnVuY3Rpb24gIm1hdHJpeEZ1bmN0aW9uKCkiIHdpdGggU3RkU3RlbUZ1bmN0aW9uczo6c2luKCkuCisKK0V4YW1wbGU6IFxpbmNsdWRlIE1hdHJpeFNpbmUuY3BwCitPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBNYXRyaXhTaW5lLm91dAorCisKKworXHNlY3Rpb24gbWF0cml4YmFzZV9zaW5oIE1hdHJpeEJhc2U6OnNpbmgoKQorCitDb21wdXRlIHRoZSBtYXRyaXggaHlwZXJib2xpYyBzaW5lLgorCitcY29kZQorTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpzaW5oKCkgY29uc3QKK1xlbmRjb2RlCisKK1xwYXJhbVtpbl0gIE0gIGEgc3F1YXJlIG1hdHJpeC4KK1xyZXR1cm5zICBleHByZXNzaW9uIHJlcHJlc2VudGluZyBcZiQgXHNpbmgoTSkgXGYkCisKK1RoaXMgZnVuY3Rpb24gY2FsbHMgXHJlZiBtYXRyaXhiYXNlX21hdHJpeGZ1bmN0aW9uICJtYXRyaXhGdW5jdGlvbigpIiB3aXRoIFN0ZFN0ZW1GdW5jdGlvbnM6OnNpbmgoKS4KKworRXhhbXBsZTogXGluY2x1ZGUgTWF0cml4U2luaC5jcHAKK091dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeFNpbmgub3V0CisKKworXHNlY3Rpb24gbWF0cml4YmFzZV9zcXJ0IE1hdHJpeEJhc2U6OnNxcnQoKQorCitDb21wdXRlIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QuCisKK1xjb2RlCitjb25zdCBNYXRyaXhTcXVhcmVSb290UmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6c3FydCgpIGNvbnN0CitcZW5kY29kZQorCitccGFyYW1baW5dICBNICBpbnZlcnRpYmxlIG1hdHJpeCB3aG9zZSBzcXVhcmUgcm9vdCBpcyB0byBiZSBjb21wdXRlZC4KK1xyZXR1cm5zICAgIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBtYXRyaXggc3F1YXJlIHJvb3Qgb2YgXHAgTS4KKworVGhlIG1hdHJpeCBzcXVhcmUgcm9vdCBvZiBcZiQgTSBcZiQgaXMgdGhlIG1hdHJpeCBcZiQgTV57MS8yfSBcZiQKK3dob3NlIHNxdWFyZSBpcyB0aGUgb3JpZ2luYWwgbWF0cml4OyBzbyBpZiBcZiQgUyA9IE1eezEvMn0gXGYkIHRoZW4KK1xmJCBTXjIgPSBNIFxmJC4gCisKK0luIHRoZSA8Yj5yZWFsIGNhc2U8L2I+LCB0aGUgbWF0cml4IFxmJCBNIFxmJCBzaG91bGQgYmUgaW52ZXJ0aWJsZSBhbmQKK2l0IHNob3VsZCBoYXZlIG5vIGVpZ2VudmFsdWVzIHdoaWNoIGFyZSByZWFsIGFuZCBuZWdhdGl2ZSAocGFpcnMgb2YKK2NvbXBsZXggY29uanVnYXRlIGVpZ2VudmFsdWVzIGFyZSBhbGxvd2VkKS4gSW4gdGhhdCBjYXNlLCB0aGUgbWF0cml4CitoYXMgYSBzcXVhcmUgcm9vdCB3aGljaCBpcyBhbHNvIHJlYWwsIGFuZCB0aGlzIGlzIHRoZSBzcXVhcmUgcm9vdAorY29tcHV0ZWQgYnkgdGhpcyBmdW5jdGlvbi4gCisKK1RoZSBtYXRyaXggc3F1YXJlIHJvb3QgaXMgY29tcHV0ZWQgYnkgZmlyc3QgcmVkdWNpbmcgdGhlIG1hdHJpeCB0bworcXVhc2ktdHJpYW5ndWxhciBmb3JtIHdpdGggdGhlIHJlYWwgU2NodXIgZGVjb21wb3NpdGlvbi4gVGhlIHNxdWFyZQorcm9vdCBvZiB0aGUgcXVhc2ktdHJpYW5ndWxhciBtYXRyaXggY2FuIHRoZW4gYmUgY29tcHV0ZWQgZGlyZWN0bHkuIFRoZQorY29zdCBpcyBhcHByb3hpbWF0ZWx5IFxmJCAyNSBuXjMgXGYkIHJlYWwgZmxvcHMgZm9yIHRoZSByZWFsIFNjaHVyCitkZWNvbXBvc2l0aW9uIGFuZCBcZiQgM1xmcmFjMTMgbl4zIFxmJCByZWFsIGZsb3BzIGZvciB0aGUgcmVtYWluZGVyCisodGhvdWdoIHRoZSBjb21wdXRhdGlvbiB0aW1lIGluIHByYWN0aWNlIGlzIGxpa2VseSBtb3JlIHRoYW4gdGhpcworaW5kaWNhdGVzKS4KKworRGV0YWlscyBvZiB0aGUgYWxnb3JpdGhtIGNhbiBiZSBmb3VuZCBpbjogTmljaG9sYXMgSi4gSGlnaGFuLAorIkNvbXB1dGluZyByZWFsIHNxdWFyZSByb290cyBvZiBhIHJlYWwgbWF0cml4IiwgPGVtPkxpbmVhciBBbGdlYnJhCitBcHBsLjwvZW0+LCA4OC84OTo0MDUmbmRhc2g7NDMwLCAxOTg3LgorCitJZiB0aGUgbWF0cml4IGlzIDxiPnBvc2l0aXZlLWRlZmluaXRlIHN5bW1ldHJpYzwvYj4sIHRoZW4gdGhlIHNxdWFyZQorcm9vdCBpcyBhbHNvIHBvc2l0aXZlLWRlZmluaXRlIHN5bW1ldHJpYy4gSW4gdGhpcyBjYXNlLCBpdCBpcyBiZXN0IHRvCit1c2UgU2VsZkFkam9pbnRFaWdlblNvbHZlcjo6b3BlcmF0b3JTcXJ0KCkgdG8gY29tcHV0ZSBpdC4KKworSW4gdGhlIDxiPmNvbXBsZXggY2FzZTwvYj4sIHRoZSBtYXRyaXggXGYkIE0gXGYkIHNob3VsZCBiZSBpbnZlcnRpYmxlOwordGhpcyBpcyBhIHJlc3RyaWN0aW9uIG9mIHRoZSBhbGdvcml0aG0uIFRoZSBzcXVhcmUgcm9vdCBjb21wdXRlZCBieQordGhpcyBhbGdvcml0aG0gaXMgdGhlIG9uZSB3aG9zZSBlaWdlbnZhbHVlcyBoYXZlIGFuIGFyZ3VtZW50IGluIHRoZQoraW50ZXJ2YWwgXGYkICgtXGZyYWMxMlxwaSwgXGZyYWMxMlxwaV0gXGYkLiBUaGlzIGlzIHRoZSB1c3VhbCBicmFuY2gKK2N1dC4KKworVGhlIGNvbXB1dGF0aW9uIGlzIHRoZSBzYW1lIGFzIGluIHRoZSByZWFsIGNhc2UsIGV4Y2VwdCB0aGF0IHRoZQorY29tcGxleCBTY2h1ciBkZWNvbXBvc2l0aW9uIGlzIHVzZWQgdG8gcmVkdWNlIHRoZSBtYXRyaXggdG8gYQordHJpYW5ndWxhciBtYXRyaXguIFRoZSB0aGVvcmV0aWNhbCBjb3N0IGlzIHRoZSBzYW1lLiBEZXRhaWxzIGFyZSBpbjoKKyZBcmluZztrZSBCaiZvdW1sO3JjayBhbmQgU3ZlbiBIYW1tYXJsaW5nLCAiQSBTY2h1ciBtZXRob2QgZm9yIHRoZQorc3F1YXJlIHJvb3Qgb2YgYSBtYXRyaXgiLCA8ZW0+TGluZWFyIEFsZ2VicmEgQXBwbC48L2VtPiwKKzUyLzUzOjEyNyZuZGFzaDsxNDAsIDE5ODMuCisKK0V4YW1wbGU6IFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjaGVja3MgdGhhdCB0aGUgc3F1YXJlIHJvb3Qgb2YKK1xmWyBcbGVmdFsgXGJlZ2lue2FycmF5fXtjY30gCisgICAgICAgICAgICAgIFxjb3MoXGZyYWMxM1xwaSkgJiAtXHNpbihcZnJhYzEzXHBpKSBcXAorICAgICAgICAgICAgICBcc2luKFxmcmFjMTNccGkpICYgXGNvcyhcZnJhYzEzXHBpKQorICAgIFxlbmR7YXJyYXl9IFxyaWdodF0sIFxmXQorY29ycmVzcG9uZGluZyB0byBhIHJvdGF0aW9uIG92ZXIgNjAgZGVncmVlcywgaXMgYSByb3RhdGlvbiBvdmVyIDMwIGRlZ3JlZXM6CitcZlsgXGxlZnRbIFxiZWdpbnthcnJheX17Y2N9IAorICAgICAgICAgICAgICBcY29zKFxmcmFjMTZccGkpICYgLVxzaW4oXGZyYWMxNlxwaSkgXFwKKyAgICAgICAgICAgICAgXHNpbihcZnJhYzE2XHBpKSAmIFxjb3MoXGZyYWMxNlxwaSkKKyAgICBcZW5ke2FycmF5fSBccmlnaHRdLiBcZl0KKworXGluY2x1ZGUgTWF0cml4U3F1YXJlUm9vdC5jcHAKK091dHB1dDogXHZlcmJpbmNsdWRlIE1hdHJpeFNxdWFyZVJvb3Qub3V0CisKK1xzYSBjbGFzcyBSZWFsU2NodXIsIGNsYXNzIENvbXBsZXhTY2h1ciwgY2xhc3MgTWF0cml4U3F1YXJlUm9vdCwKKyAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyOjpvcGVyYXRvclNxcnQoKS4KKworKi8KKworI2VuZGlmIC8vIEVJR0VOX01BVFJJWF9GVU5DVElPTlMKKwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vTW9yZVZlY3Rvcml6YXRpb24gYi91bnN1cHBvcnRlZC9FaWdlbi9Nb3JlVmVjdG9yaXphdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBhMzlmCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vTW9yZVZlY3Rvcml6YXRpb24KQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBFSUdFTl9NT1JFVkVDVE9SSVpBVElPTl9NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9NT1JFVkVDVE9SSVpBVElPTl9NT0RVTEVfSAorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxpbmdyb3VwIFVuc3VwcG9ydGVkX21vZHVsZXMKKyAgKiBcZGVmZ3JvdXAgTW9yZVZlY3Rvcml6YXRpb24gTW9yZSB2ZWN0b3JpemF0aW9uIG1vZHVsZQorICAqLworCit9CisKKyNpbmNsdWRlICJzcmMvTW9yZVZlY3Rvcml6YXRpb24vTWF0aEZ1bmN0aW9ucy5oIgorCisjZW5kaWYgLy8gRUlHRU5fTU9SRVZFQ1RPUklaQVRJT05fTU9EVUxFX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL05vbkxpbmVhck9wdGltaXphdGlvbiBiL3Vuc3VwcG9ydGVkL0VpZ2VuL05vbkxpbmVhck9wdGltaXphdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZjYTU4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vTm9uTGluZWFyT3B0aW1pemF0aW9uCkBAIC0wLDAgKzEsMTM0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFdWdlbmlvLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRob21hcyBDYXByaWNlbGxpIDxvcnplbEBmcmVlaGFja2Vycy5vcmc+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX05PTkxJTkVBUk9QVElNSVpBVElPTl9NT0RVTEUKKyNkZWZpbmUgRUlHRU5fTk9OTElORUFST1BUSU1JWkFUSU9OX01PRFVMRQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDxFaWdlbi9KYWNvYmk+CisjaW5jbHVkZSA8RWlnZW4vUVI+CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTnVtZXJpY2FsRGlmZj4KKworLyoqIFxpbmdyb3VwIFVuc3VwcG9ydGVkX21vZHVsZXMKKyAgKiBcZGVmZ3JvdXAgTm9uTGluZWFyT3B0aW1pemF0aW9uX01vZHVsZSBOb24gbGluZWFyIG9wdGltaXphdGlvbiBtb2R1bGUKKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL05vbkxpbmVhck9wdGltaXphdGlvbj4KKyAgKiBcZW5kY29kZQorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gb2YgdHdvIGltcG9ydGFudCBhbGdvcml0aG1zIGluIG5vbiBsaW5lYXIKKyAgKiBvcHRpbWl6YXRpb24uIEluIGJvdGggY2FzZXMsIHdlIGNvbnNpZGVyIGEgc3lzdGVtIG9mIG5vbiBsaW5lYXIgZnVuY3Rpb25zLiBPZgorICAqIGNvdXJzZSwgdGhpcyBzaG91bGQgd29yaywgYW5kIGV2ZW4gd29yayB2ZXJ5IHdlbGwgaWYgdGhvc2UgZnVuY3Rpb25zIGFyZQorICAqIGFjdHVhbGx5IGxpbmVhci4gQnV0IGlmIHRoaXMgaXMgc28sIHlvdSBzaG91bGQgcHJvYmFibHkgYmV0dGVyIHVzZSBvdGhlcgorICAqIG1ldGhvZHMgbW9yZSBmaXR0ZWQgdG8gdGhpcyBzcGVjaWFsIGNhc2UuCisgICoKKyAgKiBPbmUgYWxnb3JpdGhtIGFsbG93cyB0byBmaW5kIGFuIGV4dHJlbXVtIG9mIHN1Y2ggYSBzeXN0ZW0gKExldmVuYmVyZworICAqIE1hcnF1YXJkdCBhbGdvcml0aG0pIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB1c2VkIHRvIGZpbmQgCisgICogYSB6ZXJvIGZvciB0aGUgc3lzdGVtIChQb3dlbGwgaHlicmlkICJkb2dsZWciIG1ldGhvZCkuCisgICoKKyAgKiBUaGlzIGNvZGUgaXMgYSBwb3J0IG9mIG1pbnBhY2sgKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlOUEFDSykuCisgICogTWlucGFjayBpcyBhIHZlcnkgZmFtb3VzLCBvbGQsIHJvYnVzdCBhbmQgd2VsbC1yZWtub3duIHBhY2thZ2UsIHdyaXR0ZW4gaW4gCisgICogZm9ydHJhbi4gVGhvc2UgaW1wbGVtZW50YXRpb25zIGhhdmUgYmVlbiBjYXJlZnVsbHkgdHVuZWQsIHRlc3RlZCwgYW5kIHVzZWQKKyAgKiBmb3Igc2V2ZXJhbCBkZWNhZGVzLgorICAqCisgICogVGhlIG9yaWdpbmFsIGZvcnRyYW4gY29kZSB3YXMgYXV0b21hdGljYWxseSB0cmFuc2xhdGVkIHVzaW5nIGYyYyAoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GMmMpIGluIEMsCisgICogdGhlbiBjKyssIGFuZCB0aGVuIGNsZWFuZWQgYnkgc2V2ZXJhbCBkaWZmZXJlbnQgYXV0aG9ycy4KKyAgKiBUaGUgbGFzdCBvbmUgb2YgdGhvc2UgY2xlYW5pbmdzIGJlaW5nIG91ciBzdGFydGluZyBwb2ludCA6IAorICAqIGh0dHA6Ly9kZXZlcm5heS5mcmVlLmZyL2hhY2tzL2NtaW5wYWNrLmh0bWwKKyAgKiAKKyAgKiBGaW5hbGx5LCB3ZSBwb3J0ZWQgdGhpcyBjb2RlIHRvIEVpZ2VuLCBjcmVhdGluZyBjbGFzc2VzIGFuZCBBUEkKKyAgKiBjb2hlcmVudCB3aXRoIEVpZ2VuLiBXaGVuIHBvc3NpYmxlLCB3ZSBzd2l0Y2hlZCB0byBFaWdlbgorICAqIGltcGxlbWVudGF0aW9uLCBzdWNoIGFzIG1vc3QgbGluZWFyIGFsZ2VicmEgKHZlY3RvcnMsIG1hdHJpY2VzLCBzdGFibGUgbm9ybXMpLgorICAqCisgICogRG9pbmcgc28sIHdlIHdlcmUgdmVyeSBjYXJlZnVsIHRvIGNoZWNrIHRoZSB0ZXN0cyB3ZSBzZXR1cCBhdCB0aGUgdmVyeQorICAqIGJlZ2lubmluZywgd2hpY2ggZW5zdXJlIHRoYXQgdGhlIHNhbWUgcmVzdWx0cyBhcmUgZm91bmQuCisgICoKKyAgKiBcc2VjdGlvbiBUZXN0cyBUZXN0cworICAqIAorICAqIFRoZSB0ZXN0cyBhcmUgcGxhY2VkIGluIHRoZSBmaWxlIHVuc3VwcG9ydGVkL3Rlc3QvTm9uTGluZWFyLmNwcC4KKyAgKiAKKyAgKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIHRlc3RzIDogdGhvc2UgdGhhdCBjb21lIGZyb20gZXhhbXBsZXMgYnVuZGxlZCB3aXRoIGNtaW5wYWNrLgorICAqIFRoZXkgZ3VhcmFudHkgd2UgZ2V0IHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIG9yaWdpbmFsIGFsZ29yaXRobXMgKHZhbHVlIGZvciAneCcsCisgICogZm9yIHRoZSBudW1iZXIgb2YgZXZhbHVhdGlvbnMgb2YgdGhlIGZ1bmN0aW9uLCBhbmQgZm9yIHRoZSBudW1iZXIgb2YgZXZhbHVhdGlvbnMKKyAgKiBvZiB0aGUgamFjb2JpYW4gaWYgZXZlcikuCisgICogCisgICogT3RoZXIgdGVzdHMgd2VyZSBhZGRlZCBieSBteXNlbGYgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSAKKyAgKiBwcm9jZXNzIGFuZCBjaGVjayB0aGUgcmVzdWx0cyBmb3IgbGV2ZW5iZXJnLW1hcnF1YXJkdCB1c2luZyB0aGUgcmVmZXJlbmNlIGRhdGEgCisgICogb24gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL25sc19tYWluLnNodG1sLiBTaW5jZSB0aGVuIGkndmUgCisgICogY2FyZWZ1bGx5IGNoZWNrZWQgdGhhdCB0aGUgc2FtZSByZXN1bHRzIHdlcmUgb2J0YWluZWQgd2hlbiBtb2RpZml5aW5nIHRoZSAKKyAgKiBjb2RlLiBQbGVhc2Ugbm90ZSB0aGF0IHdlIGRvIG5vdCBhbHdheXMgZ2V0IHRoZSBleGFjdCBzYW1lIGRlY2ltYWxzIGFzIHRoZXkgZG8sCisgICogYnV0IHRoaXMgaXMgb2sgOiB0aGV5IHVzZSAxMjhiaXRzIGZsb2F0LCBhbmQgd2UgZG8gdGhlIHRlc3RzIHVzaW5nIHRoZSBDIHR5cGUgJ2RvdWJsZScsCisgICogd2hpY2ggaXMgNjQgYml0cyBvbiBtb3N0IHBsYXRmb3JtcyAoeDg2IGFuZCBhbWQ2NCwgYXQgbGVhc3QpLgorICAqIEkndmUgcGVyZm9ybWVkIHRob3NlIHRlc3RzIG9uIHNldmVyYWwgb3RoZXIgaW1wbGVtZW50YXRpb25zIG9mIGxldmVuYmVyZy1tYXJxdWFyZHQsIGFuZAorICAqIChjKW1pbnBhY2sgcGVyZm9ybXMgVkVSWSB3ZWxsIGNvbXBhcmVkIHRvIHRob3NlLCBib3RoIGluIGFjY3VyYWN5IGFuZCBzcGVlZC4KKyAgKiAKKyAgKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgcnVubmluZyB0aGUgdGVzdHMgaXMgb24gdGhlIHdpa2kKKyAgKiBodHRwOi8vZWlnZW4udHV4ZmFtaWx5Lm9yZy9pbmRleC5waHA/dGl0bGU9VGVzdHMKKyAgKiAKKyAgKiBcc2VjdGlvbiBBUEkgQVBJIDogb3ZlcnZpZXcgb2YgbWV0aG9kcworICAqIAorICAqIEJvdGggYWxnb3JpdGhtcyBjYW4gdXNlIGVpdGhlciB0aGUgamFjb2JpYW4gKHByb3ZpZGVkIGJ5IHRoZSB1c2VyKSBvciBjb21wdXRlIAorICAqIGFuIGFwcHJveGltYXRpb24gYnkgdGhlbXNlbHZlcyAoYWN0dWFsbHkgdXNpbmcgRWlnZW4gXHJlZiBOdW1lcmljYWxEaWZmX01vZHVsZSkuCisgICogVGhlIHBhcnQgb2YgQVBJIHJlZmVycmluZyB0byB0aGUgbGF0dGVyIHVzZSAnTnVtZXJpY2FsRGlmZicgaW4gdGhlIG1ldGhvZCBuYW1lcworICAqIChleGVtcGxlOiBMZXZlbmJlcmdNYXJxdWFyZHQubWluaW1pemVOdW1lcmljYWxEaWZmKCkgKSAKKyAgKiAKKyAgKiBUaGUgbWV0aG9kcyBMZXZlbmJlcmdNYXJxdWFyZHQubG1kZXIxKCkvbG1kaWYxKCkvbG1zdHIxKCkgYW5kIAorICAqIEh5YnJpZE5vbkxpbmVhclNvbHZlci5oeWJyajEoKS9oeWJyZDEoKSBhcmUgc3BlY2lmaWMgbWV0aG9kcyBmcm9tIHRoZSBvcmlnaW5hbCAKKyAgKiBtaW5wYWNrIHBhY2thZ2UgdGhhdCB5b3UgcHJvYmFibHkgc2hvdWxkIE5PVCB1c2UgdW50aWwgeW91IGFyZSBwb3J0aW5nIGEgY29kZSB0aGF0CisgICogIHdhcyBwcmV2aW91c2x5IHVzaW5nIG1pbnBhY2suIFRoZXkganVzdCBkZWZpbmUgYSAnc2ltcGxlJyBBUEkgd2l0aCBkZWZhdWx0IHZhbHVlcyAKKyAgKiBmb3Igc29tZSBwYXJhbWV0ZXJzLgorICAqIAorICAqIEFsbCBhbGdvcml0aG1zIGFyZSBwcm92aWRlZCB1c2luZyBUd28gQVBJcyA6CisgICogICAgIC0gb25lIHdoZXJlIHRoZSB1c2VyIGluaXRzIHRoZSBhbGdvcml0aG0sIGFuZCB1c2VzICcqT25lU3RlcCgpJyBhcyBtdWNoIGFzIGhlIHdhbnRzIDogCisgICogdGhpcyB3YXkgdGhlIGNhbGxlciBoYXZlIGNvbnRyb2wgb3ZlciB0aGUgc3RlcHMKKyAgKiAgICAgLSBvbmUgd2hlcmUgdGhlIHVzZXIganVzdCBjYWxscyBhIG1ldGhvZCAob3B0aW1pemUoKSBvciBzb2x2ZSgpKSB3aGljaCB3aWxsIAorICAqIGhhbmRsZSB0aGUgbG9vcDogaW5pdCArIGxvb3AgdW50aWwgYSBzdG9wIGNvbmRpdGlvbiBpcyBtZXQuIFRob3NlIGFyZSBwcm92aWRlZCBmb3IKKyAgKiAgY29udmVuaWVuY2UuCisgICogCisgICogQXMgYW4gZXhhbXBsZSwgdGhlIG1ldGhvZCBMZXZlbmJlcmdNYXJxdWFyZHQ6Om1pbmltaXplKCkgaXMgCisgICogaW1wbGVtZW50ZWQgYXMgZm9sbG93IDogCisgICogXGNvZGUKKyAgKiBTdGF0dXMgTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlLFNjYWxhcj46Om1pbmltaXplKEZWZWN0b3JUeXBlICAmeCwgY29uc3QgaW50IG1vZGUpCisgICogeworICAqICAgICBTdGF0dXMgc3RhdHVzID0gbWluaW1pemVJbml0KHgsIG1vZGUpOworICAqICAgICBkbyB7CisgICogICAgICAgICBzdGF0dXMgPSBtaW5pbWl6ZU9uZVN0ZXAoeCwgbW9kZSk7CisgICogICAgIH0gd2hpbGUgKHN0YXR1cz09UnVubmluZyk7CisgICogICAgIHJldHVybiBzdGF0dXM7CisgICogfQorICAqIFxlbmRjb2RlCisgICogCisgICogXHNlY3Rpb24gZXhhbXBsZXMgRXhhbXBsZXMKKyAgKiAKKyAgKiBUaGUgZWFzaWVzdCB3YXkgdG8gdW5kZXJzdGFuZCBob3cgdG8gdXNlIHRoaXMgbW9kdWxlIGlzIGJ5IGxvb2tpbmcgYXQgdGhlIG1hbnkgZXhhbXBsZXMgaW4gdGhlIGZpbGUKKyAgKiB1bnN1cHBvcnRlZC90ZXN0L05vbkxpbmVhck9wdGltaXphdGlvbi5jcHAuCisgICovCisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworI2luY2x1ZGUgInNyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcXJzb2x2LmgiCisjaW5jbHVkZSAic3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9yMXVwZHQuaCIKKyNpbmNsdWRlICJzcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL3IxbXB5cS5oIgorI2luY2x1ZGUgInNyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcnd1cGR0LmgiCisjaW5jbHVkZSAic3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9mZGphYzEuaCIKKyNpbmNsdWRlICJzcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2xtcGFyLmgiCisjaW5jbHVkZSAic3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9kb2dsZWcuaCIKKyNpbmNsdWRlICJzcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2NvdmFyLmgiCisKKyNpbmNsdWRlICJzcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2Noa2Rlci5oIgorCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vSHlicmlkTm9uTGluZWFyU29sdmVyLmgiCisjaW5jbHVkZSAic3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9MZXZlbmJlcmdNYXJxdWFyZHQuaCIKKworCisjZW5kaWYgLy8gRUlHRU5fTk9OTElORUFST1BUSU1JWkFUSU9OX01PRFVMRQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vTnVtZXJpY2FsRGlmZiBiL3Vuc3VwcG9ydGVkL0VpZ2VuL051bWVyaWNhbERpZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0ODAzMQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL051bWVyaWNhbERpZmYKQEAgLTAsMCArMSw1NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhvbWFzIENhcHJpY2VsbGkgPG9yemVsQGZyZWVoYWNrZXJzLm9yZz4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTlVNRVJJQ0FMRElGRl9NT0RVTEUKKyNkZWZpbmUgRUlHRU5fTlVNRVJJQ0FMRElGRl9NT0RVTEUKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK25hbWVzcGFjZSBFaWdlbiB7CisKKy8qKiBcaW5ncm91cCBVbnN1cHBvcnRlZF9tb2R1bGVzCisgICogXGRlZmdyb3VwIE51bWVyaWNhbERpZmZfTW9kdWxlIE51bWVyaWNhbCBkaWZmZXJlbnRpYXRpb24gbW9kdWxlCisgICoKKyAgKiBcY29kZQorICAqICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9OdW1lcmljYWxEaWZmPgorICAqIFxlbmRjb2RlCisgICoKKyAgKiBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OdW1lcmljYWxfZGlmZmVyZW50aWF0aW9uCisgICoKKyAgKiBXYXJuaW5nIDogdGhpcyBzaG91bGQgTk9UIGJlIGNvbmZ1c2VkIHdpdGggYXV0b21hdGljIGRpZmZlcmVudGlhdGlvbiwgd2hpY2gKKyAgKiBpcyBhIGRpZmZlcmVudCBtZXRob2QgYW5kIGhhcyBpdHMgb3duIG1vZHVsZSBpbiBFaWdlbiA6IFxyZWYKKyAgKiBBdXRvRGlmZl9Nb2R1bGUuCisgICoKKyAgKiBDdXJyZW50bHkgb25seSAiRm9yd2FyZCIgYW5kICJDZW50cmFsIiBzY2hlbWVzIGFyZSBpbXBsZW1lbnRlZC4gVGhvc2UKKyAgKiBhcmUgYmFzaWMgbWV0aG9kcywgYW5kIHRoZXJlIGV4aXN0IHNvbWUgbW9yZSBlbGFib3JhdGVkIHdheSBvZgorICAqIGNvbXB1dGluZyBzdWNoIGFwcHJveGltYXRlcy4gVGhleSBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgYm90aAorICAqIHByb3ByaWV0YXJ5IGFuZCBmcmVlIHNvZnR3YXJlLCBhbmQgdXN1YWxseSByZXF1aXJlcyBsaW5raW5nIHRvIGFuCisgICogZXh0ZXJuYWwgbGlicmFyeS4gSXQgaXMgdmVyeSBlYXN5IGZvciB5b3UgdG8gd3JpdGUgYSBmdW5jdG9yCisgICogdXNpbmcgc3VjaCBzb2Z0d2FyZSwgYW5kIHRoZSBwdXJwb3NlIGlzIHF1aXRlIG9ydGhvZ29uYWwgdG8gd2hhdCB3ZQorICAqIHdhbnQgdG8gYWNoaWV2ZSB3aXRoIEVpZ2VuLgorICAqCisgICogVGhpcyBpcyB3aHkgd2Ugd2lsbCBub3QgcHJvdmlkZSB3cmFwcGVycyBmb3IgZXZlcnkgZ3JlYXQgbnVtZXJpY2FsCisgICogZGlmZmVyZW50aWF0aW9uIHNvZnR3YXJlIHRoYXQgZXhpc3QsIGJ1dCBzaG91bGQgcmF0aGVyIHN0aWNrIHdpdGggdGhvc2UKKyAgKiBiYXNpYyBvbmVzLCB0aGF0IHN0aWxsIGFyZSB1c2VmdWwgZm9yIHRlc3RpbmcuCisgICoKKyAgKiBBbHNvLCB0aGUgXHJlZiBOb25MaW5lYXJPcHRpbWl6YXRpb25fTW9kdWxlIG5lZWRzIHRoaXMgaW4gb3JkZXIgdG8KKyAgKiBwcm92aWRlIGZ1bGwgZmVhdHVyZXMgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvcmlnaW5hbCAoYyltaW5wYWNrCisgICogcGFja2FnZS4KKyAgKgorICAqLworfQorCisvL0B7CisKKyNpbmNsdWRlICJzcmMvTnVtZXJpY2FsRGlmZi9OdW1lcmljYWxEaWZmLmgiCisKKy8vQH0KKworCisjZW5kaWYgLy8gRUlHRU5fTlVNRVJJQ0FMRElGRl9NT0RVTEUKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL09wZW5HTFN1cHBvcnQgYi91bnN1cHBvcnRlZC9FaWdlbi9PcGVuR0xTdXBwb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmE0MjUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9PcGVuR0xTdXBwb3J0CkBAIC0wLDAgKzEsMzE3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fT1BFTkdMX01PRFVMRQorI2RlZmluZSBFSUdFTl9PUEVOR0xfTU9EVUxFCisKKyNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KKyNpbmNsdWRlIDxHTC9nbC5oPgorCituYW1lc3BhY2UgRWlnZW4geworCisvKiogXGluZ3JvdXAgVW5zdXBwb3J0ZWRfbW9kdWxlcworICAqIFxkZWZncm91cCBPcGVuR0xTVXBwb3J0X01vZHVsZSBPcGVuR0wgU3VwcG9ydCBtb2R1bGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBhIGNvdXBsZSBvZiBPcGVuR0wgZnVuY3Rpb25zCisgICogd2hpY2ggc2ltcGxpZnkgdGhlIHdheSB0byBwYXNzIEVpZ2VuJ3Mgb2JqZWN0IHRvIG9wZW5HTC4KKyAgKiBIZXJlIGlzIGFuIGV4bWFwbGU6CisgICogCisgICogXGNvZGUKKyAgKiAvLyBZb3UgbmVlZCB0byBhZGQgcGF0aF90b19laWdlbi91bnN1cHBvcnRlZCB0byB5b3VyIGluY2x1ZGUgcGF0aC4KKyAgKiAjaW5jbHVkZSA8RWlnZW4vT3BlbkdMU3VwcG9ydD4KKyAgKiAvLyAuLi4KKyAgKiBWZWN0b3IzZiB4LCB5OworICAqIE1hdHJpeDNmIHJvdDsKKyAgKiAKKyAgKiBnbFZlcnRleCh5ICsgeCAqIHJvdCk7CisgICogCisgICogUXVhdGVybmlvbiBxOworICAqIGdsUm90YXRlKHEpOworICAqIAorICAqIC8vIC4uLgorICAqIFxlbmRjb2RlCisgICoKKyAgKi8KKy8vQHsKKworI2RlZmluZSBFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lc3BhY2UgaW50ZXJuYWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIFhwclR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHlwZW5hbWUgU2NhbGFyID0gdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgUm93cyA9IFhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBDb2xzID0gWHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBJc0dMQ29tcGF0aWJsZSA9IGJvb2woWHByVHlwZTo6RmxhZ3MmTGluZWFyQWNjZXNzQml0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBib29sKFhwclR5cGU6OkZsYWdzJkRpcmVjdEFjY2Vzc0JpdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChYcHJUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgfHwgKFhwclR5cGU6OkZsYWdzJlJvd01ham9yQml0KT09MCk+ICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgRUlHRU5fQ0FUKEVJR0VOX0NBVChnbF8sRlVOQyksX2ltcGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgdHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93cywgaW50IENvbHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgRUlHRU5fQ0FUKEVJR0VOX0NBVChnbF8sRlVOQyksX2ltcGwpPFhwclR5cGUsU2NhbGFyLFJvd3MsQ29scyxmYWxzZT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBYcHJUeXBlJiBwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEVJR0VOX0NBVChFSUdFTl9DQVQoZ2xfLEZVTkMpLF9pbXBsKTx0eXBlbmFtZSBwbGFpbl9tYXRyaXhfdHlwZV9jb2x1bW5fbWFqb3I8WHByVHlwZT46OnR5cGU+OjpydW4ocCk7IH0gICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gaW5saW5lIHZvaWQgRlVOQyhjb25zdCBFaWdlbjo6RGVuc2VCYXNlPERlcml2ZWQ+JiBwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVJR0VOX0NBVChFSUdFTl9DQVQoaW50ZXJuYWw6OmdsXyxGVU5DKSxfaW1wbCk8RGVyaXZlZD46OnJ1bihwLmRlcml2ZWQoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIEVJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fTUFUKEZVTkMsU0NBTEFSLFJPV1MsQ09MUyxTVUZGSVgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWVzcGFjZSBpbnRlcm5hbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTwgdHlwZW5hbWUgWHByVHlwZT4gc3RydWN0IEVJR0VOX0NBVChFSUdFTl9DQVQoZ2xfLEZVTkMpLF9pbXBsKTxYcHJUeXBlLCBTQ0FMQVIsIFJPV1MsIENPTFMsIHRydWU+IHsgICAgICBcCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBYcHJUeXBlJiBwKSB7IEZVTkMjI1NVRkZJWChwLmRhdGEoKSk7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisgIAorI2RlZmluZSBFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhGVU5DLFNDQUxBUixTSVpFLFNVRkZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lc3BhY2UgaW50ZXJuYWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIFhwclR5cGU+IHN0cnVjdCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGdsXyxGVU5DKSxfaW1wbCk8WHByVHlwZSwgU0NBTEFSLCBTSVpFLCAxLCB0cnVlPiB7ICAgICAgICAgXAorICAgIGlubGluZSBzdGF0aWMgdm9pZCBydW4oY29uc3QgWHByVHlwZSYgcCkgeyBGVU5DIyNTVUZGSVgocC5kYXRhKCkpOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIFhwclR5cGU+IHN0cnVjdCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGdsXyxGVU5DKSxfaW1wbCk8WHByVHlwZSwgU0NBTEFSLCAxLCBTSVpFLCB0cnVlPiB7ICAgICAgICAgXAorICAgIGlubGluZSBzdGF0aWMgdm9pZCBydW4oY29uc3QgWHByVHlwZSYgcCkgeyBGVU5DIyNTVUZGSVgocC5kYXRhKCkpOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworICAKK0VJR0VOX0dMX0ZVTkNfREVDTEFSQVRJT04gICAgICAgKGdsVmVydGV4KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xWZXJ0ZXgsaW50LCAgICAyLDJpdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVmVydGV4LHNob3J0LCAgMiwyc3YpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFZlcnRleCxmbG9hdCwgIDIsMmZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xWZXJ0ZXgsZG91YmxlLCAyLDJkdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVmVydGV4LGludCwgICAgMywzaXYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFZlcnRleCxzaG9ydCwgIDMsM3N2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xWZXJ0ZXgsZmxvYXQsICAzLDNmdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVmVydGV4LGRvdWJsZSwgMywzZHYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFZlcnRleCxpbnQsICAgIDQsNGl2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xWZXJ0ZXgsc2hvcnQsICA0LDRzdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVmVydGV4LGZsb2F0LCAgNCw0ZnYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFZlcnRleCxkb3VibGUsIDQsNGR2KQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbFRleENvb3JkKQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxpbnQsICAgIDIsMml2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxzaG9ydCwgIDIsMnN2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxmbG9hdCwgIDIsMmZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxkb3VibGUsIDIsMmR2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxpbnQsICAgIDMsM2l2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxzaG9ydCwgIDMsM3N2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxmbG9hdCwgIDMsM2Z2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxkb3VibGUsIDMsM2R2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxpbnQsICAgIDQsNGl2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxzaG9ydCwgIDQsNHN2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxmbG9hdCwgIDQsNGZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUZXhDb29yZCxkb3VibGUsIDQsNGR2KQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbENvbG9yKQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixpbnQsICAgIDIsMml2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixzaG9ydCwgIDIsMnN2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixmbG9hdCwgIDIsMmZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixkb3VibGUsIDIsMmR2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixpbnQsICAgIDMsM2l2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixzaG9ydCwgIDMsM3N2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixmbG9hdCwgIDMsM2Z2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixkb3VibGUsIDMsM2R2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixpbnQsICAgIDQsNGl2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixzaG9ydCwgIDQsNHN2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixmbG9hdCwgIDQsNGZ2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xDb2xvcixkb3VibGUsIDQsNGR2KQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbE5vcm1hbCkKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsTm9ybWFsLGludCwgICAgMywzaXYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbE5vcm1hbCxzaG9ydCwgIDMsM3N2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xOb3JtYWwsZmxvYXQsICAzLDNmdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsTm9ybWFsLGRvdWJsZSwgMywzZHYpCisKK2lubGluZSB2b2lkIGdsU2NhbGUyZnYoY29uc3QgZmxvYXQqICB2KSB7IGdsU2NhbGVmKHZbMF0sIHZbMV0sIDEuZik7ICB9CitpbmxpbmUgdm9pZCBnbFNjYWxlMmR2KGNvbnN0IGRvdWJsZSogdikgeyBnbFNjYWxlZCh2WzBdLCB2WzFdLCAxLjApOyAgfQoraW5saW5lIHZvaWQgZ2xTY2FsZTNmdihjb25zdCBmbG9hdCogIHYpIHsgZ2xTY2FsZWYodlswXSwgdlsxXSwgdlsyXSk7IH0KK2lubGluZSB2b2lkIGdsU2NhbGUzZHYoY29uc3QgZG91YmxlKiB2KSB7IGdsU2NhbGVkKHZbMF0sIHZbMV0sIHZbMl0pOyB9CisKK0VJR0VOX0dMX0ZVTkNfREVDTEFSQVRJT04gICAgICAgKGdsU2NhbGUpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFNjYWxlLGZsb2F0LCAgMiwyZnYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFNjYWxlLGRvdWJsZSwgMiwyZHYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFNjYWxlLGZsb2F0LCAgMywzZnYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFNjYWxlLGRvdWJsZSwgMywzZHYpCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBnbFNjYWxlKGNvbnN0IFVuaWZvcm1TY2FsaW5nPFNjYWxhcj4mIHMpICB7IGdsU2NhbGUoTWF0cml4PFNjYWxhciwzLDE+OjpDb25zdGFudChzLmZhY3RvcigpKSk7IH0KKworaW5saW5lIHZvaWQgZ2xUcmFuc2xhdGUyZnYoY29uc3QgZmxvYXQqICB2KSB7IGdsVHJhbnNsYXRlZih2WzBdLCB2WzFdLCAwLmYpOyAgfQoraW5saW5lIHZvaWQgZ2xUcmFuc2xhdGUyZHYoY29uc3QgZG91YmxlKiB2KSB7IGdsVHJhbnNsYXRlZCh2WzBdLCB2WzFdLCAwLjApOyAgfQoraW5saW5lIHZvaWQgZ2xUcmFuc2xhdGUzZnYoY29uc3QgZmxvYXQqICB2KSB7IGdsVHJhbnNsYXRlZih2WzBdLCB2WzFdLCB2WzJdKTsgfQoraW5saW5lIHZvaWQgZ2xUcmFuc2xhdGUzZHYoY29uc3QgZG91YmxlKiB2KSB7IGdsVHJhbnNsYXRlZCh2WzBdLCB2WzFdLCB2WzJdKTsgfQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbFRyYW5zbGF0ZSkKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVHJhbnNsYXRlLGZsb2F0LCAgMiwyZnYpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFRyYW5zbGF0ZSxkb3VibGUsIDIsMmR2KQorRUlHRU5fR0xfRlVOQ19TUEVDSUFMSVpBVElPTl9WRUMoZ2xUcmFuc2xhdGUsZmxvYXQsICAzLDNmdikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fVkVDKGdsVHJhbnNsYXRlLGRvdWJsZSwgMywzZHYpCisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBnbFRyYW5zbGF0ZShjb25zdCBUcmFuc2xhdGlvbjxTY2FsYXIsMj4mIHQpICB7IGdsVHJhbnNsYXRlKHQudmVjdG9yKCkpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZ2xUcmFuc2xhdGUoY29uc3QgVHJhbnNsYXRpb248U2NhbGFyLDM+JiB0KSAgeyBnbFRyYW5zbGF0ZSh0LnZlY3RvcigpKTsgfQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbE11bHRNYXRyaXgpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX01BVChnbE11bHRNYXRyaXgsZmxvYXQsICA0LDQsZikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fTUFUKGdsTXVsdE1hdHJpeCxkb3VibGUsIDQsNCxkKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZ2xNdWx0TWF0cml4KGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsMyxBZmZpbmU+JiB0KSAgICAgICAgeyBnbE11bHRNYXRyaXgodC5tYXRyaXgoKSk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBnbE11bHRNYXRyaXgoY29uc3QgVHJhbnNmb3JtPFNjYWxhciwzLFByb2plY3RpdmU+JiB0KSAgICB7IGdsTXVsdE1hdHJpeCh0Lm1hdHJpeCgpKTsgfQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGdsTXVsdE1hdHJpeChjb25zdCBUcmFuc2Zvcm08U2NhbGFyLDMsQWZmaW5lQ29tcGFjdD4mIHQpIHsgZ2xNdWx0TWF0cml4KFRyYW5zZm9ybTxTY2FsYXIsMyxBZmZpbmU+KHQpLm1hdHJpeCgpKTsgfQorCitFSUdFTl9HTF9GVU5DX0RFQ0xBUkFUSU9OICAgICAgIChnbExvYWRNYXRyaXgpCitFSUdFTl9HTF9GVU5DX1NQRUNJQUxJWkFUSU9OX01BVChnbExvYWRNYXRyaXgsZmxvYXQsICA0LDQsZikKK0VJR0VOX0dMX0ZVTkNfU1BFQ0lBTElaQVRJT05fTUFUKGdsTG9hZE1hdHJpeCxkb3VibGUsIDQsNCxkKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZ2xMb2FkTWF0cml4KGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsMyxBZmZpbmU+JiB0KSAgICAgICAgeyBnbExvYWRNYXRyaXgodC5tYXRyaXgoKSk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBnbExvYWRNYXRyaXgoY29uc3QgVHJhbnNmb3JtPFNjYWxhciwzLFByb2plY3RpdmU+JiB0KSAgICB7IGdsTG9hZE1hdHJpeCh0Lm1hdHJpeCgpKTsgfQordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGdsTG9hZE1hdHJpeChjb25zdCBUcmFuc2Zvcm08U2NhbGFyLDMsQWZmaW5lQ29tcGFjdD4mIHQpIHsgZ2xMb2FkTWF0cml4KFRyYW5zZm9ybTxTY2FsYXIsMyxBZmZpbmU+KHQpLm1hdHJpeCgpKTsgfQorCitzdGF0aWMgdm9pZCBnbFJvdGF0ZShjb25zdCBSb3RhdGlvbjJEPGZsb2F0PiYgcm90KQoreworICBnbFJvdGF0ZWYocm90LmFuZ2xlKCkqMTgwLmYvZmxvYXQoTV9QSSksIDAuZiwgMC5mLCAxLmYpOworfQorc3RhdGljIHZvaWQgZ2xSb3RhdGUoY29uc3QgUm90YXRpb24yRDxkb3VibGU+JiByb3QpCit7CisgIGdsUm90YXRlZChyb3QuYW5nbGUoKSoxODAuMC9NX1BJLCAwLjAsIDAuMCwgMS4wKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gdm9pZCBnbFJvdGF0ZShjb25zdCBSb3RhdGlvbkJhc2U8RGVyaXZlZCwzPiYgcm90KQoreyAgCisgIFRyYW5zZm9ybTx0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIsMyxQcm9qZWN0aXZlPiB0cihyb3QpOworICBnbE11bHRNYXRyaXgodHIubWF0cml4KCkpOworfQorCisjZGVmaW5lIEVJR0VOX0dMX01BS0VfQ09OU1RfY29uc3QgY29uc3QKKyNkZWZpbmUgRUlHRU5fR0xfTUFLRV9DT05TVF9fIAorI2RlZmluZSBFSUdFTl9HTF9FVkFMKFgpIFgKKworI2RlZmluZSBFSUdFTl9HTF9GVU5DMV9ERUNMQVJBVElPTihGVU5DLEFSRzEsQ09OU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lc3BhY2UgaW50ZXJuYWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIFhwclR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHlwZW5hbWUgU2NhbGFyID0gdHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgUm93cyA9IFhwclR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBDb2xzID0gWHByVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBJc0dMQ29tcGF0aWJsZSA9IGJvb2woWHByVHlwZTo6RmxhZ3MmTGluZWFyQWNjZXNzQml0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBib29sKFhwclR5cGU6OkZsYWdzJkRpcmVjdEFjY2Vzc0JpdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChYcHJUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgfHwgKFhwclR5cGU6OkZsYWdzJlJvd01ham9yQml0KT09MCk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgRUlHRU5fQ0FUKEVJR0VOX0NBVChnbF8sRlVOQyksX2ltcGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZSwgdHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93cywgaW50IENvbHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgRUlHRU5fQ0FUKEVJR0VOX0NBVChnbF8sRlVOQyksX2ltcGwpPFhwclR5cGUsU2NhbGFyLFJvd3MsQ29scyxmYWxzZT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIHJ1bihBUkcxIGEsRUlHRU5fR0xfRVZBTChFSUdFTl9HTF9NQUtFX0NPTlNUXyMjQ09OU1QpIFhwclR5cGUmIHApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEVJR0VOX0NBVChFSUdFTl9DQVQoZ2xfLEZVTkMpLF9pbXBsKTx0eXBlbmFtZSBwbGFpbl9tYXRyaXhfdHlwZV9jb2x1bW5fbWFqb3I8WHByVHlwZT46OnR5cGU+OjpydW4oYSxwKTsgfSAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gaW5saW5lIHZvaWQgRlVOQyhBUkcxIGEsRUlHRU5fR0xfRVZBTChFSUdFTl9HTF9NQUtFX0NPTlNUXyMjQ09OU1QpIEVpZ2VuOjpEZW5zZUJhc2U8RGVyaXZlZD4mIHApIHsgICBcCisgIEVJR0VOX0NBVChFSUdFTl9DQVQoaW50ZXJuYWw6OmdsXyxGVU5DKSxfaW1wbCk8RGVyaXZlZD46OnJ1bihhLHAuZGVyaXZlZCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIEVJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX01BVChGVU5DLEFSRzEsQ09OU1QsU0NBTEFSLFJPV1MsQ09MUyxTVUZGSVgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWVzcGFjZSBpbnRlcm5hbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTwgdHlwZW5hbWUgWHByVHlwZT4gc3RydWN0IEVJR0VOX0NBVChFSUdFTl9DQVQoZ2xfLEZVTkMpLF9pbXBsKTxYcHJUeXBlLCBTQ0FMQVIsIFJPV1MsIENPTFMsIHRydWU+IHsgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIHJ1bihBUkcxIGEsIEVJR0VOX0dMX0VWQUwoRUlHRU5fR0xfTUFLRV9DT05TVF8jI0NPTlNUKSBYcHJUeXBlJiBwKSB7IEZVTkMjI1NVRkZJWChhLHAuZGF0YSgpKTsgfSAgICAgICAgIFwKKyAgfTsgXAorfQorCisgIAorI2RlZmluZSBFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9WRUMoRlVOQyxBUkcxLENPTlNULFNDQUxBUixTSVpFLFNVRkZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lc3BhY2UgaW50ZXJuYWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIFhwclR5cGU+IHN0cnVjdCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGdsXyxGVU5DKSxfaW1wbCk8WHByVHlwZSwgU0NBTEFSLCBTSVpFLCAxLCB0cnVlPiB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBzdGF0aWMgdm9pZCBydW4oQVJHMSBhLCBFSUdFTl9HTF9FVkFMKEVJR0VOX0dMX01BS0VfQ09OU1RfIyNDT05TVCkgWHByVHlwZSYgcCkgeyBGVU5DIyNTVUZGSVgoYSxwLmRhdGEoKSk7IH0gICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8IHR5cGVuYW1lIFhwclR5cGU+IHN0cnVjdCBFSUdFTl9DQVQoRUlHRU5fQ0FUKGdsXyxGVU5DKSxfaW1wbCk8WHByVHlwZSwgU0NBTEFSLCAxLCBTSVpFLCB0cnVlPiB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBzdGF0aWMgdm9pZCBydW4oQVJHMSBhLCBFSUdFTl9HTF9FVkFMKEVJR0VOX0dMX01BS0VfQ09OU1RfIyNDT05TVCkgWHByVHlwZSYgcCkgeyBGVU5DIyNTVUZGSVgoYSxwLmRhdGEoKSk7IH0gICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworRUlHRU5fR0xfRlVOQzFfREVDTEFSQVRJT04gICAgICAgKGdsR2V0LEdMZW51bSxfKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fTUFUKGdsR2V0LEdMZW51bSxfLGZsb2F0LCAgNCw0LEZsb2F0dikKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX01BVChnbEdldCxHTGVudW0sXyxkb3VibGUsIDQsNCxEb3VibGV2KQorCisvLyBnbFVuaWZvcm0gQVBJCisKKyNpZmRlZiBHTF9WRVJTSU9OXzJfMAorCitzdGF0aWMgdm9pZCBnbFVuaWZvcm0yZnZfZWkgIChHTGludCBsb2MsIGNvbnN0IGZsb2F0KiB2KSAgICAgICAgIHsgZ2xVbmlmb3JtMmZ2KGxvYywxLHYpOyB9CitzdGF0aWMgdm9pZCBnbFVuaWZvcm0yaXZfZWkgIChHTGludCBsb2MsIGNvbnN0IGludCogdikgICAgICAgICAgIHsgZ2xVbmlmb3JtMml2KGxvYywxLHYpOyB9CisKK3N0YXRpYyB2b2lkIGdsVW5pZm9ybTNmdl9laSAgKEdMaW50IGxvYywgY29uc3QgZmxvYXQqIHYpICAgICAgICAgeyBnbFVuaWZvcm0zZnYobG9jLDEsdik7IH0KK3N0YXRpYyB2b2lkIGdsVW5pZm9ybTNpdl9laSAgKEdMaW50IGxvYywgY29uc3QgaW50KiB2KSAgICAgICAgICAgeyBnbFVuaWZvcm0zaXYobG9jLDEsdik7IH0KKworc3RhdGljIHZvaWQgZ2xVbmlmb3JtNGZ2X2VpICAoR0xpbnQgbG9jLCBjb25zdCBmbG9hdCogdikgICAgICAgICB7IGdsVW5pZm9ybTRmdihsb2MsMSx2KTsgfQorc3RhdGljIHZvaWQgZ2xVbmlmb3JtNGl2X2VpICAoR0xpbnQgbG9jLCBjb25zdCBpbnQqIHYpICAgICAgICAgICB7IGdsVW5pZm9ybTRpdihsb2MsMSx2KTsgfQorCitzdGF0aWMgdm9pZCBnbFVuaWZvcm1NYXRyaXgyZnZfZWkgIChHTGludCBsb2MsIGNvbnN0IGZsb2F0KiB2KSAgICAgICAgIHsgZ2xVbmlmb3JtTWF0cml4MmZ2KGxvYywxLGZhbHNlLHYpOyB9CitzdGF0aWMgdm9pZCBnbFVuaWZvcm1NYXRyaXgzZnZfZWkgIChHTGludCBsb2MsIGNvbnN0IGZsb2F0KiB2KSAgICAgICAgIHsgZ2xVbmlmb3JtTWF0cml4M2Z2KGxvYywxLGZhbHNlLHYpOyB9CitzdGF0aWMgdm9pZCBnbFVuaWZvcm1NYXRyaXg0ZnZfZWkgIChHTGludCBsb2MsIGNvbnN0IGZsb2F0KiB2KSAgICAgICAgIHsgZ2xVbmlmb3JtTWF0cml4NGZ2KGxvYywxLGZhbHNlLHYpOyB9CisKKworRUlHRU5fR0xfRlVOQzFfREVDTEFSQVRJT04gICAgICAgKGdsVW5pZm9ybSxHTGludCxjb25zdCkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFVuaWZvcm0sR0xpbnQsY29uc3QsZmxvYXQsICAgICAgICAyLDJmdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFVuaWZvcm0sR0xpbnQsY29uc3QsaW50LCAgICAgICAgICAyLDJpdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFVuaWZvcm0sR0xpbnQsY29uc3QsZmxvYXQsICAgICAgICAzLDNmdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFVuaWZvcm0sR0xpbnQsY29uc3QsaW50LCAgICAgICAgICAzLDNpdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFVuaWZvcm0sR0xpbnQsY29uc3QsZmxvYXQsICAgICAgICA0LDRmdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFVuaWZvcm0sR0xpbnQsY29uc3QsaW50LCAgICAgICAgICA0LDRpdl9laSkKKworRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fTUFUKGdsVW5pZm9ybSxHTGludCxjb25zdCxmbG9hdCwgICAgICAgIDIsMixNYXRyaXgyZnZfZWkpCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9NQVQoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LGZsb2F0LCAgICAgICAgMywzLE1hdHJpeDNmdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX01BVChnbFVuaWZvcm0sR0xpbnQsY29uc3QsZmxvYXQsICAgICAgICA0LDQsTWF0cml4NGZ2X2VpKQorCisjZW5kaWYKKworI2lmZGVmIEdMX1ZFUlNJT05fMl8xCisKK3N0YXRpYyB2b2lkIGdsVW5pZm9ybU1hdHJpeDJ4M2Z2X2VpKEdMaW50IGxvYywgY29uc3QgZmxvYXQqIHYpICAgICAgICAgeyBnbFVuaWZvcm1NYXRyaXgyeDNmdihsb2MsMSxmYWxzZSx2KTsgfQorc3RhdGljIHZvaWQgZ2xVbmlmb3JtTWF0cml4M3gyZnZfZWkoR0xpbnQgbG9jLCBjb25zdCBmbG9hdCogdikgICAgICAgICB7IGdsVW5pZm9ybU1hdHJpeDN4MmZ2KGxvYywxLGZhbHNlLHYpOyB9CitzdGF0aWMgdm9pZCBnbFVuaWZvcm1NYXRyaXgyeDRmdl9laShHTGludCBsb2MsIGNvbnN0IGZsb2F0KiB2KSAgICAgICAgIHsgZ2xVbmlmb3JtTWF0cml4Mng0ZnYobG9jLDEsZmFsc2Usdik7IH0KK3N0YXRpYyB2b2lkIGdsVW5pZm9ybU1hdHJpeDR4MmZ2X2VpKEdMaW50IGxvYywgY29uc3QgZmxvYXQqIHYpICAgICAgICAgeyBnbFVuaWZvcm1NYXRyaXg0eDJmdihsb2MsMSxmYWxzZSx2KTsgfQorc3RhdGljIHZvaWQgZ2xVbmlmb3JtTWF0cml4M3g0ZnZfZWkoR0xpbnQgbG9jLCBjb25zdCBmbG9hdCogdikgICAgICAgICB7IGdsVW5pZm9ybU1hdHJpeDN4NGZ2KGxvYywxLGZhbHNlLHYpOyB9CitzdGF0aWMgdm9pZCBnbFVuaWZvcm1NYXRyaXg0eDNmdl9laShHTGludCBsb2MsIGNvbnN0IGZsb2F0KiB2KSAgICAgICAgIHsgZ2xVbmlmb3JtTWF0cml4NHgzZnYobG9jLDEsZmFsc2Usdik7IH0KKworRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fTUFUKGdsVW5pZm9ybSxHTGludCxjb25zdCxmbG9hdCwgICAgICAgIDIsMyxNYXRyaXgyeDNmdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX01BVChnbFVuaWZvcm0sR0xpbnQsY29uc3QsZmxvYXQsICAgICAgICAzLDIsTWF0cml4M3gyZnZfZWkpCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9NQVQoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LGZsb2F0LCAgICAgICAgMiw0LE1hdHJpeDJ4NGZ2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fTUFUKGdsVW5pZm9ybSxHTGludCxjb25zdCxmbG9hdCwgICAgICAgIDQsMixNYXRyaXg0eDJmdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX01BVChnbFVuaWZvcm0sR0xpbnQsY29uc3QsZmxvYXQsICAgICAgICAzLDQsTWF0cml4M3g0ZnZfZWkpCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9NQVQoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LGZsb2F0LCAgICAgICAgNCwzLE1hdHJpeDR4M2Z2X2VpKQorCisjZW5kaWYKKworI2lmZGVmIEdMX1ZFUlNJT05fM18wCisKK3N0YXRpYyB2b2lkIGdsVW5pZm9ybTJ1aXZfZWkgKEdMaW50IGxvYywgY29uc3QgdW5zaWduZWQgaW50KiB2KSAgeyBnbFVuaWZvcm0ydWl2KGxvYywxLHYpOyB9CitzdGF0aWMgdm9pZCBnbFVuaWZvcm0zdWl2X2VpIChHTGludCBsb2MsIGNvbnN0IHVuc2lnbmVkIGludCogdikgIHsgZ2xVbmlmb3JtM3Vpdihsb2MsMSx2KTsgfQorc3RhdGljIHZvaWQgZ2xVbmlmb3JtNHVpdl9laSAoR0xpbnQgbG9jLCBjb25zdCB1bnNpZ25lZCBpbnQqIHYpICB7IGdsVW5pZm9ybTR1aXYobG9jLDEsdik7IH0KKworRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCx1bnNpZ25lZCBpbnQsIDIsMnVpdl9laSkKK0VJR0VOX0dMX0ZVTkMxX1NQRUNJQUxJWkFUSU9OX1ZFQyhnbFVuaWZvcm0sR0xpbnQsY29uc3QsdW5zaWduZWQgaW50LCAzLDN1aXZfZWkpCitFSUdFTl9HTF9GVU5DMV9TUEVDSUFMSVpBVElPTl9WRUMoZ2xVbmlmb3JtLEdMaW50LGNvbnN0LHVuc2lnbmVkIGludCwgNCw0dWl2X2VpKQorCisjZW5kaWYKKworI2lmZGVmIEdMX0FSQl9ncHVfc2hhZGVyX2ZwNjQKK3N0YXRpYyB2b2lkIGdsVW5pZm9ybTJkdl9laSAgKEdMaW50IGxvYywgY29uc3QgZG91YmxlKiB2KSAgICAgICAgeyBnbFVuaWZvcm0yZHYobG9jLDEsdik7IH0KK3N0YXRpYyB2b2lkIGdsVW5pZm9ybTNkdl9laSAgKEdMaW50IGxvYywgY29uc3QgZG91YmxlKiB2KSAgICAgICAgeyBnbFVuaWZvcm0zZHYobG9jLDEsdik7IH0KK3N0YXRpYyB2b2lkIGdsVW5pZm9ybTRkdl9laSAgKEdMaW50IGxvYywgY29uc3QgZG91YmxlKiB2KSAgICAgICAgeyBnbFVuaWZvcm00ZHYobG9jLDEsdik7IH0KKworRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCxkb3VibGUsICAgICAgIDIsMmR2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCxkb3VibGUsICAgICAgIDMsM2R2X2VpKQorRUlHRU5fR0xfRlVOQzFfU1BFQ0lBTElaQVRJT05fVkVDKGdsVW5pZm9ybSxHTGludCxjb25zdCxkb3VibGUsICAgICAgIDQsNGR2X2VpKQorI2VuZGlmCisKKworLy9AfQorCit9CisKKyNlbmRpZiAvLyBFSUdFTl9PUEVOR0xfTU9EVUxFCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9Qb2x5bm9taWFscyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL1BvbHlub21pYWxzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNThiMDAKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9Qb2x5bm9taWFscwpAQCAtMCwwICsxLDEzMyBAQAorI2lmbmRlZiBFSUdFTl9QT0xZTk9NSUFMU19NT0RVTEVfSAorI2RlZmluZSBFSUdFTl9QT0xZTk9NSUFMU19NT0RVTEVfSAorCisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKworI2luY2x1ZGUgPEVpZ2VuL3NyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmg+CisKKyNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KKworLy8gTm90ZSB0aGF0IEVJR0VOX0hJREVfSEVBVllfQ09ERSBoYXMgdG8gYmUgZGVmaW5lZCBwZXIgbW9kdWxlCisjaWYgKGRlZmluZWQgRUlHRU5fRVhURVJOX0lOU1RBTlRJQVRJT05TKSAmJiAoRUlHRU5fRVhURVJOX0lOU1RBTlRJQVRJT05TPj0yKQorICAjaWZuZGVmIEVJR0VOX0hJREVfSEVBVllfQ09ERQorICAjZGVmaW5lIEVJR0VOX0hJREVfSEVBVllfQ09ERQorICAjZW5kaWYKKyNlbGlmIGRlZmluZWQgRUlHRU5fSElERV9IRUFWWV9DT0RFCisgICN1bmRlZiBFSUdFTl9ISURFX0hFQVZZX0NPREUKKyNlbmRpZgorCisvKiogXGluZ3JvdXAgVW5zdXBwb3J0ZWRfbW9kdWxlcworICAqIFxkZWZncm91cCBQb2x5bm9taWFsc19Nb2R1bGUgUG9seW5vbWlhbHMgbW9kdWxlCisgICoKKyAgKgorICAqCisgICogXGJyaWVmIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgUVIgYmFzZWQgcG9seW5vbWlhbCBzb2x2ZXIuCisJKgorICAqIFRvIHVzZSB0aGlzIG1vZHVsZSwgYWRkCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vUG9seW5vbWlhbHM+CisgICogXGVuZGNvZGUKKwkqIGF0IHRoZSBzdGFydCBvZiB5b3VyIHNvdXJjZSBmaWxlLgorICAqLworCisjaW5jbHVkZSAic3JjL1BvbHlub21pYWxzL1BvbHlub21pYWxVdGlscy5oIgorI2luY2x1ZGUgInNyYy9Qb2x5bm9taWFscy9Db21wYW5pb24uaCIKKyNpbmNsdWRlICJzcmMvUG9seW5vbWlhbHMvUG9seW5vbWlhbFNvbHZlci5oIgorCisvKioKKwlccGFnZSBwb2x5bm9taWFscyBQb2x5bm9taWFscyBkZWZpbmVzIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHBvbHlub21pYWxzCisJYW5kIGEgUVIgYmFzZWQgcG9seW5vbWlhbCBzb2x2ZXIuCisJXGluZ3JvdXAgUG9seW5vbWlhbHNfTW9kdWxlCisKKwlUaGUgcmVtYWluZGVyIG9mIHRoZSBwYWdlIGRvY3VtZW50cyBmaXJzdCB0aGUgZnVuY3Rpb25zIGZvciBldmFsdWF0aW5nLCBjb21wdXRpbmcKKwlwb2x5bm9taWFscywgY29tcHV0aW5nIGVzdGltYXRlcyBhYm91dCBwb2x5bm9taWFscyBhbmQgbmV4dCB0aGUgUVIgYmFzZWQgcG9seW5vbWlhbAorCXNvbHZlci4KKworCVxzZWN0aW9uIHBvbHlub21pYWxVdGlscyBjb252ZW5pZW50IGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggcG9seW5vbWlhbHMKKwlcc3Vic2VjdGlvbiByb290c190b19tb25pY1BvbHlub21pYWwKKwlUaGUgZnVuY3Rpb24KKwlcY29kZQorCXZvaWQgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKCBjb25zdCBSb290VmVjdG9yJiBydiwgUG9seW5vbWlhbCYgcG9seSApCisJXGVuZGNvZGUKKwljb21wdXRlcyB0aGUgY29lZmZpY2llbnRzIFxmJCBhX2kgXGYkIG9mCisKKwlcZiQgcCh4KSA9IGFfMCArIGFfezF9eCArIC4uLiArIGFfe24tMX14XntuLTF9ICsgeF5uIFxmJAorCisJd2hlcmUgXGYkIHAgXGYkIGlzIGtub3duIHRocm91Z2ggaXRzIHJvb3RzIGkuZS4gXGYkIHAoeCkgPSAoeC1yXzEpKHgtcl8yKS4uLih4LXJfbikgXGYkLgorCisJXHN1YnNlY3Rpb24gcG9seV9ldmFsCisJVGhlIGZ1bmN0aW9uCisJXGNvZGUKKwlUIHBvbHlfZXZhbCggY29uc3QgUG9seW5vbWlhbHMmIHBvbHksIGNvbnN0IFQmIHggKQorCVxlbmRjb2RlCisJZXZhbHVhdGVzIGEgcG9seW5vbWlhbCBhdCBhIGdpdmVuIHBvaW50IHVzaW5nIHN0YWJpbGl6ZWQgSCZvdW1sO3JuZXIgbWV0aG9kLgorCisJVGhlIGZvbGxvd2luZyBjb2RlOiBmaXJzdCBjb21wdXRlcyB0aGUgY29lZmZpY2llbnRzIGluIHRoZSBtb25vbWlhbCBiYXNpcyBvZiB0aGUgbW9uaWMgcG9seW5vbWlhbCB0aGF0IGhhcyB0aGUgcHJvdmlkZWQgcm9vdHM7CisJdGhlbiwgaXQgZXZhbHVhdGVzIHRoZSBjb21wdXRlZCBwb2x5bm9taWFsLCB1c2luZyBhIHN0YWJpbGl6ZWQgSCZvdW1sO3JuZXIgbWV0aG9kLgorCisJXGluY2x1ZGUgUG9seW5vbWlhbFV0aWxzMS5jcHAKKyAgT3V0cHV0OiBcdmVyYmluY2x1ZGUgUG9seW5vbWlhbFV0aWxzMS5vdXQKKworCVxzdWJzZWN0aW9uIENhdWNoeSBib3VuZHMKKwlUaGUgZnVuY3Rpb24KKwlcY29kZQorCVJlYWwgY2F1Y2h5X21heF9ib3VuZCggY29uc3QgUG9seW5vbWlhbCYgcG9seSApCisJXGVuZGNvZGUKKwlwcm92aWRlcyBhIG1heGltdW0gYm91bmQgKHRoZSBDYXVjaHkgb25lOiBcZiRDKHApXGYkKSBmb3IgdGhlIGFic29sdXRlIHZhbHVlIG9mIGEgcm9vdCBvZiB0aGUgZ2l2ZW4gcG9seW5vbWlhbCBpLmUuCisJXGYkIFxmb3JhbGwgcl9pIFxmJCByb290IG9mIFxmJCBwKHgpID0gXHN1bV97az0wfV5kIGFfayB4XmsgXGYkLAorCVxmJCB8cl9pfCBcbGUgQyhwKSA9IFxzdW1fe2s9MH1ee2R9IFxsZWZ0IHwgXGZyYWN7YV9rfXthX2R9IFxyaWdodCB8IFxmJAorCVRoZSBsZWFkaW5nIGNvZWZmaWNpZW50IFxmJCBwIFxmJDogc2hvdWxkIGJlIG5vbiB6ZXJvIFxmJGFfZCBcbmVxIDBcZiQuCisKKworCVRoZSBmdW5jdGlvbgorCVxjb2RlCisJUmVhbCBjYXVjaHlfbWluX2JvdW5kKCBjb25zdCBQb2x5bm9taWFsJiBwb2x5ICkKKwlcZW5kY29kZQorCXByb3ZpZGVzIGEgbWluaW11bSBib3VuZCAodGhlIENhdWNoeSBvbmU6IFxmJGMocClcZiQpIGZvciB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBub24gemVybyByb290IG9mIHRoZSBnaXZlbiBwb2x5bm9taWFsIGkuZS4KKwlcZiQgXGZvcmFsbCByX2kgXG5lcSAwIFxmJCByb290IG9mIFxmJCBwKHgpID0gXHN1bV97az0wfV5kIGFfayB4XmsgXGYkLAorCVxmJCB8cl9pfCBcZ2UgYyhwKSA9IFxsZWZ0KCBcc3VtX3trPTB9XntkfSBcbGVmdCB8IFxmcmFje2Ffa317YV8wfSBccmlnaHQgfCBccmlnaHQpXnstMX0gXGYkCisKKworCisKKwlcc2VjdGlvbiBRUiBwb2x5bm9taWFsIHNvbHZlciBjbGFzcworCUNvbXB1dGVzIHRoZSBjb21wbGV4IHJvb3RzIG9mIGEgcG9seW5vbWlhbCBieSBjb21wdXRpbmcgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSBhc3NvY2lhdGVkIGNvbXBhbmlvbiBtYXRyaXggd2l0aCB0aGUgUVIgYWxnb3JpdGhtLgorCQorCVRoZSByb290cyBvZiBcZiQgcCh4KSA9IGFfMCArIGFfMSB4ICsgYV8yIHheMiArIGFfezN9IHheMyArIHheNCBcZiQgYXJlIHRoZSBlaWdlbnZhbHVlcyBvZgorCVxmJAorCVxsZWZ0IFsKKwlcYmVnaW57YXJyYXl9e2NjY2N9CisJMCAmIDAgJiAgMCAmIGFfMCBcXAorCTEgJiAwICYgIDAgJiBhXzEgXFwKKwkwICYgMSAmICAwICYgYV8yIFxcCisJMCAmIDAgJiAgMSAmIGFfMworCVxlbmR7YXJyYXl9IFxyaWdodCBdCisJXGYkCisKKwlIb3dldmVyLCB0aGUgUVIgYWxnb3JpdGhtIGlzIG5vdCBndWFyYW50ZWVkIHRvIGNvbnZlcmdlIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgZWlnZW52YWx1ZXMgd2l0aCBzYW1lIG1vZHVsdXMuCisKKwlUaGVyZWZvcmUgdGhlIGN1cnJlbnQgcG9seW5vbWlhbCBzb2x2ZXIgaXMgZ3VhcmFudGVlZCB0byBwcm92aWRlIGEgY29ycmVjdCByZXN1bHQgb25seSB3aGVuIHRoZSBjb21wbGV4IHJvb3RzIFxmJHJfMSxyXzIsLi4uLHJfZFxmJCBoYXZlIGRpc3RpbmN0IG1vZHVsaSBpLmUuCisJCisJXGYkIFxmb3JhbGwgaSxqIFxpbiBbMTtkXSx+IFx8IHJfaSBcfCBcbmVxIFx8IHJfaiBcfCBcZiQuCisKKwlXaXRoIDMyYml0IChmbG9hdCkgZmxvYXRpbmcgdHlwZXMgdGhpcyBwcm9ibGVtIHNob3dzIHVwIGZyZXF1ZW50bHkuCisgIEhvd2V2ZXIsIGFsbW9zdCBhbHdheXMsIGNvcnJlY3QgYWNjdXJhY3kgaXMgcmVhY2hlZCBldmVuIGluIHRoZXNlIGNhc2VzIGZvciA2NGJpdAorICAoZG91YmxlKSBmbG9hdGluZyB0eXBlcyBhbmQgc21hbGwgcG9seW5vbWlhbCBkZWdyZWUgKDwyMCkuCisKKwlcaW5jbHVkZSBQb2x5bm9taWFsU29sdmVyMS5jcHAKKwkKKwlJbiB0aGUgYWJvdmUgZXhhbXBsZToKKwkKKwktIyBhIHNpbXBsZSB1c2Ugb2YgdGhlIHBvbHlub21pYWwgc29sdmVyIGlzIHNob3duOworCS0jIHRoZSBhY2N1cmFjeSBwcm9ibGVtIHdpdGggdGhlIFFSIGFsZ29yaXRobSBpcyBwcmVzZW50ZWQ6IGEgcG9seW5vbWlhbCB3aXRoIGFsbW9zdCBjb25qdWdhdGUgcm9vdHMgaXMgcHJvdmlkZWQgdG8gdGhlIHNvbHZlci4KKwlUaG9zZSByb290cyBoYXZlIGFsbW9zdCBzYW1lIG1vZHVsZSB0aGVyZWZvcmUgdGhlIFFSIGFsZ29yaXRobSBmYWlsZWQgdG8gY29udmVyZ2U6IHRoZSBhY2N1cmFjeQorCW9mIHRoZSBsYXN0IHJvb3QgaXMgYmFkOworCS0jIGEgc2ltcGxlIHdheSB0byBjaXJjdW12ZW50IHRoZSBwcm9ibGVtIGlzIHNob3duOiB1c2UgZG91YmxlcyBpbnN0ZWFkIG9mIGZsb2F0cy4KKworICBPdXRwdXQ6IFx2ZXJiaW5jbHVkZSBQb2x5bm9taWFsU29sdmVyMS5vdXQKKyovCisKKyNpbmNsdWRlIDxFaWdlbi9zcmMvQ29yZS91dGlsL1JlZW5hYmxlU3R1cGlkV2FybmluZ3MuaD4KKworI2VuZGlmIC8vIEVJR0VOX1BPTFlOT01JQUxTX01PRFVMRV9ICisvKiB2aW06IHNldCBmaWxldHlwZT1jcHAgZXQgc3c9MiB0cz0yIGFpOiAqLwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vU2t5bGluZSBiL3Vuc3VwcG9ydGVkL0VpZ2VuL1NreWxpbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4MjNmMwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL1NreWxpbmUKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBFSUdFTl9TS1lMSU5FX01PRFVMRV9ICisjZGVmaW5lIEVJR0VOX1NLWUxJTkVfTU9EVUxFX0gKKworCisjaW5jbHVkZSAiRWlnZW4vQ29yZSIKKworI2luY2x1ZGUgIkVpZ2VuL3NyYy9Db3JlL3V0aWwvRGlzYWJsZVN0dXBpZFdhcm5pbmdzLmgiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworLyoqIFxpbmdyb3VwIFVuc3VwcG9ydGVkX21vZHVsZXMKKyAqICBcZGVmZ3JvdXAgU2t5bGluZV9Nb2R1bGUgU2t5bGluZSBtb2R1bGUKKyAqCisgKgorICoKKyAqCisgKi8KKworI2luY2x1ZGUgInNyYy9Ta3lsaW5lL1NreWxpbmVVdGlsLmgiCisjaW5jbHVkZSAic3JjL1NreWxpbmUvU2t5bGluZU1hdHJpeEJhc2UuaCIKKyNpbmNsdWRlICJzcmMvU2t5bGluZS9Ta3lsaW5lU3RvcmFnZS5oIgorI2luY2x1ZGUgInNyYy9Ta3lsaW5lL1NreWxpbmVNYXRyaXguaCIKKyNpbmNsdWRlICJzcmMvU2t5bGluZS9Ta3lsaW5lSW5wbGFjZUxVLmgiCisjaW5jbHVkZSAic3JjL1NreWxpbmUvU2t5bGluZVByb2R1Y3QuaCIKKworI2luY2x1ZGUgIkVpZ2VuL3NyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fU0tZTElORV9NT0RVTEVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vU3BhcnNlRXh0cmEgYi91bnN1cHBvcnRlZC9FaWdlbi9TcGFyc2VFeHRyYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBjMzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vU3BhcnNlRXh0cmEKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBFSUdFTl9TUEFSU0VfRVhUUkFfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0VYVFJBX01PRFVMRV9ICisKKyNpbmNsdWRlICIuLi8uLi9FaWdlbi9TcGFyc2UiCisKKyNpbmNsdWRlICIuLi8uLi9FaWdlbi9zcmMvQ29yZS91dGlsL0Rpc2FibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2lmZGVmIEVJR0VOX0dPT0dMRUhBU0hfU1VQUE9SVAorICAjaW5jbHVkZSA8Z29vZ2xlL2RlbnNlX2hhc2hfbWFwPgorI2VuZGlmCisKKy8qKiBcaW5ncm91cCBVbnN1cHBvcnRlZF9tb2R1bGVzCisgICogXGRlZmdyb3VwIFNwYXJzZUV4dHJhX01vZHVsZSBTcGFyc2VFeHRyYSBtb2R1bGUKKyAgKgorICAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHNvbWUgZXhwZXJpbWVudGFsIGZlYXR1cmVzIGV4dGVuZGluZyB0aGUgc3BhcnNlIG1vZHVsZS4KKyAgKgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUV4dHJhPgorICAqIFxlbmRjb2RlCisgICovCisKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL3NyYy9taXNjL1NvbHZlLmgiCisjaW5jbHVkZSAiLi4vLi4vRWlnZW4vc3JjL21pc2MvU3BhcnNlU29sdmUuaCIKKworI2luY2x1ZGUgInNyYy9TcGFyc2VFeHRyYS9EeW5hbWljU3BhcnNlTWF0cml4LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUV4dHJhL0Jsb2NrT2ZEeW5hbWljU3BhcnNlTWF0cml4LmgiCisjaW5jbHVkZSAic3JjL1NwYXJzZUV4dHJhL1JhbmRvbVNldHRlci5oIgorCisjaW5jbHVkZSAic3JjL1NwYXJzZUV4dHJhL01hcmtldElPLmgiCisKKyNpZiAhZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSAic3JjL1NwYXJzZUV4dHJhL01hdHJpeE1hcmtldEl0ZXJhdG9yLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4uLy4uL0VpZ2VuL3NyYy9Db3JlL3V0aWwvUmVlbmFibGVTdHVwaWRXYXJuaW5ncy5oIgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFX0VYVFJBX01PRFVMRV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9TcGxpbmVzIGIvdW5zdXBwb3J0ZWQvRWlnZW4vU3BsaW5lcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFjZWMxCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vU3BsaW5lcwpAQCAtMCwwICsxLDMxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMTAtMjAxMSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQTElORVNfTU9EVUxFX0gKKyNkZWZpbmUgRUlHRU5fU1BMSU5FU19NT0RVTEVfSAorCituYW1lc3BhY2UgRWlnZW4gCit7CisvKiogXGluZ3JvdXAgVW5zdXBwb3J0ZWRfbW9kdWxlcworICAqIFxkZWZncm91cCBTcGxpbmVzX01vZHVsZSBTcGxpbmUgYW5kIHNwbGluZSBmaXR0aW5nIG1vZHVsZQorICAqCisgICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzaW1wbGUgbXVsdGktZGltZW5zaW9uYWwgc3BsaW5lIGNsYXNzIHdoaWxlCisgICogb2ZmZXJpbmcgbW9zdCBiYXNpYyBmdW5jdGlvbmFsaXR5IHRvIGZpdCBhIHNwbGluZSB0byBwb2ludCBzZXRzLgorICAqCisgICogXGNvZGUKKyAgKiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BsaW5lcz4KKyAgKiBcZW5kY29kZQorICAqLworfQorCisjaW5jbHVkZSAic3JjL1NwbGluZXMvU3BsaW5lRndkLmgiCisjaW5jbHVkZSAic3JjL1NwbGluZXMvU3BsaW5lLmgiCisjaW5jbHVkZSAic3JjL1NwbGluZXMvU3BsaW5lRml0dGluZy5oIgorCisjZW5kaWYgLy8gRUlHRU5fU1BMSU5FU19NT0RVTEVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0F1dG9EaWZmL0F1dG9EaWZmSmFjb2JpYW4uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZkphY29iaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2MWUzMwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZkphY29iaWFuLmgKQEAgLTAsMCArMSw4MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0FVVE9ESUZGX0pBQ09CSUFOX0gKKyNkZWZpbmUgRUlHRU5fQVVUT0RJRkZfSkFDT0JJQU5fSAorCituYW1lc3BhY2UgRWlnZW4KK3sKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4gY2xhc3MgQXV0b0RpZmZKYWNvYmlhbiA6IHB1YmxpYyBGdW5jdG9yCit7CitwdWJsaWM6CisgIEF1dG9EaWZmSmFjb2JpYW4oKSA6IEZ1bmN0b3IoKSB7fQorICBBdXRvRGlmZkphY29iaWFuKGNvbnN0IEZ1bmN0b3ImIGYpIDogRnVuY3RvcihmKSB7fQorCisgIC8vIGZvcndhcmQgY29uc3RydWN0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQwPgorICBBdXRvRGlmZkphY29iaWFuKGNvbnN0IFQwJiBhMCkgOiBGdW5jdG9yKGEwKSB7fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgIEF1dG9EaWZmSmFjb2JpYW4oY29uc3QgVDAmIGEwLCBjb25zdCBUMSYgYTEpIDogRnVuY3RvcihhMCwgYTEpIHt9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgIEF1dG9EaWZmSmFjb2JpYW4oY29uc3QgVDAmIGEwLCBjb25zdCBUMSYgYTEsIGNvbnN0IFQyJiBhMikgOiBGdW5jdG9yKGEwLCBhMSwgYTIpIHt9CisKKyAgZW51bSB7CisgICAgSW5wdXRzQXRDb21waWxlVGltZSA9IEZ1bmN0b3I6OklucHV0c0F0Q29tcGlsZVRpbWUsCisgICAgVmFsdWVzQXRDb21waWxlVGltZSA9IEZ1bmN0b3I6OlZhbHVlc0F0Q29tcGlsZVRpbWUKKyAgfTsKKworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0b3I6OklucHV0VHlwZSBJbnB1dFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rvcjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yOjpKYWNvYmlhblR5cGUgSmFjb2JpYW5UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEphY29iaWFuVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBKYWNvYmlhblR5cGU6OkluZGV4IEluZGV4OworCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixJbnB1dHNBdENvbXBpbGVUaW1lLDE+IERlcml2YXRpdmVUeXBlOworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlcml2YXRpdmVUeXBlPiBBY3RpdmVTY2FsYXI7CisKKworICB0eXBlZGVmIE1hdHJpeDxBY3RpdmVTY2FsYXIsIElucHV0c0F0Q29tcGlsZVRpbWUsIDE+IEFjdGl2ZUlucHV0OworICB0eXBlZGVmIE1hdHJpeDxBY3RpdmVTY2FsYXIsIFZhbHVlc0F0Q29tcGlsZVRpbWUsIDE+IEFjdGl2ZVZhbHVlOworCisgIHZvaWQgb3BlcmF0b3IoKSAoY29uc3QgSW5wdXRUeXBlJiB4LCBWYWx1ZVR5cGUqIHYsIEphY29iaWFuVHlwZSogX2phYz0wKSBjb25zdAorICB7CisgICAgZWlnZW5fYXNzZXJ0KHYhPTApOworICAgIGlmICghX2phYykKKyAgICB7CisgICAgICBGdW5jdG9yOjpvcGVyYXRvcigpKHgsIHYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEphY29iaWFuVHlwZSYgamFjID0gKl9qYWM7CisKKyAgICBBY3RpdmVJbnB1dCBheCA9IHgudGVtcGxhdGUgY2FzdDxBY3RpdmVTY2FsYXI+KCk7CisgICAgQWN0aXZlVmFsdWUgYXYoamFjLnJvd3MoKSk7CisKKyAgICBpZihJbnB1dHNBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICAgICAgZm9yIChJbmRleCBqPTA7IGo8amFjLnJvd3MoKTsgaisrKQorICAgICAgICBhdltqXS5kZXJpdmF0aXZlcygpLnJlc2l6ZSh0aGlzLT5pbnB1dHMoKSk7CisKKyAgICBmb3IgKEluZGV4IGk9MDsgaTxqYWMuY29scygpOyBpKyspCisgICAgICBheFtpXS5kZXJpdmF0aXZlcygpID0gRGVyaXZhdGl2ZVR5cGU6OlVuaXQodGhpcy0+aW5wdXRzKCksaSk7CisKKyAgICBGdW5jdG9yOjpvcGVyYXRvcigpKGF4LCAmYXYpOworCisgICAgZm9yIChJbmRleCBpPTA7IGk8amFjLnJvd3MoKTsgaSsrKQorICAgIHsKKyAgICAgICgqdilbaV0gPSBhdltpXS52YWx1ZSgpOworICAgICAgamFjLnJvdyhpKSA9IGF2W2ldLmRlcml2YXRpdmVzKCk7CisgICAgfQorICB9Citwcm90ZWN0ZWQ6CisKK307CisKK30KKworI2VuZGlmIC8vIEVJR0VOX0FVVE9ESUZGX0pBQ09CSUFOX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZlNjYWxhci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0F1dG9EaWZmL0F1dG9EaWZmU2NhbGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzM2RmMwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZlNjYWxhci5oCkBAIC0wLDAgKzEsNjMyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQVVUT0RJRkZfU0NBTEFSX0gKKyNkZWZpbmUgRUlHRU5fQVVUT0RJRkZfU0NBTEFSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KK3N0cnVjdCBtYWtlX2NvaGVyZW50X2ltcGwgeworICBzdGF0aWMgdm9pZCBydW4oQSYsIEImKSB7fQorfTsKKworLy8gcmVzaXplIGEgdG8gbWF0Y2ggYiBpcyBhLnNpemUoKT09MCwgYW5kIGNvbnZlcnNlbHkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgordm9pZCBtYWtlX2NvaGVyZW50KGNvbnN0IEEmIGEsIGNvbnN0IEImYikKK3sKKyAgbWFrZV9jb2hlcmVudF9pbXBsPEEsQj46OnJ1bihhLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCBiLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX0RlclR5cGUsIGJvb2wgRW5hYmxlPiBzdHJ1Y3QgYXV0b19kaWZmX3NwZWNpYWxfb3A7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogXGNsYXNzIEF1dG9EaWZmU2NhbGFyCisgICogXGJyaWVmIEEgc2NhbGFyIHR5cGUgcmVwbGFjZW1lbnQgd2l0aCBhdXRvbWF0aWMgZGlmZmVyZW50YXRpb24gY2FwYWJpbGl0eQorICAqCisgICogXHBhcmFtIF9EZXJUeXBlIHRoZSB2ZWN0b3IgdHlwZSB1c2VkIHRvIHN0b3JlL3JlcHJlc2VudCB0aGUgZGVyaXZhdGl2ZXMuIFRoZSBiYXNlIHNjYWxhciB0eXBlCisgICogICAgICAgICAgICAgICAgIGFzIHdlbGwgYXMgdGhlIG51bWJlciBvZiBkZXJpdmF0aXZlcyB0byBjb21wdXRlIGFyZSBkZXRlcm1pbmVkIGZyb20gdGhpcyB0eXBlLgorICAqICAgICAgICAgICAgICAgICBUeXBpY2FsIGNob2ljZXMgaW5jbHVkZSwgZS5nLiwgXGMgVmVjdG9yNGYgZm9yIDQgZGVyaXZhdGl2ZXMsIG9yIFxjIFZlY3RvclhmCisgICogICAgICAgICAgICAgICAgIGlmIHRoZSBudW1iZXIgb2YgZGVyaXZhdGl2ZXMgaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZSwgYW5kL29yLCB0aGUgbnVtYmVyCisgICogICAgICAgICAgICAgICAgIG9mIGRlcml2YXRpdmVzIGlzIGxhcmdlLgorICAqICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgX0RlclR5cGUgY2FuIGFsc28gYmUgYSByZWZlcmVuY2UgKGUuZy4sIFxjIFZlY3RvclhmJikgdG8gd3JhcCBhCisgICogICAgICAgICAgICAgICAgIGV4aXN0aW5nIHZlY3RvciBpbnRvIGFuIEF1dG9EaWZmU2NhbGFyLgorICAqICAgICAgICAgICAgICAgICBGaW5hbGx5LCBfRGVyVHlwZSBjYW4gYWxzbyBiZSBhbnkgRWlnZW4gY29tcGF0aWJsZSBleHByZXNzaW9uLgorICAqCisgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2NhbGFyIHZhbHVlIHdoaWxlIHRyYWNraW5nIGl0cyByZXNwZWN0aXZlIGRlcml2YXRpdmVzIHVzaW5nIEVpZ2VuJ3MgZXhwcmVzc2lvbgorICAqIHRlbXBsYXRlIG1lY2hhbmlzbS4KKyAgKgorICAqIEl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbGlzdCBvZiBnbG9iYWwgbWF0aCBmdW5jdGlvbjoKKyAgKiAgLSBzdGQ6OmFicywgc3RkOjpzcXJ0LCBzdGQ6OnBvdywgc3RkOjpleHAsIHN0ZDo6bG9nLCBzdGQ6OnNpbiwgc3RkOjpjb3MsCisgICogIC0gaW50ZXJuYWw6OmFicywgaW50ZXJuYWw6OnNxcnQsIGludGVybmFsOjpwb3csIGludGVybmFsOjpleHAsIGludGVybmFsOjpsb2csIGludGVybmFsOjpzaW4sIGludGVybmFsOjpjb3MsCisgICogIC0gaW50ZXJuYWw6OmNvbmosIGludGVybmFsOjpyZWFsLCBpbnRlcm5hbDo6aW1hZywgaW50ZXJuYWw6OmFiczIuCisgICoKKyAgKiBBdXRvRGlmZlNjYWxhciBjYW4gYmUgdXNlZCBhcyB0aGUgc2NhbGFyIHR5cGUgb2YgYW4gRWlnZW46Ok1hdHJpeCBvYmplY3QuIEhvd2V2ZXIsCisgICogaW4gdGhhdCBjYXNlLCB0aGUgZXhwcmVzc2lvbiB0ZW1wbGF0ZSBtZWNoYW5pc20gb25seSBvY2N1cnMgYXQgdGhlIHRvcCBNYXRyaXggbGV2ZWwsCisgICogd2hpbGUgZGVyaXZhdGl2ZXMgYXJlIGNvbXB1dGVkIHJpZ2h0IGF3YXkuCisgICoKKyAgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgX0RlclR5cGU+CitjbGFzcyBBdXRvRGlmZlNjYWxhcgorICA6IHB1YmxpYyBpbnRlcm5hbDo6YXV0b19kaWZmX3NwZWNpYWxfb3AKKyAgICAgICAgICAgIDxfRGVyVHlwZSwgIWludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8X0RlclR5cGU+Ojp0eXBlPjo6U2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPF9EZXJUeXBlPjo6dHlwZT46OlNjYWxhcj46OlJlYWw+Ojp2YWx1ZT4KK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgaW50ZXJuYWw6OmF1dG9fZGlmZl9zcGVjaWFsX29wCisgICAgICAgICAgICA8X0RlclR5cGUsICFpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPF9EZXJUeXBlPjo6dHlwZT46OlNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8X0RlclR5cGU+Ojp0eXBlPjo6U2NhbGFyPjo6UmVhbD46OnZhbHVlPiBCYXNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8X0RlclR5cGU+Ojp0eXBlIERlclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlclR5cGU+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbDsKKworICAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKzsKKyAgICB1c2luZyBCYXNlOjpvcGVyYXRvcio7CisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRob3V0IGFueSBpbml0aWFsaXphdGlvbi4gKi8KKyAgICBBdXRvRGlmZlNjYWxhcigpIHt9CisKKyAgICAvKiogQ29uc3RydWN0cyBhbiBhY3RpdmUgc2NhbGFyIGZyb20gaXRzIFxhIHZhbHVlLAorICAgICAgICBhbmQgaW5pdGlhbGl6ZXMgdGhlIFxhIG5iRGVyIGRlcml2YXRpdmVzIHN1Y2ggdGhhdCBpdCBjb3JyZXNwb25kcyB0byB0aGUgXGEgZGVyTnVtYmVyIC10aCB2YXJpYWJsZSAqLworICAgIEF1dG9EaWZmU2NhbGFyKGNvbnN0IFNjYWxhciYgdmFsdWUsIGludCBuYkRlciwgaW50IGRlck51bWJlcikKKyAgICAgIDogbV92YWx1ZSh2YWx1ZSksIG1fZGVyaXZhdGl2ZXMoRGVyVHlwZTo6WmVybyhuYkRlcikpCisgICAgeworICAgICAgbV9kZXJpdmF0aXZlcy5jb2VmZlJlZihkZXJOdW1iZXIpID0gU2NhbGFyKDEpOworICAgIH0KKworICAgIC8qKiBDb252ZXJzaW9uIGZyb20gYSBzY2FsYXIgY29uc3RhbnQgdG8gYW4gYWN0aXZlIHNjYWxhci4KKyAgICAgICogVGhlIGRlcml2YXRpdmVzIGFyZSBzZXQgdG8gemVyby4gKi8KKyAgICAvKmV4cGxpY2l0Ki8gQXV0b0RpZmZTY2FsYXIoY29uc3QgUmVhbCYgdmFsdWUpCisgICAgICA6IG1fdmFsdWUodmFsdWUpCisgICAgeworICAgICAgaWYobV9kZXJpdmF0aXZlcy5zaXplKCk+MCkKKyAgICAgICAgbV9kZXJpdmF0aXZlcy5zZXRaZXJvKCk7CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdHMgYW4gYWN0aXZlIHNjYWxhciBmcm9tIGl0cyBcYSB2YWx1ZSBhbmQgZGVyaXZhdGl2ZXMgXGEgZGVyICovCisgICAgQXV0b0RpZmZTY2FsYXIoY29uc3QgU2NhbGFyJiB2YWx1ZSwgY29uc3QgRGVyVHlwZSYgZGVyKQorICAgICAgOiBtX3ZhbHVlKHZhbHVlKSwgbV9kZXJpdmF0aXZlcyhkZXIpCisgICAge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyVHlwZT4KKyAgICBBdXRvRGlmZlNjYWxhcihjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBvdGhlcikKKyAgICAgIDogbV92YWx1ZShvdGhlci52YWx1ZSgpKSwgbV9kZXJpdmF0aXZlcyhvdGhlci5kZXJpdmF0aXZlcygpKQorICAgIHt9CisKKyAgICBmcmllbmQgIHN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYSkKKyAgICB7CisgICAgICByZXR1cm4gcyA8PCBhLnZhbHVlKCk7CisgICAgfQorCisgICAgQXV0b0RpZmZTY2FsYXIoY29uc3QgQXV0b0RpZmZTY2FsYXImIG90aGVyKQorICAgICAgOiBtX3ZhbHVlKG90aGVyLnZhbHVlKCkpLCBtX2Rlcml2YXRpdmVzKG90aGVyLmRlcml2YXRpdmVzKCkpCisgICAge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyVHlwZT4KKyAgICBpbmxpbmUgQXV0b0RpZmZTY2FsYXImIG9wZXJhdG9yPShjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBvdGhlcikKKyAgICB7CisgICAgICBtX3ZhbHVlID0gb3RoZXIudmFsdWUoKTsKKyAgICAgIG1fZGVyaXZhdGl2ZXMgPSBvdGhlci5kZXJpdmF0aXZlcygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBBdXRvRGlmZlNjYWxhciYgb3BlcmF0b3I9KGNvbnN0IEF1dG9EaWZmU2NhbGFyJiBvdGhlcikKKyAgICB7CisgICAgICBtX3ZhbHVlID0gb3RoZXIudmFsdWUoKTsKKyAgICAgIG1fZGVyaXZhdGl2ZXMgPSBvdGhlci5kZXJpdmF0aXZlcygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworLy8gICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBTY2FsYXImICgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKy8vICAgICBpbmxpbmUgb3BlcmF0b3IgU2NhbGFyJiAoKSB7IHJldHVybiBtX3ZhbHVlOyB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICBpbmxpbmUgU2NhbGFyJiB2YWx1ZSgpIHsgcmV0dXJuIG1fdmFsdWU7IH0KKworICAgIGlubGluZSBjb25zdCBEZXJUeXBlJiBkZXJpdmF0aXZlcygpIGNvbnN0IHsgcmV0dXJuIG1fZGVyaXZhdGl2ZXM7IH0KKyAgICBpbmxpbmUgRGVyVHlwZSYgZGVyaXZhdGl2ZXMoKSB7IHJldHVybiBtX2Rlcml2YXRpdmVzOyB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IFNjYWxhciYgb3RoZXIpIGNvbnN0ICB7IHJldHVybiBtX3ZhbHVlIDwgIG90aGVyOyB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBTY2FsYXImIG90aGVyKSBjb25zdCAgeyByZXR1cm4gbV92YWx1ZSA8PSBvdGhlcjsgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPiAoY29uc3QgU2NhbGFyJiBvdGhlcikgY29uc3QgIHsgcmV0dXJuIG1fdmFsdWUgPiAgb3RoZXI7IH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFNjYWxhciYgb3RoZXIpIGNvbnN0ICB7IHJldHVybiBtX3ZhbHVlID49IG90aGVyOyB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTY2FsYXImIG90aGVyKSBjb25zdCAgeyByZXR1cm4gbV92YWx1ZSA9PSBvdGhlcjsgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU2NhbGFyJiBvdGhlcikgY29uc3QgIHsgcmV0dXJuIG1fdmFsdWUgIT0gb3RoZXI7IH0KKworICAgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgQXV0b0RpZmZTY2FsYXImIGIpIHsgcmV0dXJuIGEgPCAgYi52YWx1ZSgpOyB9CisgICAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgU2NhbGFyJiBhLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYikgeyByZXR1cm4gYSA8PSBiLnZhbHVlKCk7IH0KKyAgICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3I+IChjb25zdCBTY2FsYXImIGEsIGNvbnN0IEF1dG9EaWZmU2NhbGFyJiBiKSB7IHJldHVybiBhID4gIGIudmFsdWUoKTsgfQorICAgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFNjYWxhciYgYSwgY29uc3QgQXV0b0RpZmZTY2FsYXImIGIpIHsgcmV0dXJuIGEgPj0gYi52YWx1ZSgpOyB9CisgICAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU2NhbGFyJiBhLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYikgeyByZXR1cm4gYSA9PSBiLnZhbHVlKCk7IH0KKyAgICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTY2FsYXImIGEsIGNvbnN0IEF1dG9EaWZmU2NhbGFyJiBiKSB7IHJldHVybiBhICE9IGIudmFsdWUoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJUeXBlPiBpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIGIpIGNvbnN0ICB7IHJldHVybiBtX3ZhbHVlIDwgIGIudmFsdWUoKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyVHlwZT4gaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBiKSBjb25zdCAgeyByZXR1cm4gbV92YWx1ZSA8PSBiLnZhbHVlKCk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+IGlubGluZSBib29sIG9wZXJhdG9yPiAoY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgYikgY29uc3QgIHsgcmV0dXJuIG1fdmFsdWUgPiAgYi52YWx1ZSgpOyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJUeXBlPiBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIGIpIGNvbnN0ICB7IHJldHVybiBtX3ZhbHVlID49IGIudmFsdWUoKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyVHlwZT4gaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBiKSBjb25zdCAgeyByZXR1cm4gbV92YWx1ZSA9PSBiLnZhbHVlKCk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+IGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgYikgY29uc3QgIHsgcmV0dXJuIG1fdmFsdWUgIT0gYi52YWx1ZSgpOyB9CisKKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+IG9wZXJhdG9yKyhjb25zdCBTY2FsYXImIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlJj4obV92YWx1ZSArIG90aGVyLCBtX2Rlcml2YXRpdmVzKTsKKyAgICB9CisKKyAgICBmcmllbmQgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGUmPiBvcGVyYXRvcisoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYikKKyAgICB7CisgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+KGEgKyBiLnZhbHVlKCksIGIuZGVyaXZhdGl2ZXMoKSk7CisgICAgfQorCisvLyAgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGUmPiBvcGVyYXRvcisoY29uc3QgUmVhbCYgb3RoZXIpIGNvbnN0CisvLyAgICAgeworLy8gICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPERlclR5cGUmPihtX3ZhbHVlICsgb3RoZXIsIG1fZGVyaXZhdGl2ZXMpOworLy8gICAgIH0KKworLy8gICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+IG9wZXJhdG9yKyhjb25zdCBSZWFsJiBhLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYikKKy8vICAgICB7CisvLyAgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+KGEgKyBiLnZhbHVlKCksIGIuZGVyaXZhdGl2ZXMoKSk7CisvLyAgICAgfQorCisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJiBvcGVyYXRvcis9KGNvbnN0IFNjYWxhciYgb3RoZXIpCisgICAgeworICAgICAgdmFsdWUoKSArPSBvdGhlcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPixjb25zdCBEZXJUeXBlLGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyVHlwZT46OnR5cGU+ID4KKyAgICBvcGVyYXRvcisoY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgaW50ZXJuYWw6Om1ha2VfY29oZXJlbnQobV9kZXJpdmF0aXZlcywgb3RoZXIuZGVyaXZhdGl2ZXMoKSk7CisgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8Q3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXI+LGNvbnN0IERlclR5cGUsY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8T3RoZXJEZXJUeXBlPjo6dHlwZT4gPigKKyAgICAgICAgbV92YWx1ZSArIG90aGVyLnZhbHVlKCksCisgICAgICAgIG1fZGVyaXZhdGl2ZXMgKyBvdGhlci5kZXJpdmF0aXZlcygpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJgorICAgIG9wZXJhdG9yKz0oY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgb3RoZXIpCisgICAgeworICAgICAgKCp0aGlzKSA9ICgqdGhpcykgKyBvdGhlcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+IG9wZXJhdG9yLShjb25zdCBTY2FsYXImIGIpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPERlclR5cGUmPihtX3ZhbHVlIC0gYiwgbV9kZXJpdmF0aXZlcyk7CisgICAgfQorCisgICAgZnJpZW5kIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjxDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9vcHBvc2l0ZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJUeXBlPiA+CisgICAgb3BlcmF0b3ItKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgQXV0b0RpZmZTY2FsYXImIGIpCisgICAgeworICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX29wcG9zaXRlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGU+ID4KKyAgICAgICAgICAgIChhIC0gYi52YWx1ZSgpLCAtYi5kZXJpdmF0aXZlcygpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQXV0b0RpZmZTY2FsYXImIG9wZXJhdG9yLT0oY29uc3QgU2NhbGFyJiBvdGhlcikKKyAgICB7CisgICAgICB2YWx1ZSgpIC09IG90aGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyVHlwZT4KKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8Q3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyPiwgY29uc3QgRGVyVHlwZSxjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxPdGhlckRlclR5cGU+Ojp0eXBlPiA+CisgICAgb3BlcmF0b3ItKGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIGludGVybmFsOjptYWtlX2NvaGVyZW50KG1fZGVyaXZhdGl2ZXMsIG90aGVyLmRlcml2YXRpdmVzKCkpOworICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9kaWZmZXJlbmNlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGUsY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlbW92ZV9hbGw8T3RoZXJEZXJUeXBlPjo6dHlwZT4gPigKKyAgICAgICAgbV92YWx1ZSAtIG90aGVyLnZhbHVlKCksCisgICAgICAgIG1fZGVyaXZhdGl2ZXMgLSBvdGhlci5kZXJpdmF0aXZlcygpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJgorICAgIG9wZXJhdG9yLT0oY29uc3QgQXV0b0RpZmZTY2FsYXI8T3RoZXJEZXJUeXBlPiYgb3RoZXIpCisgICAgeworICAgICAgKnRoaXMgPSAqdGhpcyAtIG90aGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjxDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9vcHBvc2l0ZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJUeXBlPiA+CisgICAgb3BlcmF0b3ItKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8Q3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfb3Bwb3NpdGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyVHlwZT4gPigKKyAgICAgICAgLW1fdmFsdWUsCisgICAgICAgIC1tX2Rlcml2YXRpdmVzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8Q3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyVHlwZT4gPgorICAgIG9wZXJhdG9yKihjb25zdCBTY2FsYXImIG90aGVyKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjxDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJUeXBlPiA+KAorICAgICAgICBtX3ZhbHVlICogb3RoZXIsCisgICAgICAgIChtX2Rlcml2YXRpdmVzICogb3RoZXIpKTsKKyAgICB9CisKKyAgICBmcmllbmQgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGU+ID4KKyAgICBvcGVyYXRvciooY29uc3QgU2NhbGFyJiBvdGhlciwgY29uc3QgQXV0b0RpZmZTY2FsYXImIGEpCisgICAgeworICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGU+ID4oCisgICAgICAgIGEudmFsdWUoKSAqIG90aGVyLAorICAgICAgICBhLmRlcml2YXRpdmVzKCkgKiBvdGhlcik7CisgICAgfQorCisvLyAgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+CisvLyAgICAgb3BlcmF0b3IqKGNvbnN0IFJlYWwmIG90aGVyKSBjb25zdAorLy8gICAgIHsKKy8vICAgICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxSZWFsPiwgRGVyVHlwZT46OlR5cGUgPigKKy8vICAgICAgICAgbV92YWx1ZSAqIG90aGVyLAorLy8gICAgICAgICAobV9kZXJpdmF0aXZlcyAqIG90aGVyKSk7CisvLyAgICAgfQorLy8KKy8vICAgICBmcmllbmQgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+CisvLyAgICAgb3BlcmF0b3IqKGNvbnN0IFJlYWwmIG90aGVyLCBjb25zdCBBdXRvRGlmZlNjYWxhciYgYSkKKy8vICAgICB7CisvLyAgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8dHlwZW5hbWUgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8UmVhbD4sIERlclR5cGU+OjpUeXBlID4oCisvLyAgICAgICAgIGEudmFsdWUoKSAqIG90aGVyLAorLy8gICAgICAgICBhLmRlcml2YXRpdmVzKCkgKiBvdGhlcik7CisvLyAgICAgfQorCisgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGU+ID4KKyAgICBvcGVyYXRvci8oY29uc3QgU2NhbGFyJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8Q3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyVHlwZT4gPigKKyAgICAgICAgbV92YWx1ZSAvIG90aGVyLAorICAgICAgICAobV9kZXJpdmF0aXZlcyAqIChTY2FsYXIoMSkvb3RoZXIpKSk7CisgICAgfQorCisgICAgZnJpZW5kIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjxDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJUeXBlPiA+CisgICAgb3BlcmF0b3IvKGNvbnN0IFNjYWxhciYgb3RoZXIsIGNvbnN0IEF1dG9EaWZmU2NhbGFyJiBhKQorICAgIHsKKyAgICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjxDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJUeXBlPiA+KAorICAgICAgICBvdGhlciAvIGEudmFsdWUoKSwKKyAgICAgICAgYS5kZXJpdmF0aXZlcygpICogKFNjYWxhcigtb3RoZXIpIC8gKGEudmFsdWUoKSphLnZhbHVlKCkpKSk7CisgICAgfQorCisvLyAgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+CisvLyAgICAgb3BlcmF0b3IvKGNvbnN0IFJlYWwmIG90aGVyKSBjb25zdAorLy8gICAgIHsKKy8vICAgICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxSZWFsPiwgRGVyVHlwZT46OlR5cGUgPigKKy8vICAgICAgICAgbV92YWx1ZSAvIG90aGVyLAorLy8gICAgICAgICAobV9kZXJpdmF0aXZlcyAqIChSZWFsKDEpL290aGVyKSkpOworLy8gICAgIH0KKy8vCisvLyAgICAgZnJpZW5kIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxSZWFsPiwgRGVyVHlwZT46OlR5cGUgPgorLy8gICAgIG9wZXJhdG9yLyhjb25zdCBSZWFsJiBvdGhlciwgY29uc3QgQXV0b0RpZmZTY2FsYXImIGEpCisvLyAgICAgeworLy8gICAgICAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+KAorLy8gICAgICAgICBvdGhlciAvIGEudmFsdWUoKSwKKy8vICAgICAgICAgYS5kZXJpdmF0aXZlcygpICogKC1SZWFsKDEpL290aGVyKSk7CisvLyAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJUeXBlPgorICAgIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjxDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LAorICAgICAgICBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+LAorICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGU+LAorICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyVHlwZT46OnR5cGUgPiA+ID4gPgorICAgIG9wZXJhdG9yLyhjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBpbnRlcm5hbDo6bWFrZV9jb2hlcmVudChtX2Rlcml2YXRpdmVzLCBvdGhlci5kZXJpdmF0aXZlcygpKTsKKyAgICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjxDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LAorICAgICAgICBjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+LAorICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGU+LAorICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyVHlwZT46OnR5cGUgPiA+ID4gPigKKyAgICAgICAgbV92YWx1ZSAvIG90aGVyLnZhbHVlKCksCisgICAgICAgICAgKChtX2Rlcml2YXRpdmVzICogb3RoZXIudmFsdWUoKSkgLSAobV92YWx1ZSAqIG90aGVyLmRlcml2YXRpdmVzKCkpKQorICAgICAgICAqIChTY2FsYXIoMSkvKG90aGVyLnZhbHVlKCkqb3RoZXIudmFsdWUoKSkpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiwKKyAgICAgICAgY29uc3QgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgY29uc3QgRGVyVHlwZT4sCisgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPE90aGVyRGVyVHlwZT46OnR5cGU+ID4gPgorICAgIG9wZXJhdG9yKihjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICBpbnRlcm5hbDo6bWFrZV9jb2hlcmVudChtX2Rlcml2YXRpdmVzLCBvdGhlci5kZXJpdmF0aXZlcygpKTsKKyAgICAgIHJldHVybiBBdXRvRGlmZlNjYWxhcjxjb25zdCBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3VtX29wPFNjYWxhcj4sCisgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IERlclR5cGU+LAorICAgICAgICBjb25zdCBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxPdGhlckRlclR5cGU+Ojp0eXBlID4gPiA+KAorICAgICAgICBtX3ZhbHVlICogb3RoZXIudmFsdWUoKSwKKyAgICAgICAgKG1fZGVyaXZhdGl2ZXMgKiBvdGhlci52YWx1ZSgpKSArIChtX3ZhbHVlICogb3RoZXIuZGVyaXZhdGl2ZXMoKSkpOworICAgIH0KKworICAgIGlubGluZSBBdXRvRGlmZlNjYWxhciYgb3BlcmF0b3IqPShjb25zdCBTY2FsYXImIG90aGVyKQorICAgIHsKKyAgICAgICp0aGlzID0gKnRoaXMgKiBvdGhlcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlclR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmU2NhbGFyJiBvcGVyYXRvcio9KGNvbnN0IEF1dG9EaWZmU2NhbGFyPE90aGVyRGVyVHlwZT4mIG90aGVyKQorICAgIHsKKyAgICAgICp0aGlzID0gKnRoaXMgKiBvdGhlcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgQXV0b0RpZmZTY2FsYXImIG9wZXJhdG9yLz0oY29uc3QgU2NhbGFyJiBvdGhlcikKKyAgICB7CisgICAgICAqdGhpcyA9ICp0aGlzIC8gb3RoZXI7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJUeXBlPgorICAgIGlubGluZSBBdXRvRGlmZlNjYWxhciYgb3BlcmF0b3IvPShjb25zdCBBdXRvRGlmZlNjYWxhcjxPdGhlckRlclR5cGU+JiBvdGhlcikKKyAgICB7CisgICAgICAqdGhpcyA9ICp0aGlzIC8gb3RoZXI7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBTY2FsYXIgbV92YWx1ZTsKKyAgICBEZXJUeXBlIG1fZGVyaXZhdGl2ZXM7CisKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9EZXJUeXBlPgorc3RydWN0IGF1dG9fZGlmZl9zcGVjaWFsX29wPF9EZXJUeXBlLCB0cnVlPgorLy8gICA6IGF1dG9fZGlmZl9zY2FsYXJfb3A8X0RlclR5cGUsIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc2FtZTxTY2FsYXIsdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWw+Ojp2YWx1ZT4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPF9EZXJUeXBlPjo6dHlwZSBEZXJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxEZXJUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsOworCisvLyAgIHR5cGVkZWYgYXV0b19kaWZmX3NjYWxhcl9vcDxfRGVyVHlwZSwgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zYW1lPFNjYWxhcix0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbD46OnZhbHVlPiBCYXNlOworCisvLyAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKzsKKy8vICAgdXNpbmcgQmFzZTo6b3BlcmF0b3IrPTsKKy8vICAgdXNpbmcgQmFzZTo6b3BlcmF0b3ItOworLy8gICB1c2luZyBCYXNlOjpvcGVyYXRvci09OworLy8gICB1c2luZyBCYXNlOjpvcGVyYXRvcio7CisvLyAgIHVzaW5nIEJhc2U6Om9wZXJhdG9yKj07CisKKyAgY29uc3QgQXV0b0RpZmZTY2FsYXI8X0RlclR5cGU+JiBkZXJpdmVkKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IEF1dG9EaWZmU2NhbGFyPF9EZXJUeXBlPio+KHRoaXMpOyB9CisgIEF1dG9EaWZmU2NhbGFyPF9EZXJUeXBlPiYgZGVyaXZlZCgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxBdXRvRGlmZlNjYWxhcjxfRGVyVHlwZT4qPih0aGlzKTsgfQorCisKKyAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGUmPiBvcGVyYXRvcisoY29uc3QgUmVhbCYgb3RoZXIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+KGRlcml2ZWQoKS52YWx1ZSgpICsgb3RoZXIsIGRlcml2ZWQoKS5kZXJpdmF0aXZlcygpKTsKKyAgfQorCisgIGZyaWVuZCBpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+IG9wZXJhdG9yKyhjb25zdCBSZWFsJiBhLCBjb25zdCBBdXRvRGlmZlNjYWxhcjxfRGVyVHlwZT4mIGIpCisgIHsKKyAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8RGVyVHlwZSY+KGEgKyBiLnZhbHVlKCksIGIuZGVyaXZhdGl2ZXMoKSk7CisgIH0KKworICBpbmxpbmUgQXV0b0RpZmZTY2FsYXI8X0RlclR5cGU+JiBvcGVyYXRvcis9KGNvbnN0IFJlYWwmIG90aGVyKQorICB7CisgICAgZGVyaXZlZCgpLnZhbHVlKCkgKz0gb3RoZXI7CisgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgfQorCisKKyAgaW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPHR5cGVuYW1lIEN3aXNlVW5hcnlPcDxzY2FsYXJfbXVsdGlwbGUyX29wPFNjYWxhcixSZWFsPiwgRGVyVHlwZT46OlR5cGUgPgorICBvcGVyYXRvciooY29uc3QgUmVhbCYgb3RoZXIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8dHlwZW5hbWUgQ3dpc2VVbmFyeU9wPHNjYWxhcl9tdWx0aXBsZTJfb3A8U2NhbGFyLFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+KAorICAgICAgZGVyaXZlZCgpLnZhbHVlKCkgKiBvdGhlciwKKyAgICAgIGRlcml2ZWQoKS5kZXJpdmF0aXZlcygpICogb3RoZXIpOworICB9CisKKyAgZnJpZW5kIGlubGluZSBjb25zdCBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBDd2lzZVVuYXJ5T3A8c2NhbGFyX211bHRpcGxlMl9vcDxTY2FsYXIsUmVhbD4sIERlclR5cGU+OjpUeXBlID4KKyAgb3BlcmF0b3IqKGNvbnN0IFJlYWwmIG90aGVyLCBjb25zdCBBdXRvRGlmZlNjYWxhcjxfRGVyVHlwZT4mIGEpCisgIHsKKyAgICByZXR1cm4gQXV0b0RpZmZTY2FsYXI8dHlwZW5hbWUgQ3dpc2VVbmFyeU9wPHNjYWxhcl9tdWx0aXBsZTJfb3A8U2NhbGFyLFJlYWw+LCBEZXJUeXBlPjo6VHlwZSA+KAorICAgICAgYS52YWx1ZSgpICogb3RoZXIsCisgICAgICBhLmRlcml2YXRpdmVzKCkgKiBvdGhlcik7CisgIH0KKworICBpbmxpbmUgQXV0b0RpZmZTY2FsYXI8X0RlclR5cGU+JiBvcGVyYXRvcio9KGNvbnN0IFNjYWxhciYgb3RoZXIpCisgIHsKKyAgICAqdGhpcyA9ICp0aGlzICogb3RoZXI7CisgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0RlclR5cGU+CitzdHJ1Y3QgYXV0b19kaWZmX3NwZWNpYWxfb3A8X0RlclR5cGUsIGZhbHNlPgoreworICB2b2lkIG9wZXJhdG9yKigpIGNvbnN0OworICB2b2lkIG9wZXJhdG9yLSgpIGNvbnN0OworICB2b2lkIG9wZXJhdG9yKygpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQV9TY2FsYXIsIGludCBBX1Jvd3MsIGludCBBX0NvbHMsIGludCBBX09wdGlvbnMsIGludCBBX01heFJvd3MsIGludCBBX01heENvbHMsIHR5cGVuYW1lIEI+CitzdHJ1Y3QgbWFrZV9jb2hlcmVudF9pbXBsPE1hdHJpeDxBX1NjYWxhciwgQV9Sb3dzLCBBX0NvbHMsIEFfT3B0aW9ucywgQV9NYXhSb3dzLCBBX01heENvbHM+LCBCPiB7CisgIHR5cGVkZWYgTWF0cml4PEFfU2NhbGFyLCBBX1Jvd3MsIEFfQ29scywgQV9PcHRpb25zLCBBX01heFJvd3MsIEFfTWF4Q29scz4gQTsKKyAgc3RhdGljIHZvaWQgcnVuKEEmIGEsIEImIGIpIHsKKyAgICBpZigoQV9Sb3dzPT1EeW5hbWljIHx8IEFfQ29scz09RHluYW1pYykgJiYgKGEuc2l6ZSgpPT0wKSkKKyAgICB7CisgICAgICBhLnJlc2l6ZShiLnNpemUoKSk7CisgICAgICBhLnNldFplcm8oKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEJfU2NhbGFyLCBpbnQgQl9Sb3dzLCBpbnQgQl9Db2xzLCBpbnQgQl9PcHRpb25zLCBpbnQgQl9NYXhSb3dzLCBpbnQgQl9NYXhDb2xzPgorc3RydWN0IG1ha2VfY29oZXJlbnRfaW1wbDxBLCBNYXRyaXg8Ql9TY2FsYXIsIEJfUm93cywgQl9Db2xzLCBCX09wdGlvbnMsIEJfTWF4Um93cywgQl9NYXhDb2xzPiA+IHsKKyAgdHlwZWRlZiBNYXRyaXg8Ql9TY2FsYXIsIEJfUm93cywgQl9Db2xzLCBCX09wdGlvbnMsIEJfTWF4Um93cywgQl9NYXhDb2xzPiBCOworICBzdGF0aWMgdm9pZCBydW4oQSYgYSwgQiYgYikgeworICAgIGlmKChCX1Jvd3M9PUR5bmFtaWMgfHwgQl9Db2xzPT1EeW5hbWljKSAmJiAoYi5zaXplKCk9PTApKQorICAgIHsKKyAgICAgIGIucmVzaXplKGEuc2l6ZSgpKTsKKyAgICAgIGIuc2V0WmVybygpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQV9TY2FsYXIsIGludCBBX1Jvd3MsIGludCBBX0NvbHMsIGludCBBX09wdGlvbnMsIGludCBBX01heFJvd3MsIGludCBBX01heENvbHMsCisgICAgICAgICB0eXBlbmFtZSBCX1NjYWxhciwgaW50IEJfUm93cywgaW50IEJfQ29scywgaW50IEJfT3B0aW9ucywgaW50IEJfTWF4Um93cywgaW50IEJfTWF4Q29scz4KK3N0cnVjdCBtYWtlX2NvaGVyZW50X2ltcGw8TWF0cml4PEFfU2NhbGFyLCBBX1Jvd3MsIEFfQ29scywgQV9PcHRpb25zLCBBX01heFJvd3MsIEFfTWF4Q29scz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeDxCX1NjYWxhciwgQl9Sb3dzLCBCX0NvbHMsIEJfT3B0aW9ucywgQl9NYXhSb3dzLCBCX01heENvbHM+ID4geworICB0eXBlZGVmIE1hdHJpeDxBX1NjYWxhciwgQV9Sb3dzLCBBX0NvbHMsIEFfT3B0aW9ucywgQV9NYXhSb3dzLCBBX01heENvbHM+IEE7CisgIHR5cGVkZWYgTWF0cml4PEJfU2NhbGFyLCBCX1Jvd3MsIEJfQ29scywgQl9PcHRpb25zLCBCX01heFJvd3MsIEJfTWF4Q29scz4gQjsKKyAgc3RhdGljIHZvaWQgcnVuKEEmIGEsIEImIGIpIHsKKyAgICBpZigoQV9Sb3dzPT1EeW5hbWljIHx8IEFfQ29scz09RHluYW1pYykgJiYgKGEuc2l6ZSgpPT0wKSkKKyAgICB7CisgICAgICBhLnJlc2l6ZShiLnNpemUoKSk7CisgICAgICBhLnNldFplcm8oKTsKKyAgICB9CisgICAgZWxzZSBpZigoQl9Sb3dzPT1EeW5hbWljIHx8IEJfQ29scz09RHluYW1pYykgJiYgKGIuc2l6ZSgpPT0wKSkKKyAgICB7CisgICAgICBiLnJlc2l6ZShhLnNpemUoKSk7CisgICAgICBiLnNldFplcm8oKTsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFfU2NhbGFyLCBpbnQgQV9Sb3dzLCBpbnQgQV9Db2xzLCBpbnQgQV9PcHRpb25zLCBpbnQgQV9NYXhSb3dzLCBpbnQgQV9NYXhDb2xzPiBzdHJ1Y3Qgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPE1hdHJpeDxBX1NjYWxhciwgQV9Sb3dzLCBBX0NvbHMsIEFfT3B0aW9ucywgQV9NYXhSb3dzLCBBX01heENvbHM+LEFfU2NhbGFyPgoreworICAgdHlwZWRlZiBNYXRyaXg8QV9TY2FsYXIsIEFfUm93cywgQV9Db2xzLCBBX09wdGlvbnMsIEFfTWF4Um93cywgQV9NYXhDb2xzPiBSZXR1cm5UeXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQV9TY2FsYXIsIGludCBBX1Jvd3MsIGludCBBX0NvbHMsIGludCBBX09wdGlvbnMsIGludCBBX01heFJvd3MsIGludCBBX01heENvbHM+IHN0cnVjdCBzY2FsYXJfcHJvZHVjdF90cmFpdHM8QV9TY2FsYXIsIE1hdHJpeDxBX1NjYWxhciwgQV9Sb3dzLCBBX0NvbHMsIEFfT3B0aW9ucywgQV9NYXhSb3dzLCBBX01heENvbHM+ID4KK3sKKyAgIHR5cGVkZWYgTWF0cml4PEFfU2NhbGFyLCBBX1Jvd3MsIEFfQ29scywgQV9PcHRpb25zLCBBX01heFJvd3MsIEFfTWF4Q29scz4gUmV0dXJuVHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlclR5cGU+CitzdHJ1Y3Qgc2NhbGFyX3Byb2R1Y3RfdHJhaXRzPEF1dG9EaWZmU2NhbGFyPERlclR5cGU+LHR5cGVuYW1lIERlclR5cGU6OlNjYWxhcj4KK3sKKyB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlclR5cGU+IFJldHVyblR5cGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2RlZmluZSBFSUdFTl9BVVRPRElGRl9ERUNMQVJFX0dMT0JBTF9VTkFSWShGVU5DLENPREUpIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyVHlwZT4gXAorICBpbmxpbmUgY29uc3QgRWlnZW46OkF1dG9EaWZmU2NhbGFyPEVpZ2VuOjpDd2lzZVVuYXJ5T3A8RWlnZW46OmludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8dHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZW1vdmVfYWxsPERlclR5cGU+Ojp0eXBlPjo6U2NhbGFyPiwgY29uc3QgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZW1vdmVfYWxsPERlclR5cGU+Ojp0eXBlPiA+IFwKKyAgRlVOQyhjb25zdCBFaWdlbjo6QXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4mIHgpIHsgXAorICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsgXAorICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8dHlwZW5hbWUgRWlnZW46OmludGVybmFsOjpyZW1vdmVfYWxsPERlclR5cGU+Ojp0eXBlPjo6U2NhbGFyIFNjYWxhcjsgXAorICAgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8Q3dpc2VVbmFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIGNvbnN0IHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6cmVtb3ZlX2FsbDxEZXJUeXBlPjo6dHlwZT4gPiBSZXR1cm5UeXBlOyBcCisgICAgQ09ERTsgXAorICB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlclR5cGU+CitpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4mIGNvbmooY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4mIHgpICB7IHJldHVybiB4OyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlPgoraW5saW5lIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiByZWFsKGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiB4KSAgeyByZXR1cm4geDsgfQordGVtcGxhdGU8dHlwZW5hbWUgRGVyVHlwZT4KK2lubGluZSB0eXBlbmFtZSBEZXJUeXBlOjpTY2FsYXIgaW1hZyhjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiYpICAgIHsgcmV0dXJuIDAuOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlLCB0eXBlbmFtZSBUPgoraW5saW5lIEF1dG9EaWZmU2NhbGFyPERlclR5cGU+IChtaW4pKGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiB4LCBjb25zdCBUJiB5KSAgICB7IHJldHVybiAoeCA8PSB5ID8geCA6IHkpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlLCB0eXBlbmFtZSBUPgoraW5saW5lIEF1dG9EaWZmU2NhbGFyPERlclR5cGU+IChtYXgpKGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiB4LCBjb25zdCBUJiB5KSAgICB7IHJldHVybiAoeCA+PSB5ID8geCA6IHkpOyB9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlLCB0eXBlbmFtZSBUPgoraW5saW5lIEF1dG9EaWZmU2NhbGFyPERlclR5cGU+IChtaW4pKGNvbnN0IFQmIHgsIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiB5KSAgICB7IHJldHVybiAoeCA8IHkgPyB4IDogeSk7IH0KK3RlbXBsYXRlPHR5cGVuYW1lIERlclR5cGUsIHR5cGVuYW1lIFQ+CitpbmxpbmUgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4gKG1heCkoY29uc3QgVCYgeCwgY29uc3QgQXV0b0RpZmZTY2FsYXI8RGVyVHlwZT4mIHkpICAgIHsgcmV0dXJuICh4ID4geSA/IHggOiB5KTsgfQorCisjZGVmaW5lIHNpZ24oeCkgeCA+PSAwID8gMSA6IC0xIC8vIHJlcXVpcmVkIGZvciBhYnMgZnVuY3Rpb24gYmVsb3cKKyAgCitFSUdFTl9BVVRPRElGRl9ERUNMQVJFX0dMT0JBTF9VTkFSWShhYnMsCisgIHVzaW5nIHN0ZDo6YWJzOworICByZXR1cm4gUmV0dXJuVHlwZShhYnMoeC52YWx1ZSgpKSwgeC5kZXJpdmF0aXZlcygpICogKHNpZ24oeC52YWx1ZSgpKSkpOykKKworRUlHRU5fQVVUT0RJRkZfREVDTEFSRV9HTE9CQUxfVU5BUlkoYWJzMiwKKyAgdXNpbmcgaW50ZXJuYWw6OmFiczI7CisgIHJldHVybiBSZXR1cm5UeXBlKGFiczIoeC52YWx1ZSgpKSwgeC5kZXJpdmF0aXZlcygpICogKFNjYWxhcigyKSp4LnZhbHVlKCkpKTspCisKK0VJR0VOX0FVVE9ESUZGX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKHNxcnQsCisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgU2NhbGFyIHNxcnR4ID0gc3FydCh4LnZhbHVlKCkpOworICByZXR1cm4gUmV0dXJuVHlwZShzcXJ0eCx4LmRlcml2YXRpdmVzKCkgKiAoU2NhbGFyKDAuNSkgLyBzcXJ0eCkpOykKKworRUlHRU5fQVVUT0RJRkZfREVDTEFSRV9HTE9CQUxfVU5BUlkoY29zLAorICB1c2luZyBzdGQ6OmNvczsKKyAgdXNpbmcgc3RkOjpzaW47CisgIHJldHVybiBSZXR1cm5UeXBlKGNvcyh4LnZhbHVlKCkpLCB4LmRlcml2YXRpdmVzKCkgKiAoLXNpbih4LnZhbHVlKCkpKSk7KQorCitFSUdFTl9BVVRPRElGRl9ERUNMQVJFX0dMT0JBTF9VTkFSWShzaW4sCisgIHVzaW5nIHN0ZDo6c2luOworICB1c2luZyBzdGQ6OmNvczsKKyAgcmV0dXJuIFJldHVyblR5cGUoc2luKHgudmFsdWUoKSkseC5kZXJpdmF0aXZlcygpICogY29zKHgudmFsdWUoKSkpOykKKworRUlHRU5fQVVUT0RJRkZfREVDTEFSRV9HTE9CQUxfVU5BUlkoZXhwLAorICB1c2luZyBzdGQ6OmV4cDsKKyAgU2NhbGFyIGV4cHggPSBleHAoeC52YWx1ZSgpKTsKKyAgcmV0dXJuIFJldHVyblR5cGUoZXhweCx4LmRlcml2YXRpdmVzKCkgKiBleHB4KTspCisKK0VJR0VOX0FVVE9ESUZGX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGxvZywKKyAgdXNpbmcgc3RkOjpsb2c7CisgIHJldHVybiBSZXR1cm5UeXBlKGxvZyh4LnZhbHVlKCkpLHguZGVyaXZhdGl2ZXMoKSAqIChTY2FsYXIoMSkveC52YWx1ZSgpKSk7KQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlPgoraW5saW5lIGNvbnN0IEVpZ2VuOjpBdXRvRGlmZlNjYWxhcjxFaWdlbjo6Q3dpc2VVbmFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlclR5cGU+OjpTY2FsYXI+LCBjb25zdCBEZXJUeXBlPiA+Citwb3coY29uc3QgRWlnZW46OkF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiB4LCB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJUeXBlPjo6U2NhbGFyIHkpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKyAgcmV0dXJuIEF1dG9EaWZmU2NhbGFyPEN3aXNlVW5hcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBjb25zdCBEZXJUeXBlPiA+KAorICAgIHN0ZDo6cG93KHgudmFsdWUoKSx5KSwKKyAgICB4LmRlcml2YXRpdmVzKCkgKiAoeSAqIHN0ZDo6cG93KHgudmFsdWUoKSx5LTEpKSk7Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyVHlwZUEsdHlwZW5hbWUgRGVyVHlwZUI+CitpbmxpbmUgY29uc3QgQXV0b0RpZmZTY2FsYXI8TWF0cml4PHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyVHlwZUE+OjpTY2FsYXIsRHluYW1pYywxPiA+CithdGFuMihjb25zdCBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlQT4mIGEsIGNvbnN0IEF1dG9EaWZmU2NhbGFyPERlclR5cGVCPiYgYikKK3sKKyAgdXNpbmcgc3RkOjphdGFuMjsKKyAgdXNpbmcgc3RkOjptYXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJUeXBlQT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4gUGxhaW5BRFM7CisgIFBsYWluQURTIHJldDsKKyAgcmV0LnZhbHVlKCkgPSBhdGFuMihhLnZhbHVlKCksIGIudmFsdWUoKSk7CisgIAorICBTY2FsYXIgdG1wMiA9IGEudmFsdWUoKSAqIGEudmFsdWUoKTsKKyAgU2NhbGFyIHRtcDMgPSBiLnZhbHVlKCkgKiBiLnZhbHVlKCk7CisgIFNjYWxhciB0bXA0ID0gdG1wMy8odG1wMit0bXAzKTsKKyAgCisgIGlmICh0bXA0IT0wKQorICAgIHJldC5kZXJpdmF0aXZlcygpID0gKGEuZGVyaXZhdGl2ZXMoKSAqIGIudmFsdWUoKSAtIGEudmFsdWUoKSAqIGIuZGVyaXZhdGl2ZXMoKSkgKiAodG1wMit0bXAzKTsKKworICByZXR1cm4gcmV0OworfQorCitFSUdFTl9BVVRPRElGRl9ERUNMQVJFX0dMT0JBTF9VTkFSWSh0YW4sCisgIHVzaW5nIHN0ZDo6dGFuOworICB1c2luZyBzdGQ6OmNvczsKKyAgcmV0dXJuIFJldHVyblR5cGUodGFuKHgudmFsdWUoKSkseC5kZXJpdmF0aXZlcygpICogKFNjYWxhcigxKS9pbnRlcm5hbDo6YWJzMihjb3MoeC52YWx1ZSgpKSkpKTspCisKK0VJR0VOX0FVVE9ESUZGX0RFQ0xBUkVfR0xPQkFMX1VOQVJZKGFzaW4sCisgIHVzaW5nIHN0ZDo6c3FydDsKKyAgdXNpbmcgc3RkOjphc2luOworICByZXR1cm4gUmV0dXJuVHlwZShhc2luKHgudmFsdWUoKSkseC5kZXJpdmF0aXZlcygpICogKFNjYWxhcigxKS9zcXJ0KDEtaW50ZXJuYWw6OmFiczIoeC52YWx1ZSgpKSkpKTspCisgIAorRUlHRU5fQVVUT0RJRkZfREVDTEFSRV9HTE9CQUxfVU5BUlkoYWNvcywKKyAgdXNpbmcgc3RkOjpzcXJ0OworICB1c2luZyBzdGQ6OmFjb3M7CisgIHJldHVybiBSZXR1cm5UeXBlKGFjb3MoeC52YWx1ZSgpKSx4LmRlcml2YXRpdmVzKCkgKiAoU2NhbGFyKC0xKS9zcXJ0KDEtaW50ZXJuYWw6OmFiczIoeC52YWx1ZSgpKSkpKTspCisKKyN1bmRlZiBFSUdFTl9BVVRPRElGRl9ERUNMQVJFX0dMT0JBTF9VTkFSWQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJUeXBlPiBzdHJ1Y3QgTnVtVHJhaXRzPEF1dG9EaWZmU2NhbGFyPERlclR5cGU+ID4KKyAgOiBOdW1UcmFpdHM8IHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBEZXJUeXBlOjpTY2FsYXI+OjpSZWFsID4KK3sKKyAgdHlwZWRlZiBBdXRvRGlmZlNjYWxhcjxNYXRyaXg8dHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIERlclR5cGU6OlNjYWxhcj46OlJlYWwsRGVyVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsRGVyVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+ID4gUmVhbDsKKyAgdHlwZWRlZiBBdXRvRGlmZlNjYWxhcjxEZXJUeXBlPiBOb25JbnRlZ2VyOworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlclR5cGU+JiBOZXN0ZWQ7CisgIGVudW17CisgICAgUmVxdWlyZUluaXRpYWxpemF0aW9uID0gMQorICB9OworfTsKKworfQorCisjZW5kaWYgLy8gRUlHRU5fQVVUT0RJRkZfU0NBTEFSX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZlZlY3Rvci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0F1dG9EaWZmL0F1dG9EaWZmVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0MGFkZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9BdXRvRGlmZi9BdXRvRGlmZlZlY3Rvci5oCkBAIC0wLDAgKzEsMjIwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fQVVUT0RJRkZfVkVDVE9SX0gKKyNkZWZpbmUgRUlHRU5fQVVUT0RJRkZfVkVDVE9SX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsKKworLyogXGNsYXNzIEF1dG9EaWZmU2NhbGFyCisgICogXGJyaWVmIEEgc2NhbGFyIHR5cGUgcmVwbGFjZW1lbnQgd2l0aCBhdXRvbWF0aWMgZGlmZmVyZW50YXRpb24gY2FwYWJpbGl0eQorICAqCisgICogXHBhcmFtIERlclR5cGUgdGhlIHZlY3RvciB0eXBlIHVzZWQgdG8gc3RvcmUvcmVwcmVzZW50IHRoZSBkZXJpdmF0aXZlcyAoZS5nLiBWZWN0b3IzZikKKyAgKgorICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNjYWxhciB2YWx1ZSB3aGlsZSB0cmFja2luZyBpdHMgcmVzcGVjdGl2ZSBkZXJpdmF0aXZlcy4KKyAgKgorICAqIEl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbGlzdCBvZiBnbG9iYWwgbWF0aCBmdW5jdGlvbjoKKyAgKiAgLSBzdGQ6OmFicywgc3RkOjpzcXJ0LCBzdGQ6OnBvdywgc3RkOjpleHAsIHN0ZDo6bG9nLCBzdGQ6OnNpbiwgc3RkOjpjb3MsCisgICogIC0gaW50ZXJuYWw6OmFicywgaW50ZXJuYWw6OnNxcnQsIGludGVybmFsOjpwb3csIGludGVybmFsOjpleHAsIGludGVybmFsOjpsb2csIGludGVybmFsOjpzaW4sIGludGVybmFsOjpjb3MsCisgICogIC0gaW50ZXJuYWw6OmNvbmosIGludGVybmFsOjpyZWFsLCBpbnRlcm5hbDo6aW1hZywgaW50ZXJuYWw6OmFiczIuCisgICoKKyAgKiBBdXRvRGlmZlNjYWxhciBjYW4gYmUgdXNlZCBhcyB0aGUgc2NhbGFyIHR5cGUgb2YgYW4gRWlnZW46Ok1hdHJpeCBvYmplY3QuIEhvd2V2ZXIsCisgICogaW4gdGhhdCBjYXNlLCB0aGUgZXhwcmVzc2lvbiB0ZW1wbGF0ZSBtZWNoYW5pc20gb25seSBvY2N1cnMgYXQgdGhlIHRvcCBNYXRyaXggbGV2ZWwsCisgICogd2hpbGUgZGVyaXZhdGl2ZXMgYXJlIGNvbXB1dGVkIHJpZ2h0IGF3YXkuCisgICoKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUgSmFjb2JpYW5UeXBlPgorY2xhc3MgQXV0b0RpZmZWZWN0b3IKK3sKKyAgcHVibGljOgorICAgIC8vdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFZhbHVlVHlwZT46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPFZhbHVlVHlwZT46OlNjYWxhciBCYXNlU2NhbGFyOworICAgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8TWF0cml4PEJhc2VTY2FsYXIsSmFjb2JpYW5UeXBlOjpSb3dzQXRDb21waWxlVGltZSwxPiA+IEFjdGl2ZVNjYWxhcjsKKyAgICB0eXBlZGVmIEFjdGl2ZVNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBBdXRvRGlmZlNjYWxhcjx0eXBlbmFtZSBKYWNvYmlhblR5cGU6OkNvbFhwcj4gQ29lZmZUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgSmFjb2JpYW5UeXBlOjpJbmRleCBJbmRleDsKKworICAgIGlubGluZSBBdXRvRGlmZlZlY3RvcigpIHt9CisKKyAgICBpbmxpbmUgQXV0b0RpZmZWZWN0b3IoY29uc3QgVmFsdWVUeXBlJiB2YWx1ZXMpCisgICAgICA6IG1fdmFsdWVzKHZhbHVlcykKKyAgICB7CisgICAgICBtX2phY29iaWFuLnNldFplcm8oKTsKKyAgICB9CisKKworICAgIENvZWZmVHlwZSBvcGVyYXRvcltdIChJbmRleCBpKSB7IHJldHVybiBDb2VmZlR5cGUobV92YWx1ZXNbaV0sIG1famFjb2JpYW4uY29sKGkpKTsgfQorICAgIGNvbnN0IENvZWZmVHlwZSBvcGVyYXRvcltdIChJbmRleCBpKSBjb25zdCB7IHJldHVybiBDb2VmZlR5cGUobV92YWx1ZXNbaV0sIG1famFjb2JpYW4uY29sKGkpKTsgfQorCisgICAgQ29lZmZUeXBlIG9wZXJhdG9yKCkgKEluZGV4IGkpIHsgcmV0dXJuIENvZWZmVHlwZShtX3ZhbHVlc1tpXSwgbV9qYWNvYmlhbi5jb2woaSkpOyB9CisgICAgY29uc3QgQ29lZmZUeXBlIG9wZXJhdG9yKCkgKEluZGV4IGkpIGNvbnN0IHsgcmV0dXJuIENvZWZmVHlwZShtX3ZhbHVlc1tpXSwgbV9qYWNvYmlhbi5jb2woaSkpOyB9CisKKyAgICBDb2VmZlR5cGUgY29lZmZSZWYoSW5kZXggaSkgeyByZXR1cm4gQ29lZmZUeXBlKG1fdmFsdWVzW2ldLCBtX2phY29iaWFuLmNvbChpKSk7IH0KKyAgICBjb25zdCBDb2VmZlR5cGUgY29lZmZSZWYoSW5kZXggaSkgY29uc3QgeyByZXR1cm4gQ29lZmZUeXBlKG1fdmFsdWVzW2ldLCBtX2phY29iaWFuLmNvbChpKSk7IH0KKworICAgIEluZGV4IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5zaXplKCk7IH0KKworICAgIC8vIEZJWE1FIGhlcmUgd2UgY291bGQgcmV0dXJuIGFuIGV4cHJlc3Npb24gb2YgdGhlIHN1bQorICAgIFNjYWxhciBzdW0oKSBjb25zdCB7IC8qc3RkOjpjZXJyIDw8ICJzdW0gXG5cbiI7Ki8gLypzdGQ6OmNlcnIgPDwgbV9qYWNvYmlhbi5yb3d3aXNlKCkuc3VtKCkgPDwgIlxuXG4iOyovIHJldHVybiBTY2FsYXIobV92YWx1ZXMuc3VtKCksIG1famFjb2JpYW4ucm93d2lzZSgpLnN1bSgpKTsgfQorCisKKyAgICBpbmxpbmUgQXV0b0RpZmZWZWN0b3IoY29uc3QgVmFsdWVUeXBlJiB2YWx1ZXMsIGNvbnN0IEphY29iaWFuVHlwZSYgamFjKQorICAgICAgOiBtX3ZhbHVlcyh2YWx1ZXMpLCBtX2phY29iaWFuKGphYykKKyAgICB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJWYWx1ZVR5cGUsIHR5cGVuYW1lIE90aGVySmFjb2JpYW5UeXBlPgorICAgIGlubGluZSBBdXRvRGlmZlZlY3Rvcihjb25zdCBBdXRvRGlmZlZlY3RvcjxPdGhlclZhbHVlVHlwZSwgT3RoZXJKYWNvYmlhblR5cGU+JiBvdGhlcikKKyAgICAgIDogbV92YWx1ZXMob3RoZXIudmFsdWVzKCkpLCBtX2phY29iaWFuKG90aGVyLmphY29iaWFuKCkpCisgICAge30KKworICAgIGlubGluZSBBdXRvRGlmZlZlY3Rvcihjb25zdCBBdXRvRGlmZlZlY3RvciYgb3RoZXIpCisgICAgICA6IG1fdmFsdWVzKG90aGVyLnZhbHVlcygpKSwgbV9qYWNvYmlhbihvdGhlci5qYWNvYmlhbigpKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclZhbHVlVHlwZSwgdHlwZW5hbWUgT3RoZXJKYWNvYmlhblR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmVmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgQXV0b0RpZmZWZWN0b3I8T3RoZXJWYWx1ZVR5cGUsIE90aGVySmFjb2JpYW5UeXBlPiYgb3RoZXIpCisgICAgeworICAgICAgbV92YWx1ZXMgPSBvdGhlci52YWx1ZXMoKTsKKyAgICAgIG1famFjb2JpYW4gPSBvdGhlci5qYWNvYmlhbigpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBBdXRvRGlmZlZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IEF1dG9EaWZmVmVjdG9yJiBvdGhlcikKKyAgICB7CisgICAgICBtX3ZhbHVlcyA9IG90aGVyLnZhbHVlcygpOworICAgICAgbV9qYWNvYmlhbiA9IG90aGVyLmphY29iaWFuKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFZhbHVlVHlwZSYgdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KKyAgICBpbmxpbmUgVmFsdWVUeXBlJiB2YWx1ZXMoKSB7IHJldHVybiBtX3ZhbHVlczsgfQorCisgICAgaW5saW5lIGNvbnN0IEphY29iaWFuVHlwZSYgamFjb2JpYW4oKSBjb25zdCB7IHJldHVybiBtX2phY29iaWFuOyB9CisgICAgaW5saW5lIEphY29iaWFuVHlwZSYgamFjb2JpYW4oKSB7IHJldHVybiBtX2phY29iaWFuOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclZhbHVlVHlwZSx0eXBlbmFtZSBPdGhlckphY29iaWFuVHlwZT4KKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZWZWN0b3I8CisgICAgICB0eXBlbmFtZSBNYWtlQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxCYXNlU2NhbGFyPixWYWx1ZVR5cGUsT3RoZXJWYWx1ZVR5cGU+OjpUeXBlLAorICAgICAgdHlwZW5hbWUgTWFrZUN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8QmFzZVNjYWxhcj4sSmFjb2JpYW5UeXBlLE90aGVySmFjb2JpYW5UeXBlPjo6VHlwZSA+CisgICAgb3BlcmF0b3IrKGNvbnN0IEF1dG9EaWZmVmVjdG9yPE90aGVyVmFsdWVUeXBlLE90aGVySmFjb2JpYW5UeXBlPiYgb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIEF1dG9EaWZmVmVjdG9yPAorICAgICAgdHlwZW5hbWUgTWFrZUN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8QmFzZVNjYWxhcj4sVmFsdWVUeXBlLE90aGVyVmFsdWVUeXBlPjo6VHlwZSwKKyAgICAgIHR5cGVuYW1lIE1ha2VDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfc3VtX29wPEJhc2VTY2FsYXI+LEphY29iaWFuVHlwZSxPdGhlckphY29iaWFuVHlwZT46OlR5cGUgPigKKyAgICAgICAgbV92YWx1ZXMgKyBvdGhlci52YWx1ZXMoKSwKKyAgICAgICAgbV9qYWNvYmlhbiArIG90aGVyLmphY29iaWFuKCkpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyVmFsdWVUeXBlLCB0eXBlbmFtZSBPdGhlckphY29iaWFuVHlwZT4KKyAgICBpbmxpbmUgQXV0b0RpZmZWZWN0b3ImCisgICAgb3BlcmF0b3IrPShjb25zdCBBdXRvRGlmZlZlY3RvcjxPdGhlclZhbHVlVHlwZSxPdGhlckphY29iaWFuVHlwZT4mIG90aGVyKQorICAgIHsKKyAgICAgIG1fdmFsdWVzICs9IG90aGVyLnZhbHVlcygpOworICAgICAgbV9qYWNvYmlhbiArPSBvdGhlci5qYWNvYmlhbigpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyVmFsdWVUeXBlLHR5cGVuYW1lIE90aGVySmFjb2JpYW5UeXBlPgorICAgIGlubGluZSBjb25zdCBBdXRvRGlmZlZlY3RvcjwKKyAgICAgIHR5cGVuYW1lIE1ha2VDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+LFZhbHVlVHlwZSxPdGhlclZhbHVlVHlwZT46OlR5cGUsCisgICAgICB0eXBlbmFtZSBNYWtlQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2RpZmZlcmVuY2Vfb3A8U2NhbGFyPixKYWNvYmlhblR5cGUsT3RoZXJKYWNvYmlhblR5cGU+OjpUeXBlID4KKyAgICBvcGVyYXRvci0oY29uc3QgQXV0b0RpZmZWZWN0b3I8T3RoZXJWYWx1ZVR5cGUsT3RoZXJKYWNvYmlhblR5cGU+JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQXV0b0RpZmZWZWN0b3I8CisgICAgICAgIHR5cGVuYW1lIE1ha2VDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+LFZhbHVlVHlwZSxPdGhlclZhbHVlVHlwZT46OlR5cGUsCisgICAgICAgIHR5cGVuYW1lIE1ha2VDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfZGlmZmVyZW5jZV9vcDxTY2FsYXI+LEphY29iaWFuVHlwZSxPdGhlckphY29iaWFuVHlwZT46OlR5cGUgPigKKyAgICAgICAgICBtX3ZhbHVlcyAtIG90aGVyLnZhbHVlcygpLAorICAgICAgICAgIG1famFjb2JpYW4gLSBvdGhlci5qYWNvYmlhbigpKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclZhbHVlVHlwZSwgdHlwZW5hbWUgT3RoZXJKYWNvYmlhblR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmVmVjdG9yJgorICAgIG9wZXJhdG9yLT0oY29uc3QgQXV0b0RpZmZWZWN0b3I8T3RoZXJWYWx1ZVR5cGUsT3RoZXJKYWNvYmlhblR5cGU+JiBvdGhlcikKKyAgICB7CisgICAgICBtX3ZhbHVlcyAtPSBvdGhlci52YWx1ZXMoKTsKKyAgICAgIG1famFjb2JpYW4gLT0gb3RoZXIuamFjb2JpYW4oKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZWZWN0b3I8CisgICAgICB0eXBlbmFtZSBNYWtlQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfb3Bwb3NpdGVfb3A8U2NhbGFyPiwgVmFsdWVUeXBlPjo6VHlwZSwKKyAgICAgIHR5cGVuYW1lIE1ha2VDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9vcHBvc2l0ZV9vcDxTY2FsYXI+LCBKYWNvYmlhblR5cGU+OjpUeXBlID4KKyAgICBvcGVyYXRvci0oKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBBdXRvRGlmZlZlY3RvcjwKKyAgICAgICAgdHlwZW5hbWUgTWFrZUN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX29wcG9zaXRlX29wPFNjYWxhcj4sIFZhbHVlVHlwZT46OlR5cGUsCisgICAgICAgIHR5cGVuYW1lIE1ha2VDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9vcHBvc2l0ZV9vcDxTY2FsYXI+LCBKYWNvYmlhblR5cGU+OjpUeXBlID4oCisgICAgICAgICAgLW1fdmFsdWVzLAorICAgICAgICAgIC1tX2phY29iaWFuKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZWZWN0b3I8CisgICAgICB0eXBlbmFtZSBNYWtlQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgVmFsdWVUeXBlPjo6VHlwZSwKKyAgICAgIHR5cGVuYW1lIE1ha2VDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBKYWNvYmlhblR5cGU+OjpUeXBlPgorICAgIG9wZXJhdG9yKihjb25zdCBCYXNlU2NhbGFyJiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gQXV0b0RpZmZWZWN0b3I8CisgICAgICAgIHR5cGVuYW1lIE1ha2VDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBWYWx1ZVR5cGU+OjpUeXBlLAorICAgICAgICB0eXBlbmFtZSBNYWtlQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgSmFjb2JpYW5UeXBlPjo6VHlwZSA+KAorICAgICAgICAgIG1fdmFsdWVzICogb3RoZXIsCisgICAgICAgICAgbV9qYWNvYmlhbiAqIG90aGVyKTsKKyAgICB9CisKKyAgICBmcmllbmQgaW5saW5lIGNvbnN0IEF1dG9EaWZmVmVjdG9yPAorICAgICAgdHlwZW5hbWUgTWFrZUN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIFZhbHVlVHlwZT46OlR5cGUsCisgICAgICB0eXBlbmFtZSBNYWtlQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgSmFjb2JpYW5UeXBlPjo6VHlwZSA+CisgICAgb3BlcmF0b3IqKGNvbnN0IFNjYWxhciYgb3RoZXIsIGNvbnN0IEF1dG9EaWZmVmVjdG9yJiB2KQorICAgIHsKKyAgICAgIHJldHVybiBBdXRvRGlmZlZlY3RvcjwKKyAgICAgICAgdHlwZW5hbWUgTWFrZUN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIFZhbHVlVHlwZT46OlR5cGUsCisgICAgICAgIHR5cGVuYW1lIE1ha2VDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBKYWNvYmlhblR5cGU+OjpUeXBlID4oCisgICAgICAgICAgdi52YWx1ZXMoKSAqIG90aGVyLAorICAgICAgICAgIHYuamFjb2JpYW4oKSAqIG90aGVyKTsKKyAgICB9CisKKy8vICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlclZhbHVlVHlwZSx0eXBlbmFtZSBPdGhlckphY29iaWFuVHlwZT4KKy8vICAgICBpbmxpbmUgY29uc3QgQXV0b0RpZmZWZWN0b3I8CisvLyAgICAgICBDd2lzZUJpbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgVmFsdWVUeXBlLCBPdGhlclZhbHVlVHlwZT4KKy8vICAgICAgIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiwKKy8vICAgICAgICAgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgSmFjb2JpYW5UeXBlPiwKKy8vICAgICAgICAgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfbXVsdGlwbGVfb3A8U2NhbGFyPiwgT3RoZXJKYWNvYmlhblR5cGU+ID4gPgorLy8gICAgIG9wZXJhdG9yKihjb25zdCBBdXRvRGlmZlZlY3RvcjxPdGhlclZhbHVlVHlwZSxPdGhlckphY29iaWFuVHlwZT4mIG90aGVyKSBjb25zdAorLy8gICAgIHsKKy8vICAgICAgIHJldHVybiBBdXRvRGlmZlZlY3RvcjwKKy8vICAgICAgICAgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIFZhbHVlVHlwZSwgT3RoZXJWYWx1ZVR5cGU+CisvLyAgICAgICAgIEN3aXNlQmluYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyPiwKKy8vICAgICAgICAgICBDd2lzZVVuYXJ5T3A8aW50ZXJuYWw6OnNjYWxhcl9tdWx0aXBsZV9vcDxTY2FsYXI+LCBKYWNvYmlhblR5cGU+LAorLy8gICAgICAgICAgIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX211bHRpcGxlX29wPFNjYWxhcj4sIE90aGVySmFjb2JpYW5UeXBlPiA+ID4oCisvLyAgICAgICAgICAgICBtX3ZhbHVlcy5jd2lzZSgpICogb3RoZXIudmFsdWVzKCksCisvLyAgICAgICAgICAgICAobV9qYWNvYmlhbiAqIG90aGVyLnZhbHVlcygpKSArIChtX3ZhbHVlcyAqIG90aGVyLmphY29iaWFuKCkpKTsKKy8vICAgICB9CisKKyAgICBpbmxpbmUgQXV0b0RpZmZWZWN0b3ImIG9wZXJhdG9yKj0oY29uc3QgU2NhbGFyJiBvdGhlcikKKyAgICB7CisgICAgICBtX3ZhbHVlcyAqPSBvdGhlcjsKKyAgICAgIG1famFjb2JpYW4gKj0gb3RoZXI7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJWYWx1ZVR5cGUsdHlwZW5hbWUgT3RoZXJKYWNvYmlhblR5cGU+CisgICAgaW5saW5lIEF1dG9EaWZmVmVjdG9yJiBvcGVyYXRvcio9KGNvbnN0IEF1dG9EaWZmVmVjdG9yPE90aGVyVmFsdWVUeXBlLE90aGVySmFjb2JpYW5UeXBlPiYgb3RoZXIpCisgICAgeworICAgICAgKnRoaXMgPSAqdGhpcyAqIG90aGVyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgVmFsdWVUeXBlIG1fdmFsdWVzOworICAgIEphY29iaWFuVHlwZSBtX2phY29iaWFuOworCit9OworCit9CisKKyNlbmRpZiAvLyBFSUdFTl9BVVRPRElGRl9WRUNUT1JfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0F1dG9EaWZmL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0F1dG9EaWZmL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOTFmZDkKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvQXV0b0RpZmYvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fQXV0b0RpZmZfU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUworICAke0VpZ2VuX0F1dG9EaWZmX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0F1dG9EaWZmIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvQlZIL0JWQWxnb3JpdGhtcy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0JWSC9CVkFsZ29yaXRobXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI1MWRlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0JWSC9CVkFsZ29yaXRobXMuaApAQCAtMCwwICsxLDI5MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSWx5YSBCYXJhbiA8aWJhcmFuQG1pdC5lZHU+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0JWQUxHT1JJVEhNU19ICisjZGVmaW5lIEVJR0VOX0JWQUxHT1JJVEhNU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCit0ZW1wbGF0ZTx0eXBlbmFtZSBCVkgsIHR5cGVuYW1lIEludGVyc2VjdG9yPgorYm9vbCBpbnRlcnNlY3RfaGVscGVyKGNvbnN0IEJWSCAmdHJlZSwgSW50ZXJzZWN0b3IgJmludGVyc2VjdG9yLCB0eXBlbmFtZSBCVkg6OkluZGV4IHJvb3QpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkg6OlZvbHVtZUl0ZXJhdG9yIFZvbEl0ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIOjpPYmplY3RJdGVyYXRvciBPYmpJdGVyOworCisgIFZvbEl0ZXIgdkJlZ2luID0gVm9sSXRlcigpLCB2RW5kID0gVm9sSXRlcigpOworICBPYmpJdGVyIG9CZWdpbiA9IE9iakl0ZXIoKSwgb0VuZCA9IE9iakl0ZXIoKTsKKworICBzdGQ6OnZlY3RvcjxJbmRleD4gdG9kbygxLCByb290KTsKKworICB3aGlsZSghdG9kby5lbXB0eSgpKSB7CisgICAgdHJlZS5nZXRDaGlsZHJlbih0b2RvLmJhY2soKSwgdkJlZ2luLCB2RW5kLCBvQmVnaW4sIG9FbmQpOworICAgIHRvZG8ucG9wX2JhY2soKTsKKworICAgIGZvcig7IHZCZWdpbiAhPSB2RW5kOyArK3ZCZWdpbikgLy9nbyB0aHJvdWdoIGNoaWxkIHZvbHVtZXMKKyAgICAgIGlmKGludGVyc2VjdG9yLmludGVyc2VjdFZvbHVtZSh0cmVlLmdldFZvbHVtZSgqdkJlZ2luKSkpCisgICAgICAgIHRvZG8ucHVzaF9iYWNrKCp2QmVnaW4pOworCisgICAgZm9yKDsgb0JlZ2luICE9IG9FbmQ7ICsrb0JlZ2luKSAvL2dvIHRocm91Z2ggY2hpbGQgb2JqZWN0cworICAgICAgaWYoaW50ZXJzZWN0b3IuaW50ZXJzZWN0T2JqZWN0KCpvQmVnaW4pKQorICAgICAgICByZXR1cm4gdHJ1ZTsgLy9pbnRlcnNlY3RvciBzYWlkIHRvIHN0b3AgcXVlcnkKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYgLy9ub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKwordGVtcGxhdGU8dHlwZW5hbWUgVm9sdW1lMSwgdHlwZW5hbWUgT2JqZWN0MSwgdHlwZW5hbWUgT2JqZWN0MiwgdHlwZW5hbWUgSW50ZXJzZWN0b3I+CitzdHJ1Y3QgaW50ZXJzZWN0b3JfaGVscGVyMQoreworICBpbnRlcnNlY3Rvcl9oZWxwZXIxKGNvbnN0IE9iamVjdDIgJmluU3RvcmVkLCBJbnRlcnNlY3RvciAmaW4pIDogc3RvcmVkKGluU3RvcmVkKSwgaW50ZXJzZWN0b3IoaW4pIHt9CisgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lKGNvbnN0IFZvbHVtZTEgJnZvbCkgeyByZXR1cm4gaW50ZXJzZWN0b3IuaW50ZXJzZWN0Vm9sdW1lT2JqZWN0KHZvbCwgc3RvcmVkKTsgfQorICBib29sIGludGVyc2VjdE9iamVjdChjb25zdCBPYmplY3QxICZvYmopIHsgcmV0dXJuIGludGVyc2VjdG9yLmludGVyc2VjdE9iamVjdE9iamVjdChvYmosIHN0b3JlZCk7IH0KKyAgT2JqZWN0MiBzdG9yZWQ7CisgIEludGVyc2VjdG9yICZpbnRlcnNlY3RvcjsKK3ByaXZhdGU6CisgIGludGVyc2VjdG9yX2hlbHBlcjEmIG9wZXJhdG9yPShjb25zdCBpbnRlcnNlY3Rvcl9oZWxwZXIxJik7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWb2x1bWUyLCB0eXBlbmFtZSBPYmplY3QyLCB0eXBlbmFtZSBPYmplY3QxLCB0eXBlbmFtZSBJbnRlcnNlY3Rvcj4KK3N0cnVjdCBpbnRlcnNlY3Rvcl9oZWxwZXIyCit7CisgIGludGVyc2VjdG9yX2hlbHBlcjIoY29uc3QgT2JqZWN0MSAmaW5TdG9yZWQsIEludGVyc2VjdG9yICZpbikgOiBzdG9yZWQoaW5TdG9yZWQpLCBpbnRlcnNlY3Rvcihpbikge30KKyAgYm9vbCBpbnRlcnNlY3RWb2x1bWUoY29uc3QgVm9sdW1lMiAmdm9sKSB7IHJldHVybiBpbnRlcnNlY3Rvci5pbnRlcnNlY3RPYmplY3RWb2x1bWUoc3RvcmVkLCB2b2wpOyB9CisgIGJvb2wgaW50ZXJzZWN0T2JqZWN0KGNvbnN0IE9iamVjdDIgJm9iaikgeyByZXR1cm4gaW50ZXJzZWN0b3IuaW50ZXJzZWN0T2JqZWN0T2JqZWN0KHN0b3JlZCwgb2JqKTsgfQorICBPYmplY3QxIHN0b3JlZDsKKyAgSW50ZXJzZWN0b3IgJmludGVyc2VjdG9yOworcHJpdmF0ZToKKyAgaW50ZXJzZWN0b3JfaGVscGVyMiYgb3BlcmF0b3I9KGNvbnN0IGludGVyc2VjdG9yX2hlbHBlcjImKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvKiogIEdpdmVuIGEgQlZILCBydW5zIHRoZSBxdWVyeSBlbmNhcHN1bGF0ZWQgYnkgXGEgaW50ZXJzZWN0b3IuCisgICogIFRoZSBJbnRlcnNlY3RvciB0eXBlIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1lbWJlcnM6IFxjb2RlCisgICAgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lKGNvbnN0IEJWSDo6Vm9sdW1lICZ2b2x1bWUpIC8vcmV0dXJucyB0cnVlIGlmIHZvbHVtZSBpbnRlcnNlY3RzIHRoZSBxdWVyeQorICAgICBib29sIGludGVyc2VjdE9iamVjdChjb25zdCBCVkg6Ok9iamVjdCAmb2JqZWN0KSAvL3JldHVybnMgdHJ1ZSBpZiB0aGUgc2VhcmNoIHNob3VsZCB0ZXJtaW5hdGUgaW1tZWRpYXRlbHkKKyAgXGVuZGNvZGUKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEJWSCwgdHlwZW5hbWUgSW50ZXJzZWN0b3I+Cit2b2lkIEJWSW50ZXJzZWN0KGNvbnN0IEJWSCAmdHJlZSwgSW50ZXJzZWN0b3IgJmludGVyc2VjdG9yKQoreworICBpbnRlcm5hbDo6aW50ZXJzZWN0X2hlbHBlcih0cmVlLCBpbnRlcnNlY3RvciwgdHJlZS5nZXRSb290SW5kZXgoKSk7Cit9CisKKy8qKiAgR2l2ZW4gdHdvIEJWSCdzLCBydW5zIHRoZSBxdWVyeSBvbiB0aGVpciBDYXJ0ZXNpYW4gcHJvZHVjdCBlbmNhcHN1bGF0ZWQgYnkgXGEgaW50ZXJzZWN0b3IuCisgICogIFRoZSBJbnRlcnNlY3RvciB0eXBlIG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nIG1lbWJlcnM6IFxjb2RlCisgICAgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lVm9sdW1lKGNvbnN0IEJWSDE6OlZvbHVtZSAmdjEsIGNvbnN0IEJWSDI6OlZvbHVtZSAmdjIpIC8vcmV0dXJucyB0cnVlIGlmIHByb2R1Y3Qgb2Ygdm9sdW1lcyBpbnRlcnNlY3RzIHRoZSBxdWVyeQorICAgICBib29sIGludGVyc2VjdFZvbHVtZU9iamVjdChjb25zdCBCVkgxOjpWb2x1bWUgJnYxLCBjb25zdCBCVkgyOjpPYmplY3QgJm8yKSAvL3JldHVybnMgdHJ1ZSBpZiB0aGUgdm9sdW1lLW9iamVjdCBwcm9kdWN0IGludGVyc2VjdHMgdGhlIHF1ZXJ5CisgICAgIGJvb2wgaW50ZXJzZWN0T2JqZWN0Vm9sdW1lKGNvbnN0IEJWSDE6Ok9iamVjdCAmbzEsIGNvbnN0IEJWSDI6OlZvbHVtZSAmdjIpIC8vcmV0dXJucyB0cnVlIGlmIHRoZSB2b2x1bWUtb2JqZWN0IHByb2R1Y3QgaW50ZXJzZWN0cyB0aGUgcXVlcnkKKyAgICAgYm9vbCBpbnRlcnNlY3RPYmplY3RPYmplY3QoY29uc3QgQlZIMTo6T2JqZWN0ICZvMSwgY29uc3QgQlZIMjo6T2JqZWN0ICZvMikgLy9yZXR1cm5zIHRydWUgaWYgdGhlIHNlYXJjaCBzaG91bGQgdGVybWluYXRlIGltbWVkaWF0ZWx5CisgIFxlbmRjb2RlCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBCVkgxLCB0eXBlbmFtZSBCVkgyLCB0eXBlbmFtZSBJbnRlcnNlY3Rvcj4KK3ZvaWQgQlZJbnRlcnNlY3QoY29uc3QgQlZIMSAmdHJlZTEsIGNvbnN0IEJWSDIgJnRyZWUyLCBJbnRlcnNlY3RvciAmaW50ZXJzZWN0b3IpIC8vVE9ETzogdGFuZGVtIGRlc2NlbnQgd2hlbiBpdCBtYWtlcyBzZW5zZQoreworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDE6OkluZGV4IEluZGV4MTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkgyOjpJbmRleCBJbmRleDI7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmludGVyc2VjdG9yX2hlbHBlcjE8dHlwZW5hbWUgQlZIMTo6Vm9sdW1lLCB0eXBlbmFtZSBCVkgxOjpPYmplY3QsIHR5cGVuYW1lIEJWSDI6Ok9iamVjdCwgSW50ZXJzZWN0b3I+IEhlbHBlcjE7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmludGVyc2VjdG9yX2hlbHBlcjI8dHlwZW5hbWUgQlZIMjo6Vm9sdW1lLCB0eXBlbmFtZSBCVkgyOjpPYmplY3QsIHR5cGVuYW1lIEJWSDE6Ok9iamVjdCwgSW50ZXJzZWN0b3I+IEhlbHBlcjI7CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIMTo6Vm9sdW1lSXRlcmF0b3IgVm9sSXRlcjE7CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIMTo6T2JqZWN0SXRlcmF0b3IgT2JqSXRlcjE7CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIMjo6Vm9sdW1lSXRlcmF0b3IgVm9sSXRlcjI7CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIMjo6T2JqZWN0SXRlcmF0b3IgT2JqSXRlcjI7CisKKyAgVm9sSXRlcjEgdkJlZ2luMSA9IFZvbEl0ZXIxKCksIHZFbmQxID0gVm9sSXRlcjEoKTsKKyAgT2JqSXRlcjEgb0JlZ2luMSA9IE9iakl0ZXIxKCksIG9FbmQxID0gT2JqSXRlcjEoKTsKKyAgVm9sSXRlcjIgdkJlZ2luMiA9IFZvbEl0ZXIyKCksIHZFbmQyID0gVm9sSXRlcjIoKSwgdkN1cjIgPSBWb2xJdGVyMigpOworICBPYmpJdGVyMiBvQmVnaW4yID0gT2JqSXRlcjIoKSwgb0VuZDIgPSBPYmpJdGVyMigpLCBvQ3VyMiA9IE9iakl0ZXIyKCk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEluZGV4MSwgSW5kZXgyPiA+IHRvZG8oMSwgc3RkOjptYWtlX3BhaXIodHJlZTEuZ2V0Um9vdEluZGV4KCksIHRyZWUyLmdldFJvb3RJbmRleCgpKSk7CisKKyAgd2hpbGUoIXRvZG8uZW1wdHkoKSkgeworICAgIHRyZWUxLmdldENoaWxkcmVuKHRvZG8uYmFjaygpLmZpcnN0LCB2QmVnaW4xLCB2RW5kMSwgb0JlZ2luMSwgb0VuZDEpOworICAgIHRyZWUyLmdldENoaWxkcmVuKHRvZG8uYmFjaygpLnNlY29uZCwgdkJlZ2luMiwgdkVuZDIsIG9CZWdpbjIsIG9FbmQyKTsKKyAgICB0b2RvLnBvcF9iYWNrKCk7CisKKyAgICBmb3IoOyB2QmVnaW4xICE9IHZFbmQxOyArK3ZCZWdpbjEpIHsgLy9nbyB0aHJvdWdoIGNoaWxkIHZvbHVtZXMgb2YgZmlyc3QgdHJlZQorICAgICAgY29uc3QgdHlwZW5hbWUgQlZIMTo6Vm9sdW1lICZ2b2wxID0gdHJlZTEuZ2V0Vm9sdW1lKCp2QmVnaW4xKTsKKyAgICAgIGZvcih2Q3VyMiA9IHZCZWdpbjI7IHZDdXIyICE9IHZFbmQyOyArK3ZDdXIyKSB7IC8vZ28gdGhyb3VnaCBjaGlsZCB2b2x1bWVzIG9mIHNlY29uZCB0cmVlCisgICAgICAgIGlmKGludGVyc2VjdG9yLmludGVyc2VjdFZvbHVtZVZvbHVtZSh2b2wxLCB0cmVlMi5nZXRWb2x1bWUoKnZDdXIyKSkpCisgICAgICAgICAgdG9kby5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoKnZCZWdpbjEsICp2Q3VyMikpOworICAgICAgfQorCisgICAgICBmb3Iob0N1cjIgPSBvQmVnaW4yOyBvQ3VyMiAhPSBvRW5kMjsgKytvQ3VyMikgey8vZ28gdGhyb3VnaCBjaGlsZCBvYmplY3RzIG9mIHNlY29uZCB0cmVlCisgICAgICAgIEhlbHBlcjEgaGVscGVyKCpvQ3VyMiwgaW50ZXJzZWN0b3IpOworICAgICAgICBpZihpbnRlcm5hbDo6aW50ZXJzZWN0X2hlbHBlcih0cmVlMSwgaGVscGVyLCAqdkJlZ2luMSkpCisgICAgICAgICAgcmV0dXJuOyAvL2ludGVyc2VjdG9yIHNhaWQgdG8gc3RvcCBxdWVyeQorICAgICAgfQorICAgIH0KKworICAgIGZvcig7IG9CZWdpbjEgIT0gb0VuZDE7ICsrb0JlZ2luMSkgeyAvL2dvIHRocm91Z2ggY2hpbGQgb2JqZWN0cyBvZiBmaXJzdCB0cmVlCisgICAgICBmb3IodkN1cjIgPSB2QmVnaW4yOyB2Q3VyMiAhPSB2RW5kMjsgKyt2Q3VyMikgeyAvL2dvIHRocm91Z2ggY2hpbGQgdm9sdW1lcyBvZiBzZWNvbmQgdHJlZQorICAgICAgICBIZWxwZXIyIGhlbHBlcigqb0JlZ2luMSwgaW50ZXJzZWN0b3IpOworICAgICAgICBpZihpbnRlcm5hbDo6aW50ZXJzZWN0X2hlbHBlcih0cmVlMiwgaGVscGVyLCAqdkN1cjIpKQorICAgICAgICAgIHJldHVybjsgLy9pbnRlcnNlY3RvciBzYWlkIHRvIHN0b3AgcXVlcnkKKyAgICAgIH0KKworICAgICAgZm9yKG9DdXIyID0gb0JlZ2luMjsgb0N1cjIgIT0gb0VuZDI7ICsrb0N1cjIpIHsvL2dvIHRocm91Z2ggY2hpbGQgb2JqZWN0cyBvZiBzZWNvbmQgdHJlZQorICAgICAgICBpZihpbnRlcnNlY3Rvci5pbnRlcnNlY3RPYmplY3RPYmplY3QoKm9CZWdpbjEsICpvQ3VyMikpCisgICAgICAgICAgcmV0dXJuOyAvL2ludGVyc2VjdG9yIHNhaWQgdG8gc3RvcCBxdWVyeQorICAgICAgfQorICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisjaWZuZGVmIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCit0ZW1wbGF0ZTx0eXBlbmFtZSBCVkgsIHR5cGVuYW1lIE1pbmltaXplcj4KK3R5cGVuYW1lIE1pbmltaXplcjo6U2NhbGFyIG1pbmltaXplX2hlbHBlcihjb25zdCBCVkggJnRyZWUsIE1pbmltaXplciAmbWluaW1pemVyLCB0eXBlbmFtZSBCVkg6OkluZGV4IHJvb3QsIHR5cGVuYW1lIE1pbmltaXplcjo6U2NhbGFyIG1pbmltdW0pCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWluaW1pemVyOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgc3RkOjpwYWlyPFNjYWxhciwgSW5kZXg+IFF1ZXVlRWxlbWVudDsgLy9maXJzdCBlbGVtZW50IGlzIHByaW9yaXR5CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIOjpWb2x1bWVJdGVyYXRvciBWb2xJdGVyOworICB0eXBlZGVmIHR5cGVuYW1lIEJWSDo6T2JqZWN0SXRlcmF0b3IgT2JqSXRlcjsKKworICBWb2xJdGVyIHZCZWdpbiA9IFZvbEl0ZXIoKSwgdkVuZCA9IFZvbEl0ZXIoKTsKKyAgT2JqSXRlciBvQmVnaW4gPSBPYmpJdGVyKCksIG9FbmQgPSBPYmpJdGVyKCk7CisgIHN0ZDo6cHJpb3JpdHlfcXVldWU8UXVldWVFbGVtZW50LCBzdGQ6OnZlY3RvcjxRdWV1ZUVsZW1lbnQ+LCBzdGQ6OmdyZWF0ZXI8UXVldWVFbGVtZW50PiA+IHRvZG87IC8vc21hbGxlc3QgaXMgYXQgdGhlIHRvcAorCisgIHRvZG8ucHVzaChzdGQ6Om1ha2VfcGFpcihTY2FsYXIoKSwgcm9vdCkpOworCisgIHdoaWxlKCF0b2RvLmVtcHR5KCkpIHsKKyAgICB0cmVlLmdldENoaWxkcmVuKHRvZG8udG9wKCkuc2Vjb25kLCB2QmVnaW4sIHZFbmQsIG9CZWdpbiwgb0VuZCk7CisgICAgdG9kby5wb3AoKTsKKworICAgIGZvcig7IG9CZWdpbiAhPSBvRW5kOyArK29CZWdpbikgLy9nbyB0aHJvdWdoIGNoaWxkIG9iamVjdHMKKyAgICAgIG1pbmltdW0gPSAoc3RkOjptaW4pKG1pbmltdW0sIG1pbmltaXplci5taW5pbXVtT25PYmplY3QoKm9CZWdpbikpOworCisgICAgZm9yKDsgdkJlZ2luICE9IHZFbmQ7ICsrdkJlZ2luKSB7IC8vZ28gdGhyb3VnaCBjaGlsZCB2b2x1bWVzCisgICAgICBTY2FsYXIgdmFsID0gbWluaW1pemVyLm1pbmltdW1PblZvbHVtZSh0cmVlLmdldFZvbHVtZSgqdkJlZ2luKSk7CisgICAgICBpZih2YWwgPCBtaW5pbXVtKQorICAgICAgICB0b2RvLnB1c2goc3RkOjptYWtlX3BhaXIodmFsLCAqdkJlZ2luKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG1pbmltdW07Cit9CisjZW5kaWYgLy9ub3QgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWb2x1bWUxLCB0eXBlbmFtZSBPYmplY3QxLCB0eXBlbmFtZSBPYmplY3QyLCB0eXBlbmFtZSBNaW5pbWl6ZXI+CitzdHJ1Y3QgbWluaW1pemVyX2hlbHBlcjEKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNaW5pbWl6ZXI6OlNjYWxhciBTY2FsYXI7CisgIG1pbmltaXplcl9oZWxwZXIxKGNvbnN0IE9iamVjdDIgJmluU3RvcmVkLCBNaW5pbWl6ZXIgJm0pIDogc3RvcmVkKGluU3RvcmVkKSwgbWluaW1pemVyKG0pIHt9CisgIFNjYWxhciBtaW5pbXVtT25Wb2x1bWUoY29uc3QgVm9sdW1lMSAmdm9sKSB7IHJldHVybiBtaW5pbWl6ZXIubWluaW11bU9uVm9sdW1lT2JqZWN0KHZvbCwgc3RvcmVkKTsgfQorICBTY2FsYXIgbWluaW11bU9uT2JqZWN0KGNvbnN0IE9iamVjdDEgJm9iaikgeyByZXR1cm4gbWluaW1pemVyLm1pbmltdW1Pbk9iamVjdE9iamVjdChvYmosIHN0b3JlZCk7IH0KKyAgT2JqZWN0MiBzdG9yZWQ7CisgIE1pbmltaXplciAmbWluaW1pemVyOworcHJpdmF0ZToKKyAgbWluaW1pemVyX2hlbHBlcjEmIG9wZXJhdG9yPShjb25zdCBtaW5pbWl6ZXJfaGVscGVyMSYpIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWb2x1bWUyLCB0eXBlbmFtZSBPYmplY3QyLCB0eXBlbmFtZSBPYmplY3QxLCB0eXBlbmFtZSBNaW5pbWl6ZXI+CitzdHJ1Y3QgbWluaW1pemVyX2hlbHBlcjIKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNaW5pbWl6ZXI6OlNjYWxhciBTY2FsYXI7CisgIG1pbmltaXplcl9oZWxwZXIyKGNvbnN0IE9iamVjdDEgJmluU3RvcmVkLCBNaW5pbWl6ZXIgJm0pIDogc3RvcmVkKGluU3RvcmVkKSwgbWluaW1pemVyKG0pIHt9CisgIFNjYWxhciBtaW5pbXVtT25Wb2x1bWUoY29uc3QgVm9sdW1lMiAmdm9sKSB7IHJldHVybiBtaW5pbWl6ZXIubWluaW11bU9uT2JqZWN0Vm9sdW1lKHN0b3JlZCwgdm9sKTsgfQorICBTY2FsYXIgbWluaW11bU9uT2JqZWN0KGNvbnN0IE9iamVjdDIgJm9iaikgeyByZXR1cm4gbWluaW1pemVyLm1pbmltdW1Pbk9iamVjdE9iamVjdChzdG9yZWQsIG9iaik7IH0KKyAgT2JqZWN0MSBzdG9yZWQ7CisgIE1pbmltaXplciAmbWluaW1pemVyOworcHJpdmF0ZToKKyAgbWluaW1pemVyX2hlbHBlcjImIG9wZXJhdG9yPShjb25zdCBtaW5pbWl6ZXJfaGVscGVyMiYpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKy8qKiAgR2l2ZW4gYSBCVkgsIHJ1bnMgdGhlIHF1ZXJ5IGVuY2Fwc3VsYXRlZCBieSBcYSBtaW5pbWl6ZXIuCisgICogIFxyZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLgorICAqICBUaGUgTWluaW1pemVyIHR5cGUgbXVzdCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWVtYmVyczogXGNvZGUKKyAgICAgdHlwZWRlZiBTY2FsYXIgLy90aGUgbnVtZXJpYyB0eXBlIG9mIHdoYXQgaXMgYmVpbmcgbWluaW1pemVkLS1ub3QgbmVjZXNzYXJpbHkgdGhlIFNjYWxhciB0eXBlIG9mIHRoZSBCVkggKGlmIGl0IGhhcyBvbmUpCisgICAgIFNjYWxhciBtaW5pbXVtT25Wb2x1bWUoY29uc3QgQlZIOjpWb2x1bWUgJnZvbHVtZSkKKyAgICAgU2NhbGFyIG1pbmltdW1Pbk9iamVjdChjb25zdCBCVkg6Ok9iamVjdCAmb2JqZWN0KQorICBcZW5kY29kZQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgQlZILCB0eXBlbmFtZSBNaW5pbWl6ZXI+Cit0eXBlbmFtZSBNaW5pbWl6ZXI6OlNjYWxhciBCVk1pbmltaXplKGNvbnN0IEJWSCAmdHJlZSwgTWluaW1pemVyICZtaW5pbWl6ZXIpCit7CisgIHJldHVybiBpbnRlcm5hbDo6bWluaW1pemVfaGVscGVyKHRyZWUsIG1pbmltaXplciwgdHJlZS5nZXRSb290SW5kZXgoKSwgKHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZW5hbWUgTWluaW1pemVyOjpTY2FsYXI+OjptYXgpKCkpOworfQorCisvKiogIEdpdmVuIHR3byBCVkgncywgcnVucyB0aGUgcXVlcnkgb24gdGhlaXIgY2FydGVzaWFuIHByb2R1Y3QgZW5jYXBzdWxhdGVkIGJ5IFxhIG1pbmltaXplci4KKyAgKiAgXHJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuCisgICogIFRoZSBNaW5pbWl6ZXIgdHlwZSBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOiBcY29kZQorICAgICB0eXBlZGVmIFNjYWxhciAvL3RoZSBudW1lcmljIHR5cGUgb2Ygd2hhdCBpcyBiZWluZyBtaW5pbWl6ZWQtLW5vdCBuZWNlc3NhcmlseSB0aGUgU2NhbGFyIHR5cGUgb2YgdGhlIEJWSCAoaWYgaXQgaGFzIG9uZSkKKyAgICAgU2NhbGFyIG1pbmltdW1PblZvbHVtZVZvbHVtZShjb25zdCBCVkgxOjpWb2x1bWUgJnYxLCBjb25zdCBCVkgyOjpWb2x1bWUgJnYyKQorICAgICBTY2FsYXIgbWluaW11bU9uVm9sdW1lT2JqZWN0KGNvbnN0IEJWSDE6OlZvbHVtZSAmdjEsIGNvbnN0IEJWSDI6Ok9iamVjdCAmbzIpCisgICAgIFNjYWxhciBtaW5pbXVtT25PYmplY3RWb2x1bWUoY29uc3QgQlZIMTo6T2JqZWN0ICZvMSwgY29uc3QgQlZIMjo6Vm9sdW1lICZ2MikKKyAgICAgU2NhbGFyIG1pbmltdW1Pbk9iamVjdE9iamVjdChjb25zdCBCVkgxOjpPYmplY3QgJm8xLCBjb25zdCBCVkgyOjpPYmplY3QgJm8yKQorICBcZW5kY29kZQorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgQlZIMSwgdHlwZW5hbWUgQlZIMiwgdHlwZW5hbWUgTWluaW1pemVyPgordHlwZW5hbWUgTWluaW1pemVyOjpTY2FsYXIgQlZNaW5pbWl6ZShjb25zdCBCVkgxICZ0cmVlMSwgY29uc3QgQlZIMiAmdHJlZTIsIE1pbmltaXplciAmbWluaW1pemVyKQoreworICB0eXBlZGVmIHR5cGVuYW1lIE1pbmltaXplcjo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkgxOjpJbmRleCBJbmRleDE7CisgIHR5cGVkZWYgdHlwZW5hbWUgQlZIMjo6SW5kZXggSW5kZXgyOworICB0eXBlZGVmIGludGVybmFsOjptaW5pbWl6ZXJfaGVscGVyMTx0eXBlbmFtZSBCVkgxOjpWb2x1bWUsIHR5cGVuYW1lIEJWSDE6Ok9iamVjdCwgdHlwZW5hbWUgQlZIMjo6T2JqZWN0LCBNaW5pbWl6ZXI+IEhlbHBlcjE7CisgIHR5cGVkZWYgaW50ZXJuYWw6Om1pbmltaXplcl9oZWxwZXIyPHR5cGVuYW1lIEJWSDI6OlZvbHVtZSwgdHlwZW5hbWUgQlZIMjo6T2JqZWN0LCB0eXBlbmFtZSBCVkgxOjpPYmplY3QsIE1pbmltaXplcj4gSGVscGVyMjsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8U2NhbGFyLCBzdGQ6OnBhaXI8SW5kZXgxLCBJbmRleDI+ID4gUXVldWVFbGVtZW50OyAvL2ZpcnN0IGVsZW1lbnQgaXMgcHJpb3JpdHkKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkgxOjpWb2x1bWVJdGVyYXRvciBWb2xJdGVyMTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkgxOjpPYmplY3RJdGVyYXRvciBPYmpJdGVyMTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkgyOjpWb2x1bWVJdGVyYXRvciBWb2xJdGVyMjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBCVkgyOjpPYmplY3RJdGVyYXRvciBPYmpJdGVyMjsKKworICBWb2xJdGVyMSB2QmVnaW4xID0gVm9sSXRlcjEoKSwgdkVuZDEgPSBWb2xJdGVyMSgpOworICBPYmpJdGVyMSBvQmVnaW4xID0gT2JqSXRlcjEoKSwgb0VuZDEgPSBPYmpJdGVyMSgpOworICBWb2xJdGVyMiB2QmVnaW4yID0gVm9sSXRlcjIoKSwgdkVuZDIgPSBWb2xJdGVyMigpLCB2Q3VyMiA9IFZvbEl0ZXIyKCk7CisgIE9iakl0ZXIyIG9CZWdpbjIgPSBPYmpJdGVyMigpLCBvRW5kMiA9IE9iakl0ZXIyKCksIG9DdXIyID0gT2JqSXRlcjIoKTsKKyAgc3RkOjpwcmlvcml0eV9xdWV1ZTxRdWV1ZUVsZW1lbnQsIHN0ZDo6dmVjdG9yPFF1ZXVlRWxlbWVudD4sIHN0ZDo6Z3JlYXRlcjxRdWV1ZUVsZW1lbnQ+ID4gdG9kbzsgLy9zbWFsbGVzdCBpcyBhdCB0aGUgdG9wCisKKyAgU2NhbGFyIG1pbmltdW0gPSAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptYXgpKCk7CisgIHRvZG8ucHVzaChzdGQ6Om1ha2VfcGFpcihTY2FsYXIoKSwgc3RkOjptYWtlX3BhaXIodHJlZTEuZ2V0Um9vdEluZGV4KCksIHRyZWUyLmdldFJvb3RJbmRleCgpKSkpOworCisgIHdoaWxlKCF0b2RvLmVtcHR5KCkpIHsKKyAgICB0cmVlMS5nZXRDaGlsZHJlbih0b2RvLnRvcCgpLnNlY29uZC5maXJzdCwgdkJlZ2luMSwgdkVuZDEsIG9CZWdpbjEsIG9FbmQxKTsKKyAgICB0cmVlMi5nZXRDaGlsZHJlbih0b2RvLnRvcCgpLnNlY29uZC5zZWNvbmQsIHZCZWdpbjIsIHZFbmQyLCBvQmVnaW4yLCBvRW5kMik7CisgICAgdG9kby5wb3AoKTsKKworICAgIGZvcig7IG9CZWdpbjEgIT0gb0VuZDE7ICsrb0JlZ2luMSkgeyAvL2dvIHRocm91Z2ggY2hpbGQgb2JqZWN0cyBvZiBmaXJzdCB0cmVlCisgICAgICBmb3Iob0N1cjIgPSBvQmVnaW4yOyBvQ3VyMiAhPSBvRW5kMjsgKytvQ3VyMikgey8vZ28gdGhyb3VnaCBjaGlsZCBvYmplY3RzIG9mIHNlY29uZCB0cmVlCisgICAgICAgIG1pbmltdW0gPSAoc3RkOjptaW4pKG1pbmltdW0sIG1pbmltaXplci5taW5pbXVtT25PYmplY3RPYmplY3QoKm9CZWdpbjEsICpvQ3VyMikpOworICAgICAgfQorCisgICAgICBmb3IodkN1cjIgPSB2QmVnaW4yOyB2Q3VyMiAhPSB2RW5kMjsgKyt2Q3VyMikgeyAvL2dvIHRocm91Z2ggY2hpbGQgdm9sdW1lcyBvZiBzZWNvbmQgdHJlZQorICAgICAgICBIZWxwZXIyIGhlbHBlcigqb0JlZ2luMSwgbWluaW1pemVyKTsKKyAgICAgICAgbWluaW11bSA9IChzdGQ6Om1pbikobWluaW11bSwgaW50ZXJuYWw6Om1pbmltaXplX2hlbHBlcih0cmVlMiwgaGVscGVyLCAqdkN1cjIsIG1pbmltdW0pKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoOyB2QmVnaW4xICE9IHZFbmQxOyArK3ZCZWdpbjEpIHsgLy9nbyB0aHJvdWdoIGNoaWxkIHZvbHVtZXMgb2YgZmlyc3QgdHJlZQorICAgICAgY29uc3QgdHlwZW5hbWUgQlZIMTo6Vm9sdW1lICZ2b2wxID0gdHJlZTEuZ2V0Vm9sdW1lKCp2QmVnaW4xKTsKKworICAgICAgZm9yKG9DdXIyID0gb0JlZ2luMjsgb0N1cjIgIT0gb0VuZDI7ICsrb0N1cjIpIHsvL2dvIHRocm91Z2ggY2hpbGQgb2JqZWN0cyBvZiBzZWNvbmQgdHJlZQorICAgICAgICBIZWxwZXIxIGhlbHBlcigqb0N1cjIsIG1pbmltaXplcik7CisgICAgICAgIG1pbmltdW0gPSAoc3RkOjptaW4pKG1pbmltdW0sIGludGVybmFsOjptaW5pbWl6ZV9oZWxwZXIodHJlZTEsIGhlbHBlciwgKnZCZWdpbjEsIG1pbmltdW0pKTsKKyAgICAgIH0KKworICAgICAgZm9yKHZDdXIyID0gdkJlZ2luMjsgdkN1cjIgIT0gdkVuZDI7ICsrdkN1cjIpIHsgLy9nbyB0aHJvdWdoIGNoaWxkIHZvbHVtZXMgb2Ygc2Vjb25kIHRyZWUKKyAgICAgICAgU2NhbGFyIHZhbCA9IG1pbmltaXplci5taW5pbXVtT25Wb2x1bWVWb2x1bWUodm9sMSwgdHJlZTIuZ2V0Vm9sdW1lKCp2Q3VyMikpOworICAgICAgICBpZih2YWwgPCBtaW5pbXVtKQorICAgICAgICAgIHRvZG8ucHVzaChzdGQ6Om1ha2VfcGFpcih2YWwsIHN0ZDo6bWFrZV9wYWlyKCp2QmVnaW4xLCAqdkN1cjIpKSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtaW5pbXVtOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0JWQUxHT1JJVEhNU19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvQlZIL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0JWSC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzc3ZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0JWSC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9CVkhfU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUworICAke0VpZ2VuX0JWSF9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9CVkggQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9CVkgvS2RCVkguaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9CVkgvS2RCVkguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhkNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0JWSC9LZEJWSC5oCkBAIC0wLDAgKzEsMjIyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBJbHlhIEJhcmFuIDxpYmFyYW5AbWl0LmVkdT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgS0RCVkhfSF9JTkNMVURFRAorI2RlZmluZSBLREJWSF9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvL2ludGVybmFsIHBhaXIgY2xhc3MgZm9yIHRoZSBCVkgtLXVzZWQgaW5zdGVhZCBvZiBzdGQ6OnBhaXIgYmVjYXVzZSBvZiBhbGlnbm1lbnQKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbT4KK3N0cnVjdCB2ZWN0b3JfaW50X3BhaXIKK3sKK0VJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoU2NhbGFyLCBEaW0pCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltLCAxPiBWZWN0b3JUeXBlOworCisgIHZlY3Rvcl9pbnRfcGFpcihjb25zdCBWZWN0b3JUeXBlICZ2LCBpbnQgaSkgOiBmaXJzdCh2KSwgc2Vjb25kKGkpIHt9CisKKyAgVmVjdG9yVHlwZSBmaXJzdDsKKyAgaW50IHNlY29uZDsKK307CisKKy8vdGhlc2UgdGVtcGxhdGVzIGhlbHAgdGhlIHRyZWUgaW5pdGlhbGl6ZXIgZ2V0IHRoZSBib3VuZGluZyBib3hlcyBlaXRoZXIgZnJvbSBhIHByb3ZpZGVkCisvL2l0ZXJhdG9yIHJhbmdlIG9yIHVzaW5nIGJvdW5kaW5nX2JveCBpbiBhIHVuaWZpZWQgd2F5Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RMaXN0LCB0eXBlbmFtZSBWb2x1bWVMaXN0LCB0eXBlbmFtZSBCb3hJdGVyPgorc3RydWN0IGdldF9ib3hlc19oZWxwZXIgeworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgT2JqZWN0TGlzdCAmb2JqZWN0cywgQm94SXRlciBib3hCZWdpbiwgQm94SXRlciBib3hFbmQsIFZvbHVtZUxpc3QgJm91dEJveGVzKQorICB7CisgICAgb3V0Qm94ZXMuaW5zZXJ0KG91dEJveGVzLmVuZCgpLCBib3hCZWdpbiwgYm94RW5kKTsKKyAgICBlaWdlbl9hc3NlcnQob3V0Qm94ZXMuc2l6ZSgpID09IG9iamVjdHMuc2l6ZSgpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0TGlzdCwgdHlwZW5hbWUgVm9sdW1lTGlzdD4KK3N0cnVjdCBnZXRfYm94ZXNfaGVscGVyPE9iamVjdExpc3QsIFZvbHVtZUxpc3QsIGludD4geworICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgT2JqZWN0TGlzdCAmb2JqZWN0cywgaW50LCBpbnQsIFZvbHVtZUxpc3QgJm91dEJveGVzKQorICB7CisgICAgb3V0Qm94ZXMucmVzZXJ2ZShvYmplY3RzLnNpemUoKSk7CisgICAgZm9yKGludCBpID0gMDsgaSA8IChpbnQpb2JqZWN0cy5zaXplKCk7ICsraSkKKyAgICAgIG91dEJveGVzLnB1c2hfYmFjayhib3VuZGluZ19ib3gob2JqZWN0c1tpXSkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworCisvKiogXGNsYXNzIEtkQlZICisgKiAgXGJyaWVmIEEgc2ltcGxlIGJvdW5kaW5nIHZvbHVtZSBoaWVyYXJjaHkgYmFzZWQgb24gQWxpZ25lZEJveAorICoKKyAqICBccGFyYW0gX1NjYWxhciBUaGUgdW5kZXJseWluZyBzY2FsYXIgdHlwZSBvZiB0aGUgYm91bmRpbmcgYm94ZXMKKyAqICBccGFyYW0gX0RpbSBUaGUgZGltZW5zaW9uIG9mIHRoZSBzcGFjZSBpbiB3aGljaCB0aGUgaGllcmFyY2h5IGxpdmVzCisgKiAgXHBhcmFtIF9PYmplY3QgVGhlIG9iamVjdCB0eXBlIHRoYXQgbGl2ZXMgaW4gdGhlIGhpZXJhcmNoeS4gIEl0IG11c3QgaGF2ZSB2YWx1ZSBzZW1hbnRpY3MuICBFaXRoZXIgYm91bmRpbmdfYm94KF9PYmplY3QpIG11c3QKKyAqICAgICAgICAgICAgICAgICBiZSBkZWZpbmVkIGFuZCByZXR1cm4gYW4gQWxpZ25lZEJveDxfU2NhbGFyLCBfRGltPiBvciBib3VuZGluZyBib3hlcyBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoZSB0cmVlIGluaXRpYWxpemVyLgorICoKKyAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2ltcGxlIChhcyBvcHBvc2VkIHRvIG9wdGltaXplZCkgaW1wbGVtZW50YXRpb24gb2YgYSBib3VuZGluZyB2b2x1bWUgaGllcmFyY2h5IGFuYWxvZ291cyB0byBhIEtkLXRyZWUuCisgKiAgR2l2ZW4gYSBzZXF1ZW5jZSBvZiBvYmplY3RzLCBpdCBjb21wdXRlcyB0aGVpciBib3VuZGluZyBib3hlcywgY29uc3RydWN0cyBhIEtkLXRyZWUgb2YgdGhlaXIgY2VudGVycworICogIGFuZCBidWlsZHMgYSBCVkggd2l0aCB0aGUgc3RydWN0dXJlIG9mIHRoYXQgS2QtdHJlZS4gIFdoZW4gdGhlIGVsZW1lbnRzIG9mIHRoZSB0cmVlIGFyZSB0b28gZXhwZW5zaXZlIHRvIGJlIGNvcGllZCBhcm91bmQsCisgKiAgaXQgaXMgdXNlZnVsIGZvciBfT2JqZWN0IHRvIGJlIGEgcG9pbnRlci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIHR5cGVuYW1lIF9PYmplY3Q+IGNsYXNzIEtkQlZICit7CitwdWJsaWM6CisgIGVudW0geyBEaW0gPSBfRGltIH07CisgIHR5cGVkZWYgX09iamVjdCBPYmplY3Q7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8T2JqZWN0LCBhbGlnbmVkX2FsbG9jYXRvcjxPYmplY3Q+ID4gT2JqZWN0TGlzdDsKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBBbGlnbmVkQm94PFNjYWxhciwgRGltPiBWb2x1bWU7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8Vm9sdW1lLCBhbGlnbmVkX2FsbG9jYXRvcjxWb2x1bWU+ID4gVm9sdW1lTGlzdDsKKyAgdHlwZWRlZiBpbnQgSW5kZXg7CisgIHR5cGVkZWYgY29uc3QgaW50ICpWb2x1bWVJdGVyYXRvcjsgLy90aGUgaXRlcmF0b3JzIGFyZSBqdXN0IHBvaW50ZXJzIGludG8gdGhlIHRyZWUncyB2ZWN0b3JzCisgIHR5cGVkZWYgY29uc3QgT2JqZWN0ICpPYmplY3RJdGVyYXRvcjsKKworICBLZEJWSCgpIHt9CisKKyAgLyoqIEdpdmVuIGFuIGl0ZXJhdG9yIHJhbmdlIG92ZXIgXGEgT2JqZWN0IHJlZmVyZW5jZXMsIGNvbnN0cnVjdHMgdGhlIEJWSC4gIFJlcXVpcmVzIHRoYXQgYm91bmRpbmdfYm94KE9iamVjdCkgcmV0dXJuIGEgVm9sdW1lLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyPiBLZEJWSChJdGVyIGJlZ2luLCBJdGVyIGVuZCkgeyBpbml0KGJlZ2luLCBlbmQsIDAsIDApOyB9IC8vaW50IGlzIHJlY29nbml6ZWQgYnkgaW5pdCBhcyBub3QgYmVpbmcgYW4gaXRlcmF0b3IgdHlwZQorCisgIC8qKiBHaXZlbiBhbiBpdGVyYXRvciByYW5nZSBvdmVyIFxhIE9iamVjdCByZWZlcmVuY2VzIGFuZCBhbiBpdGVyYXRvciByYW5nZSBvdmVyIHRoZWlyIGJvdW5kaW5nIGJveGVzLCBjb25zdHJ1Y3RzIHRoZSBCVkggKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT0l0ZXIsIHR5cGVuYW1lIEJJdGVyPiBLZEJWSChPSXRlciBiZWdpbiwgT0l0ZXIgZW5kLCBCSXRlciBib3hCZWdpbiwgQkl0ZXIgYm94RW5kKSB7IGluaXQoYmVnaW4sIGVuZCwgYm94QmVnaW4sIGJveEVuZCk7IH0KKworICAvKiogR2l2ZW4gYW4gaXRlcmF0b3IgcmFuZ2Ugb3ZlciBcYSBPYmplY3QgcmVmZXJlbmNlcywgY29uc3RydWN0cyB0aGUgQlZILCBvdmVyd3JpdGluZyB3aGF0ZXZlciBpcyBpbiB0aGVyZSBjdXJyZW50bHkuCisgICAgKiBSZXF1aXJlcyB0aGF0IGJvdW5kaW5nX2JveChPYmplY3QpIHJldHVybiBhIFZvbHVtZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXRlcj4gdm9pZCBpbml0KEl0ZXIgYmVnaW4sIEl0ZXIgZW5kKSB7IGluaXQoYmVnaW4sIGVuZCwgMCwgMCk7IH0KKworICAvKiogR2l2ZW4gYW4gaXRlcmF0b3IgcmFuZ2Ugb3ZlciBcYSBPYmplY3QgcmVmZXJlbmNlcyBhbmQgYW4gaXRlcmF0b3IgcmFuZ2Ugb3ZlciB0aGVpciBib3VuZGluZyBib3hlcywKKyAgICAqIGNvbnN0cnVjdHMgdGhlIEJWSCwgb3ZlcndyaXRpbmcgd2hhdGV2ZXIgaXMgaW4gdGhlcmUgY3VycmVudGx5LiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBPSXRlciwgdHlwZW5hbWUgQkl0ZXI+IHZvaWQgaW5pdChPSXRlciBiZWdpbiwgT0l0ZXIgZW5kLCBCSXRlciBib3hCZWdpbiwgQkl0ZXIgYm94RW5kKQorICB7CisgICAgb2JqZWN0cy5jbGVhcigpOworICAgIGJveGVzLmNsZWFyKCk7CisgICAgY2hpbGRyZW4uY2xlYXIoKTsKKworICAgIG9iamVjdHMuaW5zZXJ0KG9iamVjdHMuZW5kKCksIGJlZ2luLCBlbmQpOworICAgIGludCBuID0gc3RhdGljX2Nhc3Q8aW50PihvYmplY3RzLnNpemUoKSk7CisKKyAgICBpZihuIDwgMikKKyAgICAgIHJldHVybjsgLy9pZiB3ZSBoYXZlIGF0IG1vc3Qgb25lIG9iamVjdCwgd2UgZG9uJ3QgbmVlZCBhbnkgaW50ZXJuYWwgbm9kZXMKKworICAgIFZvbHVtZUxpc3Qgb2JqQm94ZXM7CisgICAgVklQYWlyTGlzdCBvYmpDZW50ZXJzOworCisgICAgLy9jb21wdXRlIHRoZSBib3VuZGluZyBib3hlcyBkZXBlbmRpbmcgb24gQkl0ZXIgdHlwZQorICAgIGludGVybmFsOjpnZXRfYm94ZXNfaGVscGVyPE9iamVjdExpc3QsIFZvbHVtZUxpc3QsIEJJdGVyPigpKG9iamVjdHMsIGJveEJlZ2luLCBib3hFbmQsIG9iakJveGVzKTsKKworICAgIG9iakNlbnRlcnMucmVzZXJ2ZShuKTsKKyAgICBib3hlcy5yZXNlcnZlKG4gLSAxKTsKKyAgICBjaGlsZHJlbi5yZXNlcnZlKDIgKiBuIC0gMik7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAgb2JqQ2VudGVycy5wdXNoX2JhY2soVklQYWlyKG9iakJveGVzW2ldLmNlbnRlcigpLCBpKSk7CisKKyAgICBidWlsZChvYmpDZW50ZXJzLCAwLCBuLCBvYmpCb3hlcywgMCk7IC8vdGhlIHJlY3Vyc2l2ZSBwYXJ0IG9mIHRoZSBhbGdvcml0aG0KKworICAgIE9iamVjdExpc3QgdG1wKG4pOworICAgIHRtcC5zd2FwKG9iamVjdHMpOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICBvYmplY3RzW2ldID0gdG1wW29iakNlbnRlcnNbaV0uc2Vjb25kXTsKKyAgfQorCisgIC8qKiBccmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSAqLworICBpbmxpbmUgSW5kZXggZ2V0Um9vdEluZGV4KCkgY29uc3QgeyByZXR1cm4gKGludClib3hlcy5zaXplKCkgLSAxOyB9CisKKyAgLyoqIEdpdmVuIGFuIFxhIGluZGV4IG9mIGEgbm9kZSwgb24gZXhpdCwgXGEgb3V0VkJlZ2luIGFuZCBcYSBvdXRWRW5kIHJhbmdlIG92ZXIgdGhlIGluZGljZXMgb2YgdGhlIHZvbHVtZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorICAgICogYW5kIFxhIG91dE9CZWdpbiBhbmQgXGEgb3V0T0VuZCByYW5nZSBvdmVyIHRoZSBvYmplY3QgY2hpbGRyZW4gb2YgdGhlIG5vZGUgKi8KKyAgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIGdldENoaWxkcmVuKEluZGV4IGluZGV4LCBWb2x1bWVJdGVyYXRvciAmb3V0VkJlZ2luLCBWb2x1bWVJdGVyYXRvciAmb3V0VkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdEl0ZXJhdG9yICZvdXRPQmVnaW4sIE9iamVjdEl0ZXJhdG9yICZvdXRPRW5kKSBjb25zdAorICB7IC8vaW5saW5pbmcgdGhpcyBmdW5jdGlvbiBzaG91bGQgb3BlbiBsb3RzIG9mIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzIHRvIHRoZSBjb21waWxlcgorICAgIGlmKGluZGV4IDwgMCkgeworICAgICAgb3V0VkJlZ2luID0gb3V0VkVuZDsKKyAgICAgIGlmKCFvYmplY3RzLmVtcHR5KCkpCisgICAgICAgIG91dE9CZWdpbiA9ICYob2JqZWN0c1swXSk7CisgICAgICBvdXRPRW5kID0gb3V0T0JlZ2luICsgb2JqZWN0cy5zaXplKCk7IC8vb3V0cHV0IGFsbCBvYmplY3RzLS1uZWNlc3Nhcnkgd2hlbiB0aGUgdHJlZSBoYXMgb25seSBvbmUgb2JqZWN0CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bUJveGVzID0gc3RhdGljX2Nhc3Q8aW50Pihib3hlcy5zaXplKCkpOworCisgICAgaW50IGlkeCA9IGluZGV4ICogMjsKKyAgICBpZihjaGlsZHJlbltpZHggKyAxXSA8IG51bUJveGVzKSB7IC8vc2Vjb25kIGluZGV4IGlzIGFsd2F5cyBiaWdnZXIKKyAgICAgIG91dFZCZWdpbiA9ICYoY2hpbGRyZW5baWR4XSk7CisgICAgICBvdXRWRW5kID0gb3V0VkJlZ2luICsgMjsKKyAgICAgIG91dE9CZWdpbiA9IG91dE9FbmQ7CisgICAgfQorICAgIGVsc2UgaWYoY2hpbGRyZW5baWR4XSA+PSBudW1Cb3hlcykgeyAvL2lmIGJvdGggY2hpbGRyZW4gYXJlIG9iamVjdHMKKyAgICAgIG91dFZCZWdpbiA9IG91dFZFbmQ7CisgICAgICBvdXRPQmVnaW4gPSAmKG9iamVjdHNbY2hpbGRyZW5baWR4XSAtIG51bUJveGVzXSk7CisgICAgICBvdXRPRW5kID0gb3V0T0JlZ2luICsgMjsKKyAgICB9IGVsc2UgeyAvL2lmIHRoZSBmaXJzdCBjaGlsZCBpcyBhIHZvbHVtZSBhbmQgdGhlIHNlY29uZCBpcyBhbiBvYmplY3QKKyAgICAgIG91dFZCZWdpbiA9ICYoY2hpbGRyZW5baWR4XSk7CisgICAgICBvdXRWRW5kID0gb3V0VkJlZ2luICsgMTsKKyAgICAgIG91dE9CZWdpbiA9ICYob2JqZWN0c1tjaGlsZHJlbltpZHggKyAxXSAtIG51bUJveGVzXSk7CisgICAgICBvdXRPRW5kID0gb3V0T0JlZ2luICsgMTsKKyAgICB9CisgIH0KKworICAvKiogXHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgbm9kZSBhdCBcYSBpbmRleCAqLworICBpbmxpbmUgY29uc3QgVm9sdW1lICZnZXRWb2x1bWUoSW5kZXggaW5kZXgpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gYm94ZXNbaW5kZXhdOworICB9CisKK3ByaXZhdGU6CisgIHR5cGVkZWYgaW50ZXJuYWw6OnZlY3Rvcl9pbnRfcGFpcjxTY2FsYXIsIERpbT4gVklQYWlyOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFZJUGFpciwgYWxpZ25lZF9hbGxvY2F0b3I8VklQYWlyPiA+IFZJUGFpckxpc3Q7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltLCAxPiBWZWN0b3JUeXBlOworICBzdHJ1Y3QgVmVjdG9yQ29tcGFyYXRvciAvL2NvbXBhcmVzIHZlY3RvcnMsIG9yLCBtb3JlIHNwZWNpZmljYWxsLCBWSVBhaXJzIGFsb25nIGEgcGFydGljdWxhciBkaW1lbnNpb24KKyAgeworICAgIFZlY3RvckNvbXBhcmF0b3IoaW50IGluRGltKSA6IGRpbShpbkRpbSkge30KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFZJUGFpciAmdjEsIGNvbnN0IFZJUGFpciAmdjIpIGNvbnN0IHsgcmV0dXJuIHYxLmZpcnN0W2RpbV0gPCB2Mi5maXJzdFtkaW1dOyB9CisgICAgaW50IGRpbTsKKyAgfTsKKworICAvL0J1aWxkIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIGJldHdlZW4gb2JqZWN0c1tmcm9tXSBhbmQgb2JqZWN0c1t0b10gKG5vdCBpbmNsdWRpbmcgb2JqZWN0c1t0b10pLgorICAvL1RoaXMgcm91dGluZSBwYXJ0aXRpb25zIHRoZSBvYmpDZW50ZXJzIGluIFtmcm9tLCB0bykgYWxvbmcgdGhlIGRpbWVuc2lvbiBkaW0sIHJlY3Vyc2l2ZWx5IGNvbnN0cnVjdHMKKyAgLy90aGUgdHdvIGhhbHZlcywgYW5kIGFkZHMgdGhlaXIgcGFyZW50IG5vZGUuICBUT0RPOiBhIGNhY2hlLWZyaWVuZGxpZXIgbGF5b3V0CisgIHZvaWQgYnVpbGQoVklQYWlyTGlzdCAmb2JqQ2VudGVycywgaW50IGZyb20sIGludCB0bywgY29uc3QgVm9sdW1lTGlzdCAmb2JqQm94ZXMsIGludCBkaW0pCisgIHsKKyAgICBlaWdlbl9hc3NlcnQodG8gLSBmcm9tID4gMSk7CisgICAgaWYodG8gLSBmcm9tID09IDIpIHsKKyAgICAgIGJveGVzLnB1c2hfYmFjayhvYmpCb3hlc1tvYmpDZW50ZXJzW2Zyb21dLnNlY29uZF0ubWVyZ2VkKG9iakJveGVzW29iakNlbnRlcnNbZnJvbSArIDFdLnNlY29uZF0pKTsKKyAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhmcm9tICsgKGludClvYmplY3RzLnNpemUoKSAtIDEpOyAvL3RoZXJlIGFyZSBvYmplY3RzLnNpemUoKSAtIDEgdHJlZSBub2RlcworICAgICAgY2hpbGRyZW4ucHVzaF9iYWNrKGZyb20gKyAoaW50KW9iamVjdHMuc2l6ZSgpKTsKKyAgICB9CisgICAgZWxzZSBpZih0byAtIGZyb20gPT0gMykgeworICAgICAgaW50IG1pZCA9IGZyb20gKyAyOworICAgICAgc3RkOjpudGhfZWxlbWVudChvYmpDZW50ZXJzLmJlZ2luKCkgKyBmcm9tLCBvYmpDZW50ZXJzLmJlZ2luKCkgKyBtaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBvYmpDZW50ZXJzLmJlZ2luKCkgKyB0bywgVmVjdG9yQ29tcGFyYXRvcihkaW0pKTsgLy9wYXJ0aXRpb24KKyAgICAgIGJ1aWxkKG9iakNlbnRlcnMsIGZyb20sIG1pZCwgb2JqQm94ZXMsIChkaW0gKyAxKSAlIERpbSk7CisgICAgICBpbnQgaWR4MSA9IChpbnQpYm94ZXMuc2l6ZSgpIC0gMTsKKyAgICAgIGJveGVzLnB1c2hfYmFjayhib3hlc1tpZHgxXS5tZXJnZWQob2JqQm94ZXNbb2JqQ2VudGVyc1ttaWRdLnNlY29uZF0pKTsKKyAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhpZHgxKTsKKyAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhtaWQgKyAoaW50KW9iamVjdHMuc2l6ZSgpIC0gMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaW50IG1pZCA9IGZyb20gKyAodG8gLSBmcm9tKSAvIDI7CisgICAgICBudGhfZWxlbWVudChvYmpDZW50ZXJzLmJlZ2luKCkgKyBmcm9tLCBvYmpDZW50ZXJzLmJlZ2luKCkgKyBtaWQsCisgICAgICAgICAgICAgICAgICBvYmpDZW50ZXJzLmJlZ2luKCkgKyB0bywgVmVjdG9yQ29tcGFyYXRvcihkaW0pKTsgLy9wYXJ0aXRpb24KKyAgICAgIGJ1aWxkKG9iakNlbnRlcnMsIGZyb20sIG1pZCwgb2JqQm94ZXMsIChkaW0gKyAxKSAlIERpbSk7CisgICAgICBpbnQgaWR4MSA9IChpbnQpYm94ZXMuc2l6ZSgpIC0gMTsKKyAgICAgIGJ1aWxkKG9iakNlbnRlcnMsIG1pZCwgdG8sIG9iakJveGVzLCAoZGltICsgMSkgJSBEaW0pOworICAgICAgaW50IGlkeDIgPSAoaW50KWJveGVzLnNpemUoKSAtIDE7CisgICAgICBib3hlcy5wdXNoX2JhY2soYm94ZXNbaWR4MV0ubWVyZ2VkKGJveGVzW2lkeDJdKSk7CisgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soaWR4MSk7CisgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soaWR4Mik7CisgICAgfQorICB9CisKKyAgc3RkOjp2ZWN0b3I8aW50PiBjaGlsZHJlbjsgLy9jaGlsZHJlbiBvZiB4IGFyZSBjaGlsZHJlblsyeF0gYW5kIGNoaWxkcmVuWzJ4KzFdLCBpbmRpY2VzIGJpZ2dlciB0aGFuIGJveGVzLnNpemUoKSBpbmRleCBpbnRvIG9iamVjdHMuCisgIFZvbHVtZUxpc3QgYm94ZXM7CisgIE9iamVjdExpc3Qgb2JqZWN0czsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy9LREJWSF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvQ01ha2VMaXN0cy50eHQgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxODBiNQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzIEBACitBRERfU1VCRElSRUNUT1JZKEF1dG9EaWZmKQorQUREX1NVQkRJUkVDVE9SWShCVkgpCitBRERfU1VCRElSRUNUT1JZKEZGVCkKK0FERF9TVUJESVJFQ1RPUlkoSXRlcmF0aXZlU29sdmVycykKK0FERF9TVUJESVJFQ1RPUlkoTWF0cml4RnVuY3Rpb25zKQorQUREX1NVQkRJUkVDVE9SWShNb3JlVmVjdG9yaXphdGlvbikKK0FERF9TVUJESVJFQ1RPUlkoTm9uTGluZWFyT3B0aW1pemF0aW9uKQorQUREX1NVQkRJUkVDVE9SWShOdW1lcmljYWxEaWZmKQorQUREX1NVQkRJUkVDVE9SWShQb2x5bm9taWFscykKK0FERF9TVUJESVJFQ1RPUlkoU2t5bGluZSkKK0FERF9TVUJESVJFQ1RPUlkoU3BhcnNlRXh0cmEpCitBRERfU1VCRElSRUNUT1JZKEtyb25lY2tlclByb2R1Y3QpCitBRERfU1VCRElSRUNUT1JZKFNwbGluZXMpCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRkZUL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0ZGVC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGNmZmNiCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0ZGVC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9GRlRfU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUworICAke0VpZ2VuX0ZGVF9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9GRlQgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9GRlQvZWlfZmZ0d19pbXBsLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRkZUL2VpX2ZmdHdfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OWFhMTcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRkZUL2VpX2ZmdHdfaW1wbC5oCkBAIC0wLDAgKzEsMjYxIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLiAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgTWFyayBCb3JnZXJkaW5nIG1hcmsgYSBib3JnZXJkaW5nIG5ldAorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgLy8gRkZUVyB1c2VzIG5vbi1jb25zdCBhcmd1bWVudHMKKyAgLy8gc28gd2UgbXVzdCB1c2UgdWdseSBjb25zdF9jYXN0IGNhbGxzIGZvciBhbGwgdGhlIGFyZ3MgaXQgdXNlcworICAvLworICAvLyBUaGlzIHNob3VsZCBiZSBzYWZlIGFzIGxvbmcgYXMgCisgIC8vIDEuIHdlIHVzZSBGRlRXX0VTVElNQVRFIGZvciBhbGwgb3VyIHBsYW5uaW5nCisgIC8vICAgICAgIHNlZSB0aGUgRkZUVyBkb2NzIHNlY3Rpb24gNC4zLjIgIlBsYW5uZXIgRmxhZ3MiCisgIC8vIDIuIGZmdHdfY29tcGxleCBpcyBjb21wYXRpYmxlIHdpdGggc3RkOjpjb21wbGV4CisgIC8vICAgIFRoaXMgYXNzdW1lcyBzdGQ6OmNvbXBsZXg8VD4gbGF5b3V0IGlzIGFycmF5IG9mIHNpemUgMiB3aXRoIHJlYWwsaW1hZworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gCisgIGlubGluZSAKKyAgVCAqIGZmdHdfY2FzdChjb25zdCBUKiBwKQorICB7IAorICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VCo+KCBwKTsgCisgIH0KKworICBpbmxpbmUgCisgIGZmdHdfY29tcGxleCAqIGZmdHdfY2FzdCggY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4gKiBwKQorICB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxmZnR3X2NvbXBsZXgqPiggcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmZnR3X2NvbXBsZXgqPihwKSApOyAKKyAgfQorCisgIGlubGluZSAKKyAgZmZ0d2ZfY29tcGxleCAqIGZmdHdfY2FzdCggY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiAqIHApCisgIHsgCisgICAgICByZXR1cm4gY29uc3RfY2FzdDxmZnR3Zl9jb21wbGV4Kj4oIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmZ0d2ZfY29tcGxleCo+KHApICk7IAorICB9CisKKyAgaW5saW5lIAorICBmZnR3bF9jb21wbGV4ICogZmZ0d19jYXN0KCBjb25zdCBzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+ICogcCkKKyAgeyAKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PGZmdHdsX2NvbXBsZXgqPiggcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmZnR3bF9jb21wbGV4Kj4ocCkgKTsgCisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gCisgIHN0cnVjdCBmZnR3X3BsYW4ge307CisKKyAgdGVtcGxhdGUgPD4gCisgIHN0cnVjdCBmZnR3X3BsYW48ZmxvYXQ+CisgIHsKKyAgICAgIHR5cGVkZWYgZmxvYXQgc2NhbGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGZmdHdmX2NvbXBsZXggY29tcGxleF90eXBlOworICAgICAgZmZ0d2ZfcGxhbiBtX3BsYW47CisgICAgICBmZnR3X3BsYW4oKSA6bV9wbGFuKE5VTEwpIHt9CisgICAgICB+ZmZ0d19wbGFuKCkge2lmIChtX3BsYW4pIGZmdHdmX2Rlc3Ryb3lfcGxhbihtX3BsYW4pO30KKworICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3QsY29tcGxleF90eXBlICogc3JjLGludCBuZmZ0KSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d2ZfcGxhbl9kZnRfMWQobmZmdCxzcmMsZHN0LCBGRlRXX0ZPUldBUkQsIEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2ZfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52KGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3Zl9wbGFuX2RmdF8xZChuZmZ0LHNyYyxkc3QsIEZGVFdfQkFDS1dBUkQgLCBGRlRXX0VTVElNQVRFfEZGVFdfUFJFU0VSVkVfSU5QVVQpOworICAgICAgICAgIGZmdHdmX2V4ZWN1dGVfZGZ0KCBtX3BsYW4sIHNyYyxkc3QpOworICAgICAgfQorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3Qsc2NhbGFyX3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3Zl9wbGFuX2RmdF9yMmNfMWQobmZmdCxzcmMsZHN0LEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2ZfZXhlY3V0ZV9kZnRfcjJjKCBtX3BsYW4sc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52KHNjYWxhcl90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbmZmdCkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpCisgICAgICAgICAgICAgIG1fcGxhbiA9IGZmdHdmX3BsYW5fZGZ0X2Mycl8xZChuZmZ0LHNyYyxkc3QsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3Zl9leGVjdXRlX2RmdF9jMnIoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSAKKyAgICAgIHZvaWQgZndkMiggY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbjAsaW50IG4xKSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d2ZfcGxhbl9kZnRfMmQobjAsbjEsc3JjLGRzdCxGRlRXX0ZPUldBUkQsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3Zl9leGVjdXRlX2RmdCggbV9wbGFuLCBzcmMsZHN0KTsKKyAgICAgIH0KKyAgICAgIGlubGluZSAKKyAgICAgIHZvaWQgaW52MiggY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbjAsaW50IG4xKSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d2ZfcGxhbl9kZnRfMmQobjAsbjEsc3JjLGRzdCxGRlRXX0JBQ0tXQVJELEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2ZfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisKKyAgfTsKKyAgdGVtcGxhdGUgPD4gCisgIHN0cnVjdCBmZnR3X3BsYW48ZG91YmxlPgorICB7CisgICAgICB0eXBlZGVmIGRvdWJsZSBzY2FsYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgZmZ0d19jb21wbGV4IGNvbXBsZXhfdHlwZTsKKyAgICAgIDo6ZmZ0d19wbGFuIG1fcGxhbjsKKyAgICAgIGZmdHdfcGxhbigpIDptX3BsYW4oTlVMTCkge30KKyAgICAgIH5mZnR3X3BsYW4oKSB7aWYgKG1fcGxhbikgZmZ0d19kZXN0cm95X3BsYW4obV9wbGFuKTt9CisKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBmd2QoY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbmZmdCkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdfcGxhbl9kZnRfMWQobmZmdCxzcmMsZHN0LCBGRlRXX0ZPUldBUkQsIEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d19leGVjdXRlX2RmdCggbV9wbGFuLCBzcmMsZHN0KTsKKyAgICAgIH0KKyAgICAgIGlubGluZQorICAgICAgdm9pZCBpbnYoY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbmZmdCkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdfcGxhbl9kZnRfMWQobmZmdCxzcmMsZHN0LCBGRlRXX0JBQ0tXQVJEICwgRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3X2V4ZWN1dGVfZGZ0KCBtX3BsYW4sIHNyYyxkc3QpOworICAgICAgfQorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3Qsc2NhbGFyX3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3X3BsYW5fZGZ0X3IyY18xZChuZmZ0LHNyYyxkc3QsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3X2V4ZWN1dGVfZGZ0X3IyYyggbV9wbGFuLHNyYyxkc3QpOworICAgICAgfQorICAgICAgaW5saW5lCisgICAgICB2b2lkIGludihzY2FsYXJfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKQorICAgICAgICAgICAgICBtX3BsYW4gPSBmZnR3X3BsYW5fZGZ0X2Mycl8xZChuZmZ0LHNyYyxkc3QsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3X2V4ZWN1dGVfZGZ0X2MyciggbV9wbGFuLCBzcmMsZHN0KTsKKyAgICAgIH0KKyAgICAgIGlubGluZSAKKyAgICAgIHZvaWQgZndkMiggY29tcGxleF90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbjAsaW50IG4xKSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d19wbGFuX2RmdF8yZChuMCxuMSxzcmMsZHN0LEZGVFdfRk9SV0FSRCxGRlRXX0VTVElNQVRFfEZGVFdfUFJFU0VSVkVfSU5QVVQpOworICAgICAgICAgIGZmdHdfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUgCisgICAgICB2b2lkIGludjIoIGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG4wLGludCBuMSkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdfcGxhbl9kZnRfMmQobjAsbjEsc3JjLGRzdCxGRlRXX0JBQ0tXQVJELEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d19leGVjdXRlX2RmdCggbV9wbGFuLCBzcmMsZHN0KTsKKyAgICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPD4gCisgIHN0cnVjdCBmZnR3X3BsYW48bG9uZyBkb3VibGU+CisgIHsKKyAgICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgc2NhbGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGZmdHdsX2NvbXBsZXggY29tcGxleF90eXBlOworICAgICAgZmZ0d2xfcGxhbiBtX3BsYW47CisgICAgICBmZnR3X3BsYW4oKSA6bV9wbGFuKE5VTEwpIHt9CisgICAgICB+ZmZ0d19wbGFuKCkge2lmIChtX3BsYW4pIGZmdHdsX2Rlc3Ryb3lfcGxhbihtX3BsYW4pO30KKworICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3QsY29tcGxleF90eXBlICogc3JjLGludCBuZmZ0KSB7CisgICAgICAgICAgaWYgKG1fcGxhbj09TlVMTCkgbV9wbGFuID0gZmZ0d2xfcGxhbl9kZnRfMWQobmZmdCxzcmMsZHN0LCBGRlRXX0ZPUldBUkQsIEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2xfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52KGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3bF9wbGFuX2RmdF8xZChuZmZ0LHNyYyxkc3QsIEZGVFdfQkFDS1dBUkQgLCBGRlRXX0VTVElNQVRFfEZGVFdfUFJFU0VSVkVfSU5QVVQpOworICAgICAgICAgIGZmdHdsX2V4ZWN1dGVfZGZ0KCBtX3BsYW4sIHNyYyxkc3QpOworICAgICAgfQorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZChjb21wbGV4X3R5cGUgKiBkc3Qsc2NhbGFyX3R5cGUgKiBzcmMsaW50IG5mZnQpIHsKKyAgICAgICAgICBpZiAobV9wbGFuPT1OVUxMKSBtX3BsYW4gPSBmZnR3bF9wbGFuX2RmdF9yMmNfMWQobmZmdCxzcmMsZHN0LEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2xfZXhlY3V0ZV9kZnRfcjJjKCBtX3BsYW4sc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52KHNjYWxhcl90eXBlICogZHN0LGNvbXBsZXhfdHlwZSAqIHNyYyxpbnQgbmZmdCkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpCisgICAgICAgICAgICAgIG1fcGxhbiA9IGZmdHdsX3BsYW5fZGZ0X2Mycl8xZChuZmZ0LHNyYyxkc3QsRkZUV19FU1RJTUFURXxGRlRXX1BSRVNFUlZFX0lOUFVUKTsKKyAgICAgICAgICBmZnR3bF9leGVjdXRlX2RmdF9jMnIoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUgCisgICAgICB2b2lkIGZ3ZDIoIGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG4wLGludCBuMSkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdsX3BsYW5fZGZ0XzJkKG4wLG4xLHNyYyxkc3QsRkZUV19GT1JXQVJELEZGVFdfRVNUSU1BVEV8RkZUV19QUkVTRVJWRV9JTlBVVCk7CisgICAgICAgICAgZmZ0d2xfZXhlY3V0ZV9kZnQoIG1fcGxhbiwgc3JjLGRzdCk7CisgICAgICB9CisgICAgICBpbmxpbmUgCisgICAgICB2b2lkIGludjIoIGNvbXBsZXhfdHlwZSAqIGRzdCxjb21wbGV4X3R5cGUgKiBzcmMsaW50IG4wLGludCBuMSkgeworICAgICAgICAgIGlmIChtX3BsYW49PU5VTEwpIG1fcGxhbiA9IGZmdHdsX3BsYW5fZGZ0XzJkKG4wLG4xLHNyYyxkc3QsRkZUV19CQUNLV0FSRCxGRlRXX0VTVElNQVRFfEZGVFdfUFJFU0VSVkVfSU5QVVQpOworICAgICAgICAgIGZmdHdsX2V4ZWN1dGVfZGZ0KCBtX3BsYW4sIHNyYyxkc3QpOworICAgICAgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyPgorICBzdHJ1Y3QgZmZ0d19pbXBsCisgIHsKKyAgICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxTY2FsYXI+IENvbXBsZXg7CisKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBjbGVhcigpIAorICAgICAgeworICAgICAgICBtX3BsYW5zLmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIC8vIGNvbXBsZXgtdG8tY29tcGxleCBmb3J3YXJkIEZGVAorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZCggQ29tcGxleCAqIGRzdCxjb25zdCBDb21wbGV4ICpzcmMsaW50IG5mZnQpCisgICAgICB7CisgICAgICAgIGdldF9wbGFuKG5mZnQsZmFsc2UsZHN0LHNyYykuZndkKGZmdHdfY2FzdChkc3QpLCBmZnR3X2Nhc3Qoc3JjKSxuZmZ0ICk7CisgICAgICB9CisKKyAgICAgIC8vIHJlYWwtdG8tY29tcGxleCBmb3J3YXJkIEZGVAorICAgICAgaW5saW5lCisgICAgICB2b2lkIGZ3ZCggQ29tcGxleCAqIGRzdCxjb25zdCBTY2FsYXIgKiBzcmMsaW50IG5mZnQpIAorICAgICAgeworICAgICAgICAgIGdldF9wbGFuKG5mZnQsZmFsc2UsZHN0LHNyYykuZndkKGZmdHdfY2FzdChkc3QpLCBmZnR3X2Nhc3Qoc3JjKSAsbmZmdCk7CisgICAgICB9CisKKyAgICAgIC8vIDItZCBjb21wbGV4LXRvLWNvbXBsZXgKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBmd2QyKENvbXBsZXggKiBkc3QsIGNvbnN0IENvbXBsZXggKiBzcmMsIGludCBuMCxpbnQgbjEpCisgICAgICB7CisgICAgICAgICAgZ2V0X3BsYW4objAsbjEsZmFsc2UsZHN0LHNyYykuZndkMihmZnR3X2Nhc3QoZHN0KSwgZmZ0d19jYXN0KHNyYykgLG4wLG4xKTsKKyAgICAgIH0KKworICAgICAgLy8gaW52ZXJzZSBjb21wbGV4LXRvLWNvbXBsZXgKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBpbnYoQ29tcGxleCAqIGRzdCxjb25zdCBDb21wbGV4ICAqc3JjLGludCBuZmZ0KQorICAgICAgeworICAgICAgICBnZXRfcGxhbihuZmZ0LHRydWUsZHN0LHNyYykuaW52KGZmdHdfY2FzdChkc3QpLCBmZnR3X2Nhc3Qoc3JjKSxuZmZ0ICk7CisgICAgICB9CisKKyAgICAgIC8vIGhhbGYtY29tcGxleCB0byBzY2FsYXIKKyAgICAgIGlubGluZQorICAgICAgdm9pZCBpbnYoIFNjYWxhciAqIGRzdCxjb25zdCBDb21wbGV4ICogc3JjLGludCBuZmZ0KSAKKyAgICAgIHsKKyAgICAgICAgZ2V0X3BsYW4obmZmdCx0cnVlLGRzdCxzcmMpLmludihmZnR3X2Nhc3QoZHN0KSwgZmZ0d19jYXN0KHNyYyksbmZmdCApOworICAgICAgfQorCisgICAgICAvLyAyLWQgY29tcGxleC10by1jb21wbGV4CisgICAgICBpbmxpbmUKKyAgICAgIHZvaWQgaW52MihDb21wbGV4ICogZHN0LCBjb25zdCBDb21wbGV4ICogc3JjLCBpbnQgbjAsaW50IG4xKQorICAgICAgeworICAgICAgICBnZXRfcGxhbihuMCxuMSx0cnVlLGRzdCxzcmMpLmludjIoZmZ0d19jYXN0KGRzdCksIGZmdHdfY2FzdChzcmMpICxuMCxuMSk7CisgICAgICB9CisKKworICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIGZmdHdfcGxhbjxTY2FsYXI+IFBsYW5EYXRhOworCisgICAgICB0eXBlZGVmIHN0ZDo6bWFwPGludDY0X3QsUGxhbkRhdGE+IFBsYW5NYXA7CisKKyAgICAgIFBsYW5NYXAgbV9wbGFuczsKKworICAgICAgaW5saW5lCisgICAgICBQbGFuRGF0YSAmIGdldF9wbGFuKGludCBuZmZ0LGJvb2wgaW52ZXJzZSx2b2lkICogZHN0LGNvbnN0IHZvaWQgKiBzcmMpCisgICAgICB7CisgICAgICAgICAgYm9vbCBpbnBsYWNlID0gKGRzdD09c3JjKTsKKyAgICAgICAgICBib29sIGFsaWduZWQgPSAoIChyZWludGVycHJldF9jYXN0PHNpemVfdD4oc3JjKSYxNSkgfCAocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGRzdCkmMTUpICkgPT0gMDsKKyAgICAgICAgICBpbnQ2NF90IGtleSA9ICggKG5mZnQ8PDMgKSB8IChpbnZlcnNlPDwyKSB8IChpbnBsYWNlPDwxKSB8IGFsaWduZWQgKSA8PCAxOworICAgICAgICAgIHJldHVybiBtX3BsYW5zW2tleV07CisgICAgICB9CisKKyAgICAgIGlubGluZQorICAgICAgUGxhbkRhdGEgJiBnZXRfcGxhbihpbnQgbjAsaW50IG4xLGJvb2wgaW52ZXJzZSx2b2lkICogZHN0LGNvbnN0IHZvaWQgKiBzcmMpCisgICAgICB7CisgICAgICAgICAgYm9vbCBpbnBsYWNlID0gKGRzdD09c3JjKTsKKyAgICAgICAgICBib29sIGFsaWduZWQgPSAoIChyZWludGVycHJldF9jYXN0PHNpemVfdD4oc3JjKSYxNSkgfCAocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGRzdCkmMTUpICkgPT0gMDsKKyAgICAgICAgICBpbnQ2NF90IGtleSA9ICggKCAoKChpbnQ2NF90KW4wKSA8PCAzMCl8KG4xPDwzICkgfCAoaW52ZXJzZTw8MikgfCAoaW5wbGFjZTw8MSkgfCBhbGlnbmVkICkgPDwgMSApICsgMTsKKyAgICAgICAgICByZXR1cm4gbV9wbGFuc1trZXldOworICAgICAgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvRkZUL2VpX2tpc3NmZnRfaW1wbC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0ZGVC9laV9raXNzZmZ0X2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Y1YWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0ZGVC9laV9raXNzZmZ0X2ltcGwuaApAQCAtMCwwICsxLDQxOCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgTWFyayBCb3JnZXJkaW5nIG1hcmsgYSBib3JnZXJkaW5nIG5ldAorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgLy8gVGhpcyBGRlQgaW1wbGVtZW50YXRpb24gd2FzIGRlcml2ZWQgZnJvbSBraXNzZmZ0IGh0dHA6c291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2tpc3NmZnQKKyAgLy8gQ29weXJpZ2h0IDIwMDMtMjAwOSBNYXJrIEJvcmdlcmRpbmcKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXI+CitzdHJ1Y3Qga2lzc19jcHhfZmZ0Cit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFNjYWxhcj4gQ29tcGxleDsKKyAgc3RkOjp2ZWN0b3I8Q29tcGxleD4gbV90d2lkZGxlczsKKyAgc3RkOjp2ZWN0b3I8aW50PiBtX3N0YWdlUmFkaXg7CisgIHN0ZDo6dmVjdG9yPGludD4gbV9zdGFnZVJlbWFpbmRlcjsKKyAgc3RkOjp2ZWN0b3I8Q29tcGxleD4gbV9zY3JhdGNoQnVmOworICBib29sIG1faW52ZXJzZTsKKworICBpbmxpbmUKKyAgICB2b2lkIG1ha2VfdHdpZGRsZXMoaW50IG5mZnQsYm9vbCBpbnZlcnNlKQorICAgIHsKKyAgICAgIG1faW52ZXJzZSA9IGludmVyc2U7CisgICAgICBtX3R3aWRkbGVzLnJlc2l6ZShuZmZ0KTsKKyAgICAgIFNjYWxhciBwaGluYyA9ICAoaW52ZXJzZT8yOi0yKSogYWNvcyggKFNjYWxhcikgLTEpICAvIG5mZnQ7CisgICAgICBmb3IgKGludCBpPTA7aTxuZmZ0OysraSkKKyAgICAgICAgbV90d2lkZGxlc1tpXSA9IGV4cCggQ29tcGxleCgwLGkqcGhpbmMpICk7CisgICAgfQorCisgIHZvaWQgZmFjdG9yaXplKGludCBuZmZ0KQorICB7CisgICAgLy9zdGFydCBmYWN0b3Jpbmcgb3V0IDQncywgdGhlbiAyJ3MsIHRoZW4gMyw1LDcsOSwuLi4KKyAgICBpbnQgbj0gbmZmdDsKKyAgICBpbnQgcD00OworICAgIGRvIHsKKyAgICAgIHdoaWxlIChuICUgcCkgeworICAgICAgICBzd2l0Y2ggKHApIHsKKyAgICAgICAgICBjYXNlIDQ6IHAgPSAyOyBicmVhazsKKyAgICAgICAgICBjYXNlIDI6IHAgPSAzOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBwICs9IDI7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChwKnA+bikKKyAgICAgICAgICBwPW47Ly8gaW1wb3NzaWJsZSB0byBoYXZlIGEgZmFjdG9yID4gc3FydChuKQorICAgICAgfQorICAgICAgbiAvPSBwOworICAgICAgbV9zdGFnZVJhZGl4LnB1c2hfYmFjayhwKTsKKyAgICAgIG1fc3RhZ2VSZW1haW5kZXIucHVzaF9iYWNrKG4pOworICAgICAgaWYgKCBwID4gNSApCisgICAgICAgIG1fc2NyYXRjaEJ1Zi5yZXNpemUocCk7IC8vIHNjcmF0Y2hidWYgd2lsbCBiZSBuZWVkZWQgaW4gYmZseV9nZW5lcmljCisgICAgfXdoaWxlKG4+MSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NyYz4KKyAgICBpbmxpbmUKKyAgICB2b2lkIHdvcmsoIGludCBzdGFnZSxDb21wbGV4ICogeG91dCwgY29uc3QgX1NyYyAqIHhpbiwgc2l6ZV90IGZzdHJpZGUsc2l6ZV90IGluX3N0cmlkZSkKKyAgICB7CisgICAgICBpbnQgcCA9IG1fc3RhZ2VSYWRpeFtzdGFnZV07CisgICAgICBpbnQgbSA9IG1fc3RhZ2VSZW1haW5kZXJbc3RhZ2VdOworICAgICAgQ29tcGxleCAqIEZvdXRfYmVnID0geG91dDsKKyAgICAgIENvbXBsZXggKiBGb3V0X2VuZCA9IHhvdXQgKyBwKm07CisKKyAgICAgIGlmIChtPjEpIHsKKyAgICAgICAgZG97CisgICAgICAgICAgLy8gcmVjdXJzaXZlIGNhbGw6CisgICAgICAgICAgLy8gREZUIG9mIHNpemUgbSpwIHBlcmZvcm1lZCBieSBkb2luZworICAgICAgICAgIC8vIHAgaW5zdGFuY2VzIG9mIHNtYWxsZXIgREZUcyBvZiBzaXplIG0sIAorICAgICAgICAgIC8vIGVhY2ggb25lIHRha2VzIGEgZGVjaW1hdGVkIHZlcnNpb24gb2YgdGhlIGlucHV0CisgICAgICAgICAgd29yayhzdGFnZSsxLCB4b3V0ICwgeGluLCBmc3RyaWRlKnAsaW5fc3RyaWRlKTsKKyAgICAgICAgICB4aW4gKz0gZnN0cmlkZSppbl9zdHJpZGU7CisgICAgICAgIH13aGlsZSggKHhvdXQgKz0gbSkgIT0gRm91dF9lbmQgKTsKKyAgICAgIH1lbHNleworICAgICAgICBkb3sKKyAgICAgICAgICAqeG91dCA9ICp4aW47CisgICAgICAgICAgeGluICs9IGZzdHJpZGUqaW5fc3RyaWRlOworICAgICAgICB9d2hpbGUoKyt4b3V0ICE9IEZvdXRfZW5kICk7CisgICAgICB9CisgICAgICB4b3V0PUZvdXRfYmVnOworCisgICAgICAvLyByZWNvbWJpbmUgdGhlIHAgc21hbGxlciBERlRzIAorICAgICAgc3dpdGNoIChwKSB7CisgICAgICAgIGNhc2UgMjogYmZseTIoeG91dCxmc3RyaWRlLG0pOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBiZmx5Myh4b3V0LGZzdHJpZGUsbSk7IGJyZWFrOworICAgICAgICBjYXNlIDQ6IGJmbHk0KHhvdXQsZnN0cmlkZSxtKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogYmZseTUoeG91dCxmc3RyaWRlLG0pOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYmZseV9nZW5lcmljKHhvdXQsZnN0cmlkZSxtLHApOyBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgaW5saW5lCisgICAgdm9pZCBiZmx5MiggQ29tcGxleCAqIEZvdXQsIGNvbnN0IHNpemVfdCBmc3RyaWRlLCBpbnQgbSkKKyAgICB7CisgICAgICBmb3IgKGludCBrPTA7azxtOysraykgeworICAgICAgICBDb21wbGV4IHQgPSBGb3V0W20ra10gKiBtX3R3aWRkbGVzW2sqZnN0cmlkZV07CisgICAgICAgIEZvdXRbbStrXSA9IEZvdXRba10gLSB0OworICAgICAgICBGb3V0W2tdICs9IHQ7CisgICAgICB9CisgICAgfQorCisgIGlubGluZQorICAgIHZvaWQgYmZseTQoIENvbXBsZXggKiBGb3V0LCBjb25zdCBzaXplX3QgZnN0cmlkZSwgY29uc3Qgc2l6ZV90IG0pCisgICAgeworICAgICAgQ29tcGxleCBzY3JhdGNoWzZdOworICAgICAgaW50IG5lZ2F0aXZlX2lmX2ludmVyc2UgPSBtX2ludmVyc2UgKiAtMiArMTsKKyAgICAgIGZvciAoc2l6ZV90IGs9MDtrPG07KytrKSB7CisgICAgICAgIHNjcmF0Y2hbMF0gPSBGb3V0W2srbV0gKiBtX3R3aWRkbGVzW2sqZnN0cmlkZV07CisgICAgICAgIHNjcmF0Y2hbMV0gPSBGb3V0W2srMiptXSAqIG1fdHdpZGRsZXNbaypmc3RyaWRlKjJdOworICAgICAgICBzY3JhdGNoWzJdID0gRm91dFtrKzMqbV0gKiBtX3R3aWRkbGVzW2sqZnN0cmlkZSozXTsKKyAgICAgICAgc2NyYXRjaFs1XSA9IEZvdXRba10gLSBzY3JhdGNoWzFdOworCisgICAgICAgIEZvdXRba10gKz0gc2NyYXRjaFsxXTsKKyAgICAgICAgc2NyYXRjaFszXSA9IHNjcmF0Y2hbMF0gKyBzY3JhdGNoWzJdOworICAgICAgICBzY3JhdGNoWzRdID0gc2NyYXRjaFswXSAtIHNjcmF0Y2hbMl07CisgICAgICAgIHNjcmF0Y2hbNF0gPSBDb21wbGV4KCBzY3JhdGNoWzRdLmltYWcoKSpuZWdhdGl2ZV9pZl9pbnZlcnNlICwgLXNjcmF0Y2hbNF0ucmVhbCgpKiBuZWdhdGl2ZV9pZl9pbnZlcnNlICk7CisKKyAgICAgICAgRm91dFtrKzIqbV0gID0gRm91dFtrXSAtIHNjcmF0Y2hbM107CisgICAgICAgIEZvdXRba10gKz0gc2NyYXRjaFszXTsKKyAgICAgICAgRm91dFtrK21dID0gc2NyYXRjaFs1XSArIHNjcmF0Y2hbNF07CisgICAgICAgIEZvdXRbayszKm1dID0gc2NyYXRjaFs1XSAtIHNjcmF0Y2hbNF07CisgICAgICB9CisgICAgfQorCisgIGlubGluZQorICAgIHZvaWQgYmZseTMoIENvbXBsZXggKiBGb3V0LCBjb25zdCBzaXplX3QgZnN0cmlkZSwgY29uc3Qgc2l6ZV90IG0pCisgICAgeworICAgICAgc2l6ZV90IGs9bTsKKyAgICAgIGNvbnN0IHNpemVfdCBtMiA9IDIqbTsKKyAgICAgIENvbXBsZXggKnR3MSwqdHcyOworICAgICAgQ29tcGxleCBzY3JhdGNoWzVdOworICAgICAgQ29tcGxleCBlcGkzOworICAgICAgZXBpMyA9IG1fdHdpZGRsZXNbZnN0cmlkZSptXTsKKworICAgICAgdHcxPXR3Mj0mbV90d2lkZGxlc1swXTsKKworICAgICAgZG97CisgICAgICAgIHNjcmF0Y2hbMV09Rm91dFttXSAqICp0dzE7CisgICAgICAgIHNjcmF0Y2hbMl09Rm91dFttMl0gKiAqdHcyOworCisgICAgICAgIHNjcmF0Y2hbM109c2NyYXRjaFsxXStzY3JhdGNoWzJdOworICAgICAgICBzY3JhdGNoWzBdPXNjcmF0Y2hbMV0tc2NyYXRjaFsyXTsKKyAgICAgICAgdHcxICs9IGZzdHJpZGU7CisgICAgICAgIHR3MiArPSBmc3RyaWRlKjI7CisgICAgICAgIEZvdXRbbV0gPSBDb21wbGV4KCBGb3V0LT5yZWFsKCkgLSBTY2FsYXIoLjUpKnNjcmF0Y2hbM10ucmVhbCgpICwgRm91dC0+aW1hZygpIC0gU2NhbGFyKC41KSpzY3JhdGNoWzNdLmltYWcoKSApOworICAgICAgICBzY3JhdGNoWzBdICo9IGVwaTMuaW1hZygpOworICAgICAgICAqRm91dCArPSBzY3JhdGNoWzNdOworICAgICAgICBGb3V0W20yXSA9IENvbXBsZXgoICBGb3V0W21dLnJlYWwoKSArIHNjcmF0Y2hbMF0uaW1hZygpICwgRm91dFttXS5pbWFnKCkgLSBzY3JhdGNoWzBdLnJlYWwoKSApOworICAgICAgICBGb3V0W21dICs9IENvbXBsZXgoIC1zY3JhdGNoWzBdLmltYWcoKSxzY3JhdGNoWzBdLnJlYWwoKSApOworICAgICAgICArK0ZvdXQ7CisgICAgICB9d2hpbGUoLS1rKTsKKyAgICB9CisKKyAgaW5saW5lCisgICAgdm9pZCBiZmx5NSggQ29tcGxleCAqIEZvdXQsIGNvbnN0IHNpemVfdCBmc3RyaWRlLCBjb25zdCBzaXplX3QgbSkKKyAgICB7CisgICAgICBDb21wbGV4ICpGb3V0MCwqRm91dDEsKkZvdXQyLCpGb3V0MywqRm91dDQ7CisgICAgICBzaXplX3QgdTsKKyAgICAgIENvbXBsZXggc2NyYXRjaFsxM107CisgICAgICBDb21wbGV4ICogdHdpZGRsZXMgPSAmbV90d2lkZGxlc1swXTsKKyAgICAgIENvbXBsZXggKnR3OworICAgICAgQ29tcGxleCB5YSx5YjsKKyAgICAgIHlhID0gdHdpZGRsZXNbZnN0cmlkZSptXTsKKyAgICAgIHliID0gdHdpZGRsZXNbZnN0cmlkZSoyKm1dOworCisgICAgICBGb3V0MD1Gb3V0OworICAgICAgRm91dDE9Rm91dDArbTsKKyAgICAgIEZvdXQyPUZvdXQwKzIqbTsKKyAgICAgIEZvdXQzPUZvdXQwKzMqbTsKKyAgICAgIEZvdXQ0PUZvdXQwKzQqbTsKKworICAgICAgdHc9dHdpZGRsZXM7CisgICAgICBmb3IgKCB1PTA7IHU8bTsgKyt1ICkgeworICAgICAgICBzY3JhdGNoWzBdID0gKkZvdXQwOworCisgICAgICAgIHNjcmF0Y2hbMV0gID0gKkZvdXQxICogdHdbdSpmc3RyaWRlXTsKKyAgICAgICAgc2NyYXRjaFsyXSAgPSAqRm91dDIgKiB0d1syKnUqZnN0cmlkZV07CisgICAgICAgIHNjcmF0Y2hbM10gID0gKkZvdXQzICogdHdbMyp1KmZzdHJpZGVdOworICAgICAgICBzY3JhdGNoWzRdICA9ICpGb3V0NCAqIHR3WzQqdSpmc3RyaWRlXTsKKworICAgICAgICBzY3JhdGNoWzddID0gc2NyYXRjaFsxXSArIHNjcmF0Y2hbNF07CisgICAgICAgIHNjcmF0Y2hbMTBdID0gc2NyYXRjaFsxXSAtIHNjcmF0Y2hbNF07CisgICAgICAgIHNjcmF0Y2hbOF0gPSBzY3JhdGNoWzJdICsgc2NyYXRjaFszXTsKKyAgICAgICAgc2NyYXRjaFs5XSA9IHNjcmF0Y2hbMl0gLSBzY3JhdGNoWzNdOworCisgICAgICAgICpGb3V0MCArPSAgc2NyYXRjaFs3XTsKKyAgICAgICAgKkZvdXQwICs9ICBzY3JhdGNoWzhdOworCisgICAgICAgIHNjcmF0Y2hbNV0gPSBzY3JhdGNoWzBdICsgQ29tcGxleCgKKyAgICAgICAgICAgIChzY3JhdGNoWzddLnJlYWwoKSp5YS5yZWFsKCkgKSArIChzY3JhdGNoWzhdLnJlYWwoKSAqeWIucmVhbCgpICksCisgICAgICAgICAgICAoc2NyYXRjaFs3XS5pbWFnKCkqeWEucmVhbCgpKSArIChzY3JhdGNoWzhdLmltYWcoKSp5Yi5yZWFsKCkpCisgICAgICAgICAgICApOworCisgICAgICAgIHNjcmF0Y2hbNl0gPSBDb21wbGV4KAorICAgICAgICAgICAgKHNjcmF0Y2hbMTBdLmltYWcoKSp5YS5pbWFnKCkpICsgKHNjcmF0Y2hbOV0uaW1hZygpKnliLmltYWcoKSksCisgICAgICAgICAgICAtKHNjcmF0Y2hbMTBdLnJlYWwoKSp5YS5pbWFnKCkpIC0gKHNjcmF0Y2hbOV0ucmVhbCgpKnliLmltYWcoKSkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgKkZvdXQxID0gc2NyYXRjaFs1XSAtIHNjcmF0Y2hbNl07CisgICAgICAgICpGb3V0NCA9IHNjcmF0Y2hbNV0gKyBzY3JhdGNoWzZdOworCisgICAgICAgIHNjcmF0Y2hbMTFdID0gc2NyYXRjaFswXSArCisgICAgICAgICAgQ29tcGxleCgKKyAgICAgICAgICAgICAgKHNjcmF0Y2hbN10ucmVhbCgpKnliLnJlYWwoKSkgKyAoc2NyYXRjaFs4XS5yZWFsKCkqeWEucmVhbCgpKSwKKyAgICAgICAgICAgICAgKHNjcmF0Y2hbN10uaW1hZygpKnliLnJlYWwoKSkgKyAoc2NyYXRjaFs4XS5pbWFnKCkqeWEucmVhbCgpKQorICAgICAgICAgICAgICApOworCisgICAgICAgIHNjcmF0Y2hbMTJdID0gQ29tcGxleCgKKyAgICAgICAgICAgIC0oc2NyYXRjaFsxMF0uaW1hZygpKnliLmltYWcoKSkgKyAoc2NyYXRjaFs5XS5pbWFnKCkqeWEuaW1hZygpKSwKKyAgICAgICAgICAgIChzY3JhdGNoWzEwXS5yZWFsKCkqeWIuaW1hZygpKSAtIChzY3JhdGNoWzldLnJlYWwoKSp5YS5pbWFnKCkpCisgICAgICAgICAgICApOworCisgICAgICAgICpGb3V0Mj1zY3JhdGNoWzExXStzY3JhdGNoWzEyXTsKKyAgICAgICAgKkZvdXQzPXNjcmF0Y2hbMTFdLXNjcmF0Y2hbMTJdOworCisgICAgICAgICsrRm91dDA7KytGb3V0MTsrK0ZvdXQyOysrRm91dDM7KytGb3V0NDsKKyAgICAgIH0KKyAgICB9CisKKyAgLyogcGVyZm9ybSB0aGUgYnV0dGVyZmx5IGZvciBvbmUgc3RhZ2Ugb2YgYSBtaXhlZCByYWRpeCBGRlQgKi8KKyAgaW5saW5lCisgICAgdm9pZCBiZmx5X2dlbmVyaWMoCisgICAgICAgIENvbXBsZXggKiBGb3V0LAorICAgICAgICBjb25zdCBzaXplX3QgZnN0cmlkZSwKKyAgICAgICAgaW50IG0sCisgICAgICAgIGludCBwCisgICAgICAgICkKKyAgICB7CisgICAgICBpbnQgdSxrLHExLHE7CisgICAgICBDb21wbGV4ICogdHdpZGRsZXMgPSAmbV90d2lkZGxlc1swXTsKKyAgICAgIENvbXBsZXggdDsKKyAgICAgIGludCBOb3JpZyA9IHN0YXRpY19jYXN0PGludD4obV90d2lkZGxlcy5zaXplKCkpOworICAgICAgQ29tcGxleCAqIHNjcmF0Y2hidWYgPSAmbV9zY3JhdGNoQnVmWzBdOworCisgICAgICBmb3IgKCB1PTA7IHU8bTsgKyt1ICkgeworICAgICAgICBrPXU7CisgICAgICAgIGZvciAoIHExPTAgOyBxMTxwIDsgKytxMSApIHsKKyAgICAgICAgICBzY3JhdGNoYnVmW3ExXSA9IEZvdXRbIGsgIF07CisgICAgICAgICAgayArPSBtOworICAgICAgICB9CisKKyAgICAgICAgaz11OworICAgICAgICBmb3IgKCBxMT0wIDsgcTE8cCA7ICsrcTEgKSB7CisgICAgICAgICAgaW50IHR3aWR4PTA7CisgICAgICAgICAgRm91dFsgayBdID0gc2NyYXRjaGJ1ZlswXTsKKyAgICAgICAgICBmb3IgKHE9MTtxPHA7KytxICkgeworICAgICAgICAgICAgdHdpZHggKz0gc3RhdGljX2Nhc3Q8aW50Pihmc3RyaWRlKSAqIGs7CisgICAgICAgICAgICBpZiAodHdpZHg+PU5vcmlnKSB0d2lkeC09Tm9yaWc7CisgICAgICAgICAgICB0PXNjcmF0Y2hidWZbcV0gKiB0d2lkZGxlc1t0d2lkeF07CisgICAgICAgICAgICBGb3V0WyBrIF0gKz0gdDsKKyAgICAgICAgICB9CisgICAgICAgICAgayArPSBtOworICAgICAgICB9CisgICAgICB9CisgICAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXI+CitzdHJ1Y3Qga2lzc2ZmdF9pbXBsCit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFNjYWxhcj4gQ29tcGxleDsKKworICB2b2lkIGNsZWFyKCkgCisgIHsKKyAgICBtX3BsYW5zLmNsZWFyKCk7CisgICAgbV9yZWFsVHdpZGRsZXMuY2xlYXIoKTsKKyAgfQorCisgIGlubGluZQorICAgIHZvaWQgZndkKCBDb21wbGV4ICogZHN0LGNvbnN0IENvbXBsZXggKnNyYyxpbnQgbmZmdCkKKyAgICB7CisgICAgICBnZXRfcGxhbihuZmZ0LGZhbHNlKS53b3JrKDAsIGRzdCwgc3JjLCAxLDEpOworICAgIH0KKworICBpbmxpbmUKKyAgICB2b2lkIGZ3ZDIoIENvbXBsZXggKiBkc3QsY29uc3QgQ29tcGxleCAqc3JjLGludCBuMCxpbnQgbjEpCisgICAgeworICAgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoZHN0KTsKKyAgICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHNyYyk7CisgICAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShuMCk7CisgICAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShuMSk7CisgICAgfQorCisgIGlubGluZQorICAgIHZvaWQgaW52MiggQ29tcGxleCAqIGRzdCxjb25zdCBDb21wbGV4ICpzcmMsaW50IG4wLGludCBuMSkKKyAgICB7CisgICAgICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShkc3QpOworICAgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoc3JjKTsKKyAgICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG4wKTsKKyAgICAgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG4xKTsKKyAgICB9CisKKyAgLy8gcmVhbC10by1jb21wbGV4IGZvcndhcmQgRkZUCisgIC8vIHBlcmZvcm0gdHdvIEZGVHMgb2Ygc3JjIGV2ZW4gYW5kIHNyYyBvZGQKKyAgLy8gdGhlbiB0d2lkZGxlIHRvIHJlY29tYmluZSB0aGVtIGludG8gdGhlIGhhbGYtc3BlY3RydW0gZm9ybWF0CisgIC8vIHRoZW4gZmlsbCBpbiB0aGUgY29uanVnYXRlIHN5bW1ldHJpYyBoYWxmCisgIGlubGluZQorICAgIHZvaWQgZndkKCBDb21wbGV4ICogZHN0LGNvbnN0IFNjYWxhciAqIHNyYyxpbnQgbmZmdCkgCisgICAgeworICAgICAgaWYgKCBuZmZ0JjMgICkgeworICAgICAgICAvLyB1c2UgZ2VuZXJpYyBtb2RlIGZvciBvZGQKKyAgICAgICAgbV90bXBCdWYxLnJlc2l6ZShuZmZ0KTsKKyAgICAgICAgZ2V0X3BsYW4obmZmdCxmYWxzZSkud29yaygwLCAmbV90bXBCdWYxWzBdLCBzcmMsIDEsMSk7CisgICAgICAgIHN0ZDo6Y29weShtX3RtcEJ1ZjEuYmVnaW4oKSxtX3RtcEJ1ZjEuYmVnaW4oKSsobmZmdD4+MSkrMSxkc3QgKTsKKyAgICAgIH1lbHNleworICAgICAgICBpbnQgbmNmZnQgPSBuZmZ0Pj4xOworICAgICAgICBpbnQgbmNmZnQyID0gbmZmdD4+MjsKKyAgICAgICAgQ29tcGxleCAqIHJ0dyA9IHJlYWxfdHdpZGRsZXMobmNmZnQyKTsKKworICAgICAgICAvLyB1c2Ugb3B0aW1pemVkIG1vZGUgZm9yIGV2ZW4gcmVhbAorICAgICAgICBmd2QoIGRzdCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDb21wbGV4Kj4gKHNyYyksIG5jZmZ0KTsKKyAgICAgICAgQ29tcGxleCBkYyA9IGRzdFswXS5yZWFsKCkgKyAgZHN0WzBdLmltYWcoKTsKKyAgICAgICAgQ29tcGxleCBueXF1aXN0ID0gZHN0WzBdLnJlYWwoKSAtICBkc3RbMF0uaW1hZygpOworICAgICAgICBpbnQgazsKKyAgICAgICAgZm9yICggaz0xO2sgPD0gbmNmZnQyIDsgKytrICkgeworICAgICAgICAgIENvbXBsZXggZnBrID0gZHN0W2tdOworICAgICAgICAgIENvbXBsZXggZnBuayA9IGNvbmooZHN0W25jZmZ0LWtdKTsKKyAgICAgICAgICBDb21wbGV4IGYxayA9IGZwayArIGZwbms7CisgICAgICAgICAgQ29tcGxleCBmMmsgPSBmcGsgLSBmcG5rOworICAgICAgICAgIENvbXBsZXggdHc9IGYyayAqIHJ0d1trLTFdOworICAgICAgICAgIGRzdFtrXSA9ICAoZjFrICsgdHcpICogU2NhbGFyKC41KTsKKyAgICAgICAgICBkc3RbbmNmZnQta10gPSAgY29uaihmMWsgLXR3KSpTY2FsYXIoLjUpOworICAgICAgICB9CisgICAgICAgIGRzdFswXSA9IGRjOworICAgICAgICBkc3RbbmNmZnRdID0gbnlxdWlzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgLy8gaW52ZXJzZSBjb21wbGV4LXRvLWNvbXBsZXgKKyAgaW5saW5lCisgICAgdm9pZCBpbnYoQ29tcGxleCAqIGRzdCxjb25zdCBDb21wbGV4ICAqc3JjLGludCBuZmZ0KQorICAgIHsKKyAgICAgIGdldF9wbGFuKG5mZnQsdHJ1ZSkud29yaygwLCBkc3QsIHNyYywgMSwxKTsKKyAgICB9CisKKyAgLy8gaGFsZi1jb21wbGV4IHRvIHNjYWxhcgorICBpbmxpbmUKKyAgICB2b2lkIGludiggU2NhbGFyICogZHN0LGNvbnN0IENvbXBsZXggKiBzcmMsaW50IG5mZnQpIAorICAgIHsKKyAgICAgIGlmIChuZmZ0JjMpIHsKKyAgICAgICAgbV90bXBCdWYxLnJlc2l6ZShuZmZ0KTsKKyAgICAgICAgbV90bXBCdWYyLnJlc2l6ZShuZmZ0KTsKKyAgICAgICAgc3RkOjpjb3B5KHNyYyxzcmMrKG5mZnQ+PjEpKzEsbV90bXBCdWYxLmJlZ2luKCkgKTsKKyAgICAgICAgZm9yIChpbnQgaz0xO2s8KG5mZnQ+PjEpKzE7KytrKQorICAgICAgICAgIG1fdG1wQnVmMVtuZmZ0LWtdID0gY29uaihtX3RtcEJ1ZjFba10pOworICAgICAgICBpbnYoJm1fdG1wQnVmMlswXSwmbV90bXBCdWYxWzBdLG5mZnQpOworICAgICAgICBmb3IgKGludCBrPTA7azxuZmZ0OysraykKKyAgICAgICAgICBkc3Rba10gPSBtX3RtcEJ1ZjJba10ucmVhbCgpOworICAgICAgfWVsc2V7CisgICAgICAgIC8vIG9wdGltaXplZCB2ZXJzaW9uIGZvciBtdWx0aXBsZSBvZiA0CisgICAgICAgIGludCBuY2ZmdCA9IG5mZnQ+PjE7CisgICAgICAgIGludCBuY2ZmdDIgPSBuZmZ0Pj4yOworICAgICAgICBDb21wbGV4ICogcnR3ID0gcmVhbF90d2lkZGxlcyhuY2ZmdDIpOworICAgICAgICBtX3RtcEJ1ZjEucmVzaXplKG5jZmZ0KTsKKyAgICAgICAgbV90bXBCdWYxWzBdID0gQ29tcGxleCggc3JjWzBdLnJlYWwoKSArIHNyY1tuY2ZmdF0ucmVhbCgpLCBzcmNbMF0ucmVhbCgpIC0gc3JjW25jZmZ0XS5yZWFsKCkgKTsKKyAgICAgICAgZm9yIChpbnQgayA9IDE7IGsgPD0gbmNmZnQgLyAyOyArK2spIHsKKyAgICAgICAgICBDb21wbGV4IGZrID0gc3JjW2tdOworICAgICAgICAgIENvbXBsZXggZm5rYyA9IGNvbmooc3JjW25jZmZ0LWtdKTsKKyAgICAgICAgICBDb21wbGV4IGZlayA9IGZrICsgZm5rYzsKKyAgICAgICAgICBDb21wbGV4IHRtcCA9IGZrIC0gZm5rYzsKKyAgICAgICAgICBDb21wbGV4IGZvayA9IHRtcCAqIGNvbmoocnR3W2stMV0pOworICAgICAgICAgIG1fdG1wQnVmMVtrXSA9IGZlayArIGZvazsKKyAgICAgICAgICBtX3RtcEJ1ZjFbbmNmZnQta10gPSBjb25qKGZlayAtIGZvayk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0X3BsYW4obmNmZnQsdHJ1ZSkud29yaygwLCByZWludGVycHJldF9jYXN0PENvbXBsZXgqPihkc3QpLCAmbV90bXBCdWYxWzBdLCAxLDEpOworICAgICAgfQorICAgIH0KKworICBwcm90ZWN0ZWQ6CisgIHR5cGVkZWYga2lzc19jcHhfZmZ0PFNjYWxhcj4gUGxhbkRhdGE7CisgIHR5cGVkZWYgc3RkOjptYXA8aW50LFBsYW5EYXRhPiBQbGFuTWFwOworCisgIFBsYW5NYXAgbV9wbGFuczsKKyAgc3RkOjptYXA8aW50LCBzdGQ6OnZlY3RvcjxDb21wbGV4PiA+IG1fcmVhbFR3aWRkbGVzOworICBzdGQ6OnZlY3RvcjxDb21wbGV4PiBtX3RtcEJ1ZjE7CisgIHN0ZDo6dmVjdG9yPENvbXBsZXg+IG1fdG1wQnVmMjsKKworICBpbmxpbmUKKyAgICBpbnQgUGxhbktleShpbnQgbmZmdCwgYm9vbCBpc2ludmVyc2UpIGNvbnN0IHsgcmV0dXJuIChuZmZ0PDwxKSB8IGludChpc2ludmVyc2UpOyB9CisKKyAgaW5saW5lCisgICAgUGxhbkRhdGEgJiBnZXRfcGxhbihpbnQgbmZmdCwgYm9vbCBpbnZlcnNlKQorICAgIHsKKyAgICAgIC8vIFRPRE8gbG9vayBmb3IgUGxhbktleShuZmZ0LCAhIGludmVyc2UpIGFuZCBjb25qdWdhdGUgdGhlIHR3aWRkbGVzCisgICAgICBQbGFuRGF0YSAmIHBkID0gbV9wbGFuc1sgUGxhbktleShuZmZ0LGludmVyc2UpIF07CisgICAgICBpZiAoIHBkLm1fdHdpZGRsZXMuc2l6ZSgpID09IDAgKSB7CisgICAgICAgIHBkLm1ha2VfdHdpZGRsZXMobmZmdCxpbnZlcnNlKTsKKyAgICAgICAgcGQuZmFjdG9yaXplKG5mZnQpOworICAgICAgfQorICAgICAgcmV0dXJuIHBkOworICAgIH0KKworICBpbmxpbmUKKyAgICBDb21wbGV4ICogcmVhbF90d2lkZGxlcyhpbnQgbmNmZnQyKQorICAgIHsKKyAgICAgIHN0ZDo6dmVjdG9yPENvbXBsZXg+ICYgdHdpZHJlZiA9IG1fcmVhbFR3aWRkbGVzW25jZmZ0Ml07Ly8gY3JlYXRlcyBuZXcgaWYgbm90IHRoZXJlCisgICAgICBpZiAoIChpbnQpdHdpZHJlZi5zaXplKCkgIT0gbmNmZnQyICkgeworICAgICAgICB0d2lkcmVmLnJlc2l6ZShuY2ZmdDIpOworICAgICAgICBpbnQgbmNmZnQ9IG5jZmZ0Mjw8MTsKKyAgICAgICAgU2NhbGFyIHBpID0gIGFjb3MoIFNjYWxhcigtMSkgKTsKKyAgICAgICAgZm9yIChpbnQgaz0xO2s8PW5jZmZ0MjsrK2spIAorICAgICAgICAgIHR3aWRyZWZbay0xXSA9IGV4cCggQ29tcGxleCgwLC1waSAqIChTY2FsYXIoaykgLyBuY2ZmdCArIFNjYWxhciguNSkpICkgKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAmdHdpZHJlZlswXTsKKyAgICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKy8qIHZpbTogc2V0IGZpbGV0eXBlPWNwcCBldCBzdz0yIHRzPTIgYWk6ICovCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9DTWFrZUxpc3RzLnR4dCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9JdGVyYXRpdmVTb2x2ZXJzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9JdGVyYXRpdmVTb2x2ZXJzX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9JdGVyYXRpdmVTb2x2ZXJzX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9JdGVyYXRpdmVTb2x2ZXJzL0NvbnN0cmFpbmVkQ29uakdyYWQuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9JdGVyYXRpdmVTb2x2ZXJzL0NvbnN0cmFpbmVkQ29uakdyYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODNiZjdhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvQ29uc3RyYWluZWRDb25qR3JhZC5oCkBAIC0wLDAgKzEsMTg5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBHYWVsIEd1ZW5uZWJhdWQgPGdhZWwuZ3Vlbm5lYmF1ZEBpbnJpYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKy8qIE5PVEUgVGhlIGZ1bmN0aW9ucyBvZiB0aGlzIGZpbGUgaGF2ZSBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgR01NKysgbGlicmFyeSAqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMi0yMDA3IFl2ZXMgUmVuYXJkCisvLworLy8gVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBHRVRGRU0rKworLy8KKy8vIEdldGZlbSsrIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisvLyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsCisvLyBVU0EuCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTm9uTVBMMi5oIgorCisjaWZuZGVmIEVJR0VOX0NPTlNUUkFJTkVEQ0dfSAorI2RlZmluZSBFSUdFTl9DT05TVFJBSU5FRENHX0gKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKiogXGluZ3JvdXAgSXRlcmF0aXZlU29sdmVyc19Nb2R1bGUKKyAgKiBDb21wdXRlIHRoZSBwc2V1ZG8gaW52ZXJzZSBvZiB0aGUgbm9uLXNxdWFyZSBtYXRyaXggQyBzdWNoIHRoYXQKKyAgKiBcZiQgQ0lOViA9IChDICogQ15UKV57LTF9ICogQyBcZiQgYmFzZWQgb24gYSBjb25qdWdhdGUgZ3JhZGllbnQgbWV0aG9kLgorICAqCisgICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbGx5IHVzZWQgYnkgY29uc3RyYWluZWRfY2cuCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ01hdHJpeCwgdHlwZW5hbWUgQ0lOVk1hdHJpeD4KK3ZvaWQgcHNldWRvX2ludmVyc2UoY29uc3QgQ01hdHJpeCAmQywgQ0lOVk1hdHJpeCAmQ0lOVikKK3sKKyAgLy8gb3B0aW1pc2FibGUgOiBjb3BpZSBkZSBsYSBsaWduZSwgcHJlY2FsY3VsIGRlIEMgKiB0cmFucyhDKS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBDTWF0cml4OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIENNYXRyaXg6OkluZGV4IEluZGV4OworICAvLyBGSVhNRSB1c2Ugc3BhcnNlIHZlY3RvcnMgPworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBUbXBWZWM7CisKKyAgSW5kZXggcm93cyA9IEMucm93cygpLCBjb2xzID0gQy5jb2xzKCk7CisKKyAgVG1wVmVjIGQocm93cyksIGUocm93cyksIGwoY29scyksIHAocm93cyksIHEocm93cyksIHIocm93cyk7CisgIFNjYWxhciByaG8sIHJob18xLCBhbHBoYTsKKyAgZC5zZXRaZXJvKCk7CisKKyAgQ0lOVi5zdGFydEZpbGwoKTsgLy8gRklYTUUgZXN0aW1hdGUgdGhlIG51bWJlciBvZiBub24temVyb3MKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHJvd3M7ICsraSkKKyAgeworICAgIGRbaV0gPSAxLjA7CisgICAgcmhvID0gMS4wOworICAgIGUuc2V0WmVybygpOworICAgIHIgPSBkOworICAgIHAgPSBkOworCisgICAgd2hpbGUgKHJobyA+PSAxZS0zOCkKKyAgICB7IC8qIGNvbmp1Z2F0ZSBncmFkaWVudCB0byBjb21wdXRlIGUgICAgICAgICAgICAgKi8KKyAgICAgIC8qIHdoaWNoIGlzIHRoZSBpLXRoIHJvdyBvZiBpbnYoQyAqIHRyYW5zKEMpKSAgKi8KKyAgICAgIGwgPSBDLnRyYW5zcG9zZSgpICogcDsKKyAgICAgIHEgPSBDICogbDsKKyAgICAgIGFscGhhID0gcmhvIC8gcC5kb3QocSk7CisgICAgICBlICs9ICBhbHBoYSAqIHA7CisgICAgICByICs9IC1hbHBoYSAqIHE7CisgICAgICByaG9fMSA9IHJobzsKKyAgICAgIHJobyA9IHIuZG90KHIpOworICAgICAgcCA9IChyaG8vcmhvXzEpICogcCArIHI7CisgICAgfQorCisgICAgbCA9IEMudHJhbnNwb3NlKCkgKiBlOyAvLyBsIGlzIHRoZSBpLXRoIHJvdyBvZiBDSU5WCisgICAgLy8gRklYTUUgYWRkIGEgZ2VuZXJpYyAicHJ1bmUvZmlsdGVyIiBleHByZXNzaW9uIGZvciBib3RoIGRlbnNlIGFuZCBzcGFyc2Ugb2JqZWN0IHRvIHNwYXJzZQorICAgIGZvciAoSW5kZXggaj0wOyBqPGwuc2l6ZSgpOyArK2opCisgICAgICBpZiAobFtqXTwxZS0xNSkKKyAgICAgICAgQ0lOVi5maWxsKGksaikgPSBsW2pdOworCisgICAgZFtpXSA9IDAuMDsKKyAgfQorICBDSU5WLmVuZEZpbGwoKTsKK30KKworCisKKy8qKiBcaW5ncm91cCBJdGVyYXRpdmVTb2x2ZXJzX01vZHVsZQorICAqIENvbnN0cmFpbmVkIGNvbmp1Z2F0ZSBncmFkaWVudAorICAqCisgICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gb2YgXGYkIDEvMigoQXgpLngpIC0gYnggXGYkIHVuZGVyIHRoZSBjb250cmFpbnQgXGYkIEN4IFxsZSBmIFxmJAorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgVE1hdHJpeCwgdHlwZW5hbWUgQ01hdHJpeCwKKyAgICAgICAgIHR5cGVuYW1lIFZlY3RvclgsIHR5cGVuYW1lIFZlY3RvckIsIHR5cGVuYW1lIFZlY3RvckY+Cit2b2lkIGNvbnN0cmFpbmVkX2NnKGNvbnN0IFRNYXRyaXgmIEEsIGNvbnN0IENNYXRyaXgmIEMsIFZlY3RvclgmIHgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvckImIGIsIGNvbnN0IFZlY3RvckYmIGYsIEl0ZXJhdGlvbkNvbnRyb2xsZXIgJml0ZXIpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgVE1hdHJpeDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUTWF0cml4OjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gIFRtcFZlYzsKKworICBTY2FsYXIgcmhvID0gMS4wLCByaG9fMSwgbGFtYmRhLCBnYW1tYTsKKyAgSW5kZXggeFNpemUgPSB4LnNpemUoKTsKKyAgVG1wVmVjICBwKHhTaXplKSwgcSh4U2l6ZSksIHEyKHhTaXplKSwKKyAgICAgICAgICByKHhTaXplKSwgb2xkX3ooeFNpemUpLCB6KHhTaXplKSwKKyAgICAgICAgICBtZW1veCh4U2l6ZSk7CisgIHN0ZDo6dmVjdG9yPGJvb2w+IHNhdHVyZWQoQy5yb3dzKCkpOworICBwLnNldFplcm8oKTsKKyAgaXRlci5zZXRSaHNOb3JtKHNxcnQoYi5kb3QoYikpKTsgLy8gZ2FlbCB2ZWN0X3NwKFBTLCBiLCBiKQorICBpZiAoaXRlci5yaHNOb3JtKCkgPT0gMC4wKSBpdGVyLnNldFJoc05vcm0oMS4wKTsKKworICBTcGFyc2VNYXRyaXg8U2NhbGFyLFJvd01ham9yPiBDSU5WKEMucm93cygpLCBDLmNvbHMoKSk7CisgIHBzZXVkb19pbnZlcnNlKEMsIENJTlYpOworCisgIHdoaWxlKHRydWUpCisgIHsKKyAgICAvLyBjb21wdXRhdGlvbiBvZiByZXNpZHVhbAorICAgIG9sZF96ID0gejsKKyAgICBtZW1veCA9IHg7CisgICAgciA9IGI7CisgICAgciArPSBBICogLXg7CisgICAgeiA9IHI7CisgICAgYm9vbCB0cmFuc2l0aW9uID0gZmFsc2U7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IEMucm93cygpOyArK2kpCisgICAgeworICAgICAgU2NhbGFyIGFsID0gQy5yb3coaSkuZG90KHgpIC0gZi5jb2VmZihpKTsKKyAgICAgIGlmIChhbCA+PSAtMS4wRS0xNSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCFzYXR1cmVkW2ldKQorICAgICAgICB7CisgICAgICAgICAgc2F0dXJlZFtpXSA9IHRydWU7CisgICAgICAgICAgdHJhbnNpdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgU2NhbGFyIGJiID0gQ0lOVi5yb3coaSkuZG90KHopOworICAgICAgICBpZiAoYmIgPiAwLjApCisgICAgICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCBhbGxvdyB0aGF0OiB6ICs9IC1iYiAqIEMucm93KGkpOworICAgICAgICAgIGZvciAodHlwZW5hbWUgQ01hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChDLGkpOyBpdDsgKytpdCkKKyAgICAgICAgICAgIHouY29lZmZSZWYoaXQuaW5kZXgoKSkgLT0gYmIqaXQudmFsdWUoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc2F0dXJlZFtpXSA9IGZhbHNlOworICAgIH0KKworICAgIC8vIGRlc2NlbnQgZGlyZWN0aW9uCisgICAgcmhvXzEgPSByaG87CisgICAgcmhvID0gci5kb3Qoeik7CisKKyAgICBpZiAoaXRlci5maW5pc2hlZChyaG8pKSBicmVhazsKKworICAgIGlmIChpdGVyLm5vaXNlTGV2ZWwoKSA+IDAgJiYgdHJhbnNpdGlvbikgc3RkOjpjZXJyIDw8ICJDQ0c6IHRyYW5zaXRpb25cbiI7CisgICAgaWYgKHRyYW5zaXRpb24gfHwgaXRlci5maXJzdCgpKSBnYW1tYSA9IDAuMDsKKyAgICBlbHNlIGdhbW1hID0gKHN0ZDo6bWF4KSgwLjAsIChyaG8gLSBvbGRfei5kb3QoeikpIC8gcmhvXzEpOworICAgIHAgPSB6ICsgZ2FtbWEqcDsKKworICAgICsraXRlcjsKKyAgICAvLyBvbmUgZGltZW5zaW9ubmFsIG9wdGltaXphdGlvbgorICAgIHEgPSBBICogcDsKKyAgICBsYW1iZGEgPSByaG8gLyBxLmRvdChwKTsKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgQy5yb3dzKCk7ICsraSkKKyAgICB7CisgICAgICBpZiAoIXNhdHVyZWRbaV0pCisgICAgICB7CisgICAgICAgIFNjYWxhciBiYiA9IEMucm93KGkpLmRvdChwKSAtIGZbaV07CisgICAgICAgIGlmIChiYiA+IDAuMCkKKyAgICAgICAgICBsYW1iZGEgPSAoc3RkOjptaW4pKGxhbWJkYSwgKGYuY29lZmYoaSktQy5yb3coaSkuZG90KHgpKSAvIGJiKTsKKyAgICAgIH0KKyAgICB9CisgICAgeCArPSBsYW1iZGEgKiBwOworICAgIG1lbW94IC09IHg7CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09OU1RSQUlORURDR19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9HTVJFUy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvR01SRVMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU2N2RiCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvR01SRVMuaApAQCAtMCwwICsxLDM3OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgS29samEgQnJpeCA8YnJpeEBpZ3BtLnJ3dGgtYWFhY2hlbi5kZT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fR01SRVNfSAorI2RlZmluZSBFSUdFTl9HTVJFU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvKioKKyAqIEdlbmVyYWxpemVkIE1pbmltYWwgUmVzaWR1YWwgQWxnb3JpdGhtIGJhc2VkIG9uIHRoZQorICogQXJub2xkaSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgd2l0aCBIb3VzZWhvbGRlciByZWZsZWN0aW9ucy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogIFxwYXJhbSBtYXQgICAgICAgbWF0cml4IG9mIGxpbmVhciBzeXN0ZW0gb2YgZXF1YXRpb25zCisgKiAgXHBhcmFtIFJocyAgICAgICByaWdodCBoYW5kIHNpZGUgdmVjdG9yIG9mIGxpbmVhciBzeXN0ZW0gb2YgZXF1YXRpb25zCisgKiAgXHBhcmFtIHggICAgICAgICBvbiBpbnB1dDogaW5pdGlhbCBndWVzcywgb24gb3V0cHV0OiBzb2x1dGlvbgorICogIFxwYXJhbSBwcmVjb25kICAgcHJlY29uZGl0aW9uZXIgdXNlZAorICogIFxwYXJhbSBpdGVycyAgICAgb24gaW5wdXQ6IG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcGVyZm9ybQorICogICAgICAgICAgICAgICAgICAgb24gb3V0cHV0OiBudW1iZXIgb2YgaXRlcmF0aW9ucyBwZXJmb3JtZWQKKyAqICBccGFyYW0gcmVzdGFydCAgIG51bWJlciBvZiBpdGVyYXRpb25zIGZvciBhIHJlc3RhcnQKKyAqICBccGFyYW0gdG9sX2Vycm9yIG9uIGlucHV0OiByZXNpZHVhbCB0b2xlcmFuY2UKKyAqICAgICAgICAgICAgICAgICAgIG9uIG91dHB1dDogcmVzaWR1dW0gYWNoaWV2ZWQKKyAqCisgKiBcc2EgSXRlcmF0aXZlTWV0aG9kczo6YmljZ3N0YWIoKSAKKyAqICAKKyAqCisgKiBGb3IgcmVmZXJlbmNlcywgcGxlYXNlIHNlZToKKyAqCisgKiBTYWFkLCBZLiBhbmQgU2NodWx0eiwgTS4gSC4KKyAqIEdNUkVTOiBBIEdlbmVyYWxpemVkIE1pbmltYWwgUmVzaWR1YWwgQWxnb3JpdGhtIGZvciBTb2x2aW5nIE5vbnN5bW1ldHJpYyBMaW5lYXIgU3lzdGVtcy4KKyAqIFNJQU0gSi5TY2kuU3RhdC5Db21wLiA3LCAxOTg2LCBwcC4gODU2IC0gODY5LgorICoKKyAqIFNhYWQsIFkuCisgKiBJdGVyYXRpdmUgTWV0aG9kcyBmb3IgU3BhcnNlIExpbmVhciBTeXN0ZW1zLgorICogU29jaWV0eSBmb3IgSW5kdXN0cmlhbCBhbmQgQXBwbGllZCBNYXRoZW1hdGljcywgUGhpbGFkZWxwaGlhLCAyMDAzLgorICoKKyAqIFdhbGtlciwgSC4gRi4KKyAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgR01SRVMgbWV0aG9kLgorICogQ29tcHV0LlBoeXMuQ29tbS4gNTMsIDE5ODksIHBwLiAzMTEgLSAzMjAuCisgKgorICogV2Fsa2VyLCBILiBGLgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIEdNUkVTIE1ldGhvZCB1c2luZyBIb3VzZWhvbGRlciBUcmFuc2Zvcm1hdGlvbnMuCisgKiBTSUFNIEouU2NpLlN0YXQuQ29tcC4gOSwgMTk4OCwgcHAuIDE1MiAtIDE2My4KKyAqCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdCwgdHlwZW5hbWUgUHJlY29uZGl0aW9uZXI+Citib29sIGdtcmVzKGNvbnN0IE1hdHJpeFR5cGUgJiBtYXQsIGNvbnN0IFJocyAmIHJocywgRGVzdCAmIHgsIGNvbnN0IFByZWNvbmRpdGlvbmVyICYgcHJlY29uZCwKKwkJaW50ICZpdGVycywgY29uc3QgaW50ICZyZXN0YXJ0LCB0eXBlbmFtZSBEZXN0OjpSZWFsU2NhbGFyICYgdG9sX2Vycm9yKSB7CisKKwl1c2luZyBzdGQ6OnNxcnQ7CisJdXNpbmcgc3RkOjphYnM7CisKKwl0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKwl0eXBlZGVmIHR5cGVuYW1lIERlc3Q6OlNjYWxhciBTY2FsYXI7CisJdHlwZWRlZiBNYXRyaXggPCBSZWFsU2NhbGFyLCBEeW5hbWljLCAxID4gUmVhbFZlY3RvclR5cGU7CisJdHlwZWRlZiBNYXRyaXggPCBTY2FsYXIsIER5bmFtaWMsIDEgPiBWZWN0b3JUeXBlOworCXR5cGVkZWYgTWF0cml4IDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gRk1hdHJpeFR5cGU7CisKKwlSZWFsU2NhbGFyIHRvbCA9IHRvbF9lcnJvcjsKKwljb25zdCBpbnQgbWF4SXRlcnMgPSBpdGVyczsKKwlpdGVycyA9IDA7CisKKwljb25zdCBpbnQgbSA9IG1hdC5yb3dzKCk7CisKKwlWZWN0b3JUeXBlIHAwID0gcmhzIC0gbWF0Kng7CisJVmVjdG9yVHlwZSByMCA9IHByZWNvbmQuc29sdmUocDApOworLy8gCVJlYWxTY2FsYXIgcjBfc3Fub3JtID0gcjAuc3F1YXJlZE5vcm0oKTsKKworCVZlY3RvclR5cGUgdyA9IFZlY3RvclR5cGU6Olplcm8ocmVzdGFydCArIDEpOworCisJRk1hdHJpeFR5cGUgSCA9IEZNYXRyaXhUeXBlOjpaZXJvKG0sIHJlc3RhcnQgKyAxKTsKKwlWZWN0b3JUeXBlIHRhdSA9IFZlY3RvclR5cGU6Olplcm8ocmVzdGFydCArIDEpOworCXN0ZDo6dmVjdG9yIDwgSmFjb2JpUm90YXRpb24gPCBTY2FsYXIgPiA+IEcocmVzdGFydCk7CisKKwkvLyBnZW5lcmF0ZSBmaXJzdCBIb3VzZWhvbGRlciB2ZWN0b3IKKwlWZWN0b3JUeXBlIGU7CisJUmVhbFNjYWxhciBiZXRhOworCXIwLm1ha2VIb3VzZWhvbGRlcihlLCB0YXUuY29lZmZSZWYoMCksIGJldGEpOworCXcoMCk9KFNjYWxhcikgYmV0YTsKKwlILmJvdHRvbUxlZnRDb3JuZXIobSAtIDEsIDEpID0gZTsKKworCWZvciAoaW50IGsgPSAxOyBrIDw9IHJlc3RhcnQ7ICsraykgeworCisJCSsraXRlcnM7CisKKwkJVmVjdG9yVHlwZSB2ID0gVmVjdG9yVHlwZTo6VW5pdChtLCBrIC0gMSksIHdvcmtzcGFjZShtKTsKKworCQkvLyBhcHBseSBIb3VzZWhvbGRlciByZWZsZWN0aW9ucyBIX3sxfSAuLi4gSF97ay0xfSB0byB2CisJCWZvciAoaW50IGkgPSBrIC0gMTsgaSA+PSAwOyAtLWkpIHsKKwkJCXYudGFpbChtIC0gaSkuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChILmNvbChpKS50YWlsKG0gLSBpIC0gMSksIHRhdS5jb2VmZlJlZihpKSwgd29ya3NwYWNlLmRhdGEoKSk7CisJCX0KKworCQkvLyBhcHBseSBtYXRyaXggTSB0byB2OiAgdiA9IG1hdCAqIHY7CisJCVZlY3RvclR5cGUgdD1tYXQqdjsKKwkJdj1wcmVjb25kLnNvbHZlKHQpOworCisJCS8vIGFwcGx5IEhvdXNlaG9sZGVyIHJlZmxlY3Rpb25zIEhfe2stMX0gLi4uIEhfezF9IHRvIHYKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBrOyArK2kpIHsKKwkJCXYudGFpbChtIC0gaSkuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChILmNvbChpKS50YWlsKG0gLSBpIC0gMSksIHRhdS5jb2VmZlJlZihpKSwgd29ya3NwYWNlLmRhdGEoKSk7CisJCX0KKworCQlpZiAodi50YWlsKG0gLSBrKS5ub3JtKCkgIT0gMC4wKSB7CisKKwkJCWlmIChrIDw9IHJlc3RhcnQpIHsKKworCQkJCS8vIGdlbmVyYXRlIG5ldyBIb3VzZWhvbGRlciB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlIGUobSAtIGsgLSAxKTsKKwkJCQlSZWFsU2NhbGFyIGJldGE7CisJCQkJdi50YWlsKG0gLSBrKS5tYWtlSG91c2Vob2xkZXIoZSwgdGF1LmNvZWZmUmVmKGspLCBiZXRhKTsKKwkJCQlILmNvbChrKS50YWlsKG0gLSBrIC0gMSkgPSBlOworCisJCQkJLy8gYXBwbHkgSG91c2Vob2xkZXIgcmVmbGVjdGlvbiBIX3trfSB0byB2CisJCQkJdi50YWlsKG0gLSBrKS5hcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KEguY29sKGspLnRhaWwobSAtIGsgLSAxKSwgdGF1LmNvZWZmUmVmKGspLCB3b3Jrc3BhY2UuZGF0YSgpKTsKKworCQkJfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChrID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrIC0gMTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IG9sZCBHaXZlbnMgcm90YXRpb25zIHRvIHYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5hcHBseU9uVGhlTGVmdChpLCBpICsgMSwgR1tpXS5hZGpvaW50KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChrPG0gJiYgdihrKSAhPSAoU2NhbGFyKSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgbmV4dCBHaXZlbnMgcm90YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIEdbayAtIDFdLm1ha2VHaXZlbnModihrIC0gMSksIHYoaykpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBHaXZlbnMgcm90YXRpb24gdG8gdiBhbmQgdworICAgICAgICAgICAgICAgICAgICAgICAgdi5hcHBseU9uVGhlTGVmdChrIC0gMSwgaywgR1trIC0gMV0uYWRqb2ludCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcuYXBwbHlPblRoZUxlZnQoayAtIDEsIGssIEdbayAtIDFdLmFkam9pbnQoKSk7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpbnNlcnQgY29lZmZpY2llbnRzIGludG8gdXBwZXIgbWF0cml4IHRyaWFuZ2xlCisgICAgICAgICAgICAgICAgSC5jb2woayAtIDEpLmhlYWQoaykgPSB2LmhlYWQoayk7CisKKyAgICAgICAgICAgICAgICBib29sIHN0b3A9KGs9PW0gfHwgYWJzKHcoaykpIDwgdG9sIHx8IGl0ZXJzID09IG1heEl0ZXJzKTsKKworICAgICAgICAgICAgICAgIGlmIChzdG9wIHx8IGsgPT0gcmVzdGFydCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb2x2ZSB1cHBlciB0cmlhbmd1bGFyIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSB5ID0gdy5oZWFkKGspOworICAgICAgICAgICAgICAgICAgICAgICAgSC50b3BMZWZ0Q29ybmVyKGssIGspLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3IDwgRWlnZW46OlVwcGVyID4gKCkuc29sdmVJblBsYWNlKHkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgSG9ybmVyLWxpa2Ugc2NoZW1lIHRvIGNhbGN1bGF0ZSBzb2x1dGlvbiB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUgeF9uZXcgPSB5KGsgLSAxKSAqIFZlY3RvclR5cGU6OlVuaXQobSwgayAtIDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBIb3VzZWhvbGRlciByZWZsZWN0aW9uIEhfe2t9IHRvIHhfbmV3CisgICAgICAgICAgICAgICAgICAgICAgICB4X25ldy50YWlsKG0gLSBrICsgMSkuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChILmNvbChrIC0gMSkudGFpbChtIC0gayksIHRhdS5jb2VmZlJlZihrIC0gMSksIHdvcmtzcGFjZS5kYXRhKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gayAtIDI7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfbmV3ICs9IHkoaSkgKiBWZWN0b3JUeXBlOjpVbml0KG0sIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBIb3VzZWhvbGRlciByZWZsZWN0aW9uIEhfe2l9IHRvIHhfbmV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfbmV3LnRhaWwobSAtIGkpLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoSC5jb2woaSkudGFpbChtIC0gaSAtIDEpLCB0YXUuY29lZmZSZWYoaSksIHdvcmtzcGFjZS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IHhfbmV3OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs9MDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBkYXRhIGZvciBhIHJlc3RhcnQgIHIwID0gcmhzIC0gbWF0ICogeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSBwMD1tYXQqeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSBwMT1wcmVjb25kLnNvbHZlKHAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSByaHMgLSBwMTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjBfc3Fub3JtID0gcjAuc3F1YXJlZE5vcm0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IFZlY3RvclR5cGU6Olplcm8ocmVzdGFydCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIID0gRk1hdHJpeFR5cGU6Olplcm8obSwgcmVzdGFydCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXUgPSBWZWN0b3JUeXBlOjpaZXJvKHJlc3RhcnQgKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSBmaXJzdCBIb3VzZWhvbGRlciB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciBiZXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMC5tYWtlSG91c2Vob2xkZXIoZSwgdGF1LmNvZWZmUmVmKDApLCBiZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdygwKT0oU2NhbGFyKSBiZXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBILmJvdHRvbUxlZnRDb3JuZXIobSAtIDEsIDEpID0gZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisKKworCX0KKwkKKwlyZXR1cm4gZmFsc2U7CisKK30KKworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX01hdHJpeFR5cGUsCisgICAgICAgICAgdHlwZW5hbWUgX1ByZWNvbmRpdGlvbmVyID0gRGlhZ29uYWxQcmVjb25kaXRpb25lcjx0eXBlbmFtZSBfTWF0cml4VHlwZTo6U2NhbGFyPiA+CitjbGFzcyBHTVJFUzsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+CitzdHJ1Y3QgdHJhaXRzPEdNUkVTPF9NYXRyaXhUeXBlLF9QcmVjb25kaXRpb25lcj4gPgoreworICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgX1ByZWNvbmRpdGlvbmVyIFByZWNvbmRpdGlvbmVyOworfTsKKworfQorCisvKiogXGluZ3JvdXAgSXRlcmF0aXZlTGluZWFyU29sdmVyc19Nb2R1bGUKKyAgKiBcYnJpZWYgQSBHTVJFUyBzb2x2ZXIgZm9yIHNwYXJzZSBzcXVhcmUgcHJvYmxlbXMKKyAgKgorICAqIFRoaXMgY2xhc3MgYWxsb3dzIHRvIHNvbHZlIGZvciBBLnggPSBiIHNwYXJzZSBsaW5lYXIgcHJvYmxlbXMgdXNpbmcgYSBnZW5lcmFsaXplZCBtaW5pbWFsCisgICogcmVzaWR1YWwgbWV0aG9kLiBUaGUgdmVjdG9ycyB4IGFuZCBiIGNhbiBiZSBlaXRoZXIgZGVuc2Ugb3Igc3BhcnNlLgorICAqCisgICogXHRwYXJhbSBfTWF0cml4VHlwZSB0aGUgdHlwZSBvZiB0aGUgc3BhcnNlIG1hdHJpeCBBLCBjYW4gYmUgYSBkZW5zZSBvciBhIHNwYXJzZSBtYXRyaXguCisgICogXHRwYXJhbSBfUHJlY29uZGl0aW9uZXIgdGhlIHR5cGUgb2YgdGhlIHByZWNvbmRpdGlvbmVyLiBEZWZhdWx0IGlzIERpYWdvbmFsUHJlY29uZGl0aW9uZXIKKyAgKgorICAqIFRoZSBtYXhpbWFsIG51bWJlciBvZiBpdGVyYXRpb25zIGFuZCB0b2xlcmFuY2UgdmFsdWUgY2FuIGJlIGNvbnRyb2xsZWQgdmlhIHRoZSBzZXRNYXhJdGVyYXRpb25zKCkKKyAgKiBhbmQgc2V0VG9sZXJhbmNlKCkgbWV0aG9kcy4gVGhlIGRlZmF1bHRzIGFyZSB0aGUgc2l6ZSBvZiB0aGUgcHJvYmxlbSBmb3IgdGhlIG1heGltYWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKyAgKiBhbmQgTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSBmb3IgdGhlIHRvbGVyYW5jZS4KKyAgKiAKKyAgKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGFzIHRoZSBkaXJlY3Qgc29sdmVyIGNsYXNzZXMuIEhlcmUgaXMgYSB0eXBpY2FsIHVzYWdlIGV4YW1wbGU6CisgICogXGNvZGUKKyAgKiBpbnQgbiA9IDEwMDAwOworICAqIFZlY3RvclhkIHgobiksIGIobik7CisgICogU3BhcnNlTWF0cml4PGRvdWJsZT4gQShuLG4pOworICAqIC8vIGZpbGwgQSBhbmQgYgorICAqIEdNUkVTPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc29sdmVyKEEpOworICAqIHggPSBzb2x2ZXIuc29sdmUoYik7CisgICogc3RkOjpjb3V0IDw8ICIjaXRlcmF0aW9uczogICAgICIgPDwgc29sdmVyLml0ZXJhdGlvbnMoKSA8PCBzdGQ6OmVuZGw7CisgICogc3RkOjpjb3V0IDw8ICJlc3RpbWF0ZWQgZXJyb3I6ICIgPDwgc29sdmVyLmVycm9yKCkgICAgICA8PCBzdGQ6OmVuZGw7CisgICogLy8gdXBkYXRlIGIsIGFuZCBzb2x2ZSBhZ2FpbgorICAqIHggPSBzb2x2ZXIuc29sdmUoYik7CisgICogXGVuZGNvZGUKKyAgKiAKKyAgKiBCeSBkZWZhdWx0IHRoZSBpdGVyYXRpb25zIHN0YXJ0IHdpdGggeD0wIGFzIGFuIGluaXRpYWwgZ3Vlc3Mgb2YgdGhlIHNvbHV0aW9uLgorICAqIE9uZSBjYW4gY29udHJvbCB0aGUgc3RhcnQgdXNpbmcgdGhlIHNvbHZlV2l0aEd1ZXNzKCkgbWV0aG9kLiBIZXJlIGlzIGEgc3RlcCBieQorICAqIHN0ZXAgZXhlY3V0aW9uIGV4YW1wbGUgc3RhcnRpbmcgd2l0aCBhIHJhbmRvbSBndWVzcyBhbmQgcHJpbnRpbmcgdGhlIGV2b2x1dGlvbgorICAqIG9mIHRoZSBlc3RpbWF0ZWQgZXJyb3I6CisgICogKiBcY29kZQorICAqIHggPSBWZWN0b3JYZDo6UmFuZG9tKG4pOworICAqIHNvbHZlci5zZXRNYXhJdGVyYXRpb25zKDEpOworICAqIGludCBpID0gMDsKKyAgKiBkbyB7CisgICogICB4ID0gc29sdmVyLnNvbHZlV2l0aEd1ZXNzKGIseCk7CisgICogICBzdGQ6OmNvdXQgPDwgaSA8PCAiIDogIiA8PCBzb2x2ZXIuZXJyb3IoKSA8PCBzdGQ6OmVuZGw7CisgICogICArK2k7CisgICogfSB3aGlsZSAoc29sdmVyLmluZm8oKSE9U3VjY2VzcyAmJiBpPDEwMCk7CisgICogXGVuZGNvZGUKKyAgKiBOb3RlIHRoYXQgc3VjaCBhIHN0ZXAgYnkgc3RlcCBleGN1dGlvbiBpcyBzbGlnaHRseSBzbG93ZXIuCisgICogCisgICogXHNhIGNsYXNzIFNpbXBsaWNpYWxDaG9sZXNreSwgRGlhZ29uYWxQcmVjb25kaXRpb25lciwgSWRlbnRpdHlQcmVjb25kaXRpb25lcgorICAqLwordGVtcGxhdGU8IHR5cGVuYW1lIF9NYXRyaXhUeXBlLCB0eXBlbmFtZSBfUHJlY29uZGl0aW9uZXI+CitjbGFzcyBHTVJFUyA6IHB1YmxpYyBJdGVyYXRpdmVTb2x2ZXJCYXNlPEdNUkVTPF9NYXRyaXhUeXBlLF9QcmVjb25kaXRpb25lcj4gPgoreworICB0eXBlZGVmIEl0ZXJhdGl2ZVNvbHZlckJhc2U8R01SRVM+IEJhc2U7CisgIHVzaW5nIEJhc2U6Om1wX21hdHJpeDsKKyAgdXNpbmcgQmFzZTo6bV9lcnJvcjsKKyAgdXNpbmcgQmFzZTo6bV9pdGVyYXRpb25zOworICB1c2luZyBCYXNlOjptX2luZm87CisgIHVzaW5nIEJhc2U6Om1faXNJbml0aWFsaXplZDsKKyAKK3ByaXZhdGU6CisgIGludCBtX3Jlc3RhcnQ7CisgIAorcHVibGljOgorICB0eXBlZGVmIF9NYXRyaXhUeXBlIE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgX1ByZWNvbmRpdGlvbmVyIFByZWNvbmRpdGlvbmVyOworCitwdWJsaWM6CisKKyAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCisgIEdNUkVTKCkgOiBCYXNlKCksIG1fcmVzdGFydCgzMCkge30KKworICAvKiogSW5pdGlhbGl6ZSB0aGUgc29sdmVyIHdpdGggbWF0cml4IFxhIEEgZm9yIGZ1cnRoZXIgXGMgQXg9YiBzb2x2aW5nLgorICAgICogCisgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIGEgc2hvcnRjdXQgZm9yIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvbGxvd2VkCisgICAgKiBieSBhIGNhbGwgdG8gY29tcHV0ZSgpLgorICAgICogCisgICAgKiBcd2FybmluZyB0aGlzIGNsYXNzIHN0b3JlcyBhIHJlZmVyZW5jZSB0byB0aGUgbWF0cml4IEEgYXMgd2VsbCBhcyBzb21lCisgICAgKiBwcmVjb21wdXRlZCB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gaXQuIFRoZXJlZm9yZSwgaWYgXGEgQSBpcyBjaGFuZ2VkCisgICAgKiB0aGlzIGNsYXNzIGJlY29tZXMgaW52YWxpZC4gQ2FsbCBjb21wdXRlKCkgdG8gdXBkYXRlIGl0IHdpdGggdGhlIG5ldworICAgICogbWF0cml4IEEsIG9yIG1vZGlmeSBhIGNvcHkgb2YgQS4KKyAgICAqLworICBHTVJFUyhjb25zdCBNYXRyaXhUeXBlJiBBKSA6IEJhc2UoQSksIG1fcmVzdGFydCgzMCkge30KKworICB+R01SRVMoKSB7fQorICAKKyAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYWZ0ZXIgdGhhdCBhIHJlc3RhcnQgaXMgcGVyZm9ybWVkLgorICAgICovCisgIGludCBnZXRfcmVzdGFydCgpIHsgcmV0dXJuIG1fcmVzdGFydDsgfQorICAKKyAgLyoqIFNldCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYWZ0ZXIgdGhhdCBhIHJlc3RhcnQgaXMgcGVyZm9ybWVkLgorICAgICogIFxwYXJhbSByZXN0YXJ0ICAgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIGEgcmVzdGFydGksIGRlZmF1bHQgaXMgMzAuCisgICAgKi8KKyAgdm9pZCBzZXRfcmVzdGFydChjb25zdCBpbnQgcmVzdGFydCkgeyBtX3Jlc3RhcnQ9cmVzdGFydDsgfQorICAKKyAgLyoqIFxyZXR1cm5zIHRoZSBzb2x1dGlvbiB4IG9mIFxmJCBBIHggPSBiIFxmJCB1c2luZyB0aGUgY3VycmVudCBkZWNvbXBvc2l0aW9uIG9mIEEKKyAgICAqIFxhIHgwIGFzIGFuIGluaXRpYWwgc29sdXRpb24uCisgICAgKgorICAgICogXHNhIGNvbXB1dGUoKQorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBHdWVzcz4KKyAgaW5saW5lIGNvbnN0IGludGVybmFsOjpzb2x2ZV9yZXR2YWxfd2l0aF9ndWVzczxHTVJFUywgUmhzLCBHdWVzcz4KKyAgc29sdmVXaXRoR3Vlc3MoY29uc3QgTWF0cml4QmFzZTxSaHM+JiBiLCBjb25zdCBHdWVzcyYgeDApIGNvbnN0CisgIHsKKyAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJHTVJFUyBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgZWlnZW5fYXNzZXJ0KEJhc2U6OnJvd3MoKT09Yi5yb3dzKCkKKyAgICAgICAgICAgICAgJiYgIkdNUkVTOjpzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnNvbHZlX3JldHZhbF93aXRoX2d1ZXNzCisgICAgICAgICAgICA8R01SRVMsIFJocywgR3Vlc3M+KCp0aGlzLCBiLmRlcml2ZWQoKSwgeDApOworICB9CisgIAorICAvKiogXGludGVybmFsICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJocyx0eXBlbmFtZSBEZXN0PgorICB2b2lkIF9zb2x2ZVdpdGhHdWVzcyhjb25zdCBSaHMmIGIsIERlc3QmIHgpIGNvbnN0CisgIHsgICAgCisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmb3IoaW50IGo9MDsgajxiLmNvbHMoKTsgKytqKQorICAgIHsKKyAgICAgIG1faXRlcmF0aW9ucyA9IEJhc2U6Om1heEl0ZXJhdGlvbnMoKTsKKyAgICAgIG1fZXJyb3IgPSBCYXNlOjptX3RvbGVyYW5jZTsKKyAgICAgIAorICAgICAgdHlwZW5hbWUgRGVzdDo6Q29sWHByIHhqKHgsaik7CisgICAgICBpZighaW50ZXJuYWw6OmdtcmVzKCptcF9tYXRyaXgsIGIuY29sKGopLCB4aiwgQmFzZTo6bV9wcmVjb25kaXRpb25lciwgbV9pdGVyYXRpb25zLCBtX3Jlc3RhcnQsIG1fZXJyb3IpKQorICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgIH0KKyAgICBtX2luZm8gPSBmYWlsZWQgPyBOdW1lcmljYWxJc3N1ZQorICAgICAgICAgICA6IG1fZXJyb3IgPD0gQmFzZTo6bV90b2xlcmFuY2UgPyBTdWNjZXNzCisgICAgICAgICAgIDogTm9Db252ZXJnZW5jZTsKKyAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICB9CisKKyAgLyoqIFxpbnRlcm5hbCAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHMsdHlwZW5hbWUgRGVzdD4KKyAgdm9pZCBfc29sdmUoY29uc3QgUmhzJiBiLCBEZXN0JiB4KSBjb25zdAorICB7CisgICAgeC5zZXRaZXJvKCk7CisgICAgX3NvbHZlV2l0aEd1ZXNzKGIseCk7CisgIH0KKworcHJvdGVjdGVkOgorCit9OworCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIF9QcmVjb25kaXRpb25lciwgdHlwZW5hbWUgUmhzPgorc3RydWN0IHNvbHZlX3JldHZhbDxHTVJFUzxfTWF0cml4VHlwZSwgX1ByZWNvbmRpdGlvbmVyPiwgUmhzPgorICA6IHNvbHZlX3JldHZhbF9iYXNlPEdNUkVTPF9NYXRyaXhUeXBlLCBfUHJlY29uZGl0aW9uZXI+LCBSaHM+Cit7CisgIHR5cGVkZWYgR01SRVM8X01hdHJpeFR5cGUsIF9QcmVjb25kaXRpb25lcj4gRGVjOworICBFSUdFTl9NQUtFX1NPTFZFX0hFTFBFUlMoRGVjLFJocykKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0PiB2b2lkIGV2YWxUbyhEZXN0JiBkc3QpIGNvbnN0CisgIHsKKyAgICBkZWMoKS5fc29sdmUocmhzKCksZHN0KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fR01SRVNfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvSW5jb21wbGV0ZUxVLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9JbmNvbXBsZXRlTFUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2U3ODAxCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvSW5jb21wbGV0ZUxVLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9JTkNPTVBMRVRFX0xVX0gKKyNkZWZpbmUgRUlHRU5fSU5DT01QTEVURV9MVV9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhcj4KK2NsYXNzIEluY29tcGxldGVMVQoreworICAgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yOjpJbmRleCBJbmRleDsKKyAgICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsUm93TWFqb3I+IEZhY3RvclR5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdHJpeFR5cGU7CisKKyAgICBJbmNvbXBsZXRlTFUoKSA6IG1faXNJbml0aWFsaXplZChmYWxzZSkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisgICAgSW5jb21wbGV0ZUxVKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCkgOiBtX2lzSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgeworICAgICAgY29tcHV0ZShtYXQpOworICAgIH0KKworICAgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX2x1LnJvd3MoKTsgfQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX2x1LmNvbHMoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KKyAgICBJbmNvbXBsZXRlTFUmIGNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgbWF0KQorICAgIHsKKyAgICAgIG1fbHUgPSBtYXQ7CisgICAgICBpbnQgc2l6ZSA9IG1hdC5jb2xzKCk7CisgICAgICBWZWN0b3IgZGlhZyhzaXplKTsKKyAgICAgIGZvcihpbnQgaT0wOyBpPHNpemU7ICsraSkKKyAgICAgIHsKKyAgICAgICAgdHlwZW5hbWUgRmFjdG9yVHlwZTo6SW5uZXJJdGVyYXRvciBrX2l0KG1fbHUsaSk7CisgICAgICAgIGZvcig7IGtfaXQgJiYga19pdC5pbmRleCgpPGk7ICsra19pdCkKKyAgICAgICAgeworICAgICAgICAgIGludCBrID0ga19pdC5pbmRleCgpOworICAgICAgICAgIGtfaXQudmFsdWVSZWYoKSAvPSBkaWFnKGspOworCisgICAgICAgICAgdHlwZW5hbWUgRmFjdG9yVHlwZTo6SW5uZXJJdGVyYXRvciBqX2l0KGtfaXQpOworICAgICAgICAgIHR5cGVuYW1lIEZhY3RvclR5cGU6OklubmVySXRlcmF0b3Iga2pfaXQobV9sdSwgayk7CisgICAgICAgICAgd2hpbGUoa2pfaXQgJiYga2pfaXQuaW5kZXgoKTw9aykgKytral9pdDsKKyAgICAgICAgICBmb3IoKytqX2l0OyBqX2l0OyApCisgICAgICAgICAgeworICAgICAgICAgICAgaWYoa2pfaXQuaW5kZXgoKT09al9pdC5pbmRleCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBqX2l0LnZhbHVlUmVmKCkgLT0ga19pdC52YWx1ZSgpICoga2pfaXQudmFsdWUoKTsKKyAgICAgICAgICAgICAgKytqX2l0OworICAgICAgICAgICAgICArK2tqX2l0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihral9pdC5pbmRleCgpPGpfaXQuaW5kZXgoKSkgKytral9pdDsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsral9pdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoa19pdCAmJiBrX2l0LmluZGV4KCk9PWkpIGRpYWcoaSkgPSBrX2l0LnZhbHVlKCk7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBkaWFnKGkpID0gMTsKKyAgICAgIH0KKyAgICAgIG1faXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZXN0PgorICAgIHZvaWQgX3NvbHZlKGNvbnN0IFJocyYgYiwgRGVzdCYgeCkgY29uc3QKKyAgICB7CisgICAgICB4ID0gbV9sdS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkuc29sdmUoYik7CisgICAgICB4ID0gbV9sdS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+IGlubGluZSBjb25zdCBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPEluY29tcGxldGVMVSwgUmhzPgorICAgIHNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYikgY29uc3QKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQobV9pc0luaXRpYWxpemVkICYmICJJbmNvbXBsZXRlTFUgaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgZWlnZW5fYXNzZXJ0KGNvbHMoKT09Yi5yb3dzKCkKKyAgICAgICAgICAgICAgICAmJiAiSW5jb21wbGV0ZUxVOjpzb2x2ZSgpOiBpbnZhbGlkIG51bWJlciBvZiByb3dzIG9mIHRoZSByaWdodCBoYW5kIHNpZGUgbWF0cml4IGIiKTsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6c29sdmVfcmV0dmFsPEluY29tcGxldGVMVSwgUmhzPigqdGhpcywgYi5kZXJpdmVkKCkpOworICAgIH0KKworICBwcm90ZWN0ZWQ6CisgICAgRmFjdG9yVHlwZSBtX2x1OworICAgIGJvb2wgbV9pc0luaXRpYWxpemVkOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgX01hdHJpeFR5cGUsIHR5cGVuYW1lIFJocz4KK3N0cnVjdCBzb2x2ZV9yZXR2YWw8SW5jb21wbGV0ZUxVPF9NYXRyaXhUeXBlPiwgUmhzPgorICA6IHNvbHZlX3JldHZhbF9iYXNlPEluY29tcGxldGVMVTxfTWF0cml4VHlwZT4sIFJocz4KK3sKKyAgdHlwZWRlZiBJbmNvbXBsZXRlTFU8X01hdHJpeFR5cGU+IERlYzsKKyAgRUlHRU5fTUFLRV9TT0xWRV9IRUxQRVJTKERlYyxSaHMpCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4gdm9pZCBldmFsVG8oRGVzdCYgZHN0KSBjb25zdAorICB7CisgICAgZGVjKCkuX3NvbHZlKHJocygpLGRzdCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0lOQ09NUExFVEVfTFVfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvSXRlcmF0aW9uQ29udHJvbGxlci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvSXRlcmF0aW9uQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjQ2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9JdGVyYXRpb25Db250cm9sbGVyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisvKiBOT1RFIFRoZSBjbGFzcyBJdGVyYXRpb25Db250cm9sbGVyIGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgaXRlcmF0aW9uCisgKiAgICAgIGNsYXNzIG9mIHRoZSBHTU0rKyBhbmQgSVRMIGxpYnJhcmllcy4KKyAqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMQorLy8gQXV0aG9yczogQW5kcmV3IEx1bXNkYWluZSA8bHVtc0Bvc2wuaXUuZWR1PiAKKy8vICAgICAgICAgIExpZS1RdWFuIExlZSAgICAgPGxsZWVAb3NsLml1LmVkdT4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSXRlcmF0aXZlIFRlbXBsYXRlIExpYnJhcnkKKy8vCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIEFncmVlbWVudCBmb3IgdGhlCisvLyBJdGVyYXRpdmUgVGVtcGxhdGUgTGlicmFyeSBhbG9uZyB3aXRoIHRoZSBzb2Z0d2FyZTsgIHNlZSB0aGUKKy8vIGZpbGUgTElDRU5TRS4gIAorLy8KKy8vIFBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoZSBjb2RlIGFuZCB0byBkaXN0cmlidXRlIG1vZGlmaWVkIGNvZGUgaXMKKy8vIGdyYW50ZWQsIHByb3ZpZGVkIHRoZSB0ZXh0IG9mIHRoaXMgTk9USUNFIGlzIHJldGFpbmVkLCBhIG5vdGljZSB0aGF0CisvLyB0aGUgY29kZSB3YXMgbW9kaWZpZWQgaXMgaW5jbHVkZWQgd2l0aCB0aGUgYWJvdmUgQ09QWVJJR0hUIE5PVElDRSBhbmQKKy8vIHdpdGggdGhlIENPUFlSSUdIVCBOT1RJQ0UgaW4gdGhlIExJQ0VOU0UgZmlsZSwgYW5kIHRoYXQgdGhlIExJQ0VOU0UKKy8vIGZpbGUgaXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgbW9kaWZpZWQgY29kZS4KKy8vCisvLyBMSUNFTlNPUiBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELgorLy8gQnkgd2F5IG9mIGV4YW1wbGUsIGJ1dCBub3QgbGltaXRhdGlvbiwgTGljZW5zb3IgTUFLRVMgTk8KKy8vIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkKKy8vIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIExJQ0VOU0VEIFNPRlRXQVJFIENPTVBPTkVOVFMKKy8vIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MKKy8vIE9SIE9USEVSIFJJR0hUUy4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNyBZdmVzIFJlbmFyZAorLy8KKy8vIFRoaXMgZmlsZSBpcyBhIHBhcnQgb2YgR0VURkVNKysKKy8vCisvLyBHZXRmZW0rKyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworLy8gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLAorLy8gVVNBLgorLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9FaWdlbi9zcmMvQ29yZS91dGlsL05vbk1QTDIuaCIKKworI2lmbmRlZiBFSUdFTl9JVEVSQVRJT05fQ09OVFJPTExFUl9ICisjZGVmaW5lIEVJR0VOX0lURVJBVElPTl9DT05UUk9MTEVSX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBJdGVyYXRpdmVTb2x2ZXJzX01vZHVsZQorICAqIFxjbGFzcyBJdGVyYXRpb25Db250cm9sbGVyCisgICoKKyAgKiBcYnJpZWYgQ29udHJvbHMgdGhlIGl0ZXJhdGlvbnMgb2YgdGhlIGl0ZXJhdGl2ZSBzb2x2ZXJzCisgICoKKyAgKiBUaGlzIGNsYXNzIGhhcyBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgaXRlcmF0aW9uIGNsYXNzIG9mIEdNTSsrIGFuZCBJVEwgbGlicmFyaWVzLgorICAqCisgICovCitjbGFzcyBJdGVyYXRpb25Db250cm9sbGVyCit7CisgIHByb3RlY3RlZCA6CisgICAgZG91YmxlIG1fcmhzbjsgICAgICAgIC8vLzwgUmlnaHQgaGFuZCBzaWRlIG5vcm0KKyAgICBzaXplX3QgbV9tYXhpdGVyOyAgICAgLy8vPCBNYXguIG51bWJlciBvZiBpdGVyYXRpb25zCisgICAgaW50IG1fbm9pc2U7ICAgICAgICAgIC8vLzwgaWYgbm9pc2UgPiAwIGl0ZXJhdGlvbnMgYXJlIHByaW50ZWQKKyAgICBkb3VibGUgbV9yZXNtYXg7ICAgICAgLy8vPCBtYXhpbXVtIHJlc2lkdWFsCisgICAgZG91YmxlIG1fcmVzbWlucmVhY2gsIG1fcmVzYWRkOworICAgIHNpemVfdCBtX25pdDsgICAgICAgICAvLy88IGl0ZXJhdGlvbiBudW1iZXIKKyAgICBkb3VibGUgbV9yZXM7ICAgICAgICAgLy8vPCBsYXN0IGNvbXB1dGVkIHJlc2lkdWFsCisgICAgYm9vbCBtX3dyaXR0ZW47CisgICAgdm9pZCAoKm1fY2FsbGJhY2spKGNvbnN0IEl0ZXJhdGlvbkNvbnRyb2xsZXImKTsKKyAgcHVibGljIDoKKworICAgIHZvaWQgaW5pdCgpCisgICAgeworICAgICAgbV9uaXQgPSAwOyBtX3JlcyA9IDAuMDsgbV93cml0dGVuID0gZmFsc2U7CisgICAgICBtX3Jlc21pbnJlYWNoID0gMUU1MDsgbV9yZXNhZGQgPSAwLjA7CisgICAgICBtX2NhbGxiYWNrID0gMDsKKyAgICB9CisKKyAgICBJdGVyYXRpb25Db250cm9sbGVyKGRvdWJsZSByID0gMS4wRS04LCBpbnQgbm9pID0gMCwgc2l6ZV90IG1pdCA9IHNpemVfdCgtMSkpCisgICAgICA6IG1fcmhzbigxLjApLCBtX21heGl0ZXIobWl0KSwgbV9ub2lzZShub2kpLCBtX3Jlc21heChyKSB7IGluaXQoKTsgfQorCisgICAgdm9pZCBvcGVyYXRvciArKyhpbnQpIHsgbV9uaXQrKzsgbV93cml0dGVuID0gZmFsc2U7IG1fcmVzYWRkICs9IG1fcmVzOyB9CisgICAgdm9pZCBvcGVyYXRvciArKygpIHsgKCp0aGlzKSsrOyB9CisKKyAgICBib29sIGZpcnN0KCkgeyByZXR1cm4gbV9uaXQgPT0gMDsgfQorCisgICAgLyogZ2V0L3NldCB0aGUgIm5vaXN5bmVzcyIgKHZlcmJvc2l0eSkgb2YgdGhlIHNvbHZlcnMgKi8KKyAgICBpbnQgbm9pc2VMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIG1fbm9pc2U7IH0KKyAgICB2b2lkIHNldE5vaXNlTGV2ZWwoaW50IG4pIHsgbV9ub2lzZSA9IG47IH0KKyAgICB2b2lkIHJlZHVjZU5vaXNlTGV2ZWwoKSB7IGlmIChtX25vaXNlID4gMCkgbV9ub2lzZS0tOyB9CisKKyAgICBkb3VibGUgbWF4UmVzaWR1YWwoKSBjb25zdCB7IHJldHVybiBtX3Jlc21heDsgfQorICAgIHZvaWQgc2V0TWF4UmVzaWR1YWwoZG91YmxlIHIpIHsgbV9yZXNtYXggPSByOyB9CisKKyAgICBkb3VibGUgcmVzaWR1YWwoKSBjb25zdCB7IHJldHVybiBtX3JlczsgfQorCisgICAgLyogY2hhbmdlIHRoZSB1c2VyLWRlZmluYWJsZSBjYWxsYmFjaywgY2FsbGVkIGFmdGVyIGVhY2ggaXRlcmF0aW9uICovCisgICAgdm9pZCBzZXRDYWxsYmFjayh2b2lkICgqdCkoY29uc3QgSXRlcmF0aW9uQ29udHJvbGxlciYpKQorICAgIHsKKyAgICAgIG1fY2FsbGJhY2sgPSB0OworICAgIH0KKworICAgIHNpemVfdCBpdGVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtX25pdDsgfQorICAgIHZvaWQgc2V0SXRlcmF0aW9uKHNpemVfdCBpKSB7IG1fbml0ID0gaTsgfQorCisgICAgc2l6ZV90IG1heEl0ZXJhcmlvbnMoKSBjb25zdCB7IHJldHVybiBtX21heGl0ZXI7IH0KKyAgICB2b2lkIHNldE1heEl0ZXJhdGlvbnMoc2l6ZV90IGkpIHsgbV9tYXhpdGVyID0gaTsgfQorCisgICAgZG91YmxlIHJoc05vcm0oKSBjb25zdCB7IHJldHVybiBtX3Joc247IH0KKyAgICB2b2lkIHNldFJoc05vcm0oZG91YmxlIHIpIHsgbV9yaHNuID0gcjsgfQorCisgICAgYm9vbCBjb252ZXJnZWQoKSBjb25zdCB7IHJldHVybiBtX3JlcyA8PSBtX3Joc24gKiBtX3Jlc21heDsgfQorICAgIGJvb2wgY29udmVyZ2VkKGRvdWJsZSBucikKKyAgICB7CisgICAgICBtX3JlcyA9IGludGVybmFsOjphYnMobnIpOyAKKyAgICAgIG1fcmVzbWlucmVhY2ggPSAoc3RkOjptaW4pKG1fcmVzbWlucmVhY2gsIG1fcmVzKTsKKyAgICAgIHJldHVybiBjb252ZXJnZWQoKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4gYm9vbCBjb252ZXJnZWQoY29uc3QgVmVjdG9yVHlwZSAmdikKKyAgICB7IHJldHVybiBjb252ZXJnZWQodi5zcXVhcmVkTm9ybSgpKTsgfQorCisgICAgYm9vbCBmaW5pc2hlZChkb3VibGUgbnIpCisgICAgeworICAgICAgaWYgKG1fY2FsbGJhY2spIG1fY2FsbGJhY2soKnRoaXMpOworICAgICAgaWYgKG1fbm9pc2UgPiAwICYmICFtX3dyaXR0ZW4pCisgICAgICB7CisgICAgICAgIGNvbnZlcmdlZChucik7CisgICAgICAgIG1fd3JpdHRlbiA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gKG1fbml0ID49IG1fbWF4aXRlciB8fCBjb252ZXJnZWQobnIpKTsKKyAgICB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclR5cGU+CisgICAgYm9vbCBmaW5pc2hlZChjb25zdCBNYXRyaXhCYXNlPFZlY3RvclR5cGU+ICZ2KQorICAgIHsgcmV0dXJuIGZpbmlzaGVkKGRvdWJsZSh2LnNxdWFyZWROb3JtKCkpKTsgfQorCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX0lURVJBVElPTl9DT05UUk9MTEVSX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9JdGVyYXRpdmVTb2x2ZXJzL1NjYWxpbmcuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9JdGVyYXRpdmVTb2x2ZXJzL1NjYWxpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGVmMGFjCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0l0ZXJhdGl2ZVNvbHZlcnMvU2NhbGluZy5oCkBAIC0wLDAgKzEsMTg1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEZXNpcmUgTlVFTlRTQSBXQUtBTSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnIKKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU0NBTElOR19ICisjZGVmaW5lIEVJR0VOX1NDQUxJTkdfSAorLyoqCisgICogXGluZ3JvdXAgSXRlcmF0aXZlU29sdmVyc19Nb2R1bGUKKyAgKiBcYnJpZWYgaXRlcmF0aXZlIHNjYWxpbmcgYWxnb3JpdGhtIHRvIGVxdWlsaWJyYXRlIHJvd3MgYW5kIGNvbHVtbiBub3JtcyBpbiBtYXRyaWNlcworICAqIAorICAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYXMgYSBwcmVwcm9jZXNzaW5nIHRvb2wgdG8gYWNjZWxlcmF0ZSB0aGUgY29udmVyZ2VuY2Ugb2YgaXRlcmF0aXZlIG1ldGhvZHMgCisgICogCisgICogVGhpcyBmZWF0dXJlIGlzICB1c2VmdWwgdG8gbGltaXQgdGhlIHBpdm90aW5nIGFtb3VudCBkdXJpbmcgTFUvSUxVIGZhY3Rvcml6YXRpb24KKyAgKiBUaGUgIHNjYWxpbmcgc3RyYXRlZ3kgYXMgcHJlc2VudGVkIGhlcmUgcHJlc2VydmVzIHRoZSBzeW1tZXRyeSBvZiB0aGUgcHJvYmxlbQorICAqIE5PVEUgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBtYXRyaXggZG9lcyBub3QgaGF2ZSBlbXB0eSByb3cgb3IgY29sdW1uLCAKKyAgKiAKKyAgKiBFeGFtcGxlIHdpdGgga2V5IHN0ZXBzIAorICAqIFxjb2RlCisgICogVmVjdG9yWGQgeChuKSwgYihuKTsKKyAgKiBTcGFyc2VNYXRyaXg8ZG91YmxlPiBBOworICAqIC8vIGZpbGwgQSBhbmQgYjsKKyAgKiBTY2FsaW5nPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc2NhbDsgCisgICogLy8gQ29tcHV0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgc2NhbGluZyB2ZWN0b3JzLiBUaGUgbWF0cml4IGlzIGVxdWlsaWJyYXRlZCBhdCBvdXRwdXQKKyAgKiBzY2FsLmNvbXB1dGVSZWYoQSk7IAorICAqIC8vIFNjYWxlIHRoZSByaWdodCBoYW5kIHNpZGUKKyAgKiBiID0gc2NhbC5MZWZ0U2NhbGluZygpLmN3aXNlUHJvZHVjdChiKTsgCisgICogLy8gTm93LCBzb2x2ZSB0aGUgZXF1aWxpYnJhdGVkIGxpbmVhciBzeXN0ZW0gd2l0aCBhbnkgYXZhaWxhYmxlIHNvbHZlcgorICAqIAorICAqIC8vIFNjYWxlIGJhY2sgdGhlIGNvbXB1dGVkIHNvbHV0aW9uCisgICogeCA9IHNjYWwuUmlnaHRTY2FsaW5nKCkuY3dpc2VQcm9kdWN0KHgpOyAKKyAgKiBcZW5kY29kZQorICAqIAorICAqIFx0cGFyYW0gX01hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeC4gSXQgc2hvdWxkIGJlIGEgcmVhbCBzcXVhcmUgc3BhcnNlbWF0cml4CisgICogCisgICogUmVmZXJlbmNlcyA6IEQuIFJ1aXogYW5kIEIuIFVjYXIsIEEgU3ltbWV0cnkgUHJlc2VydmluZyBBbGdvcml0aG0gZm9yIE1hdHJpeCBTY2FsaW5nLCBJTlJJQSBSZXNlYXJjaCByZXBvcnQgUlItNzU1MgorICAqIAorICAqIFxzYSBccmVmIEluY29tcGxldGVMVVQgCisgICovCit1c2luZyBzdGQ6OmFiczsgCit1c2luZyBuYW1lc3BhY2UgRWlnZW47Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfTWF0cml4VHlwZT4KK2NsYXNzIFNjYWxpbmcKK3sKKyAgcHVibGljOgorICAgIHR5cGVkZWYgX01hdHJpeFR5cGUgTWF0cml4VHlwZTsgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgCisgIHB1YmxpYzoKKyAgICBTY2FsaW5nKCkgeyBpbml0KCk7IH0KKyAgICAKKyAgICBTY2FsaW5nKGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCkKKyAgICB7CisgICAgICBpbml0KCk7CisgICAgICBjb21wdXRlKG1hdHJpeCk7CisgICAgfQorICAgIAorICAgIH5TY2FsaW5nKCkgeyB9CisgICAgCisgICAgLyoqIAorICAgICAqIENvbXB1dGUgdGhlIGxlZnQgYW5kIHJpZ2h0IGRpYWdvbmFsIG1hdHJpY2VzIHRvIHNjYWxlIHRoZSBpbnB1dCBtYXRyaXggQHAgbWF0CisgICAgICogCisgICAgICogRklYTUUgVGhpcyBhbGdvcml0aG0gd2lsbCBiZSBtb2RpZmllZCBzdWNoIHRoYXQgdGhlIGRpYWdvbmFsIGVsZW1lbnRzIGFyZSBwZXJtdXRlZCBvbiB0aGUgZGlhZ29uYWwuIAorICAgICAqIAorICAgICAqIFxzYSBMZWZ0U2NhbGluZygpIFJpZ2h0U2NhbGluZygpCisgICAgICovCisgICAgdm9pZCBjb21wdXRlIChjb25zdCBNYXRyaXhUeXBlJiBtYXQpCisgICAgeworICAgICAgaW50IG0gPSBtYXQucm93cygpOyAKKyAgICAgIGludCBuID0gbWF0LmNvbHMoKTsKKyAgICAgIGFzc2VydCgobT4wICYmIG0gPT0gbikgJiYgIlBsZWFzZSBnaXZlIGEgbm9uIC0gZW1wdHkgbWF0cml4Iik7CisgICAgICBtX2xlZnQucmVzaXplKG0pOyAKKyAgICAgIG1fcmlnaHQucmVzaXplKG4pOworICAgICAgbV9sZWZ0LnNldE9uZXMoKTsKKyAgICAgIG1fcmlnaHQuc2V0T25lcygpOworICAgICAgbV9tYXRyaXggPSBtYXQ7CisgICAgICBWZWN0b3JYZCBEciwgRGMsIERyUmVzLCBEY1JlczsgLy8gVGVtcG9yYXJ5IExlZnQgYW5kIHJpZ2h0IHNjYWxpbmcgdmVjdG9ycworICAgICAgRHIucmVzaXplKG0pOyBEYy5yZXNpemUobik7CisgICAgICBEclJlcy5yZXNpemUobSk7IERjUmVzLnJlc2l6ZShuKTsKKyAgICAgIGRvdWJsZSBFcHNSb3cgPSAxLjAsIEVwc0NvbCA9IDEuMDsKKyAgICAgIGludCBpdHMgPSAwOyAKKyAgICAgIGRvCisgICAgICB7IC8vIEl0ZXJhdGUgdW50aWwgdGhlIGluZmluaXRlIG5vcm0gb2YgZWFjaCByb3cgYW5kIGNvbHVtbiBpcyBhcHByb3hpbWF0ZWx5IDEKKyAgICAgICAgLy8gR2V0IHRoZSBtYXhpbXVtIHZhbHVlIGluIGVhY2ggcm93IGFuZCBjb2x1bW4KKyAgICAgICAgRHIuc2V0WmVybygpOyBEYy5zZXRaZXJvKCk7CisgICAgICAgIGZvciAoaW50IGs9MDsgazxtX21hdHJpeC5vdXRlclNpemUoKTsgKytrKQorICAgICAgICB7CisgICAgICAgICAgZm9yICh0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KG1fbWF0cml4LCBrKTsgaXQ7ICsraXQpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBEcihpdC5yb3coKSkgPCBhYnMoaXQudmFsdWUoKSkgKQorICAgICAgICAgICAgICBEcihpdC5yb3coKSkgPSBhYnMoaXQudmFsdWUoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggRGMoaXQuY29sKCkpIDwgYWJzKGl0LnZhbHVlKCkpICkKKyAgICAgICAgICAgICAgRGMoaXQuY29sKCkpID0gYWJzKGl0LnZhbHVlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07ICsraSkgCisgICAgICAgIHsKKyAgICAgICAgICBEcihpKSA9IHN0ZDo6c3FydChEcihpKSk7CisgICAgICAgICAgRGMoaSkgPSBzdGQ6OnNxcnQoRGMoaSkpOworICAgICAgICB9CisgICAgICAgIC8vIFNhdmUgdGhlIHNjYWxpbmcgZmFjdG9ycyAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyArK2kpIAorICAgICAgICB7CisgICAgICAgICAgbV9sZWZ0KGkpIC89IERyKGkpOworICAgICAgICAgIG1fcmlnaHQoaSkgLz0gRGMoaSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2NhbGUgdGhlIHJvd3MgYW5kIHRoZSBjb2x1bW5zIG9mIHRoZSBtYXRyaXgKKyAgICAgICAgRHJSZXMuc2V0WmVybygpOyBEY1Jlcy5zZXRaZXJvKCk7IAorICAgICAgICBmb3IgKGludCBrPTA7IGs8bV9tYXRyaXgub3V0ZXJTaXplKCk7ICsraykKKyAgICAgICAgeworICAgICAgICAgIGZvciAodHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtX21hdHJpeCwgayk7IGl0OyArK2l0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGl0LnZhbHVlUmVmKCkgPSBpdC52YWx1ZSgpLyggRHIoaXQucm93KCkpICogRGMoaXQuY29sKCkpICk7CisgICAgICAgICAgICAvLyBBY2N1bXVsYXRlIHRoZSBub3JtcyBvZiB0aGUgcm93IGFuZCBjb2x1bW4gdmVjdG9ycyAgIAorICAgICAgICAgICAgaWYgKCBEclJlcyhpdC5yb3coKSkgPCBhYnMoaXQudmFsdWUoKSkgKQorICAgICAgICAgICAgICBEclJlcyhpdC5yb3coKSkgPSBhYnMoaXQudmFsdWUoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggRGNSZXMoaXQuY29sKCkpIDwgYWJzKGl0LnZhbHVlKCkpICkKKyAgICAgICAgICAgICAgRGNSZXMoaXQuY29sKCkpID0gYWJzKGl0LnZhbHVlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSAgCisgICAgICAgIERyUmVzLmFycmF5KCkgPSAoMS1EclJlcy5hcnJheSgpKS5hYnMoKTsKKyAgICAgICAgRXBzUm93ID0gRHJSZXMubWF4Q29lZmYoKTsKKyAgICAgICAgRGNSZXMuYXJyYXkoKSA9ICgxLURjUmVzLmFycmF5KCkpLmFicygpOworICAgICAgICBFcHNDb2wgPSBEY1Jlcy5tYXhDb2VmZigpOworICAgICAgICBpdHMrKzsKKyAgICAgIH13aGlsZSAoIChFcHNSb3cgPm1fdG9sIHx8IEVwc0NvbCA+IG1fdG9sKSAmJiAoaXRzIDwgbV9tYXhpdHMpICk7CisgICAgICBtX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKyAgICAvKiogQ29tcHV0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgdmVjdG9ycyB0byBzY2FsZSB0aGUgdmVjdG9ycworICAgICAqIHRoZSBpbnB1dCBtYXRyaXggaXMgc2NhbGVkIHdpdGggdGhlIGNvbXB1dGVkIHZlY3RvcnMgYXQgb3V0cHV0CisgICAgICogCisgICAgICogXHNhIGNvbXB1dGUoKQorICAgICAqLworICAgIHZvaWQgY29tcHV0ZVJlZiAoTWF0cml4VHlwZSYgbWF0KQorICAgIHsKKyAgICAgIGNvbXB1dGUgKG1hdCk7CisgICAgICBtYXQgPSBtX21hdHJpeDsKKyAgICB9CisgICAgLyoqIEdldCB0aGUgdmVjdG9yIHRvIHNjYWxlIHRoZSByb3dzIG9mIHRoZSBtYXRyaXggCisgICAgICovCisgICAgVmVjdG9yWGQmIExlZnRTY2FsaW5nKCkKKyAgICB7CisgICAgICByZXR1cm4gbV9sZWZ0OworICAgIH0KKyAgICAKKyAgICAvKiogR2V0IHRoZSB2ZWN0b3IgdG8gc2NhbGUgdGhlIGNvbHVtbnMgb2YgdGhlIG1hdHJpeCAKKyAgICAgKi8KKyAgICBWZWN0b3JYZCYgUmlnaHRTY2FsaW5nKCkKKyAgICB7CisgICAgICByZXR1cm4gbV9yaWdodDsKKyAgICB9CisgICAgCisgICAgLyoqIFNldCB0aGUgdG9sZXJhbmNlIGZvciB0aGUgY29udmVyZ2VuY2Ugb2YgdGhlIGl0ZXJhdGl2ZSBzY2FsaW5nIGFsZ29yaXRobQorICAgICAqLworICAgIHZvaWQgc2V0VG9sZXJhbmNlKGRvdWJsZSB0b2wpCisgICAgeworICAgICAgbV90b2wgPSB0b2w7IAorICAgIH0KKyAgICAgIAorICBwcm90ZWN0ZWQ6CisgICAgCisgICAgdm9pZCBpbml0KCkKKyAgICB7CisgICAgICBtX3RvbCA9IDFlLTEwOworICAgICAgbV9tYXhpdHMgPSA1OworICAgICAgbV9pc0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIE1hdHJpeFR5cGUgbV9tYXRyaXg7CisgICAgbXV0YWJsZSBDb21wdXRhdGlvbkluZm8gbV9pbmZvOyAKKyAgICBib29sIG1faXNJbml0aWFsaXplZDsgCisgICAgVmVjdG9yWGQgbV9sZWZ0OyAvLyBMZWZ0IHNjYWxpbmcgdmVjdG9yCisgICAgVmVjdG9yWGQgbV9yaWdodDsgLy8gbV9yaWdodCBzY2FsaW5nIHZlY3RvcgorICAgIGRvdWJsZSBtX3RvbDsgCisgICAgaW50IG1fbWF4aXRzOyAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGFsbG93ZWQKK307CisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Lcm9uZWNrZXJQcm9kdWN0L0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0tyb25lY2tlclByb2R1Y3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhZWZlYgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Lcm9uZWNrZXJQcm9kdWN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX0tyb25lY2tlclByb2R1Y3RfU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUworICAke0VpZ2VuX0tyb25lY2tlclByb2R1Y3RfU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvS3JvbmVja2VyUHJvZHVjdCBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0tyb25lY2tlclByb2R1Y3QvS3JvbmVja2VyVGVuc29yUHJvZHVjdC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL0tyb25lY2tlclByb2R1Y3QvS3JvbmVja2VyVGVuc29yUHJvZHVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmQ3MmYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvS3JvbmVja2VyUHJvZHVjdC9Lcm9uZWNrZXJUZW5zb3JQcm9kdWN0LmgKQEAgLTAsMCArMSwxNTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEtvbGphIEJyaXggPGJyaXhAaWdwbS5yd3RoLWFhY2hlbi5kZT4KKy8vIENvcHlyaWdodCAoQykgMjAxMSBBbmRyZWFzIFBsYXRlbiA8YW5kaXBsYXRlbkBnbXguZGU+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisKKyNpZm5kZWYgS1JPTkVDS0VSX1RFTlNPUl9QUk9EVUNUX0gKKyNkZWZpbmUgS1JPTkVDS0VSX1RFTlNPUl9QUk9EVUNUX0gKKworCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyohCisgKiBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3QgaGVscGVyIGZ1bmN0aW9uIGZvciBkZW5zZSBtYXRyaWNlcworICoKKyAqIFxwYXJhbSBBICAgRGVuc2UgbWF0cml4IEEKKyAqIFxwYXJhbSBCICAgRGVuc2UgbWF0cml4IEIKKyAqIFxwYXJhbSBBQl8gS3JvbmVja2VyIHRlbnNvciBwcm9kdWN0IG9mIEEgYW5kIEIKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZF9BLCB0eXBlbmFtZSBEZXJpdmVkX0IsIHR5cGVuYW1lIERlcml2ZWRfQUI+Cit2b2lkIGtyb25lY2tlclByb2R1Y3RfZnVsbChjb25zdCBEZXJpdmVkX0EmIEEsIGNvbnN0IERlcml2ZWRfQiYgQiwgRGVyaXZlZF9BQiAmIEFCKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgQXIgPSBBLnJvd3MoKSwKKyAgICAgICAgICAgICAgICAgICAgIEFjID0gQS5jb2xzKCksCisgICAgICAgICAgICAgICAgICAgICBCciA9IEIucm93cygpLAorICAgICAgICAgICAgICAgICAgICAgQmMgPSBCLmNvbHMoKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPEFyOyArK2kpCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaj0wOyBqPEFjOyArK2opCisgICAgICBBQi5ibG9jayhpKkJyLGoqQmMsQnIsQmMpID0gQShpLGopKkI7Cit9CisKKworLyohCisgKiBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3QgaGVscGVyIGZ1bmN0aW9uIGZvciBtYXRyaWNlcywgd2hlcmUgYXQgbGVhc3Qgb25lIGlzIHNwYXJzZQorICoKKyAqIFxwYXJhbSBBICAgTWF0cml4IEEKKyAqIFxwYXJhbSBCICAgTWF0cml4IEIKKyAqIFxwYXJhbSBBQl8gS3JvbmVja2VyIHRlbnNvciBwcm9kdWN0IG9mIEEgYW5kIEIKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZF9BLCB0eXBlbmFtZSBEZXJpdmVkX0IsIHR5cGVuYW1lIERlcml2ZWRfQUI+Cit2b2lkIGtyb25lY2tlclByb2R1Y3Rfc3BhcnNlKGNvbnN0IERlcml2ZWRfQSAmQSwgY29uc3QgRGVyaXZlZF9CICZCLCBEZXJpdmVkX0FCICZBQikKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IEFyID0gQS5yb3dzKCksCisgICAgICAgICAgICAgICAgICAgICBBYyA9IEEuY29scygpLAorICAgICAgICAgICAgICAgICAgICAgQnIgPSBCLnJvd3MoKSwKKyAgICAgICAgICAgICAgICAgICAgIEJjID0gQi5jb2xzKCk7CisgIEFCLnJlc2l6ZShBcipCcixBYypCYyk7CisgIEFCLnJlc2l6ZU5vblplcm9zKDApOworICBBQi5yZXNlcnZlKEEubm9uWmVyb3MoKSpCLm5vblplcm9zKCkpOworCisgIGZvciAoaW50IGtBPTA7IGtBPEEub3V0ZXJTaXplKCk7ICsra0EpCisgIHsKKyAgICBmb3IgKGludCBrQj0wOyBrQjxCLm91dGVyU2l6ZSgpOyArK2tCKQorICAgIHsKKyAgICAgIGZvciAodHlwZW5hbWUgRGVyaXZlZF9BOjpJbm5lckl0ZXJhdG9yIGl0QShBLGtBKTsgaXRBOyArK2l0QSkKKyAgICAgIHsKKyAgICAgICAgZm9yICh0eXBlbmFtZSBEZXJpdmVkX0I6OklubmVySXRlcmF0b3IgaXRCKEIsa0IpOyBpdEI7ICsraXRCKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGlBID0gaXRBLnJvdygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqQSA9IGl0QS5jb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUIgPSBpdEIucm93KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpCID0gaXRCLmNvbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICA9IGlBKkJyICsgaUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogID0gakEqQmMgKyBqQjsKKyAgICAgICAgICBBQi5pbnNlcnQoaSxqKSA9IGl0QS52YWx1ZSgpICogaXRCLnZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKKworCisvKiEKKyAqIENvbXB1dGVzIEtyb25lY2tlciB0ZW5zb3IgcHJvZHVjdCBvZiB0d28gZGVuc2UgbWF0cmljZXMKKyAqCisgKiBccGFyYW0gYSAgRGVuc2UgbWF0cml4IGEKKyAqIFxwYXJhbSBiICBEZW5zZSBtYXRyaXggYgorICogXHBhcmFtIGMgIEtyb25lY2tlciB0ZW5zb3IgcHJvZHVjdCBvZiBhIGFuZCBiCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEEsdHlwZW5hbWUgQix0eXBlbmFtZSBDU2NhbGFyLGludCBDUm93cyxpbnQgQ0NvbHMsIGludCBDT3B0aW9ucywgaW50IENNYXhSb3dzLCBpbnQgQ01heENvbHM+Cit2b2lkIGtyb25lY2tlclByb2R1Y3QoY29uc3QgTWF0cml4QmFzZTxBPiYgYSwgY29uc3QgTWF0cml4QmFzZTxCPiYgYiwgTWF0cml4PENTY2FsYXIsQ1Jvd3MsQ0NvbHMsQ09wdGlvbnMsQ01heFJvd3MsQ01heENvbHM+JiBjKQoreworICBjLnJlc2l6ZShhLnJvd3MoKSpiLnJvd3MoKSxhLmNvbHMoKSpiLmNvbHMoKSk7CisgIGludGVybmFsOjprcm9uZWNrZXJQcm9kdWN0X2Z1bGwoYS5kZXJpdmVkKCksIGIuZGVyaXZlZCgpLCBjKTsKK30KKworLyohCisgKiBDb21wdXRlcyBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3Qgb2YgdHdvIGRlbnNlIG1hdHJpY2VzCisgKgorICogUmVtYXJrOiB0aGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGNvbnN0IGNhc3QgaGFjayBhbmQgaGFzIGJlZW4KKyAqICAgICAgICAgaW1wbGVtZW50ZWQgdG8gbWFrZSB0aGUgZnVuY3Rpb24gY2FsbCBwb3NzaWJsZSwgd2hlcmUgdGhlCisgKiAgICAgICAgIG91dHB1dCBtYXRyaXggaXMgYSBzdWJtYXRyaXgsIGUuZy4KKyAqICAgICAgICAgICBrcm9uZWNrZXJQcm9kdWN0KEEsQixBQi5ibG9jaygyLDUsNiw2KSk7CisgKgorICogXHBhcmFtIGEgIERlbnNlIG1hdHJpeCBhCisgKiBccGFyYW0gYiAgRGVuc2UgbWF0cml4IGIKKyAqIFxwYXJhbSBjICBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3Qgb2YgYSBhbmQgYgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLHR5cGVuYW1lIEIsdHlwZW5hbWUgQz4KK3ZvaWQga3JvbmVja2VyUHJvZHVjdChjb25zdCBNYXRyaXhCYXNlPEE+JiBhLCBjb25zdCBNYXRyaXhCYXNlPEI+JiBiLCBNYXRyaXhCYXNlPEM+IGNvbnN0ICYgY18pCit7CisgIE1hdHJpeEJhc2U8Qz4mIGMgPSBjb25zdF9jYXN0PE1hdHJpeEJhc2U8Qz4mID4oY18pOworICBpbnRlcm5hbDo6a3JvbmVja2VyUHJvZHVjdF9mdWxsKGEuZGVyaXZlZCgpLCBiLmRlcml2ZWQoKSwgYy5kZXJpdmVkKCkpOworfQorCisvKiEKKyAqIENvbXB1dGVzIEtyb25lY2tlciB0ZW5zb3IgcHJvZHVjdCBvZiBhIGRlbnNlIGFuZCBhIHNwYXJzZSBtYXRyaXgKKyAqCisgKiBccGFyYW0gYSAgRGVuc2UgbWF0cml4IGEKKyAqIFxwYXJhbSBiICBTcGFyc2UgbWF0cml4IGIKKyAqIFxwYXJhbSBjICBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3Qgb2YgYSBhbmQgYgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLHR5cGVuYW1lIEIsdHlwZW5hbWUgQz4KK3ZvaWQga3JvbmVja2VyUHJvZHVjdChjb25zdCBNYXRyaXhCYXNlPEE+JiBhLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlPEI+JiBiLCBTcGFyc2VNYXRyaXhCYXNlPEM+JiBjKQoreworICBpbnRlcm5hbDo6a3JvbmVja2VyUHJvZHVjdF9zcGFyc2UoYS5kZXJpdmVkKCksIGIuZGVyaXZlZCgpLCBjLmRlcml2ZWQoKSk7Cit9CisKKy8qIQorICogQ29tcHV0ZXMgS3JvbmVja2VyIHRlbnNvciBwcm9kdWN0IG9mIGEgc3BhcnNlIGFuZCBhIGRlbnNlIG1hdHJpeAorICoKKyAqIFxwYXJhbSBhICBTcGFyc2UgbWF0cml4IGEKKyAqIFxwYXJhbSBiICBEZW5zZSBtYXRyaXggYgorICogXHBhcmFtIGMgIEtyb25lY2tlciB0ZW5zb3IgcHJvZHVjdCBvZiBhIGFuZCBiCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEEsdHlwZW5hbWUgQix0eXBlbmFtZSBDPgordm9pZCBrcm9uZWNrZXJQcm9kdWN0KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8QT4mIGEsIGNvbnN0IE1hdHJpeEJhc2U8Qj4mIGIsIFNwYXJzZU1hdHJpeEJhc2U8Qz4mIGMpCit7CisgIGludGVybmFsOjprcm9uZWNrZXJQcm9kdWN0X3NwYXJzZShhLmRlcml2ZWQoKSwgYi5kZXJpdmVkKCksIGMuZGVyaXZlZCgpKTsKK30KKworLyohCisgKiBDb21wdXRlcyBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3Qgb2YgdHdvIHNwYXJzZSBtYXRyaWNlcworICoKKyAqIFxwYXJhbSBhICBTcGFyc2UgbWF0cml4IGEKKyAqIFxwYXJhbSBiICBTcGFyc2UgbWF0cml4IGIKKyAqIFxwYXJhbSBjICBLcm9uZWNrZXIgdGVuc29yIHByb2R1Y3Qgb2YgYSBhbmQgYgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBBLHR5cGVuYW1lIEIsdHlwZW5hbWUgQz4KK3ZvaWQga3JvbmVja2VyUHJvZHVjdChjb25zdCBTcGFyc2VNYXRyaXhCYXNlPEE+JiBhLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlPEI+JiBiLCBTcGFyc2VNYXRyaXhCYXNlPEM+JiBjKQoreworICBpbnRlcm5hbDo6a3JvbmVja2VyUHJvZHVjdF9zcGFyc2UoYS5kZXJpdmVkKCksIGIuZGVyaXZlZCgpLCBjLmRlcml2ZWQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gS1JPTkVDS0VSX1RFTlNPUl9QUk9EVUNUX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvQ01ha2VMaXN0cy50eHQgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZGU2NGQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX01hdHJpeEZ1bmN0aW9uc19TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fTWF0cml4RnVuY3Rpb25zX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucyBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhFeHBvbmVudGlhbC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhFeHBvbmVudGlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjkxNjcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeEV4cG9uZW50aWFsLmgKQEAgLTAsMCArMSw0NTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQ2hlbi1QYW5nIEhlIDxqZGg4QG1zNjMuaGluZXQubmV0PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NQVRSSVhfRVhQT05FTlRJQUwKKyNkZWZpbmUgRUlHRU5fTUFUUklYX0VYUE9ORU5USUFMCisKKyNpbmNsdWRlICJTdGVtRnVuY3Rpb24uaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPiBTY2FsYXIgbG9nMihTY2FsYXIgdikgeyB1c2luZyBzdGQ6OmxvZzsgcmV0dXJuIGxvZyh2KS9sb2coU2NhbGFyKDIpKTsgfQorI2VuZGlmCisKKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKiBcYnJpZWYgQ2xhc3MgZm9yIGNvbXB1dGluZyB0aGUgbWF0cml4IGV4cG9uZW50aWFsLgorICAqIFx0cGFyYW0gTWF0cml4VHlwZSB0eXBlIG9mIHRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwsCisgICogZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4IGNsYXNzIHRlbXBsYXRlLgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBNYXRyaXhFeHBvbmVudGlhbCB7CisKKyAgcHVibGljOgorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3Rvci4KKyAgICAgICogCisgICAgICAqIFRoZSBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gXHAgTSwgc28gaXQgc2hvdWxkIG5vdCBiZQorICAgICAgKiBjaGFuZ2VkIChvciBkZXN0cm95ZWQpIGJlZm9yZSBjb21wdXRlKCkgaXMgY2FsbGVkLgorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dIE0gIG1hdHJpeCB3aG9zZSBleHBvbmVudGlhbCBpcyB0byBiZSBjb21wdXRlZC4KKyAgICAgICovCisgICAgTWF0cml4RXhwb25lbnRpYWwoY29uc3QgTWF0cml4VHlwZSAmTSk7CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGVzIHRoZSBtYXRyaXggZXhwb25lbnRpYWwuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtvdXRdIHJlc3VsdCAgdGhlIG1hdHJpeCBleHBvbmVudGlhbCBvZiBccCBNIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+IAorICAgIHZvaWQgY29tcHV0ZShSZXN1bHRUeXBlICZyZXN1bHQpOworCisgIHByaXZhdGU6CisKKyAgICAvLyBQcmV2ZW50IGNvcHlpbmcKKyAgICBNYXRyaXhFeHBvbmVudGlhbChjb25zdCBNYXRyaXhFeHBvbmVudGlhbCYpOworICAgIE1hdHJpeEV4cG9uZW50aWFsJiBvcGVyYXRvcj0oY29uc3QgTWF0cml4RXhwb25lbnRpYWwmKTsKKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgKDMsMyktUGFkJmVhY3V0ZTsgYXBwcm94aW1hbnQgdG8gdGhlIGV4cG9uZW50aWFsLgorICAgICAqCisgICAgICogIEFmdGVyIGV4aXQsIFxmJCAoVitVKShWLVUpXnstMX0gXGYkIGlzIHRoZSBQYWQmZWFjdXRlOworICAgICAqICBhcHByb3hpbWFudCBvZiBcZiQgXGV4cChBKSBcZiQgYXJvdW5kIFxmJCBBID0gMCBcZiQuCisgICAgICoKKyAgICAgKiAgXHBhcmFtW2luXSBBICAgQXJndW1lbnQgb2YgbWF0cml4IGV4cG9uZW50aWFsCisgICAgICovCisgICAgdm9pZCBwYWRlMyhjb25zdCBNYXRyaXhUeXBlICZBKTsKKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgKDUsNSktUGFkJmVhY3V0ZTsgYXBwcm94aW1hbnQgdG8gdGhlIGV4cG9uZW50aWFsLgorICAgICAqCisgICAgICogIEFmdGVyIGV4aXQsIFxmJCAoVitVKShWLVUpXnstMX0gXGYkIGlzIHRoZSBQYWQmZWFjdXRlOworICAgICAqICBhcHByb3hpbWFudCBvZiBcZiQgXGV4cChBKSBcZiQgYXJvdW5kIFxmJCBBID0gMCBcZiQuCisgICAgICoKKyAgICAgKiAgXHBhcmFtW2luXSBBICAgQXJndW1lbnQgb2YgbWF0cml4IGV4cG9uZW50aWFsCisgICAgICovCisgICAgdm9pZCBwYWRlNShjb25zdCBNYXRyaXhUeXBlICZBKTsKKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgKDcsNyktUGFkJmVhY3V0ZTsgYXBwcm94aW1hbnQgdG8gdGhlIGV4cG9uZW50aWFsLgorICAgICAqCisgICAgICogIEFmdGVyIGV4aXQsIFxmJCAoVitVKShWLVUpXnstMX0gXGYkIGlzIHRoZSBQYWQmZWFjdXRlOworICAgICAqICBhcHByb3hpbWFudCBvZiBcZiQgXGV4cChBKSBcZiQgYXJvdW5kIFxmJCBBID0gMCBcZiQuCisgICAgICoKKyAgICAgKiAgXHBhcmFtW2luXSBBICAgQXJndW1lbnQgb2YgbWF0cml4IGV4cG9uZW50aWFsCisgICAgICovCisgICAgdm9pZCBwYWRlNyhjb25zdCBNYXRyaXhUeXBlICZBKTsKKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgKDksOSktUGFkJmVhY3V0ZTsgYXBwcm94aW1hbnQgdG8gdGhlIGV4cG9uZW50aWFsLgorICAgICAqCisgICAgICogIEFmdGVyIGV4aXQsIFxmJCAoVitVKShWLVUpXnstMX0gXGYkIGlzIHRoZSBQYWQmZWFjdXRlOworICAgICAqICBhcHByb3hpbWFudCBvZiBcZiQgXGV4cChBKSBcZiQgYXJvdW5kIFxmJCBBID0gMCBcZiQuCisgICAgICoKKyAgICAgKiAgXHBhcmFtW2luXSBBICAgQXJndW1lbnQgb2YgbWF0cml4IGV4cG9uZW50aWFsCisgICAgICovCisgICAgdm9pZCBwYWRlOShjb25zdCBNYXRyaXhUeXBlICZBKTsKKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgKDEzLDEzKS1QYWQmZWFjdXRlOyBhcHByb3hpbWFudCB0byB0aGUgZXhwb25lbnRpYWwuCisgICAgICoKKyAgICAgKiAgQWZ0ZXIgZXhpdCwgXGYkIChWK1UpKFYtVSleey0xfSBcZiQgaXMgdGhlIFBhZCZlYWN1dGU7CisgICAgICogIGFwcHJveGltYW50IG9mIFxmJCBcZXhwKEEpIFxmJCBhcm91bmQgXGYkIEEgPSAwIFxmJC4KKyAgICAgKgorICAgICAqICBccGFyYW1baW5dIEEgICBBcmd1bWVudCBvZiBtYXRyaXggZXhwb25lbnRpYWwKKyAgICAgKi8KKyAgICB2b2lkIHBhZGUxMyhjb25zdCBNYXRyaXhUeXBlICZBKTsKKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgKDE3LDE3KS1QYWQmZWFjdXRlOyBhcHByb3hpbWFudCB0byB0aGUgZXhwb25lbnRpYWwuCisgICAgICoKKyAgICAgKiAgQWZ0ZXIgZXhpdCwgXGYkIChWK1UpKFYtVSleey0xfSBcZiQgaXMgdGhlIFBhZCZlYWN1dGU7CisgICAgICogIGFwcHJveGltYW50IG9mIFxmJCBcZXhwKEEpIFxmJCBhcm91bmQgXGYkIEEgPSAwIFxmJC4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIGFjdGl2YXRlcyBvbmx5IGlmIHlvdXIgbG9uZyBkb3VibGUgaXMgZG91YmxlLWRvdWJsZSBvciBxdWFkcnVwbGUuCisgICAgICoKKyAgICAgKiAgXHBhcmFtW2luXSBBICAgQXJndW1lbnQgb2YgbWF0cml4IGV4cG9uZW50aWFsCisgICAgICovCisgICAgdm9pZCBwYWRlMTcoY29uc3QgTWF0cml4VHlwZSAmQSk7CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGUgUGFkJmVhY3V0ZTsgYXBwcm94aW1hbnQgdG8gdGhlIGV4cG9uZW50aWFsLgorICAgICAqCisgICAgICogQ29tcHV0ZXMgXGMgbV9VLCBcYyBtX1YgYW5kIFxjIG1fc3F1YXJpbmdzIHN1Y2ggdGhhdAorICAgICAqIFxmJCAoVitVKShWLVUpXnstMX0gXGYkIGlzIGEgUGFkJmVhY3V0ZTsgb2YKKyAgICAgKiBcZiQgXGV4cCgyXnstXG1ib3h7c3F1YXJpbmdzfX1NKSBcZiQgYXJvdW5kIFxmJCBNID0gMCBcZiQuIFRoZQorICAgICAqIGRlZ3JlZSBvZiB0aGUgUGFkJmVhY3V0ZTsgYXBwcm94aW1hbnQgYW5kIHRoZSB2YWx1ZSBvZgorICAgICAqIHNxdWFyaW5ncyBhcmUgY2hvc2VuIHN1Y2ggdGhhdCB0aGUgYXBwcm94aW1hdGlvbiBlcnJvciBpcyBubworICAgICAqIG1vcmUgdGhhbiB0aGUgcm91bmQtb2ZmIGVycm9yLgorICAgICAqCisgICAgICogVGhlIGFyZ3VtZW50IG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGNvcnJlc3BvbmQgd2l0aCB0aGUgKHJlYWwKKyAgICAgKiBwYXJ0IG9mKSB0aGUgZW50cmllcyBvZiBcYyBtX00uICBJdCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUKKyAgICAgKiBjb3JyZWN0IGltcGxlbWVudGF0aW9uIHVzaW5nIG92ZXJsb2FkaW5nLgorICAgICAqLworICAgIHZvaWQgY29tcHV0ZVVWKGRvdWJsZSk7CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGUgUGFkJmVhY3V0ZTsgYXBwcm94aW1hbnQgdG8gdGhlIGV4cG9uZW50aWFsLgorICAgICAqCisgICAgICogIFxzYSBjb21wdXRlVVYoZG91YmxlKTsKKyAgICAgKi8KKyAgICB2b2lkIGNvbXB1dGVVVihmbG9hdCk7CisgICAgCisgICAgLyoqIFxicmllZiBDb21wdXRlIFBhZCZlYWN1dGU7IGFwcHJveGltYW50IHRvIHRoZSBleHBvbmVudGlhbC4KKyAgICAgKgorICAgICAqICBcc2EgY29tcHV0ZVVWKGRvdWJsZSk7CisgICAgICovCisgICAgdm9pZCBjb21wdXRlVVYobG9uZyBkb3VibGUpOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiBDb21wbGV4U2NhbGFyOworCisgICAgLyoqIFxicmllZiBSZWZlcmVuY2UgdG8gbWF0cml4IHdob3NlIGV4cG9uZW50aWFsIGlzIHRvIGJlIGNvbXB1dGVkLiAqLworICAgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWQ8TWF0cml4VHlwZT46OnR5cGUgbV9NOworCisgICAgLyoqIFxicmllZiBPZGQtZGVncmVlIHRlcm1zIGluIG51bWVyYXRvciBvZiBQYWQmZWFjdXRlOyBhcHByb3hpbWFudC4gKi8KKyAgICBNYXRyaXhUeXBlIG1fVTsKKworICAgIC8qKiBcYnJpZWYgRXZlbi1kZWdyZWUgdGVybXMgaW4gbnVtZXJhdG9yIG9mIFBhZCZlYWN1dGU7IGFwcHJveGltYW50LiAqLworICAgIE1hdHJpeFR5cGUgbV9WOworCisgICAgLyoqIFxicmllZiBVc2VkIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZS4gKi8KKyAgICBNYXRyaXhUeXBlIG1fdG1wMTsKKworICAgIC8qKiBcYnJpZWYgVXNlZCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UuICovCisgICAgTWF0cml4VHlwZSBtX3RtcDI7CisKKyAgICAvKiogXGJyaWVmIElkZW50aXR5IG1hdHJpeCBvZiB0aGUgc2FtZSBzaXplIGFzIFxjIG1fTS4gKi8KKyAgICBNYXRyaXhUeXBlIG1fSWQ7CisKKyAgICAvKiogXGJyaWVmIE51bWJlciBvZiBzcXVhcmluZ3MgcmVxdWlyZWQgaW4gdGhlIGxhc3Qgc3RlcC4gKi8KKyAgICBpbnQgbV9zcXVhcmluZ3M7CisKKyAgICAvKiogXGJyaWVmIEwxIG5vcm0gb2YgbV9NLiAqLworICAgIFJlYWxTY2FsYXIgbV9sMW5vcm07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeEV4cG9uZW50aWFsPE1hdHJpeFR5cGU+OjpNYXRyaXhFeHBvbmVudGlhbChjb25zdCBNYXRyaXhUeXBlICZNKSA6CisgIG1fTShNKSwKKyAgbV9VKE0ucm93cygpLE0uY29scygpKSwKKyAgbV9WKE0ucm93cygpLE0uY29scygpKSwKKyAgbV90bXAxKE0ucm93cygpLE0uY29scygpKSwKKyAgbV90bXAyKE0ucm93cygpLE0uY29scygpKSwKKyAgbV9JZChNYXRyaXhUeXBlOjpJZGVudGl0eShNLnJvd3MoKSwgTS5jb2xzKCkpKSwKKyAgbV9zcXVhcmluZ3MoMCksCisgIG1fbDFub3JtKE0uY3dpc2VBYnMoKS5jb2x3aXNlKCkuc3VtKCkubWF4Q29lZmYoKSkKK3sKKyAgLyogZW1wdHkgYm9keSAqLworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUeXBlPiAKK3ZvaWQgTWF0cml4RXhwb25lbnRpYWw8TWF0cml4VHlwZT46OmNvbXB1dGUoUmVzdWx0VHlwZSAmcmVzdWx0KQoreworI2lmIExEQkxfTUFOVF9ESUcgPiAxMTIgLy8gcmFyZWx5IGhhcHBlbnMKKyAgaWYoc2l6ZW9mKFJlYWxTY2FsYXIpID4gMTQpIHsKKyAgICByZXN1bHQgPSBtX00ubWF0cml4RnVuY3Rpb24oU3RkU3RlbUZ1bmN0aW9uczxDb21wbGV4U2NhbGFyPjo6ZXhwKTsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorICBjb21wdXRlVVYoUmVhbFNjYWxhcigpKTsKKyAgbV90bXAxID0gbV9VICsgbV9WOyAgIC8vIG51bWVyYXRvciBvZiBQYWRlIGFwcHJveGltYW50CisgIG1fdG1wMiA9IC1tX1UgKyBtX1Y7ICAvLyBkZW5vbWluYXRvciBvZiBQYWRlIGFwcHJveGltYW50CisgIHJlc3VsdCA9IG1fdG1wMi5wYXJ0aWFsUGl2THUoKS5zb2x2ZShtX3RtcDEpOworICBmb3IgKGludCBpPTA7IGk8bV9zcXVhcmluZ3M7IGkrKykKKyAgICByZXN1bHQgKj0gcmVzdWx0OyAgIC8vIHVuZG8gc2NhbGluZyBieSByZXBlYXRlZCBzcXVhcmluZworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBNYXRyaXhFeHBvbmVudGlhbDxNYXRyaXhUeXBlPjo6cGFkZTMoY29uc3QgTWF0cml4VHlwZSAmQSkKK3sKKyAgY29uc3QgUmVhbFNjYWxhciBiW10gPSB7MTIwLiwgNjAuLCAxMi4sIDEufTsKKyAgbV90bXAxLm5vYWxpYXMoKSA9IEEgKiBBOworICBtX3RtcDIgPSBiWzNdKm1fdG1wMSArIGJbMV0qbV9JZDsKKyAgbV9VLm5vYWxpYXMoKSA9IEEgKiBtX3RtcDI7CisgIG1fViA9IGJbMl0qbV90bXAxICsgYlswXSptX0lkOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBNYXRyaXhFeHBvbmVudGlhbDxNYXRyaXhUeXBlPjo6cGFkZTUoY29uc3QgTWF0cml4VHlwZSAmQSkKK3sKKyAgY29uc3QgUmVhbFNjYWxhciBiW10gPSB7MzAyNDAuLCAxNTEyMC4sIDMzNjAuLCA0MjAuLCAzMC4sIDEufTsKKyAgTWF0cml4VHlwZSBBMiA9IEEgKiBBOworICBtX3RtcDEubm9hbGlhcygpID0gQTIgKiBBMjsKKyAgbV90bXAyID0gYls1XSptX3RtcDEgKyBiWzNdKkEyICsgYlsxXSptX0lkOworICBtX1Uubm9hbGlhcygpID0gQSAqIG1fdG1wMjsKKyAgbV9WID0gYls0XSptX3RtcDEgKyBiWzJdKkEyICsgYlswXSptX0lkOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0VJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCBNYXRyaXhFeHBvbmVudGlhbDxNYXRyaXhUeXBlPjo6cGFkZTcoY29uc3QgTWF0cml4VHlwZSAmQSkKK3sKKyAgY29uc3QgUmVhbFNjYWxhciBiW10gPSB7MTcyOTcyODAuLCA4NjQ4NjQwLiwgMTk5NTg0MC4sIDI3NzIwMC4sIDI1MjAwLiwgMTUxMi4sIDU2LiwgMS59OworICBNYXRyaXhUeXBlIEEyID0gQSAqIEE7CisgIE1hdHJpeFR5cGUgQTQgPSBBMiAqIEEyOworICBtX3RtcDEubm9hbGlhcygpID0gQTQgKiBBMjsKKyAgbV90bXAyID0gYls3XSptX3RtcDEgKyBiWzVdKkE0ICsgYlszXSpBMiArIGJbMV0qbV9JZDsKKyAgbV9VLm5vYWxpYXMoKSA9IEEgKiBtX3RtcDI7CisgIG1fViA9IGJbNl0qbV90bXAxICsgYls0XSpBNCArIGJbMl0qQTIgKyBiWzBdKm1fSWQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorRUlHRU5fU1RST05HX0lOTElORSB2b2lkIE1hdHJpeEV4cG9uZW50aWFsPE1hdHJpeFR5cGU+OjpwYWRlOShjb25zdCBNYXRyaXhUeXBlICZBKQoreworICBjb25zdCBSZWFsU2NhbGFyIGJbXSA9IHsxNzY0MzIyNTYwMC4sIDg4MjE2MTI4MDAuLCAyMDc1NjczNjAwLiwgMzAyNzAyNDAwLiwgMzAyNzAyNDAuLAorICAJCSAgICAgIDIxNjIxNjAuLCAxMTA4ODAuLCAzOTYwLiwgOTAuLCAxLn07CisgIE1hdHJpeFR5cGUgQTIgPSBBICogQTsKKyAgTWF0cml4VHlwZSBBNCA9IEEyICogQTI7CisgIE1hdHJpeFR5cGUgQTYgPSBBNCAqIEEyOworICBtX3RtcDEubm9hbGlhcygpID0gQTYgKiBBMjsKKyAgbV90bXAyID0gYls5XSptX3RtcDEgKyBiWzddKkE2ICsgYls1XSpBNCArIGJbM10qQTIgKyBiWzFdKm1fSWQ7CisgIG1fVS5ub2FsaWFzKCkgPSBBICogbV90bXAyOworICBtX1YgPSBiWzhdKm1fdG1wMSArIGJbNl0qQTYgKyBiWzRdKkE0ICsgYlsyXSpBMiArIGJbMF0qbV9JZDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitFSUdFTl9TVFJPTkdfSU5MSU5FIHZvaWQgTWF0cml4RXhwb25lbnRpYWw8TWF0cml4VHlwZT46OnBhZGUxMyhjb25zdCBNYXRyaXhUeXBlICZBKQoreworICBjb25zdCBSZWFsU2NhbGFyIGJbXSA9IHs2NDc2NDc1MjUzMjQ4MDAwMC4sIDMyMzgyMzc2MjY2MjQwMDAwLiwgNzc3MTc3MDMwMzg5NzYwMC4sCisgIAkJICAgICAgMTE4NzM1Mzc5NjQyODgwMC4sIDEyOTA2MDE5NTI2NDAwMC4sIDEwNTU5NDcwNTIxNjAwLiwgNjcwNDQyNTcyODAwLiwKKyAgCQkgICAgICAzMzUyMjEyODY0MC4sIDEzMjMyNDE5MjAuLCA0MDg0MDgwMC4sIDk2MDk2MC4sIDE2MzgwLiwgMTgyLiwgMS59OworICBNYXRyaXhUeXBlIEEyID0gQSAqIEE7CisgIE1hdHJpeFR5cGUgQTQgPSBBMiAqIEEyOworICBtX3RtcDEubm9hbGlhcygpID0gQTQgKiBBMjsKKyAgbV9WID0gYlsxM10qbV90bXAxICsgYlsxMV0qQTQgKyBiWzldKkEyOyAvLyB1c2VkIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQorICBtX3RtcDIubm9hbGlhcygpID0gbV90bXAxICogbV9WOworICBtX3RtcDIgKz0gYls3XSptX3RtcDEgKyBiWzVdKkE0ICsgYlszXSpBMiArIGJbMV0qbV9JZDsKKyAgbV9VLm5vYWxpYXMoKSA9IEEgKiBtX3RtcDI7CisgIG1fdG1wMiA9IGJbMTJdKm1fdG1wMSArIGJbMTBdKkE0ICsgYls4XSpBMjsKKyAgbV9WLm5vYWxpYXMoKSA9IG1fdG1wMSAqIG1fdG1wMjsKKyAgbV9WICs9IGJbNl0qbV90bXAxICsgYls0XSpBNCArIGJbMl0qQTIgKyBiWzBdKm1fSWQ7Cit9CisKKyNpZiBMREJMX01BTlRfRElHID4gNjQKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorRUlHRU5fU1RST05HX0lOTElORSB2b2lkIE1hdHJpeEV4cG9uZW50aWFsPE1hdHJpeFR5cGU+OjpwYWRlMTcoY29uc3QgTWF0cml4VHlwZSAmQSkKK3sKKyAgY29uc3QgUmVhbFNjYWxhciBiW10gPSB7ODMwMDM0Mzk0NTgwNjI4MzU3MTIwMDAwLkwsIDQxNTAxNzE5NzI5MDMxNDE3ODU2MDAwMC5MLAorICAgICAgICAgICAgMTAwNjEwMjI5NjQ2MTM2NzcwNTYwMDAwLkwsIDE1NzIwMzQ4MzgyMjA4ODcwNDAwMDAwLkwsCisgICAgICAgICAgICAxNzc0ODc4MDQzMTUyNjE0NDAwMDAwLkwsIDE1MzgyMjc2MzczOTg5MzI0ODAwMC5MLCAxMDYwODQ2NjQ2NDgyMDIyNDAwMC5MLAorICAgICAgICAgICAgNTk1MzczMTE3OTIzNTg0MDAwLkwsIDI3NTYzNTcwMjc0MjQwMDAwLkwsIDEwNjAxMzczMTgyNDAwMDAuTCwKKyAgICAgICAgICAgIDMzOTI0Mzk0MTgzNjgwLkwsIDg5OTUxMDQ1MTg0MC5MLCAxOTU1NDU3NTA0MC5MLCAzNDE4NjMyMDAuTCwgNDY1MTIwMC5MLAorICAgICAgICAgICAgNDY1MTIuTCwgMzA2LkwsIDEuTH07CisgIE1hdHJpeFR5cGUgQTIgPSBBICogQTsKKyAgTWF0cml4VHlwZSBBNCA9IEEyICogQTI7CisgIE1hdHJpeFR5cGUgQTYgPSBBNCAqIEEyOworICBtX3RtcDEubm9hbGlhcygpID0gQTQgKiBBNDsKKyAgbV9WID0gYlsxN10qbV90bXAxICsgYlsxNV0qQTYgKyBiWzEzXSpBNCArIGJbMTFdKkEyOyAvLyB1c2VkIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZQorICBtX3RtcDIubm9hbGlhcygpID0gbV90bXAxICogbV9WOworICBtX3RtcDIgKz0gYls5XSptX3RtcDEgKyBiWzddKkE2ICsgYls1XSpBNCArIGJbM10qQTIgKyBiWzFdKm1fSWQ7CisgIG1fVS5ub2FsaWFzKCkgPSBBICogbV90bXAyOworICBtX3RtcDIgPSBiWzE2XSptX3RtcDEgKyBiWzE0XSpBNiArIGJbMTJdKkE0ICsgYlsxMF0qQTI7CisgIG1fVi5ub2FsaWFzKCkgPSBtX3RtcDEgKiBtX3RtcDI7CisgIG1fViArPSBiWzhdKm1fdG1wMSArIGJbNl0qQTYgKyBiWzRdKkE0ICsgYlsyXSpBMiArIGJbMF0qbV9JZDsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgTWF0cml4RXhwb25lbnRpYWw8TWF0cml4VHlwZT46OmNvbXB1dGVVVihmbG9hdCkKK3sKKyAgdXNpbmcgc3RkOjptYXg7CisgIHVzaW5nIHN0ZDo6cG93OworICB1c2luZyBzdGQ6OmNlaWw7CisgIGlmIChtX2wxbm9ybSA8IDQuMjU4NzMwMDE2OTIyODMxZS0wMDEpIHsKKyAgICBwYWRlMyhtX00pOworICB9IGVsc2UgaWYgKG1fbDFub3JtIDwgMS44ODAxNTI2Nzc4MDQ3NjJlKzAwMCkgeworICAgIHBhZGU1KG1fTSk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgZmxvYXQgbWF4bm9ybSA9IDMuOTI1NzI0NzgzMTM4NjYwZjsKKyAgICBtX3NxdWFyaW5ncyA9IChtYXgpKDAsIChpbnQpY2VpbChsb2cyKG1fbDFub3JtIC8gbWF4bm9ybSkpKTsKKyAgICBNYXRyaXhUeXBlIEEgPSBtX00gLyBwb3coU2NhbGFyKDIpLCBtX3NxdWFyaW5ncyk7CisgICAgcGFkZTcoQSk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeEV4cG9uZW50aWFsPE1hdHJpeFR5cGU+Ojpjb21wdXRlVVYoZG91YmxlKQoreworICB1c2luZyBzdGQ6Om1heDsKKyAgdXNpbmcgc3RkOjpwb3c7CisgIHVzaW5nIHN0ZDo6Y2VpbDsKKyAgaWYgKG1fbDFub3JtIDwgMS40OTU1ODUyMTc5NTgyOTJlLTAwMikgeworICAgIHBhZGUzKG1fTSk7CisgIH0gZWxzZSBpZiAobV9sMW5vcm0gPCAyLjUzOTM5ODMzMDA2MzIzMGUtMDAxKSB7CisgICAgcGFkZTUobV9NKTsKKyAgfSBlbHNlIGlmIChtX2wxbm9ybSA8IDkuNTA0MTc4OTk2MTYyOTMyZS0wMDEpIHsKKyAgICBwYWRlNyhtX00pOworICB9IGVsc2UgaWYgKG1fbDFub3JtIDwgMi4wOTc4NDc5NjEyNTcwNjhlKzAwMCkgeworICAgIHBhZGU5KG1fTSk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgZG91YmxlIG1heG5vcm0gPSA1LjM3MTkyMDM1MTE0ODE1MjsKKyAgICBtX3NxdWFyaW5ncyA9IChtYXgpKDAsIChpbnQpY2VpbChsb2cyKG1fbDFub3JtIC8gbWF4bm9ybSkpKTsKKyAgICBNYXRyaXhUeXBlIEEgPSBtX00gLyBwb3coU2NhbGFyKDIpLCBtX3NxdWFyaW5ncyk7CisgICAgcGFkZTEzKEEpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBNYXRyaXhFeHBvbmVudGlhbDxNYXRyaXhUeXBlPjo6Y29tcHV0ZVVWKGxvbmcgZG91YmxlKQoreworICB1c2luZyBzdGQ6Om1heDsKKyAgdXNpbmcgc3RkOjpwb3c7CisgIHVzaW5nIHN0ZDo6Y2VpbDsKKyNpZiAgIExEQkxfTUFOVF9ESUcgPT0gNTMgICAvLyBkb3VibGUgcHJlY2lzaW9uCisgIGNvbXB1dGVVVihkb3VibGUoKSk7CisjZWxpZiBMREJMX01BTlRfRElHIDw9IDY0ICAgLy8gZXh0ZW5kZWQgcHJlY2lzaW9uCisgIGlmIChtX2wxbm9ybSA8IDQuMTk2ODQ5NzIzMjI2Njk4OTY3MWUtMDAzTCkgeworICAgIHBhZGUzKG1fTSk7CisgIH0gZWxzZSBpZiAobV9sMW5vcm0gPCAxLjE4NDgxMTY3MzQ2OTM4MjMwOTFlLTAwMUwpIHsKKyAgICBwYWRlNShtX00pOworICB9IGVsc2UgaWYgKG1fbDFub3JtIDwgNS41MTcwMzg4NDgwNjg2NzAwMjc0ZS0wMDFMKSB7CisgICAgcGFkZTcobV9NKTsKKyAgfSBlbHNlIGlmIChtX2wxbm9ybSA8IDEuMzc1OTg2ODg3NTU4Nzg0NTM4M2UrMDAwTCkgeworICAgIHBhZGU5KG1fTSk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgbG9uZyBkb3VibGUgbWF4bm9ybSA9IDQuMDI0NjA5ODkwNjY5NzM1MzA2M0w7CisgICAgbV9zcXVhcmluZ3MgPSAobWF4KSgwLCAoaW50KWNlaWwobG9nMihtX2wxbm9ybSAvIG1heG5vcm0pKSk7CisgICAgTWF0cml4VHlwZSBBID0gbV9NIC8gcG93KFNjYWxhcigyKSwgbV9zcXVhcmluZ3MpOworICAgIHBhZGUxMyhBKTsKKyAgfQorI2VsaWYgTERCTF9NQU5UX0RJRyA8PSAxMDYgIC8vIGRvdWJsZS1kb3VibGUKKyAgaWYgKG1fbDFub3JtIDwgMy4yNzg3ODkyMjA1NjA3MDI2OTkyOTQ3NDg4MTA4MjEzZS0wMDVMKSB7CisgICAgcGFkZTMobV9NKTsKKyAgfSBlbHNlIGlmIChtX2wxbm9ybSA8IDYuNDQ2NzAyNTA2MDA3Mjc2MDA4NDEzMDkwNjA3NjMzMmUtMDAzTCkgeworICAgIHBhZGU1KG1fTSk7CisgIH0gZWxzZSBpZiAobV9sMW5vcm0gPCA2Ljg5ODgwMjg0OTY1OTUzNzQ3NTEzNzQxMjI4ODExNDNlLTAwMkwpIHsKKyAgICBwYWRlNyhtX00pOworICB9IGVsc2UgaWYgKG1fbDFub3JtIDwgMi43MzM5NzM3NTE4NTAyMjMxNzQxNDk1ODU3MjAxNjcwZS0wMDFMKSB7CisgICAgcGFkZTkobV9NKTsKKyAgfSBlbHNlIGlmIChtX2wxbm9ybSA8IDEuMzIwMzM4MjA5NjUxNDQ3NDkwNTY2NjQ0ODg1MDI3OGUrMDAwTCkgeworICAgIHBhZGUxMyhtX00pOworICB9IGVsc2UgeworICAgIGNvbnN0IGxvbmcgZG91YmxlIG1heG5vcm0gPSAzLjI1Nzk0NDA4OTU0MDU0MDA4NTY1OTk2NjM3MjM1MTdMOworICAgIG1fc3F1YXJpbmdzID0gKG1heCkoMCwgKGludCljZWlsKGxvZzIobV9sMW5vcm0gLyBtYXhub3JtKSkpOworICAgIE1hdHJpeFR5cGUgQSA9IG1fTSAvIHBvdyhTY2FsYXIoMiksIG1fc3F1YXJpbmdzKTsKKyAgICBwYWRlMTcoQSk7CisgIH0KKyNlbGlmIExEQkxfTUFOVF9ESUcgPD0gMTEyICAvLyBxdWFkcnVwbGUgcHJlY2lzb24KKyAgaWYgKG1fbDFub3JtIDwgMS42MzkzOTQ2MTAyODg5MTg2OTA1NDc0Njc5NTQ0NjY5NzBlLTAwNUwpIHsKKyAgICBwYWRlMyhtX00pOworICB9IGVsc2UgaWYgKG1fbDFub3JtIDwgNC4yNTMyMzc3MTIxNjUyNzU1NjYwMjU4ODQzNDQ0MzMwMDllLTAwM0wpIHsKKyAgICBwYWRlNShtX00pOworICB9IGVsc2UgaWYgKG1fbDFub3JtIDwgNS4xMjU4MDQwNjMxNjU3NjQ0MDk4ODUxMjIwMzI5MzMxNDJlLTAwMkwpIHsKKyAgICBwYWRlNyhtX00pOworICB9IGVsc2UgaWYgKG1fbDFub3JtIDwgMi4xNzAwMDA3NjUxNjExNTUxOTU0NTMyMDU2NTE4ODk4NTNlLTAwMUwpIHsKKyAgICBwYWRlOShtX00pOworICB9IGVsc2UgaWYgKG1fbDFub3JtIDwgMS4xMjUzNTgzODM0NTMxNDMwNjUwODEzOTc4ODI4OTE4NzhlKzAwMEwpIHsKKyAgICBwYWRlMTMobV9NKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBsb25nIGRvdWJsZSBtYXhub3JtID0gMi44ODQyMzMyNzc4Mjk1MTkzMTE3NTcxNjUwNTc3MTc4MTVMOworICAgIG1fc3F1YXJpbmdzID0gKG1heCkoMCwgKGludCljZWlsKGxvZzIobV9sMW5vcm0gLyBtYXhub3JtKSkpOworICAgIE1hdHJpeFR5cGUgQSA9IG1fTSAvIHBvdyhTY2FsYXIoMiksIG1fc3F1YXJpbmdzKTsKKyAgICBwYWRlMTcoQSk7CisgIH0KKyNlbHNlCisgIC8vIHRoaXMgY2FzZSBzaG91bGQgYmUgaGFuZGxlZCBpbiBjb21wdXRlKCkKKyAgZWlnZW5fYXNzZXJ0KGZhbHNlICYmICJCdWcgaW4gTWF0cml4RXhwb25lbnRpYWwiKTsgCisjZW5kaWYgIC8vIExEQkxfTUFOVF9ESUcKK30KKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQcm94eSBmb3IgdGhlIG1hdHJpeCBleHBvbmVudGlhbCBvZiBzb21lIG1hdHJpeCAoZXhwcmVzc2lvbikuCisgICoKKyAgKiBcdHBhcmFtIERlcml2ZWQgIFR5cGUgb2YgdGhlIGFyZ3VtZW50IHRvIHRoZSBtYXRyaXggZXhwb25lbnRpYWwuCisgICoKKyAgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBhcmd1bWVudCB0byB0aGUgbWF0cml4IGV4cG9uZW50aWFsIHVudGlsIGl0CisgICogaXMgYXNzaWduZWQgb3IgZXZhbHVhdGVkIGZvciBzb21lIG90aGVyIHJlYXNvbiAoc28gdGhlIGFyZ3VtZW50CisgICogc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGluIHRoZSBtZWFudGltZSkuIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZgorICAqIE1hdHJpeEJhc2U6OmV4cCgpIGFuZCBtb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGl0IGlzCisgICogdXNlZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IHN0cnVjdCBNYXRyaXhFeHBvbmVudGlhbFJldHVyblZhbHVlCis6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPE1hdHJpeEV4cG9uZW50aWFsUmV0dXJuVmFsdWU8RGVyaXZlZD4gPgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6SW5kZXggSW5kZXg7CisgIHB1YmxpYzoKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dIHNyYyAlTWF0cml4IChleHByZXNzaW9uKSBmb3JtaW5nIHRoZSBhcmd1bWVudCBvZiB0aGUKKyAgICAgICogbWF0cml4IGV4cG9uZW50aWFsLgorICAgICAgKi8KKyAgICBNYXRyaXhFeHBvbmVudGlhbFJldHVyblZhbHVlKGNvbnN0IERlcml2ZWQmIHNyYykgOiBtX3NyYyhzcmMpIHsgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggZXhwb25lbnRpYWwuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtvdXRdIHJlc3VsdCB0aGUgbWF0cml4IGV4cG9uZW50aWFsIG9mIFxwIHNyYyBpbiB0aGUKKyAgICAgICogY29uc3RydWN0b3IuCisgICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUeXBlPgorICAgIGlubGluZSB2b2lkIGV2YWxUbyhSZXN1bHRUeXBlJiByZXN1bHQpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3Qgc3JjRXZhbHVhdGVkID0gbV9zcmMuZXZhbCgpOworICAgICAgTWF0cml4RXhwb25lbnRpYWw8dHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3Q+IG1lKHNyY0V2YWx1YXRlZCk7CisgICAgICBtZS5jb21wdXRlKHJlc3VsdCk7CisgICAgfQorCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fc3JjLnJvd3MoKTsgfQorICAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX3NyYy5jb2xzKCk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgY29uc3QgRGVyaXZlZCYgbV9zcmM7CisgIHByaXZhdGU6CisgICAgTWF0cml4RXhwb25lbnRpYWxSZXR1cm5WYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeEV4cG9uZW50aWFsUmV0dXJuVmFsdWUmKTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorc3RydWN0IHRyYWl0czxNYXRyaXhFeHBvbmVudGlhbFJldHVyblZhbHVlPERlcml2ZWQ+ID4KK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBSZXR1cm5UeXBlOworfTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBNYXRyaXhFeHBvbmVudGlhbFJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OmV4cCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgcmV0dXJuIE1hdHJpeEV4cG9uZW50aWFsUmV0dXJuVmFsdWU8RGVyaXZlZD4oZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVRSSVhfRVhQT05FTlRJQUwKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4RnVuY3Rpb24uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4RnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTdjYTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhGdW5jdGlvbi5oCkBAIC0wLDAgKzEsNTkwIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDExIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX01BVFJJWF9GVU5DVElPTgorI2RlZmluZSBFSUdFTl9NQVRSSVhfRlVOQ1RJT04KKworI2luY2x1ZGUgIlN0ZW1GdW5jdGlvbi5oIgorI2luY2x1ZGUgIk1hdHJpeEZ1bmN0aW9uQXRvbWljLmgiCisKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgICogXGJyaWVmIENsYXNzIGZvciBjb21wdXRpbmcgbWF0cml4IGZ1bmN0aW9ucy4KKyAgKiBcdHBhcmFtICBNYXRyaXhUeXBlICB0eXBlIG9mIHRoZSBhcmd1bWVudCBvZiB0aGUgbWF0cml4IGZ1bmN0aW9uLAorICAqICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkIHRvIGJlIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlIE1hdHJpeCBjbGFzcyB0ZW1wbGF0ZS4KKyAgKiBcdHBhcmFtICBBdG9taWNUeXBlICB0eXBlIGZvciBjb21wdXRpbmcgbWF0cml4IGZ1bmN0aW9uIG9mIGF0b21pYyBibG9ja3MuCisgICogXHRwYXJhbSAgSXNDb21wbGV4ICAgdXNlZCBpbnRlcm5hbGx5IHRvIHNlbGVjdCBjb3JyZWN0IHNwZWNpYWxpemF0aW9uLgorICAqCisgICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBTY2h1ci1QYXJsZXR0IGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIG1hdHJpeCBmdW5jdGlvbnMuIFRoZSBzcGVjdHJ1bSBvZiB0aGUKKyAgKiBtYXRyaXggaXMgZGl2aWRlZCBpbiBjbHVzdGVyZWQgb2YgZWlnZW52YWx1ZXMgdGhhdCBsaWVzIGNsb3NlIHRvZ2V0aGVyLiBUaGlzIGNsYXNzIGRlbGVnYXRlcyB0aGUKKyAgKiBjb21wdXRhdGlvbiBvZiB0aGUgbWF0cml4IGZ1bmN0aW9uIG9uIGV2ZXJ5IGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gdGhlc2UgY2x1c3RlcnMgdG8gYW4gb2JqZWN0IG9mIHR5cGUKKyAgKiBccCBBdG9taWNUeXBlIGFuZCB1c2VzIHRoZXNlIHJlc3VsdHMgdG8gY29tcHV0ZSB0aGUgbWF0cml4IGZ1bmN0aW9uIG9mIHRoZSB3aG9sZSBtYXRyaXguIFRoZSBjbGFzcworICAqIFxwIEF0b21pY1R5cGUgc2hvdWxkIGhhdmUgYSBccCBjb21wdXRlKCkgbWVtYmVyIGZ1bmN0aW9uIGZvciBjb21wdXRpbmcgdGhlIG1hdHJpeCBmdW5jdGlvbiBvZiBhIGJsb2NrLgorICAqCisgICogXHNhIGNsYXNzIE1hdHJpeEZ1bmN0aW9uQXRvbWljLCBjbGFzcyBNYXRyaXhMb2dhcml0aG1BdG9taWMKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCAKKwkgIHR5cGVuYW1lIEF0b21pY1R5cGUsICAKKyAgICAgICAgICBpbnQgSXNDb21wbGV4ID0gTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcj46OklzQ29tcGxleD4KK2NsYXNzIE1hdHJpeEZ1bmN0aW9uCit7ICAKKyAgcHVibGljOgorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3Rvci4gCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIEEgICAgICAgYXJndW1lbnQgb2YgbWF0cml4IGZ1bmN0aW9uLCBzaG91bGQgYmUgYSBzcXVhcmUgbWF0cml4LgorICAgICAgKiBccGFyYW1baW5dICBhdG9taWMgIGNsYXNzIGZvciBjb21wdXRpbmcgbWF0cml4IGZ1bmN0aW9uIG9mIGF0b21pYyBibG9ja3MuCisgICAgICAqCisgICAgICAqIFRoZSBjbGFzcyBzdG9yZXMgcmVmZXJlbmNlcyB0byBccCBBIGFuZCBccCBhdG9taWMsIHNvIHRoZXkgc2hvdWxkIG5vdCBiZQorICAgICAgKiBjaGFuZ2VkIChvciBkZXN0cm95ZWQpIGJlZm9yZSBjb21wdXRlKCkgaXMgY2FsbGVkLgorICAgICAgKi8KKyAgICBNYXRyaXhGdW5jdGlvbihjb25zdCBNYXRyaXhUeXBlJiBBLCBBdG9taWNUeXBlJiBhdG9taWMpOworCisgICAgLyoqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggZnVuY3Rpb24uCisgICAgICAqCisgICAgICAqIFxwYXJhbVtvdXRdIHJlc3VsdCAgdGhlIGZ1bmN0aW9uIFxwIGYgYXBwbGllZCB0byBccCBBLCBhcworICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBTZWUgTWF0cml4QmFzZTo6bWF0cml4RnVuY3Rpb24oKSBmb3IgZGV0YWlscyBvbiBob3cgdGhpcyBjb21wdXRhdGlvbgorICAgICAgKiBpcyBpbXBsZW1lbnRlZC4KKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+IAorICAgIHZvaWQgY29tcHV0ZShSZXN1bHRUeXBlICZyZXN1bHQpOyAgICAKK307CisKKworLyoqIFxpbnRlcm5hbCBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlIAorICAqIFxicmllZiBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIE1hdHJpeEZ1bmN0aW9uIGZvciByZWFsIG1hdHJpY2VzCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgQXRvbWljVHlwZT4KK2NsYXNzIE1hdHJpeEZ1bmN0aW9uPE1hdHJpeFR5cGUsIEF0b21pY1R5cGUsIDA+Cit7ICAKKyAgcHJpdmF0ZToKKworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPiBUcmFpdHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFpdHM6OlNjYWxhciBTY2FsYXI7CisgICAgc3RhdGljIGNvbnN0IGludCBSb3dzID0gVHJhaXRzOjpSb3dzQXRDb21waWxlVGltZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IENvbHMgPSBUcmFpdHM6OkNvbHNBdENvbXBpbGVUaW1lOworICAgIHN0YXRpYyBjb25zdCBpbnQgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnM7CisgICAgc3RhdGljIGNvbnN0IGludCBNYXhSb3dzID0gVHJhaXRzOjpNYXhSb3dzQXRDb21waWxlVGltZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IE1heENvbHMgPSBUcmFpdHM6Ok1heENvbHNBdENvbXBpbGVUaW1lOworCisgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8U2NhbGFyPiBDb21wbGV4U2NhbGFyOworICAgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIFJvd3MsIENvbHMsIE9wdGlvbnMsIE1heFJvd3MsIE1heENvbHM+IENvbXBsZXhNYXRyaXg7CisKKyAgcHVibGljOgorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3Rvci4gCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIEEgICAgICAgYXJndW1lbnQgb2YgbWF0cml4IGZ1bmN0aW9uLCBzaG91bGQgYmUgYSBzcXVhcmUgbWF0cml4LgorICAgICAgKiBccGFyYW1baW5dICBhdG9taWMgIGNsYXNzIGZvciBjb21wdXRpbmcgbWF0cml4IGZ1bmN0aW9uIG9mIGF0b21pYyBibG9ja3MuCisgICAgICAqLworICAgIE1hdHJpeEZ1bmN0aW9uKGNvbnN0IE1hdHJpeFR5cGUmIEEsIEF0b21pY1R5cGUmIGF0b21pYykgOiBtX0EoQSksIG1fYXRvbWljKGF0b21pYykgeyB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGUgdGhlIG1hdHJpeCBmdW5jdGlvbi4KKyAgICAgICoKKyAgICAgICogXHBhcmFtW291dF0gcmVzdWx0ICB0aGUgZnVuY3Rpb24gXHAgZiBhcHBsaWVkIHRvIFxwIEEsIGFzCisgICAgICAqIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIHJlYWwgbWF0cml4IFxjIEEgdG8gYSBjb21wbGV4IG1hdHJpeCwKKyAgICAgICogdXNlcyBNYXRyaXhGdW5jdGlvbjxNYXRyaXhUeXBlLDE+IGFuZCB0aGVuIGNvbnZlcnRzIHRoZSByZXN1bHQgYmFjayB0bworICAgICAgKiBhIHJlYWwgbWF0cml4LgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VHlwZT4KKyAgICB2b2lkIGNvbXB1dGUoUmVzdWx0VHlwZSYgcmVzdWx0KSAKKyAgICB7CisgICAgICBDb21wbGV4TWF0cml4IENBID0gbV9BLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKTsKKyAgICAgIENvbXBsZXhNYXRyaXggQ3Jlc3VsdDsKKyAgICAgIE1hdHJpeEZ1bmN0aW9uPENvbXBsZXhNYXRyaXgsIEF0b21pY1R5cGU+IG1mKENBLCBtX2F0b21pYyk7CisgICAgICBtZi5jb21wdXRlKENyZXN1bHQpOworICAgICAgcmVzdWx0ID0gQ3Jlc3VsdC5yZWFsKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxNYXRyaXhUeXBlPjo6dHlwZSBtX0E7IC8qKjwgXGJyaWVmIFJlZmVyZW5jZSB0byBhcmd1bWVudCBvZiBtYXRyaXggZnVuY3Rpb24uICovCisgICAgQXRvbWljVHlwZSYgbV9hdG9taWM7IC8qKjwgXGJyaWVmIENsYXNzIGZvciBjb21wdXRpbmcgbWF0cml4IGZ1bmN0aW9uIG9mIGF0b21pYyBibG9ja3MuICovCisKKyAgICBNYXRyaXhGdW5jdGlvbiYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeEZ1bmN0aW9uJik7Cit9OworCisgICAgICAKKy8qKiBcaW50ZXJuYWwgXGluZ3JvdXAgTWF0cml4RnVuY3Rpb25zX01vZHVsZSAKKyAgKiBcYnJpZWYgUGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBNYXRyaXhGdW5jdGlvbiBmb3IgY29tcGxleCBtYXRyaWNlcworICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEF0b21pY1R5cGU+CitjbGFzcyBNYXRyaXhGdW5jdGlvbjxNYXRyaXhUeXBlLCBBdG9taWNUeXBlLCAxPgoreworICBwcml2YXRlOgorCisgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+IFRyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgICBzdGF0aWMgY29uc3QgaW50IFJvd3NBdENvbXBpbGVUaW1lID0gVHJhaXRzOjpSb3dzQXRDb21waWxlVGltZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IENvbHNBdENvbXBpbGVUaW1lID0gVHJhaXRzOjpDb2xzQXRDb21waWxlVGltZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IE9wdGlvbnMgPSBNYXRyaXhUeXBlOjpPcHRpb25zOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFRyYWl0czo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8SW5kZXgsIFRyYWl0czo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IEludFZlY3RvclR5cGU7CisgICAgdHlwZWRlZiBNYXRyaXg8SW5kZXgsIER5bmFtaWMsIDE+IER5bmFtaWNJbnRWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgc3RkOjpsaXN0PFNjYWxhcj4gQ2x1c3RlcjsKKyAgICB0eXBlZGVmIHN0ZDo6bGlzdDxDbHVzdGVyPiBMaXN0T2ZDbHVzdGVyczsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIE9wdGlvbnMsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZT4gRHluTWF0cml4VHlwZTsKKworICBwdWJsaWM6CisKKyAgICBNYXRyaXhGdW5jdGlvbihjb25zdCBNYXRyaXhUeXBlJiBBLCBBdG9taWNUeXBlJiBhdG9taWMpOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUeXBlPiB2b2lkIGNvbXB1dGUoUmVzdWx0VHlwZSYgcmVzdWx0KTsKKworICBwcml2YXRlOgorCisgICAgdm9pZCBjb21wdXRlU2NodXJEZWNvbXBvc2l0aW9uKCk7CisgICAgdm9pZCBwYXJ0aXRpb25FaWdlbnZhbHVlcygpOworICAgIHR5cGVuYW1lIExpc3RPZkNsdXN0ZXJzOjppdGVyYXRvciBmaW5kQ2x1c3RlcihTY2FsYXIga2V5KTsKKyAgICB2b2lkIGNvbXB1dGVDbHVzdGVyU2l6ZSgpOworICAgIHZvaWQgY29tcHV0ZUJsb2NrU3RhcnQoKTsKKyAgICB2b2lkIGNvbnN0cnVjdFBlcm11dGF0aW9uKCk7CisgICAgdm9pZCBwZXJtdXRlU2NodXIoKTsKKyAgICB2b2lkIHN3YXBFbnRyaWVzSW5TY2h1cihJbmRleCBpbmRleCk7CisgICAgdm9pZCBjb21wdXRlQmxvY2tBdG9taWMoKTsKKyAgICBCbG9jazxNYXRyaXhUeXBlPiBibG9jayhNYXRyaXhUeXBlJiBBLCBJbmRleCBpLCBJbmRleCBqKTsKKyAgICB2b2lkIGNvbXB1dGVPZmZEaWFnb25hbCgpOworICAgIER5bk1hdHJpeFR5cGUgc29sdmVUcmlhbmd1bGFyU3lsdmVzdGVyKGNvbnN0IER5bk1hdHJpeFR5cGUmIEEsIGNvbnN0IER5bk1hdHJpeFR5cGUmIEIsIGNvbnN0IER5bk1hdHJpeFR5cGUmIEMpOworCisgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxNYXRyaXhUeXBlPjo6dHlwZSBtX0E7IC8qKjwgXGJyaWVmIFJlZmVyZW5jZSB0byBhcmd1bWVudCBvZiBtYXRyaXggZnVuY3Rpb24uICovCisgICAgQXRvbWljVHlwZSYgbV9hdG9taWM7IC8qKjwgXGJyaWVmIENsYXNzIGZvciBjb21wdXRpbmcgbWF0cml4IGZ1bmN0aW9uIG9mIGF0b21pYyBibG9ja3MuICovCisgICAgTWF0cml4VHlwZSBtX1Q7IC8qKjwgXGJyaWVmIFRyaWFuZ3VsYXIgcGFydCBvZiBTY2h1ciBkZWNvbXBvc2l0aW9uICovCisgICAgTWF0cml4VHlwZSBtX1U7IC8qKjwgXGJyaWVmIFVuaXRhcnkgcGFydCBvZiBTY2h1ciBkZWNvbXBvc2l0aW9uICovCisgICAgTWF0cml4VHlwZSBtX2ZUOyAvKio8IFxicmllZiAlTWF0cml4IGZ1bmN0aW9uIGFwcGxpZWQgdG8gI21fVCAqLworICAgIExpc3RPZkNsdXN0ZXJzIG1fY2x1c3RlcnM7IC8qKjwgXGJyaWVmIFBhcnRpdGlvbiBvZiBlaWdlbnZhbHVlcyBpbnRvIGNsdXN0ZXJzIG9mIGVpJ3ZhbHMgImNsb3NlIiB0byBlYWNoIG90aGVyICovCisgICAgRHluYW1pY0ludFZlY3RvclR5cGUgbV9laXZhbFRvQ2x1c3RlcjsgLyoqPCBcYnJpZWYgbV9laXZhbFRvQ2x1c3RlcltpXSA9IGogbWVhbnMgaS10aCBlaSd2YWwgaXMgaW4gai10aCBjbHVzdGVyICovCisgICAgRHluYW1pY0ludFZlY3RvclR5cGUgbV9jbHVzdGVyU2l6ZTsgLyoqPCBcYnJpZWYgTnVtYmVyIG9mIGVpZ2VudmFsdWVzIGluIGVhY2ggY2x1c3RlcnMgICovCisgICAgRHluYW1pY0ludFZlY3RvclR5cGUgbV9ibG9ja1N0YXJ0OyAvKio8IFxicmllZiBSb3cgaW5kZXggYXQgd2hpY2ggYmxvY2sgY29ycmVzcG9uZGluZyB0byBpLXRoIGNsdXN0ZXIgc3RhcnRzICovCisgICAgSW50VmVjdG9yVHlwZSBtX3Blcm11dGF0aW9uOyAvKio8IFxicmllZiBQZXJtdXRhdGlvbiB3aGljaCBncm91cHMgZWkndmFscyBpbiB0aGUgc2FtZSBjbHVzdGVyIHRvZ2V0aGVyICovCisKKyAgICAvKiogXGJyaWVmIE1heGltdW0gZGlzdGFuY2UgYWxsb3dlZCBiZXR3ZWVuIGVpZ2VudmFsdWVzIHRvIGJlIGNvbnNpZGVyZWQgImNsb3NlIi4KKyAgICAgICoKKyAgICAgICogVGhpcyBpcyBtb3JhbGx5IGEgXGMgc3RhdGljIFxjIGNvbnN0IFxjIFNjYWxhciwgYnV0IG9ubHkKKyAgICAgICogaW50ZWdlcnMgY2FuIGJlIHN0YXRpYyBjb25zdGFudCBjbGFzcyBtZW1iZXJzIGluIEMrKy4gVGhlCisgICAgICAqIHNlcGFyYXRpb24gY29uc3RhbnQgaXMgc2V0IHRvIDAuMSwgYSB2YWx1ZSB0YWtlbiBmcm9tIHRoZQorICAgICAgKiBwYXBlciBieSBEYXZpZXMgYW5kIEhpZ2hhbS4gKi8KKyAgICBzdGF0aWMgY29uc3QgUmVhbFNjYWxhciBzZXBhcmF0aW9uKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMC4xKTsgfQorCisgICAgTWF0cml4RnVuY3Rpb24mIG9wZXJhdG9yPShjb25zdCBNYXRyaXhGdW5jdGlvbiYpOworfTsKKworLyoqIFxicmllZiBDb25zdHJ1Y3Rvci4gCisgKgorICogXHBhcmFtW2luXSAgQSAgICAgICBhcmd1bWVudCBvZiBtYXRyaXggZnVuY3Rpb24sIHNob3VsZCBiZSBhIHNxdWFyZSBtYXRyaXguCisgKiBccGFyYW1baW5dICBhdG9taWMgIGNsYXNzIGZvciBjb21wdXRpbmcgbWF0cml4IGZ1bmN0aW9uIG9mIGF0b21pYyBibG9ja3MuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBBdG9taWNUeXBlPgorTWF0cml4RnVuY3Rpb248TWF0cml4VHlwZSxBdG9taWNUeXBlLDE+OjpNYXRyaXhGdW5jdGlvbihjb25zdCBNYXRyaXhUeXBlJiBBLCBBdG9taWNUeXBlJiBhdG9taWMpCisgIDogbV9BKEEpLCBtX2F0b21pYyhhdG9taWMpCit7CisgIC8qIGVtcHR5IGJvZHkgKi8KK30KKworLyoqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggZnVuY3Rpb24uCisgICoKKyAgKiBccGFyYW1bb3V0XSByZXN1bHQgIHRoZSBmdW5jdGlvbiBccCBmIGFwcGxpZWQgdG8gXHAgQSwgYXMKKyAgKiBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEF0b21pY1R5cGU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VHlwZT4KK3ZvaWQgTWF0cml4RnVuY3Rpb248TWF0cml4VHlwZSxBdG9taWNUeXBlLDE+Ojpjb21wdXRlKFJlc3VsdFR5cGUmIHJlc3VsdCkgCit7CisgIGNvbXB1dGVTY2h1ckRlY29tcG9zaXRpb24oKTsKKyAgcGFydGl0aW9uRWlnZW52YWx1ZXMoKTsKKyAgY29tcHV0ZUNsdXN0ZXJTaXplKCk7CisgIGNvbXB1dGVCbG9ja1N0YXJ0KCk7CisgIGNvbnN0cnVjdFBlcm11dGF0aW9uKCk7CisgIHBlcm11dGVTY2h1cigpOworICBjb21wdXRlQmxvY2tBdG9taWMoKTsKKyAgY29tcHV0ZU9mZkRpYWdvbmFsKCk7CisgIHJlc3VsdCA9IG1fVSAqIG1fZlQgKiBtX1UuYWRqb2ludCgpOworfQorCisvKiogXGJyaWVmIFN0b3JlIHRoZSBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mICNtX0EgaW4gI21fVCBhbmQgI21fVSAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEF0b21pY1R5cGU+Cit2b2lkIE1hdHJpeEZ1bmN0aW9uPE1hdHJpeFR5cGUsQXRvbWljVHlwZSwxPjo6Y29tcHV0ZVNjaHVyRGVjb21wb3NpdGlvbigpCit7CisgIGNvbnN0IENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBzY2h1ck9mQShtX0EpOyAgCisgIG1fVCA9IHNjaHVyT2ZBLm1hdHJpeFQoKTsKKyAgbV9VID0gc2NodXJPZkEubWF0cml4VSgpOworfQorCisvKiogXGJyaWVmIFBhcnRpdGlvbiBlaWdlbnZhbHVlcyBpbiBjbHVzdGVycyBvZiBlaSd2YWxzIGNsb3NlIHRvIGVhY2ggb3RoZXIKKyAgKiAKKyAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzICNtX2NsdXN0ZXJzLiBUaGlzIGlzIGEgcGFydGl0aW9uIG9mIHRoZQorICAqIGVpZ2VudmFsdWVzIG9mICNtX1QgaW4gY2x1c3RlcnMsIHN1Y2ggdGhhdAorICAqICMgQW55IGVpZ2VudmFsdWUgaW4gYSBjZXJ0YWluIGNsdXN0ZXIgaXMgYXQgbW9zdCBzZXBhcmF0aW9uKCkgYXdheQorICAqICAgZnJvbSBhbm90aGVyIGVpZ2VudmFsdWUgaW4gdGhlIHNhbWUgY2x1c3Rlci4KKyAgKiAjIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBlaWdlbnZhbHVlcyBpbiBkaWZmZXJlbnQgY2x1c3RlcnMgaXMKKyAgKiAgIG1vcmUgdGhhbiBzZXBhcmF0aW9uKCkuCisgICogVGhlIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgQWxnb3JpdGhtIDQuMSBpbiB0aGUgcGFwZXIgb2YgRGF2aWVzCisgICogYW5kIEhpZ2hhbS4gCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgQXRvbWljVHlwZT4KK3ZvaWQgTWF0cml4RnVuY3Rpb248TWF0cml4VHlwZSxBdG9taWNUeXBlLDE+OjpwYXJ0aXRpb25FaWdlbnZhbHVlcygpCit7CisgIGNvbnN0IEluZGV4IHJvd3MgPSBtX1Qucm93cygpOworICBWZWN0b3JUeXBlIGRpYWcgPSBtX1QuZGlhZ29uYWwoKTsgLy8gY29udGFpbnMgZWlnZW52YWx1ZXMgb2YgQQorCisgIGZvciAoSW5kZXggaT0wOyBpPHJvd3M7ICsraSkgeworICAgIC8vIEZpbmQgc2V0IGNvbnRhaW5pbmcgZGlhZyhpKSwgYWRkaW5nIGEgbmV3IHNldCBpZiBuZWNlc3NhcnkKKyAgICB0eXBlbmFtZSBMaXN0T2ZDbHVzdGVyczo6aXRlcmF0b3IgcWkgPSBmaW5kQ2x1c3RlcihkaWFnKGkpKTsKKyAgICBpZiAocWkgPT0gbV9jbHVzdGVycy5lbmQoKSkgeworICAgICAgQ2x1c3RlciBsOworICAgICAgbC5wdXNoX2JhY2soZGlhZyhpKSk7CisgICAgICBtX2NsdXN0ZXJzLnB1c2hfYmFjayhsKTsKKyAgICAgIHFpID0gbV9jbHVzdGVycy5lbmQoKTsKKyAgICAgIC0tcWk7CisgICAgfQorCisgICAgLy8gTG9vayBmb3Igb3RoZXIgZWxlbWVudCB0byBhZGQgdG8gdGhlIHNldAorICAgIGZvciAoSW5kZXggaj1pKzE7IGo8cm93czsgKytqKSB7CisgICAgICBpZiAoaW50ZXJuYWw6OmFicyhkaWFnKGopIC0gZGlhZyhpKSkgPD0gc2VwYXJhdGlvbigpICYmIHN0ZDo6ZmluZChxaS0+YmVnaW4oKSwgcWktPmVuZCgpLCBkaWFnKGopKSA9PSBxaS0+ZW5kKCkpIHsKKwl0eXBlbmFtZSBMaXN0T2ZDbHVzdGVyczo6aXRlcmF0b3IgcWogPSBmaW5kQ2x1c3RlcihkaWFnKGopKTsKKwlpZiAocWogPT0gbV9jbHVzdGVycy5lbmQoKSkgeworCSAgcWktPnB1c2hfYmFjayhkaWFnKGopKTsKKwl9IGVsc2UgeworCSAgcWktPmluc2VydChxaS0+ZW5kKCksIHFqLT5iZWdpbigpLCBxai0+ZW5kKCkpOworCSAgbV9jbHVzdGVycy5lcmFzZShxaik7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKiogXGJyaWVmIEZpbmQgY2x1c3RlciBpbiAjbV9jbHVzdGVycyBjb250YWluaW5nIHNvbWUgdmFsdWUgCisgICogXHBhcmFtW2luXSBrZXkgVmFsdWUgdG8gZmluZAorICAqIFxyZXR1cm5zIEl0ZXJhdG9yIHRvIGNsdXN0ZXIgY29udGFpbmluZyBcYyBrZXksIG9yCisgICogXGMgbV9jbHVzdGVycy5lbmQoKSBpZiBubyBjbHVzdGVyIGluIG1fY2x1c3RlcnMgY29udGFpbnMgXGMga2V5LgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEF0b21pY1R5cGU+Cit0eXBlbmFtZSBNYXRyaXhGdW5jdGlvbjxNYXRyaXhUeXBlLEF0b21pY1R5cGUsMT46Okxpc3RPZkNsdXN0ZXJzOjppdGVyYXRvciBNYXRyaXhGdW5jdGlvbjxNYXRyaXhUeXBlLEF0b21pY1R5cGUsMT46OmZpbmRDbHVzdGVyKFNjYWxhciBrZXkpCit7CisgIHR5cGVuYW1lIENsdXN0ZXI6Oml0ZXJhdG9yIGo7CisgIGZvciAodHlwZW5hbWUgTGlzdE9mQ2x1c3RlcnM6Oml0ZXJhdG9yIGkgPSBtX2NsdXN0ZXJzLmJlZ2luKCk7IGkgIT0gbV9jbHVzdGVycy5lbmQoKTsgKytpKSB7CisgICAgaiA9IHN0ZDo6ZmluZChpLT5iZWdpbigpLCBpLT5lbmQoKSwga2V5KTsKKyAgICBpZiAoaiAhPSBpLT5lbmQoKSkKKyAgICAgIHJldHVybiBpOworICB9CisgIHJldHVybiBtX2NsdXN0ZXJzLmVuZCgpOworfQorCisvKiogXGJyaWVmIENvbXB1dGUgI21fY2x1c3RlclNpemUgYW5kICNtX2VpdmFsVG9DbHVzdGVyIHVzaW5nICNtX2NsdXN0ZXJzICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgQXRvbWljVHlwZT4KK3ZvaWQgTWF0cml4RnVuY3Rpb248TWF0cml4VHlwZSxBdG9taWNUeXBlLDE+Ojpjb21wdXRlQ2x1c3RlclNpemUoKQoreworICBjb25zdCBJbmRleCByb3dzID0gbV9ULnJvd3MoKTsKKyAgVmVjdG9yVHlwZSBkaWFnID0gbV9ULmRpYWdvbmFsKCk7IAorICBjb25zdCBJbmRleCBudW1DbHVzdGVycyA9IHN0YXRpY19jYXN0PEluZGV4PihtX2NsdXN0ZXJzLnNpemUoKSk7CisKKyAgbV9jbHVzdGVyU2l6ZS5zZXRaZXJvKG51bUNsdXN0ZXJzKTsKKyAgbV9laXZhbFRvQ2x1c3Rlci5yZXNpemUocm93cyk7CisgIEluZGV4IGNsdXN0ZXJJbmRleCA9IDA7CisgIGZvciAodHlwZW5hbWUgTGlzdE9mQ2x1c3RlcnM6OmNvbnN0X2l0ZXJhdG9yIGNsdXN0ZXIgPSBtX2NsdXN0ZXJzLmJlZ2luKCk7IGNsdXN0ZXIgIT0gbV9jbHVzdGVycy5lbmQoKTsgKytjbHVzdGVyKSB7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IGRpYWcucm93cygpOyArK2kpIHsKKyAgICAgIGlmIChzdGQ6OmZpbmQoY2x1c3Rlci0+YmVnaW4oKSwgY2x1c3Rlci0+ZW5kKCksIGRpYWcoaSkpICE9IGNsdXN0ZXItPmVuZCgpKSB7CisgICAgICAgICsrbV9jbHVzdGVyU2l6ZVtjbHVzdGVySW5kZXhdOworICAgICAgICBtX2VpdmFsVG9DbHVzdGVyW2ldID0gY2x1c3RlckluZGV4OworICAgICAgfQorICAgIH0KKyAgICArK2NsdXN0ZXJJbmRleDsKKyAgfQorfQorCisvKiogXGJyaWVmIENvbXB1dGUgI21fYmxvY2tTdGFydCB1c2luZyAjbV9jbHVzdGVyU2l6ZSAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEF0b21pY1R5cGU+Cit2b2lkIE1hdHJpeEZ1bmN0aW9uPE1hdHJpeFR5cGUsQXRvbWljVHlwZSwxPjo6Y29tcHV0ZUJsb2NrU3RhcnQoKQoreworICBtX2Jsb2NrU3RhcnQucmVzaXplKG1fY2x1c3RlclNpemUucm93cygpKTsKKyAgbV9ibG9ja1N0YXJ0KDApID0gMDsKKyAgZm9yIChJbmRleCBpID0gMTsgaSA8IG1fY2x1c3RlclNpemUucm93cygpOyBpKyspIHsKKyAgICBtX2Jsb2NrU3RhcnQoaSkgPSBtX2Jsb2NrU3RhcnQoaS0xKSArIG1fY2x1c3RlclNpemUoaS0xKTsKKyAgfQorfQorCisvKiogXGJyaWVmIENvbXB1dGUgI21fcGVybXV0YXRpb24gdXNpbmcgI21fZWl2YWxUb0NsdXN0ZXIgYW5kICNtX2Jsb2NrU3RhcnQgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBBdG9taWNUeXBlPgordm9pZCBNYXRyaXhGdW5jdGlvbjxNYXRyaXhUeXBlLEF0b21pY1R5cGUsMT46OmNvbnN0cnVjdFBlcm11dGF0aW9uKCkKK3sKKyAgRHluYW1pY0ludFZlY3RvclR5cGUgaW5kZXhOZXh0RW50cnkgPSBtX2Jsb2NrU3RhcnQ7CisgIG1fcGVybXV0YXRpb24ucmVzaXplKG1fVC5yb3dzKCkpOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbV9ULnJvd3MoKTsgaSsrKSB7CisgICAgSW5kZXggY2x1c3RlciA9IG1fZWl2YWxUb0NsdXN0ZXJbaV07CisgICAgbV9wZXJtdXRhdGlvbltpXSA9IGluZGV4TmV4dEVudHJ5W2NsdXN0ZXJdOworICAgICsraW5kZXhOZXh0RW50cnlbY2x1c3Rlcl07CisgIH0KK30gIAorCisvKiogXGJyaWVmIFBlcm11dGUgU2NodXIgZGVjb21wb3NpdGlvbiBpbiAjbV9VIGFuZCAjbV9UIGFjY29yZGluZyB0byAjbV9wZXJtdXRhdGlvbiAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEF0b21pY1R5cGU+Cit2b2lkIE1hdHJpeEZ1bmN0aW9uPE1hdHJpeFR5cGUsQXRvbWljVHlwZSwxPjo6cGVybXV0ZVNjaHVyKCkKK3sKKyAgSW50VmVjdG9yVHlwZSBwID0gbV9wZXJtdXRhdGlvbjsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHAucm93cygpIC0gMTsgaSsrKSB7CisgICAgSW5kZXggajsKKyAgICBmb3IgKGogPSBpOyBqIDwgcC5yb3dzKCk7IGorKykgeworICAgICAgaWYgKHAoaikgPT0gaSkgYnJlYWs7CisgICAgfQorICAgIGVpZ2VuX2Fzc2VydChwKGopID09IGkpOworICAgIGZvciAoSW5kZXggayA9IGotMTsgayA+PSBpOyBrLS0pIHsKKyAgICAgIHN3YXBFbnRyaWVzSW5TY2h1cihrKTsKKyAgICAgIHN0ZDo6c3dhcChwLmNvZWZmUmVmKGspLCBwLmNvZWZmUmVmKGsrMSkpOworICAgIH0KKyAgfQorfQorCisvKiogXGJyaWVmIFN3YXAgcm93cyBcYSBpbmRleCBhbmQgXGEgaW5kZXgrMSBpbiBTY2h1ciBkZWNvbXBvc2l0aW9uIGluICNtX1UgYW5kICNtX1QgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBBdG9taWNUeXBlPgordm9pZCBNYXRyaXhGdW5jdGlvbjxNYXRyaXhUeXBlLEF0b21pY1R5cGUsMT46OnN3YXBFbnRyaWVzSW5TY2h1cihJbmRleCBpbmRleCkKK3sKKyAgSmFjb2JpUm90YXRpb248U2NhbGFyPiByb3RhdGlvbjsKKyAgcm90YXRpb24ubWFrZUdpdmVucyhtX1QoaW5kZXgsIGluZGV4KzEpLCBtX1QoaW5kZXgrMSwgaW5kZXgrMSkgLSBtX1QoaW5kZXgsIGluZGV4KSk7CisgIG1fVC5hcHBseU9uVGhlTGVmdChpbmRleCwgaW5kZXgrMSwgcm90YXRpb24uYWRqb2ludCgpKTsKKyAgbV9ULmFwcGx5T25UaGVSaWdodChpbmRleCwgaW5kZXgrMSwgcm90YXRpb24pOworICBtX1UuYXBwbHlPblRoZVJpZ2h0KGluZGV4LCBpbmRleCsxLCByb3RhdGlvbik7Cit9ICAKKworLyoqIFxicmllZiBDb21wdXRlIGJsb2NrIGRpYWdvbmFsIHBhcnQgb2YgI21fZlQuCisgICoKKyAgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIG1hdHJpeCBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBibG9jayBkaWFnb25hbCBwYXJ0IG9mICNtX1QsIHdpdGggdGhlIGJsb2NraW5nCisgICogZ2l2ZW4gYnkgI21fYmxvY2tTdGFydC4gVGhlIG1hdHJpeCBmdW5jdGlvbiBvZiBlYWNoIGRpYWdvbmFsIGJsb2NrIGlzIGNvbXB1dGVkIGJ5ICNtX2F0b21pYy4gVGhlCisgICogb2ZmLWRpYWdvbmFsIHBhcnRzIG9mICNtX2ZUIGFyZSBzZXQgdG8gemVyby4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBBdG9taWNUeXBlPgordm9pZCBNYXRyaXhGdW5jdGlvbjxNYXRyaXhUeXBlLEF0b21pY1R5cGUsMT46OmNvbXB1dGVCbG9ja0F0b21pYygpCit7IAorICBtX2ZULnJlc2l6ZShtX1Qucm93cygpLCBtX1QuY29scygpKTsKKyAgbV9mVC5zZXRaZXJvKCk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBtX2NsdXN0ZXJTaXplLnJvd3MoKTsgKytpKSB7CisgICAgYmxvY2sobV9mVCwgaSwgaSkgPSBtX2F0b21pYy5jb21wdXRlKGJsb2NrKG1fVCwgaSwgaSkpOworICB9Cit9CisKKy8qKiBcYnJpZWYgUmV0dXJuIGJsb2NrIG9mIG1hdHJpeCBhY2NvcmRpbmcgdG8gYmxvY2tpbmcgZ2l2ZW4gYnkgI21fYmxvY2tTdGFydCAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEF0b21pY1R5cGU+CitCbG9jazxNYXRyaXhUeXBlPiBNYXRyaXhGdW5jdGlvbjxNYXRyaXhUeXBlLEF0b21pY1R5cGUsMT46OmJsb2NrKE1hdHJpeFR5cGUmIEEsIEluZGV4IGksIEluZGV4IGopCit7CisgIHJldHVybiBBLmJsb2NrKG1fYmxvY2tTdGFydChpKSwgbV9ibG9ja1N0YXJ0KGopLCBtX2NsdXN0ZXJTaXplKGkpLCBtX2NsdXN0ZXJTaXplKGopKTsKK30KKworLyoqIFxicmllZiBDb21wdXRlIHBhcnQgb2YgI21fZlQgYWJvdmUgYmxvY2sgZGlhZ29uYWwuCisgICoKKyAgKiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHRoZSBibG9jayBkaWFnb25hbCBwYXJ0IG9mICNtX2ZUICh3aGljaAorICAqIGVxdWFscyB0aGUgbWF0cml4IGZ1bmN0aW9uIGFwcGxpZWQgdG8gI21fVCkgaGFzIGFscmVhZHkgYmVlbiBjb21wdXRlZCBhbmQgY29tcHV0ZXMKKyAgKiB0aGUgcGFydCBhYm92ZSB0aGUgYmxvY2sgZGlhZ29uYWwuIFRoZSBwYXJ0IGJlbG93IHRoZSBkaWFnb25hbCBpcworICAqIHplcm8sIGJlY2F1c2UgI21fVCBpcyB1cHBlciB0cmlhbmd1bGFyLgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEF0b21pY1R5cGU+Cit2b2lkIE1hdHJpeEZ1bmN0aW9uPE1hdHJpeFR5cGUsQXRvbWljVHlwZSwxPjo6Y29tcHV0ZU9mZkRpYWdvbmFsKCkKK3sgCisgIGZvciAoSW5kZXggZGlhZ0luZGV4ID0gMTsgZGlhZ0luZGV4IDwgbV9jbHVzdGVyU2l6ZS5yb3dzKCk7IGRpYWdJbmRleCsrKSB7CisgICAgZm9yIChJbmRleCBibG9ja0luZGV4ID0gMDsgYmxvY2tJbmRleCA8IG1fY2x1c3RlclNpemUucm93cygpIC0gZGlhZ0luZGV4OyBibG9ja0luZGV4KyspIHsKKyAgICAgIC8vIGNvbXB1dGUgKGJsb2NrSW5kZXgsIGJsb2NrSW5kZXgrZGlhZ0luZGV4KSBibG9jaworICAgICAgRHluTWF0cml4VHlwZSBBID0gYmxvY2sobV9ULCBibG9ja0luZGV4LCBibG9ja0luZGV4KTsKKyAgICAgIER5bk1hdHJpeFR5cGUgQiA9IC1ibG9jayhtX1QsIGJsb2NrSW5kZXgrZGlhZ0luZGV4LCBibG9ja0luZGV4K2RpYWdJbmRleCk7CisgICAgICBEeW5NYXRyaXhUeXBlIEMgPSBibG9jayhtX2ZULCBibG9ja0luZGV4LCBibG9ja0luZGV4KSAqIGJsb2NrKG1fVCwgYmxvY2tJbmRleCwgYmxvY2tJbmRleCtkaWFnSW5kZXgpOworICAgICAgQyAtPSBibG9jayhtX1QsIGJsb2NrSW5kZXgsIGJsb2NrSW5kZXgrZGlhZ0luZGV4KSAqIGJsb2NrKG1fZlQsIGJsb2NrSW5kZXgrZGlhZ0luZGV4LCBibG9ja0luZGV4K2RpYWdJbmRleCk7CisgICAgICBmb3IgKEluZGV4IGsgPSBibG9ja0luZGV4ICsgMTsgayA8IGJsb2NrSW5kZXggKyBkaWFnSW5kZXg7IGsrKykgeworCUMgKz0gYmxvY2sobV9mVCwgYmxvY2tJbmRleCwgaykgKiBibG9jayhtX1QsIGssIGJsb2NrSW5kZXgrZGlhZ0luZGV4KTsKKwlDIC09IGJsb2NrKG1fVCwgYmxvY2tJbmRleCwgaykgKiBibG9jayhtX2ZULCBrLCBibG9ja0luZGV4K2RpYWdJbmRleCk7CisgICAgICB9CisgICAgICBibG9jayhtX2ZULCBibG9ja0luZGV4LCBibG9ja0luZGV4K2RpYWdJbmRleCkgPSBzb2x2ZVRyaWFuZ3VsYXJTeWx2ZXN0ZXIoQSwgQiwgQyk7CisgICAgfQorICB9Cit9CisKKy8qKiBcYnJpZWYgU29sdmUgYSB0cmlhbmd1bGFyIFN5bHZlc3RlciBlcXVhdGlvbiBBWCArIFhCID0gQyAKKyAgKgorICAqIFxwYXJhbVtpbl0gIEEgIHRoZSBtYXRyaXggQTsgc2hvdWxkIGJlIHNxdWFyZSBhbmQgdXBwZXIgdHJpYW5ndWxhcgorICAqIFxwYXJhbVtpbl0gIEIgIHRoZSBtYXRyaXggQjsgc2hvdWxkIGJlIHNxdWFyZSBhbmQgdXBwZXIgdHJpYW5ndWxhcgorICAqIFxwYXJhbVtpbl0gIEMgIHRoZSBtYXRyaXggQzsgc2hvdWxkIGhhdmUgY29ycmVjdCBzaXplLgorICAqCisgICogXHJldHVybnMgdGhlIHNvbHV0aW9uIFguCisgICoKKyAgKiBJZiBBIGlzIG0tYnktbSBhbmQgQiBpcyBuLWJ5LW4sIHRoZW4gYm90aCBDIGFuZCBYIGFyZSBtLWJ5LW4uIAorICAqIFRoZSAoaSxqKS10aCBjb21wb25lbnQgb2YgdGhlIFN5bHZlc3RlciBlcXVhdGlvbiBpcworICAqIFxmWyAKKyAgKiAgICAgXHN1bV97az1pfV5tIEFfe2lrfSBYX3tran0gKyBcc3VtX3trPTF9XmogWF97aWt9IEJfe2tqfSA9IENfe2lqfS4gCisgICogXGZdCisgICogVGhpcyBjYW4gYmUgcmUtYXJyYW5nZWQgdG8geWllbGQ6CisgICogXGZbIAorICAqICAgICBYX3tpan0gPSBcZnJhY3sxfXtBX3tpaX0gKyBCX3tqan19IFxCaWdsKCBDX3tpan0KKyAgKiAgICAgLSBcc3VtX3trPWkrMX1ebSBBX3tpa30gWF97a2p9IC0gXHN1bV97az0xfV57ai0xfSBYX3tpa30gQl97a2p9IFxCaWdyKS4KKyAgKiBcZl0KKyAgKiBJdCBpcyBhc3N1bWVkIHRoYXQgQSBhbmQgQiBhcmUgc3VjaCB0aGF0IHRoZSBudW1lcmF0b3IgaXMgbmV2ZXIKKyAgKiB6ZXJvIChvdGhlcndpc2UgdGhlIFN5bHZlc3RlciBlcXVhdGlvbiBkb2VzIG5vdCBoYXZlIGEgdW5pcXVlCisgICogc29sdXRpb24pLiBJbiB0aGF0IGNhc2UsIHRoZXNlIGVxdWF0aW9ucyBjYW4gYmUgZXZhbHVhdGVkIGluIHRoZQorICAqIG9yZGVyIFxmJCBpPW0sXGxkb3RzLDEgXGYkIGFuZCBcZiQgaj0xLFxsZG90cyxuIFxmJC4KKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBBdG9taWNUeXBlPgordHlwZW5hbWUgTWF0cml4RnVuY3Rpb248TWF0cml4VHlwZSxBdG9taWNUeXBlLDE+OjpEeW5NYXRyaXhUeXBlIE1hdHJpeEZ1bmN0aW9uPE1hdHJpeFR5cGUsQXRvbWljVHlwZSwxPjo6c29sdmVUcmlhbmd1bGFyU3lsdmVzdGVyKAorICBjb25zdCBEeW5NYXRyaXhUeXBlJiBBLCAKKyAgY29uc3QgRHluTWF0cml4VHlwZSYgQiwgCisgIGNvbnN0IER5bk1hdHJpeFR5cGUmIEMpCit7CisgIGVpZ2VuX2Fzc2VydChBLnJvd3MoKSA9PSBBLmNvbHMoKSk7CisgIGVpZ2VuX2Fzc2VydChBLmlzVXBwZXJUcmlhbmd1bGFyKCkpOworICBlaWdlbl9hc3NlcnQoQi5yb3dzKCkgPT0gQi5jb2xzKCkpOworICBlaWdlbl9hc3NlcnQoQi5pc1VwcGVyVHJpYW5ndWxhcigpKTsKKyAgZWlnZW5fYXNzZXJ0KEMucm93cygpID09IEEucm93cygpKTsKKyAgZWlnZW5fYXNzZXJ0KEMuY29scygpID09IEIucm93cygpKTsKKworICBJbmRleCBtID0gQS5yb3dzKCk7CisgIEluZGV4IG4gPSBCLnJvd3MoKTsKKyAgRHluTWF0cml4VHlwZSBYKG0sIG4pOworCisgIGZvciAoSW5kZXggaSA9IG0gLSAxOyBpID49IDA7IC0taSkgeworICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBuOyArK2opIHsKKworICAgICAgLy8gQ29tcHV0ZSBBWCA9IFxzdW1fe2s9aSsxfV5tIEFfe2lrfSBYX3tran0KKyAgICAgIFNjYWxhciBBWDsKKyAgICAgIGlmIChpID09IG0gLSAxKSB7CisJQVggPSAwOyAKKyAgICAgIH0gZWxzZSB7CisJTWF0cml4PFNjYWxhciwxLDE+IEFYbWF0cml4ID0gQS5yb3coaSkudGFpbChtLTEtaSkgKiBYLmNvbChqKS50YWlsKG0tMS1pKTsKKwlBWCA9IEFYbWF0cml4KDAsMCk7CisgICAgICB9CisKKyAgICAgIC8vIENvbXB1dGUgWEIgPSBcc3VtX3trPTF9XntqLTF9IFhfe2lrfSBCX3tran0KKyAgICAgIFNjYWxhciBYQjsKKyAgICAgIGlmIChqID09IDApIHsKKwlYQiA9IDA7IAorICAgICAgfSBlbHNlIHsKKwlNYXRyaXg8U2NhbGFyLDEsMT4gWEJtYXRyaXggPSBYLnJvdyhpKS5oZWFkKGopICogQi5jb2woaikuaGVhZChqKTsKKwlYQiA9IFhCbWF0cml4KDAsMCk7CisgICAgICB9CisKKyAgICAgIFgoaSxqKSA9IChDKGksaikgLSBBWCAtIFhCKSAvIChBKGksaSkgKyBCKGosaikpOworICAgIH0KKyAgfQorICByZXR1cm4gWDsKK30KKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQcm94eSBmb3IgdGhlIG1hdHJpeCBmdW5jdGlvbiBvZiBzb21lIG1hdHJpeCAoZXhwcmVzc2lvbikuCisgICoKKyAgKiBcdHBhcmFtIERlcml2ZWQgIFR5cGUgb2YgdGhlIGFyZ3VtZW50IHRvIHRoZSBtYXRyaXggZnVuY3Rpb24uCisgICoKKyAgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBhcmd1bWVudCB0byB0aGUgbWF0cml4IGZ1bmN0aW9uIHVudGlsIGl0IGlzCisgICogYXNzaWduZWQgb3IgZXZhbHVhdGVkIGZvciBzb21lIG90aGVyIHJlYXNvbiAoc28gdGhlIGFyZ3VtZW50CisgICogc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGluIHRoZSBtZWFudGltZSkuIEl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZgorICAqIG1hdHJpeEJhc2U6Om1hdHJpeEZ1bmN0aW9uKCkgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIGFuZCBtb3N0IG9mIHRoZQorICAqIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMgdXNlZC4KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+IGNsYXNzIE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWUKKzogcHVibGljIFJldHVybkJ5VmFsdWU8TWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiA+Cit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb248U2NhbGFyPjo6dHlwZSBTdGVtRnVuY3Rpb247CisKKyAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gQSAgJU1hdHJpeCAoZXhwcmVzc2lvbikgZm9ybWluZyB0aGUgYXJndW1lbnQgb2YgdGhlCisgICAgICAqIG1hdHJpeCBmdW5jdGlvbi4KKyAgICAgICogXHBhcmFtW2luXSBmICBTdGVtIGZ1bmN0aW9uIGZvciBtYXRyaXggZnVuY3Rpb24gdW5kZXIgY29uc2lkZXJhdGlvbi4KKyAgICAgICovCisgICAgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZShjb25zdCBEZXJpdmVkJiBBLCBTdGVtRnVuY3Rpb24gZikgOiBtX0EoQSksIG1fZihmKSB7IH0KKworICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgbWF0cml4IGZ1bmN0aW9uLgorICAgICAgKgorICAgICAgKiBccGFyYW1bb3V0XSByZXN1bHQgXHAgZiBhcHBsaWVkIHRvIFxwIEEsIHdoZXJlIFxwIGYgYW5kIFxwIEEKKyAgICAgICogYXJlIGFzIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICAgICAgdHlwZWRlZiBpbnRlcm5hbDo6dHJhaXRzPFBsYWluT2JqZWN0PiBUcmFpdHM7CisgICAgICBzdGF0aWMgY29uc3QgaW50IFJvd3NBdENvbXBpbGVUaW1lID0gVHJhaXRzOjpSb3dzQXRDb21waWxlVGltZTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgQ29sc0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6OkNvbHNBdENvbXBpbGVUaW1lOworICAgICAgc3RhdGljIGNvbnN0IGludCBPcHRpb25zID0gUGxhaW5PYmplY3Q6Ok9wdGlvbnM7CisgICAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbD4gQ29tcGxleFNjYWxhcjsKKyAgICAgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIE9wdGlvbnMsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZT4gRHluTWF0cml4VHlwZTsKKyAgICAgIHR5cGVkZWYgTWF0cml4RnVuY3Rpb25BdG9taWM8RHluTWF0cml4VHlwZT4gQXRvbWljVHlwZTsKKyAgICAgIEF0b21pY1R5cGUgYXRvbWljKG1fZik7CisKKyAgICAgIGNvbnN0IFBsYWluT2JqZWN0IEFldmFsdWF0ZWQgPSBtX0EuZXZhbCgpOworICAgICAgTWF0cml4RnVuY3Rpb248UGxhaW5PYmplY3QsIEF0b21pY1R5cGU+IG1mKEFldmFsdWF0ZWQsIGF0b21pYyk7CisgICAgICBtZi5jb21wdXRlKHJlc3VsdCk7CisgICAgfQorCisgICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fQS5yb3dzKCk7IH0KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9BLmNvbHMoKTsgfQorCisgIHByaXZhdGU6CisgICAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxEZXJpdmVkPjo6dHlwZSBtX0E7CisgICAgU3RlbUZ1bmN0aW9uICptX2Y7CisKKyAgICBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlJiBvcGVyYXRvcj0oY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZSYpOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgdHJhaXRzPE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gPgoreworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFJldHVyblR5cGU7Cit9OworfQorCisKKy8qKioqKioqKioqIE1hdHJpeEJhc2UgbWV0aG9kcyAqKioqKioqKioqLworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPiBNYXRyaXhCYXNlPERlcml2ZWQ+OjptYXRyaXhGdW5jdGlvbih0eXBlbmFtZSBpbnRlcm5hbDo6c3RlbV9mdW5jdGlvbjx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+Ojp0eXBlIGYpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgcmV0dXJuIE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4oZGVyaXZlZCgpLCBmKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OnNpbigpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6c3RlbV9mdW5jdGlvbjxTY2FsYXI+OjpDb21wbGV4U2NhbGFyIENvbXBsZXhTY2FsYXI7CisgIHJldHVybiBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+KGRlcml2ZWQoKSwgU3RkU3RlbUZ1bmN0aW9uczxDb21wbGV4U2NhbGFyPjo6c2luKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OmNvcygpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6c3RlbV9mdW5jdGlvbjxTY2FsYXI+OjpDb21wbGV4U2NhbGFyIENvbXBsZXhTY2FsYXI7CisgIHJldHVybiBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+KGRlcml2ZWQoKSwgU3RkU3RlbUZ1bmN0aW9uczxDb21wbGV4U2NhbGFyPjo6Y29zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OnNpbmgoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQocm93cygpID09IGNvbHMoKSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb248U2NhbGFyPjo6Q29tcGxleFNjYWxhciBDb21wbGV4U2NhbGFyOworICByZXR1cm4gTWF0cml4RnVuY3Rpb25SZXR1cm5WYWx1ZTxEZXJpdmVkPihkZXJpdmVkKCksIFN0ZFN0ZW1GdW5jdGlvbnM8Q29tcGxleFNjYWxhcj46OnNpbmgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IE1hdHJpeEZ1bmN0aW9uUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6Y29zaCgpIGNvbnN0Cit7CisgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6c3RlbV9mdW5jdGlvbjxTY2FsYXI+OjpDb21wbGV4U2NhbGFyIENvbXBsZXhTY2FsYXI7CisgIHJldHVybiBNYXRyaXhGdW5jdGlvblJldHVyblZhbHVlPERlcml2ZWQ+KGRlcml2ZWQoKSwgU3RkU3RlbUZ1bmN0aW9uczxDb21wbGV4U2NhbGFyPjo6Y29zaCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFUUklYX0ZVTkNUSU9OCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeEZ1bmN0aW9uQXRvbWljLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeEZ1bmN0aW9uQXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlMzMyYwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4RnVuY3Rpb25BdG9taWMuaApAQCAtMCwwICsxLDEzMSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUUklYX0ZVTkNUSU9OX0FUT01JQworI2RlZmluZSBFSUdFTl9NQVRSSVhfRlVOQ1RJT05fQVRPTUlDCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgTWF0cml4RnVuY3Rpb25zX01vZHVsZQorICAqIFxjbGFzcyBNYXRyaXhGdW5jdGlvbkF0b21pYworICAqIFxicmllZiBIZWxwZXIgY2xhc3MgZm9yIGNvbXB1dGluZyBtYXRyaXggZnVuY3Rpb25zIG9mIGF0b21pYyBtYXRyaWNlcy4KKyAgKgorICAqIFxpbnRlcm5hbAorICAqIEhlcmUsIGFuIGF0b21pYyBtYXRyaXggaXMgYSB0cmlhbmd1bGFyIG1hdHJpeCB3aG9zZSBkaWFnb25hbAorICAqIGVudHJpZXMgYXJlIGNsb3NlIHRvIGVhY2ggb3RoZXIuCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIE1hdHJpeEZ1bmN0aW9uQXRvbWljCit7CisgIHB1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpzdGVtX2Z1bmN0aW9uPFNjYWxhcj46OnR5cGUgU3RlbUZ1bmN0aW9uOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CisKKyAgICAvKiogXGJyaWVmIENvbnN0cnVjdG9yCisgICAgICAqIFxwYXJhbVtpbl0gIGYgIG1hdHJpeCBmdW5jdGlvbiB0byBjb21wdXRlLgorICAgICAgKi8KKyAgICBNYXRyaXhGdW5jdGlvbkF0b21pYyhTdGVtRnVuY3Rpb24gZikgOiBtX2YoZikgeyB9CisKKyAgICAvKiogXGJyaWVmIENvbXB1dGUgbWF0cml4IGZ1bmN0aW9uIG9mIGF0b21pYyBtYXRyaXgKKyAgICAgICogXHBhcmFtW2luXSAgQSAgYXJndW1lbnQgb2YgbWF0cml4IGZ1bmN0aW9uLCBzaG91bGQgYmUgdXBwZXIgdHJpYW5ndWxhciBhbmQgYXRvbWljCisgICAgICAqIFxyZXR1cm5zICBmKEEpLCB0aGUgbWF0cml4IGZ1bmN0aW9uIGV2YWx1YXRlZCBhdCB0aGUgZ2l2ZW4gbWF0cml4CisgICAgICAqLworICAgIE1hdHJpeFR5cGUgY29tcHV0ZShjb25zdCBNYXRyaXhUeXBlJiBBKTsKKworICBwcml2YXRlOgorCisgICAgLy8gUHJldmVudCBjb3B5aW5nCisgICAgTWF0cml4RnVuY3Rpb25BdG9taWMoY29uc3QgTWF0cml4RnVuY3Rpb25BdG9taWMmKTsKKyAgICBNYXRyaXhGdW5jdGlvbkF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeEZ1bmN0aW9uQXRvbWljJik7CisKKyAgICB2b2lkIGNvbXB1dGVNdSgpOworICAgIGJvb2wgdGF5bG9yQ29udmVyZ2VkKEluZGV4IHMsIGNvbnN0IE1hdHJpeFR5cGUmIEYsIGNvbnN0IE1hdHJpeFR5cGUmIEZpbmNyLCBjb25zdCBNYXRyaXhUeXBlJiBQKTsKKworICAgIC8qKiBcYnJpZWYgUG9pbnRlciB0byBzY2FsYXIgZnVuY3Rpb24gKi8KKyAgICBTdGVtRnVuY3Rpb24qIG1fZjsKKworICAgIC8qKiBcYnJpZWYgU2l6ZSBvZiBtYXRyaXggZnVuY3Rpb24gKi8KKyAgICBJbmRleCBtX0Fyb3dzOworCisgICAgLyoqIFxicmllZiBNZWFuIG9mIGVpZ2VudmFsdWVzICovCisgICAgU2NhbGFyIG1fYXZnRWl2YWw7CisKKyAgICAvKiogXGJyaWVmIEFyZ3VtZW50IHNoaWZ0ZWQgYnkgbWVhbiBvZiBlaWdlbnZhbHVlcyAqLworICAgIE1hdHJpeFR5cGUgbV9Bc2hpZnRlZDsKKworICAgIC8qKiBcYnJpZWYgQ29uc3RhbnQgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBUYXlsb3Igc2VyaWVzIGhhcyBjb252ZXJnZWQgKi8KKyAgICBSZWFsU2NhbGFyIG1fbXU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeFR5cGUgTWF0cml4RnVuY3Rpb25BdG9taWM8TWF0cml4VHlwZT46OmNvbXB1dGUoY29uc3QgTWF0cml4VHlwZSYgQSkKK3sKKyAgLy8gVE9ETzogVXNlIHRoYXQgQSBpcyB1cHBlciB0cmlhbmd1bGFyCisgIG1fQXJvd3MgPSBBLnJvd3MoKTsKKyAgbV9hdmdFaXZhbCA9IEEudHJhY2UoKSAvIFNjYWxhcihSZWFsU2NhbGFyKG1fQXJvd3MpKTsKKyAgbV9Bc2hpZnRlZCA9IEEgLSBtX2F2Z0VpdmFsICogTWF0cml4VHlwZTo6SWRlbnRpdHkobV9Bcm93cywgbV9Bcm93cyk7CisgIGNvbXB1dGVNdSgpOworICBNYXRyaXhUeXBlIEYgPSBtX2YobV9hdmdFaXZhbCwgMCkgKiBNYXRyaXhUeXBlOjpJZGVudGl0eShtX0Fyb3dzLCBtX0Fyb3dzKTsKKyAgTWF0cml4VHlwZSBQID0gbV9Bc2hpZnRlZDsKKyAgTWF0cml4VHlwZSBGaW5jcjsKKyAgZm9yIChJbmRleCBzID0gMTsgcyA8IDEuMSAqIG1fQXJvd3MgKyAxMDsgcysrKSB7IC8vIHVwcGVyIGxpbWl0IGlzIGZhaXJseSBhcmJpdHJhcnkKKyAgICBGaW5jciA9IG1fZihtX2F2Z0VpdmFsLCBzdGF0aWNfY2FzdDxpbnQ+KHMpKSAqIFA7CisgICAgRiArPSBGaW5jcjsKKyAgICBQID0gU2NhbGFyKFJlYWxTY2FsYXIoMS4wLyhzICsgMSkpKSAqIFAgKiBtX0FzaGlmdGVkOworICAgIGlmICh0YXlsb3JDb252ZXJnZWQocywgRiwgRmluY3IsIFApKSB7CisgICAgICByZXR1cm4gRjsKKyAgICB9CisgIH0KKyAgZWlnZW5fYXNzZXJ0KCJUYXlsb3Igc2VyaWVzIGRvZXMgbm90IGNvbnZlcmdlIiAmJiAwKTsKKyAgcmV0dXJuIEY7Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZSBcYyBtX211LiAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeEZ1bmN0aW9uQXRvbWljPE1hdHJpeFR5cGU+Ojpjb21wdXRlTXUoKQoreworICBjb25zdCBNYXRyaXhUeXBlIE4gPSBNYXRyaXhUeXBlOjpJZGVudGl0eShtX0Fyb3dzLCBtX0Fyb3dzKSAtIG1fQXNoaWZ0ZWQ7CisgIFZlY3RvclR5cGUgZSA9IFZlY3RvclR5cGU6Ok9uZXMobV9Bcm93cyk7CisgIE4udGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKGUpOworICBtX211ID0gZS5jd2lzZUFicygpLm1heENvZWZmKCk7Cit9CisKKy8qKiBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgVGF5bG9yIHNlcmllcyBoYXMgY29udmVyZ2VkICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2Jvb2wgTWF0cml4RnVuY3Rpb25BdG9taWM8TWF0cml4VHlwZT46OnRheWxvckNvbnZlcmdlZChJbmRleCBzLCBjb25zdCBNYXRyaXhUeXBlJiBGLAorCQkJCQkJICAgICAgIGNvbnN0IE1hdHJpeFR5cGUmIEZpbmNyLCBjb25zdCBNYXRyaXhUeXBlJiBQKQoreworICBjb25zdCBJbmRleCBuID0gRi5yb3dzKCk7CisgIGNvbnN0IFJlYWxTY2FsYXIgRl9ub3JtID0gRi5jd2lzZUFicygpLnJvd3dpc2UoKS5zdW0oKS5tYXhDb2VmZigpOworICBjb25zdCBSZWFsU2NhbGFyIEZpbmNyX25vcm0gPSBGaW5jci5jd2lzZUFicygpLnJvd3dpc2UoKS5zdW0oKS5tYXhDb2VmZigpOworICBpZiAoRmluY3Jfbm9ybSA8IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiBGX25vcm0pIHsKKyAgICBSZWFsU2NhbGFyIGRlbHRhID0gMDsKKyAgICBSZWFsU2NhbGFyIHJmYWN0b3JpYWwgPSAxOworICAgIGZvciAoSW5kZXggciA9IDA7IHIgPCBuOyByKyspIHsKKyAgICAgIFJlYWxTY2FsYXIgbXggPSAwOworICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgbXggPSAoc3RkOjptYXgpKG14LCBzdGQ6OmFicyhtX2YobV9Bc2hpZnRlZChpLCBpKSArIG1fYXZnRWl2YWwsIHN0YXRpY19jYXN0PGludD4ocytyKSkpKTsKKyAgICAgIGlmIChyICE9IDApCisgICAgICAgIHJmYWN0b3JpYWwgKj0gUmVhbFNjYWxhcihyKTsKKyAgICAgIGRlbHRhID0gKHN0ZDo6bWF4KShkZWx0YSwgbXggLyByZmFjdG9yaWFsKTsKKyAgICB9CisgICAgY29uc3QgUmVhbFNjYWxhciBQX25vcm0gPSBQLmN3aXNlQWJzKCkucm93d2lzZSgpLnN1bSgpLm1heENvZWZmKCk7CisgICAgaWYgKG1fbXUgKiBkZWx0YSAqIFBfbm9ybSA8IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiBGX25vcm0pCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTUFUUklYX0ZVTkNUSU9OX0FUT01JQwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01hdHJpeEZ1bmN0aW9ucy9NYXRyaXhMb2dhcml0aG0uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4TG9nYXJpdGhtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1MDUxNAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4TG9nYXJpdGhtLmgKQEAgLTAsMCArMSw0OTUgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQ2hlbi1QYW5nIEhlIDxqZGg4QG1zNjMuaGluZXQubmV0PgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9NQVRSSVhfTE9HQVJJVEhNCisjZGVmaW5lIEVJR0VOX01BVFJJWF9MT0dBUklUSE0KKworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDNMCisjZW5kaWYKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgICogXGNsYXNzIE1hdHJpeExvZ2FyaXRobUF0b21pYworICAqIFxicmllZiBIZWxwZXIgY2xhc3MgZm9yIGNvbXB1dGluZyBtYXRyaXggbG9nYXJpdGhtIG9mIGF0b21pYyBtYXRyaWNlcy4KKyAgKgorICAqIFxpbnRlcm5hbAorICAqIEhlcmUsIGFuIGF0b21pYyBtYXRyaXggaXMgYSB0cmlhbmd1bGFyIG1hdHJpeCB3aG9zZSBkaWFnb25hbAorICAqIGVudHJpZXMgYXJlIGNsb3NlIHRvIGVhY2ggb3RoZXIuCisgICoKKyAgKiBcc2EgY2xhc3MgTWF0cml4RnVuY3Rpb25BdG9taWMsIE1hdHJpeEJhc2U6OmxvZygpCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIE1hdHJpeExvZ2FyaXRobUF0b21pYworeworcHVibGljOgorCisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgLy8gdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworICAvLyB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpzdGVtX2Z1bmN0aW9uPFNjYWxhcj46OnR5cGUgU3RlbUZ1bmN0aW9uOworICAvLyB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOworCisgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IuICovCisgIE1hdHJpeExvZ2FyaXRobUF0b21pYygpIHsgfQorCisgIC8qKiBcYnJpZWYgQ29tcHV0ZSBtYXRyaXggbG9nYXJpdGhtIG9mIGF0b21pYyBtYXRyaXgKKyAgICAqIFxwYXJhbVtpbl0gIEEgIGFyZ3VtZW50IG9mIG1hdHJpeCBsb2dhcml0aG0sIHNob3VsZCBiZSB1cHBlciB0cmlhbmd1bGFyIGFuZCBhdG9taWMKKyAgICAqIFxyZXR1cm5zICBUaGUgbG9nYXJpdGhtIG9mIFxwIEEuCisgICAgKi8KKyAgTWF0cml4VHlwZSBjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIEEpOworCitwcml2YXRlOgorCisgIHZvaWQgY29tcHV0ZTJ4Mihjb25zdCBNYXRyaXhUeXBlJiBBLCBNYXRyaXhUeXBlJiByZXN1bHQpOworICB2b2lkIGNvbXB1dGVCaWcoY29uc3QgTWF0cml4VHlwZSYgQSwgTWF0cml4VHlwZSYgcmVzdWx0KTsKKyAgc3RhdGljIFNjYWxhciBhdGFuaChTY2FsYXIgeCk7CisgIGludCBnZXRQYWRlRGVncmVlKGZsb2F0IG5vcm1UbWludXNJKTsKKyAgaW50IGdldFBhZGVEZWdyZWUoZG91YmxlIG5vcm1UbWludXNJKTsKKyAgaW50IGdldFBhZGVEZWdyZWUobG9uZyBkb3VibGUgbm9ybVRtaW51c0kpOworICB2b2lkIGNvbXB1dGVQYWRlKE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCwgaW50IGRlZ3JlZSk7CisgIHZvaWQgY29tcHV0ZVBhZGUzKE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCk7CisgIHZvaWQgY29tcHV0ZVBhZGU0KE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCk7CisgIHZvaWQgY29tcHV0ZVBhZGU1KE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCk7CisgIHZvaWQgY29tcHV0ZVBhZGU2KE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCk7CisgIHZvaWQgY29tcHV0ZVBhZGU3KE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCk7CisgIHZvaWQgY29tcHV0ZVBhZGU4KE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCk7CisgIHZvaWQgY29tcHV0ZVBhZGU5KE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCk7CisgIHZvaWQgY29tcHV0ZVBhZGUxMChNYXRyaXhUeXBlJiByZXN1bHQsIGNvbnN0IE1hdHJpeFR5cGUmIFQpOworICB2b2lkIGNvbXB1dGVQYWRlMTEoTWF0cml4VHlwZSYgcmVzdWx0LCBjb25zdCBNYXRyaXhUeXBlJiBUKTsKKworICBzdGF0aWMgY29uc3QgaW50IG1pblBhZGVEZWdyZWUgPSAzOworICBzdGF0aWMgY29uc3QgaW50IG1heFBhZGVEZWdyZWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpkaWdpdHM8PSAyND8gIDU6ICAgICAgLy8gc2luZ2xlIHByZWNpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpkaWdpdHM8PSA1Mz8gIDc6ICAgICAgLy8gZG91YmxlIHByZWNpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpkaWdpdHM8PSA2ND8gIDg6ICAgICAgLy8gZXh0ZW5kZWQgcHJlY2lzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmRpZ2l0czw9MTA2PyAxMDogMTE7ICAvLyBkb3VibGUtZG91YmxlIG9yIHF1YWRydXBsZSBwcmVjaXNpb24KKworICAvLyBQcmV2ZW50IGNvcHlpbmcKKyAgTWF0cml4TG9nYXJpdGhtQXRvbWljKGNvbnN0IE1hdHJpeExvZ2FyaXRobUF0b21pYyYpOworICBNYXRyaXhMb2dhcml0aG1BdG9taWMmIG9wZXJhdG9yPShjb25zdCBNYXRyaXhMb2dhcml0aG1BdG9taWMmKTsKK307CisKKy8qKiBcYnJpZWYgQ29tcHV0ZSBsb2dhcml0aG0gb2YgdHJpYW5ndWxhciBtYXRyaXggd2l0aCBjbHVzdGVyZWQgZWlnZW52YWx1ZXMuICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeFR5cGUgTWF0cml4TG9nYXJpdGhtQXRvbWljPE1hdHJpeFR5cGU+Ojpjb21wdXRlKGNvbnN0IE1hdHJpeFR5cGUmIEEpCit7CisgIHVzaW5nIHN0ZDo6bG9nOworICBNYXRyaXhUeXBlIHJlc3VsdChBLnJvd3MoKSwgQS5yb3dzKCkpOworICBpZiAoQS5yb3dzKCkgPT0gMSkKKyAgICByZXN1bHQoMCwwKSA9IGxvZyhBKDAsMCkpOworICBlbHNlIGlmIChBLnJvd3MoKSA9PSAyKQorICAgIGNvbXB1dGUyeDIoQSwgcmVzdWx0KTsKKyAgZWxzZQorICAgIGNvbXB1dGVCaWcoQSwgcmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqIFxicmllZiBDb21wdXRlIGF0YW5oIChpbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudCkuICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3R5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBNYXRyaXhMb2dhcml0aG1BdG9taWM8TWF0cml4VHlwZT46OmF0YW5oKHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciB4KQoreworICB1c2luZyBzdGQ6OmFiczsKKyAgdXNpbmcgc3RkOjpzcXJ0OworICBpZiAoYWJzKHgpID4gc3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKSkKKyAgICByZXR1cm4gU2NhbGFyKDAuNSkgKiBsb2coKFNjYWxhcigxKSArIHgpIC8gKFNjYWxhcigxKSAtIHgpKTsKKyAgZWxzZQorICAgIHJldHVybiB4ICsgeCp4KnggLyBTY2FsYXIoMyk7Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZSBsb2dhcml0aG0gb2YgMngyIHRyaWFuZ3VsYXIgbWF0cml4LiAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeExvZ2FyaXRobUF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZTJ4Mihjb25zdCBNYXRyaXhUeXBlJiBBLCBNYXRyaXhUeXBlJiByZXN1bHQpCit7CisgIHVzaW5nIHN0ZDo6YWJzOworICB1c2luZyBzdGQ6OmNlaWw7CisgIHVzaW5nIHN0ZDo6aW1hZzsKKyAgdXNpbmcgc3RkOjpsb2c7CisKKyAgU2NhbGFyIGxvZ0EwMCA9IGxvZyhBKDAsMCkpOworICBTY2FsYXIgbG9nQTExID0gbG9nKEEoMSwxKSk7CisKKyAgcmVzdWx0KDAsMCkgPSBsb2dBMDA7CisgIHJlc3VsdCgxLDApID0gU2NhbGFyKDApOworICByZXN1bHQoMSwxKSA9IGxvZ0ExMTsKKworICBpZiAoQSgwLDApID09IEEoMSwxKSkgeworICAgIHJlc3VsdCgwLDEpID0gQSgwLDEpIC8gQSgwLDApOworICB9IGVsc2UgaWYgKChhYnMoQSgwLDApKSA8IDAuNSphYnMoQSgxLDEpKSkgfHwgKGFicyhBKDAsMCkpID4gMiphYnMoQSgxLDEpKSkpIHsKKyAgICByZXN1bHQoMCwxKSA9IEEoMCwxKSAqIChsb2dBMTEgLSBsb2dBMDApIC8gKEEoMSwxKSAtIEEoMCwwKSk7CisgIH0gZWxzZSB7CisgICAgLy8gY29tcHV0YXRpb24gaW4gcHJldmlvdXMgYnJhbmNoIGlzIGluYWNjdXJhdGUgaWYgQSgxLDEpIFxhcHByb3ggQSgwLDApCisgICAgaW50IHVud2luZGluZ051bWJlciA9IHN0YXRpY19jYXN0PGludD4oY2VpbCgoaW1hZyhsb2dBMTEgLSBsb2dBMDApIC0gTV9QSSkgLyAoMipNX1BJKSkpOworICAgIFNjYWxhciB6ID0gKEEoMSwxKSAtIEEoMCwwKSkgLyAoQSgxLDEpICsgQSgwLDApKTsKKyAgICByZXN1bHQoMCwxKSA9IEEoMCwxKSAqIChTY2FsYXIoMikgKiBhdGFuaCh6KSArIFNjYWxhcigwLDIqTV9QSSp1bndpbmRpbmdOdW1iZXIpKSAvIChBKDEsMSkgLSBBKDAsMCkpOworICB9Cit9CisKKy8qKiBcYnJpZWYgQ29tcHV0ZSBsb2dhcml0aG0gb2YgdHJpYW5ndWxhciBtYXRyaWNlcyB3aXRoIHNpemUgPiAyLiAKKyAgKiBcZGV0YWlscyBUaGlzIHVzZXMgYSBpbnZlcnNlIHNjYWxlLWFuZC1zcXVhcmUgYWxnb3JpdGhtLiAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeExvZ2FyaXRobUF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZUJpZyhjb25zdCBNYXRyaXhUeXBlJiBBLCBNYXRyaXhUeXBlJiByZXN1bHQpCit7CisgIGludCBudW1iZXJPZlNxdWFyZVJvb3RzID0gMDsKKyAgaW50IG51bWJlck9mRXh0cmFTcXVhcmVSb290cyA9IDA7CisgIGludCBkZWdyZWU7CisgIE1hdHJpeFR5cGUgVCA9IEE7CisgIGNvbnN0IFJlYWxTY2FsYXIgbWF4Tm9ybUZvclBhZGUgPSBtYXhQYWRlRGVncmVlPD0gNT8gNS4zMTQ5NzI5OTY3MTE3MzEwZS0xOiAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhZGVEZWdyZWU8PSA3PyAyLjY0Mjk2MDgzMTExMTQzNTBlLTE6ICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlIHByZWNpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGFkZURlZ3JlZTw9IDg/IDIuMzI3Nzc3NzY1MjM3MDM4OTIwOTRlLTFMOiAgICAgICAgICAgICAgICAvLyBleHRlbmRlZCBwcmVjaXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhZGVEZWdyZWU8PTEwPyAxLjA1MDI2NTAzNDcxMzUxMDgwNDgxMDkzNjUyNjUxMTA1ZS0xTDogICAgLy8gZG91YmxlLWRvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTg4MDk2MDIyMDIxNjc1OTI0NTQ2Nzk1MTU5Mjg4MzY0MmUtMUw7ICAvLyBxdWFkcnVwbGUgcHJlY2lzaW9uCisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBSZWFsU2NhbGFyIG5vcm1UbWludXNJID0gKFQgLSBNYXRyaXhUeXBlOjpJZGVudGl0eShULnJvd3MoKSwgVC5yb3dzKCkpKS5jd2lzZUFicygpLmNvbHdpc2UoKS5zdW0oKS5tYXhDb2VmZigpOworICAgIGlmIChub3JtVG1pbnVzSSA8IG1heE5vcm1Gb3JQYWRlKSB7CisgICAgICBkZWdyZWUgPSBnZXRQYWRlRGVncmVlKG5vcm1UbWludXNJKTsKKyAgICAgIGludCBkZWdyZWUyID0gZ2V0UGFkZURlZ3JlZShub3JtVG1pbnVzSSAvIFJlYWxTY2FsYXIoMikpOworICAgICAgaWYgKChkZWdyZWUgLSBkZWdyZWUyIDw9IDEpIHx8IChudW1iZXJPZkV4dHJhU3F1YXJlUm9vdHMgPT0gMSkpIAorCWJyZWFrOworICAgICAgKytudW1iZXJPZkV4dHJhU3F1YXJlUm9vdHM7CisgICAgfQorICAgIE1hdHJpeFR5cGUgc3FydFQ7CisgICAgTWF0cml4U3F1YXJlUm9vdFRyaWFuZ3VsYXI8TWF0cml4VHlwZT4oVCkuY29tcHV0ZShzcXJ0VCk7CisgICAgVCA9IHNxcnRUOworICAgICsrbnVtYmVyT2ZTcXVhcmVSb290czsKKyAgfQorCisgIGNvbXB1dGVQYWRlKHJlc3VsdCwgVCwgZGVncmVlKTsKKyAgcmVzdWx0ICo9IHBvdyhSZWFsU2NhbGFyKDIpLCBudW1iZXJPZlNxdWFyZVJvb3RzKTsKK30KKworLyogXGJyaWVmIEdldCBzdWl0YWJsZSBkZWdyZWUgZm9yIFBhZGUgYXBwcm94aW1hdGlvbi4gKHNwZWNpYWxpemVkIGZvciBSZWFsU2NhbGFyID0gZmxvYXQpICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2ludCBNYXRyaXhMb2dhcml0aG1BdG9taWM8TWF0cml4VHlwZT46OmdldFBhZGVEZWdyZWUoZmxvYXQgbm9ybVRtaW51c0kpCit7CisgIGNvbnN0IGZsb2F0IG1heE5vcm1Gb3JQYWRlW10gPSB7IDIuNTExMTU3MzkzNDU1NTA1NGUtMSAvKiBkZWdyZWUgPSAzICovICwgNC4wNTM1ODM3NDExODgwNDkzZS0xLAorICAgICAgICAgICAgNS4zMTQ5NzI5OTY3MTE3MzEwZS0xIH07CisgIGZvciAoaW50IGRlZ3JlZSA9IDM7IGRlZ3JlZSA8PSBtYXhQYWRlRGVncmVlOyArK2RlZ3JlZSkgCisgICAgaWYgKG5vcm1UbWludXNJIDw9IG1heE5vcm1Gb3JQYWRlW2RlZ3JlZSAtIG1pblBhZGVEZWdyZWVdKQorICAgICAgcmV0dXJuIGRlZ3JlZTsKKyAgYXNzZXJ0KGZhbHNlKTsgLy8gdGhpcyBsaW5lIHNob3VsZCBuZXZlciBiZSByZWFjaGVkCit9CisKKy8qIFxicmllZiBHZXQgc3VpdGFibGUgZGVncmVlIGZvciBQYWRlIGFwcHJveGltYXRpb24uIChzcGVjaWFsaXplZCBmb3IgUmVhbFNjYWxhciA9IGRvdWJsZSkgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgoraW50IE1hdHJpeExvZ2FyaXRobUF0b21pYzxNYXRyaXhUeXBlPjo6Z2V0UGFkZURlZ3JlZShkb3VibGUgbm9ybVRtaW51c0kpCit7CisgIGNvbnN0IGRvdWJsZSBtYXhOb3JtRm9yUGFkZVtdID0geyAxLjYyMDYyODQ3OTUwMTU2MjRlLTIgLyogZGVncmVlID0gMyAqLyAsIDUuMzg3MzUzMjYzMTM4MTE3MWUtMiwKKyAgICAgICAgICAgIDEuMTM1MjgwMjI2NzYyODY4MWUtMSwgMS44NjYyODYwNjEzNTQxMjg4ZS0xLCAyLjY0Mjk2MDgzMTExMTQzNWUtMSB9OworICBmb3IgKGludCBkZWdyZWUgPSAzOyBkZWdyZWUgPD0gbWF4UGFkZURlZ3JlZTsgKytkZWdyZWUpCisgICAgaWYgKG5vcm1UbWludXNJIDw9IG1heE5vcm1Gb3JQYWRlW2RlZ3JlZSAtIG1pblBhZGVEZWdyZWVdKQorICAgICAgcmV0dXJuIGRlZ3JlZTsKKyAgYXNzZXJ0KGZhbHNlKTsgLy8gdGhpcyBsaW5lIHNob3VsZCBuZXZlciBiZSByZWFjaGVkCit9CisKKy8qIFxicmllZiBHZXQgc3VpdGFibGUgZGVncmVlIGZvciBQYWRlIGFwcHJveGltYXRpb24uIChzcGVjaWFsaXplZCBmb3IgUmVhbFNjYWxhciA9IGxvbmcgZG91YmxlKSAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitpbnQgTWF0cml4TG9nYXJpdGhtQXRvbWljPE1hdHJpeFR5cGU+OjpnZXRQYWRlRGVncmVlKGxvbmcgZG91YmxlIG5vcm1UbWludXNJKQoreworI2lmICAgTERCTF9NQU5UX0RJRyA9PSA1MyAgICAgICAgIC8vIGRvdWJsZSBwcmVjaXNpb24KKyAgY29uc3QgZG91YmxlIG1heE5vcm1Gb3JQYWRlW10gPSB7IDEuNjIwNjI4NDc5NTAxNTYyNGUtMiAvKiBkZWdyZWUgPSAzICovICwgNS4zODczNTMyNjMxMzgxMTcxZS0yLAorICAgICAgICAgICAgMS4xMzUyODAyMjY3NjI4NjgxZS0xLCAxLjg2NjI4NjA2MTM1NDEyODhlLTEsIDIuNjQyOTYwODMxMTExNDM1ZS0xIH07CisjZWxpZiBMREJMX01BTlRfRElHIDw9IDY0ICAgICAgICAgLy8gZXh0ZW5kZWQgcHJlY2lzaW9uCisgIGNvbnN0IGRvdWJsZSBtYXhOb3JtRm9yUGFkZVtdID0geyA1LjQ4MjU2NjkwMzU3NzgyODYzMTAzZS0zIC8qIGRlZ3JlZSA9IDMgKi8sIDIuMzQ1NTkxNjIzODc5NzExNjczMjFlLTIsCisgICAgICAgICAgICA1Ljg0NjAzOTIzODk3MzQ3NDQ5ODU3ZS0yLCAxLjA4NDg2NDIzNzU2NzI1MTcwMjIzZS0xLCAxLjY4Mzg1NzY3ODgxMjk0NDQ2NjQ5ZS0xLAorICAgICAgICAgICAgMi4zMjc3Nzc3NjUyMzcwMzg5MjA5NGUtMSB9OworI2VsaWYgTERCTF9NQU5UX0RJRyA8PSAxMDYgICAgICAgIC8vIGRvdWJsZS1kb3VibGUKKyAgY29uc3QgZG91YmxlIG1heE5vcm1Gb3JQYWRlW10gPSB7IDguNTg5NzA1NTAzNDI5Mzk1NjIyMDI1Mjk2NjQzMTg4OTBlLTUgLyogZGVncmVlID0gMyAqLywKKyAgICAgICAgICAgIDkuMzQwNzQzMjg0NDYzNTk2NTQwMzk0NDY1NTI2Nzc3NTllLTQsIDQuMjYxMTcxOTQ2NDc2NzIxNzU3NzMwNjQxMTQ1ODI4NjBlLTMsCisgICAgICAgICAgICAxLjIxNTQ2MjI0NzQwMjgxODQ4NzQzMTQ5NjY2NTYwNDY0ZS0yLCAyLjYxMTAwNTQ0OTk4MzM5NDM2NzEzMDg4MjQ4NTU3NDQ0ZS0yLAorICAgICAgICAgICAgNC42NjE3MDA3NDYyNzA1Mjc0OTI0MzAxODU2NjM5MDU2N2UtMiwgNy4zMjU4NTE0NDQ0NDEzNTAyNzU2NTg3MjAxNDkzMjM4N2UtMiwKKyAgICAgICAgICAgIDEuMDUwMjY1MDM0NzEzNTEwODA0ODEwOTM2NTI2NTExMDVlLTEgfTsKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWFkcnVwbGUgcHJlY2lzaW9uCisgIGNvbnN0IGRvdWJsZSBtYXhOb3JtRm9yUGFkZVtdID0geyA0Ljc0MTk5MzExODcxOTMwMDUwNDg1MDE1NjgxNjc4NTgxMDNlLTUgLyogZGVncmVlID0gMyAqLywKKyAgICAgICAgICAgIDUuODg1MzE2ODQ3MzU0NDU2MDQ3MDM4Nzc2OTQ4MDE5MjY2NmUtNCwgMi45MjE2MTIwMzY2NjAxMzE1MzkxNzg5NDkzNjI4MTEzNTIwZS0zLAorICAgICAgICAgICAgOC44NDE1NzU4MTI0MzE5NDM0MzQ3MTE2NzM0NzA1MTc0MzA4ZS0zLCAxLjk4NTA4MzYwMjk0NDk0NDY2Njg1MTgwNDk1NjI1NjUyOTFlLTIsCisgICAgICAgICAgICAzLjY2ODgwMTk3Mjk2NTM0NDY5MjY1ODUyNDIxOTI0NDc0NDdlLTIsIDUuOTI5MDk2MjI5NDAyMDE4Njk5ODk1NDA1NTI2NDUyODM5M2UtMiwKKyAgICAgICAgICAgIDguNjk5ODQzNjA4MTYzNDM0MzkwMzI1MDU4MDk5MjEyNzY3N2UtMiwgMS4xODgwOTYwMjIwMjE2NzU5MjQ1NDY3OTUxNTkyODgzNjQyZS0xIH07CisjZW5kaWYKKyAgZm9yIChpbnQgZGVncmVlID0gMzsgZGVncmVlIDw9IG1heFBhZGVEZWdyZWU7ICsrZGVncmVlKQorICAgIGlmIChub3JtVG1pbnVzSSA8PSBtYXhOb3JtRm9yUGFkZVtkZWdyZWUgLSBtaW5QYWRlRGVncmVlXSkKKyAgICAgIHJldHVybiBkZWdyZWU7CisgIGFzc2VydChmYWxzZSk7IC8vIHRoaXMgbGluZSBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZAorfQorCisvKiBcYnJpZWYgQ29tcHV0ZSBQYWRlIGFwcHJveGltYXRpb24gdG8gbWF0cml4IGxvZ2FyaXRobSAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeExvZ2FyaXRobUF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZVBhZGUoTWF0cml4VHlwZSYgcmVzdWx0LCBjb25zdCBNYXRyaXhUeXBlJiBULCBpbnQgZGVncmVlKQoreworICBzd2l0Y2ggKGRlZ3JlZSkgeworICAgIGNhc2UgMzogIGNvbXB1dGVQYWRlMyhyZXN1bHQsIFQpOyAgYnJlYWs7CisgICAgY2FzZSA0OiAgY29tcHV0ZVBhZGU0KHJlc3VsdCwgVCk7ICBicmVhazsKKyAgICBjYXNlIDU6ICBjb21wdXRlUGFkZTUocmVzdWx0LCBUKTsgIGJyZWFrOworICAgIGNhc2UgNjogIGNvbXB1dGVQYWRlNihyZXN1bHQsIFQpOyAgYnJlYWs7CisgICAgY2FzZSA3OiAgY29tcHV0ZVBhZGU3KHJlc3VsdCwgVCk7ICBicmVhazsKKyAgICBjYXNlIDg6ICBjb21wdXRlUGFkZTgocmVzdWx0LCBUKTsgIGJyZWFrOworICAgIGNhc2UgOTogIGNvbXB1dGVQYWRlOShyZXN1bHQsIFQpOyAgYnJlYWs7CisgICAgY2FzZSAxMDogY29tcHV0ZVBhZGUxMChyZXN1bHQsIFQpOyBicmVhazsKKyAgICBjYXNlIDExOiBjb21wdXRlUGFkZTExKHJlc3VsdCwgVCk7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgfQorfSAKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeExvZ2FyaXRobUF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZVBhZGUzKE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCkKK3sKKyAgY29uc3QgaW50IGRlZ3JlZSA9IDM7CisgIGNvbnN0IFJlYWxTY2FsYXIgbm9kZXNbXSAgID0geyAwLjExMjcwMTY2NTM3OTI1ODMxMTQ4MjA3MzQ2MDAyMTc2MDBMLCAwLjUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBMLAorICAgICAgICAgICAgMC44ODcyOTgzMzQ2MjA3NDE2ODg1MTc5MjY1Mzk5NzgyNDAwTCB9OworICBjb25zdCBSZWFsU2NhbGFyIHdlaWdodHNbXSA9IHsgMC4yNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc4TCwgMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0TCwKKyAgICAgICAgICAgIDAuMjc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OEwgfTsKKyAgYXNzZXJ0KGRlZ3JlZSA8PSBtYXhQYWRlRGVncmVlKTsKKyAgTWF0cml4VHlwZSBUbWludXNJID0gVCAtIE1hdHJpeFR5cGU6OklkZW50aXR5KFQucm93cygpLCBULnJvd3MoKSk7CisgIHJlc3VsdC5zZXRaZXJvKFQucm93cygpLCBULnJvd3MoKSk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgZGVncmVlOyArK2spCisgICAgcmVzdWx0ICs9IHdlaWdodHNba10gKiAoTWF0cml4VHlwZTo6SWRlbnRpdHkoVC5yb3dzKCksIFQucm93cygpKSArIG5vZGVzW2tdICogVG1pbnVzSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShUbWludXNJKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeExvZ2FyaXRobUF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZVBhZGU0KE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCkKK3sKKyAgY29uc3QgaW50IGRlZ3JlZSA9IDQ7CisgIGNvbnN0IFJlYWxTY2FsYXIgbm9kZXNbXSAgID0geyAwLjA2OTQzMTg0NDIwMjk3MzcxMjM4ODAyNjc1NTU1MzU5NTNMLCAwLjMzMDAwOTQ3ODIwNzU3MTg2NzU5ODY2NzEyMDQ0ODM3NzdMLAorICAgICAgICAgICAgMC42Njk5OTA1MjE3OTI0MjgxMzI0MDEzMzI4Nzk1NTE2MjIzTCwgMC45MzA1NjgxNTU3OTcwMjYyODc2MTE5NzMyNDQ0NDY0MDQ4TCB9OworICBjb25zdCBSZWFsU2NhbGFyIHdlaWdodHNbXSA9IHsgMC4xNzM5Mjc0MjI1Njg3MjY5Mjg2ODY1MzE5NzQ2MTA5OTk3TCwgMC4zMjYwNzI1Nzc0MzEyNzMwNzEzMTM0NjgwMjUzODkwMDAzTCwKKyAgICAgICAgICAgIDAuMzI2MDcyNTc3NDMxMjczMDcxMzEzNDY4MDI1Mzg5MDAwM0wsIDAuMTczOTI3NDIyNTY4NzI2OTI4Njg2NTMxOTc0NjEwOTk5N0wgfTsKKyAgYXNzZXJ0KGRlZ3JlZSA8PSBtYXhQYWRlRGVncmVlKTsKKyAgTWF0cml4VHlwZSBUbWludXNJID0gVCAtIE1hdHJpeFR5cGU6OklkZW50aXR5KFQucm93cygpLCBULnJvd3MoKSk7CisgIHJlc3VsdC5zZXRaZXJvKFQucm93cygpLCBULnJvd3MoKSk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgZGVncmVlOyArK2spCisgICAgcmVzdWx0ICs9IHdlaWdodHNba10gKiAoTWF0cml4VHlwZTo6SWRlbnRpdHkoVC5yb3dzKCksIFQucm93cygpKSArIG5vZGVzW2tdICogVG1pbnVzSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShUbWludXNJKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeExvZ2FyaXRobUF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZVBhZGU1KE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCkKK3sKKyAgY29uc3QgaW50IGRlZ3JlZSA9IDU7CisgIGNvbnN0IFJlYWxTY2FsYXIgbm9kZXNbXSAgID0geyAwLjA0NjkxMDA3NzAzMDY2ODAwMzYwMTE4NjU2MDg1MDMwMzVMLCAwLjIzMDc2NTM0NDk0NzE1ODQ1NDQ4MTg0Mjc4OTY0OTg5NTZMLAorICAgICAgICAgICAgMC41MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwTCwgMC43NjkyMzQ2NTUwNTI4NDE1NDU1MTgxNTcyMTAzNTAxMDQ0TCwKKyAgICAgICAgICAgIDAuOTUzMDg5OTIyOTY5MzMxOTk2Mzk4ODEzNDM5MTQ5Njk2NUwgfTsKKyAgY29uc3QgUmVhbFNjYWxhciB3ZWlnaHRzW10gPSB7IDAuMTE4NDYzNDQyNTI4MDk0NTQzNzU3MTMyMDIwMzU5OTU4N0wsIDAuMjM5MzE0MzM1MjQ5NjgzMjM0MDIwNjQ1NzU3NDE3ODE5MUwsCisgICAgICAgICAgICAwLjI4NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDRMLCAwLjIzOTMxNDMzNTI0OTY4MzIzNDAyMDY0NTc1NzQxNzgxOTFMLAorICAgICAgICAgICAgMC4xMTg0NjM0NDI1MjgwOTQ1NDM3NTcxMzIwMjAzNTk5NTg3TCB9OworICBhc3NlcnQoZGVncmVlIDw9IG1heFBhZGVEZWdyZWUpOworICBNYXRyaXhUeXBlIFRtaW51c0kgPSBUIC0gTWF0cml4VHlwZTo6SWRlbnRpdHkoVC5yb3dzKCksIFQucm93cygpKTsKKyAgcmVzdWx0LnNldFplcm8oVC5yb3dzKCksIFQucm93cygpKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBkZWdyZWU7ICsraykKKyAgICByZXN1bHQgKz0gd2VpZ2h0c1trXSAqIChNYXRyaXhUeXBlOjpJZGVudGl0eShULnJvd3MoKSwgVC5yb3dzKCkpICsgbm9kZXNba10gKiBUbWludXNJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKFRtaW51c0kpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgTWF0cml4TG9nYXJpdGhtQXRvbWljPE1hdHJpeFR5cGU+Ojpjb21wdXRlUGFkZTYoTWF0cml4VHlwZSYgcmVzdWx0LCBjb25zdCBNYXRyaXhUeXBlJiBUKQoreworICBjb25zdCBpbnQgZGVncmVlID0gNjsKKyAgY29uc3QgUmVhbFNjYWxhciBub2Rlc1tdICAgPSB7IDAuMDMzNzY1MjQyODk4NDIzOTg2MDkzODQ5MjIyNzUzMDAyN0wsIDAuMTY5Mzk1MzA2NzY2ODY3NzQzMTY5MzAwMjAyNDkwMDQ3M0wsCisgICAgICAgICAgICAwLjM4MDY5MDQwNjk1ODQwMTU0NTY4NDc0OTEzOTE1OTY0NDBMLCAwLjYxOTMwOTU5MzA0MTU5ODQ1NDMxNTI1MDg2MDg0MDM1NjBMLAorCQkgICAgICAgIDAuODMwNjA0NjkzMjMzMTMyMjU2ODMwNjk5Nzk3NTA5OTUyN0wsIDAuOTY2MjM0NzU3MTAxNTc2MDEzOTA2MTUwNzc3MjQ2OTk3M0wgfTsKKyAgY29uc3QgUmVhbFNjYWxhciB3ZWlnaHRzW10gPSB7IDAuMDg1NjYyMjQ2MTg5NTg1MTcyNTIwMTQ4MDcxMDg2MzY2NUwsIDAuMTgwMzgwNzg2NTI0MDY5MzAzNzg0OTE2NzU2OTE4ODU4MUwsCisgICAgICAgICAgICAwLjIzMzk1Njk2NzI4NjM0NTUyMzY5NDkzNTE3MTk5NDc3NTVMLCAwLjIzMzk1Njk2NzI4NjM0NTUyMzY5NDkzNTE3MTk5NDc3NTVMLAorIAkJICAgICAgICAwLjE4MDM4MDc4NjUyNDA2OTMwMzc4NDkxNjc1NjkxODg1ODFMLCAwLjA4NTY2MjI0NjE4OTU4NTE3MjUyMDE0ODA3MTA4NjM2NjVMIH07CisgIGFzc2VydChkZWdyZWUgPD0gbWF4UGFkZURlZ3JlZSk7CisgIE1hdHJpeFR5cGUgVG1pbnVzSSA9IFQgLSBNYXRyaXhUeXBlOjpJZGVudGl0eShULnJvd3MoKSwgVC5yb3dzKCkpOworICByZXN1bHQuc2V0WmVybyhULnJvd3MoKSwgVC5yb3dzKCkpOworICBmb3IgKGludCBrID0gMDsgayA8IGRlZ3JlZTsgKytrKQorICAgIHJlc3VsdCArPSB3ZWlnaHRzW2tdICogKE1hdHJpeFR5cGU6OklkZW50aXR5KFQucm93cygpLCBULnJvd3MoKSkgKyBub2Rlc1trXSAqIFRtaW51c0kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUoVG1pbnVzSSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBNYXRyaXhMb2dhcml0aG1BdG9taWM8TWF0cml4VHlwZT46OmNvbXB1dGVQYWRlNyhNYXRyaXhUeXBlJiByZXN1bHQsIGNvbnN0IE1hdHJpeFR5cGUmIFQpCit7CisgIGNvbnN0IGludCBkZWdyZWUgPSA3OworICBjb25zdCBSZWFsU2NhbGFyIG5vZGVzW10gICA9IHsgMC4wMjU0NDYwNDM4Mjg2MjA3Mzc3MzY5MDUxNTc5NzYwNzQ0TCwgMC4xMjkyMzQ0MDcyMDAzMDI3ODAwNjgwNjc2MTMzNTk2MDU4TCwKKyAgICAgICAgICAgIDAuMjk3MDc3NDI0MzExMzAxNDE2NTQ2Njk2NzkzOTYxNTE5M0wsIDAuNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEwsCisgICAgICAgICAgICAwLjcwMjkyMjU3NTY4ODY5ODU4MzQ1MzMwMzIwNjAzODQ4MDdMLCAwLjg3MDc2NTU5Mjc5OTY5NzIxOTkzMTkzMjM4NjY0MDM5NDJMLAorICAgICAgICAgICAgMC45NzQ1NTM5NTYxNzEzNzkyNjIyNjMwOTQ4NDIwMjM5MjU2TCB9OworICBjb25zdCBSZWFsU2NhbGFyIHdlaWdodHNbXSA9IHsgMC4wNjQ3NDI0ODMwODQ0MzQ4NDY2MzUzMDU3MTYzMzk1NDEwTCwgMC4xMzk4NTI2OTU3NDQ2MzgzMzM5NTA3MzM4ODU3MTE4ODk4TCwKKyAgICAgICAgICAgIDAuMTkwOTE1MDI1MjUyNTU5NDcyNDc1MTg0ODg3NzQ0NDg3NkwsIDAuMjA4OTc5NTkxODM2NzM0NjkzODc3NTUxMDIwNDA4MTYzM0wsCisgICAgICAgICAgICAwLjE5MDkxNTAyNTI1MjU1OTQ3MjQ3NTE4NDg4Nzc0NDQ4NzZMLCAwLjEzOTg1MjY5NTc0NDYzODMzMzk1MDczMzg4NTcxMTg4OThMLAorICAgICAgICAgICAgMC4wNjQ3NDI0ODMwODQ0MzQ4NDY2MzUzMDU3MTYzMzk1NDEwTCB9OworICBhc3NlcnQoZGVncmVlIDw9IG1heFBhZGVEZWdyZWUpOworICBNYXRyaXhUeXBlIFRtaW51c0kgPSBUIC0gTWF0cml4VHlwZTo6SWRlbnRpdHkoVC5yb3dzKCksIFQucm93cygpKTsKKyAgcmVzdWx0LnNldFplcm8oVC5yb3dzKCksIFQucm93cygpKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBkZWdyZWU7ICsraykKKyAgICByZXN1bHQgKz0gd2VpZ2h0c1trXSAqIChNYXRyaXhUeXBlOjpJZGVudGl0eShULnJvd3MoKSwgVC5yb3dzKCkpICsgbm9kZXNba10gKiBUbWludXNJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKFRtaW51c0kpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgTWF0cml4TG9nYXJpdGhtQXRvbWljPE1hdHJpeFR5cGU+Ojpjb21wdXRlUGFkZTgoTWF0cml4VHlwZSYgcmVzdWx0LCBjb25zdCBNYXRyaXhUeXBlJiBUKQoreworICBjb25zdCBpbnQgZGVncmVlID0gODsKKyAgY29uc3QgUmVhbFNjYWxhciBub2Rlc1tdICAgPSB7IDAuMDE5ODU1MDcxNzUxMjMxODg0MTU4MjE5NTY1NzE1MjYzNUwsIDAuMTAxNjY2NzYxMjkzMTg2NjMwMjA0MjIzMDMxNzYyMDg0OEwsCisgICAgICAgICAgICAwLjIzNzIzMzc5NTA0MTgzNTUwNzA5MTEzMDQ3NTQwNTM3NjhMLCAwLjQwODI4MjY3ODc1MjE3NTA5NzUzMDI2MTkyODgxOTkwODBMLAorICAgICAgICAgICAgMC41OTE3MTczMjEyNDc4MjQ5MDI0Njk3MzgwNzExODAwOTIwTCwgMC43NjI3NjYyMDQ5NTgxNjQ0OTI5MDg4Njk1MjQ1OTQ2MjMyTCwKKyAgICAgICAgICAgIDAuODk4MzMzMjM4NzA2ODEzMzY5Nzk1Nzc2OTY4MjM3OTE1MkwsIDAuOTgwMTQ0OTI4MjQ4NzY4MTE1ODQxNzgwNDM0Mjg0NzM2NUwgfTsKKyAgY29uc3QgUmVhbFNjYWxhciB3ZWlnaHRzW10gPSB7IDAuMDUwNjE0MjY4MTQ1MTg4MTI5NTc2MjY1Njc3MTU0OTgxMUwsIDAuMTExMTkwNTE3MjI2Njg3MjM1MjcyMTc3OTk3MjEzMTIwNEwsCisgICAgICAgICAgICAwLjE1Njg1MzMyMjkzODk0MzY0MzY2ODk4MTEwMDk5MzMwMDdMLCAwLjE4MTM0MTg5MTY4OTE4MDk5MTQ4MjU3NTIyNDYzODU5NzhMLAorICAgICAgICAgICAgMC4xODEzNDE4OTE2ODkxODA5OTE0ODI1NzUyMjQ2Mzg1OTc4TCwgMC4xNTY4NTMzMjI5Mzg5NDM2NDM2Njg5ODExMDA5OTMzMDA3TCwKKyAgICAgICAgICAgIDAuMTExMTkwNTE3MjI2Njg3MjM1MjcyMTc3OTk3MjEzMTIwNEwsIDAuMDUwNjE0MjY4MTQ1MTg4MTI5NTc2MjY1Njc3MTU0OTgxMUwgfTsKKyAgYXNzZXJ0KGRlZ3JlZSA8PSBtYXhQYWRlRGVncmVlKTsKKyAgTWF0cml4VHlwZSBUbWludXNJID0gVCAtIE1hdHJpeFR5cGU6OklkZW50aXR5KFQucm93cygpLCBULnJvd3MoKSk7CisgIHJlc3VsdC5zZXRaZXJvKFQucm93cygpLCBULnJvd3MoKSk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgZGVncmVlOyArK2spCisgICAgcmVzdWx0ICs9IHdlaWdodHNba10gKiAoTWF0cml4VHlwZTo6SWRlbnRpdHkoVC5yb3dzKCksIFQucm93cygpKSArIG5vZGVzW2tdICogVG1pbnVzSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShUbWludXNJKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeExvZ2FyaXRobUF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZVBhZGU5KE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCkKK3sKKyAgY29uc3QgaW50IGRlZ3JlZSA9IDk7CisgIGNvbnN0IFJlYWxTY2FsYXIgbm9kZXNbXSAgID0geyAwLjAxNTkxOTg4MDI0NjE4Njk1NTA4MjIxMTg5ODU0ODE2MzZMLCAwLjA4MTk4NDQ0NjMzNjY4MjEwMjg1MDI4NTEwNTk2NTEzMjZMLAorICAgICAgICAgICAgMC4xOTMzMTQyODM2NDk3MDQ4MDEzNDU2NDg5ODAzMjkyNjI5TCwgMC4zMzc4NzMyODgyOTgwOTU1MzU0ODA3MzA5OTI2NzgzMzE3TCwKKyAgICAgICAgICAgIDAuNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEwsIDAuNjYyMTI2NzExNzAxOTA0NDY0NTE5MjY5MDA3MzIxNjY4M0wsCisgICAgICAgICAgICAwLjgwNjY4NTcxNjM1MDI5NTE5ODY1NDM1MTAxOTY3MDczNzFMLCAwLjkxODAxNTU1MzY2MzMxNzg5NzE0OTcxNDg5NDAzNDg2NzRMLAorICAgICAgICAgICAgMC45ODQwODAxMTk3NTM4MTMwNDQ5MTc3ODgxMDE0NTE4MzY0TCB9OworICBjb25zdCBSZWFsU2NhbGFyIHdlaWdodHNbXSA9IHsgMC4wNDA2MzcxOTQxODA3ODcyMDU5ODU5NDYwNzkwNTUyNjE4TCwgMC4wOTAzMjQwODAzNDc0Mjg3MDIwMjkyMzYwMTU2MjE0NTY0TCwKKyAgICAgICAgICAgIDAuMTMwMzA1MzQ4MjAxNDY3NzMxMTU5MzcxNDM0NzA5MzE2NEwsIDAuMTU2MTczNTM4NTIwMDAxNDIwMDM0MzE1MjAzMjkyMjIxOEwsCisgICAgICAgICAgICAwLjE2NTExOTY3NzUwMDYyOTg4MTU4MjI2MjUzNDY0MzQ4NzBMLCAwLjE1NjE3MzUzODUyMDAwMTQyMDAzNDMxNTIwMzI5MjIyMThMLAorICAgICAgICAgICAgMC4xMzAzMDUzNDgyMDE0Njc3MzExNTkzNzE0MzQ3MDkzMTY0TCwgMC4wOTAzMjQwODAzNDc0Mjg3MDIwMjkyMzYwMTU2MjE0NTY0TCwKKyAgICAgICAgICAgIDAuMDQwNjM3MTk0MTgwNzg3MjA1OTg1OTQ2MDc5MDU1MjYxOEwgfTsKKyAgYXNzZXJ0KGRlZ3JlZSA8PSBtYXhQYWRlRGVncmVlKTsKKyAgTWF0cml4VHlwZSBUbWludXNJID0gVCAtIE1hdHJpeFR5cGU6OklkZW50aXR5KFQucm93cygpLCBULnJvd3MoKSk7CisgIHJlc3VsdC5zZXRaZXJvKFQucm93cygpLCBULnJvd3MoKSk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgZGVncmVlOyArK2spCisgICAgcmVzdWx0ICs9IHdlaWdodHNba10gKiAoTWF0cml4VHlwZTo6SWRlbnRpdHkoVC5yb3dzKCksIFQucm93cygpKSArIG5vZGVzW2tdICogVG1pbnVzSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShUbWludXNJKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeExvZ2FyaXRobUF0b21pYzxNYXRyaXhUeXBlPjo6Y29tcHV0ZVBhZGUxMChNYXRyaXhUeXBlJiByZXN1bHQsIGNvbnN0IE1hdHJpeFR5cGUmIFQpCit7CisgIGNvbnN0IGludCBkZWdyZWUgPSAxMDsKKyAgY29uc3QgUmVhbFNjYWxhciBub2Rlc1tdICAgPSB7IDAuMDEzMDQ2NzM1NzQxNDE0MTM5OTYxMDE3OTkzOTU3Nzc0MEwsIDAuMDY3NDY4MzE2NjU1NTA3NzQ0NjMzOTUxNjU1Nzg4MjUzNUwsCisgICAgICAgICAgICAwLjE2MDI5NTIxNTg1MDQ4Nzc5Njg4MjgzNjMxNzQ0MjU2MzJMLCAwLjI4MzMwMjMwMjkzNTM3NjQwNDYwMDM2NzAyODQxNzEwNzlMLAorICAgICAgICAgICAgMC40MjU1NjI4MzA1MDkxODQzOTQ1NTc1ODY5OTk0MzUxNDAwTCwgMC41NzQ0MzcxNjk0OTA4MTU2MDU0NDI0MTMwMDA1NjQ4NjAwTCwKKyAgICAgICAgICAgIDAuNzE2Njk3Njk3MDY0NjIzNTk1Mzk5NjMyOTcxNTgyODkyMUwsIDAuODM5NzA0Nzg0MTQ5NTEyMjAzMTE3MTYzNjgyNTU3NDM2OEwsCisgICAgICAgICAgICAwLjkzMjUzMTY4MzM0NDQ5MjI1NTM2NjA0ODM0NDIxMTc0NjVMLCAwLjk4Njk1MzI2NDI1ODU4NTg2MDAzODk4MjAwNjA0MjIyNjBMIH07CisgIGNvbnN0IFJlYWxTY2FsYXIgd2VpZ2h0c1tdID0geyAwLjAzMzMzNTY3MjE1NDM0NDA2ODc5Njc4NDQwNDk0NjY2NTlMLCAwLjA3NDcyNTY3NDU3NTI5MDI5NjU3Mjg4ODE2OTgyODg0ODdMLAorICAgICAgICAgICAgMC4xMDk1NDMxODEyNTc5OTEwMjE5OTc3Njc0NjcxMTQwODE2TCwgMC4xMzQ2MzMzNTk2NTQ5OTgxNzc1NDU2MTM0NjA3ODQ3MzQ3TCwKKyAgICAgICAgICAgIDAuMTQ3NzYyMTEyMzU3Mzc2NDM1MDg2OTQ2NDk3MzI1NjY5MkwsIDAuMTQ3NzYyMTEyMzU3Mzc2NDM1MDg2OTQ2NDk3MzI1NjY5MkwsCisgICAgICAgICAgICAwLjEzNDYzMzM1OTY1NDk5ODE3NzU0NTYxMzQ2MDc4NDczNDdMLCAwLjEwOTU0MzE4MTI1Nzk5MTAyMTk5Nzc2NzQ2NzExNDA4MTZMLAorICAgICAgICAgICAgMC4wNzQ3MjU2NzQ1NzUyOTAyOTY1NzI4ODgxNjk4Mjg4NDg3TCwgMC4wMzMzMzU2NzIxNTQzNDQwNjg3OTY3ODQ0MDQ5NDY2NjU5TCB9OworICBhc3NlcnQoZGVncmVlIDw9IG1heFBhZGVEZWdyZWUpOworICBNYXRyaXhUeXBlIFRtaW51c0kgPSBUIC0gTWF0cml4VHlwZTo6SWRlbnRpdHkoVC5yb3dzKCksIFQucm93cygpKTsKKyAgcmVzdWx0LnNldFplcm8oVC5yb3dzKCksIFQucm93cygpKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBkZWdyZWU7ICsraykKKyAgICByZXN1bHQgKz0gd2VpZ2h0c1trXSAqIChNYXRyaXhUeXBlOjpJZGVudGl0eShULnJvd3MoKSwgVC5yb3dzKCkpICsgbm9kZXNba10gKiBUbWludXNJKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKFRtaW51c0kpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgTWF0cml4TG9nYXJpdGhtQXRvbWljPE1hdHJpeFR5cGU+Ojpjb21wdXRlUGFkZTExKE1hdHJpeFR5cGUmIHJlc3VsdCwgY29uc3QgTWF0cml4VHlwZSYgVCkKK3sKKyAgY29uc3QgaW50IGRlZ3JlZSA9IDExOworICBjb25zdCBSZWFsU2NhbGFyIG5vZGVzW10gICA9IHsgMC4wMTA4ODU2NzA5MjY5NzE1MDM1OTgwMzA5OTk0Mzg1NzEzTCwgMC4wNTY0Njg3MDAxMTU5NTIzNTA0NjI0MjExMTUzNDgwMzY0TCwKKyAgICAgICAgICAgIDAuMTM0OTIzOTk3MjEyOTc1MzM3OTUzMjkxODczOTg0NDIzM0wsIDAuMjQwNDUxOTM1Mzk2NTk0MDkyMDM3MTM3MTY1MjcwNjk1MkwsCisgICAgICAgICAgICAwLjM2NTIyODQyMjAyMzgyNzUxMzgzNDIzNDAwNzI5OTU2OTJMLCAwLjUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBMLAorICAgICAgICAgICAgMC42MzQ3NzE1Nzc5NzYxNzI0ODYxNjU3NjU5OTI3MDA0MzA4TCwgMC43NTk1NDgwNjQ2MDM0MDU5MDc5NjI4NjI4MzQ3MjkzMDQ4TCwKKyAgICAgICAgICAgIDAuODY1MDc2MDAyNzg3MDI0NjYyMDQ2NzA4MTI2MDE1NTc2N0wsIDAuOTQzNTMxMjk5ODg0MDQ3NjQ5NTM3NTc4ODg0NjUxOTYzNkwsCisgICAgICAgICAgICAwLjk4OTExNDMyOTA3MzAyODQ5NjQwMTk2OTAwMDU2MTQyODdMIH07CisgIGNvbnN0IFJlYWxTY2FsYXIgd2VpZ2h0c1tdID0geyAwLjAyNzgzNDI4MzU1ODA4NjgzMzI0MTM3Njg2MDIyMTI3NDNMLCAwLjA2Mjc5MDE4NDczMjQ1MjMxMjMxNzM0NzE0OTYxMTk3MDFMLAorICAgICAgICAgICAgMC4wOTMxNDUxMDU0NjM4NjcxMjU3MTMwNDg4MjA3MTU4MjgwTCwgMC4xMTY1OTY4ODIyOTU5OTUyMzk5NTkyNjE4NTI0MjE1ODc2TCwKKyAgICAgICAgICAgIDAuMTMxNDAyMjcyMjU1MTIzMzMxMDkwMzQ0NDM0OTQ1MjU0NkwsIDAuMTM2NDYyNTQzMzg4OTUwMzE1MzU3MjQxNzY0MTY4MTcxMUwsCisgICAgICAgICAgICAwLjEzMTQwMjI3MjI1NTEyMzMzMTA5MDM0NDQzNDk0NTI1NDZMLCAwLjExNjU5Njg4MjI5NTk5NTIzOTk1OTI2MTg1MjQyMTU4NzZMLAorICAgICAgICAgICAgMC4wOTMxNDUxMDU0NjM4NjcxMjU3MTMwNDg4MjA3MTU4MjgwTCwgMC4wNjI3OTAxODQ3MzI0NTIzMTIzMTczNDcxNDk2MTE5NzAxTCwKKyAgICAgICAgICAgIDAuMDI3ODM0MjgzNTU4MDg2ODMzMjQxMzc2ODYwMjIxMjc0M0wgfTsKKyAgYXNzZXJ0KGRlZ3JlZSA8PSBtYXhQYWRlRGVncmVlKTsKKyAgTWF0cml4VHlwZSBUbWludXNJID0gVCAtIE1hdHJpeFR5cGU6OklkZW50aXR5KFQucm93cygpLCBULnJvd3MoKSk7CisgIHJlc3VsdC5zZXRaZXJvKFQucm93cygpLCBULnJvd3MoKSk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgZGVncmVlOyArK2spCisgICAgcmVzdWx0ICs9IHdlaWdodHNba10gKiAoTWF0cml4VHlwZTo6SWRlbnRpdHkoVC5yb3dzKCksIFQucm93cygpKSArIG5vZGVzW2tdICogVG1pbnVzSSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZShUbWludXNJKTsKK30KKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKgorICAqIFxicmllZiBQcm94eSBmb3IgdGhlIG1hdHJpeCBsb2dhcml0aG0gb2Ygc29tZSBtYXRyaXggKGV4cHJlc3Npb24pLgorICAqCisgICogXHRwYXJhbSBEZXJpdmVkICBUeXBlIG9mIHRoZSBhcmd1bWVudCB0byB0aGUgbWF0cml4IGZ1bmN0aW9uLgorICAqCisgICogVGhpcyBjbGFzcyBob2xkcyB0aGUgYXJndW1lbnQgdG8gdGhlIG1hdHJpeCBmdW5jdGlvbiB1bnRpbCBpdCBpcworICAqIGFzc2lnbmVkIG9yIGV2YWx1YXRlZCBmb3Igc29tZSBvdGhlciByZWFzb24gKHNvIHRoZSBhcmd1bWVudAorICAqIHNob3VsZCBub3QgYmUgY2hhbmdlZCBpbiB0aGUgbWVhbnRpbWUpLiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YKKyAgKiBtYXRyaXhCYXNlOjptYXRyaXhMb2dhcml0aG0oKSBhbmQgbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHRoZQorICAqIG9ubHkgd2F5IGl0IGlzIHVzZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBNYXRyaXhMb2dhcml0aG1SZXR1cm5WYWx1ZQorOiBwdWJsaWMgUmV0dXJuQnlWYWx1ZTxNYXRyaXhMb2dhcml0aG1SZXR1cm5WYWx1ZTxEZXJpdmVkPiA+Cit7CitwdWJsaWM6CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OkluZGV4IEluZGV4OworCisgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IuCisgICAgKgorICAgICogXHBhcmFtW2luXSAgQSAgJU1hdHJpeCAoZXhwcmVzc2lvbikgZm9ybWluZyB0aGUgYXJndW1lbnQgb2YgdGhlIG1hdHJpeCBsb2dhcml0aG0uCisgICAgKi8KKyAgTWF0cml4TG9nYXJpdGhtUmV0dXJuVmFsdWUoY29uc3QgRGVyaXZlZCYgQSkgOiBtX0EoQSkgeyB9CisgIAorICAvKiogXGJyaWVmIENvbXB1dGUgdGhlIG1hdHJpeCBsb2dhcml0aG0uCisgICAgKgorICAgICogXHBhcmFtW291dF0gIHJlc3VsdCAgTG9nYXJpdGhtIG9mIFxwIEEsIHdoZXJlIFxBIGlzIGFzIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgIGlubGluZSB2b2lkIGV2YWxUbyhSZXN1bHRUeXBlJiByZXN1bHQpIGNvbnN0CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0IFBsYWluT2JqZWN0OworICAgIHR5cGVkZWYgaW50ZXJuYWw6OnRyYWl0czxQbGFpbk9iamVjdD4gVHJhaXRzOworICAgIHN0YXRpYyBjb25zdCBpbnQgUm93c0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6OlJvd3NBdENvbXBpbGVUaW1lOworICAgIHN0YXRpYyBjb25zdCBpbnQgQ29sc0F0Q29tcGlsZVRpbWUgPSBUcmFpdHM6OkNvbHNBdENvbXBpbGVUaW1lOworICAgIHN0YXRpYyBjb25zdCBpbnQgT3B0aW9ucyA9IFBsYWluT2JqZWN0OjpPcHRpb25zOworICAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsPiBDb21wbGV4U2NhbGFyOworICAgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIE9wdGlvbnMsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZT4gRHluTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeExvZ2FyaXRobUF0b21pYzxEeW5NYXRyaXhUeXBlPiBBdG9taWNUeXBlOworICAgIEF0b21pY1R5cGUgYXRvbWljOworICAgIAorICAgIGNvbnN0IFBsYWluT2JqZWN0IEFldmFsdWF0ZWQgPSBtX0EuZXZhbCgpOworICAgIE1hdHJpeEZ1bmN0aW9uPFBsYWluT2JqZWN0LCBBdG9taWNUeXBlPiBtZihBZXZhbHVhdGVkLCBhdG9taWMpOworICAgIG1mLmNvbXB1dGUocmVzdWx0KTsKKyAgfQorCisgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX0Eucm93cygpOyB9CisgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtX0EuY29scygpOyB9CisgIAorcHJpdmF0ZToKKyAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxEZXJpdmVkPjo6dHlwZSBtX0E7CisgIAorICBNYXRyaXhMb2dhcml0aG1SZXR1cm5WYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlJik7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorICBzdHJ1Y3QgdHJhaXRzPE1hdHJpeExvZ2FyaXRobVJldHVyblZhbHVlPERlcml2ZWQ+ID4KKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3QgUmV0dXJuVHlwZTsKKyAgfTsKK30KKworCisvKioqKioqKioqKiBNYXRyaXhCYXNlIG1ldGhvZCAqKioqKioqKioqLworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgTWF0cml4TG9nYXJpdGhtUmV0dXJuVmFsdWU8RGVyaXZlZD4gTWF0cml4QmFzZTxEZXJpdmVkPjo6bG9nKCkgY29uc3QKK3sKKyAgZWlnZW5fYXNzZXJ0KHJvd3MoKSA9PSBjb2xzKCkpOworICByZXR1cm4gTWF0cml4TG9nYXJpdGhtUmV0dXJuVmFsdWU8RGVyaXZlZD4oZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVRSSVhfTE9HQVJJVEhNCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeFNxdWFyZVJvb3QuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvTWF0cml4U3F1YXJlUm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMzE5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL01hdHJpeFNxdWFyZVJvb3QuaApAQCAtMCwwICsxLDQ4NCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTUFUUklYX1NRVUFSRV9ST09UCisjZGVmaW5lIEVJR0VOX01BVFJJWF9TUVVBUkVfUk9PVAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIE1hdHJpeEZ1bmN0aW9uc19Nb2R1bGUKKyAgKiBcYnJpZWYgQ2xhc3MgZm9yIGNvbXB1dGluZyBtYXRyaXggc3F1YXJlIHJvb3RzIG9mIHVwcGVyIHF1YXNpLXRyaWFuZ3VsYXIgbWF0cmljZXMuCisgICogXHRwYXJhbSAgTWF0cml4VHlwZSAgdHlwZSBvZiB0aGUgYXJndW1lbnQgb2YgdGhlIG1hdHJpeCBzcXVhcmUgcm9vdCwKKyAgKiAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCB0byBiZSBhbiBpbnN0YW50aWF0aW9uIG9mIHRoZSBNYXRyaXggY2xhc3MgdGVtcGxhdGUuCisgICoKKyAgKiBUaGlzIGNsYXNzIGNvbXB1dGVzIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgdXBwZXIgcXVhc2ktdHJpYW5ndWxhcgorICAqIG1hdHJpeCBzdG9yZWQgaW4gdGhlIHVwcGVyIEhlc3NlbmJlcmcgcGFydCBvZiB0aGUgbWF0cml4IHBhc3NlZCB0bworICAqIHRoZSBjb25zdHJ1Y3Rvci4KKyAgKgorICAqIFxzYSBNYXRyaXhTcXVhcmVSb290LCBNYXRyaXhTcXVhcmVSb290VHJpYW5ndWxhcgorICAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyCit7CisgIHB1YmxpYzoKKworICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IuIAorICAgICAgKgorICAgICAgKiBccGFyYW1baW5dICBBICB1cHBlciBxdWFzaS10cmlhbmd1bGFyIG1hdHJpeCB3aG9zZSBzcXVhcmUgcm9vdCAKKyAgICAgICogICAgICAgICAgICAgICAgaXMgdG8gYmUgY29tcHV0ZWQuCisgICAgICAqCisgICAgICAqIFRoZSBjbGFzcyBzdG9yZXMgYSByZWZlcmVuY2UgdG8gXHAgQSwgc28gaXQgc2hvdWxkIG5vdCBiZQorICAgICAgKiBjaGFuZ2VkIChvciBkZXN0cm95ZWQpIGJlZm9yZSBjb21wdXRlKCkgaXMgY2FsbGVkLgorICAgICAgKi8KKyAgICBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyKGNvbnN0IE1hdHJpeFR5cGUmIEEpIAorICAgICAgOiBtX0EoQSkgCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KEEucm93cygpID09IEEuY29scygpKTsKKyAgICB9CisgICAgCisgICAgLyoqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QKKyAgICAgICoKKyAgICAgICogXHBhcmFtW291dF0gcmVzdWx0ICBzcXVhcmUgcm9vdCBvZiBccCBBLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBPbmx5IHRoZSB1cHBlciBIZXNzZW5iZXJnIHBhcnQgb2YgXHAgcmVzdWx0IGlzIHVwZGF0ZWQsIHRoZQorICAgICAgKiByZXN0IGlzIG5vdCB0b3VjaGVkLiAgU2VlIE1hdHJpeEJhc2U6OnNxcnQoKSBmb3IgZGV0YWlscyBvbgorICAgICAgKiBob3cgdGhpcyBjb21wdXRhdGlvbiBpcyBpbXBsZW1lbnRlZC4KKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+IHZvaWQgY29tcHV0ZShSZXN1bHRUeXBlICZyZXN1bHQpOyAgICAKKyAgICAKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICAKKyAgICB2b2lkIGNvbXB1dGVEaWFnb25hbFBhcnRPZlNxcnQoTWF0cml4VHlwZSYgc3FydFQsIGNvbnN0IE1hdHJpeFR5cGUmIFQpOworICAgIHZvaWQgY29tcHV0ZU9mZkRpYWdvbmFsUGFydE9mU3FydChNYXRyaXhUeXBlJiBzcXJ0VCwgY29uc3QgTWF0cml4VHlwZSYgVCk7CisgICAgdm9pZCBjb21wdXRlMngyZGlhZ29uYWxCbG9jayhNYXRyaXhUeXBlJiBzcXJ0VCwgY29uc3QgTWF0cml4VHlwZSYgVCwgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggaSk7CisgICAgdm9pZCBjb21wdXRlMXgxb2ZmRGlhZ29uYWxCbG9jayhNYXRyaXhUeXBlJiBzcXJ0VCwgY29uc3QgTWF0cml4VHlwZSYgVCwgCisgIAkJCQkgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGksIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGopOworICAgIHZvaWQgY29tcHV0ZTF4Mm9mZkRpYWdvbmFsQmxvY2soTWF0cml4VHlwZSYgc3FydFQsIGNvbnN0IE1hdHJpeFR5cGUmIFQsIAorICAJCQkJICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBpLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBqKTsKKyAgICB2b2lkIGNvbXB1dGUyeDFvZmZEaWFnb25hbEJsb2NrKE1hdHJpeFR5cGUmIHNxcnRULCBjb25zdCBNYXRyaXhUeXBlJiBULCAKKyAgCQkJCSAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggaSwgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggaik7CisgICAgdm9pZCBjb21wdXRlMngyb2ZmRGlhZ29uYWxCbG9jayhNYXRyaXhUeXBlJiBzcXJ0VCwgY29uc3QgTWF0cml4VHlwZSYgVCwgCisgIAkJCQkgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGksIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGopOworICAKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU21hbGxNYXRyaXhUeXBlPgorICAgIHN0YXRpYyB2b2lkIHNvbHZlQXV4aWxpYXJ5RXF1YXRpb24oU21hbGxNYXRyaXhUeXBlJiBYLCBjb25zdCBTbWFsbE1hdHJpeFR5cGUmIEEsIAorICAJCQkJICAgICBjb25zdCBTbWFsbE1hdHJpeFR5cGUmIEIsIGNvbnN0IFNtYWxsTWF0cml4VHlwZSYgQyk7CisgIAorICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1fQTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+IAordm9pZCBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyPE1hdHJpeFR5cGU+Ojpjb21wdXRlKFJlc3VsdFR5cGUgJnJlc3VsdCkKK3sKKyAgLy8gQ29tcHV0ZSBTY2h1ciBkZWNvbXBvc2l0aW9uIG9mIG1fQQorICBjb25zdCBSZWFsU2NodXI8TWF0cml4VHlwZT4gc2NodXJPZkEobV9BKTsgIAorICBjb25zdCBNYXRyaXhUeXBlJiBUID0gc2NodXJPZkEubWF0cml4VCgpOworICBjb25zdCBNYXRyaXhUeXBlJiBVID0gc2NodXJPZkEubWF0cml4VSgpOworCisgIC8vIENvbXB1dGUgc3F1YXJlIHJvb3Qgb2YgVAorICBNYXRyaXhUeXBlIHNxcnRUID0gTWF0cml4VHlwZTo6WmVybyhtX0Eucm93cygpLCBtX0Eucm93cygpKTsKKyAgY29tcHV0ZURpYWdvbmFsUGFydE9mU3FydChzcXJ0VCwgVCk7CisgIGNvbXB1dGVPZmZEaWFnb25hbFBhcnRPZlNxcnQoc3FydFQsIFQpOworCisgIC8vIENvbXB1dGUgc3F1YXJlIHJvb3Qgb2YgbV9BCisgIHJlc3VsdCA9IFUgKiBzcXJ0VCAqIFUuYWRqb2ludCgpOworfQorCisvLyBwcmU6ICBUIGlzIHF1YXNpLXVwcGVyLXRyaWFuZ3VsYXIgYW5kIHNxcnRUIGlzIGEgemVybyBtYXRyaXggb2YgdGhlIHNhbWUgc2l6ZQorLy8gcG9zdDogdGhlIGRpYWdvbmFsIGJsb2NrcyBvZiBzcXJ0VCBhcmUgdGhlIHNxdWFyZSByb290cyBvZiB0aGUgZGlhZ29uYWwgYmxvY2tzIG9mIFQKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyPE1hdHJpeFR5cGU+Ojpjb21wdXRlRGlhZ29uYWxQYXJ0T2ZTcXJ0KE1hdHJpeFR5cGUmIHNxcnRULCAKKwkJCQkJCQkJCSAgY29uc3QgTWF0cml4VHlwZSYgVCkKK3sKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fQS5yb3dzKCk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZiAoaSA9PSBzaXplIC0gMSB8fCBULmNvZWZmKGkrMSwgaSkgPT0gMCkgeworICAgICAgZWlnZW5fYXNzZXJ0KFQoaSxpKSA+IDApOworICAgICAgc3FydFQuY29lZmZSZWYoaSxpKSA9IGludGVybmFsOjpzcXJ0KFQuY29lZmYoaSxpKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgY29tcHV0ZTJ4MmRpYWdvbmFsQmxvY2soc3FydFQsIFQsIGkpOworICAgICAgKytpOworICAgIH0KKyAgfQorfQorCisvLyBwcmU6ICBUIGlzIHF1YXNpLXVwcGVyLXRyaWFuZ3VsYXIgYW5kIGRpYWdvbmFsIGJsb2NrcyBvZiBzcXJ0VCBhcmUgc3F1YXJlIHJvb3Qgb2YgZGlhZ29uYWwgYmxvY2tzIG9mIFQuCisvLyBwb3N0OiBzcXJ0VCBpcyB0aGUgc3F1YXJlIHJvb3Qgb2YgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyPE1hdHJpeFR5cGU+Ojpjb21wdXRlT2ZmRGlhZ29uYWxQYXJ0T2ZTcXJ0KE1hdHJpeFR5cGUmIHNxcnRULCAKKwkJCQkJCQkJCSAgICAgY29uc3QgTWF0cml4VHlwZSYgVCkKK3sKKyAgY29uc3QgSW5kZXggc2l6ZSA9IG1fQS5yb3dzKCk7CisgIGZvciAoSW5kZXggaiA9IDE7IGogPCBzaXplOyBqKyspIHsKKyAgICAgIGlmIChULmNvZWZmKGosIGotMSkgIT0gMCkgIC8vIGlmIFQoai0xOmosIGotMTpqKSBpcyBhIDItYnktMiBibG9jaworCWNvbnRpbnVlOworICAgIGZvciAoSW5kZXggaSA9IGotMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmIChpID4gMCAmJiBULmNvZWZmKGksIGktMSkgIT0gMCkgIC8vIGlmIFQoaS0xOmksIGktMTppKSBpcyBhIDItYnktMiBibG9jaworCWNvbnRpbnVlOworICAgICAgYm9vbCBpQmxvY2tJczJ4MiA9IChpIDwgc2l6ZSAtIDEpICYmIChULmNvZWZmKGkrMSwgaSkgIT0gMCk7CisgICAgICBib29sIGpCbG9ja0lzMngyID0gKGogPCBzaXplIC0gMSkgJiYgKFQuY29lZmYoaisxLCBqKSAhPSAwKTsKKyAgICAgIGlmIChpQmxvY2tJczJ4MiAmJiBqQmxvY2tJczJ4MikgCisJY29tcHV0ZTJ4Mm9mZkRpYWdvbmFsQmxvY2soc3FydFQsIFQsIGksIGopOworICAgICAgZWxzZSBpZiAoaUJsb2NrSXMyeDIgJiYgIWpCbG9ja0lzMngyKSAKKwljb21wdXRlMngxb2ZmRGlhZ29uYWxCbG9jayhzcXJ0VCwgVCwgaSwgaik7CisgICAgICBlbHNlIGlmICghaUJsb2NrSXMyeDIgJiYgakJsb2NrSXMyeDIpIAorCWNvbXB1dGUxeDJvZmZEaWFnb25hbEJsb2NrKHNxcnRULCBULCBpLCBqKTsKKyAgICAgIGVsc2UgaWYgKCFpQmxvY2tJczJ4MiAmJiAhakJsb2NrSXMyeDIpIAorCWNvbXB1dGUxeDFvZmZEaWFnb25hbEJsb2NrKHNxcnRULCBULCBpLCBqKTsKKyAgICB9CisgIH0KK30KKworLy8gcHJlOiAgVC5ibG9jayhpLGksMiwyKSBoYXMgY29tcGxleCBjb25qdWdhdGUgZWlnZW52YWx1ZXMKKy8vIHBvc3Q6IHNxcnRULmJsb2NrKGksaSwyLDIpIGlzIHNxdWFyZSByb290IG9mIFQuYmxvY2soaSxpLDIsMikKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyPE1hdHJpeFR5cGU+CisgICAgIDo6Y29tcHV0ZTJ4MmRpYWdvbmFsQmxvY2soTWF0cml4VHlwZSYgc3FydFQsIGNvbnN0IE1hdHJpeFR5cGUmIFQsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGkpCit7CisgIC8vIFRPRE86IFRoaXMgY2FzZSAoMi1ieS0yIGJsb2NrcyB3aXRoIGNvbXBsZXggY29uanVnYXRlIGVpZ2VudmFsdWVzKSBpcyBwcm9iYWJseSBoaWRkZW4gc29tZXdoZXJlCisgIC8vICAgICAgIGluIEVpZ2VuU29sdmVyLiBJZiB3ZSBleHBvc2UgaXQsIHdlIGNvdWxkIGNhbGwgaXQgZGlyZWN0bHkgZnJvbSBoZXJlLgorICBNYXRyaXg8U2NhbGFyLDIsMj4gYmxvY2sgPSBULnRlbXBsYXRlIGJsb2NrPDIsMj4oaSxpKTsKKyAgRWlnZW5Tb2x2ZXI8TWF0cml4PFNjYWxhciwyLDI+ID4gZXMoYmxvY2spOworICBzcXJ0VC50ZW1wbGF0ZSBibG9jazwyLDI+KGksaSkKKyAgICA9IChlcy5laWdlbnZlY3RvcnMoKSAqIGVzLmVpZ2VudmFsdWVzKCkuY3dpc2VTcXJ0KCkuYXNEaWFnb25hbCgpICogZXMuZWlnZW52ZWN0b3JzKCkuaW52ZXJzZSgpKS5yZWFsKCk7Cit9CisKKy8vIHByZTogIGJsb2NrIHN0cnVjdHVyZSBvZiBUIGlzIHN1Y2ggdGhhdCAoaSxqKSBpcyBhIDF4MSBibG9jaywKKy8vICAgICAgIGFsbCBibG9ja3Mgb2Ygc3FydFQgdG8gbGVmdCBvZiBhbmQgYmVsb3cgKGksaikgYXJlIGNvcnJlY3QKKy8vIHBvc3Q6IHNxcnRUKGksaikgaGFzIHRoZSBjb3JyZWN0IHZhbHVlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgTWF0cml4U3F1YXJlUm9vdFF1YXNpVHJpYW5ndWxhcjxNYXRyaXhUeXBlPgorICAgICA6OmNvbXB1dGUxeDFvZmZEaWFnb25hbEJsb2NrKE1hdHJpeFR5cGUmIHNxcnRULCBjb25zdCBNYXRyaXhUeXBlJiBULCAKKwkJCQkgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGksIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGopCit7CisgIFNjYWxhciB0bXAgPSAoc3FydFQucm93KGkpLnNlZ21lbnQoaSsxLGotaS0xKSAqIHNxcnRULmNvbChqKS5zZWdtZW50KGkrMSxqLWktMSkpLnZhbHVlKCk7CisgIHNxcnRULmNvZWZmUmVmKGksaikgPSAoVC5jb2VmZihpLGopIC0gdG1wKSAvIChzcXJ0VC5jb2VmZihpLGkpICsgc3FydFQuY29lZmYoaixqKSk7Cit9CisKKy8vIHNpbWlsYXIgdG8gY29tcHV0ZTF4MW9mZkRpYWdvbmFsQmxvY2soKQordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeFNxdWFyZVJvb3RRdWFzaVRyaWFuZ3VsYXI8TWF0cml4VHlwZT4KKyAgICAgOjpjb21wdXRlMXgyb2ZmRGlhZ29uYWxCbG9jayhNYXRyaXhUeXBlJiBzcXJ0VCwgY29uc3QgTWF0cml4VHlwZSYgVCwgCisJCQkJICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBpLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBqKQoreworICBNYXRyaXg8U2NhbGFyLDEsMj4gcmhzID0gVC50ZW1wbGF0ZSBibG9jazwxLDI+KGksaik7CisgIGlmIChqLWkgPiAxKQorICAgIHJocyAtPSBzcXJ0VC5ibG9jayhpLCBpKzEsIDEsIGotaS0xKSAqIHNxcnRULmJsb2NrKGkrMSwgaiwgai1pLTEsIDIpOworICBNYXRyaXg8U2NhbGFyLDIsMj4gQSA9IHNxcnRULmNvZWZmKGksaSkgKiBNYXRyaXg8U2NhbGFyLDIsMj46OklkZW50aXR5KCk7CisgIEEgKz0gc3FydFQudGVtcGxhdGUgYmxvY2s8MiwyPihqLGopLnRyYW5zcG9zZSgpOworICBzcXJ0VC50ZW1wbGF0ZSBibG9jazwxLDI+KGksaikudHJhbnNwb3NlKCkgPSBBLmZ1bGxQaXZMdSgpLnNvbHZlKHJocy50cmFuc3Bvc2UoKSk7Cit9CisKKy8vIHNpbWlsYXIgdG8gY29tcHV0ZTF4MW9mZkRpYWdvbmFsQmxvY2soKQordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeFNxdWFyZVJvb3RRdWFzaVRyaWFuZ3VsYXI8TWF0cml4VHlwZT4KKyAgICAgOjpjb21wdXRlMngxb2ZmRGlhZ29uYWxCbG9jayhNYXRyaXhUeXBlJiBzcXJ0VCwgY29uc3QgTWF0cml4VHlwZSYgVCwgCisJCQkJICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBpLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBqKQoreworICBNYXRyaXg8U2NhbGFyLDIsMT4gcmhzID0gVC50ZW1wbGF0ZSBibG9jazwyLDE+KGksaik7CisgIGlmIChqLWkgPiAyKQorICAgIHJocyAtPSBzcXJ0VC5ibG9jayhpLCBpKzIsIDIsIGotaS0yKSAqIHNxcnRULmJsb2NrKGkrMiwgaiwgai1pLTIsIDEpOworICBNYXRyaXg8U2NhbGFyLDIsMj4gQSA9IHNxcnRULmNvZWZmKGosaikgKiBNYXRyaXg8U2NhbGFyLDIsMj46OklkZW50aXR5KCk7CisgIEEgKz0gc3FydFQudGVtcGxhdGUgYmxvY2s8MiwyPihpLGkpOworICBzcXJ0VC50ZW1wbGF0ZSBibG9jazwyLDE+KGksaikgPSBBLmZ1bGxQaXZMdSgpLnNvbHZlKHJocyk7Cit9CisKKy8vIHNpbWlsYXIgdG8gY29tcHV0ZTF4MW9mZkRpYWdvbmFsQmxvY2soKQordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIE1hdHJpeFNxdWFyZVJvb3RRdWFzaVRyaWFuZ3VsYXI8TWF0cml4VHlwZT4KKyAgICAgOjpjb21wdXRlMngyb2ZmRGlhZ29uYWxCbG9jayhNYXRyaXhUeXBlJiBzcXJ0VCwgY29uc3QgTWF0cml4VHlwZSYgVCwgCisJCQkJICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBpLCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBqKQoreworICBNYXRyaXg8U2NhbGFyLDIsMj4gQSA9IHNxcnRULnRlbXBsYXRlIGJsb2NrPDIsMj4oaSxpKTsKKyAgTWF0cml4PFNjYWxhciwyLDI+IEIgPSBzcXJ0VC50ZW1wbGF0ZSBibG9jazwyLDI+KGosaik7CisgIE1hdHJpeDxTY2FsYXIsMiwyPiBDID0gVC50ZW1wbGF0ZSBibG9jazwyLDI+KGksaik7CisgIGlmIChqLWkgPiAyKQorICAgIEMgLT0gc3FydFQuYmxvY2soaSwgaSsyLCAyLCBqLWktMikgKiBzcXJ0VC5ibG9jayhpKzIsIGosIGotaS0yLCAyKTsKKyAgTWF0cml4PFNjYWxhciwyLDI+IFg7CisgIHNvbHZlQXV4aWxpYXJ5RXF1YXRpb24oWCwgQSwgQiwgQyk7CisgIHNxcnRULnRlbXBsYXRlIGJsb2NrPDIsMj4oaSxqKSA9IFg7Cit9CisKKy8vIHNvbHZlcyB0aGUgZXF1YXRpb24gQSBYICsgWCBCID0gQyB3aGVyZSBhbGwgbWF0cmljZXMgYXJlIDItYnktMgordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU21hbGxNYXRyaXhUeXBlPgordm9pZCBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyPE1hdHJpeFR5cGU+CisgICAgIDo6c29sdmVBdXhpbGlhcnlFcXVhdGlvbihTbWFsbE1hdHJpeFR5cGUmIFgsIGNvbnN0IFNtYWxsTWF0cml4VHlwZSYgQSwKKwkJCSAgICAgIGNvbnN0IFNtYWxsTWF0cml4VHlwZSYgQiwgY29uc3QgU21hbGxNYXRyaXhUeXBlJiBDKQoreworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aXNfc2FtZTxTbWFsbE1hdHJpeFR5cGUsIE1hdHJpeDxTY2FsYXIsMiwyPiA+Ojp2YWx1ZSksCisJCSAgICAgIEVJR0VOX0lOVEVSTkFMX0VSUk9SX1BMRUFTRV9GSUxFX0FfQlVHX1JFUE9SVCk7CisKKyAgTWF0cml4PFNjYWxhciw0LDQ+IGNvZWZmTWF0cml4ID0gTWF0cml4PFNjYWxhciw0LDQ+OjpaZXJvKCk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDAsMCkgPSBBLmNvZWZmKDAsMCkgKyBCLmNvZWZmKDAsMCk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDEsMSkgPSBBLmNvZWZmKDAsMCkgKyBCLmNvZWZmKDEsMSk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDIsMikgPSBBLmNvZWZmKDEsMSkgKyBCLmNvZWZmKDAsMCk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDMsMykgPSBBLmNvZWZmKDEsMSkgKyBCLmNvZWZmKDEsMSk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDAsMSkgPSBCLmNvZWZmKDEsMCk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDAsMikgPSBBLmNvZWZmKDAsMSk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDEsMCkgPSBCLmNvZWZmKDAsMSk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDEsMykgPSBBLmNvZWZmKDAsMSk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDIsMCkgPSBBLmNvZWZmKDEsMCk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDIsMykgPSBCLmNvZWZmKDEsMCk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDMsMSkgPSBBLmNvZWZmKDEsMCk7CisgIGNvZWZmTWF0cml4LmNvZWZmUmVmKDMsMikgPSBCLmNvZWZmKDAsMSk7CisgIAorICBNYXRyaXg8U2NhbGFyLDQsMT4gcmhzOworICByaHMuY29lZmZSZWYoMCkgPSBDLmNvZWZmKDAsMCk7CisgIHJocy5jb2VmZlJlZigxKSA9IEMuY29lZmYoMCwxKTsKKyAgcmhzLmNvZWZmUmVmKDIpID0gQy5jb2VmZigxLDApOworICByaHMuY29lZmZSZWYoMykgPSBDLmNvZWZmKDEsMSk7CisgIAorICBNYXRyaXg8U2NhbGFyLDQsMT4gcmVzdWx0OworICByZXN1bHQgPSBjb2VmZk1hdHJpeC5mdWxsUGl2THUoKS5zb2x2ZShyaHMpOworCisgIFguY29lZmZSZWYoMCwwKSA9IHJlc3VsdC5jb2VmZigwKTsKKyAgWC5jb2VmZlJlZigwLDEpID0gcmVzdWx0LmNvZWZmKDEpOworICBYLmNvZWZmUmVmKDEsMCkgPSByZXN1bHQuY29lZmYoMik7CisgIFguY29lZmZSZWYoMSwxKSA9IHJlc3VsdC5jb2VmZigzKTsKK30KKworCisvKiogXGluZ3JvdXAgTWF0cml4RnVuY3Rpb25zX01vZHVsZQorICAqIFxicmllZiBDbGFzcyBmb3IgY29tcHV0aW5nIG1hdHJpeCBzcXVhcmUgcm9vdHMgb2YgdXBwZXIgdHJpYW5ndWxhciBtYXRyaWNlcy4KKyAgKiBcdHBhcmFtICBNYXRyaXhUeXBlICB0eXBlIG9mIHRoZSBhcmd1bWVudCBvZiB0aGUgbWF0cml4IHNxdWFyZSByb290LAorICAqICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkIHRvIGJlIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlIE1hdHJpeCBjbGFzcyB0ZW1wbGF0ZS4KKyAgKgorICAqIFRoaXMgY2xhc3MgY29tcHV0ZXMgdGhlIHNxdWFyZSByb290IG9mIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeAorICAqIHN0b3JlZCBpbiB0aGUgdXBwZXIgdHJpYW5ndWxhciBwYXJ0IChpbmNsdWRpbmcgdGhlIGRpYWdvbmFsKSBvZgorICAqIHRoZSBtYXRyaXggcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgKgorICAqIFxzYSBNYXRyaXhTcXVhcmVSb290LCBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK2NsYXNzIE1hdHJpeFNxdWFyZVJvb3RUcmlhbmd1bGFyCit7CisgIHB1YmxpYzoKKyAgICBNYXRyaXhTcXVhcmVSb290VHJpYW5ndWxhcihjb25zdCBNYXRyaXhUeXBlJiBBKSAKKyAgICAgIDogbV9BKEEpIAorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChBLnJvd3MoKSA9PSBBLmNvbHMoKSk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QKKyAgICAgICoKKyAgICAgICogXHBhcmFtW291dF0gcmVzdWx0ICBzcXVhcmUgcm9vdCBvZiBccCBBLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgKgorICAgICAgKiBPbmx5IHRoZSB1cHBlciB0cmlhbmd1bGFyIHBhcnQgKGluY2x1ZGluZyB0aGUgZGlhZ29uYWwpIG9mIAorICAgICAgKiBccCByZXN1bHQgaXMgdXBkYXRlZCwgdGhlIHJlc3QgaXMgbm90IHRvdWNoZWQuICBTZWUKKyAgICAgICogTWF0cml4QmFzZTo6c3FydCgpIGZvciBkZXRhaWxzIG9uIGhvdyB0aGlzIGNvbXB1dGF0aW9uIGlzCisgICAgICAqIGltcGxlbWVudGVkLgorICAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VHlwZT4gdm9pZCBjb21wdXRlKFJlc3VsdFR5cGUgJnJlc3VsdCk7ICAgIAorCisgcHJpdmF0ZToKKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtX0E7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRUeXBlPiAKK3ZvaWQgTWF0cml4U3F1YXJlUm9vdFRyaWFuZ3VsYXI8TWF0cml4VHlwZT46OmNvbXB1dGUoUmVzdWx0VHlwZSAmcmVzdWx0KQoreworICAvLyBDb21wdXRlIFNjaHVyIGRlY29tcG9zaXRpb24gb2YgbV9BCisgIGNvbnN0IENvbXBsZXhTY2h1cjxNYXRyaXhUeXBlPiBzY2h1ck9mQShtX0EpOyAgCisgIGNvbnN0IE1hdHJpeFR5cGUmIFQgPSBzY2h1ck9mQS5tYXRyaXhUKCk7CisgIGNvbnN0IE1hdHJpeFR5cGUmIFUgPSBzY2h1ck9mQS5tYXRyaXhVKCk7CisKKyAgLy8gQ29tcHV0ZSBzcXVhcmUgcm9vdCBvZiBUIGFuZCBzdG9yZSBpdCBpbiB1cHBlciB0cmlhbmd1bGFyIHBhcnQgb2YgcmVzdWx0CisgIC8vIFRoaXMgdXNlcyB0aGF0IHRoZSBzcXVhcmUgcm9vdCBvZiB0cmlhbmd1bGFyIG1hdHJpY2VzIGNhbiBiZSBjb21wdXRlZCBkaXJlY3RseS4KKyAgcmVzdWx0LnJlc2l6ZShtX0Eucm93cygpLCBtX0EuY29scygpKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBJbmRleDsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IG1fQS5yb3dzKCk7IGkrKykgeworICAgIHJlc3VsdC5jb2VmZlJlZihpLGkpID0gaW50ZXJuYWw6OnNxcnQoVC5jb2VmZihpLGkpKTsKKyAgfQorICBmb3IgKEluZGV4IGogPSAxOyBqIDwgbV9BLmNvbHMoKTsgaisrKSB7CisgICAgZm9yIChJbmRleCBpID0gai0xOyBpID49IDA7IGktLSkgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgICAgLy8gaWYgaSA9IGotMSwgdGhlbiBzZWdtZW50IGhhcyBsZW5ndGggMCBzbyB0bXAgPSAwCisgICAgICBTY2FsYXIgdG1wID0gKHJlc3VsdC5yb3coaSkuc2VnbWVudChpKzEsai1pLTEpICogcmVzdWx0LmNvbChqKS5zZWdtZW50KGkrMSxqLWktMSkpLnZhbHVlKCk7CisgICAgICAvLyBkZW5vbWluYXRvciBtYXkgYmUgemVybyBpZiBvcmlnaW5hbCBtYXRyaXggaXMgc2luZ3VsYXIKKyAgICAgIHJlc3VsdC5jb2VmZlJlZihpLGopID0gKFQuY29lZmYoaSxqKSAtIHRtcCkgLyAocmVzdWx0LmNvZWZmKGksaSkgKyByZXN1bHQuY29lZmYoaixqKSk7CisgICAgfQorICB9CisKKyAgLy8gQ29tcHV0ZSBzcXVhcmUgcm9vdCBvZiBtX0EgYXMgVSAqIHJlc3VsdCAqIFUuYWRqb2ludCgpCisgIE1hdHJpeFR5cGUgdG1wOworICB0bXAubm9hbGlhcygpID0gVSAqIHJlc3VsdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKKyAgcmVzdWx0Lm5vYWxpYXMoKSA9IHRtcCAqIFUuYWRqb2ludCgpOworfQorCisKKy8qKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgICogXGJyaWVmIENsYXNzIGZvciBjb21wdXRpbmcgbWF0cml4IHNxdWFyZSByb290cyBvZiBnZW5lcmFsIG1hdHJpY2VzLgorICAqIFx0cGFyYW0gIE1hdHJpeFR5cGUgIHR5cGUgb2YgdGhlIGFyZ3VtZW50IG9mIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QsCisgICogICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgdG8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgTWF0cml4IGNsYXNzIHRlbXBsYXRlLgorICAqCisgICogXHNhIE1hdHJpeFNxdWFyZVJvb3RUcmlhbmd1bGFyLCBNYXRyaXhTcXVhcmVSb290UXVhc2lUcmlhbmd1bGFyLCBNYXRyaXhCYXNlOjpzcXJ0KCkKKyAgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgSXNDb21wbGV4ID0gTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcj46OklzQ29tcGxleD4KK2NsYXNzIE1hdHJpeFNxdWFyZVJvb3QKK3sKKyAgcHVibGljOgorCisgICAgLyoqIFxicmllZiBDb25zdHJ1Y3Rvci4gCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIEEgIG1hdHJpeCB3aG9zZSBzcXVhcmUgcm9vdCBpcyB0byBiZSBjb21wdXRlZC4KKyAgICAgICoKKyAgICAgICogVGhlIGNsYXNzIHN0b3JlcyBhIHJlZmVyZW5jZSB0byBccCBBLCBzbyBpdCBzaG91bGQgbm90IGJlCisgICAgICAqIGNoYW5nZWQgKG9yIGRlc3Ryb3llZCkgYmVmb3JlIGNvbXB1dGUoKSBpcyBjYWxsZWQuCisgICAgICAqLworICAgIE1hdHJpeFNxdWFyZVJvb3QoY29uc3QgTWF0cml4VHlwZSYgQSk7IAorICAgIAorICAgIC8qKiBcYnJpZWYgQ29tcHV0ZSB0aGUgbWF0cml4IHNxdWFyZSByb290CisgICAgICAqCisgICAgICAqIFxwYXJhbVtvdXRdIHJlc3VsdCAgc3F1YXJlIHJvb3Qgb2YgXHAgQSwgYXMgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICoKKyAgICAgICogU2VlIE1hdHJpeEJhc2U6OnNxcnQoKSBmb3IgZGV0YWlscyBvbiBob3cgdGhpcyBjb21wdXRhdGlvbiBpcworICAgICAgKiBpbXBsZW1lbnRlZC4KKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+IHZvaWQgY29tcHV0ZShSZXN1bHRUeXBlICZyZXN1bHQpOyAgICAKK307CisKKworLy8gKioqKioqKioqKiBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciByZWFsIG1hdHJpY2VzICoqKioqKioqKioKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBNYXRyaXhTcXVhcmVSb290PE1hdHJpeFR5cGUsIDA+Cit7CisgIHB1YmxpYzoKKworICAgIE1hdHJpeFNxdWFyZVJvb3QoY29uc3QgTWF0cml4VHlwZSYgQSkgCisgICAgICA6IG1fQShBKSAKKyAgICB7ICAKKyAgICAgIGVpZ2VuX2Fzc2VydChBLnJvd3MoKSA9PSBBLmNvbHMoKSk7CisgICAgfQorICAKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VHlwZT4gdm9pZCBjb21wdXRlKFJlc3VsdFR5cGUgJnJlc3VsdCkKKyAgICB7CisgICAgICAvLyBDb21wdXRlIFNjaHVyIGRlY29tcG9zaXRpb24gb2YgbV9BCisgICAgICBjb25zdCBSZWFsU2NodXI8TWF0cml4VHlwZT4gc2NodXJPZkEobV9BKTsgIAorICAgICAgY29uc3QgTWF0cml4VHlwZSYgVCA9IHNjaHVyT2ZBLm1hdHJpeFQoKTsKKyAgICAgIGNvbnN0IE1hdHJpeFR5cGUmIFUgPSBzY2h1ck9mQS5tYXRyaXhVKCk7CisgICAgCisgICAgICAvLyBDb21wdXRlIHNxdWFyZSByb290IG9mIFQKKyAgICAgIE1hdHJpeFNxdWFyZVJvb3RRdWFzaVRyaWFuZ3VsYXI8TWF0cml4VHlwZT4gdG1wKFQpOworICAgICAgTWF0cml4VHlwZSBzcXJ0VCA9IE1hdHJpeFR5cGU6Olplcm8obV9BLnJvd3MoKSwgbV9BLnJvd3MoKSk7CisgICAgICB0bXAuY29tcHV0ZShzcXJ0VCk7CisgICAgCisgICAgICAvLyBDb21wdXRlIHNxdWFyZSByb290IG9mIG1fQQorICAgICAgcmVzdWx0ID0gVSAqIHNxcnRUICogVS5hZGpvaW50KCk7CisgICAgfQorICAgIAorICBwcml2YXRlOgorICAgIGNvbnN0IE1hdHJpeFR5cGUmIG1fQTsKK307CisKKworLy8gKioqKioqKioqKiBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBjb21wbGV4IG1hdHJpY2VzICoqKioqKioqKioKKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitjbGFzcyBNYXRyaXhTcXVhcmVSb290PE1hdHJpeFR5cGUsIDE+Cit7CisgIHB1YmxpYzoKKworICAgIE1hdHJpeFNxdWFyZVJvb3QoY29uc3QgTWF0cml4VHlwZSYgQSkgCisgICAgICA6IG1fQShBKSAKKyAgICB7ICAKKyAgICAgIGVpZ2VuX2Fzc2VydChBLnJvd3MoKSA9PSBBLmNvbHMoKSk7CisgICAgfQorICAKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzdWx0VHlwZT4gdm9pZCBjb21wdXRlKFJlc3VsdFR5cGUgJnJlc3VsdCkKKyAgICB7CisgICAgICAvLyBDb21wdXRlIFNjaHVyIGRlY29tcG9zaXRpb24gb2YgbV9BCisgICAgICBjb25zdCBDb21wbGV4U2NodXI8TWF0cml4VHlwZT4gc2NodXJPZkEobV9BKTsgIAorICAgICAgY29uc3QgTWF0cml4VHlwZSYgVCA9IHNjaHVyT2ZBLm1hdHJpeFQoKTsKKyAgICAgIGNvbnN0IE1hdHJpeFR5cGUmIFUgPSBzY2h1ck9mQS5tYXRyaXhVKCk7CisgICAgCisgICAgICAvLyBDb21wdXRlIHNxdWFyZSByb290IG9mIFQKKyAgICAgIE1hdHJpeFNxdWFyZVJvb3RUcmlhbmd1bGFyPE1hdHJpeFR5cGU+IHRtcChUKTsKKyAgICAgIE1hdHJpeFR5cGUgc3FydFQgPSBNYXRyaXhUeXBlOjpaZXJvKG1fQS5yb3dzKCksIG1fQS5yb3dzKCkpOworICAgICAgdG1wLmNvbXB1dGUoc3FydFQpOworICAgIAorICAgICAgLy8gQ29tcHV0ZSBzcXVhcmUgcm9vdCBvZiBtX0EKKyAgICAgIHJlc3VsdCA9IFUgKiBzcXJ0VCAqIFUuYWRqb2ludCgpOworICAgIH0KKyAgICAKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBNYXRyaXhUeXBlJiBtX0E7Cit9OworCisKKy8qKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlCisgICoKKyAgKiBcYnJpZWYgUHJveHkgZm9yIHRoZSBtYXRyaXggc3F1YXJlIHJvb3Qgb2Ygc29tZSBtYXRyaXggKGV4cHJlc3Npb24pLgorICAqCisgICogXHRwYXJhbSBEZXJpdmVkICBUeXBlIG9mIHRoZSBhcmd1bWVudCB0byB0aGUgbWF0cml4IHNxdWFyZSByb290LgorICAqCisgICogVGhpcyBjbGFzcyBob2xkcyB0aGUgYXJndW1lbnQgdG8gdGhlIG1hdHJpeCBzcXVhcmUgcm9vdCB1bnRpbCBpdAorICAqIGlzIGFzc2lnbmVkIG9yIGV2YWx1YXRlZCBmb3Igc29tZSBvdGhlciByZWFzb24gKHNvIHRoZSBhcmd1bWVudAorICAqIHNob3VsZCBub3QgYmUgY2hhbmdlZCBpbiB0aGUgbWVhbnRpbWUpLiBJdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YKKyAgKiBNYXRyaXhCYXNlOjpzcXJ0KCkgYW5kIG1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyB0aGUgb25seSB3YXkgaXQgaXMKKyAgKiB1c2VkLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgTWF0cml4U3F1YXJlUm9vdFJldHVyblZhbHVlCis6IHB1YmxpYyBSZXR1cm5CeVZhbHVlPE1hdHJpeFNxdWFyZVJvb3RSZXR1cm5WYWx1ZTxEZXJpdmVkPiA+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXJpdmVkOjpJbmRleCBJbmRleDsKKyAgcHVibGljOgorICAgIC8qKiBcYnJpZWYgQ29uc3RydWN0b3IuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtpbl0gIHNyYyAgJU1hdHJpeCAoZXhwcmVzc2lvbikgZm9ybWluZyB0aGUgYXJndW1lbnQgb2YgdGhlCisgICAgICAqIG1hdHJpeCBzcXVhcmUgcm9vdC4KKyAgICAgICovCisgICAgTWF0cml4U3F1YXJlUm9vdFJldHVyblZhbHVlKGNvbnN0IERlcml2ZWQmIHNyYykgOiBtX3NyYyhzcmMpIHsgfQorCisgICAgLyoqIFxicmllZiBDb21wdXRlIHRoZSBtYXRyaXggc3F1YXJlIHJvb3QuCisgICAgICAqCisgICAgICAqIFxwYXJhbVtvdXRdICByZXN1bHQgIHRoZSBtYXRyaXggc3F1YXJlIHJvb3Qgb2YgXHAgc3JjIGluIHRoZQorICAgICAgKiBjb25zdHJ1Y3Rvci4KKyAgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFR5cGU+CisgICAgaW5saW5lIHZvaWQgZXZhbFRvKFJlc3VsdFR5cGUmIHJlc3VsdCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCB0eXBlbmFtZSBEZXJpdmVkOjpQbGFpbk9iamVjdCBzcmNFdmFsdWF0ZWQgPSBtX3NyYy5ldmFsKCk7CisgICAgICBNYXRyaXhTcXVhcmVSb290PHR5cGVuYW1lIERlcml2ZWQ6OlBsYWluT2JqZWN0PiBtZShzcmNFdmFsdWF0ZWQpOworICAgICAgbWUuY29tcHV0ZShyZXN1bHQpOworICAgIH0KKworICAgIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3NyYy5yb3dzKCk7IH0KKyAgICBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbV9zcmMuY29scygpOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IERlcml2ZWQmIG1fc3JjOworICBwcml2YXRlOgorICAgIE1hdHJpeFNxdWFyZVJvb3RSZXR1cm5WYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeFNxdWFyZVJvb3RSZXR1cm5WYWx1ZSYpOworfTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitzdHJ1Y3QgdHJhaXRzPE1hdHJpeFNxdWFyZVJvb3RSZXR1cm5WYWx1ZTxEZXJpdmVkPiA+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRGVyaXZlZDo6UGxhaW5PYmplY3QgUmV0dXJuVHlwZTsKK307Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgTWF0cml4U3F1YXJlUm9vdFJldHVyblZhbHVlPERlcml2ZWQ+IE1hdHJpeEJhc2U8RGVyaXZlZD46OnNxcnQoKSBjb25zdAoreworICBlaWdlbl9hc3NlcnQocm93cygpID09IGNvbHMoKSk7CisgIHJldHVybiBNYXRyaXhTcXVhcmVSb290UmV0dXJuVmFsdWU8RGVyaXZlZD4oZGVyaXZlZCgpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9NQVRSSVhfRlVOQ1RJT04KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9NYXRyaXhGdW5jdGlvbnMvU3RlbUZ1bmN0aW9uLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL1N0ZW1GdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNGU1NWMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTWF0cml4RnVuY3Rpb25zL1N0ZW1GdW5jdGlvbi5oCkBAIC0wLDAgKzEsMTA1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBKaXRzZSBOaWVzZW4gPGppdHNlQG1hdGhzLmxlZWRzLmFjLnVrPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TVEVNX0ZVTkNUSU9OCisjZGVmaW5lIEVJR0VOX1NURU1fRlVOQ1RJT04KKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBNYXRyaXhGdW5jdGlvbnNfTW9kdWxlIAorICAqIFxicmllZiBTdGVtIGZ1bmN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHN0YW5kYXJkIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMuCisgICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorY2xhc3MgU3RkU3RlbUZ1bmN0aW9ucworeworICBwdWJsaWM6CisKKyAgICAvKiogXGJyaWVmIFRoZSBleHBvbmVudGlhbCBmdW5jdGlvbiAoYW5kIGl0cyBkZXJpdmF0aXZlcykuICovCisgICAgc3RhdGljIFNjYWxhciBleHAoU2NhbGFyIHgsIGludCkKKyAgICB7CisgICAgICByZXR1cm4gc3RkOjpleHAoeCk7CisgICAgfQorCisgICAgLyoqIFxicmllZiBDb3NpbmUgKGFuZCBpdHMgZGVyaXZhdGl2ZXMpLiAqLworICAgIHN0YXRpYyBTY2FsYXIgY29zKFNjYWxhciB4LCBpbnQgbikKKyAgICB7CisgICAgICBTY2FsYXIgcmVzOworICAgICAgc3dpdGNoIChuICUgNCkgeworICAgICAgY2FzZSAwOiAKKwlyZXMgPSBzdGQ6OmNvcyh4KTsKKwlicmVhazsKKyAgICAgIGNhc2UgMToKKwlyZXMgPSAtc3RkOjpzaW4oeCk7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisJcmVzID0gLXN0ZDo6Y29zKHgpOworCWJyZWFrOworICAgICAgY2FzZSAzOgorCXJlcyA9IHN0ZDo6c2luKHgpOworCWJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKiogXGJyaWVmIFNpbmUgKGFuZCBpdHMgZGVyaXZhdGl2ZXMpLiAqLworICAgIHN0YXRpYyBTY2FsYXIgc2luKFNjYWxhciB4LCBpbnQgbikKKyAgICB7CisgICAgICBTY2FsYXIgcmVzOworICAgICAgc3dpdGNoIChuICUgNCkgeworICAgICAgY2FzZSAwOgorCXJlcyA9IHN0ZDo6c2luKHgpOworCWJyZWFrOworICAgICAgY2FzZSAxOgorCXJlcyA9IHN0ZDo6Y29zKHgpOworCWJyZWFrOworICAgICAgY2FzZSAyOgorCXJlcyA9IC1zdGQ6OnNpbih4KTsKKwlicmVhazsKKyAgICAgIGNhc2UgMzoKKwlyZXMgPSAtc3RkOjpjb3MoeCk7CisJYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qKiBcYnJpZWYgSHlwZXJib2xpYyBjb3NpbmUgKGFuZCBpdHMgZGVyaXZhdGl2ZXMpLiAqLworICAgIHN0YXRpYyBTY2FsYXIgY29zaChTY2FsYXIgeCwgaW50IG4pCisgICAgeworICAgICAgU2NhbGFyIHJlczsKKyAgICAgIHN3aXRjaCAobiAlIDIpIHsKKyAgICAgIGNhc2UgMDoKKwlyZXMgPSBzdGQ6OmNvc2goeCk7CisJYnJlYWs7CisgICAgICBjYXNlIDE6CisJcmVzID0gc3RkOjpzaW5oKHgpOworCWJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisJCisgICAgLyoqIFxicmllZiBIeXBlcmJvbGljIHNpbmUgKGFuZCBpdHMgZGVyaXZhdGl2ZXMpLiAqLworICAgIHN0YXRpYyBTY2FsYXIgc2luaChTY2FsYXIgeCwgaW50IG4pCisgICAgeworICAgICAgU2NhbGFyIHJlczsKKyAgICAgIHN3aXRjaCAobiAlIDIpIHsKKyAgICAgIGNhc2UgMDoKKwlyZXMgPSBzdGQ6OnNpbmgoeCk7CisJYnJlYWs7CisgICAgICBjYXNlIDE6CisJcmVzID0gc3RkOjpjb3NoKHgpOworCWJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKK307IC8vIGVuZCBvZiBjbGFzcyBTdGRTdGVtRnVuY3Rpb25zCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1RFTV9GVU5DVElPTgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01vcmVWZWN0b3JpemF0aW9uL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01vcmVWZWN0b3JpemF0aW9uL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiODg3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9yZVZlY3Rvcml6YXRpb24vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fTW9yZVZlY3Rvcml6YXRpb25fU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUworICAke0VpZ2VuX01vcmVWZWN0b3JpemF0aW9uX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01vcmVWZWN0b3JpemF0aW9uIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9yZVZlY3Rvcml6YXRpb24vTWF0aEZ1bmN0aW9ucy5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01vcmVWZWN0b3JpemF0aW9uL01hdGhGdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2NiMjhkCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL01vcmVWZWN0b3JpemF0aW9uL01hdGhGdW5jdGlvbnMuaApAQCAtMCwwICsxLDk1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBSb2hpdCBHYXJnIDxycGcuMzE0QGdtYWlsLmNvbT4KKy8vIENvcHlyaWdodCAoQykgMjAwOSBCZW5vaXQgSmFjb2IgPGphY29iLmJlbm9pdC4xQGdtYWlsLmNvbT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fTU9SRVZFQ1RPUklaQVRJT05fTUFUSEZVTkNUSU9OU19ICisjZGVmaW5lIEVJR0VOX01PUkVWRUNUT1JJWkFUSU9OX01BVEhGVU5DVElPTlNfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLyoqIFxpbnRlcm5hbCBccmV0dXJucyB0aGUgYXJjc2luIG9mIFxhIGEgKGNvZWZmLXdpc2UpICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQ+IGlubGluZSBzdGF0aWMgUGFja2V0IHBhc2luKFBhY2tldCBhKSB7IHJldHVybiBzdGQ6OmFzaW4oYSk7IH0KKworI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9TU0UKKwordGVtcGxhdGU8PiBFSUdFTl9ET05UX0lOTElORSBQYWNrZXQ0ZiBwYXNpbihQYWNrZXQ0ZiB4KQoreworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihoYWxmLCAwLjUpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihtaW51c19oYWxmLCAtMC41KTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoM2hhbGYsIDEuNSk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGZfRlJPTV9JTlQoc2lnbl9tYXNrLCAweDgwMDAwMDAwKTsKKworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihwaSwgMy4xNDE1OTI2NTQpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0ZihwaV9vdmVyXzIsIDMuMTQxNTkyNjU0KjAuNSk7CisKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoYXNpbjEsIDQuMjE2MzE5OTA0OEUtMik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGFzaW4yLCAyLjQxODEzMTEwNDlFLTIpOworICBfRUlHRU5fREVDTEFSRV9DT05TVF9QYWNrZXQ0Zihhc2luMywgNC41NDcwMDI1OTk4RS0yKTsKKyAgX0VJR0VOX0RFQ0xBUkVfQ09OU1RfUGFja2V0NGYoYXNpbjQsIDcuNDk1MzAwMjY4NkUtMik7CisgIF9FSUdFTl9ERUNMQVJFX0NPTlNUX1BhY2tldDRmKGFzaW41LCAxLjY2NjY3NTI0MjJFLTEpOworCisgIFBhY2tldDRmIGEgPSBwYWJzKHgpOy8vZ290IHRoZSBhYnNvbHV0ZSB2YWx1ZQorCisgIFBhY2tldDRmIHNpZ25fYml0PSBfbW1fYW5kX3BzKHgsIHA0Zl9zaWduX21hc2spOy8vZXh0cmFjdGVkIHRoZSBzaWduIGJpdAorCisgIFBhY2tldDRmIHoxLHoyOy8vd2lsbCBuZWVkIHRoZW0gZHVyaW5nIGNvbXB1dGF0aW9uICAgIAorCisKKy8vd2lsbCBjb21wdXRlIHRoZSB0d28gYnJhbmNoZXMgZm9yIGFzaW4KKy8vc28gZmlyc3QgY29tcGFyZSB3aXRoIGhhbGYKKworICBQYWNrZXQ0ZiBicmFuY2hfbWFzaz0gX21tX2NtcGd0X3BzKGEsIHA0Zl9oYWxmKTsvL3RoaXMgaXMgdG8gc2VsZWN0IHdoaWNoIGJyYW5jaCB0byB0YWtlCisvL2JvdGggd2lsbCBiZSB0YWtlbiwgYW5kIGZpbmFsbHkgcmVzdWx0cyB3aWxsIGJlIG1lcmdlZAorLy90aGUgYnJhbmNoIGZvciB2YWx1ZXMgPjAuNQorCisgICAgeworLy90aGUgY29yZSBzZXJpZXMgZXhwYW5zaW9uIAorICAgIHoxPXBtYWRkKHA0Zl9taW51c19oYWxmLGEscDRmX2hhbGYpOworICAgIFBhY2tldDRmIHgxPXBzcXJ0KHoxKTsKKyAgICBQYWNrZXQ0ZiBzMT1wbWFkZChwNGZfYXNpbjEsIHoxLCBwNGZfYXNpbjIpOworICAgIFBhY2tldDRmIHMyPXBtYWRkKHMxLCB6MSwgcDRmX2FzaW4zKTsKKyAgICBQYWNrZXQ0ZiBzMz1wbWFkZChzMix6MSwgcDRmX2FzaW40KTsKKyAgICBQYWNrZXQ0ZiBzND1wbWFkZChzMyx6MSwgcDRmX2FzaW41KTsKKyAgICBQYWNrZXQ0ZiB0ZW1wPXBtdWwoczQsejEpOy8vbm90IHJlYWxseSBhIG1hZGQgYnV0IGEgbXVsIGJ5IHogc28gdGhhdCB0aGUgbmV4dCB0ZXJtIGNhbiBiZSBhIG1hZGQKKyAgICB6MT1wbWFkZCh0ZW1wLHgxLHgxKTsKKyAgICB6MT1wYWRkKHoxLHoxKTsKKyAgICB6MT1wc3ViKHA0Zl9waV9vdmVyXzIsejEpOworICAgIH0KKworICAgIHsKKy8vdGhlIGNvcmUgc2VyaWVzIGV4cGFuc2lvbiAKKyAgICBQYWNrZXQ0ZiB4Mj1hOworICAgIHoyPXBtdWwoeDIseDIpOworICAgIFBhY2tldDRmIHMxPXBtYWRkKHA0Zl9hc2luMSwgejIsIHA0Zl9hc2luMik7CisgICAgUGFja2V0NGYgczI9cG1hZGQoczEsIHoyLCBwNGZfYXNpbjMpOworICAgIFBhY2tldDRmIHMzPXBtYWRkKHMyLHoyLCBwNGZfYXNpbjQpOworICAgIFBhY2tldDRmIHM0PXBtYWRkKHMzLHoyLCBwNGZfYXNpbjUpOworICAgIFBhY2tldDRmIHRlbXA9cG11bChzNCx6Mik7Ly9ub3QgcmVhbGx5IGEgbWFkZCBidXQgYSBtdWwgYnkgeiBzbyB0aGF0IHRoZSBuZXh0IHRlcm0gY2FuIGJlIGEgbWFkZAorICAgIHoyPXBtYWRkKHRlbXAseDIseDIpOworICAgIH0KKworLyogc2VsZWN0IHRoZSBjb3JyZWN0IHJlc3VsdCBmcm9tIHRoZSB0d28gYnJhbmNoIGV2YWx1YXRpb25zICovCisgIHoxICA9IF9tbV9hbmRfcHMoYnJhbmNoX21hc2ssIHoxKTsKKyAgejIgID0gX21tX2FuZG5vdF9wcyhicmFuY2hfbWFzaywgejIpOworICBQYWNrZXQ0ZiB6ICA9IF9tbV9vcl9wcyh6MSx6Mik7CisKKy8qIHVwZGF0ZSB0aGUgc2lnbiAqLworICByZXR1cm4gX21tX3hvcl9wcyh6LCBzaWduX2JpdCk7Cit9CisKKyNlbmRpZiAvLyBFSUdFTl9WRUNUT1JJWkVfU1NFCisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX01PUkVWRUNUT1JJWkFUSU9OX01BVEhGVU5DVElPTlNfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9DTWFrZUxpc3RzLnR4dCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyMmRkYQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fTm9uTGluZWFyT3B0aW1pemF0aW9uX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9Ob25MaW5lYXJPcHRpbWl6YXRpb25fU1JDU30KKyAgREVTVElOQVRJT04gJHtJTkNMVURFX0lOU1RBTExfRElSfS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL0h5YnJpZE5vbkxpbmVhclNvbHZlci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9IeWJyaWROb25MaW5lYXJTb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWNlNGVhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9IeWJyaWROb25MaW5lYXJTb2x2ZXIuaApAQCAtMCwwICsxLDU5NiBAQAorLy8gLSotIGNvZGluZzogdXRmLTgKKy8vIHZpbTogc2V0IGZpbGVlbmNvZGluZz11dGYtOAorCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9IWUJSSUROT05MSU5FQVJTT0xWRVJfSAorI2RlZmluZSBFSUdFTl9IWUJSSUROT05MSU5FQVJTT0xWRVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlIHsgCisgICAgZW51bSBTdGF0dXMgeworICAgICAgICBSdW5uaW5nID0gLTEsCisgICAgICAgIEltcHJvcGVySW5wdXRQYXJhbWV0ZXJzID0gMCwKKyAgICAgICAgUmVsYXRpdmVFcnJvclRvb1NtYWxsID0gMSwKKyAgICAgICAgVG9vTWFueUZ1bmN0aW9uRXZhbHVhdGlvbiA9IDIsCisgICAgICAgIFRvbFRvb1NtYWxsID0gMywKKyAgICAgICAgTm90TWFraW5nUHJvZ3Jlc3NKYWNvYmlhbiA9IDQsCisgICAgICAgIE5vdE1ha2luZ1Byb2dyZXNzSXRlcmF0aW9ucyA9IDUsCisgICAgICAgIFVzZXJBc2tlZCA9IDYKKyAgICB9OworfQorCisvKioKKyAgKiBcaW5ncm91cCBOb25MaW5lYXJPcHRpbWl6YXRpb25fTW9kdWxlCisgICogXGJyaWVmIEZpbmRzIGEgemVybyBvZiBhIHN5c3RlbSBvZiBuCisgICogbm9ubGluZWFyIGZ1bmN0aW9ucyBpbiBuIHZhcmlhYmxlcyBieSBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgUG93ZWxsCisgICogaHlicmlkIG1ldGhvZCAoImRvZ2xlZyIpLgorICAqCisgICogVGhlIHVzZXIgbXVzdCBwcm92aWRlIGEgc3Vicm91dGluZSB3aGljaCBjYWxjdWxhdGVzIHRoZQorICAqIGZ1bmN0aW9ucy4gVGhlIEphY29iaWFuIGlzIGVpdGhlciBwcm92aWRlZCBieSB0aGUgdXNlciwgb3IgYXBwcm94aW1hdGVkCisgICogdXNpbmcgYSBmb3J3YXJkLWRpZmZlcmVuY2UgbWV0aG9kLgorICAqCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPWRvdWJsZT4KK2NsYXNzIEh5YnJpZE5vbkxpbmVhclNvbHZlcgoreworcHVibGljOgorICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlcihGdW5jdG9yVHlwZSAmX2Z1bmN0b3IpCisgICAgICAgIDogZnVuY3RvcihfZnVuY3RvcikgeyBuZmV2PW5qZXY9aXRlciA9IDA7ICBmbm9ybT0gMC47IHVzZUV4dGVybmFsU2NhbGluZz1mYWxzZTt9CisKKyAgICBzdHJ1Y3QgUGFyYW1ldGVycyB7CisgICAgICAgIFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgOiBmYWN0b3IoU2NhbGFyKDEwMC4pKQorICAgICAgICAgICAgLCBtYXhmZXYoMTAwMCkKKyAgICAgICAgICAgICwgeHRvbChpbnRlcm5hbDo6c3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKSkKKyAgICAgICAgICAgICwgbmJfb2Zfc3ViZGlhZ29uYWxzKC0xKQorICAgICAgICAgICAgLCBuYl9vZl9zdXBlcmRpYWdvbmFscygtMSkKKyAgICAgICAgICAgICwgZXBzZmNuKFNjYWxhcigwLikpIHt9CisgICAgICAgIFNjYWxhciBmYWN0b3I7CisgICAgICAgIEluZGV4IG1heGZldjsgICAvLyBtYXhpbXVtIG51bWJlciBvZiBmdW5jdGlvbiBldmFsdWF0aW9uCisgICAgICAgIFNjYWxhciB4dG9sOworICAgICAgICBJbmRleCBuYl9vZl9zdWJkaWFnb25hbHM7CisgICAgICAgIEluZGV4IG5iX29mX3N1cGVyZGlhZ29uYWxzOworICAgICAgICBTY2FsYXIgZXBzZmNuOworICAgIH07CisgICAgdHlwZWRlZiBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+IEZWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMgPiBKYWNvYmlhblR5cGU7CisgICAgLyogVE9ETzogaWYgZWlnZW4gcHJvdmlkZXMgYSB0cmlhbmd1bGFyIHN0b3JhZ2UsIHVzZSBpdCBoZXJlICovCisgICAgdHlwZWRlZiBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgRHluYW1pYyA+IFVwcGVyVHJpYW5ndWxhclR5cGU7CisKKyAgICBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6U3RhdHVzIGh5YnJqMSgKKyAgICAgICAgICAgIEZWZWN0b3JUeXBlICAmeCwKKyAgICAgICAgICAgIGNvbnN0IFNjYWxhciB0b2wgPSBpbnRlcm5hbDo6c3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgKTsKKworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc29sdmVJbml0KEZWZWN0b3JUeXBlICAmeCk7CisgICAgSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlN0YXR1cyBzb2x2ZU9uZVN0ZXAoRlZlY3RvclR5cGUgICZ4KTsKKyAgICBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6U3RhdHVzIHNvbHZlKEZWZWN0b3JUeXBlICAmeCk7CisKKyAgICBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6U3RhdHVzIGh5YnJkMSgKKyAgICAgICAgICAgIEZWZWN0b3JUeXBlICAmeCwKKyAgICAgICAgICAgIGNvbnN0IFNjYWxhciB0b2wgPSBpbnRlcm5hbDo6c3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgKTsKKworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc29sdmVOdW1lcmljYWxEaWZmSW5pdChGVmVjdG9yVHlwZSAgJngpOworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc29sdmVOdW1lcmljYWxEaWZmT25lU3RlcChGVmVjdG9yVHlwZSAgJngpOworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc29sdmVOdW1lcmljYWxEaWZmKEZWZWN0b3JUeXBlICAmeCk7CisKKyAgICB2b2lkIHJlc2V0UGFyYW1ldGVycyh2b2lkKSB7IHBhcmFtZXRlcnMgPSBQYXJhbWV0ZXJzKCk7IH0KKyAgICBQYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CisgICAgRlZlY3RvclR5cGUgIGZ2ZWMsIHF0ZiwgZGlhZzsKKyAgICBKYWNvYmlhblR5cGUgZmphYzsKKyAgICBVcHBlclRyaWFuZ3VsYXJUeXBlIFI7CisgICAgSW5kZXggbmZldjsKKyAgICBJbmRleCBuamV2OworICAgIEluZGV4IGl0ZXI7CisgICAgU2NhbGFyIGZub3JtOworICAgIGJvb2wgdXNlRXh0ZXJuYWxTY2FsaW5nOyAKK3ByaXZhdGU6CisgICAgRnVuY3RvclR5cGUgJmZ1bmN0b3I7CisgICAgSW5kZXggbjsKKyAgICBTY2FsYXIgc3VtOworICAgIGJvb2wgc2luZzsKKyAgICBTY2FsYXIgdGVtcDsKKyAgICBTY2FsYXIgZGVsdGE7CisgICAgYm9vbCBqZXZhbDsKKyAgICBJbmRleCBuY3N1YzsKKyAgICBTY2FsYXIgcmF0aW87CisgICAgU2NhbGFyIHBub3JtLCB4bm9ybSwgZm5vcm0xOworICAgIEluZGV4IG5zbG93MSwgbnNsb3cyOworICAgIEluZGV4IG5jZmFpbDsKKyAgICBTY2FsYXIgYWN0cmVkLCBwcmVyZWQ7CisgICAgRlZlY3RvclR5cGUgd2ExLCB3YTIsIHdhMywgd2E0OworCisgICAgSHlicmlkTm9uTGluZWFyU29sdmVyJiBvcGVyYXRvcj0oY29uc3QgSHlicmlkTm9uTGluZWFyU29sdmVyJik7Cit9OworCisKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0h5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMKK0h5YnJpZE5vbkxpbmVhclNvbHZlcjxGdW5jdG9yVHlwZSxTY2FsYXI+OjpoeWJyajEoCisgICAgICAgIEZWZWN0b3JUeXBlICAmeCwKKyAgICAgICAgY29uc3QgU2NhbGFyIHRvbAorICAgICAgICApCit7CisgICAgbiA9IHguc2l6ZSgpOworCisgICAgLyogY2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIGVycm9ycy4gKi8KKyAgICBpZiAobiA8PSAwIHx8IHRvbCA8IDAuKQorICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OkltcHJvcGVySW5wdXRQYXJhbWV0ZXJzOworCisgICAgcmVzZXRQYXJhbWV0ZXJzKCk7CisgICAgcGFyYW1ldGVycy5tYXhmZXYgPSAxMDAqKG4rMSk7CisgICAgcGFyYW1ldGVycy54dG9sID0gdG9sOworICAgIGRpYWcuc2V0Q29uc3RhbnQobiwgMS4pOworICAgIHVzZUV4dGVybmFsU2NhbGluZyA9IHRydWU7CisgICAgcmV0dXJuIHNvbHZlKHgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlN0YXR1cworSHlicmlkTm9uTGluZWFyU29sdmVyPEZ1bmN0b3JUeXBlLFNjYWxhcj46OnNvbHZlSW5pdChGVmVjdG9yVHlwZSAgJngpCit7CisgICAgbiA9IHguc2l6ZSgpOworCisgICAgd2ExLnJlc2l6ZShuKTsgd2EyLnJlc2l6ZShuKTsgd2EzLnJlc2l6ZShuKTsgd2E0LnJlc2l6ZShuKTsKKyAgICBmdmVjLnJlc2l6ZShuKTsKKyAgICBxdGYucmVzaXplKG4pOworICAgIGZqYWMucmVzaXplKG4sIG4pOworICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBkaWFnLnJlc2l6ZShuKTsKKyAgICBhc3NlcnQoICghdXNlRXh0ZXJuYWxTY2FsaW5nIHx8IGRpYWcuc2l6ZSgpPT1uKSB8fCAiV2hlbiB1c2VFeHRlcm5hbFNjYWxpbmcgaXMgc2V0LCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkICdkaWFnJyIpOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIG5mZXYgPSAwOworICAgIG5qZXYgPSAwOworCisgICAgLyogICAgIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCBwYXJhbWV0ZXJzLnh0b2wgPCAwLiB8fCBwYXJhbWV0ZXJzLm1heGZldiA8PSAwIHx8IHBhcmFtZXRlcnMuZmFjdG9yIDw9IDAuICkKKyAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKyAgICBpZiAodXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgaWYgKGRpYWdbal0gPD0gMC4pCisgICAgICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIC8qICAgICBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgdGhlIHN0YXJ0aW5nIHBvaW50ICovCisgICAgLyogICAgIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgbmZldiA9IDE7CisgICAgaWYgKCBmdW5jdG9yKHgsIGZ2ZWMpIDwgMCkKKyAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpVc2VyQXNrZWQ7CisgICAgZm5vcm0gPSBmdmVjLnN0YWJsZU5vcm0oKTsKKworICAgIC8qICAgICBpbml0aWFsaXplIGl0ZXJhdGlvbiBjb3VudGVyIGFuZCBtb25pdG9ycy4gKi8KKyAgICBpdGVyID0gMTsKKyAgICBuY3N1YyA9IDA7CisgICAgbmNmYWlsID0gMDsKKyAgICBuc2xvdzEgPSAwOworICAgIG5zbG93MiA9IDA7CisKKyAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlJ1bm5pbmc7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6U3RhdHVzCitIeWJyaWROb25MaW5lYXJTb2x2ZXI8RnVuY3RvclR5cGUsU2NhbGFyPjo6c29sdmVPbmVTdGVwKEZWZWN0b3JUeXBlICAmeCkKK3sKKyAgICBhc3NlcnQoeC5zaXplKCk9PW4pOyAvLyBjaGVjayB0aGUgY2FsbGVyIGlzIG5vdCBjaGVhdGluZyB1cworCisgICAgSW5kZXggajsKKyAgICBzdGQ6OnZlY3RvcjxKYWNvYmlSb3RhdGlvbjxTY2FsYXI+ID4gdl9naXZlbnMobiksIHdfZ2l2ZW5zKG4pOworCisgICAgamV2YWwgPSB0cnVlOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBqYWNvYmlhbiBtYXRyaXguICovCisgICAgaWYgKCBmdW5jdG9yLmRmKHgsIGZqYWMpIDwgMCkKKyAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpVc2VyQXNrZWQ7CisgICAgKytuamV2OworCisgICAgd2EyID0gZmphYy5jb2x3aXNlKCkuYmx1ZU5vcm0oKTsKKworICAgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gYW5kIGlmIGV4dGVybmFsIHNjYWxpbmcgaXMgbm90IHVzZWQsIHNjYWxlIGFjY29yZGluZyAqLworICAgIC8qIHRvIHRoZSBub3JtcyBvZiB0aGUgY29sdW1ucyBvZiB0aGUgaW5pdGlhbCBqYWNvYmlhbi4gKi8KKyAgICBpZiAoaXRlciA9PSAxKSB7CisgICAgICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICAgICAgICBkaWFnW2pdID0gKHdhMltqXT09MC4pID8gMS4gOiB3YTJbal07CisKKyAgICAgICAgLyogb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgY2FsY3VsYXRlIHRoZSBub3JtIG9mIHRoZSBzY2FsZWQgeCAqLworICAgICAgICAvKiBhbmQgaW5pdGlhbGl6ZSB0aGUgc3RlcCBib3VuZCBkZWx0YS4gKi8KKyAgICAgICAgeG5vcm0gPSBkaWFnLmN3aXNlUHJvZHVjdCh4KS5zdGFibGVOb3JtKCk7CisgICAgICAgIGRlbHRhID0gcGFyYW1ldGVycy5mYWN0b3IgKiB4bm9ybTsKKyAgICAgICAgaWYgKGRlbHRhID09IDAuKQorICAgICAgICAgICAgZGVsdGEgPSBwYXJhbWV0ZXJzLmZhY3RvcjsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHRoZSBxciBmYWN0b3JpemF0aW9uIG9mIHRoZSBqYWNvYmlhbi4gKi8KKyAgICBIb3VzZWhvbGRlclFSPEphY29iaWFuVHlwZT4gcXJmYWMoZmphYyk7IC8vIG5vIHBpdm90aW5nOgorCisgICAgLyogY29weSB0aGUgdHJpYW5ndWxhciBmYWN0b3Igb2YgdGhlIHFyIGZhY3Rvcml6YXRpb24gaW50byByLiAqLworICAgIFIgPSBxcmZhYy5tYXRyaXhRUigpOworCisgICAgLyogYWNjdW11bGF0ZSB0aGUgb3J0aG9nb25hbCBmYWN0b3IgaW4gZmphYy4gKi8KKyAgICBmamFjID0gcXJmYWMuaG91c2Vob2xkZXJRKCk7CisKKyAgICAvKiBmb3JtIChxIHRyYW5zcG9zZSkqZnZlYyBhbmQgc3RvcmUgaW4gcXRmLiAqLworICAgIHF0ZiA9IGZqYWMudHJhbnNwb3NlKCkgKiBmdmVjOworCisgICAgLyogcmVzY2FsZSBpZiBuZWNlc3NhcnkuICovCisgICAgaWYgKCF1c2VFeHRlcm5hbFNjYWxpbmcpCisgICAgICAgIGRpYWcgPSBkaWFnLmN3aXNlTWF4KHdhMik7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAvKiBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBwLiAqLworICAgICAgICBpbnRlcm5hbDo6ZG9nbGVnPFNjYWxhcj4oUiwgZGlhZywgcXRmLCBkZWx0YSwgd2ExKTsKKworICAgICAgICAvKiBzdG9yZSB0aGUgZGlyZWN0aW9uIHAgYW5kIHggKyBwLiBjYWxjdWxhdGUgdGhlIG5vcm0gb2YgcC4gKi8KKyAgICAgICAgd2ExID0gLXdhMTsKKyAgICAgICAgd2EyID0geCArIHdhMTsKKyAgICAgICAgcG5vcm0gPSBkaWFnLmN3aXNlUHJvZHVjdCh3YTEpLnN0YWJsZU5vcm0oKTsKKworICAgICAgICAvKiBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBhZGp1c3QgdGhlIGluaXRpYWwgc3RlcCBib3VuZC4gKi8KKyAgICAgICAgaWYgKGl0ZXIgPT0gMSkKKyAgICAgICAgICAgIGRlbHRhID0gKHN0ZDo6bWluKShkZWx0YSxwbm9ybSk7CisKKyAgICAgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHggKyBwIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgICAgIGlmICggZnVuY3Rvcih3YTIsIHdhNCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpVc2VyQXNrZWQ7CisgICAgICAgICsrbmZldjsKKyAgICAgICAgZm5vcm0xID0gd2E0LnN0YWJsZU5vcm0oKTsKKworICAgICAgICAvKiBjb21wdXRlIHRoZSBzY2FsZWQgYWN0dWFsIHJlZHVjdGlvbi4gKi8KKyAgICAgICAgYWN0cmVkID0gLTEuOworICAgICAgICBpZiAoZm5vcm0xIDwgZm5vcm0pIC8qIENvbXB1dGluZyAybmQgcG93ZXIgKi8KKyAgICAgICAgICAgIGFjdHJlZCA9IDEuIC0gaW50ZXJuYWw6OmFiczIoZm5vcm0xIC8gZm5vcm0pOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHNjYWxlZCBwcmVkaWN0ZWQgcmVkdWN0aW9uLiAqLworICAgICAgICB3YTMgPSBSLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKndhMSArIHF0ZjsKKyAgICAgICAgdGVtcCA9IHdhMy5zdGFibGVOb3JtKCk7CisgICAgICAgIHByZXJlZCA9IDAuOworICAgICAgICBpZiAodGVtcCA8IGZub3JtKSAvKiBDb21wdXRpbmcgMm5kIHBvd2VyICovCisgICAgICAgICAgICBwcmVyZWQgPSAxLiAtIGludGVybmFsOjphYnMyKHRlbXAgLyBmbm9ybSk7CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgcmF0aW8gb2YgdGhlIGFjdHVhbCB0byB0aGUgcHJlZGljdGVkIHJlZHVjdGlvbi4gKi8KKyAgICAgICAgcmF0aW8gPSAwLjsKKyAgICAgICAgaWYgKHByZXJlZCA+IDAuKQorICAgICAgICAgICAgcmF0aW8gPSBhY3RyZWQgLyBwcmVyZWQ7CisKKyAgICAgICAgLyogdXBkYXRlIHRoZSBzdGVwIGJvdW5kLiAqLworICAgICAgICBpZiAocmF0aW8gPCBTY2FsYXIoLjEpKSB7CisgICAgICAgICAgICBuY3N1YyA9IDA7CisgICAgICAgICAgICArK25jZmFpbDsKKyAgICAgICAgICAgIGRlbHRhID0gU2NhbGFyKC41KSAqIGRlbHRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmNmYWlsID0gMDsKKyAgICAgICAgICAgICsrbmNzdWM7CisgICAgICAgICAgICBpZiAocmF0aW8gPj0gU2NhbGFyKC41KSB8fCBuY3N1YyA+IDEpCisgICAgICAgICAgICAgICAgZGVsdGEgPSAoc3RkOjptYXgpKGRlbHRhLCBwbm9ybSAvIFNjYWxhciguNSkpOworICAgICAgICAgICAgaWYgKGludGVybmFsOjphYnMocmF0aW8gLSAxLikgPD0gU2NhbGFyKC4xKSkgeworICAgICAgICAgICAgICAgIGRlbHRhID0gcG5vcm0gLyBTY2FsYXIoLjUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogdGVzdCBmb3Igc3VjY2Vzc2Z1bCBpdGVyYXRpb24uICovCisgICAgICAgIGlmIChyYXRpbyA+PSBTY2FsYXIoMWUtNCkpIHsKKyAgICAgICAgICAgIC8qIHN1Y2Nlc3NmdWwgaXRlcmF0aW9uLiB1cGRhdGUgeCwgZnZlYywgYW5kIHRoZWlyIG5vcm1zLiAqLworICAgICAgICAgICAgeCA9IHdhMjsKKyAgICAgICAgICAgIHdhMiA9IGRpYWcuY3dpc2VQcm9kdWN0KHgpOworICAgICAgICAgICAgZnZlYyA9IHdhNDsKKyAgICAgICAgICAgIHhub3JtID0gd2EyLnN0YWJsZU5vcm0oKTsKKyAgICAgICAgICAgIGZub3JtID0gZm5vcm0xOworICAgICAgICAgICAgKytpdGVyOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBwcm9ncmVzcyBvZiB0aGUgaXRlcmF0aW9uLiAqLworICAgICAgICArK25zbG93MTsKKyAgICAgICAgaWYgKGFjdHJlZCA+PSBTY2FsYXIoLjAwMSkpCisgICAgICAgICAgICBuc2xvdzEgPSAwOworICAgICAgICBpZiAoamV2YWwpCisgICAgICAgICAgICArK25zbG93MjsKKyAgICAgICAgaWYgKGFjdHJlZCA+PSBTY2FsYXIoLjEpKQorICAgICAgICAgICAgbnNsb3cyID0gMDsKKworICAgICAgICAvKiB0ZXN0IGZvciBjb252ZXJnZW5jZS4gKi8KKyAgICAgICAgaWYgKGRlbHRhIDw9IHBhcmFtZXRlcnMueHRvbCAqIHhub3JtIHx8IGZub3JtID09IDAuKQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpSZWxhdGl2ZUVycm9yVG9vU21hbGw7CisKKyAgICAgICAgLyogdGVzdHMgZm9yIHRlcm1pbmF0aW9uIGFuZCBzdHJpbmdlbnQgdG9sZXJhbmNlcy4gKi8KKyAgICAgICAgaWYgKG5mZXYgPj0gcGFyYW1ldGVycy5tYXhmZXYpCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlRvb01hbnlGdW5jdGlvbkV2YWx1YXRpb247CisgICAgICAgIGlmIChTY2FsYXIoLjEpICogKHN0ZDo6bWF4KShTY2FsYXIoLjEpICogZGVsdGEsIHBub3JtKSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICogeG5vcm0pCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlRvbFRvb1NtYWxsOworICAgICAgICBpZiAobnNsb3cyID09IDUpCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6Ok5vdE1ha2luZ1Byb2dyZXNzSmFjb2JpYW47CisgICAgICAgIGlmIChuc2xvdzEgPT0gMTApCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6Ok5vdE1ha2luZ1Byb2dyZXNzSXRlcmF0aW9uczsKKworICAgICAgICAvKiBjcml0ZXJpb24gZm9yIHJlY2FsY3VsYXRpbmcgamFjb2JpYW4uICovCisgICAgICAgIGlmIChuY2ZhaWwgPT0gMikKKyAgICAgICAgICAgIGJyZWFrOyAvLyBsZWF2ZSBpbm5lciBsb29wIGFuZCBnbyBmb3IgdGhlIG5leHQgb3V0ZXIgbG9vcCBpdGVyYXRpb24KKworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHJhbmsgb25lIG1vZGlmaWNhdGlvbiB0byB0aGUgamFjb2JpYW4gKi8KKyAgICAgICAgLyogYW5kIHVwZGF0ZSBxdGYgaWYgbmVjZXNzYXJ5LiAqLworICAgICAgICB3YTEgPSBkaWFnLmN3aXNlUHJvZHVjdCggZGlhZy5jd2lzZVByb2R1Y3Qod2ExKS9wbm9ybSApOworICAgICAgICB3YTIgPSBmamFjLnRyYW5zcG9zZSgpICogd2E0OworICAgICAgICBpZiAocmF0aW8gPj0gU2NhbGFyKDFlLTQpKQorICAgICAgICAgICAgcXRmID0gd2EyOworICAgICAgICB3YTIgPSAod2EyLXdhMykvcG5vcm07CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgcXIgZmFjdG9yaXphdGlvbiBvZiB0aGUgdXBkYXRlZCBqYWNvYmlhbi4gKi8KKyAgICAgICAgaW50ZXJuYWw6OnIxdXBkdDxTY2FsYXI+KFIsIHdhMSwgdl9naXZlbnMsIHdfZ2l2ZW5zLCB3YTIsIHdhMywgJnNpbmcpOworICAgICAgICBpbnRlcm5hbDo6cjFtcHlxPFNjYWxhcj4obiwgbiwgZmphYy5kYXRhKCksIHZfZ2l2ZW5zLCB3X2dpdmVucyk7CisgICAgICAgIGludGVybmFsOjpyMW1weXE8U2NhbGFyPigxLCBuLCBxdGYuZGF0YSgpLCB2X2dpdmVucywgd19naXZlbnMpOworCisgICAgICAgIGpldmFsID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6UnVubmluZzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0h5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMKK0h5YnJpZE5vbkxpbmVhclNvbHZlcjxGdW5jdG9yVHlwZSxTY2FsYXI+Ojpzb2x2ZShGVmVjdG9yVHlwZSAgJngpCit7CisgICAgSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlN0YXR1cyBzdGF0dXMgPSBzb2x2ZUluaXQoeCk7CisgICAgaWYgKHN0YXR1cz09SHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OkltcHJvcGVySW5wdXRQYXJhbWV0ZXJzKQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIHdoaWxlIChzdGF0dXM9PUh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpSdW5uaW5nKQorICAgICAgICBzdGF0dXMgPSBzb2x2ZU9uZVN0ZXAoeCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6U3RhdHVzCitIeWJyaWROb25MaW5lYXJTb2x2ZXI8RnVuY3RvclR5cGUsU2NhbGFyPjo6aHlicmQxKAorICAgICAgICBGVmVjdG9yVHlwZSAgJngsCisgICAgICAgIGNvbnN0IFNjYWxhciB0b2wKKyAgICAgICAgKQoreworICAgIG4gPSB4LnNpemUoKTsKKworICAgIC8qIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCB0b2wgPCAwLikKKyAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIHJlc2V0UGFyYW1ldGVycygpOworICAgIHBhcmFtZXRlcnMubWF4ZmV2ID0gMjAwKihuKzEpOworICAgIHBhcmFtZXRlcnMueHRvbCA9IHRvbDsKKworICAgIGRpYWcuc2V0Q29uc3RhbnQobiwgMS4pOworICAgIHVzZUV4dGVybmFsU2NhbGluZyA9IHRydWU7CisgICAgcmV0dXJuIHNvbHZlTnVtZXJpY2FsRGlmZih4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0h5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMKK0h5YnJpZE5vbkxpbmVhclNvbHZlcjxGdW5jdG9yVHlwZSxTY2FsYXI+Ojpzb2x2ZU51bWVyaWNhbERpZmZJbml0KEZWZWN0b3JUeXBlICAmeCkKK3sKKyAgICBuID0geC5zaXplKCk7CisKKyAgICBpZiAocGFyYW1ldGVycy5uYl9vZl9zdWJkaWFnb25hbHM8MCkgcGFyYW1ldGVycy5uYl9vZl9zdWJkaWFnb25hbHM9IG4tMTsKKyAgICBpZiAocGFyYW1ldGVycy5uYl9vZl9zdXBlcmRpYWdvbmFsczwwKSBwYXJhbWV0ZXJzLm5iX29mX3N1cGVyZGlhZ29uYWxzPSBuLTE7CisKKyAgICB3YTEucmVzaXplKG4pOyB3YTIucmVzaXplKG4pOyB3YTMucmVzaXplKG4pOyB3YTQucmVzaXplKG4pOworICAgIHF0Zi5yZXNpemUobik7CisgICAgZmphYy5yZXNpemUobiwgbik7CisgICAgZnZlYy5yZXNpemUobik7CisgICAgaWYgKCF1c2VFeHRlcm5hbFNjYWxpbmcpCisgICAgICAgIGRpYWcucmVzaXplKG4pOworICAgIGFzc2VydCggKCF1c2VFeHRlcm5hbFNjYWxpbmcgfHwgZGlhZy5zaXplKCk9PW4pIHx8ICJXaGVuIHVzZUV4dGVybmFsU2NhbGluZyBpcyBzZXQsIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgdmFsaWQgJ2RpYWcnIik7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgbmZldiA9IDA7CisgICAgbmpldiA9IDA7CisKKyAgICAvKiAgICAgY2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIGVycm9ycy4gKi8KKyAgICBpZiAobiA8PSAwIHx8IHBhcmFtZXRlcnMueHRvbCA8IDAuIHx8IHBhcmFtZXRlcnMubWF4ZmV2IDw9IDAgfHwgcGFyYW1ldGVycy5uYl9vZl9zdWJkaWFnb25hbHM8IDAgfHwgcGFyYW1ldGVycy5uYl9vZl9zdXBlcmRpYWdvbmFsczwgMCB8fCBwYXJhbWV0ZXJzLmZhY3RvciA8PSAwLiApCisgICAgICAgIHJldHVybiBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisgICAgaWYgKHVzZUV4dGVybmFsU2NhbGluZykKKyAgICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICAgIGlmIChkaWFnW2pdIDw9IDAuKQorICAgICAgICAgICAgICAgIHJldHVybiBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICAvKiAgICAgZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHRoZSBzdGFydGluZyBwb2ludCAqLworICAgIC8qICAgICBhbmQgY2FsY3VsYXRlIGl0cyBub3JtLiAqLworICAgIG5mZXYgPSAxOworICAgIGlmICggZnVuY3Rvcih4LCBmdmVjKSA8IDApCisgICAgICAgIHJldHVybiBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6VXNlckFza2VkOworICAgIGZub3JtID0gZnZlYy5zdGFibGVOb3JtKCk7CisKKyAgICAvKiAgICAgaW5pdGlhbGl6ZSBpdGVyYXRpb24gY291bnRlciBhbmQgbW9uaXRvcnMuICovCisgICAgaXRlciA9IDE7CisgICAgbmNzdWMgPSAwOworICAgIG5jZmFpbCA9IDA7CisgICAgbnNsb3cxID0gMDsKKyAgICBuc2xvdzIgPSAwOworCisgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpSdW5uaW5nOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlN0YXR1cworSHlicmlkTm9uTGluZWFyU29sdmVyPEZ1bmN0b3JUeXBlLFNjYWxhcj46OnNvbHZlTnVtZXJpY2FsRGlmZk9uZVN0ZXAoRlZlY3RvclR5cGUgICZ4KQoreworICAgIGFzc2VydCh4LnNpemUoKT09bik7IC8vIGNoZWNrIHRoZSBjYWxsZXIgaXMgbm90IGNoZWF0aW5nIHVzCisKKyAgICBJbmRleCBqOworICAgIHN0ZDo6dmVjdG9yPEphY29iaVJvdGF0aW9uPFNjYWxhcj4gPiB2X2dpdmVucyhuKSwgd19naXZlbnMobik7CisKKyAgICBqZXZhbCA9IHRydWU7CisgICAgaWYgKHBhcmFtZXRlcnMubmJfb2Zfc3ViZGlhZ29uYWxzPDApIHBhcmFtZXRlcnMubmJfb2Zfc3ViZGlhZ29uYWxzPSBuLTE7CisgICAgaWYgKHBhcmFtZXRlcnMubmJfb2Zfc3VwZXJkaWFnb25hbHM8MCkgcGFyYW1ldGVycy5uYl9vZl9zdXBlcmRpYWdvbmFscz0gbi0xOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBqYWNvYmlhbiBtYXRyaXguICovCisgICAgaWYgKGludGVybmFsOjpmZGphYzEoZnVuY3RvciwgeCwgZnZlYywgZmphYywgcGFyYW1ldGVycy5uYl9vZl9zdWJkaWFnb25hbHMsIHBhcmFtZXRlcnMubmJfb2Zfc3VwZXJkaWFnb25hbHMsIHBhcmFtZXRlcnMuZXBzZmNuKSA8MCkKKyAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpVc2VyQXNrZWQ7CisgICAgbmZldiArPSAoc3RkOjptaW4pKHBhcmFtZXRlcnMubmJfb2Zfc3ViZGlhZ29uYWxzK3BhcmFtZXRlcnMubmJfb2Zfc3VwZXJkaWFnb25hbHMrIDEsIG4pOworCisgICAgd2EyID0gZmphYy5jb2x3aXNlKCkuYmx1ZU5vcm0oKTsKKworICAgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gYW5kIGlmIGV4dGVybmFsIHNjYWxpbmcgaXMgbm90IHVzZWQsIHNjYWxlIGFjY29yZGluZyAqLworICAgIC8qIHRvIHRoZSBub3JtcyBvZiB0aGUgY29sdW1ucyBvZiB0aGUgaW5pdGlhbCBqYWNvYmlhbi4gKi8KKyAgICBpZiAoaXRlciA9PSAxKSB7CisgICAgICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICAgICAgICBkaWFnW2pdID0gKHdhMltqXT09MC4pID8gMS4gOiB3YTJbal07CisKKyAgICAgICAgLyogb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgY2FsY3VsYXRlIHRoZSBub3JtIG9mIHRoZSBzY2FsZWQgeCAqLworICAgICAgICAvKiBhbmQgaW5pdGlhbGl6ZSB0aGUgc3RlcCBib3VuZCBkZWx0YS4gKi8KKyAgICAgICAgeG5vcm0gPSBkaWFnLmN3aXNlUHJvZHVjdCh4KS5zdGFibGVOb3JtKCk7CisgICAgICAgIGRlbHRhID0gcGFyYW1ldGVycy5mYWN0b3IgKiB4bm9ybTsKKyAgICAgICAgaWYgKGRlbHRhID09IDAuKQorICAgICAgICAgICAgZGVsdGEgPSBwYXJhbWV0ZXJzLmZhY3RvcjsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHRoZSBxciBmYWN0b3JpemF0aW9uIG9mIHRoZSBqYWNvYmlhbi4gKi8KKyAgICBIb3VzZWhvbGRlclFSPEphY29iaWFuVHlwZT4gcXJmYWMoZmphYyk7IC8vIG5vIHBpdm90aW5nOgorCisgICAgLyogY29weSB0aGUgdHJpYW5ndWxhciBmYWN0b3Igb2YgdGhlIHFyIGZhY3Rvcml6YXRpb24gaW50byByLiAqLworICAgIFIgPSBxcmZhYy5tYXRyaXhRUigpOworCisgICAgLyogYWNjdW11bGF0ZSB0aGUgb3J0aG9nb25hbCBmYWN0b3IgaW4gZmphYy4gKi8KKyAgICBmamFjID0gcXJmYWMuaG91c2Vob2xkZXJRKCk7CisKKyAgICAvKiBmb3JtIChxIHRyYW5zcG9zZSkqZnZlYyBhbmQgc3RvcmUgaW4gcXRmLiAqLworICAgIHF0ZiA9IGZqYWMudHJhbnNwb3NlKCkgKiBmdmVjOworCisgICAgLyogcmVzY2FsZSBpZiBuZWNlc3NhcnkuICovCisgICAgaWYgKCF1c2VFeHRlcm5hbFNjYWxpbmcpCisgICAgICAgIGRpYWcgPSBkaWFnLmN3aXNlTWF4KHdhMik7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAvKiBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBwLiAqLworICAgICAgICBpbnRlcm5hbDo6ZG9nbGVnPFNjYWxhcj4oUiwgZGlhZywgcXRmLCBkZWx0YSwgd2ExKTsKKworICAgICAgICAvKiBzdG9yZSB0aGUgZGlyZWN0aW9uIHAgYW5kIHggKyBwLiBjYWxjdWxhdGUgdGhlIG5vcm0gb2YgcC4gKi8KKyAgICAgICAgd2ExID0gLXdhMTsKKyAgICAgICAgd2EyID0geCArIHdhMTsKKyAgICAgICAgcG5vcm0gPSBkaWFnLmN3aXNlUHJvZHVjdCh3YTEpLnN0YWJsZU5vcm0oKTsKKworICAgICAgICAvKiBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBhZGp1c3QgdGhlIGluaXRpYWwgc3RlcCBib3VuZC4gKi8KKyAgICAgICAgaWYgKGl0ZXIgPT0gMSkKKyAgICAgICAgICAgIGRlbHRhID0gKHN0ZDo6bWluKShkZWx0YSxwbm9ybSk7CisKKyAgICAgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHggKyBwIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgICAgIGlmICggZnVuY3Rvcih3YTIsIHdhNCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpVc2VyQXNrZWQ7CisgICAgICAgICsrbmZldjsKKyAgICAgICAgZm5vcm0xID0gd2E0LnN0YWJsZU5vcm0oKTsKKworICAgICAgICAvKiBjb21wdXRlIHRoZSBzY2FsZWQgYWN0dWFsIHJlZHVjdGlvbi4gKi8KKyAgICAgICAgYWN0cmVkID0gLTEuOworICAgICAgICBpZiAoZm5vcm0xIDwgZm5vcm0pIC8qIENvbXB1dGluZyAybmQgcG93ZXIgKi8KKyAgICAgICAgICAgIGFjdHJlZCA9IDEuIC0gaW50ZXJuYWw6OmFiczIoZm5vcm0xIC8gZm5vcm0pOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHNjYWxlZCBwcmVkaWN0ZWQgcmVkdWN0aW9uLiAqLworICAgICAgICB3YTMgPSBSLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKndhMSArIHF0ZjsKKyAgICAgICAgdGVtcCA9IHdhMy5zdGFibGVOb3JtKCk7CisgICAgICAgIHByZXJlZCA9IDAuOworICAgICAgICBpZiAodGVtcCA8IGZub3JtKSAvKiBDb21wdXRpbmcgMm5kIHBvd2VyICovCisgICAgICAgICAgICBwcmVyZWQgPSAxLiAtIGludGVybmFsOjphYnMyKHRlbXAgLyBmbm9ybSk7CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgcmF0aW8gb2YgdGhlIGFjdHVhbCB0byB0aGUgcHJlZGljdGVkIHJlZHVjdGlvbi4gKi8KKyAgICAgICAgcmF0aW8gPSAwLjsKKyAgICAgICAgaWYgKHByZXJlZCA+IDAuKQorICAgICAgICAgICAgcmF0aW8gPSBhY3RyZWQgLyBwcmVyZWQ7CisKKyAgICAgICAgLyogdXBkYXRlIHRoZSBzdGVwIGJvdW5kLiAqLworICAgICAgICBpZiAocmF0aW8gPCBTY2FsYXIoLjEpKSB7CisgICAgICAgICAgICBuY3N1YyA9IDA7CisgICAgICAgICAgICArK25jZmFpbDsKKyAgICAgICAgICAgIGRlbHRhID0gU2NhbGFyKC41KSAqIGRlbHRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmNmYWlsID0gMDsKKyAgICAgICAgICAgICsrbmNzdWM7CisgICAgICAgICAgICBpZiAocmF0aW8gPj0gU2NhbGFyKC41KSB8fCBuY3N1YyA+IDEpCisgICAgICAgICAgICAgICAgZGVsdGEgPSAoc3RkOjptYXgpKGRlbHRhLCBwbm9ybSAvIFNjYWxhciguNSkpOworICAgICAgICAgICAgaWYgKGludGVybmFsOjphYnMocmF0aW8gLSAxLikgPD0gU2NhbGFyKC4xKSkgeworICAgICAgICAgICAgICAgIGRlbHRhID0gcG5vcm0gLyBTY2FsYXIoLjUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogdGVzdCBmb3Igc3VjY2Vzc2Z1bCBpdGVyYXRpb24uICovCisgICAgICAgIGlmIChyYXRpbyA+PSBTY2FsYXIoMWUtNCkpIHsKKyAgICAgICAgICAgIC8qIHN1Y2Nlc3NmdWwgaXRlcmF0aW9uLiB1cGRhdGUgeCwgZnZlYywgYW5kIHRoZWlyIG5vcm1zLiAqLworICAgICAgICAgICAgeCA9IHdhMjsKKyAgICAgICAgICAgIHdhMiA9IGRpYWcuY3dpc2VQcm9kdWN0KHgpOworICAgICAgICAgICAgZnZlYyA9IHdhNDsKKyAgICAgICAgICAgIHhub3JtID0gd2EyLnN0YWJsZU5vcm0oKTsKKyAgICAgICAgICAgIGZub3JtID0gZm5vcm0xOworICAgICAgICAgICAgKytpdGVyOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBwcm9ncmVzcyBvZiB0aGUgaXRlcmF0aW9uLiAqLworICAgICAgICArK25zbG93MTsKKyAgICAgICAgaWYgKGFjdHJlZCA+PSBTY2FsYXIoLjAwMSkpCisgICAgICAgICAgICBuc2xvdzEgPSAwOworICAgICAgICBpZiAoamV2YWwpCisgICAgICAgICAgICArK25zbG93MjsKKyAgICAgICAgaWYgKGFjdHJlZCA+PSBTY2FsYXIoLjEpKQorICAgICAgICAgICAgbnNsb3cyID0gMDsKKworICAgICAgICAvKiB0ZXN0IGZvciBjb252ZXJnZW5jZS4gKi8KKyAgICAgICAgaWYgKGRlbHRhIDw9IHBhcmFtZXRlcnMueHRvbCAqIHhub3JtIHx8IGZub3JtID09IDAuKQorICAgICAgICAgICAgcmV0dXJuIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpSZWxhdGl2ZUVycm9yVG9vU21hbGw7CisKKyAgICAgICAgLyogdGVzdHMgZm9yIHRlcm1pbmF0aW9uIGFuZCBzdHJpbmdlbnQgdG9sZXJhbmNlcy4gKi8KKyAgICAgICAgaWYgKG5mZXYgPj0gcGFyYW1ldGVycy5tYXhmZXYpCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlRvb01hbnlGdW5jdGlvbkV2YWx1YXRpb247CisgICAgICAgIGlmIChTY2FsYXIoLjEpICogKHN0ZDo6bWF4KShTY2FsYXIoLjEpICogZGVsdGEsIHBub3JtKSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICogeG5vcm0pCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlRvbFRvb1NtYWxsOworICAgICAgICBpZiAobnNsb3cyID09IDUpCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6Ok5vdE1ha2luZ1Byb2dyZXNzSmFjb2JpYW47CisgICAgICAgIGlmIChuc2xvdzEgPT0gMTApCisgICAgICAgICAgICByZXR1cm4gSHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6Ok5vdE1ha2luZ1Byb2dyZXNzSXRlcmF0aW9uczsKKworICAgICAgICAvKiBjcml0ZXJpb24gZm9yIHJlY2FsY3VsYXRpbmcgamFjb2JpYW4uICovCisgICAgICAgIGlmIChuY2ZhaWwgPT0gMikKKyAgICAgICAgICAgIGJyZWFrOyAvLyBsZWF2ZSBpbm5lciBsb29wIGFuZCBnbyBmb3IgdGhlIG5leHQgb3V0ZXIgbG9vcCBpdGVyYXRpb24KKworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHJhbmsgb25lIG1vZGlmaWNhdGlvbiB0byB0aGUgamFjb2JpYW4gKi8KKyAgICAgICAgLyogYW5kIHVwZGF0ZSBxdGYgaWYgbmVjZXNzYXJ5LiAqLworICAgICAgICB3YTEgPSBkaWFnLmN3aXNlUHJvZHVjdCggZGlhZy5jd2lzZVByb2R1Y3Qod2ExKS9wbm9ybSApOworICAgICAgICB3YTIgPSBmamFjLnRyYW5zcG9zZSgpICogd2E0OworICAgICAgICBpZiAocmF0aW8gPj0gU2NhbGFyKDFlLTQpKQorICAgICAgICAgICAgcXRmID0gd2EyOworICAgICAgICB3YTIgPSAod2EyLXdhMykvcG5vcm07CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgcXIgZmFjdG9yaXphdGlvbiBvZiB0aGUgdXBkYXRlZCBqYWNvYmlhbi4gKi8KKyAgICAgICAgaW50ZXJuYWw6OnIxdXBkdDxTY2FsYXI+KFIsIHdhMSwgdl9naXZlbnMsIHdfZ2l2ZW5zLCB3YTIsIHdhMywgJnNpbmcpOworICAgICAgICBpbnRlcm5hbDo6cjFtcHlxPFNjYWxhcj4obiwgbiwgZmphYy5kYXRhKCksIHZfZ2l2ZW5zLCB3X2dpdmVucyk7CisgICAgICAgIGludGVybmFsOjpyMW1weXE8U2NhbGFyPigxLCBuLCBxdGYuZGF0YSgpLCB2X2dpdmVucywgd19naXZlbnMpOworCisgICAgICAgIGpldmFsID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBIeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6UnVubmluZzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0h5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMKK0h5YnJpZE5vbkxpbmVhclNvbHZlcjxGdW5jdG9yVHlwZSxTY2FsYXI+Ojpzb2x2ZU51bWVyaWNhbERpZmYoRlZlY3RvclR5cGUgICZ4KQoreworICAgIEh5YnJpZE5vbkxpbmVhclNvbHZlclNwYWNlOjpTdGF0dXMgc3RhdHVzID0gc29sdmVOdW1lcmljYWxEaWZmSW5pdCh4KTsKKyAgICBpZiAoc3RhdHVzPT1IeWJyaWROb25MaW5lYXJTb2x2ZXJTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnMpCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgd2hpbGUgKHN0YXR1cz09SHlicmlkTm9uTGluZWFyU29sdmVyU3BhY2U6OlJ1bm5pbmcpCisgICAgICAgIHN0YXR1cyA9IHNvbHZlTnVtZXJpY2FsRGlmZk9uZVN0ZXAoeCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9IWUJSSUROT05MSU5FQVJTT0xWRVJfSAorCisvL3ZpbTogYWkgdHM9NCBzdHM9NCBldCBzdz00CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL0xldmVuYmVyZ01hcnF1YXJkdC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9MZXZlbmJlcmdNYXJxdWFyZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzVmYWVlCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9MZXZlbmJlcmdNYXJxdWFyZHQuaApAQCAtMCwwICsxLDY0NCBAQAorLy8gLSotIGNvZGluZzogdXRmLTgKKy8vIHZpbTogc2V0IGZpbGVlbmNvZGluZz11dGYtOAorCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9MRVZFTkJFUkdNQVJRVUFSRFRfX0gKKyNkZWZpbmUgRUlHRU5fTEVWRU5CRVJHTUFSUVVBUkRUX19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2UgeworICAgIGVudW0gU3RhdHVzIHsKKyAgICAgICAgTm90U3RhcnRlZCA9IC0yLAorICAgICAgICBSdW5uaW5nID0gLTEsCisgICAgICAgIEltcHJvcGVySW5wdXRQYXJhbWV0ZXJzID0gMCwKKyAgICAgICAgUmVsYXRpdmVSZWR1Y3Rpb25Ub29TbWFsbCA9IDEsCisgICAgICAgIFJlbGF0aXZlRXJyb3JUb29TbWFsbCA9IDIsCisgICAgICAgIFJlbGF0aXZlRXJyb3JBbmRSZWR1Y3Rpb25Ub29TbWFsbCA9IDMsCisgICAgICAgIENvc2ludXNUb29TbWFsbCA9IDQsCisgICAgICAgIFRvb01hbnlGdW5jdGlvbkV2YWx1YXRpb24gPSA1LAorICAgICAgICBGdG9sVG9vU21hbGwgPSA2LAorICAgICAgICBYdG9sVG9vU21hbGwgPSA3LAorICAgICAgICBHdG9sVG9vU21hbGwgPSA4LAorICAgICAgICBVc2VyQXNrZWQgPSA5CisgICAgfTsKK30KKworCisKKy8qKgorICAqIFxpbmdyb3VwIE5vbkxpbmVhck9wdGltaXphdGlvbl9Nb2R1bGUKKyAgKiBcYnJpZWYgUGVyZm9ybXMgbm9uIGxpbmVhciBvcHRpbWl6YXRpb24gb3ZlciBhIG5vbi1saW5lYXIgZnVuY3Rpb24sCisgICogdXNpbmcgYSB2YXJpYW50IG9mIHRoZSBMZXZlbmJlcmcgTWFycXVhcmR0IGFsZ29yaXRobS4KKyAgKgorICAqIENoZWNrIHdpa2lwZWRpYSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldmVuYmVyZyVFMiU4MCU5M01hcnF1YXJkdF9hbGdvcml0aG0KKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI9ZG91YmxlPgorY2xhc3MgTGV2ZW5iZXJnTWFycXVhcmR0Cit7CitwdWJsaWM6CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0KEZ1bmN0b3JUeXBlICZfZnVuY3RvcikKKyAgICAgICAgOiBmdW5jdG9yKF9mdW5jdG9yKSB7IG5mZXYgPSBuamV2ID0gaXRlciA9IDA7ICBmbm9ybSA9IGdub3JtID0gMC47IHVzZUV4dGVybmFsU2NhbGluZz1mYWxzZTsgfQorCisgICAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworCisgICAgc3RydWN0IFBhcmFtZXRlcnMgeworICAgICAgICBQYXJhbWV0ZXJzKCkKKyAgICAgICAgICAgIDogZmFjdG9yKFNjYWxhcigxMDAuKSkKKyAgICAgICAgICAgICwgbWF4ZmV2KDQwMCkKKyAgICAgICAgICAgICwgZnRvbChpbnRlcm5hbDo6c3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKSkKKyAgICAgICAgICAgICwgeHRvbChpbnRlcm5hbDo6c3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKSkKKyAgICAgICAgICAgICwgZ3RvbChTY2FsYXIoMC4pKQorICAgICAgICAgICAgLCBlcHNmY24oU2NhbGFyKDAuKSkge30KKyAgICAgICAgU2NhbGFyIGZhY3RvcjsKKyAgICAgICAgSW5kZXggbWF4ZmV2OyAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uIGV2YWx1YXRpb24KKyAgICAgICAgU2NhbGFyIGZ0b2w7CisgICAgICAgIFNjYWxhciB4dG9sOworICAgICAgICBTY2FsYXIgZ3RvbDsKKyAgICAgICAgU2NhbGFyIGVwc2ZjbjsKKyAgICB9OworCisgICAgdHlwZWRlZiBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+IEZWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMgPiBKYWNvYmlhblR5cGU7CisKKyAgICBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIGxtZGVyMSgKKyAgICAgICAgICAgIEZWZWN0b3JUeXBlICZ4LAorICAgICAgICAgICAgY29uc3QgU2NhbGFyIHRvbCA9IGludGVybmFsOjpzcXJ0KE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpCisgICAgICAgICAgICApOworCisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBtaW5pbWl6ZShGVmVjdG9yVHlwZSAmeCk7CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBtaW5pbWl6ZUluaXQoRlZlY3RvclR5cGUgJngpOworICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgbWluaW1pemVPbmVTdGVwKEZWZWN0b3JUeXBlICZ4KTsKKworICAgIHN0YXRpYyBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIGxtZGlmMSgKKyAgICAgICAgICAgIEZ1bmN0b3JUeXBlICZmdW5jdG9yLAorICAgICAgICAgICAgRlZlY3RvclR5cGUgJngsCisgICAgICAgICAgICBJbmRleCAqbmZldiwKKyAgICAgICAgICAgIGNvbnN0IFNjYWxhciB0b2wgPSBpbnRlcm5hbDo6c3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgKTsKKworICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgbG1zdHIxKAorICAgICAgICAgICAgRlZlY3RvclR5cGUgICZ4LAorICAgICAgICAgICAgY29uc3QgU2NhbGFyIHRvbCA9IGludGVybmFsOjpzcXJ0KE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpCisgICAgICAgICAgICApOworCisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBtaW5pbWl6ZU9wdGltdW1TdG9yYWdlKEZWZWN0b3JUeXBlICAmeCk7CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBtaW5pbWl6ZU9wdGltdW1TdG9yYWdlSW5pdChGVmVjdG9yVHlwZSAgJngpOworICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgbWluaW1pemVPcHRpbXVtU3RvcmFnZU9uZVN0ZXAoRlZlY3RvclR5cGUgICZ4KTsKKworICAgIHZvaWQgcmVzZXRQYXJhbWV0ZXJzKHZvaWQpIHsgcGFyYW1ldGVycyA9IFBhcmFtZXRlcnMoKTsgfQorCisgICAgUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICAgIEZWZWN0b3JUeXBlICBmdmVjLCBxdGYsIGRpYWc7CisgICAgSmFjb2JpYW5UeXBlIGZqYWM7CisgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYyxEeW5hbWljPiBwZXJtdXRhdGlvbjsKKyAgICBJbmRleCBuZmV2OworICAgIEluZGV4IG5qZXY7CisgICAgSW5kZXggaXRlcjsKKyAgICBTY2FsYXIgZm5vcm0sIGdub3JtOworICAgIGJvb2wgdXNlRXh0ZXJuYWxTY2FsaW5nOyAKKworICAgIFNjYWxhciBsbV9wYXJhbSh2b2lkKSB7IHJldHVybiBwYXI7IH0KK3ByaXZhdGU6CisgICAgRnVuY3RvclR5cGUgJmZ1bmN0b3I7CisgICAgSW5kZXggbjsKKyAgICBJbmRleCBtOworICAgIEZWZWN0b3JUeXBlIHdhMSwgd2EyLCB3YTMsIHdhNDsKKworICAgIFNjYWxhciBwYXIsIHN1bTsKKyAgICBTY2FsYXIgdGVtcCwgdGVtcDEsIHRlbXAyOworICAgIFNjYWxhciBkZWx0YTsKKyAgICBTY2FsYXIgcmF0aW87CisgICAgU2NhbGFyIHBub3JtLCB4bm9ybSwgZm5vcm0xLCBhY3RyZWQsIGRpcmRlciwgcHJlcmVkOworCisgICAgTGV2ZW5iZXJnTWFycXVhcmR0JiBvcGVyYXRvcj0oY29uc3QgTGV2ZW5iZXJnTWFycXVhcmR0Jik7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cworTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlLFNjYWxhcj46OmxtZGVyMSgKKyAgICAgICAgRlZlY3RvclR5cGUgICZ4LAorICAgICAgICBjb25zdCBTY2FsYXIgdG9sCisgICAgICAgICkKK3sKKyAgICBuID0geC5zaXplKCk7CisgICAgbSA9IGZ1bmN0b3IudmFsdWVzKCk7CisKKyAgICAvKiBjaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycyBmb3IgZXJyb3JzLiAqLworICAgIGlmIChuIDw9IDAgfHwgbSA8IG4gfHwgdG9sIDwgMC4pCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICByZXNldFBhcmFtZXRlcnMoKTsKKyAgICBwYXJhbWV0ZXJzLmZ0b2wgPSB0b2w7CisgICAgcGFyYW1ldGVycy54dG9sID0gdG9sOworICAgIHBhcmFtZXRlcnMubWF4ZmV2ID0gMTAwKihuKzEpOworCisgICAgcmV0dXJuIG1pbmltaXplKHgpOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzCitMZXZlbmJlcmdNYXJxdWFyZHQ8RnVuY3RvclR5cGUsU2NhbGFyPjo6bWluaW1pemUoRlZlY3RvclR5cGUgICZ4KQoreworICAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgc3RhdHVzID0gbWluaW1pemVJbml0KHgpOworICAgIGlmIChzdGF0dXM9PUxldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVycykKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBkbyB7CisgICAgICAgIHN0YXR1cyA9IG1pbmltaXplT25lU3RlcCh4KTsKKyAgICB9IHdoaWxlIChzdGF0dXM9PUxldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSdW5uaW5nKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cworTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlLFNjYWxhcj46Om1pbmltaXplSW5pdChGVmVjdG9yVHlwZSAgJngpCit7CisgICAgbiA9IHguc2l6ZSgpOworICAgIG0gPSBmdW5jdG9yLnZhbHVlcygpOworCisgICAgd2ExLnJlc2l6ZShuKTsgd2EyLnJlc2l6ZShuKTsgd2EzLnJlc2l6ZShuKTsKKyAgICB3YTQucmVzaXplKG0pOworICAgIGZ2ZWMucmVzaXplKG0pOworICAgIGZqYWMucmVzaXplKG0sIG4pOworICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBkaWFnLnJlc2l6ZShuKTsKKyAgICBhc3NlcnQoICghdXNlRXh0ZXJuYWxTY2FsaW5nIHx8IGRpYWcuc2l6ZSgpPT1uKSB8fCAiV2hlbiB1c2VFeHRlcm5hbFNjYWxpbmcgaXMgc2V0LCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkICdkaWFnJyIpOworICAgIHF0Zi5yZXNpemUobik7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgbmZldiA9IDA7CisgICAgbmpldiA9IDA7CisKKyAgICAvKiAgICAgY2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIGVycm9ycy4gKi8KKyAgICBpZiAobiA8PSAwIHx8IG0gPCBuIHx8IHBhcmFtZXRlcnMuZnRvbCA8IDAuIHx8IHBhcmFtZXRlcnMueHRvbCA8IDAuIHx8IHBhcmFtZXRlcnMuZ3RvbCA8IDAuIHx8IHBhcmFtZXRlcnMubWF4ZmV2IDw9IDAgfHwgcGFyYW1ldGVycy5mYWN0b3IgPD0gMC4pCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICBpZiAodXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgaWYgKGRpYWdbal0gPD0gMC4pCisgICAgICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIC8qICAgICBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgdGhlIHN0YXJ0aW5nIHBvaW50ICovCisgICAgLyogICAgIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgbmZldiA9IDE7CisgICAgaWYgKCBmdW5jdG9yKHgsIGZ2ZWMpIDwgMCkKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpVc2VyQXNrZWQ7CisgICAgZm5vcm0gPSBmdmVjLnN0YWJsZU5vcm0oKTsKKworICAgIC8qICAgICBpbml0aWFsaXplIGxldmVuYmVyZy1tYXJxdWFyZHQgcGFyYW1ldGVyIGFuZCBpdGVyYXRpb24gY291bnRlci4gKi8KKyAgICBwYXIgPSAwLjsKKyAgICBpdGVyID0gMTsKKworICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6Tm90U3RhcnRlZDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0xldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMKK0xldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZSxTY2FsYXI+OjptaW5pbWl6ZU9uZVN0ZXAoRlZlY3RvclR5cGUgICZ4KQoreworICAgIGFzc2VydCh4LnNpemUoKT09bik7IC8vIGNoZWNrIHRoZSBjYWxsZXIgaXMgbm90IGNoZWF0aW5nIHVzCisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGphY29iaWFuIG1hdHJpeC4gKi8KKyAgICBJbmRleCBkZl9yZXQgPSBmdW5jdG9yLmRmKHgsIGZqYWMpOworICAgIGlmIChkZl9yZXQ8MCkKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpVc2VyQXNrZWQ7CisgICAgaWYgKGRmX3JldD4wKQorICAgICAgICAvLyBudW1lcmljYWwgZGlmZiwgd2UgZXZhbHVhdGVkIHRoZSBmdW5jdGlvbiBkZl9yZXQgdGltZXMKKyAgICAgICAgbmZldiArPSBkZl9yZXQ7CisgICAgZWxzZSBuamV2Kys7CisKKyAgICAvKiBjb21wdXRlIHRoZSBxciBmYWN0b3JpemF0aW9uIG9mIHRoZSBqYWNvYmlhbi4gKi8KKyAgICB3YTIgPSBmamFjLmNvbHdpc2UoKS5ibHVlTm9ybSgpOworICAgIENvbFBpdkhvdXNlaG9sZGVyUVI8SmFjb2JpYW5UeXBlPiBxcmZhYyhmamFjKTsKKyAgICBmamFjID0gcXJmYWMubWF0cml4UVIoKTsKKyAgICBwZXJtdXRhdGlvbiA9IHFyZmFjLmNvbHNQZXJtdXRhdGlvbigpOworCisgICAgLyogb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiBhbmQgaWYgZXh0ZXJuYWwgc2NhbGluZyBpcyBub3QgdXNlZCwgc2NhbGUgYWNjb3JkaW5nICovCisgICAgLyogdG8gdGhlIG5vcm1zIG9mIHRoZSBjb2x1bW5zIG9mIHRoZSBpbml0aWFsIGphY29iaWFuLiAqLworICAgIGlmIChpdGVyID09IDEpIHsKKyAgICAgICAgaWYgKCF1c2VFeHRlcm5hbFNjYWxpbmcpCisgICAgICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgICAgIGRpYWdbal0gPSAod2EyW2pdPT0wLik/IDEuIDogd2EyW2pdOworCisgICAgICAgIC8qIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24sIGNhbGN1bGF0ZSB0aGUgbm9ybSBvZiB0aGUgc2NhbGVkIHggKi8KKyAgICAgICAgLyogYW5kIGluaXRpYWxpemUgdGhlIHN0ZXAgYm91bmQgZGVsdGEuICovCisgICAgICAgIHhub3JtID0gZGlhZy5jd2lzZVByb2R1Y3QoeCkuc3RhYmxlTm9ybSgpOworICAgICAgICBkZWx0YSA9IHBhcmFtZXRlcnMuZmFjdG9yICogeG5vcm07CisgICAgICAgIGlmIChkZWx0YSA9PSAwLikKKyAgICAgICAgICAgIGRlbHRhID0gcGFyYW1ldGVycy5mYWN0b3I7CisgICAgfQorCisgICAgLyogZm9ybSAocSB0cmFuc3Bvc2UpKmZ2ZWMgYW5kIHN0b3JlIHRoZSBmaXJzdCBuIGNvbXBvbmVudHMgaW4gKi8KKyAgICAvKiBxdGYuICovCisgICAgd2E0ID0gZnZlYzsKKyAgICB3YTQuYXBwbHlPblRoZUxlZnQocXJmYWMuaG91c2Vob2xkZXJRKCkuYWRqb2ludCgpKTsKKyAgICBxdGYgPSB3YTQuaGVhZChuKTsKKworICAgIC8qIGNvbXB1dGUgdGhlIG5vcm0gb2YgdGhlIHNjYWxlZCBncmFkaWVudC4gKi8KKyAgICBnbm9ybSA9IDAuOworICAgIGlmIChmbm9ybSAhPSAwLikKKyAgICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG47ICsraikKKyAgICAgICAgICAgIGlmICh3YTJbcGVybXV0YXRpb24uaW5kaWNlcygpW2pdXSAhPSAwLikKKyAgICAgICAgICAgICAgICBnbm9ybSA9IChzdGQ6Om1heCkoZ25vcm0sIGludGVybmFsOjphYnMoIGZqYWMuY29sKGopLmhlYWQoaisxKS5kb3QocXRmLmhlYWQoaisxKS9mbm9ybSkgLyB3YTJbcGVybXV0YXRpb24uaW5kaWNlcygpW2pdXSkpOworCisgICAgLyogdGVzdCBmb3IgY29udmVyZ2VuY2Ugb2YgdGhlIGdyYWRpZW50IG5vcm0uICovCisgICAgaWYgKGdub3JtIDw9IHBhcmFtZXRlcnMuZ3RvbCkKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpDb3NpbnVzVG9vU21hbGw7CisKKyAgICAvKiByZXNjYWxlIGlmIG5lY2Vzc2FyeS4gKi8KKyAgICBpZiAoIXVzZUV4dGVybmFsU2NhbGluZykKKyAgICAgICAgZGlhZyA9IGRpYWcuY3dpc2VNYXgod2EyKTsKKworICAgIGRvIHsKKworICAgICAgICAvKiBkZXRlcm1pbmUgdGhlIGxldmVuYmVyZy1tYXJxdWFyZHQgcGFyYW1ldGVyLiAqLworICAgICAgICBpbnRlcm5hbDo6bG1wYXIyPFNjYWxhcj4ocXJmYWMsIGRpYWcsIHF0ZiwgZGVsdGEsIHBhciwgd2ExKTsKKworICAgICAgICAvKiBzdG9yZSB0aGUgZGlyZWN0aW9uIHAgYW5kIHggKyBwLiBjYWxjdWxhdGUgdGhlIG5vcm0gb2YgcC4gKi8KKyAgICAgICAgd2ExID0gLXdhMTsKKyAgICAgICAgd2EyID0geCArIHdhMTsKKyAgICAgICAgcG5vcm0gPSBkaWFnLmN3aXNlUHJvZHVjdCh3YTEpLnN0YWJsZU5vcm0oKTsKKworICAgICAgICAvKiBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBhZGp1c3QgdGhlIGluaXRpYWwgc3RlcCBib3VuZC4gKi8KKyAgICAgICAgaWYgKGl0ZXIgPT0gMSkKKyAgICAgICAgICAgIGRlbHRhID0gKHN0ZDo6bWluKShkZWx0YSxwbm9ybSk7CisKKyAgICAgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHggKyBwIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgICAgIGlmICggZnVuY3Rvcih3YTIsIHdhNCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpVc2VyQXNrZWQ7CisgICAgICAgICsrbmZldjsKKyAgICAgICAgZm5vcm0xID0gd2E0LnN0YWJsZU5vcm0oKTsKKworICAgICAgICAvKiBjb21wdXRlIHRoZSBzY2FsZWQgYWN0dWFsIHJlZHVjdGlvbi4gKi8KKyAgICAgICAgYWN0cmVkID0gLTEuOworICAgICAgICBpZiAoU2NhbGFyKC4xKSAqIGZub3JtMSA8IGZub3JtKQorICAgICAgICAgICAgYWN0cmVkID0gMS4gLSBpbnRlcm5hbDo6YWJzMihmbm9ybTEgLyBmbm9ybSk7CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgc2NhbGVkIHByZWRpY3RlZCByZWR1Y3Rpb24gYW5kICovCisgICAgICAgIC8qIHRoZSBzY2FsZWQgZGlyZWN0aW9uYWwgZGVyaXZhdGl2ZS4gKi8KKyAgICAgICAgd2EzID0gZmphYy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIChxcmZhYy5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkgKndhMSk7CisgICAgICAgIHRlbXAxID0gaW50ZXJuYWw6OmFiczIod2EzLnN0YWJsZU5vcm0oKSAvIGZub3JtKTsKKyAgICAgICAgdGVtcDIgPSBpbnRlcm5hbDo6YWJzMihpbnRlcm5hbDo6c3FydChwYXIpICogcG5vcm0gLyBmbm9ybSk7CisgICAgICAgIHByZXJlZCA9IHRlbXAxICsgdGVtcDIgLyBTY2FsYXIoLjUpOworICAgICAgICBkaXJkZXIgPSAtKHRlbXAxICsgdGVtcDIpOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHJhdGlvIG9mIHRoZSBhY3R1YWwgdG8gdGhlIHByZWRpY3RlZCAqLworICAgICAgICAvKiByZWR1Y3Rpb24uICovCisgICAgICAgIHJhdGlvID0gMC47CisgICAgICAgIGlmIChwcmVyZWQgIT0gMC4pCisgICAgICAgICAgICByYXRpbyA9IGFjdHJlZCAvIHByZXJlZDsKKworICAgICAgICAvKiB1cGRhdGUgdGhlIHN0ZXAgYm91bmQuICovCisgICAgICAgIGlmIChyYXRpbyA8PSBTY2FsYXIoLjI1KSkgeworICAgICAgICAgICAgaWYgKGFjdHJlZCA+PSAwLikKKyAgICAgICAgICAgICAgICB0ZW1wID0gU2NhbGFyKC41KTsKKyAgICAgICAgICAgIGlmIChhY3RyZWQgPCAwLikKKyAgICAgICAgICAgICAgICB0ZW1wID0gU2NhbGFyKC41KSAqIGRpcmRlciAvIChkaXJkZXIgKyBTY2FsYXIoLjUpICogYWN0cmVkKTsKKyAgICAgICAgICAgIGlmIChTY2FsYXIoLjEpICogZm5vcm0xID49IGZub3JtIHx8IHRlbXAgPCBTY2FsYXIoLjEpKQorICAgICAgICAgICAgICAgIHRlbXAgPSBTY2FsYXIoLjEpOworICAgICAgICAgICAgLyogQ29tcHV0aW5nIE1JTiAqLworICAgICAgICAgICAgZGVsdGEgPSB0ZW1wICogKHN0ZDo6bWluKShkZWx0YSwgcG5vcm0gLyBTY2FsYXIoLjEpKTsKKyAgICAgICAgICAgIHBhciAvPSB0ZW1wOworICAgICAgICB9IGVsc2UgaWYgKCEocGFyICE9IDAuICYmIHJhdGlvIDwgU2NhbGFyKC43NSkpKSB7CisgICAgICAgICAgICBkZWx0YSA9IHBub3JtIC8gU2NhbGFyKC41KTsKKyAgICAgICAgICAgIHBhciA9IFNjYWxhciguNSkgKiBwYXI7CisgICAgICAgIH0KKworICAgICAgICAvKiB0ZXN0IGZvciBzdWNjZXNzZnVsIGl0ZXJhdGlvbi4gKi8KKyAgICAgICAgaWYgKHJhdGlvID49IFNjYWxhcigxZS00KSkgeworICAgICAgICAgICAgLyogc3VjY2Vzc2Z1bCBpdGVyYXRpb24uIHVwZGF0ZSB4LCBmdmVjLCBhbmQgdGhlaXIgbm9ybXMuICovCisgICAgICAgICAgICB4ID0gd2EyOworICAgICAgICAgICAgd2EyID0gZGlhZy5jd2lzZVByb2R1Y3QoeCk7CisgICAgICAgICAgICBmdmVjID0gd2E0OworICAgICAgICAgICAgeG5vcm0gPSB3YTIuc3RhYmxlTm9ybSgpOworICAgICAgICAgICAgZm5vcm0gPSBmbm9ybTE7CisgICAgICAgICAgICArK2l0ZXI7CisgICAgICAgIH0KKworICAgICAgICAvKiB0ZXN0cyBmb3IgY29udmVyZ2VuY2UuICovCisgICAgICAgIGlmIChpbnRlcm5hbDo6YWJzKGFjdHJlZCkgPD0gcGFyYW1ldGVycy5mdG9sICYmIHByZXJlZCA8PSBwYXJhbWV0ZXJzLmZ0b2wgJiYgU2NhbGFyKC41KSAqIHJhdGlvIDw9IDEuICYmIGRlbHRhIDw9IHBhcmFtZXRlcnMueHRvbCAqIHhub3JtKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZUVycm9yQW5kUmVkdWN0aW9uVG9vU21hbGw7CisgICAgICAgIGlmIChpbnRlcm5hbDo6YWJzKGFjdHJlZCkgPD0gcGFyYW1ldGVycy5mdG9sICYmIHByZXJlZCA8PSBwYXJhbWV0ZXJzLmZ0b2wgJiYgU2NhbGFyKC41KSAqIHJhdGlvIDw9IDEuKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZVJlZHVjdGlvblRvb1NtYWxsOworICAgICAgICBpZiAoZGVsdGEgPD0gcGFyYW1ldGVycy54dG9sICogeG5vcm0pCisgICAgICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlRXJyb3JUb29TbWFsbDsKKworICAgICAgICAvKiB0ZXN0cyBmb3IgdGVybWluYXRpb24gYW5kIHN0cmluZ2VudCB0b2xlcmFuY2VzLiAqLworICAgICAgICBpZiAobmZldiA+PSBwYXJhbWV0ZXJzLm1heGZldikKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6VG9vTWFueUZ1bmN0aW9uRXZhbHVhdGlvbjsKKyAgICAgICAgaWYgKGludGVybmFsOjphYnMoYWN0cmVkKSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICYmIHByZXJlZCA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICYmIFNjYWxhciguNSkgKiByYXRpbyA8PSAxLikKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6RnRvbFRvb1NtYWxsOworICAgICAgICBpZiAoZGVsdGEgPD0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAqIHhub3JtKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpYdG9sVG9vU21hbGw7CisgICAgICAgIGlmIChnbm9ybSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpHdG9sVG9vU21hbGw7CisKKyAgICB9IHdoaWxlIChyYXRpbyA8IFNjYWxhcigxZS00KSk7CisKKyAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJ1bm5pbmc7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzCitMZXZlbmJlcmdNYXJxdWFyZHQ8RnVuY3RvclR5cGUsU2NhbGFyPjo6bG1zdHIxKAorICAgICAgICBGVmVjdG9yVHlwZSAgJngsCisgICAgICAgIGNvbnN0IFNjYWxhciB0b2wKKyAgICAgICAgKQoreworICAgIG4gPSB4LnNpemUoKTsKKyAgICBtID0gZnVuY3Rvci52YWx1ZXMoKTsKKworICAgIC8qIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCBtIDwgbiB8fCB0b2wgPCAwLikKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIHJlc2V0UGFyYW1ldGVycygpOworICAgIHBhcmFtZXRlcnMuZnRvbCA9IHRvbDsKKyAgICBwYXJhbWV0ZXJzLnh0b2wgPSB0b2w7CisgICAgcGFyYW1ldGVycy5tYXhmZXYgPSAxMDAqKG4rMSk7CisKKyAgICByZXR1cm4gbWluaW1pemVPcHRpbXVtU3RvcmFnZSh4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0xldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMKK0xldmVuYmVyZ01hcnF1YXJkdDxGdW5jdG9yVHlwZSxTY2FsYXI+OjptaW5pbWl6ZU9wdGltdW1TdG9yYWdlSW5pdChGVmVjdG9yVHlwZSAgJngpCit7CisgICAgbiA9IHguc2l6ZSgpOworICAgIG0gPSBmdW5jdG9yLnZhbHVlcygpOworCisgICAgd2ExLnJlc2l6ZShuKTsgd2EyLnJlc2l6ZShuKTsgd2EzLnJlc2l6ZShuKTsKKyAgICB3YTQucmVzaXplKG0pOworICAgIGZ2ZWMucmVzaXplKG0pOworICAgIC8vIE9ubHkgUiBpcyBzdG9yZWQgaW4gZmphYy4gUSBpcyBvbmx5IHVzZWQgdG8gY29tcHV0ZSAncXRmJywgd2hpY2ggaXMKKyAgICAvLyBRLnRyYW5zcG9zZSgpKnJocy4gcXRmIHdpbGwgYmUgdXBkYXRlZCB1c2luZyBnaXZlbnMgcm90YXRpb24sCisgICAgLy8gaW5zdGVhZCBvZiBzdG9yaW5nIHRoZW0gaW4gUS4KKyAgICAvLyBUaGUgcHVycG9zZSBpdCB0byBvbmx5IHVzZSBhIG54biBtYXRyaXgsIGluc3RlYWQgb2YgbXhuIGhlcmUsIHNvCisgICAgLy8gdGhhdCB3ZSBjYW4gaGFuZGxlIGNhc2VzIHdoZXJlIG0+Pm4gOgorICAgIGZqYWMucmVzaXplKG4sIG4pOworICAgIGlmICghdXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBkaWFnLnJlc2l6ZShuKTsKKyAgICBhc3NlcnQoICghdXNlRXh0ZXJuYWxTY2FsaW5nIHx8IGRpYWcuc2l6ZSgpPT1uKSB8fCAiV2hlbiB1c2VFeHRlcm5hbFNjYWxpbmcgaXMgc2V0LCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkICdkaWFnJyIpOworICAgIHF0Zi5yZXNpemUobik7CisKKyAgICAvKiBGdW5jdGlvbiBCb2R5ICovCisgICAgbmZldiA9IDA7CisgICAgbmpldiA9IDA7CisKKyAgICAvKiAgICAgY2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIGVycm9ycy4gKi8KKyAgICBpZiAobiA8PSAwIHx8IG0gPCBuIHx8IHBhcmFtZXRlcnMuZnRvbCA8IDAuIHx8IHBhcmFtZXRlcnMueHRvbCA8IDAuIHx8IHBhcmFtZXRlcnMuZ3RvbCA8IDAuIHx8IHBhcmFtZXRlcnMubWF4ZmV2IDw9IDAgfHwgcGFyYW1ldGVycy5mYWN0b3IgPD0gMC4pCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnM7CisKKyAgICBpZiAodXNlRXh0ZXJuYWxTY2FsaW5nKQorICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICAgICAgaWYgKGRpYWdbal0gPD0gMC4pCisgICAgICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIC8qICAgICBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgdGhlIHN0YXJ0aW5nIHBvaW50ICovCisgICAgLyogICAgIGFuZCBjYWxjdWxhdGUgaXRzIG5vcm0uICovCisgICAgbmZldiA9IDE7CisgICAgaWYgKCBmdW5jdG9yKHgsIGZ2ZWMpIDwgMCkKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpVc2VyQXNrZWQ7CisgICAgZm5vcm0gPSBmdmVjLnN0YWJsZU5vcm0oKTsKKworICAgIC8qICAgICBpbml0aWFsaXplIGxldmVuYmVyZy1tYXJxdWFyZHQgcGFyYW1ldGVyIGFuZCBpdGVyYXRpb24gY291bnRlci4gKi8KKyAgICBwYXIgPSAwLjsKKyAgICBpdGVyID0gMTsKKworICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6Tm90U3RhcnRlZDsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cworTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlLFNjYWxhcj46Om1pbmltaXplT3B0aW11bVN0b3JhZ2VPbmVTdGVwKEZWZWN0b3JUeXBlICAmeCkKK3sKKyAgICBhc3NlcnQoeC5zaXplKCk9PW4pOyAvLyBjaGVjayB0aGUgY2FsbGVyIGlzIG5vdCBjaGVhdGluZyB1cworCisgICAgSW5kZXggaSwgajsKKyAgICBib29sIHNpbmc7CisKKyAgICAvKiBjb21wdXRlIHRoZSBxciBmYWN0b3JpemF0aW9uIG9mIHRoZSBqYWNvYmlhbiBtYXRyaXggKi8KKyAgICAvKiBjYWxjdWxhdGVkIG9uZSByb3cgYXQgYSB0aW1lLCB3aGlsZSBzaW11bHRhbmVvdXNseSAqLworICAgIC8qIGZvcm1pbmcgKHEgdHJhbnNwb3NlKSpmdmVjIGFuZCBzdG9yaW5nIHRoZSBmaXJzdCAqLworICAgIC8qIG4gY29tcG9uZW50cyBpbiBxdGYuICovCisgICAgcXRmLmZpbGwoMC4pOworICAgIGZqYWMuZmlsbCgwLik7CisgICAgSW5kZXggcm93bmIgPSAyOworICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKKyAgICAgICAgaWYgKGZ1bmN0b3IuZGYoeCwgd2EzLCByb3duYikgPCAwKSByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlVzZXJBc2tlZDsKKyAgICAgICAgaW50ZXJuYWw6OnJ3dXBkdDxTY2FsYXI+KGZqYWMsIHdhMywgcXRmLCBmdmVjW2ldKTsKKyAgICAgICAgKytyb3duYjsKKyAgICB9CisgICAgKytuamV2OworCisgICAgLyogaWYgdGhlIGphY29iaWFuIGlzIHJhbmsgZGVmaWNpZW50LCBjYWxsIHFyZmFjIHRvICovCisgICAgLyogcmVvcmRlciBpdHMgY29sdW1ucyBhbmQgdXBkYXRlIHRoZSBjb21wb25lbnRzIG9mIHF0Zi4gKi8KKyAgICBzaW5nID0gZmFsc2U7CisgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICBpZiAoZmphYyhqLGopID09IDAuKQorICAgICAgICAgICAgc2luZyA9IHRydWU7CisgICAgICAgIHdhMltqXSA9IGZqYWMuY29sKGopLmhlYWQoaikuc3RhYmxlTm9ybSgpOworICAgIH0KKyAgICBwZXJtdXRhdGlvbi5zZXRJZGVudGl0eShuKTsKKyAgICBpZiAoc2luZykgeworICAgICAgICB3YTIgPSBmamFjLmNvbHdpc2UoKS5ibHVlTm9ybSgpOworICAgICAgICAvLyBUT0RPIFdlIGhhdmUgbm8gdW5pdCB0ZXN0IGNvdmVyaW5nIHRoaXMgY29kZSBwYXRoLCBkbyBub3QgbW9kaWZ5CisgICAgICAgIC8vIHVudGlsIGl0IGlzIGNhcmVmdWxseSB0ZXN0ZWQKKyAgICAgICAgQ29sUGl2SG91c2Vob2xkZXJRUjxKYWNvYmlhblR5cGU+IHFyZmFjKGZqYWMpOworICAgICAgICBmamFjID0gcXJmYWMubWF0cml4UVIoKTsKKyAgICAgICAgd2ExID0gZmphYy5kaWFnb25hbCgpOworICAgICAgICBmamFjLmRpYWdvbmFsKCkgPSBxcmZhYy5oQ29lZmZzKCk7CisgICAgICAgIHBlcm11dGF0aW9uID0gcXJmYWMuY29sc1Blcm11dGF0aW9uKCk7CisgICAgICAgIC8vIFRPRE8gOiBhdm9pZCB0aGlzOgorICAgICAgICBmb3IoSW5kZXggaWk9MDsgaWk8IGZqYWMuY29scygpOyBpaSsrKSBmamFjLmNvbChpaSkuc2VnbWVudChpaSsxLCBmamFjLnJvd3MoKS1paS0xKSAqPSBmamFjKGlpLGlpKTsgLy8gcmVzY2FsZSB2ZWN0b3JzCisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgICAgaWYgKGZqYWMoaixqKSAhPSAwLikgeworICAgICAgICAgICAgICAgIHN1bSA9IDAuOworICAgICAgICAgICAgICAgIGZvciAoaSA9IGo7IGkgPCBuOyArK2kpCisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBmamFjKGksaikgKiBxdGZbaV07CisgICAgICAgICAgICAgICAgdGVtcCA9IC1zdW0gLyBmamFjKGosaik7CisgICAgICAgICAgICAgICAgZm9yIChpID0gajsgaSA8IG47ICsraSkKKyAgICAgICAgICAgICAgICAgICAgcXRmW2ldICs9IGZqYWMoaSxqKSAqIHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmamFjKGosaikgPSB3YTFbal07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uIGFuZCBpZiBleHRlcm5hbCBzY2FsaW5nIGlzIG5vdCB1c2VkLCBzY2FsZSBhY2NvcmRpbmcgKi8KKyAgICAvKiB0byB0aGUgbm9ybXMgb2YgdGhlIGNvbHVtbnMgb2YgdGhlIGluaXRpYWwgamFjb2JpYW4uICovCisgICAgaWYgKGl0ZXIgPT0gMSkgeworICAgICAgICBpZiAoIXVzZUV4dGVybmFsU2NhbGluZykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opCisgICAgICAgICAgICAgICAgZGlhZ1tqXSA9ICh3YTJbal09PTAuKT8gMS4gOiB3YTJbal07CisKKyAgICAgICAgLyogb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgY2FsY3VsYXRlIHRoZSBub3JtIG9mIHRoZSBzY2FsZWQgeCAqLworICAgICAgICAvKiBhbmQgaW5pdGlhbGl6ZSB0aGUgc3RlcCBib3VuZCBkZWx0YS4gKi8KKyAgICAgICAgeG5vcm0gPSBkaWFnLmN3aXNlUHJvZHVjdCh4KS5zdGFibGVOb3JtKCk7CisgICAgICAgIGRlbHRhID0gcGFyYW1ldGVycy5mYWN0b3IgKiB4bm9ybTsKKyAgICAgICAgaWYgKGRlbHRhID09IDAuKQorICAgICAgICAgICAgZGVsdGEgPSBwYXJhbWV0ZXJzLmZhY3RvcjsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHRoZSBub3JtIG9mIHRoZSBzY2FsZWQgZ3JhZGllbnQuICovCisgICAgZ25vcm0gPSAwLjsKKyAgICBpZiAoZm5vcm0gIT0gMC4pCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opCisgICAgICAgICAgICBpZiAod2EyW3Blcm11dGF0aW9uLmluZGljZXMoKVtqXV0gIT0gMC4pCisgICAgICAgICAgICAgICAgZ25vcm0gPSAoc3RkOjptYXgpKGdub3JtLCBpbnRlcm5hbDo6YWJzKCBmamFjLmNvbChqKS5oZWFkKGorMSkuZG90KHF0Zi5oZWFkKGorMSkvZm5vcm0pIC8gd2EyW3Blcm11dGF0aW9uLmluZGljZXMoKVtqXV0pKTsKKworICAgIC8qIHRlc3QgZm9yIGNvbnZlcmdlbmNlIG9mIHRoZSBncmFkaWVudCBub3JtLiAqLworICAgIGlmIChnbm9ybSA8PSBwYXJhbWV0ZXJzLmd0b2wpCisgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6Q29zaW51c1Rvb1NtYWxsOworCisgICAgLyogcmVzY2FsZSBpZiBuZWNlc3NhcnkuICovCisgICAgaWYgKCF1c2VFeHRlcm5hbFNjYWxpbmcpCisgICAgICAgIGRpYWcgPSBkaWFnLmN3aXNlTWF4KHdhMik7CisKKyAgICBkbyB7CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBsZXZlbmJlcmctbWFycXVhcmR0IHBhcmFtZXRlci4gKi8KKyAgICAgICAgaW50ZXJuYWw6OmxtcGFyPFNjYWxhcj4oZmphYywgcGVybXV0YXRpb24uaW5kaWNlcygpLCBkaWFnLCBxdGYsIGRlbHRhLCBwYXIsIHdhMSk7CisKKyAgICAgICAgLyogc3RvcmUgdGhlIGRpcmVjdGlvbiBwIGFuZCB4ICsgcC4gY2FsY3VsYXRlIHRoZSBub3JtIG9mIHAuICovCisgICAgICAgIHdhMSA9IC13YTE7CisgICAgICAgIHdhMiA9IHggKyB3YTE7CisgICAgICAgIHBub3JtID0gZGlhZy5jd2lzZVByb2R1Y3Qod2ExKS5zdGFibGVOb3JtKCk7CisKKyAgICAgICAgLyogb24gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgYWRqdXN0IHRoZSBpbml0aWFsIHN0ZXAgYm91bmQuICovCisgICAgICAgIGlmIChpdGVyID09IDEpCisgICAgICAgICAgICBkZWx0YSA9IChzdGQ6Om1pbikoZGVsdGEscG5vcm0pOworCisgICAgICAgIC8qIGV2YWx1YXRlIHRoZSBmdW5jdGlvbiBhdCB4ICsgcCBhbmQgY2FsY3VsYXRlIGl0cyBub3JtLiAqLworICAgICAgICBpZiAoIGZ1bmN0b3Iod2EyLCB3YTQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6VXNlckFza2VkOworICAgICAgICArK25mZXY7CisgICAgICAgIGZub3JtMSA9IHdhNC5zdGFibGVOb3JtKCk7CisKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgc2NhbGVkIGFjdHVhbCByZWR1Y3Rpb24uICovCisgICAgICAgIGFjdHJlZCA9IC0xLjsKKyAgICAgICAgaWYgKFNjYWxhciguMSkgKiBmbm9ybTEgPCBmbm9ybSkKKyAgICAgICAgICAgIGFjdHJlZCA9IDEuIC0gaW50ZXJuYWw6OmFiczIoZm5vcm0xIC8gZm5vcm0pOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHNjYWxlZCBwcmVkaWN0ZWQgcmVkdWN0aW9uIGFuZCAqLworICAgICAgICAvKiB0aGUgc2NhbGVkIGRpcmVjdGlvbmFsIGRlcml2YXRpdmUuICovCisgICAgICAgIHdhMyA9IGZqYWMudG9wTGVmdENvcm5lcihuLG4pLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogKHBlcm11dGF0aW9uLmludmVyc2UoKSAqIHdhMSk7CisgICAgICAgIHRlbXAxID0gaW50ZXJuYWw6OmFiczIod2EzLnN0YWJsZU5vcm0oKSAvIGZub3JtKTsKKyAgICAgICAgdGVtcDIgPSBpbnRlcm5hbDo6YWJzMihpbnRlcm5hbDo6c3FydChwYXIpICogcG5vcm0gLyBmbm9ybSk7CisgICAgICAgIHByZXJlZCA9IHRlbXAxICsgdGVtcDIgLyBTY2FsYXIoLjUpOworICAgICAgICBkaXJkZXIgPSAtKHRlbXAxICsgdGVtcDIpOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIHJhdGlvIG9mIHRoZSBhY3R1YWwgdG8gdGhlIHByZWRpY3RlZCAqLworICAgICAgICAvKiByZWR1Y3Rpb24uICovCisgICAgICAgIHJhdGlvID0gMC47CisgICAgICAgIGlmIChwcmVyZWQgIT0gMC4pCisgICAgICAgICAgICByYXRpbyA9IGFjdHJlZCAvIHByZXJlZDsKKworICAgICAgICAvKiB1cGRhdGUgdGhlIHN0ZXAgYm91bmQuICovCisgICAgICAgIGlmIChyYXRpbyA8PSBTY2FsYXIoLjI1KSkgeworICAgICAgICAgICAgaWYgKGFjdHJlZCA+PSAwLikKKyAgICAgICAgICAgICAgICB0ZW1wID0gU2NhbGFyKC41KTsKKyAgICAgICAgICAgIGlmIChhY3RyZWQgPCAwLikKKyAgICAgICAgICAgICAgICB0ZW1wID0gU2NhbGFyKC41KSAqIGRpcmRlciAvIChkaXJkZXIgKyBTY2FsYXIoLjUpICogYWN0cmVkKTsKKyAgICAgICAgICAgIGlmIChTY2FsYXIoLjEpICogZm5vcm0xID49IGZub3JtIHx8IHRlbXAgPCBTY2FsYXIoLjEpKQorICAgICAgICAgICAgICAgIHRlbXAgPSBTY2FsYXIoLjEpOworICAgICAgICAgICAgLyogQ29tcHV0aW5nIE1JTiAqLworICAgICAgICAgICAgZGVsdGEgPSB0ZW1wICogKHN0ZDo6bWluKShkZWx0YSwgcG5vcm0gLyBTY2FsYXIoLjEpKTsKKyAgICAgICAgICAgIHBhciAvPSB0ZW1wOworICAgICAgICB9IGVsc2UgaWYgKCEocGFyICE9IDAuICYmIHJhdGlvIDwgU2NhbGFyKC43NSkpKSB7CisgICAgICAgICAgICBkZWx0YSA9IHBub3JtIC8gU2NhbGFyKC41KTsKKyAgICAgICAgICAgIHBhciA9IFNjYWxhciguNSkgKiBwYXI7CisgICAgICAgIH0KKworICAgICAgICAvKiB0ZXN0IGZvciBzdWNjZXNzZnVsIGl0ZXJhdGlvbi4gKi8KKyAgICAgICAgaWYgKHJhdGlvID49IFNjYWxhcigxZS00KSkgeworICAgICAgICAgICAgLyogc3VjY2Vzc2Z1bCBpdGVyYXRpb24uIHVwZGF0ZSB4LCBmdmVjLCBhbmQgdGhlaXIgbm9ybXMuICovCisgICAgICAgICAgICB4ID0gd2EyOworICAgICAgICAgICAgd2EyID0gZGlhZy5jd2lzZVByb2R1Y3QoeCk7CisgICAgICAgICAgICBmdmVjID0gd2E0OworICAgICAgICAgICAgeG5vcm0gPSB3YTIuc3RhYmxlTm9ybSgpOworICAgICAgICAgICAgZm5vcm0gPSBmbm9ybTE7CisgICAgICAgICAgICArK2l0ZXI7CisgICAgICAgIH0KKworICAgICAgICAvKiB0ZXN0cyBmb3IgY29udmVyZ2VuY2UuICovCisgICAgICAgIGlmIChpbnRlcm5hbDo6YWJzKGFjdHJlZCkgPD0gcGFyYW1ldGVycy5mdG9sICYmIHByZXJlZCA8PSBwYXJhbWV0ZXJzLmZ0b2wgJiYgU2NhbGFyKC41KSAqIHJhdGlvIDw9IDEuICYmIGRlbHRhIDw9IHBhcmFtZXRlcnMueHRvbCAqIHhub3JtKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZUVycm9yQW5kUmVkdWN0aW9uVG9vU21hbGw7CisgICAgICAgIGlmIChpbnRlcm5hbDo6YWJzKGFjdHJlZCkgPD0gcGFyYW1ldGVycy5mdG9sICYmIHByZXJlZCA8PSBwYXJhbWV0ZXJzLmZ0b2wgJiYgU2NhbGFyKC41KSAqIHJhdGlvIDw9IDEuKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZVJlZHVjdGlvblRvb1NtYWxsOworICAgICAgICBpZiAoZGVsdGEgPD0gcGFyYW1ldGVycy54dG9sICogeG5vcm0pCisgICAgICAgICAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJlbGF0aXZlRXJyb3JUb29TbWFsbDsKKworICAgICAgICAvKiB0ZXN0cyBmb3IgdGVybWluYXRpb24gYW5kIHN0cmluZ2VudCB0b2xlcmFuY2VzLiAqLworICAgICAgICBpZiAobmZldiA+PSBwYXJhbWV0ZXJzLm1heGZldikKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6VG9vTWFueUZ1bmN0aW9uRXZhbHVhdGlvbjsKKyAgICAgICAgaWYgKGludGVybmFsOjphYnMoYWN0cmVkKSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICYmIHByZXJlZCA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICYmIFNjYWxhciguNSkgKiByYXRpbyA8PSAxLikKKyAgICAgICAgICAgIHJldHVybiBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6RnRvbFRvb1NtYWxsOworICAgICAgICBpZiAoZGVsdGEgPD0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSAqIHhub3JtKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpYdG9sVG9vU21hbGw7CisgICAgICAgIGlmIChnbm9ybSA8PSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpHdG9sVG9vU21hbGw7CisKKyAgICB9IHdoaWxlIChyYXRpbyA8IFNjYWxhcigxZS00KSk7CisKKyAgICByZXR1cm4gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlJ1bm5pbmc7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBTY2FsYXI+CitMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzCitMZXZlbmJlcmdNYXJxdWFyZHQ8RnVuY3RvclR5cGUsU2NhbGFyPjo6bWluaW1pemVPcHRpbXVtU3RvcmFnZShGVmVjdG9yVHlwZSAgJngpCit7CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBzdGF0dXMgPSBtaW5pbWl6ZU9wdGltdW1TdG9yYWdlSW5pdCh4KTsKKyAgICBpZiAoc3RhdHVzPT1MZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnMpCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgZG8geworICAgICAgICBzdGF0dXMgPSBtaW5pbWl6ZU9wdGltdW1TdG9yYWdlT25lU3RlcCh4KTsKKyAgICB9IHdoaWxlIChzdGF0dXM9PUxldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSdW5uaW5nKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgU2NhbGFyPgorTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cworTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlLFNjYWxhcj46OmxtZGlmMSgKKyAgICAgICAgRnVuY3RvclR5cGUgJmZ1bmN0b3IsCisgICAgICAgIEZWZWN0b3JUeXBlICAmeCwKKyAgICAgICAgSW5kZXggKm5mZXYsCisgICAgICAgIGNvbnN0IFNjYWxhciB0b2wKKyAgICAgICAgKQoreworICAgIEluZGV4IG4gPSB4LnNpemUoKTsKKyAgICBJbmRleCBtID0gZnVuY3Rvci52YWx1ZXMoKTsKKworICAgIC8qIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBlcnJvcnMuICovCisgICAgaWYgKG4gPD0gMCB8fCBtIDwgbiB8fCB0b2wgPCAwLikKKyAgICAgICAgcmV0dXJuIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVyczsKKworICAgIE51bWVyaWNhbERpZmY8RnVuY3RvclR5cGU+IG51bURpZmYoZnVuY3Rvcik7CisgICAgLy8gZW1iZWRkZWQgTGV2ZW5iZXJnTWFycXVhcmR0CisgICAgTGV2ZW5iZXJnTWFycXVhcmR0PE51bWVyaWNhbERpZmY8RnVuY3RvclR5cGU+LCBTY2FsYXIgPiBsbShudW1EaWZmKTsKKyAgICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSB0b2w7CisgICAgbG0ucGFyYW1ldGVycy54dG9sID0gdG9sOworICAgIGxtLnBhcmFtZXRlcnMubWF4ZmV2ID0gMjAwKihuKzEpOworCisgICAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBpbmZvID0gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyhsbS5taW5pbWl6ZSh4KSk7CisgICAgaWYgKG5mZXYpCisgICAgICAgICogbmZldiA9IGxtLm5mZXY7CisgICAgcmV0dXJuIGluZm87Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fTEVWRU5CRVJHTUFSUVVBUkRUX19ICisKKy8vdmltOiBhaSB0cz00IHN0cz00IGV0IHN3PTQKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vY2hrZGVyLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2Noa2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzdjNTAKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2Noa2Rlci5oCkBAIC0wLDAgKzEsNjIgQEAKKyNkZWZpbmUgY2hrZGVyX2xvZzEwZSAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1CisjZGVmaW5lIGNoa2Rlcl9mYWN0b3IgMTAwLgorCituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBjaGtkZXIoCisgICAgICAgIGNvbnN0IE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZ4LAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZnZlYywKKyAgICAgICAgY29uc3QgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMgPiAmZmphYywKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJnhwLAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZnZlY3AsCisgICAgICAgIGludCBtb2RlLAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZXJyCisgICAgICAgICkKK3sKKyAgICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKKyAgICBjb25zdCBTY2FsYXIgZXBzID0gc3FydChOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKTsKKyAgICBjb25zdCBTY2FsYXIgZXBzZiA9IGNoa2Rlcl9mYWN0b3IgKiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICAgIGNvbnN0IFNjYWxhciBlcHNsb2cgPSBjaGtkZXJfbG9nMTBlICogbG9nKGVwcyk7CisgICAgU2NhbGFyIHRlbXA7CisKKyAgICBjb25zdCBJbmRleCBtID0gZnZlYy5zaXplKCksIG4gPSB4LnNpemUoKTsKKworICAgIGlmIChtb2RlICE9IDIpIHsKKyAgICAgICAgLyogbW9kZSA9IDEuICovCisgICAgICAgIHhwLnJlc2l6ZShuKTsKKyAgICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgICAgdGVtcCA9IGVwcyAqIGFicyh4W2pdKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IDAuKQorICAgICAgICAgICAgICAgIHRlbXAgPSBlcHM7CisgICAgICAgICAgICB4cFtqXSA9IHhbal0gKyB0ZW1wOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBtb2RlID0gMi4gKi8KKyAgICAgICAgZXJyLnNldFplcm8obSk7IAorICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICB0ZW1wID0gYWJzKHhbal0pOworICAgICAgICAgICAgaWYgKHRlbXAgPT0gMC4pCisgICAgICAgICAgICAgICAgdGVtcCA9IDEuOworICAgICAgICAgICAgZXJyICs9IHRlbXAgKiBmamFjLmNvbChqKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbTsgKytpKSB7CisgICAgICAgICAgICB0ZW1wID0gMS47CisgICAgICAgICAgICBpZiAoZnZlY1tpXSAhPSAwLiAmJiBmdmVjcFtpXSAhPSAwLiAmJiBhYnMoZnZlY3BbaV0gLSBmdmVjW2ldKSA+PSBlcHNmICogYWJzKGZ2ZWNbaV0pKQorICAgICAgICAgICAgICAgIHRlbXAgPSBlcHMgKiBhYnMoKGZ2ZWNwW2ldIC0gZnZlY1tpXSkgLyBlcHMgLSBlcnJbaV0pIC8gKGFicyhmdmVjW2ldKSArIGFicyhmdmVjcFtpXSkpOworICAgICAgICAgICAgZXJyW2ldID0gMS47CisgICAgICAgICAgICBpZiAodGVtcCA+IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgJiYgdGVtcCA8IGVwcykKKyAgICAgICAgICAgICAgICBlcnJbaV0gPSAoY2hrZGVyX2xvZzEwZSAqIGxvZyh0ZW1wKSAtIGVwc2xvZykgLyBlcHNsb2c7CisgICAgICAgICAgICBpZiAodGVtcCA+PSBlcHMpCisgICAgICAgICAgICAgICAgZXJyW2ldID0gMC47CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vY292YXIuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vY292YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzNhMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9jb3Zhci5oCkBAIC0wLDAgKzEsNjkgQEAKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBjb3ZhcigKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMgPiAmciwKKyAgICAgICAgY29uc3QgVmVjdG9yWGkgJmlwdnQsCisgICAgICAgIFNjYWxhciB0b2wgPSBzcXJ0KE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpICkKK3sKKyAgICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBJbmRleCBpLCBqLCBrLCBsLCBpaSwgamo7CisgICAgYm9vbCBzaW5nOworICAgIFNjYWxhciB0ZW1wOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIGNvbnN0IEluZGV4IG4gPSByLmNvbHMoKTsKKyAgICBjb25zdCBTY2FsYXIgdG9sciA9IHRvbCAqIGFicyhyKDAsMCkpOworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gd2Eobik7CisgICAgYXNzZXJ0KGlwdnQuc2l6ZSgpPT1uKTsKKworICAgIC8qIGZvcm0gdGhlIGludmVyc2Ugb2YgciBpbiB0aGUgZnVsbCB1cHBlciB0cmlhbmdsZSBvZiByLiAqLworICAgIGwgPSAtMTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbjsgKytrKQorICAgICAgICBpZiAoYWJzKHIoayxrKSkgPiB0b2xyKSB7CisgICAgICAgICAgICByKGssaykgPSAxLiAvIHIoayxrKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gay0xOyArK2opIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gcihrLGspICogcihqLGspOworICAgICAgICAgICAgICAgIHIoaixrKSA9IDAuOworICAgICAgICAgICAgICAgIHIuY29sKGspLmhlYWQoaisxKSAtPSByLmNvbChqKS5oZWFkKGorMSkgKiB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbCA9IGs7CisgICAgICAgIH0KKworICAgIC8qIGZvcm0gdGhlIGZ1bGwgdXBwZXIgdHJpYW5nbGUgb2YgdGhlIGludmVyc2Ugb2YgKHIgdHJhbnNwb3NlKSpyICovCisgICAgLyogaW4gdGhlIGZ1bGwgdXBwZXIgdHJpYW5nbGUgb2Ygci4gKi8KKyAgICBmb3IgKGsgPSAwOyBrIDw9IGw7ICsraykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDw9IGstMTsgKytqKQorICAgICAgICAgICAgci5jb2woaikuaGVhZChqKzEpICs9IHIuY29sKGspLmhlYWQoaisxKSAqIHIoaixrKTsKKyAgICAgICAgci5jb2woaykuaGVhZChrKzEpICo9IHIoayxrKTsKKyAgICB9CisKKyAgICAvKiBmb3JtIHRoZSBmdWxsIGxvd2VyIHRyaWFuZ2xlIG9mIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCAqLworICAgIC8qIGluIHRoZSBzdHJpY3QgbG93ZXIgdHJpYW5nbGUgb2YgciBhbmQgaW4gd2EuICovCisgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICBqaiA9IGlwdnRbal07CisgICAgICAgIHNpbmcgPSBqID4gbDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBqOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzaW5nKQorICAgICAgICAgICAgICAgIHIoaSxqKSA9IDAuOworICAgICAgICAgICAgaWkgPSBpcHZ0W2ldOworICAgICAgICAgICAgaWYgKGlpID4gamopCisgICAgICAgICAgICAgICAgcihpaSxqaikgPSByKGksaik7CisgICAgICAgICAgICBpZiAoaWkgPCBqaikKKyAgICAgICAgICAgICAgICByKGpqLGlpKSA9IHIoaSxqKTsKKyAgICAgICAgfQorICAgICAgICB3YVtqal0gPSByKGosaik7CisgICAgfQorCisgICAgLyogc3ltbWV0cml6ZSB0aGUgY292YXJpYW5jZSBtYXRyaXggaW4gci4gKi8KKyAgICByLnRvcExlZnRDb3JuZXIobixuKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpID0gci50b3BMZWZ0Q29ybmVyKG4sbikudHJhbnNwb3NlKCk7CisgICAgci5kaWFnb25hbCgpID0gd2E7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vZG9nbGVnLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2RvZ2xlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYmM5OGIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2RvZ2xlZy5oCkBAIC0wLDAgKzEsMTA0IEBACituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgZG9nbGVnKAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgRHluYW1pYyA+ICAmcXJmYWMsCisgICAgICAgIGNvbnN0IE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZkaWFnLAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmcXRiLAorICAgICAgICBTY2FsYXIgZGVsdGEsCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZ4KQoreworICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIEluZGV4IGksIGo7CisgICAgU2NhbGFyIHN1bSwgdGVtcCwgYWxwaGEsIGJub3JtOworICAgIFNjYWxhciBnbm9ybSwgcW5vcm07CisgICAgU2NhbGFyIHNnbm9ybTsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBjb25zdCBTY2FsYXIgZXBzbWNoID0gTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKTsKKyAgICBjb25zdCBJbmRleCBuID0gcXJmYWMuY29scygpOworICAgIGFzc2VydChuPT1xdGIuc2l6ZSgpKTsKKyAgICBhc3NlcnQobj09eC5zaXplKCkpOworICAgIGFzc2VydChuPT1kaWFnLnNpemUoKSk7CisgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgd2ExKG4pLCB3YTIobik7CisKKyAgICAvKiBmaXJzdCwgY2FsY3VsYXRlIHRoZSBnYXVzcy1uZXd0b24gZGlyZWN0aW9uLiAqLworICAgIGZvciAoaiA9IG4tMTsgaiA+PTA7IC0taikgeworICAgICAgICB0ZW1wID0gcXJmYWMoaixqKTsKKyAgICAgICAgaWYgKHRlbXAgPT0gMC4pIHsKKyAgICAgICAgICAgIHRlbXAgPSBlcHNtY2ggKiBxcmZhYy5jb2woaikuaGVhZChqKzEpLm1heENvZWZmKCk7CisgICAgICAgICAgICBpZiAodGVtcCA9PSAwLikKKyAgICAgICAgICAgICAgICB0ZW1wID0gZXBzbWNoOworICAgICAgICB9CisgICAgICAgIGlmIChqPT1uLTEpCisgICAgICAgICAgICB4W2pdID0gcXRiW2pdIC8gdGVtcDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeFtqXSA9IChxdGJbal0gLSBxcmZhYy5yb3coaikudGFpbChuLWotMSkuZG90KHgudGFpbChuLWotMSkpKSAvIHRlbXA7CisgICAgfQorCisgICAgLyogdGVzdCB3aGV0aGVyIHRoZSBnYXVzcy1uZXd0b24gZGlyZWN0aW9uIGlzIGFjY2VwdGFibGUuICovCisgICAgcW5vcm0gPSBkaWFnLmN3aXNlUHJvZHVjdCh4KS5zdGFibGVOb3JtKCk7CisgICAgaWYgKHFub3JtIDw9IGRlbHRhKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUT0RPIDogdGhpcyBwYXRoIGlzIG5vdCB0ZXN0ZWQgYnkgRWlnZW4gdW5pdCB0ZXN0cworCisgICAgLyogdGhlIGdhdXNzLW5ld3RvbiBkaXJlY3Rpb24gaXMgbm90IGFjY2VwdGFibGUuICovCisgICAgLyogbmV4dCwgY2FsY3VsYXRlIHRoZSBzY2FsZWQgZ3JhZGllbnQgZGlyZWN0aW9uLiAqLworCisgICAgd2ExLmZpbGwoMC4pOworICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKKyAgICAgICAgd2ExLnRhaWwobi1qKSArPSBxcmZhYy5yb3coaikudGFpbChuLWopICogcXRiW2pdOworICAgICAgICB3YTFbal0gLz0gZGlhZ1tqXTsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIG5vcm0gb2YgdGhlIHNjYWxlZCBncmFkaWVudCBhbmQgdGVzdCBmb3IgKi8KKyAgICAvKiB0aGUgc3BlY2lhbCBjYXNlIGluIHdoaWNoIHRoZSBzY2FsZWQgZ3JhZGllbnQgaXMgemVyby4gKi8KKyAgICBnbm9ybSA9IHdhMS5zdGFibGVOb3JtKCk7CisgICAgc2dub3JtID0gMC47CisgICAgYWxwaGEgPSBkZWx0YSAvIHFub3JtOworICAgIGlmIChnbm9ybSA9PSAwLikKKyAgICAgICAgZ290byBhbGdvX2VuZDsKKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgcG9pbnQgYWxvbmcgdGhlIHNjYWxlZCBncmFkaWVudCAqLworICAgIC8qIGF0IHdoaWNoIHRoZSBxdWFkcmF0aWMgaXMgbWluaW1pemVkLiAqLworICAgIHdhMS5hcnJheSgpIC89IChkaWFnKmdub3JtKS5hcnJheSgpOworICAgIC8vIFRPRE8gOiBvbmNlIHVuaXQgdGVzdHMgY292ZXIgdGhpcyBwYXJ0LDoKKyAgICAvLyB3YTIgPSBxcmZhYy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIHdhMTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgIHN1bSA9IDAuOworICAgICAgICBmb3IgKGkgPSBqOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBzdW0gKz0gcXJmYWMoaixpKSAqIHdhMVtpXTsKKyAgICAgICAgfQorICAgICAgICB3YTJbal0gPSBzdW07CisgICAgfQorICAgIHRlbXAgPSB3YTIuc3RhYmxlTm9ybSgpOworICAgIHNnbm9ybSA9IGdub3JtIC8gdGVtcCAvIHRlbXA7CisKKyAgICAvKiB0ZXN0IHdoZXRoZXIgdGhlIHNjYWxlZCBncmFkaWVudCBkaXJlY3Rpb24gaXMgYWNjZXB0YWJsZS4gKi8KKyAgICBhbHBoYSA9IDAuOworICAgIGlmIChzZ25vcm0gPj0gZGVsdGEpCisgICAgICAgIGdvdG8gYWxnb19lbmQ7CisKKyAgICAvKiB0aGUgc2NhbGVkIGdyYWRpZW50IGRpcmVjdGlvbiBpcyBub3QgYWNjZXB0YWJsZS4gKi8KKyAgICAvKiBmaW5hbGx5LCBjYWxjdWxhdGUgdGhlIHBvaW50IGFsb25nIHRoZSBkb2dsZWcgKi8KKyAgICAvKiBhdCB3aGljaCB0aGUgcXVhZHJhdGljIGlzIG1pbmltaXplZC4gKi8KKyAgICBibm9ybSA9IHF0Yi5zdGFibGVOb3JtKCk7CisgICAgdGVtcCA9IGJub3JtIC8gZ25vcm0gKiAoYm5vcm0gLyBxbm9ybSkgKiAoc2dub3JtIC8gZGVsdGEpOworICAgIHRlbXAgPSB0ZW1wIC0gZGVsdGEgLyBxbm9ybSAqIGFiczIoc2dub3JtIC8gZGVsdGEpICsgc3FydChhYnMyKHRlbXAgLSBkZWx0YSAvIHFub3JtKSArICgxLi1hYnMyKGRlbHRhIC8gcW5vcm0pKSAqICgxLi1hYnMyKHNnbm9ybSAvIGRlbHRhKSkpOworICAgIGFscGhhID0gZGVsdGEgLyBxbm9ybSAqICgxLiAtIGFiczIoc2dub3JtIC8gZGVsdGEpKSAvIHRlbXA7CithbGdvX2VuZDoKKworICAgIC8qIGZvcm0gYXBwcm9wcmlhdGUgY29udmV4IGNvbWJpbmF0aW9uIG9mIHRoZSBnYXVzcy1uZXd0b24gKi8KKyAgICAvKiBkaXJlY3Rpb24gYW5kIHRoZSBzY2FsZWQgZ3JhZGllbnQgZGlyZWN0aW9uLiAqLworICAgIHRlbXAgPSAoMS4tYWxwaGEpICogKHN0ZDo6bWluKShzZ25vcm0sZGVsdGEpOworICAgIHggPSB0ZW1wICogd2ExICsgYWxwaGEgKiB4OworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL2ZkamFjMS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9mZGphYzEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2FiZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9mZGphYzEuaApAQCAtMCwwICsxLDc2IEBACituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3RvclR5cGUsIHR5cGVuYW1lIFNjYWxhcj4KK0RlbnNlSW5kZXggZmRqYWMxKAorICAgICAgICBjb25zdCBGdW5jdG9yVHlwZSAmRnVuY3RvciwKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJngsCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZmdmVjLAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgRHluYW1pYyA+ICZmamFjLAorICAgICAgICBEZW5zZUluZGV4IG1sLCBEZW5zZUluZGV4IG11LAorICAgICAgICBTY2FsYXIgZXBzZmNuKQoreworICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIFNjYWxhciBoOworICAgIEluZGV4IGosIGs7CisgICAgU2NhbGFyIGVwcywgdGVtcDsKKyAgICBJbmRleCBtc3VtOworICAgIGludCBpZmxhZzsKKyAgICBJbmRleCBzdGFydCwgbGVuZ3RoOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIGNvbnN0IFNjYWxhciBlcHNtY2ggPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICAgIGNvbnN0IEluZGV4IG4gPSB4LnNpemUoKTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCk9PW4pOworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gIHdhMShuKTsKKyAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICB3YTIobik7CisKKyAgICBlcHMgPSBzcXJ0KChzdGQ6Om1heCkoZXBzZmNuLGVwc21jaCkpOworICAgIG1zdW0gPSBtbCArIG11ICsgMTsKKyAgICBpZiAobXN1bSA+PSBuKSB7CisgICAgICAgIC8qIGNvbXB1dGF0aW9uIG9mIGRlbnNlIGFwcHJveGltYXRlIGphY29iaWFuLiAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICB0ZW1wID0geFtqXTsKKyAgICAgICAgICAgIGggPSBlcHMgKiBhYnModGVtcCk7CisgICAgICAgICAgICBpZiAoaCA9PSAwLikKKyAgICAgICAgICAgICAgICBoID0gZXBzOworICAgICAgICAgICAgeFtqXSA9IHRlbXAgKyBoOworICAgICAgICAgICAgaWZsYWcgPSBGdW5jdG9yKHgsIHdhMSk7CisgICAgICAgICAgICBpZiAoaWZsYWcgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBpZmxhZzsKKyAgICAgICAgICAgIHhbal0gPSB0ZW1wOworICAgICAgICAgICAgZmphYy5jb2woaikgPSAod2ExLWZ2ZWMpL2g7CisgICAgICAgIH0KKworICAgIH1lbHNlIHsKKyAgICAgICAgLyogY29tcHV0YXRpb24gb2YgYmFuZGVkIGFwcHJveGltYXRlIGphY29iaWFuLiAqLworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbXN1bTsgKytrKSB7CisgICAgICAgICAgICBmb3IgKGogPSBrOyAobXN1bTwwKSA/IChqPm4pOiAoajxuKTsgaiArPSBtc3VtKSB7CisgICAgICAgICAgICAgICAgd2EyW2pdID0geFtqXTsKKyAgICAgICAgICAgICAgICBoID0gZXBzICogYWJzKHdhMltqXSk7CisgICAgICAgICAgICAgICAgaWYgKGggPT0gMC4pIGggPSBlcHM7CisgICAgICAgICAgICAgICAgeFtqXSA9IHdhMltqXSArIGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZmxhZyA9IEZ1bmN0b3IoeCwgd2ExKTsKKyAgICAgICAgICAgIGlmIChpZmxhZyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGlmbGFnOworICAgICAgICAgICAgZm9yIChqID0gazsgKG1zdW08MCkgPyAoaj5uKTogKGo8bik7IGogKz0gbXN1bSkgeworICAgICAgICAgICAgICAgIHhbal0gPSB3YTJbal07CisgICAgICAgICAgICAgICAgaCA9IGVwcyAqIGFicyh3YTJbal0pOworICAgICAgICAgICAgICAgIGlmIChoID09IDAuKSBoID0gZXBzOworICAgICAgICAgICAgICAgIGZqYWMuY29sKGopLnNldFplcm8oKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHN0ZDo6bWF4PEluZGV4PigwLGotbXUpOworICAgICAgICAgICAgICAgIGxlbmd0aCA9IChzdGQ6Om1pbikobi0xLCBqK21sKSAtIHN0YXJ0ICsgMTsKKyAgICAgICAgICAgICAgICBmamFjLmNvbChqKS5zZWdtZW50KHN0YXJ0LCBsZW5ndGgpID0gKCB3YTEuc2VnbWVudChzdGFydCwgbGVuZ3RoKS1mdmVjLnNlZ21lbnQoc3RhcnQsIGxlbmd0aCkpL2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vbG1wYXIuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vbG1wYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzFjYTUzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9sbXBhci5oCkBAIC0wLDAgKzEsMjk0IEBACituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgbG1wYXIoCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gJnIsCisgICAgICAgIGNvbnN0IFZlY3RvclhpICZpcHZ0LAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZGlhZywKKyAgICAgICAgY29uc3QgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJnF0YiwKKyAgICAgICAgU2NhbGFyIGRlbHRhLAorICAgICAgICBTY2FsYXIgJnBhciwKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJngpCit7CisgICAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworCisgICAgLyogTG9jYWwgdmFyaWFibGVzICovCisgICAgSW5kZXggaSwgaiwgbDsKKyAgICBTY2FsYXIgZnA7CisgICAgU2NhbGFyIHBhcmMsIHBhcmw7CisgICAgSW5kZXggaXRlcjsKKyAgICBTY2FsYXIgdGVtcCwgcGFydTsKKyAgICBTY2FsYXIgZ25vcm07CisgICAgU2NhbGFyIGR4bm9ybTsKKworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIGNvbnN0IFNjYWxhciBkd2FyZiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWluKCk7CisgICAgY29uc3QgSW5kZXggbiA9IHIuY29scygpOworICAgIGFzc2VydChuPT1kaWFnLnNpemUoKSk7CisgICAgYXNzZXJ0KG49PXF0Yi5zaXplKCkpOworICAgIGFzc2VydChuPT14LnNpemUoKSk7CisKKyAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICB3YTEsIHdhMjsKKworICAgIC8qIGNvbXB1dGUgYW5kIHN0b3JlIGluIHggdGhlIGdhdXNzLW5ld3RvbiBkaXJlY3Rpb24uIGlmIHRoZSAqLworICAgIC8qIGphY29iaWFuIGlzIHJhbmstZGVmaWNpZW50LCBvYnRhaW4gYSBsZWFzdCBzcXVhcmVzIHNvbHV0aW9uLiAqLworICAgIEluZGV4IG5zaW5nID0gbi0xOworICAgIHdhMSA9IHF0YjsKKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgIGlmIChyKGosaikgPT0gMC4gJiYgbnNpbmcgPT0gbi0xKQorICAgICAgICAgICAgbnNpbmcgPSBqIC0gMTsKKyAgICAgICAgaWYgKG5zaW5nIDwgbi0xKQorICAgICAgICAgICAgd2ExW2pdID0gMC47CisgICAgfQorICAgIGZvciAoaiA9IG5zaW5nOyBqPj0wOyAtLWopIHsKKyAgICAgICAgd2ExW2pdIC89IHIoaixqKTsKKyAgICAgICAgdGVtcCA9IHdhMVtqXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGogOyArK2kpCisgICAgICAgICAgICB3YTFbaV0gLT0gcihpLGopICogdGVtcDsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICB4W2lwdnRbal1dID0gd2ExW2pdOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuICovCisgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHRoZSBvcmlnaW4sIGFuZCB0ZXN0ICovCisgICAgLyogZm9yIGFjY2VwdGFuY2Ugb2YgdGhlIGdhdXNzLW5ld3RvbiBkaXJlY3Rpb24uICovCisgICAgaXRlciA9IDA7CisgICAgd2EyID0gZGlhZy5jd2lzZVByb2R1Y3QoeCk7CisgICAgZHhub3JtID0gd2EyLmJsdWVOb3JtKCk7CisgICAgZnAgPSBkeG5vcm0gLSBkZWx0YTsKKyAgICBpZiAoZnAgPD0gU2NhbGFyKDAuMSkgKiBkZWx0YSkgeworICAgICAgICBwYXIgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogaWYgdGhlIGphY29iaWFuIGlzIG5vdCByYW5rIGRlZmljaWVudCwgdGhlIG5ld3RvbiAqLworICAgIC8qIHN0ZXAgcHJvdmlkZXMgYSBsb3dlciBib3VuZCwgcGFybCwgZm9yIHRoZSB6ZXJvIG9mICovCisgICAgLyogdGhlIGZ1bmN0aW9uLiBvdGhlcndpc2Ugc2V0IHRoaXMgYm91bmQgdG8gemVyby4gKi8KKyAgICBwYXJsID0gMC47CisgICAgaWYgKG5zaW5nID49IG4tMSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICBsID0gaXB2dFtqXTsKKyAgICAgICAgICAgIHdhMVtqXSA9IGRpYWdbbF0gKiAod2EyW2xdIC8gZHhub3JtKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpdCdzIGFjdHVhbGx5IGEgdHJpYW5ndWxhclZpZXcuc29sdmVJbnBsYWNlKCksIHRob3VnaCBpbiBhIHdlaXJkCisgICAgICAgIC8vIHdheToKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgICAgU2NhbGFyIHN1bSA9IDAuOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGo7ICsraSkKKyAgICAgICAgICAgICAgICBzdW0gKz0gcihpLGopICogd2ExW2ldOworICAgICAgICAgICAgd2ExW2pdID0gKHdhMVtqXSAtIHN1bSkgLyByKGosaik7CisgICAgICAgIH0KKyAgICAgICAgdGVtcCA9IHdhMS5ibHVlTm9ybSgpOworICAgICAgICBwYXJsID0gZnAgLyBkZWx0YSAvIHRlbXAgLyB0ZW1wOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBhbiB1cHBlciBib3VuZCwgcGFydSwgZm9yIHRoZSB6ZXJvIG9mIHRoZSBmdW5jdGlvbi4gKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICB3YTFbal0gPSByLmNvbChqKS5oZWFkKGorMSkuZG90KHF0Yi5oZWFkKGorMSkpIC8gZGlhZ1tpcHZ0W2pdXTsKKworICAgIGdub3JtID0gd2ExLnN0YWJsZU5vcm0oKTsKKyAgICBwYXJ1ID0gZ25vcm0gLyBkZWx0YTsKKyAgICBpZiAocGFydSA9PSAwLikKKyAgICAgICAgcGFydSA9IGR3YXJmIC8gKHN0ZDo6bWluKShkZWx0YSxTY2FsYXIoMC4xKSk7CisKKyAgICAvKiBpZiB0aGUgaW5wdXQgcGFyIGxpZXMgb3V0c2lkZSBvZiB0aGUgaW50ZXJ2YWwgKHBhcmwscGFydSksICovCisgICAgLyogc2V0IHBhciB0byB0aGUgY2xvc2VyIGVuZHBvaW50LiAqLworICAgIHBhciA9IChzdGQ6Om1heCkocGFyLHBhcmwpOworICAgIHBhciA9IChzdGQ6Om1pbikocGFyLHBhcnUpOworICAgIGlmIChwYXIgPT0gMC4pCisgICAgICAgIHBhciA9IGdub3JtIC8gZHhub3JtOworCisgICAgLyogYmVnaW5uaW5nIG9mIGFuIGl0ZXJhdGlvbi4gKi8KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICArK2l0ZXI7CisKKyAgICAgICAgLyogZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHBhci4gKi8KKyAgICAgICAgaWYgKHBhciA9PSAwLikKKyAgICAgICAgICAgIHBhciA9IChzdGQ6Om1heCkoZHdhcmYsU2NhbGFyKC4wMDEpICogcGFydSk7IC8qIENvbXB1dGluZyBNQVggKi8KKyAgICAgICAgd2ExID0gc3FydChwYXIpKiBkaWFnOworCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gc2RpYWcobik7CisgICAgICAgIHFyc29sdjxTY2FsYXI+KHIsIGlwdnQsIHdhMSwgcXRiLCB4LCBzZGlhZyk7CisKKyAgICAgICAgd2EyID0gZGlhZy5jd2lzZVByb2R1Y3QoeCk7CisgICAgICAgIGR4bm9ybSA9IHdhMi5ibHVlTm9ybSgpOworICAgICAgICB0ZW1wID0gZnA7CisgICAgICAgIGZwID0gZHhub3JtIC0gZGVsdGE7CisKKyAgICAgICAgLyogaWYgdGhlIGZ1bmN0aW9uIGlzIHNtYWxsIGVub3VnaCwgYWNjZXB0IHRoZSBjdXJyZW50IHZhbHVlICovCisgICAgICAgIC8qIG9mIHBhci4gYWxzbyB0ZXN0IGZvciB0aGUgZXhjZXB0aW9uYWwgY2FzZXMgd2hlcmUgcGFybCAqLworICAgICAgICAvKiBpcyB6ZXJvIG9yIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBoYXMgcmVhY2hlZCAxMC4gKi8KKyAgICAgICAgaWYgKGFicyhmcCkgPD0gU2NhbGFyKDAuMSkgKiBkZWx0YSB8fCAocGFybCA9PSAwLiAmJiBmcCA8PSB0ZW1wICYmIHRlbXAgPCAwLikgfHwgaXRlciA9PSAxMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIG5ld3RvbiBjb3JyZWN0aW9uLiAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICBsID0gaXB2dFtqXTsKKyAgICAgICAgICAgIHdhMVtqXSA9IGRpYWdbbF0gKiAod2EyW2xdIC8gZHhub3JtKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICB3YTFbal0gLz0gc2RpYWdbal07CisgICAgICAgICAgICB0ZW1wID0gd2ExW2pdOworICAgICAgICAgICAgZm9yIChpID0gaisxOyBpIDwgbjsgKytpKQorICAgICAgICAgICAgICAgIHdhMVtpXSAtPSByKGksaikgKiB0ZW1wOworICAgICAgICB9CisgICAgICAgIHRlbXAgPSB3YTEuYmx1ZU5vcm0oKTsKKyAgICAgICAgcGFyYyA9IGZwIC8gZGVsdGEgLyB0ZW1wIC8gdGVtcDsKKworICAgICAgICAvKiBkZXBlbmRpbmcgb24gdGhlIHNpZ24gb2YgdGhlIGZ1bmN0aW9uLCB1cGRhdGUgcGFybCBvciBwYXJ1LiAqLworICAgICAgICBpZiAoZnAgPiAwLikKKyAgICAgICAgICAgIHBhcmwgPSAoc3RkOjptYXgpKHBhcmwscGFyKTsKKyAgICAgICAgaWYgKGZwIDwgMC4pCisgICAgICAgICAgICBwYXJ1ID0gKHN0ZDo6bWluKShwYXJ1LHBhcik7CisKKyAgICAgICAgLyogY29tcHV0ZSBhbiBpbXByb3ZlZCBlc3RpbWF0ZSBmb3IgcGFyLiAqLworICAgICAgICAvKiBDb21wdXRpbmcgTUFYICovCisgICAgICAgIHBhciA9IChzdGQ6Om1heCkocGFybCxwYXIrcGFyYyk7CisKKyAgICAgICAgLyogZW5kIG9mIGFuIGl0ZXJhdGlvbi4gKi8KKyAgICB9CisKKyAgICAvKiB0ZXJtaW5hdGlvbi4gKi8KKyAgICBpZiAoaXRlciA9PSAwKQorICAgICAgICBwYXIgPSAwLjsKKyAgICByZXR1cm47Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGxtcGFyMigKKyAgICAgICAgY29uc3QgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gPiAmcXIsCisgICAgICAgIGNvbnN0IE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZkaWFnLAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmcXRiLAorICAgICAgICBTY2FsYXIgZGVsdGEsCisgICAgICAgIFNjYWxhciAmcGFyLAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmeCkKKworeworICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIEluZGV4IGo7CisgICAgU2NhbGFyIGZwOworICAgIFNjYWxhciBwYXJjLCBwYXJsOworICAgIEluZGV4IGl0ZXI7CisgICAgU2NhbGFyIHRlbXAsIHBhcnU7CisgICAgU2NhbGFyIGdub3JtOworICAgIFNjYWxhciBkeG5vcm07CisKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBjb25zdCBTY2FsYXIgZHdhcmYgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1pbigpOworICAgIGNvbnN0IEluZGV4IG4gPSBxci5tYXRyaXhRUigpLmNvbHMoKTsKKyAgICBhc3NlcnQobj09ZGlhZy5zaXplKCkpOworICAgIGFzc2VydChuPT1xdGIuc2l6ZSgpKTsKKworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gIHdhMSwgd2EyOworCisgICAgLyogY29tcHV0ZSBhbmQgc3RvcmUgaW4geCB0aGUgZ2F1c3MtbmV3dG9uIGRpcmVjdGlvbi4gaWYgdGhlICovCisgICAgLyogamFjb2JpYW4gaXMgcmFuay1kZWZpY2llbnQsIG9idGFpbiBhIGxlYXN0IHNxdWFyZXMgc29sdXRpb24uICovCisKKy8vICAgIGNvbnN0IEluZGV4IHJhbmsgPSBxci5ub256ZXJvUGl2b3RzKCk7IC8vIGV4YWN0bHkgZG91YmxlKDAuKQorICAgIGNvbnN0IEluZGV4IHJhbmsgPSBxci5yYW5rKCk7IC8vIHVzZSBhIHRocmVzaG9sZAorICAgIHdhMSA9IHF0YjsKKyAgICB3YTEudGFpbChuLXJhbmspLnNldFplcm8oKTsKKyAgICBxci5tYXRyaXhRUigpLnRvcExlZnRDb3JuZXIocmFuaywgcmFuaykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKHdhMS5oZWFkKHJhbmspKTsKKworICAgIHggPSBxci5jb2xzUGVybXV0YXRpb24oKSp3YTE7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBpdGVyYXRpb24gY291bnRlci4gKi8KKyAgICAvKiBldmFsdWF0ZSB0aGUgZnVuY3Rpb24gYXQgdGhlIG9yaWdpbiwgYW5kIHRlc3QgKi8KKyAgICAvKiBmb3IgYWNjZXB0YW5jZSBvZiB0aGUgZ2F1c3MtbmV3dG9uIGRpcmVjdGlvbi4gKi8KKyAgICBpdGVyID0gMDsKKyAgICB3YTIgPSBkaWFnLmN3aXNlUHJvZHVjdCh4KTsKKyAgICBkeG5vcm0gPSB3YTIuYmx1ZU5vcm0oKTsKKyAgICBmcCA9IGR4bm9ybSAtIGRlbHRhOworICAgIGlmIChmcCA8PSBTY2FsYXIoMC4xKSAqIGRlbHRhKSB7CisgICAgICAgIHBhciA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgamFjb2JpYW4gaXMgbm90IHJhbmsgZGVmaWNpZW50LCB0aGUgbmV3dG9uICovCisgICAgLyogc3RlcCBwcm92aWRlcyBhIGxvd2VyIGJvdW5kLCBwYXJsLCBmb3IgdGhlIHplcm8gb2YgKi8KKyAgICAvKiB0aGUgZnVuY3Rpb24uIG90aGVyd2lzZSBzZXQgdGhpcyBib3VuZCB0byB6ZXJvLiAqLworICAgIHBhcmwgPSAwLjsKKyAgICBpZiAocmFuaz09bikgeworICAgICAgICB3YTEgPSBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkgKiAgZGlhZy5jd2lzZVByb2R1Y3Qod2EyKS9keG5vcm07CisgICAgICAgIHFyLm1hdHJpeFFSKCkudG9wTGVmdENvcm5lcihuLCBuKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2Uod2ExKTsKKyAgICAgICAgdGVtcCA9IHdhMS5ibHVlTm9ybSgpOworICAgICAgICBwYXJsID0gZnAgLyBkZWx0YSAvIHRlbXAgLyB0ZW1wOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBhbiB1cHBlciBib3VuZCwgcGFydSwgZm9yIHRoZSB6ZXJvIG9mIHRoZSBmdW5jdGlvbi4gKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKQorICAgICAgICB3YTFbal0gPSBxci5tYXRyaXhRUigpLmNvbChqKS5oZWFkKGorMSkuZG90KHF0Yi5oZWFkKGorMSkpIC8gZGlhZ1txci5jb2xzUGVybXV0YXRpb24oKS5pbmRpY2VzKCkoaildOworCisgICAgZ25vcm0gPSB3YTEuc3RhYmxlTm9ybSgpOworICAgIHBhcnUgPSBnbm9ybSAvIGRlbHRhOworICAgIGlmIChwYXJ1ID09IDAuKQorICAgICAgICBwYXJ1ID0gZHdhcmYgLyAoc3RkOjptaW4pKGRlbHRhLFNjYWxhcigwLjEpKTsKKworICAgIC8qIGlmIHRoZSBpbnB1dCBwYXIgbGllcyBvdXRzaWRlIG9mIHRoZSBpbnRlcnZhbCAocGFybCxwYXJ1KSwgKi8KKyAgICAvKiBzZXQgcGFyIHRvIHRoZSBjbG9zZXIgZW5kcG9pbnQuICovCisgICAgcGFyID0gKHN0ZDo6bWF4KShwYXIscGFybCk7CisgICAgcGFyID0gKHN0ZDo6bWluKShwYXIscGFydSk7CisgICAgaWYgKHBhciA9PSAwLikKKyAgICAgICAgcGFyID0gZ25vcm0gLyBkeG5vcm07CisKKyAgICAvKiBiZWdpbm5pbmcgb2YgYW4gaXRlcmF0aW9uLiAqLworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gcyA9IHFyLm1hdHJpeFFSKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgKytpdGVyOworCisgICAgICAgIC8qIGV2YWx1YXRlIHRoZSBmdW5jdGlvbiBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiBwYXIuICovCisgICAgICAgIGlmIChwYXIgPT0gMC4pCisgICAgICAgICAgICBwYXIgPSAoc3RkOjptYXgpKGR3YXJmLFNjYWxhciguMDAxKSAqIHBhcnUpOyAvKiBDb21wdXRpbmcgTUFYICovCisgICAgICAgIHdhMSA9IHNxcnQocGFyKSogZGlhZzsKKworICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+IHNkaWFnKG4pOworICAgICAgICBxcnNvbHY8U2NhbGFyPihzLCBxci5jb2xzUGVybXV0YXRpb24oKS5pbmRpY2VzKCksIHdhMSwgcXRiLCB4LCBzZGlhZyk7CisKKyAgICAgICAgd2EyID0gZGlhZy5jd2lzZVByb2R1Y3QoeCk7CisgICAgICAgIGR4bm9ybSA9IHdhMi5ibHVlTm9ybSgpOworICAgICAgICB0ZW1wID0gZnA7CisgICAgICAgIGZwID0gZHhub3JtIC0gZGVsdGE7CisKKyAgICAgICAgLyogaWYgdGhlIGZ1bmN0aW9uIGlzIHNtYWxsIGVub3VnaCwgYWNjZXB0IHRoZSBjdXJyZW50IHZhbHVlICovCisgICAgICAgIC8qIG9mIHBhci4gYWxzbyB0ZXN0IGZvciB0aGUgZXhjZXB0aW9uYWwgY2FzZXMgd2hlcmUgcGFybCAqLworICAgICAgICAvKiBpcyB6ZXJvIG9yIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBoYXMgcmVhY2hlZCAxMC4gKi8KKyAgICAgICAgaWYgKGFicyhmcCkgPD0gU2NhbGFyKDAuMSkgKiBkZWx0YSB8fCAocGFybCA9PSAwLiAmJiBmcCA8PSB0ZW1wICYmIHRlbXAgPCAwLikgfHwgaXRlciA9PSAxMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGNvbXB1dGUgdGhlIG5ld3RvbiBjb3JyZWN0aW9uLiAqLworICAgICAgICB3YTEgPSBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkgKiBkaWFnLmN3aXNlUHJvZHVjdCh3YTIvZHhub3JtKTsKKyAgICAgICAgLy8gd2UgY291bGQgYWxtb3N0IHVzZSB0aGlzIGhlcmUsIGJ1dCB0aGUgZGlhZ29uYWwgaXMgb3V0c2lkZSBxciwgaW4gc2RpYWdbXQorICAgICAgICAvLyBxci5tYXRyaXhRUigpLnRvcExlZnRDb3JuZXIobiwgbikudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmVJblBsYWNlKHdhMSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKKyAgICAgICAgICAgIHdhMVtqXSAvPSBzZGlhZ1tqXTsKKyAgICAgICAgICAgIHRlbXAgPSB3YTFbal07CisgICAgICAgICAgICBmb3IgKEluZGV4IGkgPSBqKzE7IGkgPCBuOyArK2kpCisgICAgICAgICAgICAgICAgd2ExW2ldIC09IHMoaSxqKSAqIHRlbXA7CisgICAgICAgIH0KKyAgICAgICAgdGVtcCA9IHdhMS5ibHVlTm9ybSgpOworICAgICAgICBwYXJjID0gZnAgLyBkZWx0YSAvIHRlbXAgLyB0ZW1wOworCisgICAgICAgIC8qIGRlcGVuZGluZyBvbiB0aGUgc2lnbiBvZiB0aGUgZnVuY3Rpb24sIHVwZGF0ZSBwYXJsIG9yIHBhcnUuICovCisgICAgICAgIGlmIChmcCA+IDAuKQorICAgICAgICAgICAgcGFybCA9IChzdGQ6Om1heCkocGFybCxwYXIpOworICAgICAgICBpZiAoZnAgPCAwLikKKyAgICAgICAgICAgIHBhcnUgPSAoc3RkOjptaW4pKHBhcnUscGFyKTsKKworICAgICAgICAvKiBjb21wdXRlIGFuIGltcHJvdmVkIGVzdGltYXRlIGZvciBwYXIuICovCisgICAgICAgIHBhciA9IChzdGQ6Om1heCkocGFybCxwYXIrcGFyYyk7CisgICAgfQorICAgIGlmIChpdGVyID09IDApCisgICAgICAgIHBhciA9IDAuOworICAgIHJldHVybjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9xcnNvbHYuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcXJzb2x2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhZmQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcXJzb2x2LmgKQEAgLTAsMCArMSw5MSBAQAorbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRPRE8gOiBvbmNlIHFyc29sdjIgaXMgcmVtb3ZlZCwgdXNlIENvbFBpdkhvdXNlaG9sZGVyUVIgb3IgUGVybXV0YXRpb25NYXRyaXggaW5zdGVhZCBvZiBpcHZ0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBxcnNvbHYoCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gJnMsCisgICAgICAgIC8vIFRPRE8gOiB1c2UgYSBQZXJtdXRhdGlvbk1hdHJpeCBvbmNlIGxtcGFyIGlzIG5vIG1vcmU6CisgICAgICAgIGNvbnN0IFZlY3RvclhpICZpcHZ0LAorICAgICAgICBjb25zdCBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMSA+ICAmZGlhZywKKyAgICAgICAgY29uc3QgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJnF0YiwKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDEgPiAgJngsCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gICZzZGlhZykKKworeworICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIEluZGV4IGksIGosIGssIGw7CisgICAgU2NhbGFyIHRlbXA7CisgICAgSW5kZXggbiA9IHMuY29scygpOworICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxID4gIHdhKG4pOworICAgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4gZ2l2ZW5zOworCisgICAgLyogRnVuY3Rpb24gQm9keSAqLworICAgIC8vIHRoZSBmb2xsb3dpbmcgd2lsbCBvbmx5IGNoYW5nZSB0aGUgbG93ZXIgdHJpYW5ndWxhciBwYXJ0IG9mIHMsIGluY2x1ZGluZworICAgIC8vIHRoZSBkaWFnb25hbCwgdGhvdWdoIHRoZSBkaWFnb25hbCBpcyByZXN0b3JlZCBhZnRlcndhcmQKKworICAgIC8qICAgICBjb3B5IHIgYW5kIChxIHRyYW5zcG9zZSkqYiB0byBwcmVzZXJ2ZSBpbnB1dCBhbmQgaW5pdGlhbGl6ZSBzLiAqLworICAgIC8qICAgICBpbiBwYXJ0aWN1bGFyLCBzYXZlIHRoZSBkaWFnb25hbCBlbGVtZW50cyBvZiByIGluIHguICovCisgICAgeCA9IHMuZGlhZ29uYWwoKTsKKyAgICB3YSA9IHF0YjsKKworICAgIHMudG9wTGVmdENvcm5lcihuLG4pLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkgPSBzLnRvcExlZnRDb3JuZXIobixuKS50cmFuc3Bvc2UoKTsKKworICAgIC8qICAgICBlbGltaW5hdGUgdGhlIGRpYWdvbmFsIG1hdHJpeCBkIHVzaW5nIGEgZ2l2ZW5zIHJvdGF0aW9uLiAqLworICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKKworICAgICAgICAvKiAgICAgICAgcHJlcGFyZSB0aGUgcm93IG9mIGQgdG8gYmUgZWxpbWluYXRlZCwgbG9jYXRpbmcgdGhlICovCisgICAgICAgIC8qICAgICAgICBkaWFnb25hbCBlbGVtZW50IHVzaW5nIHAgZnJvbSB0aGUgcXIgZmFjdG9yaXphdGlvbi4gKi8KKyAgICAgICAgbCA9IGlwdnRbal07CisgICAgICAgIGlmIChkaWFnW2xdID09IDAuKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNkaWFnLnRhaWwobi1qKS5zZXRaZXJvKCk7CisgICAgICAgIHNkaWFnW2pdID0gZGlhZ1tsXTsKKworICAgICAgICAvKiAgICAgICAgdGhlIHRyYW5zZm9ybWF0aW9ucyB0byBlbGltaW5hdGUgdGhlIHJvdyBvZiBkICovCisgICAgICAgIC8qICAgICAgICBtb2RpZnkgb25seSBhIHNpbmdsZSBlbGVtZW50IG9mIChxIHRyYW5zcG9zZSkqYiAqLworICAgICAgICAvKiAgICAgICAgYmV5b25kIHRoZSBmaXJzdCBuLCB3aGljaCBpcyBpbml0aWFsbHkgemVyby4gKi8KKyAgICAgICAgU2NhbGFyIHF0YnBqID0gMC47CisgICAgICAgIGZvciAoayA9IGo7IGsgPCBuOyArK2spIHsKKyAgICAgICAgICAgIC8qICAgICAgICAgICBkZXRlcm1pbmUgYSBnaXZlbnMgcm90YXRpb24gd2hpY2ggZWxpbWluYXRlcyB0aGUgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgICBhcHByb3ByaWF0ZSBlbGVtZW50IGluIHRoZSBjdXJyZW50IHJvdyBvZiBkLiAqLworICAgICAgICAgICAgZ2l2ZW5zLm1ha2VHaXZlbnMoLXMoayxrKSwgc2RpYWdba10pOworCisgICAgICAgICAgICAvKiAgICAgICAgICAgY29tcHV0ZSB0aGUgbW9kaWZpZWQgZGlhZ29uYWwgZWxlbWVudCBvZiByIGFuZCAqLworICAgICAgICAgICAgLyogICAgICAgICAgIHRoZSBtb2RpZmllZCBlbGVtZW50IG9mICgocSB0cmFuc3Bvc2UpKmIsMCkuICovCisgICAgICAgICAgICBzKGssaykgPSBnaXZlbnMuYygpICogcyhrLGspICsgZ2l2ZW5zLnMoKSAqIHNkaWFnW2tdOworICAgICAgICAgICAgdGVtcCA9IGdpdmVucy5jKCkgKiB3YVtrXSArIGdpdmVucy5zKCkgKiBxdGJwajsKKyAgICAgICAgICAgIHF0YnBqID0gLWdpdmVucy5zKCkgKiB3YVtrXSArIGdpdmVucy5jKCkgKiBxdGJwajsKKyAgICAgICAgICAgIHdhW2tdID0gdGVtcDsKKworICAgICAgICAgICAgLyogICAgICAgICAgIGFjY3VtdWxhdGUgdGhlIHRyYW5mb3JtYXRpb24gaW4gdGhlIHJvdyBvZiBzLiAqLworICAgICAgICAgICAgZm9yIChpID0gaysxOyBpPG47ICsraSkgeworICAgICAgICAgICAgICAgIHRlbXAgPSBnaXZlbnMuYygpICogcyhpLGspICsgZ2l2ZW5zLnMoKSAqIHNkaWFnW2ldOworICAgICAgICAgICAgICAgIHNkaWFnW2ldID0gLWdpdmVucy5zKCkgKiBzKGksaykgKyBnaXZlbnMuYygpICogc2RpYWdbaV07CisgICAgICAgICAgICAgICAgcyhpLGspID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICAgICBzb2x2ZSB0aGUgdHJpYW5ndWxhciBzeXN0ZW0gZm9yIHouIGlmIHRoZSBzeXN0ZW0gaXMgKi8KKyAgICAvKiAgICAgc2luZ3VsYXIsIHRoZW4gb2J0YWluIGEgbGVhc3Qgc3F1YXJlcyBzb2x1dGlvbi4gKi8KKyAgICBJbmRleCBuc2luZzsKKyAgICBmb3IobnNpbmc9MDsgbnNpbmc8biAmJiBzZGlhZ1tuc2luZ10hPTA7IG5zaW5nKyspIHt9CisKKyAgICB3YS50YWlsKG4tbnNpbmcpLnNldFplcm8oKTsKKyAgICBzLnRvcExlZnRDb3JuZXIobnNpbmcsIG5zaW5nKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZUluUGxhY2Uod2EuaGVhZChuc2luZykpOworCisgICAgLy8gcmVzdG9yZQorICAgIHNkaWFnID0gcy5kaWFnb25hbCgpOworICAgIHMuZGlhZ29uYWwoKSA9IHg7CisKKyAgICAvKiAgICAgcGVybXV0ZSB0aGUgY29tcG9uZW50cyBvZiB6IGJhY2sgdG8gY29tcG9uZW50cyBvZiB4LiAqLworICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHhbaXB2dFtqXV0gPSB3YVtqXTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9yMW1weXEuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcjFtcHlxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmZjcwMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcjFtcHlxLmgKQEAgLTAsMCArMSwzMCBAQAorbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFRPRE8gOiBtb3ZlIHRoaXMgdG8gR2l2ZW5zUVIgb25jZSB0aGVyZSdzIHN1Y2ggYSB0aGluZyBpbiBFaWdlbgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCByMW1weXEoRGVuc2VJbmRleCBtLCBEZW5zZUluZGV4IG4sIFNjYWxhciAqYSwgY29uc3Qgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+ICZ2X2dpdmVucywgY29uc3Qgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+ICZ3X2dpdmVucykKK3sKKyAgICB0eXBlZGVmIERlbnNlSW5kZXggSW5kZXg7CisKKyAgICAvKiAgICAgYXBwbHkgdGhlIGZpcnN0IHNldCBvZiBnaXZlbnMgcm90YXRpb25zIHRvIGEuICovCisgICAgZm9yIChJbmRleCBqID0gbi0yOyBqPj0wOyAtLWopCisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGk8bTsgKytpKSB7CisgICAgICAgICAgICBTY2FsYXIgdGVtcCA9IHZfZ2l2ZW5zW2pdLmMoKSAqIGFbaSttKmpdIC0gdl9naXZlbnNbal0ucygpICogYVtpK20qKG4tMSldOworICAgICAgICAgICAgYVtpK20qKG4tMSldID0gdl9naXZlbnNbal0ucygpICogYVtpK20qal0gKyB2X2dpdmVuc1tqXS5jKCkgKiBhW2krbSoobi0xKV07CisgICAgICAgICAgICBhW2krbSpqXSA9IHRlbXA7CisgICAgICAgIH0KKyAgICAvKiAgICAgYXBwbHkgdGhlIHNlY29uZCBzZXQgb2YgZ2l2ZW5zIHJvdGF0aW9ucyB0byBhLiAqLworICAgIGZvciAoSW5kZXggaiA9IDA7IGo8bi0xOyArK2opCisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGk8bTsgKytpKSB7CisgICAgICAgICAgICBTY2FsYXIgdGVtcCA9IHdfZ2l2ZW5zW2pdLmMoKSAqIGFbaSttKmpdICsgd19naXZlbnNbal0ucygpICogYVtpK20qKG4tMSldOworICAgICAgICAgICAgYVtpK20qKG4tMSldID0gLXdfZ2l2ZW5zW2pdLnMoKSAqIGFbaSttKmpdICsgd19naXZlbnNbal0uYygpICogYVtpK20qKG4tMSldOworICAgICAgICAgICAgYVtpK20qal0gPSB0ZW1wOworICAgICAgICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ob25MaW5lYXJPcHRpbWl6YXRpb24vcjF1cGR0LmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL3IxdXBkdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZmFlNWEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL3IxdXBkdC5oCkBAIC0wLDAgKzEsOTkgQEAKK25hbWVzcGFjZSBFaWdlbiB7IAorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCByMXVwZHQoCisgICAgICAgIE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljID4gJnMsCisgICAgICAgIGNvbnN0IE1hdHJpeDwgU2NhbGFyLCBEeW5hbWljLCAxPiAmdSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+ICZ2X2dpdmVucywKKyAgICAgICAgc3RkOjp2ZWN0b3I8SmFjb2JpUm90YXRpb248U2NhbGFyPiA+ICZ3X2dpdmVucywKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDE+ICZ2LAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgMT4gJncsCisgICAgICAgIGJvb2wgKnNpbmcpCit7CisgICAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworICAgIGNvbnN0IEphY29iaVJvdGF0aW9uPFNjYWxhcj4gSWRlbnRpdHlSb3RhdGlvbiA9IEphY29iaVJvdGF0aW9uPFNjYWxhcj4oMSwwKTsKKworICAgIC8qIExvY2FsIHZhcmlhYmxlcyAqLworICAgIGNvbnN0IEluZGV4IG0gPSBzLnJvd3MoKTsKKyAgICBjb25zdCBJbmRleCBuID0gcy5jb2xzKCk7CisgICAgSW5kZXggaSwgaj0xOworICAgIFNjYWxhciB0ZW1wOworICAgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4gZ2l2ZW5zOworCisgICAgLy8gcjF1cGR0IGhhZCBhIGJyb2FkZXIgdXNlY2FzZSwgYnV0IHdlIGRvbnQgdXNlIGl0IGhlcmUuIEFuZCwgbW9yZQorICAgIC8vIGltcG9ydGFudGx5LCB3ZSBjYW4gbm90IHRlc3QgaXQuCisgICAgYXNzZXJ0KG09PW4pOworICAgIGFzc2VydCh1LnNpemUoKT09bSk7CisgICAgYXNzZXJ0KHYuc2l6ZSgpPT1uKTsKKyAgICBhc3NlcnQody5zaXplKCk9PW4pOworCisgICAgLyogbW92ZSB0aGUgbm9udHJpdmlhbCBwYXJ0IG9mIHRoZSBsYXN0IGNvbHVtbiBvZiBzIGludG8gdy4gKi8KKyAgICB3W24tMV0gPSBzKG4tMSxuLTEpOworCisgICAgLyogcm90YXRlIHRoZSB2ZWN0b3IgdiBpbnRvIGEgbXVsdGlwbGUgb2YgdGhlIG4tdGggdW5pdCB2ZWN0b3IgKi8KKyAgICAvKiBpbiBzdWNoIGEgd2F5IHRoYXQgYSBzcGlrZSBpcyBpbnRyb2R1Y2VkIGludG8gdy4gKi8KKyAgICBmb3IgKGo9bi0yOyBqPj0wOyAtLWopIHsKKyAgICAgICAgd1tqXSA9IDAuOworICAgICAgICBpZiAodltqXSAhPSAwLikgeworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGEgZ2l2ZW5zIHJvdGF0aW9uIHdoaWNoIGVsaW1pbmF0ZXMgdGhlICovCisgICAgICAgICAgICAvKiBqLXRoIGVsZW1lbnQgb2Ygdi4gKi8KKyAgICAgICAgICAgIGdpdmVucy5tYWtlR2l2ZW5zKC12W24tMV0sIHZbal0pOworCisgICAgICAgICAgICAvKiBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gdiBhbmQgc3RvcmUgdGhlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAvKiBuZWNlc3NhcnkgdG8gcmVjb3ZlciB0aGUgZ2l2ZW5zIHJvdGF0aW9uLiAqLworICAgICAgICAgICAgdltuLTFdID0gZ2l2ZW5zLnMoKSAqIHZbal0gKyBnaXZlbnMuYygpICogdltuLTFdOworICAgICAgICAgICAgdl9naXZlbnNbal0gPSBnaXZlbnM7CisKKyAgICAgICAgICAgIC8qIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBzIGFuZCBleHRlbmQgdGhlIHNwaWtlIGluIHcuICovCisgICAgICAgICAgICBmb3IgKGkgPSBqOyBpIDwgbTsgKytpKSB7CisgICAgICAgICAgICAgICAgdGVtcCA9IGdpdmVucy5jKCkgKiBzKGosaSkgLSBnaXZlbnMucygpICogd1tpXTsKKyAgICAgICAgICAgICAgICB3W2ldID0gZ2l2ZW5zLnMoKSAqIHMoaixpKSArIGdpdmVucy5jKCkgKiB3W2ldOworICAgICAgICAgICAgICAgIHMoaixpKSA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdl9naXZlbnNbal0gPSBJZGVudGl0eVJvdGF0aW9uOworICAgIH0KKworICAgIC8qIGFkZCB0aGUgc3Bpa2UgZnJvbSB0aGUgcmFuayAxIHVwZGF0ZSB0byB3LiAqLworICAgIHcgKz0gdltuLTFdICogdTsKKworICAgIC8qIGVsaW1pbmF0ZSB0aGUgc3Bpa2UuICovCisgICAgKnNpbmcgPSBmYWxzZTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbi0xOyArK2opIHsKKyAgICAgICAgaWYgKHdbal0gIT0gMC4pIHsKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBhIGdpdmVucyByb3RhdGlvbiB3aGljaCBlbGltaW5hdGVzIHRoZSAqLworICAgICAgICAgICAgLyogai10aCBlbGVtZW50IG9mIHRoZSBzcGlrZS4gKi8KKyAgICAgICAgICAgIGdpdmVucy5tYWtlR2l2ZW5zKC1zKGosaiksIHdbal0pOworCisgICAgICAgICAgICAvKiBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gcyBhbmQgcmVkdWNlIHRoZSBzcGlrZSBpbiB3LiAqLworICAgICAgICAgICAgZm9yIChpID0gajsgaSA8IG07ICsraSkgeworICAgICAgICAgICAgICAgIHRlbXAgPSBnaXZlbnMuYygpICogcyhqLGkpICsgZ2l2ZW5zLnMoKSAqIHdbaV07CisgICAgICAgICAgICAgICAgd1tpXSA9IC1naXZlbnMucygpICogcyhqLGkpICsgZ2l2ZW5zLmMoKSAqIHdbaV07CisgICAgICAgICAgICAgICAgcyhqLGkpID0gdGVtcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3RvcmUgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byByZWNvdmVyIHRoZSAqLworICAgICAgICAgICAgLyogZ2l2ZW5zIHJvdGF0aW9uLiAqLworICAgICAgICAgICAgd19naXZlbnNbal0gPSBnaXZlbnM7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdl9naXZlbnNbal0gPSBJZGVudGl0eVJvdGF0aW9uOworCisgICAgICAgIC8qIHRlc3QgZm9yIHplcm8gZGlhZ29uYWwgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBzLiAqLworICAgICAgICBpZiAocyhqLGopID09IDAuKSB7CisgICAgICAgICAgICAqc2luZyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogbW92ZSB3IGJhY2sgaW50byB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIG91dHB1dCBzLiAqLworICAgIHMobi0xLG4tMSkgPSB3W24tMV07CisKKyAgICBpZiAocyhqLGopID09IDAuKSB7CisgICAgICAgICpzaW5nID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTm9uTGluZWFyT3B0aW1pemF0aW9uL3J3dXBkdC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9yd3VwZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2UwNzllCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL05vbkxpbmVhck9wdGltaXphdGlvbi9yd3VwZHQuaApAQCAtMCwwICsxLDQ5IEBACituYW1lc3BhY2UgRWlnZW4geyAKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgcnd1cGR0KAorICAgICAgICBNYXRyaXg8IFNjYWxhciwgRHluYW1pYywgRHluYW1pYyA+ICAmciwKKyAgICAgICAgY29uc3QgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDE+ICAmdywKKyAgICAgICAgTWF0cml4PCBTY2FsYXIsIER5bmFtaWMsIDE+ICAmYiwKKyAgICAgICAgU2NhbGFyIGFscGhhKQoreworICAgIHR5cGVkZWYgRGVuc2VJbmRleCBJbmRleDsKKworICAgIGNvbnN0IEluZGV4IG4gPSByLmNvbHMoKTsKKyAgICBhc3NlcnQoci5yb3dzKCk+PW4pOworICAgIHN0ZDo6dmVjdG9yPEphY29iaVJvdGF0aW9uPFNjYWxhcj4gPiBnaXZlbnMobik7CisKKyAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBTY2FsYXIgdGVtcCwgcm93ajsKKworICAgIC8qIEZ1bmN0aW9uIEJvZHkgKi8KKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgIHJvd2ogPSB3W2pdOworCisgICAgICAgIC8qIGFwcGx5IHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1hdGlvbnMgdG8gKi8KKyAgICAgICAgLyogcihpLGopLCBpPTAsMSwuLi4sai0xLCBhbmQgdG8gdyhqKS4gKi8KKyAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IGo7ICsraSkgeworICAgICAgICAgICAgdGVtcCA9IGdpdmVuc1tpXS5jKCkgKiByKGksaikgKyBnaXZlbnNbaV0ucygpICogcm93ajsKKyAgICAgICAgICAgIHJvd2ogPSAtZ2l2ZW5zW2ldLnMoKSAqIHIoaSxqKSArIGdpdmVuc1tpXS5jKCkgKiByb3dqOworICAgICAgICAgICAgcihpLGopID0gdGVtcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRldGVybWluZSBhIGdpdmVucyByb3RhdGlvbiB3aGljaCBlbGltaW5hdGVzIHcoaikuICovCisgICAgICAgIGdpdmVuc1tqXS5tYWtlR2l2ZW5zKC1yKGosaiksIHJvd2opOworCisgICAgICAgIGlmIChyb3dqID09IDAuKQorICAgICAgICAgICAgY29udGludWU7IC8vIGdpdmVuc1tqXSBpcyBpZGVudGl0eQorCisgICAgICAgIC8qIGFwcGx5IHRoZSBjdXJyZW50IHRyYW5zZm9ybWF0aW9uIHRvIHIoaixqKSwgYihqKSwgYW5kIGFscGhhLiAqLworICAgICAgICByKGosaikgPSBnaXZlbnNbal0uYygpICogcihqLGopICsgZ2l2ZW5zW2pdLnMoKSAqIHJvd2o7CisgICAgICAgIHRlbXAgPSBnaXZlbnNbal0uYygpICogYltqXSArIGdpdmVuc1tqXS5zKCkgKiBhbHBoYTsKKyAgICAgICAgYWxwaGEgPSAtZ2l2ZW5zW2pdLnMoKSAqIGJbal0gKyBnaXZlbnNbal0uYygpICogYWxwaGE7CisgICAgICAgIGJbal0gPSB0ZW1wOworICAgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL051bWVyaWNhbERpZmYvQ01ha2VMaXN0cy50eHQgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTnVtZXJpY2FsRGlmZi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTk5YWNhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL051bWVyaWNhbERpZmYvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fTnVtZXJpY2FsRGlmZl9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fTnVtZXJpY2FsRGlmZl9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9OdW1lcmljYWxEaWZmIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTnVtZXJpY2FsRGlmZi9OdW1lcmljYWxEaWZmLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvTnVtZXJpY2FsRGlmZi9OdW1lcmljYWxEaWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0OGNiNAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9OdW1lcmljYWxEaWZmL051bWVyaWNhbERpZmYuaApAQCAtMCwwICsxLDEyOCBAQAorLy8gLSotIGNvZGluZzogdXRmLTgKKy8vIHZpbTogc2V0IGZpbGVlbmNvZGluZz11dGYtOAorCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9OVU1FUklDQUxfRElGRl9ICisjZGVmaW5lIEVJR0VOX05VTUVSSUNBTF9ESUZGX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK2VudW0gTnVtZXJpY2FsRGlmZk1vZGUgeworICAgIEZvcndhcmQsCisgICAgQ2VudHJhbAorfTsKKworCisvKioKKyAgKiBUaGlzIGNsYXNzIGFsbG93cyB5b3UgdG8gYWRkIGEgbWV0aG9kIGRmKCkgdG8geW91ciBmdW5jdG9yLCB3aGljaCB3aWxsIAorICAqIHVzZSBudW1lcmljYWwgZGlmZmVyZW50aWF0aW9uIHRvIGNvbXB1dGUgYW4gYXBwcm94aW1hdGUgb2YgdGhlCisgICogZGVyaXZhdGl2ZSBmb3IgdGhlIGZ1bmN0b3IuIE9mIGNvdXJzZSwgaWYgeW91IGhhdmUgYW4gYW5hbHl0aWNhbCBmb3JtCisgICogZm9yIHRoZSBkZXJpdmF0aXZlLCB5b3Ugc2hvdWxkIHJhdGhlciBpbXBsZW1lbnQgZGYoKSBieSB5b3Vyc2VsZi4KKyAgKgorICAqIE1vcmUgaW5mb3JtYXRpb24gb24KKyAgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL051bWVyaWNhbF9kaWZmZXJlbnRpYXRpb24KKyAgKgorICAqIEN1cnJlbnRseSBvbmx5ICJGb3J3YXJkIiBhbmQgIkNlbnRyYWwiIHNjaGVtZSBhcmUgaW1wbGVtZW50ZWQuCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgTnVtZXJpY2FsRGlmZk1vZGUgbW9kZT1Gb3J3YXJkPgorY2xhc3MgTnVtZXJpY2FsRGlmZiA6IHB1YmxpYyBfRnVuY3RvcgoreworcHVibGljOgorICAgIHR5cGVkZWYgX0Z1bmN0b3IgRnVuY3RvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0b3I6OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jdG9yOjpJbnB1dFR5cGUgSW5wdXRUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuY3Rvcjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmN0b3I6OkphY29iaWFuVHlwZSBKYWNvYmlhblR5cGU7CisKKyAgICBOdW1lcmljYWxEaWZmKFNjYWxhciBfZXBzZmNuPTAuKSA6IEZ1bmN0b3IoKSwgZXBzZmNuKF9lcHNmY24pIHt9CisgICAgTnVtZXJpY2FsRGlmZihjb25zdCBGdW5jdG9yJiBmLCBTY2FsYXIgX2Vwc2Zjbj0wLikgOiBGdW5jdG9yKGYpLCBlcHNmY24oX2Vwc2Zjbikge30KKworICAgIC8vIGZvcndhcmQgY29uc3RydWN0b3JzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDA+CisgICAgICAgIE51bWVyaWNhbERpZmYoY29uc3QgVDAmIGEwKSA6IEZ1bmN0b3IoYTApLCBlcHNmY24oMCkge30KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CisgICAgICAgIE51bWVyaWNhbERpZmYoY29uc3QgVDAmIGEwLCBjb25zdCBUMSYgYTEpIDogRnVuY3RvcihhMCwgYTEpLCBlcHNmY24oMCkge30KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgICAgICBOdW1lcmljYWxEaWZmKGNvbnN0IFQwJiBhMCwgY29uc3QgVDEmIGExLCBjb25zdCBUMiYgYTIpIDogRnVuY3RvcihhMCwgYTEsIGEyKSwgZXBzZmNuKDApIHt9CisKKyAgICBlbnVtIHsKKyAgICAgICAgSW5wdXRzQXRDb21waWxlVGltZSA9IEZ1bmN0b3I6OklucHV0c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIFZhbHVlc0F0Q29tcGlsZVRpbWUgPSBGdW5jdG9yOjpWYWx1ZXNBdENvbXBpbGVUaW1lCisgICAgfTsKKworICAgIC8qKgorICAgICAgKiByZXR1cm4gdGhlIG51bWJlciBvZiBldmFsdWF0aW9uIG9mIGZ1bmN0b3IKKyAgICAgKi8KKyAgICBpbnQgZGYoY29uc3QgSW5wdXRUeXBlJiBfeCwgSmFjb2JpYW5UeXBlICZqYWMpIGNvbnN0CisgICAgeworICAgICAgICAvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKyAgICAgICAgU2NhbGFyIGg7CisgICAgICAgIGludCBuZmV2PTA7CisgICAgICAgIGNvbnN0IHR5cGVuYW1lIElucHV0VHlwZTo6SW5kZXggbiA9IF94LnNpemUoKTsKKyAgICAgICAgY29uc3QgU2NhbGFyIGVwcyA9IGludGVybmFsOjpzcXJ0KCgoc3RkOjptYXgpKGVwc2ZjbixOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpICkpKTsKKyAgICAgICAgVmFsdWVUeXBlIHZhbDEsIHZhbDI7CisgICAgICAgIElucHV0VHlwZSB4ID0gX3g7CisgICAgICAgIC8vIFRPRE8gOiB3ZSBzaG91bGQgZG8gdGhpcyBvbmx5IGlmIHRoZSBzaXplIGlzIG5vdCBhbHJlYWR5IGtub3duCisgICAgICAgIHZhbDEucmVzaXplKEZ1bmN0b3I6OnZhbHVlcygpKTsKKyAgICAgICAgdmFsMi5yZXNpemUoRnVuY3Rvcjo6dmFsdWVzKCkpOworCisgICAgICAgIC8vIGluaXRpYWxpemF0aW9uCisgICAgICAgIHN3aXRjaChtb2RlKSB7CisgICAgICAgICAgICBjYXNlIEZvcndhcmQ6CisgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBmKHgpCisgICAgICAgICAgICAgICAgRnVuY3Rvcjo6b3BlcmF0b3IoKSh4LCB2YWwxKTsgbmZldisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDZW50cmFsOgorICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBGdW5jdGlvbiBCb2R5CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgICAgICBoID0gZXBzICogaW50ZXJuYWw6OmFicyh4W2pdKTsKKyAgICAgICAgICAgIGlmIChoID09IDAuKSB7CisgICAgICAgICAgICAgICAgaCA9IGVwczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaChtb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGb3J3YXJkOgorICAgICAgICAgICAgICAgICAgICB4W2pdICs9IGg7CisgICAgICAgICAgICAgICAgICAgIEZ1bmN0b3I6Om9wZXJhdG9yKCkoeCwgdmFsMik7CisgICAgICAgICAgICAgICAgICAgIG5mZXYrKzsKKyAgICAgICAgICAgICAgICAgICAgeFtqXSA9IF94W2pdOworICAgICAgICAgICAgICAgICAgICBqYWMuY29sKGopID0gKHZhbDItdmFsMSkvaDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDZW50cmFsOgorICAgICAgICAgICAgICAgICAgICB4W2pdICs9IGg7CisgICAgICAgICAgICAgICAgICAgIEZ1bmN0b3I6Om9wZXJhdG9yKCkoeCwgdmFsMik7IG5mZXYrKzsKKyAgICAgICAgICAgICAgICAgICAgeFtqXSAtPSAyKmg7CisgICAgICAgICAgICAgICAgICAgIEZ1bmN0b3I6Om9wZXJhdG9yKCkoeCwgdmFsMSk7IG5mZXYrKzsKKyAgICAgICAgICAgICAgICAgICAgeFtqXSA9IF94W2pdOworICAgICAgICAgICAgICAgICAgICBqYWMuY29sKGopID0gKHZhbDItdmFsMSkvKDIqaCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZmV2OworICAgIH0KK3ByaXZhdGU6CisgICAgU2NhbGFyIGVwc2ZjbjsKKworICAgIE51bWVyaWNhbERpZmYmIG9wZXJhdG9yPShjb25zdCBOdW1lcmljYWxEaWZmJik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworLy92aW06IGFpIHRzPTQgc3RzPTQgZXQgc3c9NAorI2VuZGlmIC8vIEVJR0VOX05VTUVSSUNBTF9ESUZGX0gKKwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1BvbHlub21pYWxzL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1BvbHlub21pYWxzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjEzZjMKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fUG9seW5vbWlhbHNfU1JDUyAiKi5oIikKKworSU5TVEFMTChGSUxFUworICAke0VpZ2VuX1BvbHlub21pYWxzX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1BvbHlub21pYWxzIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvQ29tcGFuaW9uLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvQ29tcGFuaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhZGQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Qb2x5bm9taWFscy9Db21wYW5pb24uaApAQCAtMCwwICsxLDI3NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgTWFudWVsIFlndWVsIDxtYW51ZWwueWd1ZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9DT01QQU5JT05fSAorI2RlZmluZSBFSUdFTl9DT01QQU5JT05fSAorCisvLyBUaGlzIGZpbGUgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaW5jbHVkZQorLy8gKiBFaWdlbi9Db3JlCisvLyAqIEVpZ2VuL3NyYy9Qb2x5bm9taWFsU29sdmVyLmgKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIHJhZGl4KCl7IHJldHVybiAyOyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCByYWRpeDIoKXsgcmV0dXJuIHJhZGl4PFQ+KCkqcmFkaXg8VD4oKTsgfQorCit0ZW1wbGF0ZTxpbnQgU2l6ZT4KK3N0cnVjdCBkZWNyZW1lbnRfaWZfZml4ZWRfc2l6ZQoreworICBlbnVtIHsKKyAgICByZXQgPSAoU2l6ZSA9PSBEeW5hbWljKSA/IER5bmFtaWMgOiBTaXplLTEgfTsKK307CisKKyNlbmRpZgorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX1NjYWxhciwgaW50IF9EZWcgPgorY2xhc3MgY29tcGFuaW9uCit7CisgIHB1YmxpYzoKKyAgICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKF9TY2FsYXIsX0RlZz09RHluYW1pYyA/IER5bmFtaWMgOiBfRGVnKQorCisgICAgZW51bSB7CisgICAgICBEZWcgPSBfRGVnLAorICAgICAgRGVnXzE9ZGVjcmVtZW50X2lmX2ZpeGVkX3NpemU8RGVnPjo6cmV0CisgICAgfTsKKworICAgIHR5cGVkZWYgX1NjYWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgICAgICAgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERlZywgMT4gICAgICAgICAgICAgICAgIFJpZ2h0Q29sdW1uOworICAgIC8vdHlwZWRlZiBEaWFnb25hbE1hdHJpeDwgU2NhbGFyLCBEZWdfMSwgRGVnXzEgPiBCb3R0b21MZWZ0RGlhZ29uYWw7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEZWdfMSwgMT4gICAgICAgICAgICAgICBCb3R0b21MZWZ0RGlhZ29uYWw7CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERlZywgRGVnPiAgICAgICAgICAgICAgIERlbnNlQ29tcGFuaW9uTWF0cml4VHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDwgU2NhbGFyLCBfRGVnLCBEZWdfMSA+ICAgICAgICAgIExlZnRCbG9jazsKKyAgICB0eXBlZGVmIE1hdHJpeDwgU2NhbGFyLCBEZWdfMSwgRGVnXzEgPiAgICAgICAgIEJvdHRvbUxlZnRCbG9jazsKKyAgICB0eXBlZGVmIE1hdHJpeDwgU2NhbGFyLCAxLCBEZWdfMSA+ICAgICAgICAgICAgIExlZnRCbG9ja0ZpcnN0Um93OworCisgICAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworCisgIHB1YmxpYzoKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IF9TY2FsYXIgb3BlcmF0b3IoKShJbmRleCByb3csIEluZGV4IGNvbCApIGNvbnN0CisgICAgeworICAgICAgaWYoIG1fYmxfZGlhZy5yb3dzKCkgPiBjb2wgKQorICAgICAgeworICAgICAgICBpZiggMCA8IHJvdyApeyByZXR1cm4gbV9ibF9kaWFnW2NvbF07IH0KKyAgICAgICAgZWxzZXsgcmV0dXJuIDA7IH0KKyAgICAgIH0KKyAgICAgIGVsc2V7IHJldHVybiBtX21vbmljW3Jvd107IH0KKyAgICB9CisKKyAgcHVibGljOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+CisgICAgdm9pZCBzZXRQb2x5bm9taWFsKCBjb25zdCBWZWN0b3JUeXBlJiBwb2x5ICkKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBkZWcgPSBwb2x5LnNpemUoKS0xOworICAgICAgbV9tb25pYyA9IC0xL3BvbHlbZGVnXSAqIHBvbHkuaGVhZChkZWcpOworICAgICAgLy9tX2JsX2RpYWcuc2V0SWRlbnRpdHkoIGRlZy0xICk7CisgICAgICBtX2JsX2RpYWcuc2V0T25lcyhkZWctMSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4KKyAgICBjb21wYW5pb24oIGNvbnN0IFZlY3RvclR5cGUmIHBvbHkgKXsKKyAgICAgIHNldFBvbHlub21pYWwoIHBvbHkgKTsgfQorCisgIHB1YmxpYzoKKyAgICBEZW5zZUNvbXBhbmlvbk1hdHJpeFR5cGUgZGVuc2VNYXRyaXgoKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IGRlZyAgID0gbV9tb25pYy5zaXplKCk7CisgICAgICBjb25zdCBJbmRleCBkZWdfMSA9IGRlZy0xOworICAgICAgRGVuc2VDb21wYW5pb25NYXRyaXhUeXBlIGNvbXBhbmlvbihkZWcsZGVnKTsKKyAgICAgIGNvbXBhbmlvbiA8PAorICAgICAgICAoIExlZnRCbG9jayhkZWcsZGVnXzEpCisgICAgICAgICAgPDwgTGVmdEJsb2NrRmlyc3RSb3c6Olplcm8oMSxkZWdfMSksCisgICAgICAgICAgQm90dG9tTGVmdEJsb2NrOjpJZGVudGl0eShkZWctMSxkZWctMSkqbV9ibF9kaWFnLmFzRGlhZ29uYWwoKSApLmZpbmlzaGVkKCkKKyAgICAgICAgLCBtX21vbmljOworICAgICAgcmV0dXJuIGNvbXBhbmlvbjsKKyAgICB9CisKKworCisgIHByb3RlY3RlZDoKKyAgICAvKiogSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgYmFsYW5jaW5nIGFsZ29yaXRobS4KKyAgICAgKiBccmV0dXJucyB0cnVlIGlmIHRoZSByb3cgYW5kIHRoZSBjb2x1bW4sIGhhdmluZyBjb2xOb3JtIGFuZCByb3dOb3JtCisgICAgICogYXMgbm9ybXMsIGFyZSBiYWxhbmNlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIGNvbEIgYW5kIHJvd0IgYXJlIHJlcGVjdGl2ZWx5IHRoZSBtdWx0aXBsaWVycyBmb3IKKyAgICAgKiB0aGUgY29sdW1uIGFuZCB0aGUgcm93IGluIG9yZGVyIHRvIGJhbGFuY2UgdGhlbS4KKyAgICAgKiAqLworICAgIGJvb2wgYmFsYW5jZWQoIFNjYWxhciBjb2xOb3JtLCBTY2FsYXIgcm93Tm9ybSwKKyAgICAgICAgYm9vbCYgaXNCYWxhbmNlZCwgU2NhbGFyJiBjb2xCLCBTY2FsYXImIHJvd0IgKTsKKworICAgIC8qKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBiYWxhbmNpbmcgYWxnb3JpdGhtLgorICAgICAqIFxyZXR1cm5zIHRydWUgaWYgdGhlIHJvdyBhbmQgdGhlIGNvbHVtbiwgaGF2aW5nIGNvbE5vcm0gYW5kIHJvd05vcm0KKyAgICAgKiBhcyBub3JtcywgYXJlIGJhbGFuY2VkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogY29sQiBhbmQgcm93QiBhcmUgcmVwZWN0aXZlbHkgdGhlIG11bHRpcGxpZXJzIGZvcgorICAgICAqIHRoZSBjb2x1bW4gYW5kIHRoZSByb3cgaW4gb3JkZXIgdG8gYmFsYW5jZSB0aGVtLgorICAgICAqICovCisgICAgYm9vbCBiYWxhbmNlZFIoIFNjYWxhciBjb2xOb3JtLCBTY2FsYXIgcm93Tm9ybSwKKyAgICAgICAgYm9vbCYgaXNCYWxhbmNlZCwgU2NhbGFyJiBjb2xCLCBTY2FsYXImIHJvd0IgKTsKKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQmFsYW5jaW5nIGFsZ29yaXRobSBmcm9tIEIuIE4uIFBBUkxFVFQgYW5kIEMuIFJFSU5TQ0ggKDE5NjkpCisgICAgICogIkJhbGFuY2luZyBhIG1hdHJpeCBmb3IgY2FsY3VsYXRpb24gb2YgZWlnZW52YWx1ZXMgYW5kIGVpZ2VudmVjdG9ycyIKKyAgICAgKiBhZGFwdGVkIHRvIHRoZSBjYXNlIG9mIGNvbXBhbmlvbiBtYXRyaWNlcy4KKyAgICAgKiBBIG1hdHJpeCB3aXRoIG5vbiB6ZXJvIHJvdyBhbmQgbm9uIHplcm8gY29sdW1uIGlzIGJhbGFuY2VkCisgICAgICogZm9yIGEgY2VydGFpbiBub3JtIGlmIHRoZSBpLXRoIHJvdyBhbmQgdGhlIGktdGggY29sdW1uCisgICAgICogaGF2ZSBzYW1lIG5vcm0gZm9yIGFsbCBpLgorICAgICAqLworICAgIHZvaWQgYmFsYW5jZSgpOworCisgIHByb3RlY3RlZDoKKyAgICAgIFJpZ2h0Q29sdW1uICAgICAgICAgICAgICAgIG1fbW9uaWM7CisgICAgICBCb3R0b21MZWZ0RGlhZ29uYWwgICAgICAgICBtX2JsX2RpYWc7Cit9OworCisKKwordGVtcGxhdGU8IHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGVnID4KK2lubGluZQorYm9vbCBjb21wYW5pb248X1NjYWxhcixfRGVnPjo6YmFsYW5jZWQoIFNjYWxhciBjb2xOb3JtLCBTY2FsYXIgcm93Tm9ybSwKKyAgICBib29sJiBpc0JhbGFuY2VkLCBTY2FsYXImIGNvbEIsIFNjYWxhciYgcm93QiApCit7CisgIGlmKCBTY2FsYXIoMCkgPT0gY29sTm9ybSB8fCBTY2FsYXIoMCkgPT0gcm93Tm9ybSApeyByZXR1cm4gdHJ1ZTsgfQorICBlbHNlCisgIHsKKyAgICAvL1RvIGZpbmQgdGhlIGJhbGFuY2luZyBjb2VmZmljaWVudHMsIGlmIHRoZSByYWRpeCBpcyAyLAorICAgIC8vb25lIGZpbmRzIFxmJCBcc2lnbWEgXGYkIHN1Y2ggdGhhdAorICAgIC8vIFxmJCAyXnsyXHNpZ21hLTF9IDwgcm93Tm9ybSAvIGNvbE5vcm0gXGxlIDJeezJcc2lnbWErMX0gXGYkCisgICAgLy8gdGhlbiB0aGUgYmFsYW5jaW5nIGNvZWZmaWNpZW50IGZvciB0aGUgcm93IGlzIFxmJCAxLzJee1xzaWdtYX0gXGYkCisgICAgLy8gYW5kIHRoZSBiYWxhbmNpbmcgY29lZmZpY2llbnQgZm9yIHRoZSBjb2x1bW4gaXMgXGYkIDJee1xzaWdtYX0gXGYkCisgICAgcm93QiA9IHJvd05vcm0gLyByYWRpeDxTY2FsYXI+KCk7CisgICAgY29sQiA9IFNjYWxhcigxKTsKKyAgICBjb25zdCBTY2FsYXIgcyA9IGNvbE5vcm0gKyByb3dOb3JtOworCisgICAgd2hpbGUgKGNvbE5vcm0gPCByb3dCKQorICAgIHsKKyAgICAgIGNvbEIgKj0gcmFkaXg8U2NhbGFyPigpOworICAgICAgY29sTm9ybSAqPSByYWRpeDI8U2NhbGFyPigpOworICAgIH0KKworICAgIHJvd0IgPSByb3dOb3JtICogcmFkaXg8U2NhbGFyPigpOworCisgICAgd2hpbGUgKGNvbE5vcm0gPj0gcm93QikKKyAgICB7CisgICAgICBjb2xCIC89IHJhZGl4PFNjYWxhcj4oKTsKKyAgICAgIGNvbE5vcm0gLz0gcmFkaXgyPFNjYWxhcj4oKTsKKyAgICB9CisKKyAgICAvL1RoaXMgbGluZSBpcyB1c2VkIHRvIGF2b2lkIGluc3Vic3RhbnRpYWwgYmFsYW5jaW5nCisgICAgaWYgKChyb3dOb3JtICsgY29sTm9ybSkgPCBTY2FsYXIoMC45NSkgKiBzICogY29sQikKKyAgICB7CisgICAgICBpc0JhbGFuY2VkID0gZmFsc2U7CisgICAgICByb3dCID0gU2NhbGFyKDEpIC8gY29sQjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgIHJldHVybiB0cnVlOyB9CisgIH0KK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGVnID4KK2lubGluZQorYm9vbCBjb21wYW5pb248X1NjYWxhcixfRGVnPjo6YmFsYW5jZWRSKCBTY2FsYXIgY29sTm9ybSwgU2NhbGFyIHJvd05vcm0sCisgICAgYm9vbCYgaXNCYWxhbmNlZCwgU2NhbGFyJiBjb2xCLCBTY2FsYXImIHJvd0IgKQoreworICBpZiggU2NhbGFyKDApID09IGNvbE5vcm0gfHwgU2NhbGFyKDApID09IHJvd05vcm0gKXsgcmV0dXJuIHRydWU7IH0KKyAgZWxzZQorICB7CisgICAgLyoqCisgICAgICogU2V0IHRoZSBub3JtIG9mIHRoZSBjb2x1bW4gYW5kIHRoZSByb3cgdG8gdGhlIGdlb21ldHJpYyBtZWFuCisgICAgICogb2YgdGhlIHJvdyBhbmQgY29sdW1uIG5vcm0KKyAgICAgKi8KKyAgICBjb25zdCBfU2NhbGFyIHEgPSBjb2xOb3JtL3Jvd05vcm07CisgICAgaWYoICFpc0FwcHJveCggcSwgX1NjYWxhcigxKSApICkKKyAgICB7CisgICAgICByb3dCID0gc3FydCggY29sTm9ybS9yb3dOb3JtICk7CisgICAgICBjb2xCID0gU2NhbGFyKDEpL3Jvd0I7CisKKyAgICAgIGlzQmFsYW5jZWQgPSBmYWxzZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgIHJldHVybiB0cnVlOyB9CisgIH0KK30KKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX1NjYWxhciwgaW50IF9EZWcgPgordm9pZCBjb21wYW5pb248X1NjYWxhcixfRGVnPjo6YmFsYW5jZSgpCit7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoIERlZyA9PSBEeW5hbWljIHx8IDEgPCBEZWcsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSApOworICBjb25zdCBJbmRleCBkZWcgICA9IG1fbW9uaWMuc2l6ZSgpOworICBjb25zdCBJbmRleCBkZWdfMSA9IGRlZy0xOworCisgIGJvb2wgaGFzQ29udmVyZ2VkPWZhbHNlOworICB3aGlsZSggIWhhc0NvbnZlcmdlZCApCisgIHsKKyAgICBoYXNDb252ZXJnZWQgPSB0cnVlOworICAgIFNjYWxhciBjb2xOb3JtLHJvd05vcm07CisgICAgU2NhbGFyIGNvbEIscm93QjsKKworICAgIC8vRmlyc3Qgcm93LCBmaXJzdCBjb2x1bW4gZXhjbHVkaW5nIHRoZSBkaWFnb25hbAorICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGNvbE5vcm0gPSBhYnMobV9ibF9kaWFnWzBdKTsKKyAgICByb3dOb3JtID0gYWJzKG1fbW9uaWNbMF0pOworCisgICAgLy9Db21wdXRlIGJhbGFuY2luZyBvZiB0aGUgcm93IGFuZCB0aGUgY29sdW1uCisgICAgaWYoICFiYWxhbmNlZCggY29sTm9ybSwgcm93Tm9ybSwgaGFzQ29udmVyZ2VkLCBjb2xCLCByb3dCICkgKQorICAgIHsKKyAgICAgIG1fYmxfZGlhZ1swXSAqPSBjb2xCOworICAgICAgbV9tb25pY1swXSAqPSByb3dCOworICAgIH0KKworICAgIC8vTWlkZGxlIHJvd3MgYW5kIGNvbHVtbnMgZXhjbHVkaW5nIHRoZSBkaWFnb25hbAorICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGZvciggSW5kZXggaT0xOyBpPGRlZ18xOyArK2kgKQorICAgIHsKKyAgICAgIC8vIGNvbHVtbiBub3JtLCBleGNsdWRpbmcgdGhlIGRpYWdvbmFsCisgICAgICBjb2xOb3JtID0gYWJzKG1fYmxfZGlhZ1tpXSk7CisKKyAgICAgIC8vIHJvdyBub3JtLCBleGNsdWRpbmcgdGhlIGRpYWdvbmFsCisgICAgICByb3dOb3JtID0gYWJzKG1fYmxfZGlhZ1tpLTFdKSArIGFicyhtX21vbmljW2ldKTsKKworICAgICAgLy9Db21wdXRlIGJhbGFuY2luZyBvZiB0aGUgcm93IGFuZCB0aGUgY29sdW1uCisgICAgICBpZiggIWJhbGFuY2VkKCBjb2xOb3JtLCByb3dOb3JtLCBoYXNDb252ZXJnZWQsIGNvbEIsIHJvd0IgKSApCisgICAgICB7CisgICAgICAgIG1fYmxfZGlhZ1tpXSAgICo9IGNvbEI7CisgICAgICAgIG1fYmxfZGlhZ1tpLTFdICo9IHJvd0I7CisgICAgICAgIG1fbW9uaWNbaV0gICAgICo9IHJvd0I7CisgICAgICB9CisgICAgfQorCisgICAgLy9MYXN0IHJvdywgbGFzdCBjb2x1bW4gZXhjbHVkaW5nIHRoZSBkaWFnb25hbAorICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBjb25zdCBJbmRleCBlYmwgPSBtX2JsX2RpYWcuc2l6ZSgpLTE7CisgICAgVmVjdG9yQmxvY2s8UmlnaHRDb2x1bW4sRGVnXzE+IGhlYWRNb25pYyggbV9tb25pYywgMCwgZGVnXzEgKTsKKyAgICBjb2xOb3JtID0gaGVhZE1vbmljLmFycmF5KCkuYWJzKCkuc3VtKCk7CisgICAgcm93Tm9ybSA9IGFicyggbV9ibF9kaWFnW2VibF0gKTsKKworICAgIC8vQ29tcHV0ZSBiYWxhbmNpbmcgb2YgdGhlIHJvdyBhbmQgdGhlIGNvbHVtbgorICAgIGlmKCAhYmFsYW5jZWQoIGNvbE5vcm0sIHJvd05vcm0sIGhhc0NvbnZlcmdlZCwgY29sQiwgcm93QiApICkKKyAgICB7CisgICAgICBoZWFkTW9uaWMgICAgICAqPSBjb2xCOworICAgICAgbV9ibF9kaWFnW2VibF0gKj0gcm93QjsKKyAgICB9CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09NUEFOSU9OX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Qb2x5bm9taWFscy9Qb2x5bm9taWFsU29sdmVyLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvUG9seW5vbWlhbFNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjg3M2QKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvUG9seW5vbWlhbFNvbHZlci5oCkBAIC0wLDAgKzEsMzg2IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBNYW51ZWwgWWd1ZWwgPG1hbnVlbC55Z3VlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1BPTFlOT01JQUxfU09MVkVSX0gKKyNkZWZpbmUgRUlHRU5fUE9MWU5PTUlBTF9TT0xWRVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxpbmdyb3VwIFBvbHlub21pYWxzX01vZHVsZQorICogIFxjbGFzcyBQb2x5bm9taWFsU29sdmVyQmFzZS4KKyAqCisgKiBcYnJpZWYgRGVmaW5lZCB0byBiZSBpbmhlcml0ZWQgYnkgcG9seW5vbWlhbCBzb2x2ZXJzOiBpdCBwcm92aWRlcworICogY29udmVuaWVudCBtZXRob2RzIHN1Y2ggYXMKKyAqICAtIHJlYWwgcm9vdHMsCisgKiAgLSBncmVhdGVzdCwgc21hbGxlc3QgY29tcGxleCByb290cywKKyAqICAtIHJlYWwgcm9vdHMgd2l0aCBncmVhdGVzdCwgc21hbGxlc3QgYWJzb2x1dGUgcmVhbCB2YWx1ZSwKKyAqICAtIGdyZWF0ZXN0LCBzbWFsbGVzdCByZWFsIHJvb3RzLgorICoKKyAqIEl0IHN0b3JlcyB0aGUgc2V0IG9mIHJvb3RzIGFzIGEgdmVjdG9yIG9mIGNvbXBsZXhlcy4KKyAqCisgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RlZyA+CitjbGFzcyBQb2x5bm9taWFsU29sdmVyQmFzZQoreworICBwdWJsaWM6CisgICAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRl9WRUNUT1JJWkFCTEVfRklYRURfU0laRShfU2NhbGFyLF9EZWc9PUR5bmFtaWMgPyBEeW5hbWljIDogX0RlZykKKworICAgIHR5cGVkZWYgX1NjYWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgICAgUmVhbFNjYWxhcjsKKyAgICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiAgICAgICAgICAgIFJvb3RUeXBlOworICAgIHR5cGVkZWYgTWF0cml4PFJvb3RUeXBlLF9EZWcsMT4gICAgICAgICAgICAgUm9vdHNUeXBlOworCisgICAgdHlwZWRlZiBEZW5zZUluZGV4IEluZGV4OworCisgIHByb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXJQb2x5bm9taWFsID4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb2x5bm9taWFsKCBjb25zdCBPdGhlclBvbHlub21pYWwmIHBvbHkgKXsKKyAgICAgIG1fcm9vdHMucmVzaXplKHBvbHkuc2l6ZSgpKTsgfQorCisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXJQb2x5bm9taWFsID4KKyAgICBpbmxpbmUgUG9seW5vbWlhbFNvbHZlckJhc2UoIGNvbnN0IE90aGVyUG9seW5vbWlhbCYgcG9seSApeworICAgICAgc2V0UG9seW5vbWlhbCggcG9seSgpICk7IH0KKworICAgIGlubGluZSBQb2x5bm9taWFsU29sdmVyQmFzZSgpe30KKworICBwdWJsaWM6CisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb21wbGV4IHJvb3RzIG9mIHRoZSBwb2x5bm9taWFsICovCisgICAgaW5saW5lIGNvbnN0IFJvb3RzVHlwZSYgcm9vdHMoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RzOyB9CisKKyAgcHVibGljOgorICAgIC8qKiBDbGVhciBhbmQgZmlsbHMgdGhlIGJhY2sgaW5zZXJ0aW9uIHNlcXVlbmNlIHdpdGggdGhlIHJlYWwgcm9vdHMgb2YgdGhlIHBvbHlub21pYWwKKyAgICAgKiBpLmUuIHRoZSByZWFsIHBhcnQgb2YgdGhlIGNvbXBsZXggcm9vdHMgdGhhdCBoYXZlIGFuIGltYWdpbmFyeSBwYXJ0IHdoaWNoCisgICAgICogYWJzb2x1dGUgdmFsdWUgaXMgc21hbGxlciB0aGFuIGFic0ltYWdpbmFyeVRocmVzaG9sZC4KKyAgICAgKiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgdGFrZXMgdGhlIGR1bW15X3ByZWNpc2lvbiBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGUgX1NjYWxhciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgdGhlIFBvbHlub21pYWxTb2x2ZXIgY2xhc3MgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBiaV9zZXEgOiB0aGUgYmFjayBpbnNlcnRpb24gc2VxdWVuY2UgKHN0bCBjb25jZXB0KQorICAgICAqIFxwYXJhbVtpbl0gIGFic0ltYWdpbmFyeVRocmVzaG9sZCA6IHRoZSBtYXhpbXVtIGJvdW5kIG9mIHRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXgKKyAgICAgKiAgbnVtYmVyIHRoYXQgaXMgY29uc2lkZXJlZCBhcyByZWFsLgorICAgICAqICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3RsX2JhY2tfaW5zZXJ0aW9uX3NlcXVlbmNlPgorICAgIGlubGluZSB2b2lkIHJlYWxSb290cyggU3RsX2JhY2tfaW5zZXJ0aW9uX3NlcXVlbmNlJiBiaV9zZXEsCisgICAgICAgIGNvbnN0IFJlYWxTY2FsYXImIGFic0ltYWdpbmFyeVRocmVzaG9sZCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSApIGNvbnN0CisgICAgeworICAgICAgYmlfc2VxLmNsZWFyKCk7CisgICAgICBmb3IoSW5kZXggaT0wOyBpPG1fcm9vdHMuc2l6ZSgpOyArK2kgKQorICAgICAgeworICAgICAgICBpZiggaW50ZXJuYWw6OmFicyggbV9yb290c1tpXS5pbWFnKCkgKSA8IGFic0ltYWdpbmFyeVRocmVzaG9sZCApeworICAgICAgICAgIGJpX3NlcS5wdXNoX2JhY2soIG1fcm9vdHNbaV0ucmVhbCgpICk7IH0KKyAgICAgIH0KKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIHNxdWFyZWROb3JtQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBjb25zdCBSb290VHlwZSYgc2VsZWN0Q29tcGxleFJvb3Rfd2l0aFJlc3BlY3RUb05vcm0oIHNxdWFyZWROb3JtQmluYXJ5UHJlZGljYXRlJiBwcmVkICkgY29uc3QKKyAgICB7CisgICAgICBJbmRleCByZXM9MDsKKyAgICAgIFJlYWxTY2FsYXIgbm9ybTIgPSBpbnRlcm5hbDo6YWJzMiggbV9yb290c1swXSApOworICAgICAgZm9yKCBJbmRleCBpPTE7IGk8bV9yb290cy5zaXplKCk7ICsraSApCisgICAgICB7CisgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgY3Vyck5vcm0yID0gaW50ZXJuYWw6OmFiczIoIG1fcm9vdHNbaV0gKTsKKyAgICAgICAgaWYoIHByZWQoIGN1cnJOb3JtMiwgbm9ybTIgKSApeworICAgICAgICAgIHJlcz1pOyBub3JtMj1jdXJyTm9ybTI7IH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBtX3Jvb3RzW3Jlc107CisgICAgfQorCisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJucyB0aGUgY29tcGxleCByb290IHdpdGggZ3JlYXRlc3Qgbm9ybS4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUm9vdFR5cGUmIGdyZWF0ZXN0Um9vdCgpIGNvbnN0CisgICAgeworICAgICAgc3RkOjpncmVhdGVyPFNjYWxhcj4gZ3JlYXRlcjsKKyAgICAgIHJldHVybiBzZWxlY3RDb21wbGV4Um9vdF93aXRoUmVzcGVjdFRvTm9ybSggZ3JlYXRlciApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxyZXR1cm5zIHRoZSBjb21wbGV4IHJvb3Qgd2l0aCBzbWFsbGVzdCBub3JtLgorICAgICAqLworICAgIGlubGluZSBjb25zdCBSb290VHlwZSYgc21hbGxlc3RSb290KCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6Omxlc3M8U2NhbGFyPiBsZXNzOworICAgICAgcmV0dXJuIHNlbGVjdENvbXBsZXhSb290X3dpdGhSZXNwZWN0VG9Ob3JtKCBsZXNzICk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBzcXVhcmVkUmVhbFBhcnRCaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIGNvbnN0IFJlYWxTY2FsYXImIHNlbGVjdFJlYWxSb290X3dpdGhSZXNwZWN0VG9BYnNSZWFsUGFydCgKKyAgICAgICAgc3F1YXJlZFJlYWxQYXJ0QmluYXJ5UHJlZGljYXRlJiBwcmVkLAorICAgICAgICBib29sJiBoYXNBcmVhbFJvb3QsCisgICAgICAgIGNvbnN0IFJlYWxTY2FsYXImIGFic0ltYWdpbmFyeVRocmVzaG9sZCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSApIGNvbnN0CisgICAgeworICAgICAgaGFzQXJlYWxSb290ID0gZmFsc2U7CisgICAgICBJbmRleCByZXM9MDsKKyAgICAgIFJlYWxTY2FsYXIgYWJzMigwKTsKKworICAgICAgZm9yKCBJbmRleCBpPTA7IGk8bV9yb290cy5zaXplKCk7ICsraSApCisgICAgICB7CisgICAgICAgIGlmKCBpbnRlcm5hbDo6YWJzKCBtX3Jvb3RzW2ldLmltYWcoKSApIDwgYWJzSW1hZ2luYXJ5VGhyZXNob2xkICkKKyAgICAgICAgeworICAgICAgICAgIGlmKCAhaGFzQXJlYWxSb290ICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBoYXNBcmVhbFJvb3QgPSB0cnVlOworICAgICAgICAgICAgcmVzID0gaTsKKyAgICAgICAgICAgIGFiczIgPSBtX3Jvb3RzW2ldLnJlYWwoKSAqIG1fcm9vdHNbaV0ucmVhbCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciBjdXJyQWJzMiA9IG1fcm9vdHNbaV0ucmVhbCgpICogbV9yb290c1tpXS5yZWFsKCk7CisgICAgICAgICAgICBpZiggcHJlZCggY3VyckFiczIsIGFiczIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFiczIgPSBjdXJyQWJzMjsKKyAgICAgICAgICAgICAgcmVzID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYoIGludGVybmFsOjphYnMoIG1fcm9vdHNbaV0uaW1hZygpICkgPCBpbnRlcm5hbDo6YWJzKCBtX3Jvb3RzW3Jlc10uaW1hZygpICkgKXsKKyAgICAgICAgICAgIHJlcyA9IGk7IH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGludGVybmFsOjpyZWFsX3JlZihtX3Jvb3RzW3Jlc10pOworICAgIH0KKworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVhbFBhcnRCaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIGNvbnN0IFJlYWxTY2FsYXImIHNlbGVjdFJlYWxSb290X3dpdGhSZXNwZWN0VG9SZWFsUGFydCgKKyAgICAgICAgUmVhbFBhcnRCaW5hcnlQcmVkaWNhdGUmIHByZWQsCisgICAgICAgIGJvb2wmIGhhc0FyZWFsUm9vdCwKKyAgICAgICAgY29uc3QgUmVhbFNjYWxhciYgYWJzSW1hZ2luYXJ5VGhyZXNob2xkID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpICkgY29uc3QKKyAgICB7CisgICAgICBoYXNBcmVhbFJvb3QgPSBmYWxzZTsKKyAgICAgIEluZGV4IHJlcz0wOworICAgICAgUmVhbFNjYWxhciB2YWwoMCk7CisKKyAgICAgIGZvciggSW5kZXggaT0wOyBpPG1fcm9vdHMuc2l6ZSgpOyArK2kgKQorICAgICAgeworICAgICAgICBpZiggaW50ZXJuYWw6OmFicyggbV9yb290c1tpXS5pbWFnKCkgKSA8IGFic0ltYWdpbmFyeVRocmVzaG9sZCApCisgICAgICAgIHsKKyAgICAgICAgICBpZiggIWhhc0FyZWFsUm9vdCApCisgICAgICAgICAgeworICAgICAgICAgICAgaGFzQXJlYWxSb290ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlcyA9IGk7CisgICAgICAgICAgICB2YWwgPSBtX3Jvb3RzW2ldLnJlYWwoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgY3VyciA9IG1fcm9vdHNbaV0ucmVhbCgpOworICAgICAgICAgICAgaWYoIHByZWQoIGN1cnIsIHZhbCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdmFsID0gY3VycjsKKyAgICAgICAgICAgICAgcmVzID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYoIGludGVybmFsOjphYnMoIG1fcm9vdHNbaV0uaW1hZygpICkgPCBpbnRlcm5hbDo6YWJzKCBtX3Jvb3RzW3Jlc10uaW1hZygpICkgKXsKKyAgICAgICAgICAgIHJlcyA9IGk7IH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGludGVybmFsOjpyZWFsX3JlZihtX3Jvb3RzW3Jlc10pOworICAgIH0KKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogXHJldHVybnMgYSByZWFsIHJvb3Qgd2l0aCBncmVhdGVzdCBhYnNvbHV0ZSBtYWduaXR1ZGUuCisgICAgICogQSByZWFsIHJvb3QgaXMgZGVmaW5lZCBhcyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCByb290IHdpdGggYWJzb2x1dGUgaW1hZ2luYXJ5CisgICAgICogcGFydCBzbWFsbGVzdCB0aGFuIGFic0ltYWdpbmFyeVRocmVzaG9sZC4KKyAgICAgKiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgdGFrZXMgdGhlIGR1bW15X3ByZWNpc2lvbiBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGUgX1NjYWxhciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgdGhlIFBvbHlub21pYWxTb2x2ZXIgY2xhc3MgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICogSWYgbm8gcmVhbCByb290IGlzIGZvdW5kIHRoZSBib29sZWFuIGhhc0FyZWFsUm9vdCBpcyBzZXQgdG8gZmFsc2UgYW5kIHRoZSByZWFsIHBhcnQgb2YKKyAgICAgKiB0aGUgcm9vdCB3aXRoIHNtYWxsZXN0IGFic29sdXRlIGltYWdpbmFyeSBwYXJ0IGlzIHJldHVybmVkIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBoYXNBcmVhbFJvb3QgOiBib29sZWFuIHRydWUgaWYgYSByZWFsIHJvb3QgaXMgZm91bmQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqICBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgY3JpdGVyaW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogXHBhcmFtW2luXSBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgOiB0aHJlc2hvbGQgb24gdGhlIGFic29sdXRlIGltYWdpbmFyeSBwYXJ0IHRvIGRlY2lkZQorICAgICAqICB3aGV0aGVyIG9yIG5vdCBhIHJvb3QgaXMgcmVhbC4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUmVhbFNjYWxhciYgYWJzR3JlYXRlc3RSZWFsUm9vdCgKKyAgICAgICAgYm9vbCYgaGFzQXJlYWxSb290LAorICAgICAgICBjb25zdCBSZWFsU2NhbGFyJiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkgKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6Z3JlYXRlcjxTY2FsYXI+IGdyZWF0ZXI7CisgICAgICByZXR1cm4gc2VsZWN0UmVhbFJvb3Rfd2l0aFJlc3BlY3RUb0Fic1JlYWxQYXJ0KCBncmVhdGVyLCBoYXNBcmVhbFJvb3QsIGFic0ltYWdpbmFyeVRocmVzaG9sZCApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogXHJldHVybnMgYSByZWFsIHJvb3Qgd2l0aCBzbWFsbGVzdCBhYnNvbHV0ZSBtYWduaXR1ZGUuCisgICAgICogQSByZWFsIHJvb3QgaXMgZGVmaW5lZCBhcyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCByb290IHdpdGggYWJzb2x1dGUgaW1hZ2luYXJ5CisgICAgICogcGFydCBzbWFsbGVzdCB0aGFuIGFic0ltYWdpbmFyeVRocmVzaG9sZC4KKyAgICAgKiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgdGFrZXMgdGhlIGR1bW15X3ByZWNpc2lvbiBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGUgX1NjYWxhciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgdGhlIFBvbHlub21pYWxTb2x2ZXIgY2xhc3MgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICogSWYgbm8gcmVhbCByb290IGlzIGZvdW5kIHRoZSBib29sZWFuIGhhc0FyZWFsUm9vdCBpcyBzZXQgdG8gZmFsc2UgYW5kIHRoZSByZWFsIHBhcnQgb2YKKyAgICAgKiB0aGUgcm9vdCB3aXRoIHNtYWxsZXN0IGFic29sdXRlIGltYWdpbmFyeSBwYXJ0IGlzIHJldHVybmVkIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBoYXNBcmVhbFJvb3QgOiBib29sZWFuIHRydWUgaWYgYSByZWFsIHJvb3QgaXMgZm91bmQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqICBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgY3JpdGVyaW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogXHBhcmFtW2luXSBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgOiB0aHJlc2hvbGQgb24gdGhlIGFic29sdXRlIGltYWdpbmFyeSBwYXJ0IHRvIGRlY2lkZQorICAgICAqICB3aGV0aGVyIG9yIG5vdCBhIHJvb3QgaXMgcmVhbC4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3QgUmVhbFNjYWxhciYgYWJzU21hbGxlc3RSZWFsUm9vdCgKKyAgICAgICAgYm9vbCYgaGFzQXJlYWxSb290LAorICAgICAgICBjb25zdCBSZWFsU2NhbGFyJiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkgKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6bGVzczxTY2FsYXI+IGxlc3M7CisgICAgICByZXR1cm4gc2VsZWN0UmVhbFJvb3Rfd2l0aFJlc3BlY3RUb0Fic1JlYWxQYXJ0KCBsZXNzLCBoYXNBcmVhbFJvb3QsIGFic0ltYWdpbmFyeVRocmVzaG9sZCApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogXHJldHVybnMgdGhlIHJlYWwgcm9vdCB3aXRoIGdyZWF0ZXN0IHZhbHVlLgorICAgICAqIEEgcmVhbCByb290IGlzIGRlZmluZWQgYXMgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggcm9vdCB3aXRoIGFic29sdXRlIGltYWdpbmFyeQorICAgICAqIHBhcnQgc21hbGxlc3QgdGhhbiBhYnNJbWFnaW5hcnlUaHJlc2hvbGQuCisgICAgICogYWJzSW1hZ2luYXJ5VGhyZXNob2xkIHRha2VzIHRoZSBkdW1teV9wcmVjaXNpb24gYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhlIF9TY2FsYXIgdGVtcGxhdGUgcGFyYW1ldGVyIG9mIHRoZSBQb2x5bm9taWFsU29sdmVyIGNsYXNzIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAqIElmIG5vIHJlYWwgcm9vdCBpcyBmb3VuZCB0aGUgYm9vbGVhbiBoYXNBcmVhbFJvb3QgaXMgc2V0IHRvIGZhbHNlIGFuZCB0aGUgcmVhbCBwYXJ0IG9mCisgICAgICogdGhlIHJvb3Qgd2l0aCBzbWFsbGVzdCBhYnNvbHV0ZSBpbWFnaW5hcnkgcGFydCBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogXHBhcmFtW291dF0gaGFzQXJlYWxSb290IDogYm9vbGVhbiB0cnVlIGlmIGEgcmVhbCByb290IGlzIGZvdW5kIGFjY29yZGluZyB0byB0aGUKKyAgICAgKiAgYWJzSW1hZ2luYXJ5VGhyZXNob2xkIGNyaXRlcmlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIFxwYXJhbVtpbl0gYWJzSW1hZ2luYXJ5VGhyZXNob2xkIDogdGhyZXNob2xkIG9uIHRoZSBhYnNvbHV0ZSBpbWFnaW5hcnkgcGFydCB0byBkZWNpZGUKKyAgICAgKiAgd2hldGhlciBvciBub3QgYSByb290IGlzIHJlYWwuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0IFJlYWxTY2FsYXImIGdyZWF0ZXN0UmVhbFJvb3QoCisgICAgICAgIGJvb2wmIGhhc0FyZWFsUm9vdCwKKyAgICAgICAgY29uc3QgUmVhbFNjYWxhciYgYWJzSW1hZ2luYXJ5VGhyZXNob2xkID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpICkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmdyZWF0ZXI8U2NhbGFyPiBncmVhdGVyOworICAgICAgcmV0dXJuIHNlbGVjdFJlYWxSb290X3dpdGhSZXNwZWN0VG9SZWFsUGFydCggZ3JlYXRlciwgaGFzQXJlYWxSb290LCBhYnNJbWFnaW5hcnlUaHJlc2hvbGQgKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFxyZXR1cm5zIHRoZSByZWFsIHJvb3Qgd2l0aCBzbWFsbGVzdCB2YWx1ZS4KKyAgICAgKiBBIHJlYWwgcm9vdCBpcyBkZWZpbmVkIGFzIHRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IHJvb3Qgd2l0aCBhYnNvbHV0ZSBpbWFnaW5hcnkKKyAgICAgKiBwYXJ0IHNtYWxsZXN0IHRoYW4gYWJzSW1hZ2luYXJ5VGhyZXNob2xkLgorICAgICAqIGFic0ltYWdpbmFyeVRocmVzaG9sZCB0YWtlcyB0aGUgZHVtbXlfcHJlY2lzaW9uIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoZSBfU2NhbGFyIHRlbXBsYXRlIHBhcmFtZXRlciBvZiB0aGUgUG9seW5vbWlhbFNvbHZlciBjbGFzcyBhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBJZiBubyByZWFsIHJvb3QgaXMgZm91bmQgdGhlIGJvb2xlYW4gaGFzQXJlYWxSb290IGlzIHNldCB0byBmYWxzZSBhbmQgdGhlIHJlYWwgcGFydCBvZgorICAgICAqIHRoZSByb290IHdpdGggc21hbGxlc3QgYWJzb2x1dGUgaW1hZ2luYXJ5IHBhcnQgaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtvdXRdIGhhc0FyZWFsUm9vdCA6IGJvb2xlYW4gdHJ1ZSBpZiBhIHJlYWwgcm9vdCBpcyBmb3VuZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogIGFic0ltYWdpbmFyeVRocmVzaG9sZCBjcml0ZXJpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBccGFyYW1baW5dIGFic0ltYWdpbmFyeVRocmVzaG9sZCA6IHRocmVzaG9sZCBvbiB0aGUgYWJzb2x1dGUgaW1hZ2luYXJ5IHBhcnQgdG8gZGVjaWRlCisgICAgICogIHdoZXRoZXIgb3Igbm90IGEgcm9vdCBpcyByZWFsLgorICAgICAqLworICAgIGlubGluZSBjb25zdCBSZWFsU2NhbGFyJiBzbWFsbGVzdFJlYWxSb290KAorICAgICAgICBib29sJiBoYXNBcmVhbFJvb3QsCisgICAgICAgIGNvbnN0IFJlYWxTY2FsYXImIGFic0ltYWdpbmFyeVRocmVzaG9sZCA9IE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSApIGNvbnN0CisgICAgeworICAgICAgc3RkOjpsZXNzPFNjYWxhcj4gbGVzczsKKyAgICAgIHJldHVybiBzZWxlY3RSZWFsUm9vdF93aXRoUmVzcGVjdFRvUmVhbFBhcnQoIGxlc3MsIGhhc0FyZWFsUm9vdCwgYWJzSW1hZ2luYXJ5VGhyZXNob2xkICk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICBSb290c1R5cGUgICAgICAgICAgICAgICBtX3Jvb3RzOworfTsKKworI2RlZmluZSBFSUdFTl9QT0xZTk9NSUFMX1NPTFZFUl9CQVNFX0lOSEVSSVRFRF9UWVBFUyggQkFTRSApICBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQkFTRTo6U2NhbGFyICAgICAgICAgICAgICAgICBTY2FsYXI7ICAgICAgIFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBCQVNFOjpSZWFsU2NhbGFyICAgICAgICAgICAgIFJlYWxTY2FsYXI7ICAgXAorICB0eXBlZGVmIHR5cGVuYW1lIEJBU0U6OlJvb3RUeXBlICAgICAgICAgICAgICAgUm9vdFR5cGU7ICAgICBcCisgIHR5cGVkZWYgdHlwZW5hbWUgQkFTRTo6Um9vdHNUeXBlICAgICAgICAgICAgICBSb290c1R5cGU7CisKKworCisvKiogXGluZ3JvdXAgUG9seW5vbWlhbHNfTW9kdWxlCisgICoKKyAgKiBcY2xhc3MgUG9seW5vbWlhbFNvbHZlcgorICAqCisgICogXGJyaWVmIEEgcG9seW5vbWlhbCBzb2x2ZXIKKyAgKgorICAqIENvbXB1dGVzIHRoZSBjb21wbGV4IHJvb3RzIG9mIGEgcmVhbCBwb2x5bm9taWFsLgorICAqCisgICogXHBhcmFtIF9TY2FsYXIgdGhlIHNjYWxhciB0eXBlLCBpLmUuLCB0aGUgdHlwZSBvZiB0aGUgcG9seW5vbWlhbCBjb2VmZmljaWVudHMKKyAgKiBccGFyYW0gX0RlZyB0aGUgZGVncmVlIG9mIHRoZSBwb2x5bm9taWFsLCBjYW4gYmUgYSBjb21waWxlIHRpbWUgdmFsdWUgb3IgRHluYW1pYy4KKyAgKiAgICAgICAgICAgICBOb3RpY2UgdGhhdCB0aGUgbnVtYmVyIG9mIHBvbHlub21pYWwgY29lZmZpY2llbnRzIGlzIF9EZWcrMS4KKyAgKgorICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHBvbHlub21pYWwgc29sdmVyIGFuZCBwcm92aWRlcyBjb252ZW5pZW50IG1ldGhvZHMgc3VjaCBhcworICAqIC0gcmVhbCByb290cywKKyAgKiAtIGdyZWF0ZXN0LCBzbWFsbGVzdCBjb21wbGV4IHJvb3RzLAorICAqIC0gcmVhbCByb290cyB3aXRoIGdyZWF0ZXN0LCBzbWFsbGVzdCBhYnNvbHV0ZSByZWFsIHZhbHVlLgorICAqIC0gZ3JlYXRlc3QsIHNtYWxsZXN0IHJlYWwgcm9vdHMuCisgICoKKyAgKiBXQVJOSU5HOiB0aGlzIHBvbHlub21pYWwgc29sdmVyIGlzIGV4cGVyaW1lbnRhbCwgcGFydCBvZiB0aGUgdW5zdXBvcnRlZCBFaWdlbiBtb2R1bGVzLgorICAqCisgICoKKyAgKiBDdXJyZW50bHkgYSBRUiBhbGdvcml0aG0gaXMgdXNlZCB0byBjb21wdXRlIHRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgY29tcGFuaW9uIG1hdHJpeCBvZgorICAqIHRoZSBwb2x5bm9taWFsIHRvIGNvbXB1dGUgaXRzIHJvb3RzLgorICAqIFRoaXMgc3VwcG9zZXMgdGhhdCB0aGUgY29tcGxleCBtb2R1bGkgb2YgdGhlIHJvb3RzIGFyZSBhbGwgZGlzdGluY3Q6IGUuZy4gdGhlcmUgc2hvdWxkCisgICogYmUgbm8gbXVsdGlwbGUgcm9vdHMgb3IgY29uanVnYXRlIHJvb3RzIGZvciBpbnN0YW5jZS4KKyAgKiBXaXRoIDMyYml0IChmbG9hdCkgZmxvYXRpbmcgdHlwZXMgdGhpcyBwcm9ibGVtIHNob3dzIHVwIGZyZXF1ZW50bHkuCisgICogSG93ZXZlciwgYWxtb3N0IGFsd2F5cywgY29ycmVjdCBhY2N1cmFjeSBpcyByZWFjaGVkIGV2ZW4gaW4gdGhlc2UgY2FzZXMgZm9yIDY0Yml0CisgICogKGRvdWJsZSkgZmxvYXRpbmcgdHlwZXMgYW5kIHNtYWxsIHBvbHlub21pYWwgZGVncmVlICg8MjApLgorICAqLwordGVtcGxhdGU8IHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGVnID4KK2NsYXNzIFBvbHlub21pYWxTb2x2ZXIgOiBwdWJsaWMgUG9seW5vbWlhbFNvbHZlckJhc2U8X1NjYWxhcixfRGVnPgoreworICBwdWJsaWM6CisgICAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRl9WRUNUT1JJWkFCTEVfRklYRURfU0laRShfU2NhbGFyLF9EZWc9PUR5bmFtaWMgPyBEeW5hbWljIDogX0RlZykKKworICAgIHR5cGVkZWYgUG9seW5vbWlhbFNvbHZlckJhc2U8X1NjYWxhcixfRGVnPiAgICBQU19CYXNlOworICAgIEVJR0VOX1BPTFlOT01JQUxfU09MVkVSX0JBU0VfSU5IRVJJVEVEX1RZUEVTKCBQU19CYXNlICkKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixfRGVnLF9EZWc+ICAgICAgICAgICAgICAgICBDb21wYW5pb25NYXRyaXhUeXBlOworICAgIHR5cGVkZWYgRWlnZW5Tb2x2ZXI8Q29tcGFuaW9uTWF0cml4VHlwZT4gICAgICAgICBFaWdlblNvbHZlclR5cGU7CisKKyAgcHVibGljOgorICAgIC8qKiBDb21wdXRlcyB0aGUgY29tcGxleCByb290cyBvZiBhIG5ldyBwb2x5bm9taWFsLiAqLworICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBPdGhlclBvbHlub21pYWwgPgorICAgIHZvaWQgY29tcHV0ZSggY29uc3QgT3RoZXJQb2x5bm9taWFsJiBwb2x5ICkKKyAgICB7CisgICAgICBhc3NlcnQoIFNjYWxhcigwKSAhPSBwb2x5W3BvbHkuc2l6ZSgpLTFdICk7CisgICAgICBpbnRlcm5hbDo6Y29tcGFuaW9uPFNjYWxhcixfRGVnPiBjb21wYW5pb24oIHBvbHkgKTsKKyAgICAgIGNvbXBhbmlvbi5iYWxhbmNlKCk7CisgICAgICBtX2VpZ2VuU29sdmVyLmNvbXB1dGUoIGNvbXBhbmlvbi5kZW5zZU1hdHJpeCgpICk7CisgICAgICBtX3Jvb3RzID0gbV9laWdlblNvbHZlci5laWdlbnZhbHVlcygpOworICAgIH0KKworICBwdWJsaWM6CisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIE90aGVyUG9seW5vbWlhbCA+CisgICAgaW5saW5lIFBvbHlub21pYWxTb2x2ZXIoIGNvbnN0IE90aGVyUG9seW5vbWlhbCYgcG9seSApeworICAgICAgY29tcHV0ZSggcG9seSApOyB9CisKKyAgICBpbmxpbmUgUG9seW5vbWlhbFNvbHZlcigpe30KKworICBwcm90ZWN0ZWQ6CisgICAgdXNpbmcgICAgICAgICAgICAgICAgICAgUFNfQmFzZTo6bV9yb290czsKKyAgICBFaWdlblNvbHZlclR5cGUgICAgICAgICBtX2VpZ2VuU29sdmVyOworfTsKKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgX1NjYWxhciA+CitjbGFzcyBQb2x5bm9taWFsU29sdmVyPF9TY2FsYXIsMT4gOiBwdWJsaWMgUG9seW5vbWlhbFNvbHZlckJhc2U8X1NjYWxhciwxPgoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBQb2x5bm9taWFsU29sdmVyQmFzZTxfU2NhbGFyLDE+ICAgIFBTX0Jhc2U7CisgICAgRUlHRU5fUE9MWU5PTUlBTF9TT0xWRVJfQkFTRV9JTkhFUklURURfVFlQRVMoIFBTX0Jhc2UgKQorCisgIHB1YmxpYzoKKyAgICAvKiogQ29tcHV0ZXMgdGhlIGNvbXBsZXggcm9vdHMgb2YgYSBuZXcgcG9seW5vbWlhbC4gKi8KKyAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgT3RoZXJQb2x5bm9taWFsID4KKyAgICB2b2lkIGNvbXB1dGUoIGNvbnN0IE90aGVyUG9seW5vbWlhbCYgcG9seSApCisgICAgeworICAgICAgYXNzZXJ0KCBTY2FsYXIoMCkgIT0gcG9seVtwb2x5LnNpemUoKS0xXSApOworICAgICAgbV9yb290c1swXSA9IC1wb2x5WzBdL3BvbHlbcG9seS5zaXplKCktMV07CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB1c2luZyAgICAgICAgICAgICAgICAgICBQU19CYXNlOjptX3Jvb3RzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9QT0xZTk9NSUFMX1NPTFZFUl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvUG9seW5vbWlhbFV0aWxzLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvUG9seW5vbWlhbHMvUG9seW5vbWlhbFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzMjA0YwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Qb2x5bm9taWFscy9Qb2x5bm9taWFsVXRpbHMuaApAQCAtMCwwICsxLDE0MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgTWFudWVsIFlndWVsIDxtYW51ZWwueWd1ZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9QT0xZTk9NSUFMX1VUSUxTX0gKKyNkZWZpbmUgRUlHRU5fUE9MWU5PTUlBTF9VVElMU19ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgUG9seW5vbWlhbHNfTW9kdWxlCisgKiBccmV0dXJucyB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgcG9seW5vbWlhbCBhdCB4IHVzaW5nIEhvcm5lciBhbGdvcml0aG0uCisgKgorICogXHBhcmFtW2luXSBwb2x5IDogdGhlIHZlY3RvciBvZiBjb2VmZmljaWVudHMgb2YgdGhlIHBvbHlub21pYWwgb3JkZXJlZAorICogIGJ5IGRlZ3JlZXMgaS5lLiBwb2x5W2ldIGlzIHRoZSBjb2VmZmljaWVudCBvZiBkZWdyZWUgaSBvZiB0aGUgcG9seW5vbWlhbAorICogIGUuZy4gXGYkIDEgKyAzeF4yIFxmJCBpcyBzdG9yZWQgYXMgYSB2ZWN0b3IgXGYkIFsgMSwgMCwgMyBdIFxmJC4KKyAqIFxwYXJhbVtpbl0geCA6IHRoZSB2YWx1ZSB0byBldmFsdWF0ZSB0aGUgcG9seW5vbWlhbCBhdC4KKyAqCisgKiA8aT48Yj5Ob3RlIGZvciBzdGFiaWxpdHk6PC9iPjwvaT4KKyAqICA8ZGQ+IFxmJCB8eHwgXGxlIDEgXGYkIDwvZGQ+CisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBQb2x5bm9taWFscywgdHlwZW5hbWUgVD4KK2lubGluZQorVCBwb2x5X2V2YWxfaG9ybmVyKCBjb25zdCBQb2x5bm9taWFscyYgcG9seSwgY29uc3QgVCYgeCApCit7CisgIFQgdmFsPXBvbHlbcG9seS5zaXplKCktMV07CisgIGZvcihEZW5zZUluZGV4IGk9cG9seS5zaXplKCktMjsgaT49MDsgLS1pICl7CisgICAgdmFsID0gdmFsKnggKyBwb2x5W2ldOyB9CisgIHJldHVybiB2YWw7Cit9CisKKy8qKiBcaW5ncm91cCBQb2x5bm9taWFsc19Nb2R1bGUKKyAqIFxyZXR1cm5zIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBwb2x5bm9taWFsIGF0IHggdXNpbmcgc3RhYmlsaXplZCBIb3JuZXIgYWxnb3JpdGhtLgorICoKKyAqIFxwYXJhbVtpbl0gcG9seSA6IHRoZSB2ZWN0b3Igb2YgY29lZmZpY2llbnRzIG9mIHRoZSBwb2x5bm9taWFsIG9yZGVyZWQKKyAqICBieSBkZWdyZWVzIGkuZS4gcG9seVtpXSBpcyB0aGUgY29lZmZpY2llbnQgb2YgZGVncmVlIGkgb2YgdGhlIHBvbHlub21pYWwKKyAqICBlLmcuIFxmJCAxICsgM3heMiBcZiQgaXMgc3RvcmVkIGFzIGEgdmVjdG9yIFxmJCBbIDEsIDAsIDMgXSBcZiQuCisgKiBccGFyYW1baW5dIHggOiB0aGUgdmFsdWUgdG8gZXZhbHVhdGUgdGhlIHBvbHlub21pYWwgYXQuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBQb2x5bm9taWFscywgdHlwZW5hbWUgVD4KK2lubGluZQorVCBwb2x5X2V2YWwoIGNvbnN0IFBvbHlub21pYWxzJiBwb2x5LCBjb25zdCBUJiB4ICkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWwgUmVhbDsKKworICBpZiggaW50ZXJuYWw6OmFiczIoIHggKSA8PSBSZWFsKDEpICl7CisgICAgcmV0dXJuIHBvbHlfZXZhbF9ob3JuZXIoIHBvbHksIHggKTsgfQorICBlbHNlCisgIHsKKyAgICBUIHZhbD1wb2x5WzBdOworICAgIFQgaW52X3ggPSBUKDEpL3g7CisgICAgZm9yKCBEZW5zZUluZGV4IGk9MTsgaTxwb2x5LnNpemUoKTsgKytpICl7CisgICAgICB2YWwgPSB2YWwqaW52X3ggKyBwb2x5W2ldOyB9CisKKyAgICByZXR1cm4gc3RkOjpwb3coeCwoVCkocG9seS5zaXplKCktMSkpICogdmFsOworICB9Cit9CisKKy8qKiBcaW5ncm91cCBQb2x5bm9taWFsc19Nb2R1bGUKKyAqIFxyZXR1cm5zIGEgbWF4aW11bSBib3VuZCBmb3IgdGhlIGFic29sdXRlIHZhbHVlIG9mIGFueSByb290IG9mIHRoZSBwb2x5bm9taWFsLgorICoKKyAqIFxwYXJhbVtpbl0gcG9seSA6IHRoZSB2ZWN0b3Igb2YgY29lZmZpY2llbnRzIG9mIHRoZSBwb2x5bm9taWFsIG9yZGVyZWQKKyAqICBieSBkZWdyZWVzIGkuZS4gcG9seVtpXSBpcyB0aGUgY29lZmZpY2llbnQgb2YgZGVncmVlIGkgb2YgdGhlIHBvbHlub21pYWwKKyAqICBlLmcuIFxmJCAxICsgM3heMiBcZiQgaXMgc3RvcmVkIGFzIGEgdmVjdG9yIFxmJCBbIDEsIDAsIDMgXSBcZiQuCisgKgorICogIDxpPjxiPlByZWNvbmRpdGlvbjo8L2I+PC9pPgorICogIDxkZD4gdGhlIGxlYWRpbmcgY29lZmZpY2llbnQgb2YgdGhlIGlucHV0IHBvbHlub21pYWwgcG9seSBtdXN0IGJlIG5vbiB6ZXJvIDwvZGQ+CisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBQb2x5bm9taWFsPgoraW5saW5lCit0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgUG9seW5vbWlhbDo6U2NhbGFyPjo6UmVhbCBjYXVjaHlfbWF4X2JvdW5kKCBjb25zdCBQb2x5bm9taWFsJiBwb2x5ICkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBQb2x5bm9taWFsOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWw7CisKKyAgYXNzZXJ0KCBTY2FsYXIoMCkgIT0gcG9seVtwb2x5LnNpemUoKS0xXSApOworICBjb25zdCBTY2FsYXIgaW52X2xlYWRpbmdfY29lZmYgPSBTY2FsYXIoMSkvcG9seVtwb2x5LnNpemUoKS0xXTsKKyAgUmVhbCBjYigwKTsKKworICBmb3IoIERlbnNlSW5kZXggaT0wOyBpPHBvbHkuc2l6ZSgpLTE7ICsraSApeworICAgIGNiICs9IGludGVybmFsOjphYnMocG9seVtpXSppbnZfbGVhZGluZ19jb2VmZik7IH0KKyAgcmV0dXJuIGNiICsgUmVhbCgxKTsKK30KKworLyoqIFxpbmdyb3VwIFBvbHlub21pYWxzX01vZHVsZQorICogXHJldHVybnMgYSBtaW5pbXVtIGJvdW5kIGZvciB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYW55IG5vbiB6ZXJvIHJvb3Qgb2YgdGhlIHBvbHlub21pYWwuCisgKiBccGFyYW1baW5dIHBvbHkgOiB0aGUgdmVjdG9yIG9mIGNvZWZmaWNpZW50cyBvZiB0aGUgcG9seW5vbWlhbCBvcmRlcmVkCisgKiAgYnkgZGVncmVlcyBpLmUuIHBvbHlbaV0gaXMgdGhlIGNvZWZmaWNpZW50IG9mIGRlZ3JlZSBpIG9mIHRoZSBwb2x5bm9taWFsCisgKiAgZS5nLiBcZiQgMSArIDN4XjIgXGYkIGlzIHN0b3JlZCBhcyBhIHZlY3RvciBcZiQgWyAxLCAwLCAzIF0gXGYkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9seW5vbWlhbD4KK2lubGluZQordHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIFBvbHlub21pYWw6OlNjYWxhcj46OlJlYWwgY2F1Y2h5X21pbl9ib3VuZCggY29uc3QgUG9seW5vbWlhbCYgcG9seSApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUG9seW5vbWlhbDo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsOworCisgIERlbnNlSW5kZXggaT0wOworICB3aGlsZSggaTxwb2x5LnNpemUoKS0xICYmIFNjYWxhcigwKSA9PSBwb2x5KGkpICl7ICsraTsgfQorICBpZiggcG9seS5zaXplKCktMSA9PSBpICl7CisgICAgcmV0dXJuIFJlYWwoMSk7IH0KKworICBjb25zdCBTY2FsYXIgaW52X21pbl9jb2VmZiA9IFNjYWxhcigxKS9wb2x5W2ldOworICBSZWFsIGNiKDEpOworICBmb3IoIERlbnNlSW5kZXggaj1pKzE7IGo8cG9seS5zaXplKCk7ICsraiApeworICAgIGNiICs9IGludGVybmFsOjphYnMocG9seVtqXSppbnZfbWluX2NvZWZmKTsgfQorICByZXR1cm4gUmVhbCgxKS9jYjsKK30KKworLyoqIFxpbmdyb3VwIFBvbHlub21pYWxzX01vZHVsZQorICogR2l2ZW4gdGhlIHJvb3RzIG9mIGEgcG9seW5vbWlhbCBjb21wdXRlIHRoZSBjb2VmZmljaWVudHMgaW4gdGhlCisgKiBtb25vbWlhbCBiYXNpcyBvZiB0aGUgbW9uaWMgcG9seW5vbWlhbCB3aXRoIHNhbWUgcm9vdHMgYW5kIG1pbmltYWwgZGVncmVlLgorICogSWYgUm9vdFZlY3RvciBpcyBhIHZlY3RvciBvZiBjb21wbGV4ZXMsIFBvbHlub21pYWwgc2hvdWxkIGFsc28gYmUgYSB2ZWN0b3IKKyAqIG9mIGNvbXBsZXhlcy4KKyAqIFxwYXJhbVtpbl0gcnYgOiBhIHZlY3RvciBjb250YWluaW5nIHRoZSByb290cyBvZiBhIHBvbHlub21pYWwuCisgKiBccGFyYW1bb3V0XSBwb2x5IDogdGhlIHZlY3RvciBvZiBjb2VmZmljaWVudHMgb2YgdGhlIHBvbHlub21pYWwgb3JkZXJlZAorICogIGJ5IGRlZ3JlZXMgaS5lLiBwb2x5W2ldIGlzIHRoZSBjb2VmZmljaWVudCBvZiBkZWdyZWUgaSBvZiB0aGUgcG9seW5vbWlhbAorICogIGUuZy4gXGYkIDMgKyB4XjIgXGYkIGlzIHN0b3JlZCBhcyBhIHZlY3RvciBcZiQgWyAzLCAwLCAxIF0gXGYkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUm9vdFZlY3RvciwgdHlwZW5hbWUgUG9seW5vbWlhbD4KK3ZvaWQgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKCBjb25zdCBSb290VmVjdG9yJiBydiwgUG9seW5vbWlhbCYgcG9seSApCit7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBQb2x5bm9taWFsOjpTY2FsYXIgU2NhbGFyOworCisgIHBvbHkuc2V0WmVybyggcnYuc2l6ZSgpKzEgKTsKKyAgcG9seVswXSA9IC1ydlswXTsgcG9seVsxXSA9IFNjYWxhcigxKTsKKyAgZm9yKCBEZW5zZUluZGV4IGk9MTsgaTwgcnYuc2l6ZSgpOyArK2kgKQorICB7CisgICAgZm9yKCBEZW5zZUluZGV4IGo9aSsxOyBqPjA7IC0taiApeyBwb2x5W2pdID0gcG9seVtqLTFdIC0gcnZbaV0qcG9seVtqXTsgfQorICAgIHBvbHlbMF0gPSAtcnZbaV0qcG9seVswXTsKKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1BPTFlOT01JQUxfVVRJTFNfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NreWxpbmUvQ01ha2VMaXN0cy50eHQgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmYxYjBkCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NreWxpbmUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw2IEBACitGSUxFKEdMT0IgRWlnZW5fU2t5bGluZV9TUkNTICIqLmgiKQorCitJTlNUQUxMKEZJTEVTCisgICR7RWlnZW5fU2t5bGluZV9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lIENPTVBPTkVOVCBEZXZlbAorICApCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lSW5wbGFjZUxVLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lSW5wbGFjZUxVLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmNTRlZAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVJbnBsYWNlTFUuaApAQCAtMCwwICsxLDM1MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDggR3VpbGxhdW1lIFNhdXBpbiA8Z3VpbGxhdW1lLnNhdXBpbkBjZWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NLWUxJTkVJTlBMQUNFTFVfSAorI2RlZmluZSBFSUdFTl9TS1lMSU5FSU5QTEFDRUxVX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBTa3lsaW5lX01vZHVsZQorICoKKyAqIFxjbGFzcyBTa3lsaW5lSW5wbGFjZUxVCisgKgorICogXGJyaWVmIElucGxhY2UgTFUgZGVjb21wb3NpdGlvbiBvZiBhIHNreWxpbmUgbWF0cml4IGFuZCBhc3NvY2lhdGVkIGZlYXR1cmVzCisgKgorICogXHBhcmFtIE1hdHJpeFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hdHJpeCBvZiB3aGljaCB3ZSBhcmUgY29tcHV0aW5nIHRoZSBMVSBmYWN0b3JpemF0aW9uCisgKgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgorY2xhc3MgU2t5bGluZUlucGxhY2VMVSB7Citwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgCisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCitwdWJsaWM6CisKKyAgICAvKiogQ3JlYXRlcyBhIExVIG9iamVjdCBhbmQgY29tcHV0ZSB0aGUgcmVzcGVjdGl2ZSBmYWN0b3JpemF0aW9uIG9mIFxhIG1hdHJpeCB1c2luZworICAgICAqIGZsYWdzIFxhIGZsYWdzLiAqLworICAgIFNreWxpbmVJbnBsYWNlTFUoTWF0cml4VHlwZSYgbWF0cml4LCBpbnQgZmxhZ3MgPSAwKQorICAgIDogLyptX21hdHJpeChtYXRyaXgucm93cygpLCBtYXRyaXguY29scygpKSwqLyBtX2ZsYWdzKGZsYWdzKSwgbV9zdGF0dXMoMCksIG1fbHUobWF0cml4KSB7CisgICAgICAgIG1fcHJlY2lzaW9uID0gUmVhbFNjYWxhcigwLjEpICogRWlnZW46OmR1bW15X3ByZWNpc2lvbjxSZWFsU2NhbGFyID4gKCk7CisgICAgICAgIG1fbHUuSXNSb3dNYWpvciA/IGNvbXB1dGVSb3dNYWpvcigpIDogY29tcHV0ZSgpOworICAgIH0KKworICAgIC8qKiBTZXRzIHRoZSByZWxhdGl2ZSB0aHJlc2hvbGQgdmFsdWUgdXNlZCB0byBwcnVuZSB6ZXJvIGNvZWZmaWNpZW50cyBkdXJpbmcgdGhlIGRlY29tcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBTZXR0aW5nIGEgdmFsdWUgZ3JlYXRlciB0aGFuIHplcm8gc3BlZWRzIHVwIGNvbXB1dGF0aW9uLCBhbmQgeWllbGRzIHRvIGFuIGltY29tcGxldGUKKyAgICAgKiBmYWN0b3JpemF0aW9uIHdpdGggZmV3ZXIgbm9uIHplcm8gY29lZmZpY2llbnRzLiBTdWNoIGFwcHJveGltYXRlIGZhY3RvcnMgYXJlIGVzcGVjaWFsbHkKKyAgICAgKiB1c2VmdWwgdG8gaW5pdGlhbGl6ZSBhbiBpdGVyYXRpdmUgc29sdmVyLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZSBleGFjdCBtZWFuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIG1pZ2h0IGRlcGVuZHMgb24gdGhlIGFjdHVhbAorICAgICAqIGJhY2tlbmQuIE1vcmVvdmVyLCBub3QgYWxsIGJhY2tlbmRzIHN1cHBvcnQgdGhpcyBmZWF0dXJlLgorICAgICAqCisgICAgICogXHNhIHByZWNpc2lvbigpICovCisgICAgdm9pZCBzZXRQcmVjaXNpb24oUmVhbFNjYWxhciB2KSB7CisgICAgICAgIG1fcHJlY2lzaW9uID0gdjsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGN1cnJlbnQgcHJlY2lzaW9uLgorICAgICAqCisgICAgICogXHNhIHNldFByZWNpc2lvbigpICovCisgICAgUmVhbFNjYWxhciBwcmVjaXNpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3ByZWNpc2lvbjsKKyAgICB9CisKKyAgICAvKiogU2V0cyB0aGUgZmxhZ3MuIFBvc3NpYmxlIHZhbHVlcyBhcmU6CisgICAgICogIC0gQ29tcGxldGVGYWN0b3JpemF0aW9uCisgICAgICogIC0gSW5jb21wbGV0ZUZhY3Rvcml6YXRpb24KKyAgICAgKiAgLSBNZW1vcnlFZmZpY2llbnQKKyAgICAgKiAgLSBvbmUgb2YgdGhlIG9yZGVyaW5nIG1ldGhvZHMKKyAgICAgKiAgLSBldGMuLi4KKyAgICAgKgorICAgICAqIFxzYSBmbGFncygpICovCisgICAgdm9pZCBzZXRGbGFncyhpbnQgZikgeworICAgICAgICBtX2ZsYWdzID0gZjsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIGN1cnJlbnQgZmxhZ3MgKi8KKyAgICBpbnQgZmxhZ3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2ZsYWdzOworICAgIH0KKworICAgIHZvaWQgc2V0T3JkZXJpbmdNZXRob2QoaW50IG0pIHsKKyAgICAgICAgbV9mbGFncyA9IG07CisgICAgfQorCisgICAgaW50IG9yZGVyaW5nTWV0aG9kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9mbGFnczsKKyAgICB9CisKKyAgICAvKiogQ29tcHV0ZXMvcmUtY29tcHV0ZXMgdGhlIExVIGZhY3Rvcml6YXRpb24gKi8KKyAgICB2b2lkIGNvbXB1dGUoKTsKKyAgICB2b2lkIGNvbXB1dGVSb3dNYWpvcigpOworCisgICAgLyoqIFxyZXR1cm5zIHRoZSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBMICovCisgICAgLy9pbmxpbmUgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4TCgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4TDsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBVICovCisgICAgLy9pbmxpbmUgY29uc3QgTWF0cml4VHlwZSYgbWF0cml4VSgpIGNvbnN0IHsgcmV0dXJuIG1fbWF0cml4VTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQkRlcml2ZWQsIHR5cGVuYW1lIFhEZXJpdmVkPgorICAgIGJvb2wgc29sdmUoY29uc3QgTWF0cml4QmFzZTxCRGVyaXZlZD4gJmIsIE1hdHJpeEJhc2U8WERlcml2ZWQ+KiB4LAorICAgICAgICAgICAgY29uc3QgaW50IHRyYW5zcG9zZWQgPSAwKSBjb25zdDsKKworICAgIC8qKiBccmV0dXJucyB0cnVlIGlmIHRoZSBmYWN0b3JpemF0aW9uIHN1Y2NlZWRlZCAqLworICAgIGlubGluZSBib29sIHN1Y2NlZWRlZCh2b2lkKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3N1Y2NlZWRlZDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBSZWFsU2NhbGFyIG1fcHJlY2lzaW9uOworICAgIGludCBtX2ZsYWdzOworICAgIG11dGFibGUgaW50IG1fc3RhdHVzOworICAgIGJvb2wgbV9zdWNjZWVkZWQ7CisgICAgTWF0cml4VHlwZSYgbV9sdTsKK307CisKKy8qKiBDb21wdXRlcyAvIHJlY29tcHV0ZXMgdGhlIGluIHBsYWNlIExVIGRlY29tcG9zaXRpb24gb2YgdGhlIFNreWxpbmVJbnBsYWNlTFUuCisgKiB1c2luZyB0aGUgZGVmYXVsdCBhbGdvcml0aG0uCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CisvL3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXI+Cit2b2lkIFNreWxpbmVJbnBsYWNlTFU8TWF0cml4VHlwZT46OmNvbXB1dGUoKSB7CisgICAgY29uc3Qgc2l6ZV90IHJvd3MgPSBtX2x1LnJvd3MoKTsKKyAgICBjb25zdCBzaXplX3QgY29scyA9IG1fbHUuY29scygpOworCisgICAgZWlnZW5fYXNzZXJ0KHJvd3MgPT0gY29scyAmJiAiV2UgZG8gbm90ICh5ZXQpIHN1cHBvcnQgcmVjdGFuZ3VsYXIgTFUuIik7CisgICAgZWlnZW5fYXNzZXJ0KCFtX2x1LklzUm93TWFqb3IgJiYgIkxVIGRlY29tcG9zaXRpb24gZG9lcyBub3Qgd29yayB3aXRoIHJvd01ham9yIFN0b3JhZ2UiKTsKKworICAgIGZvciAoSW5kZXggcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHsKKyAgICAgICAgY29uc3QgZG91YmxlIHBpdm90ID0gbV9sdS5jb2VmZkRpYWcocm93KTsKKworICAgICAgICAvL0xvd2VyIG1hdHJpeCBDb2x1bW5zIHVwZGF0ZQorICAgICAgICBjb25zdCBJbmRleCYgY29sID0gcm93OworICAgICAgICBmb3IgKHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyTG93ZXJJdGVyYXRvciBsSXQobV9sdSwgY29sKTsgbEl0OyArK2xJdCkgeworICAgICAgICAgICAgbEl0LnZhbHVlUmVmKCkgLz0gcGl2b3Q7CisgICAgICAgIH0KKworICAgICAgICAvL1VwcGVyIG1hdHJpeCB1cGRhdGUgLT4gY29udGlndW91cyBtZW1vcnkgYWNjZXNzCisgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyTG93ZXJJdGVyYXRvciBsSXQobV9sdSwgY29sKTsKKyAgICAgICAgZm9yIChJbmRleCBycm93ID0gcm93ICsgMTsgcnJvdyA8IG1fbHUucm93cygpOyBycm93KyspIHsKKyAgICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyVXBwZXJJdGVyYXRvciB1SXRQaXZvdChtX2x1LCByb3cpOworICAgICAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJVcHBlckl0ZXJhdG9yIHVJdChtX2x1LCBycm93KTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBjb2VmID0gbEl0LnZhbHVlKCk7CisKKyAgICAgICAgICAgIHVJdFBpdm90ICs9IChycm93IC0gcm93IC0gMSk7CisKKyAgICAgICAgICAgIC8vdXBkYXRlIHVwcGVyIHBhcnQgIC0+IGNvbnRpZ3VvdXMgbWVtb3J5IGFjY2VzcworICAgICAgICAgICAgZm9yICgrK3VJdFBpdm90OyB1SXQgJiYgdUl0UGl2b3Q7KSB7CisgICAgICAgICAgICAgICAgdUl0LnZhbHVlUmVmKCkgLT0gdUl0UGl2b3QudmFsdWUoKSAqIGNvZWY7CisKKyAgICAgICAgICAgICAgICArK3VJdDsKKyAgICAgICAgICAgICAgICArK3VJdFBpdm90OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytsSXQ7CisgICAgICAgIH0KKworICAgICAgICAvL1VwcGVyIG1hdHJpeCB1cGRhdGUgLT4gbm9uIGNvbnRpZ3VvdXMgbWVtb3J5IGFjY2VzcworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckxvd2VySXRlcmF0b3IgbEl0MyhtX2x1LCBjb2wpOworICAgICAgICBmb3IgKEluZGV4IHJyb3cgPSByb3cgKyAxOyBycm93IDwgbV9sdS5yb3dzKCk7IHJyb3crKykgeworICAgICAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJVcHBlckl0ZXJhdG9yIHVJdFBpdm90KG1fbHUsIHJvdyk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgY29lZiA9IGxJdDMudmFsdWUoKTsKKworICAgICAgICAgICAgLy91cGRhdGUgbG93ZXIgcGFydCAtPiAgbm9uIGNvbnRpZ3VvdXMgbWVtb3J5IGFjY2VzcworICAgICAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHJyb3cgLSByb3cgLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtX2x1LmNvZWZmUmVmTG93ZXIocnJvdywgcm93ICsgaSArIDEpIC09IHVJdFBpdm90LnZhbHVlKCkgKiBjb2VmOworICAgICAgICAgICAgICAgICsrdUl0UGl2b3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2xJdDM7CisgICAgICAgIH0KKyAgICAgICAgLy91cGRhdGUgZGlhZyAtPiBjb250aWd1b3VzCisgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyTG93ZXJJdGVyYXRvciBsSXQyKG1fbHUsIGNvbCk7CisgICAgICAgIGZvciAoSW5kZXggcnJvdyA9IHJvdyArIDE7IHJyb3cgPCBtX2x1LnJvd3MoKTsgcnJvdysrKSB7CisKKyAgICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyVXBwZXJJdGVyYXRvciB1SXRQaXZvdChtX2x1LCByb3cpOworICAgICAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJVcHBlckl0ZXJhdG9yIHVJdChtX2x1LCBycm93KTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBjb2VmID0gbEl0Mi52YWx1ZSgpOworCisgICAgICAgICAgICB1SXRQaXZvdCArPSAocnJvdyAtIHJvdyAtIDEpOworICAgICAgICAgICAgbV9sdS5jb2VmZlJlZkRpYWcocnJvdykgLT0gdUl0UGl2b3QudmFsdWUoKSAqIGNvZWY7CisgICAgICAgICAgICArK2xJdDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIFNreWxpbmVJbnBsYWNlTFU8TWF0cml4VHlwZT46OmNvbXB1dGVSb3dNYWpvcigpIHsKKyAgICBjb25zdCBzaXplX3Qgcm93cyA9IG1fbHUucm93cygpOworICAgIGNvbnN0IHNpemVfdCBjb2xzID0gbV9sdS5jb2xzKCk7CisKKyAgICBlaWdlbl9hc3NlcnQocm93cyA9PSBjb2xzICYmICJXZSBkbyBub3QgKHlldCkgc3VwcG9ydCByZWN0YW5ndWxhciBMVS4iKTsKKyAgICBlaWdlbl9hc3NlcnQobV9sdS5Jc1Jvd01ham9yICYmICJZb3UncmUgdHJ5aW5nIHRvIGFwcGx5IHJvd01ham9yIGRlY29tcG9zaXRpb24gb24gYSBDb2xNYWpvciBtYXRyaXggISIpOworCisgICAgZm9yIChJbmRleCByb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykgeworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lckxvd2VySXRlcmF0b3IgbGxJdChtX2x1LCByb3cpOworCisKKyAgICAgICAgZm9yIChJbmRleCBjb2wgPSBsbEl0LmNvbCgpOyBjb2wgPCByb3c7IGNvbCsrKSB7CisgICAgICAgICAgICBpZiAobV9sdS5jb2VmZkV4aXN0TG93ZXIocm93LCBjb2wpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGRpYWcgPSBtX2x1LmNvZWZmRGlhZyhjb2wpOworCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJMb3dlckl0ZXJhdG9yIGxJdChtX2x1LCByb3cpOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyVXBwZXJJdGVyYXRvciB1SXQobV9sdSwgY29sKTsKKworCisgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggb2Zmc2V0ID0gbEl0LmNvbCgpIC0gdUl0LnJvdygpOworCisKKyAgICAgICAgICAgICAgICBJbmRleCBzdG9wID0gb2Zmc2V0ID4gMCA/IGNvbCAtIGxJdC5jb2woKSA6IGNvbCAtIHVJdC5yb3coKTsKKworICAgICAgICAgICAgICAgIC8vI2RlZmluZSBWRUNUT1JJWkUKKyNpZmRlZiBWRUNUT1JJWkUKKyAgICAgICAgICAgICAgICBNYXA8VmVjdG9yWGQgPiByb3dWYWwobEl0LnZhbHVlUHRyKCkgKyAob2Zmc2V0ID4gMCA/IDAgOiAtb2Zmc2V0KSwgc3RvcCk7CisgICAgICAgICAgICAgICAgTWFwPFZlY3RvclhkID4gY29sVmFsKHVJdC52YWx1ZVB0cigpICsgKG9mZnNldCA+IDAgPyBvZmZzZXQgOiAwKSwgc3RvcCk7CisKKworICAgICAgICAgICAgICAgIFNjYWxhciBuZXdDb2VmZiA9IG1fbHUuY29lZmZMb3dlcihyb3csIGNvbCkgLSByb3dWYWwuZG90KGNvbFZhbCk7CisjZWxzZQorICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSAvL1NraXAgemVybyB2YWx1ZSBvZiBsSXQKKyAgICAgICAgICAgICAgICAgICAgdUl0ICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBlbHNlIC8vU2tpcCB6ZXJvIHZhbHVlcyBvZiB1SXQKKyAgICAgICAgICAgICAgICAgICAgbEl0ICs9IC1vZmZzZXQ7CisgICAgICAgICAgICAgICAgU2NhbGFyIG5ld0NvZWZmID0gbV9sdS5jb2VmZkxvd2VyKHJvdywgY29sKTsKKworICAgICAgICAgICAgICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBzdG9wOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhbGFyIHRtcCA9IG5ld0NvZWZmOworICAgICAgICAgICAgICAgICAgICBuZXdDb2VmZiA9IHRtcCAtIGxJdC52YWx1ZSgpICogdUl0LnZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICsrbEl0OworICAgICAgICAgICAgICAgICAgICArK3VJdDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIG1fbHUuY29lZmZSZWZMb3dlcihyb3csIGNvbCkgPSBuZXdDb2VmZiAvIGRpYWc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL1VwcGVyIG1hdHJpeCB1cGRhdGUKKyAgICAgICAgY29uc3QgSW5kZXggY29sID0gcm93OworICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbm5lclVwcGVySXRlcmF0b3IgdXVJdChtX2x1LCBjb2wpOworICAgICAgICBmb3IgKEluZGV4IHJyb3cgPSB1dUl0LnJvdygpOyBycm93IDwgY29sOyBycm93KyspIHsKKworICAgICAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJMb3dlckl0ZXJhdG9yIGxJdChtX2x1LCBycm93KTsKKyAgICAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyVXBwZXJJdGVyYXRvciB1SXQobV9sdSwgY29sKTsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG9mZnNldCA9IGxJdC5jb2woKSAtIHVJdC5yb3coKTsKKworICAgICAgICAgICAgSW5kZXggc3RvcCA9IG9mZnNldCA+IDAgPyBycm93IC0gbEl0LmNvbCgpIDogcnJvdyAtIHVJdC5yb3coKTsKKworI2lmZGVmIFZFQ1RPUklaRQorICAgICAgICAgICAgTWFwPFZlY3RvclhkID4gcm93VmFsKGxJdC52YWx1ZVB0cigpICsgKG9mZnNldCA+IDAgPyAwIDogLW9mZnNldCksIHN0b3ApOworICAgICAgICAgICAgTWFwPFZlY3RvclhkID4gY29sVmFsKHVJdC52YWx1ZVB0cigpICsgKG9mZnNldCA+IDAgPyBvZmZzZXQgOiAwKSwgc3RvcCk7CisKKyAgICAgICAgICAgIFNjYWxhciBuZXdDb2VmZiA9IG1fbHUuY29lZmZVcHBlcihycm93LCBjb2wpIC0gcm93VmFsLmRvdChjb2xWYWwpOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSAvL1NraXAgemVybyB2YWx1ZSBvZiBsSXQKKyAgICAgICAgICAgICAgICB1SXQgKz0gb2Zmc2V0OworICAgICAgICAgICAgZWxzZSAvL1NraXAgemVybyB2YWx1ZXMgb2YgdUl0CisgICAgICAgICAgICAgICAgbEl0ICs9IC1vZmZzZXQ7CisgICAgICAgICAgICBTY2FsYXIgbmV3Q29lZmYgPSBtX2x1LmNvZWZmVXBwZXIocnJvdywgY29sKTsKKyAgICAgICAgICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBzdG9wOyArK2spIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTY2FsYXIgdG1wID0gbmV3Q29lZmY7CisgICAgICAgICAgICAgICAgbmV3Q29lZmYgPSB0bXAgLSBsSXQudmFsdWUoKSAqIHVJdC52YWx1ZSgpOworCisgICAgICAgICAgICAgICAgKytsSXQ7CisgICAgICAgICAgICAgICAgKyt1SXQ7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIG1fbHUuY29lZmZSZWZVcHBlcihycm93LCBjb2wpID0gbmV3Q29lZmY7CisgICAgICAgIH0KKworCisgICAgICAgIC8vRGlhZyBtYXRyaXggdXBkYXRlCisgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyTG93ZXJJdGVyYXRvciBsSXQobV9sdSwgcm93KTsKKyAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJVcHBlckl0ZXJhdG9yIHVJdChtX2x1LCByb3cpOworCisgICAgICAgIGNvbnN0IEluZGV4IG9mZnNldCA9IGxJdC5jb2woKSAtIHVJdC5yb3coKTsKKworCisgICAgICAgIEluZGV4IHN0b3AgPSBvZmZzZXQgPiAwID8gbEl0LnNpemUoKSA6IHVJdC5zaXplKCk7CisjaWZkZWYgVkVDVE9SSVpFCisgICAgICAgIE1hcDxWZWN0b3JYZCA+IHJvd1ZhbChsSXQudmFsdWVQdHIoKSArIChvZmZzZXQgPiAwID8gMCA6IC1vZmZzZXQpLCBzdG9wKTsKKyAgICAgICAgTWFwPFZlY3RvclhkID4gY29sVmFsKHVJdC52YWx1ZVB0cigpICsgKG9mZnNldCA+IDAgPyBvZmZzZXQgOiAwKSwgc3RvcCk7CisgICAgICAgIFNjYWxhciBuZXdDb2VmZiA9IG1fbHUuY29lZmZEaWFnKHJvdykgLSByb3dWYWwuZG90KGNvbFZhbCk7CisjZWxzZQorICAgICAgICBpZiAob2Zmc2V0ID4gMCkgLy9Ta2lwIHplcm8gdmFsdWUgb2YgbEl0CisgICAgICAgICAgICB1SXQgKz0gb2Zmc2V0OworICAgICAgICBlbHNlIC8vU2tpcCB6ZXJvIHZhbHVlcyBvZiB1SXQKKyAgICAgICAgICAgIGxJdCArPSAtb2Zmc2V0OworICAgICAgICBTY2FsYXIgbmV3Q29lZmYgPSBtX2x1LmNvZWZmRGlhZyhyb3cpOworICAgICAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgc3RvcDsgKytrKSB7CisgICAgICAgICAgICBjb25zdCBTY2FsYXIgdG1wID0gbmV3Q29lZmY7CisgICAgICAgICAgICBuZXdDb2VmZiA9IHRtcCAtIGxJdC52YWx1ZSgpICogdUl0LnZhbHVlKCk7CisgICAgICAgICAgICArK2xJdDsKKyAgICAgICAgICAgICsrdUl0OworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgbV9sdS5jb2VmZlJlZkRpYWcocm93KSA9IG5ld0NvZWZmOworICAgIH0KK30KKworLyoqIENvbXB1dGVzICp4ID0gVV4tMSBMXi0xIGIKKyAqCisgKiBJZiBcYSB0cmFuc3Bvc2UgaXMgc2V0IHRvIFN2VHJhbnNwb3NlIG9yIFN2QWRqb2ludCwgdGhlIHNvbHV0aW9uCisgKiBvZiB0aGUgdHJhbnNwb3NlZC9hZGpvaW50IHN5c3RlbSBpcyBjb21wdXRlZCBpbnN0ZWFkLgorICoKKyAqIE5vdCBhbGwgYmFja2VuZHMgaW1wbGVtZW50IHRoZSBzb2x1dGlvbiBvZiB0aGUgdHJhbnNwb3NlZCBvcgorICogYWRqb2ludCBzeXN0ZW0uCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBCRGVyaXZlZCwgdHlwZW5hbWUgWERlcml2ZWQ+Citib29sIFNreWxpbmVJbnBsYWNlTFU8TWF0cml4VHlwZT46OnNvbHZlKGNvbnN0IE1hdHJpeEJhc2U8QkRlcml2ZWQ+ICZiLCBNYXRyaXhCYXNlPFhEZXJpdmVkPiogeCwgY29uc3QgaW50IHRyYW5zcG9zZWQpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3Qgcm93cyA9IG1fbHUucm93cygpOworICAgIGNvbnN0IHNpemVfdCBjb2xzID0gbV9sdS5jb2xzKCk7CisKKworICAgIGZvciAoSW5kZXggcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHsKKyAgICAgICAgeC0+Y29lZmZSZWYocm93KSA9IGIuY29lZmYocm93KTsKKyAgICAgICAgU2NhbGFyIG5ld1ZhbCA9IHgtPmNvZWZmKHJvdyk7CisgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OklubmVyTG93ZXJJdGVyYXRvciBsSXQobV9sdSwgcm93KTsKKworICAgICAgICBJbmRleCBjb2wgPSBsSXQuY29sKCk7CisgICAgICAgIHdoaWxlIChsSXQuY29sKCkgPCByb3cpIHsKKworICAgICAgICAgICAgbmV3VmFsIC09IHgtPmNvZWZmKGNvbCsrKSAqIGxJdC52YWx1ZSgpOworICAgICAgICAgICAgKytsSXQ7CisgICAgICAgIH0KKworICAgICAgICB4LT5jb2VmZlJlZihyb3cpID0gbmV3VmFsOworICAgIH0KKworCisgICAgZm9yIChJbmRleCBjb2wgPSByb3dzIC0gMTsgY29sID4gMDsgY29sLS0pIHsKKyAgICAgICAgeC0+Y29lZmZSZWYoY29sKSA9IHgtPmNvZWZmKGNvbCkgLyBtX2x1LmNvZWZmRGlhZyhjb2wpOworCisgICAgICAgIGNvbnN0IFNjYWxhciB4X2NvbCA9IHgtPmNvZWZmKGNvbCk7CisKKyAgICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5uZXJVcHBlckl0ZXJhdG9yIHVJdChtX2x1LCBjb2wpOworICAgICAgICB1SXQgKz0gdUl0LnNpemUoKS0xOworCisKKyAgICAgICAgd2hpbGUgKHVJdCkgeworICAgICAgICAgICAgeC0+Y29lZmZSZWYodUl0LnJvdygpKSAtPSB4X2NvbCAqIHVJdC52YWx1ZSgpOworICAgICAgICAgICAgLy9UT0RPIDogaW50cm9kdWNlIC0tb3BlcmF0b3IKKyAgICAgICAgICAgIHVJdCArPSAtMTsKKyAgICAgICAgfQorCisKKyAgICB9CisgICAgeC0+Y29lZmZSZWYoMCkgPSB4LT5jb2VmZigwKSAvIG1fbHUuY29lZmZEaWFnKDApOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0tZTElORUxVX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVNYXRyaXguaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmE4OTMzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NreWxpbmUvU2t5bGluZU1hdHJpeC5oCkBAIC0wLDAgKzEsODYyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEd1aWxsYXVtZSBTYXVwaW4gPGd1aWxsYXVtZS5zYXVwaW5AY2VhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TS1lMSU5FTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fU0tZTElORU1BVFJJWF9ICisKKyNpbmNsdWRlICJTa3lsaW5lU3RvcmFnZS5oIgorI2luY2x1ZGUgIlNreWxpbmVNYXRyaXhCYXNlLmgiCisKK25hbWVzcGFjZSBFaWdlbiB7IAorCisvKiogXGluZ3JvdXAgU2t5bGluZV9Nb2R1bGUKKyAqCisgKiBcY2xhc3MgU2t5bGluZU1hdHJpeAorICoKKyAqIFxicmllZiBUaGUgbWFpbiBza3lsaW5lIG1hdHJpeCBjbGFzcworICoKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNreWxpbmUgbWF0cml4IHVzaW5nIHRoZSB2ZXJ5IHVuY29tbW9uIHN0b3JhZ2UKKyAqIHNjaGVtZS4KKyAqCisgKiBccGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4gdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICogXHBhcmFtIF9PcHRpb25zIFVuaW9uIG9mIGJpdCBmbGFncyBjb250cm9sbGluZyB0aGUgc3RvcmFnZSBzY2hlbWUuIEN1cnJlbnRseSB0aGUgb25seSBwb3NzaWJpbGl0eQorICogICAgICAgICAgICAgICAgIGlzIFJvd01ham9yLiBUaGUgZGVmYXVsdCBpcyAwIHdoaWNoIG1lYW5zIGNvbHVtbi1tYWpvci4KKyAqCisgKgorICovCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zPgorc3RydWN0IHRyYWl0czxTa3lsaW5lTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zPiA+IHsKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgU3BhcnNlIFN0b3JhZ2VLaW5kOworCisgICAgZW51bSB7CisgICAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICAgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgICAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICAgICAgRmxhZ3MgPSBTa3lsaW5lQml0IHwgX09wdGlvbnMsCisgICAgICAgIENvZWZmUmVhZENvc3QgPSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhZENvc3QsCisgICAgfTsKK307Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucz4KK2NsYXNzIFNreWxpbmVNYXRyaXgKKzogcHVibGljIFNreWxpbmVNYXRyaXhCYXNlPFNreWxpbmVNYXRyaXg8X1NjYWxhciwgX09wdGlvbnM+ID4geworcHVibGljOgorICAgIEVJR0VOX1NLWUxJTkVfR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFKFNreWxpbmVNYXRyaXgpCisgICAgRUlHRU5fU0tZTElORV9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1IoU2t5bGluZU1hdHJpeCwgKz0pCisgICAgRUlHRU5fU0tZTElORV9JTkhFUklUX0FTU0lHTk1FTlRfT1BFUkFUT1IoU2t5bGluZU1hdHJpeCwgLT0pCisKKyAgICB1c2luZyBCYXNlOjpJc1Jvd01ham9yOworCitwcm90ZWN0ZWQ6CisKKyAgICB0eXBlZGVmIFNreWxpbmVNYXRyaXg8U2NhbGFyLCAoRmxhZ3MmflJvd01ham9yQml0KSB8IChJc1Jvd01ham9yID8gUm93TWFqb3JCaXQgOiAwKSA+IFRyYW5zcG9zZWRTa3lsaW5lTWF0cml4OworCisgICAgSW5kZXggbV9vdXRlclNpemU7CisgICAgSW5kZXggbV9pbm5lclNpemU7CisKK3B1YmxpYzoKKyAgICBJbmRleCogbV9jb2xTdGFydEluZGV4OworICAgIEluZGV4KiBtX3Jvd1N0YXJ0SW5kZXg7CisgICAgU2t5bGluZVN0b3JhZ2U8U2NhbGFyPiBtX2RhdGE7CisKK3B1YmxpYzoKKworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXJTaXplIDogbV9pbm5lclNpemU7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJc1Jvd01ham9yID8gbV9pbm5lclNpemUgOiBtX291dGVyU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pbm5lclNpemU7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb3V0ZXJTaXplOworICAgIH0KKworICAgIGlubGluZSBJbmRleCB1cHBlck5vblplcm9zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9kYXRhLnVwcGVyU2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBsb3dlck5vblplcm9zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9kYXRhLmxvd2VyU2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCB1cHBlck5vblplcm9zKEluZGV4IGopIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fY29sU3RhcnRJbmRleFtqICsgMV0gLSBtX2NvbFN0YXJ0SW5kZXhbal07CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IGxvd2VyTm9uWmVyb3MoSW5kZXggaikgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yb3dTdGFydEluZGV4W2ogKyAxXSAtIG1fcm93U3RhcnRJbmRleFtqXTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyKiBfZGlhZ1B0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICZtX2RhdGEuZGlhZygwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyKiBfZGlhZ1B0cigpIHsKKyAgICAgICAgcmV0dXJuICZtX2RhdGEuZGlhZygwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyKiBfdXBwZXJQdHIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAmbV9kYXRhLnVwcGVyKDApOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXIqIF91cHBlclB0cigpIHsKKyAgICAgICAgcmV0dXJuICZtX2RhdGEudXBwZXIoMCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciogX2xvd2VyUHRyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gJm1fZGF0YS5sb3dlcigwKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyKiBfbG93ZXJQdHIoKSB7CisgICAgICAgIHJldHVybiAmbV9kYXRhLmxvd2VyKDApOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBJbmRleCogX3VwcGVyUHJvZmlsZVB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICZtX2RhdGEudXBwZXJQcm9maWxlKDApOworICAgIH0KKworICAgIGlubGluZSBJbmRleCogX3VwcGVyUHJvZmlsZVB0cigpIHsKKyAgICAgICAgcmV0dXJuICZtX2RhdGEudXBwZXJQcm9maWxlKDApOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBJbmRleCogX2xvd2VyUHJvZmlsZVB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICZtX2RhdGEubG93ZXJQcm9maWxlKDApOworICAgIH0KKworICAgIGlubGluZSBJbmRleCogX2xvd2VyUHJvZmlsZVB0cigpIHsKKyAgICAgICAgcmV0dXJuICZtX2RhdGEubG93ZXJQcm9maWxlKDApOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXIgY29lZmYoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyIDwgb3V0ZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPCBpbm5lclNpemUoKSk7CisKKyAgICAgICAgaWYgKG91dGVyID09IGlubmVyKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5kaWFnKG91dGVyKTsKKworICAgICAgICBpZiAoSXNSb3dNYWpvcikgeworICAgICAgICAgICAgaWYgKGlubmVyID4gb3V0ZXIpIC8vdXBwZXIgbWF0cml4CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbWluT3V0ZXJJbmRleCA9IGlubmVyIC0gbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisgICAgICAgICAgICAgICAgaWYgKG91dGVyID49IG1pbk91dGVySW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEudXBwZXIobV9jb2xTdGFydEluZGV4W2lubmVyXSArIG91dGVyIC0gKGlubmVyIC0gbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcikpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2FsYXIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5uZXIgPCBvdXRlcikgLy9sb3dlciBtYXRyaXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtaW5Jbm5lckluZGV4ID0gb3V0ZXIgLSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5uZXIgPj0gbWluSW5uZXJJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5sb3dlcihtX3Jvd1N0YXJ0SW5kZXhbb3V0ZXJdICsgaW5uZXIgLSAob3V0ZXIgLSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtX2RhdGEudXBwZXIobV9jb2xTdGFydEluZGV4W2lubmVyXSArIG91dGVyIC0gaW5uZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG91dGVyID4gaW5uZXIpIC8vdXBwZXIgbWF0cml4CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4T3V0ZXJJbmRleCA9IGlubmVyICsgbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisgICAgICAgICAgICAgICAgaWYgKG91dGVyIDw9IG1heE91dGVySW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEudXBwZXIobV9jb2xTdGFydEluZGV4W2lubmVyXSArIChvdXRlciAtIGlubmVyKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NhbGFyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dGVyIDwgaW5uZXIpIC8vbG93ZXIgbWF0cml4CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4SW5uZXJJbmRleCA9IG91dGVyICsgbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5uZXIgPD0gbWF4SW5uZXJJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5sb3dlcihtX3Jvd1N0YXJ0SW5kZXhbb3V0ZXJdICsgKGlubmVyIC0gb3V0ZXIpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2FsYXIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiBjb2VmZlJlZihJbmRleCByb3csIEluZGV4IGNvbCkgeworICAgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKworICAgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPCBvdXRlclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciA8IGlubmVyU2l6ZSgpKTsKKworICAgICAgICBpZiAob3V0ZXIgPT0gaW5uZXIpCisgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLmRpYWcob3V0ZXIpOworCisgICAgICAgIGlmIChJc1Jvd01ham9yKSB7CisgICAgICAgICAgICBpZiAoY29sID4gcm93KSAvL3VwcGVyIG1hdHJpeAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1pbk91dGVySW5kZXggPSBpbm5lciAtIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpOworICAgICAgICAgICAgICAgIGVpZ2VuX2Fzc2VydChvdXRlciA+PSBtaW5PdXRlckluZGV4ICYmICJ5b3UgdHJ5IHRvIGFjY2VzIGEgY29lZmYgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLnVwcGVyKG1fY29sU3RhcnRJbmRleFtpbm5lcl0gKyBvdXRlciAtIChpbm5lciAtIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29sIDwgcm93KSAvL2xvd2VyIG1hdHJpeAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1pbklubmVySW5kZXggPSBvdXRlciAtIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworICAgICAgICAgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciA+PSBtaW5Jbm5lckluZGV4ICYmICJ5b3UgdHJ5IHRvIGFjY2VzIGEgY29lZmYgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLmxvd2VyKG1fcm93U3RhcnRJbmRleFtvdXRlcl0gKyBpbm5lciAtIChvdXRlciAtIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob3V0ZXIgPiBpbm5lcikgLy91cHBlciBtYXRyaXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtYXhPdXRlckluZGV4ID0gaW5uZXIgKyBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKTsKKyAgICAgICAgICAgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPD0gbWF4T3V0ZXJJbmRleCAmJiAieW91IHRyeSB0byBhY2NlcyBhIGNvZWZmIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzdG9yYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS51cHBlcihtX2NvbFN0YXJ0SW5kZXhbaW5uZXJdICsgKG91dGVyIC0gaW5uZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRlciA8IGlubmVyKSAvL2xvd2VyIG1hdHJpeAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1heElubmVySW5kZXggPSBvdXRlciArIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworICAgICAgICAgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciA8PSBtYXhJbm5lckluZGV4ICYmICJ5b3UgdHJ5IHRvIGFjY2VzIGEgY29lZmYgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLmxvd2VyKG1fcm93U3RhcnRJbmRleFtvdXRlcl0gKyAoaW5uZXIgLSBvdXRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciBjb2VmZkRpYWcoSW5kZXggaWR4KSBjb25zdCB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpZHggPCBvdXRlclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpZHggPCBpbm5lclNpemUoKSk7CisgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEuZGlhZyhpZHgpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXIgY29lZmZMb3dlcihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QgeworICAgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKworICAgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPCBvdXRlclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciA8IGlubmVyU2l6ZSgpKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyICE9IG91dGVyKTsKKworICAgICAgICBpZiAoSXNSb3dNYWpvcikgeworICAgICAgICAgICAgY29uc3QgSW5kZXggbWluSW5uZXJJbmRleCA9IG91dGVyIC0gbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcik7CisgICAgICAgICAgICBpZiAoaW5uZXIgPj0gbWluSW5uZXJJbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLmxvd2VyKG1fcm93U3RhcnRJbmRleFtvdXRlcl0gKyBpbm5lciAtIChvdXRlciAtIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIFNjYWxhcigwKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgSW5kZXggbWF4SW5uZXJJbmRleCA9IG91dGVyICsgbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcik7CisgICAgICAgICAgICBpZiAoaW5uZXIgPD0gbWF4SW5uZXJJbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLmxvd2VyKG1fcm93U3RhcnRJbmRleFtvdXRlcl0gKyAoaW5uZXIgLSBvdXRlcikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBTY2FsYXIoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmVXBwZXIoSW5kZXggcm93LCBJbmRleCBjb2wpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyIDwgb3V0ZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPCBpbm5lclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciAhPSBvdXRlcik7CisKKyAgICAgICAgaWYgKElzUm93TWFqb3IpIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG1pbk91dGVySW5kZXggPSBpbm5lciAtIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpOworICAgICAgICAgICAgaWYgKG91dGVyID49IG1pbk91dGVySW5kZXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS51cHBlcihtX2NvbFN0YXJ0SW5kZXhbaW5uZXJdICsgb3V0ZXIgLSAoaW5uZXIgLSBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBTY2FsYXIoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBtYXhPdXRlckluZGV4ID0gaW5uZXIgKyBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKTsKKyAgICAgICAgICAgIGlmIChvdXRlciA8PSBtYXhPdXRlckluZGV4KQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEudXBwZXIobV9jb2xTdGFydEluZGV4W2lubmVyXSArIChvdXRlciAtIGlubmVyKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIFNjYWxhcigwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmRGlhZyhJbmRleCBpZHgpIHsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlkeCA8IG91dGVyU2l6ZSgpKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlkeCA8IGlubmVyU2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHRoaXMtPm1fZGF0YS5kaWFnKGlkeCk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWZMb3dlcihJbmRleCByb3csIEluZGV4IGNvbCkgeworICAgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKworICAgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPCBvdXRlclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciA8IGlubmVyU2l6ZSgpKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyICE9IG91dGVyKTsKKworICAgICAgICBpZiAoSXNSb3dNYWpvcikgeworICAgICAgICAgICAgY29uc3QgSW5kZXggbWluSW5uZXJJbmRleCA9IG91dGVyIC0gbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcik7CisgICAgICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPj0gbWluSW5uZXJJbmRleCAmJiAieW91IHRyeSB0byBhY2NlcyBhIGNvZWZmIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzdG9yYWdlIik7CisgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLmxvd2VyKG1fcm93U3RhcnRJbmRleFtvdXRlcl0gKyBpbm5lciAtIChvdXRlciAtIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBtYXhJbm5lckluZGV4ID0gb3V0ZXIgKyBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKTsKKyAgICAgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciA8PSBtYXhJbm5lckluZGV4ICYmICJ5b3UgdHJ5IHRvIGFjY2VzIGEgY29lZmYgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEubG93ZXIobV9yb3dTdGFydEluZGV4W291dGVyXSArIChpbm5lciAtIG91dGVyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBjb2VmZkV4aXN0TG93ZXIoSW5kZXggcm93LCBJbmRleCBjb2wpIHsKKyAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyIDwgb3V0ZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPCBpbm5lclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciAhPSBvdXRlcik7CisKKyAgICAgICAgaWYgKElzUm93TWFqb3IpIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG1pbklubmVySW5kZXggPSBvdXRlciAtIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworICAgICAgICAgICAgcmV0dXJuIGlubmVyID49IG1pbklubmVySW5kZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBtYXhJbm5lckluZGV4ID0gb3V0ZXIgKyBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKTsKKyAgICAgICAgICAgIHJldHVybiBpbm5lciA8PSBtYXhJbm5lckluZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgY29lZmZSZWZVcHBlcihJbmRleCByb3csIEluZGV4IGNvbCkgeworICAgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKworICAgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPCBvdXRlclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciA8IGlubmVyU2l6ZSgpKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyICE9IG91dGVyKTsKKworICAgICAgICBpZiAoSXNSb3dNYWpvcikgeworICAgICAgICAgICAgY29uc3QgSW5kZXggbWluT3V0ZXJJbmRleCA9IGlubmVyIC0gbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisgICAgICAgICAgICBlaWdlbl9hc3NlcnQob3V0ZXIgPj0gbWluT3V0ZXJJbmRleCAmJiAieW91IHRyeSB0byBhY2NlcyBhIGNvZWZmIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzdG9yYWdlIik7CisgICAgICAgICAgICByZXR1cm4gdGhpcy0+bV9kYXRhLnVwcGVyKG1fY29sU3RhcnRJbmRleFtpbm5lcl0gKyBvdXRlciAtIChpbm5lciAtIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBtYXhPdXRlckluZGV4ID0gaW5uZXIgKyBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKTsKKyAgICAgICAgICAgIGVpZ2VuX2Fzc2VydChvdXRlciA8PSBtYXhPdXRlckluZGV4ICYmICJ5b3UgdHJ5IHRvIGFjY2VzIGEgY29lZmYgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLT5tX2RhdGEudXBwZXIobV9jb2xTdGFydEluZGV4W2lubmVyXSArIChvdXRlciAtIGlubmVyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBjb2VmZkV4aXN0VXBwZXIoSW5kZXggcm93LCBJbmRleCBjb2wpIHsKKyAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBJc1Jvd01ham9yID8gcm93IDogY29sOworICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyIDwgb3V0ZXJTaXplKCkpOworICAgICAgICBlaWdlbl9hc3NlcnQoaW5uZXIgPCBpbm5lclNpemUoKSk7CisgICAgICAgIGVpZ2VuX2Fzc2VydChpbm5lciAhPSBvdXRlcik7CisKKyAgICAgICAgaWYgKElzUm93TWFqb3IpIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG1pbk91dGVySW5kZXggPSBpbm5lciAtIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpOworICAgICAgICAgICAgcmV0dXJuIG91dGVyID49IG1pbk91dGVySW5kZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBtYXhPdXRlckluZGV4ID0gaW5uZXIgKyBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRlciA8PSBtYXhPdXRlckluZGV4OworICAgICAgICB9CisgICAgfQorCisKK3Byb3RlY3RlZDoKKworcHVibGljOgorICAgIGNsYXNzIElubmVyVXBwZXJJdGVyYXRvcjsKKyAgICBjbGFzcyBJbm5lckxvd2VySXRlcmF0b3I7CisKKyAgICBjbGFzcyBPdXRlclVwcGVySXRlcmF0b3I7CisgICAgY2xhc3MgT3V0ZXJMb3dlckl0ZXJhdG9yOworCisgICAgLyoqIFJlbW92ZXMgYWxsIG5vbiB6ZXJvcyAqLworICAgIGlubGluZSB2b2lkIHNldFplcm8oKSB7CisgICAgICAgIG1fZGF0YS5jbGVhcigpOworICAgICAgICBtZW1zZXQobV9jb2xTdGFydEluZGV4LCAwLCAobV9vdXRlclNpemUgKyAxKSAqIHNpemVvZiAoSW5kZXgpKTsKKyAgICAgICAgbWVtc2V0KG1fcm93U3RhcnRJbmRleCwgMCwgKG1fb3V0ZXJTaXplICsgMSkgKiBzaXplb2YgKEluZGV4KSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uIHplcm8gY29lZmZpY2llbnRzICovCisgICAgaW5saW5lIEluZGV4IG5vblplcm9zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9kYXRhLmRpYWdTaXplKCkgKyBtX2RhdGEudXBwZXJTaXplKCkgKyBtX2RhdGEubG93ZXJTaXplKCk7CisgICAgfQorCisgICAgLyoqIFByZWFsbG9jYXRlcyBcYSByZXNlcnZlU2l6ZSBub24gemVyb3MgKi8KKyAgICBpbmxpbmUgdm9pZCByZXNlcnZlKEluZGV4IHJlc2VydmVTaXplLCBJbmRleCByZXNlcnZlVXBwZXJTaXplLCBJbmRleCByZXNlcnZlTG93ZXJTaXplKSB7CisgICAgICAgIG1fZGF0YS5yZXNlcnZlKHJlc2VydmVTaXplLCByZXNlcnZlVXBwZXJTaXplLCByZXNlcnZlTG93ZXJTaXplKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBub3ZlbCBub24gemVybyBjb2VmZmljaWVudCB3aXRoIGNvb3JkaW5hdGVzIFxhIHJvdyB4IFxhIGNvbC4KKworICAgICAqCisgICAgICogXHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBjYW4gYmUgZXh0cmVtZWx5IHNsb3cgaWYgdGhlIG5vbiB6ZXJvIGNvZWZmaWNpZW50cworICAgICAqIGFyZSBub3QgaW5zZXJ0ZWQgaW4gYSBjb2hlcmVudCBvcmRlci4KKyAgICAgKgorICAgICAqIEFmdGVyIGFuIGluc2VydGlvbiBzZXNzaW9uLCB5b3Ugc2hvdWxkIGNhbGwgdGhlIGZpbmFsaXplKCkgZnVuY3Rpb24uCisgICAgICovCisgICAgRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyICYgaW5zZXJ0KEluZGV4IHJvdywgSW5kZXggY29sKSB7CisgICAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBJc1Jvd01ham9yID8gY29sIDogcm93OworCisgICAgICAgIGVpZ2VuX2Fzc2VydChvdXRlciA8IG91dGVyU2l6ZSgpKTsKKyAgICAgICAgZWlnZW5fYXNzZXJ0KGlubmVyIDwgaW5uZXJTaXplKCkpOworCisgICAgICAgIGlmIChvdXRlciA9PSBpbm5lcikKKyAgICAgICAgICAgIHJldHVybiBtX2RhdGEuZGlhZyhjb2wpOworCisgICAgICAgIGlmIChJc1Jvd01ham9yKSB7CisgICAgICAgICAgICBpZiAob3V0ZXIgPCBpbm5lcikgLy91cHBlciBtYXRyaXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbmRleCBtaW5PdXRlckluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBtaW5PdXRlckluZGV4ID0gaW5uZXIgLSBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKTsKKworICAgICAgICAgICAgICAgIGlmIChvdXRlciA8IG1pbk91dGVySW5kZXgpIC8vVGhlIHZhbHVlIGRvZXMgbm90IHlldCBleGlzdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggcHJldmlvdXNQcm9maWxlID0gbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisKKyAgICAgICAgICAgICAgICAgICAgbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcikgPSBpbm5lciAtIG91dGVyOworCisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggYmFuZEluY3JlbWVudCA9IG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpIC0gcHJldmlvdXNQcm9maWxlOworICAgICAgICAgICAgICAgICAgICAvL3NoaWZ0IGRhdGEgc3RvcmVkIGFmdGVyIHRoaXMgbmV3IG9uZQorICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBzdG9wID0gbV9jb2xTdGFydEluZGV4W2NvbHMoKV07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHN0YXJ0ID0gbV9jb2xTdGFydEluZGV4W2lubmVyXTsKKworCisgICAgICAgICAgICAgICAgICAgIGZvciAoSW5kZXggaW5uZXJJZHggPSBzdG9wOyBpbm5lcklkeCA+PSBzdGFydDsgaW5uZXJJZHgtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kYXRhLnVwcGVyKGlubmVySWR4ICsgYmFuZEluY3JlbWVudCkgPSBtX2RhdGEudXBwZXIoaW5uZXJJZHgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleCBpbm5lcklkeCA9IGNvbHMoKTsgaW5uZXJJZHggPiBpbm5lcjsgaW5uZXJJZHgtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xTdGFydEluZGV4W2lubmVySWR4XSArPSBiYW5kSW5jcmVtZW50OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy96ZXJvcyBuZXcgZGF0YQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQodGhpcy0+X3VwcGVyUHRyKCkgKyBzdGFydCwgMCwgKGJhbmRJbmNyZW1lbnQgLSAxKSAqIHNpemVvZiAoU2NhbGFyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS51cHBlcihtX2NvbFN0YXJ0SW5kZXhbaW5uZXJdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kYXRhLnVwcGVyKG1fY29sU3RhcnRJbmRleFtpbm5lcl0gKyBvdXRlciAtIChpbm5lciAtIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3V0ZXIgPiBpbm5lcikgLy9sb3dlciBtYXRyaXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBtaW5Jbm5lckluZGV4ID0gb3V0ZXIgLSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5uZXIgPCBtaW5Jbm5lckluZGV4KSAvL1RoZSB2YWx1ZSBkb2VzIG5vdCB5ZXQgZXhpc3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHByZXZpb3VzUHJvZmlsZSA9IG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworICAgICAgICAgICAgICAgICAgICBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKSA9IG91dGVyIC0gaW5uZXI7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggYmFuZEluY3JlbWVudCA9IG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpIC0gcHJldmlvdXNQcm9maWxlOworICAgICAgICAgICAgICAgICAgICAvL3NoaWZ0IGRhdGEgc3RvcmVkIGFmdGVyIHRoaXMgbmV3IG9uZQorICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBzdG9wID0gbV9yb3dTdGFydEluZGV4W3Jvd3MoKV07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHN0YXJ0ID0gbV9yb3dTdGFydEluZGV4W291dGVyXTsKKworCisgICAgICAgICAgICAgICAgICAgIGZvciAoSW5kZXggaW5uZXJJZHggPSBzdG9wOyBpbm5lcklkeCA+PSBzdGFydDsgaW5uZXJJZHgtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kYXRhLmxvd2VyKGlubmVySWR4ICsgYmFuZEluY3JlbWVudCkgPSBtX2RhdGEubG93ZXIoaW5uZXJJZHgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleCBpbm5lcklkeCA9IHJvd3MoKTsgaW5uZXJJZHggPiBvdXRlcjsgaW5uZXJJZHgtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9yb3dTdGFydEluZGV4W2lubmVySWR4XSArPSBiYW5kSW5jcmVtZW50OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy96ZXJvcyBuZXcgZGF0YQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQodGhpcy0+X2xvd2VyUHRyKCkgKyBzdGFydCwgMCwgKGJhbmRJbmNyZW1lbnQgLSAxKSAqIHNpemVvZiAoU2NhbGFyKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2RhdGEubG93ZXIobV9yb3dTdGFydEluZGV4W291dGVyXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS5sb3dlcihtX3Jvd1N0YXJ0SW5kZXhbb3V0ZXJdICsgaW5uZXIgLSAob3V0ZXIgLSBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvdXRlciA+IGlubmVyKSAvL3VwcGVyIG1hdHJpeAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1heE91dGVySW5kZXggPSBpbm5lciArIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpOworICAgICAgICAgICAgICAgIGlmIChvdXRlciA+IG1heE91dGVySW5kZXgpIC8vVGhlIHZhbHVlIGRvZXMgbm90IHlldCBleGlzdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggcHJldmlvdXNQcm9maWxlID0gbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcik7CisgICAgICAgICAgICAgICAgICAgIG1fZGF0YS51cHBlclByb2ZpbGUoaW5uZXIpID0gb3V0ZXIgLSBpbm5lcjsKKworICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBiYW5kSW5jcmVtZW50ID0gbV9kYXRhLnVwcGVyUHJvZmlsZShpbm5lcikgLSBwcmV2aW91c1Byb2ZpbGU7CisgICAgICAgICAgICAgICAgICAgIC8vc2hpZnQgZGF0YSBzdG9yZWQgYWZ0ZXIgdGhpcyBuZXcgb25lCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHN0b3AgPSBtX3Jvd1N0YXJ0SW5kZXhbcm93cygpXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggc3RhcnQgPSBtX3Jvd1N0YXJ0SW5kZXhbaW5uZXIgKyAxXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4IGlubmVySWR4ID0gc3RvcDsgaW5uZXJJZHggPj0gc3RhcnQ7IGlubmVySWR4LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGF0YS51cHBlcihpbm5lcklkeCArIGJhbmRJbmNyZW1lbnQpID0gbV9kYXRhLnVwcGVyKGlubmVySWR4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoSW5kZXggaW5uZXJJZHggPSBpbm5lciArIDE7IGlubmVySWR4IDwgb3V0ZXJTaXplKCkgKyAxOyBpbm5lcklkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3Jvd1N0YXJ0SW5kZXhbaW5uZXJJZHhdICs9IGJhbmRJbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHRoaXMtPl91cHBlclB0cigpICsgbV9yb3dTdGFydEluZGV4W2lubmVyXSArIHByZXZpb3VzUHJvZmlsZSArIDEsIDAsIChiYW5kSW5jcmVtZW50IC0gMSkgKiBzaXplb2YgKFNjYWxhcikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kYXRhLnVwcGVyKG1fcm93U3RhcnRJbmRleFtpbm5lcl0gKyBtX2RhdGEudXBwZXJQcm9maWxlKGlubmVyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS51cHBlcihtX3Jvd1N0YXJ0SW5kZXhbaW5uZXJdICsgKG91dGVyIC0gaW5uZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvdXRlciA8IGlubmVyKSAvL2xvd2VyIG1hdHJpeAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IG1heElubmVySW5kZXggPSBvdXRlciArIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpOworICAgICAgICAgICAgICAgIGlmIChpbm5lciA+IG1heElubmVySW5kZXgpIC8vVGhlIHZhbHVlIGRvZXMgbm90IHlldCBleGlzdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggcHJldmlvdXNQcm9maWxlID0gbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcik7CisgICAgICAgICAgICAgICAgICAgIG1fZGF0YS5sb3dlclByb2ZpbGUob3V0ZXIpID0gaW5uZXIgLSBvdXRlcjsKKworICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBiYW5kSW5jcmVtZW50ID0gbV9kYXRhLmxvd2VyUHJvZmlsZShvdXRlcikgLSBwcmV2aW91c1Byb2ZpbGU7CisgICAgICAgICAgICAgICAgICAgIC8vc2hpZnQgZGF0YSBzdG9yZWQgYWZ0ZXIgdGhpcyBuZXcgb25lCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGV4IHN0b3AgPSBtX2NvbFN0YXJ0SW5kZXhbY29scygpXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5kZXggc3RhcnQgPSBtX2NvbFN0YXJ0SW5kZXhbb3V0ZXIgKyAxXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4IGlubmVySWR4ID0gc3RvcDsgaW5uZXJJZHggPj0gc3RhcnQ7IGlubmVySWR4LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGF0YS5sb3dlcihpbm5lcklkeCArIGJhbmRJbmNyZW1lbnQpID0gbV9kYXRhLmxvd2VyKGlubmVySWR4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoSW5kZXggaW5uZXJJZHggPSBvdXRlciArIDE7IGlubmVySWR4IDwgb3V0ZXJTaXplKCkgKyAxOyBpbm5lcklkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbFN0YXJ0SW5kZXhbaW5uZXJJZHhdICs9IGJhbmRJbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHRoaXMtPl9sb3dlclB0cigpICsgbV9jb2xTdGFydEluZGV4W291dGVyXSArIHByZXZpb3VzUHJvZmlsZSArIDEsIDAsIChiYW5kSW5jcmVtZW50IC0gMSkgKiBzaXplb2YgKFNjYWxhcikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9kYXRhLmxvd2VyKG1fY29sU3RhcnRJbmRleFtvdXRlcl0gKyBtX2RhdGEubG93ZXJQcm9maWxlKG91dGVyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS5sb3dlcihtX2NvbFN0YXJ0SW5kZXhbb3V0ZXJdICsgKGlubmVyIC0gb3V0ZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgaW5zZXJ0aW5nIGEgc2V0IG9mIG5vbiB6ZXJvIGVudHJpZXMuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgIGlmIChJc1Jvd01ham9yKSB7CisgICAgICAgICAgICBpZiAocm93cygpID4gY29scygpKQorICAgICAgICAgICAgICAgIG1fZGF0YS5yZXNpemUoY29scygpLCBjb2xzKCksIHJvd3MoKSwgbV9jb2xTdGFydEluZGV4W2NvbHMoKV0gKyAxLCBtX3Jvd1N0YXJ0SW5kZXhbcm93cygpXSArIDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fZGF0YS5yZXNpemUocm93cygpLCBjb2xzKCksIHJvd3MoKSwgbV9jb2xTdGFydEluZGV4W2NvbHMoKV0gKyAxLCBtX3Jvd1N0YXJ0SW5kZXhbcm93cygpXSArIDEpOworCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGVpZ2VuX2Fzc2VydChyb3dzKCkgPT0gY29scygpICYmICJtZW1vcnkgcmVvcmdhbmlzYXRyaW9uIG9ubHkgd29ya3Mgd2l0aCBzdWFyZSBtYXRyaXgiKTsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgICAgICAgICAgIFNjYWxhciogbmV3QXJyYXkgPSBuZXcgU2NhbGFyW21fY29sU3RhcnRJbmRleFtjb2xzKCldICsgMSArIG1fcm93U3RhcnRJbmRleFtyb3dzKCldICsgMV07CisgICAgICAgICAgICAvLyAgICAgICAgICAgIEluZGV4IGRhdGFJZHggPSAwOworICAgICAgICAgICAgLy8gICAgICAgICAgICBmb3IgKEluZGV4IHJvdyA9IDA7IHJvdyA8IHJvd3MoKTsgcm93KyspIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBuYkxvd2VyRWx0cyA9IG1fcm93U3RhcnRJbmRleFtyb3cgKyAxXSAtIG1fcm93U3RhcnRJbmRleFtyb3ddOworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJuYkxvd2VyRWx0cyIgPDwgbmJMb3dlckVsdHMgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbWVtY3B5KG5ld0FycmF5ICsgZGF0YUlkeCwgbV9kYXRhLm1fbG93ZXIgKyBtX3Jvd1N0YXJ0SW5kZXhbcm93XSwgbmJMb3dlckVsdHMgKiBzaXplb2YgKFNjYWxhcikpOworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbV9yb3dTdGFydEluZGV4W3Jvd10gPSBkYXRhSWR4OworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZGF0YUlkeCArPSBuYkxvd2VyRWx0czsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBjb25zdCBJbmRleCBuYlVwcGVyRWx0cyA9IG1fY29sU3RhcnRJbmRleFtyb3cgKyAxXSAtIG1fY29sU3RhcnRJbmRleFtyb3ddOworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbWVtY3B5KG5ld0FycmF5ICsgZGF0YUlkeCwgbV9kYXRhLm1fdXBwZXIgKyBtX2NvbFN0YXJ0SW5kZXhbcm93XSwgbmJVcHBlckVsdHMgKiBzaXplb2YgKFNjYWxhcikpOworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbV9jb2xTdGFydEluZGV4W3Jvd10gPSBkYXRhSWR4OworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZGF0YUlkeCArPSBuYlVwcGVyRWx0czsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAgICAgICAgICAgIC8vdG9kbyA6IGRvbid0IGFjY2VzcyBtX2RhdGEgcHJvZmlsZSBkaXJlY3RseSA6IGFkZCBhbiBhY2Nlc3NvciBmcm9tIFNreWxpbmVNYXRyaXgKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgbV9yb3dTdGFydEluZGV4W3Jvd3MoKV0gPSBtX3Jvd1N0YXJ0SW5kZXhbcm93cygpLTFdICsgbV9kYXRhLmxvd2VyUHJvZmlsZShyb3dzKCktMSk7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIG1fY29sU3RhcnRJbmRleFtjb2xzKCldID0gbV9jb2xTdGFydEluZGV4W2NvbHMoKS0xXSArIG1fZGF0YS51cHBlclByb2ZpbGUoY29scygpLTEpOworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgZGVsZXRlW10gbV9kYXRhLm1fbG93ZXI7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIGRlbGV0ZVtdIG1fZGF0YS5tX3VwcGVyOworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgbV9kYXRhLm1fbG93ZXIgPSBuZXdBcnJheTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgbV9kYXRhLm1fdXBwZXIgPSBuZXdBcnJheTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyb3dzKCkgPiBjb2xzKCkpCisgICAgICAgICAgICAgICAgbV9kYXRhLnJlc2l6ZShjb2xzKCksIHJvd3MoKSwgY29scygpLCBtX3Jvd1N0YXJ0SW5kZXhbY29scygpXSArIDEsIG1fY29sU3RhcnRJbmRleFtjb2xzKCldICsgMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9kYXRhLnJlc2l6ZShyb3dzKCksIHJvd3MoKSwgY29scygpLCBtX3Jvd1N0YXJ0SW5kZXhbcm93cygpXSArIDEsIG1fY29sU3RhcnRJbmRleFtyb3dzKCldICsgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBzcXVlZXplKCkgeworICAgICAgICBmaW5hbGl6ZSgpOworICAgICAgICBtX2RhdGEuc3F1ZWV6ZSgpOworICAgIH0KKworICAgIHZvaWQgcHJ1bmUoU2NhbGFyIHJlZmVyZW5jZSwgUmVhbFNjYWxhciBlcHNpbG9uID0gZHVtbXlfcHJlY2lzaW9uPFJlYWxTY2FsYXIgPiAoKSkgeworICAgICAgICAvL1RPRE8KKyAgICB9CisKKyAgICAvKiogUmVzaXplcyB0aGUgbWF0cml4IHRvIGEgXGEgcm93cyB4IFxhIGNvbHMgbWF0cml4IGFuZCBpbml0aWFsaXplcyBpdCB0byB6ZXJvCisgICAgICogXHNhIHJlc2l6ZU5vblplcm9zKEluZGV4KSwgcmVzZXJ2ZSgpLCBzZXRaZXJvKCkKKyAgICAgKi8KKyAgICB2b2lkIHJlc2l6ZShzaXplX3Qgcm93cywgc2l6ZV90IGNvbHMpIHsKKyAgICAgICAgY29uc3QgSW5kZXggZGlhZ1NpemUgPSByb3dzID4gY29scyA/IGNvbHMgOiByb3dzOworICAgICAgICBtX2lubmVyU2l6ZSA9IElzUm93TWFqb3IgPyBjb2xzIDogcm93czsKKworICAgICAgICBlaWdlbl9hc3NlcnQocm93cyA9PSBjb2xzICYmICJTa3lsaW5lIG1hdHJpeCBtdXN0IGJlIHNxdWFyZSBtYXRyaXgiKTsKKworICAgICAgICBpZiAoZGlhZ1NpemUgJSAyKSB7IC8vIGRpYWdTaXplIGlzIG9kZAorICAgICAgICAgICAgY29uc3QgSW5kZXggayA9IChkaWFnU2l6ZSAtIDEpIC8gMjsKKworICAgICAgICAgICAgbV9kYXRhLnJlc2l6ZShkaWFnU2l6ZSwgSXNSb3dNYWpvciA/IGNvbHMgOiByb3dzLCBJc1Jvd01ham9yID8gcm93cyA6IGNvbHMsCisgICAgICAgICAgICAgICAgICAgIDIgKiBrICogayArIGsgKyAxLAorICAgICAgICAgICAgICAgICAgICAyICogayAqIGsgKyBrICsgMSk7CisKKyAgICAgICAgfSBlbHNlIC8vIGRpYWdTaXplIGlzIGV2ZW4KKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgSW5kZXggayA9IGRpYWdTaXplIC8gMjsKKyAgICAgICAgICAgIG1fZGF0YS5yZXNpemUoZGlhZ1NpemUsIElzUm93TWFqb3IgPyBjb2xzIDogcm93cywgSXNSb3dNYWpvciA/IHJvd3MgOiBjb2xzLAorICAgICAgICAgICAgICAgICAgICAyICogayAqIGsgLSBrICsgMSwKKyAgICAgICAgICAgICAgICAgICAgMiAqIGsgKiBrIC0gayArIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fY29sU3RhcnRJbmRleCAmJiBtX3Jvd1N0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1fY29sU3RhcnRJbmRleDsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1fcm93U3RhcnRJbmRleDsKKyAgICAgICAgfQorICAgICAgICBtX2NvbFN0YXJ0SW5kZXggPSBuZXcgSW5kZXggW2NvbHMgKyAxXTsKKyAgICAgICAgbV9yb3dTdGFydEluZGV4ID0gbmV3IEluZGV4IFtyb3dzICsgMV07CisgICAgICAgIG1fb3V0ZXJTaXplID0gZGlhZ1NpemU7CisKKyAgICAgICAgbV9kYXRhLnJlc2V0KCk7CisgICAgICAgIG1fZGF0YS5jbGVhcigpOworCisgICAgICAgIG1fb3V0ZXJTaXplID0gZGlhZ1NpemU7CisgICAgICAgIG1lbXNldChtX2NvbFN0YXJ0SW5kZXgsIDAsIChjb2xzICsgMSkgKiBzaXplb2YgKEluZGV4KSk7CisgICAgICAgIG1lbXNldChtX3Jvd1N0YXJ0SW5kZXgsIDAsIChyb3dzICsgMSkgKiBzaXplb2YgKEluZGV4KSk7CisgICAgfQorCisgICAgdm9pZCByZXNpemVOb25aZXJvcyhJbmRleCBzaXplKSB7CisgICAgICAgIG1fZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIFNreWxpbmVNYXRyaXgoKQorICAgIDogbV9vdXRlclNpemUoLTEpLCBtX2lubmVyU2l6ZSgwKSwgbV9jb2xTdGFydEluZGV4KDApLCBtX3Jvd1N0YXJ0SW5kZXgoMCkgeworICAgICAgICByZXNpemUoMCwgMCk7CisgICAgfQorCisgICAgaW5saW5lIFNreWxpbmVNYXRyaXgoc2l6ZV90IHJvd3MsIHNpemVfdCBjb2xzKQorICAgIDogbV9vdXRlclNpemUoMCksIG1faW5uZXJTaXplKDApLCBtX2NvbFN0YXJ0SW5kZXgoMCksIG1fcm93U3RhcnRJbmRleCgwKSB7CisgICAgICAgIHJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgICAgaW5saW5lIFNreWxpbmVNYXRyaXgoY29uc3QgU2t5bGluZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgOiBtX291dGVyU2l6ZSgwKSwgbV9pbm5lclNpemUoMCksIG1fY29sU3RhcnRJbmRleCgwKSwgbV9yb3dTdGFydEluZGV4KDApIHsKKyAgICAgICAgKnRoaXMgPSBvdGhlci5kZXJpdmVkKCk7CisgICAgfQorCisgICAgaW5saW5lIFNreWxpbmVNYXRyaXgoY29uc3QgU2t5bGluZU1hdHJpeCAmIG90aGVyKQorICAgIDogQmFzZSgpLCBtX291dGVyU2l6ZSgwKSwgbV9pbm5lclNpemUoMCksIG1fY29sU3RhcnRJbmRleCgwKSwgbV9yb3dTdGFydEluZGV4KDApIHsKKyAgICAgICAgKnRoaXMgPSBvdGhlci5kZXJpdmVkKCk7CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgc3dhcChTa3lsaW5lTWF0cml4ICYgb3RoZXIpIHsKKyAgICAgICAgLy9FSUdFTl9EQkdfU0tZTElORShzdGQ6OmNvdXQgPDwgIlNreWxpbmVNYXRyaXg6OiBzd2FwXG4iKTsKKyAgICAgICAgc3RkOjpzd2FwKG1fY29sU3RhcnRJbmRleCwgb3RoZXIubV9jb2xTdGFydEluZGV4KTsKKyAgICAgICAgc3RkOjpzd2FwKG1fcm93U3RhcnRJbmRleCwgb3RoZXIubV9yb3dTdGFydEluZGV4KTsKKyAgICAgICAgc3RkOjpzd2FwKG1faW5uZXJTaXplLCBvdGhlci5tX2lubmVyU2l6ZSk7CisgICAgICAgIHN0ZDo6c3dhcChtX291dGVyU2l6ZSwgb3RoZXIubV9vdXRlclNpemUpOworICAgICAgICBtX2RhdGEuc3dhcChvdGhlci5tX2RhdGEpOworICAgIH0KKworICAgIGlubGluZSBTa3lsaW5lTWF0cml4ICYgb3BlcmF0b3I9KGNvbnN0IFNreWxpbmVNYXRyaXggJiBvdGhlcikgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlNreWxpbmVNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBTa3lsaW5lTWF0cml4JiBvdGhlcilcbiI7CisgICAgICAgIGlmIChvdGhlci5pc1JWYWx1ZSgpKSB7CisgICAgICAgICAgICBzd2FwKG90aGVyLmNvbnN0X2Nhc3RfZGVyaXZlZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc2l6ZShvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisgICAgICAgICAgICBtZW1jcHkobV9jb2xTdGFydEluZGV4LCBvdGhlci5tX2NvbFN0YXJ0SW5kZXgsIChtX291dGVyU2l6ZSArIDEpICogc2l6ZW9mIChJbmRleCkpOworICAgICAgICAgICAgbWVtY3B5KG1fcm93U3RhcnRJbmRleCwgb3RoZXIubV9yb3dTdGFydEluZGV4LCAobV9vdXRlclNpemUgKyAxKSAqIHNpemVvZiAoSW5kZXgpKTsKKyAgICAgICAgICAgIG1fZGF0YSA9IG90aGVyLm1fZGF0YTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgICAgICAgICAgaW5saW5lIFNreWxpbmVNYXRyaXggJiBvcGVyYXRvcj0oY29uc3QgU2t5bGluZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIHsKKyAgICAgICAgY29uc3QgYm9vbCBuZWVkVG9UcmFuc3Bvc2UgPSAoRmxhZ3MgJiBSb3dNYWpvckJpdCkgIT0gKE90aGVyRGVyaXZlZDo6RmxhZ3MgJiBSb3dNYWpvckJpdCk7CisgICAgICAgIGlmIChuZWVkVG9UcmFuc3Bvc2UpIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgVE9ETworICAgICAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBzcGVjaWFsIG9wdGltaXphdGlvbgorICAgICAgICAgICAgcmV0dXJuIFNreWxpbmVNYXRyaXhCYXNlPFNreWxpbmVNYXRyaXg+OjpvcGVyYXRvcj0ob3RoZXIuZGVyaXZlZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0gJiBzLCBjb25zdCBTa3lsaW5lTWF0cml4ICYgbSkgeworCisgICAgICAgIEVJR0VOX0RCR19TS1lMSU5FKAorICAgICAgICBzdGQ6OmNvdXQgPDwgInVwcGVyIGVsZW1lbnRzIDogIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBtLm1fZGF0YS51cHBlclNpemUoKTsgaSsrKQorICAgICAgICAgICAgc3RkOjpjb3V0IDw8IG0ubV9kYXRhLnVwcGVyKGkpIDw8ICJcdCI7CisgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAidXBwZXIgcHJvZmlsZSA6ICIgPDwgc3RkOjplbmRsOworICAgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbS5tX2RhdGEudXBwZXJQcm9maWxlU2l6ZSgpOyBpKyspCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgbS5tX2RhdGEudXBwZXJQcm9maWxlKGkpIDw8ICJcdCI7CisgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAibG93ZXIgc3RhcnRJZHggOiAiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG0ubV9kYXRhLnVwcGVyUHJvZmlsZVNpemUoKTsgaSsrKQorICAgICAgICAgICAgc3RkOjpjb3V0IDw8IChJc1Jvd01ham9yID8gbS5tX2NvbFN0YXJ0SW5kZXhbaV0gOiBtLm1fcm93U3RhcnRJbmRleFtpXSkgPDwgIlx0IjsKKyAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKworCisgICAgICAgIHN0ZDo6Y291dCA8PCAibG93ZXIgZWxlbWVudHMgOiAiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG0ubV9kYXRhLmxvd2VyU2l6ZSgpOyBpKyspCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgbS5tX2RhdGEubG93ZXIoaSkgPDwgIlx0IjsKKyAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJsb3dlciBwcm9maWxlIDogIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBtLm1fZGF0YS5sb3dlclByb2ZpbGVTaXplKCk7IGkrKykKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBtLm1fZGF0YS5sb3dlclByb2ZpbGUoaSkgPDwgIlx0IjsKKyAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJsb3dlciBzdGFydElkeCA6ICIgPDwgc3RkOjplbmRsOworICAgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbS5tX2RhdGEubG93ZXJQcm9maWxlU2l6ZSgpOyBpKyspCisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgKElzUm93TWFqb3IgPyBtLm1fcm93U3RhcnRJbmRleFtpXSA6IG0ubV9jb2xTdGFydEluZGV4W2ldKSA8PCAiXHQiOworICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOworICAgICAgICApOworICAgICAgICBmb3IgKEluZGV4IHJvd0lkeCA9IDA7IHJvd0lkeCA8IG0ucm93cygpOyByb3dJZHgrKykgeworICAgICAgICAgICAgZm9yIChJbmRleCBjb2xJZHggPSAwOyBjb2xJZHggPCBtLmNvbHMoKTsgY29sSWR4KyspIHsKKyAgICAgICAgICAgICAgICBzIDw8IG0uY29lZmYocm93SWR4LCBjb2xJZHgpIDw8ICJcdCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICAvKiogRGVzdHJ1Y3RvciAqLworICAgIGlubGluZSB+U2t5bGluZU1hdHJpeCgpIHsKKyAgICAgICAgZGVsZXRlW10gbV9jb2xTdGFydEluZGV4OworICAgICAgICBkZWxldGVbXSBtX3Jvd1N0YXJ0SW5kZXg7CisgICAgfQorCisgICAgLyoqIE92ZXJsb2FkZWQgZm9yIHBlcmZvcm1hbmNlICovCisgICAgU2NhbGFyIHN1bSgpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgX09wdGlvbnM+CitjbGFzcyBTa3lsaW5lTWF0cml4PFNjYWxhciwgX09wdGlvbnM+OjpJbm5lclVwcGVySXRlcmF0b3IgeworcHVibGljOgorCisgICAgSW5uZXJVcHBlckl0ZXJhdG9yKGNvbnN0IFNreWxpbmVNYXRyaXgmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgOiBtX21hdHJpeChtYXQpLCBtX291dGVyKG91dGVyKSwKKyAgICBtX2lkKF9PcHRpb25zID09IFJvd01ham9yID8gbWF0Lm1fY29sU3RhcnRJbmRleFtvdXRlcl0gOiBtYXQubV9yb3dTdGFydEluZGV4W291dGVyXSArIDEpLAorICAgIG1fc3RhcnQobV9pZCksCisgICAgbV9lbmQoX09wdGlvbnMgPT0gUm93TWFqb3IgPyBtYXQubV9jb2xTdGFydEluZGV4W291dGVyICsgMV0gOiBtYXQubV9yb3dTdGFydEluZGV4W291dGVyICsgMV0gKyAxKSB7CisgICAgfQorCisgICAgaW5saW5lIElubmVyVXBwZXJJdGVyYXRvciAmIG9wZXJhdG9yKysoKSB7CisgICAgICAgIG1faWQrKzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBJbm5lclVwcGVySXRlcmF0b3IgJiBvcGVyYXRvcis9KEluZGV4IHNoaWZ0KSB7CisgICAgICAgIG1faWQgKz0gc2hpZnQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyIHZhbHVlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9tYXRyaXgubV9kYXRhLnVwcGVyKG1faWQpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXIqIHZhbHVlUHRyKCkgeworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxTY2FsYXIqPiAoJihtX21hdHJpeC5tX2RhdGEudXBwZXIobV9pZCkpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyJiB2YWx1ZVJlZigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyJj4gKG1fbWF0cml4Lm1fZGF0YS51cHBlcihtX2lkKSk7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IGluZGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXIgLSBtX21hdHJpeC5tX2RhdGEudXBwZXJQcm9maWxlKG1fb3V0ZXIpICsgKG1faWQgLSBtX3N0YXJ0KSA6CisgICAgICAgICAgICAgICAgbV9vdXRlciArIChtX2lkIC0gbV9zdGFydCkgKyAxOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJc1Jvd01ham9yID8gaW5kZXgoKSA6IG1fb3V0ZXI7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyIDogaW5kZXgoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX21hdHJpeC5tX2RhdGEudXBwZXJQcm9maWxlKG1fb3V0ZXIpOworICAgIH0KKworICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKG1faWQgPCBtX2VuZCkgJiYgKG1faWQgPj0gbV9zdGFydCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgY29uc3QgU2t5bGluZU1hdHJpeCYgbV9tYXRyaXg7CisgICAgY29uc3QgSW5kZXggbV9vdXRlcjsKKyAgICBJbmRleCBtX2lkOworICAgIGNvbnN0IEluZGV4IG1fc3RhcnQ7CisgICAgY29uc3QgSW5kZXggbV9lbmQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBfT3B0aW9ucz4KK2NsYXNzIFNreWxpbmVNYXRyaXg8U2NhbGFyLCBfT3B0aW9ucz46OklubmVyTG93ZXJJdGVyYXRvciB7CitwdWJsaWM6CisKKyAgICBJbm5lckxvd2VySXRlcmF0b3IoY29uc3QgU2t5bGluZU1hdHJpeCYgbWF0LCBJbmRleCBvdXRlcikKKyAgICA6IG1fbWF0cml4KG1hdCksCisgICAgbV9vdXRlcihvdXRlciksCisgICAgbV9pZChfT3B0aW9ucyA9PSBSb3dNYWpvciA/IG1hdC5tX3Jvd1N0YXJ0SW5kZXhbb3V0ZXJdIDogbWF0Lm1fY29sU3RhcnRJbmRleFtvdXRlcl0gKyAxKSwKKyAgICBtX3N0YXJ0KG1faWQpLAorICAgIG1fZW5kKF9PcHRpb25zID09IFJvd01ham9yID8gbWF0Lm1fcm93U3RhcnRJbmRleFtvdXRlciArIDFdIDogbWF0Lm1fY29sU3RhcnRJbmRleFtvdXRlciArIDFdICsgMSkgeworICAgIH0KKworICAgIGlubGluZSBJbm5lckxvd2VySXRlcmF0b3IgJiBvcGVyYXRvcisrKCkgeworICAgICAgICBtX2lkKys7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5uZXJMb3dlckl0ZXJhdG9yICYgb3BlcmF0b3IrPShJbmRleCBzaGlmdCkgeworICAgICAgICBtX2lkICs9IHNoaWZ0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciB2YWx1ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fbWF0cml4Lm1fZGF0YS5sb3dlcihtX2lkKTsKKyAgICB9CisKKyAgICBpbmxpbmUgU2NhbGFyKiB2YWx1ZVB0cigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2NhbGFyKj4gKCYobV9tYXRyaXgubV9kYXRhLmxvd2VyKG1faWQpKSk7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgdmFsdWVSZWYoKSB7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PFNjYWxhciY+IChtX21hdHJpeC5tX2RhdGEubG93ZXIobV9pZCkpOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBpbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyIC0gbV9tYXRyaXgubV9kYXRhLmxvd2VyUHJvZmlsZShtX291dGVyKSArIChtX2lkIC0gbV9zdGFydCkgOgorICAgICAgICAgICAgICAgIG1fb3V0ZXIgKyAobV9pZCAtIG1fc3RhcnQpICsgMTsKKyAgICAgICAgOworICAgIH0KKworICAgIGlubGluZSBJbmRleCByb3coKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJc1Jvd01ham9yID8gbV9vdXRlciA6IGluZGV4KCk7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElzUm93TWFqb3IgPyBpbmRleCgpIDogbV9vdXRlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX21hdHJpeC5tX2RhdGEubG93ZXJQcm9maWxlKG1fb3V0ZXIpOworICAgIH0KKworICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKG1faWQgPCBtX2VuZCkgJiYgKG1faWQgPj0gbV9zdGFydCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgY29uc3QgU2t5bGluZU1hdHJpeCYgbV9tYXRyaXg7CisgICAgY29uc3QgSW5kZXggbV9vdXRlcjsKKyAgICBJbmRleCBtX2lkOworICAgIGNvbnN0IEluZGV4IG1fc3RhcnQ7CisgICAgY29uc3QgSW5kZXggbV9lbmQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NreWxpbmVNYXRyaXhfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NreWxpbmUvU2t5bGluZU1hdHJpeEJhc2UuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVNYXRyaXhCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhMjM3MgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVNYXRyaXhCYXNlLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR3VpbGxhdW1lIFNhdXBpbiA8Z3VpbGxhdW1lLnNhdXBpbkBjZWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NLWUxJTkVNQVRSSVhCQVNFX0gKKyNkZWZpbmUgRUlHRU5fU0tZTElORU1BVFJJWEJBU0VfSAorCisjaW5jbHVkZSAiU2t5bGluZVV0aWwuaCIKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKiBcaW5ncm91cCBTa3lsaW5lX01vZHVsZQorICoKKyAqIFxjbGFzcyBTa3lsaW5lTWF0cml4QmFzZQorICoKKyAqIFxicmllZiBCYXNlIGNsYXNzIG9mIGFueSBza3lsaW5lIG1hdHJpY2VzIG9yIHNreWxpbmUgZXhwcmVzc2lvbnMKKyAqCisgKiBccGFyYW0gRGVyaXZlZAorICoKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgU2t5bGluZU1hdHJpeEJhc2UgOiBwdWJsaWMgRWlnZW5CYXNlPERlcml2ZWQ+IHsKK3B1YmxpYzoKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlN0b3JhZ2VLaW5kIFN0b3JhZ2VLaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmluZGV4PFN0b3JhZ2VLaW5kPjo6dHlwZSBJbmRleDsKKworICAgIGVudW0geworICAgICAgICBSb3dzQXRDb21waWxlVGltZSA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAvKio8IFRoZSBudW1iZXIgb2Ygcm93cyBhdCBjb21waWxlLXRpbWUuIFRoaXMgaXMganVzdCBhIGNvcHkgb2YgdGhlIHZhbHVlIHByb3ZpZGVkCisgICAgICAgICAqIGJ5IHRoZSBcYSBEZXJpdmVkIHR5cGUuIElmIGEgdmFsdWUgaXMgbm90IGtub3duIGF0IGNvbXBpbGUtdGltZSwKKyAgICAgICAgICogaXQgaXMgc2V0IHRvIHRoZSBcYSBEeW5hbWljIGNvbnN0YW50LgorICAgICAgICAgKiBcc2EgTWF0cml4QmFzZTo6cm93cygpLCBNYXRyaXhCYXNlOjpjb2xzKCksIENvbHNBdENvbXBpbGVUaW1lLCBTaXplQXRDb21waWxlVGltZSAqLworCisgICAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBjb2x1bW5zIGF0IGNvbXBpbGUtdGltZS4gVGhpcyBpcyBqdXN0IGEgY29weSBvZiB0aGUgdmFsdWUgcHJvdmlkZWQKKyAgICAgICAgICogYnkgdGhlIFxhIERlcml2ZWQgdHlwZS4gSWYgYSB2YWx1ZSBpcyBub3Qga25vd24gYXQgY29tcGlsZS10aW1lLAorICAgICAgICAgKiBpdCBpcyBzZXQgdG8gdGhlIFxhIER5bmFtaWMgY29uc3RhbnQuCisgICAgICAgICAqIFxzYSBNYXRyaXhCYXNlOjpyb3dzKCksIE1hdHJpeEJhc2U6OmNvbHMoKSwgUm93c0F0Q29tcGlsZVRpbWUsIFNpemVBdENvbXBpbGVUaW1lICovCisKKworICAgICAgICBTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvbHNBdENvbXBpbGVUaW1lPjo6cmV0KSwKKyAgICAgICAgLyoqPCBUaGlzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzLCBpLmUuIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICogcm93cyB0aW1lcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMsIG9yIHRvIFxhIER5bmFtaWMgaWYgdGhpcyBpcyBub3QKKyAgICAgICAgICoga25vd24gYXQgY29tcGlsZS10aW1lLiBcc2EgUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lICovCisKKyAgICAgICAgTWF4Um93c0F0Q29tcGlsZVRpbWUgPSBSb3dzQXRDb21waWxlVGltZSwKKyAgICAgICAgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBDb2xzQXRDb21waWxlVGltZSwKKworICAgICAgICBNYXhTaXplQXRDb21waWxlVGltZSA9IChpbnRlcm5hbDo6c2l6ZV9hdF9jb21waWxlX3RpbWU8TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lPjo6cmV0KSwKKworICAgICAgICBJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPSBSb3dzQXRDb21waWxlVGltZSA9PSAxIHx8IENvbHNBdENvbXBpbGVUaW1lID09IDEsCisgICAgICAgIC8qKjwgVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiBlaXRoZXIgdGhlIG51bWJlciBvZiByb3dzIG9yIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICogY29sdW1ucyBpcyBrbm93biBhdCBjb21waWxlLXRpbWUgdG8gYmUgZXF1YWwgdG8gMS4gSW5kZWVkLCBpbiB0aGF0IGNhc2UsCisgICAgICAgICAqIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBjb2x1bW4tdmVjdG9yIChpZiB0aGVyZSBpcyBvbmx5IG9uZSBjb2x1bW4pIG9yIHdpdGgKKyAgICAgICAgICogYSByb3ctdmVjdG9yIChpZiB0aGVyZSBpcyBvbmx5IG9uZSByb3cpLiAqLworCisgICAgICAgIEZsYWdzID0gaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MsCisgICAgICAgIC8qKjwgVGhpcyBzdG9yZXMgZXhwcmVzc2lvbiBccmVmIGZsYWdzIGZsYWdzIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGluaGVyaXRlZCBieSBuZXcgZXhwcmVzc2lvbnMKKyAgICAgICAgICogY29uc3RydWN0ZWQgZnJvbSB0aGlzIG9uZS4gU2VlIHRoZSBccmVmIGZsYWdzICJsaXN0IG9mIGZsYWdzIi4KKyAgICAgICAgICovCisKKyAgICAgICAgQ29lZmZSZWFkQ29zdCA9IGludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OkNvZWZmUmVhZENvc3QsCisgICAgICAgIC8qKjwgVGhpcyBpcyBhIHJvdWdoIG1lYXN1cmUgb2YgaG93IGV4cGVuc2l2ZSBpdCBpcyB0byByZWFkIG9uZSBjb2VmZmljaWVudCBmcm9tCisgICAgICAgICAqIHRoaXMgZXhwcmVzc2lvbi4KKyAgICAgICAgICovCisKKyAgICAgICAgSXNSb3dNYWpvciA9IEZsYWdzICYgUm93TWFqb3JCaXQgPyAxIDogMAorICAgIH07CisKKyNpZm5kZWYgRUlHRU5fUEFSU0VEX0JZX0RPWFlHRU4KKyAgICAvKiogVGhpcyBpcyB0aGUgInJlYWwgc2NhbGFyIiB0eXBlOyBpZiB0aGUgXGEgU2NhbGFyIHR5cGUgaXMgYWxyZWFkeSByZWFsIG51bWJlcnMKKyAgICAgKiAoZS5nLiBpbnQsIGZsb2F0IG9yIGRvdWJsZSkgdGhlbiBcYSBSZWFsU2NhbGFyIGlzIGp1c3QgdGhlIHNhbWUgYXMgXGEgU2NhbGFyLiBJZgorICAgICAqIFxhIFNjYWxhciBpcyBcYSBzdGQ6OmNvbXBsZXg8VD4gdGhlbiBSZWFsU2NhbGFyIGlzIFxhIFQuCisgICAgICoKKyAgICAgKiBcc2EgY2xhc3MgTnVtVHJhaXRzCisgICAgICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgICAgLyoqIHR5cGUgb2YgdGhlIGVxdWl2YWxlbnQgc3F1YXJlIG1hdHJpeCAqLworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRUlHRU5fU0laRV9NQVgoUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX1NJWkVfTUFYKFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSkgPiBTcXVhcmVNYXRyaXhUeXBlOworCisgICAgaW5saW5lIGNvbnN0IERlcml2ZWQmIGRlcml2ZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCo+ICh0aGlzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgRGVyaXZlZCYgZGVyaXZlZCgpIHsKKyAgICAgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4gKHRoaXMpOworICAgIH0KKworICAgIGlubGluZSBEZXJpdmVkJiBjb25zdF9jYXN0X2Rlcml2ZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZCo+IChjb25zdF9jYXN0PFNreWxpbmVNYXRyaXhCYXNlKj4gKHRoaXMpKTsKKyAgICB9CisjZW5kaWYgLy8gbm90IEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOCisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiByb3dzLiBcc2EgY29scygpLCBSb3dzQXRDb21waWxlVGltZSAqLworICAgIGlubGluZSBJbmRleCByb3dzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZGVyaXZlZCgpLnJvd3MoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zLiBcc2Egcm93cygpLCBDb2xzQXRDb21waWxlVGltZSovCisgICAgaW5saW5lIEluZGV4IGNvbHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBkZXJpdmVkKCkuY29scygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cywgd2hpY2ggaXMgXGEgcm93cygpKmNvbHMoKS4KKyAgICAgKiBcc2Egcm93cygpLCBjb2xzKCksIFNpemVBdENvbXBpbGVUaW1lLiAqLworICAgIGlubGluZSBJbmRleCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gcm93cygpICogY29scygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIHdoaWNoIGlzIGluIHByYWN0aWNlIHRoZSBudW1iZXIKKyAgICAgKiBvZiBzdG9yZWQgY29lZmZpY2llbnRzLiAqLworICAgIGlubGluZSBJbmRleCBub25aZXJvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGRlcml2ZWQoKS5ub25aZXJvcygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgc3RvcmFnZSBtYWpvciBkaW1lbnNpb24sCisgICAgICogaS5lLiwgdGhlIG51bWJlciBvZiBjb2x1bW5zIGZvciBhIGNvbHVtbnMgbWFqb3IgbWF0cml4LCBhbmQgdGhlIG51bWJlciBvZiByb3dzIG90aGVyd2lzZSAqLworICAgIEluZGV4IG91dGVyU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChpbnQoRmxhZ3MpICYgUm93TWFqb3JCaXQpID8gdGhpcy0+cm93cygpIDogdGhpcy0+Y29scygpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaW5uZXIgZGltZW5zaW9uIGFjY29yZGluZyB0byB0aGUgc3RvcmFnZSBvcmRlciwKKyAgICAgKiBpLmUuLCB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIGEgY29sdW1ucyBtYWpvciBtYXRyaXgsIGFuZCB0aGUgbnVtYmVyIG9mIGNvbHMgb3RoZXJ3aXNlICovCisgICAgSW5kZXggaW5uZXJTaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKGludChGbGFncykgJiBSb3dNYWpvckJpdCkgPyB0aGlzLT5jb2xzKCkgOiB0aGlzLT5yb3dzKCk7CisgICAgfQorCisgICAgYm9vbCBpc1JWYWx1ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faXNSVmFsdWU7CisgICAgfQorCisgICAgRGVyaXZlZCYgbWFya0FzUlZhbHVlKCkgeworICAgICAgICBtX2lzUlZhbHVlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisKKyAgICBTa3lsaW5lTWF0cml4QmFzZSgpIDogbV9pc1JWYWx1ZShmYWxzZSkgeworICAgICAgICAvKiBUT0RPIGNoZWNrIGZsYWdzICovCisgICAgfQorCisgICAgaW5saW5lIERlcml2ZWQgJiBvcGVyYXRvcj0oY29uc3QgRGVyaXZlZCYgb3RoZXIpIHsKKyAgICAgICAgdGhpcy0+b3BlcmF0b3I9PERlcml2ZWQgPiAob3RoZXIpOworICAgICAgICByZXR1cm4gZGVyaXZlZCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBpbmxpbmUgdm9pZCBhc3NpZ25HZW5lcmljKGNvbnN0IE90aGVyRGVyaXZlZCYgb3RoZXIpIHsKKyAgICAgICAgZGVyaXZlZCgpLnJlc2l6ZShvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisgICAgICAgIGZvciAoSW5kZXggcm93ID0gMDsgcm93IDwgcm93cygpOyByb3crKykKKyAgICAgICAgICAgIGZvciAoSW5kZXggY29sID0gMDsgY29sIDwgY29scygpOyBjb2wrKykgeworICAgICAgICAgICAgICAgIGlmIChvdGhlci5jb2VmZihyb3csIGNvbCkgIT0gU2NhbGFyKDApKQorICAgICAgICAgICAgICAgICAgICBkZXJpdmVkKCkuaW5zZXJ0KHJvdywgY29sKSA9IG90aGVyLmNvZWZmKHJvdywgY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVyaXZlZCgpLmZpbmFsaXplKCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICAgICAgICAgICAgaW5saW5lIERlcml2ZWQgJiBvcGVyYXRvcj0oY29uc3QgU2t5bGluZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIHsKKyAgICAgICAgLy9UT0RPCisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+CisgICAgICAgICAgICBpbmxpbmUgRGVyaXZlZCAmIG9wZXJhdG9yPShjb25zdCBTa3lsaW5lUHJvZHVjdDxMaHMsIFJocywgU2t5bGluZVRpbWVTa3lsaW5lUHJvZHVjdD4mIHByb2R1Y3QpOworCisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSAmIHMsIGNvbnN0IFNreWxpbmVNYXRyaXhCYXNlJiBtKSB7CisgICAgICAgIHMgPDwgbS5kZXJpdmVkKCk7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBjb25zdCB0eXBlbmFtZSBTa3lsaW5lUHJvZHVjdFJldHVyblR5cGU8RGVyaXZlZCwgT3RoZXJEZXJpdmVkPjo6VHlwZQorICAgIG9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdDsKKworICAgIC8qKiBcaW50ZXJuYWwgdXNlIG9wZXJhdG9yPSAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIERlbnNlRGVyaXZlZD4KKyAgICB2b2lkIGV2YWxUbyhNYXRyaXhCYXNlPERlbnNlRGVyaXZlZD4mIGRzdCkgY29uc3QgeworICAgICAgICBkc3Quc2V0WmVybygpOworICAgICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgcm93cygpOyBpKyspCisgICAgICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgcm93cygpOyBqKyspCisgICAgICAgICAgICAgICAgZHN0KGksIGopID0gZGVyaXZlZCgpLmNvZWZmKGksIGopOworICAgIH0KKworICAgIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZT4gdG9EZW5zZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgdGhlIG1hdHJpeCBvciB2ZWN0b3Igb2J0YWluZWQgYnkgZXZhbHVhdGluZyB0aGlzIGV4cHJlc3Npb24uCisgICAgICoKKyAgICAgKiBOb3RpY2UgdGhhdCBpbiB0aGUgY2FzZSBvZiBhIHBsYWluIG1hdHJpeCBvciB2ZWN0b3IgKG5vdCBhbiBleHByZXNzaW9uKSB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucworICAgICAqIGEgY29uc3QgcmVmZXJlbmNlLCBpbiBvcmRlciB0byBhdm9pZCBhIHVzZWxlc3MgY29weS4KKyAgICAgKi8KKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpldmFsPERlcml2ZWQsIElzU2t5bGluZT46OnR5cGUgZXZhbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHR5cGVuYW1lIGludGVybmFsOjpldmFsPERlcml2ZWQ+Ojp0eXBlKGRlcml2ZWQoKSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBtX2lzUlZhbHVlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9Ta3lsaW5lTWF0cml4QmFzZV9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lUHJvZHVjdC5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NreWxpbmUvU2t5bGluZVByb2R1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGRmNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NreWxpbmUvU2t5bGluZVByb2R1Y3QuaApAQCAtMCwwICsxLDI5NSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHdWlsbGF1bWUgU2F1cGluIDxndWlsbGF1bWUuc2F1cGluQGNlYS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpZm5kZWYgRUlHRU5fU0tZTElORVBST0RVQ1RfSAorI2RlZmluZSBFSUdFTl9TS1lMSU5FUFJPRFVDVF9ICisKK25hbWVzcGFjZSBFaWdlbiB7IAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgaW50IFByb2R1Y3RNb2RlPgorc3RydWN0IFNreWxpbmVQcm9kdWN0UmV0dXJuVHlwZSB7CisgICAgdHlwZWRlZiBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkPExocywgUmhzOjpSb3dzQXRDb21waWxlVGltZT46OnR5cGUgTGhzTmVzdGVkOworICAgIHR5cGVkZWYgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZDxSaHMsIExoczo6Um93c0F0Q29tcGlsZVRpbWU+Ojp0eXBlIFJoc05lc3RlZDsKKworICAgIHR5cGVkZWYgU2t5bGluZVByb2R1Y3Q8TGhzTmVzdGVkLCBSaHNOZXN0ZWQsIFByb2R1Y3RNb2RlPiBUeXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzTmVzdGVkLCB0eXBlbmFtZSBSaHNOZXN0ZWQsIGludCBQcm9kdWN0TW9kZT4KK3N0cnVjdCBpbnRlcm5hbDo6dHJhaXRzPFNreWxpbmVQcm9kdWN0PExoc05lc3RlZCwgUmhzTmVzdGVkLCBQcm9kdWN0TW9kZT4gPiB7CisgICAgLy8gY2xlYW4gdGhlIG5lc3RlZCB0eXBlczoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPExoc05lc3RlZD46OnR5cGUgX0xoc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPFJoc05lc3RlZD46OnR5cGUgX1Joc05lc3RlZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9MaHNOZXN0ZWQ6OlNjYWxhciBTY2FsYXI7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTGhzQ29lZmZSZWFkQ29zdCA9IF9MaHNOZXN0ZWQ6OkNvZWZmUmVhZENvc3QsCisgICAgICAgIFJoc0NvZWZmUmVhZENvc3QgPSBfUmhzTmVzdGVkOjpDb2VmZlJlYWRDb3N0LAorICAgICAgICBMaHNGbGFncyA9IF9MaHNOZXN0ZWQ6OkZsYWdzLAorICAgICAgICBSaHNGbGFncyA9IF9SaHNOZXN0ZWQ6OkZsYWdzLAorCisgICAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gX0xoc05lc3RlZDo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gX1Joc05lc3RlZDo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgICAgIElubmVyU2l6ZSA9IEVJR0VOX1NJWkVfTUlOX1BSRUZFUl9GSVhFRChfTGhzTmVzdGVkOjpDb2xzQXRDb21waWxlVGltZSwgX1Joc05lc3RlZDo6Um93c0F0Q29tcGlsZVRpbWUpLAorCisgICAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gX0xoc05lc3RlZDo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCisgICAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gX1Joc05lc3RlZDo6TWF4Q29sc0F0Q29tcGlsZVRpbWUsCisKKyAgICAgICAgRXZhbFRvUm93TWFqb3IgPSAoUmhzRmxhZ3MgJiBMaHNGbGFncyAmIFJvd01ham9yQml0KSwKKyAgICAgICAgUmVzdWx0SXNTa3lsaW5lID0gUHJvZHVjdE1vZGUgPT0gU2t5bGluZVRpbWVTa3lsaW5lUHJvZHVjdCwKKworICAgICAgICBSZW1vdmVkQml0cyA9IH4oKEV2YWxUb1Jvd01ham9yID8gMCA6IFJvd01ham9yQml0KSB8IChSZXN1bHRJc1NreWxpbmUgPyAwIDogU2t5bGluZUJpdCkpLAorCisgICAgICAgIEZsYWdzID0gKGludChMaHNGbGFncyB8IFJoc0ZsYWdzKSAmIEhlcmVkaXRhcnlCaXRzICYgUmVtb3ZlZEJpdHMpCisgICAgICAgIHwgRXZhbEJlZm9yZUFzc2lnbmluZ0JpdAorICAgICAgICB8IEV2YWxCZWZvcmVOZXN0aW5nQml0LAorCisgICAgICAgIENvZWZmUmVhZENvc3QgPSBEeW5hbWljCisgICAgfTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OmNvbmRpdGlvbmFsPFJlc3VsdElzU2t5bGluZSwKKyAgICAgICAgICAgIFNreWxpbmVNYXRyaXhCYXNlPFNreWxpbmVQcm9kdWN0PExoc05lc3RlZCwgUmhzTmVzdGVkLCBQcm9kdWN0TW9kZT4gPiwKKyAgICAgICAgICAgIE1hdHJpeEJhc2U8U2t5bGluZVByb2R1Y3Q8TGhzTmVzdGVkLCBSaHNOZXN0ZWQsIFByb2R1Y3RNb2RlPiA+ID46OnR5cGUgQmFzZTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNOZXN0ZWQsIHR5cGVuYW1lIFJoc05lc3RlZCwgaW50IFByb2R1Y3RNb2RlPgorY2xhc3MgU2t5bGluZVByb2R1Y3QgOiBub19hc3NpZ25tZW50X29wZXJhdG9yLAorcHVibGljIHRyYWl0czxTa3lsaW5lUHJvZHVjdDxMaHNOZXN0ZWQsIFJoc05lc3RlZCwgUHJvZHVjdE1vZGU+ID46OkJhc2UgeworcHVibGljOgorCisgICAgRUlHRU5fR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFKFNreWxpbmVQcm9kdWN0KQorCitwcml2YXRlOgorCisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8U2t5bGluZVByb2R1Y3Q+OjpfTGhzTmVzdGVkIF9MaHNOZXN0ZWQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8U2t5bGluZVByb2R1Y3Q+OjpfUmhzTmVzdGVkIF9SaHNOZXN0ZWQ7CisKK3B1YmxpYzoKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgU2t5bGluZVByb2R1Y3QoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQorICAgIDogbV9saHMobGhzKSwgbV9yaHMocmhzKSB7CisgICAgICAgIGVpZ2VuX2Fzc2VydChsaHMuY29scygpID09IHJocy5yb3dzKCkpOworCisgICAgICAgIGVudW0geworICAgICAgICAgICAgUHJvZHVjdElzVmFsaWQgPSBfTGhzTmVzdGVkOjpDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljCisgICAgICAgICAgICB8fCBfUmhzTmVzdGVkOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljCisgICAgICAgICAgICB8fCBpbnQoX0xoc05lc3RlZDo6Q29sc0F0Q29tcGlsZVRpbWUpID09IGludChfUmhzTmVzdGVkOjpSb3dzQXRDb21waWxlVGltZSksCisgICAgICAgICAgICBBcmVWZWN0b3JzID0gX0xoc05lc3RlZDo6SXNWZWN0b3JBdENvbXBpbGVUaW1lICYmIF9SaHNOZXN0ZWQ6OklzVmVjdG9yQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgIFNhbWVTaXplcyA9IEVJR0VOX1BSRURJQ0FURV9TQU1FX01BVFJJWF9TSVpFKF9MaHNOZXN0ZWQsIF9SaHNOZXN0ZWQpCisgICAgICAgIH07CisgICAgICAgIC8vIG5vdGUgdG8gdGhlIGxvc3QgdXNlcjoKKyAgICAgICAgLy8gICAgKiBmb3IgYSBkb3QgcHJvZHVjdCB1c2U6IHYxLmRvdCh2MikKKyAgICAgICAgLy8gICAgKiBmb3IgYSBjb2VmZi13aXNlIHByb2R1Y3QgdXNlOiB2MS5jd2lzZSgpKnYyCisgICAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoUHJvZHVjdElzVmFsaWQgfHwgIShBcmVWZWN0b3JzICYmIFNhbWVTaXplcyksCisgICAgICAgICAgICAgICAgSU5WQUxJRF9WRUNUT1JfVkVDVE9SX1BST0RVQ1RfX0lGX1lPVV9XQU5URURfQV9ET1RfT1JfQ09FRkZfV0lTRV9QUk9EVUNUX1lPVV9NVVNUX1VTRV9USEVfRVhQTElDSVRfRlVOQ1RJT05TKQorICAgICAgICAgICAgICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoUHJvZHVjdElzVmFsaWQgfHwgIShTYW1lU2l6ZXMgJiYgIUFyZVZlY3RvcnMpLAorICAgICAgICAgICAgICAgIElOVkFMSURfTUFUUklYX1BST0RVQ1RfX0lGX1lPVV9XQU5URURfQV9DT0VGRl9XSVNFX1BST0RVQ1RfWU9VX01VU1RfVVNFX1RIRV9FWFBMSUNJVF9GVU5DVElPTikKKyAgICAgICAgICAgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKFByb2R1Y3RJc1ZhbGlkIHx8IFNhbWVTaXplcywgSU5WQUxJRF9NQVRSSVhfUFJPRFVDVCkKKyAgICB9CisKKyAgICBFSUdFTl9TVFJPTkdfSU5MSU5FIEluZGV4IHJvd3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2xocy5yb3dzKCk7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yaHMuY29scygpOworICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgX0xoc05lc3RlZCYgbGhzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9saHM7CisgICAgfQorCisgICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBfUmhzTmVzdGVkJiByaHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3JoczsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBMaHNOZXN0ZWQgbV9saHM7CisgICAgUmhzTmVzdGVkIG1fcmhzOworfTsKKworLy8gZGVuc2UgPSBza3lsaW5lICogZGVuc2UKKy8vIE5vdGUgdGhhdCBoZXJlIHdlIGZvcmNlIG5vIGlubGluaW5nIGFuZCBzZXBhcmF0ZSB0aGUgc2V0WmVybygpIGJlY2F1c2UgR0NDIG1lc3NlcyB1cCBvdGhlcndpc2UKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlc3Q+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHNreWxpbmVfcm93X21ham9yX3RpbWVfZGVuc2VfcHJvZHVjdChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMsIERlc3QmIGRzdCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbDxMaHM+Ojp0eXBlIF9MaHM7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPFJocz46OnR5cGUgX1JoczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czxMaHM+OjpTY2FsYXIgU2NhbGFyOworCisgICAgZW51bSB7CisgICAgICAgIExoc0lzUm93TWFqb3IgPSAoX0xoczo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPT0gUm93TWFqb3JCaXQsCisgICAgICAgIExoc0lzU2VsZkFkam9pbnQgPSAoX0xoczo6RmxhZ3MgJiBTZWxmQWRqb2ludEJpdCkgPT0gU2VsZkFkam9pbnRCaXQsCisgICAgICAgIFByb2Nlc3NGaXJzdEhhbGYgPSBMaHNJc1NlbGZBZGpvaW50CisgICAgICAgICYmICgoKF9MaHM6OkZsYWdzICYgKFVwcGVyVHJpYW5ndWxhckJpdCB8IExvd2VyVHJpYW5ndWxhckJpdCkpID09IDApCisgICAgICAgIHx8ICgoX0xoczo6RmxhZ3MgJiBVcHBlclRyaWFuZ3VsYXJCaXQpICYmICFMaHNJc1Jvd01ham9yKQorICAgICAgICB8fCAoKF9MaHM6OkZsYWdzICYgTG93ZXJUcmlhbmd1bGFyQml0KSAmJiBMaHNJc1Jvd01ham9yKSksCisgICAgICAgIFByb2Nlc3NTZWNvbmRIYWxmID0gTGhzSXNTZWxmQWRqb2ludCAmJiAoIVByb2Nlc3NGaXJzdEhhbGYpCisgICAgfTsKKworICAgIC8vVXNlIG1hdHJpeCBkaWFnb25hbCBwYXJ0IDwtIEltcHJvdmVtZW50IDogdXNlIGlubmVyIGl0ZXJhdG9yIG9uIGRlbnNlIG1hdHJpeC4KKyAgICBmb3IgKEluZGV4IGNvbCA9IDA7IGNvbCA8IHJocy5jb2xzKCk7IGNvbCsrKSB7CisgICAgICAgIGZvciAoSW5kZXggcm93ID0gMDsgcm93IDwgbGhzLnJvd3MoKTsgcm93KyspIHsKKyAgICAgICAgICAgIGRzdChyb3csIGNvbCkgPSBsaHMuY29lZmZEaWFnKHJvdykgKiByaHMocm93LCBjb2wpOworICAgICAgICB9CisgICAgfQorICAgIC8vVXNlIG1hdHJpeCBsb3dlciB0cmlhbmd1bGFyIHBhcnQKKyAgICBmb3IgKEluZGV4IHJvdyA9IDA7IHJvdyA8IGxocy5yb3dzKCk7IHJvdysrKSB7CisgICAgICAgIHR5cGVuYW1lIF9MaHM6OklubmVyTG93ZXJJdGVyYXRvciBsSXQobGhzLCByb3cpOworICAgICAgICBjb25zdCBJbmRleCBzdG9wID0gbEl0LmNvbCgpICsgbEl0LnNpemUoKTsKKyAgICAgICAgZm9yIChJbmRleCBjb2wgPSAwOyBjb2wgPCByaHMuY29scygpOyBjb2wrKykgeworCisgICAgICAgICAgICBJbmRleCBrID0gbEl0LmNvbCgpOworICAgICAgICAgICAgU2NhbGFyIHRtcCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoayA8IHN0b3ApIHsKKyAgICAgICAgICAgICAgICB0bXAgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxJdC52YWx1ZSgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJocyhrKyssIGNvbCk7CisgICAgICAgICAgICAgICAgKytsSXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3Qocm93LCBjb2wpICs9IHRtcDsKKyAgICAgICAgICAgIGxJdCArPSAtbEl0LnNpemUoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy9Vc2UgbWF0cml4IHVwcGVyIHRyaWFuZ3VsYXIgcGFydAorICAgIGZvciAoSW5kZXggbGhzY29sID0gMDsgbGhzY29sIDwgbGhzLmNvbHMoKTsgbGhzY29sKyspIHsKKyAgICAgICAgdHlwZW5hbWUgX0xoczo6SW5uZXJVcHBlckl0ZXJhdG9yIHVJdChsaHMsIGxoc2NvbCk7CisgICAgICAgIGNvbnN0IEluZGV4IHN0b3AgPSB1SXQuc2l6ZSgpICsgdUl0LnJvdygpOworICAgICAgICBmb3IgKEluZGV4IHJoc2NvbCA9IDA7IHJoc2NvbCA8IHJocy5jb2xzKCk7IHJoc2NvbCsrKSB7CisKKworICAgICAgICAgICAgY29uc3QgU2NhbGFyIHJoc0NvZWZmID0gcmhzLmNvZWZmKGxoc2NvbCwgcmhzY29sKTsKKyAgICAgICAgICAgIEluZGV4IGsgPSB1SXQucm93KCk7CisgICAgICAgICAgICB3aGlsZSAoayA8IHN0b3ApIHsKKyAgICAgICAgICAgICAgICBkc3QoaysrLCByaHNjb2wpICs9CisgICAgICAgICAgICAgICAgICAgICAgICB1SXQudmFsdWUoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICByaHNDb2VmZjsKKyAgICAgICAgICAgICAgICArK3VJdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVJdCArPSAtdUl0LnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgRGVzdD4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgc2t5bGluZV9jb2xfbWFqb3JfdGltZV9kZW5zZV9wcm9kdWN0KGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgRGVzdCYgZHN0KSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGUgX0xoczsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGw8UmhzPjo6dHlwZSBfUmhzOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPExocz46OlNjYWxhciBTY2FsYXI7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTGhzSXNSb3dNYWpvciA9IChfTGhzOjpGbGFncyAmIFJvd01ham9yQml0KSA9PSBSb3dNYWpvckJpdCwKKyAgICAgICAgTGhzSXNTZWxmQWRqb2ludCA9IChfTGhzOjpGbGFncyAmIFNlbGZBZGpvaW50Qml0KSA9PSBTZWxmQWRqb2ludEJpdCwKKyAgICAgICAgUHJvY2Vzc0ZpcnN0SGFsZiA9IExoc0lzU2VsZkFkam9pbnQKKyAgICAgICAgJiYgKCgoX0xoczo6RmxhZ3MgJiAoVXBwZXJUcmlhbmd1bGFyQml0IHwgTG93ZXJUcmlhbmd1bGFyQml0KSkgPT0gMCkKKyAgICAgICAgfHwgKChfTGhzOjpGbGFncyAmIFVwcGVyVHJpYW5ndWxhckJpdCkgJiYgIUxoc0lzUm93TWFqb3IpCisgICAgICAgIHx8ICgoX0xoczo6RmxhZ3MgJiBMb3dlclRyaWFuZ3VsYXJCaXQpICYmIExoc0lzUm93TWFqb3IpKSwKKyAgICAgICAgUHJvY2Vzc1NlY29uZEhhbGYgPSBMaHNJc1NlbGZBZGpvaW50ICYmICghUHJvY2Vzc0ZpcnN0SGFsZikKKyAgICB9OworCisgICAgLy9Vc2UgbWF0cml4IGRpYWdvbmFsIHBhcnQgPC0gSW1wcm92ZW1lbnQgOiB1c2UgaW5uZXIgaXRlcmF0b3Igb24gZGVuc2UgbWF0cml4LgorICAgIGZvciAoSW5kZXggY29sID0gMDsgY29sIDwgcmhzLmNvbHMoKTsgY29sKyspIHsKKyAgICAgICAgZm9yIChJbmRleCByb3cgPSAwOyByb3cgPCBsaHMucm93cygpOyByb3crKykgeworICAgICAgICAgICAgZHN0KHJvdywgY29sKSA9IGxocy5jb2VmZkRpYWcocm93KSAqIHJocyhyb3csIGNvbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL1VzZSBtYXRyaXggdXBwZXIgdHJpYW5ndWxhciBwYXJ0CisgICAgZm9yIChJbmRleCByb3cgPSAwOyByb3cgPCBsaHMucm93cygpOyByb3crKykgeworICAgICAgICB0eXBlbmFtZSBfTGhzOjpJbm5lclVwcGVySXRlcmF0b3IgdUl0KGxocywgcm93KTsKKyAgICAgICAgY29uc3QgSW5kZXggc3RvcCA9IHVJdC5jb2woKSArIHVJdC5zaXplKCk7CisgICAgICAgIGZvciAoSW5kZXggY29sID0gMDsgY29sIDwgcmhzLmNvbHMoKTsgY29sKyspIHsKKworICAgICAgICAgICAgSW5kZXggayA9IHVJdC5jb2woKTsKKyAgICAgICAgICAgIFNjYWxhciB0bXAgPSAwOworICAgICAgICAgICAgd2hpbGUgKGsgPCBzdG9wKSB7CisgICAgICAgICAgICAgICAgdG1wICs9CisgICAgICAgICAgICAgICAgICAgICAgICB1SXQudmFsdWUoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICByaHMoaysrLCBjb2wpOworICAgICAgICAgICAgICAgICsrdUl0OworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGRzdChyb3csIGNvbCkgKz0gdG1wOworICAgICAgICAgICAgdUl0ICs9IC11SXQuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9Vc2UgbWF0cml4IGxvd2VyIHRyaWFuZ3VsYXIgcGFydAorICAgIGZvciAoSW5kZXggbGhzY29sID0gMDsgbGhzY29sIDwgbGhzLmNvbHMoKTsgbGhzY29sKyspIHsKKyAgICAgICAgdHlwZW5hbWUgX0xoczo6SW5uZXJMb3dlckl0ZXJhdG9yIGxJdChsaHMsIGxoc2NvbCk7CisgICAgICAgIGNvbnN0IEluZGV4IHN0b3AgPSBsSXQuc2l6ZSgpICsgbEl0LnJvdygpOworICAgICAgICBmb3IgKEluZGV4IHJoc2NvbCA9IDA7IHJoc2NvbCA8IHJocy5jb2xzKCk7IHJoc2NvbCsrKSB7CisKKyAgICAgICAgICAgIGNvbnN0IFNjYWxhciByaHNDb2VmZiA9IHJocy5jb2VmZihsaHNjb2wsIHJoc2NvbCk7CisgICAgICAgICAgICBJbmRleCBrID0gbEl0LnJvdygpOworICAgICAgICAgICAgd2hpbGUgKGsgPCBzdG9wKSB7CisgICAgICAgICAgICAgICAgZHN0KGsrKywgcmhzY29sKSArPQorICAgICAgICAgICAgICAgICAgICAgICAgbEl0LnZhbHVlKCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgcmhzQ29lZmY7CisgICAgICAgICAgICAgICAgKytsSXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsSXQgKz0gLWxJdC5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGUsCisgICAgICAgIGludCBMaHNTdG9yYWdlT3JkZXIgPSB0cmFpdHM8TGhzPjo6RmxhZ3MmUm93TWFqb3JCaXQ+CisgICAgICAgIHN0cnVjdCBza3lsaW5lX3Byb2R1Y3Rfc2VsZWN0b3I7CisKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXN1bHRUeXBlPgorc3RydWN0IHNreWxpbmVfcHJvZHVjdF9zZWxlY3RvcjxMaHMsIFJocywgUmVzdWx0VHlwZSwgUm93TWFqb3I+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czx0eXBlbmFtZSByZW1vdmVfYWxsPExocz46OnR5cGU+OjpTY2FsYXIgU2NhbGFyOworCisgICAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocywgUmVzdWx0VHlwZSAmIHJlcykgeworICAgICAgICBza3lsaW5lX3Jvd19tYWpvcl90aW1lX2RlbnNlX3Byb2R1Y3Q8TGhzLCBSaHMsIFJlc3VsdFR5cGUgPiAobGhzLCByaHMsIHJlcyk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlc3VsdFR5cGU+CitzdHJ1Y3Qgc2t5bGluZV9wcm9kdWN0X3NlbGVjdG9yPExocywgUmhzLCBSZXN1bHRUeXBlLCBDb2xNYWpvcj4geworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzPHR5cGVuYW1lIHJlbW92ZV9hbGw8TGhzPjo6dHlwZT46OlNjYWxhciBTY2FsYXI7CisKKyAgICBzdGF0aWMgdm9pZCBydW4oY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzLCBSZXN1bHRUeXBlICYgcmVzKSB7CisgICAgICAgIHNreWxpbmVfY29sX21ham9yX3RpbWVfZGVuc2VfcHJvZHVjdDxMaHMsIFJocywgUmVzdWx0VHlwZSA+IChsaHMsIHJocywgcmVzKTsKKyAgICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KKy8vIHRlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzID4KKy8vIERlcml2ZWQgJiBNYXRyaXhCYXNlPERlcml2ZWQ+OjpsYXp5QXNzaWduKGNvbnN0IFNreWxpbmVQcm9kdWN0PExocywgUmhzLCBTa3lsaW5lVGltZURlbnNlUHJvZHVjdD4mIHByb2R1Y3QpIHsKKy8vICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPExocz46OnR5cGUgX0xoczsKKy8vICAgICBpbnRlcm5hbDo6c2t5bGluZV9wcm9kdWN0X3NlbGVjdG9yPHR5cGVuYW1lIGludGVybmFsOjpyZW1vdmVfYWxsPExocz46OnR5cGUsCisvLyAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6cmVtb3ZlX2FsbDxSaHM+Ojp0eXBlLAorLy8gICAgICAgICAgICAgRGVyaXZlZD46OnJ1bihwcm9kdWN0LmxocygpLCBwcm9kdWN0LnJocygpLCBkZXJpdmVkKCkpOworLy8gCisvLyAgICAgcmV0dXJuIGRlcml2ZWQoKTsKKy8vIH0KKworLy8gc2t5bGluZSAqIGRlbnNlCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQgPgorRUlHRU5fU1RST05HX0lOTElORSBjb25zdCB0eXBlbmFtZSBTa3lsaW5lUHJvZHVjdFJldHVyblR5cGU8RGVyaXZlZCwgT3RoZXJEZXJpdmVkPjo6VHlwZQorU2t5bGluZU1hdHJpeEJhc2U8RGVyaXZlZD46Om9wZXJhdG9yKihjb25zdCBNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4gJm90aGVyKSBjb25zdCB7CisKKyAgICByZXR1cm4gdHlwZW5hbWUgU2t5bGluZVByb2R1Y3RSZXR1cm5UeXBlPERlcml2ZWQsIE90aGVyRGVyaXZlZD46OlR5cGUoZGVyaXZlZCgpLCBvdGhlci5kZXJpdmVkKCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1NLWUxJTkVQUk9EVUNUX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVTdG9yYWdlLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lU3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OGE4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lU3RvcmFnZS5oCkBAIC0wLDAgKzEsMjU5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEd1aWxsYXVtZSBTYXVwaW4gPGd1aWxsYXVtZS5zYXVwaW5AY2VhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TS1lMSU5FX1NUT1JBR0VfSAorI2RlZmluZSBFSUdFTl9TS1lMSU5FX1NUT1JBR0VfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFN0b3JlcyBhIHNreWxpbmUgc2V0IG9mIHZhbHVlcyBpbiB0aHJlZSBzdHJ1Y3R1cmVzIDoKKyAqIFRoZSBkaWFnb25hbCBlbGVtZW50cworICogVGhlIHVwcGVyIGVsZW1lbnRzCisgKiBUaGUgbG93ZXIgZWxlbWVudHMKKyAqCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK2NsYXNzIFNreWxpbmVTdG9yYWdlIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgICAgdHlwZWRlZiBTcGFyc2VJbmRleCBJbmRleDsKK3B1YmxpYzoKKworICAgIFNreWxpbmVTdG9yYWdlKCkKKyAgICA6IG1fZGlhZygwKSwKKyAgICBtX2xvd2VyKDApLAorICAgIG1fdXBwZXIoMCksCisgICAgbV9sb3dlclByb2ZpbGUoMCksCisgICAgbV91cHBlclByb2ZpbGUoMCksCisgICAgbV9kaWFnU2l6ZSgwKSwKKyAgICBtX3VwcGVyU2l6ZSgwKSwKKyAgICBtX2xvd2VyU2l6ZSgwKSwKKyAgICBtX3VwcGVyUHJvZmlsZVNpemUoMCksCisgICAgbV9sb3dlclByb2ZpbGVTaXplKDApLAorICAgIG1fYWxsb2NhdGVkU2l6ZSgwKSB7CisgICAgfQorCisgICAgU2t5bGluZVN0b3JhZ2UoY29uc3QgU2t5bGluZVN0b3JhZ2UmIG90aGVyKQorICAgIDogbV9kaWFnKDApLAorICAgIG1fbG93ZXIoMCksCisgICAgbV91cHBlcigwKSwKKyAgICBtX2xvd2VyUHJvZmlsZSgwKSwKKyAgICBtX3VwcGVyUHJvZmlsZSgwKSwKKyAgICBtX2RpYWdTaXplKDApLAorICAgIG1fdXBwZXJTaXplKDApLAorICAgIG1fbG93ZXJTaXplKDApLAorICAgIG1fdXBwZXJQcm9maWxlU2l6ZSgwKSwKKyAgICBtX2xvd2VyUHJvZmlsZVNpemUoMCksCisgICAgbV9hbGxvY2F0ZWRTaXplKDApIHsKKyAgICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICB9CisKKyAgICBTa3lsaW5lU3RvcmFnZSAmIG9wZXJhdG9yPShjb25zdCBTa3lsaW5lU3RvcmFnZSYgb3RoZXIpIHsKKyAgICAgICAgcmVzaXplKG90aGVyLmRpYWdTaXplKCksIG90aGVyLm1fdXBwZXJQcm9maWxlU2l6ZSwgb3RoZXIubV9sb3dlclByb2ZpbGVTaXplLCBvdGhlci51cHBlclNpemUoKSwgb3RoZXIubG93ZXJTaXplKCkpOworICAgICAgICBtZW1jcHkobV9kaWFnLCBvdGhlci5tX2RpYWcsIG1fZGlhZ1NpemUgKiBzaXplb2YgKFNjYWxhcikpOworICAgICAgICBtZW1jcHkobV91cHBlciwgb3RoZXIubV91cHBlciwgb3RoZXIudXBwZXJTaXplKCkgKiBzaXplb2YgKFNjYWxhcikpOworICAgICAgICBtZW1jcHkobV9sb3dlciwgb3RoZXIubV9sb3dlciwgb3RoZXIubG93ZXJTaXplKCkgKiBzaXplb2YgKFNjYWxhcikpOworICAgICAgICBtZW1jcHkobV91cHBlclByb2ZpbGUsIG90aGVyLm1fdXBwZXJQcm9maWxlLCBtX3VwcGVyUHJvZmlsZVNpemUgKiBzaXplb2YgKEluZGV4KSk7CisgICAgICAgIG1lbWNweShtX2xvd2VyUHJvZmlsZSwgb3RoZXIubV9sb3dlclByb2ZpbGUsIG1fbG93ZXJQcm9maWxlU2l6ZSAqIHNpemVvZiAoSW5kZXgpKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQgc3dhcChTa3lsaW5lU3RvcmFnZSYgb3RoZXIpIHsKKyAgICAgICAgc3RkOjpzd2FwKG1fZGlhZywgb3RoZXIubV9kaWFnKTsKKyAgICAgICAgc3RkOjpzd2FwKG1fdXBwZXIsIG90aGVyLm1fdXBwZXIpOworICAgICAgICBzdGQ6OnN3YXAobV9sb3dlciwgb3RoZXIubV9sb3dlcik7CisgICAgICAgIHN0ZDo6c3dhcChtX3VwcGVyUHJvZmlsZSwgb3RoZXIubV91cHBlclByb2ZpbGUpOworICAgICAgICBzdGQ6OnN3YXAobV9sb3dlclByb2ZpbGUsIG90aGVyLm1fbG93ZXJQcm9maWxlKTsKKyAgICAgICAgc3RkOjpzd2FwKG1fZGlhZ1NpemUsIG90aGVyLm1fZGlhZ1NpemUpOworICAgICAgICBzdGQ6OnN3YXAobV91cHBlclNpemUsIG90aGVyLm1fdXBwZXJTaXplKTsKKyAgICAgICAgc3RkOjpzd2FwKG1fbG93ZXJTaXplLCBvdGhlci5tX2xvd2VyU2l6ZSk7CisgICAgICAgIHN0ZDo6c3dhcChtX2FsbG9jYXRlZFNpemUsIG90aGVyLm1fYWxsb2NhdGVkU2l6ZSk7CisgICAgfQorCisgICAgflNreWxpbmVTdG9yYWdlKCkgeworICAgICAgICBkZWxldGVbXSBtX2RpYWc7CisgICAgICAgIGRlbGV0ZVtdIG1fdXBwZXI7CisgICAgICAgIGlmIChtX3VwcGVyICE9IG1fbG93ZXIpCisgICAgICAgICAgICBkZWxldGVbXSBtX2xvd2VyOworICAgICAgICBkZWxldGVbXSBtX3VwcGVyUHJvZmlsZTsKKyAgICAgICAgZGVsZXRlW10gbV9sb3dlclByb2ZpbGU7CisgICAgfQorCisgICAgdm9pZCByZXNlcnZlKEluZGV4IHNpemUsIEluZGV4IHVwcGVyUHJvZmlsZVNpemUsIEluZGV4IGxvd2VyUHJvZmlsZVNpemUsIEluZGV4IHVwcGVyU2l6ZSwgSW5kZXggbG93ZXJTaXplKSB7CisgICAgICAgIEluZGV4IG5ld0FsbG9jYXRlZFNpemUgPSBzaXplICsgdXBwZXJTaXplICsgbG93ZXJTaXplOworICAgICAgICBpZiAobmV3QWxsb2NhdGVkU2l6ZSA+IG1fYWxsb2NhdGVkU2l6ZSkKKyAgICAgICAgICAgIHJlYWxsb2NhdGUoc2l6ZSwgdXBwZXJQcm9maWxlU2l6ZSwgbG93ZXJQcm9maWxlU2l6ZSwgdXBwZXJTaXplLCBsb3dlclNpemUpOworICAgIH0KKworICAgIHZvaWQgc3F1ZWV6ZSgpIHsKKyAgICAgICAgaWYgKG1fYWxsb2NhdGVkU2l6ZSA+IG1fZGlhZ1NpemUgKyBtX3VwcGVyU2l6ZSArIG1fbG93ZXJTaXplKQorICAgICAgICAgICAgcmVhbGxvY2F0ZShtX2RpYWdTaXplLCBtX3VwcGVyUHJvZmlsZVNpemUsIG1fbG93ZXJQcm9maWxlU2l6ZSwgbV91cHBlclNpemUsIG1fbG93ZXJTaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6ZShJbmRleCBkaWFnU2l6ZSwgSW5kZXggdXBwZXJQcm9maWxlU2l6ZSwgSW5kZXggbG93ZXJQcm9maWxlU2l6ZSwgSW5kZXggdXBwZXJTaXplLCBJbmRleCBsb3dlclNpemUsIGZsb2F0IHJlc2VydmVTaXplRmFjdG9yID0gMCkgeworICAgICAgICBpZiAobV9hbGxvY2F0ZWRTaXplIDwgZGlhZ1NpemUgKyB1cHBlclNpemUgKyBsb3dlclNpemUpCisgICAgICAgICAgICByZWFsbG9jYXRlKGRpYWdTaXplLCB1cHBlclByb2ZpbGVTaXplLCBsb3dlclByb2ZpbGVTaXplLCB1cHBlclNpemUgKyBJbmRleChyZXNlcnZlU2l6ZUZhY3RvciAqIHVwcGVyU2l6ZSksIGxvd2VyU2l6ZSArIEluZGV4KHJlc2VydmVTaXplRmFjdG9yICogbG93ZXJTaXplKSk7CisgICAgICAgIG1fZGlhZ1NpemUgPSBkaWFnU2l6ZTsKKyAgICAgICAgbV91cHBlclNpemUgPSB1cHBlclNpemU7CisgICAgICAgIG1fbG93ZXJTaXplID0gbG93ZXJTaXplOworICAgICAgICBtX3VwcGVyUHJvZmlsZVNpemUgPSB1cHBlclByb2ZpbGVTaXplOworICAgICAgICBtX2xvd2VyUHJvZmlsZVNpemUgPSBsb3dlclByb2ZpbGVTaXplOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBkaWFnU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fZGlhZ1NpemU7CisgICAgfQorCisgICAgaW5saW5lIEluZGV4IHVwcGVyU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdXBwZXJTaXplOworICAgIH0KKworICAgIGlubGluZSBJbmRleCBsb3dlclNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2xvd2VyU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggdXBwZXJQcm9maWxlU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdXBwZXJQcm9maWxlU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggbG93ZXJQcm9maWxlU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fbG93ZXJQcm9maWxlU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXggYWxsb2NhdGVkU2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fYWxsb2NhdGVkU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbV9kaWFnU2l6ZSA9IDA7CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgZGlhZyhJbmRleCBpKSB7CisgICAgICAgIHJldHVybiBtX2RpYWdbaV07CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgZGlhZyhJbmRleCBpKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2RpYWdbaV07CisgICAgfQorCisgICAgaW5saW5lIFNjYWxhciYgdXBwZXIoSW5kZXggaSkgeworICAgICAgICByZXR1cm4gbV91cHBlcltpXTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgU2NhbGFyJiB1cHBlcihJbmRleCBpKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3VwcGVyW2ldOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIGxvd2VyKEluZGV4IGkpIHsKKyAgICAgICAgcmV0dXJuIG1fbG93ZXJbaV07CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IFNjYWxhciYgbG93ZXIoSW5kZXggaSkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9sb3dlcltpXTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXgmIHVwcGVyUHJvZmlsZShJbmRleCBpKSB7CisgICAgICAgIHJldHVybiBtX3VwcGVyUHJvZmlsZVtpXTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgSW5kZXgmIHVwcGVyUHJvZmlsZShJbmRleCBpKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3VwcGVyUHJvZmlsZVtpXTsKKyAgICB9CisKKyAgICBpbmxpbmUgSW5kZXgmIGxvd2VyUHJvZmlsZShJbmRleCBpKSB7CisgICAgICAgIHJldHVybiBtX2xvd2VyUHJvZmlsZVtpXTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgSW5kZXgmIGxvd2VyUHJvZmlsZShJbmRleCBpKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2xvd2VyUHJvZmlsZVtpXTsKKyAgICB9CisKKyAgICBzdGF0aWMgU2t5bGluZVN0b3JhZ2UgTWFwKEluZGV4KiB1cHBlclByb2ZpbGUsIEluZGV4KiBsb3dlclByb2ZpbGUsIFNjYWxhciogZGlhZywgU2NhbGFyKiB1cHBlciwgU2NhbGFyKiBsb3dlciwgSW5kZXggc2l6ZSwgSW5kZXggdXBwZXJTaXplLCBJbmRleCBsb3dlclNpemUpIHsKKyAgICAgICAgU2t5bGluZVN0b3JhZ2UgcmVzOworICAgICAgICByZXMubV91cHBlclByb2ZpbGUgPSB1cHBlclByb2ZpbGU7CisgICAgICAgIHJlcy5tX2xvd2VyUHJvZmlsZSA9IGxvd2VyUHJvZmlsZTsKKyAgICAgICAgcmVzLm1fZGlhZyA9IGRpYWc7CisgICAgICAgIHJlcy5tX3VwcGVyID0gdXBwZXI7CisgICAgICAgIHJlcy5tX2xvd2VyID0gbG93ZXI7CisgICAgICAgIHJlcy5tX2FsbG9jYXRlZFNpemUgPSByZXMubV9kaWFnU2l6ZSA9IHNpemU7CisgICAgICAgIHJlcy5tX3VwcGVyU2l6ZSA9IHVwcGVyU2l6ZTsKKyAgICAgICAgcmVzLm1fbG93ZXJTaXplID0gbG93ZXJTaXplOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlubGluZSB2b2lkIHJlc2V0KCkgeworICAgICAgICBtZW1zZXQobV9kaWFnLCAwLCBtX2RpYWdTaXplICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgbWVtc2V0KG1fdXBwZXIsIDAsIG1fdXBwZXJTaXplICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgbWVtc2V0KG1fbG93ZXIsIDAsIG1fbG93ZXJTaXplICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgbWVtc2V0KG1fdXBwZXJQcm9maWxlLCAwLCBtX2RpYWdTaXplICogc2l6ZW9mIChJbmRleCkpOworICAgICAgICBtZW1zZXQobV9sb3dlclByb2ZpbGUsIDAsIG1fZGlhZ1NpemUgKiBzaXplb2YgKEluZGV4KSk7CisgICAgfQorCisgICAgdm9pZCBwcnVuZShTY2FsYXIgcmVmZXJlbmNlLCBSZWFsU2NhbGFyIGVwc2lsb24gPSBkdW1teV9wcmVjaXNpb248UmVhbFNjYWxhcj4oKSkgeworICAgICAgICAvL1RPRE8KKyAgICB9CisKK3Byb3RlY3RlZDoKKworICAgIGlubGluZSB2b2lkIHJlYWxsb2NhdGUoSW5kZXggZGlhZ1NpemUsIEluZGV4IHVwcGVyUHJvZmlsZVNpemUsIEluZGV4IGxvd2VyUHJvZmlsZVNpemUsIEluZGV4IHVwcGVyU2l6ZSwgSW5kZXggbG93ZXJTaXplKSB7CisKKyAgICAgICAgU2NhbGFyKiBkaWFnID0gbmV3IFNjYWxhcltkaWFnU2l6ZV07CisgICAgICAgIFNjYWxhciogdXBwZXIgPSBuZXcgU2NhbGFyW3VwcGVyU2l6ZV07CisgICAgICAgIFNjYWxhciogbG93ZXIgPSBuZXcgU2NhbGFyW2xvd2VyU2l6ZV07CisgICAgICAgIEluZGV4KiB1cHBlclByb2ZpbGUgPSBuZXcgSW5kZXhbdXBwZXJQcm9maWxlU2l6ZV07CisgICAgICAgIEluZGV4KiBsb3dlclByb2ZpbGUgPSBuZXcgSW5kZXhbbG93ZXJQcm9maWxlU2l6ZV07CisKKyAgICAgICAgSW5kZXggY29weURpYWdTaXplID0gKHN0ZDo6bWluKShkaWFnU2l6ZSwgbV9kaWFnU2l6ZSk7CisgICAgICAgIEluZGV4IGNvcHlVcHBlclNpemUgPSAoc3RkOjptaW4pKHVwcGVyU2l6ZSwgbV91cHBlclNpemUpOworICAgICAgICBJbmRleCBjb3B5TG93ZXJTaXplID0gKHN0ZDo6bWluKShsb3dlclNpemUsIG1fbG93ZXJTaXplKTsKKyAgICAgICAgSW5kZXggY29weVVwcGVyUHJvZmlsZVNpemUgPSAoc3RkOjptaW4pKHVwcGVyUHJvZmlsZVNpemUsIG1fdXBwZXJQcm9maWxlU2l6ZSk7CisgICAgICAgIEluZGV4IGNvcHlMb3dlclByb2ZpbGVTaXplID0gKHN0ZDo6bWluKShsb3dlclByb2ZpbGVTaXplLCBtX2xvd2VyUHJvZmlsZVNpemUpOworCisgICAgICAgIC8vIGNvcHkKKyAgICAgICAgbWVtY3B5KGRpYWcsIG1fZGlhZywgY29weURpYWdTaXplICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgbWVtY3B5KHVwcGVyLCBtX3VwcGVyLCBjb3B5VXBwZXJTaXplICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgbWVtY3B5KGxvd2VyLCBtX2xvd2VyLCBjb3B5TG93ZXJTaXplICogc2l6ZW9mIChTY2FsYXIpKTsKKyAgICAgICAgbWVtY3B5KHVwcGVyUHJvZmlsZSwgbV91cHBlclByb2ZpbGUsIGNvcHlVcHBlclByb2ZpbGVTaXplICogc2l6ZW9mIChJbmRleCkpOworICAgICAgICBtZW1jcHkobG93ZXJQcm9maWxlLCBtX2xvd2VyUHJvZmlsZSwgY29weUxvd2VyUHJvZmlsZVNpemUgKiBzaXplb2YgKEluZGV4KSk7CisKKworCisgICAgICAgIC8vIGRlbGV0ZSBvbGQgc3R1ZmYKKyAgICAgICAgZGVsZXRlW10gbV9kaWFnOworICAgICAgICBkZWxldGVbXSBtX3VwcGVyOworICAgICAgICBkZWxldGVbXSBtX2xvd2VyOworICAgICAgICBkZWxldGVbXSBtX3VwcGVyUHJvZmlsZTsKKyAgICAgICAgZGVsZXRlW10gbV9sb3dlclByb2ZpbGU7CisgICAgICAgIG1fZGlhZyA9IGRpYWc7CisgICAgICAgIG1fdXBwZXIgPSB1cHBlcjsKKyAgICAgICAgbV9sb3dlciA9IGxvd2VyOworICAgICAgICBtX3VwcGVyUHJvZmlsZSA9IHVwcGVyUHJvZmlsZTsKKyAgICAgICAgbV9sb3dlclByb2ZpbGUgPSBsb3dlclByb2ZpbGU7CisgICAgICAgIG1fYWxsb2NhdGVkU2l6ZSA9IGRpYWdTaXplICsgdXBwZXJTaXplICsgbG93ZXJTaXplOworICAgICAgICBtX3VwcGVyU2l6ZSA9IHVwcGVyU2l6ZTsKKyAgICAgICAgbV9sb3dlclNpemUgPSBsb3dlclNpemU7CisgICAgfQorCitwdWJsaWM6CisgICAgU2NhbGFyKiBtX2RpYWc7CisgICAgU2NhbGFyKiBtX3VwcGVyOworICAgIFNjYWxhciogbV9sb3dlcjsKKyAgICBJbmRleCogbV91cHBlclByb2ZpbGU7CisgICAgSW5kZXgqIG1fbG93ZXJQcm9maWxlOworICAgIEluZGV4IG1fZGlhZ1NpemU7CisgICAgSW5kZXggbV91cHBlclNpemU7CisgICAgSW5kZXggbV9sb3dlclNpemU7CisgICAgSW5kZXggbV91cHBlclByb2ZpbGVTaXplOworICAgIEluZGV4IG1fbG93ZXJQcm9maWxlU2l6ZTsKKyAgICBJbmRleCBtX2FsbG9jYXRlZFNpemU7CisKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fQ09NUFJFU1NFRF9TVE9SQUdFX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Ta3lsaW5lL1NreWxpbmVVdGlsLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWI2MTIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU2t5bGluZS9Ta3lsaW5lVXRpbC5oCkBAIC0wLDAgKzEsODkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5IEd1aWxsYXVtZSBTYXVwaW4gPGd1aWxsYXVtZS5zYXVwaW5AY2VhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TS1lMSU5FVVRJTF9ICisjZGVmaW5lIEVJR0VOX1NLWUxJTkVVVElMX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKyNpZmRlZiBOREVCVUcKKyNkZWZpbmUgRUlHRU5fREJHX1NLWUxJTkUoWCkKKyNlbHNlCisjZGVmaW5lIEVJR0VOX0RCR19TS1lMSU5FKFgpIFgKKyNlbmRpZgorCitjb25zdCB1bnNpZ25lZCBpbnQgU2t5bGluZUJpdCA9IDB4MTIwMDsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdE1vZGU+IGNsYXNzIFNreWxpbmVQcm9kdWN0OworZW51bSBBZGRpdGlvbmFsUHJvZHVjdEV2YWx1YXRpb25Nb2RlIHtTa3lsaW5lVGltZURlbnNlUHJvZHVjdCwgU2t5bGluZVRpbWVTa3lsaW5lUHJvZHVjdCwgRGVuc2VUaW1lU2t5bGluZVByb2R1Y3R9OworZW51bSB7SXNTa3lsaW5lID0gU2t5bGluZUJpdH07CisKKworI2RlZmluZSBFSUdFTl9TS1lMSU5FX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUihEZXJpdmVkLCBPcCkgXAordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPiBcCitFSUdFTl9TVFJPTkdfSU5MSU5FIERlcml2ZWQmIG9wZXJhdG9yIE9wKGNvbnN0IEVpZ2VuOjpTa3lsaW5lTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBvdGhlcikgXAoreyBcCisgIHJldHVybiBCYXNlOjpvcGVyYXRvciBPcChvdGhlci5kZXJpdmVkKCkpOyBcCit9IFwKK0VJR0VOX1NUUk9OR19JTkxJTkUgRGVyaXZlZCYgb3BlcmF0b3IgT3AoY29uc3QgRGVyaXZlZCYgb3RoZXIpIFwKK3sgXAorICByZXR1cm4gQmFzZTo6b3BlcmF0b3IgT3Aob3RoZXIpOyBcCit9CisKKyNkZWZpbmUgRUlHRU5fU0tZTElORV9JTkhFUklUX1NDQUxBUl9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsIE9wKSBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcj4gXAorRUlHRU5fU1RST05HX0lOTElORSBEZXJpdmVkJiBvcGVyYXRvciBPcChjb25zdCBPdGhlciYgc2NhbGFyKSBcCit7IFwKKyAgcmV0dXJuIEJhc2U6Om9wZXJhdG9yIE9wKHNjYWxhcik7IFwKK30KKworI2RlZmluZSBFSUdFTl9TS1lMSU5FX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUlMoRGVyaXZlZCkgXAorICBFSUdFTl9TS1lMSU5FX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUihEZXJpdmVkLCA9KSBcCisgIEVJR0VOX1NLWUxJTkVfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsICs9KSBcCisgIEVJR0VOX1NLWUxJTkVfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKERlcml2ZWQsIC09KSBcCisgIEVJR0VOX1NLWUxJTkVfSU5IRVJJVF9TQ0FMQVJfQVNTSUdOTUVOVF9PUEVSQVRPUihEZXJpdmVkLCAqPSkgXAorICBFSUdFTl9TS1lMSU5FX0lOSEVSSVRfU0NBTEFSX0FTU0lHTk1FTlRfT1BFUkFUT1IoRGVyaXZlZCwgLz0pCisKKyNkZWZpbmUgX0VJR0VOX1NLWUxJTkVfR0VORVJJQ19QVUJMSUNfSU5URVJGQUNFKERlcml2ZWQsIEJhc2VDbGFzcykgXAorICB0eXBlZGVmIEJhc2VDbGFzcyBCYXNlOyBcCisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OmludGVybmFsOjp0cmFpdHM8RGVyaXZlZD46OlNjYWxhciBTY2FsYXI7IFwKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsgXAorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTdG9yYWdlS2luZCBTdG9yYWdlS2luZDsgXAorICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6aW5kZXg8U3RvcmFnZUtpbmQ+Ojp0eXBlIEluZGV4OyBcCisgIGVudW0geyAgRmxhZ3MgPSBFaWdlbjo6aW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6RmxhZ3MsIH07CisKKyNkZWZpbmUgRUlHRU5fU0tZTElORV9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCkgXAorICBfRUlHRU5fU0tZTElORV9HRU5FUklDX1BVQkxJQ19JTlRFUkZBQ0UoRGVyaXZlZCwgRWlnZW46OlNreWxpbmVNYXRyaXhCYXNlPERlcml2ZWQ+KQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBTa3lsaW5lTWF0cml4QmFzZTsKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRmxhZ3MgPSAwPiBjbGFzcyBTa3lsaW5lTWF0cml4OwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9GbGFncyA9IDA+IGNsYXNzIER5bmFtaWNTa3lsaW5lTWF0cml4OwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9GbGFncyA9IDA+IGNsYXNzIFNreWxpbmVWZWN0b3I7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0ZsYWdzID0gMD4gY2xhc3MgTWFwcGVkU2t5bGluZU1hdHJpeDsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+IHN0cnVjdCBza3lsaW5lX3Byb2R1Y3RfbW9kZTsKK3RlbXBsYXRlPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCBpbnQgUHJvZHVjdE1vZGUgPSBza3lsaW5lX3Byb2R1Y3RfbW9kZTxMaHMsUmhzPjo6dmFsdWU+IHN0cnVjdCBTa3lsaW5lUHJvZHVjdFJldHVyblR5cGU7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIGV2YWw8VCxJc1NreWxpbmU+Cit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM8VD46OlNjYWxhciBfU2NhbGFyOworICAgIGVudW0geworICAgICAgICAgIF9GbGFncyA9IHRyYWl0czxUPjo6RmxhZ3MKKyAgICB9OworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNreWxpbmVNYXRyaXg8X1NjYWxhciwgX0ZsYWdzPiB0eXBlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU0tZTElORVVUSUxfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0Jsb2NrT2ZEeW5hbWljU3BhcnNlTWF0cml4LmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvQmxvY2tPZkR5bmFtaWNTcGFyc2VNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI0YTczCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0Jsb2NrT2ZEeW5hbWljU3BhcnNlTWF0cml4LmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQQVJTRV9CTE9DS0ZPUkRZTkFNSUNNQVRSSVhfSAorI2RlZmluZSBFSUdFTl9TUEFSU0VfQkxPQ0tGT1JEWU5BTUlDTUFUUklYX0gKKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc3BlY2lhbGlzYXRpb24gZm9yIER5bmFtaWNTcGFyc2VNYXRyaXgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXgsIGludCBTaXplPgorY2xhc3MgU3BhcnNlSW5uZXJWZWN0b3JTZXQ8RHluYW1pY1NwYXJzZU1hdHJpeDxfU2NhbGFyLCBfT3B0aW9ucywgX0luZGV4PiwgU2l6ZT4KKyAgOiBwdWJsaWMgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VJbm5lclZlY3RvclNldDxEeW5hbWljU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfSW5kZXg+LCBTaXplPiA+Cit7CisgICAgdHlwZWRlZiBEeW5hbWljU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfSW5kZXg+IE1hdHJpeFR5cGU7CisgIHB1YmxpYzoKKworICAgIGVudW0geyBJc1Jvd01ham9yID0gaW50ZXJuYWw6OnRyYWl0czxTcGFyc2VJbm5lclZlY3RvclNldD46OklzUm93TWFqb3IgfTsKKworICAgIEVJR0VOX1NQQVJTRV9QVUJMSUNfSU5URVJGQUNFKFNwYXJzZUlubmVyVmVjdG9yU2V0KQorICAgIGNsYXNzIElubmVySXRlcmF0b3I6IHB1YmxpYyBNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yCisgICAgeworICAgICAgcHVibGljOgorICAgICAgICBpbmxpbmUgSW5uZXJJdGVyYXRvcihjb25zdCBTcGFyc2VJbm5lclZlY3RvclNldCYgeHByLCBJbmRleCBvdXRlcikKKyAgICAgICAgICA6IE1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IoeHByLm1fbWF0cml4LCB4cHIubV9vdXRlclN0YXJ0ICsgb3V0ZXIpLCBtX291dGVyKG91dGVyKQorICAgICAgICB7fQorICAgICAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXIgOiB0aGlzLT5pbmRleCgpOyB9CisgICAgICAgIGlubGluZSBJbmRleCBjb2woKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gdGhpcy0+aW5kZXgoKSA6IG1fb3V0ZXI7IH0KKyAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgSW5kZXggbV9vdXRlcjsKKyAgICB9OworCisgICAgaW5saW5lIFNwYXJzZUlubmVyVmVjdG9yU2V0KGNvbnN0IE1hdHJpeFR5cGUmIG1hdHJpeCwgSW5kZXggb3V0ZXJTdGFydCwgSW5kZXggb3V0ZXJTaXplKQorICAgICAgOiBtX21hdHJpeChtYXRyaXgpLCBtX291dGVyU3RhcnQob3V0ZXJTdGFydCksIG1fb3V0ZXJTaXplKG91dGVyU2l6ZSkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoIChvdXRlclN0YXJ0Pj0wKSAmJiAoKG91dGVyU3RhcnQrb3V0ZXJTaXplKTw9bWF0cml4Lm91dGVyU2l6ZSgpKSApOworICAgIH0KKworICAgIGlubGluZSBTcGFyc2VJbm5lclZlY3RvclNldChjb25zdCBNYXRyaXhUeXBlJiBtYXRyaXgsIEluZGV4IG91dGVyKQorICAgICAgOiBtX21hdHJpeChtYXRyaXgpLCBtX291dGVyU3RhcnQob3V0ZXIpLCBtX291dGVyU2l6ZShTaXplKQorICAgIHsKKyAgICAgIGVpZ2VuX2Fzc2VydChTaXplIT1EeW5hbWljKTsKKyAgICAgIGVpZ2VuX2Fzc2VydCggKG91dGVyPj0wKSAmJiAob3V0ZXI8bWF0cml4Lm91dGVyU2l6ZSgpKSApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBpbmxpbmUgU3BhcnNlSW5uZXJWZWN0b3JTZXQmIG9wZXJhdG9yPShjb25zdCBTcGFyc2VNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQorICAgIHsKKyAgICAgIGlmIChJc1Jvd01ham9yICE9ICgoT3RoZXJEZXJpdmVkOjpGbGFncyZSb3dNYWpvckJpdCk9PVJvd01ham9yQml0KSkKKyAgICAgIHsKKyAgICAgICAgLy8gbmVlZCB0byB0cmFuc3Bvc2UgPT4gcGVyZm9ybSBhIGJsb2NrIGV2YWx1YXRpb24gZm9sbG93ZWQgYnkgYSBiaWcgc3dhcAorICAgICAgICBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhcixJc1Jvd01ham9yP1Jvd01ham9yQml0OjA+IGF1eChvdGhlcik7CisgICAgICAgICp0aGlzID0gYXV4Lm1hcmtBc1JWYWx1ZSgpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyBldmFsdWF0ZS9jb3B5IHZlY3RvciBwZXIgdmVjdG9yCisgICAgICAgIGZvciAoSW5kZXggaj0wOyBqPG1fb3V0ZXJTaXplLnZhbHVlKCk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIFNwYXJzZVZlY3RvcjxTY2FsYXIsSXNSb3dNYWpvciA/IFJvd01ham9yQml0IDogMD4gYXV4KG90aGVyLmlubmVyVmVjdG9yKGopKTsKKyAgICAgICAgICBtX21hdHJpeC5jb25zdF9jYXN0X2Rlcml2ZWQoKS5fZGF0YSgpW21fb3V0ZXJTdGFydCtqXS5zd2FwKGF1eC5fZGF0YSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBTcGFyc2VJbm5lclZlY3RvclNldCYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZUlubmVyVmVjdG9yU2V0JiBvdGhlcikKKyAgICB7CisgICAgICByZXR1cm4gb3BlcmF0b3I9PFNwYXJzZUlubmVyVmVjdG9yU2V0PihvdGhlcik7CisgICAgfQorCisgICAgSW5kZXggbm9uWmVyb3MoKSBjb25zdAorICAgIHsKKyAgICAgIEluZGV4IGNvdW50ID0gMDsKKyAgICAgIGZvciAoSW5kZXggaj0wOyBqPG1fb3V0ZXJTaXplLnZhbHVlKCk7ICsraikKKyAgICAgICAgY291bnQgKz0gbV9tYXRyaXguX2RhdGEoKVttX291dGVyU3RhcnQral0uc2l6ZSgpOworICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIGNvbnN0IFNjYWxhciYgbGFzdENvZWZmKCkgY29uc3QKKyAgICB7CisgICAgICBFSUdFTl9TVEFUSUNfQVNTRVJUX1ZFQ1RPUl9PTkxZKFNwYXJzZUlubmVyVmVjdG9yU2V0KTsKKyAgICAgIGVpZ2VuX2Fzc2VydChtX21hdHJpeC5kYXRhKClbbV9vdXRlclN0YXJ0XS5zaXplKCk+MCk7CisgICAgICByZXR1cm4gbV9tYXRyaXguZGF0YSgpW21fb3V0ZXJTdGFydF0udmFsZShtX21hdHJpeC5kYXRhKClbbV9vdXRlclN0YXJ0XS5zaXplKCktMSk7CisgICAgfQorCisvLyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlPgorLy8gICAgIGlubGluZSBTcGFyc2VJbm5lclZlY3RvclNldCYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisvLyAgICAgeworLy8gICAgICAgcmV0dXJuICp0aGlzOworLy8gICAgIH0KKworICAgIEVJR0VOX1NUUk9OR19JTkxJTkUgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBtX291dGVyU2l6ZS52YWx1ZSgpIDogbV9tYXRyaXgucm93cygpOyB9CisgICAgRUlHRU5fU1RST05HX0lOTElORSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fbWF0cml4LmNvbHMoKSA6IG1fb3V0ZXJTaXplLnZhbHVlKCk7IH0KKworICBwcm90ZWN0ZWQ6CisKKyAgICBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpOZXN0ZWQgbV9tYXRyaXg7CisgICAgSW5kZXggbV9vdXRlclN0YXJ0OworICAgIGNvbnN0IGludGVybmFsOjp2YXJpYWJsZV9pZl9keW5hbWljPEluZGV4LCBTaXplPiBtX291dGVyU2l6ZTsKKworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9TUEFSU0VfQkxPQ0tGT1JEWU5BTUlDTUFUUklYX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9DTWFrZUxpc3RzLnR4dCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWEzMmNhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNiBAQAorRklMRShHTE9CIEVpZ2VuX1NwYXJzZUV4dHJhX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9TcGFyc2VFeHRyYV9TUkNTfQorICBERVNUSU5BVElPTiAke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYSBDT01QT05FTlQgRGV2ZWwKKyAgKQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL0R5bmFtaWNTcGFyc2VNYXRyaXguaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9EeW5hbWljU3BhcnNlTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjMTZkZgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9EeW5hbWljU3BhcnNlTWF0cml4LmgKQEAgLTAsMCArMSwzNTcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0RZTkFNSUNfU1BBUlNFTUFUUklYX0gKKyNkZWZpbmUgRUlHRU5fRFlOQU1JQ19TUEFSU0VNQVRSSVhfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFxkZXByZWNhdGVkIHVzZSBhIFNwYXJzZU1hdHJpeCBpbiBhbiB1bmNvbXByZXNzZWQgbW9kZQorICAqCisgICogXGNsYXNzIER5bmFtaWNTcGFyc2VNYXRyaXgKKyAgKgorICAqIFxicmllZiBBIHNwYXJzZSBtYXRyaXggY2xhc3MgZGVzaWduZWQgZm9yIG1hdHJpeCBhc3NlbWJseSBwdXJwb3NlCisgICoKKyAgKiBccGFyYW0gX1NjYWxhciB0aGUgc2NhbGFyIHR5cGUsIGkuZS4gdGhlIHR5cGUgb2YgdGhlIGNvZWZmaWNpZW50cworICAqCisgICogVW5saWtlIFNwYXJzZU1hdHJpeCwgdGhpcyBjbGFzcyBwcm92aWRlcyBhIG11Y2ggaGlnaGVyIGRlZ3JlZSBvZiBmbGV4aWJpbGl0eS4gSW4gcGFydGljdWxhciwgaXQgYWxsb3dzCisgICogcmFuZG9tIHJlYWQvd3JpdGUgYWNjZXNzZXMgaW4gbG9nKHJobypvdXRlcl9zaXplKSB3aGVyZSBcYyByaG8gaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSBjb2VmZmljaWVudCBpcworICAqIG5vbnplcm8gYW5kIG91dGVyX3NpemUgaXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGlmIHRoZSBtYXRyaXggaXMgY29sdW1uLW1ham9yIGFuZCB0aGUgbnVtYmVyIG9mIHJvd3MKKyAgKiBvdGhlcndpc2UuCisgICoKKyAgKiBJbnRlcm5hbGx5LCB0aGUgZGF0YSBhcmUgc3RvcmVkIGFzIGEgc3RkOjp2ZWN0b3Igb2YgY29tcHJlc3NlZCB2ZWN0b3IuIFRoZSBwZXJmb3JtYW5jZXMgb2YgcmFuZG9tIHdyaXRlcyBtaWdodAorICAqIGRlY3JlYXNlIGFzIHRoZSBudW1iZXIgb2Ygbm9uemVyb3MgcGVyIGlubmVyLXZlY3RvciBpbmNyZWFzZS4gSW4gcHJhY3RpY2UsIHdlIG9ic2VydmVkIHZlcnkgZ29vZCBwZXJmb3JtYW5jZQorICAqIHRpbGwgYWJvdXQgMTAwIG5vbnplcm9zL3ZlY3RvciwgYW5kIHRoZSBwZXJmb3JtYW5jZSByZW1haW5zIHJlbGF0aXZlbHkgZ29vZCB0aWxsIDUwMCBub256ZXJvcy92ZWN0b3JzLgorICAqCisgICogXHNlZSBTcGFyc2VNYXRyaXgKKyAgKi8KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfT3B0aW9ucywgdHlwZW5hbWUgX0luZGV4Pgorc3RydWN0IHRyYWl0czxEeW5hbWljU3BhcnNlTWF0cml4PF9TY2FsYXIsIF9PcHRpb25zLCBfSW5kZXg+ID4KK3sKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiBfSW5kZXggSW5kZXg7CisgIHR5cGVkZWYgU3BhcnNlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIE1hdHJpeFhwciBYcHJLaW5kOworICBlbnVtIHsKKyAgICBSb3dzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBEeW5hbWljLAorICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gRHluYW1pYywKKyAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IER5bmFtaWMsCisgICAgRmxhZ3MgPSBfT3B0aW9ucyB8IE5lc3RCeVJlZkJpdCB8IEx2YWx1ZUJpdCwKKyAgICBDb2VmZlJlYWRDb3N0ID0gTnVtVHJhaXRzPFNjYWxhcj46OlJlYWRDb3N0LAorICAgIFN1cHBvcnRlZEFjY2Vzc1BhdHRlcm5zID0gT3V0ZXJSYW5kb21BY2Nlc3NQYXR0ZXJuCisgIH07Cit9OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9JbmRleD4KKyBjbGFzcyAgRHluYW1pY1NwYXJzZU1hdHJpeAorICA6IHB1YmxpYyBTcGFyc2VNYXRyaXhCYXNlPER5bmFtaWNTcGFyc2VNYXRyaXg8X1NjYWxhciwgX09wdGlvbnMsIF9JbmRleD4gPgoreworICBwdWJsaWM6CisgICAgRUlHRU5fU1BBUlNFX1BVQkxJQ19JTlRFUkZBQ0UoRHluYW1pY1NwYXJzZU1hdHJpeCkKKyAgICAvLyBGSVhNRTogd2h5IGFyZSB0aGVzZSBvcGVyYXRvciBhbHJlYWR5IGFsdmFpbGFibGUgPz8/CisgICAgLy8gRUlHRU5fU1BBUlNFX0lOSEVSSVRfQVNTSUdOTUVOVF9PUEVSQVRPUihEeW5hbWljU3BhcnNlTWF0cml4LCArPSkKKyAgICAvLyBFSUdFTl9TUEFSU0VfSU5IRVJJVF9BU1NJR05NRU5UX09QRVJBVE9SKER5bmFtaWNTcGFyc2VNYXRyaXgsIC09KQorICAgIHR5cGVkZWYgTWFwcGVkU3BhcnNlTWF0cml4PFNjYWxhcixGbGFncz4gTWFwOworICAgIHVzaW5nIEJhc2U6OklzUm93TWFqb3I7CisgICAgdXNpbmcgQmFzZTo6b3BlcmF0b3I9OworICAgIGVudW0geworICAgICAgT3B0aW9ucyA9IF9PcHRpb25zCisgICAgfTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICB0eXBlZGVmIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyLChGbGFncyZ+Um93TWFqb3JCaXQpfChJc1Jvd01ham9yP1Jvd01ham9yQml0OjApPiBUcmFuc3Bvc2VkU3BhcnNlTWF0cml4OworCisgICAgSW5kZXggbV9pbm5lclNpemU7CisgICAgc3RkOjp2ZWN0b3I8aW50ZXJuYWw6OkNvbXByZXNzZWRTdG9yYWdlPFNjYWxhcixJbmRleD4gPiBtX2RhdGE7CisKKyAgcHVibGljOgorCisgICAgaW5saW5lIEluZGV4IHJvd3MoKSBjb25zdCB7IHJldHVybiBJc1Jvd01ham9yID8gb3V0ZXJTaXplKCkgOiBtX2lubmVyU2l6ZTsgfQorICAgIGlubGluZSBJbmRleCBjb2xzKCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1faW5uZXJTaXplIDogb3V0ZXJTaXplKCk7IH0KKyAgICBpbmxpbmUgSW5kZXggaW5uZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbV9pbm5lclNpemU7IH0KKyAgICBpbmxpbmUgSW5kZXggb3V0ZXJTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8SW5kZXg+KG1fZGF0YS5zaXplKCkpOyB9CisgICAgaW5saW5lIEluZGV4IGlubmVyTm9uWmVyb3MoSW5kZXggaikgY29uc3QgeyByZXR1cm4gbV9kYXRhW2pdLnNpemUoKTsgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50ZXJuYWw6OkNvbXByZXNzZWRTdG9yYWdlPFNjYWxhcixJbmRleD4gPiYgX2RhdGEoKSB7IHJldHVybiBtX2RhdGE7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6Q29tcHJlc3NlZFN0b3JhZ2U8U2NhbGFyLEluZGV4PiA+JiBfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YTsgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZSBhdCBnaXZlbiBwb3NpdGlvbiBcYSByb3csIFxhIGNvbAorICAgICAgKiBUaGlzIG9wZXJhdGlvbiBpbnZvbGVzIGEgbG9nKHJobypvdXRlcl9zaXplKSBiaW5hcnkgc2VhcmNoLgorICAgICAgKi8KKyAgICBpbmxpbmUgU2NhbGFyIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKyAgICAgIHJldHVybiBtX2RhdGFbb3V0ZXJdLmF0KGlubmVyKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvZWZmaWNpZW50IHZhbHVlIGF0IGdpdmVuIHBvc2l0aW9uIFxhIHJvdywgXGEgY29sCisgICAgICAqIFRoaXMgb3BlcmF0aW9uIGludm9sZXMgYSBsb2cocmhvKm91dGVyX3NpemUpIGJpbmFyeSBzZWFyY2guIElmIHRoZSBjb2VmZmljaWVudCBkb2VzIG5vdAorICAgICAgKiBleGlzdCB5ZXQsIHRoZW4gYSBzb3J0ZWQgaW5zZXJ0aW9uIGludG8gYSBzZXF1ZW50aWFsIGJ1ZmZlciBpcyBwZXJmb3JtZWQuCisgICAgICAqLworICAgIGlubGluZSBTY2FsYXImIGNvZWZmUmVmKEluZGV4IHJvdywgSW5kZXggY29sKQorICAgIHsKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gSXNSb3dNYWpvciA/IHJvdyA6IGNvbDsKKyAgICAgIGNvbnN0IEluZGV4IGlubmVyID0gSXNSb3dNYWpvciA/IGNvbCA6IHJvdzsKKyAgICAgIHJldHVybiBtX2RhdGFbb3V0ZXJdLmF0V2l0aEluc2VydGlvbihpbm5lcik7CisgICAgfQorCisgICAgY2xhc3MgSW5uZXJJdGVyYXRvcjsKKyAgICBjbGFzcyBSZXZlcnNlSW5uZXJJdGVyYXRvcjsKKworICAgIHZvaWQgc2V0WmVybygpCisgICAgeworICAgICAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgbV9kYXRhW2pdLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uIHplcm8gY29lZmZpY2llbnRzICovCisgICAgSW5kZXggbm9uWmVyb3MoKSBjb25zdAorICAgIHsKKyAgICAgIEluZGV4IHJlcyA9IDA7CisgICAgICBmb3IgKEluZGV4IGo9MDsgajxvdXRlclNpemUoKTsgKytqKQorICAgICAgICByZXMgKz0gc3RhdGljX2Nhc3Q8SW5kZXg+KG1fZGF0YVtqXS5zaXplKCkpOworICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKworCisgICAgdm9pZCByZXNlcnZlKEluZGV4IHJlc2VydmVTaXplID0gMTAwMCkKKyAgICB7CisgICAgICBpZiAob3V0ZXJTaXplKCk+MCkKKyAgICAgIHsKKyAgICAgICAgSW5kZXggcmVzZXJ2ZVNpemVQZXJWZWN0b3IgPSAoc3RkOjptYXgpKHJlc2VydmVTaXplL291dGVyU2l6ZSgpLEluZGV4KDQpKTsKKyAgICAgICAgZm9yIChJbmRleCBqPTA7IGo8b3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIG1fZGF0YVtqXS5yZXNlcnZlKHJlc2VydmVTaXplUGVyVmVjdG9yKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKiBEb2VzIG5vdGhpbmc6IHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU3BhcnNlTWF0cml4ICovCisgICAgaW5saW5lIHZvaWQgc3RhcnRWZWMoSW5kZXggLypvdXRlciovKSB7fQorCisgICAgLyoqIFxyZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBub24gemVybyBjb2VmZmljaWVudCBhdCBwb3NpdGlvbiBcYSByb3csIFxhIGNvbCBhc3N1bWluZyB0aGF0OgorICAgICAgKiAtIHRoZSBub256ZXJvIGRvZXMgbm90IGFscmVhZHkgZXhpc3QKKyAgICAgICogLSB0aGUgbmV3IGNvZWZmaWNpZW50IGlzIHRoZSBsYXN0IG9uZSBvZiB0aGUgZ2l2ZW4gaW5uZXIgdmVjdG9yLgorICAgICAgKgorICAgICAgKiBcc2EgaW5zZXJ0LCBpbnNlcnRCYWNrQnlPdXRlcklubmVyICovCisgICAgaW5saW5lIFNjYWxhciYgaW5zZXJ0QmFjayhJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICByZXR1cm4gaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihJc1Jvd01ham9yP3Jvdzpjb2wsIElzUm93TWFqb3I/Y29sOnJvdyk7CisgICAgfQorCisgICAgLyoqIFxzYSBpbnNlcnRCYWNrICovCisgICAgaW5saW5lIFNjYWxhciYgaW5zZXJ0QmFja0J5T3V0ZXJJbm5lcihJbmRleCBvdXRlciwgSW5kZXggaW5uZXIpCisgICAgeworICAgICAgZWlnZW5fYXNzZXJ0KG91dGVyPEluZGV4KG1fZGF0YS5zaXplKCkpICYmIGlubmVyPG1faW5uZXJTaXplICYmICJvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIGVpZ2VuX2Fzc2VydCgoKG1fZGF0YVtvdXRlcl0uc2l6ZSgpPT0wKSB8fCAobV9kYXRhW291dGVyXS5pbmRleChtX2RhdGFbb3V0ZXJdLnNpemUoKS0xKTxpbm5lcikpCisgICAgICAgICAgICAgICAgJiYgIndyb25nIHNvcnRlZCBpbnNlcnRpb24iKTsKKyAgICAgIG1fZGF0YVtvdXRlcl0uYXBwZW5kKDAsIGlubmVyKTsKKyAgICAgIHJldHVybiBtX2RhdGFbb3V0ZXJdLnZhbHVlKG1fZGF0YVtvdXRlcl0uc2l6ZSgpLTEpOworICAgIH0KKworICAgIGlubGluZSBTY2FsYXImIGluc2VydChJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisKKyAgICAgIEluZGV4IHN0YXJ0SWQgPSAwOworICAgICAgSW5kZXggaWQgPSBzdGF0aWNfY2FzdDxJbmRleD4obV9kYXRhW291dGVyXS5zaXplKCkpIC0gMTsKKyAgICAgIG1fZGF0YVtvdXRlcl0ucmVzaXplKGlkKzIsMSk7CisKKyAgICAgIHdoaWxlICggKGlkID49IHN0YXJ0SWQpICYmIChtX2RhdGFbb3V0ZXJdLmluZGV4KGlkKSA+IGlubmVyKSApCisgICAgICB7CisgICAgICAgIG1fZGF0YVtvdXRlcl0uaW5kZXgoaWQrMSkgPSBtX2RhdGFbb3V0ZXJdLmluZGV4KGlkKTsKKyAgICAgICAgbV9kYXRhW291dGVyXS52YWx1ZShpZCsxKSA9IG1fZGF0YVtvdXRlcl0udmFsdWUoaWQpOworICAgICAgICAtLWlkOworICAgICAgfQorICAgICAgbV9kYXRhW291dGVyXS5pbmRleChpZCsxKSA9IGlubmVyOworICAgICAgbV9kYXRhW291dGVyXS52YWx1ZShpZCsxKSA9IDA7CisgICAgICByZXR1cm4gbV9kYXRhW291dGVyXS52YWx1ZShpZCsxKTsKKyAgICB9CisKKyAgICAvKiogRG9lcyBub3RoaW5nOiBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNwYXJzZU1hdHJpeCAqLworICAgIGlubGluZSB2b2lkIGZpbmFsaXplKCkge30KKworICAgIC8qKiBTdXBwcmVzcyBhbGwgbm9uemVyb3Mgd2hpY2ggYXJlIHNtYWxsZXIgdGhhbiBcYSByZWZlcmVuY2UgdW5kZXIgdGhlIHRvbGVyZW5jZSBcYSBlcHNpbG9uICovCisgICAgdm9pZCBwcnVuZShTY2FsYXIgcmVmZXJlbmNlLCBSZWFsU2NhbGFyIGVwc2lsb24gPSBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKQorICAgIHsKKyAgICAgIGZvciAoSW5kZXggaj0wOyBqPG91dGVyU2l6ZSgpOyArK2opCisgICAgICAgIG1fZGF0YVtqXS5wcnVuZShyZWZlcmVuY2UsZXBzaWxvbik7CisgICAgfQorCisgICAgLyoqIFJlc2l6ZSB0aGUgbWF0cml4IHdpdGhvdXQgcHJlc2VydmluZyB0aGUgZGF0YSAodGhlIG1hdHJpeCBpcyBzZXQgdG8gemVybykKKyAgICAgICovCisgICAgdm9pZCByZXNpemUoSW5kZXggcm93cywgSW5kZXggY29scykKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlclNpemUgPSBJc1Jvd01ham9yID8gcm93cyA6IGNvbHM7CisgICAgICBtX2lubmVyU2l6ZSA9IElzUm93TWFqb3IgPyBjb2xzIDogcm93czsKKyAgICAgIHNldFplcm8oKTsKKyAgICAgIGlmIChJbmRleChtX2RhdGEuc2l6ZSgpKSAhPSBvdXRlclNpemUpCisgICAgICB7CisgICAgICAgIG1fZGF0YS5yZXNpemUob3V0ZXJTaXplKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlc2l6ZUFuZEtlZXBEYXRhKEluZGV4IHJvd3MsIEluZGV4IGNvbHMpCisgICAgeworICAgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0gSXNSb3dNYWpvciA/IHJvd3MgOiBjb2xzOworICAgICAgY29uc3QgSW5kZXggaW5uZXJTaXplID0gSXNSb3dNYWpvciA/IGNvbHMgOiByb3dzOworICAgICAgaWYgKG1faW5uZXJTaXplPmlubmVyU2l6ZSkKKyAgICAgIHsKKyAgICAgICAgLy8gcmVtb3ZlIGFsbCBjb2VmZmljaWVudHMgd2l0aCBpbm5lckNvb3JkPj1pbm5lclNpemUKKyAgICAgICAgLy8gVE9ETworICAgICAgICAvL3N0ZDo6Y2VyciA8PCAibm90IGltcGxlbWVudGVkIHlldFxuIjsKKyAgICAgICAgZXhpdCgyKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX2RhdGEuc2l6ZSgpICE9IG91dGVyU2l6ZSkKKyAgICAgIHsKKyAgICAgICAgbV9kYXRhLnJlc2l6ZShvdXRlclNpemUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBUaGUgY2xhc3MgRHluYW1pY1NwYXJzZU1hdHJpeCBpcyBkZXByZWN0YWVkICovCisgICAgRUlHRU5fREVQUkVDQVRFRCBpbmxpbmUgRHluYW1pY1NwYXJzZU1hdHJpeCgpCisgICAgICA6IG1faW5uZXJTaXplKDApLCBtX2RhdGEoMCkKKyAgICB7CisgICAgICBlaWdlbl9hc3NlcnQoaW5uZXJTaXplKCk9PTAgJiYgb3V0ZXJTaXplKCk9PTApOworICAgIH0KKworICAgIC8qKiBUaGUgY2xhc3MgRHluYW1pY1NwYXJzZU1hdHJpeCBpcyBkZXByZWN0YWVkICovCisgICAgRUlHRU5fREVQUkVDQVRFRCBpbmxpbmUgRHluYW1pY1NwYXJzZU1hdHJpeChJbmRleCByb3dzLCBJbmRleCBjb2xzKQorICAgICAgOiBtX2lubmVyU2l6ZSgwKQorICAgIHsKKyAgICAgIHJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgICB9CisKKyAgICAvKiogVGhlIGNsYXNzIER5bmFtaWNTcGFyc2VNYXRyaXggaXMgZGVwcmVjdGFlZCAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KKyAgICBFSUdFTl9ERVBSRUNBVEVEIGV4cGxpY2l0IGlubGluZSBEeW5hbWljU3BhcnNlTWF0cml4KGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpCisgICAgICA6IG1faW5uZXJTaXplKDApCisgICAgeworICAgIEJhc2U6Om9wZXJhdG9yPShvdGhlci5kZXJpdmVkKCkpOworICAgIH0KKworICAgIGlubGluZSBEeW5hbWljU3BhcnNlTWF0cml4KGNvbnN0IER5bmFtaWNTcGFyc2VNYXRyaXgmIG90aGVyKQorICAgICAgOiBCYXNlKCksIG1faW5uZXJTaXplKDApCisgICAgeworICAgICAgKnRoaXMgPSBvdGhlci5kZXJpdmVkKCk7CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgc3dhcChEeW5hbWljU3BhcnNlTWF0cml4JiBvdGhlcikKKyAgICB7CisgICAgICAvL0VJR0VOX0RCR19TUEFSU0Uoc3RkOjpjb3V0IDw8ICJTcGFyc2VNYXRyaXg6OiBzd2FwXG4iKTsKKyAgICAgIHN0ZDo6c3dhcChtX2lubmVyU2l6ZSwgb3RoZXIubV9pbm5lclNpemUpOworICAgICAgLy9zdGQ6OnN3YXAobV9vdXRlclNpemUsIG90aGVyLm1fb3V0ZXJTaXplKTsKKyAgICAgIG1fZGF0YS5zd2FwKG90aGVyLm1fZGF0YSk7CisgICAgfQorCisgICAgaW5saW5lIER5bmFtaWNTcGFyc2VNYXRyaXgmIG9wZXJhdG9yPShjb25zdCBEeW5hbWljU3BhcnNlTWF0cml4JiBvdGhlcikKKyAgICB7CisgICAgICBpZiAob3RoZXIuaXNSVmFsdWUoKSkKKyAgICAgIHsKKyAgICAgICAgc3dhcChvdGhlci5jb25zdF9jYXN0X2Rlcml2ZWQoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJlc2l6ZShvdGhlci5yb3dzKCksIG90aGVyLmNvbHMoKSk7CisgICAgICAgIG1fZGF0YSA9IG90aGVyLm1fZGF0YTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvKiogRGVzdHJ1Y3RvciAqLworICAgIGlubGluZSB+RHluYW1pY1NwYXJzZU1hdHJpeCgpIHt9CisKKyAgcHVibGljOgorCisgICAgLyoqIFxkZXByZWNhdGVkCisgICAgICAqIFNldCB0aGUgbWF0cml4IHRvIHplcm8gYW5kIHJlc2VydmUgdGhlIG1lbW9yeSBmb3IgXGEgcmVzZXJ2ZVNpemUgbm9uemVybyBjb2VmZmljaWVudHMuICovCisgICAgRUlHRU5fREVQUkVDQVRFRCB2b2lkIHN0YXJ0RmlsbChJbmRleCByZXNlcnZlU2l6ZSA9IDEwMDApCisgICAgeworICAgICAgc2V0WmVybygpOworICAgICAgcmVzZXJ2ZShyZXNlcnZlU2l6ZSk7CisgICAgfQorCisgICAgLyoqIFxkZXByZWNhdGVkIHVzZSBpbnNlcnQoKQorICAgICAgKiBpbnNlcnRzIGEgbm9uemVybyBjb2VmZmljaWVudCBhdCBnaXZlbiBjb29yZGluYXRlcyBcYSByb3csIFxhIGNvbCBhbmQgcmV0dXJucyBpdHMgcmVmZXJlbmNlIGFzc3VtaW5nIHRoYXQ6CisgICAgICAqICAxIC0gdGhlIGNvZWZmaWNpZW50IGRvZXMgbm90IGV4aXN0IHlldAorICAgICAgKiAgMiAtIHRoaXMgdGhlIGNvZWZmaWNpZW50IHdpdGggZ3JlYXRlciBpbm5lciBjb29yZGluYXRlIGZvciB0aGUgZ2l2ZW4gb3V0ZXIgY29vcmRpbmF0ZS4KKyAgICAgICogSW4gb3RoZXIgd29yZHMsIGFzc3VtaW5nIFxjICp0aGlzIGlzIGNvbHVtbi1tYWpvciwgdGhlbiB0aGVyZSBtdXN0IG5vdCBleGlzdHMgYW55IG5vbnplcm8gY29lZmZpY2llbnQgb2YgY29vcmRpbmF0ZXMKKyAgICAgICogXGMgaSBcYyB4IFxhIGNvbCBzdWNoIHRoYXQgXGMgaSA+PSBcYSByb3cuIE90aGVyd2lzZSB0aGUgbWF0cml4IGlzIGludmFsaWQuCisgICAgICAqCisgICAgICAqIFxzZWUgZmlsbHJhbmQoKSwgY29lZmZSZWYoKQorICAgICAgKi8KKyAgICBFSUdFTl9ERVBSRUNBVEVEIFNjYWxhciYgZmlsbChJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlciA9IElzUm93TWFqb3IgPyByb3cgOiBjb2w7CisgICAgICBjb25zdCBJbmRleCBpbm5lciA9IElzUm93TWFqb3IgPyBjb2wgOiByb3c7CisgICAgICByZXR1cm4gaW5zZXJ0QmFjayhvdXRlcixpbm5lcik7CisgICAgfQorCisgICAgLyoqIFxkZXByZWNhdGVkIHVzZSBpbnNlcnQoKQorICAgICAgKiBMaWtlIGZpbGwoKSBidXQgd2l0aCByYW5kb20gaW5uZXIgY29vcmRpbmF0ZXMuCisgICAgICAqIENvbXBhcmVkIHRvIHRoZSBnZW5lcmljIGNvZWZmUmVmKCksIHRoZSB1bmlxdWUgbGltaXRhdGlvbiBpcyB0aGF0IHdlIGFzc3VtZQorICAgICAgKiB0aGUgY29lZmZpY2llbnQgZG9lcyBub3QgZXhpc3QgeWV0LgorICAgICAgKi8KKyAgICBFSUdFTl9ERVBSRUNBVEVEIFNjYWxhciYgZmlsbHJhbmQoSW5kZXggcm93LCBJbmRleCBjb2wpCisgICAgeworICAgICAgcmV0dXJuIGluc2VydChyb3csY29sKTsKKyAgICB9CisKKyAgICAvKiogXGRlcHJlY2F0ZWQgdXNlIGZpbmFsaXplKCkKKyAgICAgICogRG9lcyBub3RoaW5nLiBQcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNwYXJzZU1hdHJpeC4gKi8KKyAgICBFSUdFTl9ERVBSRUNBVEVEIHZvaWQgZW5kRmlsbCgpIHt9CisgICAgCisjICAgaWZkZWYgRUlHRU5fRFlOQU1JQ1NQQVJTRU1BVFJJWF9QTFVHSU4KKyMgICAgIGluY2x1ZGUgRUlHRU5fRFlOQU1JQ1NQQVJTRU1BVFJJWF9QTFVHSU4KKyMgICBlbmRpZgorIH07CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IF9PcHRpb25zLCB0eXBlbmFtZSBfSW5kZXg+CitjbGFzcyBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhcixfT3B0aW9ucyxfSW5kZXg+OjpJbm5lckl0ZXJhdG9yIDogcHVibGljIFNwYXJzZVZlY3RvcjxTY2FsYXIsX09wdGlvbnMsX0luZGV4Pjo6SW5uZXJJdGVyYXRvcgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlVmVjdG9yPFNjYWxhcixfT3B0aW9ucyxfSW5kZXg+OjpJbm5lckl0ZXJhdG9yIEJhc2U7CisgIHB1YmxpYzoKKyAgICBJbm5lckl0ZXJhdG9yKGNvbnN0IER5bmFtaWNTcGFyc2VNYXRyaXgmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgICA6IEJhc2UobWF0Lm1fZGF0YVtvdXRlcl0pLCBtX291dGVyKG91dGVyKQorICAgIHt9CisKKyAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXIgOiBCYXNlOjppbmRleCgpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBCYXNlOjppbmRleCgpIDogbV9vdXRlcjsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBJbmRleCBtX291dGVyOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgX09wdGlvbnMsIHR5cGVuYW1lIF9JbmRleD4KK2NsYXNzIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyLF9PcHRpb25zLF9JbmRleD46OlJldmVyc2VJbm5lckl0ZXJhdG9yIDogcHVibGljIFNwYXJzZVZlY3RvcjxTY2FsYXIsX09wdGlvbnMsX0luZGV4Pjo6UmV2ZXJzZUlubmVySXRlcmF0b3IKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZVZlY3RvcjxTY2FsYXIsX09wdGlvbnMsX0luZGV4Pjo6UmV2ZXJzZUlubmVySXRlcmF0b3IgQmFzZTsKKyAgcHVibGljOgorICAgIFJldmVyc2VJbm5lckl0ZXJhdG9yKGNvbnN0IER5bmFtaWNTcGFyc2VNYXRyaXgmIG1hdCwgSW5kZXggb3V0ZXIpCisgICAgICA6IEJhc2UobWF0Lm1fZGF0YVtvdXRlcl0pLCBtX291dGVyKG91dGVyKQorICAgIHt9CisKKyAgICBpbmxpbmUgSW5kZXggcm93KCkgY29uc3QgeyByZXR1cm4gSXNSb3dNYWpvciA/IG1fb3V0ZXIgOiBCYXNlOjppbmRleCgpOyB9CisgICAgaW5saW5lIEluZGV4IGNvbCgpIGNvbnN0IHsgcmV0dXJuIElzUm93TWFqb3IgPyBCYXNlOjppbmRleCgpIDogbV9vdXRlcjsgfQorCisgIHByb3RlY3RlZDoKKyAgICBjb25zdCBJbmRleCBtX291dGVyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZiAvLyBFSUdFTl9EWU5BTUlDX1NQQVJTRU1BVFJJWF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvTWFya2V0SU8uaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9NYXJrZXRJTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTU4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvTWFya2V0SU8uaApAQCAtMCwwICsxLDI3MyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgR2FlbCBHdWVubmViYXVkIDxnYWVsLmd1ZW5uZWJhdWRAaW5yaWEuZnI+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgRGVzaXJlIE5VRU5UU0EgV0FLQU0gPGRlc2lyZS5udWVudHNhX3dha2FtQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUEFSU0VfTUFSS0VUX0lPX0gKKyNkZWZpbmUgRUlHRU5fU1BBUlNFX01BUktFVF9JT19ICisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIEVpZ2VuIHsgCisKK25hbWVzcGFjZSBpbnRlcm5hbCAKK3sKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KKyAgaW5saW5lIGJvb2wgR2V0TWFya2V0TGluZSAoc3RkOjpzdHJpbmdzdHJlYW0mIGxpbmUsIGludCYgTSwgaW50JiBOLCBpbnQmIGksIGludCYgaiwgU2NhbGFyJiB2YWx1ZSkKKyAgeworICAgIGxpbmUgPj4gaSA+PiBqID4+IHZhbHVlOworICAgIGktLTsKKyAgICBqLS07CisgICAgaWYoaT49MCAmJiBqPj0wICYmIGk8TSAmJiBqPE4pCisgICAgeworICAgICAgcmV0dXJuIHRydWU7IAorICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KKyAgaW5saW5lIGJvb2wgR2V0TWFya2V0TGluZSAoc3RkOjpzdHJpbmdzdHJlYW0mIGxpbmUsIGludCYgTSwgaW50JiBOLCBpbnQmIGksIGludCYgaiwgc3RkOjpjb21wbGV4PFNjYWxhcj4mIHZhbHVlKQorICB7CisgICAgU2NhbGFyIHZhbFIsIHZhbEk7CisgICAgbGluZSA+PiBpID4+IGogPj4gdmFsUiA+PiB2YWxJOworICAgIGktLTsKKyAgICBqLS07CisgICAgaWYoaT49MCAmJiBqPj0wICYmIGk8TSAmJiBqPE4pCisgICAgeworICAgICAgdmFsdWUgPSBzdGQ6OmNvbXBsZXg8U2NhbGFyPih2YWxSLCB2YWxJKTsKKyAgICAgIHJldHVybiB0cnVlOyAKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlYWxTY2FsYXI+CisgIGlubGluZSB2b2lkICBHZXRWZWN0b3JFbHQgKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBSZWFsU2NhbGFyJiB2YWwpCisgIHsKKyAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gbmV3bGluZShsaW5lKTsKKyAgICBuZXdsaW5lID4+IHZhbDsgIAorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlYWxTY2FsYXI+CisgIGlubGluZSB2b2lkIEdldFZlY3RvckVsdCAoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUsIHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiYgdmFsKQorICB7CisgICAgUmVhbFNjYWxhciB2YWxSLCB2YWxJOyAKKyAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gbmV3bGluZShsaW5lKTsKKyAgICBuZXdsaW5lID4+IHZhbFIgPj4gdmFsSTsgCisgICAgdmFsID0gc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+KHZhbFIsIHZhbEkpOworICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgIGlubGluZSB2b2lkIHB1dE1hcmtldEhlYWRlcihzdGQ6OnN0cmluZyYgaGVhZGVyLGludCBzeW0pCisgIHsKKyAgICBoZWFkZXI9ICIlJU1hdHJpeE1hcmtldCBtYXRyaXggY29vcmRpbmF0ZSAiOworICAgIGlmKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgc3RkOjpjb21wbGV4PGZsb2F0PiA+Ojp2YWx1ZSB8fCBpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnZhbHVlKQorICAgIHsKKyAgICAgIGhlYWRlciArPSAiIGNvbXBsZXgiOyAKKyAgICAgIGlmKHN5bSA9PSBTeW1tZXRyaWMpIGhlYWRlciArPSAiIHN5bW1ldHJpYyI7CisgICAgICBlbHNlIGlmIChzeW0gPT0gU2VsZkFkam9pbnQpIGhlYWRlciArPSAiIEhlcm1pdGlhbiI7CisgICAgICBlbHNlIGhlYWRlciArPSAiIGdlbmVyYWwiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGVhZGVyICs9ICIgcmVhbCI7IAorICAgICAgaWYoc3ltID09IFN5bW1ldHJpYykgaGVhZGVyICs9ICIgc3ltbWV0cmljIjsKKyAgICAgIGVsc2UgaGVhZGVyICs9ICIgZ2VuZXJhbCI7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorICBpbmxpbmUgdm9pZCBQdXRNYXRyaXhFbHQoU2NhbGFyIHZhbHVlLCBpbnQgcm93LCBpbnQgY29sLCBzdGQ6Om9mc3RyZWFtJiBvdXQpCisgIHsKKyAgICBvdXQgPDwgcm93IDw8ICIgIjw8IGNvbCA8PCAiICIgPDwgdmFsdWUgPDwgIlxuIjsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgIGlubGluZSB2b2lkIFB1dE1hdHJpeEVsdChzdGQ6OmNvbXBsZXg8U2NhbGFyPiB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCwgc3RkOjpvZnN0cmVhbSYgb3V0KQorICB7CisgICAgb3V0IDw8IHJvdyA8PCAiICIgPDwgY29sIDw8ICIgIiA8PCB2YWx1ZS5yZWFsKCkgPDwgIiAiIDw8IHZhbHVlLmltYWcoKSA8PCAiXG4iOworICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgIGlubGluZSB2b2lkIHB1dFZlY3RvckVsdChTY2FsYXIgdmFsdWUsIHN0ZDo6b2ZzdHJlYW0mIG91dCkKKyAgeworICAgIG91dCA8PCB2YWx1ZSA8PCAiXG4iOyAKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgIGlubGluZSB2b2lkIHB1dFZlY3RvckVsdChzdGQ6OmNvbXBsZXg8U2NhbGFyPiB2YWx1ZSwgc3RkOjpvZnN0cmVhbSYgb3V0KQorICB7CisgICAgb3V0IDw8IHZhbHVlLnJlYWwgPDwgIiAiIDw8IHZhbHVlLmltYWcoKTw8ICJcbiI7IAorICB9CisKK30gLy8gZW5kIG5hbWVwc2FjZSBpbnRlcm5hbAorCitpbmxpbmUgYm9vbCBnZXRNYXJrZXRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBpbnQmIHN5bSwgYm9vbCYgaXNjb21wbGV4LCBib29sJiBpc3ZlY3RvcikKK3sKKyAgc3ltID0gMDsgCisgIGlzdmVjdG9yID0gZmFsc2U7CisgIHN0ZDo6aWZzdHJlYW0gaW4oZmlsZW5hbWUuY19zdHIoKSxzdGQ6Omlvczo6aW4pOworICBpZighaW4pCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgc3RkOjpzdHJpbmcgbGluZTsgCisgIC8vIFRoZSBtYXRyaXggaGVhZGVyIGlzIGFsd2F5cyB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZmlsZSAKKyAgc3RkOjpnZXRsaW5lKGluLCBsaW5lKTsgYXNzZXJ0KGluLmdvb2QoKSk7CisgIAorICBzdGQ6OnN0cmluZ3N0cmVhbSBmbXRsaW5lKGxpbmUpOyAKKyAgc3RkOjpzdHJpbmcgc3Vic3RyWzVdOworICBmbXRsaW5lPj4gc3Vic3RyWzBdID4+IHN1YnN0clsxXSA+PiBzdWJzdHJbMl0gPj4gc3Vic3RyWzNdID4+IHN1YnN0cls0XTsKKyAgaWYoc3Vic3RyWzJdLmNvbXBhcmUoImFycmF5IikgPT0gMCkgaXN2ZWN0b3IgPSB0cnVlOworICBpZihzdWJzdHJbM10uY29tcGFyZSgiY29tcGxleCIpID09IDApIGlzY29tcGxleCA9IHRydWU7CisgIGlmKHN1YnN0cls0XS5jb21wYXJlKCJzeW1tZXRyaWMiKSA9PSAwKSBzeW0gPSBTeW1tZXRyaWM7CisgIGVsc2UgaWYgKHN1YnN0cls0XS5jb21wYXJlKCJIZXJtaXRpYW4iKSA9PSAwKSBzeW0gPSBTZWxmQWRqb2ludDsKKyAgCisgIHJldHVybiB0cnVlOworfQorICAKK3RlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+Citib29sIGxvYWRNYXJrZXQoU3BhcnNlTWF0cml4VHlwZSYgbWF0LCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgc3RkOjppZnN0cmVhbSBpbnB1dChmaWxlbmFtZS5jX3N0cigpLHN0ZDo6aW9zOjppbik7CisgIGlmKCFpbnB1dCkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBjb25zdCBpbnQgbWF4QnVmZmVyc2l6ZSA9IDIwNDg7CisgIGNoYXIgYnVmZmVyW21heEJ1ZmZlcnNpemVdOworICAKKyAgYm9vbCByZWFkc2l6ZXMgPSBmYWxzZTsKKworICB0eXBlZGVmIFRyaXBsZXQ8U2NhbGFyLGludD4gVDsKKyAgc3RkOjp2ZWN0b3I8VD4gZWxlbWVudHM7CisgIAorICBpbnQgTSgtMSksIE4oLTEpLCBOTlooLTEpOworICBpbnQgY291bnQgPSAwOworICB3aGlsZShpbnB1dC5nZXRsaW5lKGJ1ZmZlciwgbWF4QnVmZmVyc2l6ZSkpCisgIHsKKyAgICAvLyBza2lwIGNvbW1lbnRzICAgCisgICAgLy9OT1RFIEFuIGFwcHJvcHJpYXRlIHRlc3Qgc2hvdWxkIGJlIGRvbmUgb24gdGhlIGhlYWRlciB0byBnZXQgdGhlICBzeW1tZXRyeQorICAgIGlmKGJ1ZmZlclswXT09JyUnKQorICAgICAgY29udGludWU7CisgICAgCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbGluZShidWZmZXIpOworICAgIAorICAgIGlmKCFyZWFkc2l6ZXMpCisgICAgeworICAgICAgbGluZSA+PiBNID4+IE4gPj4gTk5aOworICAgICAgaWYoTSA+IDAgJiYgTiA+IDAgJiYgTk5aID4gMCkgCisgICAgICB7CisgICAgICAgIHJlYWRzaXplcyA9IHRydWU7CisgICAgICAgIHN0ZDo6Y291dCA8PCAic2l6ZXM6ICIgPDwgTSA8PCAiLCIgPDwgTiA8PCAiLCIgPDwgTk5aIDw8ICJcbiI7CisgICAgICAgIG1hdC5yZXNpemUoTSxOKTsKKyAgICAgICAgbWF0LnJlc2VydmUoTk5aKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgCisgICAgICBpbnQgaSgtMSksIGooLTEpOworICAgICAgU2NhbGFyIHZhbHVlOyAKKyAgICAgIGlmKCBpbnRlcm5hbDo6R2V0TWFya2V0TGluZShsaW5lLCBNLCBOLCBpLCBqLCB2YWx1ZSkgKSAKKyAgICAgIHsKKyAgICAgICAgKysgY291bnQ7CisgICAgICAgIGVsZW1lbnRzLnB1c2hfYmFjayhUKGksaix2YWx1ZSkpOworICAgICAgfQorICAgICAgZWxzZSAKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJJbnZhbGlkIHJlYWQ6ICIgPDwgaSA8PCAiLCIgPDwgaiA8PCAiXG4iOyAgICAgICAgCisgICAgfQorICB9CisgIG1hdC5zZXRGcm9tVHJpcGxldHMoZWxlbWVudHMuYmVnaW4oKSwgZWxlbWVudHMuZW5kKCkpOworICBpZihjb3VudCE9Tk5aKQorICAgIHN0ZDo6Y2VyciA8PCBjb3VudCA8PCAiIT0iIDw8IE5OWiA8PCAiXG4iOworICAKKyAgaW5wdXQuY2xvc2UoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+Citib29sIGxvYWRNYXJrZXRWZWN0b3IoVmVjdG9yVHlwZSYgdmVjLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisgIHN0ZDo6aWZzdHJlYW0gaW4oZmlsZW5hbWUuY19zdHIoKSwgc3RkOjppb3M6OmluKTsKKyAgaWYoIWluKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIHN0ZDo6c3RyaW5nIGxpbmU7IAorICBpbnQgbigwKSwgY29sKDApOyAKKyAgZG8gCisgIHsgLy8gU2tpcCBjb21tZW50cworICAgIHN0ZDo6Z2V0bGluZShpbiwgbGluZSk7IGFzc2VydChpbi5nb29kKCkpOworICB9IHdoaWxlIChsaW5lWzBdID09ICclJyk7CisgIHN0ZDo6aXN0cmluZ3N0cmVhbSBuZXdsaW5lKGxpbmUpOworICBuZXdsaW5lICA+PiBuID4+IGNvbDsgCisgIGFzc2VydChuPjAgJiYgY29sPjApOworICB2ZWMucmVzaXplKG4pOworICBpbnQgaSA9IDA7IAorICBTY2FsYXIgdmFsdWU7IAorICB3aGlsZSAoIHN0ZDo6Z2V0bGluZShpbiwgbGluZSkgJiYgKGkgPCBuKSApeworICAgIGludGVybmFsOjpHZXRWZWN0b3JFbHQobGluZSwgdmFsdWUpOyAKKyAgICB2ZWMoaSsrKSA9IHZhbHVlOyAKKyAgfQorICBpbi5jbG9zZSgpOworICBpZiAoaSE9bil7CisgICAgc3RkOjpjZXJyPDwgIlVuYWJsZSB0byByZWFkIGFsbCBlbGVtZW50cyBmcm9tIGZpbGUgIiA8PCBmaWxlbmFtZSA8PCAiXG4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZT4KK2Jvb2wgc2F2ZU1hcmtldChjb25zdCBTcGFyc2VNYXRyaXhUeXBlJiBtYXQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgaW50IHN5bSA9IDApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgc3RkOjpvZnN0cmVhbSBvdXQoZmlsZW5hbWUuY19zdHIoKSxzdGQ6Omlvczo6b3V0KTsKKyAgaWYoIW91dCkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBvdXQuZmxhZ3Moc3RkOjppb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgIG91dC5wcmVjaXNpb24oNjQpOworICBzdGQ6OnN0cmluZyBoZWFkZXI7IAorICBpbnRlcm5hbDo6cHV0TWFya2V0SGVhZGVyPFNjYWxhcj4oaGVhZGVyLCBzeW0pOyAKKyAgb3V0IDw8IGhlYWRlciA8PCBzdGQ6OmVuZGw7IAorICBvdXQgPDwgbWF0LnJvd3MoKSA8PCAiICIgPDwgbWF0LmNvbHMoKSA8PCAiICIgPDwgbWF0Lm5vblplcm9zKCkgPDwgIlxuIjsKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yKGludCBqPTA7IGo8bWF0Lm91dGVyU2l6ZSgpOyArK2opCisgICAgZm9yKHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobWF0LGopOyBpdDsgKytpdCkKKyAgICB7CisJKysgY291bnQ7CisJaW50ZXJuYWw6OlB1dE1hdHJpeEVsdChpdC52YWx1ZSgpLCBpdC5yb3coKSsxLCBpdC5jb2woKSsxLCBvdXQpOworCS8vIG91dCA8PCBpdC5yb3coKSsxIDw8ICIgIiA8PCBpdC5jb2woKSsxIDw8ICIgIiA8PCBpdC52YWx1ZSgpIDw8ICJcbiI7CisgICAgfQorICBvdXQuY2xvc2UoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+Citib29sIHNhdmVNYXJrZXRWZWN0b3IgKGNvbnN0IFZlY3RvclR5cGUmIHZlYywgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQoreworIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsgCisgc3RkOjpvZnN0cmVhbSBvdXQoZmlsZW5hbWUuY19zdHIoKSxzdGQ6Omlvczo6b3V0KTsKKyAgaWYoIW91dCkKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBvdXQuZmxhZ3Moc3RkOjppb3NfYmFzZTo6c2NpZW50aWZpYyk7CisgIG91dC5wcmVjaXNpb24oNjQpOworICBpZihpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHN0ZDo6Y29tcGxleDxmbG9hdD4gPjo6dmFsdWUgfHwgaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+Ojp2YWx1ZSkKKyAgICAgIG91dCA8PCAiJSVNYXRyaXhNYXJrZXQgbWF0cml4IGFycmF5IGNvbXBsZXggZ2VuZXJhbFxuIjsgCisgIGVsc2UKKyAgICBvdXQgPDwgIiUlTWF0cml4TWFya2V0IG1hdHJpeCBhcnJheSByZWFsIGdlbmVyYWxcbiI7IAorICBvdXQgPDwgdmVjLnNpemUoKSA8PCAiICI8PCAxIDw8ICJcbiI7CisgIGZvciAoaW50IGk9MDsgaSA8IHZlYy5zaXplKCk7IGkrKyl7CisgICAgaW50ZXJuYWw6OnB1dFZlY3RvckVsdCh2ZWMoaSksIG91dCk7IAorICB9CisgIG91dC5jbG9zZSgpOworICByZXR1cm4gdHJ1ZTsgCit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgorCisjZW5kaWYgLy8gRUlHRU5fU1BBUlNFX01BUktFVF9JT19ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvTWF0cml4TWFya2V0SXRlcmF0b3IuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGFyc2VFeHRyYS9NYXRyaXhNYXJrZXRJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTZiNjgKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvTWF0cml4TWFya2V0SXRlcmF0b3IuaApAQCAtMCwwICsxLDIyMSBAQAorCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMiBEZXNpcmUgTlVFTlRTQSBXQUtBTSA8ZGVzaXJlLm51ZW50c2Ffd2FrYW1AaW5yaWEuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX0JST1dTRV9NQVRSSUNFU19ICisjZGVmaW5lIEVJR0VOX0JST1dTRV9NQVRSSUNFU19ICisKK25hbWVzcGFjZSBFaWdlbiB7CisKK2VudW0geworICBTUEQgPSAweDEwMCwKKyAgTm9uU3ltbWV0cmljID0gMHgwCit9OyAKKworLyoqIAorICogQGJyaWVmIEl0ZXJhdG9yIHRvIGJyb3dzZSBtYXRyaWNlcyBmcm9tIGEgc3BlY2lmaWVkIGZvbGRlcgorICogCisgKiBUaGlzIGlzIHVzZWQgdG8gbG9hZCBhbGwgdGhlIG1hdHJpY2VzIGZyb20gYSBmb2xkZXIuIAorICogVGhlIG1hdHJpY2VzIHNob3VsZCBiZSBpbiBNYXRyaXggTWFya2V0IGZvcm1hdAorICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBtYXRyaWNlcyBhcmUgbmFtZWQgYXMgbWF0bmFtZS5tdHgKKyAqIGFuZCBtYXRuYW1lX1NQRC5tdHggaWYgdGhlIG1hdHJpeCBpcyBTeW1tZXRyaWMgYW5kIHBvc2l0aXZlIGRlZmluaXRlIChvciBIZXJtaXRpYW4pCisgKiBUaGUgcmlnaHQgaGFuZCBzaWRlIHZlY3RvcnMgYXJlIGxvYWRlZCBhcyB3ZWxsLCBpZiB0aGV5IGV4aXN0LgorICogVGhleSBzaG91bGQgYmUgbmFtZWQgYXMgbWF0bmFtZV9iLm10eC4gCisgKiBOb3RlIHRoYXQgdGhlIHJpZ2h0IGhhbmQgc2lkZSBmb3IgYSBTUEQgbWF0cml4IGlzIG5hbWVkIGFzIG1hdG5hbWVfU1BEX2IubXR4CisgKiAKKyAqIFNvbWV0aW1lcyBhIHJlZmVyZW5jZSBzb2x1dGlvbiBpcyBhdmFpbGFibGUuIEluIHRoaXMgY2FzZSwgaXQgc2hvdWxkIGJlIG5hbWVkIGFzIG1hdG5hbWVfeC5tdHgKKyAqIAorICogU2FtcGxlIGNvZGUKKyAqIFxjb2RlCisgKiAKKyAqIFxlbmRjb2RlCisgKiAKKyAqIFx0cGFyYW0gU2NhbGFyIFRoZSBzY2FsYXIgdHlwZSAKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK2NsYXNzIE1hdHJpeE1hcmtldEl0ZXJhdG9yIAoreworICBwdWJsaWM6CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsgCisgICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yPiBNYXRyaXhUeXBlOyAKKyAgCisgIHB1YmxpYzoKKyAgICBNYXRyaXhNYXJrZXRJdGVyYXRvcihjb25zdCBzdGQ6OnN0cmluZyBmb2xkZXIpOm1fc3ltKDApLG1faXN2YWxpZChmYWxzZSksbV9tYXRJc0xvYWRlZChmYWxzZSksbV9oYXNSaHMoZmFsc2UpLG1faGFzcmVmWChmYWxzZSksbV9mb2xkZXIoZm9sZGVyKQorICAgIHsKKyAgICAgIG1fZm9sZGVyX2lkID0gb3BlbmRpcihmb2xkZXIuY19zdHIoKSk7CisgICAgICBpZiAoIW1fZm9sZGVyX2lkKXsKKyAgICAgICAgbV9pc3ZhbGlkID0gZmFsc2U7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiVGhlIHByb3ZpZGVkIE1hdHJpeCBmb2xkZXIgY291bGQgbm90IGJlIG9wZW5lZCBcblxuIjsKKyAgICAgICAgYWJvcnQoKTsKKyAgICAgIH0KKyAgICAgIEdldG5leHR2YWxpZG1hdHJpeCgpOworICAgIH0KKyAgICAKKyAgICB+TWF0cml4TWFya2V0SXRlcmF0b3IoKQorICAgIHsKKyAgICAgIGlmIChtX2ZvbGRlcl9pZCkgY2xvc2VkaXIobV9mb2xkZXJfaWQpOyAKKyAgICB9CisgICAgCisgICAgaW5saW5lIE1hdHJpeE1hcmtldEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBtX21hdElzTG9hZGVkID0gZmFsc2U7CisgICAgICBtX2hhc3JlZlggPSBmYWxzZTsKKyAgICAgIG1faGFzUmhzID0gZmFsc2U7CisgICAgICBHZXRuZXh0dmFsaWRtYXRyaXgoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX2lzdmFsaWQ7fQorICAgIAorICAgIC8qKiBSZXR1cm4gdGhlIHNwYXJzZSBtYXRyaXggY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBmaWxlICovCisgICAgaW5saW5lIE1hdHJpeFR5cGUmIG1hdHJpeCgpIAorICAgIHsgCisgICAgICAvLyBSZWFkIHRoZSBtYXRyaXgKKyAgICAgIGlmIChtX21hdElzTG9hZGVkKSByZXR1cm4gbV9tYXQ7CisgICAgICAKKyAgICAgIHN0ZDo6c3RyaW5nIG1hdHJpeF9maWxlID0gbV9mb2xkZXIgKyAiLyIgKyBtX21hdG5hbWUgKyAiLm10eCI7CisgICAgICBpZiAoICFsb2FkTWFya2V0KG1fbWF0LCBtYXRyaXhfZmlsZSkpIAorICAgICAgeworICAgICAgICBtX21hdElzTG9hZGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBtX21hdDsKKyAgICAgIH0KKyAgICAgIG1fbWF0SXNMb2FkZWQgPSB0cnVlOyAKKyAgICAgIAorICAgICAgaWYgKG1fc3ltICE9IE5vblN5bW1ldHJpYykgCisgICAgICB7IC8vIFN0b3JlIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBtYXRyaXguIEl0IGlzIG5lZWRlZCBieSB0aGUgc29sdmVycyBkZWFsaW5nIHdpdGggbm9uc3ltbWV0cmljIG1hdHJpY2VzID8/CisgICAgICAgIE1hdHJpeFR5cGUgQjsgCisgICAgICAgIEIgPSBtX21hdDsKKyAgICAgICAgbV9tYXQgPSBCLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtX21hdDsgCisgICAgfQorICAgIAorICAgIC8qKiBSZXR1cm4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IG1hdHJpeC4gCisgICAgICogSWYgdGhlIHJocyBmaWxlIGlzIG5vdCBwcm92aWRlZCwgYSByYW5kb20gcmhzIGlzIGdlbmVyYXRlZAorICAgICAqLworICAgIGlubGluZSBWZWN0b3JUeXBlJiByaHMoKSAKKyAgICB7IAorICAgICAgIC8vIEdldCB0aGUgcmlnaHQgaGFuZCBzaWRlCisgICAgICBpZiAobV9oYXNSaHMpIHJldHVybiBtX3JoczsKKyAgICAgIAorICAgICAgc3RkOjpzdHJpbmcgcmhzX2ZpbGU7CisgICAgICByaHNfZmlsZSA9IG1fZm9sZGVyICsgIi8iICsgbV9tYXRuYW1lICsgIl9iLm10eCI7IC8vIFRoZSBwYXR0ZXJuIGlzIG1hdG5hbWVfYi5tdHgKKyAgICAgIG1faGFzUmhzID0gRmlsZWV4aXN0cyhyaHNfZmlsZSk7CisgICAgICBpZiAobV9oYXNSaHMpCisgICAgICB7CisgICAgICAgIG1fcmhzLnJlc2l6ZShtX21hdC5jb2xzKCkpOworICAgICAgICBtX2hhc1JocyA9IGxvYWRNYXJrZXRWZWN0b3IobV9yaHMsIHJoc19maWxlKTsKKyAgICAgIH0KKyAgICAgIGlmICghbV9oYXNSaHMpCisgICAgICB7CisgICAgICAgIC8vIEdlbmVyYXRlIGEgcmFuZG9tIHJpZ2h0IGhhbmQgc2lkZQorICAgICAgICBpZiAoIW1fbWF0SXNMb2FkZWQpIHRoaXMtPm1hdHJpeCgpOyAKKyAgICAgICAgbV9yZWZYLnJlc2l6ZShtX21hdC5jb2xzKCkpOworICAgICAgICBtX3JlZlguc2V0UmFuZG9tKCk7CisgICAgICAgIG1fcmhzID0gbV9tYXQgKiBtX3JlZlg7CisgICAgICAgIG1faGFzcmVmWCA9IHRydWU7CisgICAgICAgIG1faGFzUmhzID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtX3JoczsgCisgICAgfQorICAgIAorICAgIC8qKiBSZXR1cm4gYSByZWZlcmVuY2Ugc29sdXRpb24KKyAgICAgKiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgYW5kIGlmIHRoZSByaWdodCBoYW5kIHNpZGUgaXMgbm90IGF2YWlsYWJsZQorICAgICAqIHRoZW4gcmVmWCBpcyByYW5kb21seSBnZW5lcmF0ZWQgc3VjaCB0aGF0IEEqcmVmWCA9IGIgCisgICAgICogd2hlcmUgQSBhbmQgYiBhcmUgdGhlIG1hdHJpeCBhbmQgdGhlIHJocy4gCisgICAgICogTm90ZSB0aGF0IHdoZW4gYSByaHMgaXMgcHJvdmlkZWQsIHJlZlggaXMgbm90IGF2YWlsYWJsZSAKKyAgICAgKi8KKyAgICBpbmxpbmUgVmVjdG9yVHlwZSYgcmVmWCgpIAorICAgIHsgCisgICAgICAvLyBDaGVjayBpZiBhIHJlZmVyZW5jZSBzb2x1dGlvbiBpcyBwcm92aWRlZAorICAgICAgaWYgKG1faGFzcmVmWCkgcmV0dXJuIG1fcmVmWDsKKyAgICAgIAorICAgICAgc3RkOjpzdHJpbmcgbGhzX2ZpbGU7CisgICAgICBsaHNfZmlsZSA9IG1fZm9sZGVyICsgIi8iICsgbV9tYXRuYW1lICsgIl94Lm10eCI7IAorICAgICAgbV9oYXNyZWZYID0gRmlsZWV4aXN0cyhsaHNfZmlsZSk7CisgICAgICBpZiAobV9oYXNyZWZYKQorICAgICAgeworICAgICAgICBtX3JlZlgucmVzaXplKG1fbWF0LmNvbHMoKSk7CisgICAgICAgIG1faGFzcmVmWCA9IGxvYWRNYXJrZXRWZWN0b3IobV9yZWZYLCBsaHNfZmlsZSk7CisgICAgICB9CisgICAgICByZXR1cm4gbV9yZWZYOyAKKyAgICB9CisgICAgCisgICAgaW5saW5lIHN0ZDo6c3RyaW5nJiBtYXRuYW1lKCkgeyByZXR1cm4gbV9tYXRuYW1lOyB9CisgICAgCisgICAgaW5saW5lIGludCBzeW0oKSB7IHJldHVybiBtX3N5bTsgfQorICAgIAorICAgIGlubGluZSBib29sIGhhc1JocygpIHtyZXR1cm4gbV9oYXNSaHM7IH0KKyAgICBpbmxpbmUgYm9vbCBoYXNyZWZYKCkge3JldHVybiBtX2hhc3JlZlg7IH0KKyAgICAKKyAgcHJvdGVjdGVkOgorICAgIAorICAgIGlubGluZSBib29sIEZpbGVleGlzdHMoc3RkOjpzdHJpbmcgZmlsZSkKKyAgICB7CisgICAgICBzdGQ6Omlmc3RyZWFtIGZpbGVfaWQoZmlsZS5jX3N0cigpKTsKKyAgICAgIGlmICghZmlsZV9pZC5nb29kKCkgKSAKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgZWxzZSAKKyAgICAgIHsKKyAgICAgICAgZmlsZV9pZC5jbG9zZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBHZXRuZXh0dmFsaWRtYXRyaXgoICkKKyAgICB7CisgICAgICBtX2lzdmFsaWQgPSBmYWxzZTsKKyAgICAgIC8vIEhlcmUsIHdlIHJldHVybiB3aXRoIHRoZSBuZXh0IHZhbGlkIG1hdHJpeCBpbiB0aGUgZm9sZGVyCisgICAgICB3aGlsZSAoIChtX2N1cnNfaWQgPSByZWFkZGlyKG1fZm9sZGVyX2lkKSkgIT0gTlVMTCkgeworICAgICAgICBtX2lzdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgY3VyZmlsZTsKKyAgICAgICAgY3VyZmlsZSA9IG1fZm9sZGVyICsgIi8iICsgbV9jdXJzX2lkLT5kX25hbWU7CisgICAgICAgIC8vIERpc2NhcmQgaWYgaXQgaXMgYSBmb2xkZXIKKyAgICAgICAgaWYgKG1fY3Vyc19pZC0+ZF90eXBlID09IERUX0RJUikgY29udGludWU7IC8vRklYTUUgVGhpcyBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBub24gQlNEIHN5c3RlbXMKKy8vICAgICAgICAgc3RydWN0IHN0YXQgc3RfYnVmOyAKKy8vICAgICAgICAgc3RhdCAoY3VyZmlsZS5jX3N0cigpLCAmc3RfYnVmKTsKKy8vICAgICAgICAgaWYgKFNfSVNESVIoc3RfYnVmLnN0X21vZGUpKSBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIERldGVybWluZSBmcm9tIHRoZSBoZWFkZXIgaWYgaXQgaXMgYSBtYXRyaXggb3IgYSByaWdodCBoYW5kIHNpZGUgCisgICAgICAgIGJvb2wgaXN2ZWN0b3IsaXNjb21wbGV4OworICAgICAgICBpZighZ2V0TWFya2V0SGVhZGVyKGN1cmZpbGUsbV9zeW0saXNjb21wbGV4LGlzdmVjdG9yKSkgY29udGludWU7CisgICAgICAgIGlmKGlzdmVjdG9yKSBjb250aW51ZTsKKyAgICAgICAgCisgICAgICAgIC8vIEdldCB0aGUgbWF0cml4IG5hbWUKKyAgICAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBtX2N1cnNfaWQtPmRfbmFtZTsKKyAgICAgICAgbV9tYXRuYW1lID0gZmlsZW5hbWUuc3Vic3RyKDAsIGZpbGVuYW1lLmxlbmd0aCgpLTQpOyAKKyAgICAgICAgCisgICAgICAgIC8vIEZpbmQgaWYgdGhlIG1hdHJpeCBpcyBTUEQgCisgICAgICAgIHNpemVfdCBmb3VuZCA9IG1fbWF0bmFtZS5maW5kKCJTUEQiKTsKKyAgICAgICAgaWYoIChmb3VuZCE9c3RkOjpzdHJpbmc6Om5wb3MpICYmIChtX3N5bSAhPSBOb25TeW1tZXRyaWMpICkKKyAgICAgICAgICBtX3N5bSA9IFNQRDsKKyAgICAgICAKKyAgICAgICAgbV9pc3ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7IAorICAgICAgfQorICAgIH0KKyAgICBpbnQgbV9zeW07IC8vIFN5bW1ldHJ5IG9mIHRoZSBtYXRyaXgKKyAgICBNYXRyaXhUeXBlIG1fbWF0OyAvLyBDdXJyZW50IG1hdHJpeCAgCisgICAgVmVjdG9yVHlwZSBtX3JoczsgIC8vIEN1cnJlbnQgdmVjdG9yCisgICAgVmVjdG9yVHlwZSBtX3JlZlg7IC8vIFRoZSByZWZlcmVuY2Ugc29sdXRpb24sIGlmIGV4aXN0cworICAgIHN0ZDo6c3RyaW5nIG1fbWF0bmFtZTsgLy8gTWF0cml4IE5hbWUKKyAgICBib29sIG1faXN2YWxpZDsgCisgICAgYm9vbCBtX21hdElzTG9hZGVkOyAvLyBEZXRlcm1pbmUgaWYgdGhlIG1hdHJpeCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBmcm9tIHRoZSBmaWxlCisgICAgYm9vbCBtX2hhc1JoczsgLy8gVGhlIHJpZ2h0IGhhbmQgc2lkZSBleGlzdHMKKyAgICBib29sIG1faGFzcmVmWDsgLy8gQSByZWZlcmVuY2Ugc29sdXRpb24gaXMgcHJvdmlkZWQKKyAgICBzdGQ6OnN0cmluZyBtX2ZvbGRlcjsKKyAgICBESVIgKiBtX2ZvbGRlcl9pZDsKKyAgICBzdHJ1Y3QgZGlyZW50ICptX2N1cnNfaWQ7IAorICAgIAorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL1JhbmRvbVNldHRlci5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwYXJzZUV4dHJhL1JhbmRvbVNldHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTE3MDgKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BhcnNlRXh0cmEvUmFuZG9tU2V0dGVyLmgKQEAgLTAsMCArMSwzMjcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9SQU5ET01TRVRURVJfSAorI2RlZmluZSBFSUdFTl9SQU5ET01TRVRURVJfSAorCituYW1lc3BhY2UgRWlnZW4geyAKKworLyoqIFJlcHJlc2VudHMgYSBzdGQ6Om1hcAorICAqCisgICogXHNlZSBSYW5kb21TZXR0ZXIKKyAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IFN0ZE1hcFRyYWl0cworeworICB0eXBlZGVmIGludCBLZXlUeXBlOworICB0eXBlZGVmIHN0ZDo6bWFwPEtleVR5cGUsU2NhbGFyPiBUeXBlOworICBlbnVtIHsKKyAgICBJc1NvcnRlZCA9IDEKKyAgfTsKKworICBzdGF0aWMgdm9pZCBzZXRJbnZhbGlkS2V5KFR5cGUmLCBjb25zdCBLZXlUeXBlJikge30KK307CisKKyNpZmRlZiBFSUdFTl9VTk9SREVSRURfTUFQX1NVUFBPUlQKKy8qKiBSZXByZXNlbnRzIGEgc3RkOjp1bm9yZGVyZWRfbWFwCisgICoKKyAgKiBUbyB1c2UgaXQgeW91IG5lZWQgdG8gYm90aCBkZWZpbmUgRUlHRU5fVU5PUkRFUkVEX01BUF9TVVBQT1JUIGFuZCBpbmNsdWRlIHRoZSB1bm9yZGVyZWRfbWFwIGhlYWRlciBmaWxlCisgICogeW91cnNlbGYgbWFraW5nIHN1cmUgdGhhdCB1bm9yZGVyZWRfbWFwIGlzIGRlZmluZWQgaW4gdGhlIHN0ZCBuYW1lc3BhY2UuCisgICoKKyAgKiBGb3IgaW5zdGFuY2UsIHdpdGggY3VycmVudCB2ZXJzaW9uIG9mIGdjYyB5b3UgY2FuIGVpdGhlciBlbmFibGUgQysrMHggc3RhbmRhcmQgKC1zdGQ9YysrMHgpIG9yIGRvOgorICAqIFxjb2RlCisgICogI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgorICAqICNkZWZpbmUgRUlHRU5fVU5PUkRFUkVEX01BUF9TVVBQT1JUCisgICogbmFtZXNwYWNlIHN0ZCB7CisgICogICB1c2luZyBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDsKKyAgKiB9CisgICogXGVuZGNvZGUKKyAgKgorICAqIFxzZWUgUmFuZG9tU2V0dGVyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBTdGRVbm9yZGVyZWRNYXBUcmFpdHMKK3sKKyAgdHlwZWRlZiBpbnQgS2V5VHlwZTsKKyAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8S2V5VHlwZSxTY2FsYXI+IFR5cGU7CisgIGVudW0geworICAgIElzU29ydGVkID0gMAorICB9OworCisgIHN0YXRpYyB2b2lkIHNldEludmFsaWRLZXkoVHlwZSYsIGNvbnN0IEtleVR5cGUmKSB7fQorfTsKKyNlbmRpZiAvLyBFSUdFTl9VTk9SREVSRURfTUFQX1NVUFBPUlQKKworI2lmZGVmIF9ERU5TRV9IQVNIX01BUF9IXworLyoqIFJlcHJlc2VudHMgYSBnb29nbGU6OmRlbnNlX2hhc2hfbWFwCisgICoKKyAgKiBcc2VlIFJhbmRvbVNldHRlcgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgR29vZ2xlRGVuc2VIYXNoTWFwVHJhaXRzCit7CisgIHR5cGVkZWYgaW50IEtleVR5cGU7CisgIHR5cGVkZWYgZ29vZ2xlOjpkZW5zZV9oYXNoX21hcDxLZXlUeXBlLFNjYWxhcj4gVHlwZTsKKyAgZW51bSB7CisgICAgSXNTb3J0ZWQgPSAwCisgIH07CisKKyAgc3RhdGljIHZvaWQgc2V0SW52YWxpZEtleShUeXBlJiBtYXAsIGNvbnN0IEtleVR5cGUmIGspCisgIHsgbWFwLnNldF9lbXB0eV9rZXkoayk7IH0KK307CisjZW5kaWYKKworI2lmZGVmIF9TUEFSU0VfSEFTSF9NQVBfSF8KKy8qKiBSZXByZXNlbnRzIGEgZ29vZ2xlOjpzcGFyc2VfaGFzaF9tYXAKKyAgKgorICAqIFxzZWUgUmFuZG9tU2V0dGVyCisgICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBHb29nbGVTcGFyc2VIYXNoTWFwVHJhaXRzCit7CisgIHR5cGVkZWYgaW50IEtleVR5cGU7CisgIHR5cGVkZWYgZ29vZ2xlOjpzcGFyc2VfaGFzaF9tYXA8S2V5VHlwZSxTY2FsYXI+IFR5cGU7CisgIGVudW0geworICAgIElzU29ydGVkID0gMAorICB9OworCisgIHN0YXRpYyB2b2lkIHNldEludmFsaWRLZXkoVHlwZSYsIGNvbnN0IEtleVR5cGUmKSB7fQorfTsKKyNlbmRpZgorCisvKiogXGNsYXNzIFJhbmRvbVNldHRlcgorICAqCisgICogXGJyaWVmIFRoZSBSYW5kb21TZXR0ZXIgaXMgYSB3cmFwcGVyIG9iamVjdCBhbGxvd2luZyB0byBzZXQvdXBkYXRlIGEgc3BhcnNlIG1hdHJpeCB3aXRoIHJhbmRvbSBhY2Nlc3MKKyAgKgorICAqIFxwYXJhbSBTcGFyc2VNYXRyaXhUeXBlIHRoZSB0eXBlIG9mIHRoZSBzcGFyc2UgbWF0cml4IHdlIGFyZSB1cGRhdGluZworICAqIFxwYXJhbSBNYXBUcmFpdHMgYSB0cmFpdHMgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBtYXAgaW1wbGVtZW50YXRpb24gdXNlZCBmb3IgdGhlIHRlbXBvcmFyeSBzcGFyc2Ugc3RvcmFnZS4KKyAgKiAgICAgICAgICAgICAgICAgIEl0cyBkZWZhdWx0IHZhbHVlIGRlcGVuZHMgb24gdGhlIHN5c3RlbS4KKyAgKiBccGFyYW0gT3V0ZXJQYWNrZXRCaXRzIGRlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIChvciBjb2x1bW5zKSBtYW5hZ2UgYnkgYSBzaW5nbGUgbWFwIG9iamVjdAorICAqICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBwb3dlciBvZiB0d28gZXhwb25lbnQuCisgICoKKyAgKiBUaGlzIGNsYXNzIHRlbXBvcmFyaWx5IHJlcHJlc2VudHMgYSBzcGFyc2UgbWF0cml4IG9iamVjdCB1c2luZyBhIGdlbmVyaWMgbWFwIGltcGxlbWVudGF0aW9uIGFsbG93aW5nIGZvcgorICAqIGVmZmljaWVudCByYW5kb20gYWNjZXNzLiBUaGUgY29udmVyc2lvbiBmcm9tIHRoZSBjb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uIHRvIGEgaGFzaF9tYXAgb2JqZWN0IGlzIHBlcmZvcm1lZAorICAqIGluIHRoZSBSYW5kb21TZXR0ZXIgY29uc3RydWN0b3IsIHdoaWxlIHRoZSBzcGFyc2UgbWF0cml4IGlzIHVwZGF0ZWQgYmFjayBhdCBkZXN0cnVjdGlvbiB0aW1lLiBUaGlzIHN0cmF0ZWd5CisgICogc3VnZ2VzdCB0aGUgdXNlIG9mIG5lc3RlZCBibG9ja3MgYXMgaW4gdGhpcyBleGFtcGxlOgorICAqCisgICogXGNvZGUKKyAgKiBTcGFyc2VNYXRyaXg8ZG91YmxlPiBtKHJvd3MsY29scyk7CisgICogeworICAqICAgUmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gdyhtKTsKKyAgKiAgIC8vIGRvbid0IHVzZSBtIGJ1dCB3IGluc3RlYWQgd2l0aCByZWFkL3dyaXRlIHJhbmRvbSBhY2Nlc3MgdG8gdGhlIGNvZWZmaWNpZW50czoKKyAgKiAgIGZvcig7OykKKyAgKiAgICAgdyhyYW5kKCkscmFuZCgpKSA9IHJhbmQ7CisgICogfQorICAqIC8vIHdoZW4gdyBpcyBkZWxldGVkLCB0aGUgZGF0YSBhcmUgY29waWVkIGJhY2sgdG8gbQorICAqIC8vIGFuZCBtIGlzIHJlYWR5IHRvIHVzZS4KKyAgKiBcZW5kY29kZQorICAqCisgICogU2luY2UgaGFzaF9tYXAgb2JqZWN0cyBhcmUgbm90IGZ1bGx5IHNvcnRlZCwgcmVwcmVzZW50aW5nIGEgZnVsbCBtYXRyaXggYXMgYSBzaW5nbGUgaGFzaF9tYXAgd291bGQKKyAgKiBpbnZvbHZlIGEgYmlnIGFuZCBjb3N0bHkgc29ydCB0byB1cGRhdGUgdGhlIGNvbXByZXNzZWQgbWF0cml4IGJhY2suIFRvIG92ZXJjb21lIHRoaXMgaXNzdWUsIGEgUmFuZG9tU2V0dGVyCisgICogdXNlIG11bHRpcGxlIGhhc2hfbWFwLCBlYWNoIHJlcHJlc2VudGluZyAyXk91dGVyUGFja2V0Qml0cyBjb2x1bW5zIG9yIHJvd3MgYWNjb3JkaW5nIHRvIHRoZSBzdG9yYWdlIG9yZGVyLgorICAqIFRvIHJlYWNoIG9wdGltYWwgcGVyZm9ybWFuY2UsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGFkanVzdGVkIGFjY29yZGluZyB0byB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygbm9uemVyb3MKKyAgKiBwZXIgcm93cy9jb2x1bW5zLgorICAqCisgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBNYXBUcmFpdHMgYXJlOgorICAqICAtIFxiIFN0ZE1hcFRyYWl0czogY29ycmVzcG9uZHMgdG8gc3RkOjptYXAuIChkb2VzIG5vdCBwZXJmb3JtIHZlcnkgd2VsbCkKKyAgKiAgLSBcYiBHbnVIYXNoTWFwVHJhaXRzOiBjb3JyZXNwb25kcyB0byBfX2dudV9jeHg6Omhhc2hfbWFwIChhdmFpbGFibGUgb25seSB3aXRoIEdDQykKKyAgKiAgLSBcYiBHb29nbGVEZW5zZUhhc2hNYXBUcmFpdHM6IGNvcnJlc3BvbmRzIHRvIGdvb2dsZTo6ZGVuc2VfaGFzaF9tYXAgKGJlc3QgZWZmaWNpZW5jeSwgcmVhc29uYWJsZSBtZW1vcnkgY29uc3VtcHRpb24pCisgICogIC0gXGIgR29vZ2xlU3BhcnNlSGFzaE1hcFRyYWl0czogY29ycmVzcG9uZHMgdG8gZ29vZ2xlOjpzcGFyc2VfaGFzaF9tYXAgKGJlc3QgbWVtb3J5IGNvbnN1bXB0aW9uLCByZWxhdGl2ZWx5IGdvb2QgcGVyZm9ybWFuY2UpCisgICoKKyAgKiBUaGUgZGVmYXVsdCBtYXAgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiB0aGUgYXZhaWxhYmlsaXR5LCBhbmQgdGhlIHByZWZlcnJlZCBvcmRlciBpczoKKyAgKiBHb29nbGVTcGFyc2VIYXNoTWFwVHJhaXRzLCBHbnVIYXNoTWFwVHJhaXRzLCBhbmQgZmluYWxseSBTdGRNYXBUcmFpdHMuCisgICoKKyAgKiBGb3IgcGVyZm9ybWFuY2UgYW5kIG1lbW9yeSBjb25zdW1wdGlvbiByZWFzb25zIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byB1c2Ugb25lIG9mCisgICogdGhlIEdvb2dsZSdzIGhhc2hfbWFwIGltcGxlbWVudGF0aW9uLiBUbyBlbmFibGUgdGhlIHN1cHBvcnQgZm9yIHRoZW0sIHlvdSBoYXZlIHR3byBvcHRpb25zOgorICAqICAtIFwjaW5jbHVkZSA8Z29vZ2xlL2RlbnNlX2hhc2hfbWFwPiB5b3Vyc2VsZiBcYiBiZWZvcmUgRWlnZW4vU3BhcnNlIGhlYWRlcgorICAqICAtIGRlZmluZSBFSUdFTl9HT09HTEVIQVNIX1NVUFBPUlQKKyAgKiBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgaW5jbHVzaW9uIG9mIDxnb29nbGUvZGVuc2VfaGFzaF9tYXA+IGlzIG1hZGUgZm9yIHlvdS4KKyAgKgorICAqIFxzZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1zcGFyc2VoYXNoLworICAqLwordGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZSwKKyAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBNYXBUcmFpdHMgPQorI2lmIGRlZmluZWQgX0RFTlNFX0hBU0hfTUFQX0hfCisgICAgICAgICAgR29vZ2xlRGVuc2VIYXNoTWFwVHJhaXRzCisjZWxpZiBkZWZpbmVkIF9IQVNIX01BUAorICAgICAgICAgIEdudUhhc2hNYXBUcmFpdHMKKyNlbHNlCisgICAgICAgICAgU3RkTWFwVHJhaXRzCisjZW5kaWYKKyAgICAgICAgICxpbnQgT3V0ZXJQYWNrZXRCaXRzID0gNj4KK2NsYXNzIFJhbmRvbVNldHRlcgoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgICAgc3RydWN0IFNjYWxhcldyYXBwZXIKKyAgICB7CisgICAgICBTY2FsYXJXcmFwcGVyKCkgOiB2YWx1ZSgwKSB7fQorICAgICAgU2NhbGFyIHZhbHVlOworICAgIH07CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXBUcmFpdHM8U2NhbGFyV3JhcHBlcj46OktleVR5cGUgS2V5VHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hcFRyYWl0czxTY2FsYXJXcmFwcGVyPjo6VHlwZSBIYXNoTWFwVHlwZTsKKyAgICBzdGF0aWMgY29uc3QgaW50IE91dGVyUGFja2V0TWFzayA9ICgxIDw8IE91dGVyUGFja2V0Qml0cykgLSAxOworICAgIGVudW0geworICAgICAgU3dhcFN0b3JhZ2UgPSAxIC0gTWFwVHJhaXRzPFNjYWxhcldyYXBwZXI+OjpJc1NvcnRlZCwKKyAgICAgIFRhcmdldFJvd01ham9yID0gKFNwYXJzZU1hdHJpeFR5cGU6OkZsYWdzICYgUm93TWFqb3JCaXQpID8gMSA6IDAsCisgICAgICBTZXR0ZXJSb3dNYWpvciA9IFN3YXBTdG9yYWdlID8gMS1UYXJnZXRSb3dNYWpvciA6IFRhcmdldFJvd01ham9yCisgICAgfTsKKworICBwdWJsaWM6CisKKyAgICAvKiogQ29uc3RydWN0cyBhIHJhbmRvbSBzZXR0ZXIgb2JqZWN0IGZyb20gdGhlIHNwYXJzZSBtYXRyaXggXGEgdGFyZ2V0CisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBcYSB0YXJnZXQgYXJlIGltcG9ydGVkLiBJZiB5b3Ugd2FudCB0byByZS1zZXQKKyAgICAgICogYSBzcGFyc2UgbWF0cml4IGZyb20gc2NyYXRjaCwgdGhlbiB5b3UgbXVzdCBzZXQgaXQgdG8gemVybyBmaXJzdCB1c2luZyB0aGUKKyAgICAgICogc2V0WmVybygpIGZ1bmN0aW9uLgorICAgICAgKi8KKyAgICBpbmxpbmUgUmFuZG9tU2V0dGVyKFNwYXJzZU1hdHJpeFR5cGUmIHRhcmdldCkKKyAgICAgIDogbXBfdGFyZ2V0KCZ0YXJnZXQpCisgICAgeworICAgICAgY29uc3QgSW5kZXggb3V0ZXJTaXplID0gU3dhcFN0b3JhZ2UgPyB0YXJnZXQuaW5uZXJTaXplKCkgOiB0YXJnZXQub3V0ZXJTaXplKCk7CisgICAgICBjb25zdCBJbmRleCBpbm5lclNpemUgPSBTd2FwU3RvcmFnZSA/IHRhcmdldC5vdXRlclNpemUoKSA6IHRhcmdldC5pbm5lclNpemUoKTsKKyAgICAgIG1fb3V0ZXJQYWNrZXRzID0gb3V0ZXJTaXplID4+IE91dGVyUGFja2V0Qml0czsKKyAgICAgIGlmIChvdXRlclNpemUmT3V0ZXJQYWNrZXRNYXNrKQorICAgICAgICBtX291dGVyUGFja2V0cyArPSAxOworICAgICAgbV9oYXNobWFwcyA9IG5ldyBIYXNoTWFwVHlwZVttX291dGVyUGFja2V0c107CisgICAgICAvLyBjb21wdXRlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byBzdG9yZSBpbm5lciBpbmRpY2VzCisgICAgICBJbmRleCBhdXggPSBpbm5lclNpemUgLSAxOworICAgICAgbV9rZXlCaXRzT2Zmc2V0ID0gMDsKKyAgICAgIHdoaWxlIChhdXgpCisgICAgICB7CisgICAgICAgICsrbV9rZXlCaXRzT2Zmc2V0OworICAgICAgICBhdXggPSBhdXggPj4gMTsKKyAgICAgIH0KKyAgICAgIEtleVR5cGUgaWsgPSAoMTw8KE91dGVyUGFja2V0Qml0cyttX2tleUJpdHNPZmZzZXQpKTsKKyAgICAgIGZvciAoSW5kZXggaz0wOyBrPG1fb3V0ZXJQYWNrZXRzOyArK2spCisgICAgICAgIE1hcFRyYWl0czxTY2FsYXJXcmFwcGVyPjo6c2V0SW52YWxpZEtleShtX2hhc2htYXBzW2tdLGlrKTsKKworICAgICAgLy8gaW5zZXJ0IGN1cnJlbnQgY29lZmZzCisgICAgICBmb3IgKEluZGV4IGo9MDsgajxtcF90YXJnZXQtPm91dGVyU2l6ZSgpOyArK2opCisgICAgICAgIGZvciAodHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdCgqbXBfdGFyZ2V0LGopOyBpdDsgKytpdCkKKyAgICAgICAgICAoKnRoaXMpKFRhcmdldFJvd01ham9yP2o6aXQuaW5kZXgoKSwgVGFyZ2V0Um93TWFqb3I/aXQuaW5kZXgoKTpqKSA9IGl0LnZhbHVlKCk7CisgICAgfQorCisgICAgLyoqIERlc3RydWN0b3IgdXBkYXRpbmcgYmFjayB0aGUgc3BhcnNlIG1hdHJpeCB0YXJnZXQgKi8KKyAgICB+UmFuZG9tU2V0dGVyKCkKKyAgICB7CisgICAgICBLZXlUeXBlIGtleUJpdHNNYXNrID0gKDE8PG1fa2V5Qml0c09mZnNldCktMTsKKyAgICAgIGlmICghU3dhcFN0b3JhZ2UpIC8vIGFsc28gbWVhbnMgdGhlIG1hcCBpcyBzb3J0ZWQKKyAgICAgIHsKKyAgICAgICAgbXBfdGFyZ2V0LT5zZXRaZXJvKCk7CisgICAgICAgIG1wX3RhcmdldC0+bWFrZUNvbXByZXNzZWQoKTsKKyAgICAgICAgbXBfdGFyZ2V0LT5yZXNlcnZlKG5vblplcm9zKCkpOworICAgICAgICBJbmRleCBwcmV2T3V0ZXIgPSAtMTsKKyAgICAgICAgZm9yIChJbmRleCBrPTA7IGs8bV9vdXRlclBhY2tldHM7ICsraykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IEluZGV4IG91dGVyT2Zmc2V0ID0gKDE8PE91dGVyUGFja2V0Qml0cykgKiBrOworICAgICAgICAgIHR5cGVuYW1lIEhhc2hNYXBUeXBlOjppdGVyYXRvciBlbmQgPSBtX2hhc2htYXBzW2tdLmVuZCgpOworICAgICAgICAgIGZvciAodHlwZW5hbWUgSGFzaE1hcFR5cGU6Oml0ZXJhdG9yIGl0ID0gbV9oYXNobWFwc1trXS5iZWdpbigpOyBpdCE9ZW5kOyArK2l0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gKGl0LT5maXJzdCA+PiBtX2tleUJpdHNPZmZzZXQpICsgb3V0ZXJPZmZzZXQ7CisgICAgICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IGl0LT5maXJzdCAmIGtleUJpdHNNYXNrOworICAgICAgICAgICAgaWYgKHByZXZPdXRlciE9b3V0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZvciAoSW5kZXggaj1wcmV2T3V0ZXIrMTtqPD1vdXRlcjsrK2opCisgICAgICAgICAgICAgICAgbXBfdGFyZ2V0LT5zdGFydFZlYyhqKTsKKyAgICAgICAgICAgICAgcHJldk91dGVyID0gb3V0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtcF90YXJnZXQtPmluc2VydEJhY2tCeU91dGVySW5uZXIob3V0ZXIsIGlubmVyKSA9IGl0LT5zZWNvbmQudmFsdWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1wX3RhcmdldC0+ZmluYWxpemUoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgVmVjdG9yWGkgcG9zaXRpb25zKG1wX3RhcmdldC0+b3V0ZXJTaXplKCkpOworICAgICAgICBwb3NpdGlvbnMuc2V0WmVybygpOworICAgICAgICAvLyBwYXNzIDEKKyAgICAgICAgZm9yIChJbmRleCBrPTA7IGs8bV9vdXRlclBhY2tldHM7ICsraykKKyAgICAgICAgeworICAgICAgICAgIHR5cGVuYW1lIEhhc2hNYXBUeXBlOjppdGVyYXRvciBlbmQgPSBtX2hhc2htYXBzW2tdLmVuZCgpOworICAgICAgICAgIGZvciAodHlwZW5hbWUgSGFzaE1hcFR5cGU6Oml0ZXJhdG9yIGl0ID0gbV9oYXNobWFwc1trXS5iZWdpbigpOyBpdCE9ZW5kOyArK2l0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IEluZGV4IG91dGVyID0gaXQtPmZpcnN0ICYga2V5Qml0c01hc2s7CisgICAgICAgICAgICArK3Bvc2l0aW9uc1tvdXRlcl07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHByZWZpeCBzdW0KKyAgICAgICAgSW5kZXggY291bnQgPSAwOworICAgICAgICBmb3IgKEluZGV4IGo9MDsgajxtcF90YXJnZXQtPm91dGVyU2l6ZSgpOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBJbmRleCB0bXAgPSBwb3NpdGlvbnNbal07CisgICAgICAgICAgbXBfdGFyZ2V0LT5vdXRlckluZGV4UHRyKClbal0gPSBjb3VudDsKKyAgICAgICAgICBwb3NpdGlvbnNbal0gPSBjb3VudDsKKyAgICAgICAgICBjb3VudCArPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgbXBfdGFyZ2V0LT5tYWtlQ29tcHJlc3NlZCgpOworICAgICAgICBtcF90YXJnZXQtPm91dGVySW5kZXhQdHIoKVttcF90YXJnZXQtPm91dGVyU2l6ZSgpXSA9IGNvdW50OworICAgICAgICBtcF90YXJnZXQtPnJlc2l6ZU5vblplcm9zKGNvdW50KTsKKyAgICAgICAgLy8gcGFzcyAyCisgICAgICAgIGZvciAoSW5kZXggaz0wOyBrPG1fb3V0ZXJQYWNrZXRzOyArK2spCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBJbmRleCBvdXRlck9mZnNldCA9ICgxPDxPdXRlclBhY2tldEJpdHMpICogazsKKyAgICAgICAgICB0eXBlbmFtZSBIYXNoTWFwVHlwZTo6aXRlcmF0b3IgZW5kID0gbV9oYXNobWFwc1trXS5lbmQoKTsKKyAgICAgICAgICBmb3IgKHR5cGVuYW1lIEhhc2hNYXBUeXBlOjppdGVyYXRvciBpdCA9IG1faGFzaG1hcHNba10uYmVnaW4oKTsgaXQhPWVuZDsgKytpdCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBJbmRleCBpbm5lciA9IChpdC0+Zmlyc3QgPj4gbV9rZXlCaXRzT2Zmc2V0KSArIG91dGVyT2Zmc2V0OworICAgICAgICAgICAgY29uc3QgSW5kZXggb3V0ZXIgPSBpdC0+Zmlyc3QgJiBrZXlCaXRzTWFzazsKKyAgICAgICAgICAgIC8vIHNvcnRlZCBpbnNlcnRpb24KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBhdCBtb3N0IDJeT3V0ZXJQYWNrZXRCaXRzIHVuc29ydGVkIGNvZWZmaWNpZW50cywKKyAgICAgICAgICAgIC8vIG1vcmVvdmVyIHRob3NlIDJeT3V0ZXJQYWNrZXRCaXRzIGNvZWZmcyBhcmUgbGlrZWx5IHRvIGJlIHNwYXJzZSwgYW4gc28gb25seSBhCisgICAgICAgICAgICAvLyBzbWFsbCBmcmFjdGlvbiBvZiB0aGVtIGhhdmUgdG8gYmUgc29ydGVkLCB3aGVuY2UgdGhlIGZvbGxvd2luZyBzaW1wbGUgcHJvY2VkdXJlOgorICAgICAgICAgICAgSW5kZXggcG9zU3RhcnQgPSBtcF90YXJnZXQtPm91dGVySW5kZXhQdHIoKVtvdXRlcl07CisgICAgICAgICAgICBJbmRleCBpID0gKHBvc2l0aW9uc1tvdXRlcl0rKykgLSAxOworICAgICAgICAgICAgd2hpbGUgKCAoaSA+PSBwb3NTdGFydCkgJiYgKG1wX3RhcmdldC0+aW5uZXJJbmRleFB0cigpW2ldID4gaW5uZXIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXBfdGFyZ2V0LT52YWx1ZVB0cigpW2krMV0gPSBtcF90YXJnZXQtPnZhbHVlUHRyKClbaV07CisgICAgICAgICAgICAgIG1wX3RhcmdldC0+aW5uZXJJbmRleFB0cigpW2krMV0gPSBtcF90YXJnZXQtPmlubmVySW5kZXhQdHIoKVtpXTsKKyAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXBfdGFyZ2V0LT5pbm5lckluZGV4UHRyKClbaSsxXSA9IGlubmVyOworICAgICAgICAgICAgbXBfdGFyZ2V0LT52YWx1ZVB0cigpW2krMV0gPSBpdC0+c2Vjb25kLnZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVsZXRlW10gbV9oYXNobWFwczsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGNvZWZmaWNpZW50IGF0IGdpdmVuIGNvb3JkaW5hdGVzIFxhIHJvdywgXGEgY29sICovCisgICAgU2NhbGFyJiBvcGVyYXRvcigpIChJbmRleCByb3csIEluZGV4IGNvbCkKKyAgICB7CisgICAgICBjb25zdCBJbmRleCBvdXRlciA9IFNldHRlclJvd01ham9yID8gcm93IDogY29sOworICAgICAgY29uc3QgSW5kZXggaW5uZXIgPSBTZXR0ZXJSb3dNYWpvciA/IGNvbCA6IHJvdzsKKyAgICAgIGNvbnN0IEluZGV4IG91dGVyTWFqb3IgPSBvdXRlciA+PiBPdXRlclBhY2tldEJpdHM7IC8vIGluZGV4IG9mIHRoZSBwYWNrZXQvbWFwCisgICAgICBjb25zdCBJbmRleCBvdXRlck1pbm9yID0gb3V0ZXIgJiBPdXRlclBhY2tldE1hc2s7ICAvLyBpbmRleCBvZiB0aGUgaW5uZXIgdmVjdG9yIGluIHRoZSBwYWNrZXQKKyAgICAgIGNvbnN0IEtleVR5cGUga2V5ID0gKEtleVR5cGUob3V0ZXJNaW5vcik8PG1fa2V5Qml0c09mZnNldCkgfCBpbm5lcjsKKyAgICAgIHJldHVybiBtX2hhc2htYXBzW291dGVyTWFqb3JdW2tleV0udmFsdWU7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uIHplcm8gY29lZmZpY2llbnRzCisgICAgICAqCisgICAgICAqIFxub3RlIEFjY29yZGluZyB0byB0aGUgdW5kZXJseWluZyBtYXAvaGFzaF9tYXAgaW1wbGVtZW50YXRpb24sCisgICAgICAqIHRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgcXVpdGUgZXhwZW5zaXZlLgorICAgICAgKi8KKyAgICBJbmRleCBub25aZXJvcygpIGNvbnN0CisgICAgeworICAgICAgSW5kZXggbnogPSAwOworICAgICAgZm9yIChJbmRleCBrPTA7IGs8bV9vdXRlclBhY2tldHM7ICsraykKKyAgICAgICAgbnogKz0gc3RhdGljX2Nhc3Q8SW5kZXg+KG1faGFzaG1hcHNba10uc2l6ZSgpKTsKKyAgICAgIHJldHVybiBuejsKKyAgICB9CisKKworICBwcm90ZWN0ZWQ6CisKKyAgICBIYXNoTWFwVHlwZSogbV9oYXNobWFwczsKKyAgICBTcGFyc2VNYXRyaXhUeXBlKiBtcF90YXJnZXQ7CisgICAgSW5kZXggbV9vdXRlclBhY2tldHM7CisgICAgdW5zaWduZWQgY2hhciBtX2tleUJpdHNPZmZzZXQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KKworI2VuZGlmIC8vIEVJR0VOX1JBTkRPTVNFVFRFUl9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BsaW5lcy9DTWFrZUxpc3RzLnR4dCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGxpbmVzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzYyNzEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BsaW5lcy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZJTEUoR0xPQiBFaWdlbl9TcGxpbmVzX1NSQ1MgIiouaCIpCisKK0lOU1RBTEwoRklMRVMKKyAgJHtFaWdlbl9TcGxpbmVzX1NSQ1N9CisgIERFU1RJTkFUSU9OICR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwbGluZXMgQ09NUE9ORU5UIERldmVsCisgICkKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGxpbmVzL1NwbGluZS5oIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwbGluZXMvU3BsaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4MGYwMQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGxpbmVzL1NwbGluZS5oCkBAIC0wLDAgKzEsNDY0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMTAtMjAxMSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQTElORV9ICisjZGVmaW5lIEVJR0VOX1NQTElORV9ICisKKyNpbmNsdWRlICJTcGxpbmVGd2QuaCIKKworbmFtZXNwYWNlIEVpZ2VuCit7CisgICAgLyoqCisgICAgICogXGluZ3JvdXAgU3BsaW5lc19Nb2R1bGUKKyAgICAgKiBcY2xhc3MgU3BsaW5lIGNsYXNzCisgICAgICogXGJyaWVmIEEgY2xhc3MgcmVwcmVzZW50aW5nIG11bHRpLWRpbWVuc2lvbmFsIHNwbGluZSBjdXJ2ZXMuCisgICAgICoKKyAgICAgKiBUaGUgY2xhc3MgcmVwcmVzZW50cyBCLXNwbGluZXMgd2l0aCBub24tdW5pZm9ybSBrbm90IHZlY3RvcnMuIEVhY2ggY29udHJvbAorICAgICAqIHBvaW50IG9mIHRoZSBCLXNwbGluZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBiYXNpcyBmdW5jdGlvbgorICAgICAqIFxme2FsaWduKn0KKyAgICAgKiAgIEModSkgJiA9IFxzdW1fe2k9MH1ee259Tl97aSxwfSh1KVBfaQorICAgICAqIFxmfQorICAgICAqCisgICAgICogXHRwYXJhbSBfU2NhbGFyIFRoZSB1bmRlcmx5aW5nIGRhdGEgdHlwZSAodHlwaWNhbGx5IGZsb2F0IG9yIGRvdWJsZSkKKyAgICAgKiBcdHBhcmFtIF9EaW0gVGhlIGN1cnZlIGRpbWVuc2lvbiAoZS5nLiAyIG9yIDMpCisgICAgICogXHRwYXJhbSBfRGVncmVlIFBlciBkZWZhdWx0IHNldCB0byBEeW5hbWljOyBjb3VsZCBiZSBzZXQgdG8gdGhlIGFjdHVhbCBkZXNpcmVkCisgICAgICogICAgICAgICAgICAgICAgZGVncmVlIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMgKHdvdWxkIHJlc3VsdCBpbiBzdGFjayBhbGxvY2F0aW9uCisgICAgICogICAgICAgICAgICAgICAgb2Ygc2V2ZXJhbCB0ZW1wb3JhcnkgdmFyaWFibGVzKS4KKyAgICAgKiovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIGNsYXNzIFNwbGluZQorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOyAvKiE8IFRoZSBzcGxpbmUgY3VydmUncyBzY2FsYXIgdHlwZS4gKi8KKyAgICBlbnVtIHsgRGltZW5zaW9uID0gX0RpbSAvKiE8IFRoZSBzcGxpbmUgY3VydmUncyBkaW1lbnNpb24uICovIH07CisgICAgZW51bSB7IERlZ3JlZSA9IF9EZWdyZWUgLyohPCBUaGUgc3BsaW5lIGN1cnZlJ3MgZGVncmVlLiAqLyB9OworCisgICAgLyoqIFxicmllZiBUaGUgcG9pbnQgdHlwZSB0aGUgc3BsaW5lIGlzIHJlcHJlc2VudGluZy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpQb2ludFR5cGUgUG9pbnRUeXBlOworICAgIAorICAgIC8qKiBcYnJpZWYgVGhlIGRhdGEgdHlwZSB1c2VkIHRvIHN0b3JlIGtub3QgdmVjdG9ycy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpLbm90VmVjdG9yVHlwZSBLbm90VmVjdG9yVHlwZTsKKyAgICAKKyAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSBub24temVybyBiYXNpcyBmdW5jdGlvbnMuICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lPjo6QmFzaXNWZWN0b3JUeXBlIEJhc2lzVmVjdG9yVHlwZTsKKyAgICAKKyAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgcmVwcmVzZW50aW5nIHRoZSBzcGxpbmUncyBjb250cm9sIHBvaW50cy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpDb250cm9sUG9pbnRWZWN0b3JUeXBlIENvbnRyb2xQb2ludFZlY3RvclR5cGU7CisKKyAgICAvKioKKyAgICAqIFxicmllZiBDcmVhdGVzIGEgc3BsaW5lIGZyb20gYSBrbm90IHZlY3RvciBhbmQgY29udHJvbCBwb2ludHMuCisgICAgKiBccGFyYW0ga25vdHMgVGhlIHNwbGluZSdzIGtub3QgdmVjdG9yLgorICAgICogXHBhcmFtIGN0cmxzIFRoZSBzcGxpbmUncyBjb250cm9sIHBvaW50IHZlY3Rvci4KKyAgICAqKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJWZWN0b3JUeXBlLCB0eXBlbmFtZSBPdGhlckFycmF5VHlwZT4KKyAgICBTcGxpbmUoY29uc3QgT3RoZXJWZWN0b3JUeXBlJiBrbm90cywgY29uc3QgT3RoZXJBcnJheVR5cGUmIGN0cmxzKSA6IG1fa25vdHMoa25vdHMpLCBtX2N0cmxzKGN0cmxzKSB7fQorCisgICAgLyoqCisgICAgKiBcYnJpZWYgQ29weSBjb25zdHJ1Y3RvciBmb3Igc3BsaW5lcy4KKyAgICAqIFxwYXJhbSBzcGxpbmUgVGhlIGlucHV0IHNwbGluZS4KKyAgICAqKi8KKyAgICB0ZW1wbGF0ZSA8aW50IE90aGVyRGVncmVlPgorICAgIFNwbGluZShjb25zdCBTcGxpbmU8U2NhbGFyLCBEaW1lbnNpb24sIE90aGVyRGVncmVlPiYgc3BsaW5lKSA6IAorICAgIG1fa25vdHMoc3BsaW5lLmtub3RzKCkpLCBtX2N0cmxzKHNwbGluZS5jdHJscygpKSB7fQorCisgICAgLyoqCisgICAgICogXGJyaWVmIFJldHVybnMgdGhlIGtub3RzIG9mIHRoZSB1bmRlcmx5aW5nIHNwbGluZS4KKyAgICAgKiovCisgICAgY29uc3QgS25vdFZlY3RvclR5cGUmIGtub3RzKCkgY29uc3QgeyByZXR1cm4gbV9rbm90czsgfQorICAgIAorICAgIC8qKgorICAgICAqIFxicmllZiBSZXR1cm5zIHRoZSBrbm90cyBvZiB0aGUgdW5kZXJseWluZyBzcGxpbmUuCisgICAgICoqLyAgICAKKyAgICBjb25zdCBDb250cm9sUG9pbnRWZWN0b3JUeXBlJiBjdHJscygpIGNvbnN0IHsgcmV0dXJuIG1fY3RybHM7IH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBSZXR1cm5zIHRoZSBzcGxpbmUgdmFsdWUgYXQgYSBnaXZlbiBzaXRlIFxmJHVcZiQuCisgICAgICoKKyAgICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJucworICAgICAqIFxme2FsaWduKn0KKyAgICAgKiAgIEModSkgJiA9IFxzdW1fe2k9MH1ee259Tl97aSxwfVBfaQorICAgICAqIFxmfQorICAgICAqCisgICAgICogXHBhcmFtIHUgUGFyYW1ldGVyIFxmJHUgXGluIFswOzFdXGYkIGF0IHdoaWNoIHRoZSBzcGxpbmUgaXMgZXZhbHVhdGVkLgorICAgICAqIFxyZXR1cm4gVGhlIHNwbGluZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gXGYkdVxmJC4KKyAgICAgKiovCisgICAgUG9pbnRUeXBlIG9wZXJhdG9yKCkoU2NhbGFyIHUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogXGJyaWVmIEV2YWx1YXRpb24gb2Ygc3BsaW5lIGRlcml2YXRpdmVzIG9mIHVwLXRvIGdpdmVuIG9yZGVyLgorICAgICAqCisgICAgICogVGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgICAgKiBcZnthbGlnbip9CisgICAgICogICBcZnJhY3tkXml9e2R1Xml9Qyh1KSAmID0gXHN1bV97aT0wfV57bn0gXGZyYWN7ZF5pfXtkdV5pfSBOX3tpLHB9KHUpUF9pCisgICAgICogXGZ9CisgICAgICogZm9yIGkgcmFuZ2luZyBiZXR3ZWVuIDAgYW5kIG9yZGVyLgorICAgICAqCisgICAgICogXHBhcmFtIHUgUGFyYW1ldGVyIFxmJHUgXGluIFswOzFdXGYkIGF0IHdoaWNoIHRoZSBzcGxpbmUgZGVyaXZhdGl2ZSBpcyBldmFsdWF0ZWQuCisgICAgICogXHBhcmFtIG9yZGVyIFRoZSBvcmRlciB1cCB0byB3aGljaCB0aGUgZGVyaXZhdGl2ZXMgYXJlIGNvbXB1dGVkLgorICAgICAqKi8KKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lPjo6RGVyaXZhdGl2ZVR5cGUKKyAgICAgIGRlcml2YXRpdmVzKFNjYWxhciB1LCBEZW5zZUluZGV4IG9yZGVyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxjb3B5ZG9jIFNwbGluZTo6ZGVyaXZhdGl2ZXMKKyAgICAgKiBVc2luZyB0aGUgdGVtcGxhdGUgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIG1vcmUgZWZmaWNpZWVudCBzaW5jZQorICAgICAqIHRlbXBvcmFyeSBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIHdoZW5ldmVyIHRoaXMgaXMgcG9zc2libGUuCisgICAgICoqLyAgICAKKyAgICB0ZW1wbGF0ZSA8aW50IERlcml2YXRpdmVPcmRlcj4KKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lLERlcml2YXRpdmVPcmRlcj46OkRlcml2YXRpdmVUeXBlCisgICAgICBkZXJpdmF0aXZlcyhTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlciA9IERlcml2YXRpdmVPcmRlcikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIG5vbi16ZXJvIGJhc2lzIGZ1bmN0aW9ucyBhdCB0aGUgZ2l2ZW4gc2l0ZS4KKyAgICAgKgorICAgICAqIFNwbGluZXMgaGF2ZSBsb2NhbCBzdXBwb3J0IGFuZCBhIHBvaW50IGZyb20gdGhlaXIgaW1hZ2UgaXMgZGVmaW5lZAorICAgICAqIGJ5IGV4YWN0bHkgXGYkcCsxXGYkIGNvbnRyb2wgcG9pbnRzIFxmJFBfaVxmJCB3aGVyZSBcZiRwXGYkIGlzIHRoZQorICAgICAqIHNwbGluZSBkZWdyZWUuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBcZiRwKzFcZiQgbm9uLXplcm8gYmFzaXMgZnVuY3Rpb24gdmFsdWVzCisgICAgICogZm9yIGEgZ2l2ZW4gcGFyYW1ldGVyIHZhbHVlIFxmJHVcZiQuIEl0IHJldHVybnMKKyAgICAgKiBcZnthbGlnbip9eworICAgICAqICAgTl97aSxwfSh1KSwgXGhkb3RzLCBOX3tpK3ArMSxwfSh1KQorICAgICAqIFxmfQorICAgICAqCisgICAgICogXHBhcmFtIHUgUGFyYW1ldGVyIFxmJHUgXGluIFswOzFdXGYkIGF0IHdoaWNoIHRoZSBub24temVybyBiYXNpcyBmdW5jdGlvbnMgCisgICAgICogICAgICAgICAgYXJlIGNvbXB1dGVkLgorICAgICAqKi8KKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lPjo6QmFzaXNWZWN0b3JUeXBlCisgICAgICBiYXNpc0Z1bmN0aW9ucyhTY2FsYXIgdSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIG5vbi16ZXJvIHNwbGluZSBiYXNpcyBmdW5jdGlvbiBkZXJpdmF0aXZlcyB1cCB0byBnaXZlbiBvcmRlci4KKyAgICAgKgorICAgICAqIFRoZSBmdW5jdGlvbiBjb21wdXRlcworICAgICAqIFxme2FsaWduKn17CisgICAgICogICBcZnJhY3tkXml9e2R1Xml9IE5fe2kscH0odSksIFxoZG90cywgXGZyYWN7ZF5pfXtkdV5pfSBOX3tpK3ArMSxwfSh1KQorICAgICAqIFxmfQorICAgICAqIHdpdGggaSByYW5naW5nIGZyb20gMCB1cCB0byB0aGUgc3BlY2lmaWVkIG9yZGVyLgorICAgICAqCisgICAgICogXHBhcmFtIHUgUGFyYW1ldGVyIFxmJHUgXGluIFswOzFdXGYkIGF0IHdoaWNoIHRoZSBub24temVybyBiYXNpcyBmdW5jdGlvbgorICAgICAqICAgICAgICAgIGRlcml2YXRpdmVzIGFyZSBjb21wdXRlZC4KKyAgICAgKiBccGFyYW0gb3JkZXIgVGhlIG9yZGVyIHVwIHRvIHdoaWNoIHRoZSBiYXNpcyBmdW5jdGlvbiBkZXJpdmF0aXZlcyBhcmUgY29tcHV0ZXMuCisgICAgICoqLworICAgIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpCYXNpc0Rlcml2YXRpdmVUeXBlCisgICAgICBiYXNpc0Z1bmN0aW9uRGVyaXZhdGl2ZXMoU2NhbGFyIHUsIERlbnNlSW5kZXggb3JkZXIpIGNvbnN0OworCisgICAgLyoqCisgICAgICogXGNvcHlkb2MgU3BsaW5lOjpiYXNpc0Z1bmN0aW9uRGVyaXZhdGl2ZXMKKyAgICAgKiBVc2luZyB0aGUgdGVtcGxhdGUgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGlzIG1vcmUgZWZmaWNpZWVudCBzaW5jZQorICAgICAqIHRlbXBvcmFyeSBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIHdoZW5ldmVyIHRoaXMgaXMgcG9zc2libGUuCisgICAgICoqLyAgICAKKyAgICB0ZW1wbGF0ZSA8aW50IERlcml2YXRpdmVPcmRlcj4KKyAgICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lLERlcml2YXRpdmVPcmRlcj46OkJhc2lzRGVyaXZhdGl2ZVR5cGUKKyAgICAgIGJhc2lzRnVuY3Rpb25EZXJpdmF0aXZlcyhTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlciA9IERlcml2YXRpdmVPcmRlcikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgUmV0dXJucyB0aGUgc3BsaW5lIGRlZ3JlZS4KKyAgICAgKiovIAorICAgIERlbnNlSW5kZXggZGVncmVlKCkgY29uc3Q7CisKKyAgICAvKiogCisgICAgICogXGJyaWVmIFJldHVybnMgdGhlIHNwYW4gd2l0aGluIHRoZSBrbm90IHZlY3RvciBpbiB3aGljaCB1IGlzIGZhbGxpbmcuCisgICAgICogXHBhcmFtIHUgVGhlIHNpdGUgZm9yIHdoaWNoIHRoZSBzcGFuIGlzIGRldGVybWluZWQuCisgICAgICoqLworICAgIERlbnNlSW5kZXggc3BhbihTY2FsYXIgdSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgQ29tcHV0ZXMgdGhlIHNwYW5nIHdpdGhpbiB0aGUgcHJvdmlkZWQga25vdCB2ZWN0b3IgaW4gd2hpY2ggdSBpcyBmYWxsaW5nLgorICAgICAqKi8KKyAgICBzdGF0aWMgRGVuc2VJbmRleCBTcGFuKHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpTY2FsYXIgdSwgRGVuc2VJbmRleCBkZWdyZWUsIGNvbnN0IHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmU+OjpLbm90VmVjdG9yVHlwZSYga25vdHMpOworICAgIAorICAgIC8qKgorICAgICAqIFxicmllZiBSZXR1cm5zIHRoZSBzcGxpbmUncyBub24temVybyBiYXNpcyBmdW5jdGlvbnMuCisgICAgICoKKyAgICAgKiBUaGUgZnVuY3Rpb24gY29tcHV0ZXMgYW5kIHJldHVybnMKKyAgICAgKiBcZnthbGlnbip9eworICAgICAqICAgTl97aSxwfSh1KSwgXGhkb3RzLCBOX3tpK3ArMSxwfSh1KQorICAgICAqIFxmfQorICAgICAqCisgICAgICogXHBhcmFtIHUgVGhlIHNpdGUgYXQgd2hpY2ggdGhlIGJhc2lzIGZ1bmN0aW9ucyBhcmUgY29tcHV0ZWQuCisgICAgICogXHBhcmFtIGRlZ3JlZSBUaGUgZGVncmVlIG9mIHRoZSB1bmRlcmx5aW5nIHNwbGluZS4KKyAgICAgKiBccGFyYW0ga25vdHMgVGhlIHVuZGVybHlpbmcgc3BsaW5lJ3Mga25vdCB2ZWN0b3IuCisgICAgICoqLworICAgIHN0YXRpYyBCYXNpc1ZlY3RvclR5cGUgQmFzaXNGdW5jdGlvbnMoU2NhbGFyIHUsIERlbnNlSW5kZXggZGVncmVlLCBjb25zdCBLbm90VmVjdG9yVHlwZSYga25vdHMpOworCisKKyAgcHJpdmF0ZToKKyAgICBLbm90VmVjdG9yVHlwZSBtX2tub3RzOyAvKiE8IEtub3QgdmVjdG9yLiAqLworICAgIENvbnRyb2xQb2ludFZlY3RvclR5cGUgIG1fY3RybHM7IC8qITwgQ29udHJvbCBwb2ludHMuICovCisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltLCBpbnQgX0RlZ3JlZT4KKyAgRGVuc2VJbmRleCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OlNwYW4oCisgICAgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4gPjo6U2NhbGFyIHUsCisgICAgRGVuc2VJbmRleCBkZWdyZWUsCisgICAgY29uc3QgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4gPjo6S25vdFZlY3RvclR5cGUmIGtub3RzKQorICB7CisgICAgLy8gUGllZ2wgJiBUaWxsZXIsICJUaGUgTlVSQlMgQm9vayIsIEEyLjEgKHAuIDY4KQorICAgIGlmICh1IDw9IGtub3RzKDApKSByZXR1cm4gZGVncmVlOworICAgIGNvbnN0IFNjYWxhciogcG9zID0gc3RkOjp1cHBlcl9ib3VuZChrbm90cy5kYXRhKCkrZGVncmVlLTEsIGtub3RzLmRhdGEoKStrbm90cy5zaXplKCktZGVncmVlLTEsIHUpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZW5zZUluZGV4Piggc3RkOjpkaXN0YW5jZShrbm90cy5kYXRhKCksIHBvcykgLSAxICk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIGludCBfRGVncmVlPgorICB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OkJhc2lzVmVjdG9yVHlwZQorICAgIFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6QmFzaXNGdW5jdGlvbnMoCisgICAgdHlwZW5hbWUgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+OjpTY2FsYXIgdSwKKyAgICBEZW5zZUluZGV4IGRlZ3JlZSwKKyAgICBjb25zdCB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46Oktub3RWZWN0b3JUeXBlJiBrbm90cykKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+OjpCYXNpc1ZlY3RvclR5cGUgQmFzaXNWZWN0b3JUeXBlOworCisgICAgY29uc3QgRGVuc2VJbmRleCBwID0gZGVncmVlOworICAgIGNvbnN0IERlbnNlSW5kZXggaSA9IFNwbGluZTo6U3Bhbih1LCBkZWdyZWUsIGtub3RzKTsKKworICAgIGNvbnN0IEtub3RWZWN0b3JUeXBlJiBVID0ga25vdHM7CisKKyAgICBCYXNpc1ZlY3RvclR5cGUgbGVmdChwKzEpOyBsZWZ0KDApID0gU2NhbGFyKDApOworICAgIEJhc2lzVmVjdG9yVHlwZSByaWdodChwKzEpOyByaWdodCgwKSA9IFNjYWxhcigwKTsgICAgICAgIAorCisgICAgVmVjdG9yQmxvY2s8QmFzaXNWZWN0b3JUeXBlLERlZ3JlZT4obGVmdCwxLHApID0gdSAtIFZlY3RvckJsb2NrPGNvbnN0IEtub3RWZWN0b3JUeXBlLERlZ3JlZT4oVSxpKzEtcCxwKS5yZXZlcnNlKCk7CisgICAgVmVjdG9yQmxvY2s8QmFzaXNWZWN0b3JUeXBlLERlZ3JlZT4ocmlnaHQsMSxwKSA9IFZlY3RvckJsb2NrPGNvbnN0IEtub3RWZWN0b3JUeXBlLERlZ3JlZT4oVSxpKzEscCkgLSB1OworCisgICAgQmFzaXNWZWN0b3JUeXBlIE4oMSxwKzEpOworICAgIE4oMCkgPSBTY2FsYXIoMSk7CisgICAgZm9yIChEZW5zZUluZGV4IGo9MTsgajw9cDsgKytqKQorICAgIHsKKyAgICAgIFNjYWxhciBzYXZlZCA9IFNjYWxhcigwKTsKKyAgICAgIGZvciAoRGVuc2VJbmRleCByPTA7IHI8ajsgcisrKQorICAgICAgeworICAgICAgICBjb25zdCBTY2FsYXIgdG1wID0gTihyKS8ocmlnaHQocisxKStsZWZ0KGotcikpOworICAgICAgICBOW3JdID0gc2F2ZWQgKyByaWdodChyKzEpKnRtcDsKKyAgICAgICAgc2F2ZWQgPSBsZWZ0KGotcikqdG1wOworICAgICAgfQorICAgICAgTihqKSA9IHNhdmVkOworICAgIH0KKyAgICByZXR1cm4gTjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIERlbnNlSW5kZXggU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+OjpkZWdyZWUoKSBjb25zdAorICB7CisgICAgaWYgKF9EZWdyZWUgPT0gRHluYW1pYykKKyAgICAgIHJldHVybiBtX2tub3RzLnNpemUoKSAtIG1fY3RybHMuY29scygpIC0gMTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gX0RlZ3JlZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIERlbnNlSW5kZXggU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+OjpzcGFuKFNjYWxhciB1KSBjb25zdAorICB7CisgICAgcmV0dXJuIFNwbGluZTo6U3Bhbih1LCBkZWdyZWUoKSwga25vdHMoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIGludCBfRGVncmVlPgorICB0eXBlbmFtZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OlBvaW50VHlwZSBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46Om9wZXJhdG9yKCkoU2NhbGFyIHUpIGNvbnN0CisgIHsKKyAgICBlbnVtIHsgT3JkZXIgPSBTcGxpbmVUcmFpdHM8U3BsaW5lPjo6T3JkZXJBdENvbXBpbGVUaW1lIH07CisKKyAgICBjb25zdCBEZW5zZUluZGV4IHNwYW4gPSB0aGlzLT5zcGFuKHUpOworICAgIGNvbnN0IERlbnNlSW5kZXggcCA9IGRlZ3JlZSgpOworICAgIGNvbnN0IEJhc2lzVmVjdG9yVHlwZSBiYXNpc19mdW5jcyA9IGJhc2lzRnVuY3Rpb25zKHUpOworCisgICAgY29uc3QgUmVwbGljYXRlPEJhc2lzVmVjdG9yVHlwZSxEaW1lbnNpb24sMT4gY3RybF93ZWlnaHRzKGJhc2lzX2Z1bmNzKTsKKyAgICBjb25zdCBCbG9jazxjb25zdCBDb250cm9sUG9pbnRWZWN0b3JUeXBlLERpbWVuc2lvbixPcmRlcj4gY3RybF9wdHMoY3RybHMoKSwwLHNwYW4tcCxEaW1lbnNpb24scCsxKTsKKyAgICByZXR1cm4gKGN0cmxfd2VpZ2h0cyAqIGN0cmxfcHRzKS5yb3d3aXNlKCkuc3VtKCk7CisgIH0KKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BsaW5lVHlwZSwgdHlwZW5hbWUgRGVyaXZhdGl2ZVR5cGU+CisgIHZvaWQgZGVyaXZhdGl2ZXNJbXBsKGNvbnN0IFNwbGluZVR5cGUmIHNwbGluZSwgdHlwZW5hbWUgU3BsaW5lVHlwZTo6U2NhbGFyIHUsIERlbnNlSW5kZXggb3JkZXIsIERlcml2YXRpdmVUeXBlJiBkZXIpCisgIHsgICAgCisgICAgZW51bSB7IERpbWVuc2lvbiA9IFNwbGluZVRyYWl0czxTcGxpbmVUeXBlPjo6RGltZW5zaW9uIH07CisgICAgZW51bSB7IE9yZGVyID0gU3BsaW5lVHJhaXRzPFNwbGluZVR5cGU+OjpPcmRlckF0Q29tcGlsZVRpbWUgfTsKKyAgICBlbnVtIHsgRGVyaXZhdGl2ZU9yZGVyID0gRGVyaXZhdGl2ZVR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmVUeXBlPjo6U2NhbGFyIFNjYWxhcjsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPFNwbGluZVR5cGU+OjpCYXNpc1ZlY3RvclR5cGUgQmFzaXNWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPFNwbGluZVR5cGU+OjpDb250cm9sUG9pbnRWZWN0b3JUeXBlIENvbnRyb2xQb2ludFZlY3RvclR5cGU7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVRyYWl0czxTcGxpbmVUeXBlLERlcml2YXRpdmVPcmRlcj46OkJhc2lzRGVyaXZhdGl2ZVR5cGUgQmFzaXNEZXJpdmF0aXZlVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2lzRGVyaXZhdGl2ZVR5cGU6OkNvbnN0Um93WHByIEJhc2lzRGVyaXZhdGl2ZVJvd1hwcjsgICAgCisKKyAgICBjb25zdCBEZW5zZUluZGV4IHAgPSBzcGxpbmUuZGVncmVlKCk7CisgICAgY29uc3QgRGVuc2VJbmRleCBzcGFuID0gc3BsaW5lLnNwYW4odSk7CisKKyAgICBjb25zdCBEZW5zZUluZGV4IG4gPSAoc3RkOjptaW4pKHAsIG9yZGVyKTsKKworICAgIGRlci5yZXNpemUoRGltZW5zaW9uLG4rMSk7CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgYmFzaXMgZnVuY3Rpb24gZGVyaXZhdGl2ZXMgdXAgdG8gdGhlIGRlc2lyZWQgb3JkZXIuLi4gICAgCisgICAgY29uc3QgQmFzaXNEZXJpdmF0aXZlVHlwZSBiYXNpc19mdW5jX2RlcnMgPSBzcGxpbmUudGVtcGxhdGUgYmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzPERlcml2YXRpdmVPcmRlcj4odSwgbisxKTsKKworICAgIC8vIC4uLiBhbmQgcGVyZm9ybSB0aGUgbGluZWFyIGNvbWJpbmF0aW9ucyBvZiB0aGUgY29udHJvbCBwb2ludHMuCisgICAgZm9yIChEZW5zZUluZGV4IGRlcl9vcmRlcj0wOyBkZXJfb3JkZXI8bisxOyArK2Rlcl9vcmRlcikKKyAgICB7CisgICAgICBjb25zdCBSZXBsaWNhdGU8QmFzaXNEZXJpdmF0aXZlUm93WHByLERpbWVuc2lvbiwxPiBjdHJsX3dlaWdodHMoIGJhc2lzX2Z1bmNfZGVycy5yb3coZGVyX29yZGVyKSApOworICAgICAgY29uc3QgQmxvY2s8Y29uc3QgQ29udHJvbFBvaW50VmVjdG9yVHlwZSxEaW1lbnNpb24sT3JkZXI+IGN0cmxfcHRzKHNwbGluZS5jdHJscygpLDAsc3Bhbi1wLERpbWVuc2lvbixwKzEpOworICAgICAgZGVyLmNvbChkZXJfb3JkZXIpID0gKGN0cmxfd2VpZ2h0cyAqIGN0cmxfcHRzKS5yb3d3aXNlKCkuc3VtKCk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltLCBpbnQgX0RlZ3JlZT4KKyAgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4gPjo6RGVyaXZhdGl2ZVR5cGUKKyAgICBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OmRlcml2YXRpdmVzKFNjYWxhciB1LCBEZW5zZUluZGV4IG9yZGVyKSBjb25zdAorICB7CisgICAgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPCBTcGxpbmUgPjo6RGVyaXZhdGl2ZVR5cGUgcmVzOworICAgIGRlcml2YXRpdmVzSW1wbCgqdGhpcywgdSwgb3JkZXIsIHJlcyk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIHRlbXBsYXRlIDxpbnQgRGVyaXZhdGl2ZU9yZGVyPgorICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8IFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPiwgRGVyaXZhdGl2ZU9yZGVyID46OkRlcml2YXRpdmVUeXBlCisgICAgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+OjpkZXJpdmF0aXZlcyhTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlcikgY29uc3QKKyAgeworICAgIHR5cGVuYW1lIFNwbGluZVRyYWl0czwgU3BsaW5lLCBEZXJpdmF0aXZlT3JkZXIgPjo6RGVyaXZhdGl2ZVR5cGUgcmVzOworICAgIGRlcml2YXRpdmVzSW1wbCgqdGhpcywgdSwgb3JkZXIsIHJlcyk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIHR5cGVuYW1lIFNwbGluZVRyYWl0czwgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+ID46OkJhc2lzVmVjdG9yVHlwZQorICAgIFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6YmFzaXNGdW5jdGlvbnMoU2NhbGFyIHUpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gU3BsaW5lOjpCYXNpc0Z1bmN0aW9ucyh1LCBkZWdyZWUoKSwga25vdHMoKSk7CisgIH0KKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BsaW5lVHlwZSwgdHlwZW5hbWUgRGVyaXZhdGl2ZVR5cGU+CisgIHZvaWQgYmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzSW1wbChjb25zdCBTcGxpbmVUeXBlJiBzcGxpbmUsIHR5cGVuYW1lIFNwbGluZVR5cGU6OlNjYWxhciB1LCBEZW5zZUluZGV4IG9yZGVyLCBEZXJpdmF0aXZlVHlwZSYgTl8pCisgIHsKKyAgICBlbnVtIHsgT3JkZXIgPSBTcGxpbmVUcmFpdHM8U3BsaW5lVHlwZT46Ok9yZGVyQXRDb21waWxlVGltZSB9OworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lVHlwZT46OlNjYWxhciBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lVHlwZT46OkJhc2lzVmVjdG9yVHlwZSBCYXNpc1ZlY3RvclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8U3BsaW5lVHlwZT46Oktub3RWZWN0b3JUeXBlIEtub3RWZWN0b3JUeXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPFNwbGluZVR5cGU+OjpDb250cm9sUG9pbnRWZWN0b3JUeXBlIENvbnRyb2xQb2ludFZlY3RvclR5cGU7CisKKyAgICBjb25zdCBLbm90VmVjdG9yVHlwZSYgVSA9IHNwbGluZS5rbm90cygpOworCisgICAgY29uc3QgRGVuc2VJbmRleCBwID0gc3BsaW5lLmRlZ3JlZSgpOworICAgIGNvbnN0IERlbnNlSW5kZXggc3BhbiA9IHNwbGluZS5zcGFuKHUpOworCisgICAgY29uc3QgRGVuc2VJbmRleCBuID0gKHN0ZDo6bWluKShwLCBvcmRlcik7CisKKyAgICBOXy5yZXNpemUobisxLCBwKzEpOworCisgICAgQmFzaXNWZWN0b3JUeXBlIGxlZnQgPSBCYXNpc1ZlY3RvclR5cGU6Olplcm8ocCsxKTsKKyAgICBCYXNpc1ZlY3RvclR5cGUgcmlnaHQgPSBCYXNpc1ZlY3RvclR5cGU6Olplcm8ocCsxKTsKKworICAgIE1hdHJpeDxTY2FsYXIsT3JkZXIsT3JkZXI+IG5kdShwKzEscCsxKTsKKworICAgIGRvdWJsZSBzYXZlZCwgdGVtcDsKKworICAgIG5kdSgwLDApID0gMS4wOworCisgICAgRGVuc2VJbmRleCBqOworICAgIGZvciAoaj0xOyBqPD1wOyArK2opCisgICAgeworICAgICAgbGVmdFtqXSA9IHUtVVtzcGFuKzEtal07CisgICAgICByaWdodFtqXSA9IFVbc3BhbitqXS11OworICAgICAgc2F2ZWQgPSAwLjA7CisKKyAgICAgIGZvciAoRGVuc2VJbmRleCByPTA7IHI8ajsgKytyKQorICAgICAgeworICAgICAgICAvKiBMb3dlciB0cmlhbmdsZSAqLworICAgICAgICBuZHUoaixyKSA9IHJpZ2h0W3IrMV0rbGVmdFtqLXJdOworICAgICAgICB0ZW1wID0gbmR1KHIsai0xKS9uZHUoaixyKTsKKyAgICAgICAgLyogVXBwZXIgdHJpYW5nbGUgKi8KKyAgICAgICAgbmR1KHIsaikgPSBzdGF0aWNfY2FzdDxTY2FsYXI+KHNhdmVkK3JpZ2h0W3IrMV0gKiB0ZW1wKTsKKyAgICAgICAgc2F2ZWQgPSBsZWZ0W2otcl0gKiB0ZW1wOworICAgICAgfQorCisgICAgICBuZHUoaixqKSA9IHN0YXRpY19jYXN0PFNjYWxhcj4oc2F2ZWQpOworICAgIH0KKworICAgIGZvciAoaiA9IHA7IGo+PTA7IC0taikgCisgICAgICBOXygwLGopID0gbmR1KGoscCk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBkZXJpdmF0aXZlcworICAgIERlcml2YXRpdmVUeXBlIGEobisxLHArMSk7CisgICAgRGVuc2VJbmRleCByPTA7CisgICAgZm9yICg7IHI8PXA7ICsrcikKKyAgICB7CisgICAgICBEZW5zZUluZGV4IHMxLHMyOworICAgICAgczEgPSAwOyBzMiA9IDE7IC8vIGFsdGVybmF0ZSByb3dzIGluIGFycmF5IGEKKyAgICAgIGEoMCwwKSA9IDEuMDsKKworICAgICAgLy8gQ29tcHV0ZSB0aGUgay10aCBkZXJpdmF0aXZlCisgICAgICBmb3IgKERlbnNlSW5kZXggaz0xOyBrPD1zdGF0aWNfY2FzdDxEZW5zZUluZGV4PihuKTsgKytrKQorICAgICAgeworICAgICAgICBkb3VibGUgZCA9IDAuMDsKKyAgICAgICAgRGVuc2VJbmRleCByayxwayxqMSxqMjsKKyAgICAgICAgcmsgPSByLWs7IHBrID0gcC1rOworCisgICAgICAgIGlmIChyPj1rKQorICAgICAgICB7CisgICAgICAgICAgYShzMiwwKSA9IGEoczEsMCkvbmR1KHBrKzEscmspOworICAgICAgICAgIGQgPSBhKHMyLDApKm5kdShyayxwayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocms+PS0xKSBqMSA9IDE7CisgICAgICAgIGVsc2UgICAgICAgIGoxID0gLXJrOworCisgICAgICAgIGlmIChyLTEgPD0gcGspIGoyID0gay0xOworICAgICAgICBlbHNlICAgICAgICAgICBqMiA9IHAtcjsKKworICAgICAgICBmb3IgKGo9ajE7IGo8PWoyOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBhKHMyLGopID0gKGEoczEsaiktYShzMSxqLTEpKS9uZHUocGsrMSxyaytqKTsKKyAgICAgICAgICBkICs9IGEoczIsaikqbmR1KHJrK2oscGspOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHI8PXBrKQorICAgICAgICB7CisgICAgICAgICAgYShzMixrKSA9IC1hKHMxLGstMSkvbmR1KHBrKzEscik7CisgICAgICAgICAgZCArPSBhKHMyLGspKm5kdShyLHBrKTsKKyAgICAgICAgfQorCisgICAgICAgIE5fKGsscikgPSBzdGF0aWNfY2FzdDxTY2FsYXI+KGQpOworICAgICAgICBqID0gczE7IHMxID0gczI7IHMyID0gajsgLy8gU3dpdGNoIHJvd3MKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNdWx0aXBseSB0aHJvdWdoIGJ5IHRoZSBjb3JyZWN0IGZhY3RvcnMgKi8KKyAgICAvKiAoRXEuIFsyLjldKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICByID0gcDsKKyAgICBmb3IgKERlbnNlSW5kZXggaz0xOyBrPD1zdGF0aWNfY2FzdDxEZW5zZUluZGV4PihuKTsgKytrKQorICAgIHsKKyAgICAgIGZvciAoRGVuc2VJbmRleCBqPXA7IGo+PTA7IC0taikgTl8oayxqKSAqPSByOworICAgICAgciAqPSBwLWs7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGltLCBpbnQgX0RlZ3JlZT4KKyAgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4gPjo6QmFzaXNEZXJpdmF0aXZlVHlwZQorICAgIFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPjo6YmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzKFNjYWxhciB1LCBEZW5zZUluZGV4IG9yZGVyKSBjb25zdAorICB7CisgICAgdHlwZW5hbWUgU3BsaW5lVHJhaXRzPCBTcGxpbmUgPjo6QmFzaXNEZXJpdmF0aXZlVHlwZSBkZXI7CisgICAgYmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzSW1wbCgqdGhpcywgdSwgb3JkZXIsIGRlcik7CisgICAgcmV0dXJuIGRlcjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RpbSwgaW50IF9EZWdyZWU+CisgIHRlbXBsYXRlIDxpbnQgRGVyaXZhdGl2ZU9yZGVyPgorICB0eXBlbmFtZSBTcGxpbmVUcmFpdHM8IFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPiwgRGVyaXZhdGl2ZU9yZGVyID46OkJhc2lzRGVyaXZhdGl2ZVR5cGUKKyAgICBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT46OmJhc2lzRnVuY3Rpb25EZXJpdmF0aXZlcyhTY2FsYXIgdSwgRGVuc2VJbmRleCBvcmRlcikgY29uc3QKKyAgeworICAgIHR5cGVuYW1lIFNwbGluZVRyYWl0czwgU3BsaW5lLCBEZXJpdmF0aXZlT3JkZXIgPjo6QmFzaXNEZXJpdmF0aXZlVHlwZSBkZXI7CisgICAgYmFzaXNGdW5jdGlvbkRlcml2YXRpdmVzSW1wbCgqdGhpcywgdSwgb3JkZXIsIGRlcik7CisgICAgcmV0dXJuIGRlcjsKKyAgfQorfQorCisjZW5kaWYgLy8gRUlHRU5fU1BMSU5FX0gKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGxpbmVzL1NwbGluZUZpdHRpbmcuaCBiL3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9TcGxpbmVzL1NwbGluZUZpdHRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjU2NjMzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwbGluZXMvU3BsaW5lRml0dGluZy5oCkBAIC0wLDAgKzEsMTU5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMTAtMjAxMSBIYXVrZSBIZWliZWwgPGhhdWtlLmhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaWZuZGVmIEVJR0VOX1NQTElORV9GSVRUSU5HX0gKKyNkZWZpbmUgRUlHRU5fU1BMSU5FX0ZJVFRJTkdfSAorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgIlNwbGluZUZ3ZC5oIgorCisjaW5jbHVkZSA8RWlnZW4vUVI+CisKK25hbWVzcGFjZSBFaWdlbgoreworICAvKioKKyAgICogXGJyaWVmIENvbXB1dGVzIGtub3QgYXZlcmFnZXMuCisgICAqIFxpbmdyb3VwIFNwbGluZXNfTW9kdWxlCisgICAqCisgICAqIFRoZSBrbm90cyBhcmUgY29tcHV0ZWQgYXMKKyAgICogXGZ7YWxpZ24qfQorICAgKiAgdV8wICYgPSBcaGRvdHMgPSB1X3AgPSAwIFxcCisgICAqICB1X3ttLXB9ICYgPSBcaGRvdHMgPSB1X3ttfSA9IDEgXFwKKyAgICogIHVfe2orcH0gJiA9IFxmcmFjezF9e3B9XHN1bV97aT1qfV57aitwLTF9XGJhcnt1fV9pIFxxdWFkXHF1YWQgaj0xLFxoZG90cyxuLXAKKyAgICogXGZ9CisgICAqIHdoZXJlIFxmJHBcZiQgaXMgdGhlIGRlZ3JlZSBhbmQgXGYkbSsxXGYkIHRoZSBudW1iZXIga25vdHMKKyAgICogb2YgdGhlIGRlc2lyZWQgaW50ZXJwb2xhdGluZyBzcGxpbmUuCisgICAqCisgICAqIFxwYXJhbVtpbl0gcGFyYW1ldGVycyBUaGUgaW5wdXQgcGFyYW1ldGVycy4gRHVyaW5nIGludGVycG9sYXRpb24gb25lIGZvciBlYWNoIGRhdGEgcG9pbnQuCisgICAqIFxwYXJhbVtpbl0gZGVncmVlIFRoZSBzcGxpbmUgZGVncmVlIHdoaWNoIGlzIHVzZWQgZHVyaW5nIHRoZSBpbnRlcnBvbGF0aW9uLgorICAgKiBccGFyYW1bb3V0XSBrbm90cyBUaGUgb3V0cHV0IGtub3QgdmVjdG9yLgorICAgKgorICAgKiBcc2EgTGVzIFBpZWdsIGFuZCBXYXluZSBUaWxsZXIsIFRoZSBOVVJCUyBib29rICgybmQgZWQuKSwgMTk5NywgOS4yLjEgR2xvYmFsIEN1cnZlIEludGVycG9sYXRpb24gdG8gUG9pbnQgRGF0YQorICAgKiovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLbm90VmVjdG9yVHlwZT4KKyAgdm9pZCBLbm90QXZlcmFnaW5nKGNvbnN0IEtub3RWZWN0b3JUeXBlJiBwYXJhbWV0ZXJzLCBEZW5zZUluZGV4IGRlZ3JlZSwgS25vdFZlY3RvclR5cGUmIGtub3RzKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBLbm90VmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKKworICAgIGtub3RzLnJlc2l6ZShwYXJhbWV0ZXJzLnNpemUoKStkZWdyZWUrMSk7ICAgICAgCisKKyAgICBmb3IgKERlbnNlSW5kZXggaj0xOyBqPHBhcmFtZXRlcnMuc2l6ZSgpLWRlZ3JlZTsgKytqKQorICAgICAga25vdHMoaitkZWdyZWUpID0gcGFyYW1ldGVycy5zZWdtZW50KGosZGVncmVlKS5tZWFuKCk7CisKKyAgICBrbm90cy5zZWdtZW50KDAsZGVncmVlKzEpID0gS25vdFZlY3RvclR5cGU6Olplcm8oZGVncmVlKzEpOworICAgIGtub3RzLnNlZ21lbnQoa25vdHMuc2l6ZSgpLWRlZ3JlZS0xLGRlZ3JlZSsxKSA9IEtub3RWZWN0b3JUeXBlOjpPbmVzKGRlZ3JlZSsxKTsKKyAgfQorCisgIC8qKgorICAgKiBcYnJpZWYgQ29tcHV0ZXMgY2hvcmQgbGVuZ3RoIHBhcmFtZXRlcnMgd2hpY2ggYXJlIHJlcXVpcmVkIGZvciBzcGxpbmUgaW50ZXJwb2xhdGlvbi4KKyAgICogXGluZ3JvdXAgU3BsaW5lc19Nb2R1bGUKKyAgICoKKyAgICogXHBhcmFtW2luXSBwdHMgVGhlIGRhdGEgcG9pbnRzIHRvIHdoaWNoIGEgc3BsaW5lIHNob3VsZCBiZSBmaXQuCisgICAqIFxwYXJhbVtvdXRdIGNob3JkX2xlbmd0aHMgVGhlIHJlc3VsdGluZyBjaG9yZCBsZW5nZ3RoIHZlY3Rvci4KKyAgICoKKyAgICogXHNhIExlcyBQaWVnbCBhbmQgV2F5bmUgVGlsbGVyLCBUaGUgTlVSQlMgYm9vayAoMm5kIGVkLiksIDE5OTcsIDkuMi4xIEdsb2JhbCBDdXJ2ZSBJbnRlcnBvbGF0aW9uIHRvIFBvaW50IERhdGEKKyAgICoqLyAgIAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRBcnJheVR5cGUsIHR5cGVuYW1lIEtub3RWZWN0b3JUeXBlPgorICB2b2lkIENob3JkTGVuZ3Rocyhjb25zdCBQb2ludEFycmF5VHlwZSYgcHRzLCBLbm90VmVjdG9yVHlwZSYgY2hvcmRfbGVuZ3RocykKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgS25vdFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CisKKyAgICBjb25zdCBEZW5zZUluZGV4IG4gPSBwdHMuY29scygpOworCisgICAgLy8gMS4gY29tcHV0ZSB0aGUgY29sdW1uLXdpc2Ugbm9ybXMKKyAgICBjaG9yZF9sZW5ndGhzLnJlc2l6ZShwdHMuY29scygpKTsKKyAgICBjaG9yZF9sZW5ndGhzWzBdID0gMDsKKyAgICBjaG9yZF9sZW5ndGhzLnJpZ2h0Q29scyhuLTEpID0gKHB0cy5hcnJheSgpLmxlZnRDb2xzKG4tMSkgLSBwdHMuYXJyYXkoKS5yaWdodENvbHMobi0xKSkubWF0cml4KCkuY29sd2lzZSgpLm5vcm0oKTsKKworICAgIC8vIDIuIGNvbXB1dGUgdGhlIHBhcnRpYWwgc3VtcworICAgIHN0ZDo6cGFydGlhbF9zdW0oY2hvcmRfbGVuZ3Rocy5kYXRhKCksIGNob3JkX2xlbmd0aHMuZGF0YSgpK24sIGNob3JkX2xlbmd0aHMuZGF0YSgpKTsKKworICAgIC8vIDMuIG5vcm1hbGl6ZSB0aGUgZGF0YQorICAgIGNob3JkX2xlbmd0aHMgLz0gY2hvcmRfbGVuZ3RocyhuLTEpOworICAgIGNob3JkX2xlbmd0aHMobi0xKSA9IFNjYWxhcigxKTsKKyAgfQorCisgIC8qKgorICAgKiBcYnJpZWYgU3BsaW5lIGZpdHRpbmcgbWV0aG9kcy4KKyAgICogXGluZ3JvdXAgU3BsaW5lc19Nb2R1bGUKKyAgICoqLyAgICAgCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcGxpbmVUeXBlPgorICBzdHJ1Y3QgU3BsaW5lRml0dGluZworICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTcGxpbmVUeXBlOjpLbm90VmVjdG9yVHlwZSBLbm90VmVjdG9yVHlwZTsKKworICAgIC8qKgorICAgICAqIFxicmllZiBGaXRzIGFuIGludGVycG9sYXRpbmcgU3BsaW5lIHRvIHRoZSBnaXZlbiBkYXRhIHBvaW50cy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwdHMgVGhlIHBvaW50cyBmb3Igd2hpY2ggYW4gaW50ZXJwb2xhdGluZyBzcGxpbmUgd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgKiBccGFyYW0gZGVncmVlIFRoZSBkZWdyZWUgb2YgdGhlIGludGVycG9sYXRpbmcgc3BsaW5lLgorICAgICAqCisgICAgICogXHJldHVybnMgQSBzcGxpbmUgaW50ZXJwb2xhdGluZyB0aGUgaW5pdGlhbGx5IHByb3ZpZGVkIHBvaW50cy4KKyAgICAgKiovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50QXJyYXlUeXBlPgorICAgIHN0YXRpYyBTcGxpbmVUeXBlIEludGVycG9sYXRlKGNvbnN0IFBvaW50QXJyYXlUeXBlJiBwdHMsIERlbnNlSW5kZXggZGVncmVlKTsKKworICAgIC8qKgorICAgICAqIFxicmllZiBGaXRzIGFuIGludGVycG9sYXRpbmcgU3BsaW5lIHRvIHRoZSBnaXZlbiBkYXRhIHBvaW50cy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwdHMgVGhlIHBvaW50cyBmb3Igd2hpY2ggYW4gaW50ZXJwb2xhdGluZyBzcGxpbmUgd2lsbCBiZSBjb21wdXRlZC4KKyAgICAgKiBccGFyYW0gZGVncmVlIFRoZSBkZWdyZWUgb2YgdGhlIGludGVycG9sYXRpbmcgc3BsaW5lLgorICAgICAqIFxwYXJhbSBrbm90X3BhcmFtZXRlcnMgVGhlIGtub3QgcGFyYW1ldGVycyBmb3IgdGhlIGludGVycG9sYXRpb24uCisgICAgICoKKyAgICAgKiBccmV0dXJucyBBIHNwbGluZSBpbnRlcnBvbGF0aW5nIHRoZSBpbml0aWFsbHkgcHJvdmlkZWQgcG9pbnRzLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRBcnJheVR5cGU+CisgICAgc3RhdGljIFNwbGluZVR5cGUgSW50ZXJwb2xhdGUoY29uc3QgUG9pbnRBcnJheVR5cGUmIHB0cywgRGVuc2VJbmRleCBkZWdyZWUsIGNvbnN0IEtub3RWZWN0b3JUeXBlJiBrbm90X3BhcmFtZXRlcnMpOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcGxpbmVUeXBlPgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRBcnJheVR5cGU+CisgIFNwbGluZVR5cGUgU3BsaW5lRml0dGluZzxTcGxpbmVUeXBlPjo6SW50ZXJwb2xhdGUoY29uc3QgUG9pbnRBcnJheVR5cGUmIHB0cywgRGVuc2VJbmRleCBkZWdyZWUsIGNvbnN0IEtub3RWZWN0b3JUeXBlJiBrbm90X3BhcmFtZXRlcnMpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVR5cGU6Oktub3RWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOyAgICAgIAorICAgIHR5cGVkZWYgdHlwZW5hbWUgU3BsaW5lVHlwZTo6QmFzaXNWZWN0b3JUeXBlIEJhc2lzVmVjdG9yVHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFNwbGluZVR5cGU6OkNvbnRyb2xQb2ludFZlY3RvclR5cGUgQ29udHJvbFBvaW50VmVjdG9yVHlwZTsgICAgICAKKworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdHJpeFR5cGU7CisKKyAgICBLbm90VmVjdG9yVHlwZSBrbm90czsKKyAgICBLbm90QXZlcmFnaW5nKGtub3RfcGFyYW1ldGVycywgZGVncmVlLCBrbm90cyk7CisKKyAgICBEZW5zZUluZGV4IG4gPSBwdHMuY29scygpOworICAgIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6Olplcm8obixuKTsKKyAgICBmb3IgKERlbnNlSW5kZXggaT0xOyBpPG4tMTsgKytpKQorICAgIHsKKyAgICAgIGNvbnN0IERlbnNlSW5kZXggc3BhbiA9IFNwbGluZVR5cGU6OlNwYW4oa25vdF9wYXJhbWV0ZXJzW2ldLCBkZWdyZWUsIGtub3RzKTsKKworICAgICAgLy8gVGhlIHNlZ21lbnQgY2FsbCBzaG91bGQgc29tZWhvdyBiZSB0b2xkIHRoZSBzcGxpbmUgb3JkZXIgYXQgY29tcGlsZSB0aW1lLgorICAgICAgQS5yb3coaSkuc2VnbWVudChzcGFuLWRlZ3JlZSwgZGVncmVlKzEpID0gU3BsaW5lVHlwZTo6QmFzaXNGdW5jdGlvbnMoa25vdF9wYXJhbWV0ZXJzW2ldLCBkZWdyZWUsIGtub3RzKTsKKyAgICB9CisgICAgQSgwLDApID0gMS4wOworICAgIEEobi0xLG4tMSkgPSAxLjA7CisKKyAgICBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyKEEpOworCisgICAgLy8gSGVyZSwgd2UgYXJlIGNyZWF0aW5nIGEgdGVtcG9yYXJ5IGR1ZSB0byBhbiBFaWdlbiBpc3N1ZS4KKyAgICBDb250cm9sUG9pbnRWZWN0b3JUeXBlIGN0cmxzID0gcXIuc29sdmUoTWF0cml4VHlwZShwdHMudHJhbnNwb3NlKCkpKS50cmFuc3Bvc2UoKTsKKworICAgIHJldHVybiBTcGxpbmVUeXBlKGtub3RzLCBjdHJscyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BsaW5lVHlwZT4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50QXJyYXlUeXBlPgorICBTcGxpbmVUeXBlIFNwbGluZUZpdHRpbmc8U3BsaW5lVHlwZT46OkludGVycG9sYXRlKGNvbnN0IFBvaW50QXJyYXlUeXBlJiBwdHMsIERlbnNlSW5kZXggZGVncmVlKQorICB7CisgICAgS25vdFZlY3RvclR5cGUgY2hvcmRfbGVuZ3RoczsgLy8ga25vdCBwYXJhbWV0ZXJzCisgICAgQ2hvcmRMZW5ndGhzKHB0cywgY2hvcmRfbGVuZ3Rocyk7CisgICAgcmV0dXJuIEludGVycG9sYXRlKHB0cywgZGVncmVlLCBjaG9yZF9sZW5ndGhzKTsKKyAgfQorfQorCisjZW5kaWYgLy8gRUlHRU5fU1BMSU5FX0ZJVFRJTkdfSApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwbGluZXMvU3BsaW5lRndkLmggYi91bnN1cHBvcnRlZC9FaWdlbi9zcmMvU3BsaW5lcy9TcGxpbmVGd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWRiOGQzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvRWlnZW4vc3JjL1NwbGluZXMvU3BsaW5lRndkLmgKQEAgLTAsMCArMSw4NiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEwLTIwMTEgSGF1a2UgSGVpYmVsIDxoYXVrZS5oZWliZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2lmbmRlZiBFSUdFTl9TUExJTkVTX0ZXRF9ICisjZGVmaW5lIEVJR0VOX1NQTElORVNfRldEX0gKKworI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CisKK25hbWVzcGFjZSBFaWdlbgoreworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBEZWdyZWUgPSBEeW5hbWljPiBjbGFzcyBTcGxpbmU7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFNwbGluZVR5cGUsIGludCBEZXJpdmF0aXZlT3JkZXIgPSBEeW5hbWljID4gc3RydWN0IFNwbGluZVRyYWl0cyB7fTsKKworICAgIC8qKgorICAgICAqIFxpbmdyb3VwIFNwbGluZXNfTW9kdWxlCisgICAgICogXGJyaWVmIENvbXBpbGUtdGltZSBhdHRyaWJ1dGVzIG9mIHRoZSBTcGxpbmUgY2xhc3MgZm9yIER5bmFtaWMgZGVncmVlLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIGludCBfRGVncmVlPgorICAgIHN0cnVjdCBTcGxpbmVUcmFpdHM8IFNwbGluZTxfU2NhbGFyLCBfRGltLCBfRGVncmVlPiwgRHluYW1pYyA+CisgICAgeworICAgICAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsgLyohPCBUaGUgc3BsaW5lIGN1cnZlJ3Mgc2NhbGFyIHR5cGUuICovCisgICAgICBlbnVtIHsgRGltZW5zaW9uID0gX0RpbSAvKiE8IFRoZSBzcGxpbmUgY3VydmUncyBkaW1lbnNpb24uICovIH07CisgICAgICBlbnVtIHsgRGVncmVlID0gX0RlZ3JlZSAvKiE8IFRoZSBzcGxpbmUgY3VydmUncyBkZWdyZWUuICovIH07CisKKyAgICAgIGVudW0geyBPcmRlckF0Q29tcGlsZVRpbWUgPSBfRGVncmVlPT1EeW5hbWljID8gRHluYW1pYyA6IF9EZWdyZWUrMSAvKiE8IFRoZSBzcGxpbmUgY3VydmUncyBvcmRlciBhdCBjb21waWxlLXRpbWUuICovIH07CisgICAgICBlbnVtIHsgTnVtT2ZEZXJpdmF0aXZlc0F0Q29tcGlsZVRpbWUgPSBPcmRlckF0Q29tcGlsZVRpbWUgLyohPCBUaGUgbnVtYmVyIG9mIGRlcml2YXRpdmVzIGRlZmluZWQgZm9yIHRoZSBjdXJyZW50IHNwbGluZS4gKi8gfTsKKworICAgICAgLyoqIFxicmllZiBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgbm9uLXplcm8gYmFzaXMgZnVuY3Rpb25zLiAqLworICAgICAgdHlwZWRlZiBBcnJheTxTY2FsYXIsMSxPcmRlckF0Q29tcGlsZVRpbWU+IEJhc2lzVmVjdG9yVHlwZTsKKworICAgICAgLyoqIFxicmllZiBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUgdGhlIHZhbHVlcyBvZiB0aGUgYmFzaXMgZnVuY3Rpb24gZGVyaXZhdGl2ZXMuICovCisgICAgICB0eXBlZGVmIEFycmF5PFNjYWxhcixEeW5hbWljLER5bmFtaWMsUm93TWFqb3IsTnVtT2ZEZXJpdmF0aXZlc0F0Q29tcGlsZVRpbWUsT3JkZXJBdENvbXBpbGVUaW1lPiBCYXNpc0Rlcml2YXRpdmVUeXBlOworICAgICAgCisgICAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSB0aGUgc3BsaW5lJ3MgZGVyaXZhdGl2ZSB2YWx1ZXMuICovCisgICAgICB0eXBlZGVmIEFycmF5PFNjYWxhcixEaW1lbnNpb24sRHluYW1pYyxDb2xNYWpvcixEaW1lbnNpb24sTnVtT2ZEZXJpdmF0aXZlc0F0Q29tcGlsZVRpbWU+IERlcml2YXRpdmVUeXBlOworCisgICAgICAvKiogXGJyaWVmIFRoZSBwb2ludCB0eXBlIHRoZSBzcGxpbmUgaXMgcmVwcmVzZW50aW5nLiAqLworICAgICAgdHlwZWRlZiBBcnJheTxTY2FsYXIsRGltZW5zaW9uLDE+IFBvaW50VHlwZTsKKyAgICAgIAorICAgICAgLyoqIFxicmllZiBUaGUgZGF0YSB0eXBlIHVzZWQgdG8gc3RvcmUga25vdCB2ZWN0b3JzLiAqLworICAgICAgdHlwZWRlZiBBcnJheTxTY2FsYXIsMSxEeW5hbWljPiBLbm90VmVjdG9yVHlwZTsKKyAgICAgIAorICAgICAgLyoqIFxicmllZiBUaGUgZGF0YSB0eXBlIHJlcHJlc2VudGluZyB0aGUgc3BsaW5lJ3MgY29udHJvbCBwb2ludHMuICovCisgICAgICB0eXBlZGVmIEFycmF5PFNjYWxhcixEaW1lbnNpb24sRHluYW1pYz4gQ29udHJvbFBvaW50VmVjdG9yVHlwZTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogXGluZ3JvdXAgU3BsaW5lc19Nb2R1bGUKKyAgICAgKiBcYnJpZWYgQ29tcGlsZS10aW1lIGF0dHJpYnV0ZXMgb2YgdGhlIFNwbGluZSBjbGFzcyBmb3IgZml4ZWQgZGVncmVlLgorICAgICAqCisgICAgICogVGhlIHRyYWl0cyBjbGFzcyBpbmhlcml0cyBhbGwgYXR0cmlidXRlcyBmcm9tIHRoZSBTcGxpbmVUcmFpdHMgb2YgRHluYW1pYyBkZWdyZWUuCisgICAgICoqLworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgX1NjYWxhciwgaW50IF9EaW0sIGludCBfRGVncmVlLCBpbnQgX0Rlcml2YXRpdmVPcmRlciA+CisgICAgc3RydWN0IFNwbGluZVRyYWl0czwgU3BsaW5lPF9TY2FsYXIsIF9EaW0sIF9EZWdyZWU+LCBfRGVyaXZhdGl2ZU9yZGVyID4gOiBwdWJsaWMgU3BsaW5lVHJhaXRzPCBTcGxpbmU8X1NjYWxhciwgX0RpbSwgX0RlZ3JlZT4gPgorICAgIHsKKyAgICAgIGVudW0geyBPcmRlckF0Q29tcGlsZVRpbWUgPSBfRGVncmVlPT1EeW5hbWljID8gRHluYW1pYyA6IF9EZWdyZWUrMSAvKiE8IFRoZSBzcGxpbmUgY3VydmUncyBvcmRlciBhdCBjb21waWxlLXRpbWUuICovIH07CisgICAgICBlbnVtIHsgTnVtT2ZEZXJpdmF0aXZlc0F0Q29tcGlsZVRpbWUgPSBfRGVyaXZhdGl2ZU9yZGVyPT1EeW5hbWljID8gRHluYW1pYyA6IF9EZXJpdmF0aXZlT3JkZXIrMSAvKiE8IFRoZSBudW1iZXIgb2YgZGVyaXZhdGl2ZXMgZGVmaW5lZCBmb3IgdGhlIGN1cnJlbnQgc3BsaW5lLiAqLyB9OworCisgICAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSB0aGUgdmFsdWVzIG9mIHRoZSBiYXNpcyBmdW5jdGlvbiBkZXJpdmF0aXZlcy4gKi8KKyAgICAgIHR5cGVkZWYgQXJyYXk8X1NjYWxhcixEeW5hbWljLER5bmFtaWMsUm93TWFqb3IsTnVtT2ZEZXJpdmF0aXZlc0F0Q29tcGlsZVRpbWUsT3JkZXJBdENvbXBpbGVUaW1lPiBCYXNpc0Rlcml2YXRpdmVUeXBlOworICAgICAgCisgICAgICAvKiogXGJyaWVmIFRoZSBkYXRhIHR5cGUgdXNlZCB0byBzdG9yZSB0aGUgc3BsaW5lJ3MgZGVyaXZhdGl2ZSB2YWx1ZXMuICovICAgICAgCisgICAgICB0eXBlZGVmIEFycmF5PF9TY2FsYXIsX0RpbSxEeW5hbWljLENvbE1ham9yLF9EaW0sTnVtT2ZEZXJpdmF0aXZlc0F0Q29tcGlsZVRpbWU+IERlcml2YXRpdmVUeXBlOworICAgIH07CisKKyAgICAvKiogXGJyaWVmIDJEIGZsb2F0IEItc3BsaW5lIHdpdGggZHluYW1pYyBkZWdyZWUuICovCisgICAgdHlwZWRlZiBTcGxpbmU8ZmxvYXQsMj4gU3BsaW5lMmY7CisgICAgCisgICAgLyoqIFxicmllZiAzRCBmbG9hdCBCLXNwbGluZSB3aXRoIGR5bmFtaWMgZGVncmVlLiAqLworICAgIHR5cGVkZWYgU3BsaW5lPGZsb2F0LDM+IFNwbGluZTNmOworCisgICAgLyoqIFxicmllZiAyRCBkb3VibGUgQi1zcGxpbmUgd2l0aCBkeW5hbWljIGRlZ3JlZS4gKi8KKyAgICB0eXBlZGVmIFNwbGluZTxkb3VibGUsMj4gU3BsaW5lMmQ7CisgICAgCisgICAgLyoqIFxicmllZiAzRCBkb3VibGUgQi1zcGxpbmUgd2l0aCBkeW5hbWljIGRlZ3JlZS4gKi8KKyAgICB0eXBlZGVmIFNwbGluZTxkb3VibGUsMz4gU3BsaW5lM2Q7Cit9CisKKyNlbmRpZiAvLyBFSUdFTl9TUExJTkVTX0ZXRF9ICmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9SRUFETUUudHh0IGIvdW5zdXBwb3J0ZWQvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ3OWZmCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDUwIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBjb250cmlidXRpb25zIGZyb20gdmFyaW91cyB1c2Vycy4KK1RoZXkgYXJlIHByb3ZpZGVkICJhcyBpcyIsIHdpdGhvdXQgYW55IHN1cHBvcnQuIE5ldmVydGhlbGVzcywKK21vc3Qgb2YgdGhlbSBhcmUgc3ViamVjdCB0byBiZSBpbmNsdWRlZCBpbiBFaWdlbiBpbiB0aGUgZnV0dXJlLgorCitJbiBvcmRlciB0byB1c2UgYW4gdW5zdXBwb3J0ZWQgbW9kdWxlIHlvdSBoYXZlIHRvIGRvIGVpdGhlcjoKKworIC0gYWRkIHRoZSBwYXRoX3RvX2VpZ2VuL3Vuc3VwcG9ydGVkIGRpcmVjdG9yeSB0byB5b3VyIGluY2x1ZGUgcGF0aCBhbmQgZG86CisgICAjaW5jbHVkZSA8RWlnZW4vTW9kdWxlSGVhZGVyPgorCisgLSBvciBkaXJlY3RseSBkbzoKKyAgICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9Nb2R1bGVIZWFkZXI+CisKKworSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGNvbnRyaWJ1dGluZyB0byBvbmUgb2YgdGhlbSwgb3IgaGF2ZSBvdGhlciBzdHVmZgoreW91IHdvdWxkIGxpa2UgdG8gc2hhcmUsIGZlZWwgZnJlZSB0byBjb250YWN0IHVzOgoraHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvaW5kZXgucGhwP3RpdGxlPU1haW5fUGFnZSNNYWlsaW5nX2xpc3QKKworQW55IGtpbmQgb2YgY29udHJpYnV0aW9ucyBhcmUgbXVjaCBhcHByZWNpYXRlZCwgZXZlbiB2ZXJ5IHByZWxpbWluYXJ5IG9uZXMuCitIb3dldmVyLCBpdDoKKyAtIG11c3QgcmVseSBvbiBFaWdlbiwKKyAtIG11c3QgYmUgaGlnaGx5IHJlbGF0ZWQgdG8gbWF0aCwKKyAtIHNob3VsZCBoYXZlIHNvbWUgZ2VuZXJhbCBwdXJwb3NlIGluIHRoZSBzZW5zZSB0aGF0IGl0IGNvdWxkCisgICBwb3RlbnRpYWxseSBiZWNvbWUgYW4gb2ZmaWNhbCBFaWdlbiBtb2R1bGUgKG9yIGJlIG1lcmdlZCBpbnRvIGFub3RoZXIgb25lKS4KKworSW4gZG91YnQgZmVlbCBmcmVlIHRvIGNvbnRhY3QgdXMuIEZvciBpbnN0YW5jZSwgaWYgeW91ciBhZGRvbnMgaXMgdmVyeSB0b28gc3BlY2lmaWMKK2J1dCBpdCBzaG93cyBhbiBpbnRlcmVzdGluZyB3YXkgb2YgdXNpbmcgRWlnZW4sIHRoZW4gaXQgY291bGQgYmUgYSBuaWNlIGRlbW8uCisKKworVGhpcyBkaXJlY3RvcnkgaXMgb3JnYW5pemVkIGFzIGZvbGxvdzoKKwordW5zdXBwb3J0ZWQvRWlnZW4vTW9kdWxlSGVhZGVyMQordW5zdXBwb3J0ZWQvRWlnZW4vTW9kdWxlSGVhZGVyMgordW5zdXBwb3J0ZWQvRWlnZW4vLi4uCit1bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9kdWxlMS9Tb3VyY2VGaWxlMS5oCit1bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9kdWxlMS9Tb3VyY2VGaWxlMi5oCit1bnN1cHBvcnRlZC9FaWdlbi9zcmMvTW9kdWxlMS8uLi4KK3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Nb2R1bGUyL1NvdXJjZUZpbGUxLmgKK3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Nb2R1bGUyL1NvdXJjZUZpbGUyLmgKK3Vuc3VwcG9ydGVkL0VpZ2VuL3NyYy9Nb2R1bGUyLy4uLgordW5zdXBwb3J0ZWQvRWlnZW4vc3JjLy4uLgordW5zdXBwb3J0ZWQvZG9jL3NuaXBwZXRzLy5jcHAgICA8LSBjb2RlIHNuaXBwZXRzIGZvciB0aGUgZG9jCit1bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvLmNwcCAgIDwtIGV4YW1wbGVzIGZvciB0aGUgZG9jCit1bnN1cHBvcnRlZC9kb2MvVHV0b3JpYWxNb2R1bGUxLmRveAordW5zdXBwb3J0ZWQvZG9jL1R1dG9yaWFsTW9kdWxlMi5kb3gKK3Vuc3VwcG9ydGVkL2RvYy8uLi4KK3Vuc3VwcG9ydGVkL3Rlc3QvLmNwcCAgICAgICAgICAgPC0gdW5pdCB0ZXN0IGZpbGVzCisKK1RoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRoYW4gdGhlIG1haW4gRWlnZW4gZG9jdW1lbnRhdGlvbi4KK1RoZSAuaHRtbCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGluOiBidWlsZF9kaXIvZG9jL2h0bWwvdW5zdXBwb3J0ZWQvCisKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9DTWFrZUxpc3RzLnR4dCBiL3Vuc3VwcG9ydGVkL2RvYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTlhYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNCBAQAorc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMgRVhDTFVERV9GUk9NX0FMTCBUUlVFKQorCithZGRfc3ViZGlyZWN0b3J5KGV4YW1wbGVzKQorYWRkX3N1YmRpcmVjdG9yeShzbmlwcGV0cykKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9Eb3h5ZmlsZS5pbiBiL3Vuc3VwcG9ydGVkL2RvYy9Eb3h5ZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmFjZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL0RveHlmaWxlLmluCkBAIC0wLDAgKzEsMTQ2MCBAQAorIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QKKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkCisjIFRoZSBmb3JtYXQgaXM6CisjICAgICAgIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6CisjICAgICAgIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoIiAiKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsCisjIHRleHQgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZQorIyBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZQorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkCisjIGJ5IHF1b3RlcykgdGhhdCBzaG91bGQgaWRlbnRpZnkgdGhlIHByb2plY3QuCisKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSBFaWdlbiAtIHVuc3VwcG9ydGVkIG1vZHVsZXMKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IKKyMgaWYgc29tZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKKyNFSUdFTl9WRVJTSU9OIGlzIHNldCBpbiB0aGUgcm9vdCBDTWFrZUxpc3RzLnR4dAorUFJPSkVDVF9OVU1CRVIgICAgICAgICA9ICIke0VJR0VOX1ZFUlNJT059IgorCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkKKyMgYmFzZSBwYXRoIHdoZXJlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9ICIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy91bnN1cHBvcnRlZCIKKworIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZQorIyA0MDk2IHN1Yi1kaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0CisjIGZvcm1hdCBhbmQgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4KKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mCisjIHNvdXJjZSBmaWxlcywgd2hlcmUgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZAorIyBvdGhlcndpc2UgY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKworQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZToKKyMgQWZyaWthYW5zLCBBcmFiaWMsIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwgQ2hpbmVzZS1UcmFkaXRpb25hbCwKKyMgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBGYXJzaSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLAorIyBIdW5nYXJpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKKyMgS29yZWFuLCBLb3JlYW4tZW4sIExpdGh1YW5pYW4sIE5vcndlZ2lhbiwgTWFjZWRvbmlhbiwgUGVyc2lhbiwgUG9saXNoLAorIyBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLAorIyBhbmQgVWtyYWluaWFuLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBpbmNsdWRlIGJyaWVmIG1lbWJlciBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluCisjIHRoZSBmaWxlIGFuZCBjbGFzcyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFEb2MpLgorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCBwcmVwZW5kCisjIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLgorIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvcgorIyB0aGF0IGlzIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZworIyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlCisjIHN0cmlwcGVkIGZyb20gdGhlIHRleHQgYW5kIHRoZSByZXN1bHQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMKKyMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuCisjIElmIGxlZnQgYmxhbmssIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgiJG5hbWUiIGlzIGF1dG9tYXRpY2FsbHkKKyMgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZW50aXR5KTogIlRoZSAkbmFtZSBjbGFzcyIgIlRoZSAkbmFtZSB3aWRnZXQiCisjICJUaGUgJG5hbWUgZmlsZSIgImlzIiAicHJvdmlkZXMiICJzcGVjaWZpZXMiICJjb250YWlucyIKKyMgInJlcHJlc2VudHMiICJhIiAiYW4iICJ0aGUiCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisKK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTworCisjIElmIHRoZSBJTkxJTkVfSU5IRVJJVEVEX01FTUIgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBzaG93IGFsbAorIyBpbmhlcml0ZWQgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UKKyMgbWVtYmVycyB3ZXJlIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQKKyMgb3BlcmF0b3JzIG9mIHRoZSBiYXNlIGNsYXNzZXMgd2lsbCBub3QgYmUgc2hvd24uCisKK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBOTworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbAorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldAorIyB0byBOTyB0aGUgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZC4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBTVFJJUF9GUk9NX1BBVEggdGFnCisjIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguIFN0cmlwcGluZyBpcworIyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQgcGFydCBvZgorIyB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlCisjIHBhdGggdG8gc3RyaXAuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQorCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mCisjIHRoZSBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscworIyB0aGUgcmVhZGVyIHdoaWNoIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuCisjIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MKKyMgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZCBzcGVjaWZ5IHRoZSBpbmNsdWRlIHBhdGhzIHRoYXQKKyMgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPQorCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlcgorIyAoYnV0IGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpcyB5b3VyIGZpbGUgc3lzdGVtcworIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4KKyMgd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YURvYy1zdHlsZQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YURvYworIyBjb21tZW50cyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cworIyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQorCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gTk8KKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsCisjIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgY29tbWVudHMKKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nCisjIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgRG94eWdlbgorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8KKyMgY29tbWVudHMpIGFzIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCisjIFRoZSBuZXcgZGVmYXVsdCBpcyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZAorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBERVRBSUxTX0FUX1RPUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4KKyMgd2lsbCBvdXRwdXQgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG5lYXIgdGhlIHRvcCwgbGlrZSBKYXZhRG9jLgorIyBJZiBzZXQgdG8gTk8sIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBhcHBlYXJzIGFmdGVyIHRoZSBtZW1iZXIKKyMgZG9jdW1lbnRhdGlvbi4KKworREVUQUlMU19BVF9UT1AgICAgICAgICA9IFlFUworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGFuIHVuZG9jdW1lbnRlZAorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdAorIyByZS1pbXBsZW1lbnRzLgorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZQorIyBhIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLgorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMKKyMgYXMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoCisjIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcgIlNpZGUgRWZmZWN0czoiLgorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9ICJvbmx5X2Zvcl92ZWN0b3JzPVRoaXMgaXMgb25seSBmb3IgdmVjdG9ycyAoZWl0aGVyIHJvdy12ZWN0b3JzIG9yIGNvbHVtbi12ZWN0b3JzKSwgaS5lLiBtYXRyaWNlcyB3aGljaCBhcmUga25vd24gYXQgY29tcGlsZS10aW1lIHRvIGhhdmUgZWl0aGVyIG9uZSByb3cgb3Igb25lIGNvbHVtbi4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXlfbW9kdWxlPVRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgJUFycmF5IG1vZHVsZS4gXGNvZGUgI2luY2x1ZGUgPEVpZ2VuL0FycmF5PiBcZW5kY29kZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJsdV9tb2R1bGU9VGhpcyBpcyBkZWZpbmVkIGluIHRoZSAlTFUgbW9kdWxlLiBcY29kZSAjaW5jbHVkZSA8RWlnZW4vTFU+IFxlbmRjb2RlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImNob2xlc2t5X21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVDaG9sZXNreSBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9DaG9sZXNreT4gXGVuZGNvZGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicXJfbW9kdWxlPVRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgJVFSIG1vZHVsZS4gXGNvZGUgI2luY2x1ZGUgPEVpZ2VuL1FSPiBcZW5kY29kZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdmRfbW9kdWxlPVRoaXMgaXMgZGVmaW5lZCBpbiB0aGUgJVNWRCBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9TVkQ+IFxlbmRjb2RlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgImdlb21ldHJ5X21vZHVsZT1UaGlzIGlzIGRlZmluZWQgaW4gdGhlICVHZW9tZXRyeSBtb2R1bGUuIFxjb2RlICNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4gXGVuZGNvZGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibGFiZWw9XGJ1ZyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJub25zdGFibGV5ZXQ9XHdhcm5pbmcgVGhpcyBpcyBub3QgY29uc2lkZXJlZCB0byBiZSBwYXJ0IG9mIHRoZSBzdGFibGUgcHVibGljIEFQSSB5ZXQuIENoYW5nZXMgbWF5IGhhcHBlbiBpbiBmdXR1cmUgcmVsZWFzZXMuIFNlZSBccmVmIEV4cGVyaW1lbnRhbCBcIkV4cGVyaW1lbnRhbCBwYXJ0cyBvZiBFaWdlblwiIgorCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMKKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLgorIyBGb3IgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0CisjIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEKKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcgorIyBKYXZhLiBGb3IgaW5zdGFuY2UsIG5hbWVzcGFjZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGFja2FnZXMsIHF1YWxpZmllZAorIyBzY29wZXMgd2lsbCBsb29rIGRpZmZlcmVudCwgZXRjLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcgorIyBGb3J0cmFuLgorCitPUFRJTUlaRV9GT1JfRk9SVFJBTiAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9WSERMIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIFZIREwKKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yCisjIFZIREwuCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkCisjIHNldCB0aGlzIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7IHYucy4KKyMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8KKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCBzb3VyY2VzIG9ubHkuCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYworIyBpbnN0ZWFkIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlIGdldHRlcgorIyBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTICh0aGUgZGVmYXVsdCkKKyMgd2lsbCBtYWtlIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvcgorIyBzZXR0aW5nIGEgc2ltcGxlIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZQorIyBtZXRob2RzIGFueXdheSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YKKyMgdGhlIHNhbWUgdHlwZSAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEKKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8KKyMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcKKyMgdGhlIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yIGVudW0KKyMgaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkKKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbgorIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4KKyMgUHJpdmF0ZSBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcworIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpCisjIGRlZmluZWQgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBOTworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gV2hlbiBzZXQgdG8gWUVTIGxvY2FsCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4KKyMgdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UKKyMgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0CisjIGFub255bW91cyBuYW1lc3BhY2UgYXJlIGhpZGRlbi4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIG9mIGRvY3VtZW50ZWQgY2xhc3NlcywgZmlsZXMgb3IgbmFtZXNwYWNlcy4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuCisjIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzCisjIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIGZyaWVuZCAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQorIyBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24KKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldAorIyB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBleGNsdWRlZC4KKyMgU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUKKyMgZmlsZSBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlIHNjb3BlIHdpbGwgYmUgaGlkZGVuLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIHB1dCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyBvZiB0aGF0IGZpbGUuCisKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGEgdGFnIFtpbmxpbmVdCisjIGlzIGluc2VydGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KKworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuCisjIHdpbGwgc29ydCB0aGUgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMKKyMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbgorIyBkZWNsYXJhdGlvbiBvcmRlci4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgYnJpZWYgZG9jdW1lbnRhdGlvbiBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkKKyMgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluCisjIGRlY2xhcmF0aW9uIG9yZGVyLgorCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgaGllcmFyY2h5IG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorIyB0aGUgZ3JvdXAgbmFtZXMgd2lsbCBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZQorIyBzb3J0ZWQgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvCisjIE5PICh0aGUgZGVmYXVsdCksIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwKKyMgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZQorIyBhbHBoYWJldGljYWwgbGlzdC4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0CisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gTk8KKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgYnVnIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZworIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcKKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBOTworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwKKyMgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiBzZWN0aW9ubmFtZSAuLi4gXGVuZGlmLgorCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0KKworIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcworIyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIGRlZmluZSBjb25zaXN0cyBvZiBmb3IgaXQgdG8gYXBwZWFyIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZAorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuCisjIFRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbml0aWFsaXplciBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgZGVmaW5lcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIKKyMgY29tbWFuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKworTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQKKyMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgc291cmNlcyBpbiB5b3VyIHByb2plY3QgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgbXVsdGlwbGUgZGlyZWN0b3JpZXMKKyMgdGhlbiBzZXR0aW5nIHRoZSBTSE9XX0RJUkVDVE9SSUVTIHRhZyB0byBZRVMgd2lsbCBzaG93IHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5CisjIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyBOTy4KKworU0hPV19ESVJFQ1RPUklFUyAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLgorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlCisjIE5hbWVzcGFjZXMgcGFnZS4gIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXgKKyMgYW5kIGZyb20gdGhlIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IE5PCisKKyMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0CisjIGRveHlnZW4gc2hvdWxkIGludm9rZSB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZWFjaCBmaWxlICh0eXBpY2FsbHkgZnJvbQorIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWEKKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGNvbW1hbmQ+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGNvbW1hbmQ+IGlzIHRoZSB2YWx1ZSBvZgorIyB0aGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZQorIyBwcm92aWRlZCBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0CisjIGlzIHVzZWQgYXMgdGhlIGZpbGUgdmVyc2lvbi4gU2VlIHRoZSBtYW51YWwgZm9yIGV4YW1wbGVzLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZAorIyBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rCisjIE5PIGlzIHVzZWQuCisKK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncworIyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcgd2lsbAorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gTk8KKworIyBJZiBXQVJOX0lGX0RPQ19FUlJPUiBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUKKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdAorIyBkb24ndCBleGlzdCBvciB1c2luZyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3IKKyMgZnVuY3Rpb25zIHRoYXQgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMKKyMgb3IgcmV0dXJuIHZhbHVlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0CisjIHdyb25nIG9yIGluY29tcGxldGUgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YKKyMgZG9jdW1lbnRhdGlvbi4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdAorIyBkb3h5Z2VuIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dAorIyB0YWdzLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIHdoaWNoIHRoZQorIyB3YXJuaW5nIG9yaWdpbmF0ZWQgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbgorIyAkdmVyc2lvbiwgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQKKyMgYmUgb2J0YWluZWQgdmlhIEZJTEVfVkVSU0lPTl9GSUxURVIpCisKK1dBUk5fRk9STUFUICAgICAgICAgICAgPSAiJGZpbGU6JGxpbmU6ICR0ZXh0IgorCisjIFRoZSBXQVJOX0xPR0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHRvIHdoaWNoIHdhcm5pbmcKKyMgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbgorIyB0byBzdGRlcnIuCisKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBJTlBVVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgIm15ZmlsZS5jcHAiIG9yCisjIGRpcmVjdG9yaWVzIGxpa2UgIi91c3Ivc3JjL215cHJvamVjdCIuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcworIyB3aXRoIHNwYWNlcy4KKworSU5QVVQgICAgICAgICAgICAgICAgICA9ICIke0VpZ2VuX1NPVVJDRV9ESVJ9L3Vuc3VwcG9ydGVkL0VpZ2VuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIiR7RWlnZW5fU09VUkNFX0RJUn0vdW5zdXBwb3J0ZWQvZG9jIgorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzCisjIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZywgd2hpY2ggaXMKKyMgYWxzbyB0aGUgZGVmYXVsdCBpbnB1dCBlbmNvZGluZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQKKyMgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvcgorIyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisKK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQKKyMgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOgorIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmphdmEgKi5paSAqLml4eCAqLmlwcCAqLmkrKyAqLmlubCAqLmggKi5oaCAqLmh4eAorIyAqLmhwcCAqLmgrKyAqLmlkbCAqLm9kbCAqLmNzICoucGhwICoucGhwMyAqLmluYyAqLm0gKi5tbSAqLnB5ICouZjkwCisKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqCisKKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzCisjIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLgorIyBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSAiJHtFaWdlbl9TT1VSQ0VfRElSfS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJHtFaWdlbl9TT1VSQ0VfRElSfS91bnN1cHBvcnRlZC9kb2Mvc25pcHBldHMiIAorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKworRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUKKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLiBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZAorIyBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8gZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcworIyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9QQVRURVJOUyAgICAgICA9IENNYWtlKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi50eHQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouc2ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouZGlmZiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5vcmlnIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqfgorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSBNYXRyaXhCYXNlPCogTWFwQmFzZTwqIFJvdGF0aW9uQmFzZTwqIE1hdHJpeDwqCisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlCisjIHRoZSBcaW5jbHVkZSBjb21tYW5kKS4KKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9ICIke0VpZ2VuX1NPVVJDRV9ESVJ9L2RvYy9zbmlwcGV0cyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9zbmlwcGV0cyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX1NPVVJDRV9ESVJ9L2RvYy9leGFtcGxlcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9leGFtcGxlcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX1NPVVJDRV9ESVJ9L3Vuc3VwcG9ydGVkL2RvYy9zbmlwcGV0cyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX0JJTkFSWV9ESVJ9L3Vuc3VwcG9ydGVkL2RvYy9zbmlwcGV0cyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX1NPVVJDRV9ESVJ9L3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICIke0VpZ2VuX0JJTkFSWV9ESVJ9L3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcyIKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAKKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdAorIyBibGFuayBhbGwgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gKgorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW1hZ2UgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0KKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPgorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4KKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzCisjIHRvIHN0YW5kYXJkIG91dHB1dC4gIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUKKyMgaWdub3JlZC4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9CisKKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybgorIyBiYXNpcy4gIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06CisjIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSwgSU5QVVRfRklMVEVSCisjIGlzIGFwcGxpZWQgdG8gYWxsIGZpbGVzLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0KKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlCisjIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwKKyMgYmUgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgYWxzbworIyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkKKyMgb2YgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIGluc3RydWN0CisjIGRveHlnZW4gdG8gaGlkZSBhbnkgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZQorIyBmcmFnbWVudHMuIE5vcm1hbCBDIGFuZCBDKysgY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuCisKK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUworIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQKKyMgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpCisjIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tCisjIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZCBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwKKyMgbGluayB0byB0aGUgc291cmNlIGNvZGUuICBPdGhlcndpc2UgdGhleSB3aWxsIGxpbmsgdG8gdGhlIGRvY3VtZW50c3Rpb24uCisKK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUKKyMgd2lsbCBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuCisjIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UKKyMgdGFnZ2luZyBzeXN0ZW0gKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91CisjIHdpbGwgbmVlZCB2ZXJzaW9uIDQuOC42IG9yIGhpZ2hlci4KKworVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvcgorIyB3aGljaCBhbiBpbmNsdWRlIGlzIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXgKKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QKKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBOTworCisjIElmIHRoZSBhbHBoYWJldGljYWwgaW5kZXggaXMgZW5hYmxlZCAoc2VlIEFMUEhBQkVUSUNBTF9JTkRFWCkgdGhlbgorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKKyMgaW4gd2hpY2ggdGhpcyBsaXN0IHdpbGwgYmUgc3BsaXQgKGNhbiBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEuLjIwXSkKKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsCisjIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguCisjIFRoZSBJR05PUkVfUFJFRklYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHByZWZpeGVzIHRoYXQKKyMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgSFRNTCBvdXRwdXQuCisKK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKKworIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgaHRtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2MvaHRtbC91bnN1cHBvcnRlZCIKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuaworIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgZmlsZXMgd2l0aCAuaHRtbCBleHRlbnNpb24uCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgaGVhZGVyIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgICA9ICIke0VpZ2VuX0JJTkFSWV9ESVJ9L2RvYy9laWdlbmRveHlfaGVhZGVyLmh0bWwiCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBmb290ZXIuCisKKyMgdGhlIGZvb3RlciBoYXMgbm90IGJlZW4gY3VzdG9taXplZCB5ZXQsIHNvIGxldCdzIHVzZSB0aGUgZGVmYXVsdCBvbmUKKyMgJHtFaWdlbl9CSU5BUllfRElSfS9kb2MvZWlnZW5kb3h5X2Zvb3Rlci5odG1sCitIVE1MX0ZPT1RFUiAgICAgICAgICAgICA9CisKKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcKKyMgc3R5bGUgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0bworIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4gTm90ZSB0aGF0IGRveHlnZW4gd2lsbCB0cnkgdG8gY29weQorIyB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCBzbyBkb24ndCBwdXQgeW91ciBvd24KKyMgc3R5bGVzaGVldCBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGFzIHdlbGwsIG9yIGl0IHdpbGwgYmUgZXJhc2VkIQorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgICA9ICIke0VpZ2VuX1NPVVJDRV9ESVJ9L2RvYy9laWdlbmRveHkuY3NzIgorCisjIElmIHRoZSBIVE1MX0FMSUdOX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGNsYXNzZXMsCisjIGZpbGVzIG9yIG5hbWVzcGFjZXMgd2lsbCBiZSBhbGlnbmVkIGluIEhUTUwgdXNpbmcgdGFibGVzLiBJZiBzZXQgdG8KKyMgTk8gYSBidWxsZXQgbGlzdCB3aWxsIGJlIHVzZWQuCisKK0hUTUxfQUxJR05fTUVNQkVSUyAgICAgPSBZRVMKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMKKyMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdG9vbHMgbGlrZSB0aGUKKyMgTWljcm9zb2Z0IEhUTUwgaGVscCB3b3Jrc2hvcCB0byBnZW5lcmF0ZSBhIGNvbXBpbGVkIEhUTUwgaGVscCBmaWxlICguY2htKQorIyBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcworIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMKKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4KKyMgVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIE1ha2VmaWxlIGluIHRoZQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbiB0aGF0CisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQKKyMgaXQgYXQgc3RhcnR1cC4KKworR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PCisKKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlCisjIGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlCisjIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKQorIyBjYW4gYmUgZ3JvdXBlZC4KKworRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIgorCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdAorIyBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYQorIyByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuCisjIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTAorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQorIyBwYWdlIGhhcyBsb2FkZWQuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMKKyMgSmF2YVNjcmlwdCBhbmQgREhUTUwgaXMgcmVxdWlyZWQgKGZvciBpbnN0YW5jZSBNb3ppbGxhIDEuMCssIEZpcmVmb3gKKyMgTmV0c2NhcGUgNi4wKywgSW50ZXJuZXQgZXhwbG9yZXIgNS4wKywgS29ucXVlcm9yLCBvciBTYWZhcmkpLgorCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fRklMRSB0YWcgY2FuCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobSBmaWxlLiBZb3UKKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZgorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIChoaGMuZXhlKS4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnCisjIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoWUVTKSBvciB0aGF0CisjIGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fSU5ERVhfRU5DT0RJTkcKKyMgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykgYW5kIHByb2plY3QgZmlsZQorIyBjb250ZW50LgorCitDSE1fSU5ERVhfRU5DT0RJTkcgICAgID0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBCSU5BUllfVE9DIGZsYWcKKyMgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgYQorIyBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLgorCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KKworIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycworIyB0byB0aGUgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KKworIyBUaGUgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCBhdAorIyB0b3Agb2YgZWFjaCBIVE1MIHBhZ2UuIFRoZSB2YWx1ZSBOTyAodGhlIGRlZmF1bHQpIGVuYWJsZXMgdGhlIGluZGV4IGFuZAorIyB0aGUgdmFsdWUgWUVTIGRpc2FibGVzIGl0LgorCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcyAocmFuZ2UgWzEuLjIwXSkKKyMgdGhhdCBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSAxCisKKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleAorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4KKyMgSWYgdGhlIHRhZyB2YWx1ZSBpcyBzZXQgdG8gRlJBTUUsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZAorIyBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdAorIyBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMKKyMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkIChmb3IgaW5zdGFuY2UgTW96aWxsYSAxLjArLAorIyBOZXRzY2FwZSA2LjArLCBJbnRlcm5ldCBleHBsb3JlciA1LjArLCBvciBLb25xdWVyb3IpLiBXaW5kb3dzIHVzZXJzIGFyZQorIyBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBIVE1MIGhlbHAgZmVhdHVyZS4gT3RoZXIgcG9zc2libGUgdmFsdWVzCisjIGZvciB0aGlzIHRhZyBhcmU6IEhJRVJBUkNISUVTLCB3aGljaCB3aWxsIGdlbmVyYXRlIHRoZSBHcm91cHMsIERpcmVjdG9yaWVzLAorIyBhbmQgQ2xhc3MgSGllcmVyYWNoeSBwYWdlcyB1c2luZyBhIHRyZWUgdmlldyBpbnN0ZWFkIG9mIGFuIG9yZGVyZWQgbGlzdDsKKyMgQUxMLCB3aGljaCBjb21iaW5lcyB0aGUgYmVoYXZpb3Igb2YgRlJBTUUgYW5kIEhJRVJBUkNISUVTOyBhbmQgTk9ORSwgd2hpY2gKKyMgZGlzYWJsZXMgdGhpcyBiZWhhdmlvciBjb21wbGV0ZWx5LiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cworIyByZWxlYXNlcyBvZiBEb3h5Z2VuLCB0aGUgdmFsdWVzIFlFUyBhbmQgTk8gYXJlIGVxdWl2YWxlbnQgdG8gRlJBTUUgYW5kIE5PTkUKKyMgcmVzcGVjdGl2ZWx5LgorCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZQorIyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUKKyMgaXMgc2hvd24uCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGF0ZXggZm9ybXVsYXMgaW5jbHVkZWQKKyMgYXMgaW1hZ2VzIGluIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFRoZSBkZWZhdWx0IGlzIDEwLiBOb3RlIHRoYXQKKyMgd2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRveHlnZW4gcnVuIHlvdSBuZWVkCisjIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5CisjIHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgTGF0ZXggb3V0cHV0LgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8KKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUKKyMgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisKK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKKworIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QKKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bworIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQKKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBhNHdpZGUsIGxldHRlciwgbGVnYWwgYW5kCisjIGV4ZWN1dGl2ZS4gSWYgbGVmdCBibGFuayBhNHdpZGUgd2lsbCBiZSB1c2VkLgorCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlCisKKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBuYW1lcyBvZiBMYVRlWAorIyBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gYW1zc3ltYiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW1zbWF0aAorCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbAorIyB0aGUgZmlyc3QgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGljZTogb25seSB1c2UgdGhpcyB0YWcgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorCitMQVRFWF9IRUFERVIgICAgICAgICAgID0KKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZAorIyBpcyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBwZGYgKHVzaW5nIHBzMnBkZikuIFRoZSBwZGYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgcGRmIHZpZXdlci4KKworUERGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgcGRmbGF0ZXggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YKKyMgcGxhaW4gbGF0ZXggaW4gdGhlIGdlbmVyYXRlZCBNYWtlZmlsZS4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXFxiYXRjaG1vZGUuCisjIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXAKKyMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLgorIyBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuCisKK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTworCisjIElmIExBVEVYX0hJREVfSU5ESUNFUyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdAorIyBpbmNsdWRlIHRoZSBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikKKyMgaW4gdGhlIG91dHB1dC4KKworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0CisjIFRoZSBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHZlcnkgcHJldHR5IHdpdGgKKyMgb3RoZXIgUlRGIHJlYWRlcnMgb3IgZWRpdG9ycy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBydGYnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdAorIyBSVEYgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bworIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkCisjIHdpbGwgY29udGFpbiBoeXBlcmxpbmsgZmllbGRzLiBUaGUgUlRGIGZpbGUgd2lsbAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4KKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgV09SRCBvciBvdGhlcgorIyBwcm9ncmFtcyB3aGljaCBzdXBwb3J0IHRob3NlIGZpZWxkcy4KKyMgTm90ZTogd29yZHBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncworIyBjb25maWcgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlCisjIHJlcGxhY2VtZW50cywgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuCisjIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4KKworUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LAorIyB0aGVuIGl0IHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5CisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMKKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kCisjIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuIFRoZSBkZWZhdWx0IGlzIE5PLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHhtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgc2NoZW1hLAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKK1hNTF9TQ0hFTUEgICAgICAgICAgICAgPQorCisjIFRoZSBYTUxfRFREIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBEVEQsCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKworWE1MX0RURCAgICAgICAgICAgICAgICA9CisKKyMgSWYgdGhlIFhNTF9QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZHVtcCB0aGUgcHJvZ3JhbSBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcKKyMgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0byB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0CisjIGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBYTUwgb3V0cHV0LgorCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGFuIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBhdXRvZ2VuLnNmLm5ldCkgZmlsZQorIyB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbAorIyBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbAorIyBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YKKyMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcworIyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUKKyMgbW9tZW50LgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUKKyMgdGhlIG5lY2Vzc2FyeSBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUKKyMgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZQorIyBuaWNlbHkgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuICBUaGlzIGlzIHVzZWZ1bAorIyBpZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhpcworIyB0YWcgaXMgc2V0IHRvIE5PIHRoZSBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIKKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUKKyMgYXJlIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4KKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lCisjIE1ha2VmaWxlIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlCisjIGZpbGVzLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybworIyBuYW1lcyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgY29uZGl0aW9uYWwKKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQKKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMKKyMgdGhlbiB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUKKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMKKyMgaW4gdGhlIElOQ0xVREVfUEFUSCAoc2VlIGJlbG93KSB3aWxsIGJlIHNlYXJjaCBpZiBhICNpbmNsdWRlIGlzIGZvdW5kLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkKKyMgdGhlIHByZXByb2Nlc3Nvci4KKworSU5DTFVERV9QQVRIICAgICAgICAgICA9CisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsCisjIGJlIHVzZWQuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPQorCisjIFRoZSBQUkVERUZJTkVEIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hY3JvIG5hbWVzIHRoYXQKKyMgYXJlIGRlZmluZWQgYmVmb3JlIHRoZSBwcmVwcm9jZXNzb3IgaXMgc3RhcnRlZCAoc2ltaWxhciB0byB0aGUgLUQgb3B0aW9uIG9mCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUKKyMgb3IgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlID0gYXJlCisjIG9taXR0ZWQgPTEgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZworIyB1bmRlZmluZWQgdmlhICN1bmRlZiBvciByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yCisjIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisKK1BSRURFRklORUQgICAgICAgICAgICAgPSBFSUdFTl9FTVBUWV9TVFJVQ1QgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX1BBUlNFRF9CWV9ET1hZR0VOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9WRUNUT1JJWkUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX1FUX1NVUFBPUlQgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX1NUUk9OR19JTkxJTkU9aW5saW5lCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbgorIyB0aGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4KKyMgVGhlIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuCisjIFVzZSB0aGUgUFJFREVGSU5FRCB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24uCisKK0VYUEFORF9BU19ERUZJTkVEICAgICAgPSBFSUdFTl9NQUtFX1NDQUxBUl9PUFMgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX01BS0VfVFlQRURFRlMgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgRUlHRU5fTUFLRV9UWVBFREVGU19BTExfU0laRVMgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9DV0lTRV9VTk9QX1JFVFVSTl9UWVBFICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEVJR0VOX0NXSVNFX0JJTk9QX1JFVFVSTl9UWVBFCisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbgorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCBmdW5jdGlvbi1saWtlIG1hY3JvcyB0aGF0IGFyZSBhbG9uZQorIyBvbiBhIGxpbmUsIGhhdmUgYW4gYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGEgc2VtaWNvbG9uLiBTdWNoCisjIGZ1bmN0aW9uIG1hY3JvcyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIGJvaWxlci1wbGF0ZSBjb2RlLCBhbmQgd2lsbCBjb25mdXNlCisjIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZ2ZpbGVzLgorIyBPcHRpb25hbGx5IGFuIGluaXRpYWwgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24KKyMgY2FuIGJlIGFkZGVkIGZvciBlYWNoIHRhZ2ZpbGUuIFRoZSBmb3JtYXQgb2YgYSB0YWcgZmlsZSB3aXRob3V0CisjIHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czoKKyMgICBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgorIyAgIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgImxvYzEiIGFuZCAibG9jMiIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yCisjIFVSTHMuIElmIGEgbG9jYXRpb24gaXMgcHJlc2VudCBmb3IgZWFjaCB0YWcsIHRoZSBpbnN0YWxsZG94IHRvb2wKKyMgZG9lcyBub3QgaGF2ZSB0byBiZSBydW4gdG8gY29ycmVjdCB0aGUgbGlua3MuCisjIE5vdGUgdGhhdCBlYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lCisjICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwYXRoKQorIyBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggZG94eWdlbgorIyBpcyBydW4sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgdGFnZmlsZSBoZXJlLgorCitUQUdGSUxFUyAgICAgICAgICAgICAgID0gIiR7RWlnZW5fQklOQVJZX0RJUn0vZG9jL2VpZ2VuLmRveHl0YWdzIj0uLi8KKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAiJHtFaWdlbl9CSU5BUllfRElSfS9kb2MvZWlnZW4tdW5zdXBwb3J0ZWQuZG94eXRhZ3MiCisKKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcworIyB3aWxsIGJlIGxpc3RlZC4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsCisjIGJlIGxpc3RlZC4KKworRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgaW5oZXJpdGFuY2UgZGlhZ3JhbSAoaW4gSFRNTCwgUlRGIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlCisjIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0byBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQKKyMgdGhpcyBvcHRpb24gaXMgc3VwZXJzZWRlZCBieSB0aGUgSEFWRV9ET1Qgb3B0aW9uIGJlbG93LiBUaGlzIGlzIG9ubHkgYQorIyBmYWxsYmFjay4gSXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gTk8KKworIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYworIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWUKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPSBOTworCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlCisjIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQKKyMgb3IgaXMgbm90IGEgY2xhc3MuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBOTworCisjIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcworIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbgorIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uCisjIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHdyaXRlIGEgZm9udCBjYWxsZWQgRnJlZVNhbnMudHRmIHRvIHRoZSBvdXRwdXQKKyMgZGlyZWN0b3J5IGFuZCByZWZlcmVuY2UgaXQgaW4gYWxsIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4gZ2VuZXJhdGVzLiBUaGlzCisjIGZvbnQgZG9lcyBub3QgaW5jbHVkZSBhbGwgcG9zc2libGUgdW5pY29kZSBjaGFyYWN0ZXJzIGhvd2V2ZXIsIHNvIHdoZW4geW91IG5lZWQKKyMgdGhlc2UgKG9yIGp1c3Qgd2FudCBhIGRpZmZlcmVudGx5IGxvb2tpbmcgZm9udCkgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb250IG5hbWUKKyMgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCBuZWVkIHRvIG1ha2Ugc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LAorIyB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUKKyMgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeQorIyBjb250YWluaW5nIHRoZSBmb250LgorCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gRnJlZVNhbnMKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIG91dHB1dCBkaXJlY3RvcnkgdG8gbG9vayBmb3IgdGhlCisjIEZyZWVTYW5zLnR0ZiBmb250ICh3aGljaCBkb3h5Z2VuIHdpbGwgcHV0IHRoZXJlIGl0c2VsZikuIElmIHlvdSBzcGVjaWZ5IGEKKyMgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0IHRoZSBwYXRoIHdoZXJlIGRvdAorIyBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9CisKKyMgSWYgdGhlIENMQVNTX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUKKyMgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4KKworQ0xBU1NfR1JBUEggICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZAorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gTk8KKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMKKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBzaG93IHRoZQorIyByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyIGluc3RhbmNlcy4KKworVEVNUExBVEVfUkVMQVRJT05TICAgICA9IE5PCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVfR1JBUEgsIGFuZCBIQVZFX0RPVAorIyB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmaWxlIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aAorIyBvdGhlciBkb2N1bWVudGVkIGZpbGVzLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERURfQllfR1JBUEgsIGFuZAorIyBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2gKKyMgZG9jdW1lbnRlZCBoZWFkZXIgZmlsZSBzaG93aW5nIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3IKKyMgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZS4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IE5PCisKKyMgSWYgdGhlIENBTExfR1JBUEggYW5kIEhBVkVfRE9UIG9wdGlvbnMgYXJlIHNldCB0byBZRVMgdGhlbgorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbgorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UKKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzCisjIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbgorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UKKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlcgorIyBncmFwaHMgZm9yIHNlbGVjdGVkIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ3JhcGhpY2FsIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBOTworCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEgsIFNIT1dfRElSRUNUT1JJRVMgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMKKyMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcworIyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZSBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUKKyMgcmVsYXRpb25zIGJldHdlZW4gdGhlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gUG9zc2libGUgdmFsdWVzIGFyZSBwbmcsIGpwZywgb3IgZ2lmCisjIElmIGxlZnQgYmxhbmsgcG5nIHdpbGwgYmUgdXNlZC4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworCisjIFRoZSB0YWcgRE9UX1BBVEggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPQorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcZG90ZmlsZSBjb21tYW5kKS4KKworRE9URklMRV9ESVJTICAgICAgICAgICA9CisKKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyMgbm9kZXMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoCisjIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMKKyMgdmlzdWFsaXplZCBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlCisjIG51bWJlciBvZiBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4KKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZQorIyB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgorCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTAKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZQorIyBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUKKyMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMKKyMgdGhhdCBsYXkgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzCisjIG9wdGlvbiB0byAxIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UKKyMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5CisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDEwMDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIHdoaWNoIHJlc3VsdHMgaW4gYSB0cmFuc3BhcmVudAorIyBiYWNrZ3JvdW5kLiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uCisjIG1heSBsZWFkIHRvIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleQorIyBiZWNvbWUgaGFyZCB0byByZWFkKS4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKQorIyBzdXBwb3J0IHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQKKyMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4KKworR0VORVJBVEVfTEVHRU5EICAgICAgICA9IE5PCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIGRvdCBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlCisjIHRoZSB2YXJpb3VzIGdyYXBocy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gdGhlIHNlYXJjaCBlbmdpbmUKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgU0VBUkNIRU5HSU5FIHRhZyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgYSBzZWFyY2ggZW5naW5lIHNob3VsZCBiZQorIyB1c2VkLiBJZiBzZXQgdG8gTk8gdGhlIHZhbHVlcyBvZiBhbGwgdGFncyBiZWxvdyB0aGlzIG9uZSB3aWxsIGJlIGlnbm9yZWQuCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBOTwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL092ZXJ2aWV3LmRveCBiL3Vuc3VwcG9ydGVkL2RvYy9PdmVydmlldy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4YjUwNwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9PdmVydmlldy5kb3gKQEAgLTAsMCArMSwyMiBAQAorbmFtZXNwYWNlIEVpZ2VuIHsKKworLyoqIFxtYWlucGFnZSBFaWdlbidzIHVuc3VwcG9ydGVkIG1vZHVsZXMKKworVGhpcyBpcyB0aGUgQVBJIGRvY3VtZW50YXRpb24gZm9yIEVpZ2VuJ3MgdW5zdXBwb3J0ZWQgbW9kdWxlcy4KKworVGhlc2UgbW9kdWxlcyBhcmUgY29udHJpYnV0aW9ucyBmcm9tIHZhcmlvdXMgdXNlcnMuIFRoZXkgYXJlIHByb3ZpZGVkICJhcyBpcyIsIHdpdGhvdXQgYW55IHN1cHBvcnQuCisKK0NsaWNrIG9uIHRoZSBcZSBNb2R1bGVzIHRhYiBhdCB0aGUgdG9wIG9mIHRoaXMgcGFnZSB0byBnZXQgYSBsaXN0IG9mIGFsbCB1bnN1cHBvcnRlZCBtb2R1bGVzLgorCitEb24ndCBtaXNzIHRoZSA8YSBocmVmPSIuLi8vaW5kZXguaHRtbCI+b2ZmaWNpYWwgRWlnZW4gZG9jdW1lbnRhdGlvbjwvYT4uCisKKworXGRlZmdyb3VwIFVuc3VwcG9ydGVkX21vZHVsZXMgVW5zdXBwb3J0ZWQgbW9kdWxlcworCitUaGUgdW5zdXBwb3J0ZWQgbW9kdWxlcyBhcmUgY29udHJpYnV0aW9ucyBmcm9tIHZhcmlvdXMgdXNlcnMuIFRoZXkgYXJlCitwcm92aWRlZCAiYXMgaXMiLCB3aXRob3V0IGFueSBzdXBwb3J0LiBOZXZlcnRoZWxlc3MsIHNvbWUgb2YgdGhlbSBhcmUKK3N1YmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gRWlnZW4gaW4gdGhlIGZ1dHVyZS4KKworKi8KKworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0JWSF9FeGFtcGxlLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9CVkhfRXhhbXBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2ZmFjMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9CVkhfRXhhbXBsZS5jcHAKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgPEVpZ2VuL1N0ZFZlY3Rvcj4KKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9CVkg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3R5cGVkZWYgQWxpZ25lZEJveDxkb3VibGUsIDI+IEJveDJkOworCituYW1lc3BhY2UgRWlnZW4geworICAgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgICAgIEJveDJkIGJvdW5kaW5nX2JveChjb25zdCBWZWN0b3IyZCAmdikgeyByZXR1cm4gQm94MmQodiwgdik7IH0gLy9jb21wdXRlIHRoZSBib3VuZGluZyBib3ggb2YgYSBzaW5nbGUgcG9pbnQKKyAgICB9Cit9CisKK3N0cnVjdCBQb2ludFBvaW50TWluaW1pemVyIC8vaG93IHRvIGNvbXB1dGUgc3F1YXJlZCBkaXN0YW5jZXMgYmV0d2VlbiBwb2ludHMgYW5kIHJlY3RhbmdsZXMKK3sKKyAgUG9pbnRQb2ludE1pbmltaXplcigpIDogY2FsbHMoMCkge30KKyAgdHlwZWRlZiBkb3VibGUgU2NhbGFyOworCisgIGRvdWJsZSBtaW5pbXVtT25Wb2x1bWVWb2x1bWUoY29uc3QgQm94MmQgJnIxLCBjb25zdCBCb3gyZCAmcjIpIHsgKytjYWxsczsgcmV0dXJuIHIxLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHIyKTsgfQorICBkb3VibGUgbWluaW11bU9uVm9sdW1lT2JqZWN0KGNvbnN0IEJveDJkICZyLCBjb25zdCBWZWN0b3IyZCAmdikgeyArK2NhbGxzOyByZXR1cm4gci5zcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZSh2KTsgfQorICBkb3VibGUgbWluaW11bU9uT2JqZWN0Vm9sdW1lKGNvbnN0IFZlY3RvcjJkICZ2LCBjb25zdCBCb3gyZCAmcikgeyArK2NhbGxzOyByZXR1cm4gci5zcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZSh2KTsgfQorICBkb3VibGUgbWluaW11bU9uT2JqZWN0T2JqZWN0KGNvbnN0IFZlY3RvcjJkICZ2MSwgY29uc3QgVmVjdG9yMmQgJnYyKSB7ICsrY2FsbHM7IHJldHVybiAodjEgLSB2Mikuc3F1YXJlZE5vcm0oKTsgfQorCisgIGludCBjYWxsczsKK307CisKK2ludCBtYWluKCkKK3sKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxWZWN0b3IyZCwgYWxpZ25lZF9hbGxvY2F0b3I8VmVjdG9yMmQ+ID4gU3RkVmVjdG9yT2ZWZWN0b3IyZDsKKyAgU3RkVmVjdG9yT2ZWZWN0b3IyZCByZWRQb2ludHMsIGJsdWVQb2ludHM7CisgIGZvcihpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgeyAvL2luaXRpYWxpemUgcmFuZG9tIHNldCBvZiByZWQgcG9pbnRzIGFuZCBibHVlIHBvaW50cworICAgIHJlZFBvaW50cy5wdXNoX2JhY2soVmVjdG9yMmQ6OlJhbmRvbSgpKTsKKyAgICBibHVlUG9pbnRzLnB1c2hfYmFjayhWZWN0b3IyZDo6UmFuZG9tKCkpOworICB9CisKKyAgUG9pbnRQb2ludE1pbmltaXplciBtaW5pbWl6ZXI7CisgIGRvdWJsZSBtaW5EaXN0U3EgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpOworCisgIC8vYnJ1dGUgZm9yY2UgdG8gZmluZCBjbG9zZXN0IHJlZC1ibHVlIHBhaXIKKyAgZm9yKGludCBpID0gMDsgaSA8IChpbnQpcmVkUG9pbnRzLnNpemUoKTsgKytpKQorICAgIGZvcihpbnQgaiA9IDA7IGogPCAoaW50KWJsdWVQb2ludHMuc2l6ZSgpOyArK2opCisgICAgICBtaW5EaXN0U3EgPSBzdGQ6Om1pbihtaW5EaXN0U3EsIG1pbmltaXplci5taW5pbXVtT25PYmplY3RPYmplY3QocmVkUG9pbnRzW2ldLCBibHVlUG9pbnRzW2pdKSk7CisgIHN0ZDo6Y291dCA8PCAiQnJ1dGUgZm9yY2UgZGlzdGFuY2UgPSAiIDw8IHNxcnQobWluRGlzdFNxKSA8PCAiLCBjYWxscyA9ICIgPDwgbWluaW1pemVyLmNhbGxzIDw8IHN0ZDo6ZW5kbDsKKworICAvL3VzaW5nIEJWSCB0byBmaW5kIGNsb3Nlc3QgcmVkLWJsdWUgcGFpcgorICBtaW5pbWl6ZXIuY2FsbHMgPSAwOworICBLZEJWSDxkb3VibGUsIDIsIFZlY3RvcjJkPiByZWRUcmVlKHJlZFBvaW50cy5iZWdpbigpLCByZWRQb2ludHMuZW5kKCkpLCBibHVlVHJlZShibHVlUG9pbnRzLmJlZ2luKCksIGJsdWVQb2ludHMuZW5kKCkpOyAvL2NvbnN0cnVjdCB0aGUgdHJlZXMKKyAgbWluRGlzdFNxID0gQlZNaW5pbWl6ZShyZWRUcmVlLCBibHVlVHJlZSwgbWluaW1pemVyKTsgLy9hY3R1YWwgQlZIIG1pbmltaXphdGlvbiBjYWxsCisgIHN0ZDo6Y291dCA8PCAiQlZIIGRpc3RhbmNlICAgICAgICAgPSAiIDw8IHNxcnQobWluRGlzdFNxKSA8PCAiLCBjYWxscyA9ICIgPDwgbWluaW1pemVyLmNhbGxzIDw8IHN0ZDo6ZW5kbDsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9DTWFrZUxpc3RzLnR4dCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzhmOWFmCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjIgQEAKK0ZJTEUoR0xPQiBleGFtcGxlc19TUkNTICIqLmNwcCIpCisKK0FERF9DVVNUT01fVEFSR0VUKHVuc3VwcG9ydGVkX2V4YW1wbGVzKQorCitJTkNMVURFX0RJUkVDVE9SSUVTKC4uLy4uLy4uL3Vuc3VwcG9ydGVkIC4uLy4uLy4uL3Vuc3VwcG9ydGVkL3Rlc3QpCisKK0ZPUkVBQ0goZXhhbXBsZV9zcmMgJHtleGFtcGxlc19TUkNTfSkKKyAgR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChleGFtcGxlICR7ZXhhbXBsZV9zcmN9IE5BTUVfV0UpCisgIEFERF9FWEVDVVRBQkxFKGV4YW1wbGVfJHtleGFtcGxlfSAke2V4YW1wbGVfc3JjfSkKKyAgaWYoRUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE8pCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGV4YW1wbGVfJHtleGFtcGxlfSAke0VJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPfSkKKyAgZW5kaWYoKQorICBHRVRfVEFSR0VUX1BST1BFUlRZKGV4YW1wbGVfZXhlY3V0YWJsZQorICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVfJHtleGFtcGxlfSBMT0NBVElPTikKKyAgQUREX0NVU1RPTV9DT01NQU5EKAorICAgIFRBUkdFVCBleGFtcGxlXyR7ZXhhbXBsZX0KKyAgICBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke2V4YW1wbGVfZXhlY3V0YWJsZX0KKyAgICBBUkdTID4ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtleGFtcGxlfS5vdXQKKyAgKQorICBBRERfREVQRU5ERU5DSUVTKHVuc3VwcG9ydGVkX2V4YW1wbGVzIGV4YW1wbGVfJHtleGFtcGxlfSkKK0VOREZPUkVBQ0goZXhhbXBsZV9zcmMpCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvRkZULmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9GRlQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYmY4MTIKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvRkZULmNwcApAQCAtMCwwICsxLDExOCBAQAorLy8gIFRvIHVzZSB0aGUgc2ltcGxlIEZGVCBpbXBsZW1lbnRhdGlvbgorLy8gIGcrKyAtbyBkZW1vZmZ0IC1JLi4gLVdhbGwgLU8zIEZGVC5jcHAgCisKKy8vICBUbyB1c2UgdGhlIEZGVFcgaW1wbGVtZW50YXRpb24KKy8vICBnKysgLW8gZGVtb2ZmdCAtSS4uIC1EVVNFX0ZGVFcgLVdhbGwgLU8zIEZGVC5jcHAgLWxmZnR3MyAtbGZmdHczZiAtbGZmdHczbAorCisjaWZkZWYgVVNFX0ZGVFcKKyNpbmNsdWRlIDxmZnR3My5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y29tcGxleD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8RWlnZW4vQ29yZT4KKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9GRlQ+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBtYWcyKFQgYSkKK3sKKyAgICByZXR1cm4gYSphOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIG1hZzIoc3RkOjpjb21wbGV4PFQ+IGEpCit7CisgICAgcmV0dXJuIG5vcm0oYSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBtYWcyKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICYgdmVjKQoreworICAgIFQgb3V0PTA7CisgICAgZm9yIChzaXplX3Qgaz0wO2s8dmVjLnNpemUoKTsrK2spCisgICAgICAgIG91dCArPSBtYWcyKHZlY1trXSk7CisgICAgcmV0dXJuIG91dDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIG1hZzIoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpjb21wbGV4PFQ+ID4gJiB2ZWMpCit7CisgICAgVCBvdXQ9MDsKKyAgICBmb3IgKHNpemVfdCBrPTA7azx2ZWMuc2l6ZSgpOysraykKKyAgICAgICAgb3V0ICs9IG1hZzIodmVjW2tdKTsKKyAgICByZXR1cm4gb3V0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZlY3RvcjxUPiBvcGVyYXRvci0oY29uc3QgdmVjdG9yPFQ+ICYgYSxjb25zdCB2ZWN0b3I8VD4gJiBiICkKK3sKKyAgICB2ZWN0b3I8VD4gYyhhKTsKKyAgICBmb3IgKHNpemVfdCBrPTA7azxiLnNpemUoKTsrK2spIAorICAgICAgICBjW2tdIC09IGJba107CisgICAgcmV0dXJuIGM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBSYW5kb21GaWxsKHN0ZDo6dmVjdG9yPFQ+ICYgdmVjKQoreworICAgIGZvciAoc2l6ZV90IGs9MDtrPHZlYy5zaXplKCk7KytrKQorICAgICAgICB2ZWNba10gPSBUKCByYW5kKCkgKS9UKFJBTkRfTUFYKSAtIC41OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUmFuZG9tRmlsbChzdGQ6OnZlY3RvcjxzdGQ6OmNvbXBsZXg8VD4gPiAmIHZlYykKK3sKKyAgICBmb3IgKHNpemVfdCBrPTA7azx2ZWMuc2l6ZSgpOysraykKKyAgICAgICAgdmVjW2tdID0gc3RkOjpjb21wbGV4PFQ+ICggVCggcmFuZCgpICkvVChSQU5EX01BWCkgLSAuNSwgVCggcmFuZCgpICkvVChSQU5EX01BWCkgLSAuNSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUX3RpbWUsdHlwZW5hbWUgVF9mcmVxPgordm9pZCBmd2RfaW52KHNpemVfdCBuZmZ0KQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFRfZnJlcT46OlJlYWwgU2NhbGFyOworICAgIHZlY3RvcjxUX3RpbWU+IHRpbWVidWYobmZmdCk7CisgICAgUmFuZG9tRmlsbCh0aW1lYnVmKTsKKworICAgIHZlY3RvcjxUX2ZyZXE+IGZyZXFidWY7CisgICAgc3RhdGljIEZGVDxTY2FsYXI+IGZmdDsKKyAgICBmZnQuZndkKGZyZXFidWYsdGltZWJ1Zik7CisKKyAgICB2ZWN0b3I8VF90aW1lPiB0aW1lYnVmMjsKKyAgICBmZnQuaW52KHRpbWVidWYyLGZyZXFidWYpOworCisgICAgbG9uZyBkb3VibGUgcm1zZSA9IG1hZzIodGltZWJ1ZiAtIHRpbWVidWYyKSAvIG1hZzIodGltZWJ1Zik7CisgICAgY291dCA8PCAicm91bmR0cmlwIHJtc2U6ICIgPDwgcm1zZSA8PCBlbmRsOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVF9zY2FsYXI+Cit2b2lkIHR3b19kZW1vcyhpbnQgbmZmdCkKK3sKKyAgICBjb3V0IDw8ICIgICAgIHNjYWxhciAiOworICAgIGZ3ZF9pbnY8VF9zY2FsYXIsc3RkOjpjb21wbGV4PFRfc2NhbGFyPiA+KG5mZnQpOworICAgIGNvdXQgPDwgIiAgICBjb21wbGV4ICI7CisgICAgZndkX2ludjxzdGQ6OmNvbXBsZXg8VF9zY2FsYXI+LHN0ZDo6Y29tcGxleDxUX3NjYWxhcj4gPihuZmZ0KTsKK30KKwordm9pZCBkZW1vX2FsbF90eXBlcyhpbnQgbmZmdCkKK3sKKyAgICBjb3V0IDw8ICJuZmZ0PSIgPDwgbmZmdCA8PCBlbmRsOworICAgIGNvdXQgPDwgIiAgIGZsb2F0IiA8PCBlbmRsOworICAgIHR3b19kZW1vczxmbG9hdD4obmZmdCk7CisgICAgY291dCA8PCAiICAgZG91YmxlIiA8PCBlbmRsOworICAgIHR3b19kZW1vczxkb3VibGU+KG5mZnQpOworICAgIGNvdXQgPDwgIiAgIGxvbmcgZG91YmxlIiA8PCBlbmRsOworICAgIHR3b19kZW1vczxsb25nIGRvdWJsZT4obmZmdCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgICBkZW1vX2FsbF90eXBlcyggMiozKjQqNSo3ICk7CisgICAgZGVtb19hbGxfdHlwZXMoIDIqOSoxNioyNSApOworICAgIGRlbW9fYWxsX3R5cGVzKCAxMDI0ICk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4RXhwb25lbnRpYWwuY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeEV4cG9uZW50aWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQzYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeEV4cG9uZW50aWFsLmNwcApAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgY29uc3QgZG91YmxlIHBpID0gc3RkOjphY29zKC0xLjApOworCisgIE1hdHJpeFhkIEEoMywzKTsKKyAgQSA8PCAwLCAgICAtcGkvNCwgMCwKKyAgICAgICBwaS80LCAwLCAgICAgMCwKKyAgICAgICAwLCAgICAwLCAgICAgMDsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IEEgaXM6XG4iIDw8IEEgPDwgIlxuXG4iOworICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggZXhwb25lbnRpYWwgb2YgQSBpczpcbiIgPDwgQS5leHAoKSA8PCAiXG5cbiI7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4RnVuY3Rpb24uY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeEZ1bmN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE3MmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeEZ1bmN0aW9uLmNwcApAQCAtMCwwICsxLDIzIEBACisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK3N0ZDo6Y29tcGxleDxkb3VibGU+IGV4cGZuKHN0ZDo6Y29tcGxleDxkb3VibGU+IHgsIGludCkKK3sKKyAgcmV0dXJuIHN0ZDo6ZXhwKHgpOworfQorCitpbnQgbWFpbigpCit7CisgIGNvbnN0IGRvdWJsZSBwaSA9IHN0ZDo6YWNvcygtMS4wKTsKKworICBNYXRyaXhYZCBBKDMsMyk7CisgIEEgPDwgMCwgICAgLXBpLzQsIDAsCisgICAgICAgcGkvNCwgMCwgICAgIDAsCisgICAgICAgMCwgICAgMCwgICAgIDA7CisKKyAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IEEgaXM6XG4iIDw8IEEgPDwgIlxuXG4iOworICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggZXhwb25lbnRpYWwgb2YgQSBpczpcbiIgCisgICAgICAgICAgICA8PCBBLm1hdHJpeEZ1bmN0aW9uKGV4cGZuKSA8PCAiXG5cbiI7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4TG9nYXJpdGhtLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhMb2dhcml0aG0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNWQ5NzAKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4TG9nYXJpdGhtLmNwcApAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgdXNpbmcgc3RkOjpzcXJ0OworICBNYXRyaXhYZCBBKDMsMyk7CisgIEEgPDwgMC41KnNxcnQoMiksIC0wLjUqc3FydCgyKSwgMCwKKyAgICAgICAwLjUqc3FydCgyKSwgIDAuNSpzcXJ0KDIpLCAwLAorICAgICAgIDAsICAgICAgICAgICAgMCwgICAgICAgICAgIDE7CisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBBIGlzOlxuIiA8PCBBIDw8ICJcblxuIjsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IGxvZ2FyaXRobSBvZiBBIGlzOlxuIiA8PCBBLmxvZygpIDw8ICJcbiI7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U2luZS5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlYTlhMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhTaW5lLmNwcApAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oMywzKTsKKyAgc3RkOjpjb3V0IDw8ICJBID0gXG4iIDw8IEEgPDwgIlxuXG4iOworCisgIE1hdHJpeFhkIHNpbkEgPSBBLnNpbigpOworICBzdGQ6OmNvdXQgPDwgInNpbihBKSA9IFxuIiA8PCBzaW5BIDw8ICJcblxuIjsKKworICBNYXRyaXhYZCBjb3NBID0gQS5jb3MoKTsKKyAgc3RkOjpjb3V0IDw8ICJjb3MoQSkgPSBcbiIgPDwgY29zQSA8PCAiXG5cbiI7CisgIAorICAvLyBUaGUgbWF0cml4IGZ1bmN0aW9ucyBzYXRpc2Z5IHNpbl4yKEEpICsgY29zXjIoQSkgPSBJLCAKKyAgLy8gbGlrZSB0aGUgc2NhbGFyIGZ1bmN0aW9ucy4KKyAgc3RkOjpjb3V0IDw8ICJzaW5eMihBKSArIGNvc14yKEEpID0gXG4iIDw8IHNpbkEqc2luQSArIGNvc0EqY29zQSA8PCAiXG5cbiI7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U2luaC5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U2luaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MTg2NwotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhTaW5oLmNwcApAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2ludCBtYWluKCkKK3sKKyAgTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oMywzKTsKKyAgc3RkOjpjb3V0IDw8ICJBID0gXG4iIDw8IEEgPDwgIlxuXG4iOworCisgIE1hdHJpeFhmIHNpbmhBID0gQS5zaW5oKCk7CisgIHN0ZDo6Y291dCA8PCAic2luaChBKSA9IFxuIiA8PCBzaW5oQSA8PCAiXG5cbiI7CisKKyAgTWF0cml4WGYgY29zaEEgPSBBLmNvc2goKTsKKyAgc3RkOjpjb3V0IDw8ICJjb3NoKEEpID0gXG4iIDw8IGNvc2hBIDw8ICJcblxuIjsKKyAgCisgIC8vIFRoZSBtYXRyaXggZnVuY3Rpb25zIHNhdGlzZnkgY29zaF4yKEEpIC0gc2luaF4yKEEpID0gSSwgCisgIC8vIGxpa2UgdGhlIHNjYWxhciBmdW5jdGlvbnMuCisgIHN0ZDo6Y291dCA8PCAiY29zaF4yKEEpIC0gc2luaF4yKEEpID0gXG4iIDw8IGNvc2hBKmNvc2hBIC0gc2luaEEqc2luaEEgPDwgIlxuXG4iOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNxdWFyZVJvb3QuY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNxdWFyZVJvb3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTc1NTcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U3F1YXJlUm9vdC5jcHAKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL01hdHJpeEZ1bmN0aW9ucz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCitpbnQgbWFpbigpCit7CisgIGNvbnN0IGRvdWJsZSBwaSA9IHN0ZDo6YWNvcygtMS4wKTsKKworICBNYXRyaXhYZCBBKDIsMik7CisgIEEgPDwgY29zKHBpLzMpLCAtc2luKHBpLzMpLCAKKyAgICAgICBzaW4ocGkvMyksICBjb3MocGkvMyk7CisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBBIGlzOlxuIiA8PCBBIDw8ICJcblxuIjsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IHNxdWFyZSByb290IG9mIEEgaXM6XG4iIDw8IEEuc3FydCgpIDw8ICJcblxuIjsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgc3F1YXJlIG9mIHRoZSBsYXN0IG1hdHJpeCBpczpcbiIgPDwgQS5zcXJ0KCkgKiBBLnNxcnQoKSA8PCAiXG4iOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL1BvbHlub21pYWxTb2x2ZXIxLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsU29sdmVyMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlNmI4MgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsU29sdmVyMS5jcHAKQEAgLTAsMCArMSw1MyBAQAorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1BvbHlub21pYWxzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworaW50IG1haW4oKQoreworICB0eXBlZGVmIE1hdHJpeDxkb3VibGUsNSwxPiBWZWN0b3I1ZDsKKworICBWZWN0b3I1ZCByb290cyA9IFZlY3RvcjVkOjpSYW5kb20oKTsKKyAgY291dCA8PCAiUm9vdHM6ICIgPDwgcm9vdHMudHJhbnNwb3NlKCkgPDwgZW5kbDsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsNiwxPiBwb2x5bm9taWFsOworICByb290c190b19tb25pY1BvbHlub21pYWwoIHJvb3RzLCBwb2x5bm9taWFsICk7CisKKyAgUG9seW5vbWlhbFNvbHZlcjxkb3VibGUsNT4gcHNvbHZlKCBwb2x5bm9taWFsICk7CisgIGNvdXQgPDwgIkNvbXBsZXggcm9vdHM6ICIgPDwgcHNvbHZlLnJvb3RzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKKworICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHJlYWxSb290czsKKyAgcHNvbHZlLnJlYWxSb290cyggcmVhbFJvb3RzICk7CisgIE1hcDxWZWN0b3I1ZD4gbWFwUlIoICZyZWFsUm9vdHNbMF0gKTsKKyAgY291dCA8PCAiUmVhbCByb290czogIiA8PCBtYXBSUi50cmFuc3Bvc2UoKSA8PCBlbmRsOworCisgIGNvdXQgPDwgZW5kbDsKKyAgY291dCA8PCAiSWxsdXN0cmF0aW9uIG9mIHRoZSBjb252ZXJnZW5jZSBwcm9ibGVtIHdpdGggdGhlIFFSIGFsZ29yaXRobTogIiA8PCBlbmRsOworICBjb3V0IDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7CisgIEVpZ2VuOjpNYXRyaXg8ZmxvYXQsNywxPiBoYXJkQ2FzZV9wb2x5bm9taWFsOworICBoYXJkQ2FzZV9wb2x5bm9taWFsIDw8CisgIC0wLjk1NywgMC45MjE5LCAwLjM1MTYsIDAuOTQ1MywgLTAuNDAyMywgLTAuNTUwOCwgLTAuMDMxMjU7CisgIGNvdXQgPDwgIkhhcmQgY2FzZSBwb2x5bm9taWFsIGRlZmluZWQgYnkgZmxvYXRzOiAiIDw8IGhhcmRDYXNlX3BvbHlub21pYWwudHJhbnNwb3NlKCkgPDwgZW5kbDsKKyAgUG9seW5vbWlhbFNvbHZlcjxmbG9hdCw2PiBwc29sdmVmKCBoYXJkQ2FzZV9wb2x5bm9taWFsICk7CisgIGNvdXQgPDwgIkNvbXBsZXggcm9vdHM6ICIgPDwgcHNvbHZlZi5yb290cygpLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisgIEVpZ2VuOjpNYXRyaXg8ZmxvYXQsNiwxPiBldmFsczsKKyAgZm9yKCBpbnQgaT0wOyBpPDY7ICsraSApeyBldmFsc1tpXSA9IHN0ZDo6YWJzKCBwb2x5X2V2YWwoIGhhcmRDYXNlX3BvbHlub21pYWwsIHBzb2x2ZWYucm9vdHMoKVtpXSApICk7IH0KKyAgY291dCA8PCAiTm9ybXMgb2YgdGhlIGV2YWx1YXRpb25zIG9mIHRoZSBwb2x5bm9taWFsIGF0IHRoZSByb290czogIiA8PCBldmFscy50cmFuc3Bvc2UoKSA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY291dCA8PCAiVXNpbmcgZG91YmxlJ3MgYWxtb3N0IGFsd2F5cyBzb2x2ZXMgdGhlIHByb2JsZW0gZm9yIHNtYWxsIGRlZ3JlZXM6ICIgPDwgZW5kbDsKKyAgY291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKKyAgUG9seW5vbWlhbFNvbHZlcjxkb3VibGUsNj4gcHNvbHZlNmQoIGhhcmRDYXNlX3BvbHlub21pYWwuY2FzdDxkb3VibGU+KCkgKTsKKyAgY291dCA8PCAiQ29tcGxleCByb290czogIiA8PCBwc29sdmU2ZC5yb290cygpLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisgIGZvciggaW50IGk9MDsgaTw2OyArK2kgKQorICB7CisgICAgc3RkOjpjb21wbGV4PGZsb2F0PiBjYXN0ZWRSb290KCBwc29sdmU2ZC5yb290cygpW2ldLnJlYWwoKSwgcHNvbHZlNmQucm9vdHMoKVtpXS5pbWFnKCkgKTsKKyAgICBldmFsc1tpXSA9IHN0ZDo6YWJzKCBwb2x5X2V2YWwoIGhhcmRDYXNlX3BvbHlub21pYWwsIGNhc3RlZFJvb3QgKSApOworICB9CisgIGNvdXQgPDwgIk5vcm1zIG9mIHRoZSBldmFsdWF0aW9ucyBvZiB0aGUgcG9seW5vbWlhbCBhdCB0aGUgcm9vdHM6ICIgPDwgZXZhbHMudHJhbnNwb3NlKCkgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvdXQucHJlY2lzaW9uKDEwKTsKKyAgY291dCA8PCAiVGhlIGxhc3Qgcm9vdCBpbiBmbG9hdCB0aGVuIGluIGRvdWJsZTogIiA8PCBwc29sdmVmLnJvb3RzKClbNV0gPDwgIlx0IiA8PCBwc29sdmU2ZC5yb290cygpWzVdIDw8IGVuZGw7CisgIHN0ZDo6Y29tcGxleDxmbG9hdD4gY2FzdGVkUm9vdCggcHNvbHZlNmQucm9vdHMoKVs1XS5yZWFsKCksIHBzb2x2ZTZkLnJvb3RzKClbNV0uaW1hZygpICk7CisgIGNvdXQgPDwgIk5vcm0gb2YgdGhlIGRpZmZlcmVuY2U6ICIgPDwgaW50ZXJuYWw6OmFicyggcHNvbHZlZi5yb290cygpWzVdIC0gY2FzdGVkUm9vdCApIDw8IGVuZGw7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvUG9seW5vbWlhbFV0aWxzMS5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvUG9seW5vbWlhbFV0aWxzMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmZTUyMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsVXRpbHMxLmNwcApAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vUG9seW5vbWlhbHM+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2ludCBtYWluKCkKK3sKKyAgVmVjdG9yNGQgcm9vdHMgPSBWZWN0b3I0ZDo6UmFuZG9tKCk7CisgIGNvdXQgPDwgIlJvb3RzOiAiIDw8IHJvb3RzLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLDUsMT4gcG9seW5vbWlhbDsKKyAgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKCByb290cywgcG9seW5vbWlhbCApOworICBjb3V0IDw8ICJQb2x5bm9taWFsOiAiOworICBmb3IoIGludCBpPTA7IGk8NDsgKytpICl7IGNvdXQgPDwgcG9seW5vbWlhbFtpXSA8PCAiLnheIiA8PCBpIDw8ICIrICI7IH0KKyAgY291dCA8PCBwb2x5bm9taWFsWzRdIDw8ICIueF40IiA8PCBlbmRsOworICBWZWN0b3I0ZCBldmFsdWF0aW9uOworICBmb3IoIGludCBpPTA7IGk8NDsgKytpICl7CisgICAgZXZhbHVhdGlvbltpXSA9IHBvbHlfZXZhbCggcG9seW5vbWlhbCwgcm9vdHNbaV0gKTsgfQorICBjb3V0IDw8ICJFdmFsdWF0aW9uIG9mIHRoZSBwb2x5bm9taWFsIGF0IHRoZSByb290czogIiA8PCBldmFsdWF0aW9uLnRyYW5zcG9zZSgpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL3NuaXBwZXRzL0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvZG9jL3NuaXBwZXRzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNDE1NzkKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC9kb2Mvc25pcHBldHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyOCBAQAorRklMRShHTE9CIHNuaXBwZXRzX1NSQ1MgIiouY3BwIikKKworQUREX0NVU1RPTV9UQVJHRVQodW5zdXBwb3J0ZWRfc25pcHBldHMpCisKK0ZPUkVBQ0goc25pcHBldF9zcmMgJHtzbmlwcGV0c19TUkNTfSkKKyAgR0VUX0ZJTEVOQU1FX0NPTVBPTkVOVChzbmlwcGV0ICR7c25pcHBldF9zcmN9IE5BTUVfV0UpCisgIFNFVChjb21waWxlX3NuaXBwZXRfdGFyZ2V0IGNvbXBpbGVfJHtzbmlwcGV0fSkKKyAgU0VUKGNvbXBpbGVfc25pcHBldF9zcmMgJHtjb21waWxlX3NuaXBwZXRfdGFyZ2V0fS5jcHApCisgIEZJTEUoUkVBRCAke3NuaXBwZXRfc3JjfSBzbmlwcGV0X3NvdXJjZV9jb2RlKQorICBDT05GSUdVUkVfRklMRSgke1BST0pFQ1RfU09VUkNFX0RJUn0vZG9jL3NuaXBwZXRzL2NvbXBpbGVfc25pcHBldC5jcHAuaW4KKyAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7Y29tcGlsZV9zbmlwcGV0X3NyY30pCisgIEFERF9FWEVDVVRBQkxFKCR7Y29tcGlsZV9zbmlwcGV0X3RhcmdldH0KKyAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7Y29tcGlsZV9zbmlwcGV0X3NyY30pCisgIGlmKEVJR0VOX1NUQU5EQVJEX0xJQlJBUklFU19UT19MSU5LX1RPKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke2NvbXBpbGVfc25pcHBldF90YXJnZXR9ICR7RUlHRU5fU1RBTkRBUkRfTElCUkFSSUVTX1RPX0xJTktfVE99KQorICBlbmRpZigpCisgIEdFVF9UQVJHRVRfUFJPUEVSVFkoY29tcGlsZV9zbmlwcGV0X2V4ZWN1dGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAke2NvbXBpbGVfc25pcHBldF90YXJnZXR9IExPQ0FUSU9OKQorICBBRERfQ1VTVE9NX0NPTU1BTkQoCisgICAgVEFSR0VUICR7Y29tcGlsZV9zbmlwcGV0X3RhcmdldH0KKyAgICBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke2NvbXBpbGVfc25pcHBldF9leGVjdXRhYmxlfQorICAgIEFSR1MgPiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke3NuaXBwZXR9Lm91dAorICApCisgIEFERF9ERVBFTkRFTkNJRVModW5zdXBwb3J0ZWRfc25pcHBldHMgJHtjb21waWxlX3NuaXBwZXRfdGFyZ2V0fSkKKyAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke2NvbXBpbGVfc25pcHBldF9zcmN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUSUVTIE9CSkVDVF9ERVBFTkRTICR7c25pcHBldF9zcmN9KQorRU5ERk9SRUFDSChzbmlwcGV0X3NyYykKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvQlZILmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvQlZILmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjViMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9CVkguY3BwCkBAIC0wLDAgKzEsMjIyIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBJbHlhIEJhcmFuIDxpYmFyYW5AbWl0LmVkdT4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8RWlnZW4vU3RkVmVjdG9yPgorI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0JWSD4KKworbmFtZXNwYWNlIEVpZ2VuIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPiBBbGlnbmVkQm94PFNjYWxhciwgRGltPiBib3VuZGluZ19ib3goY29uc3QgTWF0cml4PFNjYWxhciwgRGltLCAxPiAmdikgeyByZXR1cm4gQWxpZ25lZEJveDxTY2FsYXIsIERpbT4odik7IH0KKworfQorCisKK3RlbXBsYXRlPGludCBEaW0+CitzdHJ1Y3QgQmFsbAoreworRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FV19JRl9WRUNUT1JJWkFCTEVfRklYRURfU0laRShkb3VibGUsIERpbSkKKworICB0eXBlZGVmIE1hdHJpeDxkb3VibGUsIERpbSwgMT4gVmVjdG9yVHlwZTsKKworICBCYWxsKCkge30KKyAgQmFsbChjb25zdCBWZWN0b3JUeXBlICZjLCBkb3VibGUgcikgOiBjZW50ZXIoYyksIHJhZGl1cyhyKSB7fQorCisgIFZlY3RvclR5cGUgY2VudGVyOworICBkb3VibGUgcmFkaXVzOworfTsKK3RlbXBsYXRlPGludCBEaW0+IEFsaWduZWRCb3g8ZG91YmxlLCBEaW0+IGJvdW5kaW5nX2JveChjb25zdCBCYWxsPERpbT4gJmIpCit7IHJldHVybiBBbGlnbmVkQm94PGRvdWJsZSwgRGltPihiLmNlbnRlci5hcnJheSgpIC0gYi5yYWRpdXMsIGIuY2VudGVyLmFycmF5KCkgKyBiLnJhZGl1cyk7IH0KKworaW5saW5lIGRvdWJsZSBTUVIoZG91YmxlIHgpIHsgcmV0dXJuIHggKiB4OyB9CisKK3RlbXBsYXRlPGludCBEaW0+CitzdHJ1Y3QgQmFsbFBvaW50U3R1ZmYgLy90aGlzIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBiZSBib3RoIGFuIGludGVyc2VjdG9yIGFuZCBhIG1pbmltaXplciwgYm90aCBmb3IgYSBiYWxsIGFuZCBhIHBvaW50IGFuZCBmb3IgdHdvIHRyZWVzCit7CisgIHR5cGVkZWYgZG91YmxlIFNjYWxhcjsKKyAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCBEaW0sIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgQmFsbDxEaW0+IEJhbGxUeXBlOworICB0eXBlZGVmIEFsaWduZWRCb3g8ZG91YmxlLCBEaW0+IEJveFR5cGU7CisKKyAgQmFsbFBvaW50U3R1ZmYoKSA6IGNhbGxzKDApLCBjb3VudCgwKSB7fQorICBCYWxsUG9pbnRTdHVmZihjb25zdCBWZWN0b3JUeXBlICZpblApIDogcChpblApLCBjYWxscygwKSwgY291bnQoMCkge30KKworCisgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lKGNvbnN0IEJveFR5cGUgJnIpIHsgKytjYWxsczsgcmV0dXJuIHIuY29udGFpbnMocCk7IH0KKyAgYm9vbCBpbnRlcnNlY3RPYmplY3QoY29uc3QgQmFsbFR5cGUgJmIpIHsKKyAgICArK2NhbGxzOworICAgIGlmKChiLmNlbnRlciAtIHApLnNxdWFyZWROb3JtKCkgPCBTUVIoYi5yYWRpdXMpKQorICAgICAgKytjb3VudDsKKyAgICByZXR1cm4gZmFsc2U7IC8vY29udGludWUKKyAgfQorCisgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lVm9sdW1lKGNvbnN0IEJveFR5cGUgJnIxLCBjb25zdCBCb3hUeXBlICZyMikgeyArK2NhbGxzOyByZXR1cm4gIShyMS5pbnRlcnNlY3Rpb24ocjIpKS5pc051bGwoKTsgfQorICBib29sIGludGVyc2VjdFZvbHVtZU9iamVjdChjb25zdCBCb3hUeXBlICZyLCBjb25zdCBCYWxsVHlwZSAmYikgeyArK2NhbGxzOyByZXR1cm4gci5zcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShiLmNlbnRlcikgPCBTUVIoYi5yYWRpdXMpOyB9CisgIGJvb2wgaW50ZXJzZWN0T2JqZWN0Vm9sdW1lKGNvbnN0IEJhbGxUeXBlICZiLCBjb25zdCBCb3hUeXBlICZyKSB7ICsrY2FsbHM7IHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKGIuY2VudGVyKSA8IFNRUihiLnJhZGl1cyk7IH0KKyAgYm9vbCBpbnRlcnNlY3RPYmplY3RPYmplY3QoY29uc3QgQmFsbFR5cGUgJmIxLCBjb25zdCBCYWxsVHlwZSAmYjIpeworICAgICsrY2FsbHM7CisgICAgaWYoKGIxLmNlbnRlciAtIGIyLmNlbnRlcikubm9ybSgpIDwgYjEucmFkaXVzICsgYjIucmFkaXVzKQorICAgICAgKytjb3VudDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCBpbnRlcnNlY3RWb2x1bWVPYmplY3QoY29uc3QgQm94VHlwZSAmciwgY29uc3QgVmVjdG9yVHlwZSAmdikgeyArK2NhbGxzOyByZXR1cm4gci5jb250YWlucyh2KTsgfQorICBib29sIGludGVyc2VjdE9iamVjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYiwgY29uc3QgVmVjdG9yVHlwZSAmdil7CisgICAgKytjYWxsczsKKyAgICBpZigoYi5jZW50ZXIgLSB2KS5zcXVhcmVkTm9ybSgpIDwgU1FSKGIucmFkaXVzKSkKKyAgICAgICsrY291bnQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZG91YmxlIG1pbmltdW1PblZvbHVtZShjb25zdCBCb3hUeXBlICZyKSB7ICsrY2FsbHM7IHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHApOyB9CisgIGRvdWJsZSBtaW5pbXVtT25PYmplY3QoY29uc3QgQmFsbFR5cGUgJmIpIHsgKytjYWxsczsgcmV0dXJuIChzdGQ6Om1heCkoMC4sIChiLmNlbnRlciAtIHApLnNxdWFyZWROb3JtKCkgLSBTUVIoYi5yYWRpdXMpKTsgfQorICBkb3VibGUgbWluaW11bU9uVm9sdW1lVm9sdW1lKGNvbnN0IEJveFR5cGUgJnIxLCBjb25zdCBCb3hUeXBlICZyMikgeyArK2NhbGxzOyByZXR1cm4gcjEuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UocjIpOyB9CisgIGRvdWJsZSBtaW5pbXVtT25Wb2x1bWVPYmplY3QoY29uc3QgQm94VHlwZSAmciwgY29uc3QgQmFsbFR5cGUgJmIpIHsgKytjYWxsczsgcmV0dXJuIFNRUigoc3RkOjptYXgpKDAuLCByLmV4dGVyaW9yRGlzdGFuY2UoYi5jZW50ZXIpIC0gYi5yYWRpdXMpKTsgfQorICBkb3VibGUgbWluaW11bU9uT2JqZWN0Vm9sdW1lKGNvbnN0IEJhbGxUeXBlICZiLCBjb25zdCBCb3hUeXBlICZyKSB7ICsrY2FsbHM7IHJldHVybiBTUVIoKHN0ZDo6bWF4KSgwLiwgci5leHRlcmlvckRpc3RhbmNlKGIuY2VudGVyKSAtIGIucmFkaXVzKSk7IH0KKyAgZG91YmxlIG1pbmltdW1Pbk9iamVjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYjEsIGNvbnN0IEJhbGxUeXBlICZiMil7ICsrY2FsbHM7IHJldHVybiBTUVIoKHN0ZDo6bWF4KSgwLiwgKGIxLmNlbnRlciAtIGIyLmNlbnRlcikubm9ybSgpIC0gYjEucmFkaXVzIC0gYjIucmFkaXVzKSk7IH0KKyAgZG91YmxlIG1pbmltdW1PblZvbHVtZU9iamVjdChjb25zdCBCb3hUeXBlICZyLCBjb25zdCBWZWN0b3JUeXBlICZ2KSB7ICsrY2FsbHM7IHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHYpOyB9CisgIGRvdWJsZSBtaW5pbXVtT25PYmplY3RPYmplY3QoY29uc3QgQmFsbFR5cGUgJmIsIGNvbnN0IFZlY3RvclR5cGUgJnYpeyArK2NhbGxzOyByZXR1cm4gU1FSKChzdGQ6Om1heCkoMC4sIChiLmNlbnRlciAtIHYpLm5vcm0oKSAtIGIucmFkaXVzKSk7IH0KKworICBWZWN0b3JUeXBlIHA7CisgIGludCBjYWxsczsKKyAgaW50IGNvdW50OworfTsKKworCit0ZW1wbGF0ZTxpbnQgRGltPgorc3RydWN0IFRyZWVUZXN0Cit7CisgIHR5cGVkZWYgTWF0cml4PGRvdWJsZSwgRGltLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFZlY3RvclR5cGUsIGFsaWduZWRfYWxsb2NhdG9yPFZlY3RvclR5cGU+ID4gVmVjdG9yVHlwZUxpc3Q7CisgIHR5cGVkZWYgQmFsbDxEaW0+IEJhbGxUeXBlOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEJhbGxUeXBlLCBhbGlnbmVkX2FsbG9jYXRvcjxCYWxsVHlwZT4gPiBCYWxsVHlwZUxpc3Q7CisgIHR5cGVkZWYgQWxpZ25lZEJveDxkb3VibGUsIERpbT4gQm94VHlwZTsKKworICB2b2lkIHRlc3RJbnRlcnNlY3QxKCkKKyAgeworICAgIEJhbGxUeXBlTGlzdCBiOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCA1MDA7ICsraSkgeworICAgICAgICBiLnB1c2hfYmFjayhCYWxsVHlwZShWZWN0b3JUeXBlOjpSYW5kb20oKSwgMC41ICogaW50ZXJuYWw6OnJhbmRvbSgwLiwgMS4pKSk7CisgICAgfQorICAgIEtkQlZIPGRvdWJsZSwgRGltLCBCYWxsVHlwZT4gdHJlZShiLmJlZ2luKCksIGIuZW5kKCkpOworCisgICAgVmVjdG9yVHlwZSBwdCA9IFZlY3RvclR5cGU6OlJhbmRvbSgpOworICAgIEJhbGxQb2ludFN0dWZmPERpbT4gaTEocHQpLCBpMihwdCk7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKQorICAgICAgaTEuaW50ZXJzZWN0T2JqZWN0KGJbaV0pOworCisgICAgQlZJbnRlcnNlY3QodHJlZSwgaTIpOworCisgICAgVkVSSUZZKGkxLmNvdW50ID09IGkyLmNvdW50KTsKKyAgfQorCisgIHZvaWQgdGVzdE1pbmltaXplMSgpCisgIHsKKyAgICBCYWxsVHlwZUxpc3QgYjsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgNTAwOyArK2kpIHsKKyAgICAgICAgYi5wdXNoX2JhY2soQmFsbFR5cGUoVmVjdG9yVHlwZTo6UmFuZG9tKCksIDAuMDEgKiBpbnRlcm5hbDo6cmFuZG9tKDAuLCAxLikpKTsKKyAgICB9CisgICAgS2RCVkg8ZG91YmxlLCBEaW0sIEJhbGxUeXBlPiB0cmVlKGIuYmVnaW4oKSwgYi5lbmQoKSk7CisKKyAgICBWZWN0b3JUeXBlIHB0ID0gVmVjdG9yVHlwZTo6UmFuZG9tKCk7CisgICAgQmFsbFBvaW50U3R1ZmY8RGltPiBpMShwdCksIGkyKHB0KTsKKworICAgIGRvdWJsZSBtMSA9IChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCkoKSwgbTIgPSBtMTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCAoaW50KWIuc2l6ZSgpOyArK2kpCisgICAgICBtMSA9IChzdGQ6Om1pbikobTEsIGkxLm1pbmltdW1Pbk9iamVjdChiW2ldKSk7CisKKyAgICBtMiA9IEJWTWluaW1pemUodHJlZSwgaTIpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTIpOworICB9CisKKyAgdm9pZCB0ZXN0SW50ZXJzZWN0MigpCisgIHsKKyAgICBCYWxsVHlwZUxpc3QgYjsKKyAgICBWZWN0b3JUeXBlTGlzdCB2OworCisgICAgZm9yKGludCBpID0gMDsgaSA8IDUwOyArK2kpIHsKKyAgICAgICAgYi5wdXNoX2JhY2soQmFsbFR5cGUoVmVjdG9yVHlwZTo6UmFuZG9tKCksIDAuNSAqIGludGVybmFsOjpyYW5kb20oMC4sIDEuKSkpOworICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgMzsgKytqKQorICAgICAgICAgICAgdi5wdXNoX2JhY2soVmVjdG9yVHlwZTo6UmFuZG9tKCkpOworICAgIH0KKworICAgIEtkQlZIPGRvdWJsZSwgRGltLCBCYWxsVHlwZT4gdHJlZShiLmJlZ2luKCksIGIuZW5kKCkpOworICAgIEtkQlZIPGRvdWJsZSwgRGltLCBWZWN0b3JUeXBlPiB2VHJlZSh2LmJlZ2luKCksIHYuZW5kKCkpOworCisgICAgQmFsbFBvaW50U3R1ZmY8RGltPiBpMSwgaTI7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKQorICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgKGludCl2LnNpemUoKTsgKytqKQorICAgICAgICAgICAgaTEuaW50ZXJzZWN0T2JqZWN0T2JqZWN0KGJbaV0sIHZbal0pOworCisgICAgQlZJbnRlcnNlY3QodHJlZSwgdlRyZWUsIGkyKTsKKworICAgIFZFUklGWShpMS5jb3VudCA9PSBpMi5jb3VudCk7CisgIH0KKworICB2b2lkIHRlc3RNaW5pbWl6ZTIoKQorICB7CisgICAgQmFsbFR5cGVMaXN0IGI7CisgICAgVmVjdG9yVHlwZUxpc3QgdjsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCA1MDsgKytpKSB7CisgICAgICAgIGIucHVzaF9iYWNrKEJhbGxUeXBlKFZlY3RvclR5cGU6OlJhbmRvbSgpLCAxZS03ICsgMWUtNiAqIGludGVybmFsOjpyYW5kb20oMC4sIDEuKSkpOworICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgMzsgKytqKQorICAgICAgICAgICAgdi5wdXNoX2JhY2soVmVjdG9yVHlwZTo6UmFuZG9tKCkpOworICAgIH0KKworICAgIEtkQlZIPGRvdWJsZSwgRGltLCBCYWxsVHlwZT4gdHJlZShiLmJlZ2luKCksIGIuZW5kKCkpOworICAgIEtkQlZIPGRvdWJsZSwgRGltLCBWZWN0b3JUeXBlPiB2VHJlZSh2LmJlZ2luKCksIHYuZW5kKCkpOworCisgICAgQmFsbFBvaW50U3R1ZmY8RGltPiBpMSwgaTI7CisKKyAgICBkb3VibGUgbTEgPSAoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgpKCksIG0yID0gbTE7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKQorICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgKGludCl2LnNpemUoKTsgKytqKQorICAgICAgICAgICAgbTEgPSAoc3RkOjptaW4pKG0xLCBpMS5taW5pbXVtT25PYmplY3RPYmplY3QoYltpXSwgdltqXSkpOworCisgICAgbTIgPSBCVk1pbmltaXplKHRyZWUsIHZUcmVlLCBpMik7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMik7CisgIH0KK307CisKKwordm9pZCB0ZXN0X0JWSCgpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisjaWZkZWYgRUlHRU5fVEVTVF9QQVJUXzEKKyAgICBUcmVlVGVzdDwyPiB0ZXN0MjsKKyAgICBDQUxMX1NVQlRFU1QodGVzdDIudGVzdEludGVyc2VjdDEoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3QyLnRlc3RNaW5pbWl6ZTEoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3QyLnRlc3RJbnRlcnNlY3QyKCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0Mi50ZXN0TWluaW1pemUyKCkpOworI2VuZGlmCisKKyNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMgorICAgIFRyZWVUZXN0PDM+IHRlc3QzOworICAgIENBTExfU1VCVEVTVCh0ZXN0My50ZXN0SW50ZXJzZWN0MSgpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdDMudGVzdE1pbmltaXplMSgpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdDMudGVzdEludGVyc2VjdDIoKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3QzLnRlc3RNaW5pbWl6ZTIoKSk7CisjZW5kaWYKKworI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8zCisgICAgVHJlZVRlc3Q8ND4gdGVzdDQ7CisgICAgQ0FMTF9TVUJURVNUKHRlc3Q0LnRlc3RJbnRlcnNlY3QxKCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0NC50ZXN0TWluaW1pemUxKCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0NC50ZXN0SW50ZXJzZWN0MigpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdDQudGVzdE1pbmltaXplMigpKTsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvdW5zdXBwb3J0ZWQvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzRiMTUxCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDg3IEBACisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vdGVzdCAuLi8uLi91bnN1cHBvcnRlZCAuLi8uLi9FaWdlbiAKKyAgICAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uLy4uL3Rlc3QpCisKK2ZpbmRfcGFja2FnZShHb29nbGVIYXNoKQoraWYoR09PR0xFSEFTSF9GT1VORCkKKyAgYWRkX2RlZmluaXRpb25zKCItREVJR0VOX0dPT0dMRUhBU0hfU1VQUE9SVCIpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtHT09HTEVIQVNIX0lOQ0xVREVTfSkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX1RFU1RFRF9CQUNLRU5EUyAgIkdvb2dsZUhhc2gsICIpCitlbHNlKEdPT0dMRUhBU0hfRk9VTkQpCisgIGVpX2FkZF9wcm9wZXJ0eShFSUdFTl9NSVNTSU5HX0JBQ0tFTkRTICAiR29vZ2xlSGFzaCwgIikKK2VuZGlmKEdPT0dMRUhBU0hfRk9VTkQpCisKK2ZpbmRfcGFja2FnZShBZG9sYykKK2lmKEFET0xDX0ZPVU5EKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7QURPTENfSU5DTFVERVN9KQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVEVEX0JBQ0tFTkRTICJBZG9sYywgIikKKyAgZWlfYWRkX3Rlc3QoZm9yd2FyZF9hZG9sYyAiIiAke0FET0xDX0xJQlJBUklFU30pCitlbHNlKEFET0xDX0ZPVU5EKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAiQWRvbGMsICIpCitlbmRpZihBRE9MQ19GT1VORCkKKworIyB0aGlzIHRlc3Qgc2VlbXMgdG8gbmV2ZXIgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWwgb24geDg3LCBzbyBpcyBjb25zaWRlcmVkIHRvIGNvbnRhaW4gYSBGUC1yZWxhdGVkIGJ1Zy4KKyMgc2VlIHRocmVhZDogIm5vbi1saW5lYXIgb3B0aW1pemF0aW9uIHRlc3Qgc3VtbWFyeSIKKyNlaV9hZGRfdGVzdChOb25MaW5lYXJPcHRpbWl6YXRpb24pCisKK2VpX2FkZF90ZXN0KE51bWVyaWNhbERpZmYpCitlaV9hZGRfdGVzdChhdXRvZGlmZikKKworaWYgKE5PVCBDTUFLRV9DWFhfQ09NUElMRVIgTUFUQ0hFUyAiY2xhbmdcXCtcXCskIikKK2VpX2FkZF90ZXN0KEJWSCkKK2VuZGlmKCkKKworZWlfYWRkX3Rlc3QobWF0cml4X2V4cG9uZW50aWFsKQorZWlfYWRkX3Rlc3QobWF0cml4X2Z1bmN0aW9uKQorZWlfYWRkX3Rlc3QobWF0cml4X3NxdWFyZV9yb290KQorZWlfYWRkX3Rlc3QoYWxpZ25lZHZlY3RvcjMpCitlaV9hZGRfdGVzdChGRlQpCisKK2ZpbmRfcGFja2FnZShNUEZSIDIuMy4wKQorZmluZF9wYWNrYWdlKEdNUCkKK2lmKE1QRlJfRk9VTkQpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtNUEZSX0lOQ0xVREVTfSAuL21wcmVhbCkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX1RFU1RFRF9CQUNLRU5EUyAiTVBGUiBDKyssICIpCisgIHNldChFSUdFTl9NUEZSX1RFU1RfTElCUkFSSUVTICR7TVBGUl9MSUJSQVJJRVN9ICR7R01QX0xJQlJBUklFU30pCisgIGVpX2FkZF90ZXN0KG1wcmVhbF9zdXBwb3J0ICIiICIke0VJR0VOX01QRlJfVEVTVF9MSUJSQVJJRVN9IiApCitlbHNlKCkKKyAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX01JU1NJTkdfQkFDS0VORFMgIk1QRlIgQysrLCAiKQorZW5kaWYoKQorCitlaV9hZGRfdGVzdChzcGFyc2VfZXh0cmEgICAiIiAiIikKKworZmluZF9wYWNrYWdlKEZGVFcpCitpZihGRlRXX0ZPVU5EKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fVEVTVEVEX0JBQ0tFTkRTICJmZnR3LCAiKQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCAke0ZGVFdfSU5DTFVERVN9ICkKKyAgaWYoRkZUV0xfTElCKQorICAgIGVpX2FkZF90ZXN0KEZGVFcgICItREVJR0VOX0ZGVFdfREVGQVVMVCAtREVJR0VOX0hBU19GRlRXTCIgIiR7RkZUV19MSUJSQVJJRVN9IiApCisgIGVsc2UoKQorICAgIGVpX2FkZF90ZXN0KEZGVFcgICItREVJR0VOX0ZGVFdfREVGQVVMVCIgIiR7RkZUV19MSUJSQVJJRVN9IiApCisgIGVuZGlmKCkKK2Vsc2UoKQorICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAiZmZ0dywgIikKK2VuZGlmKCkKKworb3B0aW9uKEVJR0VOX1RFU1RfTk9fT1BFTkdMICJEaXNhYmxlIE9wZW5HTCBzdXBwb3J0IGluIHVuaXQgdGVzdHMiIE9GRikKK2lmKE5PVCBFSUdFTl9URVNUX05PX09QRU5HTCkKKyAgZmluZF9wYWNrYWdlKE9wZW5HTCkKKyAgZmluZF9wYWNrYWdlKEdMVVQpCisgIGZpbmRfcGFja2FnZShHTEVXKQorICBpZihPUEVOR0xfRk9VTkQgQU5EIEdMVVRfRk9VTkQgQU5EIEdMRVdfRk9VTkQpCisgICAgZWlfYWRkX3Byb3BlcnR5KEVJR0VOX1RFU1RFRF9CQUNLRU5EUyAiT3BlbkdMLCAiKQorICAgIHNldChFSUdFTl9HTF9MSUIgJHtHTFVUX0xJQlJBUklFU30gJHtHTEVXX0xJQlJBUklFU30pCisgICAgZWlfYWRkX3Rlc3Qob3Blbmdsc3VwcG9ydCAgIiIgIiR7RUlHRU5fR0xfTElCfSIgKQorICBlbHNlKCkKKyAgICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAiT3BlbkdMLCAiKQorICBlbmRpZigpCitlbHNlKCkKKyAgICBlaV9hZGRfcHJvcGVydHkoRUlHRU5fTUlTU0lOR19CQUNLRU5EUyAiT3BlbkdMLCAiKQorZW5kaWYoKQorCitlaV9hZGRfdGVzdChwb2x5bm9taWFsc29sdmVyKQorZWlfYWRkX3Rlc3QocG9seW5vbWlhbHV0aWxzKQorZWlfYWRkX3Rlc3Qoa3JvbmVja2VyX3Byb2R1Y3QpCitlaV9hZGRfdGVzdChzcGxpbmVzKQorZWlfYWRkX3Rlc3QoZ21yZXMpCisKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvRkZULmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvRkZULmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWM4N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9GRlQuY3BwCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSB0ZXN0X0ZGVFcgdGVzdF9GRlQKKyNpbmNsdWRlICJGRlRXLmNwcCIKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvRkZUVy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L0ZGVFcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2JmMjcKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L0ZGVFcuY3BwCkBAIC0wLDAgKzEsMjY1IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBNYXJrIEJvcmdlcmRpbmcgbWFyayBhIGJvcmdlcmRpbmcgbmV0CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0ZGVD4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IAorc3RkOjpjb21wbGV4PFQ+IFJhbmRvbUNweCgpIHsgcmV0dXJuIHN0ZDo6Y29tcGxleDxUPiggKFQpKHJhbmQoKS8oVClSQU5EX01BWCAtIC41KSwgKFQpKHJhbmQoKS8oVClSQU5EX01BWCAtIC41KSApOyB9CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKK2Zsb2F0IG5vcm0oZmxvYXQgeCkge3JldHVybiB4Kng7fQorZG91YmxlIG5vcm0oZG91YmxlIHgpIHtyZXR1cm4geCp4O30KK2xvbmcgZG91YmxlIG5vcm0obG9uZyBkb3VibGUgeCkge3JldHVybiB4Kng7fQorCit0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQ+Citjb21wbGV4PGxvbmcgZG91YmxlPiAgcHJvbW90ZShjb21wbGV4PFQ+IHgpIHsgcmV0dXJuIGNvbXBsZXg8bG9uZyBkb3VibGU+KHgucmVhbCgpLHguaW1hZygpKTsgfQorCitjb21wbGV4PGxvbmcgZG91YmxlPiAgcHJvbW90ZShmbG9hdCB4KSB7IHJldHVybiBjb21wbGV4PGxvbmcgZG91YmxlPiggeCk7IH0KK2NvbXBsZXg8bG9uZyBkb3VibGU+ICBwcm9tb3RlKGRvdWJsZSB4KSB7IHJldHVybiBjb21wbGV4PGxvbmcgZG91YmxlPiggeCk7IH0KK2NvbXBsZXg8bG9uZyBkb3VibGU+ICBwcm9tb3RlKGxvbmcgZG91YmxlIHgpIHsgcmV0dXJuIGNvbXBsZXg8bG9uZyBkb3VibGU+KCB4KTsgfQorICAgIAorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZUMSx0eXBlbmFtZSBWVDI+CisgICAgbG9uZyBkb3VibGUgZmZ0X3Jtc2UoIGNvbnN0IFZUMSAmIGZmdGJ1Zixjb25zdCBWVDIgJiB0aW1lYnVmKQorICAgIHsKKyAgICAgICAgbG9uZyBkb3VibGUgdG90YWxwb3dlcj0wOworICAgICAgICBsb25nIGRvdWJsZSBkaWZwb3dlcj0wOworICAgICAgICBsb25nIGRvdWJsZSBwaSA9IGFjb3MoKGxvbmcgZG91YmxlKS0xICk7CisgICAgICAgIGZvciAoc2l6ZV90IGswPTA7azA8KHNpemVfdClmZnRidWYuc2l6ZSgpOysrazApIHsKKyAgICAgICAgICAgIGNvbXBsZXg8bG9uZyBkb3VibGU+IGFjYyA9IDA7CisgICAgICAgICAgICBsb25nIGRvdWJsZSBwaGluYyA9IC0yLiprMCogcGkgLyB0aW1lYnVmLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsxPTA7azE8KHNpemVfdCl0aW1lYnVmLnNpemUoKTsrK2sxKSB7CisgICAgICAgICAgICAgICAgYWNjICs9ICBwcm9tb3RlKCB0aW1lYnVmW2sxXSApICogZXhwKCBjb21wbGV4PGxvbmcgZG91YmxlPigwLGsxKnBoaW5jKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWxwb3dlciArPSBub3JtKGFjYyk7CisgICAgICAgICAgICBjb21wbGV4PGxvbmcgZG91YmxlPiB4ID0gcHJvbW90ZShmZnRidWZbazBdKTsgCisgICAgICAgICAgICBjb21wbGV4PGxvbmcgZG91YmxlPiBkaWYgPSBhY2MgLSB4OworICAgICAgICAgICAgZGlmcG93ZXIgKz0gbm9ybShkaWYpOworICAgICAgICAgICAgLy9jZXJyIDw8IGswIDw8ICJcdCIgPDwgYWNjIDw8ICJcdCIgPDwgIHggPDwgIlx0IiA8PCBzcXJ0KG5vcm0oZGlmKSkgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBjZXJyIDw8ICJybXNlOiIgPDwgc3FydChkaWZwb3dlci90b3RhbHBvd2VyKSA8PCBlbmRsOworICAgICAgICByZXR1cm4gc3FydChkaWZwb3dlci90b3RhbHBvd2VyKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVlQxLHR5cGVuYW1lIFZUMj4KKyAgICBsb25nIGRvdWJsZSBkaWZfcm1zZSggY29uc3QgVlQxIGJ1ZjEsY29uc3QgVlQyIGJ1ZjIpCisgICAgeworICAgICAgICBsb25nIGRvdWJsZSB0b3RhbHBvd2VyPTA7CisgICAgICAgIGxvbmcgZG91YmxlIGRpZnBvd2VyPTA7CisgICAgICAgIHNpemVfdCBuID0gKG1pbikoIGJ1ZjEuc2l6ZSgpLGJ1ZjIuc2l6ZSgpICk7CisgICAgICAgIGZvciAoc2l6ZV90IGs9MDtrPG47KytrKSB7CisgICAgICAgICAgICB0b3RhbHBvd2VyICs9IChub3JtKCBidWYxW2tdICkgKyBub3JtKGJ1ZjJba10pICkvMi47CisgICAgICAgICAgICBkaWZwb3dlciArPSBub3JtKGJ1ZjFba10gLSBidWYyW2tdKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3FydChkaWZwb3dlci90b3RhbHBvd2VyKTsKKyAgICB9CisKK2VudW0geyBTdGRWZWN0b3JDb250YWluZXIsIEVpZ2VuVmVjdG9yQ29udGFpbmVyIH07CisKK3RlbXBsYXRlPGludCBDb250YWluZXIsIHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IFZlY3RvclR5cGU7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gc3RydWN0IFZlY3RvclR5cGU8U3RkVmVjdG9yQ29udGFpbmVyLFNjYWxhcj4KK3sKKyAgdHlwZWRlZiB2ZWN0b3I8U2NhbGFyPiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgVmVjdG9yVHlwZTxFaWdlblZlY3RvckNvbnRhaW5lcixTY2FsYXI+Cit7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8aW50IENvbnRhaW5lciwgdHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9zY2FsYXJfZ2VuZXJpYyhpbnQgbmZmdCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZGVDxUPjo6Q29tcGxleCBDb21wbGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgRkZUPFQ+OjpTY2FsYXIgU2NhbGFyOworICAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTxDb250YWluZXIsU2NhbGFyPjo6dHlwZSBTY2FsYXJWZWN0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlPENvbnRhaW5lcixDb21wbGV4Pjo6dHlwZSBDb21wbGV4VmVjdG9yOworCisgICAgRkZUPFQ+IGZmdDsKKyAgICBTY2FsYXJWZWN0b3IgdGJ1ZihuZmZ0KTsKKyAgICBDb21wbGV4VmVjdG9yIGZyZXFCdWY7CisgICAgZm9yIChpbnQgaz0wO2s8bmZmdDsrK2spCisgICAgICAgIHRidWZba109IChUKSggcmFuZCgpLyhkb3VibGUpUkFORF9NQVggLSAuNSk7CisKKyAgICAvLyBtYWtlIHN1cmUgaXQgRE9FU04nVCBnaXZlIHRoZSByaWdodCBmdWxsIHNwZWN0cnVtIGFuc3dlcgorICAgIC8vIGlmIHdlJ3ZlIGFza2VkIGZvciBoYWxmLXNwZWN0cnVtCisgICAgZmZ0LlNldEZsYWcoZmZ0LkhhbGZTcGVjdHJ1bSApOworICAgIGZmdC5md2QoIGZyZXFCdWYsdGJ1Zik7CisgICAgVkVSSUZZKChzaXplX3QpZnJlcUJ1Zi5zaXplKCkgPT0gKHNpemVfdCkoIChuZmZ0Pj4xKSsxKSApOworICAgIFZFUklGWSggZmZ0X3Jtc2UoZnJlcUJ1Zix0YnVmKSA8IHRlc3RfcHJlY2lzaW9uPFQ+KCkgICk7Ly8gZ3Jvc3MgY2hlY2sKKworICAgIGZmdC5DbGVhckZsYWcoZmZ0LkhhbGZTcGVjdHJ1bSApOworICAgIGZmdC5md2QoIGZyZXFCdWYsdGJ1Zik7CisgICAgVkVSSUZZKCAoc2l6ZV90KWZyZXFCdWYuc2l6ZSgpID09IChzaXplX3QpbmZmdCk7CisgICAgVkVSSUZZKCBmZnRfcm1zZShmcmVxQnVmLHRidWYpIDwgdGVzdF9wcmVjaXNpb248VD4oKSAgKTsvLyBncm9zcyBjaGVjaworCisgICAgaWYgKG5mZnQmMSkKKyAgICAgICAgcmV0dXJuOyAvLyBvZGQgRkZUcyBnZXQgdGhlIHdyb25nIHNpemUgaW52ZXJzZSBGRlQKKworICAgIFNjYWxhclZlY3RvciB0YnVmMjsKKyAgICBmZnQuaW52KCB0YnVmMiAsIGZyZXFCdWYpOworICAgIFZFUklGWSggZGlmX3Jtc2UodGJ1Zix0YnVmMikgPCB0ZXN0X3ByZWNpc2lvbjxUPigpICApOy8vIGdyb3NzIGNoZWNrCisKKworICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBVbnNjYWxlZCBmbGFnIHRha2VzIGVmZmVjdAorICAgIFNjYWxhclZlY3RvciB0YnVmMzsKKyAgICBmZnQuU2V0RmxhZyhmZnQuVW5zY2FsZWQpOworCisgICAgZmZ0LmludiggdGJ1ZjMgLCBmcmVxQnVmKTsKKworICAgIGZvciAoaW50IGs9MDtrPG5mZnQ7KytrKQorICAgICAgICB0YnVmM1trXSAqPSBUKDEuL25mZnQpOworCisKKyAgICAvL2ZvciAoc2l6ZV90IGk9MDtpPChzaXplX3QpIHRidWYuc2l6ZSgpOysraSkKKyAgICAvLyAgICBjb3V0IDw8ICJmcmVxQnVmPSIgPDwgZnJlcUJ1ZltpXSA8PCAiIGluMj0iIDw8IHRidWYzW2ldIDw8ICIgLSAgaW49IiA8PCB0YnVmW2ldIDw8ICIgPT4gIiA8PCAodGJ1ZjNbaV0gLSB0YnVmW2ldICkgPDwgIGVuZGw7CisKKyAgICBWRVJJRlkoIGRpZl9ybXNlKHRidWYsdGJ1ZjMpIDwgdGVzdF9wcmVjaXNpb248VD4oKSAgKTsvLyBncm9zcyBjaGVjaworCisgICAgLy8gdmVyaWZ5IHRoYXQgQ2xlYXJGbGFnIHdvcmtzCisgICAgZmZ0LkNsZWFyRmxhZyhmZnQuVW5zY2FsZWQpOworICAgIGZmdC5pbnYoIHRidWYyICwgZnJlcUJ1Zik7CisgICAgVkVSSUZZKCBkaWZfcm1zZSh0YnVmLHRidWYyKSA8IHRlc3RfcHJlY2lzaW9uPFQ+KCkgICk7Ly8gZ3Jvc3MgY2hlY2sKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3Rfc2NhbGFyKGludCBuZmZ0KQoreworICB0ZXN0X3NjYWxhcl9nZW5lcmljPFN0ZFZlY3RvckNvbnRhaW5lcixUPihuZmZ0KTsKKyAgLy90ZXN0X3NjYWxhcl9nZW5lcmljPEVpZ2VuVmVjdG9yQ29udGFpbmVyLFQ+KG5mZnQpOworfQorCisKK3RlbXBsYXRlIDxpbnQgQ29udGFpbmVyLCB0eXBlbmFtZSBUPgordm9pZCB0ZXN0X2NvbXBsZXhfZ2VuZXJpYyhpbnQgbmZmdCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEZGVDxUPjo6Q29tcGxleCBDb21wbGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTxDb250YWluZXIsQ29tcGxleD46OnR5cGUgQ29tcGxleFZlY3RvcjsKKworICAgIEZGVDxUPiBmZnQ7CisKKyAgICBDb21wbGV4VmVjdG9yIGluYnVmKG5mZnQpOworICAgIENvbXBsZXhWZWN0b3Igb3V0YnVmOworICAgIENvbXBsZXhWZWN0b3IgYnVmMzsKKyAgICBmb3IgKGludCBrPTA7azxuZmZ0OysraykKKyAgICAgICAgaW5idWZba109IENvbXBsZXgoIChUKShyYW5kKCkvKGRvdWJsZSlSQU5EX01BWCAtIC41KSwgKFQpKHJhbmQoKS8oZG91YmxlKVJBTkRfTUFYIC0gLjUpICk7CisgICAgZmZ0LmZ3ZCggb3V0YnVmICwgaW5idWYpOworCisgICAgVkVSSUZZKCBmZnRfcm1zZShvdXRidWYsaW5idWYpIDwgdGVzdF9wcmVjaXNpb248VD4oKSAgKTsvLyBncm9zcyBjaGVjaworICAgIGZmdC5pbnYoIGJ1ZjMgLCBvdXRidWYpOworCisgICAgVkVSSUZZKCBkaWZfcm1zZShpbmJ1ZixidWYzKSA8IHRlc3RfcHJlY2lzaW9uPFQ+KCkgICk7Ly8gZ3Jvc3MgY2hlY2sKKworICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBVbnNjYWxlZCBmbGFnIHRha2VzIGVmZmVjdAorICAgIENvbXBsZXhWZWN0b3IgYnVmNDsKKyAgICBmZnQuU2V0RmxhZyhmZnQuVW5zY2FsZWQpOworICAgIGZmdC5pbnYoIGJ1ZjQgLCBvdXRidWYpOworICAgIGZvciAoaW50IGs9MDtrPG5mZnQ7KytrKQorICAgICAgICBidWY0W2tdICo9IFQoMS4vbmZmdCk7CisgICAgVkVSSUZZKCBkaWZfcm1zZShpbmJ1ZixidWY0KSA8IHRlc3RfcHJlY2lzaW9uPFQ+KCkgICk7Ly8gZ3Jvc3MgY2hlY2sKKworICAgIC8vIHZlcmlmeSB0aGF0IENsZWFyRmxhZyB3b3JrcworICAgIGZmdC5DbGVhckZsYWcoZmZ0LlVuc2NhbGVkKTsKKyAgICBmZnQuaW52KCBidWYzICwgb3V0YnVmKTsKKyAgICBWRVJJRlkoIGRpZl9ybXNlKGluYnVmLGJ1ZjMpIDwgdGVzdF9wcmVjaXNpb248VD4oKSAgKTsvLyBncm9zcyBjaGVjaworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9jb21wbGV4KGludCBuZmZ0KQoreworICB0ZXN0X2NvbXBsZXhfZ2VuZXJpYzxTdGRWZWN0b3JDb250YWluZXIsVD4obmZmdCk7CisgIHRlc3RfY29tcGxleF9nZW5lcmljPEVpZ2VuVmVjdG9yQ29udGFpbmVyLFQ+KG5mZnQpOworfQorLyoKK3RlbXBsYXRlIDx0eXBlbmFtZSBULGludCBucm93cyxpbnQgbmNvbHM+Cit2b2lkIHRlc3RfY29tcGxleDJkKCkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpGRlQ8VD46OkNvbXBsZXggQ29tcGxleDsKKyAgICBGRlQ8VD4gZmZ0OworICAgIEVpZ2VuOjpNYXRyaXg8Q29tcGxleCxucm93cyxuY29scz4gc3JjLHNyYzIsZHN0LGRzdDI7CisKKyAgICBzcmMgPSBFaWdlbjo6TWF0cml4PENvbXBsZXgsbnJvd3MsbmNvbHM+OjpSYW5kb20oKTsKKyAgICAvL3NyYyA9ICBFaWdlbjo6TWF0cml4PENvbXBsZXgsbnJvd3MsbmNvbHM+OjpJZGVudGl0eSgpOworCisgICAgZm9yIChpbnQgaz0wO2s8bmNvbHM7aysrKSB7CisgICAgICAgIEVpZ2VuOjpNYXRyaXg8Q29tcGxleCxucm93cywxPiB0bXBPdXQ7CisgICAgICAgIGZmdC5md2QoIHRtcE91dCxzcmMuY29sKGspICk7CisgICAgICAgIGRzdDIuY29sKGspID0gdG1wT3V0OworICAgIH0KKworICAgIGZvciAoaW50IGs9MDtrPG5yb3dzO2srKykgeworICAgICAgICBFaWdlbjo6TWF0cml4PENvbXBsZXgsMSxuY29scz4gdG1wT3V0OworICAgICAgICBmZnQuZndkKCB0bXBPdXQsICBkc3QyLnJvdyhrKSApOworICAgICAgICBkc3QyLnJvdyhrKSA9IHRtcE91dDsKKyAgICB9CisKKyAgICBmZnQuZndkMihkc3QuZGF0YSgpLHNyYy5kYXRhKCksbmNvbHMsbnJvd3MpOworICAgIGZmdC5pbnYyKHNyYzIuZGF0YSgpLGRzdC5kYXRhKCksbmNvbHMsbnJvd3MpOworICAgIFZFUklGWSggKHNyYy1zcmMyKS5ub3JtKCkgPCB0ZXN0X3ByZWNpc2lvbjxUPigpICk7CisgICAgVkVSSUZZKCAoZHN0LWRzdDIpLm5vcm0oKSA8IHRlc3RfcHJlY2lzaW9uPFQ+KCkgKTsKK30KKyovCisKKwordm9pZCB0ZXN0X3JldHVybl9ieV92YWx1ZShpbnQgbGVuKQoreworICAgIFZlY3RvclhmIGluOworICAgIFZlY3RvclhmIGluMTsKKyAgICBpbi5zZXRSYW5kb20oIGxlbiApOworICAgIFZlY3RvclhjZiBvdXQxLG91dDI7CisgICAgRkZUPGZsb2F0PiBmZnQ7CisKKyAgICBmZnQuU2V0RmxhZyhmZnQuSGFsZlNwZWN0cnVtICk7CisKKyAgICBmZnQuZndkKG91dDEsaW4pOworICAgIG91dDIgPSBmZnQuZndkKGluKTsKKyAgICBWRVJJRlkoIChvdXQxLW91dDIpLm5vcm0oKSA8IHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpICk7CisgICAgaW4xID0gZmZ0LmludihvdXQxKTsKKyAgICBWRVJJRlkoIChpbjEtaW4pLm5vcm0oKSA8IHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpICk7Cit9CisKK3ZvaWQgdGVzdF9GRlRXKCkKK3sKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X3JldHVybl9ieV92YWx1ZSgzMikgKTsKKyAgLy9DQUxMX1NVQlRFU1QoICggdGVzdF9jb21wbGV4MmQ8ZmxvYXQsNCw4PiAoKSApICk7IENBTExfU1VCVEVTVCggKCB0ZXN0X2NvbXBsZXgyZDxkb3VibGUsNCw4PiAoKSApICk7CisgIC8vQ0FMTF9TVUJURVNUKCAoIHRlc3RfY29tcGxleDJkPGxvbmcgZG91YmxlLDQsOD4gKCkgKSApOworICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxmbG9hdD4oMzIpICk7IENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGRvdWJsZT4oMzIpICk7IAorICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxmbG9hdD4oMjU2KSApOyBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxkb3VibGU+KDI1NikgKTsgCisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGZsb2F0PigzKjgpICk7IENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGRvdWJsZT4oMyo4KSApOyAKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8ZmxvYXQ+KDUqMzIpICk7IENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGRvdWJsZT4oNSozMikgKTsgCisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGZsb2F0PigyKjMqNCkgKTsgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8ZG91YmxlPigyKjMqNCkgKTsgCisgIENBTExfU1VCVEVTVCggdGVzdF9jb21wbGV4PGZsb2F0PigyKjMqNCo1KSApOyBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxkb3VibGU+KDIqMyo0KjUpICk7IAorICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxmbG9hdD4oMiozKjQqNSo3KSApOyBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxkb3VibGU+KDIqMyo0KjUqNykgKTsgCisKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxmbG9hdD4oMzIpICk7IENBTExfU1VCVEVTVCggdGVzdF9zY2FsYXI8ZG91YmxlPigzMikgKTsgCisgIENBTExfU1VCVEVTVCggdGVzdF9zY2FsYXI8ZmxvYXQ+KDQ1KSApOyBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGRvdWJsZT4oNDUpICk7IAorICBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGZsb2F0Pig1MCkgKTsgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxkb3VibGU+KDUwKSApOyAKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxmbG9hdD4oMjU2KSApOyBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGRvdWJsZT4oMjU2KSApOyAKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxmbG9hdD4oMiozKjQqNSo3KSApOyBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGRvdWJsZT4oMiozKjQqNSo3KSApOyAKKyAgCisgICNpZmRlZiBFSUdFTl9IQVNfRkZUV0wKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8bG9uZyBkb3VibGU+KDMyKSApOworICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxsb25nIGRvdWJsZT4oMjU2KSApOworICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxsb25nIGRvdWJsZT4oMyo4KSApOworICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxsb25nIGRvdWJsZT4oNSozMikgKTsKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8bG9uZyBkb3VibGU+KDIqMyo0KSApOworICBDQUxMX1NVQlRFU1QoIHRlc3RfY29tcGxleDxsb25nIGRvdWJsZT4oMiozKjQqNSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X2NvbXBsZXg8bG9uZyBkb3VibGU+KDIqMyo0KjUqNykgKTsKKyAgCisgIENBTExfU1VCVEVTVCggdGVzdF9zY2FsYXI8bG9uZyBkb3VibGU+KDMyKSApOworICBDQUxMX1NVQlRFU1QoIHRlc3Rfc2NhbGFyPGxvbmcgZG91YmxlPig0NSkgKTsKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxsb25nIGRvdWJsZT4oNTApICk7CisgIENBTExfU1VCVEVTVCggdGVzdF9zY2FsYXI8bG9uZyBkb3VibGU+KDI1NikgKTsKKyAgQ0FMTF9TVUJURVNUKCB0ZXN0X3NjYWxhcjxsb25nIGRvdWJsZT4oMiozKjQqNSo3KSApOworICAjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvTm9uTGluZWFyT3B0aW1pemF0aW9uLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvTm9uTGluZWFyT3B0aW1pemF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWIwNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9Ob25MaW5lYXJPcHRpbWl6YXRpb24uY3BwCkBAIC0wLDAgKzEsMTg2MSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhvbWFzIENhcHJpY2VsbGkgPG9yemVsQGZyZWVoYWNrZXJzLm9yZz4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTm9uTGluZWFyT3B0aW1pemF0aW9uPgorCisvLyBUaGlzIGRpc2FibGVzIHNvbWUgdXNlbGVzcyBXYXJuaW5ncyBvbiBNU1ZDLgorLy8gSXQgaXMgaW50ZW5kZWQgdG8gYmUgZG9uZSBmb3IgdGhpcyB0ZXN0IG9ubHkuCisjaW5jbHVkZSA8RWlnZW4vc3JjL0NvcmUvdXRpbC9EaXNhYmxlU3R1cGlkV2FybmluZ3MuaD4KKworaW50IGZjbl9jaGtkZXIoY29uc3QgVmVjdG9yWGQgJngsIFZlY3RvclhkICZmdmVjLCBNYXRyaXhYZCAmZmphYywgaW50IGlmbGFnKQoreworICAgIC8qICAgICAgc3Vicm91dGluZSBmY24gZm9yIGNoa2RlciBleGFtcGxlLiAqLworCisgICAgaW50IGk7CisgICAgYXNzZXJ0KDE1ID09ICBmdmVjLnNpemUoKSk7CisgICAgYXNzZXJ0KDMgPT0gIHguc2l6ZSgpKTsKKyAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdPXsxLjRlLTEsIDEuOGUtMSwgMi4yZS0xLCAyLjVlLTEsIDIuOWUtMSwgMy4yZS0xLCAzLjVlLTEsCisgICAgICAgIDMuOWUtMSwgMy43ZS0xLCA1LjhlLTEsIDcuM2UtMSwgOS42ZS0xLCAxLjM0LCAyLjEsIDQuMzl9OworCisKKyAgICBpZiAoaWZsYWcgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoaWZsYWcgIT0gMikKKyAgICAgICAgZm9yIChpPTA7IGk8MTU7IGkrKykgeworICAgICAgICAgICAgdG1wMSA9IGkrMTsKKyAgICAgICAgICAgIHRtcDIgPSAxNi1pLTE7CisgICAgICAgICAgICB0bXAzID0gdG1wMTsKKyAgICAgICAgICAgIGlmIChpID49IDgpIHRtcDMgPSB0bXAyOworICAgICAgICAgICAgZnZlY1tpXSA9IHlbaV0gLSAoeFswXSArIHRtcDEvKHhbMV0qdG1wMiArIHhbMl0qdG1wMykpOworICAgICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgICAgICAgICB0bXAxID0gaSsxOworICAgICAgICAgICAgdG1wMiA9IDE2LWktMTsKKworICAgICAgICAgICAgLyogZXJyb3IgaW50cm9kdWNlZCBpbnRvIG5leHQgc3RhdGVtZW50IGZvciBpbGx1c3RyYXRpb24uICovCisgICAgICAgICAgICAvKiBjb3JyZWN0ZWQgc3RhdGVtZW50IHNob3VsZCByZWFkICAgIHRtcDMgPSB0bXAxIC4gKi8KKworICAgICAgICAgICAgdG1wMyA9IHRtcDI7CisgICAgICAgICAgICBpZiAoaSA+PSA4KSB0bXAzID0gdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAoeFsxXSp0bXAyICsgeFsyXSp0bXAzKTsgdG1wND10bXA0KnRtcDQ7CisgICAgICAgICAgICBmamFjKGksMCkgPSAtMS47CisgICAgICAgICAgICBmamFjKGksMSkgPSB0bXAxKnRtcDIvdG1wNDsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IHRtcDEqdG1wMy90bXA0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3ZvaWQgdGVzdENoa2RlcigpCit7CisgIGNvbnN0IGludCBtPTE1LCBuPTM7CisgIFZlY3RvclhkIHgobiksIGZ2ZWMobSksIHhwLCBmdmVjcChtKSwgZXJyOworICBNYXRyaXhYZCBmamFjKG0sbik7CisgIFZlY3RvclhpIGlwdnQ7CisKKyAgLyogICAgICB0aGUgZm9sbG93aW5nIHZhbHVlcyBzaG91bGQgYmUgc3VpdGFibGUgZm9yICovCisgIC8qICAgICAgY2hlY2tpbmcgdGhlIGphY29iaWFuIG1hdHJpeC4gKi8KKyAgeCA8PCA5LjJlLTEsIDEuM2UtMSwgNS40ZS0xOworCisgIGludGVybmFsOjpjaGtkZXIoeCwgZnZlYywgZmphYywgeHAsIGZ2ZWNwLCAxLCBlcnIpOworICBmY25fY2hrZGVyKHgsIGZ2ZWMsIGZqYWMsIDEpOworICBmY25fY2hrZGVyKHgsIGZ2ZWMsIGZqYWMsIDIpOworICBmY25fY2hrZGVyKHhwLCBmdmVjcCwgZmphYywgMSk7CisgIGludGVybmFsOjpjaGtkZXIoeCwgZnZlYywgZmphYywgeHAsIGZ2ZWNwLCAyLCBlcnIpOworCisgIGZ2ZWNwIC09IGZ2ZWM7CisKKyAgLy8gY2hlY2sgdGhvc2UKKyAgVmVjdG9yWGQgZnZlY19yZWYobSksIGZ2ZWNwX3JlZihtKSwgZXJyX3JlZihtKTsKKyAgZnZlY19yZWYgPDwKKyAgICAgIC0xLjE4MTYwNiwgLTEuNDI5NjU1LCAtMS42MDYzNDQsCisgICAgICAtMS43NDUyNjksIC0xLjg0MDY1NCwgLTEuOTIxNTg2LAorICAgICAgLTEuOTg0MTQxLCAtMi4wMjI1MzcsIC0yLjQ2ODk3NywKKyAgICAgIC0yLjgyNzU2MiwgLTMuNDczNTgyLCAtNC40Mzc2MTIsCisgICAgICAtNi4wNDc2NjIsIC05LjI2Nzc2MSwgLTE4LjkxODA2OworICBmdmVjcF9yZWYgPDwKKyAgICAgIC03LjcyNDY2NmUtMDksIC0zLjQzMjQwNmUtMDksIC0yLjAzNDg0M2UtMTAsCisgICAgICAyLjMxMzY4NWUtMDksICA0LjMzMTA3OGUtMDksICA1Ljk4NDA5NmUtMDksCisgICAgICA3LjM2MzI4MWUtMDksICAgOC41MzE0N2UtMDksICAxLjQ4ODU5MWUtMDgsCisgICAgICAyLjMzNTg1ZS0wOCwgIDMuNTIyMDEyZS0wOCwgIDUuMzAxMjU1ZS0wOCwKKyAgICAgIDguMjY2NjZlLTA4LCAgMS40MTk3NDdlLTA3LCAgIDMuMTk4OTllLTA3OworICBlcnJfcmVmIDw8CisgICAgICAwLjExNDEzOTcsICAwLjA5OTQzNTE2LCAgMC4wOTY3NDQ3NCwKKyAgICAgIDAuMDk5ODA0NDcsICAwLjEwNzMxMTYsIDAuMTIyMDQ0NSwKKyAgICAgIDAuMTUyNjgxNCwgMSwgMSwKKyAgICAgIDEsIDEsIDEsCisgICAgICAxLCAxLCAxOworCisgIFZFUklGWV9JU19BUFBST1goZnZlYywgZnZlY19yZWYpOworICBWRVJJRllfSVNfQVBQUk9YKGZ2ZWNwLCBmdmVjcF9yZWYpOworICBWRVJJRllfSVNfQVBQUk9YKGVyciwgZXJyX3JlZik7Cit9CisKKy8vIEdlbmVyaWMgZnVuY3RvcgordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IE5YPUR5bmFtaWMsIGludCBOWT1EeW5hbWljPgorc3RydWN0IEZ1bmN0b3IKK3sKKyAgdHlwZWRlZiBfU2NhbGFyIFNjYWxhcjsKKyAgZW51bSB7CisgICAgSW5wdXRzQXRDb21waWxlVGltZSA9IE5YLAorICAgIFZhbHVlc0F0Q29tcGlsZVRpbWUgPSBOWQorICB9OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsSW5wdXRzQXRDb21waWxlVGltZSwxPiBJbnB1dFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLDE+IFZhbHVlVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFZhbHVlc0F0Q29tcGlsZVRpbWUsSW5wdXRzQXRDb21waWxlVGltZT4gSmFjb2JpYW5UeXBlOworCisgIGNvbnN0IGludCBtX2lucHV0cywgbV92YWx1ZXM7CisKKyAgRnVuY3RvcigpIDogbV9pbnB1dHMoSW5wdXRzQXRDb21waWxlVGltZSksIG1fdmFsdWVzKFZhbHVlc0F0Q29tcGlsZVRpbWUpIHt9CisgIEZ1bmN0b3IoaW50IGlucHV0cywgaW50IHZhbHVlcykgOiBtX2lucHV0cyhpbnB1dHMpLCBtX3ZhbHVlcyh2YWx1ZXMpIHt9CisKKyAgaW50IGlucHV0cygpIGNvbnN0IHsgcmV0dXJuIG1faW5wdXRzOyB9CisgIGludCB2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorCisgIC8vIHlvdSBzaG91bGQgZGVmaW5lIHRoYXQgaW4gdGhlIHN1YmNsYXNzIDoKKy8vICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IElucHV0VHlwZSYgeCwgVmFsdWVUeXBlKiB2LCBKYWNvYmlhblR5cGUqIF9qPTApIGNvbnN0OworfTsKKworc3RydWN0IGxtZGVyX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBsbWRlcl9mdW5jdG9yKHZvaWQpOiBGdW5jdG9yPGRvdWJsZT4oMywxNSkge30KKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpIGNvbnN0CisgICAgeworICAgICAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE1XSA9IHsxLjRlLTEsIDEuOGUtMSwgMi4yZS0xLCAyLjVlLTEsIDIuOWUtMSwgMy4yZS0xLCAzLjVlLTEsCisgICAgICAgICAgICAzLjllLTEsIDMuN2UtMSwgNS44ZS0xLCA3LjNlLTEsIDkuNmUtMSwgMS4zNCwgMi4xLCA0LjM5fTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcygpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSBpKzE7CisgICAgICAgICAgICB0bXAyID0gMTYgLSBpIC0gMTsKKyAgICAgICAgICAgIHRtcDMgPSAoaT49OCk/IHRtcDIgOiB0bXAxOworICAgICAgICAgICAgZnZlY1tpXSA9IHlbaV0gLSAoeFswXSArIHRtcDEvKHhbMV0qdG1wMiArIHhbMl0qdG1wMykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmeCwgTWF0cml4WGQgJmZqYWMpIGNvbnN0CisgICAgeworICAgICAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gaSsxOworICAgICAgICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7CisgICAgICAgICAgICB0bXAzID0gKGk+PTgpPyB0bXAyIDogdG1wMTsKKyAgICAgICAgICAgIHRtcDQgPSAoeFsxXSp0bXAyICsgeFsyXSp0bXAzKTsgdG1wNCA9IHRtcDQqdG1wNDsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IC0xOworICAgICAgICAgICAgZmphYyhpLDEpID0gdG1wMSp0bXAyL3RtcDQ7CisgICAgICAgICAgICBmamFjKGksMikgPSB0bXAxKnRtcDMvdG1wNDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCit2b2lkIHRlc3RMbWRlcjEoKQoreworICBpbnQgbj0zLCBpbmZvOworCisgIFZlY3RvclhkIHg7CisKKyAgLyogdGhlIGZvbGxvd2luZyBzdGFydGluZyB2YWx1ZXMgcHJvdmlkZSBhIHJvdWdoIGZpdC4gKi8KKyAgeC5zZXRDb25zdGFudChuLCAxLik7CisKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtZGVyX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PGxtZGVyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubG1kZXIxKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDUpOworCisgIC8vIGNoZWNrIG5vcm0KKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLmJsdWVOb3JtKCksIDAuMDkwNjM1OTYpOworCisgIC8vIGNoZWNrIHgKKyAgVmVjdG9yWGQgeF9yZWYobik7CisgIHhfcmVmIDw8IDAuMDgyNDEwNTgsIDEuMTMzMDM3LCAyLjM0MzY5NTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7Cit9CisKK3ZvaWQgdGVzdExtZGVyKCkKK3sKKyAgY29uc3QgaW50IG09MTUsIG49MzsKKyAgaW50IGluZm87CisgIGRvdWJsZSBmbm9ybSwgY292ZmFjOworICBWZWN0b3JYZCB4OworCisgIC8qIHRoZSBmb2xsb3dpbmcgc3RhcnRpbmcgdmFsdWVzIHByb3ZpZGUgYSByb3VnaCBmaXQuICovCisgIHguc2V0Q29uc3RhbnQobiwgMS4pOworCisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbWRlcl9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxsbWRlcl9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZXMKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgNik7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCA1KTsKKworICAvLyBjaGVjayBub3JtCisgIGZub3JtID0gbG0uZnZlYy5ibHVlTm9ybSgpOworICBWRVJJRllfSVNfQVBQUk9YKGZub3JtLCAwLjA5MDYzNTk2KTsKKworICAvLyBjaGVjayB4CisgIFZlY3RvclhkIHhfcmVmKG4pOworICB4X3JlZiA8PCAwLjA4MjQxMDU4LCAxLjEzMzAzNywgMi4zNDM2OTU7CisgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOworCisgIC8vIGNoZWNrIGNvdmFyaWFuY2UKKyAgY292ZmFjID0gZm5vcm0qZm5vcm0vKG0tbik7CisgIGludGVybmFsOjpjb3ZhcihsbS5mamFjLCBsbS5wZXJtdXRhdGlvbi5pbmRpY2VzKCkpOyAvLyBUT0RPIDogbW92ZSB0aGlzIGFzIGEgZnVuY3Rpb24gb2YgbG0KKworICBNYXRyaXhYZCBjb3ZfcmVmKG4sbik7CisgIGNvdl9yZWYgPDwKKyAgICAgIDAuMDAwMTUzMTIwMiwgICAwLjAwMjg2OTk0MSwgIC0wLjAwMjY1NjY2MiwKKyAgICAgIDAuMDAyODY5OTQxLCAgICAwLjA5NDgwOTM1LCAgIC0wLjA5MDk4OTk1LAorICAgICAgLTAuMDAyNjU2NjYyLCAgIC0wLjA5MDk4OTk1LCAgICAwLjA4Nzc4NzI3OworCisvLyAgc3RkOjpjb3V0IDw8IGZqYWMqY292ZmFjIDw8IHN0ZDo6ZW5kbDsKKworICBNYXRyaXhYZCBjb3Y7CisgIGNvdiA9ICBjb3ZmYWMqbG0uZmphYy50b3BMZWZ0Q29ybmVyPG4sbj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggY292LCBjb3ZfcmVmKTsKKyAgLy8gVE9ETzogd2h5IGlzbid0IHRoaXMgYWxsb3dlZCA/IDoKKyAgLy8gVkVSSUZZX0lTX0FQUFJPWCggY292ZmFjKmZqYWMudG9wTGVmdENvcm5lcjxuLG4+KCkgLCBjb3ZfcmVmKTsKK30KKworc3RydWN0IGh5YnJqX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBoeWJyal9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDksOSkge30KKworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGRvdWJsZSB0ZW1wLCB0ZW1wMSwgdGVtcDI7CisgICAgICAgIGNvbnN0IGludCBuID0geC5zaXplKCk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09bik7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbjsgaysrKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKDMuIC0gMi4qeFtrXSkqeFtrXTsKKyAgICAgICAgICAgIHRlbXAxID0gMC47CisgICAgICAgICAgICBpZiAoaykgdGVtcDEgPSB4W2stMV07CisgICAgICAgICAgICB0ZW1wMiA9IDAuOworICAgICAgICAgICAgaWYgKGsgIT0gbi0xKSB0ZW1wMiA9IHhbaysxXTsKKyAgICAgICAgICAgIGZ2ZWNba10gPSB0ZW1wIC0gdGVtcDEgLSAyLip0ZW1wMiArIDEuOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJngsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgY29uc3QgaW50IG4gPSB4LnNpemUoKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT1uKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT1uKTsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBuOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKQorICAgICAgICAgICAgICAgIGZqYWMoayxqKSA9IDAuOworICAgICAgICAgICAgZmphYyhrLGspID0gMy4tIDQuKnhba107CisgICAgICAgICAgICBpZiAoaykgZmphYyhrLGstMSkgPSAtMS47CisgICAgICAgICAgICBpZiAoayAhPSBuLTEpIGZqYWMoayxrKzEpID0gLTIuOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKKwordm9pZCB0ZXN0SHlicmoxKCkKK3sKKyAgY29uc3QgaW50IG49OTsKKyAgaW50IGluZm87CisgIFZlY3RvclhkIHgobik7CisKKyAgLyogdGhlIGZvbGxvd2luZyBzdGFydGluZyB2YWx1ZXMgcHJvdmlkZSBhIHJvdWdoIGZpdC4gKi8KKyAgeC5zZXRDb25zdGFudChuLCAtMS4pOworCisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBoeWJyal9mdW5jdG9yIGZ1bmN0b3I7CisgIEh5YnJpZE5vbkxpbmVhclNvbHZlcjxoeWJyal9mdW5jdG9yPiBzb2x2ZXIoZnVuY3Rvcik7CisgIGluZm8gPSBzb2x2ZXIuaHlicmoxKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChzb2x2ZXIubmZldiwgMTEpOworICBWRVJJRllfSVNfRVFVQUwoc29sdmVyLm5qZXYsIDEpOworCisgIC8vIGNoZWNrIG5vcm0KKyAgVkVSSUZZX0lTX0FQUFJPWChzb2x2ZXIuZnZlYy5ibHVlTm9ybSgpLCAxLjE5MjYzNmUtMDgpOworCisKKy8vIGNoZWNrIHgKKyAgVmVjdG9yWGQgeF9yZWYobik7CisgIHhfcmVmIDw8CisgICAgIC0wLjU3MDY1NDUsICAgIC0wLjY4MTYyODMsICAgIC0wLjcwMTczMjUsCisgICAgIC0wLjcwNDIxMjksICAgICAtMC43MDEzNjksICAgIC0wLjY5MTg2NTYsCisgICAgIC0wLjY2NTc5MiwgICAgLTAuNTk2MDM0MiwgICAgLTAuNDE2NDEyMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7Cit9CisKK3ZvaWQgdGVzdEh5YnJqKCkKK3sKKyAgY29uc3QgaW50IG49OTsKKyAgaW50IGluZm87CisgIFZlY3RvclhkIHgobik7CisKKyAgLyogdGhlIGZvbGxvd2luZyBzdGFydGluZyB2YWx1ZXMgcHJvdmlkZSBhIHJvdWdoIGZpdC4gKi8KKyAgeC5zZXRDb25zdGFudChuLCAtMS4pOworCisKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGh5YnJqX2Z1bmN0b3IgZnVuY3RvcjsKKyAgSHlicmlkTm9uTGluZWFyU29sdmVyPGh5YnJqX2Z1bmN0b3I+IHNvbHZlcihmdW5jdG9yKTsKKyAgc29sdmVyLmRpYWcuc2V0Q29uc3RhbnQobiwgMS4pOworICBzb2x2ZXIudXNlRXh0ZXJuYWxTY2FsaW5nID0gdHJ1ZTsKKyAgaW5mbyA9IHNvbHZlci5zb2x2ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwoc29sdmVyLm5mZXYsIDExKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNvbHZlci5uamV2LCAxKTsKKworICAvLyBjaGVjayBub3JtCisgIFZFUklGWV9JU19BUFBST1goc29sdmVyLmZ2ZWMuYmx1ZU5vcm0oKSwgMS4xOTI2MzZlLTA4KTsKKworCisvLyBjaGVjayB4CisgIFZlY3RvclhkIHhfcmVmKG4pOworICB4X3JlZiA8PAorICAgICAtMC41NzA2NTQ1LCAgICAtMC42ODE2MjgzLCAgICAtMC43MDE3MzI1LAorICAgICAtMC43MDQyMTI5LCAgICAgLTAuNzAxMzY5LCAgICAtMC42OTE4NjU2LAorICAgICAtMC42NjU3OTIsICAgIC0wLjU5NjAzNDIsICAgIC0wLjQxNjQxMjE7CisgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOworCit9CisKK3N0cnVjdCBoeWJyZF9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgaHlicmRfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig5LDkpIHt9CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJngsIFZlY3RvclhkICZmdmVjKSBjb25zdAorICAgIHsKKyAgICAgICAgZG91YmxlIHRlbXAsIHRlbXAxLCB0ZW1wMjsKKyAgICAgICAgY29uc3QgaW50IG4gPSB4LnNpemUoKTsKKworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PW4pOworICAgICAgICBmb3IgKGludCBrPTA7IGsgPCBuOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoMy4gLSAyLip4W2tdKSp4W2tdOworICAgICAgICAgICAgdGVtcDEgPSAwLjsKKyAgICAgICAgICAgIGlmIChrKSB0ZW1wMSA9IHhbay0xXTsKKyAgICAgICAgICAgIHRlbXAyID0gMC47CisgICAgICAgICAgICBpZiAoayAhPSBuLTEpIHRlbXAyID0geFtrKzFdOworICAgICAgICAgICAgZnZlY1trXSA9IHRlbXAgLSB0ZW1wMSAtIDIuKnRlbXAyICsgMS47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKwordm9pZCB0ZXN0SHlicmQxKCkKK3sKKyAgaW50IG49OSwgaW5mbzsKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggc29sdXRpb24uICovCisgIHguc2V0Q29uc3RhbnQobiwgLTEuKTsKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaHlicmRfZnVuY3RvciBmdW5jdG9yOworICBIeWJyaWROb25MaW5lYXJTb2x2ZXI8aHlicmRfZnVuY3Rvcj4gc29sdmVyKGZ1bmN0b3IpOworICBpbmZvID0gc29sdmVyLmh5YnJkMSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwoc29sdmVyLm5mZXYsIDIwKTsKKworICAvLyBjaGVjayBub3JtCisgIFZFUklGWV9JU19BUFBST1goc29sdmVyLmZ2ZWMuYmx1ZU5vcm0oKSwgMS4xOTI2MzZlLTA4KTsKKworICAvLyBjaGVjayB4CisgIFZlY3RvclhkIHhfcmVmKG4pOworICB4X3JlZiA8PCAtMC41NzA2NTQ1LCAtMC42ODE2MjgzLCAtMC43MDE3MzI1LCAtMC43MDQyMTI5LCAtMC43MDEzNjksIC0wLjY5MTg2NTYsIC0wLjY2NTc5MiwgLTAuNTk2MDM0MiwgLTAuNDE2NDEyMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7Cit9CisKK3ZvaWQgdGVzdEh5YnJkKCkKK3sKKyAgY29uc3QgaW50IG49OTsKKyAgaW50IGluZm87CisgIFZlY3RvclhkIHg7CisKKyAgLyogdGhlIGZvbGxvd2luZyBzdGFydGluZyB2YWx1ZXMgcHJvdmlkZSBhIHJvdWdoIGZpdC4gKi8KKyAgeC5zZXRDb25zdGFudChuLCAtMS4pOworCisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBoeWJyZF9mdW5jdG9yIGZ1bmN0b3I7CisgIEh5YnJpZE5vbkxpbmVhclNvbHZlcjxoeWJyZF9mdW5jdG9yPiBzb2x2ZXIoZnVuY3Rvcik7CisgIHNvbHZlci5wYXJhbWV0ZXJzLm5iX29mX3N1YmRpYWdvbmFscyA9IDE7CisgIHNvbHZlci5wYXJhbWV0ZXJzLm5iX29mX3N1cGVyZGlhZ29uYWxzID0gMTsKKyAgc29sdmVyLmRpYWcuc2V0Q29uc3RhbnQobiwgMS4pOworICBzb2x2ZXIudXNlRXh0ZXJuYWxTY2FsaW5nID0gdHJ1ZTsKKyAgaW5mbyA9IHNvbHZlci5zb2x2ZU51bWVyaWNhbERpZmYoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNvbHZlci5uZmV2LCAxNCk7CisKKyAgLy8gY2hlY2sgbm9ybQorICBWRVJJRllfSVNfQVBQUk9YKHNvbHZlci5mdmVjLmJsdWVOb3JtKCksIDEuMTkyNjM2ZS0wOCk7CisKKyAgLy8gY2hlY2sgeAorICBWZWN0b3JYZCB4X3JlZihuKTsKKyAgeF9yZWYgPDwKKyAgICAgIC0wLjU3MDY1NDUsICAgIC0wLjY4MTYyODMsICAgIC0wLjcwMTczMjUsCisgICAgICAtMC43MDQyMTI5LCAgICAgLTAuNzAxMzY5LCAgICAtMC42OTE4NjU2LAorICAgICAgLTAuNjY1NzkyLCAgICAtMC41OTYwMzQyLCAgICAtMC40MTY0MTIxOworICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKK30KKworc3RydWN0IGxtc3RyX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBsbXN0cl9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDMsMTUpIHt9CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJngsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgLyogIHN1YnJvdXRpbmUgZmNuIGZvciBsbXN0cjEgZXhhbXBsZS4gKi8KKyAgICAgICAgZG91YmxlIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV09ezEuNGUtMSwgMS44ZS0xLCAyLjJlLTEsIDIuNWUtMSwgMi45ZS0xLCAzLjJlLTEsIDMuNWUtMSwKKyAgICAgICAgICAgIDMuOWUtMSwgMy43ZS0xLCA1LjhlLTEsIDcuM2UtMSwgOS42ZS0xLCAxLjM0LCAyLjEsIDQuMzl9OworCisgICAgICAgIGFzc2VydCgxNT09ZnZlYy5zaXplKCkpOworICAgICAgICBhc3NlcnQoMz09eC5zaXplKCkpOworCisgICAgICAgIGZvciAoaW50IGk9MDsgaTwxNTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gaSsxOworICAgICAgICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7CisgICAgICAgICAgICB0bXAzID0gKGk+PTgpPyB0bXAyIDogdG1wMTsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxLyh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmamFjX3JvdywgVmVjdG9yWGQ6OkluZGV4IHJvd25iKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KHguc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGphY19yb3cuc2l6ZSgpPT14LnNpemUoKSk7CisgICAgICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworCisgICAgICAgIGludCBpID0gcm93bmItMjsKKyAgICAgICAgdG1wMSA9IGkrMTsKKyAgICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7CisgICAgICAgIHRtcDMgPSAoaT49OCk/IHRtcDIgOiB0bXAxOworICAgICAgICB0bXA0ID0gKHhbMV0qdG1wMiArIHhbMl0qdG1wMyk7IHRtcDQgPSB0bXA0KnRtcDQ7CisgICAgICAgIGphY19yb3dbMF0gPSAtMTsKKyAgICAgICAgamFjX3Jvd1sxXSA9IHRtcDEqdG1wMi90bXA0OworICAgICAgICBqYWNfcm93WzJdID0gdG1wMSp0bXAzL3RtcDQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3ZvaWQgdGVzdExtc3RyMSgpCit7CisgIGNvbnN0IGludCBuPTM7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyogdGhlIGZvbGxvd2luZyBzdGFydGluZyB2YWx1ZXMgcHJvdmlkZSBhIHJvdWdoIGZpdC4gKi8KKyAgeC5zZXRDb25zdGFudChuLCAxLik7CisKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtc3RyX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PGxtc3RyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubG1zdHIxKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDUpOworCisgIC8vIGNoZWNrIG5vcm0KKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLmJsdWVOb3JtKCksIDAuMDkwNjM1OTYpOworCisgIC8vIGNoZWNrIHgKKyAgVmVjdG9yWGQgeF9yZWYobik7CisgIHhfcmVmIDw8IDAuMDgyNDEwNTgsIDEuMTMzMDM3LCAyLjM0MzY5NSA7CisgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOworfQorCit2b2lkIHRlc3RMbXN0cigpCit7CisgIGNvbnN0IGludCBuPTM7CisgIGludCBpbmZvOworICBkb3VibGUgZm5vcm07CisgIFZlY3RvclhkIHgobik7CisKKyAgLyogdGhlIGZvbGxvd2luZyBzdGFydGluZyB2YWx1ZXMgcHJvdmlkZSBhIHJvdWdoIGZpdC4gKi8KKyAgeC5zZXRDb25zdGFudChuLCAxLik7CisKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtc3RyX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PGxtc3RyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubWluaW1pemVPcHRpbXVtU3RvcmFnZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWVzCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDYpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNSk7CisKKyAgLy8gY2hlY2sgbm9ybQorICBmbm9ybSA9IGxtLmZ2ZWMuYmx1ZU5vcm0oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmbm9ybSwgMC4wOTA2MzU5Nik7CisKKyAgLy8gY2hlY2sgeAorICBWZWN0b3JYZCB4X3JlZihuKTsKKyAgeF9yZWYgPDwgMC4wODI0MTA1OCwgMS4xMzMwMzcsIDIuMzQzNjk1OworICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKKworfQorCitzdHJ1Y3QgbG1kaWZfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIGxtZGlmX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywxNSkge30KKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpIGNvbnN0CisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIHRtcDEsdG1wMix0bXAzOworICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdPXsxLjRlLTEsMS44ZS0xLDIuMmUtMSwyLjVlLTEsMi45ZS0xLDMuMmUtMSwzLjVlLTEsMy45ZS0xLAorICAgICAgICAgICAgMy43ZS0xLDUuOGUtMSw3LjNlLTEsOS42ZS0xLDEuMzRlMCwyLjFlMCw0LjM5ZTB9OworCisgICAgICAgIGFzc2VydCh4LnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTUpOworICAgICAgICBmb3IgKGk9MDsgaTwxNTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gaSsxOworICAgICAgICAgICAgdG1wMiA9IDE1IC0gaTsKKyAgICAgICAgICAgIHRtcDMgPSB0bXAxOworCisgICAgICAgICAgICBpZiAoaSA+PSA4KSB0bXAzID0gdG1wMjsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxLyh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCit2b2lkIHRlc3RMbWRpZjEoKQoreworICBjb25zdCBpbnQgbj0zOworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pLCBmdmVjKDE1KTsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIDEuKTsKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG1kaWZfZnVuY3RvciBmdW5jdG9yOworICBEZW5zZUluZGV4IG5mZXY7CisgIGluZm8gPSBMZXZlbmJlcmdNYXJxdWFyZHQ8bG1kaWZfZnVuY3Rvcj46OmxtZGlmMShmdW5jdG9yLCB4LCAmbmZldik7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG5mZXYsIDI2KTsKKworICAvLyBjaGVjayBub3JtCisgIGZ1bmN0b3IoeCwgZnZlYyk7CisgIFZFUklGWV9JU19BUFBST1goZnZlYy5ibHVlTm9ybSgpLCAwLjA5MDYzNTk2KTsKKworICAvLyBjaGVjayB4CisgIFZlY3RvclhkIHhfcmVmKG4pOworICB4X3JlZiA8PCAwLjA4MjQxMDYsIDEuMTMzMDM2NiwgMi4zNDM2OTQ3OworICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKKworfQorCit2b2lkIHRlc3RMbWRpZigpCit7CisgIGNvbnN0IGludCBtPTE1LCBuPTM7CisgIGludCBpbmZvOworICBkb3VibGUgZm5vcm0sIGNvdmZhYzsKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKiB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHZhbHVlcyBwcm92aWRlIGEgcm91Z2ggZml0LiAqLworICB4LnNldENvbnN0YW50KG4sIDEuKTsKKworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbG1kaWZfZnVuY3RvciBmdW5jdG9yOworICBOdW1lcmljYWxEaWZmPGxtZGlmX2Z1bmN0b3I+IG51bURpZmYoZnVuY3Rvcik7CisgIExldmVuYmVyZ01hcnF1YXJkdDxOdW1lcmljYWxEaWZmPGxtZGlmX2Z1bmN0b3I+ID4gbG0obnVtRGlmZik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWVzCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDI2KTsKKworICAvLyBjaGVjayBub3JtCisgIGZub3JtID0gbG0uZnZlYy5ibHVlTm9ybSgpOworICBWRVJJRllfSVNfQVBQUk9YKGZub3JtLCAwLjA5MDYzNTk2KTsKKworICAvLyBjaGVjayB4CisgIFZlY3RvclhkIHhfcmVmKG4pOworICB4X3JlZiA8PCAwLjA4MjQxMDU4LCAxLjEzMzAzNywgMi4zNDM2OTU7CisgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOworCisgIC8vIGNoZWNrIGNvdmFyaWFuY2UKKyAgY292ZmFjID0gZm5vcm0qZm5vcm0vKG0tbik7CisgIGludGVybmFsOjpjb3ZhcihsbS5mamFjLCBsbS5wZXJtdXRhdGlvbi5pbmRpY2VzKCkpOyAvLyBUT0RPIDogbW92ZSB0aGlzIGFzIGEgZnVuY3Rpb24gb2YgbG0KKworICBNYXRyaXhYZCBjb3ZfcmVmKG4sbik7CisgIGNvdl9yZWYgPDwKKyAgICAgIDAuMDAwMTUzMTIwMiwgICAwLjAwMjg2OTk0MiwgIC0wLjAwMjY1NjY2MiwKKyAgICAgIDAuMDAyODY5OTQyLCAgICAwLjA5NDgwOTM3LCAgIC0wLjA5MDk4OTk3LAorICAgICAgLTAuMDAyNjU2NjYyLCAgIC0wLjA5MDk4OTk3LCAgICAwLjA4Nzc4NzI5OworCisvLyAgc3RkOjpjb3V0IDw8IGZqYWMqY292ZmFjIDw8IHN0ZDo6ZW5kbDsKKworICBNYXRyaXhYZCBjb3Y7CisgIGNvdiA9ICBjb3ZmYWMqbG0uZmphYy50b3BMZWZ0Q29ybmVyPG4sbj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCggY292LCBjb3ZfcmVmKTsKKyAgLy8gVE9ETzogd2h5IGlzbid0IHRoaXMgYWxsb3dlZCA/IDoKKyAgLy8gVkVSSUZZX0lTX0FQUFJPWCggY292ZmFjKmZqYWMudG9wTGVmdENvcm5lcjxuLG4+KCkgLCBjb3ZfcmVmKTsKK30KKworc3RydWN0IGNod2lydXQyX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBjaHdpcnV0Ml9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDMsNTQpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3hbNTRdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbV95WzU0XTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTU0KTsKKyAgICAgICAgZm9yKGk9MDsgaTw1NDsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IG1feFtpXTsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSBleHAoLWJbMF0qeCkvKGJbMV0rYlsyXSp4KSAtIG1feVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09NTQpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOworICAgICAgICBmb3IoaW50IGk9MDsgaTw1NDsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IG1feFtpXTsKKyAgICAgICAgICAgIGRvdWJsZSBmYWN0b3IgPSAxLi8oYlsxXStiWzJdKngpOworICAgICAgICAgICAgZG91YmxlIGUgPSBleHAoLWJbMF0qeCk7CisgICAgICAgICAgICBmamFjKGksMCkgPSAteCplKmZhY3RvcjsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IC1lKmZhY3RvcipmYWN0b3I7CisgICAgICAgICAgICBmamFjKGksMikgPSAteCplKmZhY3RvcipmYWN0b3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKK2NvbnN0IGRvdWJsZSBjaHdpcnV0Ml9mdW5jdG9yOjptX3hbNTRdID0geyAwLjUwMEUwLCAxLjAwMEUwLCAxLjc1MEUwLCAzLjc1MEUwLCA1Ljc1MEUwLCAwLjg3NUUwLCAyLjI1MEUwLCAzLjI1MEUwLCA1LjI1MEUwLCAwLjc1MEUwLCAxLjc1MEUwLCAyLjc1MEUwLCA0Ljc1MEUwLCAwLjYyNUUwLCAxLjI1MEUwLCAyLjI1MEUwLCA0LjI1MEUwLCAuNTAwRTAsIDMuMDAwRTAsIC43NTBFMCwgMy4wMDBFMCwgMS41MDBFMCwgNi4wMDBFMCwgMy4wMDBFMCwgNi4wMDBFMCwgMS41MDBFMCwgMy4wMDBFMCwgLjUwMEUwLCAyLjAwMEUwLCA0LjAwMEUwLCAuNzUwRTAsIDIuMDAwRTAsIDUuMDAwRTAsIC43NTBFMCwgMi4yNTBFMCwgMy43NTBFMCwgNS43NTBFMCwgMy4wMDBFMCwgLjc1MEUwLCAyLjUwMEUwLCA0LjAwMEUwLCAuNzUwRTAsIDIuNTAwRTAsIDQuMDAwRTAsIC43NTBFMCwgMi41MDBFMCwgNC4wMDBFMCwgLjUwMEUwLCA2LjAwMEUwLCAzLjAwMEUwLCAuNTAwRTAsIDIuNzUwRTAsIC41MDBFMCwgMS43NTBFMH07Citjb25zdCBkb3VibGUgY2h3aXJ1dDJfZnVuY3Rvcjo6bV95WzU0XSA9IHsgOTIuOTAwMEUwICw1Ny4xMDAwRTAgLDMxLjA1MDBFMCAsMTEuNTg3NUUwICw4LjAyNTBFMCAsNjMuNjAwMEUwICwyMS40MDAwRTAgLDE0LjI1MDBFMCAsOC40NzUwRTAgLDYzLjgwMDBFMCAsMjYuODAwMEUwICwxNi40NjI1RTAgLDcuMTI1MEUwICw2Ny4zMDAwRTAgLDQxLjAwMDBFMCAsMjEuMTUwMEUwICw4LjE3NTBFMCAsODEuNTAwMEUwICwxMy4xMjAwRTAgLDU5LjkwMDBFMCAsMTQuNjIwMEUwICwzMi45MDAwRTAgLDUuNDQwMEUwICwxMi41NjAwRTAgLDUuNDQwMEUwICwzMi4wMDAwRTAgLDEzLjk1MDBFMCAsNzUuODAwMEUwICwyMC4wMDAwRTAgLDEwLjQyMDBFMCAsNTkuNTAwMEUwICwyMS42NzAwRTAgLDguNTUwMEUwICw2Mi4wMDAwRTAgLDIwLjIwMDBFMCAsNy43NjAwRTAgLDMuNzUwMEUwICwxMS44MTAwRTAgLDU0LjcwMDBFMCAsMjMuNzAwMEUwICwxMS41NTAwRTAgLDYxLjMwMDBFMCAsMTcuNzAwMEUwICw4Ljc0MDBFMCAsNTkuMjAwMEUwICwxNi4zMDAwRTAgLDguNjIwMEUwICw4MS4wMDAwRTAgLDQuODcwMEUwICwxNC42MjAwRTAgLDgxLjcwMDBFMCAsMTcuMTcwMEUwICw4MS4zMDAwRTAgLDI4LjkwMDBFMCAgfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvY2h3aXJ1dDIuc2h0bWwKK3ZvaWQgdGVzdE5pc3RDaHdpcnV0Mih2b2lkKQoreworICBjb25zdCBpbnQgbj0zOworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDAuMSwgMC4wMSwgMC4wMjsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGNod2lydXQyX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PGNod2lydXQyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDEwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDgpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDUuMTMwNDgwMjk0MUUrMDIpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS42NjU3NjY2NTM3RS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS4xNjUzMjkxMjg2RS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMS4yMTUwMDA3MDk2RS0wMik7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDAuMTUsIDAuMDA4LCAwLjAxMDsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtLnJlc2V0UGFyYW1ldGVycygpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMueHRvbCA9IDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDYpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDUuMTMwNDgwMjk0MUUrMDIpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS42NjU3NjY2NTM3RS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS4xNjUzMjkxMjg2RS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMS4yMTUwMDA3MDk2RS0wMik7Cit9CisKKworc3RydWN0IG1pc3JhMWFfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIG1pc3JhMWFfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPigyLDE0KSB7fQorICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbV94WzE0XTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feVsxNF07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNCk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE0OyBpKyspIHsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdKigxLi1leHAoLWJbMV0qbV94W2ldKSkgLSBtX3lbaV0gOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0xNCk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Mik7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE0OyBpKyspIHsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9ICgxLi1leHAoLWJbMV0qbV94W2ldKSk7CisgICAgICAgICAgICBmamFjKGksMSkgPSAoYlswXSptX3hbaV0qZXhwKC1iWzFdKm1feFtpXSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgbWlzcmExYV9mdW5jdG9yOjptX3hbMTRdID0geyA3Ny42RTAsIDExNC45RTAsIDE0MS4xRTAsIDE5MC44RTAsIDIzOS45RTAsIDI4OS4wRTAsIDMzMi44RTAsIDM3OC40RTAsIDQzNC44RTAsIDQ3Ny4zRTAsIDUzNi44RTAsIDU5My4xRTAsIDY4OS4xRTAsIDc2MC4wRTB9OworY29uc3QgZG91YmxlIG1pc3JhMWFfZnVuY3Rvcjo6bV95WzE0XSA9IHsgMTAuMDdFMCwgMTQuNzNFMCwgMTcuOTRFMCwgMjMuOTNFMCwgMjkuNjFFMCwgMzUuMThFMCwgNDAuMDJFMCwgNDQuODJFMCwgNTAuNzZFMCwgNTUuMDVFMCwgNjEuMDFFMCwgNjYuNDBFMCwgNzUuNDdFMCwgODEuNzhFMH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL21pc3JhMWEuc2h0bWwKK3ZvaWQgdGVzdE5pc3RNaXNyYTFhKHZvaWQpCit7CisgIGNvbnN0IGludCBuPTI7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgNTAwLiwgMC4wMDAxOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbWlzcmExYV9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxtaXNyYTFhX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDE5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDE1KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCAxLjI0NTUxMzg4OTRFLTAxKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDIuMzg5NDIxMjkxOEUrMDIpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDUuNTAxNTY0MzE4MUUtMDQpOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCAyNTAuLCAwLjAwMDU7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDUpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgMS4yNDU1MTM4ODk0RS0wMSk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAyLjM4OTQyMTI5MThFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjUwMTU2NDMxODFFLTA0KTsKK30KKworc3RydWN0IGhhaG4xX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBoYWhuMV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDcsMjM2KSB7fQorICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbV94WzIzNl07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3lbMjM2XSA9IHsgLjU5MUUwICwgMS41NDdFMCAsIDIuOTAyRTAgLCAyLjg5NEUwICwgNC43MDNFMCAsIDYuMzA3RTAgLCA3LjAzRTAgICwgNy44OThFMCAsIDkuNDcwRTAgLCA5LjQ4NEUwICwgMTAuMDcyRTAgLCAxMC4xNjNFMCAsIDExLjYxNUUwICwgMTIuMDA1RTAgLCAxMi40NzhFMCAsIDEyLjk4MkUwICwgMTIuOTcwRTAgLCAxMy45MjZFMCAsIDE0LjQ1MkUwICwgMTQuNDA0RTAgLCAxNS4xOTBFMCAsIDE1LjU1MEUwICwgMTUuNTI4RTAgLCAxNS40OTlFMCAsIDE2LjEzMUUwICwgMTYuNDM4RTAgLCAxNi4zODdFMCAsIDE2LjU0OUUwICwgMTYuODcyRTAgLCAxNi44MzBFMCAsIDE2LjkyNkUwICwgMTYuOTA3RTAgLCAxNi45NjZFMCAsIDE3LjA2MEUwICwgMTcuMTIyRTAgLCAxNy4zMTFFMCAsIDE3LjM1NUUwICwgMTcuNjY4RTAgLCAxNy43NjdFMCAsIDE3LjgwM0UwICwgMTcuNzY1RTAgLCAxNy43NjhFMCAsIDE3LjczNkUwICwgMTcuODU4RTAgLCAxNy44NzdFMCAsIDE3LjkxMkUwICwgMTguMDQ2RTAgLCAxOC4wODVFMCAsIDE4LjI5MUUwICwgMTguMzU3RTAgLCAxOC40MjZFMCAsIDE4LjU4NEUwICwgMTguNjEwRTAgLCAxOC44NzBFMCAsIDE4Ljc5NUUwICwgMTkuMTExRTAgLCAuMzY3RTAgLCAuNzk2RTAgLCAwLjg5MkUwICwgMS45MDNFMCAsIDIuMTUwRTAgLCAzLjY5N0UwICwgNS44NzBFMCAsIDYuNDIxRTAgLCA3LjQyMkUwICwgOS45NDRFMCAsIDExLjAyM0UwICwgMTEuODdFMCAgLCAxMi43ODZFMCAsIDE0LjA2N0UwICwgMTMuOTc0RTAgLCAxNC40NjJFMCAsIDE0LjQ2NEUwICwgMTUuMzgxRTAgLCAxNS40ODNFMCAsIDE1LjU5RTAgICwgMTYuMDc1RTAgLCAxNi4zNDdFMCAsIDE2LjE4MUUwICwgMTYuOTE1RTAgLCAxNy4wMDNFMCAsIDE2Ljk3OEUwICwgMTcuNzU2RTAgLCAxNy44MDhFMCAsIDE3Ljg2OEUwICwgMTguNDgxRTAgLCAxOC40ODZFMCAsIDE5LjA5MEUwICwgMTYuMDYyRTAgLCAxNi4zMzdFMCAsIDE2LjM0NUUwICwgMTYuMzg4RTAgLCAxNy4xNTlFMCAsIDE3LjExNkUwICwgMTcuMTY0RTAgLCAxNy4xMjNFMCAsIDE3Ljk3OUUwICwgMTcuOTc0RTAgLCAxOC4wMDdFMCAsIDE3Ljk5M0UwICwgMTguNTIzRTAgLCAxOC42NjlFMCAsIDE4LjYxN0UwICwgMTkuMzcxRTAgLCAxOS4zMzBFMCAsIDAuMDgwRTAgLCAwLjI0OEUwICwgMS4wODlFMCAsIDEuNDE4RTAgLCAyLjI3OEUwICwgMy42MjRFMCAsIDQuNTc0RTAgLCA1LjU1NkUwICwgNy4yNjdFMCAsIDcuNjk1RTAgLCA5LjEzNkUwICwgOS45NTlFMCAsIDkuOTU3RTAgLCAxMS42MDBFMCAsIDEzLjEzOEUwICwgMTMuNTY0RTAgLCAxMy44NzFFMCAsIDEzLjk5NEUwICwgMTQuOTQ3RTAgLCAxNS40NzNFMCAsIDE1LjM3OUUwICwgMTUuNDU1RTAgLCAxNS45MDhFMCAsIDE2LjExNEUwICwgMTcuMDcxRTAgLCAxNy4xMzVFMCAsIDE3LjI4MkUwICwgMTcuMzY4RTAgLCAxNy40ODNFMCAsIDE3Ljc2NEUwICwgMTguMTg1RTAgLCAxOC4yNzFFMCAsIDE4LjIzNkUwICwgMTguMjM3RTAgLCAxOC41MjNFMCAsIDE4LjYyN0UwICwgMTguNjY1RTAgLCAxOS4wODZFMCAsIDAuMjE0RTAgLCAwLjk0M0UwICwgMS40MjlFMCAsIDIuMjQxRTAgLCAyLjk1MUUwICwgMy43ODJFMCAsIDQuNzU3RTAgLCA1LjYwMkUwICwgNy4xNjlFMCAsIDguOTIwRTAgLCAxMC4wNTVFMCAsIDEyLjAzNUUwICwgMTIuODYxRTAgLCAxMy40MzZFMCAsIDE0LjE2N0UwICwgMTQuNzU1RTAgLCAxNS4xNjhFMCAsIDE1LjY1MUUwICwgMTUuNzQ2RTAgLCAxNi4yMTZFMCAsIDE2LjQ0NUUwICwgMTYuOTY1RTAgLCAxNy4xMjFFMCAsIDE3LjIwNkUwICwgMTcuMjUwRTAgLCAxNy4zMzlFMCAsIDE3Ljc5M0UwICwgMTguMTIzRTAgLCAxOC40OUUwICAsIDE4LjU2NkUwICwgMTguNjQ1RTAgLCAxOC43MDZFMCAsIDE4LjkyNEUwICwgMTkuMUUwICAgLCAwLjM3NUUwICwgMC40NzFFMCAsIDEuNTA0RTAgLCAyLjIwNEUwICwgMi44MTNFMCAsIDQuNzY1RTAgLCA5LjgzNUUwICwgMTAuMDQwRTAgLCAxMS45NDZFMCAsIDEyLjU5NkUwICwgMTMuMzAzRTAgLCAxMy45MjJFMCAsIDE0LjQ0MEUwICwgMTQuOTUxRTAgLCAxNS42MjdFMCAsIDE1LjYzOUUwICwgMTUuODE0RTAgLCAxNi4zMTVFMCAsIDE2LjMzNEUwICwgMTYuNDMwRTAgLCAxNi40MjNFMCAsIDE3LjAyNEUwICwgMTcuMDA5RTAgLCAxNy4xNjVFMCAsIDE3LjEzNEUwICwgMTcuMzQ5RTAgLCAxNy41NzZFMCAsIDE3Ljg0OEUwICwgMTguMDkwRTAgLCAxOC4yNzZFMCAsIDE4LjQwNEUwICwgMTguNTE5RTAgLCAxOS4xMzNFMCAsIDE5LjA3NEUwICwgMTkuMjM5RTAgLCAxOS4yODBFMCAsIDE5LjEwMUUwICwgMTkuMzk4RTAgLCAxOS4yNTJFMCAsIDE5Ljg5RTAgICwgMjAuMDA3RTAgLCAxOS45MjlFMCAsIDE5LjI2OEUwICwgMTkuMzI0RTAgLCAyMC4wNDlFMCAsIDIwLjEwN0UwICwgMjAuMDYyRTAgLCAyMC4wNjVFMCAsIDE5LjI4NkUwICwgMTkuOTcyRTAgLCAyMC4wODhFMCAsIDIwLjc0M0UwICwgMjAuODNFMCAgLCAyMC45MzVFMCAsIDIxLjAzNUUwICwgMjAuOTNFMCAgLCAyMS4wNzRFMCAsIDIxLjA4NUUwICwgMjAuOTM1RTAgfTsKKworICAgICAgICAvLyAgICAgICAgaW50IGNhbGxlZD0wOyBwcmludGYoImNhbGwgaGFobjFfZnVuY3RvciB3aXRoICBpZmxhZz0lZCwgY2FsbGVkPSVkXG4iLCBpZmxhZywgY2FsbGVkKTsgaWYgKGlmbGFnPT0xKSBjYWxsZWQrKzsKKworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTcpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTIzNik7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDIzNjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgeD1tX3hbaV0sIHh4PXgqeCwgeHh4PXh4Kng7CisgICAgICAgICAgICBmdmVjW2ldID0gKGJbMF0rYlsxXSp4K2JbMl0qeHgrYlszXSp4eHgpIC8gKDEuK2JbNF0qeCtiWzVdKnh4K2JbNl0qeHh4KSAtIG1feVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT03KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0yMzYpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTcpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwyMzY7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHg9bV94W2ldLCB4eD14KngsIHh4eD14eCp4OworICAgICAgICAgICAgZG91YmxlIGZhY3QgPSAxLi8oMS4rYls0XSp4K2JbNV0qeHgrYls2XSp4eHgpOworICAgICAgICAgICAgZmphYyhpLDApID0gMS4qZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IHgqZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IHh4KmZhY3Q7CisgICAgICAgICAgICBmamFjKGksMykgPSB4eHgqZmFjdDsKKyAgICAgICAgICAgIGZhY3QgPSAtIChiWzBdK2JbMV0qeCtiWzJdKnh4K2JbM10qeHh4KSAqIGZhY3QgKiBmYWN0OworICAgICAgICAgICAgZmphYyhpLDQpID0geCpmYWN0OworICAgICAgICAgICAgZmphYyhpLDUpID0geHgqZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSw2KSA9IHh4eCpmYWN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgaGFobjFfZnVuY3Rvcjo6bV94WzIzNl0gPSB7IDI0LjQxRTAgLCAzNC44MkUwICwgNDQuMDlFMCAsIDQ1LjA3RTAgLCA1NC45OEUwICwgNjUuNTFFMCAsIDcwLjUzRTAgLCA3NS43MEUwICwgODkuNTdFMCAsIDkxLjE0RTAgLCA5Ni40MEUwICwgOTcuMTlFMCAsIDExNC4yNkUwICwgMTIwLjI1RTAgLCAxMjcuMDhFMCAsIDEzMy41NUUwICwgMTMzLjYxRTAgLCAxNTguNjdFMCAsIDE3Mi43NEUwICwgMTcxLjMxRTAgLCAyMDIuMTRFMCAsIDIyMC41NUUwICwgMjIxLjA1RTAgLCAyMjEuMzlFMCAsIDI1MC45OUUwICwgMjY4Ljk5RTAgLCAyNzEuODBFMCAsIDI3MS45N0UwICwgMzIxLjMxRTAgLCAzMjEuNjlFMCAsIDMzMC4xNEUwICwgMzMzLjAzRTAgLCAzMzMuNDdFMCAsIDM0MC43N0UwICwgMzQ1LjY1RTAgLCAzNzMuMTFFMCAsIDM3My43OUUwICwgNDExLjgyRTAgLCA0MTkuNTFFMCAsIDQyMS41OUUwICwgNDIyLjAyRTAgLCA0MjIuNDdFMCAsIDQyMi42MUUwICwgNDQxLjc1RTAgLCA0NDcuNDFFMCAsIDQ0OC43RTAgICwgNDcyLjg5RTAgLCA0NzYuNjlFMCAsIDUyMi40N0UwICwgNTIyLjYyRTAgLCA1MjQuNDNFMCAsIDU0Ni43NUUwICwgNTQ5LjUzRTAgLCA1NzUuMjlFMCAsIDU3Ni4wMEUwICwgNjI1LjU1RTAgLCAyMC4xNUUwICwgMjguNzhFMCAsIDI5LjU3RTAgLCAzNy40MUUwICwgMzkuMTJFMCAsIDUwLjI0RTAgLCA2MS4zOEUwICwgNjYuMjVFMCAsIDczLjQyRTAgLCA5NS41MkUwICwgMTA3LjMyRTAgLCAxMjIuMDRFMCAsIDEzNC4wM0UwICwgMTYzLjE5RTAgLCAxNjMuNDhFMCAsIDE3NS43MEUwICwgMTc5Ljg2RTAgLCAyMTEuMjdFMCAsIDIxNy43OEUwICwgMjE5LjE0RTAgLCAyNjIuNTJFMCAsIDI2OC4wMUUwICwgMjY4LjYyRTAgLCAzMzYuMjVFMCAsIDMzNy4yM0UwICwgMzM5LjMzRTAgLCA0MjcuMzhFMCAsIDQyOC41OEUwICwgNDMyLjY4RTAgLCA1MjguOTlFMCAsIDUzMS4wOEUwICwgNjI4LjM0RTAgLCAyNTMuMjRFMCAsIDI3My4xM0UwICwgMjczLjY2RTAgLCAyODIuMTBFMCAsIDM0Ni42MkUwICwgMzQ3LjE5RTAgLCAzNDguNzhFMCAsIDM1MS4xOEUwICwgNDUwLjEwRTAgLCA0NTAuMzVFMCAsIDQ1MS45MkUwICwgNDU1LjU2RTAgLCA1NTIuMjJFMCAsIDU1My41NkUwICwgNTU1Ljc0RTAgLCA2NTIuNTlFMCAsIDY1Ni4yMEUwICwgMTQuMTNFMCAsIDIwLjQxRTAgLCAzMS4zMEUwICwgMzMuODRFMCAsIDM5LjcwRTAgLCA0OC44M0UwICwgNTQuNTBFMCAsIDYwLjQxRTAgLCA3Mi43N0UwICwgNzUuMjVFMCAsIDg2Ljg0RTAgLCA5NC44OEUwICwgOTYuNDBFMCAsIDExNy4zN0UwICwgMTM5LjA4RTAgLCAxNDcuNzNFMCAsIDE1OC42M0UwICwgMTYxLjg0RTAgLCAxOTIuMTFFMCAsIDIwNi43NkUwICwgMjA5LjA3RTAgLCAyMTMuMzJFMCAsIDIyNi40NEUwICwgMjM3LjEyRTAgLCAzMzAuOTBFMCAsIDM1OC43MkUwICwgMzcwLjc3RTAgLCAzNzIuNzJFMCAsIDM5Ni4yNEUwICwgNDE2LjU5RTAgLCA0ODQuMDJFMCAsIDQ5NS40N0UwICwgNTE0Ljc4RTAgLCA1MTUuNjVFMCAsIDUxOS40N0UwICwgNTQ0LjQ3RTAgLCA1NjAuMTFFMCAsIDYyMC43N0UwICwgMTguOTdFMCAsIDI4LjkzRTAgLCAzMy45MUUwICwgNDAuMDNFMCAsIDQ0LjY2RTAgLCA0OS44N0UwICwgNTUuMTZFMCAsIDYwLjkwRTAgLCA3Mi4wOEUwICwgODUuMTVFMCAsIDk3LjA2RTAgLCAxMTkuNjNFMCAsIDEzMy4yN0UwICwgMTQzLjg0RTAgLCAxNjEuOTFFMCAsIDE4MC42N0UwICwgMTk4LjQ0RTAgLCAyMjYuODZFMCAsIDIyOS42NUUwICwgMjU4LjI3RTAgLCAyNzMuNzdFMCAsIDMzOS4xNUUwICwgMzUwLjEzRTAgLCAzNjIuNzVFMCAsIDM3MS4wM0UwICwgMzkzLjMyRTAgLCA0NDguNTNFMCAsIDQ3My43OEUwICwgNTExLjEyRTAgLCA1MjQuNzBFMCAsIDU0OC43NUUwICwgNTUxLjY0RTAgLCA1NzQuMDJFMCAsIDYyMy44NkUwICwgMjEuNDZFMCAsIDI0LjMzRTAgLCAzMy40M0UwICwgMzkuMjJFMCAsIDQ0LjE4RTAgLCA1NS4wMkUwICwgOTQuMzNFMCAsIDk2LjQ0RTAgLCAxMTguODJFMCAsIDEyOC40OEUwICwgMTQxLjk0RTAgLCAxNTYuOTJFMCAsIDE3MS42NUUwICwgMTkwLjAwRTAgLCAyMjMuMjZFMCAsIDIyMy44OEUwICwgMjMxLjUwRTAgLCAyNjUuMDVFMCAsIDI2OS40NEUwICwgMjcxLjc4RTAgLCAyNzMuNDZFMCAsIDMzNC42MUUwICwgMzM5Ljc5RTAgLCAzNDkuNTJFMCAsIDM1OC4xOEUwICwgMzc3Ljk4RTAgLCAzOTQuNzdFMCAsIDQyOS42NkUwICwgNDY4LjIyRTAgLCA0ODcuMjdFMCAsIDUxOS41NEUwICwgNTIzLjAzRTAgLCA2MTIuOTlFMCAsIDYzOC41OUUwICwgNjQxLjM2RTAgLCA2MjIuMDVFMCAsIDYzMS41MEUwICwgNjYzLjk3RTAgLCA2NDYuOUUwICAsIDc0OC4yOUUwICwgNzQ5LjIxRTAgLCA3NTAuMTRFMCAsIDY0Ny4wNEUwICwgNjQ2Ljg5RTAgLCA3NDYuOUUwICAsIDc0OC40M0UwICwgNzQ3LjM1RTAgLCA3NDkuMjdFMCAsIDY0Ny42MUUwICwgNzQ3Ljc4RTAgLCA3NTAuNTFFMCAsIDg1MS4zN0UwICwgODQ1Ljk3RTAgLCA4NDcuNTRFMCAsIDg0OS45M0UwICwgODUxLjYxRTAgLCA4NDkuNzVFMCAsIDg1MC45OEUwICwgODQ4LjIzRTB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9oYWhuMS5zaHRtbAordm9pZCB0ZXN0TmlzdEhhaG4xKHZvaWQpCit7CisgIGNvbnN0IGludCAgbj03OworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDEwLiwgLTEuLCAuMDUsIC0uMDAwMDEsIC0uMDUsIC4wMDEsIC0uMDAwMDAxOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaGFobjFfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8aGFobjFfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMTEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMTApOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuNTMyNDM4Mjg1NEUrMDApOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS4wNzc2MzUxNzMzRSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwtMS4yMjY5Mjk2OTIxRS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgNC4wODYzNzUwNjEwRS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwtMS40MjYyNjRlLTA2KTsgLy8gc2hvdWxkZSBiZSA6IC0xLjQyNjI2NjI1MTRFLTA2CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwtNS43NjA5OTQwOTAxRS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFs1XSwgMi40MDUzNzM1NTAzRS0wNCk7CisgIFZFUklGWV9JU19BUFBST1goeFs2XSwtMS4yMzE0NDUwMTk5RS0wNyk7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IC4xLCAtLjEsIC4wMDUsIC0uMDAwMDAxLCAtLjAwNSwgLjAwMDEsIC0uMDAwMDAwMTsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMTEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMTApOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuNTMyNDM4Mjg1NEUrMDApOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS4wNzc2NDApOyAvLyBzaG91bGQgYmUgOiAgMS4wNzc2MzUxNzMzRSswMAorICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIC0wLjEyMjY5MzMpOyAvLyBzaG91bGQgYmUgOiAtMS4yMjY5Mjk2OTIxRS0wMQorICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDAuMDA0MDg2MzgzKTsgLy8gc2hvdWxkIGJlIDogNC4wODYzNzUwNjEwRS0wMworICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIC0xLjQyNjI3N2UtMDYpOyAvLyBzaG91bGRlIGJlIDogLTEuNDI2MjY2MjUxNEUtMDYKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLC01Ljc2MDk5NDA5MDFFLTAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCAwLjAwMDI0MDUzNzcyKTsgLy8gc2hvdWxkIGJlIDogMi40MDUzNzM1NTAzRS0wNAorICBWRVJJRllfSVNfQVBQUk9YKHhbNl0sIC0xLjIzMTQ1MGUtMDcpOyAvLyBzaG91bGQgYmUgOiAtMS4yMzE0NDUwMTk5RS0wNworCit9CisKK3N0cnVjdCBtaXNyYTFkX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBtaXNyYTFkX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMiwxNCkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTRdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNF07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNCk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE0OyBpKyspIHsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdKmJbMV0qeFtpXS8oMS4rYlsxXSp4W2ldKSAtIHlbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTIpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTE0KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0yKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTQ7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGRlbiA9IDEuK2JbMV0qeFtpXTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IGJbMV0qeFtpXSAvIGRlbjsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IGJbMF0qeFtpXSooZGVuLWJbMV0qeFtpXSkvZGVuL2RlbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIG1pc3JhMWRfZnVuY3Rvcjo6eFsxNF0gPSB7IDc3LjZFMCwgMTE0LjlFMCwgMTQxLjFFMCwgMTkwLjhFMCwgMjM5LjlFMCwgMjg5LjBFMCwgMzMyLjhFMCwgMzc4LjRFMCwgNDM0LjhFMCwgNDc3LjNFMCwgNTM2LjhFMCwgNTkzLjFFMCwgNjg5LjFFMCwgNzYwLjBFMH07Citjb25zdCBkb3VibGUgbWlzcmExZF9mdW5jdG9yOjp5WzE0XSA9IHsgMTAuMDdFMCwgMTQuNzNFMCwgMTcuOTRFMCwgMjMuOTNFMCwgMjkuNjFFMCwgMzUuMThFMCwgNDAuMDJFMCwgNDQuODJFMCwgNTAuNzZFMCwgNTUuMDVFMCwgNjEuMDFFMCwgNjYuNDBFMCwgNzUuNDdFMCwgODEuNzhFMH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL21pc3JhMWQuc2h0bWwKK3ZvaWQgdGVzdE5pc3RNaXNyYTFkKHZvaWQpCit7CisgIGNvbnN0IGludCBuPTI7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgNTAwLiwgMC4wMDAxOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbWlzcmExZF9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxtaXNyYTFkX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNyk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS42NDE5Mjk1MjgzRS0wMik7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCA0LjM3MzY5NzA3NTRFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAzLjAyMjczMjQ0NDlFLTA0KTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgNDUwLiwgMC4wMDAzOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDMpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDUuNjQxOTI5NTI4M0UtMDIpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgNC4zNzM2OTcwNzU0RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMy4wMjI3MzI0NDQ5RS0wNCk7Cit9CisKKworc3RydWN0IGxhbmN6b3MxX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBsYW5jem9zMV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDYsMjQpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzI0XTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMjRdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Nik7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MjQpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwyNDsgaSsrKQorICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0qZXhwKC1iWzFdKnhbaV0pICsgYlsyXSpleHAoLWJbM10qeFtpXSkgKyBiWzRdKmV4cCgtYls1XSp4W2ldKSAgLSB5W2ldOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Nik7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MjQpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTYpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwyNDsgaSsrKSB7CisgICAgICAgICAgICBmamFjKGksMCkgPSBleHAoLWJbMV0qeFtpXSk7CisgICAgICAgICAgICBmamFjKGksMSkgPSAtYlswXSp4W2ldKmV4cCgtYlsxXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IGV4cCgtYlszXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwzKSA9IC1iWzJdKnhbaV0qZXhwKC1iWzNdKnhbaV0pOworICAgICAgICAgICAgZmphYyhpLDQpID0gZXhwKC1iWzVdKnhbaV0pOworICAgICAgICAgICAgZmphYyhpLDUpID0gLWJbNF0qeFtpXSpleHAoLWJbNV0qeFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKK2NvbnN0IGRvdWJsZSBsYW5jem9zMV9mdW5jdG9yOjp4WzI0XSA9IHsgMC4wMDAwMDAwMDAwMDBFKzAwLCA1LjAwMDAwMDAwMDAwMEUtMDIsIDEuMDAwMDAwMDAwMDAwRS0wMSwgMS41MDAwMDAwMDAwMDBFLTAxLCAyLjAwMDAwMDAwMDAwMEUtMDEsIDIuNTAwMDAwMDAwMDAwRS0wMSwgMy4wMDAwMDAwMDAwMDBFLTAxLCAzLjUwMDAwMDAwMDAwMEUtMDEsIDQuMDAwMDAwMDAwMDAwRS0wMSwgNC41MDAwMDAwMDAwMDBFLTAxLCA1LjAwMDAwMDAwMDAwMEUtMDEsIDUuNTAwMDAwMDAwMDAwRS0wMSwgNi4wMDAwMDAwMDAwMDBFLTAxLCA2LjUwMDAwMDAwMDAwMEUtMDEsIDcuMDAwMDAwMDAwMDAwRS0wMSwgNy41MDAwMDAwMDAwMDBFLTAxLCA4LjAwMDAwMDAwMDAwMEUtMDEsIDguNTAwMDAwMDAwMDAwRS0wMSwgOS4wMDAwMDAwMDAwMDBFLTAxLCA5LjUwMDAwMDAwMDAwMEUtMDEsIDEuMDAwMDAwMDAwMDAwRSswMCwgMS4wNTAwMDAwMDAwMDBFKzAwLCAxLjEwMDAwMDAwMDAwMEUrMDAsIDEuMTUwMDAwMDAwMDAwRSswMCB9OworY29uc3QgZG91YmxlIGxhbmN6b3MxX2Z1bmN0b3I6OnlbMjRdID0geyAyLjUxMzQwMDAwMDAwMEUrMDAgLDIuMDQ0MzMzMzczMjkxRSswMCAsMS42Njg0MDQ0MzY1NjRFKzAwICwxLjM2NjQxODAyMTIwOEUrMDAgLDEuMTIzMjMyNDg3MzcyRSswMCAsOS4yNjg4OTcxODAwMzdFLTAxICw3LjY3OTMzODU2MzcyOEUtMDEgLDYuMzg4Nzc1NTIzMTA2RS0wMSAsNS4zMzc4MzUzMTc0MDJFLTAxICw0LjQ3OTM2MzYxNzM0N0UtMDEgLDMuNzc1ODQ3ODg0MzUwRS0wMSAsMy4xOTczOTMxOTkzMjZFLTAxICwyLjcyMDEzMDc3Mzc0NkUtMDEgLDIuMzI0OTY1NTI5MDMyRS0wMSAsMS45OTY1ODk1NDYwNjVFLTAxICwxLjcyMjcwNDEyNjkxNEUtMDEgLDEuNDkzNDA1NjYwMTY4RS0wMSAsMS4zMDA3MDAyMDY5MjJFLTAxICwxLjEzODExOTMyNDY0NEUtMDEgLDEuMDAwNDE1NTg3NTU5RS0wMSAsOC44MzMyMDkwODQ1NDBFLTAyICw3LjgzMzU0NDAxOTM1MEUtMDIgLDYuOTc2NjkzNzQzNDQ5RS0wMiAsNi4yMzkzMTI1MzY3MTlFLTAyIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2xhbmN6b3MxLnNodG1sCit2b2lkIHRlc3ROaXN0TGFuY3pvczEodm9pZCkKK3sKKyAgY29uc3QgaW50IG49NjsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAxLjIsIDAuMywgNS42LCA1LjUsIDYuNSwgNy42OworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgbGFuY3pvczFfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8bGFuY3pvczFfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDIpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgNzkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgNzIpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuNDMwODk5NzY0MDk3ZS0yNSk7ICAvLyBzaG91bGQgYmUgMS40MzA3ODY3NzIxRS0yNSwgYnV0IG5pc3QgcmVzdWx0cyBhcmUgb24gMTI4LWJpdCBmbG9hdHMKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDkuNTEwMDAwMDAyN0UtMDIpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDEuMDAwMDAwMDAwMUUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDguNjA3MDAwMDAxM0UtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIDMuMDAwMDAwMDAwMkUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIDEuNTU3NTk5OTk5OEUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbNV0sIDUuMDAwMDAwMDAwMUUrMDApOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCAwLjUsIDAuNywgMy42LCA0LjIsIDQuLCA2LjM7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgOCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgMS40Mjg1OTU1MzM4NDVlLTI1KTsgIC8vIHNob3VsZCBiZSAxLjQzMDc4Njc3MjFFLTI1LCBidXQgbmlzdCByZXN1bHRzIGFyZSBvbiAxMjgtYml0IGZsb2F0cworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgOS41MTAwMDAwMDI3RS0wMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMS4wMDAwMDAwMDAxRSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgOC42MDcwMDAwMDEzRS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMy4wMDAwMDAwMDAyRSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwgMS41NTc1OTk5OTk4RSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFs1XSwgNS4wMDAwMDAwMDAxRSswMCk7CisKK30KKworc3RydWN0IHJhdDQyX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICByYXQ0Ml9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDMsOSkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbOV07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzldOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09OSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDk7IGkrKykgeworICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0gLyAoMS4rZXhwKGJbMV0tYlsyXSp4W2ldKSkgLSB5W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTkpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOworICAgICAgICBmb3IoaW50IGk9MDsgaTw5OyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0tYlsyXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuLygxLitlKTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IC1iWzBdKmUvKDEuK2UpLygxLitlKTsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9ICtiWzBdKmUqeFtpXS8oMS4rZSkvKDEuK2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgcmF0NDJfZnVuY3Rvcjo6eFs5XSA9IHsgOS4wMDBFMCwgMTQuMDAwRTAsIDIxLjAwMEUwLCAyOC4wMDBFMCwgNDIuMDAwRTAsIDU3LjAwMEUwLCA2My4wMDBFMCwgNzAuMDAwRTAsIDc5LjAwMEUwIH07Citjb25zdCBkb3VibGUgcmF0NDJfZnVuY3Rvcjo6eVs5XSA9IHsgOC45MzBFMCAsMTAuODAwRTAgLDE4LjU5MEUwICwyMi4zMzBFMCAsMzkuMzUwRTAgLDU2LjExMEUwICw2MS43MzBFMCAsNjQuNjIwRTAgLDY3LjA4MEUwIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL3JhdGtvd3NreTIuc2h0bWwKK3ZvaWQgdGVzdE5pc3RSYXQ0Mih2b2lkKQoreworICBjb25zdCBpbnQgbj0zOworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDEwMC4sIDEuLCAwLjE7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICByYXQ0Ml9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxyYXQ0Ml9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAxMCk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCA4KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA4LjA1NjUyMjkzMzhFKzAwKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDcuMjQ2MjIzNzU3NkUrMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDIuNjE4MDc2ODQwMkUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDYuNzM1OTIwMDA2NkUtMDIpOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCA3NS4sIDIuNSwgMC4wNzsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgNik7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCA1KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA4LjA1NjUyMjkzMzhFKzAwKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDcuMjQ2MjIzNzU3NkUrMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDIuNjE4MDc2ODQwMkUrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDYuNzM1OTIwMDA2NkUtMDIpOworfQorCitzdHJ1Y3QgTUdIMTBfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIE1HSDEwX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywxNikge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTZdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNl07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNik7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE2OyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gIGJbMF0gKiBleHAoYlsxXS8oeFtpXStiWzJdKSkgLSB5W2ldOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTYpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxNjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgZmFjdG9yID0gMS4vKHhbaV0rYlsyXSk7CisgICAgICAgICAgICBkb3VibGUgZSA9IGV4cChiWzFdKmZhY3Rvcik7CisgICAgICAgICAgICBmamFjKGksMCkgPSBlOworICAgICAgICAgICAgZmphYyhpLDEpID0gYlswXSpmYWN0b3IqZTsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IC1iWzFdKmJbMF0qZmFjdG9yKmZhY3RvciplOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgTUdIMTBfZnVuY3Rvcjo6eFsxNl0gPSB7IDUuMDAwMDAwRSswMSwgNS41MDAwMDBFKzAxLCA2LjAwMDAwMEUrMDEsIDYuNTAwMDAwRSswMSwgNy4wMDAwMDBFKzAxLCA3LjUwMDAwMEUrMDEsIDguMDAwMDAwRSswMSwgOC41MDAwMDBFKzAxLCA5LjAwMDAwMEUrMDEsIDkuNTAwMDAwRSswMSwgMS4wMDAwMDBFKzAyLCAxLjA1MDAwMEUrMDIsIDEuMTAwMDAwRSswMiwgMS4xNTAwMDBFKzAyLCAxLjIwMDAwMEUrMDIsIDEuMjUwMDAwRSswMiB9OworY29uc3QgZG91YmxlIE1HSDEwX2Z1bmN0b3I6OnlbMTZdID0geyAzLjQ3ODAwMEUrMDQsIDIuODYxMDAwRSswNCwgMi4zNjUwMDBFKzA0LCAxLjk2MzAwMEUrMDQsIDEuNjM3MDAwRSswNCwgMS4zNzIwMDBFKzA0LCAxLjE1NDAwMEUrMDQsIDkuNzQ0MDAwRSswMywgOC4yNjEwMDBFKzAzLCA3LjAzMDAwMEUrMDMsIDYuMDA1MDAwRSswMywgNS4xNDcwMDBFKzAzLCA0LjQyNzAwMEUrMDMsIDMuODIwMDAwRSswMywgMy4zMDcwMDBFKzAzLCAyLjg3MjAwMEUrMDMgfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWdoMTAuc2h0bWwKK3ZvaWQgdGVzdE5pc3RNR0gxMCh2b2lkKQoreworICBjb25zdCBpbnQgbj0zOworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDIuLCA0MDAwMDAuLCAyNTAwMC47CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBNR0gxMF9mdW5jdG9yIGZ1bmN0b3I7CisgIExldmVuYmVyZ01hcnF1YXJkdDxNR0gxMF9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMik7IAorICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMjg0ICk7IAorICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMjQ5ICk7IAorICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDguNzk0NTg1NTE3MUUrMDEpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgNS42MDk2MzY0NzEwRS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNi4xODEzNDYzNDYzRSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMy40NTIyMzYzNDYyRSswMik7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDAuMDIsIDQwMDAuLCAyNTAuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMyk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAxMjYpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMTE2KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA4Ljc5NDU4NTUxNzFFKzAxKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDUuNjA5NjM2NDcxMEUtMDMpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDYuMTgxMzQ2MzQ2M0UrMDMpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDMuNDUyMjM2MzQ2MkUrMDIpOworfQorCisKK3N0cnVjdCBCb3hCT0RfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIEJveEJPRF9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDIsNikge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbNl07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzZdID0geyAxMDkuLCAxNDkuLCAxNDkuLCAxOTEuLCAyMTMuLCAyMjQuIH07CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09Nik7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDY7IGkrKykKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSAgYlswXSooMS4tZXhwKC1iWzFdKnhbaV0pKSAtIHlbaV07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT02KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0yKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8NjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgZSA9IGV4cCgtYlsxXSp4W2ldKTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuLWU7CisgICAgICAgICAgICBmamFjKGksMSkgPSBiWzBdKnhbaV0qZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIEJveEJPRF9mdW5jdG9yOjp4WzZdID0geyAxLiwgMi4sIDMuLCA1LiwgNy4sIDEwLiB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9ib3hib2Quc2h0bWwKK3ZvaWQgdGVzdE5pc3RCb3hCT0Qodm9pZCkKK3sKKyAgY29uc3QgaW50IG49MjsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAxLiwgMS47CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBCb3hCT0RfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8Qm94Qk9EX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMueHRvbCA9IDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy5mYWN0b3IgPSAxMC47CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMzEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMjUpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuMTY4MDA4ODc2NkUrMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMi4xMzgwOTQwODg5RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS40NzIzNzQ4NTQyRS0wMSk7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDEwMC4sIDAuNzU7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbS5yZXNldFBhcmFtZXRlcnMoKTsKKyAgbG0ucGFyYW1ldGVycy5mdG9sID0gTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy54dG9sID0gTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7IAorICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMTUgKTsgCisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCAxNCApOyAKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCAxLjE2ODAwODg3NjZFKzAzKTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDIuMTM4MDk0MDg4OUUrMDIpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDUuNDcyMzc0ODU0MkUtMDEpOworfQorCitzdHJ1Y3QgTUdIMTdfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIE1HSDE3X2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oNSwzMykge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMzNdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVszM107CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT01KTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0zMyk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDMzOyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gIGJbMF0gKyBiWzFdKmV4cCgtYlszXSp4W2ldKSArICBiWzJdKmV4cCgtYls0XSp4W2ldKSAtIHlbaV07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT01KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0zMyk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09NSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDMzOyBpKyspIHsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuOworICAgICAgICAgICAgZmphYyhpLDEpID0gZXhwKC1iWzNdKnhbaV0pOworICAgICAgICAgICAgZmphYyhpLDIpID0gZXhwKC1iWzRdKnhbaV0pOworICAgICAgICAgICAgZmphYyhpLDMpID0gLXhbaV0qYlsxXSpleHAoLWJbM10qeFtpXSk7CisgICAgICAgICAgICBmamFjKGksNCkgPSAteFtpXSpiWzJdKmV4cCgtYls0XSp4W2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIE1HSDE3X2Z1bmN0b3I6OnhbMzNdID0geyAwLjAwMDAwMEUrMDAsIDEuMDAwMDAwRSswMSwgMi4wMDAwMDBFKzAxLCAzLjAwMDAwMEUrMDEsIDQuMDAwMDAwRSswMSwgNS4wMDAwMDBFKzAxLCA2LjAwMDAwMEUrMDEsIDcuMDAwMDAwRSswMSwgOC4wMDAwMDBFKzAxLCA5LjAwMDAwMEUrMDEsIDEuMDAwMDAwRSswMiwgMS4xMDAwMDBFKzAyLCAxLjIwMDAwMEUrMDIsIDEuMzAwMDAwRSswMiwgMS40MDAwMDBFKzAyLCAxLjUwMDAwMEUrMDIsIDEuNjAwMDAwRSswMiwgMS43MDAwMDBFKzAyLCAxLjgwMDAwMEUrMDIsIDEuOTAwMDAwRSswMiwgMi4wMDAwMDBFKzAyLCAyLjEwMDAwMEUrMDIsIDIuMjAwMDAwRSswMiwgMi4zMDAwMDBFKzAyLCAyLjQwMDAwMEUrMDIsIDIuNTAwMDAwRSswMiwgMi42MDAwMDBFKzAyLCAyLjcwMDAwMEUrMDIsIDIuODAwMDAwRSswMiwgMi45MDAwMDBFKzAyLCAzLjAwMDAwMEUrMDIsIDMuMTAwMDAwRSswMiwgMy4yMDAwMDBFKzAyIH07Citjb25zdCBkb3VibGUgTUdIMTdfZnVuY3Rvcjo6eVszM10gPSB7IDguNDQwMDAwRS0wMSwgOS4wODAwMDBFLTAxLCA5LjMyMDAwMEUtMDEsIDkuMzYwMDAwRS0wMSwgOS4yNTAwMDBFLTAxLCA5LjA4MDAwMEUtMDEsIDguODEwMDAwRS0wMSwgOC41MDAwMDBFLTAxLCA4LjE4MDAwMEUtMDEsIDcuODQwMDAwRS0wMSwgNy41MTAwMDBFLTAxLCA3LjE4MDAwMEUtMDEsIDYuODUwMDAwRS0wMSwgNi41ODAwMDBFLTAxLCA2LjI4MDAwMEUtMDEsIDYuMDMwMDAwRS0wMSwgNS44MDAwMDBFLTAxLCA1LjU4MDAwMEUtMDEsIDUuMzgwMDAwRS0wMSwgNS4yMjAwMDBFLTAxLCA1LjA2MDAwMEUtMDEsIDQuOTAwMDAwRS0wMSwgNC43ODAwMDBFLTAxLCA0LjY3MDAwMEUtMDEsIDQuNTcwMDAwRS0wMSwgNC40ODAwMDBFLTAxLCA0LjM4MDAwMEUtMDEsIDQuMzEwMDAwRS0wMSwgNC4yNDAwMDBFLTAxLCA0LjIwMDAwMEUtMDEsIDQuMTQwMDAwRS0wMSwgNC4xMTAwMDBFLTAxLCA0LjA2MDAwMEUtMDEgfTsKKworLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWdoMTcuc2h0bWwKK3ZvaWQgdGVzdE5pc3RNR0gxNyh2b2lkKQoreworICBjb25zdCBpbnQgbj01OworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDUwLiwgMTUwLiwgLTEwMC4sIDEuLCAyLjsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIE1HSDE3X2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PE1HSDE3X2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBsbS5wYXJhbWV0ZXJzLnh0b2wgPSBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBsbS5wYXJhbWV0ZXJzLm1heGZldiA9IDEwMDA7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDIpOyAKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDYwMiApOyAKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDU0NSApOyAKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA1LjQ2NDg5NDY5NzVFLTA1KTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDMuNzU0MTAwNTIxMUUtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDEuOTM1ODQ2OTEyN0UrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIC0xLjQ2NDY4NzEzNjZFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAxLjI4Njc1MzQ2NDBFLTAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLCAyLjIxMjI2OTk2NjJFLTAyKTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgMC41ICAsMS41ICAsLTEgICAsMC4wMSAsMC4wMjsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtLnJlc2V0UGFyYW1ldGVycygpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDE4KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDE1KTsKKyAgLy8gY2hlY2sgbm9ybV4yCisgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA1LjQ2NDg5NDY5NzVFLTA1KTsKKyAgLy8gY2hlY2sgeAorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDMuNzU0MTAwNTIxMUUtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDEuOTM1ODQ2OTEyN0UrMDApOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIC0xLjQ2NDY4NzEzNjZFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAxLjI4Njc1MzQ2NDBFLTAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLCAyLjIxMjI2OTk2NjJFLTAyKTsKK30KKworc3RydWN0IE1HSDA5X2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICBNR0gwOV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDQsMTEpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBfeFsxMV07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzExXTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTQpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTExKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTE7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHggPSBfeFtpXSwgeHg9eCp4OworICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0qKHh4K3gqYlsxXSkvKHh4K3gqYlsyXStiWzNdKSAtIHlbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTQpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTExKTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT00KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MTE7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHggPSBfeFtpXSwgeHg9eCp4OworICAgICAgICAgICAgZG91YmxlIGZhY3RvciA9IDEuLyh4eCt4KmJbMl0rYlszXSk7CisgICAgICAgICAgICBmamFjKGksMCkgPSAoeHgreCpiWzFdKSAqIGZhY3RvcjsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IGJbMF0qeCogZmFjdG9yOworICAgICAgICAgICAgZmphYyhpLDIpID0gLSBiWzBdKih4eCt4KmJbMV0pICogeCAqIGZhY3RvciAqIGZhY3RvcjsKKyAgICAgICAgICAgIGZqYWMoaSwzKSA9IC0gYlswXSooeHgreCpiWzFdKSAqIGZhY3RvciAqIGZhY3RvcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIE1HSDA5X2Z1bmN0b3I6Ol94WzExXSA9IHsgNC4sIDIuLCAxLiwgNS5FLTEgLCAyLjVFLTAxLCAxLjY3MDAwMEUtMDEsIDEuMjUwMDAwRS0wMSwgIDEuRS0wMSwgOC4zMzAwMDBFLTAyLCA3LjE0MDAwMEUtMDIsIDYuMjUwMDAwRS0wMiB9OworY29uc3QgZG91YmxlIE1HSDA5X2Z1bmN0b3I6OnlbMTFdID0geyAxLjk1NzAwMEUtMDEsIDEuOTQ3MDAwRS0wMSwgMS43MzUwMDBFLTAxLCAxLjYwMDAwMEUtMDEsIDguNDQwMDAwRS0wMiwgNi4yNzAwMDBFLTAyLCA0LjU2MDAwMEUtMDIsIDMuNDIwMDAwRS0wMiwgMy4yMzAwMDBFLTAyLCAyLjM1MDAwMEUtMDIsIDIuNDYwMDAwRS0wMiB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9tZ2gwOS5zaHRtbAordm9pZCB0ZXN0TmlzdE1HSDA5KHZvaWQpCit7CisgIGNvbnN0IGludCBuPTQ7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgMjUuLCAzOSwgNDEuNSwgMzkuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgTUdIMDlfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8TUdIMDlfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGxtLnBhcmFtZXRlcnMubWF4ZmV2ID0gMTAwMDsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7IAorICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgNDkwICk7IAorICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMzc2ICk7IAorICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDMuMDc1MDU2MDM4NUUtMDQpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMC4xOTI4MDc3MDg5KTsgLy8gc2hvdWxkIGJlIDEuOTI4MDY5MzQ1OEUtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAwLjE5MTI2NDIzNTczKTsgLy8gc2hvdWxkIGJlIDEuOTEyODIzMjg3M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjEyMzA1MzA5OTE0KTsgLy8gc2hvdWxkIGJlIDEuMjMwNTY1MDY5M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAwLjEzNjA1Mzk1Mzc1KTsgLy8gc2hvdWxkIGJlIDEuMzYwNjIzMzA2OEUtMDEKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgMC4yNSwgMC4zOSwgMC40MTUsIDAuMzk7CisgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgorICBsbS5yZXNldFBhcmFtZXRlcnMoKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAxOCk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCAxNik7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgMy4wNzUwNTYwMzg1RS0wNCk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAwLjE5MjgwNzgxKTsgLy8gc2hvdWxkIGJlIDEuOTI4MDY5MzQ1OEUtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAwLjE5MTI2MjY1KTsgLy8gc2hvdWxkIGJlIDEuOTEyODIzMjg3M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjEyMzA1MjgwKTsgLy8gc2hvdWxkIGJlIDEuMjMwNTY1MDY5M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAwLjEzNjA1MzIyKTsgLy8gc2hvdWxkIGJlIDEuMzYwNjIzMzA2OEUtMDEKK30KKworCisKK3N0cnVjdCBCZW5uZXR0NV9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgQmVubmV0dDVfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPigzLDE1NCkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTU0XTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTU0XTsKKyAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTE1NCk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE1NDsgaSsrKQorICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0qIHBvdyhiWzFdK3hbaV0sLTEuL2JbMl0pIC0geVtpXTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTE1NCk7CisgICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Myk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDE1NDsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgZSA9IHBvdyhiWzFdK3hbaV0sLTEuL2JbMl0pOworICAgICAgICAgICAgZmphYyhpLDApID0gZTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IC0gYlswXSplL2JbMl0vKGJbMV0reFtpXSk7CisgICAgICAgICAgICBmamFjKGksMikgPSBiWzBdKmUqbG9nKGJbMV0reFtpXSkvYlsyXS9iWzJdOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgQmVubmV0dDVfZnVuY3Rvcjo6eFsxNTRdID0geyA3LjQ0NzE2OEUwLCA4LjEwMjU4NkUwLCA4LjQ1MjU0N0UwLCA4LjcxMTI3OEUwLCA4LjkxNjc3NEUwLCA5LjA4NzE1NUUwLCA5LjIzMjU5MEUwLCA5LjM1OTUzNUUwLCA5LjQ3MjE2NkUwLCA5LjU3MzM4NEUwLCA5LjY2NTI5M0UwLCA5Ljc0OTQ2MUUwLCA5LjgyNzA5MkUwLCA5Ljg5OTEyOEUwLCA5Ljk2NjMyMUUwLCAxMC4wMjkyODBFMCwgMTAuMDg4NTEwRTAsIDEwLjE0NDQzMEUwLCAxMC4xOTczODBFMCwgMTAuMjQ3NjcwRTAsIDEwLjI5NTU2MEUwLCAxMC4zNDEyNTBFMCwgMTAuMzg0OTUwRTAsIDEwLjQyNjgyMEUwLCAxMC40NjcwMDBFMCwgMTAuNTA1NjQwRTAsIDEwLjU0MjgzMEUwLCAxMC41Nzg2OTBFMCwgMTAuNjEzMzEwRTAsIDEwLjY0Njc4MEUwLCAxMC42NzkxNTBFMCwgMTAuNzEwNTIwRTAsIDEwLjc0MDkyMEUwLCAxMC43NzA0NDBFMCwgMTAuNzk5MTAwRTAsIDEwLjgyNjk3MEUwLCAxMC44NTQwODBFMCwgMTAuODgwNDcwRTAsIDEwLjkwNjE5MEUwLCAxMC45MzEyNjBFMCwgMTAuOTU1NzIwRTAsIDEwLjk3OTU5MEUwLCAxMS4wMDI5MTBFMCwgMTEuMDI1NzAwRTAsIDExLjA0Nzk4MEUwLCAxMS4wNjk3NzBFMCwgMTEuMDkxMTAwRTAsIDExLjExMTk4MEUwLCAxMS4xMzI0NDBFMCwgMTEuMTUyNDgwRTAsIDExLjE3MjEzMEUwLCAxMS4xOTE0MTBFMCwgMTEuMjEwMzEwRTAsIDExLjIyODg3MEUwLCAxMS4yNDcwOTBFMCwgMTEuMjY0OTgwRTAsIDExLjI4MjU2MEUwLCAxMS4yOTk4NDBFMCwgMTEuMzE2ODIwRTAsIDExLjMzMzUyMEUwLCAxMS4zNDk5NDBFMCwgMTEuMzY2MTAwRTAsIDExLjM4MjAwMEUwLCAxMS4zOTc2NjBFMCwgMTEuNDEzMDcwRTAsIDExLjQyODI0MEUwLCAxMS40NDMyMDBFMCwgMTEuNDU3OTMwRTAsIDExLjQ3MjQ0MEUwLCAxMS40ODY3NTBFMCwgMTEuNTAwODYwRTAsIDExLjUxNDc3MEUwLCAxMS41Mjg0OTBFMCwgMTEuNTQyMDIwRTAsIDExLjU1NTM4MEUwLCAxMS41Njg1NTBFMCwgMTEuNTgxNTYwRTAsIDExLjU5NDQyMEUwLCAxMS42MDcxMjFFMCwgMTEuNjE5NjQwRTAsIDExLjYzMjAwMEUwLCAxMS42NDQyMTBFMCwgMTEuNjU2MjgwRTAsIDExLjY2ODIwMEUwLCAxMS42Nzk5ODBFMCwgMTEuNjkxNjIwRTAsIDExLjcwMzEzMEUwLCAxMS43MTQ1MTBFMCwgMTEuNzI1NzYwRTAsIDExLjczNjg4MEUwLCAxMS43NDc4OTBFMCwgMTEuNzU4NzgwRTAsIDExLjc2OTU1MEUwLCAxMS43ODAyMDBFMCwgMTEuNzkwNzMwRTAsIDExLjgwMTE2MEUwLCAxMS44MTE0ODBFMCwgMTEuODIxNzAwRTAsIDExLjgzMTgxMEUwLCAxMS44NDE4MjBFMCwgMTEuODUxNzMwRTAsIDExLjg2MTU1MEUwLCAxMS44NzEyNzBFMCwgMTEuODgwODkwRTAsIDExLjg5MDQyMEUwLCAxMS44OTk4NzBFMCwgMTEuOTA5MjIwRTAsIDExLjkxODQ5MEUwLCAxMS45Mjc2ODBFMCwgMTEuOTM2NzgwRTAsIDExLjk0NTc5MEUwLCAxMS45NTQ3MzBFMCwgMTEuOTYzNTkwRTAsIDExLjk3MjM3MEUwLCAxMS45ODEwNzBFMCwgMTEuOTg5NzAwRTAsIDExLjk5ODI2MEUwLCAxMi4wMDY3NDBFMCwgMTIuMDE1MTUwRTAsIDEyLjAyMzQ5MEUwLCAxMi4wMzE3NjBFMCwgMTIuMDM5OTcwRTAsIDEyLjA0ODEwMEUwLCAxMi4wNTYxNzBFMCwgMTIuMDY0MTgwRTAsIDEyLjA3MjEyMEUwLCAxMi4wODAwMTBFMCwgMTIuMDg3ODIwRTAsIDEyLjA5NTU4MEUwLCAxMi4xMDMyODBFMCwgMTIuMTEwOTIwRTAsIDEyLjExODUwMEUwLCAxMi4xMjYwMzBFMCwgMTIuMTMzNTAwRTAsIDEyLjE0MDkxMEUwLCAxMi4xNDgyNzBFMCwgMTIuMTU1NTcwRTAsIDEyLjE2MjgzMEUwLCAxMi4xNzAwMzBFMCwgMTIuMTc3MTcwRTAsIDEyLjE4NDI3MEUwLCAxMi4xOTEzMjBFMCwgMTIuMTk4MzIwRTAsIDEyLjIwNTI3MEUwLCAxMi4yMTIxNzBFMCwgMTIuMjE5MDMwRTAsIDEyLjIyNTg0MEUwLCAxMi4yMzI2MDBFMCwgMTIuMjM5MzIwRTAsIDEyLjI0NTk5MEUwLCAxMi4yNTI2MjBFMCwgMTIuMjU5MjAwRTAsIDEyLjI2NTc1MEUwLCAxMi4yNzIyNDBFMCB9OworY29uc3QgZG91YmxlIEJlbm5ldHQ1X2Z1bmN0b3I6OnlbMTU0XSA9IHsgLTM0LjgzNDcwMkUwICwtMzQuMzkzMjAwRTAgLC0zNC4xNTI5MDFFMCAsLTMzLjk3OTA5OUUwICwtMzMuODQ1OTAxRTAgLC0zMy43MzI4OTlFMCAsLTMzLjY0MDMwMUUwICwtMzMuNTU5MjAwRTAgLC0zMy40ODY4MDFFMCAsLTMzLjQyMzEwMEUwICwtMzMuMzY1MTAxRTAgLC0zMy4zMTMwMDBFMCAsLTMzLjI2MDg5OUUwICwtMzMuMjE3NDAwRTAgLC0zMy4xNzY4OTlFMCAsLTMzLjEzOTE5OEUwICwtMzMuMTAxNjAxRTAgLC0zMy4wNjY3OTlFMCAsLTMzLjAzNTAwMEUwICwtMzMuMDAzMTAxRTAgLC0zMi45NzEyOThFMCAsLTMyLjk0MjI5OUUwICwtMzIuOTE2MzAyRTAgLC0zMi44OTAyMDJFMCAsLTMyLjg2NDEwMUUwICwtMzIuODQxMDAwRTAgLC0zMi44MTc3OTlFMCAsLTMyLjc5NzUwMUUwICwtMzIuNzc0MzAwRTAgLC0zMi43NTcwMDBFMCAsLTMyLjczMzc5OUUwICwtMzIuNzE2NDAwRTAgLC0zMi42OTkxMDBFMCAsLTMyLjY3ODc5OUUwICwtMzIuNjYxNDAwRTAgLC0zMi42NDQwMDFFMCAsLTMyLjYyNjcwMUUwICwtMzIuNjEyMjAyRTAgLC0zMi41OTc2OThFMCAsLTMyLjU4MzE5OUUwICwtMzIuNTY4Njk5RTAgLC0zMi41NTQyOThFMCAsLTMyLjUzOTc5OUUwICwtMzIuNTI1Mjk5RTAgLC0zMi41MTA3OTlFMCAsLTMyLjQ5OTE5OUUwICwtMzIuNDg3NTk4RTAgLC0zMi40NzMyMDJFMCAsLTMyLjQ2MTYwMUUwICwtMzIuNDM1NTAxRTAgLC0zMi40MzU1MDFFMCAsLTMyLjQyNjgwMEUwICwtMzIuNDEyMzAwRTAgLC0zMi40MDA3OTlFMCAsLTMyLjM5MjEwMUUwICwtMzIuMzgwNTAxRTAgLC0zMi4zNjYwMDFFMCAsLTMyLjM1NzMwMEUwICwtMzIuMzQ4NTk4RTAgLC0zMi4zMzk5MDFFMCAsLTMyLjMyODQwMEUwICwtMzIuMzE5Njk4RTAgLC0zMi4zMTEwMDFFMCAsLTMyLjI5OTQwMEUwICwtMzIuMjkwNjk5RTAgLC0zMi4yODIwMDFFMCAsLTMyLjI3MzMwMEUwICwtMzIuMjY0NTk5RTAgLC0zMi4yNTYwMDFFMCAsLTMyLjI0NzI5OUUwICwtMzIuMjM4NjAyRTAgLC0zMi4yMjk5MDBFMCAsLTMyLjIyNDA5OEUwICwtMzIuMjE1NDAxRTAgLC0zMi4yMDM4MDBFMCAsLTMyLjE5ODAwMkUwICwtMzIuMTg5NDAwRTAgLC0zMi4xODM2MDFFMCAsLTMyLjE3NDkwMEUwICwtMzIuMTY5MTAyRTAgLC0zMi4xNjMzMDBFMCAsLTMyLjE1NDU5OEUwICwtMzIuMTQ1OTAxRTAgLC0zMi4xNDAwOTlFMCAsLTMyLjEzMTQwMUUwICwtMzIuMTI1NTk5RTAgLC0zMi4xMTk4MDFFMCAsLTMyLjExMTE5OEUwICwtMzIuMTA1NDAwRTAgLC0zMi4wOTY2OTlFMCAsLTMyLjA5MDkwMEUwICwtMzIuMDg4MDAxRTAgLC0zMi4wNzkzMDBFMCAsLTMyLjA3MzUwMkUwICwtMzIuMDY3Njk5RTAgLC0zMi4wNjE5MDFFMCAsLTMyLjA1NjA5OUUwICwtMzIuMDUwMzAxRTAgLC0zMi4wNDQ0OThFMCAsLTMyLjAzODc5OUUwICwtMzIuMDMzMDAxRTAgLC0zMi4wMjcxOTlFMCAsLTMyLjAyNDMwMEUwICwtMzIuMDE4NTAxRTAgLC0zMi4wMTI2OTlFMCAsLTMyLjAwNDAwMkUwICwtMzIuMDAxMDk5RTAgLC0zMS45OTUzMDBFMCAsLTMxLjk4OTUwMEUwICwtMzEuOTgzNzAwRTAgLC0zMS45Nzc5MDBFMCAsLTMxLjk3MjA5OUUwICwtMzEuOTY5Mjk5RTAgLC0zMS45NjM1MDFFMCAsLTMxLjk1NzcwMUUwICwtMzEuOTUxOTAwRTAgLC0zMS45NDYxMDBFMCAsLTMxLjk0MDMwMEUwICwtMzEuOTM3NDAxRTAgLC0zMS45MzE2MDFFMCAsLTMxLjkyNTgwMEUwICwtMzEuOTIyODk5RTAgLC0zMS45MTcxMDFFMCAsLTMxLjkxMTMwMUUwICwtMzEuOTA4NDAwRTAgLC0zMS45MDI1OTlFMCAsLTMxLjg5NjkwMEUwICwtMzEuODkzOTk5RTAgLC0zMS44ODgyMDFFMCAsLTMxLjg4NTMwMEUwICwtMzEuODgyNDAxRTAgLC0zMS44NzY2MDBFMCAsLTMxLjg3MzY5OUUwICwtMzEuODY3OTAxRTAgLC0zMS44NjIxMDFFMCAsLTMxLjg1OTIwMEUwICwtMzEuODU2MzAwRTAgLC0zMS44NTA1MDBFMCAsLTMxLjg0NDcwMEUwICwtMzEuODQxODAxRTAgLC0zMS44Mzg5MDBFMCAsLTMxLjgzMzA5OUUwICwtMzEuODMwMjAwRTAgLC0zMS44MjcyOTlFMCAsLTMxLjgyMTYwMEUwICwtMzEuODE4NzAxRTAgLC0zMS44MTI5MDFFMCAsLTMxLjgwOTk5OUUwICwtMzEuODA3MTAwRTAgLC0zMS44MDEzMDBFMCAsLTMxLjc5ODQwMUUwICwtMzEuNzk1NTAwRTAgLC0zMS43ODk3MDBFMCAsLTMxLjc4NjgwMEUwIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2Jlbm5ldHQ1LnNodG1sCit2b2lkIHRlc3ROaXN0QmVubmV0dDUodm9pZCkKK3sKKyAgY29uc3QgaW50ICBuPTM7CisgIGludCBpbmZvOworCisgIFZlY3RvclhkIHgobik7CisKKyAgLyoKKyAgICogRmlyc3QgdHJ5CisgICAqLworICB4PDwgLTIwMDAuLCA1MC4sIDAuODsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIEJlbm5ldHQ1X2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PEJlbm5ldHQ1X2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBsbS5wYXJhbWV0ZXJzLm1heGZldiA9IDEwMDA7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgNzU4KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDc0NCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS4yNDA0NzQ0MDczRS0wNCk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAtMi41MjM1MDU4MDQzRSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNC42NzM2NTY0NjQ0RSswMSk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgOS4zMjE4NDgzMTkzRS0wMSk7CisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCAtMTUwMC4sIDQ1LiwgMC44NTsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtLnJlc2V0UGFyYW1ldGVycygpOworICBpbmZvID0gbG0ubWluaW1pemUoeCk7CisKKyAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCisgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYsIDIwMyk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCAxOTIpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDUuMjQwNDc0NDA3M0UtMDQpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgLTI1MjMuMzAwNzg2NSk7IC8vIHNob3VsZCBiZSAtMi41MjM1MDU4MDQzRSswMworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDQ2LjczNTcwNTc3MSk7IC8vIHNob3VsZCBiZSA0LjY3MzY1NjQ2NDRFKzAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjkzMjE5ODgxODkxKTsgLy8gc2hvdWxkIGJlIDkuMzIxODQ4MzE5M0UtMDEpOworfQorCitzdHJ1Y3QgdGh1cmJlcl9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgdGh1cmJlcl9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDcsMzcpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBfeFszN107CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBfeVszN107CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgLy8gICAgICAgIGludCBjYWxsZWQ9MDsgcHJpbnRmKCJjYWxsIGhhaG4xX2Z1bmN0b3Igd2l0aCAgaWZsYWc9JWQsIGNhbGxlZD0lZFxuIiwgaWZsYWcsIGNhbGxlZCk7IGlmIChpZmxhZz09MSkgY2FsbGVkKys7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09Nyk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MzcpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwzNzsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgeD1feFtpXSwgeHg9eCp4LCB4eHg9eHgqeDsKKyAgICAgICAgICAgIGZ2ZWNbaV0gPSAoYlswXStiWzFdKngrYlsyXSp4eCtiWzNdKnh4eCkgLyAoMS4rYls0XSp4K2JbNV0qeHgrYls2XSp4eHgpIC0gX3lbaV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTcpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTM3KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT03KTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8Mzc7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHg9X3hbaV0sIHh4PXgqeCwgeHh4PXh4Kng7CisgICAgICAgICAgICBkb3VibGUgZmFjdCA9IDEuLygxLitiWzRdKngrYls1XSp4eCtiWzZdKnh4eCk7CisgICAgICAgICAgICBmamFjKGksMCkgPSAxLipmYWN0OworICAgICAgICAgICAgZmphYyhpLDEpID0geCpmYWN0OworICAgICAgICAgICAgZmphYyhpLDIpID0geHgqZmFjdDsKKyAgICAgICAgICAgIGZqYWMoaSwzKSA9IHh4eCpmYWN0OworICAgICAgICAgICAgZmFjdCA9IC0gKGJbMF0rYlsxXSp4K2JbMl0qeHgrYlszXSp4eHgpICogZmFjdCAqIGZhY3Q7CisgICAgICAgICAgICBmamFjKGksNCkgPSB4KmZhY3Q7CisgICAgICAgICAgICBmamFjKGksNSkgPSB4eCpmYWN0OworICAgICAgICAgICAgZmphYyhpLDYpID0geHh4KmZhY3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKK2NvbnN0IGRvdWJsZSB0aHVyYmVyX2Z1bmN0b3I6Ol94WzM3XSA9IHsgLTMuMDY3RTAsIC0yLjk4MUUwLCAtMi45MjFFMCwgLTIuOTEyRTAsIC0yLjg0MEUwLCAtMi43OTdFMCwgLTIuNzAyRTAsIC0yLjY5OUUwLCAtMi42MzNFMCwgLTIuNDgxRTAsIC0yLjM2M0UwLCAtMi4zMjJFMCwgLTEuNTAxRTAsIC0xLjQ2MEUwLCAtMS4yNzRFMCwgLTEuMjEyRTAsIC0xLjEwMEUwLCAtMS4wNDZFMCwgLTAuOTE1RTAsIC0wLjcxNEUwLCAtMC41NjZFMCwgLTAuNTQ1RTAsIC0wLjQwMEUwLCAtMC4zMDlFMCwgLTAuMTA5RTAsIC0wLjEwM0UwLCAwLjAxMEUwLCAwLjExOUUwLCAwLjM3N0UwLCAwLjc5MEUwLCAwLjk2M0UwLCAxLjAwNkUwLCAxLjExNUUwLCAxLjU3MkUwLCAxLjg0MUUwLCAyLjA0N0UwLCAyLjIwMEUwIH07Citjb25zdCBkb3VibGUgdGh1cmJlcl9mdW5jdG9yOjpfeVszN10gPSB7IDgwLjU3NEUwLCA4NC4yNDhFMCwgODcuMjY0RTAsIDg3LjE5NUUwLCA4OS4wNzZFMCwgODkuNjA4RTAsIDg5Ljg2OEUwLCA5MC4xMDFFMCwgOTIuNDA1RTAsIDk1Ljg1NEUwLCAxMDAuNjk2RTAsIDEwMS4wNjBFMCwgNDAxLjY3MkUwLCAzOTAuNzI0RTAsIDU2Ny41MzRFMCwgNjM1LjMxNkUwLCA3MzMuMDU0RTAsIDc1OS4wODdFMCwgODk0LjIwNkUwLCA5OTAuNzg1RTAsIDEwOTAuMTA5RTAsIDEwODAuOTE0RTAsIDExMjIuNjQzRTAsIDExNzguMzUxRTAsIDEyNjAuNTMxRTAsIDEyNzMuNTE0RTAsIDEyODguMzM5RTAsIDEzMjcuNTQzRTAsIDEzNTMuODYzRTAsIDE0MTQuNTA5RTAsIDE0MjUuMjA4RTAsIDE0MjEuMzg0RTAsIDE0NDIuOTYyRTAsIDE0NjQuMzUwRTAsIDE0NjguNzA1RTAsIDE0NDcuODk0RTAsIDE0NTcuNjI4RTB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS90aHVyYmVyLnNodG1sCit2b2lkIHRlc3ROaXN0VGh1cmJlcih2b2lkKQoreworICBjb25zdCBpbnQgbj03OworICBpbnQgaW5mbzsKKworICBWZWN0b3JYZCB4KG4pOworCisgIC8qCisgICAqIEZpcnN0IHRyeQorICAgKi8KKyAgeDw8IDEwMDAgLDEwMDAgLDQwMCAsNDAgLDAuNywwLjMsMC4wIDsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIHRodXJiZXJfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8dGh1cmJlcl9mdW5jdG9yPiBsbShmdW5jdG9yKTsKKyAgbG0ucGFyYW1ldGVycy5mdG9sID0gMS5FNCpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBsbS5wYXJhbWV0ZXJzLnh0b2wgPSAxLkU0Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMzkpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMzYpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDUuNjQyNzA4MjM5N0UrMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS4yODgxMzk2ODAwRSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMS40OTEwNzkyNTM1RSswMyk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgNS44MzIzODM2ODc3RSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgNy41NDE2NjQ0MjkxRSswMSk7CisgIFZFUklGWV9JU19BUFBST1goeFs0XSwgOS42NjI5NTAyODY0RS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFs1XSwgMy45Nzk3Mjg1Nzk3RS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFs2XSwgNC45NzI3Mjk3MzQ5RS0wMik7CisKKyAgLyoKKyAgICogU2Vjb25kIHRyeQorICAgKi8KKyAgeDw8IDEzMDAgLDE1MDAgLDUwMCAgLDc1ICAgLDEgICAgLDAuNCAgLDAuMDUgIDsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtLnJlc2V0UGFyYW1ldGVycygpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU0Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMueHRvbCA9IDEuRTQqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAyOSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCAyOCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS42NDI3MDgyMzk3RSswMyk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAxLjI4ODEzOTY4MDBFKzAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAxLjQ5MTA3OTI1MzVFKzAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA1LjgzMjM4MzY4NzdFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCA3LjU0MTY2NDQyOTFFKzAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLCA5LjY2Mjk1MDI4NjRFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCAzLjk3OTcyODU3OTdFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLCA0Ljk3MjcyOTczNDlFLTAyKTsKK30KKworc3RydWN0IHJhdDQzX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KK3sKKyAgICByYXQ0M19mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDQsMTUpIHt9CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE1XTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdOworICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09NCk7CisgICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTUpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxNTsgaSsrKQorICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0gKiBwb3coMS4rZXhwKGJbMV0tYlsyXSp4W2ldKSwtMS4vYlszXSkgLSB5W2ldOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKKyAgICB7CisgICAgICAgIGFzc2VydChiLnNpemUoKT09NCk7CisgICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTUpOworICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTQpOworICAgICAgICBmb3IoaW50IGk9MDsgaTwxNTsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgZSA9IGV4cChiWzFdLWJbMl0qeFtpXSk7CisgICAgICAgICAgICBkb3VibGUgcG93ZXIgPSAtMS4vYlszXTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IHBvdygxLitlLCBwb3dlcik7CisgICAgICAgICAgICBmamFjKGksMSkgPSBwb3dlcipiWzBdKmUqcG93KDEuK2UsIHBvd2VyLTEuKTsKKyAgICAgICAgICAgIGZqYWMoaSwyKSA9IC1wb3dlcipiWzBdKmUqeFtpXSpwb3coMS4rZSwgcG93ZXItMS4pOworICAgICAgICAgICAgZmphYyhpLDMpID0gYlswXSpwb3dlcipwb3dlcipsb2coMS4rZSkqcG93KDEuK2UsIHBvd2VyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworY29uc3QgZG91YmxlIHJhdDQzX2Z1bmN0b3I6OnhbMTVdID0geyAxLiwgMi4sIDMuLCA0LiwgNS4sIDYuLCA3LiwgOC4sIDkuLCAxMC4sIDExLiwgMTIuLCAxMy4sIDE0LiwgMTUuIH07Citjb25zdCBkb3VibGUgcmF0NDNfZnVuY3Rvcjo6eVsxNV0gPSB7IDE2LjA4LCAzMy44MywgNjUuODAsIDk3LjIwLCAxOTEuNTUsIDMyNi4yMCwgMzg2Ljg3LCA1MjAuNTMsIDU5MC4wMywgNjUxLjkyLCA3MjQuOTMsIDY5OS41NiwgNjg5Ljk2LCA2MzcuNTYsIDcxNy40MSB9OworCisvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9yYXRrb3dza3kzLnNodG1sCit2b2lkIHRlc3ROaXN0UmF0NDModm9pZCkKK3sKKyAgY29uc3QgaW50IG49NDsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAxMDAuLCAxMC4sIDEuLCAxLjsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIHJhdDQzX2Z1bmN0b3IgZnVuY3RvcjsKKyAgTGV2ZW5iZXJnTWFycXVhcmR0PHJhdDQzX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMueHRvbCA9IDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCAyNyk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uamV2LCAyMCk7CisgIC8vIGNoZWNrIG5vcm1eMgorICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgOC43ODY0MDQ5MDgwRSswMyk7CisgIC8vIGNoZWNrIHgKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCA2Ljk5NjQxNTEyNzBFKzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjI3NzEyNTMwMjVFKzAwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA3LjU5NjI5MzgzMjlFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAxLjI3OTI0ODM4NTlFKzAwKTsKKworICAvKgorICAgKiBTZWNvbmQgdHJ5CisgICAqLworICB4PDwgNzAwLiwgNS4sIDAuNzUsIDEuMzsKKyAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCisgIGxtLnJlc2V0UGFyYW1ldGVycygpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU1Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMueHRvbCA9IDEuRTUqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA5KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDgpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDguNzg2NDA0OTA4MEUrMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgNi45OTY0MTUxMjcwRSswMik7CisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS4yNzcxMjUzMDI1RSswMCk7CisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgNy41OTYyOTM4MzI5RS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMS4yNzkyNDgzODU5RSswMCk7Cit9CisKKworCitzdHJ1Y3QgZWNrZXJsZTRfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgoreworICAgIGVja2VybGU0X2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywzNSkge30KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMzVdOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVszNV07CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKKyAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0zNSk7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPDM1OyBpKyspCisgICAgICAgICAgICBmdmVjW2ldID0gYlswXS9iWzFdICogZXhwKC0wLjUqKHhbaV0tYlsyXSkqKHhbaV0tYlsyXSkvKGJbMV0qYlsxXSkpIC0geVtpXTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCisgICAgeworICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOworICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTM1KTsKKyAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0zKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8MzU7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIGIxMiA9IGJbMV0qYlsxXTsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKC0wLjUqKHhbaV0tYlsyXSkqKHhbaV0tYlsyXSkvYjEyKTsKKyAgICAgICAgICAgIGZqYWMoaSwwKSA9IGUgLyBiWzFdOworICAgICAgICAgICAgZmphYyhpLDEpID0gKCh4W2ldLWJbMl0pKih4W2ldLWJbMl0pL2IxMi0xLikgKiBiWzBdKmUvYjEyOworICAgICAgICAgICAgZmphYyhpLDIpID0gKHhbaV0tYlsyXSkqZSpiWzBdL2JbMV0vYjEyOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307Citjb25zdCBkb3VibGUgZWNrZXJsZTRfZnVuY3Rvcjo6eFszNV0gPSB7IDQwMC4wLCA0MDUuMCwgNDEwLjAsIDQxNS4wLCA0MjAuMCwgNDI1LjAsIDQzMC4wLCA0MzUuMCwgNDM2LjUsIDQzOC4wLCA0MzkuNSwgNDQxLjAsIDQ0Mi41LCA0NDQuMCwgNDQ1LjUsIDQ0Ny4wLCA0NDguNSwgNDUwLjAsIDQ1MS41LCA0NTMuMCwgNDU0LjUsIDQ1Ni4wLCA0NTcuNSwgNDU5LjAsIDQ2MC41LCA0NjIuMCwgNDYzLjUsIDQ2NS4wLCA0NzAuMCwgNDc1LjAsIDQ4MC4wLCA0ODUuMCwgNDkwLjAsIDQ5NS4wLCA1MDAuMH07Citjb25zdCBkb3VibGUgZWNrZXJsZTRfZnVuY3Rvcjo6eVszNV0gPSB7IDAuMDAwMTU3NSwgMC4wMDAxNjk5LCAwLjAwMDIzNTAsIDAuMDAwMzEwMiwgMC4wMDA0OTE3LCAwLjAwMDg3MTAsIDAuMDAxNzQxOCwgMC4wMDQ2NDAwLCAwLjAwNjU4OTUsIDAuMDA5NzMwMiwgMC4wMTQ5MDAyLCAwLjAyMzczMTAsIDAuMDQwMTY4MywgMC4wNzEyNTU5LCAwLjEyNjQ0NTgsIDAuMjA3MzQxMywgMC4yOTAyMzY2LCAwLjM0NDU2MjMsIDAuMzY5ODA0OSwgMC4zNjY4NTM0LCAwLjMxMDY3MjcsIDAuMjA3ODE1NCwgMC4xMTY0MzU0LCAwLjA2MTY3NjQsIDAuMDMzNzIwMCwgMC4wMTk0MDIzLCAwLjAxMTc4MzEsIDAuMDA3NDM1NywgMC4wMDIyNzMyLCAwLjAwMDg4MDAsIDAuMDAwNDU3OSwgMC4wMDAyMzQ1LCAwLjAwMDE1ODYsIDAuMDAwMTE0MywgMC4wMDAwNzEwIH07CisKKy8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2Vja2VybGU0LnNodG1sCit2b2lkIHRlc3ROaXN0RWNrZXJsZTQodm9pZCkKK3sKKyAgY29uc3QgaW50IG49MzsKKyAgaW50IGluZm87CisKKyAgVmVjdG9yWGQgeChuKTsKKworICAvKgorICAgKiBGaXJzdCB0cnkKKyAgICovCisgIHg8PCAxLiwgMTAuLCA1MDAuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgZWNrZXJsZTRfZnVuY3RvciBmdW5jdG9yOworICBMZXZlbmJlcmdNYXJxdWFyZHQ8ZWNrZXJsZTRfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CisgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKKworICAvLyBjaGVjayByZXR1cm4gdmFsdWUKKyAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmZldiwgMTgpOworICBWRVJJRllfSVNfRVFVQUwobG0ubmpldiwgMTUpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuNDYzNTg4NzQ4N0UtMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS41NTQzODI3MTc4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA0LjA4ODgzMjE3NTQpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDQuNTE1NDEyMTg0NEUrMDIpOworCisgIC8qCisgICAqIFNlY29uZCB0cnkKKyAgICovCisgIHg8PCAxLjUsIDUuLCA0NTAuOworICAvLyBkbyB0aGUgY29tcHV0YXRpb24KKyAgaW5mbyA9IGxtLm1pbmltaXplKHgpOworCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2LCA3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYsIDYpOworICAvLyBjaGVjayBub3JtXjIKKyAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDEuNDYzNTg4NzQ4N0UtMDMpOworICAvLyBjaGVjayB4CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS41NTQzODI3MTc4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA0LjA4ODgzMjE3NTQpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDQuNTE1NDEyMTg0NEUrMDIpOworfQorCit2b2lkIHRlc3RfTm9uTGluZWFyT3B0aW1pemF0aW9uKCkKK3sKKyAgICAvLyBUZXN0cyB1c2luZyB0aGUgZXhhbXBsZXMgcHJvdmlkZWQgYnkgKGMpbWlucGFjaworICAgIENBTExfU1VCVEVTVC8qXzEqLyh0ZXN0Q2hrZGVyKCkpOworICAgIENBTExfU1VCVEVTVC8qXzEqLyh0ZXN0TG1kZXIxKCkpOworICAgIENBTExfU1VCVEVTVC8qXzEqLyh0ZXN0TG1kZXIoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMiovKHRlc3RIeWJyajEoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMiovKHRlc3RIeWJyaigpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl8yKi8odGVzdEh5YnJkMSgpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl8yKi8odGVzdEh5YnJkKCkpOworICAgIENBTExfU1VCVEVTVC8qXzMqLyh0ZXN0TG1zdHIxKCkpOworICAgIENBTExfU1VCVEVTVC8qXzMqLyh0ZXN0TG1zdHIoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMyovKHRlc3RMbWRpZjEoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMyovKHRlc3RMbWRpZigpKTsKKworICAgIC8vIE5JU1QgdGVzdHMsIGxldmVsIG9mIGRpZmZpY3VsdHkgPSAiTG93ZXIiCisgICAgQ0FMTF9TVUJURVNULypfNCovKHRlc3ROaXN0TWlzcmExYSgpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl80Ki8odGVzdE5pc3RDaHdpcnV0MigpKTsKKworICAgIC8vIE5JU1QgdGVzdHMsIGxldmVsIG9mIGRpZmZpY3VsdHkgPSAiQXZlcmFnZSIKKyAgICBDQUxMX1NVQlRFU1QvKl81Ki8odGVzdE5pc3RIYWhuMSgpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl82Ki8odGVzdE5pc3RNaXNyYTFkKCkpOworICAgIENBTExfU1VCVEVTVC8qXzcqLyh0ZXN0TmlzdE1HSDE3KCkpOworICAgIENBTExfU1VCVEVTVC8qXzgqLyh0ZXN0TmlzdExhbmN6b3MxKCkpOworCisgICAgLy8gTklTVCB0ZXN0cywgbGV2ZWwgb2YgZGlmZmljdWx0eSA9ICJIaWdoZXIiCisgICAgQ0FMTF9TVUJURVNULypfOSovKHRlc3ROaXN0UmF0NDIoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMTAqLyh0ZXN0TmlzdE1HSDEwKCkpOworICAgIENBTExfU1VCVEVTVC8qXzExKi8odGVzdE5pc3RCb3hCT0QoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMTIqLyh0ZXN0TmlzdE1HSDA5KCkpOworICAgIENBTExfU1VCVEVTVC8qXzEzKi8odGVzdE5pc3RCZW5uZXR0NSgpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl8xNCovKHRlc3ROaXN0VGh1cmJlcigpKTsKKyAgICBDQUxMX1NVQlRFU1QvKl8xNSovKHRlc3ROaXN0UmF0NDMoKSk7CisgICAgQ0FMTF9TVUJURVNULypfMTYqLyh0ZXN0TmlzdEVja2VybGU0KCkpOworfQorCisvKgorICogQ2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nLi4uCisgIHByaW50ZigiaW5mbywgbmZldiA6ICVkLCAlZFxuIiwgaW5mbywgbG0ubmZldik7CisgIHByaW50ZigiaW5mbywgbmZldiwgbmpldiA6ICVkLCAlZCwgJWRcbiIsIGluZm8sIHNvbHZlci5uZmV2LCBzb2x2ZXIubmpldik7CisgIHByaW50ZigiaW5mbywgbmZldiA6ICVkLCAlZFxuIiwgaW5mbywgc29sdmVyLm5mZXYpOworICBwcmludGYoInhbMF0gOiAlLjMyZ1xuIiwgeFswXSk7CisgIHByaW50ZigieFsxXSA6ICUuMzJnXG4iLCB4WzFdKTsKKyAgcHJpbnRmKCJ4WzJdIDogJS4zMmdcbiIsIHhbMl0pOworICBwcmludGYoInhbM10gOiAlLjMyZ1xuIiwgeFszXSk7CisgIHByaW50ZigiZnZlYy5ibHVlTm9ybSgpIDogJS4zMmdcbiIsIHNvbHZlci5mdmVjLmJsdWVOb3JtKCkpOworICBwcmludGYoImZ2ZWMuYmx1ZU5vcm0oKSA6ICUuMzJnXG4iLCBsbS5mdmVjLmJsdWVOb3JtKCkpOworCisgIHByaW50ZigiaW5mbywgbmZldiwgbmpldiA6ICVkLCAlZCwgJWRcbiIsIGluZm8sIGxtLm5mZXYsIGxtLm5qZXYpOworICBwcmludGYoImZ2ZWMuc3F1YXJlZE5vcm0oKSA6ICUuMTNnXG4iLCBsbS5mdmVjLnNxdWFyZWROb3JtKCkpOworICBzdGQ6OmNvdXQgPDwgeCA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dC5wcmVjaXNpb24oOSk7CisgIHN0ZDo6Y291dCA8PCB4WzBdIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IHhbMV0gPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgeFsyXSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCB4WzNdIDw8IHN0ZDo6ZW5kbDsKKyovCisKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvTnVtZXJpY2FsRGlmZi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L051bWVyaWNhbERpZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDg4ODAKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L051bWVyaWNhbERpZmYuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaG9tYXMgQ2FwcmljZWxsaSA8b3J6ZWxAZnJlZWhhY2tlcnMub3JnPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9OdW1lcmljYWxEaWZmPgorICAgIAorLy8gR2VuZXJpYyBmdW5jdG9yCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgTlg9RHluYW1pYywgaW50IE5ZPUR5bmFtaWM+CitzdHJ1Y3QgRnVuY3RvcgoreworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICBlbnVtIHsKKyAgICBJbnB1dHNBdENvbXBpbGVUaW1lID0gTlgsCisgICAgVmFsdWVzQXRDb21waWxlVGltZSA9IE5ZCisgIH07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixJbnB1dHNBdENvbXBpbGVUaW1lLDE+IElucHV0VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFZhbHVlc0F0Q29tcGlsZVRpbWUsMT4gVmFsdWVUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmFsdWVzQXRDb21waWxlVGltZSxJbnB1dHNBdENvbXBpbGVUaW1lPiBKYWNvYmlhblR5cGU7CisgIAorICBpbnQgbV9pbnB1dHMsIG1fdmFsdWVzOworICAKKyAgRnVuY3RvcigpIDogbV9pbnB1dHMoSW5wdXRzQXRDb21waWxlVGltZSksIG1fdmFsdWVzKFZhbHVlc0F0Q29tcGlsZVRpbWUpIHt9CisgIEZ1bmN0b3IoaW50IGlucHV0cywgaW50IHZhbHVlcykgOiBtX2lucHV0cyhpbnB1dHMpLCBtX3ZhbHVlcyh2YWx1ZXMpIHt9CisgIAorICBpbnQgaW5wdXRzKCkgY29uc3QgeyByZXR1cm4gbV9pbnB1dHM7IH0KKyAgaW50IHZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKK307CisKK3N0cnVjdCBteV9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Cit7CisgICAgbXlfZnVuY3Rvcih2b2lkKTogRnVuY3Rvcjxkb3VibGU+KDMsMTUpIHt9CisgICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJngsIFZlY3RvclhkICZmdmVjKSBjb25zdAorICAgIHsKKyAgICAgICAgZG91YmxlIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgICAgIGRvdWJsZSB5WzE1XSA9IHsxLjRlLTEsIDEuOGUtMSwgMi4yZS0xLCAyLjVlLTEsIDIuOWUtMSwgMy4yZS0xLCAzLjVlLTEsCisgICAgICAgICAgICAzLjllLTEsIDMuN2UtMSwgNS44ZS0xLCA3LjNlLTEsIDkuNmUtMSwgMS4zNCwgMi4xLCA0LjM5fTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcygpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSBpKzE7CisgICAgICAgICAgICB0bXAyID0gMTYgLSBpIC0gMTsKKyAgICAgICAgICAgIHRtcDMgPSAoaT49OCk/IHRtcDIgOiB0bXAxOworICAgICAgICAgICAgZnZlY1tpXSA9IHlbaV0gLSAoeFswXSArIHRtcDEvKHhbMV0qdG1wMiArIHhbMl0qdG1wMykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBhY3R1YWxfZGYoY29uc3QgVmVjdG9yWGQgJngsIE1hdHJpeFhkICZmamFjKSBjb25zdAorICAgIHsKKyAgICAgICAgZG91YmxlIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9IGkrMTsKKyAgICAgICAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgICAgICAgICAgdG1wMyA9IChpPj04KT8gdG1wMiA6IHRtcDE7CisgICAgICAgICAgICB0bXA0ID0gKHhbMV0qdG1wMiArIHhbMl0qdG1wMyk7IHRtcDQgPSB0bXA0KnRtcDQ7CisgICAgICAgICAgICBmamFjKGksMCkgPSAtMTsKKyAgICAgICAgICAgIGZqYWMoaSwxKSA9IHRtcDEqdG1wMi90bXA0OworICAgICAgICAgICAgZmphYyhpLDIpID0gdG1wMSp0bXAzL3RtcDQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKwordm9pZCB0ZXN0X2ZvcndhcmQoKQoreworICAgIFZlY3RvclhkIHgoMyk7CisgICAgTWF0cml4WGQgamFjKDE1LDMpOworICAgIE1hdHJpeFhkIGFjdHVhbF9qYWMoMTUsMyk7CisgICAgbXlfZnVuY3RvciBmdW5jdG9yOworCisgICAgeCA8PCAwLjA4MiwgMS4xMywgMi4zNTsKKworICAgIC8vIHJlYWwgb25lIAorICAgIGZ1bmN0b3IuYWN0dWFsX2RmKHgsIGFjdHVhbF9qYWMpOworLy8gICAgc3RkOjpjb3V0IDw8IGFjdHVhbF9qYWMgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIHVzaW5nIE51bWVyaWNhbERpZmYKKyAgICBOdW1lcmljYWxEaWZmPG15X2Z1bmN0b3I+IG51bURpZmYoZnVuY3Rvcik7CisgICAgbnVtRGlmZi5kZih4LCBqYWMpOworLy8gICAgc3RkOjpjb3V0IDw8IGphYyA8PCBzdGQ6OmVuZGw7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKGphYywgYWN0dWFsX2phYyk7Cit9CisKK3ZvaWQgdGVzdF9jZW50cmFsKCkKK3sKKyAgICBWZWN0b3JYZCB4KDMpOworICAgIE1hdHJpeFhkIGphYygxNSwzKTsKKyAgICBNYXRyaXhYZCBhY3R1YWxfamFjKDE1LDMpOworICAgIG15X2Z1bmN0b3IgZnVuY3RvcjsKKworICAgIHggPDwgMC4wODIsIDEuMTMsIDIuMzU7CisKKyAgICAvLyByZWFsIG9uZSAKKyAgICBmdW5jdG9yLmFjdHVhbF9kZih4LCBhY3R1YWxfamFjKTsKKworICAgIC8vIHVzaW5nIE51bWVyaWNhbERpZmYKKyAgICBOdW1lcmljYWxEaWZmPG15X2Z1bmN0b3IsQ2VudHJhbD4gbnVtRGlmZihmdW5jdG9yKTsKKyAgICBudW1EaWZmLmRmKHgsIGphYyk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKGphYywgYWN0dWFsX2phYyk7Cit9CisKK3ZvaWQgdGVzdF9OdW1lcmljYWxEaWZmKCkKK3sKKyAgICBDQUxMX1NVQlRFU1QodGVzdF9mb3J3YXJkKCkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0X2NlbnRyYWwoKSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2FsaWduZWR2ZWN0b3IzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvYWxpZ25lZHZlY3RvcjMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMmJjMjEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2FsaWduZWR2ZWN0b3IzLmNwcApAQCAtMCwwICsxLDU5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9BbGlnbmVkVmVjdG9yMz4KKwordGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBhbGlnbmVkdmVjdG9yMygpCit7CisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBTY2FsYXIgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gUmVmVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0MzM7CisgIHR5cGVkZWYgQWxpZ25lZFZlY3RvcjM8U2NhbGFyPiBGYXN0VHlwZTsKKyAgUmVmVHlwZSAgcjEoUmVmVHlwZTo6UmFuZG9tKCkpLCByMihSZWZUeXBlOjpSYW5kb20oKSksIHIzKFJlZlR5cGU6OlJhbmRvbSgpKSwKKyAgICAgICAgICAgcjQoUmVmVHlwZTo6UmFuZG9tKCkpLCByNShSZWZUeXBlOjpSYW5kb20oKSksIHI2KFJlZlR5cGU6OlJhbmRvbSgpKTsKKyAgRmFzdFR5cGUgZjEocjEpLCBmMihyMiksIGYzKHIzKSwgZjQocjQpLCBmNShyNSksIGY2KHI2KTsKKyAgTWF0MzMgbTEoTWF0MzM6OlJhbmRvbSgpKTsKKyAgCisgIFZFUklGWV9JU19BUFBST1goZjEscjEpOworICBWRVJJRllfSVNfQVBQUk9YKGY0LHI0KTsKKworICBWRVJJRllfSVNfQVBQUk9YKGY0K2YxLHI0K3IxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNC1mMSxyNC1yMSk7CisgIFZFUklGWV9JU19BUFBST1goZjQrZjEtZjIscjQrcjEtcjIpOworICBWRVJJRllfSVNfQVBQUk9YKGY0Kz1mMyxyNCs9cjMpOworICBWRVJJRllfSVNfQVBQUk9YKGY0LT1mNSxyNC09cjUpOworICBWRVJJRllfSVNfQVBQUk9YKGY0LT1mNStmMSxyNC09cjUrcjEpOworICBWRVJJRllfSVNfQVBQUk9YKGY1K2YxLXMxKmYyLHI1K3IxLXMxKnIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNStmMS9zMi1zMSpmMixyNStyMS9zMi1zMSpyMik7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKG0xKmY0LG0xKnI0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNC50cmFuc3Bvc2UoKSptMSxyNC50cmFuc3Bvc2UoKSptMSk7CisgIAorICBWRVJJRllfSVNfQVBQUk9YKGYyLmRvdChmMykscjIuZG90KHIzKSk7CisgIFZFUklGWV9JU19BUFBST1goZjIuY3Jvc3MoZjMpLHIyLmNyb3NzKHIzKSk7CisgIFZFUklGWV9JU19BUFBST1goZjIubm9ybSgpLHIyLm5vcm0oKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChmMi5ub3JtYWxpemVkKCkscjIubm9ybWFsaXplZCgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKChmMitmMSkubm9ybWFsaXplZCgpLChyMityMSkubm9ybWFsaXplZCgpKTsKKyAgCisgIGYyLm5vcm1hbGl6ZSgpOworICByMi5ub3JtYWxpemUoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmMixyMik7Cit9CisKK3ZvaWQgdGVzdF9hbGlnbmVkdmVjdG9yMygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUKCBhbGlnbmVkdmVjdG9yMzxmbG9hdD4oKSApOworICB9Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2F1dG9kaWZmLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvYXV0b2RpZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjQxN2UKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2F1dG9kaWZmLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQXV0b0RpZmY+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciBmb28oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpCit7CisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisvLyAgIHJldHVybiB4K3N0ZDo6c2luKHkpOworICBFSUdFTl9BU01fQ09NTUVOVCgibXliZWdpbiIpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8U2NhbGFyPih4KjIgLSBwb3coeCwyKSArIDIqc3FydCh5KnkpIC0gNCAqIHNpbih4KSArIDIgKiBjb3MoeSkgLSBleHAoLTAuNSp4KngpKTsKKyAgLy9yZXR1cm4geCsyKnkqeDsvL3gqMiAtc3RkOjpwb3coeCwyKTsvLygyKnkveCk7Ly8gLSB5KjI7CisgIEVJR0VOX0FTTV9DT01NRU5UKCJteWVuZCIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3I+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBWZWN0b3I6OlNjYWxhciBmb28oY29uc3QgVmVjdG9yJiBwKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3Rvcjo6U2NhbGFyIFNjYWxhcjsKKyAgcmV0dXJuIChwLVZlY3RvcihTY2FsYXIoLTEpLFNjYWxhcigxLikpKS5ub3JtKCkgKyAocC5hcnJheSgpICogcC5hcnJheSgpKS5zdW0oKSArIHAuZG90KHApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgTlg9RHluYW1pYywgaW50IE5ZPUR5bmFtaWM+CitzdHJ1Y3QgVGVzdEZ1bmMxCit7CisgIHR5cGVkZWYgX1NjYWxhciBTY2FsYXI7CisgIGVudW0geworICAgIElucHV0c0F0Q29tcGlsZVRpbWUgPSBOWCwKKyAgICBWYWx1ZXNBdENvbXBpbGVUaW1lID0gTlkKKyAgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLElucHV0c0F0Q29tcGlsZVRpbWUsMT4gSW5wdXRUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmFsdWVzQXRDb21waWxlVGltZSwxPiBWYWx1ZVR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLElucHV0c0F0Q29tcGlsZVRpbWU+IEphY29iaWFuVHlwZTsKKworICBpbnQgbV9pbnB1dHMsIG1fdmFsdWVzOworCisgIFRlc3RGdW5jMSgpIDogbV9pbnB1dHMoSW5wdXRzQXRDb21waWxlVGltZSksIG1fdmFsdWVzKFZhbHVlc0F0Q29tcGlsZVRpbWUpIHt9CisgIFRlc3RGdW5jMShpbnQgaW5wdXRzLCBpbnQgdmFsdWVzKSA6IG1faW5wdXRzKGlucHV0cyksIG1fdmFsdWVzKHZhbHVlcykge30KKworICBpbnQgaW5wdXRzKCkgY29uc3QgeyByZXR1cm4gbV9pbnB1dHM7IH0KKyAgaW50IHZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBNYXRyaXg8VCxJbnB1dHNBdENvbXBpbGVUaW1lLDE+JiB4LCBNYXRyaXg8VCxWYWx1ZXNBdENvbXBpbGVUaW1lLDE+KiBfdikgY29uc3QKKyAgeworICAgIE1hdHJpeDxULFZhbHVlc0F0Q29tcGlsZVRpbWUsMT4mIHYgPSAqX3Y7CisKKyAgICB2WzBdID0gMiAqIHhbMF0gKiB4WzBdICsgeFswXSAqIHhbMV07CisgICAgdlsxXSA9IDMgKiB4WzFdICogeFswXSArIDAuNSAqIHhbMV0gKiB4WzFdOworICAgIGlmKGlucHV0cygpPjIpCisgICAgeworICAgICAgdlswXSArPSAwLjUgKiB4WzJdOworICAgICAgdlsxXSArPSB4WzJdOworICAgIH0KKyAgICBpZih2YWx1ZXMoKT4yKQorICAgIHsKKyAgICAgIHZbMl0gPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOworICAgIH0KKyAgICBpZiAoaW5wdXRzKCk+MiAmJiB2YWx1ZXMoKT4yKQorICAgICAgdlsyXSAqPSB4WzJdOworICB9CisKKyAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBJbnB1dFR5cGUmIHgsIFZhbHVlVHlwZSogdiwgSmFjb2JpYW5UeXBlKiBfaikgY29uc3QKKyAgeworICAgICgqdGhpcykoeCwgdik7CisKKyAgICBpZihfaikKKyAgICB7CisgICAgICBKYWNvYmlhblR5cGUmIGogPSAqX2o7CisKKyAgICAgIGooMCwwKSA9IDQgKiB4WzBdICsgeFsxXTsKKyAgICAgIGooMSwwKSA9IDMgKiB4WzFdOworCisgICAgICBqKDAsMSkgPSB4WzBdOworICAgICAgaigxLDEpID0gMyAqIHhbMF0gKyAyICogMC41ICogeFsxXTsKKworICAgICAgaWYgKGlucHV0cygpPjIpCisgICAgICB7CisgICAgICAgIGooMCwyKSA9IDAuNTsKKyAgICAgICAgaigxLDIpID0gMTsKKyAgICAgIH0KKyAgICAgIGlmKHZhbHVlcygpPjIpCisgICAgICB7CisgICAgICAgIGooMiwwKSA9IDMgKiB4WzFdICogMiAqIHhbMF07CisgICAgICAgIGooMiwxKSA9IDMgKiB4WzBdICogeFswXTsKKyAgICAgIH0KKyAgICAgIGlmIChpbnB1dHMoKT4yICYmIHZhbHVlcygpPjIpCisgICAgICB7CisgICAgICAgIGooMiwwKSAqPSB4WzJdOworICAgICAgICBqKDIsMSkgKj0geFsyXTsKKworICAgICAgICBqKDIsMikgPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOworICAgICAgICBqKDIsMikgPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4gdm9pZCBmb3J3YXJkX2phY29iaWFuKGNvbnN0IEZ1bmMmIGYpCit7CisgICAgdHlwZW5hbWUgRnVuYzo6SW5wdXRUeXBlIHggPSBGdW5jOjpJbnB1dFR5cGU6OlJhbmRvbShmLmlucHV0cygpKTsKKyAgICB0eXBlbmFtZSBGdW5jOjpWYWx1ZVR5cGUgeShmLnZhbHVlcygpKSwgeXJlZihmLnZhbHVlcygpKTsKKyAgICB0eXBlbmFtZSBGdW5jOjpKYWNvYmlhblR5cGUgaihmLnZhbHVlcygpLGYuaW5wdXRzKCkpLCBqcmVmKGYudmFsdWVzKCksZi5pbnB1dHMoKSk7CisKKyAgICBqcmVmLnNldFplcm8oKTsKKyAgICB5cmVmLnNldFplcm8oKTsKKyAgICBmKHgsJnlyZWYsJmpyZWYpOworLy8gICAgIHN0ZDo6Y2VyciA8PCB5LnRyYW5zcG9zZSgpIDw8ICJcblxuIjs7CisvLyAgICAgc3RkOjpjZXJyIDw8IGogPDwgIlxuXG4iOzsKKworICAgIGouc2V0WmVybygpOworICAgIHkuc2V0WmVybygpOworICAgIEF1dG9EaWZmSmFjb2JpYW48RnVuYz4gYXV0b2ooZik7CisgICAgYXV0b2ooeCwgJnksICZqKTsKKy8vICAgICBzdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7OworLy8gICAgIHN0ZDo6Y2VyciA8PCBqIDw8ICJcblxuIjs7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKHksIHlyZWYpOworICAgIFZFUklGWV9JU19BUFBST1goaiwganJlZik7Cit9CisKK3ZvaWQgdGVzdF9hdXRvZGlmZl9zY2FsYXIoKQoreworICBzdGQ6OmNlcnIgPDwgZm9vPGZsb2F0PigxLDIpIDw8ICJcbiI7CisgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8VmVjdG9yMmY+IEFEOworICBBRCBheCgxLFZlY3RvcjJmOjpVbml0WCgpKTsKKyAgQUQgYXkoMixWZWN0b3IyZjo6VW5pdFkoKSk7CisgIEFEIHJlcyA9IGZvbzxBRD4oYXgsYXkpOworICBzdGQ6OmNlcnIgPDwgcmVzLnZhbHVlKCkgPDwgIiA8PiAiCisgICAgICAgICAgICA8PCByZXMuZGVyaXZhdGl2ZXMoKS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7Cit9CisKK3ZvaWQgdGVzdF9hdXRvZGlmZl92ZWN0b3IoKQoreworICBzdGQ6OmNlcnIgPDwgZm9vPFZlY3RvcjJmPihWZWN0b3IyZigxLDIpKSA8PCAiXG4iOworICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPFZlY3RvcjJmPiBBRDsKKyAgdHlwZWRlZiBNYXRyaXg8QUQsMiwxPiBWZWN0b3JBRDsKKyAgVmVjdG9yQUQgcChBRCgxKSxBRCgtMSkpOworICBwLngoKS5kZXJpdmF0aXZlcygpID0gVmVjdG9yMmY6OlVuaXRYKCk7CisgIHAueSgpLmRlcml2YXRpdmVzKCkgPSBWZWN0b3IyZjo6VW5pdFkoKTsKKyAgCisgIEFEIHJlcyA9IGZvbzxWZWN0b3JBRD4ocCk7CisgIHN0ZDo6Y2VyciA8PCByZXMudmFsdWUoKSA8PCAiIDw+ICIKKyAgICAgICAgICAgIDw8IHJlcy5kZXJpdmF0aXZlcygpLnRyYW5zcG9zZSgpIDw8ICJcblxuIjsKK30KKwordm9pZCB0ZXN0X2F1dG9kaWZmX2phY29iaWFuKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1QoKCBmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMiwyPigpKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMiwzPigpKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMywyPigpKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMywzPigpKSApKTsKKyAgICBDQUxMX1NVQlRFU1QoKCBmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGU+KDMsMykpICkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9hdXRvZGlmZigpCit7CisgICAgdGVzdF9hdXRvZGlmZl9zY2FsYXIoKTsKKyAgICB0ZXN0X2F1dG9kaWZmX3ZlY3RvcigpOworLy8gICAgIHRlc3RfYXV0b2RpZmZfamFjb2JpYW4oKTsKK30KKwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9mb3J3YXJkX2Fkb2xjLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvZm9yd2FyZF9hZG9sYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiYWFmZQotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvZm9yd2FyZF9hZG9sYy5jcHAKQEAgLTAsMCArMSwxNDMgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4IEdhZWwgR3Vlbm5lYmF1ZCA8Zy5nYWVsQGZyZWUuZnI+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgorCisjZGVmaW5lIE5VTUJFUl9ESVJFQ1RJT05TIDE2CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQWRvbGNGb3J3YXJkPgorCitpbnQgYWR0bDo6QURPTENfbnVtRGlyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3I+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBWZWN0b3I6OlNjYWxhciBmb28oY29uc3QgVmVjdG9yJiBwKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFZlY3Rvcjo6U2NhbGFyIFNjYWxhcjsKKyAgcmV0dXJuIChwLVZlY3RvcihTY2FsYXIoLTEpLFNjYWxhcigxLikpKS5ub3JtKCkgKyAocC5hcnJheSgpLnNxcnQoKS5hYnMoKSAqIHAuYXJyYXkoKS5zaW4oKSkuc3VtKCkgKyBwLmRvdChwKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IE5YPUR5bmFtaWMsIGludCBOWT1EeW5hbWljPgorc3RydWN0IFRlc3RGdW5jMQoreworICB0eXBlZGVmIF9TY2FsYXIgU2NhbGFyOworICBlbnVtIHsKKyAgICBJbnB1dHNBdENvbXBpbGVUaW1lID0gTlgsCisgICAgVmFsdWVzQXRDb21waWxlVGltZSA9IE5ZCisgIH07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixJbnB1dHNBdENvbXBpbGVUaW1lLDE+IElucHV0VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFZhbHVlc0F0Q29tcGlsZVRpbWUsMT4gVmFsdWVUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmFsdWVzQXRDb21waWxlVGltZSxJbnB1dHNBdENvbXBpbGVUaW1lPiBKYWNvYmlhblR5cGU7CisKKyAgaW50IG1faW5wdXRzLCBtX3ZhbHVlczsKKworICBUZXN0RnVuYzEoKSA6IG1faW5wdXRzKElucHV0c0F0Q29tcGlsZVRpbWUpLCBtX3ZhbHVlcyhWYWx1ZXNBdENvbXBpbGVUaW1lKSB7fQorICBUZXN0RnVuYzEoaW50IGlucHV0cywgaW50IHZhbHVlcykgOiBtX2lucHV0cyhpbnB1dHMpLCBtX3ZhbHVlcyh2YWx1ZXMpIHt9CisKKyAgaW50IGlucHV0cygpIGNvbnN0IHsgcmV0dXJuIG1faW5wdXRzOyB9CisgIGludCB2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHZvaWQgb3BlcmF0b3IoKSAoY29uc3QgTWF0cml4PFQsSW5wdXRzQXRDb21waWxlVGltZSwxPiYgeCwgTWF0cml4PFQsVmFsdWVzQXRDb21waWxlVGltZSwxPiogX3YpIGNvbnN0CisgIHsKKyAgICBNYXRyaXg8VCxWYWx1ZXNBdENvbXBpbGVUaW1lLDE+JiB2ID0gKl92OworCisgICAgdlswXSA9IDIgKiB4WzBdICogeFswXSArIHhbMF0gKiB4WzFdOworICAgIHZbMV0gPSAzICogeFsxXSAqIHhbMF0gKyAwLjUgKiB4WzFdICogeFsxXTsKKyAgICBpZihpbnB1dHMoKT4yKQorICAgIHsKKyAgICAgIHZbMF0gKz0gMC41ICogeFsyXTsKKyAgICAgIHZbMV0gKz0geFsyXTsKKyAgICB9CisgICAgaWYodmFsdWVzKCk+MikKKyAgICB7CisgICAgICB2WzJdID0gMyAqIHhbMV0gKiB4WzBdICogeFswXTsKKyAgICB9CisgICAgaWYgKGlucHV0cygpPjIgJiYgdmFsdWVzKCk+MikKKyAgICAgIHZbMl0gKj0geFsyXTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IoKSAoY29uc3QgSW5wdXRUeXBlJiB4LCBWYWx1ZVR5cGUqIHYsIEphY29iaWFuVHlwZSogX2opIGNvbnN0CisgIHsKKyAgICAoKnRoaXMpKHgsIHYpOworCisgICAgaWYoX2opCisgICAgeworICAgICAgSmFjb2JpYW5UeXBlJiBqID0gKl9qOworCisgICAgICBqKDAsMCkgPSA0ICogeFswXSArIHhbMV07CisgICAgICBqKDEsMCkgPSAzICogeFsxXTsKKworICAgICAgaigwLDEpID0geFswXTsKKyAgICAgIGooMSwxKSA9IDMgKiB4WzBdICsgMiAqIDAuNSAqIHhbMV07CisKKyAgICAgIGlmIChpbnB1dHMoKT4yKQorICAgICAgeworICAgICAgICBqKDAsMikgPSAwLjU7CisgICAgICAgIGooMSwyKSA9IDE7CisgICAgICB9CisgICAgICBpZih2YWx1ZXMoKT4yKQorICAgICAgeworICAgICAgICBqKDIsMCkgPSAzICogeFsxXSAqIDIgKiB4WzBdOworICAgICAgICBqKDIsMSkgPSAzICogeFswXSAqIHhbMF07CisgICAgICB9CisgICAgICBpZiAoaW5wdXRzKCk+MiAmJiB2YWx1ZXMoKT4yKQorICAgICAgeworICAgICAgICBqKDIsMCkgKj0geFsyXTsKKyAgICAgICAgaigyLDEpICo9IHhbMl07CisKKyAgICAgICAgaigyLDIpID0gMyAqIHhbMV0gKiB4WzBdICogeFswXTsKKyAgICAgICAgaigyLDIpID0gMyAqIHhbMV0gKiB4WzBdICogeFswXTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+IHZvaWQgYWRvbGNfZm9yd2FyZF9qYWNvYmlhbihjb25zdCBGdW5jJiBmKQoreworICAgIHR5cGVuYW1lIEZ1bmM6OklucHV0VHlwZSB4ID0gRnVuYzo6SW5wdXRUeXBlOjpSYW5kb20oZi5pbnB1dHMoKSk7CisgICAgdHlwZW5hbWUgRnVuYzo6VmFsdWVUeXBlIHkoZi52YWx1ZXMoKSksIHlyZWYoZi52YWx1ZXMoKSk7CisgICAgdHlwZW5hbWUgRnVuYzo6SmFjb2JpYW5UeXBlIGooZi52YWx1ZXMoKSxmLmlucHV0cygpKSwganJlZihmLnZhbHVlcygpLGYuaW5wdXRzKCkpOworCisgICAganJlZi5zZXRaZXJvKCk7CisgICAgeXJlZi5zZXRaZXJvKCk7CisgICAgZih4LCZ5cmVmLCZqcmVmKTsKKy8vICAgICBzdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7OworLy8gICAgIHN0ZDo6Y2VyciA8PCBqIDw8ICJcblxuIjs7CisKKyAgICBqLnNldFplcm8oKTsKKyAgICB5LnNldFplcm8oKTsKKyAgICBBZG9sY0ZvcndhcmRKYWNvYmlhbjxGdW5jPiBhdXRvaihmKTsKKyAgICBhdXRvaih4LCAmeSwgJmopOworLy8gICAgIHN0ZDo6Y2VyciA8PCB5LnRyYW5zcG9zZSgpIDw8ICJcblxuIjs7CisvLyAgICAgc3RkOjpjZXJyIDw8IGogPDwgIlxuXG4iOzsKKworICAgIFZFUklGWV9JU19BUFBST1goeSwgeXJlZik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChqLCBqcmVmKTsKK30KKwordm9pZCB0ZXN0X2ZvcndhcmRfYWRvbGMoKQoreworICBhZHRsOjpBRE9MQ19udW1EaXIgPSBOVU1CRVJfRElSRUNUSU9OUzsKKworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVCgoIGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwyLDI+KCkpICkpOworICAgIENBTExfU1VCVEVTVCgoIGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwyLDM+KCkpICkpOworICAgIENBTExfU1VCVEVTVCgoIGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwzLDI+KCkpICkpOworICAgIENBTExfU1VCVEVTVCgoIGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwzLDM+KCkpICkpOworICAgIENBTExfU1VCVEVTVCgoIGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZT4oMywzKSkgKSk7CisgIH0KKworICB7CisgICAgLy8gc2ltcGxlIGluc3RhbmNpYXRpb24gdGVzdHMKKyAgICBNYXRyaXg8YWR0bDo6YWRvdWJsZSwyLDE+IHg7CisgICAgZm9vKHgpOworICAgIE1hdHJpeDxhZHRsOjphZG91YmxlLER5bmFtaWMsRHluYW1pYz4gQSg0LDQpOzsKKyAgICBBLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5laWdlbnZhbHVlcygpOworICB9Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2dtcmVzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvZ21yZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0N2MxNjkKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2dtcmVzLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBHYWVsIEd1ZW5uZWJhdWQgPGcuZ2FlbEBmcmVlLmZyPgorLy8gQ29weXJpZ2h0IChDKSAyMDEyIEtvbGphIEJyaXggPGJyaXhAaWdwbS5yd3RoLWFhYWNoZW4uZGU+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAiLi4vLi4vdGVzdC9zcGFyc2Vfc29sdmVyLmgiCisjaW5jbHVkZSA8RWlnZW4vSXRlcmF0aXZlU29sdmVycz4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0X2dtcmVzX1QoKQoreworICBHTVJFUzxTcGFyc2VNYXRyaXg8VD4sIERpYWdvbmFsUHJlY29uZGl0aW9uZXI8VD4gPiBnbXJlc19jb2xtYWpvcl9kaWFnOworICBHTVJFUzxTcGFyc2VNYXRyaXg8VD4sIElkZW50aXR5UHJlY29uZGl0aW9uZXIgICAgPiBnbXJlc19jb2xtYWpvcl9JOworICBHTVJFUzxTcGFyc2VNYXRyaXg8VD4sIEluY29tcGxldGVMVVQ8VD4gPiAgICAgICAgICAgZ21yZXNfY29sbWFqb3JfaWx1dDsKKyAgLy9HTVJFUzxTcGFyc2VNYXRyaXg8VD4sIFNTT1JQcmVjb25kaXRpb25lcjxUPiA+ICAgICBnbXJlc19jb2xtYWpvcl9zc29yOworCisgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGdtcmVzX2NvbG1ham9yX2RpYWcpICApOworLy8gICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhnbXJlc19jb2xtYWpvcl9JKSAgICAgKTsKKyAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZ21yZXNfY29sbWFqb3JfaWx1dCkgICAgICk7CisgIC8vQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZ21yZXNfY29sbWFqb3Jfc3NvcikgICAgICk7Cit9CisKK3ZvaWQgdGVzdF9nbXJlcygpCit7CisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEodGVzdF9nbXJlc19UPGRvdWJsZT4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzIodGVzdF9nbXJlc19UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3Qva3JvbmVja2VyX3Byb2R1Y3QuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9rcm9uZWNrZXJfcHJvZHVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwYmQzMAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3Qva3JvbmVja2VyX3Byb2R1Y3QuY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMSBLb2xqYSBCcml4IDxicml4QGlncG0ucnd0aC1hYWNoZW4uZGU+CisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgQW5kcmVhcyBQbGF0ZW4gPGFuZGlwbGF0ZW5AZ214LmRlPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworCisjaW5jbHVkZSAic3BhcnNlLmgiCisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlRXh0cmE+CisjaW5jbHVkZSA8RWlnZW4vS3JvbmVja2VyUHJvZHVjdD4KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaGVja19kaW1lbnNpb24oY29uc3QgTWF0cml4VHlwZSYgYWIsIGNvbnN0IHVuc2lnbmVkIGludCByb3dzLCAgY29uc3QgdW5zaWduZWQgaW50IGNvbHMpCit7CisgIFZFUklGWV9JU19FUVVBTChhYi5yb3dzKCksIHJvd3MpOworICBWRVJJRllfSVNfRVFVQUwoYWIuY29scygpLCBjb2xzKTsKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaGVja19rcm9uZWNrZXJfcHJvZHVjdChjb25zdCBNYXRyaXhUeXBlJiBhYikKK3sKKyAgVkVSSUZZX0lTX0VRVUFMKGFiLnJvd3MoKSwgNik7CisgIFZFUklGWV9JU19FUVVBTChhYi5jb2xzKCksIDYpOworICBWRVJJRllfSVNfRVFVQUwoYWIubm9uWmVyb3MoKSwgIDM2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDApLCAtMC40MDE3MzY3NjMwMzg2MTA2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDEpLCAgMC4xMDU2ODYzNDMzOTMyNzM1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDIpLCAtMC43MjU1MjA2MTk0NTU0MjEyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDMpLCAgMC4xOTA4NjUzMzM2NzQ0NzA2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDQpLCAgMC4zNTA4NjQ1NjcyMzQxMTEpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsNSksIC0wLjA5MjMwMzIxMDgzMDgwMTMpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDEsMCksICAwLjQxNTQxNzUxNDgwNDY3Nyk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSwxKSwgLTAuMjM2OTIyNzcwMTcyMjA0OCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSwyKSwgIDAuNzUwMjI3NTEzMTQ1ODUxMSk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSwzKSwgLTAuNDI3ODczMTAxOTc0MjY5Nik7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSw0KSwgLTAuMzYyODEyOTE2MjI2NDUwNyk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSw1KSwgIDAuMjA2OTIxMDgwODQ4MTI3NSk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMiwwKSwgIDAuMDU0NjU4OTAxNjA4NjM5ODYpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsMSksIC0wLjI2MzQwOTI1MTE0MTk4NTgpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsMiksICAwLjA5ODcxMTgwMjg1NzkzNzU4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigyLDMpLCAtMC40NzU3MDY2MzM0MDE3NzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigyLDQpLCAtMC4wNDc3Mzc0MDgyMzA1ODMzNCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMiw1KSwgIDAuMjMwMDUzNTYwOTY0NTI1NCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywwKSwgLTAuODE3Mjk0NTg1MzI2MDEzMyk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywxKSwgIDAuMjE1MDA4NjQyODM1OTIyMSk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywyKSwgIDAuNTgyNTExMzg0NzI5Mjc0Myk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywzKSwgLTAuMTUzMjQzMzc3MDA5NzE3NCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMyw0KSwgLTAuMzI5MzgzMzg3MjgyMzk5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLDUpLCAgMC4wODY2NTIwNzkxMjAzMzA2NCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNCwwKSwgIDAuODQ1MTI2NzUxNDg2MzIyNSk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNCwxKSwgLTAuNDgxOTk2NDU4OTE4OTc3KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDIpLCAtMC42MDIzNDgyMzkwNzkxNTM1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDMpLCAgMC4zNDM1MzM5MzQ3MTY0NTY1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDQpLCAgMC4zNDA2MDAyMTU3NDI4ODkxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDUpLCAtMC4xOTQyNTI2MzQ0MjAwOTE1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig1LDApLCAgMC4xMTExOTgyNDgyOTI1Mzk5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig1LDEpLCAtMC41MzU4ODA2NDI0NzU0MTY5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig1LDIpLCAtMC4wNzkyNTQ0NjU1OTMzNTY0Nyk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSwzKSwgIDAuMzgxOTM4ODc1Nzc2OTAzOCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSw0KSwgIDAuMDQ0ODE0NzUzODcyMTk4NzYpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDUsNSksIC0wLjIxNTk2ODg2MTYxNTgwNTcpOworfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3NwYXJzZV9rcm9uZWNrZXJfcHJvZHVjdChjb25zdCBNYXRyaXhUeXBlJiBhYikKK3sKKyAgVkVSSUZZX0lTX0VRVUFMKGFiLnJvd3MoKSwgMTIpOworICBWRVJJRllfSVNfRVFVQUwoYWIuY29scygpLCAxMCk7CisgIFZFUklGWV9JU19FUVVBTChhYi5ub25aZXJvcygpLCAzKjIpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDMsMCksIC0wLjA0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig1LDEpLCAgMC4wNSk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMCw2KSwgLTAuMDgpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsNyksICAwLjEwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig2LDgpLCAgMC4xMik7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoOCw5KSwgLTAuMTUpOworfQorCisKK3ZvaWQgdGVzdF9rcm9uZWNrZXJfcHJvZHVjdCgpCit7CisgIC8vIERNID0gZGVuc2UgbWF0cml4OyBTTSA9IHNwYXJzZSBtYXRyaXgKKyAgTWF0cml4PGRvdWJsZSwgMiwgMz4gRE1fYTsKKyAgTWF0cml4WGQgICAgICAgICAgICAgRE1fYigzLDIpOworICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBTTV9hKDIsMyk7CisgIFNwYXJzZU1hdHJpeDxkb3VibGU+IFNNX2IoMywyKTsKKyAgU01fYS5pbnNlcnQoMCwwKSA9IERNX2EoMCwwKSA9IC0wLjQ0NjE1NDAzMDA3ODIyMDE7CisgIFNNX2EuaW5zZXJ0KDAsMSkgPSBETV9hKDAsMSkgPSAtMC44MDU3MzY0Mzc1MjgzMDQ5OworICBTTV9hLmluc2VydCgwLDIpID0gRE1fYSgwLDIpID0gIDAuMzg5NjU3MjQ1OTUxNjM0MTsKKyAgU01fYS5pbnNlcnQoMSwwKSA9IERNX2EoMSwwKSA9IC0wLjkwNzY1NzIxODczNzY5MjE7CisgIFNNX2EuaW5zZXJ0KDEsMSkgPSBETV9hKDEsMSkgPSAgMC42NDY5MTU2NTY2NTQ1ODUzOworICBTTV9hLmluc2VydCgxLDIpID0gRE1fYSgxLDIpID0gLTAuMzY1ODAxMDM5ODc4Mjc4OTsKKyAgU01fYi5pbnNlcnQoMCwwKSA9IERNX2IoMCwwKSA9ICAwLjkwMDQ0NDA5NzY3NjcwOTk7CisgIFNNX2IuaW5zZXJ0KDAsMSkgPSBETV9iKDAsMSkgPSAtMC4yMzY4ODMwODU4MTM5ODMyOworICBTTV9iLmluc2VydCgxLDApID0gRE1fYigxLDApID0gLTAuOTMxMTA3ODM4OTk0MTgyNTsKKyAgU01fYi5pbnNlcnQoMSwxKSA9IERNX2IoMSwxKSA9ICAwLjUzMTAzMzU3NjI5ODAwNDc7CisgIFNNX2IuaW5zZXJ0KDIsMCkgPSBETV9iKDIsMCkgPSAtMC4xMjI1MTEyODA2ODcyMDM1OworICBTTV9iLmluc2VydCgyLDEpID0gRE1fYigyLDEpID0gIDAuNTkwMzk5ODAyMjc0MTI2NDsKKyAgU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcj4gU01fcm93X2EoU01fYSksIFNNX3Jvd19iKFNNX2IpOworCisgIC8vIHRlc3Qga3JvbmVja2VyUHJvZHVjdChETV9ibG9jayxETSxETV9maXhlZFNpemUpCisgIE1hdHJpeDxkb3VibGUsIDYsIDY+IERNX2ZpeF9hYjsKKyAgRE1fZml4X2FiKDAsMCk9MzcuMDsKKyAga3JvbmVja2VyUHJvZHVjdChETV9hLmJsb2NrKDAsMCwyLDMpLERNX2IsRE1fZml4X2FiKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KERNX2ZpeF9hYikpOworCisgIC8vIHRlc3Qga3JvbmVja2VyUHJvZHVjdChETSxETSxETV9ibG9jaykKKyAgTWF0cml4WGQgRE1fYmxvY2tfYWIoMTAsMTUpOworICBETV9ibG9ja19hYigwLDApPTM3LjA7CisgIGtyb25lY2tlclByb2R1Y3QoRE1fYSxETV9iLERNX2Jsb2NrX2FiLmJsb2NrKDIsNSw2LDYpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KERNX2Jsb2NrX2FiLmJsb2NrKDIsNSw2LDYpKSk7CisKKyAgLy8gdGVzdCBrcm9uZWNrZXJQcm9kdWN0KERNLERNLERNKQorICBNYXRyaXhYZCBETV9hYigxLDUpOworICBETV9hYigwLDApPTM3LjA7CisgIGtyb25lY2tlclByb2R1Y3QoRE1fYSxETV9iLERNX2FiKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KERNX2FiKSk7CisKKyAgLy8gdGVzdCBrcm9uZWNrZXJQcm9kdWN0KFNNLERNLFNNKQorICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBTTV9hYigxLDIwKTsKKyAgU01fYWIuaW5zZXJ0KDAsMCk9MzcuMDsKKyAga3JvbmVja2VyUHJvZHVjdChTTV9hLERNX2IsU01fYWIpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoU01fYWIpKTsKKyAgU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcj4gU01fYWIyKDEwLDMpOworICBTTV9hYjIuaW5zZXJ0KDAsMCk9MzcuMDsKKyAga3JvbmVja2VyUHJvZHVjdChTTV9hLERNX2IsU01fYWIyKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KFNNX2FiMikpOworCisgIC8vIHRlc3Qga3JvbmVja2VyUHJvZHVjdChETSxTTSxTTSkKKyAgU01fYWIuaW5zZXJ0KDAsMCk9MzcuMDsKKyAga3JvbmVja2VyUHJvZHVjdChETV9hLFNNX2IsU01fYWIpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoU01fYWIpKTsKKyAgU01fYWIyLmluc2VydCgwLDApPTM3LjA7CisgIGtyb25lY2tlclByb2R1Y3QoRE1fYSxTTV9iLFNNX2FiMik7CisgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChTTV9hYjIpKTsKKworICAvLyB0ZXN0IGtyb25lY2tlclByb2R1Y3QoU00sU00sU00pCisgIFNNX2FiLnJlc2l6ZSgyLDMzKTsKKyAgU01fYWIuaW5zZXJ0KDAsMCk9MzcuMDsKKyAga3JvbmVja2VyUHJvZHVjdChTTV9hLFNNX2IsU01fYWIpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoU01fYWIpKTsKKyAgU01fYWIyLnJlc2l6ZSg1LDExKTsKKyAgU01fYWIyLmluc2VydCgwLDApPTM3LjA7CisgIGtyb25lY2tlclByb2R1Y3QoU01fYSxTTV9iLFNNX2FiMik7CisgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChTTV9hYjIpKTsKKworICAvLyB0ZXN0IGtyb25lY2tlclByb2R1Y3QoU00sU00sU00pIHdpdGggc3BhcnNlIHBhdHRlcm4KKyAgU01fYS5yZXNpemUoNCw1KTsKKyAgU01fYi5yZXNpemUoMywyKTsKKyAgU01fYS5yZXNpemVOb25aZXJvcygwKTsKKyAgU01fYi5yZXNpemVOb25aZXJvcygwKTsKKyAgU01fYS5pbnNlcnQoMSwwKSA9IC0wLjE7CisgIFNNX2EuaW5zZXJ0KDAsMykgPSAtMC4yOworICBTTV9hLmluc2VydCgyLDQpID0gIDAuMzsKKyAgU01fYS5maW5hbGl6ZSgpOworICBTTV9iLmluc2VydCgwLDApID0gIDAuNDsKKyAgU01fYi5pbnNlcnQoMiwxKSA9IC0wLjU7CisgIFNNX2IuZmluYWxpemUoKTsKKyAgU01fYWIucmVzaXplKDEsMSk7CisgIFNNX2FiLmluc2VydCgwLDApPTM3LjA7CisgIGtyb25lY2tlclByb2R1Y3QoU01fYSxTTV9iLFNNX2FiKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9rcm9uZWNrZXJfcHJvZHVjdChTTV9hYikpOworCisgIC8vIHRlc3QgZGltZW5zaW9uIG9mIHJlc3VsdCBvZiBrcm9uZWNrZXJQcm9kdWN0KERNLERNLERNKQorICBNYXRyaXhYZCBETV9hMigyLDEpOworICBNYXRyaXhYZCBETV9iMig1LDQpOworICBNYXRyaXhYZCBETV9hYjI7CisgIGtyb25lY2tlclByb2R1Y3QoRE1fYTIsRE1fYjIsRE1fYWIyKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbWVuc2lvbihETV9hYjIsMio1LDEqNCkpOworICBETV9hMi5yZXNpemUoMTAsOSk7CisgIERNX2IyLnJlc2l6ZSg0LDgpOworICBrcm9uZWNrZXJQcm9kdWN0KERNX2EyLERNX2IyLERNX2FiMik7CisgIENBTExfU1VCVEVTVChjaGVja19kaW1lbnNpb24oRE1fYWIyLDEwKjQsOSo4KSk7Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9leHBvbmVudGlhbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9leHBvbmVudGlhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1NDcyZgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2V4cG9uZW50aWFsLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgSml0c2UgTmllc2VuIDxqaXRzZUBtYXRocy5sZWVkcy5hYy51az4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTWF0cml4RnVuY3Rpb25zPgorCitkb3VibGUgYmlub20oaW50IG4sIGludCBrKQoreworICBkb3VibGUgcmVzID0gMTsKKyAgZm9yIChpbnQgaT0wOyBpPGs7IGkrKykKKyAgICByZXMgPSByZXMgKiAobi1rK2krMSkgLyAoaSsxKTsKKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIHR5cGVuYW1lIE90aGVyRGVyaXZlZD4KK2RvdWJsZSByZWxlcnIoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgQSwgY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBCKQoreworICByZXR1cm4gc3RkOjpzcXJ0KChBIC0gQikuY3dpc2VBYnMyKCkuc3VtKCkgLyAoc3RkOjptaW4pKEEuY3dpc2VBYnMyKCkuc3VtKCksIEIuY3dpc2VBYnMyKCkuc3VtKCkpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIGV4cGZuKFQgeCwgaW50KQoreworICByZXR1cm4gc3RkOjpleHAoeCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0MmRSb3RhdGlvbihkb3VibGUgdG9sKQoreworICBNYXRyaXg8VCwyLDI+IEEsIEIsIEM7CisgIFQgYW5nbGU7CisKKyAgQSA8PCAwLCAxLCAtMSwgMDsKKyAgZm9yIChpbnQgaT0wOyBpPD0yMDsgaSsrKQorICB7CisgICAgYW5nbGUgPSBzdGF0aWNfY2FzdDxUPihwb3coMTAsIGkgLyA1LiAtIDIpKTsKKyAgICBCIDw8IHN0ZDo6Y29zKGFuZ2xlKSwgc3RkOjpzaW4oYW5nbGUpLCAtc3RkOjpzaW4oYW5nbGUpLCBzdGQ6OmNvcyhhbmdsZSk7CisKKyAgICBDID0gKGFuZ2xlKkEpLm1hdHJpeEZ1bmN0aW9uKGV4cGZuKTsKKyAgICBzdGQ6OmNvdXQgPDwgInRlc3QyZFJvdGF0aW9uOiBpID0gIiA8PCBpIDw8ICIgICBlcnJvciBmdW5tID0gIiA8PCByZWxlcnIoQywgQik7CisgICAgVkVSSUZZKEMuaXNBcHByb3goQiwgc3RhdGljX2Nhc3Q8VD4odG9sKSkpOworCisgICAgQyA9IChhbmdsZSpBKS5leHAoKTsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgIGVycm9yIGV4cG0gPSAiIDw8IHJlbGVycihDLCBCKSA8PCAiXG4iOworICAgIFZFUklGWShDLmlzQXBwcm94KEIsIHN0YXRpY19jYXN0PFQ+KHRvbCkpKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdDJkSHlwZXJib2xpY1JvdGF0aW9uKGRvdWJsZSB0b2wpCit7CisgIE1hdHJpeDxzdGQ6OmNvbXBsZXg8VD4sMiwyPiBBLCBCLCBDOworICBzdGQ6OmNvbXBsZXg8VD4gaW1hZ1VuaXQoMCwxKTsKKyAgVCBhbmdsZSwgY2gsIHNoOworCisgIGZvciAoaW50IGk9MDsgaTw9MjA7IGkrKykKKyAgeworICAgIGFuZ2xlID0gc3RhdGljX2Nhc3Q8VD4oKGktMTApIC8gMi4wKTsKKyAgICBjaCA9IHN0ZDo6Y29zaChhbmdsZSk7CisgICAgc2ggPSBzdGQ6OnNpbmgoYW5nbGUpOworICAgIEEgPDwgMCwgYW5nbGUqaW1hZ1VuaXQsIC1hbmdsZSppbWFnVW5pdCwgMDsKKyAgICBCIDw8IGNoLCBzaCppbWFnVW5pdCwgLXNoKmltYWdVbml0LCBjaDsKKworICAgIEMgPSBBLm1hdHJpeEZ1bmN0aW9uKGV4cGZuKTsKKyAgICBzdGQ6OmNvdXQgPDwgInRlc3QyZEh5cGVyYm9saWNSb3RhdGlvbjogaSA9ICIgPDwgaSA8PCAiICAgZXJyb3IgZnVubSA9ICIgPDwgcmVsZXJyKEMsIEIpOworICAgIFZFUklGWShDLmlzQXBwcm94KEIsIHN0YXRpY19jYXN0PFQ+KHRvbCkpKTsKKworICAgIEMgPSBBLmV4cCgpOworICAgIHN0ZDo6Y291dCA8PCAiICAgZXJyb3IgZXhwbSA9ICIgPDwgcmVsZXJyKEMsIEIpIDw8ICJcbiI7CisgICAgVkVSSUZZKEMuaXNBcHByb3goQiwgc3RhdGljX2Nhc3Q8VD4odG9sKSkpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0UGFzY2FsKGRvdWJsZSB0b2wpCit7CisgIGZvciAoaW50IHNpemU9MTsgc2l6ZTwyMDsgc2l6ZSsrKQorICB7CisgICAgTWF0cml4PFQsRHluYW1pYyxEeW5hbWljPiBBKHNpemUsc2l6ZSksIEIoc2l6ZSxzaXplKSwgQyhzaXplLHNpemUpOworICAgIEEuc2V0WmVybygpOworICAgIGZvciAoaW50IGk9MDsgaTxzaXplLTE7IGkrKykKKyAgICAgIEEoaSsxLGkpID0gc3RhdGljX2Nhc3Q8VD4oaSsxKTsKKyAgICBCLnNldFplcm8oKTsKKyAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKQorICAgICAgZm9yIChpbnQgaj0wOyBqPD1pOyBqKyspCisgICAgQihpLGopID0gc3RhdGljX2Nhc3Q8VD4oYmlub20oaSxqKSk7CisKKyAgICBDID0gQS5tYXRyaXhGdW5jdGlvbihleHBmbik7CisgICAgc3RkOjpjb3V0IDw8ICJ0ZXN0UGFzY2FsOiBzaXplID0gIiA8PCBzaXplIDw8ICIgICBlcnJvciBmdW5tID0gIiA8PCByZWxlcnIoQywgQik7CisgICAgVkVSSUZZKEMuaXNBcHByb3goQiwgc3RhdGljX2Nhc3Q8VD4odG9sKSkpOworCisgICAgQyA9IEEuZXhwKCk7CisgICAgc3RkOjpjb3V0IDw8ICIgICBlcnJvciBleHBtID0gIiA8PCByZWxlcnIoQywgQikgPDwgIlxuIjsKKyAgICBWRVJJRlkoQy5pc0FwcHJveChCLCBzdGF0aWNfY2FzdDxUPih0b2wpKSk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcmFuZG9tVGVzdChjb25zdCBNYXRyaXhUeXBlJiBtLCBkb3VibGUgdG9sKQoreworICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CisgICAgIEludmVyc2UuaAorICAqLworICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCByb3dzID0gbS5yb3dzKCk7CisgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IGNvbHMgPSBtLmNvbHMoKTsKKyAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwgbTIocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIGlkZW50aXR5ID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgcm93cyk7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOworCisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisKKyAgICBtMiA9IG0xLm1hdHJpeEZ1bmN0aW9uKGV4cGZuKSAqICgtbTEpLm1hdHJpeEZ1bmN0aW9uKGV4cGZuKTsKKyAgICBzdGQ6OmNvdXQgPDwgInJhbmRvbVRlc3Q6IGVycm9yIGZ1bm0gPSAiIDw8IHJlbGVycihpZGVudGl0eSwgbTIpOworICAgIFZFUklGWShpZGVudGl0eS5pc0FwcHJveChtMiwgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4odG9sKSkpOworCisgICAgbTIgPSBtMS5leHAoKSAqICgtbTEpLmV4cCgpOworICAgIHN0ZDo6Y291dCA8PCAiICAgZXJyb3IgZXhwbSA9ICIgPDwgcmVsZXJyKGlkZW50aXR5LCBtMikgPDwgIlxuIjsKKyAgICBWRVJJRlkoaWRlbnRpdHkuaXNBcHByb3gobTIsIHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KHRvbCkpKTsKKyAgfQorfQorCit2b2lkIHRlc3RfbWF0cml4X2V4cG9uZW50aWFsKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzIodGVzdDJkUm90YXRpb248ZG91YmxlPigxZS0xMykpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0MmRSb3RhdGlvbjxmbG9hdD4oMmUtNSkpOyAgLy8gd2FzIDFlLTUsIHJlbGF4ZWQgZm9yIGNsYW5nIDIuOCAvIGxpbnV4IC8geDg2LTY0CisgIENBTExfU1VCVEVTVF84KHRlc3QyZFJvdGF0aW9uPGxvbmcgZG91YmxlPigxZS0xMykpOyAKKyAgQ0FMTF9TVUJURVNUXzIodGVzdDJkSHlwZXJib2xpY1JvdGF0aW9uPGRvdWJsZT4oMWUtMTQpKTsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdDJkSHlwZXJib2xpY1JvdGF0aW9uPGZsb2F0PigxZS01KSk7CisgIENBTExfU1VCVEVTVF84KHRlc3QyZEh5cGVyYm9saWNSb3RhdGlvbjxsb25nIGRvdWJsZT4oMWUtMTQpKTsKKyAgQ0FMTF9TVUJURVNUXzYodGVzdFBhc2NhbDxmbG9hdD4oMWUtNikpOworICBDQUxMX1NVQlRFU1RfNSh0ZXN0UGFzY2FsPGRvdWJsZT4oMWUtMTUpKTsKKyAgQ0FMTF9TVUJURVNUXzIocmFuZG9tVGVzdChNYXRyaXgyZCgpLCAxZS0xMykpOworICBDQUxMX1NVQlRFU1RfNyhyYW5kb21UZXN0KE1hdHJpeDxkb3VibGUsMywzLFJvd01ham9yPigpLCAxZS0xMykpOworICBDQUxMX1NVQlRFU1RfMyhyYW5kb21UZXN0KE1hdHJpeDRjZCgpLCAxZS0xMykpOworICBDQUxMX1NVQlRFU1RfNChyYW5kb21UZXN0KE1hdHJpeFhkKDgsOCksIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8xKHJhbmRvbVRlc3QoTWF0cml4MmYoKSwgMWUtNCkpOworICBDQUxMX1NVQlRFU1RfNShyYW5kb21UZXN0KE1hdHJpeDNjZigpLCAxZS00KSk7CisgIENBTExfU1VCVEVTVF8xKHJhbmRvbVRlc3QoTWF0cml4NGYoKSwgMWUtNCkpOworICBDQUxMX1NVQlRFU1RfNihyYW5kb21UZXN0KE1hdHJpeFhmKDgsOCksIDFlLTQpKTsKKyAgQ0FMTF9TVUJURVNUXzkocmFuZG9tVGVzdChNYXRyaXg8bG9uZyBkb3VibGUsRHluYW1pYyxEeW5hbWljPig3LDcpLCAxZS0xMykpOworfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfZnVuY3Rpb24uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfZnVuY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzljNWEKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9mdW5jdGlvbi5jcHAKQEAgLTAsMCArMSwxOTQgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL01hdHJpeEZ1bmN0aW9ucz4KKworLy8gVmFyaWFudCBvZiBWRVJJRllfSVNfQVBQUk9YIHdoaWNoIHVzZXMgYWJzb2x1dGUgZXJyb3IgaW5zdGVhZCBvZgorLy8gcmVsYXRpdmUgZXJyb3IuCisjZGVmaW5lIFZFUklGWV9JU19BUFBST1hfQUJTKGEsIGIpIFZFUklGWSh0ZXN0X2lzQXBwcm94X2FicyhhLCBiKSkKKwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZTEsIHR5cGVuYW1lIFR5cGUyPgoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveF9hYnMoY29uc3QgVHlwZTEmIGEsIGNvbnN0IFR5cGUyJiBiKQoreworICByZXR1cm4gKChhLWIpLmFycmF5KCkuYWJzKCkgPCB0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBUeXBlMTo6UmVhbFNjYWxhcj4oKSkuYWxsKCk7Cit9CisKKworLy8gUmV0dXJucyBhIG1hdHJpeCB3aXRoIGVpZ2VudmFsdWVzIGNsdXN0ZXJlZCBhcm91bmQgMCwgMSBhbmQgMi4KK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitNYXRyaXhUeXBlIHJhbmRvbU1hdHJpeFdpdGhSZWFsRWl2YWxzKGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHNpemUpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CisgIE1hdHJpeFR5cGUgZGlhZyA9IE1hdHJpeFR5cGU6Olplcm8oc2l6ZSwgc2l6ZSk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBkaWFnKGksIGkpID0gU2NhbGFyKFJlYWxTY2FsYXIoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsMikpKQorICAgICAgKyBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSAqIFNjYWxhcihSZWFsU2NhbGFyKDAuMDEpKTsKKyAgfQorICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CisgIEhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gUVJvZkEoQSk7CisgIHJldHVybiBRUm9mQS5ob3VzZWhvbGRlclEoKS5pbnZlcnNlKCkgKiBkaWFnICogUVJvZkEuaG91c2Vob2xkZXJRKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgSXNDb21wbGV4ID0gTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcj46OklzQ29tcGxleD4KK3N0cnVjdCByYW5kb21NYXRyaXhXaXRoSW1hZ0VpdmFscworeworICAvLyBSZXR1cm5zIGEgbWF0cml4IHdpdGggZWlnZW52YWx1ZXMgY2x1c3RlcmVkIGFyb3VuZCAwIGFuZCArLy0gaS4KKyAgc3RhdGljIE1hdHJpeFR5cGUgcnVuKGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHNpemUpOworfTsKKworLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgcmVhbCBtYXRyaWNlcwordGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCByYW5kb21NYXRyaXhXaXRoSW1hZ0VpdmFsczxNYXRyaXhUeXBlLCAwPgoreworICBzdGF0aWMgTWF0cml4VHlwZSBydW4oY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggc2l6ZSkKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICAgIE1hdHJpeFR5cGUgZGlhZyA9IE1hdHJpeFR5cGU6Olplcm8oc2l6ZSwgc2l6ZSk7CisgICAgSW5kZXggaSA9IDA7CisgICAgd2hpbGUgKGkgPCBzaXplKSB7CisgICAgICBJbmRleCByYW5kb21JbnQgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigtMSwgMSk7CisgICAgICBpZiAocmFuZG9tSW50ID09IDAgfHwgaSA9PSBzaXplLTEpIHsKKyAgICAgICAgZGlhZyhpLCBpKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKDAuMDEpOworICAgICAgICArK2k7CisgICAgICB9IGVsc2UgeworICAgICAgICBTY2FsYXIgYWxwaGEgPSBTY2FsYXIocmFuZG9tSW50KSArIGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKDAuMDEpOworICAgICAgICBkaWFnKGksIGkrMSkgPSBhbHBoYTsKKyAgICAgICAgZGlhZyhpKzEsIGkpID0gLWFscGhhOworICAgICAgICBpICs9IDI7CisgICAgICB9CisgICAgfQorICAgIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKKyAgICBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IFFSb2ZBKEEpOworICAgIHJldHVybiBRUm9mQS5ob3VzZWhvbGRlclEoKS5pbnZlcnNlKCkgKiBkaWFnICogUVJvZkEuaG91c2Vob2xkZXJRKCk7CisgIH0KK307CisKKy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIGNvbXBsZXggbWF0cmljZXMKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgcmFuZG9tTWF0cml4V2l0aEltYWdFaXZhbHM8TWF0cml4VHlwZSwgMT4KK3sKKyAgc3RhdGljIE1hdHJpeFR5cGUgcnVuKGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHNpemUpCisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKKyAgICBjb25zdCBTY2FsYXIgaW1hZ1VuaXQoMCwgMSk7CisgICAgTWF0cml4VHlwZSBkaWFnID0gTWF0cml4VHlwZTo6WmVybyhzaXplLCBzaXplKTsKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICBkaWFnKGksIGkpID0gU2NhbGFyKFJlYWxTY2FsYXIoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oLTEsIDEpKSkgKiBpbWFnVW5pdAorICAgICAgICArIGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKFJlYWxTY2FsYXIoMC4wMSkpOworICAgIH0KKyAgICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CisgICAgSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBRUm9mQShBKTsKKyAgICByZXR1cm4gUVJvZkEuaG91c2Vob2xkZXJRKCkuaW52ZXJzZSgpICogZGlhZyAqIFFSb2ZBLmhvdXNlaG9sZGVyUSgpOworICB9Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RNYXRyaXhFeHBvbmVudGlhbChjb25zdCBNYXRyaXhUeXBlJiBBKQoreworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhciBTY2FsYXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gQ29tcGxleFNjYWxhcjsKKworICBWRVJJRllfSVNfQVBQUk9YKEEuZXhwKCksIEEubWF0cml4RnVuY3Rpb24oU3RkU3RlbUZ1bmN0aW9uczxDb21wbGV4U2NhbGFyPjo6ZXhwKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RNYXRyaXhMb2dhcml0aG0oY29uc3QgTWF0cml4VHlwZSYgQSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisKKyAgTWF0cml4VHlwZSBzY2FsZWRBOworICBSZWFsU2NhbGFyIG1heEltYWdQYXJ0T2ZTcGVjdHJ1bSA9IEEuZWlnZW52YWx1ZXMoKS5pbWFnKCkuY3dpc2VBYnMoKS5tYXhDb2VmZigpOworICBpZiAobWF4SW1hZ1BhcnRPZlNwZWN0cnVtID49IDAuOSAqIE1fUEkpCisgICAgc2NhbGVkQSA9IEEgKiAwLjkgKiBNX1BJIC8gbWF4SW1hZ1BhcnRPZlNwZWN0cnVtOworICBlbHNlCisgICAgc2NhbGVkQSA9IEE7CisKKyAgLy8gaWRlbnRpdHkgWC5leHAoKS5sb2coKSA9IFggb25seSBob2xkcyBpZiBJbShsYW1iZGEpIDwgcGkgZm9yIGFsbCBlaWdlbnZhbHVlcyBvZiBYCisgIE1hdHJpeFR5cGUgZXhwQSA9IHNjYWxlZEEuZXhwKCk7CisgIE1hdHJpeFR5cGUgbG9nRXhwQSA9IGV4cEEubG9nKCk7CisgIFZFUklGWV9JU19BUFBST1gobG9nRXhwQSwgc2NhbGVkQSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RIeXBlcmJvbGljRnVuY3Rpb25zKGNvbnN0IE1hdHJpeFR5cGUmIEEpCit7CisgIC8vIE5lZWQgdG8gdXNlIGFic29sdXRlIGVycm9yIGJlY2F1c2Ugb2YgcG9zc2libGUgY2FuY2VsbGF0aW9uIHdoZW4KKyAgLy8gYWRkaW5nL3N1YnRyYWN0aW5nIGV4cEEgYW5kIGV4cG1BLgorICBWRVJJRllfSVNfQVBQUk9YX0FCUyhBLnNpbmgoKSwgKEEuZXhwKCkgLSAoLUEpLmV4cCgpKSAvIDIpOworICBWRVJJRllfSVNfQVBQUk9YX0FCUyhBLmNvc2goKSwgKEEuZXhwKCkgKyAoLUEpLmV4cCgpKSAvIDIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0R29uaW9GdW5jdGlvbnMoY29uc3QgTWF0cml4VHlwZSYgQSkKK3sKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAKKyAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6Ok9wdGlvbnM+IENvbXBsZXhNYXRyaXg7CisKKyAgQ29tcGxleFNjYWxhciBpbWFnVW5pdCgwLDEpOworICBDb21wbGV4U2NhbGFyIHR3bygyLDApOworCisgIENvbXBsZXhNYXRyaXggQWMgPSBBLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKTsKKyAgCisgIENvbXBsZXhNYXRyaXggZXhwX2lBID0gKGltYWdVbml0ICogQWMpLmV4cCgpOworICBDb21wbGV4TWF0cml4IGV4cF9taUEgPSAoLWltYWdVbml0ICogQWMpLmV4cCgpOworICAKKyAgQ29tcGxleE1hdHJpeCBzaW5BYyA9IEEuc2luKCkudGVtcGxhdGUgY2FzdDxDb21wbGV4U2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YX0FCUyhzaW5BYywgKGV4cF9pQSAtIGV4cF9taUEpIC8gKHR3byppbWFnVW5pdCkpOworICAKKyAgQ29tcGxleE1hdHJpeCBjb3NBYyA9IEEuY29zKCkudGVtcGxhdGUgY2FzdDxDb21wbGV4U2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YX0FCUyhjb3NBYywgKGV4cF9pQSArIGV4cF9taUEpIC8gMik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RNYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgQSkKK3sKKyAgdGVzdE1hdHJpeEV4cG9uZW50aWFsKEEpOworICB0ZXN0TWF0cml4TG9nYXJpdGhtKEEpOworICB0ZXN0SHlwZXJib2xpY0Z1bmN0aW9ucyhBKTsKKyAgdGVzdEdvbmlvRnVuY3Rpb25zKEEpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TWF0cml4VHlwZShjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICAvLyBNYXRyaWNlcyB3aXRoIGNsdXN0ZXJlZCBlaWdlbnZhbHVlIGxlYWQgdG8gZGlmZmVyZW50IGNvZGUgcGF0aHMKKyAgLy8gaW4gTWF0cml4RnVuY3Rpb24uaCBhbmQgYXJlIHRodXMgdXNlZnVsIGZvciB0ZXN0aW5nLgorICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IEluZGV4OworCisgIGNvbnN0IEluZGV4IHNpemUgPSBtLnJvd3MoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgdGVzdE1hdHJpeChNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSkuZXZhbCgpKTsKKyAgICB0ZXN0TWF0cml4KHJhbmRvbU1hdHJpeFdpdGhSZWFsRWl2YWxzPE1hdHJpeFR5cGU+KHNpemUpKTsKKyAgICB0ZXN0TWF0cml4KHJhbmRvbU1hdHJpeFdpdGhJbWFnRWl2YWxzPE1hdHJpeFR5cGU+OjpydW4oc2l6ZSkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9tYXRyaXhfZnVuY3Rpb24oKQoreworICBDQUxMX1NVQlRFU1RfMSh0ZXN0TWF0cml4VHlwZShNYXRyaXg8ZmxvYXQsMSwxPigpKSk7CisgIENBTExfU1VCVEVTVF8yKHRlc3RNYXRyaXhUeXBlKE1hdHJpeDNjZigpKSk7CisgIENBTExfU1VCVEVTVF8zKHRlc3RNYXRyaXhUeXBlKE1hdHJpeFhmKDgsOCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdE1hdHJpeFR5cGUoTWF0cml4MmQoKSkpOworICBDQUxMX1NVQlRFU1RfNSh0ZXN0TWF0cml4VHlwZShNYXRyaXg8ZG91YmxlLDUsNSxSb3dNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0TWF0cml4VHlwZShNYXRyaXg0Y2QoKSkpOworICBDQUxMX1NVQlRFU1RfNyh0ZXN0TWF0cml4VHlwZShNYXRyaXhYZCgxMywxMykpKTsKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X3NxdWFyZV9yb290LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X3NxdWFyZV9yb290LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDg2MTlhCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfc3F1YXJlX3Jvb3QuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDExIEppdHNlIE5pZXNlbiA8aml0c2VAbWF0aHMubGVlZHMuYWMudWs+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL01hdHJpeEZ1bmN0aW9ucz4KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBJc0NvbXBsZXggPSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyPjo6SXNDb21wbGV4Pgorc3RydWN0IGdlbmVyYXRlVGVzdE1hdHJpeDsKKworLy8gZm9yIHJlYWwgbWF0cmljZXMsIG1ha2Ugc3VyZSBub25lIG9mIHRoZSBlaWdlbnZhbHVlcyBhcmUgbmVnYXRpdmUKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IGdlbmVyYXRlVGVzdE1hdHJpeDxNYXRyaXhUeXBlLDA+Cit7CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiByZXN1bHQsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHNpemUpCisgIHsKKyAgICBNYXRyaXhUeXBlIG1hdCA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKKyAgICBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlcyhtYXQpOworICAgIHR5cGVuYW1lIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+OjpFaWdlbnZhbHVlVHlwZSBlaXZhbHMgPSBlcy5laWdlbnZhbHVlcygpOworICAgIGZvciAodHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgIGlmIChlaXZhbHMoaSkuaW1hZygpID09IDAgJiYgZWl2YWxzKGkpLnJlYWwoKSA8IDApCisJZWl2YWxzKGkpID0gLWVpdmFscyhpKTsKKyAgICB9CisgICAgcmVzdWx0ID0gKGVzLmVpZ2VudmVjdG9ycygpICogZWl2YWxzLmFzRGlhZ29uYWwoKSAqIGVzLmVpZ2VudmVjdG9ycygpLmludmVyc2UoKSkucmVhbCgpOworICB9Cit9OworCisvLyBmb3IgY29tcGxleCBtYXRyaWNlcywgYW55IG1hdHJpeCBpcyBmaW5lCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBnZW5lcmF0ZVRlc3RNYXRyaXg8TWF0cml4VHlwZSwxPgoreworICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgcmVzdWx0LCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBzaXplKQorICB7CisgICAgcmVzdWx0ID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TWF0cml4U3FydChjb25zdCBNYXRyaXhUeXBlJiBtKQoreworICBNYXRyaXhUeXBlIEE7CisgIGdlbmVyYXRlVGVzdE1hdHJpeDxNYXRyaXhUeXBlPjo6cnVuKEEsIG0ucm93cygpKTsKKyAgTWF0cml4VHlwZSBzcXJ0QSA9IEEuc3FydCgpOworICBWRVJJRllfSVNfQVBQUk9YKHNxcnRBICogc3FydEEsIEEpOworfQorCit2b2lkIHRlc3RfbWF0cml4X3NxdWFyZV9yb290KCkKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEodGVzdE1hdHJpeFNxcnQoTWF0cml4M2NmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMih0ZXN0TWF0cml4U3FydChNYXRyaXhYY2QoMTIsMTIpKSk7CisgICAgQ0FMTF9TVUJURVNUXzModGVzdE1hdHJpeFNxcnQoTWF0cml4NGYoKSkpOworICAgIENBTExfU1VCVEVTVF80KHRlc3RNYXRyaXhTcXJ0KE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPig5LCA5KSkpOworICAgIENBTExfU1VCVEVTVF81KHRlc3RNYXRyaXhTcXJ0KE1hdHJpeDxmbG9hdCwxLDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSh0ZXN0TWF0cml4U3FydChNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwxLDE+KCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9tcHJlYWwvZGxtYWxsb2MuYyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbXByZWFsL2RsbWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NlOGZlYgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbXByZWFsL2RsbWFsbG9jLmMKQEAgLTAsMCArMSw1NzAzIEBACisvKg0KKyAgVGhpcyBpcyBhIHZlcnNpb24gKGFrYSBkbG1hbGxvYykgb2YgbWFsbG9jL2ZyZWUvcmVhbGxvYyB3cml0dGVuIGJ5DQorICBEb3VnIExlYSBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdA0KKyAgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluLiAgU2VuZCBxdWVzdGlvbnMsDQorICBjb21tZW50cywgY29tcGxhaW50cywgcGVyZm9ybWFuY2UgZGF0YSwgZXRjIHRvIGRsQGNzLm9zd2Vnby5lZHUNCisNCisqIFZlcnNpb24gMi44LjQgV2VkIE1heSAyNyAwOTo1NjoyMyAyMDA5ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkNCisNCisgICBOb3RlOiBUaGVyZSBtYXkgYmUgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoaXMgbWFsbG9jIG9idGFpbmFibGUgYXQNCisgICAgICAgICAgIGZ0cDovL2dlZS5jcy5vc3dlZ28uZWR1L3B1Yi9taXNjL21hbGxvYy5jDQorICAgICAgICAgQ2hlY2sgYmVmb3JlIGluc3RhbGxpbmchDQorDQorKiBRdWlja3N0YXJ0DQorDQorICBUaGlzIGxpYnJhcnkgaXMgYWxsIGluIG9uZSBmaWxlIHRvIHNpbXBsaWZ5IHRoZSBtb3N0IGNvbW1vbiB1c2FnZToNCisgIGZ0cCBpdCwgY29tcGlsZSBpdCAoLU8zKSwgYW5kIGxpbmsgaXQgaW50byBhbm90aGVyIHByb2dyYW0uIEFsbCBvZg0KKyAgdGhlIGNvbXBpbGUtdGltZSBvcHRpb25zIGRlZmF1bHQgdG8gcmVhc29uYWJsZSB2YWx1ZXMgZm9yIHVzZSBvbg0KKyAgbW9zdCBwbGF0Zm9ybXMuICBZb3UgbWlnaHQgbGF0ZXIgd2FudCB0byBzdGVwIHRocm91Z2ggdmFyaW91cw0KKyAgY29tcGlsZS10aW1lIGFuZCBkeW5hbWljIHR1bmluZyBvcHRpb25zLg0KKw0KKyAgRm9yIGNvbnZlbmllbmNlLCBhbiBpbmNsdWRlIGZpbGUgZm9yIGNvZGUgdXNpbmcgdGhpcyBtYWxsb2MgaXMgYXQ6DQorICAgICBmdHA6Ly9nZWUuY3Mub3N3ZWdvLmVkdS9wdWIvbWlzYy9tYWxsb2MtMi44LjQuaA0KKyAgWW91IGRvbid0IHJlYWxseSBuZWVkIHRoaXMgLmggZmlsZSB1bmxlc3MgeW91IGNhbGwgZnVuY3Rpb25zIG5vdA0KKyAgZGVmaW5lZCBpbiB5b3VyIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgVGhlIC5oIGZpbGUgY29udGFpbnMgb25seSB0aGUNCisgIGV4Y2VycHRzIGZyb20gdGhpcyBmaWxlIG5lZWRlZCBmb3IgdXNpbmcgdGhpcyBtYWxsb2Mgb24gQU5TSSBDL0MrKw0KKyAgc3lzdGVtcywgc28gbG9uZyBhcyB5b3UgaGF2ZW4ndCBjaGFuZ2VkIGNvbXBpbGUtdGltZSBvcHRpb25zIGFib3V0DQorICBuYW1pbmcgYW5kIHR1bmluZyBwYXJhbWV0ZXJzLiAgSWYgeW91IGRvLCB0aGVuIHlvdSBjYW4gY3JlYXRlIHlvdXINCisgIG93biBtYWxsb2MuaCB0aGF0IGRvZXMgaW5jbHVkZSBhbGwgc2V0dGluZ3MgYnkgY3V0dGluZyBhdCB0aGUgcG9pbnQNCisgIGluZGljYXRlZCBiZWxvdy4gTm90ZSB0aGF0IHlvdSBtYXkgYWxyZWFkeSBieSBkZWZhdWx0IGJlIHVzaW5nIGEgQw0KKyAgbGlicmFyeSBjb250YWluaW5nIGEgbWFsbG9jIHRoYXQgaXMgYmFzZWQgb24gc29tZSB2ZXJzaW9uIG9mIHRoaXMNCisgIG1hbGxvYyAoZm9yIGV4YW1wbGUgaW4gbGludXgpLiBZb3UgbWlnaHQgc3RpbGwgd2FudCB0byB1c2UgdGhlIG9uZQ0KKyAgaW4gdGhpcyBmaWxlIHRvIGN1c3RvbWl6ZSBzZXR0aW5ncyBvciB0byBhdm9pZCBvdmVyaGVhZHMgYXNzb2NpYXRlZA0KKyAgd2l0aCBsaWJyYXJ5IHZlcnNpb25zLg0KKw0KKyogVml0YWwgc3RhdGlzdGljczoNCisNCisgIFN1cHBvcnRlZCBwb2ludGVyL3NpemVfdCByZXByZXNlbnRhdGlvbjogICAgICAgNCBvciA4IGJ5dGVzDQorICAgICAgIHNpemVfdCBNVVNUIGJlIGFuIHVuc2lnbmVkIHR5cGUgb2YgdGhlIHNhbWUgd2lkdGggYXMNCisgICAgICAgcG9pbnRlcnMuIChJZiB5b3UgYXJlIHVzaW5nIGFuIGFuY2llbnQgc3lzdGVtIHRoYXQgZGVjbGFyZXMNCisgICAgICAgc2l6ZV90IGFzIGEgc2lnbmVkIHR5cGUsIG9yIG5lZWQgaXQgdG8gYmUgYSBkaWZmZXJlbnQgd2lkdGgNCisgICAgICAgdGhhbiBwb2ludGVycywgeW91IGNhbiB1c2UgYSBwcmV2aW91cyByZWxlYXNlIG9mIHRoaXMgbWFsbG9jDQorICAgICAgIChlLmcuIDIuNy4yKSBzdXBwb3J0aW5nIHRoZXNlLikNCisNCisgIEFsaWdubWVudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCBieXRlcyAoZGVmYXVsdCkNCisgICAgICAgVGhpcyBzdWZmaWNlcyBmb3IgbmVhcmx5IGFsbCBjdXJyZW50IG1hY2hpbmVzIGFuZCBDIGNvbXBpbGVycy4NCisgICAgICAgSG93ZXZlciwgeW91IGNhbiBkZWZpbmUgTUFMTE9DX0FMSUdOTUVOVCB0byBiZSB3aWRlciB0aGFuIHRoaXMNCisgICAgICAgaWYgbmVjZXNzYXJ5ICh1cCB0byAxMjhieXRlcyksIGF0IHRoZSBleHBlbnNlIG9mIHVzaW5nIG1vcmUgc3BhY2UuDQorDQorICBNaW5pbXVtIG92ZXJoZWFkIHBlciBhbGxvY2F0ZWQgY2h1bms6ICAgNCBvciAgOCBieXRlcyAoaWYgNGJ5dGUgc2l6ZXMpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCBvciAxNiBieXRlcyAoaWYgOGJ5dGUgc2l6ZXMpDQorICAgICAgIEVhY2ggbWFsbG9jZWQgY2h1bmsgaGFzIGEgaGlkZGVuIHdvcmQgb2Ygb3ZlcmhlYWQgaG9sZGluZyBzaXplDQorICAgICAgIGFuZCBzdGF0dXMgaW5mb3JtYXRpb24sIGFuZCBhZGRpdGlvbmFsIGNyb3NzLWNoZWNrIHdvcmQNCisgICAgICAgaWYgRk9PVEVSUyBpcyBkZWZpbmVkLg0KKw0KKyAgTWluaW11bSBhbGxvY2F0ZWQgc2l6ZTogNC1ieXRlIHB0cnM6ICAxNiBieXRlcyAgICAoaW5jbHVkaW5nIG92ZXJoZWFkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOC1ieXRlIHB0cnM6ICAzMiBieXRlcyAgICAoaW5jbHVkaW5nIG92ZXJoZWFkKQ0KKw0KKyAgICAgICBFdmVuIGEgcmVxdWVzdCBmb3IgemVybyBieXRlcyAoaS5lLiwgbWFsbG9jKDApKSByZXR1cm5zIGENCisgICAgICAgcG9pbnRlciB0byBzb21ldGhpbmcgb2YgdGhlIG1pbmltdW0gYWxsb2NhdGFibGUgc2l6ZS4NCisgICAgICAgVGhlIG1heGltdW0gb3ZlcmhlYWQgd2FzdGFnZSAoaS5lLiwgbnVtYmVyIG9mIGV4dHJhIGJ5dGVzDQorICAgICAgIGFsbG9jYXRlZCB0aGFuIHdlcmUgcmVxdWVzdGVkIGluIG1hbGxvYykgaXMgbGVzcyB0aGFuIG9yIGVxdWFsDQorICAgICAgIHRvIHRoZSBtaW5pbXVtIHNpemUsIGV4Y2VwdCBmb3IgcmVxdWVzdHMgPj0gbW1hcF90aHJlc2hvbGQgdGhhdA0KKyAgICAgICBhcmUgc2VydmljZWQgdmlhIG1tYXAoKSwgd2hlcmUgdGhlIHdvcnN0IGNhc2Ugd2FzdGFnZSBpcyBhYm91dA0KKyAgICAgICAzMiBieXRlcyBwbHVzIHRoZSByZW1haW5kZXIgZnJvbSBhIHN5c3RlbSBwYWdlICh0aGUgbWluaW1hbA0KKyAgICAgICBtbWFwIHVuaXQpOyB0eXBpY2FsbHkgNDA5NiBvciA4MTkyIGJ5dGVzLg0KKw0KKyAgU2VjdXJpdHk6IHN0YXRpYy1zYWZlOyBvcHRpb25hbGx5IG1vcmUgb3IgbGVzcw0KKyAgICAgICBUaGUgInNlY3VyaXR5IiBvZiBtYWxsb2MgcmVmZXJzIHRvIHRoZSBhYmlsaXR5IG9mIG1hbGljaW91cw0KKyAgICAgICBjb2RlIHRvIGFjY2VudHVhdGUgdGhlIGVmZmVjdHMgb2YgZXJyb3JzIChmb3IgZXhhbXBsZSwgZnJlZWluZw0KKyAgICAgICBzcGFjZSB0aGF0IGlzIG5vdCBjdXJyZW50bHkgbWFsbG9jJ2VkIG9yIG92ZXJ3cml0aW5nIHBhc3QgdGhlDQorICAgICAgIGVuZHMgb2YgY2h1bmtzKSBpbiBjb2RlIHRoYXQgY2FsbHMgbWFsbG9jLiAgVGhpcyBtYWxsb2MNCisgICAgICAgZ3VhcmFudGVlcyBub3QgdG8gbW9kaWZ5IGFueSBtZW1vcnkgbG9jYXRpb25zIGJlbG93IHRoZSBiYXNlIG9mDQorICAgICAgIGhlYXAsIGkuZS4sIHN0YXRpYyB2YXJpYWJsZXMsIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIHVzYWdlDQorICAgICAgIGVycm9ycy4gIFRoZSByb3V0aW5lcyBhZGRpdGlvbmFsbHkgZGV0ZWN0IG1vc3QgaW1wcm9wZXIgZnJlZXMNCisgICAgICAgYW5kIHJlYWxsb2NzLiAgQWxsIHRoaXMgaG9sZHMgYXMgbG9uZyBhcyB0aGUgc3RhdGljIGJvb2trZWVwaW5nDQorICAgICAgIGZvciBtYWxsb2MgaXRzZWxmIGlzIG5vdCBjb3JydXB0ZWQgYnkgc29tZSBvdGhlciBtZWFucy4gIFRoaXMNCisgICAgICAgaXMgb25seSBvbmUgYXNwZWN0IG9mIHNlY3VyaXR5IC0tIHRoZXNlIGNoZWNrcyBkbyBub3QsIGFuZA0KKyAgICAgICBjYW5ub3QsIGRldGVjdCBhbGwgcG9zc2libGUgcHJvZ3JhbW1pbmcgZXJyb3JzLg0KKw0KKyAgICAgICBJZiBGT09URVJTIGlzIGRlZmluZWQgbm9uemVybywgdGhlbiBlYWNoIGFsbG9jYXRlZCBjaHVuaw0KKyAgICAgICBjYXJyaWVzIGFuIGFkZGl0aW9uYWwgY2hlY2sgd29yZCB0byB2ZXJpZnkgdGhhdCBpdCB3YXMgbWFsbG9jZWQNCisgICAgICAgZnJvbSBpdHMgc3BhY2UuICBUaGVzZSBjaGVjayB3b3JkcyBhcmUgdGhlIHNhbWUgd2l0aGluIGVhY2gNCisgICAgICAgZXhlY3V0aW9uIG9mIGEgcHJvZ3JhbSB1c2luZyBtYWxsb2MsIGJ1dCBkaWZmZXIgYWNyb3NzDQorICAgICAgIGV4ZWN1dGlvbnMsIHNvIGV4dGVybmFsbHkgY3JhZnRlZCBmYWtlIGNodW5rcyBjYW5ub3QgYmUNCisgICAgICAgZnJlZWQuIFRoaXMgaW1wcm92ZXMgc2VjdXJpdHkgYnkgcmVqZWN0aW5nIGZyZWVzL3JlYWxsb2NzIHRoYXQNCisgICAgICAgY291bGQgY29ycnVwdCBoZWFwIG1lbW9yeSwgaW4gYWRkaXRpb24gdG8gdGhlIGNoZWNrcyBwcmV2ZW50aW5nDQorICAgICAgIHdyaXRlcyB0byBzdGF0aWNzIHRoYXQgYXJlIGFsd2F5cyBvbi4gIFRoaXMgbWF5IGZ1cnRoZXIgaW1wcm92ZQ0KKyAgICAgICBzZWN1cml0eSBhdCB0aGUgZXhwZW5zZSBvZiB0aW1lIGFuZCBzcGFjZSBvdmVyaGVhZC4gIChOb3RlIHRoYXQNCisgICAgICAgRk9PVEVSUyBtYXkgYWxzbyBiZSB3b3J0aCB1c2luZyB3aXRoIE1TUEFDRVMuKQ0KKw0KKyAgICAgICBCeSBkZWZhdWx0IGRldGVjdGVkIGVycm9ycyBjYXVzZSB0aGUgcHJvZ3JhbSB0byBhYm9ydCAoY2FsbGluZw0KKyAgICAgICAiYWJvcnQoKSIpLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgdG8gaW5zdGVhZCBwcm9jZWVkIHBhc3QNCisgICAgICAgZXJyb3JzIGJ5IGRlZmluaW5nIFBST0NFRURfT05fRVJST1IuICBJbiB0aGlzIGNhc2UsIGEgYmFkIGZyZWUNCisgICAgICAgaGFzIG5vIGVmZmVjdCwgYW5kIGEgbWFsbG9jIHRoYXQgZW5jb3VudGVycyBhIGJhZCBhZGRyZXNzDQorICAgICAgIGNhdXNlZCBieSB1c2VyIG92ZXJ3cml0ZXMgd2lsbCBpZ25vcmUgdGhlIGJhZCBhZGRyZXNzIGJ5DQorICAgICAgIGRyb3BwaW5nIHBvaW50ZXJzIGFuZCBpbmRpY2VzIHRvIGFsbCBrbm93biBtZW1vcnkuIFRoaXMgbWF5DQorICAgICAgIGJlIGFwcHJvcHJpYXRlIGZvciBwcm9ncmFtcyB0aGF0IHNob3VsZCBjb250aW51ZSBpZiBhdCBhbGwNCisgICAgICAgcG9zc2libGUgaW4gdGhlIGZhY2Ugb2YgcHJvZ3JhbW1pbmcgZXJyb3JzLCBhbHRob3VnaCB0aGV5IG1heQ0KKyAgICAgICBydW4gb3V0IG9mIG1lbW9yeSBiZWNhdXNlIGRyb3BwZWQgbWVtb3J5IGlzIG5ldmVyIHJlY2xhaW1lZC4NCisNCisgICAgICAgSWYgeW91IGRvbid0IGxpa2UgZWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gZGVmaW5lDQorICAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OIGFuZCBVU0FHRV9FUlJPUl9BQ1RJT04gdG8gZG8gYW55dGhpbmcNCisgICAgICAgZWxzZS4gQW5kIGlmIGlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgcHJvZ3JhbSB1c2luZyBtYWxsb2MgaGFzDQorICAgICAgIG5vIGVycm9ycyBvciB2dWxuZXJhYmlsaXRpZXMsIHlvdSBjYW4gZGVmaW5lIElOU0VDVVJFIHRvIDEsDQorICAgICAgIHdoaWNoIG1pZ2h0IChvciBtaWdodCBub3QpIHByb3ZpZGUgYSBzbWFsbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4NCisNCisgIFRocmVhZC1zYWZldHk6IE5PVCB0aHJlYWQtc2FmZSB1bmxlc3MgVVNFX0xPQ0tTIGRlZmluZWQNCisgICAgICAgV2hlbiBVU0VfTE9DS1MgaXMgZGVmaW5lZCwgZWFjaCBwdWJsaWMgY2FsbCB0byBtYWxsb2MsIGZyZWUsDQorICAgICAgIGV0YyBpcyBzdXJyb3VuZGVkIHdpdGggZWl0aGVyIGEgcHRocmVhZCBtdXRleCBvciBhIHdpbjMyDQorICAgICAgIHNwaW5sb2NrIChkZXBlbmRpbmcgb24gV0lOMzIpLiBUaGlzIGlzIG5vdCBlc3BlY2lhbGx5IGZhc3QsIGFuZA0KKyAgICAgICBjYW4gYmUgYSBtYWpvciBib3R0bGVuZWNrLiAgSXQgaXMgZGVzaWduZWQgb25seSB0byBwcm92aWRlDQorICAgICAgIG1pbmltYWwgcHJvdGVjdGlvbiBpbiBjb25jdXJyZW50IGVudmlyb25tZW50cywgYW5kIHRvIHByb3ZpZGUgYQ0KKyAgICAgICBiYXNpcyBmb3IgZXh0ZW5zaW9ucy4gIElmIHlvdSBhcmUgdXNpbmcgbWFsbG9jIGluIGEgY29uY3VycmVudA0KKyAgICAgICBwcm9ncmFtLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIG5lZG1hbGxvYw0KKyAgICAgICAoaHR0cDovL3d3dy5uZWRwcm9kLmNvbS9wcm9ncmFtcy9wb3J0YWJsZS9uZWRtYWxsb2MvKSBvcg0KKyAgICAgICBwdG1hbGxvYyAoU2VlIGh0dHA6Ly93d3cubWFsbG9jLmRlKSwgd2hpY2ggYXJlIGRlcml2ZWQNCisgICAgICAgZnJvbSB2ZXJzaW9ucyBvZiB0aGlzIG1hbGxvYy4NCisNCisgIFN5c3RlbSByZXF1aXJlbWVudHM6IEFueSBjb21iaW5hdGlvbiBvZiBNT1JFQ09SRSBhbmQvb3IgTU1BUC9NVU5NQVANCisgICAgICAgVGhpcyBtYWxsb2MgY2FuIHVzZSB1bml4IHNicmsgb3IgYW55IGVtdWxhdGlvbiAoaW52b2tlZCB1c2luZw0KKyAgICAgICB0aGUgQ0FMTF9NT1JFQ09SRSBtYWNybykgYW5kL29yIG1tYXAvbXVubWFwIG9yIGFueSBlbXVsYXRpb24NCisgICAgICAgKGludm9rZWQgdXNpbmcgQ0FMTF9NTUFQL0NBTExfTVVOTUFQKSB0byBnZXQgYW5kIHJlbGVhc2Ugc3lzdGVtDQorICAgICAgIG1lbW9yeS4gIE9uIG1vc3QgdW5peCBzeXN0ZW1zLCBpdCB0ZW5kcyB0byB3b3JrIGJlc3QgaWYgYm90aA0KKyAgICAgICBNT1JFQ09SRSBhbmQgTU1BUCBhcmUgZW5hYmxlZC4gIE9uIFdpbjMyLCBpdCB1c2VzIGVtdWxhdGlvbnMNCisgICAgICAgYmFzZWQgb24gVmlydHVhbEFsbG9jLiBJdCBhbHNvIHVzZXMgY29tbW9uIEMgbGlicmFyeSBmdW5jdGlvbnMNCisgICAgICAgbGlrZSBtZW1zZXQuDQorDQorICBDb21wbGlhbmNlOiBJIGJlbGlldmUgaXQgaXMgY29tcGxpYW50IHdpdGggdGhlIFNpbmdsZSBVbml4IFNwZWNpZmljYXRpb24NCisgICAgICAgKFNlZSBodHRwOi8vd3d3LnVuaXgub3JnKS4gQWxzbyBTVklEL1hQRywgQU5TSSBDLCBhbmQgcHJvYmFibHkNCisgICAgICAgb3RoZXJzIGFzIHdlbGwuDQorDQorKiBPdmVydmlldyBvZiBhbGdvcml0aG1zDQorDQorICBUaGlzIGlzIG5vdCB0aGUgZmFzdGVzdCwgbW9zdCBzcGFjZS1jb25zZXJ2aW5nLCBtb3N0IHBvcnRhYmxlLCBvcg0KKyAgbW9zdCB0dW5hYmxlIG1hbGxvYyBldmVyIHdyaXR0ZW4uIEhvd2V2ZXIgaXQgaXMgYW1vbmcgdGhlIGZhc3Rlc3QNCisgIHdoaWxlIGFsc28gYmVpbmcgYW1vbmcgdGhlIG1vc3Qgc3BhY2UtY29uc2VydmluZywgcG9ydGFibGUgYW5kDQorICB0dW5hYmxlLiAgQ29uc2lzdGVudCBiYWxhbmNlIGFjcm9zcyB0aGVzZSBmYWN0b3JzIHJlc3VsdHMgaW4gYSBnb29kDQorICBnZW5lcmFsLXB1cnBvc2UgYWxsb2NhdG9yIGZvciBtYWxsb2MtaW50ZW5zaXZlIHByb2dyYW1zLg0KKw0KKyAgSW4gbW9zdCB3YXlzLCB0aGlzIG1hbGxvYyBpcyBhIGJlc3QtZml0IGFsbG9jYXRvci4gR2VuZXJhbGx5LCBpdA0KKyAgY2hvb3NlcyB0aGUgYmVzdC1maXR0aW5nIGV4aXN0aW5nIGNodW5rIGZvciBhIHJlcXVlc3QsIHdpdGggdGllcw0KKyAgYnJva2VuIGluIGFwcHJveGltYXRlbHkgbGVhc3QtcmVjZW50bHktdXNlZCBvcmRlci4gKFRoaXMgc3RyYXRlZ3kNCisgIG5vcm1hbGx5IG1haW50YWlucyBsb3cgZnJhZ21lbnRhdGlvbi4pIEhvd2V2ZXIsIGZvciByZXF1ZXN0cyBsZXNzDQorICB0aGFuIDI1NmJ5dGVzLCBpdCBkZXZpYXRlcyBmcm9tIGJlc3QtZml0IHdoZW4gdGhlcmUgaXMgbm90IGFuDQorICBleGFjdGx5IGZpdHRpbmcgYXZhaWxhYmxlIGNodW5rIGJ5IHByZWZlcnJpbmcgdG8gdXNlIHNwYWNlIGFkamFjZW50DQorICB0byB0aGF0IHVzZWQgZm9yIHRoZSBwcmV2aW91cyBzbWFsbCByZXF1ZXN0LCBhcyB3ZWxsIGFzIGJ5IGJyZWFraW5nDQorICB0aWVzIGluIGFwcHJveGltYXRlbHkgbW9zdC1yZWNlbnRseS11c2VkIG9yZGVyLiAoVGhlc2UgZW5oYW5jZQ0KKyAgbG9jYWxpdHkgb2Ygc2VyaWVzIG9mIHNtYWxsIGFsbG9jYXRpb25zLikgIEFuZCBmb3IgdmVyeSBsYXJnZSByZXF1ZXN0cw0KKyAgKD49IDI1NktiIGJ5IGRlZmF1bHQpLCBpdCByZWxpZXMgb24gc3lzdGVtIG1lbW9yeSBtYXBwaW5nDQorICBmYWNpbGl0aWVzLCBpZiBzdXBwb3J0ZWQuICAoVGhpcyBoZWxwcyBhdm9pZCBjYXJyeWluZyBhcm91bmQgYW5kDQorICBwb3NzaWJseSBmcmFnbWVudGluZyBtZW1vcnkgdXNlZCBvbmx5IGZvciBsYXJnZSBjaHVua3MuKQ0KKw0KKyAgQWxsIG9wZXJhdGlvbnMgKGV4Y2VwdCBtYWxsb2Nfc3RhdHMgYW5kIG1hbGxpbmZvKSBoYXZlIGV4ZWN1dGlvbg0KKyAgdGltZXMgdGhhdCBhcmUgYm91bmRlZCBieSBhIGNvbnN0YW50IGZhY3RvciBvZiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4NCisgIGEgc2l6ZV90LCBub3QgY291bnRpbmcgYW55IGNsZWFyaW5nIGluIGNhbGxvYyBvciBjb3B5aW5nIGluIHJlYWxsb2MsDQorICBvciBhY3Rpb25zIHN1cnJvdW5kaW5nIE1PUkVDT1JFIGFuZCBNTUFQIHRoYXQgaGF2ZSB0aW1lcw0KKyAgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2Ygbm9uLWNvbnRpZ3VvdXMgcmVnaW9ucyByZXR1cm5lZCBieQ0KKyAgc3lzdGVtIGFsbG9jYXRpb24gcm91dGluZXMsIHdoaWNoIGlzIG9mdGVuIGp1c3QgMS4gSW4gcmVhbC10aW1lDQorICBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBzdXBwcmVzcyBzZWdtZW50IHRyYXZlcnNhbHMgdXNpbmcNCisgIE5PX1NFR01FTlRfVFJBVkVSU0FMLCB3aGljaCBhc3N1cmVzIGJvdW5kZWQgZXhlY3V0aW9uIGV2ZW4gd2hlbg0KKyAgc3lzdGVtIGFsbG9jYXRvcnMgcmV0dXJuIG5vbi1jb250aWd1b3VzIHNwYWNlcywgYXQgdGhlIHR5cGljYWwNCisgIGV4cGVuc2Ugb2YgY2FycnlpbmcgYXJvdW5kIG1vcmUgbWVtb3J5IGFuZCBpbmNyZWFzZWQgZnJhZ21lbnRhdGlvbi4NCisNCisgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgdmVyeSBtb2R1bGFyIGFuZCBzZXJpb3VzbHkgb3ZlcnVzZXMNCisgIG1hY3Jvcy4gUGVyaGFwcyBzb21lZGF5IGFsbCBDIGNvbXBpbGVycyB3aWxsIGRvIGFzIGdvb2QgYSBqb2INCisgIGlubGluaW5nIG1vZHVsYXIgY29kZSBhcyBjYW4gbm93IGJlIGRvbmUgYnkgYnJ1dGUtZm9yY2UgZXhwYW5zaW9uLA0KKyAgYnV0IG5vdywgZW5vdWdoIG9mIHRoZW0gc2VlbSBub3QgdG8uDQorDQorICBTb21lIGNvbXBpbGVycyBpc3N1ZSBhIGxvdCBvZiB3YXJuaW5ncyBhYm91dCBjb2RlIHRoYXQgaXMNCisgIGRlYWQvdW5yZWFjaGFibGUgb25seSBvbiBzb21lIHBsYXRmb3JtcywgYW5kIGFsc28gYWJvdXQgaW50ZW50aW9uYWwNCisgIHVzZXMgb2YgbmVnYXRpb24gb24gdW5zaWduZWQgdHlwZXMuIEFsbCBrbm93biBjYXNlcyBvZiBlYWNoIGNhbiBiZQ0KKyAgaWdub3JlZC4NCisNCisgIEZvciBhIGxvbmdlciBidXQgb3V0IG9mIGRhdGUgaGlnaC1sZXZlbCBkZXNjcmlwdGlvbiwgc2VlDQorICAgICBodHRwOi8vZ2VlLmNzLm9zd2Vnby5lZHUvZGwvaHRtbC9tYWxsb2MuaHRtbA0KKw0KKyogTVNQQUNFUw0KKyAgSWYgTVNQQUNFUyBpcyBkZWZpbmVkLCB0aGVuIGluIGFkZGl0aW9uIHRvIG1hbGxvYywgZnJlZSwgZXRjLiwNCisgIHRoaXMgZmlsZSBhbHNvIGRlZmluZXMgbXNwYWNlX21hbGxvYywgbXNwYWNlX2ZyZWUsIGV0Yy4gVGhlc2UNCisgIGFyZSB2ZXJzaW9ucyBvZiBtYWxsb2Mgcm91dGluZXMgdGhhdCB0YWtlIGFuICJtc3BhY2UiIGFyZ3VtZW50DQorICBvYnRhaW5lZCB1c2luZyBjcmVhdGVfbXNwYWNlLCB0byBjb250cm9sIGFsbCBpbnRlcm5hbCBib29ra2VlcGluZy4NCisgIElmIE9OTFlfTVNQQUNFUyBpcyBkZWZpbmVkLCBvbmx5IHRoZXNlIHZlcnNpb25zIGFyZSBjb21waWxlZC4NCisgIFNvIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0aGlzIGFsbG9jYXRvciBmb3Igb25seSBzb21lIGFsbG9jYXRpb25zLA0KKyAgYW5kIHlvdXIgc3lzdGVtIG1hbGxvYyBmb3Igb3RoZXJzLCB5b3UgY2FuIGNvbXBpbGUgd2l0aA0KKyAgT05MWV9NU1BBQ0VTIGFuZCB0aGVuIGRvIHNvbWV0aGluZyBsaWtlLi4uDQorICAgIHN0YXRpYyBtc3BhY2UgbXltc3BhY2UgPSBjcmVhdGVfbXNwYWNlKDAsMCk7IC8vIGZvciBleGFtcGxlDQorICAgICNkZWZpbmUgbXltYWxsb2MoYnl0ZXMpICBtc3BhY2VfbWFsbG9jKG15bXNwYWNlLCBieXRlcykNCisNCisgIChOb3RlOiBJZiB5b3Ugb25seSBuZWVkIG9uZSBpbnN0YW5jZSBvZiBhbiBtc3BhY2UsIHlvdSBjYW4gaW5zdGVhZA0KKyAgdXNlICJVU0VfRExfUFJFRklYIiB0byByZWxhYmVsIHRoZSBnbG9iYWwgbWFsbG9jLikNCisNCisgIFlvdSBjYW4gc2ltaWxhcmx5IGNyZWF0ZSB0aHJlYWQtbG9jYWwgYWxsb2NhdG9ycyBieSBzdG9yaW5nDQorICBtc3BhY2VzIGFzIHRocmVhZC1sb2NhbHMuIEZvciBleGFtcGxlOg0KKyAgICBzdGF0aWMgX190aHJlYWQgbXNwYWNlIHRsbXMgPSAwOw0KKyAgICB2b2lkKiAgdGxtYWxsb2Moc2l6ZV90IGJ5dGVzKSB7DQorICAgICAgaWYgKHRsbXMgPT0gMCkgdGxtcyA9IGNyZWF0ZV9tc3BhY2UoMCwgMCk7DQorICAgICAgcmV0dXJuIG1zcGFjZV9tYWxsb2ModGxtcywgYnl0ZXMpOw0KKyAgICB9DQorICAgIHZvaWQgIHRsZnJlZSh2b2lkKiBtZW0pIHsgbXNwYWNlX2ZyZWUodGxtcywgbWVtKTsgfQ0KKw0KKyAgVW5sZXNzIEZPT1RFUlMgaXMgZGVmaW5lZCwgZWFjaCBtc3BhY2UgaXMgY29tcGxldGVseSBpbmRlcGVuZGVudC4NCisgIFlvdSBjYW5ub3QgYWxsb2NhdGUgZnJvbSBvbmUgYW5kIGZyZWUgdG8gYW5vdGhlciAoYWx0aG91Z2gNCisgIGNvbmZvcm1hbmNlIGlzIG9ubHkgd2Vha2x5IGNoZWNrZWQsIHNvIHVzYWdlIGVycm9ycyBhcmUgbm90IGFsd2F5cw0KKyAgY2F1Z2h0KS4gSWYgRk9PVEVSUyBpcyBkZWZpbmVkLCB0aGVuIGVhY2ggY2h1bmsgY2FycmllcyBhcm91bmQgYSB0YWcNCisgIGluZGljYXRpbmcgaXRzIG9yaWdpbmF0aW5nIG1zcGFjZSwgYW5kIGZyZWVzIGFyZSBkaXJlY3RlZCB0byB0aGVpcg0KKyAgb3JpZ2luYXRpbmcgc3BhY2VzLg0KKw0KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDb21waWxlLXRpbWUgb3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitCZSBjYXJlZnVsIGluIHNldHRpbmcgI2RlZmluZSB2YWx1ZXMgZm9yIG51bWVyaWNhbCBjb25zdGFudHMgb2YgdHlwZQ0KK3NpemVfdC4gT24gc29tZSBzeXN0ZW1zLCBsaXRlcmFsIHZhbHVlcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQNCit0byBzaXplX3QgcHJlY2lzaW9uIHVubGVzcyB0aGV5IGFyZSBleHBsaWNpdGx5IGNhc3RlZC4gWW91IGNhbiBhbHNvDQordXNlIHRoZSBzeW1ib2xpYyB2YWx1ZXMgTUFYX1NJWkVfVCwgU0laRV9UX09ORSwgZXRjIGJlbG93Lg0KKw0KK1dJTjMyICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBkZWZpbmVkIGlmIF9XSU4zMiBkZWZpbmVkDQorICBEZWZpbmluZyBXSU4zMiBzZXRzIHVwIGRlZmF1bHRzIGZvciBNUyBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXJzLg0KKyAgT3RoZXJ3aXNlIGRlZmF1bHRzIGFyZSBmb3IgdW5peC4gQmV3YXJlIHRoYXQgdGhlcmUgc2VlbSB0byBiZSBzb21lDQorICBjYXNlcyB3aGVyZSB0aGlzIG1hbGxvYyBtaWdodCBub3QgYmUgYSBwdXJlIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yDQorICBXaW4zMiBtYWxsb2M6IFJhbmRvbS1sb29raW5nIGZhaWx1cmVzIGZyb20gV2luMzIgR0RJIEFQSSdzIChlZzsNCisgIFNldERJQml0cygpKSBtYXkgYmUgZHVlIHRvIGJ1Z3MgaW4gc29tZSB2aWRlbyBkcml2ZXIgaW1wbGVtZW50YXRpb25zDQorICB3aGVuIHBpeGVsIGJ1ZmZlcnMgYXJlIG1hbGxvYygpZWQsIGFuZCB0aGUgcmVnaW9uIHNwYW5zIG1vcmUgdGhhbg0KKyAgb25lIFZpcnR1YWxBbGxvYygpZWQgcmVnaW9uLiBCZWNhdXNlIGRsbWFsbG9jIHVzZXMgYSBzbWFsbCAoNjRLYikNCisgIGRlZmF1bHQgZ3JhbnVsYXJpdHksIHBpeGVsIGJ1ZmZlcnMgbWF5IHN0cmFkZGxlIHZpcnR1YWwgYWxsb2NhdGlvbg0KKyAgcmVnaW9ucyBtb3JlIG9mdGVuIHRoYW4gd2hlbiB1c2luZyB0aGUgTWljcm9zb2Z0IGFsbG9jYXRvci4gIFlvdSBjYW4NCisgIGF2b2lkIHRoaXMgYnkgdXNpbmcgVmlydHVhbEFsbG9jKCkgYW5kIFZpcnR1YWxGcmVlKCkgZm9yIGFsbCBwaXhlbA0KKyAgYnVmZmVycyByYXRoZXIgdGhhbiB1c2luZyBtYWxsb2MoKS4gIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLA0KKyAgcmVjb21waWxlIHRoaXMgbWFsbG9jIHdpdGggYSBsYXJnZXIgREVGQVVMVF9HUkFOVUxBUklUWS4NCisNCitNQUxMT0NfQUxJR05NRU5UICAgICAgICAgZGVmYXVsdDogKHNpemVfdCk4DQorICBDb250cm9scyB0aGUgbWluaW11bSBhbGlnbm1lbnQgZm9yIG1hbGxvYydlZCBjaHVua3MuICBJdCBtdXN0IGJlIGENCisgIHBvd2VyIG9mIHR3byBhbmQgYXQgbGVhc3QgOCwgZXZlbiBvbiBtYWNoaW5lcyBmb3Igd2hpY2ggc21hbGxlcg0KKyAgYWxpZ25tZW50cyB3b3VsZCBzdWZmaWNlLiBJdCBtYXkgYmUgZGVmaW5lZCBhcyBsYXJnZXIgdGhhbiB0aGlzDQorICB0aG91Z2guIE5vdGUgaG93ZXZlciB0aGF0IGNvZGUgYW5kIGRhdGEgc3RydWN0dXJlcyBhcmUgb3B0aW1pemVkIGZvcg0KKyAgdGhlIGNhc2Ugb2YgOC1ieXRlIGFsaWdubWVudC4NCisNCitNU1BBQ0VTICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMCAoZmFsc2UpDQorICBJZiB0cnVlLCBjb21waWxlIGluIHN1cHBvcnQgZm9yIGluZGVwZW5kZW50IGFsbG9jYXRpb24gc3BhY2VzLg0KKyAgVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpZiBIQVZFX01NQVAgaXMgdHJ1ZS4NCisNCitPTkxZX01TUEFDRVMgICAgICAgICAgICAgZGVmYXVsdDogMCAoZmFsc2UpDQorICBJZiB0cnVlLCBvbmx5IGNvbXBpbGUgaW4gbXNwYWNlIHZlcnNpb25zLCBub3QgcmVndWxhciB2ZXJzaW9ucy4NCisNCitVU0VfTE9DS1MgICAgICAgICAgICAgICAgZGVmYXVsdDogMCAoZmFsc2UpDQorICBDYXVzZXMgZWFjaCBjYWxsIHRvIGVhY2ggcHVibGljIHJvdXRpbmUgdG8gYmUgc3Vycm91bmRlZCB3aXRoDQorICBwdGhyZWFkIG9yIFdJTjMyIG11dGV4IGxvY2svdW5sb2NrLiAoSWYgc2V0IHRydWUsIHRoaXMgY2FuIGJlDQorICBvdmVycmlkZGVuIG9uIGEgcGVyLW1zcGFjZSBiYXNpcyBmb3IgbXNwYWNlIHZlcnNpb25zLikgSWYgc2V0IHRvIGENCisgIG5vbi16ZXJvIHZhbHVlIG90aGVyIHRoYW4gMSwgbG9ja3MgYXJlIHVzZWQsIGJ1dCB0aGVpcg0KKyAgaW1wbGVtZW50YXRpb24gaXMgbGVmdCBvdXQsIHNvIGxvY2sgZnVuY3Rpb25zIG11c3QgYmUgc3VwcGxpZWQgbWFudWFsbHksDQorICBhcyBkZXNjcmliZWQgYmVsb3cuDQorDQorVVNFX1NQSU5fTE9DS1MgICAgICAgICAgIGRlZmF1bHQ6IDEgaWZmIFVTRV9MT0NLUyBhbmQgb24geDg2IHVzaW5nIGdjYyBvciBNU0MNCisgIElmIHRydWUsIHVzZXMgY3VzdG9tIHNwaW4gbG9ja3MgZm9yIGxvY2tpbmcuIFRoaXMgaXMgY3VycmVudGx5DQorICBzdXBwb3J0ZWQgb25seSBmb3IgeDg2IHBsYXRmb3JtcyB1c2luZyBnY2Mgb3IgcmVjZW50IE1TIGNvbXBpbGVycy4NCisgIE90aGVyd2lzZSwgcG9zaXggbG9ja3Mgb3Igd2luMzIgY3JpdGljYWwgc2VjdGlvbnMgYXJlIHVzZWQuDQorDQorRk9PVEVSUyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDANCisgIElmIHRydWUsIHByb3ZpZGUgZXh0cmEgY2hlY2tpbmcgYW5kIGRpc3BhdGNoaW5nIGJ5IHBsYWNpbmcNCisgIGluZm9ybWF0aW9uIGluIHRoZSBmb290ZXJzIG9mIGFsbG9jYXRlZCBjaHVua3MuIFRoaXMgYWRkcw0KKyAgc3BhY2UgYW5kIHRpbWUgb3ZlcmhlYWQuDQorDQorSU5TRUNVUkUgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDANCisgIElmIHRydWUsIG9taXQgY2hlY2tzIGZvciB1c2FnZSBlcnJvcnMgYW5kIGhlYXAgc3BhY2Ugb3ZlcndyaXRlcy4NCisNCitVU0VfRExfUFJFRklYICAgICAgICAgICAgZGVmYXVsdDogTk9UIGRlZmluZWQNCisgIENhdXNlcyBjb21waWxlciB0byBwcmVmaXggYWxsIHB1YmxpYyByb3V0aW5lcyB3aXRoIHRoZSBzdHJpbmcgJ2RsJy4NCisgIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdSBvbmx5IHdhbnQgdG8gdXNlIHRoaXMgbWFsbG9jIGluIG9uZSBwYXJ0DQorICBvZiBhIHByb2dyYW0sIHVzaW5nIHlvdXIgcmVndWxhciBzeXN0ZW0gbWFsbG9jIGVsc2V3aGVyZS4NCisNCitBQk9SVCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmaW5lZCBhcyBhYm9ydCgpDQorICBEZWZpbmVzIGhvdyB0byBhYm9ydCBvbiBmYWlsZWQgY2hlY2tzLiAgT24gbW9zdCBzeXN0ZW1zLCBhIGZhaWxlZA0KKyAgY2hlY2sgY2Fubm90IGRpZSB3aXRoIGFuICJhc3NlcnQiIG9yIGV2ZW4gcHJpbnQgYW4gaW5mb3JtYXRpdmUNCisgIG1lc3NhZ2UsIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgcHJpbnQgcm91dGluZXMgaW4gdHVybiBjYWxsIG1hbGxvYywNCisgIHdoaWNoIHdpbGwgZmFpbCBhZ2Fpbi4gIEdlbmVyYWxseSwgdGhlIGJlc3QgcG9saWN5IGlzIHRvIHNpbXBseSBjYWxsDQorICBhYm9ydCgpLiBJdCdzIG5vdCB2ZXJ5IHVzZWZ1bCB0byBkbyBtb3JlIHRoYW4gdGhpcyBiZWNhdXNlIG1hbnkNCisgIGVycm9ycyBkdWUgdG8gb3ZlcndyaXRpbmcgd2lsbCBzaG93IHVwIGFzIGFkZHJlc3MgZmF1bHRzIChudWxsLCBvZGQNCisgIGFkZHJlc3NlcyBldGMpIHJhdGhlciB0aGFuIG1hbGxvYy10cmlnZ2VyZWQgY2hlY2tzLCBzbyB3aWxsIGFsc28NCisgIGFib3J0LiAgQWxzbywgbW9zdCBjb21waWxlcnMga25vdyB0aGF0IGFib3J0KCkgZG9lcyBub3QgcmV0dXJuLCBzbw0KKyAgY2FuIGJldHRlciBvcHRpbWl6ZSBjb2RlIGNvbmRpdGlvbmFsbHkgY2FsbGluZyBpdC4NCisNCitQUk9DRUVEX09OX0VSUk9SICAgICAgICAgICBkZWZhdWx0OiBkZWZpbmVkIGFzIDAgKGZhbHNlKQ0KKyAgQ29udHJvbHMgd2hldGhlciBkZXRlY3RlZCBiYWQgYWRkcmVzc2VzIGNhdXNlIHRoZW0gdG8gYnlwYXNzZWQNCisgIHJhdGhlciB0aGFuIGFib3J0aW5nLiBJZiBzZXQsIGRldGVjdGVkIGJhZCBhcmd1bWVudHMgdG8gZnJlZSBhbmQNCisgIHJlYWxsb2MgYXJlIGlnbm9yZWQuIEFuZCBhbGwgYm9va2tlZXBpbmcgaW5mb3JtYXRpb24gaXMgemVyb2VkIG91dA0KKyAgdXBvbiBhIGRldGVjdGVkIG92ZXJ3cml0ZSBvZiBmcmVlZCBoZWFwIHNwYWNlLCB0aHVzIGxvc2luZyB0aGUNCisgIGFiaWxpdHkgdG8gZXZlciByZXR1cm4gaXQgZnJvbSBtYWxsb2MgYWdhaW4sIGJ1dCBlbmFibGluZyB0aGUNCisgIGFwcGxpY2F0aW9uIHRvIHByb2NlZWQuIElmIFBST0NFRURfT05fRVJST1IgaXMgZGVmaW5lZCwgdGhlDQorICBzdGF0aWMgdmFyaWFibGUgbWFsbG9jX2NvcnJ1cHRpb25fZXJyb3JfY291bnQgaXMgY29tcGlsZWQgaW4NCisgIGFuZCBjYW4gYmUgZXhhbWluZWQgdG8gc2VlIGlmIGVycm9ycyBoYXZlIG9jY3VycmVkLiBUaGlzIG9wdGlvbg0KKyAgZ2VuZXJhdGVzIHNsb3dlciBjb2RlIHRoYW4gdGhlIGRlZmF1bHQgYWJvcnQgcG9saWN5Lg0KKw0KK0RFQlVHICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBOT1QgZGVmaW5lZA0KKyAgVGhlIERFQlVHIHNldHRpbmcgaXMgbWFpbmx5IGludGVuZGVkIGZvciBwZW9wbGUgdHJ5aW5nIHRvIG1vZGlmeQ0KKyAgdGhpcyBjb2RlIG9yIGRpYWdub3NlIHByb2JsZW1zIHdoZW4gcG9ydGluZyB0byBuZXcgcGxhdGZvcm1zLg0KKyAgSG93ZXZlciwgaXQgbWF5IGFsc28gYmUgYWJsZSB0byBiZXR0ZXIgaXNvbGF0ZSB1c2VyIGVycm9ycyB0aGFuIGp1c3QNCisgIHVzaW5nIHJ1bnRpbWUgY2hlY2tzLiAgVGhlIGFzc2VydGlvbnMgaW4gdGhlIGNoZWNrIHJvdXRpbmVzIHNwZWxsDQorICBvdXQgaW4gbW9yZSBkZXRhaWwgdGhlIGFzc3VtcHRpb25zIGFuZCBpbnZhcmlhbnRzIHVuZGVybHlpbmcgdGhlDQorICBhbGdvcml0aG1zLiAgVGhlIGNoZWNraW5nIGlzIGZhaXJseSBleHRlbnNpdmUsIGFuZCB3aWxsIHNsb3cgZG93bg0KKyAgZXhlY3V0aW9uIG5vdGljZWFibHkuIENhbGxpbmcgbWFsbG9jX3N0YXRzIG9yIG1hbGxpbmZvIHdpdGggREVCVUcNCisgIHNldCB3aWxsIGF0dGVtcHQgdG8gY2hlY2sgZXZlcnkgbm9uLW1tYXBwZWQgYWxsb2NhdGVkIGFuZCBmcmVlIGNodW5rDQorICBpbiB0aGUgY291cnNlIG9mIGNvbXB1dGluZyB0aGUgc3VtbWFyaWVzLg0KKw0KK0FCT1JUX09OX0FTU0VSVF9GQUlMVVJFICAgZGVmYXVsdDogZGVmaW5lZCBhcyAxICh0cnVlKQ0KKyAgRGVidWdnaW5nIGFzc2VydGlvbiBmYWlsdXJlcyBjYW4gYmUgbmVhcmx5IGltcG9zc2libGUgaWYgeW91cg0KKyAgdmVyc2lvbiBvZiB0aGUgYXNzZXJ0IG1hY3JvIGNhdXNlcyBtYWxsb2MgdG8gYmUgY2FsbGVkLCB3aGljaCB3aWxsDQorICBsZWFkIHRvIGEgY2FzY2FkZSBvZiBmdXJ0aGVyIGZhaWx1cmVzLCBibG93aW5nIHRoZSBydW50aW1lIHN0YWNrLg0KKyAgQUJPUlRfT05fQVNTRVJUX0ZBSUxVUkUgY2F1c2UgYXNzZXJ0aW9ucyBmYWlsdXJlcyB0byBjYWxsIGFib3J0KCksDQorICB3aGljaCB3aWxsIHVzdWFsbHkgbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyLg0KKw0KK01BTExPQ19GQUlMVVJFX0FDVElPTiAgICAgZGVmYXVsdDogc2V0cyBlcnJubyB0byBFTk9NRU0sIG9yIG5vLW9wIG9uIHdpbjMyDQorICBUaGUgYWN0aW9uIHRvIHRha2UgYmVmb3JlICJyZXR1cm4gMCIgd2hlbiBtYWxsb2MgZmFpbHMgdG8gYmUgYWJsZSB0bw0KKyAgcmV0dXJuIG1lbW9yeSBiZWNhdXNlIHRoZXJlIGlzIG5vbmUgYXZhaWxhYmxlLg0KKw0KK0hBVkVfTU9SRUNPUkUgICAgICAgICAgICAgZGVmYXVsdDogMSAodHJ1ZSkgdW5sZXNzIHdpbjMyIG9yIE9OTFlfTVNQQUNFUw0KKyAgVHJ1ZSBpZiB0aGlzIHN5c3RlbSBzdXBwb3J0cyBzYnJrIG9yIGFuIGVtdWxhdGlvbiBvZiBpdC4NCisNCitNT1JFQ09SRSAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHNicmsNCisgIFRoZSBuYW1lIG9mIHRoZSBzYnJrLXN0eWxlIHN5c3RlbSByb3V0aW5lIHRvIGNhbGwgdG8gb2J0YWluIG1vcmUNCisgIG1lbW9yeS4gIFNlZSBiZWxvdyBmb3IgZ3VpZGFuY2Ugb24gd3JpdGluZyBjdXN0b20gTU9SRUNPUkUNCisgIGZ1bmN0aW9ucy4gVGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50IHRvIHNicmsvTU9SRUNPUkUgdmFyaWVzIGFjcm9zcw0KKyAgc3lzdGVtcy4gIEl0IGNhbm5vdCBiZSBzaXplX3QsIGJlY2F1c2UgaXQgc3VwcG9ydHMgbmVnYXRpdmUNCisgIGFyZ3VtZW50cywgc28gaXQgaXMgbm9ybWFsbHkgdGhlIHNpZ25lZCB0eXBlIG9mIHRoZSBzYW1lIHdpZHRoIGFzDQorICBzaXplX3QgKHNvbWV0aW1lcyBkZWNsYXJlZCBhcyAiaW50cHRyX3QiKS4gIEl0IGRvZXNuJ3QgbXVjaCBtYXR0ZXINCisgIHRob3VnaC4gSW50ZXJuYWxseSwgd2Ugb25seSBjYWxsIGl0IHdpdGggYXJndW1lbnRzIGxlc3MgdGhhbiBoYWxmDQorICB0aGUgbWF4IHZhbHVlIG9mIGEgc2l6ZV90LCB3aGljaCBzaG91bGQgd29yayBhY3Jvc3MgYWxsIHJlYXNvbmFibGUNCisgIHBvc3NpYmlsaXRpZXMsIGFsdGhvdWdoIHNvbWV0aW1lcyBnZW5lcmF0aW5nIGNvbXBpbGVyIHdhcm5pbmdzLg0KKw0KK01PUkVDT1JFX0NPTlRJR1VPVVMgICAgICAgZGVmYXVsdDogMSAodHJ1ZSkgaWYgSEFWRV9NT1JFQ09SRQ0KKyAgSWYgdHJ1ZSwgdGFrZSBhZHZhbnRhZ2Ugb2YgZmFjdCB0aGF0IGNvbnNlY3V0aXZlIGNhbGxzIHRvIE1PUkVDT1JFDQorICB3aXRoIHBvc2l0aXZlIGFyZ3VtZW50cyBhbHdheXMgcmV0dXJuIGNvbnRpZ3VvdXMgaW5jcmVhc2luZw0KKyAgYWRkcmVzc2VzLiAgVGhpcyBpcyB0cnVlIG9mIHVuaXggc2Jyay4gSXQgZG9lcyBub3QgaHVydCB0b28gbXVjaCB0bw0KKyAgc2V0IGl0IHRydWUgYW55d2F5LCBzaW5jZSBtYWxsb2MgY29wZXMgd2l0aCBub24tY29udGlndWl0aWVzLg0KKyAgU2V0dGluZyBpdCBmYWxzZSB3aGVuIGRlZmluaXRlbHkgbm9uLWNvbnRpZ3VvdXMgc2F2ZXMgdGltZQ0KKyAgYW5kIHBvc3NpYmx5IHdhc3RlZCBzcGFjZSBpdCB3b3VsZCB0YWtlIHRvIGRpc2NvdmVyIHRoaXMgdGhvdWdoLg0KKw0KK01PUkVDT1JFX0NBTk5PVF9UUklNICAgICAgZGVmYXVsdDogTk9UIGRlZmluZWQNCisgIFRydWUgaWYgTU9SRUNPUkUgY2Fubm90IHJlbGVhc2Ugc3BhY2UgYmFjayB0byB0aGUgc3lzdGVtIHdoZW4gZ2l2ZW4NCisgIG5lZ2F0aXZlIGFyZ3VtZW50cy4gVGhpcyBpcyBnZW5lcmFsbHkgbmVjZXNzYXJ5IG9ubHkgaWYgeW91IGFyZQ0KKyAgdXNpbmcgYSBoYW5kLWNyYWZ0ZWQgTU9SRUNPUkUgZnVuY3Rpb24gdGhhdCBjYW5ub3QgaGFuZGxlIG5lZ2F0aXZlDQorICBhcmd1bWVudHMuDQorDQorTk9fU0VHTUVOVF9UUkFWRVJTQUwgICAgICAgZGVmYXVsdDogMA0KKyAgSWYgbm9uLXplcm8sIHN1cHByZXNzZXMgdHJhdmVyc2FscyBvZiBtZW1vcnkgc2VnbWVudHMNCisgIHJldHVybmVkIGJ5IGVpdGhlciBNT1JFQ09SRSBvciBDQUxMX01NQVAuIFRoaXMgZGlzYWJsZXMNCisgIG1lcmdpbmcgb2Ygc2VnbWVudHMgdGhhdCBhcmUgY29udGlndW91cywgYW5kIHNlbGVjdGl2ZWx5DQorICByZWxlYXNpbmcgdGhlbSB0byB0aGUgT1MgaWYgdW51c2VkLCBidXQgYm91bmRzIGV4ZWN1dGlvbiB0aW1lcy4NCisNCitIQVZFX01NQVAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEgKHRydWUpDQorICBUcnVlIGlmIHRoaXMgc3lzdGVtIHN1cHBvcnRzIG1tYXAgb3IgYW4gZW11bGF0aW9uIG9mIGl0LiAgSWYgc28sIGFuZA0KKyAgSEFWRV9NT1JFQ09SRSBpcyBub3QgdHJ1ZSwgTU1BUCBpcyB1c2VkIGZvciBhbGwgc3lzdGVtDQorICBhbGxvY2F0aW9uLiBJZiBzZXQgYW5kIEhBVkVfTU9SRUNPUkUgaXMgdHJ1ZSBhcyB3ZWxsLCBNTUFQIGlzDQorICBwcmltYXJpbHkgdXNlZCB0byBkaXJlY3RseSBhbGxvY2F0ZSB2ZXJ5IGxhcmdlIGJsb2Nrcy4gSXQgaXMgYWxzbw0KKyAgdXNlZCBhcyBhIGJhY2t1cCBzdHJhdGVneSBpbiBjYXNlcyB3aGVyZSBNT1JFQ09SRSBmYWlscyB0byBwcm92aWRlDQorICBzcGFjZSBmcm9tIHN5c3RlbS4gTm90ZTogQSBzaW5nbGUgY2FsbCB0byBNVU5NQVAgaXMgYXNzdW1lZCB0byBiZQ0KKyAgYWJsZSB0byB1bm1hcCBtZW1vcnkgdGhhdCBtYXkgaGF2ZSBiZSBhbGxvY2F0ZWQgdXNpbmcgbXVsdGlwbGUgY2FsbHMNCisgIHRvIE1NQVAsIHNvIGxvbmcgYXMgdGhleSBhcmUgYWRqYWNlbnQuDQorDQorSEFWRV9NUkVNQVAgICAgICAgICAgICAgICBkZWZhdWx0OiAxIG9uIGxpbnV4LCBlbHNlIDANCisgIElmIHRydWUgcmVhbGxvYygpIHVzZXMgbXJlbWFwKCkgdG8gcmUtYWxsb2NhdGUgbGFyZ2UgYmxvY2tzIGFuZA0KKyAgZXh0ZW5kIG9yIHNocmluayBhbGxvY2F0aW9uIHNwYWNlcy4NCisNCitNTUFQX0NMRUFSUyAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEgZXhjZXB0IG9uIFdJTkNFLg0KKyAgVHJ1ZSBpZiBtbWFwIGNsZWFycyBtZW1vcnkgc28gY2FsbG9jIGRvZXNuJ3QgbmVlZCB0by4gVGhpcyBpcyB0cnVlDQorICBmb3Igc3RhbmRhcmQgdW5peCBtbWFwIHVzaW5nIC9kZXYvemVybyBhbmQgb24gV0lOMzIgZXhjZXB0IGZvciBXSU5DRS4NCisNCitVU0VfQlVJTFRJTl9GRlMgICAgICAgICAgICBkZWZhdWx0OiAwIChpLmUuLCBub3QgdXNlZCkNCisgIENhdXNlcyBtYWxsb2MgdG8gdXNlIHRoZSBidWlsdGluIGZmcygpIGZ1bmN0aW9uIHRvIGNvbXB1dGUgaW5kaWNlcy4NCisgIFNvbWUgY29tcGlsZXJzIG1heSByZWNvZ25pemUgYW5kIGludHJpbnNpZnkgZmZzIHRvIGJlIGZhc3RlciB0aGFuIHRoZQ0KKyAgc3VwcGxpZWQgQyB2ZXJzaW9uLiBBbHNvLCB0aGUgY2FzZSBvZiB4ODYgdXNpbmcgZ2NjIGlzIHNwZWNpYWwtY2FzZWQNCisgIHRvIGFuIGFzbSBpbnN0cnVjdGlvbiwgc28gaXMgYWxyZWFkeSBhcyBmYXN0IGFzIGl0IGNhbiBiZSwgYW5kIHNvDQorICB0aGlzIHNldHRpbmcgaGFzIG5vIGVmZmVjdC4gU2ltaWxhcmx5IGZvciBXaW4zMiB1bmRlciByZWNlbnQgTVMgY29tcGlsZXJzLg0KKyAgKE9uIG1vc3QgeDg2cywgdGhlIGFzbSB2ZXJzaW9uIGlzIG9ubHkgc2xpZ2h0bHkgZmFzdGVyIHRoYW4gdGhlIEMgdmVyc2lvbi4pDQorDQorbWFsbG9jX2dldHBhZ2VzaXplICAgICAgICAgZGVmYXVsdDogZGVyaXZlIGZyb20gc3lzdGVtIGluY2x1ZGVzLCBvciA0MDk2Lg0KKyAgVGhlIHN5c3RlbSBwYWdlIHNpemUuIFRvIHRoZSBleHRlbnQgcG9zc2libGUsIHRoaXMgbWFsbG9jIG1hbmFnZXMNCisgIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0gaW4gcGFnZS1zaXplIHVuaXRzLiAgVGhpcyBtYXkgYmUgKGFuZA0KKyAgdXN1YWxseSBpcykgYSBmdW5jdGlvbiByYXRoZXIgdGhhbiBhIGNvbnN0YW50LiBUaGlzIGlzIGlnbm9yZWQNCisgIGlmIFdJTjMyLCB3aGVyZSBwYWdlIHNpemUgaXMgZGV0ZXJtaW5lZCB1c2luZyBnZXRTeXN0ZW1JbmZvIGR1cmluZw0KKyAgaW5pdGlhbGl6YXRpb24uDQorDQorVVNFX0RFVl9SQU5ET00gICAgICAgICAgICAgZGVmYXVsdDogMCAoaS5lLiwgbm90IHVzZWQpDQorICBDYXVzZXMgbWFsbG9jIHRvIHVzZSAvZGV2L3JhbmRvbSB0byBpbml0aWFsaXplIHNlY3VyZSBtYWdpYyBzZWVkIGZvcg0KKyAgc3RhbXBpbmcgZm9vdGVycy4gT3RoZXJ3aXNlLCB0aGUgY3VycmVudCB0aW1lIGlzIHVzZWQuDQorDQorTk9fTUFMTElORk8gICAgICAgICAgICAgICAgZGVmYXVsdDogMA0KKyAgSWYgZGVmaW5lZCwgZG9uJ3QgY29tcGlsZSAibWFsbGluZm8iLiBUaGlzIGNhbiBiZSBhIHNpbXBsZSB3YXkNCisgIG9mIGRlYWxpbmcgd2l0aCBtaXNtYXRjaGVzIGJldHdlZW4gc3lzdGVtIGRlY2xhcmF0aW9ucyBhbmQNCisgIHRob3NlIGluIHRoaXMgZmlsZS4NCisNCitNQUxMSU5GT19GSUVMRF9UWVBFICAgICAgICBkZWZhdWx0OiBzaXplX3QNCisgIFRoZSB0eXBlIG9mIHRoZSBmaWVsZHMgaW4gdGhlIG1hbGxpbmZvIHN0cnVjdC4gVGhpcyB3YXMgb3JpZ2luYWxseQ0KKyAgZGVmaW5lZCBhcyAiaW50IiBpbiBTVklEIGV0YywgYnV0IGlzIG1vcmUgdXNlZnVsbHkgZGVmaW5lZCBhcw0KKyAgc2l6ZV90LiBUaGUgdmFsdWUgaXMgdXNlZCBvbmx5IGlmICBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IIGlzIG5vdCBzZXQNCisNCitSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgICAgZGVmYXVsdDogbm90IGRlZmluZWQNCisgIFRoaXMgc2hvdWxkIGJlIHNldCBpZiBhIGNhbGwgdG8gcmVhbGxvYyB3aXRoIHplcm8gYnl0ZXMgc2hvdWxkDQorICBiZSB0aGUgc2FtZSBhcyBhIGNhbGwgdG8gZnJlZS4gU29tZSBwZW9wbGUgdGhpbmsgaXQgc2hvdWxkLiBPdGhlcndpc2UsDQorICBzaW5jZSB0aGlzIG1hbGxvYyByZXR1cm5zIGEgdW5pcXVlIHBvaW50ZXIgZm9yIG1hbGxvYygwKSwgc28gZG9lcw0KKyAgcmVhbGxvYyhwLCAwKS4NCisNCitMQUNLU19VTklTVERfSCwgTEFDS1NfRkNOVExfSCwgTEFDS1NfU1lTX1BBUkFNX0gsIExBQ0tTX1NZU19NTUFOX0gNCitMQUNLU19TVFJJTkdTX0gsIExBQ0tTX1NUUklOR19ILCBMQUNLU19TWVNfVFlQRVNfSCwgIExBQ0tTX0VSUk5PX0gNCitMQUNLU19TVERMSUJfSCAgICAgICAgICAgICAgICBkZWZhdWx0OiBOT1QgZGVmaW5lZCB1bmxlc3Mgb24gV0lOMzINCisgIERlZmluZSB0aGVzZSBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZXNlIGhlYWRlciBmaWxlcy4NCisgIFlvdSBtaWdodCBuZWVkIHRvIG1hbnVhbGx5IGluc2VydCBzb21lIG9mIHRoZSBkZWNsYXJhdGlvbnMgdGhleSBwcm92aWRlLg0KKw0KK0RFRkFVTFRfR1JBTlVMQVJJVFkgICAgICAgIGRlZmF1bHQ6IHBhZ2Ugc2l6ZSBpZiBNT1JFQ09SRV9DT05USUdVT1VTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtX2luZm8uZHdBbGxvY2F0aW9uR3JhbnVsYXJpdHkgaW4gV0lOMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgNjRLLg0KKyAgICAgIEFsc28gc2V0dGFibGUgdXNpbmcgbWFsbG9wdChNX0dSQU5VTEFSSVRZLCB4KQ0KKyAgVGhlIHVuaXQgZm9yIGFsbG9jYXRpbmcgYW5kIGRlYWxsb2NhdGluZyBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtLiAgT24NCisgIG1vc3Qgc3lzdGVtcyB3aXRoIGNvbnRpZ3VvdXMgTU9SRUNPUkUsIHRoZXJlIGlzIG5vIHJlYXNvbiB0bw0KKyAgbWFrZSB0aGlzIG1vcmUgdGhhbiBhIHBhZ2UuIEhvd2V2ZXIsIHN5c3RlbXMgd2l0aCBNTUFQIHRlbmQgdG8NCisgIGVpdGhlciByZXF1aXJlIG9yIGVuY291cmFnZSBsYXJnZXIgZ3JhbnVsYXJpdGllcy4gIFlvdSBjYW4gaW5jcmVhc2UNCisgIHRoaXMgdmFsdWUgdG8gcHJldmVudCBzeXN0ZW0gYWxsb2NhdGlvbiBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHNvDQorICBvZnRlbiwgZXNwZWNpYWxseSBpZiB0aGV5IGFyZSBzbG93LiAgVGhlIHZhbHVlIG11c3QgYmUgYXQgbGVhc3Qgb25lDQorICBwYWdlIGFuZCBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLiAgU2V0dGluZyB0byAwIGNhdXNlcyBpbml0aWFsaXphdGlvbg0KKyAgdG8gZWl0aGVyIHBhZ2Ugc2l6ZSBvciB3aW4zMiByZWdpb24gc2l6ZS4gIChOb3RlOiBJbiBwcmV2aW91cw0KKyAgdmVyc2lvbnMgb2YgbWFsbG9jLCB0aGUgZXF1aXZhbGVudCBvZiB0aGlzIG9wdGlvbiB3YXMgY2FsbGVkDQorICAiVE9QX1BBRCIpDQorDQorREVGQVVMVF9UUklNX1RIUkVTSE9MRCAgICBkZWZhdWx0OiAyTUINCisgICAgICBBbHNvIHNldHRhYmxlIHVzaW5nIG1hbGxvcHQoTV9UUklNX1RIUkVTSE9MRCwgeCkNCisgIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB1bnVzZWQgdG9wLW1vc3QgbWVtb3J5IHRvIGtlZXAgYmVmb3JlDQorICByZWxlYXNpbmcgdmlhIG1hbGxvY190cmltIGluIGZyZWUoKS4gIEF1dG9tYXRpYyB0cmltbWluZyBpcyBtYWlubHkNCisgIHVzZWZ1bCBpbiBsb25nLWxpdmVkIHByb2dyYW1zIHVzaW5nIGNvbnRpZ3VvdXMgTU9SRUNPUkUuICBCZWNhdXNlDQorICB0cmltbWluZyB2aWEgc2JyayBjYW4gYmUgc2xvdyBvbiBzb21lIHN5c3RlbXMsIGFuZCBjYW4gc29tZXRpbWVzIGJlDQorICB3YXN0ZWZ1bCAoaW4gY2FzZXMgd2hlcmUgcHJvZ3JhbXMgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkIGFsbG9jYXRlDQorICBtb3JlIGxhcmdlIGNodW5rcykgdGhlIHZhbHVlIHNob3VsZCBiZSBoaWdoIGVub3VnaCBzbyB0aGF0IHlvdXINCisgIG92ZXJhbGwgc3lzdGVtIHBlcmZvcm1hbmNlIHdvdWxkIGltcHJvdmUgYnkgcmVsZWFzaW5nIHRoaXMgbXVjaA0KKyAgbWVtb3J5LiAgQXMgYSByb3VnaCBndWlkZSwgeW91IG1pZ2h0IHNldCB0byBhIHZhbHVlIGNsb3NlIHRvIHRoZQ0KKyAgYXZlcmFnZSBzaXplIG9mIGEgcHJvY2VzcyAocHJvZ3JhbSkgcnVubmluZyBvbiB5b3VyIHN5c3RlbS4NCisgIFJlbGVhc2luZyB0aGlzIG11Y2ggbWVtb3J5IHdvdWxkIGFsbG93IHN1Y2ggYSBwcm9jZXNzIHRvIHJ1biBpbg0KKyAgbWVtb3J5LiAgR2VuZXJhbGx5LCBpdCBpcyB3b3J0aCB0dW5pbmcgdHJpbSB0aHJlc2hvbGRzIHdoZW4gYQ0KKyAgcHJvZ3JhbSB1bmRlcmdvZXMgcGhhc2VzIHdoZXJlIHNldmVyYWwgbGFyZ2UgY2h1bmtzIGFyZSBhbGxvY2F0ZWQNCisgIGFuZCByZWxlYXNlZCBpbiB3YXlzIHRoYXQgY2FuIHJldXNlIGVhY2ggb3RoZXIncyBzdG9yYWdlLCBwZXJoYXBzDQorICBtaXhlZCB3aXRoIHBoYXNlcyB3aGVyZSB0aGVyZSBhcmUgbm8gc3VjaCBjaHVua3MgYXQgYWxsLiBUaGUgdHJpbQ0KKyAgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gcGFnZSBzaXplIHRvIGhhdmUgYW55IHVzZWZ1bCBlZmZlY3QuICBUbw0KKyAgZGlzYWJsZSB0cmltbWluZyBjb21wbGV0ZWx5LCB5b3UgY2FuIHNldCB0byBNQVhfU0laRV9ULiBOb3RlIHRoYXQgdGhlIHRyaWNrDQorICBzb21lIHBlb3BsZSB1c2Ugb2YgbWFsbG9jaW5nIGEgaHVnZSBzcGFjZSBhbmQgdGhlbiBmcmVlaW5nIGl0IGF0DQorICBwcm9ncmFtIHN0YXJ0dXAsIGluIGFuIGF0dGVtcHQgdG8gcmVzZXJ2ZSBzeXN0ZW0gbWVtb3J5LCBkb2Vzbid0DQorICBoYXZlIHRoZSBpbnRlbmRlZCBlZmZlY3QgdW5kZXIgYXV0b21hdGljIHRyaW1taW5nLCBzaW5jZSB0aGF0IG1lbW9yeQ0KKyAgd2lsbCBpbW1lZGlhdGVseSBiZSByZXR1cm5lZCB0byB0aGUgc3lzdGVtLg0KKw0KK0RFRkFVTFRfTU1BUF9USFJFU0hPTEQgICAgICAgZGVmYXVsdDogMjU2Sw0KKyAgICAgIEFsc28gc2V0dGFibGUgdXNpbmcgbWFsbG9wdChNX01NQVBfVEhSRVNIT0xELCB4KQ0KKyAgVGhlIHJlcXVlc3Qgc2l6ZSB0aHJlc2hvbGQgZm9yIHVzaW5nIE1NQVAgdG8gZGlyZWN0bHkgc2VydmljZSBhDQorICByZXF1ZXN0LiBSZXF1ZXN0cyBvZiBhdCBsZWFzdCB0aGlzIHNpemUgdGhhdCBjYW5ub3QgYmUgYWxsb2NhdGVkDQorICB1c2luZyBhbHJlYWR5LWV4aXN0aW5nIHNwYWNlIHdpbGwgYmUgc2VydmljZWQgdmlhIG1tYXAuICAoSWYgZW5vdWdoDQorICBub3JtYWwgZnJlZWQgc3BhY2UgYWxyZWFkeSBleGlzdHMgaXQgaXMgdXNlZCBpbnN0ZWFkLikgIFVzaW5nIG1tYXANCisgIHNlZ3JlZ2F0ZXMgcmVsYXRpdmVseSBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5IHNvIHRoYXQgdGhleSBjYW4gYmUNCisgIGluZGl2aWR1YWxseSBvYnRhaW5lZCBhbmQgcmVsZWFzZWQgZnJvbSB0aGUgaG9zdCBzeXN0ZW0uIEEgcmVxdWVzdA0KKyAgc2VydmljZWQgdGhyb3VnaCBtbWFwIGlzIG5ldmVyIHJldXNlZCBieSBhbnkgb3RoZXIgcmVxdWVzdCAoYXQgbGVhc3QNCisgIG5vdCBkaXJlY3RseTsgdGhlIHN5c3RlbSBtYXkganVzdCBzbyBoYXBwZW4gdG8gcmVtYXAgc3VjY2Vzc2l2ZQ0KKyAgcmVxdWVzdHMgdG8gdGhlIHNhbWUgbG9jYXRpb25zKS4gIFNlZ3JlZ2F0aW5nIHNwYWNlIGluIHRoaXMgd2F5IGhhcw0KKyAgdGhlIGJlbmVmaXRzIHRoYXQ6IE1tYXBwZWQgc3BhY2UgY2FuIGFsd2F5cyBiZSBpbmRpdmlkdWFsbHkgcmVsZWFzZWQNCisgIGJhY2sgdG8gdGhlIHN5c3RlbSwgd2hpY2ggaGVscHMga2VlcCB0aGUgc3lzdGVtIGxldmVsIG1lbW9yeSBkZW1hbmRzDQorICBvZiBhIGxvbmctbGl2ZWQgcHJvZ3JhbSBsb3cuICBBbHNvLCBtYXBwZWQgbWVtb3J5IGRvZXNuJ3QgYmVjb21lDQorICBgbG9ja2VkJyBiZXR3ZWVuIG90aGVyIGNodW5rcywgYXMgY2FuIGhhcHBlbiB3aXRoIG5vcm1hbGx5IGFsbG9jYXRlZA0KKyAgY2h1bmtzLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gdHJpbW1pbmcgdmlhIG1hbGxvY190cmltIHdvdWxkIG5vdA0KKyAgcmVsZWFzZSB0aGVtLiAgSG93ZXZlciwgaXQgaGFzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCB0aGUgc3BhY2UNCisgIGNhbm5vdCBiZSByZWNsYWltZWQsIGNvbnNvbGlkYXRlZCwgYW5kIHRoZW4gdXNlZCB0byBzZXJ2aWNlIGxhdGVyDQorICByZXF1ZXN0cywgYXMgaGFwcGVucyB3aXRoIG5vcm1hbCBjaHVua3MuICBUaGUgYWR2YW50YWdlcyBvZiBtbWFwDQorICBuZWFybHkgYWx3YXlzIG91dHdlaWdoIGRpc2FkdmFudGFnZXMgZm9yICJsYXJnZSIgY2h1bmtzLCBidXQgdGhlDQorICB2YWx1ZSBvZiAibGFyZ2UiIG1heSB2YXJ5IGFjcm9zcyBzeXN0ZW1zLiAgVGhlIGRlZmF1bHQgaXMgYW4NCisgIGVtcGlyaWNhbGx5IGRlcml2ZWQgdmFsdWUgdGhhdCB3b3JrcyB3ZWxsIGluIG1vc3Qgc3lzdGVtcy4gWW91IGNhbg0KKyAgZGlzYWJsZSBtbWFwIGJ5IHNldHRpbmcgdG8gTUFYX1NJWkVfVC4NCisNCitNQVhfUkVMRUFTRV9DSEVDS19SQVRFICAgZGVmYXVsdDogNDA5NSB1bmxlc3Mgbm90IEhBVkVfTU1BUA0KKyAgVGhlIG51bWJlciBvZiBjb25zb2xpZGF0ZWQgZnJlZXMgYmV0d2VlbiBjaGVja3MgdG8gcmVsZWFzZQ0KKyAgdW51c2VkIHNlZ21lbnRzIHdoZW4gZnJlZWluZy4gV2hlbiB1c2luZyBub24tY29udGlndW91cyBzZWdtZW50cywNCisgIGVzcGVjaWFsbHkgd2l0aCBtdWx0aXBsZSBtc3BhY2VzLCBjaGVja2luZyBvbmx5IGZvciB0b3Btb3N0IHNwYWNlDQorICBkb2Vzbid0IGFsd2F5cyBzdWZmaWNlIHRvIHRyaWdnZXIgdHJpbW1pbmcuIFRvIGNvbXBlbnNhdGUgZm9yIHRoaXMsDQorICBmcmVlKCkgd2lsbCwgd2l0aCBhIHBlcmlvZCBvZiBNQVhfUkVMRUFTRV9DSEVDS19SQVRFIChvciB0aGUNCisgIGN1cnJlbnQgbnVtYmVyIG9mIHNlZ21lbnRzLCBpZiBncmVhdGVyKSB0cnkgdG8gcmVsZWFzZSB1bnVzZWQNCisgIHNlZ21lbnRzIHRvIHRoZSBPUyB3aGVuIGZyZWVpbmcgY2h1bmtzIHRoYXQgcmVzdWx0IGluDQorICBjb25zb2xpZGF0aW9uLiBUaGUgYmVzdCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgYSBjb21wcm9taXNlDQorICBiZXR3ZWVuIHNsb3dpbmcgZG93biBmcmVlcyB3aXRoIHJlbGF0aXZlbHkgY29zdGx5IGNoZWNrcyB0aGF0DQorICByYXJlbHkgdHJpZ2dlciB2ZXJzdXMgaG9sZGluZyBvbiB0byB1bnVzZWQgbWVtb3J5LiBUbyBlZmZlY3RpdmVseQ0KKyAgZGlzYWJsZSwgc2V0IHRvIE1BWF9TSVpFX1QuIFRoaXMgbWF5IGxlYWQgdG8gYSB2ZXJ5IHNsaWdodCBzcGVlZA0KKyAgaW1wcm92ZW1lbnQgYXQgdGhlIGV4cGVuc2Ugb2YgY2FycnlpbmcgYXJvdW5kIG1vcmUgbWVtb3J5Lg0KKyovDQorDQorI2RlZmluZSBVU0VfRExfUFJFRklYDQorLy8jZGVmaW5lIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0gNCisvLyNkZWZpbmUgTVNQQUNFUyAxDQorI2RlZmluZSBOT19TRUdNRU5UX1RSQVZFUlNBTCAxDQorDQorLyogVmVyc2lvbiBpZGVudGlmaWVyIHRvIGFsbG93IHBlb3BsZSB0byBzdXBwb3J0IG11bHRpcGxlIHZlcnNpb25zICovDQorI2lmbmRlZiBETE1BTExPQ19WRVJTSU9ODQorI2RlZmluZSBETE1BTExPQ19WRVJTSU9OIDIwODA0DQorI2VuZGlmIC8qIERMTUFMTE9DX1ZFUlNJT04gKi8NCisNCisjaWZuZGVmIFdJTjMyDQorI2lmZGVmIF9XSU4zMg0KKyNkZWZpbmUgV0lOMzIgMQ0KKyNlbmRpZiAgLyogX1dJTjMyICovDQorI2lmZGVmIF9XSU4zMl9XQ0UNCisjZGVmaW5lIExBQ0tTX0ZDTlRMX0gNCisjZGVmaW5lIFdJTjMyIDENCisjZW5kaWYgLyogX1dJTjMyX1dDRSAqLw0KKyNlbmRpZiAgLyogV0lOMzIgKi8NCisjaWZkZWYgV0lOMzINCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4NCisjaW5jbHVkZSA8d2luZG93cy5oPg0KKyNkZWZpbmUgSEFWRV9NTUFQIDENCisjZGVmaW5lIEhBVkVfTU9SRUNPUkUgMA0KKyNkZWZpbmUgTEFDS1NfVU5JU1REX0gNCisjZGVmaW5lIExBQ0tTX1NZU19QQVJBTV9IDQorI2RlZmluZSBMQUNLU19TWVNfTU1BTl9IDQorI2RlZmluZSBMQUNLU19TVFJJTkdfSA0KKyNkZWZpbmUgTEFDS1NfU1RSSU5HU19IDQorI2RlZmluZSBMQUNLU19TWVNfVFlQRVNfSA0KKyNkZWZpbmUgTEFDS1NfRVJSTk9fSA0KKyNpZm5kZWYgTUFMTE9DX0ZBSUxVUkVfQUNUSU9ODQorI2RlZmluZSBNQUxMT0NfRkFJTFVSRV9BQ1RJT04NCisjZW5kaWYgLyogTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICovDQorI2lmZGVmIF9XSU4zMl9XQ0UgLyogV0lOQ0UgcmVwb3J0ZWRseSBkb2VzIG5vdCBjbGVhciAqLw0KKyNkZWZpbmUgTU1BUF9DTEVBUlMgMA0KKyNlbHNlDQorI2RlZmluZSBNTUFQX0NMRUFSUyAxDQorI2VuZGlmIC8qIF9XSU4zMl9XQ0UgKi8NCisjZW5kaWYgIC8qIFdJTjMyICovDQorDQorI2lmIGRlZmluZWQoREFSV0lOKSB8fCBkZWZpbmVkKF9EQVJXSU4pDQorLyogTWFjIE9TWCBkb2NzIGFkdmlzZSBub3QgdG8gdXNlIHNicms7IGl0IHNlZW1zIGJldHRlciB0byB1c2UgbW1hcCAqLw0KKyNpZm5kZWYgSEFWRV9NT1JFQ09SRQ0KKyNkZWZpbmUgSEFWRV9NT1JFQ09SRSAwDQorI2RlZmluZSBIQVZFX01NQVAgMQ0KKy8qIE9TWCBhbGxvY2F0b3JzIHByb3ZpZGUgMTYgYnl0ZSBhbGlnbm1lbnQgKi8NCisjaWZuZGVmIE1BTExPQ19BTElHTk1FTlQNCisjZGVmaW5lIE1BTExPQ19BTElHTk1FTlQgKChzaXplX3QpMTZVKQ0KKyNlbmRpZg0KKyNlbmRpZiAgLyogSEFWRV9NT1JFQ09SRSAqLw0KKyNlbmRpZiAgLyogREFSV0lOICovDQorDQorI2lmbmRlZiBMQUNLU19TWVNfVFlQRVNfSA0KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gIC8qIEZvciBzaXplX3QgKi8NCisjZW5kaWYgIC8qIExBQ0tTX1NZU19UWVBFU19IICovDQorDQorI2lmIChkZWZpbmVkKF9fR05VQ19fKSAmJiAoKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpKSkgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSPj0xMzEwKQ0KKyNkZWZpbmUgU1BJTl9MT0NLU19BVkFJTEFCTEUgMQ0KKyNlbHNlDQorI2RlZmluZSBTUElOX0xPQ0tTX0FWQUlMQUJMRSAwDQorI2VuZGlmDQorDQorLyogVGhlIG1heGltdW0gcG9zc2libGUgc2l6ZV90IHZhbHVlIGhhcyBhbGwgYml0cyBzZXQgKi8NCisjZGVmaW5lIE1BWF9TSVpFX1QgICAgICAgICAgICh+KHNpemVfdCkwKQ0KKw0KKyNpZm5kZWYgT05MWV9NU1BBQ0VTDQorI2RlZmluZSBPTkxZX01TUEFDRVMgMCAgICAgLyogZGVmaW5lIHRvIGEgdmFsdWUgKi8NCisjZWxzZQ0KKyNkZWZpbmUgT05MWV9NU1BBQ0VTIDENCisjZW5kaWYgIC8qIE9OTFlfTVNQQUNFUyAqLw0KKyNpZm5kZWYgTVNQQUNFUw0KKyNpZiBPTkxZX01TUEFDRVMNCisjZGVmaW5lIE1TUEFDRVMgMQ0KKyNlbHNlICAgLyogT05MWV9NU1BBQ0VTICovDQorI2RlZmluZSBNU1BBQ0VTIDANCisjZW5kaWYgIC8qIE9OTFlfTVNQQUNFUyAqLw0KKyNlbmRpZiAgLyogTVNQQUNFUyAqLw0KKyNpZm5kZWYgTUFMTE9DX0FMSUdOTUVOVA0KKyNkZWZpbmUgTUFMTE9DX0FMSUdOTUVOVCAoKHNpemVfdCk4VSkNCisjZW5kaWYgIC8qIE1BTExPQ19BTElHTk1FTlQgKi8NCisjaWZuZGVmIEZPT1RFUlMNCisjZGVmaW5lIEZPT1RFUlMgMA0KKyNlbmRpZiAgLyogRk9PVEVSUyAqLw0KKyNpZm5kZWYgQUJPUlQNCisjZGVmaW5lIEFCT1JUICBhYm9ydCgpDQorI2VuZGlmICAvKiBBQk9SVCAqLw0KKyNpZm5kZWYgQUJPUlRfT05fQVNTRVJUX0ZBSUxVUkUNCisjZGVmaW5lIEFCT1JUX09OX0FTU0VSVF9GQUlMVVJFIDENCisjZW5kaWYgIC8qIEFCT1JUX09OX0FTU0VSVF9GQUlMVVJFICovDQorI2lmbmRlZiBQUk9DRUVEX09OX0VSUk9SDQorI2RlZmluZSBQUk9DRUVEX09OX0VSUk9SIDANCisjZW5kaWYgIC8qIFBST0NFRURfT05fRVJST1IgKi8NCisjaWZuZGVmIFVTRV9MT0NLUw0KKyNkZWZpbmUgVVNFX0xPQ0tTIDANCisjZW5kaWYgIC8qIFVTRV9MT0NLUyAqLw0KKyNpZm5kZWYgVVNFX1NQSU5fTE9DS1MNCisjaWYgVVNFX0xPQ0tTICYmIFNQSU5fTE9DS1NfQVZBSUxBQkxFDQorI2RlZmluZSBVU0VfU1BJTl9MT0NLUyAxDQorI2Vsc2UNCisjZGVmaW5lIFVTRV9TUElOX0xPQ0tTIDANCisjZW5kaWYgLyogVVNFX0xPQ0tTICYmIFNQSU5fTE9DS1NfQVZBSUxBQkxFLiAqLw0KKyNlbmRpZiAvKiBVU0VfU1BJTl9MT0NLUyAqLw0KKyNpZm5kZWYgSU5TRUNVUkUNCisjZGVmaW5lIElOU0VDVVJFIDANCisjZW5kaWYgIC8qIElOU0VDVVJFICovDQorI2lmbmRlZiBIQVZFX01NQVANCisjZGVmaW5lIEhBVkVfTU1BUCAxDQorI2VuZGlmICAvKiBIQVZFX01NQVAgKi8NCisjaWZuZGVmIE1NQVBfQ0xFQVJTDQorI2RlZmluZSBNTUFQX0NMRUFSUyAxDQorI2VuZGlmICAvKiBNTUFQX0NMRUFSUyAqLw0KKyNpZm5kZWYgSEFWRV9NUkVNQVANCisjaWZkZWYgbGludXgNCisjZGVmaW5lIEhBVkVfTVJFTUFQIDENCisjZWxzZSAgIC8qIGxpbnV4ICovDQorI2RlZmluZSBIQVZFX01SRU1BUCAwDQorI2VuZGlmICAvKiBsaW51eCAqLw0KKyNlbmRpZiAgLyogSEFWRV9NUkVNQVAgKi8NCisjaWZuZGVmIE1BTExPQ19GQUlMVVJFX0FDVElPTg0KKyNkZWZpbmUgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICBlcnJubyA9IEVOT01FTTsNCisjZW5kaWYgIC8qIE1BTExPQ19GQUlMVVJFX0FDVElPTiAqLw0KKyNpZm5kZWYgSEFWRV9NT1JFQ09SRQ0KKyNpZiBPTkxZX01TUEFDRVMNCisjZGVmaW5lIEhBVkVfTU9SRUNPUkUgMA0KKyNlbHNlICAgLyogT05MWV9NU1BBQ0VTICovDQorI2RlZmluZSBIQVZFX01PUkVDT1JFIDENCisjZW5kaWYgIC8qIE9OTFlfTVNQQUNFUyAqLw0KKyNlbmRpZiAgLyogSEFWRV9NT1JFQ09SRSAqLw0KKyNpZiAhSEFWRV9NT1JFQ09SRQ0KKyNkZWZpbmUgTU9SRUNPUkVfQ09OVElHVU9VUyAwDQorI2Vsc2UgICAvKiAhSEFWRV9NT1JFQ09SRSAqLw0KKyNkZWZpbmUgTU9SRUNPUkVfREVGQVVMVCBzYnJrDQorI2lmbmRlZiBNT1JFQ09SRV9DT05USUdVT1VTDQorI2RlZmluZSBNT1JFQ09SRV9DT05USUdVT1VTIDENCisjZW5kaWYgIC8qIE1PUkVDT1JFX0NPTlRJR1VPVVMgKi8NCisjZW5kaWYgIC8qIEhBVkVfTU9SRUNPUkUgKi8NCisjaWZuZGVmIERFRkFVTFRfR1JBTlVMQVJJVFkNCisjaWYgKE1PUkVDT1JFX0NPTlRJR1VPVVMgfHwgZGVmaW5lZChXSU4zMikpDQorI2RlZmluZSBERUZBVUxUX0dSQU5VTEFSSVRZICgwKSAgLyogMCBtZWFucyB0byBjb21wdXRlIGluIGluaXRfbXBhcmFtcyAqLw0KKyNlbHNlICAgLyogTU9SRUNPUkVfQ09OVElHVU9VUyAqLw0KKyNkZWZpbmUgREVGQVVMVF9HUkFOVUxBUklUWSAoKHNpemVfdCk2NFUgKiAoc2l6ZV90KTEwMjRVKQ0KKyNlbmRpZiAgLyogTU9SRUNPUkVfQ09OVElHVU9VUyAqLw0KKyNlbmRpZiAgLyogREVGQVVMVF9HUkFOVUxBUklUWSAqLw0KKyNpZm5kZWYgREVGQVVMVF9UUklNX1RIUkVTSE9MRA0KKyNpZm5kZWYgTU9SRUNPUkVfQ0FOTk9UX1RSSU0NCisjZGVmaW5lIERFRkFVTFRfVFJJTV9USFJFU0hPTEQgKChzaXplX3QpMlUgKiAoc2l6ZV90KTEwMjRVICogKHNpemVfdCkxMDI0VSkNCisjZWxzZSAgIC8qIE1PUkVDT1JFX0NBTk5PVF9UUklNICovDQorI2RlZmluZSBERUZBVUxUX1RSSU1fVEhSRVNIT0xEIE1BWF9TSVpFX1QNCisjZW5kaWYgIC8qIE1PUkVDT1JFX0NBTk5PVF9UUklNICovDQorI2VuZGlmICAvKiBERUZBVUxUX1RSSU1fVEhSRVNIT0xEICovDQorI2lmbmRlZiBERUZBVUxUX01NQVBfVEhSRVNIT0xEDQorI2lmIEhBVkVfTU1BUA0KKyNkZWZpbmUgREVGQVVMVF9NTUFQX1RIUkVTSE9MRCAoKHNpemVfdCkyNTZVICogKHNpemVfdCkxMDI0VSkNCisjZWxzZSAgIC8qIEhBVkVfTU1BUCAqLw0KKyNkZWZpbmUgREVGQVVMVF9NTUFQX1RIUkVTSE9MRCBNQVhfU0laRV9UDQorI2VuZGlmICAvKiBIQVZFX01NQVAgKi8NCisjZW5kaWYgIC8qIERFRkFVTFRfTU1BUF9USFJFU0hPTEQgKi8NCisjaWZuZGVmIE1BWF9SRUxFQVNFX0NIRUNLX1JBVEUNCisjaWYgSEFWRV9NTUFQDQorI2RlZmluZSBNQVhfUkVMRUFTRV9DSEVDS19SQVRFIDQwOTUNCisjZWxzZQ0KKyNkZWZpbmUgTUFYX1JFTEVBU0VfQ0hFQ0tfUkFURSBNQVhfU0laRV9UDQorI2VuZGlmIC8qIEhBVkVfTU1BUCAqLw0KKyNlbmRpZiAvKiBNQVhfUkVMRUFTRV9DSEVDS19SQVRFICovDQorI2lmbmRlZiBVU0VfQlVJTFRJTl9GRlMNCisjZGVmaW5lIFVTRV9CVUlMVElOX0ZGUyAwDQorI2VuZGlmICAvKiBVU0VfQlVJTFRJTl9GRlMgKi8NCisjaWZuZGVmIFVTRV9ERVZfUkFORE9NDQorI2RlZmluZSBVU0VfREVWX1JBTkRPTSAwDQorI2VuZGlmICAvKiBVU0VfREVWX1JBTkRPTSAqLw0KKyNpZm5kZWYgTk9fTUFMTElORk8NCisjZGVmaW5lIE5PX01BTExJTkZPIDANCisjZW5kaWYgIC8qIE5PX01BTExJTkZPICovDQorI2lmbmRlZiBNQUxMSU5GT19GSUVMRF9UWVBFDQorI2RlZmluZSBNQUxMSU5GT19GSUVMRF9UWVBFIHNpemVfdA0KKyNlbmRpZiAgLyogTUFMTElORk9fRklFTERfVFlQRSAqLw0KKyNpZm5kZWYgTk9fU0VHTUVOVF9UUkFWRVJTQUwNCisjZGVmaW5lIE5PX1NFR01FTlRfVFJBVkVSU0FMIDANCisjZW5kaWYgLyogTk9fU0VHTUVOVF9UUkFWRVJTQUwgKi8NCisNCisvKg0KKyAgbWFsbG9wdCB0dW5pbmcgb3B0aW9ucy4gIFNWSUQvWFBHIGRlZmluZXMgZm91ciBzdGFuZGFyZCBwYXJhbWV0ZXINCisgIG51bWJlcnMgZm9yIG1hbGxvcHQsIG5vcm1hbGx5IGRlZmluZWQgaW4gbWFsbG9jLmguICBOb25lIG9mIHRoZXNlDQorICBhcmUgdXNlZCBpbiB0aGlzIG1hbGxvYywgc28gc2V0dGluZyB0aGVtIGhhcyBubyBlZmZlY3QuIEJ1dCB0aGlzDQorICBtYWxsb2MgZG9lcyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgb3B0aW9ucy4NCisqLw0KKw0KKyNkZWZpbmUgTV9UUklNX1RIUkVTSE9MRCAgICAgKC0xKQ0KKyNkZWZpbmUgTV9HUkFOVUxBUklUWSAgICAgICAgKC0yKQ0KKyNkZWZpbmUgTV9NTUFQX1RIUkVTSE9MRCAgICAgKC0zKQ0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWxsaW5mbyBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorI2lmICFOT19NQUxMSU5GTw0KKy8qDQorICBUaGlzIHZlcnNpb24gb2YgbWFsbG9jIHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBTVklEL1hQRyBtYWxsaW5mbw0KKyAgcm91dGluZSB0aGF0IHJldHVybnMgYSBzdHJ1Y3QgY29udGFpbmluZyB1c2FnZSBwcm9wZXJ0aWVzIGFuZA0KKyAgc3RhdGlzdGljcy4gSXQgc2hvdWxkIHdvcmsgb24gYW55IHN5c3RlbSB0aGF0IGhhcyBhDQorICAvdXNyL2luY2x1ZGUvbWFsbG9jLmggZGVmaW5pbmcgc3RydWN0IG1hbGxpbmZvLiAgVGhlIG1haW4NCisgIGRlY2xhcmF0aW9uIG5lZWRlZCBpcyB0aGUgbWFsbGluZm8gc3RydWN0IHRoYXQgaXMgcmV0dXJuZWQgKGJ5LWNvcHkpDQorICBieSBtYWxsaW5mbygpLiAgVGhlIG1hbGxvaW5mbyBzdHJ1Y3QgY29udGFpbnMgYSBidW5jaCBvZiBmaWVsZHMgdGhhdA0KKyAgYXJlIG5vdCBldmVuIG1lYW5pbmdmdWwgaW4gdGhpcyB2ZXJzaW9uIG9mIG1hbGxvYy4gIFRoZXNlIGZpZWxkcyBhcmUNCisgIGFyZSBpbnN0ZWFkIGZpbGxlZCBieSBtYWxsaW5mbygpIHdpdGggb3RoZXIgbnVtYmVycyB0aGF0IG1pZ2h0IGJlIG9mDQorICBpbnRlcmVzdC4NCisNCisgIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggc2hvdWxkIGJlIHNldCBpZiB5b3UgaGF2ZSBhDQorICAvdXNyL2luY2x1ZGUvbWFsbG9jLmggZmlsZSB0aGF0IGluY2x1ZGVzIGEgZGVjbGFyYXRpb24gb2Ygc3RydWN0DQorICBtYWxsaW5mby4gIElmIHNvLCBpdCBpcyBpbmNsdWRlZDsgZWxzZSBhIGNvbXBsaWFudCB2ZXJzaW9uIGlzDQorICBkZWNsYXJlZCBiZWxvdy4gIFRoZXNlIG11c3QgYmUgcHJlY2lzZWx5IHRoZSBzYW1lIGZvciBtYWxsaW5mbygpIHRvDQorICB3b3JrLiAgVGhlIG9yaWdpbmFsIFNWSUQgdmVyc2lvbiBvZiB0aGlzIHN0cnVjdCwgZGVmaW5lZCBvbiBtb3N0DQorICBzeXN0ZW1zIHdpdGggbWFsbGluZm8sIGRlY2xhcmVzIGFsbCBmaWVsZHMgYXMgaW50cy4gQnV0IHNvbWUgb3RoZXJzDQorICBkZWZpbmUgYXMgdW5zaWduZWQgbG9uZy4gSWYgeW91ciBzeXN0ZW0gZGVmaW5lcyB0aGUgZmllbGRzIHVzaW5nIGENCisgIHR5cGUgb2YgZGlmZmVyZW50IHdpZHRoIHRoYW4gbGlzdGVkIGhlcmUsIHlvdSBNVVNUICNpbmNsdWRlIHlvdXINCisgIHN5c3RlbSB2ZXJzaW9uIGFuZCAjZGVmaW5lIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0guDQorKi8NCisNCisvKiAjZGVmaW5lIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKi8NCisNCisjaWZkZWYgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSA0KKyNpbmNsdWRlICIvdXNyL2luY2x1ZGUvbWFsbG9jLmgiDQorI2Vsc2UgLyogSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCAqLw0KKyNpZm5kZWYgU1RSVUNUX01BTExJTkZPX0RFQ0xBUkVEDQorI2RlZmluZSBTVFJVQ1RfTUFMTElORk9fREVDTEFSRUQgMQ0KK3N0cnVjdCBtYWxsaW5mbyB7DQorICBNQUxMSU5GT19GSUVMRF9UWVBFIGFyZW5hOyAgICAvKiBub24tbW1hcHBlZCBzcGFjZSBhbGxvY2F0ZWQgZnJvbSBzeXN0ZW0gKi8NCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgb3JkYmxrczsgIC8qIG51bWJlciBvZiBmcmVlIGNodW5rcyAqLw0KKyAgTUFMTElORk9fRklFTERfVFlQRSBzbWJsa3M7ICAgLyogYWx3YXlzIDAgKi8NCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgaGJsa3M7ICAgIC8qIGFsd2F5cyAwICovDQorICBNQUxMSU5GT19GSUVMRF9UWVBFIGhibGtoZDsgICAvKiBzcGFjZSBpbiBtbWFwcGVkIHJlZ2lvbnMgKi8NCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgdXNtYmxrczsgIC8qIG1heGltdW0gdG90YWwgYWxsb2NhdGVkIHNwYWNlICovDQorICBNQUxMSU5GT19GSUVMRF9UWVBFIGZzbWJsa3M7ICAvKiBhbHdheXMgMCAqLw0KKyAgTUFMTElORk9fRklFTERfVFlQRSB1b3JkYmxrczsgLyogdG90YWwgYWxsb2NhdGVkIHNwYWNlICovDQorICBNQUxMSU5GT19GSUVMRF9UWVBFIGZvcmRibGtzOyAvKiB0b3RhbCBmcmVlIHNwYWNlICovDQorICBNQUxMSU5GT19GSUVMRF9UWVBFIGtlZXBjb3N0OyAvKiByZWxlYXNhYmxlICh2aWEgbWFsbG9jX3RyaW0pIHNwYWNlICovDQorfTsNCisjZW5kaWYgLyogU1RSVUNUX01BTExJTkZPX0RFQ0xBUkVEICovDQorI2VuZGlmIC8qIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKi8NCisjZW5kaWYgLyogTk9fTUFMTElORk8gKi8NCisNCisvKg0KKyAgVHJ5IHRvIHBlcnN1YWRlIGNvbXBpbGVycyB0byBpbmxpbmUuIFRoZSBtb3N0IGNyaXRpY2FsIGZ1bmN0aW9ucyBmb3INCisgIGlubGluaW5nIGFyZSBkZWZpbmVkIGFzIG1hY3Jvcywgc28gdGhlc2UgYXJlbid0IHVzZWQgZm9yIHRoZW0uDQorKi8NCisNCisjaWZuZGVmIEZPUkNFSU5MSU5FDQorICAjaWYgZGVmaW5lZChfX0dOVUNfXykNCisjZGVmaW5lIEZPUkNFSU5MSU5FIF9faW5saW5lIF9fYXR0cmlidXRlX18gKChhbHdheXNfaW5saW5lKSkNCisgICNlbGlmIGRlZmluZWQoX01TQ19WRVIpDQorICAgICNkZWZpbmUgRk9SQ0VJTkxJTkUgX19mb3JjZWlubGluZQ0KKyAgI2VuZGlmDQorI2VuZGlmDQorI2lmbmRlZiBOT0lOTElORQ0KKyAgI2lmIGRlZmluZWQoX19HTlVDX18pDQorICAgICNkZWZpbmUgTk9JTkxJTkUgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkNCisgICNlbGlmIGRlZmluZWQoX01TQ19WRVIpDQorICAgICNkZWZpbmUgTk9JTkxJTkUgX19kZWNsc3BlYyhub2lubGluZSkNCisgICNlbHNlDQorICAgICNkZWZpbmUgTk9JTkxJTkUNCisgICNlbmRpZg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNpZm5kZWYgRk9SQ0VJTkxJTkUNCisgI2RlZmluZSBGT1JDRUlOTElORSBpbmxpbmUNCisjZW5kaWYNCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCisjaWZuZGVmIEZPUkNFSU5MSU5FDQorICNkZWZpbmUgRk9SQ0VJTkxJTkUNCisjZW5kaWYNCisNCisjaWYgIU9OTFlfTVNQQUNFUw0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRGVjbGFyYXRpb25zIG9mIHB1YmxpYyByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorI2lmbmRlZiBVU0VfRExfUFJFRklYDQorI2RlZmluZSBkbGNhbGxvYyAgICAgICAgICAgICAgIGNhbGxvYw0KKyNkZWZpbmUgZGxmcmVlICAgICAgICAgICAgICAgICBmcmVlDQorI2RlZmluZSBkbG1hbGxvYyAgICAgICAgICAgICAgIG1hbGxvYw0KKyNkZWZpbmUgZGxtZW1hbGlnbiAgICAgICAgICAgICBtZW1hbGlnbg0KKyNkZWZpbmUgZGxyZWFsbG9jICAgICAgICAgICAgICByZWFsbG9jDQorI2RlZmluZSBkbHZhbGxvYyAgICAgICAgICAgICAgIHZhbGxvYw0KKyNkZWZpbmUgZGxwdmFsbG9jICAgICAgICAgICAgICBwdmFsbG9jDQorI2RlZmluZSBkbG1hbGxpbmZvICAgICAgICAgICAgIG1hbGxpbmZvDQorI2RlZmluZSBkbG1hbGxvcHQgICAgICAgICAgICAgIG1hbGxvcHQNCisjZGVmaW5lIGRsbWFsbG9jX3RyaW0gICAgICAgICAgbWFsbG9jX3RyaW0NCisjZGVmaW5lIGRsbWFsbG9jX3N0YXRzICAgICAgICAgbWFsbG9jX3N0YXRzDQorI2RlZmluZSBkbG1hbGxvY191c2FibGVfc2l6ZSAgIG1hbGxvY191c2FibGVfc2l6ZQ0KKyNkZWZpbmUgZGxtYWxsb2NfZm9vdHByaW50ICAgICBtYWxsb2NfZm9vdHByaW50DQorI2RlZmluZSBkbG1hbGxvY19tYXhfZm9vdHByaW50IG1hbGxvY19tYXhfZm9vdHByaW50DQorI2RlZmluZSBkbGluZGVwZW5kZW50X2NhbGxvYyAgIGluZGVwZW5kZW50X2NhbGxvYw0KKyNkZWZpbmUgZGxpbmRlcGVuZGVudF9jb21hbGxvYyBpbmRlcGVuZGVudF9jb21hbGxvYw0KKyNlbmRpZiAvKiBVU0VfRExfUFJFRklYICovDQorDQorDQorLyoNCisgIG1hbGxvYyhzaXplX3QgbikNCisgIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGNodW5rIG9mIGF0IGxlYXN0IG4gYnl0ZXMsIG9yDQorICBudWxsIGlmIG5vIHNwYWNlIGlzIGF2YWlsYWJsZSwgaW4gd2hpY2ggY2FzZSBlcnJubyBpcyBzZXQgdG8gRU5PTUVNDQorICBvbiBBTlNJIEMgc3lzdGVtcy4NCisNCisgIElmIG4gaXMgemVybywgbWFsbG9jIHJldHVybnMgYSBtaW5pbXVtLXNpemVkIGNodW5rLiAoVGhlIG1pbmltdW0NCisgIHNpemUgaXMgMTYgYnl0ZXMgb24gbW9zdCAzMmJpdCBzeXN0ZW1zLCBhbmQgMzIgYnl0ZXMgb24gNjRiaXQNCisgIHN5c3RlbXMuKSAgTm90ZSB0aGF0IHNpemVfdCBpcyBhbiB1bnNpZ25lZCB0eXBlLCBzbyBjYWxscyB3aXRoDQorICBhcmd1bWVudHMgdGhhdCB3b3VsZCBiZSBuZWdhdGl2ZSBpZiBzaWduZWQgYXJlIGludGVycHJldGVkIGFzDQorICByZXF1ZXN0cyBmb3IgaHVnZSBhbW91bnRzIG9mIHNwYWNlLCB3aGljaCB3aWxsIG9mdGVuIGZhaWwuIFRoZQ0KKyAgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgb2YgbiBkaWZmZXJzIGFjcm9zcyBzeXN0ZW1zLCBidXQgaXMgaW4gYWxsDQorICBjYXNlcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBhIHNpemVfdC4NCisqLw0KK3ZvaWQqIGRsbWFsbG9jKHNpemVfdCk7DQorDQorLyoNCisgIGZyZWUodm9pZCogcCkNCisgIFJlbGVhc2VzIHRoZSBjaHVuayBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBwLCB0aGF0IGhhZCBiZWVuIHByZXZpb3VzbHkNCisgIGFsbG9jYXRlZCB1c2luZyBtYWxsb2Mgb3IgYSByZWxhdGVkIHJvdXRpbmUgc3VjaCBhcyByZWFsbG9jLg0KKyAgSXQgaGFzIG5vIGVmZmVjdCBpZiBwIGlzIG51bGwuIElmIHAgd2FzIG5vdCBtYWxsb2NlZCBvciBhbHJlYWR5DQorICBmcmVlZCwgZnJlZShwKSB3aWxsIGJ5IGRlZmF1bHQgY2F1c2UgdGhlIGN1cnJlbnQgcHJvZ3JhbSB0byBhYm9ydC4NCisqLw0KK3ZvaWQgIGRsZnJlZSh2b2lkKik7DQorDQorLyoNCisgIGNhbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1lbnRfc2l6ZSk7DQorICBSZXR1cm5zIGEgcG9pbnRlciB0byBuX2VsZW1lbnRzICogZWxlbWVudF9zaXplIGJ5dGVzLCB3aXRoIGFsbCBsb2NhdGlvbnMNCisgIHNldCB0byB6ZXJvLg0KKyovDQordm9pZCogZGxjYWxsb2Moc2l6ZV90LCBzaXplX3QpOw0KKw0KKy8qDQorICByZWFsbG9jKHZvaWQqIHAsIHNpemVfdCBuKQ0KKyAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBjaHVuayBvZiBzaXplIG4gdGhhdCBjb250YWlucyB0aGUgc2FtZSBkYXRhDQorICBhcyBkb2VzIGNodW5rIHAgdXAgdG8gdGhlIG1pbmltdW0gb2YgKG4sIHAncyBzaXplKSBieXRlcywgb3IgbnVsbA0KKyAgaWYgbm8gc3BhY2UgaXMgYXZhaWxhYmxlLg0KKw0KKyAgVGhlIHJldHVybmVkIHBvaW50ZXIgbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgcC4gVGhlIGFsZ29yaXRobQ0KKyAgcHJlZmVycyBleHRlbmRpbmcgcCBpbiBtb3N0IGNhc2VzIHdoZW4gcG9zc2libGUsIG90aGVyd2lzZSBpdA0KKyAgZW1wbG95cyB0aGUgZXF1aXZhbGVudCBvZiBhIG1hbGxvYy1jb3B5LWZyZWUgc2VxdWVuY2UuDQorDQorICBJZiBwIGlzIG51bGwsIHJlYWxsb2MgaXMgZXF1aXZhbGVudCB0byBtYWxsb2MuDQorDQorICBJZiBzcGFjZSBpcyBub3QgYXZhaWxhYmxlLCByZWFsbG9jIHJldHVybnMgbnVsbCwgZXJybm8gaXMgc2V0IChpZiBvbg0KKyAgQU5TSSkgYW5kIHAgaXMgTk9UIGZyZWVkLg0KKw0KKyAgaWYgbiBpcyBmb3IgZmV3ZXIgYnl0ZXMgdGhhbiBhbHJlYWR5IGhlbGQgYnkgcCwgdGhlIG5ld2x5IHVudXNlZA0KKyAgc3BhY2UgaXMgbG9wcGVkIG9mZiBhbmQgZnJlZWQgaWYgcG9zc2libGUuICByZWFsbG9jIHdpdGggYSBzaXplDQorICBhcmd1bWVudCBvZiB6ZXJvIChyZSlhbGxvY2F0ZXMgYSBtaW5pbXVtLXNpemVkIGNodW5rLg0KKw0KKyAgVGhlIG9sZCB1bml4IHJlYWxsb2MgY29udmVudGlvbiBvZiBhbGxvd2luZyB0aGUgbGFzdC1mcmVlJ2QgY2h1bmsNCisgIHRvIGJlIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gcmVhbGxvYyBpcyBub3Qgc3VwcG9ydGVkLg0KKyovDQorDQordm9pZCogZGxyZWFsbG9jKHZvaWQqLCBzaXplX3QpOw0KKw0KKy8qDQorICBtZW1hbGlnbihzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgbik7DQorICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBjaHVuayBvZiBuIGJ5dGVzLCBhbGlnbmVkDQorICBpbiBhY2NvcmQgd2l0aCB0aGUgYWxpZ25tZW50IGFyZ3VtZW50Lg0KKw0KKyAgVGhlIGFsaWdubWVudCBhcmd1bWVudCBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28uIElmIHRoZSBhcmd1bWVudCBpcw0KKyAgbm90IGEgcG93ZXIgb2YgdHdvLCB0aGUgbmVhcmVzdCBncmVhdGVyIHBvd2VyIGlzIHVzZWQuDQorICA4LWJ5dGUgYWxpZ25tZW50IGlzIGd1YXJhbnRlZWQgYnkgbm9ybWFsIG1hbGxvYyBjYWxscywgc28gZG9uJ3QNCisgIGJvdGhlciBjYWxsaW5nIG1lbWFsaWduIHdpdGggYW4gYXJndW1lbnQgb2YgOCBvciBsZXNzLg0KKw0KKyAgT3ZlcnJlbGlhbmNlIG9uIG1lbWFsaWduIGlzIGEgc3VyZSB3YXkgdG8gZnJhZ21lbnQgc3BhY2UuDQorKi8NCit2b2lkKiBkbG1lbWFsaWduKHNpemVfdCwgc2l6ZV90KTsNCisNCisvKg0KKyAgdmFsbG9jKHNpemVfdCBuKTsNCisgIEVxdWl2YWxlbnQgdG8gbWVtYWxpZ24ocGFnZXNpemUsIG4pLCB3aGVyZSBwYWdlc2l6ZSBpcyB0aGUgcGFnZQ0KKyAgc2l6ZSBvZiB0aGUgc3lzdGVtLiBJZiB0aGUgcGFnZXNpemUgaXMgdW5rbm93biwgNDA5NiBpcyB1c2VkLg0KKyovDQordm9pZCogZGx2YWxsb2Moc2l6ZV90KTsNCisNCisvKg0KKyAgbWFsbG9wdChpbnQgcGFyYW1ldGVyX251bWJlciwgaW50IHBhcmFtZXRlcl92YWx1ZSkNCisgIFNldHMgdHVuYWJsZSBwYXJhbWV0ZXJzIFRoZSBmb3JtYXQgaXMgdG8gcHJvdmlkZSBhDQorICAocGFyYW1ldGVyLW51bWJlciwgcGFyYW1ldGVyLXZhbHVlKSBwYWlyLiAgbWFsbG9wdCB0aGVuIHNldHMgdGhlDQorICBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0byB0aGUgYXJndW1lbnQgdmFsdWUgaWYgaXQgY2FuIChpLmUuLCBzbw0KKyAgbG9uZyBhcyB0aGUgdmFsdWUgaXMgbWVhbmluZ2Z1bCksIGFuZCByZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBlbHNlDQorICAwLiAgVG8gd29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IG1hbGxvcHQgaXMgc3BlY2lmaWVkIHRvIHVzZSBpbnQsDQorICBub3Qgc2l6ZV90IHBhcmFtZXRlcnMsIHRoZSB2YWx1ZSAtMSBpcyBzcGVjaWFsbHkgdHJlYXRlZCBhcyB0aGUNCisgIG1heGltdW0gdW5zaWduZWQgc2l6ZV90IHZhbHVlLg0KKw0KKyAgU1ZJRC9YUEcvQU5TSSBkZWZpbmVzIGZvdXIgc3RhbmRhcmQgcGFyYW0gbnVtYmVycyBmb3IgbWFsbG9wdCwNCisgIG5vcm1hbGx5IGRlZmluZWQgaW4gbWFsbG9jLmguICBOb25lIG9mIHRoZXNlIGFyZSB1c2UgaW4gdGhpcyBtYWxsb2MsDQorICBzbyBzZXR0aW5nIHRoZW0gaGFzIG5vIGVmZmVjdC4gQnV0IHRoaXMgbWFsbG9jIGFsc28gc3VwcG9ydHMgb3RoZXINCisgIG9wdGlvbnMgaW4gbWFsbG9wdC4gU2VlIGJlbG93IGZvciBkZXRhaWxzLiAgQnJpZWZseSwgc3VwcG9ydGVkDQorICBwYXJhbWV0ZXJzIGFyZSBhcyBmb2xsb3dzIChsaXN0ZWQgZGVmYXVsdHMgYXJlIGZvciAidHlwaWNhbCINCisgIGNvbmZpZ3VyYXRpb25zKS4NCisNCisgIFN5bWJvbCAgICAgICAgICAgIHBhcmFtICMgIGRlZmF1bHQgICAgYWxsb3dlZCBwYXJhbSB2YWx1ZXMNCisgIE1fVFJJTV9USFJFU0hPTEQgICAgIC0xICAgMioxMDI0KjEwMjQgICBhbnkgICAoLTEgZGlzYWJsZXMpDQorICBNX0dSQU5VTEFSSVRZICAgICAgICAtMiAgICAgcGFnZSBzaXplICAgYW55IHBvd2VyIG9mIDIgPj0gcGFnZSBzaXplDQorICBNX01NQVBfVEhSRVNIT0xEICAgICAtMyAgICAgIDI1NioxMDI0ICAgYW55ICAgKG9yIDAgaWYgbm8gTU1BUCBzdXBwb3J0KQ0KKyovDQoraW50IGRsbWFsbG9wdChpbnQsIGludCk7DQorDQorLyoNCisgIG1hbGxvY19mb290cHJpbnQoKTsNCisgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvYnRhaW5lZCBmcm9tIHRoZSBzeXN0ZW0uICBUaGUgdG90YWwNCisgIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgYnkgbWFsbG9jLCByZWFsbG9jIGV0Yy4sIGlzIGxlc3MgdGhhbiB0aGlzDQorICB2YWx1ZS4gVW5saWtlIG1hbGxpbmZvLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgb25seSBhIHByZWNvbXB1dGVkDQorICByZXN1bHQsIHNvIGNhbiBiZSBjYWxsZWQgZnJlcXVlbnRseSB0byBtb25pdG9yIG1lbW9yeSBjb25zdW1wdGlvbi4NCisgIEV2ZW4gaWYgbG9ja3MgYXJlIG90aGVyd2lzZSBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSB0aGVtLA0KKyAgc28gcmVzdWx0cyBtaWdodCBub3QgYmUgdXAgdG8gZGF0ZS4NCisqLw0KK3NpemVfdCBkbG1hbGxvY19mb290cHJpbnQodm9pZCk7DQorDQorLyoNCisgIG1hbGxvY19tYXhfZm9vdHByaW50KCk7DQorICBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvYnRhaW5lZCBmcm9tIHRoZSBzeXN0ZW0uIFRoaXMNCisgIHZhbHVlIHdpbGwgYmUgZ3JlYXRlciB0aGFuIGN1cnJlbnQgZm9vdHByaW50IGlmIGRlYWxsb2NhdGVkIHNwYWNlDQorICBoYXMgYmVlbiByZWNsYWltZWQgYnkgdGhlIHN5c3RlbS4gVGhlIHBlYWsgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZA0KKyAgYnkgbWFsbG9jLCByZWFsbG9jIGV0Yy4sIGlzIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBVbmxpa2UgbWFsbGluZm8sDQorICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgb25seSBhIHByZWNvbXB1dGVkIHJlc3VsdCwgc28gY2FuIGJlIGNhbGxlZA0KKyAgZnJlcXVlbnRseSB0byBtb25pdG9yIG1lbW9yeSBjb25zdW1wdGlvbi4gIEV2ZW4gaWYgbG9ja3MgYXJlDQorICBvdGhlcndpc2UgZGVmaW5lZCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgdGhlbSwgc28gcmVzdWx0cyBtaWdodA0KKyAgbm90IGJlIHVwIHRvIGRhdGUuDQorKi8NCitzaXplX3QgZGxtYWxsb2NfbWF4X2Zvb3RwcmludCh2b2lkKTsNCisNCisjaWYgIU5PX01BTExJTkZPDQorLyoNCisgIG1hbGxpbmZvKCkNCisgIFJldHVybnMgKGJ5IGNvcHkpIGEgc3RydWN0IGNvbnRhaW5pbmcgdmFyaW91cyBzdW1tYXJ5IHN0YXRpc3RpY3M6DQorDQorICBhcmVuYTogICAgIGN1cnJlbnQgdG90YWwgbm9uLW1tYXBwZWQgYnl0ZXMgYWxsb2NhdGVkIGZyb20gc3lzdGVtDQorICBvcmRibGtzOiAgIHRoZSBudW1iZXIgb2YgZnJlZSBjaHVua3MNCisgIHNtYmxrczogICAgYWx3YXlzIHplcm8uDQorICBoYmxrczogICAgIGN1cnJlbnQgbnVtYmVyIG9mIG1tYXBwZWQgcmVnaW9ucw0KKyAgaGJsa2hkOiAgICB0b3RhbCBieXRlcyBoZWxkIGluIG1tYXBwZWQgcmVnaW9ucw0KKyAgdXNtYmxrczogICB0aGUgbWF4aW11bSB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UuIFRoaXMgd2lsbCBiZSBncmVhdGVyDQorICAgICAgICAgICAgICAgIHRoYW4gY3VycmVudCB0b3RhbCBpZiB0cmltbWluZyBoYXMgb2NjdXJyZWQuDQorICBmc21ibGtzOiAgIGFsd2F5cyB6ZXJvDQorICB1b3JkYmxrczogIGN1cnJlbnQgdG90YWwgYWxsb2NhdGVkIHNwYWNlIChub3JtYWwgb3IgbW1hcHBlZCkNCisgIGZvcmRibGtzOiAgdG90YWwgZnJlZSBzcGFjZQ0KKyAga2VlcGNvc3Q6ICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBpZGVhbGx5IGJlIHJlbGVhc2VkDQorICAgICAgICAgICAgICAgYmFjayB0byBzeXN0ZW0gdmlhIG1hbGxvY190cmltLiAoImlkZWFsbHkiIG1lYW5zIHRoYXQNCisgICAgICAgICAgICAgICBpdCBpZ25vcmVzIHBhZ2UgcmVzdHJpY3Rpb25zIGV0Yy4pDQorDQorICBCZWNhdXNlIHRoZXNlIGZpZWxkcyBhcmUgaW50cywgYnV0IGludGVybmFsIGJvb2trZWVwaW5nIG1heQ0KKyAgYmUga2VwdCBhcyBsb25ncywgdGhlIHJlcG9ydGVkIHZhbHVlcyBtYXkgd3JhcCBhcm91bmQgemVybyBhbmQNCisgIHRodXMgYmUgaW5hY2N1cmF0ZS4NCisqLw0KK3N0cnVjdCBtYWxsaW5mbyBkbG1hbGxpbmZvKHZvaWQpOw0KKyNlbmRpZiAvKiBOT19NQUxMSU5GTyAqLw0KKw0KKy8qDQorICBpbmRlcGVuZGVudF9jYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUsIHZvaWQqIGNodW5rc1tdKTsNCisNCisgIGluZGVwZW5kZW50X2NhbGxvYyBpcyBzaW1pbGFyIHRvIGNhbGxvYywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGENCisgIHNpbmdsZSBjbGVhcmVkIHNwYWNlLCBpdCByZXR1cm5zIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIG5fZWxlbWVudHMNCisgIGluZGVwZW5kZW50IGVsZW1lbnRzIHRoYXQgY2FuIGhvbGQgY29udGVudHMgb2Ygc2l6ZSBlbGVtX3NpemUsIGVhY2gNCisgIG9mIHdoaWNoIHN0YXJ0cyBvdXQgY2xlYXJlZCwgYW5kIGNhbiBiZSBpbmRlcGVuZGVudGx5IGZyZWVkLA0KKyAgcmVhbGxvYydlZCBldGMuIFRoZSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBhZGphY2VudGx5DQorICBhbGxvY2F0ZWQgKHRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCBtdWx0aXBsZSBjYWxsb2NzIG9yDQorICBtYWxsb2NzKSwgd2hpY2ggbWF5IGFsc28gaW1wcm92ZSBjYWNoZSBsb2NhbGl0eSBpbiBzb21lDQorICBhcHBsaWNhdGlvbnMuDQorDQorICBUaGUgImNodW5rcyIgYXJndW1lbnQgaXMgb3B0aW9uYWwgKGkuZS4sIG1heSBiZSBudWxsLCB3aGljaCBpcw0KKyAgcHJvYmFibHkgdGhlIG1vc3QgdHlwaWNhbCB1c2FnZSkuIElmIGl0IGlzIG51bGwsIHRoZSByZXR1cm5lZCBhcnJheQ0KKyAgaXMgaXRzZWxmIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgc2hvdWxkIGFsc28gYmUgZnJlZWQgd2hlbiBpdCBpcw0KKyAgbm8gbG9uZ2VyIG5lZWRlZC4gT3RoZXJ3aXNlLCB0aGUgY2h1bmtzIGFycmF5IG11c3QgYmUgb2YgYXQgbGVhc3QNCisgIG5fZWxlbWVudHMgaW4gbGVuZ3RoLiBJdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgcG9pbnRlcnMgdG8gdGhlDQorICBjaHVua3MuDQorDQorICBJbiBlaXRoZXIgY2FzZSwgaW5kZXBlbmRlbnRfY2FsbG9jIHJldHVybnMgdGhpcyBwb2ludGVyIGFycmF5LCBvcg0KKyAgbnVsbCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQuICBJZiBuX2VsZW1lbnRzIGlzIHplcm8gYW5kICJjaHVua3MiDQorICBpcyBudWxsLCBpdCByZXR1cm5zIGEgY2h1bmsgcmVwcmVzZW50aW5nIGFuIGFycmF5IHdpdGggemVybyBlbGVtZW50cw0KKyAgKHdoaWNoIHNob3VsZCBiZSBmcmVlZCBpZiBub3Qgd2FudGVkKS4NCisNCisgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGluZGl2aWR1YWxseSBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlcg0KKyAgbmVlZGVkLiBJZiB5b3UnZCBsaWtlIHRvIGluc3RlYWQgYmUgYWJsZSB0byBmcmVlIGFsbCBhdCBvbmNlLCB5b3UNCisgIHNob3VsZCBpbnN0ZWFkIHVzZSByZWd1bGFyIGNhbGxvYyBhbmQgYXNzaWduIHBvaW50ZXJzIGludG8gdGhpcw0KKyAgc3BhY2UgdG8gcmVwcmVzZW50IGVsZW1lbnRzLiAgKEluIHRoaXMgY2FzZSB0aG91Z2gsIHlvdSBjYW5ub3QNCisgIGluZGVwZW5kZW50bHkgZnJlZSBlbGVtZW50cy4pDQorDQorICBpbmRlcGVuZGVudF9jYWxsb2Mgc2ltcGxpZmllcyBhbmQgc3BlZWRzIHVwIGltcGxlbWVudGF0aW9ucyBvZiBtYW55DQorICBraW5kcyBvZiBwb29scy4gIEl0IG1heSBhbHNvIGJlIHVzZWZ1bCB3aGVuIGNvbnN0cnVjdGluZyBsYXJnZSBkYXRhDQorICBzdHJ1Y3R1cmVzIHRoYXQgaW5pdGlhbGx5IGhhdmUgYSBmaXhlZCBudW1iZXIgb2YgZml4ZWQtc2l6ZWQgbm9kZXMsDQorICBidXQgdGhlIG51bWJlciBpcyBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLCBhbmQgc29tZSBvZiB0aGUgbm9kZXMNCisgIG1heSBsYXRlciBuZWVkIHRvIGJlIGZyZWVkLiBGb3IgZXhhbXBsZToNCisNCisgIHN0cnVjdCBOb2RlIHsgaW50IGl0ZW07IHN0cnVjdCBOb2RlKiBuZXh0OyB9Ow0KKw0KKyAgc3RydWN0IE5vZGUqIGJ1aWxkX2xpc3QoKSB7DQorICAgIHN0cnVjdCBOb2RlKiogcG9vbDsNCisgICAgaW50IG4gPSByZWFkX251bWJlcl9vZl9ub2Rlc19uZWVkZWQoKTsNCisgICAgaWYgKG4gPD0gMCkgcmV0dXJuIDA7DQorICAgIHBvb2wgPSAoc3RydWN0IE5vZGUqKikoaW5kZXBlbmRlbnRfY2FsbG9jKG4sIHNpemVvZihzdHJ1Y3QgTm9kZSksIDApOw0KKyAgICBpZiAocG9vbCA9PSAwKSBkaWUoKTsNCisgICAgLy8gb3JnYW5pemUgaW50byBhIGxpbmtlZCBsaXN0Li4uDQorICAgIHN0cnVjdCBOb2RlKiBmaXJzdCA9IHBvb2xbMF07DQorICAgIGZvciAoaSA9IDA7IGkgPCBuLTE7ICsraSkNCisgICAgICBwb29sW2ldLT5uZXh0ID0gcG9vbFtpKzFdOw0KKyAgICBmcmVlKHBvb2wpOyAgICAgLy8gQ2FuIG5vdyBmcmVlIHRoZSBhcnJheSAob3Igbm90LCBpZiBpdCBpcyBuZWVkZWQgbGF0ZXIpDQorICAgIHJldHVybiBmaXJzdDsNCisgIH0NCisqLw0KK3ZvaWQqKiBkbGluZGVwZW5kZW50X2NhbGxvYyhzaXplX3QsIHNpemVfdCwgdm9pZCoqKTsNCisNCisvKg0KKyAgaW5kZXBlbmRlbnRfY29tYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBzaXplc1tdLCB2b2lkKiBjaHVua3NbXSk7DQorDQorICBpbmRlcGVuZGVudF9jb21hbGxvYyBhbGxvY2F0ZXMsIGFsbCBhdCBvbmNlLCBhIHNldCBvZiBuX2VsZW1lbnRzDQorICBjaHVua3Mgd2l0aCBzaXplcyBpbmRpY2F0ZWQgaW4gdGhlICJzaXplcyIgYXJyYXkuICAgIEl0IHJldHVybnMNCisgIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHRoZXNlIGVsZW1lbnRzLCBlYWNoIG9mIHdoaWNoIGNhbiBiZQ0KKyAgaW5kZXBlbmRlbnRseSBmcmVlZCwgcmVhbGxvYydlZCBldGMuIFRoZSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZCB0bw0KKyAgYmUgYWRqYWNlbnRseSBhbGxvY2F0ZWQgKHRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aA0KKyAgbXVsdGlwbGUgY2FsbG9jcyBvciBtYWxsb2NzKSwgd2hpY2ggbWF5IGFsc28gaW1wcm92ZSBjYWNoZSBsb2NhbGl0eQ0KKyAgaW4gc29tZSBhcHBsaWNhdGlvbnMuDQorDQorICBUaGUgImNodW5rcyIgYXJndW1lbnQgaXMgb3B0aW9uYWwgKGkuZS4sIG1heSBiZSBudWxsKS4gSWYgaXQgaXMgbnVsbA0KKyAgdGhlIHJldHVybmVkIGFycmF5IGlzIGl0c2VsZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIHNob3VsZCBhbHNvDQorICBiZSBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuIE90aGVyd2lzZSwgdGhlIGNodW5rcyBhcnJheQ0KKyAgbXVzdCBiZSBvZiBhdCBsZWFzdCBuX2VsZW1lbnRzIGluIGxlbmd0aC4gSXQgaXMgZmlsbGVkIGluIHdpdGggdGhlDQorICBwb2ludGVycyB0byB0aGUgY2h1bmtzLg0KKw0KKyAgSW4gZWl0aGVyIGNhc2UsIGluZGVwZW5kZW50X2NvbWFsbG9jIHJldHVybnMgdGhpcyBwb2ludGVyIGFycmF5LCBvcg0KKyAgbnVsbCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQuICBJZiBuX2VsZW1lbnRzIGlzIHplcm8gYW5kIGNodW5rcyBpcw0KKyAgbnVsbCwgaXQgcmV0dXJucyBhIGNodW5rIHJlcHJlc2VudGluZyBhbiBhcnJheSB3aXRoIHplcm8gZWxlbWVudHMNCisgICh3aGljaCBzaG91bGQgYmUgZnJlZWQgaWYgbm90IHdhbnRlZCkuDQorDQorICBFYWNoIGVsZW1lbnQgbXVzdCBiZSBpbmRpdmlkdWFsbHkgZnJlZWQgd2hlbiBpdCBpcyBubyBsb25nZXINCisgIG5lZWRlZC4gSWYgeW91J2QgbGlrZSB0byBpbnN0ZWFkIGJlIGFibGUgdG8gZnJlZSBhbGwgYXQgb25jZSwgeW91DQorICBzaG91bGQgaW5zdGVhZCB1c2UgYSBzaW5nbGUgcmVndWxhciBtYWxsb2MsIGFuZCBhc3NpZ24gcG9pbnRlcnMgYXQNCisgIHBhcnRpY3VsYXIgb2Zmc2V0cyBpbiB0aGUgYWdncmVnYXRlIHNwYWNlLiAoSW4gdGhpcyBjYXNlIHRob3VnaCwgeW91DQorICBjYW5ub3QgaW5kZXBlbmRlbnRseSBmcmVlIGVsZW1lbnRzLikNCisNCisgIGluZGVwZW5kZW50X2NvbWFsbGFjIGRpZmZlcnMgZnJvbSBpbmRlcGVuZGVudF9jYWxsb2MgaW4gdGhhdCBlYWNoDQorICBlbGVtZW50IG1heSBoYXZlIGEgZGlmZmVyZW50IHNpemUsIGFuZCBhbHNvIHRoYXQgaXQgZG9lcyBub3QNCisgIGF1dG9tYXRpY2FsbHkgY2xlYXIgZWxlbWVudHMuDQorDQorICBpbmRlcGVuZGVudF9jb21hbGxvYyBjYW4gYmUgdXNlZCB0byBzcGVlZCB1cCBhbGxvY2F0aW9uIGluIGNhc2VzDQorICB3aGVyZSBzZXZlcmFsIHN0cnVjdHMgb3Igb2JqZWN0cyBtdXN0IGFsd2F5cyBiZSBhbGxvY2F0ZWQgYXQgdGhlDQorICBzYW1lIHRpbWUuICBGb3IgZXhhbXBsZToNCisNCisgIHN0cnVjdCBIZWFkIHsgLi4uIH0NCisgIHN0cnVjdCBGb290IHsgLi4uIH0NCisNCisgIHZvaWQgc2VuZF9tZXNzYWdlKGNoYXIqIG1zZykgew0KKyAgICBpbnQgbXNnbGVuID0gc3RybGVuKG1zZyk7DQorICAgIHNpemVfdCBzaXplc1szXSA9IHsgc2l6ZW9mKHN0cnVjdCBIZWFkKSwgbXNnbGVuLCBzaXplb2Yoc3RydWN0IEZvb3QpIH07DQorICAgIHZvaWQqIGNodW5rc1szXTsNCisgICAgaWYgKGluZGVwZW5kZW50X2NvbWFsbG9jKDMsIHNpemVzLCBjaHVua3MpID09IDApDQorICAgICAgZGllKCk7DQorICAgIHN0cnVjdCBIZWFkKiBoZWFkID0gKHN0cnVjdCBIZWFkKikoY2h1bmtzWzBdKTsNCisgICAgY2hhciogICAgICAgIGJvZHkgPSAoY2hhciopKGNodW5rc1sxXSk7DQorICAgIHN0cnVjdCBGb290KiBmb290ID0gKHN0cnVjdCBGb290KikoY2h1bmtzWzJdKTsNCisgICAgLy8gLi4uDQorICB9DQorDQorICBJbiBnZW5lcmFsIHRob3VnaCwgaW5kZXBlbmRlbnRfY29tYWxsb2MgaXMgd29ydGggdXNpbmcgb25seSBmb3INCisgIGxhcmdlciB2YWx1ZXMgb2Ygbl9lbGVtZW50cy4gRm9yIHNtYWxsIHZhbHVlcywgeW91IHByb2JhYmx5IHdvbid0DQorICBkZXRlY3QgZW5vdWdoIGRpZmZlcmVuY2UgZnJvbSBzZXJpZXMgb2YgbWFsbG9jIGNhbGxzIHRvIGJvdGhlci4NCisNCisgIE92ZXJ1c2Ugb2YgaW5kZXBlbmRlbnRfY29tYWxsb2MgY2FuIGluY3JlYXNlIG92ZXJhbGwgbWVtb3J5IHVzYWdlLA0KKyAgc2luY2UgaXQgY2Fubm90IHJldXNlIGV4aXN0aW5nIG5vbmNvbnRpZ3VvdXMgc21hbGwgY2h1bmtzIHRoYXQNCisgIG1pZ2h0IGJlIGF2YWlsYWJsZSBmb3Igc29tZSBvZiB0aGUgZWxlbWVudHMuDQorKi8NCit2b2lkKiogZGxpbmRlcGVuZGVudF9jb21hbGxvYyhzaXplX3QsIHNpemVfdCosIHZvaWQqKik7DQorDQorDQorLyoNCisgIHB2YWxsb2Moc2l6ZV90IG4pOw0KKyAgRXF1aXZhbGVudCB0byB2YWxsb2MobWluaW11bS1wYWdlLXRoYXQtaG9sZHMobikpLCB0aGF0IGlzLA0KKyAgcm91bmQgdXAgbiB0byBuZWFyZXN0IHBhZ2VzaXplLg0KKyAqLw0KK3ZvaWQqICBkbHB2YWxsb2Moc2l6ZV90KTsNCisNCisvKg0KKyAgbWFsbG9jX3RyaW0oc2l6ZV90IHBhZCk7DQorDQorICBJZiBwb3NzaWJsZSwgZ2l2ZXMgbWVtb3J5IGJhY2sgdG8gdGhlIHN5c3RlbSAodmlhIG5lZ2F0aXZlIGFyZ3VtZW50cw0KKyAgdG8gc2JyaykgaWYgdGhlcmUgaXMgdW51c2VkIG1lbW9yeSBhdCB0aGUgYGhpZ2gnIGVuZCBvZiB0aGUgbWFsbG9jDQorICBwb29sIG9yIGluIHVudXNlZCBNTUFQIHNlZ21lbnRzLiBZb3UgY2FuIGNhbGwgdGhpcyBhZnRlciBmcmVlaW5nDQorICBsYXJnZSBibG9ja3Mgb2YgbWVtb3J5IHRvIHBvdGVudGlhbGx5IHJlZHVjZSB0aGUgc3lzdGVtLWxldmVsIG1lbW9yeQ0KKyAgcmVxdWlyZW1lbnRzIG9mIGEgcHJvZ3JhbS4gSG93ZXZlciwgaXQgY2Fubm90IGd1YXJhbnRlZSB0byByZWR1Y2UNCisgIG1lbW9yeS4gVW5kZXIgc29tZSBhbGxvY2F0aW9uIHBhdHRlcm5zLCBzb21lIGxhcmdlIGZyZWUgYmxvY2tzIG9mDQorICBtZW1vcnkgd2lsbCBiZSBsb2NrZWQgYmV0d2VlbiB0d28gdXNlZCBjaHVua3MsIHNvIHRoZXkgY2Fubm90IGJlDQorICBnaXZlbiBiYWNrIHRvIHRoZSBzeXN0ZW0uDQorDQorICBUaGUgYHBhZCcgYXJndW1lbnQgdG8gbWFsbG9jX3RyaW0gcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIGZyZWUNCisgIHRyYWlsaW5nIHNwYWNlIHRvIGxlYXZlIHVudHJpbW1lZC4gSWYgdGhpcyBhcmd1bWVudCBpcyB6ZXJvLCBvbmx5DQorICB0aGUgbWluaW11bSBhbW91bnQgb2YgbWVtb3J5IHRvIG1haW50YWluIGludGVybmFsIGRhdGEgc3RydWN0dXJlcw0KKyAgd2lsbCBiZSBsZWZ0LiBOb24temVybyBhcmd1bWVudHMgY2FuIGJlIHN1cHBsaWVkIHRvIG1haW50YWluIGVub3VnaA0KKyAgdHJhaWxpbmcgc3BhY2UgdG8gc2VydmljZSBmdXR1cmUgZXhwZWN0ZWQgYWxsb2NhdGlvbnMgd2l0aG91dCBoYXZpbmcNCisgIHRvIHJlLW9idGFpbiBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtLg0KKw0KKyAgTWFsbG9jX3RyaW0gcmV0dXJucyAxIGlmIGl0IGFjdHVhbGx5IHJlbGVhc2VkIGFueSBtZW1vcnksIGVsc2UgMC4NCisqLw0KK2ludCAgZGxtYWxsb2NfdHJpbShzaXplX3QpOw0KKw0KKy8qDQorICBtYWxsb2Nfc3RhdHMoKTsNCisgIFByaW50cyBvbiBzdGRlcnIgdGhlIGFtb3VudCBvZiBzcGFjZSBvYnRhaW5lZCBmcm9tIHRoZSBzeXN0ZW0gKGJvdGgNCisgIHZpYSBzYnJrIGFuZCBtbWFwKSwgdGhlIG1heGltdW0gYW1vdW50ICh3aGljaCBtYXkgYmUgbW9yZSB0aGFuDQorICBjdXJyZW50IGlmIG1hbGxvY190cmltIGFuZC9vciBtdW5tYXAgZ290IGNhbGxlZCksIGFuZCB0aGUgY3VycmVudA0KKyAgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCB2aWEgbWFsbG9jIChvciByZWFsbG9jLCBldGMpIGJ1dCBub3QgeWV0DQorICBmcmVlZC4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQsIG5vdCB0aGUNCisgIG51bWJlciByZXF1ZXN0ZWQuIEl0IHdpbGwgYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciByZXF1ZXN0ZWQNCisgIGJlY2F1c2Ugb2YgYWxpZ25tZW50IGFuZCBib29ra2VlcGluZyBvdmVyaGVhZC4gQmVjYXVzZSBpdCBpbmNsdWRlcw0KKyAgYWxpZ25tZW50IHdhc3RhZ2UgYXMgYmVpbmcgaW4gdXNlLCB0aGlzIGZpZ3VyZSBtYXkgYmUgZ3JlYXRlciB0aGFuDQorICB6ZXJvIGV2ZW4gd2hlbiBubyB1c2VyLWxldmVsIGNodW5rcyBhcmUgYWxsb2NhdGVkLg0KKw0KKyAgVGhlIHJlcG9ydGVkIGN1cnJlbnQgYW5kIG1heGltdW0gc3lzdGVtIG1lbW9yeSBjYW4gYmUgaW5hY2N1cmF0ZSBpZg0KKyAgYSBwcm9ncmFtIG1ha2VzIG90aGVyIGNhbGxzIHRvIHN5c3RlbSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMNCisgIChub3JtYWxseSBzYnJrKSBvdXRzaWRlIG9mIG1hbGxvYy4NCisNCisgIG1hbGxvY19zdGF0cyBwcmludHMgb25seSB0aGUgbW9zdCBjb21tb25seSBpbnRlcmVzdGluZyBzdGF0aXN0aWNzLg0KKyAgTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyBtYWxsaW5mby4NCisqLw0KK3ZvaWQgIGRsbWFsbG9jX3N0YXRzKHZvaWQpOw0KKw0KKyNlbmRpZiAvKiBPTkxZX01TUEFDRVMgKi8NCisNCisvKg0KKyAgbWFsbG9jX3VzYWJsZV9zaXplKHZvaWQqIHApOw0KKw0KKyAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHlvdSBjYW4gYWN0dWFsbHkgdXNlIGluDQorICBhbiBhbGxvY2F0ZWQgY2h1bmssIHdoaWNoIG1heSBiZSBtb3JlIHRoYW4geW91IHJlcXVlc3RlZCAoYWx0aG91Z2gNCisgIG9mdGVuIG5vdCkgZHVlIHRvIGFsaWdubWVudCBhbmQgbWluaW11bSBzaXplIGNvbnN0cmFpbnRzLg0KKyAgWW91IGNhbiB1c2UgdGhpcyBtYW55IGJ5dGVzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQNCisgIG92ZXJ3cml0aW5nIG90aGVyIGFsbG9jYXRlZCBvYmplY3RzLiBUaGlzIGlzIG5vdCBhIHBhcnRpY3VsYXJseSBncmVhdA0KKyAgcHJvZ3JhbW1pbmcgcHJhY3RpY2UuIG1hbGxvY191c2FibGVfc2l6ZSBjYW4gYmUgbW9yZSB1c2VmdWwgaW4NCisgIGRlYnVnZ2luZyBhbmQgYXNzZXJ0aW9ucywgZm9yIGV4YW1wbGU6DQorDQorICBwID0gbWFsbG9jKG4pOw0KKyAgYXNzZXJ0KG1hbGxvY191c2FibGVfc2l6ZShwKSA+PSAyNTYpOw0KKyovDQorc2l6ZV90IGRsbWFsbG9jX3VzYWJsZV9zaXplKHZvaWQqKTsNCisNCisNCisjaWYgTVNQQUNFUw0KKw0KKy8qDQorICBtc3BhY2UgaXMgYW4gb3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGFuIGluZGVwZW5kZW50DQorICByZWdpb24gb2Ygc3BhY2UgdGhhdCBzdXBwb3J0cyBtc3BhY2VfbWFsbG9jLCBldGMuDQorKi8NCit0eXBlZGVmIHZvaWQqIG1zcGFjZTsNCisNCisvKg0KKyAgY3JlYXRlX21zcGFjZSBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGluZGVwZW5kZW50IHNwYWNlIHdpdGggdGhlDQorICBnaXZlbiBpbml0aWFsIGNhcGFjaXR5LCBvciwgaWYgMCwgdGhlIGRlZmF1bHQgZ3JhbnVsYXJpdHkgc2l6ZS4gIEl0DQorICByZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3lzdGVtIG1lbW9yeSBhdmFpbGFibGUgdG8gY3JlYXRlIHRoZQ0KKyAgc3BhY2UuICBJZiBhcmd1bWVudCBsb2NrZWQgaXMgbm9uLXplcm8sIHRoZSBzcGFjZSB1c2VzIGEgc2VwYXJhdGUNCisgIGxvY2sgdG8gY29udHJvbCBhY2Nlc3MuIFRoZSBjYXBhY2l0eSBvZiB0aGUgc3BhY2Ugd2lsbCBncm93DQorICBkeW5hbWljYWxseSBhcyBuZWVkZWQgdG8gc2VydmljZSBtc3BhY2VfbWFsbG9jIHJlcXVlc3RzLiAgWW91IGNhbg0KKyAgY29udHJvbCB0aGUgc2l6ZXMgb2YgaW5jcmVtZW50YWwgaW5jcmVhc2VzIG9mIHRoaXMgc3BhY2UgYnkNCisgIGNvbXBpbGluZyB3aXRoIGEgZGlmZmVyZW50IERFRkFVTFRfR1JBTlVMQVJJVFkgb3IgZHluYW1pY2FsbHkNCisgIHNldHRpbmcgd2l0aCBtYWxsb3B0KE1fR1JBTlVMQVJJVFksIHZhbHVlKS4NCisqLw0KK21zcGFjZSBjcmVhdGVfbXNwYWNlKHNpemVfdCBjYXBhY2l0eSwgaW50IGxvY2tlZCk7DQorDQorLyoNCisgIGRlc3Ryb3lfbXNwYWNlIGRlc3Ryb3lzIHRoZSBnaXZlbiBzcGFjZSwgYW5kIGF0dGVtcHRzIHRvIHJldHVybiBhbGwNCisgIG9mIGl0cyBtZW1vcnkgYmFjayB0byB0aGUgc3lzdGVtLCByZXR1cm5pbmcgdGhlIHRvdGFsIG51bWJlciBvZg0KKyAgYnl0ZXMgZnJlZWQuIEFmdGVyIGRlc3RydWN0aW9uLCB0aGUgcmVzdWx0cyBvZiBhY2Nlc3MgdG8gYWxsIG1lbW9yeQ0KKyAgdXNlZCBieSB0aGUgc3BhY2UgYmVjb21lIHVuZGVmaW5lZC4NCisqLw0KK3NpemVfdCBkZXN0cm95X21zcGFjZShtc3BhY2UgbXNwKTsNCisNCisvKg0KKyAgY3JlYXRlX21zcGFjZV93aXRoX2Jhc2UgdXNlcyB0aGUgbWVtb3J5IHN1cHBsaWVkIGFzIHRoZSBpbml0aWFsIGJhc2UNCisgIG9mIGEgbmV3IG1zcGFjZS4gUGFydCAobGVzcyB0aGFuIDEyOCpzaXplb2Yoc2l6ZV90KSBieXRlcykgb2YgdGhpcw0KKyAgc3BhY2UgaXMgdXNlZCBmb3IgYm9va2tlZXBpbmcsIHNvIHRoZSBjYXBhY2l0eSBtdXN0IGJlIGF0IGxlYXN0IHRoaXMNCisgIGxhcmdlLiAoT3RoZXJ3aXNlIDAgaXMgcmV0dXJuZWQuKSBXaGVuIHRoaXMgaW5pdGlhbCBzcGFjZSBpcw0KKyAgZXhoYXVzdGVkLCBhZGRpdGlvbmFsIG1lbW9yeSB3aWxsIGJlIG9idGFpbmVkIGZyb20gdGhlIHN5c3RlbS4NCisgIERlc3Ryb3lpbmcgdGhpcyBzcGFjZSB3aWxsIGRlYWxsb2NhdGUgYWxsIGFkZGl0aW9uYWxseSBhbGxvY2F0ZWQNCisgIHNwYWNlIChpZiBwb3NzaWJsZSkgYnV0IG5vdCB0aGUgaW5pdGlhbCBiYXNlLg0KKyovDQorbXNwYWNlIGNyZWF0ZV9tc3BhY2Vfd2l0aF9iYXNlKHZvaWQqIGJhc2UsIHNpemVfdCBjYXBhY2l0eSwgaW50IGxvY2tlZCk7DQorDQorLyoNCisgIG1zcGFjZV90cmFja19sYXJnZV9jaHVua3MgY29udHJvbHMgd2hldGhlciByZXF1ZXN0cyBmb3IgbGFyZ2UgY2h1bmtzDQorICBhcmUgYWxsb2NhdGVkIGluIHRoZWlyIG93biB1bnRyYWNrZWQgbW1hcHBlZCByZWdpb25zLCBzZXBhcmF0ZSBmcm9tDQorICBvdGhlcnMgaW4gdGhpcyBtc3BhY2UuIEJ5IGRlZmF1bHQgbGFyZ2UgY2h1bmtzIGFyZSBub3QgdHJhY2tlZCwNCisgIHdoaWNoIHJlZHVjZXMgZnJhZ21lbnRhdGlvbi4gSG93ZXZlciwgc3VjaCBjaHVua3MgYXJlIG5vdA0KKyAgbmVjZXNzYXJpbHkgcmVsZWFzZWQgdG8gdGhlIHN5c3RlbSB1cG9uIGRlc3Ryb3lfbXNwYWNlLiAgRW5hYmxpbmcNCisgIHRyYWNraW5nIGJ5IHNldHRpbmcgdG8gdHJ1ZSBtYXkgaW5jcmVhc2UgZnJhZ21lbnRhdGlvbiwgYnV0IGF2b2lkcw0KKyAgbGVha2FnZSB3aGVuIHJlbHlpbmcgb24gZGVzdHJveV9tc3BhY2UgdG8gcmVsZWFzZSBhbGwgbWVtb3J5DQorICBhbGxvY2F0ZWQgdXNpbmcgdGhpcyBzcGFjZS4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBwcmV2aW91cw0KKyAgc2V0dGluZy4NCisqLw0KK2ludCBtc3BhY2VfdHJhY2tfbGFyZ2VfY2h1bmtzKG1zcGFjZSBtc3AsIGludCBlbmFibGUpOw0KKw0KKw0KKy8qDQorICBtc3BhY2VfbWFsbG9jIGJlaGF2ZXMgYXMgbWFsbG9jLCBidXQgb3BlcmF0ZXMgd2l0aGluDQorICB0aGUgZ2l2ZW4gc3BhY2UuDQorKi8NCit2b2lkKiBtc3BhY2VfbWFsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBieXRlcyk7DQorDQorLyoNCisgIG1zcGFjZV9mcmVlIGJlaGF2ZXMgYXMgZnJlZSwgYnV0IG9wZXJhdGVzIHdpdGhpbg0KKyAgdGhlIGdpdmVuIHNwYWNlLg0KKw0KKyAgSWYgY29tcGlsZWQgd2l0aCBGT09URVJTPT0xLCBtc3BhY2VfZnJlZSBpcyBub3QgYWN0dWFsbHkgbmVlZGVkLg0KKyAgZnJlZSBtYXkgYmUgY2FsbGVkIGluc3RlYWQgb2YgbXNwYWNlX2ZyZWUgYmVjYXVzZSBmcmVlZCBjaHVua3MgZnJvbQ0KKyAgYW55IHNwYWNlIGFyZSBoYW5kbGVkIGJ5IHRoZWlyIG9yaWdpbmF0aW5nIHNwYWNlcy4NCisqLw0KK3ZvaWQgbXNwYWNlX2ZyZWUobXNwYWNlIG1zcCwgdm9pZCogbWVtKTsNCisNCisvKg0KKyAgbXNwYWNlX3JlYWxsb2MgYmVoYXZlcyBhcyByZWFsbG9jLCBidXQgb3BlcmF0ZXMgd2l0aGluDQorICB0aGUgZ2l2ZW4gc3BhY2UuDQorDQorICBJZiBjb21waWxlZCB3aXRoIEZPT1RFUlM9PTEsIG1zcGFjZV9yZWFsbG9jIGlzIG5vdCBhY3R1YWxseQ0KKyAgbmVlZGVkLiAgcmVhbGxvYyBtYXkgYmUgY2FsbGVkIGluc3RlYWQgb2YgbXNwYWNlX3JlYWxsb2MgYmVjYXVzZQ0KKyAgcmVhbGxvY2VkIGNodW5rcyBmcm9tIGFueSBzcGFjZSBhcmUgaGFuZGxlZCBieSB0aGVpciBvcmlnaW5hdGluZw0KKyAgc3BhY2VzLg0KKyovDQordm9pZCogbXNwYWNlX3JlYWxsb2MobXNwYWNlIG1zcCwgdm9pZCogbWVtLCBzaXplX3QgbmV3c2l6ZSk7DQorDQorLyoNCisgIG1zcGFjZV9jYWxsb2MgYmVoYXZlcyBhcyBjYWxsb2MsIGJ1dCBvcGVyYXRlcyB3aXRoaW4NCisgIHRoZSBnaXZlbiBzcGFjZS4NCisqLw0KK3ZvaWQqIG1zcGFjZV9jYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtX3NpemUpOw0KKw0KKy8qDQorICBtc3BhY2VfbWVtYWxpZ24gYmVoYXZlcyBhcyBtZW1hbGlnbiwgYnV0IG9wZXJhdGVzIHdpdGhpbg0KKyAgdGhlIGdpdmVuIHNwYWNlLg0KKyovDQordm9pZCogbXNwYWNlX21lbWFsaWduKG1zcGFjZSBtc3AsIHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBieXRlcyk7DQorDQorLyoNCisgIG1zcGFjZV9pbmRlcGVuZGVudF9jYWxsb2MgYmVoYXZlcyBhcyBpbmRlcGVuZGVudF9jYWxsb2MsIGJ1dA0KKyAgb3BlcmF0ZXMgd2l0aGluIHRoZSBnaXZlbiBzcGFjZS4NCisqLw0KK3ZvaWQqKiBtc3BhY2VfaW5kZXBlbmRlbnRfY2FsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBuX2VsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbGVtX3NpemUsIHZvaWQqIGNodW5rc1tdKTsNCisNCisvKg0KKyAgbXNwYWNlX2luZGVwZW5kZW50X2NvbWFsbG9jIGJlaGF2ZXMgYXMgaW5kZXBlbmRlbnRfY29tYWxsb2MsIGJ1dA0KKyAgb3BlcmF0ZXMgd2l0aGluIHRoZSBnaXZlbiBzcGFjZS4NCisqLw0KK3ZvaWQqKiBtc3BhY2VfaW5kZXBlbmRlbnRfY29tYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZXNbXSwgdm9pZCogY2h1bmtzW10pOw0KKw0KKy8qDQorICBtc3BhY2VfZm9vdHByaW50KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9idGFpbmVkIGZyb20gdGhlDQorICBzeXN0ZW0gZm9yIHRoaXMgc3BhY2UuDQorKi8NCitzaXplX3QgbXNwYWNlX2Zvb3RwcmludChtc3BhY2UgbXNwKTsNCisNCisvKg0KKyAgbXNwYWNlX21heF9mb290cHJpbnQoKSByZXR1cm5zIHRoZSBwZWFrIG51bWJlciBvZiBieXRlcyBvYnRhaW5lZCBmcm9tIHRoZQ0KKyAgc3lzdGVtIGZvciB0aGlzIHNwYWNlLg0KKyovDQorc2l6ZV90IG1zcGFjZV9tYXhfZm9vdHByaW50KG1zcGFjZSBtc3ApOw0KKw0KKw0KKyNpZiAhTk9fTUFMTElORk8NCisvKg0KKyAgbXNwYWNlX21hbGxpbmZvIGJlaGF2ZXMgYXMgbWFsbGluZm8sIGJ1dCByZXBvcnRzIHByb3BlcnRpZXMgb2YNCisgIHRoZSBnaXZlbiBzcGFjZS4NCisqLw0KK3N0cnVjdCBtYWxsaW5mbyBtc3BhY2VfbWFsbGluZm8obXNwYWNlIG1zcCk7DQorI2VuZGlmIC8qIE5PX01BTExJTkZPICovDQorDQorLyoNCisgIG1hbGxvY191c2FibGVfc2l6ZSh2b2lkKiBwKSBiZWhhdmVzIHRoZSBzYW1lIGFzIG1hbGxvY191c2FibGVfc2l6ZTsNCisqLw0KKyAgc2l6ZV90IG1zcGFjZV91c2FibGVfc2l6ZSh2b2lkKiBtZW0pOw0KKw0KKy8qDQorICBtc3BhY2VfbWFsbG9jX3N0YXRzIGJlaGF2ZXMgYXMgbWFsbG9jX3N0YXRzLCBidXQgcmVwb3J0cw0KKyAgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gc3BhY2UuDQorKi8NCit2b2lkIG1zcGFjZV9tYWxsb2Nfc3RhdHMobXNwYWNlIG1zcCk7DQorDQorLyoNCisgIG1zcGFjZV90cmltIGJlaGF2ZXMgYXMgbWFsbG9jX3RyaW0sIGJ1dA0KKyAgb3BlcmF0ZXMgd2l0aGluIHRoZSBnaXZlbiBzcGFjZS4NCisqLw0KK2ludCBtc3BhY2VfdHJpbShtc3BhY2UgbXNwLCBzaXplX3QgcGFkKTsNCisNCisvKg0KKyAgQW4gYWxpYXMgZm9yIG1hbGxvcHQuDQorKi8NCitpbnQgbXNwYWNlX21hbGxvcHQoaW50LCBpbnQpOw0KKw0KKyNlbmRpZiAvKiBNU1BBQ0VTICovDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfSAgLyogZW5kIG9mIGV4dGVybiAiQyIgKi8NCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCisNCisvKg0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICBUbyBtYWtlIGEgZnVsbHkgY3VzdG9taXphYmxlIG1hbGxvYy5oIGhlYWRlciBmaWxlLCBjdXQgZXZlcnl0aGluZw0KKyAgYWJvdmUgdGhpcyBsaW5lLCBwdXQgaW50byBmaWxlIG1hbGxvYy5oLCBlZGl0IHRvIHN1aXQsIGFuZCAjaW5jbHVkZSBpdA0KKyAgb24gdGhlIG5leHQgbGluZSwgYXMgd2VsbCBhcyBpbiBwcm9ncmFtcyB0aGF0IHVzZSB0aGlzIG1hbGxvYy4NCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyovDQorDQorLyogI2luY2x1ZGUgIm1hbGxvYy5oIiAqLw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGludGVybmFsICNpbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorI2lmZGVmIFdJTjMyDQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDE0NiApIC8qIG5vICJ1bnNpZ25lZCIgd2FybmluZ3MgKi8NCisjZW5kaWYgLyogV0lOMzIgKi8NCisNCisjaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgLyogZm9yIHByaW50aW5nIGluIG1hbGxvY19zdGF0cyAqLw0KKw0KKyNpZm5kZWYgTEFDS1NfRVJSTk9fSA0KKyNpbmNsdWRlIDxlcnJuby5oPiAgICAgICAvKiBmb3IgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OICovDQorI2VuZGlmIC8qIExBQ0tTX0VSUk5PX0ggKi8NCisvKiNpZiBGT09URVJTIHx8IERFQlVHDQorKi8NCisjaW5jbHVkZSA8dGltZS5oPiAgICAgICAgLyogZm9yIG1hZ2ljIGluaXRpYWxpemF0aW9uICovDQorLyojZW5kaWYqLyAvKiBGT09URVJTICovDQorI2lmbmRlZiBMQUNLU19TVERMSUJfSA0KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgICAvKiBmb3IgYWJvcnQoKSAqLw0KKyNlbmRpZiAvKiBMQUNLU19TVERMSUJfSCAqLw0KKyNpZmRlZiBERUJVRw0KKyNpZiBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRQ0KKyN1bmRlZiBhc3NlcnQNCisjZGVmaW5lIGFzc2VydCh4KSBpZighKHgpKSBBQk9SVA0KKyNlbHNlIC8qIEFCT1JUX09OX0FTU0VSVF9GQUlMVVJFICovDQorI2luY2x1ZGUgPGFzc2VydC5oPg0KKyNlbmRpZiAvKiBBQk9SVF9PTl9BU1NFUlRfRkFJTFVSRSAqLw0KKyNlbHNlICAvKiBERUJVRyAqLw0KKyNpZm5kZWYgYXNzZXJ0DQorI2RlZmluZSBhc3NlcnQoeCkNCisjZW5kaWYNCisjZGVmaW5lIERFQlVHIDANCisjZW5kaWYgLyogREVCVUcgKi8NCisjaWZuZGVmIExBQ0tTX1NUUklOR19IDQorI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgIC8qIGZvciBtZW1zZXQgZXRjICovDQorI2VuZGlmICAvKiBMQUNLU19TVFJJTkdfSCAqLw0KKyNpZiBVU0VfQlVJTFRJTl9GRlMNCisjaWZuZGVmIExBQ0tTX1NUUklOR1NfSA0KKyNpbmNsdWRlIDxzdHJpbmdzLmg+ICAgICAvKiBmb3IgZmZzICovDQorI2VuZGlmIC8qIExBQ0tTX1NUUklOR1NfSCAqLw0KKyNlbmRpZiAvKiBVU0VfQlVJTFRJTl9GRlMgKi8NCisjaWYgSEFWRV9NTUFQDQorI2lmbmRlZiBMQUNLU19TWVNfTU1BTl9IDQorLyogT24gc29tZSB2ZXJzaW9ucyBvZiBsaW51eCwgbXJlbWFwIGRlY2wgaW4gbW1hbi5oIG5lZWRzIF9fVVNFX0dOVSBzZXQgKi8NCisjaWYgKGRlZmluZWQobGludXgpICYmICFkZWZpbmVkKF9fVVNFX0dOVSkpDQorI2RlZmluZSBfX1VTRV9HTlUgMQ0KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPiAgICAvKiBmb3IgbW1hcCAqLw0KKyN1bmRlZiBfX1VTRV9HTlUNCisjZWxzZQ0KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPiAgICAvKiBmb3IgbW1hcCAqLw0KKyNlbmRpZiAvKiBsaW51eCAqLw0KKyNlbmRpZiAvKiBMQUNLU19TWVNfTU1BTl9IICovDQorI2lmbmRlZiBMQUNLU19GQ05UTF9IDQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2VuZGlmIC8qIExBQ0tTX0ZDTlRMX0ggKi8NCisjZW5kaWYgLyogSEFWRV9NTUFQICovDQorI2lmbmRlZiBMQUNLU19VTklTVERfSA0KKyNpbmNsdWRlIDx1bmlzdGQuaD4gICAgIC8qIGZvciBzYnJrLCBzeXNjb25mICovDQorI2Vsc2UgLyogTEFDS1NfVU5JU1REX0ggKi8NCisjaWYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKQ0KK2V4dGVybiB2b2lkKiAgICAgc2JyayhwdHJkaWZmX3QpOw0KKyNlbmRpZiAvKiBGcmVlQlNEIGV0YyAqLw0KKyNlbmRpZiAvKiBMQUNLU19VTklTVERfSCAqLw0KKw0KKy8qIERlY2xhcmF0aW9ucyBmb3IgbG9ja2luZyAqLw0KKyNpZiBVU0VfTE9DS1MNCisjaWZuZGVmIFdJTjMyDQorI2luY2x1ZGUgPHB0aHJlYWQuaD4NCisjaWYgZGVmaW5lZCAoX19TVlI0KSAmJiBkZWZpbmVkIChfX3N1bikgIC8qIHNvbGFyaXMgKi8NCisjaW5jbHVkZSA8dGhyZWFkLmg+DQorI2VuZGlmIC8qIHNvbGFyaXMgKi8NCisjZWxzZQ0KKyNpZm5kZWYgX01fQU1ENjQNCisvKiBUaGVzZSBhcmUgYWxyZWFkeSBkZWZpbmVkIG9uIEFNRDY0IGJ1aWxkcyAqLw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KK0xPTkcgX19jZGVjbCBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoTE9ORyB2b2xhdGlsZSAqRGVzdCwgTE9ORyBFeGNoYW5nZSwgTE9ORyBDb21wKTsNCitMT05HIF9fY2RlY2wgX0ludGVybG9ja2VkRXhjaGFuZ2UoTE9ORyB2b2xhdGlsZSAqVGFyZ2V0LCBMT05HIFZhbHVlKTsNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorI2VuZGlmIC8qIF9NX0FNRDY0ICovDQorI3ByYWdtYSBpbnRyaW5zaWMgKF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSkNCisjcHJhZ21hIGludHJpbnNpYyAoX0ludGVybG9ja2VkRXhjaGFuZ2UpDQorI2RlZmluZSBpbnRlcmxvY2tlZGNvbXBhcmVleGNoYW5nZSBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UNCisjZGVmaW5lIGludGVybG9ja2VkZXhjaGFuZ2UgX0ludGVybG9ja2VkRXhjaGFuZ2UNCisjZW5kaWYgLyogV2luMzIgKi8NCisjZW5kaWYgLyogVVNFX0xPQ0tTICovDQorDQorLyogRGVjbGFyYXRpb25zIGZvciBiaXQgc2Nhbm5pbmcgb24gd2luMzIgKi8NCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVI+PTEzMDANCisjaWZuZGVmIEJpdFNjYW5Gb3J3YXJkCS8qIFRyeSB0byBhdm9pZCBwdWxsaW5nIGluIFdpbk5ULmggKi8NCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCit1bnNpZ25lZCBjaGFyIF9CaXRTY2FuRm9yd2FyZCh1bnNpZ25lZCBsb25nICppbmRleCwgdW5zaWduZWQgbG9uZyBtYXNrKTsNCit1bnNpZ25lZCBjaGFyIF9CaXRTY2FuUmV2ZXJzZSh1bnNpZ25lZCBsb25nICppbmRleCwgdW5zaWduZWQgbG9uZyBtYXNrKTsNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorI2RlZmluZSBCaXRTY2FuRm9yd2FyZCBfQml0U2NhbkZvcndhcmQNCisjZGVmaW5lIEJpdFNjYW5SZXZlcnNlIF9CaXRTY2FuUmV2ZXJzZQ0KKyNwcmFnbWEgaW50cmluc2ljKF9CaXRTY2FuRm9yd2FyZCkNCisjcHJhZ21hIGludHJpbnNpYyhfQml0U2NhblJldmVyc2UpDQorI2VuZGlmIC8qIEJpdFNjYW5Gb3J3YXJkICovDQorI2VuZGlmIC8qIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSPj0xMzAwICovDQorDQorI2lmbmRlZiBXSU4zMg0KKyNpZm5kZWYgbWFsbG9jX2dldHBhZ2VzaXplDQorIyAgaWZkZWYgX1NDX1BBR0VTSVpFICAgICAgICAgLyogc29tZSBTVlI0IHN5c3RlbXMgb21pdCBhbiB1bmRlcnNjb3JlICovDQorIyAgICBpZm5kZWYgX1NDX1BBR0VfU0laRQ0KKyMgICAgICBkZWZpbmUgX1NDX1BBR0VfU0laRSBfU0NfUEFHRVNJWkUNCisjICAgIGVuZGlmDQorIyAgZW5kaWYNCisjICBpZmRlZiBfU0NfUEFHRV9TSVpFDQorIyAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIHN5c2NvbmYoX1NDX1BBR0VfU0laRSkNCisjICBlbHNlDQorIyAgICBpZiBkZWZpbmVkKEJTRCkgfHwgZGVmaW5lZChER1VYKSB8fCBkZWZpbmVkKEhBVkVfR0VUUEFHRVNJWkUpDQorICAgICAgIGV4dGVybiBzaXplX3QgZ2V0cGFnZXNpemUoKTsNCisjICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBnZXRwYWdlc2l6ZSgpDQorIyAgICBlbHNlDQorIyAgICAgIGlmZGVmIFdJTjMyIC8qIHVzZSBzdXBwbGllZCBlbXVsYXRpb24gb2YgZ2V0cGFnZXNpemUgKi8NCisjICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIGdldHBhZ2VzaXplKCkNCisjICAgICAgZWxzZQ0KKyMgICAgICAgIGlmbmRlZiBMQUNLU19TWVNfUEFSQU1fSA0KKyMgICAgICAgICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+DQorIyAgICAgICAgZW5kaWYNCisjICAgICAgICBpZmRlZiBFWEVDX1BBR0VTSVpFDQorIyAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIEVYRUNfUEFHRVNJWkUNCisjICAgICAgICBlbHNlDQorIyAgICAgICAgICBpZmRlZiBOQlBHDQorIyAgICAgICAgICAgIGlmbmRlZiBDTFNJWkUNCisjICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIE5CUEcNCisjICAgICAgICAgICAgZWxzZQ0KKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgKE5CUEcgKiBDTFNJWkUpDQorIyAgICAgICAgICAgIGVuZGlmDQorIyAgICAgICAgICBlbHNlDQorIyAgICAgICAgICAgIGlmZGVmIE5CUEMNCisjICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIE5CUEMNCisjICAgICAgICAgICAgZWxzZQ0KKyMgICAgICAgICAgICAgIGlmZGVmIFBBR0VTSVpFDQorIyAgICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIFBBR0VTSVpFDQorIyAgICAgICAgICAgICAgZWxzZSAvKiBqdXN0IGd1ZXNzICovDQorIyAgICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplICgoc2l6ZV90KTQwOTZVKQ0KKyMgICAgICAgICAgICAgIGVuZGlmDQorIyAgICAgICAgICAgIGVuZGlmDQorIyAgICAgICAgICBlbmRpZg0KKyMgICAgICAgIGVuZGlmDQorIyAgICAgIGVuZGlmDQorIyAgICBlbmRpZg0KKyMgIGVuZGlmDQorI2VuZGlmDQorI2VuZGlmDQorDQorDQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBzaXplX3QgYW5kIGFsaWdubWVudCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorLyogVGhlIGJ5dGUgYW5kIGJpdCBzaXplIG9mIGEgc2l6ZV90ICovDQorI2RlZmluZSBTSVpFX1RfU0laRSAgICAgICAgIChzaXplb2Yoc2l6ZV90KSkNCisjZGVmaW5lIFNJWkVfVF9CSVRTSVpFICAgICAgKHNpemVvZihzaXplX3QpIDw8IDMpDQorDQorLyogU29tZSBjb25zdGFudHMgY29lcmNlZCB0byBzaXplX3QgKi8NCisvKiBBbm5veWluZyBidXQgbmVjZXNzYXJ5IHRvIGF2b2lkIGVycm9ycyBvbiBzb21lIHBsYXRmb3JtcyAqLw0KKyNkZWZpbmUgU0laRV9UX1pFUk8gICAgICAgICAoKHNpemVfdCkwKQ0KKyNkZWZpbmUgU0laRV9UX09ORSAgICAgICAgICAoKHNpemVfdCkxKQ0KKyNkZWZpbmUgU0laRV9UX1RXTyAgICAgICAgICAoKHNpemVfdCkyKQ0KKyNkZWZpbmUgU0laRV9UX0ZPVVIgICAgICAgICAoKHNpemVfdCk0KQ0KKyNkZWZpbmUgVFdPX1NJWkVfVF9TSVpFUyAgICAoU0laRV9UX1NJWkU8PDEpDQorI2RlZmluZSBGT1VSX1NJWkVfVF9TSVpFUyAgIChTSVpFX1RfU0laRTw8MikNCisjZGVmaW5lIFNJWF9TSVpFX1RfU0laRVMgICAgKEZPVVJfU0laRV9UX1NJWkVTK1RXT19TSVpFX1RfU0laRVMpDQorI2RlZmluZSBIQUxGX01BWF9TSVpFX1QgICAgIChNQVhfU0laRV9UIC8gMlUpDQorDQorLyogVGhlIGJpdCBtYXNrIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gTUFMTE9DX0FMSUdOTUVOVCAqLw0KKyNkZWZpbmUgQ0hVTktfQUxJR05fTUFTSyAgICAoTUFMTE9DX0FMSUdOTUVOVCAtIFNJWkVfVF9PTkUpDQorDQorLyogVHJ1ZSBpZiBhZGRyZXNzIGEgaGFzIGFjY2VwdGFibGUgYWxpZ25tZW50ICovDQorI2RlZmluZSBpc19hbGlnbmVkKEEpICAgICAgICgoKHNpemVfdCkoKEEpKSAmIChDSFVOS19BTElHTl9NQVNLKSkgPT0gMCkNCisNCisvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG9mZnNldCBhbiBhZGRyZXNzIHRvIGFsaWduIGl0ICovDQorI2RlZmluZSBhbGlnbl9vZmZzZXQoQSlcDQorICgoKChzaXplX3QpKEEpICYgQ0hVTktfQUxJR05fTUFTSykgPT0gMCk/IDAgOlwNCisgICgoTUFMTE9DX0FMSUdOTUVOVCAtICgoc2l6ZV90KShBKSAmIENIVU5LX0FMSUdOX01BU0spKSAmIENIVU5LX0FMSUdOX01BU0spKQ0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1NQVAgcHJlbGltaW5hcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorLyoNCisgICBJZiBIQVZFX01PUkVDT1JFIG9yIEhBVkVfTU1BUCBhcmUgZmFsc2UsIHdlIGp1c3QgZGVmaW5lIGNhbGxzIGFuZA0KKyAgIGNoZWNrcyB0byBmYWlsIHNvIGNvbXBpbGVyIG9wdGltaXplciBjYW4gZGVsZXRlIGNvZGUgcmF0aGVyIHRoYW4NCisgICB1c2luZyBzbyBtYW55ICIjaWYicy4NCisqLw0KKw0KKw0KKy8qIE1PUkVDT1JFIGFuZCBNTUFQIG11c3QgcmV0dXJuIE1GQUlMIG9uIGZhaWx1cmUgKi8NCisjZGVmaW5lIE1GQUlMICAgICAgICAgICAgICAgICgodm9pZCopKE1BWF9TSVpFX1QpKQ0KKyNkZWZpbmUgQ01GQUlMICAgICAgICAgICAgICAgKChjaGFyKikoTUZBSUwpKSAvKiBkZWZpbmVkIGZvciBjb252ZW5pZW5jZSAqLw0KKw0KKyNpZiBIQVZFX01NQVANCisNCisjaWZuZGVmIFdJTjMyDQorI2RlZmluZSBNVU5NQVBfREVGQVVMVChhLCBzKSAgbXVubWFwKChhKSwgKHMpKQ0KKyNkZWZpbmUgTU1BUF9QUk9UICAgICAgICAgICAgKFBST1RfUkVBRHxQUk9UX1dSSVRFKQ0KKyNpZiAhZGVmaW5lZChNQVBfQU5PTllNT1VTKSAmJiBkZWZpbmVkKE1BUF9BTk9OKQ0KKyNkZWZpbmUgTUFQX0FOT05ZTU9VUyAgICAgICAgTUFQX0FOT04NCisjZW5kaWYgLyogTUFQX0FOT04gKi8NCisjaWZkZWYgTUFQX0FOT05ZTU9VUw0KKyNkZWZpbmUgTU1BUF9GTEFHUyAgICAgICAgICAgKE1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVMpDQorI2RlZmluZSBNTUFQX0RFRkFVTFQocykgICAgICAgbW1hcCgwLCAocyksIE1NQVBfUFJPVCwgTU1BUF9GTEFHUywgLTEsIDApDQorI2Vsc2UgLyogTUFQX0FOT05ZTU9VUyAqLw0KKy8qDQorICAgTmVhcmx5IGFsbCB2ZXJzaW9ucyBvZiBtbWFwIHN1cHBvcnQgTUFQX0FOT05ZTU9VUywgc28gdGhlIGZvbGxvd2luZw0KKyAgIGlzIHVubGlrZWx5IHRvIGJlIG5lZWRlZCwgYnV0IGlzIHN1cHBsaWVkIGp1c3QgaW4gY2FzZS4NCisqLw0KKyNkZWZpbmUgTU1BUF9GTEFHUyAgICAgICAgICAgKE1BUF9QUklWQVRFKQ0KK3N0YXRpYyBpbnQgZGV2X3plcm9fZmQgPSAtMTsgLyogQ2FjaGVkIGZpbGUgZGVzY3JpcHRvciBmb3IgL2Rldi96ZXJvLiAqLw0KKyNkZWZpbmUgTU1BUF9ERUZBVUxUKHMpICgoZGV2X3plcm9fZmQgPCAwKSA/IFwNCisgICAgICAgICAgIChkZXZfemVyb19mZCA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRXUiksIFwNCisgICAgICAgICAgICBtbWFwKDAsIChzKSwgTU1BUF9QUk9ULCBNTUFQX0ZMQUdTLCBkZXZfemVyb19mZCwgMCkpIDogXA0KKyAgICAgICAgICAgIG1tYXAoMCwgKHMpLCBNTUFQX1BST1QsIE1NQVBfRkxBR1MsIGRldl96ZXJvX2ZkLCAwKSkNCisjZW5kaWYgLyogTUFQX0FOT05ZTU9VUyAqLw0KKw0KKyNkZWZpbmUgRElSRUNUX01NQVBfREVGQVVMVChzKSBNTUFQX0RFRkFVTFQocykNCisNCisjZWxzZSAvKiBXSU4zMiAqLw0KKw0KKy8qIFdpbjMyIE1NQVAgdmlhIFZpcnR1YWxBbGxvYyAqLw0KK3N0YXRpYyBGT1JDRUlOTElORSB2b2lkKiB3aW4zMm1tYXAoc2l6ZV90IHNpemUpIHsNCisgIHZvaWQqIHB0ciA9IFZpcnR1YWxBbGxvYygwLCBzaXplLCBNRU1fUkVTRVJWRXxNRU1fQ09NTUlULCBQQUdFX1JFQURXUklURSk7DQorICByZXR1cm4gKHB0ciAhPSAwKT8gcHRyOiBNRkFJTDsNCit9DQorDQorLyogRm9yIGRpcmVjdCBNTUFQLCB1c2UgTUVNX1RPUF9ET1dOIHRvIG1pbmltaXplIGludGVyZmVyZW5jZSAqLw0KK3N0YXRpYyBGT1JDRUlOTElORSB2b2lkKiB3aW4zMmRpcmVjdF9tbWFwKHNpemVfdCBzaXplKSB7DQorICB2b2lkKiBwdHIgPSBWaXJ0dWFsQWxsb2MoMCwgc2l6ZSwgTUVNX1JFU0VSVkV8TUVNX0NPTU1JVHxNRU1fVE9QX0RPV04sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9SRUFEV1JJVEUpOw0KKyAgcmV0dXJuIChwdHIgIT0gMCk/IHB0cjogTUZBSUw7DQorfQ0KKw0KKy8qIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgcmVsZWFzaW5nIGNvYWxlc2VkIHNlZ21lbnRzICovDQorc3RhdGljIEZPUkNFSU5MSU5FIGludCB3aW4zMm11bm1hcCh2b2lkKiBwdHIsIHNpemVfdCBzaXplKSB7DQorICBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gbWluZm87DQorICBjaGFyKiBjcHRyID0gKGNoYXIqKXB0cjsNCisgIHdoaWxlIChzaXplKSB7DQorICAgIGlmIChWaXJ0dWFsUXVlcnkoY3B0ciwgJm1pbmZvLCBzaXplb2YobWluZm8pKSA9PSAwKQ0KKyAgICAgIHJldHVybiAtMTsNCisgICAgaWYgKG1pbmZvLkJhc2VBZGRyZXNzICE9IGNwdHIgfHwgbWluZm8uQWxsb2NhdGlvbkJhc2UgIT0gY3B0ciB8fA0KKyAgICAgICAgbWluZm8uU3RhdGUgIT0gTUVNX0NPTU1JVCB8fCBtaW5mby5SZWdpb25TaXplID4gc2l6ZSkNCisgICAgICByZXR1cm4gLTE7DQorICAgIGlmIChWaXJ0dWFsRnJlZShjcHRyLCAwLCBNRU1fUkVMRUFTRSkgPT0gMCkNCisgICAgICByZXR1cm4gLTE7DQorICAgIGNwdHIgKz0gbWluZm8uUmVnaW9uU2l6ZTsNCisgICAgc2l6ZSAtPSBtaW5mby5SZWdpb25TaXplOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKyNkZWZpbmUgTU1BUF9ERUZBVUxUKHMpICAgICAgICAgICAgIHdpbjMybW1hcChzKQ0KKyNkZWZpbmUgTVVOTUFQX0RFRkFVTFQoYSwgcykgICAgICAgIHdpbjMybXVubWFwKChhKSwgKHMpKQ0KKyNkZWZpbmUgRElSRUNUX01NQVBfREVGQVVMVChzKSAgICAgIHdpbjMyZGlyZWN0X21tYXAocykNCisjZW5kaWYgLyogV0lOMzIgKi8NCisjZW5kaWYgLyogSEFWRV9NTUFQICovDQorDQorI2lmIEhBVkVfTVJFTUFQDQorI2lmbmRlZiBXSU4zMg0KKyNkZWZpbmUgTVJFTUFQX0RFRkFVTFQoYWRkciwgb3N6LCBuc3osIG12KSBtcmVtYXAoKGFkZHIpLCAob3N6KSwgKG5zeiksIChtdikpDQorI2VuZGlmIC8qIFdJTjMyICovDQorI2VuZGlmIC8qIEhBVkVfTVJFTUFQICovDQorDQorDQorLyoqDQorICogRGVmaW5lIENBTExfTU9SRUNPUkUNCisgKi8NCisjaWYgSEFWRV9NT1JFQ09SRQ0KKyAgICAjaWZkZWYgTU9SRUNPUkUNCisgICAgICAgICNkZWZpbmUgQ0FMTF9NT1JFQ09SRShTKSAgICBNT1JFQ09SRShTKQ0KKyAgICAjZWxzZSAgLyogTU9SRUNPUkUgKi8NCisgICAgICAgICNkZWZpbmUgQ0FMTF9NT1JFQ09SRShTKSAgICBNT1JFQ09SRV9ERUZBVUxUKFMpDQorICAgICNlbmRpZiAvKiBNT1JFQ09SRSAqLw0KKyNlbHNlICAvKiBIQVZFX01PUkVDT1JFICovDQorICAgICNkZWZpbmUgQ0FMTF9NT1JFQ09SRShTKSAgICAgICAgTUZBSUwNCisjZW5kaWYgLyogSEFWRV9NT1JFQ09SRSAqLw0KKw0KKy8qKg0KKyAqIERlZmluZSBDQUxMX01NQVAvQ0FMTF9NVU5NQVAvQ0FMTF9ESVJFQ1RfTU1BUA0KKyAqLw0KKyNpZiBIQVZFX01NQVANCisgICAgI2RlZmluZSBVU0VfTU1BUF9CSVQgICAgICAgICAgICAoU0laRV9UX09ORSkNCisNCisgICAgI2lmZGVmIE1NQVANCisgICAgICAgICNkZWZpbmUgQ0FMTF9NTUFQKHMpICAgICAgICBNTUFQKHMpDQorICAgICNlbHNlIC8qIE1NQVAgKi8NCisgICAgICAgICNkZWZpbmUgQ0FMTF9NTUFQKHMpICAgICAgICBNTUFQX0RFRkFVTFQocykNCisgICAgI2VuZGlmIC8qIE1NQVAgKi8NCisgICAgI2lmZGVmIE1VTk1BUA0KKyAgICAgICAgI2RlZmluZSBDQUxMX01VTk1BUChhLCBzKSAgIE1VTk1BUCgoYSksIChzKSkNCisgICAgI2Vsc2UgLyogTVVOTUFQICovDQorICAgICAgICAjZGVmaW5lIENBTExfTVVOTUFQKGEsIHMpICAgTVVOTUFQX0RFRkFVTFQoKGEpLCAocykpDQorICAgICNlbmRpZiAvKiBNVU5NQVAgKi8NCisgICAgI2lmZGVmIERJUkVDVF9NTUFQDQorICAgICAgICAjZGVmaW5lIENBTExfRElSRUNUX01NQVAocykgRElSRUNUX01NQVAocykNCisgICAgI2Vsc2UgLyogRElSRUNUX01NQVAgKi8NCisgICAgICAgICNkZWZpbmUgQ0FMTF9ESVJFQ1RfTU1BUChzKSBESVJFQ1RfTU1BUF9ERUZBVUxUKHMpDQorICAgICNlbmRpZiAvKiBESVJFQ1RfTU1BUCAqLw0KKyNlbHNlICAvKiBIQVZFX01NQVAgKi8NCisgICAgI2RlZmluZSBVU0VfTU1BUF9CSVQgICAgICAgICAgICAoU0laRV9UX1pFUk8pDQorDQorICAgICNkZWZpbmUgTU1BUChzKSAgICAgICAgICAgICAgICAgTUZBSUwNCisgICAgI2RlZmluZSBNVU5NQVAoYSwgcykgICAgICAgICAgICAoLTEpDQorICAgICNkZWZpbmUgRElSRUNUX01NQVAocykgICAgICAgICAgTUZBSUwNCisgICAgI2RlZmluZSBDQUxMX0RJUkVDVF9NTUFQKHMpICAgICBESVJFQ1RfTU1BUChzKQ0KKyAgICAjZGVmaW5lIENBTExfTU1BUChzKSAgICAgICAgICAgIE1NQVAocykNCisgICAgI2RlZmluZSBDQUxMX01VTk1BUChhLCBzKSAgICAgICBNVU5NQVAoKGEpLCAocykpDQorI2VuZGlmIC8qIEhBVkVfTU1BUCAqLw0KKw0KKy8qKg0KKyAqIERlZmluZSBDQUxMX01SRU1BUA0KKyAqLw0KKyNpZiBIQVZFX01NQVAgJiYgSEFWRV9NUkVNQVANCisgICAgI2lmZGVmIE1SRU1BUA0KKyAgICAgICAgI2RlZmluZSBDQUxMX01SRU1BUChhZGRyLCBvc3osIG5zeiwgbXYpIE1SRU1BUCgoYWRkciksIChvc3opLCAobnN6KSwgKG12KSkNCisgICAgI2Vsc2UgLyogTVJFTUFQICovDQorICAgICAgICAjZGVmaW5lIENBTExfTVJFTUFQKGFkZHIsIG9zeiwgbnN6LCBtdikgTVJFTUFQX0RFRkFVTFQoKGFkZHIpLCAob3N6KSwgKG5zeiksIChtdikpDQorICAgICNlbmRpZiAvKiBNUkVNQVAgKi8NCisjZWxzZSAgLyogSEFWRV9NTUFQICYmIEhBVkVfTVJFTUFQICovDQorICAgICNkZWZpbmUgQ0FMTF9NUkVNQVAoYWRkciwgb3N6LCBuc3osIG12KSAgICAgTUZBSUwNCisjZW5kaWYgLyogSEFWRV9NTUFQICYmIEhBVkVfTVJFTUFQICovDQorDQorLyogbXN0YXRlIGJpdCBzZXQgaWYgY29udGluZ3VvdXMgbW9yZWNvcmUgZGlzYWJsZWQgb3IgZmFpbGVkICovDQorI2RlZmluZSBVU0VfTk9OQ09OVElHVU9VU19CSVQgKDRVKQ0KKw0KKy8qIHNlZ21lbnQgYml0IHNldCBpbiBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZSAqLw0KKyNkZWZpbmUgRVhURVJOX0JJVCAgICAgICAgICAgICg4VSkNCisNCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTG9jayBwcmVsaW1pbmFyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKy8qDQorICBXaGVuIGxvY2tzIGFyZSBkZWZpbmVkLCB0aGVyZSBpcyBvbmUgZ2xvYmFsIGxvY2ssIHBsdXMNCisgIG9uZSBwZXItbXNwYWNlIGxvY2suDQorDQorICBUaGUgZ2xvYmFsIGxvY2tfZW5zdXJlcyB0aGF0IG1wYXJhbXMubWFnaWMgYW5kIG90aGVyIHVuaXF1ZQ0KKyAgbXBhcmFtcyB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4gSXQgYWxzbyBwcm90ZWN0cw0KKyAgc2VxdWVuY2VzIG9mIGNhbGxzIHRvIE1PUkVDT1JFLiAgSW4gbWFueSBjYXNlcyBzeXNfYWxsb2MgcmVxdWlyZXMNCisgIHR3byBjYWxscywgdGhhdCBzaG91bGQgbm90IGJlIGludGVybGVhdmVkIHdpdGggY2FsbHMgYnkgb3RoZXINCisgIHRocmVhZHMuICBUaGlzIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdCBkaXJlY3QgY2FsbHMgdG8gTU9SRUNPUkUNCisgIGJ5IG90aGVyIHRocmVhZHMgbm90IHVzaW5nIHRoaXMgbG9jaywgc28gdGhlcmUgaXMgc3RpbGwgY29kZSB0bw0KKyAgY29wZSB0aGUgYmVzdCB3ZSBjYW4gb24gaW50ZXJmZXJlbmNlLg0KKw0KKyAgUGVyLW1zcGFjZSBsb2NrcyBzdXJyb3VuZCBjYWxscyB0byBtYWxsb2MsIGZyZWUsIGV0Yy4gIFRvIGVuYWJsZSB1c2UNCisgIGluIGxheWVyZWQgZXh0ZW5zaW9ucywgcGVyLW1zcGFjZSBsb2NrcyBhcmUgcmVlbnRyYW50Lg0KKw0KKyAgQmVjYXVzZSBsb2NrLXByb3RlY3RlZCByZWdpb25zIGdlbmVyYWxseSBoYXZlIGJvdW5kZWQgdGltZXMsIGl0IGlzDQorICBPSyB0byB1c2UgdGhlIHN1cHBsaWVkIHNpbXBsZSBzcGlubG9ja3MgaW4gdGhlIGN1c3RvbSB2ZXJzaW9ucyBmb3INCisgIHg4Ni4gU3BpbmxvY2tzIGFyZSBsaWtlbHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IgbGlnaHRseQ0KKyAgY29udGVuZGVkIGFwcGxpY2F0aW9ucywgYnV0IHdvcnNlbiBwZXJmb3JtYW5jZSB1bmRlciBoZWF2eQ0KKyAgY29udGVudGlvbi4NCisNCisgIElmIFVTRV9MT0NLUyBpcyA+IDEsIHRoZSBkZWZpbml0aW9ucyBvZiBsb2NrIHJvdXRpbmVzIGhlcmUgYXJlDQorICBieXBhc3NlZCwgaW4gd2hpY2ggY2FzZSB5b3Ugd2lsbCBuZWVkIHRvIGRlZmluZSB0aGUgdHlwZSBNTE9DS19ULA0KKyAgYW5kIGF0IGxlYXN0IElOSVRJQUxfTE9DSywgQUNRVUlSRV9MT0NLLCBSRUxFQVNFX0xPQ0sgYW5kIHBvc3NpYmx5DQorICBUUllfTE9DSyAod2hpY2ggaXMgbm90IHVzZWQgaW4gdGhpcyBtYWxsb2MsIGJ1dCBjb21tb25seSBuZWVkZWQgaW4NCisgIGV4dGVuc2lvbnMuKSAgWW91IG11c3QgYWxzbyBkZWNsYXJlIGENCisgICAgc3RhdGljIE1MT0NLX1QgbWFsbG9jX2dsb2JhbF9tdXRleCA9IHsgaW5pdGlhbGl6YXRpb24gdmFsdWVzIH07Lg0KKw0KKyovDQorDQorI2lmIFVTRV9MT0NLUyA9PSAxDQorDQorI2lmIFVTRV9TUElOX0xPQ0tTICYmIFNQSU5fTE9DS1NfQVZBSUxBQkxFDQorI2lmbmRlZiBXSU4zMg0KKw0KKy8qIEN1c3RvbSBwdGhyZWFkLXN0eWxlIHNwaW4gbG9ja3Mgb24geDg2IGFuZCB4NjQgZm9yIGdjYyAqLw0KK3N0cnVjdCBwdGhyZWFkX21sb2NrX3Qgew0KKyAgdm9sYXRpbGUgdW5zaWduZWQgaW50IGw7DQorICB1bnNpZ25lZCBpbnQgYzsNCisgIHB0aHJlYWRfdCB0aHJlYWRpZDsNCit9Ow0KKyNkZWZpbmUgTUxPQ0tfVCAgICAgICAgICAgICAgIHN0cnVjdCBwdGhyZWFkX21sb2NrX3QNCisjZGVmaW5lIENVUlJFTlRfVEhSRUFEICAgICAgICBwdGhyZWFkX3NlbGYoKQ0KKyNkZWZpbmUgSU5JVElBTF9MT0NLKHNsKSAgICAgICgoc2wpLT50aHJlYWRpZCA9IDAsIChzbCktPmwgPSAoc2wpLT5jID0gMCwgMCkNCisjZGVmaW5lIEFDUVVJUkVfTE9DSyhzbCkgICAgICBwdGhyZWFkX2FjcXVpcmVfbG9jayhzbCkNCisjZGVmaW5lIFJFTEVBU0VfTE9DSyhzbCkgICAgICBwdGhyZWFkX3JlbGVhc2VfbG9jayhzbCkNCisjZGVmaW5lIFRSWV9MT0NLKHNsKSAgICAgICAgICBwdGhyZWFkX3RyeV9sb2NrKHNsKQ0KKyNkZWZpbmUgU1BJTlNfUEVSX1lJRUxEICAgICAgIDYzDQorDQorc3RhdGljIE1MT0NLX1QgbWFsbG9jX2dsb2JhbF9tdXRleCA9IHsgMCwgMCwgMH07DQorDQorc3RhdGljIEZPUkNFSU5MSU5FIGludCBwdGhyZWFkX2FjcXVpcmVfbG9jayAoTUxPQ0tfVCAqc2wpIHsNCisgIGludCBzcGlucyA9IDA7DQorICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQqIGxwID0gJnNsLT5sOw0KKyAgZm9yICg7Oykgew0KKyAgICBpZiAoKmxwICE9IDApIHsNCisgICAgICBpZiAoc2wtPnRocmVhZGlkID09IENVUlJFTlRfVEhSRUFEKSB7DQorICAgICAgICArK3NsLT5jOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgIC8qIHBsYWNlIGFyZ3MgdG8gY21weGNoZ2wgaW4gbG9jYWxzIHRvIGV2YWRlIG9kZGl0aWVzIGluIHNvbWUgZ2NjcyAqLw0KKyAgICAgIGludCBjbXAgPSAwOw0KKyAgICAgIGludCB2YWwgPSAxOw0KKyAgICAgIGludCByZXQ7DQorICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gICgibG9jazsgY21weGNoZ2wgJTEsICUyIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPWEiIChyZXQpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAodmFsKSwgIm0iICgqKGxwKSksICIwIihjbXApDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiLCAiY2MiKTsNCisgICAgICBpZiAoIXJldCkgew0KKyAgICAgICAgYXNzZXJ0KCFzbC0+dGhyZWFkaWQpOw0KKyAgICAgICAgc2wtPnRocmVhZGlkID0gQ1VSUkVOVF9USFJFQUQ7DQorICAgICAgICBzbC0+YyA9IDE7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCgrK3NwaW5zICYgU1BJTlNfUEVSX1lJRUxEKSA9PSAwKSB7DQorI2lmIGRlZmluZWQgKF9fU1ZSNCkgJiYgZGVmaW5lZCAoX19zdW4pIC8qIHNvbGFyaXMgKi8NCisgICAgICB0aHJfeWllbGQoKTsNCisjZWxzZQ0KKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0FQUExFX18pDQorICAgICAgc2NoZWRfeWllbGQoKTsNCisjZWxzZSAgLyogbm8tb3AgeWllbGQgb24gdW5rbm93biBzeXN0ZW1zICovDQorICAgICAgOw0KKyNlbmRpZiAvKiBfX2xpbnV4X18gfHwgX19GcmVlQlNEX18gfHwgX19BUFBMRV9fICovDQorI2VuZGlmIC8qIHNvbGFyaXMgKi8NCisgICAgfQ0KKyAgfQ0KK30NCisNCitzdGF0aWMgRk9SQ0VJTkxJTkUgdm9pZCBwdGhyZWFkX3JlbGVhc2VfbG9jayAoTUxPQ0tfVCAqc2wpIHsNCisgIHZvbGF0aWxlIHVuc2lnbmVkIGludCogbHAgPSAmc2wtPmw7DQorICBhc3NlcnQoKmxwICE9IDApOw0KKyAgYXNzZXJ0KHNsLT50aHJlYWRpZCA9PSBDVVJSRU5UX1RIUkVBRCk7DQorICBpZiAoLS1zbC0+YyA9PSAwKSB7DQorICAgIHNsLT50aHJlYWRpZCA9IDA7DQorICAgIGludCBwcmV2ID0gMDsNCisgICAgaW50IHJldDsNCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsb2NrOyB4Y2hnbCAlMCwgJTEiDQorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIgKHJldCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm0iICgqKGxwKSksICIwIihwcmV2KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7DQorICB9DQorfQ0KKw0KK3N0YXRpYyBGT1JDRUlOTElORSBpbnQgcHRocmVhZF90cnlfbG9jayAoTUxPQ0tfVCAqc2wpIHsNCisgIHZvbGF0aWxlIHVuc2lnbmVkIGludCogbHAgPSAmc2wtPmw7DQorICBpZiAoKmxwICE9IDApIHsNCisgICAgaWYgKHNsLT50aHJlYWRpZCA9PSBDVVJSRU5UX1RIUkVBRCkgew0KKyAgICAgICsrc2wtPmM7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgIH0NCisgIGVsc2Ugew0KKyAgICBpbnQgY21wID0gMDsNCisgICAgaW50IHZhbCA9IDE7DQorICAgIGludCByZXQ7DQorICAgIF9fYXNtX18gX192b2xhdGlsZV9fICAoImxvY2s7IGNtcHhjaGdsICUxLCAlMiINCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHJldCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAodmFsKSwgIm0iICgqKGxwKSksICIwIihjbXApDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IiwgImNjIik7DQorICAgIGlmICghcmV0KSB7DQorICAgICAgYXNzZXJ0KCFzbC0+dGhyZWFkaWQpOw0KKyAgICAgIHNsLT50aHJlYWRpZCA9IENVUlJFTlRfVEhSRUFEOw0KKyAgICAgIHNsLT5jID0gMTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKw0KKyNlbHNlIC8qIFdJTjMyICovDQorLyogQ3VzdG9tIHdpbjMyLXN0eWxlIHNwaW4gbG9ja3Mgb24geDg2IGFuZCB4NjQgZm9yIE1TQyAqLw0KK3N0cnVjdCB3aW4zMl9tbG9ja190IHsNCisgIHZvbGF0aWxlIGxvbmcgbDsNCisgIHVuc2lnbmVkIGludCBjOw0KKyAgbG9uZyB0aHJlYWRpZDsNCit9Ow0KKw0KKyNkZWZpbmUgTUxPQ0tfVCAgICAgICAgICAgICAgIHN0cnVjdCB3aW4zMl9tbG9ja190DQorI2RlZmluZSBDVVJSRU5UX1RIUkVBRCAgICAgICAgR2V0Q3VycmVudFRocmVhZElkKCkNCisjZGVmaW5lIElOSVRJQUxfTE9DSyhzbCkgICAgICAoKHNsKS0+dGhyZWFkaWQgPSAwLCAoc2wpLT5sID0gKHNsKS0+YyA9IDAsIDApDQorI2RlZmluZSBBQ1FVSVJFX0xPQ0soc2wpICAgICAgd2luMzJfYWNxdWlyZV9sb2NrKHNsKQ0KKyNkZWZpbmUgUkVMRUFTRV9MT0NLKHNsKSAgICAgIHdpbjMyX3JlbGVhc2VfbG9jayhzbCkNCisjZGVmaW5lIFRSWV9MT0NLKHNsKSAgICAgICAgICB3aW4zMl90cnlfbG9jayhzbCkNCisjZGVmaW5lIFNQSU5TX1BFUl9ZSUVMRCAgICAgICA2Mw0KKw0KK3N0YXRpYyBNTE9DS19UIG1hbGxvY19nbG9iYWxfbXV0ZXggPSB7IDAsIDAsIDB9Ow0KKw0KK3N0YXRpYyBGT1JDRUlOTElORSBpbnQgd2luMzJfYWNxdWlyZV9sb2NrIChNTE9DS19UICpzbCkgew0KKyAgaW50IHNwaW5zID0gMDsNCisgIGZvciAoOzspIHsNCisgICAgaWYgKHNsLT5sICE9IDApIHsNCisgICAgICBpZiAoc2wtPnRocmVhZGlkID09IENVUlJFTlRfVEhSRUFEKSB7DQorICAgICAgICArK3NsLT5jOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgIGlmICghaW50ZXJsb2NrZWRleGNoYW5nZSgmc2wtPmwsIDEpKSB7DQorICAgICAgICBhc3NlcnQoIXNsLT50aHJlYWRpZCk7DQorICAgICAgICBzbC0+dGhyZWFkaWQgPSBDVVJSRU5UX1RIUkVBRDsNCisgICAgICAgIHNsLT5jID0gMTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoKCsrc3BpbnMgJiBTUElOU19QRVJfWUlFTEQpID09IDApDQorICAgICAgU2xlZXBFeCgwLCBGQUxTRSk7DQorICB9DQorfQ0KKw0KK3N0YXRpYyBGT1JDRUlOTElORSB2b2lkIHdpbjMyX3JlbGVhc2VfbG9jayAoTUxPQ0tfVCAqc2wpIHsNCisgIGFzc2VydChzbC0+dGhyZWFkaWQgPT0gQ1VSUkVOVF9USFJFQUQpOw0KKyAgYXNzZXJ0KHNsLT5sICE9IDApOw0KKyAgaWYgKC0tc2wtPmMgPT0gMCkgew0KKyAgICBzbC0+dGhyZWFkaWQgPSAwOw0KKyAgICBpbnRlcmxvY2tlZGV4Y2hhbmdlICgmc2wtPmwsIDApOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgRk9SQ0VJTkxJTkUgaW50IHdpbjMyX3RyeV9sb2NrIChNTE9DS19UICpzbCkgew0KKyAgaWYgKHNsLT5sICE9IDApIHsNCisgICAgaWYgKHNsLT50aHJlYWRpZCA9PSBDVVJSRU5UX1RIUkVBRCkgew0KKyAgICAgICsrc2wtPmM7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgIH0NCisgIGVsc2Ugew0KKyAgICBpZiAoIWludGVybG9ja2VkZXhjaGFuZ2UoJnNsLT5sLCAxKSl7DQorICAgICAgYXNzZXJ0KCFzbC0+dGhyZWFkaWQpOw0KKyAgICAgIHNsLT50aHJlYWRpZCA9IENVUlJFTlRfVEhSRUFEOw0KKyAgICAgIHNsLT5jID0gMTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKyNlbmRpZiAvKiBXSU4zMiAqLw0KKyNlbHNlIC8qIFVTRV9TUElOX0xPQ0tTICovDQorDQorI2lmbmRlZiBXSU4zMg0KKy8qIHB0aHJlYWRzLWJhc2VkIGxvY2tzICovDQorDQorI2RlZmluZSBNTE9DS19UICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90DQorI2RlZmluZSBDVVJSRU5UX1RIUkVBRCAgICAgICAgcHRocmVhZF9zZWxmKCkNCisjZGVmaW5lIElOSVRJQUxfTE9DSyhzbCkgICAgICBwdGhyZWFkX2luaXRfbG9jayhzbCkNCisjZGVmaW5lIEFDUVVJUkVfTE9DSyhzbCkgICAgICBwdGhyZWFkX211dGV4X2xvY2soc2wpDQorI2RlZmluZSBSRUxFQVNFX0xPQ0soc2wpICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soc2wpDQorI2RlZmluZSBUUllfTE9DSyhzbCkgICAgICAgICAgKCFwdGhyZWFkX211dGV4X3RyeWxvY2soc2wpKQ0KKw0KK3N0YXRpYyBNTE9DS19UIG1hbGxvY19nbG9iYWxfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOw0KKw0KKy8qIENvcGUgd2l0aCBvbGQtc3R5bGUgbGludXggcmVjdXJzaXZlIGxvY2sgaW5pdGlhbGl6YXRpb24gYnkgYWRkaW5nICovDQorLyogc2tpcHBlZCBpbnRlcm5hbCBkZWNsYXJhdGlvbiBmcm9tIHB0aHJlYWQuaCAqLw0KKyNpZmRlZiBsaW51eA0KKyNpZm5kZWYgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUNCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAgX19QICgocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLA0KKwkJCQkJICAgaW50IF9fa2luZCkpOw0KKyNkZWZpbmUgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlANCisjZGVmaW5lIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoeCx5KSBwdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wKHgseSkNCisjZW5kaWYNCisjZW5kaWYNCisNCitzdGF0aWMgaW50IHB0aHJlYWRfaW5pdF9sb2NrIChNTE9DS19UICpzbCkgew0KKyAgcHRocmVhZF9tdXRleGF0dHJfdCBhdHRyOw0KKyAgaWYgKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJmF0dHIpKSByZXR1cm4gMTsNCisgIGlmIChwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZhdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSkpIHJldHVybiAxOw0KKyAgaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdChzbCwgJmF0dHIpKSByZXR1cm4gMTsNCisgIGlmIChwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKSkgcmV0dXJuIDE7DQorICByZXR1cm4gMDsNCit9DQorDQorI2Vsc2UgLyogV0lOMzIgKi8NCisvKiBXaW4zMiBjcml0aWNhbCBzZWN0aW9ucyAqLw0KKyNkZWZpbmUgTUxPQ0tfVCAgICAgICAgICAgICAgIENSSVRJQ0FMX1NFQ1RJT04NCisjZGVmaW5lIENVUlJFTlRfVEhSRUFEICAgICAgICBHZXRDdXJyZW50VGhyZWFkSWQoKQ0KKyNkZWZpbmUgSU5JVElBTF9MT0NLKHMpICAgICAgICghSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudCgocyksIDB4ODAwMDAwMDB8NDAwMCkpDQorI2RlZmluZSBBQ1FVSVJFX0xPQ0socykgICAgICAgKEVudGVyQ3JpdGljYWxTZWN0aW9uKHNsKSwgMCkNCisjZGVmaW5lIFJFTEVBU0VfTE9DSyhzKSAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihzbCkNCisjZGVmaW5lIFRSWV9MT0NLKHMpICAgICAgICAgICBUcnlFbnRlckNyaXRpY2FsU2VjdGlvbihzbCkNCisjZGVmaW5lIE5FRURfR0xPQkFMX0xPQ0tfSU5JVA0KKw0KK3N0YXRpYyBNTE9DS19UIG1hbGxvY19nbG9iYWxfbXV0ZXg7DQorc3RhdGljIHZvbGF0aWxlIGxvbmcgbWFsbG9jX2dsb2JhbF9tdXRleF9zdGF0dXM7DQorDQorLyogVXNlIHNwaW4gbG9vcCB0byBpbml0aWFsaXplIGdsb2JhbCBsb2NrICovDQorc3RhdGljIHZvaWQgaW5pdF9tYWxsb2NfZ2xvYmFsX211dGV4KCkgew0KKyAgZm9yICg7Oykgew0KKyAgICBsb25nIHN0YXQgPSBtYWxsb2NfZ2xvYmFsX211dGV4X3N0YXR1czsNCisgICAgaWYgKHN0YXQgPiAwKQ0KKyAgICAgIHJldHVybjsNCisgICAgLyogdHJhbnNpdGlvbiB0byA8IDAgd2hpbGUgaW5pdGlhbGl6aW5nLCB0aGVuIHRvID4gMCkgKi8NCisgICAgaWYgKHN0YXQgPT0gMCAmJg0KKyAgICAgICAgaW50ZXJsb2NrZWRjb21wYXJlZXhjaGFuZ2UoJm1hbGxvY19nbG9iYWxfbXV0ZXhfc3RhdHVzLCAtMSwgMCkgPT0gMCkgew0KKyAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJm1hbGxvY19nbG9iYWxfbXV0ZXgpOw0KKyAgICAgIGludGVybG9ja2VkZXhjaGFuZ2UoJm1hbGxvY19nbG9iYWxfbXV0ZXhfc3RhdHVzLDEpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBTbGVlcEV4KDAsIEZBTFNFKTsNCisgIH0NCit9DQorDQorI2VuZGlmIC8qIFdJTjMyICovDQorI2VuZGlmIC8qIFVTRV9TUElOX0xPQ0tTICovDQorI2VuZGlmIC8qIFVTRV9MT0NLUyA9PSAxICovDQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFVzZXItZGVmaW5lZCBsb2NrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisjaWYgVVNFX0xPQ0tTID4gMQ0KKy8qIERlZmluZSB5b3VyIG93biBsb2NrIGltcGxlbWVudGF0aW9uIGhlcmUgKi8NCisvKiAjZGVmaW5lIElOSVRJQUxfTE9DSyhzbCkgIC4uLiAqLw0KKy8qICNkZWZpbmUgQUNRVUlSRV9MT0NLKHNsKSAgLi4uICovDQorLyogI2RlZmluZSBSRUxFQVNFX0xPQ0soc2wpICAuLi4gKi8NCisvKiAjZGVmaW5lIFRSWV9MT0NLKHNsKSAuLi4gKi8NCisvKiBzdGF0aWMgTUxPQ0tfVCBtYWxsb2NfZ2xvYmFsX211dGV4ID0gLi4uICovDQorI2VuZGlmIC8qIFVTRV9MT0NLUyA+IDEgKi8NCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgTG9jay1iYXNlZCBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisjaWYgVVNFX0xPQ0tTDQorI2RlZmluZSBVU0VfTE9DS19CSVQgICAgICAgICAgICAgICAoMlUpDQorI2Vsc2UgIC8qIFVTRV9MT0NLUyAqLw0KKyNkZWZpbmUgVVNFX0xPQ0tfQklUICAgICAgICAgICAgICAgKDBVKQ0KKyNkZWZpbmUgSU5JVElBTF9MT0NLKGwpDQorI2VuZGlmIC8qIFVTRV9MT0NLUyAqLw0KKw0KKyNpZiBVU0VfTE9DS1MNCisjaWZuZGVmIEFDUVVJUkVfTUFMTE9DX0dMT0JBTF9MT0NLDQorI2RlZmluZSBBQ1FVSVJFX01BTExPQ19HTE9CQUxfTE9DSygpICBBQ1FVSVJFX0xPQ0soJm1hbGxvY19nbG9iYWxfbXV0ZXgpOw0KKyNlbmRpZg0KKyNpZm5kZWYgUkVMRUFTRV9NQUxMT0NfR0xPQkFMX0xPQ0sNCisjZGVmaW5lIFJFTEVBU0VfTUFMTE9DX0dMT0JBTF9MT0NLKCkgIFJFTEVBU0VfTE9DSygmbWFsbG9jX2dsb2JhbF9tdXRleCk7DQorI2VuZGlmDQorI2Vsc2UgIC8qIFVTRV9MT0NLUyAqLw0KKyNkZWZpbmUgQUNRVUlSRV9NQUxMT0NfR0xPQkFMX0xPQ0soKQ0KKyNkZWZpbmUgUkVMRUFTRV9NQUxMT0NfR0xPQkFMX0xPQ0soKQ0KKyNlbmRpZiAvKiBVU0VfTE9DS1MgKi8NCisNCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgQ2h1bmsgcmVwcmVzZW50YXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKy8qDQorICAoVGhlIGZvbGxvd2luZyBpbmNsdWRlcyBsaWdodGx5IGVkaXRlZCBleHBsYW5hdGlvbnMgYnkgQ29saW4gUGx1bWIuKQ0KKw0KKyAgVGhlIG1hbGxvY19jaHVuayBkZWNsYXJhdGlvbiBiZWxvdyBpcyBtaXNsZWFkaW5nIChidXQgYWNjdXJhdGUgYW5kDQorICBuZWNlc3NhcnkpLiAgSXQgZGVjbGFyZXMgYSAidmlldyIgaW50byBtZW1vcnkgYWxsb3dpbmcgYWNjZXNzIHRvDQorICBuZWNlc3NhcnkgZmllbGRzIGF0IGtub3duIG9mZnNldHMgZnJvbSBhIGdpdmVuIGJhc2UuDQorDQorICBDaHVua3Mgb2YgbWVtb3J5IGFyZSBtYWludGFpbmVkIHVzaW5nIGEgYGJvdW5kYXJ5IHRhZycgbWV0aG9kIGFzDQorICBvcmlnaW5hbGx5IGRlc2NyaWJlZCBieSBLbnV0aC4gIChTZWUgdGhlIHBhcGVyIGJ5IFBhdWwgV2lsc29uDQorICBmdHA6Ly9mdHAuY3MudXRleGFzLmVkdS9wdWIvZ2FyYmFnZS9hbGxvY3Nydi5wcyBmb3IgYSBzdXJ2ZXkgb2Ygc3VjaA0KKyAgdGVjaG5pcXVlcy4pICBTaXplcyBvZiBmcmVlIGNodW5rcyBhcmUgc3RvcmVkIGJvdGggaW4gdGhlIGZyb250IG9mDQorICBlYWNoIGNodW5rIGFuZCBhdCB0aGUgZW5kLiAgVGhpcyBtYWtlcyBjb25zb2xpZGF0aW5nIGZyYWdtZW50ZWQNCisgIGNodW5rcyBpbnRvIGJpZ2dlciBjaHVua3MgZmFzdC4gIFRoZSBoZWFkIGZpZWxkcyBhbHNvIGhvbGQgYml0cw0KKyAgcmVwcmVzZW50aW5nIHdoZXRoZXIgY2h1bmtzIGFyZSBmcmVlIG9yIGluIHVzZS4NCisNCisgIEhlcmUgYXJlIHNvbWUgcGljdHVyZXMgdG8gbWFrZSBpdCBjbGVhcmVyLiAgVGhleSBhcmUgImV4cGxvZGVkIiB0bw0KKyAgc2hvdyB0aGF0IHRoZSBzdGF0ZSBvZiBhIGNodW5rIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGV4dGVuZGluZyBmcm9tDQorICB0aGUgaGlnaCAzMSBiaXRzIG9mIHRoZSBoZWFkIGZpZWxkIG9mIGl0cyBoZWFkZXIgdGhyb3VnaCB0aGUNCisgIHByZXZfZm9vdCBhbmQgUElOVVNFX0JJVCBiaXQgb2YgdGhlIGZvbGxvd2luZyBjaHVuayBoZWFkZXIuDQorDQorICBBIGNodW5rIHRoYXQncyBpbiB1c2UgbG9va3MgbGlrZToNCisNCisgICBjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgICAgICB8IFNpemUgb2YgcHJldmlvdXMgY2h1bmsgKGlmIFAgPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgfFB8DQorICAgICAgICAgfCBTaXplIG9mIHRoaXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDF8ICstKw0KKyAgIG1lbS0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgICAgICAgICArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKw0KKyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorICAgICAgICAgKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsNCisgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOg0KKyAgICAgICAgICstICAgICAgc2l6ZSAtIHNpemVvZihzaXplX3QpIGF2YWlsYWJsZSBwYXlsb2FkIGJ5dGVzICAgICAgICAgIC0rDQorICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgY2h1bmstPiArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKw0KKyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rIHwxfA0KKyAgICAgICB8IFNpemUgb2YgbmV4dCBjaHVuayAobWF5IG9yIG1heSBub3QgYmUgaW4gdXNlKSAgICAgICAgICAgICAgIHwgKy0rDQorIG1lbS0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorDQorICAgIEFuZCBpZiBpdCdzIGZyZWUsIGl0IGxvb2tzIGxpa2UgdGhpczoNCisNCisgICBjaHVuay0+ICstICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0rDQorICAgICAgICAgICB8IFVzZXIgcGF5bG9hZCAobXVzdCBiZSBpbiB1c2UsIG9yIHdlIHdvdWxkIGhhdmUgbWVyZ2VkISkgICAgICAgfA0KKyAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgfFB8DQorICAgICAgICAgfCBTaXplIG9mIHRoaXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB8ICstKw0KKyAgIG1lbS0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgICAgfCBOZXh0IHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKw0KKyAgICAgICAgIHwgUHJldiBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOg0KKyAgICAgICAgICstICAgICAgc2l6ZSAtIHNpemVvZihzdHJ1Y3QgY2h1bmspIHVudXNlZCBieXRlcyAgICAgICAgICAgICAgIC0rDQorICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgY2h1bmstPiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKw0KKyAgICAgICAgIHwgU2l6ZSBvZiB0aGlzIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rIHwwfA0KKyAgICAgICB8IFNpemUgb2YgbmV4dCBjaHVuayAobXVzdCBiZSBpbiB1c2UsIG9yIHdlIHdvdWxkIGhhdmUgbWVyZ2VkKXwgKy0rDQorIG1lbS0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6DQorICAgICAgICstIFVzZXIgcGF5bG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0rDQorICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfDB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0rDQorICBOb3RlIHRoYXQgc2luY2Ugd2UgYWx3YXlzIG1lcmdlIGFkamFjZW50IGZyZWUgY2h1bmtzLCB0aGUgY2h1bmtzDQorICBhZGphY2VudCB0byBhIGZyZWUgY2h1bmsgbXVzdCBiZSBpbiB1c2UuDQorDQorICBHaXZlbiBhIHBvaW50ZXIgdG8gYSBjaHVuayAod2hpY2ggY2FuIGJlIGRlcml2ZWQgdHJpdmlhbGx5IGZyb20gdGhlDQorICBwYXlsb2FkIHBvaW50ZXIpIHdlIGNhbiwgaW4gTygxKSB0aW1lLCBmaW5kIG91dCB3aGV0aGVyIHRoZSBhZGphY2VudA0KKyAgY2h1bmtzIGFyZSBmcmVlLCBhbmQgaWYgc28sIHVubGluayB0aGVtIGZyb20gdGhlIGxpc3RzIHRoYXQgdGhleQ0KKyAgYXJlIG9uIGFuZCBtZXJnZSB0aGVtIHdpdGggdGhlIGN1cnJlbnQgY2h1bmsuDQorDQorICBDaHVua3MgYWx3YXlzIGJlZ2luIG9uIGV2ZW4gd29yZCBib3VuZGFyaWVzLCBzbyB0aGUgbWVtIHBvcnRpb24NCisgICh3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgdXNlcikgaXMgYWxzbyBvbiBhbiBldmVuIHdvcmQgYm91bmRhcnksIGFuZA0KKyAgdGh1cyBhdCBsZWFzdCBkb3VibGUtd29yZCBhbGlnbmVkLg0KKw0KKyAgVGhlIFAgKFBJTlVTRV9CSVQpIGJpdCwgc3RvcmVkIGluIHRoZSB1bnVzZWQgbG93LW9yZGVyIGJpdCBvZiB0aGUNCisgIGNodW5rIHNpemUgKHdoaWNoIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIHR3byB3b3JkcyksIGlzIGFuIGluLXVzZQ0KKyAgYml0IGZvciB0aGUgKnByZXZpb3VzKiBjaHVuay4gIElmIHRoYXQgYml0IGlzICpjbGVhciosIHRoZW4gdGhlDQorICB3b3JkIGJlZm9yZSB0aGUgY3VycmVudCBjaHVuayBzaXplIGNvbnRhaW5zIHRoZSBwcmV2aW91cyBjaHVuaw0KKyAgc2l6ZSwgYW5kIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIGZyb250IG9mIHRoZSBwcmV2aW91cyBjaHVuay4NCisgIFRoZSB2ZXJ5IGZpcnN0IGNodW5rIGFsbG9jYXRlZCBhbHdheXMgaGFzIHRoaXMgYml0IHNldCwgcHJldmVudGluZw0KKyAgYWNjZXNzIHRvIG5vbi1leGlzdGVudCAob3Igbm9uLW93bmVkKSBtZW1vcnkuIElmIHBpbnVzZSBpcyBzZXQgZm9yDQorICBhbnkgZ2l2ZW4gY2h1bmssIHRoZW4geW91IENBTk5PVCBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlDQorICBwcmV2aW91cyBjaHVuaywgYW5kIG1pZ2h0IGV2ZW4gZ2V0IGEgbWVtb3J5IGFkZHJlc3NpbmcgZmF1bHQgd2hlbg0KKyAgdHJ5aW5nIHRvIGRvIHNvLg0KKw0KKyAgVGhlIEMgKENJTlVTRV9CSVQpIGJpdCwgc3RvcmVkIGluIHRoZSB1bnVzZWQgc2Vjb25kLWxvd2VzdCBiaXQgb2YNCisgIHRoZSBjaHVuayBzaXplIHJlZHVuZGFudGx5IHJlY29yZHMgd2hldGhlciB0aGUgY3VycmVudCBjaHVuayBpcw0KKyAgaW51c2UgKHVubGVzcyB0aGUgY2h1bmsgaXMgbW1hcHBlZCkuIFRoaXMgcmVkdW5kYW5jeSBlbmFibGVzIHVzYWdlDQorICBjaGVja3Mgd2l0aGluIGZyZWUgYW5kIHJlYWxsb2MsIGFuZCByZWR1Y2VzIGluZGlyZWN0aW9uIHdoZW4gZnJlZWluZw0KKyAgYW5kIGNvbnNvbGlkYXRpbmcgY2h1bmtzLg0KKw0KKyAgRWFjaCBmcmVzaGx5IGFsbG9jYXRlZCBjaHVuayBtdXN0IGhhdmUgYm90aCBjaW51c2UgYW5kIHBpbnVzZSBzZXQuDQorICBUaGF0IGlzLCBlYWNoIGFsbG9jYXRlZCBjaHVuayBib3JkZXJzIGVpdGhlciBhIHByZXZpb3VzbHkgYWxsb2NhdGVkDQorICBhbmQgc3RpbGwgaW4tdXNlIGNodW5rLCBvciB0aGUgYmFzZSBvZiBpdHMgbWVtb3J5IGFyZW5hLiBUaGlzIGlzDQorICBlbnN1cmVkIGJ5IG1ha2luZyBhbGwgYWxsb2NhdGlvbnMgZnJvbSB0aGUgdGhlIGBsb3dlc3QnIHBhcnQgb2YgYW55DQorICBmb3VuZCBjaHVuay4gIEZ1cnRoZXIsIG5vIGZyZWUgY2h1bmsgcGh5c2ljYWxseSBib3JkZXJzIGFub3RoZXIgb25lLA0KKyAgc28gZWFjaCBmcmVlIGNodW5rIGlzIGtub3duIHRvIGJlIHByZWNlZGVkIGFuZCBmb2xsb3dlZCBieSBlaXRoZXINCisgIGludXNlIGNodW5rcyBvciB0aGUgZW5kcyBvZiBtZW1vcnkuDQorDQorICBOb3RlIHRoYXQgdGhlIGBmb290JyBvZiB0aGUgY3VycmVudCBjaHVuayBpcyBhY3R1YWxseSByZXByZXNlbnRlZA0KKyAgYXMgdGhlIHByZXZfZm9vdCBvZiB0aGUgTkVYVCBjaHVuay4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8NCisgIGRlYWwgd2l0aCBhbGlnbm1lbnRzIGV0YyBidXQgY2FuIGJlIHZlcnkgY29uZnVzaW5nIHdoZW4gdHJ5aW5nDQorICB0byBleHRlbmQgb3IgYWRhcHQgdGhpcyBjb2RlLg0KKw0KKyAgVGhlIGV4Y2VwdGlvbnMgdG8gYWxsIHRoaXMgYXJlDQorDQorICAgICAxLiBUaGUgc3BlY2lhbCBjaHVuayBgdG9wJyBpcyB0aGUgdG9wLW1vc3QgYXZhaWxhYmxlIGNodW5rIChpLmUuLA0KKyAgICAgICAgdGhlIG9uZSBib3JkZXJpbmcgdGhlIGVuZCBvZiBhdmFpbGFibGUgbWVtb3J5KS4gSXQgaXMgdHJlYXRlZA0KKyAgICAgICAgc3BlY2lhbGx5LiAgVG9wIGlzIG5ldmVyIGluY2x1ZGVkIGluIGFueSBiaW4sIGlzIHVzZWQgb25seSBpZg0KKyAgICAgICAgbm8gb3RoZXIgY2h1bmsgaXMgYXZhaWxhYmxlLCBhbmQgaXMgcmVsZWFzZWQgYmFjayB0byB0aGUNCisgICAgICAgIHN5c3RlbSBpZiBpdCBpcyB2ZXJ5IGxhcmdlIChzZWUgTV9UUklNX1RIUkVTSE9MRCkuICBJbiBlZmZlY3QsDQorICAgICAgICB0aGUgdG9wIGNodW5rIGlzIHRyZWF0ZWQgYXMgbGFyZ2VyIChhbmQgdGh1cyBsZXNzIHdlbGwNCisgICAgICAgIGZpdHRpbmcpIHRoYW4gYW55IG90aGVyIGF2YWlsYWJsZSBjaHVuay4gIFRoZSB0b3AgY2h1bmsNCisgICAgICAgIGRvZXNuJ3QgdXBkYXRlIGl0cyB0cmFpbGluZyBzaXplIGZpZWxkIHNpbmNlIHRoZXJlIGlzIG5vIG5leHQNCisgICAgICAgIGNvbnRpZ3VvdXMgY2h1bmsgdGhhdCB3b3VsZCBoYXZlIHRvIGluZGV4IG9mZiBpdC4gSG93ZXZlciwNCisgICAgICAgIHNwYWNlIGlzIHN0aWxsIGFsbG9jYXRlZCBmb3IgaXQgKFRPUF9GT09UX1NJWkUpIHRvIGVuYWJsZQ0KKyAgICAgICAgc2VwYXJhdGlvbiBvciBtZXJnaW5nIHdoZW4gc3BhY2UgaXMgZXh0ZW5kZWQuDQorDQorICAgICAzLiBDaHVua3MgYWxsb2NhdGVkIHZpYSBtbWFwLCBoYXZlIGJvdGggY2ludXNlIGFuZCBwaW51c2UgYml0cw0KKyAgICAgICAgY2xlYXJlZCBpbiB0aGVpciBoZWFkIGZpZWxkcy4gIEJlY2F1c2UgdGhleSBhcmUgYWxsb2NhdGVkDQorICAgICAgICBvbmUtYnktb25lLCBlYWNoIG11c3QgY2FycnkgaXRzIG93biBwcmV2X2Zvb3QgZmllbGQsIHdoaWNoIGlzDQorICAgICAgICBhbHNvIHVzZWQgdG8gaG9sZCB0aGUgb2Zmc2V0IHRoaXMgY2h1bmsgaGFzIHdpdGhpbiBpdHMgbW1hcHBlZA0KKyAgICAgICAgcmVnaW9uLCB3aGljaCBpcyBuZWVkZWQgdG8gcHJlc2VydmUgYWxpZ25tZW50LiBFYWNoIG1tYXBwZWQNCisgICAgICAgIGNodW5rIGlzIHRyYWlsZWQgYnkgdGhlIGZpcnN0IHR3byBmaWVsZHMgb2YgYSBmYWtlIG5leHQtY2h1bmsNCisgICAgICAgIGZvciBzYWtlIG9mIHVzYWdlIGNoZWNrcy4NCisNCisqLw0KKw0KK3N0cnVjdCBtYWxsb2NfY2h1bmsgew0KKyAgc2l6ZV90ICAgICAgICAgICAgICAgcHJldl9mb290OyAgLyogU2l6ZSBvZiBwcmV2aW91cyBjaHVuayAoaWYgZnJlZSkuICAqLw0KKyAgc2l6ZV90ICAgICAgICAgICAgICAgaGVhZDsgICAgICAgLyogU2l6ZSBhbmQgaW51c2UgYml0cy4gKi8NCisgIHN0cnVjdCBtYWxsb2NfY2h1bmsqIGZkOyAgICAgICAgIC8qIGRvdWJsZSBsaW5rcyAtLSB1c2VkIG9ubHkgaWYgZnJlZS4gKi8NCisgIHN0cnVjdCBtYWxsb2NfY2h1bmsqIGJrOw0KK307DQorDQordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX2NodW5rICBtY2h1bms7DQordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX2NodW5rKiBtY2h1bmtwdHI7DQordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX2NodW5rKiBzYmlucHRyOyAgLyogVGhlIHR5cGUgb2YgYmlucyBvZiBjaHVua3MgKi8NCit0eXBlZGVmIHVuc2lnbmVkIGludCBiaW5kZXhfdDsgICAgICAgICAvKiBEZXNjcmliZWQgYmVsb3cgKi8NCit0eXBlZGVmIHVuc2lnbmVkIGludCBiaW5tYXBfdDsgICAgICAgICAvKiBEZXNjcmliZWQgYmVsb3cgKi8NCit0eXBlZGVmIHVuc2lnbmVkIGludCBmbGFnX3Q7ICAgICAgICAgICAvKiBUaGUgdHlwZSBvZiB2YXJpb3VzIGJpdCBmbGFnIHNldHMgKi8NCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIENodW5rcyBzaXplcyBhbmQgYWxpZ25tZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKyNkZWZpbmUgTUNIVU5LX1NJWkUgICAgICAgICAoc2l6ZW9mKG1jaHVuaykpDQorDQorI2lmIEZPT1RFUlMNCisjZGVmaW5lIENIVU5LX09WRVJIRUFEICAgICAgKFRXT19TSVpFX1RfU0laRVMpDQorI2Vsc2UgLyogRk9PVEVSUyAqLw0KKyNkZWZpbmUgQ0hVTktfT1ZFUkhFQUQgICAgICAoU0laRV9UX1NJWkUpDQorI2VuZGlmIC8qIEZPT1RFUlMgKi8NCisNCisvKiBNTWFwcGVkIGNodW5rcyBuZWVkIGEgc2Vjb25kIHdvcmQgb2Ygb3ZlcmhlYWQgLi4uICovDQorI2RlZmluZSBNTUFQX0NIVU5LX09WRVJIRUFEIChUV09fU0laRV9UX1NJWkVTKQ0KKy8qIC4uLiBhbmQgYWRkaXRpb25hbCBwYWRkaW5nIGZvciBmYWtlIG5leHQtY2h1bmsgYXQgZm9vdCAqLw0KKyNkZWZpbmUgTU1BUF9GT09UX1BBRCAgICAgICAoRk9VUl9TSVpFX1RfU0laRVMpDQorDQorLyogVGhlIHNtYWxsZXN0IHNpemUgd2UgY2FuIG1hbGxvYyBpcyBhbiBhbGlnbmVkIG1pbmltYWwgY2h1bmsgKi8NCisjZGVmaW5lIE1JTl9DSFVOS19TSVpFXA0KKyAgKChNQ0hVTktfU0laRSArIENIVU5LX0FMSUdOX01BU0spICYgfkNIVU5LX0FMSUdOX01BU0spDQorDQorLyogY29udmVyc2lvbiBmcm9tIG1hbGxvYyBoZWFkZXJzIHRvIHVzZXIgcG9pbnRlcnMsIGFuZCBiYWNrICovDQorI2RlZmluZSBjaHVuazJtZW0ocCkgICAgICAgICgodm9pZCopKChjaGFyKikocCkgICAgICAgKyBUV09fU0laRV9UX1NJWkVTKSkNCisjZGVmaW5lIG1lbTJjaHVuayhtZW0pICAgICAgKChtY2h1bmtwdHIpKChjaGFyKikobWVtKSAtIFRXT19TSVpFX1RfU0laRVMpKQ0KKy8qIGNodW5rIGFzc29jaWF0ZWQgd2l0aCBhbGlnbmVkIGFkZHJlc3MgQSAqLw0KKyNkZWZpbmUgYWxpZ25fYXNfY2h1bmsoQSkgICAobWNodW5rcHRyKSgoQSkgKyBhbGlnbl9vZmZzZXQoY2h1bmsybWVtKEEpKSkNCisNCisvKiBCb3VuZHMgb24gcmVxdWVzdCAobm90IGNodW5rKSBzaXplcy4gKi8NCisjZGVmaW5lIE1BWF9SRVFVRVNUICAgICAgICAgKCgtTUlOX0NIVU5LX1NJWkUpIDw8IDIpDQorI2RlZmluZSBNSU5fUkVRVUVTVCAgICAgICAgIChNSU5fQ0hVTktfU0laRSAtIENIVU5LX09WRVJIRUFEIC0gU0laRV9UX09ORSkNCisNCisvKiBwYWQgcmVxdWVzdCBieXRlcyBpbnRvIGEgdXNhYmxlIHNpemUgKi8NCisjZGVmaW5lIHBhZF9yZXF1ZXN0KHJlcSkgXA0KKyAgICgoKHJlcSkgKyBDSFVOS19PVkVSSEVBRCArIENIVU5LX0FMSUdOX01BU0spICYgfkNIVU5LX0FMSUdOX01BU0spDQorDQorLyogcGFkIHJlcXVlc3QsIGNoZWNraW5nIGZvciBtaW5pbXVtIChidXQgbm90IG1heGltdW0pICovDQorI2RlZmluZSByZXF1ZXN0MnNpemUocmVxKSBcDQorICAoKChyZXEpIDwgTUlOX1JFUVVFU1QpPyBNSU5fQ0hVTktfU0laRSA6IHBhZF9yZXF1ZXN0KHJlcSkpDQorDQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMgb24gaGVhZCBhbmQgZm9vdCBmaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisvKg0KKyAgVGhlIGhlYWQgZmllbGQgb2YgYSBjaHVuayBpcyBvcidlZCB3aXRoIFBJTlVTRV9CSVQgd2hlbiBwcmV2aW91cw0KKyAgYWRqYWNlbnQgY2h1bmsgaW4gdXNlLCBhbmQgb3InZWQgd2l0aCBDSU5VU0VfQklUIGlmIHRoaXMgY2h1bmsgaXMgaW4NCisgIHVzZSwgdW5sZXNzIG1tYXBwZWQsIGluIHdoaWNoIGNhc2UgYm90aCBiaXRzIGFyZSBjbGVhcmVkLg0KKw0KKyAgRkxBRzRfQklUIGlzIG5vdCB1c2VkIGJ5IHRoaXMgbWFsbG9jLCBidXQgbWlnaHQgYmUgdXNlZnVsIGluIGV4dGVuc2lvbnMuDQorKi8NCisNCisjZGVmaW5lIFBJTlVTRV9CSVQgICAgICAgICAgKFNJWkVfVF9PTkUpDQorI2RlZmluZSBDSU5VU0VfQklUICAgICAgICAgIChTSVpFX1RfVFdPKQ0KKyNkZWZpbmUgRkxBRzRfQklUICAgICAgICAgICAoU0laRV9UX0ZPVVIpDQorI2RlZmluZSBJTlVTRV9CSVRTICAgICAgICAgIChQSU5VU0VfQklUfENJTlVTRV9CSVQpDQorI2RlZmluZSBGTEFHX0JJVFMgICAgICAgICAgIChQSU5VU0VfQklUfENJTlVTRV9CSVR8RkxBRzRfQklUKQ0KKw0KKy8qIEhlYWQgdmFsdWUgZm9yIGZlbmNlcG9zdHMgKi8NCisjZGVmaW5lIEZFTkNFUE9TVF9IRUFEICAgICAgKElOVVNFX0JJVFN8U0laRV9UX1NJWkUpDQorDQorLyogZXh0cmFjdGlvbiBvZiBmaWVsZHMgZnJvbSBoZWFkIHdvcmRzICovDQorI2RlZmluZSBjaW51c2UocCkgICAgICAgICAgICgocCktPmhlYWQgJiBDSU5VU0VfQklUKQ0KKyNkZWZpbmUgcGludXNlKHApICAgICAgICAgICAoKHApLT5oZWFkICYgUElOVVNFX0JJVCkNCisjZGVmaW5lIGlzX2ludXNlKHApICAgICAgICAgKCgocCktPmhlYWQgJiBJTlVTRV9CSVRTKSAhPSBQSU5VU0VfQklUKQ0KKyNkZWZpbmUgaXNfbW1hcHBlZChwKSAgICAgICAoKChwKS0+aGVhZCAmIElOVVNFX0JJVFMpID09IDApDQorDQorI2RlZmluZSBjaHVua3NpemUocCkgICAgICAgICgocCktPmhlYWQgJiB+KEZMQUdfQklUUykpDQorDQorI2RlZmluZSBjbGVhcl9waW51c2UocCkgICAgICgocCktPmhlYWQgJj0gflBJTlVTRV9CSVQpDQorDQorLyogVHJlYXQgc3BhY2UgYXQgcHRyICsvLSBvZmZzZXQgYXMgYSBjaHVuayAqLw0KKyNkZWZpbmUgY2h1bmtfcGx1c19vZmZzZXQocCwgcykgICgobWNodW5rcHRyKSgoKGNoYXIqKShwKSkgKyAocykpKQ0KKyNkZWZpbmUgY2h1bmtfbWludXNfb2Zmc2V0KHAsIHMpICgobWNodW5rcHRyKSgoKGNoYXIqKShwKSkgLSAocykpKQ0KKw0KKy8qIFB0ciB0byBuZXh0IG9yIHByZXZpb3VzIHBoeXNpY2FsIG1hbGxvY19jaHVuay4gKi8NCisjZGVmaW5lIG5leHRfY2h1bmsocCkgKChtY2h1bmtwdHIpKCAoKGNoYXIqKShwKSkgKyAoKHApLT5oZWFkICYgfkZMQUdfQklUUykpKQ0KKyNkZWZpbmUgcHJldl9jaHVuayhwKSAoKG1jaHVua3B0cikoICgoY2hhciopKHApKSAtICgocCktPnByZXZfZm9vdCkgKSkNCisNCisvKiBleHRyYWN0IG5leHQgY2h1bmsncyBwaW51c2UgYml0ICovDQorI2RlZmluZSBuZXh0X3BpbnVzZShwKSAgKChuZXh0X2NodW5rKHApLT5oZWFkKSAmIFBJTlVTRV9CSVQpDQorDQorLyogR2V0L3NldCBzaXplIGF0IGZvb3RlciAqLw0KKyNkZWZpbmUgZ2V0X2Zvb3QocCwgcykgICgoKG1jaHVua3B0cikoKGNoYXIqKShwKSArIChzKSkpLT5wcmV2X2Zvb3QpDQorI2RlZmluZSBzZXRfZm9vdChwLCBzKSAgKCgobWNodW5rcHRyKSgoY2hhciopKHApICsgKHMpKSktPnByZXZfZm9vdCA9IChzKSkNCisNCisvKiBTZXQgc2l6ZSwgcGludXNlIGJpdCwgYW5kIGZvb3QgKi8NCisjZGVmaW5lIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhwLCBzKVwNCisgICgocCktPmhlYWQgPSAoc3xQSU5VU0VfQklUKSwgc2V0X2Zvb3QocCwgcykpDQorDQorLyogU2V0IHNpemUsIHBpbnVzZSBiaXQsIGZvb3QsIGFuZCBjbGVhciBuZXh0IHBpbnVzZSAqLw0KKyNkZWZpbmUgc2V0X2ZyZWVfd2l0aF9waW51c2UocCwgcywgbilcDQorICAoY2xlYXJfcGludXNlKG4pLCBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgcykpDQorDQorLyogR2V0IHRoZSBpbnRlcm5hbCBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggY2h1bmsgcCAqLw0KKyNkZWZpbmUgb3ZlcmhlYWRfZm9yKHApXA0KKyAoaXNfbW1hcHBlZChwKT8gTU1BUF9DSFVOS19PVkVSSEVBRCA6IENIVU5LX09WRVJIRUFEKQ0KKw0KKy8qIFJldHVybiB0cnVlIGlmIG1hbGxvY2VkIHNwYWNlIGlzIG5vdCBuZWNlc3NhcmlseSBjbGVhcmVkICovDQorI2lmIE1NQVBfQ0xFQVJTDQorI2RlZmluZSBjYWxsb2NfbXVzdF9jbGVhcihwKSAoIWlzX21tYXBwZWQocCkpDQorI2Vsc2UgLyogTU1BUF9DTEVBUlMgKi8NCisjZGVmaW5lIGNhbGxvY19tdXN0X2NsZWFyKHApICgxKQ0KKyNlbmRpZiAvKiBNTUFQX0NMRUFSUyAqLw0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3ZlcmxhaWQgZGF0YSBzdHJ1Y3R1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorLyoNCisgIFdoZW4gY2h1bmtzIGFyZSBub3QgaW4gdXNlLCB0aGV5IGFyZSB0cmVhdGVkIGFzIG5vZGVzIG9mIGVpdGhlcg0KKyAgbGlzdHMgb3IgdHJlZXMuDQorDQorICAiU21hbGwiICBjaHVua3MgYXJlIHN0b3JlZCBpbiBjaXJjdWxhciBkb3VibHktbGlua2VkIGxpc3RzLCBhbmQgbG9vaw0KKyAgbGlrZSB0aGlzOg0KKw0KKyAgICBjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgICAgICAgfCAgICAgICAgICAgICBTaXplIG9mIHByZXZpb3VzIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKw0KKyAgICBgaGVhZDonIHwgICAgICAgICAgICAgU2l6ZSBvZiBjaHVuaywgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgfFB8DQorICAgICAgbWVtLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgICAgICAgICB8ICAgICAgICAgICAgIEZvcndhcmQgcG9pbnRlciB0byBuZXh0IGNodW5rIGluIGxpc3QgICAgICAgICAgICAgfA0KKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgICAgICAgfCAgICAgICAgICAgICBCYWNrIHBvaW50ZXIgdG8gcHJldmlvdXMgY2h1bmsgaW4gbGlzdCAgICAgICAgICAgIHwNCisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKw0KKyAgICAgICAgICAgIHwgICAgICAgICAgICAgVW51c2VkIHNwYWNlIChtYXkgYmUgMCBieXRlcyBsb25nKSAgICAgICAgICAgICAgICAuDQorICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4NCisgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK25leHRjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgIGBmb290OicgfCAgICAgICAgICAgICBTaXplIG9mIGNodW5rLCBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKw0KKw0KKyAgTGFyZ2VyIGNodW5rcyBhcmUga2VwdCBpbiBhIGZvcm0gb2YgYml0d2lzZSBkaWdpdGFsIHRyZWVzIChha2ENCisgIHRyaWVzKSBrZXllZCBvbiBjaHVua3NpemVzLiAgQmVjYXVzZSBtYWxsb2NfdHJlZV9jaHVua3MgYXJlIG9ubHkgZm9yDQorICBmcmVlIGNodW5rcyBncmVhdGVyIHRoYW4gMjU2IGJ5dGVzLCB0aGVpciBzaXplIGRvZXNuJ3QgaW1wb3NlIGFueQ0KKyAgY29uc3RyYWludHMgb24gdXNlciBjaHVuayBzaXplcy4gIEVhY2ggbm9kZSBsb29rcyBsaWtlOg0KKw0KKyAgICBjaHVuay0+ICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgICAgICAgfCAgICAgICAgICAgICBTaXplIG9mIHByZXZpb3VzIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKw0KKyAgICBgaGVhZDonIHwgICAgICAgICAgICAgU2l6ZSBvZiBjaHVuaywgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgfFB8DQorICAgICAgbWVtLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgICAgICAgICB8ICAgICAgICAgICAgIEZvcndhcmQgcG9pbnRlciB0byBuZXh0IGNodW5rIG9mIHNhbWUgc2l6ZSAgICAgICAgfA0KKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgICAgICAgfCAgICAgICAgICAgICBCYWNrIHBvaW50ZXIgdG8gcHJldmlvdXMgY2h1bmsgb2Ygc2FtZSBzaXplICAgICAgIHwNCisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKw0KKyAgICAgICAgICAgIHwgICAgICAgICAgICAgUG9pbnRlciB0byBsZWZ0IGNoaWxkIChjaGlsZFswXSkgICAgICAgICAgICAgICAgICB8DQorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgICAgICAgICB8ICAgICAgICAgICAgIFBvaW50ZXIgdG8gcmlnaHQgY2hpbGQgKGNoaWxkWzFdKSAgICAgICAgICAgICAgICAgfA0KKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorICAgICAgICAgICAgfCAgICAgICAgICAgICBQb2ludGVyIHRvIHBhcmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKw0KKyAgICAgICAgICAgIHwgICAgICAgICAgICAgYmluIGluZGV4IG9mIHRoaXMgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgICAgICAgICB8ICAgICAgICAgICAgIFVudXNlZCBzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLg0KKyAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorbmV4dGNodW5rLT4gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsNCisgICAgYGZvb3Q6JyB8ICAgICAgICAgICAgIFNpemUgb2YgY2h1bmssIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rDQorDQorICBFYWNoIHRyZWUgaG9sZGluZyB0cmVlbm9kZXMgaXMgYSB0cmVlIG9mIHVuaXF1ZSBjaHVuayBzaXplcy4gIENodW5rcw0KKyAgb2YgdGhlIHNhbWUgc2l6ZSBhcmUgYXJyYW5nZWQgaW4gYSBjaXJjdWxhcmx5LWxpbmtlZCBsaXN0LCB3aXRoIG9ubHkNCisgIHRoZSBvbGRlc3QgY2h1bmsgKHRoZSBuZXh0IHRvIGJlIHVzZWQsIGluIG91ciBGSUZPIG9yZGVyaW5nKQ0KKyAgYWN0dWFsbHkgaW4gdGhlIHRyZWUuICAoVHJlZSBtZW1iZXJzIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IGEgbm9uLW51bGwNCisgIHBhcmVudCBwb2ludGVyLikgIElmIGEgY2h1bmsgd2l0aCB0aGUgc2FtZSBzaXplIGFuIGFuIGV4aXN0aW5nIG5vZGUNCisgIGlzIGluc2VydGVkLCBpdCBpcyBsaW5rZWQgb2ZmIHRoZSBleGlzdGluZyBub2RlIHVzaW5nIHBvaW50ZXJzIHRoYXQNCisgIHdvcmsgaW4gdGhlIHNhbWUgd2F5IGFzIGZkL2JrIHBvaW50ZXJzIG9mIHNtYWxsIGNodW5rcy4NCisNCisgIEVhY2ggdHJlZSBjb250YWlucyBhIHBvd2VyIG9mIDIgc2l6ZWQgcmFuZ2Ugb2YgY2h1bmsgc2l6ZXMgKHRoZQ0KKyAgc21hbGxlc3QgaXMgMHgxMDAgPD0geCA8IDB4MTgwKSwgd2hpY2ggaXMgaXMgZGl2aWRlZCBpbiBoYWxmIGF0IGVhY2gNCisgIHRyZWUgbGV2ZWwsIHdpdGggdGhlIGNodW5rcyBpbiB0aGUgc21hbGxlciBoYWxmIG9mIHRoZSByYW5nZSAoMHgxMDANCisgIDw9IHggPCAweDE0MCBmb3IgdGhlIHRvcCBub3NlKSBpbiB0aGUgbGVmdCBzdWJ0cmVlIGFuZCB0aGUgbGFyZ2VyDQorICBoYWxmICgweDE0MCA8PSB4IDwgMHgxODApIGluIHRoZSByaWdodCBzdWJ0cmVlLiAgVGhpcyBpcywgb2YgY291cnNlLA0KKyAgZG9uZSBieSBpbnNwZWN0aW5nIGluZGl2aWR1YWwgYml0cy4NCisNCisgIFVzaW5nIHRoZXNlIHJ1bGVzLCBlYWNoIG5vZGUncyBsZWZ0IHN1YnRyZWUgY29udGFpbnMgYWxsIHNtYWxsZXINCisgIHNpemVzIHRoYW4gaXRzIHJpZ2h0IHN1YnRyZWUuICBIb3dldmVyLCB0aGUgbm9kZSBhdCB0aGUgcm9vdCBvZiBlYWNoDQorICBzdWJ0cmVlIGhhcyBubyBwYXJ0aWN1bGFyIG9yZGVyaW5nIHJlbGF0aW9uc2hpcCB0byBlaXRoZXIuICAoVGhlDQorICBkaXZpZGluZyBsaW5lIGJldHdlZW4gdGhlIHN1YnRyZWUgc2l6ZXMgaXMgYmFzZWQgb24gdHJpZSByZWxhdGlvbi4pDQorICBJZiB3ZSByZW1vdmUgdGhlIGxhc3QgY2h1bmsgb2YgYSBnaXZlbiBzaXplIGZyb20gdGhlIGludGVyaW9yIG9mIHRoZQ0KKyAgdHJlZSwgd2UgbmVlZCB0byByZXBsYWNlIGl0IHdpdGggYSBsZWFmIG5vZGUuICBUaGUgdHJlZSBvcmRlcmluZw0KKyAgcnVsZXMgcGVybWl0IGEgbm9kZSB0byBiZSByZXBsYWNlZCBieSBhbnkgbGVhZiBiZWxvdyBpdC4NCisNCisgIFRoZSBzbWFsbGVzdCBjaHVuayBpbiBhIHRyZWUgKGEgY29tbW9uIG9wZXJhdGlvbiBpbiBhIGJlc3QtZml0DQorICBhbGxvY2F0b3IpIGNhbiBiZSBmb3VuZCBieSB3YWxraW5nIGEgcGF0aCB0byB0aGUgbGVmdG1vc3QgbGVhZiBpbg0KKyAgdGhlIHRyZWUuICBVbmxpa2UgYSB1c3VhbCBiaW5hcnkgdHJlZSwgd2hlcmUgd2UgZm9sbG93IGxlZnQgY2hpbGQNCisgIHBvaW50ZXJzIHVudGlsIHdlIHJlYWNoIGEgbnVsbCwgaGVyZSB3ZSBmb2xsb3cgdGhlIHJpZ2h0IGNoaWxkDQorICBwb2ludGVyIGFueSB0aW1lIHRoZSBsZWZ0IG9uZSBpcyBudWxsLCB1bnRpbCB3ZSByZWFjaCBhIGxlYWYgd2l0aA0KKyAgYm90aCBjaGlsZCBwb2ludGVycyBudWxsLiBUaGUgc21hbGxlc3QgY2h1bmsgaW4gdGhlIHRyZWUgd2lsbCBiZQ0KKyAgc29tZXdoZXJlIGFsb25nIHRoYXQgcGF0aC4NCisNCisgIFRoZSB3b3JzdCBjYXNlIG51bWJlciBvZiBzdGVwcyB0byBhZGQsIGZpbmQsIG9yIHJlbW92ZSBhIG5vZGUgaXMNCisgIGJvdW5kZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGRpZmZlcmVudGlhdGluZyBjaHVua3Mgd2l0aGluDQorICBiaW5zLiBVbmRlciBjdXJyZW50IGJpbiBjYWxjdWxhdGlvbnMsIHRoaXMgcmFuZ2VzIGZyb20gNiB1cCB0byAyMQ0KKyAgKGZvciAzMiBiaXQgc2l6ZXMpIG9yIHVwIHRvIDUzIChmb3IgNjQgYml0IHNpemVzKS4gVGhlIHR5cGljYWwgY2FzZQ0KKyAgaXMgb2YgY291cnNlIG11Y2ggYmV0dGVyLg0KKyovDQorDQorc3RydWN0IG1hbGxvY190cmVlX2NodW5rIHsNCisgIC8qIFRoZSBmaXJzdCBmb3VyIGZpZWxkcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBtYWxsb2NfY2h1bmsgKi8NCisgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgcHJldl9mb290Ow0KKyAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBoZWFkOw0KKyAgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiBmZDsNCisgIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayogYms7DQorDQorICBzdHJ1Y3QgbWFsbG9jX3RyZWVfY2h1bmsqIGNoaWxkWzJdOw0KKyAgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiBwYXJlbnQ7DQorICBiaW5kZXhfdCAgICAgICAgICAgICAgICAgIGluZGV4Ow0KK307DQorDQordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3RyZWVfY2h1bmsgIHRjaHVuazsNCit0eXBlZGVmIHN0cnVjdCBtYWxsb2NfdHJlZV9jaHVuayogdGNodW5rcHRyOw0KK3R5cGVkZWYgc3RydWN0IG1hbGxvY190cmVlX2NodW5rKiB0YmlucHRyOyAvKiBUaGUgdHlwZSBvZiBiaW5zIG9mIHRyZWVzICovDQorDQorLyogQSBsaXR0bGUgaGVscGVyIG1hY3JvIGZvciB0cmVlcyAqLw0KKyNkZWZpbmUgbGVmdG1vc3RfY2hpbGQodCkgKCh0KS0+Y2hpbGRbMF0gIT0gMD8gKHQpLT5jaGlsZFswXSA6ICh0KS0+Y2hpbGRbMV0pDQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VnbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisvKg0KKyAgRWFjaCBtYWxsb2Mgc3BhY2UgbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgc2VnbWVudHMsIGhlbGQgaW4gYQ0KKyAgbGlzdCBoZWFkZWQgYnkgYW4gZW1iZWRkZWQgbWFsbG9jX3NlZ21lbnQgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUNCisgIHRvcC1tb3N0IHNwYWNlLiBTZWdtZW50cyBhbHNvIGluY2x1ZGUgZmxhZ3MgaG9sZGluZyBwcm9wZXJ0aWVzIG9mDQorICB0aGUgc3BhY2UuIExhcmdlIGNodW5rcyB0aGF0IGFyZSBkaXJlY3RseSBhbGxvY2F0ZWQgYnkgbW1hcCBhcmUgbm90DQorICBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuIFRoZXkgYXJlIGluc3RlYWQgaW5kZXBlbmRlbnRseSBjcmVhdGVkIGFuZA0KKyAgZGVzdHJveWVkIHdpdGhvdXQgb3RoZXJ3aXNlIGtlZXBpbmcgdHJhY2sgb2YgdGhlbS4NCisNCisgIFNlZ21lbnQgbWFuYWdlbWVudCBtYWlubHkgY29tZXMgaW50byBwbGF5IGZvciBzcGFjZXMgYWxsb2NhdGVkIGJ5DQorICBNTUFQLiAgQW55IGNhbGwgdG8gTU1BUCBtaWdodCBvciBtaWdodCBub3QgcmV0dXJuIG1lbW9yeSB0aGF0IGlzDQorICBhZGphY2VudCB0byBhbiBleGlzdGluZyBzZWdtZW50LiAgTU9SRUNPUkUgbm9ybWFsbHkgY29udGlndW91c2x5DQorICBleHRlbmRzIHRoZSBjdXJyZW50IHNwYWNlLCBzbyB0aGlzIHNwYWNlIGlzIGFsbW9zdCBhbHdheXMgYWRqYWNlbnQsDQorICB3aGljaCBpcyBzaW1wbGVyIGFuZCBmYXN0ZXIgdG8gZGVhbCB3aXRoLiAoVGhpcyBpcyB3aHkgTU9SRUNPUkUgaXMNCisgIHVzZWQgcHJlZmVyZW50aWFsbHkgdG8gTU1BUCB3aGVuIGJvdGggYXJlIGF2YWlsYWJsZSAtLSBzZWUNCisgIHN5c19hbGxvYy4pICBXaGVuIGFsbG9jYXRpbmcgdXNpbmcgTU1BUCwgd2UgZG9uJ3QgdXNlIGFueSBvZiB0aGUNCisgIGhpbnRpbmcgbWVjaGFuaXNtcyAoaW5jb25zaXN0ZW50bHkpIHN1cHBvcnRlZCBpbiB2YXJpb3VzDQorICBpbXBsZW1lbnRhdGlvbnMgb2YgdW5peCBtbWFwLCBvciBkaXN0aW5ndWlzaCByZXNlcnZpbmcgZnJvbQ0KKyAgY29tbWl0dGluZyBtZW1vcnkuIEluc3RlYWQsIHdlIGp1c3QgYXNrIGZvciBzcGFjZSwgYW5kIGV4cGxvaXQNCisgIGNvbnRpZ3VpdHkgd2hlbiB3ZSBnZXQgaXQuICBJdCBpcyBwcm9iYWJseSBwb3NzaWJsZSB0byBkbw0KKyAgYmV0dGVyIHRoYW4gdGhpcyBvbiBzb21lIHN5c3RlbXMsIGJ1dCBubyBnZW5lcmFsIHNjaGVtZSBzZWVtcw0KKyAgdG8gYmUgc2lnbmlmaWNhbnRseSBiZXR0ZXIuDQorDQorICBNYW5hZ2VtZW50IGVudGFpbHMgYSBzaW1wbGVyIHZhcmlhbnQgb2YgdGhlIGNvbnNvbGlkYXRpb24gc2NoZW1lDQorICB1c2VkIGZvciBjaHVua3MgdG8gcmVkdWNlIGZyYWdtZW50YXRpb24gLS0gbmV3IGFkamFjZW50IG1lbW9yeSBpcw0KKyAgbm9ybWFsbHkgcHJlcGVuZGVkIG9yIGFwcGVuZGVkIHRvIGFuIGV4aXN0aW5nIHNlZ21lbnQuIEhvd2V2ZXIsDQorICB0aGVyZSBhcmUgbGltaXRhdGlvbnMgY29tcGFyZWQgdG8gY2h1bmsgY29uc29saWRhdGlvbiB0aGF0IG1vc3RseQ0KKyAgcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHNlZ21lbnQgcHJvY2Vzc2luZyBpcyByZWxhdGl2ZWx5IGluZnJlcXVlbnQNCisgIChvY2N1cnJpbmcgb25seSB3aGVuIGdldHRpbmcgbWVtb3J5IGZyb20gc3lzdGVtKSBhbmQgdGhhdCB3ZQ0KKyAgZG9uJ3QgZXhwZWN0IHRvIGhhdmUgaHVnZSBudW1iZXJzIG9mIHNlZ21lbnRzOg0KKw0KKyAgKiBTZWdtZW50cyBhcmUgbm90IGluZGV4ZWQsIHNvIHRyYXZlcnNhbCByZXF1aXJlcyBsaW5lYXIgc2NhbnMuICAoSXQNCisgICAgd291bGQgYmUgcG9zc2libGUgdG8gaW5kZXggdGhlc2UsIGJ1dCBpcyBub3Qgd29ydGggdGhlIGV4dHJhDQorICAgIG92ZXJoZWFkIGFuZCBjb21wbGV4aXR5IGZvciBtb3N0IHByb2dyYW1zIG9uIG1vc3QgcGxhdGZvcm1zLikNCisgICogTmV3IHNlZ21lbnRzIGFyZSBvbmx5IGFwcGVuZGVkIHRvIG9sZCBvbmVzIHdoZW4gaG9sZGluZyB0b3AtbW9zdA0KKyAgICBtZW1vcnk7IGlmIHRoZXkgY2Fubm90IGJlIHByZXBlbmRlZCB0byBvdGhlcnMsIHRoZXkgYXJlIGhlbGQgaW4NCisgICAgZGlmZmVyZW50IHNlZ21lbnRzLg0KKw0KKyAgRXhjZXB0IGZvciB0aGUgdG9wLW1vc3Qgc2VnbWVudCBvZiBhbiBtc3RhdGUsIGVhY2ggc2VnbWVudCByZWNvcmQNCisgIGlzIGtlcHQgYXQgdGhlIHRhaWwgb2YgaXRzIHNlZ21lbnQuIFNlZ21lbnRzIGFyZSBhZGRlZCBieSBwdXNoaW5nDQorICBzZWdtZW50IHJlY29yZHMgb250byB0aGUgbGlzdCBoZWFkZWQgYnkgJm1zdGF0ZS5zZWcgZm9yIHRoZQ0KKyAgY29udGFpbmluZyBtc3RhdGUuDQorDQorICBTZWdtZW50IGZsYWdzIGNvbnRyb2wgYWxsb2NhdGlvbi9tZXJnZS9kZWFsbG9jYXRpb24gcG9saWNpZXM6DQorICAqIElmIEVYVEVSTl9CSVQgc2V0LCB0aGVuIHdlIGRpZCBub3QgYWxsb2NhdGUgdGhpcyBzZWdtZW50LA0KKyAgICBhbmQgc28gc2hvdWxkIG5vdCB0cnkgdG8gZGVhbGxvY2F0ZSBvciBtZXJnZSB3aXRoIG90aGVycy4NCisgICAgKFRoaXMgY3VycmVudGx5IGhvbGRzIG9ubHkgZm9yIHRoZSBpbml0aWFsIHNlZ21lbnQgcGFzc2VkDQorICAgIGludG8gY3JlYXRlX21zcGFjZV93aXRoX2Jhc2UuKQ0KKyAgKiBJZiBVU0VfTU1BUF9CSVQgc2V0LCB0aGUgc2VnbWVudCBtYXkgYmUgbWVyZ2VkIHdpdGgNCisgICAgb3RoZXIgc3Vycm91bmRpbmcgbW1hcHBlZCBzZWdtZW50cyBhbmQgdHJpbW1lZC9kZS1hbGxvY2F0ZWQNCisgICAgdXNpbmcgbXVubWFwLg0KKyAgKiBJZiBuZWl0aGVyIGJpdCBpcyBzZXQsIHRoZW4gdGhlIHNlZ21lbnQgd2FzIG9idGFpbmVkIHVzaW5nDQorICAgIE1PUkVDT1JFIHNvIGNhbiBiZSBtZXJnZWQgd2l0aCBzdXJyb3VuZGluZyBNT1JFQ09SRSdkIHNlZ21lbnRzDQorICAgIGFuZCBkZWFsbG9jYXRlZC90cmltbWVkIHVzaW5nIE1PUkVDT1JFIHdpdGggbmVnYXRpdmUgYXJndW1lbnRzLg0KKyovDQorDQorc3RydWN0IG1hbGxvY19zZWdtZW50IHsNCisgIGNoYXIqICAgICAgICBiYXNlOyAgICAgICAgICAgICAvKiBiYXNlIGFkZHJlc3MgKi8NCisgIHNpemVfdCAgICAgICBzaXplOyAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgc2l6ZSAqLw0KKyAgc3RydWN0IG1hbGxvY19zZWdtZW50KiBuZXh0OyAgIC8qIHB0ciB0byBuZXh0IHNlZ21lbnQgKi8NCisgIGZsYWdfdCAgICAgICBzZmxhZ3M7ICAgICAgICAgICAvKiBtbWFwIGFuZCBleHRlcm4gZmxhZyAqLw0KK307DQorDQorI2RlZmluZSBpc19tbWFwcGVkX3NlZ21lbnQoUykgICgoUyktPnNmbGFncyAmIFVTRV9NTUFQX0JJVCkNCisjZGVmaW5lIGlzX2V4dGVybl9zZWdtZW50KFMpICAgKChTKS0+c2ZsYWdzICYgRVhURVJOX0JJVCkNCisNCit0eXBlZGVmIHN0cnVjdCBtYWxsb2Nfc2VnbWVudCAgbXNlZ21lbnQ7DQordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQqIG1zZWdtZW50cHRyOw0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWFsbG9jX3N0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorLyoNCisgICBBIG1hbGxvY19zdGF0ZSBob2xkcyBhbGwgb2YgdGhlIGJvb2trZWVwaW5nIGZvciBhIHNwYWNlLg0KKyAgIFRoZSBtYWluIGZpZWxkcyBhcmU6DQorDQorICBUb3ANCisgICAgVGhlIHRvcG1vc3QgY2h1bmsgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2VnbWVudC4gSXRzIHNpemUgaXMNCisgICAgY2FjaGVkIGluIHRvcHNpemUuICBUaGUgYWN0dWFsIHNpemUgb2YgdG9wbW9zdCBzcGFjZSBpcw0KKyAgICB0b3BzaXplK1RPUF9GT09UX1NJWkUsIHdoaWNoIGluY2x1ZGVzIHNwYWNlIHJlc2VydmVkIGZvciBhZGRpbmcNCisgICAgZmVuY2Vwb3N0cyBhbmQgc2VnbWVudCByZWNvcmRzIGlmIG5lY2Vzc2FyeSB3aGVuIGdldHRpbmcgbW9yZQ0KKyAgICBzcGFjZSBmcm9tIHRoZSBzeXN0ZW0uICBUaGUgc2l6ZSBhdCB3aGljaCB0byBhdXRvdHJpbSB0b3AgaXMNCisgICAgY2FjaGVkIGZyb20gbXBhcmFtcyBpbiB0cmltX2NoZWNrLCBleGNlcHQgdGhhdCBpdCBpcyBkaXNhYmxlZCBpZg0KKyAgICBhbiBhdXRvdHJpbSBmYWlscy4NCisNCisgIERlc2lnbmF0ZWQgdmljdGltIChkdikNCisgICAgVGhpcyBpcyB0aGUgcHJlZmVycmVkIGNodW5rIGZvciBzZXJ2aWNpbmcgc21hbGwgcmVxdWVzdHMgdGhhdA0KKyAgICBkb24ndCBoYXZlIGV4YWN0IGZpdHMuICBJdCBpcyBub3JtYWxseSB0aGUgY2h1bmsgc3BsaXQgb2ZmIG1vc3QNCisgICAgcmVjZW50bHkgdG8gc2VydmljZSBhbm90aGVyIHNtYWxsIHJlcXVlc3QuICBJdHMgc2l6ZSBpcyBjYWNoZWQgaW4NCisgICAgZHZzaXplLiBUaGUgbGluayBmaWVsZHMgb2YgdGhpcyBjaHVuayBhcmUgbm90IG1haW50YWluZWQgc2luY2UgaXQNCisgICAgaXMgbm90IGtlcHQgaW4gYSBiaW4uDQorDQorICBTbWFsbEJpbnMNCisgICAgQW4gYXJyYXkgb2YgYmluIGhlYWRlcnMgZm9yIGZyZWUgY2h1bmtzLiAgVGhlc2UgYmlucyBob2xkIGNodW5rcw0KKyAgICB3aXRoIHNpemVzIGxlc3MgdGhhbiBNSU5fTEFSR0VfU0laRSBieXRlcy4gRWFjaCBiaW4gY29udGFpbnMNCisgICAgY2h1bmtzIG9mIGFsbCB0aGUgc2FtZSBzaXplLCBzcGFjZWQgOCBieXRlcyBhcGFydC4gIFRvIHNpbXBsaWZ5DQorICAgIHVzZSBpbiBkb3VibGUtbGlua2VkIGxpc3RzLCBlYWNoIGJpbiBoZWFkZXIgYWN0cyBhcyBhIG1hbGxvY19jaHVuaw0KKyAgICBwb2ludGluZyB0byB0aGUgcmVhbCBmaXJzdCBub2RlLCBpZiBpdCBleGlzdHMgKGVsc2UgcG9pbnRpbmcgdG8NCisgICAgaXRzZWxmKS4gIFRoaXMgYXZvaWRzIHNwZWNpYWwtY2FzaW5nIGZvciBoZWFkZXJzLiAgQnV0IHRvIGF2b2lkDQorICAgIHdhc3RlLCB3ZSBhbGxvY2F0ZSBvbmx5IHRoZSBmZC9iayBwb2ludGVycyBvZiBiaW5zLCBhbmQgdGhlbiB1c2UNCisgICAgcmVwb3NpdGlvbmluZyB0cmlja3MgdG8gdHJlYXQgdGhlc2UgYXMgdGhlIGZpZWxkcyBvZiBhIGNodW5rLg0KKw0KKyAgVHJlZUJpbnMNCisgICAgVHJlZWJpbnMgYXJlIHBvaW50ZXJzIHRvIHRoZSByb290cyBvZiB0cmVlcyBob2xkaW5nIGEgcmFuZ2Ugb2YNCisgICAgc2l6ZXMuIFRoZXJlIGFyZSAyIGVxdWFsbHkgc3BhY2VkIHRyZWViaW5zIGZvciBlYWNoIHBvd2VyIG9mIHR3bw0KKyAgICBmcm9tIFRSRUVfU0hJRlQgdG8gVFJFRV9TSElGVCsxNi4gVGhlIGxhc3QgYmluIGhvbGRzIGFueXRoaW5nDQorICAgIGxhcmdlci4NCisNCisgIEJpbiBtYXBzDQorICAgIFRoZXJlIGlzIG9uZSBiaXQgbWFwIGZvciBzbWFsbCBiaW5zICgic21hbGxtYXAiKSBhbmQgb25lIGZvcg0KKyAgICB0cmVlYmlucyAoInRyZWVtYXApLiAgRWFjaCBiaW4gc2V0cyBpdHMgYml0IHdoZW4gbm9uLWVtcHR5LCBhbmQNCisgICAgY2xlYXJzIHRoZSBiaXQgd2hlbiBlbXB0eS4gIEJpdCBvcGVyYXRpb25zIGFyZSB0aGVuIHVzZWQgdG8gYXZvaWQNCisgICAgYmluLWJ5LWJpbiBzZWFyY2hpbmcgLS0gbmVhcmx5IGFsbCAic2VhcmNoIiBpcyBkb25lIHdpdGhvdXQgZXZlcg0KKyAgICBsb29raW5nIGF0IGJpbnMgdGhhdCB3b24ndCBiZSBzZWxlY3RlZC4gIFRoZSBiaXQgbWFwcw0KKyAgICBjb25zZXJ2YXRpdmVseSB1c2UgMzIgYml0cyBwZXIgbWFwIHdvcmQsIGV2ZW4gaWYgb24gNjRiaXQgc3lzdGVtLg0KKyAgICBGb3IgYSBnb29kIGRlc2NyaXB0aW9uIG9mIHNvbWUgb2YgdGhlIGJpdC1iYXNlZCB0ZWNobmlxdWVzIHVzZWQNCisgICAgaGVyZSwgc2VlIEhlbnJ5IFMuIFdhcnJlbiBKcidzIGJvb2sgIkhhY2tlcidzIERlbGlnaHQiIChhbmQNCisgICAgc3VwcGxlbWVudCBhdCBodHRwOi8vaGFja2Vyc2RlbGlnaHQub3JnLykuIE1hbnkgb2YgdGhlc2UgYXJlDQorICAgIGludGVuZGVkIHRvIHJlZHVjZSB0aGUgYnJhbmNoaW5lc3Mgb2YgcGF0aHMgdGhyb3VnaCBtYWxsb2MgZXRjLCBhcw0KKyAgICB3ZWxsIGFzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lbW9yeSBsb2NhdGlvbnMgcmVhZCBvciB3cml0dGVuLg0KKw0KKyAgU2VnbWVudHMNCisgICAgQSBsaXN0IG9mIHNlZ21lbnRzIGhlYWRlZCBieSBhbiBlbWJlZGRlZCBtYWxsb2Nfc2VnbWVudCByZWNvcmQNCisgICAgcmVwcmVzZW50aW5nIHRoZSBpbml0aWFsIHNwYWNlLg0KKw0KKyAgQWRkcmVzcyBjaGVjayBzdXBwb3J0DQorICAgIFRoZSBsZWFzdF9hZGRyIGZpZWxkIGlzIHRoZSBsZWFzdCBhZGRyZXNzIGV2ZXIgb2J0YWluZWQgZnJvbQ0KKyAgICBNT1JFQ09SRSBvciBNTUFQLiBBdHRlbXB0ZWQgZnJlZXMgYW5kIHJlYWxsb2NzIG9mIGFueSBhZGRyZXNzIGxlc3MNCisgICAgdGhhbiB0aGlzIGFyZSB0cmFwcGVkICh1bmxlc3MgSU5TRUNVUkUgaXMgZGVmaW5lZCkuDQorDQorICBNYWdpYyB0YWcNCisgICAgQSBjcm9zcy1jaGVjayBmaWVsZCB0aGF0IHNob3VsZCBhbHdheXMgaG9sZCBzYW1lIHZhbHVlIGFzIG1wYXJhbXMubWFnaWMuDQorDQorICBGbGFncw0KKyAgICBCaXRzIHJlY29yZGluZyB3aGV0aGVyIHRvIHVzZSBNTUFQLCBsb2Nrcywgb3IgY29udGlndW91cyBNT1JFQ09SRQ0KKw0KKyAgU3RhdGlzdGljcw0KKyAgICBFYWNoIHNwYWNlIGtlZXBzIHRyYWNrIG9mIGN1cnJlbnQgYW5kIG1heGltdW0gc3lzdGVtIG1lbW9yeQ0KKyAgICBvYnRhaW5lZCB2aWEgTU9SRUNPUkUgb3IgTU1BUC4NCisNCisgIFRyaW0gc3VwcG9ydA0KKyAgICBGaWVsZHMgaG9sZGluZyB0aGUgYW1vdW50IG9mIHVudXNlZCB0b3Btb3N0IG1lbW9yeSB0aGF0IHNob3VsZCB0cmlnZ2VyDQorICAgIHRpbW1pbmcsIGFuZCBhIGNvdW50ZXIgdG8gZm9yY2UgcGVyaW9kaWMgc2Nhbm5pbmcgdG8gcmVsZWFzZSB1bnVzZWQNCisgICAgbm9uLXRvcG1vc3Qgc2VnbWVudHMuDQorDQorICBMb2NraW5nDQorICAgIElmIFVTRV9MT0NLUyBpcyBkZWZpbmVkLCB0aGUgIm11dGV4IiBsb2NrIGlzIGFjcXVpcmVkIGFuZCByZWxlYXNlZA0KKyAgICBhcm91bmQgZXZlcnkgcHVibGljIGNhbGwgdXNpbmcgdGhpcyBtc3BhY2UuDQorDQorICBFeHRlbnNpb24gc3VwcG9ydA0KKyAgICBBIHZvaWQqIHBvaW50ZXIgYW5kIGEgc2l6ZV90IGZpZWxkIHRoYXQgY2FuIGJlIHVzZWQgdG8gaGVscCBpbXBsZW1lbnQNCisgICAgZXh0ZW5zaW9ucyB0byB0aGlzIG1hbGxvYy4NCisqLw0KKw0KKy8qIEJpbiB0eXBlcywgd2lkdGhzIGFuZCBzaXplcyAqLw0KKyNkZWZpbmUgTlNNQUxMQklOUyAgICAgICAgKDMyVSkNCisjZGVmaW5lIE5UUkVFQklOUyAgICAgICAgICgzMlUpDQorI2RlZmluZSBTTUFMTEJJTl9TSElGVCAgICAoM1UpDQorI2RlZmluZSBTTUFMTEJJTl9XSURUSCAgICAoU0laRV9UX09ORSA8PCBTTUFMTEJJTl9TSElGVCkNCisjZGVmaW5lIFRSRUVCSU5fU0hJRlQgICAgICg4VSkNCisjZGVmaW5lIE1JTl9MQVJHRV9TSVpFICAgIChTSVpFX1RfT05FIDw8IFRSRUVCSU5fU0hJRlQpDQorI2RlZmluZSBNQVhfU01BTExfU0laRSAgICAoTUlOX0xBUkdFX1NJWkUgLSBTSVpFX1RfT05FKQ0KKyNkZWZpbmUgTUFYX1NNQUxMX1JFUVVFU1QgKE1BWF9TTUFMTF9TSVpFIC0gQ0hVTktfQUxJR05fTUFTSyAtIENIVU5LX09WRVJIRUFEKQ0KKw0KK3N0cnVjdCBtYWxsb2Nfc3RhdGUgew0KKyAgYmlubWFwX3QgICBzbWFsbG1hcDsNCisgIGJpbm1hcF90ICAgdHJlZW1hcDsNCisgIHNpemVfdCAgICAgZHZzaXplOw0KKyAgc2l6ZV90ICAgICB0b3BzaXplOw0KKyAgY2hhciogICAgICBsZWFzdF9hZGRyOw0KKyAgbWNodW5rcHRyICBkdjsNCisgIG1jaHVua3B0ciAgdG9wOw0KKyAgc2l6ZV90ICAgICB0cmltX2NoZWNrOw0KKyAgc2l6ZV90ICAgICByZWxlYXNlX2NoZWNrczsNCisgIHNpemVfdCAgICAgbWFnaWM7DQorICBtY2h1bmtwdHIgIHNtYWxsYmluc1soTlNNQUxMQklOUysxKSoyXTsNCisgIHRiaW5wdHIgICAgdHJlZWJpbnNbTlRSRUVCSU5TXTsNCisgIHNpemVfdCAgICAgZm9vdHByaW50Ow0KKyAgc2l6ZV90ICAgICBtYXhfZm9vdHByaW50Ow0KKyAgZmxhZ190ICAgICBtZmxhZ3M7DQorI2lmIFVTRV9MT0NLUw0KKyAgTUxPQ0tfVCAgICBtdXRleDsgICAgIC8qIGxvY2F0ZSBsb2NrIGFtb25nIGZpZWxkcyB0aGF0IHJhcmVseSBjaGFuZ2UgKi8NCisjZW5kaWYgLyogVVNFX0xPQ0tTICovDQorICBtc2VnbWVudCAgIHNlZzsNCisgIHZvaWQqICAgICAgZXh0cDsgICAgICAvKiBVbnVzZWQgYnV0IGF2YWlsYWJsZSBmb3IgZXh0ZW5zaW9ucyAqLw0KKyAgc2l6ZV90ICAgICBleHRzOw0KK307DQorDQordHlwZWRlZiBzdHJ1Y3QgbWFsbG9jX3N0YXRlKiAgICBtc3RhdGU7DQorDQorLyogLS0tLS0tLS0tLS0tLSBHbG9iYWwgbWFsbG9jX3N0YXRlIGFuZCBtYWxsb2NfcGFyYW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisvKg0KKyAgbWFsbG9jX3BhcmFtcyBob2xkcyBnbG9iYWwgcHJvcGVydGllcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgY2FuIGJlDQorICBkeW5hbWljYWxseSBzZXQgdXNpbmcgbWFsbG9wdC4gVGhlcmUgaXMgYSBzaW5nbGUgaW5zdGFuY2UsIG1wYXJhbXMsDQorICBpbml0aWFsaXplZCBpbiBpbml0X21wYXJhbXMuIE5vdGUgdGhhdCB0aGUgbm9uLXplcm9uZXNzIG9mICJtYWdpYyINCisgIGFsc28gc2VydmVzIGFzIGFuIGluaXRpYWxpemF0aW9uIGZsYWcuDQorKi8NCisNCitzdHJ1Y3QgbWFsbG9jX3BhcmFtcyB7DQorICB2b2xhdGlsZSBzaXplX3QgbWFnaWM7DQorICBzaXplX3QgcGFnZV9zaXplOw0KKyAgc2l6ZV90IGdyYW51bGFyaXR5Ow0KKyAgc2l6ZV90IG1tYXBfdGhyZXNob2xkOw0KKyAgc2l6ZV90IHRyaW1fdGhyZXNob2xkOw0KKyAgZmxhZ190IGRlZmF1bHRfbWZsYWdzOw0KK307DQorDQorc3RhdGljIHN0cnVjdCBtYWxsb2NfcGFyYW1zIG1wYXJhbXM7DQorDQorLyogRW5zdXJlIG1wYXJhbXMgaW5pdGlhbGl6ZWQgKi8NCisjZGVmaW5lIGVuc3VyZV9pbml0aWFsaXphdGlvbigpICh2b2lkKShtcGFyYW1zLm1hZ2ljICE9IDAgfHwgaW5pdF9tcGFyYW1zKCkpDQorDQorI2lmICFPTkxZX01TUEFDRVMNCisNCisvKiBUaGUgZ2xvYmFsIG1hbGxvY19zdGF0ZSB1c2VkIGZvciBhbGwgbm9uLSJtc3BhY2UiIGNhbGxzICovDQorc3RhdGljIHN0cnVjdCBtYWxsb2Nfc3RhdGUgX2dtXzsNCisjZGVmaW5lIGdtICAgICAgICAgICAgICAgICAoJl9nbV8pDQorI2RlZmluZSBpc19nbG9iYWwoTSkgICAgICAgKChNKSA9PSAmX2dtXykNCisNCisjZW5kaWYgLyogIU9OTFlfTVNQQUNFUyAqLw0KKw0KKyNkZWZpbmUgaXNfaW5pdGlhbGl6ZWQoTSkgICgoTSktPnRvcCAhPSAwKQ0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN5c3RlbSBhbGxvYyBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorLyogT3BlcmF0aW9ucyBvbiBtZmxhZ3MgKi8NCisNCisjZGVmaW5lIHVzZV9sb2NrKE0pICAgICAgICAgICAoKE0pLT5tZmxhZ3MgJiAgIFVTRV9MT0NLX0JJVCkNCisjZGVmaW5lIGVuYWJsZV9sb2NrKE0pICAgICAgICAoKE0pLT5tZmxhZ3MgfD0gIFVTRV9MT0NLX0JJVCkNCisjZGVmaW5lIGRpc2FibGVfbG9jayhNKSAgICAgICAoKE0pLT5tZmxhZ3MgJj0gflVTRV9MT0NLX0JJVCkNCisNCisjZGVmaW5lIHVzZV9tbWFwKE0pICAgICAgICAgICAoKE0pLT5tZmxhZ3MgJiAgIFVTRV9NTUFQX0JJVCkNCisjZGVmaW5lIGVuYWJsZV9tbWFwKE0pICAgICAgICAoKE0pLT5tZmxhZ3MgfD0gIFVTRV9NTUFQX0JJVCkNCisjZGVmaW5lIGRpc2FibGVfbW1hcChNKSAgICAgICAoKE0pLT5tZmxhZ3MgJj0gflVTRV9NTUFQX0JJVCkNCisNCisjZGVmaW5lIHVzZV9ub25jb250aWd1b3VzKE0pICAoKE0pLT5tZmxhZ3MgJiAgIFVTRV9OT05DT05USUdVT1VTX0JJVCkNCisjZGVmaW5lIGRpc2FibGVfY29udGlndW91cyhNKSAoKE0pLT5tZmxhZ3MgfD0gIFVTRV9OT05DT05USUdVT1VTX0JJVCkNCisNCisjZGVmaW5lIHNldF9sb2NrKE0sTClcDQorICgoTSktPm1mbGFncyA9IChMKT9cDQorICAoKE0pLT5tZmxhZ3MgfCBVU0VfTE9DS19CSVQpIDpcDQorICAoKE0pLT5tZmxhZ3MgJiB+VVNFX0xPQ0tfQklUKSkNCisNCisvKiBwYWdlLWFsaWduIGEgc2l6ZSAqLw0KKyNkZWZpbmUgcGFnZV9hbGlnbihTKVwNCisgKCgoUykgKyAobXBhcmFtcy5wYWdlX3NpemUgLSBTSVpFX1RfT05FKSkgJiB+KG1wYXJhbXMucGFnZV9zaXplIC0gU0laRV9UX09ORSkpDQorDQorLyogZ3JhbnVsYXJpdHktYWxpZ24gYSBzaXplICovDQorI2RlZmluZSBncmFudWxhcml0eV9hbGlnbihTKVwNCisgICgoKFMpICsgKG1wYXJhbXMuZ3JhbnVsYXJpdHkgLSBTSVpFX1RfT05FKSlcDQorICAgJiB+KG1wYXJhbXMuZ3JhbnVsYXJpdHkgLSBTSVpFX1RfT05FKSkNCisNCisNCisvKiBGb3IgbW1hcCwgdXNlIGdyYW51bGFyaXR5IGFsaWdubWVudCBvbiB3aW5kb3dzLCBlbHNlIHBhZ2UtYWxpZ24gKi8NCisjaWZkZWYgV0lOMzINCisjZGVmaW5lIG1tYXBfYWxpZ24oUykgZ3JhbnVsYXJpdHlfYWxpZ24oUykNCisjZWxzZQ0KKyNkZWZpbmUgbW1hcF9hbGlnbihTKSBwYWdlX2FsaWduKFMpDQorI2VuZGlmDQorDQorLyogRm9yIHN5c19hbGxvYywgZW5vdWdoIHBhZGRpbmcgdG8gZW5zdXJlIGNhbiBtYWxsb2MgcmVxdWVzdCBvbiBzdWNjZXNzICovDQorI2RlZmluZSBTWVNfQUxMT0NfUEFERElORyAoVE9QX0ZPT1RfU0laRSArIE1BTExPQ19BTElHTk1FTlQpDQorDQorI2RlZmluZSBpc19wYWdlX2FsaWduZWQoUylcDQorICAgKCgoc2l6ZV90KShTKSAmIChtcGFyYW1zLnBhZ2Vfc2l6ZSAtIFNJWkVfVF9PTkUpKSA9PSAwKQ0KKyNkZWZpbmUgaXNfZ3JhbnVsYXJpdHlfYWxpZ25lZChTKVwNCisgICAoKChzaXplX3QpKFMpICYgKG1wYXJhbXMuZ3JhbnVsYXJpdHkgLSBTSVpFX1RfT05FKSkgPT0gMCkNCisNCisvKiAgVHJ1ZSBpZiBzZWdtZW50IFMgaG9sZHMgYWRkcmVzcyBBICovDQorI2RlZmluZSBzZWdtZW50X2hvbGRzKFMsIEEpXA0KKyAgKChjaGFyKikoQSkgPj0gUy0+YmFzZSAmJiAoY2hhciopKEEpIDwgUy0+YmFzZSArIFMtPnNpemUpDQorDQorLyogUmV0dXJuIHNlZ21lbnQgaG9sZGluZyBnaXZlbiBhZGRyZXNzICovDQorc3RhdGljIG1zZWdtZW50cHRyIHNlZ21lbnRfaG9sZGluZyhtc3RhdGUgbSwgY2hhciogYWRkcikgew0KKyAgbXNlZ21lbnRwdHIgc3AgPSAmbS0+c2VnOw0KKyAgZm9yICg7Oykgew0KKyAgICBpZiAoYWRkciA+PSBzcC0+YmFzZSAmJiBhZGRyIDwgc3AtPmJhc2UgKyBzcC0+c2l6ZSkNCisgICAgICByZXR1cm4gc3A7DQorICAgIGlmICgoc3AgPSBzcC0+bmV4dCkgPT0gMCkNCisgICAgICByZXR1cm4gMDsNCisgIH0NCit9DQorDQorLyogUmV0dXJuIHRydWUgaWYgc2VnbWVudCBjb250YWlucyBhIHNlZ21lbnQgbGluayAqLw0KK3N0YXRpYyBpbnQgaGFzX3NlZ21lbnRfbGluayhtc3RhdGUgbSwgbXNlZ21lbnRwdHIgc3MpIHsNCisgIG1zZWdtZW50cHRyIHNwID0gJm0tPnNlZzsNCisgIGZvciAoOzspIHsNCisgICAgaWYgKChjaGFyKilzcCA+PSBzcy0+YmFzZSAmJiAoY2hhciopc3AgPCBzcy0+YmFzZSArIHNzLT5zaXplKQ0KKyAgICAgIHJldHVybiAxOw0KKyAgICBpZiAoKHNwID0gc3AtPm5leHQpID09IDApDQorICAgICAgcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KKyNpZm5kZWYgTU9SRUNPUkVfQ0FOTk9UX1RSSU0NCisjZGVmaW5lIHNob3VsZF90cmltKE0scykgICgocykgPiAoTSktPnRyaW1fY2hlY2spDQorI2Vsc2UgIC8qIE1PUkVDT1JFX0NBTk5PVF9UUklNICovDQorI2RlZmluZSBzaG91bGRfdHJpbShNLHMpICAoMCkNCisjZW5kaWYgLyogTU9SRUNPUkVfQ0FOTk9UX1RSSU0gKi8NCisNCisvKg0KKyAgVE9QX0ZPT1RfU0laRSBpcyBwYWRkaW5nIGF0IHRoZSBlbmQgb2YgYSBzZWdtZW50LCBpbmNsdWRpbmcgc3BhY2UNCisgIHRoYXQgbWF5IGJlIG5lZWRlZCB0byBwbGFjZSBzZWdtZW50IHJlY29yZHMgYW5kIGZlbmNlcG9zdHMgd2hlbiBuZXcNCisgIG5vbmNvbnRpZ3VvdXMgc2VnbWVudHMgYXJlIGFkZGVkLg0KKyovDQorI2RlZmluZSBUT1BfRk9PVF9TSVpFXA0KKyAgKGFsaWduX29mZnNldChjaHVuazJtZW0oMCkpK3BhZF9yZXF1ZXN0KHNpemVvZihzdHJ1Y3QgbWFsbG9jX3NlZ21lbnQpKStNSU5fQ0hVTktfU0laRSkNCisNCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBIb29rcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKy8qDQorICBQUkVBQ1RJT04gc2hvdWxkIGJlIGRlZmluZWQgdG8gcmV0dXJuIDAgb24gc3VjY2VzcywgYW5kIG5vbnplcm8gb24NCisgIGZhaWx1cmUuIElmIHlvdSBhcmUgbm90IHVzaW5nIGxvY2tpbmcsIHlvdSBjYW4gcmVkZWZpbmUgdGhlc2UgdG8gZG8NCisgIGFueXRoaW5nIHlvdSBsaWtlLg0KKyovDQorDQorI2lmIFVTRV9MT0NLUw0KKw0KKyNkZWZpbmUgUFJFQUNUSU9OKE0pICAoKHVzZV9sb2NrKE0pKT8gQUNRVUlSRV9MT0NLKCYoTSktPm11dGV4KSA6IDApDQorI2RlZmluZSBQT1NUQUNUSU9OKE0pIHsgaWYgKHVzZV9sb2NrKE0pKSBSRUxFQVNFX0xPQ0soJihNKS0+bXV0ZXgpOyB9DQorI2Vsc2UgLyogVVNFX0xPQ0tTICovDQorDQorI2lmbmRlZiBQUkVBQ1RJT04NCisjZGVmaW5lIFBSRUFDVElPTihNKSAoMCkNCisjZW5kaWYgIC8qIFBSRUFDVElPTiAqLw0KKw0KKyNpZm5kZWYgUE9TVEFDVElPTg0KKyNkZWZpbmUgUE9TVEFDVElPTihNKQ0KKyNlbmRpZiAgLyogUE9TVEFDVElPTiAqLw0KKw0KKyNlbmRpZiAvKiBVU0VfTE9DS1MgKi8NCisNCisvKg0KKyAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04gaXMgdHJpZ2dlcmVkIHVwb24gZGV0ZWN0ZWQgYmFkIGFkZHJlc3Nlcy4NCisgIFVTQUdFX0VSUk9SX0FDVElPTiBpcyB0cmlnZ2VyZWQgb24gZGV0ZWN0ZWQgYmFkIGZyZWVzIGFuZA0KKyAgcmVhbGxvY3MuIFRoZSBhcmd1bWVudCBwIGlzIGFuIGFkZHJlc3MgdGhhdCBtaWdodCBoYXZlIHRyaWdnZXJlZCB0aGUNCisgIGZhdWx0LiBJdCBpcyBpZ25vcmVkIGJ5IHRoZSB0d28gcHJlZGVmaW5lZCBhY3Rpb25zLCBidXQgbWlnaHQgYmUNCisgIHVzZWZ1bCBpbiBjdXN0b20gYWN0aW9ucyB0aGF0IHRyeSB0byBoZWxwIGRpYWdub3NlIGVycm9ycy4NCisqLw0KKw0KKyNpZiBQUk9DRUVEX09OX0VSUk9SDQorDQorLyogQSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGNvcnJ1cHRpb24gZXJyb3JzIGNhdXNpbmcgcmVzZXRzICovDQoraW50IG1hbGxvY19jb3JydXB0aW9uX2Vycm9yX2NvdW50Ow0KKw0KKy8qIGRlZmF1bHQgY29ycnVwdGlvbiBhY3Rpb24gKi8NCitzdGF0aWMgdm9pZCByZXNldF9vbl9lcnJvcihtc3RhdGUgbSk7DQorDQorI2RlZmluZSBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihtKSAgcmVzZXRfb25fZXJyb3IobSkNCisjZGVmaW5lIFVTQUdFX0VSUk9SX0FDVElPTihtLCBwKQ0KKw0KKyNlbHNlIC8qIFBST0NFRURfT05fRVJST1IgKi8NCisNCisjaWZuZGVmIENPUlJVUFRJT05fRVJST1JfQUNUSU9ODQorI2RlZmluZSBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihtKSBBQk9SVA0KKyNlbmRpZiAvKiBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTiAqLw0KKw0KKyNpZm5kZWYgVVNBR0VfRVJST1JfQUNUSU9ODQorI2RlZmluZSBVU0FHRV9FUlJPUl9BQ1RJT04obSxwKSBBQk9SVA0KKyNlbmRpZiAvKiBVU0FHRV9FUlJPUl9BQ1RJT04gKi8NCisNCisjZW5kaWYgLyogUFJPQ0VFRF9PTl9FUlJPUiAqLw0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlYnVnZ2luZyBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorI2lmICEgREVCVUcNCisNCisjZGVmaW5lIGNoZWNrX2ZyZWVfY2h1bmsoTSxQKQ0KKyNkZWZpbmUgY2hlY2tfaW51c2VfY2h1bmsoTSxQKQ0KKyNkZWZpbmUgY2hlY2tfbWFsbG9jZWRfY2h1bmsoTSxQLE4pDQorI2RlZmluZSBjaGVja19tbWFwcGVkX2NodW5rKE0sUCkNCisjZGVmaW5lIGNoZWNrX21hbGxvY19zdGF0ZShNKQ0KKyNkZWZpbmUgY2hlY2tfdG9wX2NodW5rKE0sUCkNCisNCisjZWxzZSAvKiBERUJVRyAqLw0KKyNkZWZpbmUgY2hlY2tfZnJlZV9jaHVuayhNLFApICAgICAgIGRvX2NoZWNrX2ZyZWVfY2h1bmsoTSxQKQ0KKyNkZWZpbmUgY2hlY2tfaW51c2VfY2h1bmsoTSxQKSAgICAgIGRvX2NoZWNrX2ludXNlX2NodW5rKE0sUCkNCisjZGVmaW5lIGNoZWNrX3RvcF9jaHVuayhNLFApICAgICAgICBkb19jaGVja190b3BfY2h1bmsoTSxQKQ0KKyNkZWZpbmUgY2hlY2tfbWFsbG9jZWRfY2h1bmsoTSxQLE4pIGRvX2NoZWNrX21hbGxvY2VkX2NodW5rKE0sUCxOKQ0KKyNkZWZpbmUgY2hlY2tfbW1hcHBlZF9jaHVuayhNLFApICAgIGRvX2NoZWNrX21tYXBwZWRfY2h1bmsoTSxQKQ0KKyNkZWZpbmUgY2hlY2tfbWFsbG9jX3N0YXRlKE0pICAgICAgIGRvX2NoZWNrX21hbGxvY19zdGF0ZShNKQ0KKw0KK3N0YXRpYyB2b2lkICAgZG9fY2hlY2tfYW55X2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7DQorc3RhdGljIHZvaWQgICBkb19jaGVja190b3BfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKTsNCitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX21tYXBwZWRfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKTsNCitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX2ludXNlX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7DQorc3RhdGljIHZvaWQgICBkb19jaGVja19mcmVlX2NodW5rKG1zdGF0ZSBtLCBtY2h1bmtwdHIgcCk7DQorc3RhdGljIHZvaWQgICBkb19jaGVja19tYWxsb2NlZF9jaHVuayhtc3RhdGUgbSwgdm9pZCogbWVtLCBzaXplX3Qgcyk7DQorc3RhdGljIHZvaWQgICBkb19jaGVja190cmVlKG1zdGF0ZSBtLCB0Y2h1bmtwdHIgdCk7DQorc3RhdGljIHZvaWQgICBkb19jaGVja190cmVlYmluKG1zdGF0ZSBtLCBiaW5kZXhfdCBpKTsNCitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX3NtYWxsYmluKG1zdGF0ZSBtLCBiaW5kZXhfdCBpKTsNCitzdGF0aWMgdm9pZCAgIGRvX2NoZWNrX21hbGxvY19zdGF0ZShtc3RhdGUgbSk7DQorc3RhdGljIGludCAgICBiaW5fZmluZChtc3RhdGUgbSwgbWNodW5rcHRyIHgpOw0KK3N0YXRpYyBzaXplX3QgdHJhdmVyc2VfYW5kX2NoZWNrKG1zdGF0ZSBtKTsNCisjZW5kaWYgLyogREVCVUcgKi8NCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluZGV4aW5nIEJpbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKyNkZWZpbmUgaXNfc21hbGwocykgICAgICAgICAoKChzKSA+PiBTTUFMTEJJTl9TSElGVCkgPCBOU01BTExCSU5TKQ0KKyNkZWZpbmUgc21hbGxfaW5kZXgocykgICAgICAoKHMpICA+PiBTTUFMTEJJTl9TSElGVCkNCisjZGVmaW5lIHNtYWxsX2luZGV4MnNpemUoaSkgKChpKSAgPDwgU01BTExCSU5fU0hJRlQpDQorI2RlZmluZSBNSU5fU01BTExfSU5ERVggICAgIChzbWFsbF9pbmRleChNSU5fQ0hVTktfU0laRSkpDQorDQorLyogYWRkcmVzc2luZyBieSBpbmRleC4gU2VlIGFib3ZlIGFib3V0IHNtYWxsYmluIHJlcG9zaXRpb25pbmcgKi8NCisjZGVmaW5lIHNtYWxsYmluX2F0KE0sIGkpICAgKChzYmlucHRyKSgoY2hhciopJigoTSktPnNtYWxsYmluc1soaSk8PDFdKSkpDQorI2RlZmluZSB0cmVlYmluX2F0KE0saSkgICAgICgmKChNKS0+dHJlZWJpbnNbaV0pKQ0KKw0KKy8qIGFzc2lnbiB0cmVlIGluZGV4IGZvciBzaXplIFMgdG8gdmFyaWFibGUgSS4gVXNlIHg4NiBhc20gaWYgcG9zc2libGUgICovDQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQ0KKyNkZWZpbmUgY29tcHV0ZV90cmVlX2luZGV4KFMsIEkpXA0KK3tcDQorICB1bnNpZ25lZCBpbnQgWCA9IFMgPj4gVFJFRUJJTl9TSElGVDtcDQorICBpZiAoWCA9PSAwKVwNCisgICAgSSA9IDA7XA0KKyAgZWxzZSBpZiAoWCA+IDB4RkZGRilcDQorICAgIEkgPSBOVFJFRUJJTlMtMTtcDQorICBlbHNlIHtcDQorICAgIHVuc2lnbmVkIGludCBLO1wNCisgICAgX19hc21fXygiYnNybFx0JTEsICUwXG5cdCIgOiAiPXIiIChLKSA6ICJnIiAgKFgpKTtcDQorICAgIEkgPSAgKGJpbmRleF90KSgoSyA8PCAxKSArICgoUyA+PiAoSyArIChUUkVFQklOX1NISUZULTEpKSAmIDEpKSk7XA0KKyAgfVwNCit9DQorDQorI2VsaWYgZGVmaW5lZCAoX19JTlRFTF9DT01QSUxFUikNCisjZGVmaW5lIGNvbXB1dGVfdHJlZV9pbmRleChTLCBJKVwNCit7XA0KKyAgc2l6ZV90IFggPSBTID4+IFRSRUVCSU5fU0hJRlQ7XA0KKyAgaWYgKFggPT0gMClcDQorICAgIEkgPSAwO1wNCisgIGVsc2UgaWYgKFggPiAweEZGRkYpXA0KKyAgICBJID0gTlRSRUVCSU5TLTE7XA0KKyAgZWxzZSB7XA0KKyAgICB1bnNpZ25lZCBpbnQgSyA9IF9iaXRfc2Nhbl9yZXZlcnNlIChYKTsgXA0KKyAgICBJID0gIChiaW5kZXhfdCkoKEsgPDwgMSkgKyAoKFMgPj4gKEsgKyAoVFJFRUJJTl9TSElGVC0xKSkgJiAxKSkpO1wNCisgIH1cDQorfQ0KKw0KKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSPj0xMzAwDQorI2RlZmluZSBjb21wdXRlX3RyZWVfaW5kZXgoUywgSSlcDQore1wNCisgIHNpemVfdCBYID0gUyA+PiBUUkVFQklOX1NISUZUO1wNCisgIGlmIChYID09IDApXA0KKyAgICBJID0gMDtcDQorICBlbHNlIGlmIChYID4gMHhGRkZGKVwNCisgICAgSSA9IE5UUkVFQklOUy0xO1wNCisgIGVsc2Uge1wNCisgICAgdW5zaWduZWQgaW50IEs7XA0KKyAgICBfQml0U2NhblJldmVyc2UoKERXT1JEICopICZLLCBYKTtcDQorICAgIEkgPSAgKGJpbmRleF90KSgoSyA8PCAxKSArICgoUyA+PiAoSyArIChUUkVFQklOX1NISUZULTEpKSAmIDEpKSk7XA0KKyAgfVwNCit9DQorDQorI2Vsc2UgLyogR05VQyAqLw0KKyNkZWZpbmUgY29tcHV0ZV90cmVlX2luZGV4KFMsIEkpXA0KK3tcDQorICBzaXplX3QgWCA9IFMgPj4gVFJFRUJJTl9TSElGVDtcDQorICBpZiAoWCA9PSAwKVwNCisgICAgSSA9IDA7XA0KKyAgZWxzZSBpZiAoWCA+IDB4RkZGRilcDQorICAgIEkgPSBOVFJFRUJJTlMtMTtcDQorICBlbHNlIHtcDQorICAgIHVuc2lnbmVkIGludCBZID0gKHVuc2lnbmVkIGludClYO1wNCisgICAgdW5zaWduZWQgaW50IE4gPSAoKFkgLSAweDEwMCkgPj4gMTYpICYgODtcDQorICAgIHVuc2lnbmVkIGludCBLID0gKCgoWSA8PD0gTikgLSAweDEwMDApID4+IDE2KSAmIDQ7XA0KKyAgICBOICs9IEs7XA0KKyAgICBOICs9IEsgPSAoKChZIDw8PSBLKSAtIDB4NDAwMCkgPj4gMTYpICYgMjtcDQorICAgIEsgPSAxNCAtIE4gKyAoKFkgPDw9IEspID4+IDE1KTtcDQorICAgIEkgPSAoSyA8PCAxKSArICgoUyA+PiAoSyArIChUUkVFQklOX1NISUZULTEpKSAmIDEpKTtcDQorICB9XA0KK30NCisjZW5kaWYgLyogR05VQyAqLw0KKw0KKy8qIEJpdCByZXByZXNlbnRpbmcgbWF4aW11bSByZXNvbHZlZCBzaXplIGluIGEgdHJlZWJpbiBhdCBpICovDQorI2RlZmluZSBiaXRfZm9yX3RyZWVfaW5kZXgoaSkgXA0KKyAgIChpID09IE5UUkVFQklOUy0xKT8gKFNJWkVfVF9CSVRTSVpFLTEpIDogKCgoaSkgPj4gMSkgKyBUUkVFQklOX1NISUZUIC0gMikNCisNCisvKiBTaGlmdCBwbGFjaW5nIG1heGltdW0gcmVzb2x2ZWQgYml0IGluIGEgdHJlZWJpbiBhdCBpIGFzIHNpZ24gYml0ICovDQorI2RlZmluZSBsZWZ0c2hpZnRfZm9yX3RyZWVfaW5kZXgoaSkgXA0KKyAgICgoaSA9PSBOVFJFRUJJTlMtMSk/IDAgOiBcDQorICAgICgoU0laRV9UX0JJVFNJWkUtU0laRV9UX09ORSkgLSAoKChpKSA+PiAxKSArIFRSRUVCSU5fU0hJRlQgLSAyKSkpDQorDQorLyogVGhlIHNpemUgb2YgdGhlIHNtYWxsZXN0IGNodW5rIGhlbGQgaW4gYmluIHdpdGggaW5kZXggaSAqLw0KKyNkZWZpbmUgbWluc2l6ZV9mb3JfdHJlZV9pbmRleChpKSBcDQorICAgKChTSVpFX1RfT05FIDw8ICgoKGkpID4+IDEpICsgVFJFRUJJTl9TSElGVCkpIHwgIFwNCisgICAoKChzaXplX3QpKChpKSAmIFNJWkVfVF9PTkUpKSA8PCAoKChpKSA+PiAxKSArIFRSRUVCSU5fU0hJRlQgLSAxKSkpDQorDQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMgb24gYmluIG1hcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisvKiBiaXQgY29ycmVzcG9uZGluZyB0byBnaXZlbiBpbmRleCAqLw0KKyNkZWZpbmUgaWR4MmJpdChpKSAgICAgICAgICAgICAgKChiaW5tYXBfdCkoMSkgPDwgKGkpKQ0KKw0KKy8qIE1hcmsvQ2xlYXIgYml0cyB3aXRoIGdpdmVuIGluZGV4ICovDQorI2RlZmluZSBtYXJrX3NtYWxsbWFwKE0saSkgICAgICAoKE0pLT5zbWFsbG1hcCB8PSAgaWR4MmJpdChpKSkNCisjZGVmaW5lIGNsZWFyX3NtYWxsbWFwKE0saSkgICAgICgoTSktPnNtYWxsbWFwICY9IH5pZHgyYml0KGkpKQ0KKyNkZWZpbmUgc21hbGxtYXBfaXNfbWFya2VkKE0saSkgKChNKS0+c21hbGxtYXAgJiAgIGlkeDJiaXQoaSkpDQorDQorI2RlZmluZSBtYXJrX3RyZWVtYXAoTSxpKSAgICAgICAoKE0pLT50cmVlbWFwICB8PSAgaWR4MmJpdChpKSkNCisjZGVmaW5lIGNsZWFyX3RyZWVtYXAoTSxpKSAgICAgICgoTSktPnRyZWVtYXAgICY9IH5pZHgyYml0KGkpKQ0KKyNkZWZpbmUgdHJlZW1hcF9pc19tYXJrZWQoTSxpKSAgKChNKS0+dHJlZW1hcCAgJiAgIGlkeDJiaXQoaSkpDQorDQorLyogaXNvbGF0ZSB0aGUgbGVhc3Qgc2V0IGJpdCBvZiBhIGJpdG1hcCAqLw0KKyNkZWZpbmUgbGVhc3RfYml0KHgpICAgICAgICAgKCh4KSAmIC0oeCkpDQorDQorLyogbWFzayB3aXRoIGFsbCBiaXRzIHRvIGxlZnQgb2YgbGVhc3QgYml0IG9mIHggb24gKi8NCisjZGVmaW5lIGxlZnRfYml0cyh4KSAgICAgICAgICgoeDw8MSkgfCAtKHg8PDEpKQ0KKw0KKy8qIG1hc2sgd2l0aCBhbGwgYml0cyB0byBsZWZ0IG9mIG9yIGVxdWFsIHRvIGxlYXN0IGJpdCBvZiB4IG9uICovDQorI2RlZmluZSBzYW1lX29yX2xlZnRfYml0cyh4KSAoKHgpIHwgLSh4KSkNCisNCisvKiBpbmRleCBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGJpdC4gVXNlIHg4NiBhc20gaWYgcG9zc2libGUgKi8NCisNCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpDQorI2RlZmluZSBjb21wdXRlX2JpdDJpZHgoWCwgSSlcDQore1wNCisgIHVuc2lnbmVkIGludCBKO1wNCisgIF9fYXNtX18oImJzZmxcdCUxLCAlMFxuXHQiIDogIj1yIiAoSikgOiAiZyIgKFgpKTtcDQorICBJID0gKGJpbmRleF90KUo7XA0KK30NCisNCisjZWxpZiBkZWZpbmVkIChfX0lOVEVMX0NPTVBJTEVSKQ0KKyNkZWZpbmUgY29tcHV0ZV9iaXQyaWR4KFgsIEkpXA0KK3tcDQorICB1bnNpZ25lZCBpbnQgSjtcDQorICBKID0gX2JpdF9zY2FuX2ZvcndhcmQgKFgpOyBcDQorICBJID0gKGJpbmRleF90KUo7XA0KK30NCisNCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUj49MTMwMA0KKyNkZWZpbmUgY29tcHV0ZV9iaXQyaWR4KFgsIEkpXA0KK3tcDQorICB1bnNpZ25lZCBpbnQgSjtcDQorICBfQml0U2NhbkZvcndhcmQoKERXT1JEICopICZKLCBYKTtcDQorICBJID0gKGJpbmRleF90KUo7XA0KK30NCisNCisjZWxpZiBVU0VfQlVJTFRJTl9GRlMNCisjZGVmaW5lIGNvbXB1dGVfYml0MmlkeChYLCBJKSBJID0gZmZzKFgpLTENCisNCisjZWxzZQ0KKyNkZWZpbmUgY29tcHV0ZV9iaXQyaWR4KFgsIEkpXA0KK3tcDQorICB1bnNpZ25lZCBpbnQgWSA9IFggLSAxO1wNCisgIHVuc2lnbmVkIGludCBLID0gWSA+PiAoMTYtNCkgJiAxNjtcDQorICB1bnNpZ25lZCBpbnQgTiA9IEs7ICAgICAgICBZID4+PSBLO1wNCisgIE4gKz0gSyA9IFkgPj4gKDgtMykgJiAgODsgIFkgPj49IEs7XA0KKyAgTiArPSBLID0gWSA+PiAoNC0yKSAmICA0OyAgWSA+Pj0gSztcDQorICBOICs9IEsgPSBZID4+ICgyLTEpICYgIDI7ICBZID4+PSBLO1wNCisgIE4gKz0gSyA9IFkgPj4gKDEtMCkgJiAgMTsgIFkgPj49IEs7XA0KKyAgSSA9IChiaW5kZXhfdCkoTiArIFkpO1wNCit9DQorI2VuZGlmIC8qIEdOVUMgKi8NCisNCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSdW50aW1lIENoZWNrIFN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKy8qDQorICBGb3Igc2VjdXJpdHksIHRoZSBtYWluIGludmFyaWFudCBpcyB0aGF0IG1hbGxvYy9mcmVlL2V0YyBuZXZlcg0KKyAgd3JpdGVzIHRvIGEgc3RhdGljIGFkZHJlc3Mgb3RoZXIgdGhhbiBtYWxsb2Nfc3RhdGUsIHVubGVzcyBzdGF0aWMNCisgIG1hbGxvY19zdGF0ZSBpdHNlbGYgaGFzIGJlZW4gY29ycnVwdGVkLCB3aGljaCBjYW5ub3Qgb2NjdXIgdmlhDQorICBtYWxsb2MgKGJlY2F1c2Ugb2YgdGhlc2UgY2hlY2tzKS4gSW4gZXNzZW5jZSB0aGlzIG1lYW5zIHRoYXQgd2UNCisgIGJlbGlldmUgYWxsIHBvaW50ZXJzLCBzaXplcywgbWFwcyBldGMgaGVsZCBpbiBtYWxsb2Nfc3RhdGUsIGJ1dA0KKyAgY2hlY2sgYWxsIG9mIHRob3NlIGxpbmtlZCBvciBvZmZzZXR0ZWQgZnJvbSBvdGhlciBlbWJlZGRlZCBkYXRhDQorICBzdHJ1Y3R1cmVzLiAgVGhlc2UgY2hlY2tzIGFyZSBpbnRlcnNwZXJzZWQgd2l0aCBtYWluIGNvZGUgaW4gYSB3YXkNCisgIHRoYXQgdGVuZHMgdG8gbWluaW1pemUgdGhlaXIgcnVuLXRpbWUgY29zdC4NCisNCisgIFdoZW4gRk9PVEVSUyBpcyBkZWZpbmVkLCBpbiBhZGRpdGlvbiB0byByYW5nZSBjaGVja2luZywgd2UgYWxzbw0KKyAgdmVyaWZ5IGZvb3RlciBmaWVsZHMgb2YgaW51c2UgY2h1bmtzLCB3aGljaCBjYW4gYmUgdXNlZCBndWFyYW50ZWUNCisgIHRoYXQgdGhlIG1zdGF0ZSBjb250cm9sbGluZyBtYWxsb2MvZnJlZSBpcyBpbnRhY3QuICBUaGlzIGlzIGENCisgIHN0cmVhbWxpbmVkIHZlcnNpb24gb2YgdGhlIGFwcHJvYWNoIGRlc2NyaWJlZCBieSBXaWxsaWFtIFJvYmVydHNvbg0KKyAgZXQgYWwgaW4gIlJ1bi10aW1lIERldGVjdGlvbiBvZiBIZWFwLWJhc2VkIE92ZXJmbG93cyIgTElTQScwMw0KKyAgaHR0cDovL3d3dy51c2VuaXgub3JnL2V2ZW50cy9saXNhMDMvdGVjaC9yb2JlcnRzb24uaHRtbCBUaGUgZm9vdGVyDQorICBvZiBhbiBpbnVzZSBjaHVuayBob2xkcyB0aGUgeG9yIG9mIGl0cyBtc3RhdGUgYW5kIGEgcmFuZG9tIHNlZWQsDQorICB0aGF0IGlzIGNoZWNrZWQgdXBvbiBjYWxscyB0byBmcmVlKCkgYW5kIHJlYWxsb2MoKS4gIFRoaXMgaXMNCisgIChwcm9iYWJsaXN0aWNhbGx5KSB1bmd1ZXNzYWJsZSBmcm9tIG91dHNpZGUgdGhlIHByb2dyYW0sIGJ1dCBjYW4gYmUNCisgIGNvbXB1dGVkIGJ5IGFueSBjb2RlIHN1Y2Nlc3NmdWxseSBtYWxsb2MnaW5nIGFueSBjaHVuaywgc28gZG9lcyBub3QNCisgIGl0c2VsZiBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBjb2RlIHRoYXQgaGFzIGFscmVhZHkgYnJva2VuDQorICBzZWN1cml0eSB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMuICBVbmxpa2UgUm9iZXJ0c29uIGV0IGFsLCB3ZQ0KKyAgYWx3YXlzIGR5bmFtaWNhbGx5IGNoZWNrIGFkZHJlc3NlcyBvZiBhbGwgb2Zmc2V0IGNodW5rcyAocHJldmlvdXMsDQorICBuZXh0LCBldGMpLiBUaGlzIHR1cm5zIG91dCB0byBiZSBjaGVhcGVyIHRoYW4gcmVseWluZyBvbiBoYXNoZXMuDQorKi8NCisNCisjaWYgIUlOU0VDVVJFDQorLyogQ2hlY2sgaWYgYWRkcmVzcyBhIGlzIGF0IGxlYXN0IGFzIGhpZ2ggYXMgYW55IGZyb20gTU9SRUNPUkUgb3IgTU1BUCAqLw0KKyNkZWZpbmUgb2tfYWRkcmVzcyhNLCBhKSAoKGNoYXIqKShhKSA+PSAoTSktPmxlYXN0X2FkZHIpDQorLyogQ2hlY2sgaWYgYWRkcmVzcyBvZiBuZXh0IGNodW5rIG4gaXMgaGlnaGVyIHRoYW4gYmFzZSBjaHVuayBwICovDQorI2RlZmluZSBva19uZXh0KHAsIG4pICAgICgoY2hhciopKHApIDwgKGNoYXIqKShuKSkNCisvKiBDaGVjayBpZiBwIGhhcyBpbnVzZSBzdGF0dXMgKi8NCisjZGVmaW5lIG9rX2ludXNlKHApICAgICBpc19pbnVzZShwKQ0KKy8qIENoZWNrIGlmIHAgaGFzIGl0cyBwaW51c2UgYml0IG9uICovDQorI2RlZmluZSBva19waW51c2UocCkgICAgIHBpbnVzZShwKQ0KKw0KKyNlbHNlIC8qICFJTlNFQ1VSRSAqLw0KKyNkZWZpbmUgb2tfYWRkcmVzcyhNLCBhKSAoMSkNCisjZGVmaW5lIG9rX25leHQoYiwgbikgICAgKDEpDQorI2RlZmluZSBva19pbnVzZShwKSAgICAgICgxKQ0KKyNkZWZpbmUgb2tfcGludXNlKHApICAgICAoMSkNCisjZW5kaWYgLyogIUlOU0VDVVJFICovDQorDQorI2lmIChGT09URVJTICYmICFJTlNFQ1VSRSkNCisvKiBDaGVjayBpZiAoYWxsZWdlZCkgbXN0YXRlIG0gaGFzIGV4cGVjdGVkIG1hZ2ljIGZpZWxkICovDQorI2RlZmluZSBva19tYWdpYyhNKSAgICAgICgoTSktPm1hZ2ljID09IG1wYXJhbXMubWFnaWMpDQorI2Vsc2UgIC8qIChGT09URVJTICYmICFJTlNFQ1VSRSkgKi8NCisjZGVmaW5lIG9rX21hZ2ljKE0pICAgICAgKDEpDQorI2VuZGlmIC8qIChGT09URVJTICYmICFJTlNFQ1VSRSkgKi8NCisNCisNCisvKiBJbiBnY2MsIHVzZSBfX2J1aWx0aW5fZXhwZWN0IHRvIG1pbmltaXplIGltcGFjdCBvZiBjaGVja3MgKi8NCisjaWYgIUlOU0VDVVJFDQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDMNCisjZGVmaW5lIFJUQ0hFQ0soZSkgIF9fYnVpbHRpbl9leHBlY3QoZSwgMSkNCisjZWxzZSAvKiBHTlVDICovDQorI2RlZmluZSBSVENIRUNLKGUpICAoZSkNCisjZW5kaWYgLyogR05VQyAqLw0KKyNlbHNlIC8qICFJTlNFQ1VSRSAqLw0KKyNkZWZpbmUgUlRDSEVDSyhlKSAgKDEpDQorI2VuZGlmIC8qICFJTlNFQ1VSRSAqLw0KKw0KKy8qIG1hY3JvcyB0byBzZXQgdXAgaW51c2UgY2h1bmtzIHdpdGggb3Igd2l0aG91dCBmb290ZXJzICovDQorDQorI2lmICFGT09URVJTDQorDQorI2RlZmluZSBtYXJrX2ludXNlX2Zvb3QoTSxwLHMpDQorDQorLyogTWFjcm9zIGZvciBzZXR0aW5nIGhlYWQvZm9vdCBvZiBub24tbW1hcHBlZCBjaHVua3MgKi8NCisNCisvKiBTZXQgY2ludXNlIGJpdCBhbmQgcGludXNlIGJpdCBvZiBuZXh0IGNodW5rICovDQorI2RlZmluZSBzZXRfaW51c2UoTSxwLHMpXA0KKyAgKChwKS0+aGVhZCA9ICgoKHApLT5oZWFkICYgUElOVVNFX0JJVCl8c3xDSU5VU0VfQklUKSxcDQorICAoKG1jaHVua3B0cikoKChjaGFyKikocCkpICsgKHMpKSktPmhlYWQgfD0gUElOVVNFX0JJVCkNCisNCisvKiBTZXQgY2ludXNlIGFuZCBwaW51c2Ugb2YgdGhpcyBjaHVuayBhbmQgcGludXNlIG9mIG5leHQgY2h1bmsgKi8NCisjZGVmaW5lIHNldF9pbnVzZV9hbmRfcGludXNlKE0scCxzKVwNCisgICgocCktPmhlYWQgPSAoc3xQSU5VU0VfQklUfENJTlVTRV9CSVQpLFwNCisgICgobWNodW5rcHRyKSgoKGNoYXIqKShwKSkgKyAocykpKS0+aGVhZCB8PSBQSU5VU0VfQklUKQ0KKw0KKy8qIFNldCBzaXplLCBjaW51c2UgYW5kIHBpbnVzZSBiaXQgb2YgdGhpcyBjaHVuayAqLw0KKyNkZWZpbmUgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhNLCBwLCBzKVwNCisgICgocCktPmhlYWQgPSAoc3xQSU5VU0VfQklUfENJTlVTRV9CSVQpKQ0KKw0KKyNlbHNlIC8qIEZPT1RFUlMgKi8NCisNCisvKiBTZXQgZm9vdCBvZiBpbnVzZSBjaHVuayB0byBiZSB4b3Igb2YgbXN0YXRlIGFuZCBzZWVkICovDQorI2RlZmluZSBtYXJrX2ludXNlX2Zvb3QoTSxwLHMpXA0KKyAgKCgobWNodW5rcHRyKSgoY2hhciopKHApICsgKHMpKSktPnByZXZfZm9vdCA9ICgoc2l6ZV90KShNKSBeIG1wYXJhbXMubWFnaWMpKQ0KKw0KKyNkZWZpbmUgZ2V0X21zdGF0ZV9mb3IocClcDQorICAoKG1zdGF0ZSkoKChtY2h1bmtwdHIpKChjaGFyKikocCkgK1wNCisgICAgKGNodW5rc2l6ZShwKSkpKS0+cHJldl9mb290IF4gbXBhcmFtcy5tYWdpYykpDQorDQorI2RlZmluZSBzZXRfaW51c2UoTSxwLHMpXA0KKyAgKChwKS0+aGVhZCA9ICgoKHApLT5oZWFkICYgUElOVVNFX0JJVCl8c3xDSU5VU0VfQklUKSxcDQorICAoKChtY2h1bmtwdHIpKCgoY2hhciopKHApKSArIChzKSkpLT5oZWFkIHw9IFBJTlVTRV9CSVQpLCBcDQorICBtYXJrX2ludXNlX2Zvb3QoTSxwLHMpKQ0KKw0KKyNkZWZpbmUgc2V0X2ludXNlX2FuZF9waW51c2UoTSxwLHMpXA0KKyAgKChwKS0+aGVhZCA9IChzfFBJTlVTRV9CSVR8Q0lOVVNFX0JJVCksXA0KKyAgKCgobWNodW5rcHRyKSgoKGNoYXIqKShwKSkgKyAocykpKS0+aGVhZCB8PSBQSU5VU0VfQklUKSxcDQorIG1hcmtfaW51c2VfZm9vdChNLHAscykpDQorDQorI2RlZmluZSBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKE0sIHAsIHMpXA0KKyAgKChwKS0+aGVhZCA9IChzfFBJTlVTRV9CSVR8Q0lOVVNFX0JJVCksXA0KKyAgbWFya19pbnVzZV9mb290KE0sIHAsIHMpKQ0KKw0KKyNlbmRpZiAvKiAhRk9PVEVSUyAqLw0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2V0dGluZyBtcGFyYW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorLyogSW5pdGlhbGl6ZSBtcGFyYW1zICovDQorc3RhdGljIGludCBpbml0X21wYXJhbXModm9pZCkgew0KKyNpZmRlZiBORUVEX0dMT0JBTF9MT0NLX0lOSVQNCisgIGlmIChtYWxsb2NfZ2xvYmFsX211dGV4X3N0YXR1cyA8PSAwKQ0KKyAgICBpbml0X21hbGxvY19nbG9iYWxfbXV0ZXgoKTsNCisjZW5kaWYNCisNCisgIEFDUVVJUkVfTUFMTE9DX0dMT0JBTF9MT0NLKCk7DQorICBpZiAobXBhcmFtcy5tYWdpYyA9PSAwKSB7DQorICAgIHNpemVfdCBtYWdpYzsNCisgICAgc2l6ZV90IHBzaXplOw0KKyAgICBzaXplX3QgZ3NpemU7DQorDQorI2lmbmRlZiBXSU4zMg0KKyAgICBwc2l6ZSA9IG1hbGxvY19nZXRwYWdlc2l6ZTsNCisgICAgZ3NpemUgPSAoKERFRkFVTFRfR1JBTlVMQVJJVFkgIT0gMCk/IERFRkFVTFRfR1JBTlVMQVJJVFkgOiBwc2l6ZSk7DQorI2Vsc2UgLyogV0lOMzIgKi8NCisgICAgew0KKyAgICAgIFNZU1RFTV9JTkZPIHN5c3RlbV9pbmZvOw0KKyAgICAgIEdldFN5c3RlbUluZm8oJnN5c3RlbV9pbmZvKTsNCisgICAgICBwc2l6ZSA9IHN5c3RlbV9pbmZvLmR3UGFnZVNpemU7DQorICAgICAgZ3NpemUgPSAoKERFRkFVTFRfR1JBTlVMQVJJVFkgIT0gMCk/DQorICAgICAgICAgICAgICAgREVGQVVMVF9HUkFOVUxBUklUWSA6IHN5c3RlbV9pbmZvLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5KTsNCisgICAgfQ0KKyNlbmRpZiAvKiBXSU4zMiAqLw0KKw0KKyAgICAvKiBTYW5pdHktY2hlY2sgY29uZmlndXJhdGlvbjoNCisgICAgICAgc2l6ZV90IG11c3QgYmUgdW5zaWduZWQgYW5kIGFzIHdpZGUgYXMgcG9pbnRlciB0eXBlLg0KKyAgICAgICBpbnRzIG11c3QgYmUgYXQgbGVhc3QgNCBieXRlcy4NCisgICAgICAgYWxpZ25tZW50IG11c3QgYmUgYXQgbGVhc3QgOC4NCisgICAgICAgQWxpZ25tZW50LCBtaW4gY2h1bmsgc2l6ZSwgYW5kIHBhZ2Ugc2l6ZSBtdXN0IGFsbCBiZSBwb3dlcnMgb2YgMi4NCisgICAgKi8NCisgICAgaWYgKChzaXplb2Yoc2l6ZV90KSAhPSBzaXplb2YoY2hhciopKSB8fA0KKyAgICAgICAgKE1BWF9TSVpFX1QgPCBNSU5fQ0hVTktfU0laRSkgIHx8DQorICAgICAgICAoc2l6ZW9mKGludCkgPCA0KSAgfHwNCisgICAgICAgIChNQUxMT0NfQUxJR05NRU5UIDwgKHNpemVfdCk4VSkgfHwNCisgICAgICAgICgoTUFMTE9DX0FMSUdOTUVOVCAmIChNQUxMT0NfQUxJR05NRU5ULVNJWkVfVF9PTkUpKSAhPSAwKSB8fA0KKyAgICAgICAgKChNQ0hVTktfU0laRSAgICAgICYgKE1DSFVOS19TSVpFLVNJWkVfVF9PTkUpKSAgICAgICE9IDApIHx8DQorICAgICAgICAoKGdzaXplICAgICAgICAgICAgJiAoZ3NpemUtU0laRV9UX09ORSkpICAgICAgICAgICAgIT0gMCkgfHwNCisgICAgICAgICgocHNpemUgICAgICAgICAgICAmIChwc2l6ZS1TSVpFX1RfT05FKSkgICAgICAgICAgICAhPSAwKSkNCisgICAgICBBQk9SVDsNCisNCisgICAgbXBhcmFtcy5ncmFudWxhcml0eSA9IGdzaXplOw0KKyAgICBtcGFyYW1zLnBhZ2Vfc2l6ZSA9IHBzaXplOw0KKyAgICBtcGFyYW1zLm1tYXBfdGhyZXNob2xkID0gREVGQVVMVF9NTUFQX1RIUkVTSE9MRDsNCisgICAgbXBhcmFtcy50cmltX3RocmVzaG9sZCA9IERFRkFVTFRfVFJJTV9USFJFU0hPTEQ7DQorI2lmIE1PUkVDT1JFX0NPTlRJR1VPVVMNCisgICAgbXBhcmFtcy5kZWZhdWx0X21mbGFncyA9IFVTRV9MT0NLX0JJVHxVU0VfTU1BUF9CSVQ7DQorI2Vsc2UgIC8qIE1PUkVDT1JFX0NPTlRJR1VPVVMgKi8NCisgICAgbXBhcmFtcy5kZWZhdWx0X21mbGFncyA9IFVTRV9MT0NLX0JJVHxVU0VfTU1BUF9CSVR8VVNFX05PTkNPTlRJR1VPVVNfQklUOw0KKyNlbmRpZiAvKiBNT1JFQ09SRV9DT05USUdVT1VTICovDQorDQorI2lmICFPTkxZX01TUEFDRVMNCisgICAgLyogU2V0IHVwIGxvY2sgZm9yIG1haW4gbWFsbG9jIGFyZWEgKi8NCisgICAgZ20tPm1mbGFncyA9IG1wYXJhbXMuZGVmYXVsdF9tZmxhZ3M7DQorICAgIElOSVRJQUxfTE9DSygmZ20tPm11dGV4KTsNCisjZW5kaWYNCisNCisgICAgew0KKyNpZiBVU0VfREVWX1JBTkRPTQ0KKyAgICAgIGludCBmZDsNCisgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZltzaXplb2Yoc2l6ZV90KV07DQorICAgICAgLyogVHJ5IHRvIHVzZSAvZGV2L3VyYW5kb20sIGVsc2UgZmFsbCBiYWNrIG9uIHVzaW5nIHRpbWUgKi8NCisgICAgICBpZiAoKGZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpKSA+PSAwICYmDQorICAgICAgICAgIHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID09IHNpemVvZihidWYpKSB7DQorICAgICAgICBtYWdpYyA9ICooKHNpemVfdCAqKSBidWYpOw0KKyAgICAgICAgY2xvc2UoZmQpOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorI2VuZGlmIC8qIFVTRV9ERVZfUkFORE9NICovDQorI2lmZGVmIFdJTjMyDQorICAgICAgICBtYWdpYyA9IChzaXplX3QpKEdldFRpY2tDb3VudCgpIF4gKHNpemVfdCkweDU1NTU1NTU1VSk7DQorI2Vsc2UNCisgICAgICAgIG1hZ2ljID0gKHNpemVfdCkodGltZSgwKSBeIChzaXplX3QpMHg1NTU1NTU1NVUpOw0KKyNlbmRpZg0KKyAgICAgIG1hZ2ljIHw9IChzaXplX3QpOFU7ICAgIC8qIGVuc3VyZSBub256ZXJvICovDQorICAgICAgbWFnaWMgJj0gfihzaXplX3QpN1U7ICAgLyogaW1wcm92ZSBjaGFuY2VzIG9mIGZhdWx0IGZvciBiYWQgdmFsdWVzICovDQorICAgICAgbXBhcmFtcy5tYWdpYyA9IG1hZ2ljOw0KKyAgICB9DQorICB9DQorDQorICBSRUxFQVNFX01BTExPQ19HTE9CQUxfTE9DSygpOw0KKyAgcmV0dXJuIDE7DQorfQ0KKw0KKy8qIHN1cHBvcnQgZm9yIG1hbGxvcHQgKi8NCitzdGF0aWMgaW50IGNoYW5nZV9tcGFyYW0oaW50IHBhcmFtX251bWJlciwgaW50IHZhbHVlKSB7DQorICBzaXplX3QgdmFsOw0KKyAgZW5zdXJlX2luaXRpYWxpemF0aW9uKCk7DQorICB2YWwgPSAodmFsdWUgPT0gLTEpPyBNQVhfU0laRV9UIDogKHNpemVfdCl2YWx1ZTsNCisgIHN3aXRjaChwYXJhbV9udW1iZXIpIHsNCisgIGNhc2UgTV9UUklNX1RIUkVTSE9MRDoNCisgICAgbXBhcmFtcy50cmltX3RocmVzaG9sZCA9IHZhbDsNCisgICAgcmV0dXJuIDE7DQorICBjYXNlIE1fR1JBTlVMQVJJVFk6DQorICAgIGlmICh2YWwgPj0gbXBhcmFtcy5wYWdlX3NpemUgJiYgKCh2YWwgJiAodmFsLTEpKSA9PSAwKSkgew0KKyAgICAgIG1wYXJhbXMuZ3JhbnVsYXJpdHkgPSB2YWw7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIHJldHVybiAwOw0KKyAgY2FzZSBNX01NQVBfVEhSRVNIT0xEOg0KKyAgICBtcGFyYW1zLm1tYXBfdGhyZXNob2xkID0gdmFsOw0KKyAgICByZXR1cm4gMTsNCisgIGRlZmF1bHQ6DQorICAgIHJldHVybiAwOw0KKyAgfQ0KK30NCisNCisjaWYgREVCVUcNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlYnVnZ2luZyBTdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKy8qIENoZWNrIHByb3BlcnRpZXMgb2YgYW55IGNodW5rLCB3aGV0aGVyIGZyZWUsIGludXNlLCBtbWFwcGVkIGV0YyAgKi8NCitzdGF0aWMgdm9pZCBkb19jaGVja19hbnlfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7DQorICBhc3NlcnQoKGlzX2FsaWduZWQoY2h1bmsybWVtKHApKSkgfHwgKHAtPmhlYWQgPT0gRkVOQ0VQT1NUX0hFQUQpKTsNCisgIGFzc2VydChva19hZGRyZXNzKG0sIHApKTsNCit9DQorDQorLyogQ2hlY2sgcHJvcGVydGllcyBvZiB0b3AgY2h1bmsgKi8NCitzdGF0aWMgdm9pZCBkb19jaGVja190b3BfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7DQorICBtc2VnbWVudHB0ciBzcCA9IHNlZ21lbnRfaG9sZGluZyhtLCAoY2hhciopcCk7DQorICBzaXplX3QgIHN6ID0gcC0+aGVhZCAmIH5JTlVTRV9CSVRTOyAvKiB0aGlyZC1sb3dlc3QgYml0IGNhbiBiZSBzZXQhICovDQorICBhc3NlcnQoc3AgIT0gMCk7DQorICBhc3NlcnQoKGlzX2FsaWduZWQoY2h1bmsybWVtKHApKSkgfHwgKHAtPmhlYWQgPT0gRkVOQ0VQT1NUX0hFQUQpKTsNCisgIGFzc2VydChva19hZGRyZXNzKG0sIHApKTsNCisgIGFzc2VydChzeiA9PSBtLT50b3BzaXplKTsNCisgIGFzc2VydChzeiA+IDApOw0KKyAgYXNzZXJ0KHN6ID09ICgoc3AtPmJhc2UgKyBzcC0+c2l6ZSkgLSAoY2hhciopcCkgLSBUT1BfRk9PVF9TSVpFKTsNCisgIGFzc2VydChwaW51c2UocCkpOw0KKyAgYXNzZXJ0KCFwaW51c2UoY2h1bmtfcGx1c19vZmZzZXQocCwgc3opKSk7DQorfQ0KKw0KKy8qIENoZWNrIHByb3BlcnRpZXMgb2YgKGludXNlKSBtbWFwcGVkIGNodW5rcyAqLw0KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX21tYXBwZWRfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7DQorICBzaXplX3QgIHN6ID0gY2h1bmtzaXplKHApOw0KKyAgc2l6ZV90IGxlbiA9IChzeiArIChwLT5wcmV2X2Zvb3QpICsgTU1BUF9GT09UX1BBRCk7DQorICBhc3NlcnQoaXNfbW1hcHBlZChwKSk7DQorICBhc3NlcnQodXNlX21tYXAobSkpOw0KKyAgYXNzZXJ0KChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpIHx8IChwLT5oZWFkID09IEZFTkNFUE9TVF9IRUFEKSk7DQorICBhc3NlcnQob2tfYWRkcmVzcyhtLCBwKSk7DQorICBhc3NlcnQoIWlzX3NtYWxsKHN6KSk7DQorICBhc3NlcnQoKGxlbiAmIChtcGFyYW1zLnBhZ2Vfc2l6ZS1TSVpFX1RfT05FKSkgPT0gMCk7DQorICBhc3NlcnQoY2h1bmtfcGx1c19vZmZzZXQocCwgc3opLT5oZWFkID09IEZFTkNFUE9TVF9IRUFEKTsNCisgIGFzc2VydChjaHVua19wbHVzX29mZnNldChwLCBzeitTSVpFX1RfU0laRSktPmhlYWQgPT0gMCk7DQorfQ0KKw0KKy8qIENoZWNrIHByb3BlcnRpZXMgb2YgaW51c2UgY2h1bmtzICovDQorc3RhdGljIHZvaWQgZG9fY2hlY2tfaW51c2VfY2h1bmsobXN0YXRlIG0sIG1jaHVua3B0ciBwKSB7DQorICBkb19jaGVja19hbnlfY2h1bmsobSwgcCk7DQorICBhc3NlcnQoaXNfaW51c2UocCkpOw0KKyAgYXNzZXJ0KG5leHRfcGludXNlKHApKTsNCisgIC8qIElmIG5vdCBwaW51c2UgYW5kIG5vdCBtbWFwcGVkLCBwcmV2aW91cyBjaHVuayBoYXMgT0sgb2Zmc2V0ICovDQorICBhc3NlcnQoaXNfbW1hcHBlZChwKSB8fCBwaW51c2UocCkgfHwgbmV4dF9jaHVuayhwcmV2X2NodW5rKHApKSA9PSBwKTsNCisgIGlmIChpc19tbWFwcGVkKHApKQ0KKyAgICBkb19jaGVja19tbWFwcGVkX2NodW5rKG0sIHApOw0KK30NCisNCisvKiBDaGVjayBwcm9wZXJ0aWVzIG9mIGZyZWUgY2h1bmtzICovDQorc3RhdGljIHZvaWQgZG9fY2hlY2tfZnJlZV9jaHVuayhtc3RhdGUgbSwgbWNodW5rcHRyIHApIHsNCisgIHNpemVfdCBzeiA9IGNodW5rc2l6ZShwKTsNCisgIG1jaHVua3B0ciBuZXh0ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgc3opOw0KKyAgZG9fY2hlY2tfYW55X2NodW5rKG0sIHApOw0KKyAgYXNzZXJ0KCFpc19pbnVzZShwKSk7DQorICBhc3NlcnQoIW5leHRfcGludXNlKHApKTsNCisgIGFzc2VydCAoIWlzX21tYXBwZWQocCkpOw0KKyAgaWYgKHAgIT0gbS0+ZHYgJiYgcCAhPSBtLT50b3ApIHsNCisgICAgaWYgKHN6ID49IE1JTl9DSFVOS19TSVpFKSB7DQorICAgICAgYXNzZXJ0KChzeiAmIENIVU5LX0FMSUdOX01BU0spID09IDApOw0KKyAgICAgIGFzc2VydChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpOw0KKyAgICAgIGFzc2VydChuZXh0LT5wcmV2X2Zvb3QgPT0gc3opOw0KKyAgICAgIGFzc2VydChwaW51c2UocCkpOw0KKyAgICAgIGFzc2VydCAobmV4dCA9PSBtLT50b3AgfHwgaXNfaW51c2UobmV4dCkpOw0KKyAgICAgIGFzc2VydChwLT5mZC0+YmsgPT0gcCk7DQorICAgICAgYXNzZXJ0KHAtPmJrLT5mZCA9PSBwKTsNCisgICAgfQ0KKyAgICBlbHNlICAvKiBtYXJrZXJzIGFyZSBhbHdheXMgb2Ygc2l6ZSBTSVpFX1RfU0laRSAqLw0KKyAgICAgIGFzc2VydChzeiA9PSBTSVpFX1RfU0laRSk7DQorICB9DQorfQ0KKw0KKy8qIENoZWNrIHByb3BlcnRpZXMgb2YgbWFsbG9jZWQgY2h1bmtzIGF0IHRoZSBwb2ludCB0aGV5IGFyZSBtYWxsb2NlZCAqLw0KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX21hbGxvY2VkX2NodW5rKG1zdGF0ZSBtLCB2b2lkKiBtZW0sIHNpemVfdCBzKSB7DQorICBpZiAobWVtICE9IDApIHsNCisgICAgbWNodW5rcHRyIHAgPSBtZW0yY2h1bmsobWVtKTsNCisgICAgc2l6ZV90IHN6ID0gcC0+aGVhZCAmIH5JTlVTRV9CSVRTOw0KKyAgICBkb19jaGVja19pbnVzZV9jaHVuayhtLCBwKTsNCisgICAgYXNzZXJ0KChzeiAmIENIVU5LX0FMSUdOX01BU0spID09IDApOw0KKyAgICBhc3NlcnQoc3ogPj0gTUlOX0NIVU5LX1NJWkUpOw0KKyAgICBhc3NlcnQoc3ogPj0gcyk7DQorICAgIC8qIHVubGVzcyBtbWFwcGVkLCBzaXplIGlzIGxlc3MgdGhhbiBNSU5fQ0hVTktfU0laRSBtb3JlIHRoYW4gcmVxdWVzdCAqLw0KKyAgICBhc3NlcnQoaXNfbW1hcHBlZChwKSB8fCBzeiA8IChzICsgTUlOX0NIVU5LX1NJWkUpKTsNCisgIH0NCit9DQorDQorLyogQ2hlY2sgYSB0cmVlIGFuZCBpdHMgc3VidHJlZXMuICAqLw0KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX3RyZWUobXN0YXRlIG0sIHRjaHVua3B0ciB0KSB7DQorICB0Y2h1bmtwdHIgaGVhZCA9IDA7DQorICB0Y2h1bmtwdHIgdSA9IHQ7DQorICBiaW5kZXhfdCB0aW5kZXggPSB0LT5pbmRleDsNCisgIHNpemVfdCB0c2l6ZSA9IGNodW5rc2l6ZSh0KTsNCisgIGJpbmRleF90IGlkeDsNCisgIGNvbXB1dGVfdHJlZV9pbmRleCh0c2l6ZSwgaWR4KTsNCisgIGFzc2VydCh0aW5kZXggPT0gaWR4KTsNCisgIGFzc2VydCh0c2l6ZSA+PSBNSU5fTEFSR0VfU0laRSk7DQorICBhc3NlcnQodHNpemUgPj0gbWluc2l6ZV9mb3JfdHJlZV9pbmRleChpZHgpKTsNCisgIGFzc2VydCgoaWR4ID09IE5UUkVFQklOUy0xKSB8fCAodHNpemUgPCBtaW5zaXplX2Zvcl90cmVlX2luZGV4KChpZHgrMSkpKSk7DQorDQorICBkbyB7IC8qIHRyYXZlcnNlIHRocm91Z2ggY2hhaW4gb2Ygc2FtZS1zaXplZCBub2RlcyAqLw0KKyAgICBkb19jaGVja19hbnlfY2h1bmsobSwgKChtY2h1bmtwdHIpdSkpOw0KKyAgICBhc3NlcnQodS0+aW5kZXggPT0gdGluZGV4KTsNCisgICAgYXNzZXJ0KGNodW5rc2l6ZSh1KSA9PSB0c2l6ZSk7DQorICAgIGFzc2VydCghaXNfaW51c2UodSkpOw0KKyAgICBhc3NlcnQoIW5leHRfcGludXNlKHUpKTsNCisgICAgYXNzZXJ0KHUtPmZkLT5iayA9PSB1KTsNCisgICAgYXNzZXJ0KHUtPmJrLT5mZCA9PSB1KTsNCisgICAgaWYgKHUtPnBhcmVudCA9PSAwKSB7DQorICAgICAgYXNzZXJ0KHUtPmNoaWxkWzBdID09IDApOw0KKyAgICAgIGFzc2VydCh1LT5jaGlsZFsxXSA9PSAwKTsNCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICBhc3NlcnQoaGVhZCA9PSAwKTsgLyogb25seSBvbmUgbm9kZSBvbiBjaGFpbiBoYXMgcGFyZW50ICovDQorICAgICAgaGVhZCA9IHU7DQorICAgICAgYXNzZXJ0KHUtPnBhcmVudCAhPSB1KTsNCisgICAgICBhc3NlcnQgKHUtPnBhcmVudC0+Y2hpbGRbMF0gPT0gdSB8fA0KKyAgICAgICAgICAgICAgdS0+cGFyZW50LT5jaGlsZFsxXSA9PSB1IHx8DQorICAgICAgICAgICAgICAqKCh0YmlucHRyKikodS0+cGFyZW50KSkgPT0gdSk7DQorICAgICAgaWYgKHUtPmNoaWxkWzBdICE9IDApIHsNCisgICAgICAgIGFzc2VydCh1LT5jaGlsZFswXS0+cGFyZW50ID09IHUpOw0KKyAgICAgICAgYXNzZXJ0KHUtPmNoaWxkWzBdICE9IHUpOw0KKyAgICAgICAgZG9fY2hlY2tfdHJlZShtLCB1LT5jaGlsZFswXSk7DQorICAgICAgfQ0KKyAgICAgIGlmICh1LT5jaGlsZFsxXSAhPSAwKSB7DQorICAgICAgICBhc3NlcnQodS0+Y2hpbGRbMV0tPnBhcmVudCA9PSB1KTsNCisgICAgICAgIGFzc2VydCh1LT5jaGlsZFsxXSAhPSB1KTsNCisgICAgICAgIGRvX2NoZWNrX3RyZWUobSwgdS0+Y2hpbGRbMV0pOw0KKyAgICAgIH0NCisgICAgICBpZiAodS0+Y2hpbGRbMF0gIT0gMCAmJiB1LT5jaGlsZFsxXSAhPSAwKSB7DQorICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHUtPmNoaWxkWzBdKSA8IGNodW5rc2l6ZSh1LT5jaGlsZFsxXSkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICB1ID0gdS0+ZmQ7DQorICB9IHdoaWxlICh1ICE9IHQpOw0KKyAgYXNzZXJ0KGhlYWQgIT0gMCk7DQorfQ0KKw0KKy8qICBDaGVjayBhbGwgdGhlIGNodW5rcyBpbiBhIHRyZWViaW4uICAqLw0KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX3RyZWViaW4obXN0YXRlIG0sIGJpbmRleF90IGkpIHsNCisgIHRiaW5wdHIqIHRiID0gdHJlZWJpbl9hdChtLCBpKTsNCisgIHRjaHVua3B0ciB0ID0gKnRiOw0KKyAgaW50IGVtcHR5ID0gKG0tPnRyZWVtYXAgJiAoMVUgPDwgaSkpID09IDA7DQorICBpZiAodCA9PSAwKQ0KKyAgICBhc3NlcnQoZW1wdHkpOw0KKyAgaWYgKCFlbXB0eSkNCisgICAgZG9fY2hlY2tfdHJlZShtLCB0KTsNCit9DQorDQorLyogIENoZWNrIGFsbCB0aGUgY2h1bmtzIGluIGEgc21hbGxiaW4uICAqLw0KK3N0YXRpYyB2b2lkIGRvX2NoZWNrX3NtYWxsYmluKG1zdGF0ZSBtLCBiaW5kZXhfdCBpKSB7DQorICBzYmlucHRyIGIgPSBzbWFsbGJpbl9hdChtLCBpKTsNCisgIG1jaHVua3B0ciBwID0gYi0+Yms7DQorICB1bnNpZ25lZCBpbnQgZW1wdHkgPSAobS0+c21hbGxtYXAgJiAoMVUgPDwgaSkpID09IDA7DQorICBpZiAocCA9PSBiKQ0KKyAgICBhc3NlcnQoZW1wdHkpOw0KKyAgaWYgKCFlbXB0eSkgew0KKyAgICBmb3IgKDsgcCAhPSBiOyBwID0gcC0+YmspIHsNCisgICAgICBzaXplX3Qgc2l6ZSA9IGNodW5rc2l6ZShwKTsNCisgICAgICBtY2h1bmtwdHIgcTsNCisgICAgICAvKiBlYWNoIGNodW5rIGNsYWltcyB0byBiZSBmcmVlICovDQorICAgICAgZG9fY2hlY2tfZnJlZV9jaHVuayhtLCBwKTsNCisgICAgICAvKiBjaHVuayBiZWxvbmdzIGluIGJpbiAqLw0KKyAgICAgIGFzc2VydChzbWFsbF9pbmRleChzaXplKSA9PSBpKTsNCisgICAgICBhc3NlcnQocC0+YmsgPT0gYiB8fCBjaHVua3NpemUocC0+YmspID09IGNodW5rc2l6ZShwKSk7DQorICAgICAgLyogY2h1bmsgaXMgZm9sbG93ZWQgYnkgYW4gaW51c2UgY2h1bmsgKi8NCisgICAgICBxID0gbmV4dF9jaHVuayhwKTsNCisgICAgICBpZiAocS0+aGVhZCAhPSBGRU5DRVBPU1RfSEVBRCkNCisgICAgICAgIGRvX2NoZWNrX2ludXNlX2NodW5rKG0sIHEpOw0KKyAgICB9DQorICB9DQorfQ0KKw0KKy8qIEZpbmQgeCBpbiBhIGJpbi4gVXNlZCBpbiBvdGhlciBjaGVjayBmdW5jdGlvbnMuICovDQorc3RhdGljIGludCBiaW5fZmluZChtc3RhdGUgbSwgbWNodW5rcHRyIHgpIHsNCisgIHNpemVfdCBzaXplID0gY2h1bmtzaXplKHgpOw0KKyAgaWYgKGlzX3NtYWxsKHNpemUpKSB7DQorICAgIGJpbmRleF90IHNpZHggPSBzbWFsbF9pbmRleChzaXplKTsNCisgICAgc2JpbnB0ciBiID0gc21hbGxiaW5fYXQobSwgc2lkeCk7DQorICAgIGlmIChzbWFsbG1hcF9pc19tYXJrZWQobSwgc2lkeCkpIHsNCisgICAgICBtY2h1bmtwdHIgcCA9IGI7DQorICAgICAgZG8gew0KKyAgICAgICAgaWYgKHAgPT0geCkNCisgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfSB3aGlsZSAoKHAgPSBwLT5mZCkgIT0gYik7DQorICAgIH0NCisgIH0NCisgIGVsc2Ugew0KKyAgICBiaW5kZXhfdCB0aWR4Ow0KKyAgICBjb21wdXRlX3RyZWVfaW5kZXgoc2l6ZSwgdGlkeCk7DQorICAgIGlmICh0cmVlbWFwX2lzX21hcmtlZChtLCB0aWR4KSkgew0KKyAgICAgIHRjaHVua3B0ciB0ID0gKnRyZWViaW5fYXQobSwgdGlkeCk7DQorICAgICAgc2l6ZV90IHNpemViaXRzID0gc2l6ZSA8PCBsZWZ0c2hpZnRfZm9yX3RyZWVfaW5kZXgodGlkeCk7DQorICAgICAgd2hpbGUgKHQgIT0gMCAmJiBjaHVua3NpemUodCkgIT0gc2l6ZSkgew0KKyAgICAgICAgdCA9IHQtPmNoaWxkWyhzaXplYml0cyA+PiAoU0laRV9UX0JJVFNJWkUtU0laRV9UX09ORSkpICYgMV07DQorICAgICAgICBzaXplYml0cyA8PD0gMTsNCisgICAgICB9DQorICAgICAgaWYgKHQgIT0gMCkgew0KKyAgICAgICAgdGNodW5rcHRyIHUgPSB0Ow0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICBpZiAodSA9PSAodGNodW5rcHRyKXgpDQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICB9IHdoaWxlICgodSA9IHUtPmZkKSAhPSB0KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCisvKiBUcmF2ZXJzZSBlYWNoIGNodW5rIGFuZCBjaGVjayBpdDsgcmV0dXJuIHRvdGFsICovDQorc3RhdGljIHNpemVfdCB0cmF2ZXJzZV9hbmRfY2hlY2sobXN0YXRlIG0pIHsNCisgIHNpemVfdCBzdW0gPSAwOw0KKyAgaWYgKGlzX2luaXRpYWxpemVkKG0pKSB7DQorICAgIG1zZWdtZW50cHRyIHMgPSAmbS0+c2VnOw0KKyAgICBzdW0gKz0gbS0+dG9wc2l6ZSArIFRPUF9GT09UX1NJWkU7DQorICAgIHdoaWxlIChzICE9IDApIHsNCisgICAgICBtY2h1bmtwdHIgcSA9IGFsaWduX2FzX2NodW5rKHMtPmJhc2UpOw0KKyAgICAgIG1jaHVua3B0ciBsYXN0cSA9IDA7DQorICAgICAgYXNzZXJ0KHBpbnVzZShxKSk7DQorICAgICAgd2hpbGUgKHNlZ21lbnRfaG9sZHMocywgcSkgJiYNCisgICAgICAgICAgICAgcSAhPSBtLT50b3AgJiYgcS0+aGVhZCAhPSBGRU5DRVBPU1RfSEVBRCkgew0KKyAgICAgICAgc3VtICs9IGNodW5rc2l6ZShxKTsNCisgICAgICAgIGlmIChpc19pbnVzZShxKSkgew0KKyAgICAgICAgICBhc3NlcnQoIWJpbl9maW5kKG0sIHEpKTsNCisgICAgICAgICAgZG9fY2hlY2tfaW51c2VfY2h1bmsobSwgcSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgYXNzZXJ0KHEgPT0gbS0+ZHYgfHwgYmluX2ZpbmQobSwgcSkpOw0KKyAgICAgICAgICBhc3NlcnQobGFzdHEgPT0gMCB8fCBpc19pbnVzZShsYXN0cSkpOyAvKiBOb3QgMiBjb25zZWN1dGl2ZSBmcmVlICovDQorICAgICAgICAgIGRvX2NoZWNrX2ZyZWVfY2h1bmsobSwgcSk7DQorICAgICAgICB9DQorICAgICAgICBsYXN0cSA9IHE7DQorICAgICAgICBxID0gbmV4dF9jaHVuayhxKTsNCisgICAgICB9DQorICAgICAgcyA9IHMtPm5leHQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBzdW07DQorfQ0KKw0KKy8qIENoZWNrIGFsbCBwcm9wZXJ0aWVzIG9mIG1hbGxvY19zdGF0ZS4gKi8NCitzdGF0aWMgdm9pZCBkb19jaGVja19tYWxsb2Nfc3RhdGUobXN0YXRlIG0pIHsNCisgIGJpbmRleF90IGk7DQorICBzaXplX3QgdG90YWw7DQorICAvKiBjaGVjayBiaW5zICovDQorICBmb3IgKGkgPSAwOyBpIDwgTlNNQUxMQklOUzsgKytpKQ0KKyAgICBkb19jaGVja19zbWFsbGJpbihtLCBpKTsNCisgIGZvciAoaSA9IDA7IGkgPCBOVFJFRUJJTlM7ICsraSkNCisgICAgZG9fY2hlY2tfdHJlZWJpbihtLCBpKTsNCisNCisgIGlmIChtLT5kdnNpemUgIT0gMCkgeyAvKiBjaGVjayBkdiBjaHVuayAqLw0KKyAgICBkb19jaGVja19hbnlfY2h1bmsobSwgbS0+ZHYpOw0KKyAgICBhc3NlcnQobS0+ZHZzaXplID09IGNodW5rc2l6ZShtLT5kdikpOw0KKyAgICBhc3NlcnQobS0+ZHZzaXplID49IE1JTl9DSFVOS19TSVpFKTsNCisgICAgYXNzZXJ0KGJpbl9maW5kKG0sIG0tPmR2KSA9PSAwKTsNCisgIH0NCisNCisgIGlmIChtLT50b3AgIT0gMCkgeyAgIC8qIGNoZWNrIHRvcCBjaHVuayAqLw0KKyAgICBkb19jaGVja190b3BfY2h1bmsobSwgbS0+dG9wKTsNCisgICAgLyphc3NlcnQobS0+dG9wc2l6ZSA9PSBjaHVua3NpemUobS0+dG9wKSk7IHJlZHVuZGFudCAqLw0KKyAgICBhc3NlcnQobS0+dG9wc2l6ZSA+IDApOw0KKyAgICBhc3NlcnQoYmluX2ZpbmQobSwgbS0+dG9wKSA9PSAwKTsNCisgIH0NCisNCisgIHRvdGFsID0gdHJhdmVyc2VfYW5kX2NoZWNrKG0pOw0KKyAgYXNzZXJ0KHRvdGFsIDw9IG0tPmZvb3RwcmludCk7DQorICBhc3NlcnQobS0+Zm9vdHByaW50IDw9IG0tPm1heF9mb290cHJpbnQpOw0KK30NCisjZW5kaWYgLyogREVCVUcgKi8NCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0aXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKyNpZiAhTk9fTUFMTElORk8NCitzdGF0aWMgc3RydWN0IG1hbGxpbmZvIGludGVybmFsX21hbGxpbmZvKG1zdGF0ZSBtKSB7DQorICBzdHJ1Y3QgbWFsbGluZm8gbm0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsNCisgIGVuc3VyZV9pbml0aWFsaXphdGlvbigpOw0KKyAgaWYgKCFQUkVBQ1RJT04obSkpIHsNCisgICAgY2hlY2tfbWFsbG9jX3N0YXRlKG0pOw0KKyAgICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsNCisgICAgICBzaXplX3QgbmZyZWUgPSBTSVpFX1RfT05FOyAvKiB0b3AgYWx3YXlzIGZyZWUgKi8NCisgICAgICBzaXplX3QgbWZyZWUgPSBtLT50b3BzaXplICsgVE9QX0ZPT1RfU0laRTsNCisgICAgICBzaXplX3Qgc3VtID0gbWZyZWU7DQorICAgICAgbXNlZ21lbnRwdHIgcyA9ICZtLT5zZWc7DQorICAgICAgd2hpbGUgKHMgIT0gMCkgew0KKyAgICAgICAgbWNodW5rcHRyIHEgPSBhbGlnbl9hc19jaHVuayhzLT5iYXNlKTsNCisgICAgICAgIHdoaWxlIChzZWdtZW50X2hvbGRzKHMsIHEpICYmDQorICAgICAgICAgICAgICAgcSAhPSBtLT50b3AgJiYgcS0+aGVhZCAhPSBGRU5DRVBPU1RfSEVBRCkgew0KKyAgICAgICAgICBzaXplX3Qgc3ogPSBjaHVua3NpemUocSk7DQorICAgICAgICAgIHN1bSArPSBzejsNCisgICAgICAgICAgaWYgKCFpc19pbnVzZShxKSkgew0KKyAgICAgICAgICAgIG1mcmVlICs9IHN6Ow0KKyAgICAgICAgICAgICsrbmZyZWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcSA9IG5leHRfY2h1bmsocSk7DQorICAgICAgICB9DQorICAgICAgICBzID0gcy0+bmV4dDsNCisgICAgICB9DQorDQorICAgICAgbm0uYXJlbmEgICAgPSBzdW07DQorICAgICAgbm0ub3JkYmxrcyAgPSBuZnJlZTsNCisgICAgICBubS5oYmxraGQgICA9IG0tPmZvb3RwcmludCAtIHN1bTsNCisgICAgICBubS51c21ibGtzICA9IG0tPm1heF9mb290cHJpbnQ7DQorICAgICAgbm0udW9yZGJsa3MgPSBtLT5mb290cHJpbnQgLSBtZnJlZTsNCisgICAgICBubS5mb3JkYmxrcyA9IG1mcmVlOw0KKyAgICAgIG5tLmtlZXBjb3N0ID0gbS0+dG9wc2l6ZTsNCisgICAgfQ0KKw0KKyAgICBQT1NUQUNUSU9OKG0pOw0KKyAgfQ0KKyAgcmV0dXJuIG5tOw0KK30NCisjZW5kaWYgLyogIU5PX01BTExJTkZPICovDQorDQorc3RhdGljIHZvaWQgaW50ZXJuYWxfbWFsbG9jX3N0YXRzKG1zdGF0ZSBtKSB7DQorICBlbnN1cmVfaW5pdGlhbGl6YXRpb24oKTsNCisgIGlmICghUFJFQUNUSU9OKG0pKSB7DQorICAgIHNpemVfdCBtYXhmcCA9IDA7DQorICAgIHNpemVfdCBmcCA9IDA7DQorICAgIHNpemVfdCB1c2VkID0gMDsNCisgICAgY2hlY2tfbWFsbG9jX3N0YXRlKG0pOw0KKyAgICBpZiAoaXNfaW5pdGlhbGl6ZWQobSkpIHsNCisgICAgICBtc2VnbWVudHB0ciBzID0gJm0tPnNlZzsNCisgICAgICBtYXhmcCA9IG0tPm1heF9mb290cHJpbnQ7DQorICAgICAgZnAgPSBtLT5mb290cHJpbnQ7DQorICAgICAgdXNlZCA9IGZwIC0gKG0tPnRvcHNpemUgKyBUT1BfRk9PVF9TSVpFKTsNCisNCisgICAgICB3aGlsZSAocyAhPSAwKSB7DQorICAgICAgICBtY2h1bmtwdHIgcSA9IGFsaWduX2FzX2NodW5rKHMtPmJhc2UpOw0KKyAgICAgICAgd2hpbGUgKHNlZ21lbnRfaG9sZHMocywgcSkgJiYNCisgICAgICAgICAgICAgICBxICE9IG0tPnRvcCAmJiBxLT5oZWFkICE9IEZFTkNFUE9TVF9IRUFEKSB7DQorICAgICAgICAgIGlmICghaXNfaW51c2UocSkpDQorICAgICAgICAgICAgdXNlZCAtPSBjaHVua3NpemUocSk7DQorICAgICAgICAgIHEgPSBuZXh0X2NodW5rKHEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcyA9IHMtPm5leHQ7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGZwcmludGYoc3RkZXJyLCAibWF4IHN5c3RlbSBieXRlcyA9ICUxMGx1XG4iLCAodW5zaWduZWQgbG9uZykobWF4ZnApKTsNCisgICAgZnByaW50ZihzdGRlcnIsICJzeXN0ZW0gYnl0ZXMgICAgID0gJTEwbHVcbiIsICh1bnNpZ25lZCBsb25nKShmcCkpOw0KKyAgICBmcHJpbnRmKHN0ZGVyciwgImluIHVzZSBieXRlcyAgICAgPSAlMTBsdVxuIiwgKHVuc2lnbmVkIGxvbmcpKHVzZWQpKTsNCisNCisgICAgUE9TVEFDVElPTihtKTsNCisgIH0NCit9DQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW9ucyBvbiBzbWFsbGJpbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisvKg0KKyAgVmFyaW91cyBmb3JtcyBvZiBsaW5raW5nIGFuZCB1bmxpbmtpbmcgYXJlIGRlZmluZWQgYXMgbWFjcm9zLiAgRXZlbg0KKyAgdGhlIG9uZXMgZm9yIHRyZWVzLCB3aGljaCBhcmUgdmVyeSBsb25nIGJ1dCBoYXZlIHZlcnkgc2hvcnQgdHlwaWNhbA0KKyAgcGF0aHMuICBUaGlzIGlzIHVnbHkgYnV0IHJlZHVjZXMgcmVsaWFuY2Ugb24gaW5saW5pbmcgc3VwcG9ydCBvZg0KKyAgY29tcGlsZXJzLg0KKyovDQorDQorLyogTGluayBhIGZyZWUgY2h1bmsgaW50byBhIHNtYWxsYmluICAqLw0KKyNkZWZpbmUgaW5zZXJ0X3NtYWxsX2NodW5rKE0sIFAsIFMpIHtcDQorICBiaW5kZXhfdCBJICA9IHNtYWxsX2luZGV4KFMpO1wNCisgIG1jaHVua3B0ciBCID0gc21hbGxiaW5fYXQoTSwgSSk7XA0KKyAgbWNodW5rcHRyIEYgPSBCO1wNCisgIGFzc2VydChTID49IE1JTl9DSFVOS19TSVpFKTtcDQorICBpZiAoIXNtYWxsbWFwX2lzX21hcmtlZChNLCBJKSlcDQorICAgIG1hcmtfc21hbGxtYXAoTSwgSSk7XA0KKyAgZWxzZSBpZiAoUlRDSEVDSyhva19hZGRyZXNzKE0sIEItPmZkKSkpXA0KKyAgICBGID0gQi0+ZmQ7XA0KKyAgZWxzZSB7XA0KKyAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcDQorICB9XA0KKyAgQi0+ZmQgPSBQO1wNCisgIEYtPmJrID0gUDtcDQorICBQLT5mZCA9IEY7XA0KKyAgUC0+YmsgPSBCO1wNCit9DQorDQorLyogVW5saW5rIGEgY2h1bmsgZnJvbSBhIHNtYWxsYmluICAqLw0KKyNkZWZpbmUgdW5saW5rX3NtYWxsX2NodW5rKE0sIFAsIFMpIHtcDQorICBtY2h1bmtwdHIgRiA9IFAtPmZkO1wNCisgIG1jaHVua3B0ciBCID0gUC0+Yms7XA0KKyAgYmluZGV4X3QgSSA9IHNtYWxsX2luZGV4KFMpO1wNCisgIGFzc2VydChQICE9IEIpO1wNCisgIGFzc2VydChQICE9IEYpO1wNCisgIGFzc2VydChjaHVua3NpemUoUCkgPT0gc21hbGxfaW5kZXgyc2l6ZShJKSk7XA0KKyAgaWYgKEYgPT0gQilcDQorICAgIGNsZWFyX3NtYWxsbWFwKE0sIEkpO1wNCisgIGVsc2UgaWYgKFJUQ0hFQ0soKEYgPT0gc21hbGxiaW5fYXQoTSxJKSB8fCBva19hZGRyZXNzKE0sIEYpKSAmJlwNCisgICAgICAgICAgICAgICAgICAgKEIgPT0gc21hbGxiaW5fYXQoTSxJKSB8fCBva19hZGRyZXNzKE0sIEIpKSkpIHtcDQorICAgIEYtPmJrID0gQjtcDQorICAgIEItPmZkID0gRjtcDQorICB9XA0KKyAgZWxzZSB7XA0KKyAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcDQorICB9XA0KK30NCisNCisvKiBVbmxpbmsgdGhlIGZpcnN0IGNodW5rIGZyb20gYSBzbWFsbGJpbiAqLw0KKyNkZWZpbmUgdW5saW5rX2ZpcnN0X3NtYWxsX2NodW5rKE0sIEIsIFAsIEkpIHtcDQorICBtY2h1bmtwdHIgRiA9IFAtPmZkO1wNCisgIGFzc2VydChQICE9IEIpO1wNCisgIGFzc2VydChQICE9IEYpO1wNCisgIGFzc2VydChjaHVua3NpemUoUCkgPT0gc21hbGxfaW5kZXgyc2l6ZShJKSk7XA0KKyAgaWYgKEIgPT0gRilcDQorICAgIGNsZWFyX3NtYWxsbWFwKE0sIEkpO1wNCisgIGVsc2UgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBGKSkpIHtcDQorICAgIEItPmZkID0gRjtcDQorICAgIEYtPmJrID0gQjtcDQorICB9XA0KKyAgZWxzZSB7XA0KKyAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcDQorICB9XA0KK30NCisNCisNCisNCisvKiBSZXBsYWNlIGR2IG5vZGUsIGJpbm5pbmcgdGhlIG9sZCBvbmUgKi8NCisvKiBVc2VkIG9ubHkgd2hlbiBkdnNpemUga25vd24gdG8gYmUgc21hbGwgKi8NCisjZGVmaW5lIHJlcGxhY2VfZHYoTSwgUCwgUykge1wNCisgIHNpemVfdCBEVlMgPSBNLT5kdnNpemU7XA0KKyAgaWYgKERWUyAhPSAwKSB7XA0KKyAgICBtY2h1bmtwdHIgRFYgPSBNLT5kdjtcDQorICAgIGFzc2VydChpc19zbWFsbChEVlMpKTtcDQorICAgIGluc2VydF9zbWFsbF9jaHVuayhNLCBEViwgRFZTKTtcDQorICB9XA0KKyAgTS0+ZHZzaXplID0gUztcDQorICBNLT5kdiA9IFA7XA0KK30NCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMgb24gdHJlZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKy8qIEluc2VydCBjaHVuayBpbnRvIHRyZWUgKi8NCisjZGVmaW5lIGluc2VydF9sYXJnZV9jaHVuayhNLCBYLCBTKSB7XA0KKyAgdGJpbnB0ciogSDtcDQorICBiaW5kZXhfdCBJO1wNCisgIGNvbXB1dGVfdHJlZV9pbmRleChTLCBJKTtcDQorICBIID0gdHJlZWJpbl9hdChNLCBJKTtcDQorICBYLT5pbmRleCA9IEk7XA0KKyAgWC0+Y2hpbGRbMF0gPSBYLT5jaGlsZFsxXSA9IDA7XA0KKyAgaWYgKCF0cmVlbWFwX2lzX21hcmtlZChNLCBJKSkge1wNCisgICAgbWFya190cmVlbWFwKE0sIEkpO1wNCisgICAgKkggPSBYO1wNCisgICAgWC0+cGFyZW50ID0gKHRjaHVua3B0cilIO1wNCisgICAgWC0+ZmQgPSBYLT5iayA9IFg7XA0KKyAgfVwNCisgIGVsc2Uge1wNCisgICAgdGNodW5rcHRyIFQgPSAqSDtcDQorICAgIHNpemVfdCBLID0gUyA8PCBsZWZ0c2hpZnRfZm9yX3RyZWVfaW5kZXgoSSk7XA0KKyAgICBmb3IgKDs7KSB7XA0KKyAgICAgIGlmIChjaHVua3NpemUoVCkgIT0gUykge1wNCisgICAgICAgIHRjaHVua3B0ciogQyA9ICYoVC0+Y2hpbGRbKEsgPj4gKFNJWkVfVF9CSVRTSVpFLVNJWkVfVF9PTkUpKSAmIDFdKTtcDQorICAgICAgICBLIDw8PSAxO1wNCisgICAgICAgIGlmICgqQyAhPSAwKVwNCisgICAgICAgICAgVCA9ICpDO1wNCisgICAgICAgIGVsc2UgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBDKSkpIHtcDQorICAgICAgICAgICpDID0gWDtcDQorICAgICAgICAgIFgtPnBhcmVudCA9IFQ7XA0KKyAgICAgICAgICBYLT5mZCA9IFgtPmJrID0gWDtcDQorICAgICAgICAgIGJyZWFrO1wNCisgICAgICAgIH1cDQorICAgICAgICBlbHNlIHtcDQorICAgICAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wNCisgICAgICAgICAgYnJlYWs7XA0KKyAgICAgICAgfVwNCisgICAgICB9XA0KKyAgICAgIGVsc2Uge1wNCisgICAgICAgIHRjaHVua3B0ciBGID0gVC0+ZmQ7XA0KKyAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBUKSAmJiBva19hZGRyZXNzKE0sIEYpKSkge1wNCisgICAgICAgICAgVC0+ZmQgPSBGLT5iayA9IFg7XA0KKyAgICAgICAgICBYLT5mZCA9IEY7XA0KKyAgICAgICAgICBYLT5iayA9IFQ7XA0KKyAgICAgICAgICBYLT5wYXJlbnQgPSAwO1wNCisgICAgICAgICAgYnJlYWs7XA0KKyAgICAgICAgfVwNCisgICAgICAgIGVsc2Uge1wNCisgICAgICAgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XA0KKyAgICAgICAgICBicmVhaztcDQorICAgICAgICB9XA0KKyAgICAgIH1cDQorICAgIH1cDQorICB9XA0KK30NCisNCisvKg0KKyAgVW5saW5rIHN0ZXBzOg0KKw0KKyAgMS4gSWYgeCBpcyBhIGNoYWluZWQgbm9kZSwgdW5saW5rIGl0IGZyb20gaXRzIHNhbWUtc2l6ZWQgZmQvYmsgbGlua3MNCisgICAgIGFuZCBjaG9vc2UgaXRzIGJrIG5vZGUgYXMgaXRzIHJlcGxhY2VtZW50Lg0KKyAgMi4gSWYgeCB3YXMgdGhlIGxhc3Qgbm9kZSBvZiBpdHMgc2l6ZSwgYnV0IG5vdCBhIGxlYWYgbm9kZSwgaXQgbXVzdA0KKyAgICAgYmUgcmVwbGFjZWQgd2l0aCBhIGxlYWYgbm9kZSAobm90IG1lcmVseSBvbmUgd2l0aCBhbiBvcGVuIGxlZnQgb3INCisgICAgIHJpZ2h0KSwgdG8gbWFrZSBzdXJlIHRoYXQgbGVmdHMgYW5kIHJpZ2h0cyBvZiBkZXNjZW5kZW50cw0KKyAgICAgY29ycmVzcG9uZCBwcm9wZXJseSB0byBiaXQgbWFza3MuICBXZSB1c2UgdGhlIHJpZ2h0bW9zdCBkZXNjZW5kZW50DQorICAgICBvZiB4LiAgV2UgY291bGQgdXNlIGFueSBvdGhlciBsZWFmLCBidXQgdGhpcyBpcyBlYXN5IHRvIGxvY2F0ZSBhbmQNCisgICAgIHRlbmRzIHRvIGNvdW50ZXJhY3QgcmVtb3ZhbCBvZiBsZWZ0bW9zdHMgZWxzZXdoZXJlLCBhbmQgc28ga2VlcHMNCisgICAgIHBhdGhzIHNob3J0ZXIgdGhhbiBtaW5pbWFsbHkgZ3VhcmFudGVlZC4gIFRoaXMgZG9lc24ndCBsb29wIG11Y2gNCisgICAgIGJlY2F1c2Ugb24gYXZlcmFnZSBhIG5vZGUgaW4gYSB0cmVlIGlzIG5lYXIgdGhlIGJvdHRvbS4NCisgIDMuIElmIHggaXMgdGhlIGJhc2Ugb2YgYSBjaGFpbiAoaS5lLiwgaGFzIHBhcmVudCBsaW5rcykgcmVsaW5rDQorICAgICB4J3MgcGFyZW50IGFuZCBjaGlsZHJlbiB0byB4J3MgcmVwbGFjZW1lbnQgKG9yIG51bGwgaWYgbm9uZSkuDQorKi8NCisNCisjZGVmaW5lIHVubGlua19sYXJnZV9jaHVuayhNLCBYKSB7XA0KKyAgdGNodW5rcHRyIFhQID0gWC0+cGFyZW50O1wNCisgIHRjaHVua3B0ciBSO1wNCisgIGlmIChYLT5iayAhPSBYKSB7XA0KKyAgICB0Y2h1bmtwdHIgRiA9IFgtPmZkO1wNCisgICAgUiA9IFgtPmJrO1wNCisgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBGKSkpIHtcDQorICAgICAgRi0+YmsgPSBSO1wNCisgICAgICBSLT5mZCA9IEY7XA0KKyAgICB9XA0KKyAgICBlbHNlIHtcDQorICAgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XA0KKyAgICB9XA0KKyAgfVwNCisgIGVsc2Uge1wNCisgICAgdGNodW5rcHRyKiBSUDtcDQorICAgIGlmICgoKFIgPSAqKFJQID0gJihYLT5jaGlsZFsxXSkpKSAhPSAwKSB8fFwNCisgICAgICAgICgoUiA9ICooUlAgPSAmKFgtPmNoaWxkWzBdKSkpICE9IDApKSB7XA0KKyAgICAgIHRjaHVua3B0ciogQ1A7XA0KKyAgICAgIHdoaWxlICgoKihDUCA9ICYoUi0+Y2hpbGRbMV0pKSAhPSAwKSB8fFwNCisgICAgICAgICAgICAgKCooQ1AgPSAmKFItPmNoaWxkWzBdKSkgIT0gMCkpIHtcDQorICAgICAgICBSID0gKihSUCA9IENQKTtcDQorICAgICAgfVwNCisgICAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKE0sIFJQKSkpXA0KKyAgICAgICAgKlJQID0gMDtcDQorICAgICAgZWxzZSB7XA0KKyAgICAgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XA0KKyAgICAgIH1cDQorICAgIH1cDQorICB9XA0KKyAgaWYgKFhQICE9IDApIHtcDQorICAgIHRiaW5wdHIqIEggPSB0cmVlYmluX2F0KE0sIFgtPmluZGV4KTtcDQorICAgIGlmIChYID09ICpIKSB7XA0KKyAgICAgIGlmICgoKkggPSBSKSA9PSAwKSBcDQorICAgICAgICBjbGVhcl90cmVlbWFwKE0sIFgtPmluZGV4KTtcDQorICAgIH1cDQorICAgIGVsc2UgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBYUCkpKSB7XA0KKyAgICAgIGlmIChYUC0+Y2hpbGRbMF0gPT0gWCkgXA0KKyAgICAgICAgWFAtPmNoaWxkWzBdID0gUjtcDQorICAgICAgZWxzZSBcDQorICAgICAgICBYUC0+Y2hpbGRbMV0gPSBSO1wNCisgICAgfVwNCisgICAgZWxzZVwNCisgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcDQorICAgIGlmIChSICE9IDApIHtcDQorICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBSKSkpIHtcDQorICAgICAgICB0Y2h1bmtwdHIgQzAsIEMxO1wNCisgICAgICAgIFItPnBhcmVudCA9IFhQO1wNCisgICAgICAgIGlmICgoQzAgPSBYLT5jaGlsZFswXSkgIT0gMCkge1wNCisgICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhNLCBDMCkpKSB7XA0KKyAgICAgICAgICAgIFItPmNoaWxkWzBdID0gQzA7XA0KKyAgICAgICAgICAgIEMwLT5wYXJlbnQgPSBSO1wNCisgICAgICAgICAgfVwNCisgICAgICAgICAgZWxzZVwNCisgICAgICAgICAgICBDT1JSVVBUSU9OX0VSUk9SX0FDVElPTihNKTtcDQorICAgICAgICB9XA0KKyAgICAgICAgaWYgKChDMSA9IFgtPmNoaWxkWzFdKSAhPSAwKSB7XA0KKyAgICAgICAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKE0sIEMxKSkpIHtcDQorICAgICAgICAgICAgUi0+Y2hpbGRbMV0gPSBDMTtcDQorICAgICAgICAgICAgQzEtPnBhcmVudCA9IFI7XA0KKyAgICAgICAgICB9XA0KKyAgICAgICAgICBlbHNlXA0KKyAgICAgICAgICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKE0pO1wNCisgICAgICAgIH1cDQorICAgICAgfVwNCisgICAgICBlbHNlXA0KKyAgICAgICAgQ09SUlVQVElPTl9FUlJPUl9BQ1RJT04oTSk7XA0KKyAgICB9XA0KKyAgfVwNCit9DQorDQorLyogUmVsYXlzIHRvIGxhcmdlIHZzIHNtYWxsIGJpbiBvcGVyYXRpb25zICovDQorDQorI2RlZmluZSBpbnNlcnRfY2h1bmsoTSwgUCwgUylcDQorICBpZiAoaXNfc21hbGwoUykpIGluc2VydF9zbWFsbF9jaHVuayhNLCBQLCBTKVwNCisgIGVsc2UgeyB0Y2h1bmtwdHIgVFAgPSAodGNodW5rcHRyKShQKTsgaW5zZXJ0X2xhcmdlX2NodW5rKE0sIFRQLCBTKTsgfQ0KKw0KKyNkZWZpbmUgdW5saW5rX2NodW5rKE0sIFAsIFMpXA0KKyAgaWYgKGlzX3NtYWxsKFMpKSB1bmxpbmtfc21hbGxfY2h1bmsoTSwgUCwgUylcDQorICBlbHNlIHsgdGNodW5rcHRyIFRQID0gKHRjaHVua3B0cikoUCk7IHVubGlua19sYXJnZV9jaHVuayhNLCBUUCk7IH0NCisNCisNCisvKiBSZWxheXMgdG8gaW50ZXJuYWwgY2FsbHMgdG8gbWFsbG9jL2ZyZWUgZnJvbSByZWFsbG9jLCBtZW1hbGlnbiBldGMgKi8NCisNCisjaWYgT05MWV9NU1BBQ0VTDQorI2RlZmluZSBpbnRlcm5hbF9tYWxsb2MobSwgYikgbXNwYWNlX21hbGxvYyhtLCBiKQ0KKyNkZWZpbmUgaW50ZXJuYWxfZnJlZShtLCBtZW0pIG1zcGFjZV9mcmVlKG0sbWVtKTsNCisjZWxzZSAvKiBPTkxZX01TUEFDRVMgKi8NCisjaWYgTVNQQUNFUw0KKyNkZWZpbmUgaW50ZXJuYWxfbWFsbG9jKG0sIGIpXA0KKyAgIChtID09IGdtKT8gZGxtYWxsb2MoYikgOiBtc3BhY2VfbWFsbG9jKG0sIGIpDQorI2RlZmluZSBpbnRlcm5hbF9mcmVlKG0sIG1lbSlcDQorICAgaWYgKG0gPT0gZ20pIGRsZnJlZShtZW0pOyBlbHNlIG1zcGFjZV9mcmVlKG0sbWVtKTsNCisjZWxzZSAvKiBNU1BBQ0VTICovDQorI2RlZmluZSBpbnRlcm5hbF9tYWxsb2MobSwgYikgZGxtYWxsb2MoYikNCisjZGVmaW5lIGludGVybmFsX2ZyZWUobSwgbWVtKSBkbGZyZWUobWVtKQ0KKyNlbmRpZiAvKiBNU1BBQ0VTICovDQorI2VuZGlmIC8qIE9OTFlfTVNQQUNFUyAqLw0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBEaXJlY3QtbW1hcHBpbmcgY2h1bmtzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorLyoNCisgIERpcmVjdGx5IG1tYXBwZWQgY2h1bmtzIGFyZSBzZXQgdXAgd2l0aCBhbiBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mDQorICB0aGUgbW1hcHBlZCByZWdpb24gc3RvcmVkIGluIHRoZSBwcmV2X2Zvb3QgZmllbGQgb2YgdGhlIGNodW5rLiBUaGlzDQorICBhbGxvd3MgcmVjb25zdHJ1Y3Rpb24gb2YgdGhlIHJlcXVpcmVkIGFyZ3VtZW50IHRvIE1VTk1BUCB3aGVuIGZyZWVkLA0KKyAgYW5kIGFsc28gYWxsb3dzIGFkanVzdG1lbnQgb2YgdGhlIHJldHVybmVkIGNodW5rIHRvIG1lZXQgYWxpZ25tZW50DQorICByZXF1aXJlbWVudHMgKGVzcGVjaWFsbHkgaW4gbWVtYWxpZ24pLg0KKyovDQorDQorLyogTWFsbG9jIHVzaW5nIG1tYXAgKi8NCitzdGF0aWMgdm9pZCogbW1hcF9hbGxvYyhtc3RhdGUgbSwgc2l6ZV90IG5iKSB7DQorICBzaXplX3QgbW1zaXplID0gbW1hcF9hbGlnbihuYiArIFNJWF9TSVpFX1RfU0laRVMgKyBDSFVOS19BTElHTl9NQVNLKTsNCisgIGlmIChtbXNpemUgPiBuYikgeyAgICAgLyogQ2hlY2sgZm9yIHdyYXAgYXJvdW5kIDAgKi8NCisgICAgY2hhciogbW0gPSAoY2hhciopKENBTExfRElSRUNUX01NQVAobW1zaXplKSk7DQorICAgIGlmIChtbSAhPSBDTUZBSUwpIHsNCisgICAgICBzaXplX3Qgb2Zmc2V0ID0gYWxpZ25fb2Zmc2V0KGNodW5rMm1lbShtbSkpOw0KKyAgICAgIHNpemVfdCBwc2l6ZSA9IG1tc2l6ZSAtIG9mZnNldCAtIE1NQVBfRk9PVF9QQUQ7DQorICAgICAgbWNodW5rcHRyIHAgPSAobWNodW5rcHRyKShtbSArIG9mZnNldCk7DQorICAgICAgcC0+cHJldl9mb290ID0gb2Zmc2V0Ow0KKyAgICAgIHAtPmhlYWQgPSBwc2l6ZTsNCisgICAgICBtYXJrX2ludXNlX2Zvb3QobSwgcCwgcHNpemUpOw0KKyAgICAgIGNodW5rX3BsdXNfb2Zmc2V0KHAsIHBzaXplKS0+aGVhZCA9IEZFTkNFUE9TVF9IRUFEOw0KKyAgICAgIGNodW5rX3BsdXNfb2Zmc2V0KHAsIHBzaXplK1NJWkVfVF9TSVpFKS0+aGVhZCA9IDA7DQorDQorICAgICAgaWYgKG0tPmxlYXN0X2FkZHIgPT0gMCB8fCBtbSA8IG0tPmxlYXN0X2FkZHIpDQorICAgICAgICBtLT5sZWFzdF9hZGRyID0gbW07DQorICAgICAgaWYgKChtLT5mb290cHJpbnQgKz0gbW1zaXplKSA+IG0tPm1heF9mb290cHJpbnQpDQorICAgICAgICBtLT5tYXhfZm9vdHByaW50ID0gbS0+Zm9vdHByaW50Ow0KKyAgICAgIGFzc2VydChpc19hbGlnbmVkKGNodW5rMm1lbShwKSkpOw0KKyAgICAgIGNoZWNrX21tYXBwZWRfY2h1bmsobSwgcCk7DQorICAgICAgcmV0dXJuIGNodW5rMm1lbShwKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKy8qIFJlYWxsb2MgdXNpbmcgbW1hcCAqLw0KK3N0YXRpYyBtY2h1bmtwdHIgbW1hcF9yZXNpemUobXN0YXRlIG0sIG1jaHVua3B0ciBvbGRwLCBzaXplX3QgbmIpIHsNCisgIHNpemVfdCBvbGRzaXplID0gY2h1bmtzaXplKG9sZHApOw0KKyAgaWYgKGlzX3NtYWxsKG5iKSkgLyogQ2FuJ3Qgc2hyaW5rIG1tYXAgcmVnaW9ucyBiZWxvdyBzbWFsbCBzaXplICovDQorICAgIHJldHVybiAwOw0KKyAgLyogS2VlcCBvbGQgY2h1bmsgaWYgYmlnIGVub3VnaCBidXQgbm90IHRvbyBiaWcgKi8NCisgIGlmIChvbGRzaXplID49IG5iICsgU0laRV9UX1NJWkUgJiYNCisgICAgICAob2xkc2l6ZSAtIG5iKSA8PSAobXBhcmFtcy5ncmFudWxhcml0eSA8PCAxKSkNCisgICAgcmV0dXJuIG9sZHA7DQorICBlbHNlIHsNCisgICAgc2l6ZV90IG9mZnNldCA9IG9sZHAtPnByZXZfZm9vdDsNCisgICAgc2l6ZV90IG9sZG1tc2l6ZSA9IG9sZHNpemUgKyBvZmZzZXQgKyBNTUFQX0ZPT1RfUEFEOw0KKyAgICBzaXplX3QgbmV3bW1zaXplID0gbW1hcF9hbGlnbihuYiArIFNJWF9TSVpFX1RfU0laRVMgKyBDSFVOS19BTElHTl9NQVNLKTsNCisgICAgY2hhciogY3AgPSAoY2hhciopQ0FMTF9NUkVNQVAoKGNoYXIqKW9sZHAgLSBvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZG1tc2l6ZSwgbmV3bW1zaXplLCAxKTsNCisgICAgaWYgKGNwICE9IENNRkFJTCkgew0KKyAgICAgIG1jaHVua3B0ciBuZXdwID0gKG1jaHVua3B0cikoY3AgKyBvZmZzZXQpOw0KKyAgICAgIHNpemVfdCBwc2l6ZSA9IG5ld21tc2l6ZSAtIG9mZnNldCAtIE1NQVBfRk9PVF9QQUQ7DQorICAgICAgbmV3cC0+aGVhZCA9IHBzaXplOw0KKyAgICAgIG1hcmtfaW51c2VfZm9vdChtLCBuZXdwLCBwc2l6ZSk7DQorICAgICAgY2h1bmtfcGx1c19vZmZzZXQobmV3cCwgcHNpemUpLT5oZWFkID0gRkVOQ0VQT1NUX0hFQUQ7DQorICAgICAgY2h1bmtfcGx1c19vZmZzZXQobmV3cCwgcHNpemUrU0laRV9UX1NJWkUpLT5oZWFkID0gMDsNCisNCisgICAgICBpZiAoY3AgPCBtLT5sZWFzdF9hZGRyKQ0KKyAgICAgICAgbS0+bGVhc3RfYWRkciA9IGNwOw0KKyAgICAgIGlmICgobS0+Zm9vdHByaW50ICs9IG5ld21tc2l6ZSAtIG9sZG1tc2l6ZSkgPiBtLT5tYXhfZm9vdHByaW50KQ0KKyAgICAgICAgbS0+bWF4X2Zvb3RwcmludCA9IG0tPmZvb3RwcmludDsNCisgICAgICBjaGVja19tbWFwcGVkX2NodW5rKG0sIG5ld3ApOw0KKyAgICAgIHJldHVybiBuZXdwOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbXNwYWNlIG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisvKiBJbml0aWFsaXplIHRvcCBjaHVuayBhbmQgaXRzIHNpemUgKi8NCitzdGF0aWMgdm9pZCBpbml0X3RvcChtc3RhdGUgbSwgbWNodW5rcHRyIHAsIHNpemVfdCBwc2l6ZSkgew0KKyAgLyogRW5zdXJlIGFsaWdubWVudCAqLw0KKyAgc2l6ZV90IG9mZnNldCA9IGFsaWduX29mZnNldChjaHVuazJtZW0ocCkpOw0KKyAgcCA9IChtY2h1bmtwdHIpKChjaGFyKilwICsgb2Zmc2V0KTsNCisgIHBzaXplIC09IG9mZnNldDsNCisNCisgIG0tPnRvcCA9IHA7DQorICBtLT50b3BzaXplID0gcHNpemU7DQorICBwLT5oZWFkID0gcHNpemUgfCBQSU5VU0VfQklUOw0KKyAgLyogc2V0IHNpemUgb2YgZmFrZSB0cmFpbGluZyBjaHVuayBob2xkaW5nIG92ZXJoZWFkIHNwYWNlIG9ubHkgb25jZSAqLw0KKyAgY2h1bmtfcGx1c19vZmZzZXQocCwgcHNpemUpLT5oZWFkID0gVE9QX0ZPT1RfU0laRTsNCisgIG0tPnRyaW1fY2hlY2sgPSBtcGFyYW1zLnRyaW1fdGhyZXNob2xkOyAvKiByZXNldCBvbiBlYWNoIHVwZGF0ZSAqLw0KK30NCisNCisvKiBJbml0aWFsaXplIGJpbnMgZm9yIGEgbmV3IG1zdGF0ZSB0aGF0IGlzIG90aGVyd2lzZSB6ZXJvZWQgb3V0ICovDQorc3RhdGljIHZvaWQgaW5pdF9iaW5zKG1zdGF0ZSBtKSB7DQorICAvKiBFc3RhYmxpc2ggY2lyY3VsYXIgbGlua3MgZm9yIHNtYWxsYmlucyAqLw0KKyAgYmluZGV4X3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBOU01BTExCSU5TOyArK2kpIHsNCisgICAgc2JpbnB0ciBiaW4gPSBzbWFsbGJpbl9hdChtLGkpOw0KKyAgICBiaW4tPmZkID0gYmluLT5iayA9IGJpbjsNCisgIH0NCit9DQorDQorI2lmIFBST0NFRURfT05fRVJST1INCisNCisvKiBkZWZhdWx0IGNvcnJ1cHRpb24gYWN0aW9uICovDQorc3RhdGljIHZvaWQgcmVzZXRfb25fZXJyb3IobXN0YXRlIG0pIHsNCisgIGludCBpOw0KKyAgKyttYWxsb2NfY29ycnVwdGlvbl9lcnJvcl9jb3VudDsNCisgIC8qIFJlaW5pdGlhbGl6ZSBmaWVsZHMgdG8gZm9yZ2V0IGFib3V0IGFsbCBtZW1vcnkgKi8NCisgIG0tPnNtYWxsYmlucyA9IG0tPnRyZWViaW5zID0gMDsNCisgIG0tPmR2c2l6ZSA9IG0tPnRvcHNpemUgPSAwOw0KKyAgbS0+c2VnLmJhc2UgPSAwOw0KKyAgbS0+c2VnLnNpemUgPSAwOw0KKyAgbS0+c2VnLm5leHQgPSAwOw0KKyAgbS0+dG9wID0gbS0+ZHYgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IE5UUkVFQklOUzsgKytpKQ0KKyAgICAqdHJlZWJpbl9hdChtLCBpKSA9IDA7DQorICBpbml0X2JpbnMobSk7DQorfQ0KKyNlbmRpZiAvKiBQUk9DRUVEX09OX0VSUk9SICovDQorDQorLyogQWxsb2NhdGUgY2h1bmsgYW5kIHByZXBlbmQgcmVtYWluZGVyIHdpdGggY2h1bmsgaW4gc3VjY2Vzc29yIGJhc2UuICovDQorc3RhdGljIHZvaWQqIHByZXBlbmRfYWxsb2MobXN0YXRlIG0sIGNoYXIqIG5ld2Jhc2UsIGNoYXIqIG9sZGJhc2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5iKSB7DQorICBtY2h1bmtwdHIgcCA9IGFsaWduX2FzX2NodW5rKG5ld2Jhc2UpOw0KKyAgbWNodW5rcHRyIG9sZGZpcnN0ID0gYWxpZ25fYXNfY2h1bmsob2xkYmFzZSk7DQorICBzaXplX3QgcHNpemUgPSAoY2hhciopb2xkZmlyc3QgLSAoY2hhciopcDsNCisgIG1jaHVua3B0ciBxID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOw0KKyAgc2l6ZV90IHFzaXplID0gcHNpemUgLSBuYjsNCisgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgcCwgbmIpOw0KKw0KKyAgYXNzZXJ0KChjaGFyKilvbGRmaXJzdCA+IChjaGFyKilxKTsNCisgIGFzc2VydChwaW51c2Uob2xkZmlyc3QpKTsNCisgIGFzc2VydChxc2l6ZSA+PSBNSU5fQ0hVTktfU0laRSk7DQorDQorICAvKiBjb25zb2xpZGF0ZSByZW1haW5kZXIgd2l0aCBmaXJzdCBjaHVuayBvZiBvbGQgYmFzZSAqLw0KKyAgaWYgKG9sZGZpcnN0ID09IG0tPnRvcCkgew0KKyAgICBzaXplX3QgdHNpemUgPSBtLT50b3BzaXplICs9IHFzaXplOw0KKyAgICBtLT50b3AgPSBxOw0KKyAgICBxLT5oZWFkID0gdHNpemUgfCBQSU5VU0VfQklUOw0KKyAgICBjaGVja190b3BfY2h1bmsobSwgcSk7DQorICB9DQorICBlbHNlIGlmIChvbGRmaXJzdCA9PSBtLT5kdikgew0KKyAgICBzaXplX3QgZHNpemUgPSBtLT5kdnNpemUgKz0gcXNpemU7DQorICAgIG0tPmR2ID0gcTsNCisgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHEsIGRzaXplKTsNCisgIH0NCisgIGVsc2Ugew0KKyAgICBpZiAoIWlzX2ludXNlKG9sZGZpcnN0KSkgew0KKyAgICAgIHNpemVfdCBuc2l6ZSA9IGNodW5rc2l6ZShvbGRmaXJzdCk7DQorICAgICAgdW5saW5rX2NodW5rKG0sIG9sZGZpcnN0LCBuc2l6ZSk7DQorICAgICAgb2xkZmlyc3QgPSBjaHVua19wbHVzX29mZnNldChvbGRmaXJzdCwgbnNpemUpOw0KKyAgICAgIHFzaXplICs9IG5zaXplOw0KKyAgICB9DQorICAgIHNldF9mcmVlX3dpdGhfcGludXNlKHEsIHFzaXplLCBvbGRmaXJzdCk7DQorICAgIGluc2VydF9jaHVuayhtLCBxLCBxc2l6ZSk7DQorICAgIGNoZWNrX2ZyZWVfY2h1bmsobSwgcSk7DQorICB9DQorDQorICBjaGVja19tYWxsb2NlZF9jaHVuayhtLCBjaHVuazJtZW0ocCksIG5iKTsNCisgIHJldHVybiBjaHVuazJtZW0ocCk7DQorfQ0KKw0KKy8qIEFkZCBhIHNlZ21lbnQgdG8gaG9sZCBhIG5ldyBub25jb250aWd1b3VzIHJlZ2lvbiAqLw0KK3N0YXRpYyB2b2lkIGFkZF9zZWdtZW50KG1zdGF0ZSBtLCBjaGFyKiB0YmFzZSwgc2l6ZV90IHRzaXplLCBmbGFnX3QgbW1hcHBlZCkgew0KKyAgLyogRGV0ZXJtaW5lIGxvY2F0aW9ucyBhbmQgc2l6ZXMgb2Ygc2VnbWVudCwgZmVuY2Vwb3N0cywgb2xkIHRvcCAqLw0KKyAgY2hhciogb2xkX3RvcCA9IChjaGFyKiltLT50b3A7DQorICBtc2VnbWVudHB0ciBvbGRzcCA9IHNlZ21lbnRfaG9sZGluZyhtLCBvbGRfdG9wKTsNCisgIGNoYXIqIG9sZF9lbmQgPSBvbGRzcC0+YmFzZSArIG9sZHNwLT5zaXplOw0KKyAgc2l6ZV90IHNzaXplID0gcGFkX3JlcXVlc3Qoc2l6ZW9mKHN0cnVjdCBtYWxsb2Nfc2VnbWVudCkpOw0KKyAgY2hhciogcmF3c3AgPSBvbGRfZW5kIC0gKHNzaXplICsgRk9VUl9TSVpFX1RfU0laRVMgKyBDSFVOS19BTElHTl9NQVNLKTsNCisgIHNpemVfdCBvZmZzZXQgPSBhbGlnbl9vZmZzZXQoY2h1bmsybWVtKHJhd3NwKSk7DQorICBjaGFyKiBhc3AgPSByYXdzcCArIG9mZnNldDsNCisgIGNoYXIqIGNzcCA9IChhc3AgPCAob2xkX3RvcCArIE1JTl9DSFVOS19TSVpFKSk/IG9sZF90b3AgOiBhc3A7DQorICBtY2h1bmtwdHIgc3AgPSAobWNodW5rcHRyKWNzcDsNCisgIG1zZWdtZW50cHRyIHNzID0gKG1zZWdtZW50cHRyKShjaHVuazJtZW0oc3ApKTsNCisgIG1jaHVua3B0ciB0bmV4dCA9IGNodW5rX3BsdXNfb2Zmc2V0KHNwLCBzc2l6ZSk7DQorICBtY2h1bmtwdHIgcCA9IHRuZXh0Ow0KKyAgaW50IG5mZW5jZXMgPSAwOw0KKw0KKyAgLyogcmVzZXQgdG9wIHRvIG5ldyBzcGFjZSAqLw0KKyAgaW5pdF90b3AobSwgKG1jaHVua3B0cil0YmFzZSwgdHNpemUgLSBUT1BfRk9PVF9TSVpFKTsNCisNCisgIC8qIFNldCB1cCBzZWdtZW50IHJlY29yZCAqLw0KKyAgYXNzZXJ0KGlzX2FsaWduZWQoc3MpKTsNCisgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgc3AsIHNzaXplKTsNCisgICpzcyA9IG0tPnNlZzsgLyogUHVzaCBjdXJyZW50IHJlY29yZCAqLw0KKyAgbS0+c2VnLmJhc2UgPSB0YmFzZTsNCisgIG0tPnNlZy5zaXplID0gdHNpemU7DQorICBtLT5zZWcuc2ZsYWdzID0gbW1hcHBlZDsNCisgIG0tPnNlZy5uZXh0ID0gc3M7DQorDQorICAvKiBJbnNlcnQgdHJhaWxpbmcgZmVuY2Vwb3N0cyAqLw0KKyAgZm9yICg7Oykgew0KKyAgICBtY2h1bmtwdHIgbmV4dHAgPSBjaHVua19wbHVzX29mZnNldChwLCBTSVpFX1RfU0laRSk7DQorICAgIHAtPmhlYWQgPSBGRU5DRVBPU1RfSEVBRDsNCisgICAgKytuZmVuY2VzOw0KKyAgICBpZiAoKGNoYXIqKSgmKG5leHRwLT5oZWFkKSkgPCBvbGRfZW5kKQ0KKyAgICAgIHAgPSBuZXh0cDsNCisgICAgZWxzZQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgYXNzZXJ0KG5mZW5jZXMgPj0gMik7DQorDQorICAvKiBJbnNlcnQgdGhlIHJlc3Qgb2Ygb2xkIHRvcCBpbnRvIGEgYmluIGFzIGFuIG9yZGluYXJ5IGZyZWUgY2h1bmsgKi8NCisgIGlmIChjc3AgIT0gb2xkX3RvcCkgew0KKyAgICBtY2h1bmtwdHIgcSA9IChtY2h1bmtwdHIpb2xkX3RvcDsNCisgICAgc2l6ZV90IHBzaXplID0gY3NwIC0gb2xkX3RvcDsNCisgICAgbWNodW5rcHRyIHRuID0gY2h1bmtfcGx1c19vZmZzZXQocSwgcHNpemUpOw0KKyAgICBzZXRfZnJlZV93aXRoX3BpbnVzZShxLCBwc2l6ZSwgdG4pOw0KKyAgICBpbnNlcnRfY2h1bmsobSwgcSwgcHNpemUpOw0KKyAgfQ0KKw0KKyAgY2hlY2tfdG9wX2NodW5rKG0sIG0tPnRvcCk7DQorfQ0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5c3RlbSBhbGxvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorLyogR2V0IG1lbW9yeSBmcm9tIHN5c3RlbSB1c2luZyBNT1JFQ09SRSBvciBNTUFQICovDQorc3RhdGljIHZvaWQqIHN5c19hbGxvYyhtc3RhdGUgbSwgc2l6ZV90IG5iKSB7DQorICBjaGFyKiB0YmFzZSA9IENNRkFJTDsNCisgIHNpemVfdCB0c2l6ZSA9IDA7DQorICBmbGFnX3QgbW1hcF9mbGFnID0gMDsNCisNCisgIGVuc3VyZV9pbml0aWFsaXphdGlvbigpOw0KKw0KKyAgLyogRGlyZWN0bHkgbWFwIGxhcmdlIGNodW5rcywgYnV0IG9ubHkgaWYgYWxyZWFkeSBpbml0aWFsaXplZCAqLw0KKyAgaWYgKHVzZV9tbWFwKG0pICYmIG5iID49IG1wYXJhbXMubW1hcF90aHJlc2hvbGQgJiYgbS0+dG9wc2l6ZSAhPSAwKSB7DQorICAgIHZvaWQqIG1lbSA9IG1tYXBfYWxsb2MobSwgbmIpOw0KKyAgICBpZiAobWVtICE9IDApDQorICAgICAgcmV0dXJuIG1lbTsNCisgIH0NCisNCisgIC8qDQorICAgIFRyeSBnZXR0aW5nIG1lbW9yeSBpbiBhbnkgb2YgdGhyZWUgd2F5cyAoaW4gbW9zdC1wcmVmZXJyZWQgdG8NCisgICAgbGVhc3QtcHJlZmVycmVkIG9yZGVyKToNCisgICAgMS4gQSBjYWxsIHRvIE1PUkVDT1JFIHRoYXQgY2FuIG5vcm1hbGx5IGNvbnRpZ3VvdXNseSBleHRlbmQgbWVtb3J5Lg0KKyAgICAgICAoZGlzYWJsZWQgaWYgbm90IE1PUkVDT1JFX0NPTlRJR1VPVVMgb3Igbm90IEhBVkVfTU9SRUNPUkUgb3INCisgICAgICAgb3IgbWFpbiBzcGFjZSBpcyBtbWFwcGVkIG9yIGEgcHJldmlvdXMgY29udGlndW91cyBjYWxsIGZhaWxlZCkNCisgICAgMi4gQSBjYWxsIHRvIE1NQVAgbmV3IHNwYWNlIChkaXNhYmxlZCBpZiBub3QgSEFWRV9NTUFQKS4NCisgICAgICAgTm90ZSB0aGF0IHVuZGVyIHRoZSBkZWZhdWx0IHNldHRpbmdzLCBpZiBNT1JFQ09SRSBpcyB1bmFibGUgdG8NCisgICAgICAgZnVsZmlsbCBhIHJlcXVlc3QsIGFuZCBIQVZFX01NQVAgaXMgdHJ1ZSwgdGhlbiBtbWFwIGlzDQorICAgICAgIHVzZWQgYXMgYSBub25jb250aWd1b3VzIHN5c3RlbSBhbGxvY2F0b3IuIFRoaXMgaXMgYSB1c2VmdWwgYmFja3VwDQorICAgICAgIHN0cmF0ZWd5IGZvciBzeXN0ZW1zIHdpdGggaG9sZXMgaW4gYWRkcmVzcyBzcGFjZXMgLS0gaW4gdGhpcyBjYXNlDQorICAgICAgIHNicmsgY2Fubm90IGNvbnRpZ3VvdXNseSBleHBhbmQgdGhlIGhlYXAsIGJ1dCBtbWFwIG1heSBiZSBhYmxlIHRvDQorICAgICAgIGZpbmQgc3BhY2UuDQorICAgIDMuIEEgY2FsbCB0byBNT1JFQ09SRSB0aGF0IGNhbm5vdCB1c3VhbGx5IGNvbnRpZ3VvdXNseSBleHRlbmQgbWVtb3J5Lg0KKyAgICAgICAoZGlzYWJsZWQgaWYgbm90IEhBVkVfTU9SRUNPUkUpDQorDQorICAgSW4gYWxsIGNhc2VzLCB3ZSBuZWVkIHRvIHJlcXVlc3QgZW5vdWdoIGJ5dGVzIGZyb20gc3lzdGVtIHRvIGVuc3VyZQ0KKyAgIHdlIGNhbiBtYWxsb2MgbmIgYnl0ZXMgdXBvbiBzdWNjZXNzLCBzbyBwYWQgd2l0aCBlbm91Z2ggc3BhY2UgZm9yDQorICAgdG9wX2Zvb3QsIHBsdXMgYWxpZ25tZW50LXBhZCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgbG9zZSBieXRlcyBpZg0KKyAgIG5vdCBvbiBib3VuZGFyeSwgYW5kIHJvdW5kIHRoaXMgdXAgdG8gYSBncmFudWxhcml0eSB1bml0Lg0KKyAgKi8NCisNCisgIGlmIChNT1JFQ09SRV9DT05USUdVT1VTICYmICF1c2Vfbm9uY29udGlndW91cyhtKSkgew0KKyAgICBjaGFyKiBiciA9IENNRkFJTDsNCisgICAgbXNlZ21lbnRwdHIgc3MgPSAobS0+dG9wID09IDApPyAwIDogc2VnbWVudF9ob2xkaW5nKG0sIChjaGFyKiltLT50b3ApOw0KKyAgICBzaXplX3QgYXNpemUgPSAwOw0KKyAgICBBQ1FVSVJFX01BTExPQ19HTE9CQUxfTE9DSygpOw0KKw0KKyAgICBpZiAoc3MgPT0gMCkgeyAgLyogRmlyc3QgdGltZSB0aHJvdWdoIG9yIHJlY292ZXJ5ICovDQorICAgICAgY2hhciogYmFzZSA9IChjaGFyKilDQUxMX01PUkVDT1JFKDApOw0KKyAgICAgIGlmIChiYXNlICE9IENNRkFJTCkgew0KKyAgICAgICAgYXNpemUgPSBncmFudWxhcml0eV9hbGlnbihuYiArIFNZU19BTExPQ19QQURESU5HKTsNCisgICAgICAgIC8qIEFkanVzdCB0byBlbmQgb24gYSBwYWdlIGJvdW5kYXJ5ICovDQorICAgICAgICBpZiAoIWlzX3BhZ2VfYWxpZ25lZChiYXNlKSkNCisgICAgICAgICAgYXNpemUgKz0gKHBhZ2VfYWxpZ24oKHNpemVfdCliYXNlKSAtIChzaXplX3QpYmFzZSk7DQorICAgICAgICAvKiBDYW4ndCBjYWxsIE1PUkVDT1JFIGlmIHNpemUgaXMgbmVnYXRpdmUgd2hlbiB0cmVhdGVkIGFzIHNpZ25lZCAqLw0KKyAgICAgICAgaWYgKGFzaXplIDwgSEFMRl9NQVhfU0laRV9UICYmDQorICAgICAgICAgICAgKGJyID0gKGNoYXIqKShDQUxMX01PUkVDT1JFKGFzaXplKSkpID09IGJhc2UpIHsNCisgICAgICAgICAgdGJhc2UgPSBiYXNlOw0KKyAgICAgICAgICB0c2l6ZSA9IGFzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICAvKiBTdWJ0cmFjdCBvdXQgZXhpc3RpbmcgYXZhaWxhYmxlIHRvcCBzcGFjZSBmcm9tIE1PUkVDT1JFIHJlcXVlc3QuICovDQorICAgICAgYXNpemUgPSBncmFudWxhcml0eV9hbGlnbihuYiAtIG0tPnRvcHNpemUgKyBTWVNfQUxMT0NfUEFERElORyk7DQorICAgICAgLyogVXNlIG1lbSBoZXJlIG9ubHkgaWYgaXQgZGlkIGNvbnRpbnVvdXNseSBleHRlbmQgb2xkIHNwYWNlICovDQorICAgICAgaWYgKGFzaXplIDwgSEFMRl9NQVhfU0laRV9UICYmDQorICAgICAgICAgIChiciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRShhc2l6ZSkpKSA9PSBzcy0+YmFzZStzcy0+c2l6ZSkgew0KKyAgICAgICAgdGJhc2UgPSBicjsNCisgICAgICAgIHRzaXplID0gYXNpemU7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGlmICh0YmFzZSA9PSBDTUZBSUwpIHsgICAgLyogQ29wZSB3aXRoIHBhcnRpYWwgZmFpbHVyZSAqLw0KKyAgICAgIGlmIChiciAhPSBDTUZBSUwpIHsgICAgLyogVHJ5IHRvIHVzZS9leHRlbmQgdGhlIHNwYWNlIHdlIGRpZCBnZXQgKi8NCisgICAgICAgIGlmIChhc2l6ZSA8IEhBTEZfTUFYX1NJWkVfVCAmJg0KKyAgICAgICAgICAgIGFzaXplIDwgbmIgKyBTWVNfQUxMT0NfUEFERElORykgew0KKyAgICAgICAgICBzaXplX3QgZXNpemUgPSBncmFudWxhcml0eV9hbGlnbihuYiArIFNZU19BTExPQ19QQURESU5HIC0gYXNpemUpOw0KKyAgICAgICAgICBpZiAoZXNpemUgPCBIQUxGX01BWF9TSVpFX1QpIHsNCisgICAgICAgICAgICBjaGFyKiBlbmQgPSAoY2hhciopQ0FMTF9NT1JFQ09SRShlc2l6ZSk7DQorICAgICAgICAgICAgaWYgKGVuZCAhPSBDTUZBSUwpDQorICAgICAgICAgICAgICBhc2l6ZSArPSBlc2l6ZTsNCisgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAvKiBDYW4ndCB1c2U7IHRyeSB0byByZWxlYXNlICovDQorICAgICAgICAgICAgICAodm9pZCkgQ0FMTF9NT1JFQ09SRSgtYXNpemUpOw0KKyAgICAgICAgICAgICAgYnIgPSBDTUZBSUw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChiciAhPSBDTUZBSUwpIHsgICAgLyogVXNlIHRoZSBzcGFjZSB3ZSBkaWQgZ2V0ICovDQorICAgICAgICB0YmFzZSA9IGJyOw0KKyAgICAgICAgdHNpemUgPSBhc2l6ZTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgZGlzYWJsZV9jb250aWd1b3VzKG0pOyAvKiBEb24ndCB0cnkgY29udGlndW91cyBwYXRoIGluIHRoZSBmdXR1cmUgKi8NCisgICAgfQ0KKw0KKyAgICBSRUxFQVNFX01BTExPQ19HTE9CQUxfTE9DSygpOw0KKyAgfQ0KKw0KKyAgaWYgKEhBVkVfTU1BUCAmJiB0YmFzZSA9PSBDTUZBSUwpIHsgIC8qIFRyeSBNTUFQICovDQorICAgIHNpemVfdCByc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgU1lTX0FMTE9DX1BBRERJTkcpOw0KKyAgICBpZiAocnNpemUgPiBuYikgeyAvKiBGYWlsIGlmIHdyYXBzIGFyb3VuZCB6ZXJvICovDQorICAgICAgY2hhciogbXAgPSAoY2hhciopKENBTExfTU1BUChyc2l6ZSkpOw0KKyAgICAgIGlmIChtcCAhPSBDTUZBSUwpIHsNCisgICAgICAgIHRiYXNlID0gbXA7DQorICAgICAgICB0c2l6ZSA9IHJzaXplOw0KKyAgICAgICAgbW1hcF9mbGFnID0gVVNFX01NQVBfQklUOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKEhBVkVfTU9SRUNPUkUgJiYgdGJhc2UgPT0gQ01GQUlMKSB7IC8qIFRyeSBub25jb250aWd1b3VzIE1PUkVDT1JFICovDQorICAgIHNpemVfdCBhc2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKG5iICsgU1lTX0FMTE9DX1BBRERJTkcpOw0KKyAgICBpZiAoYXNpemUgPCBIQUxGX01BWF9TSVpFX1QpIHsNCisgICAgICBjaGFyKiBiciA9IENNRkFJTDsNCisgICAgICBjaGFyKiBlbmQgPSBDTUZBSUw7DQorICAgICAgQUNRVUlSRV9NQUxMT0NfR0xPQkFMX0xPQ0soKTsNCisgICAgICBiciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRShhc2l6ZSkpOw0KKyAgICAgIGVuZCA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRSgwKSk7DQorICAgICAgUkVMRUFTRV9NQUxMT0NfR0xPQkFMX0xPQ0soKTsNCisgICAgICBpZiAoYnIgIT0gQ01GQUlMICYmIGVuZCAhPSBDTUZBSUwgJiYgYnIgPCBlbmQpIHsNCisgICAgICAgIHNpemVfdCBzc2l6ZSA9IGVuZCAtIGJyOw0KKyAgICAgICAgaWYgKHNzaXplID4gbmIgKyBUT1BfRk9PVF9TSVpFKSB7DQorICAgICAgICAgIHRiYXNlID0gYnI7DQorICAgICAgICAgIHRzaXplID0gc3NpemU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBpZiAodGJhc2UgIT0gQ01GQUlMKSB7DQorDQorICAgIGlmICgobS0+Zm9vdHByaW50ICs9IHRzaXplKSA+IG0tPm1heF9mb290cHJpbnQpDQorICAgICAgbS0+bWF4X2Zvb3RwcmludCA9IG0tPmZvb3RwcmludDsNCisNCisgICAgaWYgKCFpc19pbml0aWFsaXplZChtKSkgeyAvKiBmaXJzdC10aW1lIGluaXRpYWxpemF0aW9uICovDQorICAgICAgaWYgKG0tPmxlYXN0X2FkZHIgPT0gMCB8fCB0YmFzZSA8IG0tPmxlYXN0X2FkZHIpDQorICAgICAgICBtLT5sZWFzdF9hZGRyID0gdGJhc2U7DQorICAgICAgbS0+c2VnLmJhc2UgPSB0YmFzZTsNCisgICAgICBtLT5zZWcuc2l6ZSA9IHRzaXplOw0KKyAgICAgIG0tPnNlZy5zZmxhZ3MgPSBtbWFwX2ZsYWc7DQorICAgICAgbS0+bWFnaWMgPSBtcGFyYW1zLm1hZ2ljOw0KKyAgICAgIG0tPnJlbGVhc2VfY2hlY2tzID0gTUFYX1JFTEVBU0VfQ0hFQ0tfUkFURTsNCisgICAgICBpbml0X2JpbnMobSk7DQorI2lmICFPTkxZX01TUEFDRVMNCisgICAgICBpZiAoaXNfZ2xvYmFsKG0pKQ0KKyAgICAgICAgaW5pdF90b3AobSwgKG1jaHVua3B0cil0YmFzZSwgdHNpemUgLSBUT1BfRk9PVF9TSVpFKTsNCisgICAgICBlbHNlDQorI2VuZGlmDQorICAgICAgew0KKyAgICAgICAgLyogT2Zmc2V0IHRvcCBieSBlbWJlZGRlZCBtYWxsb2Nfc3RhdGUgKi8NCisgICAgICAgIG1jaHVua3B0ciBtbiA9IG5leHRfY2h1bmsobWVtMmNodW5rKG0pKTsNCisgICAgICAgIGluaXRfdG9wKG0sIG1uLCAoc2l6ZV90KSgodGJhc2UgKyB0c2l6ZSkgLSAoY2hhciopbW4pIC1UT1BfRk9PVF9TSVpFKTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgZWxzZSB7DQorICAgICAgLyogVHJ5IHRvIG1lcmdlIHdpdGggYW4gZXhpc3Rpbmcgc2VnbWVudCAqLw0KKyAgICAgIG1zZWdtZW50cHRyIHNwID0gJm0tPnNlZzsNCisgICAgICAvKiBPbmx5IGNvbnNpZGVyIG1vc3QgcmVjZW50IHNlZ21lbnQgaWYgdHJhdmVyc2FsIHN1cHByZXNzZWQgKi8NCisgICAgICB3aGlsZSAoc3AgIT0gMCAmJiB0YmFzZSAhPSBzcC0+YmFzZSArIHNwLT5zaXplKQ0KKyAgICAgICAgc3AgPSAoTk9fU0VHTUVOVF9UUkFWRVJTQUwpID8gMCA6IHNwLT5uZXh0Ow0KKyAgICAgIGlmIChzcCAhPSAwICYmDQorICAgICAgICAgICFpc19leHRlcm5fc2VnbWVudChzcCkgJiYNCisgICAgICAgICAgKHNwLT5zZmxhZ3MgJiBVU0VfTU1BUF9CSVQpID09IG1tYXBfZmxhZyAmJg0KKyAgICAgICAgICBzZWdtZW50X2hvbGRzKHNwLCBtLT50b3ApKSB7IC8qIGFwcGVuZCAqLw0KKyAgICAgICAgc3AtPnNpemUgKz0gdHNpemU7DQorICAgICAgICBpbml0X3RvcChtLCBtLT50b3AsIG0tPnRvcHNpemUgKyB0c2l6ZSk7DQorICAgICAgfQ0KKyAgICAgIGVsc2Ugew0KKyAgICAgICAgaWYgKHRiYXNlIDwgbS0+bGVhc3RfYWRkcikNCisgICAgICAgICAgbS0+bGVhc3RfYWRkciA9IHRiYXNlOw0KKyAgICAgICAgc3AgPSAmbS0+c2VnOw0KKyAgICAgICAgd2hpbGUgKHNwICE9IDAgJiYgc3AtPmJhc2UgIT0gdGJhc2UgKyB0c2l6ZSkNCisgICAgICAgICAgc3AgPSAoTk9fU0VHTUVOVF9UUkFWRVJTQUwpID8gMCA6IHNwLT5uZXh0Ow0KKyAgICAgICAgaWYgKHNwICE9IDAgJiYNCisgICAgICAgICAgICAhaXNfZXh0ZXJuX3NlZ21lbnQoc3ApICYmDQorICAgICAgICAgICAgKHNwLT5zZmxhZ3MgJiBVU0VfTU1BUF9CSVQpID09IG1tYXBfZmxhZykgew0KKyAgICAgICAgICBjaGFyKiBvbGRiYXNlID0gc3AtPmJhc2U7DQorICAgICAgICAgIHNwLT5iYXNlID0gdGJhc2U7DQorICAgICAgICAgIHNwLT5zaXplICs9IHRzaXplOw0KKyAgICAgICAgICByZXR1cm4gcHJlcGVuZF9hbGxvYyhtLCB0YmFzZSwgb2xkYmFzZSwgbmIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBhZGRfc2VnbWVudChtLCB0YmFzZSwgdHNpemUsIG1tYXBfZmxhZyk7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGlmIChuYiA8IG0tPnRvcHNpemUpIHsgLyogQWxsb2NhdGUgZnJvbSBuZXcgb3IgZXh0ZW5kZWQgdG9wIHNwYWNlICovDQorICAgICAgc2l6ZV90IHJzaXplID0gbS0+dG9wc2l6ZSAtPSBuYjsNCisgICAgICBtY2h1bmtwdHIgcCA9IG0tPnRvcDsNCisgICAgICBtY2h1bmtwdHIgciA9IG0tPnRvcCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsNCisgICAgICByLT5oZWFkID0gcnNpemUgfCBQSU5VU0VfQklUOw0KKyAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgcCwgbmIpOw0KKyAgICAgIGNoZWNrX3RvcF9jaHVuayhtLCBtLT50b3ApOw0KKyAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKG0sIGNodW5rMm1lbShwKSwgbmIpOw0KKyAgICAgIHJldHVybiBjaHVuazJtZW0ocCk7DQorICAgIH0NCisgIH0NCisNCisgIE1BTExPQ19GQUlMVVJFX0FDVElPTjsNCisgIHJldHVybiAwOw0KK30NCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgc3lzdGVtIGRlYWxsb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKy8qIFVubWFwIGFuZCB1bmxpbmsgYW55IG1tYXBwZWQgc2VnbWVudHMgdGhhdCBkb24ndCBjb250YWluIHVzZWQgY2h1bmtzICovDQorc3RhdGljIHNpemVfdCByZWxlYXNlX3VudXNlZF9zZWdtZW50cyhtc3RhdGUgbSkgew0KKyAgc2l6ZV90IHJlbGVhc2VkID0gMDsNCisgIGludCBuc2VncyA9IDA7DQorICBtc2VnbWVudHB0ciBwcmVkID0gJm0tPnNlZzsNCisgIG1zZWdtZW50cHRyIHNwID0gcHJlZC0+bmV4dDsNCisgIHdoaWxlIChzcCAhPSAwKSB7DQorICAgIGNoYXIqIGJhc2UgPSBzcC0+YmFzZTsNCisgICAgc2l6ZV90IHNpemUgPSBzcC0+c2l6ZTsNCisgICAgbXNlZ21lbnRwdHIgbmV4dCA9IHNwLT5uZXh0Ow0KKyAgICArK25zZWdzOw0KKyAgICBpZiAoaXNfbW1hcHBlZF9zZWdtZW50KHNwKSAmJiAhaXNfZXh0ZXJuX3NlZ21lbnQoc3ApKSB7DQorICAgICAgbWNodW5rcHRyIHAgPSBhbGlnbl9hc19jaHVuayhiYXNlKTsNCisgICAgICBzaXplX3QgcHNpemUgPSBjaHVua3NpemUocCk7DQorICAgICAgLyogQ2FuIHVubWFwIGlmIGZpcnN0IGNodW5rIGhvbGRzIGVudGlyZSBzZWdtZW50IGFuZCBub3QgcGlubmVkICovDQorICAgICAgaWYgKCFpc19pbnVzZShwKSAmJiAoY2hhciopcCArIHBzaXplID49IGJhc2UgKyBzaXplIC0gVE9QX0ZPT1RfU0laRSkgew0KKyAgICAgICAgdGNodW5rcHRyIHRwID0gKHRjaHVua3B0cilwOw0KKyAgICAgICAgYXNzZXJ0KHNlZ21lbnRfaG9sZHMoc3AsIChjaGFyKilzcCkpOw0KKyAgICAgICAgaWYgKHAgPT0gbS0+ZHYpIHsNCisgICAgICAgICAgbS0+ZHYgPSAwOw0KKyAgICAgICAgICBtLT5kdnNpemUgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgIHVubGlua19sYXJnZV9jaHVuayhtLCB0cCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoQ0FMTF9NVU5NQVAoYmFzZSwgc2l6ZSkgPT0gMCkgew0KKyAgICAgICAgICByZWxlYXNlZCArPSBzaXplOw0KKyAgICAgICAgICBtLT5mb290cHJpbnQgLT0gc2l6ZTsNCisgICAgICAgICAgLyogdW5saW5rIG9ic29sZXRlZCByZWNvcmQgKi8NCisgICAgICAgICAgc3AgPSBwcmVkOw0KKyAgICAgICAgICBzcC0+bmV4dCA9IG5leHQ7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsgLyogYmFjayBvdXQgaWYgY2Fubm90IHVubWFwICovDQorICAgICAgICAgIGluc2VydF9sYXJnZV9jaHVuayhtLCB0cCwgcHNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoTk9fU0VHTUVOVF9UUkFWRVJTQUwpIC8qIHNjYW4gb25seSBmaXJzdCBzZWdtZW50ICovDQorICAgICAgYnJlYWs7DQorICAgIHByZWQgPSBzcDsNCisgICAgc3AgPSBuZXh0Ow0KKyAgfQ0KKyAgLyogUmVzZXQgY2hlY2sgY291bnRlciAqLw0KKyAgbS0+cmVsZWFzZV9jaGVja3MgPSAoKG5zZWdzID4gTUFYX1JFTEVBU0VfQ0hFQ0tfUkFURSk/DQorICAgICAgICAgICAgICAgICAgICAgICBuc2VncyA6IE1BWF9SRUxFQVNFX0NIRUNLX1JBVEUpOw0KKyAgcmV0dXJuIHJlbGVhc2VkOw0KK30NCisNCitzdGF0aWMgaW50IHN5c190cmltKG1zdGF0ZSBtLCBzaXplX3QgcGFkKSB7DQorICBzaXplX3QgcmVsZWFzZWQgPSAwOw0KKyAgZW5zdXJlX2luaXRpYWxpemF0aW9uKCk7DQorICBpZiAocGFkIDwgTUFYX1JFUVVFU1QgJiYgaXNfaW5pdGlhbGl6ZWQobSkpIHsNCisgICAgcGFkICs9IFRPUF9GT09UX1NJWkU7IC8qIGVuc3VyZSBlbm91Z2ggcm9vbSBmb3Igc2VnbWVudCBvdmVyaGVhZCAqLw0KKw0KKyAgICBpZiAobS0+dG9wc2l6ZSA+IHBhZCkgew0KKyAgICAgIC8qIFNocmluayB0b3Agc3BhY2UgaW4gZ3JhbnVsYXJpdHktc2l6ZSB1bml0cywga2VlcGluZyBhdCBsZWFzdCBvbmUgKi8NCisgICAgICBzaXplX3QgdW5pdCA9IG1wYXJhbXMuZ3JhbnVsYXJpdHk7DQorICAgICAgc2l6ZV90IGV4dHJhID0gKChtLT50b3BzaXplIC0gcGFkICsgKHVuaXQgLSBTSVpFX1RfT05FKSkgLyB1bml0IC0NCisgICAgICAgICAgICAgICAgICAgICAgU0laRV9UX09ORSkgKiB1bml0Ow0KKyAgICAgIG1zZWdtZW50cHRyIHNwID0gc2VnbWVudF9ob2xkaW5nKG0sIChjaGFyKiltLT50b3ApOw0KKw0KKyAgICAgIGlmICghaXNfZXh0ZXJuX3NlZ21lbnQoc3ApKSB7DQorICAgICAgICBpZiAoaXNfbW1hcHBlZF9zZWdtZW50KHNwKSkgew0KKyAgICAgICAgICBpZiAoSEFWRV9NTUFQICYmDQorICAgICAgICAgICAgICBzcC0+c2l6ZSA+PSBleHRyYSAmJg0KKyAgICAgICAgICAgICAgIWhhc19zZWdtZW50X2xpbmsobSwgc3ApKSB7IC8qIGNhbid0IHNocmluayBpZiBwaW5uZWQgKi8NCisgICAgICAgICAgICBzaXplX3QgbmV3c2l6ZSA9IHNwLT5zaXplIC0gZXh0cmE7DQorICAgICAgICAgICAgLyogUHJlZmVyIG1yZW1hcCwgZmFsbCBiYWNrIHRvIG11bm1hcCAqLw0KKyAgICAgICAgICAgIGlmICgoQ0FMTF9NUkVNQVAoc3AtPmJhc2UsIHNwLT5zaXplLCBuZXdzaXplLCAwKSAhPSBNRkFJTCkgfHwNCisgICAgICAgICAgICAgICAgKENBTExfTVVOTUFQKHNwLT5iYXNlICsgbmV3c2l6ZSwgZXh0cmEpID09IDApKSB7DQorICAgICAgICAgICAgICByZWxlYXNlZCA9IGV4dHJhOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAoSEFWRV9NT1JFQ09SRSkgew0KKyAgICAgICAgICBpZiAoZXh0cmEgPj0gSEFMRl9NQVhfU0laRV9UKSAvKiBBdm9pZCB3cmFwcGluZyBuZWdhdGl2ZSAqLw0KKyAgICAgICAgICAgIGV4dHJhID0gKEhBTEZfTUFYX1NJWkVfVCkgKyBTSVpFX1RfT05FIC0gdW5pdDsNCisgICAgICAgICAgQUNRVUlSRV9NQUxMT0NfR0xPQkFMX0xPQ0soKTsNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSBlbmQgb2YgbWVtb3J5IGlzIHdoZXJlIHdlIGxhc3Qgc2V0IGl0LiAqLw0KKyAgICAgICAgICAgIGNoYXIqIG9sZF9iciA9IChjaGFyKikoQ0FMTF9NT1JFQ09SRSgwKSk7DQorICAgICAgICAgICAgaWYgKG9sZF9iciA9PSBzcC0+YmFzZSArIHNwLT5zaXplKSB7DQorICAgICAgICAgICAgICBjaGFyKiByZWxfYnIgPSAoY2hhciopKENBTExfTU9SRUNPUkUoLWV4dHJhKSk7DQorICAgICAgICAgICAgICBjaGFyKiBuZXdfYnIgPSAoY2hhciopKENBTExfTU9SRUNPUkUoMCkpOw0KKyAgICAgICAgICAgICAgaWYgKHJlbF9iciAhPSBDTUZBSUwgJiYgbmV3X2JyIDwgb2xkX2JyKQ0KKyAgICAgICAgICAgICAgICByZWxlYXNlZCA9IG9sZF9iciAtIG5ld19icjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgUkVMRUFTRV9NQUxMT0NfR0xPQkFMX0xPQ0soKTsNCisgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgaWYgKHJlbGVhc2VkICE9IDApIHsNCisgICAgICAgIHNwLT5zaXplIC09IHJlbGVhc2VkOw0KKyAgICAgICAgbS0+Zm9vdHByaW50IC09IHJlbGVhc2VkOw0KKyAgICAgICAgaW5pdF90b3AobSwgbS0+dG9wLCBtLT50b3BzaXplIC0gcmVsZWFzZWQpOw0KKyAgICAgICAgY2hlY2tfdG9wX2NodW5rKG0sIG0tPnRvcCk7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qIFVubWFwIGFueSB1bnVzZWQgbW1hcHBlZCBzZWdtZW50cyAqLw0KKyAgICBpZiAoSEFWRV9NTUFQKQ0KKyAgICAgIHJlbGVhc2VkICs9IHJlbGVhc2VfdW51c2VkX3NlZ21lbnRzKG0pOw0KKw0KKyAgICAvKiBPbiBmYWlsdXJlLCBkaXNhYmxlIGF1dG90cmltIHRvIGF2b2lkIHJlcGVhdGVkIGZhaWxlZCBmdXR1cmUgY2FsbHMgKi8NCisgICAgaWYgKHJlbGVhc2VkID09IDAgJiYgbS0+dG9wc2l6ZSA+IG0tPnRyaW1fY2hlY2spDQorICAgICAgbS0+dHJpbV9jaGVjayA9IE1BWF9TSVpFX1Q7DQorICB9DQorDQorICByZXR1cm4gKHJlbGVhc2VkICE9IDApPyAxIDogMDsNCit9DQorDQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtYWxsb2Mgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisvKiBhbGxvY2F0ZSBhIGxhcmdlIHJlcXVlc3QgZnJvbSB0aGUgYmVzdCBmaXR0aW5nIGNodW5rIGluIGEgdHJlZWJpbiAqLw0KK3N0YXRpYyB2b2lkKiB0bWFsbG9jX2xhcmdlKG1zdGF0ZSBtLCBzaXplX3QgbmIpIHsNCisgIHRjaHVua3B0ciB2ID0gMDsNCisgIHNpemVfdCByc2l6ZSA9IC1uYjsgLyogVW5zaWduZWQgbmVnYXRpb24gKi8NCisgIHRjaHVua3B0ciB0Ow0KKyAgYmluZGV4X3QgaWR4Ow0KKyAgY29tcHV0ZV90cmVlX2luZGV4KG5iLCBpZHgpOw0KKyAgaWYgKCh0ID0gKnRyZWViaW5fYXQobSwgaWR4KSkgIT0gMCkgew0KKyAgICAvKiBUcmF2ZXJzZSB0cmVlIGZvciB0aGlzIGJpbiBsb29raW5nIGZvciBub2RlIHdpdGggc2l6ZSA9PSBuYiAqLw0KKyAgICBzaXplX3Qgc2l6ZWJpdHMgPSBuYiA8PCBsZWZ0c2hpZnRfZm9yX3RyZWVfaW5kZXgoaWR4KTsNCisgICAgdGNodW5rcHRyIHJzdCA9IDA7ICAvKiBUaGUgZGVlcGVzdCB1bnRha2VuIHJpZ2h0IHN1YnRyZWUgKi8NCisgICAgZm9yICg7Oykgew0KKyAgICAgIHRjaHVua3B0ciBydDsNCisgICAgICBzaXplX3QgdHJlbSA9IGNodW5rc2l6ZSh0KSAtIG5iOw0KKyAgICAgIGlmICh0cmVtIDwgcnNpemUpIHsNCisgICAgICAgIHYgPSB0Ow0KKyAgICAgICAgaWYgKChyc2l6ZSA9IHRyZW0pID09IDApDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBydCA9IHQtPmNoaWxkWzFdOw0KKyAgICAgIHQgPSB0LT5jaGlsZFsoc2l6ZWJpdHMgPj4gKFNJWkVfVF9CSVRTSVpFLVNJWkVfVF9PTkUpKSAmIDFdOw0KKyAgICAgIGlmIChydCAhPSAwICYmIHJ0ICE9IHQpDQorICAgICAgICByc3QgPSBydDsNCisgICAgICBpZiAodCA9PSAwKSB7DQorICAgICAgICB0ID0gcnN0OyAvKiBzZXQgdCB0byBsZWFzdCBzdWJ0cmVlIGhvbGRpbmcgc2l6ZXMgPiBuYiAqLw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHNpemViaXRzIDw8PSAxOw0KKyAgICB9DQorICB9DQorICBpZiAodCA9PSAwICYmIHYgPT0gMCkgeyAvKiBzZXQgdCB0byByb290IG9mIG5leHQgbm9uLWVtcHR5IHRyZWViaW4gKi8NCisgICAgYmlubWFwX3QgbGVmdGJpdHMgPSBsZWZ0X2JpdHMoaWR4MmJpdChpZHgpKSAmIG0tPnRyZWVtYXA7DQorICAgIGlmIChsZWZ0Yml0cyAhPSAwKSB7DQorICAgICAgYmluZGV4X3QgaTsNCisgICAgICBiaW5tYXBfdCBsZWFzdGJpdCA9IGxlYXN0X2JpdChsZWZ0Yml0cyk7DQorICAgICAgY29tcHV0ZV9iaXQyaWR4KGxlYXN0Yml0LCBpKTsNCisgICAgICB0ID0gKnRyZWViaW5fYXQobSwgaSk7DQorICAgIH0NCisgIH0NCisNCisgIHdoaWxlICh0ICE9IDApIHsgLyogZmluZCBzbWFsbGVzdCBvZiB0cmVlIG9yIHN1YnRyZWUgKi8NCisgICAgc2l6ZV90IHRyZW0gPSBjaHVua3NpemUodCkgLSBuYjsNCisgICAgaWYgKHRyZW0gPCByc2l6ZSkgew0KKyAgICAgIHJzaXplID0gdHJlbTsNCisgICAgICB2ID0gdDsNCisgICAgfQ0KKyAgICB0ID0gbGVmdG1vc3RfY2hpbGQodCk7DQorICB9DQorDQorICAvKiAgSWYgZHYgaXMgYSBiZXR0ZXIgZml0LCByZXR1cm4gMCBzbyBtYWxsb2Mgd2lsbCB1c2UgaXQgKi8NCisgIGlmICh2ICE9IDAgJiYgcnNpemUgPCAoc2l6ZV90KShtLT5kdnNpemUgLSBuYikpIHsNCisgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhtLCB2KSkpIHsgLyogc3BsaXQgKi8NCisgICAgICBtY2h1bmtwdHIgciA9IGNodW5rX3BsdXNfb2Zmc2V0KHYsIG5iKTsNCisgICAgICBhc3NlcnQoY2h1bmtzaXplKHYpID09IHJzaXplICsgbmIpOw0KKyAgICAgIGlmIChSVENIRUNLKG9rX25leHQodiwgcikpKSB7DQorICAgICAgICB1bmxpbmtfbGFyZ2VfY2h1bmsobSwgdik7DQorICAgICAgICBpZiAocnNpemUgPCBNSU5fQ0hVTktfU0laRSkNCisgICAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobSwgdiwgKHJzaXplICsgbmIpKTsNCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIHYsIG5iKTsNCisgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHIsIHJzaXplKTsNCisgICAgICAgICAgaW5zZXJ0X2NodW5rKG0sIHIsIHJzaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBjaHVuazJtZW0odik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKG0pOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKy8qIGFsbG9jYXRlIGEgc21hbGwgcmVxdWVzdCBmcm9tIHRoZSBiZXN0IGZpdHRpbmcgY2h1bmsgaW4gYSB0cmVlYmluICovDQorc3RhdGljIHZvaWQqIHRtYWxsb2Nfc21hbGwobXN0YXRlIG0sIHNpemVfdCBuYikgew0KKyAgdGNodW5rcHRyIHQsIHY7DQorICBzaXplX3QgcnNpemU7DQorICBiaW5kZXhfdCBpOw0KKyAgYmlubWFwX3QgbGVhc3RiaXQgPSBsZWFzdF9iaXQobS0+dHJlZW1hcCk7DQorICBjb21wdXRlX2JpdDJpZHgobGVhc3RiaXQsIGkpOw0KKyAgdiA9IHQgPSAqdHJlZWJpbl9hdChtLCBpKTsNCisgIHJzaXplID0gY2h1bmtzaXplKHQpIC0gbmI7DQorDQorICB3aGlsZSAoKHQgPSBsZWZ0bW9zdF9jaGlsZCh0KSkgIT0gMCkgew0KKyAgICBzaXplX3QgdHJlbSA9IGNodW5rc2l6ZSh0KSAtIG5iOw0KKyAgICBpZiAodHJlbSA8IHJzaXplKSB7DQorICAgICAgcnNpemUgPSB0cmVtOw0KKyAgICAgIHYgPSB0Ow0KKyAgICB9DQorICB9DQorDQorICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKG0sIHYpKSkgew0KKyAgICBtY2h1bmtwdHIgciA9IGNodW5rX3BsdXNfb2Zmc2V0KHYsIG5iKTsNCisgICAgYXNzZXJ0KGNodW5rc2l6ZSh2KSA9PSByc2l6ZSArIG5iKTsNCisgICAgaWYgKFJUQ0hFQ0sob2tfbmV4dCh2LCByKSkpIHsNCisgICAgICB1bmxpbmtfbGFyZ2VfY2h1bmsobSwgdik7DQorICAgICAgaWYgKHJzaXplIDwgTUlOX0NIVU5LX1NJWkUpDQorICAgICAgICBzZXRfaW51c2VfYW5kX3BpbnVzZShtLCB2LCAocnNpemUgKyBuYikpOw0KKyAgICAgIGVsc2Ugew0KKyAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtLCB2LCBuYik7DQorICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsociwgcnNpemUpOw0KKyAgICAgICAgcmVwbGFjZV9kdihtLCByLCByc2l6ZSk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBjaHVuazJtZW0odik7DQorICAgIH0NCisgIH0NCisNCisgIENPUlJVUFRJT05fRVJST1JfQUNUSU9OKG0pOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZWFsbG9jIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorc3RhdGljIHZvaWQqIGludGVybmFsX3JlYWxsb2MobXN0YXRlIG0sIHZvaWQqIG9sZG1lbSwgc2l6ZV90IGJ5dGVzKSB7DQorICBpZiAoYnl0ZXMgPj0gTUFYX1JFUVVFU1QpIHsNCisgICAgTUFMTE9DX0ZBSUxVUkVfQUNUSU9OOw0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmICghUFJFQUNUSU9OKG0pKSB7DQorICAgIG1jaHVua3B0ciBvbGRwID0gbWVtMmNodW5rKG9sZG1lbSk7DQorICAgIHNpemVfdCBvbGRzaXplID0gY2h1bmtzaXplKG9sZHApOw0KKyAgICBtY2h1bmtwdHIgbmV4dCA9IGNodW5rX3BsdXNfb2Zmc2V0KG9sZHAsIG9sZHNpemUpOw0KKyAgICBtY2h1bmtwdHIgbmV3cCA9IDA7DQorICAgIHZvaWQqIGV4dHJhID0gMDsNCisNCisgICAgLyogVHJ5IHRvIGVpdGhlciBzaHJpbmsgb3IgZXh0ZW5kIGludG8gdG9wLiBFbHNlIG1hbGxvYy1jb3B5LWZyZWUgKi8NCisNCisgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhtLCBvbGRwKSAmJiBva19pbnVzZShvbGRwKSAmJg0KKyAgICAgICAgICAgICAgICBva19uZXh0KG9sZHAsIG5leHQpICYmIG9rX3BpbnVzZShuZXh0KSkpIHsNCisgICAgICBzaXplX3QgbmIgPSByZXF1ZXN0MnNpemUoYnl0ZXMpOw0KKyAgICAgIGlmIChpc19tbWFwcGVkKG9sZHApKQ0KKyAgICAgICAgbmV3cCA9IG1tYXBfcmVzaXplKG0sIG9sZHAsIG5iKTsNCisgICAgICBlbHNlIGlmIChvbGRzaXplID49IG5iKSB7IC8qIGFscmVhZHkgYmlnIGVub3VnaCAqLw0KKyAgICAgICAgc2l6ZV90IHJzaXplID0gb2xkc2l6ZSAtIG5iOw0KKyAgICAgICAgbmV3cCA9IG9sZHA7DQorICAgICAgICBpZiAocnNpemUgPj0gTUlOX0NIVU5LX1NJWkUpIHsNCisgICAgICAgICAgbWNodW5rcHRyIHJlbWFpbmRlciA9IGNodW5rX3BsdXNfb2Zmc2V0KG5ld3AsIG5iKTsNCisgICAgICAgICAgc2V0X2ludXNlKG0sIG5ld3AsIG5iKTsNCisgICAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobSwgcmVtYWluZGVyLCByc2l6ZSk7DQorICAgICAgICAgIGV4dHJhID0gY2h1bmsybWVtKHJlbWFpbmRlcik7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKG5leHQgPT0gbS0+dG9wICYmIG9sZHNpemUgKyBtLT50b3BzaXplID4gbmIpIHsNCisgICAgICAgIC8qIEV4cGFuZCBpbnRvIHRvcCAqLw0KKyAgICAgICAgc2l6ZV90IG5ld3NpemUgPSBvbGRzaXplICsgbS0+dG9wc2l6ZTsNCisgICAgICAgIHNpemVfdCBuZXd0b3BzaXplID0gbmV3c2l6ZSAtIG5iOw0KKyAgICAgICAgbWNodW5rcHRyIG5ld3RvcCA9IGNodW5rX3BsdXNfb2Zmc2V0KG9sZHAsIG5iKTsNCisgICAgICAgIHNldF9pbnVzZShtLCBvbGRwLCBuYik7DQorICAgICAgICBuZXd0b3AtPmhlYWQgPSBuZXd0b3BzaXplIHxQSU5VU0VfQklUOw0KKyAgICAgICAgbS0+dG9wID0gbmV3dG9wOw0KKyAgICAgICAgbS0+dG9wc2l6ZSA9IG5ld3RvcHNpemU7DQorICAgICAgICBuZXdwID0gb2xkcDsNCisgICAgICB9DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgVVNBR0VfRVJST1JfQUNUSU9OKG0sIG9sZG1lbSk7DQorICAgICAgUE9TVEFDVElPTihtKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyNpZiBERUJVRw0KKyAgICBpZiAobmV3cCAhPSAwKSB7DQorICAgICAgY2hlY2tfaW51c2VfY2h1bmsobSwgbmV3cCk7IC8qIENoZWNrIHJlcXVpcmVzIGxvY2sgKi8NCisgICAgfQ0KKyNlbmRpZg0KKw0KKyAgICBQT1NUQUNUSU9OKG0pOw0KKw0KKyAgICBpZiAobmV3cCAhPSAwKSB7DQorICAgICAgaWYgKGV4dHJhICE9IDApIHsNCisgICAgICAgIGludGVybmFsX2ZyZWUobSwgZXh0cmEpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gY2h1bmsybWVtKG5ld3ApOw0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgIHZvaWQqIG5ld21lbSA9IGludGVybmFsX21hbGxvYyhtLCBieXRlcyk7DQorICAgICAgaWYgKG5ld21lbSAhPSAwKSB7DQorICAgICAgICBzaXplX3Qgb2MgPSBvbGRzaXplIC0gb3ZlcmhlYWRfZm9yKG9sZHApOw0KKyAgICAgICAgbWVtY3B5KG5ld21lbSwgb2xkbWVtLCAob2MgPCBieXRlcyk/IG9jIDogYnl0ZXMpOw0KKyAgICAgICAgaW50ZXJuYWxfZnJlZShtLCBvbGRtZW0pOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbmV3bWVtOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lbWFsaWduIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCitzdGF0aWMgdm9pZCogaW50ZXJuYWxfbWVtYWxpZ24obXN0YXRlIG0sIHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBieXRlcykgew0KKyAgaWYgKGFsaWdubWVudCA8PSBNQUxMT0NfQUxJR05NRU5UKSAgICAvKiBDYW4ganVzdCB1c2UgbWFsbG9jICovDQorICAgIHJldHVybiBpbnRlcm5hbF9tYWxsb2MobSwgYnl0ZXMpOw0KKyAgaWYgKGFsaWdubWVudCA8ICBNSU5fQ0hVTktfU0laRSkgLyogbXVzdCBiZSBhdCBsZWFzdCBhIG1pbmltdW0gY2h1bmsgc2l6ZSAqLw0KKyAgICBhbGlnbm1lbnQgPSBNSU5fQ0hVTktfU0laRTsNCisgIGlmICgoYWxpZ25tZW50ICYgKGFsaWdubWVudC1TSVpFX1RfT05FKSkgIT0gMCkgey8qIEVuc3VyZSBhIHBvd2VyIG9mIDIgKi8NCisgICAgc2l6ZV90IGEgPSBNQUxMT0NfQUxJR05NRU5UIDw8IDE7DQorICAgIHdoaWxlIChhIDwgYWxpZ25tZW50KSBhIDw8PSAxOw0KKyAgICBhbGlnbm1lbnQgPSBhOw0KKyAgfQ0KKw0KKyAgaWYgKGJ5dGVzID49IE1BWF9SRVFVRVNUIC0gYWxpZ25tZW50KSB7DQorICAgIGlmIChtICE9IDApICB7IC8qIFRlc3QgaXNuJ3QgbmVlZGVkIGJ1dCBhdm9pZHMgY29tcGlsZXIgd2FybmluZyAqLw0KKyAgICAgIE1BTExPQ19GQUlMVVJFX0FDVElPTjsNCisgICAgfQ0KKyAgfQ0KKyAgZWxzZSB7DQorICAgIHNpemVfdCBuYiA9IHJlcXVlc3Qyc2l6ZShieXRlcyk7DQorICAgIHNpemVfdCByZXEgPSBuYiArIGFsaWdubWVudCArIE1JTl9DSFVOS19TSVpFIC0gQ0hVTktfT1ZFUkhFQUQ7DQorICAgIGNoYXIqIG1lbSA9IChjaGFyKilpbnRlcm5hbF9tYWxsb2MobSwgcmVxKTsNCisgICAgaWYgKG1lbSAhPSAwKSB7DQorICAgICAgdm9pZCogbGVhZGVyID0gMDsNCisgICAgICB2b2lkKiB0cmFpbGVyID0gMDsNCisgICAgICBtY2h1bmtwdHIgcCA9IG1lbTJjaHVuayhtZW0pOw0KKw0KKyAgICAgIGlmIChQUkVBQ1RJT04obSkpIHJldHVybiAwOw0KKyAgICAgIGlmICgoKChzaXplX3QpKG1lbSkpICUgYWxpZ25tZW50KSAhPSAwKSB7IC8qIG1pc2FsaWduZWQgKi8NCisgICAgICAgIC8qDQorICAgICAgICAgIEZpbmQgYW4gYWxpZ25lZCBzcG90IGluc2lkZSBjaHVuay4gIFNpbmNlIHdlIG5lZWQgdG8gZ2l2ZQ0KKyAgICAgICAgICBiYWNrIGxlYWRpbmcgc3BhY2UgaW4gYSBjaHVuayBvZiBhdCBsZWFzdCBNSU5fQ0hVTktfU0laRSwgaWYNCisgICAgICAgICAgdGhlIGZpcnN0IGNhbGN1bGF0aW9uIHBsYWNlcyB1cyBhdCBhIHNwb3Qgd2l0aCBsZXNzIHRoYW4NCisgICAgICAgICAgTUlOX0NIVU5LX1NJWkUgbGVhZGVyLCB3ZSBjYW4gbW92ZSB0byB0aGUgbmV4dCBhbGlnbmVkIHNwb3QuDQorICAgICAgICAgIFdlJ3ZlIGFsbG9jYXRlZCBlbm91Z2ggdG90YWwgcm9vbSBzbyB0aGF0IHRoaXMgaXMgYWx3YXlzDQorICAgICAgICAgIHBvc3NpYmxlLg0KKyAgICAgICAgKi8NCisgICAgICAgIGNoYXIqIGJyID0gKGNoYXIqKW1lbTJjaHVuaygoc2l6ZV90KSgoKHNpemVfdCkobWVtICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRV9UX09ORSkpICYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtYWxpZ25tZW50KSk7DQorICAgICAgICBjaGFyKiBwb3MgPSAoKHNpemVfdCkoYnIgLSAoY2hhciopKHApKSA+PSBNSU5fQ0hVTktfU0laRSk/DQorICAgICAgICAgIGJyIDogYnIrYWxpZ25tZW50Ow0KKyAgICAgICAgbWNodW5rcHRyIG5ld3AgPSAobWNodW5rcHRyKXBvczsNCisgICAgICAgIHNpemVfdCBsZWFkc2l6ZSA9IHBvcyAtIChjaGFyKikocCk7DQorICAgICAgICBzaXplX3QgbmV3c2l6ZSA9IGNodW5rc2l6ZShwKSAtIGxlYWRzaXplOw0KKw0KKyAgICAgICAgaWYgKGlzX21tYXBwZWQocCkpIHsgLyogRm9yIG1tYXBwZWQgY2h1bmtzLCBqdXN0IGFkanVzdCBvZmZzZXQgKi8NCisgICAgICAgICAgbmV3cC0+cHJldl9mb290ID0gcC0+cHJldl9mb290ICsgbGVhZHNpemU7DQorICAgICAgICAgIG5ld3AtPmhlYWQgPSBuZXdzaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7IC8qIE90aGVyd2lzZSwgZ2l2ZSBiYWNrIGxlYWRlciwgdXNlIHRoZSByZXN0ICovDQorICAgICAgICAgIHNldF9pbnVzZShtLCBuZXdwLCBuZXdzaXplKTsNCisgICAgICAgICAgc2V0X2ludXNlKG0sIHAsIGxlYWRzaXplKTsNCisgICAgICAgICAgbGVhZGVyID0gY2h1bmsybWVtKHApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcCA9IG5ld3A7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qIEdpdmUgYmFjayBzcGFyZSByb29tIGF0IHRoZSBlbmQgKi8NCisgICAgICBpZiAoIWlzX21tYXBwZWQocCkpIHsNCisgICAgICAgIHNpemVfdCBzaXplID0gY2h1bmtzaXplKHApOw0KKyAgICAgICAgaWYgKHNpemUgPiBuYiArIE1JTl9DSFVOS19TSVpFKSB7DQorICAgICAgICAgIHNpemVfdCByZW1haW5kZXJfc2l6ZSA9IHNpemUgLSBuYjsNCisgICAgICAgICAgbWNodW5rcHRyIHJlbWFpbmRlciA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsNCisgICAgICAgICAgc2V0X2ludXNlKG0sIHAsIG5iKTsNCisgICAgICAgICAgc2V0X2ludXNlKG0sIHJlbWFpbmRlciwgcmVtYWluZGVyX3NpemUpOw0KKyAgICAgICAgICB0cmFpbGVyID0gY2h1bmsybWVtKHJlbWFpbmRlcik7DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIGFzc2VydCAoY2h1bmtzaXplKHApID49IG5iKTsNCisgICAgICBhc3NlcnQoKCgoc2l6ZV90KShjaHVuazJtZW0ocCkpKSAlIGFsaWdubWVudCkgPT0gMCk7DQorICAgICAgY2hlY2tfaW51c2VfY2h1bmsobSwgcCk7DQorICAgICAgUE9TVEFDVElPTihtKTsNCisgICAgICBpZiAobGVhZGVyICE9IDApIHsNCisgICAgICAgIGludGVybmFsX2ZyZWUobSwgbGVhZGVyKTsNCisgICAgICB9DQorICAgICAgaWYgKHRyYWlsZXIgIT0gMCkgew0KKyAgICAgICAgaW50ZXJuYWxfZnJlZShtLCB0cmFpbGVyKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIGNodW5rMm1lbShwKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb21hbGxvYy9jb2FsbG9jIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorc3RhdGljIHZvaWQqKiBpYWxsb2MobXN0YXRlIG0sDQorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5fZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBzaXplcywNCisgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0cywNCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjaHVua3NbXSkgew0KKyAgLyoNCisgICAgVGhpcyBwcm92aWRlcyBjb21tb24gc3VwcG9ydCBmb3IgaW5kZXBlbmRlbnRfWCByb3V0aW5lcywgaGFuZGxpbmcNCisgICAgYWxsIG9mIHRoZSBjb21iaW5hdGlvbnMgdGhhdCBjYW4gcmVzdWx0Lg0KKw0KKyAgICBUaGUgb3B0cyBhcmcgaGFzOg0KKyAgICBiaXQgMCBzZXQgaWYgYWxsIGVsZW1lbnRzIGFyZSBzYW1lIHNpemUgKHVzaW5nIHNpemVzWzBdKQ0KKyAgICBiaXQgMSBzZXQgaWYgZWxlbWVudHMgc2hvdWxkIGJlIHplcm9lZA0KKyAgKi8NCisNCisgIHNpemVfdCAgICBlbGVtZW50X3NpemU7ICAgLyogY2h1bmtzaXplIG9mIGVhY2ggZWxlbWVudCwgaWYgYWxsIHNhbWUgKi8NCisgIHNpemVfdCAgICBjb250ZW50c19zaXplOyAgLyogdG90YWwgc2l6ZSBvZiBlbGVtZW50cyAqLw0KKyAgc2l6ZV90ICAgIGFycmF5X3NpemU7ICAgICAvKiByZXF1ZXN0IHNpemUgb2YgcG9pbnRlciBhcnJheSAqLw0KKyAgdm9pZCogICAgIG1lbTsgICAgICAgICAgICAvKiBtYWxsb2NlZCBhZ2dyZWdhdGUgc3BhY2UgKi8NCisgIG1jaHVua3B0ciBwOyAgICAgICAgICAgICAgLyogY29ycmVzcG9uZGluZyBjaHVuayAqLw0KKyAgc2l6ZV90ICAgIHJlbWFpbmRlcl9zaXplOyAvKiByZW1haW5pbmcgYnl0ZXMgd2hpbGUgc3BsaXR0aW5nICovDQorICB2b2lkKiogICAgbWFycmF5OyAgICAgICAgIC8qIGVpdGhlciAiY2h1bmtzIiBvciBtYWxsb2NlZCBwdHIgYXJyYXkgKi8NCisgIG1jaHVua3B0ciBhcnJheV9jaHVuazsgICAgLyogY2h1bmsgZm9yIG1hbGxvY2VkIHB0ciBhcnJheSAqLw0KKyAgZmxhZ190ICAgIHdhc19lbmFibGVkOyAgICAvKiB0byBkaXNhYmxlIG1tYXAgKi8NCisgIHNpemVfdCAgICBzaXplOw0KKyAgc2l6ZV90ICAgIGk7DQorDQorICBlbnN1cmVfaW5pdGlhbGl6YXRpb24oKTsNCisgIC8qIGNvbXB1dGUgYXJyYXkgbGVuZ3RoLCBpZiBuZWVkZWQgKi8NCisgIGlmIChjaHVua3MgIT0gMCkgew0KKyAgICBpZiAobl9lbGVtZW50cyA9PSAwKQ0KKyAgICAgIHJldHVybiBjaHVua3M7IC8qIG5vdGhpbmcgdG8gZG8gKi8NCisgICAgbWFycmF5ID0gY2h1bmtzOw0KKyAgICBhcnJheV9zaXplID0gMDsNCisgIH0NCisgIGVsc2Ugew0KKyAgICAvKiBpZiBlbXB0eSByZXEsIG11c3Qgc3RpbGwgcmV0dXJuIGNodW5rIHJlcHJlc2VudGluZyBlbXB0eSBhcnJheSAqLw0KKyAgICBpZiAobl9lbGVtZW50cyA9PSAwKQ0KKyAgICAgIHJldHVybiAodm9pZCoqKWludGVybmFsX21hbGxvYyhtLCAwKTsNCisgICAgbWFycmF5ID0gMDsNCisgICAgYXJyYXlfc2l6ZSA9IHJlcXVlc3Qyc2l6ZShuX2VsZW1lbnRzICogKHNpemVvZih2b2lkKikpKTsNCisgIH0NCisNCisgIC8qIGNvbXB1dGUgdG90YWwgZWxlbWVudCBzaXplICovDQorICBpZiAob3B0cyAmIDB4MSkgeyAvKiBhbGwtc2FtZS1zaXplICovDQorICAgIGVsZW1lbnRfc2l6ZSA9IHJlcXVlc3Qyc2l6ZSgqc2l6ZXMpOw0KKyAgICBjb250ZW50c19zaXplID0gbl9lbGVtZW50cyAqIGVsZW1lbnRfc2l6ZTsNCisgIH0NCisgIGVsc2UgeyAvKiBhZGQgdXAgYWxsIHRoZSBzaXplcyAqLw0KKyAgICBlbGVtZW50X3NpemUgPSAwOw0KKyAgICBjb250ZW50c19zaXplID0gMDsNCisgICAgZm9yIChpID0gMDsgaSAhPSBuX2VsZW1lbnRzOyArK2kpDQorICAgICAgY29udGVudHNfc2l6ZSArPSByZXF1ZXN0MnNpemUoc2l6ZXNbaV0pOw0KKyAgfQ0KKw0KKyAgc2l6ZSA9IGNvbnRlbnRzX3NpemUgKyBhcnJheV9zaXplOw0KKw0KKyAgLyoNCisgICAgIEFsbG9jYXRlIHRoZSBhZ2dyZWdhdGUgY2h1bmsuICBGaXJzdCBkaXNhYmxlIGRpcmVjdC1tbWFwcGluZyBzbw0KKyAgICAgbWFsbG9jIHdvbid0IHVzZSBpdCwgc2luY2Ugd2Ugd291bGQgbm90IGJlIGFibGUgdG8gbGF0ZXINCisgICAgIGZyZWUvcmVhbGxvYyBzcGFjZSBpbnRlcm5hbCB0byBhIHNlZ3JlZ2F0ZWQgbW1hcCByZWdpb24uDQorICAqLw0KKyAgd2FzX2VuYWJsZWQgPSB1c2VfbW1hcChtKTsNCisgIGRpc2FibGVfbW1hcChtKTsNCisgIG1lbSA9IGludGVybmFsX21hbGxvYyhtLCBzaXplIC0gQ0hVTktfT1ZFUkhFQUQpOw0KKyAgaWYgKHdhc19lbmFibGVkKQ0KKyAgICBlbmFibGVfbW1hcChtKTsNCisgIGlmIChtZW0gPT0gMCkNCisgICAgcmV0dXJuIDA7DQorDQorICBpZiAoUFJFQUNUSU9OKG0pKSByZXR1cm4gMDsNCisgIHAgPSBtZW0yY2h1bmsobWVtKTsNCisgIHJlbWFpbmRlcl9zaXplID0gY2h1bmtzaXplKHApOw0KKw0KKyAgYXNzZXJ0KCFpc19tbWFwcGVkKHApKTsNCisNCisgIGlmIChvcHRzICYgMHgyKSB7ICAgICAgIC8qIG9wdGlvbmFsbHkgY2xlYXIgdGhlIGVsZW1lbnRzICovDQorICAgIG1lbXNldCgoc2l6ZV90KiltZW0sIDAsIHJlbWFpbmRlcl9zaXplIC0gU0laRV9UX1NJWkUgLSBhcnJheV9zaXplKTsNCisgIH0NCisNCisgIC8qIElmIG5vdCBwcm92aWRlZCwgYWxsb2NhdGUgdGhlIHBvaW50ZXIgYXJyYXkgYXMgZmluYWwgcGFydCBvZiBjaHVuayAqLw0KKyAgaWYgKG1hcnJheSA9PSAwKSB7DQorICAgIHNpemVfdCAgYXJyYXlfY2h1bmtfc2l6ZTsNCisgICAgYXJyYXlfY2h1bmsgPSBjaHVua19wbHVzX29mZnNldChwLCBjb250ZW50c19zaXplKTsNCisgICAgYXJyYXlfY2h1bmtfc2l6ZSA9IHJlbWFpbmRlcl9zaXplIC0gY29udGVudHNfc2l6ZTsNCisgICAgbWFycmF5ID0gKHZvaWQqKikgKGNodW5rMm1lbShhcnJheV9jaHVuaykpOw0KKyAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIGFycmF5X2NodW5rLCBhcnJheV9jaHVua19zaXplKTsNCisgICAgcmVtYWluZGVyX3NpemUgPSBjb250ZW50c19zaXplOw0KKyAgfQ0KKw0KKyAgLyogc3BsaXQgb3V0IGVsZW1lbnRzICovDQorICBmb3IgKGkgPSAwOyA7ICsraSkgew0KKyAgICBtYXJyYXlbaV0gPSBjaHVuazJtZW0ocCk7DQorICAgIGlmIChpICE9IG5fZWxlbWVudHMtMSkgew0KKyAgICAgIGlmIChlbGVtZW50X3NpemUgIT0gMCkNCisgICAgICAgIHNpemUgPSBlbGVtZW50X3NpemU7DQorICAgICAgZWxzZQ0KKyAgICAgICAgc2l6ZSA9IHJlcXVlc3Qyc2l6ZShzaXplc1tpXSk7DQorICAgICAgcmVtYWluZGVyX3NpemUgLT0gc2l6ZTsNCisgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKG0sIHAsIHNpemUpOw0KKyAgICAgIHAgPSBjaHVua19wbHVzX29mZnNldChwLCBzaXplKTsNCisgICAgfQ0KKyAgICBlbHNlIHsgLyogdGhlIGZpbmFsIGVsZW1lbnQgYWJzb3JicyBhbnkgb3ZlcmFsbG9jYXRpb24gc2xvcCAqLw0KKyAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobSwgcCwgcmVtYWluZGVyX3NpemUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorDQorI2lmIERFQlVHDQorICBpZiAobWFycmF5ICE9IGNodW5rcykgew0KKyAgICAvKiBmaW5hbCBlbGVtZW50IG11c3QgaGF2ZSBleGFjdGx5IGV4aGF1c3RlZCBjaHVuayAqLw0KKyAgICBpZiAoZWxlbWVudF9zaXplICE9IDApIHsNCisgICAgICBhc3NlcnQocmVtYWluZGVyX3NpemUgPT0gZWxlbWVudF9zaXplKTsNCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICBhc3NlcnQocmVtYWluZGVyX3NpemUgPT0gcmVxdWVzdDJzaXplKHNpemVzW2ldKSk7DQorICAgIH0NCisgICAgY2hlY2tfaW51c2VfY2h1bmsobSwgbWVtMmNodW5rKG1hcnJheSkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSAhPSBuX2VsZW1lbnRzOyArK2kpDQorICAgIGNoZWNrX2ludXNlX2NodW5rKG0sIG1lbTJjaHVuayhtYXJyYXlbaV0pKTsNCisNCisjZW5kaWYgLyogREVCVUcgKi8NCisNCisgIFBPU1RBQ1RJT04obSk7DQorICByZXR1cm4gbWFycmF5Ow0KK30NCisNCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwdWJsaWMgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKyNpZiAhT05MWV9NU1BBQ0VTDQorDQordm9pZCogZGxtYWxsb2Moc2l6ZV90IGJ5dGVzKSB7DQorICAvKg0KKyAgICAgQmFzaWMgYWxnb3JpdGhtOg0KKyAgICAgSWYgYSBzbWFsbCByZXF1ZXN0ICg8IDI1NiBieXRlcyBtaW51cyBwZXItY2h1bmsgb3ZlcmhlYWQpOg0KKyAgICAgICAxLiBJZiBvbmUgZXhpc3RzLCB1c2UgYSByZW1haW5kZXJsZXNzIGNodW5rIGluIGFzc29jaWF0ZWQgc21hbGxiaW4uDQorICAgICAgICAgIChSZW1haW5kZXJsZXNzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIHRvbyBmZXcgZXhjZXNzIGJ5dGVzIHRvDQorICAgICAgICAgIHJlcHJlc2VudCBhcyBhIGNodW5rLikNCisgICAgICAgMi4gSWYgaXQgaXMgYmlnIGVub3VnaCwgdXNlIHRoZSBkdiBjaHVuaywgd2hpY2ggaXMgbm9ybWFsbHkgdGhlDQorICAgICAgICAgIGNodW5rIGFkamFjZW50IHRvIHRoZSBvbmUgdXNlZCBmb3IgdGhlIG1vc3QgcmVjZW50IHNtYWxsIHJlcXVlc3QuDQorICAgICAgIDMuIElmIG9uZSBleGlzdHMsIHNwbGl0IHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgY2h1bmsgaW4gYSBiaW4sDQorICAgICAgICAgIHNhdmluZyByZW1haW5kZXIgaW4gZHYuDQorICAgICAgIDQuIElmIGl0IGlzIGJpZyBlbm91Z2gsIHVzZSB0aGUgdG9wIGNodW5rLg0KKyAgICAgICA1LiBJZiBhdmFpbGFibGUsIGdldCBtZW1vcnkgZnJvbSBzeXN0ZW0gYW5kIHVzZSBpdA0KKyAgICAgT3RoZXJ3aXNlLCBmb3IgYSBsYXJnZSByZXF1ZXN0Og0KKyAgICAgICAxLiBGaW5kIHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgYmlubmVkIGNodW5rIHRoYXQgZml0cywgYW5kIHVzZSBpdA0KKyAgICAgICAgICBpZiBpdCBpcyBiZXR0ZXIgZml0dGluZyB0aGFuIGR2IGNodW5rLCBzcGxpdHRpbmcgaWYgbmVjZXNzYXJ5Lg0KKyAgICAgICAyLiBJZiBiZXR0ZXIgZml0dGluZyB0aGFuIGFueSBiaW5uZWQgY2h1bmssIHVzZSB0aGUgZHYgY2h1bmsuDQorICAgICAgIDMuIElmIGl0IGlzIGJpZyBlbm91Z2gsIHVzZSB0aGUgdG9wIGNodW5rLg0KKyAgICAgICA0LiBJZiByZXF1ZXN0IHNpemUgPj0gbW1hcCB0aHJlc2hvbGQsIHRyeSB0byBkaXJlY3RseSBtbWFwIHRoaXMgY2h1bmsuDQorICAgICAgIDUuIElmIGF2YWlsYWJsZSwgZ2V0IG1lbW9yeSBmcm9tIHN5c3RlbSBhbmQgdXNlIGl0DQorDQorICAgICBUaGUgdWdseSBnb3RvJ3MgaGVyZSBlbnN1cmUgdGhhdCBwb3N0YWN0aW9uIG9jY3VycyBhbG9uZyBhbGwgcGF0aHMuDQorICAqLw0KKw0KKyNpZiBVU0VfTE9DS1MNCisgIGVuc3VyZV9pbml0aWFsaXphdGlvbigpOyAvKiBpbml0aWFsaXplIGluIHN5c19hbGxvYyBpZiBub3QgdXNpbmcgbG9ja3MgKi8NCisjZW5kaWYNCisNCisgIGlmICghUFJFQUNUSU9OKGdtKSkgew0KKyAgICB2b2lkKiBtZW07DQorICAgIHNpemVfdCBuYjsNCisgICAgaWYgKGJ5dGVzIDw9IE1BWF9TTUFMTF9SRVFVRVNUKSB7DQorICAgICAgYmluZGV4X3QgaWR4Ow0KKyAgICAgIGJpbm1hcF90IHNtYWxsYml0czsNCisgICAgICBuYiA9IChieXRlcyA8IE1JTl9SRVFVRVNUKT8gTUlOX0NIVU5LX1NJWkUgOiBwYWRfcmVxdWVzdChieXRlcyk7DQorICAgICAgaWR4ID0gc21hbGxfaW5kZXgobmIpOw0KKyAgICAgIHNtYWxsYml0cyA9IGdtLT5zbWFsbG1hcCA+PiBpZHg7DQorDQorICAgICAgaWYgKChzbWFsbGJpdHMgJiAweDNVKSAhPSAwKSB7IC8qIFJlbWFpbmRlcmxlc3MgZml0IHRvIGEgc21hbGxiaW4uICovDQorICAgICAgICBtY2h1bmtwdHIgYiwgcDsNCisgICAgICAgIGlkeCArPSB+c21hbGxiaXRzICYgMTsgICAgICAgLyogVXNlcyBuZXh0IGJpbiBpZiBpZHggZW1wdHkgKi8NCisgICAgICAgIGIgPSBzbWFsbGJpbl9hdChnbSwgaWR4KTsNCisgICAgICAgIHAgPSBiLT5mZDsNCisgICAgICAgIGFzc2VydChjaHVua3NpemUocCkgPT0gc21hbGxfaW5kZXgyc2l6ZShpZHgpKTsNCisgICAgICAgIHVubGlua19maXJzdF9zbWFsbF9jaHVuayhnbSwgYiwgcCwgaWR4KTsNCisgICAgICAgIHNldF9pbnVzZV9hbmRfcGludXNlKGdtLCBwLCBzbWFsbF9pbmRleDJzaXplKGlkeCkpOw0KKyAgICAgICAgbWVtID0gY2h1bmsybWVtKHApOw0KKyAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOw0KKyAgICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICAgIH0NCisNCisgICAgICBlbHNlIGlmIChuYiA+IGdtLT5kdnNpemUpIHsNCisgICAgICAgIGlmIChzbWFsbGJpdHMgIT0gMCkgeyAvKiBVc2UgY2h1bmsgaW4gbmV4dCBub25lbXB0eSBzbWFsbGJpbiAqLw0KKyAgICAgICAgICBtY2h1bmtwdHIgYiwgcCwgcjsNCisgICAgICAgICAgc2l6ZV90IHJzaXplOw0KKyAgICAgICAgICBiaW5kZXhfdCBpOw0KKyAgICAgICAgICBiaW5tYXBfdCBsZWZ0Yml0cyA9IChzbWFsbGJpdHMgPDwgaWR4KSAmIGxlZnRfYml0cyhpZHgyYml0KGlkeCkpOw0KKyAgICAgICAgICBiaW5tYXBfdCBsZWFzdGJpdCA9IGxlYXN0X2JpdChsZWZ0Yml0cyk7DQorICAgICAgICAgIGNvbXB1dGVfYml0MmlkeChsZWFzdGJpdCwgaSk7DQorICAgICAgICAgIGIgPSBzbWFsbGJpbl9hdChnbSwgaSk7DQorICAgICAgICAgIHAgPSBiLT5mZDsNCisgICAgICAgICAgYXNzZXJ0KGNodW5rc2l6ZShwKSA9PSBzbWFsbF9pbmRleDJzaXplKGkpKTsNCisgICAgICAgICAgdW5saW5rX2ZpcnN0X3NtYWxsX2NodW5rKGdtLCBiLCBwLCBpKTsNCisgICAgICAgICAgcnNpemUgPSBzbWFsbF9pbmRleDJzaXplKGkpIC0gbmI7DQorICAgICAgICAgIC8qIEZpdCBoZXJlIGNhbm5vdCBiZSByZW1haW5kZXJsZXNzIGlmIDRieXRlIHNpemVzICovDQorICAgICAgICAgIGlmIChTSVpFX1RfU0laRSAhPSA0ICYmIHJzaXplIDwgTUlOX0NIVU5LX1NJWkUpDQorICAgICAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UoZ20sIHAsIHNtYWxsX2luZGV4MnNpemUoaSkpOw0KKyAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ludXNlX2NodW5rKGdtLCBwLCBuYik7DQorICAgICAgICAgICAgciA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsNCisgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsociwgcnNpemUpOw0KKyAgICAgICAgICAgIHJlcGxhY2VfZHYoZ20sIHIsIHJzaXplKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBtZW0gPSBjaHVuazJtZW0ocCk7DQorICAgICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKGdtLCBtZW0sIG5iKTsNCisgICAgICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZWxzZSBpZiAoZ20tPnRyZWVtYXAgIT0gMCAmJiAobWVtID0gdG1hbGxvY19zbWFsbChnbSwgbmIpKSAhPSAwKSB7DQorICAgICAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKGdtLCBtZW0sIG5iKTsNCisgICAgICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlIGlmIChieXRlcyA+PSBNQVhfUkVRVUVTVCkNCisgICAgICBuYiA9IE1BWF9TSVpFX1Q7IC8qIFRvbyBiaWcgdG8gYWxsb2NhdGUuIEZvcmNlIGZhaWx1cmUgKGluIHN5cyBhbGxvYykgKi8NCisgICAgZWxzZSB7DQorICAgICAgbmIgPSBwYWRfcmVxdWVzdChieXRlcyk7DQorICAgICAgaWYgKGdtLT50cmVlbWFwICE9IDAgJiYgKG1lbSA9IHRtYWxsb2NfbGFyZ2UoZ20sIG5iKSkgIT0gMCkgew0KKyAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsoZ20sIG1lbSwgbmIpOw0KKyAgICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAobmIgPD0gZ20tPmR2c2l6ZSkgew0KKyAgICAgIHNpemVfdCByc2l6ZSA9IGdtLT5kdnNpemUgLSBuYjsNCisgICAgICBtY2h1bmtwdHIgcCA9IGdtLT5kdjsNCisgICAgICBpZiAocnNpemUgPj0gTUlOX0NIVU5LX1NJWkUpIHsgLyogc3BsaXQgZHYgKi8NCisgICAgICAgIG1jaHVua3B0ciByID0gZ20tPmR2ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOw0KKyAgICAgICAgZ20tPmR2c2l6ZSA9IHJzaXplOw0KKyAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHIsIHJzaXplKTsNCisgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsoZ20sIHAsIG5iKTsNCisgICAgICB9DQorICAgICAgZWxzZSB7IC8qIGV4aGF1c3QgZHYgKi8NCisgICAgICAgIHNpemVfdCBkdnMgPSBnbS0+ZHZzaXplOw0KKyAgICAgICAgZ20tPmR2c2l6ZSA9IDA7DQorICAgICAgICBnbS0+ZHYgPSAwOw0KKyAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UoZ20sIHAsIGR2cyk7DQorICAgICAgfQ0KKyAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsNCisgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhnbSwgbWVtLCBuYik7DQorICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICB9DQorDQorICAgIGVsc2UgaWYgKG5iIDwgZ20tPnRvcHNpemUpIHsgLyogU3BsaXQgdG9wICovDQorICAgICAgc2l6ZV90IHJzaXplID0gZ20tPnRvcHNpemUgLT0gbmI7DQorICAgICAgbWNodW5rcHRyIHAgPSBnbS0+dG9wOw0KKyAgICAgIG1jaHVua3B0ciByID0gZ20tPnRvcCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIG5iKTsNCisgICAgICByLT5oZWFkID0gcnNpemUgfCBQSU5VU0VfQklUOw0KKyAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsoZ20sIHAsIG5iKTsNCisgICAgICBtZW0gPSBjaHVuazJtZW0ocCk7DQorICAgICAgY2hlY2tfdG9wX2NodW5rKGdtLCBnbS0+dG9wKTsNCisgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhnbSwgbWVtLCBuYik7DQorICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICB9DQorDQorICAgIG1lbSA9IHN5c19hbGxvYyhnbSwgbmIpOw0KKw0KKyAgcG9zdGFjdGlvbjoNCisgICAgUE9TVEFDVElPTihnbSk7DQorICAgIHJldHVybiBtZW07DQorICB9DQorDQorICByZXR1cm4gMDsNCit9DQorDQordm9pZCBkbGZyZWUodm9pZCogbWVtKSB7DQorICAvKg0KKyAgICAgQ29uc29saWRhdGUgZnJlZWQgY2h1bmtzIHdpdGggcHJlY2VlZGluZyBvciBzdWNjZWVkaW5nIGJvcmRlcmluZw0KKyAgICAgZnJlZSBjaHVua3MsIGlmIHRoZXkgZXhpc3QsIGFuZCB0aGVuIHBsYWNlIGluIGEgYmluLiAgSW50ZXJtaXhlZA0KKyAgICAgd2l0aCBzcGVjaWFsIGNhc2VzIGZvciB0b3AsIGR2LCBtbWFwcGVkIGNodW5rcywgYW5kIHVzYWdlIGVycm9ycy4NCisgICovDQorDQorICBpZiAobWVtICE9IDApIHsNCisgICAgbWNodW5rcHRyIHAgID0gbWVtMmNodW5rKG1lbSk7DQorI2lmIEZPT1RFUlMNCisgICAgbXN0YXRlIGZtID0gZ2V0X21zdGF0ZV9mb3IocCk7DQorICAgIGlmICghb2tfbWFnaWMoZm0pKSB7DQorICAgICAgVVNBR0VfRVJST1JfQUNUSU9OKGZtLCBwKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisjZWxzZSAvKiBGT09URVJTICovDQorI2RlZmluZSBmbSBnbQ0KKyNlbmRpZiAvKiBGT09URVJTICovDQorICAgIGlmICghUFJFQUNUSU9OKGZtKSkgew0KKyAgICAgIGNoZWNrX2ludXNlX2NodW5rKGZtLCBwKTsNCisgICAgICBpZiAoUlRDSEVDSyhva19hZGRyZXNzKGZtLCBwKSAmJiBva19pbnVzZShwKSkpIHsNCisgICAgICAgIHNpemVfdCBwc2l6ZSA9IGNodW5rc2l6ZShwKTsNCisgICAgICAgIG1jaHVua3B0ciBuZXh0ID0gY2h1bmtfcGx1c19vZmZzZXQocCwgcHNpemUpOw0KKyAgICAgICAgaWYgKCFwaW51c2UocCkpIHsNCisgICAgICAgICAgc2l6ZV90IHByZXZzaXplID0gcC0+cHJldl9mb290Ow0KKyAgICAgICAgICBpZiAoaXNfbW1hcHBlZChwKSkgew0KKyAgICAgICAgICAgIHBzaXplICs9IHByZXZzaXplICsgTU1BUF9GT09UX1BBRDsNCisgICAgICAgICAgICBpZiAoQ0FMTF9NVU5NQVAoKGNoYXIqKXAgLSBwcmV2c2l6ZSwgcHNpemUpID09IDApDQorICAgICAgICAgICAgICBmbS0+Zm9vdHByaW50IC09IHBzaXplOw0KKyAgICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBtY2h1bmtwdHIgcHJldiA9IGNodW5rX21pbnVzX29mZnNldChwLCBwcmV2c2l6ZSk7DQorICAgICAgICAgICAgcHNpemUgKz0gcHJldnNpemU7DQorICAgICAgICAgICAgcCA9IHByZXY7DQorICAgICAgICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcHJldikpKSB7IC8qIGNvbnNvbGlkYXRlIGJhY2t3YXJkICovDQorICAgICAgICAgICAgICBpZiAocCAhPSBmbS0+ZHYpIHsNCisgICAgICAgICAgICAgICAgdW5saW5rX2NodW5rKGZtLCBwLCBwcmV2c2l6ZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBlbHNlIGlmICgobmV4dC0+aGVhZCAmIElOVVNFX0JJVFMpID09IElOVVNFX0JJVFMpIHsNCisgICAgICAgICAgICAgICAgZm0tPmR2c2l6ZSA9IHBzaXplOw0KKyAgICAgICAgICAgICAgICBzZXRfZnJlZV93aXRoX3BpbnVzZShwLCBwc2l6ZSwgbmV4dCk7DQorICAgICAgICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgZ290byBlcnJvcmFjdGlvbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKFJUQ0hFQ0sob2tfbmV4dChwLCBuZXh0KSAmJiBva19waW51c2UobmV4dCkpKSB7DQorICAgICAgICAgIGlmICghY2ludXNlKG5leHQpKSB7ICAvKiBjb25zb2xpZGF0ZSBmb3J3YXJkICovDQorICAgICAgICAgICAgaWYgKG5leHQgPT0gZm0tPnRvcCkgew0KKyAgICAgICAgICAgICAgc2l6ZV90IHRzaXplID0gZm0tPnRvcHNpemUgKz0gcHNpemU7DQorICAgICAgICAgICAgICBmbS0+dG9wID0gcDsNCisgICAgICAgICAgICAgIHAtPmhlYWQgPSB0c2l6ZSB8IFBJTlVTRV9CSVQ7DQorICAgICAgICAgICAgICBpZiAocCA9PSBmbS0+ZHYpIHsNCisgICAgICAgICAgICAgICAgZm0tPmR2ID0gMDsNCisgICAgICAgICAgICAgICAgZm0tPmR2c2l6ZSA9IDA7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAoc2hvdWxkX3RyaW0oZm0sIHRzaXplKSkNCisgICAgICAgICAgICAgICAgc3lzX3RyaW0oZm0sIDApOw0KKyAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmIChuZXh0ID09IGZtLT5kdikgew0KKyAgICAgICAgICAgICAgc2l6ZV90IGRzaXplID0gZm0tPmR2c2l6ZSArPSBwc2l6ZTsNCisgICAgICAgICAgICAgIGZtLT5kdiA9IHA7DQorICAgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgZHNpemUpOw0KKyAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgIHNpemVfdCBuc2l6ZSA9IGNodW5rc2l6ZShuZXh0KTsNCisgICAgICAgICAgICAgIHBzaXplICs9IG5zaXplOw0KKyAgICAgICAgICAgICAgdW5saW5rX2NodW5rKGZtLCBuZXh0LCBuc2l6ZSk7DQorICAgICAgICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsocCwgcHNpemUpOw0KKyAgICAgICAgICAgICAgaWYgKHAgPT0gZm0tPmR2KSB7DQorICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSBwc2l6ZTsNCisgICAgICAgICAgICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgc2V0X2ZyZWVfd2l0aF9waW51c2UocCwgcHNpemUsIG5leHQpOw0KKw0KKyAgICAgICAgICBpZiAoaXNfc21hbGwocHNpemUpKSB7DQorICAgICAgICAgICAgaW5zZXJ0X3NtYWxsX2NodW5rKGZtLCBwLCBwc2l6ZSk7DQorICAgICAgICAgICAgY2hlY2tfZnJlZV9jaHVuayhmbSwgcCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgdGNodW5rcHRyIHRwID0gKHRjaHVua3B0cilwOw0KKyAgICAgICAgICAgIGluc2VydF9sYXJnZV9jaHVuayhmbSwgdHAsIHBzaXplKTsNCisgICAgICAgICAgICBjaGVja19mcmVlX2NodW5rKGZtLCBwKTsNCisgICAgICAgICAgICBpZiAoLS1mbS0+cmVsZWFzZV9jaGVja3MgPT0gMCkNCisgICAgICAgICAgICAgIHJlbGVhc2VfdW51c2VkX3NlZ21lbnRzKGZtKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICBlcnJvcmFjdGlvbjoNCisgICAgICBVU0FHRV9FUlJPUl9BQ1RJT04oZm0sIHApOw0KKyAgICBwb3N0YWN0aW9uOg0KKyAgICAgIFBPU1RBQ1RJT04oZm0pOw0KKyAgICB9DQorICB9DQorI2lmICFGT09URVJTDQorI3VuZGVmIGZtDQorI2VuZGlmIC8qIEZPT1RFUlMgKi8NCit9DQorDQordm9pZCogZGxjYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtX3NpemUpIHsNCisgIHZvaWQqIG1lbTsNCisgIHNpemVfdCByZXEgPSAwOw0KKyAgaWYgKG5fZWxlbWVudHMgIT0gMCkgew0KKyAgICByZXEgPSBuX2VsZW1lbnRzICogZWxlbV9zaXplOw0KKyAgICBpZiAoKChuX2VsZW1lbnRzIHwgZWxlbV9zaXplKSAmIH4oc2l6ZV90KTB4ZmZmZikgJiYNCisgICAgICAgIChyZXEgLyBuX2VsZW1lbnRzICE9IGVsZW1fc2l6ZSkpDQorICAgICAgcmVxID0gTUFYX1NJWkVfVDsgLyogZm9yY2UgZG93bnN0cmVhbSBmYWlsdXJlIG9uIG92ZXJmbG93ICovDQorICB9DQorICBtZW0gPSBkbG1hbGxvYyhyZXEpOw0KKyAgaWYgKG1lbSAhPSAwICYmIGNhbGxvY19tdXN0X2NsZWFyKG1lbTJjaHVuayhtZW0pKSkNCisgICAgbWVtc2V0KG1lbSwgMCwgcmVxKTsNCisgIHJldHVybiBtZW07DQorfQ0KKw0KK3ZvaWQqIGRscmVhbGxvYyh2b2lkKiBvbGRtZW0sIHNpemVfdCBieXRlcykgew0KKyAgaWYgKG9sZG1lbSA9PSAwKQ0KKyAgICByZXR1cm4gZGxtYWxsb2MoYnl0ZXMpOw0KKyNpZmRlZiBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMNCisgIGlmIChieXRlcyA9PSAwKSB7DQorICAgIGRsZnJlZShvbGRtZW0pOw0KKyAgICByZXR1cm4gMDsNCisgIH0NCisjZW5kaWYgLyogUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTICovDQorICBlbHNlIHsNCisjaWYgISBGT09URVJTDQorICAgIG1zdGF0ZSBtID0gZ207DQorI2Vsc2UgLyogRk9PVEVSUyAqLw0KKyAgICBtc3RhdGUgbSA9IGdldF9tc3RhdGVfZm9yKG1lbTJjaHVuayhvbGRtZW0pKTsNCisgICAgaWYgKCFva19tYWdpYyhtKSkgew0KKyAgICAgIFVTQUdFX0VSUk9SX0FDVElPTihtLCBvbGRtZW0pOw0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorI2VuZGlmIC8qIEZPT1RFUlMgKi8NCisgICAgcmV0dXJuIGludGVybmFsX3JlYWxsb2MobSwgb2xkbWVtLCBieXRlcyk7DQorICB9DQorfQ0KKw0KK3ZvaWQqIGRsbWVtYWxpZ24oc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IGJ5dGVzKSB7DQorICByZXR1cm4gaW50ZXJuYWxfbWVtYWxpZ24oZ20sIGFsaWdubWVudCwgYnl0ZXMpOw0KK30NCisNCit2b2lkKiogZGxpbmRlcGVuZGVudF9jYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtX3NpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2h1bmtzW10pIHsNCisgIHNpemVfdCBzeiA9IGVsZW1fc2l6ZTsgLyogc2VydmVzIGFzIDEtZWxlbWVudCBhcnJheSAqLw0KKyAgcmV0dXJuIGlhbGxvYyhnbSwgbl9lbGVtZW50cywgJnN6LCAzLCBjaHVua3MpOw0KK30NCisNCit2b2lkKiogZGxpbmRlcGVuZGVudF9jb21hbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IHNpemVzW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjaHVua3NbXSkgew0KKyAgcmV0dXJuIGlhbGxvYyhnbSwgbl9lbGVtZW50cywgc2l6ZXMsIDAsIGNodW5rcyk7DQorfQ0KKw0KK3ZvaWQqIGRsdmFsbG9jKHNpemVfdCBieXRlcykgew0KKyAgc2l6ZV90IHBhZ2VzejsNCisgIGVuc3VyZV9pbml0aWFsaXphdGlvbigpOw0KKyAgcGFnZXN6ID0gbXBhcmFtcy5wYWdlX3NpemU7DQorICByZXR1cm4gZGxtZW1hbGlnbihwYWdlc3osIGJ5dGVzKTsNCit9DQorDQordm9pZCogZGxwdmFsbG9jKHNpemVfdCBieXRlcykgew0KKyAgc2l6ZV90IHBhZ2VzejsNCisgIGVuc3VyZV9pbml0aWFsaXphdGlvbigpOw0KKyAgcGFnZXN6ID0gbXBhcmFtcy5wYWdlX3NpemU7DQorICByZXR1cm4gZGxtZW1hbGlnbihwYWdlc3osIChieXRlcyArIHBhZ2VzeiAtIFNJWkVfVF9PTkUpICYgfihwYWdlc3ogLSBTSVpFX1RfT05FKSk7DQorfQ0KKw0KK2ludCBkbG1hbGxvY190cmltKHNpemVfdCBwYWQpIHsNCisgIGludCByZXN1bHQgPSAwOw0KKyAgZW5zdXJlX2luaXRpYWxpemF0aW9uKCk7DQorICBpZiAoIVBSRUFDVElPTihnbSkpIHsNCisgICAgcmVzdWx0ID0gc3lzX3RyaW0oZ20sIHBhZCk7DQorICAgIFBPU1RBQ1RJT04oZ20pOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorDQorc2l6ZV90IGRsbWFsbG9jX2Zvb3RwcmludCh2b2lkKSB7DQorICByZXR1cm4gZ20tPmZvb3RwcmludDsNCit9DQorDQorc2l6ZV90IGRsbWFsbG9jX21heF9mb290cHJpbnQodm9pZCkgew0KKyAgcmV0dXJuIGdtLT5tYXhfZm9vdHByaW50Ow0KK30NCisNCisjaWYgIU5PX01BTExJTkZPDQorc3RydWN0IG1hbGxpbmZvIGRsbWFsbGluZm8odm9pZCkgew0KKyAgcmV0dXJuIGludGVybmFsX21hbGxpbmZvKGdtKTsNCit9DQorI2VuZGlmIC8qIE5PX01BTExJTkZPICovDQorDQordm9pZCBkbG1hbGxvY19zdGF0cygpIHsNCisgIGludGVybmFsX21hbGxvY19zdGF0cyhnbSk7DQorfQ0KKw0KK2ludCBkbG1hbGxvcHQoaW50IHBhcmFtX251bWJlciwgaW50IHZhbHVlKSB7DQorICByZXR1cm4gY2hhbmdlX21wYXJhbShwYXJhbV9udW1iZXIsIHZhbHVlKTsNCit9DQorDQorI2VuZGlmIC8qICFPTkxZX01TUEFDRVMgKi8NCisNCitzaXplX3QgZGxtYWxsb2NfdXNhYmxlX3NpemUodm9pZCogbWVtKSB7DQorICBpZiAobWVtICE9IDApIHsNCisgICAgbWNodW5rcHRyIHAgPSBtZW0yY2h1bmsobWVtKTsNCisgICAgaWYgKGlzX2ludXNlKHApKQ0KKyAgICAgIHJldHVybiBjaHVua3NpemUocCkgLSBvdmVyaGVhZF9mb3IocCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdXNlciBtc3BhY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCisNCisjaWYgTVNQQUNFUw0KKw0KK3N0YXRpYyBtc3RhdGUgaW5pdF91c2VyX21zdGF0ZShjaGFyKiB0YmFzZSwgc2l6ZV90IHRzaXplKSB7DQorICBzaXplX3QgbXNpemUgPSBwYWRfcmVxdWVzdChzaXplb2Yoc3RydWN0IG1hbGxvY19zdGF0ZSkpOw0KKyAgbWNodW5rcHRyIG1uOw0KKyAgbWNodW5rcHRyIG1zcCA9IGFsaWduX2FzX2NodW5rKHRiYXNlKTsNCisgIG1zdGF0ZSBtID0gKG1zdGF0ZSkoY2h1bmsybWVtKG1zcCkpOw0KKyAgbWVtc2V0KG0sIDAsIG1zaXplKTsNCisgIElOSVRJQUxfTE9DSygmbS0+bXV0ZXgpOw0KKyAgbXNwLT5oZWFkID0gKG1zaXplfElOVVNFX0JJVFMpOw0KKyAgbS0+c2VnLmJhc2UgPSBtLT5sZWFzdF9hZGRyID0gdGJhc2U7DQorICBtLT5zZWcuc2l6ZSA9IG0tPmZvb3RwcmludCA9IG0tPm1heF9mb290cHJpbnQgPSB0c2l6ZTsNCisgIG0tPm1hZ2ljID0gbXBhcmFtcy5tYWdpYzsNCisgIG0tPnJlbGVhc2VfY2hlY2tzID0gTUFYX1JFTEVBU0VfQ0hFQ0tfUkFURTsNCisgIG0tPm1mbGFncyA9IG1wYXJhbXMuZGVmYXVsdF9tZmxhZ3M7DQorICBtLT5leHRwID0gMDsNCisgIG0tPmV4dHMgPSAwOw0KKyAgZGlzYWJsZV9jb250aWd1b3VzKG0pOw0KKyAgaW5pdF9iaW5zKG0pOw0KKyAgbW4gPSBuZXh0X2NodW5rKG1lbTJjaHVuayhtKSk7DQorICBpbml0X3RvcChtLCBtbiwgKHNpemVfdCkoKHRiYXNlICsgdHNpemUpIC0gKGNoYXIqKW1uKSAtIFRPUF9GT09UX1NJWkUpOw0KKyAgY2hlY2tfdG9wX2NodW5rKG0sIG0tPnRvcCk7DQorICByZXR1cm4gbTsNCit9DQorDQorbXNwYWNlIGNyZWF0ZV9tc3BhY2Uoc2l6ZV90IGNhcGFjaXR5LCBpbnQgbG9ja2VkKSB7DQorICBtc3RhdGUgbSA9IDA7DQorICBzaXplX3QgbXNpemU7DQorICBlbnN1cmVfaW5pdGlhbGl6YXRpb24oKTsNCisgIG1zaXplID0gcGFkX3JlcXVlc3Qoc2l6ZW9mKHN0cnVjdCBtYWxsb2Nfc3RhdGUpKTsNCisgIGlmIChjYXBhY2l0eSA8IChzaXplX3QpIC0obXNpemUgKyBUT1BfRk9PVF9TSVpFICsgbXBhcmFtcy5wYWdlX3NpemUpKSB7DQorICAgIHNpemVfdCBycyA9ICgoY2FwYWNpdHkgPT0gMCk/IG1wYXJhbXMuZ3JhbnVsYXJpdHkgOg0KKyAgICAgICAgICAgICAgICAgKGNhcGFjaXR5ICsgVE9QX0ZPT1RfU0laRSArIG1zaXplKSk7DQorICAgIHNpemVfdCB0c2l6ZSA9IGdyYW51bGFyaXR5X2FsaWduKHJzKTsNCisgICAgY2hhciogdGJhc2UgPSAoY2hhciopKENBTExfTU1BUCh0c2l6ZSkpOw0KKyAgICBpZiAodGJhc2UgIT0gQ01GQUlMKSB7DQorICAgICAgbSA9IGluaXRfdXNlcl9tc3RhdGUodGJhc2UsIHRzaXplKTsNCisgICAgICBtLT5zZWcuc2ZsYWdzID0gVVNFX01NQVBfQklUOw0KKyAgICAgIHNldF9sb2NrKG0sIGxvY2tlZCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAobXNwYWNlKW07DQorfQ0KKw0KK21zcGFjZSBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZSh2b2lkKiBiYXNlLCBzaXplX3QgY2FwYWNpdHksIGludCBsb2NrZWQpIHsNCisgIG1zdGF0ZSBtID0gMDsNCisgIHNpemVfdCBtc2l6ZTsNCisgIGVuc3VyZV9pbml0aWFsaXphdGlvbigpOw0KKyAgbXNpemUgPSBwYWRfcmVxdWVzdChzaXplb2Yoc3RydWN0IG1hbGxvY19zdGF0ZSkpOw0KKyAgaWYgKGNhcGFjaXR5ID4gbXNpemUgKyBUT1BfRk9PVF9TSVpFICYmDQorICAgICAgY2FwYWNpdHkgPCAoc2l6ZV90KSAtKG1zaXplICsgVE9QX0ZPT1RfU0laRSArIG1wYXJhbXMucGFnZV9zaXplKSkgew0KKyAgICBtID0gaW5pdF91c2VyX21zdGF0ZSgoY2hhciopYmFzZSwgY2FwYWNpdHkpOw0KKyAgICBtLT5zZWcuc2ZsYWdzID0gRVhURVJOX0JJVDsNCisgICAgc2V0X2xvY2sobSwgbG9ja2VkKTsNCisgIH0NCisgIHJldHVybiAobXNwYWNlKW07DQorfQ0KKw0KK2ludCBtc3BhY2VfdHJhY2tfbGFyZ2VfY2h1bmtzKG1zcGFjZSBtc3AsIGludCBlbmFibGUpIHsNCisgIGludCByZXQgPSAwOw0KKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7DQorICBpZiAoIVBSRUFDVElPTihtcykpIHsNCisgICAgaWYgKCF1c2VfbW1hcChtcykpDQorICAgICAgcmV0ID0gMTsNCisgICAgaWYgKCFlbmFibGUpDQorICAgICAgZW5hYmxlX21tYXAobXMpOw0KKyAgICBlbHNlDQorICAgICAgZGlzYWJsZV9tbWFwKG1zKTsNCisgICAgUE9TVEFDVElPTihtcyk7DQorICB9DQorICByZXR1cm4gcmV0Ow0KK30NCisNCitzaXplX3QgZGVzdHJveV9tc3BhY2UobXNwYWNlIG1zcCkgew0KKyAgc2l6ZV90IGZyZWVkID0gMDsNCisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOw0KKyAgaWYgKG9rX21hZ2ljKG1zKSkgew0KKyAgICBtc2VnbWVudHB0ciBzcCA9ICZtcy0+c2VnOw0KKyAgICB3aGlsZSAoc3AgIT0gMCkgew0KKyAgICAgIGNoYXIqIGJhc2UgPSBzcC0+YmFzZTsNCisgICAgICBzaXplX3Qgc2l6ZSA9IHNwLT5zaXplOw0KKyAgICAgIGZsYWdfdCBmbGFnID0gc3AtPnNmbGFnczsNCisgICAgICBzcCA9IHNwLT5uZXh0Ow0KKyAgICAgIGlmICgoZmxhZyAmIFVTRV9NTUFQX0JJVCkgJiYgIShmbGFnICYgRVhURVJOX0JJVCkgJiYNCisgICAgICAgICAgQ0FMTF9NVU5NQVAoYmFzZSwgc2l6ZSkgPT0gMCkNCisgICAgICAgIGZyZWVkICs9IHNpemU7DQorICAgIH0NCisgIH0NCisgIGVsc2Ugew0KKyAgICBVU0FHRV9FUlJPUl9BQ1RJT04obXMsbXMpOw0KKyAgfQ0KKyAgcmV0dXJuIGZyZWVkOw0KK30NCisNCisvKg0KKyAgbXNwYWNlIHZlcnNpb25zIG9mIHJvdXRpbmVzIGFyZSBuZWFyLWNsb25lcyBvZiB0aGUgZ2xvYmFsDQorICB2ZXJzaW9ucy4gVGhpcyBpcyBub3Qgc28gbmljZSBidXQgYmV0dGVyIHRoYW4gdGhlIGFsdGVybmF0aXZlcy4NCisqLw0KKw0KKw0KK3ZvaWQqIG1zcGFjZV9tYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IGJ5dGVzKSB7DQorICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsNCisgIGlmICghb2tfbWFnaWMobXMpKSB7DQorICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKCFQUkVBQ1RJT04obXMpKSB7DQorICAgIHZvaWQqIG1lbTsNCisgICAgc2l6ZV90IG5iOw0KKyAgICBpZiAoYnl0ZXMgPD0gTUFYX1NNQUxMX1JFUVVFU1QpIHsNCisgICAgICBiaW5kZXhfdCBpZHg7DQorICAgICAgYmlubWFwX3Qgc21hbGxiaXRzOw0KKyAgICAgIG5iID0gKGJ5dGVzIDwgTUlOX1JFUVVFU1QpPyBNSU5fQ0hVTktfU0laRSA6IHBhZF9yZXF1ZXN0KGJ5dGVzKTsNCisgICAgICBpZHggPSBzbWFsbF9pbmRleChuYik7DQorICAgICAgc21hbGxiaXRzID0gbXMtPnNtYWxsbWFwID4+IGlkeDsNCisNCisgICAgICBpZiAoKHNtYWxsYml0cyAmIDB4M1UpICE9IDApIHsgLyogUmVtYWluZGVybGVzcyBmaXQgdG8gYSBzbWFsbGJpbi4gKi8NCisgICAgICAgIG1jaHVua3B0ciBiLCBwOw0KKyAgICAgICAgaWR4ICs9IH5zbWFsbGJpdHMgJiAxOyAgICAgICAvKiBVc2VzIG5leHQgYmluIGlmIGlkeCBlbXB0eSAqLw0KKyAgICAgICAgYiA9IHNtYWxsYmluX2F0KG1zLCBpZHgpOw0KKyAgICAgICAgcCA9IGItPmZkOw0KKyAgICAgICAgYXNzZXJ0KGNodW5rc2l6ZShwKSA9PSBzbWFsbF9pbmRleDJzaXplKGlkeCkpOw0KKyAgICAgICAgdW5saW5rX2ZpcnN0X3NtYWxsX2NodW5rKG1zLCBiLCBwLCBpZHgpOw0KKyAgICAgICAgc2V0X2ludXNlX2FuZF9waW51c2UobXMsIHAsIHNtYWxsX2luZGV4MnNpemUoaWR4KSk7DQorICAgICAgICBtZW0gPSBjaHVuazJtZW0ocCk7DQorICAgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7DQorICAgICAgICBnb3RvIHBvc3RhY3Rpb247DQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UgaWYgKG5iID4gbXMtPmR2c2l6ZSkgew0KKyAgICAgICAgaWYgKHNtYWxsYml0cyAhPSAwKSB7IC8qIFVzZSBjaHVuayBpbiBuZXh0IG5vbmVtcHR5IHNtYWxsYmluICovDQorICAgICAgICAgIG1jaHVua3B0ciBiLCBwLCByOw0KKyAgICAgICAgICBzaXplX3QgcnNpemU7DQorICAgICAgICAgIGJpbmRleF90IGk7DQorICAgICAgICAgIGJpbm1hcF90IGxlZnRiaXRzID0gKHNtYWxsYml0cyA8PCBpZHgpICYgbGVmdF9iaXRzKGlkeDJiaXQoaWR4KSk7DQorICAgICAgICAgIGJpbm1hcF90IGxlYXN0Yml0ID0gbGVhc3RfYml0KGxlZnRiaXRzKTsNCisgICAgICAgICAgY29tcHV0ZV9iaXQyaWR4KGxlYXN0Yml0LCBpKTsNCisgICAgICAgICAgYiA9IHNtYWxsYmluX2F0KG1zLCBpKTsNCisgICAgICAgICAgcCA9IGItPmZkOw0KKyAgICAgICAgICBhc3NlcnQoY2h1bmtzaXplKHApID09IHNtYWxsX2luZGV4MnNpemUoaSkpOw0KKyAgICAgICAgICB1bmxpbmtfZmlyc3Rfc21hbGxfY2h1bmsobXMsIGIsIHAsIGkpOw0KKyAgICAgICAgICByc2l6ZSA9IHNtYWxsX2luZGV4MnNpemUoaSkgLSBuYjsNCisgICAgICAgICAgLyogRml0IGhlcmUgY2Fubm90IGJlIHJlbWFpbmRlcmxlc3MgaWYgNGJ5dGUgc2l6ZXMgKi8NCisgICAgICAgICAgaWYgKFNJWkVfVF9TSVpFICE9IDQgJiYgcnNpemUgPCBNSU5fQ0hVTktfU0laRSkNCisgICAgICAgICAgICBzZXRfaW51c2VfYW5kX3BpbnVzZShtcywgcCwgc21hbGxfaW5kZXgyc2l6ZShpKSk7DQorICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfaW51c2VfY2h1bmsobXMsIHAsIG5iKTsNCisgICAgICAgICAgICByID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOw0KKyAgICAgICAgICAgIHNldF9zaXplX2FuZF9waW51c2Vfb2ZfZnJlZV9jaHVuayhyLCByc2l6ZSk7DQorICAgICAgICAgICAgcmVwbGFjZV9kdihtcywgciwgcnNpemUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsNCisgICAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobXMsIG1lbSwgbmIpOw0KKyAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247DQorICAgICAgICB9DQorDQorICAgICAgICBlbHNlIGlmIChtcy0+dHJlZW1hcCAhPSAwICYmIChtZW0gPSB0bWFsbG9jX3NtYWxsKG1zLCBuYikpICE9IDApIHsNCisgICAgICAgICAgY2hlY2tfbWFsbG9jZWRfY2h1bmsobXMsIG1lbSwgbmIpOw0KKyAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UgaWYgKGJ5dGVzID49IE1BWF9SRVFVRVNUKQ0KKyAgICAgIG5iID0gTUFYX1NJWkVfVDsgLyogVG9vIGJpZyB0byBhbGxvY2F0ZS4gRm9yY2UgZmFpbHVyZSAoaW4gc3lzIGFsbG9jKSAqLw0KKyAgICBlbHNlIHsNCisgICAgICBuYiA9IHBhZF9yZXF1ZXN0KGJ5dGVzKTsNCisgICAgICBpZiAobXMtPnRyZWVtYXAgIT0gMCAmJiAobWVtID0gdG1hbGxvY19sYXJnZShtcywgbmIpKSAhPSAwKSB7DQorICAgICAgICBjaGVja19tYWxsb2NlZF9jaHVuayhtcywgbWVtLCBuYik7DQorICAgICAgICBnb3RvIHBvc3RhY3Rpb247DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGlmIChuYiA8PSBtcy0+ZHZzaXplKSB7DQorICAgICAgc2l6ZV90IHJzaXplID0gbXMtPmR2c2l6ZSAtIG5iOw0KKyAgICAgIG1jaHVua3B0ciBwID0gbXMtPmR2Ow0KKyAgICAgIGlmIChyc2l6ZSA+PSBNSU5fQ0hVTktfU0laRSkgeyAvKiBzcGxpdCBkdiAqLw0KKyAgICAgICAgbWNodW5rcHRyIHIgPSBtcy0+ZHYgPSBjaHVua19wbHVzX29mZnNldChwLCBuYik7DQorICAgICAgICBtcy0+ZHZzaXplID0gcnNpemU7DQorICAgICAgICBzZXRfc2l6ZV9hbmRfcGludXNlX29mX2ZyZWVfY2h1bmsociwgcnNpemUpOw0KKyAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtcywgcCwgbmIpOw0KKyAgICAgIH0NCisgICAgICBlbHNlIHsgLyogZXhoYXVzdCBkdiAqLw0KKyAgICAgICAgc2l6ZV90IGR2cyA9IG1zLT5kdnNpemU7DQorICAgICAgICBtcy0+ZHZzaXplID0gMDsNCisgICAgICAgIG1zLT5kdiA9IDA7DQorICAgICAgICBzZXRfaW51c2VfYW5kX3BpbnVzZShtcywgcCwgZHZzKTsNCisgICAgICB9DQorICAgICAgbWVtID0gY2h1bmsybWVtKHApOw0KKyAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKG1zLCBtZW0sIG5iKTsNCisgICAgICBnb3RvIHBvc3RhY3Rpb247DQorICAgIH0NCisNCisgICAgZWxzZSBpZiAobmIgPCBtcy0+dG9wc2l6ZSkgeyAvKiBTcGxpdCB0b3AgKi8NCisgICAgICBzaXplX3QgcnNpemUgPSBtcy0+dG9wc2l6ZSAtPSBuYjsNCisgICAgICBtY2h1bmtwdHIgcCA9IG1zLT50b3A7DQorICAgICAgbWNodW5rcHRyIHIgPSBtcy0+dG9wID0gY2h1bmtfcGx1c19vZmZzZXQocCwgbmIpOw0KKyAgICAgIHItPmhlYWQgPSByc2l6ZSB8IFBJTlVTRV9CSVQ7DQorICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9pbnVzZV9jaHVuayhtcywgcCwgbmIpOw0KKyAgICAgIG1lbSA9IGNodW5rMm1lbShwKTsNCisgICAgICBjaGVja190b3BfY2h1bmsobXMsIG1zLT50b3ApOw0KKyAgICAgIGNoZWNrX21hbGxvY2VkX2NodW5rKG1zLCBtZW0sIG5iKTsNCisgICAgICBnb3RvIHBvc3RhY3Rpb247DQorICAgIH0NCisNCisgICAgbWVtID0gc3lzX2FsbG9jKG1zLCBuYik7DQorDQorICBwb3N0YWN0aW9uOg0KKyAgICBQT1NUQUNUSU9OKG1zKTsNCisgICAgcmV0dXJuIG1lbTsNCisgIH0NCisNCisgIHJldHVybiAwOw0KK30NCisNCit2b2lkIG1zcGFjZV9mcmVlKG1zcGFjZSBtc3AsIHZvaWQqIG1lbSkgew0KKyAgaWYgKG1lbSAhPSAwKSB7DQorICAgIG1jaHVua3B0ciBwICA9IG1lbTJjaHVuayhtZW0pOw0KKyNpZiBGT09URVJTDQorICAgIG1zdGF0ZSBmbSA9IGdldF9tc3RhdGVfZm9yKHApOw0KKyAgICBtc3AgPSBtc3A7IC8qIHBsYWNhdGUgcGVvcGxlIGNvbXBpbGluZyAtV3VudXNlZCAqLw0KKyNlbHNlIC8qIEZPT1RFUlMgKi8NCisgICAgbXN0YXRlIGZtID0gKG1zdGF0ZSltc3A7DQorI2VuZGlmIC8qIEZPT1RFUlMgKi8NCisgICAgaWYgKCFva19tYWdpYyhmbSkpIHsNCisgICAgICBVU0FHRV9FUlJPUl9BQ1RJT04oZm0sIHApOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoIVBSRUFDVElPTihmbSkpIHsNCisgICAgICBjaGVja19pbnVzZV9jaHVuayhmbSwgcCk7DQorICAgICAgaWYgKFJUQ0hFQ0sob2tfYWRkcmVzcyhmbSwgcCkgJiYgb2tfaW51c2UocCkpKSB7DQorICAgICAgICBzaXplX3QgcHNpemUgPSBjaHVua3NpemUocCk7DQorICAgICAgICBtY2h1bmtwdHIgbmV4dCA9IGNodW5rX3BsdXNfb2Zmc2V0KHAsIHBzaXplKTsNCisgICAgICAgIGlmICghcGludXNlKHApKSB7DQorICAgICAgICAgIHNpemVfdCBwcmV2c2l6ZSA9IHAtPnByZXZfZm9vdDsNCisgICAgICAgICAgaWYgKGlzX21tYXBwZWQocCkpIHsNCisgICAgICAgICAgICBwc2l6ZSArPSBwcmV2c2l6ZSArIE1NQVBfRk9PVF9QQUQ7DQorICAgICAgICAgICAgaWYgKENBTExfTVVOTUFQKChjaGFyKilwIC0gcHJldnNpemUsIHBzaXplKSA9PSAwKQ0KKyAgICAgICAgICAgICAgZm0tPmZvb3RwcmludCAtPSBwc2l6ZTsNCisgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247DQorICAgICAgICAgIH0NCisgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgbWNodW5rcHRyIHByZXYgPSBjaHVua19taW51c19vZmZzZXQocCwgcHJldnNpemUpOw0KKyAgICAgICAgICAgIHBzaXplICs9IHByZXZzaXplOw0KKyAgICAgICAgICAgIHAgPSBwcmV2Ow0KKyAgICAgICAgICAgIGlmIChSVENIRUNLKG9rX2FkZHJlc3MoZm0sIHByZXYpKSkgeyAvKiBjb25zb2xpZGF0ZSBiYWNrd2FyZCAqLw0KKyAgICAgICAgICAgICAgaWYgKHAgIT0gZm0tPmR2KSB7DQorICAgICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgcCwgcHJldnNpemUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoKG5leHQtPmhlYWQgJiBJTlVTRV9CSVRTKSA9PSBJTlVTRV9CSVRTKSB7DQorICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSBwc2l6ZTsNCisgICAgICAgICAgICAgICAgc2V0X2ZyZWVfd2l0aF9waW51c2UocCwgcHNpemUsIG5leHQpOw0KKyAgICAgICAgICAgICAgICBnb3RvIHBvc3RhY3Rpb247DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgIGdvdG8gZXJyb3JhY3Rpb247DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChSVENIRUNLKG9rX25leHQocCwgbmV4dCkgJiYgb2tfcGludXNlKG5leHQpKSkgew0KKyAgICAgICAgICBpZiAoIWNpbnVzZShuZXh0KSkgeyAgLyogY29uc29saWRhdGUgZm9yd2FyZCAqLw0KKyAgICAgICAgICAgIGlmIChuZXh0ID09IGZtLT50b3ApIHsNCisgICAgICAgICAgICAgIHNpemVfdCB0c2l6ZSA9IGZtLT50b3BzaXplICs9IHBzaXplOw0KKyAgICAgICAgICAgICAgZm0tPnRvcCA9IHA7DQorICAgICAgICAgICAgICBwLT5oZWFkID0gdHNpemUgfCBQSU5VU0VfQklUOw0KKyAgICAgICAgICAgICAgaWYgKHAgPT0gZm0tPmR2KSB7DQorICAgICAgICAgICAgICAgIGZtLT5kdiA9IDA7DQorICAgICAgICAgICAgICAgIGZtLT5kdnNpemUgPSAwOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHNob3VsZF90cmltKGZtLCB0c2l6ZSkpDQorICAgICAgICAgICAgICAgIHN5c190cmltKGZtLCAwKTsNCisgICAgICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PSBmbS0+ZHYpIHsNCisgICAgICAgICAgICAgIHNpemVfdCBkc2l6ZSA9IGZtLT5kdnNpemUgKz0gcHNpemU7DQorICAgICAgICAgICAgICBmbS0+ZHYgPSBwOw0KKyAgICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHAsIGRzaXplKTsNCisgICAgICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICBzaXplX3QgbnNpemUgPSBjaHVua3NpemUobmV4dCk7DQorICAgICAgICAgICAgICBwc2l6ZSArPSBuc2l6ZTsNCisgICAgICAgICAgICAgIHVubGlua19jaHVuayhmbSwgbmV4dCwgbnNpemUpOw0KKyAgICAgICAgICAgICAgc2V0X3NpemVfYW5kX3BpbnVzZV9vZl9mcmVlX2NodW5rKHAsIHBzaXplKTsNCisgICAgICAgICAgICAgIGlmIChwID09IGZtLT5kdikgew0KKyAgICAgICAgICAgICAgICBmbS0+ZHZzaXplID0gcHNpemU7DQorICAgICAgICAgICAgICAgIGdvdG8gcG9zdGFjdGlvbjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHNldF9mcmVlX3dpdGhfcGludXNlKHAsIHBzaXplLCBuZXh0KTsNCisNCisgICAgICAgICAgaWYgKGlzX3NtYWxsKHBzaXplKSkgew0KKyAgICAgICAgICAgIGluc2VydF9zbWFsbF9jaHVuayhmbSwgcCwgcHNpemUpOw0KKyAgICAgICAgICAgIGNoZWNrX2ZyZWVfY2h1bmsoZm0sIHApOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIHRjaHVua3B0ciB0cCA9ICh0Y2h1bmtwdHIpcDsNCisgICAgICAgICAgICBpbnNlcnRfbGFyZ2VfY2h1bmsoZm0sIHRwLCBwc2l6ZSk7DQorICAgICAgICAgICAgY2hlY2tfZnJlZV9jaHVuayhmbSwgcCk7DQorICAgICAgICAgICAgaWYgKC0tZm0tPnJlbGVhc2VfY2hlY2tzID09IDApDQorICAgICAgICAgICAgICByZWxlYXNlX3VudXNlZF9zZWdtZW50cyhmbSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZ290byBwb3N0YWN0aW9uOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgZXJyb3JhY3Rpb246DQorICAgICAgVVNBR0VfRVJST1JfQUNUSU9OKGZtLCBwKTsNCisgICAgcG9zdGFjdGlvbjoNCisgICAgICBQT1NUQUNUSU9OKGZtKTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCit2b2lkKiBtc3BhY2VfY2FsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBuX2VsZW1lbnRzLCBzaXplX3QgZWxlbV9zaXplKSB7DQorICB2b2lkKiBtZW07DQorICBzaXplX3QgcmVxID0gMDsNCisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOw0KKyAgaWYgKCFva19tYWdpYyhtcykpIHsNCisgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAobl9lbGVtZW50cyAhPSAwKSB7DQorICAgIHJlcSA9IG5fZWxlbWVudHMgKiBlbGVtX3NpemU7DQorICAgIGlmICgoKG5fZWxlbWVudHMgfCBlbGVtX3NpemUpICYgfihzaXplX3QpMHhmZmZmKSAmJg0KKyAgICAgICAgKHJlcSAvIG5fZWxlbWVudHMgIT0gZWxlbV9zaXplKSkNCisgICAgICByZXEgPSBNQVhfU0laRV9UOyAvKiBmb3JjZSBkb3duc3RyZWFtIGZhaWx1cmUgb24gb3ZlcmZsb3cgKi8NCisgIH0NCisgIG1lbSA9IGludGVybmFsX21hbGxvYyhtcywgcmVxKTsNCisgIGlmIChtZW0gIT0gMCAmJiBjYWxsb2NfbXVzdF9jbGVhcihtZW0yY2h1bmsobWVtKSkpDQorICAgIG1lbXNldChtZW0sIDAsIHJlcSk7DQorICByZXR1cm4gbWVtOw0KK30NCisNCit2b2lkKiBtc3BhY2VfcmVhbGxvYyhtc3BhY2UgbXNwLCB2b2lkKiBvbGRtZW0sIHNpemVfdCBieXRlcykgew0KKyAgaWYgKG9sZG1lbSA9PSAwKQ0KKyAgICByZXR1cm4gbXNwYWNlX21hbGxvYyhtc3AsIGJ5dGVzKTsNCisjaWZkZWYgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTDQorICBpZiAoYnl0ZXMgPT0gMCkgew0KKyAgICBtc3BhY2VfZnJlZShtc3AsIG9sZG1lbSk7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyNlbmRpZiAvKiBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgKi8NCisgIGVsc2Ugew0KKyNpZiBGT09URVJTDQorICAgIG1jaHVua3B0ciBwICA9IG1lbTJjaHVuayhvbGRtZW0pOw0KKyAgICBtc3RhdGUgbXMgPSBnZXRfbXN0YXRlX2ZvcihwKTsNCisjZWxzZSAvKiBGT09URVJTICovDQorICAgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOw0KKyNlbmRpZiAvKiBGT09URVJTICovDQorICAgIGlmICghb2tfbWFnaWMobXMpKSB7DQorICAgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICByZXR1cm4gaW50ZXJuYWxfcmVhbGxvYyhtcywgb2xkbWVtLCBieXRlcyk7DQorICB9DQorfQ0KKw0KK3ZvaWQqIG1zcGFjZV9tZW1hbGlnbihtc3BhY2UgbXNwLCBzaXplX3QgYWxpZ25tZW50LCBzaXplX3QgYnl0ZXMpIHsNCisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOw0KKyAgaWYgKCFva19tYWdpYyhtcykpIHsNCisgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gaW50ZXJuYWxfbWVtYWxpZ24obXMsIGFsaWdubWVudCwgYnl0ZXMpOw0KK30NCisNCit2b2lkKiogbXNwYWNlX2luZGVwZW5kZW50X2NhbGxvYyhtc3BhY2UgbXNwLCBzaXplX3Qgbl9lbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZWxlbV9zaXplLCB2b2lkKiBjaHVua3NbXSkgew0KKyAgc2l6ZV90IHN6ID0gZWxlbV9zaXplOyAvKiBzZXJ2ZXMgYXMgMS1lbGVtZW50IGFycmF5ICovDQorICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsNCisgIGlmICghb2tfbWFnaWMobXMpKSB7DQorICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuIGlhbGxvYyhtcywgbl9lbGVtZW50cywgJnN6LCAzLCBjaHVua3MpOw0KK30NCisNCit2b2lkKiogbXNwYWNlX2luZGVwZW5kZW50X2NvbWFsbG9jKG1zcGFjZSBtc3AsIHNpemVfdCBuX2VsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVzW10sIHZvaWQqIGNodW5rc1tdKSB7DQorICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsNCisgIGlmICghb2tfbWFnaWMobXMpKSB7DQorICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuIGlhbGxvYyhtcywgbl9lbGVtZW50cywgc2l6ZXMsIDAsIGNodW5rcyk7DQorfQ0KKw0KK2ludCBtc3BhY2VfdHJpbShtc3BhY2UgbXNwLCBzaXplX3QgcGFkKSB7DQorICBpbnQgcmVzdWx0ID0gMDsNCisgIG1zdGF0ZSBtcyA9IChtc3RhdGUpbXNwOw0KKyAgaWYgKG9rX21hZ2ljKG1zKSkgew0KKyAgICBpZiAoIVBSRUFDVElPTihtcykpIHsNCisgICAgICByZXN1bHQgPSBzeXNfdHJpbShtcywgcGFkKTsNCisgICAgICBQT1NUQUNUSU9OKG1zKTsNCisgICAgfQ0KKyAgfQ0KKyAgZWxzZSB7DQorICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCit2b2lkIG1zcGFjZV9tYWxsb2Nfc3RhdHMobXNwYWNlIG1zcCkgew0KKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7DQorICBpZiAob2tfbWFnaWMobXMpKSB7DQorICAgIGludGVybmFsX21hbGxvY19zdGF0cyhtcyk7DQorICB9DQorICBlbHNlIHsNCisgICAgVVNBR0VfRVJST1JfQUNUSU9OKG1zLG1zKTsNCisgIH0NCit9DQorDQorc2l6ZV90IG1zcGFjZV9mb290cHJpbnQobXNwYWNlIG1zcCkgew0KKyAgc2l6ZV90IHJlc3VsdCA9IDA7DQorICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsNCisgIGlmIChva19tYWdpYyhtcykpIHsNCisgICAgcmVzdWx0ID0gbXMtPmZvb3RwcmludDsNCisgIH0NCisgIGVsc2Ugew0KKyAgICBVU0FHRV9FUlJPUl9BQ1RJT04obXMsbXMpOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorDQorDQorc2l6ZV90IG1zcGFjZV9tYXhfZm9vdHByaW50KG1zcGFjZSBtc3ApIHsNCisgIHNpemVfdCByZXN1bHQgPSAwOw0KKyAgbXN0YXRlIG1zID0gKG1zdGF0ZSltc3A7DQorICBpZiAob2tfbWFnaWMobXMpKSB7DQorICAgIHJlc3VsdCA9IG1zLT5tYXhfZm9vdHByaW50Ow0KKyAgfQ0KKyAgZWxzZSB7DQorICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCisNCisjaWYgIU5PX01BTExJTkZPDQorc3RydWN0IG1hbGxpbmZvIG1zcGFjZV9tYWxsaW5mbyhtc3BhY2UgbXNwKSB7DQorICBtc3RhdGUgbXMgPSAobXN0YXRlKW1zcDsNCisgIGlmICghb2tfbWFnaWMobXMpKSB7DQorICAgIFVTQUdFX0VSUk9SX0FDVElPTihtcyxtcyk7DQorICB9DQorICByZXR1cm4gaW50ZXJuYWxfbWFsbGluZm8obXMpOw0KK30NCisjZW5kaWYgLyogTk9fTUFMTElORk8gKi8NCisNCitzaXplX3QgbXNwYWNlX3VzYWJsZV9zaXplKHZvaWQqIG1lbSkgew0KKyAgaWYgKG1lbSAhPSAwKSB7DQorICAgIG1jaHVua3B0ciBwID0gbWVtMmNodW5rKG1lbSk7DQorICAgIGlmIChpc19pbnVzZShwKSkNCisgICAgICByZXR1cm4gY2h1bmtzaXplKHApIC0gb3ZlcmhlYWRfZm9yKHApOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtc3BhY2VfbWFsbG9wdChpbnQgcGFyYW1fbnVtYmVyLCBpbnQgdmFsdWUpIHsNCisgIHJldHVybiBjaGFuZ2VfbXBhcmFtKHBhcmFtX251bWJlciwgdmFsdWUpOw0KK30NCisNCisjZW5kaWYgLyogTVNQQUNFUyAqLw0KKw0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEFsdGVybmF0aXZlIE1PUkVDT1JFIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tICovDQorDQorLyoNCisgIEd1aWRlbGluZXMgZm9yIGNyZWF0aW5nIGEgY3VzdG9tIHZlcnNpb24gb2YgTU9SRUNPUkU6DQorDQorICAqIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBNT1JFQ09SRSBzaG91bGQgYWxsb2NhdGUgaW4gbXVsdGlwbGVzIG9mIHBhZ2VzaXplLg0KKyAgKiBNT1JFQ09SRSBtYXkgYWxsb2NhdGUgbW9yZSBtZW1vcnkgdGhhbiByZXF1ZXN0ZWQuIChPciBldmVuIGxlc3MsDQorICAgICAgYnV0IHRoaXMgd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhIG1hbGxvYyBmYWlsdXJlLikNCisgICogTU9SRUNPUkUgbXVzdCBub3QgYWxsb2NhdGUgbWVtb3J5IHdoZW4gZ2l2ZW4gYXJndW1lbnQgemVybywgYnV0DQorICAgICAgaW5zdGVhZCByZXR1cm4gb25lIHBhc3QgdGhlIGVuZCBhZGRyZXNzIG9mIG1lbW9yeSBmcm9tIHByZXZpb3VzDQorICAgICAgbm9uemVybyBjYWxsLg0KKyAgKiBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgY29uc2VjdXRpdmUgY2FsbHMgdG8gTU9SRUNPUkUgd2l0aCBwb3NpdGl2ZQ0KKyAgICAgIGFyZ3VtZW50cyBzaG91bGQgcmV0dXJuIGluY3JlYXNpbmcgYWRkcmVzc2VzLCBpbmRpY2F0aW5nIHRoYXQNCisgICAgICBzcGFjZSBoYXMgYmVlbiBjb250aWd1b3VzbHkgZXh0ZW5kZWQuDQorICAqIEV2ZW4gdGhvdWdoIGNvbnNlY3V0aXZlIGNhbGxzIHRvIE1PUkVDT1JFIG5lZWQgbm90IHJldHVybiBjb250aWd1b3VzDQorICAgICAgYWRkcmVzc2VzLCBpdCBtdXN0IGJlIE9LIGZvciBtYWxsb2MnZWQgY2h1bmtzIHRvIHNwYW4gbXVsdGlwbGUNCisgICAgICByZWdpb25zIGluIHRob3NlIGNhc2VzIHdoZXJlIHRoZXkgZG8gaGFwcGVuIHRvIGJlIGNvbnRpZ3VvdXMuDQorICAqIE1PUkVDT1JFIG5lZWQgbm90IGhhbmRsZSBuZWdhdGl2ZSBhcmd1bWVudHMgLS0gaXQgbWF5IGluc3RlYWQNCisgICAgICBqdXN0IHJldHVybiBNRkFJTCB3aGVuIGdpdmVuIG5lZ2F0aXZlIGFyZ3VtZW50cy4NCisgICAgICBOZWdhdGl2ZSBhcmd1bWVudHMgYXJlIGFsd2F5cyBtdWx0aXBsZXMgb2YgcGFnZXNpemUuIE1PUkVDT1JFDQorICAgICAgbXVzdCBub3QgbWlzaW50ZXJwcmV0IG5lZ2F0aXZlIGFyZ3MgYXMgbGFyZ2UgcG9zaXRpdmUgdW5zaWduZWQNCisgICAgICBhcmdzLiBZb3UgY2FuIHN1cHByZXNzIGFsbCBzdWNoIGNhbGxzIGZyb20gZXZlbiBvY2N1cnJpbmcgYnkgZGVmaW5pbmcNCisgICAgICBNT1JFQ09SRV9DQU5OT1RfVFJJTSwNCisNCisgIEFzIGFuIGV4YW1wbGUgYWx0ZXJuYXRpdmUgTU9SRUNPUkUsIGhlcmUgaXMgYSBjdXN0b20gYWxsb2NhdG9yDQorICBraW5kbHkgY29udHJpYnV0ZWQgZm9yIHByZS1PU1ggbWFjT1MuICBJdCB1c2VzIHZpcnR1YWxseSBidXQgbm90DQorICBuZWNlc3NhcmlseSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbm9uLXBhZ2VkIG1lbW9yeSAobG9ja2VkIGluLA0KKyAgcHJlc2VudCBhbmQgd29uJ3QgZ2V0IHN3YXBwZWQgb3V0KS4gIFlvdSBjYW4gdXNlIGl0IGJ5IHVuY29tbWVudGluZw0KKyAgdGhpcyBzZWN0aW9uLCBhZGRpbmcgc29tZSAjaW5jbHVkZXMsIGFuZCBzZXR0aW5nIHVwIHRoZSBhcHByb3ByaWF0ZQ0KKyAgZGVmaW5lcyBhYm92ZToNCisNCisgICAgICAjZGVmaW5lIE1PUkVDT1JFIG9zTW9yZUNvcmUNCisNCisgIFRoZXJlIGlzIGFsc28gYSBzaHV0ZG93biByb3V0aW5lIHRoYXQgc2hvdWxkIHNvbWVob3cgYmUgY2FsbGVkIGZvcg0KKyAgY2xlYW51cCB1cG9uIHByb2dyYW0gZXhpdC4NCisNCisgICNkZWZpbmUgTUFYX1BPT0xfRU5UUklFUyAxMDANCisgICNkZWZpbmUgTUlOSU1VTV9NT1JFQ09SRV9TSVpFICAoNjQgKiAxMDI0VSkNCisgIHN0YXRpYyBpbnQgbmV4dF9vc19wb29sOw0KKyAgdm9pZCAqb3VyX29zX3Bvb2xzW01BWF9QT09MX0VOVFJJRVNdOw0KKw0KKyAgdm9pZCAqb3NNb3JlQ29yZShpbnQgc2l6ZSkNCisgIHsNCisgICAgdm9pZCAqcHRyID0gMDsNCisgICAgc3RhdGljIHZvaWQgKnNicmtfdG9wID0gMDsNCisNCisgICAgaWYgKHNpemUgPiAwKQ0KKyAgICB7DQorICAgICAgaWYgKHNpemUgPCBNSU5JTVVNX01PUkVDT1JFX1NJWkUpDQorICAgICAgICAgc2l6ZSA9IE1JTklNVU1fTU9SRUNPUkVfU0laRTsNCisgICAgICBpZiAoQ3VycmVudEV4ZWN1dGlvbkxldmVsKCkgPT0ga1Rhc2tMZXZlbCkNCisgICAgICAgICBwdHIgPSBQb29sQWxsb2NhdGVSZXNpZGVudChzaXplICsgUk1fUEFHRV9TSVpFLCAwKTsNCisgICAgICBpZiAocHRyID09IDApDQorICAgICAgew0KKyAgICAgICAgcmV0dXJuICh2b2lkICopIE1GQUlMOw0KKyAgICAgIH0NCisgICAgICAvLyBzYXZlIHB0cnMgc28gdGhleSBjYW4gYmUgZnJlZWQgZHVyaW5nIGNsZWFudXANCisgICAgICBvdXJfb3NfcG9vbHNbbmV4dF9vc19wb29sXSA9IHB0cjsNCisgICAgICBuZXh0X29zX3Bvb2wrKzsNCisgICAgICBwdHIgPSAodm9pZCAqKSAoKCgoc2l6ZV90KSBwdHIpICsgUk1fUEFHRV9NQVNLKSAmIH5STV9QQUdFX01BU0spOw0KKyAgICAgIHNicmtfdG9wID0gKGNoYXIgKikgcHRyICsgc2l6ZTsNCisgICAgICByZXR1cm4gcHRyOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKHNpemUgPCAwKQ0KKyAgICB7DQorICAgICAgLy8gd2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgc2hyaW5rIGJlaGF2aW9yDQorICAgICAgcmV0dXJuICh2b2lkICopIE1GQUlMOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIHJldHVybiBzYnJrX3RvcDsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgLy8gY2xlYW51cCBhbnkgYWxsb2NhdGVkIG1lbW9yeSBwb29scw0KKyAgLy8gY2FsbGVkIGFzIGxhc3QgdGhpbmcgYmVmb3JlIHNodXR0aW5nIGRvd24gZHJpdmVyDQorDQorICB2b2lkIG9zQ2xlYW51cE1lbSh2b2lkKQ0KKyAgew0KKyAgICB2b2lkICoqcHRyOw0KKw0KKyAgICBmb3IgKHB0ciA9IG91cl9vc19wb29sczsgcHRyIDwgJm91cl9vc19wb29sc1tNQVhfUE9PTF9FTlRSSUVTXTsgcHRyKyspDQorICAgICAgaWYgKCpwdHIpDQorICAgICAgew0KKyAgICAgICAgIFBvb2xEZWFsbG9jYXRlKCpwdHIpOw0KKyAgICAgICAgICpwdHIgPSAwOw0KKyAgICAgIH0NCisgIH0NCisNCisqLw0KKw0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorSGlzdG9yeToNCisgICAgVjIuOC40IFdlZCBNYXkgMjcgMDk6NTY6MjMgMjAwOSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpDQorICAgICAgKiBVc2UgemVyb3MgaW5zdGVhZCBvZiBwcmV2IGZvb3QgZm9yIGlzX21tYXBwZWQNCisgICAgICAqIEFkZCBtc3BhY2VfdHJhY2tfbGFyZ2VfY2h1bmtzOyB0aGFua3MgdG8gSmVhbiBCcm91d2Vycw0KKyAgICAgICogRml4IHNldF9pbnVzZSBpbiBpbnRlcm5hbF9yZWFsbG9jOyB0aGFua3MgdG8gSmVhbiBCcm91d2Vycw0KKyAgICAgICogRml4IGluc3VmZmljaWVudCBzeXNfYWxsb2MgcGFkZGluZyB3aGVuIHVzaW5nIDE2Ynl0ZSBhbGlnbm1lbnQNCisgICAgICAqIEZpeCBiYWQgZXJyb3IgY2hlY2sgaW4gbXNwYWNlX2Zvb3RwcmludA0KKyAgICAgICogQWRhcHRhdGlvbnMgZm9yIHB0bWFsbG9jOyB0aGFua3MgdG8gV29sZnJhbSBHbG9nZXIuDQorICAgICAgKiBSZWVudHJhbnQgc3BpbiBsb2NrczsgdGhhbmtzIHRvIEVhcmwgQ2hldyBhbmQgb3RoZXJzDQorICAgICAgKiBXaW4zMiBpbXByb3ZlbWVudHM7IHRoYW5rcyB0byBOaWFsbCBEb3VnbGFzIGFuZCBFYXJsIENoZXcNCisgICAgICAqIEFkZCBOT19TRUdNRU5UX1RSQVZFUlNBTCBhbmQgTUFYX1JFTEVBU0VfQ0hFQ0tfUkFURSBvcHRpb25zDQorICAgICAgKiBFeHRlbnNpb24gaG9vayBpbiBtYWxsb2Nfc3RhdGUNCisgICAgICAqIFZhcmlvdXMgc21hbGwgYWRqdXN0bWVudHMgdG8gcmVkdWNlIHdhcm5pbmdzIG9uIHNvbWUgY29tcGlsZXJzDQorICAgICAgKiBWYXJpb3VzIGNvbmZpZ3VyYXRpb24gZXh0ZW5zaW9ucy9jaGFuZ2VzIGZvciBtb3JlIHBsYXRmb3Jtcy4gVGhhbmtzDQorICAgICAgICAgdG8gYWxsIHdobyBjb250cmlidXRlZCB0aGVzZS4NCisNCisgICAgVjIuOC4zIFRodSBTZXAgMjIgMTE6MTY6MzIgMjAwNSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpDQorICAgICAgKiBBZGQgbWF4X2Zvb3RwcmludCBmdW5jdGlvbnMNCisgICAgICAqIEVuc3VyZSBhbGwgYXBwcm9wcmlhdGUgbGl0ZXJhbHMgYXJlIHNpemVfdA0KKyAgICAgICogRml4IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHByb2JsZW0gZm9yIHNvbWUgI2RlZmluZSBzZXR0aW5ncw0KKyAgICAgICogQXZvaWQgY29uY2F0ZW5hdGluZyBzZWdtZW50cyB3aXRoIHRoZSBvbmUgcHJvdmlkZWQNCisgICAgICAgIGluIGNyZWF0ZV9tc3BhY2Vfd2l0aF9iYXNlDQorICAgICAgKiBSZW5hbWUgc29tZSB2YXJpYWJsZXMgdG8gYXZvaWQgY29tcGlsZXIgc2hhZG93aW5nIHdhcm5pbmdzDQorICAgICAgKiBVc2UgZXhwbGljaXQgbG9jayBpbml0aWFsaXphdGlvbi4NCisgICAgICAqIEJldHRlciBoYW5kbGluZyBvZiBzYnJrIGludGVyZmVyZW5jZS4NCisgICAgICAqIFNpbXBsaWZ5IGFuZCBmaXggc2VnbWVudCBpbnNlcnRpb24sIHRyaW1taW5nIGFuZCBtc3BhY2VfZGVzdHJveQ0KKyAgICAgICogUmVpbnN0YXRlIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyBvcHRpb24gZnJvbSAyLjcueA0KKyAgICAgICogVGhhbmtzIGVzcGVjaWFsbHkgdG8gRGVubmlzIEZsYW5hZ2FuIGZvciBoZWxwIG9uIHRoZXNlLg0KKw0KKyAgICBWMi44LjIgU3VuIEp1biAxMiAxNjowMToxMCAyMDA1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkNCisgICAgICAqIEZpeCBtZW1hbGlnbiBicmFjZSBlcnJvci4NCisNCisgICAgVjIuOC4xIFdlZCBKdW4gIDggMTY6MTE6NDYgMjAwNSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpDQorICAgICAgKiBGaXggaW1wcm9wZXIgI2VuZGlmIG5lc3RpbmcgaW4gQysrDQorICAgICAgKiBBZGQgZXhwbGljaXQgY2FzdHMgbmVlZGVkIGZvciBDKysNCisNCisgICAgVjIuOC4wIE1vbiBNYXkgMzAgMTQ6MDk6MDIgMjAwNSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpDQorICAgICAgKiBVc2UgdHJlZXMgZm9yIGxhcmdlIGJpbnMNCisgICAgICAqIFN1cHBvcnQgbXNwYWNlcw0KKyAgICAgICogVXNlIHNlZ21lbnRzIHRvIHVuaWZ5IHNicmstYmFzZWQgYW5kIG1tYXAtYmFzZWQgc3lzdGVtIGFsbG9jYXRpb24sDQorICAgICAgICByZW1vdmluZyBuZWVkIGZvciBlbXVsYXRpb24gb24gbW9zdCBwbGF0Zm9ybXMgd2l0aG91dCBzYnJrLg0KKyAgICAgICogRGVmYXVsdCBzYWZldHkgY2hlY2tzDQorICAgICAgKiBPcHRpb25hbCBmb290ZXIgY2hlY2tzLiBUaGFua3MgdG8gV2lsbGlhbSBSb2JlcnRzb24gZm9yIHRoZSBpZGVhLg0KKyAgICAgICogSW50ZXJuYWwgY29kZSByZWZhY3RvcmluZw0KKyAgICAgICogSW5jb3Jwb3JhdGUgc3VnZ2VzdGlvbnMgYW5kIHBsYXRmb3JtLXNwZWNpZmljIGNoYW5nZXMuDQorICAgICAgICBUaGFua3MgdG8gRGVubmlzIEZsYW5hZ2FuLCBDb2xpbiBQbHVtYiwgTmlhbGwgRG91Z2xhcywNCisgICAgICAgIEFhcm9uIEJhY2htYW5uLCAgRW1lcnkgQmVyZ2VyLCBhbmQgb3RoZXJzLg0KKyAgICAgICogU3BlZWQgdXAgbm9uLWZhc3RiaW4gcHJvY2Vzc2luZyBlbm91Z2ggdG8gcmVtb3ZlIGZhc3RiaW5zLg0KKyAgICAgICogUmVtb3ZlIHVzZWxlc3MgY2ZyZWUoKSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlciBhcHBzLg0KKyAgICAgICogUmVtb3ZlIGludGVybmFsIG1lbWNweSwgbWVtc2V0LiBDb21waWxlcnMgaGFuZGxlIGJ1aWx0aW5zIGJldHRlci4NCisgICAgICAqIFJlbW92ZSBzb21lIG9wdGlvbnMgdGhhdCBubyBvbmUgZXZlciB1c2VkIGFuZCByZW5hbWUgb3RoZXJzLg0KKw0KKyAgICBWMi43LjIgU2F0IEF1ZyAxNyAwOTowNzozMCAyMDAyICBEb3VnIExlYSAgKGRsIGF0IGdlZSkNCisgICAgICAqIEZpeCBtYWxsb2Nfc3RhdGUgYml0bWFwIGFycmF5IG1pc2RlY2xhcmF0aW9uDQorDQorICAgIFYyLjcuMSBUaHUgSnVsIDI1IDEwOjU4OjAzIDIwMDIgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQ0KKyAgICAgICogQWxsb3cgdHVuaW5nIG9mIEZJUlNUX1NPUlRFRF9CSU5fU0laRQ0KKyAgICAgICogVXNlIFBUUl9VSU5UIGFzIHR5cGUgZm9yIGFsbCBwdHItPmludCBjYXN0cy4gVGhhbmtzIHRvIEpvaG4gQmVsbW9udGUuDQorICAgICAgKiBCZXR0ZXIgZGV0ZWN0aW9uIGFuZCBzdXBwb3J0IGZvciBub24tY29udGlndW91c25lc3Mgb2YgTU9SRUNPUkUuDQorICAgICAgICBUaGFua3MgdG8gQW5kcmVhcyBNdWVsbGVyLCBDb25hbCBXYWxzaCwgYW5kIFdvbGZyYW0gR2xvZ2VyDQorICAgICAgKiBCeXBhc3MgbW9zdCBvZiBtYWxsb2MgaWYgbm8gZnJlZXMuIFRoYW5rcyBUbyBFbWVyeSBCZXJnZXIuDQorICAgICAgKiBGaXggZnJlZWluZyBvZiBvbGQgdG9wIG5vbi1jb250aWd1b3VzIGNodW5rIGltIHN5c21hbGxvYy4NCisgICAgICAqIFJhaXNlZCBkZWZhdWx0IHRyaW0gYW5kIG1hcCB0aHJlc2hvbGRzIHRvIDI1NksuDQorICAgICAgKiBGaXggbW1hcC1yZWxhdGVkICNkZWZpbmVzLiBUaGFua3MgdG8gTHVib3MgTHVuYWsuDQorICAgICAgKiBGaXggY29weSBtYWNyb3M7IGFkZGVkIExBQ0tTX0ZDTlRMX0guIFRoYW5rcyB0byBOZWFsIFdhbGZpZWxkLg0KKyAgICAgICogQnJhbmNoLWZyZWUgYmluIGNhbGN1bGF0aW9uDQorICAgICAgKiBEZWZhdWx0IHRyaW0gYW5kIG1tYXAgdGhyZXNob2xkcyBub3cgMjU2Sy4NCisNCisgICAgVjIuNy4wIFN1biBNYXIgMTEgMTQ6MTQ6MDYgMjAwMSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpDQorICAgICAgKiBJbnRyb2R1Y2UgaW5kZXBlbmRlbnRfY29tYWxsb2MgYW5kIGluZGVwZW5kZW50X2NhbGxvYy4NCisgICAgICAgIFRoYW5rcyB0byBNaWNoYWVsIFBhY2hvcyBmb3IgbW90aXZhdGlvbiBhbmQgaGVscC4NCisgICAgICAqIE1ha2Ugb3B0aW9uYWwgLmggZmlsZSBhdmFpbGFibGUNCisgICAgICAqIEFsbG93ID4gMkdCIHJlcXVlc3RzIG9uIDMyYml0IHN5c3RlbXMuDQorICAgICAgKiBuZXcgV0lOMzIgc2JyaywgbW1hcCwgbXVubWFwLCBsb2NrIGNvZGUgZnJvbSA8V2FsdGVyQEdlTmVTeXMtZS5kZT4uDQorICAgICAgICBUaGFua3MgYWxzbyB0byBBbmRyZWFzIE11ZWxsZXIgPGEubXVlbGxlciBhdCBwYXJhZGF0ZWMuZGU+LA0KKyAgICAgICAgYW5kIEFub255bW91cy4NCisgICAgICAqIEFsbG93IG92ZXJyaWRlIG9mIE1BTExPQ19BTElHTk1FTlQgKFRoYW5rcyB0byBSdXVkIFdhaWogZm9yDQorICAgICAgICBoZWxwaW5nIHRlc3QgdGhpcy4pDQorICAgICAgKiBtZW1hbGlnbjogY2hlY2sgYWxpZ25tZW50IGFyZw0KKyAgICAgICogcmVhbGxvYzogZG9uJ3QgdHJ5IHRvIHNoaWZ0IGNodW5rcyBiYWNrd2FyZHMsIHNpbmNlIHRoaXMNCisgICAgICAgIGxlYWRzIHRvICBtb3JlIGZyYWdtZW50YXRpb24gaW4gc29tZSBwcm9ncmFtcyBhbmQgZG9lc24ndA0KKyAgICAgICAgc2VlbSB0byBoZWxwIGluIGFueSBvdGhlcnMuDQorICAgICAgKiBDb2xsZWN0IGFsbCBjYXNlcyBpbiBtYWxsb2MgcmVxdWlyaW5nIHN5c3RlbSBtZW1vcnkgaW50byBzeXNtYWxsb2MNCisgICAgICAqIFVzZSBtbWFwIGFzIGJhY2t1cCB0byBzYnJrDQorICAgICAgKiBQbGFjZSBhbGwgaW50ZXJuYWwgc3RhdGUgaW4gbWFsbG9jX3N0YXRlDQorICAgICAgKiBJbnRyb2R1Y2UgZmFzdGJpbnMgKGFsdGhvdWdoIHNpbWlsYXIgdG8gMi41LjEpDQorICAgICAgKiBNYW55IG1pbm9yIHR1bmluZ3MgYW5kIGNvc21ldGljIGltcHJvdmVtZW50cw0KKyAgICAgICogSW50cm9kdWNlIFVTRV9QVUJMSUNfTUFMTE9DX1dSQVBQRVJTLCBVU0VfTUFMTE9DX0xPQ0sNCisgICAgICAqIEludHJvZHVjZSBNQUxMT0NfRkFJTFVSRV9BQ1RJT04sIE1PUkVDT1JFX0NPTlRJR1VPVVMNCisgICAgICAgIFRoYW5rcyB0byBUb255IEUuIEJlbm5ldHQgPHRiZW5uZXR0QG52aWRpYS5jb20+IGFuZCBvdGhlcnMuDQorICAgICAgKiBJbmNsdWRlIGVycm5vLmggdG8gc3VwcG9ydCBkZWZhdWx0IGZhaWx1cmUgYWN0aW9uLg0KKw0KKyAgICBWMi42LjYgU3VuIERlYyAgNSAwNzo0MjoxOSAxOTk5ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkNCisgICAgICAqIHJldHVybiBudWxsIGZvciBuZWdhdGl2ZSBhcmd1bWVudHMNCisgICAgICAqIEFkZGVkIFNldmVyYWwgV0lOMzIgY2xlYW51cHMgZnJvbSBNYXJ0aW4gQy4gRm9uZyA8bWNmb25nIGF0IHlhaG9vLmNvbT4NCisgICAgICAgICAqIEFkZCAnTEFDS1NfU1lTX1BBUkFNX0gnIGZvciB0aG9zZSBzeXN0ZW1zIHdpdGhvdXQgJ3N5cy9wYXJhbS5oJw0KKyAgICAgICAgICAoZS5nLiBXSU4zMiBwbGF0Zm9ybXMpDQorICAgICAgICAgKiBDbGVhbnVwIGhlYWRlciBmaWxlIGluY2x1c2lvbiBmb3IgV0lOMzIgcGxhdGZvcm1zDQorICAgICAgICAgKiBDbGVhbnVwIGNvZGUgdG8gYXZvaWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgY29tcGlsZXIgY29tcGxhaW50cw0KKyAgICAgICAgICogQWRkICdVU0VfRExfUFJFRklYJyB0byBxdWlja2x5IGFsbG93IGNvLWV4aXN0ZW5jZSB3aXRoIGV4aXN0aW5nDQorICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcw0KKyAgICAgICAgICogU2V0ICdtYWxsb2NfZ2V0cGFnZXNpemUnIGZvciBXSU4zMiBwbGF0Zm9ybXMgKG5lZWRzIG1vcmUgd29yaykNCisgICAgICAgICAqIFVzZSAnYXNzZXJ0JyByYXRoZXIgdGhhbiAnQVNTRVJUJyBpbiBXSU4zMiBjb2RlIHRvIGNvbmZvcm0gdG8NCisgICAgICAgICAgIHVzYWdlIG9mICdhc3NlcnQnIGluIG5vbi1XSU4zMiBjb2RlDQorICAgICAgICAgKiBJbXByb3ZlIFdJTjMyICdzYnJrKCknIGVtdWxhdGlvbidzICdmaW5kUmVnaW9uKCknIHJvdXRpbmUgdG8NCisgICAgICAgICAgIGF2b2lkIGluZmluaXRlIGxvb3ANCisgICAgICAqIEFsd2F5cyBjYWxsICdmUkVlKCknIHJhdGhlciB0aGFuICdmcmVlKCknDQorDQorICAgIFYyLjYuNSBXZWQgSnVuIDE3IDE1OjU3OjMxIDE5OTggIERvdWcgTGVhICAoZGwgYXQgZ2VlKQ0KKyAgICAgICogRml4ZWQgb3JkZXJpbmcgcHJvYmxlbSB3aXRoIGJvdW5kYXJ5LXN0YW1waW5nDQorDQorICAgIFYyLjYuMyBTdW4gTWF5IDE5IDA4OjE3OjU4IDE5OTYgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQ0KKyAgICAgICogQWRkZWQgcHZhbGxvYywgYXMgcmVjb21tZW5kZWQgYnkgSC5KLiBMaXUNCisgICAgICAqIEFkZGVkIDY0Yml0IHBvaW50ZXIgc3VwcG9ydCBtYWlubHkgZnJvbSBXb2xmcmFtIEdsb2dlcg0KKyAgICAgICogQWRkZWQgYW5vbnltb3VzbHkgZG9uYXRlZCBXSU4zMiBzYnJrIGVtdWxhdGlvbg0KKyAgICAgICogTWFsbG9jLCBjYWxsb2MsIGdldHBhZ2VzaXplOiBhZGQgb3B0aW1pemF0aW9ucyBmcm9tIFJheW1vbmQgTmlqc3Nlbg0KKyAgICAgICogbWFsbG9jX2V4dGVuZF90b3A6IGZpeCBtYXNrIGVycm9yIHRoYXQgY2F1c2VkIHdhc3RhZ2UgYWZ0ZXINCisgICAgICAgIGZvcmVpZ24gc2Jya3MNCisgICAgICAqIEFkZCBsaW51eCBtcmVtYXAgc3VwcG9ydCBjb2RlIGZyb20gSEogTGl1DQorDQorICAgIFYyLjYuMiBUdWUgRGVjICA1IDA2OjUyOjU1IDE5OTUgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQ0KKyAgICAgICogSW50ZWdyYXRlZCBtb3N0IGRvY3VtZW50YXRpb24gd2l0aCB0aGUgY29kZS4NCisgICAgICAqIEFkZCBzdXBwb3J0IGZvciBtbWFwLCB3aXRoIGhlbHAgZnJvbQ0KKyAgICAgICAgV29sZnJhbSBHbG9nZXIgKEdsb2dlckBscnoudW5pLW11ZW5jaGVuLmRlKS4NCisgICAgICAqIFVzZSBsYXN0X3JlbWFpbmRlciBpbiBtb3JlIGNhc2VzLg0KKyAgICAgICogUGFjayBiaW5zIHVzaW5nIGlkZWEgZnJvbSAgY29saW5Abnl4MTAuY3MuZHUuZWR1DQorICAgICAgKiBVc2Ugb3JkZXJlZCBiaW5zIGluc3RlYWQgb2YgYmVzdC1maXQgdGhyZXNoaG9sZA0KKyAgICAgICogRWxpbWluYXRlIGJsb2NrLWxvY2FsIGRlY2xzIHRvIHNpbXBsaWZ5IHRyYWNpbmcgYW5kIGRlYnVnZ2luZy4NCisgICAgICAqIFN1cHBvcnQgYW5vdGhlciBjYXNlIG9mIHJlYWxsb2MgdmlhIG1vdmUgaW50byB0b3ANCisgICAgICAqIEZpeCBlcnJvciBvY2N1cmluZyB3aGVuIGluaXRpYWwgc2Jya19iYXNlIG5vdCB3b3JkLWFsaWduZWQuDQorICAgICAgKiBSZWx5IG9uIHBhZ2Ugc2l6ZSBmb3IgdW5pdHMgaW5zdGVhZCBvZiBTQlJLX1VOSVQgdG8NCisgICAgICAgIGF2b2lkIHN1cnByaXNlcyBhYm91dCBzYnJrIGFsaWdubWVudCBjb252ZW50aW9ucy4NCisgICAgICAqIEFkZCBtYWxsaW5mbywgbWFsbG9wdC4gVGhhbmtzIHRvIFJheW1vbmQgTmlqc3Nlbg0KKyAgICAgICAgKHJheW1vbmRAZXMuZWxlLnR1ZS5ubCkgZm9yIHRoZSBzdWdnZXN0aW9uLg0KKyAgICAgICogQWRkIGBwYWQnIGFyZ3VtZW50IHRvIG1hbGxvY190cmltIGFuZCB0b3BfcGFkIG1hbGxvcHQgcGFyYW1ldGVyLg0KKyAgICAgICogTW9yZSBwcmVjYXV0aW9ucyBmb3IgY2FzZXMgd2hlcmUgb3RoZXIgcm91dGluZXMgY2FsbCBzYnJrLA0KKyAgICAgICAgY291cnRlc3kgb2YgV29sZnJhbSBHbG9nZXIgKEdsb2dlckBscnoudW5pLW11ZW5jaGVuLmRlKS4NCisgICAgICAqIEFkZGVkIG1hY3JvcyBldGMuLCBhbGxvd2luZyB1c2UgaW4gbGludXggbGliYyBmcm9tDQorICAgICAgICBILkouIEx1IChoamxAZ251LmFpLm1pdC5lZHUpDQorICAgICAgKiBJbnZlcnRlZCB0aGlzIGhpc3RvcnkgbGlzdA0KKw0KKyAgICBWMi42LjEgU2F0IERlYyAgMiAxNDoxMDo1NyAxOTk1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkNCisgICAgICAqIFJlLXR1bmVkIGFuZCBmaXhlZCB0byBiZWhhdmUgbW9yZSBuaWNlbHkgd2l0aCBWMi42LjAgY2hhbmdlcy4NCisgICAgICAqIFJlbW92ZWQgYWxsIHByZWFsbG9jYXRpb24gY29kZSBzaW5jZSB1bmRlciBjdXJyZW50IHNjaGVtZQ0KKyAgICAgICAgdGhlIHdvcmsgcmVxdWlyZWQgdG8gdW5kbyBiYWQgcHJlYWxsb2NhdGlvbnMgZXhjZWVkcw0KKyAgICAgICAgdGhlIHdvcmsgc2F2ZWQgaW4gZ29vZCBjYXNlcyBmb3IgbW9zdCB0ZXN0IHByb2dyYW1zLg0KKyAgICAgICogTm8gbG9uZ2VyIHVzZSByZXR1cm4gbGlzdCBvciB1bmNvbnNvbGlkYXRlZCBiaW5zIHNpbmNlDQorICAgICAgICBubyBzY2hlbWUgdXNpbmcgdGhlbSBjb25zaXN0ZW50bHkgb3V0cGVyZm9ybXMgdGhvc2UgdGhhdCBkb24ndA0KKyAgICAgICAgZ2l2ZW4gYWJvdmUgY2hhbmdlcy4NCisgICAgICAqIFVzZSBiZXN0IGZpdCBmb3IgdmVyeSBsYXJnZSBjaHVua3MgdG8gcHJldmVudCBzb21lIHdvcnN0LWNhc2VzLg0KKyAgICAgICogQWRkZWQgc29tZSBzdXBwb3J0IGZvciBkZWJ1Z2dpbmcNCisNCisgICAgVjIuNi4wIFNhdCBOb3YgIDQgMDc6MDU6MjMgMTk5NSAgRG91ZyBMZWEgIChkbCBhdCBnZWUpDQorICAgICAgKiBSZW1vdmVkIGZvb3RlcnMgd2hlbiBjaHVua3MgYXJlIGluIHVzZS4gVGhhbmtzIHRvDQorICAgICAgICBQYXVsIFdpbHNvbiAod2lsc29uQGNzLnRleGFzLmVkdSkgZm9yIHRoZSBzdWdnZXN0aW9uLg0KKw0KKyAgICBWMi41LjQgV2VkIE5vdiAgMSAwNzo1NDo1MSAxOTk1ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkNCisgICAgICAqIEFkZGVkIG1hbGxvY190cmltLCB3aXRoIGhlbHAgZnJvbSBXb2xmcmFtIEdsb2dlcg0KKyAgICAgICAgKHdtZ2xvQERlbnQuTUVELlVuaS1NdWVuY2hlbi5ERSkuDQorDQorICAgIFYyLjUuMyBUdWUgQXByIDI2IDEwOjE2OjAxIDE5OTQgIERvdWcgTGVhICAoZGwgYXQgZykNCisNCisgICAgVjIuNS4yIFR1ZSBBcHIgIDUgMTY6MjA6NDAgMTk5NCAgRG91ZyBMZWEgIChkbCBhdCBnKQ0KKyAgICAgICogcmVhbGxvYzogdHJ5IHRvIGV4cGFuZCBpbiBib3RoIGRpcmVjdGlvbnMNCisgICAgICAqIG1hbGxvYzogc3dhcCBvcmRlciBvZiBjbGVhbi1iaW4gc3RyYXRlZ3k7DQorICAgICAgKiByZWFsbG9jOiBvbmx5IGNvbmRpdGlvbmFsbHkgZXhwYW5kIGJhY2t3YXJkcw0KKyAgICAgICogVHJ5IG5vdCB0byBzY2F2ZW5nZSB1c2VkIGJpbnMNCisgICAgICAqIFVzZSBiaW4gY291bnRzIGFzIGEgZ3VpZGUgdG8gcHJlYWxsb2NhdGlvbg0KKyAgICAgICogT2NjYXNpb25hbGx5IGJpbiByZXR1cm4gbGlzdCBjaHVua3MgaW4gZmlyc3Qgc2Nhbg0KKyAgICAgICogQWRkIGEgZmV3IG9wdGltaXphdGlvbnMgZnJvbSBjb2xpbkBueXgxMC5jcy5kdS5lZHUNCisNCisgICAgVjIuNS4xIFNhdCBBdWcgMTQgMTU6NDA6NDMgMTk5MyAgRG91ZyBMZWEgIChkbCBhdCBnKQ0KKyAgICAgICogZmFzdGVyIGJpbiBjb21wdXRhdGlvbiAmIHNsaWdodGx5IGRpZmZlcmVudCBiaW5uaW5nDQorICAgICAgKiBtZXJnZWQgYWxsIGNvbnNvbGlkYXRpb25zIHRvIG9uZSBwYXJ0IG9mIG1hbGxvYyBwcm9wZXINCisgICAgICAgICAoZWxpbWluYXRpbmcgb2xkIG1hbGxvY19maW5kX3NwYWNlICYgbWFsbG9jX2NsZWFuX2JpbikNCisgICAgICAqIFNjYW4gMiByZXR1cm5zIGNodW5rcyAobm90IGp1c3QgMSkNCisgICAgICAqIFByb3BhZ2F0ZSBmYWlsdXJlIGluIHJlYWxsb2MgaWYgbWFsbG9jIHJldHVybnMgMA0KKyAgICAgICogQWRkIHN0dWZmIHRvIGFsbG93IGNvbXBpbGF0aW9uIG9uIG5vbi1BTlNJIGNvbXBpbGVycw0KKyAgICAgICAgICBmcm9tIGtwdkByZXNlYXJjaC5hdHQuY29tDQorDQorICAgIFYyLjUgU2F0IEF1ZyAgNyAwNzo0MTo1OSAxOTkzICBEb3VnIExlYSAgKGRsIGF0IGcub3N3ZWdvLmVkdSkNCisgICAgICAqIHJlbW92ZWQgcG90ZW50aWFsIGZvciBvZGQgYWRkcmVzcyBhY2Nlc3MgaW4gcHJldl9jaHVuaw0KKyAgICAgICogcmVtb3ZlZCBkZXBlbmRlbmN5IG9uIGdldHBhZ2VzaXplLmgNCisgICAgICAqIG1pc2MgY29zbWV0aWNzIGFuZCBhIGJpdCBtb3JlIGludGVybmFsIGRvY3VtZW50YXRpb24NCisgICAgICAqIGFudGljb3NtZXRpY3M6IG1hbmdsZWQgbmFtZXMgaW4gbWFjcm9zIHRvIGV2YWRlIGRlYnVnZ2VyIHN0cmFuZ2VuZXNzDQorICAgICAgKiB0ZXN0ZWQgb24gc3BhcmMsIGhwLTcwMCwgZGVjLW1pcHMsIHJzNjAwMA0KKyAgICAgICAgICB3aXRoIGdjYyAmIG5hdGl2ZSBjYyAoaHAsIGRlYyBvbmx5KSBhbGxvd2luZw0KKyAgICAgICAgICBEZXRsZWZzICYgWm9ybiBjb21wYXJpc29uIHN0dWR5IChpbiBTSUdQTEFOIE5vdGljZXMuKQ0KKw0KKyAgICBUcmlhbCB2ZXJzaW9uIEZyaSBBdWcgMjggMTM6MTQ6MjkgMTk5MiAgRG91ZyBMZWEgIChkbCBhdCBnLm9zd2Vnby5lZHUpDQorICAgICAgKiBCYXNlZCBsb29zZWx5IG9uIGxpYmcrKy0xLjJYIG1hbGxvYy4gKEl0IHJldGFpbnMgc29tZSBvZiB0aGUgb3ZlcmFsbA0KKyAgICAgICAgIHN0cnVjdHVyZSBvZiBvbGQgdmVyc2lvbiwgIGJ1dCBtb3N0IGRldGFpbHMgZGlmZmVyLikNCisNCisqLw0KKw0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvbXByZWFsL2RsbWFsbG9jLmggYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbC9kbG1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5MGRjYjYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbC9kbG1hbGxvYy5oCkBAIC0wLDAgKzEsNTYyIEBACisvKg0KKyAgRGVmYXVsdCBoZWFkZXIgZmlsZSBmb3IgbWFsbG9jLTIuOC54LCB3cml0dGVuIGJ5IERvdWcgTGVhDQorICBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdA0KKyAgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvcHVibGljZG9tYWluLiANCisgDQorICBsYXN0IHVwZGF0ZTogV2VkIE1heSAyNyAxNDoyNToxNyAyMDA5ICBEb3VnIExlYSAgKGRsIGF0IGdlZSkNCisNCisgIFRoaXMgaGVhZGVyIGlzIGZvciBBTlNJIEMvQysrIG9ubHkuICBZb3UgY2FuIHNldCBhbnkgb2YNCisgIHRoZSBmb2xsb3dpbmcgI2RlZmluZXMgYmVmb3JlIGluY2x1ZGluZzoNCisNCisgICogSWYgVVNFX0RMX1BSRUZJWCBpcyBkZWZpbmVkLCBpdCBpcyBhc3N1bWVkIHRoYXQgbWFsbG9jLmMgDQorICAgIHdhcyBhbHNvIGNvbXBpbGVkIHdpdGggdGhpcyBvcHRpb24sIHNvIGFsbCByb3V0aW5lcw0KKyAgICBoYXZlIG5hbWVzIHN0YXJ0aW5nIHdpdGggImRsIi4NCisNCisgICogSWYgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCBpcyBkZWZpbmVkLCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhpcw0KKyAgICBmaWxlIHdpbGwgYmUgI2luY2x1ZGVkIEFGVEVSIDxtYWxsb2MuaD4uIFRoaXMgaXMgbmVlZGVkIG9ubHkgaWYNCisgICAgeW91ciBzeXN0ZW0gZGVmaW5lcyBhIHN0cnVjdCBtYWxsaW5mbyB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQ0KKyAgICBzdGFuZGFyZCBvbmUgZGVjbGFyZWQgaGVyZS4gIE90aGVyd2lzZSwgeW91IGNhbiBpbmNsdWRlIHRoaXMgZmlsZQ0KKyAgICBJTlNURUFEIG9mIHlvdXIgc3lzdGVtIHN5c3RlbSA8bWFsbG9jLmg+LiAgQXQgbGVhc3Qgb24gQU5TSSwgYWxsDQorICAgIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIHN5c3RlbSB2ZXJzaW9ucw0KKw0KKyAgKiBJZiBNU1BBQ0VTIGlzIGRlZmluZWQsIGRlY2xhcmF0aW9ucyBmb3IgbXNwYWNlIHZlcnNpb25zIGFyZSBpbmNsdWRlZC4NCisqLw0KKw0KKyNpZm5kZWYgTUFMTE9DXzI4MF9IDQorI2RlZmluZSBNQUxMT0NfMjgwX0gNCisNCisjZGVmaW5lIFVTRV9ETF9QUkVGSVgNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCisjaW5jbHVkZSA8c3RkZGVmLmg+ICAgLyogZm9yIHNpemVfdCAqLw0KKw0KKyNpZm5kZWYgT05MWV9NU1BBQ0VTDQorI2RlZmluZSBPTkxZX01TUEFDRVMgMCAgICAgLyogZGVmaW5lIHRvIGEgdmFsdWUgKi8NCisjZW5kaWYgIC8qIE9OTFlfTVNQQUNFUyAqLw0KKyNpZm5kZWYgTk9fTUFMTElORk8NCisjZGVmaW5lIE5PX01BTExJTkZPIDANCisjZW5kaWYgIC8qIE5PX01BTExJTkZPICovDQorDQorDQorI2lmICFPTkxZX01TUEFDRVMNCisNCisjaWZuZGVmIFVTRV9ETF9QUkVGSVgNCisjZGVmaW5lIGRsY2FsbG9jICAgICAgICAgICAgICAgY2FsbG9jDQorI2RlZmluZSBkbGZyZWUgICAgICAgICAgICAgICAgIGZyZWUNCisjZGVmaW5lIGRsbWFsbG9jICAgICAgICAgICAgICAgbWFsbG9jDQorI2RlZmluZSBkbG1lbWFsaWduICAgICAgICAgICAgIG1lbWFsaWduDQorI2RlZmluZSBkbHJlYWxsb2MgICAgICAgICAgICAgIHJlYWxsb2MNCisjZGVmaW5lIGRsdmFsbG9jICAgICAgICAgICAgICAgdmFsbG9jDQorI2RlZmluZSBkbHB2YWxsb2MgICAgICAgICAgICAgIHB2YWxsb2MNCisjZGVmaW5lIGRsbWFsbGluZm8gICAgICAgICAgICAgbWFsbGluZm8NCisjZGVmaW5lIGRsbWFsbG9wdCAgICAgICAgICAgICAgbWFsbG9wdA0KKyNkZWZpbmUgZGxtYWxsb2NfdHJpbSAgICAgICAgICBtYWxsb2NfdHJpbQ0KKyNkZWZpbmUgZGxtYWxsb2Nfc3RhdHMgICAgICAgICBtYWxsb2Nfc3RhdHMNCisjZGVmaW5lIGRsbWFsbG9jX3VzYWJsZV9zaXplICAgbWFsbG9jX3VzYWJsZV9zaXplDQorI2RlZmluZSBkbG1hbGxvY19mb290cHJpbnQgICAgIG1hbGxvY19mb290cHJpbnQNCisjZGVmaW5lIGRsaW5kZXBlbmRlbnRfY2FsbG9jICAgaW5kZXBlbmRlbnRfY2FsbG9jDQorI2RlZmluZSBkbGluZGVwZW5kZW50X2NvbWFsbG9jIGluZGVwZW5kZW50X2NvbWFsbG9jDQorI2VuZGlmIC8qIFVTRV9ETF9QUkVGSVggKi8NCisjaWYgIU5PX01BTExJTkZPIA0KKyNpZm5kZWYgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSA0KKyNpZm5kZWYgX01BTExPQ19IDQorI2lmbmRlZiBNQUxMSU5GT19GSUVMRF9UWVBFDQorI2RlZmluZSBNQUxMSU5GT19GSUVMRF9UWVBFIHNpemVfdA0KKyNlbmRpZiAvKiBNQUxMSU5GT19GSUVMRF9UWVBFICovDQorI2lmbmRlZiBTVFJVQ1RfTUFMTElORk9fREVDTEFSRUQNCisjZGVmaW5lIFNUUlVDVF9NQUxMSU5GT19ERUNMQVJFRCAxDQorc3RydWN0IG1hbGxpbmZvIHsNCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgYXJlbmE7ICAgIC8qIG5vbi1tbWFwcGVkIHNwYWNlIGFsbG9jYXRlZCBmcm9tIHN5c3RlbSAqLw0KKyAgTUFMTElORk9fRklFTERfVFlQRSBvcmRibGtzOyAgLyogbnVtYmVyIG9mIGZyZWUgY2h1bmtzICovDQorICBNQUxMSU5GT19GSUVMRF9UWVBFIHNtYmxrczsgICAvKiBhbHdheXMgMCAqLw0KKyAgTUFMTElORk9fRklFTERfVFlQRSBoYmxrczsgICAgLyogYWx3YXlzIDAgKi8NCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgaGJsa2hkOyAgIC8qIHNwYWNlIGluIG1tYXBwZWQgcmVnaW9ucyAqLw0KKyAgTUFMTElORk9fRklFTERfVFlQRSB1c21ibGtzOyAgLyogbWF4aW11bSB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UgKi8NCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgZnNtYmxrczsgIC8qIGFsd2F5cyAwICovDQorICBNQUxMSU5GT19GSUVMRF9UWVBFIHVvcmRibGtzOyAvKiB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UgKi8NCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUgZm9yZGJsa3M7IC8qIHRvdGFsIGZyZWUgc3BhY2UgKi8NCisgIE1BTExJTkZPX0ZJRUxEX1RZUEUga2VlcGNvc3Q7IC8qIHJlbGVhc2FibGUgKHZpYSBtYWxsb2NfdHJpbSkgc3BhY2UgKi8NCit9Ow0KKyNlbmRpZiAvKiBTVFJVQ1RfTUFMTElORk9fREVDTEFSRUQgKi8NCisjZW5kaWYgIC8qIF9NQUxMT0NfSCAqLw0KKyNlbmRpZiAgLyogSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCAqLw0KKyNlbmRpZiAgLyogIU5PX01BTExJTkZPICovDQorDQorLyoNCisgIG1hbGxvYyhzaXplX3QgbikNCisgIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGNodW5rIG9mIGF0IGxlYXN0IG4gYnl0ZXMsIG9yDQorICBudWxsIGlmIG5vIHNwYWNlIGlzIGF2YWlsYWJsZSwgaW4gd2hpY2ggY2FzZSBlcnJubyBpcyBzZXQgdG8gRU5PTUVNDQorICBvbiBBTlNJIEMgc3lzdGVtcy4NCisNCisgIElmIG4gaXMgemVybywgbWFsbG9jIHJldHVybnMgYSBtaW5pbXVtLXNpemVkIGNodW5rLiAoVGhlIG1pbmltdW0NCisgIHNpemUgaXMgMTYgYnl0ZXMgb24gbW9zdCAzMmJpdCBzeXN0ZW1zLCBhbmQgMzIgYnl0ZXMgb24gNjRiaXQNCisgIHN5c3RlbXMuKSAgTm90ZSB0aGF0IHNpemVfdCBpcyBhbiB1bnNpZ25lZCB0eXBlLCBzbyBjYWxscyB3aXRoDQorICBhcmd1bWVudHMgdGhhdCB3b3VsZCBiZSBuZWdhdGl2ZSBpZiBzaWduZWQgYXJlIGludGVycHJldGVkIGFzDQorICByZXF1ZXN0cyBmb3IgaHVnZSBhbW91bnRzIG9mIHNwYWNlLCB3aGljaCB3aWxsIG9mdGVuIGZhaWwuIFRoZQ0KKyAgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgb2YgbiBkaWZmZXJzIGFjcm9zcyBzeXN0ZW1zLCBidXQgaXMgaW4gYWxsDQorICBjYXNlcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBhIHNpemVfdC4NCisqLw0KK3ZvaWQqIGRsbWFsbG9jKHNpemVfdCk7DQorDQorLyoNCisgIGZyZWUodm9pZCogcCkNCisgIFJlbGVhc2VzIHRoZSBjaHVuayBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBwLCB0aGF0IGhhZCBiZWVuIHByZXZpb3VzbHkNCisgIGFsbG9jYXRlZCB1c2luZyBtYWxsb2Mgb3IgYSByZWxhdGVkIHJvdXRpbmUgc3VjaCBhcyByZWFsbG9jLg0KKyAgSXQgaGFzIG5vIGVmZmVjdCBpZiBwIGlzIG51bGwuIElmIHAgd2FzIG5vdCBtYWxsb2NlZCBvciBhbHJlYWR5DQorICBmcmVlZCwgZnJlZShwKSB3aWxsIGJ5IGRlZmF1bHQgY3Vhc2UgdGhlIGN1cnJlbnQgcHJvZ3JhbSB0byBhYm9ydC4NCisqLw0KK3ZvaWQgIGRsZnJlZSh2b2lkKik7DQorDQorLyoNCisgIGNhbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1lbnRfc2l6ZSk7DQorICBSZXR1cm5zIGEgcG9pbnRlciB0byBuX2VsZW1lbnRzICogZWxlbWVudF9zaXplIGJ5dGVzLCB3aXRoIGFsbCBsb2NhdGlvbnMNCisgIHNldCB0byB6ZXJvLg0KKyovDQordm9pZCogZGxjYWxsb2Moc2l6ZV90LCBzaXplX3QpOw0KKw0KKy8qDQorICByZWFsbG9jKHZvaWQqIHAsIHNpemVfdCBuKQ0KKyAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBjaHVuayBvZiBzaXplIG4gdGhhdCBjb250YWlucyB0aGUgc2FtZSBkYXRhDQorICBhcyBkb2VzIGNodW5rIHAgdXAgdG8gdGhlIG1pbmltdW0gb2YgKG4sIHAncyBzaXplKSBieXRlcywgb3IgbnVsbA0KKyAgaWYgbm8gc3BhY2UgaXMgYXZhaWxhYmxlLg0KKw0KKyAgVGhlIHJldHVybmVkIHBvaW50ZXIgbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgcC4gVGhlIGFsZ29yaXRobQ0KKyAgcHJlZmVycyBleHRlbmRpbmcgcCBpbiBtb3N0IGNhc2VzIHdoZW4gcG9zc2libGUsIG90aGVyd2lzZSBpdA0KKyAgZW1wbG95cyB0aGUgZXF1aXZhbGVudCBvZiBhIG1hbGxvYy1jb3B5LWZyZWUgc2VxdWVuY2UuDQorDQorICBJZiBwIGlzIG51bGwsIHJlYWxsb2MgaXMgZXF1aXZhbGVudCB0byBtYWxsb2MuDQorDQorICBJZiBzcGFjZSBpcyBub3QgYXZhaWxhYmxlLCByZWFsbG9jIHJldHVybnMgbnVsbCwgZXJybm8gaXMgc2V0IChpZiBvbg0KKyAgQU5TSSkgYW5kIHAgaXMgTk9UIGZyZWVkLg0KKw0KKyAgaWYgbiBpcyBmb3IgZmV3ZXIgYnl0ZXMgdGhhbiBhbHJlYWR5IGhlbGQgYnkgcCwgdGhlIG5ld2x5IHVudXNlZA0KKyAgc3BhY2UgaXMgbG9wcGVkIG9mZiBhbmQgZnJlZWQgaWYgcG9zc2libGUuICByZWFsbG9jIHdpdGggYSBzaXplDQorICBhcmd1bWVudCBvZiB6ZXJvIChyZSlhbGxvY2F0ZXMgYSBtaW5pbXVtLXNpemVkIGNodW5rLg0KKw0KKyAgVGhlIG9sZCB1bml4IHJlYWxsb2MgY29udmVudGlvbiBvZiBhbGxvd2luZyB0aGUgbGFzdC1mcmVlJ2QgY2h1bmsNCisgIHRvIGJlIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gcmVhbGxvYyBpcyBub3Qgc3VwcG9ydGVkLg0KKyovDQorDQordm9pZCogZGxyZWFsbG9jKHZvaWQqLCBzaXplX3QpOw0KKw0KKy8qDQorICBtZW1hbGlnbihzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgbik7DQorICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBjaHVuayBvZiBuIGJ5dGVzLCBhbGlnbmVkDQorICBpbiBhY2NvcmQgd2l0aCB0aGUgYWxpZ25tZW50IGFyZ3VtZW50Lg0KKw0KKyAgVGhlIGFsaWdubWVudCBhcmd1bWVudCBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28uIElmIHRoZSBhcmd1bWVudCBpcw0KKyAgbm90IGEgcG93ZXIgb2YgdHdvLCB0aGUgbmVhcmVzdCBncmVhdGVyIHBvd2VyIGlzIHVzZWQuDQorICA4LWJ5dGUgYWxpZ25tZW50IGlzIGd1YXJhbnRlZWQgYnkgbm9ybWFsIG1hbGxvYyBjYWxscywgc28gZG9uJ3QNCisgIGJvdGhlciBjYWxsaW5nIG1lbWFsaWduIHdpdGggYW4gYXJndW1lbnQgb2YgOCBvciBsZXNzLg0KKw0KKyAgT3ZlcnJlbGlhbmNlIG9uIG1lbWFsaWduIGlzIGEgc3VyZSB3YXkgdG8gZnJhZ21lbnQgc3BhY2UuDQorKi8NCit2b2lkKiBkbG1lbWFsaWduKHNpemVfdCwgc2l6ZV90KTsNCisNCisvKg0KKyAgdmFsbG9jKHNpemVfdCBuKTsNCisgIEVxdWl2YWxlbnQgdG8gbWVtYWxpZ24ocGFnZXNpemUsIG4pLCB3aGVyZSBwYWdlc2l6ZSBpcyB0aGUgcGFnZQ0KKyAgc2l6ZSBvZiB0aGUgc3lzdGVtLiBJZiB0aGUgcGFnZXNpemUgaXMgdW5rbm93biwgNDA5NiBpcyB1c2VkLg0KKyovDQordm9pZCogZGx2YWxsb2Moc2l6ZV90KTsNCisNCisvKg0KKyAgbWFsbG9wdChpbnQgcGFyYW1ldGVyX251bWJlciwgaW50IHBhcmFtZXRlcl92YWx1ZSkNCisgIFNldHMgdHVuYWJsZSBwYXJhbWV0ZXJzIFRoZSBmb3JtYXQgaXMgdG8gcHJvdmlkZSBhDQorICAocGFyYW1ldGVyLW51bWJlciwgcGFyYW1ldGVyLXZhbHVlKSBwYWlyLiAgbWFsbG9wdCB0aGVuIHNldHMgdGhlDQorICBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0byB0aGUgYXJndW1lbnQgdmFsdWUgaWYgaXQgY2FuIChpLmUuLCBzbw0KKyAgbG9uZyBhcyB0aGUgdmFsdWUgaXMgbWVhbmluZ2Z1bCksIGFuZCByZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCBlbHNlDQorICAwLiAgU1ZJRC9YUEcvQU5TSSBkZWZpbmVzIGZvdXIgc3RhbmRhcmQgcGFyYW0gbnVtYmVycyBmb3IgbWFsbG9wdCwNCisgIG5vcm1hbGx5IGRlZmluZWQgaW4gbWFsbG9jLmguICBOb25lIG9mIHRoZXNlIGFyZSB1c2UgaW4gdGhpcyBtYWxsb2MsDQorICBzbyBzZXR0aW5nIHRoZW0gaGFzIG5vIGVmZmVjdC4gQnV0IHRoaXMgbWFsbG9jIGFsc28gc3VwcG9ydHMgb3RoZXINCisgIG9wdGlvbnMgaW4gbWFsbG9wdDoNCisNCisgIFN5bWJvbCAgICAgICAgICAgIHBhcmFtICMgIGRlZmF1bHQgICAgYWxsb3dlZCBwYXJhbSB2YWx1ZXMNCisgIE1fVFJJTV9USFJFU0hPTEQgICAgIC0xICAgMioxMDI0KjEwMjQgICBhbnkgICAoLTFVIGRpc2FibGVzIHRyaW1taW5nKQ0KKyAgTV9HUkFOVUxBUklUWSAgICAgICAgLTIgICAgIHBhZ2Ugc2l6ZSAgIGFueSBwb3dlciBvZiAyID49IHBhZ2Ugc2l6ZQ0KKyAgTV9NTUFQX1RIUkVTSE9MRCAgICAgLTMgICAgICAyNTYqMTAyNCAgIGFueSAgIChvciAwIGlmIG5vIE1NQVAgc3VwcG9ydCkNCisqLw0KK2ludCBkbG1hbGxvcHQoaW50LCBpbnQpOw0KKw0KKyNkZWZpbmUgTV9UUklNX1RIUkVTSE9MRCAgICAgKC0xKQ0KKyNkZWZpbmUgTV9HUkFOVUxBUklUWSAgICAgICAgKC0yKQ0KKyNkZWZpbmUgTV9NTUFQX1RIUkVTSE9MRCAgICAgKC0zKQ0KKw0KKw0KKy8qDQorICBtYWxsb2NfZm9vdHByaW50KCk7DQorICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2J0YWluZWQgZnJvbSB0aGUgc3lzdGVtLiAgVGhlIHRvdGFsDQorICBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGJ5IG1hbGxvYywgcmVhbGxvYyBldGMuLCBpcyBsZXNzIHRoYW4gdGhpcw0KKyAgdmFsdWUuIFVubGlrZSBtYWxsaW5mbywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG9ubHkgYSBwcmVjb21wdXRlZA0KKyAgcmVzdWx0LCBzbyBjYW4gYmUgY2FsbGVkIGZyZXF1ZW50bHkgdG8gbW9uaXRvciBtZW1vcnkgY29uc3VtcHRpb24uDQorICBFdmVuIGlmIGxvY2tzIGFyZSBvdGhlcndpc2UgZGVmaW5lZCwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgdGhlbSwNCisgIHNvIHJlc3VsdHMgbWlnaHQgbm90IGJlIHVwIHRvIGRhdGUuDQorKi8NCitzaXplX3QgZGxtYWxsb2NfZm9vdHByaW50KCk7DQorDQorI2lmICFOT19NQUxMSU5GTw0KKy8qDQorICBtYWxsaW5mbygpDQorICBSZXR1cm5zIChieSBjb3B5KSBhIHN0cnVjdCBjb250YWluaW5nIHZhcmlvdXMgc3VtbWFyeSBzdGF0aXN0aWNzOg0KKw0KKyAgYXJlbmE6ICAgICBjdXJyZW50IHRvdGFsIG5vbi1tbWFwcGVkIGJ5dGVzIGFsbG9jYXRlZCBmcm9tIHN5c3RlbQ0KKyAgb3JkYmxrczogICB0aGUgbnVtYmVyIG9mIGZyZWUgY2h1bmtzDQorICBzbWJsa3M6ICAgIGFsd2F5cyB6ZXJvLg0KKyAgaGJsa3M6ICAgICBjdXJyZW50IG51bWJlciBvZiBtbWFwcGVkIHJlZ2lvbnMNCisgIGhibGtoZDogICAgdG90YWwgYnl0ZXMgaGVsZCBpbiBtbWFwcGVkIHJlZ2lvbnMNCisgIHVzbWJsa3M6ICAgdGhlIG1heGltdW0gdG90YWwgYWxsb2NhdGVkIHNwYWNlLiBUaGlzIHdpbGwgYmUgZ3JlYXRlcg0KKyAgICAgICAgICAgICAgICB0aGFuIGN1cnJlbnQgdG90YWwgaWYgdHJpbW1pbmcgaGFzIG9jY3VycmVkLg0KKyAgZnNtYmxrczogICBhbHdheXMgemVybw0KKyAgdW9yZGJsa3M6ICBjdXJyZW50IHRvdGFsIGFsbG9jYXRlZCBzcGFjZSAobm9ybWFsIG9yIG1tYXBwZWQpDQorICBmb3JkYmxrczogIHRvdGFsIGZyZWUgc3BhY2UNCisgIGtlZXBjb3N0OiAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgaWRlYWxseSBiZSByZWxlYXNlZA0KKyAgICAgICAgICAgICAgIGJhY2sgdG8gc3lzdGVtIHZpYSBtYWxsb2NfdHJpbS4gKCJpZGVhbGx5IiBtZWFucyB0aGF0DQorICAgICAgICAgICAgICAgaXQgaWdub3JlcyBwYWdlIHJlc3RyaWN0aW9ucyBldGMuKQ0KKw0KKyAgQmVjYXVzZSB0aGVzZSBmaWVsZHMgYXJlIGludHMsIGJ1dCBpbnRlcm5hbCBib29ra2VlcGluZyBtYXkNCisgIGJlIGtlcHQgYXMgbG9uZ3MsIHRoZSByZXBvcnRlZCB2YWx1ZXMgbWF5IHdyYXAgYXJvdW5kIHplcm8gYW5kDQorICB0aHVzIGJlIGluYWNjdXJhdGUuDQorKi8NCisNCitzdHJ1Y3QgbWFsbGluZm8gZGxtYWxsaW5mbyh2b2lkKTsNCisjZW5kaWYgIC8qIE5PX01BTExJTkZPICovDQorDQorLyoNCisgIGluZGVwZW5kZW50X2NhbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1lbnRfc2l6ZSwgdm9pZCogY2h1bmtzW10pOw0KKw0KKyAgaW5kZXBlbmRlbnRfY2FsbG9jIGlzIHNpbWlsYXIgdG8gY2FsbG9jLCBidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYQ0KKyAgc2luZ2xlIGNsZWFyZWQgc3BhY2UsIGl0IHJldHVybnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gbl9lbGVtZW50cw0KKyAgaW5kZXBlbmRlbnQgZWxlbWVudHMgdGhhdCBjYW4gaG9sZCBjb250ZW50cyBvZiBzaXplIGVsZW1fc2l6ZSwgZWFjaA0KKyAgb2Ygd2hpY2ggc3RhcnRzIG91dCBjbGVhcmVkLCBhbmQgY2FuIGJlIGluZGVwZW5kZW50bHkgZnJlZWQsDQorICByZWFsbG9jJ2VkIGV0Yy4gVGhlIGVsZW1lbnRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGFkamFjZW50bHkNCisgIGFsbG9jYXRlZCAodGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBvY2N1ciB3aXRoIG11bHRpcGxlIGNhbGxvY3Mgb3INCisgIG1hbGxvY3MpLCB3aGljaCBtYXkgYWxzbyBpbXByb3ZlIGNhY2hlIGxvY2FsaXR5IGluIHNvbWUNCisgIGFwcGxpY2F0aW9ucy4NCisNCisgIFRoZSAiY2h1bmtzIiBhcmd1bWVudCBpcyBvcHRpb25hbCAoaS5lLiwgbWF5IGJlIG51bGwsIHdoaWNoIGlzDQorICBwcm9iYWJseSB0aGUgbW9zdCB0eXBpY2FsIHVzYWdlKS4gSWYgaXQgaXMgbnVsbCwgdGhlIHJldHVybmVkIGFycmF5DQorICBpcyBpdHNlbGYgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBzaG91bGQgYWxzbyBiZSBmcmVlZCB3aGVuIGl0IGlzDQorICBubyBsb25nZXIgbmVlZGVkLiBPdGhlcndpc2UsIHRoZSBjaHVua3MgYXJyYXkgbXVzdCBiZSBvZiBhdCBsZWFzdA0KKyAgbl9lbGVtZW50cyBpbiBsZW5ndGguIEl0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBwb2ludGVycyB0byB0aGUNCisgIGNodW5rcy4NCisNCisgIEluIGVpdGhlciBjYXNlLCBpbmRlcGVuZGVudF9jYWxsb2MgcmV0dXJucyB0aGlzIHBvaW50ZXIgYXJyYXksIG9yDQorICBudWxsIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZC4gIElmIG5fZWxlbWVudHMgaXMgemVybyBhbmQgImNodW5rcyINCisgIGlzIG51bGwsIGl0IHJldHVybnMgYSBjaHVuayByZXByZXNlbnRpbmcgYW4gYXJyYXkgd2l0aCB6ZXJvIGVsZW1lbnRzDQorICAod2hpY2ggc2hvdWxkIGJlIGZyZWVkIGlmIG5vdCB3YW50ZWQpLg0KKw0KKyAgRWFjaCBlbGVtZW50IG11c3QgYmUgaW5kaXZpZHVhbGx5IGZyZWVkIHdoZW4gaXQgaXMgbm8gbG9uZ2VyDQorICBuZWVkZWQuIElmIHlvdSdkIGxpa2UgdG8gaW5zdGVhZCBiZSBhYmxlIHRvIGZyZWUgYWxsIGF0IG9uY2UsIHlvdQ0KKyAgc2hvdWxkIGluc3RlYWQgdXNlIHJlZ3VsYXIgY2FsbG9jIGFuZCBhc3NpZ24gcG9pbnRlcnMgaW50byB0aGlzDQorICBzcGFjZSB0byByZXByZXNlbnQgZWxlbWVudHMuICAoSW4gdGhpcyBjYXNlIHRob3VnaCwgeW91IGNhbm5vdA0KKyAgaW5kZXBlbmRlbnRseSBmcmVlIGVsZW1lbnRzLikNCisNCisgIGluZGVwZW5kZW50X2NhbGxvYyBzaW1wbGlmaWVzIGFuZCBzcGVlZHMgdXAgaW1wbGVtZW50YXRpb25zIG9mIG1hbnkNCisgIGtpbmRzIG9mIHBvb2xzLiAgSXQgbWF5IGFsc28gYmUgdXNlZnVsIHdoZW4gY29uc3RydWN0aW5nIGxhcmdlIGRhdGENCisgIHN0cnVjdHVyZXMgdGhhdCBpbml0aWFsbHkgaGF2ZSBhIGZpeGVkIG51bWJlciBvZiBmaXhlZC1zaXplZCBub2RlcywNCisgIGJ1dCB0aGUgbnVtYmVyIGlzIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUsIGFuZCBzb21lIG9mIHRoZSBub2Rlcw0KKyAgbWF5IGxhdGVyIG5lZWQgdG8gYmUgZnJlZWQuIEZvciBleGFtcGxlOg0KKw0KKyAgc3RydWN0IE5vZGUgeyBpbnQgaXRlbTsgc3RydWN0IE5vZGUqIG5leHQ7IH07DQorDQorICBzdHJ1Y3QgTm9kZSogYnVpbGRfbGlzdCgpIHsNCisgICAgc3RydWN0IE5vZGUqKiBwb29sOw0KKyAgICBpbnQgbiA9IHJlYWRfbnVtYmVyX29mX25vZGVzX25lZWRlZCgpOw0KKyAgICBpZiAobiA8PSAwKSByZXR1cm4gMDsNCisgICAgcG9vbCA9IChzdHJ1Y3QgTm9kZSoqKShpbmRlcGVuZGVudF9jYWxsb2Mobiwgc2l6ZW9mKHN0cnVjdCBOb2RlKSwgMCk7DQorICAgIGlmIChwb29sID09IDApIGRpZSgpOw0KKyAgICAvLyBvcmdhbml6ZSBpbnRvIGEgbGlua2VkIGxpc3QuLi4NCisgICAgc3RydWN0IE5vZGUqIGZpcnN0ID0gcG9vbFswXTsNCisgICAgZm9yIChpID0gMDsgaSA8IG4tMTsgKytpKQ0KKyAgICAgIHBvb2xbaV0tPm5leHQgPSBwb29sW2krMV07DQorICAgIGZyZWUocG9vbCk7ICAgICAvLyBDYW4gbm93IGZyZWUgdGhlIGFycmF5IChvciBub3QsIGlmIGl0IGlzIG5lZWRlZCBsYXRlcikNCisgICAgcmV0dXJuIGZpcnN0Ow0KKyAgfQ0KKyovDQordm9pZCoqIGRsaW5kZXBlbmRlbnRfY2FsbG9jKHNpemVfdCwgc2l6ZV90LCB2b2lkKiopOw0KKw0KKy8qDQorICBpbmRlcGVuZGVudF9jb21hbGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IHNpemVzW10sIHZvaWQqIGNodW5rc1tdKTsNCisNCisgIGluZGVwZW5kZW50X2NvbWFsbG9jIGFsbG9jYXRlcywgYWxsIGF0IG9uY2UsIGEgc2V0IG9mIG5fZWxlbWVudHMNCisgIGNodW5rcyB3aXRoIHNpemVzIGluZGljYXRlZCBpbiB0aGUgInNpemVzIiBhcnJheS4gICAgSXQgcmV0dXJucw0KKyAgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlc2UgZWxlbWVudHMsIGVhY2ggb2Ygd2hpY2ggY2FuIGJlDQorICBpbmRlcGVuZGVudGx5IGZyZWVkLCByZWFsbG9jJ2VkIGV0Yy4gVGhlIGVsZW1lbnRzIGFyZSBndWFyYW50ZWVkIHRvDQorICBiZSBhZGphY2VudGx5IGFsbG9jYXRlZCAodGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBvY2N1ciB3aXRoDQorICBtdWx0aXBsZSBjYWxsb2NzIG9yIG1hbGxvY3MpLCB3aGljaCBtYXkgYWxzbyBpbXByb3ZlIGNhY2hlIGxvY2FsaXR5DQorICBpbiBzb21lIGFwcGxpY2F0aW9ucy4NCisNCisgIFRoZSAiY2h1bmtzIiBhcmd1bWVudCBpcyBvcHRpb25hbCAoaS5lLiwgbWF5IGJlIG51bGwpLiBJZiBpdCBpcyBudWxsDQorICB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgaXRzZWxmIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgc2hvdWxkIGFsc28NCisgIGJlIGZyZWVkIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gT3RoZXJ3aXNlLCB0aGUgY2h1bmtzIGFycmF5DQorICBtdXN0IGJlIG9mIGF0IGxlYXN0IG5fZWxlbWVudHMgaW4gbGVuZ3RoLiBJdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUNCisgIHBvaW50ZXJzIHRvIHRoZSBjaHVua3MuDQorDQorICBJbiBlaXRoZXIgY2FzZSwgaW5kZXBlbmRlbnRfY29tYWxsb2MgcmV0dXJucyB0aGlzIHBvaW50ZXIgYXJyYXksIG9yDQorICBudWxsIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZC4gIElmIG5fZWxlbWVudHMgaXMgemVybyBhbmQgY2h1bmtzIGlzDQorICBudWxsLCBpdCByZXR1cm5zIGEgY2h1bmsgcmVwcmVzZW50aW5nIGFuIGFycmF5IHdpdGggemVybyBlbGVtZW50cw0KKyAgKHdoaWNoIHNob3VsZCBiZSBmcmVlZCBpZiBub3Qgd2FudGVkKS4NCisNCisgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGluZGl2aWR1YWxseSBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlcg0KKyAgbmVlZGVkLiBJZiB5b3UnZCBsaWtlIHRvIGluc3RlYWQgYmUgYWJsZSB0byBmcmVlIGFsbCBhdCBvbmNlLCB5b3UNCisgIHNob3VsZCBpbnN0ZWFkIHVzZSBhIHNpbmdsZSByZWd1bGFyIG1hbGxvYywgYW5kIGFzc2lnbiBwb2ludGVycyBhdA0KKyAgcGFydGljdWxhciBvZmZzZXRzIGluIHRoZSBhZ2dyZWdhdGUgc3BhY2UuIChJbiB0aGlzIGNhc2UgdGhvdWdoLCB5b3UNCisgIGNhbm5vdCBpbmRlcGVuZGVudGx5IGZyZWUgZWxlbWVudHMuKQ0KKw0KKyAgaW5kZXBlbmRlbnRfY29tYWxsYWMgZGlmZmVycyBmcm9tIGluZGVwZW5kZW50X2NhbGxvYyBpbiB0aGF0IGVhY2gNCisgIGVsZW1lbnQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgc2l6ZSwgYW5kIGFsc28gdGhhdCBpdCBkb2VzIG5vdA0KKyAgYXV0b21hdGljYWxseSBjbGVhciBlbGVtZW50cy4NCisNCisgIGluZGVwZW5kZW50X2NvbWFsbG9jIGNhbiBiZSB1c2VkIHRvIHNwZWVkIHVwIGFsbG9jYXRpb24gaW4gY2FzZXMNCisgIHdoZXJlIHNldmVyYWwgc3RydWN0cyBvciBvYmplY3RzIG11c3QgYWx3YXlzIGJlIGFsbG9jYXRlZCBhdCB0aGUNCisgIHNhbWUgdGltZS4gIEZvciBleGFtcGxlOg0KKw0KKyAgc3RydWN0IEhlYWQgeyAuLi4gfQ0KKyAgc3RydWN0IEZvb3QgeyAuLi4gfQ0KKw0KKyAgdm9pZCBzZW5kX21lc3NhZ2UoY2hhciogbXNnKSB7DQorICAgIGludCBtc2dsZW4gPSBzdHJsZW4obXNnKTsNCisgICAgc2l6ZV90IHNpemVzWzNdID0geyBzaXplb2Yoc3RydWN0IEhlYWQpLCBtc2dsZW4sIHNpemVvZihzdHJ1Y3QgRm9vdCkgfTsNCisgICAgdm9pZCogY2h1bmtzWzNdOw0KKyAgICBpZiAoaW5kZXBlbmRlbnRfY29tYWxsb2MoMywgc2l6ZXMsIGNodW5rcykgPT0gMCkNCisgICAgICBkaWUoKTsNCisgICAgc3RydWN0IEhlYWQqIGhlYWQgPSAoc3RydWN0IEhlYWQqKShjaHVua3NbMF0pOw0KKyAgICBjaGFyKiAgICAgICAgYm9keSA9IChjaGFyKikoY2h1bmtzWzFdKTsNCisgICAgc3RydWN0IEZvb3QqIGZvb3QgPSAoc3RydWN0IEZvb3QqKShjaHVua3NbMl0pOw0KKyAgICAvLyAuLi4NCisgIH0NCisNCisgIEluIGdlbmVyYWwgdGhvdWdoLCBpbmRlcGVuZGVudF9jb21hbGxvYyBpcyB3b3J0aCB1c2luZyBvbmx5IGZvcg0KKyAgbGFyZ2VyIHZhbHVlcyBvZiBuX2VsZW1lbnRzLiBGb3Igc21hbGwgdmFsdWVzLCB5b3UgcHJvYmFibHkgd29uJ3QNCisgIGRldGVjdCBlbm91Z2ggZGlmZmVyZW5jZSBmcm9tIHNlcmllcyBvZiBtYWxsb2MgY2FsbHMgdG8gYm90aGVyLg0KKw0KKyAgT3ZlcnVzZSBvZiBpbmRlcGVuZGVudF9jb21hbGxvYyBjYW4gaW5jcmVhc2Ugb3ZlcmFsbCBtZW1vcnkgdXNhZ2UsDQorICBzaW5jZSBpdCBjYW5ub3QgcmV1c2UgZXhpc3Rpbmcgbm9uY29udGlndW91cyBzbWFsbCBjaHVua3MgdGhhdA0KKyAgbWlnaHQgYmUgYXZhaWxhYmxlIGZvciBzb21lIG9mIHRoZSBlbGVtZW50cy4NCisqLw0KK3ZvaWQqKiBkbGluZGVwZW5kZW50X2NvbWFsbG9jKHNpemVfdCwgc2l6ZV90Kiwgdm9pZCoqKTsNCisNCisNCisvKg0KKyAgcHZhbGxvYyhzaXplX3Qgbik7DQorICBFcXVpdmFsZW50IHRvIHZhbGxvYyhtaW5pbXVtLXBhZ2UtdGhhdC1ob2xkcyhuKSksIHRoYXQgaXMsDQorICByb3VuZCB1cCBuIHRvIG5lYXJlc3QgcGFnZXNpemUuDQorICovDQordm9pZCogIGRscHZhbGxvYyhzaXplX3QpOw0KKw0KKy8qDQorICBtYWxsb2NfdHJpbShzaXplX3QgcGFkKTsNCisNCisgIElmIHBvc3NpYmxlLCBnaXZlcyBtZW1vcnkgYmFjayB0byB0aGUgc3lzdGVtICh2aWEgbmVnYXRpdmUgYXJndW1lbnRzDQorICB0byBzYnJrKSBpZiB0aGVyZSBpcyB1bnVzZWQgbWVtb3J5IGF0IHRoZSBgaGlnaCcgZW5kIG9mIHRoZSBtYWxsb2MNCisgIHBvb2wgb3IgaW4gdW51c2VkIE1NQVAgc2VnbWVudHMuIFlvdSBjYW4gY2FsbCB0aGlzIGFmdGVyIGZyZWVpbmcNCisgIGxhcmdlIGJsb2NrcyBvZiBtZW1vcnkgdG8gcG90ZW50aWFsbHkgcmVkdWNlIHRoZSBzeXN0ZW0tbGV2ZWwgbWVtb3J5DQorICByZXF1aXJlbWVudHMgb2YgYSBwcm9ncmFtLiBIb3dldmVyLCBpdCBjYW5ub3QgZ3VhcmFudGVlIHRvIHJlZHVjZQ0KKyAgbWVtb3J5LiBVbmRlciBzb21lIGFsbG9jYXRpb24gcGF0dGVybnMsIHNvbWUgbGFyZ2UgZnJlZSBibG9ja3Mgb2YNCisgIG1lbW9yeSB3aWxsIGJlIGxvY2tlZCBiZXR3ZWVuIHR3byB1c2VkIGNodW5rcywgc28gdGhleSBjYW5ub3QgYmUNCisgIGdpdmVuIGJhY2sgdG8gdGhlIHN5c3RlbS4NCisNCisgIFRoZSBgcGFkJyBhcmd1bWVudCB0byBtYWxsb2NfdHJpbSByZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgZnJlZQ0KKyAgdHJhaWxpbmcgc3BhY2UgdG8gbGVhdmUgdW50cmltbWVkLiBJZiB0aGlzIGFyZ3VtZW50IGlzIHplcm8sIG9ubHkNCisgIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBtZW1vcnkgdG8gbWFpbnRhaW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzDQorICB3aWxsIGJlIGxlZnQuIE5vbi16ZXJvIGFyZ3VtZW50cyBjYW4gYmUgc3VwcGxpZWQgdG8gbWFpbnRhaW4gZW5vdWdoDQorICB0cmFpbGluZyBzcGFjZSB0byBzZXJ2aWNlIGZ1dHVyZSBleHBlY3RlZCBhbGxvY2F0aW9ucyB3aXRob3V0IGhhdmluZw0KKyAgdG8gcmUtb2J0YWluIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0uDQorDQorICBNYWxsb2NfdHJpbSByZXR1cm5zIDEgaWYgaXQgYWN0dWFsbHkgcmVsZWFzZWQgYW55IG1lbW9yeSwgZWxzZSAwLg0KKyovDQoraW50ICBkbG1hbGxvY190cmltKHNpemVfdCk7DQorDQorLyoNCisgIG1hbGxvY19zdGF0cygpOw0KKyAgUHJpbnRzIG9uIHN0ZGVyciB0aGUgYW1vdW50IG9mIHNwYWNlIG9idGFpbmVkIGZyb20gdGhlIHN5c3RlbSAoYm90aA0KKyAgdmlhIHNicmsgYW5kIG1tYXApLCB0aGUgbWF4aW11bSBhbW91bnQgKHdoaWNoIG1heSBiZSBtb3JlIHRoYW4NCisgIGN1cnJlbnQgaWYgbWFsbG9jX3RyaW0gYW5kL29yIG11bm1hcCBnb3QgY2FsbGVkKSwgYW5kIHRoZSBjdXJyZW50DQorICBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIHZpYSBtYWxsb2MgKG9yIHJlYWxsb2MsIGV0YykgYnV0IG5vdCB5ZXQNCisgIGZyZWVkLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCwgbm90IHRoZQ0KKyAgbnVtYmVyIHJlcXVlc3RlZC4gSXQgd2lsbCBiZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIHJlcXVlc3RlZA0KKyAgYmVjYXVzZSBvZiBhbGlnbm1lbnQgYW5kIGJvb2trZWVwaW5nIG92ZXJoZWFkLiBCZWNhdXNlIGl0IGluY2x1ZGVzDQorICBhbGlnbm1lbnQgd2FzdGFnZSBhcyBiZWluZyBpbiB1c2UsIHRoaXMgZmlndXJlIG1heSBiZSBncmVhdGVyIHRoYW4NCisgIHplcm8gZXZlbiB3aGVuIG5vIHVzZXItbGV2ZWwgY2h1bmtzIGFyZSBhbGxvY2F0ZWQuDQorDQorICBUaGUgcmVwb3J0ZWQgY3VycmVudCBhbmQgbWF4aW11bSBzeXN0ZW0gbWVtb3J5IGNhbiBiZSBpbmFjY3VyYXRlIGlmDQorICBhIHByb2dyYW0gbWFrZXMgb3RoZXIgY2FsbHMgdG8gc3lzdGVtIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucw0KKyAgKG5vcm1hbGx5IHNicmspIG91dHNpZGUgb2YgbWFsbG9jLg0KKw0KKyAgbWFsbG9jX3N0YXRzIHByaW50cyBvbmx5IHRoZSBtb3N0IGNvbW1vbmx5IGludGVyZXN0aW5nIHN0YXRpc3RpY3MuDQorICBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIG1hbGxpbmZvLg0KKyovDQordm9pZCAgZGxtYWxsb2Nfc3RhdHMoKTsNCisNCisjZW5kaWYgLyogIU9OTFlfTVNQQUNFUyAqLw0KKw0KKy8qDQorICBtYWxsb2NfdXNhYmxlX3NpemUodm9pZCogcCk7DQorDQorICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgeW91IGNhbiBhY3R1YWxseSB1c2UgaW4NCisgIGFuIGFsbG9jYXRlZCBjaHVuaywgd2hpY2ggbWF5IGJlIG1vcmUgdGhhbiB5b3UgcmVxdWVzdGVkIChhbHRob3VnaA0KKyAgb2Z0ZW4gbm90KSBkdWUgdG8gYWxpZ25tZW50IGFuZCBtaW5pbXVtIHNpemUgY29uc3RyYWludHMuDQorICBZb3UgY2FuIHVzZSB0aGlzIG1hbnkgYnl0ZXMgd2l0aG91dCB3b3JyeWluZyBhYm91dA0KKyAgb3ZlcndyaXRpbmcgb3RoZXIgYWxsb2NhdGVkIG9iamVjdHMuIFRoaXMgaXMgbm90IGEgcGFydGljdWxhcmx5IGdyZWF0DQorICBwcm9ncmFtbWluZyBwcmFjdGljZS4gbWFsbG9jX3VzYWJsZV9zaXplIGNhbiBiZSBtb3JlIHVzZWZ1bCBpbg0KKyAgZGVidWdnaW5nIGFuZCBhc3NlcnRpb25zLCBmb3IgZXhhbXBsZToNCisNCisgIHAgPSBtYWxsb2Mobik7DQorICBhc3NlcnQobWFsbG9jX3VzYWJsZV9zaXplKHApID49IDI1Nik7DQorKi8NCitzaXplX3QgZGxtYWxsb2NfdXNhYmxlX3NpemUodm9pZCopOw0KKw0KKw0KKyNpZiBNU1BBQ0VTDQorDQorLyoNCisgIG1zcGFjZSBpcyBhbiBvcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYW4gaW5kZXBlbmRlbnQNCisgIHJlZ2lvbiBvZiBzcGFjZSB0aGF0IHN1cHBvcnRzIG1zcGFjZV9tYWxsb2MsIGV0Yy4NCisqLw0KK3R5cGVkZWYgdm9pZCogbXNwYWNlOw0KKw0KKy8qDQorICBjcmVhdGVfbXNwYWNlIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgaW5kZXBlbmRlbnQgc3BhY2Ugd2l0aCB0aGUNCisgIGdpdmVuIGluaXRpYWwgY2FwYWNpdHksIG9yLCBpZiAwLCB0aGUgZGVmYXVsdCBncmFudWxhcml0eSBzaXplLiAgSXQNCisgIHJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBzeXN0ZW0gbWVtb3J5IGF2YWlsYWJsZSB0byBjcmVhdGUgdGhlDQorICBzcGFjZS4gIElmIGFyZ3VtZW50IGxvY2tlZCBpcyBub24temVybywgdGhlIHNwYWNlIHVzZXMgYSBzZXBhcmF0ZQ0KKyAgbG9jayB0byBjb250cm9sIGFjY2Vzcy4gVGhlIGNhcGFjaXR5IG9mIHRoZSBzcGFjZSB3aWxsIGdyb3cNCisgIGR5bmFtaWNhbGx5IGFzIG5lZWRlZCB0byBzZXJ2aWNlIG1zcGFjZV9tYWxsb2MgcmVxdWVzdHMuICBZb3UgY2FuDQorICBjb250cm9sIHRoZSBzaXplcyBvZiBpbmNyZW1lbnRhbCBpbmNyZWFzZXMgb2YgdGhpcyBzcGFjZSBieQ0KKyAgY29tcGlsaW5nIHdpdGggYSBkaWZmZXJlbnQgREVGQVVMVF9HUkFOVUxBUklUWSBvciBkeW5hbWljYWxseQ0KKyAgc2V0dGluZyB3aXRoIG1hbGxvcHQoTV9HUkFOVUxBUklUWSwgdmFsdWUpLg0KKyovDQorbXNwYWNlIGNyZWF0ZV9tc3BhY2Uoc2l6ZV90IGNhcGFjaXR5LCBpbnQgbG9ja2VkKTsNCisNCisvKg0KKyAgZGVzdHJveV9tc3BhY2UgZGVzdHJveXMgdGhlIGdpdmVuIHNwYWNlLCBhbmQgYXR0ZW1wdHMgdG8gcmV0dXJuIGFsbA0KKyAgb2YgaXRzIG1lbW9yeSBiYWNrIHRvIHRoZSBzeXN0ZW0sIHJldHVybmluZyB0aGUgdG90YWwgbnVtYmVyIG9mDQorICBieXRlcyBmcmVlZC4gQWZ0ZXIgZGVzdHJ1Y3Rpb24sIHRoZSByZXN1bHRzIG9mIGFjY2VzcyB0byBhbGwgbWVtb3J5DQorICB1c2VkIGJ5IHRoZSBzcGFjZSBiZWNvbWUgdW5kZWZpbmVkLg0KKyovDQorc2l6ZV90IGRlc3Ryb3lfbXNwYWNlKG1zcGFjZSBtc3ApOw0KKw0KKy8qDQorICBjcmVhdGVfbXNwYWNlX3dpdGhfYmFzZSB1c2VzIHRoZSBtZW1vcnkgc3VwcGxpZWQgYXMgdGhlIGluaXRpYWwgYmFzZQ0KKyAgb2YgYSBuZXcgbXNwYWNlLiBQYXJ0IChsZXNzIHRoYW4gMTI4KnNpemVvZihzaXplX3QpIGJ5dGVzKSBvZiB0aGlzDQorICBzcGFjZSBpcyB1c2VkIGZvciBib29ra2VlcGluZywgc28gdGhlIGNhcGFjaXR5IG11c3QgYmUgYXQgbGVhc3QgdGhpcw0KKyAgbGFyZ2UuIChPdGhlcndpc2UgMCBpcyByZXR1cm5lZC4pIFdoZW4gdGhpcyBpbml0aWFsIHNwYWNlIGlzDQorICBleGhhdXN0ZWQsIGFkZGl0aW9uYWwgbWVtb3J5IHdpbGwgYmUgb2J0YWluZWQgZnJvbSB0aGUgc3lzdGVtLg0KKyAgRGVzdHJveWluZyB0aGlzIHNwYWNlIHdpbGwgZGVhbGxvY2F0ZSBhbGwgYWRkaXRpb25hbGx5IGFsbG9jYXRlZA0KKyAgc3BhY2UgKGlmIHBvc3NpYmxlKSBidXQgbm90IHRoZSBpbml0aWFsIGJhc2UuDQorKi8NCittc3BhY2UgY3JlYXRlX21zcGFjZV93aXRoX2Jhc2Uodm9pZCogYmFzZSwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgbG9ja2VkKTsNCisNCisvKg0KKyAgbXNwYWNlX3RyYWNrX2xhcmdlX2NodW5rcyBjb250cm9scyB3aGV0aGVyIHJlcXVlc3RzIGZvciBsYXJnZSBjaHVua3MNCisgIGFyZSBhbGxvY2F0ZWQgaW4gdGhlaXIgb3duIHVudHJhY2tlZCBtbWFwcGVkIHJlZ2lvbnMsIHNlcGFyYXRlIGZyb20NCisgIG90aGVycyBpbiB0aGlzIG1zcGFjZS4gQnkgZGVmYXVsdCBsYXJnZSBjaHVua3MgYXJlIG5vdCB0cmFja2VkLA0KKyAgd2hpY2ggcmVkdWNlcyBmcmFnbWVudGF0aW9uLiBIb3dldmVyLCBzdWNoIGNodW5rcyBhcmUgbm90DQorICBuZWNlc3NhcmlseSByZWxlYXNlZCB0byB0aGUgc3lzdGVtIHVwb24gZGVzdHJveV9tc3BhY2UuICBFbmFibGluZw0KKyAgdHJhY2tpbmcgYnkgc2V0dGluZyB0byB0cnVlIG1heSBpbmNyZWFzZSBmcmFnbWVudGF0aW9uLCBidXQgYXZvaWRzDQorICBsZWFrYWdlIHdoZW4gcmVseWluZyBvbiBkZXN0cm95X21zcGFjZSB0byByZWxlYXNlIGFsbCBtZW1vcnkNCisgIGFsbG9jYXRlZCB1c2luZyB0aGlzIHNwYWNlLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByZXZpb3VzDQorICBzZXR0aW5nLg0KKyovDQoraW50IG1zcGFjZV90cmFja19sYXJnZV9jaHVua3MobXNwYWNlIG1zcCwgaW50IGVuYWJsZSk7DQorDQorLyoNCisgIG1zcGFjZV9tYWxsb2MgYmVoYXZlcyBhcyBtYWxsb2MsIGJ1dCBvcGVyYXRlcyB3aXRoaW4NCisgIHRoZSBnaXZlbiBzcGFjZS4NCisqLw0KK3ZvaWQqIG1zcGFjZV9tYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IGJ5dGVzKTsNCisNCisvKg0KKyAgbXNwYWNlX2ZyZWUgYmVoYXZlcyBhcyBmcmVlLCBidXQgb3BlcmF0ZXMgd2l0aGluDQorICB0aGUgZ2l2ZW4gc3BhY2UuDQorDQorICBJZiBjb21waWxlZCB3aXRoIEZPT1RFUlM9PTEsIG1zcGFjZV9mcmVlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQuDQorICBmcmVlIG1heSBiZSBjYWxsZWQgaW5zdGVhZCBvZiBtc3BhY2VfZnJlZSBiZWNhdXNlIGZyZWVkIGNodW5rcyBmcm9tDQorICBhbnkgc3BhY2UgYXJlIGhhbmRsZWQgYnkgdGhlaXIgb3JpZ2luYXRpbmcgc3BhY2VzLg0KKyovDQordm9pZCBtc3BhY2VfZnJlZShtc3BhY2UgbXNwLCB2b2lkKiBtZW0pOw0KKw0KKy8qDQorICBtc3BhY2VfcmVhbGxvYyBiZWhhdmVzIGFzIHJlYWxsb2MsIGJ1dCBvcGVyYXRlcyB3aXRoaW4NCisgIHRoZSBnaXZlbiBzcGFjZS4NCisNCisgIElmIGNvbXBpbGVkIHdpdGggRk9PVEVSUz09MSwgbXNwYWNlX3JlYWxsb2MgaXMgbm90IGFjdHVhbGx5DQorICBuZWVkZWQuICByZWFsbG9jIG1heSBiZSBjYWxsZWQgaW5zdGVhZCBvZiBtc3BhY2VfcmVhbGxvYyBiZWNhdXNlDQorICByZWFsbG9jZWQgY2h1bmtzIGZyb20gYW55IHNwYWNlIGFyZSBoYW5kbGVkIGJ5IHRoZWlyIG9yaWdpbmF0aW5nDQorICBzcGFjZXMuDQorKi8NCit2b2lkKiBtc3BhY2VfcmVhbGxvYyhtc3BhY2UgbXNwLCB2b2lkKiBtZW0sIHNpemVfdCBuZXdzaXplKTsNCisNCisvKg0KKyAgbXNwYWNlX2NhbGxvYyBiZWhhdmVzIGFzIGNhbGxvYywgYnV0IG9wZXJhdGVzIHdpdGhpbg0KKyAgdGhlIGdpdmVuIHNwYWNlLg0KKyovDQordm9pZCogbXNwYWNlX2NhbGxvYyhtc3BhY2UgbXNwLCBzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1fc2l6ZSk7DQorDQorLyoNCisgIG1zcGFjZV9tZW1hbGlnbiBiZWhhdmVzIGFzIG1lbWFsaWduLCBidXQgb3BlcmF0ZXMgd2l0aGluDQorICB0aGUgZ2l2ZW4gc3BhY2UuDQorKi8NCit2b2lkKiBtc3BhY2VfbWVtYWxpZ24obXNwYWNlIG1zcCwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IGJ5dGVzKTsNCisNCisvKg0KKyAgbXNwYWNlX2luZGVwZW5kZW50X2NhbGxvYyBiZWhhdmVzIGFzIGluZGVwZW5kZW50X2NhbGxvYywgYnV0DQorICBvcGVyYXRlcyB3aXRoaW4gdGhlIGdpdmVuIHNwYWNlLg0KKyovDQordm9pZCoqIG1zcGFjZV9pbmRlcGVuZGVudF9jYWxsb2MobXNwYWNlIG1zcCwgc2l6ZV90IG5fZWxlbWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVsZW1fc2l6ZSwgdm9pZCogY2h1bmtzW10pOw0KKw0KKy8qDQorICBtc3BhY2VfaW5kZXBlbmRlbnRfY29tYWxsb2MgYmVoYXZlcyBhcyBpbmRlcGVuZGVudF9jb21hbGxvYywgYnV0DQorICBvcGVyYXRlcyB3aXRoaW4gdGhlIGdpdmVuIHNwYWNlLg0KKyovDQordm9pZCoqIG1zcGFjZV9pbmRlcGVuZGVudF9jb21hbGxvYyhtc3BhY2UgbXNwLCBzaXplX3Qgbl9lbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplc1tdLCB2b2lkKiBjaHVua3NbXSk7DQorDQorLyoNCisgIG1zcGFjZV9mb290cHJpbnQoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2J0YWluZWQgZnJvbSB0aGUNCisgIHN5c3RlbSBmb3IgdGhpcyBzcGFjZS4NCisqLw0KK3NpemVfdCBtc3BhY2VfZm9vdHByaW50KG1zcGFjZSBtc3ApOw0KKw0KKw0KKyNpZiAhTk9fTUFMTElORk8NCisvKg0KKyAgbXNwYWNlX21hbGxpbmZvIGJlaGF2ZXMgYXMgbWFsbGluZm8sIGJ1dCByZXBvcnRzIHByb3BlcnRpZXMgb2YNCisgIHRoZSBnaXZlbiBzcGFjZS4NCisqLw0KK3N0cnVjdCBtYWxsaW5mbyBtc3BhY2VfbWFsbGluZm8obXNwYWNlIG1zcCk7DQorI2VuZGlmIC8qIE5PX01BTExJTkZPICovDQorDQorLyoNCisgIG1hbGxvY191c2FibGVfc2l6ZSh2b2lkKiBwKSBiZWhhdmVzIHRoZSBzYW1lIGFzIG1hbGxvY191c2FibGVfc2l6ZTsNCisqLw0KKyBzaXplX3QgbXNwYWNlX3VzYWJsZV9zaXplKHZvaWQqIG1lbSk7DQorDQorLyoNCisgIG1zcGFjZV9tYWxsb2Nfc3RhdHMgYmVoYXZlcyBhcyBtYWxsb2Nfc3RhdHMsIGJ1dCByZXBvcnRzDQorICBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBzcGFjZS4NCisqLw0KK3ZvaWQgbXNwYWNlX21hbGxvY19zdGF0cyhtc3BhY2UgbXNwKTsNCisNCisvKg0KKyAgbXNwYWNlX3RyaW0gYmVoYXZlcyBhcyBtYWxsb2NfdHJpbSwgYnV0DQorICBvcGVyYXRlcyB3aXRoaW4gdGhlIGdpdmVuIHNwYWNlLg0KKyovDQoraW50IG1zcGFjZV90cmltKG1zcGFjZSBtc3AsIHNpemVfdCBwYWQpOw0KKw0KKy8qDQorICBBbiBhbGlhcyBmb3IgbWFsbG9wdC4NCisqLw0KK2ludCBtc3BhY2VfbWFsbG9wdChpbnQsIGludCk7DQorDQorI2VuZGlmICAvKiBNU1BBQ0VTICovDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfTsgIC8qIGVuZCBvZiBleHRlcm4gIkMiICovDQorI2VuZGlmDQorDQorI2VuZGlmIC8qIE1BTExPQ18yODBfSCAqLw0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvbXByZWFsL21wcmVhbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbC9tcHJlYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjM1NDQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbC9tcHJlYWwuY3BwCkBAIC0wLDAgKzEsNTk3IEBACisvKg0KKwlNdWx0aS1wcmVjaXNpb24gcmVhbCBudW1iZXIgY2xhc3MuIEMrKyBpbnRlcmZhY2UgZm8gTVBGUiBsaWJyYXJ5Lg0KKwlQcm9qZWN0IGhvbWVwYWdlOiBodHRwOi8vd3d3LmhvbG9ib3JvZGtvLmNvbS9wYXZlbC8NCisJQ29udGFjdCBlLW1haWw6ICAgcGF2ZWxAaG9sb2Jvcm9ka28uY29tDQorDQorCUNvcHlyaWdodCAoYykgMjAwOC0yMDExIFBhdmVsIEhvbG9ib3JvZGtvDQorDQorCUNvcmUgRGV2ZWxvcGVyczogDQorCVBhdmVsIEhvbG9ib3JvZGtvLCBEbWl0cml5IEd1YmFub3YsIEtvbnN0YW50aW4gSG9sb2Jvcm9ka28uIA0KKw0KKwlDb250cmlidXRvcnM6DQorCUJyaWFuIEdsYWRtYW4sIEhlbG11dCBKYXJhdXNjaCwgRm9ra28gQmVla2hvZiwgVWxyaWNoIE11dHplLCANCisJSGVpbnogdmFuIFNhYW5lbiwgUGVyZSBDb25zdGFucywgUGV0ZXIgdmFuIEhvb2YsIEdhZWwgR3Vlbm5lYmF1ZCwgDQorCVRzYWkgQ2hpYSBDaGVuZywgQWxleGVpIFp1YmFub3YuDQorDQorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KKwltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQorCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcg0KKwl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisNCisJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQorCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorDQorCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCisJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKwlGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0ENCisNCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKwltb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCisJYXJlIG1ldDoNCisNCisJMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKw0KKwkyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KKwlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQorDQorCTMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzDQorCWRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKw0KKwlUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EDQorCUFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQ0KKwlJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KKwlBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQ0KKwlGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTA0KKwlEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUw0KKwlPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikNCisJSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QNCisJTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQ0KKwlPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GDQorCVNVQ0ggREFNQUdFLg0KKyovDQorI2luY2x1ZGUgPGNzdHJpbmc+DQorI2luY2x1ZGUgIm1wcmVhbC5oIg0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9DVVNUT01fTVBGUl9NQUxMT0MpDQorI2luY2x1ZGUgImRsbWFsbG9jLmgiDQorI2VuZGlmDQorDQordXNpbmcgc3RkOjp3czsNCit1c2luZyBzdGQ6OmNlcnI7DQordXNpbmcgc3RkOjplbmRsOw0KK3VzaW5nIHN0ZDo6c3RyaW5nOw0KK3VzaW5nIHN0ZDo6b3N0cmVhbTsNCit1c2luZyBzdGQ6OmlzdHJlYW07DQorDQorbmFtZXNwYWNlIG1wZnJ7DQorDQorbXBfcm5kX3QgICBtcHJlYWw6OmRlZmF1bHRfcm5kICA9IE1QRlJfUk5ETjsJLy8obXBmcl9nZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlKSgpOwkNCittcF9wcmVjX3QgIG1wcmVhbDo6ZGVmYXVsdF9wcmVjID0gNjQ7CQkJLy8obXBmcl9nZXRfZGVmYXVsdF9wcmVjKSgpOwkNCitpbnQJCSAgIG1wcmVhbDo6ZGVmYXVsdF9iYXNlID0gMTA7DQoraW50ICAgICAgICBtcHJlYWw6OmRvdWJsZV9iaXRzID0gLTE7DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0NVU1RPTV9NUEZSX01BTExPQykNCitib29sICAgICAgIG1wcmVhbDo6aXNfY3VzdG9tX21hbGxvYyA9IGZhbHNlOw0KKyNlbmRpZg0KKw0KKy8vIERlZmF1bHQgY29uc3RydWN0b3I6IGNyZWF0ZXMgbXAgbnVtYmVyIGFuZCBpbml0aWFsaXplcyBpdCB0byAwLg0KK21wcmVhbDo6bXByZWFsKCkgDQoreyANCisNCisjaWYgZGVmaW5lZCAoTVBSRUFMX0hBVkVfQ1VTVE9NX01QRlJfTUFMTE9DKQ0KKwlzZXRfY3VzdG9tX21hbGxvYygpOw0KKyNlbmRpZg0KKw0KKwltcGZyX2luaXQyKG1wLGRlZmF1bHRfcHJlYyk7IA0KKwltcGZyX3NldF91aShtcCwwLGRlZmF1bHRfcm5kKTsNCisNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK21wcmVhbDo6bXByZWFsKGNvbnN0IG1wcmVhbCYgdSkgDQorew0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9DVVNUT01fTVBGUl9NQUxMT0MpDQorCXNldF9jdXN0b21fbWFsbG9jKCk7DQorI2VuZGlmDQorDQorCW1wZnJfaW5pdDIobXAsbXBmcl9nZXRfcHJlYyh1Lm1wKSk7DQorCW1wZnJfc2V0KG1wLHUubXAsZGVmYXVsdF9ybmQpOw0KKw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQorbXByZWFsOjptcHJlYWwoY29uc3QgbXBmcl90IHUpDQorew0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9DVVNUT01fTVBGUl9NQUxMT0MpDQorCXNldF9jdXN0b21fbWFsbG9jKCk7DQorI2VuZGlmDQorDQorCW1wZnJfaW5pdDIobXAsbXBmcl9nZXRfcHJlYyh1KSk7DQorCW1wZnJfc2V0KG1wLHUsZGVmYXVsdF9ybmQpOw0KKwkNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK21wcmVhbDo6bXByZWFsKGNvbnN0IG1wZl90IHUpDQorew0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9DVVNUT01fTVBGUl9NQUxMT0MpDQorCXNldF9jdXN0b21fbWFsbG9jKCk7DQorI2VuZGlmDQorDQorCW1wZnJfaW5pdDIobXAsKG1wX3ByZWNfdCkgbXBmX2dldF9wcmVjKHUpKTsgLy8gKGdtcDogbXBfYml0Y250X3QpIHVuc2lnbmVkIGxvbmcgLT4gbG9uZyAobXBmcjogbXBfcHJlY190KQ0KKwltcGZyX3NldF9mKG1wLHUsZGVmYXVsdF9ybmQpOw0KKw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQorbXByZWFsOjptcHJlYWwoY29uc3QgbXB6X3QgdSwgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IG1vZGUpDQorew0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9DVVNUT01fTVBGUl9NQUxMT0MpDQorCXNldF9jdXN0b21fbWFsbG9jKCk7DQorI2VuZGlmDQorDQorCW1wZnJfaW5pdDIobXAscHJlYyk7DQorCW1wZnJfc2V0X3oobXAsdSxtb2RlKTsNCisJDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCittcHJlYWw6Om1wcmVhbChjb25zdCBtcHFfdCB1LCBtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3QgbW9kZSkNCit7DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0NVU1RPTV9NUEZSX01BTExPQykNCisJc2V0X2N1c3RvbV9tYWxsb2MoKTsNCisjZW5kaWYNCisNCisJbXBmcl9pbml0MihtcCxwcmVjKTsNCisJbXBmcl9zZXRfcShtcCx1LG1vZGUpOw0KKwkNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK21wcmVhbDo6bXByZWFsKGNvbnN0IGRvdWJsZSB1LCBtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3QgbW9kZSkNCit7DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0NVU1RPTV9NUEZSX01BTExPQykNCisJc2V0X2N1c3RvbV9tYWxsb2MoKTsNCisjZW5kaWYNCisNCisgICAgaWYoZG91YmxlX2JpdHMgPT0gLTEgfHwgZml0c19pbl9iaXRzKHUsIGRvdWJsZV9iaXRzKSkNCisgICAgew0KKyAgICAJbXBmcl9pbml0MihtcCxwcmVjKTsNCisJICAgIG1wZnJfc2V0X2QobXAsdSxtb2RlKTsNCisJCQ0KKwkJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgICAgdGhyb3cgY29udmVyc2lvbl9vdmVyZmxvdygpOw0KK30NCisNCittcHJlYWw6Om1wcmVhbChjb25zdCBsb25nIGRvdWJsZSB1LCBtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3QgbW9kZSkNCit7IA0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9DVVNUT01fTVBGUl9NQUxMT0MpDQorCXNldF9jdXN0b21fbWFsbG9jKCk7DQorI2VuZGlmDQorDQorICAgIG1wZnJfaW5pdDIobXAscHJlYyk7DQorCW1wZnJfc2V0X2xkKG1wLHUsbW9kZSk7DQorCQ0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQorbXByZWFsOjptcHJlYWwoY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdSwgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IG1vZGUpDQoreyANCisNCisjaWYgZGVmaW5lZCAoTVBSRUFMX0hBVkVfQ1VTVE9NX01QRlJfTUFMTE9DKQ0KKwlzZXRfY3VzdG9tX21hbGxvYygpOw0KKyNlbmRpZg0KKw0KKwltcGZyX2luaXQyKG1wLHByZWMpOw0KKwltcGZyX3NldF91aShtcCx1LG1vZGUpOw0KKwkNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK21wcmVhbDo6bXByZWFsKGNvbnN0IHVuc2lnbmVkIGludCB1LCBtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3QgbW9kZSkNCit7IA0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9DVVNUT01fTVBGUl9NQUxMT0MpDQorCXNldF9jdXN0b21fbWFsbG9jKCk7DQorI2VuZGlmDQorDQorCW1wZnJfaW5pdDIobXAscHJlYyk7DQorCW1wZnJfc2V0X3VpKG1wLHUsbW9kZSk7DQorDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCittcHJlYWw6Om1wcmVhbChjb25zdCBsb25nIGludCB1LCBtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3QgbW9kZSkNCit7IA0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9DVVNUT01fTVBGUl9NQUxMT0MpDQorCXNldF9jdXN0b21fbWFsbG9jKCk7DQorI2VuZGlmDQorDQorCW1wZnJfaW5pdDIobXAscHJlYyk7DQorCW1wZnJfc2V0X3NpKG1wLHUsbW9kZSk7DQorDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCittcHJlYWw6Om1wcmVhbChjb25zdCBpbnQgdSwgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IG1vZGUpDQoreyANCisNCisjaWYgZGVmaW5lZCAoTVBSRUFMX0hBVkVfQ1VTVE9NX01QRlJfTUFMTE9DKQ0KKwlzZXRfY3VzdG9tX21hbGxvYygpOw0KKyNlbmRpZg0KKw0KKwltcGZyX2luaXQyKG1wLHByZWMpOw0KKwltcGZyX3NldF9zaShtcCx1LG1vZGUpOw0KKw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0lOVDY0X1NVUFBPUlQpDQorbXByZWFsOjptcHJlYWwoY29uc3QgdWludDY0X3QgdSwgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IG1vZGUpDQorew0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9DVVNUT01fTVBGUl9NQUxMT0MpDQorCXNldF9jdXN0b21fbWFsbG9jKCk7DQorI2VuZGlmDQorDQorCW1wZnJfaW5pdDIobXAscHJlYyk7DQorCW1wZnJfc2V0X3VqKG1wLCB1LCBtb2RlKTsgDQorDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCittcHJlYWw6Om1wcmVhbChjb25zdCBpbnQ2NF90IHUsIG1wX3ByZWNfdCBwcmVjLCBtcF9ybmRfdCBtb2RlKQ0KK3sNCisNCisjaWYgZGVmaW5lZCAoTVBSRUFMX0hBVkVfQ1VTVE9NX01QRlJfTUFMTE9DKQ0KKwlzZXRfY3VzdG9tX21hbGxvYygpOw0KKyNlbmRpZg0KKw0KKwltcGZyX2luaXQyKG1wLHByZWMpOw0KKwltcGZyX3NldF9zaihtcCwgdSwgbW9kZSk7IA0KKwkNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKyNlbmRpZg0KKw0KK21wcmVhbDo6bXByZWFsKGNvbnN0IGNoYXIqIHMsIG1wX3ByZWNfdCBwcmVjLCBpbnQgYmFzZSwgbXBfcm5kX3QgbW9kZSkNCit7DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0NVU1RPTV9NUEZSX01BTExPQykNCisJc2V0X2N1c3RvbV9tYWxsb2MoKTsNCisjZW5kaWYNCisNCisJbXBmcl9pbml0MihtcCxwcmVjKTsNCisJbXBmcl9zZXRfc3RyKG1wLCBzLCBiYXNlLCBtb2RlKTsgDQorDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KK30NCisNCittcHJlYWw6Om1wcmVhbChjb25zdCBzdGQ6OnN0cmluZyYgcywgbXBfcHJlY190IHByZWMsIGludCBiYXNlLCBtcF9ybmRfdCBtb2RlKQ0KK3sNCisNCisjaWYgZGVmaW5lZCAoTVBSRUFMX0hBVkVfQ1VTVE9NX01QRlJfTUFMTE9DKQ0KKwlzZXRfY3VzdG9tX21hbGxvYygpOw0KKyNlbmRpZg0KKw0KKwltcGZyX2luaXQyKG1wLHByZWMpOw0KKwltcGZyX3NldF9zdHIobXAsIHMuY19zdHIoKSwgYmFzZSwgbW9kZSk7IA0KKw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCit9DQorDQorbXByZWFsOjp+bXByZWFsKCkgDQoreyANCisJbXBmcl9jbGVhcihtcCk7DQorfSAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKy8vIE9wZXJhdG9ycyAtIEFzc2lnbm1lbnQNCittcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I9KGNvbnN0IGNoYXIqIHMpDQorew0KKwltcGZyX3QgdDsNCisNCisjaWYgZGVmaW5lZCAoTVBSRUFMX0hBVkVfQ1VTVE9NX01QRlJfTUFMTE9DKQ0KKwlzZXRfY3VzdG9tX21hbGxvYygpOw0KKyNlbmRpZg0KKw0KKwlpZigwPT1tcGZyX2luaXRfc2V0X3N0cih0LHMsZGVmYXVsdF9iYXNlLGRlZmF1bHRfcm5kKSkNCisJew0KKwkJLy8gV2Ugd2lsbCByZXdyaXRlIG1wIGFueXdheSwgc28gZmxhc2ggaXQgYW5kIHJlc2l6ZQ0KKwkJbXBmcl9zZXRfcHJlYyhtcCxtcGZyX2dldF9wcmVjKHQpKTsgDQorCQltcGZyX3NldChtcCx0LG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwkJbXBmcl9jbGVhcih0KTsNCisNCisJCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKw0KKwl9ZWxzZXsNCisJCW1wZnJfY2xlYXIodCk7DQorCX0NCisNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitjb25zdCBtcHJlYWwgZm1hIChjb25zdCBtcHJlYWwmIHYxLCBjb25zdCBtcHJlYWwmIHYyLCBjb25zdCBtcHJlYWwmIHYzLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCBhOw0KKwltcF9wcmVjX3QgcDEsIHAyLCBwMzsNCisNCisJcDEgPSB2MS5nZXRfcHJlYygpOyANCisJcDIgPSB2Mi5nZXRfcHJlYygpOyANCisJcDMgPSB2My5nZXRfcHJlYygpOyANCisNCisJYS5zZXRfcHJlYyhwMz5wMj8ocDM+cDE/cDM6cDEpOihwMj5wMT9wMjpwMSkpOw0KKw0KKwltcGZyX2ZtYShhLm1wLHYxLm1wLHYyLm1wLHYzLm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIGE7DQorfQ0KKw0KK2NvbnN0IG1wcmVhbCBmbXMgKGNvbnN0IG1wcmVhbCYgdjEsIGNvbnN0IG1wcmVhbCYgdjIsIGNvbnN0IG1wcmVhbCYgdjMsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIGE7DQorCW1wX3ByZWNfdCBwMSwgcDIsIHAzOw0KKw0KKwlwMSA9IHYxLmdldF9wcmVjKCk7IA0KKwlwMiA9IHYyLmdldF9wcmVjKCk7IA0KKwlwMyA9IHYzLmdldF9wcmVjKCk7IA0KKw0KKwlhLnNldF9wcmVjKHAzPnAyPyhwMz5wMT9wMzpwMSk6KHAyPnAxP3AyOnAxKSk7DQorDQorCW1wZnJfZm1zKGEubXAsdjEubXAsdjIubXAsdjMubXAscm5kX21vZGUpOw0KKwlyZXR1cm4gYTsNCit9DQorDQorY29uc3QgbXByZWFsIGFnbSAoY29uc3QgbXByZWFsJiB2MSwgY29uc3QgbXByZWFsJiB2MiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgYTsNCisJbXBfcHJlY190IHAxLCBwMjsNCisNCisJcDEgPSB2MS5nZXRfcHJlYygpOyANCisJcDIgPSB2Mi5nZXRfcHJlYygpOyANCisNCisJYS5zZXRfcHJlYyhwMT5wMj9wMTpwMik7DQorDQorCW1wZnJfYWdtKGEubXAsIHYxLm1wLCB2Mi5tcCwgcm5kX21vZGUpOw0KKw0KKwlyZXR1cm4gYTsNCit9DQorDQorY29uc3QgbXByZWFsIHN1bSAoY29uc3QgbXByZWFsIHRhYltdLCB1bnNpZ25lZCBsb25nIGludCBuLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4Ow0KKwltcGZyX3B0ciogdDsNCisJdW5zaWduZWQgbG9uZyBpbnQgaTsNCisNCisJdCA9IG5ldyBtcGZyX3B0cltuXTsNCisJZm9yIChpPTA7aTxuO2krKykgdFtpXSA9IChtcGZyX3B0cil0YWJbaV0ubXA7DQorCW1wZnJfc3VtKHgubXAsdCxuLHJuZF9tb2RlKTsNCisJZGVsZXRlW10gdDsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2NvbnN0IG1wcmVhbCByZW1xdW8gKGxvbmcqIHEsIGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCBhOw0KKwltcF9wcmVjX3QgeXAsIHhwOw0KKw0KKwl5cCA9IHkuZ2V0X3ByZWMoKTsgDQorCXhwID0geC5nZXRfcHJlYygpOyANCisNCisJYS5zZXRfcHJlYyh5cD54cD95cDp4cCk7DQorDQorCW1wZnJfcmVtcXVvKGEubXAscSwgeC5tcCwgeS5tcCwgcm5kX21vZGUpOw0KKw0KKwlyZXR1cm4gYTsNCit9DQorDQordGVtcGxhdGUgPGNsYXNzIFQ+DQorc3RkOjpzdHJpbmcgdG9TdHJpbmcoVCB0LCBzdGQ6Omlvc19iYXNlICYgKCpmKShzdGQ6Omlvc19iYXNlJikpDQorew0KKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOw0KKwlvc3MgPDwgZiA8PCB0Ow0KKwlyZXR1cm4gb3NzLnN0cigpOw0KK30NCisNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisNCitzdGQ6OnN0cmluZyBtcHJlYWw6OnRvU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmb3JtYXQpIGNvbnN0DQorew0KKwljaGFyICpzID0gTlVMTDsNCisJc3RyaW5nIG91dDsNCisNCisJaWYoICFmb3JtYXQuZW1wdHkoKSApDQorCXsNCisJCWlmKCEobXBmcl9hc3ByaW50Zigmcyxmb3JtYXQuY19zdHIoKSxtcCkgPCAwKSkNCisJCXsNCisJCQlvdXQgPSBzdGQ6OnN0cmluZyhzKTsNCisNCisJCQltcGZyX2ZyZWVfc3RyKHMpOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiBvdXQ7DQorfQ0KKw0KKyNlbmRpZg0KKw0KK3N0ZDo6c3RyaW5nIG1wcmVhbDo6dG9TdHJpbmcoaW50IG4sIGludCBiLCBtcF9ybmRfdCBtb2RlKSBjb25zdA0KK3sNCisgICh2b2lkKWI7DQorICAodm9pZCltb2RlOw0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMiw0LDApKQ0KKw0KKwkvLyBVc2UgTVBGUiBuYXRpdmUgZnVuY3Rpb24gZm9yIG91dHB1dA0KKwljaGFyIGZvcm1hdFsxMjhdOw0KKwlpbnQgZGlnaXRzOw0KKw0KKwlkaWdpdHMgPSBuID4gMCA/IG4gOiBiaXRzMmRpZ2l0cyhtcGZyX2dldF9wcmVjKG1wKSk7DQorDQorCXNwcmludGYoZm9ybWF0LCIlJS4lZFJOZyIsZGlnaXRzKTsJCS8vIERlZmF1bHQgZm9ybWF0DQorDQorCXJldHVybiB0b1N0cmluZyhzdGQ6OnN0cmluZyhmb3JtYXQpKTsNCisNCisjZWxzZQ0KKw0KKwljaGFyICpzLCAqbnMgPSBOVUxMOyANCisJc2l6ZV90IHNsZW4sIG5zbGVuOw0KKwltcF9leHBfdCBleHA7DQorCXN0cmluZyBvdXQ7DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0NVU1RPTV9NUEZSX01BTExPQykNCisJc2V0X2N1c3RvbV9tYWxsb2MoKTsNCisjZW5kaWYNCisNCisJaWYobXBmcl9pbmZfcChtcCkpDQorCXsgDQorCQlpZihtcGZyX3NnbihtcCk+MCkgcmV0dXJuICIrSW5mIjsNCisJCWVsc2UJCQkgICByZXR1cm4gIi1JbmYiOw0KKwl9DQorDQorCWlmKG1wZnJfemVyb19wKG1wKSkgcmV0dXJuICIwIjsNCisJaWYobXBmcl9uYW5fcChtcCkpICByZXR1cm4gIk5hTiI7DQorDQorCXMgID0gbXBmcl9nZXRfc3RyKE5VTEwsJmV4cCxiLDAsbXAsbW9kZSk7DQorCW5zID0gbXBmcl9nZXRfc3RyKE5VTEwsJmV4cCxiLG4sbXAsbW9kZSk7DQorDQorCWlmKHMhPU5VTEwgJiYgbnMhPU5VTEwpDQorCXsNCisJCXNsZW4gID0gc3RybGVuKHMpOw0KKwkJbnNsZW4gPSBzdHJsZW4obnMpOw0KKwkJaWYobnNsZW48PXNsZW4pIA0KKwkJew0KKwkJCW1wZnJfZnJlZV9zdHIocyk7DQorCQkJcyA9IG5zOw0KKwkJCXNsZW4gPSBuc2xlbjsNCisJCX0NCisJCWVsc2Ugew0KKwkJCW1wZnJfZnJlZV9zdHIobnMpOw0KKwkJfQ0KKw0KKwkJLy8gTWFrZSBodW1hbiBleWUtZnJpZW5kbHkgZm9ybWF0dGluZyBpZiBwb3NzaWJsZQ0KKwkJaWYgKGV4cD4wICYmIHN0YXRpY19jYXN0PHNpemVfdD4oZXhwKTxzbGVuKQ0KKwkJew0KKwkJCWlmKHNbMF09PSctJykNCisJCQl7DQorCQkJCS8vIFJlbW92ZSB6ZXJvcyBzdGFydGluZyBmcm9tIHJpZ2h0IGVuZA0KKwkJCQljaGFyKiBwdHIgPSBzK3NsZW4tMTsNCisJCQkJd2hpbGUgKCpwdHI9PScwJyAmJiBwdHI+cytleHApIHB0ci0tOyANCisNCisJCQkJaWYocHRyPT1zK2V4cCkgb3V0ID0gc3RyaW5nKHMsZXhwKzEpOw0KKwkJCQllbHNlCQkgICBvdXQgPSBzdHJpbmcocyxleHArMSkrJy4nK3N0cmluZyhzK2V4cCsxLHB0ci0ocytleHArMSkrMSk7DQorDQorCQkJCS8vb3V0ID0gc3RyaW5nKHMsZXhwKzEpKycuJytzdHJpbmcocytleHArMSk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCS8vIFJlbW92ZSB6ZXJvcyBzdGFydGluZyBmcm9tIHJpZ2h0IGVuZA0KKwkJCQljaGFyKiBwdHIgPSBzK3NsZW4tMTsNCisJCQkJd2hpbGUgKCpwdHI9PScwJyAmJiBwdHI+cytleHAtMSkgcHRyLS07IA0KKw0KKwkJCQlpZihwdHI9PXMrZXhwLTEpIG91dCA9IHN0cmluZyhzLGV4cCk7DQorCQkJCWVsc2UJCSAgICAgb3V0ID0gc3RyaW5nKHMsZXhwKSsnLicrc3RyaW5nKHMrZXhwLHB0ci0ocytleHApKzEpOw0KKw0KKwkJCQkvL291dCA9IHN0cmluZyhzLGV4cCkrJy4nK3N0cmluZyhzK2V4cCk7DQorCQkJfQ0KKw0KKwkJfWVsc2V7IC8vIGV4cDwwIHx8IGV4cD5zbGVuDQorCQkJaWYoc1swXT09Jy0nKQ0KKwkJCXsNCisJCQkJLy8gUmVtb3ZlIHplcm9zIHN0YXJ0aW5nIGZyb20gcmlnaHQgZW5kDQorCQkJCWNoYXIqIHB0ciA9IHMrc2xlbi0xOw0KKwkJCQl3aGlsZSAoKnB0cj09JzAnICYmIHB0cj5zKzEpIHB0ci0tOyANCisNCisJCQkJaWYocHRyPT1zKzEpIG91dCA9IHN0cmluZyhzLDIpOw0KKwkJCQllbHNlCQkgb3V0ID0gc3RyaW5nKHMsMikrJy4nK3N0cmluZyhzKzIscHRyLShzKzIpKzEpOw0KKw0KKwkJCQkvL291dCA9IHN0cmluZyhzLDIpKycuJytzdHJpbmcocysyKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJLy8gUmVtb3ZlIHplcm9zIHN0YXJ0aW5nIGZyb20gcmlnaHQgZW5kDQorCQkJCWNoYXIqIHB0ciA9IHMrc2xlbi0xOw0KKwkJCQl3aGlsZSAoKnB0cj09JzAnICYmIHB0cj5zKSBwdHItLTsgDQorDQorCQkJCWlmKHB0cj09cykgb3V0ID0gc3RyaW5nKHMsMSk7DQorCQkJCWVsc2UJICAgb3V0ID0gc3RyaW5nKHMsMSkrJy4nK3N0cmluZyhzKzEscHRyLShzKzEpKzEpOw0KKw0KKwkJCQkvL291dCA9IHN0cmluZyhzLDEpKycuJytzdHJpbmcocysxKTsNCisJCQl9DQorDQorCQkJLy8gTWFrZSBmaW5hbCBzdHJpbmcNCisJCQlpZigtLWV4cCkNCisJCQl7DQorCQkJCWlmKGV4cD4wKSBvdXQgKz0gImUrIittcGZyOjp0b1N0cmluZzxtcF9leHBfdD4oZXhwLHN0ZDo6ZGVjKTsNCisJCQkJZWxzZSAJICBvdXQgKz0gImUiK21wZnI6OnRvU3RyaW5nPG1wX2V4cF90PihleHAsc3RkOjpkZWMpOw0KKwkJCX0NCisJCX0NCisNCisJCW1wZnJfZnJlZV9zdHIocyk7DQorCQlyZXR1cm4gb3V0Ow0KKwl9ZWxzZXsNCisJCXJldHVybiAiY29udmVyc2lvbiBlcnJvciEiOw0KKwl9DQorI2VuZGlmDQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gSS9PDQorb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgY29uc3QgbXByZWFsJiB2KQ0KK3sNCisJcmV0dXJuIG9zPDx2LnRvU3RyaW5nKHN0YXRpY19jYXN0PGludD4ob3MucHJlY2lzaW9uKCkpKTsNCit9DQorDQoraXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtICZpcywgbXByZWFsJiB2KQ0KK3sNCisJc3RyaW5nIHRtcDsNCisJaXMgPj4gdG1wOw0KKwltcGZyX3NldF9zdHIodi5tcCwgdG1wLmNfc3RyKCksbXByZWFsOjpkZWZhdWx0X2Jhc2UsbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCXJldHVybiBpczsNCit9DQorDQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0NVU1RPTV9NUEZSX01BTExPQykNCisJLy8gT3B0aW1pemVkIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24vKHJlLSlkZWFsbG9jYXRpb24uDQorCXZvaWQgKiBtcHJlYWw6Om1wcmVhbF9hbGxvY2F0ZShzaXplX3QgYWxsb2Nfc2l6ZSkNCisJew0KKwkJcmV0dXJuKGRsbWFsbG9jKGFsbG9jX3NpemUpKTsNCisJfQ0KKw0KKwl2b2lkICogbXByZWFsOjptcHJlYWxfcmVhbGxvY2F0ZSh2b2lkICpwdHIsIHNpemVfdCBvbGRfc2l6ZSwgc2l6ZV90IG5ld19zaXplKQ0KKwl7DQorCQlyZXR1cm4oZGxyZWFsbG9jKHB0cixuZXdfc2l6ZSkpOw0KKwl9DQorDQorCXZvaWQgbXByZWFsOjptcHJlYWxfZnJlZSh2b2lkICpwdHIsIHNpemVfdCBzaXplKQ0KKwl7DQorCQlkbGZyZWUocHRyKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBtcHJlYWw6OnNldF9jdXN0b21fbWFsbG9jKHZvaWQpDQorCXsNCisJCWlmKCFpc19jdXN0b21fbWFsbG9jKQ0KKwkJew0KKwkJCW1wX3NldF9tZW1vcnlfZnVuY3Rpb25zKG1wcmVhbF9hbGxvY2F0ZSxtcHJlYWxfcmVhbGxvY2F0ZSxtcHJlYWxfZnJlZSk7DQorCQkJaXNfY3VzdG9tX21hbGxvYyA9IHRydWU7DQorCQl9DQorCX0NCisjZW5kaWYNCisNCit9DQorDQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9tcHJlYWwvbXByZWFsLmggYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbC9tcHJlYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjQwYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9tcHJlYWwvbXByZWFsLmgKQEAgLTAsMCArMSwyNzM1IEBACisvKg0KKwlNdWx0aS1wcmVjaXNpb24gcmVhbCBudW1iZXIgY2xhc3MuIEMrKyBpbnRlcmZhY2UgZm9yIE1QRlIgbGlicmFyeS4NCisJUHJvamVjdCBob21lcGFnZTogaHR0cDovL3d3dy5ob2xvYm9yb2Rrby5jb20vcGF2ZWwvDQorCUNvbnRhY3QgZS1tYWlsOiAgIHBhdmVsQGhvbG9ib3JvZGtvLmNvbQ0KKw0KKwlDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMiBQYXZlbCBIb2xvYm9yb2Rrbw0KKw0KKwlDb3JlIERldmVsb3BlcnM6IA0KKwlQYXZlbCBIb2xvYm9yb2RrbywgRG1pdHJpeSBHdWJhbm92LCBLb25zdGFudGluIEhvbG9ib3JvZGtvLiANCisNCisJQ29udHJpYnV0b3JzOg0KKwlCcmlhbiBHbGFkbWFuLCBIZWxtdXQgSmFyYXVzY2gsIEZva2tvIEJlZWtob2YsIFVscmljaCBNdXR6ZSwgDQorCUhlaW56IHZhbiBTYWFuZW4sIFBlcmUgQ29uc3RhbnMsIFBldGVyIHZhbiBIb29mLCBHYWVsIEd1ZW5uZWJhdWQsIA0KKwlUc2FpIENoaWEgQ2hlbmcsIEFsZXhlaSBadWJhbm92Lg0KKw0KKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCisJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYw0KKwlMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCisJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQorDQorCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKwlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQ0KKwlMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKw0KKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQorCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisJRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBDQorDQorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorCW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KKwlhcmUgbWV0Og0KKwkNCisJMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKwkNCisJMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQ0KKwlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KKwkNCisJMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMNCisJZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorDQorCVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQNCisJQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQorCUlNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorCUFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFDQorCUZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMDQorCURBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTDQorCU9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQ0KKwlIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVA0KKwlMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZDQorCU9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YNCisJU1VDSCBEQU1BR0UuDQorKi8NCisNCisjaWZuZGVmIF9fTVBSRUFMX0hfXw0KKyNkZWZpbmUgX19NUFJFQUxfSF9fDQorDQorI2luY2x1ZGUgPHN0cmluZz4NCisjaW5jbHVkZSA8aW9zdHJlYW0+DQorI2luY2x1ZGUgPHNzdHJlYW0+DQorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4NCisjaW5jbHVkZSA8Y2Zsb2F0Pg0KKyNpbmNsdWRlIDxjbWF0aD4NCisNCisvLyBPcHRpb25zDQorI2RlZmluZSBNUFJFQUxfSEFWRV9JTlQ2NF9TVVBQT1JUCQkJCQkJCS8vIGludDY0X3Qgc3VwcG9ydDogYXZhaWxhYmxlIG9ubHkgZm9yIE1TVkMgMjAxMCAmIEdDQyANCisjZGVmaW5lIE1QUkVBTF9IQVZFX01TVkNfREVCVUdWSUVXCQkJCQkJCS8vIEVuYWJsZSBEZWJ1Z2dlciBWaXN1YWxpemVyICh2YWxpZCBvbmx5IGZvciBNU1ZDIGluICJEZWJ1ZyIgYnVpbGRzKQ0KKw0KKy8vIERldGVjdCBjb21waWxlciB1c2luZyBzaWduYXR1cmVzIGZyb20gaHR0cDovL3ByZWRlZi5zb3VyY2Vmb3JnZS5uZXQvDQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikNCisJI2RlZmluZSBJc0luZih4KSBpc2luZih4KQkJCQkJCQkJLy8gSW50ZWwgSUNDIGNvbXBpbGVyIG9uIExpbnV4IA0KKw0KKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCQkJCQkJCQkJCS8vIE1pY3Jvc29mdCBWaXN1YWwgQysrIA0KKwkjZGVmaW5lIElzSW5mKHgpICghX2Zpbml0ZSh4KSkJCQkJCQkJDQorDQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykNCisJI2RlZmluZSBJc0luZih4KSBzdGQ6OmlzaW5mKHgpCQkJCQkJCS8vIEdOVSBDL0MrKyANCisNCisjZWxzZQ0KKwkjZGVmaW5lIElzSW5mKHgpIHN0ZDo6aXNpbmYoeCkJCQkJCQkJLy8gVW5rbm93biBjb21waWxlciwganVzdCBob3BlIGZvciBDOTkgY29uZm9ybWFuY2UNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChNUFJFQUxfSEFWRV9JTlQ2NF9TVVBQT1JUKQ0KKwkNCisJI2RlZmluZSBNUEZSX1VTRV9JTlRNQVhfVAkJCQkJCQkJLy8gc2hvdWxkIGJlIGRlZmluZWQgYmVmb3JlIG1wZnIuaA0KKw0KKwkjaWYgZGVmaW5lZChfTVNDX1ZFUikgCQkJCQkJCQkJLy8gPHN0ZGludC5oPiBpcyBhdmFpbGFibGUgb25seSBpbiBtc3ZjMjAxMCENCisJCSNpZiAoX01TQ19WRVIgPj0gMTYwMCkJCQkJCQkJCQ0KKwkJCSNpbmNsdWRlIDxzdGRpbnQuaD4JCQkJCQkJCQ0KKwkJI2Vsc2UJCQkJCQkJCQkJCQkvLyBNUEZSIHJlbGllcyBvbiBpbnRtYXhfdCB3aGljaCBpcyBhdmFpbGFibGUgb25seSBpbiBtc3ZjMjAxMA0KKwkJCSN1bmRlZiBNUFJFQUxfSEFWRV9JTlQ2NF9TVVBQT1JUCQkJCS8vIEJlc2lkZXMsIE1QRlIgLSBNUElSIGhhdmUgdG8gYmUgY29tcGlsZWQgd2l0aCBtc3ZjMjAxMA0KKwkJCSN1bmRlZiBNUEZSX1VTRV9JTlRNQVhfVAkJCQkJCS8vIFNpbmNlIHdlIGNhbm5vdCBkZXRlY3QgdGhpcywgZGlzYWJsZSB4NjQgYnkgZGVmYXVsdA0KKwkJCQkJCQkJCQkJCQkJCS8vIFNvbWVvbmUgc2hvdWxkIGNoYW5nZSB0aGlzIG1hbnVhbGx5IGlmIG5lZWRlZC4NCisJCSNlbmRpZg0KKwkjZW5kaWYNCisJDQorCSNpZiBkZWZpbmVkIChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX01JTkdXNjRfXykNCisJCQkjaW5jbHVkZSA8c3RkaW50Lmg+CQkJCQkJCQkvLyBlcXVpdmFsZW50IHRvIG1zdmMyMDEwDQorCSNlbGlmIGRlZmluZWQgKF9fR05VQ19fKQ0KKwkJI2lmIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKF9fYW1kNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NCkNCisJCQkjdW5kZWYgTVBSRUFMX0hBVkVfSU5UNjRfU1VQUE9SVAkJCQkvLyByZW1vdmUgYWxsIHNoYW1hbiBkYW5jZXMgZm9yIHg2NCBidWlsZHMgc2luY2UNCisJCQkjdW5kZWYgTVBGUl9VU0VfSU5UTUFYX1QJCQkJCQkvLyBHQ0MgYWxyZWFkeSBzdXBwb3J0IHg2NCBhcyBvZiAibG9uZyBpbnQiIGlzIDY0LWJpdCBpbnRlZ2VyLCBub3RoaW5nIGxlZnQgdG8gZG8NCisJCSNlbHNlDQorCQkJI2luY2x1ZGUgPHN0ZGludC5oPgkJCQkJCQkJLy8gdXNlIGludDY0X3QsIHVpbnQ2NF90IG90aGVyd2lzZS4NCisJCSNlbmRpZg0KKwkjZW5kaWYNCisNCisjZW5kaWYgDQorDQorI2lmIGRlZmluZWQoTVBSRUFMX0hBVkVfTVNWQ19ERUJVR1ZJRVcpICYmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0RFQlVHKQ0KKyNkZWZpbmUgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREUgCQlEZWJ1Z1ZpZXcgPSB0b1N0cmluZygpDQorCSNkZWZpbmUgTVBSRUFMX01TVkNfREVCVUdWSUVXX0RBVEEgCXN0ZDo6c3RyaW5nIERlYnVnVmlldw0KKyNlbHNlDQorCSNkZWZpbmUgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREUgDQorCSNkZWZpbmUgTVBSRUFMX01TVkNfREVCVUdWSUVXX0RBVEEgDQorI2VuZGlmDQorDQorI2luY2x1ZGUgPG1wZnIuaD4NCisNCisjaWYgKE1QRlJfVkVSU0lPTiA8IE1QRlJfVkVSU0lPTl9OVU0oMywwLDApKQ0KKwkjaW5jbHVkZSA8Y3N0ZGxpYj4JCQkJCQkJCQkJLy8gbmVlZGVkIGZvciByYW5kb20oKQ0KKyNlbmRpZg0KKw0KK25hbWVzcGFjZSBtcGZyIHsNCisNCitjbGFzcyBtcHJlYWwgew0KK3ByaXZhdGU6DQorCW1wZnJfdCBtcDsNCisNCitwdWJsaWM6DQorCXN0YXRpYyBtcF9ybmRfdAkJCWRlZmF1bHRfcm5kOwkNCisJc3RhdGljIG1wX3ByZWNfdAkJZGVmYXVsdF9wcmVjOwkNCisJc3RhdGljIGludAkJCQlkZWZhdWx0X2Jhc2U7DQorCXN0YXRpYyBpbnQJCQkJZG91YmxlX2JpdHM7CQkNCisgICAgDQorcHVibGljOg0KKwkvLyBDb25zdHJ1Y3RvcnMgJiYgdHlwZSBjb252ZXJzaW9uDQorCW1wcmVhbCgpOw0KKwltcHJlYWwoY29uc3QgbXByZWFsJiB1KTsNCisJbXByZWFsKGNvbnN0IG1wZnJfdCB1KTsJDQorCW1wcmVhbChjb25zdCBtcGZfdCB1KTsJDQorCW1wcmVhbChjb25zdCBtcHpfdCB1LCBtcF9wcmVjX3QgcHJlYyA9IGRlZmF1bHRfcHJlYywgbXBfcm5kX3QgbW9kZSA9IGRlZmF1bHRfcm5kKTsJDQorCW1wcmVhbChjb25zdCBtcHFfdCB1LCBtcF9wcmVjX3QgcHJlYyA9IGRlZmF1bHRfcHJlYywgbXBfcm5kX3QgbW9kZSA9IGRlZmF1bHRfcm5kKTsJDQorCW1wcmVhbChjb25zdCBkb3VibGUgdSwgbXBfcHJlY190IHByZWMgPSBkZWZhdWx0X3ByZWMsIG1wX3JuZF90IG1vZGUgPSBkZWZhdWx0X3JuZCk7DQorCW1wcmVhbChjb25zdCBsb25nIGRvdWJsZSB1LCBtcF9wcmVjX3QgcHJlYyA9IGRlZmF1bHRfcHJlYywgbXBfcm5kX3QgbW9kZSA9IGRlZmF1bHRfcm5kKTsNCisJbXByZWFsKGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IHUsIG1wX3ByZWNfdCBwcmVjID0gZGVmYXVsdF9wcmVjLCBtcF9ybmRfdCBtb2RlID0gZGVmYXVsdF9ybmQpOw0KKwltcHJlYWwoY29uc3QgdW5zaWduZWQgaW50IHUsIG1wX3ByZWNfdCBwcmVjID0gZGVmYXVsdF9wcmVjLCBtcF9ybmRfdCBtb2RlID0gZGVmYXVsdF9ybmQpOw0KKwltcHJlYWwoY29uc3QgbG9uZyBpbnQgdSwgbXBfcHJlY190IHByZWMgPSBkZWZhdWx0X3ByZWMsIG1wX3JuZF90IG1vZGUgPSBkZWZhdWx0X3JuZCk7DQorCW1wcmVhbChjb25zdCBpbnQgdSwgbXBfcHJlY190IHByZWMgPSBkZWZhdWx0X3ByZWMsIG1wX3JuZF90IG1vZGUgPSBkZWZhdWx0X3JuZCk7DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0lOVDY0X1NVUFBPUlQpDQorCW1wcmVhbChjb25zdCB1aW50NjRfdCB1LCBtcF9wcmVjX3QgcHJlYyA9IGRlZmF1bHRfcHJlYywgIG1wX3JuZF90IG1vZGUgPSBkZWZhdWx0X3JuZCk7DQorCW1wcmVhbChjb25zdCBpbnQ2NF90IHUsIG1wX3ByZWNfdCBwcmVjID0gZGVmYXVsdF9wcmVjLCAgbXBfcm5kX3QgbW9kZSA9IGRlZmF1bHRfcm5kKTsNCisjZW5kaWYNCisNCisJbXByZWFsKGNvbnN0IGNoYXIqIHMsIG1wX3ByZWNfdCBwcmVjID0gZGVmYXVsdF9wcmVjLCBpbnQgYmFzZSA9IGRlZmF1bHRfYmFzZSwgbXBfcm5kX3QgbW9kZSA9IGRlZmF1bHRfcm5kKTsNCisJbXByZWFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBtcF9wcmVjX3QgcHJlYyA9IGRlZmF1bHRfcHJlYywgaW50IGJhc2UgPSBkZWZhdWx0X2Jhc2UsIG1wX3JuZF90IG1vZGUgPSBkZWZhdWx0X3JuZCk7DQorDQorCX5tcHJlYWwoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJLy8gT3BlcmF0aW9ucw0KKwkvLyA9DQorCS8vICssIC0sICosIC8sICsrLCAtLSwgPDwsID4+IA0KKwkvLyAqPSwgKz0sIC09LCAvPSwNCisJLy8gPCwgPiwgPT0sIDw9LCA+PQ0KKw0KKwkvLyA9DQorCW1wcmVhbCYgb3BlcmF0b3I9KGNvbnN0IG1wcmVhbCYgdik7DQorCW1wcmVhbCYgb3BlcmF0b3I9KGNvbnN0IG1wZl90IHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yPShjb25zdCBtcHpfdCB2KTsNCisJbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgbXBxX3Qgdik7DQorCW1wcmVhbCYgb3BlcmF0b3I9KGNvbnN0IGxvbmcgZG91YmxlIHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yPShjb25zdCBkb3VibGUgdik7CQkNCisJbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdik7DQorCW1wcmVhbCYgb3BlcmF0b3I9KGNvbnN0IHVuc2lnbmVkIGludCB2KTsNCisJbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgbG9uZyBpbnQgdik7DQorCW1wcmVhbCYgb3BlcmF0b3I9KGNvbnN0IGludCB2KTsNCisJbXByZWFsJiBvcGVyYXRvcj0oY29uc3QgY2hhciogcyk7DQorDQorCS8vICsNCisJbXByZWFsJiBvcGVyYXRvcis9KGNvbnN0IG1wcmVhbCYgdik7DQorCW1wcmVhbCYgb3BlcmF0b3IrPShjb25zdCBtcGZfdCB2KTsNCisJbXByZWFsJiBvcGVyYXRvcis9KGNvbnN0IG1wel90IHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yKz0oY29uc3QgbXBxX3Qgdik7DQorCW1wcmVhbCYgb3BlcmF0b3IrPShjb25zdCBsb25nIGRvdWJsZSB1KTsNCisJbXByZWFsJiBvcGVyYXRvcis9KGNvbnN0IGRvdWJsZSB1KTsNCisJbXByZWFsJiBvcGVyYXRvcis9KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IHUpOw0KKwltcHJlYWwmIG9wZXJhdG9yKz0oY29uc3QgdW5zaWduZWQgaW50IHUpOw0KKwltcHJlYWwmIG9wZXJhdG9yKz0oY29uc3QgbG9uZyBpbnQgdSk7DQorCW1wcmVhbCYgb3BlcmF0b3IrPShjb25zdCBpbnQgdSk7DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0lOVDY0X1NVUFBPUlQpDQorCW1wcmVhbCYgb3BlcmF0b3IrPShjb25zdCBpbnQ2NF90ICB1KTsNCisJbXByZWFsJiBvcGVyYXRvcis9KGNvbnN0IHVpbnQ2NF90IHUpOw0KKwltcHJlYWwmIG9wZXJhdG9yLT0oY29uc3QgaW50NjRfdCAgdSk7DQorCW1wcmVhbCYgb3BlcmF0b3ItPShjb25zdCB1aW50NjRfdCB1KTsNCisJbXByZWFsJiBvcGVyYXRvcio9KGNvbnN0IGludDY0X3QgIHUpOw0KKwltcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgdWludDY0X3QgdSk7DQorCW1wcmVhbCYgb3BlcmF0b3IvPShjb25zdCBpbnQ2NF90ICB1KTsNCisJbXByZWFsJiBvcGVyYXRvci89KGNvbnN0IHVpbnQ2NF90IHUpOw0KKyNlbmRpZiANCisNCisJY29uc3QgbXByZWFsIG9wZXJhdG9yKygpIGNvbnN0Ow0KKwltcHJlYWwmIG9wZXJhdG9yKysgKCk7DQorCWNvbnN0IG1wcmVhbCAgb3BlcmF0b3IrKyAoaW50KTsgDQorDQorCS8vIC0NCisJbXByZWFsJiBvcGVyYXRvci09KGNvbnN0IG1wcmVhbCYgdik7DQorCW1wcmVhbCYgb3BlcmF0b3ItPShjb25zdCBtcHpfdCB2KTsNCisJbXByZWFsJiBvcGVyYXRvci09KGNvbnN0IG1wcV90IHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yLT0oY29uc3QgbG9uZyBkb3VibGUgdSk7DQorCW1wcmVhbCYgb3BlcmF0b3ItPShjb25zdCBkb3VibGUgdSk7DQorCW1wcmVhbCYgb3BlcmF0b3ItPShjb25zdCB1bnNpZ25lZCBsb25nIGludCB1KTsNCisJbXByZWFsJiBvcGVyYXRvci09KGNvbnN0IHVuc2lnbmVkIGludCB1KTsNCisJbXByZWFsJiBvcGVyYXRvci09KGNvbnN0IGxvbmcgaW50IHUpOw0KKwltcHJlYWwmIG9wZXJhdG9yLT0oY29uc3QgaW50IHUpOw0KKwljb25zdCBtcHJlYWwgb3BlcmF0b3ItKCkgY29uc3Q7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgb3BlcmF0b3ItKGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIGNvbnN0IG1wcmVhbCYgYSk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgb3BlcmF0b3ItKGNvbnN0IHVuc2lnbmVkIGludCBiLCBjb25zdCBtcHJlYWwmIGEpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCBsb25nIGludCBiLCBjb25zdCBtcHJlYWwmIGEpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCBpbnQgYiwgY29uc3QgbXByZWFsJiBhKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBvcGVyYXRvci0oY29uc3QgZG91YmxlIGIsIGNvbnN0IG1wcmVhbCYgYSk7DQorCW1wcmVhbCYgb3BlcmF0b3ItLSAoKTsgICAgDQorCWNvbnN0IG1wcmVhbCAgb3BlcmF0b3ItLSAoaW50KTsNCisNCisJLy8gKg0KKwltcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgbXByZWFsJiB2KTsNCisJbXByZWFsJiBvcGVyYXRvcio9KGNvbnN0IG1wel90IHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgbXBxX3Qgdik7DQorCW1wcmVhbCYgb3BlcmF0b3IqPShjb25zdCBsb25nIGRvdWJsZSB2KTsNCisJbXByZWFsJiBvcGVyYXRvcio9KGNvbnN0IGRvdWJsZSB2KTsNCisJbXByZWFsJiBvcGVyYXRvcio9KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgdW5zaWduZWQgaW50IHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yKj0oY29uc3QgbG9uZyBpbnQgdik7DQorCW1wcmVhbCYgb3BlcmF0b3IqPShjb25zdCBpbnQgdik7DQorCQ0KKwkvLyAvDQorCW1wcmVhbCYgb3BlcmF0b3IvPShjb25zdCBtcHJlYWwmIHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yLz0oY29uc3QgbXB6X3Qgdik7DQorCW1wcmVhbCYgb3BlcmF0b3IvPShjb25zdCBtcHFfdCB2KTsNCisJbXByZWFsJiBvcGVyYXRvci89KGNvbnN0IGxvbmcgZG91YmxlIHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yLz0oY29uc3QgZG91YmxlIHYpOw0KKwltcHJlYWwmIG9wZXJhdG9yLz0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdik7DQorCW1wcmVhbCYgb3BlcmF0b3IvPShjb25zdCB1bnNpZ25lZCBpbnQgdik7DQorCW1wcmVhbCYgb3BlcmF0b3IvPShjb25zdCBsb25nIGludCB2KTsNCisJbXByZWFsJiBvcGVyYXRvci89KGNvbnN0IGludCB2KTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBvcGVyYXRvci8oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiwgY29uc3QgbXByZWFsJiBhKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBvcGVyYXRvci8oY29uc3QgdW5zaWduZWQgaW50IGIsIGNvbnN0IG1wcmVhbCYgYSk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgb3BlcmF0b3IvKGNvbnN0IGxvbmcgaW50IGIsIGNvbnN0IG1wcmVhbCYgYSk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgb3BlcmF0b3IvKGNvbnN0IGludCBiLCBjb25zdCBtcHJlYWwmIGEpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCBkb3VibGUgYiwgY29uc3QgbXByZWFsJiBhKTsNCisNCisJLy88PD0gRmFzdCBNdWx0aXBsaWNhdGlvbiBieSAyXnUNCisJbXByZWFsJiBvcGVyYXRvcjw8PShjb25zdCB1bnNpZ25lZCBsb25nIGludCB1KTsNCisJbXByZWFsJiBvcGVyYXRvcjw8PShjb25zdCB1bnNpZ25lZCBpbnQgdSk7DQorCW1wcmVhbCYgb3BlcmF0b3I8PD0oY29uc3QgbG9uZyBpbnQgdSk7DQorCW1wcmVhbCYgb3BlcmF0b3I8PD0oY29uc3QgaW50IHUpOw0KKw0KKwkvLz4+PSBGYXN0IERpdmlzaW9uIGJ5IDJedQ0KKwltcHJlYWwmIG9wZXJhdG9yPj49KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IHUpOw0KKwltcHJlYWwmIG9wZXJhdG9yPj49KGNvbnN0IHVuc2lnbmVkIGludCB1KTsNCisJbXByZWFsJiBvcGVyYXRvcj4+PShjb25zdCBsb25nIGludCB1KTsNCisJbXByZWFsJiBvcGVyYXRvcj4+PShjb25zdCBpbnQgdSk7DQorDQorCS8vIEJvb2xlYW4gT3BlcmF0b3JzDQorCWZyaWVuZCBib29sIG9wZXJhdG9yID4gIChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYik7DQorCWZyaWVuZCBib29sIG9wZXJhdG9yID49IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYik7DQorCWZyaWVuZCBib29sIG9wZXJhdG9yIDwgIChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYik7DQorCWZyaWVuZCBib29sIG9wZXJhdG9yIDw9IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYik7DQorCWZyaWVuZCBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYik7DQorCWZyaWVuZCBib29sIG9wZXJhdG9yICE9IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYik7DQorDQorCS8vIE9wdGltaXplZCBzcGVjaWFsaXphdGlvbnMgZm9yIGJvb2xlYW4gb3BlcmF0b3JzDQorCWZyaWVuZCBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIpOw0KKwlmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYik7DQorCWZyaWVuZCBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgaW50IGIpOw0KKwlmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBpbnQgYik7DQorCWZyaWVuZCBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgZG91YmxlIGIpOw0KKwlmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBkb3VibGUgYik7DQorDQorCS8vIFR5cGUgQ29udmVyc2lvbiBvcGVyYXRvcnMNCisJbG9uZwkJCXRvTG9uZygpCWNvbnN0Ow0KKwl1bnNpZ25lZCBsb25nCXRvVUxvbmcoKQljb25zdDsNCisJZG91YmxlCQkJdG9Eb3VibGUoKQljb25zdDsNCisJbG9uZyBkb3VibGUJCXRvTERvdWJsZSgpCWNvbnN0Ow0KKw0KKyNpZiBkZWZpbmVkIChNUFJFQUxfSEFWRV9JTlQ2NF9TVVBQT1JUKQ0KKwlpbnQ2NF90CQkJdG9JbnQ2NCgpCWNvbnN0Ow0KKwl1aW50NjRfdAkJdG9VSW50NjQoKQljb25zdDsNCisjZW5kaWYNCisNCisJLy8gR2V0IHJhdyBwb2ludGVycw0KKwk6Om1wZnJfcHRyIG1wZnJfcHRyKCk7DQorCTo6bXBmcl9zcmNwdHIgbXBmcl9zcmNwdHIoKSBjb25zdDsNCisNCisJLy8gQ29udmVydCBtcHJlYWwgdG8gc3RyaW5nIHdpdGggbiBzaWduaWZpY2FudCBkaWdpdHMgaW4gYmFzZSBiDQorCS8vIG4gPSAwIC0+IGNvbnZlcnQgd2l0aCB0aGUgbWF4aW11bSBhdmFpbGFibGUgZGlnaXRzIA0KKwlzdGQ6OnN0cmluZwkJdG9TdHJpbmcoaW50IG4gPSAwLCBpbnQgYiA9IGRlZmF1bHRfYmFzZSwgbXBfcm5kX3QgbW9kZSA9IGRlZmF1bHRfcm5kKSBjb25zdDsNCisNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisJc3RkOjpzdHJpbmcJCXRvU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBmb3JtYXQpIGNvbnN0Ow0KKyNlbmRpZg0KKw0KKwkvLyBNYXRoIEZ1bmN0aW9ucw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHNxcgkoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHNxcnQoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHNxcnQoY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBjYnJ0KGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCByb290KGNvbnN0IG1wcmVhbCYgdiwgdW5zaWduZWQgbG9uZyBpbnQgaywgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBwb3cJKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHBvdwkoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHpfdCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHBvdwkoY29uc3QgbXByZWFsJiBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHBvdwkoY29uc3QgbXByZWFsJiBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHBvdwkoY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHBvdwkoY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBmYWJzKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBhYnMoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGRpbShjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGlubGluZSBjb25zdCBtcHJlYWwgbXVsXzJ1aShjb25zdCBtcHJlYWwmIHYsIHVuc2lnbmVkIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBpbmxpbmUgY29uc3QgbXByZWFsIG11bF8yc2koY29uc3QgbXByZWFsJiB2LCBsb25nIGludCBrLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgaW5saW5lIGNvbnN0IG1wcmVhbCBkaXZfMnVpKGNvbnN0IG1wcmVhbCYgdiwgdW5zaWduZWQgbG9uZyBpbnQgaywgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGlubGluZSBjb25zdCBtcHJlYWwgZGl2XzJzaShjb25zdCBtcHJlYWwmIHYsIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBpbnQgY21wYWJzKGNvbnN0IG1wcmVhbCYgYSxjb25zdCBtcHJlYWwmIGIpOw0KKwkNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBsb2cgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgbG9nMiAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGxvZzEwKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBleHAgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7IA0KKwlmcmllbmQgY29uc3QgbXByZWFsIGV4cDIgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBleHAxMChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgbG9nMXAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGV4cG0xKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBjb3MoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHNpbihjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgdGFuKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBzZWMoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGNzYyhjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgY290KGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGludCBzaW5fY29zKG1wcmVhbCYgcywgbXByZWFsJiBjLCBjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorDQorCWZyaWVuZCBjb25zdCBtcHJlYWwgYWNvcyAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBhc2luICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGF0YW4gIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgYXRhbjIgKGNvbnN0IG1wcmVhbCYgeSwgY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGFjb3QgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgYXNlYyAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBhY3NjICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGNvc2ggIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgc2luaCAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCB0YW5oICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHNlY2ggIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgY3NjaCAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBjb3RoICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGFjb3NoIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgYXNpbmggKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBhdGFuaCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGFjb3RoIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgYXNlY2ggKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBhY3NjaCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGh5cG90IChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBmYWNfdWkgKHVuc2lnbmVkIGxvbmcgaW50IHYsICBtcF9wcmVjX3QgcHJlYyA9IG1wcmVhbDo6ZGVmYXVsdF9wcmVjLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGVpbnQgICAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGdhbW1hIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgbG5nYW1tYSAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGxnYW1tYSAoY29uc3QgbXByZWFsJiB2LCBpbnQgKnNpZ25wID0gMCwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCB6ZXRhIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgZXJmIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgZXJmYyAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGJlc3NlbGowIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7IA0KKwlmcmllbmQgY29uc3QgbXByZWFsIGJlc3NlbGoxIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7IA0KKwlmcmllbmQgY29uc3QgbXByZWFsIGJlc3NlbGpuIChsb25nIG4sIGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBiZXNzZWx5MCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGJlc3NlbHkxIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgYmVzc2VseW4gKGxvbmcgbiwgY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOyANCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBmbWEgKGNvbnN0IG1wcmVhbCYgdjEsIGNvbnN0IG1wcmVhbCYgdjIsIGNvbnN0IG1wcmVhbCYgdjMsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgZm1zIChjb25zdCBtcHJlYWwmIHYxLCBjb25zdCBtcHJlYWwmIHYyLCBjb25zdCBtcHJlYWwmIHYzLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGFnbSAoY29uc3QgbXByZWFsJiB2MSwgY29uc3QgbXByZWFsJiB2MiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBzdW0gKGNvbnN0IG1wcmVhbCB0YWJbXSwgdW5zaWduZWQgbG9uZyBpbnQgbiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGludCBzZ24oY29uc3QgbXByZWFsJiB2KTsgLy8gLTEgb3IgKzENCisNCisvLyBNUEZSIDIuNC4wIFNwZWNpZmljcw0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMiw0LDApKQ0KKwlmcmllbmQgaW50IHNpbmhfY29zaChtcHJlYWwmIHMsIG1wcmVhbCYgYywgY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIGxpMihjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgZm1vZCAoY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHksIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgcmVjX3NxcnQoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKyNlbmRpZg0KKw0KKy8vIE1QRlIgMy4wLjAgU3BlY2lmaWNzDQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgzLDAsMCkpDQorCWZyaWVuZCBjb25zdCBtcHJlYWwgZGlnYW1tYShjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgYWkoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKyAgICBmcmllbmQgY29uc3QgbXByZWFsIHVyYW5kb20gKGdtcF9yYW5kc3RhdGVfdCYgc3RhdGUsbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsgCS8vIHVzZSBnbXBfcmFuZGluaXRfZGVmYXVsdCgpIHRvIGluaXQgc3RhdGUsIGdtcF9yYW5kY2xlYXIoKSB0byBjbGVhcg0KKwlmcmllbmQgYm9vbCBpc3JlZ3VsYXIoY29uc3QgbXByZWFsJiB2KTsNCisjZW5kaWYNCisJDQorCS8vIFVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaW4gWzAsMV0gdXNpbmcNCisJLy8gTWVyc2VubmUtVHdpc3RlciBhbGdvcml0aG0gYnkgZGVmYXVsdC4NCisJLy8gVXNlIHBhcmFtZXRlciB0byBzZXR1cCBzZWVkLCBlLmcuOiByYW5kb20oKHVuc2lnbmVkKXRpbWUoTlVMTCkpDQorCS8vIENoZWNrIHVyYW5kb20oKSBmb3IgbW9yZSBwcmVjaXNlIGNvbnRyb2wuDQorCWZyaWVuZCBjb25zdCBtcHJlYWwgcmFuZG9tKHVuc2lnbmVkIGludCBzZWVkID0gMCk7DQorCQ0KKwkvLyBFeHBvbmVudCBhbmQgbWFudGlzc2EgbWFuaXB1bGF0aW9uDQorCWZyaWVuZCBjb25zdCBtcHJlYWwgZnJleHAoY29uc3QgbXByZWFsJiB2LCBtcF9leHBfdCogZXhwKTsJDQorCWZyaWVuZCBjb25zdCBtcHJlYWwgbGRleHAoY29uc3QgbXByZWFsJiB2LCBtcF9leHBfdCBleHApOw0KKw0KKwkvLyBTcGxpdHMgbXByZWFsIHZhbHVlIGludG8gZnJhY3Rpb25hbCBhbmQgaW50ZWdlciBwYXJ0cy4NCisJLy8gUmV0dXJucyBmcmFjdGlvbmFsIHBhcnQgYW5kIHN0b3JlcyBpbnRlZ2VyIHBhcnQgaW4gbi4NCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBtb2RmKGNvbnN0IG1wcmVhbCYgdiwgbXByZWFsJiBuKTsJDQorDQorCS8vIENvbnN0YW50cw0KKwkvLyBkb24ndCBmb3JnZXQgdG8gY2FsbCBtcGZyX2ZyZWVfY2FjaGUoKSBmb3IgZXZlcnkgdGhyZWFkIHdoZXJlIHlvdSBhcmUgdXNpbmcgY29uc3QtZnVuY3Rpb25zDQorCWZyaWVuZCBjb25zdCBtcHJlYWwgY29uc3RfbG9nMiAobXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmRlZmF1bHRfcHJlYywgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBjb25zdF9waSAobXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmRlZmF1bHRfcHJlYywgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBjb25zdF9ldWxlciAobXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmRlZmF1bHRfcHJlYywgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBjb25zdF9jYXRhbGFuIChtcF9wcmVjX3QgcHJlYyA9IG1wcmVhbDo6ZGVmYXVsdF9wcmVjLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwkvLyByZXR1cm5zICtpbmYgaWZmIHNpZ24+PTAgb3RoZXJ3aXNlIC1pbmYNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBjb25zdF9pbmZpbml0eShpbnQgc2lnbiA9IDEsIG1wX3ByZWNfdCBwcmVjID0gbXByZWFsOjpkZWZhdWx0X3ByZWMsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorDQorCS8vIE91dHB1dC8gSW5wdXQNCisJZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBtcHJlYWwmIHYpOw0KKyAgICBmcmllbmQgc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYgaXMsIG1wcmVhbCYgdik7DQorDQorCS8vIEludGVnZXIgUmVsYXRlZCBGdW5jdGlvbnMNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCByaW50IChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgY2VpbCAoY29uc3QgbXByZWFsJiB2KTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBmbG9vcihjb25zdCBtcHJlYWwmIHYpOw0KKwlmcmllbmQgY29uc3QgbXByZWFsIHJvdW5kKGNvbnN0IG1wcmVhbCYgdik7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgdHJ1bmMoY29uc3QgbXByZWFsJiB2KTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCByaW50X2NlaWwgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCByaW50X2Zsb29yKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCByaW50X3JvdW5kKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCByaW50X3RydW5jKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBmcmFjIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgcmVtYWluZGVyIChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCByZW1xdW8gKGxvbmcqIHEsIGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwkNCisJLy8gTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBuZXh0dG93YXJkIChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgbmV4dGFib3ZlICAoY29uc3QgbXByZWFsJiB4KTsNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCBuZXh0YmVsb3cgIChjb25zdCBtcHJlYWwmIHgpOw0KKw0KKwkvLyB1c2UgZ21wX3JhbmRpbml0X2RlZmF1bHQoKSB0byBpbml0IHN0YXRlLCBnbXBfcmFuZGNsZWFyKCkgdG8gY2xlYXINCisJZnJpZW5kIGNvbnN0IG1wcmVhbCB1cmFuZG9tYiAoZ21wX3JhbmRzdGF0ZV90JiBzdGF0ZSk7IA0KKw0KKy8vIE1QRlIgPCAyLjQuMiBTcGVjaWZpY3MNCisjaWYgKE1QRlJfVkVSU0lPTiA8PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwyKSkNCisJZnJpZW5kIGNvbnN0IG1wcmVhbCByYW5kb20yIChtcF9zaXplX3Qgc2l6ZSwgbXBfZXhwX3QgZXhwKTsNCisjZW5kaWYNCisNCisJLy8gSW5zdGFuY2UgQ2hlY2tlcnMNCisJZnJpZW5kIGJvb2wgaXNuYW4JKGNvbnN0IG1wcmVhbCYgdik7DQorCWZyaWVuZCBib29sIGlzaW5mCShjb25zdCBtcHJlYWwmIHYpOw0KKwlmcmllbmQgYm9vbCBpc2Zpbml0ZShjb25zdCBtcHJlYWwmIHYpOw0KKw0KKwlmcmllbmQgYm9vbCBpc251bShjb25zdCBtcHJlYWwmIHYpOw0KKwlmcmllbmQgYm9vbAlpc3plcm8oY29uc3QgbXByZWFsJiB2KTsNCisJZnJpZW5kIGJvb2wgaXNpbnQoY29uc3QgbXByZWFsJiB2KTsNCisNCisJLy8gU2V0L0dldCBpbnN0YW5jZSBwcm9wZXJ0aWVzDQorCWlubGluZSBtcF9wcmVjX3QJZ2V0X3ByZWMoKSBjb25zdDsNCisJaW5saW5lIHZvaWQJCQlzZXRfcHJlYyhtcF9wcmVjX3QgcHJlYywgbXBfcm5kX3Qgcm5kX21vZGUgPSBkZWZhdWx0X3JuZCk7CS8vIENoYW5nZSBwcmVjaXNpb24gd2l0aCByb3VuZGluZyBtb2RlDQorDQorCS8vIEFsaWFzZXMgZm9yIGdldF9wcmVjKCksIHNldF9wcmVjKCkgLSBuZWVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzdGQ6OmNvbXBsZXg8bXByZWFsPiBpbnRlcmZhY2UNCisJaW5saW5lIG1wcmVhbCYJCXNldFByZWNpc2lvbihpbnQgUHJlY2lzaW9uLCBtcF9ybmRfdCBSb3VuZGluZ01vZGUgPSAobXBmcl9nZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlKSgpKTsNCisJaW5saW5lIGludAkJCWdldFByZWNpc2lvbigpIGNvbnN0Ow0KKwkNCisJLy8gU2V0IG1wcmVhbCB0byArLy0gaW5mLCBOYU4sICsvLTANCisJbXByZWFsJgkJc2V0SW5mCShpbnQgU2lnbiA9ICsxKTsJDQorCW1wcmVhbCYJCXNldE5hbgkoKTsNCisJbXByZWFsJgkJc2V0WmVybwkoaW50IFNpZ24gPSArMSk7DQorCW1wcmVhbCYJCXNldFNpZ24JKGludCBTaWduLCBtcF9ybmRfdCBSb3VuZGluZ01vZGUgPSAobXBmcl9nZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlKSgpKTsNCisNCisJLy9FeHBvbmVudA0KKwltcF9leHBfdCBnZXRfZXhwKCk7DQorCWludCBzZXRfZXhwKG1wX2V4cF90IGUpOw0KKwlpbnQgY2hlY2tfcmFuZ2UgKGludCB0LCBtcF9ybmRfdCBybmRfbW9kZSA9IGRlZmF1bHRfcm5kKTsNCisJaW50IHN1Ym5vcm1hbGl6ZSAoaW50IHQsbXBfcm5kX3Qgcm5kX21vZGUgPSBkZWZhdWx0X3JuZCk7DQorDQorCS8vIEluZXhhY3QgY29udmVyc2lvbiBmcm9tIGZsb2F0DQorCWlubGluZSBib29sIGZpdHNfaW5fYml0cyhkb3VibGUgeCwgaW50IG4pOw0KKw0KKwkvLyBTZXQvR2V0IGdsb2JhbCBwcm9wZXJ0aWVzDQorCXN0YXRpYyB2b2lkCQkJc2V0X2RlZmF1bHRfcHJlYyhtcF9wcmVjX3QgcHJlYyk7DQorCXN0YXRpYyBtcF9wcmVjX3QJZ2V0X2RlZmF1bHRfcHJlYygpOw0KKwlzdGF0aWMgdm9pZAkJCXNldF9kZWZhdWx0X2Jhc2UoaW50IGJhc2UpOw0KKwlzdGF0aWMgaW50CQkJZ2V0X2RlZmF1bHRfYmFzZSgpOw0KKwlzdGF0aWMgdm9pZAkJCXNldF9kb3VibGVfYml0cyhpbnQgZGJpdHMpOw0KKwlzdGF0aWMgaW50CQkJZ2V0X2RvdWJsZV9iaXRzKCk7DQorCXN0YXRpYyB2b2lkCQkJc2V0X2RlZmF1bHRfcm5kKG1wX3JuZF90IHJuZF9tb2RlKTsNCisJc3RhdGljIG1wX3JuZF90CQlnZXRfZGVmYXVsdF9ybmQoKTsNCisJc3RhdGljIG1wX2V4cF90CQlnZXRfZW1pbiAodm9pZCk7DQorCXN0YXRpYyBtcF9leHBfdAkJZ2V0X2VtYXggKHZvaWQpOw0KKwlzdGF0aWMgbXBfZXhwX3QJCWdldF9lbWluX21pbiAodm9pZCk7DQorCXN0YXRpYyBtcF9leHBfdAkJZ2V0X2VtaW5fbWF4ICh2b2lkKTsNCisJc3RhdGljIG1wX2V4cF90CQlnZXRfZW1heF9taW4gKHZvaWQpOw0KKwlzdGF0aWMgbXBfZXhwX3QJCWdldF9lbWF4X21heCAodm9pZCk7DQorCXN0YXRpYyBpbnQJCQlzZXRfZW1pbiAobXBfZXhwX3QgZXhwKTsNCisJc3RhdGljIGludAkJCXNldF9lbWF4IChtcF9leHBfdCBleHApOw0KKw0KKwkvLyBFZmZpY2llbnQgc3dhcHBpbmcgb2YgdHdvIG1wcmVhbCB2YWx1ZXMNCisJZnJpZW5kIHZvaWQgc3dhcChtcHJlYWwmIHgsIG1wcmVhbCYgeSk7DQorCQ0KKwkvL01pbiBNYXggLSBtYWNyb3MgaXMgZXZpbC4gTmVlZGVkIGZvciBzeXN0ZW1zIHdoaWNoIGRlZmluZXMgbWF4IGFuZCBtaW4gZ2xvYmFsbHkgYXMgbWFjcm9zIChlLmcuIFdpbmRvd3MpDQorCS8vSG9wZSB0aGF0IGdsb2JhbGx5IGRlZmluZWQgbWFjcm9zIHVzZSA+IDwgb3BlcmF0aW9ucyBvbmx5DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgZm1heChjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBkZWZhdWx0X3JuZCk7DQorCWZyaWVuZCBjb25zdCBtcHJlYWwgZm1pbihjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgbXBfcm5kX3Qgcm5kX21vZGUgPSBkZWZhdWx0X3JuZCk7DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0NVU1RPTV9NUEZSX01BTExPQykNCisNCitwcml2YXRlOg0KKwkvLyBPcHRpbWl6ZWQgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi8ocmUtKWRlYWxsb2NhdGlvbi4NCisJc3RhdGljIGJvb2wgaXNfY3VzdG9tX21hbGxvYzsNCisJc3RhdGljIHZvaWQgKm1wcmVhbF9hbGxvY2F0ZQkJCShzaXplX3QgYWxsb2Nfc2l6ZSk7DQorCXN0YXRpYyB2b2lkICptcHJlYWxfcmVhbGxvY2F0ZQkJCSh2b2lkICpwdHIsIHNpemVfdCBvbGRfc2l6ZSwgc2l6ZV90IG5ld19zaXplKTsNCisJc3RhdGljIHZvaWQgbXByZWFsX2ZyZWUJCQkJCSh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsNCisJaW5saW5lIHN0YXRpYyB2b2lkIHNldF9jdXN0b21fbWFsbG9jCSh2b2lkKTsNCisNCisjZW5kaWYNCisNCisNCitwcml2YXRlOg0KKwkvLyBIdW1hbiBmcmllbmRseSBEZWJ1ZyBQcmV2aWV3IGluIFZpc3VhbCBTdHVkaW8uDQorCS8vIFB1dCBvbmUgb2YgdGhlc2UgbGluZXM6DQorCS8vDQorCS8vIG1wZnI6Om1wcmVhbD08RGVidWdWaWV3PgkJCQkJCQkJOyBTaG93IHZhbHVlIG9ubHkNCisJLy8gbXBmcjo6bXByZWFsPTxEZWJ1Z1ZpZXc+LCA8bXBbMF0uX21wZnJfcHJlYyx1PmJpdHMJOyBTaG93IHZhbHVlICYgcHJlY2lzaW9uDQorCS8vIA0KKwkvLyBhdCB0aGUgYmVnaW5uaW5nIG9mDQorCS8vIFtWaXN1YWwgU3R1ZGlvIEluc3RhbGxhdGlvbiBGb2xkZXJdXENvbW1vbjdcUGFja2FnZXNcRGVidWdnZXJcYXV0b2V4cC5kYXQNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0RBVEENCit9Ow0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gRXhjZXB0aW9ucw0KK2NsYXNzIGNvbnZlcnNpb25fb3ZlcmZsb3cgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gew0KK3B1YmxpYzoNCisJc3RkOjpzdHJpbmcgd2h5KCkgeyByZXR1cm4gImluZXhhY3QgY29udmVyc2lvbiBmcm9tIGZsb2F0aW5nIHBvaW50IjsgfQ0KK307DQorDQorbmFtZXNwYWNlIGludGVybmFsew0KKw0KKwkvLyBVc2UgU0ZJTkFFIHRvIHJlc3RyaWN0IGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbnN0YW50aWF0aW9uIG9ubHkgZm9yIG51bWVyaWMgdHlwZXMNCisJLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHNtb290aCBpbnRlZ3JhdGlvbiB3aXRoIGxpYnJhcmllcyBiYXNlZCBvbiBleHByZXNzaW9uIHRlbXBsYXRlcw0KKwl0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJndW1lbnRUeXBlPiBzdHJ1Y3QgcmVzdWx0X3R5cGUge307CQ0KKwkNCisJdGVtcGxhdGUgPD4gc3RydWN0IHJlc3VsdF90eXBlPG1wcmVhbD4JCQkJe3R5cGVkZWYgbXByZWFsIHR5cGU7fTsJDQorCXRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTxtcHpfdD4JCQkJe3R5cGVkZWYgbXByZWFsIHR5cGU7fTsJDQorCXRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTxtcHFfdD4JCQkJe3R5cGVkZWYgbXByZWFsIHR5cGU7fTsJDQorCXRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTxsb25nIGRvdWJsZT4JCQl7dHlwZWRlZiBtcHJlYWwgdHlwZTt9OwkNCisJdGVtcGxhdGUgPD4gc3RydWN0IHJlc3VsdF90eXBlPGRvdWJsZT4JCQkJe3R5cGVkZWYgbXByZWFsIHR5cGU7fTsJDQorCXRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTx1bnNpZ25lZCBsb25nIGludD4Je3R5cGVkZWYgbXByZWFsIHR5cGU7fTsJDQorCXRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTx1bnNpZ25lZCBpbnQ+CQl7dHlwZWRlZiBtcHJlYWwgdHlwZTt9OwkNCisJdGVtcGxhdGUgPD4gc3RydWN0IHJlc3VsdF90eXBlPGxvbmcgaW50PgkJCXt0eXBlZGVmIG1wcmVhbCB0eXBlO307CQ0KKwl0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcmVzdWx0X3R5cGU8aW50PgkJCQkJe3R5cGVkZWYgbXByZWFsIHR5cGU7fTsJDQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0lOVDY0X1NVUFBPUlQpDQorCXRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTxpbnQ2NF90ICA+CQkJe3R5cGVkZWYgbXByZWFsIHR5cGU7fTsJDQorCXRlbXBsYXRlIDw+IHN0cnVjdCByZXN1bHRfdHlwZTx1aW50NjRfdCA+CQkJe3R5cGVkZWYgbXByZWFsIHR5cGU7fTsJDQorI2VuZGlmDQorfQ0KKw0KKy8vICsgQWRkaXRpb24NCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmhzPiANCitpbmxpbmUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlc3VsdF90eXBlPFJocz46OnR5cGUgDQorCW9wZXJhdG9yKyhjb25zdCBtcHJlYWwmIGxocywgY29uc3QgUmhzJiByaHMpeyByZXR1cm4gbXByZWFsKGxocykgKz0gcmhzOwl9DQorDQordGVtcGxhdGUgPHR5cGVuYW1lIExocz4gDQoraW5saW5lIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZXN1bHRfdHlwZTxMaHM+Ojp0eXBlIA0KKwlvcGVyYXRvcisoY29uc3QgTGhzJiBsaHMsIGNvbnN0IG1wcmVhbCYgcmhzKXsgcmV0dXJuIG1wcmVhbChyaHMpICs9IGxoczsJfSANCisNCisvLyAtIFN1YnRyYWN0aW9uDQordGVtcGxhdGUgPHR5cGVuYW1lIFJocz4gDQoraW5saW5lIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZXN1bHRfdHlwZTxSaHM+Ojp0eXBlIA0KKwlvcGVyYXRvci0oY29uc3QgbXByZWFsJiBsaHMsIGNvbnN0IFJocyYgcmhzKXsgcmV0dXJuIG1wcmVhbChsaHMpIC09IHJoczsJfQ0KKw0KK3RlbXBsYXRlIDx0eXBlbmFtZSBMaHM+IA0KK2lubGluZSBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVzdWx0X3R5cGU8TGhzPjo6dHlwZSANCisJb3BlcmF0b3ItKGNvbnN0IExocyYgbGhzLCBjb25zdCBtcHJlYWwmIHJocyl7IHJldHVybiBtcHJlYWwobGhzKSAtPSByaHM7CX0NCisNCisvLyAqIE11bHRpcGxpY2F0aW9uDQordGVtcGxhdGUgPHR5cGVuYW1lIFJocz4gDQoraW5saW5lIGNvbnN0IHR5cGVuYW1lIGludGVybmFsOjpyZXN1bHRfdHlwZTxSaHM+Ojp0eXBlIA0KKwlvcGVyYXRvciooY29uc3QgbXByZWFsJiBsaHMsIGNvbnN0IFJocyYgcmhzKXsgcmV0dXJuIG1wcmVhbChsaHMpICo9IHJoczsJfQ0KKw0KK3RlbXBsYXRlIDx0eXBlbmFtZSBMaHM+IA0KK2lubGluZSBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVzdWx0X3R5cGU8TGhzPjo6dHlwZSANCisJb3BlcmF0b3IqKGNvbnN0IExocyYgbGhzLCBjb25zdCBtcHJlYWwmIHJocyl7IHJldHVybiBtcHJlYWwocmhzKSAqPSBsaHM7CX0gDQorDQorLy8gLyBEaXZpc2lvbg0KK3RlbXBsYXRlIDx0eXBlbmFtZSBSaHM+IA0KK2lubGluZSBjb25zdCB0eXBlbmFtZSBpbnRlcm5hbDo6cmVzdWx0X3R5cGU8UmhzPjo6dHlwZSANCisJb3BlcmF0b3IvKGNvbnN0IG1wcmVhbCYgbGhzLCBjb25zdCBSaHMmIHJocyl7IHJldHVybiBtcHJlYWwobGhzKSAvPSByaHM7CX0NCisNCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzPiANCitpbmxpbmUgY29uc3QgdHlwZW5hbWUgaW50ZXJuYWw6OnJlc3VsdF90eXBlPExocz46OnR5cGUgDQorCW9wZXJhdG9yLyhjb25zdCBMaHMmIGxocywgY29uc3QgbXByZWFsJiByaHMpeyByZXR1cm4gbXByZWFsKGxocykgLz0gcmhzOwl9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBzcXJ0DQorY29uc3QgbXByZWFsIHNxcnQoY29uc3QgdW5zaWduZWQgaW50IHYsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHNxcnQoY29uc3QgbG9uZyBpbnQgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgc3FydChjb25zdCBpbnQgdiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgc3FydChjb25zdCBsb25nIGRvdWJsZSB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBzcXJ0KGNvbnN0IGRvdWJsZSB2LCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gcG93DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbXByZWFsJiBhLCBjb25zdCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbG9uZyBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorDQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBpbnQgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBpbnQgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgZG91YmxlIGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGRvdWJsZSBhLCBjb25zdCBtcHJlYWwmIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorDQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBsb25nIGludCBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGEsIGNvbnN0IGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBsb25nIGludCBhLCBjb25zdCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBsb25nIGludCBhLCBjb25zdCBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgaW50IGEsIGNvbnN0IHVuc2lnbmVkIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgaW50IGEsIGNvbnN0IGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBpbnQgYSwgY29uc3QgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBpbnQgYSwgY29uc3QgbG9uZyBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGludCBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IHVuc2lnbmVkIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBpbnQgYSwgY29uc3QgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7IA0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBpbnQgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7IA0KKw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBkb3VibGUgYSwgY29uc3QgbG9uZyBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsJDQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBkb3VibGUgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSA9IG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBkb3VibGUgYSwgY29uc3QgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorDQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7CQ0KK2NvbnN0IG1wcmVhbCBwb3coY29uc3QgZG91YmxlIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlID0gbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCitjb25zdCBtcHJlYWwgcG93KGNvbnN0IGRvdWJsZSBhLCBjb25zdCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUgPSBtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEVzdGltYXRlIG1hY2hpbmUgZXBzaWxvbiBmb3IgdGhlIGdpdmVuIHByZWNpc2lvbg0KKy8vIFJldHVybnMgc21hbGxlc3QgZXBzIHN1Y2ggdGhhdCAxLjAgKyBlcHMgIT0gMS4wDQoraW5saW5lIGNvbnN0IG1wcmVhbCBtYWNoaW5lX2Vwc2lsb24obXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSk7DQorDQorLy8gIFJldHVybnMgdGhlIHBvc2l0aXZlIGRpc3RhbmNlIGZyb20gYWJzKHgpIHRvIHRoZSBuZXh0IGxhcmdlciBpbiBtYWduaXR1ZGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIG9mIHRoZSBzYW1lIHByZWNpc2lvbiBhcyB4DQoraW5saW5lIGNvbnN0IG1wcmVhbCBtYWNoaW5lX2Vwc2lsb24oY29uc3QgbXByZWFsJiB4KTsJCQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbXByZWFsX21pbihtcF9wcmVjX3QgcHJlYyA9IG1wcmVhbDo6Z2V0X2RlZmF1bHRfcHJlYygpKTsNCitpbmxpbmUgY29uc3QgbXByZWFsIG1wcmVhbF9tYXgobXBfcHJlY190IHByZWMgPSBtcHJlYWw6OmdldF9kZWZhdWx0X3ByZWMoKSk7DQoraW5saW5lIGJvb2wgaXNFcXVhbEZ1enp5KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiLCBjb25zdCBtcHJlYWwmIGVwcyk7DQoraW5saW5lIGJvb2wgaXNFcXVhbFVscHMoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIsIGludCBtYXhVbHBzKTsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIAlCaXRzIC0gZGVjaW1hbCBkaWdpdHMgcmVsYXRpb24NCisvLwkJYml0cyAgID0gY2VpbChkaWdpdHMqbG9nWzJdKDEwKSkNCisvLwkJZGlnaXRzID0gZmxvb3IoYml0cypsb2dbMTBdKDIpKQ0KKw0KK2lubGluZSBtcF9wcmVjX3QgZGlnaXRzMmJpdHMoaW50IGQpOw0KK2lubGluZSBpbnQgYml0czJkaWdpdHMobXBfcHJlY190IGIpOw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gbWluLCBtYXgNCitjb25zdCBtcHJlYWwgKG1heCkoY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHkpOw0KK2NvbnN0IG1wcmVhbCAobWluKShjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSk7DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBJbXBsZW1lbnRhdGlvbg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBPcGVyYXRvcnMgLSBBc3NpZ25tZW50DQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgbXByZWFsJiB2KQ0KK3sNCisJaWYgKHRoaXMgIT0gJnYpDQorCXsNCisJCW1wZnJfY2xlYXIobXApOw0KKwkJbXBmcl9pbml0MihtcCxtcGZyX2dldF9wcmVjKHYubXApKTsNCisJCW1wZnJfc2V0KG1wLHYubXAsZGVmYXVsdF9ybmQpOw0KKw0KKwkJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCX0NCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPShjb25zdCBtcGZfdCB2KQ0KK3sNCisJbXBmcl9zZXRfZihtcCx2LGRlZmF1bHRfcm5kKTsNCisJDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I9KGNvbnN0IG1wel90IHYpDQorew0KKwltcGZyX3NldF96KG1wLHYsZGVmYXVsdF9ybmQpOw0KKwkNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgbXBxX3QgdikNCit7DQorCW1wZnJfc2V0X3EobXAsdixkZWZhdWx0X3JuZCk7DQorDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I9KGNvbnN0IGxvbmcgZG91YmxlIHYpCQkNCit7CQ0KKyAgICBtcGZyX3NldF9sZChtcCx2LGRlZmF1bHRfcm5kKTsNCisNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgZG91YmxlIHYpCQkJCQ0KK3sJDQorICAgIGlmKGRvdWJsZV9iaXRzID09IC0xIHx8IGZpdHNfaW5fYml0cyh2LCBkb3VibGVfYml0cykpDQorICAgIHsNCisgICAgCW1wZnJfc2V0X2QobXAsdixkZWZhdWx0X3JuZCk7DQorDQorCQlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgICB0aHJvdyBjb252ZXJzaW9uX292ZXJmbG93KCk7DQorDQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdikJDQorewkNCisJbXBmcl9zZXRfdWkobXAsdixkZWZhdWx0X3JuZCk7CQ0KKw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPShjb25zdCB1bnNpZ25lZCBpbnQgdikJCQ0KK3sJDQorCW1wZnJfc2V0X3VpKG1wLHYsZGVmYXVsdF9ybmQpOwkNCisNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj0oY29uc3QgbG9uZyBpbnQgdikJCQkNCit7CQ0KKwltcGZyX3NldF9zaShtcCx2LGRlZmF1bHRfcm5kKTsJDQorDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I9KGNvbnN0IGludCB2KQ0KK3sJDQorCW1wZnJfc2V0X3NpKG1wLHYsZGVmYXVsdF9ybmQpOwkNCisNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyArIEFkZGl0aW9uDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcis9KGNvbnN0IG1wcmVhbCYgdikNCit7DQorCW1wZnJfYWRkKG1wLG1wLHYubXAsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0oY29uc3QgbXBmX3QgdSkNCit7DQorCSp0aGlzICs9IG1wcmVhbCh1KTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcis9KGNvbnN0IG1wel90IHUpDQorew0KKwltcGZyX2FkZF96KG1wLG1wLHUsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0oY29uc3QgbXBxX3QgdSkNCit7DQorCW1wZnJfYWRkX3EobXAsbXAsdSxkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IrPSAoY29uc3QgbG9uZyBkb3VibGUgdSkNCit7DQorCSp0aGlzICs9IG1wcmVhbCh1KTsJDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7CQ0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0gKGNvbnN0IGRvdWJsZSB1KQ0KK3sNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisJbXBmcl9hZGRfZChtcCxtcCx1LGRlZmF1bHRfcm5kKTsNCisjZWxzZQ0KKwkqdGhpcyArPSBtcHJlYWwodSk7DQorI2VuZGlmDQorDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IrPShjb25zdCB1bnNpZ25lZCBsb25nIGludCB1KQ0KK3sNCisJbXBmcl9hZGRfdWkobXAsbXAsdSxkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IrPShjb25zdCB1bnNpZ25lZCBpbnQgdSkNCit7DQorCW1wZnJfYWRkX3VpKG1wLG1wLHUsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0oY29uc3QgbG9uZyBpbnQgdSkNCit7DQorCW1wZnJfYWRkX3NpKG1wLG1wLHUsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0oY29uc3QgaW50IHUpDQorew0KKwltcGZyX2FkZF9zaShtcCxtcCx1LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQorI2lmIGRlZmluZWQgKE1QUkVBTF9IQVZFX0lOVDY0X1NVUFBPUlQpDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcis9KGNvbnN0IGludDY0X3QgIHUpewkqdGhpcyArPSBtcHJlYWwodSk7IE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOyByZXR1cm4gKnRoaXM7CX0NCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKz0oY29uc3QgdWludDY0X3QgdSl7CSp0aGlzICs9IG1wcmVhbCh1KTsgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7IHJldHVybiAqdGhpczsJfQ0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3ItPShjb25zdCBpbnQ2NF90ICB1KXsJKnRoaXMgLT0gbXByZWFsKHUpOyBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsgcmV0dXJuICp0aGlzOwl9DQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci09KGNvbnN0IHVpbnQ2NF90IHUpewkqdGhpcyAtPSBtcHJlYWwodSk7IE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOyByZXR1cm4gKnRoaXM7CX0NCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKj0oY29uc3QgaW50NjRfdCAgdSl7CSp0aGlzICo9IG1wcmVhbCh1KTsgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7IHJldHVybiAqdGhpczsJfQ0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IqPShjb25zdCB1aW50NjRfdCB1KXsJKnRoaXMgKj0gbXByZWFsKHUpOyBNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsgcmV0dXJuICp0aGlzOwl9DQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci89KGNvbnN0IGludDY0X3QgIHUpewkqdGhpcyAvPSBtcHJlYWwodSk7IE1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOyByZXR1cm4gKnRoaXM7CX0NCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLz0oY29uc3QgdWludDY0X3QgdSl7CSp0aGlzIC89IG1wcmVhbCh1KTsgTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7IHJldHVybiAqdGhpczsJfQ0KKyNlbmRpZiANCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG1wcmVhbDo6b3BlcmF0b3IrKCljb25zdAl7CXJldHVybiBtcHJlYWwoKnRoaXMpOyB9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvcisoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIpDQorew0KKwkvLyBwcmVjKGErYikgPSBtYXgocHJlYyhhKSxwcmVjKGIpKQ0KKwlpZihhLmdldF9wcmVjKCk+Yi5nZXRfcHJlYygpKSByZXR1cm4gbXByZWFsKGEpICs9IGI7DQorCWVsc2UJCQkJCQkgIHJldHVybiBtcHJlYWwoYikgKz0gYTsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcisrKCkgDQorew0KKwlyZXR1cm4gKnRoaXMgKz0gMTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBtcHJlYWw6Om9wZXJhdG9yKysgKGludCkNCit7DQorCW1wcmVhbCB4KCp0aGlzKTsNCisJKnRoaXMgKz0gMTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3ItLSgpIA0KK3sNCisJcmV0dXJuICp0aGlzIC09IDE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbXByZWFsOjpvcGVyYXRvci0tIChpbnQpDQorew0KKwltcHJlYWwgeCgqdGhpcyk7DQorCSp0aGlzIC09IDE7DQorCXJldHVybiB4Ow0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIC0gU3VidHJhY3Rpb24NCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLT0gKGNvbnN0IG1wcmVhbCYgdikNCit7DQorCW1wZnJfc3ViKG1wLG1wLHYubXAsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLT0oY29uc3QgbXB6X3QgdikNCit7DQorCW1wZnJfc3ViX3oobXAsbXAsdixkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3ItPShjb25zdCBtcHFfdCB2KQ0KK3sNCisJbXBmcl9zdWJfcShtcCxtcCx2LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci09KGNvbnN0IGxvbmcgZG91YmxlIHYpDQorew0KKwkqdGhpcyAtPSBtcHJlYWwodik7CQ0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOwkNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci09KGNvbnN0IGRvdWJsZSB2KQ0KK3sNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisJbXBmcl9zdWJfZChtcCxtcCx2LGRlZmF1bHRfcm5kKTsNCisjZWxzZQ0KKwkqdGhpcyAtPSBtcHJlYWwodik7CQ0KKyNlbmRpZg0KKw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLT0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdikNCit7DQorCW1wZnJfc3ViX3VpKG1wLG1wLHYsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLT0oY29uc3QgdW5zaWduZWQgaW50IHYpDQorew0KKwltcGZyX3N1Yl91aShtcCxtcCx2LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci09KGNvbnN0IGxvbmcgaW50IHYpDQorew0KKwltcGZyX3N1Yl9zaShtcCxtcCx2LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci09KGNvbnN0IGludCB2KQ0KK3sNCisJbXBmcl9zdWJfc2kobXAsbXAsdixkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbXByZWFsOjpvcGVyYXRvci0oKWNvbnN0DQorew0KKwltcHJlYWwgdSgqdGhpcyk7DQorCW1wZnJfbmVnKHUubXAsdS5tcCxkZWZhdWx0X3JuZCk7DQorCXJldHVybiB1Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYikNCit7DQorCS8vIHByZWMoYS1iKSA9IG1heChwcmVjKGEpLHByZWMoYikpDQorCWlmKGEuZ2V0UHJlY2lzaW9uKCkgPj0gYi5nZXRQcmVjaXNpb24oKSkJDQorCXsNCisJCXJldHVybiAgIG1wcmVhbChhKSAtPSBiOw0KKwl9ZWxzZXsNCisJCW1wcmVhbCB4KGEpOw0KKwkJeC5zZXRQcmVjaXNpb24oYi5nZXRQcmVjaXNpb24oKSk7DQorCQlyZXR1cm4geCAtPSBiOwkJDQorCX0NCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvci0oY29uc3QgZG91YmxlICBiLCBjb25zdCBtcHJlYWwmIGEpDQorew0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMiw0LDApKQ0KKwltcHJlYWwgeChhKTsNCisJbXBmcl9kX3N1Yih4Lm1wLGIsYS5tcCxtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJcmV0dXJuIHg7DQorI2Vsc2UNCisJcmV0dXJuIG1wcmVhbChiKSAtPSBhOw0KKyNlbmRpZg0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBjb25zdCBtcHJlYWwmIGEpDQorew0KKwltcHJlYWwgeChhKTsNCisJbXBmcl91aV9zdWIoeC5tcCxiLGEubXAsbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yLShjb25zdCB1bnNpZ25lZCBpbnQgYiwgY29uc3QgbXByZWFsJiBhKQ0KK3sNCisJbXByZWFsIHgoYSk7DQorCW1wZnJfdWlfc3ViKHgubXAsYixhLm1wLG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvci0oY29uc3QgbG9uZyBpbnQgYiwgY29uc3QgbXByZWFsJiBhKQ0KK3sNCisJbXByZWFsIHgoYSk7DQorCW1wZnJfc2lfc3ViKHgubXAsYixhLm1wLG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvci0oY29uc3QgaW50IGIsIGNvbnN0IG1wcmVhbCYgYSkNCit7DQorCW1wcmVhbCB4KGEpOw0KKwltcGZyX3NpX3N1Yih4Lm1wLGIsYS5tcCxtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gKiBNdWx0aXBsaWNhdGlvbg0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IqPSAoY29uc3QgbXByZWFsJiB2KQ0KK3sNCisJbXBmcl9tdWwobXAsbXAsdi5tcCxkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IqPShjb25zdCBtcHpfdCB2KQ0KK3sNCisJbXBmcl9tdWxfeihtcCxtcCx2LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcio9KGNvbnN0IG1wcV90IHYpDQorew0KKwltcGZyX211bF9xKG1wLG1wLHYsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKj0oY29uc3QgbG9uZyBkb3VibGUgdikNCit7DQorCSp0aGlzICo9IG1wcmVhbCh2KTsJDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7CQ0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKj0oY29uc3QgZG91YmxlIHYpDQorew0KKyNpZiAoTVBGUl9WRVJTSU9OID49IE1QRlJfVkVSU0lPTl9OVU0oMiw0LDApKQ0KKwltcGZyX211bF9kKG1wLG1wLHYsZGVmYXVsdF9ybmQpOw0KKyNlbHNlDQorCSp0aGlzICo9IG1wcmVhbCh2KTsJDQorI2VuZGlmDQorDQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IqPShjb25zdCB1bnNpZ25lZCBsb25nIGludCB2KQ0KK3sNCisJbXBmcl9tdWxfdWkobXAsbXAsdixkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IqPShjb25zdCB1bnNpZ25lZCBpbnQgdikNCit7DQorCW1wZnJfbXVsX3VpKG1wLG1wLHYsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKj0oY29uc3QgbG9uZyBpbnQgdikNCit7DQorCW1wZnJfbXVsX3NpKG1wLG1wLHYsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yKj0oY29uc3QgaW50IHYpDQorew0KKwltcGZyX211bF9zaShtcCxtcCx2LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvciooY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIpDQorew0KKwkvLyBwcmVjKGEqYikgPSBtYXgocHJlYyhhKSxwcmVjKGIpKQ0KKwlpZihhLmdldFByZWNpc2lvbigpID49IGIuZ2V0UHJlY2lzaW9uKCkpCXJldHVybiAgIG1wcmVhbChhKSAqPSBiOw0KKwllbHNlCQkJCQkJCQkJCXJldHVybiAgIG1wcmVhbChiKSAqPSBhOwkJDQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gLyBEaXZpc2lvbg0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IvPShjb25zdCBtcHJlYWwmIHYpDQorew0KKwltcGZyX2RpdihtcCxtcCx2Lm1wLGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci89KGNvbnN0IG1wel90IHYpDQorew0KKwltcGZyX2Rpdl96KG1wLG1wLHYsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLz0oY29uc3QgbXBxX3QgdikNCit7DQorCW1wZnJfZGl2X3EobXAsbXAsdixkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3IvPShjb25zdCBsb25nIGRvdWJsZSB2KQ0KK3sNCisJKnRoaXMgLz0gbXByZWFsKHYpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOwkNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci89KGNvbnN0IGRvdWJsZSB2KQ0KK3sNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisJbXBmcl9kaXZfZChtcCxtcCx2LGRlZmF1bHRfcm5kKTsNCisjZWxzZQ0KKwkqdGhpcyAvPSBtcHJlYWwodik7CQ0KKyNlbmRpZg0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLz0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdikNCit7DQorCW1wZnJfZGl2X3VpKG1wLG1wLHYsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yLz0oY29uc3QgdW5zaWduZWQgaW50IHYpDQorew0KKwltcGZyX2Rpdl91aShtcCxtcCx2LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci89KGNvbnN0IGxvbmcgaW50IHYpDQorew0KKwltcGZyX2Rpdl9zaShtcCxtcCx2LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvci89KGNvbnN0IGludCB2KQ0KK3sNCisJbXBmcl9kaXZfc2kobXAsbXAsdixkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3IvKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiKQ0KK3sNCisJLy8gcHJlYyhhL2IpID0gbWF4KHByZWMoYSkscHJlYyhiKSkNCisJaWYoYS5nZXRQcmVjaXNpb24oKSA+PSBiLmdldFByZWNpc2lvbigpKQkNCisJew0KKwkJcmV0dXJuICAgbXByZWFsKGEpIC89IGI7DQorCX1lbHNlew0KKw0KKwkJbXByZWFsIHgoYSk7DQorCQl4LnNldFByZWNpc2lvbihiLmdldFByZWNpc2lvbigpKTsNCisJCXJldHVybiB4IC89IGI7CQkNCisJfQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBjb25zdCBtcHJlYWwmIGEpDQorew0KKwltcHJlYWwgeChhKTsNCisJbXBmcl91aV9kaXYoeC5tcCxiLGEubXAsbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yLyhjb25zdCB1bnNpZ25lZCBpbnQgYiwgY29uc3QgbXByZWFsJiBhKQ0KK3sNCisJbXByZWFsIHgoYSk7DQorCW1wZnJfdWlfZGl2KHgubXAsYixhLm1wLG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvci8oY29uc3QgbG9uZyBpbnQgYiwgY29uc3QgbXByZWFsJiBhKQ0KK3sNCisJbXByZWFsIHgoYSk7DQorCW1wZnJfc2lfZGl2KHgubXAsYixhLm1wLG1wcmVhbDo6ZGVmYXVsdF9ybmQpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvci8oY29uc3QgaW50IGIsIGNvbnN0IG1wcmVhbCYgYSkNCit7DQorCW1wcmVhbCB4KGEpOw0KKwltcGZyX3NpX2Rpdih4Lm1wLGIsYS5tcCxtcHJlYWw6OmRlZmF1bHRfcm5kKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3IvKGNvbnN0IGRvdWJsZSAgYiwgY29uc3QgbXByZWFsJiBhKQ0KK3sNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDIsNCwwKSkNCisJbXByZWFsIHgoYSk7DQorCW1wZnJfZF9kaXYoeC5tcCxiLGEubXAsbXByZWFsOjpkZWZhdWx0X3JuZCk7DQorCXJldHVybiB4Ow0KKyNlbHNlDQorCXJldHVybiBtcHJlYWwoYikgLz0gYTsNCisjZW5kaWYNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBTaGlmdHMgb3BlcmF0b3JzIC0gTXVsdGlwbGljYXRpb24vRGl2aXNpb24gYnkgcG93ZXIgb2YgMg0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I8PD0oY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgdSkNCit7DQorCW1wZnJfbXVsXzJ1aShtcCxtcCx1LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcjw8PShjb25zdCB1bnNpZ25lZCBpbnQgdSkNCit7DQorCW1wZnJfbXVsXzJ1aShtcCxtcCxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4odSksZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPDw9KGNvbnN0IGxvbmcgaW50IHUpDQorew0KKwltcGZyX211bF8yc2kobXAsbXAsdSxkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I8PD0oY29uc3QgaW50IHUpDQorew0KKwltcGZyX211bF8yc2kobXAsbXAsc3RhdGljX2Nhc3Q8bG9uZyBpbnQ+KHUpLGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj4+PShjb25zdCB1bnNpZ25lZCBsb25nIGludCB1KQ0KK3sNCisJbXBmcl9kaXZfMnVpKG1wLG1wLHUsZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJiBtcHJlYWw6Om9wZXJhdG9yPj49KGNvbnN0IHVuc2lnbmVkIGludCB1KQ0KK3sNCisJbXBmcl9kaXZfMnVpKG1wLG1wLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50Pih1KSxkZWZhdWx0X3JuZCk7DQorCU1QUkVBTF9NU1ZDX0RFQlVHVklFV19DT0RFOw0KKwlyZXR1cm4gKnRoaXM7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6b3BlcmF0b3I+Pj0oY29uc3QgbG9uZyBpbnQgdSkNCit7DQorCW1wZnJfZGl2XzJzaShtcCxtcCx1LGRlZmF1bHRfcm5kKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpvcGVyYXRvcj4+PShjb25zdCBpbnQgdSkNCit7DQorCW1wZnJfZGl2XzJzaShtcCxtcCxzdGF0aWNfY2FzdDxsb25nIGludD4odSksZGVmYXVsdF9ybmQpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yPDwoY29uc3QgbXByZWFsJiB2LCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBrKQ0KK3sNCisJcmV0dXJuIG11bF8ydWkodixrKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvcjw8KGNvbnN0IG1wcmVhbCYgdiwgY29uc3QgdW5zaWduZWQgaW50IGspDQorew0KKwlyZXR1cm4gbXVsXzJ1aSh2LHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihrKSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3I8PChjb25zdCBtcHJlYWwmIHYsIGNvbnN0IGxvbmcgaW50IGspDQorew0KKwlyZXR1cm4gbXVsXzJzaSh2LGspOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yPDwoY29uc3QgbXByZWFsJiB2LCBjb25zdCBpbnQgaykNCit7DQorCXJldHVybiBtdWxfMnNpKHYsc3RhdGljX2Nhc3Q8bG9uZyBpbnQ+KGspKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvcj4+KGNvbnN0IG1wcmVhbCYgdiwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgaykNCit7DQorCXJldHVybiBkaXZfMnVpKHYsayk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgb3BlcmF0b3I+Pihjb25zdCBtcHJlYWwmIHYsIGNvbnN0IGxvbmcgaW50IGspDQorew0KKwlyZXR1cm4gZGl2XzJzaSh2LGspOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG9wZXJhdG9yPj4oY29uc3QgbXByZWFsJiB2LCBjb25zdCB1bnNpZ25lZCBpbnQgaykNCit7DQorCXJldHVybiBkaXZfMnVpKHYsc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGspKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBvcGVyYXRvcj4+KGNvbnN0IG1wcmVhbCYgdiwgY29uc3QgaW50IGspDQorew0KKwlyZXR1cm4gZGl2XzJzaSh2LHN0YXRpY19jYXN0PGxvbmcgaW50PihrKSk7DQorfQ0KKw0KKy8vIG11bF8ydWkNCitpbmxpbmUgY29uc3QgbXByZWFsIG11bF8ydWkoY29uc3QgbXByZWFsJiB2LCB1bnNpZ25lZCBsb25nIGludCBrLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX211bF8ydWkoeC5tcCx2Lm1wLGsscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQorLy8gbXVsXzJzaQ0KK2lubGluZSBjb25zdCBtcHJlYWwgbXVsXzJzaShjb25zdCBtcHJlYWwmIHYsIGxvbmcgaW50IGssIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfbXVsXzJzaSh4Lm1wLHYubXAsayxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGRpdl8ydWkoY29uc3QgbXByZWFsJiB2LCB1bnNpZ25lZCBsb25nIGludCBrLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2Rpdl8ydWkoeC5tcCx2Lm1wLGsscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBkaXZfMnNpKGNvbnN0IG1wcmVhbCYgdiwgbG9uZyBpbnQgaywgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9kaXZfMnNpKHgubXAsdi5tcCxrLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy9Cb29sZWFuIG9wZXJhdG9ycw0KK2lubGluZSBib29sIG9wZXJhdG9yID4JKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiKXsJcmV0dXJuIChtcGZyX2dyZWF0ZXJfcChhLm1wLGIubXApCQkhPTApOwl9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiKXsJcmV0dXJuIChtcGZyX2dyZWF0ZXJlcXVhbF9wKGEubXAsYi5tcCkJIT0wKTsJfQ0KK2lubGluZSBib29sIG9wZXJhdG9yIDwgIChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYil7CXJldHVybiAobXBmcl9sZXNzX3AoYS5tcCxiLm1wKQkJCSE9MCk7CX0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA8PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIpewlyZXR1cm4gKG1wZnJfbGVzc2VxdWFsX3AoYS5tcCxiLm1wKQkJIT0wKTsJfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYil7CXJldHVybiAobXBmcl9lcXVhbF9wKGEubXAsYi5tcCkJCQkhPTApOwl9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiKXsJcmV0dXJuIChtcGZyX2xlc3NncmVhdGVyX3AoYS5tcCxiLm1wKQkhPTApOwl9DQorDQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYgkpewlyZXR1cm4gKG1wZnJfY21wX3VpKGEubXAsYikgPT0gMCk7CX0NCitpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgbXByZWFsJiBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYgkJKXsJcmV0dXJuIChtcGZyX2NtcF91aShhLm1wLGIpID09IDApOwl9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbG9uZyBpbnQgYgkJCSl7CXJldHVybiAobXBmcl9jbXBfc2koYS5tcCxiKSA9PSAwKTsJfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGludCBiCQkJCSl7CXJldHVybiAobXBmcl9jbXBfc2koYS5tcCxiKSA9PSAwKTsJfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgZG91YmxlIGIJCSl7CXJldHVybiAobXBmcl9jbXBfbGQoYS5tcCxiKSA9PSAwKTsJfQ0KK2lubGluZSBib29sIG9wZXJhdG9yID09IChjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGRvdWJsZSBiCQkJKXsJcmV0dXJuIChtcGZyX2NtcF9kKGEubXAsYikgID09IDApOwl9DQorDQorDQoraW5saW5lIGJvb2wgaXNuYW4JKGNvbnN0IG1wcmVhbCYgdil7CXJldHVybiAobXBmcl9uYW5fcCh2Lm1wKQkJIT0gMCk7CX0NCitpbmxpbmUgYm9vbCBpc2luZgkoY29uc3QgbXByZWFsJiB2KXsJcmV0dXJuIChtcGZyX2luZl9wKHYubXApCQkhPSAwKTsJfQ0KK2lubGluZSBib29sIGlzZmluaXRlKGNvbnN0IG1wcmVhbCYgdil7CXJldHVybiAobXBmcl9udW1iZXJfcCh2Lm1wKQkJIT0gMCk7CX0NCitpbmxpbmUgYm9vbCBpc3plcm8JKGNvbnN0IG1wcmVhbCYgdil7CXJldHVybiAobXBmcl96ZXJvX3Aodi5tcCkJCSE9IDApOwl9DQoraW5saW5lIGJvb2wgaXNpbnQJKGNvbnN0IG1wcmVhbCYgdil7CXJldHVybiAobXBmcl9pbnRlZ2VyX3Aodi5tcCkJIT0gMCk7CX0NCisNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDMsMCwwKSkNCitpbmxpbmUgYm9vbCBpc3JlZ3VsYXIoY29uc3QgbXByZWFsJiB2KXsJcmV0dXJuIChtcGZyX3JlZ3VsYXJfcCh2Lm1wKSk7fQ0KKyNlbmRpZiANCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIFR5cGUgQ29udmVydGVycw0KK2lubGluZSBsb25nCQkJCW1wcmVhbDo6dG9Mb25nKCkJY29uc3QJewlyZXR1cm4gbXBmcl9nZXRfc2kobXAsR01QX1JORFopOwl9DQoraW5saW5lIHVuc2lnbmVkIGxvbmcJbXByZWFsOjp0b1VMb25nKCkJY29uc3QJewlyZXR1cm4gbXBmcl9nZXRfdWkobXAsR01QX1JORFopOwl9DQoraW5saW5lIGRvdWJsZQkJCW1wcmVhbDo6dG9Eb3VibGUoKQljb25zdAl7CXJldHVybiBtcGZyX2dldF9kKG1wLGRlZmF1bHRfcm5kKTsJfQ0KK2lubGluZSBsb25nIGRvdWJsZQkJbXByZWFsOjp0b0xEb3VibGUoKQljb25zdAl7CXJldHVybiBtcGZyX2dldF9sZChtcCxkZWZhdWx0X3JuZCk7CX0NCisNCisjaWYgZGVmaW5lZCAoTVBSRUFMX0hBVkVfSU5UNjRfU1VQUE9SVCkNCitpbmxpbmUgaW50NjRfdAkgbXByZWFsOjp0b0ludDY0KCkJY29uc3R7CXJldHVybiBtcGZyX2dldF9zaihtcCxHTVBfUk5EWik7CX0NCitpbmxpbmUgdWludDY0X3QJIG1wcmVhbDo6dG9VSW50NjQoKQljb25zdHsJcmV0dXJuIG1wZnJfZ2V0X3VqKG1wLEdNUF9STkRaKTsJfQ0KKyNlbmRpZg0KKw0KK2lubGluZSA6Om1wZnJfcHRyCQltcHJlYWw6Om1wZnJfcHRyKCkJCQl7CXJldHVybiBtcDsJfQ0KK2lubGluZSA6Om1wZnJfc3JjcHRyCW1wcmVhbDo6bXBmcl9zcmNwdHIoKSBjb25zdAl7CXJldHVybiBjb25zdF9jYXN0PCA6Om1wZnJfc3JjcHRyID4obXApOwl9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyAJQml0cyAtIGRlY2ltYWwgZGlnaXRzIHJlbGF0aW9uDQorLy8JCWJpdHMgICA9IGNlaWwoZGlnaXRzKmxvZ1syXSgxMCkpDQorLy8JCWRpZ2l0cyA9IGZsb29yKGJpdHMqbG9nWzEwXSgyKSkNCisNCitpbmxpbmUgbXBfcHJlY190IGRpZ2l0czJiaXRzKGludCBkKQ0KK3sNCisJY29uc3QgZG91YmxlIExPRzJfMTAgPSAzLjMyMTkyODA5NDg4NzM2MjQ7DQorDQorCWQgPSAxMD5kPzEwOmQ7DQorDQorCXJldHVybiAobXBfcHJlY190KXN0ZDo6Y2VpbCgoZCkqTE9HMl8xMCk7DQorfQ0KKw0KK2lubGluZSBpbnQgYml0czJkaWdpdHMobXBfcHJlY190IGIpDQorew0KKwljb25zdCBkb3VibGUgTE9HMTBfMiA9IDAuMzAxMDI5OTk1NjYzOTgxMTk7DQorDQorCWIgPSAzND5iPzM0OmI7DQorDQorCXJldHVybiAoaW50KXN0ZDo6Zmxvb3IoKGIpKkxPRzEwXzIpOw0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIFNldC9HZXQgbnVtYmVyIHByb3BlcnRpZXMNCitpbmxpbmUgaW50IHNnbihjb25zdCBtcHJlYWwmIHYpDQorew0KKwlpbnQgciA9IG1wZnJfc2lnbmJpdCh2Lm1wKTsNCisJcmV0dXJuIChyPjA/LTE6MSk7DQorfQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6c2V0U2lnbihpbnQgc2lnbiwgbXBfcm5kX3QgUm91bmRpbmdNb2RlKQ0KK3sNCisJbXBmcl9zZXRzaWduKG1wLG1wLChzaWduPDA/MTowKSxSb3VuZGluZ01vZGUpOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgaW50IG1wcmVhbDo6Z2V0UHJlY2lzaW9uKCkgY29uc3QNCit7DQorCXJldHVybiBtcGZyX2dldF9wcmVjKG1wKTsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpzZXRQcmVjaXNpb24oaW50IFByZWNpc2lvbiwgbXBfcm5kX3QgUm91bmRpbmdNb2RlKQ0KK3sNCisJbXBmcl9wcmVjX3JvdW5kKG1wLFByZWNpc2lvbiwgUm91bmRpbmdNb2RlKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9DQorDQoraW5saW5lIG1wcmVhbCYgbXByZWFsOjpzZXRJbmYoaW50IHNpZ24pIA0KK3sgDQorCW1wZnJfc2V0X2luZihtcCxzaWduKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiAqdGhpczsNCit9CQ0KKw0KK2lubGluZSBtcHJlYWwmIG1wcmVhbDo6c2V0TmFuKCkgDQorew0KKwltcGZyX3NldF9uYW4obXApOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXByZWFsJgltcHJlYWw6OnNldFplcm8oaW50IHNpZ24pDQorew0KKwltcGZyX3NldF96ZXJvKG1wLHNpZ24pOw0KKwlNUFJFQUxfTVNWQ19ERUJVR1ZJRVdfQ09ERTsNCisJcmV0dXJuICp0aGlzOw0KK30NCisNCitpbmxpbmUgbXBfcHJlY190IG1wcmVhbDo6Z2V0X3ByZWMoKSBjb25zdA0KK3sNCisJcmV0dXJuIG1wZnJfZ2V0X3ByZWMobXApOw0KK30NCisNCitpbmxpbmUgdm9pZCBtcHJlYWw6OnNldF9wcmVjKG1wX3ByZWNfdCBwcmVjLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wZnJfcHJlY19yb3VuZChtcCxwcmVjLHJuZF9tb2RlKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorfQ0KKw0KK2lubGluZSBtcF9leHBfdCBtcHJlYWw6OmdldF9leHAgKCkNCit7DQorCXJldHVybiBtcGZyX2dldF9leHAobXApOw0KK30NCisNCitpbmxpbmUgaW50IG1wcmVhbDo6c2V0X2V4cCAobXBfZXhwX3QgZSkNCit7DQorCWludCB4ID0gbXBmcl9zZXRfZXhwKG1wLCBlKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGZyZXhwKGNvbnN0IG1wcmVhbCYgdiwgbXBfZXhwX3QqIGV4cCkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwkqZXhwID0geC5nZXRfZXhwKCk7DQorCXguc2V0X2V4cCgwKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbGRleHAoY29uc3QgbXByZWFsJiB2LCBtcF9leHBfdCBleHApDQorew0KKwltcHJlYWwgeCh2KTsNCisNCisJLy8gcm91bmRpbmcgaXMgbm90IGltcG9ydGFudCBzaW5jZSB3ZSBqdXN0IGluY3JlYXNpbmcgdGhlIGV4cG9uZW50DQorCW1wZnJfbXVsXzJzaSh4Lm1wLHgubXAsZXhwLG1wcmVhbDo6ZGVmYXVsdF9ybmQpOyANCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbWFjaGluZV9lcHNpbG9uKG1wX3ByZWNfdCBwcmVjKQ0KK3sNCisJLy8gdGhlIHNtYWxsZXN0IGVwcyBzdWNoIHRoYXQgMS4wK2VwcyAhPSAxLjANCisJLy8gZGVwZW5kcyAob2YgY2F1c2UpIG9uIHRoZSBwcmVjaXNpb24NCisJcmV0dXJuIG1hY2hpbmVfZXBzaWxvbihtcHJlYWwoMSxwcmVjKSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbWFjaGluZV9lcHNpbG9uKGNvbnN0IG1wcmVhbCYgeCkNCit7CQ0KKwlpZiggeCA8IDApDQorCXsNCisJCXJldHVybiBuZXh0YWJvdmUoLXgpK3g7DQorCX1lbHNlew0KKwkJcmV0dXJuIG5leHRhYm92ZSh4KS14Ow0KKwl9DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbXByZWFsX21pbihtcF9wcmVjX3QgcHJlYykNCit7DQorCS8vIG1pbiA9IDEvMioyXmVtaW4gPSAyXihlbWluLTEpDQorDQorCXJldHVybiBtcHJlYWwoMSxwcmVjKSA8PCBtcHJlYWw6OmdldF9lbWluKCktMTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBtcHJlYWxfbWF4KG1wX3ByZWNfdCBwcmVjKQ0KK3sNCisJLy8gbWF4ID0gKDEtZXBzKSoyXmVtYXgsIGFzc3VtZSBlcHMgPSAwPywgDQorCS8vIGFuZCB1c2UgZW1heC0xIHRvIHByZXZlbnQgdmFsdWUgdG8gYmUgK2luZg0KKwkvLyBtYXggPSAyXihlbWF4LTEpDQorDQorCXJldHVybiBtcHJlYWwoMSxwcmVjKSA8PCBtcHJlYWw6OmdldF9lbWF4KCktMTsNCit9DQorDQoraW5saW5lIGJvb2wgaXNFcXVhbFVscHMoY29uc3QgbXByZWFsJiBhLCBjb25zdCBtcHJlYWwmIGIsIGludCBtYXhVbHBzKQ0KK3sNCisgIC8qDQorICAgbWF4VWxwcyAtIGEgYW5kIGIgY2FuIGJlIGFwYXJ0IGJ5IG1heFVscHMgYmluYXJ5IG51bWJlcnMuIA0KKyAgKi8NCisgIHJldHVybiBhYnMoYSAtIGIpIDw9IG1hY2hpbmVfZXBzaWxvbigobWF4KShhYnMoYSksIGFicyhiKSkpICogbWF4VWxwczsNCit9DQorDQoraW5saW5lIGJvb2wgaXNFcXVhbEZ1enp5KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiLCBjb25zdCBtcHJlYWwmIGVwcykNCit7DQorCXJldHVybiBhYnMoYSAtIGIpIDw9IChtaW4pKGFicyhhKSwgYWJzKGIpKSAqIGVwczsNCit9DQorDQoraW5saW5lIGJvb2wgaXNFcXVhbEZ1enp5KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiKQ0KK3sNCisJcmV0dXJuIGlzRXF1YWxGdXp6eShhLGIsbWFjaGluZV9lcHNpbG9uKChzdGQ6Om1pbikoYWJzKGEpLCBhYnMoYikpKSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbW9kZihjb25zdCBtcHJlYWwmIHYsIG1wcmVhbCYgbikNCit7DQorCW1wcmVhbCBmcmFjKHYpOw0KKw0KKwkvLyByb3VuZGluZyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIHdlIGFyZSB1c2luZyB0aGUgc2FtZSBudW1iZXINCisJbXBmcl9mcmFjKGZyYWMubXAsZnJhYy5tcCxtcHJlYWw6OmRlZmF1bHRfcm5kKTsJDQorCW1wZnJfdHJ1bmMobi5tcCx2Lm1wKTsNCisJcmV0dXJuIGZyYWM7DQorfQ0KKw0KK2lubGluZSBpbnQgbXByZWFsOjpjaGVja19yYW5nZSAoaW50IHQsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIG1wZnJfY2hlY2tfcmFuZ2UobXAsdCxybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBpbnQgbXByZWFsOjpzdWJub3JtYWxpemUgKGludCB0LG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJaW50IHIgPSBtcGZyX3N1Ym5vcm1hbGl6ZShtcCx0LHJuZF9tb2RlKTsNCisJTVBSRUFMX01TVkNfREVCVUdWSUVXX0NPREU7DQorCXJldHVybiByOw0KK30NCisNCitpbmxpbmUgbXBfZXhwX3QgbXByZWFsOjpnZXRfZW1pbiAodm9pZCkNCit7DQorCXJldHVybiBtcGZyX2dldF9lbWluKCk7DQorfQ0KKw0KK2lubGluZSBpbnQgbXByZWFsOjpzZXRfZW1pbiAobXBfZXhwX3QgZXhwKQ0KK3sNCisJcmV0dXJuIG1wZnJfc2V0X2VtaW4oZXhwKTsNCit9DQorDQoraW5saW5lIG1wX2V4cF90IG1wcmVhbDo6Z2V0X2VtYXggKHZvaWQpDQorew0KKwlyZXR1cm4gbXBmcl9nZXRfZW1heCgpOw0KK30NCisNCitpbmxpbmUgaW50IG1wcmVhbDo6c2V0X2VtYXggKG1wX2V4cF90IGV4cCkNCit7DQorCXJldHVybiBtcGZyX3NldF9lbWF4KGV4cCk7DQorfQ0KKw0KK2lubGluZSBtcF9leHBfdCBtcHJlYWw6OmdldF9lbWluX21pbiAodm9pZCkNCit7DQorCXJldHVybiBtcGZyX2dldF9lbWluX21pbigpOw0KK30NCisNCitpbmxpbmUgbXBfZXhwX3QgbXByZWFsOjpnZXRfZW1pbl9tYXggKHZvaWQpDQorew0KKwlyZXR1cm4gbXBmcl9nZXRfZW1pbl9tYXgoKTsNCit9DQorDQoraW5saW5lIG1wX2V4cF90IG1wcmVhbDo6Z2V0X2VtYXhfbWluICh2b2lkKQ0KK3sNCisJcmV0dXJuIG1wZnJfZ2V0X2VtYXhfbWluKCk7DQorfQ0KKw0KK2lubGluZSBtcF9leHBfdCBtcHJlYWw6OmdldF9lbWF4X21heCAodm9pZCkNCit7DQorCXJldHVybiBtcGZyX2dldF9lbWF4X21heCgpOw0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FyKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9zcXIoeC5tcCx4Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FydChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfc3FydCh4Lm1wLHgubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBzcXJ0KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHg7DQorCW1wZnJfc3FydF91aSh4Lm1wLHYscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBzcXJ0KGNvbnN0IHVuc2lnbmVkIGludCB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBzcXJ0KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50Pih2KSxybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FydChjb25zdCBsb25nIGludCB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCWlmICh2Pj0wKQlyZXR1cm4gc3FydChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4odikscm5kX21vZGUpOw0KKwllbHNlCQlyZXR1cm4gbXByZWFsKCkuc2V0TmFuKCk7IC8vIE5hTiAgDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc3FydChjb25zdCBpbnQgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlpZiAodj49MCkJcmV0dXJuIHNxcnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KHYpLHJuZF9tb2RlKTsNCisJZWxzZQkJcmV0dXJuIG1wcmVhbCgpLnNldE5hbigpOyAvLyBOYU4NCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBzcXJ0KGNvbnN0IGxvbmcgZG91YmxlIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHNxcnQobXByZWFsKHYpLHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBzcXJ0KGNvbnN0IGRvdWJsZSB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBzcXJ0KG1wcmVhbCh2KSxybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY2JydChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfY2JydCh4Lm1wLHgubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCByb290KGNvbnN0IG1wcmVhbCYgdiwgdW5zaWduZWQgbG9uZyBpbnQgaywgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9yb290KHgubXAseC5tcCxrLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZmFicyhjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfYWJzKHgubXAseC5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGFicyhjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfYWJzKHgubXAseC5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGRpbShjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeChhKTsNCisJbXBmcl9kaW0oeC5tcCxhLm1wLGIubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGludCBjbXBhYnMoY29uc3QgbXByZWFsJiBhLGNvbnN0IG1wcmVhbCYgYikNCit7DQorCXJldHVybiBtcGZyX2NtcGFicyhhLm1wLGIubXApOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGxvZyAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9sb2coeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbG9nMihjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfbG9nMih4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBsb2cxMChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfbG9nMTAoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZXhwKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9leHAoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZXhwMihjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfZXhwMih4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBleHAxMChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfZXhwMTAoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY29zKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9jb3MoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc2luKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9zaW4oeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgdGFuKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl90YW4oeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc2VjKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9zZWMoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY3NjKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9jc2MoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY290KGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9jb3QoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBpbnQgc2luX2NvcyhtcHJlYWwmIHMsIG1wcmVhbCYgYywgY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBtcGZyX3Npbl9jb3Mocy5tcCxjLm1wLHYubXAscm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGFjb3MgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9hY29zKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGFzaW4gKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9hc2luKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGF0YW4gKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9hdGFuKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGFjb3QgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gYXRhbigxL3YsIHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBhc2VjIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIGFjb3MoMS92LCBybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYWNzYyAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBhc2luKDEvdiwgcm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGFjb3RoIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIGF0YW5oKDEvdiwgcm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGFzZWNoIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIGFjb3NoKDEvdiwgcm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGFjc2NoIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIGFzaW5oKDEvdiwgcm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGF0YW4yIChjb25zdCBtcHJlYWwmIHksIGNvbnN0IG1wcmVhbCYgeCwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgYTsNCisJbXBfcHJlY190IHlwLCB4cDsNCisNCisJeXAgPSB5LmdldF9wcmVjKCk7IA0KKwl4cCA9IHguZ2V0X3ByZWMoKTsgDQorDQorCWEuc2V0X3ByZWMoeXA+eHA/eXA6eHApOw0KKw0KKwltcGZyX2F0YW4yKGEubXAsIHkubXAsIHgubXAsIHJuZF9tb2RlKTsNCisNCisJcmV0dXJuIGE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY29zaCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2Nvc2goeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc2luaCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX3NpbmgoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgdGFuaCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX3RhbmgoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgc2VjaCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX3NlY2goeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY3NjaCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2NzY2goeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY290aCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2NvdGgoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYWNvc2ggIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfYWNvc2goeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYXNpbmggIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfYXNpbmgoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYXRhbmggIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfYXRhbmgoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgaHlwb3QgKGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCBhOw0KKwltcF9wcmVjX3QgeXAsIHhwOw0KKw0KKwl5cCA9IHkuZ2V0X3ByZWMoKTsgDQorCXhwID0geC5nZXRfcHJlYygpOyANCisNCisJYS5zZXRfcHJlYyh5cD54cD95cDp4cCk7DQorDQorCW1wZnJfaHlwb3QoYS5tcCwgeC5tcCwgeS5tcCwgcm5kX21vZGUpOw0KKw0KKwlyZXR1cm4gYTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCByZW1haW5kZXIgKGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7CQ0KKwltcHJlYWwgYTsNCisJbXBfcHJlY190IHlwLCB4cDsNCisNCisJeXAgPSB5LmdldF9wcmVjKCk7IA0KKwl4cCA9IHguZ2V0X3ByZWMoKTsgDQorDQorCWEuc2V0X3ByZWMoeXA+eHA/eXA6eHApOw0KKw0KKwltcGZyX3JlbWFpbmRlcihhLm1wLCB4Lm1wLCB5Lm1wLCBybmRfbW9kZSk7DQorDQorCXJldHVybiBhOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGZhY191aSAodW5zaWduZWQgbG9uZyBpbnQgdiwgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgoMCxwcmVjKTsNCisJbXBmcl9mYWNfdWkoeC5tcCx2LHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbG9nMXAgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfbG9nMXAoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZXhwbTEgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfZXhwbTEoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZWludCAgIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfZWludCh4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBnYW1tYSAoY29uc3QgbXByZWFsJiB4LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCBGdW5jdGlvblZhbHVlKHgpOw0KKw0KKwkvLyB4IDwgMDogZ2FtbWEoLXgpID0gLXBpLyh4ICogZ2FtbWEoeCkgKiBzaW4ocGkqeCkpDQorDQorCW1wZnJfZ2FtbWEoRnVuY3Rpb25WYWx1ZS5tcCwgeC5tcCwgcm5kX21vZGUpOw0KKw0KKwlyZXR1cm4gRnVuY3Rpb25WYWx1ZTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBsbmdhbW1hIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfbG5nYW1tYSh4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBsZ2FtbWEgKGNvbnN0IG1wcmVhbCYgdiwgaW50ICpzaWducCwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJaW50IHRzaWducDsNCisNCisJaWYoc2lnbnApDQorCQltcGZyX2xnYW1tYSh4Lm1wLHNpZ25wLHYubXAscm5kX21vZGUpOw0KKwllbHNlDQorCQltcGZyX2xnYW1tYSh4Lm1wLCZ0c2lnbnAsdi5tcCxybmRfbW9kZSk7DQorDQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHpldGEgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl96ZXRhKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGVyZiAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2VyZih4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBlcmZjIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfZXJmYyh4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBiZXNzZWxqMCAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2owKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGJlc3NlbGoxIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfajEoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYmVzc2Vsam4gKGxvbmcgbiwgY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2puKHgubXAsbix2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYmVzc2VseTAgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl95MCh4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBiZXNzZWx5MSAoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX3kxKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGJlc3NlbHluIChsb25nIG4sIGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl95bih4Lm1wLG4sdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIE1QRlIgMi40LjAgU3BlY2lmaWNzDQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgyLDQsMCkpDQorDQoraW5saW5lIGludCBzaW5oX2Nvc2gobXByZWFsJiBzLCBtcHJlYWwmIGMsIGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gbXBmcl9zaW5oX2Nvc2gocy5tcCxjLm1wLHYubXAscm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGxpMihjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfbGkyKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGZtb2QgKGNvbnN0IG1wcmVhbCYgeCwgY29uc3QgbXByZWFsJiB5LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCBhOw0KKwltcF9wcmVjX3QgeXAsIHhwOw0KKw0KKwl5cCA9IHkuZ2V0X3ByZWMoKTsgDQorCXhwID0geC5nZXRfcHJlYygpOyANCisNCisJYS5zZXRfcHJlYyh5cD54cD95cDp4cCk7DQorDQorCW1wZnJfZm1vZChhLm1wLCB4Lm1wLCB5Lm1wLCBybmRfbW9kZSk7DQorDQorCXJldHVybiBhOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHJlY19zcXJ0KGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9yZWNfc3FydCh4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorI2VuZGlmIC8vICBNUEZSIDIuNC4wIFNwZWNpZmljcw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gTVBGUiAzLjAuMCBTcGVjaWZpY3MNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDMsMCwwKSkNCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGRpZ2FtbWEoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2RpZ2FtbWEoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgYWkoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2FpKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCisjZW5kaWYgLy8gTVBGUiAzLjAuMCBTcGVjaWZpY3MNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENvbnN0YW50cw0KK2lubGluZSBjb25zdCBtcHJlYWwgY29uc3RfbG9nMiAobXBfcHJlY190IHByZWMsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHg7DQorCXguc2V0X3ByZWMocHJlYyk7DQorCW1wZnJfY29uc3RfbG9nMih4Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgY29uc3RfcGkgKG1wX3ByZWNfdCBwcmVjLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4Ow0KKwl4LnNldF9wcmVjKHByZWMpOw0KKwltcGZyX2NvbnN0X3BpKHgubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBjb25zdF9ldWxlciAobXBfcHJlY190IHByZWMsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHg7DQorCXguc2V0X3ByZWMocHJlYyk7DQorCW1wZnJfY29uc3RfZXVsZXIoeC5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGNvbnN0X2NhdGFsYW4gKG1wX3ByZWNfdCBwcmVjLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4Ow0KKwl4LnNldF9wcmVjKHByZWMpOw0KKwltcGZyX2NvbnN0X2NhdGFsYW4oeC5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGNvbnN0X2luZmluaXR5IChpbnQgc2lnbiwgbXBfcHJlY190IHByZWMsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHg7DQorCXguc2V0X3ByZWMocHJlYyxybmRfbW9kZSk7DQorCW1wZnJfc2V0X2luZih4Lm1wLCBzaWduKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gSW50ZWdlciBSZWxhdGVkIEZ1bmN0aW9ucw0KK2lubGluZSBjb25zdCBtcHJlYWwgcmludChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfcmludCh4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBjZWlsKGNvbnN0IG1wcmVhbCYgdikNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX2NlaWwoeC5tcCx2Lm1wKTsNCisJcmV0dXJuIHg7DQorDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZmxvb3IoY29uc3QgbXByZWFsJiB2KQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfZmxvb3IoeC5tcCx2Lm1wKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcm91bmQoY29uc3QgbXByZWFsJiB2KQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfcm91bmQoeC5tcCx2Lm1wKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgdHJ1bmMoY29uc3QgbXByZWFsJiB2KQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfdHJ1bmMoeC5tcCx2Lm1wKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcmludF9jZWlsIChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfcmludF9jZWlsKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHJpbnRfZmxvb3IoY29uc3QgbXByZWFsJiB2LCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KHYpOw0KKwltcGZyX3JpbnRfZmxvb3IoeC5tcCx2Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcmludF9yb3VuZChjb25zdCBtcHJlYWwmIHYsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgodik7DQorCW1wZnJfcmludF9yb3VuZCh4Lm1wLHYubXAscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCByaW50X3RydW5jKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9yaW50X3RydW5jKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGZyYWMgKGNvbnN0IG1wcmVhbCYgdiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeCh2KTsNCisJbXBmcl9mcmFjKHgubXAsdi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zDQoraW5saW5lIHZvaWQgc3dhcChtcHJlYWwmIGEsIG1wcmVhbCYgYikgDQorew0KKwltcGZyX3N3YXAoYS5tcCxiLm1wKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCAobWF4KShjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSkNCit7DQorCXJldHVybiAoeD55P3g6eSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgKG1pbikoY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHkpDQorew0KKwlyZXR1cm4gKHg8eT94OnkpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIGZtYXgoY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHksIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIGE7DQorCW1wZnJfbWF4KGEubXAseC5tcCx5Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIGE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgZm1pbihjb25zdCBtcHJlYWwmIHgsIGNvbnN0IG1wcmVhbCYgeSwgIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIGE7DQorCW1wZnJfbWluKGEubXAseC5tcCx5Lm1wLHJuZF9tb2RlKTsNCisJcmV0dXJuIGE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbmV4dHRvd2FyZCAoY29uc3QgbXByZWFsJiB4LCBjb25zdCBtcHJlYWwmIHkpDQorew0KKwltcHJlYWwgYSh4KTsNCisJbXBmcl9uZXh0dG93YXJkKGEubXAseS5tcCk7DQorCXJldHVybiBhOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIG5leHRhYm92ZSAgKGNvbnN0IG1wcmVhbCYgeCkNCit7DQorCW1wcmVhbCBhKHgpOw0KKwltcGZyX25leHRhYm92ZShhLm1wKTsNCisJcmV0dXJuIGE7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgbmV4dGJlbG93ICAoY29uc3QgbXByZWFsJiB4KQ0KK3sNCisJbXByZWFsIGEoeCk7DQorCW1wZnJfbmV4dGJlbG93KGEubXApOw0KKwlyZXR1cm4gYTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCB1cmFuZG9tYiAoZ21wX3JhbmRzdGF0ZV90JiBzdGF0ZSkNCit7DQorCW1wcmVhbCB4Ow0KKwltcGZyX3VyYW5kb21iKHgubXAsc3RhdGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQorI2lmIChNUEZSX1ZFUlNJT04gPj0gTVBGUl9WRVJTSU9OX05VTSgzLDAsMCkpDQorLy8gdXNlIGdtcF9yYW5kaW5pdF9kZWZhdWx0KCkgdG8gaW5pdCBzdGF0ZSwgZ21wX3JhbmRjbGVhcigpIHRvIGNsZWFyDQoraW5saW5lIGNvbnN0IG1wcmVhbCB1cmFuZG9tIChnbXBfcmFuZHN0YXRlX3QmIHN0YXRlLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4Ow0KKwltcGZyX3VyYW5kb20oeC5tcCxzdGF0ZSxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisjZW5kaWYgDQorDQorI2lmIChNUEZSX1ZFUlNJT04gPD0gTVBGUl9WRVJTSU9OX05VTSgyLDQsMikpDQoraW5saW5lIGNvbnN0IG1wcmVhbCByYW5kb20yIChtcF9zaXplX3Qgc2l6ZSwgbXBfZXhwX3QgZXhwKQ0KK3sNCisJbXByZWFsIHg7DQorCW1wZnJfcmFuZG9tMih4Lm1wLHNpemUsZXhwKTsNCisJcmV0dXJuIHg7DQorfQ0KKyNlbmRpZg0KKw0KKy8vIFVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24NCisvLyBhID0gcmFuZG9tKHNlZWQpOyA8LSBpbml0aWFsaXphdGlvbiAmIGZpcnN0IHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbg0KKy8vIGEgPSByYW5kb20oKTsgICAgIDwtIG5leHQgcmFuZG9tIG51bWJlcnMgZ2VuZXJhdGlvbg0KKy8vIHNlZWQgIT0gMA0KK2lubGluZSBjb25zdCBtcHJlYWwgcmFuZG9tKHVuc2lnbmVkIGludCBzZWVkKQ0KK3sNCisNCisjaWYgKE1QRlJfVkVSU0lPTiA+PSBNUEZSX1ZFUlNJT05fTlVNKDMsMCwwKSkNCisJc3RhdGljIGdtcF9yYW5kc3RhdGVfdCBzdGF0ZTsNCisJc3RhdGljIGJvb2wgaXNGaXJzdFRpbWUgPSB0cnVlOw0KKw0KKwlpZihpc0ZpcnN0VGltZSkNCisJew0KKwkJZ21wX3JhbmRpbml0X2RlZmF1bHQoc3RhdGUpOw0KKwkJZ21wX3JhbmRzZWVkX3VpKHN0YXRlLDApOw0KKwkJaXNGaXJzdFRpbWUgPSBmYWxzZTsNCisJfQ0KKw0KKwlpZihzZWVkICE9IDApCWdtcF9yYW5kc2VlZF91aShzdGF0ZSxzZWVkKTsNCisNCisJcmV0dXJuIG1wZnI6OnVyYW5kb20oc3RhdGUpOw0KKyNlbHNlDQorCWlmKHNlZWQgIT0gMCkJc3RkOjpzcmFuZChzZWVkKTsNCisJcmV0dXJuIG1wZnI6Om1wcmVhbChzdGQ6OnJhbmQoKS8oZG91YmxlKVJBTkRfTUFYKTsNCisjZW5kaWYNCisNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBTZXQvR2V0IGdsb2JhbCBwcm9wZXJ0aWVzDQoraW5saW5lIHZvaWQgbXByZWFsOjpzZXRfZGVmYXVsdF9wcmVjKG1wX3ByZWNfdCBwcmVjKQ0KK3sgDQorCWRlZmF1bHRfcHJlYyA9IHByZWM7DQorCW1wZnJfc2V0X2RlZmF1bHRfcHJlYyhwcmVjKTsgDQorfQ0KKw0KK2lubGluZSBtcF9wcmVjX3QgbXByZWFsOjpnZXRfZGVmYXVsdF9wcmVjKCkNCit7IA0KKwlyZXR1cm4gKG1wZnJfZ2V0X2RlZmF1bHRfcHJlYykoKTsNCit9DQorDQoraW5saW5lIHZvaWQgbXByZWFsOjpzZXRfZGVmYXVsdF9iYXNlKGludCBiYXNlKQ0KK3sgDQorCWRlZmF1bHRfYmFzZSA9IGJhc2U7DQorfQ0KKw0KK2lubGluZSBpbnQgbXByZWFsOjpnZXRfZGVmYXVsdF9iYXNlKCkNCit7IA0KKwlyZXR1cm4gZGVmYXVsdF9iYXNlOw0KK30NCisNCitpbmxpbmUgdm9pZCBtcHJlYWw6OnNldF9kZWZhdWx0X3JuZChtcF9ybmRfdCBybmRfbW9kZSkNCit7IA0KKwlkZWZhdWx0X3JuZCA9ICBybmRfbW9kZTsNCisJbXBmcl9zZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlKHJuZF9tb2RlKTsgDQorfQ0KKw0KK2lubGluZSBtcF9ybmRfdCBtcHJlYWw6OmdldF9kZWZhdWx0X3JuZCgpDQoreyANCisJcmV0dXJuIHN0YXRpY19jYXN0PG1wX3JuZF90PigobXBmcl9nZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlKSgpKTsNCit9DQorDQoraW5saW5lIHZvaWQgbXByZWFsOjpzZXRfZG91YmxlX2JpdHMoaW50IGRiaXRzKQ0KK3sgDQorCWRvdWJsZV9iaXRzID0gZGJpdHM7DQorfQ0KKw0KK2lubGluZSBpbnQgbXByZWFsOjpnZXRfZG91YmxlX2JpdHMoKQ0KK3sgDQorCXJldHVybiBkb3VibGVfYml0czsNCit9DQorDQoraW5saW5lIGJvb2wgbXByZWFsOjpmaXRzX2luX2JpdHMoZG91YmxlIHgsIGludCBuKQ0KK3sgICANCisJaW50IGk7DQorCWRvdWJsZSB0Ow0KKwlyZXR1cm4gSXNJbmYoeCkgfHwgKHN0ZDo6bW9kZiAoIHN0ZDo6bGRleHAgKCBzdGQ6OmZyZXhwICggeCwgJmkgKSwgbiApLCAmdCApID09IDAuMCk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KGEpOw0KKwltcGZyX3Bvdyh4Lm1wLHgubXAsYi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IG1wel90IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgoYSk7DQorCW1wZnJfcG93X3ooeC5tcCx4Lm1wLGIscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgbXByZWFsJiBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KGEpOw0KKwltcGZyX3Bvd191aSh4Lm1wLHgubXAsYixybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IHVuc2lnbmVkIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBwb3coYSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBtcHJlYWwmIGEsIGNvbnN0IGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJbXByZWFsIHgoYSk7DQorCW1wZnJfcG93X3NpKHgubXAseC5tcCxiLHJuZF9tb2RlKTsNCisJcmV0dXJuIHg7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhhLHN0YXRpY19jYXN0PGxvbmcgaW50PihiKSxybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IG1wcmVhbCYgYSwgY29uc3QgbG9uZyBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gcG93KGEsbXByZWFsKGIpLHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgbXByZWFsJiBhLCBjb25zdCBkb3VibGUgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gcG93KGEsbXByZWFsKGIpLHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCW1wcmVhbCB4KGEpOw0KKwltcGZyX3VpX3Bvdyh4Lm1wLGEsYi5tcCxybmRfbW9kZSk7DQorCXJldHVybiB4Ow0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBpbnQgYSwgY29uc3QgbXByZWFsJiBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLGIscm5kX21vZGUpOw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCBtcHJlYWwmIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJaWYgKGE+PTApIAlyZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxiLHJuZF9tb2RlKTsNCisJZWxzZQkJcmV0dXJuIHBvdyhtcHJlYWwoYSksYixybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGludCBhLCBjb25zdCBtcHJlYWwmIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJaWYgKGE+PTApIAlyZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxiLHJuZF9tb2RlKTsNCisJZWxzZQkJcmV0dXJuIHBvdyhtcHJlYWwoYSksYixybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgZG91YmxlIGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gcG93KG1wcmVhbChhKSxiLHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgZG91YmxlIGEsIGNvbnN0IG1wcmVhbCYgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gcG93KG1wcmVhbChhKSxiLHJuZF9tb2RlKTsNCit9DQorDQorLy8gcG93IHVuc2lnbmVkIGxvbmcgaW50DQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwltcHJlYWwgeChhKTsNCisJbXBmcl91aV9wb3dfdWkoeC5tcCxhLGIscm5kX21vZGUpOw0KKwlyZXR1cm4geDsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhhLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3dfdWkNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlpZihiPjApCXJldHVybiBwb3coYSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93X3VpDQorCWVsc2UJcmV0dXJuIHBvdyhhLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJaWYoYj4wKQlyZXR1cm4gcG93KGEsc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKwllbHNlCXJldHVybiBwb3coYSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhhLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhhLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQorLy8gcG93IHVuc2lnbmVkIGludA0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLGIscm5kX21vZGUpOyAvL21wZnJfdWlfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IHVuc2lnbmVkIGludCBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCWlmKGI+MCkJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKwllbHNlCXJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgaW50IGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCWlmKGI+MCkJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKwllbHNlCXJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgdW5zaWduZWQgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCB1bnNpZ25lZCBpbnQgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KK30NCisNCisvLyBwb3cgbG9uZyBpbnQNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCB1bnNpZ25lZCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCWlmIChhPjApIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLGIscm5kX21vZGUpOyAvL21wZnJfdWlfcG93X3VpDQorCWVsc2UJIHJldHVybiBwb3cobXByZWFsKGEpLGIscm5kX21vZGUpOyAvL21wZnJfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IHVuc2lnbmVkIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCWlmIChhPjApIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7ICAvL21wZnJfdWlfcG93X3VpDQorCWVsc2UJIHJldHVybiBwb3cobXByZWFsKGEpLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vbXBmcl9wb3dfdWkNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBpbnQgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlpZiAoYT4wKQ0KKwl7DQorCQlpZihiPjApIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3dfdWkNCisJCWVsc2UJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KKwl9ZWxzZXsNCisJCXJldHVybiBwb3cobXByZWFsKGEpLGIscm5kX21vZGUpOyAvLyBtcGZyX3Bvd19zaQ0KKwl9DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCWlmIChhPjApDQorCXsNCisJCWlmKGI+MCkgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKwkJZWxzZQlyZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93DQorCX1lbHNlew0KKwkJcmV0dXJuIHBvdyhtcHJlYWwoYSksc3RhdGljX2Nhc3Q8bG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy8gbXBmcl9wb3dfc2kNCisJfQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGludCBhLCBjb25zdCBsb25nIGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCWlmIChhPj0wKSAJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KKwllbHNlCQlyZXR1cm4gcG93KG1wcmVhbChhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfcG93DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgaW50IGEsIGNvbnN0IGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCWlmIChhPj0wKSAJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KKwllbHNlCQlyZXR1cm4gcG93KG1wcmVhbChhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfcG93DQorfQ0KKw0KKy8vIHBvdyBpbnQNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBpbnQgYSwgY29uc3QgdW5zaWduZWQgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlpZiAoYT4wKSByZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxiLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvd191aQ0KKwllbHNlCSByZXR1cm4gcG93KG1wcmVhbChhKSxiLHJuZF9tb2RlKTsgLy9tcGZyX3Bvd191aQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBpbnQgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJaWYgKGE+MCkgcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgIC8vbXBmcl91aV9wb3dfdWkNCisJZWxzZQkgcmV0dXJuIHBvdyhtcHJlYWwoYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3Bvd191aQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBpbnQgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlpZiAoYT4wKQ0KKwl7DQorCQlpZihiPjApIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3dfdWkNCisJCWVsc2UJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KKwl9ZWxzZXsNCisJCXJldHVybiBwb3cobXByZWFsKGEpLGIscm5kX21vZGUpOyAvLyBtcGZyX3Bvd19zaQ0KKwl9DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGludCBhLCBjb25zdCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlpZiAoYT4wKQ0KKwl7DQorCQlpZihiPjApIHJldHVybiBwb3coc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGEpLHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vbXBmcl91aV9wb3dfdWkNCisJCWVsc2UJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KKwl9ZWxzZXsNCisJCXJldHVybiBwb3cobXByZWFsKGEpLHN0YXRpY19jYXN0PGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vIG1wZnJfcG93X3NpDQorCX0NCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IGxvbmcgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJaWYgKGE+PTApIAlyZXR1cm4gcG93KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PihhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfdWlfcG93DQorCWVsc2UJCXJldHVybiBwb3cobXByZWFsKGEpLG1wcmVhbChiKSxybmRfbW9kZSk7IC8vbXBmcl9wb3cNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgaW50IGEsIGNvbnN0IGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCWlmIChhPj0wKSAJcmV0dXJuIHBvdyhzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYSksbXByZWFsKGIpLHJuZF9tb2RlKTsgLy9tcGZyX3VpX3Bvdw0KKwllbHNlCQlyZXR1cm4gcG93KG1wcmVhbChhKSxtcHJlYWwoYikscm5kX21vZGUpOyAvL21wZnJfcG93DQorfQ0KKw0KKy8vIHBvdyBsb25nIGRvdWJsZSANCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCBsb25nIGRvdWJsZSBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBwb3cobXByZWFsKGEpLG1wcmVhbChiKSxybmRfbW9kZSk7DQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGxvbmcgZG91YmxlIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhtcHJlYWwoYSksYixybmRfbW9kZSk7IC8vbXBmcl9wb3dfdWkNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgbG9uZyBkb3VibGUgYSwgY29uc3QgdW5zaWduZWQgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhtcHJlYWwoYSksc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBpbnQ+KGIpLHJuZF9tb2RlKTsgLy9tcGZyX3Bvd191aQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCBsb25nIGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBwb3cobXByZWFsKGEpLGIscm5kX21vZGUpOyAvLyBtcGZyX3Bvd19zaQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBsb25nIGRvdWJsZSBhLCBjb25zdCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gcG93KG1wcmVhbChhKSxzdGF0aWNfY2FzdDxsb25nIGludD4oYikscm5kX21vZGUpOyAvLyBtcGZyX3Bvd19zaQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgZG91YmxlIGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhtcHJlYWwoYSksbXByZWFsKGIpLHJuZF9tb2RlKTsNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgZG91YmxlIGEsIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW50IGIsIG1wX3JuZF90IHJuZF9tb2RlKQ0KK3sNCisJcmV0dXJuIHBvdyhtcHJlYWwoYSksYixybmRfbW9kZSk7IC8vIG1wZnJfcG93X3VpDQorfQ0KKw0KK2lubGluZSBjb25zdCBtcHJlYWwgcG93KGNvbnN0IGRvdWJsZSBhLCBjb25zdCB1bnNpZ25lZCBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gcG93KG1wcmVhbChhKSxzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oYikscm5kX21vZGUpOyAvLyBtcGZyX3Bvd191aQ0KK30NCisNCitpbmxpbmUgY29uc3QgbXByZWFsIHBvdyhjb25zdCBkb3VibGUgYSwgY29uc3QgbG9uZyBpbnQgYiwgbXBfcm5kX3Qgcm5kX21vZGUpDQorew0KKwlyZXR1cm4gcG93KG1wcmVhbChhKSxiLHJuZF9tb2RlKTsgLy8gbXBmcl9wb3dfc2kNCit9DQorDQoraW5saW5lIGNvbnN0IG1wcmVhbCBwb3coY29uc3QgZG91YmxlIGEsIGNvbnN0IGludCBiLCBtcF9ybmRfdCBybmRfbW9kZSkNCit7DQorCXJldHVybiBwb3cobXByZWFsKGEpLHN0YXRpY19jYXN0PGxvbmcgaW50PihiKSxybmRfbW9kZSk7IC8vIG1wZnJfcG93X3NpDQorfQ0KK30gLy8gRW5kIG9mIG1wZnIgbmFtZXNwYWNlDQorDQorLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2Ygc3RkOjpzd2FwIGZvciBtcHJlYWwgbnVtYmVycw0KKy8vIFRodXMgc3RhbmRhcmQgYWxnb3JpdGhtcyB3aWxsIHVzZSBlZmZpY2llbnQgdmVyc2lvbiBvZiBzd2FwIChkdWUgdG8gS29lbmlnIGxvb2t1cCkNCisvLyBOb24tdGhyb3dpbmcgc3dhcCBDKysgaWRpb206IGh0dHA6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvTW9yZV9DJTJCJTJCX0lkaW9tcy9Ob24tdGhyb3dpbmdfc3dhcA0KK25hbWVzcGFjZSBzdGQNCit7DQorCXRlbXBsYXRlIDw+DQorCWlubGluZSB2b2lkIHN3YXAobXBmcjo6bXByZWFsJiB4LCBtcGZyOjptcHJlYWwmIHkpIA0KKwl7IA0KKwkJcmV0dXJuIG1wZnI6OnN3YXAoeCwgeSk7IA0KKwl9DQorfQ0KKw0KKyNlbmRpZiAvKiBfX01QUkVBTF9IX18gKi8NCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L21wcmVhbF9zdXBwb3J0LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvbXByZWFsX3N1cHBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MWFmOWQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbF9zdXBwb3J0LmNwcApAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPEVpZ2VuL01QUmVhbFN1cHBvcnQ+CisjaW5jbHVkZSA8RWlnZW4vTFU+CisjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIG1wZnI7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIEVpZ2VuOworCit2b2lkIHRlc3RfbXByZWFsX3N1cHBvcnQoKQoreworICAvLyBzZXQgcHJlY2lzaW9uIHRvIDI1NiBiaXRzIChkb3VibGUgaGFzIG9ubHkgNTMgYml0cykKKyAgbXByZWFsOjpzZXRfZGVmYXVsdF9wcmVjKDI1Nik7CisgIHR5cGVkZWYgTWF0cml4PG1wcmVhbCxFaWdlbjo6RHluYW1pYyxFaWdlbjo6RHluYW1pYz4gTWF0cml4WG1wOworCisgIHN0ZDo6Y2VyciA8PCAiZXBzaWxvbiA9ICAgICAgICAgIiA8PCBOdW1UcmFpdHM8bXByZWFsPjo6ZXBzaWxvbigpIDw8ICJcbiI7CisgIHN0ZDo6Y2VyciA8PCAiZHVtbXlfcHJlY2lzaW9uID0gIiA8PCBOdW1UcmFpdHM8bXByZWFsPjo6ZHVtbXlfcHJlY2lzaW9uKCkgPDwgIlxuIjsKKyAgc3RkOjpjZXJyIDw8ICJoaWdoZXN0ID0gICAgICAgICAiIDw8IE51bVRyYWl0czxtcHJlYWw+OjpoaWdoZXN0KCkgPDwgIlxuIjsKKyAgc3RkOjpjZXJyIDw8ICJsb3dlc3QgPSAgICAgICAgICAiIDw8IE51bVRyYWl0czxtcHJlYWw+Ojpsb3dlc3QoKSA8PCAiXG4iOworCisgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgaW50IHMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTAwKTsKKyAgICBNYXRyaXhYbXAgQSA9IE1hdHJpeFhtcDo6UmFuZG9tKHMscyk7CisgICAgTWF0cml4WG1wIEIgPSBNYXRyaXhYbXA6OlJhbmRvbShzLHMpOworICAgIE1hdHJpeFhtcCBTID0gQS5hZGpvaW50KCkgKiBBOworICAgIE1hdHJpeFhtcCBYOworICAgIAorICAgIC8vIEJhc2ljIHN0dWZmcworICAgIFZFUklGWV9JU19BUFBST1goQS5yZWFsKCksIEEpOworICAgIFZFUklGWShFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KEEuYXJyYXkoKS5hYnMyKCkuc3VtKCksIEEuc3F1YXJlZE5vcm0oKSkpOworICAgIFZFUklGWV9JU19BUFBST1goQS5hcnJheSgpLmV4cCgpLCAgICAgICAgIGV4cChBLmFycmF5KCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEuYXJyYXkoKS5hYnMyKCkuc3FydCgpLCBBLmFycmF5KCkuYWJzKCkpOworICAgIFZFUklGWV9JU19BUFBST1goQS5hcnJheSgpLnNpbigpLCAgICAgICAgIHNpbihBLmFycmF5KCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEuYXJyYXkoKS5jb3MoKSwgICAgICAgICBjb3MoQS5hcnJheSgpKSk7CisgICAgCisKKyAgICAvLyBDaG9sZXNreQorICAgIFggPSBTLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5sbHQoKS5zb2x2ZShCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChTLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSpYKS5ldmFsKCksQik7CisKKyAgICAvLyBwYXJ0aWFsIExVCisgICAgWCA9IEEubHUoKS5zb2x2ZShCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChBKlgpLmV2YWwoKSxCKTsKKworICAgIC8vIHN5bW1ldHJpYyBlaWdlbnZhbHVlcworICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WG1wPiBlaWcoUyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGVpZy5pbmZvKCksIFN1Y2Nlc3MpOworICAgIFZFUklGWV9JU19BUFBST1goKFMuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlnLmVpZ2VudmVjdG9ycygpKSwKKyAgICAgICAgICAgICAgICAgICAgICBlaWcuZWlnZW52ZWN0b3JzKCkgKiBlaWcuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpOworICB9CisgIAorICB7CisgICAgTWF0cml4WG1wIEEoOCwzKTsgQS5zZXRSYW5kb20oKTsKKyAgICAvLyB0ZXN0IG91dHB1dCAoaW50ZXJlc3RpbmcgdGhpbmdzIGhhcHBlbiBpbiB0aGlzIGNvZGUpCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIHN0cmVhbSA8PCBBOworICB9Cit9CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1wcmVhbC9kbG1hbGxvYy5jIgorfQorI2luY2x1ZGUgIm1wcmVhbC9tcHJlYWwuY3BwIgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9vcGVuZ2xzdXBwb3J0LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3Qvb3Blbmdsc3VwcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2YTgxNgotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3Qvb3Blbmdsc3VwcG9ydC5jcHAKQEAgLTAsMCArMSwzMzcgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEdhZWwgR3Vlbm5lYmF1ZCA8Z2FlbC5ndWVubmViYXVkQGlucmlhLmZyPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgPG1haW4uaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxHTC9nbGV3Lmg+CisjaW5jbHVkZSA8RWlnZW4vT3BlbkdMU3VwcG9ydD4KKyNpbmNsdWRlIDxHTC9nbHV0Lmg+Cit1c2luZyBuYW1lc3BhY2UgRWlnZW47CisKKworCisKKyNkZWZpbmUgVkVSSUZZX01BVFJJWChDT0RFLFJFRikgeyBcCisgICAgZ2xMb2FkSWRlbnRpdHkoKTsgXAorICAgIENPREU7IFwKKyAgICBNYXRyaXg8ZmxvYXQsNCw0LENvbE1ham9yPiBtOyBtLnNldFplcm8oKTsgXAorICAgIGdsR2V0KEdMX01PREVMVklFV19NQVRSSVgsIG0pOyBcCisgICAgaWYoIShSRUYpLmNhc3Q8ZmxvYXQ+KCkuaXNBcHByb3gobSkpIHsgXAorICAgICAgc3RkOjpjZXJyIDw8ICJFeHBlY3RlZDpcbiIgPDwgKChSRUYpLmNhc3Q8ZmxvYXQ+KCkpIDw8ICJcbiIgPDwgImdvdFxuIiA8PCBtIDw8ICJcblxuIjsgXAorICAgIH0gXAorICAgIFZFUklGWV9JU19BUFBST1goKFJFRikuY2FzdDxmbG9hdD4oKSwgbSk7IFwKKyAgfQorCisjZGVmaW5lIFZFUklGWV9VTklGT1JNKFNVRkZJWCxOQU1FLFRZUEUpIHsgXAorICAgIFRZUEUgdmFsdWU7IHZhbHVlLnNldFJhbmRvbSgpOyBcCisgICAgVFlQRSBkYXRhOyBcCisgICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByZ19pZCwgI05BTUUpOyBcCisgICAgVkVSSUZZKChsb2MhPS0xKSAmJiAidW5pZm9ybSBub3QgZm91bmQiKTsgXAorICAgIGdsVW5pZm9ybShsb2MsdmFsdWUpOyBcCisgICAgRUlHRU5fQ0FUKGdsR2V0VW5pZm9ybSxTVUZGSVgpKHByZ19pZCxsb2MsZGF0YS5kYXRhKCkpOyBcCisgICAgaWYoIXZhbHVlLmlzQXBwcm94KGRhdGEpKSB7IFwKKyAgICAgIHN0ZDo6Y2VyciA8PCAiRXhwZWN0ZWQ6XG4iIDw8IHZhbHVlIDw8ICJcbiIgPDwgImdvdFxuIiA8PCBkYXRhIDw8ICJcblxuIjsgXAorICAgIH0gXAorICAgIFZFUklGWV9JU19BUFBST1godmFsdWUsIGRhdGEpOyBcCisgIH0KKyAgCisjZGVmaW5lIFZFUklGWV9VTklGT1JNaShOQU1FLFRZUEUpIHsgXAorICAgIFRZUEUgdmFsdWUgPSBUWVBFOjpSYW5kb20oKS5ldmFsKCkuY2FzdDxmbG9hdD4oKS5jYXN0PFRZUEU6OlNjYWxhcj4oKTsgXAorICAgIFRZUEUgZGF0YTsgXAorICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcmdfaWQsICNOQU1FKTsgXAorICAgIFZFUklGWSgobG9jIT0tMSkgJiYgInVuaWZvcm0gbm90IGZvdW5kIik7IFwKKyAgICBnbFVuaWZvcm0obG9jLHZhbHVlKTsgXAorICAgIGdsR2V0VW5pZm9ybWl2KHByZ19pZCxsb2MsKEdMaW50KilkYXRhLmRhdGEoKSk7IFwKKyAgICBpZighdmFsdWUuaXNBcHByb3goZGF0YSkpIHsgXAorICAgICAgc3RkOjpjZXJyIDw8ICJFeHBlY3RlZDpcbiIgPDwgdmFsdWUgPDwgIlxuIiA8PCAiZ290XG4iIDw8IGRhdGEgPDwgIlxuXG4iOyBcCisgICAgfSBcCisgICAgVkVSSUZZX0lTX0FQUFJPWCh2YWx1ZSwgZGF0YSk7IFwKKyAgfQorICAKK3ZvaWQgcHJpbnRJbmZvTG9nKEdMdWludCBvYmplY3RJRCkKK3sKKyAgICBpbnQgaW5mb2xvZ0xlbmd0aCwgY2hhcnNXcml0dGVuOworICAgIEdMY2hhciAqaW5mb0xvZzsKKyAgICBnbEdldFByb2dyYW1pdihvYmplY3RJRCxHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvbG9nTGVuZ3RoKTsKKyAgICBpZihpbmZvbG9nTGVuZ3RoID4gMCkKKyAgICB7CisgICAgICAgIGluZm9Mb2cgPSBuZXcgR0xjaGFyW2luZm9sb2dMZW5ndGhdOworICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKG9iamVjdElELCBpbmZvbG9nTGVuZ3RoLCAmY2hhcnNXcml0dGVuLCBpbmZvTG9nKTsKKyAgICAgICAgaWYgKGNoYXJzV3JpdHRlbj4wKQorICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiU2hhZGVyIGluZm8gOiBcbiIgPDwgaW5mb0xvZyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGRlbGV0ZVtdIGluZm9Mb2c7CisgICAgfQorfQorCitHTGludCBjcmVhdGVTaGFkZXIoY29uc3QgY2hhciogdnR4LCBjb25zdCBjaGFyKiBmcmcpCit7CisgIEdMaW50IHByZ19pZCA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICBHTGludCB2dHhfaWQgPSBnbENyZWF0ZVNoYWRlcihHTF9WRVJURVhfU0hBREVSKTsKKyAgR0xpbnQgZnJnX2lkID0gZ2xDcmVhdGVTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSKTsKKyAgR0xpbnQgb2s7CisgIAorICBnbFNoYWRlclNvdXJjZSh2dHhfaWQsIDEsICZ2dHgsIDApOworICBnbENvbXBpbGVTaGFkZXIodnR4X2lkKTsKKyAgZ2xHZXRTaGFkZXJpdih2dHhfaWQsR0xfQ09NUElMRV9TVEFUVVMsJm9rKTsKKyAgaWYoIW9rKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJ2dHggY29tcGlsYXRpb24gZmFpbGVkXG4iOworICB9CisgIAorICBnbFNoYWRlclNvdXJjZShmcmdfaWQsIDEsICZmcmcsIDApOworICBnbENvbXBpbGVTaGFkZXIoZnJnX2lkKTsKKyAgZ2xHZXRTaGFkZXJpdihmcmdfaWQsR0xfQ09NUElMRV9TVEFUVVMsJm9rKTsKKyAgaWYoIW9rKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJmcmcgY29tcGlsYXRpb24gZmFpbGVkXG4iOworICB9CisgIAorICBnbEF0dGFjaFNoYWRlcihwcmdfaWQsIHZ0eF9pZCk7CisgIGdsQXR0YWNoU2hhZGVyKHByZ19pZCwgZnJnX2lkKTsKKyAgZ2xMaW5rUHJvZ3JhbShwcmdfaWQpOworICBnbEdldFByb2dyYW1pdihwcmdfaWQsR0xfTElOS19TVEFUVVMsJm9rKTsKKyAgaWYoIW9rKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJsaW5raW5nIGZhaWxlZFxuIjsKKyAgfQorICBwcmludEluZm9Mb2cocHJnX2lkKTsKKyAgCisgIGdsVXNlUHJvZ3JhbShwcmdfaWQpOworICByZXR1cm4gcHJnX2lkOworfQorCit2b2lkIHRlc3Rfb3Blbmdsc3VwcG9ydCgpCit7CisgIGludCBhcmdjID0gMDsKKyAgZ2x1dEluaXQoJmFyZ2MsIDApOworICBnbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfRE9VQkxFIHwgR0xVVF9SR0IgfCBHTFVUX0RFUFRIKTsKKyAgZ2x1dEluaXRXaW5kb3dQb3NpdGlvbiAoMCwwKTsKKyAgZ2x1dEluaXRXaW5kb3dTaXplKDEwLCAxMCk7CisKKyAgaWYoZ2x1dENyZWF0ZVdpbmRvdygiRWlnZW4iKSA8PSAwKQorICB7CisgICAgc3RkOjpjZXJyIDw8ICJFcnJvcjogVW5hYmxlIHRvIGNyZWF0ZSBHTFVUIFdpbmRvdy5cbiI7CisgICAgZXhpdCgxKTsKKyAgfQorICAKKyAgZ2xld0V4cGVyaW1lbnRhbCA9IEdMX1RSVUU7CisgIGlmKGdsZXdJbml0KCkgIT0gR0xFV19PSykKKyAgeworICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZzogRmFpbGVkIHRvIGluaXRpYWxpemUgR0xFV1xuIjsKKyAgfQorCisgIFZlY3RvcjNmIHYzZjsKKyAgTWF0cml4M2Ygcm90OworICBnbEJlZ2luKEdMX1BPSU5UUyk7CisgIAorICBnbFZlcnRleCh2M2YpOworICBnbFZlcnRleCgyKnYzZit2M2YpOworICBnbFZlcnRleChyb3QqdjNmKTsKKyAgCisgIGdsRW5kKCk7CisgIAorICAvLyA0eDQgbWF0cmljZXMKKyAgTWF0cml4NGYgbWY0NDsgbWY0NC5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgobWY0NCksIG1mNDQpOworICBWRVJJRllfTUFUUklYKGdsTXVsdE1hdHJpeChtZjQ0KSwgbWY0NCk7CisgIE1hdHJpeDRkIG1kNDQ7IG1kNDQuc2V0UmFuZG9tKCk7CisgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KG1kNDQpLCBtZDQ0KTsKKyAgVkVSSUZZX01BVFJJWChnbE11bHRNYXRyaXgobWQ0NCksIG1kNDQpOworICAKKyAgLy8gUXVhdGVybmlvbgorICBRdWF0ZXJuaW9uZCBxZChBbmdsZUF4aXNkKGludGVybmFsOjpyYW5kb208ZG91YmxlPigpLCBWZWN0b3IzZDo6UmFuZG9tKCkpKTsKKyAgVkVSSUZZX01BVFJJWChnbFJvdGF0ZShxZCksIFByb2plY3RpdmUzZChxZCkubWF0cml4KCkpOworICAKKyAgUXVhdGVybmlvbmYgcWYoQW5nbGVBeGlzZihpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSwgVmVjdG9yM2Y6OlJhbmRvbSgpKSk7CisgIFZFUklGWV9NQVRSSVgoZ2xSb3RhdGUocWYpLCBQcm9qZWN0aXZlM2YocWYpLm1hdHJpeCgpKTsKKyAgCisgIC8vIDNEIFRyYW5zZm9ybQorICBUcmFuc2Zvcm08ZmxvYXQsMyxBZmZpbmVDb21wYWN0PiBhY2YzOyBhY2YzLm1hdHJpeCgpLnNldFJhbmRvbSgpOworICBWRVJJRllfTUFUUklYKGdsTG9hZE1hdHJpeChhY2YzKSwgUHJvamVjdGl2ZTNmKGFjZjMpLm1hdHJpeCgpKTsKKyAgVkVSSUZZX01BVFJJWChnbE11bHRNYXRyaXgoYWNmMyksIFByb2plY3RpdmUzZihhY2YzKS5tYXRyaXgoKSk7CisgIAorICBUcmFuc2Zvcm08ZmxvYXQsMyxBZmZpbmU+IGFmMyhhY2YzKTsKKyAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgoYWYzKSwgUHJvamVjdGl2ZTNmKGFmMykubWF0cml4KCkpOworICBWRVJJRllfTUFUUklYKGdsTXVsdE1hdHJpeChhZjMpLCBQcm9qZWN0aXZlM2YoYWYzKS5tYXRyaXgoKSk7CisgIAorICBUcmFuc2Zvcm08ZmxvYXQsMyxQcm9qZWN0aXZlPiBwZjM7IHBmMy5tYXRyaXgoKS5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgocGYzKSwgUHJvamVjdGl2ZTNmKHBmMykubWF0cml4KCkpOworICBWRVJJRllfTUFUUklYKGdsTXVsdE1hdHJpeChwZjMpLCBQcm9qZWN0aXZlM2YocGYzKS5tYXRyaXgoKSk7CisgIAorICBUcmFuc2Zvcm08ZG91YmxlLDMsQWZmaW5lQ29tcGFjdD4gYWNkMzsgYWNkMy5tYXRyaXgoKS5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgoYWNkMyksIFByb2plY3RpdmUzZChhY2QzKS5tYXRyaXgoKSk7CisgIFZFUklGWV9NQVRSSVgoZ2xNdWx0TWF0cml4KGFjZDMpLCBQcm9qZWN0aXZlM2QoYWNkMykubWF0cml4KCkpOworICAKKyAgVHJhbnNmb3JtPGRvdWJsZSwzLEFmZmluZT4gYWQzKGFjZDMpOworICBWRVJJRllfTUFUUklYKGdsTG9hZE1hdHJpeChhZDMpLCBQcm9qZWN0aXZlM2QoYWQzKS5tYXRyaXgoKSk7CisgIFZFUklGWV9NQVRSSVgoZ2xNdWx0TWF0cml4KGFkMyksIFByb2plY3RpdmUzZChhZDMpLm1hdHJpeCgpKTsKKyAgCisgIFRyYW5zZm9ybTxkb3VibGUsMyxQcm9qZWN0aXZlPiBwZDM7IHBkMy5tYXRyaXgoKS5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgocGQzKSwgUHJvamVjdGl2ZTNkKHBkMykubWF0cml4KCkpOworICBWRVJJRllfTUFUUklYKGdsTXVsdE1hdHJpeChwZDMpLCBQcm9qZWN0aXZlM2QocGQzKS5tYXRyaXgoKSk7CisgIAorICAvLyB0cmFuc2xhdGlvbnMgKDJEIGFuZCAzRCkKKyAgeworICAgIFZlY3RvcjJmIHZmMjsgdmYyLnNldFJhbmRvbSgpOyBWZWN0b3IzZiB2ZjIzOyB2ZjIzIDw8IHZmMiwgMDsKKyAgICBWRVJJRllfTUFUUklYKGdsVHJhbnNsYXRlKHZmMiksIFByb2plY3RpdmUzZihUcmFuc2xhdGlvbjNmKHZmMjMpKS5tYXRyaXgoKSk7CisgICAgVmVjdG9yMmQgdmQyOyB2ZDIuc2V0UmFuZG9tKCk7IFZlY3RvcjNkIHZkMjM7IHZkMjMgPDwgdmQyLCAwOworICAgIFZFUklGWV9NQVRSSVgoZ2xUcmFuc2xhdGUodmQyKSwgUHJvamVjdGl2ZTNkKFRyYW5zbGF0aW9uM2QodmQyMykpLm1hdHJpeCgpKTsKKyAgICAKKyAgICBWZWN0b3IzZiB2ZjM7IHZmMy5zZXRSYW5kb20oKTsKKyAgICBWRVJJRllfTUFUUklYKGdsVHJhbnNsYXRlKHZmMyksIFByb2plY3RpdmUzZihUcmFuc2xhdGlvbjNmKHZmMykpLm1hdHJpeCgpKTsKKyAgICBWZWN0b3IzZCB2ZDM7IHZkMy5zZXRSYW5kb20oKTsKKyAgICBWRVJJRllfTUFUUklYKGdsVHJhbnNsYXRlKHZkMyksIFByb2plY3RpdmUzZChUcmFuc2xhdGlvbjNkKHZkMykpLm1hdHJpeCgpKTsKKyAgICAKKyAgICBUcmFuc2xhdGlvbjxmbG9hdCwzPiB0ZjM7IHRmMy52ZWN0b3IoKS5zZXRSYW5kb20oKTsKKyAgICBWRVJJRllfTUFUUklYKGdsVHJhbnNsYXRlKHRmMyksIFByb2plY3RpdmUzZih0ZjMpLm1hdHJpeCgpKTsKKyAgICAKKyAgICBUcmFuc2xhdGlvbjxkb3VibGUsMz4gdGQzOyAgdGQzLnZlY3RvcigpLnNldFJhbmRvbSgpOworICAgIFZFUklGWV9NQVRSSVgoZ2xUcmFuc2xhdGUodGQzKSwgUHJvamVjdGl2ZTNkKHRkMykubWF0cml4KCkpOworICB9CisgIAorICAvLyBzY2FsaW5nICgyRCBhbmQgM0QpCisgIHsKKyAgICBWZWN0b3IyZiB2ZjI7IHZmMi5zZXRSYW5kb20oKTsgVmVjdG9yM2YgdmYyMzsgdmYyMyA8PCB2ZjIsIDE7CisgICAgVkVSSUZZX01BVFJJWChnbFNjYWxlKHZmMiksIFByb2plY3RpdmUzZihTY2FsaW5nKHZmMjMpKS5tYXRyaXgoKSk7CisgICAgVmVjdG9yMmQgdmQyOyB2ZDIuc2V0UmFuZG9tKCk7IFZlY3RvcjNkIHZkMjM7IHZkMjMgPDwgdmQyLCAxOworICAgIFZFUklGWV9NQVRSSVgoZ2xTY2FsZSh2ZDIpLCBQcm9qZWN0aXZlM2QoU2NhbGluZyh2ZDIzKSkubWF0cml4KCkpOworICAgIAorICAgIFZlY3RvcjNmIHZmMzsgdmYzLnNldFJhbmRvbSgpOworICAgIFZFUklGWV9NQVRSSVgoZ2xTY2FsZSh2ZjMpLCBQcm9qZWN0aXZlM2YoU2NhbGluZyh2ZjMpKS5tYXRyaXgoKSk7CisgICAgVmVjdG9yM2QgdmQzOyB2ZDMuc2V0UmFuZG9tKCk7CisgICAgVkVSSUZZX01BVFJJWChnbFNjYWxlKHZkMyksIFByb2plY3RpdmUzZChTY2FsaW5nKHZkMykpLm1hdHJpeCgpKTsKKyAgICAKKyAgICBVbmlmb3JtU2NhbGluZzxmbG9hdD4gdXNmKGludGVybmFsOjpyYW5kb208ZmxvYXQ+KCkpOworICAgIFZFUklGWV9NQVRSSVgoZ2xTY2FsZSh1c2YpLCBQcm9qZWN0aXZlM2YodXNmKS5tYXRyaXgoKSk7CisgICAgCisgICAgVW5pZm9ybVNjYWxpbmc8ZG91YmxlPiB1c2QoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCkpOworICAgIFZFUklGWV9NQVRSSVgoZ2xTY2FsZSh1c2QpLCBQcm9qZWN0aXZlM2QodXNkKS5tYXRyaXgoKSk7CisgIH0KKyAgCisgIC8vIHVuaWZvcm0KKyAgeworICAgIGNvbnN0IGNoYXIqIHZ0eCA9ICJ2b2lkIG1haW4odm9pZCkgeyBnbF9Qb3NpdGlvbiA9IGdsX1ZlcnRleDsgfVxuIjsKKyAgICAKKyAgICBpZihHTEVXX1ZFUlNJT05fMl8wKQorICAgIHsKKyAgICAgICNpZmRlZiBHTF9WRVJTSU9OXzJfMAorICAgICAgY29uc3QgY2hhciogZnJnID0gIiIKKyAgICAgICAgInVuaWZvcm0gdmVjMiB2MmY7XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzMgdjNmO1xuIgorICAgICAgICAidW5pZm9ybSB2ZWM0IHY0ZjtcbiIKKyAgICAgICAgInVuaWZvcm0gaXZlYzIgdjJpO1xuIgorICAgICAgICAidW5pZm9ybSBpdmVjMyB2M2k7XG4iCisgICAgICAgICJ1bmlmb3JtIGl2ZWM0IHY0aTtcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0MiBtMmY7XG4iCisgICAgICAgICJ1bmlmb3JtIG1hdDMgbTNmO1xuIgorICAgICAgICAidW5pZm9ybSBtYXQ0IG00ZjtcbiIKKyAgICAgICAgInZvaWQgbWFpbih2b2lkKSB7IGdsX0ZyYWdDb2xvciA9IHZlYzQodjJmWzBdK3YzZlswXSt2NGZbMF0pK3ZlYzQodjJpWzBdK3YzaVswXSt2NGlbMF0pK3ZlYzQobTJmWzBdWzBdK20zZlswXVswXSttNGZbMF1bMF0pOyB9XG4iOworICAgICAgICAKKyAgICAgIEdMaW50IHByZ19pZCA9IGNyZWF0ZVNoYWRlcih2dHgsZnJnKTsKKyAgICAgIAorICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsdjJmLCBWZWN0b3IyZik7CisgICAgICBWRVJJRllfVU5JRk9STShmdix2M2YsIFZlY3RvcjNmKTsKKyAgICAgIFZFUklGWV9VTklGT1JNKGZ2LHY0ZiwgVmVjdG9yNGYpOworICAgICAgVkVSSUZZX1VOSUZPUk1pKHYyaSwgVmVjdG9yMmkpOworICAgICAgVkVSSUZZX1VOSUZPUk1pKHYzaSwgVmVjdG9yM2kpOworICAgICAgVkVSSUZZX1VOSUZPUk1pKHY0aSwgVmVjdG9yNGkpOworICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsbTJmLCBNYXRyaXgyZik7CisgICAgICBWRVJJRllfVU5JRk9STShmdixtM2YsIE1hdHJpeDNmKTsKKyAgICAgIFZFUklGWV9VTklGT1JNKGZ2LG00ZiwgTWF0cml4NGYpOworICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZzogb3BlbmdsIDIuMCB3YXMgbm90IHRlc3RlZFxuIjsKKyAgICAKKyAgICBpZihHTEVXX1ZFUlNJT05fMl8xKQorICAgIHsKKyAgICAgICNpZmRlZiBHTF9WRVJTSU9OXzJfMQorICAgICAgY29uc3QgY2hhciogZnJnID0gIiN2ZXJzaW9uIDEyMFxuIgorICAgICAgICAidW5pZm9ybSBtYXQyeDMgbTIzZjtcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0M3gyIG0zMmY7XG4iCisgICAgICAgICJ1bmlmb3JtIG1hdDJ4NCBtMjRmO1xuIgorICAgICAgICAidW5pZm9ybSBtYXQ0eDIgbTQyZjtcbiIKKyAgICAgICAgInVuaWZvcm0gbWF0M3g0IG0zNGY7XG4iCisgICAgICAgICJ1bmlmb3JtIG1hdDR4MyBtNDNmO1xuIgorICAgICAgICAidm9pZCBtYWluKHZvaWQpIHsgZ2xfRnJhZ0NvbG9yID0gdmVjNChtMjNmWzBdWzBdK20zMmZbMF1bMF0rbTI0ZlswXVswXSttNDJmWzBdWzBdK20zNGZbMF1bMF0rbTQzZlswXVswXSk7IH1cbiI7CisgICAgICAgIAorICAgICAgR0xpbnQgcHJnX2lkID0gY3JlYXRlU2hhZGVyKHZ0eCxmcmcpOworICAgICAgCisgICAgICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwyLDM+IE1hdHJpeDIzZjsKKyAgICAgIHR5cGVkZWYgTWF0cml4PGZsb2F0LDMsMj4gTWF0cml4MzJmOworICAgICAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsMiw0PiBNYXRyaXgyNGY7CisgICAgICB0eXBlZGVmIE1hdHJpeDxmbG9hdCw0LDI+IE1hdHJpeDQyZjsKKyAgICAgIHR5cGVkZWYgTWF0cml4PGZsb2F0LDMsND4gTWF0cml4MzRmOworICAgICAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsNCwzPiBNYXRyaXg0M2Y7CisgICAgICAKKyAgICAgIFZFUklGWV9VTklGT1JNKGZ2LG0yM2YsIE1hdHJpeDIzZik7CisgICAgICBWRVJJRllfVU5JRk9STShmdixtMzJmLCBNYXRyaXgzMmYpOworICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsbTI0ZiwgTWF0cml4MjRmKTsKKyAgICAgIFZFUklGWV9VTklGT1JNKGZ2LG00MmYsIE1hdHJpeDQyZik7CisgICAgICBWRVJJRllfVU5JRk9STShmdixtMzRmLCBNYXRyaXgzNGYpOworICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsbTQzZiwgTWF0cml4NDNmKTsKKyAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgICBzdGQ6OmNlcnIgPDwgIldhcm5pbmc6IG9wZW5nbCAyLjEgd2FzIG5vdCB0ZXN0ZWRcbiI7CisgICAgCisgICAgaWYoR0xFV19WRVJTSU9OXzNfMCkKKyAgICB7CisgICAgICAjaWZkZWYgR0xfVkVSU0lPTl8zXzAKKyAgICAgIGNvbnN0IGNoYXIqIGZyZyA9ICIjdmVyc2lvbiAxNTBcbiIKKyAgICAgICAgInVuaWZvcm0gdXZlYzIgdjJ1aTtcbiIKKyAgICAgICAgInVuaWZvcm0gdXZlYzMgdjN1aTtcbiIKKyAgICAgICAgInVuaWZvcm0gdXZlYzQgdjR1aTtcbiIKKyAgICAgICAgIm91dCB2ZWM0IGRhdGE7XG4iCisgICAgICAgICJ2b2lkIG1haW4odm9pZCkgeyBkYXRhID0gdmVjNCh2MnVpWzBdK3YzdWlbMF0rdjR1aVswXSk7IH1cbiI7CisgICAgICAgIAorICAgICAgR0xpbnQgcHJnX2lkID0gY3JlYXRlU2hhZGVyKHZ0eCxmcmcpOworICAgICAgCisgICAgICB0eXBlZGVmIE1hdHJpeDx1bnNpZ25lZCBpbnQsMiwxPiBWZWN0b3IydWk7CisgICAgICB0eXBlZGVmIE1hdHJpeDx1bnNpZ25lZCBpbnQsMywxPiBWZWN0b3IzdWk7CisgICAgICB0eXBlZGVmIE1hdHJpeDx1bnNpZ25lZCBpbnQsNCwxPiBWZWN0b3I0dWk7CisgICAgICAKKyAgICAgIFZFUklGWV9VTklGT1JNaSh2MnVpLCBWZWN0b3IydWkpOworICAgICAgVkVSSUZZX1VOSUZPUk1pKHYzdWksIFZlY3RvcjN1aSk7CisgICAgICBWRVJJRllfVU5JRk9STWkodjR1aSwgVmVjdG9yNHVpKTsKKyAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgICBzdGQ6OmNlcnIgPDwgIldhcm5pbmc6IG9wZW5nbCAzLjAgd2FzIG5vdCB0ZXN0ZWRcbiI7CisgICAgCisgICAgI2lmZGVmIEdMRVdfQVJCX2dwdV9zaGFkZXJfZnA2NAorICAgIGlmKEdMRVdfQVJCX2dwdV9zaGFkZXJfZnA2NCkKKyAgICB7CisgICAgICAjaWZkZWYgR0xfQVJCX2dwdV9zaGFkZXJfZnA2NAorICAgICAgY29uc3QgY2hhciogZnJnID0gIiN2ZXJzaW9uIDE1MFxuIgorICAgICAgICAidW5pZm9ybSBkdmVjMiB2MmQ7XG4iCisgICAgICAgICJ1bmlmb3JtIGR2ZWMzIHYzZDtcbiIKKyAgICAgICAgInVuaWZvcm0gZHZlYzQgdjRkO1xuIgorICAgICAgICAib3V0IHZlYzQgZGF0YTtcbiIKKyAgICAgICAgInZvaWQgbWFpbih2b2lkKSB7IGRhdGEgPSB2ZWM0KHYyZFswXSt2M2RbMF0rdjRkWzBdKTsgfVxuIjsKKyAgICAgICAgCisgICAgICBHTGludCBwcmdfaWQgPSBjcmVhdGVTaGFkZXIodnR4LGZyZyk7CisgICAgICAKKyAgICAgIHR5cGVkZWYgVmVjdG9yMmQgVmVjdG9yMmQ7CisgICAgICB0eXBlZGVmIFZlY3RvcjNkIFZlY3RvcjNkOworICAgICAgdHlwZWRlZiBWZWN0b3I0ZCBWZWN0b3I0ZDsKKyAgICAgIAorICAgICAgVkVSSUZZX1VOSUZPUk0oZHYsdjJkLCBWZWN0b3IyZCk7CisgICAgICBWRVJJRllfVU5JRk9STShkdix2M2QsIFZlY3RvcjNkKTsKKyAgICAgIFZFUklGWV9VTklGT1JNKGR2LHY0ZCwgVmVjdG9yNGQpOworICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZzogR0xFV19BUkJfZ3B1X3NoYWRlcl9mcDY0IHdhcyBub3QgdGVzdGVkXG4iOworICAgICNlbHNlCisgICAgICBzdGQ6OmNlcnIgPDwgIldhcm5pbmc6IEdMRVdfQVJCX2dwdV9zaGFkZXJfZnA2NCB3YXMgbm90IHRlc3RlZFxuIjsKKyAgICAjZW5kaWYKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvcG9seW5vbWlhbHNvbHZlci5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L3BvbHlub21pYWxzb2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmVhZmYKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L3BvbHlub21pYWxzb2x2ZXIuY3BwCkBAIC0wLDAgKzEsMjE3IEBACisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBFaWdlbiwgYSBsaWdodHdlaWdodCBDKysgdGVtcGxhdGUgbGlicmFyeQorLy8gZm9yIGxpbmVhciBhbGdlYnJhLgorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxMCBNYW51ZWwgWWd1ZWwgPG1hbnVlbC55Z3VlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1BvbHlub21pYWxzPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgU2l6ZT4KK3N0cnVjdCBpbmNyZW1lbnRfaWZfZml4ZWRfc2l6ZQoreworICBlbnVtIHsKKyAgICByZXQgPSAoU2l6ZSA9PSBEeW5hbWljKSA/IER5bmFtaWMgOiBTaXplKzEKKyAgfTsKK307Cit9Cit9CisKKwordGVtcGxhdGU8aW50IERlZywgdHlwZW5hbWUgUE9MWU5PTUlBTCwgdHlwZW5hbWUgU09MVkVSPgorYm9vbCBhdXhfZXZhbFNvbHZlciggY29uc3QgUE9MWU5PTUlBTCYgcG9scywgU09MVkVSJiBwc29sdmUgKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFBPTFlOT01JQUw6OkluZGV4IEluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIFBPTFlOT01JQUw6OlNjYWxhciBTY2FsYXI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBTT0xWRVI6OlJvb3RzVHlwZSAgICBSb290c1R5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEZWcsMT4gICAgICAgICAgRXZhbFJvb3RzVHlwZTsKKworICBjb25zdCBJbmRleCBkZWcgPSBwb2xzLnNpemUoKS0xOworCisgIHBzb2x2ZS5jb21wdXRlKCBwb2xzICk7CisgIGNvbnN0IFJvb3RzVHlwZSYgcm9vdHMoIHBzb2x2ZS5yb290cygpICk7CisgIEV2YWxSb290c1R5cGUgZXZyKCBkZWcgKTsKKyAgZm9yKCBpbnQgaT0wOyBpPHJvb3RzLnNpemUoKTsgKytpICl7CisgICAgZXZyW2ldID0gc3RkOjphYnMoIHBvbHlfZXZhbCggcG9scywgcm9vdHNbaV0gKSApOyB9CisKKyAgYm9vbCBldmFsVG9aZXJvID0gZXZyLmlzWmVybyggdGVzdF9wcmVjaXNpb248U2NhbGFyPigpICk7CisgIGlmKCAhZXZhbFRvWmVybyApCisgIHsKKyAgICBjZXJyIDw8ICJXUk9ORyByb290OiAiIDw8IGVuZGw7CisgICAgY2VyciA8PCAiUG9seW5vbWlhbDogIiA8PCBwb2xzLnRyYW5zcG9zZSgpIDw8IGVuZGw7CisgICAgY2VyciA8PCAiUm9vdHMgZm91bmQ6ICIgPDwgcm9vdHMudHJhbnNwb3NlKCkgPDwgZW5kbDsKKyAgICBjZXJyIDw8ICJBYnMgdmFsdWUgb2YgdGhlIHBvbHlub21pYWwgYXQgdGhlIHJvb3RzOiAiIDw8IGV2ci50cmFuc3Bvc2UoKSA8PCBlbmRsOworICAgIGNlcnIgPDwgZW5kbDsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gcm9vdE1vZHVsaSggcm9vdHMuc2l6ZSgpICk7CisgIE1hcDwgRXZhbFJvb3RzVHlwZSA+IGF1eCggJnJvb3RNb2R1bGlbMF0sIHJvb3RzLnNpemUoKSApOworICBhdXggPSByb290cy5hcnJheSgpLmFicygpOworICBzdGQ6OnNvcnQoIHJvb3RNb2R1bGkuYmVnaW4oKSwgcm9vdE1vZHVsaS5lbmQoKSApOworICBib29sIGRpc3RpbmN0TW9kdWxpPXRydWU7CisgIGZvciggc2l6ZV90IGk9MTsgaTxyb290TW9kdWxpLnNpemUoKSAmJiBkaXN0aW5jdE1vZHVsaTsgKytpICkKKyAgeworICAgIGlmKCBpbnRlcm5hbDo6aXNBcHByb3goIHJvb3RNb2R1bGlbaV0sIHJvb3RNb2R1bGlbaS0xXSApICl7CisgICAgICBkaXN0aW5jdE1vZHVsaSA9IGZhbHNlOyB9CisgIH0KKyAgVkVSSUZZKCBldmFsVG9aZXJvIHx8ICFkaXN0aW5jdE1vZHVsaSApOworCisgIHJldHVybiBkaXN0aW5jdE1vZHVsaTsKK30KKworCisKKworCisKKwordGVtcGxhdGU8aW50IERlZywgdHlwZW5hbWUgUE9MWU5PTUlBTD4KK3ZvaWQgZXZhbFNvbHZlciggY29uc3QgUE9MWU5PTUlBTCYgcG9scyApCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgUE9MWU5PTUlBTDo6U2NhbGFyIFNjYWxhcjsKKworICB0eXBlZGVmIFBvbHlub21pYWxTb2x2ZXI8U2NhbGFyLCBEZWcgPiAgICAgICAgICAgICAgUG9seW5vbWlhbFNvbHZlclR5cGU7CisKKyAgUG9seW5vbWlhbFNvbHZlclR5cGUgcHNvbHZlOworICBhdXhfZXZhbFNvbHZlcjxEZWcsIFBPTFlOT01JQUwsIFBvbHlub21pYWxTb2x2ZXJUeXBlPiggcG9scywgcHNvbHZlICk7Cit9CisKKworCisKK3RlbXBsYXRlPCBpbnQgRGVnLCB0eXBlbmFtZSBQT0xZTk9NSUFMLCB0eXBlbmFtZSBST09UUywgdHlwZW5hbWUgUkVBTF9ST09UUyA+Cit2b2lkIGV2YWxTb2x2ZXJTdWdhckZ1bmN0aW9uKCBjb25zdCBQT0xZTk9NSUFMJiBwb2xzLCBjb25zdCBST09UUyYgcm9vdHMsIGNvbnN0IFJFQUxfUk9PVFMmIHJlYWxfcm9vdHMgKQoreworICB0eXBlZGVmIHR5cGVuYW1lIFBPTFlOT01JQUw6OlNjYWxhciBTY2FsYXI7CisKKyAgdHlwZWRlZiBQb2x5bm9taWFsU29sdmVyPFNjYWxhciwgRGVnID4gICAgICAgICAgICAgIFBvbHlub21pYWxTb2x2ZXJUeXBlOworCisgIFBvbHlub21pYWxTb2x2ZXJUeXBlIHBzb2x2ZTsKKyAgaWYoIGF1eF9ldmFsU29sdmVyPERlZywgUE9MWU5PTUlBTCwgUG9seW5vbWlhbFNvbHZlclR5cGU+KCBwb2xzLCBwc29sdmUgKSApCisgIHsKKyAgICAvL0l0IGlzIHN1cHBvc2VkIHRoYXQKKyAgICAvLyAxKSB0aGUgcm9vdHMgZm91bmQgYXJlIGNvcnJlY3QKKyAgICAvLyAyKSB0aGUgcm9vdHMgaGF2ZSBkaXN0aW5jdCBtb2R1bGkKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgUE9MWU5PTUlBTDo6U2NhbGFyICAgICAgICAgICAgICAgICBTY2FsYXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBSRUFMX1JPT1RTOjpTY2FsYXIgICAgICAgICAgICAgICAgIFJlYWw7CisKKyAgICB0eXBlZGVmIFBvbHlub21pYWxTb2x2ZXI8U2NhbGFyLCBEZWcgPiAgICAgICAgICAgICAgUG9seW5vbWlhbFNvbHZlclR5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBQb2x5bm9taWFsU29sdmVyVHlwZTo6Um9vdHNUeXBlICAgIFJvb3RzVHlwZTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGVnLDE+ICAgICAgICAgICAgICAgICAgICAgICAgRXZhbFJvb3RzVHlwZTsKKworICAgIC8vVGVzdCByZWFsUm9vdHMKKyAgICBzdGQ6OnZlY3RvcjwgUmVhbCA+IGNhbGNfcmVhbFJvb3RzOworICAgIHBzb2x2ZS5yZWFsUm9vdHMoIGNhbGNfcmVhbFJvb3RzICk7CisgICAgVkVSSUZZKCBjYWxjX3JlYWxSb290cy5zaXplKCkgPT0gKHNpemVfdClyZWFsX3Jvb3RzLnNpemUoKSApOworCisgICAgY29uc3QgU2NhbGFyIHBzUHJlYyA9IGludGVybmFsOjpzcXJ0KCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkgKTsKKworICAgIGZvciggc2l6ZV90IGk9MDsgaTxjYWxjX3JlYWxSb290cy5zaXplKCk7ICsraSApCisgICAgeworICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgZm9yKCBzaXplX3Qgaj0wOyBqPGNhbGNfcmVhbFJvb3RzLnNpemUoKSYmICFmb3VuZDsgKytqICkKKyAgICAgIHsKKyAgICAgICAgaWYoIGludGVybmFsOjppc0FwcHJveCggY2FsY19yZWFsUm9vdHNbaV0sIHJlYWxfcm9vdHNbal0gKSwgcHNQcmVjICl7CisgICAgICAgICAgZm91bmQgPSB0cnVlOyB9CisgICAgICB9CisgICAgICBWRVJJRlkoIGZvdW5kICk7CisgICAgfQorCisgICAgLy9UZXN0IGdyZWF0ZXN0Um9vdAorICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KCByb290cy5hcnJheSgpLmFicygpLm1heENvZWZmKCksCisgICAgICAgICAgaW50ZXJuYWw6OmFicyggcHNvbHZlLmdyZWF0ZXN0Um9vdCgpICksIHBzUHJlYyApICk7CisKKyAgICAvL1Rlc3Qgc21hbGxlc3RSb290CisgICAgVkVSSUZZKCBpbnRlcm5hbDo6aXNBcHByb3goIHJvb3RzLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKSwKKyAgICAgICAgICBpbnRlcm5hbDo6YWJzKCBwc29sdmUuc21hbGxlc3RSb290KCkgKSwgcHNQcmVjICkgKTsKKworICAgIGJvb2wgaGFzUmVhbFJvb3Q7CisgICAgLy9UZXN0IGFic0dyZWF0ZXN0UmVhbFJvb3QKKyAgICBSZWFsIHIgPSBwc29sdmUuYWJzR3JlYXRlc3RSZWFsUm9vdCggaGFzUmVhbFJvb3QgKTsKKyAgICBWRVJJRlkoIGhhc1JlYWxSb290ID09IChyZWFsX3Jvb3RzLnNpemUoKSA+IDAgKSApOworICAgIGlmKCBoYXNSZWFsUm9vdCApeworICAgICAgVkVSSUZZKCBpbnRlcm5hbDo6aXNBcHByb3goIHJlYWxfcm9vdHMuYXJyYXkoKS5hYnMoKS5tYXhDb2VmZigpLCBpbnRlcm5hbDo6YWJzKHIpLCBwc1ByZWMgKSApOyAgfQorCisgICAgLy9UZXN0IGFic1NtYWxsZXN0UmVhbFJvb3QKKyAgICByID0gcHNvbHZlLmFic1NtYWxsZXN0UmVhbFJvb3QoIGhhc1JlYWxSb290ICk7CisgICAgVkVSSUZZKCBoYXNSZWFsUm9vdCA9PSAocmVhbF9yb290cy5zaXplKCkgPiAwICkgKTsKKyAgICBpZiggaGFzUmVhbFJvb3QgKXsKKyAgICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KCByZWFsX3Jvb3RzLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKSwgaW50ZXJuYWw6OmFicyggciApLCBwc1ByZWMgKSApOyB9CisKKyAgICAvL1Rlc3QgZ3JlYXRlc3RSZWFsUm9vdAorICAgIHIgPSBwc29sdmUuZ3JlYXRlc3RSZWFsUm9vdCggaGFzUmVhbFJvb3QgKTsKKyAgICBWRVJJRlkoIGhhc1JlYWxSb290ID09IChyZWFsX3Jvb3RzLnNpemUoKSA+IDAgKSApOworICAgIGlmKCBoYXNSZWFsUm9vdCApeworICAgICAgVkVSSUZZKCBpbnRlcm5hbDo6aXNBcHByb3goIHJlYWxfcm9vdHMuYXJyYXkoKS5tYXhDb2VmZigpLCByLCBwc1ByZWMgKSApOyB9CisKKyAgICAvL1Rlc3Qgc21hbGxlc3RSZWFsUm9vdAorICAgIHIgPSBwc29sdmUuc21hbGxlc3RSZWFsUm9vdCggaGFzUmVhbFJvb3QgKTsKKyAgICBWRVJJRlkoIGhhc1JlYWxSb290ID09IChyZWFsX3Jvb3RzLnNpemUoKSA+IDAgKSApOworICAgIGlmKCBoYXNSZWFsUm9vdCApeworICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KCByZWFsX3Jvb3RzLmFycmF5KCkubWluQ29lZmYoKSwgciwgcHNQcmVjICkgKTsgfQorICB9Cit9CisKKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhciwgaW50IF9EZWc+Cit2b2lkIHBvbHlub21pYWxzb2x2ZXIoaW50IGRlZykKK3sKKyAgdHlwZWRlZiBpbnRlcm5hbDo6aW5jcmVtZW50X2lmX2ZpeGVkX3NpemU8X0RlZz4gICAgICAgICAgICBEaW07CisgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsRGltOjpyZXQsMT4gICAgICAgICAgICAgICAgICBQb2x5bm9taWFsVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8X1NjYWxhcixfRGVnLDE+ICAgICAgICAgICAgICAgICAgICAgIEV2YWxSb290c1R5cGU7CisKKyAgY291dCA8PCAiU3RhbmRhcmQgY2FzZXMiIDw8IGVuZGw7CisgIFBvbHlub21pYWxUeXBlIHBvbHMgPSBQb2x5bm9taWFsVHlwZTo6UmFuZG9tKGRlZysxKTsKKyAgZXZhbFNvbHZlcjxfRGVnLFBvbHlub21pYWxUeXBlPiggcG9scyApOworCisgIGNvdXQgPDwgIkhhcmQgY2FzZXMiIDw8IGVuZGw7CisgIF9TY2FsYXIgbXVsdGlwbGVSb290ID0gaW50ZXJuYWw6OnJhbmRvbTxfU2NhbGFyPigpOworICBFdmFsUm9vdHNUeXBlIGFsbFJvb3RzID0gRXZhbFJvb3RzVHlwZTo6Q29uc3RhbnQoZGVnLG11bHRpcGxlUm9vdCk7CisgIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbCggYWxsUm9vdHMsIHBvbHMgKTsKKyAgZXZhbFNvbHZlcjxfRGVnLFBvbHlub21pYWxUeXBlPiggcG9scyApOworCisgIGNvdXQgPDwgIlRlc3Qgc3VnYXIiIDw8IGVuZGw7CisgIEV2YWxSb290c1R5cGUgcmVhbFJvb3RzID0gRXZhbFJvb3RzVHlwZTo6UmFuZG9tKGRlZyk7CisgIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbCggcmVhbFJvb3RzLCBwb2xzICk7CisgIGV2YWxTb2x2ZXJTdWdhckZ1bmN0aW9uPF9EZWc+KAorICAgICAgcG9scywKKyAgICAgIHJlYWxSb290cy50ZW1wbGF0ZSBjYXN0IDwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjb21wbGV4PAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIE51bVRyYWl0czxfU2NhbGFyPjo6UmVhbAorICAgICAgICAgICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICAgICAgPigpLAorICAgICAgcmVhbFJvb3RzICk7Cit9CisKK3ZvaWQgdGVzdF9wb2x5bm9taWFsc29sdmVyKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspCisgIHsKKyAgICBDQUxMX1NVQlRFU1RfMSggKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsMT4oMSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoIChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSwyPigyKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyggKHBvbHlub21pYWxzb2x2ZXI8ZG91YmxlLDM+KDMpKSApOworICAgIENBTExfU1VCVEVTVF80KCAocG9seW5vbWlhbHNvbHZlcjxmbG9hdCw0Pig0KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNSggKHBvbHlub21pYWxzb2x2ZXI8ZG91YmxlLDU+KDUpKSApOworICAgIENBTExfU1VCVEVTVF82KCAocG9seW5vbWlhbHNvbHZlcjxmbG9hdCw2Pig2KSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyggKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsNz4oNykpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoIChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSw4Pig4KSkgKTsKKworICAgIENBTExfU1VCVEVTVF85KCAocG9seW5vbWlhbHNvbHZlcjxmbG9hdCxEeW5hbWljPigKKyAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50Pig5LDEzKQorICAgICAgICAgICAgKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAoKHBvbHlub21pYWxzb2x2ZXI8ZG91YmxlLER5bmFtaWM+KAorICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDksMTMpCisgICAgICAgICAgICApKSApOworICB9Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L3BvbHlub21pYWx1dGlscy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L3BvbHlub21pYWx1dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjOTY4NAotLS0gL2Rldi9udWxsCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvcG9seW5vbWlhbHV0aWxzLmNwcApAQCAtMCwwICsxLDExMyBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgTWFudWVsIFlndWVsIDxtYW51ZWwueWd1ZWxAZ21haWwuY29tPgorLy8KKy8vIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYQorLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCisvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9Qb2x5bm9taWFscz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZTxpbnQgU2l6ZT4KK3N0cnVjdCBpbmNyZW1lbnRfaWZfZml4ZWRfc2l6ZQoreworICBlbnVtIHsKKyAgICByZXQgPSAoU2l6ZSA9PSBEeW5hbWljKSA/IER5bmFtaWMgOiBTaXplKzEKKyAgfTsKK307Cit9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9TY2FsYXIsIGludCBfRGVnPgordm9pZCByZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3QoaW50IGRlZykKK3sKKyAgdHlwZWRlZiBpbnRlcm5hbDo6aW5jcmVtZW50X2lmX2ZpeGVkX3NpemU8X0RlZz4gICAgICAgICAgICBEaW07CisgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsRGltOjpyZXQsMT4gICAgICAgICAgICAgICAgICBQb2x5bm9taWFsVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8X1NjYWxhcixfRGVnLDE+ICAgICAgICAgICAgICAgICAgICAgIEV2YWxSb290c1R5cGU7CisKKyAgUG9seW5vbWlhbFR5cGUgcG9scyhkZWcrMSk7CisgIEV2YWxSb290c1R5cGUgcm9vdHMgPSBFdmFsUm9vdHNUeXBlOjpSYW5kb20oZGVnKTsKKyAgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKCByb290cywgcG9scyApOworCisgIEV2YWxSb290c1R5cGUgZXZyKCBkZWcgKTsKKyAgZm9yKCBpbnQgaT0wOyBpPHJvb3RzLnNpemUoKTsgKytpICl7CisgICAgZXZyW2ldID0gc3RkOjphYnMoIHBvbHlfZXZhbCggcG9scywgcm9vdHNbaV0gKSApOyB9CisKKyAgYm9vbCBldmFsVG9aZXJvID0gZXZyLmlzWmVybyggdGVzdF9wcmVjaXNpb248X1NjYWxhcj4oKSApOworICBpZiggIWV2YWxUb1plcm8gKXsKKyAgICBjZXJyIDw8IGV2ci50cmFuc3Bvc2UoKSA8PCBlbmRsOyB9CisgIFZFUklGWSggZXZhbFRvWmVybyApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyPiB2b2lkIHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfc2NhbGFyKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzIoIChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8X1NjYWxhciwyPigyKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzMoIChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8X1NjYWxhciwzPigzKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzQoIChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8X1NjYWxhciw0Pig0KSkgKTsKKyAgQ0FMTF9TVUJURVNUXzUoIChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8X1NjYWxhciw1Pig1KSkgKTsKKyAgQ0FMTF9TVUJURVNUXzYoIChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8X1NjYWxhciw2Pig2KSkgKTsKKyAgQ0FMTF9TVUJURVNUXzcoIChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8X1NjYWxhciw3Pig3KSkgKTsKKyAgQ0FMTF9TVUJURVNUXzgoIChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8X1NjYWxhciwxNz4oMTcpKSApOworCisgIENBTExfU1VCVEVTVF85KCAocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PF9TY2FsYXIsRHluYW1pYz4oCisgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDE4LDI2KSApKSApOworfQorCisKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfU2NhbGFyLCBpbnQgX0RlZz4KK3ZvaWQgQ2F1Y2h5Qm91bmRzKGludCBkZWcpCit7CisgIHR5cGVkZWYgaW50ZXJuYWw6OmluY3JlbWVudF9pZl9maXhlZF9zaXplPF9EZWc+ICAgICAgICAgICAgRGltOworICB0eXBlZGVmIE1hdHJpeDxfU2NhbGFyLERpbTo6cmV0LDE+ICAgICAgICAgICAgICAgICAgUG9seW5vbWlhbFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PF9TY2FsYXIsX0RlZywxPiAgICAgICAgICAgICAgICAgICAgICBFdmFsUm9vdHNUeXBlOworCisgIFBvbHlub21pYWxUeXBlIHBvbHMoZGVnKzEpOworICBFdmFsUm9vdHNUeXBlIHJvb3RzID0gRXZhbFJvb3RzVHlwZTo6UmFuZG9tKGRlZyk7CisgIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbCggcm9vdHMsIHBvbHMgKTsKKyAgX1NjYWxhciBNID0gY2F1Y2h5X21heF9ib3VuZCggcG9scyApOworICBfU2NhbGFyIG0gPSBjYXVjaHlfbWluX2JvdW5kKCBwb2xzICk7CisgIF9TY2FsYXIgTWF4ID0gcm9vdHMuYXJyYXkoKS5hYnMoKS5tYXhDb2VmZigpOworICBfU2NhbGFyIG1pbiA9IHJvb3RzLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKTsKKyAgYm9vbCBldmFsID0gKE0gPj0gTWF4KSAmJiAobSA8PSBtaW4pOworICBpZiggIWV2YWwgKQorICB7CisgICAgY2VyciA8PCAiUm9vdHM6ICIgPDwgcm9vdHMgPDwgZW5kbDsKKyAgICBjZXJyIDw8ICJCb3VuZHM6ICgiIDw8IG0gPDwgIiwgIiA8PCBNIDw8ICIpIiA8PCBlbmRsOworICAgIGNlcnIgPDwgIk1pbixNYXg6ICgiIDw8IG1pbiA8PCAiLCAiIDw8IE1heCA8PCAiKSIgPDwgZW5kbDsKKyAgfQorICBWRVJJRlkoIGV2YWwgKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgX1NjYWxhcj4gdm9pZCBDYXVjaHlCb3VuZHNfc2NhbGFyKCkKK3sKKyAgQ0FMTF9TVUJURVNUXzIoIChDYXVjaHlCb3VuZHM8X1NjYWxhciwyPigyKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzMoIChDYXVjaHlCb3VuZHM8X1NjYWxhciwzPigzKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzQoIChDYXVjaHlCb3VuZHM8X1NjYWxhciw0Pig0KSkgKTsKKyAgQ0FMTF9TVUJURVNUXzUoIChDYXVjaHlCb3VuZHM8X1NjYWxhciw1Pig1KSkgKTsKKyAgQ0FMTF9TVUJURVNUXzYoIChDYXVjaHlCb3VuZHM8X1NjYWxhciw2Pig2KSkgKTsKKyAgQ0FMTF9TVUJURVNUXzcoIChDYXVjaHlCb3VuZHM8X1NjYWxhciw3Pig3KSkgKTsKKyAgQ0FMTF9TVUJURVNUXzgoIChDYXVjaHlCb3VuZHM8X1NjYWxhciwxNz4oMTcpKSApOworCisgIENBTExfU1VCVEVTVF85KCAoQ2F1Y2h5Qm91bmRzPF9TY2FsYXIsRHluYW1pYz4oCisgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDE4LDI2KSApKSApOworfQorCit2b2lkIHRlc3RfcG9seW5vbWlhbHV0aWxzKCkKK3sKKyAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspCisgIHsKKyAgICByZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3NjYWxhcjxkb3VibGU+KCk7CisgICAgcmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF9zY2FsYXI8ZmxvYXQ+KCk7CisgICAgQ2F1Y2h5Qm91bmRzX3NjYWxhcjxkb3VibGU+KCk7CisgICAgQ2F1Y2h5Qm91bmRzX3NjYWxhcjxmbG9hdD4oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9zcGFyc2VfZXh0cmEuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9zcGFyc2VfZXh0cmEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYzMzMzQKLS0tIC9kZXYvbnVsbAorKysgYi91bnN1cHBvcnRlZC90ZXN0L3NwYXJzZV9leHRyYS5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVpZ2VuLCBhIGxpZ2h0d2VpZ2h0IEMrKyB0ZW1wbGF0ZSBsaWJyYXJ5CisvLyBmb3IgbGluZWFyIGFsZ2VicmEuCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgR2FlbCBHdWVubmViYXVkIDxnLmdhZWxAZnJlZS5mcj4KKy8vCisvLyBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEKKy8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAorLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCisKKworLy8gaW1wb3J0IGJhc2ljIGFuZCBwcm9kdWN0IHRlc3RzIGZvciBkZXByZWN0YWVkIER5bmFtaWNTcGFyc2VNYXRyaXgKKyNkZWZpbmUgRUlHRU5fTk9fREVQUkVDQVRFRF9XQVJOSU5HCisjaW5jbHVkZSAic3BhcnNlX2Jhc2ljLmNwcCIKKyNpbmNsdWRlICJzcGFyc2VfcHJvZHVjdC5jcHAiCisjaW5jbHVkZSA8RWlnZW4vU3BhcnNlRXh0cmE+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFNldHRlclR5cGUsdHlwZW5hbWUgRGVuc2VUeXBlLCB0eXBlbmFtZSBTY2FsYXIsIGludCBPcHRpb25zPgorYm9vbCB0ZXN0X3JhbmRvbV9zZXR0ZXIoU3BhcnNlTWF0cml4PFNjYWxhcixPcHRpb25zPiYgc20sIGNvbnN0IERlbnNlVHlwZSYgcmVmLCBjb25zdCBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4mIG5vbnplcm9Db29yZHMpCit7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixPcHRpb25zPiBTcGFyc2VUeXBlOworICB7CisgICAgc20uc2V0WmVybygpOworICAgIFNldHRlclR5cGUgdyhzbSk7CisgICAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHJlbWFpbmluZyA9IG5vbnplcm9Db29yZHM7CisgICAgd2hpbGUoIXJlbWFpbmluZy5lbXB0eSgpKQorICAgIHsKKyAgICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsc3RhdGljX2Nhc3Q8aW50PihyZW1haW5pbmcuc2l6ZSgpKS0xKTsKKyAgICAgIHcocmVtYWluaW5nW2ldLngoKSxyZW1haW5pbmdbaV0ueSgpKSA9IHJlZi5jb2VmZihyZW1haW5pbmdbaV0ueCgpLHJlbWFpbmluZ1tpXS55KCkpOworICAgICAgcmVtYWluaW5nW2ldID0gcmVtYWluaW5nLmJhY2soKTsKKyAgICAgIHJlbWFpbmluZy5wb3BfYmFjaygpOworICAgIH0KKyAgfQorICByZXR1cm4gc20uaXNBcHByb3gocmVmKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgU2V0dGVyVHlwZSx0eXBlbmFtZSBEZW5zZVR5cGUsIHR5cGVuYW1lIFQ+Citib29sIHRlc3RfcmFuZG9tX3NldHRlcihEeW5hbWljU3BhcnNlTWF0cml4PFQ+JiBzbSwgY29uc3QgRGVuc2VUeXBlJiByZWYsIGNvbnN0IHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiYgbm9uemVyb0Nvb3JkcykKK3sKKyAgc20uc2V0WmVybygpOworICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4gcmVtYWluaW5nID0gbm9uemVyb0Nvb3JkczsKKyAgd2hpbGUoIXJlbWFpbmluZy5lbXB0eSgpKQorICB7CisgICAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxzdGF0aWNfY2FzdDxpbnQ+KHJlbWFpbmluZy5zaXplKCkpLTEpOworICAgIHNtLmNvZWZmUmVmKHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSkgPSByZWYuY29lZmYocmVtYWluaW5nW2ldLngoKSxyZW1haW5pbmdbaV0ueSgpKTsKKyAgICByZW1haW5pbmdbaV0gPSByZW1haW5pbmcuYmFjaygpOworICAgIHJlbWFpbmluZy5wb3BfYmFjaygpOworICB9CisgIHJldHVybiBzbS5pc0FwcHJveChyZWYpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlPiB2b2lkIHNwYXJzZV9leHRyYShjb25zdCBTcGFyc2VNYXRyaXhUeXBlJiByZWYpCit7CisgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5kZXggSW5kZXg7CisgIGNvbnN0IEluZGV4IHJvd3MgPSByZWYucm93cygpOworICBjb25zdCBJbmRleCBjb2xzID0gcmVmLmNvbHMoKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICBlbnVtIHsgRmxhZ3MgPSBTcGFyc2VNYXRyaXhUeXBlOjpGbGFncyB9OworCisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8ocm93cypjb2xzKSwgMC4wMSk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgU2NhbGFyIGVwcyA9IDFlLTY7CisKKyAgU3BhcnNlTWF0cml4VHlwZSBtKHJvd3MsIGNvbHMpOworICBEZW5zZU1hdHJpeCByZWZNYXQgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgRGVuc2VWZWN0b3IgdmVjMSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7CisKKyAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHplcm9Db29yZHM7CisgIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiBub256ZXJvQ29vcmRzOworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0LCBtLCAwLCAmemVyb0Nvb3JkcywgJm5vbnplcm9Db29yZHMpOworCisgIGlmICh6ZXJvQ29vcmRzLnNpemUoKT09MCB8fCBub256ZXJvQ29vcmRzLnNpemUoKT09MCkKKyAgICByZXR1cm47CisKKyAgLy8gdGVzdCBjb2VmZiBhbmQgY29lZmZSZWYKKyAgZm9yIChpbnQgaT0wOyBpPChpbnQpemVyb0Nvb3Jkcy5zaXplKCk7ICsraSkKKyAgeworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggbS5jb2VmZih6ZXJvQ29vcmRzW2ldLngoKSx6ZXJvQ29vcmRzW2ldLnkoKSksIGVwcyApOworICAgIGlmKGludGVybmFsOjppc19zYW1lPFNwYXJzZU1hdHJpeFR5cGUsU3BhcnNlTWF0cml4PFNjYWxhcixGbGFncz4gPjo6dmFsdWUpCisgICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbS5jb2VmZlJlZih6ZXJvQ29vcmRzWzBdLngoKSx6ZXJvQ29vcmRzWzBdLnkoKSkgPSA1ICk7CisgIH0KKyAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOworCisgIG0uY29lZmZSZWYobm9uemVyb0Nvb3Jkc1swXS54KCksIG5vbnplcm9Db29yZHNbMF0ueSgpKSA9IFNjYWxhcig1KTsKKyAgcmVmTWF0LmNvZWZmUmVmKG5vbnplcm9Db29yZHNbMF0ueCgpLCBub256ZXJvQ29vcmRzWzBdLnkoKSkgPSBTY2FsYXIoNSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOworCisgIC8vIHJhbmRvbSBzZXR0ZXIKKy8vICAgeworLy8gICAgIG0uc2V0WmVybygpOworLy8gICAgIFZFUklGWV9JU19OT1RfQVBQUk9YKG0sIHJlZk1hdCk7CisvLyAgICAgU3BhcnNlU2V0dGVyPFNwYXJzZU1hdHJpeFR5cGUsIFJhbmRvbUFjY2Vzc1BhdHRlcm4+IHcobSk7CisvLyAgICAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHJlbWFpbmluZyA9IG5vbnplcm9Db29yZHM7CisvLyAgICAgd2hpbGUoIXJlbWFpbmluZy5lbXB0eSgpKQorLy8gICAgIHsKKy8vICAgICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscmVtYWluaW5nLnNpemUoKS0xKTsKKy8vICAgICAgIHctPmNvZWZmUmVmKHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSkgPSByZWZNYXQuY29lZmYocmVtYWluaW5nW2ldLngoKSxyZW1haW5pbmdbaV0ueSgpKTsKKy8vICAgICAgIHJlbWFpbmluZ1tpXSA9IHJlbWFpbmluZy5iYWNrKCk7CisvLyAgICAgICByZW1haW5pbmcucG9wX2JhY2soKTsKKy8vICAgICB9CisvLyAgIH0KKy8vICAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOworCisgICAgVkVSSUZZKCggdGVzdF9yYW5kb21fc2V0dGVyPFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlLCBTdGRNYXBUcmFpdHM+ID4obSxyZWZNYXQsbm9uemVyb0Nvb3JkcykgKSk7CisgICAgI2lmZGVmIEVJR0VOX1VOT1JERVJFRF9NQVBfU1VQUE9SVAorICAgIFZFUklGWSgoIHRlc3RfcmFuZG9tX3NldHRlcjxSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSwgU3RkVW5vcmRlcmVkTWFwVHJhaXRzPiA+KG0scmVmTWF0LG5vbnplcm9Db29yZHMpICkpOworICAgICNlbmRpZgorICAgICNpZmRlZiBfREVOU0VfSEFTSF9NQVBfSF8KKyAgICBWRVJJRlkoKCB0ZXN0X3JhbmRvbV9zZXR0ZXI8UmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeFR5cGUsIEdvb2dsZURlbnNlSGFzaE1hcFRyYWl0cz4gPihtLHJlZk1hdCxub256ZXJvQ29vcmRzKSApKTsKKyAgICAjZW5kaWYKKyAgICAjaWZkZWYgX1NQQVJTRV9IQVNIX01BUF9IXworICAgIFZFUklGWSgoIHRlc3RfcmFuZG9tX3NldHRlcjxSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSwgR29vZ2xlU3BhcnNlSGFzaE1hcFRyYWl0cz4gPihtLHJlZk1hdCxub256ZXJvQ29vcmRzKSApKTsKKyAgICAjZW5kaWYKKworCisgIC8vIHRlc3QgUmFuZG9tU2V0dGVyCisgIC8qeworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTEocm93cyxjb2xzKSwgbTIocm93cyxjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNMSA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNMSwgbTEpOworICAgIHsKKyAgICAgIEVpZ2VuOjpSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSA+IHNldHRlcihtMik7CisgICAgICBmb3IgKGludCBqPTA7IGo8bTEub3V0ZXJTaXplKCk7ICsraikKKyAgICAgICAgZm9yICh0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGkobTEsaik7IGk7ICsraSkKKyAgICAgICAgICBzZXR0ZXIoaS5pbmRleCgpLCBqKSA9IGkudmFsdWUoKTsKKyAgICB9CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTIpOworICB9Ki8KKworCit9CisKK3ZvaWQgdGVzdF9zcGFyc2VfZXh0cmEoKQoreworICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCBzID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDUwKTsKKyAgICBDQUxMX1NVQlRFU1RfMSggc3BhcnNlX2V4dHJhKFNwYXJzZU1hdHJpeDxkb3VibGU+KDgsIDgpKSApOworICAgIENBTExfU1VCVEVTVF8yKCBzcGFyc2VfZXh0cmEoU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4ocywgcykpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoIHNwYXJzZV9leHRyYShTcGFyc2VNYXRyaXg8ZG91YmxlPihzLCBzKSkgKTsKKworICAgIENBTExfU1VCVEVTVF8zKCBzcGFyc2VfZXh0cmEoRHluYW1pY1NwYXJzZU1hdHJpeDxkb3VibGU+KHMsIHMpKSApOworLy8gICAgQ0FMTF9TVUJURVNUXzMoKCBzcGFyc2VfYmFzaWMoRHluYW1pY1NwYXJzZU1hdHJpeDxkb3VibGU+KHMsIHMpKSApKTsKKy8vICAgIENBTExfU1VCVEVTVF8zKCggc3BhcnNlX2Jhc2ljKER5bmFtaWNTcGFyc2VNYXRyaXg8ZG91YmxlLENvbE1ham9yLGxvbmcgaW50PihzLCBzKSkgKSk7CisKKyAgICBDQUxMX1NVQlRFU1RfMyggKHNwYXJzZV9wcm9kdWN0PER5bmFtaWNTcGFyc2VNYXRyaXg8ZmxvYXQsIENvbE1ham9yPiA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoIChzcGFyc2VfcHJvZHVjdDxEeW5hbWljU3BhcnNlTWF0cml4PGZsb2F0LCBSb3dNYWpvcj4gPigpKSApOworICB9Cit9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L3NwbGluZXMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9zcGxpbmVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQzNDUzCi0tLSAvZGV2L251bGwKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9zcGxpbmVzLmNwcApAQCAtMCwwICsxLDI0MCBAQAorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRWlnZW4sIGEgbGlnaHR3ZWlnaHQgQysrIHRlbXBsYXRlIGxpYnJhcnkKKy8vIGZvciBsaW5lYXIgYWxnZWJyYS4KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBIYXVrZSBIZWliZWwgPGhlaWJlbEBnbWFpbC5jb20+CisvLworLy8gVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhCisvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKKy8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgorCisjaW5jbHVkZSAibWFpbi5oIgorCisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BsaW5lcz4KKworLy8gbGV0cyBkbyBzb21lIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGFuZCB0aHVzCisvLyBmb3JjZSB0aGUgY29tcGlsYXRpb24gb2YgYWxsIHNwbGluZSBmdW5jdGlvbnMuLi4KK3RlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDIsIER5bmFtaWM+OwordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGRvdWJsZSwgMywgRHluYW1pYz47CisKK3RlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDIsIDI+OwordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGRvdWJsZSwgMiwgMz47Cit0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZG91YmxlLCAyLCA0PjsKK3RlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDIsIDU+OworCit0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZmxvYXQsIDIsIER5bmFtaWM+OwordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAzLCBEeW5hbWljPjsKKwordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAzLCAyPjsKK3RlbXBsYXRlIGNsYXNzIFNwbGluZTxmbG9hdCwgMywgMz47Cit0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZmxvYXQsIDMsIDQ+OwordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAzLCA1PjsKKworU3BsaW5lPGRvdWJsZSwgMiwgRHluYW1pYz4gY2xvc2VkX3NwbGluZTJkKCkKK3sKKyAgUm93VmVjdG9yWGQga25vdHMoMTIpOworICBrbm90cyA8PCAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAuODY3MTkzMTc5MDkzODk4LAorICAgIDEuNjYwMzMwOTU1MzQyNDA4LAorICAgIDIuNjA1MDg0ODM0ODIzMTM0LAorICAgIDMuNDg0MTU0NTg2Mzc0NDI4LAorICAgIDQuMjUyNjk5NDc4OTU2Mjc2LAorICAgIDQuMjUyNjk5NDc4OTU2Mjc2LAorICAgIDQuMjUyNjk5NDc4OTU2Mjc2LAorICAgIDQuMjUyNjk5NDc4OTU2Mjc2OworCisgIE1hdHJpeFhkIGN0cmxzKDgsMik7CisgIGN0cmxzIDw8IC0wLjM3MDk2Nzc0MTkzNTQ4NCwgICAwLjIzNjg0MjEwNTI2MzE1OCwKKyAgICAtMC4yMzE0MDE4NjA2OTMyNzcsICAgMC40NDIyNDUxODUwMjc2MzIsCisgICAgMC4zNDQzNjEyMjg1MzI4MzEsICAgMC43NzMzNjk5OTQxMjA3NTMsCisgICAgMC44Mjg5OTAyMTYyMDM4MDIsICAgMC4xMDY1NTA4ODI2NDc1OTUsCisgICAgMC40MDcyNzAxNjM2NzgzODIsICAtMS4wNDM0NTI5MjIxNzI4NDgsCisgICAgLTAuNDg4NDY3ODEzNTg0MDUzLCAgLTAuMzkwMDk4NTgyNTMwMDkwLAorICAgIC0wLjQ5NDY1NzE4OTQ0NjQyNywgICAwLjA1NDgwNDgyNDg5Nzg4NCwKKyAgICAtMC4zNzA5Njc3NDE5MzU0ODQsICAgMC4yMzY4NDIxMDUyNjMxNTg7CisgIGN0cmxzLnRyYW5zcG9zZUluUGxhY2UoKTsKKworICByZXR1cm4gU3BsaW5lPGRvdWJsZSwgMiwgRHluYW1pYz4oa25vdHMsIGN0cmxzKTsKK30KKworLyogY3JlYXRlIGEgcmVmZXJlbmNlIHNwbGluZSAqLworU3BsaW5lPGRvdWJsZSwgMywgRHluYW1pYz4gc3BsaW5lM2QoKQoreworICBSb3dWZWN0b3JYZCBrbm90cygxMSk7CisgIGtub3RzIDw8IDAsCisgICAgMCwKKyAgICAwLAorICAgIDAuMTE4OTk3NjgxNTU4Mzc3LAorICAgIDAuMTYyNjExNzM1MTk0NjMxLAorICAgIDAuNDk4MzY0MDUxOTgyMTQzLAorICAgIDAuNjU1MDk4MDAzOTczODQxLAorICAgIDAuNjc5NzAyNjc2ODUzNjc1LAorICAgIDEuMDAwMDAwMDAwMDAwMDAwLAorICAgIDEuMDAwMDAwMDAwMDAwMDAwLAorICAgIDEuMDAwMDAwMDAwMDAwMDAwOworCisgIE1hdHJpeFhkIGN0cmxzKDgsMyk7CisgIGN0cmxzIDw8ICAgIDAuOTU5NzQzOTU4NTE2MDgxLCAgIDAuMzQwMzg1NzI2NjY2MTMzLCAgIDAuNTg1MjY3NzUwOTc5Nzc3LAorICAgIDAuMjIzODExOTM5NDkxMTM3LCAgIDAuNzUxMjY3MDU5MzA1NjUzLCAgIDAuMjU1MDk1MTE1NDU5MjY5LAorICAgIDAuNTA1OTU3MDUxNjY1MTQyLCAgIDAuNjk5MDc2NzIyNjU2Njg2LCAgIDAuODkwOTAzMjUyNTM1Nzk5LAorICAgIDAuOTU5MjkxNDI1MjA1NDQ0LCAgIDAuNTQ3MjE1NTI5OTYzODAzLCAgIDAuMTM4NjI0NDQyODI4Njc5LAorICAgIDAuMTQ5Mjk0MDA1NTU5MDU3LCAgIDAuMjU3NTA4MjU0MTIzNzM2LCAgIDAuODQwNzE3MjU1OTgzNjYzLAorICAgIDAuMjU0MjgyMTc4OTcxNTMxLCAgIDAuODE0Mjg0ODI2MDY4ODE2LCAgIDAuMjQzNTI0OTY4NzI0OTg5LAorICAgIDAuOTI5MjYzNjIzMTg3MjI4LCAgIDAuMzQ5OTgzNzY1OTg0ODA5LCAgIDAuMTk2NTk1MjUwNDMxMjA4LAorICAgIDAuMjUxMDgzODU3OTc2MDMxLCAgIDAuNjE2MDQ0Njc2MTQ2NjM5LCAgIDAuNDczMjg4ODQ4OTAyNzI5OworICBjdHJscy50cmFuc3Bvc2VJblBsYWNlKCk7CisKKyAgcmV0dXJuIFNwbGluZTxkb3VibGUsIDMsIER5bmFtaWM+KGtub3RzLCBjdHJscyk7Cit9CisKKy8qIGNvbXBhcmVzIGV2YWx1YXRpb25zIGFnYWluc3Qga25vd24gcmVzdWx0cyAqLwordm9pZCBldmFsX3NwbGluZTNkKCkKK3sKKyAgU3BsaW5lM2Qgc3BsaW5lID0gc3BsaW5lM2QoKTsKKworICBSb3dWZWN0b3JYZCB1KDEwKTsKKyAgdSA8PCAwLjM1MTY1OTUwNzA2Mjk5NywKKyAgICAwLjgzMDgyODYyNzg5NjI5MSwKKyAgICAwLjU4NTI2NDA5MTE1MjcyNCwKKyAgICAwLjU0OTcyMzYwODI5MTE0MCwKKyAgICAwLjkxNzE5MzY2MzgyOTgxMCwKKyAgICAwLjI4NTgzOTAxODgyMDM3NCwKKyAgICAwLjc1NzIwMDIyOTExMDcyMSwKKyAgICAwLjc1MzcyOTA5NDI3ODQ5NSwKKyAgICAwLjM4MDQ0NTg0Njk3NTM1NywKKyAgICAwLjU2NzgyMTY0MDcyNTIyMTsKKworICBNYXRyaXhYZCBwdHMoMTAsMyk7CisgIHB0cyA8PCAwLjcwNzYyMDgxMTUzNTkxNiwgICAwLjUxMDI1ODkxMTI0MDgxNSwgICAwLjQxNzQ4NTQzNzAyMzQwOSwKKyAgICAwLjYwMzQyMjI1NjQyNjk3OCwgICAwLjUyOTQ5ODI4MjcyNzU1MSwgICAwLjI3MDM1MTU0OTM0ODk4MSwKKyAgICAwLjIyODM2NDE5NzU2OTMzNCwgICAwLjQyMzc0NTYxNTY3NzgxNSwgICAwLjYzNzY4NzI4OTI4NzQ5MCwKKyAgICAwLjI3NTU1Njc5NjMzNTE2OCwgICAwLjM1MDg1NjcwNjQyNzk3MCwgICAwLjY4NDI5NTc4NDU5ODkwNSwKKyAgICAwLjUxNDUxOTMxMTA0NzY1NSwgICAwLjUyNTA3NzIyNDg5MDc1NCwgICAwLjM1MTYyODMwODMwNTg5NiwKKyAgICAwLjcyNDE1MjkxNDMxNTY2NiwgICAwLjU3NDQ2MTE1NTQ1NzMwNCwgICAwLjQ2OTg2MDI4NTQ4NDA1OCwKKyAgICAwLjUyOTM2NTA2Mzc1MzI4OCwgICAwLjYxMzMyODcwMjY1NjgxNiwgICAwLjIzNzgzNzA0MDE0MTczOSwKKyAgICAwLjUyMjQ2OTM5NTEzNjg3OCwgICAwLjYxOTA5OTY1ODY1Mjg5NSwgICAwLjIzNzEzOTY2NTI0MjA2OSwKKyAgICAwLjY3NzM1NzAyMzg0OTU1MiwgICAwLjQ4MDY1NTc2ODQzNTg1MywgICAwLjQyMjIyNzYxMDMxNDM5NywKKyAgICAwLjI0NzA0NjU5MzE3Mzc1OCwgICAwLjM4MDYwNDY3MjQwNDc1MCwgICAwLjY3MDA2NTc5MTQwNTAxOTsKKyAgcHRzLnRyYW5zcG9zZUluUGxhY2UoKTsKKworICBmb3IgKGludCBpPTA7IGk8dS5zaXplKCk7ICsraSkKKyAgeworICAgIFZlY3RvcjNkIHB0ID0gc3BsaW5lKHUoaSkpOworICAgIFZFUklGWSggKHB0IC0gcHRzLmNvbChpKSkubm9ybSgpIDwgMWUtMTQgKTsKKyAgfQorfQorCisvKiBjb21wYXJlcyBldmFsdWF0aW9ucyBvbiBjb3JuZXIgY2FzZXMgKi8KK3ZvaWQgZXZhbF9zcGxpbmUzZF9vbmJya3MoKQoreworICBTcGxpbmUzZCBzcGxpbmUgPSBzcGxpbmUzZCgpOworCisgIFJvd1ZlY3RvclhkIHUgPSBzcGxpbmUua25vdHMoKTsKKworICBNYXRyaXhYZCBwdHMoMTEsMyk7CisgIHB0cyA8PCAgICAwLjk1OTc0Mzk1ODUxNjA4MSwgICAwLjM0MDM4NTcyNjY2NjEzMywgICAwLjU4NTI2Nzc1MDk3OTc3NywKKyAgICAwLjk1OTc0Mzk1ODUxNjA4MSwgICAwLjM0MDM4NTcyNjY2NjEzMywgICAwLjU4NTI2Nzc1MDk3OTc3NywKKyAgICAwLjk1OTc0Mzk1ODUxNjA4MSwgICAwLjM0MDM4NTcyNjY2NjEzMywgICAwLjU4NTI2Nzc1MDk3OTc3NywKKyAgICAwLjQzMDI4Mjk4MDI4OTk0MCwgICAwLjcxMzA3NDY4MDA1NjExOCwgICAwLjcyMDM3MzMwNzk0MzM0OSwKKyAgICAwLjU1ODA3NDg3NTU1MzA2MCwgICAwLjY4MTYxNzkyMTAzNDQ1OSwgICAwLjgwNDQxNzEyNDgzOTk0MiwKKyAgICAwLjQwNzA3NjAwODI5MTc1MCwgICAwLjM0OTcwNzcxMDUxODE2MywgICAwLjYxNzI3NTkzNzQxOTU0NSwKKyAgICAwLjI0MDAzNzAwODI4NjYwMiwgICAwLjczODczOTM5MDM5ODAxNCwgICAwLjMyNDU1NDE1MzEyOTQxMSwKKyAgICAwLjMwMjQzNDExMTQ4MDU3MiwgICAwLjc4MTE2MjQ0Mzk2Mzg5OSwgICAwLjI0MDE3NzA4OTA5NDY0NCwKKyAgICAwLjI1MTA4Mzg1Nzk3NjAzMSwgICAwLjYxNjA0NDY3NjE0NjYzOSwgICAwLjQ3MzI4ODg0ODkwMjcyOSwKKyAgICAwLjI1MTA4Mzg1Nzk3NjAzMSwgICAwLjYxNjA0NDY3NjE0NjYzOSwgICAwLjQ3MzI4ODg0ODkwMjcyOSwKKyAgICAwLjI1MTA4Mzg1Nzk3NjAzMSwgICAwLjYxNjA0NDY3NjE0NjYzOSwgICAwLjQ3MzI4ODg0ODkwMjcyOTsKKyAgcHRzLnRyYW5zcG9zZUluUGxhY2UoKTsKKworICBmb3IgKGludCBpPTA7IGk8dS5zaXplKCk7ICsraSkKKyAgeworICAgIFZlY3RvcjNkIHB0ID0gc3BsaW5lKHUoaSkpOworICAgIFZFUklGWSggKHB0IC0gcHRzLmNvbChpKSkubm9ybSgpIDwgMWUtMTQgKTsKKyAgfQorfQorCit2b2lkIGV2YWxfY2xvc2VkX3NwbGluZTJkKCkKK3sKKyAgU3BsaW5lMmQgc3BsaW5lID0gY2xvc2VkX3NwbGluZTJkKCk7CisKKyAgUm93VmVjdG9yWGQgdSgxMik7CisgIHUgPDwgMCwKKyAgICAwLjMzMjQ1NzAzMDM5NTc5NiwKKyAgICAwLjM1NjQ2NzEzMDUzMjk1MiwKKyAgICAwLjQ1MzU2MjE4MDE3NjIxNSwKKyAgICAwLjY0ODAxNzkyMTg3NDgwNCwKKyAgICAwLjk3Mzc3MDIzNTU1NTAwMywKKyAgICAxLjg4MjU3NzY0NzIxOTMwNywKKyAgICAyLjI4OTQwODU5MzkzMDQ5OCwKKyAgICAzLjUxMTk1MTQyOTg4MzA0NSwKKyAgICAzLjg4NDE0OTMyMTM2OTQ1MCwKKyAgICA0LjIzNjI2MTU5MDM2OTQxNCwKKyAgICA0LjI1MjY5OTQ3ODk1NjI3NjsKKworICBNYXRyaXhYZCBwdHMoMTIsMik7CisgIHB0cyA8PCAtMC4zNzA5Njc3NDE5MzU0ODQsICAgMC4yMzY4NDIxMDUyNjMxNTgsCisgICAgLTAuMTUyNTc2Nzc1MTIzMjUwLCAgIDAuNDQ4OTc1MDAxMjc5MzM0LAorICAgIC0wLjEzMzQxNzUzODI3NzY2OCwgICAwLjQ2MTYxNTYxMzg2NTY2NywKKyAgICAtMC4wNTMxOTkwNjA4MjY3NDAsICAgMC41MDc2MzAzNjAwMDYyOTksCisgICAgMC4xMTQyNDk1OTExNDcyODEsICAgMC41NzA0MTQxMzUwOTc0MDksCisgICAgMC4zNzc4MTAzMTY4OTE5ODcsICAgMC41NjA0OTcxMDI4NzUzMTUsCisgICAgMC42NjUwNTIxMjAxMzU5MDgsICAtMC4xNTc1NTc0NDExMDk2MTEsCisgICAgMC41MTYwMDY0ODcwNTMyMjgsICAtMC41NTk3NjMyOTIxNzQ4MjUsCisgICAgLTAuMzc5NDg2MDM1MzQ4ODg3LCAgLTAuMzMxOTU5NjQwNDg4MjIzLAorICAgIC0wLjQ2MjAzNDcyNjI0OTA3OCwgIC0wLjAzOTEwNTY3MDA4MDgyNCwKKyAgICAtMC4zNzg3MzA2MDA5MTc5ODIsICAgMC4yMjUxMjcwMTUwOTk5MTksCisgICAgLTAuMzcwOTY3NzQxOTM1NDg0LCAgIDAuMjM2ODQyMTA1MjYzMTU4OworICBwdHMudHJhbnNwb3NlSW5QbGFjZSgpOworCisgIGZvciAoaW50IGk9MDsgaTx1LnNpemUoKTsgKytpKQorICB7CisgICAgVmVjdG9yMmQgcHQgPSBzcGxpbmUodShpKSk7CisgICAgVkVSSUZZKCAocHQgLSBwdHMuY29sKGkpKS5ub3JtKCkgPCAxZS0xNCApOworICB9Cit9CisKK3ZvaWQgY2hlY2tfZ2xvYmFsX2ludGVycG9sYXRpb24yZCgpCit7CisgIHR5cGVkZWYgU3BsaW5lMmQ6OlBvaW50VHlwZSBQb2ludFR5cGU7CisgIHR5cGVkZWYgU3BsaW5lMmQ6Oktub3RWZWN0b3JUeXBlIEtub3RWZWN0b3JUeXBlOworICB0eXBlZGVmIFNwbGluZTJkOjpDb250cm9sUG9pbnRWZWN0b3JUeXBlIENvbnRyb2xQb2ludFZlY3RvclR5cGU7CisKKyAgQ29udHJvbFBvaW50VmVjdG9yVHlwZSBwb2ludHMgPSBDb250cm9sUG9pbnRWZWN0b3JUeXBlOjpSYW5kb20oMiwxMDApOworCisgIEtub3RWZWN0b3JUeXBlIGNob3JkX2xlbmd0aHM7IC8vIGtub3QgcGFyYW1ldGVycworICBFaWdlbjo6Q2hvcmRMZW5ndGhzKHBvaW50cywgY2hvcmRfbGVuZ3Rocyk7CisKKyAgLy8gaW50ZXJwb2xhdGlvbiB3aXRob3V0IGtub3QgcGFyYW1ldGVycworICB7CisgICAgY29uc3QgU3BsaW5lMmQgc3BsaW5lID0gU3BsaW5lRml0dGluZzxTcGxpbmUyZD46OkludGVycG9sYXRlKHBvaW50cywzKTsgIAorCisgICAgZm9yIChFaWdlbjo6RGVuc2VJbmRleCBpPTA7IGk8cG9pbnRzLmNvbHMoKTsgKytpKQorICAgIHsKKyAgICAgIFBvaW50VHlwZSBwdCA9IHNwbGluZSggY2hvcmRfbGVuZ3RocyhpKSApOworICAgICAgUG9pbnRUeXBlIHJlZiA9IHBvaW50cy5jb2woaSk7CisgICAgICBWRVJJRlkoIChwdCAtIHJlZikubWF0cml4KCkubm9ybSgpIDwgMWUtMTQgKTsKKyAgICB9CisgIH0KKworICAvLyBpbnRlcnBvbGF0aW9uIHdpdGggZ2l2ZW4ga25vdCBwYXJhbWV0ZXJzCisgIHsKKyAgICBjb25zdCBTcGxpbmUyZCBzcGxpbmUgPSBTcGxpbmVGaXR0aW5nPFNwbGluZTJkPjo6SW50ZXJwb2xhdGUocG9pbnRzLDMsY2hvcmRfbGVuZ3Rocyk7ICAKKworICAgIGZvciAoRWlnZW46OkRlbnNlSW5kZXggaT0wOyBpPHBvaW50cy5jb2xzKCk7ICsraSkKKyAgICB7CisgICAgICBQb2ludFR5cGUgcHQgPSBzcGxpbmUoIGNob3JkX2xlbmd0aHMoaSkgKTsKKyAgICAgIFBvaW50VHlwZSByZWYgPSBwb2ludHMuY29sKGkpOworICAgICAgVkVSSUZZKCAocHQgLSByZWYpLm1hdHJpeCgpLm5vcm0oKSA8IDFlLTE0ICk7CisgICAgfQorICB9Cit9CisKKwordm9pZCB0ZXN0X3NwbGluZXMoKQoreworICBDQUxMX1NVQlRFU1QoIGV2YWxfc3BsaW5lM2QoKSApOworICBDQUxMX1NVQlRFU1QoIGV2YWxfc3BsaW5lM2Rfb25icmtzKCkgKTsKKyAgQ0FMTF9TVUJURVNUKCBldmFsX2Nsb3NlZF9zcGxpbmUyZCgpICk7CisgIENBTExfU1VCVEVTVCggY2hlY2tfZ2xvYmFsX2ludGVycG9sYXRpb24yZCgpICk7Cit9Cg==